8889841cPK[[ t tsite-packages/six.pycnu[ lȦTc?@@sdZddlmZddlZddlZddlZddlZddlZdZdZ ej ddkZ ej ddkZ e re fZefZefZe ZeZejZnefZeefZeejfZeZe Zejjdred\ZnVd efd YZye eWne!k rTed^Zn Xed`Z[dZ"dZ#defdYZ$de$fdYZ%dej&fdYZ'de$fdYZ(defdYZ)e)e*Z+de'fdYZ,e(dddde(dd d!d"de(d#d d d$d#e(d%d&d!d'd%e(d(d&d)e(d*d d!d+d*e(d,d&d!d-d,e(d.d&d/d0e(d1d&d2e(d3d4d5d6e(ddde(d7d7d8e(d9d9d8e(d:d:d8e(d-d&d!d-d,e(d;d d!d<d;e(d=d d d>d=e%d!d&e%d?d@e%dAdBe%dCdDdEe%dFdGdFe%dHdIdJe%dKdLdMe%dNdOdPe%dQdRdSe%dTdUdVe%dWdXdYe%dZd[d\e%d]d^d_e%d`dadbe%dcdcdde%dededde%dfdfdde%dgdgdhe%didje%dkdle%dmdne%dodpdoe%dqdre%dsdtdue%dvdwdxe%dydzd{e%d|d}d~e%ddde%ddde%ddde%ddde%ddde%ddde%dddxe%ddde%ddde%ddd~e%de*dde%de*dde%de*de*de%ddde%ddde%ddde%ddg=Z-xJe-D]BZ.e/e,e.j0e.e1e.e%re+j2e.de.j0qqW[.e-e,_-e,e*dZ3e+j2e3dde'fdYZ4e(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(d6dde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(dddgZ5x!e5D]Z.e/e4e.j0e.qW[.e5e4_-e+j2e4e*dddde'fdYZ6e(ddde(ddde(dddgZ7x!e7D]Z.e/e6e.j0e.q^W[.e7e6_-e+j2e6e*dddde'fdYZ8e(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(dddg!Z9x!e9D]Z.e/e8e.j0e.q W[.e9e8_-e+j2e8e*dddde'fdYZ:e(ddde(ddde(ddde(dddgZ;x!e;D]Z.e/e:e.j0e.q[ W[.e;e:_-e+j2e:e*dddde'fdYZ<e(dddgZ=x!e=D]Z.e/e<e.j0e.q W[.e=e<_-e+j2e<e*dd d d ej&fd YZ>e+j2e>e*dd dZ?dZ@e r dZAdZBdZCdZDdZEdZFn$dZAdZBdZCdZDdZEdZFy eGZHWneIk r dZHnXeHZGy eJZJWneIk r dZJnXe r$ dZKejLZMeZNn.dZKd ZMd!efd"YZNeJZJe"eKd#ejOeAZPejOeBZQejOeCZRejOeDZSejOeEZTejOeFZUe rd$ZVd%ZWd&ZXd'ZYejZd(Z[ejZd)Z\ejZd*Z]nQd+ZVd,ZWd-ZXd.ZYejZd/Z[ejZd0Z\ejZd1Z]e"eVd2e"eWd3e"eXd4e"eYd5e r;d6Z^d7Z_e`Zaej d d krd8ZbnejZd9d d:ZbejcdZdejeZfegZhddliZieijjZjeijkZkd;Zld<Zmd=Znnpd>Z^d?Z_eaZae`Zbd@ZddAZfejoejpeqZhddljZjejjjZjZkdBZldCZmdDZne"e^dEe"e_dFdGZrdHZsdIZte reue3jvdJZwddKZyndddLZwewdMej d dakr@ewdNn)ej d dbkr`ewdOn dPZzeue3jvdQdZ{e{dkrdRZ{nej d dckre{Z|dSZ{ne"eydTej dd!ddkrej}ej~dVZn ejZdWZdXZdYZgZe*ZejdZdk rJge_nejrxOeejD]>\ZZeej*dkrcej0e*krceje=PqcqcW[[nejje+dS(es6Utilities for writing code that runs on Python 2 and 3i(tabsolute_importNs'Benjamin Peterson s1.9.0iitjavaiitXcB@seZdZRS(cC@sdS(NiiI((tself((s'/usr/lib/python2.7/site-packages/six.pyt__len__<s(t__name__t __module__R(((s'/usr/lib/python2.7/site-packages/six.pyR;si?cC@s ||_dS(s Add documentation to a function.N(t__doc__(tfunctdoc((s'/usr/lib/python2.7/site-packages/six.pyt_add_docIscC@st|tj|S(s7Import module, returning the module after the last dot.(t __import__tsystmodules(tname((s'/usr/lib/python2.7/site-packages/six.pyt_import_moduleNs t _LazyDescrcB@seZdZdZRS(cC@s ||_dS(N(R(RR((s'/usr/lib/python2.7/site-packages/six.pyt__init__VscC@sN|j}t||j|yt|j|jWntk rInX|S(N(t_resolvetsetattrRtdelattrt __class__tAttributeError(Rtobjttptresult((s'/usr/lib/python2.7/site-packages/six.pyt__get__Ys  (RRRR(((s'/usr/lib/python2.7/site-packages/six.pyRTs t MovedModulecB@s&eZddZdZdZRS(cC@sJtt|j|tr=|dkr1|}n||_n ||_dS(N(tsuperRRtPY3tNonetmod(RRtoldtnew((s'/usr/lib/python2.7/site-packages/six.pyRgs    cC@s t|jS(N(RR(R((s'/usr/lib/python2.7/site-packages/six.pyRpscC@s/|j}t||}t||||S(N(RtgetattrR(Rtattrt_moduletvalue((s'/usr/lib/python2.7/site-packages/six.pyt __getattr__ss N(RRRRRR&(((s'/usr/lib/python2.7/site-packages/six.pyRes t _LazyModulecB@s eZdZdZgZRS(cC@s)tt|j||jj|_dS(N(RR'RRR(RR((s'/usr/lib/python2.7/site-packages/six.pyR|scC@s3ddg}|g|jD]}|j^q7}|S(NRR(t_moved_attributesR(RtattrsR#((s'/usr/lib/python2.7/site-packages/six.pyt__dir__s #(RRRR*R((((s'/usr/lib/python2.7/site-packages/six.pyR'zs  tMovedAttributecB@s eZdddZdZRS(cC@stt|j|trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr|}n||_dS(N(RR+RRRRR#(RRtold_modtnew_modtold_attrtnew_attr((s'/usr/lib/python2.7/site-packages/six.pyRs           cC@st|j}t||jS(N(RRR"R#(Rtmodule((s'/usr/lib/python2.7/site-packages/six.pyRsN(RRRRR(((s'/usr/lib/python2.7/site-packages/six.pyR+st_SixMetaPathImportercB@s_eZdZdZdZdZd dZdZdZ dZ dZ e Z RS( s A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 cC@s||_i|_dS(N(Rt known_modules(Rtsix_module_name((s'/usr/lib/python2.7/site-packages/six.pyRs cG@s-x&|D]}||j|jd|(RR6((s'/usr/lib/python2.7/site-packages/six.pyt is_packagescC@s|j|dS(s;Return None Required, if is_package is implementedN(R>R(RR6((s'/usr/lib/python2.7/site-packages/six.pytget_codes N( RRRRR7R8RR:R>RARDREt get_source(((s'/usr/lib/python2.7/site-packages/six.pyR1s       t _MovedItemscB@seZdZgZRS(sLazy loading of moved objects(RRRRB(((s'/usr/lib/python2.7/site-packages/six.pyRGst cStringIOtiotStringIOtfiltert itertoolstbuiltinstifiltert filterfalset ifilterfalsetinputt __builtin__t raw_inputtinternR tmaptimaptrangetxranget reload_moduletimptreloadtreducet functoolst shlex_quotetpipestshlextquotetUserDictt collectionstUserListt UserStringtziptizipt zip_longestt izip_longestt configparsert ConfigParsertcopyregtcopy_regtdbm_gnutgdbmsdbm.gnut _dummy_threadt dummy_threadthttp_cookiejart cookielibshttp.cookiejart http_cookiestCookies http.cookiest html_entitiesthtmlentitydefss html.entitiest html_parsert HTMLParsers html.parsert http_clientthttplibs http.clienttemail_mime_multipartsemail.MIMEMultipartsemail.mime.multiparttemail_mime_nonmultipartsemail.MIMENonMultipartsemail.mime.nonmultiparttemail_mime_textsemail.MIMETextsemail.mime.texttemail_mime_basesemail.MIMEBasesemail.mime.basetBaseHTTPServers http.servert CGIHTTPServertSimpleHTTPServertcPickletpickletqueuetQueuetreprlibtreprt socketservert SocketServert_threadtthreadttkintertTkinterttkinter_dialogtDialogstkinter.dialogttkinter_filedialogt FileDialogstkinter.filedialogttkinter_scrolledtextt ScrolledTextstkinter.scrolledtextttkinter_simpledialogt SimpleDialogstkinter.simpledialogt tkinter_tixtTixs tkinter.tixt tkinter_ttktttks tkinter.ttkttkinter_constantst Tkconstantsstkinter.constantst tkinter_dndtTkdnds tkinter.dndttkinter_colorchooserttkColorChooserstkinter.colorchooserttkinter_commondialogttkCommonDialogstkinter.commondialogttkinter_tkfiledialogt tkFileDialogt tkinter_fontttkFonts tkinter.fontttkinter_messageboxt tkMessageBoxstkinter.messageboxttkinter_tksimpledialogttkSimpleDialogt urllib_parses.moves.urllib_parses urllib.parset urllib_errors.moves.urllib_errors urllib.errorturllibs .moves.urllibturllib_robotparsert robotparsersurllib.robotparsert xmlrpc_clientt xmlrpclibs xmlrpc.clientt xmlrpc_servertSimpleXMLRPCServers xmlrpc.servertwinregt_winregsmoves.s.movestmovestModule_six_moves_urllib_parsecB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_parse(RRR(((s'/usr/lib/python2.7/site-packages/six.pyR5st ParseResultturlparset SplitResulttparse_qst parse_qslt urldefragturljointurlsplitt urlunparset urlunsplitt quote_plustunquotet unquote_plust urlencodet splitquerytsplittagt splitusert uses_fragmentt uses_netloct uses_paramst uses_queryt uses_relativesmoves.urllib_parsesmoves.urllib.parsetModule_six_moves_urllib_errorcB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_error(RRR(((s'/usr/lib/python2.7/site-packages/six.pyR\stURLErrorturllib2t HTTPErrortContentTooShortErrors.moves.urllib.errorsmoves.urllib_errorsmoves.urllib.errortModule_six_moves_urllib_requestcB@seZdZRS(s9Lazy loading of moved objects in six.moves.urllib_request(RRR(((s'/usr/lib/python2.7/site-packages/six.pyRosturlopensurllib.requesttinstall_openert build_openert pathname2urlt url2pathnamet getproxiestRequesttOpenerDirectortHTTPDefaultErrorHandlertHTTPRedirectHandlertHTTPCookieProcessort ProxyHandlert BaseHandlertHTTPPasswordMgrtHTTPPasswordMgrWithDefaultRealmtAbstractBasicAuthHandlertHTTPBasicAuthHandlertProxyBasicAuthHandlertAbstractDigestAuthHandlertHTTPDigestAuthHandlertProxyDigestAuthHandlert HTTPHandlert HTTPSHandlert FileHandlert FTPHandlertCacheFTPHandlertUnknownHandlertHTTPErrorProcessort urlretrievet urlcleanupt URLopenertFancyURLopenert proxy_bypasss.moves.urllib.requestsmoves.urllib_requestsmoves.urllib.requestt Module_six_moves_urllib_responsecB@seZdZRS(s:Lazy loading of moved objects in six.moves.urllib_response(RRR(((s'/usr/lib/python2.7/site-packages/six.pyRstaddbasesurllib.responset addclosehooktaddinfot addinfourls.moves.urllib.responsesmoves.urllib_responsesmoves.urllib.responset#Module_six_moves_urllib_robotparsercB@seZdZRS(s=Lazy loading of moved objects in six.moves.urllib_robotparser(RRR(((s'/usr/lib/python2.7/site-packages/six.pyRstRobotFileParsers.moves.urllib.robotparsersmoves.urllib_robotparsersmoves.urllib.robotparsertModule_six_moves_urllibcB@sheZdZgZejdZejdZejdZejdZ ejdZ dZ RS(sICreate a six.moves.urllib namespace that resembles the Python 3 namespacesmoves.urllib_parsesmoves.urllib_errorsmoves.urllib_requestsmoves.urllib_responsesmoves.urllib_robotparsercC@sdddddgS(NtparseterrortrequesttresponseR((R((s'/usr/lib/python2.7/site-packages/six.pyR*s( RRRRBt _importerR8RRRRRR*(((s'/usr/lib/python2.7/site-packages/six.pyRss moves.urllibcC@stt|j|dS(sAdd an item to six.moves.N(RRGR(tmove((s'/usr/lib/python2.7/site-packages/six.pytadd_movescC@s^ytt|WnFtk rYytj|=WqZtk rUtd|fqZXnXdS(sRemove item from six.moves.sno such move, %rN(RRGRRt__dict__R;(R((s'/usr/lib/python2.7/site-packages/six.pyt remove_moves  t__func__t__self__t __closure__t__code__t __defaults__t __globals__tim_functim_selft func_closuret func_codet func_defaultst func_globalscC@s |jS(N(tnext(tit((s'/usr/lib/python2.7/site-packages/six.pytadvance_iteratorscC@stdt|jDS(Ncs@s|]}d|jkVqdS(t__call__N(R(t.0tklass((s'/usr/lib/python2.7/site-packages/six.pys s(tanyttypet__mro__(R((s'/usr/lib/python2.7/site-packages/six.pytcallablescC@s|S(N((tunbound((s'/usr/lib/python2.7/site-packages/six.pytget_unbound_functionscC@s|jS(N(R (R((s'/usr/lib/python2.7/site-packages/six.pyRscC@stj|||jS(N(ttypest MethodTypeR(RR((s'/usr/lib/python2.7/site-packages/six.pytcreate_bound_methodstIteratorcB@seZdZRS(cC@st|j|S(N(Rt__next__(R((s'/usr/lib/python2.7/site-packages/six.pyRs(RRR(((s'/usr/lib/python2.7/site-packages/six.pyR!ss3Get the function out of a possibly unbound functioncK@st|j|S(N(titertkeys(tdtkw((s'/usr/lib/python2.7/site-packages/six.pytiterkeys'scK@st|j|S(N(R#tvalues(R%R&((s'/usr/lib/python2.7/site-packages/six.pyt itervalues*scK@st|j|S(N(R#titems(R%R&((s'/usr/lib/python2.7/site-packages/six.pyt iteritems-scK@st|j|S(N(R#tlists(R%R&((s'/usr/lib/python2.7/site-packages/six.pyt iterlists0sR$R(R*cK@st|j|S(N(R#R'(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR'9scK@st|j|S(N(R#R)(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR)<scK@st|j|S(N(R#R+(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR+?scK@st|j|S(N(R#R-(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR-Bstviewkeyst viewvaluest viewitemss1Return an iterator over the keys of a dictionary.s3Return an iterator over the values of a dictionary.s?Return an iterator over the (key, value) pairs of a dictionary.sBReturn an iterator over the (key, [values]) pairs of a dictionary.cC@s |jdS(Nslatin-1(tencode(ts((s'/usr/lib/python2.7/site-packages/six.pytbTscC@s|S(N((R2((s'/usr/lib/python2.7/site-packages/six.pytuVscC@s t|fS(N(tbytes(ti((s'/usr/lib/python2.7/site-packages/six.pytint2byteZstto_bytestbigtassertCountEqualtassertRaisesRegext assertRegexcC@s|S(N((R2((s'/usr/lib/python2.7/site-packages/six.pyR3iscC@st|jdddS(Ns\\s\\\\tunicode_escape(tunicodetreplace(R2((s'/usr/lib/python2.7/site-packages/six.pyR4lscC@st|dS(Ni(tord(tbs((s'/usr/lib/python2.7/site-packages/six.pytbyte2intpscC@st||S(N(R@(tbufR6((s'/usr/lib/python2.7/site-packages/six.pyt indexbytesrstassertItemsEqualtassertRaisesRegexptassertRegexpMatchess Byte literals Text literalcO@st|t||S(N(R"t_assertCountEqual(Rtargstkwargs((s'/usr/lib/python2.7/site-packages/six.pyR:~scO@st|t||S(N(R"t_assertRaisesRegex(RRIRJ((s'/usr/lib/python2.7/site-packages/six.pyR;scO@st|t||S(N(R"t _assertRegex(RRIRJ((s'/usr/lib/python2.7/site-packages/six.pyR<stexeccC@sC|dkr|}n|j|k r9|j|n|dS(N(Rt __traceback__twith_traceback(RR%ttb((s'/usr/lib/python2.7/site-packages/six.pytreraises   cB@sc|dkrBejd}|j}|dkr<|j}n~n|dkrW|}nddUdS(sExecute code in a namespace.isexec _code_ in _globs_, _locs_N(RR t _getframet f_globalstf_locals(t_code_t_globs_t_locs_tframe((s'/usr/lib/python2.7/site-packages/six.pytexec_s      s9def reraise(tp, value, tb=None): raise tp, value, tb srdef raise_from(value, from_value): if from_value is None: raise value raise value from from_value sCdef raise_from(value, from_value): raise value from from_value cC@s |dS(N((R%t from_value((s'/usr/lib/python2.7/site-packages/six.pyt raise_fromstprintc @s|jdtjdkr%dSfd}t}|jdd}|dk rt|trpt}qt|tst dqn|jdd}|dk rt|trt}qt|tst dqn|rt dn|s0x*|D]}t|tr t}Pq q Wn|rQtd }td }n d }d }|dkrr|}n|dkr|}nx7t |D])\} }| r||n||qW||dS( s4The new-style print function for Python 2.4 and 2.5.tfileNc@st|tst|}nttrt|trjdk rtdd}|dkrrd}n|jj|}nj |dS(Nterrorststrict( R?t basestringtstrR]R>tencodingRR"R1twrite(tdataR^(tfp(s'/usr/lib/python2.7/site-packages/six.pyRcs  tsepssep must be None or a stringtendsend must be None or a strings$invalid keyword arguments to print()s t ( tpopR tstdoutRtFalseR?R>tTrueRat TypeErrort enumerate( RIRJRct want_unicodeRfRgtargtnewlinetspaceR6((Res'/usr/lib/python2.7/site-packages/six.pytprint_sL              cO@sW|jdtj}|jdt}t|||rS|dk rS|jndS(NR]tflush(tgetR RjRiRkt_printRRt(RIRJReRt((s'/usr/lib/python2.7/site-packages/six.pyRss  sReraise an exception.ic@sfd}|S(Nc@s(tj|}|_|S(N(R]twrapst __wrapped__(tf(tassignedtupdatedtwrapped(s'/usr/lib/python2.7/site-packages/six.pytwrappers ((R|RzR{R}((RzR{R|s'/usr/lib/python2.7/site-packages/six.pyRwsc@s5dffdY}tj|ddiS(s%Create a base class with a metaclass.t metaclassc@seZfdZRS(c@s||S(N((tclsRt this_basesR%(tbasestmeta(s'/usr/lib/python2.7/site-packages/six.pyt__new__ s(RRR((RR(s'/usr/lib/python2.7/site-packages/six.pyR~sttemporary_class((RR(RRR~((RRs'/usr/lib/python2.7/site-packages/six.pytwith_metaclasssc@sfd}|S(s6Class decorator for creating a class with a metaclass.c@s|jj}|jd}|dk rft|trE|g}nx|D]}|j|qLWn|jdd|jdd|j|j|S(Nt __slots__Rt __weakref__( RtcopyRuRR?RaRiRt __bases__(Rt orig_varstslotst slots_var(R~(s'/usr/lib/python2.7/site-packages/six.pyR}s   ((R~R}((R~s'/usr/lib/python2.7/site-packages/six.pyt add_metaclasss cC@sJtrFd|jkr+td|jn|j|_d|_n|S(s A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. t__str__sY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cS@s|jjdS(Nsutf-8(t __unicode__R1(R((s'/usr/lib/python2.7/site-packages/six.pyt,s(tPY2Rt ValueErrorRRR(R((s'/usr/lib/python2.7/site-packages/six.pytpython_2_unicode_compatibles t__spec__IiIill(ii(ii(ii(ii(Rt __future__RR]RLtoperatorR Rt __author__t __version__t version_infoRRRat string_typestintt integer_typesRt class_typest text_typeR5t binary_typetmaxsizetMAXSIZER`tlongt ClassTypeR>tplatformt startswithtobjectRtlent OverflowErrorR RRRt ModuleTypeR'R+R1RRRGR(R#RRR?R7RRt_urllib_parse_moved_attributesRt_urllib_error_moved_attributesRt _urllib_request_moved_attributesRt!_urllib_response_moved_attributesRt$_urllib_robotparser_moved_attributesRRRt _meth_funct _meth_selft _func_closuret _func_codet_func_defaultst _func_globalsRRt NameErrorRRRR R!t attrgettertget_method_functiontget_method_selftget_function_closuretget_function_codetget_function_defaultstget_function_globalsR'R)R+R-t methodcallerR.R/R0R3R4tchrtunichrR7t itemgetterRBtgetitemRDR#t iterbytesRIRJtBytesIORHRKRLtpartialRVR@R:R;R<R"RMRYRRQR[RsRvtWRAPPER_ASSIGNMENTStWRAPPER_UPDATESRwRRRRBt __package__tglobalsRuRtsubmodule_search_locationst meta_pathRnR6timportertappend(((s'/usr/lib/python2.7/site-packages/six.pyts               <                                                                              4         PK['G&G&site-packages/ipaddress.pyonu[ lVc@s dZddlmZddlZddlZdZefZyeefZWne k r`nXy e Z Wne k re Z nXdddkrdZ n dZ y ejZWnek rd ZnXd Zeed rd Zn d ZddZdefdYZdZdZdefdYZdefdYZdZedZdZdZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$efd%YZ)d&e)fd'YZ*d(e)fd)YZ+d*efd+YZ,d,e,e*fd-YZ-d.e-fd/YZ.d0e,e+fd1YZ/d2efd3YZ0e0e-_1d4efd5YZ2d6e2e*fd7YZ3d8e3fd9YZ4d:e2e+fd;YZ5d<efd=YZ6e6e3_1dS(>uA fast, lightweight IPv4/IPv6 manipulation library in Python. This library is used to create/poke/manipulate IPv4 and IPv6 addresses and networks. i(tunicode_literalsNu1.0.16ticCs|S(N((tbyt((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_bytes_to_byte_valsscCs'g|D]}tjd|d^qS(Ns!Bi(tstructtunpack(Rtb((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"scCs)d}x|D]}|d>|}q W|S(Nii((tbytvalst endianesstrestbv((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_int_from_byte_vals's cCs|dkrF|dks$|d kr6tjdntjd|S|dkr|dksj|dkr|tjd ntjd |d ?|d @StdS(Niiii u(integer out of range for 'I' format codes!Iiiu)integer out of range for 'QQ' format codes!QQi@lIl (RterrortpacktNotImplementedError(tintvaltlengthR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_to_bytes0s  u bit_lengthcCs |jS(N(t bit_length(ti((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_bit_length?scCs/x(tjD]}||?dkr |Sq WdS(Ni(t itertoolstcount(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyRBsiccs,|}x||kr'|V||7}q WdS(N((tstarttendtstepR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt _compat_rangeHst_TotalOrderingMixincBsDeZdZdZdZdZdZdZdZRS(cCs tdS(N(R(tselftother((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__eq__WscCs$|j|}|tkrtS| S(N(RtNotImplemented(RRtequal((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__ne__Zs cCs tdS(N(R(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__lt__`scCs3|j|}|tks"| r/|j|S|S(N(R"RR(RRtless((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__le__cs cCsI|j|}|tkrtS|j|}|tkr>tS|pG| S(N(R"RR(RRR#R ((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__gt__is  cCs$|j|}|tkrtS| S(N(R"R(RRR#((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__ge__rs (( t__name__t __module__t __slots__RR!R"R$R%R&(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRPs     i itAddressValueErrorcBseZdZRS(u%A Value Error related to the address.(R'R(t__doc__(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR*}stNetmaskValueErrorcBseZdZRS(u%A Value Error related to the netmask.(R'R(R+(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR,scCsyt|SWnttfk r'nXyt|SWnttfk rOnXt|trrtd|ntd|dS(uTake an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. Returns: An IPv4Address or IPv6Address object. Raises: ValueError: if the *address* passed isn't either a v4 or a v6 address ux%r does not appear to be an IPv4 or IPv6 address. Did you pass in a bytes (str in Python 2) instead of a unicode object?u0%r does not appear to be an IPv4 or IPv6 addressN(t IPv4AddressR*R,t IPv6Addresst isinstancetbytest ValueError(taddress((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ip_addresss cCsyt||SWnttfk r*nXyt||SWnttfk rUnXt|trxtd|ntd|dS(uTake an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP network. Either IPv4 or IPv6 networks may be supplied; integers less than 2**32 will be considered to be IPv4 by default. Returns: An IPv4Network or IPv6Network object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. Or if the network has host bits set. ux%r does not appear to be an IPv4 or IPv6 network. Did you pass in a bytes (str in Python 2) instead of a unicode object?u0%r does not appear to be an IPv4 or IPv6 networkN(t IPv4NetworkR*R,t IPv6NetworkR/R0R1(R2tstrict((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ip_networks cCsdyt|SWnttfk r'nXyt|SWnttfk rOnXtd|dS(ugTake an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. Returns: An IPv4Interface or IPv6Interface object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. Notes: The IPv?Interface classes describe an Address on a particular Network, so they're basically a combination of both the Address and Network classes. u2%r does not appear to be an IPv4 or IPv6 interfaceN(t IPv4InterfaceR*R,t IPv6InterfaceR1(R2((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ip_interfacescCsAyt|ddSWn&tjtfk r<tdnXdS(u`Represent an address as 4 packed bytes in network (big-endian) order. Args: address: An integer representation of an IPv4 IP address. Returns: The integer address packed as 4 bytes in network (big-endian) order. Raises: ValueError: If the integer is negative or too large to be an IPv4 IP address. iubigu&Address negative or too large for IPv4N(RRR t OverflowErrorR1(R2((s-/usr/lib/python2.7/site-packages/ipaddress.pytv4_int_to_packedscCsAyt|ddSWn&tjtfk r<tdnXdS(uRepresent an address as 16 packed bytes in network (big-endian) order. Args: address: An integer representation of an IPv6 IP address. Returns: The integer address packed as 16 bytes in network (big-endian) order. iubigu&Address negative or too large for IPv6N(RRR R;R1(R2((s-/usr/lib/python2.7/site-packages/ipaddress.pytv6_int_to_packeds cCs>t|jd}t|dkr:td|n|S(uAHelper to split the netmask and raise AddressValueError if neededu/iuOnly one '/' permitted in %r(t _compat_strtsplittlenR*(R2taddr((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_split_optional_netmasksccslt|}t|}}x>|D]6}|j|jdkrS||fV|}n|}q#W||fVdS(uFind a sequence of sorted deduplicated IPv#Address. Args: addresses: a list of IPv#Address objects. Yields: A tuple containing the first and last IP addresses in the sequence. iN(titertnextt_ip(t addressestittfirsttlasttip((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_find_address_ranges     cCs,|dkr|St|t||d@S(uCount the number of zero bits on the right hand side. Args: number: an integer. bits: maximum number of bits to count. Returns: The number of zero bits on the right hand side of the number. ii(tminR(tnumbertbits((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_count_righthand_zero_bits0s ccsKt|tot|ts-tdn|j|jkrXtd||fn||krstdn|jdkrt}n$|jdkrt}n td|j}|j}|j}xz||krFt t ||t ||dd}||||f}|V|d|>7}|d|j krPqqWdS( uSummarize a network range given the first and last IP addresses. Example: >>> list(summarize_address_range(IPv4Address('192.0.2.0'), ... IPv4Address('192.0.2.130'))) ... #doctest: +NORMALIZE_WHITESPACE [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')] Args: first: the first IPv4Address or IPv6Address in the range. last: the last IPv4Address or IPv6Address in the range. Returns: An iterator of the summarized IPv(4|6) network objects. Raise: TypeError: If the first and last objects are not IP addresses. If the first and last objects are not the same version. ValueError: If the last object is not greater than the first. If the version of the first address is not 4 or 6. u1first and last must be IP addresses, not networksu%%s and %s are not of the same versionu*last IP address must be greater than firstiiuunknown IP versioniN( R/t _BaseAddresst TypeErrortversionR1R4R5t_max_prefixlenRERLRORt _ALL_ONES(RHRIRJtip_bitst first_inttlast_inttnbitstnet((s-/usr/lib/python2.7/site-packages/ipaddress.pytsummarize_address_range@s0       ccst|}i}xm|r|j}|j}|j|}|dkr[||| [IPv4Network('192.0.2.0/24')] This shouldn't be called directly; it is called via collapse_addresses([]). Args: addresses: A list of IPv4Network's or IPv6Network's Returns: A list of IPv4Network's or IPv6Network's depending on what we were passed. N( tlisttpoptsupernettgettNonetappendtsortedtvaluestbroadcast_address(RFtto_mergetsubnetsRYR]texistingRI((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_collapse_addresses_internalws$         cCsg}g}g}x2|D]*}t|trw|rg|dj|jkrgtd||dfn|j|q|j|jkr|r|dj|jkrtd||dfny|j|jWqCtk r|j|j qCXq|r6|dj|jkr6td||dfn|j|qWt t |}|rx3t |D]"\}}|j t||qlWnt||S(uCollapse a list of IP objects. Example: collapse_addresses([IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]) -> [IPv4Network('192.0.2.0/24')] Args: addresses: An iterator of IPv4Network or IPv6Network objects. Returns: An iterator of the collapsed IPv(4|6)Network objects. Raises: TypeError: If passed a list of mixed version objects. iu%%s and %s are not of the same version(R/RPt_versionRQR`t _prefixlenRSRJtAttributeErrortnetwork_addressRatsetRKtextendRZRg(RFtaddrstipstnetsRJRHRI((s-/usr/lib/python2.7/site-packages/ipaddress.pytcollapse_addressess4  cCs6t|tr|jSt|tr2|jStS(u2Return a key suitable for sorting between networks and addresses. Address and Network objects are not sortable by default; they're fundamentally different so the expression IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') doesn't make any sense. There are some times however, where you may wish to have ipaddress sort these for you anyway. If you need to do this, you can use this function as the key= argument to sorted(). Args: obj: either a Network or Address object. Returns: appropriate key. (R/t _BaseNetworkt_get_networks_keyRPt_get_address_keyR(tobj((s-/usr/lib/python2.7/site-packages/ipaddress.pytget_mixed_type_keys   t_IPAddressBasecBseZdZd ZedZedZedZedZdZ dZ e dZ e dZ e d Ze d Ze d Zd ZRS(uThe mother class.cCs |jS(u:Return the longhand version of the IP address as a string.(t_explode_shorthand_ip_string(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytexplodedscCs t|S(u;Return the shorthand version of the IP address as a string.(R>(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt compressedscCs |jS(uIThe name of the reverse DNS pointer for the IP address, e.g.: >>> ipaddress.ip_address("127.0.0.1").reverse_pointer '1.0.0.127.in-addr.arpa' >>> ipaddress.ip_address("2001:db8::1").reverse_pointer '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' (t_reverse_pointer(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytreverse_pointers cCs#dt|f}t|dS(Nu%200s has no version specified(ttypeR(Rtmsg((s-/usr/lib/python2.7/site-packages/ipaddress.pyRRscCsi|dkr.d}t|||jfn||jkred}t|||j|jfndS(Niu-%d (< 0) is not permitted as an IPv%d addressu2%d (>= 2**%d) is not permitted as an IPv%d address(R*RhRTRS(RR2R~((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_check_int_addresss cCsDt|}||kr@d}t|||||jfndS(Nu~%r (len %d != %d) is not permitted as an IPv%d address. Did you pass in a bytes (str in Python 2) instead of a unicode object?(R@R*Rh(RR2t expected_lent address_lenR~((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_check_packed_address s    cCs|j|j|?AS(uTurn the prefix length into a bitwise netmask Args: prefixlen: An integer, the prefix length. Returns: An integer. (RT(tclst prefixlen((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_ip_int_from_prefix+s c Cst||j}|j|}||?}d|>d}||kr{|jd}t||d}d}t||n|S(uReturn prefix length from the bitwise netmask. Args: ip_int: An integer, the netmask in expanded bitwise format Returns: An integer, the prefix length. Raises: ValueError: If the input intermingles zeroes & ones iiubigu&Netmask pattern %r mixes zeroes & ones(RORSRR1( Rtip_intttrailing_zeroesRt leading_onestall_onestbyteslentdetailsR~((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_prefix_from_ip_int8s      cCsd|}t|dS(Nu%r is not a valid netmask(R,(Rt netmask_strR~((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_report_invalid_netmaskQs cCstjj|s"|j|nyt|}Wntk rR|j|nXd|kom|jkns|j|n|S(u Return prefix length from a numeric string Args: prefixlen_str: The string to be converted Returns: An integer, the prefix length. Raises: NetmaskValueError: If the input is not a valid netmask i(t_BaseV4t_DECIMAL_DIGITSt issupersetRtintR1RS(Rt prefixlen_strR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_prefix_from_prefix_stringVs cCsy|j|}Wntk r3|j|nXy|j|SWntk rXnX||jN}y|j|SWntk r|j|nXdS(uTurn a netmask/hostmask string into a prefix length Args: ip_str: The netmask/hostmask to be converted Returns: An integer, the prefix length. Raises: NetmaskValueError: If the input is not a valid netmask/hostmask N(t_ip_int_from_stringR*RRR1RT(Rtip_strR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_prefix_from_ip_stringos    cCs|jt|ffS(N(t __class__R>(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt __reduce__s((R'R(R+R)tpropertyRyRzR|RRRRt classmethodRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRws   "RPcBsneZdZd ZdZdZdZdZdZdZ dZ dZ d Z d Z RS( uA generic IP object. This IP class contains the version independent methods which are used by single IP addresses. cCs|jS(N(RE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__int__scCs?y&|j|jko$|j|jkSWntk r:tSXdS(N(RERhRjR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs  cCst|tstSt|ts;td||fn|j|jkrftd||fn|j|jkr|j|jkStS(Nu"%s and %s are not of the same typeu%%s and %s are not of the same version(R/RwRRPRQRhREtFalse(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"scCs*t|tstS|jt||S(N(R/t_compat_int_typesRRR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__add__scCs*t|tstS|jt||S(N(R/RRRR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__sub__scCsd|jjt|fS(Nu%s(%r)(RR'R>(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__repr__scCst|j|jS(N(R>t_string_from_ip_intRE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__str__scCsttt|jS(N(thashthexRRE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__hash__scCs |j|fS(N(Rh(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRtscCs|j|jffS(N(RRE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs((R'R(R+R)RRR"RRRRRRtR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRPs         RrcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z ed Zed ZedZedZedZedZedZedZdZdZdZdd#dZdd#dZedZdZdZedZ edZ!edZ"ed Z#ed!Z$ed"Z%RS($u~A generic IP network object. This IP class contains the version independent methods which are used by networks. cCs i|_dS(N(t_cache(RR2((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__init__scCsd|jjt|fS(Nu%s(%r)(RR'R>(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|jfS(Nu%s/%d(RkR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRsccsNt|j}t|j}x)t|d|D]}|j|Vq2WdS(uGenerate Iterator over usable hosts in a network. This is like __iter__ except it doesn't return the network or broadcast addresses. iN(RRkRcRt_address_class(Rtnetworkt broadcasttx((s-/usr/lib/python2.7/site-packages/ipaddress.pythostssccsNt|j}t|j}x)t||dD]}|j|Vq2WdS(Ni(RRkRcRR(RRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__iter__scCst|j}t|j}|dkrT|||krCtn|j||S|d7}|||krwtn|j||SdS(Nii(RRkRct IndexErrorR(RtnRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt __getitem__s    cCst|tstSt|ts;td||fn|j|jkrftd||fn|j|jkr|j|jkS|j|jkr|j|jkStS(Nu"%s and %s are not of the same typeu%%s and %s are not of the same version( R/RwRRrRQRhRktnetmaskR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"scCs]yD|j|jkoB|j|jkoBt|jt|jkSWntk rXtSXdS(N(RhRkRRRjR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs   cCs tt|jt|jAS(N(RRRkR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs`|j|jkrtSt|tr)tSt|jt|jkoYt|jkSSdS(N(RhRR/RrRRkRERc(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt __contains__s  cCs:|j|kp9|j|kp9|j|kp9|j|kS(u*Tell if self is partly contained in other.(RkRc(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pytoverlaps)scCsW|jjd}|dkrS|jt|jt|jB}||jd other eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') IPv6Network('2001:db8::2000/124') > IPv6Network('2001:db8::1000/124') Raises: TypeError if the IP versions are different. u"%s and %s are not of the same typeiii(RhRQRkR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pytcompare_networkss!cCs|j|j|jfS(uNetwork-only key function. Returns an object that identifies this address' network and netmask. This function is a suitable "key" argument for sorted() and list.sort(). (RhRkR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRssic cs0|j|jkr|VdS|dk rp||jkrEtdn|dkr`tdn||j}n|dkrtdn|j|}||jkrtd||fnt|j}t|j}t|jd|?}x4t|||D] }|j ||f}|VqWdS(uThe subnets which join to make the current subnet. In the case that self contains only one IP (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 for IPv6), yield an iterator with just ourself. Args: prefixlen_diff: An integer, the amount the prefix length should be increased by. This should not be set if new_prefix is also set. new_prefix: The desired new prefix length. This must be a larger number (smaller prefix) than the existing prefix. This should not be set if prefixlen_diff is also set. Returns: An iterator of IPv(4|6) objects. Raises: ValueError: The prefixlen_diff is too small or too large. OR prefixlen_diff and new_prefix are both set or new_prefix is a smaller number than the current prefix (smaller number means a larger network) Nunew prefix must be longeriu(cannot set prefixlen_diff and new_prefixiuprefix length diff must be > 0u0prefix length diff %d is invalid for netblock %s( RiRSR_R1RRkRcRRR( Rtprefixlen_difft new_prefixt new_prefixlenRRRtnew_addrtcurrent((s-/usr/lib/python2.7/site-packages/ipaddress.pyRes,    cCs|jdkr|S|dk rh||jkr=tdn|dkrXtdn|j|}n|j|}|dkrtd|j|fn|jt|jt|j|>@|fS(uThe supernet containing the current network. Args: prefixlen_diff: An integer, the amount the prefix length of the network should be decreased by. For example, given a /24 network and a prefixlen_diff of 3, a supernet with a /21 netmask is returned. Returns: An IPv4 network object. Raises: ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a negative prefix length. OR If prefixlen_diff and new_prefix are both set or new_prefix is a larger number than the current prefix (larger number means a smaller network) iunew prefix must be shorteriu(cannot set prefixlen_diff and new_prefixu;current prefixlen is %d, cannot have a prefixlen_diff of %dN(RiR_R1RRRRkR(RRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR]s     cCs|jjo|jjS(uTest if the address is reserved for multicast use. Returns: A boolean, True if the address is a multicast address. See RFC 2373 2.7 for details. (Rkt is_multicastRc(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRAs cCsp|j|jkrtSt|drVt|drV|j|jkoU|j|jkStdt|dS(Nunetwork_addressubroadcast_addressu9Unable to test subnet containment with element of type %s(RhRthasattrRkRcRQR}(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRMscCsp|j|jkrtSt|drVt|drV|j|jkoU|j|jkStdt|dS(Nunetwork_addressubroadcast_addressu9Unable to test subnet containment with element of type %s(RhRRRkRcRQR}(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt supernet_of[scCs|jjo|jjS(uTest if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within one of the reserved IPv6 Network ranges. (Rkt is_reservedRc(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRis cCs|jjo|jjS(uTest if the address is reserved for link-local. Returns: A boolean, True if the address is reserved per RFC 4291. (Rkt is_link_localRc(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRus cCs|jjo|jjS(uTest if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per iana-ipv4-special-registry or iana-ipv6-special-registry. (Rkt is_privateRc(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs|j S(uTest if this address is allocated for public networks. Returns: A boolean, True if the address is not reserved per iana-ipv4-special-registry or iana-ipv6-special-registry. (R(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt is_globals cCs|jjo|jjS(uTest if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 2373 2.5.2. (Rktis_unspecifiedRc(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs|jjo|jjS(uTest if the address is a loopback address. Returns: A boolean, True if the address is a loopback address as defined in RFC 2373 2.5.3. (Rkt is_loopbackRc(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs N(&R'R(R+RRRRRRR"RRRRRRcRRRRRRRRRRsR_ReR]RRRRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRrsD          K 0 5)       Rc BseZdZdZdZdedZedZeddddd d d d d g Z eZ iZ dZ e dZe dZe dZe dZdZdZedZedZRS(uyBase IPv4 object. The following methods are used by IPv4 objects in both single IP addresses and networks. iiiu 0123456789iiiiiiiiicCs t|S(N(R>(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRxscCs||jkrt|tr'|}n6y|j|}Wn tk r\|j|}nXt|j|}||f|j| 255) not permitted(R1RRR@R(Rt octet_strR~t octet_int((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs#djdt|ddDS(uTurns a 32-bit integer into dotted decimal notation. Args: ip_int: An integer, the IP address. Returns: The IP address as a string in dotted decimal notation. u.css@|]6}tt|tr1tjd|dn|VqdS(s!BiN(R>R/R0RR(t.0R((s-/usr/lib/python2.7/site-packages/ipaddress.pys -siubig(tjoinR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"s cCs|jd}y5gtt|D]}||jkr"|^q"}Wntk rXtSXt|t|krutS|d|dkrtStS(uTest if the IP string is a hostmask (rather than a netmask). Args: ip_str: A string, the potential hostmask. Returns: A boolean, True if the IP string is a hostmask. u.ii(R?RRt_valid_mask_octetsR1RR@tTrue(RRRNRtparts((s-/usr/lib/python2.7/site-packages/ipaddress.pyt _is_hostmask2s 5 cCs3t|jdddd}dj|dS(uReturn the reverse DNS pointer name for the IPv4 address. This implements the method described in RFC1035 3.5. u.Niu .in-addr.arpa(R>R?R(Rtreverse_octets((s-/usr/lib/python2.7/site-packages/ipaddress.pyR{Gs"cCs|jS(N(RS(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt max_prefixlenPscCs|jS(N(Rh(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRRTs((R'R(R+R)Rht IPV4LENGTHRTt frozensetRRRSRRxRRRRRRR{RRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs" ' %  R-cBseZdZd ZdZedZedZedZedZ edZ ed Z ed Z RS( u/Represent and manipulate single IPv4 Addresses.u_ipu __weakref__cCst|tr)|j|||_dSt|trj|j|dt|}t|d|_dSt|}d|krt d|n|j ||_dS(u Args: address: A string or integer representing the IP Additionally, an integer can be passed, so IPv4Address('192.0.2.1') == IPv4Address(3221225985). or, more generally IPv4Address(int(IPv4Address('192.0.2.1'))) == IPv4Address('192.0.2.1') Raises: AddressValueError: If ipaddress isn't a valid IPv4 address. Niubigu/uUnexpected '/' in %r( R/RRRER0RRR R>R*R(RR2tbvstaddr_str((s-/usr/lib/python2.7/site-packages/ipaddress.pyR_s     cCs t|jS(u*The binary representation of this address.(R<RE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytpackedscCs||jjkS(uTest if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within the reserved IPv4 Network range. (t _constantst_reserved_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cs tfdjjDS(uTest if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per iana-ipv4-special-registry. c3s|]}|kVqdS(N((RRY(R(s-/usr/lib/python2.7/site-packages/ipaddress.pys s(tanyRt_private_networks(R((Rs-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is reserved for multicast use. Returns: A boolean, True if the address is multicast. See RFC 3171 for details. (Rt_multicast_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 5735 3. (Rt_unspecified_address(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is a loopback address. Returns: A boolean, True if the address is a loopback per RFC 3330. (Rt_loopback_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs||jjkS(uTest if the address is reserved for link-local. Returns: A boolean, True if the address is link-local per RFC 3927. (Rt_linklocal_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(u_ipu __weakref__( R'R(R+R)RRRRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR-Ys $     R8cBszeZdZdZdZdZdZejZe dZ e dZ e dZ e dZ RS( cCs;t|ttfrGtj||t|j|_|j|_ dSt|t rtj||dt |dkrt |d|_ n |j|_ t|dt |_|jj|_|jj|_dSt|}tj||dt|dt |_|jj |_ |jj|_|jj|_dS(NiiR6(R/R0RR-RR4RERRSRittupleR@RRRRRB(RR2RA((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(   cCs d|j|j|jjfS(Nu%s/%d(RRERR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsVtj||}| s%|tkr)|Sy|j|jkSWntk rQtSXdS(N(R-RRRRjR(RRt address_equal((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCsOtj||}|tkr"tSy|j|jkSWntk rJtSXdS(N(R-R"RRRjR(RRt address_less((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"s  cCs|j|jAt|jjAS(N(RERiRRRk(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs t|jS(N(R-RE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRJscCsd|j|j|jfS(Nu%s/%s(RRERi(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR scCsd|j|j|jfS(Nu%s/%s(RRER(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|j|jfS(Nu%s/%s(RRER(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(R'R(RRRR"RRwRRRJRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR8s    R4cBs/eZdZeZedZedZRS(ueThis class represents and manipulates 32-bit IPv4 network + addresses.. Attributes: [examples for IPv4Network('192.0.2.0/27')] .network_address: IPv4Address('192.0.2.0') .hostmask: IPv4Address('0.0.0.31') .broadcast_address: IPv4Address('192.0.2.32') .netmask: IPv4Address('255.255.255.224') .prefixlen: 27 cCstj||t|ttfrVt||_|j|j\|_ |_ dSt|t rt |dkr|d}n |j}t|d|_|j|\|_ |_ t |j}|t |j @|kr|rtd|qt|t |j @|_ndSt|}t|j|d|_t |dkrf|d}n |j}|j|\|_ |_ |rtt |jt |j @|jkrtd|qntt |jt |j @|_|j |jdkr|j|_ndS(uInstantiate a new IPv4 network object. Args: address: A string or integer representing the IP [& network]. '192.0.2.0/24' '192.0.2.0/255.255.255.0' '192.0.0.2/0.0.0.255' are all functionally the same in IPv4. Similarly, '192.0.2.1' '192.0.2.1/255.255.255.255' '192.0.2.1/32' are also functionally equivalent. That is to say, failing to provide a subnetmask will create an object with a mask of /32. If the mask (portion after the / in the argument) is given in dotted quad form, it is treated as a netmask if it starts with a non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it starts with a zero field (e.g. 0.255.255.255 == /8), with the single exception of an all-zero mask which is treated as a netmask == /0. If no mask is given, a default of /32 is used. Additionally, an integer can be passed, so IPv4Network('192.0.2.1') == IPv4Network(3221225985) or, more generally IPv4Interface(int(IPv4Interface('192.0.2.1'))) == IPv4Interface('192.0.2.1') Raises: AddressValueError: If ipaddress isn't a valid IPv4 address. NetmaskValueError: If the netmask isn't valid for an IPv4 address. ValueError: If strict is True and a network address is not supplied. Niiu%s has host bits seti(RrRR/RR0R-RkRRSRRiRR@RR1RBRRR(RR2R6RRRA((s-/usr/lib/python2.7/site-packages/ipaddress.pyR*sB%      cCs3|jtdko'|jtdk o2|j S(uTest if this address is allocated for public networks. Returns: A boolean, True if the address is not reserved per iana-ipv4-special-registry. u 100.64.0.0/10(RkR4RcR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs ( R'R(R+R-RRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR4s  Ut_IPv4ConstantscBseZedZedZedZededededededededed ed ed ed ed edgZed ZedZ RS(u169.254.0.0/16u 127.0.0.0/8u 224.0.0.0/4u 0.0.0.0/8u 10.0.0.0/8u 172.16.0.0/12u 192.0.0.0/29u192.0.0.170/31u 192.0.2.0/24u192.168.0.0/16u 198.18.0.0/15u198.51.100.0/24u203.0.113.0/24u 240.0.0.0/4u255.255.255.255/32u0.0.0.0( R'R(R4RRRRRR-R(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs&                 t_BaseV6cBseZdZdZdZdedZdZedZ eZ iZ e dZ e dZe dZe d Ze dd Zd Zd Zed ZedZRS(uyBase IPv6 object. The following methods are used by IPv6 objects in both single IP addresses and networks. iiiiu0123456789ABCDEFabcdefcCsl||jkrat|tr'|}n|j|}t|j|}||f|j|} || sC|dk rxd |}t|n| }qCqCW|dk r]|} t||d } |ds| d 8} | rd}t||qn|ds| d 8} | rd}t||qn|j| | } | d krd}t||jd |fqnt||jkrd}t||j|fn|dsd}t||n|dsd}t||nt|} d} d} yd} x5t | D]'} | d K} | |j || O} qW| d | K} x9t | dD]'} | d K} | |j || O} qRW| SWn)t k r}td||fnXdS(uTurn an IPv6 ip_str into an integer. Args: ip_str: A string, the IPv6 ip_str. Returns: An int, the IPv6 address Raises: AddressValueError: if ip_str isn't a valid IPv6 Address. uAddress cannot be emptyu:iu At least %d parts expected in %ru.iu%s in %ru%xiiiu!At most %d colons permitted in %ru At most one '::' permitted in %riu0Leading ':' only permitted as part of '::' in %ru1Trailing ':' only permitted as part of '::' in %ru/Expected at most %d other parts with '::' in %ru,Exactly %d parts expected without '::' in %rN( R*R?R@R-R\RER`t _HEXTET_COUNTR_Rtranget _parse_hextetR1(RRRt _min_partsR~tipv4_intRt _max_partst skip_indexRtparts_hitparts_lot parts_skippedR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs            #     cCs]|jj|s%td|nt|dkrPd}t||nt|dS(u&Convert an IPv6 hextet string into an integer. Args: hextet_str: A string, the number to parse. Returns: The hextet as an integer. Raises: ValueError: if the input isn't strictly a hex number from [0..FFFF]. uOnly hex digits permitted in %riu$At most 4 characters permitted in %ri(t _HEX_DIGITSRR1R@R(Rt hextet_strR~((s-/usr/lib/python2.7/site-packages/ipaddress.pyR=s c Csd}d}d}d}xot|D]a\}}|dkrz|d7}|dkr\|}n||kr|}|}qq%d}d}q%W|dkr||}|t|kr|dg7}ndg|||+|dkrdg|}qn|S(uCompresses a list of hextets. Compresses a list of strings, replacing the longest continuous sequence of "0" in the list with "" and adding empty strings at the beginning or at the end of the string such that subsequently calling ":".join(hextets) will produce the compressed version of the IPv6 address. Args: hextets: A list of strings, the hextets to compress. Returns: A list of strings. iiu0iu(t enumerateR@( Rthextetstbest_doublecolon_starttbest_doublecolon_lentdoublecolon_starttdoublecolon_lentindexthextettbest_doublecolon_end((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compress_hextetsWs.         cCs|d krt|j}n||jkr<tdnd|}gtdddD]$}dt|||d!d^qY}|j|}dj|S( u,Turns a 128-bit integer into hexadecimal notation. Args: ip_int: An integer, the IP address. Returns: A string, the hexadecimal representation of the address. Raises: ValueError: The address is bigger than 128 bits of all ones. uIPv6 address is too largeu%032xii iu%xiu:N(R_RRERTR1RRR(RRthex_strRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs  =cCst|tr!t|j}n-t|trBt|j}n t|}|j|}d|}gtdddD]}|||d!^qz}t|ttfrddj ||j fSdj |S(uExpand a shortened IPv6 address. Args: ip_str: A string, the IPv6 address. Returns: A string, the expanded IPv6 address. u%032xii iu%s/%du:( R/R5R>RkR9RJRRRrRRi(RRRRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRxs   0cCs3|jdddjdd}dj|dS(uReturn the reverse DNS pointer name for the IPv6 address. This implements the method described in RFC3596 2.5. Niu:uu.u .ip6.arpa(RytreplaceR(Rt reverse_chars((s-/usr/lib/python2.7/site-packages/ipaddress.pyR{s"cCs|jS(N(RS(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs|jS(N(Rh(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRRs(N(R'R(R+R)Rht IPV6LENGTHRTRRRRSRRRRRRR_RRxR{RRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs$ i0  R.cBseZdZdZdZedZedZedZedZ edZ ed Z ed Z ed Z ed Zed ZedZedZRS(u/Represent and manipulate single IPv6 Addresses.u_ipu __weakref__cCst|tr)|j|||_dSt|trj|j|dt|}t|d|_dSt|}d|krt d|n|j ||_dS(uInstantiate a new IPv6 address object. Args: address: A string or integer representing the IP Additionally, an integer can be passed, so IPv6Address('2001:db8::') == IPv6Address(42540766411282592856903984951653826560) or, more generally IPv6Address(int(IPv6Address('2001:db8::'))) == IPv6Address('2001:db8::') Raises: AddressValueError: If address isn't a valid IPv6 address. Niubigu/uUnexpected '/' in %r( R/RRRER0RRR R>R*R(RR2RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs     cCs t|jS(u*The binary representation of this address.(R=RE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs||jjkS(uTest if the address is reserved for multicast use. Returns: A boolean, True if the address is a multicast address. See RFC 2373 2.7 for details. (RR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cs tfdjjDS(uTest if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within one of the reserved IPv6 Network ranges. c3s|]}|kVqdS(N((RR(R(s-/usr/lib/python2.7/site-packages/ipaddress.pys s(RRt_reserved_networks(R((Rs-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is reserved for link-local. Returns: A boolean, True if the address is reserved per RFC 4291. (RR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs||jjkS(u`Test if the address is reserved for site-local. Note that the site-local address space has been deprecated by RFC 3879. Use is_private to test if this address is in the space of unique local addresses as defined by RFC 4193. Returns: A boolean, True if the address is reserved per RFC 3513 2.5.6. (Rt_sitelocal_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt is_site_locals cs tfdjjDS(uTest if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per iana-ipv6-special-registry. c3s|]}|kVqdS(N((RRY(R(s-/usr/lib/python2.7/site-packages/ipaddress.pys 2s(RRR(R((Rs-/usr/lib/python2.7/site-packages/ipaddress.pyR)s cCs|j S(uTest if this address is allocated for public networks. Returns: A boolean, true if the address is not reserved per iana-ipv6-special-registry. (R(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR4s cCs |jdkS(uTest if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 2373 2.5.2. i(RE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR?s cCs |jdkS(uTest if the address is a loopback address. Returns: A boolean, True if the address is a loopback address as defined in RFC 2373 2.5.3. i(RE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRJs cCs(|jd?dkrdSt|jd@S(uReturn the IPv4 mapped address. Returns: If the IPv6 address is a v4 mapped address, return the IPv4 mapped address. Return None otherwise. i iIN(RER_R-(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ipv4_mappedUs cCs@|jd?dkrdSt|jd?d@t|jd@fS(uTuple of embedded teredo IPs. Returns: Tuple of the (server, client) IPs or None if the address doesn't appear to be a teredo address (doesn't start with 2001::/32) i`i i@IN(RER_R-(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytteredobs cCs,|jd?dkrdSt|jd?d@S(uReturn the IPv4 6to4 embedded address. Returns: The IPv4 6to4-embedded address if present or None if the address doesn't appear to contain a 6to4 embedded address. ipi iPIN(RER_R-(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt sixtofourqs (u_ipu __weakref__(R'R(R+R)RRRRRRR RRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR.s %        R9cBseZdZdZdZdZdZejZe dZ e dZ e dZ e dZ e d Ze d ZRS( cCs;t|ttfrGtj||t|j|_|j|_ dSt|t rtj||dt |dkrt |d|_ n |j|_ t|dt |_|jj|_|jj|_dSt|}tj||dt|dt |_|jj|_|jj |_ |jj|_dS(NiiR6(R/R0RR.RR5RERRSRiRR@RRRRRB(RR2RA((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(   cCs d|j|j|jjfS(Nu%s/%d(RRERR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsVtj||}| s%|tkr)|Sy|j|jkSWntk rQtSXdS(N(R.RRRRjR(RRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCsOtj||}|tkr"tSy|j|jkSWntk rJtSXdS(N(R.R"RRRjR(RRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"s  cCs|j|jAt|jjAS(N(RERiRRRk(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs t|jS(N(R.RE(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRJscCsd|j|j|jfS(Nu%s/%s(RRERi(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|j|jfS(Nu%s/%s(RRER(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|j|jfS(Nu%s/%s(RRER(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs|jdko|jjS(Ni(RERR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs|jdko|jjS(Ni(RERR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(R'R(RRRR"RRwRRRJRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR9s    R5cBs8eZdZeZedZdZedZ RS(uvThis class represents and manipulates 128-bit IPv6 networks. Attributes: [examples for IPv6('2001:db8::1000/124')] .network_address: IPv6Address('2001:db8::1000') .hostmask: IPv6Address('::f') .broadcast_address: IPv6Address('2001:db8::100f') .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') .prefixlen: 124 cCstj||t|ttfrVt||_|j|j\|_ |_ dSt|t rt |dkr|d}n |j}|j|\|_ |_ t|d|_t |j}|t |j @|kr|rtd|qt|t |j @|_ndSt|}t|j|d|_t |dkrf|d}n |j}|j|\|_ |_ |rtt |jt |j @|jkrtd|qntt |jt |j @|_|j |jdkr|j|_ndS(uInstantiate a new IPv6 Network object. Args: address: A string or integer representing the IPv6 network or the IP and prefix/netmask. '2001:db8::/128' '2001:db8:0000:0000:0000:0000:0000:0000/128' '2001:db8::' are all functionally the same in IPv6. That is to say, failing to provide a subnetmask will create an object with a mask of /128. Additionally, an integer can be passed, so IPv6Network('2001:db8::') == IPv6Network(42540766411282592856903984951653826560) or, more generally IPv6Network(int(IPv6Network('2001:db8::'))) == IPv6Network('2001:db8::') strict: A boolean. If true, ensure that we have been passed A true network address, eg, 2001:db8::1000/124 and not an IP address on a network, eg, 2001:db8::1/124. Raises: AddressValueError: If address isn't a valid IPv6 address. NetmaskValueError: If the netmask isn't valid for an IPv6 address. ValueError: If strict was True and a network address was not supplied. Niiu%s has host bits seti(RrRR/R0RR.RkRRSRRiRR@RR1RBRRR(RR2R6RRRA((s-/usr/lib/python2.7/site-packages/ipaddress.pyRsB       ccsRt|j}t|j}x-t|d|dD]}|j|Vq6WdS(uGenerate Iterator over usable hosts in a network. This is like __iter__ except it doesn't return the Subnet-Router anycast address. iN(RRkRcRR(RRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR4 scCs|jjo|jjS(u`Test if the address is reserved for site-local. Note that the site-local address space has been deprecated by RFC 3879. Use is_private to test if this address is in the space of unique local addresses as defined by RFC 4193. Returns: A boolean, True if the address is reserved per RFC 3513 2.5.6. (RkR Rc(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR @ s ( R'R(R+R.RRRRRR (((s-/usr/lib/python2.7/site-packages/ipaddress.pyR5s   O t_IPv6ConstantscBseZedZedZedededededededed ed edg Zed ed ed ededededededededededededgZedZRS(u fe80::/10uff00::/8u::1/128u::/128u ::ffff:0:0/96u100::/64u 2001::/23u 2001:2::/48u 2001:db8::/32u 2001:10::/28ufc00::/7u::/8u100::/8u200::/7u400::/6u800::/5u1000::/4u4000::/3u6000::/3u8000::/3uA000::/3uC000::/3uE000::/4uF000::/5uF800::/6uFE00::/9u fec0::/10(R'R(R5RRRR R (((s-/usr/lib/python2.7/site-packages/ipaddress.pyRP s*           (7R+t __future__RRRt __version__RRtlongt NameErrortunicodeR>tstrRt from_bytesR RjRRRRtobjectRRR R1R*R,R3RR7R:R<R=RBRKRORZRgRqRvRwRPRrRR-R8R4RRRR.R9R5R(((s-/usr/lib/python2.7/site-packages/ipaddress.pyt sx              ) $ $ #      7 1 6 =pRr V{!PK[[ t tsite-packages/six.pyonu[ lȦTc?@@sdZddlmZddlZddlZddlZddlZddlZdZdZ ej ddkZ ej ddkZ e re fZefZefZe ZeZejZnefZeefZeejfZeZe Zejjdred\ZnVd efd YZye eWne!k rTed^Zn Xed`Z[dZ"dZ#defdYZ$de$fdYZ%dej&fdYZ'de$fdYZ(defdYZ)e)e*Z+de'fdYZ,e(dddde(dd d!d"de(d#d d d$d#e(d%d&d!d'd%e(d(d&d)e(d*d d!d+d*e(d,d&d!d-d,e(d.d&d/d0e(d1d&d2e(d3d4d5d6e(ddde(d7d7d8e(d9d9d8e(d:d:d8e(d-d&d!d-d,e(d;d d!d<d;e(d=d d d>d=e%d!d&e%d?d@e%dAdBe%dCdDdEe%dFdGdFe%dHdIdJe%dKdLdMe%dNdOdPe%dQdRdSe%dTdUdVe%dWdXdYe%dZd[d\e%d]d^d_e%d`dadbe%dcdcdde%dededde%dfdfdde%dgdgdhe%didje%dkdle%dmdne%dodpdoe%dqdre%dsdtdue%dvdwdxe%dydzd{e%d|d}d~e%ddde%ddde%ddde%ddde%ddde%ddde%dddxe%ddde%ddde%ddd~e%de*dde%de*dde%de*de*de%ddde%ddde%ddde%ddg=Z-xJe-D]BZ.e/e,e.j0e.e1e.e%re+j2e.de.j0qqW[.e-e,_-e,e*dZ3e+j2e3dde'fdYZ4e(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(d6dde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(dddgZ5x!e5D]Z.e/e4e.j0e.qW[.e5e4_-e+j2e4e*dddde'fdYZ6e(ddde(ddde(dddgZ7x!e7D]Z.e/e6e.j0e.q^W[.e7e6_-e+j2e6e*dddde'fdYZ8e(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(ddde(dddg!Z9x!e9D]Z.e/e8e.j0e.q W[.e9e8_-e+j2e8e*dddde'fdYZ:e(ddde(ddde(ddde(dddgZ;x!e;D]Z.e/e:e.j0e.q[ W[.e;e:_-e+j2e:e*dddde'fdYZ<e(dddgZ=x!e=D]Z.e/e<e.j0e.q W[.e=e<_-e+j2e<e*dd d d ej&fd YZ>e+j2e>e*dd dZ?dZ@e r dZAdZBdZCdZDdZEdZFn$dZAdZBdZCdZDdZEdZFy eGZHWneIk r dZHnXeHZGy eJZJWneIk r dZJnXe r$ dZKejLZMeZNn.dZKd ZMd!efd"YZNeJZJe"eKd#ejOeAZPejOeBZQejOeCZRejOeDZSejOeEZTejOeFZUe rd$ZVd%ZWd&ZXd'ZYejZd(Z[ejZd)Z\ejZd*Z]nQd+ZVd,ZWd-ZXd.ZYejZd/Z[ejZd0Z\ejZd1Z]e"eVd2e"eWd3e"eXd4e"eYd5e r;d6Z^d7Z_e`Zaej d d krd8ZbnejZd9d d:ZbejcdZdejeZfegZhddliZieijjZjeijkZkd;Zld<Zmd=Znnpd>Z^d?Z_eaZae`Zbd@ZddAZfejoejpeqZhddljZjejjjZjZkdBZldCZmdDZne"e^dEe"e_dFdGZrdHZsdIZte reue3jvdJZwddKZyndddLZwewdMej d dakr@ewdNn)ej d dbkr`ewdOn dPZzeue3jvdQdZ{e{dkrdRZ{nej d dckre{Z|dSZ{ne"eydTej dd!ddkrej}ej~dVZn ejZdWZdXZdYZgZe*ZejdZdk rJge_nejrxOeejD]>\ZZeej*dkrcej0e*krceje=PqcqcW[[nejje+dS(es6Utilities for writing code that runs on Python 2 and 3i(tabsolute_importNs'Benjamin Peterson s1.9.0iitjavaiitXcB@seZdZRS(cC@sdS(NiiI((tself((s'/usr/lib/python2.7/site-packages/six.pyt__len__<s(t__name__t __module__R(((s'/usr/lib/python2.7/site-packages/six.pyR;si?cC@s ||_dS(s Add documentation to a function.N(t__doc__(tfunctdoc((s'/usr/lib/python2.7/site-packages/six.pyt_add_docIscC@st|tj|S(s7Import module, returning the module after the last dot.(t __import__tsystmodules(tname((s'/usr/lib/python2.7/site-packages/six.pyt_import_moduleNs t _LazyDescrcB@seZdZdZRS(cC@s ||_dS(N(R(RR((s'/usr/lib/python2.7/site-packages/six.pyt__init__VscC@sN|j}t||j|yt|j|jWntk rInX|S(N(t_resolvetsetattrRtdelattrt __class__tAttributeError(Rtobjttptresult((s'/usr/lib/python2.7/site-packages/six.pyt__get__Ys  (RRRR(((s'/usr/lib/python2.7/site-packages/six.pyRTs t MovedModulecB@s&eZddZdZdZRS(cC@sJtt|j|tr=|dkr1|}n||_n ||_dS(N(tsuperRRtPY3tNonetmod(RRtoldtnew((s'/usr/lib/python2.7/site-packages/six.pyRgs    cC@s t|jS(N(RR(R((s'/usr/lib/python2.7/site-packages/six.pyRpscC@s/|j}t||}t||||S(N(RtgetattrR(Rtattrt_moduletvalue((s'/usr/lib/python2.7/site-packages/six.pyt __getattr__ss N(RRRRRR&(((s'/usr/lib/python2.7/site-packages/six.pyRes t _LazyModulecB@s eZdZdZgZRS(cC@s)tt|j||jj|_dS(N(RR'RRR(RR((s'/usr/lib/python2.7/site-packages/six.pyR|scC@s3ddg}|g|jD]}|j^q7}|S(NRR(t_moved_attributesR(RtattrsR#((s'/usr/lib/python2.7/site-packages/six.pyt__dir__s #(RRRR*R((((s'/usr/lib/python2.7/site-packages/six.pyR'zs  tMovedAttributecB@s eZdddZdZRS(cC@stt|j|trp|dkr1|}n||_|dkrd|dkr[|}qd|}n||_n'||_|dkr|}n||_dS(N(RR+RRRRR#(RRtold_modtnew_modtold_attrtnew_attr((s'/usr/lib/python2.7/site-packages/six.pyRs           cC@st|j}t||jS(N(RRR"R#(Rtmodule((s'/usr/lib/python2.7/site-packages/six.pyRsN(RRRRR(((s'/usr/lib/python2.7/site-packages/six.pyR+st_SixMetaPathImportercB@s_eZdZdZdZdZd dZdZdZ dZ dZ e Z RS( s A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 cC@s||_i|_dS(N(Rt known_modules(Rtsix_module_name((s'/usr/lib/python2.7/site-packages/six.pyRs cG@s-x&|D]}||j|jd|(RR6((s'/usr/lib/python2.7/site-packages/six.pyt is_packagescC@s|j|dS(s;Return None Required, if is_package is implementedN(R>R(RR6((s'/usr/lib/python2.7/site-packages/six.pytget_codes N( RRRRR7R8RR:R>RARDREt get_source(((s'/usr/lib/python2.7/site-packages/six.pyR1s       t _MovedItemscB@seZdZgZRS(sLazy loading of moved objects(RRRRB(((s'/usr/lib/python2.7/site-packages/six.pyRGst cStringIOtiotStringIOtfiltert itertoolstbuiltinstifiltert filterfalset ifilterfalsetinputt __builtin__t raw_inputtinternR tmaptimaptrangetxranget reload_moduletimptreloadtreducet functoolst shlex_quotetpipestshlextquotetUserDictt collectionstUserListt UserStringtziptizipt zip_longestt izip_longestt configparsert ConfigParsertcopyregtcopy_regtdbm_gnutgdbmsdbm.gnut _dummy_threadt dummy_threadthttp_cookiejart cookielibshttp.cookiejart http_cookiestCookies http.cookiest html_entitiesthtmlentitydefss html.entitiest html_parsert HTMLParsers html.parsert http_clientthttplibs http.clienttemail_mime_multipartsemail.MIMEMultipartsemail.mime.multiparttemail_mime_nonmultipartsemail.MIMENonMultipartsemail.mime.nonmultiparttemail_mime_textsemail.MIMETextsemail.mime.texttemail_mime_basesemail.MIMEBasesemail.mime.basetBaseHTTPServers http.servert CGIHTTPServertSimpleHTTPServertcPickletpickletqueuetQueuetreprlibtreprt socketservert SocketServert_threadtthreadttkintertTkinterttkinter_dialogtDialogstkinter.dialogttkinter_filedialogt FileDialogstkinter.filedialogttkinter_scrolledtextt ScrolledTextstkinter.scrolledtextttkinter_simpledialogt SimpleDialogstkinter.simpledialogt tkinter_tixtTixs tkinter.tixt tkinter_ttktttks tkinter.ttkttkinter_constantst Tkconstantsstkinter.constantst tkinter_dndtTkdnds tkinter.dndttkinter_colorchooserttkColorChooserstkinter.colorchooserttkinter_commondialogttkCommonDialogstkinter.commondialogttkinter_tkfiledialogt tkFileDialogt tkinter_fontttkFonts tkinter.fontttkinter_messageboxt tkMessageBoxstkinter.messageboxttkinter_tksimpledialogttkSimpleDialogt urllib_parses.moves.urllib_parses urllib.parset urllib_errors.moves.urllib_errors urllib.errorturllibs .moves.urllibturllib_robotparsert robotparsersurllib.robotparsert xmlrpc_clientt xmlrpclibs xmlrpc.clientt xmlrpc_servertSimpleXMLRPCServers xmlrpc.servertwinregt_winregsmoves.s.movestmovestModule_six_moves_urllib_parsecB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_parse(RRR(((s'/usr/lib/python2.7/site-packages/six.pyR5st ParseResultturlparset SplitResulttparse_qst parse_qslt urldefragturljointurlsplitt urlunparset urlunsplitt quote_plustunquotet unquote_plust urlencodet splitquerytsplittagt splitusert uses_fragmentt uses_netloct uses_paramst uses_queryt uses_relativesmoves.urllib_parsesmoves.urllib.parsetModule_six_moves_urllib_errorcB@seZdZRS(s7Lazy loading of moved objects in six.moves.urllib_error(RRR(((s'/usr/lib/python2.7/site-packages/six.pyR\stURLErrorturllib2t HTTPErrortContentTooShortErrors.moves.urllib.errorsmoves.urllib_errorsmoves.urllib.errortModule_six_moves_urllib_requestcB@seZdZRS(s9Lazy loading of moved objects in six.moves.urllib_request(RRR(((s'/usr/lib/python2.7/site-packages/six.pyRosturlopensurllib.requesttinstall_openert build_openert pathname2urlt url2pathnamet getproxiestRequesttOpenerDirectortHTTPDefaultErrorHandlertHTTPRedirectHandlertHTTPCookieProcessort ProxyHandlert BaseHandlertHTTPPasswordMgrtHTTPPasswordMgrWithDefaultRealmtAbstractBasicAuthHandlertHTTPBasicAuthHandlertProxyBasicAuthHandlertAbstractDigestAuthHandlertHTTPDigestAuthHandlertProxyDigestAuthHandlert HTTPHandlert HTTPSHandlert FileHandlert FTPHandlertCacheFTPHandlertUnknownHandlertHTTPErrorProcessort urlretrievet urlcleanupt URLopenertFancyURLopenert proxy_bypasss.moves.urllib.requestsmoves.urllib_requestsmoves.urllib.requestt Module_six_moves_urllib_responsecB@seZdZRS(s:Lazy loading of moved objects in six.moves.urllib_response(RRR(((s'/usr/lib/python2.7/site-packages/six.pyRstaddbasesurllib.responset addclosehooktaddinfot addinfourls.moves.urllib.responsesmoves.urllib_responsesmoves.urllib.responset#Module_six_moves_urllib_robotparsercB@seZdZRS(s=Lazy loading of moved objects in six.moves.urllib_robotparser(RRR(((s'/usr/lib/python2.7/site-packages/six.pyRstRobotFileParsers.moves.urllib.robotparsersmoves.urllib_robotparsersmoves.urllib.robotparsertModule_six_moves_urllibcB@sheZdZgZejdZejdZejdZejdZ ejdZ dZ RS(sICreate a six.moves.urllib namespace that resembles the Python 3 namespacesmoves.urllib_parsesmoves.urllib_errorsmoves.urllib_requestsmoves.urllib_responsesmoves.urllib_robotparsercC@sdddddgS(NtparseterrortrequesttresponseR((R((s'/usr/lib/python2.7/site-packages/six.pyR*s( RRRRBt _importerR8RRRRRR*(((s'/usr/lib/python2.7/site-packages/six.pyRss moves.urllibcC@stt|j|dS(sAdd an item to six.moves.N(RRGR(tmove((s'/usr/lib/python2.7/site-packages/six.pytadd_movescC@s^ytt|WnFtk rYytj|=WqZtk rUtd|fqZXnXdS(sRemove item from six.moves.sno such move, %rN(RRGRRt__dict__R;(R((s'/usr/lib/python2.7/site-packages/six.pyt remove_moves  t__func__t__self__t __closure__t__code__t __defaults__t __globals__tim_functim_selft func_closuret func_codet func_defaultst func_globalscC@s |jS(N(tnext(tit((s'/usr/lib/python2.7/site-packages/six.pytadvance_iteratorscC@stdt|jDS(Ncs@s|]}d|jkVqdS(t__call__N(R(t.0tklass((s'/usr/lib/python2.7/site-packages/six.pys s(tanyttypet__mro__(R((s'/usr/lib/python2.7/site-packages/six.pytcallablescC@s|S(N((tunbound((s'/usr/lib/python2.7/site-packages/six.pytget_unbound_functionscC@s|jS(N(R (R((s'/usr/lib/python2.7/site-packages/six.pyRscC@stj|||jS(N(ttypest MethodTypeR(RR((s'/usr/lib/python2.7/site-packages/six.pytcreate_bound_methodstIteratorcB@seZdZRS(cC@st|j|S(N(Rt__next__(R((s'/usr/lib/python2.7/site-packages/six.pyRs(RRR(((s'/usr/lib/python2.7/site-packages/six.pyR!ss3Get the function out of a possibly unbound functioncK@st|j|S(N(titertkeys(tdtkw((s'/usr/lib/python2.7/site-packages/six.pytiterkeys'scK@st|j|S(N(R#tvalues(R%R&((s'/usr/lib/python2.7/site-packages/six.pyt itervalues*scK@st|j|S(N(R#titems(R%R&((s'/usr/lib/python2.7/site-packages/six.pyt iteritems-scK@st|j|S(N(R#tlists(R%R&((s'/usr/lib/python2.7/site-packages/six.pyt iterlists0sR$R(R*cK@st|j|S(N(R#R'(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR'9scK@st|j|S(N(R#R)(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR)<scK@st|j|S(N(R#R+(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR+?scK@st|j|S(N(R#R-(R%R&((s'/usr/lib/python2.7/site-packages/six.pyR-Bstviewkeyst viewvaluest viewitemss1Return an iterator over the keys of a dictionary.s3Return an iterator over the values of a dictionary.s?Return an iterator over the (key, value) pairs of a dictionary.sBReturn an iterator over the (key, [values]) pairs of a dictionary.cC@s |jdS(Nslatin-1(tencode(ts((s'/usr/lib/python2.7/site-packages/six.pytbTscC@s|S(N((R2((s'/usr/lib/python2.7/site-packages/six.pytuVscC@s t|fS(N(tbytes(ti((s'/usr/lib/python2.7/site-packages/six.pytint2byteZstto_bytestbigtassertCountEqualtassertRaisesRegext assertRegexcC@s|S(N((R2((s'/usr/lib/python2.7/site-packages/six.pyR3iscC@st|jdddS(Ns\\s\\\\tunicode_escape(tunicodetreplace(R2((s'/usr/lib/python2.7/site-packages/six.pyR4lscC@st|dS(Ni(tord(tbs((s'/usr/lib/python2.7/site-packages/six.pytbyte2intpscC@st||S(N(R@(tbufR6((s'/usr/lib/python2.7/site-packages/six.pyt indexbytesrstassertItemsEqualtassertRaisesRegexptassertRegexpMatchess Byte literals Text literalcO@st|t||S(N(R"t_assertCountEqual(Rtargstkwargs((s'/usr/lib/python2.7/site-packages/six.pyR:~scO@st|t||S(N(R"t_assertRaisesRegex(RRIRJ((s'/usr/lib/python2.7/site-packages/six.pyR;scO@st|t||S(N(R"t _assertRegex(RRIRJ((s'/usr/lib/python2.7/site-packages/six.pyR<stexeccC@sC|dkr|}n|j|k r9|j|n|dS(N(Rt __traceback__twith_traceback(RR%ttb((s'/usr/lib/python2.7/site-packages/six.pytreraises   cB@sc|dkrBejd}|j}|dkr<|j}n~n|dkrW|}nddUdS(sExecute code in a namespace.isexec _code_ in _globs_, _locs_N(RR t _getframet f_globalstf_locals(t_code_t_globs_t_locs_tframe((s'/usr/lib/python2.7/site-packages/six.pytexec_s      s9def reraise(tp, value, tb=None): raise tp, value, tb srdef raise_from(value, from_value): if from_value is None: raise value raise value from from_value sCdef raise_from(value, from_value): raise value from from_value cC@s |dS(N((R%t from_value((s'/usr/lib/python2.7/site-packages/six.pyt raise_fromstprintc @s|jdtjdkr%dSfd}t}|jdd}|dk rt|trpt}qt|tst dqn|jdd}|dk rt|trt}qt|tst dqn|rt dn|s0x*|D]}t|tr t}Pq q Wn|rQtd }td }n d }d }|dkrr|}n|dkr|}nx7t |D])\} }| r||n||qW||dS( s4The new-style print function for Python 2.4 and 2.5.tfileNc@st|tst|}nttrt|trjdk rtdd}|dkrrd}n|jj|}nj |dS(Nterrorststrict( R?t basestringtstrR]R>tencodingRR"R1twrite(tdataR^(tfp(s'/usr/lib/python2.7/site-packages/six.pyRcs  tsepssep must be None or a stringtendsend must be None or a strings$invalid keyword arguments to print()s t ( tpopR tstdoutRtFalseR?R>tTrueRat TypeErrort enumerate( RIRJRct want_unicodeRfRgtargtnewlinetspaceR6((Res'/usr/lib/python2.7/site-packages/six.pytprint_sL              cO@sW|jdtj}|jdt}t|||rS|dk rS|jndS(NR]tflush(tgetR RjRiRkt_printRRt(RIRJReRt((s'/usr/lib/python2.7/site-packages/six.pyRss  sReraise an exception.ic@sfd}|S(Nc@s(tj|}|_|S(N(R]twrapst __wrapped__(tf(tassignedtupdatedtwrapped(s'/usr/lib/python2.7/site-packages/six.pytwrappers ((R|RzR{R}((RzR{R|s'/usr/lib/python2.7/site-packages/six.pyRwsc@s5dffdY}tj|ddiS(s%Create a base class with a metaclass.t metaclassc@seZfdZRS(c@s||S(N((tclsRt this_basesR%(tbasestmeta(s'/usr/lib/python2.7/site-packages/six.pyt__new__ s(RRR((RR(s'/usr/lib/python2.7/site-packages/six.pyR~sttemporary_class((RR(RRR~((RRs'/usr/lib/python2.7/site-packages/six.pytwith_metaclasssc@sfd}|S(s6Class decorator for creating a class with a metaclass.c@s|jj}|jd}|dk rft|trE|g}nx|D]}|j|qLWn|jdd|jdd|j|j|S(Nt __slots__Rt __weakref__( RtcopyRuRR?RaRiRt __bases__(Rt orig_varstslotst slots_var(R~(s'/usr/lib/python2.7/site-packages/six.pyR}s   ((R~R}((R~s'/usr/lib/python2.7/site-packages/six.pyt add_metaclasss cC@sJtrFd|jkr+td|jn|j|_d|_n|S(s A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. t__str__sY@python_2_unicode_compatible cannot be applied to %s because it doesn't define __str__().cS@s|jjdS(Nsutf-8(t __unicode__R1(R((s'/usr/lib/python2.7/site-packages/six.pyt,s(tPY2Rt ValueErrorRRR(R((s'/usr/lib/python2.7/site-packages/six.pytpython_2_unicode_compatibles t__spec__IiIill(ii(ii(ii(ii(Rt __future__RR]RLtoperatorR Rt __author__t __version__t version_infoRRRat string_typestintt integer_typesRt class_typest text_typeR5t binary_typetmaxsizetMAXSIZER`tlongt ClassTypeR>tplatformt startswithtobjectRtlent OverflowErrorR RRRt ModuleTypeR'R+R1RRRGR(R#RRR?R7RRt_urllib_parse_moved_attributesRt_urllib_error_moved_attributesRt _urllib_request_moved_attributesRt!_urllib_response_moved_attributesRt$_urllib_robotparser_moved_attributesRRRt _meth_funct _meth_selft _func_closuret _func_codet_func_defaultst _func_globalsRRt NameErrorRRRR R!t attrgettertget_method_functiontget_method_selftget_function_closuretget_function_codetget_function_defaultstget_function_globalsR'R)R+R-t methodcallerR.R/R0R3R4tchrtunichrR7t itemgetterRBtgetitemRDR#t iterbytesRIRJtBytesIORHRKRLtpartialRVR@R:R;R<R"RMRYRRQR[RsRvtWRAPPER_ASSIGNMENTStWRAPPER_UPDATESRwRRRRBt __package__tglobalsRuRtsubmodule_search_locationst meta_pathRnR6timportertappend(((s'/usr/lib/python2.7/site-packages/six.pyts               <                                                                              4         PK[/m site-packages/iniparse/utils.pycnu[ JKc@s8ddlZddlmZmZdZdZdS(iN(t LineContainert EmptyLinecCs t|tjr|j}n|jj}d}x|t|krt||trst|||d7}q3t||dt rt||t r||=q3|d7}q3W|rt|dt r|d=n|rt|dt  r|j t ndS(sClean up blank lines. This functions makes the configuration look clean and handwritten - consecutive empty lines and empty lines at the start of the file are removed, and one is guaranteed to be at the end of the file. iiiN( t isinstancetcompattRawConfigParsertdatat_datatcontentstlenRt tidy_sectionRtappend(tcfgtcontti((s2/usr/lib/python2.7/site-packages/iniparse/utils.pyttidys      cCs|j}d}xT|t|kret||dtrXt||trX||=q|d7}qWt|dkrt|dtr|d=ndS(Ni(RRRR(tlcR R ((s2/usr/lib/python2.7/site-packages/iniparse/utils.pyR #s  %(RtiniRRRR (((s2/usr/lib/python2.7/site-packages/iniparse/utils.pyts  PK[V#site-packages/iniparse/__init__.pycnu[ JKc@sddlmZmZddlmZmZddlmZmZm Z ddl m Z ddlm Z m Z mZmZmZmZmZmZdddd d d d d ddddddddgZdS(i(t INIConfigtchange_comment_syntax(t BasicConfigtConfigNamespace(tRawConfigParsert ConfigParsertSafeConfigParser(ttidy(tDuplicateSectionErrortNoSectionErrort NoOptionErrortInterpolationMissingOptionErrortInterpolationDepthErrortInterpolationSyntaxErrort DEFAULTSECTtMAX_INTERPOLATION_DEPTHRRRRRRRRRR R R R R RRN(tiniRRtconfigRRtcompatRRRtutilsRRR R R R R RRt__all__(((s5/usr/lib/python2.7/site-packages/iniparse/__init__.pyts:   PK[UWW"site-packages/iniparse/__init__.pynu[# Copyright (c) 2001, 2002, 2003 Python Software Foundation # Copyright (c) 2004-2008 Paramjit Oberoi # Copyright (c) 2007 Tim Lauridsen # All Rights Reserved. See LICENSE-PSF & LICENSE for details. from ini import INIConfig, change_comment_syntax from config import BasicConfig, ConfigNamespace from compat import RawConfigParser, ConfigParser, SafeConfigParser from utils import tidy from ConfigParser import DuplicateSectionError, \ NoSectionError, NoOptionError, \ InterpolationMissingOptionError, \ InterpolationDepthError, \ InterpolationSyntaxError, \ DEFAULTSECT, MAX_INTERPOLATION_DEPTH __all__ = [ 'BasicConfig', 'ConfigNamespace', 'INIConfig', 'tidy', 'change_comment_syntax', 'RawConfigParser', 'ConfigParser', 'SafeConfigParser', 'DuplicateSectionError', 'NoSectionError', 'NoOptionError', 'InterpolationMissingOptionError', 'InterpolationDepthError', 'InterpolationSyntaxError', 'DEFAULTSECT', 'MAX_INTERPOLATION_DEPTH', ] PK[ a %%!site-packages/iniparse/config.pyonu[ Kc@sOdefdYZdefdYZdefdYZdZdS(tConfigNamespacecBsqeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z RS( sAbstract class representing the interface of Config objects. A ConfigNamespace is a collection of names mapped to values, where the values may be nested namespaces. Values can be accessed via container notation - obj[key] - or via dotted notation - obj.key. Both these access methods are equivalent. To minimize name conflicts between namespace keys and class members, the number of class members should be minimized, and the names of all class members should start with an underscore. Subclasses must implement the methods for container-like access, and this class will automatically provide dotted access. cCs t|S(N(tNotImplementedError(tselftkey((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt_getitemscCst||dS(N(R(RRtvalue((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __setitem__scCst|dS(N(R(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __delitem__scCstS(N(R(R((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt__iter__scCst|dS(N(R(Rtname((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt_new_namespace scCs*y|j|Wntk r%tSXtS(N(RtKeyErrortFalsetTrue(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __contains__#s  cCs3y|j|SWntk r.t||SXdS(N(RR t Undefined(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __getitem__6s cCsZy|j|SWnBtk rU|jdrH|jdrHtnt||SXdS(Nt__(RR t startswithtendswithtAttributeErrorR(RR ((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __getattr__<s   cCsOy'tj||tj|||Wn!tk rJ|j||nXdS(N(tobjectt__getattribute__t __setattr__RR(RR R((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRDs  cCsIy$tj||tj||Wntk rD|j|nXdS(N(RRt __delattr__RR(RR ((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRKs  cCs|jj|dS(N(t__dict__tupdate(Rtstate((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __setstate__Vs(t__name__t __module__t__doc__RRRRR RRRRRR(((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRs          RcBs)eZdZdZdZdZRS(sHelper class used to hold undefined names until assignment. This class helps create any undefined subsections when an assignment is made to a nested value. For example, if the statement is "cfg.a.b.c = 42", but "cfg.a.b" does not exist yet. cCs*tj|d|tj|d|dS(NR t namespace(RR(RR R!((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt__init__ascCs#|jj|j}|||>> n = BasicConfig() >>> n.x = 7 >>> n.name.first = 'paramjit' >>> n.name.last = 'oberoi' ...and accessed the same way, or with [...]: >>> n.x 7 >>> n.name.first 'paramjit' >>> n.name.last 'oberoi' >>> n['x'] 7 >>> n['name']['first'] 'paramjit' Iterating over the namespace object returns the keys: >>> l = list(n) >>> l.sort() >>> l ['name', 'x'] Values can be deleted using 'del' and printed using 'print'. >>> n.aaa = 42 >>> del n.x >>> print n aaa = 42 name.first = paramjit name.last = oberoi Nested namepsaces are also namespaces: >>> isinstance(n.name, ConfigNamespace) True >>> print n.name first = paramjit last = oberoi >>> sorted(list(n.name)) ['first', 'last'] Finally, values can be read from a file as follows: >>> from StringIO import StringIO >>> sio = StringIO(''' ... # comment ... ui.height = 100 ... ui.width = 150 ... complexity = medium ... have_python ... data.secret.password = goodness=gracious me ... ''') >>> n = BasicConfig() >>> n._readfp(sio) >>> print n complexity = medium data.secret.password = goodness=gracious me have_python ui.height = 100 ui.width = 150 cCs i|_dS(N(t_data(R((s3/usr/lib/python2.7/site-packages/iniparse/config.pyR"scCs |j|S(N(R%(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRscCs||j| ConfigNamespace and inserts values into the ConfigNamespace. For example: >>> n = BasicConfig() >>> n.playlist.expand_playlist = True >>> n.ui.display_clock = True >>> n.ui.display_qlength = True >>> n.ui.width = 150 >>> print n playlist.expand_playlist = True ui.display_clock = True ui.display_qlength = True ui.width = 150 >>> from iniparse import ini >>> i = ini.INIConfig() >>> update_config(i, n) >>> print i [playlist] expand_playlist = True [ui] display_clock = True display_qlength = True width = 150 svalue-namespace conflictN(R+RR8R t update_config(ttargettsourceR Rtmyns((s3/usr/lib/python2.7/site-packages/iniparse/config.pyR@s    N(RRRR$R@(((s3/usr/lib/python2.7/site-packages/iniparse/config.pytsXPK[-PPsite-packages/iniparse/ini.pynu["""Access and/or modify INI files * Compatiable with ConfigParser * Preserves order of sections & options * Preserves comments/blank lines/etc * More conveninet access to data Example: >>> from StringIO import StringIO >>> sio = StringIO('''# configure foo-application ... [foo] ... bar1 = qualia ... bar2 = 1977 ... [foo-ext] ... special = 1''') >>> cfg = INIConfig(sio) >>> print cfg.foo.bar1 qualia >>> print cfg['foo-ext'].special 1 >>> cfg.foo.newopt = 'hi!' >>> cfg.baz.enabled = 0 >>> print cfg # configure foo-application [foo] bar1 = qualia bar2 = 1977 newopt = hi! [foo-ext] special = 1 [baz] enabled = 0 """ # An ini parser that supports ordered sections/options # Also supports updates, while preserving structure # Backward-compatiable with ConfigParser import re from ConfigParser import DEFAULTSECT, ParsingError, MissingSectionHeaderError import config class LineType(object): line = None def __init__(self, line=None): if line is not None: self.line = line.strip('\n') # Return the original line for unmodified objects # Otherwise construct using the current attribute values def __str__(self): if self.line is not None: return self.line else: return self.to_string() # If an attribute is modified after initialization # set line to None since it is no longer accurate. def __setattr__(self, name, value): if hasattr(self,name): self.__dict__['line'] = None self.__dict__[name] = value def to_string(self): raise Exception('This method must be overridden in derived classes') class SectionLine(LineType): regex = re.compile(r'^\[' r'(?P[^]]+)' r'\]\s*' r'((?P;|#)(?P.*))?$') def __init__(self, name, comment=None, comment_separator=None, comment_offset=-1, line=None): super(SectionLine, self).__init__(line) self.name = name self.comment = comment self.comment_separator = comment_separator self.comment_offset = comment_offset def to_string(self): out = '[' + self.name + ']' if self.comment is not None: # try to preserve indentation of comments out = (out+' ').ljust(self.comment_offset) out = out + self.comment_separator + self.comment return out def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None return cls(m.group('name'), m.group('comment'), m.group('csep'), m.start('csep'), line) parse = classmethod(parse) class OptionLine(LineType): def __init__(self, name, value, separator=' = ', comment=None, comment_separator=None, comment_offset=-1, line=None): super(OptionLine, self).__init__(line) self.name = name self.value = value self.separator = separator self.comment = comment self.comment_separator = comment_separator self.comment_offset = comment_offset def to_string(self): out = '%s%s%s' % (self.name, self.separator, self.value) if self.comment is not None: # try to preserve indentation of comments out = (out+' ').ljust(self.comment_offset) out = out + self.comment_separator + self.comment return out regex = re.compile(r'^(?P[^:=\s[][^:=]*)' r'(?P[:=]\s*)' r'(?P.*)$') def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None name = m.group('name').rstrip() value = m.group('value') sep = m.group('name')[len(name):] + m.group('sep') # comments are not detected in the regex because # ensuring total compatibility with ConfigParser # requires that: # option = value ;comment // value=='value' # option = value;1 ;comment // value=='value;1 ;comment' # # Doing this in a regex would be complicated. I # think this is a bug. The whole issue of how to # include ';' in the value needs to be addressed. # Also, '#' doesn't mark comments in options... coff = value.find(';') if coff != -1 and value[coff-1].isspace(): comment = value[coff+1:] csep = value[coff] value = value[:coff].rstrip() coff = m.start('value') + coff else: comment = None csep = None coff = -1 return cls(name, value, sep, comment, csep, coff, line) parse = classmethod(parse) def change_comment_syntax(comment_chars='%;#', allow_rem=False): comment_chars = re.sub(r'([\]\-\^])', r'\\\1', comment_chars) regex = r'^(?P[%s]' % comment_chars if allow_rem: regex += '|[rR][eE][mM]' regex += r')(?P.*)$' CommentLine.regex = re.compile(regex) class CommentLine(LineType): regex = re.compile(r'^(?P[;#]|[rR][eE][mM] +)' r'(?P.*)$') def __init__(self, comment='', separator='#', line=None): super(CommentLine, self).__init__(line) self.comment = comment self.separator = separator def to_string(self): return self.separator + self.comment def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None return cls(m.group('comment'), m.group('csep'), line) parse = classmethod(parse) class EmptyLine(LineType): # could make this a singleton def to_string(self): return '' value = property(lambda _: '') def parse(cls, line): if line.strip(): return None return cls(line) parse = classmethod(parse) class ContinuationLine(LineType): regex = re.compile(r'^\s+(?P.*)$') def __init__(self, value, value_offset=None, line=None): super(ContinuationLine, self).__init__(line) self.value = value if value_offset is None: value_offset = 8 self.value_offset = value_offset def to_string(self): return ' '*self.value_offset + self.value def parse(cls, line): m = cls.regex.match(line.rstrip()) if m is None: return None return cls(m.group('value'), m.start('value'), line) parse = classmethod(parse) class LineContainer(object): def __init__(self, d=None): self.contents = [] self.orgvalue = None if d: if isinstance(d, list): self.extend(d) else: self.add(d) def add(self, x): self.contents.append(x) def extend(self, x): for i in x: self.add(i) def get_name(self): return self.contents[0].name def set_name(self, data): self.contents[0].name = data def get_value(self): if self.orgvalue is not None: return self.orgvalue elif len(self.contents) == 1: return self.contents[0].value else: return '\n'.join([('%s' % x.value) for x in self.contents if not isinstance(x, CommentLine)]) def set_value(self, data): self.orgvalue = data lines = ('%s' % data).split('\n') # If there is an existing ContinuationLine, use its offset value_offset = None for v in self.contents: if isinstance(v, ContinuationLine): value_offset = v.value_offset break # Rebuild contents list, preserving initial OptionLine self.contents = self.contents[0:1] self.contents[0].value = lines[0] del lines[0] for line in lines: if line.strip(): self.add(ContinuationLine(line, value_offset)) else: self.add(EmptyLine()) name = property(get_name, set_name) value = property(get_value, set_value) def __str__(self): s = [x.__str__() for x in self.contents] return '\n'.join(s) def finditer(self, key): for x in self.contents[::-1]: if hasattr(x, 'name') and x.name==key: yield x def find(self, key): for x in self.finditer(key): return x raise KeyError(key) def _make_xform_property(myattrname, srcattrname=None): private_attrname = myattrname + 'value' private_srcname = myattrname + 'source' if srcattrname is None: srcattrname = myattrname def getfn(self): srcobj = getattr(self, private_srcname) if srcobj is not None: return getattr(srcobj, srcattrname) else: return getattr(self, private_attrname) def setfn(self, value): srcobj = getattr(self, private_srcname) if srcobj is not None: setattr(srcobj, srcattrname, value) else: setattr(self, private_attrname, value) return property(getfn, setfn) class INISection(config.ConfigNamespace): _lines = None _options = None _defaults = None _optionxformvalue = None _optionxformsource = None _compat_skip_empty_lines = set() def __init__(self, lineobj, defaults = None, optionxformvalue=None, optionxformsource=None): self._lines = [lineobj] self._defaults = defaults self._optionxformvalue = optionxformvalue self._optionxformsource = optionxformsource self._options = {} _optionxform = _make_xform_property('_optionxform') def _compat_get(self, key): # identical to __getitem__ except that _compat_XXX # is checked for backward-compatible handling if key == '__name__': return self._lines[-1].name if self._optionxform: key = self._optionxform(key) try: value = self._options[key].value del_empty = key in self._compat_skip_empty_lines except KeyError: if self._defaults and key in self._defaults._options: value = self._defaults._options[key].value del_empty = key in self._defaults._compat_skip_empty_lines else: raise if del_empty: value = re.sub('\n+', '\n', value) return value def _getitem(self, key): if key == '__name__': return self._lines[-1].name if self._optionxform: key = self._optionxform(key) try: return self._options[key].value except KeyError: if self._defaults and key in self._defaults._options: return self._defaults._options[key].value else: raise def __setitem__(self, key, value): if self._optionxform: xkey = self._optionxform(key) else: xkey = key if xkey in self._compat_skip_empty_lines: self._compat_skip_empty_lines.remove(xkey) if xkey not in self._options: # create a dummy object - value may have multiple lines obj = LineContainer(OptionLine(key, '')) self._lines[-1].add(obj) self._options[xkey] = obj # the set_value() function in LineContainer # automatically handles multi-line values self._options[xkey].value = value def __delitem__(self, key): if self._optionxform: key = self._optionxform(key) if key in self._compat_skip_empty_lines: self._compat_skip_empty_lines.remove(key) for l in self._lines: remaining = [] for o in l.contents: if isinstance(o, LineContainer): n = o.name if self._optionxform: n = self._optionxform(n) if key != n: remaining.append(o) else: remaining.append(o) l.contents = remaining del self._options[key] def __iter__(self): d = set() for l in self._lines: for x in l.contents: if isinstance(x, LineContainer): if self._optionxform: ans = self._optionxform(x.name) else: ans = x.name if ans not in d: yield ans d.add(ans) if self._defaults: for x in self._defaults: if x not in d: yield x d.add(x) def _new_namespace(self, name): raise Exception('No sub-sections allowed', name) def make_comment(line): return CommentLine(line.rstrip('\n')) def readline_iterator(f): """iterate over a file by only using the file object's readline method""" have_newline = False while True: line = f.readline() if not line: if have_newline: yield "" return if line.endswith('\n'): have_newline = True else: have_newline = False yield line def lower(x): return x.lower() class INIConfig(config.ConfigNamespace): _data = None _sections = None _defaults = None _optionxformvalue = None _optionxformsource = None _sectionxformvalue = None _sectionxformsource = None _parse_exc = None _bom = False def __init__(self, fp=None, defaults=None, parse_exc=True, optionxformvalue=lower, optionxformsource=None, sectionxformvalue=None, sectionxformsource=None): self._data = LineContainer() self._parse_exc = parse_exc self._optionxformvalue = optionxformvalue self._optionxformsource = optionxformsource self._sectionxformvalue = sectionxformvalue self._sectionxformsource = sectionxformsource self._sections = {} if defaults is None: defaults = {} self._defaults = INISection(LineContainer(), optionxformsource=self) for name, value in defaults.iteritems(): self._defaults[name] = value if fp is not None: self._readfp(fp) _optionxform = _make_xform_property('_optionxform', 'optionxform') _sectionxform = _make_xform_property('_sectionxform', 'optionxform') def _getitem(self, key): if key == DEFAULTSECT: return self._defaults if self._sectionxform: key = self._sectionxform(key) return self._sections[key] def __setitem__(self, key, value): raise Exception('Values must be inside sections', key, value) def __delitem__(self, key): if self._sectionxform: key = self._sectionxform(key) for line in self._sections[key]._lines: self._data.contents.remove(line) del self._sections[key] def __iter__(self): d = set() d.add(DEFAULTSECT) for x in self._data.contents: if isinstance(x, LineContainer): if x.name not in d: yield x.name d.add(x.name) def _new_namespace(self, name): if self._data.contents: self._data.add(EmptyLine()) obj = LineContainer(SectionLine(name)) self._data.add(obj) if self._sectionxform: name = self._sectionxform(name) if name in self._sections: ns = self._sections[name] ns._lines.append(obj) else: ns = INISection(obj, defaults=self._defaults, optionxformsource=self) self._sections[name] = ns return ns def __str__(self): if self._bom: fmt = u'\ufeff%s' else: fmt = '%s' return fmt % self._data.__str__() __unicode__ = __str__ _line_types = [EmptyLine, CommentLine, SectionLine, OptionLine, ContinuationLine] def _parse(self, line): for linetype in self._line_types: lineobj = linetype.parse(line) if lineobj: return lineobj else: # can't parse line return None def _readfp(self, fp): cur_section = None cur_option = None cur_section_name = None cur_option_name = None pending_lines = [] pending_empty_lines = False try: fname = fp.name except AttributeError: fname = '' linecount = 0 exc = None line = None for line in readline_iterator(fp): # Check for BOM on first line if linecount == 0 and isinstance(line, unicode): if line[0] == u'\ufeff': line = line[1:] self._bom = True lineobj = self._parse(line) linecount += 1 if not cur_section and not isinstance(lineobj, (CommentLine, EmptyLine, SectionLine)): if self._parse_exc: raise MissingSectionHeaderError(fname, linecount, line) else: lineobj = make_comment(line) if lineobj is None: if self._parse_exc: if exc is None: exc = ParsingError(fname) exc.append(linecount, line) lineobj = make_comment(line) if isinstance(lineobj, ContinuationLine): if cur_option: if pending_lines: cur_option.extend(pending_lines) pending_lines = [] if pending_empty_lines: optobj._compat_skip_empty_lines.add(cur_option_name) pending_empty_lines = False cur_option.add(lineobj) else: # illegal continuation line - convert to comment if self._parse_exc: if exc is None: exc = ParsingError(fname) exc.append(linecount, line) lineobj = make_comment(line) if isinstance(lineobj, OptionLine): if pending_lines: cur_section.extend(pending_lines) pending_lines = [] pending_empty_lines = False cur_option = LineContainer(lineobj) cur_section.add(cur_option) if self._optionxform: cur_option_name = self._optionxform(cur_option.name) else: cur_option_name = cur_option.name if cur_section_name == DEFAULTSECT: optobj = self._defaults else: optobj = self._sections[cur_section_name] optobj._options[cur_option_name] = cur_option if isinstance(lineobj, SectionLine): self._data.extend(pending_lines) pending_lines = [] pending_empty_lines = False cur_section = LineContainer(lineobj) self._data.add(cur_section) cur_option = None cur_option_name = None if cur_section.name == DEFAULTSECT: self._defaults._lines.append(cur_section) cur_section_name = DEFAULTSECT else: if self._sectionxform: cur_section_name = self._sectionxform(cur_section.name) else: cur_section_name = cur_section.name if cur_section_name not in self._sections: self._sections[cur_section_name] = \ INISection(cur_section, defaults=self._defaults, optionxformsource=self) else: self._sections[cur_section_name]._lines.append(cur_section) if isinstance(lineobj, (CommentLine, EmptyLine)): pending_lines.append(lineobj) if isinstance(lineobj, EmptyLine): pending_empty_lines = True self._data.extend(pending_lines) if line and line[-1]=='\n': self._data.add(EmptyLine()) if exc: raise exc PK[V#site-packages/iniparse/__init__.pyonu[ JKc@sddlmZmZddlmZmZddlmZmZm Z ddl m Z ddlm Z m Z mZmZmZmZmZmZdddd d d d d ddddddddgZdS(i(t INIConfigtchange_comment_syntax(t BasicConfigtConfigNamespace(tRawConfigParsert ConfigParsertSafeConfigParser(ttidy(tDuplicateSectionErrortNoSectionErrort NoOptionErrortInterpolationMissingOptionErrortInterpolationDepthErrortInterpolationSyntaxErrort DEFAULTSECTtMAX_INTERPOLATION_DEPTHRRRRRRRRRR R R R R RRN(tiniRRtconfigRRtcompatRRRtutilsRRR R R R R RRt__all__(((s5/usr/lib/python2.7/site-packages/iniparse/__init__.pyts:   PK[0.2.2!site-packages/iniparse/compat.pyonu[ Kc@sdZddlZddlmZmZmZmZmZmZm Z m Z ddlm Z m Z m Z mZddlZdefdYZdefdYZd efd YZd efd YZdS( s(Compatibility interfaces for ConfigParser Interfaces of ConfigParser, RawConfigParser and SafeConfigParser should be completely identical to the Python standard library versions. Tested with the unit tests included with Python-2.3.4 The underlying INIConfig object can be accessed as cfg.data iN(tDuplicateSectionErrortNoSectionErrort NoOptionErrortInterpolationMissingOptionErrortInterpolationDepthErrortInterpolationSyntaxErrort DEFAULTSECTtMAX_INTERPOLATION_DEPTH(tErrortInterpolationErrortMissingSectionHeaderErrort ParsingErrortRawConfigParsercBseZdedZdZdZdZdZdZ dZ dZ ddZ dd Z d Zd Zd Zied 6ed6ed6ed6ed6ed6ed6ed6ZdZdZdZdZdZdZRS(cCs:|tkrtdntjd|d||_dS(NsCustom dict types not supportedtdefaultstoptionxformsource(tdictt ValueErrortinit INIConfigtdata(tselfR t dict_type((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt__init__s cCs |jS(N(tlower(Rt optionstr((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt optionxform#scCs=i}|jj}x$|jD]}|j|||' is used. N(RR-(RR2R1((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytreadfpgscCs||j|st|n|dk rC||krC||}n|j|}||kri|j|St||dS(N(R#RtNoneRRR(RR%toptiontvarstvaluetsec((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytgetqs    cCs`||jkrPg}x4|j|D]%}|j||j||fq#W|St|dS(N(RR,R:R(RR%tanstopt((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytitems}s #cCst|j||S(N(tintR:(RR%R6((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytgetintscCst|j||S(N(tfloatR:(RR%R6((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytgetfloatst1tyesttruetont0tnotfalsetoffcCsH|j||}|j|jkr7td|n|j|jS(NsNot a boolean: %s(R:Rt_boolean_statesR(RR%R6tv((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt getbooleanscCs5||jkr|j|}n t|||kS(s=Check for the existence of a given option in a given section.(RR(RR%R6R9((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt has_options cCs3||jkr#||j|| s : " NPK[ a %%!site-packages/iniparse/config.pycnu[ Kc@sOdefdYZdefdYZdefdYZdZdS(tConfigNamespacecBsqeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z RS( sAbstract class representing the interface of Config objects. A ConfigNamespace is a collection of names mapped to values, where the values may be nested namespaces. Values can be accessed via container notation - obj[key] - or via dotted notation - obj.key. Both these access methods are equivalent. To minimize name conflicts between namespace keys and class members, the number of class members should be minimized, and the names of all class members should start with an underscore. Subclasses must implement the methods for container-like access, and this class will automatically provide dotted access. cCs t|S(N(tNotImplementedError(tselftkey((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt_getitemscCst||dS(N(R(RRtvalue((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __setitem__scCst|dS(N(R(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __delitem__scCstS(N(R(R((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt__iter__scCst|dS(N(R(Rtname((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt_new_namespace scCs*y|j|Wntk r%tSXtS(N(RtKeyErrortFalsetTrue(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __contains__#s  cCs3y|j|SWntk r.t||SXdS(N(RR t Undefined(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __getitem__6s cCsZy|j|SWnBtk rU|jdrH|jdrHtnt||SXdS(Nt__(RR t startswithtendswithtAttributeErrorR(RR ((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __getattr__<s   cCsOy'tj||tj|||Wn!tk rJ|j||nXdS(N(tobjectt__getattribute__t __setattr__RR(RR R((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRDs  cCsIy$tj||tj||Wntk rD|j|nXdS(N(RRt __delattr__RR(RR ((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRKs  cCs|jj|dS(N(t__dict__tupdate(Rtstate((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt __setstate__Vs(t__name__t __module__t__doc__RRRRR RRRRRR(((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRs          RcBs)eZdZdZdZdZRS(sHelper class used to hold undefined names until assignment. This class helps create any undefined subsections when an assignment is made to a nested value. For example, if the statement is "cfg.a.b.c = 42", but "cfg.a.b" does not exist yet. cCs*tj|d|tj|d|dS(NR t namespace(RR(RR R!((s3/usr/lib/python2.7/site-packages/iniparse/config.pyt__init__ascCs#|jj|j}|||>> n = BasicConfig() >>> n.x = 7 >>> n.name.first = 'paramjit' >>> n.name.last = 'oberoi' ...and accessed the same way, or with [...]: >>> n.x 7 >>> n.name.first 'paramjit' >>> n.name.last 'oberoi' >>> n['x'] 7 >>> n['name']['first'] 'paramjit' Iterating over the namespace object returns the keys: >>> l = list(n) >>> l.sort() >>> l ['name', 'x'] Values can be deleted using 'del' and printed using 'print'. >>> n.aaa = 42 >>> del n.x >>> print n aaa = 42 name.first = paramjit name.last = oberoi Nested namepsaces are also namespaces: >>> isinstance(n.name, ConfigNamespace) True >>> print n.name first = paramjit last = oberoi >>> sorted(list(n.name)) ['first', 'last'] Finally, values can be read from a file as follows: >>> from StringIO import StringIO >>> sio = StringIO(''' ... # comment ... ui.height = 100 ... ui.width = 150 ... complexity = medium ... have_python ... data.secret.password = goodness=gracious me ... ''') >>> n = BasicConfig() >>> n._readfp(sio) >>> print n complexity = medium data.secret.password = goodness=gracious me have_python ui.height = 100 ui.width = 150 cCs i|_dS(N(t_data(R((s3/usr/lib/python2.7/site-packages/iniparse/config.pyR"scCs |j|S(N(R%(RR((s3/usr/lib/python2.7/site-packages/iniparse/config.pyRscCs||j| ConfigNamespace and inserts values into the ConfigNamespace. For example: >>> n = BasicConfig() >>> n.playlist.expand_playlist = True >>> n.ui.display_clock = True >>> n.ui.display_qlength = True >>> n.ui.width = 150 >>> print n playlist.expand_playlist = True ui.display_clock = True ui.display_qlength = True ui.width = 150 >>> from iniparse import ini >>> i = ini.INIConfig() >>> update_config(i, n) >>> print i [playlist] expand_playlist = True [ui] display_clock = True display_qlength = True width = 150 svalue-namespace conflictN(R+RR8R t update_config(ttargettsourceR Rtmyns((s3/usr/lib/python2.7/site-packages/iniparse/config.pyR@s    N(RRRR$R@(((s3/usr/lib/python2.7/site-packages/iniparse/config.pytsXPK[js s site-packages/iniparse/config.pynu[class ConfigNamespace(object): """Abstract class representing the interface of Config objects. A ConfigNamespace is a collection of names mapped to values, where the values may be nested namespaces. Values can be accessed via container notation - obj[key] - or via dotted notation - obj.key. Both these access methods are equivalent. To minimize name conflicts between namespace keys and class members, the number of class members should be minimized, and the names of all class members should start with an underscore. Subclasses must implement the methods for container-like access, and this class will automatically provide dotted access. """ # Methods that must be implemented by subclasses def _getitem(self, key): return NotImplementedError(key) def __setitem__(self, key, value): raise NotImplementedError(key, value) def __delitem__(self, key): raise NotImplementedError(key) def __iter__(self): return NotImplementedError() def _new_namespace(self, name): raise NotImplementedError(name) def __contains__(self, key): try: self._getitem(key) except KeyError: return False return True # Machinery for converting dotted access into container access, # and automatically creating new sections/namespaces. # # To distinguish between accesses of class members and namespace # keys, we first call object.__getattribute__(). If that succeeds, # the name is assumed to be a class member. Otherwise it is # treated as a namespace key. # # Therefore, member variables should be defined in the class, # not just in the __init__() function. See BasicNamespace for # an example. def __getitem__(self, key): try: return self._getitem(key) except KeyError: return Undefined(key, self) def __getattr__(self, name): try: return self._getitem(name) except KeyError: if name.startswith('__') and name.endswith('__'): raise AttributeError return Undefined(name, self) def __setattr__(self, name, value): try: object.__getattribute__(self, name) object.__setattr__(self, name, value) except AttributeError: self.__setitem__(name, value) def __delattr__(self, name): try: object.__getattribute__(self, name) object.__delattr__(self, name) except AttributeError: self.__delitem__(name) # During unpickling, Python checks if the class has a __setstate__ # method. But, the data dicts have not been initialised yet, which # leads to _getitem and hence __getattr__ raising an exception. So # we explicitly impement default __setstate__ behavior. def __setstate__(self, state): self.__dict__.update(state) class Undefined(object): """Helper class used to hold undefined names until assignment. This class helps create any undefined subsections when an assignment is made to a nested value. For example, if the statement is "cfg.a.b.c = 42", but "cfg.a.b" does not exist yet. """ def __init__(self, name, namespace): object.__setattr__(self, 'name', name) object.__setattr__(self, 'namespace', namespace) def __setattr__(self, name, value): obj = self.namespace._new_namespace(self.name) obj[name] = value def __setitem__(self, name, value): obj = self.namespace._new_namespace(self.name) obj[name] = value # ---- Basic implementation of a ConfigNamespace class BasicConfig(ConfigNamespace): """Represents a hierarchical collection of named values. Values are added using dotted notation: >>> n = BasicConfig() >>> n.x = 7 >>> n.name.first = 'paramjit' >>> n.name.last = 'oberoi' ...and accessed the same way, or with [...]: >>> n.x 7 >>> n.name.first 'paramjit' >>> n.name.last 'oberoi' >>> n['x'] 7 >>> n['name']['first'] 'paramjit' Iterating over the namespace object returns the keys: >>> l = list(n) >>> l.sort() >>> l ['name', 'x'] Values can be deleted using 'del' and printed using 'print'. >>> n.aaa = 42 >>> del n.x >>> print n aaa = 42 name.first = paramjit name.last = oberoi Nested namepsaces are also namespaces: >>> isinstance(n.name, ConfigNamespace) True >>> print n.name first = paramjit last = oberoi >>> sorted(list(n.name)) ['first', 'last'] Finally, values can be read from a file as follows: >>> from StringIO import StringIO >>> sio = StringIO(''' ... # comment ... ui.height = 100 ... ui.width = 150 ... complexity = medium ... have_python ... data.secret.password = goodness=gracious me ... ''') >>> n = BasicConfig() >>> n._readfp(sio) >>> print n complexity = medium data.secret.password = goodness=gracious me have_python ui.height = 100 ui.width = 150 """ # this makes sure that __setattr__ knows this is not a namespace key _data = None def __init__(self): self._data = {} def _getitem(self, key): return self._data[key] def __setitem__(self, key, value): self._data[key] = value def __delitem__(self, key): del self._data[key] def __iter__(self): return iter(self._data) def __str__(self, prefix=''): lines = [] keys = self._data.keys() keys.sort() for name in keys: value = self._data[name] if isinstance(value, ConfigNamespace): lines.append(value.__str__(prefix='%s%s.' % (prefix,name))) else: if value is None: lines.append('%s%s' % (prefix, name)) else: lines.append('%s%s = %s' % (prefix, name, value)) return '\n'.join(lines) def _new_namespace(self, name): obj = BasicConfig() self._data[name] = obj return obj def _readfp(self, fp): while True: line = fp.readline() if not line: break line = line.strip() if not line: continue if line[0] == '#': continue data = line.split('=', 1) if len(data) == 1: name = line value = None else: name = data[0].strip() value = data[1].strip() name_components = name.split('.') ns = self for n in name_components[:-1]: if n in ns: ns = ns[n] if not isinstance(ns, ConfigNamespace): raise TypeError('value-namespace conflict', n) else: ns = ns._new_namespace(n) ns[name_components[-1]] = value # ---- Utility functions def update_config(target, source): """Imports values from source into target. Recursively walks the ConfigNamespace and inserts values into the ConfigNamespace. For example: >>> n = BasicConfig() >>> n.playlist.expand_playlist = True >>> n.ui.display_clock = True >>> n.ui.display_qlength = True >>> n.ui.width = 150 >>> print n playlist.expand_playlist = True ui.display_clock = True ui.display_qlength = True ui.width = 150 >>> from iniparse import ini >>> i = ini.INIConfig() >>> update_config(i, n) >>> print i [playlist] expand_playlist = True [ui] display_clock = True display_qlength = True width = 150 """ for name in source: value = source[name] if isinstance(value, ConfigNamespace): if name in target: myns = target[name] if not isinstance(myns, ConfigNamespace): raise TypeError('value-namespace conflict') else: myns = target._new_namespace(name) update_config(myns, value) else: target[name] = value PK[:[OOsite-packages/iniparse/ini.pyonu[ /Sc@s@dZddlZddlmZmZmZddlZdefdYZdefdYZ defd YZ d e d Z d efd YZ defdYZdefdYZdefdYZddZdejfdYZdZdZdZdejfdYZdS(sAccess and/or modify INI files * Compatiable with ConfigParser * Preserves order of sections & options * Preserves comments/blank lines/etc * More conveninet access to data Example: >>> from StringIO import StringIO >>> sio = StringIO('''# configure foo-application ... [foo] ... bar1 = qualia ... bar2 = 1977 ... [foo-ext] ... special = 1''') >>> cfg = INIConfig(sio) >>> print cfg.foo.bar1 qualia >>> print cfg['foo-ext'].special 1 >>> cfg.foo.newopt = 'hi!' >>> cfg.baz.enabled = 0 >>> print cfg # configure foo-application [foo] bar1 = qualia bar2 = 1977 newopt = hi! [foo-ext] special = 1 [baz] enabled = 0 iN(t DEFAULTSECTt ParsingErrortMissingSectionHeaderErrortLineTypecBs5eZdZddZdZdZdZRS(cCs%|dk r!|jd|_ndS(Ns (tNonetstriptline(tselfR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__init__4s cCs$|jdk r|jS|jSdS(N(RRt to_string(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__str__:scCs0t||rd|jd[^]]+)\]\s*((?P;|#)(?P.*))?$icCs>tt|j|||_||_||_||_dS(N(tsuperRRR tcommenttcomment_separatortcomment_offset(RR RRRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRQs    cCsQd|jd}|jdk rM|dj|j}||j|j}n|S(Nt[t]t (R RRtljustRR(Rtout((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR Ys cCsb|jj|j}|dkr(dS||jd|jd|jd|jd|S(NR Rtcsep(tregextmatchtrstripRtgrouptstart(tclsRtm((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytparseas  N( RRtretcompileRRRR R%t classmethod(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRKs   t OptionLinecBsMeZddddddZdZejdZdZe eZRS(s = icCsPtt|j|||_||_||_||_||_||_dS(N( RR)RR Rt separatorRRR(RR RR*RRRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRls     cCs\d|j|j|jf}|jdk rX|dj|j}||j|j}n|S(Ns%s%s%sR(R R*RRRRRR(RR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR vs s7^(?P[^:=\s[][^:=]*)(?P[:=]\s*)(?P.*)$c Cs |jj|j}|dkr(dS|jdj}|jd}|jdt||jd}|jd}|dkr||djr||d}||}|| j}|jd|}nd}d}d}||||||||S(NR Rtsept;ii( RRR RR!tlentfindtisspaceR"( R#RR$R RR+tcoffRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s  &   N( RRRRR R&R'RR%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR)ks   s%;#cCsRtjdd|}d|}|r2|d7}n|d7}tj|t_dS(Ns ([\]\-\^])s\\\1s^(?P[%s]s |[rR][eE][mM]s)(?P.*)$(R&tsubR't CommentLineR(t comment_charst allow_remR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytchange_comment_syntaxs    R2cBsGeZejdZddddZdZdZe eZRS(s.^(?P[;#]|[rR][eE][mM] +)(?P.*)$tt#cCs,tt|j|||_||_dS(N(RR2RRR*(RRR*R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs cCs|j|jS(N(R*R(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR scCsJ|jj|j}|dkr(dS||jd|jd|S(NRR(RRR RR!(R#RR$((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s N( RRR&R'RRRR R%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR2s   t EmptyLinecBs5eZdZedZdZeeZRS(cCsdS(NR6((R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR scCsdS(NR6((t_((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytscCs|jrdS||S(N(RR(R#R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s (RRR tpropertyRR%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR8s  tContinuationLinecBsDeZejdZdddZdZdZe eZRS(s^\s+(?P.*)$cCsAtt|j|||_|dkr4d}n||_dS(Ni(RR<RRRt value_offset(RRR=R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs    cCsd|j|jS(NR(R=R(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR scCsJ|jj|j}|dkr(dS||jd|jd|S(NR(RRR RR!R"(R#RR$((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s N( RRR&R'RRRR R%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR<s   t LineContainercBseZd dZdZdZdZdZdZdZ e eeZ e ee Z dZ dZd ZRS( cCsKg|_d|_|rGt|tr7|j|qG|j|ndS(N(tcontentsRtorgvaluet isinstancetlisttextendtadd(Rtd((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs   cCs|jj|dS(N(R?tappend(Rtx((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRDscCs"x|D]}|j|qWdS(N(RD(RRGti((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRCs cCs|jdjS(Ni(R?R (R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytget_namescCs||jd_dS(Ni(R?R (Rtdata((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytset_namescCsv|jdk r|jSt|jdkr9|jdjSdjg|jD]"}t|tsId|j^qISdS(Niis s%s(R@RR-R?RtjoinRAR2(RRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt get_values cCs||_d|jd}d}x-|jD]"}t|tr,|j}Pq,q,W|jdd!|_|d|jd_|d=xC|D];}|jr|j t||q|j t qWdS(Ns%ss ii( R@tsplitRR?RAR<R=RRRDR8(RRJtlinesR=tvR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt set_values    cCs/g|jD]}|j^q }dj|S(Ns (R?R RL(RRGts((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR s"ccsKxD|jdddD],}t|dr|j|kr|VqqWdS(NiR (R?R R (RtkeyRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytfinditerscCs+x|j|D]}|SWt|dS(N(RTtKeyError(RRSRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR.!sN(RRRRRDRCRIRKRMRQR;R RR RTR.(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR>s        cs`|d|ddkr)|nfd}fd}t||S(NRtsourcecs9t|}|dk r(t|St|SdS(N(tgetattrR(Rtsrcobj(tprivate_attrnametprivate_srcnamet srcattrname(s0/usr/lib/python2.7/site-packages/iniparse/ini.pytgetfn-s  csBt|}|dk r.t||nt||dS(N(RWRtsetattr(RRRX(RYRZR[(s0/usr/lib/python2.7/site-packages/iniparse/ini.pytsetfn4s (RR;(t myattrnameR[R\R^((RYRZR[s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_make_xform_property's    t INISectioncBseZdZdZdZdZdZeZ ddddZ e dZ dZ dZdZdZdZdZRS( cCs4|g|_||_||_||_i|_dS(N(t_linest _defaultst_optionxformvaluet_optionxformsourcet_options(Rtlineobjtdefaultstoptionxformvaluetoptionxformsource((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyREs     t _optionxformcCs|dkr|jdjS|jr5|j|}ny#|j|j}||jk}WnWtk r|jr||jjkr|jj|j}||jjk}qnX|rtj dd|}n|S(NRis +s ( RbR RkRfRt_compat_skip_empty_linesRURcR&R1(RRSRt del_empty((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt _compat_getOs   cCs|dkr|jdjS|jr5|j|}ny|j|jSWn@tk r|jr||jjkr|jj|jSnXdS(NRi(RbR RkRfRRURc(RRS((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_getitembs   cCs|jr|j|}n|}||jkrC|jj|n||jkrtt|d}|jdj|||j|R)RbRDR(RRSRtxkeytobj((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt __setitem__ns cCs|jr|j|}n||jkr=|jj|nx|jD]}g}xp|jD]e}t|tr|j}|jr|j|}n||kr|j|qq]|j|q]W||_qGW|j |=dS(N( RkRlRpRbR?RAR>R RFRf(RRStlt remainingtotn((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt __delitem__|s      ccst}x|jD]t}xk|jD]`}t|tr#|jrV|j|j}n |j}||kr|V|j|qq#q#WqW|jrx5|jD]'}||kr|V|j|qqWndS(N( tsetRbR?RAR>RkR RDRc(RRERtRGtans((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__iter__s      cCstd|dS(NsNo sub-sections allowed(R(RR ((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_new_namespacesN(RRRRbRfRcRdReRyRlRR`RkRnRoRsRxR{R|(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRa>s      cCst|jdS(Ns (R2R (R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt make_commentsccs^t}xQtrY|j}|s3|r/dVndS|jdrKt}nt}|Vq WdS(sCiterate over a file by only using the file object's readline methodR6Ns (tFalsetTruetreadlinetendswith(tft have_newlineR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytreadline_iterators   cCs |jS(N(tlower(RG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRst INIConfigcBseZd Zd Zd Zd Zd Zd Zd Z d Z e Z d d e ed d d dZeddZeddZdZdZdZdZdZd ZeZeeeeegZd Z d Z!RS( c Cst|_||_||_||_||_||_i|_|dkrWi}nt td||_ x'|j D]\}} | |j |t_datat _parse_excRdRet_sectionxformvaluet_sectionxformsourcet _sectionsRRaRct iteritemst_readfp( RtfpRht parse_excRiRjtsectionxformvaluetsectionxformsourceR R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs         Rkt optionxformt _sectionxformcCs9|tkr|jS|jr.|j|}n|j|S(N(RRcRR(RRS((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRos   cCstd||dS(NsValues must be inside sections(R(RRSR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRsscCsW|jr|j|}nx+|j|jD]}|jjj|q,W|j|=dS(N(RRRbRR?Rp(RRSR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRxs  ccsmt}|jtxP|jjD]B}t|tr#|j|kre|jV|j|jqeq#q#WdS(N(RyRDRRR?RAR>R (RRERG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR{s  cCs|jjr"|jjtntt|}|jj||jr_|j|}n||jkr|j|}|jj |n(t |d|j d|}||j|<|S(NRhRj( RR?RDR8R>RRRRbRFRaRc(RR Rrtns((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR|s     cCs)|jrd}nd}||jjS(Nu%ss%s(t_bomRR (Rtfmt((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR s  cCs5x.|jD]}|j|}|r |Sq WdSdS(N(t _line_typesR%R(RRtlinetypeRg((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_parses c Cs;d}d}d}d}g}t}y |j}Wntk rJd}nXd} d} d} xt|D]~} | dkrt| tr| ddkr| d} t|_qn|j | } | d7} | rt| t t t f r|j r t|| | qt| } n| dkrl|j r]| dkrJt|} n| j| | nt| } nt| tr|r|r|j|g}|r| jj|t}qn|j| q|j r| dkrt|} n| j| | nt| } nt| tr|rC|j|g}t}nt| }|j||jrz|j|j}n |j}|tkr|j} n |j|} || j|iuiRhRjis (!RR~R tAttributeErrorRRAtunicodeRRRR2R8RRRR}RRFR<RCRlRDR)R>RkRRcRRfRRbRRa(RRt cur_sectiont cur_optiontcur_section_nametcur_option_namet pending_linestpending_empty_linestfnamet linecounttexcRRgtoptobj((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs                            N("RRRRRRcRdReRRRR~RRRRR`RkRRoRsRxR{R|R t __unicode__R8R2RR)R<RRR(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs4        (t__doc__R&t ConfigParserRRRtconfigtobjectRRR)R~R5R2R8R<R>RR`tConfigNamespaceRaR}RRR(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt&s"   : D d   PK[:[OOsite-packages/iniparse/ini.pycnu[ /Sc@s@dZddlZddlmZmZmZddlZdefdYZdefdYZ defd YZ d e d Z d efd YZ defdYZdefdYZdefdYZddZdejfdYZdZdZdZdejfdYZdS(sAccess and/or modify INI files * Compatiable with ConfigParser * Preserves order of sections & options * Preserves comments/blank lines/etc * More conveninet access to data Example: >>> from StringIO import StringIO >>> sio = StringIO('''# configure foo-application ... [foo] ... bar1 = qualia ... bar2 = 1977 ... [foo-ext] ... special = 1''') >>> cfg = INIConfig(sio) >>> print cfg.foo.bar1 qualia >>> print cfg['foo-ext'].special 1 >>> cfg.foo.newopt = 'hi!' >>> cfg.baz.enabled = 0 >>> print cfg # configure foo-application [foo] bar1 = qualia bar2 = 1977 newopt = hi! [foo-ext] special = 1 [baz] enabled = 0 iN(t DEFAULTSECTt ParsingErrortMissingSectionHeaderErrortLineTypecBs5eZdZddZdZdZdZRS(cCs%|dk r!|jd|_ndS(Ns (tNonetstriptline(tselfR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__init__4s cCs$|jdk r|jS|jSdS(N(RRt to_string(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__str__:scCs0t||rd|jd[^]]+)\]\s*((?P;|#)(?P.*))?$icCs>tt|j|||_||_||_||_dS(N(tsuperRRR tcommenttcomment_separatortcomment_offset(RR RRRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRQs    cCsQd|jd}|jdk rM|dj|j}||j|j}n|S(Nt[t]t (R RRtljustRR(Rtout((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR Ys cCsb|jj|j}|dkr(dS||jd|jd|jd|jd|S(NR Rtcsep(tregextmatchtrstripRtgrouptstart(tclsRtm((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytparseas  N( RRtretcompileRRRR R%t classmethod(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRKs   t OptionLinecBsMeZddddddZdZejdZdZe eZRS(s = icCsPtt|j|||_||_||_||_||_||_dS(N( RR)RR Rt separatorRRR(RR RR*RRRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRls     cCs\d|j|j|jf}|jdk rX|dj|j}||j|j}n|S(Ns%s%s%sR(R R*RRRRRR(RR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR vs s7^(?P[^:=\s[][^:=]*)(?P[:=]\s*)(?P.*)$c Cs |jj|j}|dkr(dS|jdj}|jd}|jdt||jd}|jd}|dkr||djr||d}||}|| j}|jd|}nd}d}d}||||||||S(NR Rtsept;ii( RRR RR!tlentfindtisspaceR"( R#RR$R RR+tcoffRR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s  &   N( RRRRR R&R'RR%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR)ks   s%;#cCsRtjdd|}d|}|r2|d7}n|d7}tj|t_dS(Ns ([\]\-\^])s\\\1s^(?P[%s]s |[rR][eE][mM]s)(?P.*)$(R&tsubR't CommentLineR(t comment_charst allow_remR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytchange_comment_syntaxs    R2cBsGeZejdZddddZdZdZe eZRS(s.^(?P[;#]|[rR][eE][mM] +)(?P.*)$tt#cCs,tt|j|||_||_dS(N(RR2RRR*(RRR*R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs cCs|j|jS(N(R*R(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR scCsJ|jj|j}|dkr(dS||jd|jd|S(NRR(RRR RR!(R#RR$((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s N( RRR&R'RRRR R%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR2s   t EmptyLinecBs5eZdZedZdZeeZRS(cCsdS(NR6((R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR scCsdS(NR6((t_((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytscCs|jrdS||S(N(RR(R#R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s (RRR tpropertyRR%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR8s  tContinuationLinecBsDeZejdZdddZdZdZe eZRS(s^\s+(?P.*)$cCsAtt|j|||_|dkr4d}n||_dS(Ni(RR<RRRt value_offset(RRR=R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs    cCsd|j|jS(NR(R=R(R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR scCsJ|jj|j}|dkr(dS||jd|jd|S(NR(RRR RR!R"(R#RR$((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR%s N( RRR&R'RRRR R%R((((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR<s   t LineContainercBseZd dZdZdZdZdZdZdZ e eeZ e ee Z dZ dZd ZRS( cCsKg|_d|_|rGt|tr7|j|qG|j|ndS(N(tcontentsRtorgvaluet isinstancetlisttextendtadd(Rtd((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs   cCs|jj|dS(N(R?tappend(Rtx((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRDscCs"x|D]}|j|qWdS(N(RD(RRGti((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRCs cCs|jdjS(Ni(R?R (R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytget_namescCs||jd_dS(Ni(R?R (Rtdata((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytset_namescCsv|jdk r|jSt|jdkr9|jdjSdjg|jD]"}t|tsId|j^qISdS(Niis s%s(R@RR-R?RtjoinRAR2(RRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt get_values cCs||_d|jd}d}x-|jD]"}t|tr,|j}Pq,q,W|jdd!|_|d|jd_|d=xC|D];}|jr|j t||q|j t qWdS(Ns%ss ii( R@tsplitRR?RAR<R=RRRDR8(RRJtlinesR=tvR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt set_values    cCs/g|jD]}|j^q }dj|S(Ns (R?R RL(RRGts((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR s"ccsKxD|jdddD],}t|dr|j|kr|VqqWdS(NiR (R?R R (RtkeyRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytfinditerscCs+x|j|D]}|SWt|dS(N(RTtKeyError(RRSRG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR.!sN(RRRRRDRCRIRKRMRQR;R RR RTR.(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR>s        cs`|d|ddkr)|nfd}fd}t||S(NRtsourcecs9t|}|dk r(t|St|SdS(N(tgetattrR(Rtsrcobj(tprivate_attrnametprivate_srcnamet srcattrname(s0/usr/lib/python2.7/site-packages/iniparse/ini.pytgetfn-s  csBt|}|dk r.t||nt||dS(N(RWRtsetattr(RRRX(RYRZR[(s0/usr/lib/python2.7/site-packages/iniparse/ini.pytsetfn4s (RR;(t myattrnameR[R\R^((RYRZR[s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_make_xform_property's    t INISectioncBseZdZdZdZdZdZeZ ddddZ e dZ dZ dZdZdZdZdZRS( cCs4|g|_||_||_||_i|_dS(N(t_linest _defaultst_optionxformvaluet_optionxformsourcet_options(Rtlineobjtdefaultstoptionxformvaluetoptionxformsource((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyREs     t _optionxformcCs|dkr|jdjS|jr5|j|}ny#|j|j}||jk}WnWtk r|jr||jjkr|jj|j}||jjk}qnX|rtj dd|}n|S(NRis +s ( RbR RkRfRt_compat_skip_empty_linesRURcR&R1(RRSRt del_empty((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt _compat_getOs   cCs|dkr|jdjS|jr5|j|}ny|j|jSWn@tk r|jr||jjkr|jj|jSnXdS(NRi(RbR RkRfRRURc(RRS((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_getitembs   cCs|jr|j|}n|}||jkrC|jj|n||jkrtt|d}|jdj|||j|R)RbRDR(RRSRtxkeytobj((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt __setitem__ns cCs|jr|j|}n||jkr=|jj|nx|jD]}g}xp|jD]e}t|tr|j}|jr|j|}n||kr|j|qq]|j|q]W||_qGW|j |=dS(N( RkRlRpRbR?RAR>R RFRf(RRStlt remainingtotn((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt __delitem__|s      ccst}x|jD]t}xk|jD]`}t|tr#|jrV|j|j}n |j}||kr|V|j|qq#q#WqW|jrx5|jD]'}||kr|V|j|qqWndS(N( tsetRbR?RAR>RkR RDRc(RRERtRGtans((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt__iter__s      cCstd|dS(NsNo sub-sections allowed(R(RR ((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_new_namespacesN(RRRRbRfRcRdReRyRlRR`RkRnRoRsRxR{R|(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRa>s      cCst|jdS(Ns (R2R (R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt make_commentsccs^t}xQtrY|j}|s3|r/dVndS|jdrKt}nt}|Vq WdS(sCiterate over a file by only using the file object's readline methodR6Ns (tFalsetTruetreadlinetendswith(tft have_newlineR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pytreadline_iterators   cCs |jS(N(tlower(RG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRst INIConfigcBseZd Zd Zd Zd Zd Zd Zd Z d Z e Z d d e ed d d dZeddZeddZdZdZdZdZdZd ZeZeeeeegZd Z d Z!RS( c Cst|_||_||_||_||_||_i|_|dkrWi}nt td||_ x'|j D]\}} | |j |t_datat _parse_excRdRet_sectionxformvaluet_sectionxformsourcet _sectionsRRaRct iteritemst_readfp( RtfpRht parse_excRiRjtsectionxformvaluetsectionxformsourceR R((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs         Rkt optionxformt _sectionxformcCs9|tkr|jS|jr.|j|}n|j|S(N(RRcRR(RRS((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRos   cCstd||dS(NsValues must be inside sections(R(RRSR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRsscCsW|jr|j|}nx+|j|jD]}|jjj|q,W|j|=dS(N(RRRbRR?Rp(RRSR((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRxs  ccsmt}|jtxP|jjD]B}t|tr#|j|kre|jV|j|jqeq#q#WdS(N(RyRDRRR?RAR>R (RRERG((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR{s  cCs|jjr"|jjtntt|}|jj||jr_|j|}n||jkr|j|}|jj |n(t |d|j d|}||j|<|S(NRhRj( RR?RDR8R>RRRRbRFRaRc(RR Rrtns((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR|s     cCs)|jrd}nd}||jjS(Nu%ss%s(t_bomRR (Rtfmt((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyR s  cCs5x.|jD]}|j|}|r |Sq WdSdS(N(t _line_typesR%R(RRtlinetypeRg((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt_parses c Cs;d}d}d}d}g}t}y |j}Wntk rJd}nXd} d} d} xt|D]~} | dkrt| tr| ddkr| d} t|_qn|j | } | d7} | rt| t t t f r|j r t|| | qt| } n| dkrl|j r]| dkrJt|} n| j| | nt| } nt| tr|r|r|j|g}|r| jj|t}qn|j| q|j r| dkrt|} n| j| | nt| } nt| tr|rC|j|g}t}nt| }|j||jrz|j|j}n |j}|tkr|j} n |j|} || j|iuiRhRjis (!RR~R tAttributeErrorRRAtunicodeRRRR2R8RRRR}RRFR<RCRlRDR)R>RkRRcRRfRRbRRa(RRt cur_sectiont cur_optiontcur_section_nametcur_option_namet pending_linestpending_empty_linestfnamet linecounttexcRRgtoptobj((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs                            N("RRRRRRcRdReRRRR~RRRRR`RkRRoRsRxR{R|R t __unicode__R8R2RR)R<RRR(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyRs4        (t__doc__R&t ConfigParserRRRtconfigtobjectRRR)R~R5R2R8R<R>RR`tConfigNamespaceRaR}RRR(((s0/usr/lib/python2.7/site-packages/iniparse/ini.pyt&s"   : D d   PK[S܍2site-packages/iniparse/utils.pynu[import compat from ini import LineContainer, EmptyLine def tidy(cfg): """Clean up blank lines. This functions makes the configuration look clean and handwritten - consecutive empty lines and empty lines at the start of the file are removed, and one is guaranteed to be at the end of the file. """ if isinstance(cfg, compat.RawConfigParser): cfg = cfg.data cont = cfg._data.contents i = 1 while i < len(cont): if isinstance(cont[i], LineContainer): tidy_section(cont[i]) i += 1 elif (isinstance(cont[i-1], EmptyLine) and isinstance(cont[i], EmptyLine)): del cont[i] else: i += 1 # Remove empty first line if cont and isinstance(cont[0], EmptyLine): del cont[0] # Ensure a last line if cont and not isinstance(cont[-1], EmptyLine): cont.append(EmptyLine()) def tidy_section(lc): cont = lc.contents i = 1 while i < len(cont): if (isinstance(cont[i-1], EmptyLine) and isinstance(cont[i], EmptyLine)): del cont[i] else: i += 1 # Remove empty first line if len(cont) > 1 and isinstance(cont[1], EmptyLine): del cont[1] PK[W-F/F/ site-packages/iniparse/compat.pynu[# Copyright (c) 2001, 2002, 2003 Python Software Foundation # Copyright (c) 2004-2008 Paramjit Oberoi # All Rights Reserved. See LICENSE-PSF & LICENSE for details. """Compatibility interfaces for ConfigParser Interfaces of ConfigParser, RawConfigParser and SafeConfigParser should be completely identical to the Python standard library versions. Tested with the unit tests included with Python-2.3.4 The underlying INIConfig object can be accessed as cfg.data """ import re from ConfigParser import DuplicateSectionError, \ NoSectionError, NoOptionError, \ InterpolationMissingOptionError, \ InterpolationDepthError, \ InterpolationSyntaxError, \ DEFAULTSECT, MAX_INTERPOLATION_DEPTH # These are imported only for compatiability. # The code below does not reference them directly. from ConfigParser import Error, InterpolationError, \ MissingSectionHeaderError, ParsingError import ini class RawConfigParser(object): def __init__(self, defaults=None, dict_type=dict): if dict_type != dict: raise ValueError('Custom dict types not supported') self.data = ini.INIConfig(defaults=defaults, optionxformsource=self) def optionxform(self, optionstr): return optionstr.lower() def defaults(self): d = {} secobj = self.data._defaults for name in secobj._options: d[name] = secobj._compat_get(name) return d def sections(self): """Return a list of section names, excluding [DEFAULT]""" return list(self.data) def add_section(self, section): """Create a new section in the configuration. Raise DuplicateSectionError if a section by the specified name already exists. Raise ValueError if name is DEFAULT or any of its case-insensitive variants. """ # The default section is the only one that gets the case-insensitive # treatment - so it is special-cased here. if section.lower() == "default": raise ValueError, 'Invalid section name: %s' % section if self.has_section(section): raise DuplicateSectionError(section) else: self.data._new_namespace(section) def has_section(self, section): """Indicate whether the named section is present in the configuration. The DEFAULT section is not acknowledged. """ return (section in self.data) def options(self, section): """Return a list of option names for the given section name.""" if section in self.data: return list(self.data[section]) else: raise NoSectionError(section) def read(self, filenames): """Read and parse a filename or a list of filenames. Files that cannot be opened are silently ignored; this is designed so that you can specify a list of potential configuration file locations (e.g. current directory, user's home directory, systemwide directory), and all existing configuration files in the list will be read. A single filename may also be given. """ files_read = [] if isinstance(filenames, basestring): filenames = [filenames] for filename in filenames: try: fp = open(filename) except IOError: continue files_read.append(filename) self.data._readfp(fp) fp.close() return files_read def readfp(self, fp, filename=None): """Like read() but the argument must be a file-like object. The `fp' argument must have a `readline' method. Optional second argument is the `filename', which if not given, is taken from fp.name. If fp has no `name' attribute, `' is used. """ self.data._readfp(fp) def get(self, section, option, vars=None): if not self.has_section(section): raise NoSectionError(section) if vars is not None and option in vars: value = vars[option] sec = self.data[section] if option in sec: return sec._compat_get(option) else: raise NoOptionError(option, section) def items(self, section): if section in self.data: ans = [] for opt in self.data[section]: ans.append((opt, self.get(section, opt))) return ans else: raise NoSectionError(section) def getint(self, section, option): return int(self.get(section, option)) def getfloat(self, section, option): return float(self.get(section, option)) _boolean_states = {'1': True, 'yes': True, 'true': True, 'on': True, '0': False, 'no': False, 'false': False, 'off': False} def getboolean(self, section, option): v = self.get(section, option) if v.lower() not in self._boolean_states: raise ValueError, 'Not a boolean: %s' % v return self._boolean_states[v.lower()] def has_option(self, section, option): """Check for the existence of a given option in a given section.""" if section in self.data: sec = self.data[section] else: raise NoSectionError(section) return (option in sec) def set(self, section, option, value): """Set an option.""" if section in self.data: self.data[section][option] = value else: raise NoSectionError(section) def write(self, fp): """Write an .ini-format representation of the configuration state.""" fp.write(str(self.data)) def remove_option(self, section, option): """Remove an option.""" if section in self.data: sec = self.data[section] else: raise NoSectionError(section) if option in sec: del sec[option] return 1 else: return 0 def remove_section(self, section): """Remove a file section.""" if not self.has_section(section): return False del self.data[section] return True class ConfigDict(object): """Present a dict interface to a ini section.""" def __init__(self, cfg, section, vars): self.cfg = cfg self.section = section self.vars = vars def __getitem__(self, key): try: return RawConfigParser.get(self.cfg, self.section, key, self.vars) except (NoOptionError, NoSectionError): raise KeyError(key) class ConfigParser(RawConfigParser): def get(self, section, option, raw=False, vars=None): """Get an option value for a given section. All % interpolations are expanded in the return values, based on the defaults passed into the constructor, unless the optional argument `raw' is true. Additional substitutions may be provided using the `vars' argument, which must be a dictionary whose contents overrides any pre-existing defaults. The section DEFAULT is special. """ if section != DEFAULTSECT and not self.has_section(section): raise NoSectionError(section) option = self.optionxform(option) value = RawConfigParser.get(self, section, option, vars) if raw: return value else: d = ConfigDict(self, section, vars) return self._interpolate(section, option, value, d) def _interpolate(self, section, option, rawval, vars): # do the string interpolation value = rawval depth = MAX_INTERPOLATION_DEPTH while depth: # Loop through this until it's done depth -= 1 if "%(" in value: try: value = value % vars except KeyError, e: raise InterpolationMissingOptionError( option, section, rawval, e.args[0]) else: break if value.find("%(") != -1: raise InterpolationDepthError(option, section, rawval) return value def items(self, section, raw=False, vars=None): """Return a list of tuples with (name, value) for each option in the section. All % interpolations are expanded in the return values, based on the defaults passed into the constructor, unless the optional argument `raw' is true. Additional substitutions may be provided using the `vars' argument, which must be a dictionary whose contents overrides any pre-existing defaults. The section DEFAULT is special. """ if section != DEFAULTSECT and not self.has_section(section): raise NoSectionError(section) if vars is None: options = list(self.data[section]) else: options = [] for x in self.data[section]: if x not in vars: options.append(x) options.extend(vars.keys()) if "__name__" in options: options.remove("__name__") d = ConfigDict(self, section, vars) if raw: return [(option, d[option]) for option in options] else: return [(option, self._interpolate(section, option, d[option], d)) for option in options] class SafeConfigParser(ConfigParser): _interpvar_re = re.compile(r"%\(([^)]+)\)s") _badpercent_re = re.compile(r"%[^%]|%$") def set(self, section, option, value): if not isinstance(value, basestring): raise TypeError("option values must be strings") # check for bad percent signs: # first, replace all "good" interpolations tmp_value = self._interpvar_re.sub('', value) # then, check if there's a lone percent sign left m = self._badpercent_re.search(tmp_value) if m: raise ValueError("invalid interpolation syntax in %r at " "position %d" % (value, m.start())) ConfigParser.set(self, section, option, value) def _interpolate(self, section, option, rawval, vars): # do the string interpolation L = [] self._interpolate_some(option, L, rawval, section, vars, 1) return ''.join(L) _interpvar_match = re.compile(r"%\(([^)]+)\)s").match def _interpolate_some(self, option, accum, rest, section, map, depth): if depth > MAX_INTERPOLATION_DEPTH: raise InterpolationDepthError(option, section, rest) while rest: p = rest.find("%") if p < 0: accum.append(rest) return if p > 0: accum.append(rest[:p]) rest = rest[p:] # p is no longer used c = rest[1:2] if c == "%": accum.append("%") rest = rest[2:] elif c == "(": m = self._interpvar_match(rest) if m is None: raise InterpolationSyntaxError(option, section, "bad interpolation variable reference %r" % rest) var = m.group(1) rest = rest[m.end():] try: v = map[var] except KeyError: raise InterpolationMissingOptionError( option, section, rest, var) if "%" in v: self._interpolate_some(option, accum, v, section, map, depth + 1) else: accum.append(v) else: raise InterpolationSyntaxError( option, section, "'%' must be followed by '%' or '(', found: " + repr(rest)) PK[0.2.2!site-packages/iniparse/compat.pycnu[ Kc@sdZddlZddlmZmZmZmZmZmZm Z m Z ddlm Z m Z m Z mZddlZdefdYZdefdYZd efd YZd efd YZdS( s(Compatibility interfaces for ConfigParser Interfaces of ConfigParser, RawConfigParser and SafeConfigParser should be completely identical to the Python standard library versions. Tested with the unit tests included with Python-2.3.4 The underlying INIConfig object can be accessed as cfg.data iN(tDuplicateSectionErrortNoSectionErrort NoOptionErrortInterpolationMissingOptionErrortInterpolationDepthErrortInterpolationSyntaxErrort DEFAULTSECTtMAX_INTERPOLATION_DEPTH(tErrortInterpolationErrortMissingSectionHeaderErrort ParsingErrortRawConfigParsercBseZdedZdZdZdZdZdZ dZ dZ ddZ dd Z d Zd Zd Zied 6ed6ed6ed6ed6ed6ed6ed6ZdZdZdZdZdZdZRS(cCs:|tkrtdntjd|d||_dS(NsCustom dict types not supportedtdefaultstoptionxformsource(tdictt ValueErrortinit INIConfigtdata(tselfR t dict_type((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt__init__s cCs |jS(N(tlower(Rt optionstr((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt optionxform#scCs=i}|jj}x$|jD]}|j|||' is used. N(RR-(RR2R1((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytreadfpgscCs||j|st|n|dk rC||krC||}n|j|}||kri|j|St||dS(N(R#RtNoneRRR(RR%toptiontvarstvaluetsec((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytgetqs    cCs`||jkrPg}x4|j|D]%}|j||j||fq#W|St|dS(N(RR,R:R(RR%tanstopt((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytitems}s #cCst|j||S(N(tintR:(RR%R6((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytgetintscCst|j||S(N(tfloatR:(RR%R6((s3/usr/lib/python2.7/site-packages/iniparse/compat.pytgetfloatst1tyesttruetont0tnotfalsetoffcCsH|j||}|j|jkr7td|n|j|jS(NsNot a boolean: %s(R:Rt_boolean_statesR(RR%R6tv((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt getbooleanscCs5||jkr|j|}n t|||kS(s=Check for the existence of a given option in a given section.(RR(RR%R6R9((s3/usr/lib/python2.7/site-packages/iniparse/compat.pyt has_options cCs3||jkr#||j|| s : " NPK[/m site-packages/iniparse/utils.pyonu[ JKc@s8ddlZddlmZmZdZdZdS(iN(t LineContainert EmptyLinecCs t|tjr|j}n|jj}d}x|t|krt||trst|||d7}q3t||dt rt||t r||=q3|d7}q3W|rt|dt r|d=n|rt|dt  r|j t ndS(sClean up blank lines. This functions makes the configuration look clean and handwritten - consecutive empty lines and empty lines at the start of the file are removed, and one is guaranteed to be at the end of the file. iiiN( t isinstancetcompattRawConfigParsertdatat_datatcontentstlenRt tidy_sectionRtappend(tcfgtcontti((s2/usr/lib/python2.7/site-packages/iniparse/utils.pyttidys      cCs|j}d}xT|t|kret||dtrXt||trX||=q|d7}qWt|dkrt|dtr|d=ndS(Ni(RRRR(tlcR R ((s2/usr/lib/python2.7/site-packages/iniparse/utils.pyR #s  %(RtiniRRRR (((s2/usr/lib/python2.7/site-packages/iniparse/utils.pyts  PK[݆?site-packages/babel/dates.pyonu[ Mc@sdZddlmZmZmZmZmZddlZddlmZm Z m Z ddl m Z dddd d d d gZ d ZedZeZeZeZedZddedZddedZddedZdedZdedZdedZdedZddedZdedZddeedZddedZ dddedZ!ddded Z"ed!Z#ed"Z$ed#Z%d$e&fd%YZ'd&e&fd'YZ(id(d)d*d+d,gd-6dd.6dd/6dd06d(d)d*d+gd16d(d)d*d+gd26d(d)d*d+d,gd36d(d)d*d+d,gd46d(d)gd56d(gd66d(d)gd76d(d)d*gd86d(gd96dd:6d(d)d*d+d,gd;6d(d)d*d+d,gd<6d(d*d+d,gd=6d(gd>6d(d)gd?6d(d)gd@6d(d)gdA6d(d)gdB6d(d)gdC6d(d)gdD6ddE6ddF6d(d)d*d+gdG6d(d)d*d+gdH6d(d+gdI6d(d+gdJ6Z)dKZ*dS(LsLocale dependent formatting and parsing of dates and times. The default locale for the functions in this module is determined by the following environment variables, in that order: * ``LC_TIME``, * ``LC_ALL``, and * ``LANG`` i(tdatetdatetimettimet timedeltattzinfoN(tdefault_localet get_globaltLocale(tUTCt format_datetformat_datetimet format_timetget_timezone_namet parse_datetparse_datetimet parse_timesrestructuredtext entLC_TIMEcCstj|jS(sReturn the names for day periods (AM/PM) used by the locale. >>> get_period_names(locale='en_US')['am'] u'AM' :param locale: the `Locale` object, or a locale string :return: the dictionary of period names :rtype: `dict` (Rtparsetperiods(tlocale((s//usr/lib/python2.7/site-packages/babel/dates.pytget_period_names)s twidetformatcCstj|j||S(s*Return the day names used by the locale for the specified format. >>> get_day_names('wide', locale='en_US')[1] u'Tuesday' >>> get_day_names('abbreviated', locale='es')[1] u'mar' >>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1] u'D' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of day names :rtype: `dict` (RRtdays(twidthtcontextR((s//usr/lib/python2.7/site-packages/babel/dates.pyt get_day_names5scCstj|j||S(s4Return the month names used by the locale for the specified format. >>> get_month_names('wide', locale='en_US')[1] u'January' >>> get_month_names('abbreviated', locale='es')[1] u'ene' >>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1] u'J' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of month names :rtype: `dict` (RRtmonths(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_month_namesGscCstj|j||S(sReturn the quarter names used by the locale for the specified format. >>> get_quarter_names('wide', locale='en_US')[1] u'1st quarter' >>> get_quarter_names('abbreviated', locale='de_DE')[1] u'Q1' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of quarter names :rtype: `dict` (RRtquarters(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_quarter_namesYscCstj|j|S(sReturn the era names used by the locale for the specified format. >>> get_era_names('wide', locale='en_US')[1] u'Anno Domini' >>> get_era_names('abbreviated', locale='de_DE')[1] u'n. Chr.' :param width: the width to use, either "wide", "abbreviated", or "narrow" :param locale: the `Locale` object, or a locale string :return: the dictionary of era names :rtype: `dict` (RRteras(RR((s//usr/lib/python2.7/site-packages/babel/dates.pyt get_era_namesis tmediumcCstj|j|S(sReturn the date formatting patterns used by the locale for the specified format. >>> get_date_format(locale='en_US') >>> get_date_format('full', locale='de_DE') :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the date format pattern :rtype: `DateTimePattern` (RRt date_formats(RR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_date_formatxscCs/tj|j}||kr'd}n||S(sReturn the datetime formatting patterns used by the locale for the specified format. >>> get_datetime_format(locale='en_US') u'{1} {0}' :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the datetime format pattern :rtype: `unicode` N(RRtdatetime_formatstNone(RRtpatterns((s//usr/lib/python2.7/site-packages/babel/dates.pytget_datetime_formats   cCstj|j|S(sReturn the time formatting patterns used by the locale for the specified format. >>> get_time_format(locale='en_US') >>> get_time_format('full', locale='de_DE') :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the time format pattern :rtype: `DateTimePattern` (RRt time_formats(RR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_time_formatstlongcCs|d krtj}n-t|ttfrHtj|j}n|jd krl|j dt }nt j |}|jj |}|jddd|j}t|d\}}|dkrd}n|jdd}|||dfS( sReturn the timezone associated with the given `datetime` object formatted as string indicating the offset from GMT. >>> dt = datetime(2007, 4, 1, 15, 30) >>> get_timezone_gmt(dt, locale='en') u'GMT+00:00' >>> from pytz import timezone >>> tz = timezone('America/Los_Angeles') >>> dt = datetime(2007, 4, 1, 15, 30, tzinfo=tz) >>> get_timezone_gmt(dt, locale='en') u'GMT-08:00' >>> get_timezone_gmt(dt, 'short', locale='en') u'-0800' The long format depends on the locale, for example in France the acronym UTC string is used instead of GMT: >>> get_timezone_gmt(dt, 'long', locale='fr_FR') u'UTC-08:00' :param datetime: the ``datetime`` object; if `None`, the current date and time in UTC is used :param width: either "long" or "short" :param locale: the `Locale` object, or a locale string :return: the GMT offset representation of the timezone :rtype: `unicode` :since: version 0.9 Rii<itshortu %+03d%02dtgmts %+03d:%02dN(R%t datetime_tutcnowt isinstancetintR*tutcfromtimestampRRtreplaceRRRt utcoffsetRtsecondstdivmodt zone_formats(RRRtoffsetR4thourstpattern((s//usr/lib/python2.7/site-packages/babel/dates.pytget_timezone_gmts   c Cs,|dks!t|ttfr0d}t}nKt|ttfro|}|jdk rf|j}q{t}n d}|}tj |}t |dr|j }n|j |ptj }tdj||}|jj|i}|jd}tdj|}||jkr'd}n|j|}|rfttdj|gdkrf||S|jd} d |kr|d } ntd j|} |jj| i} d | krtd } nCd |kr|jd ddjd d } n|jd d } || i| d6|d6S(sHReturn a representation of the given timezone using "location format". The result depends on both the local display name of the country and the city associated with the time zone: >>> from pytz import timezone >>> tz = timezone('America/St_Johns') >>> get_timezone_location(tz, locale='de_DE') u"Kanada (St. John's)" >>> tz = timezone('America/Mexico_City') >>> get_timezone_location(tz, locale='de_DE') u'Mexiko (Mexiko-Stadt)' If the timezone is associated with a country that uses only a single timezone, just the localized country name is returned: >>> tz = timezone('Europe/Berlin') >>> get_timezone_name(tz, locale='de_DE') u'Deutschland' :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines the timezone; if `None`, the current date and time in UTC is assumed :param locale: the `Locale` object, or a locale string :return: the localized timezone name using location format :rtype: `unicode` :since: version 0.9 tzonet zone_aliasestregiontzone_territoriestZZtterritory_zonesitfallbacktcityt meta_zonest/t_t t0t1N(R%R/R0R*RRRRRRthasattrR;ttznameR.Rtgett time_zonesR6t territoriestlenRCtmetainfotsplitR2( t dt_or_tzinfoRtdtRR;tinfot region_formatt territorytterritory_nametfallback_formatt city_nametmetazonet metazone_info((s//usr/lib/python2.7/site-packages/babel/dates.pytget_timezone_locationsH!       *      % c Cs5|d ks!t|ttfr0d }t}nKt|ttfro|}|jd k rf|j}q{t}n d }|}tj |}t |dr|j }n|j |}t dj||}|jj|i}||kr`|d krd}n?|j|} | d kr&d}n| dkr;d}nd}|||kr`|||Snt dj|} | r|jj| i} || kr|s| jdr|d krd}n|j|rdpd}|| |kr| ||Sqn|d k r%t|d |d |St|d |S( s Return the localized display name for the given timezone. The timezone may be specified using a ``datetime`` or `tzinfo` object. >>> from pytz import timezone >>> dt = time(15, 30, tzinfo=timezone('America/Los_Angeles')) >>> get_timezone_name(dt, locale='en_US') u'Pacific Standard Time' >>> get_timezone_name(dt, width='short', locale='en_US') u'PST' If this function gets passed only a `tzinfo` object and no concrete `datetime`, the returned display name is indenpendent of daylight savings time. This can be used for example for selecting timezones, or to set the time of events that recur across DST changes: >>> tz = timezone('America/Los_Angeles') >>> get_timezone_name(tz, locale='en_US') u'Pacific Time' >>> get_timezone_name(tz, 'short', locale='en_US') u'PT' If no localized display name for the timezone is available, and the timezone is associated with a country that uses only a single timezone, the name of that country is returned, formatted according to the locale: >>> tz = timezone('Europe/Berlin') >>> get_timezone_name(tz, locale='de_DE') u'Deutschland' >>> get_timezone_name(tz, locale='pt_BR') u'Hor\xe1rio Alemanha' On the other hand, if the country uses multiple timezones, the city is also included in the representation: >>> tz = timezone('America/St_Johns') >>> get_timezone_name(tz, locale='de_DE') u"Kanada (St. John's)" The `uncommon` parameter can be set to `True` to enable the use of timezone representations that are not commonly used by the requested locale. For example, while in French the central European timezone is usually abbreviated as "HEC", in Canadian French, this abbreviation is not in common use, so a generic name would be chosen by default: >>> tz = timezone('Europe/Paris') >>> get_timezone_name(tz, 'short', locale='fr_CA') u'France' >>> get_timezone_name(tz, 'short', uncommon=True, locale='fr_CA') u'HEC' :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines the timezone; if a ``tzinfo`` object is used, the resulting display name will be generic, i.e. independent of daylight savings time; if `None`, the current date in UTC is assumed :param width: either "long" or "short" :param uncommon: whether even uncommon timezone abbreviations should be used :param locale: the `Locale` object, or a locale string :return: the timezone display name :rtype: `unicode` :since: version 0.9 :see: `LDML Appendix J: Time Zone Display Names `_ R;R<tgenericitstandardtdaylightRCtcommonRRN(R%R/R0R*RRRRRRRIR;RJRRKRLtdstRCR:R[( RQRtuncommonRRRRR;RStfieldR`RYRZ((s//usr/lib/python2.7/site-packages/babel/dates.pyR -sNB!           !   cCs|dkrtj}nt|tr9|j}ntj|}|dkrit|d|}nt |}|j ||S(sReturn a date formatted according to the given pattern. >>> d = date(2007, 04, 01) >>> format_date(d, locale='en_US') u'Apr 1, 2007' >>> format_date(d, format='full', locale='de_DE') u'Sonntag, 1. April 2007' If you don't want to use the locale default formats, you can specify a custom date pattern: >>> format_date(d, "EEE, MMM d, ''yy", locale='en') u"Sun, Apr 1, '07" :param date: the ``date`` or ``datetime`` object; if `None`, the current date is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param locale: a `Locale` object or a locale identifier :rtype: `unicode` :note: If the pattern contains time fields, an `AttributeError` will be raised when trying to apply the formatting. This is also true if the value of ``date`` parameter is actually a ``datetime`` object, as this function automatically converts that to a ``date``. tfullR*R!R+RN(RcslongR!sshort( R%tdate_ttodayR/RRRRR#t parse_patterntapply(RRRR9((s//usr/lib/python2.7/site-packages/babel/dates.pyR s   c CsP|d krtj}nQt|ttfrBtj|}n*t|trltjt j |}n|j d kr|j dt }n|d k r|j|}t|dr|j|}qntj|}|d kr6t|d|j dt||dd d|j d t||d|St|j||Sd S( s(Return a date formatted according to the given pattern. >>> dt = datetime(2007, 04, 01, 15, 30) >>> format_datetime(dt, locale='en_US') u'Apr 1, 2007 3:30:00 PM' For any pattern requiring the display of the time-zone, the third-party ``pytz`` package is needed to explicitly specify the time-zone: >>> from pytz import timezone >>> format_datetime(dt, 'full', tzinfo=timezone('Europe/Paris'), ... locale='fr_FR') u'dimanche 1 avril 2007 17:30:00 HEC' >>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz", ... tzinfo=timezone('US/Eastern'), locale='en') u'2007.04.01 AD at 11:30:00 EDT' :param datetime: the `datetime` object; if `None`, the current date and time is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param tzinfo: the timezone to apply to the time for display :param locale: a `Locale` object or a locale identifier :rtype: `unicode` Rt normalizeRcR*R!R+Rs{0}s{1}N(sfullslongsmediumsshort(R%R-R.R/R0R*R1RtcombineRReRR2Rt astimezoneRIRhRRR'R R RfRg(RRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR s&    cCs*|dkrtj}n't|ttfrBtj|}n|jdkrf|jdt }nt|tr|dk r|j |}t |dr|j |}qn|j }n!|dk r|jd|}ntj|}|d krt|d|}nt|j||S( s Return a time formatted according to the given pattern. >>> t = time(15, 30) >>> format_time(t, locale='en_US') u'3:30:00 PM' >>> format_time(t, format='short', locale='de_DE') u'15:30' If you don't want to use the locale default formats, you can specify a custom time pattern: >>> format_time(t, "hh 'o''clock' a", locale='en') u"03 o'clock PM" For any pattern requiring the display of the time-zone, the third-party ``pytz`` package is needed to explicitly specify the time-zone: >>> from pytz import timezone >>> t = datetime(2007, 4, 1, 15, 30) >>> tzinfo = timezone('Europe/Paris') >>> t = tzinfo.localize(t) >>> format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR') u'15:30:00 HEC' >>> format_time(t, "hh 'o''clock' a, zzzz", tzinfo=timezone('US/Eastern'), ... locale='en') u"09 o'clock AM, Eastern Daylight Time" As that example shows, when this function gets passed a ``datetime.datetime`` value, the actual time in the formatted string is adjusted to the timezone specified by the `tzinfo` parameter. If the ``datetime`` is "naive" (i.e. it has no associated timezone information), it is assumed to be in UTC. These timezone calculations are **not** performed if the value is of type ``datetime.time``, as without date information there's no way to determine what a given time would translate to in a different timezone without information about whether daylight savings time is in effect or not. This means that time values are left as-is, and the value of the `tzinfo` parameter is only used to display the timezone name if needed: >>> t = time(15, 30) >>> format_time(t, format='full', tzinfo=timezone('Europe/Paris'), ... locale='fr_FR') u'15:30:00 HEC' >>> format_time(t, format='full', tzinfo=timezone('US/Eastern'), ... locale='en_US') u'3:30:00 PM ET' :param time: the ``time`` or ``datetime`` object; if `None`, the current time in UTC is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param tzinfo: the time-zone to apply to the time for display :param locale: a `Locale` object or a locale identifier :rtype: `unicode` :note: If the pattern contains date fields, an `AttributeError` will be raised when trying to apply the formatting. This is also true if the value of ``time`` parameter is actually a ``datetime`` object, as this function automatically converts that to a ``time``. RRhRcR*R!R+RN(sfullslongsmediumsshort(R%RR.R/R0R*R1RR2RRjRIRhttimetzRRR)RfRg(RRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR s$>    c Cshtd|jj}|jd}|jd}|dkrT|jd}n|jd}|df|df|d fg}|jtgt|D]\}}|d |f^q}tjd |} | |d} t | d krd t | } n t | } t | |d} t | |d } | dkrX| | } } nt | | | S(sParse a date from a string. This function uses the date format for the locale as a hint to determine the order in which the date fields appear in the string. >>> parse_date('4/1/04', locale='en_US') datetime.date(2004, 4, 1) >>> parse_date('01.04.2004', locale='de_DE') datetime.date(2004, 4, 1) :param string: the string containing the date :param locale: a `Locale` object or a locale identifier :return: the parsed date :rtype: `date` RtytmitltdtYtMtDis(\d+)iii ( R#R9tlowertindextsorttdictt enumeratetretfindallRNR0R( tstringRRtyear_idxt month_idxtday_idxtindexestidxtitemtnumberstyeartmonthtday((s//usr/lib/python2.7/site-packages/babel/dates.pyR Ps& ! 5  cCs tdS(swParse a date and time from a string. This function uses the date and time formats for the locale as a hint to determine the order in which the time fields appear in the string. :param string: the string containing the date and time :param locale: a `Locale` object or a locale identifier :return: the parsed date/time :rtype: `datetime` N(tNotImplementedError(RzR((s//usr/lib/python2.7/site-packages/babel/dates.pyR{s c Cs!td|jj}|jd}|dkrE|jd}n|jd}|jd}|df|df|d fg}|jtgt|D]\}}|d |f^q}tjd |} t | |d} t | |d} t | |d } t | | | S( sParse a time from a string. This function uses the time format for the locale as a hint to determine the order in which the time fields appear in the string. >>> parse_time('15:30:00', locale='en_US') datetime.time(15, 30) :param string: the string containing the time :param locale: a `Locale` object or a locale identifier :return: the parsed time :rtype: `time` RthitkRmtstHRqtSis(\d+)( R)R9RsRtRuRvRwRxRyR0R( RzRRthour_idxtmin_idxtsec_idxR~RRRthourtminutetsecond((s//usr/lib/python2.7/site-packages/babel/dates.pyRs ! 5tDateTimePatterncBs5eZdZdZdZdZdZRS(cCs||_||_dS(N(R9R(tselfR9R((s//usr/lib/python2.7/site-packages/babel/dates.pyt__init__s cCsdt|j|jfS(Ns<%s %r>(ttypet__name__R9(R((s//usr/lib/python2.7/site-packages/babel/dates.pyt__repr__scCs|jS(N(R9(R((s//usr/lib/python2.7/site-packages/babel/dates.pyt __unicode__scCs |j|S(N(R(Rtother((s//usr/lib/python2.7/site-packages/babel/dates.pyt__mod__scCs|t||S(N(tDateTimeFormat(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRgs(Rt __module__RRRRRg(((s//usr/lib/python2.7/site-packages/babel/dates.pyRs     RcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZddZddZRS(cCsXt|ttfr9|jdkr9|jdt}n||_tj ||_ dS(NR( R/RRRR%R2RtvalueRRR(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs$ cCs|d}t|}|dkr2|j||S|d"krN|j||S|d#krj|j||S|d$kr|j||S|d%kr|j||S|d kr|j|jj|S|d kr|j |S|dkr|j S|d&kr|j ||S|dkr(|j |S|dkrw|jj ddkrZ|jd|S|j|jj d|Sn1|dkr|j|jj |S|dkr|j|jj d|S|dkr|jj dkr|jd|S|j|jj |Sn|dkr(|j|jj|S|dkrJ|j|jj|S|dkrc|j|S|dkr||j|S|d'kr|j||Std!|dS((NitGRlRptutQtqRqtLtwtWRoRrtFtEtetctaRi RtKRiRmRRtAtztZtvtVsUnsupported date/time field %r(RlRpR(RR(RqR(RR(RRR(RRRR(RNt format_erat format_yeartformat_quartert format_montht format_weekRRRtformat_day_of_yeartformat_day_of_week_in_monthtformat_weekdayt format_periodRRRtformat_frac_secondstformat_milliseconds_in_daytformat_timezonetKeyError(Rtnametchartnum((s//usr/lib/python2.7/site-packages/babel/dates.pyt __getitem__sZ                          cCsTidd6dd6dd6td|}t|jjdk}t||j|S(Nt abbreviatediRitnarrowii(tmaxR0RRR R(RRRRtera((s//usr/lib/python2.7/site-packages/babel/dates.pyRs(cCsx|jj}|jrI|j|j}|dkrI|d8}qIn|j||}|dkrt|d}n|S(Niiii(RRtisuppertget_week_numbertget_day_of_yearR(RRRRtweekR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs     cCs~|jjddd}|dkr0d||Sidd6dd6dd 6|}id d 6d d 6|}t|||j|S(Niiis%%0%ddRRiRiRRs stand-aloneR(RRRR(RRRtquarterRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR s   cCsr|dkrd||jjSidd6dd6dd6|}id d 6d d 6|}t|||j|jjS( Nis%%0%ddRiRiRiRRqs stand-aloneR(RRRR(RRRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs  cCs|jr}|j}|j|}|dkrm|jtd|}|j|j||j}n|j||S|j|jj}|dkr|jtd|jj}|j|j|j}nd|SdS(NiRs%d(tislowerRRRRtweekdayRR(RRRt day_of_yearRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs    cCs|dkrV|jrMd|jj|jj}|j|dd|Sd}n|jj}idd6dd6dd6|}id d6d d6d d6|}t|||j|S( NiiiRRiRiRs stand-alone(RRtfirst_week_dayRRRR(RRRRRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR,s   cCs|j|j|S(N(RR(RR((s//usr/lib/python2.7/site-packages/babel/dates.pyR7scCsd|jjdddS(Ns%dii(RR(R((s//usr/lib/python2.7/site-packages/babel/dates.pyR:scCs>idd6dd6t|jjdk}td|j|S(Ntamitpmii R(R0RRRR(RRtperiod((s//usr/lib/python2.7/site-packages/babel/dates.pyR=s*cCs=t|jj}|jttd||d||S(Ns.%si (tstrRt microsecondRtroundtfloat(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRAscCsJ|jjd|jjd|jjd|jjd}|j||S(Nii`i6(RRRRRR(RRtmsecs((s//usr/lib/python2.7/site-packages/babel/dates.pyREs:cCsidd6dd6td|}|dkrFt|j|d|jS|dkrkt|j|d|jS|dkrt|jj|d|jS|d kr|d krt|jj|d td|jSt|jjd|jSdS( NR+iR*iRRRRRiRa(RR RRR:RtTrueR[(RRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRJs!      cCs d||S(Ns%%0%dd((RRtlength((s//usr/lib/python2.7/site-packages/babel/dates.pyRYscCs6|dkr|j}n|t|jddjdS(Ni(R%RRdRR(RR((s//usr/lib/python2.7/site-packages/babel/dates.pyR\s  cCs|dkr|jj}n||jj|dd}|dkrS|d7}n||dd}d||jjkr|d7}n|S(sReturn the number of the week of a day within a period. This may be the week number in a year or the week number in a month. Usually this will return a value equal to or greater than 1, but if the first week of the period is so short that it actually counts as the last week of the previous period, this function will return 0. >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('de_DE')) >>> format.get_week_number(6) 1 >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('en_US')) >>> format.get_week_number(6) 2 :param day_of_period: the number of the day in the period (usually either the day of month or the day of year) :param day_of_week: the week day; if ommitted, the week day of the current date is assumed iiiN(R%RRRRt min_week_days(Rt day_of_periodt day_of_weekt first_dayt week_number((s//usr/lib/python2.7/site-packages/babel/dates.pyRas    N(RRRRRRRRRRRRRRRRRR%RR(((s//usr/lib/python2.7/site-packages/babel/dates.pyRs"  2            iiiiiRRlRpRRRRqRRRRoRrRtgRRRRRRRRRmRRRRRRRcst|tkr|Sgd }gdgdgfd}fd}x7t|jddD]\}}|d krY|dkrdr|nr|ng}q|tkr5r|n|dkr dcd7>> parse_pattern("MMMMd").format u'%(MMMM)s%(d)s' >>> parse_pattern("MMM d, yyyy").format u'%(MMM)s %(d)s, %(yyyy)s' Pattern can contain literal strings in single quotes: >>> parse_pattern("H:mm' Uhr 'z").format u'%(H)s:%(mm)s Uhr %(z)s' An actual single quote can be used by using two adjacent single quote characters: >>> parse_pattern("hh' o''clock'").format u"%(hh)s o'clock" :param pattern: the formatting pattern to parse tics*jdjjdd2dS(NRt%s%%(tappendtjoinR2((tcharbuftresult(s//usr/lib/python2.7/site-packages/babel/dates.pyt append_charss"csxtd}|rCd|krCtdddnjddddds\(    /R  y&  0R + %&,.? 4 CPK[ DDsite-packages/babel/support.pyonu[ Mc@sdZddlmZmZmZddlZddlmZddlmZm Z m Z m Z ddl m Z mZmZmZmZmZddlmZmZdd d gZd Zdefd YZd efd YZd ejefdYZdS(sSeveral classes and functions that help with integrating and using Babel in applications. .. note: the code in this module is not used by Babel itself i(tdatetdatetimettimeN(tLocale(t format_datetformat_datetimet format_timetLC_TIME(t format_numbertformat_decimaltformat_currencytformat_percenttformat_scientifict LC_NUMERIC(tsettUTCtFormatt LazyProxyt Translationssrestructuredtext encBszeZdZd dZd ddZd ddZd ddZdZd dZ dZ d d Z d Z RS( sWrapper class providing the various date and number formatting functions bound to a specific locale and time-zone. >>> fmt = Format('en_US', UTC) >>> fmt.date(date(2007, 4, 1)) u'Apr 1, 2007' >>> fmt.decimal(1.2345) u'1.234' cCstj||_||_dS(sInitialize the formatter. :param locale: the locale identifier or `Locale` instance :param tzinfo: the time-zone info (a `tzinfo` instance or `None`) N(Rtparsetlocalettzinfo(tselfRR((s1/usr/lib/python2.7/site-packages/babel/support.pyt__init__,stmediumcCst||d|jS(sReturn a date formatted according to the given pattern. >>> fmt = Format('en_US') >>> fmt.date(date(2007, 4, 1)) u'Apr 1, 2007' :see: `babel.dates.format_date` R(RR(RRtformat((s1/usr/lib/python2.7/site-packages/babel/support.pyR5s cCst||d|jd|jS(sHReturn a date and time formatted according to the given pattern. >>> from pytz import timezone >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern')) >>> fmt.datetime(datetime(2007, 4, 1, 15, 30)) u'Apr 1, 2007 11:30:00 AM' :see: `babel.dates.format_datetime` RR(RRR(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pyR@s cCst||d|jd|jS(s+Return a time formatted according to the given pattern. >>> from pytz import timezone >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern')) >>> fmt.time(datetime(2007, 4, 1, 15, 30)) u'11:30:00 AM' :see: `babel.dates.format_time` RR(RRR(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pyRMs cCst|d|jS(sReturn an integer number formatted for the locale. >>> fmt = Format('en_US') >>> fmt.number(1099) u'1,099' :see: `babel.numbers.format_number` R(RR(Rtnumber((s1/usr/lib/python2.7/site-packages/babel/support.pyRYs cCst||d|jS(sReturn a decimal number formatted for the locale. >>> fmt = Format('en_US') >>> fmt.decimal(1.2345) u'1.234' :see: `babel.numbers.format_decimal` R(R R(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pytdecimalds cCst||d|jS(sReturn a number in the given currency formatted for the locale. :see: `babel.numbers.format_currency` R(R R(RRtcurrency((s1/usr/lib/python2.7/site-packages/babel/support.pyRoscCst||d|jS(sReturn a number formatted as percentage for the locale. >>> fmt = Format('en_US') >>> fmt.percent(0.34) u'34%' :see: `babel.numbers.format_percent` R(R R(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pytpercentvs cCst|d|jS(sReturn a number formatted using scientific notation for the locale. :see: `babel.numbers.format_scientific` R(R R(RR((s1/usr/lib/python2.7/site-packages/babel/support.pyt scientificsN( t__name__t __module__t__doc__tNoneRRRRRRRRR(((s1/usr/lib/python2.7/site-packages/babel/support.pyR!s      cBs(eZdZddddgZdZdZeeZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z RS(!sClass for proxy objects that delegate to a specified function to evaluate the actual object. >>> def greeting(name='world'): ... return 'Hello, %s!' % name >>> lazy_greeting = LazyProxy(greeting, name='Joe') >>> print lazy_greeting Hello, Joe! >>> u' ' + lazy_greeting u' Hello, Joe!' >>> u'(%s)' % lazy_greeting u'(Hello, Joe!)' This can be used, for example, to implement lazy translation functions that delay the actual translation until the string is actually used. The rationale for such behavior is that the locale of the user may not always be available. In web applications, you only know the locale when processing a request. The proxy implementation attempts to be as complete as possible, so that the lazy objects should mostly work as expected, for example for sorting: >>> greetings = [ ... LazyProxy(greeting, 'world'), ... LazyProxy(greeting, 'Joe'), ... LazyProxy(greeting, 'universe'), ... ] >>> greetings.sort() >>> for greeting in greetings: ... print greeting Hello, Joe! Hello, universe! Hello, world! t_funct_argst_kwargst_valuecOsPtj|d|tj|d|tj|d|tj|dddS(NR#R$R%R&(tobjectt __setattr__R"(Rtfunctargstkwargs((s1/usr/lib/python2.7/site-packages/babel/support.pyRscCsD|jdkr=|j|j|j}tj|d|n|jS(NR&(R&R"R#R$R%R'R((Rtvalue((s1/usr/lib/python2.7/site-packages/babel/support.pyR,scCs ||jkS(N(R,(Rtkey((s1/usr/lib/python2.7/site-packages/babel/support.pyt __contains__scCs t|jS(N(tboolR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt __nonzero__scCs t|jS(N(tdirR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__dir__scCs t|jS(N(titerR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__iter__scCs t|jS(N(tlenR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__len__scCs t|jS(N(tstrR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__str__scCs t|jS(N(tunicodeR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt __unicode__scCs |j|S(N(R,(Rtother((s1/usr/lib/python2.7/site-packages/babel/support.pyt__add__scCs ||jS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__radd__scCs |j|S(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__mod__scCs ||jS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__rmod__scCs |j|S(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__mul__scCs ||jS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__rmul__scOs|j||S(N(R,(RR*R+((s1/usr/lib/python2.7/site-packages/babel/support.pyt__call__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__lt__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__le__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__eq__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__ne__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__gt__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__ge__scCst|j|dS(N(tdelattrR,(Rtname((s1/usr/lib/python2.7/site-packages/babel/support.pyt __delattr__scCst|j|S(N(tgetattrR,(RRJ((s1/usr/lib/python2.7/site-packages/babel/support.pyt __getattr__scCst|j||dS(N(tsetattrR,(RRJR,((s1/usr/lib/python2.7/site-packages/babel/support.pyR(scCs|j|=dS(N(R,(RR-((s1/usr/lib/python2.7/site-packages/babel/support.pyt __delitem__scCs |j|S(N(R,(RR-((s1/usr/lib/python2.7/site-packages/babel/support.pyt __getitem__scCs||j|R?R@RARBRCRDRERFRGRHRKRMR(RORPRQ(((s1/usr/lib/python2.7/site-packages/babel/support.pyRs>"                            cBseZdZdZd edZd d edZeeZdZe dZ dZ dZ dZ d Zd Zd Zd ZRS(s&An extended translation catalog class.tmessagescCsMtjj|d|tdt|ddg|_||_i|_dS(sInitialize the translations catalog. :param fileobj: the file-like object the translation should be read from tfpRJN( tgettexttGNUTranslationsRtfilterR"RLtfilestdomaint_domains(RtfileobjRZ((s1/usr/lib/python2.7/site-packages/babel/support.pyRs! cCs|dk rOt|ttfs-|g}ng|D]}t|^q4}n|sa|j}ntj|||}|stjS|dt |dd|S(sLoad translations from the given directory. :param dirname: the directory containing the ``MO`` files :param locales: the list of locales in order of preference (items in this list can be either `Locale` objects or locale strings) :param domain: the message domain :return: the loaded catalog, or a ``NullTranslations`` instance if no matching translations were found :rtype: `Translations` R\trbRZN( R"t isinstancetlistttupleR7tDEFAULT_DOMAINRVtfindtNullTranslationstopen(tclstdirnametlocalesRZRtfilename((s1/usr/lib/python2.7/site-packages/babel/support.pytloads  "  cCs#dt|j|jjdfS(Ns <%s: "%s">sproject-id-version(ttypeRt_infotget(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__repr__3scCst|d|j}|r7||jkr7|j|S|jj|}|rk|dk rk|j|n|j|||j|<|S(sAdd the given translations to the catalog. If the domain of the translations is different than that of the current catalog, they are added as a catalog that is only accessible by the various ``d*gettext`` functions. :param translations: the `Translations` instance with the messages to add :param merge: whether translations for message domains that have already been added should be merged with the existing translations :return: the `Translations` instance (``self``) so that `merge` calls can be easily chained :rtype: `Translations` RZN(RLRaRZtmergeR[RlR"t add_fallback(Rt translationsRnRZtexisting((s1/usr/lib/python2.7/site-packages/babel/support.pytadd7s   cCsQt|tjrM|jj|jt|trM|jj|jqMn|S(sMerge the given translations into the catalog. Message translations in the specified catalog override any messages with the same identifier in the existing catalog. :param translations: the `Translations` instance with the messages to merge :return: the `Translations` instance (``self``) so that `merge` calls can be easily chained :rtype: `Translations` (R^RVRWt_catalogtupdateRRYtextend(RRp((s1/usr/lib/python2.7/site-packages/babel/support.pyRnTs cCs|jj||j|S(sULike ``gettext()``, but look the message up in the specified domain. (R[RlRV(RRZtmessage((s1/usr/lib/python2.7/site-packages/babel/support.pytdgettextgscCs|jj||j|S(sWLike ``lgettext()``, but look the message up in the specified domain. (R[Rltlgettext(RRZRv((s1/usr/lib/python2.7/site-packages/babel/support.pyt ldgettextmscCs|jj||j|S(sVLike ``ugettext()``, but look the message up in the specified domain. (R[Rltugettext(RRZRv((s1/usr/lib/python2.7/site-packages/babel/support.pyt dugettextsscCs"|jj||j|||S(sVLike ``ngettext()``, but look the message up in the specified domain. (R[Rltngettext(RRZtsingulartpluraltnum((s1/usr/lib/python2.7/site-packages/babel/support.pyt dngettextyscCs"|jj||j|||S(sWLike ``lngettext()``, but look the message up in the specified domain. (R[Rlt lngettext(RRZR}R~R((s1/usr/lib/python2.7/site-packages/babel/support.pyt ldngettextscCs"|jj||j|||S(sVLike ``ungettext()`` but look the message up in the specified domain. (R[Rlt ungettext(RRZR}R~R((s1/usr/lib/python2.7/site-packages/babel/support.pyt dungettextsN(RR R!RaR"RRit classmethodRmtTrueRrRnRwRyR{RRR(((s1/usr/lib/python2.7/site-packages/babel/support.pyR s          (R!RRRRVt babel.coreRt babel.datesRRRRt babel.numbersRR R R R R t babel.utilRRt__all__t __docformat__R'RRRWR(((s1/usr/lib/python2.7/site-packages/babel/support.pyts ".hPK[E site-packages/babel/__init__.pycnu[ Mc@s{dZddlTdZyGddlmZmZyedjZWnek r[dZnXWne k rvdZnXdS(sIntegrated collection of utilities that assist in internationalizing and localizing applications. This package is basically composed of two major parts: * tools to build and work with ``gettext`` message catalogs * a Python interface to the CLDR (Common Locale Data Repository), providing access to various locale display names, localized number and date formatting, etc. :see: http://www.gnu.org/software/gettext/ :see: http://docs.python.org/lib/module-gettext.html :see: http://www.unicode.org/cldr/ i(t*srestructuredtext en(tget_distributiontResolutionErrortBabelN( t__doc__t babel.coret __docformat__t pkg_resourcesRRtversiont __version__tNonet ImportError(((s2/usr/lib/python2.7/site-packages/babel/__init__.pyts   PK[ U'22site-packages/babel/support.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2007 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://babel.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision # history and logs, available at http://babel.edgewall.org/log/. """Several classes and functions that help with integrating and using Babel in applications. .. note: the code in this module is not used by Babel itself """ from datetime import date, datetime, time import gettext from babel.core import Locale from babel.dates import format_date, format_datetime, format_time, LC_TIME from babel.numbers import format_number, format_decimal, format_currency, \ format_percent, format_scientific, LC_NUMERIC from babel.util import set, UTC __all__ = ['Format', 'LazyProxy', 'Translations'] __docformat__ = 'restructuredtext en' class Format(object): """Wrapper class providing the various date and number formatting functions bound to a specific locale and time-zone. >>> fmt = Format('en_US', UTC) >>> fmt.date(date(2007, 4, 1)) u'Apr 1, 2007' >>> fmt.decimal(1.2345) u'1.234' """ def __init__(self, locale, tzinfo=None): """Initialize the formatter. :param locale: the locale identifier or `Locale` instance :param tzinfo: the time-zone info (a `tzinfo` instance or `None`) """ self.locale = Locale.parse(locale) self.tzinfo = tzinfo def date(self, date=None, format='medium'): """Return a date formatted according to the given pattern. >>> fmt = Format('en_US') >>> fmt.date(date(2007, 4, 1)) u'Apr 1, 2007' :see: `babel.dates.format_date` """ return format_date(date, format, locale=self.locale) def datetime(self, datetime=None, format='medium'): """Return a date and time formatted according to the given pattern. >>> from pytz import timezone >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern')) >>> fmt.datetime(datetime(2007, 4, 1, 15, 30)) u'Apr 1, 2007 11:30:00 AM' :see: `babel.dates.format_datetime` """ return format_datetime(datetime, format, tzinfo=self.tzinfo, locale=self.locale) def time(self, time=None, format='medium'): """Return a time formatted according to the given pattern. >>> from pytz import timezone >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern')) >>> fmt.time(datetime(2007, 4, 1, 15, 30)) u'11:30:00 AM' :see: `babel.dates.format_time` """ return format_time(time, format, tzinfo=self.tzinfo, locale=self.locale) def number(self, number): """Return an integer number formatted for the locale. >>> fmt = Format('en_US') >>> fmt.number(1099) u'1,099' :see: `babel.numbers.format_number` """ return format_number(number, locale=self.locale) def decimal(self, number, format=None): """Return a decimal number formatted for the locale. >>> fmt = Format('en_US') >>> fmt.decimal(1.2345) u'1.234' :see: `babel.numbers.format_decimal` """ return format_decimal(number, format, locale=self.locale) def currency(self, number, currency): """Return a number in the given currency formatted for the locale. :see: `babel.numbers.format_currency` """ return format_currency(number, currency, locale=self.locale) def percent(self, number, format=None): """Return a number formatted as percentage for the locale. >>> fmt = Format('en_US') >>> fmt.percent(0.34) u'34%' :see: `babel.numbers.format_percent` """ return format_percent(number, format, locale=self.locale) def scientific(self, number): """Return a number formatted using scientific notation for the locale. :see: `babel.numbers.format_scientific` """ return format_scientific(number, locale=self.locale) class LazyProxy(object): """Class for proxy objects that delegate to a specified function to evaluate the actual object. >>> def greeting(name='world'): ... return 'Hello, %s!' % name >>> lazy_greeting = LazyProxy(greeting, name='Joe') >>> print lazy_greeting Hello, Joe! >>> u' ' + lazy_greeting u' Hello, Joe!' >>> u'(%s)' % lazy_greeting u'(Hello, Joe!)' This can be used, for example, to implement lazy translation functions that delay the actual translation until the string is actually used. The rationale for such behavior is that the locale of the user may not always be available. In web applications, you only know the locale when processing a request. The proxy implementation attempts to be as complete as possible, so that the lazy objects should mostly work as expected, for example for sorting: >>> greetings = [ ... LazyProxy(greeting, 'world'), ... LazyProxy(greeting, 'Joe'), ... LazyProxy(greeting, 'universe'), ... ] >>> greetings.sort() >>> for greeting in greetings: ... print greeting Hello, Joe! Hello, universe! Hello, world! """ __slots__ = ['_func', '_args', '_kwargs', '_value'] def __init__(self, func, *args, **kwargs): # Avoid triggering our own __setattr__ implementation object.__setattr__(self, '_func', func) object.__setattr__(self, '_args', args) object.__setattr__(self, '_kwargs', kwargs) object.__setattr__(self, '_value', None) def value(self): if self._value is None: value = self._func(*self._args, **self._kwargs) object.__setattr__(self, '_value', value) return self._value value = property(value) def __contains__(self, key): return key in self.value def __nonzero__(self): return bool(self.value) def __dir__(self): return dir(self.value) def __iter__(self): return iter(self.value) def __len__(self): return len(self.value) def __str__(self): return str(self.value) def __unicode__(self): return unicode(self.value) def __add__(self, other): return self.value + other def __radd__(self, other): return other + self.value def __mod__(self, other): return self.value % other def __rmod__(self, other): return other % self.value def __mul__(self, other): return self.value * other def __rmul__(self, other): return other * self.value def __call__(self, *args, **kwargs): return self.value(*args, **kwargs) def __lt__(self, other): return self.value < other def __le__(self, other): return self.value <= other def __eq__(self, other): return self.value == other def __ne__(self, other): return self.value != other def __gt__(self, other): return self.value > other def __ge__(self, other): return self.value >= other def __delattr__(self, name): delattr(self.value, name) def __getattr__(self, name): return getattr(self.value, name) def __setattr__(self, name, value): setattr(self.value, name, value) def __delitem__(self, key): del self.value[key] def __getitem__(self, key): return self.value[key] def __setitem__(self, key, value): self.value[key] = value class Translations(gettext.GNUTranslations, object): """An extended translation catalog class.""" DEFAULT_DOMAIN = 'messages' def __init__(self, fileobj=None, domain=DEFAULT_DOMAIN): """Initialize the translations catalog. :param fileobj: the file-like object the translation should be read from """ gettext.GNUTranslations.__init__(self, fp=fileobj) self.files = filter(None, [getattr(fileobj, 'name', None)]) self.domain = domain self._domains = {} def load(cls, dirname=None, locales=None, domain=DEFAULT_DOMAIN): """Load translations from the given directory. :param dirname: the directory containing the ``MO`` files :param locales: the list of locales in order of preference (items in this list can be either `Locale` objects or locale strings) :param domain: the message domain :return: the loaded catalog, or a ``NullTranslations`` instance if no matching translations were found :rtype: `Translations` """ if locales is not None: if not isinstance(locales, (list, tuple)): locales = [locales] locales = [str(locale) for locale in locales] if not domain: domain = cls.DEFAULT_DOMAIN filename = gettext.find(domain, dirname, locales) if not filename: return gettext.NullTranslations() return cls(fileobj=open(filename, 'rb'), domain=domain) load = classmethod(load) def __repr__(self): return '<%s: "%s">' % (type(self).__name__, self._info.get('project-id-version')) def add(self, translations, merge=True): """Add the given translations to the catalog. If the domain of the translations is different than that of the current catalog, they are added as a catalog that is only accessible by the various ``d*gettext`` functions. :param translations: the `Translations` instance with the messages to add :param merge: whether translations for message domains that have already been added should be merged with the existing translations :return: the `Translations` instance (``self``) so that `merge` calls can be easily chained :rtype: `Translations` """ domain = getattr(translations, 'domain', self.DEFAULT_DOMAIN) if merge and domain == self.domain: return self.merge(translations) existing = self._domains.get(domain) if merge and existing is not None: existing.merge(translations) else: translations.add_fallback(self) self._domains[domain] = translations return self def merge(self, translations): """Merge the given translations into the catalog. Message translations in the specified catalog override any messages with the same identifier in the existing catalog. :param translations: the `Translations` instance with the messages to merge :return: the `Translations` instance (``self``) so that `merge` calls can be easily chained :rtype: `Translations` """ if isinstance(translations, gettext.GNUTranslations): self._catalog.update(translations._catalog) if isinstance(translations, Translations): self.files.extend(translations.files) return self def dgettext(self, domain, message): """Like ``gettext()``, but look the message up in the specified domain. """ return self._domains.get(domain, self).gettext(message) def ldgettext(self, domain, message): """Like ``lgettext()``, but look the message up in the specified domain. """ return self._domains.get(domain, self).lgettext(message) def dugettext(self, domain, message): """Like ``ugettext()``, but look the message up in the specified domain. """ return self._domains.get(domain, self).ugettext(message) def dngettext(self, domain, singular, plural, num): """Like ``ngettext()``, but look the message up in the specified domain. """ return self._domains.get(domain, self).ngettext(singular, plural, num) def ldngettext(self, domain, singular, plural, num): """Like ``lngettext()``, but look the message up in the specified domain. """ return self._domains.get(domain, self).lngettext(singular, plural, num) def dungettext(self, domain, singular, plural, num): """Like ``ungettext()`` but look the message up in the specified domain. """ return self._domains.get(domain, self).ungettext(singular, plural, num) PK[KS(site-packages/babel/localedata/fa_AF.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q Ncbabel.numbers NumberPattern q )q}q(Uexp_precqNUscaleqKdU frac_precqKKqUsuffixqX%'‬'qhqUint_precqKKqUpatternqX'‪'#,##0%'‬'qUprefixqX'‪'qX-'‪'qqUexp_plusqNUgroupingq KKq!ubsU week_dataq"}q#(U weekend_startq$KU first_dayq%KU weekend_endq&KuU time_formatsq'}q(U languagesq)}q*(Unlq+X هالندیq,Uptq-Xپرتگالیq.Unoq/Xنارویژیq0Uhrq1Xکروشیاییq2Uneq3X نیپالیq4Uisq5Xآیسلندیq6Umnq7Xمغلیq8Ukoq9Xکوریاییq:Uitq;XایتالویqUfaq?Xدریq@UplqAX پولندیqBUgaqCXآیرلندیqDUtgqEX تاجکیqFUfiqGX فنلندیqHUkyqIX قرغزیqJUsvqKX سویدنیqLUidqMXاندونیزیاییqNUesqOXهسپانویqPuU territoriesqQ}qR(UBDqSXبنگله‌دیشqTUBEqUX بلجیمqVUBGqWXبلغاریاqXUBAqYX%بوسنیا و هرزه‌گویناqZUBNq[X برونیq\UBOq]Xبولیویاq^UJPq_X جاپانq`UWSqaX ساموآqbUBRqcX برازیلqdUBSqeX بهاماسqfUBYqgXروسیهٔ سفیدqhURWqiX روآنداqjUROqkXرومانیاqlUGWqmXگینیا بیسائوqnUGTqoXگواتیمالاqpUGQqqXگینیا استواییqrUGYqsX گیاناqtUGDquXگریناداqvUGNqwX گینیاqxUHRqyX کروشیاqzUHTq{X هایتیq|USVq}Xالسلوادورq~UHNqXهاندوراسqUVEqXونزویلاqUPTqX پرتگالqUPYqXپاراگوایqUPAqX پانامهqUPGqXپاپوا نیو گینیاqUPEqXپیروqUPLqX پولندqUEEqXاستونیاqUECqXاکوادورqUETqXایتوپیاqUZWqXزیمبابویqUESqXهسپانیهqUERqXاریتریاqUMGqXمادغاسکرqUUYqXیوروگوایqUMNqXمنگولیاqUUSqX&ایالات متحدهٔ امریکاqUMTqX مالتاqUMRqXموریتانیاqUMYqXمالیزیاqUMXqX مکسیکوqUMZqXموزمبیقqUFIqX فنلندqUFMqXمیکرونزیاqUNIqXنیکاراگواqUNLqX هالندqUNOqX نارویqUNGqX نیجریاqUNZqXزیلاند جدیدqUNPqX نیپالqUCHqXسویسqUCOqXکولمبیاqUCLqXچلیqUCGqX کانگوqUCFqXافریقای مرکزیqUCDqX*جمهوری دموکراتیک کانگوqUCRqXکاستریکاqUCUqX کیوباqUKGqXقرغزستانqUKEqX کینیاqUKHqXکمپوچیاqUKNqXسنت کیتس و نیویسqUKMqX کومورqUSTqX#سائو تومه و پرینسیپqUSKqXسلواکیاqUKRqXکوریای جنوبیqUSIqX سلونیاqUKPqXکوریای شمالیqUSOqXسومالیهqUSNqXسینیگالqUSLqXسیرالیونqUSBqXجزایر سلومونqUSGqXسینگاپورqUSEqX سویدنqUDKqX دنمارکqULKqXسریلانکاqULVqX لاتویاqULTqXلتوانیاqUTJqXتاجکستانqULSqX لیسوتوqULYqX لیبیاqUVCqX'سنت وینسنت و گرینادینqUAEqX"امارات متحدهٔ عربیqUADqX اندوراrUAGrX انتیگوا و باربوداrUISrX آیسلندrUALrXالبانیاrUAOrX انگولاrUARr Xارجنتاینr UAUr Xآسترالیاr UIEr X آیرلندrUIDrXاندونیزیاrUUArX اکراینruUdecimal_formatsr}rU date_formatsr}rUcurrency_symbolsr}rUAFNrX؋rsU time_zonesr}rUscriptsr}rUMongrXمغلیr sUvariantsr!}r"Unumber_symbolsr#}r$(U minusSignr%X−r&Udecimalr'X٫r(U percentSignr)X٪r*Ugroupr+X٬r,UnativeZeroDigitr-X۰r.uUcurrency_namesr/}r0(UMXNr1Xپزوی مکسیکوr2UUSDr3Xدالر امریکاr4UAUDr5Xدالر آسترالیاr6UCHFr7Xفرانک سویسr8UNOKr9Xکرون نارویr:UBYRr;Xروبل روسیهٔ سفیدr<USGDr=Xدالر سینگاپورr>UJPYr?Xین جاپانr@UTJSrAXسامانی تاجکستانrBUNLGrCXگیلدر هالندrDUBNDrEXدالر برونیrFUSEKrGXکرون سویدنrHUDKKrIXکرون دنمارکrJUCADrKXدالر کاناداrLuUmonthsrM}rN(U stand-alonerO}rPUnarrowrQ}rR(KXجrSKXفrTKXمrUKXاrVKXمrWKXجrXKXجrYKXاrZK Xسr[K Xاr\K Xنr]K Xدr^usUformatr_}r`(Uwidera}rb(KX جنوریrcKX فبروریrdKXمارچreKX اپریلrfKXمیrgKXجونrhKX جولایriKXاگستrjK X سپتمبرrkK X اکتوبرrlK X نومبرrmK X دسمبرrnuU abbreviatedro}rp(KXجنوrqK XدسمrrKXمـیrsKXجونrtKXجولruuuuUcurrency_formatsrv}rwUdaysrx}ryU meta_zonesrz}r{Uerasr|}r}u.PK[y(site-packages/babel/localedata/ar_QA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precq KKq!Usuffixq"Xq#h#q$Uint_precq%KKq&Upatternq'X#0.###q(Uprefixq)h#h#q*Uexp_plusq+NUgroupingq,MMq-ubsU date_formatsq.}q/Ucurrency_symbolsq0}q1U time_zonesq2}q3Uscriptsq4}q5UItalq6X#اللأيطالية القديمةq7sUvariantsq8}q9Unumber_symbolsq:}q;Ucurrency_namesq<}q=Umonthsq>}q?Ucurrency_formatsq@}qANh)qB}qC(hNhKh KKqDh"h#h#qEh%KKqFh'X¤#0.00qGh)X¤qHX-¤qIqJh+Nh,h-ubsUdaysqK}qLUformatqM}qNU abbreviatedqO}qP(KXالاثنينqQKXالثلاثاءqRKXالأربعاءqSKX الخميسqTKX الجمعةqUKX السبتqVKX الأحدqWussU meta_zonesqX}qYUerasqZ}q[u.PK[_.ll(site-packages/babel/localedata/aa_ET.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[// %site-packages/babel/localedata/ts.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXKotara yo sungulaq KXKotara ya vumbirhiq KXKotara ya vunharhuqKXKotara ya vumunequU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q](Uelq^X Xi Girikiq_Uenq`X Xi NgheziqaUisqbX hi xi IcelandqcUitqdX Xi IthaliqeUcsqfXXi CzechqgUetqhX hi xi EstoniaqiUesqjXXi spainqkUruqlX Xi RhaxiyaqmUnlqnXXi bunuqoUptqpXPutukeziqqUnoqrX Xi NorwayqsUtsqtXXitsongaquUlvqvX hi xi LatviaqwUltqxXhi xi LithuaniaqyUroqzX hi xi Romaniaq{Uplq|X Xi Polixiq}Ufrq~XXi FurwaqUdeqX Xi JarimaniqUdaqX Xi DanishqUfiqX Xi FinnishqUhuqX hi xi HungaryqUjaqX Xi JapaniqUheqXXiHeberuqUkoqXXikoreaqUsvqX Xi SwidenquU territoriesq}qUdecimal_formatsq}qNh)q}q(h!Nh#Kh$KKqh&h'h'qh)KKqh+X #,##0.###qh-h'h.qh0Nh1KKqubsU date_formatsq}q(UmediumqhG)q}q(h+X yyyy MMM dqhKX%(yyyy)s %(MMM)s %(d)squbUfullqhG)q}q(h+XEEEE, yyyy MMMM ddqhKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)squbUlongqhG)q}q(h+X yyyy MMMM dqhKX%(yyyy)s %(MMMM)s %(d)squbUshortqhG)q}q(h+Xyy/MM/ddqhKX%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}q(UdecimalqX,qUgroupqX quUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXSungutiqKX NyenyenyaniqKX NyenyankuluqKX DzivamisokoqKX MudyaxihiqKX KhotavuxikaqKXMawuwaniqKXMhawuriqK XNdzhatiqK X NhlangulaqK XHukuriqK X N'wendzamhalaquU abbreviatedq}q(KXSunqKXYanqKXKulqKXDziqKXMudqKXKhoqKXMawqKXMhaqK XNdzqK XNhlqK XHukqK XN'wquuuUcurrency_formatsq}qNh)q}q(h!Nh#Kh$KKqh&h'h'qh)KKqh+X ¤#,##0.00qh-X¤qX-¤qqh0Nh1KKqubsUdaysq}q(U stand-aloner}rUnarrowr}r(KhKhKhKhKhKhKhusUformatr}r(Uwider}r(KX MusumbhunukurKX Ravumbirhir KX Ravunharhur KXRavumuner KX Ravuntlhanur KX Mugqivelar KXSontoruU abbreviatedr}r(KXMusrKXBirrKXHarrKXNerKXTlhrKXMugrKXSonruuuU meta_zonesr}rUerasr}r(Uwider}r(KXBCrKXADruU abbreviatedr }r!(KXBCr"KXADr#uuu.PK[nM%site-packages/babel/localedata/da.datnu[}q(U zone_formatsq}q(UregionqX%s tidqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1. kvartalqKX 2. kvartalqKX 3. kvartalqKX 4. kvartalquU abbreviatedq}q(KXK1q KXK2q!KXK3q"KXK4q#uuuUperiodsq$}q%(Uamq&Xf.m.q'Upmq(Xe.m.q)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X %qFhFqGh7KKqHh9X#,##0 %qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9XHH.mm.ssqXUformatqYX%(HH)s.%(mm)s.%(ss)sqZubUfullq[hU)q\}q](h9X HH.mm.ss vq^hYX%(HH)s.%(mm)s.%(ss)s %(v)sq_ubUlongq`hU)qa}qb(h9X HH:mm:ss zqchYX%(HH)s:%(mm)s:%(ss)s %(z)sqdubUshortqehU)qf}qg(h9XHH.mmqhhYX %(HH)s.%(mm)sqiubuU languagesqj}qk(UgvqlXmanxqmUguqnXgujaratiqoUscnqpX sicilianskqqUromqrXromaniqsUalgqtXalgonkisk sprogquUaleqvXaleutiskqwUscoqxXskotskqyUmniqzXmanipuriq{Ugdq|Xskotsk gæliskq}Ugaq~XirskqUmnoqX manobo sprogqUosaqXosageqUgnqXguaraniqUaltqX sydaltaiskqUglqXgaliciskqUmwrqXmarwariqUtyqX tahitianskqUtwqXtwiqUttqXtatariskqUtrqXtyrkiskqUtsqXtsongaqUtnqXtswanaqUtoqXtonganskqUausqXaustralsk sprogqUavqXavariskqUtkqX turkmenskqUthqX thailandskqUroaqX romansk sprogqUtgqXtajikqUteqXteluguqUugaqX ugaristiskqUmwlqX mirandesiskqUkcgqXtyapqUsmiqX samisk sprogqUfatqXfantiqUfanqXfangqUwoqXwolofqUrmqX rætoromanskqUdinqXdinkaqUblaqXsiksikaqUcmcqXchamiske sprogqUmlqX malayalamqUzhqXkinesiskqUtemqXtemneqUen_CAqXcanadisk engelskqUnwcqXklassisk newariskqUzaqXzhuangqUcauqXkaukasisk sprogqUzuqXzuluqUterqXterenoqUtetqXtetumqUmncqXmanchuqUkutqXkutenajqUsukqXsukumaqUkumqXkymykqUsusqXsusuqUnewqXnewariqUsuxqXsumeriskqUdenqX athapaskiskqUmenqXmendeqUmulqX flere sprogqUlezqXlezghianqUrootqXrotqUekaqXekajukqUakkqXakkadiskqUdraqXdravidisk sprogqUjrbqXjødisk-arabiskqUsgnqX tegnsprogqUsgaqXoldirskqUapaqX apachesprogqUbraqXbrajqUchbqXchibchaqUchgqXchagataiqUchkqXchuukeseqUchmrXmarirUchnrXchinookrUchorXchoctawrUchprX chipewyanrUchrrXcherokeer Uchyr Xcheyenner Utir Xtigrinyar UvotrXvotiskrUmgrXmalagasyrUibarXibanrUmorX moldoviskrUmnrXmongolskrUmirXmaorirUmhrX marshalleserUmkrX makedonskrUmtrX maltesiskrUcair Xmellemamerikansk indiansk sprogr!Udelr"Xdelawarer#Umsr$Xmalayr%Umrr&X marathiskr'Utar(Xtamilskr)Umyr*X burmesiskr+Ucadr,Xcaddor-Usrnr.X sranan tongor/Utair0X thaisprogr1Uafhr2Xafrihilir3Usitr4Xsino-tibetansk sprogr5Uenmr6X middelengelskr7Uen_AUr8Xaustralsk engelskr9Unynr:Xnyankoler;Unyor<X nyoro sprogr=Unymr>Xnyamwezir?Usior@X sioux sprogrAUmaprBXaustronesisk sprogrCUmasrDXmasairEUlahrFXlahndarGUladrHXladinorIUfyrJXfrisiskrKUsnkrLXsoninkerMUfarNXpersiskrOUmadrPXmadureserQUmagrRXmagahirSUmairTXmaithilirUUfirVXfinskrWUfjrXXfijianskrYUmanrZXmandingor[Uegyr\X oldegyptiskr]Uzndr^Xzander_Ussr`XswatiraUsrrbXserbiskrcUsqrdXalbanskreUswrfXswahilirgUsvrhXsvenskriUsurjX sundanesiskrkUstrlXsydsothormUskrnX slovakiskroUsirpX singalesiskrqUshrrX serbokroatiskrsUsortXsomaliskruUsnrvXshonarwUsmrxXsamoanskryUslrzXslovenskr{Uscr|Xsardinskr}Usar~XsanskritrUsgrXsangorUserX nordsamiskrUsdrXsindhirUzenrXzenagarUkbdrX kabardianrUafarXafro-asiatisk sprogrUcsbrX kasjubiskrUlgrXgandarUlbrX luxembourgskrUfiurXfinsk-ugrisk sprogrUlnrXlingalarUlorXlaotiskrUlirX limburgskrUbynrXblinrUltrXlitauiskrUlurX luba-KatangarUfilrX filippinskrUyirXjiddischrUnonrX oldislandskrUcebrXcebuanorUyorXyorubarUnogrXnogairUbatrX baltisk sprogrUdakrXdakotarUdarrXdargwarUdayrXdayakrUssarXnilo-saharansk sprogrUkperXkpellerUelrXgræskrUeorX esperantorUenrXengelskrUlamrXlambarUeerXewerUmdfrXmoksharUfrrXfranskrUmdrrXmandarrUetrXestiskrUesrXspanskrUrurXrussiskrUgonrXgondirUgohrX oldhøjtyskrUsmsrX skolt samirUsmnrX inari samirUsmjrX lule samirUde_ATrXøstrigsk tyskrUgotrXgotiskrUrnrXrundirUrorXrumænskrUdsbrX nedersorbiskrUsmarX sydsamiskrUgorrX gorontalorUastrXasturiskrUwalrXwalamorUcrhrX krim tyrkiskrUathrXathapaskisk sprogrUgezrXgeezrUxhrXxhosarUffrXfulahrUkforXkororUmakrXmakasarrUzaprXzapotecrUkokrXkonkanirUzxxrXintet sprogligt indholdrUkosrXkosraeanrUforXfærøskrUtogrXnyasa tonganskrUhuprXhuparUudmrXudmurtrUbejrXbejar Ubemr Xbembar Utsir X tsimshiskr UberrX berberiskrUnzirXnzimarUsairXsydamerikansk indiansk sprogrUangrX oldengelskrUprarX prakritsprogrUbhorXbhojpurirUsalrXsalikisk sprogrUprorXoldprovencalskrUrajrX rajasthanirUsadr Xsandawer!Uanpr"Xangikar#Ues_419r$Xlatinamerikansk spanskr%Urapr&Xrapanuir'Usasr(Xsasakr)Unqor*Xn-kor+Ucarr,Xcaribiskr-Uminr.X minangkabaur/Umicr0Xmicmacr1Uefir2Xefikr3Uarnr4X araukanskr5Uypkr6X yupisk sprogr7Umisr8X diverse sprogr9Ukacr:Xkachinr;Ukabr<Xkabyler=Ukaar>X karakalpakiskr?Ukajr@XjjurAUkamrBXkambarCUkarrDXkarenrEUkawrFXkawirGUfr_CHrHXschweizisk franskrIUtyvrJXtuvinianrKUfr_CArLXcanadisk franskrMUkarNXgeorgiskrOUdoirPXdogrirQUkgrRXkongorSUkkrTX kasakhiskrUUkjrVXkuanyamarWUkirXXkikuyurYUkorZXkoreanskr[Uknr\X kannaresiskr]Ukmr^Xkhmerr_Uklr`X grønlandskraUksrbXkashmirircUkrrdXkanurireUkwrfXcorniskrgUkvrhXkomiriUkurjXkurdiskrkUkyrlX kirgisiskrmUtklrnXtokelauroUbuarpX buriatiskrqUmgarrX middelirskrsUhitrtX hittitiskruUdyurvXdyularwUderxXtyskryUdarzXdanskr{Udzr|Xdzongkhar}Uluir~XluisenorUdvrXdivehirUhilrX hiligaynonrUhimrX himachalirUgemrXgermansk sprogrUcrprXkreolsk eller pidginsprogrUqurXquechuarUbasrXbasarUgbarXgbayarUbadrXbandarUbanrX balinesiskrUbalrXbaluchirUshnrXshanrUbairXbamilekisk sprogrUarprXarapahorUartrX kunstsprogrUarwrXarawakrUarcrX aramæiskrUen_USrXamerikansk engelskrUsemrXsemitisk sprogrUselrX selkupiskrUnubrX nubisk sprogrUbtkrXbatakrUlusrXlushairUmusrXcreekrUluarX luba-LuluarUirorXirokesisk sprogrUirarX iransk sprogrUmunrX mundasprogrUlunrXlundarUluorXluorUwarXvallonskrUtuprX tupisprogrUjvrX javanesiskrUzblrX blissymbolerrUtutrX altaisk sprogrUtumrXtumbukarUjarXjapanskrUcoprXkoptiskrUilorXilokorUlarXlatinrUgwirXgwichinrUundrXukendt eller ugyldigt sprogrUtlirXtlingitrUtlhrXklingonrUchrXchamorrorUcorX korsikanskrUcarX katalanskrUcerX tjetjenskrUponrXponaperUcyrXwalisiskrUsahrXyakutrUcsrXtjekkiskrUcrrXcreerUbntrXbanturUcvrXchuvashrUcurX kirkeslaviskrUlvrXlettiskrUdumrXmiddelhollandskrUptrX portugisiskrUduarXdualarUfrorX oldfranskrUyaprXyaprUfrmrX middelfranskrUtivrXtivirUfrsrX østfrisiskrUfrrrX nordfrisiskrUyaorXyaorUparXpunjabirUxalrXkalmykr Ues_ESr Xcastiliansk spanskr Upir Xpalir Uen_GBrXbritisk engelskrUgayrXgayorUotorX otomi sprogrUotarXosmannisk-tyrkiskrUhmnrXhmongrUmyvrXerzyarUgaarXgarUfurrXfriulianrUkhirX khoisansprogrUainr Xainur!Urarr"X rarotonganr#Uslar$X slavisk sprogr%Uver&Xvendar'Uvir(X vietnamesiskr)Uisr*Xislandskr+Ukhor,X khotanesiskr-Uiur.X inuktitutr/Uitr0X italienskr1Uvor2Xvolapykr3Uiir4X sichuan yir5Uikr6Xinupiaqr7Uior8Xidor9Uiner:Xindo-europæisk sprogr;Uiar<X interlinguar=Ujprr>Xjødisk-persiskr?Uier@X interlinguerAUidrBX indonesiskrCUigrDXigborEUpaprFX papiamentorGUeworHXewondorIUpaurJX palauanskrKUpaarLXpapua-australsk sprogrMUpagrNX pangasinanrOUsatrPXsantalirQUpalrRXpahlavirSUpamrTXpampangarUUsycrVXklassisk syriskrWUphirXXfilippinsk sprogrYUcelrZX keltisk sprogr[Uphnr\X fønikiskr]Unicr^XNiger-Congo sprogr_Uniar`XniasraUdgrrbXdogribrcUsyrrdXsyriskreUniurfXniueanrgUgswrhX schweizertyskriUcchrjXatsamrkUjborlXlojbanrmUnahrnXnahuatlroUsamrpX samaritanskrqUhairrXhaidarsUgmhrtXmiddelhøjtyskruUcusrvXkusjitisk sprogrwUwenrxX vendisk sprogryUadyrzXadygher{Uelxr|X elamitiskr}Uadar~XadangmerUpt_PTrXiberisk portugisiskrUhawrX hawaiianskrUbinrXbinirUbikrXbikolrUpt_BRrXbrasiliansk portugisiskrUmosrXmossirUmohrXmohawkrUtlrXtagalogrUzh_HansrXforenklet kinesiskrUzh_HantrXtraditionelt kinesiskrUtvlrXtuvalurUijorXijorUkmbrXkimbundurUpeorX oldpersiskrUumbrXumbundurUtmhrXtamashekrUfonrXfonrUhsbrX øvresorbiskrUberX hviderussiskrUbgrXbulgarskrUbarXbashkirrUpsrXpashtorUbmrXbambararUbnrXbengalskrUborX tibetanskrUbhrXbiharirUbirXbislamarUbrrXbretonskrUbsrXbosniskrUruprX arumænskrUzzarXzazarUomrXoromorUojrXojibwarUacerX achinesiskrUachrXacolirUocrX occitanskrUkrurXkurukhrUsrrrXsererrUkrorXkrurUkrlrXkarelskrUkrcrXkaratjai-balkarrUndsrX nedertyskrUosrXossetiskrUorrXoriyarUsogrX sogdianskrUnsorX nordsothorUsonrXsonghairUde_CHrXschweizerhøjtyskrUvairXvairUwakrXwakashansk sprogrUlolrXmongorUmkhrXmon-khmer sprogrUawarXawadhirUlozrXlozirUgilrX gilbertesiskrUwasrXwashorUwarrXwarayrUhzrXhererorUhyrXarmenskrUanrX aragonesiskrUsidrXsidamorUhrrXkroatiskrUhtrXhaitiskrUhurXungarskrUhirXhindirUhorX Hiri MoturUharXhausarUbugrX buginesiskrUherXhebraiskr Uuzr Xusbekiskr Uurr Xurdur UplrXpolskrUukrXukrainskrUugrXuiguriskrUaarXafarrUabrX abkhasiskrUaerXavestanrUafrX afrikaansrUakrXakanrUamrXamhariskrUnl_BEr Xflamskr!Ueur"Xbaskiskr#Uasr$X assamesiskr%Uarr&Xarabiskr'Uinhr(Xingushr)Utpir*X Tok Pisinr+Umynr,X mayasprogr-Uayr.Xaymarar/Ukhar0Xkhasir1Uazr2Xaserbajdsjanskr3Uincr4X indisk sprogr5Unlr6X hollandskr7Unnr8Xnynorskr9Unor:Xnorskr;Unar<Xnaurur=Unbr>X norsk bokmålr?Unair@Xnordamerikansk indiansk sprogrAUndrBX nordndebelerCUnerDX nepalesiskrEUngrFXndongarGUnyrHXnyanjarIUnaprJX neapolitanskrKUgrbrLXgreborMUgrcrNX oldgræskrOUnrrPX sydndebelerQUtigrRXtigrerSUnvrTXnavajorUUzunrVXzunirWUrwrXX kinyarwandarYUcperZX$engelsk baseret kreolsk eller pidginr[Ucpfr\X(fransk baseret kreolsk eller pidginsprogr]Ucppr^X-portugisisk baseret kreolsk eller pidginsprogr_uU territoriesr`}ra(UBDrbX BangladeshrcUBErdXBelgienreUBFrfX Burkina FasorgUBGrhX BulgarienriUVErjX VenezuelarkUBArlXBosnien-HercegovinarmUBBrnXBarbadosroUWFrpXWallis og FutunaøernerqUBLrrXSaint BarthélemyrsUBMrtXBermudaruUBNrvXBrunei DarussalamrwUBOrxXBoliviaryUBHrzXBahrainr{UBIr|XBurundir}UBJr~XBeninrUBTrXBhutanrU011rX VestafrikarUBVrXBouvetørUBWrXBotswanarU014rX ØstafrikarU015rX NordafrikarUBRrX BrasilienrU017rX CentralafrikarU018rXdet sydlige AfrikarU019rXAmerikarUBYrX HvideruslandrUBZrXBelizerULVrXLetlandrURWrXRwandarURSrXSerbienrUTLrX Timor-LesterURErXReunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadsjikistanrUROrX RumænienrUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX(South Georgia og De Sydlige SandwichøerrUGRrX GrækenlandrUGQrXÆkvatorialguinearUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrX Fransk GuyanarUGErXGeorgienrUGDrXGrenadarU021rXdet nordlige AmerikarUGBrXStorbritannienrUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GrønlandrU029rXCaribienrUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunesienrUJMrXJamaicarU013rX MellemamerikarUWSrXSamoarU419rXLatinamerika og CaribienrUHRrXKroatienrUBSrXBahamasrUHTrXHaitirUHUrXUngarnrUHKrX SAR HongkongrU039rX SydeuroparUHNrXHondurasrUFIrXFinlandrU142rXAsienrU030rX ØstasienrU034rXSydasienrU035rX SydøstasienrUPRrX Puerto RicorUPSrXDe palæstinensiske områderrUFKrXFalklandsøernerUIOrX,Det Britiske Territorium i Det Indiske OceanrUPWrXPalaur UPTr XPortugalr USJr XSvalbard og Jan Mayenr UMDrXRepublikken MoldovarUFMrXMikronesiens Forenede StaterrUIQrXIrakrUPArXPanamarUPFrXFransk PolynesienrUPGrXPapua Ny GuinearUPErXPerurUPKrXPakistanrUPHrX FilippinernerUFOr X Færøerner!UPNr"XPitcairnr#UPLr$XPolenr%UPMr&XSaint Pierre og Miquelonr'UZMr(XZambiar)UEHr*X Vestsaharar+URUr,XRuslandr-UEEr.XEstlandr/UEGr0XEgyptenr1UZAr2X Sydafrikar3UECr4XEcuadorr5UITr6XItalienr7UVNr8XVietnamr9UZZr:Xukendt eller ugyldigt områder;USBr<X Salomonøerner=UETr>XEtiopienr?USOr@XSomaliarAUZWrBXZimbabwerCUSArDX Saudi-ArabienrEUESrFXSpanienrGUERrHXEritrearIUMErJX MontenegrorKUAQrLX AntarktisrMUMGrNX MadagaskarrOUMFrPX Saint MartinrQUMArRXMarokkorSUMCrTXMonacorUUUZrVX UsbekistanrWUMMrXXMyanmarrYUMLrZXMalir[UMOr\X SAR Macaor]UMNr^X Mongolietr_UHMr`XHeard- og McDonald-øerneraUASrbXAmerikansk SamoarcUMKrdXRepublikken MakedonienreUMUrfX MauritiusrgUMTrhXMaltariUMWrjXMalawirkUMVrlX MaldivernermUMQrnX MartiniqueroUMPrpXNordmarianernerqUMSrrX MontserratrsUMRrtX MauretanienruUIMrvX Isle of ManrwUUGrxXUgandaryUTZrzXTanzaniar{UMYr|XMalaysiar}UMXr~XMexicorUILrXIsraelrUFRrXFrankrigrUAWrXArubarUDOrXDen Dominikanske RepublikrUSHrX St. HelenarUVCrXSt. Vincent og GrenadinernerU054rX MelanesienrUDJrXDjiboutirUFJrX Fiji-øernerU057rX MikronesienrU172rX&Sammenslutningen af uafhængige staterrU053rXAustralien og New ZealandrUNIrX NicaraguarUNLrXHollandrUNOrXNorgerUNArXNamibiarUVUrXVanuaturUNCrX Ny CaledonienrUNErXNigerrUNFrXNorfolk IslandrUNGrXNigeriarUNZrX New ZealandrUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolynesienrUCIrXElfenbenskystenrUCHrXSchweizrUCOrXColombiarUCNrXKinarUCMrXCamerounrUCLrXChilerUCCrX CocosøernerUCArXCanadarUCGrXCongorUCFrXCentralafrikanske RepublikrUCDrXCongo-KinshasarUCZrXTjekkietrUCYrXCypernrUCXrXJuleøenrUCSrXSerbien og MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Kap VerderUCUrXCubarUSZrX SwazilandrUSYrXSyrienrUKGrX KirgisistanrUKErXKenyarUSRrXSurinamrU143rX CentralasienrUKHrXCambodjarUKNrXSaint Kitts og NevisrUKMrX ComorernerUSTrXSão Tomé og PrínciperUSKrX SlovakietrUKRrXSydkorearUSIrX SlovenienrUKPrX NordkorearUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellernerUKZrX KasakhstanrUKYrX CaymanøernerUSGrX SingaporerUSErXSverigerUSDrXSudanr U151r X Østeuropar U150r XEuropar UDMrXDominicarU155rX VesteuroparU154rX NordeuroparUVGrXDe britiske jomfruøerrUDErXTysklandrUYErXYemenrUMHrXMarshalløernerU062rXSydcentralasienrUDZrXAlgerietrUUSr XUSAr!UUYr"XUruguayr#UYTr$XMayotter%UUMr&X&De Mindre Amerikanske Oversøiske Øerr'ULBr(XLibanonr)ULCr*X Saint Luciar+ULAr,XLaosr-UTVr.XTuvalur/UTWr0XTaiwanr1UTTr2XTrinidad og Tobagor3UTRr4XTyrkietr5ULKr6X Sri Lankar7ULIr8X Liechtensteinr9UCKr:X Cook-øerner;UTOr<XTongar=ULTr>XLitauenr?ULUr@X LuxembourgrAULRrBXLiberiarCULSrDXLesothorEUTHrFXThailandrGUTFrHX/Franske Besiddelser i Det Sydlige Indiske OceanrIUTGrJXTogorKUTDrLXTchadrMUTCrNXTurks- og CaicosøernerOULYrPXLibyenrQUVArRX VatikanstatenrSU145rTX VestasienrUUAErVXForenede Arabiske EmiraterrWUADrXXAndorrarYUAGrZXAntigua og Barbudar[UAFr\X Afghanistanr]UAIr^XAnguillar_UVIr`XDe amerikanske jomfruøerraUISrbXIslandrcUIRrdXIranreUAMrfXArmenienrgUALrhXAlbanienriUAOrjXAngolarkUANrlXHollandske AntillerrmU003rnX NordamerikaroU002rpXAfrikarqU001rrXVerdenrsUARrtX ArgentinaruUAUrvX AustralienrwUATrxXØstrigryU005rzX Sydamerikar{UINr|XIndienr}UAXr~XÅlandrU009rXOceanienrUAZrX AserbajdsjanrUIErXIrlandrUIDrX IndonesienrUJOrXJordanrUQUrXEUrUUArXUkrainerUQArXQatarrUDKrXDanmarkrUMZrX MozambiquerUQOrX Ydre OceanienruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9X dd/MM/yyyyrhYX%(dd)s/%(MM)s/%(yyyy)srubUfullrhU)r}r(h9XEEEE 'den' d. MMMM yyyyrhYX%%(EEEE)s den %(d)s. %(MMMM)s %(yyyy)srubUlongrhU)r}r(h9X d. MMM yyyyrhYX%(d)s. %(MMM)s %(yyyy)srubUshortrhU)r}r(h9Xdd/MM/yyrhYX%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUDKKrXkrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUVUVrXVTrUUYUrXUr$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUGELrXlarirUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUGBPrX£rUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUJMDrXJ$r UTTDr XTT$r UZWDr XZ$r UTRLrXTLrUBDTrXTkrUYERrXYRlrUANGrXNA f.rUXCDrXEC$rUNOKrXNOKrUINRrXINRrUMXNrXMEX$rUBTNrXNurUCOPr XCol$r!UIDRr"XRpr#UHNLr$XLr%UFJDr&XF$r'UETBr(XBrr)UBZDr*XBZ$r+UDOPr,XRD$r-UQARr.XQRr/USEKr0XSEKr1USRGr2XSfr3UIEPr4XIR£r5UBBDr6XBDS$r7UGTQr8XQr9UVEBr:XBer;UCLPr<XCh$r=UALLr>Xlekr?UKZTr@XTrAUOMRrBXROrCUSBDrDXSI$rEUPLNrFXZlrGUKESrHXK ShrIUGYDrJXG$rKUMKDrLXMDenrMUTWDrNXNT$rOUTOPrPXT$rQUGNFrRXGFrSUIQDrTXIDrUUBAMrVXKMrWUSCRrXXSRrYUCADrZXCan$r[UCVEr\XCVEscr]UKWDr^XKDr_UBIFr`XFburaUSOSrbXSrcUSGDrdXS$reUSTDrfXDbrgUIRRrhXRIriUCNYrjXYrkUCYPrlX£CrmUMTLrnXLmroUNZDrpX$NZrqUUSDrrX$rsUKGSrtXsomruUARSrvXArg$rwUSZLrxXEryUBHDrzXBDr{uU time_zonesr|}r}(UAtlantic/Canaryr~}rUcityrXDe Kanariske ØerrsU Europe/Zurichr}rjXZürichrsU Europe/Lisbonr}rjXLissabonrsUPacific/Easterr}rjX PåskeøenrsU Europe/Romer}rjXRomrsUAtlantic/Faeroer}rjX FærøernersU Europe/Warsawr}rjXWarszawarsUEurope/Copenhagenr}rjX KøbenhavnrsUAmerica/St_Luciar}rjX St. LuciarsUEurope/Bucharestr}rjXBukarestrsU Asia/Tehranr}rjXTeheranrsUAmerica/St_Johnsr}rjX St. JohnsrsUIndian/Reunionr}rjXRéunionrsUIndian/Maldivesr}rjX MaldivernersUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAtlantic/Cape_Verder}rjX Kap VerdersUAsia/Hong_Kongr}rjXHongkongrsU Europe/Moscowr}rjXMoskvarsU Asia/Macaur}rjXMacaorsUAmerica/Anchorager}rjX Alaska TimersUIndian/Christmasr}rjXJuleøenrsU Europe/Viennar}rjXWienrsUAmerica/St_Thomasr}rjX St. ThomasrsUAmerica/El_Salvadorr}rjXSalvadorrsUEurope/Brusselsr}rjX BruxellesrsU Europe/Athensr}rjXAthenrsUAmerica/St_Vincentr}rjX St. VincentrsUAtlantic/Azoresr}rjXAzorernersU Etc/Unknownr}rjXUkendtrsUAmerica/St_Kittsr}rjX St. KittsrsUAmerica/Godthabr}rjXNuukrsUAfrica/Algiersr}rjXAlgierrsUAntarctica/South_Poler}rjXSydpolenrsuUscriptsr}r(UZsymrXzsymrUGururXgurmukhirUHebrrXhebraiskrUZzzzrX ukendt eller ugyldig skriftsprogrUPhnxrX fønikiskrUMoonrXmoonrUSamrrX samaritanskrUChamrXchamrUArabrXarabiskrUGujrrXgujaratirUZxxxrXikke-skriftsprogrULycirXlykiskrUSinhrX singalesiskrUTalurXtai luerUMongrXmongolskrUXpeorX oldpersiskrUVisprX synlig talerURjngrXrejangrUOlckrXol-chikir UTaler Xtai ler UMandr Xmandaiskr UManirX manikæiskrUMlymrX malayalamrUTibtrX tibetanskerUKalirXkaya lirUJpanrXjapanskrUPlrdrX pollardtegnrUKanarXkatakanarULydirXlydiskrULepcrXlepcharUSundr X sundanesiskr!UYiiir"Xyir#UJavar$X javanesiskr%UOryar&Xoriyar'ULaoor(Xlaotiskr)UUgarr*X ugaritiskr+UCyrlr,X kyrilliskr-UVaiir.Xvair/UArmnr0Xarmenskr1UCyrsr2X#kyrillisk - oldkirkeslavisk variantr3UKhmrr4Xkhmeriskr5UArmir6Xarmir7USylor8X syloti nagrir9UItalr:X Olditaliskr;USgnwr<X tegnskriftr=UXsuxr>Xsumero-akkadisk cuneiformr?UThaar@XthaanarAUThairBX thailandskrCUCprtrDX cypriotiskrEULinbrFX lineær BrGULinarHX lineær ArIUOsmarJX osmanniskrKUSaurrLX saurashtrarMUHirarNXhiraganarOUHanirPXhanrQUEgydrRXegyptisk demotiskrSUQaairTXarvetrUUEgyhrVXegyptisk hieratiskrWUCansrXXoprindelige canadiske symbolerrYUEgyprZXegyptiske hieroglyfferr[UZmthr\Xzmthr]UTfngr^Xtifinaghr_UShawr`XshaviskraUCirtrbXcirtrcUGeorrdXgeorgiskreUTengrfXtengwarrgUHrktrhXkatakana eller hiraganariUGeokrjXgeorgisk kutsurirkUTavtrlXtavtrmUOgamrnXoghamroUDsrtrpXdeseretrqUGothrrXgotiskrsUHanortXhanunooruUBalirvX balinesiskrwUKorerxXkoreanskryUHangrzXhangulr{UCarir|Xkarianskr}UAvstr~X avestanskrUTagbrXtagbanwarUHansrX forenklet hanrUHantrXtraditionelt hanrURororX rongo-rongorUDevarX devanagarirUIndsrXindusrUBoporXbopomoforUMymrrX myanmarskrUTglgrXtagalogrUPermrX oldpermiskrUBugirX buginesiskrUPhagrXphags-parUBrairX blindskriftrUBrahrXbramiskrUBatkrXbatakrUMerorX meroitiskrULimbrXlimburUMteirX meitei-mayekrUPhlirXphlirUTelurXtelugurUTamlrXtamilskrUSararXsaratirUPhlprXphlprULatgrXlatinsk - gælisk variantrULatfrXlatinsk - frakturvariantrUKharrX kharoshtirUNkoorXn'korUPhlvrXpahlavirULatnrXlatinskrUMayarXmayahieroglyfferrULanarXlannarUEthirXetiopiskrUKthirXkthirUHmngrX pahawh hmongrUBuhdrXbuhidrUCoptrXkoptiskrUPrtirXprtirUGlagrX glagolitiskrURunrrXrunerrUOrkhrXorkhonrUCakmrXcakmrUHungrX oldungarskrUGrekrXgræskrUCherrXcherokeerUZyyyrXfællesrUSyrcrXsyriskrUBlisrX blissymbolerrUBengrX bengalesiskrUSyrerXsyrisk - estrangelovariantrUSyrjrX vestsyriskrUSyrnrX østsyriakiskrUKndarXkannadaruUvariantsr}r(UREVISEDrXrevideret retskrivningrUFONIPArX$det internationale fonetiske alfabetrU1996rXtysk retskrivning fra 1996rUBOONTrX boontlingrUAREVELArX østarmenskrUPOSIXrXcomputerrUFONUPArXdet uraliske fonetiske alfabetrU1901rXtraditionel tysk retskrivningruUnumber_symbolsr}r(UgrouprX.rUnativeZeroDigitrX0rU exponentialr jyUperMiller X‰r Udecimalr X,r U percentSignr X%r Unanr XNaNr U patternDigitr X#r UplusSignr X+r Uinfinityr X∞r U minusSignr h UUAKr? XUkrainsk karbovanetzr@ jXJordansk dinarrA UAORrB X'Angolansk kwanza reajustado (1995-1999)rC USURrD XSovjetisk rubelrE UAWGrF XArubansk gyldenrG jX Saudisk riyalrH UFIMrI X Finsk markrJ jXHongkong dollarrK j2XSurinamsk guilderrL UTPErM XEscudo fra TimorrN UMGFrO XMadagaskisk francrP jXSchweizisk francrQ UGIPrR XGibraltarisk pundrS jXHviderussisk rubelrT j>X Albansk lekrU UUGSrV XUgandisk shilling (1966-1987)rW jXMauritansk ouguiyarX UBOVrY XBoliviansk mvdolrZ UHRKr[ X Kroatisk kunar\ jXDjiboutisk francr] UHRDr^ XKroatisk dinarr_ UPESr` XPeruviansk solra UBYBrb X!Ny hviderussisk rubel (1994-1999)rc UITLrd XItaliensk lirere UXAFrf XBeninsk CFA-francrg UBNDrh XBruneisk dollarri UISKrj X Islansk kronerk UZALrl XSydafrikansk rand (financial)rm USRDrn XSurinamsk dollarro UNIOrp XNicaraguansk cordoba ororq ULAKrr X Laotisk kiprs UNICrt XNicaraguansk cordobaru jXNepalesisk rupeerv UMZErw XMozambiquisk escudorx jXUruguaysk peso uruguayory jX Syrisk pundrz jXJamaicansk dollarr{ UFRFr| X Fransk francr} UMAFr~ XMarokkansk francr jXGammel mozambiquisk meticalr UMZNr XMozambiquisk meticalr UPHPr XFilippinsk pesor jXSydafrikansk randr UGWPr XGuineansk pesor ULUFr XLuxembourgsk francr UBELr XBelgisk franc (financial)r UBECr XBelgisk franc (konvertibel)r UNGNr XNigeriansk nairar UYUNr XJugoslavisk konvertibel dinarr jX Belgisk francr UPLZr XPolsk zloty (1950-1995)r jXCostaricansk colonr jX Tyrkisk lirer UDEMr X Tysk markr UEEKr X Estisk kroonr jXMalawisk kwachar j XDollar fra Trinidad og Tobagor jXSrilankansk rupeer jXSlovakisk korunar j\XKapverdisk escudor jXPakistansk rupeer jXUngarsk forintr jXGammel rumænsk leur jXBermudansk dollarr jBX Omansk rialr jXLesothisk lotir ULVRr X Lettisk rubelr jXMongolsk tugrikr jX Armensk dramr UYUDr XJugoslavisk hard dinarr UBUKr XBurmesisk kyatr jXUgandisk shillingr j.X Qatarsk rialr UNLGr XHollandsk guilderr UGEKr XGeorgisk kupon laritr UMTPr XMaltesisk pundr jX Britisk pundr jX Georgisk larir USHPr XPund fra Saint Helenar UAFNr XAfghanir jDXSalomonsk dollarr UCSKr XTjekkoslovakisk hard korunar UKPWr XNordkoreansk wonr UCSDr XGammel serbisk dinarr UAFAr XAfghani (1927-2002)r UTHBr XThailandsk bahtr UTRYr XNy tyrkisk lirer jXBangladeshisk takar UGRDr X Græsk drakmer jXYemenitisk rialr UDDMr X Østtysk markr jxXSwazilandsk lilangenir UHTGr XHaitisk gourder UXOFr XCFA-franc BCEAOr UMGAr XMadagaskisk ariaryr jX!Gylden fra De Hollandske Antillerr ULRDr XLiberisk dollarr URWFr XRwandisk francr jX Norsk kroner jHXKenyansk shillingr UMOPr XMacaosk patacar jX Indisk rupeer jXMexicansk pesor UCZKr XTjekkisk korunar UTJSr XTadsjikisk somonir UTJRr XTadsjikisk rubelr jXBhutansk ngultrumr UYDDr XYemenitisk dinarr UGWEr XPortugisisk guinea escudor j XColombiansk pesor UMURr XMauritisk rupeer j"XIndonesisk pupiahr j$XHonduransk lempirar jX CFP-francr j&XFijiansk dollarr j(X Etiopisk birrr UPENr XPeruviansk sol nuevor j*XBelizisk dollarr UATSr XØstrigsk schillingr UILPr X Israelsk pundr UZRNr XNy zairisk zairer j,XDominikansk pesor UTMMr XTurkmensk manatr jNXNy taiwansk dollarr UMDLr X Moldovisk leur UECSr XEcuadoriansk sucrer UBSDr XBahamansk dollarr j0X Svensk kroner jPXTongask paʻangar UPEIr XPeruviansk intir UZMKr XZambisk kwachar UMVRr XMaldivisk rufiyaar jXAustralsk dollarr UADPr XAndorransk pesetar UCUPr X Cubansk pesor j4X Irsk pundr UCLFr XChilensk unidades de fomentor j6XBarbadisk dollarr jXComorisk francr UKRWr XSydkoreansk wonr UGMDr XGambisk dalasir UVEFr XVenezuelansk bolivar fuerter j8XGuatemalansk quetzalr j:XVenezuelansk bolivarr USITr! XSlovensk tolarr" USDPr# X Sudansk pundr$ j<X Chilensk pesor% UEURr& XEuror' UCDFr( XCongolesisk franc congolaisr) jXØstkaribisk dollarr* j@XKasakhisk tenger+ URUBr, X Russisk rubelr- UXFUr. XFransk UIC-francr/ UBRRr0 XBrasiliansk cruzeiror1 UBRNr2 XBrasiliansk cruzado novor3 UBRLr4 XBrasiliansk realr5 UMMKr6 XMyanmarsk kyatr7 UUYPr8 XUruguaysk peso (1975-1993)r9 URURr: XRussisk rubel (1991-1998)r; jFX Polsk zlotyr< UBREr= X Brasiliansk cruzeiro (1990-1993)r> UPYGr? XParaguaysk guaranir@ UBRCrA XBrasiliansk cruzadorB UBRBrC X%Brasiliansk cruzeiro novo (1967-1986)rD USVCrE XSalvadoransk colonrF UAEDrG X(Dirham fra de Forenede Arabiske EmiraterrH UGNSrI XGuineansk sylirJ jLXMakedonsk denarrK UAZMrL XAserbajdsjansk manat 1993-2006rM UAZNrN XAserbajdsjansk manatrO UUSNrP XAmerikansk dollar (næste dag)rQ UGQErR X#Ækvatorialguineask ekwele guineanarS jX Vanuaisk vaturT UBADrU XBosnien-Hercegovinsk dinarrV jRXGuineansk francrW UMXPrX X!Mexicansk silver peso (1861-1992)rY jTX Irakisk dinarrZ UERNr[ XEritreisk nakfar\ jVX%Bosnien-Hercegovinsk konvertibel markr] jXXSeychellisk rupeer^ jZXCanadisk dollarr_ USDDr` X Sudansk dinarra jlXCypriotisk pundrb UMADrc XMarokkansk dirhamrd j^XKuwaitisk dinarre j`XBurundisk francrf ULTTrg XLitauisk talonasrh UPGKri X Papuansk kinarj ULTLrk X Litauisk litarl jdXSingaporeansk dollarrm UUZSrn X Usbekisk sumro jfXDobra fra Sao Tome og Principerp UXFOrq XFransk guldfrancrr UMLFrs X Malisk francrt UESPru X Spansk pesetarv jhX Iransk rialrw UZRZrx X Zairisk zairery jjXKinesisk yuan renminbirz USLLr{ XSierraleonsk leoner| UTNDr} XTunesisk dinarr~ jJXGuyansk dollarr jnXMaltesisk lirar jpXNew Zealandsk dollarr UFKPr XPund fra Falklandsøerner ULVLr X Lettisk latr UUSSr XAmerikansk dollar (samme dag)r jrXAmerikansk dollarr UARPr XArgentinsk peso (1983-1985)r jtX Kirgisisk somr jvXArgentinsk pesor UILSr XNy israelsk shekelr URONr X Rumænsk leur URSDr X Serbisk dinarr jzXBahrainsk dinarr UJPYr X Japansk yenr UARAr XArgentinsk australr USDGr XSudanesisk pundr UPTEr XPortugisisk escudor UXAUr XGuldr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXJr KXFr KjKXAr KjKj Kj Kj K jcK XOr K XNr K XDr usUformatr }r (Uwider }r (KXjanuarr KXfebruarr KXmartsr KXaprilr KXmajr KXjunir KXjulir KXaugustr K X septemberr K Xoktoberr K Xnovemberr K Xdecemberr uU abbreviatedr }r (KXjanr KXfebr KXmarr KXaprr KXmajr KXjunr KXjulr KXaugr K Xsepr K Xoktr K Xnovr K Xdecr uuuUcurrency_formatsr }r Nh,)r }r (h/Nh1Kh2KKr h4X ¤r j r h7KKr h9X #,##0.00 ¤r h;h5hNh?KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KjKjAKj KjAKj Kj%KjcusUformatr }r (Uwider }r (KXmandagr KXtirsdagr KXonsdagr KXtorsdagr KXfredagr KXlørdagr KXsøndagr uU abbreviatedr }r (KXmanr KXtirr KXonsr KXtorr KXfrer KXlørr KXsønr uuuU meta_zonesr }r (U Afghanistanr }r (Ucommonr Ulongr }r Ustandardr X Afghansk tidr suU Indochinar }r (j j }r j XIndokinesisk tidr suUEurope_Easternr }r (j j }r (Ugenericr Xøsteuropæisk tidr Udaylightr Xøsteuropæisk sommertidr j Xøsteuropæisk normaltidr uuUAqtober }r (j j }r (j XAqtobe-sommertidr j X Aqtobe-tidr uuUAustralia_CentralWesternr }r (j j }r (j X"Vestlig centralaustralsk sommertidr j X"Vestlig centralaustralsk normaltidr uuUGuyanar }r (j j }r j X Guyana-tidr suU Hong_Kongr }r (j j }r (j XHongkong-sommertidr j X Hongkong-tidr uuURotherar }r (j j }r j X Rothera-tidr suUArabianr }r (Ushortr }r (j X AT (arabisk)r j X ADT (arabisk)r j X AST (arabisk)r uj j }r (j X Arabisk tidr! j XArabisk sommertidr" j XArabisk normaltidr# uuUAustralia_Easternr$ }r% (j j }r& (j XØstaustralsk tidr' j XØstaustralsk sommertidr( j XØstaustralsk normaltidr) uuUAcrer* }r+ (j j }r, (j XAcre-sommertidr- j XAcre-tidr. uuUIndonesia_Centralr/ }r0 (j j }r1 j XCentralindonesisk tidr2 suU Argentinar3 }r4 (j j }r5 (j XArgentinsk sommertidr6 j XArgentinsk tidr7 uuUBoliviar8 }r9 (j j }r: j XBoliviansk tidr; suU Venezuelar< }r= (j j }r> j XVenezuelansk tidr? suUEcuadorr@ }rA (j j }rB j XEcuadoriansk tidrC suU Alaska_HawaiirD }rE (j j }rF (j XAlaska-Hawaii-tidrG j XAlaska-Hawaii-sommertidrH j XAlaska-Hawaii-normaltidrI uuUIsraelrJ }rK (j }rL j X IST (Israel)rM sj j }rN (j XIsraelsk sommertidrO j XIsraelsk normaltidrP uuUAfrica_WesternrQ }rR (j j }rS (j Xvestafrikansk sommertidrT j Xvestafrikansk tidrU uuUAqtaurV }rW (j j }rX (j XAqtau-sommertidrY j X Aqtau-tidrZ uuUAustralia_Centralr[ }r\ (j j }r] (j XCentralaustralsk tidr^ j XCentralaustralsk sommertidr_ j XCentralaustralsk normaltidr` uuUNoronhara }rb (j j }rc (j XFernando de Noronha-sommertidrd j XFernando de Noronha-tidre uuUPierre_Miquelonrf }rg (j j }rh (j XPierre- og Miquelon-tidri j XPierre- og Miquelon-sommertidrj j XPierre- og Miquelon-normaltidrk uuUAmerica_Mountainrl }rm (j j }rn (j X Mountain-tidro j XMountain-sommertidrp j XMountain-normaltidrq uuUArgentina_Westernrr }rs (j j }rt j XVestargentinsk tidru suUIndonesia_Easternrv }rw (j j }rx j XØstindonesisk tidry suUPerurz }r{ (j j }r| (j XPeruviansk sommertidr} j XPeruviansk tidr~ uuU Aktyubinskr }r (j j }r (j XAktyubinsk sommertidr j XAktyubinsk tidr uuUAmazonr }r (j j }r (j XAmazonas-sommertidr j X Amazonas-tidr uuUBeringr }r (j j }r (j X Bering-tidr j XBering-sommertidr j XBering-normaltidr uuUAtlanticr }r (j j }r (j X Atlantic-tidr j XAtlantic-sommertidr j XAtlantic-normaltidr uuUArmeniar }r (j j }r (j XArmensk sommertidr j X Armensk tidr uuUBrasiliar }r (j j }r (j XBrasiliansk sommertidr j XBrasiliansk tidr uuUChinar }r (j }r j X CST (Kina)r sj j }r (j XKinesisk sommertidr j XKinesisk normaltidr uuUGreenland_Westernr }r (j j }r (j XVestgrønlandsk sommertidr j XVestgrønlandsk tidr uuUMoscowr }r (j j }r (j XMoskva-sommertidr j XMoskva-normaltidr uuUDumontDUrviller }r (j j }r j XDumont-d'Urville-tidr suU New_Zealandr }r (j j }r (j XNewzealandsk tidr j XNewzealandsk sommertidr j XNewzealandsk normaltidr uuUAnadyrr }r (j j }r (j XAnadyr-sommertidr j X Anadyr-tidr uuUKorear }r (j j }r j XKoreansk normaltidr suUEurope_Westernr }r (j j }r (j Xvesteuropæisk tidr j Xvesteuropæisk sommertidr j Xvesteuropæisk normaltidr uuUAfrica_Easternr }r (j j }r j Xøstafrikansk tidr suUSyowar }r (j j }r j X Syowa-tidr suU French_Guianar }r (j j }r j XFransk Guiana-tidr suUAlaskar }r (j j }r (j X Alaska-tidr j XAlaska-sommertidr j XAlaska-normaltidr uuUAmerica_Easternr }r (j j }r (j X Eastern-tidr j XEastern-sommertidr j XEastern-normaltidr uuUAfrica_Southernr }r (j j }r j Xsydafrikansk normaltidr suUAmerica_Pacificr }r (j j }r (j X Pacific-tidr j XPacific-sommertidr j XPacific-normaltidr uuUIndonesia_Westernr }r (j j }r j XVestindonesisk tidr suUAmerica_Centralr }r (j j }r (j X Central-tidr j XCentral-sommertidr j XCentral-normaltidr uuUGreenland_Easternr }r (j j }r (j XØstgrønlandsk sommertidr j XØstgrønlandsk tidr uuUChiler }r (j j }r (j XChilensk sommertidr j X Chilensk tidr uuUDavisr }r (j j }r j X Davis-tidr suUMawsonr }r (j j }r j X Mawson-tidr suUAlmatyr }r (j j }r (j XAlmaty-sommertidr j X Almaty-tidr uuU Dutch_Guianar }r (j j }r j XHollandsk Guiana-tidr suU Newfoundlandr }r (j j }r (j XNewfoundland-tidr j XNewfoundland-sommertidr j XNewfoundland-normaltidr uuUGMTr }r (j j }r j X Verdenstidr suUSurinamer }r (j j }r j X Surinam-tidr suUUruguayr }r (j j }r (j XUruguayansk sommertidr! j XUruguayansk tidr" uuUVostokr# }r$ (j j }r% j X Vostok-tidr& suUCubar' }r( (j j }r) (j X Cubansk tidr* j XCubansk sommertidr+ j XCubansk normaltidr, uuUIndiar- }r. (j j }r/ j XIndisk normaltidr0 suUAfrica_Centralr1 }r2 (j j }r3 j Xcentralafrikansk tidr4 suUGreenland_Centralr5 }r6 (j j }r7 (j XCentralgrønlandsk sommertidr8 j XCentralgrønlandsk tidr9 uuUColombiar: }r; (j j }r< (j XColombiansk sommertidr= j XColombiansk tidr> uuUParaguayr? }r@ (j j }rA (j XParaguayansk sommertidrB j XParaguayansk tidrC uuUJapanrD }rE (j j }rF (j XJapansk sommertidrG j XJapansk normaltidrH uuUAustralia_WesternrI }rJ (j j }rK (j XVestaustralsk tidrL j XVestaustralsk sommertidrM j XVestaustralsk normaltidrN uuUEurope_CentralrO }rP (j j }rQ (j Xmellemeuropæisk tidrR j Xmellemeuropæisk sommertidrS j Xmellemeuropæisk normaltidrT uuUYukonrU }rV (j j }rW (j X Yukon-tidrX j XYukon-sommertidrY j XYukon-normaltidrZ uuuUerasr[ }r\ (Uwider] }r^ (KXf.Kr.r_ KXe.Kr.r` uU abbreviatedra }rb (KXf.Kr.rc KXe.Kr.rd uuu.PK[Rll(site-packages/babel/localedata/st_LS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_S9S9%site-packages/babel/localedata/af.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX 1ste kwartaalq KX 2de kwartaalq KX 3de kwartaalqKX 4de kwartaalquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXvm.qUpmqXnm.quUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+X h:mm:ss aqJUformatqKX%(h)s:%(mm)s:%(ss)s %(a)sqLubUfullqMhG)qN}qO(h+X h:mm:ss a vqPhKX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqQubUlongqRhG)qS}qT(h+X h:mm:ss a zqUhKX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqVubUshortqWhG)qX}qY(h+Xh:mm aqZhKX%(h)s:%(mm)s %(a)sq[ubuU languagesq\}q](Uzh_Hantq^XTradisionele Sjineesq_Ugvq`XManxqaUguqbXGujaratiqcUscoqdXSkotsqeUneqfXNepaleesqgUgdqhX Skots-GaeliesqiUgaqjXIersqkUgnqlXGuaraniqmUglqnXGaliciesqoUlaqpXLatynqqUlnqrXLingalaqsUloqtX LaotaneesquUtrqvXTurksqwUtsqxXTsongaqyUliqzXLimburgsq{Ulvq|XLettiesq}Ultq~XLitausqUtkqX TurkmeensqUthqXThaisqUtiqXTigrinyaqUsuqX SoedaneesqUteqXTelugeesqUfilqX FilippynsqUtaqXTamilqUyiqXJiddisjqUhitqXHetitiesqUpt_BRqXBrasiliaanse PortugeesqUcelqX Ander KeltiesqUdaqXDeensqUmulqXVeelvuldige taleqUgemqXAnder GermaansqUbatqX Ander BaltiesqUelqXGrieksqUeoqX EsperantoqUenqXEngelsqUartqXAnder KunsmatigqUzh_HansqXVereenvoudigde SjineesqUfrqXFransqUarcqXArameesqUeuqXBaskiesqUetqXEstniesqUsemqXAnder SemitiesqUesqXSpaansqUruqXRussiesqUgotqXGotiesqUroqXRoemeensqUbnqXBengaalsqUbeqX Wit-RussiesqUbgqXBulgaarsqUukqX OekraïensqUjvqXJavaansqUbhqXBihariqUbrqXBretonsqUbsqXBosniesqUjaqX JapanneesqUcopqXKoptiesqUocqX OccitaansqUkruqXkruqUundqX OnbepaaldqUtwqXTwiqUtlhqXKlingonqUorqXOriaqUxhqXXhosaqUnsoqXSepediqUcaqX KatalaansqUcyqXWalliesqUsgnqX GebaretaalqUcsqX TsjeggiesqUzhqXSjineesqUbntqXBantoeqUcuqX KerkslawiesqUpsqXPasjtoeqUptqX PortugeesqUchrqX CherokeesqUpaqXPandjabiqUviqX ViëtnameesqUplqXPoolsqUhyqXArmeensqUhrqXKroatiesqUegyqXAntieke EgiptiesqUhuqXHongaarsqUhirXHindirUherXHebreeusrUmgrX MalgassiesrUuzrX OesbekiesrUmlrX Malabaarsr Umnr X Mongaleesr Umkr X Macedoniesr UurrXOerdoerUmtrXMalteesrUmsrX MaleisiesrUmrrXMahrattirUberrXBerbersrUugrXUighoersrUmyrXBirmaansrUslarX Ander SlawiesrUverXVendarUafr X Afrikaansr!Utnr"XTswanar#Uswr$XSwahilir%Uisr&XYslandsr'Uamr(XAmhariesr)Uitr*X Italiaansr+Unl_BEr,XVlaamsr-Ukhir.XAnder Khoi-Sanr/Uasr0XAssameesr1Uarr2XArabiesr3Ues_419r4XLatyns-Amerikaanse Spaansr5Uzur6XZoeloer7Uiar8X Interlinguar9Uiner:XAnder Indo-Europeesr;Uazr<X Aserbeidjaansr=Uier>X Interlinguer?Uidr@X IndonesiesrAUnlrBX NederlandsrCUnnrDXNoorweegse NynorskrEUnorFXNoorsrGUndrHX Noord-NdebelerIUafarJXAnder Afro-AsiatiesrKUgrcrLXAntieke GrieksrMUsorNXSomaliesrOUnrrPX Suid-NdebelerQUmasrRXMasairSUderTXDuitsrUUphnrVXFenisiesrWUfyrXXFriesrYUsvrZXSweedsr[Ufar\XPersiesr]Ufir^XFinsr_Ufjr`X FidjiaansraUsarbXSanskritrcUfordXFaroëesreUkarfXGeorgiesrgUssrhXSwaziriUsrrjXSerwiesrkUsqrlXAlbaneesrmUkornXKoreaansroUknrpXKannadarqUkmrrXKhmerrsUstrtX Suid-SothoruUskrvXSlowaaksrwUsirxX SingaleesryUshrzXSerwo-Kroatiesr{Ukwr|XKorniesr}Usnr~XShonarUkurXKoerdiesrUslrXSloweensrUkyrX KirgisiesrUsdrXSindhiruU territoriesr}r(UBDrX BangladesjrUBErXBelgiërUBFrXBoerkina FassorUBGrXBulgaryerUVErX VenezuelarUBArXBosnië en HerzegowinarUBNrXBroeneirUBOrXBoliviërUBHrXBahreinrUBJrXBeninrUBTrXBhoetanrU011rX Wes-AfrikarUBWrXBotswanarU014rX Oos-AfrikarU015rX Noord-AfrikarUBRrX BrasiliërU017rX Midde-AfrikarU018rX Suider-AfrikarU019rXAmerikasrUBYrX Wit-RuslandrURUrXRuslandrURWrXRwandarURErXRéunionrUTMrX TurkmeniërUTJrX TadjikistanrUROrX RoemeniërUGWrX Guinee-BissaurUGRrX GriekelandrUGQrXEkwatoriaal-GuineerUJPrXJapanrUGFrX Frans-GuyanarUGErXGeorgiërU021rX Noord-AmerikarUGBrXGroot-BrittanjerUGArXGaboenrUSVrXSalvadorrUGNrXGuineerUGMrXGambiërUGLrX GroenlandrU029rXKaribiesrUGHrXGhanarUOMrXOmanrUTNrXTunisiërUJMrXJamaikarU013rXSentraal-AmerikarUWSrXSamoarUHRrXKroasiërUBSrXBahamasrUHTrXHaïtirUHUrXHongaryerUHKrXHongkongrU039rX Suid-EuroparU142rXAsiërU030rX Oos-AsiërU034rX Suid-AsiërU035rX Suidoos-AsiërUPRrX Puerto RicorUPTrXPortugalrUPYrXParaguayrUFMrX MikronesiërUPArXPanamarUPGrXPapoea Nieu-GuineerUPErXPerurUPKrXPakistanr UPHr X Filippyner UFOr XFaroëreilander UPLrXPolerUZMrXZambiërUEHrX Wes-SahararUEErXEstlandrUEGrXEgipterUZArX Suid-AfrikarUITrXItaliërUVNrXViëtnamrUSBrXSolomon EilanderUETr X Ethiopiër!USOr"XSomaliër#UZWr$XZimbabwer%USAr&XSaoedi-Arabiër'UESr(XSpanjer)UMGr*X Madagaskarr+UMAr,XMarokkor-UMCr.XMonacor/UUZr0X Oesbekistanr1UMLr2XMalir3UMOr4XMacaor5UMNr6X Mongoliër7UASr8XAmerikaans Samoar9UMKr:X Macedoniër;UMUr<X Mauritiusr=UMTr>XMaltar?UMVr@XMaldiverAUMRrBX MouritaniërCUUGrDXUgandarEUMYrFX MaleisiërGUMXrHXMeksikorIUILrJXIsraelrKUFRrLXFrankrykrMUDOrNXDominikaanse RepubliekrOUVCrPXSaint Vincent en die GrenadinerQU054rRX MelanesiërSUFIrTXFinlandrUUFJrVXFidjirWUFKrXXFalklandeilanderYU172rZX Statebondr[U053r\XAustralië en Nieu-Seelandr]UNIr^X Nicaraguar_UNLr`X NederlandraUNOrbXNoorweërcUNArdXNamibiëreUNCrfXNieu-KaledoniërgUNErhXNigerriUNGrjXNigeriërkUNZrlX Nieu-SeelandrmUNRrnXNaoeroeroU061rpX PolinesiërqUCIrrXIvoorkusrsUCHrtX SwitserlandruUCNrvXSjinarwUCMrxXKameroenryUCLrzXChilir{UCAr|XKanadar}UCGr~XKongorUCFrXSentraal-Afrikaanse RepubliekrUCZrXTjeggiese RepubliekrUCYrXCiprusrUCSrXSerwië en MontenegrorUCRrX Costa RicarUCVrX Kaap VerderUCUrXKubarUSZrX SwazilandrUSYrXSiriërUKGrX KirgisiërUKErXKeniarUSRrXSurinamerU143rXSentraal-AsiërUKHrXKambodjarUKNrXSaint Kitts en NevisrUKMrXComorerUSTrXSao Tome en PrinciperUSKrXSlowakyerUKRrX Suid-KorearUSIrX SloweniërUKPrX Noord-KorearUKWrXKoeweitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellerUKZrX KasakstanrUKYrXKaaimanseilanderUSGrX SingapoerrUSErXSwederUSDrXSoedanrU151rX Oos-EuroparU150rXEuroparU155rX Wes-EuroparU154rX Noord-EuroparUDErX DuitslandrUYErXJemenrUMHrXMarshall-eilanderU009rXOseaniërUDZrXAlgeriërUUSrXVerenigde State van AmerikarULBrXLibanonrULArXLaosrUTWrXTaiwanrUTTrXTrinidad en TobagorUTRrXTurkyerULKrX Sri LankarULIrX LiechtensteinrULVrXLetlandrUTOrXTongarULTrXLitauerULUrX LuxemburgrULRrXLiberiërULSrXLesothorUTHrXThailandrUTDrXTsjaadrULYrXLibiërUVArXVatikaanrU145rX Wes-AsiërUAErXVerenigde Arabiese EmiraterUADrXAndorrarUAGrXAntigua en BarbudarUAFrX AfganistanrUIQrXIrakrUISrXYslandrUIRrXIranrUAMrXArmeniërUALrXAlbaniërUAOrXAngolar UANr XNederlands-Antiller UAQr X Antarktikar U002rXAfrikarU001rXWêreldrUARrX ArgentiniërUAUrX AustraliërUATrX OostenrykrU005rX Suid-AmerikarUINrXIndiërUTZrX TanzaniërUDJrXDjiboetirUAZr X Aserbeidjanr!UIEr"XIerlandr#UIDr$X Indonesiër%UJOr&X Jordaniër'UUAr(XOekrainer)UQAr*XKatarr+UDKr,X Denemarker-UMZr.X Mosambiekr/uUdecimal_formatsr0}r1Nh)r2}r3(h!Nh#Kh$KKr4h&h'h'r5h)KKr6h+X #,##0.###r7h-h'h.r8h0Nh1KKr9ubsU date_formatsr:}r;(Umediumr<hG)r=}r>(h+X dd MMM yyyyr?hKX%(dd)s %(MMM)s %(yyyy)sr@ubUfullrAhG)rB}rC(h+XEEEE dd MMMM yyyyrDhKX!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)srEubUlongrFhG)rG}rH(h+X dd MMMM yyyyrIhKX%(dd)s %(MMMM)s %(yyyy)srJubUshortrKhG)rL}rM(h+X yyyy/MM/ddrNhKX%(yyyy)s/%(MM)s/%(dd)srOubuUcurrency_symbolsrP}rQUZARrRXRrSsU time_zonesrT}rU(U Europe/LisbonrV}rWUcityrXXLissabonrYsU Asia/BahrainrZ}r[jXXBagreinr\sUAmerica/Mexico_Cityr]}r^jXX Mexikostadr_sU Asia/Shanghair`}rajXXSjanghairbsU Europe/Moscowrc}rdjXXMoskouresUAntarctica/South_Polerf}rgjXXSuidpoolrhsuUscriptsri}rj(UHebrrkXHebreeusrlUZzzzrmXKode vir ongekodeerde alfabetternUUgarroX UgaritiesrpUCyrlrqX CyrilliesrrUArmnrsXArmeensrtUCyrsruX#Cyrillies (Ou Kerkslawiese variant)rvUKhmrrwXKhmerrxULatnryXLatynrzUGothr{XGotiesr|UEthir}XEtiopiesr~UArabrXArabiesrUZxxxrX OngeskrewerUCoptrXKoptiesrUHansrXVereenvoudigde SjineesrUHantrXTradisionele SjineesrUMongrXMongoolsrUVisprXSigbare spraakrUPhnxrXFenisiesrUBrairXbraillerUGrekrXGrieksrUZyyyrXAlgemeenrUEgyprXEgiptiese hiëroglieweruUvariantsr}r(UREVISEDrXHersiene ortografierU1996rXDuitse ortografie van 1996rU1901rXTradisionele Duitse ortografieruUnumber_symbolsr}r(UdecimalrX,rUgrouprX ruUcurrency_namesr}r(UTRYrX Turkse lierrUITLrXItaliaanse lierrUUSDrXAmerikaanse dollarrUNADrXNamibiese dollarrUCHFrXSwitserse frankrURUBrXRoebelrUXXXrX"Onbekende of ongeldige geldeenheidrUCNYrXJoeanrUJPYrX Japannese jenrUTRLrXOu Turkse lierrUBRLrXReaalrUGBPrX Britse pondrjRXRandrUEURrXEuroruUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KXJanuarierKX FebruarierKXMaartrKXAprilrKXMeirKXJunierKXJulierKXAugustusrK X SeptemberrK XOktoberrK XNovemberrK XDesemberruU abbreviatedr}r(KXJanrKXFebrKXMarrKXAprrKXMeirKXJunrKXJulrKXAugrK XSeprK XOktrK XNovrK XDesruuuUcurrency_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKrh+X ¤#,##0.00rh-X¤rX-¤rrh0Nh1KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r(KXMaandagrKXDinsdagr KXWoensdagr KX Donderdagr KXVrydagr KXSaterdagr KXSondagruU abbreviatedr}r(KXMarKXDirKXWorKXDorKXVrrKXSarKXSoruuuU meta_zonesr}rUerasr}r(Uwider}r(KX voor ChristusrKX na ChristusruU abbreviatedr }r!(KXv.C.r"KXn.C.r#uuu.PK[D))(site-packages/babel/localedata/ne_NP.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[N__(site-packages/babel/localedata/es_MX.datnu[}q(Ucurrency_symbolsq}qUMXNqX$qsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q (Udecimalq X.q Ugroupq X,quU week_dataq}qU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[Rll(site-packages/babel/localedata/zu_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ U *site-packages/babel/localedata/uz_Arab.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXH:mm:ssqUformatqX%(H)s:%(mm)s:%(ss)squbUfullqh)q}q(hX H:mm:ss (v)q hX%(H)s:%(mm)s:%(ss)s (%(v)s)q!ubUlongq"h)q#}q$(hX H:mm:ss (z)q%hX%(H)s:%(mm)s:%(ss)s (%(z)s)q&ubUshortq'h)q(}q)(hXH:mmq*hX %(H)s:%(mm)sq+ubuU languagesq,}q-(Ufaq.Xدریq/Uuzq0X اۉزبېکq1Upsq2Xپشتوq3uU territoriesq4}q5UAFq6Xافغانستانq7sUdecimal_formatsq8}q9U date_formatsq:}q;(Umediumq(hX d MMM yyyyq?hX%(d)s %(MMM)s %(yyyy)sq@ubUfullqAh)qB}qC(hX.yyyy نچی ییل d نچی MMMM EEEE کونیqDhX>%(yyyy)s نچی ییل %(d)s نچی %(MMMM)s %(EEEE)s کونیqEubUlongqFh)qG}qH(hXd نچی MMMM yyyyqIhX%(d)s نچی %(MMMM)s %(yyyy)sqJubUshortqKh)qL}qM(hXyyyy/M/dqNhX%(yyyy)s/%(M)s/%(d)sqOubuUcurrency_symbolsqP}qQU time_zonesqR}qSUscriptsqT}qUUvariantsqV}qWUnumber_symbolsqX}qY(UgroupqZX٬q[UnativeZeroDigitq\X۰q]U exponentialq^X×۱۰^q_U minusSignq`X−qaU percentSignqbX٪qcUdecimalqdX٫qeuUcurrency_namesqf}qgUAFNqhX افغانیqisUmonthsqj}qkUformatql}qm(Uwideqn}qo(KX جنوریqpKX فبروریqqKXمارچqrKX اپریلqsKXمیqtKXجونquKX جولایqvKXاگستqwK X سپتمبرqxK X اکتوبرqyK X نومبرqzK X دسمبرq{uU abbreviatedq|}q}(KXجنوq~KXفبرqKXمارqKXاپرqKXمـیqKXجونqKXجولqKXاگسqK XسپتqK XاکتqK XنومqK XدسمquusUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqX ¤qhqUint_precqKKqhX #,##0.00 ¤qUprefixqXqX-qqUexp_plusqNUgroupingqKKqubsUdaysq}qUformatq}q(Uwideq}q(KX دوشنبهqKXسه‌شنبهqKXچهارشنبهqKXپنجشنبهqKXجمعهqKXشنبهqKX یکشنبهquU abbreviatedq}q(KXد.qKXس.qKXچ.qKXپ.qKXج.qKXش.qKXی.quusU meta_zonesq}qUerasq}qU abbreviatedq}q(KXق.م.qKXم.qusu.PK["e%site-packages/babel/localedata/th.datnu[}q(U zone_formatsq}q(UregionqX%sqUfallbackqX %(1)s (%(0)s)quUdatetime_formatsq}qNX{1}, {0}q sUquartersq }q (U stand-aloneq }q Unarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KXไตรมาส 1qKXไตรมาส 2qKXไตรมาส 3qKXไตรมาส 4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3q KXQ4q!uuuUperiodsq"}q#(Uamq$Xก่อนเที่ยงq%Upmq&Xหลังเที่ยงq'uUscientific_formatsq(}q)Ncbabel.numbers NumberPattern q*)q+}q,(Uexp_precq-KKq.Uscaleq/KU frac_precq0KKq1Usuffixq2Xq3h3q4Uint_precq5KKq6Upatternq7X#E0q8Uprefixq9h3X-q:q;Uexp_plusqubsUpercent_formatsq?}q@Nh*)qA}qB(h-Nh/Kdh0KKqCh2X%qDhDqEh5KKqFh7X#,##0%qGh9h3h:qHhX$ออสโทรนีเซียr?Umasr@X มาไซrAUlahrBXลาฮ์นดาrCUladrDXลาดิโนrEUfyrFX-ฟริเซียนตะวันตกrGUsnkrHXโซนินเกrIUfarJXเปอร์เซียrKUmadrLXมาดูริสrMUmagrNXมากาฮิrOUmairPXไมถิลีrQUfirRXฟินแลนด์rSUfjrTX ฟิจิrUUmanrVXแมนดินโกrWUegyrXX$อียิปต์โบราณrYUzndrZXซานเดr[Ussr\Xสวาติr]Usrr^Xเซอร์เบียr_Usqr`XแอลเบเนียraUswrbXสวาฮีลีrcUsvrdXสวีเดนreUsurfXซุนดาrgUstrhXโซโทใต้riUskrjXสโลวักrkUsirlXสิงหลrmUshrnX1เซอร์โบ-โครเอเชียroUsorpXโซมาลีrqUsnrrX โชนาrsUsmrtXซามัวruUslrvXสโลวีเนียrwUscrxXซาร์ดิเนียryUsarzXสันสกฤตr{Usgr|Xแซงโกr}User~XซามิเหนือrUsdrXสินธุrUzenrXเซนากาrUkbdrXคาร์บาเดียrUafarX+อาฟโร-เอเชียติกrUcsbrXคาซูเบียนrUlgrXกานดาrUlbrX$ลักเซมเบิร์กrUfiurX(ฟินโน-อักเรียนrUlnrXลิงกาลาrUlorX ลาวrUlirXลิมเบิร์กrUbynrX บลินrUltrXลิทัวเนียrUlurX"ลูบา-กาตองกาrUfilrXฟิลิปปินส์rUyirXยิดดิชrUnonrXนอร์สโบราณrUcebrX เซบูrUyorXโยรูบาrUnogrX โนไกrUbatrXภาษาบอลติกrUdakrXดาโกทาrUdarrXดาร์จวาrUdayrXดายักrUssarX.ภาษานิโล-ซาฮารันrUkperXกเปลเลrUelrX กรีกrUeorX!เอสเปอรันโตrUenrXอังกฤษrUlamrXแลมบาrUeerX เอเวrUmdfrXมอกชาrUfrrXฝรั่งเศสrUmdrrXมานดาร์rUetrXเอสโตเนียrUesrX สเปนrUrurXรัสเซียrUgonrXกอนดิrUgohrX-เยอรมันสูงโบราณrUsmsrXสกอลตซามิrUsmnrXอินาริซามิrUsmjrXลูลซามิrUde_ATrX0เยอรมัน - ออสเตรียrUgotrXโกธิกrUrnrXคิรันดีrUrorXโรมาเนียrUdsbrX$ซอร์เบียนต่ำrUsmarXซามิใต้rUgorrXกอรอนทาโลrUastrXอัสตูเรียสrUwalrXวาลาโมrUcrhrX$ตุรกีไครเมียrUathrX*ภาษาอาธาพาสกานrUgezrX กีซrUxhrX โซสาrUffrXฟูลาฮ์rUkforX โคโรrUmakrXมากาซาร์rUzaprXซาโปเทกrUkokrXกอนกานีrUzxxrX-ไม่มีข้อมูลภาษาrUkosrXกอสราเอียนrUforXฟาโรสrUtogrXตองกา - ไนซาrUhuprX ฮูพาrUudmrXอัดมาร์ตrUbejrX เบจาrUbemrXเบมบาrUtsirXซิมเชียนr Uberr Xเบอร์เบอร์r Unzir Xนซิมาr UsairXEภาษาอเมริกันอินเดียนใต้rUangrX!อังกฤษโบราณrUprarXภาษาปรากฤตrUbhorXภจบุรีrUsalrX!ภาษาซาลิชันrUprorX*โพรเวนคอลโบราณrUrajrXราจาสธานิrUsadrXซันดาเวrUanprXอังคิกาrUes_419r X3สเปน (ละตินอเมริกา)r!Urapr"Xราพานุยr#Usasr$Xซาซักr%Unqor&Xเอ็นโกr'Ucarr(Xคาริบr)Uminr*Xมินางกาเบาr+Umicr,Xมิกแมกr-Uefir.Xอีฟิกr/Uarnr0X!อาราคาเนียนr1Uypkr2Xภาษายูพิกr3Umisr4Xภาษาอื่นๆr5Ukacr6Xกะฉิ่นr7Ukabr8Xกาไบลr9Ukaar:Xการา-กาลพากr;Ukamr<Xคัมบาr=Ukarr>Xกะเหรี่ยงr?Ukawr@X กาวิrAUfr_CHrBX'ฝรั่งเศส (สวิส)rCUtyvrDXทูวิเนียนrEUawarFXอวาธีrGUkarHXจอร์เจียrIUdoirJXดอจริrKUkgrLXคองโกrMUkkrNXคาซัคrOUkjrPXกวนยามาrQUkirRXกิกุยุrSUkorTXเกาหลีrUUknrVXกันนาดาrWUkmrXX เขมรrYUklrZX$กรีนแลนด์ดิคr[Uksr\Xกัศมีร์r]Ukrr^Xคานูรีr_Ukwr`Xคอร์นิสraUkvrbX โกมิrcUkurdXเคิร์ดreUkyrfXเคอร์กิซrgUtklrhXโทเคลัวriUbuarjXบูเรียตrkUmgarlXไอริชกลางrmUhitrnXฮิตไตท์roUdyurpXดิวลาrqUderrXเยอรมันrsUdartXเดนมาร์กruUdzrvXดซองคาrwUluirxXลุยเซโนryUdvrzXดิเวฮิr{Uhilr|Xไฮลิเกนอนr}Uhimr~XฮิมาชาลิrUgemrX*ภาษาเจอร์เมนิกrUcrprX0คริโอลหรือพิดจินrUqurXเกซัวrUbasrX บาสาrUgbarXกบายาrUbadrXบันดาrUbanrXบาหลีrUbalrXบาลูชิrUshnrX ชานrUbairX!ภาษาบามิเลคrUarprXอาราพาโฮrUartrX$ภาษาประดิษฐ์rUarwrXอาราวักrUarcrXอราเมอิกrUen_USrX-อังกฤษ - อเมริกันrUsemrX!ภาษาเซมิติกrUselrXเซลกุปrUnubrX!ภาษานูเบียนrUbtkrXบาตักrUlusrX ลูไชrUmusrX ครีกrUluarXลูบา-ลูลัวrUirorX0ภาษาอิโรกัวเอียนrUirarXอิหร่านrUmunrXภาษามันดาrUlunrXลันดาrUluorX ลัวrUwarXวอลลูนrUtuprXภาษาทุพิrUjvrX ชวาrUtutrX$ภาษาอัลตาอิกrUtumrXทุมบูกาrUjarXญี่ปุ่นrUcoprXคอปติกrUilorXอิโลโกrUlarXละตินrUgwirXกวิชอินrUundrX!ไม่มีข้อมูลrUtlirXทลิงกิตrUtlhrXคลินกอนrUchrXชามอร์โรrUcorXคอร์ซิกาrUcarXคาตาลันrUcerXเชเชนrUponrX$โพฮ์นเพเอียนrUcyrXเวลส์rUsahrXยากุตrUcsrX เช็กrUcrrX ครีrUbntrXบันตูrUcvrXชูวาสrUcurX$เชอร์ชสลาวิกrUlvrXลัตเวียrUdumrXดัตช์กลางrUptrXโปรตุเกสrUduarXดัวลาrUfrorX'ฝรั่งเศสโบราณrUyaprX แยปrUfrmrX$ฝรั่งเศสกลางrUtivrX ทิฟrUfrsrX0ฟริเซียนตะวันออกrUfrrrX'ฟริเซียนเหนือrUyaorX เย้าrUparXปัญจาบrUxalrXกาลมิกrUes_ESrX'สเปน (ไอบีเรีย)rUpirX บาลีrUen_GBrX<อังกฤษ - สหราชอาณาจักรrUgayrX กาโยr Uotor X'ภาษาโอโทเมียนr Uotar X'ตุรกีออตโดมันr UhmnrX ม้งrUmyvrXอิร์ซยาrUgaarXกาrUfurrXเฟรียเลียนrUkhirXภาษาคอยสันrUainrX ไอนุrUrarrX!ราโรท็องกันrUslarXภาษาสลาวิกrUverXเวนดาrUvir Xเวียดนามr!Uisr"Xไอซแลนดิกr#Ukhor$Xคอทานิสr%Uiur&Xไอนุกติตัทr'Uitr(Xอิตาลีr)Uvor*Xโวลาพุกr+Uiir,Xเสฉวนยิr-Uikr.Xไอนูเปียกr/Uior0X อิโดr1Uiner2X7ภาษาอินโด-ยูโรเปียนr3Uiar4Xuภาษากลางที่ใช้ในการสื่อสารระหว่างประเทศr5Ujprr6X%ยิว-เปอร์เซียr7Uier8X'อินเตอร์ลิงค์r9Uidr:X!อินโดนีเชียr;Uigr<Xอิกโบr=Upapr>X!พาเพียเมนโทr?Uewor@XอีวันโดrAUpaurBXพาลาอวนrCUpaarDXภาษาปาปวนrEUpagrFXพันกาซินันrGUsatrHXสันตาลีrIUpalrJXพาฮลาวิrKUpamrLXพามพานกาrMUphirNX$ภาษาฟิลิปปินrOUcelrPXภาษาเซลติกrQUphnrRXฟินิเชียนrSUnicrTXIภาษาไนเจอร์-กอร์โดฟาเนียนrUUniarVX เนีสrWUdgrrXXดอจริบrYUsyrrZXไซเรียกr[Uniur\Xไนอีนr]Ugswr^X!เยอรมันสวิสr_Ujbor`XโลจบันraUnahrbXนาฮวตล์rcUsamrdX3ซามาริทันอราเมอิกreUhairfX ไฮดาrgUgmhrhX*เยอรมันสูงกลางriUcusrjX!ภาษาคูชิทิกrkUwenrlX'ภาษาซอร์เบียนrmUadyrnXอะดีเกยาroUelxrpXอีลาไมต์rqUadarrXอาดางมีrsUpt_PTrtX3โปรตุเกส (ไอบีเรีย)ruUhawrvXฮาวายrwUbinrxX บินีryUbikrzXบิกอลr{Upt_BRr|X-โปรตุเกส - บราซิลr}Umosr~XมอสสิrUmohrXโมฮอว์กrUtlrXตากาล็อกrUzh_HansrX!จีนประยุกต์rUzh_HantrX!จีนดั้งเดิมrUtvlrXตูวาลูrUijorX อิโจrUkmbrXคิมบุนดูrUpeorX*เปอร์เซียโบราณrUumbrXอุมบุนดูrUtmhrXทามาเชกrUfonrX ฟอนrUhsbrX!ซอร์เบียนบนrUberXเบลารุสrUbgrXบัลแกเรียrUbarXบัชคีร์rUpsrXพาชตูrUbmrXบามบาราrUbnrXเบงกาลีrUborXทิเบตrUbhrXพิหารrUbirXบิสลามาrUbrrXเบรตันrUbsrXบอสเนียrUruprX!อาโรมาเนียนrUomrXโอโรโมrUojrXโอจิบเวrUacerXอาเจะห์rUachrXอาโคลิrUocrXอ็อกซิตันrUkrurXกุรุกrUsrrrXเซเรอร์rUkrorX กรุrUkrcrX(คาราไช-บัลการ์rUndsrX-เยอรมันตอนเหนือrUosrXออสเซทิกrUorrXโอริยาrUsogrXซอจเดียนrUnsorXโซโทเหนือrUsonrXซองไฮrUde_CHrX-เยอรมันสูง (สวิส)rUvairXไวrUwakrX!ภาษาวากาชานrUlolrXมองโกrUmkhrX"ภาษามอญ-เขมรrUlozrX โลซิrUgilrX!กิลเบอร์ทิสrUwasrX วาโชrUwarrXวาเรย์rUhzrXเฮเรโรrUhyrXอาร์เมเนียrUanrXอารากอนrUsidrXซิดาโมrUhrrXโครเอเชียrUhtrX เฮติrUhurXฮังการีrUhirXฮินดีrUhorXฮิริโมทุrUharX โฮซาrUbugrXบูกิสrUherXฮิบรูrUuzrXอุซเบกrUurrXอูรดูrUplrXโปแลนด์rUukrXยูเครนrUugrXอุยกัวrUaarXอะฟาร์rUabrXแอบกาเซียrUaerXอาเวสทานrUafrXแอฟริกาr Uakr Xอาคานr Uamr Xอัมฮาริกr Unl_BErXเฟลมิชrUeurXบาสก์rUasrXอัสสัมrUarrXอาหรับrUinhrXอิงกุชrUtpirXท็อกพิซินrUmynrXภาษามายันrUayrXไอย์มาราrUkharX คาสิrUazr X$อาเซอร์ไบจานr!Uincr"Xภาษาอินดิกr#Unlr$Xดัตช์r%Unnr&X0นอร์เวย์ไนนอรส์กr'Unor(Xนอร์เวย์r)Unar*X นอรูr+Unbr,X*นอร์เวย์บอกมอลr-Unair.XNอเมริกันอินเดียนเหนืออื่นๆr/Undr0X-เอ็นเดเบลีเหนือr1Uner2Xเนปาลr3Ungr4Xดองกาr5Unyr6X7เนียนจา; ชิเชวา; เชวาr7Unapr8X!เนียโพลิแทนr9Ugrbr:Xเกรโบr;Ugrcr<Xกรีกโบราณr=Unrr>X'เอ็นเดเบลีใต้r?Utigr@XทิจเรrAUnvrBXนาวาโฮrCUzunrDX ซูนิrEUrwrFX$คินยาร์วันดาrGUcperHXrครีโอเลสและพิกกินส์ที่มาจากอังกฤษอื่นๆrIUcpfrJXxครีโอเลสและพิกกินส์ที่มาจากฝรั่งเศสอื่นๆrKUcpprLXxครีโอเลสและพิกกินส์ที่มาจากโปรตุเกสอื่นๆrMuU territoriesrN}rO(UBDrPXบังกลาเทศrQUBErRXเบลเยียมrSUBFrTX$บูร์กินาฟาโซrUUBGrVXบัลแกเรียrWUVErXXเวเนซุเอลาrYUBArZXEบอสเนียและเฮอร์เซโกวีนาr[UBBr\Xบาร์เบโดสr]UWFr^X-วาลลิสและฟุตูนาr_UBLr`X-เซนต์บาร์เธเลมีraUBMrbXเบอร์มิวดาrcUBNrdXบรูไนreUBOrfXโบลิเวียrgUBHrhXบาห์เรนriUBIrjXบุรุนดีrkUBJrlXเบนินrmUBTrnXภูฏานroU011rpX*แอฟริกาตะวันตกrqUBVrrXเกาะบูเวตrsUBWrtXบอตสวานาruU014rvX-แอฟริกาตะวันออกrwU015rxX$แอฟริกาเหนือryUBRrzXบราซิลr{U017r|X!แอฟริกากลางr}U018r~X$แอฟริกาใต้ [018]rU019rXอเมริกาrUBYrXเบลารุสrUBZrXเบลีซrULVrXลัตเวียrURWrXรวันดาrURSrXเซอร์เบียrUTLrX*ติมอร์ตะวันออกrURErXเรอูเนียงrUTMrX*เติร์กเมนิสถานrUOMrXโอมานrUTJrXทาจิกิสถานrUROrXโรมาเนียrUTKrXโตเกเลาrUGWrXกินี-บิสเซาrUGUrX กวมrUGTrXกัวเตมาลาrUGSrX{เกาะเซาท์จอร์เจียและหมู่เกาะเซาท์แซนด์วิชrUGRrX กรีซrUGQrX0อิเควทอเรียลกินีrUGPrXกวาเดอลูปrUJPrXญี่ปุ่นrUKIrXคิริบาตีrUGYrXกายอานาrUGGrXเกิร์นซีย์rUGFrX$เฟรนช์เกียนาrUGErXจอร์เจียrUGDrXเกรนาดาrU021rX-อเมริกาตอนเหนือrUGBrX'สหราชอาณาจักรrUGArXกาบองrUSVrX$เอลซัลวาดอร์rUGNrX กินีrUGMrXแกมเบียrUGLrXกรีนแลนด์rU029rXแคริบเบียนrUGIrXยิบรอลตาร์rUGHrX กานาrUJErXเจอร์ซีย์rUTNrXตูนิเซียrUJMrXจาเมกาrU013rX!อเมริกากลางrUWSrXซามัวrU419rXKละตินอเมริกาและคาริบเบียนrUHRrXโครเอเชียrUBSrXบาฮามาสrUHTrX เฮติrUHUrXฮังการีrUHKrXXฮ่องกง เขตปกครองพิเศษประเทศจีนrU039rXยุโรปใต้rUHNrXฮอนดูรัสrUFIrXฟินแลนด์rU142rXเอเชียrU030rX*เอเชียตะวันออกrU034rXเอเชียใต้rU035rXBเอเชียตะวันออกเฉียงใต้rUPRrX!เปอร์โตริโกrUPSrXBปาเลซติเนียนเทร์ริทอรีrU830rX*หมู่เกาะแชนเนลrUFKrX6หมู่เกาะฟอล์กแลนด์rUIOrX]บริติชอินเดียนโอเชียนเทร์ริทอรีrUPWrXปาเลาrUPTrXโปรตุเกสrUSJrX9สฟาลบาร์และแจนมาเยนrUMDrXมอลโดวาrUFMrX!ไมโครนีเซียrUIQrXอิรักrUPArXปานามาrUPFrX0เฟรนช์โพลีนีเซียrUPGrX$ปาปัวนิวกินีr UPEr X เปรูr UPKr Xปากีสถานr UPHrXฟิลิปปินส์rUFOrX$หมู่เกาะฟาโรrUPNrXพิตแคร์นrUPLrXโปแลนด์rUPMrX9แซงปีแยร์และมีเกอลงrUZMrXแซมเบียrUEHrX'ซาฮาราตะวันตกrURUrXรัสเซียrUEErXเอสโตเนียrUEGr Xอียิปต์r!UZAr"Xแอฟริกาใต้r#UECr$Xเอกวาดอร์r%UITr&Xอิตาลีr'UVNr(Xเวียดนามr)UZZr*Xไม่ทราบr+USBr,X-หมู่เกาะโซโลมอนr-UETr.Xเอธิโอเปียr/USOr0Xโซมาเลียr1UZWr2Xซิมบับเวr3USAr4X*ซาอุดีอาระเบียr5UESr6X สเปนr7UERr8Xเอริเทรียr9UMEr:Xมอนเตเนโกรr;UAQr<X$แอนตาร์กติกาr=UMGr>X!มาดากัสการ์r?UMFr@Xเซนต์มาตินrAUMArBXโมร็อกโกrCUMCrDXโมนาโกrEUUZrFX!อุซเบกิสถานrGUMMrHX พม่าrIUMLrJX มาลีrKUMOrLXXมาเก๊า เขตปกครองพิเศษประเทศจีนrMUMNrNXมองโกเลียrOUHMrPX]เกาะเฮิร์ดและหมู่เกาะแมกดอนัลด์rQUASrRX'อเมริกันซามัวrSUMKrTXมาซิโดเนียrUUMUrVXมอริเชียสrWUMTrXXมอลตาrYUMWrZXมาลาวีr[UMVr\Xมัลดีฟส์r]UMQr^Xมาร์ตินีกr_UMPr`XNหมู่เกาะนอร์เทิร์นมาเรียนาraUMSrbX'มอนต์เซอร์รัตrcUMRrdXมอริเตเนียreUIMrfXเกาะแมนrgUUGrhXยูกันดาriUTZrjXแทนซาเนียrkUMYrlXมาเลเซียrmUMXrnXเม็กซิโกroUILrpXอิสราเอลrqUFRrrXฝรั่งเศสrsUAWrtXอารูบาruUDOrvX6สาธารณรัฐโดมินิกันrwUSHrxX!เซนต์เฮเลนาryUVCrzXNเซนต์วินเซนต์และเกรนาดีนส์r{U054r|Xเมลานีเซียr}UDJr~XจิบูตีrUFJrX ฟิจิrU057rX*เขตไมโครนีเซียrU172rX'เครือรัฐอิสระrU053rXEออสเตรเลียและนิวซีแลนด์rUNIrXนิการากัวrUNLrX$เนเธอร์แลนด์rUNOrXนอร์เวย์rUNArXนามิเบียrUVUrXวานูอาตูrUNCrX'นิวแคลิโดเนียrUNErXไนเจอร์rUNFrX'เกาะนอร์ฟอล์กrUNGrXไนจีเรียrUNZrXนิวซีแลนด์rUNPrXเนปาลrUNRrXนาอูรูrUNUrXนีอูเอrU061rXโปลินีเซียrUCIrXโกตดิวัวร์rUCHrX*สวิตเซอร์แลนด์rUCOrXโคลอมเบียrUCNrX จีนrUCMrXแคเมอรูนrUCLrX ชิลีrUCCrX9หมู่เกาะโคโคส (คีลิง)rUCArXแคนาดาrUCGrX+คองโก-บราซซาวิลrUCFrX<สาธารณรัฐแอฟริกากลางrUCDrX%คองโก-กินชาซาrUCZrX'สาธารณรัฐเช็กrUCYrXไซปรัสrUCXrX'เกาะคริสต์มาสrUCSrXBเซอร์เบียและมอนเตเนโกรrUCRrXคอสตาริกาrUPYrXปารากวัยrUCVrXเคปเวิร์ดrUCUrXคิวบาrUSZrXสวาซิแลนด์rUSYrXซีเรียrUKGrX!คีร์กีซสถานrUKErXเคนยาrUSRrXซูรินาเมrU143rXเอเชียกลางrUKHrXกัมพูชาrUKNrX6เซนต์คิตส์และเนวิสrUKMrXคอโมโรสrUSTrX6เซาตูเมและปรินซิปีrUSKrXสโลวาเกียrUKRrXเกาหลีใต้rUSIrXสโลวีเนียrUKPrX!เกาหลีเหนือrUKWrXคูเวตrUSNrXเซเนกัลrUSMrXซานมารีโนrUSLrX'เซียร์ราลีโอนrUSCrXเซเชลส์rUKZrXคาซัคสถานrUKYrX-หมู่เกาะเคย์แมนrUSGrXสิงคโปร์rUSErXสวีเดนrUSDrXซูดานrU151rX'ยุโรปตะวันออกrU150rXยุโรปrUDMrXโดมินิกาrU155rX$ยุโรปตะวันตกrU154rXยุโรปเหนือrUVGrXBหมู่เกาะบริติชเวอร์จินrUDErXเยอรมนีrUYErXเยเมนr UMHr X3หมู่เกาะมาร์แชลล์r U062r X0เอเชียกลางตอนใต้r UDZrXแอลจีเรียrUUSrX$สหรัฐอเมริกาrUUYrXอุรุกวัยrUYTrXมายอตrUUMrXZหมู่เกาะสหรัฐไมเนอร์เอาต์ไลอิงrULBrXเลบานอนrULCrX!เซนต์ลูเซียrULArX ลาวrUTVrXตูวาลูrUTWr Xไต้หวันr!UTTr"X3ตรินิแดดและโตเบโกr#UTRr$Xตุรกีr%ULKr&Xศรีลังกาr'ULIr(X!ลิกเตนสไตน์r)UCKr*X!หมู่เกาะคุกr+UTOr,Xตองกาr-ULTr.Xลิทัวเนียr/ULUr0X$ลักเซมเบิร์กr1ULRr2Xไลบีเรียr3ULSr4Xเลโซโทr5UTHr6X ไทยr7UTFr8XHอาณาเขตทางใต้ของฝรั่งเศสr9UTGr:X โตโกr;UTDr<X ชาดr=UTCr>XZหมู่เกาะเติกส์และหมู่เกาะเคคอสr?ULYr@XลิเบียrAUVArBXวาติกันrCU145rDX'เอเชียตะวันตกrEUAErFX<สหรัฐอาหรับเอมิเรตส์rGUADrHXอันดอร์ราrIUAGrJX6แอนติกาและบาร์บูดาrKUAFrLX!อัฟกานิสถานrMUAIrNXแองกวิลลาrOUVIrPXBยูเอสเวอร์จินไอส์แลนด์rQUISrRXไอซ์แลนด์rSUIRrTXอิหร่านrUUAMrVXอาร์เมเนียrWUALrXXแอลเบเนียrYUAOrZXแองโกลาr[UANr\X?เนเธอร์แลนด์แอนทิลลิสr]U003r^X$อเมริกาเหนือr_U002r`XแอฟริกาraU001rbX โลกrcUARrdX!อาร์เจนตินาreUAUrfXออสเตรเลียrgUATrhXออสเตรียriU005rjXอเมริกาใต้rkUINrlXอินเดียrmUAXrnX-หมู่เกาะโอลันด์roU009rpXโอเชียเนียrqUAZrrX$อาเซอร์ไบจานrsUIErtXไอร์แลนด์ruUIDrvX!อินโดนีเซียrwUJOrxXจอร์แดนryUQUrzXสหภาพยุโรปr{UUAr|Xยูเครนr}UQAr~Xกาตาร์rUDKrXเดนมาร์กrUMZrXโมซัมบิกrUQOrX<เอาต์ไลอิงโอเชียเนียruUdecimal_formatsr}rNh*)r}r(h-Nh/Kh0KKrh2h3h3rh5KKrh7X #,##0.###rh9h3h:rhjX'เซนต์วินเซนต์r?sUAmerica/Vancouverr@}rAjXแวนคูเวอร์rBsU Asia/ThimphurC}rDjXทิมพูrEsU Africa/AccrarF}rGjXอักกราrHsUAmerica/BelizerI}rJjXเบลีซrKsUAmerica/Port_of_SpainrL}rMjX$พอร์ทออฟสเปนrNsUAmerica/MendozarO}rPjXเมนดูซาrQsU Asia/TokyorR}rSjXโตเกียวrTsUPacific/KiritimatirU}rVjXคิริทิมาตีrWsUAustralia/SydneyrX}rYjXซิดนีย์rZsU Asia/Dilir[}r\jX ดิลีr]sUAfrica/Mbabaner^}r_jXอัมบาบาเนr`sU Asia/Oralra}rbjXออรัลrcsU Asia/Adenrd}rejXเอเดนrfsUEurope/Istanbulrg}rhjXอิสตันบูลrisUAustralia/Lindemanrj}rkjXลินดีแมนrlsUPacific/Galapagosrm}rnjXกาลาปากอสrosUAmerica/Bogotarp}rqjXโบโกตาrrsUAmerica/Dawsonrs}rtjXดอว์สันrusUAmerica/Chicagorv}rwjXชิคาโกrxsUPacific/Kwajaleinry}rzjXควจาเลนr{sUAustralia/Broken_Hillr|}r}jXโบรกเคนฮิวr~sUAmerica/Cuiabar}rjXกุยาบาrsUIndian/Christmasr}rjXคริสต์มาสrsU Asia/Jayapurar}rjXจายาปุระrsUEurope/Brusselsr}rjXบรัสเซลส์rsUAsia/Chongqingr}rjXฉงชิ่งrsUAmerica/Noronhar}rjXโนรอนฮาrsUAfrica/Algiersr}rjXแอลเจียร์rsU Africa/Hararer}rjXฮาราเรrsUAmerica/Costa_Ricar}rjXคอสตาริกาrsUIndian/Mayotter}rjXมาโยเตrsUAsia/Phnom_Penhr}rjXพนมเปญrsU Asia/Bruneir}rjX-บรูไนดารุสซาลามrsUAmerica/Tijuanar}rjXทิฮัวนาrsUPacific/Fakaofor}rjXฟาเคาโฟrsU America/Adakr}rjXเอดักrsUAmerica/Antiguar}rjXแอนติกาrsUAmerica/Argentina/La_Riojar}rjXลาริโอจาrsUPacific/Tahitir}rjXทาฮิติrsUAmerica/Pangnirtungr}rjXพางนีทังrsUAmerica/Asuncionr}rjXอะซุนซิอองrsU Europe/Viennar}rjXเวียนนาrsUAustralia/Hobartr}rjXโฮบาร์ตrsUAmerica/Juneaur}rjX จูโนrsUAmerica/Inuvikr}rjXอินูวิกrsUAmerica/Montrealr}rjXมอนทริออลrsU Asia/Seoulr}rjX โซลrsU Indian/Comoror}rjXโคโมโรrsUAntarctica/Rotherar}rjXโรเธราrsUAmerica/Martiniquer}rjXมาร์ตินีกrsUAsia/Singaporer}rjXสิงคโปร์rsUAfrica/Nairobir}rjXไนโรเบียrsUAmerica/Maceior}rjXมาเซโอrsU Asia/Urumqir}rjXอุรุมชีrsU Europe/Moscowr}rjXมอสโกrsUAsia/Pyongyangr}rjXเปียงยางrsUAsia/Ulaanbaatarr}rjX!อูลานบาตอร์rsUAmerica/Rainy_Riverr}rjX'เรนนี่ริเวอร์rsUIndian/Maldivesr}rjXมัลดีฟส์rsU Asia/Colombor}rjXโคลัมโบrsUAustralia/Adelaider}rjXแอดิเลดrsUAmerica/Cambridge_Bayr}rjX'อ่าวแคมบริดจ์rsU Africa/Luandar}rjXลูอันดาrsUPacific/Chathamr}rjXแชแธมrsUAmerica/Indiana/Winamacr}rjX2วินาแมค, อินดีแอนาrsUAmerica/Cordobar}rjXคอร์โดบาrsU Asia/Tbilisir}rjXทบิลิซิrsUEurope/Gibraltarr }r jXยิบรอลตาร์r sU Asia/Karachir }r jXการาจีrsU Asia/Harbinr}rjXฮาร์บินrsUAustralia/Lord_Hower}rjXลอร์ดโฮวีrsUAmerica/Boa_Vistar}rjXบัววีชตาrsUAfrica/Tripolir}rjXตรีโปลีrsUIndian/Reunionr}rjXเรอูนียงrsUAtlantic/Stanleyr}rjXสแตนลีย์r sUAmerica/Blanc-Sablonr!}r"jX%บลังค์-ซาบลอนr#sUAntarctica/Syowar$}r%jXเซียวาr&sUAmerica/Jamaicar'}r(jXจาเมกาr)sU Europe/Kievr*}r+jXเคียฟr,sUEurope/Budapestr-}r.jXบูดาเปสr/sUPacific/Midwayr0}r1jXมิดเวย์r2sUAmerica/Goose_Bayr3}r4jXกูสเบย์r5sU Asia/Ammanr6}r7jXอัมมานr8sU Asia/Sakhalinr9}r:jXซาคาลินr;sUAfrica/Windhoekr<}r=jXวินด์ฮุกr>sU Asia/Katmandur?}r@jXกาตมันดุrAsUAmerica/GuyanarB}rCjXกายอานาrDsUAmerica/Sao_PaulorE}rFjXเซาเปาลูrGsUAustralia/PerthrH}rIjXเพิิร์ทrJsUAfrica/DjiboutirK}rLjXจิบูตีrMsU Asia/JakartarN}rOjXจาการ์ตาrPsUAntarctica/PalmerrQ}rRjXพาล์เมอร์rSsUAfrica/JohannesburgrT}rUjX*โจฮันเนสเบอร์กrVsU Asia/IrkutskrW}rXjXอีร์คุตสค์rYsU Africa/NiameyrZ}r[jXนีอาเมย์r\sUAfrica/Casablancar]}r^jX$คาสซาบลางก้าr_sU Asia/Bishkekr`}rajXบิชเคกrbsUAfrica/Nouakchottrc}rdjXนูแอกชอตresUEurope/Vilniusrf}rgjXวิลนีอุสrhsUAmerica/Cayenneri}rjjXกาแยนrksUAfrica/Mogadishurl}rmjXโมกาดิชูrnsUAmerica/Kentucky/Monticelloro}rpjXมอนติเซลโลrqsUAmerica/Rio_Brancorr}rsjXรีโอบรังโกrtsUAmerica/Cancunru}rvjXแคนคุนrwsUAmerica/Havanarx}ryjXฮาวานาrzsU Pacific/Guamr{}r|jX กวมr}sU Asia/Makassarr~}rjXมากัสซาร์rsUAtlantic/Azoresr}rjXอาซอเรสrsUAustralia/Euclar}rjXยูคลาrsU Asia/Shanghair}rjXเซี่ยงไฮ้rsUAmerica/Rankin_Inletr}rjX'แรงกินอินเล็ตrsU Asia/Beirutr}rjXเบรุตrsU Africa/Maputor}rjXมาปูโตrsU Asia/Bahrainr}rjXบาห์เรนrsU Asia/Ashgabatr}rjXอาชกาบัตrsU Asia/Riyadhr}rjXริยาร์ดrsU Europe/Londonr}rjXลอนดอนrsUAmerica/Monterreyr}rjX!มอนเตร์เรย์rsUAmerica/Anguillar}rjXแองกิลลาrsU Asia/Damascusr}rjXดามัสกัสrsUAmerica/North_Dakota/Centerr}rjXเซนเตอร์rsUAmerica/Indiana/Vevayr}rjXวีเวย์rsUAtlantic/St_Helenar}rjX!เซนต์เฮเลนาrsUAmerica/Barbadosr}rjXบาร์เบโดสrsUAmerica/Indiana/Vincennesr}rjXวินเซนเนสrsU Asia/Almatyr}rjXอัลมาตีrsU Africa/Lomer}rjX โลเมrsUAfrica/Brazzaviller}rjXบราซซาวิลrsU America/Nomer}rjX นอมrsU Asia/Taipeir}rjX ไทเปrsUAmerica/Yakutatr}rjXยากูทัตrsUAmerica/Araguainar}rjXอารากัวนาrsU Europe/Vaduzr}rjXวาดุซrsU Africa/Asmerar}rjXแอสมาราrsUAntarctica/Mawsonr}rjXมอร์สันrsUAmerica/Buenos_Airesr}rjX!บัวโนสไอเรสrsU Africa/Maserur}rjXมาเซรูrsUAmerica/St_Johnsr}rjXเซนต์จอนส์rsU Asia/Kuchingr}rjXกูชิงrsUAfrica/Libreviller}rjXลีเบรอวิลrsUAfrica/Freetownr}rjXฟรีทาวน์rsU Africa/Bissaur}rjXบิสเซาrsU Europe/Samarar}rjXซามาราrsUEurope/Amsterdamr}rjXอัมสเตอดัมrsU Europe/Tiraner}rjXติรานาrsUPacific/Saipanr}rjXไซปันrsU Asia/Magadanr}rjXมากาดานrsUEurope/Zaporozhyer}rjXซาโปโรซีrsUAmerica/El_Salvadorr}rjX$เอลซัลวาดอร์rsU Europe/Madridr}r jXมาดริดr sUAmerica/Santiagor }r jXซันติอาโกr sUAmerica/Argentina/San_Luisr }r jXซันลูอิสr sU America/Arubar }r jXอารูบาr sUAmerica/Indianapolisr }r jX*อินเดียแนโพลิสr sUAmerica/Reginar }r jXริไจนาr sU Pacific/Trukr }r jX ทรักr sUPacific/Funafutir }r jXฟูนะฟูตีr sUAmerica/Meridar }r jXเมรีดาr sUAmerica/Guatemalar }r jXกัวเตมาลาr sUAfrica/Sao_Tomer }r jXซาโอโตเมะr sUPacific/Kosraer }r! jXคอสแรr" sUAfrica/Bujumburar# }r$ jXบูจุมบูราr% sU Europe/Warsawr& }r' jXวอร์ซอr( sUAsia/Yekaterinburgr) }r* jX0ยีคาเตอรินเบิร์กr+ sUAntarctica/Caseyr, }r- jXเคซีย์r. sUAmerica/Halifaxr/ }r0 jXแฮลิแฟกซ์r1 sU America/Thuler2 }r3 jX ทูเลr4 sUAmerica/Louisviller5 }r6 jXลูส์วิลล์r7 sUAmerica/Monctonr8 }r9 jXมองตันr: sUEurope/Helsinkir; }r< jXเฮลซิงกิr= sUAtlantic/Cape_Verder> }r? jXเคปเวิร์ดr@ sU Indian/CocosrA }rB jXโคโคสrC sU America/BoiserD }rE jXบอยซีrF sUAmerica/GuadelouperG }rH jXกวาเดอลูปrI sUAmerica/NassaurJ }rK jXแนสซอrL sUPacific/EnderburyrM }rN jX-เอนเดอร์เบอร์รีrO sU Asia/HovdrP }rQ jXฮอฟด์rR sUAmerica/ManausrS }rT jXมาเนาส์rU sUAmerica/GodthabrV }rW jXกอดแธบrX sUAmerica/CatamarcarY }rZ jXกาตามาร์กาr[ sUAmerica/Chihuahuar\ }r] jXชีวาวาr^ sUAmerica/Iqaluitr_ }r` jXอีกวาลิตra sUAmerica/Argentina/Rio_Gallegosrb }rc jX$ริโอกาลเลกอสrd sUPacific/Gambierre }rf jXแกมเบียร์rg sUEurope/Volgogradrh }ri jXวอลโกกราดrj sU Africa/Bamakork }rl jXบามาโกrm sUEurope/Uzhgorodrn }ro jXอัซโกร็อดrp sU Africa/Banjulrq }rr jXบันจูลrs sU Asia/Aqtaurt }ru jXอัคตาอูrv sU Africa/Malaborw }rx jXมาลาโบry sUAtlantic/Madeirarz }r{ jXมาเดราr| sUPacific/Noumear} }r~ jXนูเมอาr sUAfrica/Kinshasar }r jXกินชาซาr sU Europe/Maltar }r jXมอลตาr sUAmerica/Argentina/Ushuaiar }r jXอูชูเอียr sU Asia/Bangkokr }r jXกรุงเทพr sU Pacific/Niuer }r jXนีอูเอr sUAustralia/Brisbaner }r jXบริสเบนr sUAmerica/Recifer }r jXเรซีเฟr sU Asia/Yerevanr }r jXเยเรวานr sUAmerica/La_Pazr }r jXลาปาซr sU Africa/Cairor }r jX ไคโรr sU Africa/Lusakar }r jXลูซากาr sUPacific/Guadalcanalr }r jX!กัวดัลคานัลr sUAmerica/Yellowknifer }r jX!เยลโลว์ไนฟ์r sUAsia/Vientianer }r jX!เวียงจันทน์r sUEurope/Kaliningradr }r jX!คาลินิงกราดr sUAfrica/Conakryr }r jXโกนากรีr sUAmerica/Argentina/Tucumanr }r jXทูคูแมนr sU Europe/Oslor }r jXออสโลr sUAmerica/Caracasr }r jXคาราคัสr sUAmerica/Panamar }r jXปานามาr sUAfrica/Gaboroner }r jXกาโบโรเนr sU Pacific/Palaur }r jXปาเลาr sUAmerica/Guayaquilr }r jXกัวยากิลr sUAsia/Kuala_Lumpurr }r jX'กัวลาลัมเปอร์r sUAmerica/Menomineer }r jXเมโนมินีr sUAsia/Kamchatkar }r jXคามชัตกาr sUAsia/Vladivostokr }r jX$วลาดิโวสต็อกr sU Asia/Qatarr }r jXกาตาร์r sU Asia/Dubair }r jX ดูใบr sU Asia/Yakutskr }r jXยาคุตสค์r sU Asia/Omskr }r jXโอมสก์r sU Africa/Banguir }r jXบังกีr sUAmerica/Paramaribor }r jXปารามาริโบr sUAfrica/Lubumbashir }r jXลูบัมบาชิr sUPacific/Marquesasr }r jXมาร์เควซัสr sU Asia/Anadyrr }r jXอานาดีร์r sUAmerica/New_Yorkr }r jXนิวยอร์กr sUAmerica/Dominicar }r jXโดมินิกาr sUAfrica/Porto-Novor }r jXปอร์โต-โนโวr sUAsia/Samarkandr }r jX!ซามาร์กานด์r sU Asia/Dushanber }r jXดูชานเบr sUAmerica/Torontor }r jXโทรอนโตr sU America/Bahiar }r jXบาเยียr sUAfrica/Kampalar }r jXคัมพาลาr sUAfrica/Ouagadougour }r jXวากาดูกูr sUAntarctica/South_Poler }r jXขั้วโลกใต้r sU Asia/Muscatr }r jXมัสกัตr sUAmerica/Edmontonr }r jXเอดมันตันr sU Pacific/Waker }r jX เวกr sUAmerica/Indiana/Tell_Cityr }r jX8เทลล์ซิตี, อินดีแอนาr sUAustralia/Darwinr }r jXดาร์วินr sUAmerica/Whitehorser }r jXไวต์ฮอร์สr sUAmerica/Swift_Currentr }r jX0สวิฟต์เคอร์เรนต์r sUEurope/Copenhagenr }r jXโคเปนเฮเกนr! sUAmerica/Montserratr" }r# jX!มอนเซอร์รัตr$ sU Asia/Tashkentr% }r& jXทาชเคนต์r' sUEurope/Simferopolr( }r) jX!ซิมเฟอโรโปลr* sUAmerica/Detroitr+ }r, jXดีทรอยต์r- sUAmerica/Shiprockr. }r/ jXชิปร็อกr0 sUAmerica/Grenadar1 }r2 jXเกรนาดาr3 sUAmerica/Indiana/Petersburgr4 }r5 jX*ปีเตอร์สเบิร์กr6 sUAsia/Pontianakr7 }r8 jXพอนเทียนักr9 sUAmerica/Caymanr: }r; jXเคย์แมนr< sU Europe/Athensr= }r> jXเอเธนส์r? sUAfrica/Khartoumr@ }rA jXคาร์ทูมrB sU Asia/ManilarC }rD jXมะนิลาrE sUAmerica/Santo_DomingorF }rG jX%ซานโต โดมิงโกrH sU America/JujuyrI }rJ jXจูจิวrK sU Europe/RomerL }rM jX โรมrN sUAmerica/Argentina/San_JuanrO }rP jXซานฮวนrQ sUAmerica/North_Dakota/New_SalemrR }rS jX;นิวเซเลม, นอร์ทดาโคตาrT sUPacific/Port_MoresbyrU }rV jX$พอร์ตมอร์สบีrW sUEurope/AndorrarX }rY jXอันดอร์ราrZ sUEurope/Luxembourgr[ }r\ jX$ลักเซมเบิร์กr] sUPacific/Honolulur^ }r_ jXโฮโนลูลูr` sUAmerica/St_Thomasra }rb jXเซนต์โธมัสrc sUPacific/Majurord }re jXมาจูโรrf sUAmerica/Mazatlanrg }rh jXมาซาทลานri sU Asia/Macaurj }rk jXมาเก๊าrl sUAsia/Choibalsanrm }rn jXโชบาลซานro sUAntarctica/McMurdorp }rq jXแมคมัวโดrr sUAmerica/Thunder_Bayrs }rt jX$ทันเดอร์เบย์ru sUAmerica/Los_Angelesrv }rw jX!ลอสแองเจลิสrx sU Asia/Kabulry }rz jXคาบูลr{ sUIndian/Antananarivor| }r} jX'อันตานานาริโวr~ sUAtlantic/Reykjavikr }r jXเรคยาวิกr sU Asia/Nicosiar }r jXนิโคเซียr sUPacific/Ponaper }r jXโปนาเปr sUPacific/Tongatapur }r jXตองกาตาปูr sUPacific/Pitcairnr }r jXพิตแคร์นr sUPacific/Easterr }r jXอีสเตอร์r sUAtlantic/South_Georgiar }r jX(เซาท์ จอร์เจียr sUAfrica/El_Aaiunr }r jXเอลไอย์อุงr sUAmerica/Campo_Grander }r jX!กัมปูกรันดีr sUAmerica/Dawson_Creekr }r jX"ดอว์สัน ครีกr sUAntarctica/Vostokr }r jXวอสต็อคr sUEurope/Bucharestr }r jXบูคาเรสr sUAmerica/Porto_Velhor }r jX!ปอร์ตูเวลโยr sU Europe/Monacor }r jXโมนาโกr sUAmerica/Indiana/Marengor }r jXมาเรงโกr sU Africa/Ceutar }r jXเซวตาr sUAmerica/Winnipegr }r jXวินนิเพกr sU Asia/Aqtober }r jXอัคโทบีr sU Africa/Dakarr }r jXดาการ์r sUAmerica/Fortalezar }r jXฟอร์ตาเลซาr sUPacific/Tarawar }r jXทาราวาr sUAfrica/Addis_Ababar }r jX$แอดดิสอาบาบาr sUPacific/Johnstonr }r jXจอห์นสตันr sUAsia/Qyzylordar }r jXไคซีลอร์ดาr sUAsia/Jerusalemr }r jXเยรูซาเร็มr sUPacific/Aucklandr }r jXโอคแลนด์r sUAmerica/Denverr }r jXเดนเวอร์r sUAmerica/Glace_Bayr }r jXอ่าวแกลซr sUAmerica/Hermosillor }r jXเอร์โมซีโยr sU Africa/Tunisr }r jXตูนิสr sUAmerica/Montevideor }r jX!มอนเตวิเดโอr sUAmerica/Resoluter }r jXเรโซลูทr sU Asia/Gazar }r jX กาซาr sU Europe/Dublinr }r jXดับบลินr sUAntarctica/DumontDUrviller }r jX6ดูมอนต์ดียูร์วิลล์r sUAmerica/Indiana/Knoxr }r jXนอกซ์r sUAsia/Novosibirskr }r jX'โนโวซิบิร์สก์r sU Africa/Kigalir }r jXคิกาลีr sU Africa/Lagosr }r jXลากอสr sU Europe/Sofiar }r jXโซเฟียr sU America/Limar }r jX ลิมาr sU Etc/Unknownr }r jXไม่ทราบr sUAmerica/Anchorager }r jXแองเคอเรจr sU Pacific/Naurur }r jXนาอูรูr suUscriptsr }r (UGurur Xเกอร์มูคิr UHebrr Xฮีบรูr UZzzzr X!ไม่ทราบภาษาr UPhnxr Xฟินิเชียนr UMoonr X มูนr USamrr Xซามาริทันr UChamr X จามr UArabr Xอาหรับr UGujrr Xคุชราตr UZxxxr X*ไม่มีภาษาเขียนr ULycir Xไลเซียr USinhr Xสิงหลr UTalur Xไทลื้อใหม่r UMongr Xมองโกเลียr UXpeor! X*เปอร์เซียโบราณr" UVispr# X6คำพูดที่มองเห็นได้r$ URjngr% X รจังr& UTaler' X ไทเลr( UMandr) Xแมนแดนr* UMlymr+ Xมาลายาลัมr, UTibtr- Xทิเบตr. UKalir/ Xคยาห์r0 UJpanr1 Xญี่ปุ่นr2 UPlrdr3 X3สัทศาสตร์พอลลาร์ดr4 UKanar5 Xกาตะกานะr6 ULydir7 Xลีเดียr8 ULepcr9 Xเลปชาr: USundr; Xซุนดาr< UYiiir= Xยิr> UJavar? X ชวาr@ UOryarA XโอริยาrB ULaoorC X ลาวrD UUgarrE XยูการิติกrF UCyrlrG XซีริลลิกrH UVaiirI XไวrJ UArmnrK Xอาร์เมเนียrL UCyrsrM XNซีริลลิกโบสถ์สลาโวนิกโบราณrN UKhmrrO X เขมรrP USylorQ X!ไซโลทินากรีrR UItalrS X!อิตาลีโบราณrT UXsuxrU XXอักษรรูปลิ่มสุเมเรีย-อัคคาเดียrV UThaarW X ทานาrX UThairY X ไทยrZ UCprtr[ Xไซเปรียทr\ ULinbr] Xลีเนียร์บีr^ ULinar_ Xลีเนียร์เอr` UOsmara Xออสมันยาrb UHirarc Xฮิรางานะrd UHanire X ฮั่นrf UEgydrg X*ดีโมติกอียิปต์rh UQaairi Xอินเฮอริตrj UEgyhrk X0เฮียราติกอียิปต์rl UCansrm XZสัญลักษณ์ชนเผ่าพื้นเมืองแคนาดาrn UEgypro X9เฮียโรกลิฟส์อียิปต์rp UTfngrq Xทิฟินาคrr UShawrs Xชาเวียนrt UCirtru Xเซิร์ตrv UGeorrw Xจอร์เจียrx UTengry Xเทงวอร์rz UHrktr{ X<กาตะงานะหรือฮิรางานะr| UGeokr} XZคัตซูรี - อาซอมทัฟรูลีและนูสคูรีr~ UOgamr Xโอคัมr UDsrtr Xเดเซเรทr UGothr Xโกธิกr UHanor Xฮานูโนโอr UBalir Xบาหลีr UKorer Xเกาหลีr UHangr Xฮันกูลr UCarir Xคาเรียr UAvstr Xอเวสตันr UTagbr Xตักบันวาr UHansr X$ฮั่นประยุกต์r UHantr X$ฮั่นดั้งเดิมr URoror Xรองโกรองโกr UDevar Xเทวนาครีr UIndsr X-อินดัส - ฮารัปพันr UBopor Xโบโพโมโฟr UMymrr X พม่าr UTglgr Xตากาล็อกr UPermr X'เปอร์มิกโบราณr UBugir Xบูกิสr UPhagr Xฟากส์-พาr UBrair Xเบรลล์r UBrahr Xบรามีr UBatkr Xบาตักr UMeror Xเมโรติกr ULimbr Xลิมบูr UMteir Xมีเตยมาเยกr UTelur Xเทลูกูr UTamlr X ทมิฬr USarar Xซาราทิr ULatgr X!ลาติน - แกลิกr ULatfr X-ลาติน - ฟรังเตอร์r UKharr Xคาโรสติr UNkoor Xเอ็นโกr UPhlvr X$บุ๊กปะห์ลาวีr ULatnr Xลาตินr UMayar X-มายันฮีโรกลิฟส์r ULanar Xล้านนาr UEthir Xเอธิโอเปียr UHmngr Xพาฮาวมองr UBuhdr Xบูฮิดr UCoptr Xคอปติกr UGlagr Xกลาโกลิติกr URunrr Xรูนิกr UOrkhr Xออร์คอนr UHungr X$ฮังการีโบราณr UGrekr X กรีกr UCherr Xเชอโรกีr UZyyyr Xสามัญr USyrcr Xซีเรียคr UBlisr X$บลิสซิมโบลส์r UBengr Xเบงกาลีr USyrer X3ซีเรึยคเอสทราจีโลr USyrjr X*ซีเรียคตะวันตกr USyrnr X-ซีเรียคตะวันออกr UKndar Xกันนาดาr uUvariantsr }r (UNEDISr X?ภาษาพื้นเมืองนาทิโซเนr UAREVMDAr X3อาร์เมเนียตะวันตกr UFONIPAr X$สัทอักษรสากลr U1996r XAเยอรมันออร์โธกราฟีปี 1996r UREVISEDr X9ออร์โธกราฟิปรับปรุงr UAREVELAr X6อาร์เมเนียตะวันออกr UPOSIXr X!คอมพิวเตอร์r UROZAJr Xเรเซียนr UPOLYTONr Xโพลีโทนิกr USAAHOr X ซาโฮr U1901r XNเยอรมันออร์โธกราฟีดั้งเดิมr uUnumber_symbolsr }r (Uinfinityr X∞r UnativeZeroDigitr X0r UperMiller X‰r U minusSignr h:U percentSignr hDU patternDigitr X#r UplusSignr X+r uUcurrency_namesr }r (UXXXr X3ไม่มีหน่วยเงินตราr UDZDr X-ดีนาร์แอลจีเรียr ULVRr X'รูเบิลลัตเวียr UKMFr X'ฟรังก์คอโมโรสr UBOPr X$เปโซโบลิเวียr UEGPr! X$ปอนด์อียิปต์r" UBGLr# X3ฮาร์ดลีฟบัลแกเรียr$ UBGNr% X-นิวลีฟบัลแกเรียr& UPABr' X$บัลบัวปานามาr( UYUMr) XEโนวิย์ดีนาร์ยูโกสลาเวียr* UZWDr+ X-ดอลลาร์ซิมบับเวr, UGHCr- Xเซดีกานาr. UXBDr/ X3หน่วยบัญชียุโรป [XBD]r0 UBOBr1 Xโบลิเวียโนr2 UXBAr3 X6หน่วยคอมโพสิตยุโรปr4 UDKKr5 X$โครนเดนมาร์กr6 UXBCr7 X3หน่วยบัญชียุโรป [XBC]r8 UXBBr9 X6หน่วยโมเนทารียุโรปr: UBWPr; X$พูลาบอตสวานาr< ULBPr= X$ปอนด์เลบานอนr> UTZSr? X-ชิลลิงแทนซาเนียr@ UVNDrA X!ดองเวียดนามrB UNADrC X-ดอลลาร์นามิเบียrD UAOArE X'กวานซาแองโกลาrF UWSTrG X0ทาลาซามัวตะวันตกrH UAONrI X<นิวกวานซาแองโกลา (1990-2000)rJ UKHRrK X$เรียลกัมพูชาrL jX*ริงกิตมาเลเซียrM UAOKrN X3กวานซาแองโกลา (1977-1990)rO USOSrP X*ชิลลิงโซมาเลียrQ UKYDrR XBดอลลาร์หมู่เกาะเคย์แมนrS ULYDrT X$ดีนาร์ลิเบียrU UUAHrV X*ฮรีฟเนียยูเครนrW UUAKrX X9คาร์โบวาเนตซ์ยูเครนrY UUGXrZ X'ชิลลิงยูกันดาr[ UJODr\ X'ดีนาร์จอร์แดนr] UAORr^ XNกวานซารีจัสทาโดแองโกลา (1995-1999)r_ USURr` X'รูเบิลโซเวียตra UAWGrb X*กิลเดอร์อารูบาrc USARrd X9เรียลซาอุดิอาระเบียre UFIMrf X-มาร์กกาฟินแลนด์rg jX$เหรียญฮ่องกงrh USRGri X-กิลเดอร์สุรินัมrj UTPErk X'เอสคูโดติมอร์rl UMGFrm X3ฟรังก์มาดากัสการ์rn UCHEro X9ยูโรดับเบิลยูไออาร์rp UCHFrq Xฟรังก์สวิสrr UGIPrs X-ปอนด์ยิบรอลตาร์rt UBYRru X'รูเบิลเบลารุสrv UALLrw X$เลกอัลบาเนียrx UXPDry Xพัลลาดีมrz UUGSr{ X6ซิลลิ่งอูกันดา (1966-1987)r| UMROr} X3ออกิวยามอริเตเนียr~ UBOVr X'มฟดอลโบลิเวียr UHRKr X'คูนาโครเอเชียr UDJFr X$ฟรังก์จิบูตีr UHRDr X-ดีนาร์โครเอเชียr UPESr Xซอลเปรูr UEQEr Xเอ็กเวเลr UITLr Xลีราอิตาลีr UXAFr XZฟรังก์เซฟาธนาคารรัฐแอฟริกากลางr UBNDr X$ดอลลาร์บรูไนr UISKr X*โครนาไอซ์แลนด์r UZALr XEแรนด์แอฟริกาใต้ (การเงิน)r USRDr X-ดอลลาร์ซูรินาเมr UNIOr X?คอร์โดบาโอโรนิการากัวr ULAKr Xกีบลาวr UNICr X3คอร์โดบานิการากัวr UNPRr Xรูปีเนปาลr UMZEr X-เอสคูโดโมซัมบิกr UUYUr X$เปโซอุรุกวัยr ULUCr X`คอนเวอร์ทิเบิลฟรังก์ลักเซมเบิร์กr UJMDr X'ดอลลาร์จาเมกาr UFRFr X*ฟรังก์ฝรั่งเศสr UMAFr X*ฟรังก์โมร็อกโกr UMZMr X-เมทิคัลโมซัมบิกr UMZNr X-เมติคัลโมซัมบิกr UPHPr X*เปโซฟิลิปปินส์r UZARr X-แรนด์แอฟริกาใต้r URHDr X-ดอลลาร์โรดีเซียr UGWPr X*เปโซกีนีบิสเซาr ULUFr X6ฟรังก์ลักเซมเบิร์กr UBELr XBฟรังก์เบลเยียม (การเงิน)r UBECr XWฟรังก์เบลเยียม (เปลี่ยนแปลงได้)r UNGNr X$ไนราไนจีเรียr UYUNr X3ดีนาร์ยูโกสลาเวียr UBEFr X*ฟรังก์เบลเยียมr UPLZr X0ซวอตีโปแลนด์ (1950-1995)r UCRCr X*โคลอนคอสตาริกาr UTRLr Xลีราตุรกีr UDEMr X$มาร์กเยอรมนีr UEEKr X'ครูนเอสโตเนียr UMWKr X!ควาชามาลาวีr UTTDr XHดอลลาร์ตรินิแดดและโตเบโกr ULKRr X$รูปีศรีลังกาr USKKr X$โครูนาสโลวักr UCVEr X<เคปเวอร์เดอร์เอสคูโดr jX$รูปีปากีสถานr UHUFr X*ฟอรินต์ฮังการีr UROLr X-ลิวโรมาเนียเก่าr UXEUr X6หน่วยสกุลเงินยุโรปr UBMDr X3ดอลลาร์เบอร์มิวดาr UOMRr Xเรียลโอมานr ULSLr Xโลตีเลโซโทr ULSMr Xมาโลตีr UMNTr X-ตูกริกมองโกเลียr UAMDr X$ดรัมอาเมเนียr UYUDr XBฮาร์ดดีนาร์ยูโกสลาเวียr UBUKr Xจ๊าดพม่าr USYPr X!ปอนด์ซีเรียr UQARr X!เรียลกาตาร์r UNLGr X<กิลเดอร์เนเธอร์แลนด์r UGEKr X6คูปอนลาริตจอร์เจียr UMTPr Xปอนด์มอลตาr jX<ปอนด์สเตอร์ลิงอังกฤษr UGELr X$ลารีจอร์เจียr USHPr X0ปอนด์เซนต์เฮเลนาr UAFNr Xอัฟกานีr USBDr X6ดอลลาร์เกาะโซโลมอนr UCSKr XEฮาร์ดโครูนาเช็กโกสโลวักr UKPWr X*วอนเกาหลีเหนือr UXREr X$กองทุนไรเน็ตr UCSDr X9ดีนาร์เซอร์เบียเก่าr UAFAr X!อัฟกานี (1927-2002)r jX บาทr UBYBr XHนิวรูเบิลเบลารัสเซีย (1994-1999)r UBDTr X'ตากาบังกลาเทศr UGRDr Xดรัชมากรีกr UYERr Xเรียลเยเมนr UDDMr XKออสต์มาร์กเยอรมันตะวันออกr USZLr X9ลิลันกีนีสวาซิแลนด์r UHTGr Xกอร์ดเฮติr UTRYr X,ตุรกี ลีร่า ใหม่r UMGAr X9อาเรียรีมาดากัสการ์r UANGr XWกิลเดอร์เนเธอร์แลนด์แอนทิลลิสr ULRDr X-ดอลลาร์ไลบีเรียr! URWFr" X$ฟรังก์รวันดาr# UNOKr$ X$โครนนอร์เวย์r% UMXVr& X?อินเวอร์เซียนเม็กซิโกr' UKESr( X$ชิลลิ่งเคนยาr) UMOPr* X$ปาตากามาเก๊าr+ UINRr, X!รูปีอินเดียr- jX$เปโซแม็กซิโกr. UCZKr/ X9โครูนาสาธารณรัฐเช็กr0 UTJSr1 X0โซโมนีทาจิกิสถานr2 UTJRr3 X0รูเบิลทาจิกิสถานr4 UBTNr5 X$กัลทรัมภูฏานr6 UYDDr7 X!ดีนาร์เยเมนr8 UGWEr9 X9เอสคูโดกินีโปรตุเกสr: UCOPr; X'เปโซโคลัมเบียr< UCOUr= Xวาเลอร์รีลr> UMTLr? Xลีรามอลตาr@ UMURrA X'รูปีมอริเชียสrB jX3รูเปียอินโดนีเซียrC UHNLrD X*เลมปิราฮอดูรัสrE UXPFrF X'ฟรังก์ซีเอฟพีrG jX!ดอลลาร์ฟิจิrH UETBrI X0เบอรร์เอธิโอเปียrJ UPENrK X!ซอลนูโวเปรูrL UBZDrM X$ดอลลาร์เบลีซrN UCHWrO X?ฟรังก์ดับเบิลยูไออาร์rP UATSrQ X*ชิลลิงออสเตรียrR UILPrS X'ปอนด์อิสราเอลrT UZRNrU X$นิวแซร์คองโกrV UDOPrW X$เปโซโดมินิกาrX ULULrY XTไฟแนลเชียลฟรังก์ลักเซมเบิร์กrZ UTMMr[ X9มานัตเติร์กเมนิสถานr\ UTWDr] X*ดอลลาร์ไต้หวันr^ UMDLr_ X!ลิวมอลโดวานr` UXPTra Xแพลตินัมrb UECVrc XKวาเลอร์คอนสแตนต์เอกวาดอร์rd UECSre X*ซูเกรเอกวาดอร์rf UBSDrg X*ดอลลาร์บาฮามาสrh USEKri X!โครนาสวีเดนrj UTOPrk X$ปาอังกาตองกาrl UPEIrm Xอินตีเปรูrn UZMKro X$กวาชาแซมเบียrp UMVRrq X6รูฟิยาเกาะมัลดีฟส์rr UXTSrs X3รหัสทดสอบสกุลเงินrt jX3ดอลลาร์ออสเตรเลียru UADPrv X-เปเซตาอันดอร์ราrw UCUPrx Xเปโซคิวบาry jXปอนด์ไอริชrz UCLFr{ X!ฟูเมนโตชิลีr| UBBDr} X0ดอลลาร์บาร์เบโดสr~ UKRWr X$วอนเกาหลีใต้r UGMDr X'ดาลาซีแกมเบียr UVEFr XHฟูร์เตโบลีวาร์เวเนซุเอลาr UGTQr X0เควตซัลกัวเตมาลาr UVEBr X6โบลิวาร์เวเนซุเอลาr UXOFr Xoฟรังก์เซฟาธนาคารกลางรัฐแอฟริกาตะวันตกr USITr X-ทอลาร์สโลวีเนียr USDPr Xปอนด์ซูดานr jXเปโซชิลีr UEURr X ยูโรr UCDFr X!ฟรังก์คองโกr UXCDr XKดอลลาร์แคริบเบียนตะวันออกr UKZTr X*เทนจ์คาซัคสถานr URUBr X'รูเบิลรัสเซียr UXFUr X<ฟรังก์ยูไอซีฝรั่งเศสr UXAGr X เงินr UBRRr X'ครูเซโรบราซิลr UBRNr X3ครูซาโดโนโวบราซิลr UBRLr X รีลr UMMKr Xจัคพม่าr UUYPr X0เปโซอุรุกวัย (1975-1993)r URURr X3รูเบิลรัสเซีย (1991-1998)r UPLNr X$ซลอตีโปแลนด์r UBREr X3ครูเซโรบราซิล (1990-1993)r UPYGr X-กวารานีปารากวัยr UBRCr X'ครูซาโดบราซิลr UBRBr X?ครูเซโรโนโวบราซิล (1967-1986)r USVCr X3โคลอนเอลซัลวาดอร์r UAEDr XQดีแรห์มสหรัฐอาหรับเอมิเรตส์r UGNSr Xไซลีกินีr UMKDr X0ดีนาร์มาซิโดเนียr UAZMr X3มานัตอาเซอร์ไบจันr UAZNr X3มานัตอาเซอร์ไบจานr UUSNr X?ดอลลาร์สหรัฐ (วันถัดไป)r UGQEr XZเอ็กเวเลกินีนาอิเควทอเรียลกินีr UVUVr X$วาตูวานูอาตูr UBADr XOดีนาร์บอสเนีย-เฮอร์เซโกวีนาr UGNFr Xฟรังก์กินีr UMXPr X<ซิลเวอรืเม็กซิโก (1861-1992)r UIQDr X!ดีนาร์อิรักr UERNr X*นากฟาเอริเทรียr UBAMr XOมาร​์กบอสเนีย-เฮอร์เซโกวีนาr USCRr X!รูปีเซเชลส์r jX'ดอลลาร์แคนาดาr USDDr X!ดีนาร์ซูดานr UCYPr X!ปอนด์ไซปรัสr UMADr X-ดีแรห์มโมร็อกโกr UKWDr X!ดีนาร์คูเวตr UBIFr X'ฟรังก์บุรุนดีr ULTTr X0ทาโลนัสลิทัวเนียr UPGKr X0กีนาปาปัวนิวกีนีr ULTLr X'ลีตาลิทัวเนียr jX-ดอลลาร์สิงคโปร์r UUZSr X*ซัมอุซเบกิสถานr USTDr XEดอบราเซาตูเมและปรินซิปีr UXFOr X3ฟรังก์ทองฝรั่งเศสr UMLFr Xฟรังก์มาลีr UESPr Xเปเซตาสเปนr UIRRr X$เรียลอิหร่านr UZRZr Xแซร์คองโกr jX3หยวนเหรินเหมินบี้r USLLr X6ลีโอนเซียร์ราลีโอนr UTNDr X*ดีนาร์ตูนิเซียr UGYDr X*ดอลลาร์กายอานาr UESBr Xcเปเซตาสเปน (บัญชีที่เปลี่ยนแปลงได้)r UESAr X0เปเซตาสเปน (บัญชี)r jX3ดอลลาร์นิวซีแลนด์r UFKPrX9ปอนด์เกาะฟอล์กแลนด์rULVLrX$ลัตส์ลัตเวียrUUSSrXHดอลลาร์สหรัฐ (วันเดียวกัน)rUUSDrX$ดอลลาร์สหรัฐrUARPrX<เปโซอาร์เจนติน่า (1983-1985)r UKGSr X*ซอมคีร์กีซสถานr jX0เปโซอาร์เจนติน่าr UILSr X'เชเกลอิสราเอลrURONrX!ลิวโรมาเนียrURSDrX-ดีนาร์เซอร์เบียrUBHDrX'ดีนาร์บาห์เรนrUJPYrX เยนrUARArX6ออสตรัลอาร์เจนตินาrUPTErX-เอสคูโดโปรตุเกสrUXAUrX ทองruUmonthsr}r(U stand-aloner}r Unarrowr!}r"(KXม.ค.r#KXก.พ.r$KX มี.ค.r%KX เม.ย.r&KXพ.ค.r'KX มิ.ย.r(KXก.ค.r)KXส.ค.r*K Xก.ย.r+K Xต.ค.r,K Xพ.ย.r-K Xธ.ค.r.usUformatr/}r0(Uwider1}r2(KXมกราคมr3KXกุมภาพันธ์r4KXมีนาคมr5KXเมษายนr6KXพฤษภาคมr7KXมิถุนายนr8KXกรกฎาคมr9KXสิงหาคมr:K Xกันยายนr;K Xตุลาคมr<K Xพฤศจิกายนr=K Xธันวาคมr>uU abbreviatedr?}r@(KXม.ค.rAKXก.พ.rBKX มี.ค.rCKX เม.ย.rDKXพ.ค.rEKX มิ.ย.rFKXก.ค.rGKXส.ค.rHK Xก.ย.rIK Xต.ค.rJK Xพ.ย.rKK Xธ.ค.rLuuuUcurrency_formatsrM}rNNh*)rO}rP(h-Nh/Kh0KKrQh2h3h3rRh5KKrSh7X ¤#,##0.00rTh9X¤rUX¤-rVrWhjX*เวลาอาร์เมเนียr?uuUBrasiliar@}rA(jj}rB(jX<เวลาฤดูร้อนบราซิเลียrCjX'เวลาบราซิเลียrDuuU North_MarianarE}rF(jj}rGjXKเวลาหมู่เกาะมาเรียนาเหนือrHsuUChinarI}rJ(j}rK(jXCDT (จีน)rLjXCST (จีน)rMujj}rNjX*เวลามาตรฐานจีนrOsuUMalayarP}rQ(jj}rRjXเวลามาลายาrSsuUGreenland_WesternrT}rU(jj}rV(jXQเวลาฤดูร้อนกรีนแลนด์ตะวันตกrWjX<เวลากรีนแลนด์ตะวันตกrXuuUDushanberY}rZ(jj}r[(jX6เวลาฤดูร้อนดูชานเบr\jX!เวลาดูชานเบr]uuUGeorgiar^}r_(jj}r`(jX9เวลาฤดูร้อนจอร์เจียrajX$เวลาจอร์เจียrbuuUChilerc}rd(jj}re(jX-เวลาฤดูร้อนชิลีrfjXเวลาชิลีrguuUKorearh}ri(jj}rj(jXเวลาเกาหลีrkjX3เวลามาตรฐานเกาหลีrluuUEurope_Westernrm}rn(jj}ro(jXEเวลาฤดูร้อนยุโรปตะวันตกrpjX0เวลายุโรปตะวันตกrquuUAfrica_Easternrr}rs(jj}rtjX9เวลาแอฟริกาตะวันออกrusuU Turkmenistanrv}rw(jj}rx(jXKเวลาฤดูร้อนเติร์กเมนิสถานryjX6เวลาเติร์กเมนิสถานrzuuUAlaskar{}r|(jj}r}(jX!เวลาอะแลสกาr~jX6เวลามาตรฐานอะแลสกาruuUAmerica_Easternr}r(jj}r(jX$เวลาตะวันออกrjX9เวลามาตรฐานตะวันออกruuU Tajikistanr}r(jj}rjX*เวลาทาจิกิสถานrsuUAfrica_Southernr}r(jj}rjX?เวลามาตรฐานแอฟริกาใต้rsuUAmerica_Pacificr}r(jj}r(jX!เวลาแปซิฟิคrjX6เวลามาตรฐานแปซิฟิคruuUIndonesia_Westernr}r(jj}rjXBเวลาอินโดนีเซียตะวันตกrsuUAmerica_Centralr}r(jj}r(jXเวลากลางrjX-เวลามาตรฐานกลางruuUGreenland_Easternr}r(jj}r(jXTเวลาฤดูร้อนกรีนแลนด์ตะวันออกrjX?เวลากรีนแลนด์ตะวันออกruuU Newfoundlandr}r(jj}r(jX3เวลานิวฟันด์แลนด์rjXHเวลามาตรฐานนิวฟันด์แลนด์ruuUGMTr}r(jj}rjX3เวลามาตรฐานกรีนิชrsuUMarshall_Islandsr}r(jj}rjX?เวลาหมู่เกาะมาร์แชลล์rsuUSamoar}r(jj}rjX0เวลามาตรฐานซามัวrsuUMacaur}r(jj}r(jX3เวลาฤดูร้อนมาเก๊าrjXเวลามาเก๊าruuUSurinamer}r(jj}rjX$เวลาซูรินาเมrsuUChamorror}r(jj}rjX9เวลามาตรฐานชามอร์โรrsuUGuamr}r(j}rjXGST (กวม)rsjj}rjX*เวลามาตรฐานกวมrsuUBakur}r(jj}r(jX-เวลาฤดูร้อนบากูrjXเวลาบากูruuUIndiar}r(jj}rjX6เวลามาตรฐานอินเดียrsuUAfrica_Centralr}r(jj}rjX-เวลาแอฟริกากลางrsuUSamarar}r(jj}r(jX3เวลาฤดูร้อนซามาราrjXเวลาซามาราruuU Uzbekistanr}r(jj}r(jXBเวลาฤดูร้อนอุซเบกิสถานrjX-เวลาอุซเบกิสถานruuUGreenland_Centralr}r(jj}r(jXHเวลาฤดูร้อนกรีนแลนด์กลางrjX3เวลากรีนแลนด์กลางruuUYerevanr}r(jj}r(jX6เวลาฤดูร้อนเยเรวานrjX!เวลาเยเรวานruuUYukonr}r(jj}r(jXเวลายูคอนrjX0เวลามาตรฐานยูคอนruuUPakistanr}r(jj}r(jX9เวลาฤดูร้อนปากีสถานrjX$เวลาปากีสถานruuUAustralia_Westernr}r(jj}r(jX?เวลาออสเตรเลียตะวันตกrjXTเวลามาตรฐานออสเตรเลียตะวันตกruuU Sverdlovskr}r(jj}r(jXKเวลาฤดูร้อนสเวียร์ดลอฟสค์rjX6เวลาสเวียร์ดลอฟสค์ruuU Qyzylordar}r(jj}r(jXEเวลาฤดูร้อนคืยซิลออร์ดาrjX0เวลาคืยซิลออร์ดาruuuUerasr}r(Uwider}r(KX?ปีก่อนคริสต์ศักราชที่rKX$คริสต์ศักราชruU abbreviatedr}r(KX%ปีก่อน ค.ศ. ที่rKXค.ศ.ruuu.PK[,'~~(site-packages/babel/localedata/so_KE.datnu[}q(Ucurrency_symbolsq}qUSOSqXSOSqsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q U week_dataq }q (Umin_daysq KU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[%6hh%site-packages/babel/localedata/el.datnu[}q(U zone_formatsq}q(UregionqX%sqUgmtqXGMT%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q (U stand-aloneq }q U abbreviatedq}q(KXΤ1qKXΤ2qKXΤ3qKXΤ4qusUformatq}q(Uwideq}q(KX1ο τρίμηνοqKX2ο τρίμηνοqKX3ο τρίμηνοqKX4ο τρίμηνοquU abbreviatedq}q(KXΤ1qKXΤ2qKXΤ3q KXΤ4q!uuuUperiodsq"}q#(Uamq$Xπ.μ.q%Upmq&Xμ.μ.q'uUscientific_formatsq(}q)Upercent_formatsq*}q+U week_dataq,}q-(Umin_daysq.KU weekend_startq/KU first_dayq0KU weekend_endq1KuU time_formatsq2}q3(Umediumq4cbabel.dates DateTimePattern q5)q6}q7(Upatternq8X h:mm:ss aq9Uformatq:X%(h)s:%(mm)s:%(ss)s %(a)sq;ubUfullq(h8X h:mm:ss a vq?h:X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq@ubUlongqAh5)qB}qC(h8X h:mm:ss a zqDh:X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqEubUshortqFh5)qG}qH(h8Xh:mm aqIh:X%(h)s:%(mm)s %(a)sqJubuU languagesqK}qL(Uzh_HantqMX'Κινεζικά ΠαραδοσιακάqNUguqOXΓκουγιαράτιqPUromqQXΡωμανικάqRUafaqSX%Αφροασιατική ΓλώσσαqTUgdqUXΣκωτικά ΚελτικάqVUgaqWXΙρλανδικάqXUgnqYXΓκουαράνιqZUglq[XΓαλικιανάq\Ugmhq]X"Μέσα Άνω Γερμανικάq^Ulbq_XΛουξεμβουργικάq`UlaqaXΛατινικάqbUlnqcXΛινγκάλαqdUloqeXΛαοθιανάqfUtrqgXΤουρκικάqhUlvqiXΛετονικάqjUausqkX#Αυστραλιανή ΓλώσσαqlUtkqmXΤουρκμενικάqnUthqoXΤαϊλανδικάqpUtiqqXΤιγκρίνυαqrUsuqsXΣουδανικάqtUtequXΤελούγκουqvUpt_PTqwX'Πορτογαλικά ΙβηρικήςqxUfilqyXΦιλιππινέζικαqzUhawq{XΧαβανέζικαq|Uyiq}XΙουδαϊκάq~UmgaqXΜέσα ΙρλανδικάqUpt_BRqX)Πορτογαλικά ΒραζιλίαςqUdeqXΓερμανικάqUdaqX ΔανικάqUiraqXιρανικάqUbatqXΒαλτική ΓλώσσαqUcrhqX!Τουρκικά ΚριμαίαςqUarpqXΑράπαχοqUelqXΕλληνικάqUeoqXΕσπεράντοqUenqXΑγγλικάqUartqXΤεχνητή ΓλώσσαqUbeqXΛευκορωσικάqUzh_HansqX)Κινεζικά ΑπλοποιημέναqUphiqX%Φιλιππινέζικα (Άλλα)qUsgaqXΠαλαιά ΙρλανδικάqUarcqXΑραμαϊκάqUen_USqX2Αγγλικά Ηνωμένων ΠολιτειώνqUeuqXΒασκικάqUetqXΕσθονικάqUsemqXΣημιτικά (Άλλα)qUesqXΙσπανικάqUruqX ΡωσικάqUgohqX&Παλαιά Άνω ΓερμανικάqUpeoqXΑρχαία ΠερσικάqUde_ATqX#Γερμανικά ΑυστρίαςqUgotqXΓοτθικάqUroqXΡουμανικάqUjvqXΙαβανέζικαqUen_CAqXΑγγλικά ΚαναδάqUbgqXΒουλγαρικάqUukqXΟυκρανικάqUwoqXΓουόλοφqUbnqXΜπενγκάλιqUboqXΘιβετιανάqUbhqXΜπιχάριqUbrqXΒρετονικάqUbsqXΒοσνιακάqUmulqX!Πολλαπλές ΓλώσσεςqUjaqXΙαπωνικάqUcopqXΚοπτικάqUsyrqXΣυριακάqUocqXΟκσιτανικάqUundqX3Άγνωστη ή Ακατάλληλη ΓλώσσαqUtwqXΤούιqUtlhqXΚλίνγκονqUorqX ΟρίγιαqUxhqXΖόσαqUcoqXΚορσικανικάqUjrbqXΙουδαϊκά-ΑραβικάqUcaqXΚαταλανικάqUcyqXΟυαλικάqUnonqXΠαλαιά ΝορβηγικάqUcsqXΤσεχικάqUzhqXΚινεζικάqUapaqXΓλώσσα ΑπάτσιqUde_CHqX#Γερμανικά ΕλβετίαςqUpsqX ΠάστοqUdumqXΜέσα ΟλλανδικάqUptqXΠορτογαλικάqUfroqXΠαλαιά ΓαλλικάqUltqXΛιθουανικάqUfrmqXΜέσα ΓαλλικάqUpaqXΠαντζαπικάqUviqXΒιετναμέζικαrUzxxrX:Χωρίς γλωσσολογικό περιεχόμενοrUes_ESrX!Ισπανικά ΙβηρικήςrUen_GBrX2Αγγλικά Ηνωμένου ΒασιλείουrUhyrXΑρμενικάrUhrr XΚροατικάr Uotar X#Τουρκικά Οθωμανικάr Uegyr X!Αρχαία ΑιγυπτιακάrUhurXΟυγγρικάrUhirX ΧίντιrUherXΕβραϊκάrUuzrXΟυζμπεκικάrUmlrXΜαλαγιαλάμrUmorXΜολδαβικάrUmnrXΜογγολικάrUcaurXΚαυκάσια ΓλώσσαrUurrXΟυρντούr Umtr!XΜαλτέζικαr"Ucair#XCΙνδιανική Γλώσσα Κεντρικής Αμερικήςr$Uplr%XΠολωνικάr&Umsr'X Μαλάιr(Umrr)X Μαράθιr*Uugr+XΟυιγουρικάr,Utar-X Ταμίλr.Umyr/XΒιρμανικάr0Uslar1XΣλαβικά (Άλλα)r2Usair3X=Ινδιανική Γλώσσα Νοτίου Αμερικήςr4Uangr5XΠαλαιά Αγγλικάr6Uafr7XΑφρικάανςr8Uner9X Νεπάλιr:Uisr;XΙσλανδικάr<Uamr=XΑμαρικάr>Uitr?XΙταλικάr@Unl_BErAXΦλαμανδικάrBUiarCXΙντερλίνγκουαrDUasrEXΑσαμέζικαrFUarrGXΑραβικάrHUes_419rIX4Ισπανικά Λατινικής ΑμερικήςrJUzurKX ΖουλούrLUayrMX ΑϊμάραrNUinerOX'Ινδοευρωπαϊκά (¨Αλλη)rPUazrQXΑζερμπαϊτζανικάrRUierSXΙντερλίνγκουεrTUidrUXΙνδονησιακάrVUskrWXΣλοβακικάrXUjprrYXΙουδαϊκά-ΠερσικάrZUnlr[XΟλλανδικάr\Unnr]X!Νορβηγικά Νινόρσκr^Unor_XΝορβηγικάr`UnairaX=Ινδιανικά Βόρειας Αμερικής (Άλλα)rbUenmrcXΜέσα ΑγγλικάrdUen_AUreX#Αγγλικά ΑυστραλίαςrfUgrcrgXΑρχαία ΕλληνικάrhUmisriXΔιάφορες ΓλώσσεςrjUfrrkXΓαλλικάrlUcelrmXΚελτική ΓλώσσαrnUphnroXΦοινικικάrpUfyrqXΦριζιανάrrUsvrsXΣουηδικάrtUfaruXΠερσικάrvUfr_CHrwXΓαλλικά ΕλβετίαςrxUfiryXΦινλανδικάrzUsar{XΣανσκριτικάr|Ufr_CAr}XΓαλλικά Καναδάr~UforX ΦαρόεrUkarXΓεωργιανάrUsrrXΣερβικάrUsqrXΑλβανικάrUsitrX'Σινοθιβετιανή ΓλώσσαrUkorXΚορεατικάrUknrXΚανάνταrUkmrXΚαμποτζιανάrUksrXΚασμίριrUsirXΣινχαλέζικαrUshrXΣερβοκροατικάrUsorX ΣομάλιrUmkrXΣλαβομακεδονικάrUkurXΚουρδικάrUslrXΣλοβενικάrUkyrXΚυργιζικάrUswrXΣουαχίλιrUsdrX ΣίντιruU territoriesr}r(UBDrXΜπανγκλαντέςrUBErX ΒέλγιοrUBFrXΜπουρκίνα ΦάσοrUBGrXΒουλγαρίαrUVErXΒενεζουέλαrUBArX#Βοσνία - ΕρζεγοβίνηrUBBrXΜπαρμπάντοςrUWFrX1Νήσοι Ουαλλίς και ΦουτουνάrUBLrX#Άγιος ΒαρθολομαίοςrUBMrXΒερμούδεςrUBNrX'Μπρουνέι ΝταρουσαλάμrUBOrXΒολιβίαrUBHrXΜπαχρέινrUBIrXΜπουρούντιrUBJrX ΜπένινrUBTrXΜπουτάνrU011rXΔυτική ΑφρικήrUBVrXΝήσος ΜπουβέrUBWrXΜποτσουάναrU014rXΑνατολική ΑφρικήrU015rXΒόρεια ΑφρικήrUBRrXΒραζιλίαrU017rXΜέση ΑφρικήrU018rXΝότια Αφρική [018]rU019rXΑμερικήrUBYrXΛευκορωσίαrUBZrX ΜπελίζrULVrXΛετονίαrURWrXΡουάνταrURSrX ΣερβίαrUTLrXΑνατολικό ΤιμόρrURErXΡεϋνιόνrUTMrXΤουρκμενιστάνrUOMrXΟμάνrUTJrXΤατζικιστάνrUROrXΡουμανίαrUTKrXΤοκελάουrUGWrXΓουινέα-ΜπισάουrUGUrX ΓκουάμrUGTrXΓουατεμάλαrUGSrXKΝότια Γεωργία και Νότιες Νήσοι ΣάντουιτςrUGRrX ΕλλάδαrUGQrX!Ισημερινή ΓουινέαrUGPrXΓουαδελούπηrUJPrXΙαπωνίαrUKIrXΚιριμπάτιrUGYrXΓουιάναrUGGrXΓκερνσέιrUGFrXΓαλλική ΓουιάναrUGErXΓεωργίαrUGDr XΓρενάδαr U021r XΒόρειος Αμερικήr UGBr XΗνωμένο ΒασίλειοrUGArXΓκαμπόνrUSVrXΕλ ΣαλβαδόρrUGNrXΓουινέαrUGMrXΓκάμπιαrUGLrXΓροιλανδίαrU029rXΚαραϊβικήrUGIrXΓιβραλτάρrUGHrX ΓκάναrUJErX Υερσέηr UTNr!XΤυνησίαr"UJMr#XΤζαμάικαr$U013r%XΚεντρική Αμερικήr&UWSr'X Σαμόαr(U419r)X9Λατινική Αμερική και Καραϊβικήr*UHRr+XΚροατίαr,UBSr-XΜπαχάμεςr.UHTr/XΑϊτήr0UHUr1XΟυγγαρίαr2UHKr3X_Χονγκ Κονγκ, Ειδική Διοικητική Περιφέρεια της Κίναςr4U039r5XΝότια Ευρώπηr6UHNr7XΟνδούραr8UFIr9XΦινλανδίαr:U142r;XΑσίαr<U030r=XΑνατολική Ασίαr>U034r?XΝότια Ασίαr@U035rAX%Νοτιοανατολική ΑσίαrBUPRrCXΠουέρτο ΡίκοrDUPSrEX%Παλαιστινιακά ΕδάφηrFU830rGXΝήσοι ΚαναλιούrHUFKrIXΝήσοι ΦώκλαντrJUIOrKX;Βρετανικά Έδάφη Ινδικού ΩκεανούrLUPWrMX ΠαλάουrNUPTrOXΠορτογαλίαrPUSJrQX1Σβαλμπάρντ και Γιαν ΜαγιένrRUMDrSXΜολδαβίαrTUFMrUXΜικρονησίαrVUIQrWXΙράκrXUPArYXΠαναμάςrZUPFr[X!Γαλλική Πολυνησίαr\UPGr]X$Παπούα - Νέα Γουινέαr^UPEr_X Περούr`UPKraXΠακιστάνrbUPHrcXΦιλιππίνεςrdUFOreXΝήσοι ΦερόεςrfUPNrgXΠίτκερνrhUPLriXΠολωνίαrjUPMrkX)Σαιντ Πιέρ και ΜικελόνrlUZMrmX ΖάμπιαrnUEHroXΔυτική ΣαχάραrpURUrqX ΡωσίαrrUEErsXΕσθονίαrtUEGruXΑίγυπτοςrvUZArwXΝότια ΑφρικήrxUECryXΙσημερινόςrzUITr{X Ιταλίαr|UVNr}XΒιετνάμr~UZZrX+Άγνωστη ή Άκυρη ΠεριοχήrUSBrXΝήσοι ΣολομώντοςrUETrXΑιθιοπίαrUSOrXΣομαλίαrUZWrXΖιμπάμπουεrUSArXΣαουδική ΑραβίαrUESrXΙσπανίαrUERrXΕρυθραίαrUMErXΜαυροβούνιοrUAQrXΑνταρκτικήrUMGrXΜαδαγασκάρηrUMFrXΆγιος ΜαρτίνοςrUMArX ΜαρόκοrUMCrX ΜονακόrUUZrXΟυζμπεκιστάνrUMMrXΜιανμάρrUMLrXΜάλιrUMOrXTΜακάο, Ειδική Διοικητική Περιφέρεια της ΚίναςrUMNrXΜογγολίαrUHMrX3Νήσοι Χερντ και ΜακντόναλντrUASrX!Αμερικανική ΣαμόαrUMKrXΠΓΔ ΜακεδονίαςrUMUrXΜαυρίκιοςrUMTrX ΜάλταrUMWrXΜαλάουιrUMVrXΜαλδίβεςrUMQrXΜαρτινίκαrUMPrX*Νήσοι Βόρειες ΜαριάνεςrUMSrXΜονσεράτrUMRrXΜαυριτανίαrUIMrXΝήσος ΜανrUUGrXΟυγκάνταrUTZrXΤανζανίαrUMYrXΜαλαισίαrUMXrX ΜεξικόrUILrX ΙσραήλrUFRrX ΓαλλίαrUAWrXΑρούμπαrUDOrX)Δομινικανή ΔημοκρατίαrUSHrXΑγία ΕλένηrUVCrX9Άγιος Βικέντιος και ΓρεναδίνεςrU054rXΜελανησίαrUDJrXΤζιμπουτίrUFJrX ΦίτζιrU057rX%Περιοχή ΜικρονησίαςrU172rXDΚοινοπολιτεία Ανεξαρτήτων ΠολιτειώνrU053rX1Αυστραλία και Νέα ΖηλανδίαrUNIrXΝικαράγουαrUNLrXΟλλανδίαrUNOrXΝορβηγίαrUNArXΝαμίμπιαrUVUrXΒανουάτουrUNCrXΝέα ΚαληδονίαrUNErX ΝίγηρrUNFrXΝήσος ΝόρφολκrUNGrXΝιγηρίαrUNZrXΝέα ΖηλανδίαrUNPrX ΝεπάλrUNRrXΝαούρουrUNUrX ΝιούεrU061rXΠολυνησίαrUCIrX!Ακτή ΕλεφαντοστούrUCHrXΕλβετίαrUCOrXΚολομβίαrUCNrXΚίναrUCMrXΚαμερούνrUCLrXΧιλήrUCCrXΝήσοι ΚόκοςrUCArXΚαναδάςrUCGr X Κονγκόr UCFr X5Κεντροαφρικανική Δημοκρατίαr UCDr XΚονγκό - ΚινσάσαrUCZrX ΤσεχίαrUCYrX ΚύπροςrUCXrX%Νήσος ΧριστουγέννωνrUCSrX*Σερβία και ΜαυροβούνιοrUCRrXΚόστα ΡίκαrUPYrXΠαραγουάηrUCVrX!Πράσινο ΑκρωτήριοrUCUrX ΚούβαrUSZrXΖουαζηλάνδηr USYr!X Συρίαr"UKGr#XΚιργιζίαr$UKEr%X Κένυαr&USRr'XΣουρινάμr(U143r)XΚεντρική Ασίαr*UKHr+XΚαμπότζηr,UKNr-X%Σαιντ Κιτς και Νέβιςr.UKMr/XΚομόρεςr0USTr1X'Σάο Τομέ και Πρίνσιπεr2USKr3XΣλοβακίαr4UKRr5XΝότια Κορέαr6USIr7XΣλοβενίαr8UKPr9XΒόρεια Κορέαr:UKWr;XΚουβέιτr<USNr=XΣενεγάληr>USMr?XΆγιος Μαρίνοςr@USLrAXΣιέρα ΛεόνεrBUSCrCXΣεϋχέλλεςrDUKZrEXΚαζακστάνrFUKYrGXΝήσοι ΚέιμανrHUSGrIXΣιγκαπούρηrJUSErKXΣουηδίαrLUSDrMX ΣουδάνrNU151rOXΑνατολική ΕυρώπηrPU150rQX ΕυρώπηrRUDMrSXΝτομίνικαrTU155rUXΔυτική ΕυρώπηrVU154rWXΒόρεια ΕυρώπηrXUVGrYX0Βρετανικές Παρθένοι ΝήσοιrZUDEr[XΓερμανίαr\UYEr]X Υεμένηr^UMHr_XΝήσοι Μάρσαλr`U062raX$Νότια Κεντρική ΑσίαrbUDZrcXΑλγερίαrdUUSreX#Ηνωμένες ΠολιτείεςrfUUYrgXΟυρουγουάηrhUYTriX ΜαγιότrjUUMrkXVΑπομακρυσμένες Νησίδες των Ηνωμένων ΠολιτειώνrlULBrmXΛίβανοςrnULCroXΑγία ΛουκίαrpULArqXΛάοςrrUTVrsXΤουβαλούrtUTWruX ΤαϊβάνrvUTTrwX(Τρινιδάδ και ΤομπάγκοrxUTRryXΤουρκίαrzULKr{XΣρι Λάνκαr|ULIr}XΛιχτενστάινr~UCKrXΝήσοι ΚουκrUTOrX ΤόνγκαrULTrXΛιθουανίαrULUrXΛουξεμβούργοrULRrXΛιβερίαrULSrX ΛεσότοrUTHrXΤαϊλάνδηrUTFrX$Γαλλικά Νότια ΕδάφηrUTGrX ΤόγκοrUTDrX ΤσαντrUTCrX)Νήσοι Τερκς και ΚάικοςrULYrX ΛιβύηrUVArXΒατικανόrU145rXΔυτική ΑσίαrUAErX,Ηνωμένα Αραβικά ΕμιράταrUADrX ΑνδόραrUAGrX0Αντίγκουα και ΜπαρμπούνταrUAFrXΑφγανιστάνrUAIrXΑνγκουίλαrUVIrX4Αμερικανικές Παρθένοι ΝήσοιrUISrXΙσλανδίαrUIRrXΙράνrUAMrXΑρμενίαrUALrXΑλβανίαrUAOrXΑνγκόλαrUANrX%Ολλανδικές ΑντίλλεςrU003rXΒόρεια ΑμερικήrU002rX ΑφρικήrU001rX ΚόσμοςrUARrXΑργεντινήrUAUrXΑυστραλίαrUATrXΑυστρίαrU005rXΝότια ΑμερικήrUINrX ΙνδίαrUAXrXΝήσοι ΆλαντrU009rXΩκεανίαrUAZrXΑζερμπαϊτζάνrUIErXΙρλανδίαrUIDrXΙνδονησίαrUJOrXΙορδανίαrUQUrXΕυρωπαϊκή ΈνωσηrUUArXΟυκρανίαrUQArX ΚατάρrUDKrX ΔανίαrUMZrXΜοζαμβίκηrUQOrX'Περιφερειακή ΩκεανίαruUdecimal_formatsr}rU date_formatsr}r(Umediumrh5)r}r(h8X dd MMM yyyyrh:X%(dd)s %(MMM)s %(yyyy)srubUfullrh5)r}r(h8XEEEE, dd MMMM yyyyrh:X"%(EEEE)s, %(dd)s %(MMMM)s %(yyyy)srubUlongrh5)r}r(h8X dd MMMM yyyyrh:X%(dd)s %(MMMM)s %(yyyy)srubUshortrh5)r}r(h8X dd/MM/yyyyrh:X%(dd)s/%(MM)s/%(yyyy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODr XJDr UHKDr XHK$r UCHFr XSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUUYUrXUr$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUSCRrXSRr UZARr!XRr"UNPRr#XNrsr$UBEFr%XBFr&UCRCr'XCr(UGBPr)XGBPr*UMWKr+XMKr,ULKRr-XSL Rer.USKKr/XSkr0UPKRr1XPrar2UHUFr3XFtr4UROLr5Xleur6UBMDr7XBer$r8UMNTr9XTugr:UAMDr;Xdramr<UUGXr=XU Shr>UJMDr?XJ$r@UGELrAXlarirBUZWDrCXZ$rDUTRLrEXTLrFUBDTrGXTkrHUGRDrIXΔρχrJUYERrKXYRlrLUANGrMXNA f.rNUXCDrOXEC$rPUNOKrQXNKrrRUINRrSXINRrTUMXNrUXMEX$rVUBTNrWXNurXUCOPrYXCol$rZUIDRr[XRpr\UFJDr]XF$r^UETBr_XBrr`UBZDraXBZ$rbUDOPrcXRD$rdUQARreXQRrfUSEKrgXSKrrhUSRGriXSfrjUIEPrkXIR£rlUBBDrmXBDS$rnUGTQroXQrpUVEBrqXBerrUCLPrsXCh$rtUALLruXlekrvUKZTrwXTrxUTTDryXTT$rzUOMRr{XROr|USBDr}XSI$r~UPLNrXZlrUKESrXK ShrUGYDrXG$rUMKDrXMDenrUTWDrXNT$rUGNFrXGFrUIQDrXIDrUBAMrXKMrUCADrXCan$rUCVErXCVEscrUKWDrXKDrUBIFrXFburUSOSrXSh.rUSGDrXS$rUIRRrXRIrUCNYrXYrUCYPrXΚυπριακή ΛίραrUMTLrXLmrUNZDrX$NZrUARSrXArg$rUSZLrXErUBHDrXBDruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXΚανάριαrsUAntarctica/Mawsonr}rjXΜόουσονrsUAtlantic/Madeirar}rjX ΜαδέραrsU Europe/Parisr}rjX ΠαρίσιrsUAmerica/Buenos_Airesr}rjXΜπουένος ΆιρεςrsUAustralia/Melbourner}rjXΜελβούρνηrsUAmerica/Miquelonr}rjXΜικελόνrsU Africa/Maserur}rjX ΛεσόθοrsUAfrica/Tripolir}rjX ΛιβύηrsUPacific/Tongatapur}rjXΤονγκατάπουrsUEurope/Tallinnr}rjX ΤαλίνrsU Indian/Maher}rjXΜάχεrsU Asia/Colombor}rjXΚολόμποrsUPacific/Wallisr}rjXΓουόλιςrsUAntarctica/Davisr}rjXΝτέιβιςrsUPacific/Pitcairnr}rjXΠιτκέιρνrsUAfrica/Libreviller}rjXΓκαμπόνrsUAfrica/Freetownr}rjXΣιέρα ΛεόνεrsU Africa/Bissaur}rjXΓουινέα ΜπισσάουrsU Asia/Dhakar}rjX ΝτάκαrsUAmerica/St_Luciar}rjXΑγ. ΛουκίαrsUEurope/Amsterdamr}rjXΆμστερνταμrsUAmerica/Montserratr}rjXΜονσεράτrsUAfrica/Nairobir}rjX ΚένυαrsU Europe/Tiraner}rjX ΤίραναrsUPacific/Saipanr}rjX ΣάιπανrsUAmerica/Maceior}rjX ΜασέιοrsUAfrica/Abidjanr}rjX!Ακτή ΕλεφαντοστούrsUAfrica/Djiboutir}rjXΤζιμπουτίrsUAmerica/Detroitr}rjXΝτητρόιτrsUAsia/Vladivostokr}r jXΒλαδιβοστόκr sU Africa/Cairor }r jXΑίγυπτοςr sUAmerica/Grenadar}rjXΓρενάδαrsUAmerica/El_Salvadorr}rjXΣαλβαδόρrsU Europe/Madridr}rjXΜαδρίτηrsU Asia/Omskr}rjXΟμσκrsUPacific/Kiritimatir}rjXΚιριτιμάτιrsUAmerica/Santiagor}rjXΣαντιάγκοrsU Asia/Dubair }r!jXΝτουμπάιr"sUEurope/Kaliningradr#}r$jXΚαλλίποληr%sUPacific/Noumear&}r'jX Νουμέαr(sUAsia/Ulaanbaatarr)}r*jXΟυλάν Μπατόρr+sUAfrica/Dar_es_Salaamr,}r-jXΝταρ Ες Σαλάμr.sUIndian/Maldivesr/}r0jXΜαλδίβεςr1sUAntarctica/Rotherar2}r3jX Ροθέραr4sUEurope/Stockholmr5}r6jXΣτοκχόλμηr7sU Pacific/Fijir8}r9jX Φίτζιr:sU Pacific/Apiar;}r<jXΆπιαr=sUAmerica/Port-au-Princer>}r?jXΠορτ-Ο-Πρενςr@sUPacific/Pago_PagorA}rBjXΠάγκο ΠάγκοrCsU America/ArubarD}rEjXΑρούμπαrFsUAmerica/CaymanrG}rHjX ΚέυμανrIsUAustralia/AdelaiderJ}rKjXΑδελαΐδαrLsU Europe/AthensrM}rNjX ΑθήναrOsUAmerica/IndianapolisrP}rQjXΙνδιανάποληrRsU Pacific/GuamrS}rTjX ΓκουάμrUsU Pacific/TrukrV}rWjX ΤρουκrXsUAmerica/CuracaorY}rZjXΚουρακάοr[sU Asia/Rangoonr\}r]jXΡανγκούνr^sUAmerica/Port_of_Spainr_}r`jXΠορτ-Οφ-ΣπέινrasU Africa/Luandarb}rcjX ΑγκόλαrdsUPacific/Funafutire}rfjXΦουναφούτιrgsUIndian/Kerguelenrh}rijXΚέργκουελενrjsUAfrica/Khartoumrk}rljX ΣουδάνrmsUAmerica/Mexico_Cityrn}rojXΠόλη του ΜεξικούrpsUAmerica/Puerto_Ricorq}rrjXΠουέρτο ΡίκοrssUIndian/Mauritiusrt}rujXΜαυρίκιοςrvsU Asia/Manilarw}rxjX ΜανίλαrysU Africa/Lomerz}r{jXΛόμεr|sU Europe/Rigar}}r~jXΡίγαrsU Europe/Berlinr}rjXΒερολίνοrsU Europe/Zurichr}rjX ΖυρίχηrsUAmerica/Guatemalar}rjXΓουατεμάλαrsU Asia/Tbilisir}rjXΤμπιλίσιrsU America/Belemr}rjX ΜπέλεμrsU Africa/Doualar}rjXΚαμερούνrsU Europe/Romer}rjXΡώμηrsU America/Limar}rjXΛίμαrsUAfrica/Sao_Tomer}rjXΣάο ΤόμεrsUAmerica/Managuar}rjXΜανάγκουαrsUPacific/Kosraer}rjX ΚοσράηrsUAfrica/Bujumburar}rjXΜπουρούντιrsUEurope/Chisinaur}rjXΤσισινάουrsUPacific/Port_Moresbyr}rjXΠορτ ΜόρεσμπυrsU Africa/Kigalir}rjXΚιγκάλιrsUAmerica/Boa_Vistar}rjXΜπόα ΒίσταrsUAsia/Yekaterinburgr}rjXΑικατερινούποληrsUEurope/Andorrar}rjX ΑνδόραrsUAfrica/Mbabaner}rjXΖουαζιλάνδηrsUAtlantic/Bermudar}rjXΒερμούδαrsUAmerica/Araguainar}rjXΑραγκουάιναrsUAntarctica/Caseyr}rjX ΚάσεϊrsU Asia/Saigonr}rjXΣαϊγκόνrsUPacific/Honolulur}rjXΧονολουλούrsU Asia/Bakur}rjX ΜπακούrsU America/Thuler}rjX ΤούλεrsU Pacific/Niuer}rjX ΝιούεrsUIndian/Reunionr}rjXΡεϋνιόνrsUAtlantic/Stanleyr}rjXΣτάνλεϋrsUAmerica/St_Thomasr}rjXΣαιντ ΤόμαςrsUEurope/Helsinkir}rjXΕλσίνκιrsUPacific/Majuror}rjXΜαχούροrsUPacific/Aucklandr}rjX ΌκλαντrsUAsia/Hong_Kongr}rjXΧονγκ ΚονγκrsU Asia/Macaur}rjX ΜακάοrsU Indian/Cocosr}rjX ΚόκοςrsUAsia/Choibalsanr}rjXΧόιμπαλσανrsUAmerica/Guadelouper}rjXΓουαδελούπηrsUEurope/Copenhagenr}rjXΚοπεγχάγηrsUAmerica/Nassaur}rjX ΝασάουrsU Europe/Kievr}rjX ΚίεβοrsUAntarctica/Syowar}rjX ΣύοβαrsUPacific/Enderburyr}rjXΕντερμπέρυrsUAntarctica/McMurdor}rjXΜακΜέρντοrsU Asia/Hovdr}rjX ΧοβντrsUAmerica/Danmarkshavnr}rjXΝτανμαρκσάβνr sUAmerica/Jamaicar }r jXΤζαμάικαr sU Asia/Irkutskr }rjXΙρκούτσκrsUAmerica/Scoresbysundr}rjXΣκορεσμπίσουντrsUAmerica/Caracasr}rjXΚαράκαςrsU Asia/Baghdadr}rjXΒαγδάτηrsUAfrica/Monroviar}rjXΛιβερίαrsUAmerica/Manausr}rjX ΜανάοςrsUAmerica/Los_Angelesr}r jXΛος Άντζελεςr!sUAmerica/Godthabr"}r#jXΓκόνθαμπr$sU Asia/Ammanr%}r&jXΑμάνr'sU Asia/Kabulr(}r)jXΚαμπούλr*sUPacific/Fakaofor+}r,jXΦακαόφοr-sUIndian/Antananarivor.}r/jXΑνταναναρίβοr0sUAfrica/Windhoekr1}r2jXΓουιντχόεκr3sUAmerica/St_Vincentr4}r5jXΑγ. Βικέντιοςr6sU Pacific/Waker7}r8jX Γουέικr9sUPacific/Gambierr:}r;jXΓκάμπιερr<sUAmerica/Vancouverr=}r>jXΒανκούβερr?sUAtlantic/Reykjavikr@}rAjXΡέυκιαβικrBsU Africa/HararerC}rDjXΖιμπάμπουεrEsU Asia/NicosiarF}rGjXΛευκωσίαrHsU Africa/BamakorI}rJjXΜπαμάκοrKsUPacific/PonaperL}rMjX ΠονάπεrNsU Africa/BanjulrO}rPjXΓκάμπιαrQsUEurope/BudapestrR}rSjXΒουδαπέστηrTsU Asia/TehranrU}rVjXΤεχεράνηrWsU Asia/ThimphurX}rYjXΤρίμφουrZsUAmerica/Sao_Paulor[}r\jXΣάο Πάολοr]sUAmerica/Belizer^}r_jX Μπελίζr`sU Pacific/Palaura}rbjX ΠαλάουrcsU Africa/Malabord}rejX!Ισημερινή ΓουινέαrfsU Europe/Minskrg}rhjX ΜινσκrisU Asia/Tashkentrj}rkjXΤασκένδηrlsU Asia/Tokyorm}rnjX ΤόκυοrosUPacific/Easterrp}rqjXΑνατολική ΝήσοςrrsU Asia/Jakartars}rtjXΤζακάρταrusU Asia/Karachirv}rwjXΚαράτσιrxsUAntarctica/Palmerry}rzjX Πάλμερr{sUAustralia/Sydneyr|}r}jX Σύδνεϊr~sUAfrica/Johannesburgr}rjXΓιοχάνεσμπουργκrsU Asia/Muscatr}rjXΜουσκάτrsUAtlantic/South_Georgiar}rjXΝότια ΓεωργίαrsUAfrica/El_Aaiunr}rjXΔυτική ΣαχάραrsU Asia/Dilir}rjX ΝτίλιrsUAsia/Kuala_Lumpurr}rjXΚουάλα ΛουμπούρrsUAfrica/Blantyrer}rjXΜαλάουιrsUAmerica/Campo_Grander}rjXΚάμπο ΓκράντεrsU Asia/Adenr}rjX ΈιντενrsU Asia/Ashgabatr}rjXΑσγκάμπατrsUEurope/Istanbulr}rjX ΚωνσταντινούποληrsU Asia/Bangkokr}rjXΜπανγκόκrsUAfrica/Kinshasar}rjXΚινσάσαrsUAntarctica/Vostokr}rjX ΒόστοκrsUEurope/Bucharestr}rjXΒουκουρέστιrsU Africa/Niameyr}rjX ΝιαμέυrsUAsia/Pyongyangr}rjXΠυόνγκ ΓιάνγκrsUEurope/Gibraltarr}rjXΓιβραλτάρrsUAmerica/Porto_Velhor}rjXΠόρτο ΒέλοrsUAfrica/Nouakchottr}rjXΜαυριτανίαrsUPacific/Galapagosr}rjXΓκαλαπάγκοςrsU Europe/Monacor}rjX ΜονακόrsU Asia/Bishkekr}rjXΜπισχέκrsUAmerica/Bogotar}rjXΜπογκοτάrsUAmerica/Denverr}rjXΝτένβερrsU Asia/Aqtober}rjXΑκτόμπεrsUAmerica/Recifer}rjX ΡεσίφεrsU Africa/Accrar}rjX ΆκκραrsUEurope/Vilniusr}rjXΒίλνιουςrsUAmerica/Cayenner}rjXΚαγιένεrsU Africa/Dakarr}rjX ΝτακάρrsU Asia/Taipeir}rjX ΤαϊπέιrsUAmerica/Fortalezar}rjXΦορταλέζαrsU Asia/Yerevanr}rjXΓερεβάνrsUAmerica/La_Pazr}rjX Λα ΠαζrsU Pacific/Naurur}rjXΝαούρουrsUAfrica/Mogadishur}rjXΜογκαντίσουrsUAmerica/Phoenixr}rjX ΦοίνιξrsUAmerica/Cuiabar}rjXΚουϊάμπαrsU Africa/Lusakar}rjX ΖάμπιαrsU Europe/Moscowr}rjX ΜόσχαrsUPacific/Guadalcanalr}rjXΓκουανταλκανάλrsUIndian/Christmasr}rjX%Νήσοι ΧριστουγέννωνrsUAmerica/Rio_Brancor}rjXΡίο ΜπράνκοrsUAfrica/Addis_Ababar}rjXΑιθιοπίαrsUAmerica/Cancunr}rjXΚανκούνrsU Pacific/Efater }r jX Εφάτεr sU Asia/Aqtaur }r jX ΑκτάουrsUPacific/Johnstonr}rjXΤζόνστονrsUAsia/Vientianer}rjXΒιεντιάνεrsUAmerica/Havanar}rjX ΑβάναrsUEurope/Brusselsr}rjXΒρυξέλλεςrsU Europe/Lisbonr}rjXΛισσαβώναrsUAfrica/Conakryr}rjXΓουινέαr sU Asia/Makassarr!}r"jXΜακασάρr#sUPacific/Tarawar$}r%jXΤαράουαr&sUAtlantic/Azoresr'}r(jX Αζόρεςr)sUAsia/Jerusalemr*}r+jXΙερουσαλήμr,sUAfrica/Kampalar-}r.jXΚαμπάλαr/sUAsia/Singaporer0}r1jXΣιγκαπούρηr2sU Europe/Oslor3}r4jXΌσλοr5sUAmerica/Chicagor6}r7jX Σικάγοr8sU Asia/Shanghair9}r:jXΣανγκάηr;sUAmerica/St_Kittsr<}r=jXΣαιν Κιττςr>sUAmerica/Noronhar?}r@jXΝορόνχαrAsU Asia/BeirutrB}rCjXΒηρυτόςrDsUAfrica/AlgiersrE}rFjX ΑλγέριrGsUAmerica/PanamarH}rIjXΠαναμάςrJsUAfrica/NdjamenarK}rLjXΝτζαμέναrMsU Africa/MaputorN}rOjXΜαπούτοrPsUAmerica/GuayaquilrQ}rRjXΓκουαγιακύλrSsUAmerica/TortolarT}rUjXΤορτόλαrVsU Asia/BahrainrW}rXjXΜπαχρέινrYsU Europe/LondonrZ}r[jXΛονδίνοr\sUAmerica/Costa_Ricar]}r^jXΚόστα Ρίκαr_sU Indian/Chagosr`}rajXΤσάγκοςrbsU Asia/Riyadhrc}rdjX ΡιάντresU Asia/Jayapurarf}rgjXΧαγιαπούραrhsUIndian/Mayotteri}rjjXΜαγιότεrksUAsia/Phnom_Penhrl}rmjXΠιόμ ΠενχrnsUAfrica/Gaboronero}rpjXΓκαμπορόνεrqsUAtlantic/Faeroerr}rsjX ΦερόεςrtsU Europe/Warsawru}rvjXΒαρσοβίαrwsUAmerica/Montevideorx}ryjXΜοντεβίδεοrzsU Africa/Tunisr{}r|jXΤυνησίαr}sUAmerica/Anguillar~}rjXΑνγκουίλλαrsU Asia/Damascusr}rjXΔαμασκόςrsU Asia/Qatarr}rjX ΚατάρrsU Asia/Bruneir}rjXΜπρούνεϊrsUAmerica/Guyanar}rjXΓουιάναrsUAmerica/New_Yorkr}rjXΝέα ΥόρκηrsU Asia/Katmandur}rjXΚατμαντούrsUAtlantic/St_Helenar}rjXΑγ. ΕλένηrsUAmerica/Barbadosr}rjXΜπαρμπέιντοςrsUAmerica/Tijuanar}rjXΤιχουάναrsUEurope/Luxembourgr}rjXΛουξεμβούργοrsU Africa/Banguir}rjX5Κεντροαφρικανική ΔημοκρατίαrsU Asia/Gazar}rjXΓάζαrsUAmerica/Martiniquer}rjXΜαρτινίκαrsUAntarctica/DumontDUrviller}rjXΝτυμόντ ΝτερβίλrsUAmerica/Antiguar}rjXΑντίγκουαrsU Asia/Almatyr}rjX ΑλμάτυrsUPacific/Midwayr}rjXΜίντγουεϊrsUPacific/Tahitir}rjXΑϊτήrsUAmerica/Santo_Domingor}rjXΣάντο ΝτομίνγκοrsUAfrica/Casablancar}rjXΚαζαμπλάνκαrsUAsia/Novosibirskr}rjXΝοβοσιμπίρσκrsU Europe/Samarar}rjX ΣαμάραrsUAmerica/Paramaribor}rjXΠαραμαρίνμποrsUAfrica/Lubumbashir}rjXΛουμπουμπάσιrsUAfrica/Brazzaviller}rjXΜπράζαβιλrsUAmerica/Grand_Turkr}rjXΓραντ ΤουρκrsUPacific/Marquesasr}rjXΜαρκέσαςrsUAmerica/Asuncionr}rjXΑσουνσιόνrsU Europe/Viennar}rjX ΒιέννηrsU Asia/Seoulr}rjX ΣεούλrsUPacific/Norfolkr}rjXΝόρφολκrsU Europe/Dublinr}rjXΔουβλίνοrsU Africa/Lagosr}rjX ΛάγοςrsU Europe/Sofiar}rjX ΣόφιαrsUPacific/Rarotongar}rjXΡαροτόνγκαrsUAmerica/Dominicar}rjXΔομινίκαrsU Europe/Maltar}rjX ΜάλταrsUAfrica/Porto-Novor}rjX ΜπενίνrsUAsia/Samarkandr}rjXΣαμαρκάνδηrsU Asia/Dushanber}rjXΝτουσχάνμπηrsUAmerica/Montrealr}rjXΜόντρεαλrsU Europe/Vaduzr}rjXΒαντούζrsUAmerica/Torontor}rjXΤορόντοrsU Etc/Unknownr}rjXΆγνωστηrsU Indian/Comoror}rjX ΚομόροrsU America/Bahiar}r jX Μπάχιαr sUAmerica/Anchorager }r jXΆνκορατζr sU Africa/Ceutar}rjX ΚέουταrsUAfrica/Ouagadougour}rjXΜπουρκίνα ΦάσοrsU Africa/Asmerar}rjX ΑσμέραrsUAntarctica/South_Poler}rjXΝότιος ΠόλοςrsuUscriptsr}r(UJavarXΙαβανέζικοrUHebrrXΕβραϊκόrUGeorr XΓεωργιανόr!UXpeor"XΠαλαιό Περσικόr#UCyrlr$XΚυριλλικόr%UArmnr&XΑρμενικόr'UCyrsr(XIΠαλαιό Εκκλησιαστικό Σλαβικό Κυριλλικόr)ULatnr*XΛατινικόr+UGothr,XΓοτθικόr-UEthir.XΑιθιοπικόr/UGujrr0XΓκουγιαράτιr1UItalr2XΠαλαιό Ιταλικόr3UArabr4XΑραβικόr5UZxxxr6XZxxxr7UCoptr8XΚοπτικόr9UHansr:X)Κινεζικό Απλοποιημένοr;UThair<XΤαϊλανδικόr=UCprtr>XΚυπριακόr?ULinbr@XΓραμμική ΒrAULinarBXΓραμμική ΑrCUHantrDX'Κινεζικό ΠαραδοσιακόrEUMongrFXΜογγολικόrGUZzzzrHX1Άγνωστη ή Ακατάλληλη ΓραφήrIUPermrJXΠαλαιό ΠερμικόrKUHungrLXΠαλαιό ΟυγγρικόrMUBrairNX ΜπράιγrOUGrekrPXΕλληνικόrQUMlymrRXΜαλαϊκόrSUEgydrTXΑιγυπτιακό ΛαϊκόrUUTibtrVXΘιβετιανόrWUZyyyrXX ΚοινόrYUPhnxrZXΦοινικικόr[UJpanr\XΙαπωνικόr]UEgyhr^X%Αιγυπτιακό Ιερατικόr_USyrcr`XΣυριακόraUBengrbXΜπενγκάλιrcUEgyprdX+Αιγυπτιακά ΙερογλυφικάreUSyrnrfX!Συριακό ΑνατολικόrgUKndarhXΚαναντικόriuUvariantsrj}rk(UREVISEDrlX-Αναθεωρημένη ΟρθογραφίαrmUPOLYTONrnXΠολυτονικόroU1996rpX3Γερμανική Ορθογραφία του 1996rqUMONOTONrrXΜονοτονικόrsU1901rtX>Παραδοσιακή Γερμανική ΟρθογραφίαruuUnumber_symbolsrv}rw(UdecimalrxX,ryUgrouprzX.r{uUcurrency_namesr|}r}(UXXXr~X5Άγνωστο ή Ακατάλληλο ΝόμισμαrjXΔηνάριο ΑλγερίαςrjXΔολάριο ΝαμίμπιαrjXΦράγκο ComororUBOPrXΠέσο ΒολιβίαςrUEGPrXΛίρα ΑιγύπτουrjX.Μεταλλικό Λεβ ΒουλγαρίαςrUBGNrX"Νέο Λεβ ΒουλγαρίαςrUPABrXΜπαλμπόα ΠαναμάrUYUMrX2Νέο Δηνάριο ΓιουγκοσλαβίαςrUGHCrXΣέντι ΓκάναςrUXBDrX<Ευρωπαϊκή Μονάδα Λογαριασμού (XBD)rUBOBrX%Μπολιβιάνο ΒολιβίαςrUXBArX.Ευρωπαϊκή Σύνθετη ΜονάδαrjXΚορόνα ΔανίαςrUXBCrX<Ευρωπαϊκή Μονάδα Λογαριασμού (XBC)rUXBBrX6Ευρωπαϊκή Νομισματική ΜονάδαrUBWPrX!Πούλα ΜποτσουάναςrjXΛίρα ΛιβάνουrjXΣελίνι ΤανζανίαςrUVNDrXDong ΒιετνάμrUAOArXKwanza ΑνγκόλαςrUWSTrXTala Δυτικής ΣαμόαrUAONrX*Νέα Kwanza Ανγκόλας (1990-2000)rjXΡίελ ΚαμπότζηςrjX!Ρινγκίτ ΜαλαισίαςrUAOKrX#Kwanza Ανγκόλας (1977-1990)rjXΣελίνι ΣομαλίαςrUKYDrX&Δολάριο Νήσων ΚάιμανrjXΔηνάριο ΛιβύηςrUUAHrXΧρίφνα ΟυκρανίαςrUUAKrXKarbovanetz Ουκρανίαςrj X!Δηνάριο ΙορδανίαςrUAORrX.Kwanza Reajustado Ανγκόλας (1995-1999)rUSURrXΣοβιετικό ΡούβλιrUAWGrXΓκίλντα ΑρούμπαrUSARrX*Ριάλ Σαουδικής ΑραβίαςrUFIMrXΜάρκο Φινλανδίαςrj X$Δολάριο Χονγκ ΚονγκrjiXΓκίλντα ΣουρινάμrUTPErXΕσκούδο ΤιμόρrUMGFrX%Φράγκο Μαδαγασκάρηςrj XΦράγκο ΕλβετίαςrUGIPrXΛίρα ΓιβραλτάρrjX#Ρούβλι ΛευκορωσίαςrjuXΛεκ ΑλβανίαςrUUGSrX+Σελίνι Ουγκάντας (1966-1987)rjX+Ουγκουίγκα ΜαυριτανίαςrUBOVrXMvdol ΒολιβίαςrUHRKrXΚούνα ΚροατίαςrjXΦράγκο ΤζιμπουτίrUHRDrXΔηνάριο ΚροατίαςrUPESrXΣολ ΠερούrUBYBrX6Νέο Ρούβλι Λευκορωσίας (1994-1999)rUITLrXΛιρέτα ΙταλίαςrUXAFrXΦράγκο BEAC CFArUBNDrXΔολάριο ΜπρουνέιrUISKrXΚορόνα ΙσλανδίαςrUZALrX;Ραντ Νότιας Αφρικής (οικονομικό)rjX(Πέσο Uruguayo ΟυρουγουάηςrUNIOrX0Χρυσή Κόρδοβα ΝικαράγουαςrULAKrXΚιπ ΛάοςrUNICrX%Κόρδοβα Νικαράγουαςrj#XΡούπια ΝεπάλrUMZErX#Εσκούδο ΜοζαμβίκηςrjXΛίρα Συρίαςrj?X!Δολάριο ΤζαμάικαςrUFRFrXΦράγκο ΓαλλίαςrUMAFrXΦράγκο ΜαρόκουrjX#Μετικάλ ΜοζαμβίκηςrUPHPrXΠέσο Φιλιππίνωνrj!X$Ραντ Νότιας ΑφρικήςrUGWPrXΠέσο Guinea-BissaurULUFrX'Φράγκο ΛουξεμβούργουrUBELrX2Φράγκο Βελγίου (οικονομικό)rUBECrX4Φράγκο Βελγίου (μετατρέψιμο)rUNGNrXΝάιρα ΝιγηρίαςrUYUNrXBΜετατρέψιμο Δηνάριο Γιουγκοσλαβίαςr j%XΦράγκο Βελγίουr UPLZr X'Ζλότυ Πολωνίας (1950-1995)r j'XΚολόν Κόστα Ρίκαr jEXΛίρα Τουρκίαςr UDEMr XΜάρκο Γερμανίαςr UEEKr XΚορόνα Εσθονίαςr j+XΚουάτσα Μαλάουιr jyX7Δολάριο Τρινιδάδ και Τομπάγκοr j-XΡούπια Σρι Λάνκαr j/XΚορόνα Σλοβενίαςr jX4Εσκούδο Πράσινου Ακρωτηρίουr j1XΡούπια Πακιστάνr j3X!Φιορίνι Ουγγαρίαςr j5XΛέι Ρουμανίαςr UXEUr X<Ευρωπαϊκή Συναλλαγματική Μονάδαr j7X!Δολάριο Βερμούδωνr j{XΡιάλ Ομάνr UPTEr X%Εσκούδο Πορτογαλίαςr ULVRr XΡούβλι Λετονίαςr j9X#Τουγκρίκ Μογγολίαςr j;XΝτραμ Αρμενίαςr UYUDr X>Μεταλλικό Δηνάριο Γιουγκοσλαβίαςr UBUKr XKyat Βιρμανίαςr j=XΣελίνι Ουγκάνταςr jeXRial Κατάρr! UXDRr" X2Ειδικά Δικαιώματα Ανάληψηςr# UNLGr$ X!Γκίλντα Ολλανδίαςr% UGEKr& X&Κούπον Λάρι Γεωργίαςr' UMTPr( XΛίρα Μάλταςr) j)X,Λίρα Στερλίνα Βρετανίαςr* jAXΛάρι Γεωργίαςr+ USHPr, X Λίρα Αγίας Ελένηςr- jCX#Δολάριο Ζιμπάμπουεr. j}X.Δολάριο Νήσων Σολομώντοςr/ UCSKr0 X6Σκληρή Κορόνα Τσεχοσλοβακίαςr1 UKPWr2 XWon Βόρειας Κορέαςr3 UTHBr4 XΜπατ Ταϊλάνδηςr5 UTRYr6 X Νέα Τουρκική Λίραr7 jGXΤάκα Μπαγκλαντέςr8 jIXΔραχμή Ελλάδαςr9 jKXRial Υεμένηςr: UDDMr; X/Ostmark Ανατολικής Γερμανίαςr< jX+Λιλανγκένι Σουαζιλάνδηr= UHTGr> XΓκουρντ Αϊτήςr? UXOFr@ XΦράγκο BCEAO CFArA UMGArB XAriary ΜαδαγασκάρηςrC jMX4Γκίλντα Ολλανδικών ΑντιλλώνrD ULRDrE XΔολάριο ΛιβερίαςrF URWFrG XΦράγκο ΡουάνταςrH jQXΚορόνα ΝορβηγίαςrI UMXVrJ X(Unidad de Inversion (UDI) ΜεξικούrK jXΣελίνι ΚένυαςrL UMOPrM XΠατάκα ΜακάοrN jSXΡούπια ΙνδίαςrO jUXΠέσο ΜεξικούrP UCZKrQ X4Κορόνα Τσέχικης ΔημοκρατίαςrR UTJSrS X!Σομόν ΤατζικιστάνrT UTJRrU X#Ρούβλι ΤατζικιστάνrV jWX%Νγκούλτρουμ ΜπουτάνrW UYDDrX XΔηνάριο ΥεμένηςrY UGWErZ X2Γκινέα Εσκούδο Πορτογαλίαςr[ jYXΠέσο Κολομβίαςr\ UMURr] XΡούπια Μαυρικίουr^ j[X!Ρούπια Ινδονησίαςr_ jXΦράγκο CFPr` j]XΔολάριο Φίτζιra j_XΜπιρ Αιθιοπίαςrb UPENrc XΝέο Σολ Περούrd jaXΔολάριο Μπελίζre UATSrf XΣελίνι Αυστρίαςrg UILPrh XΛίρα Ισραήλri UZRNrj XΝέο Zaire Ζαΐρrk jcXΠέσο Δομίνικουrl UTMMrm X%Μανάτ Τουρκμενιστάνrn UMDLro XΛέι Μολδαβίαςrp UECVrq X4Unidad de Valor Constante (UVC) Ισημερινούrr UECSrs XΣούκρε Εκουαδόρrt UBSDru XΔολάριο Μπαχάμεςrv jgXΚορόνα Σουηδίαςrw UPEIrx XInti Περούry UZMKrz XKwacha Ζάμπιαςr{ UMVRr| X,Ρουφίγια Νήσων Μαλδίβωνr} jX#Δολάριο Αυστραλίαςr~ UADPr XΠεσέτα Ανδόραςr UCUPr XΠέσο Κούβαςr jkXΛίρα Ιρλανδίαςr UCLFr XUnidades de Fomento Χιλήςr jmX%Δολάριο Μπαρμπάντοςr UKRWr XWon Νότιας Κορέαςr UGMDr XΝταλάσι Γκάμπιαςr joX'Κουετσάλ Γουατεμάλαςr jqX'Μπολιβάρ Βενεζουέλαςr USITr XΤόλαρ Σλοβενίαςr USDPr XΛίρα Σουδάνr jsXΠέσο Χιλήςr UEURr XΕυρώr UCDFr XΦράγκο Κονγκόr jOX8Δολάριο Ανατολικής Καραϊβικήςr jwXΤένγκε Καζακστάνr URUBr XΡούβλι Ρωσίαςr UXFUr XUIC-Φράγκο Γαλλίαςr UBRRr XCruzeiro Βραζιλίαςr UBRNr X!Νέο Cruzado Βραζιλίαςr UBRLr XΡεάλ Βραζιλίαςr UMMKr XΚυάτ Μιανμάρr UUYPr X+Πέσο Ουρουγουάης (1975-1993)r URURr X%Ρούβλι Ρωσίας (1991-1998)r jXΖλότυ Πολωνίαςr UBREr X'Cruzeiro Βραζιλίας (1990-1993)r UPYGr X'Γκουαρανί Παραγουάηςr UBRCr XCruzado Βραζιλίαςr UBRBr X.Νέο Cruzeiro Βραζιλίας (1967-1986)r USVCr X Κολόν Ελ Σαλβαδόρr UAEDr X?Ντιράμ Ηνωμένων Αραβικών Εμιράτωνr UGNSr XSyli Γουινέαςr jXΔηνάριο Π.Γ.Δ.Μ.r UAZMr X#Μανάτ Αζερμπαϊτζάνr jX"Νέο Δολάριο Ταϊβάνr UUSNr X1Δολάριο ΗΠΑ (Επόμενη Ημέρα)r UGQEr X5Ekwele Guineana Ισημερινής Γουινέαςr UBADr X4Δηνάριο Βοσνίας-Ερζεγοβίνηςr jXΦράγκο Γουινέαςr UMXPr X4Ασημένιο Πέσο Μεξικού (1861-1992)r jXΔηνάριο Ιράκr UERNr XΝάκφα Ερυθραίαςr jX0Μάρκο Βοσνίας-Ερζεγοβίνηςr jXΡούπια Σεϋχέλεςr jXΔολάριο Καναδάr USDDr XΔηνάριο Σουδάνr jXΛίρα Κύπρουr UMADr XΝτιράμ Μαρόκουr jXΔηνάριο Κουβέιτr jX!Φράγκο Μπουρούντιr ULTTr XTalonas Λιθουανίαςr UPGKr X'Kina Παπούα Νέα Γουινέαr ULTLr XΛίτα Λιθουανίαςr jX%Δολάριο Σιγκαπούρηςr UUZSr XSum Ουζμπεκιστάνr UXFOr X&Χρυσό Φράγκο Γαλλίαςr UMLFr XΦράγκο Μαλίr UESPr XΠεσέτα Ισπανίαςr jXΡιάλ Ιράνr UZRZr XZaire Ζαΐρr jX(Γιουάν Ρενμίμπι Κίναςr USLLr X'Λεόνε της Σιέρα Λεόνεr UTNDr XΔηνάριο Τυνησίαςr jXΔολάριο Γουιάναςr jXΛιρέτα Μάλταςr jX*Δολάριο Νέας Ζηλανδίαςr UFKPr X&Λίρα Νησιών Φώλκλαντr ULVLr XLats Λετονίαςr UUSSr X+Δολάριο ΗΠΑ (Ίδια Ημέρα)r UUSDr XΔολάριο ΗΠΑr UARPr X)Πέσο Αργεντινής (1983-1985)r jXΠέσο Αργεντινήςr UILSr XΝέο Σέκελ Ισραήλr URONr XΛεβ Ρουμανίαςr URSDr XΔηνάριο Σερβίαςr jXΔηνάριο Μπαχρέινr UJPYr XΓιεν Ιαπωνίαςr UARAr XAustral Αργεντινήςr UXAUr X Χρυσόςr uUmonthsr }r (U stand-aloner }r (Uwider }r (KXΙανουάριοςr KXΦεβρουάριοςr KXΜάρτιοςr KXΑπρίλιοςr KX Μάιοςr KXΙούνιοςr KXΙούλιοςr KXΑύγουστοςr K XΣεπτέμβριοςr K XΟκτώβριοςr K XΝοέμβριοςr K XΔεκέμβριοςr uUnarrowr }r (KXΙr KXΦr KXΜr KXΑr KXΜr KXΙr KXΙr KXΑr K XΣr K XΟr K XΝr! K XΔr" uuUformatr# }r$ (Uwider% }r& (KXΙανουαρίουr' KXΦεβρουαρίουr( KXΜαρτίουr) KXΑπριλίουr* KX Μαΐουr+ KXΙουνίουr, KXΙουλίουr- KXΑυγούστουr. K XΣεπτεμβρίουr/ K XΟκτωβρίουr0 K XΝοεμβρίουr1 K XΔεκεμβρίουr2 uU abbreviatedr3 }r4 (KXΙανr5 KXΦεβr6 KXΜαρr7 KXΑπρr8 KXΜαϊr9 KXΙουνr: KXΙουλr; KXΑυγr< K XΣεπr= K XΟκτr> K XΝοεr? K XΔεκr@ uuuUcurrency_formatsrA }rB Ncbabel.numbers NumberPattern rC )rD }rE (Uexp_precrF NUscalerG KU frac_precrH KKrI UsuffixrJ X ¤rK X ¤rL rM Uint_precrN KKrO h8X #,##0.00 ¤rP UprefixrQ XrR X-rS rT Uexp_plusrU NUgroupingrV KKrW ubsUdaysrX }rY (U stand-alonerZ }r[ Unarrowr\ }r] (KXΔr^ KXΤr_ KXΤr` KXΠra KXΠrb KXΣrc KXΚrd usUformatre }rf (Uwiderg }rh (KXΔευτέραri KX Τρίτηrj KXΤετάρτηrk KX Πέμπτηrl KXΠαρασκευήrm KXΣάββατοrn KXΚυριακήro uU abbreviatedrp }rq (KXΔευrr KXΤριrs KXΤετrt KXΠεμru KXΠαρrv KXΣαβrw KXΚυρrx uuuU meta_zonesry }rz Uerasr{ }r| (Uwider} }r~ (KXπ.Χ.r KXμ.Χ.r uU abbreviatedr }r (KXπ.Χ.r KXμ.Χ.r uuu.PK[Mwee%site-packages/babel/localedata/be.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{0} {1}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX1-шы кварталqKX2-гі кварталqKX3-ці кварталqKX4-ты кварталquU abbreviatedq}q(KX 1-шы кв.qKX 2-гі кв.qKX 3-ці кв.qKX 4-ты кв.quuuUperiodsq}q(Uamq Xда палудняq!Upmq"Xпасля палудняq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XHH.mm.ssqRUformatqSX%(HH)s.%(mm)s.%(ss)sqTubUfullqUhO)qV}qW(h3X HH.mm.ss vqXhSX%(HH)s.%(mm)s.%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X HH.mm.ss zq]hSX%(HH)s.%(mm)s.%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XHH.mmqbhSX %(HH)s.%(mm)sqcubuU languagesqd}qe(Uzh_HantqfX)традыцыйная кітайскаяqgUguqhXгуяраціqiUnl_BEqjXфламандскаяqkUaleqlXалеуцкаяqmUneqnXнепальскаяqoUgdqpX'шатландская гэльскаяqqUgaqrXірландскаяqsUgnqtXгуараніquUglqvXгалісійскаяqwUnogqxXнагайскаяqyUcusqzXкушыцкая моваq{Ulaq|Xлацінскаяq}Ulnq~XлінгалаqUloqXлаоскаяqUttqXтатарскаяqUtrqXтурэцкаяqUadyqXадыгейскаяqUlvqXлатышскаяqUausqXаўстралійскаяqUtkqXтуркменскаяqUthqXтайскаяqUtiqXтыгрыньяqUtaiqXмова таіqUtgqXтаджыкскаяqUteqX тэлугуqUfilqXтагальскаяqUtaqXтамільскаяqUyiqXідышqUnonqXстаранарвежскаяqUpt_BRqX*партугальская (бразіл.)qUmosqXмосіqUcelqXкельцкая моваqUdaqX дацкаяqUquqX кечуаqUsuxqXшумерскаяqUelqXгрэцкаяqUeoqXэсперантаqUenqXанглійскаяqUartqXштучная моваqUbeqXбеларускаяqUzh_HansqX'спрошчаная кітайскаяqUmasqX масаіqUsgaqXстараірландскаяqUarcqXарамейскаяqUen_USqXанглійская (ЗША)qUeuqXбаскскаяqUetqXэстонскаяqUsemqXсеміцкая моваqUnubqXнубійская моваqUesqXіспанскаяqUruqX рускаяqUpeoqXстараперсідскаяqUde_ATqXнямецкая (аўстр.)qUrmqXрэта-раманскаяqUroqXрумынскаяqUjvqXяванскаяqUluoqXлуоqUen_CAqX"англійская (канад.)qUbgqXбалгарскаяqUbaqXбашкірскаяqUastqXастурыйскаяqUtupqXмова тупіqUtutqXалтайская моваqUbnqXбенгальскаяqUmenqX мендэqUbhqX біхарыqUbrqXбрэтонскаяqUbsqXбаснійскаяqUjaqXяпонскаяqUcopqXкопцкаяqUojqXаджыбвеqUocqXправансальскаяqUakkqXакадзкаяqUundqXневядомая моваqUtlhqXклінгонqUosqXасецінскаяqUorqXорыяqUxhrXхосаrUcarXкаталонскаяrUcerXчачэнскаяrUcyrXвалійскаяrUangrXстараанглійскаяr Usgnr Xзнакавая моваr Ucsr Xчэшскаяr UzhrXкітайскаяrUcvrXчувашскаяrUzaprXсапатэкаўrUde_CHrXнямецкая (швейц.)rUpsrX пуштуrUchbrX чыбчаrUptrXпартугальскаяrUfrorX старафранцузскаяrUltrXлітоўскаяrUlolr X монгаr!Uukr"Xукраінскаяr#Upar$Xпанджабіr%Uvir&Xв'етнамскаяr'Umanr(Xмандынгаr)Upror*X&стараправансальскаяr+Uen_GBr,X3англійская (Вялікабрытанія)r-Uhyr.Xармянскаяr/Uhrr0Xхарвацкаяr1Urajr2Xраджастханскаяr3Uegyr4Xстараэгіпецкаяr5Uhur6Xвенгерскаяr7Uhir8X хіндзіr9Ubuar:Xбурацкаяr;Uher<X іўрытr=Umgr>Xмальгашскаяr?Uuzr@XузбекскаяrAUmlrBXмалаяламскаяrCUmorDXмалдаўскаяrEUmnrFXмангольскаяrGUcaurHXкаўказская моваrIUurrJXурдуrKUmtrLXмальтыйскаяrMUcairNXAмова індзейцаў Цэнтральнай АмерыкіrOUplrPXпольскаяrQUmsrRXмалайскаяrSUmrrTXмаратхіrUUugrVXуйгурскаяrWUslarXXславянская моваrYUsairZX=мова індзейцаў Паўднёвай Амерыкіr[Uabr\Xабхазскаяr]Uafr^Xафрыкаансr_Uswr`XсуахіліraUisrbXісландскаяrcUamrdXамхарскаяreUitrfXітальянскаяrgUanrhXарагонскаяriUiarjXінтэрлінгваrkUasrlXасамскаяrmUarrnXарабскаяroUes_419rpX*іспанская (лацінаамер.)rqUavrrXаварскаяrsUayrtX аймараruUazrvXазербайджанскаяrwUierxXінтэрлінгвеryUidrzXінданезійскаяr{Unlr|Xгаландскаяr}Unnr~X%нарвежская (нюнорск)rUnorXнарвежскаяrUnbrXнарвэская букмалrUnairX=мова індзейцаў Паўночнай АмерыкіrUafarX"афра-азіяцкая моваrUen_AUrX&англійская (аўстрал.)rUvorXвалапюкrUgrcrXстарагрэцкаяrUzurXзулуrUsahrXякуцкаяrUmaprXаўстранезійскаяrUfrrXфранцузскаяrUderXнямецкаяrUphnrXфінікійскаяrUfyrXфрызскаяrUsvrXшведскаяrUfarX фарсіrUfr_CHrX$французская (швейц.)rUfirXфінскаяrUtyvrXтувінскаяrUfr_CArX$французская (канад.)rUforXфарэрскаяrUkarXгрузінскаяrUkkrXказахскаяrUsrrXсербскаяrUsqrXалбанскаяrUsitrX*кітайска-тыбецкая моваrUkorXкарэйскаяrUknrXканнадаrUsurXсуданскаяrUskrXславацкаяrUsirXсінгальскаяrUshrX!сербска-харвацкаяrUsorXсамалійскаяrUmkrXмакедонскаяrUkurXкурдскаяrUslrXславенскаяrUsarXсанскрытrUsdrX сіндхіruU territoriesr}r(UBDrXБангладэшrUBErXБельгіяrUBFrXБуркіна-ФасоrUBGrXБалгарыяrUVErXВенесуэлаrUBArX&Боснія і ГерцагавінаrUBBrXБарбадасrUWFrXУоліс і ФутунаrUBMrX#Бермудскія астравыrUBNrXБруней-ДарусаламrUBOrXБалівіяrUBHrXБахрэйнrUBIrXБурундзіrUBJrX БенінrUBTrX БутанrU011rXЗаходняя АфрыкаrUBVrXБувэ востраўrUBWrXБатсванаrU014rXУсходняя АфрыкаrU015rXПаўночная АфрыкаrUBRrXБразіліяrU017rX#Цэнтральная АфрыкаrU018rXПаўднёвая АфрыкаrU019rX7Паўночная і Паўднёвая АмерыкіrUBYrXБеларусьrUBZrX БелізrULVrX ЛатвіяrURWrX РуандаrURSrX СербіяrUTLrXУсходні Тыморr UREr XРэюньёнr UTMr XТуркменістанr UTJrXТаджыкістанrUROrXРумыніяrUTKrXТакелаўrUGWrXГвінея-БісаўrUGTrXГватэмалаrUGSrX]Паўднёвая Джорджыя і Паўднёвыя Сандвічавы астравыrUGRrX ГрэцыяrUGQrX)Экватарыяльная ГвінеяrUGPrXГвадэлупаrUJPr X Японіяr!UGYr"X Гаянаr#UGFr$X#Французская Гвіянаr%UGEr&X Грузіяr'UGDr(XГрэнадаr)U021r*XЗША і Канадаr+UGBr,XВелікабрытаніяr-UGAr.X Габонr/USVr0XСальвадорr1UGNr2X Гвінеяr3UGMr4X Гамбіяr5UGLr6XГрэнландыяr7U029r8X!Карыбскія астравыr9UGIr:XГібралтарr;UGHr<XГанаr=UOMr>XАманr?UTNr@X ТунісrAUJMrBX ЯмайкаrCU013rDX%Цэнтральная АмэрыкаrEUWSrFXСамоа (Заходняе)rGUKIrHXКірыбаціrIUHRrJXХарватыяrKUBSrLX!Багамскія АстравыrMUHTrNX ГаіціrOUHUrPXВенгрыяrQUHKrRX$Гон-Конг, Кітай (САР)rSU039rTXПаўднёвая ЕўропаrUUHNrVXГандурасrWUFIrXXФінляндыяrYU142rZXАзіяr[U030r\XУсходняя Азіяr]U034r^XПаўднёвая Азіяr_U035r`X*Паўднёва-Усходняя АзіяraUPSrbX+Палестынскія тэрыторыіrcUIOrdXIБрытанская тэрыторыя Індыйскага акіянуreUPWrfX ПалаўrgUPTrhXПартугаліяriUSJrjXRСвальбард (Паўночна-Усходняя Зямля) і Ян-МаенrkUMDrlXМалдоваrmUFMrnXМікранезіяroUIQrpXІракrqUPArrX ПанамаrsUPFrtX'Франузская ПалінэзіяruUPGrvX"Папуа-Новая ГвінеяrwUPErxXПеруryUPKrzXПакістанr{UPHr|XФіліпіныr}UPLr~XПольшчаrUZMrX ЗамбіяrUEHrXЗаходняя СахараrURUrX РасіяrUEErXЭстоніяrUEGrX ЕгіпетrUZArX<Паўднёва-Афрыканская РэспублікаrUECrXЭквадорrUITrX ІталіяrUVNrX В'етнамrUZZrXНевядомы рэгіёнrUSBrX#Саламонавы АстравыrUETrXЭфіопіяrUSOrX СамаліrUZWrXЗімбабвэrUSArX!Саудаўская АравіяrUESrXІспаніяrUERrXЭрытрэяrUMErXЧарнагорыяrUAQrXАнтарктыкаrUMGrXМадагаскарrUMArX МарокаrUMCrX МанакаrUUZrXУзбекістанrUMMrX М'янмаrUMLrXМаліrUMOrXМакао, Кітай (САР)rUMNrXМанголіяrUHMrX@Гэрда востраў і МакДоналда астравыrUASrX#Амерыканскае СамоаrUMKrXМакедонія, БЮРrUMUrXМаўрыкійrUMTrX МальтаrUMWrX МалавіrUMVrX%Мальдыўскія АстравыrUMQrXМарцінікаrUMPrX6Паўночныя Марыянскія астравыrUMSrXМонсэратrUMRrXМаўрытаніяrUUGrX УгандаrUTZrX:Танзанія, Аб'яднаная РэспублікаrUMYrXМалайзіяrUMXrXМексікаrUILrXІзраільrUFRrXФранцыяrUAWrX АрубаrUDOrX/Дамініканская РэспублікаrUSHrX'Святой Алены, ВостраўrUVCrX-Сэнт-Вінсэнт і ГрэнадыныrUDJrXДжыбуціrUFJrX ФіджыrUFKrX'Фолклэндскія астравыrU172rX:Садружнасць Незалежных ДзяржаўrU053rX1Аўстралія і Новая ЗэландыяrUNIrXНікарагуаrUNLrXНідэрландыrUNOrXНарвегіяrUNArXНамібіяrUVUrXВануатуrUNCrXНовая КаледоніяrUNErX НігерrUNFrX%Норфалкскія астравыrUNGrXНігерыяrUNZrXНовая ЗеландыяrUNPrX НепалrUNRrX НауруrUNUrXНіуэrU061rXПалінезіяrUCHrXШвейцарыяrUCOrXКалумбіяr UCNr X Кітайr UCMr XКамерунr UCLrXЧыліrUCCrX!Какосавыя астравыrUCArX КанадаrUCGrX КонгаrUCFrX@Цэнтральна-Афрыканская РэспублікаrUCDrX;Конга, Дэмакратычная РэспублікаrUCZrX ЧэхіяrUCYrXКіпрrUCXrXКалядаў востраўrUCRr XКоста-Рыкаr!UPYr"XПарагвайr#UCVr$XКаба-Вердэr%UCUr&XКубаr'USZr(XСвазілендr)USYr*X8Сірыйская Арабская Рэспублікаr+UKGr,XКыргызстанr-UKEr.X Кеніяr/USRr0XСурынамr1U143r2XЦэнтральная Азіяr3UKHr4XКамбоджаr5UKNr6XСэнт-Кітс і Нэвісr7UKMr8X!Каморскія Астравыr9USTr:X#Сан-Томэ і Прынсіпіr;USKr<XСлавакіяr=UKRr>XПаўднёвая Карэяr?USIr@XСлавеніяrAUKPrBXПаўночная КарэяrCUKWrDX КувейтrEUSNrFXСенегалrGUSLrHXСьера-ЛеонэrIUSCrJX%Сейшэльскія АстравыrKUKZrLXКазахстанrMUKYrNX!Кайманавы астравыrOUSGrPXСінгапурrQUSErRX ШвецыяrSUSDrTX СуданrUU151rVXУсходняя ЕўропаrWU150rXX ЕўропаrYUDMrZXДамінікаr[U155r\XЗаходняя Еўропаr]U154r^XПаўночная Еўропаr_UVGr`X#Віргінскія астравыraUDErbXГерманіяrcUYErdXЕменreUMHrfX!Маршалавы АстравыrgU062rhX0Паўднёва-Цэнтральная АзіяriUDZrjX АлжырrkUUSrlXЗлучаныя ШтатыrmUUYrnXУругвайroULBrpX ЛіванrqULCrrXСэнт-ЛюсіяrsULArtXMЛаоская Народна-Дэмакратычная РэспублікаruUTVrvX ТувалуrwUTWrxXТайваньryUTTrzX Трынідад і Табагаr{UTRr|X Турцыяr}ULKr~XШры-ЛанкаrULIrXЛіхтэнштэйнrUCKrXКука астравыrUTOrXТангійскаяrULTrX ЛітваrULUrXЛюксембургrULRrXЛіберыяrULSrX ЛесотаrUTHrXТайландrUTFrX<Французскія Паўднёвыя тэрыторыіrUTGrXТогаrUTDrXЧадrUTCrX)Тэркс і Кайкас астравыrULYrX8Лівійская Арабская ДжамахірыяrUVArXВатыканrU145rXЗаходняя АзіяrUAErX3Аб'яднаныя Арабскія ЭміратыrUADrX АндораrUAGrX Антыгуа і БарбудаrUAFrXАфганістанrUAIrXАнгуілляrUVIrX+Віргінскія астравы, ЗШАrUISrXІсландыяrUIRrX1Іран, Ісламская РэспублікаrUAMrXАрменіяrUALrXАлбаніяrUAOrX АнголаrUANrX'Нідэрландскія АнтылыrU003rX!Паўночная АмэрыкаrU002rX АфрыкаrU001rXСветrUARrXАргенцінаrUAUrXАўстраліяrUATrXАўстрыяrU005rX!Паўднёвая АмэрыкаrUINrX ІндыяrUAXrX!Аландскія астравыrU009rXАкіяніяrUAZrXАзербайджанrUIErXІрландыяrUIDrXІнданезіяrUJOrXІарданіяrUQUrXЕўрапейскі ЗвязrUUArXУкраінаrUQArX КатарrUDKrX ДаніяrUMZrXМазамбікrUQOrXВонкавая АкіяніяruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3Xd.M.yyyyrhSX%(d)s.%(M)s.%(yyyy)srubUfullrhO)r}r(h3XEEEE, d MMMM yyyyrhSX!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)srubUlongrhO)r}r(h3X d MMMM yyyyrhSX%(d)s %(MMMM)s %(yyyy)srubUshortrhO)r}r(h3Xd.M.yyrhSX%(d)s.%(M)s.%(yy)srubuUcurrency_symbolsr}rUBYBrXРубrsU time_zonesr}r(UAmerica/Indianapolisr}rUcityrXІндыянапалісrsUAmerica/New_Yorkr}r jX Нью-Ёркr sUAmerica/Denverr }r jX Дэнвэрr sUPacific/Honolulur}rjXГаналулуrsUAmerica/Phoenixr}rjX ФэніксrsU Etc/Unknownr}rjXНевядомыrsUAmerica/Los_Angelesr}rjXЛос-АнджэласrsUAmerica/Rio_Brancor}rjXРыё БранкаrsUAmerica/Anchorager}rjXАнкорыджrsUAmerica/Campo_Grander }r!jXКампа Грандэr"sUAmerica/Chicagor#}r$jX Чыкагаr%sUAmerica/Sao_Paulor&}r'jXСан-Паўлуr(suUscriptsr)}r*(UArmnr+Xармянскаеr,UJpanr-Xяпонскаеr.UHebrr/Xгабрэйскаеr0UGeorr1Xгрузінскаеr2UZzzzr3XCневядомы або недапушчальны перакладr4UCyrlr5Xкірылічныr6UArabr7Xарабскаеr8UZxxxr9X чыстыr:UHansr;X'спрошчанае кітайскаеr<ULatnr=Xлацінскіr>UHantr?X)традыцыйнае кітайскаеr@uUvariantsrA}rBUnumber_symbolsrC}rD(UdecimalrEX,rFUgrouprGX rHuUcurrency_namesrI}rJ(UUSDrKXдолар ЗШАrLUAUDrMX#аўстралійскі далярrNUNOKrOXнарвэская кронаrPURUBrQXрускі рубельrRUXXXrSXCневядомая або недапушчальная валютаrTUBYRrUXбеларускі рубельrVUINRrWXіндыйская рупіяrXUCNYrYX"кітайскі юань RenminbirZUJPYr[Xяпонская іенаr\UBRLr]Xбразільскі рэалr^UGBPr_Xанглійскі фунтr`UERNraX!эрытрэйская накфаrbUEURrcXеўраrduUmonthsre}rf(U stand-alonerg}rh(Uwideri}rjKXтравеньrksU abbreviatedrl}rmKXтраrnsUnarrowro}rp(KXсrqKXлrrKXсrsKXкrtKXмruKXчrvKXлrwKXжrxK XвryK XкrzK Xлr{K Xсr|uuUformatr}}r~(Uwider}r(KXстудзеньrKXлютыrKXсакавікrKXкрасавікrKXмайrKXчэрвеньrKX ліпеньrKXжнівеньrK XверасеньrK XкастрычнікrK XлістападrK XснежаньruU abbreviatedr}r(KXстуrKXлютrKXсакrKXкраrKXмайrKXчэрrKXліпrKXжніrK XверrK XкасrK XлісrK XснеruUnarrowr}rKXтrsuuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X ¤#,##0.00rh5X¤rX-¤rrh8Nh9KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXпrKXаrKXсrKXчrKXпrKXсrKXнrusUformatr}r(Uwider}r(KXпанядзелакrKXаўторакrKX серадаrKX чацверrKXпятніцаrKX суботаrKXнядзеляruU abbreviatedr}r(KXпнrKXаўrKXсрrKXчцrKXптrKXсбrKXндruuuU meta_zonesr}r(UTurkeyr}rUcommonrsUEurope_Easternr}r(jUlongr}r(UdaylightrX4Усходнеэўрапейскі летні часrUstandardrX)Усходнеэўрапейскі часruuU South_Georgiar}rjsU Kuybyshevr}rjsUEurope_Centralr}r(jj}r(jX:Цэнтральнаэўрапейскі летні часrjX/Цэнтральнаэўрапейскі часruuUAcrer}rjsU Argentinar}rjsUFalklandr}rjsU Alaska_Hawaiir}rjsUAmerica_Pacificr}r(jj}r(UgenericrXЦіхаакіянскі часrjX*Ціхаакіянскі летні часrjX4Ціхаакіянскі стандартны часruuU Cape_Verder}rjsUAzoresr}rjsUAmerica_Mountainr}r(jj}r(jX8Паўночнаамэрыканскі горны часrjXCПаўночнаамэрыканскі горны летні часrjXMПаўночнаамэрыканскі горны стандартны часruuUArgentina_Westernr}rjsUAmazonr}rjsUBeringr}rjsUAtlanticr}r(jj}r(jXАтлянтычны часrjX&Атлянтычны летні часrjX0Атлянтычны стандартны часruuUEurope_Westernr}r(jj}r(jX4Заходнеэўрапейскі летні часr jX)Заходнеэўрапейскі часr uuUAlaskar }r jsUAmerica_Easternr }r(jj}r(jX<Паўночнаамэрыканскі усходні часrjXGПаўночнаамэрыканскі усходні летні часrjXQПаўночнаамэрыканскі усходні стандартны часruuU Volgogradr}rjsUAmerica_Centralr}r(jj}r(jXBПаўночнаамэрыканскі цэнтральны часrjXMПаўночнаамэрыканскі цэнтральны летні часrjXWПаўночнаамэрыканскі цэнтральны стандартны часruuUGMTr}r(jj}rjXГрынвічскі часrsuUSamarar}r jsUBritishr!}r"jsUMoscowr#}r$jsuUerasr%}r&(Uwider'}r((KX да н.э.r)KXн.э.r*uU abbreviatedr+}r,(KX да н.е.r-KXн.е.r.uUnarrowr/}r0(KX да н.э.r1KXн.э.r2uuu.PK[r8^^(site-packages/babel/localedata/fa_IR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (U weekend_startq KU first_dayq KU weekend_endq KuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq }q!u.PK[_TCC%site-packages/babel/localedata/lt.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXpirmas ketvirtisq KXantras ketvirtisq KXtrečias ketvirtisqKXketvirtas ketvirtisquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqX priešpietqUpmqXpopietquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(Uzh_HantqAXkinų tradicinėqBUguqCX gudžaratųqDUscnqEX siciliečiųqFUaleqGXaleutųqHUscoqIXškotųqJUkbdqKX kabardinųqLUgdqMXškotų (gėlų)qNUgaqOXairiųqPUgnqQX gvaraniųqRUglqSXgalisųqTUlbqUXliuksemburgiečiųqVUfiuqWXfinougrų kalbaqXUlnqYXlingalaqZUloq[X laosiečiųq\Uttq]Xtotoriųq^Utrq_Xturkųq`UbntqaXbantųqbUlvqcXlatviųqdUausqeXaustralų kalbaqfUtkqgX turkmėnųqhUthqiXtajųqjUtiqkXtigrajųqlUteqmXtelugųqnUpt_PTqoXportugalų (Portugalijos)qpUfilqqXtagalųqrUtaqsXtamilųqtUyiquXjidišqvUpt_BRqwXportugalų (Brazilijos)qxUdeqyX vokiečiųqzUdaq{Xdanųq|Ugotq}Xgotųq~UgemqXgermanų kalbaqUbatqX baltų kalbaqUtlqX tagalogųqUcrhqX krymo turkųqUelqXgraikųqUeoqX esperantoqUenqXanglųqUartqXdirbtinė kalbaqUzh_HansqXkinų supaprastintaqUkaaqX karakalpakųqUsgaqX senoji airiųqUen_USqXanglų (amerikiečių)qUeuqXbaskųqUetqXestųqUesqXispanųqUruqXrusųqUpeoqX senoji persųqUiraqX IraniečiųqUroqXrumunųqUbnqXbengalųqUsuxqXšumerųqUbeqX baltarusiųqUbgqXbulgarųqUbaqX baškirųqUwaqXvalonųqUjvqX javiečiųqUboqX tibetiečiųqUbhqXbiharųqUbrqXbretonųqUbsqXbosniųqUmulqX kelios kalbosqUlezqXlezginųqUjaqXjaponųqUlaqXlotynųqUocqX provansalųqUundqXnenustatyta kalbaqUtwqXtviqUtlhqX"žvaigždžių kelionių"qUosqXosetinųqUorqXorijųqUudmqXudmurtųqUxhqXkosųqUcoqX korsikiečiųqUcaqX katalonųqUceqX čečėnųqUcyqXvalųqUabqXabchazųqUcsqXčekųqUzhqXkinųqUadyqX adygėjųqUcvqX čiuvašųqUcuqXbažnytinė slavųqUpsqX puštūnųqUptqX portugalųqUfroqXsenoji prancūzųqUltqX lietuviųqUukqX ukrainiečiųqUfrsqX rytų fryzųqUfrrqXšiaurinių fryzųqUpaqX pandžabųqUxalqXkalmukųqUviqXvietnamiečiųqUen_GBqXanglų (britų)qUhyqXarmėnųqUhrqXkroatųrUkarXgruzinųrUhurXvengrųrUhirXhindirUbuarXburiatųrUher Xhebrajųr Uuzr Xuzbekųr Umlr X malajaliųrUmorXmoldavųrUmnrXmongolųrUcaurXkaukaziečių kalbarUurrXurdurUmtrX maltiečiųrUcairX"Centrinės Amerikos indėnų kalbarUplrXlenkųrUmsrX malajiečiųrUmrrXmaratųr Uberr!Xberberųr"Uugr#Xuigūrųr$Uslar%X slavų kalbar&Uangr'X senoji anglųr(Uafr)X afrikanųr*Uswr+Xsvahilir,Uisr-Xislandųr.Uamr/Xamharųr0Uitr1Xitalųr2Usvr3Xšvedųr4Uasr5Xasamųr6Uarr7Xarabųr8Uinhr9Xingušųr:Usur;Xsundųr<Uzur=Xzulųr>Uiar?X interlingvar@UinerAXindoeuropiečių kalbarBUazrCXazerbaidžaniečiųrDUierEX interkalbarFUidrGXindoneziečiųrHUnlrIXolandųrJUnnrKXnorvegų nynorskrLUnorMXnorvegųrNUnairOX!Šiaurės Amerikos indėnų kalbarPUnerQXnepalųrRUen_AUrSXanglų kalba (australija)rTUpaarUXpapuasų kalbarVUnaprWX neapoliečiųrXUvorYXvolapiukrZUgrcr[Xsenovės graikųr\Umisr]Xįvairios kalbosr^Usahr_Xjakutųr`UfrraX prancūzųrbUcelrcX keltų kalbardUfyreXFryzųrfUfargXpersųrhUfiriXsuomiųrjUtyvrkXtuviųrlUsarmX SanskritasrnUforoX fareriečiųrpUegyrqXsenovės egiptiečiųrrUkkrsXkazachųrtUsrruXserbųrvUsqrwXalbanųrxUkoryX korėjiečiųrzUknr{Xkanadųr|Ukmr}Xkhmerųr~UstrXsesutorUskrXslovakųrUsirXsinhalųrUshrXserbų-kroatųrUsorXsomaliųrUmkrX makedonųrUkurXkurdųrUslrX slovėnųrUscrX sardiniečiųrUkyrXkirgizųrUserXšiaurinių samiųrUsdrXsindųruU territoriesr}r(UBDrX BangladešasrUBErXBelgijarUBFrX Burkina FasasrUBGrX BulgarijarUVErX VenesuelarUBArXBosnija ir HercegovinarUBBrX BarbadosasrUWFrXWallisas ir FutunarUBMrXBermudarUBNrX BrunėjusrUBOrXBolivijarUBHrX BahreinasrUBIrXBurundisrUBJrXBeninasrUBTrXButanasrU011rXVakarų AfrikarUBVrX Bouvet salarUBWrXBotsvanarU014rX Rytų AfrikarU015rXŠiaurės AfrikarUBRrX BrazilijarU017rXVidurio AfrikarU018rXPietų Afrika [018]rU019rXAmerikarUBYrX BaltarusijarUBZrXBelizasrULVrXLatvijarURWrXRuandarURSrXSerbijarUTLrX Rytų TimorasrURErX ReunionasrUTMrXTurkmėnistanasrUOMrXOmanasrUTJrXTadžikistanasrUROrXRumunijarUTKrXTokelaurUGWrXBisau GvinėjarUGUrXGuamasrUGTrX GvatemalarUGSrX)Rytų Džordžija ir Rytų Sandwich salosrUGRrXGraikijarUGQrXPusiaujo GvinėjarUGPrX GvadelupėrUJPrXJaponijarUKIrX KiribatisrUGYrXGajanarUGGrXGuernseyrUGFrXPrancūzijos GvianarUGErXGruzijarUGDrXGrenadarU021rXŠiaurinė AmerikarUGBrXDidžioji BritanijarUGArXGabonasrUSVrX SalvadorasrUGNrXGvinėjarUGMrXGambijarUGLr X Grenlandijar U029r XKaribair UGIr X GibraltarasrUGHrXGanarUJErXDžersisrUTNrXTunisasrUJMrXJamaikarU013rXCentrinė AmerikarUWSrXSamoarU419rXLotynų Amerika ir KaribairUVArX VatikanasrUHRrXKroatijar UBSr!XBahamosr"UHTr#XHaitisr$UHUr%XVengrijar&UHKr'XKinijos S.A.R.Honkongasr(U039r)X Pietų Europar*UHNr+X Hondūrasr,UFIr-XSuomijar.U142r/XAzijar0U030r1X Rytų Azijar2U034r3X Pietų Azijar4U035r5XPietryčių Azijar6UPRr7X Puerto Rikasr8UPSr9XPalestinos teritorijar:UFKr;XFalklando salosr<UIOr=XIndijos vandenyno britų sritisr>UPWr?XPalaur@UPTrAX PortugalijarBUSJrCXSvalbardo ir Jan Majen salosrDUMDrEXMoldovarFUFMrGX MikronezijarHUIQrIXIrakasrJUPArKXPanamarLUPFrMXPrancūzų PolinezijarNUPGrOXPapua Naujoji GvinėjarPUPErQXPerurRUPKrSX PakistanasrTUPHrUX FilipinairVUFOrWX Farerų salosrXUPNrYX PitkernasrZUPLr[XLenkijar\UPMr]XSen Pjeras ir Mikelonasr^UZMr_XZambijar`UEHraXVakarų SachararbURUrcXRusijos FederacijardUEEreXEstijarfUEGrgXEgiptasrhUZAriX Pietų AfrikarjUECrkX EkvadorasrlUITrmXItalijarnUVNroX VietnamasrpUZZrqXNežinoma ar neteisinga sritisrrUSBrsXSaliamono salosrtUETruXEtiopijarvUSOrwXSomalisrxUZWryX ZimbabvėrzUSAr{X Saudo Arabijar|UESr}XIspanijar~UERrX EritrėjarUMErX JuodkalnijarUAQrX AntarktisrUMGrX MadagaskarasrUMArXMarokasrUMCrXMonakasrUUZrX UzbekistanasrUMMrX MianmarasrUMLrXMalisrUMOrXMacaorUMNrX MongolijarUHMrX Heardo ir McDonaldo Salų SritisrUASrXAmerikos SamoarUMKrX MakedonijarUMUrX MauricijusrUMTrXMaltarUMWrXMalavisrUMVrXMaldivairUMQrX MartinikarUMPrXMarianos šiaurinės salosrUMSrX MontserratasrUMRrX MauritanijarUIMrX Meno salarUUGrXUgandarUTZrX TanzanijarUMYrX MalaizijarUMXrXMeksikarUILrXIzraelisrUFRrX PrancūzijarUAWrXArubarUDOrXDominikos RespublikarUSHrXŠventoji ElenarUVCrX"Šventasis Vincentas ir GrenadinairU054rX MelanezijarUDJrX DžibutisrUFJrXFidžisrU057rXMikronezija [057]rU172rX#Nepriklausomų Valstybių SandraugarU053rXAustralija ir Naujoji ZelandijarUNIrX NikaragvarUNLrX NyderlandairUNOrX NorvegijarUNArXNamibijarUVUrXVanuaturUNCrXNaujoji KaledonijarUNErXNigerisrUNFrX Norfolko salarUNGrXNigerijarUNZrXNaujoji ZelandijarUNPrXNepalasrUNRrXNaururUNUrXNiuerU061rX PolinezijarUCIrXDramblio Kaulo KrantasrUCHrX ŠveicarijarUCOrX KolumbijarUCNrXKinijarUCMrX KamerūnasrUCLrXČilėrUCCrX Kokosų salosrUCArXKanadarUCGrXKongasrUCFrXCentrinės Afrikos RespublikarUCDrXKongo Demokratinė RespublikarUCZrXČekijarUCYrXKiprasrUCXrX Kalėdų salarUCSrXSerbija ir JuodkalnijarUCRrX Kosta RikarUPYr X Paragvajusr UCVr XŽaliasis Kyšulysr UCUr XKubarUSZrX SvazilendasrUSYrXSirijarUKGrX KirgiztanasrUKErXKenijarUSRrX SurinamasrU143rXCentrinė AzijarUKHrX KambodžarUKNrXSent Kitsas ir NevisrUKMrXKomorair USTr!XSan Tomė ir Principėr"USKr#X Slovakijar$UKRr%XPietų Korėjar&USIr'X Slovėnijar(UKPr)XŠiaurės Korėjar*UKWr+XKuveitasr,USNr-X Senegalasr.USMr/X San Marinasr0USLr1X Siera Leonėr2USCr3X Seišeliair4UKZr5X Kazachstanasr6UKYr7XKaimanų salosr8USGr9X Singapūrasr:USEr;XŠvedijar<USDr=XSudanasr>U151r?X Rytų Europar@U150rAXEuroparBUDMrCXDominikarDU155rEXVakarų EuroparFU154rGXŠiaurės EuroparHUVGrIX&Didžiosios Britanijos Mergelių salosrJUDErKX VokietijarLUYErMXJemenasrNUMHrOXMaršalo SalosrPU062rQXPietų-vidurio AzijarRUDZrSXAlžyrasrTUUSrUXJungtinės ValstijosrVUUYrWX UrugvajusrXUYTrYX Mayotte’asrZUUMr[X0Jungtinių Valstijų mažosios aplinkinės salosr\ULBr]XLibanasr^ULCr_XŠventoji Liucijar`ULAraXLaosasrbUTVrcXTuvalurdUTWreXTaivanasrfUTTrgXTrinidadas ir TobagasrhUTRriXTurkijarjULKrkX Šri LankarlULIrmXLichtenšteinasrnUCKroX Kuko salosrpUTOrqXTongarrULTrsXLietuvartULUruX LiuksemburgasrvULRrwXLiberijarxULSryXLesotasrzUTHr{X Tailandasr|UTFr}XPrancūzijos Pietų sritysr~UTGrXTogasrUTDrXČadasrUTCrXTurkso ir Caicoso salosrULYrXLibijarU200rXČekoslovakijarU145rX Vakarų AzijarUAErXJungtiniai Arabų EmyratairUADrXAndorarUAGrXAntigva ir BarbudarUAFrX AfganistanasrUAIrXAngilijarUVIrXMergelių salos (JAV)rUISrX IslandijarUIRrXIranasrUAMrX ArmėnijarUALrXAlbanijarUAOrXAngolarUANrXOlandijos AntilairU003rXŠiaurės AmerikarU002rXAfrikarU001rXPasaulisrUARrX ArgentinarUAUrX AustralijarUATrXAustrijarU005rXPietų AmerikarUINrXIndijarUAXrX Aland IslandsrU009rXOkeanijarUAZrXAzerbaidžanasrUIErXAirijarUIDrX IndonezijarUJOrX JordanijarUQUrXEuropos SąjungarUUArXUkrainarUQArXKatarasrUDKrXDanijarUMZrX MozambikasruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X yyyy.MM.ddrh.X%(yyyy)s.%(MM)s.%(dd)srubUfullrh))r}r(h,Xyyyy 'm'. MMMM d 'd'.,EEEErh.X&%(yyyy)s m. %(MMMM)s %(d)s d.,%(EEEE)srubUlongrh))r}r(h,Xyyyy 'm'. MMMM d 'd'.rh.X%(yyyy)s m. %(MMMM)s %(d)s d.rubUshortrh))r}r(h,X yyyy-MM-ddrh.X%(yyyy)s-%(MM)s-%(dd)srubuUcurrency_symbolsr}rULTLrXLtrsU time_zonesr}r(UAtlantic/Canaryr}rUcityrX Kanarų salosrsU Europe/Minskr}rjXMinskasrsUAmerica/Buenos_Airesr}rjX Buenos AirėsrsU Asia/Muscatr}rjXMaskatasrsU Pacific/Waker}rjX KlivaterisrsUAfrica/Tripolir}rjXTripolisrsUEurope/Tallinnr}rjXTalinasrsU Asia/Colombor}rjXKolomborsUIndian/Reunionr}rjX ReunionasrsUAfrica/Libreviller}rjX LibrevilisrsUAfrica/Freetownr}rjX FrytaunasrsU Asia/Dhakar }r jXDakar sUAmerica/St_Luciar }r jX St. LuciarsUEurope/Amsterdamr}rjX AmsterdamasrsUAmerica/Montserratr}rjX MontseratasrsUAfrica/Nairobir}rjXNairobisrsU Europe/Tiraner}rjXTiranarsUPacific/Saipanr}rjXSaipanasrsUAfrica/Abidjanr}rjX Abidžanasr sUAfrica/Djiboutir!}r"jX Džibutisr#sU Africa/Cairor$}r%jXKairasr&sUAmerica/El_Salvadorr'}r(jX Salvadorasr)sUAmerica/Indiana/Petersburgr*}r+jX Peterburgasr,sU Europe/Madridr-}r.jXMadridasr/sUAmerica/Santiagor0}r1jX Santjagasr2sU Asia/Dubair3}r4jXDubajusr5sUEurope/Brusselsr6}r7jX Briuselisr8sUAsia/Ulaanbaatarr9}r:jX Ulan-Batorasr;sUIndian/Maldivesr<}r=jXMaldyvair>sU Europe/Parisr?}r@jX ParyžiusrAsUEurope/StockholmrB}rCjX StokholmasrDsU Pacific/FijirE}rFjXFidžisrGsU Pacific/ApiarH}rIjXApijarJsUAfrica/CasablancarK}rLjX KasablankarMsUAmerica/CaymanrN}rOjXKaimanasrPsU Europe/AthensrQ}rRjXAtėnairSsU Pacific/GuamrT}rUjXGuamasrVsU Pacific/TrukrW}rXjXTrukasrYsU Asia/RangoonrZ}r[jX Rangūnasr\sUAfrica/Khartoumr]}r^jX Chartumasr_sUAmerica/Puerto_Ricor`}rajX Puerto RikasrbsUIndian/Mauritiusrc}rdjX MauricijusresU Europe/Berlinrf}rgjXBerlynasrhsU Europe/Zurichri}rjjX CiurichasrksUAmerica/Guatemalarl}rmjX GvatemalarnsU Asia/Tbilisiro}rpjXTbilisisrqsU America/Belemrr}rsjXBelemasrtsU Europe/Romeru}rvjXRomarwsUAfrica/Sao_Tomerx}ryjX San TomėrzsU Europe/Warsawr{}r|jXVaršuvar}sUEurope/Andorrar~}rjXAndorarsUAtlantic/Bermudar}rjXBermudų salosrsU Asia/Tehranr}rjX TeheranasrsU America/Thuler}rjXTūlarsUAmerica/Monctonr}rjX MonktonasrsUAtlantic/Stanleyr}rjXStenlisrsUAmerica/St_Thomasr}rjX St. ThomasrsUEurope/Helsinkir}rjX HelsinkisrsUAsia/Hong_Kongr}rjX HonkongasrsU Asia/Macaur}rjXMakaorsUAmerica/Guadelouper}rjX GvadelupėrsUEurope/Copenhagenr}rjX KopenhagarsU Europe/Kievr}rjXKijevasrsUPacific/Enderburyr}rjX EnderburisrsUAmerica/Jamaicar}rjXJamaikarsUAmerica/Danmarkshavnr}rjXDanmarkshavn’asrsUAmerica/Caracasr}rjX KarakasasrsU Asia/Baghdadr}rjXBagdadasrsUAfrica/Monroviar}rjX MonrovijarsUEurope/Budapestr}rjX BudapeštasrsUAmerica/Los_Angelesr}rjX Los AndželasrsU Asia/Ammanr}rjXAmanasrsU Asia/Kabulr}rjXKabulasrsUIndian/Antananarivor}rjX AntananarivasrsUAmerica/St_Vincentr}rjXSant VincentėrsUAtlantic/Reykjavikr}rjX ReikjavikasrsU Asia/Nicosiar}rjXNikosijarsUPacific/Ponaper}rjXPonapėrsUAmerica/Guyanar}rjXGajanarsUAmerica/Sao_Paulor}rjX San PaulasrsUAmerica/Belizer}rjXBelizasrsUAmerica/Port_of_Spainr}rjXPort of SpeinasrsUPacific/Pitcairnr}rjXPitcairno salosrsU Asia/Tashkentr}rjX TaškentasrsUPacific/Easterr}rjX Velykų salarsU Asia/Jakartar}rjX DžakartarsUAmerica/New_Yorkr}rjX NiujorkasrsUAfrica/Johannesburgr}rjX JohanesburgasrsU Europe/Rigar}rjXRygarsU Africa/Tunisr}rjXTunisasrsU Asia/Dilir}rjXDilisrsU Asia/Adenr}rjXAdenasrsU Asia/Ashgabatr}rjX AšchabadasrsUEurope/Istanbulr}rjX StambulasrsU Asia/Bangkokr}rjXBankokasrsUAfrica/Kinshasar}rjXKinšasarsUEurope/Bucharestr}r jX Bukareštasr sUEurope/Gibraltarr }r jX Gibraltarasr sUPacific/Galapagosr}rjX GalapagairsU Europe/Monacor}rjXMonakasrsU Asia/Bishkekr}rjX BiškekasrsUAmerica/Denverr}rjXDenverisrsU Asia/Aqtober}rjX AktiubinskasrsUAmerica/Chicagor}rjXČikagarsUAmerica/Cayenner }r!jXKajenasr"sU Africa/Dakarr#}r$jXDakarasr%sU Asia/Yerevanr&}r'jX Jerevanasr(sUAmerica/La_Pazr)}r*jXLa Pasasr+sUAfrica/Mogadishur,}r-jX Mogadišasr.sUAmerica/Phoenixr/}r0jXFyniksasr1sUAmerica/Cuiabar2}r3jXKujabar4sUPacific/Guadalcanalr5}r6jX Gvadalkanalasr7sUPacific/Tarawar8}r9jXTaravar:sUAfrica/Addis_Ababar;}r<jX Addis Abebar=sU Pacific/Efater>}r?jXEfatasr@sUPacific/JohnstonrA}rBjX DžonstonasrCsUAsia/VientianerD}rEjX VientianasrFsU Asia/KuwaitrG}rHjXKuveitasrIsU Europe/LisbonrJ}rKjXLisabonarLsUAfrica/ConakryrM}rNjXKonakrisrOsUAtlantic/AzoresrP}rQjXAzorairRsUAsia/SingaporerS}rTjX SingapūrasrUsU Europe/OslorV}rWjXOslasrXsUAmerica/St_KittsrY}rZjX St. Kitsasr[sUAmerica/Godthabr\}r]jX Godthabasr^sU Asia/Beirutr_}r`jXBeirutasrasUAfrica/Ndjamenarb}rcjX NdžamenardsU Asia/Bahrainre}rfjX BahreinasrgsU Europe/Londonrh}rijXLondonasrjsUAmerica/Costa_Ricark}rljX Kosta RikarmsU Asia/Riyadhrn}rojXRijadasrpsUIndian/Mayotterq}rrjXMajotasrssUAfrica/Gaboronert}rujX GaboronasrvsUAtlantic/Faeroerw}rxjXFarerairysUAmerica/Montevideorz}r{jX Montevidëjasr|sUAmerica/Managuar}}r~jXManagvarsU Asia/Damascusr}rjXDamaskasrsU Asia/Qatarr}rjXKatarasrsU Asia/Bruneir}rjX BrunėjusrsU Asia/Dushanber}rjX DušanbėrsUAtlantic/St_Helenar}rjX Šv. HelenarsUAmerica/Barbadosr}rjX BarbadosasrsU Asia/Gazar}rjX Gazos ruožasrsUAmerica/Martiniquer}rjX MartinikarsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersU Asia/Almatyr}rjXAlma AtarsUPacific/Tahitir}rjXTaitisrsUAmerica/Santo_Domingor}rjXSanto DomingasrsUAfrica/Brazzaviller}rjX BrazavilisrsUAmerica/Grand_Turkr}rjX Grand TerkasrsUAmerica/Asuncionr}rjX AsunsjonasrsU Europe/Viennar}rjXVienarsU Asia/Seoulr}rjXSeulasrsUPacific/Norfolkr}rjX NorfolkasrsU Europe/Dublinr}rjXDublinasrsU Europe/Sofiar}rjXSofijarsUAmerica/Dominicar}rjXDominikarsUAfrica/Porto-Novor}rjX Porto NovasrsU Europe/Vaduzr}rjXVaducasrsUEurope/Luxembourgr}rjX LiuksemburgasrsUAntarctica/South_Poler}rjXPietų ašigalisrsUAmerica/Anchorager}rjX AnkoridžasrsUIndian/Christmasr}rjX Kalėdų salarsU Africa/Asmerar}rjXAsmararsU Indian/Comoror}rjXKomorasrsuUscriptsr}r(UHebrrXhebrajųrUGeorrXgruzinųrUCyrlrXkirilicarUHrktrXkatakana/hiraganarUArmnrXarmėnųrUCyrsrX"senoji bažnytinė slavų kirilicarUKhmrrXkhmerųrULatnrXlotynųrUGothrXgotųrUMayarXmalų hieroglifairUEthirXetiopųrUKorerX korejiečiųrUItalrXsenasis italųrUArabrXarabųrUCoptrXkoptųrUMongrXmongolųrURunrrXrunųrUHirarXhiraganarUHungrXsenasis vengrųrUBrairXbrailiorUGrekrXgraikųrUCherrX čerokiųrUHangrXhangulrUJpanrXjaponųrUKanar Xkatakanar UBengr Xbengalųr UEgypr Xegipto hieroglifairuUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}r(UDZDrXAlžyro dinarasrUNADrXNamibijos dolerisrUGHSrX Ganos sedisrUBOPrXBolivijos pesasr UEGPr!X Egipto svarasr"UBGLr#XBulgarijos levas (1962-1999)r$UBGNr%XBulgarijos levasr&UPABr'XPanamos balbojar(UYUMr)XJugoslavijos naujasis dinarasr*UZWDr+XZimbabvės dolerisr,UGHCr-XGanos sedis (1979-2007)r.UXBDr/X)Europos valiutos/apskaitos vienetas (XBD)r0UBOBr1XBolivijos bolivijanasr2UXBAr3XEuropos suvestinės vienetasr4UDKKr5X Danijos kronar6UXBCr7X)Europos valiutos/apskaitos vienetas (XBC)r8UXBBr9XEuropos piniginis vienetasr:UBWPr;XBotsvanos pular<ULBPr=X Libano svarasr>UTZSr?XTanzanijos šilingasr@UVNDrAXVietnamo dongairBUAOArCXAngolos kvanzarDUWSTrEXVakarų Samoa talarFUAONrGXAngolos naujoji kvanzarHUYDDrIXJemeno dinarasrJUMYRrKXMalaizijos ringitasrLUAOKrMXAngolos kvanza (1977-1990)rNUSOSrOXSomalio šilingasrPUTHBrQXBatasrRULYDrSXLibijos dinarasrTUUAHrUXUkrainos grivinarVUUAKrWXUkrainos karbovanecasrXUUGXrYXUgandos šilingasrZUJODr[XJordanijos dinarasr\USURr]XSovietų Sąjungos rublisr^UAWGr_XArubos guldenasr`USARraXSaudo Arabijos rialasrbUFIMrcXSuomijos markėrdUHKDreXHonkongo dolerisrfUSRGrgXSurimano guldenasrhUTPEriXTimoro eskudasrjUMGFrkXMadagaskaro frankasrlUCHFrmXŠveicarijos frankasrnUGIProXGibraltaro svarasrpUBYRrqXBaltarusijos rublisrrUALLrsXAlbanijos lekasrtUXPDruXPaladisrvUMROrwXMauritanijos ugijarxUBOVryXBolivijos mvdolrzUHRKr{XKroatijos kunar|UDJFr}XDžibučio frankasr~UHRDrXKroatijos dinarasrUPESrX Peru solisrUBYBrXBaltarusijos naujasis rublisrUITLrX Italijos lirarUXAFrXCFA BEAC frankasrUBNDrXBrunėjaus dolerisrUISKrXIslandijos kronarUZALrX,Pietų Afrikos Respublikos finansinis randasrUSRDrXSurimano dolerisrUNIOrXNikaragvos kardoba orasrULAKrX Laoso kipasrUNICrXNikaragvos kardobarUNPRrX Nepalo rupijarUMZErXMozambiko eskudasrUUYUrXUrugvajaus pesasrULUCrX#Liuksemburgo konvertuojamas frankasrUJMDrXJamaikos dolerisrUFRFrXPrancūzijos frankasrUMAFrXMaroko frankasrUMZMrXSenasis Mozambiko metikalisrUMZNrXMozambiko metikalisrUPHPrXFilipinų pesasrUZARrX PAR RandasrURHDrXRodezijos dolerisrUATSrXAustrijos šilingasrULUFrXLiuksemburgo frankasrUBELrXBelgijos frankas (finansinis)rUBECrX!Belgijos frankas (konvertuojamas)rUNGNrXNigerijos nairarUYUNrX#Jugoslavijos konvertuojamas dinarasrUBEFrXBelgijos frankasrUPLZrXLenkijos zlotas (1950-1995)rUCRCrXKosta Rikos kolonasrUAEDrX JAE dirhamasrUEEKrX Estijos kronarUMWKrXMalavio kvačarUTTDrXTrinidado ir Tobago dolerisrULKRrXŠri Lankos rupijarUSKKrXSlovakijos kronarUTRLrX Turkijos lirarUPKRrXPakistano rupijarUHUFrXVengrijos forintasrUROLrXSenoji Rumunijos lėjarUXEUrX&Europos piniginis vienetas (1993-1999)rUBMDrXBermudos dolerisrUOMRrX Omano rialasrULSLrX Lesoto lotisrULVRrXLatvijos rublisrUMNTrXMongolijos tugrikasrUAMDrXArmėnijos dramasrUSYPrXSirijos svarasrUQARrX Kataro rialasrUXDRrX SDR Tarptautinis valiutos fondasrUNLGrXNyderlandų guldenasrUUGSrXUgandos šilingas (1966-1987)rUMTPrX Maltos svarasrUGBPrXSvaras sterlingųrUGELrXGruzijos larisrUSHPrXŠv. Elenos salų svarasrUAFNrXAfganisrUSBDrXSaliamono salų dolerisrUKPWrXŠiaurės Korėjos vonasrUCSDrXSenasis Serbijos dinarasrUAFArXAfganis (1927-2002)rUTRYrXNaujoji Turkijos LirarUBDTrXBangladešo takarUGRDrXGraikijos drachmarUYERrX Jemeno rialasrUDDMrXRytų Vokietijos ostmarkėrUSZLr XSvazilendo lilangenisr UHTGr XHaičio gurdasr UXOFr XCFA BCEAO frankasrUMGArXMadagaskaro ariarisrUANGrXNyderlandų Antilų guldenasrULRDrXLiberijos dolerisrURWFrXRuandos frankasrUNOKrXNorvegijos kronarUMXVrX"Meksikos United de Inversion (UDI)rUKESrXKenijos šilingasrUMOPrX Macao patakarUINRrXIndijos rupijar UMXNr!XMeksikos pesasr"UCZKr#XČekijos kronar$UTJSr%XTadžikistano somonisr&UTJRr'XTadžikistano rublisr(UBTNr)XButano ngultrumasr*UGWEr+XPortugalų Gvinėjos eskudasr,UCOPr-XKolumbijos pesasr.UMURr/XMauricijaus rupijar0UIDRr1XIndonezijos rupijar2UHNLr3XHonduro lempirar4UXPFr5X CFP frankasr6UFJDr7XFidžio dolerisr8UETBr9XEtiopijos birasr:UPENr;XPeru naujasis solisr<UBZDr=XBelizo dolerisr>UGWPr?XGvinėjos-Bisau pesasr@UILPrAXIzraelio svarasrBUZRNrCXZairo naujasis zairasrDUDOPrEXDominikos pesasrFULULrGXLiuksemburgo finansinis frankasrHUTMMrIXTurkmėnistano manatasrJUTWDrKXNaujasis Taivano dolerisrLUMDLrMXMoldovos lėjarNUXPTrOXPlatinarPUECVrQXEkvadoro constante (UVC)rRUECSrSXEkvadoro sukrėrTUBSDrUXBahamų dolerisrVUSEKrWXŠvedijos kronarXUZMKrYXZambijos kvačarZUMVRr[XMaldyvų salų rufijar\UAUDr]XAustralijos dolerisr^UADPr_XAndoros pesetar`UCUPraX Kubos pesasrbUIEPrcXAirijos svarasrdUBBDreXBarbadoso dolerisrfUKMFrgXKomoro frankasrhUKRWriXPietų Korėjos vonasrjUGMDrkXGambijos dalasisrlUVEFrmXStiprusis Venesuelos bolivarasrnUGTQroXGvatemalos ketcalisrpUVEBrqX BolivarasrrUSITrsXSlovėnijos tolarasrtUSDPruXSenasis Sudano svarasrvUCLPrwX Čilės pesasrxUEURryXEurasrzUCDFr{X Kongo frankasr|UXCDr}XRytų Karibų dolerisr~UKZTrXKazachstano tengėrURUBrXRusijos rublisrUXFUrX Uic -frankasrUXAGrXSidabrasrUBRRrXBrazilijos kruzeirasrUBRNrXBrazilijos naujasis kruzadasrUBRLrXBrazilijos realasrUMMKrXMianmaro kijatasrUUYPrXUrugvajaus pesas (1975-1993)rURURrXRusijos rublis (1991-1998)rUPLNrXLenkijos zlotasrUBRErX Brazilijos kruzeiras (1990-1993)rUPYGrXParagvajaus guaranisrUBRCrXBrazilijos kruzadasrUBRBrXBrazilijos naujasis kruzeirasrUSVCrXSalvadoro kolonasrUDEMrXVokietijos markėrUMKDrXMakedonijos denarasrUAZMrX!Azerbaidžano manatas (1993-2006)rUAZNrXAzerbaidžano manatasrUUSNrXJAV doleris (sekančios dienos)rUTOPrX Tongo paangarUBADrX Bosnijos ir Hercegovinos dinarasrUGNFrXGvinėjos frankasrUMXPrXMeksikos sidabrinis pesasrUIQDrX Irako dinarasrUERNrXEritrėjos nakfarUBAMrX/Bosnijos ir Hercegovinos konvertuojamoji markėrUSCRrXSeišelių salų rupijarUCADrXKanados dolerisrUSDDrXSenasis Sudano dinarasrUCYPrX Kipro svarasrUMADrXMaroko dirhamasrUKWDrXKuveito dinarasrUBIFrXBurundžio frankasrULTTrXLietuvos talonasrUPGKrXPapua Naujosios Gvinėjos kinarjXLitasrUSGDrXSingapūro dolerisrUUZSrXUzbekistano sumasrUSTDrXSao Tomės ir Principės dobrarUXFOrXAuksinis - frankasrUMLFrX Malio frankasrUESPrXIspanijos pesetarUIRRrX Irano rialasrUZRZrX Zairo zairasrUCNYrXŽenminbi juanisrUSLLrXSiera Leonės leonėrUTNDrXTuniso dinarasrUGYDrXGajanos dolerisrUMTLrX Maltos lirarUNZDrXNaujosios Zelandijos dolerisrUFKPrXFalklando salų svarasrULVLrXLatvijos latasrUUSSrXJAV doleris (šios dienos)rUUSDrX JAV dolerisrUARPrXArgentinos pesas (1983-1985)rUKGSrXKirgizijos somasrUARSrXArgentinos pesasrUILSrXIzraelio šekelisrURONrXNaujoji Rumunijos lėjarURSDrXSerbijos dinarasrUBHDrXBahreino dinarasrUJPYrXJenarUSDGrX Sudano svarasrUPTErXPortugalijos eskudasrUXAUrXAuksasruUmonthsr}r(U stand-aloner}r(Uwider}r (KXSausisr KXVasarisr KXKovasr KXBalandisr KXGegužėrKX BirželisrKXLieparKX RugpjūtisrK X RugsėjisrK XSpalisrK X LapkritisrK XGruodisruUnarrowr}r(KXSrKXVrKXKrKXBrKXGrKjKXLrKXRrK jK jK jK juuUformatr}r (Uwider!}r"(KXsausior#KXvasarior$KXkovor%KX balandžior&KX gegužėsr'KX birželior(KXlieposr)KX rugpjūčior*K Xrugsėjor+K Xspalior,K X lapkričior-K X gruodžior.uU abbreviatedr/}r0(KXSaur1KXVasr2KXKovr3KXBalr4KXGegr5KXBirr6KXLier7KXRgpr8K XRgsr9K XSplr:K XLapr;K XGrdr<uuuUcurrency_formatsr=}r>Ncbabel.numbers NumberPattern r?)r@}rA(Uexp_precrBNUscalerCKU frac_precrDKKrEUsuffixrFX ¤rGjGrHUint_precrIKKrJh,X #,##0.00 ¤rKUprefixrLXrMX-rNrOUexp_plusrPNUgroupingrQKKrRubsUdaysrS}rT(U stand-alonerU}rVUnarrowrW}rX(KXPrYKXArZKXTr[KjKjYKXŠr\KjusUformatr]}r^(Uwider_}r`(KX pirmadienisraKX antradienisrbKX trečiadienisrcKXketvirtadienisrdKX penktadienisreKX šeštadienisrfKX sekmadienisrguU abbreviatedrh}ri(KXPrrjKXAnrkKXTrrlKXKtrmKXPnrnKXŠtroKXSkrpuuuU meta_zonesrq}rr(UTurkeyrs}rt(UcommonruUlongrv}rw(UdaylightrxXTurkijos vasaros laikasryUstandardrzXTurkijos laikasr{uuUEurope_Easternr|}r}(jujv}r~(jxXRytų Europos vasaros laikasrjzXRytų Europos laikasruuU Kuybyshevr}r(jujv}r(jxXKuibyševo vasaros laikasrjzXKuibyševo laikasruuUPerur}r(jujv}r(jxXPeru vasaros laikasrjzX Peru laikasruuU Argentinar}r(jujv}r(jxXArgentinos vasaros laikasrjzXArgentinos laikasruuUBoliviar}r(jujv}rjzXBolivijos laikasrsuU Venezuelar}r(jujv}rjzXVenesuelos laikasrsuUEcuadorr}r(jujv}rjzXEkvadoro laikasrsuU Alaska_Hawaiir}r(jujv}r(UgenericrXAliaskos-Havajų laikasrjxXAliaskos-Havajų vasaros laikasrjzX$Aliaskos-Havajų standartinis laikasruuUAfrica_Westernr}r(jujv}r(jxXVakarų Afrikos vasaros laikasrjzXVakarų Afrikos laikasruuUCubar}r(jujv}r(jX Kubos laikasrjxXKubos vasaros laikasrjzXKubos standartinis laikasruuUEurope_Centralr}r(jujv}r(jxXVidurio Europos vasaros laikasrjzXVidurio Europos laikasruuUArgentina_Westernr}r(jujv}rjzXVakarų Argentinos laikasrsuUAmazonr}r(jujv}r(jxXAmazonės vasaros laikasrjzXAmazonės laikasruuUBeringr}r(jujv}r(jXBeringo laikasrjxXBeringo vasaros laikasrjzXBeringo standartinis laikasruuUAtlanticr}r(jujv}r(jXAtlanto laikasrjxXAtlanto vasaros laikasrjzXAtlanto standartinis laikasruuUChiler}r(jujv}r(jxXČilės vasaros laikasrjzXČilės laikasruuUBrasiliar}r(jujv}r(jxXBrazilijos vasaros laikasrjzXBrazilijos laikasruuU Dutch_Guianar}r(jujv}rjzXOlandų Gajanos laikasrsuUGreenland_Westernr}r(jujv}r(jxX#Grenlandijos vakarų vasaros laikasrjzXGrenlandijos vakarų laikasruuUAfrica_Easternr}r(jujv}rjzXRytų Afrikos laikasrsuU French_Guianar}r(jujv}rjzXPrancūzų Gajanos laikasrsuUAlaskar}r(jujv}r(jXAliaskos laikasrjxXAliaskos vasaros laikasrjzXAliaskos standartinis laikasruuUAmerica_Easternr}r(jujv}r(jX Rytų laikasrjxXRytų vasaros laikasrjzXRytų standartinis laikasruuU Volgogradr}r(jujv}r(jxXVolgogrado vasaros laikasrjzXVolgogrado laikasruuUAfrica_Southernr}r(jujv}r(jXPietų Afrikos laikasrjzX"Pietų Afrikos standartinis laikasruuUAmerica_Pacificr}r(jujv}r(jXRamiojo vandenyno laikasrjxX Ramiojo vandenyno vasaros laikasrjzX%Ramiojo vandenyno standartinis laikasruuUAmerica_Centralr}r (jujv}r (jX Centro laikasr jxXCentro vasaros laikasr jzXCentro standartinis laikasr uuUGreenland_Easternr }r (jujv}r (jxX!Grenlandijos rytų vasaros laikasr jzXGrenlandijos rytų laikasr uuUGuyanar }r (jujv}r jzXGajanos laikasr suU Newfoundlandr }r (jujv}r (jXNiufaundlendo laikasr jxXNiufaundlendo vasaros laikasr jzX!Niufaundlendo standartinis laikasr uuUUruguayr }r (jujv}r (jxXUrugvajaus vasaros laikasr jzXUrugvajaus laikasr uuUAfrica_Centralr }r (jujv}r jzXCentrinės Afrikos laikasr suUSamarar }r (jujv}r (jxXSamaros vasaros laikasr jzXSamaros laikasr! uuUGreenland_Centralr" }r# (jujv}r$ (jxX"Grenlandijos centro vasaros laikasr% jzXGrenlandijos centro laikasr& uuUColombiar' }r( (jujv}r) (jxXKolumbijos vasaros laikasr* jzXKolumbijos laikasr+ uuUParaguayr, }r- (jujv}r. (jxXParagvajaus vasaros laikasr/ jzXParagvajaus laikasr0 uuUMoscowr1 }r2 (jujv}r3 (jXMaskvos laikasr4 jxXMaskvos vasaros laikasr5 jzXMaskvos standartinis laikasr6 uuuUerasr7 }r8 U abbreviatedr9 }r: (KXpr. Kr.r; KXpo Kr.r< usu.PK[_.ll(site-packages/babel/localedata/en_VI.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ɦ%i i &site-packages/babel/localedata/sid.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXsoodoqUpmqXhawwaroquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UruqAXRussianqBUfrqCXFrenchqDUenqEXEnglishqFUzhqGXChineseqHUptqIX PortugueseqJUdeqKXGermanqLUitqMXItalianqNUhiqOXHindiqPUsidqQX Sidaamu AfoqRUarqSXArabicqTUjaqUXJapaneseqVUesqWXSpanishqXuU territoriesqY}qZ(URUq[XRussiaq\UFRq]XFranceq^UCNq_XChinaq`UDEqaXGermanyqbUJPqcXJapanqdUITqeXItalyqfUUSqgX United StatesqhUGBqiXUnited KingdomqjUBRqkXBrazilqlUINqmXIndiaqnUETqoX ItiyoophiyaqpuUdecimal_formatsqq}qrU date_formatsqs}qt(Umediumquh))qv}qw(h,X dd-MMM-yyyyqxh.X%(dd)s-%(MMM)s-%(yyyy)sqyubUfullqzh))q{}q|(h,XEEEE, MMMM dd, yyyyq}h.X#%(EEEE)s, %(MMMM)s %(dd)s, %(yyyy)sq~ubUlongqh))q}q(h,X dd MMMM yyyyqh.X%(dd)s %(MMMM)s %(yyyy)squbUshortqh))q}q(h,Xdd/MM/yyqh.X%(dd)s/%(MM)s/%(yy)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qULatnqXLatinqsUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}q(UUSDqX US DollarqURUBqX Russian RubleqUINRqX Indian RupeeqUCNYqXChinese Yuan RenminbiqUJPYqX Japanese YenqUBRLqXBrazilian RealqUGBPqXBritish Pound SterlingqUEURqXEuroquUmonthsq}q(U stand-aloneq}qUnarrowq}q(KXJqKXFqKXMqKXAqKhKhKhKhK XSqK XOqK XNqK XDqusUformatq}q(Uwideq}q(KXJanuaryqKXFebruaryqKXMarchqKXAprilqKXMayqKXJuneqKXJulyqKXAugustqK X SeptemberqK XOctoberqK XNovemberqK XDecemberquU abbreviatedq}q(KXJanqKXFebqKXMarqKXAprqKXMayqKXJunqKXJulqKXAugqK XSepqK XOctqK XNovqK XDecquuuUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqh݆qUint_precqKKqh,X ¤#,##0.00qUprefixqX¤qX-¤qqUexp_plusqNUgroupingqKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKXRqKXHqKhKXQqKhusUformatq}q(Uwideq}q(KXSanyoqKX MaakisanyoqKXRooweqKXHamuseqKXArbeqKXQidaameqKXSambataquU abbreviatedq}q(KXSanqKXMakrKXRowrKXHamrKXArbrKXQidrKXSamruuuU meta_zonesr}rUerasr}r U abbreviatedr }r (KXYIAr KXYIGr usu.PK[_.ll-site-packages/babel/localedata/az_Latn_AZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[1ll(site-packages/babel/localedata/de_DE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/kw_GB.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[<99(site-packages/babel/localedata/dv_MV.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[(site-packages/babel/localedata/ar_JO.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}qUcurrency_symbolsq}qU time_zonesq}q Uscriptsq!}q"UItalq#X#اللأيطالية القديمةq$sUvariantsq%}q&Unumber_symbolsq'}q(Ucurrency_namesq)}q*Umonthsq+}q,Uformatq-}q.(Uwideq/}q0(KXكانون الثانيq1KXشباطq2KXآذارq3KX نيسانq4KXأيارq5KX حزيرانq6KXتموزq7KXآبq8K X أيلولq9K Xتشرين الأولq:K Xتشرين الثانيq;K Xكانون الأولq(KXكانون الثانيq?KXشباطq@KXآذارqAKX نيسانqBKXأيارqCKX حزيرانqDKXتموزqEKXآبqFK X أيلولqGK Xتشرين الأولqHK Xتشرين الثانيqIK Xكانون الأولqJuusUcurrency_formatsqK}qLUdaysqM}qNUformatqO}qPU abbreviatedqQ}qR(KXالاثنينqSKXالثلاثاءqTKXالأربعاءqUKX الخميسqVKX الجمعةqWKX السبتqXKX الأحدqYussU meta_zonesqZ}q[Uerasq\}q]u.PK[&.]](site-packages/babel/localedata/nl_BE.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}q(UlvqXLetsqUssaqXNilo-SaharaansqUshqXServo-KroatischqUocqX!Occitaans (na 1500); ProvençaalsquU territoriesq}q (USBq!XSalomoneilandenq"U013q#XCentraal-Amerikaq$UIMq%XHet Eiland Manq&UMVq'X Maledivenq(uUdecimal_formatsq)}q*U date_formatsq+}q,(Umediumq-cbabel.dates DateTimePattern q.)q/}q0(Upatternq1X d-MMM-yyyyq2Uformatq3X%(d)s-%(MMM)s-%(yyyy)sq4ubUshortq5h.)q6}q7(h1Xd/MM/yyq8h3X%(d)s/%(MM)s/%(yy)sq9ubuUcurrency_symbolsq:}q;U time_zonesq<}q=Uscriptsq>}q?Uvariantsq@}qAUnumber_symbolsqB}qCUcurrency_namesqD}qEUmonthsqF}qGUcurrency_formatsqH}qINcbabel.numbers NumberPattern qJ)qK}qL(Uexp_precqMNUscaleqNKU frac_precqOKKqPUsuffixqQX ¤qRhRqSUint_precqTKKqUh1X #,##0.00 ¤qVUprefixqWXqXX-qYqZUexp_plusq[NUgroupingq\KKq]ubsUdaysq^}q_U meta_zonesq`}qaUerasqb}qcu.PK[8Ǐ..%site-packages/babel/localedata/fo.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX 1. kvartalq KX 2. kvartalq KX 3. kvartalqKX 4. kvartalquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAXgujaritiqBUgdqCXskotskt gælisktqDUgaqEXírsktqFUgnqGXguaraniqHUglqIXgallisktqJUlaqKXlatínqLUlnqMXlingalaqNUloqOXlaothianqPUtrqQXturkisktqRUlvqSXlatvisktqTUltqUXlitavsktqVUtkqWX turkmensktqXUthqYX thailendsktqZUtiq[Xtigrinyaq\Uteq]Xteluguq^Ufilq_Xtagalogq`UtaqaXtamilsktqbUyiqcXjiddisktqdUdeqeXtýsktqfUdaqgXdansktqhUelqiXgriksktqjUeoqkX esperantoqlUenqmXensktqnUeuqoXbaskisktqpUetqqX estlendsktqrUesqsXspansktqtUruquXrussisktqvUroqwXromansktqxUbnqyX bengalisktqzUbeq{X belarussisktq|Ubgq}X bulgarskumq~UukqX ukrainsktqUjvqX javanesisktqUbhqX biharisktqUbrqX bretonsktqUbsqXbosnisktqUjaqXjapansktqUocqXoccitanqUtwqXtwiqUtlhqX klingonsktqUorqXoriyaqUxhqXxhosaqUcaqX katalansktqUcyqX valisisktqUcsqXkekkisktqUpsqXpashtoqUptqX portugisisktqUpaqXpunjabiqUviqX vietnamesisktqUplqXpolsktqUhyqX armenskumqUhrqX kroatiskumqUhuqXungarsktqUhiqXhindiqUheqX hebraisktqUuzqX uzbekisktqUmlqX malayalamqUmnqX mongolisktqUmkqX makedonsktqUurqXurduqUmtqX maltesisktqUmsqXmalayqUmrqX marathisktqUugqXuighurqUafqXafrískaqUswqXswahiliqUisqX íslendsktqUamqX amharisktqUitqXitalsktqUsvqXsvensktqUasqX assamesisktqUarqXarabisktqUkmqX kambodjansktqUzuqXsuluqUiaqX interlinguaqUazqXazerbaijanisktqUieqX interlingueqUidqX indonesiskumqUnlqX hollendsktqUnnqX nýnorsktqUnoqXnorsktqUnbqXnorskt bokmålqUneqXnepalsktqUfrqXfransktqUfyqXfrisisktqUfaqXpersisktqUfiqXfinsktqUkyqXkyrgyzqUfoqX føroysktqUkaqX georgisktqUsrqX serbiskumqUsqqXalbansktqUkoqX koreansktqUknqXkannadaqUsuqX sundanesisktqUstqXsesothorUskrX slovakiskumrUsirX sinhalesisktrUshrXserbokroatisktrUsorX somalisktrUkur Xkurdisktr Uslr X slovenskumr Usar XsanskritrUsdrXsindhiruU territoriesr}r(UBDrX BangladesjrUBErXBelgiarUBFrX Burkina FasorUBGrXBulgariarUVErX VenesuelarUBArXBosnia-HersegovinarUBBrXBarbadosr UBMr!XBermudar"UBNr#XBruneir$UBOr%XBoliviar&UBHr'XBahrainr(UBIr)XBurundir*UBJr+XBeninr,UBTr-XButanr.U011r/X Vesturafrikar0UBWr1XBotsvanar2U014r3X Eysturafrikar4U015r5X Norðurafrikar6UBRr7XBrasiliar8U017r9X Miðafrikar:U018r;X Suður Afrikar<U019r=XAmerikar>UBYr?XHvítarusslandr@UBZrAXBelisrBURUrCXRusslandrDURWrEXRuandarFURSrGXSerbiarHURErIXRéunionrJUTJrKX TadsjikistanrLUROrMXRumeniarNUTKrOXTokelaurPUGWrQX Guinea BissaurRUGUrSXGuamrTUGTrUX GuatemalarVUGRrWX GrikkalandrXUGQrYXEkvator GuinearZUGPr[X Guadelouper\UJPr]XJapanr^UOMr_XOmanr`UGYraXGujanarbUGGrcXGuernseyrdUGEreXGeorgiarfUGDrgXGrenadarhUGBriXStóra BretlandrjUGArkXGabonrlUSVrmX El SalvadorrnUGNroXGuinearpUGMrqXGambiarrUGLrsX GrønlandrtU029ruXKaribiarvUGIrwX GibraltarrxUGHryXGhanarzUJEr{XJerseyr|UTNr}XTunesiar~UJMrXJameikarU013rXSentralamerikarUWSrXSámoarUKIrXKiribatirUHRrXKroatiarUBSrXBahamasrUHTrXHaitirUHUrXUngarnrUHKrXHongkongrU039rX SuðurevroparUHNrXHondurasrUFIrXFinnlandrU142rXAsiarU030rX EysturasiarU034rX SuðurasiarU035rXSuðureysturasiarUPWrXPalaurUPTrXPortugalrUMDrXMoldovarUIQrXIrakrUPArXPanamarUPGrXPapua NýguinearUPErXPerúrUPKrXPakistanrUPHrX FilipsoyggjarrUFOrXFøroyarrUPLrXPóllandrUZMrXSambiarUEErXEstlandrUEGrX EgyptalandrUZArX SuðurafrikarUECrXEkvadorrUITrXItaliarUVNrXVietnamrUSBrXSálomonoyggjarnarrUETrXEtiopiarUSOrXSomaliarUZWrXSimbabvirUESrXSpaniarUERrXEritrearUMErX MontenegrorUAQrX AntarktisrUMGrX MadagaskarrUMArXMarokkorUMCrXMonakorUUZrX UsbekistanrUMMrXBurmarUMLrXMalirUMOrXMakaorUMNrXMongoliarUMHrXMarshalloyggjarnarrUMKrX MakedóniarUMUrX MóritiusrUMTrXMaltarUMWrXMalavirUMVrXMaldivuoyggjarnarrUPYrXParagueirUMSrX MontserratrUMRrX MóritaniarUUGrXUgandarUTZrXTansaniarUMYrXMaleisiarUMXrXMeksikorUILrXÍsraelrUFRrXFraklandrUAWrXArubarUDOrXDomingo lýðveldiðrUVCrX Saint Vinsent og GrenadinoyggjarrU054rX MelanesiarUDJr XDjiboutir UFJr XFijir UFMr X MikronesiarU053rXAvstralia og NýsælandrUNIrX NikaraguarUNLrX NiðurlondrUNOrXNoregrUNArXNamibiarUVUrXVanuaturUNErXNigerrUNGrXNigeriarUNZrX Ný Sælandr UNPr!XNepalr"UNRr#XNaurur$UNUr%XNiuer&U061r'X Polynesiar(UCIr)XFílabeinsstrondinr*UCHr+XSveisr,UCOr-XKolombiar.UCNr/XKinar0UCMr1XKamerunr2UCLr3XKilir4UCAr5XKanadar6UCGr7XKongor8UCFr9XMiðafrikalýðveldiðr:UCDr;XKongo-Kinshasar<UCZr=XKekkiar>UCYr?XKýprosr@UCRrAX Kosta RikarBUCVrCXGrønhøvdaoyggjarnarrDUCUrEXKubarFUSZrGX SvasilandrHUSYrIXSyriarJUKGrKXKirgisiarLUKErMXKenjarNUSRrOXSurinamrPU143rQX SentralasiarRUKHrSXKambodjarTUKNrUXSaint Kitts og NevisrVUKMrWXKomorooyggjarnarrXUSTrYXSao Tome og PrinsipirZUSKr[XSlovakiar\UKRr]X Suður-Korear^USIr_XSloveniar`UKPraX Norður-KorearbUKWrcXKuvaitrdUSNreXSenegalrfUSMrgX San MarinorhUSLriX Sierra LeonerjUSCrkXSeyskelloyggjarnarrlUKZrmX KasakstanrnUSAroX Saudi-ArábiarpUSGrqXSingaporrrUSErsX SvøríkirtUSDruXSudanrvU151rwX EysturevroparxU150ryXEvroparzUDMr{XDominikar|U155r}X Vesturevropar~U154rX NorðurevroparUDErX TýsklandrUYErXJemenrU062rXSuðursentralasiarUDZrXAlgeriarUUSrXSambandsríki AmerikarUUYrXUrugueirULBrXLibanonrULCrX Saint LusiarULArXLaosrUTVrXTuvalurUTWrXTeivanrUTTrXTrinidad og TobagorUTRrX TurkalandrULKrX Sri LankarULIrX LiktensteinrULVrXLettlandrUTOrXTongarULTrXLitavarULUrX LuksemborgrULRrXLiberiarULSrXLesotorUTHrXTeilandrUTGrXTogorUTDrXKjadrULYrXLibyarUVArXVatikanrU145rX VesturasiarUAErXSameindu EmirríkinirUADrXAndorrarUAGrXAntigua og BarbudarUAFrX AfganistanrUAIrXAnguillarUISrXÍslandrUIRrXIranrUAMrXArmeniarUALrXAlbaniarUAOrXAngolarU003rXNorðuramerikarU002rXAfricarUARrX ArgentinarUAUrX AvstraliarUATrX EysturríkirU005rX SuðuramerikarUINrXIndiarUAXrXÁlandrU009rXKyrrahavsoyggjarnarrUAZrX AserbajdsjanrUIErXÍrlandrUIDrX IndonesiarUJOrXJordanrUQUrXEUrUUArXUkreinarUQArXKatarrUDKrXDanmørkrUMZrXMosambikruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X dd-MM-yyyyrh.X%(dd)s-%(MM)s-%(yyyy)srubUfullrh))r}r(h,XEEEE dd MMMM yyyyrh.X!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)srubUlongrh))r}r(h,X d. MMM yyyyrh.X%(d)s. %(MMM)s %(yyyy)srubUshortrh))r}r(h,Xdd-MM-yyrh.X%(dd)s-%(MM)s-%(yy)srubuUcurrency_symbolsr}rUDKKr Xkrr sU time_zonesr }r Uscriptsr }rUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}rUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2r KX3r!KX4r"KX5r#KX6r$KX7r%KX8r&K X9r'K X10r(K X11r)K X12r*usUformatr+}r,(Uwider-}r.(KXjanuarr/KXfebruarr0KXmarsr1KXaprílr2KXmair3KXjunir4KXjulir5KXaugustr6K X septemberr7K Xoktoberr8K Xnovemberr9K Xdesemberr:uU abbreviatedr;}r<(KXjanr=KXfebr>KXmarr?KXaprr@KXmairAKXjunrBKXjulrCKXaugrDK XseprEK XoktrFK XnovrGK XdesrHuuuUcurrency_formatsrI}rJNcbabel.numbers NumberPattern rK)rL}rM(Uexp_precrNNUscalerOKU frac_precrPKKrQUsuffixrRXrSjSrTUint_precrUKKrVh,X ¤#,##0.00rWUprefixrXX¤rYX¤-rZr[Uexp_plusr\NUgroupingr]KKr^ubsUdaysr_}r`(U stand-alonera}rbUnarrowrc}rd(Kj Kj!Kj"Kj#Kj$Kj%KjusUformatre}rf(Uwiderg}rh(KX mánadagurriKX týsdagurrjKX mikudagurrkKX hósdagurrlKX fríggjadagurrmKX leygardagurrnKX sunnudagurrouU abbreviatedrp}rq(KXmánrrKXtýsrsKXmikrtKXhósruKXfrírvKXleyrwKXsunrxuuuU meta_zonesry}rzUerasr{}r|U abbreviatedr}}r~(KXBCErKXCErusu.PK[uмس??%site-packages/babel/localedata/fr.datnu[}q(U zone_formatsq}q(UregionqX%sqUfallbackqX %(1)s (%(0)s)qUgmtqXUTC%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1er trimestreqKX 2e trimestreqKX 3e trimestreqKX 4e trimestrequU abbreviatedq}q(KXT1q KXT2q!KXT3q"KXT4q#uUnarrowq$}q%(KXT1q&KXT2q'KXT3q(KXT4q)uuuUperiodsq*}q+(Uamq,XAMq-Upmq.XPMq/uUscientific_formatsq0}q1Ncbabel.numbers NumberPattern q2)q3}q4(Uexp_precq5KKq6Uscaleq7KU frac_precq8KKq9Usuffixq:Xq;h;qUpatternq?X#E0q@UprefixqAh;X-qBqCUexp_plusqDUgroupingqEMMqFubsUpercent_formatsqG}qHNh2)qI}qJ(h5Nh7Kdh8KKqKh:X %qLhLqMh=KKqNh?X#,##0 %qOhAh;hBqPhDNhEKKqQubsU week_dataqR}qS(Umin_daysqTKU weekend_startqUKU first_dayqVKU weekend_endqWKuU time_formatsqX}qY(UmediumqZcbabel.dates DateTimePattern q[)q\}q](h?XHH:mm:ssq^Uformatq_X%(HH)s:%(mm)s:%(ss)sq`ubUfullqah[)qb}qc(h?X HH:mm:ss vqdh_X%(HH)s:%(mm)s:%(ss)s %(v)sqeubUlongqfh[)qg}qh(h?X HH:mm:ss zqih_X%(HH)s:%(mm)s:%(ss)s %(z)sqjubUshortqkh[)ql}qm(h?XHH:mmqnh_X %(HH)s:%(mm)sqoubuU languagesqp}qq(UgvqrXmanxqsUguqtX goudjarâtîquUscnqvXsicilienqwUromqxXtziganeqyUalgqzXlangue algonquineq{Ualeq|Xaléouteq}Uscoq~X écossaisqUmniqXmanipuriqUgdqXgaélique écossaisqUgaqX irlandaisqUmnoqX langue manoboqUosaqXosageqUgnqXguaraniqUaltqX altaï du SudqUglqXgalicienqUmwrqXmarwarîqUtyqXtahitienqUtwqXtwiqUttqXtatarqUtrqXturcqUtsqXtsongaqUtnqXtswanaqUtoqXtonganqUausqXlangue australienneqUavqXavarqUtkqX turkmèneqUthqXthaïqUroaqX langue romaneqUtgqXtadjikqUteqX télougouqUugaqX ougaritiqueqUmwlqX mirandaisqUkcgqXtyapqUsmiqX langue samieqUfatqXfantiqUfanqXfangqUwoqXwolofqUrmqX rhéto-romanqUdinqXdinkaqUblaqXsiksikaqUcmcqX langue chameqUmlqX malayalamqUzhqXchinoisqUtemqXtemneqUen_CAqXanglais canadienqUnwcqXnewarî classiqueqUzaqXzhuangqUcauqXlangue caucasienneqUzuqXzoulouqUterqXterenoqUtetqXtetumqUmncqXmandchouqUkutqXkutenaiqUsukqXsukumaqUkumqXkoumykqUsusqXsoussouqUnewqXnewariqUsuxqX sumérienqUdenqXslaveyqUmenqXmendéqUmulqX multilingueqUlezqXlezghienqUrootqXracineqUekaqXekajukqUakkqXakkadienqUdraqXlangue dravidienneqUjrbqX judéo-arabeqUsgnqXlangue des signesqUsgaqXancien irlandaisqUapaqX langue apacheqUbraqXbrajqUchbrXchibcharUchgrX tchaghataïrUchkrXchuukrUchmrXmarirUchnrXjargon chinookr Uchor Xchoctawr Uchpr X chipewyanr UchrrXcherokeerUchyrXcheyennerUtirXtigrignarUvotrXvoterUmgrXmalgacherUibarXibanrUmorXmoldaverUmnrXmongolrUmirXmaorirUmhr Xmarshallr!Umkr"X macédonienr#Umtr$Xmaltaisr%Ucair&Xlangue amérindienne centraler'Udelr(Xdelawarer)Umsr*Xmalaisr+Umrr,Xmarather-Utar.Xtamoulr/Umyr0Xbirmanr1Ucadr2Xcaddor3Usrnr4X sranan tongor5Utair6X langue taïr7Uafhr8Xafrihilir9Usitr:Xlangue sino-tibétainer;Uenmr<X moyen anglaisr=Uen_AUr>Xanglais australienr?Unynr@X nyankolérAUnyorBXnyororCUnymrDXnyamwezirEUsiorFX langue siouxrGUmaprHXmalayo-polynésienrIUmasrJXmasairKUlahrLXlahndarMUladrNXladinorOUfyrPXfrisonrQUsnkrRXsoninkérSUfarTXpersanrUUmadrVXmaduraisrWUmagrXXmagahirYUmairZXmaithilir[Ufir\Xfinnoisr]Ufjr^Xfidjienr_Umanr`X mandingueraUegyrbXégyptien ancienrcUzndrdXzandéreUssrfXswatirgUsrrhXserberiUsqrjXalbanaisrkUswrlXswahilirmUsvrnXsuédoisroUsurpX soundanaisrqUstrrXsesothorsUskrtXslovaqueruUsirvX singhalaisrwUshrxX serbo-croateryUsorzXsomalir{Usnr|Xshonar}Usmr~XsamoanrUslrXslovènerUscrXsarderUsarXsanskritrUsgrXsanghorUserX sami du NordrUsdrXsindhîrUzenrXzenagarUkbdrXkabardinrUafarXlangue afro-asiatiquerUcsbrXkachouberUlgrXgandarUlbrXluxembourgeoisrUfiurXlangue finno-ougriennerUlnrXlingalarUlorXlaorUlirX limbourgeoisrUbynrXblinrUltrX lituanienrUlurX luba-katangarUfilrXfilipinorUyirXyiddishrUnonrX vieux norroisrUcebrXcebuanorUyorXyorubarUnogrXnogaïrUbatrX langue balterUdakrXdakotarUdarrXdargwarUdayrXdayakrUssarXlangue nilo-sahariennerUkperXkpellérUelrXgrecrUeorX espérantorUenrXanglaisrUlamrXlambarUeerXéwérUmdfrXmoksarUfrrX françaisrUmdrrXmandarrUetrXestonienrUesrXespagnolrUrurXrusserUgonrXgondirUgohrXancien haut allemandrUsmsrX sami skoltrUsmnrXsami d’InarirUsmjrX sami de LulerUde_ATrXallemand autrichienrUgotrXgotiquerUrnrXroundirUrorXroumainrUdsbrX bas-soraberUsmarX sami du SudrUgorrX gorontalorUastrXasturienrUwalrXwalamorUcrhrXturc de CriméerUathrXlangue athapascanerUgezrXguèzerUxhrXxhosarUffrXpeulrUkforXkororUmakrXmakassarrUzaprX zapotèquerUkokrXkonkanirUzxxrXsans contenu linguistiquerUkosrXkusaienrUforX féroïenrUtogrX tonga nyasar Uhupr Xhupar Uudmr X oudmourter UbejrXbedjarUbemrXbembarUtsirX tsimshianrUberrXberbèrerUnzirXnzemarUsairXlangue amérindienne du SudrUangrXancien anglaisrUprarXlangues prâkritrUbhorXbhojpurirUsalr Xlangue salishenner!Upror"Xprovençal ancienr#Urajr$X rajasthanir%Usadr&Xsandawer'Uanpr(Xangikar)Ues_419r*Xespagnol latino-américainr+Urapr,Xrapanuir-Usasr.Xsasakr/Unqor0Xn’kor1Ucarr2Xcariber3Uminr4X minangkabaur5Umicr6Xmicmacr7Uefir8Xefikr9Uarnr:Xaraukanr;Uypkr<X langues yupikr=Umisr>Xlangue diverser?Ukacr@XkachinrAUkabrBXkabylerCUkaarDX karakalpakrEUkajrFXjjurGUkamrHXkambarIUkarrJXkarenrKUkawrLXkawirMUfr_CHrNXfrançais suisserOUtyvrPXtouvarQUfr_CArRXfrançais canadienrSUkarTX géorgienrUUdoirVXdogrirWUkgrXXkongorYUkkrZXkazakhr[Ukjr\Xkuanyamar]Ukir^Xkikuyur_Ukor`XcoréenraUknrbXkannadarcUkmrdXkhmerreUklrfX groenlandaisrgUksrhX kâshmîrîriUkrrjXkanourirkUkwrlXcorniquermUkvrnXkomiroUkurpXkurderqUkyrrXkirghizersUtklrtXtokelauruUbuarvXbouriaterwUmgarxXmoyen irlandaisryUhitrzXhittiter{Udyur|Xdioular}Uder~XallemandrUdarXdanoisrUdzrXdzongkharUluirXluisenorUdvrX maldivienrUhilrX hiligaynonrUhimrX himachalirUgemrXlangue germaniquerUcrprXcréole ou pidginrUqurXlangue quechuarUbasrXbassarUgbarXgbayarUbadrXbandarUbanrXbalinaisrUbalrX baloutchirUshnrXshanrUbairXlangue bamilékéerUarprXarapahorUartrXlangue artificiellerUarwrXarawakrUarcrXaraméenrUen_USrXanglais américainrUsemrXlangue sémitiquerUselrXselkouperUnubrXlangue nubiennerUbtkrXbatakrUlusrXlushairUmusrXcreekrUluarX luba-luluarUirorXlangue iroquoiennerUirarXlangue iraniennerUmunrX langue moundarUlunrXlundarUluorXluorUwarXwallonrUtuprX langue tupirUjvrXjavanaisrUzblrXsymboles BlissrUtutrXlangue altaïquerUtumrXtumbukarUjarXjaponaisrUcoprXcopterUilorXilokanorUlarXlatinrUgwirX gwichʼinrUundrX indéterminérUtlirXtlingitrUtlhrXklingonrUchrXchamorrorUcorXcorserUcarXcatalanrUcerX tchétchènerUponrXpohnpeirUcyrXgalloisrUsahrXiakouterUcsrXtchèquerUcrrXcreerUbntrXbantourUcvrX tchouvacherUcurXslavon d’égliserUlvrXlettonrUdumrXmoyen néerlandaisrUptrX portugaisrUduarXdoualarUfrorXancien françaisrUyaprXyapoisrUfrmrXmoyen françaisrUtivrXtivrUfrsrXfrison orientalrUfrrrXfrison du Nordr Uyaor Xyaor Upar Xpendjabir UxalrXkalmoukrUes_ESrXespagnol ibériquerUpirXpalirUen_GBrXanglais britanniquerUgayrXgayorUotorXlangue otomanguerUotarX turc ottomanrUhmnrXhmongrUmyvrXerzyarUgaar Xgar!Ufurr"Xfrioulanr#Ukhir$Xlangue khoïsanr%Uainr&Xaïnour'Urarr(X rarotongienr)Uslar*X langue slaver+Uver,Xvendar-Uvir.X vietnamienr/Uisr0X islandaisr1Ukhor2X khotanaisr3Uiur4X inuktitutr5Uitr6Xitalienr7Uvor8Xvolapukr9Uiir:X yi de Sichuanr;Uikr<Xinupiaqr=Uior>Xidor?Uiner@Xlangue indo-européennerAUiarBX interlinguarCUjprrDX judéo-persanrEUierFX interlinguerGUidrHX indonésienrIUigrJXigborKUpaprLX papiamentorMUeworNXéwondorOUpaurPXpalaurQUpaarRX langue papouerSUpagrTX pangasinanrUUsatrVXsantalrWUpalrXXpahlavirYUpamrZX pampanganr[Usycr\Xsyriaque classiquer]Uphir^Xlangue philippiner_Ucelr`Xlangue celtiqueraUphnrbX phénicienrcUnicrdXlangue nigéro-congolaisereUniarfXniasrgUdgrrhXdogribriUsyrrjXsyriaquerkUniurlXniuérmUgswrnX alémaniqueroUcchrpXatsamrqUjborrXlojbanrsUnahrtXnahuatlruUsamrvXaraméen samaritainrwUhairxXhaidaryUgmhrzXmoyen haut-allemandr{Ucusr|Xlangue couchitiquer}Uwenr~X langue soraberUadyrX adyghéenrUelxrXélamiterUadarXadangmerUpt_PTrXportugais ibériquerUhawrXhawaïenrUbinrXbinirUbikrXbikolrUpt_BRrXportugais brésilienrUmosrXmorérUmohrXmohawkrUtlrXtagalogrUzh_HansrXchinois simplifiérUzh_HantrXchinois traditionnelrUtvlrXtuvalurUijorXijorUkmbrX kiMboundourUpeorX persan ancienrUumbrXumbundurUtmhrXtamacheqrUfonrXfonrUhsbrX haut-soraberUberX biélorusserUbgrXbulgarerUbarXbachkirrUpsrXpachtorUbmrXbambararUbnrXbengalirUborX tibétainrUbhrXbiharirUbirXbichelamar ; bislamarUbrrXbretonrUbsrX bosniaquerUruprXvalaquerUzzarXzazakirUomrXoromorUojrXojibwarUacerXacehrUachrXacolirUocrXoccitanrUkrurXkurukhrUsrrrXsérèrerUkrorXkrourUkrlrX carélienrUkrcrXkaratchaï balkarrUndsrX bas-allemandrUosrXossèterUorrXoriyarUsogrXsogdienrUnsorX sotho du NordrUsonrXsonghairUde_CHrXallemand suisserUvairXvaïrUwakrXlangues wakashennesrUlolrXmongorUmkhrXlangue mon-khmèrerUawarXawadhirUlozrXlozirUgilrX gilbertaisrUwasrXwashorUwarrXwarayrUhzrXhérérorUhyrX arménienrUanrX aragonaisrUsidrXsidamorUhrrXcroaterUhtrXhaïtienrUhurXhongroisrUhirXhindirUhorX hiri motur Uhar Xhaoussar Ubugr Xbugir UherXhébreurUuzrXouzbekrUurrXourdourUplrXpolonaisrUukrX ukrainienrUugrXouïgourrUaarXafarrUabrXabkhazerUaerX avestiquerUafr X afrikaansr!Uakr"Xakanr#Uamr$X amhariquer%Unl_BEr&Xnéerlandais belger'Ueur(Xbasquer)Uasr*Xassamaisr+Uarr,Xaraber-Uinhr.Xingoucher/Utpir0X tok pisinr1Umynr2X langue mayar3Uayr4Xaymarar5Ukhar6Xkhasir7Uazr8Xazérir9Uincr:Xlangue indo-aryenner;Unlr<X néerlandaisr=Unnr>Xnorvégien nynorskr?Unor@X norvégienrAUnarBXnauruanrCUnbrDXnorvégien bokmålrEUnairFXlangue amérindienne du NordrGUndrHXndébélé du NordrIUnerJX népalaisrKUngrLXndongarMUnyrNXnyanjarOUnaprPX napolitainrQUgrbrRXgreborSUgrcrTX grec ancienrUUnrrVXndébélé du SudrWUtigrXXtigrérYUnvrZXnavahor[Uzunr\Xzunir]Urwr^Xrwandar_Ucper`Xcréole ou pidgin anglaisraUcpfrbXcréole ou pidgin françaisrcUcpprdXcréole ou pidgin portugaisreuU territoriesrf}rg(UBDrhX BangladeshriUBErjXBelgiquerkUBFrlX Burkina FasormUBGrnXBulgarieroUVErpX VenezuelarqUBArrXBosnie-HerzégovinersUBBrtXBarbaderuUWFrvXWallis-et-FutunarwUBLrxXSaint-BarthélémyryUBMrzXBermudesr{UBNr|XBrunéi Darussalamr}UBOr~XBolivierUBHrXBahreïnrUBIrXBurundirUBJrXBéninrUBTrXBhoutanrU011rXAfrique occidentalerUBVrX Île BouvetrUBWrXBotswanarU014rXAfrique orientalerU015rXAfrique septentrionalerUBRrXBrésilrU017rXAfrique centralerU018rXAfrique australerU019rX AmériquesrUBYrXBélarusrUBZrXBelizerULVrXLettonierURWrXRwandarURSrXSerbierUTLrXTimor orientalrURErXRéunionrUTMrX TurkménistanrUOMrXOmanrUTJrX TadjikistanrUROrXRoumanierUTKrXTokelaurUGWrXGuinée-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX,Géorgie du Sud et les îles Sandwich du SudrUGRrXGrècerUGQrXGuinée équatorialerUGPrX GuadelouperUJPrXJaponrUKIrXKiribatirUGYrXGuyanarUGGrX GuerneseyrUGFrXGuyane françaiserUGErXGéorgierUGDrXGrenaderU021rXAmérique septentrionalerUGBrX Royaume-UnirUGArXGabonrUSVrX El SalvadorrUGNrXGuinéerUGMrXGambierUGLrX GroenlandrU029rX CaraïbesrUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunisierUJMrX JamaïquerU013rXAmérique centralerUWSrXSamoarU419rXAmérique latine et CaraïbesrUHRrXCroatierUBSrXBahamasrUHTrXHaïtirUHUrXHongrierUHKrXR.A.S. chinoise de Hong KongrU039rXEurope méridionalerUHNrXHondurasrUFIrXFinlanderU142rXAsierU030rXAsie orientalerU034rX Asie du SudrU035rXAsie du Sud-EstrUPRrX Porto RicorUPSrXTerritoire palestinienr U830r XÎles Anglo-normandesr UFKr XÎles Malouinesr UIOrX)Territoire britannique de l'océan IndienrUPWrXPalaosrUPTrXPortugalrUSJrXSvalbard et Île Jan MayenrUMDrXMoldavierUFMrX États fédérés de MicronésierUIQrXIrakrUPArXPanamarUPFrXPolynésie françaiserUPGr XPapouasie-Nouvelle-Guinéer!UPEr"XPérour#UPKr$XPakistanr%UPHr&X Philippinesr'UFOr(X Îles Féroér)UPNr*XPitcairnr+UPLr,XPologner-UPMr.XSaint-Pierre-et-Miquelonr/UZMr0XZambier1UEHr2XSahara occidentalr3URUr4XRussier5UEEr6XEstonier7UEGr8XÉgypter9UZAr:XAfrique du Sudr;UECr<X Équateurr=UITr>XItalier?UVNr@X Viêt NamrAUZZrBXrégion indéterminéerCUSBrDX Îles SalomonrEUETrFX ÉthiopierGUSOrHXSomalierIUZWrJXZimbabwerKUSArLXArabie saouditerMUESrNXEspagnerOUERrPX ÉrythréerQUMErRX MonténégrorSUAQrTX AntarctiquerUUMGrVX MadagascarrWUMFrXX Saint-MartinrYUMArZXMarocr[UMCr\XMonacor]UUZr^X Ouzbékistanr_UMMr`XMyanmarraUMLrbXMalircUMOrdXR.A.S. chinoise de MacaoreUMNrfXMongoliergUHMrhXÎles Heard et MacDonaldriUASrjXSamoa américainesrkUMKrlX MacédoinermUMUrnXMauriceroUMTrpXMalterqUMWrrXMalawirsUMVrtXMaldivesruUMQrvX MartiniquerwUMPrxXÎles Mariannes du NordryUMSrzX Montserratr{UMRr|X Mauritanier}UIMr~X Île de ManrUUGrXOugandarUTZrXTanzanierUMYrXMalaisierUMXrXMexiquerUILrXIsraëlrUFRrXFrancerUAWrXArubarUDOrXRépublique dominicainerUSHrXSainte-HélènerUVCrXSaint-Vincent-et-les GrenadinesrU054rX MélanésierUDJrXDjiboutirUFJrXFidjirU057rXrégion micronésiennerU172rX$Communauté des États indépendantsrU053rXAustralie et Nouvelle-ZélanderUNIrX NicaraguarUNLrXPays-BasrUNOrXNorvègerUNArXNamibierUVUrXVanuaturUNCrXNouvelle-CalédonierUNErXNigerrUNFrX Île NorfolkrUNGrXNigériarUNZrXNouvelle-ZélanderUNPrXNépalrUNRrXNaururUNUrXNiuerU061rX PolynésierUCIrXCôte d’IvoirerUCHrXSuisserUCOrXColombierUCNrXChinerUCMrXCamerounrUCLrXChilirUCCrXÎles des Cocos (Keeling)rUCArXCanadarUCGrXCongorUCFrXRépublique centrafricainerUCDrX"République démocratique du CongorUCZrXRépublique tchèquerUCYrXChyprerUCXrXÎle ChristmasrUCSrXSerbie-et-MonténégrorUCRrX Costa RicarUPYrXParaguayrUCVrXCap-VertrUCUrXCubarUSZrX SwazilandrUSYrXSyrierUKGrX KirghizistanrUKErXKenyarUSRrXSurinamerU143rX Asie centralerUKHrXCambodgerUKNrXSaint-Kitts-et-NevisrUKMrXComoresrUSTrXSao Tomé-et-PrinciperUSKrX SlovaquierUKRrX Corée du SudrUSIrX SlovénierUKPrXCorée du NordrUKWrXKoweïtrUSNrX SénégalrUSMrX Saint-MarinrUSLrX Sierra LeonerUSCrX SeychellesrUKZrX Kazakhstanr UKYr XÎles Caïmansr USGr X Singapourr USErXSuèderUSDrXSoudanrU151rXEurope orientalerU150rXEuroperUDMrX DominiquerU155rXEurope occidentalerU154rXEurope septentrionalerUVGrXÎles Vierges britanniquesrUDErX AllemagnerUYEr XYémenr!UMHr"XÎles Marshallr#U062r$XAsie centrale et du Sudr%UDZr&XAlgérier'UUSr(X États-Unisr)UUYr*XUruguayr+UYTr,XMayotter-UUMr.X*Îles Mineures Éloignées des États-Unisr/ULBr0XLibanr1ULCr2X Sainte-Lucier3ULAr4XLaosr5UTVr6XTuvalur7UTWr8XTaïwanr9UTTr:XTrinité-et-Tobagor;UTRr<XTurquier=ULKr>X Sri Lankar?ULIr@X LiechtensteinrAUCKrBX Îles CookrCUTOrDXTongarEULTrFXLituanierGULUrHX LuxembourgrIULRrJXLibériarKULSrLXLesothorMUTHrNX ThaïlanderOUTFrPXTerres australes françaisesrQUTGrRXTogorSUTDrTXTchadrUUTCrVXÎles Turks et CaïquesrWULYrXXLibyerYUVArZXÉtat de la Cité du Vaticanr[U145r\XAsie occidentaler]UAEr^XÉmirats arabes unisr_UADr`XAndorreraUAGrbXAntigua-et-BarbudarcUAFrdX AfghanistanreUAIrfXAnguillargUVIrhXÎles Vierges des États-UnisriUISrjXIslanderkUIRrlXIranrmUAMrnXArménieroUALrpXAlbanierqUAOrrXAngolarsUANrtXAntilles néerlandaisesruU003rvXAmérique du NordrwU002rxXAfriqueryU001rzXMonder{UARr|X Argentiner}UAUr~X AustralierUATrXAutricherU005rXAmérique du SudrUINrXInderUAXrX Îles ÅlandrU009rXOcéanierUAZrX AzerbaïdjanrUIErXIrlanderUIDrX IndonésierUJOrXJordanierUQUrXUnion européennerUUArXUkrainerUQArXQatarrUDKrXDanemarkrUMZrX MozambiquerUQOrX$régions éloignées de l’OcéanieruUdecimal_formatsr}rNh2)r}r(h5Nh7Kh8KKrh:h;h;rh=KKrh?X #,##0.###rhAh;hBrhDNhEKKrubsU date_formatsr}r(Umediumrh[)r}r(h?X d MMM yyyyrh_X%(d)s %(MMM)s %(yyyy)srubUfullrh[)r}r(h?XEEEE d MMMM yyyyrh_X %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrh[)r}r(h?X d MMMM yyyyrh_X%(d)s %(MMMM)s %(yyyy)srubUshortrh[)r}r(h?Xdd/MM/yyrh_X%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}r(UCOPrXPsCorUMKDrXMDenrUNADrXN$rUKMFrXFCrUEGPrX£EgrUBEFrXFBrUBGNrXNBrUFJDrX$FrUETBrXBrrUCRCrXCrUTRLrXTLrUBZDrX$BzrUGNFrXGFrUGBPrX£UKrUBOBrXBsrUBAMrXKMrUCADrX$CarUUSDrX$USrULBPrX£LBrUCYPrX£CrUCHFrXsFr.rUBMDrX$BmrULSLrXMrUGIPrX£GirUAMDrXdramrUXCDrX$ECrUKYDrX$KYrULYDrXLDrUUGXrXU ShrUNZDrX$NZrUJMDrX$JMrUGELrXlarirUKGSrXsomrUAFNrXAfrUAUDrX$ArUADPrX₧ArUESPrX₧r UZWDr XZ$r UBBDr X$Bdsr UBYRrXRblrUALLrXlekrUKRWrX₩krrUANGrXf.NArUVEBrXBerUMTLrXLmrUDJFrXDFrUFKPrX£FkrUCLPrX$ChrUITLr X₤ITr!UKPWr"X₩kpr#UCDFr$XFrCDr%UARSr&XArg$r'UUYUr(XUr$r)ULRDr*X$LRr+UKZTr,XTr-UXPFr.XFCFPr/UMXNr0X$Mexr1UJPYr2X¥JPr3USYPr4X£SYr5UFRFr6XFr7UBTNr8XNur9UGYDr:XG$r;uU time_zonesr<}r=(UAtlantic/Canaryr>}r?Ucityr@XÎles CanariesrAsU Europe/LisbonrB}rCj@XLisbonnerDsUAtlantic/MadeirarE}rFj@XMadèrerGsUEurope/TallinnrH}rIj@XTallinrJsU Indian/MaherK}rLj@XMahérMsU Asia/CalcuttarN}rOj@XKolkatarPsUAmerica/Indiana/Tell_CityrQ}rRj@X Tell CityrSsUPacific/WallisrT}rUj@X MatāʻuturVsU Asia/DhakarW}rXj@XDhâkârYsUAmerica/St_LuciarZ}r[j@X Sainte-Lucier\sUAsia/Singaporer]}r^j@X Singapourr_sUAmerica/Montserratr`}raj@XBradesrbsU Europe/Tiranerc}rdj@XTiranaresUAmerica/Maceiorf}rgj@XMaceiórhsUEurope/Zaporozhyeri}rjj@X ZaporojierksU Asia/Kashgarrl}rmj@XKachgarrnsUAmerica/Detroitro}rpj@XDétroitrqsU Asia/Urumqirr}rsj@XÜrümqirtsUAmerica/Grenadaru}rvj@XGrenaderwsUAmerica/El_Salvadorrx}ryj@XSalvadorrzsU Asia/Dubair{}r|j@XDubaïr}sU Asia/Kuwaitr~}rj@XKoweïtrsUAmerica/Mazatlanr}rj@X MazatlánrsUAsia/Ulaanbaatarr}rj@X Oulan-BatorrsUEurope/Guernseyr}rj@XSaint-Pierre-PortrsUIndian/Maldivesr}rj@XMalérsU Pacific/Fijir}rj@XFidjirsUAmerica/Miquelonr}rj@X Saint-PierrersU America/Arubar}rj@X OranjestadrsUAmerica/Caymanr}rj@XCaïmansrsUAustralia/Adelaider}rj@X AdélaïdersU Europe/Athensr}rj@XAthènesrsUAmerica/Reginar}rj@XRéginarsU Pacific/Trukr}rj@XWenorsUAmerica/Curacaor}rj@XCuraçaorsUIndian/Kerguelenr}rj@XPort-aux-FrançaisrsUAmerica/Mexico_Cityr}rj@XMexicorsUAmerica/Puerto_Ricor}rj@X Porto RicorsUIndian/Mauritiusr}rj@XMaurice (Île)rsU Asia/Manilar}rj@XManillersU Africa/Lomer}rj@XLomérsU America/Jujuyr}rj@XSan Salvador de JujuyrsUAmerica/Cordobar}rj@XCórdobarsU Asia/Tbilisir}rj@XTbilissirsU America/Belemr}rj@XBelémrsU Asia/Karachir}rj@XKarâchirsUAfrica/Sao_Tomer}rj@X São TomérsUEurope/San_Marinor}rj@X Saint-MarinrsUAmerica/Argentina/San_Juanr}rj@XSan Juan, ArgentinersUPacific/Kosraer}rj@XTofolrsUAmerica/North_Dakota/New_Salemr}rj@XNew Salem, Dakota du NordrsU Europe/Warsawr}rj@XVarsoviersUAsia/Krasnoyarskr}rj@X KrasnoïarskrsU Europe/Jerseyr}rj@X Saint-HélierrsUAsia/Yekaterinburgr}rj@X EkaterinbourgrsUEurope/Andorrar}rj@XAndorrersUAtlantic/Bermudar}rj@XBermudesrsUAmerica/Araguainar}rj@X AraguaínarsU Asia/Tehranr}rj@X TéhéranrsU Asia/Saigonr}rj@XHô-Chi-Minh-VillersU Asia/Bakur}rj@XBakoursU America/Thuler}rj@XThulérsUAmerica/St_Johnsr}rj@XSaint-Jean de Terre-NeuversUIndian/Reunionr}rj@XRéunion (Île de la)rsUAtlantic/Stanleyr}rj@X Port StanleyrsUAmerica/St_Thomasr}rj@X Saint-ThomasrsUAmerica/Jamaicar}rj@X JamaïquersUAtlantic/Cape_Verder}r j@XCap Vertr sUAsia/Hong_Kongr }r j@X Hong-Kongr sU Asia/Macaur}rj@XMacaorsU Indian/Cocosr}rj@X West IslandrsUAsia/Choibalsanr}rj@X TchoïbalsanrsUAmerica/Guadelouper}rj@X Basse-TerrersUEurope/Copenhagenr}rj@X CopenhaguersUAntarctica/Syowar}rj@XShowarsUAntarctica/McMurdor }r!j@X Mac Murdor"sUAmerica/Eiruneper#}r$j@X Eirunepér%sU Asia/Baghdadr&}r'j@XBagdadr(sUAmerica/Manausr)}r*j@XManaosr+sUAmerica/Noronhar,}r-j@XFernando de Noronhar.sU Asia/Kabulr/}r0j@XKaboulr1sU Asia/Sakhalinr2}r3j@X Sakhaliner4sUAmerica/St_Vincentr5}r6j@X Saint-Vincentr7sUPacific/Gambierr8}r9j@XRikitear:sUAtlantic/Reykjavikr;}r<j@X Reykjavíkr=sU Asia/Nicosiar>}r?j@XNicosier@sUEurope/UzhgorodrA}rBj@XOujgorodrCsUPacific/PonaperD}rEj@XPalikirrFsU Asia/AqtaurG}rHj@XAktaourIsUAmerica/GuyanarJ}rKj@XGuyanerLsUAmerica/Sao_PaulorM}rNj@X São PaulorOsUAmerica/BelizerP}rQj@XBelmopanrRsUAmerica/Port_of_SpainrS}rTj@XPort-d’EspagnerUsUPacific/TongatapurV}rWj@X NukuʻalofarXsUPacific/PitcairnrY}rZj@XPitcairn (Île)r[sU Asia/Tashkentr\}r]j@XTachkentr^sUAmerica/Meridar_}r`j@XMéridarasUPacific/Easterrb}rcj@XÎle de PâquesrdsUAtlantic/South_Georgiare}rfj@XGéorgie du SudrgsUAfrica/El_Aaiunrh}rij@X LaâyounerjsUPacific/Noumeark}rlj@XNouméarmsU Asia/Oralrn}roj@XOuralskrpsUEurope/Isle_of_Manrq}rrj@XDouglasrssU Asia/Irkutskrt}ruj@XIrkoutskrvsUEurope/Bucharestrw}rxj@XBucarestrysU Europe/Maltarz}r{j@XMalter|sUAmerica/Argentina/Ushuaiar}}r~j@XUshuaïarsUPacific/Galapagosr}rj@X GalápagosrsU Pacific/Niuer}rj@XAlofirsU Asia/Bishkekr}rj@XBichkekrsU Asia/Ashgabatr}rj@XAchgabatrsU Asia/Aqtober}rj@X AktioubinskrsUAsia/Kamchatkar}rj@X KamtchatkarsU Asia/Yerevanr}rj@XErevanrsU Pacific/Naurur}rj@XYarenrsUAfrica/Mogadishur}rj@X MogadisciorsU Africa/Cairor}rj@XLe CairersUAmerica/Cuiabar}rj@XCuiabársU Europe/Moscowr}rj@XMoscoursUPacific/Guadalcanalr}rj@XHoniararsUIndian/Christmasr}rj@XFlying Fish CoversUAfrica/Addis_Ababar}rj@X Addis-AbebarsUAmerica/Cancunr}rj@XCancúnrsU Pacific/Efater}rj@XEfatérsUAmerica/Havanar}rj@X La HavanersUEurope/Brusselsr}rj@X BruxellesrsU Pacific/Guamr}rj@X HagåtñarsU Asia/Makassarr}rj@XMacassarrsUAsia/Qyzylordar}rj@X Kzyl OrdarsUAmerica/Argentina/Tucumanr}rj@XTucumánrsUAtlantic/Azoresr}rj@XAçoresrsUAsia/Jerusalemr}rj@X JérusalemrsUAmerica/St_Kittsr}rj@X Saint-KittsrsUAmerica/Godthabr}rj@XGodthåbrsU Asia/Beirutr}rj@XBeyrouthrsUAfrica/Algiersr}rj@XAlgerrsUAmerica/Panamar}rj@XPanamá (Panamá)rsU Pacific/Palaur}rj@XMelekeokrsUAsia/Samarkandr}rj@X SamarcandersU Asia/Bahrainr}rj@XBahreïnrsUAtlantic/Faeroer}rj@XFéroérsUAmerica/Costa_Ricar}rj@X San JosérsU Indian/Chagosr}rj@X Diego GarciarsU Asia/Riyadhr}rj@XRiyadrsUIndian/Mayotter}rj@X MamoudzoursU Europe/Londonr}rj@XLondresrsUAmerica/Anguillar}rj@X The ValleyrsU Asia/Damascusr}rj@XDamasrsU Asia/Qatarr}rj@XDoharsUAmerica/North_Dakota/Centerr}rj@XCentral North Dakotar sU Asia/Bruneir }r j@XBandar Seri Begawanr sUAmerica/Tortolar }r j@X Road Townr sU Asia/Dushanber }r j@X Douchanbér sUAmerica/Indiana/Vevayr }r j@XVevayr sU Asia/Katmandur }r j@X Katmandour sUAtlantic/St_Helenar }r j@XSainte-Hélèner sUAmerica/Barbadosr }r j@X Barbade (La)r sUAmerica/Martiniquer }r j@XFort-de-Francer sUEurope/Vaticanr }r j@XCité du Vaticanr sUAntarctica/DumontDUrviller }r j@XDumont d’Urviller sUAmerica/Antiguar }r j@XSaint John’sr! sUAmerica/Indiana/Vincennesr" }r# j@X Vincennesr$ sU Asia/Almatyr% }r& j@XAlma Atar' sUAmerica/Santo_Domingor( }r) j@XSaint Dominguer* sUAsia/Novosibirskr+ }r, j@X Novossibirskr- sUAmerica/Indiana/Winamacr. }r/ j@XWinamacr0 sUAmerica/Grand_Turkr1 }r2 j@X Cockburn Townr3 sUPacific/Marquesasr4 }r5 j@X Marquisesr6 sUAmerica/Asuncionr7 }r8 j@X Asunciónr9 sU Europe/Viennar: }r; j@XVienner< sU Asia/Seoulr= }r> j@XSéoulr? sUPacific/Norfolkr@ }rA j@XKingstonrB sUAmerica/DominicarC }rD j@X DominiquerE sU Asia/ThimphurF }rG j@XThimphourH sU Asia/YakutskrI }rJ j@XIakoutskrK sUAmerica/MontrealrL }rM j@X MontréalrN sU Etc/UnknownrO }rP j@X zone inconnuerQ sU Indian/ComororR }rS j@XComores (Archipel)rT sUAmerica/AnchoragerU }rV j@XAlaskarW sUPacific/TarawarX }rY j@X Tarawa-SudrZ sU Africa/Asmerar[ }r\ j@XAsmarar] sUAntarctica/South_Poler^ }r_ j@X Pôle Sudr` suUscriptsra }rb (UZsymrc Xsymbolesrd UGurure X gourmoukhîrf UHebrrg Xhébreurh UZzzzri X écriture inconnue ou non validerj UPhnxrk X phénicienrl UMoonrm Xmoonrn USamrro X samaritainrp UChamrq Xchamrr UArabrs Xarabert UGujrru X goudjarâtîrv UZxxxrw X non écritrx ULyciry Xlycienrz USinhr{ X singhalaisr| UTalur} Xnouveau taï-luer~ UMongr Xmongolr UXpeor Xcunéiforme persépolitainr UVispr Xparole visibler URjngr Xrejangr UOlckr X ol tchikir UTaler Xtaï-ler UMandr Xmandéenr UManir X manichéenr UMlymr X malayâlamr UTibtr X tibétainr UKalir Xkayah lir UJpanr Xjaponaisr UPlrdr Xphonétique de Pollardr UKanar Xkatakanar ULydir Xlydienr ULepcr Xlepchar USundr X sundanaisr UYiiir Xyir UJavar Xjavanaisr UOryar Xoriyâr ULaoor Xlaor UUgarr X ougaritiquer UCyrlr X cyrilliquer UVaiir Xvaïr UArmnr X arménienr UCyrsr Xcyrillique (variante slavonne)r UKhmrr Xkhmerr UArmir Xaraméen impérialr USylor Xsylotî nâgrîr UItalr Xancien italiquer USgnwr Xécriture des signesr UXsuxr Xcunéiforme suméro-akkadienr UThaar Xthânar UThair Xthaïr UCprtr Xsyllabaire chyprioter ULinbr X linéaire Br ULinar X linéaire Ar UOsmar Xosmanaisr USaurr X saurashtrar UHirar Xhiraganar UHanir Xidéogrammes hanr UEgydr Xdémotique égyptienr UQaair Xhéritér UEgyhr Xhiératique égyptienr UCansr X&syllabaire autochtone canadien unifiér UEgypr Xhiéroglyphes égyptiensr UZmthr Xnotation mathématiquer UTfngr Xtifinaghr UShawr Xshavienr UCirtr Xcirthr UGeorr X géorgienr UTengr Xtengwarr UHrktr Xkatakana ou hiraganar UGeokr Xgéorgien khoutsourir UTavtr X taï viêtr UOgamr Xogamr UDsrtr X déséretr UGothr Xgotiquer UHanor X hanounóor UBalir Xbalinaisr UKorer Xcoréenr UHangr Xhangûlr UCarir Xcarienr UAvstr X avestiquer UTagbr X tagbanouar UHansr Xidéogrammes han simplifiésr UHantr Xidéogrammes han traditionnelsr URoror X rongorongor UDevar X dévanâgarîr UIndsr Xindusr UBopor Xbopomofor UMymrr Xbirmanr UTglgr Xtagalr UPermr Xancien permienr UBugir Xbouguisr UPhagr Xphags par UBrair Xbrailler UBrahr Xbrâhmîr UBatkr Xbatakr UMeror X méroïtiquer ULimbr Xlimbour UMteir! X meitei mayekr" UPhlir# Xpehlevi des inscriptionsr$ UTelur% X télougour& UTamlr' Xtamoulr( USarar) Xsaratir* UPhlpr+ Xpehlevi des psautiersr, ULatgr- Xlatin (variante gaélique)r. ULatfr/ Xlatin (variante brisée)r0 UKharr1 X kharochthîr2 UNkoor3 Xn’kor4 UPhlvr5 Xpehlevi des livresr6 ULatnr7 Xlatinr8 UMayar9 Xhiéroglyphes mayasr: ULanar; Xlannar< UEthir= X éthiopiquer> UKthir? Xkaithîr@ UHmngrA X pahawh hmongrB UBuhdrC XbouhiderD UCoptrE XcopterF UPrtirG Xparthe des inscriptionsrH UGlagrI X glagolitiquerJ URunrrK XruniquerL UOrkhrM XorkhonrN UCakmrO XchakmarP UHungrQ Xancien hongroisrR UGrekrS XgrecrT UCherrU X tchérokîrV UZyyyrW XcommunrX USyrcrY XsyriaquerZ UBlisr[ Xsymboles Blissr\ UBengr] X bengâglîr^ USyrer_ Xsyriaque estranghélor` USyrjra Xsyriaque occidentalrb USyrnrc Xsyriaque orientalrd UKndare Xkannararf uUvariantsrg }rh (UMONOTONri X monotoniquerj UBOONTrk Xdialecte boontlingrl USCOUSErm Xdialecte scousern UAREVELAro Xarménien orientalrp USOLBArq Xdialecte de Stolvizza / Solbicarr ULIPAWrs Xdialecte lipovaz de Resiart U1901ru X$orthographe allemande traditionnellerv UBAKU1926rw X alphabet latin altaïque unifiérx UOSOJSry Xdialecte d’Oseacco / Osojanerz U1694ACADr{ Xfrançois académique de 1694r| UVALENCIAr} X valencienr~ UPOLYTONr X polytoniquer UNJIVAr Xdialecte de Gniva / Njivar UFONIPAr X"alphabet phonétique internationalr UTARASKr Xorthographe taraskievicar U1606NICTr Xfrançoys de 1606r USAAHOr X dialecte sahor UPOSIXr X informatiquer UFONUPAr Xalphabet phonétique ouraliquer UNEDISr Xdialecte de Natisoner UAREVMDAr Xarménien occidentalr U1994r X orthographe normalisée de Resiar U1996r Xorthographe allemande de 1996r UREVISEDr Xorthographe réviséer USCOTLANDr Xanglais standard écossaisr UBISKEr Xdialecte de San Giorgio / Bilar UROZAJr Xdialecte de Resiar uUnumber_symbolsr }r (Ugroupr X r UnativeZeroDigitr X0r U exponentialr XEr UperMiller X‰r Unanr XNaNr Udecimalr X,r U percentSignr X%r Ulistr X;r U patternDigitr X#r UplusSignr X+r Uinfinityr X∞r U minusSignr hBuUcurrency_namesr }r (UXXXr Xdevise inconnue ou non valider UDZDr Xdinar algérienr ULVRr X rouble lettonr UGHSr Xcédi ghanéenr UBOPr X peso bolivienr jXlivre égyptienner UBGLr Xlev bulgare (1962–1999)r jXnouveau lev bulgarer jXdollar des Caraïbes orientalesr UPABr Xbalboa panaméenr UYUMr Xdinar yougoslave Noviyr j Xdollar zimbabwéenr UGHCr Xcédir UXBDr X"unité de compte européenne (XBD)r jX bolivianor UXBAr Xunité européenne composéer UDKKr Xcouronne danoiser UXBCr X"unité de compte européenne (XBC)r UXBBr Xunité monétaire européenner UBWPr Xpula botswanaisr jXlivre libanaiser UTZSr Xshilling tanzanienr UVNDr Xdông vietnamienr jXdollar namibienr UAOAr Xkwanza angolaisr UWSTr X tala samoanr UAONr X#nouveau kwanza angolais (1990-2000)r UKHRr Xriel cambodgienr UMYRr Xringgit malaisr UAOKr Xkwanza angolais (1977-1990)r USOSr Xshilling somalienr jXdollar des îles Caïmanesr jX dinar lybienr UUAHr Xhryvnia ukrainienner UUAKr X karbovanetzr jXshilling ougandaisr UJODr Xdinar jordanienr UAORr X&kwanza angolais réajusté (1995-1999)r USURr Xrouble soviétiquer UAWGr Xflorin arubaisr USARr X rial saoudienr UFIMr Xmark finlandaisr UHKDr Xdollar de Hong Kongr USRGr Xflorin surinamaisr UTPEr Xescudo timoraisr UMGFr Xfranc malgacher UCHEr Xeuro WIRr jX franc suisser jXlivre de Gibraltarr jXrouble biélorusser jX lek albanaisr UXPDr X palladiumr UUGSr Xshilling ougandais (1966-1987)r UMROr Xouguiya mauritanienr UBOVr Xmvdol bolivienr UHRKr X kuna croater jXfranc djiboutienr UHRDr X dinar croater UPESr X sol péruvienr UEQEr! Xekwélér" j Xlire italienner# UXAFr$ Xfranc CFA (BEAC)r% UBNDr& Xdollar brunéienr' UISKr( Xcouronne islandaiser) UZALr* Xrand sud-africain (financier)r+ USRDr, Xdollar surinamaisr- UNIOr. Xcórdoba oro nicaraguayenr/ ULAKr0 X kip loatienr1 UNICr2 Xcordobar3 UNPRr4 Xroupie népalaiser5 UMZEr6 Xescudo mozambicainr7 j(Xpeso uruguayenr8 ULUCr9 X franc convertible luxembourgeoisr: jXdollar jamaïcainr; j6Xfranc françaisr< UMAFr= Xfranc marocainr> UUYIr? X"peso uruguayen (unités indexées)r@ UMZMrA XméticalrB UMZNrC Xmetical mozambicainrD UPHPrE Xpeso philippinrF UZARrG Xrand sud-africainrH URHDrI Xdollar rhodésienrJ UGWPrK Xpeso bissau-guinéenrL ULUFrM Xfranc luxembourgeoisrN UBELrO Xfranc belge (financier)rP UBECrQ Xfranc belge (convertible)rR UNGNrS Xnaira nigérianrT UYUNrU Xdinar yougoslave convertiblerV jX franc belgerW UPLZrX Xzloty (1950-1995)rY jXcolón costaricainrZ jX livre turquer[ UDEMr\ X mark allemandr] UEEKr^ Xcouronne estonienner_ UMWKr` Xkwacha malawitera UTTDrb Xdollar trinidadienrc ULKRrd Xroupie srilankaisere USKKrf Xcouronne slovaquerg UCVErh Xescudo capverdienri UPKRrj Xroupie pakistanaiserk UHUFrl Xforint hongroisrm UROLrn Xancien leu roumainro UXEUrp X"unité de compte européenne (ECU)rq jXdollar bermudienrr UOMRrs X rial omanirt jX loti lesothanru ULSMrv Xmalotirw UMNTrx X tugrik mongolry jXdram arménienrz UYUDr{ Xnouveau dinar yougoslaver| UBUKr} X kyat birmanr~ j4Xlivre syrienner UQARr X rial qatarir UXDRr Xdroit de tirage spécialr UNLGr Xflorin néerlandaisr UGEKr XGeorgian Kupon Laritr UMTPr Xlivre maltaiser jXlivre sterlingr jXlari géorgienr USHPr Xlivre de Sainte-Hélèner jXafghanir USBDr Xdollar des îles Salomonr UCSKr Xcouronne forte tchécoslovaquer j"Xwon nord-coréenr UXREr Xtype de fonds RINETr UCSDr Xdinar serbo-monténégrinr UAFAr Xafghani (1927–2002)r UTHBr Xbaht thaïlandaisr UBYBr X&nouveau rouble biélorusse (1994-1999)r UBDTr Xtaka bangladeshir UGRDr Xdrachme grecquer UYERr Xrial yéméniter UDDMr Xmark est-allemandr USZLr Xlilangeni swazir UHTGr Xgourde haïtienner UTRYr Xnouvelle livre turquer UMGAr Xariary malgacher jXflorin antillaisr j*Xdollar libérienr URWFr Xfranc rwandaisr UNOKr Xcouronne norvégienner UMXVr X$unité de conversion mexicaine (UDI)r UKESr Xshilling kényanr UMOPr Xpataca macanaiser UINRr Xroupie indienner j0X peso mexicainr UCZKr Xcouronne tchèquer UTJSr X somoni tadjikr UTJRr X rouble tadjikr j8Xngultrum bouthanaisr UYDDr Xdinar du Yémenr UGWEr Xescudo de Guinée portugaiser jXpeso colombienr UCOUr X$Unité de valeur réelle colombienner jX lire maltaiser UMURr Xroupie mauricienner UIDRr Xroupie indonésienner UHNLr Xlempira hondurienr j.X franc CFPr jXdollar fidjienr jXbirr éthiopienr UPENr Xnouveau sol péruvienr jXdollar bélizéenr UCHWr X franc WIRr UATSr Xschilling autrichienr UILPr Xlivre israélienner UZRNr Xnouveau zaïre zaïrienr UDOPr Xpeso dominicainr ULULr Xfranc financier luxembourgeoisr UTMMr Xmanat turkmèner UTWDr Xnouveau dollar taïwanaisr UMDLr X leu moldaver UXPTr Xplatiner UECVr X-unité de valeur constante équatoriale (UVC)r UECSr Xsucre équatorienr UBSDr Xdollar bahaméenr USEKr Xcouronne suédoiser UTOPr Xpa’anga tonganr UPEIr Xinti péruvienr UZMKr Xkwacha zambienr UMVRr Xrufiyaa maldivienner UXTSr X(devise de test)r jXdollar australienr jXpeseta andorraner UCUPr X peso cubainr UIEPr Xlivre irlandaiser UCLFr X#unité d’investissement chilienner j Xdollar barbadienr jXfranc comorienr jXwon sud-coréenr UGMDr Xdalasi gambienr UVEFr Xbolivar fuerte vénézuélienr UGTQr Xquetzal guatémaltèquer jXbolivarr UXOFr Xfranc CFA (BCEAO)r USITr Xtolar slovèner USDPr Xlivre soudanaise (1956–2007)r jX peso chilienr UEURr Xeuror j$Xfranc congolaisr UALKr Xlek albanais (1947–1961)r j,X tenge kazakhr URUBr X rouble russer UXFUr X franc UICr UXAGr! Xargentr" UBRRr# Xcruzeiror$ UBRNr% Xnouveau cruzador& UBRLr' Xréal brésilienr( UMMKr) Xkyat myanmaraisr* UUYPr+ Xpeso uruguayen (1975–1993)r, URURr- Xrouble russe (1991–1998)r. UPLNr/ Xzloty polonaisr0 UBREr1 X!cruzeiro brésilien (1990–1993)r2 UPYGr3 Xguaraní paraguayenr4 UBRCr5 X cruzado brésilien (1986–1989)r6 UBRBr7 X)nouveau cruzeiro brésilien (1967–1986)r8 USVCr9 Xcolón salvadorienr: UAEDr; Xdirham des Émirats arabes unisr< UGNSr= X syli guinéenr> jXdenar macédonienr? UAZMr@ Xmanat azéri (1993-2006)rA UAZNrB X manat azérirC UUSNrD X$dollar des Etats-Unis (jour suivant)rE UGQErF Xekwélé équatoguinéenrG UVUVrH Xvatu vanuatuanrI UBADrJ Xdinar bosniaquerK jXfranc guinéenrL UMXPrM X&peso d’argent mexicain (1861–1992)rN UIQDrO X dinar irakienrP UERNrQ Xnafka érythréenrR jXmark convertible bosniaquerS USCRrT Xroupie des SeychellesrU jXdollar canadienrV USDDrW Xdinar soudanaisrX jXlivre chyprioterY UMADrZ Xdirham marocainr[ UKWDr\ Xdinar koweïtienr] UBIFr^ Xfranc burundaisr_ ULTTr` Xtalonas lituanienra UPGKrb Xkina papouan-néo-guinéenrc ULTLrd Xlitas lituanienre USGDrf Xdollar de Singapourrg UUZSrh X sum ouzbekri USTDrj Xdobra santoméenrk UXFOrl Xfranc orrm UMLFrn X franc malienro jXpeseta espagnolerp UIRRrq X rial iranienrr UZRZrs Xzaïre zaïroisrt UCNYru Xyuan renminbi chinoisrv USLLrw Xleone sierra-léonaisrx UTNDry Xdinar tunisienrz j:Xdollar du Guyanar{ UESBr| X%peseta espagnole (compte convertible)r} UESAr~ Xpeseta espagnole (compte A)r jXdollar néo-zélandaisr jXlivre des Falklandr ULVLr X lats lettonr UUSSr X"dollar des Etats-Unis (jour même)r jXdollar des États-Unisr UARPr Xpeso argentin (1983-1985)r jX som kirghizer j&X peso argentinr UILSr Xnouveau shekel israélienr URONr X leu roumainr URSDr X dinar serber UBHDr Xdinar bahreïnir j2X yen japonaisr UARAr Xaustral argentinr USDGr Xlivre soudanaiser UPTEr Xescudo portugaisr UXAUr Xorr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXJr Kj7KjKXAr KjKj Kj Kj K XSr K XOr K XNr K XDr usUformatr }r (Uwider }r (KXjanvierr KXfévrierr KXmarsr KXavrilr KXmair KXjuinr KXjuilletr KXaoûtr K X septembrer K Xoctobrer K Xnovembrer K X décembrer uU abbreviatedr }r (KXjanv.r KXfévr.r KXmarsr KXavr.r KXmair KXjuinr KXjuil.r KXaoûtr K Xsept.r K Xoct.r K Xnov.r K Xdéc.r uuuUcurrency_formatsr }r Nh2)r }r (h5Nh7Kh8KKr h:X ¤r j r h=KKr h?X #,##0.00 ¤r hAh;hBr hDNhEKKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KXLr KjKjKj KXVr Kj Kj usUformatr }r (Uwider }r (KXlundir KXmardir KXmercredir KXjeudir KXvendredir KXsamedir KXdimancher uU abbreviatedr }r (KXlun.r KXmar.r KXmer.r KXjeu.r KXven.r KXsam.r KXdim.r uuuU meta_zonesr }r (U Goose_Bayr }r (Ushortr }r (Ugenericr XHGOBr Udaylightr XHAGOBr Ustandardr XHNGOBr uUcommonr Ulongr }r (j Xheure de Goose Bayr j Xheure avancée de Goose Bayr j Xheure normale de Goose Bayr uuU Kuybyshevr }r (j }r (j XHKUYr j XHAKUYr j XHNKUYr uj j }r (j Xheure de Kouïbychevr j XHeure avancée de Kouïbychevr j Xheure normale de Kouïbychevr uuURotherar }r j sUArabianr }r (j }r (j XHAr j XHAAr j XHNAr uj j }r (j Xheure de l’Arabier j Xheure avancée de l’Arabier j Xheure normale de l’Arabier uuUAustralia_Easternr }r (j }r (j XHE (AU)r j XHAE (AU)r j XHNE (AU)r uj j }r (j Xheure de l’Est australienr j X$heure avancée de l’Est australienr j X#heure normale de l’Est australienr uuU Argentinar }r (j }r! (j XHE (AR)r" j XHAE (AR)r# j XHNE (AR)r$ uj j }r% (j Xheure de l’Est argentinr& j X"heure avancée de l’Est argentinr' j X!heure normale de l’Est argentinr( uuUBoliviar) }r* (j }r+ (j XHBOr, j XHABOr- j XHNBOr. uj j }r/ (j Xheure de Bolivier0 j Xheure avancée de Bolivier1 j Xheure normale de Bolivier2 uuU Turkmenistanr3 }r4 j sU Alaska_Hawaiir5 }r6 (j }r7 (j XHAHr8 j XHAAHr9 j XHNAHr: uj j }r; (j XHeure d’Alaska - Hawaiir< j X"heure avancée d’Alaska - Hawaiir= j X!heure normale d’Alaska - Hawaiir> uuU Cape_Verder? }r@ (j }rA (j XHCVrB j XHACVrC j XHNCVrD uj j }rE (j Xheure du Cap-VertrF j Xheure avancée du Cap-VertrG j Xheure normale du Cap-VertrH uuUAzoresrI }rJ (j }rK (j XHAC (PT)rL j X HAAC (PT)rM j X HNAC (PT)rN uj j }rO (j Xheure des AçoresrP j Xheure avancée des AçoresrQ j Xheure normale des AçoresrR uuUPierre_MiquelonrS }rT j sUEurope_CentralrU }rV (j }rW (j XHECrX j XHAECrY j XHNECrZ uj j }r[ (j Xheure d’Europe centraler\ j X%Heure avancée de l’Europe centraler] j X!heure normale d’Europe centraler^ uuUTrukr_ }r` j sU Aktyubinskra }rb (j }rc (j XHAQBrd j XHAAQBre j XHNAQBrf uj j }rg (j Xheure d’Aqtöberh j Xheure avancée d’Aqtöberi j Xheure normale d’Aqtöberj uuUBeringrk }rl (j }rm (j XHBERrn j XHABERro j XHNBERrp uj j }rq (j Xheure de Beringrr j Xheure avancée de Beringrs j Xheure normale de Beringrt uuU Qyzylordaru }rv j sUKazakhstan_Easternrw }rx (j }ry (j XHE (KZ)rz j XHAE (KZ)r{ j XHNE (KZ)r| uj j }r} (j Xheure de l’Est kazakhr~ j X heure avancée de l’Est kazakhr j Xheure normale de l’Est kazakhr uuUFrunzer }r (j }r (j XHFRUr j XHAFRUr j XFNFRUr uj j }r (j Xheure de Frounzér j Xheure avancée de Frounzér j Xheure normale de Frounzér uuU Dutch_Guianar }r (j }r (j XHGNEr j XHAGNEr j XHAGNEr uj j }r (j Xheure de Guyane néerlandaiser j X&heure avancée de Guyane néerlandaiser j X%heure normale de Guyane néerlandaiser uuUYerevanr }r j sU Kamchatkar }r (j }r (j XHPETr j XHAPETr j XHNPETr uj j }r (j X!heure de Petropavlovsk-Kamchatskir j X*heure avancée de Petropavlovsk-Kamchatskir j X)heure normale de Petropavlovsk-Kamchatskir uuULiberiar }r j sUKashgarr }r (j }r (j XHKACr j XHAKACr j XHNKACr uj j }r (j Xheure de Kachgarr j Xheure avancée de Kachgarr j Xheure normale de Kachgarr uuUMaldivesr }r j sUNorfolkr }r j sU Dominicanr }r (j }r (j XHDOr j XHADOr j XHNDOr uj j }r (j X heure de République dominicainer j X)heure avancée de République dominicainer j X(heure normale de République dominicainer uuUAfrica_Easternr }r (j }r (j XHAFEr j XHAAFEr j XHNAFEr uj j }r (j Xheure d’Afrique de l’Estr j X%heure avancée d’Afrique de l’Estr j X#Heure normale d’Afrique orientaler uuU Ashkhabadr }r (j }r (j XHACHr j XHAACHr j XHNACHr uj j }r (j Xheure d’Achgabatr j Xheure avancée d’Achgabatr j Xheure normale d’Achgabatr uuUAlaskar }r (j }r (j XHAKr j XHAAKr j XHNAKr uj j }r (j Xheure de l’Alaskar j Xheure avancée de l’Alaskar j Xheure normale de l’Alaskar uuUAmerica_Easternr }r (j }r (j XHEr j XHAEr j XHNEr uj j }r (j Xheure de l’Estr j Xheure avancée de l’Estr j Xheure normale de l’Estr uuU Yekaterinburgr }r j sUSolomonr }r j sU Krasnoyarskr }r (j }r (j XHKRAr j XHAKRAr j XHNKRAr uj j }r (j Xheure de Krasnoïarskr j Xheure avancée de Krasnoïarskr j Xheure normale de Krasnoïarskr uuUAmerica_Centralr }r (j }r (j XHCr j XHACr j XHNCr uj j }r (j Xheure du Centrer j Xheure avancée du Centrer j Xheure normale du Centrer uuUMawsonr }r j sUPakistanr }r j sUChathamr }r(j }r(j X HCHA (NZ)rj X HACHA (NZ)rj X HNCHA (NZ)ruj j }r(j Xheure des îles Chathamrj X heure avancée des îles Chathamrj Xheure normale des îles ChathamruuUSamoar }r j sUMacaur }r j sUChamorror }r(j }r(j XHChrj XHAChrj XHNChruj j }r(j Xheure des Chamorrorj Xheure avancée des Chamorrorj Xheure normale des ChamorroruuUGuamr}r(j }r(j XHGUrj XHAGUrj XHNGUruj j }r(j X heure de Guamrj Xheure avancée de Guamrj Xheure normale de Guamr uuUIndiar!}r"(j }r#(j XHI (IN)r$j XHAI (IN)r%j XHNI (IN)r&uj j }r'(j Xheure de l’Inder(j Xheure avancée de l’Inder)j Xheure normale de l’Inder*uuU Azerbaijanr+}r,(j }r-(j XHAZr.j XHAAZr/j XHNAZr0uj j }r1(j Xheure d’Azerbaïdjanr2j Xheure avancée d’Azerbaïdjanr3j Xheure normale d’Azerbaïdjanr4uuU Marquesasr5}r6j sU Tajikistanr7}r8j sUPitcairnr9}r:j sUTurkeyr;}r<(j }r=j XHNTRr>sj j }r?j XHeure normale de Turquier@suU AfghanistanrA}rB(j }rC(j XHAFrDj XHAAFrEj XHNAFrFuj j }rG(j Xheure d’AfghanistanrHj Xheure avancée d’AfghanistanrIj Xheure normale d’AfghanistanrJuuU ChoibalsanrK}rLj sU VladivostokrM}rNj sU ShevchenkorO}rPj sU BangladeshrQ}rR(j }rS(j XHBDrTj XHABDrUj XHNBDrVuj j }rW(j Xheure du BangladeshrXj Xheure avancée du BangladeshrYj Xheure normale du BangladeshrZuuUGulfr[}r\(j }r](j XHGr^j XHAGr_j XHNGr`uj j }ra(j Xheure du Golferbj Xheure avancée du Golfercj Xheure normale du GolferduuUDaccare}rf(j }rg(j XHDACrhj XHADACrij XHNDACrjuj j }rk(j Xheure de Dhâkârlj Xheure avancée de Dhâkârmj Xheure normale de DhâkârnuuUMongoliaro}rpj sU Samarkandrq}rrj sUWakers}rtj sUPeruru}rvj sUVanuaturw}rxj sUIndonesia_Centralry}rz(j }r{(j XHC (ID)r|j XHAC (ID)r}j XHNC (ID)r~uj j }r(j Xheure du Centre indonésienrj X$heure avancée du Centre indonésienrj X#heure normale du Centre indonésienruuUNaurur}rj sUFalklandr}r(j }r(j XHFKrj XHAFKrj XHNFKruj j }r(j Xheure des îles Malouinesrj X"heure avancée des îles Malouinesrj X!heure normale des îles MalouinesruuUKorear}r(j }r(j XHKRrj XHAKRrj XHNKRruj j }r(j Xheure de Coréerj Xheure avancée de Coréerj Xheure normale de CoréeruuUCubar}r(j }r(j XHCUrj XHACUrj XHNCUruj j }r(j X heure de Cubarj Xheure avancée de Cubarj Xheure normale de CubaruuUIrkutskr}r(j }r(j XHIRKrj XHAIRKrj XHNIRKruj j }r(j Xheure d’Irkoutskrj Xheure avancée d’Irkoutskrj Xheure normale d’IrkoutskruuUArgentina_Westernr}r(j }r(j XHO (AR)rj XHAO (AR)rj XHNO (AR)ruj j }r(j Xheure de l’Ouest argentinrj X$heure avancée de l’Ouest argentinrj X#heure normale de l’Ouest argentinruuUAmazonr}r(j }r(j XHAMArj XHAAMArj XHNAMAruj j }r(j Xheure de l’Amazonierj Xheure avancée de l’Amazonierj Xheure normale de l’AmazonieruuUChinar}r(j }r(j XHC (CN)rj XHAC (CN)rj XHNC (CN)ruj j }r(j Xheure de Chinerj Xheure avancée de Chinerj Xheure normale de ChineruuULong_Shur}rj sUArmeniar}r(j }r(j XHAMrj XHAAMrj XHNAMruj j }r(j Xheure d’Arménierj Xheure avancée d’Arménierj Xheure normale d’ArménieruuUCookr}r(j }r(j XHCKrj XHACKrj XHNCKruj j }r(j Xheure des îles Cookrj Xheure avancée des îles Cookrj Xheure normale des îles CookruuUAfrica_FarWesternr}r(j }r(j XHAFOSrj XHAAFOSrj XHNAFOSruj j }r(j X(heure d’Afrique de l’Ouest sahélienrj X1heure avancée d’Afrique de l’Ouest sahélienrj X0heure normale d’Afrique de l’Ouest sahélienruuUGreenland_Westernr}r(j }r(j XHO (GL)rj XHAO (GL)rj XHNO (GL)ruj j }r(j Xheure de l’Ouest du Groenlandrj X(heure avancée de l’Ouest du Groenlandrj X'heure normale de l’Ouest du GroenlandruuUKarachir}r(j }r(j XHKARrj XHAKARrj XHNKARruj j }r(j Xheure de Karâchirj Xheure avancée de Karâchirj Xheure normale de KarâchiruuUTongar}rj sUSakhalinr}rj sUBrasiliar}r(j }r(j XHBRrj XHABRrj XHNBRruj j }r (j Xheure de Brasiliar j Xheure avancée de Brasiliar j Xheure normale de Brasiliar uuUSyowar }rj sU French_Guianar}r(j }r(j XHGFrj XHAGFrj XHNGFruj j }r(j Xheure de Guyane françaiserj X#heure avancée de Guyane françaiserj X"heure normale de Guyane françaiseruuUFrench_Southernr}r(j }r(j XHTFrj XHATFrj XHNTFruj j }r(j X&heure des Terres australes françaisesr j X/heure avancée des Terres australes françaisesr!j X.heure normale des Terres australes françaisesr"uuU Mauritiusr#}r$j sUAfrica_Southernr%}r&(j }r'(j XHAFMr(j XHAAFMr)j XHNAFMr*uj j }r+(j XHeure d’Afrique méridionaler,j X'heure avancée d’Afrique méridionaler-j X&Heure normale d’Afrique méridionaler.uuUGambierr/}r0(j }r1(j XHGAMr2j XHAGAMr3j XHNGAMr4uj j }r5(j Xheure des îles Gambierr6j X heure avancée des îles Gambierr7j Xheure normale des îles Gambierr8uuUDavisr9}r:(j }r;(j XHDAVr<j XHADAVr=j XHNDAVr>uj j }r?(j Xheure de Davisr@j Xheure avancée de DavisrAj Xheure normale de DavisrBuuU NewfoundlandrC}rD(j }rE(j XHTrFj XHATrGj XHNTrHuj j }rI(j XHeure de Terre-NeuverJj XHeure avancée de Terre-NeuverKj XHeure normale de Terre-NeuverLuuUCocosrM}rN(j }rO(j XHCCrPj XHACCrQj XHNCCrRuj j }rS(j Xheure des îles Cocos - KeelingrTj X(heure avancée des îles Cocos - KeelingrUj X'heure normale des îles Cocos - KeelingrVuuU KyrgystanrW}rXj sUTokelaurY}rZj sUAustralia_Westernr[}r\(j }r](j XHO (AU)r^j XHAO (AU)r_j XHNO (AU)r`uj j }ra(j Xheure de l’Ouest australienrbj X&heure avancée de l’Ouest australienrcj X%heure normale de l’Ouest australienrduuUBakure}rf(j }rg(j XHBAKrhj XHABAKrij XHNBAKrjuj j }rk(j Xheure de Bakourlj Xheure avancée de Bakourmj Xheure normale de BakournuuUAfrica_Centralro}rp(j }rq(j XHAFCrrj XHAAFCrsj XHNAFCrtuj j }ru(j Xheure d’Afrique centralervj X#heure avancée d’Afrique centralerwj X"Heure normale d’Afrique centralerxuuU Line_Islandsry}rzj sU Novosibirskr{}r|j sUJapanr}}r~(j }r(j XHJrj XHAJrj XHNJruj j }r(j Xheure du Japonrj Xheure avancée du Japonrj Xheure normale du JaponruuU Sverdlovskr}rj sU New_Caledoniar}rj sU Kwajaleinr}r(j }r(j XHKWArj XHAKWArj XHNKWAruj j }r(j Xheure de Kwajaleinrj Xheure avancée de Kwajaleinrj Xheure normale de KwajaleinruuUAqtober}r(j }r(j XHAQBrj XHAAQBrj XHNAQBruj j }r(j Xheure d’Aqtöberj Xheure avancé d’Aqtöberj Xheure normale d’AqtöberuuUGilbert_Islandsr}r(j }r(j XHGILrj XHAGILrj XHNGILruj j }r(j Xheure des îles Gilbertrj X heure avancée des îles Gilbertrj Xheure normale des îles GilbertruuUAustralia_CentralWesternr}r(j }r(j XHCO (AU)rj X HACO (AU)rj X HNCO (AU)ruj j }r(j Xheure Centre Ouest australienrj X)heure avancée du Centre Ouest australienrj X%heure normale Centre Ouest australienruuU Indochinar}r(j }r(j XHIDCrj XHAIDCrj XHNIDCruj j }r(j Xheure d’Indochinerj Xheure avancée d’Indochinerj Xheure normale d’IndochineruuUPapua_New_Guinear}rj sUHovdr}r(j }r(j XHHOVrj XHAHOVrj XHNHOVruj j }r(j X heure de Hovdrj Xheure avancée de Hovdrj Xheure normale de HovdruuU South_Georgiar}r(j }rj XHNGrsj j }rj X heure normale de Géorgie du SudrsuUEcuadorr}r(j }r(j XHEQrj XHAEQrj XHNEQruj j }r(j Xheure d’Équateurrj Xheure avancée d’Équateurrj Xheure normale d’ÉquateurruuUMalayar}rj sUBruneir}r(j }r(j XHBNrj XHABNrj XHNBNruj j }r(j Xheure du Brunéirj Xheure avancée du Brunéirj Xheure normale du BrunéiruuUIranr}r(j }r(j XHIRrj XHAIRrj XHNIRruj j }r(j Xheure d’Iranrj Xheure avancée d’Iranrj Xheure normale d’IranruuUAqtaur}r(j }r(j XHAQTrj XHAAQTrj XHNAQTruj j }r(j Xheure d’Aktaourj Xheure avancée d’Aktaourj Xheure normale d’AktaouruuU Indian_Oceanr}r(j }r(j XHIOrj XHAIOrj XHNIOruj j }r(j X4heure du Territoire britannique de l’océan Indienrj X=heure avancée du Territoire britannique de l’océan Indienrj X<heure normale du Territoire britannique de l’océan IndienruuUTuvalur}rj sUAmerica_Mountainr}r(j }r(j XHRrj XHARr j XHNRr uj j }r (j Xheure des Rocheusesr j Xheure avancée des Rocheusesr j Xheure normale des RocheusesruuUHawaii_Aleutianr}r(j }r(j XHHrj XHAHrj XHNHruj j }r(j X heure d’Hawaii - Aléoutiennesrj X)heure avancée d’Hawaii - Aléoutiennesrj X(heure normale d’Hawaii - AléoutiennesruuUChangbair}r(j }r(j X HCHA (CN)rj X HACHA (CN)rj X HNCHA (CN)ruj j }r(j Xheure du Changbair j Xheure avancée du Changbair!j Xheure normale du Changbair"uuUChiler#}r$(j }r%(j XHCLr&j XHACLr'j XHNCLr(uj j }r)(j Xheure du Chilir*j Xheure avancée du Chilir+j Xheure normale du Chilir,uuUWallisr-}r.j sUKosraer/}r0(j }r1(j XHKOSr2j XHAKOSr3j XHNKOSr4uj j }r5(j Xheure de Kosraer6j Xheure avancée de Kosraer7j Xheure normale de Kosraer8uuUDushanber9}r:(j }r;(j XHDUCr<j XHADUCr=j XHNDUCr>uj j }r?(j Xheure de Duchanbér@j Xheure avancée de DuchanbérAj Xheure normale de DuchanbérBuuUGeorgiarC}rD(j }rE(j XHGErFj XHAGErGj XHNGErHuj j }rI(j Xheure de GéorgierJj Xheure avancée de GéorgierKj Xheure normale de GéorgierLuuUAnadyrrM}rN(j }rO(j XHANArPj XHAANArQj XHNANArRuj j }rS(j Xheure d’AnadyrrTj Xheure avancée d’AnadyrrUj Xheure normale d’AnadyrrVuuU PhilippinesrW}rXj sUYakutskrY}rZj sUIndonesia_Westernr[}r\(j }r](j XHO (ID)r^j XHAO (ID)r_j XHNO (ID)r`uj j }ra(j Xheure de l’Ouest indonésienrbj X'heure avancée de l’Ouest indonésienrcj X&heure normale de l’Ouest indonésienrduuUGreenland_Easternre}rf(j }rg(j XHE (GL)rhj XHAE (GL)rij XHNE (GL)rjuj j }rk(j Xheure de l’Est du Groenlandrlj X&heure avancée de l’Est du Groenlandrmj X%heure normale de l’Est du GroenlandrnuuUOralro}rpj sUGMTrq}rr(j j }rsj Xheure moyenne de GreenwichrtsuUMarshall_Islandsru}rvj sUIrishrw}rx(j }ry(j XHIErzj XHAIEr{j XHNIEr|uj j }r}(j Xheure d’Irlander~j Xheure avancée d’Irlanderj Xheure normale d’IrlanderuuU Seychellesr}rj sUUruguayr}rj sUVostokr}rj sU Uzbekistanr}rj sUColombiar}r(j }r(j XHCOrj XHACOrj XHNCOruj j }r(j Xheure de Colombierj Xheure avancée de Colombierj Xheure normale de ColombieruuUReunionr}rj sU Volgogradr}r(j }rj XHNVOrsj j }r(j XHeure avancée de Volgogradrj Xheure normale de VolgogradruuU Kizilordar}r(j }r(j XHKYZrj XHAKYZrj XHNKYZruj j }r(j Xheure de Kyzylordarj Xheure avancée de Kyzylordarj Xheure normale de KyzylordaruuUFijir}r(j }r(j XHFJrj XHAFJrj XHNFJruj j }r(j Xheure des Îles Fidjirj Xheure avancée des Îles Fidjirj Xheure normale des Îles FidjiruuUAmerica_Pacificr}r(j }r(j XHPrj XHAPrj XHNPruj j }r(j Xheure du Pacifiquerj Xheure avancée du Pacifiquerj Xheure normale du PacifiqueruuUKazakhstan_Westernr}r(j }r(j XHO (KZ)rj XHAO (KZ)rj XHNO (KZ)ruj j }r(j Xheure de l’Ouest kazakhrj X"heure avancée de l’Ouest kazakhrj X!heure normale de l’Ouest kazakhruuUPalaur}rj sUEurope_Easternr}r(j }r(j XHEErj XHAEErj XHNEEruj j }r(j Xheure d’Europe de l’Estrj X'Heure avancée de l’Europe de l’Estrj Xheure d’Europe de l’EstruuUBhutanr}r(j }r(j XHBTrj XHABTrj XHNBTruj j }r(j Xheure du Bhoutanrj Xheure avancée du Bhoutanrj Xheure normale du BhoutanruuUBorneor}r(j }r(j XHBORrj XHABORrj XHNBORruj j }r(j Xheure de Bornéorj Xheure avancée de Bornéorj Xheure normale de BornéoruuUNepalr}rj sU Galapagosr}r(j }r(j XHGALrj XHAGALrj XHNGALruj j }r(j Xheure des îles Galápagosrj X#heure avancée des îles Galápagosrj X"heure normale des îles GalápagosruuU Lord_Hower}rj sUPhoenix_Islandsr}rj sUSurinamer}rj sUAcrer}r(j }r(j XHACRrj XHAACRrj XHNACRruj j }r(j Xheure de l’Acrerj Xheure avancée de l’Acrerj Xheure normale de l’AcreruuUEasterr}r(j }r(j XHPAQrj XHAPAQrj XHNPAQruj j }r(j Xheure de l’île de Pâquesrj X%heure avancée de l’île de Pâquesrj X$heure normale de l’île de Pâquesr uuU Christmasr }r (j }r (j XHCXr j XHACXrj XHNCXruj j }r(j Xheure de l’île Christmasrj X$heure avancée de l’île Christmasrj X#heure normale de l’île ChristmasruuU East_Timorr}r(j }r(j XHTLrj XHATLrj XHNTLruj j }r(j Xheure du Timor orientalrj X heure avancée du Timor orientalrj Xheure normale du Timor orientalruuUIsraelr}r(j }r (j XHI (IL)r!j XHAI (IL)r"j XHNI (IL)r#uj j }r$(j Xheure d’Israëlr%j Xheure avancée d’Israëlr&j Xheure normale d’Israëlr'uuUAfrica_Westernr(}r)(j }r*(j XHAFOr+j XHAAFOr,j XHNAFOr-uj j }r.(j Xheure d’Afrique de l’Ouestr/j X&Heure avancée d’Afrique occidentaler0j X%Heure normale d’Afrique occidentaler1uuUTashkentr2}r3j sUMalaysiar4}r5j sUNoronhar6}r7j sU Venezuelar8}r9j sUPonaper:}r;j sUIndonesia_Easternr<}r=(j }r>(j XHE (ID)r?j XHAE (ID)r@j XHNE (ID)rAuj j }rB(j Xheure de l’Est indonésienrCj X%heure avancée de l’Est indonésienrDj X$heure normale de l’Est indonésienrEuuUOmskrF}rGj sUAustralia_CentralrH}rI(j }rJ(j XHC (AU)rKj XHAC (AU)rLj XHNC (AU)rMuj j }rN(j Xheure du Centre australienrOj X#heure avancée du Centre australienrPj X"heure normale du Centre australienrQuuUAtlanticrR}rS(j }rT(j XHArUj XHAArVj XHNArWuj j }rX(j Xheure de l’AtlantiquerYj X heure avancée de l’AtlantiquerZj Xheure normale de l’Atlantiquer[uuU North_Marianar\}r]j sULankar^}r_j sUDumontDUrviller`}ra(j }rb(j XHDDUrcj XHADDUrdj XHNDDUreuj j }rf(j Xheure de Dumont-d’Urvillergj X$heure avancée de Dumont-d’Urvillerhj X#heure normale de Dumont-d’UrvilleriuuUEurope_Westernrj}rk(j }rl(j XHEOrmj XHAEOrnj XHNEOrouj j }rp(j Xheure d’Europe de l’Ouestrqj X&heure avancée d’Europe de l’Ouestrrj X%heure normale d’Europe de l’OuestrsuuU New_Zealandrt}ruj sUBritishrv}rw(j }rx(j XHGBryj XHAGBrzj XHNGBr{uj j }r|(j Xheure du Royaume-Unir}j Xheure avancée du Royaume-Unir~j Xheure normale du Royaume-UniruuUUrumqir}rj sU Hong_Kongr}r(j }r(j XHHKrj XHAHKrj XHNHKruj j }r(j Xheure de Hong Kongrj Xheure avancée de Hong Kongrj Xheure normale de Hong KongruuUGuyanar}r(j }r(j XHGYrj XHAGYrj XHNGYruj j }r(j Xheure du Guyanarj Xheure avancée du Guyanarj Xheure normale du GuyanaruuUMagadanr}rj sUAlmatyr}r(j }r(j XHALMrj XHAALMrj XHNALMruj j }r(j Xheure d’Alma Atarj Xheure avancée d’Alma Atarj Xheure normale d’Alma AtaruuUTbilisir}rj sUMyanmarr}rj sU Singaporer}rj sUSamarar}r(j }rj XHNSArsj j }r(j XHeure avancée de Samararj Xheure normale de SamararuuUGreenland_Centralr}r(j }r(j XHC (GL)rj XHAC (GL)rj XHNC (GL)ruj j }r(j Xheure du Centre du Groenlandrj X%heure avancée du Centre du Groenlandrj X$heure normale du Centre du GroenlandruuUUralskr}rj sUTahitir}rj sUParaguayr}rj sUYukonr}r(j }r(j XHYrj XHAYrj XHNYruj j }r(j Xheure du Yukonrj Xheure avancée du Yukonrj Xheure normale du YukonruuUMoscowr}r(j }r(j XHAMOrj XHNMOruj j }r(j XHeure normale de Moscourj XHeure avancée de Moscourj XHeure normale de MoscouruuUNiuer}rj suUerasr}r(Uwider}r(KXavant Jésus-ChristrKXaprès Jésus-ChristruU abbreviatedr}r(KX av. J.-C.rKX ap. J.-C.ruuu.PK[DGD D &site-packages/babel/localedata/kaj.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXA.M.qUpmqXP.M.quUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUNGNqgXA̱nairaqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KXHywan A̱yrnigqKX Hywan A̱hwaqKX Hywan A̱tatqKX Hywan A̱naaiqKXHywan A̱pfwonqKXHywan A̱kitatqKXHywan A̱tyirinqKXHywan A̱ninaiqK XHywan A̱kumviriyinqK X Hywan SwakqK XHywan Swak B'a̱yrnigqK XHywan Swak B'a̱hwaquU abbreviatedq}q(KXA̱yrqKXA̱hwqKXA̱taqKXA̱naqKXA̱pfqKXA̱kiqKXA̱tyqKXA̱niqK XA̱kuqK XSwaqK XSbyqK XSbhquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KXLintaniqKXTalataqKXLarbaqKXLamitqKXJumaqKXAsabarqKXLadiquU abbreviatedq}q(KXLinqKXTalqKXLarqKXLamqKXJumqKXAsaqKXLadquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXGabanin MiladiqKXMiladiquU abbreviatedq}q(KXG.M.qKXM.quuu.PK[t(site-packages/babel/localedata/en_BZ.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vqhX%(HH)s:%(mm)s:%(ss)s %(v)squbUlongqh)q}q (hX HH:mm:ss zq!hX%(HH)s:%(mm)s:%(ss)s %(z)sq"ubUshortq#h)q$}q%(hXHH:mmq&hX %(HH)s:%(mm)sq'ubuU languagesq(}q)U territoriesq*}q+Udecimal_formatsq,}q-U date_formatsq.}q/(Umediumq0h)q1}q2(hX dd-MMM-yyyyq3hX%(dd)s-%(MMM)s-%(yyyy)sq4ubUfullq5h)q6}q7(hX dd MMMM yyyyq8hX%(dd)s %(MMMM)s %(yyyy)sq9ubUlongq:h)q;}q<(hX dd MMMM yyyyq=hX%(dd)s %(MMMM)s %(yyyy)sq>ubUshortq?h)q@}qA(hXdd/MM/yyqBhX%(dd)s/%(MM)s/%(yy)sqCubuUcurrency_symbolsqD}qE(UBZDqFX$qGUUSDqHXUS$qIuU time_zonesqJ}qKUscriptsqL}qMUvariantsqN}qOUnumber_symbolsqP}qQUcurrency_namesqR}qSUmonthsqT}qUUcurrency_formatsqV}qWNcbabel.numbers NumberPattern qX)qY}qZ(Uexp_precq[NUscaleq\KU frac_precq]KKq^Usuffixq_Xq`h`qaUint_precqbKKqchX ¤#,##0.00qdUprefixqeX¤qfX-¤qgqhUexp_plusqiNUgroupingqjKKqkubsUdaysql}qmU meta_zonesqn}qoUerasqp}qqu.PK[dq%site-packages/babel/localedata/kk.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAXгуджаратиqBUgdqCX%Солтүстік ШотландияqDUgaqEXирландшаqFUgnqGXгуараниqHUglqIXгалицияшаqJUlaqKX латынqLUlnqMXлингалаqNUloqOXлаосqPUtrqQXтүрікшеqRUlvqSX латышqTUltqUX литваqVUtkqWXтүркменqXUthqYXтайqZUtiq[Xтигриньяq\Uteq]X телугуq^Ufilq_Xпилипиноq`UtaqaX тамилqbUyiqcXидишqdUdeqeX немісqfUdaqgXдатqhUelqiXгрекqjUeoqkXэсперантоqlUenqmXағылшынqnUeuqoXбаскqpUetqqX эстонqrUesqsX испанqtUruquXорысqvUroqwX румынqxUbnqyX бенгалqzUbeq{Xбеларусq|Ubgq}X болгарq~UukqX украинqUjvqXяваqUbhqX бихариqUbrqXбритqUbsqX боснияqUjaqX жапонqUocqXокситанqUtwqXтвиqUtlhqXклингонqUorqXорияqUxhqXхосаqUcaqXкаталанqUcyqX валлийqUcsqXчехqUpsqX паштоqUptqXпортугалqUpaqXпанджабqUviqXвьетнамqUplqX полякqUhyqX армянqUhrqX хорватqUhuqX мадьярqUhiqX хиндиqUheqX ивритqUuzqX өзбекqUmlqXмалайяламqUmnqX монғолqUmkqXмакедонqUurqXурдуqUmtqX мальтаqUmsqX малайqUmrqXмаратхиqUugqX ұйғырqUafqXбурqUkoqX кәрісqUisqX исландqUamqX амхарqUitqXиталиянqUsvqXшведqUasqX ассамqUarqX арабшаqUkmqXкамбоджияqUzuqX зулусqUiaqXинтерлингваqUieqXинтерлингвеqUidqXиндонезияqUnlqXголландqUnoqX норвегqUneqX непалqUfrqXфранцузqUfyqXфрисqUfaqX парсыqUfiqXфинqUkyqX қырғызqUfoqX фарерqUkaqX грузинqUkkqX ҚазақqUsrqXсербqUsqqX албанqUswqXсуахилиqUknqXканнадаqUsuqX суданqUstqX сесотоqUskqX словакqUsiqX сингалrUshrXсербхорватrUsorX сомалиrUkurXкүрдrUslrX словенrUsar Xсанскритr Usdr X синдхиr uU territoriesr }r(UKZrXҚазақстанrUTOrX ТонгаruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X dd.MM.yyyyrh.X%(dd)s.%(MM)s.%(yyyy)srubUfullrh))r}r(h,XEEEE, d MMMM yyyy 'ж'.rh.X%%(EEEE)s, %(d)s %(MMMM)s %(yyyy)s ж.r ubUlongr!h))r"}r#(h,Xd MMMM yyyy 'ж'.r$h.X%(d)s %(MMMM)s %(yyyy)s ж.r%ubUshortr&h))r'}r((h,Xdd.MM.yyr)h.X%(dd)s.%(MM)s.%(yy)sr*ubuUcurrency_symbolsr+}r,UKZTr-Xтңг.r.sU time_zonesr/}r0Uscriptsr1}r2Uvariantsr3}r4Unumber_symbolsr5}r6(Udecimalr7X,r8Ugroupr9X r:uUcurrency_namesr;}r<UXXXr=XUnknown or Invalid Currencyr>sUmonthsr?}r@(U stand-alonerA}rBUnarrowrC}rD(KX1rEKX2rFKX3rGKX4rHKX5rIKX6rJKX7rKKX8rLK X9rMK X10rNK X11rOK X12rPusUformatrQ}rR(UwiderS}rT(KX қаңтарrUKX ақпанrVKX наурызrWKX сәуірrXKX мамырrYKX маусымrZKX шілдеr[KX тамызr\K Xқыркүйекr]K X қазанr^K X қарашаr_K Xжелтоқсанr`uU abbreviatedra}rb(KXқаң.rcKXақп.rdKXнау.reKXсәу.rfKXмам.rgKXмау.rhKXшіл.riKXтам.rjK Xқыр.rkK Xқаз.rlK Xқар.rmK X желт.rnuuuUcurrency_formatsro}rpNcbabel.numbers NumberPattern rq)rr}rs(Uexp_precrtNUscaleruKU frac_precrvKKrwUsuffixrxX ¤ryX ¤rzr{Uint_precr|KKr}h,X #,##0.00 ¤r~UprefixrXrX-rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjFKjGKjHKjIKjJKjKKjEusUformatr}r(Uwider}r(KXдуйсенбіrKXсейсенбіrKXсәренбіrKXбейсенбіrKXжұмаrKX сенбіrKXжексеніruU abbreviatedr}r(KXдс.rKXсс.rKXср.rKXбс.rKXжм.rKXсһ.rKXжс.ruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXBCErKXCErusu.PK[{==)site-packages/babel/localedata/kok_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[3ˬ4 4 %site-packages/babel/localedata/iu.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@UiuqAX%ᐃᓄᒃᑎᑐᑦ ᑎᑎᕋᐅᓯᖅqBsU territoriesqC}qDUdecimal_formatsqE}qFU date_formatsqG}qH(UmediumqIh))qJ}qK(h,X yyyy MMM dqLh.X%(yyyy)s %(MMM)s %(d)sqMubUfullqNh))qO}qP(h,XEEEE, yyyy MMMM ddqQh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqRubUlongqSh))qT}qU(h,X yyyy MMMM dqVh.X%(yyyy)s %(MMMM)s %(d)sqWubUshortqXh))qY}qZ(h,Xyy/MM/ddq[h.X%(yy)s/%(MM)s/%(dd)sq\ubuUcurrency_symbolsq]}q^U time_zonesq_}q`Uscriptsqa}qbUvariantsqc}qdUnumber_symbolsqe}qfUcurrency_namesqg}qhUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KXᔭᓐᓄᐊᓕqKXᕕᕝᕗᐊᓕqKX ᒫᑦᓯqKXᐊᐃᑉᐳᓗqKXᒪᐃqKXᔫᓂqKX ᔪᓚᐃqKXᐊᐅᒡᒍᓯqK XᓰᑦᑏᕝᕙqK XᐆᑦᑑᕝᕙqK XᓅᕙᐃᕝᕙqK X ᑏᓰᕝᕙquU abbreviatedq}q(KXᔭᓐᓄᐊᓕqKXᕕᕝᕗᐊᓕqKX ᒫᑦᓯqKXᐊᐃᑉᐳᓗqKXᒪᐃqKXᔫᓂqKX ᔪᓚᐃqKXᐊᐅᒡᒍᓯqK XᓰᑦᑏᕝᕙqK XᐆᑦᑑᕝᕙqK XᓅᕙᐃᕝᕙqK X ᑏᓰᕝᕙquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KXᓇᒡᒐᔾᔭᐅqKXᓇᒡᒐᔾᔭᐅᓕᖅᑭqKXᐱᖓᑦᓯᖅqKXᓯᑕᒻᒥᖅqKXᑕᓪᓕᕐᒥᖅqKXᓈᑦᓰᖑᔭᓕᖅᕿqKXᓈᑦᓰᖑᔭquU abbreviatedq}q(KXᓇᒡᒐᔾᔭᐅqKXᓇᒡᒐᔾᔭᐅᓕᖅᑭqKXᐱᖓᑦᓯᖅqKXᓯᑕᒻᒥᖅqKXᑕᓪᓕᕐᒥᖅqKXᓈᑦᓰᖑᔭᓕᖅᕿqKXᓈᑦᓰᖑᔭquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[Rll*site-packages/babel/localedata/pa_Guru.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[T1OO(site-packages/babel/localedata/es_SV.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}q(Udecimalq X.q Ugroupq X,q uU week_dataq }qU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll*site-packages/babel/localedata/sr_Cyrl.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[J(site-packages/babel/localedata/fr_LU.datnu[}q(Ucurrency_symbolsq}q(UFRFqXFRFqULUFqXFquUscientific_formatsq}qUpercent_formatsq }q Unumber_symbolsq }q Ugroupq X.qsU week_dataq}q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}q Udecimal_formatsq!}q"U meta_zonesq#}q$Uvariantsq%}q&Ucurrency_namesq'}q(u.PK[rc;$;$%site-packages/babel/localedata/mr.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX म.पू.qUpmqX म.नं.quUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X h:mm:ss aqAUformatqBX%(h)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X h:mm:ss a vqGhBX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X h:mm:ss a zqLhBX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xh:mm aqQhBX%(h)s:%(mm)s %(a)sqRubuU languagesqS}qT(UguqUXगुजरातीqVUgdqWX%स्काटस् गेलिकqXUgaqYX ऐरिषqZUgnq[Xगौरानीq\Uglq]Xगेलीशियनq^Ulaq_Xलाटिनq`UlnqaXलिंगालाqbUloqcXलाओतियन्qdUttqeX टटारqfUtrqgXतुर्किषqhUtsqiXत्सोगाqjUlvqkX3लाट्वियन् (लेट्टिष)qlUtoqmXतोंगाqnUltqoXलिथुआनियन्qpUtkqqXतुर्कमेनqrUthqsX थाईqtUtiquXतिग्रिन्याqvUtgqwX तजिकqxUteqyXतेलंगूqzUpt_PTq{X9पोर्तुगीज (पोर्तुगाल)q|Ufilq}Xफिलिपिनोq~UtaqX तमिळqUyiqXइद्दिषqUyoqXयूरुबाqUdeqXजर्मनqUdaqXडानिषqUdzqXभूटानीqUstqXसेसोथोqUquqXक्वेचओqUelqXग्रीकqUeoqXइस्परान्टोqUenqXइंग्रेजीqUzhqXचिनीस्qUzaqXझ्हुन्गqUukqX!युक्रेनियन्qUeuqXबास्कqUetqXइस्टोनियन्qUesqXस्पानिषqUruqXरष्यन्qUrwqX*किन्यार्वान्डाqUrmqX%रहटो-रोमान्स्qUrnqXकिरुन्दीqUroqXरोमानियन्qUbnqXबंगालीqUbeqXबैलोरुसियनqUbgqXबल्गेरियनqUbaqXबष्किरqUwoqX उलोफqUjvqXजावनीस्qUboqXतिबेटियनqUbhqXबीहारीqUbiqXबिसलमाqUbrqXब्रेटनqUbsqXबोस्नियनqUjaqXजापनीस्qUomqXओरोमो (अफान)qUrootqX शिखरqUocqXओसिटान्qUtwqX त्विqUtlhqXक्लिंगॉनqUorqXओरियाqUxhqXक्स्होसाqUcoqXकोर्सिकनqUcaqX कटलनqUcyqXवेल्षqUcsqX ज़ेकqUpsqX$पष्टो (पुष्टो)qUkokqXकोंकणीqUptqXपोर्चुगीस्qUtlqXतगालोगqUpaqXपंजाबीqUviqX!वियत्नामीज़qUplqXपोलिषqUhyqXआर्मीनियन्qUhrqX!क्रोयेषियन्qUiuqXइनुकिटुट्qUhuqXहंगेरियन्qUhiqXहिन्दीqUhaqX हौसाqUheqX हेबृqUmgqXमलागसीqUuzqXउज़बेकqUmlqXमलियालमqUmoqX!मोल्डावियन्qUmnqXमंगोलियन्qUmiqXमाओरीrUikrXइनूपियाकrUmkrXमसीडोनियन्rUurrXउर्दूrUmtrXमालतीस्rUmsr X मलयr Umrr Xमराठीr Uugr X उधूरrUmyrXबर्मीस्rUaarX अफारrUabrXअबखेजियनrUssrXसिस्वतीrUafrXअफ्रिकान्सrUtnrXसेत्स्वानाrUswrXस्वाहिलीrUisrXआईसलान्डिकrUamrXअमहारिकr Uitr!Xइटालियनr"Usvr#Xस्वीडिषr$Uiar%X$इन्टरलिंग्वाr&Uasr'Xअसामीr(Uarr)Xअरेबिकr*Usur+Xसुंदनीस्r,Uzur-X जुलूr.Uayr/X ऐमराr0Uazr1X!अज़रबाइजानीr2Uier3Xइन्टरलिंगr4Uidr5X!इन्डोनेषियनr6Uskr7Xस्लोवाकr8Unlr9Xडचr:Unor;Xनोर्वेजियनr<Unar=X नौरोr>Uner?Xनेपालीr@UvorAXओलापुकrBUfrrCXफ्रेन्चrDUsmrEX समोनrFUfyrGXफ्रिसियन्rHUfarIXपर्षियन्rJUfirKXफिन्निषrLUfjrMX फिजीrNUsarOXसंस्कृतrPUforQXफेरोस्rRUkarSXजार्जियन्rTUkkrUX कज़कrVUsrrWXसेर्बियन्rXUsqrYXआल्बेनियन्rZUkor[Xकोरियन्r\Uknr]Xकन्नडr^Ukmr_Xकंबोडियनr`UklraX$ग्रीनलान्डिकrbUksrcXकश्मीरीrdUsireXसिन्हलीस्rfUshrgX4सेर्बो-क्रोयेषियन्rhUsoriXसोमालीrjUsnrkX शोनाrlUkurmXकुर्दिषrnUslroX!स्लोवेनियन्rpUkyrqXकिर्गिज़rrUsgrsXसांग्रोrtUsdruXसिंधीrvuU territoriesrw}rx(UTOryXटांगाrzUDEr{X जमिनr|UBRr}Xब्राजीलr~UINrX भारतruUdecimal_formatsr}rNh )r}r(h#Nh$Kh%KKrh'h/h/rh*KKrh,X #,##,##0.###rh.h/h0rh2Nh3KKrubsU date_formatsr}r(Umediumrh>)r}r(h,X dd-MM-yyyyrhBX%(dd)s-%(MM)s-%(yyyy)srubUfullrh>)r}r(h,XEEEE d MMMM yyyyrhBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrh>)r}r(h,X d MMMM yyyyrhBX%(d)s %(MMMM)s %(yyyy)srubUshortrh>)r}r(h,Xd-M-yyrhBX%(d)s-%(M)s-%(yy)srubuUcurrency_symbolsr}rUINRrXरुrsU time_zonesr}rUscriptsr}rUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}rUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KXजानेवारीrKXफेब्रुवारीrKXमार्चrKXएप्रिलrKXमेrKX जूनrKX जुलैrKXओगस्टrK Xसेप्टेंबरrK Xओक्टोबरrK Xनोव्हेंबरrK XडिसेंबरruU abbreviatedr}r(KXजानेवारीrKXफेब्रुवारीrKXमार्चrKXएप्रिलrKXमेrKX जूनrKX जुलैrKXओगस्टrK Xसेप्टेंबरrK Xओक्टोबरrK Xनोव्हेंबरrK XडिसेंबरruuuUcurrency_formatsr}rNh )r}r(h#Nh$Kh%KKrh'h/h/rh*KKrh,X¤ #,##,##0.00rh.X¤ rX-¤ rrh2Nh3KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r(KXसोमवारrKXमंगळवारrKXबुधवारrKXगुरुवारrKXशुक्रवारrKXशनिवारrKXरविवारruU abbreviatedr}r(KX सोमrKX मंगळrKX बुधrKX गुरुrKXशुक्रrKX शनिrKX रविruuuU meta_zonesr}rUIndiar}r(Ucommonr Ulongr }r Ustandardr Xभारतीय समयr susUerasr}rU abbreviatedr}r(KXईसापूर्वrKXसनrusu.PK[F$(site-packages/babel/localedata/ar_OM.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[_.ll(site-packages/babel/localedata/en_US.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/tr_TR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[D))(site-packages/babel/localedata/dz_BT.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[:2??&site-packages/babel/localedata/kpe.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUmonthsqg}qh(U stand-aloneqi}qjUnarrowqk}ql(KX1qmKX2qnKX3qoKX4qpKX5qqKX6qrKX7qsKX8qtK X9quK X10qvK X11qwK X12qxusUformatqy}qz(Uwideq{}q|(KhmKhnKhoKhpKhqKhrKhsKhtK huK X10q}K X11q~K X12quU abbreviatedq}q(KhmKhnKhoKhpKhqKhrKhsKhtK huK X10qK X11qK X12quuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhnKhoKhpKhqKhrKhsKhmusUformatq}q(Uwideq}q(KhnKhoKhpKhqKhrKhsKhmuU abbreviatedq}q(KhnKhoKhpKhqKhrKhsKhmuuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[_.ll-site-packages/babel/localedata/uz_Latn_UZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[&'%site-packages/babel/localedata/ee.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXANqUpmqXEWquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qf(UXOFqgXSefaqhUGHCqiXSiɖiqjuUmonthsqk}ql(U stand-aloneqm}qnUnarrowqo}qp(KXDqqKhqKXTqrKXAqsKhqKXMqtKXSquKhqK hsK XKqvK hsK hqusUformatqw}qx(Uwideqy}qz(KXDzoveq{KXDzodzeq|KXTedoxeq}KXAfɔfiɛq~KXDamaqKXMasaqKXSiamlɔmqKX DeasiamimeqK X AnyɔnyɔqK XKeleqK X AdeɛmekpɔxeqK XDzomequU abbreviatedq}q(KXDzvqKXDzdqKXTedqKXAfɔqKXDamqKXMasqKXSiaqKXDeaqK XAnyqK XKelqK XAdeqK XDzmquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhqKXBqKhvKXYqKXFqKhtKhvusUformatq}q(Uwideq}q(KXDzoɖaqKXBraɖaqKXKuɖaqKXYawoɖaqKXFiɖaqKXMemleɖaqKXKɔsiɖaquU abbreviatedq}q(KXDzoqKXBraqKXKuɖqKXYawqKXFiɖqKXMemqKXKɔs KwequuuU meta_zonesq}qUerasq}q(Uwideq}q(KXHafi Yesu Va Do ŋgɔ na YesuqKX Yesu ŊɔliquU abbreviatedq}q(KXHYqKXYŊquuu.PK[:hG""*site-packages/babel/localedata/pa_Arab.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUformatq}qUwideq }q (KXچوتھاي پہلاںq KXچوتھاي دوجاq KXچوتھاي تيجاq KXچوتھاي چوتھاqussUperiodsq}qUscientific_formatsq}qUpercent_formatsq}qU week_dataq}q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qUpaqX پنجابq sU territoriesq!}q"UPKq#X پکستانq$sUdecimal_formatsq%}q&U date_formatsq'}q(Ucurrency_symbolsq)}q*(UPKRq+Xرq,UINRq-Xر [INR]q.uU time_zonesq/}q0Uscriptsq1}q2(UArabq3Xالعربيةq4UGuruq5Xگُرمُکھیq6uUvariantsq7}q8Unumber_symbolsq9}q:Ucurrency_namesq;}q<(h+X روپئیہq=h-Xروپئیہ [INR]q>UEURq?Xيوروq@uUmonthsqA}qBUformatqC}qDUwideqE}qF(KX جنوریqGKX فروریqHKXمارچqIKX اپریلqJKXمئqKKXجونqLKX جولائیqMKXاگستqNK X ستمبرqOK X اکتوبرqPK X نومبرqQK X دسمبرqRussUcurrency_formatsqS}qTUdaysqU}qVUformatqW}qXUwideqY}qZ(KXپیرq[KXمنگلq\KXبُدھq]KX جمعراتq^KXجمعہq_KXہفتہq`KX اتوارqaussU meta_zonesqb}qcUerasqd}qeUwideqf}qg(KXايساپوروqhKXسںqiusu.PK[14%site-packages/babel/localedata/ny.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUMWKqgXMalawian KwachaqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KXJanuwaleqKX FebuluwaleqKXMalichiqKXEpuloqKXMeiqKXJuniqKXJulaiqKXOgasitiqK X SeputembaqK XOkutobaqK XNovembaqK XDisembaquU abbreviatedq}q(KXJanqKXFebqKXMalqKXEpuqKXMeiqKXJunqKXJulqKXOgaqK XSepqK XOkuqK XNovqK XDisquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KXLolembaqKX LachiwiriqKX LachitatuqKX LachinayiqKX LachisanuqKXLowerukaqKX LamulunguquU abbreviatedq}q(KXLemqKXWirqKXTatqKXNaiqKXSanqKXWerqKXMulquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXBCqKXADquU abbreviatedq}q(KXBCqKXADquuu.PK[1ll(site-packages/babel/localedata/lt_LT.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[.P(site-packages/babel/localedata/es_PR.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q (Upatternq!X MM/dd/yyyyq"Uformatq#X%(MM)s/%(dd)s/%(yyyy)sq$ubUshortq%h)q&}q'(h!XMM/dd/yyq(h#X%(MM)s/%(dd)s/%(yy)sq)ubuUcurrency_symbolsq*}q+UUSDq,X$q-sU time_zonesq.}q/Uscriptsq0}q1Uvariantsq2}q3Unumber_symbolsq4}q5(Udecimalq6X.q7Ugroupq8X,q9uUcurrency_namesq:}q;Umonthsq<}q=Ucurrency_formatsq>}q?Udaysq@}qAU meta_zonesqB}qCUerasqD}qEu.PK["ll(site-packages/babel/localedata/ar_EG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/es_ES.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ ݳ| | %site-packages/babel/localedata/ak.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXANqUpmqXEWquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUGHCqgXSidiqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KXSanda-ƆpɛpɔnqKXKwakwar-ƆgyefuoqKX Ebɔw-ƆbenemqKXEbɔbira-OforisuoqKXEsusow Aketseaba-KɔtɔnimbaqKXObirade-AyɛwohomumuqKXAyɛwoho-KitawonsaqKXDifuu-ƆsandaaqK X Fankwa-ƐbɔqK XƆbɛsɛ-AhinimeqK XƆberɛfɛw-ObubuoqK XMumu-ƆpɛnimbaquU abbreviatedq}q(KXS-ƆqKXK-ƆqKXE-ƆqKXE-OqKXE-KqKXO-AqKXA-KqKXD-ƆqK XF-ƐqK XƆ-AqK XƆ-OqK XM-ƆquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KXDqKXBqKXWqKXYqKXFqKXMqKXKqusUformatq}q(Uwideq}q(KXDwowdaqKXBenadaqKXWukudaqKXYawdaqKXFidaqKXMemenedaqKXKwesidaquU abbreviatedq}q(KXDwoqKXBenqKXWukqKXYawqKXFiaqKXMemqKXKwequuuU meta_zonesq}qUerasq}q(Uwideq}q(KX Ansa KristoqKX Kristo EkyiriquU abbreviatedq}q(KXAKqKXKEquuu.PK[5LS-site-packages/babel/localedata/zh_Hans_SG.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU first_dayqKsU time_formatsq}q(Ushortqcbabel.dates DateTimePattern q)q}q(UpatternqXahh:mmqUformatqX%(a)s%(hh)s:%(mm)squbUlongqh)q}q(hX ahh:mm:sszqhX%(a)s%(hh)s:%(mm)s:%(ss)s%(z)squbuU languagesq}q U territoriesq!}q"Udecimal_formatsq#}q$U date_formatsq%}q&Ushortq'h)q(}q)(hXdd/MM/yyq*hX%(dd)s/%(MM)s/%(yy)sq+ubsUcurrency_symbolsq,}q-U time_zonesq.}q/Uscriptsq0}q1Uvariantsq2}q3Unumber_symbolsq4}q5Ucurrency_namesq6}q7Umonthsq8}q9Ucurrency_formatsq:}q;Udaysq<}q=U meta_zonesq>}q?Uerasq@}qAu.PK[1ll(site-packages/babel/localedata/fi_FI.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[zc(site-packages/babel/localedata/es_US.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqX h:mm:ss aqUformatqX%(h)s:%(mm)s:%(ss)s %(a)squbUfullqh)q}q(hX h:mm:ss a vq hX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq!ubUlongq"h)q#}q$(hX h:mm:ss a zq%hX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq&ubUshortq'h)q(}q)(hXh:mm aq*hX%(h)s:%(mm)s %(a)sq+ubuU languagesq,}q-U territoriesq.}q/Udecimal_formatsq0}q1U date_formatsq2}q3(Umediumq4h)q5}q6(hX MMM d, yyyyq7hX%(MMM)s %(d)s, %(yyyy)sq8ubUshortq9h)q:}q;(hXM/d/yyq}q?U time_zonesq@}qAUscriptsqB}qCUvariantsqD}qEUnumber_symbolsqF}qG(UdecimalqHX.qIUgroupqJX,qKuUcurrency_namesqL}qMUmonthsqN}qOUcurrency_formatsqP}qQUdaysqR}qSU meta_zonesqT}qUUerasqV}qWu.PK[!M%site-packages/babel/localedata/pa.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX"ਪਹਿਲਾਂ ਚੌਥਾਈq KXਦੂਜਾ ਚੌਥਾਈq KXਤੀਜਾ ਚੌਥਾਈqKXਚੌਥਾ ਚੌਥਾਈquU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXਸਵੇਰੇqUpmqX ਸ਼ਾਮquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,XHH:mm:ssqAUformatqBX%(HH)s:%(mm)s:%(ss)sqCubUfullqDh>)qE}qF(h,X HH:mm:ss vqGhBX%(HH)s:%(mm)s:%(ss)s %(v)sqHubUlongqIh>)qJ}qK(h,X HH:mm:ss zqLhBX%(HH)s:%(mm)s:%(ss)s %(z)sqMubUshortqNh>)qO}qP(h,XHH:mmqQhBX %(HH)s:%(mm)sqRubuU languagesqS}qT(UeoqUXਏਸਪਰੇਂਟੋqVUabqWXਅਬਖਾਜ਼ੀਅਨqXUafqYXਅਫ਼ਰੀਕੀqZUguq[Xਗੁਜਰਾਤੀq\Uasq]Xਅਸਾਮੀq^Uarq_X ਅਰਬੀq`UazqaXਅਜ਼ੇਰਬੈਜਨਿqbUidqcX!ਇੰਡੋਨੇਸ਼ੀਆਈqdUesqeXਸਪੇਨਿਸ਼qfUapaqgXਅਪਾਚੇ ਭਾਸ਼ਾqhUnlqiX ਡੱਚqjUptqkXਪੋਰਤੂਗੂਈਸqlUnoqmXਨਾਰਵੇਜੀਅਨqnUtwqoX ਤ੍ਵਿqpUausqqX+ਆਸਟਰੇਲੀਅਨ ਭਾਸ਼ਾqrUpaqsXਪੰਜਾਬੀqtUenquXਅੰਗਰੇਜ਼ੀqvUthqwX ਥਾਈqxUitqyXਇਤਾਲਵੀqzUteq{Xਤੇਲਗੂq|Utaq}Xਤਾਮਿਲq~UbeqXਬੇਲਾਰੂਸੀਅਨqUfrqXਫਰੈਂਚqUbnqXਬੰਗਾਲੀqUdeqX ਜਰਮਨqUdaqXਡੈਨਿਸ਼qUhiqXਹਿੰਦੀqUfiqXਫਿਨਿਸ਼qUjaqXਜਾਪਾਨੀqUbatqX"ਬੈਲਟਿਕ ਭਾਸ਼ਾqUaceqXਅਚੀਨੀqUachqXਅਕੋਲੀqUsvqXਸਵੈਡਿਸ਼qUmkqXਮੈਕੇਡੋਨੀਅਨqUundqXundqUugqXਉਇਘੁਰquU territoriesq}q(UTOqXTOqUZZqXਅਣਜਾਣqUINqX ਭਾਰਤquUdecimal_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X #,##,##0.###qh.h/h0qh2Nh3KKqubsU date_formatsq}q(Umediumqh>)q}q(h,X yyyy MMM dqhBX%(yyyy)s %(MMM)s %(d)squbUfullqh>)q}q(h,XEEEE, dd MMMM yyyyqhBX"%(EEEE)s, %(dd)s %(MMMM)s %(yyyy)squbUlongqh>)q}q(h,X yyyy MMMM dqhBX%(yyyy)s %(MMMM)s %(d)squbUshortqh>)q}q(h,X dd/MM/yyyqhBX%(dd)s/%(MM)s/%(yyy)squbuUcurrency_symbolsq}qUINRqXਰੁ.qsU time_zonesq}qUscriptsq}q(UDevaqXਦੇਵਨਾਗਰੀqUZzzzqXZzzzqUZxxxqXZxxxqUGuruqXਗੁਰਮੁਖੀquUvariantsq}qUnumber_symbolsq}qUnativeZeroDigitqX੦qsUcurrency_namesq}q(UAFNqXਅਫ਼ਗਾਨੀqUXXXqXਅਣਜਾਣqhXਰੁਪਿਯqUEURqX ਯੂਰੋquUmonthsq}q(U stand-aloneq}qUnarrowq}q(KXਜqKXਫqKXਮਾqKXਅqKXਮqKXਜੂqKXਜੁqKXਅqK XਸqK XਅqK XਨqK XਦqusUformatq}q(Uwideq}q(KXਜਨਵਰੀqKXਫ਼ਰਵਰੀqKX ਮਾਰਚqKXਅਪ੍ਰੈਲqKXਮਈqKX ਜੂਨqKXਜੁਲਾਈrKX ਅਗਸਤrK XਸਤੰਬਰrK XਅਕਤੂਬਰrK XਨਵੰਬਰrK XਦਸੰਬਰruU abbreviatedr}r(KXਜਨਵਰੀrKXਫ਼ਰਵਰੀr KX ਮਾਰਚr KXਅਪ੍ਰੈਲr KXਮਈr KX ਜੂਨr KXਜੁਲਾਈrKX ਅਗਸਤrK XਸਤੰਬਰrK XਅਕਤੂਬਰrK XਨਵੰਬਰrK XਦਸੰਬਰruuuUcurrency_formatsr}rNh )r}r(h#Nh$Kh%KKrh'h/h/rh*KKrh,X¤ #,##,##0.00rh.X¤ rX-¤ rrh2Nh3KKrubsUdaysr }r!(U stand-aloner"}r#Unarrowr$}r%(KXਸੋr&KXਮੰr'KX ਬੁੱr(KXਵੀr)KX ਸ਼ੁੱr*KXਸ਼r+KXਐr,usUformatr-}r.(Uwider/}r0(KXਸੋਮਵਾਰr1KXਮੰਗਲਵਾਰr2KXਬੁਧਵਾਰr3KXਵੀਰਵਾਰr4KXਸ਼ੁੱਕਰਵਾਰr5KXਸ਼ਨੀਚਰਵਾਰr6KXਐਤਵਾਰr7uU abbreviatedr8}r9(KX ਸੋਮ.r:KX ਮੰਗਲ.r;KX ਬੁਧ.r<KX ਵੀਰ.r=KXਸ਼ੁਕਰ.r>KX ਸ਼ਨੀ.r?KXਐਤ.r@uuuU meta_zonesrA}rBUerasrC}rD(UwiderE}rF(KXਈਸਾਪੂਰਵrGKX ਸੰਨrHuU abbreviatedrI}rJ(KXBCErKKXCErLuuu.PK[Rll)site-packages/babel/localedata/gaa_GH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/hu_HU.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ܘDD(site-packages/babel/localedata/en_HK.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU first_dayqKsU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqX d MMM yyyyqUformatq X%(d)s %(MMM)s %(yyyy)sq!ubUfullq"h)q#}q$(hXEEEE, d MMMM yyyyq%h X!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)sq&ubUlongq'h)q(}q)(hX d MMMM yyyyq*h X%(d)s %(MMMM)s %(yyyy)sq+ubUshortq,h)q-}q.(hX dd/MM/yyyyq/h X%(dd)s/%(MM)s/%(yyyy)sq0ubuUcurrency_symbolsq1}q2(UUSDq3XUS$q4UHKDq5X$q6uU time_zonesq7}q8Uscriptsq9}q:Uvariantsq;}qUcurrency_namesq?}q@h3XUSDqAsUmonthsqB}qCUcurrency_formatsqD}qEUdaysqF}qGU meta_zonesqH}qIUerasqJ}qKu.PK[Rll(site-packages/babel/localedata/et_EE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[;F  (site-packages/babel/localedata/ti_ER.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q (Upatternq!X#EEEE፡ dd MMMM መዓልቲ yyyy Gq"Uformatq#X7%(EEEE)s፡ %(dd)s %(MMMM)s መዓልቲ %(yyyy)s %(G)sq$ubsUcurrency_symbolsq%}q&(UETBq'XETBq(UERNq)X$q*uU time_zonesq+}q,Uscriptsq-}q.Uvariantsq/}q0Unumber_symbolsq1}q2Ucurrency_namesq3}q4Umonthsq5}q6Uformatq7}q8(Uwideq9}q:(KXጥሪq;KX ለካቲትqKX ግንቦትq?KXሰነq@KX ሓምለqAKX ነሓሰqBK XመስከረምqCK X ጥቅምቲqDK X ሕዳርqEK X ታሕሳስqFuU abbreviatedqG}qH(KXጥሪqIKX ለካቲqJKX መጋቢqKKX ሚያዝqLKX ግንቦqMKXሰነqNKX ሓምለqOKX ነሓሰqPK X መስከqQK X ጥቅምqRK X ሕዳርqSK X ታሕሳqTuusUcurrency_formatsqU}qVUdaysqW}qXUformatqY}qZ(Uwideq[}q\(KX ሰሉስq]KX ሓሙስq^uU abbreviatedq_}q`(KX ሰሉስqaKX ሓሙስqbuusU meta_zonesqc}qdUerasqe}qfu.PK[1ll(site-packages/babel/localedata/fr_FR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/en_AS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[#  (site-packages/babel/localedata/es_PY.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqUpatternqX ¤ #,##0.00qUprefixqX¤ qX¤ -qq Uexp_plusq!NUgroupingq"KKq#ubsU languagesq$}q%U territoriesq&}q'U time_zonesq(}q)Uscriptsq*}q+Udecimal_formatsq,}q-U meta_zonesq.}q/Uvariantsq0}q1Ucurrency_namesq2}q3u.PK[_.ll-site-packages/babel/localedata/ha_Latn_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[2Ab(site-packages/babel/localedata/en_PK.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q Ncbabel.numbers NumberPattern q )q}q(Uexp_precqNUscaleqKdU frac_precqKKqUsuffixqX%qhqUint_precqKKqUpatternqX #,##,##0%qUprefixqXqX-qqUexp_plusqNUgroupingq KKq!ubsU week_dataq"}q#U first_dayq$KsU time_formatsq%}q&U languagesq'}q(U territoriesq)}q*Udecimal_formatsq+}q,Nh )q-}q.(hNhKhKKq/hhhq0hKKq1hX #,##,##0.###q2hhhq3hNh KKq4ubsU date_formatsq5}q6(Umediumq7cbabel.dates DateTimePattern q8)q9}q:(hX dd-MMM-yyyyq;Uformatqh8)q?}q@(hXEEEE d MMMM yyyyqAhhX%(dd)s %(MMM)s %(yyyy)sq?ubUshortq@h)qA}qB(hXdd/MM/yyqChX%(dd)s/%(MM)s/%(yy)sqDubuUcurrency_symbolsqE}qF(UUSDqGXUS$qHUSGDqIX$qJuU time_zonesqK}qLUscriptsqM}qNUvariantsqO}qPUnumber_symbolsqQ}qRUcurrency_namesqS}qThGXUSDqUsUmonthsqV}qWUcurrency_formatsqX}qYNcbabel.numbers NumberPattern qZ)q[}q\(Uexp_precq]NUscaleq^KU frac_precq_KKq`UsuffixqaXqbhbqcUint_precqdKKqehX ¤#,##0.00qfUprefixqgX¤qhX-¤qiqjUexp_plusqkNUgroupingqlKKqmubsUdaysqn}qoU meta_zonesqp}qqUerasqr}qsu.PK[%site-packages/babel/localedata/si.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUformatq}q(Uwideq }q (KX1 වන කාර්තුවq KX2 වන කාර්තුවq KX3 වන කාර්තුවq KX4 වන කාර්තුවquU abbreviatedq}q(KXකාර්:1qKXකාර්:2qKXකාර්:3qKXකාර්:4quusUperiodsq}q(UamqX පෙ.ව.qUpmqXප.ව.quUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q)q }q!(Uexp_precq"NUscaleq#KdU frac_precq$KKq%Usuffixq&X%q'h'q(Uint_precq)KKq*Upatternq+X #,##,##0%q,Uprefixq-Xq.X-q/q0Uexp_plusq1NUgroupingq2KKq3ubsU week_dataq4}q5(Umin_daysq6KU weekend_startq7KU first_dayq8KU weekend_endq9KuU time_formatsq:}q;(Umediumq}q?(h+X h:mm:ss aq@UformatqAX%(h)s:%(mm)s:%(ss)s %(a)sqBubUfullqCh=)qD}qE(h+X h:mm:ss a vqFhAX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqGubUlongqHh=)qI}qJ(h+X h:mm:ss a zqKhAX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqLubUshortqMh=)qN}qO(h+Xh:mm aqPhAX%(h)s:%(mm)s %(a)sqQubuU languagesqR}qSUsiqTXසිංහලqUsU territoriesqV}qWULKqXXශ්‍රී ලංකාවqYsUdecimal_formatsqZ}q[Nh)q\}q](h"Nh#Kh$KKq^h&h.h.q_h)KKq`h+X #,##,##0.###qah-h.h/qbh1Nh2KKqcubsU date_formatsqd}qe(Umediumqfh=)qg}qh(h+X yyyy MMM dqihAX%(yyyy)s %(MMM)s %(d)sqjubUfullqkh=)ql}qm(h+XEEEE, yyyy MMMM dqnhAX!%(EEEE)s, %(yyyy)s %(MMMM)s %(d)sqoubUlongqph=)qq}qr(h+X yyyy MMMM dqshAX%(yyyy)s %(MMMM)s %(d)sqtubUshortquh=)qv}qw(h+X yyyy/MM/ddqxhAX%(yyyy)s/%(MM)s/%(dd)sqyubuUcurrency_symbolsqz}q{ULKRq|XSL Req}sU time_zonesq~}qUscriptsq}qUSinhqXසිංහලqsUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}qh|Xලංකා රුපියලqsUmonthsq}q(U stand-aloneq}qUnarrowq}q(KXජqKXපෙqKXමාqKXඅqKXමැqKXජූqKXජූqKXඅqK XසැqK XඔqK XනොqK XදෙqusUformatq}q(Uwideq}q(KXජනවාරqKXපෙබරවාරqKXමාර්තqKXඅප්‍රේල්qKX මැයිqKX ජූනqKX ජූලිqKXඅගෝස්තුqK X!සැප්තැම්බර්qK Xඔක්තෝබර්qK Xනොවැම්බර්qK Xදෙසැම්බර්quU abbreviatedq}q(KXජනqKX පෙබqKXමාර්තqKXඅප්‍රේලqKX මැයqKX ජූනqKX ජූලqKX අගෝqK X සැපqK XඔකqK X නොවැqK X දෙසැquuuUcurrency_formatsq}qNh)q}q(h"Nh#Kh$KKqh&h.X)qqh)KKqh+X ¤#,##,##0.00qh-X¤qX(¤qņqh1Nh2KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KXසqKXඅqKXබqKX බ්‍රqKXසිqKXසෙqKXඉqusUformatq}q(Uwideq}q(KXසඳුදාqKXඅඟහරුවාදාqKXබදාදාqKX*බ්‍රහස්පතින්දාqKXසිකුරාදාqKXසෙනසුරාදාqKXඉරිදාquU abbreviatedq}q(KX සඳුqKXඅඟqKX බදාqKXබ්‍රහqKX සිකුqKX සෙනqKX ඉරිquuuU meta_zonesq}qULankaq}q(UcommonqUlongq}qUstandardqX,ශ්‍රී ලංකා වේලාවqsusUerasq}q(Uwideq}q(KX.ක්‍රිස්තු පූර්‍වqKX+ක්‍රිස්තු වර්‍ෂquU abbreviatedq}q(KXක්‍රි.පූ.qKXක්‍රි.ව.quuu.PK[D))-site-packages/babel/localedata/sr_Latn_BA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[i3xx%site-packages/babel/localedata/ro.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1}, {0}qsUquartersq}q(U stand-aloneq}q (Uwideq }q (KXtrimestrul al I-leaq KXtrimestrul al II-leaq KXtrimestrul al III-leaqKXtrimestrul al IV-leaquUnarrowq}q(KX1qKX2qKX3qKX4quuUformatq}q(Uwideq}q(KX trimestrul 1qKX trimestrul 2qKX trimestrul 3qKX trimestrul 4quU abbreviatedq}q(KXT1q KXT2q!KXT3q"KXT4q#uUnarrowq$}q%(KXIq&KXIIq'KXIVq(uuuUperiodsq)}q*(Uamq+XAMq,Upmq-XPMq.uUscientific_formatsq/}q0Ncbabel.numbers NumberPattern q1)q2}q3(Uexp_precq4KKq5Uscaleq6KU frac_precq7KKq8Usuffixq9Xq:h:q;Uint_precqX#E0q?Uprefixq@h:X-qAqBUexp_plusqCUgroupingqDMMqEubsUpercent_formatsqF}qGNh1)qH}qI(h4Nh6Kdh7KKqJh9X%qKhKqLhX#,##0%qNh@h:hAqOhCNhDKKqPubsU week_dataqQ}qR(Umin_daysqSKU weekend_startqTKU first_dayqUKU weekend_endqVKuU time_formatsqW}qX(UmediumqYcbabel.dates DateTimePattern qZ)q[}q\(h>XHH:mm:ssq]Uformatq^X%(HH)s:%(mm)s:%(ss)sq_ubUfullq`hZ)qa}qb(h>X HH:mm:ss vqch^X%(HH)s:%(mm)s:%(ss)s %(v)sqdubUlongqehZ)qf}qg(h>X HH:mm:ss zqhh^X%(HH)s:%(mm)s:%(ss)s %(z)sqiubUshortqjhZ)qk}ql(h>XHH:mmqmh^X %(HH)s:%(mm)sqnubuU languagesqo}qp(Uzh_HantqqXchineză tradiționalăqrUguqsXgujaratiqtUscnquX sicilianăqvUroaqwXlimbă romanicăqxUaleqyXaleutăqzUscoq{X scoțianăq|Uneq}X nepalezăq~UgdqXgalică scoțianăqUgaqX irlandezăqUgnqXguaraniqUaltqXaltaică meridionalăqUglqX galicianăqUlbqXluxemburghezăqUfiuqXlimbă fino-ugricăqUlnqXlingalaqUloqX laoțianăqUttqXtătarăqUtrqXturcăqUbntqXbantuqUlvqXletonăqUausqXlimbă australianăqUpeoqXpersană vecheqUtkqX turkmenăqUthqX thailandezăqUtiqXtigrinyaqUtaiqXlimbă thailandezăqUsuqX sundanezăqUteqXteluguqUpt_PTqXportugheză ibericăqUfilqX filipinezăqUhawqX hawaianăqUyiqXidișqUhitqXhitităqUpt_BRqXportugheză brazilianăqUdeqXgermanăqUdaqXdanezăqUiraqXlimbă iranianăqUgemqXlimbă germanicăqUbatqXlimbă balticăqUroqXromânăqUquqXquechuaqUelqXgreacăqUeoqX esperantoqUenqXenglezăqUartqXlimbă artificialăqUbeqX bielorusăqUzh_HansqXchineză simplificatăqUphiqXlimbă filipinezăqUsgaqXirlandeză vecheqUarcqX aramaicăqUen_USqXengleză americanăqUeuqXbascăqUetqXestonăqUsemqXlimbă semiticăqUnubqXlimbă nubianăqUesqX spaniolăqUruqXrusăqUmncqX manciurianăqUrmqX retoromanăqUltqX lituanianăqUtlqXtagalogqUzapqX zapotecăqUde_ATqXgermană austriacăqUgotqXgoticăqUmunqX limbă mundaqUjvqX javanezăqUsuxqX sumerianăqUen_CAqXengleză canadianăqUbgqXbulgarăqUbaqX bașkirăqUwaqXvalonăqUwoqXwolofrUtutrXlimbă altaicărUbnrX bengalezărUborX tibetanărUbhrXbiharirUbrr Xbretonăr Ubsr X bosniacăr Umulr Xlimbi multiplerUruprX aromânărUjarX japonezărUcoprXcoptărUomrXoromorUsyrrXsirianărUlarXlatinărUocrX occitanărUakkrX akkadianărUundrX"limbă necunoscută sau incorectăr Ustr!Xsesothor"Utwr#Xtwir$Udrar%Xlimbă dravidianăr&Utlhr'X klingonianăr(Uorr)Xoriyar*Uxhr+Xxhosar,Ucor-X corsicanăr.Ujrbr/X iudeo-arabăr0Ucar1X catalanăr2Ucer3Xcecenăr4Ucyr5Xgalezăr6Uangr7Xengleză vecher8Usgnr9Xlimbaj mimico-gestualr:Ucsr;Xcehăr<Utyr=X tahitianăr>Uapar?Xlimbă apașăr@UcvrAX ciuvașărBUcurCXslavonărDUde_CHrEXgermană standard elvețianărFUpsrGXpaștorHUptrIX portughezărJUsmrKXsamoanărLUfrorMXfranceză vecherNUelxrOXelamitărPUukrQX ucraineanărRUparSXpunjabirTUxalrUXcalmucărVUvirWX vietnamezărXUzxxrYXfară conținut lingvisticrZUes_ESr[Xspaniolă ibericăr\Upir]Xpalir^Upror_Xprovensală vecher`Uen_GBraXengleză britanicărbUzhrcXchinezărdUhyreXarmeanărfUotorgX limbă otomirhUhrriXcroatărjUotarkXturcă otomanărlUkarmX georgianărnUhtroX haitianărpUhurqX maghiarărrUhirsXhindirtUtgruXtadjicărvUnl_BErwX flamandărxUheryXebraicărzUmgr{X malgașăr|Uuzr}Xuzbecăr~UmlrX malayalamrUmorXmoldoveneascărUmnrXmongolărUmirXmaorirUikrXinupiakrUcaurXlimbă caucazianărUurrXurdurUmtrXmaltezărUcairXlimbă central-amerindianărUainrXainurUplrX polonezărUmsrX malaezianărUmrrXmarathirUberrXberberărUugrXuigurărUtarXtamilrUmyrX birmanezărUslarX limbă slavărUsairXlimbă sud-amerindianărUabrXabhazărUsamrXaramaică samariteanărUafrX afrikaansrUtnrXsetswanarUswrXswahilirUisrX islandezărUmynrX limbă mayarUamrX amharicărUitrX italianărUanrX aragonezărUiarX interlinguarUasrXasamezărUarrXarabărUes_419rXspaniolă latino-americanărUavrXavarărUayrXaymararUinerXlimbă indo-europeanărUazrXazerărUierX interlinguerUidrX indonezianărUincrXlimbă indianărUskrXslovacărUjprrXiudeo-persanărUnlrX olandezărUyorXyorubarUnnrXnorvegiană nynorskrUnorX norvegianărUnairXlimbă nord-amerindianărUafarXlimbă afro-asiaticărUen_AUrXengleză australianărUpaarXlimbă papuașărUnaprX napolitanărUvorXvolapukrUgrcrX greacă vecherUzurXzulurUmisrX limbi diverserUnvrXnavajorUfrrX francezărUcelrXlimbă celticărUphnrX fenicianărUfyrX frizianărUsvrXsuedezărUfarXpersanărUfr_CHrXfranceză elvețianărUfirX finlandezărUfjrXfijianărUsarX sanscritărUfr_CArXfranceză canadianărUforXfaroezărUegyrXegipteană vecherUkgr X congolezăr Ugswr Xgermană elvețianăr Ukkr XcazacărUsrrXsârbărUsqrX albanezărUsitrXlimbă sino-tibetanărUkorX coreeanărUknrXkannadarUkmrXkhmerărUklrX groenlandezărUksrXkashmirirUsirX singalezăr Ushr!Xsârbo-croatăr"Usor#X somalezăr$Umkr%X macedoneanăr&Ukur'Xkurdăr(Uslr)Xslovenăr*Uscr+X sardinianăr,Ukyr-X kirghizăr.Usdr/Xsindhir0uU territoriesr1}r2(UBDr3X Bangladeshr4UBEr5XBelgiar6UBFr7X Burkina Fasor8UBGr9XBulgariar:UVEr;X Venezuelar<UBAr=XBosnia și Herțegovinar>UBBr?XBarbadosr@UWFrAXWallis și FutunarBUBMrCXBermudarDUBNrEXBruneirFUBOrGXBoliviarHUBHrIXBahrainrJUBIrKXBurundirLUBJrMXBeninrNUBTrOXBhutanrPU011rQXAfrica OccidentalărRUBVrSX Insula BouvetrTUBWrUXBotswanarVU014rWXAfrica OrientalărXU015rYXAfrica SeptentrionalărZUBRr[XBraziliar\U017r]XAfrica Centralăr^U018r_XAfrica Meridionalăr`U019raXAmericirbUBYrcX BielorusiardUBZreXBelizerfULVrgXLetoniarhURWriXRwandarjURSrkXSerbiarlUTLrmXTimorul de EstrnUREroXReunionrpUTMrqX TurkmenistanrrUOMrsXOmanrtUTJruX TadjikistanrvUROrwXRomâniarxUTKryXTokelaurzUGWr{XGuineea-Bissaur|UGUr}XGuamr~UGTrX GuatemalarUGSrX+Insulele Georgia de Sud și Sandwich de SudrUGRrXGreciarUGQrXGuineea EcuatorialărUGPrX GuadeluparUJPrXJaponiarUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXGuyana FrancezărUGErXGeorgiarUGDrXGrenadarU021rXAmerica SeptentrionalărUGBrX Regatul UnitrUGArXGabonrUSVrX El SalvadorrUGNrXGuineearUGMrXGambiarUGLrX GroenlandarU029rXCaraiberUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunisiarUJMrXJamaicarU013rXAmerica CentralărUWSrXSamoarU419rXAmerica Latină și CaraiberUHRrXCroațiarUBSrXBahamasrUHTrXHaitirUHUrXUngariarUHKrXR.A.S. Hong Kong a ChineirU039rXEuropa MeridionalărUHNrXHondurasrUFIrXFinlandarU142rXAsiarU030rXAsia OrientalărU034rXAsia MeridionalărU035rXAsia de Sud-EstrUPRrX Porto RicorUPSrXTeritoriul PalestinianrU830rXInsulele Anglo-NormanderUFKrXInsulele FalklandrUIOrX&Teritoriul Britanic din Oceanul IndianrUPWrXPalaurUPTrX PortugaliarUSJrXSvalbard și Jan MayenrUMDrXMoldova, RepublicarUFMrX MicroneziarUIQrXIrakrUPArXPanamarUPFrXPolinezia FrancezărUPGrXPapua Noua GuineerUPErXPerurUPKrXPakistanrUPHrXFilipinerUFOrXInsulele FeroerUPNrXPitcairnrUPLrXPoloniarUPMrXSaint Pierre și MiquelonrUZMrXZambiarUEHrXSahara de VestrURUrXRusiarUEErXEstoniarUEGrXEgiptrUZArX Africa de SudrUECrXEcuadorrUITrXItaliarUVNr XVietnamr UZZr X#Regiune necunoscută sau incorectăr USBr XInsulele SolomonrUETrXEtiopiarUSOrXSomaliarUZWrXZimbabwerUSArXArabia SauditărUESrXSpaniarUERrXEritreearUMErX MuntenegrurUAQrX AntarcticarUMGrX Madagascarr UMAr!XMarocr"UMCr#XMonacor$UUZr%X Uzbekistanr&UMMr'XMyanmarr(UMLr)XMalir*UMOr+XR.A.S. Macao a Chineir,UMNr-XMongoliar.UHMr/X"Insula Heard și Insulele McDonaldr0UASr1XSamoa Americanăr2UMKr3X Macedoniar4UMUr5X Mauritiusr6UMTr7XMaltar8UMWr9XMalawir:UMVr;XMaldiver<UMQr=X Martinicar>UMPr?XInsulele Mariane de Nordr@UMSrAX MontserratrBUMRrCX MauritaniarDUIMrEX Insula ManrFUUGrGXUgandarHUTZrIXTanzaniarJUMYrKXMalaeziarLUMXrMXMexicrNUILrOXIsraelrPUFRrQXFranțarRUAWrSXArubarTUDOrUXRepublica DominicanărVUSHrWX Sfânta ElenarXUVCrYXSaint Vincent și GrenadinesrZU054r[X Melaneziar\UDJr]XDjiboutir^UFJr_XFijir`U057raXRegiunea MicroneziarbU172rcX!Comunitatea Statelor IndependenterdU053reXAustralia și Noua ZeelandărfUNIrgX NicaraguarhUNLriXOlandarjUNOrkXNorvegiarlUNArmXNamibiarnUVUroXVanuaturpUNCrqXNoua CaledonierrUNErsXNigerrtUNFruXInsulele NorfolkrvUNGrwXNigeriarxUNZryXNoua ZeelandărzUNPr{XNepalr|UNRr}XNaurur~UNUrXNiuerU061rX PolineziarUCIrXCoasta de FildeșrUCHrX ElevețiarUCOrXColumbiarUCNrXChinarUCMrXCamerunrUCLrXChilerUCCrXInsulele CocosrUCArXCanadarUCGrXCongorUCFrXRepublica CentrafricanărUCDrXRepublica Democrată CongorUCZrXRepublica CehărUCYrXCiprurUCXrXInsula ChristmasrUCSrXSerbia și MuntenegrurUCRrX Costa RicarUPYrXParaguayrUCVrX Capul VerderUCUrXCubarUSZrX SwazilandrUSYrXSiriarUKGrX KirghizstanrUKErXKenyarUSRrXSurinamrU143rXAsia CentralărUKHrX CambodgiarUKNrXSaint Kitts și NevisrUKMrXComorerUSTrXSao Tome și PrinciperUSKrXSlovaciarUKRrX Coreea de SudrUSIrXSloveniarUKPrXCoreea de NordrUKWrXKuweitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KazahstanrUKYrXInsulele CaymanrUSGrX SingaporerUSErXSuediarUSDrXSudanrU151rXEuropa OrientalărU150rXEuroparUDMrXDominicarU155rXEuropa OccidentalărU154rXEuropa SeptentrionalărUVGrXInsulele Virgine BritanicerUDErXGermaniarUYErXYemenrUMHrXInsulele MarshallrU062rXAsia Centrală de SudrUDZrXAlgeriarUUSrX Statele UniterUUYrXUruguayrUYTrXMayotterUUMrX,Teritoriile Îndepărtate ale Statelor UniterULBrXLibanrULCrX Sfânta LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTrXTrinidad-TobagorUTRrXTurciarULKrX Sri LankarULIrX LiechtensteinrUCKr X Insulele Cookr UTOr XTongar ULTr XLituaniarULUrX LuxemburgrULRrXLiberiarULSrXLesothorUTHrX ThailandarUTFrX,Teritoriile Australe și Antarctice FrancezerUTGrXTogorUTDrXCiadrUTCrXInsulele Turks și CaicosrULYrXLibiar UVAr!XVaticanr"U145r#XAsia Occidentalăr$UAEr%XEmiratele Arabe Uniter&UADr'XAndorrar(UAGr)XAntigua și Barbudar*UAFr+X Afganistanr,UAIr-XAnguillar.UVIr/XInsulele Virgine S.U.A.r0UISr1XIslandar2UIRr3XIranr4UAMr5XArmeniar6UALr7XAlbaniar8UAOr9XAngolar:UANr;XAntilele Olandezer<U003r=XAmerica de Nordr>U002r?XAfricar@U001rAXLumerBUARrCX ArgentinarDUAUrEX AustraliarFUATrGXAustriarHU005rIXAmerica de SudrJUINrKXIndiarLUAXrMXInsulele AlandrNU009rOXOceaniarPUAZrQX AzerbaidjanrRUIErSXIrlandarTUIDrUX IndoneziarVUJOrWXIordaniarXUQUrYXUniunea EuropeanărZUUAr[XUcrainar\UQAr]XQatarr^UDKr_X Danemarcar`UMZraXMozambicrbUQOrcXOceania PerifericărduUdecimal_formatsre}rfNh1)rg}rh(h4Nh6Kh7KKrih9h:h:rjhX #,##0.###rlh@h:hArmhCNhDKKrnubsU date_formatsro}rp(UmediumrqhZ)rr}rs(h>X dd.MM.yyyyrth^X%(dd)s.%(MM)s.%(yyyy)sruubUfullrvhZ)rw}rx(h>XEEEE, d MMMM yyyyryh^X!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)srzubUlongr{hZ)r|}r}(h>X d MMMM yyyyr~h^X%(d)s %(MMMM)s %(yyyy)srubUshortrhZ)r}r(h>X dd.MM.yyyyrh^X%(dd)s.%(MM)s.%(yyyy)srubuUcurrency_symbolsr}rUEURrXeurorsU time_zonesr}r(UAtlantic/Canaryr}rUcityrXInsulele CanarersU Europe/Lisbonr}rjXLisabonarsUPacific/Easterr}rjXInsula PașteluirsU Europe/Romer}rjXRomarsUAsia/Kamchatkar}rjX KamciatkarsU Asia/Riyadhr}rjXRiyadrsUEurope/Chisinaur}rjX ChișinăursUAtlantic/South_Georgiar}rjXGeorgia de SudrsU Europe/Londonr}rjXLondrarsU Europe/Warsawr}rjX VarșoviarsU Asia/Damascusr}rjXDamascrsU Asia/Qatarr}rjXQuatarrsUIndian/Maldivesr}rjXMaldiversUEurope/Copenhagenr}rjX CopenhagarsUAmerica/St_Luciar}rjX St. LuciarsU Asia/Irkutskr}rjXIrkuțkrsUEurope/Bucharestr}rjX BucureștirsU Asia/Yakutskr}rjXYakuțkrsU Asia/Tehranr}rjXTeheranrsU Europe/Tiraner}rjXTiranarsUPacific/Marquesasr}rjXMarchizersUAmerica/Martiniquer}rjX MartinicarsUEurope/Zaporozhyer}rjXZaporojersUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAtlantic/Cape_Verder}rjX Capul VerdersU Europe/Moscowr}rjXMoscovarsUAmerica/El_Salvadorr}rjXSalvadorrsUAmerica/Guadelouper}rjX GuadalupersU Asia/Yerevanr}rjXErevanrsUAsia/Yekaterinburgr}rjX EkaterinburgrsU Asia/Kuwaitr}rjXKuweitrsUAmerica/Anchorager}rjXOra statului AlaskarsU Asia/Baghdadr}rjXBagdadrsUAtlantic/St_Helenar}rjX Sf. ElenarsUEurope/Budapestr}rjX BudapestarsU Europe/Viennar}rjXVienarsUAfrica/Addis_Ababar}rjX Addis AbebarsUAsia/Ulaanbaatarr}rjX Ulan BatorrsU Asia/Sakhalinr}rjXSahalinrsUEurope/Brusselsr}rjX BruxellesrsU Europe/Athensr}rjXAtenarsUAmerica/St_Vincentr}rjXSaint Vincent și Grenadinesr sUAtlantic/Azoresr }r jXAzorer sUAsia/Jerusalemr }rjX IerusalimrsUEurope/Luxembourgr}rjX LuxemburgrsU Etc/Unknownr}rjX NecunoscutrsUAmerica/St_Kittsr}rjX St. KittsrsU Asia/Seoulr}rjXSeulrsUAmerica/St_Thomasr}rjX St. ThomasrsUAfrica/Algiersr}r jXAlgerr!sUAntarctica/South_Poler"}r#jX Polul Sudr$suUscriptsr%}r&(UTfngr'Xberberăr(UJavar)X javanezăr*UHebrr+Xebraicăr,UGeorr-X georgianăr.UXpeor/Xpersană vecher0UCyrlr1X chirilicăr2UHrktr3Xkatakana sau hiraganar4UArmnr5Xarmeanăr6UCyrsr7Xslavonă bisericească vecher8UGeokr9Xgeorgiană bisericeascăr:ULatfr;Xlatină Frakturr<UKhmrr=Xkhmerăr>UKanar?Xkatakanar@UDsrtrAXmormonărBUXsuxrCXcuneiformă sumero-akkadianărDUGothrEXgoticărFUItalrGXitalică vecherHUMayarIXhieroglife mayarJUIndsrKX valea InduluirLUBalirMX balinezărNUSyrcrOXsirianărPURunrrQXrunicărRUHangrSX coreeanărTUArabrUXarabărVUZxxxrWX nescrisărXUCoptrYXcoptărZUHansr[Xideografică simplificatăr\UThair]X thailandezăr^UCprtr_X cipriotăr`UGlagraX glagoliticărbULinarcXgrecă lineară ArdUHantreXideografică tradiționalărfUMongrgXmongolărhUDevariX devanagarirjULaoorkX laoțianărlUSinhrmX singalezărnUHiraroXhiraganarpUZzzzrqX#scriere necunoscută sau incorectărrUBoporsXbopomofortULatnruXlatinărvUHanirwX ideograficărxUMymrryXbirmanărzUPhnxr{X fenicianăr|UHungr}Xmaghiară vecher~UBrairXbraillerUGrekrXgreacărUEgydrXdemotică egipteanărUEthirX etiopianărUTibtrX tibetanărUQaairX moștenitărUZyyyrXcomunărUJpanrX japonezărULatgrXlatină galicărUEgyhrXhieratică egipteanărULinbrXgrecă lineară BrULydirXlidianărUCansrX'simboluri aborigene canadiene unificaterUBengrXbengalirUEgyprXhieroglife egiptenerUSyrjrXsiriană occidentalărUSyrnrXsiriană orientalăruUvariantsr}rUnumber_symbolsr}r(UgrouprX.rUnativeZeroDigitrX0rU exponentialrXErUperMillerX‰rUnanrXNaNrUdecimalrX,rU percentSignrhKUlistrX;rUplusSignrX+rUinfinityrX∞rU minusSignrhAuUcurrency_namesr}r(UDZDrXdinar algerianrUNADrXdolar namibianrUKMFrXfranc comorianrUBOPrX peso bolivianrUEGPrXliră egipteanărUBGNrXleva bulgărească nouărUPABrXbalboa panamezrUYUMrXdinar iugoslav nourUGHCrX cedi GhanarUBOBrX bolivianorUDKKrXcoroană danezărULBPrXliră libanezărUTZSrXșiling tanzanianrUVNDrXdong vietnamezrUKHRrXriel cambodgianrUMYRrXringgit malaiezianrUSOSrXșiling somalezrUKYDrXdolar Insulele CaymanrULYDrX dinar libianrUUAHrXhryvna ucraineanărUUAKrXcarboavă ucraineanărUUGXrXșiling ugandezrUJODrXdinar iordanianrUSURrXrublă sovieticărUSARrXriyal Arabia SauditărUFIMrXmarcă finlandezărUHKDrXdolar Hong KongrUSRGrXgulden SurinamrUMGFrXfranc MadagascarrUNLGrXgulden olandezrUCHFrXfranc elvețianrUGIPrXliră GibraltarrUBYRrXrublă bielorusărUITLrXliră italianărUXPDrXpaladiurUBOVrXmvdol bolivianrUHRKrX kuna croatărUDJFrXfranc DjiboutirUHRDrX dinar croatrUPESr Xsol Perur UTHBr Xbaht thailandezr UXAFr Xfranc Comunitatea FinanciarărUBNDrX dolar BruneirUISKrXcoroană islandezărUZALrXrand sud-african (financiar)rUSRDrX dolar SurinamrULAKrXkip LaosrUNICrXcordoba NicaraguarUNPRrXrupie nepalezărUMZErXescudo MozambicrUUYUrXpeso nou Uruguayr ULUCr!Xfranc convertibil luxemburghezr"UMADr#Xdirham marocanr$UFRFr%X franc francezr&UMAFr'X franc marocanr(UMZMr)Xmetical Mozambic vechir*UMZNr+Xmetical Mozambicr,UPHPr-Xpeso filipinezr.UZARr/Xrand sud-africanr0URHDr1Xdolar rhodesianr2UILSr3Xșechel israelian nour4ULUFr5Xfranc luxemburghezr6UBELr7Xfranc belgian (financiar)r8UBECr9Xfranc belgian (convertibil)r:UYUNr;Xdinar iugoslav convertibilr<UBEFr=X franc belgianr>UPLZr?Xzlot polonez (1950–1995)r@UCRCrAXcolon costaricanrBUAEDrCXdirham Emiratele Arabe UniterDUEEKrEXcoroană estonianărFUTTDrGXdolar Trinidad-TobagorHULKRrIXrupie Sri LankarJUSKKrKXcoroană slovacărLUTRLrMXliră turceascărNUPKRrOXrupie pakistanezărPUHUFrQXforint maghiarrRUROLrSX leu vechirTUBMDrUX dolar BermuderVULVRrWXrublă LetoniarXUMNTrYX tugrik mongolrZUAMDr[X dram armeanr\UYUDr]Xdinar iugoslav greur^UBUKr_X kyat birmanr`USYPraXliră sirianărbUQARrcX riyal QatarrdUXDRreXdrepturi speciale de tragererfUKRWrgXwon sud-coreeanrhUUGSriXșiling ugandez (1966–1987)rjUJMDrkXdolar jamaicanrlUGELrmX lari georgianrnUSHProXliră Insula Sf. ElenarpUZWDrqXdolar ZimbabwerrUSBDrsXdolar Insulele SolomonrtUKPWruXwon nord-coreeanrvUCSDrwX!dinar vechi Serbia și MuntenegrurxUTRYryXliră turcească nouărzUBDTr{Xtaka Bangladeșr|UGRDr}Xdrahmă greceascăr~UYERrX riyal YemenrUATSrXșiling austriacrUDDMrXmarcă est-germanărUHTGrX gourde HaitirUANGrXgulden Antilele OlandezerULRDrXdolar liberianrURWFrX franc rwandezrUNOKrXcoroană norvegianărUINRrXrupie indianărUMXNrX peso mexicanrUCZKrXcoroană cehărUTJRrXrublă TadjikistanrUBTNrXngultrum BhutanrUYDDrX dinar YemenrUCOPrXpeso columbianrUIDRrXrupie indonezianărUHNLrXlempira HondurasrUFJDrX dolar FijirUETBrX birr etiopianrUPENrX sol nou PerurUBZDrX dolar BelizerUGWPrXpeso Guineea-BissaurUILPrXliră israelianărUZRNrXzair nourUDOPrXpeso dominicanrULULrXfranc financiar luxemburghezrUTWDrXdolar nou TaiwanrUMDLrXleu moldovenescrUXPTrXplatinărUECSrX sucre EcuadorrUBSDrX dolar BahamasrUSEKrXcoroană suedezărUXTSrXcod monetar de testrUAUDrXdolar australianrUADPrXpesetă andorranărUCUPrX peso cubanezrUIEPrXliră irlandezărUBBDrXdolar BarbadosrUALLrXleka albanezărUGMDrX dalasi GambiarUGTQrXquetzal GuatemalarUVEBrXbolivar VenezuelarUSITrX tolar slovenrUSDPrXliră sudanezărUCLPrX peso chilianrjXeurorUCDFrXfranc congolezrUXCDrXdolar Caraibele de EstrURUBrXrublă ruseascărUXAGrXargintrUBRRrXcruzeiro brazilianrUOMRrX riyal OmanrUBRLrXreal brazilianrUMMKrX kyat MyanmarrUUYPrXpeso Uruguay (1975–1993)rUPLNrXzlot nou polonezrUBRErX cruzeiro brazilian (1990–1993)rUPYGrXguarani ParaguayrUKESrXșiling kenyanrUGYDrX dolar GuyanarUSVCrXcolon El SalvadorrUDEMrXmarcă germanărUMKDrXdinar macedoneanrUGBPrXliră sterlinărUAZNrXmanat azerbaidjanrUUSNrX dolar american (ziua următoare)rUBADrXdinar Bosnia-HerțegovinarUGNFrX franc GuineearUMXPrX$peso mexican de argint (1861–1992)rUIQDrX dinar irakianr UBAMr Xmarcă convertibilă bosniacăr USCRr Xrupie Seychellesr UCADrXdolar canadianrUSDDrX dinar sudanezrUCVErXescudo al Capului VerderUKWDrXdinar kuweitianrUBIFrX franc BurundirUXXXrX#monedă necunoscută sau incorectărUPGKrXkina Papua-Noua GuineerULTLrX lit lituanianrUSGDrXdolar SingaporerUUZSr Xsum Uzbekistanr!USTDr"Xdobra Sao Tome și Principer#UXFOr$Xfranc francez aurr%UMLFr&X franc Malir'UESPr(Xpesetă spaniolăr)UIRRr*X rial iranianr+UCNYr,Xyuan renminbi chinezescr-USLLr.Xleu Sierra Leoner/UTNDr0Xdinar tunisianr1UCYPr2Xliră cipriotăr3UMTLr4Xliră maltezăr5UNZDr6Xdolar neozeelandezr7UFKPr8Xliră Insulele Falklandr9ULVLr:X lats Letoniar;UUSSr<Xdolar american (aceeași zi)r=UUSDr>Xdolar americanr?UARPr@Xpeso argentinian (1983–1985)rAUKGSrBXsom KirghizstanrCUARSrDXpeso argentinianrEUPEIrFX inti PerurGURONrHXleurIURSDrJXdinar sârbescrKUJPYrLX yen japonezrMUXAUrNXaurrOuUmonthsrP}rQ(U stand-alonerR}rSUnarrowrT}rU(Kh&KXFrVKXMrWKXArXKjWKh&Kh&KjXK XSrYK XOrZK XNr[K XDr\usUformatr]}r^(Uwider_}r`(KXianuarieraKX februarierbKXmartiercKXaprilierdKXmaireKXiunierfKXiuliergKXaugustrhK X septembrieriK X octombrierjK X noiembrierkK X decembrierluU abbreviatedrm}rn(KXian.roKXfeb.rpKXmar.rqKXapr.rrKXmairsKXiun.rtKXiul.ruKXaug.rvK Xsept.rwK Xoct.rxK Xnov.ryK Xdec.rzuuuUcurrency_formatsr{}r|Nh1)r}}r~(h4Nh6Kh7KKrh9X ¤rjrhX #,##0.00 ¤rh@h:hArhCNhDKKrubsUdaysr}r(U stand-aloner}r(Uwider}rKX sâmbătărsUnarrowr}r(KXLrKjWKjWKXJrKXVrKjYKj\uuUformatr}r(Uwider}r(KXlunirKXmarțirKXmiercurirKXjoirKXvinerirKX sâmbătărKX duminicăruU abbreviatedr}r(KjKXMarKXMirKjKjKjYKj\uuuU meta_zonesr}rUerasr}r(Uwider}r(KXînainte de HristosrKX după HristosruU abbreviatedr}r(KXî.e.n.rKXe.n.ruuu.PK["Amm%site-packages/babel/localedata/ga.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX 1ú ráitheq KX 2ú ráitheq KX 3ú ráitheqKX 4ú ráithequU abbreviatedq}q(KXR1qKXR2qKXR3qKXR4quusUperiodsq}q(UamqXa.m.qUpmqXp.m.quUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UgvqAX MannainisqBUguqCXGúisearáitisqDUgdqEXGaeilge na hAlbanqFUgaqGXGaeilgeqHUgnqIX GuaráinisqJUglqKX GailísisqLUlbqMXLeitseabuirgisqNUlaqOXLaidinqPUlnqQXlnqRUloqSXLaosaisqTUttqUXTataraisqVUtrqWXTuircisqXUlvqYXLaitvisqZUltq[X Liotuáinisq\Utkq]X Tuircméinisq^Uthq_X Téalainnisq`UtiqaXTigrinisqbUteqcX TeileagúisqdUpt_PTqeXPortaingéilis IbéireachqfUfilqgXfilqhUhawqiX HaváíaisqjUyiqkXGiúdaisqlUpt_BRqmXPortaingéilis BhrasaíleachqnUdeqoX GearmáinisqpUdaqqX DanmhairgisqrUquqsX CeatsuaisqtUelquXGréigisqvUeoqwX EsperantoqxUenqyXBéarlaqzUzhq{XSínisq|Uzh_Hansq}XSínis Shimplitheq~Uzh_HantqXSínis ThraidisiúntaqUukqX ÚcráinisqUeuqXBascaisqUetqX EastóinisqUesqX SpáinnisqUruqXRúisisqUroqX RómáinisqUbnqX BeangáilisqUbeqX BealarúisisqUbgqX BulgáirisqUbaqX BaiscírisqUwaqX VallúnaisqUjvqXIávaisqUboqX TibéadaisqUbhqXBihairisqUbrqX BriotáinisqUbsqXBoisnisqUjaqX SeapáinisqUtyqX TaihítisqUocqX OcatáinisqUundqX!Teanga Anaithnid nó NeamhbhailíqUtwqXTvísqUtlhqXKlingonqUosqX ÓiséitisqUorqXOraisisqUxhqXCósaisqUcoqX CorsaicisqUcaqX CatalóinisqUceqXSisinisqUcyqX BreatnaisqUcsqXSeicisqUcrqXCraíaisqUcvqXSuvaisisqUcuqXSlavais na hEaglaiseqUpsqXPaistisqUptqXPortaingéilisqUtlqX TagálaigisqUpaqX PuinseáibisqUviqX VítneamaisqUplqX PolainnisqUhyqX AirméinisqUhrqXCróitisqUiuqX IonúitisqUhuqX UngáirisqUhiqX HiondúisqUheqXEabhraisqUmgqX MalagásaisqUuzqX ÚisbéicisqUmlqX MailéalaimisqUmoqX MoldáivisqUmnqX MongóilisqUmiqXMaoraisqUikqXInupiaqqUmkqX MacadóinisqUurqXUrdaisqUmtqXMaltaisqUmsqXMalaeisqUmrqXMaraitisqUugqXugqUtaqXTamailisqUmyqXBurmaisqUaaqXaaqUabqX AbcáisisqUaeqX AivéistisqUafqX AfracáinisrUswrX SvahaílisrUisrX ÍoslainnisrUamrXAmaraisrUitrX IodáilisrUsvr X Sualainnisr Uasr XAsaimisr Uarr XAraibisrUsurXSundaisrUiorXIdorUzurXSúlúisrUiarX InterlinguarUazrXAsarbaiseáinisrUierX InterlinguerUidrX IndinéisisrUskrX SlóvaicisrUnlrX Ollainnisr Unnr!XIoruais Nynorskr"Unor#XIoruaisr$Unar%XNárúisr&Unbr'XIoruais Bokmålr(Uner)X Neipealaisr*Usor+X Somáilisr,Unvr-X Navachóisr.Ufrr/XFraincisr0Usmr1XSamóisr2Ufyr3XFreaslainnis Iartharachr4Ufar5XPeirsisr6Ufir7X Fionlainnisr8Ufjr9XFidsisr:Usar;X Sanscraitr<Ufor=XFaróisr>Ukar?XSeoirsisr@UkkrAX CasachaisrBUsrrCXSeirbisrDUsqrEX AlbáinisrFUkorGX CóiréisrHUknrIX CannadaisrJUkmrKX CambóidisrLUstrMXSótais DheisceartachrNUksrOX CaismírisrPUsirQX SiolóinisrRUshrSXSeirbea-ChróitisrTUkwrUXCornaisrVUkurWXCoirdisrXUslrYX SlóivéinisrZUscr[X Sairdínisr\Ukyr]X Cirgeasaisr^User_XSáimis Thuaidhr`UsdraXSindisrbuU territoriesrc}rd(UBDreXAn BhanglaidéisrfUBErgX An BheilgrhUBFriXBuircíne FasórjUBGrkX An BhulgáirrlUVErmX VeiniséalarnUBAroX An Bhoisnia agus HeirseagóvéinrpUBBrqX BarbadósrrUWFrsXOileáin Vailís agus FutúnartUBMruX BeirmiúdarvUBNrwXBrúinérxUBOryX An BholaivrzUBHr{XBairéinr|UBIr}X An Bhurúinr~UBJrXBeininrUBTrX An BhútáinrUJMrXIamáicerUBVrXOileán BouvetrU013rXMeiriceá LáirrUWSrXSamórUBRrX An BhrasaílrU017rXAn Afraic LáirrU019rXNa MeiriceánnarUBYrXAn BhealarúisrUBZrX An BheilísrURUrXCónaidhm na RúiserURWrXRuandarURSrX An tSeirbiarUTLrXTíomór ThoirrURErXRéunionrUTMrXAn TuircméanastáinrUTJrXAn TáidsíceastáinrUROrX An RómáinrUTKrXTócalárUGWrXAn Ghuine-BhissaurUGUrXGuamrUGTrX GuatamalarUGSrX/An tSeoirsia Theas agus Oileáin Sandwich TheasrUGRrX An GhréigrUGQrXAn Ghuine MheánchriosachrUGPrX GuadalúiprUJPrX An tSeapáinrUOMrXÓmanrUGYrX An GhuáinrUGGrXGeansaírUGFrXAn Ghuáin FhrancachrUGErX An tSeoirsiarUGDrXGrenadarUGBrXAn Ríocht AontaitherUGArX An GhabúinrUSVrXAn tSalvadóirrUGNrX An GhuinerUGMrX An GhaimbiarUGLrXAn GhraonlainnrUGIrX GiobráltarrUGHrXGánarUJErXGeirsírUTNrX An TúinéisrUBWrX An BhotsuáinrU419rX*Meiriceá Laidineach agus an Mhuir ChairibrUHRrX An ChróitrUBSrX Na BahámaírUHTrXHáitírUHUrX An UngáirrUHKrXR.R.S. na Síne Hong CongrUHNrX HondúrasrUHMrX$Oileán Heard agus Oileáin McDonaldrU142rXAn ÁiserU143rXAn Áise LáirrUPRrX Portó RícerUPSrXNa Críocha PailistíneacharUFKrXOileáin FháclainnerUPWrXPalaurUPTrXAn PhortaingéilrUSJrXSvalbard agus Jan MayenrUPYrXParaguarUFMrXAn MhicrinéisrUIQrX An IaráicrUPArXPanamarUPFrXAn Pholainéis FhrancachrUPGrXNua-Ghuine PhapuarUPErXPeiriúrUPKrXAn PhacastáinrUPHr XNa hOileáin Fhilipíneachar UFOr XOileáin Fharór UPNr XPitcairnrUPLrX An PholainnrUPMrXSaint Pierre agus MiquelonrUZMrX An tSaimbiarUEHrXAn Sahára ThiarrUEErX An EastóinrUEGrX An ÉigiptrUZArXAn Afraic TheasrUECrX EacuadórrUITrX An Iodáilr UVNr!X Vít Neamr"UZZr#X$Réigiún Anaithnid nó Neamhbhailír$USBr%XOileáin Sholaimhr&UETr'X An Aetóipr(USOr)X An tSomáilr*UZWr+X An tSiombáibr,USAr-XAn Araib Shádachr.UESr/X An Spáinnr0UERr1X An Eiritrér2UMEr3XMontainéagrór4UMDr5X An Mholdóivr6UMGr7X Madagascarr8UMAr9XMaracór:UMCr;XMonacór<UUZr=XÚisbéiceastáinr>UMMr?XMaenmarr@UMLrAXMailírBUMOrCXR.R.S. na Síne MacáórDUMNrEX An MhongóilrFUASrGXSamó MeiriceánachrHUMKrIX An MhacadóinrJUMUrKXOileán MhuirísrLUMTrMXMáltarNUMWrOX An MhaláivrPUMVrQX Na MaildivírRUMQrSX MartainícrTUMPrUXOileáin Mariana ThuaidhrVUMSrWX MontsaratrXUMRrYX An MharatáinrZUIMr[XOileán Mhanannr\UUGr]XÚgandar^UTZr_X An Tansáinr`UMYraX An MhalaeisiarbUMXrcX MeicsiceordUILreXIosraelrfUFRrgX An FhraincrhUIOriX'Críocha Briotanacha an Aigéin IndiaghrjUDOrkXAn Phoblacht DhoiminiceachrlUSHrmX San HéilinrnU054roXAn MheilinéisrpUFIrqX An FhionlainnrrUFJrsXFidsírtU057ruXAn Réigiún MicrinéiseachrvU172rwX"Comhlathas na Stát NeamhspleácharxU053ryX"An Astráil agus an Nua-ShéalainnrzUNIr{X Nicearaguar|UNLr}X An Ísiltírr~UNOrXAn IoruarUNArX An NamaibrUVUrXVanuatúrUNCrXAn Nua-ChaladóinrUNErX An NígirrUNFrXOileán NorfolkrUNGrX An NigéirrUNZrXAn Nua-ShéalainnrUNPrXNeipealrUNRrXNárúrUNUrXNívérUCKrX Oileáin CookrUCIrXAn Cósta EabhairrUCHrX An EilvéisrUCOrX An CholóimrUCNrXAn tSínrUCMrXCamarúnrUCLrXAn tSilerUCCrXOileáin na gCócónnarUCArXCeanadarUCGrX An CongórUCFrXPoblacht na hAfraice LáirrUCDrX Poblacht Dhaonlathach an ChongórUCZrXPoblacht na SeicerUCYrX An ChipirrUCXrXOileán na NollagrUCSrXAn tSeirbia agus MontainéagrórUCRrX Cósta RícerUCVrX An Rinn GhlasrUCUrXCúbarUSZrXAn tSuasalainnrUSYrX An tSiriarUKGrXAn ChirgeastáinrUKErX An ChéiniarUSRrXSuranamrUKIrXCiribeasrUKHrX An ChambóidrUKNrXSaint Kitts agus NevisrUKMrXOileáin ChomórarUSTrXSao Tome agus PrinciperUSKrX An tSlóvaicrUKRrXAn Chóiré TheasrUSIrX An tSlóvéinrUKPrXAn Chóiré ThuaidhrUKWrXCuáitrUSNrXAn tSeineagáilrUSMrX San MairínerUSLrX Siarra LeonrUSCrX Na SéiséilrUKZrXAn ChasacstáinrUKYrXOileáin na gCadhmanrUSGrX SingeapórrUSErX An tSualainnrUSDrX An tSúdáinrU150rX An EoraiprUDMrX DoiminicerUDJrXDjiboutirUDKrX An DanmhairgrUVGrX"Oileáin Bhriotanacha na MaighdeanrUDErX An GhearmáinrUYErXÉiminrUMHrXOileáin MarshallrUDZrX An AilgéirrUUSrXStáit Aontaithe MheiriceárUUYrXUruguarUYTrXMayotterU061rXAn PholainéisrUUMrXMion-Oileáin Imeallacha S.A.M.rULBrX An LiobáinrULCr X San Lúisiar ULAr XLaosr UTVr X TúválúrUTWrX An TéaváinrUTTrX$Oileáin na Tríonóide agus TobágarUTRrXAn TuircrULKrX Srí LancarULIrX LichtinstéinrULVrX An LaitviarUTOrXTongarULTrX An LiotuáinrULUrX Lucsamburgr ULRr!X An Libéirr"ULSr#XLeosótar$UTHr%X An Téalainnr&UTFr'X!Críocha Deisceartacha na Fraincer(UTGr)XTógar*UTDr+XSeadr,UTCr-XOileáin Turks agus Caicosr.ULYr/XAn Libiar0UVAr1X An Vatacáinr2UVCr3X Saint Vincent agus na Grenadinesr4UAEr5X$Aontas na nÉimíríochtaí Arabachar6UADr7XAndórar8UAGr9XAintíge agus Barbúdar:UAFr;XAn Afganastáinr<UAIr=XAnguillar>UVIr?XOileáin na Maighdean S.A.M.r@UISrAX An ÍoslainnrBUIRrCX An IaráinrDUAMrEX An AirméinrFUALrGX An AlbáinrHUAOrIXAngólarJUANrKXAntillí na hÍsiltírerLUAQrMX An AntartaicerNU002rOX An AfraicrPU001rQX An DomhanrRUARrSX An AirgintínrTUAUrUX An AstráilrVUATrWX An OstairrXUAWrYXArúbarZUINr[XAn Indiar\UAXr]XOileáin Alaindr^U009r_X An Aigéiner`UAZraXAn AsarbaiseáinrbUIErcXÉirerdUIDreX An IndinéisrfUJOrgX An IordáinrhUQUriXAn tAontas EorpachrjUUArkX An ÚcráinrlUQArmXCatarrnUMZroX MósaimbícrpUQOrqXAn Aigéine ImeallachrruUdecimal_formatsrs}rtU date_formatsru}rv(Umediumrwh))rx}ry(h,X d MMM yyyyrzh.X%(d)s %(MMM)s %(yyyy)sr{ubUfullr|h))r}}r~(h,XEEEE d MMMM yyyyrh.X %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrh))r}r(h,X d MMMM yyyyrh.X%(d)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,X dd/MM/yyyyrh.X%(dd)s/%(MM)s/%(yyyy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUSRGrXSfrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUZWDrXZ$rUVUVrXVTrUUYUrXUr$rUSYPrXLSrUMZMrXMtrUSCRrXSRrUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUJMDrXJ$rUGELrXlarirUAFNrXAfrUTRLrXTLrUBDTrXTkrUYERrXYRlrUANGrXAÍ f.rUXCDrXEC$rUNOKrXNKrrUMXNrXMEX$rUBTNrXNurUCOPrXCol$rUIDRrXRprUHNLrXLrUFJDrXF$rUETBrXBrrUBZDrXBZ$rUDOPrXRD$rUQARrXQRrUSEKrXSKrrUAUDrXA$rUIEPrX£rUBBDr XBDS$r UGTQr XQr UVEBr XBerUCLPrXCh$rUALLrXlekrUKZTrXTrUTTDrXTT$rUOMRrXROrUSBDrXSI$rUPLNrXZlrUKESrXK ShrUGYDrXG$r UMKDr!XMDenr"UTWDr#XNT$r$UTOPr%XT$r&UGNFr'XGFr(UIQDr)XIDr*UBAMr+XKMr,UCADr-XCan$r.UCVEr/XCVEscr0UKWDr1XKDr2UBIFr3XFbur4USOSr5XSh.r6USGDr7XS$r8USTDr9XDbr:UIRRr;XRIr<UCNYr=XYr>UCYPr?X£Cr@UMTLrAXLmrBUNZDrCX$NZrDUKGSrEXsomrFUARSrGXArg$rHUSZLrIXErJUBHDrKXBDrLuU time_zonesrM}rN(U Etc/UnknownrO}rPUcityrQX AnaithnidrRsU Europe/DublinrS}rT(jQXBaile Átha CliathrUUshortrV}rWUdaylightrXXASÉrYsUlongrZ}r[jXXAm Samhraidh na hÉireannr\suU Europe/Londonr]}r^(jQXLondainr_jV}r`jXXASBrasjZ}rbjXXAm Samhraidh na BreatainercsuuUscriptsrd}re(UTelurfX TeileagúchrgUTamlrhXTamalachriUGururjX GurmúcachrkUHebrrlXEabhrachrmUZzzzrnX!Script Anaithnid nó NeamhbhailíroUCyrlrpX CoireallachrqUHrktrrXCatacánach nó HíreagánachrsUArmnrtX AirméanachruULatgrvX Cló GaelachrwUOgamrxXOghamryULatnrzX Laidineachr{UGothr|XGotachr}UEthir~X AetópachrUGujrrXGúisearátachrUKorerX CóiréachrUHangrX HangalachrUArabrXArabachrUZxxxrX Gan ScríobhrUOryarX OiríseachrUHansrXHan SímplitherUThairX TéallanachrUHantrXHan TraidisiúntarUMongrX MongólachrUDevarXDéiveanágrachrURunrrXRúnachrUHirarX HíreagánachrUHanirXHanrUBrairXBraillerUGrekrX GréagachrUMlymrX MailéalamachrUTibtrX TibéadachrUJpanrX SeapánachrUKanarX CatacánachrUBengrX BeangálachrUKndarX CannadachruUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UXXXrX$Airgeadra Anaithnid nó NeamhbhailírjXDínear na hAilgéirerjXDollar na NamaiberjXFranc ChomórarUBOPrXPeso na BolaiverUEGPrXPunt na hÉigipterjXLev Bulgárach CruarUBGNrXLev Nua BulgárachrUPABrXBalboa PanamachrUYUMrXNoviy Dinar IúgslavachrjXDollar SiombábachrUGHCrX Cedi GhánarUXBDrXAonad Cuntais Eorpach (XBD)rjX BolivianorUXBArXAonad Ilchodach EorpachrjXKrone DanmhargachrUXBCrXAonad Cuntais Eorpach (XBC)rUXBBrXAonad Airgeadaíochta EorpachrUBWPrXPula BotsuánachrjXPunt na LiobáinerjXScilling na TansáinerUVNDrXDong VítneamachrUAOArXKwanza AngólachrUWSTrXTala Samó ThiarrUAONrX Kwanza Nua Angólach (1990-2000)rjXRiel na CambóiderjXRinggit MalaeisiarUAOKrXKwanza Angólach (1977-1990)rj5XScilling na SómáilerUKYDrXDollar Oileáin CaymanrjX Dínear LibiarUUAHrXHryvnia ÚcránachrUUAKrXKarbovanetz ÚcránachrjXDínear IordánachrUAORrX'Kwanza Reajustado Angólach (1995-1999)rUSURrXRúbal SóvéadachrUAWGrX Guilder ArubarjX Riyal SádachrUFIMrXMarkka FionnlannachrjXDollar Hong CongrjXGuilder ShuranaimrUTPErXEscudo TíomóirrUMGFrXFranc MadagascarrUCHFrXFranc na hEilvéiserUGIPrXPunt GhiobráltairrjXRúbal BéalarúiseachrjX Lek AlbánachrUUGSrXScilling Uganda (1966-1987)rjXOuguiya na MaratáinerUBOVrXMvdol BolavachrUHRKrX Kuna CrótachrjXFranc DjiboutirUHRDrXDínear na CróiterUPESrX Sol PheiriúrUBYBr X&Rúbal Nua Béalarúiseach (1994-1999)r UITLr XLira Iodálachr UXAFr XCFA Franc BEACrUBNDrXDollar BhrúinérUISKrXKrona ÍoslannachrUZALrX$Rand na hAfraice Theas (airgeadúil)rjXPeso Uruguayo UraguarUNIOrXCordoba Oro NicearaguarULAKrX Kip LaosachrUNICrXCordoba NicearaguarjXRúipí NeipeáilrUMZErXEscudo MósaimbícerjX Punt SiriarjXDollar Iamácachr UFRFr!XFranc Francachr"UMAFr#XFranc Mharacór$jXMetical Mósaimbícer%UPHPr&XPeso Filipíneachr'jXRand na hAfraice Theasr(UGWPr)XPeso Guine-Bhissaur*ULUFr+XFranc Lucsamburgr,UBELr-XFranc Beilgeach (airgeadúil)r.UBECr/XFranc Beilgeach (inathraithe)r0UNGNr1XNaira Nígéarachr2UYUNr3XDínear Inathraithe Iúgslavachr4jXFranc Beilgeachr5UPLZr6XZloty Polannach (1950-1995)r7jXColon Chósta Rícer8jX Lira Turcachr9UDEMr:X Deutsche Markr;UEEKr<XKroon na hEastóiner=jXKwacha na Maláiver>jX+Dollar Oileáin na Tríonóide agus Tobágar?jXRúipí Srí Lancar@jXKoruna na SlóvaicerAj/XEscudo na Rinne VerderBjXRúipí na PacastáinerCjXForint UngárachrDjXLeu RómánachrEUXEUrFXAonad Airgeadra EorpachrGjXDollar BheirmiúdarHjX Rial OmainrIjX Loti LeosótarJULVRrKXRúbal LaitviachrLjXTugrik MongólachrMjXDram AirméanachrNUYUDrOXDínear Crua IúgslavachrPUBUKrQX Kyat BurmachrRjXScilling UgandarSjX Rial CatarachrTUXDRrUXCearta Speisialta TarraingtherVUNLGrWXGuilder ÍsiltíreachrXUGEKrYXKupon Larit na GrúiserZUMTPr[X Punt Maltachr\UGBPr]XPunt Steirlingr^jXLari na Grúiser_USHPr`XPunt San HéilinrajXAfgainírbjXDollar Oileáin SolomonrcUCSKrdXKoruna Crua na SeicslóvaicereUKPWrfXWon na Cóiré ThuaidhrgUAFArhXAfgainí (1927-2002)riUTHBrjXBaht na TéalainnerkjXTaka BhanglaidéiseachrlUGRDrmXDrachma GréagachrnjX Rial ÉiminroUDDMrpXOstmark na hOirGhearmáinerqUHTGrrXGourde HáitírsUXOFrtXCFA Franc BCEAOruUMGArvXAriary MadagascarrwjX"Guilder na nAntillí ÍsiltíreachrxULRDryXDollar na LibéirerzURWFr{X Franc Ruandar|jX Krone Ioruachr}UMXVr~X#Unidad de Inversion (UDI) MeicsiceorjXScilling CéiniachrUMOPrX Pataca MacaorUINRrX Rúipí IndiarjXPeso MeicsiceorUCZKrXKoruna Phoblacht na SeicerUTJSrXSomoni na TáidsíceastáinerUTJRrXRúbal na TáidsíceastáinerjXNgultrum BútánachrUYDDrXDínear ÉiminrUGWErXEscudo na Guine PortaingéalaírjXPeso na ColóimerUMURrXRúipí Oileán MhuirísrjXRupiah IndinéiseachrjXLempira HondúraisrjX CFP FrancrjXDollar FhidsírjXBirr na hAetóiperUPENrXSol Nuevo PheiriúrjXDollar na BeilíserUATSrXScilling OstarachrUILPrXPunt IosraelachrUZRNrXZaire Nua SáíreachrjXPeso DoimineacachrUTMMrXManat na An TuircméanastáinerUMDLrXLeu MoldóvachrUECVrX*Unidad de Valor Constante (UVC) EacuadóirrUECSrXSucre EacuadóirrUBSDrXDollar na mBahámaírjXKrona Sualannachrj%XPaʻanga TongarUPEIrX Inti PheiriúrUZMKrXKwacha SaimbiachrUMVRrXMaldive Islands RufiyaarjXDollar AstrálachrUADPrXPeseta AndórarUCUPrX Peso CúbarjXPunt ÉireannachrUCLFrXUnidades de Fomento na Silerj XDollar BharbadóisrUKRWrXWon na Cóiré TheasrUGMDrXDalasi Gaimbiarj XQuetzal Guatamalarj XBolivar VeiniséalarUSITrXTolar SlóvénachrUSDPrXPunt na SúdáinerjX Peso na SilerUEURrXEurorUCDFrXFranc Congolais an ChongórjXDollar Oirthear na CairiberjXTenge CasacstánachrURUBrXRúbal RúiseachrUXFUrXUIC-Franc FrancachrUBRRrXCruzeiro BrasaíleachrUBRNrXCruzado Novo BrasaíleachrUBRLrXReal BrasaíleachrUMMKrX Kyat MhaenmarrUUYPrXPeso Uragua (1975-1993)rURURrXRúbal Rúiseach (1991-1998)rjXZloty PolannachrUBRErX!Cruzeiro Brasaíleach (1990-1993)rUPYGrXGuarani PharaguarUBRCrXCruzado BrasaíleachrUBRBrX&Cruzeiro Novo Brasaíleach (1967-1986)rUSVCrXColon na SalvadóirerUAEDrX+Dirham Aontas na nÉimíríochtaí ArabacharUGNSrX Syli Guinerj!XDenar na MacadóinerUAZMrXManat Asarbaiseánachrj#XDollar Nua na TéaváinerUUSNrX"Dollar S.A.M. (an chéad lá eile)rUGQErX'Ekwele Guineana na Guine MeánchriosaírjX Vatu VanuatúrUBADrX Dínear Bhoisnia-Heirseagaivéinrj'X Franc GuinerUMXPrX!Peso Airgid Meicsiceo (1861-1992)rj)XDínear Irácachrj+X)Marc Inathraithe Bhoisnia-HeirseagaivéinrjXRúipí na Séiséilrj-XDollar CeanadarUSDDrXDínear na Súdáinerj?XPunt na CipirerUMADrXDirham Mharacórj1XDínear Cuátachrj3XFranc na BurúinerULTTrXTalonas LiotuánachrUPGKr XKina Nua-Ghuine Phapuar ULTLr XLita Liotuánachr j7XDollar Singeapóirr UUZSrXSum na hÚisbéiceastáinerj9XDobra Sao Tome agus PrinciperUXFOrXFranc Ór FrancachrUMLFrX Franc MhailírUESPrXPeseta Spáinneachrj;XRial IaránachrUZRZrXZaire Sáíreachrj=XYuan Renminbi SíneachrUSLLrXLeone Shiarra LeonrUTNDrXDínear na TúinéiserjXDollar na GuáinerjAX Lira Maltachr jCXDollar na Nua-Shéalainner!UFKPr"XPunt Oileáin Fháclainner#ULVLr$XLats Laitviachr%UUSSr&XDollar S.A.M. (an la céanna)r'UUSDr(X Dollar S.A.M.r)UARPr*XPeso na Airgintíne (1983-1985)r+jEXSom na Cirgeastáiner,jGXPeso na Airgintíner-UILSr.XSheqel Nua Iosraelachr/jIXLilangeni na Suasalainner0jKXDínear na Bairéiner1UJPYr2XYen Seapánachr3UARAr4XAustral Airgintíneachr5UPTEr6XEscudo Portaingélachr7UXAUr8XÓrr9uUmonthsr:}r;(U stand-aloner<}r=Unarrowr>}r?(KjJKXFr@KjKXArAKXBrBKjKXIrCKjK jK XDrDK XSrEK XNrFusUformatrG}rH(UwiderI}rJ(KXEanáirrKKXFeabhrarLKXMártarMKXAibreánrNKX BealtainerOKX MeitheamhrPKXIúilrQKXLúnasarRK XMeán FómhairrSK XDeireadh FómhairrTK XSamhainrUK XNollaigrVuU abbreviatedrW}rX(KXEanrYKXFeabhrZKXMártar[KXAibr\KXBealr]KXMeithr^KXIúilr_KXLúnr`K XMFómhraK XDFómhrbK XSamhrcK XNollrduuuUcurrency_formatsre}rfNcbabel.numbers NumberPattern rg)rh}ri(Uexp_precrjNUscalerkKU frac_precrlKKrmUsuffixrnXrojorpUint_precrqKKrrh,X ¤#,##0.00rsUprefixrtX¤ruX-¤rvrwUexp_plusrxNUgroupingryKKrzubsUdaysr{}r|(U stand-aloner}}r~Unarrowr}r(KjKjKjKjDKjAKjEKjDusUformatr}r(Uwider}r(KX Dé LuainrKX Dé MáirtrKX Dé CéadaoinrKX DéardaoinrKX Dé hAoinerKX Dé SathairnrKX Dé DomhnaighruU abbreviatedr}r(KXLuanrKXMáirtrKXCéadrKXDéarrKXAoinerKXSathrKXDomhruuuU meta_zonesr}rUGMTr}r(jV}rUstandardrXMAGrsUcommonrjZ}rjXMeán-Am GreenwichrsusUerasr}r(Uwider}r(KXRoimh ChríostrKX Anno DominiruU abbreviatedr}r(KXRCrKXADruuu.PK[J08GG*site-packages/babel/localedata/az_Cyrl.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}q(UruqX русҹаqUfrqXфрансызҹаqUenqXинҝилисҹәqUzhqX чинҹәqUptqXпортугалҹаq Udeq!Xалманҹаq"Uitq#Xиталјанҹаq$Uazq%XАзәрбајҹанq&Ujaq'Xјапонҹаq(Uesq)Xиспанҹаq*uU territoriesq+}q,(URUq-X Русијаq.UFRq/X Франсаq0UCNq1XЧинq2UDEq3XАлманијаq4UJPq5XЈапонијаq6UITq7XИталијаq8UUSq9X2Америка Бирләшмиш Штатларыq:UBRq;XБразилијаqUAZq?XАзәрбајҹанq@uUdecimal_formatsqA}qBU date_formatsqC}qDUcurrency_symbolsqE}qFUAZMqGXман.qHsU time_zonesqI}qJUscriptsqK}qLUvariantsqM}qNUnumber_symbolsqO}qPUcurrency_namesqQ}qRhGX манатqSsUmonthsqT}qUUformatqV}qWUwideqX}qY(KX јанварqZKX февралq[KXмартq\KX апрелq]KXмайq^KXијунq_KXијулq`KX августqaK XсентјабрqbK XоктјабрqcK X нојабрqdK X декабрqeussUcurrency_formatsqf}qgUdaysqh}qiUformatqj}qkUwideql}qm(KXбазар ертәсиqnKXчәршәнбә ахшамыqoKXчәршәнбәqpKXҹүмә ахшамыqqKXҹүмәqrKX шәнбәqsKX базарqtussU meta_zonesqu}qvUerasqw}qxu.PK[ʰ??-site-packages/babel/localedata/sr_Latn_ME.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q(UpatternqX HH.mm.ss vqUformatqX%(HH)s.%(mm)s.%(ss)s %(v)squbsU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q Ulongq!h)q"}q#(hX d.MM.yyyy.q$hX%(d)s.%(MM)s.%(yyyy)s.q%ubsUcurrency_symbolsq&}q'U time_zonesq(}q)Uscriptsq*}q+Uvariantsq,}q-Unumber_symbolsq.}q/Ucurrency_namesq0}q1Umonthsq2}q3Ucurrency_formatsq4}q5Ncbabel.numbers NumberPattern q6)q7}q8(Uexp_precq9NUscaleq:KU frac_precq;KKqh>q?Uint_precq@KKqAhX ¤ #,##0.00qBUprefixqCX¤ qDX-¤ qEqFUexp_plusqGNUgroupingqHKKqIubsUdaysqJ}qKU meta_zonesqL}qMUerasqN}qOu.PK[(site-packages/babel/localedata/fr_BE.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q(UpatternqXH 'h' mm 'min' ss 's' vqUformatqX!%(H)s h %(mm)s min %(ss)s s %(v)squbsU languagesq}qU territoriesq}q Udecimal_formatsq!}q"U date_formatsq#}q$Ushortq%h)q&}q'(hXd/MM/yyq(hX%(d)s/%(MM)s/%(yy)sq)ubsUcurrency_symbolsq*}q+U time_zonesq,}q-Uscriptsq.}q/Uvariantsq0}q1Unumber_symbolsq2}q3Ugroupq4X.q5sUcurrency_namesq6}q7Umonthsq8}q9Ucurrency_formatsq:}q;Udaysq<}q=U meta_zonesq>}q?Uerasq@}qAu.PK[?X(site-packages/babel/localedata/es_PA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqX MM/dd/yyyyqUformatqX%(MM)s/%(dd)s/%(yyyy)sq ubUshortq!h)q"}q#(hXMM/dd/yyq$hX%(MM)s/%(dd)s/%(yy)sq%ubuUcurrency_symbolsq&}q'U time_zonesq(}q)Uscriptsq*}q+Uvariantsq,}q-Unumber_symbolsq.}q/(Udecimalq0X.q1Ugroupq2X,q3uUcurrency_namesq4}q5Umonthsq6}q7Ucurrency_formatsq8}q9Udaysq:}q;U meta_zonesq<}q=Uerasq>}q?u.PK[yAn n %site-packages/babel/localedata/hu.datnu[}q(U zone_formatsq}qUgmtqXGMT%sqsUdatetime_formatsq}qNX{1} {0}qsUquartersq}q (U stand-aloneq }q Unarrowq }q (KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX I. negyedévqKX II. negyedévqKXIII. negyedévqKX IV. negyedévquU abbreviatedq}q(KXN1qKXN2qKXN3qKXN4quuuUperiodsq }q!(Uamq"Xde.q#Upmq$Xdu.q%uUscientific_formatsq&}q'Ncbabel.numbers NumberPattern q()q)}q*(Uexp_precq+KKq,Uscaleq-KU frac_precq.KKq/Usuffixq0Xq1h1q2Uint_precq3KKq4Upatternq5X#E0q6Uprefixq7h1X-q8q9Uexp_plusq:Ugroupingq;MMqU week_dataq?}q@(Umin_daysqAKU weekend_startqBKU first_dayqCKU weekend_endqDKuU time_formatsqE}qF(UmediumqGcbabel.dates DateTimePattern qH)qI}qJ(h5XH:mm:ssqKUformatqLX%(H)s:%(mm)s:%(ss)sqMubUfullqNhH)qO}qP(h5X H:mm:ss vqQhLX%(H)s:%(mm)s:%(ss)s %(v)sqRubUlongqShH)qT}qU(h5X H:mm:ss zqVhLX%(H)s:%(mm)s:%(ss)s %(z)sqWubUshortqXhH)qY}qZ(h5XH:mmq[hLX %(H)s:%(mm)sq\ubuU languagesq]}q^(Ugvq_X Man-szigetiq`UguqaX gudzsaratiqbUscnqcX szicíliaiqdUromqeXromaqfUalgqgXalgonkin nyelvqhUaleqiXaleutqjUscoqkXskótqlUmniqmXmanipuriqnUgdqoX skót gaelqpUgaqqXírqrUmnoqsX manobo nyelvqtUosaquXosageqvUgnqwXguaraniqxUaltqyX dél-altajiqzUglq{X galíciaiq|Umwrq}Xmarvariq~UtyqXtahitiqUtwqXtwiqUttqXtatárqUtrqXtörökqUtsqXcongaqUtnqX szecsuániqUtoqXtongaqUausqXausztrál nyelvekqUavqXavarqUtkqX türkménqUthqXthaiqUroaqX román nyelvqUtgqXtadzsikqUteqXteluguqUugaqXugaritiqUmwlqX mirandézqUkcgqXtyapqUsmiqX számi nyelvqUfatqXfantiqUfanqXfangqUwoqXvolofqUrmqX réto-románqUdinqXdinkaqUblaqXsiksikaqUcmcqX csam nyelvqUmlqX malajálamqUzhqXkínaiqUtemqXtemneqUen_CAqX kanadai angolqUnwcqXklasszikus newariqUzaqXzsuangqUcauqXegyéb kaukázusiqUzuqXzuluqUterqXterenoqUtetqXtetumqUmncqXmandzsuqUkutqXkutenaiqUsukqXszukumaqUkumqXkumükqUsusqXszuszuqUnewqXnevariqUsuxqXsumérqUdenqXszleviqUmenqXmendeqUmulqXtöbbszörös nyelvekqUlezqXlezgqUrootqXősiqUekaqXekadzsukqUakkqXakkádqUdraqXegyéb dravidaqUjrbqX zsidó-arabqUsgnqXjelnyelvqUsgaqXóírqUapaqX apacs nyelvekqUbraqXbrajqUchbqXcsibcsaqUchgqX csagatájqUchkqXcsukézqUchmqXmariqUchnqXcsinuk zsargonqUchoqXcsoktóqUchpqXcsipevéqUchrqXcserokiqUchyqXcsejenqUtiqXtigrinjarUvotrXvotjákrUmgrXmálgasrUibarXibanrUmorXmoldvairUmnr Xmongolr Umir Xmaorir Umhr X marshallirUmkrXmacedónrUmtrXmáltairUcairXegyéb közép-amerikai indiánrUdelrXdelavárrUmsrXmalájrUmrrXmarathirUtarXtamilrUmyrXburmairUcadrXcaddor Usrnr!X sranai tongor"Utair#X thai nyelvr$Uafhr%Xafrihilir&Usitr'Xsinotibeti nyelvr(Uenmr)X közép angolr*Uen_AUr+Xausztrál angolr,Unynr-Xnyankoler.Unyor/Xnyoror0Unymr1X nyamvézir2Usior3X sziú nyelvekr4Umapr5X ausztronézr6Umasr7Xmasair8Ulahr9Xlahndar:Uladr;Xladinor<Ufyr=Xfrízr>Usnkr?Xszoninker@UfarAXperzsarBUmadrCXmadurairDUmagrEXmagahirFUmairGXmaithilirHUfirIXfinnrJUfjrKXfidzsirLUmanrMXmandingorNUegyrOX óegyiptomirPUzndrQXzanderRUssrSX sziszuatirTUsrrUXszerbrVUsqrWXalbánrXUswrYX szuahélirZUsvr[Xsvédr\Usur]X szundanézr^Ustr_X szeszotór`UskraXszlovákrbUsircX szingalézrdUshreX szerbhorvátrfUsorgX szomáliairhUsnriXsonarjUsmrkXszamoairlUslrmXszlovénrnUscroX szardíniairpUsarqX szanszkritrrUsgrsXsangortUseruXészaki számirvUsdrwXszindhirxUzenryXzenagarzUkbdr{Xkabardir|Uafar}Xafroázsiai nyelvr~UcsbrXkasubrUlgrXgandarUlbrX luxemburgirUfiurXfinnugor nyelvrUlnrXlingalarUlorXlaoszirUlirXlimburgirUbynrXblinrUltrXlitvánrUlurX luba-katangarUfilrX filippínórUyirXjiddisrUnonrX óskandinávrUcebrXcebuirUyorXjorubarUnogrXnogajrUbatrX balti nyelvrUdakrXdakotarUdarrXdargvarUdayrXdajakrUssarXnílusi-szaharai nyelvrUkperXkpellerUelrXgörögrUeorX eszperantórUenrXangolrUlamrXlambarUeerXeverUmdfrXmoksánrUfrrXfranciarUmdrrXmandarrUetrXésztrUesrXspanyolrUrurXoroszrUgonrXgondirUgohrXófelső németrUsmsrX skolt számirUsmnrX inar samirUsmjrX lule számirUde_ATrXosztrák németrUgotrXgótrUrnrXkirundirUrorXrománrUdsbrX alsó szorbrUsmarX déli számirUgorrX gorontalorUastrXasztúrrUwalrXvalamorUcrhrX krími tatárrUathrXatapaszkan nyelvekrUgezrXgeezrUxhrXhoszarUffrXfulanirUkforXkororUmakrXmakaszarrUzaprXzapotékrUkokrXkonkanirUzxxrXnincs nyelvészeti tartalomrUkosrXkosreirUforXferöerirUtogrX nyasa tongarUhuprXhuparUudmrXudmurtrUbejrXbedzsarUbemrXbembarUtsirX csimsiánirUberrXberberrUnzirXnzimarUsairXdél-amerikai indián nyelvrUangrXóangolrUprar Xprakrit nyelvekr Ubhor X bodzspurir Usalr X szelis nyelvrUprorX óprovánszirUrajrX radzsasztánirUsadrXszandaverUanprXangikarUes_419rXlatin-amerikai spanyolrUraprXrapanuirUsasrXsasakrUnqorXn'korUcarrXkaribr Uminr!X minangkabaur"Umicr#Xmikmakr$Uefir%Xefikr&Uarnr'Xaraucanir(Uypkr)X jupik nyelvr*Umisr+Xegyéb nyelvekr,Ukacr-Xkacsinr.Ukabr/Xkabijer0Ukaar1X kara-kalpakr2Ukajr3Xjjur4Ukamr5Xkambar6Ukarr7Xkarenr8Ukawr9Xkawir:Ufr_CHr;Xsvájci franciar<Utyvr=Xtuvair>Ufr_CAr?Xkanadai franciar@UkarAXgrúzrBUdoirCXdogrirDUkgrEXkongorFUkkrGXkazahrHUkjrIXkuanyamarJUkirKXkikujurLUkorMXkoreairNUknrOXkannadarPUkmrQX kambodzsairRUklrSX grönlandirTUksrUX kásmírirVUkrrWXkanurirXUkwrYXkornirZUkvr[Xkomir\Ukur]Xkurdr^Ukyr_Xkirgizr`UtklraXtokelauirbUbuarcXburjátrdUmgareX közép írrfUhitrgXhittiterhUdyuriXdiularjUderkXnémetrlUdarmXdánrnUdzroXbutánirpUluirqXluisenorrUdvrsXdivehirtUhilruX hiligajnonrvUhimrwX himahálirxUgemryX germán nyelvrzUcrpr{Xkreol és pidzsinr|Uqur}Xkecsuar~UbasrXbaszarUgbarXgbajarUbadrXbandarUbanrXbalinézrUbalrXbalucsirUshnrXsanrUbairXbamileke nyelvekrUarprXarapahorUartrXmesterséges nyelvrUarwrXaravakrUarcrXarámirUen_USrXamerikai angolrUsemrXegyéb szemitarUselrXszölkuprUnubrX núbiai nyelvrUbtkrXbatakrUlusrXlushairUmusrXkríkrUluarX luba-luluarUirorXirokéz nyelvekrUirarXiránirUmunrX munda nyelvekrUlunrXlundarUluorXluorUwarXvallonrUtuprX tupi nyelvrUjvrXjávairUzblrXBliss jelképrendszerrUtutrX altáji nyelvrUtumrXtumbukarUjarXjapánrUcoprXkoptrUilorXilokorUlarXlatinrUgwirXgvicsinrUundrX#ismeretlen vagy érvénytelen nyelvrUtlirXtlingitrUtlhrXklingonrUchrXcsamororUcorXkorzikairUcarXkatalánrUcerXcsecsenrUponrXpohnpeirUcyrXwalesirUsahrXjakutrUcsrXcsehrUcrrXkrírUbntrXbanturUcvrXcsuvasrUcurXegyházi szlávrUlvrXlettrUdumrXközép hollandrUptrX portugálrUduarXdualarUfrorX ófranciarUyaprXjapirUfrmrXközép franciarUtivrXtivrUfrsrX keleti frízrUfrrrX északi frízrUyaorXjaórUparX pandzsábirUxalrXkalmükrUes_ESrXibériai spanyolrUpirXpalirUen_GBrX brit angolrUgayrXgajorUotorX otomi nyelvrUotarXottomán törökrUhmnr Xhmongr Umyvr Xerzjányr Ugaar XgarUfurrXfriulirUkhirXegyéb koiszanrUainrXainurUrarrX rarotongairUslarX szláv nyelvrUverXvendarUvirX vietnámirUisrXizlandirUkhorXkotanézr Uiur!X inuktitutr"Uitr#Xolaszr$Uvor%Xvolapükr&Uiir'X szecsuán jir(Uikr)Xinupiakr*Uior+Xidor,Uiner-Xindoeurópai nyelvr.Uiar/X interlingvar0Ujprr1X zsidó-perzsar2Uier3X interlinguer4Uidr5Xindonézr6Uigr7Xigbor8Upapr9X papiamentor:Uewor;Xevondor<Upaur=Xpalauir>Upaar?X pápuai nyelvr@UpagrAX pangaszinanrBUsatrCX szantálirDUpalrEXpahlavirFUpamrGX pampanganrHUsycrIXklasszikus szírrJUphirKXFülöp-szigeteki nyelvrLUcelrMX egyéb keltarNUphnrOX főniciairPUnicrQXniger-kordofan nyelvrRUniarSXniasrTUdgrrUXdogribrVUsyrrWXszíriairXUniurYXniuirZUgswr[Xsvájci németr\Ucchr]Xatszamr^Ujbor_Xlojbanr`UnahraXnahuatirbUsamrcXszamaritánus arámirdUhaireXhaidarfUgmhrgXközép felső németrhUcusriX kusita nyelvrjUwenrkX szorb nyelvekrlUadyrmXadyghernUelxroXelamitrpUadarqXadangmerrUpt_PTrsXibériai portugálrtUhawruXhawaiirvUbinrwXbinirxUbikryXbikolrzUpt_BRr{Xbrazíliai portugálr|Umosr}Xmoszir~UmohrXmohawkrUtlrXtagalogrUzh_HansrXegyszerűsített kínairUzh_HantrXhagyományos kínairUtvlrXtuvalurUijorXidzsorUkmbrXkimbundurUpeorXóperzsarUumbrXumbundurUtmhrXtamasekrUfonrXfonrUhsbrX felső szorbrUberXbeloruszrUbgrXbolgárrUbarXbaskírrUpsrXpasturUbmrXbambararUbnrXbengálirUborXtibetirUbhrXbiharirUbirXbislamarUbrrXbretonrUbsrXbosnyákrUruprXarománrUzzarXzazarUomrXoromóirUojrXojibvarUacerXachinézrUachrXakolirUocrX okszitánrUkrurXkuruhrUsrrrXszererrUkrorXkrurUkrlrXkarelairUkrcrXkaracsáj-balkárrUndsrX alsónémetrUosrXoszétrUorrXorijarUsogrXsogdienrUnsorX északi szotorUsonrXszongairUde_CHrXsvájci felnémetrUvairXvairUwakrX vakas nyelvrUlolrXmongorUmkhrXegyéb mon-khmerrUawarXawádirUlozrXlozirUgilrX ikiribatirUwasrXvasorUwarrXvaraórUhzrXhererorUhyrXörményrUanrX aragonézrUsidrXszidamórUhrrXhorvátrUhtrXhaitirUhurXmagyarrUhirXhindirUhorX hiri moturUharXhauszarUbugrXbuginézrUherXhéberrUuzrXüzbégrUurrXurdurUplrXlengyelrUukrXukránrUugrXujgurrUaarXafarrUabr Xabházr Uaer X avesztánr Uafr X afrikaansrUakrXakanrUamrXamhararUnl_BErXflamandrUeurXbaszkrUasrXasszámirUarrXarabrUinhrXingusrUtpirX tok pisinrUmynrX maja nyelvekr Uayr!Xajmarar"Ukhar#Xkaszir$Uazr%Xazerbajdzsánir&Uincr'X egyéb indiair(Unlr)Xhollandr*Unnr+Xnorvég nynorskr,Unor-Xnorvégr.Unar/Xnauruir0Unbr1Xnorvég bokmálr2Unair3Xészak-amerikai indián nyelvr4Undr5Xészaki ndebeler6Uner7Xnepálir8Ungr9Xndongar:Unyr;Xnyanjar<Unapr=Xnápolyir>Ugrbr?Xgrebor@UgrcrAX ógörögrBUnrrCX déli ndebelerDUtigrEXtigrérFUnvrGXnavahorHUzunrIXzunirJUrwrKXkiruandarLUcperMX$egyéb angol alapú kreol és pidginrNUcpfrOX&egyéb francia alapú kreol és pidginrPUcpprQX"portugál alapú kreol vagy pidginrRuU territoriesrS}rT(UBDrUX BangladesrVUBErWXBelgiumrXUBFrYX Burkina FasorZUBGr[X Bulgáriar\UVEr]X Venezuelar^UBAr_XBosznia-Hercegovinar`UBBraXBarbadosrbUWFrcXWallis és FutunardUBLreXSaint BarthélemyrfUBMrgXBermudarhUBNriXBruneirjUBOrkXBolíviarlUBHrmXBahreinrnUBIroXBurundirpUBJrqXBeninrrUBTrsXBhutánrtU011ruX Nyugat-AfrikarvUBVrwX Bouvet-szigetrxUBWryXBotswanarzU014r{X Kelet-Afrikar|U015r}X Észak-Afrikar~UBRrX BrazíliarU017rXKözép-AfrikarU018rXAfrika déli részerU019rXAmerikarUBYrXFehéroroszországrUBZrXBelizerULVrX LettországrURWrXRuandarURSrXSzerbiarUTLrX Kelet-TimorrURErXReunion (francia)rUTMrXTürkmenisztánrUOMrXOmánrUTJrXTadzsikisztánrUROrXRomániarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX+Dél Grúzia és a Déli Szendvics-szigetekrUGRrXGörögországrUGQrXEgyenlítői-GuinearUGPrX GuadelouperUJPrXJapánrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXFrancia GuyanarUGErXGrúziarUGDrXGrenadarU021rXAmerika északi részerUGBrXEgyesült KirályságrUGArXGabonrUSVrXSalvadorrUGNrXGuinearUGMrXGambiarUGLrX GrönlandrU029rXKarib-térségrUGIrX GibraltárrUGHrXGhánarUJErXJerseyrUTNrXTunéziarUJMrXJamaicarU013rXKözép-AmerikarUWSrXSzamoarU419rX"Latin-Amerika és a Karib-térségrUHRrXHorvátországrUBSrXBahamákrUHTrXHaitirUHUrX MagyarországrUHKrXHongkong S.A.R, KínarU039rX Dél-EuróparUHNrXHondurasrUFIrX FinnországrU142rXÁzsiarU030rX Kelet-ÁzsiarU034rX Dél-ÁzsiarU035rXDélkelet-ÁzsiarUPRrX Puerto RicorUPSrXPalesztin TerületrU830rXCsatorna-szigetekrUFKrXFalkland-szigetekrUIOrXBrit Indiai OceánrUPWrXPalaurUPTrX PortugáliarUSJrXSvalbard és Jan MayenrUMDrXMoldovarUFMrX MikronéziarUIQrXIrakrUPAr XPanamar UPFr XFrancia Polinéziar UPGr XPápua Új-GuinearUPErXPerurUPKrX PakisztánrUPHrXFülöp-szigetekrUFOrXFeröer-szigetekrUPNrXPitcairn-szigetrUPLrXLengyelországrUPMrXSaint Pierre és MiquelonrUZMrXZambiarUEHrXNyugat-Szaharar URUr!X Oroszországr"UEEr#X Észtországr$UEGr%XEgyiptomr&UZAr'X Dél-Afrikar(UECr)XEcuadorr*UITr+X Olaszországr,UVNr-XVietnamr.UZZr/X%Ismeretlen vagy érvénytelen körzetr0USBr1XSalamon-szigetekr2UETr3XEtiópiar4USOr5X Szomáliar6UZWr7XZimbabwer8USAr9XSzaúd-Arábiar:UESr;XSpanyolországr<UERr=XEritrear>UMEr?X Montenegrór@UAQrAX AntarktiszrBUMGrCX MadagaszkárrDUMFrEX Saint MartinrFUMArGXMarokkórHUMCrIXMonacorJUUZrKX ÜzbegisztánrLUMMrMXMianmarrNUMLrOXMalirPUMOrQXMacao S.A.R., ChinarRUMNrSX MongóliarTUHMrUXHeard és McDonald SzigetekrVUASrWXAmerikai SzamoarXUMKrYX MacedóniarZUMUr[X Mauritiusr\UMTr]XMáltar^UMWr_XMalawir`UMVraXMaldív-szigetekrbUMQrcX MartiniquerdUMPreXÉszaki Mariana-szigetekrfUMSrgX MontserratrhUMRriX MauritániarjUIMrkX Man-szigetrlUUGrmXUgandarnUTZroX TanzániarpUMYrqXMalajziarrUMXrsXMexikórtUILruXIzraelrvUFRrwXFranciaországrxUAWryXArubarzUDOr{XDominikai Köztársaságr|USHr}X Szent Helenar~UVCrXSaint Vincent és GrenadinesrU054rX MelanéziarUDJrXDzsibutirUFJrXFidzsirU057rXMikronéziai régiórU172rX Független Államok KözösségerU053rXAusztrália és Új-ZélandrUNIrX NicaraguarUNLrX HollandiarUNOrX NorvégiarUNArXNamíbiarUVUrXVanuaturUNCrXÚj-KaledóniarUNErXNigerrUNFrXNorfolk-szigetrUNGrXNigériarUNZrX Új-ZélandrUNPrXNepálrUNRrXNaururUNUrXNiuerU061rX PolinéziarUCIrXElefántcsontpartrUCHrXSvájcrUCOrXKolumbiarUCNrXKínarUCMrXKamerunrUCLrXChilerUCCrXKókusz (Keeling)-szigetekrUCArXKanadarUCGrXKongórUCFrXKözép-afrikai KöztársaságrUCDrX#Kongó, Demokratikus köztársaságrUCZrX CsehországrUCYrXCiprusrUCXrXKarácsony-szigetekrUCSrXSzerbia és MontenegrórUCRrX Costa RicarUPYrXParaguayrUCVrXZöld-foki KöztársaságrUCUrXKubarUSZrX SzváziföldrUSYrXSzíriarUKGrX KirgizisztánrUKErXKenyarUSRrXSurinamerU143rXKözép-ÁzsiarUKHrX KambodzsarUKNrXSaint Kitts és NevisrUKMrXComore-szigetekrUSTrXSão Tomé és PrínciperUSKrX SzlovákiarUKRrX Dél-KorearUSIrX SzlovéniarUKPrX Észak-KorearUKWrXKuvaitrUSNrX SzenegálrUSMrX San MarinorUSLrX Sierra LeonerUSCrXSeychelle-szigetekrUKZrX KazahsztánrUKYrXKajmán-szigetekrUSGrX SzingapúrrUSErX SvédországrUSDrXSzudánrU151rX Kelet-EuróparU150rXEuróparUDMrXDominikarU155rXNyugat-EuróparU154rXÉszak-EuróparUVGr XBrit Virgin-szigetekr UDEr X Németországr UYEr XJemenrUMHrXMarshall-szigetekrU062rXDélközép-ÁzsiarUDZrXAlgériarUUSrXEgyesült ÁllamokrUUYrXUruguayrUYTrXMayotterUUMrX"Amerikai Csendes-óceáni SzigetekrULBrXLibanonrULCrX Santa Luciar ULAr!XLaoszr"UTVr#XTuvalur$UTWr%XTajvanr&UTTr'XTrinidad és Tobagor(UTRr)XTörökországr*ULKr+X Srí Lankar,ULIr-X Liechtensteinr.UCKr/X Cook-szigetekr0UTOr1XTongar2ULTr3X Litvániar4ULUr5X Luxemburgr6ULRr7XLibériar8ULSr9XLesothor:UTHr;X Thaiföldr<UTFr=XFrancia Déli Területekr>UTGr?XTogor@UTDrAXCsádrBUTCrCXTurks- és Caicos-szigetekrDULYrEXLíbiarFUVArGXVatikánrHU145rIX Nyugat-ÁzsiarJUAErKXEgyesült Arab EmirátusrLUADrMXAndorrarNUAGrOXAntigua és BarbudarPUAFrQX AfganisztánrRUAIrSXAnguillarTUVIrUXAmerikai Virgin-szigetekrVUISrWXIzlandrXUIRrYXIránrZUAMr[XÖrményországr\UALr]XAlbániar^UAOr_XAngolar`UANraXHolland AntillákrbU003rcXÉszak-AmerikardU002reXAfrikarfU001rgXVilágrhUARriX ArgentínarjUAUrkX AusztráliarlUATrmXAusztriarnU005roX Dél-AmerikarpUINrqXIndiarrUAXrsXAland-szigetekrtU009ruX ÓceániarvUAZrwX AzerbajdzsánrxUIEryX ÍrországrzUIDr{X Indonéziar|UJOr}X Jordániar~UQUrXEurópai UniórUUArXUkrajnarUQArXKatarrUDKrXDániarUMZrXMozambikrUQOrXKülső-ÓceániaruUdecimal_formatsr}rNh()r}r(h+Nh-Kh.KKrh0h1h1rh3KKrh5X #,##0.###rh7h1h8rh:Nh;KKrubsU date_formatsr}r(UmediumrhH)r}r(h5X yyyy.MM.dd.rhLX%(yyyy)s.%(MM)s.%(dd)s.rubUfullrhH)r}r(h5X yyyy. MMMM d.rhLX%(yyyy)s. %(MMMM)s %(d)s.rubUlongrhH)r}r(h5X yyyy. MMMM d.rhLX%(yyyy)s. %(MMMM)s %(d)s.rubUshortrhH)r}r(h5X yyyy.MM.dd.rhLX%(yyyy)s.%(MM)s.%(dd)s.rubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUZWDrXZ$rUVUVrXVTrUUYUrXUr$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUGELrXlarirUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUJMDrXJ$rUTTDrXTT$rUAFNrXAfrUTRLrXTLrUBDTrXTkrUYERr XYRlr UANGr XNA f.r UXCDr XEC$rUNOKrXNKrrUMXNrXMEX$rUBTNrXNurUCOPrXCol$rUIDRrXRprUHNLrXLrUFJDrXF$rUETBrXBrrUBZDrXBZ$r UDOPr!XRD$r"UQARr#XQRr$USEKr%XSKrr&USRGr'XSfr(UIEPr)XIR£r*UBBDr+XBDS$r,UGTQr-XQr.UVEBr/XBer0UCLPr1XCh$r2UALLr3Xlekr4UKZTr5XTr6UOMRr7XROr8USBDr9XSI$r:UPLNr;XZlr<UKESr=XK Shr>UGYDr?XG$r@UMKDrAXMDenrBUTWDrCXNT$rDUGNFrEXGFrFUIQDrGXIDrHUBAMrIXKMrJUSCRrKXSRrLUCADrMXCan$rNUCVErOXCVEscrPUKWDrQXKDrRUBIFrSXFburTUSOSrUXSh.rVUSGDrWXS$rXUSTDrYXDbrZUIRRr[XRIr\UCNYr]XYr^UCYPr_X£Cr`UMTLraXLmrbUNZDrcX$NZrdUKGSreXsomrfUARSrgXArg$rhUSZLriXErjUBHDrkXBDrluU time_zonesrm}rn(UAtlantic/Canaryro}rpUcityrqXKanári-szigetekrrsU Europe/Minskrs}rtjqXMinszkrusU Europe/Lisbonrv}rwjqX LisszabonrxsUAmerica/Meridary}rzjqXMéridar{sUEurope/Copenhagenr|}r}jqX Koppenhágar~sUAmerica/St_Luciar}rjqX St. LuciarsUAsia/Singaporer}rjqX SzingapúrrsUEurope/Simferopolr}rjqX SzimferopolrsUAmerica/Maceior}rjqXMaceiórsU Asia/Magadanr}rjqXMagadánrsUAfrica/Djiboutir}rjqXDzsibutirsU Asia/Kashgarr}rjqXKasgárrsU Asia/Urumqir}rjqXÜrümqirsU Europe/Moscowr}rjqXMoszkvarsUAmerica/El_Salvadorr}rjqXSalvadorrsUEurope/Podgoricar}rjqX MontenegrórsUAsia/Pyongyangr}rjqX Észak-KorearsUEurope/Brusselsr}rjqX BrüsszelrsUAsia/Ulaanbaatarr}rjqX UlánbátorrsUIndian/Maldivesr}rjqXMaldív-szigetekrsU Europe/Parisr}rjqXPárizsrsU Pacific/Fijir}rjqXFidzsirsU Europe/Athensr}rjqXAthénrsU Pacific/Trukr}rjqX Truk-szigetekrsUAmerica/Mexico_Cityr}rjqX MexikóvárosrsUPacific/Chathamr}rjqXChatham-szigetekrsUPacific/Midwayr}rjqXMidway-szigetekrsU Europe/Zurichr}rjqXZürichrsUAmerica/Cordobar}rjqXCórdobarsU America/Belemr}rjqXBelémrsU Europe/Romer}rjqXRómarsUPacific/Kosraer}rjqXKosrae-szigetekrsU Europe/Warsawr}rjqXVarsórsUAsia/Krasnoyarskr}rjqX KrasznojarszkrsUAsia/Yekaterinburgr}rjqXJekatyerinburgrsUAmerica/Araguainar}rjqX AraguaínarsU Asia/Tehranr}rjqXTeheránrsUAmerica/St_Thomasr}rjqX St. ThomasrsUPacific/Majuror}rjqXMajuro-zátonyrsUAtlantic/Cape_Verder}rjqXZöld-Foki SzigetekrsUAmerica/Mazatlanr}rjqX MazatlánrsU Asia/Macaur}rjqXMakaórsUEurope/Belgrader}rjqXSzerbiarsUAsia/Choibalsanr}rjqX CsojbalszanrsU Europe/Kievr}rjqXKijevrsU Europe/Samarar}rjqXSzamararsUAmerica/Jamaicar}rjqXJamaikarsUAmerica/Danmarkshavnr}rjqX Danmarks HavnrsUAmerica/Scoresbysundr}rjqXScoresby SoundrsUAmerica/Eiruneper}rjqX EirunepérsU Asia/Baghdadr}rjqXBagdadrsU Asia/Sakhalinr }r jqXSzahalinr sUAmerica/Argentina/Rio_Gallegosr }r jqX Río GallegosrsU Pacific/Waker}rjqX Wake-szigetrsUPacific/Gambierr}rjqXGambier-szigetekrsUEurope/Volgogradr}rjqX VolgográdrsUEurope/Uzhgorodr}rjqXUngvárrsUPacific/Ponaper}rjqXPonape-szigetekrsU Asia/Aqtaur}rjqXAktaur sUAmerica/Sao_Paulor!}r"jqX São Paulor#sUAmerica/Belizer$}r%jqXBelizr&sUPacific/Pitcairnr'}r(jqXPitcairn-szigetekr)sU Asia/Tashkentr*}r+jqXTaskentr,sU Asia/Tokyor-}r.jqXTokior/sUPacific/Easterr0}r1jqXHúsvét-szigetekr2sU Asia/Jakartar3}r4jqX Dzsakartar5sUPacific/Kiritimatir6}r7jqXKiritimati-szigetr8sUAtlantic/South_Georgiar9}r:jqX Dél-Georgiar;sUAtlantic/Madeirar<}r=jqX madeirai időr>sUEurope/Istanbulr?}r@jqX IsztanbulrAsU Asia/IrkutskrB}rCjqXIrkutszkrDsUAntarctica/VostokrE}rFjqXVosztokrGsUEurope/BucharestrH}rIjqXBukarestrJsUEurope/ZaporozhyerK}rLjqX ZaporozsjerMsU Europe/MaltarN}rOjqXMáltarPsU Asia/AnadyrrQ}rRjqXAnadirrSsUEurope/GibraltarrT}rUjqX GibraltárrVsUAmerica/Porto_VelhorW}rXjqX Pôrto VelhorYsUPacific/GalapagosrZ}r[jqXGalapagos-szigetekr\sU Asia/Aqtober]}r^jqXAktöber_sUEurope/Vilniusr`}rajqXVilniuszrbsUPacific/Kwajaleinrc}rdjqXKwajalein-zátonyresU Asia/Yerevanrf}rgjqXJerevánrhsU Africa/Cairori}rjjqXKairórksUAmerica/Cuiabarl}rmjqXCuiabárnsUPacific/Tarawaro}rpjqX tarawai időrqsUAmerica/Rio_Brancorr}rsjqX Río BrancortsUAmerica/Cancunru}rvjqXCancúnrwsUAsia/Vladivostokrx}ryjqX VlagyivosztokrzsUAsia/Vientianer{}r|jqXLaoszr}sUAmerica/Havanar~}rjqXHavannarsU Asia/Kuwaitr}rjqXKuvaitrsU Asia/Makassarr}rjqXMakasarrsUAsia/Qyzylordar}rjqX KizilordarsUAmerica/Argentina/Tucumanr}rjqXTucumánrsUAtlantic/Azoresr}rjqXAzori-szigetekrsUAsia/Chongqingr}rjqX CsungkingrsU Asia/Shanghair}rjqXSanghajrsUAmerica/St_Kittsr}rjqX St. KittsrsUAmerica/Godthabr}rjqXGodthåbrsU Asia/Beirutr}rjqXBejrútrsU Asia/Bahrainr}rjqXBahreinrsUAsia/Kamchatkar}rjqX KamcsatkarsUEurope/Kaliningradr}rjqX KalinyingrádrsU Africa/Tunisr}rjqXTuniszrsU Asia/Damascusr}rjqX DamaszkuszrsU Asia/Qatarr}rjqXKatarrsUAmerica/North_Dakota/Centerr}rjqXKözépső, Észak-DakotarsU Asia/Yakutskr}rjqXJakutszkrsUAmerica/Barbadosr}rjqX BarbadoszrsU Asia/Omskr}rjqXOmszkrsU Asia/Almatyr}rjqXAlma-AtarsUAsia/Novosibirskr}rjqX NovoszibirszkrsUAmerica/St_Vincentr}rjqX St. VincentrsUPacific/Marquesasr}rjqXMarquesas-szigetekrsU Europe/Viennar}rjqXBécsrsU Asia/Taipeir}rjqXTajvanrsU Europe/Sofiar}rjqXSzófiarsUAmerica/Dominicar}rjqXDominikarsUAsia/Samarkandr}rjqX SzamarkandrsUAmerica/Montrealr}rjqX MontréalrsUEurope/Luxembourgr}rjqX LuxemburgrsU Etc/Unknownr}rjqX ismeretlenrsUAmerica/Anchorager}rjqXanchorage-i időrsU Asia/Seoulr}rjqX Dél-KorearsUAntarctica/South_Poler}rjqX Déli-sarkrsuUscriptsr}r(UZsymrX SzimbólumrUGururXGurmukirUHebrrXHéberrUZzzzrX,Ismeretlen vagy érvénytelen írásrendszerrUPhnxrX FőniciairUMoonrXMoonrUSamrrX SzamaritánrUChamrXCsámrUArabrXArabrUGujrrX GudzsarátirUZxxxr XÍratlan nyelvek kódjar ULycir XLíciair USinhr X Szingalézr UTalur X Új tai luer UMongr XMongolr UXpeor XÓperzsar UVispr XLátható beszédr URjngr XRedzsangr UOlckr XOl chikir UTaler XTai Ler UMandr XMandair UManir X Manichaeanr UMlymr X Malajálamr UTibtr XTibetir UKalir XKajah lir UJpanr XJapánr UPlrdr XPollard fonetikusr! UKanar" XKatakanar# ULydir$ XLídiair% ULepcr& XLepchar' USundr( X Szundanézr) UYiiir* XJir+ UJavar, XJávair- UOryar. XOriyar/ ULaoor0 XLaor1 UUgarr2 XUgarir3 UCyrlr4 XCirillr5 UVaiir6 XVair7 UArmnr8 XÖrményr9 UCyrsr: XÓegyházi szláv cirillr; UKhmrr< XKhmerr= UArmir> XArámir? USylor@ XSylheti nagárirA UItalrB X Régi olaszrC USgnwrD X JelírásrE UXsuxrF XÉkírásos suméro-akkádrG UThaarH XThaanarI UThairJ XThairK UCprtrL XCiprusirM ULinbrN X Lineáris BrO ULinarP X Lineáris ArQ UOsmarR XOszmánrS USaurrT X SzaurastrarU UHirarV XHiraganarW UHanirX XHanrY UEgydrZ XEgyiptomi demotikusr[ UQaair\ XSzármaztatottr] UEgyhr^ XEgyiptomi hieratikusr_ UCansr` X"Egyesített kanadai őslakos jelekra UEgyprb XEgyiptomi hieroglifákrc UZmthrd XMatematikai jelrendszerre UTfngrf XBerberrg UShawrh X Shaw ábécéri UCirtrj XCirtrk UGeorrl XGrúzrm UTengrn XTengwarro UHrktrp XKatakana vagy hiraganarq UGeokrr X Grúz kucsurirs UTavtrt XTai vietru UOgamrv XOghamrw UDsrtrx XDeseretry UGothrz XGótr{ UHanor| XHanunoor} UBalir~ XBalinézr UKorer XKoreair UHangr XHangulr UCarir XKarir UAvstr X Avesztánr UTagbr XTagbanwar UHansr XEgyszerűsített Hanr UHantr XHagyományos Hanr URoror X Rongorongor UDevar X Devanagárir UIndsr XIndusr UBopor XBopomofor UMymrr XBurmair UTglgr XTagalogr UPermr X Ópermikusr UBugir XBuginézr UPhagr XPhags-par UBrair X Vakírásr UBrahr XBrámir UBatkr XBatakr UMeror X Meroitikusr ULimbr XLimbur UMteir X Meitei mayekr UPhlir XFelriatos pahlavir UTelur XTelugur UTamlr XTamilr USarar XSzaratir UPhlpr XPsalter pahlavir ULatgr X Gael latinr ULatfr X Fraktur latinr UKharr X Kharoshthir UNkoor XN'kor UPhlvr XKönyv pahlavir ULatnr XLatinr UMayar XMaja hieroglifákr ULanar XLannar UEthir XEtiópr UKthir XKaithir UHmngr X Pahawh hmongr UBuhdr XBuhidr UCoptr XKoptr UPrtir XFeliratos parthianr UGlagr X Glagolitikusr URunrr XRunikusr UOrkhr XOrhonr UCakmr XCsakmar UHungr XÓmagyarr UGrekr XGörögr UCherr XCserokir UZyyyr XMeghatározatlanr USyrcr XSzíriair UBlisr XBliss jelképrendszerr UBengr XBengálir USyrer XEstrangelo szíriair USyrjr XNyugat-szíriair USyrnr XKelet-szíriair UKndar XKannadar uUvariantsr }r (UMONOTONr XMonotonr UBOONTr X Boontlingr USCOUSEr XScouser UAREVELAr XKeleti örményr USOLBAr XStolvizza/Solbica tájszólásr ULIPAWr XReziján lipovaz tájszólásr U1901r X Hagyományos német helyesírásr UBAKU1926r X"Egyesített türkic latin ábécér UOSOJSr XOseacco/Osojane tájszólásr UVALENCIAr XValenciar UPOLYTONr X Politonikusr UNJIVAr XGniva/Njiva tájszólásr UFONIPAr X IPA fonetikar UTARASKr XTaraskijevica helyesírásr U1606NICTr XKésői közép francia 1606-igr USAAHOr XSahor UPOSIXr XSzámítógépr UFONUPAr X UPA fonetikar UNEDISr XNatisone dialektusr UAREVMDAr XNyugati örményr U1994r X'Szabványosított reziján helyesírásr U1996r X1996-os német helyesírásr UREVISEDr XÁtdolgozott helyesírásr USCOTLANDr XSkót szabványos angolr! UBISKEr" XSan Giorgo/Bila tájszólásr# UROZAJr$ XRezijánr% uUnumber_symbolsr& }r' (Udecimalr( X,r) Ugroupr* X r+ uUcurrency_namesr, }r- (UXXXr. X&Ismeretlen vagy érvénytelen pénznemr/ jXAlgériai dínárr0 ULVRr1 X Lett rubelr2 UGHSr3 X Ghánai cedir4 UBOPr5 XBolíviai pesor6 UEGPr7 XEgyiptomi fontr8 jXBolgár kemény levar9 UBGNr: XBolgár új levar; UPABr< XPanamai balboar= UYUMr> XJugoszláv új dínárr? jXZimbabwei dollárr@ UGHCrA XGhánai cedi (1979-2007)rB UXBDrC XEuropean Unit of Account (XBD)rD jX BolivianorE UXBArF XEuropean Composite UnitrG jX Dán koronarH UXBCrI XEuropean Unit of Account (XBC)rJ UXBBrK XEuropean Monetary UnitrL UBWPrM XBotswanai pularN jX Libanoni fontrO jXTanzániai shillingrP UVNDrQ XVietnámi dongrR jXNamíbiai dollárrS UAOArT XAngolai kwanzarU UWSTrV XNyugat-szamoai talarW UAONrX XAngolai új kwanza (1990-2000)rY jXKambodzsai rielrZ jXMalajziai ringgitr[ UAOKr\ XAngolai kwanza (1977-1990)r] jUXSzomáli shillingr^ UKYDr_ XKajmán-szigeteki dollárr` jXLíbiai dínárra UUAHrb XUkrán hrivnyarc UUAKrd XUkrán karbovanecre jXUgandai shillingrf jXJordániai dínárrg UAORrh X%Angolai kwanza reajustado (1995-1999)ri USURrj X Szovjet rubelrk UAWGrl X Arubai forintrm jX Szaúdi riyalrn UFIMro X Finn markkarp jXHongkongi dollárrq j'XSuriname-i guldenrr UTPErs X Timori escudort UMGFru XMadagaszkári frankrv UCHErw XWIR eurorx jX Svájci frankry UGIPrz XGibraltári fontr{ jXFehérorosz rubelr| j3X Albán lekr} UXPDr~ X palládiumr UUGSr XUgandai shilling (1966-1987)r jXMauritániai ouguiyar UBOVr XBolíviai mvdolr UHRKr X Horvát kunar jXDzsibuti frankr UHRDr XHorvát dínárr UPESr X Perui solr UEQEr Xekweler UITLr X Olasz lírar UXAFr XCFA frank BEACr UBNDr XBrunei dollárr UISKr XIzlandi koronar UZALr XDél-afrikai rand (pénzügyi)r USRDr XSurinamei dollárr UNIOr XNikaraguai cordoba oror ULAKr X Laoszi kipr UNICr XNikaraguai cordobar jXNepáli rúpiar UMZEr XMozambik escudor jXUruguay-i peso uruguayor ULUCr Xluxemburgi konvertibilis frankr jXJamaikai dollárr UFRFr X Francia frankr UMAFr XMarokkói frankr UUYIr X#Uruguayi peso en unidades indexadasr jXMozambik meticalr UMZNr XMozambiki metikálisr UPHPr XFülöp-szigeteki pesor jXDél-afrikai randr URHDr Xrhodéziai dollárr UGWPr XGuinea-Bissaui pesor ULUFr XLuxemburgi frankr UBELr XBelga frank (pénzügyi)r UBECr XBelga frank (konvertibilis)r UNGNr XNigériai nairar UYUNr X Jugoszláv konvertibilis dínárr jX Belga frankr UPLZr XLengyel zloty (1950-1995)r jXCosta Ricai colonr jXRégi török lírar UDEMr X Német márkar UEEKr X Észt koronar jX Malawi kwachar jXTrinidad és tobagoi dollárr jXSri Lankai rúpiar jXSzlovák koronar jOXCape Verdei escudor jXPakisztáni rúpiar jX Magyar forintr jXRégi román lejr UXEUr Xeurópai pénznemegységr jXBermudai dollárr j7X Ománi rialr jX Lesothoi lotir ULSMr XMalotir jXMongóliai tugrikr jXDramr UYUDr XJugoszláv kemény dínárr UBUKr X Burmai kyatr jX Szíriai fontr j#X Katari rialr UXDRr XSpecial Drawing Rightsr UNLGr XHolland forintr UGEKr XGrúz kupon laritr UMTPr X Máltai fontr UGBPr XBrit font sterlingr jX Grúz larir USHPr XSaint Helena fontr jXAfghanir j9XSalamon-szigeteki dollárr UCSKr XCsehszlovák kemény koronar UKPWr XÉszak-koreai wonr UXREr X RINET tőker UCSDr X szerb dinárr UAFAr XAfghani (1927-2002)r UTHBr X Thai bahtr UBYBr X!Fehérorosz új rubel (1994-1999)r jXBangladesi takar UGRDr XGörög drachmar j X Jemeni rialr UDDMr XKelet-Német márkar jiXSzváziföldi lilangenir UHTGr X Haiti gourder UTRYr Xúj török lírar UMGAr XMadagaszkári ariaryr j XHolland-antilla forintr ULRDr XLibériai dollárr URWFr X Ruandai frankr jXNorvég koronar UMXVr X"Mexikói Unidad de Inversion (UDI)r j=XKenyai shillingr UMOPr Xmakaói patacar UINRr X indiai rúpiar jX Mexikói pesor UCZKr X Cseh koronar UTJSr XTádzsikisztáni somonir UTJRr XTádzsikisztáni rubelr jXBhutáni ngultrumr UYDDr XJemeni dínárr! UGWEr" XPortugál guinea escudor# jXKolumbiai pesor$ UCOUr% XUnidad de Valor Realr& jaX Máltai lírar' UMURr( XMauritiusi rúpiar) jXIndonéz rúpiar* jXHodurasi lempirar+ jX CFP frankr, jXFidzsi dollárr- jXEtiópiai birrr. UPENr/ XPerui sol nuevor0 jXBelizei dollárr1 UCHWr2 X WIR frankr3 UATSr4 XOsztrák schillingr5 UILPr6 X Izraeli fontr7 UZRNr8 XZairei új zairer9 j!XDominikai pesor: ULULr; Xluxemburgi pénzügyi frankr< UTMMr= XTürkmenisztáni manatr> jCXTajvani új dollárr? UMDLr@ X Moldován leirA UXPTrB XplatinarC UECVrD X(Ecuadori Unidad de Valor Constante (UVC)rE UECSrF XEcuadori sucrerG UBSDrH XBahamai dollárrI j%X Svéd koronarJ UTOPrK X tongai paangarL UPEIrM X Perui intirN UZMKrO XZambiai kwacharP UMVRrQ XMaldív-szigeteki rufiyaarR UXTSrS XTesztelési pénznemkódrT jXAusztrál dollárrU UADPrV XAndorrai pesetarW UCUPrX X Kubai pesorY j)XÍr fontrZ UCLFr[ XChilei unidades de fomentor\ j+XBarbadosi dollárr] jX Comorei frankr^ UKRWr_ XDél-koreai wonr` UGMDra XGambiai dalasirb UVEFrc XVenezuelai bolivar fuerterd j-XGuatemalai quetzalre j/XVenezuelai bolívarrf UXOFrg XCFA frank BCEAOrh USITri XSzlovén tolarrj USDPrk XRégi szudáni fontrl j1X Chilei pesorm UEURrn XEuroro UCDFrp X Kongói frankrq j XKelet-karibi dollárrr j5XKazahsztáni tengers URUBrt X Orosz rubelru UXFUrv XFrancia UIC-frankrw UXAGrx XEzüstry UBRRrz XBrazil cruzeiror{ UBRNr| XBrazil cruzado novor} UBRLr~ X Brazil realr UMMKr X Mianmari kyatr UUYPr XUruguay-i peso (1975-1993)r URURr XOrosz rubel (1991-1998)r j;X Lengyel zlotyr UBREr XBrazil cruzeiro (1990-1993)r UPYGr XParaguayi guaranir UBRCr X Brazi cruzador UBRBr XBrazi cruzeiro novo (1967-1986)r USVCr XSalvadori colónr UAEDr X EAE dirhamr UGNSr X Guineai sylir jAXMacedon dínárr UAZMr X Azerbajdzsáni manat (1993-2006)r UAZNr XAzerbajdzsáni manatr UUSNr XUSA dollár (következő napi)r UGQEr X$Egyenlítői-guineai ekwele guineanar jX Vanuatui vatur UBADr XBosznia-hercegovinai dínárr jEX Guineai frankr UMXPr X Mexikói ezüst peso (1861-1992)r jGX Iraki dínárr UERNr XEritreai nakfar jIX)Bozsnia-hercegovinai konvertibilis márkar jKXSeychelle-szigeteki rúpiar jMXKanadai dollárr USDDr XSzudáni dínárr j_X Ciprusi fontr UMADr XMarokkói dirhamr jQXKuvaiti dínárr jSX Burundi frankr ULTTr XLitvániai talonasr UPGKr XPápua új-guineai kinar ULTLr XLitvániai litasr jWXSzingapúri dollárr UUZSr XÜzbegisztáni szumr jYXSao tome-i és principe-i dobrar UXFOr XFrancia arany frankr UMLFr X Mali frankr UESPr XSpanyol pesetar j[X Iráni rialr UZRZr X Zairei zairer j]XKínai jüan renminbir USLLr XSierra Leonei leoner UTNDr XTunéziai dínárr j?XGuyanai dollárr UESBr X%spanyol peseta (konvertibilis kontó)r UESAr Xspanyol peseta (A-kontó)r jcXÚj-zélandi dollárr UFKPr XFalkland-szigeteki fontr ULVLr X Lett latsr UUSSr XUSA dollár (aznapi)r UUSDr X USA dollárr UARPr XArgentín peso (1983-1985)r jeXKirgizisztáni szomr jgXPesor UILSr XIzraeli új sékelr URONr Xúj román lejr URSDr X Szerb Dínárr jkXBahreini dinárr UJPYr X Japán jenr UARAr XArgentín australr USDGr X Szudáni fontr UPTEr XPortugál escudor UXAUr XAranyr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXJr KXFr KjKXÁr KjKj Kj KXAr K XSr K XOr K XNr K XDr usUformatr }r (Uwider }r (KXjanuárr KXfebruárr KXmárciusr KXáprilisr KXmájusr KXjúniusr KXjúliusr KX augusztusr K X szeptemberr K Xoktóberr K Xnovemberr K Xdecemberr uU abbreviatedr }r (KXjan.r KXfebr.r KXmárc.r KXápr.r KXmáj.r KXjún.r KXjúl.r KXaug.r K Xszept.r K Xokt.r K Xnov.r K Xdec.r uuuUcurrency_formatsr }r Nh()r }r (h+Nh-Kh.KKr h0X ¤r j r h3KKr h5X #,##0.00 ¤r h7h1h8r! h:Nh;KKr" ubsUdaysr# }r$ (U stand-aloner% }r& Unarrowr' }r( (KXHr) KXKr* Kj KjKXPr+ Kj KXVr, usUformatr- }r. (Uwider/ }r0 (KXhétfőr1 KXkeddr2 KXszerdar3 KX csütörtökr4 KXpéntekr5 KXszombatr6 KX vasárnapr7 uU abbreviatedr8 }r9 (Kj) Kj* KXSzer: KXCsr; Kj+ KXSzor< Kj, uuuU meta_zonesr= }r> (U Turkmenistanr? }r@ (UcommonrA UlongrB }rC (UdaylightrD XTürkmenisztáni nyári időrE UstandardrF XTürkmenisztáni időrG uuU KuybyshevrH }rI (jA jB }rJ (jD Xkujbisevi nyári időrK jF Xkujbisevi időrL uuURotherarM }rN (jA jB }rO jF X rotherai időrP suUArabianrQ }rR (UshortrS }rT (UgenericrU X AT (Arab)rV jD X ADT (arab)rW jF X AST (arab)rX ujA jB }rY (jU X arab időrZ jD Xarab nyári időr[ jF Xarab zónaidőr\ uuUAustralia_Easternr] }r^ (jA jB }r_ (jU XKelet-ausztrál időr` jD XAusztrál keleti nyári időra jF XAusztrál keleti zónaidőrb uuU Argentinarc }rd (jA jB }re (jD XArgentín nyári időrf jF XArgentínai időrg uuUBoliviarh }ri (jA jB }rj jF Xbolíviai időrk suU Alaska_Hawaiirl }rm (jA jB }rn (jU Xalaszkai-hawaii időro jD X%Alaszka-Hawaii nyári időszámításrp jF Xalaszkai-hawaii zónaidőrq uuU Cape_Verderr }rs (jA jB }rt (jD XCape verdei nyári időru jF XCape verdei időrv uuUAzoresrw }rx (jA jB }ry (jD XAzori nyári időrz jF X Azori időr{ uuUPierre_Miquelonr| }r} (jA jB }r~ (jU XPierre és miqueloni időr jD X Pierre és miqueloni nyári időr jF XPierre és miqueloni zónaidőr uuUEurope_Centralr }r (jA jB }r (jD XKözép-európai nyári időr jF Xközép-európai időr uuUTrukr }r (jA jB }r jF X Truki időr suU Aktyubinskr }r (jA jB }r (jD Xaktyubinszki nyári időr jF Xaktyubinszki időr uuUBeringr }r (jS }r (jD X BDT (Bering)r jF X BST (Bering)r ujA jB }r (jU X beringi időr jD XBeringi nyári időszámításr jF Xberingi zónaidőr uuU Qyzylordar }r (jA jB }r (jD XQyzylordai nyári időr jF XQyzylordai időr uuUKazakhstan_Easternr }r (jA jB }r jF XKelet-kazahsztáni zónaidőr suUFrunzer }r (jA jB }r (jD XFrunzei nyári időr jF X Frunzei időr uuU Dutch_Guianar }r (jA jB }r jF Xholland-guianai időr suUYerevanr }r (jA jB }r (jD XJereváni nyári időr jF XJereváni időr uuU Kamchatkar }r (jA jB }r (jD X%Petropavlovszk-kamcsatkai nyári időr jF XPetropavlovszk-kamcsatkai időr uuULiberiar }r (jS }r jU XLibériai időr sjA jB }r jU XLibériai időr suUKashgarr }r (jA jB }r jF X Kasgár időr suUMaldivesr }r (jA jB }r jF XMaldív-szigeteki időr suUNorfolkr }r (jA jB }r jF XNorfolk-szigeteki időr suU East_Timorr }r (jA jB }r jF XKelet-timori időr suUAfrica_Easternr }r (jA jB }r (jU X Kenyai időr jF Xkelet-afrikai időr uuU Ashkhabadr }r (jA jB }r (jD Xashabadi nyári időr jF X ashabadi időr uuUAlaskar }r (jA jB }r (jU X alaszkai időr jD Xalaszkai nyári időr jF Xalaszkai zónaidőr uuUAmerica_Easternr }r (jA jB }r (jU X keleti időr jD Xkeleti nyári időr jF Xkeleti zónaidőr uuU Yekaterinburgr }r (jA jB }r (jD XJekatyerinburgi nyári időr jF XJekatyerinburgi időr uuUSolomonr }r (jA jB }r jF XSalamon-szigeteki időr suU Krasnoyarskr }r (jA jB }r (jD XKrasznojarszki nyári időr jF XKrasznojarszki időr uuUAmerica_Centralr }r (jA jB }r (jU Xközépső államokbeli időr jD X#középső államokbeli nyári időr jF X!középső államokbeli zónaidőr uuUMawsonr }r (jA jB }r jF X mawsoni időr suUPakistanr }r (jA jB }r (jD XPakisztáni nyári időr jF XPakisztáni időr uuUChathamr }r (jA jB }r (jD XChathami nyári időr jF XChathami zónaidőr uuUSamoar }r (jA jB }r jF XSzamoai zónaidőr suUMacaur }r (jA jB }r (jD XMacaui nyári időr jF X Macaui időr uuUChamorror }r (jA jB }r jF XChamorroi zónaidőr suUGuamr }r (jS }r jF X GST (Guam)r sjA jB }r jF XGuami zónaidőr suUIndiar }r (jA jB }r jF XIndiai zónaidőr suU Azerbaijanr }r jA sU Marquesasr }r (jA jB }r jF XMarquesasi időr suU Tajikistanr }r! (jA jB }r" jF XTadzsikisztáni időr# suUPitcairnr$ }r% (jA jB }r& jF XPitcairni időr' suUTurkeyr( }r) (jA jB }r* (jU X Török időr+ jD Xtörökországi nyári időr, jF Xtörökországi időr- uuU Afghanistanr. }r/ (jA jB }r0 jF Xafganisztáni időr1 suU Choibalsanr2 }r3 (jA jB }r4 (jD Xcsojbalszani nyári időr5 jF Xcsojbalszani időr6 uuU Vladivostokr7 }r8 (jA jB }r9 (jD XVlagyivosztoki nyári időr: jF XVlagyivosztoki időr; uuU Shevchenkor< }r= (jA jB }r> (jD XSevcsenkói nyári időr? jF XSevcsenkói időr@ uuU BangladeshrA }rB (jA jB }rC jF Xbangladesi időrD suUGulfrE }rF (jA jB }rG jF XÖbölbeli zónaidőrH suUDaccarI }rJ (jA jB }rK jF X daccai időrL suUMongoliarM }rN (jA jB }rO (jD XUlánbátori nyári időrP jF XUlánbátori időrQ uuU SamarkandrR }rS (jS }rT (jD XSAMST (Szamarkand)rU jF XSAMT (Szamarkand)rV ujA jB }rW (jD XSzamarkandi nyári időrX jF XSzamarkandi időrY uuUWakerZ }r[ (jA jB }r\ jF XWake-szigeti időr] suUPerur^ }r_ (jA jB }r` (jD Xperui nyári időra jF X perui időrb uuUVanuaturc }rd (jA jB }re (jD XVanuatui nyári időrf jF X Vanuatui időrg uuUIndonesia_Centralrh }ri (jA jB }rj jF XKözép-indonéziai időrk suUNaururl }rm (jA jB }rn jF X Naurui időro suUFalklandrp }rq (jA jB }rr (jD XFalkland-szigeteki nyári időrs jF XFalkland-szigeteki időrt uuUKorearu }rv (jA jB }rw (jU X Koreai időrx jD XKoreai nyári időry jF XKoreai zónaidőrz uuUCubar{ }r| (jS }r} (jD X CDT (Kuba)r~ jF X CST (Kuba)r ujA jB }r (jU X kubai időr jD Xkubai nyári időr jF Xkubai zónaidőr uuUIrkutskr }r (jA jB }r (jD XIrkutszki nyári időr jF XIrkutszki időr uuUArgentina_Westernr }r (jA jB }r jF Xnyugat-argentínai időr suUAmazonr }r (jA jB }r (jD Xamazóniai nyári időr jF Xamazóniai időr uuUChinar }r (jS }r (jD X CDT (Kína)r jF X CST (Kína)r ujA jB }r (jD Xkínai nyári időr jF Xkínai zónaidőr uuULong_Shur }r (jA jB }r jF X Long-Shu időr suUArmeniar }r (jS }r (jD XAMST (Örményország)r jF XAMT (Örményország)r ujA jB }r (jD Xörmény nyári időr jF X örmény időr uuUCookr }r (jA jB }r (jD XCook-szigeteki fél nyári időr jF XCook-szigeteki időr uuUAfrica_FarWesternr }r (jA jB }r jU XNyugat-szaharai időr suUGreenland_Westernr }r (jA jB }r (jD Xnyugat-grönlandi nyári időr jF Xnyugat-grönlandi időr uuUKarachir }r (jA jB }r jF X Karacsi időr suUTongar }r (jA jB }r (jD XTongai nyári időr jF X Tongai időr uuUSakhalinr }r (jA jB }r (jD XSakhalin nyári időr jF X Sakhalin időr uuUBrasiliar }r (jA jB }r (jD Xbrazíliai nyári időr jF Xbrazíliai időr uuUSyowar }r (jA jB }r jF X syowai időr suU French_Guianar }r (jA jB }r jF Xfrancia-guianai időr suUFrench_Southernr }r (jA jB }r jF X"Francia déli és antarktikus időr suU Mauritiusr }r (jA jB }r jF XMauritiusi időr suUAfrica_Southernr }r (jA jB }r (jU Xdél-afrikai időr jF Xdél-afrikai zónaidőr uuUGambierr }r (jA jB }r jF X Gambieri időr suUDavisr }r (jA jB }r jF X davisi időr suU Newfoundlandr }r (jA jB }r (jU Xúj-fundlandi időr jD Xúj-fundlandi nyári időr jF Xúj-fundlandi zónaidőr uuUCocosr }r (jA jB }r jF XKókusz-szigeteki időr suU Kyrgystanr }r (jA jB }r jF X Kirgiz időr suUTokelaur }r (jA jB }r jF X Tokelaui időr suUAustralia_Westernr }r (jA jB }r (jU XNyugat-ausztrál időr jD XAusztrál nyugati nyári időr jF XAusztrál nyugati zónaidőr uuUBakur }r (jA jB }r (jD Xbakui nyári időr jF X bakui időruuUAfrica_Centralr}r(jA jB }r(jU XMozambiki időrjF Xközép-afrikai időruuU Line_Islandsr}r(jA jB }rjF XLine-szigeteki időr suU Novosibirskr }r (jA jB }r (jD XNovoszibirszki nyári időr jF XNovoszibirzski időruuUJapanr}r(jA jB }r(jD XJapán nyári időrjF XJapán zónaidőruuU Sverdlovskr}r(jA jB }r(jD XSzverdlovszki nyári időrjF XSzverdlovszki időruuU New_Caledoniar}r(jA jB }r(jD XÚj-kaledóniai nyári időrjF XÚj-kaledóniai időruuU Kwajaleinr}r(jA jB }r jF XKwajaleini időr!suUAqtober"}r#(jA jB }r$(jD Xaqtobei nyári időr%jF X aqtobei időr&uuUGilbert_Islandsr'}r((jA jB }r)jF XGilbert-szigeteki időr*suUAustralia_CentralWesternr+}r,(jA jB }r-(jU X!Ausztrál középső nyugati időr.jD X(Ausztrál középső nyugati nyári időr/jF X&Ausztrál középső nyugati zónaidőr0uuU Indochinar1}r2jA sUPapua_New_Guinear3}r4(jA jB }r5jF XPápua új-guineai időr6suUHovdr7}r8(jA jB }r9(jD XHovdi nyári időr:jF X Hovdi időr;uuU South_Georgiar<}r=(jS }r>jF XGST (S. Georgia)r?sjA jB }r@jF XDél-grúziai időrAsuUEcuadorrB}rC(jA jB }rDjF X ecuadori időrEsuUMalayarF}rG(jA jB }rHjF X Malayai időrIsuUBruneirJ}rK(jA jB }rLjF XBrunei darussalami időrMsuUIranrN}rO(jA jB }rP(jD XIráni nyári időrQjF XIráni zónaidőrRuuUAqtaurS}rT(jA jB }rU(jD Xaqtaui nyári időrVjF X aqtaui időrWuuU Indian_OceanrX}rY(jA jB }rZjF XIndiai-óceáni időr[suUTuvalur\}r](jA jB }r^jF X Tuvalui időr_suUAmerica_Mountainr`}ra(jA jB }rb(jU Xhegyvidéki időrcjD Xhegyvidéki nyári időrdjF Xhegyvidéki zónaidőreuuUHawaii_Aleutianrf}rg(jA jB }rhjF XHawaii-aleuti zónaidőrisuUChangbairj}rk(jA jB }rljF X changbai időrmsuUChilern}ro(jA jB }rp(jD Xchilei nyári időrqjF X chilei időrruuUWallisrs}rt(jA jB }rujF XWallis és futunai időrvsuUKosraerw}rx(jA jB }ryjF X Kosraei időrzsuUDushanber{}r|(jA jB }r}(jD Xdusanbei nyári időr~jF X dusanbei időruuUGeorgiar}r(jA jB }r(jD XGrúz nyári időrjF X Grúz időruuUAnadyrr}r(jA jB }r(jD Xanadiri nyári időrjF X anadiri időruuU Philippinesr}r(jA jB }r(jD XFülöp-szigeteki nyári időrjF XFülöp-szigeteki időruuUYakutskr}r(jA jB }r(jD XJakutszki nyári időrjF XJakutszki időruuUIndonesia_Westernr}r(jA jB }rjF XNyugat-indonéziai időrsuUGreenland_Easternr}r(jA jB }r(jD Xkelet-grönlandi nyári időrjF Xkelet-grönlandi időruuUGMTr}r(jA jB }rjF XGreenwichi középidőrsuUMarshall_Islandsr}r(jA jB }rjF XMarshall-szigeteki időrsuU Seychellesr}r(jA jB }rjF XSeychelle-szigeteki időrsuUUruguayr}r(jA jB }r(jD Xuruguayi nyári időrjF X uruguayi időruuUVostokr}r(jA jB }rjF X vosztoki időrsuU Uzbekistanr}r(jA jB }r(jD XÜzbegisztáni nyári időrjF XÜzbegisztáni időruuUColombiar}r(jA jB }r(jD Xkolumbiai nyári időrjF Xkolumbiai időruuUReunionr}r(jA jB }rjF XRéunioni időrsuU Volgogradr}r(jA jB }r(jU X13:25 Oroszország (Volgográd)rjD Xvolgográdi nyári időrjF Xvolgográdi időruuU Kizilordar}r(jA jB }r(jD XKizilordai nyári időrjF XKizilordai időruuUFijir}r(jA jB }r(jD XFidzsi nyári időrjF X Fidzsi időruuUAmerica_Pacificr}r(jA jB }r(jU Xcsendes-óceáni időrjD Xcsendes-óceáni nyári időrjF Xcsendes-óceáni zónaidőruuUKazakhstan_Westernr}r(jA jB }rjF XNyugat-kazahsztáni zónaidőrsuUPalaur}r(jA jB }rjF X Palaui időrsuUEurope_Easternr}r(jA jB }r(jD XKelet-európai nyári időrjF XKelet-európai időruuUBhutanr}r(jA jB }rjF X butáni időrsuUBorneor}r(jA jB }r(jD Xborneói nyári időrjF X borneói időruuUNepalr}r(jA jB }rjF X Nepáli időrsuU Galapagosr}r(jA jB }rjF XGalapagosi időrsuU Lord_Hower}r(jA jB }r(jU XLord howei időrjD XLord howei nyári időrjF XLord howei zónaidőruuUPhoenix_Islandsr}r(jA jB }rjF XPhoenix-szigeteki időrsuUSurinamer}r(jA jB }rjF Xszurinámi időrsuUAcrer}r(jA jB }r(jD Xacrei nyári időrjF X acrei időruuUEasterr}r(jA jB }r (jD XHúsvét-szigeteki nyári időr jF XHúsvét-szigeteki időr uuU Christmasr }r (jA jB }rjF XKarácsony-szigeti időrsuUIsraelr}r(jS }rjF X IST (Izrael)rsjA jB }r(jD XIzraeli nyári időrjF XIzraeli zónaidőruuUAfrica_Westernr}r(jA jB }r(jU XNigériai időrjD Xnyugat-afrikai nyári időrjF Xnyugat-afrikai időruuUTashkentr}r(jA jB }r(jD XTaskenti nyári időr jF X Taskenti időr!uuUMalaysiar"}r#(jA jB }r$jF XMalajziai időr%suUNoronhar&}r'(jA jB }r((jD X Fernando de noronhai nyári időr)jF XFernando de noronhai időr*uuU Venezuelar+}r,(jA jB }r-jF Xvenezuelai időr.suUPonaper/}r0(jA jB }r1jF X Ponapei időr2suUIndonesia_Easternr3}r4(jA jB }r5jF XKelet-indonéziai időr6suUOmskr7}r8(jA jB }r9(jD XOmszki nyári időr:jF X Omszki időr;uuUAustralia_Centralr<}r=(jA jB }r>(jU XKözép-ausztráliai időr?jD X Ausztrál középső nyári időr@jF XAusztrál középső zónaidőrAuuUAtlanticrB}rC(jA jB }rD(jU XAtlanti-óceáni időrEjD XAtlanti nyári időszámításrFjF XAtlanti zónaidőrGuuU North_MarianarH}rI(jA jB }rJjF XÉszak-mariana-szigeteki időrKsuULankarL}rM(jA jB }rNjF X Lankai időrOsuUDumontDUrvillerP}rQ(jA jB }rRjF XDumont-d'urvillei időrSsuUEurope_WesternrT}rU(jA jB }rV(jD XNyugat-európai nyári időrWjF XNyugat-európai időrXuuU New_ZealandrY}rZ(jA jB }r[(jU XÚj-zélandi időr\jD XÚj-zélandi nyári időr]jF XÚj-zélandi zónaidőr^uuUUrumqir_}r`(jA jB }rajF X Urumqi időrbsuU Hong_Kongrc}rd(jA jB }re(jD XHongkongi nyári időrfjF XHongkongi időrguuUGuyanarh}ri(jA jB }rjjF X guyanai időrksuUMagadanrl}rm(jA jB }rn(jD XMagadáni nyári időrojF XMagadáni időrpuuUAlmatyrq}rrjA sUTbilisirs}rt(jA jB }ru(jD XTbiliszi nyári időrvjF X Tbiliszi időrwuuUMyanmarrx}ry(jA jB }rzjF X Myanmari időr{suU Singaporer|}r}(jA jB }r~jF XSzingapúri zónaidőrsuUSamarar}r(jA jB }r(jD Xszamarai nyári időrjF X szamarai időruuUGreenland_Centralr}r(jA jB }r(jD Xközép-grönlandi nyári időrjF Xközép-grönlandi időruuUUralskr}r(jA jB }r(jD XUráli nyári időrjF X Uráli időruuUTahitir}r(jA jB }rjF X Tahiti időrsuUParaguayr}r(jA jB }r(jD Xparaguayi nyári időrjF Xparaguayi időruuUYukonr}r(jA jB }r(jU X yukoni időrjD Xyukoni nyári időrjF Xyukoni zónaidőruuUMoscowr}r(jA jB }r(jU X moszkvai időrjD Xmoszkvai nyári időrjF Xmoszkvai zónaidőruuUNiuer}r(jA jB }rjF X Niuei időrsuuUerasr}r(Uwider}r(KXidőszámításunk előttrKXidőszámításunk szerintruU abbreviatedr}r(KXi. e.rKXi. sz.ruuu.PK[?J'HH(site-packages/babel/localedata/sw_KE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqUpatternqX ¤#,##0.00q Uprefixq!X¤q"X-¤q#q$Uexp_plusq%NUgroupingq&KKq'ubsU languagesq(}q)U territoriesq*}q+U time_zonesq,}q-Uscriptsq.}q/Udecimal_formatsq0}q1U meta_zonesq2}q3Uvariantsq4}q5Ucurrency_namesq6}q7u.PK[: eAA(site-packages/babel/localedata/es_AR.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}q(Uamq Xa.m.q Upmq Xp.m.q uUscientific_formatsq }qUpercent_formatsq}qU week_dataq}qU time_formatsq}q(Ufullqcbabel.dates DateTimePattern q)q}q(UpatternqXHH'h'''mm:ss vqUformatqX%(HH)sh'%(mm)s:%(ss)s %(v)squbUlongqh)q}q(hX H:mm:ss zq hX%(H)s:%(mm)s:%(ss)s %(z)sq!ubuU languagesq"}q#U territoriesq$}q%(UHKq&X Hong Kongq'UMOq(XMacaoq)uUdecimal_formatsq*}q+U date_formatsq,}q-Ucurrency_symbolsq.}q/UARSq0X$q1sU time_zonesq2}q3Uscriptsq4}q5Uvariantsq6}q7UREVISEDq8XOrtografía revisadaq9sUnumber_symbolsq:}q;Ucurrency_namesq<}q=(UTRYq>Xnueva lira turcaq?h0XPeso Argentinoq@UTRLqAX lira turcaqBuUmonthsqC}qDUcurrency_formatsqE}qFUdaysqG}qHU meta_zonesqI}qJUerasqK}qLu.PK[D))(site-packages/babel/localedata/sq_AL.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[D))(site-packages/babel/localedata/sh_BA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/ca_ES.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ %site-packages/babel/localedata/gv.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXa.m.qUpmqXp.m.quUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@UgvqAXGaelgqBsU territoriesqC}qDUGBqEXRywvaneth UnysqFsUdecimal_formatsqG}qHU date_formatsqI}qJ(UmediumqKh))qL}qM(h,X MMM dd, yyyyqNh.X%(MMM)s %(dd)s, %(yyyy)sqOubUfullqPh))qQ}qR(h,XEEEE dd MMMM yyyyqSh.X!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)sqTubUlongqUh))qV}qW(h,X dd MMMM yyyyqXh.X%(dd)s %(MMMM)s %(yyyy)sqYubUshortqZh))q[}q\(h,Xdd/MM/yyq]h.X%(dd)s/%(MM)s/%(yy)sq^ubuUcurrency_symbolsq_}q`U time_zonesqa}qbUscriptsqc}qdUvariantsqe}qfUnumber_symbolsqg}qhUcurrency_namesqi}qjUmonthsqk}ql(U stand-aloneqm}qnUnarrowqo}qp(KX1qqKX2qrKX3qsKX4qtKX5quKX6qvKX7qwKX8qxK X9qyK X10qzK X11q{K X12q|usUformatq}}q~(Uwideq}q(KX Jerrey-geureeqKXToshiaght-arreeqKXMayrntqKXAverilqKXBoaldynqKX Mean-soureeqKX Jerrey-soureeqKX LuanistynqK X Mean-fouyirqK X Jerrey-fouyirqK X Mee HouneyqK XMee ny NollickquU abbreviatedq}q(KXJ-guerqKXT-arreeqKXMayrntqKXAvrrilqKXBoaldynqKXM-soureeqKXJ-soureeqKX LuanistynqK XM-fouyirqK XJ-fouyirqK XM.HouneyqK X M.NollickquuuUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqh,X ¤#,##0.00qUprefixqX¤qX-¤qqUexp_plusqNUgroupingqKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhrKhsKhtKhuKhvKhwKhqusUformatq}q(Uwideq}q(KXJelheinqKXJemayrtqKXJerceanqKXJerdeinqKXJeheineyqKXJesarnqKXJedooneequU abbreviatedq}q(KXJelqKXJemqKXJercqKXJerdqKXJehqKXJesqKXJedquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXRCqKXADqusu.PK[Rll)site-packages/babel/localedata/kfo_CI.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[d &site-packages/babel/localedata/nso.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q]Unsoq^XSesotho sa Leboaq_sU territoriesq`}qaUdecimal_formatsqb}qcNh)qd}qe(h!Nh#Kh$KKqfh&h'h'qgh)KKqhh+X #,##0.###qih-h'h.qjh0Nh1KKqkubsU date_formatsql}qm(UmediumqnhG)qo}qp(h+X yyyy MMM dqqhKX%(yyyy)s %(MMM)s %(d)sqrubUfullqshG)qt}qu(h+XEEEE, yyyy MMMM ddqvhKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqwubUlongqxhG)qy}qz(h+X yyyy MMMM dq{hKX%(yyyy)s %(MMMM)s %(d)sq|ubUshortq}hG)q~}q(h+Xyy/MM/ddqhKX%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}q(UdecimalqX,qUgroupqX quUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXJanawareqKX FeberwareqKXMatšheqKXAporeleqKXMeiqKXJuneqKXJulaeqKXAgostoseqK XSetemereqK XOktoboreqK XNofemereqK XDisemerequU abbreviatedq}q(KXJanqKXFebqKXMatqKXApoqKXMeiqKXJunqKXJulqKXAgoqK XSetqK XOktqK XNofqK XDisquuuUcurrency_formatsq}qNh)q}q(h!Nh#Kh$KKqh&h'h'qh)KKqh+X ¤#,##0.00qh-X¤qX-¤qˆqh0Nh1KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KX MosupalogoqKXLabobediqKXLaboraroqKXLaboneqKX LabohlanoqKXMokibeloqKXSontagaquU abbreviatedq}q(KXMosqKXBedqKXRarqKXNeqKXHlaqKXMokqKXSonquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXBCqKXADquU abbreviatedq}q(KXBCqKXADquuu.PK[cy+66%site-packages/babel/localedata/hy.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXԱռ․qUpmqXԵր․quUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X#0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3MMq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,XHH:mm:ssqAUformatqBX%(HH)s:%(mm)s:%(ss)sqCubUfullqDh>)qE}qF(h,X HH:mm:ss vqGhBX%(HH)s:%(mm)s:%(ss)s %(v)sqHubUlongqIh>)qJ}qK(h,X HH:mm:ss zqLhBX%(HH)s:%(mm)s:%(ss)s %(z)sqMubUshortqNh>)qO}qP(h,XHH:mmqQhBX %(HH)s:%(mm)sqRubuU languagesqS}qT(UguqUXԳուջարատերենqVUgdqWX%Գաելյան ՇոտլանդերենqXUgaqYXԻռլանդերենqZUgnq[XԳուարաներենq\Uglq]XԳալիսերենq^Ulaq_XԼատիներենq`UlnqaXԼինգալաqbUloqcXԼաոսերենqdUtrqeXԹուրքերենqfUlvqgXԼատվերենqhUltqiXԼիտվերենqjUtkqkXԹուրքմեներենqlUthqmXԹայերենqnUtiqoXԷրիտրերենqpUteqqXՏելուգուqrUfilqsXՏագալերենqtUtaquXԹամիլերենqvUyiqwXԻդիշqxUdeqyXԳերմաներենqzUdaq{XԴանիերենq|Uelq}XՀունարենq~UeoqXԷսպերանտոqUenqXԱնգլերենqUzhqXՉինարենqUeuqXԲասկերենqUetqXԷստոներենqUesqXԻսպաներենqUruqXՌուսերենqUroqXՌումիներենqUbnqXԲենգալերենqUbeqXԲելարուսերենqUbgqXԲուլղարերենqUukqXՈւկրաիներենqUjvqXՃավայերենqUbhqXԲիհարերենqUbrqXԲրետոներենqUbsqXԲոսներենqUjaqXՃապոներենqUocqXԱկվիտաներենqUtwqXՏուիqUtlhqXԿլինգոնqUorqXՕրիսերենqUxhqXԽոշերենqUcaqXԿատալոներենqUcyqXՎալերենqUcsqXՉեխերենqUpsqXՓաշտուներենqUptqXՊորտուգալերենqUpaqXՓենջաբերենqUviqXՎիետնամերենqUplqXԼեհերենqUhyqXՀայերէնqUhrqXԽորվաթերենqUhuqXՀունգարերենqUhiqXՀնդկերենqUheqXԵբրայերենqUuzqXՈւզբեկերենqUmlqXԿերալերենqUmnqXՄոնղոլերենqUmkqXՄակեդոներենqUurqX ՈւրդուqUmtqXՄալթերենqUmsqXՄալայերենqUmrqX ՄարաթիqUugqXՈւյղուրերենqUafqXԱֆրիկանսqUswqXՍուահիլիqUisqXԻսլանդերենqUamqXՀաբեշերենqUitqXԻտալերենqUsvqXՇվեդերենqUasqXԱսամերենqUarqXԱրաբերենqUkmqXԿամբոջերենqUzuqXԶուլուսերենqUiaqXԻնտերլինգուաqUazqXԱդրբեջաներենqUieqXԻնտերլինգqUidqXԻնդոնեզերենqUnlqXՀոլանդերենqUnnqX)Նորվեգերեն (Նյունորսկ)qUnoqXՆորվեգերենqUneqXՆեպալերենqUfrqXՖրանսերենqUfyqXՖրիսերենqUfaqXՊարսկերենrUfirXՖիններենrUkyrXՂրղզերենrUforXՖարվերենrUkarXՎրացերենrUsrr XՍերբերենr Usqr XԱլբաներենr Ukor XԿորեերենrUknrXԿաննադաrUsurXՍունդաներենrUstrX ՍեսոտոrUskrXՍլովակերենrUsirXՍինհալերենrUshrXՍերբա-ԽորվաթերենrUsorXՍոմալերենrUkurXՔրդերենrUslrXՍլովեներենr Usar!XՍանսկրիտերենr"Usdr#X Սինդհիr$uU territoriesr%}r&(UBDr'XԲանգլադեշr(UBEr)X Բելգիաr*UBFr+XԲուրկինա Ֆասոr,UBGr-XԲուլղարիաr.UBAr/X#Բոսնիա-Հերցեգովինաr0UBBr1XԲարբադոսr2UBNr3XԲրունեյr4UBOr5XԲոլիվիաr6UBHr7XԲահրեյնr8UBIr9XԲուրունդիr:UBJr;X Բենինr<UBTr=X Բուտանr>U011r?XԱրևմտյան Աֆրիկաr@UBWrAXԲոտսվանաrBU014rCXԱրևելյան ԱֆրիկաrDU015rEX#Հյուսիսային ԱֆրիկաrFUBRrGXԲրազիլիաrHUBSrIXԲահամներrJU018rKX%Հարավային Աֆրիկա [018]rLUBYrMXԲելոռուսrNUBZrOX ԲելիզrPURUrQXՌուսաստանrRURWrSXՌուանդաrTUTMrUXԹուրքմենստանrVUTJrWXՏաճիկստանrXUROrYXՌումինիաrZUGWr[XԳվինեա-Բիսաուr\UGTr]XԳվատեմալաr^UGRr_XՀունաստանr`UGQraX'Հասարակածային ԳվինեաrbUJPrcXՃապոնիաrdUGYreX ԳայանաrfUGErgXՎրաստանrhUGDriXԳրենադաrjUGBrkXՄեծ ԲրիտանիաrlUGArmX ԳաբոնrnUSVroXՍալվադորrpUGNrqX ԳվինեաrrUGMrsX ԳամբիաrtUGHruXԳանաrvUOMrwXՕմանrxUTNryX ԹունիսrzUJMr{XՋամայկաr|UJOr}XՀորդանանr~UWSrX ՍամոաrUHRrXՀորվաթիաrUHTrX ՀաիթիrUHUrXՀունգարիաrUHNrXՀոնդուրասrUVErXՎենեսուելաrUPWrX ՊալաուrUPTrXՊորտուգալիաrUPYrXՊարագվայrUPArX ՊանամաrUPGrX Պապուա Նոր ԳվինեաrUPErX ՊերուrUPKrXՊակիստանrUPHrXՖիլիպիններrUPLrXԼեհաստանrUZMrX ԶամբիաrUEHrXԱրեվմտյան ՍահարաrUEErXԷստոնիաrUEGrXԵգիպտոսrUZArXՀարավային ԱֆրիկաrUECrXԷկվադորrUITrX ԻտալիաrUVNrXՎիետնամrUSBrX#Սոլոմոնյան կղզիներrUETrXԵթովպիաrUSOrX ՍոմալիrUZWrXԶիմբաբվեrUESrXԻսպանիաrUERrXԷրիտրեաrUMDrXՄոլդովաrUMGrXՄադագասկարrUMArX ՄարոկոrUMCrX ՄոնակոrUUZrXՈւզբեկստանrUMMrX ՄյանմաrUMLrXՄալիrUMNrXՄոնղոլիաrUMHrX!Մարշալյան կղզիներrUMKrXՄակեդոնիաrUMUrXՄավրիտոսrUMTrX ՄալթաrUMWrX ՄալավիrUMVrXՄալդիվներrUMRrXՄավրիտանիաrUUGrXՈւգանդաrUMYrXՄալայզիաrUMXrXՄեքսիկաrUILrXԻսրայելrUFRrXՖրանսիաrUFIrXՖինլանդիաrUFJrXՖիջիrUFMrXՄիկրոնեզիաrUNIrXՆիկարագուաrUNLrXՆիդերլանդերrUNOrXՆորվեգիաrUNArXՆամիբիաrUVUrXՎանուատուrUNErX ՆիգերrUNGrXՆիգերիաrUNZrXՆոր ԶելանդիաrUNPrX ՆեպալrUNRrXՆաուրուrUCIrXՓղոսկրի ԱփrUCHrXՇվեյցարիաrUCOrXԿոլումբիաrUCNrXՉինաստանrUCMrXԿամերունrUCLrXՉիլիrUCArX ԿանադաrUCGr X Կոնգոr UCFr XFԿենտրոնական Աֆրիկյան Հանրապետությունr UCZr X-Չեխիայի ՀանրապետությունrUCYrX ԿիպրոսrUCSrX$Սերբիա և ՄոնտենեգրոrUCRrXԿոստա-ՌիկաrUCVrXԿաբո-ՎերդեrUCUrX ԿուբաrUSZrXՍվազիլենդrUSYrX ՍիրիաrUKGrXԿիրգիզստանrUKErX Քենիաr USRr!XՍուրինամr"UKIr#XԿիրիբատիr$UKHr%XԿամբոջաr&UKNr'XՍենտ Կիտս-Նեվիսr(UKMr)XԿոմորոսr*USTr+X Սան-Թոմե-Փրինսիպիr,USKr-XՍլովակիաr.UKRr/XՀարավային Կորեաr0USIr1XՍլովենիաr2UKPr3X!Հյուսիսային Կորեաr4UKWr5XՔուվեյթr6USNr7XՍենեգալr8USMr9XՍան Մարինոr:USLr;XՍյերա-Լեոնեr<USCr=XՍեյշելներr>UKZr?XՂազախստանr@USArAXՍաուդիան ԱրաբիաrBUSGrCXՍինգապուրrDUSErEX ՇվեդիաrFUSDrGX ՍուդանrHUDOrIX3Դոմինիկյան ՀանրապետությունrJUDMrKXԴոմինիկաrLUDJrMXՋիբուտիrNUDKrOX ԴանիաrPUDErQXԳերմանիաrRUYErSXԵմենrTUDZrUX ԱլժիրrVUUSrWX4Ամէրիկայի Միացյալ ՆահանգնէրrXUUYrYXՈւրուգվայrZULBr[XԼիբանանr\ULCr]XՍանտա Լուչիաr^ULAr_XԼաոսr`UTVraXՏուվալուrbUTWrcX ԹայվանrdUTTreXՏրինիդադ-ՏոբագոrfUTRrgXԹուրքիաrhULKriXՇրի ԼանկաrjULIrkXԼիխտենշտեյնrlULVrmX ԼատվիաrnUTOroX ՏոնգաrpULTrqX ԼիտվաrrULUrsXԼյուքսեմբուրգrtULRruXԼիբերիաrvULSrwX ԼեսոտոrxUTHryXԹաիլանդrzUTGr{XՏոգոr|UTDr}XՉադr~ULYrX ԼիբիաrUVArXՎատիկանrUVCrX,Սենտ Վիսենտ-ԳրենադիններrUAErX2Միացյալ Արաբական ԷմիրաթներrUADrX ԱնդորաrUAGrX!Անտիգուա-ԲարբուդաrUAFrXԱֆղանստանrUIQrXԻրաքrUISrXԻսլանդիաrUIRrXԻրանrUAMrX/Հայաստանի ՀանրապետութիւնrUALrXԱլբանիաrUAOrX ԱնգոլաrU002rX ԱֆրիկաrU001rX ԱշխարհrUARrXԱրգենտինաrUAUrXԱվստրալիաrUATrXԱվստրիաrU005rX!Հարավային ԱմերիկաrUINrXՀնդկաստանrUTZrXՏանզանիաrUAZrXԱդրբեջանrUIErXԻռլանդիաrUIDrXԻնդոնեզիաrUUArXՈւկրաինաrUQArX ԿատարrUMZrXՄոզամբիկruUdecimal_formatsr}rNh )r}r(h#Nh$Kh%KKrh'h/h/rh*KKrh,X#0.###rh.h/h0rh2Nh3h4ubsU date_formatsr}r(Umediumrh>)r}r(h,X MMM d, yyyyrhBX%(MMM)s %(d)s, %(yyyy)srubUfullrh>)r}r(h,XEEEE, MMMM d, yyyyrhBX"%(EEEE)s, %(MMMM)s %(d)s, %(yyyy)srubUlongrh>)r}r(h,X MMMM dd, yyyyrhBX%(MMMM)s %(dd)s, %(yyyy)srubUshortrh>)r}r(h,XMM/dd/yyrhBX%(MM)s/%(dd)s/%(yy)srubuUcurrency_symbolsr}rUAMDrXդր.rsU time_zonesr}rUscriptsr}rUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}rUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KXՅունուարrKXՓետրուարrKXՄարտrKX ԱպրիլrKX ՄայիսrKX ՅունիսrKX ՅուլիսrKXՕգոստոսrK XՍեպտեմբերrK XՀոկտեմբերrK XՆոյեմբերrK XԴեկտեմբերruU abbreviatedr}r (KXՅնրr KXՓտրr KXՄրտr KXԱպրr KXՄյսrKXՅնսrKXՅլսrKXՕգսrK XՍեպrK XՀոկrK XՆոյrK XԴեկruuuUcurrency_formatsr}rNh )r}r(h#Nh$Kh%KKrh'X ¤rjrh*KKrh,X #0.00 ¤rh.h/h0rh2Nh3h4ubsUdaysr }r!(U stand-aloner"}r#Unarrowr$}r%(KjKjKjKjKjKjKjusUformatr&}r'(Uwider(}r)(KXԵրկուշաբթիr*KXԵրեքշաբթիr+KXՉորեքշաբթիr,KXՀինգշաբթիr-KX Ուրբաթr.KX Շաբաթr/KX Կիրակիr0uU abbreviatedr1}r2(KXԵրկr3KXԵրքr4KXՉորr5KXՀնգr6KXՈւրr7KXՇաբr8KXԿիրr9uuuU meta_zonesr:}r;Uerasr<}r=U abbreviatedr>}r?(KX Ք․Ա․r@KX Ք․Ե․rAusu.PK[nMSnn%site-packages/babel/localedata/ru.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX1-й кварталqKX2-й кварталqKX3-й кварталqKX4-й кварталquU abbreviatedq}q(KX 1-й кв.qKX 2-й кв.qKX 3-й кв.qKX 4-й кв.quuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X %q@h@qAh1KKqBh3X#,##0 %qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XH:mm:ssqRUformatqSX%(H)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X H:mm:ss vqXhSX%(H)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X H:mm:ss zq]hSX%(H)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XH:mmqbhSX %(H)s:%(mm)sqcubuU languagesqd}qe(UgvqfXмэнскийqgUguqhXгуджаратиqiUscnqjXсицилийскийqkUromqlXцыганскийqmUalgqnX#алгонкинские языкиqoUaleqpXалеутскийqqUscoqrXшотландскийqsUmniqtXманипурскийquUgdqvXгэльскийqwUgaqxXирландскийqyUmnoqzXманобо языкиq{Uosaq|X оседжиq}Ugnq~XгуараниqUaltqXюжноалтайскийqUglqXгалисийскийqUmwrqXмарвариqUtyqXтаитянскийqUtwqXтвиqUttqXтатарскийqUtrqXтурецкийqUtsqX тсонгаqUtnqX тсванаqUtoqX тонгаqUausqX#австралийский языкqUavqXаварскийqUtkqXтуркменскийqUthqXтайскийqUroaqXроманский языкqUtgqXтаджикскийqUteqX телугуqUugaqXугаритскийqUmwlqXмирандийскийqUkcgqXтьяпqUsmiqXсаамские языкиqUfatqX фантиqUfanqXфангqUwoqX волофqUrmqXретороманскийqUdinqX динкаqUblaqXсиксикаqUcmcqXчамский языкqUmlqXмалаяламqUzhqXкитайскийqUtemqX темнеqUen_CAqX'Канадский английскийqUnwcqX'невари (классический)qUzaqX чжуаньqUcauqXкавказский языкqUzuqXзулуqUterqX тереноqUtetqX тетумqUmncqXманьчжурскийqUkutqXкутенаиqUsukqX сукумаqUkumqXкумыкскийqUsusqXсусуqUnewqXневарскийqUsuxqXшумерскийqUdenqXславянскийqUmenqX мендеqUmulqXнесколько языковqUlezqXлезгинскийqUrootqXкорневой языкqUekaqXэкаджукqUakkqXаккадскийqUdraqX!дравидийский языкqUjrbqX!еврейско-арабскийqUsgnqXязык глухонемыхqUsgaqXстароирландскийqUapaqXапачские языкиqUbraqX брауиqUchbqX чибчаqUchgqXчагатайскийqUchkqXчукотскийqUchmqX+марийский (черемисский)qUchnqXчинук жаргонqUchoqX чоктавqUchprXчипевайянrUchrrX черокиrUchyrX чейеннrUtirXтигриньяrUvotrXводскийr Umgr Xмалагасийскийr Uibar Xибанскийr UmorXмолдавскийrUmnrXмонгольскийrUmirX маориrUmhrXмаршалльскийrUmkrXмакедонскийrUmtrXмальтийскийrUcairX?язык индейцев Центральной АмерикиrUdelrXделаварскийrUmsrXмалайскийrUmrr Xмаратхиr!Utar"Xтамильскийr#Umyr$Xбирманскийr%Ucadr&X каддоr'Usrnr(Xсранан тонгоr)Utair*Xтайский языкr+Uafhr,Xафрихилиr-Usitr.X#синотибетский языкr/Uenmr0X среднеанглийскийr1Uen_AUr2X/австралийский английскийr3Unynr4Xньянколеr5Unyor6X ньороr7Unymr8Xньямвезиr9Usior:Xсиу языкиr;Umapr<Xавстронезийскийr=Umasr>X масаиr?Ulahr@X лахндаrAUladrBX ладиноrCUfyrDXфризскийrEUsnkrFXсонинкеrGUfarHXперсидскийrIUmadrJXмадурскийrKUmagrLX магахиrMUmairNXмайтхилиrOUfirPXфинскийrQUfjrRX фиджиrSUmanrTXмандингоrUUegyrVX древнеегипетскийrWUzndrXX зандеrYUssrZX свазиr[Usrr\Xсербскийr]Usqr^Xалбанскийr_Uswr`XсуахилиraUsvrbXшведскийrcUsurdXсунданскийreUstrfXсото южныйrgUskrhXсловацкийriUsirjXсингальскийrkUshrlX"сербскохорватскийrmUsornX сомалиroUsnrpXшонаrqUsmrrXсамоанскийrsUslrtXсловенскийruUscrvXсардинскийrwUsarxXсанскритryUsgrzX сангоr{User|X#саамский (северный)r}Usdr~X синдхиrUzenrXзенагскийrUkbdrXкабардинскийrUafarXафразийский языкrUcsbrXкашубианскийrUlgrX гандаrUlbrXлюксембургскийrUfiurX$финно-угорский языкrUlnrXлингалаrUlorXлаосскийrUlirXлимбургскийrUbynrXбилин (блин)rUltrXлитовскийrUlurXлуба-катангаrUfilrXфилиппинскийrUyirXидишrUnonrXстаронорвежскийrUcebrXкебуаноrUyorX йорубаrUnogrXногайскийrUbatrXбалтийский языкrUdakrX дакотаrUdarrX даргваrUdayrXдаякrUssarX$нило-сахарский языкrUkperX кпеллеrUelrXгреческийrUeorXэсперантоrUenrXанглийскийrUlamrX ламбаrUeerXэвеrUmdfrXмокшанскийrUfrrXфранцузскийrUmdrrXмандарскийrUetrXэстонскийrUesrXиспанскийrUrurXрусскийrUgonrX гондиrUgohrX(древневерхненемецкийrUsmsrXскольт-саамскийrUsmnrXинари-саамскийrUsmjrXлуле-саамскийrUde_ATrX'австрийский немецкийrUgotrXготскийrUrnrX рундиrUrorXрумынскийrUdsbrXнижнелужицкийrUsmarXсаамский (южный)rUgorrXгоронталоrUastrXастурийскийrUwalrX воламоrUcrhrX!крымско-татарскийrUathrXатапачские языкиrUgezrXгеэзrUxhrX ксозаrUffrX фулахrUkforXкороrUmakrXмакассарскийrUzaprXсапотекскийrUkokrXконканиrUzxxrX.без языкового содержанияrUkosrXкосраенскийrUforXфарерскийrUtogrXньяса (тонга)rUhuprXхупаrUudmrXудмуртскийrUbejrX беджаrUbemrX бембаrUtsirXцимшианrUberrXберберскийr Unzir X нзимаr Usair X3язык индейцев Южной Америкиr UangrXстароанглийскийrUprarXпракриты языкиrUbhorXбходжпуриrUsalrXсалишские языкиrUprorX&старопровансальскийrUrajrXраджастханиrUsadrXсандавеrUanprX ангикаrUes_419rX8Латино-американский испанскийrUrapr Xрапануиr!Usasr"X сасакиr#Unqor$Xнкоr%Ucarr&X карибr'Uminr(Xминангкабауr)Umicr*X микмакr+Uefir,Xэфикr-Uarnr.Xарауканскийr/Uypkr0Xюпикский языкr1Umisr2Xсмешанные языкиr3Ukacr4Xкачинскийr5Ukabr6Xкабильскийr7Ukaar8Xкаракалпакскийr9Ukajr:X каджиr;Ukamr<X камбаr=Ukarr>Xкаренскийr?Ukawr@XкавиrAUfr_CHrBX-Швейцарский французскийrCUtyvrDXтувинскийrEUfr_CArFX)Канадский французскийrGUkarHXгрузинскийrIUdoirJX догриrKUkgrLX конгоrMUkkrNXказахскийrOUkjrPX кунамаrQUkirRX кикуйюrSUkorTXкорейскийrUUknrVXканнадаrWUkmrXXкхмерскийrYUklrZX1эскимосский (гренландский)r[Uksr\Xкашмириr]Ukrr^X кануриr_Ukwr`XкорнийскийraUkvrbXкомиrcUkurdXкурдскийreUkyrfXкиргизскийrgUtklrhXтокелайскийriUbuarjXбурятскийrkUmgarlX среднеирландскийrmUhitrnXхеттскийroUdyurpXдиула (дьюла)rqUderrXнемецкийrsUdartXдатскийruUdzrvXдзонг-кэrwUluirxXлуисеньоryUdvrzXмальдивскийr{Uhilr|Xхилигайнонr}Uhimr~XхимачалиrUgemrXгерманский языкrUcrprX&креольские и пиджиныrUqurX кечуаrUbasrXбасаrUgbarXгбаяrUbadrX бандаrUbanrXбалийскийrUbalrXбелуджскийrUshnrXшанскийrUbairXбамилеке языкиrUarprXарапахоrUartrX#искусственный языкrUarwrXаравакскийrUarcrXарамейскийrUen_USrX-американский английскийrUsemrXсемитский языкrUselrXселькупскийrUnubrXнубийские языкиrUbtkrXбатакскийrUlusrX лушайrUmusrXкрикrUluarXлуба-лулуаrUirorXирокезские языкиrUirarXиранский языкrUmunrXмунда языкиrUlunrX лундаrUluorX'луо (Кения и Танзания)rUwarXваллонскийrUtuprXтупиrUjvrXяванскийrUzblrXблиссимволикаrUtutrXалтайский языкrUtumrXтумбукаrUjarXяпонскийrUcoprXкоптскийrUilorX илокоrUlarXлатинскийrUgwirX гвичинrUundrXGнеизвестный или недействительный языкrUtlirXтлингитrUtlhrXклингонскийrUchrXчаморроrUcorXкорсиканскийrUcarXкаталанскийrUcerXчеченскийrUponrX понапеrUcyrXваллийскийrUsahrXякутскийrUcsrXчешскийrUcrrXкриийскийrUbntrX бантуrUcvrXчувашскийrUcurX$церковнославянскийrUlvrXлатышскийrUdumrX&средненидерландскийrUptrXпортугальскийrUduarX дуалаrUfrorX старофранцузскийrUyaprXяпrUfrmrX"среднефранцузскийrUtivrXтивиrUfrsrX#восточный фризскийrUfrrrX!фризский северныйrUyaorXяоrUparX#панджаби (пенджаби)rUxalrXкалмыцкийrUes_ESrX'Испанский иберийскийrUpirXпалиrUen_GBrX)британский английскийr Ugayr Xгайоr Uotor X!отомангские языкиr UotarXстаротурецкийrUhmnrX хмонгrUmyvrXэрзяrUgaarXгаrUfurrXфриульскийrUkhirXкойсанский языкrUainrXайнуrUrarrXраротонганскийrUslarXславянский языкrUver X вендаr!Uvir"Xвьетнамскийr#Uisr$Xисландскийr%Ukhor&Xхотанскийr'Uiur(Xинуктитутr)Uitr*Xитальянскийr+Uvor,Xволапюкr-Uiir.Xсычуаньr/Uikr0Xинупиакr1Uior2Xидоr3Uiner4X'индоевропейский языкr5Uiar6Xинтерлингваr7Ujprr8X%еврейско-персидскийr9Uier:Xинтерлингвеr;Uidr<Xиндонезийскийr=Uigr>Xигбоr?Upapr@XпапьяментоrAUeworBX эвондоrCUpaurDX палауrEUpaarFXпапуасский языкrGUpagrHXпангасинанrIUsatrJXсанталиrKUpalrLXпехлевийскийrMUpamrNXпампангаrOUsycrPX+классический сирийскийrQUphirRX!филиппинский языкrSUcelrTXкельтские другиеrUUphnrVXфиникийскийrWUnicrXX,нигер-кордофанский языкrYUniarZXниасr[Udgrr\X догрибr]Usyrr^Xсирийскийr_Uniur`XниуэraUgswrbX'Швейцарский немецкийrcUcchrdX атсамreUjborfX ложбанrgUnahrhXацтекскийriUsamrjX/самаритянский арамейскийrkUhairlX хайдаrmUgmhrnX(средневерхненемецкийroUcusrpXкушитский языкrqUwenrrXлужицкие языкиrsUadyrtXадыгейскийruUelxrvXэламскийrwUadarxXадангмеryUpt_PTrzX/Португальский иберийскийr{Uhawr|Xгавайскийr}Ubinr~XбиниrUbikrXбикольскийrUpt_BRrX1бразильский португальскийrUmosrXмосиrUmohrX мохаукrUtlrXтагалогrUzh_HansrX'упрощенный китайскийrUzh_HantrX+Традиционный китайскийrUtvlrX тувалуrUijorXиджоrUkmbrXкимбундийскийrUpeorXстароперсидскийrUumbrXумбундуrUtmhrXтамашекrUfonrXфонrUhsbrXверхнелужицкийrUberXбелорусскийrUbgrXболгарскийrUbarXбашкирскийrUpsrXпашто (пушту)rUbmrXбамбарийскийrUbnrXбенгальскийrUborXтибетскийrUbhrX бихариrUbirXбисламаrUbrrXбретонскийrUbsrXбоснийскийrUruprXарумынскийrUzzarXзазаrUomrX оромоrUojrXоджибваrUacerXачехскийrUachrX ачолиrUocrXокситанскийrUkrurX курухrUsrrrX серерrUkrorXкруrUkrlrXкарельскийrUkrcrX'карачаево-балкарскийrUndsrXнижнегерманскийrUosrXосетинскийrUorrXорияrUsogrXсогдийскийrUnsorXсото северныйrUsonrX cонгаиrUde_CHrX3Швейцарский верхненемецкийrUvairXваиrUwakrXвакашские языкиrUlolrX монгоrUmkhrX!монкхмерский языкrUawarX авадхиrUlozrXлозиrUgilrXгильбертскийrUwasrXвашоrUwarrX варайrUhzrX герероrUhyrXармянскийrUanrXарагонскийrUsidrX сидамаrUhrrXхорватскийrUhtrXгаитянскийrUhurXвенгерскийrUhirX хиндиrUhorXхиримотуrUharX хаусаrUbugrXбугийскийrUherX ивритrUuzrXузбекскийrUurrXурдуrUplrXпольскийr Uukr Xукраинскийr Uugr Xуйгурскийr UaarXафарrUabrXабхазскийrUaerXавестийскийrUafrXафрикаансrUakrXаканrUamrXамхарскийrUnl_BErX-Бельгийский фламандскийrUeurXбаскскийrUasrXассамскийrUarr Xарабскийr!Uinhr"Xингушскийr#Utpir$Xток-писинr%Umynr&Xмайя языкиr'Uayr(X аймараr)Ukhar*X кхасиr+Uazr,Xазербайджанскийr-Uincr.Xиндийский языкr/Unlr0Xголландскийr1Unnr2X#норвежский нюнорскr3Unor4Xнорвежскийr5Unar6X науруr7Unbr8X!норвежский букмолr9Unair:X9язык индейцев Северной Америкиr;Undr<X!ндебели (северный)r=Uner>Xнепальскийr?Ungr@X ндонгаrAUnyrBXньянджаrCUnaprDXнеаполитанскийrEUgrbrFX гребоrGUgrcrHXдревнегреческийrIUnrrJXндебели южныйrKUtigrLX тигреrMUnvrNX навахоrOUzunrPX зуньиrQUrwrRXкиньяруандаrSUcperTX/англо-креольские и пиджинrUUcpfrVX3франко-креольские и пиджиныrWUcpprXX9португало-креольские и пиджиныrYuU territoriesrZ}r[(UBDr\XБангладешr]UBEr^XБельгияr_UBFr`XБуркина ФасоraUBGrbXБолгарияrcUVErdXВенесуэлаreUBArfX&Босния и ГерцеговинаrgUBBrhXБарбадосriUWFrjXУоллис и ФутунаrkUBLrlX0Остров Святого БартоломеяrmUBMrnX#Бермудские ОстроваroUBNrpX!Бруней ДаруссаламrqUBOrrXБоливияrsUBHrtXБахрейнruUBIrvXБурундиrwUBJrxX БенинryUBTrzX Бутанr{U011r|XЗападная Африкаr}UBVr~XОстров БувеrUBWrXБотсванаrU014rXВосточная АфрикаrU015rXСеверная АфрикаrUBRrXБразилияrU017rX#Центральная АфрикаrU018rXЮжная Африка [018]rU019rX3Центральная и Южная АмерикаrUBYrXБеларусьrUBZrX БелизrULVrX ЛатвияrURWrX РуандаrURSrX СербияrUTLrXВосточный ТиморrURErXРеюньонrUTMrXТуркменистанrUOMrXОманrUTJrXТаджикистанrUROrXРумынияrUTKrXТокелауrUGWrXГвинея-БиссауrUGUrXГуамrUGTrXГватемалаrUGSrXMЮжная Джорджия и Южные Сандвичевы ОстроваrUGRrX ГрецияrUGQrX)Экваториальная ГвинеяrUGPrXГваделупаrUJPrX ЯпонияrUKIrXКирибатиrUGYrX ГайанаrUGGrX ГернсиrUGFrX#Французская ГвианаrUGErX ГрузияrUGDrXГренадаrU021rX%Северная Америка (021)rUGBrXВеликобританияrUGArX ГабонrUSVrXСальвадорrUGNrX ГвинеяrUGMrX ГамбияrUGLrXГренландияrU029rX КарибыrUGIrXГибралтарrUGHrXГанаrUJErX ДжерсиrUTNrX ТунисrUJMrX ЯмайкаrU013rX%Центральная АмерикаrUWSrX СамоаrU419rX?Латинская Америка и Карибские о-ваrUHRrXХорватияrUBSrX!Багамские островаrUHTrX ГаитиrUHUrXВенгрияrUHKrXSГонконг, Особый Административный Район КитаяrU039rXЮжная ЕвропаrUHNrXГондурасrUFIrXФинляндияrU142rXАзияrU030rXВосточная АзияrU034rXЮжная АзияrU035rX"Юго-Восточная АзияrUPRrXПуэрто-РикоrUPSrX+Палестинская автономияrU830rX%Нормандские островаrUFKrX'Фолклендские островаrUIOrXLБританская территория в Индийском океанеrUPWrX ПалауrUPTrXПортугалияrUSJrX%Свальбард и Ян-Майенr UMDr XМолдоваr UFMr X8Федеративные Штаты Микронезииr UIQrXИракrUPArX ПанамаrUPFrX)Французская ПолинезияrUPGrX"Папуа-Новая ГвинеяrUPErXПеруrUPKrXПакистанrUPHrXФилиппиныrUFOrX!Фарерские островаrUPNrXПиткернrUPLr X Польшаr!UPMr"X!Сен-Пьер и Микелонr#UZMr$X Замбияr%UEHr&XЗападная Сахараr'URUr(X Россияr)UEEr*XЭстонияr+UEGr,X Египетr-UZAr.XЮжная Африкаr/UECr0XЭквадорr1UITr2X Италияr3UVNr4XВьетнамr5UZZr6XKНеизвестный или недействительный регионr7USBr8X#Соломоновы Островаr9UETr:XЭфиопияr;USOr<X Сомалиr=UZWr>XЗимбабвеr?USAr@X!Саудовская АравияrAUESrBXИспанияrCUERrDXЭритреяrEUMErFXЧерногорияrGUAQrHXАнтарктикаrIUMGrJXМадагаскарrKUMFrLX*Остров Святого МартинаrMUMArNXМароккоrOUMCrPX МонакоrQUUZrRXУзбекистанrSUMMrTX МьянмаrUUMLrVXМалиrWUMOrXXOМакао, Особый Административный Район КитаяrYUMNrZXМонголияr[UHMr\X/Острова Херд и Макдональдr]UASr^X#Американское Самоаr_UMKr`XМакедонияraUMUrbXМаврикийrcUMTrdX МальтаreUMWrfX МалавиrgUMVrhXМальдивыriUMQrjXМартиникrkUMPrlX4Северные Марианские ОстроваrmUMSrnXМонсерратroUMRrpXМавританияrqUIMrrXОстров МэнrsUUGrtX УгандаruUTZrvXТанзанияrwUMYrxXМалайзияryUMXrzXМексикаr{UILr|XИзраильr}UFRr~XФранцияrUAWrX АрубаrUDOrX/Доминиканская РеспубликаrUSHrX$Остров Святой ЕленыrUVCrX-Сент-Винсент и ГренадиныrU054rXМеланезияrUDJrXДжибутиrUFJrX ФиджиrU057rXМикронезияrU172rXСНГrU053rX1Австралия и Новая ЗеландияrUNIrXНикарагуаrUNLrXНидерландыrUNOrXНорвегияrUNArXНамибияrUVUrXВануатуrUNCrXНовая КаледонияrUNErX НигерrUNFrXОстров НорфолкrUNGrXНигерияrUNZrXНовая ЗеландияrUNPrX НепалrUNRrX НауруrUNUrXНиуеrU061rXПолинезияrUCIrXКот д’ИвуарrUCHrXШвейцарияrUCOrXКолумбияrUCNrX КитайrUCMrXКамерунrUCLrXЧилиrUCCrX!Кокосовые островаrUCArX КанадаrUCGrX КонгоrUCFrX@Центрально-Африканская РеспубликаrUCDrX>Демократическая Республика КонгоrUCZrX#Чешская республикаrUCYrXКипрrUCXrXОстров РождестваrUCSrX$Сербия и ЧерногорияrUCRrXКоста-РикаrUPYrXПарагвайrUCVrX(Острова Зеленого МысаrUCUrXКубаrUSZrXСвазилендrUSYrX8Сирийская Арабская РеспубликаrUKGrXКыргызстанrUKErX КенияrUSRrXСуринамrU143rXСредняя АзияrUKHrXКамбоджаrUKNrX!Сент-Киттс и НевисrUKMrX!Коморские ОстроваrUSTrX#Сан-Томе и ПринсипиrUSKrXСловакияrUKRrXРеспублика КореяrUSIrXСловенияrUKPrXUКорейская Народно-Демократическая РеспубликаrUKWrX КувейтrUSNrXСенегалrUSMrXСан-МариноrUSLrXСьерра-ЛеонеrUSCrX%Сейшельские ОстроваrUKZrXКазахстанrUKYrX!Каймановы островаrUSGrXСингапурrUSErX ШвецияrUSDrX СуданrU151rXВосточная ЕвропаrU150rX Европаr UDMr XОстров Доминикаr U155r XЗападная Европаr U154rXСеверная ЕвропаrUVGrX8Британские Виргинские ОстроваrUDErXГерманияrUYErX ЙеменrUMHrX#Маршалловы ОстроваrU062rXЮг Средней АзииrUDZrX АлжирrUUSrXСШАrUUYrXУругвайrUYTr XМайоттаr!UUMr"X1Внешние малые острова (США)r#ULBr$X Ливанr%ULCr&XСент-Люсияr'ULAr(XЛаосr)UTVr*X Тувалуr+UTWr,XТайваньr-UTTr.X Тринидад и Тобагоr/UTRr0X Турцияr1ULKr2XШри-Ланкаr3ULIr4XЛихтенштейнr5UCKr6XОстрова Кукаr7UTOr8X Тонгаr9ULTr:X Литваr;ULUr<XЛюксембургr=ULRr>XЛиберияr?ULSr@X ЛесотоrAUTHrBXТаиландrCUTFrDX6Французские Южные ТерриторииrEUTGrFXТогоrGUTDrHXЧадrIUTCrJX)Острова Тёркс и КайкосrKULYrLX ЛивияrMUVArNXВатиканrOU145rPX-Ближний и Средний ВостокrQUAErRX8Объединенные Арабские ЭмиратыrSUADrTXАндорраrUUAGrVX Антигуа и БарбудаrWUAFrXXАфганистанrYUAIrZXАнгуиллаr[UVIr\X<Американские Виргинские Островаr]UISr^XИсландияr_UIRr`XИранraUAMrbXАрменияrcUALrdXАлбанияreUAOrfX АнголаrgUANrhX>Нидерландские Антильские островаriU003rjXСеверная АмерикаrkU002rlX АфрикаrmU001rnXМирroUARrpXАргентинаrqUAUrrXАвстралияrsUATrtXАвстрияruU005rvXЮжная АмерикаrwUINrxX ИндияryUAXrzX!Аландские островаr{U009r|XОкеанияr}UAZr~XАзербайджанrUIErXИрландияrUIDrXИндонезияrUJOrXИорданияrUQUrXЕвропейский союзrUUArXУкраинаrUQArX КатарrUDKrX ДанияrUMZrXМозамбикrUQOrXВнешняя ОкеанияruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X dd.MM.yyyyrhSX%(dd)s.%(MM)s.%(yyyy)srubUfullrhO)r}r(h3XEEEE, d MMMM yyyy 'г'.rhSX%%(EEEE)s, %(d)s %(MMMM)s %(yyyy)s г.rubUlongrhO)r}r(h3Xd MMMM yyyy 'г'.rhSX%(d)s %(MMMM)s %(yyyy)s г.rubUshortrhO)r}r(h3Xdd.MM.yyrhSX%(dd)s.%(MM)s.%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUVNDrXДонгrUKHRrXCRrUMYRrXRMrULYDrXLDrUUAHrXгрн.rUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUVUVrXVTrUAUDrX$ArUSYPrXLSrUMZMrXMtrUSCRrXSRrUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUGBPrX£rUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUJMDrXJ$rUGELrXlarir UZWDr XZ$r UTRLr XTLr UBDTrXTkrUYERrXYRlrUANGrXNA f.rUXCDrXEC$rUNOKrXNKrrUINRrXINRrUMXNrXMEX$rUBTNrXNurUCOPrXCol$rUIDRr XRpr!UHNLr"XLr#UFJDr$XF$r%UETBr&XBrr'UBZDr(XBZ$r)UDOPr*XRD$r+UQARr,XQRr-USEKr.XSKrr/USRGr0XSfr1UADPr2Xандоррских песетr3UIEPr4XIR£r5UBBDr6XBDS$r7UGTQr8XQr9UVEBr:XBer;UCLPr<XCh$r=UALLr>Xlekr?UKZTr@XTrAURUBrBXруб.rCUTTDrDXTT$rEUOMRrFXROrGUSBDrHXSI$rIURURrJXр.rKUPLNrLXZlrMUKESrNXK ShrOUMKDrPXMDenrQUTWDrRXNT$rSUTOPrTXT$rUUGNFrVXGFrWUIQDrXXIDrYUCVErZXCVEscr[UCADr\XCan$r]UCYPr^X£Cr_UKWDr`XKDraUBIFrbXFburcUSOSrdXSh.reUSGDrfXS$rgUSTDrhXDbriUIRRrjXRIrkUCNYrlXYrmUGYDrnXG$roUMTLrpXLmrqUNZDrrX$NZrsUUSDrtX$ruUKGSrvXsomrwUARSrxXArg$ryUSZLrzXEr{UBHDr|XBDr}UJPYr~X¥ruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXКанарские о-ваrsUAustralia/Melbourner}rjXМельбурнrsU Europe/Minskr}rjX МинскrsUAmerica/Nipigonr}rjXНипигонrsUAmerica/Miquelonr}rjXМикелонrsUPacific/Wallisr}rjX УоллисrsUAntarctica/Davisr}rjX ДейвисrsUAmerica/Coral_Harbourr}rjXКорал-ХарборrsU Asia/Dhakar}rjX ДаккаrsUAmerica/St_Luciar}rjXСент-ЛюсияrsU Asia/Kashgarr}rjX КашгарrsUAmerica/Phoenixr}rjX ФиниксrsU Asia/Kuwaitr}rjX КувейтrsUAsia/Hong_Kongr}rjXГонконгrsUArctic/Longyearbyenr}rjXЛонгйирrsUEurope/Guernseyr}rjX ГернсиrsU Europe/Parisr}rjX ПарижrsUEurope/Stockholmr}rjXСтокгольмrsU Pacific/Fijir}rjX ФиджиrsU Pacific/Apiar}rjXАпияrsUPacific/Pago_Pagor}rjXПаго-ПагоrsU Asia/Rangoonr}rjX РангунrsUAmerica/Mexico_Cityr}rjX МехикоrsUAmerica/Puerto_Ricor}rjXПуэрто-РикоrsUIndian/Mauritiusr}rjXМаврикийrsU Europe/Berlinr}rjX БерлинrsU Europe/Zurichr}rjX ЦюрихrsU America/Belemr}rjX БеленrsU Europe/Skopjer}rjX СкопьеrsUAsia/Krasnoyarskr}rjXКрасноярскrsUAtlantic/Bermudar}rjXБермудыrsUAustralia/Currier}rjX КерриrsU Asia/Tehranr}rjXТегеранrsU Asia/Saigonr}rjX СайгонrsU Asia/Bakur}rjXБакуrsUAmerica/Danmarkshavnr}rjXДенмарксхавнrsUAmerica/Scoresbysundr}rjXСкорсбисуннrsUAmerica/Eiruneper}rjXЭйрунепеrsUAmerica/Caracasr}rjXКаракасrsU Asia/Baghdadr}rjX БагдадrsUAfrica/Monroviar}rjXМонровияrsUAmerica/St_Vincentr}rjXСент-ВинсентrsUAmerica/Vancouverr}rjXВанкуверrsU Asia/Thimphur}rjX ТимпуrsU Africa/Accrar}rjX Аккраr sUAmerica/Belizer }r jX Белизr sUAmerica/Edmontonr }rjXЭдмонтонrsUAmerica/Mendozar}rjXМендосаrsU Asia/Tokyor}rjX ТокиоrsUPacific/Kiritimatir}rjXКиритиматиrsUAustralia/Sydneyr}rjX СиднейrsU Europe/Rigar}rjXРигаrsU Asia/Dilir}r jXДилиr!sUAfrica/Mbabaner"}r#jXМбабанеr$sU Asia/Oralr%}r&jXОрал (Уральск)r'sU Asia/Adenr(}r)jXАденr*sUEurope/Isle_of_Manr+}r,jX Мэн, о-вr-sUEurope/Istanbulr.}r/jXСтамбулr0sU Asia/Magadanr1}r2jXМагаданr3sUAustralia/Lindemanr4}r5jXЛиндеманr6sUPacific/Galapagosr7}r8jXГалапагос, о-ваr9sUAmerica/Bogotar:}r;jX Боготаr<sUAmerica/Dawsonr=}r>jX Доусонr?sUAmerica/Chicagor@}rAjX ЧикагоrBsUPacific/KwajaleinrC}rDjXКваджалейнrEsUAustralia/Broken_HillrF}rGjXБрокен-ХиллrHsUAmerica/CuiabarI}rJjX КуябаrKsUIndian/ChristmasrL}rMjXРождества, о-вrNsU Asia/JayapurarO}rPjXДжайпурrQsUEurope/BrusselsrR}rSjXБрюссельrTsU Europe/LisbonrU}rVjXЛиссабонrWsUAsia/ChongqingrX}rYjX ЧунцинrZsUAmerica/Noronhar[}r\jXНоронхаr]sUEurope/Podgoricar^}r_jXПодгорицаr`sUAfrica/Algiersra}rbjX АлжирrcsU Africa/Hararerd}rejX ХарареrfsUAfrica/Ndjamenarg}rhjXНджаменаrisUAmerica/Costa_Ricarj}rkjXКоста-РикаrlsUEurope/Ljubljanarm}rnjXЛюблянаrosUIndian/Mayotterp}rqjXМайоркаrrsUAsia/Phnom_Penhrs}rtjXПномпеньrusUAmerica/Managuarv}rwjXМанагуаrxsU Asia/Bruneiry}rzjX Брунейr{sUAmerica/Tijuanar|}r}jXТихуанаr~sUPacific/Fakaofor}rjXФакаофоrsUAmerica/Martiniquer}rjXМартиникаrsUAmerica/Antiguar}rjXАнтигуаrsUAmerica/Argentina/La_Riojar}rjXЛа-РиохаrsUPacific/Tahitir}rjXТаити, о-вrsUAmerica/Pangnirtungr}rjXПангниртангrsU Europe/Zagrebr}rjX ЗагребrsUAmerica/Asuncionr}rjXАсунсьонrsU Europe/Viennar}rjXВенаrsUAustralia/Hobartr}rjX ХобартrsUAmerica/Juneaur}rjX ДжуноrsUAmerica/Inuvikr}rjX ИнувикrsUAmerica/Montrealr}rjXМонреальrsU Asia/Seoulr}rjXСеулrsU Indian/Comoror}rjX!Коморские островаrsUAntarctica/Rotherar}rjX РотераrsUEurope/Tallinnr}rjX ТаллинrsU Indian/Maher}rjXМаэrsU Asia/Calcuttar}rjXКалькуттаrsU America/Adakr}rjXАдак, о-вrsUAsia/Singaporer}rjXСингапурrsUAfrica/Nairobir}rjXНайробиrsUAmerica/Maceior}rjX МасейоrsU Asia/Urumqir}rjX УрумчиrsU Europe/Moscowr}rjX МоскваrsUAsia/Pyongyangr}rjXПхеньянrsUAsia/Ulaanbaatarr}rjXУлан-БаторrsUAmerica/Rainy_Riverr}rjXРейни-РиверrsUIndian/Maldivesr}rjXМальдивыrsU Asia/Colombor}rjXКоломбоrsUAustralia/Adelaider}rjXАделаидаrsUAmerica/Cambridge_Bayr}rjXКеймбридж-БейrsU Africa/Luandar}rjX ЛуандаrsUPacific/Chathamr}rjXЧатем, о-вrsUAmerica/Indiana/Winamacr}rjXВинамакrsUAmerica/Cordobar}rjXКордоваrsU Asia/Tbilisir}rjXТбилисиrsUEurope/Gibraltarr}rjXГибралтарrsU Asia/Karachir}rjX КарачиrsU Asia/Harbinr}rjX ХарбинrsUAustralia/Lord_Hower}rjXЛорд-Хау, о-вrsUAmerica/Boa_Vistar}rjXБоа-ВистаrsUAfrica/Tripolir}rjXТриполиrsUIndian/Reunionr }r jXРеюньонr sUAtlantic/Stanleyr }r jX Стэнлиr sUAmerica/Blanc-Sablonr }r jXБланк-Саблонr sUAmerica/Santo_Domingor }r jXСанто-Домингоr sUAntarctica/Syowar }r jXСеваr sUAmerica/Jamaicar }r jX Ямайкаr sU Europe/Kievr }r jXКиевr sUEurope/Budapestr }r jXБудапештr sUPacific/Midwayr }r jXМидуэй, о-ваr sUAmerica/Goose_Bayr }r jX Гус-Бейr sU Asia/Ammanr }r jX Амманr sU Asia/Sakhalinr! }r" jXСахалин, о-вr# sUAfrica/Windhoekr$ }r% jXВиндхукr& sU Asia/Katmandur' }r( jXКатмандуr) sUAmerica/Guyanar* }r+ jX Гайанаr, sUAmerica/Sao_Paulor- }r. jXСан-Паулуr/ sUAustralia/Perthr0 }r1 jXПертr2 sUAfrica/Djiboutir3 }r4 jXДжибутиr5 sU Asia/Jakartar6 }r7 jXДжакартаr8 sUAntarctica/Palmerr9 }r: jX Палмерr; sUAfrica/Johannesburgr< }r= jXЙоханнесбургr> sU Asia/Irkutskr? }r@ jXИркутскrA sU Africa/NiameyrB }rC jX НиамейrD sUAfrica/CasablancarE }rF jXКасабланкаrG sUAmerica/Indiana/MarengorH }rI jXМаренгоrJ sUAfrica/NouakchottrK }rL jXНуакшотrM sUEurope/VilniusrN }rO jXВильнюсrP sUAmerica/CayennerQ }rR jXКайеннаrS sUAfrica/MogadishurT }rU jXМогадишоrV sUAmerica/Kentucky/MonticellorW }rX jXМонтиселлоrY sUAmerica/Rio_BrancorZ }r[ jXРиу-Бранкуr\ sUAmerica/Cancunr] }r^ jX Канкунr_ sUAmerica/Havanar` }ra jX Гаванаrb sU Pacific/Guamrc }rd jXГуамre sU Asia/Makassarrf }rg jXМакасарrh sUAtlantic/Azoresri }rj jXАзорские о-ваrk sUAustralia/Euclarl }rm jXЮклаrn sU Asia/Shanghairo }rp jX Шанхайrq sUAmerica/Rankin_Inletrr }rs jXРанкин-Инлетrt sU Asia/Beirutru }rv jX Бейрутrw sU Africa/Maputorx }ry jX Мапутуrz sU Asia/Bahrainr{ }r| jXБахрейнr} sU Asia/Ashgabatr~ }r jXАшгабатr sU Asia/Riyadhr }r jX Эр-Риядr sU Europe/Londonr }r jX Лондонr sUAmerica/Monterreyr }r jXМонтеррейr sUAmerica/Anguillar }r jXАнгильяr sU Asia/Damascusr }r jX Дамаскr sUAmerica/North_Dakota/Centerr }r jX*Северная Дакота - Центрr sUAmerica/Indiana/Vevayr }r jX Вивэйr sUAtlantic/St_Helenar }r jXСв. Елены, о-вr sUAmerica/Barbadosr }r jXБарбадосr sUEurope/Vaticanr }r jXВатиканr sUAmerica/Indiana/Vincennesr }r jXВинсенсr sU Asia/Almatyr }r jX Алматыr sU Africa/Lomer }r jXЛомеr sUAfrica/Brazzaviller }r jXБраззавильr sU America/Nomer }r jXНомr sU Europe/Dublinr }r jX Дублинr sUAmerica/Yakutatr }r jX Якутатr sUAmerica/Araguainar }r jXАрагуаинаr sU Europe/Vaduzr }r jX Вадуцr sU Africa/Asmerar }r jX Асмераr sUAntarctica/Mawsonr }r jX Моусонr sUAmerica/Buenos_Airesr }r jXБуэнос-Айресr sU Africa/Maserur }r jX Масеруr sUAmerica/Louisviller }r jXЛуисвиллr sU Asia/Kuchingr }r jX Кучингr sUAfrica/Libreviller }r jXЛибревильr sUAfrica/Freetownr }r jXФритаунr sU Africa/Bissaur }r jX Бисауr sU Europe/Samarar }r jX Самараr sUEurope/Amsterdamr }r jXАмстердамr sU Europe/Tiraner }r jX Тиранаr sUPacific/Saipanr }r jX Сайпанr sUAfrica/Abidjanr }r jXАбиджанr sUEurope/Zaporozhyer }r jXЗапорожьеr sUAmerica/El_Salvadorr }r jXСальвадорr sU Europe/Madridr }r jX Мадридr sUAmerica/Santiagor }r jXСантьягоr sUAmerica/Argentina/San_Luisr }r jXСан-Луисr sU America/Arubar }r jX Арубаr sUAmerica/Indianapolisr }r jXИндианаполисr sUAmerica/Reginar }r jXРеджайнаr sU Pacific/Trukr }r jXТрук, о-ваr sUPacific/Funafutir }r jXФунафутиr sUAmerica/Meridar }r jX Меридаr sUAmerica/Guatemalar }r jXГватемалаr sUAfrica/Sao_Tomer }r jXСан-Томеr sUPacific/Kosraer }r jX Косраеr sUAfrica/Bujumburar }r jXБужумбураr sUEurope/Chisinaur }r jXКишиневr sU Europe/Warsawr }r jXВаршаваr sUAsia/Yekaterinburgr }r jXЕкатеринбургr sUAntarctica/Caseyr }r jX Кейсиr sUAmerica/Halifaxr }r jXГалифаксr sU America/Thuler }r! jXТулеr" sUAmerica/St_Johnsr# }r$ jXСент-Джонсr% sUAmerica/Monctonr& }r' jXМонктонr( sUEurope/Helsinkir) }r* jXХельсинкиr+ sUAtlantic/Cape_Verder, }r- jX(Острова Зеленого Мысаr. sUAmerica/Tegucigalpar/ }r0 jXТегусигальпаr1 sU Indian/Cocosr2 }r3 jX!Кокосовые островаr4 sU America/Boiser5 }r6 jX Бойсеr7 sUAmerica/Guadelouper8 }r9 jXГваделупаr: sUAmerica/Nassaur; }r< jX Нассауr= sU Europe/Praguer> }r? jX Прагаr@ sUPacific/EnderburyrA }rB jXЭндербери, о-вrC sU Asia/HovdrD }rE jXХовдrF sUAmerica/ManausrG }rH jX МанаусrI sUAmerica/GodthabrJ }rK jX ГотхобrL sUAmerica/CatamarcarM }rN jXКатамаркаrO sUAmerica/ChihuahuarP }rQ jX ЧиуауаrR sUAmerica/IqaluitrS }rT jXИкалуитrU sUAmerica/Argentina/Rio_GallegosrV }rW jXРио-ГальегосrX sUPacific/GambierrY }rZ jXГамбье, о-ваr[ sUEurope/Volgogradr\ }r] jXВолгоградr^ sU Africa/Bamakor_ }r` jX Бамакоra sUEurope/Uzhgorodrb }rc jXУжгородrd sU Africa/Banjulre }rf jX Банжулrg sU Asia/Aqtaurh }ri jX Актауrj sU Africa/Malabork }rl jX Малабоrm sUAtlantic/Madeirarn }ro jXМадейра, о-вrp sUPacific/Noumearq }rr jX Нумеаrs sUAfrica/Kinshasart }ru jXКиншасаrv sU Europe/Maltarw }rx jX Мальтаry sUAmerica/Argentina/Ushuaiarz }r{ jX Ушуаяr| sU Asia/Bangkokr} }r~ jXБангкокr sU Pacific/Niuer }r jXНиуэr sUAustralia/Brisbaner }r jXБрисбенr sUAmerica/Recifer }r jX Ресифиr sU Asia/Yerevanr }r jX Ереванr sUAmerica/La_Pazr }r jX Ла-Пасr sU Africa/Cairor }r jXКаирr sU Africa/Lusakar }r jX Лусакаr sUPacific/Guadalcanalr }r jXГвадалканалr sUAmerica/Yellowknifer }r jXЙеллоунайфr sUAsia/Vientianer }r jXВьентьянr sUEurope/Kaliningradr }r jXКалининградr sUAfrica/Conakryr }r jXКонакриr sUAmerica/Argentina/Tucumanr }r jXТукуманr sU Europe/Oslor }r jXОслоr sUAmerica/St_Kittsr }r jXСент-Китсr sUAmerica/Panamar }r jX Панамаr sUAfrica/Gaboroner }r jXГаборонеr sU Pacific/Palaur }r jX Палауr sUAmerica/Guayaquilr }r jXГуаякильr sUAsia/Kuala_Lumpurr }r jXКуала-Лумпурr sUAtlantic/Faeroer }r jX!Фарерские островаr sUAmerica/Menomineer }r jXМеноминиr sUAsia/Kamchatkar }r jX/Петропавловск-Камчатскийr sUAsia/Vladivostokr }r jXВладивостокr sU Asia/Qatarr }r jX Катарr sU Asia/Dubair }r jX Дубайr sU Asia/Yakutskr }r jX Якутскr sU Asia/Omskr }r jXОмскr sU Africa/Banguir }r jX Бангиr sUAmerica/Paramaribor }r jXПарамарибоr sUAfrica/Lubumbashir }r jXЛубумбашиr sUPacific/Marquesasr }r jXМаркизские о-ваr sUEurope/Bratislavar }r jXБратиславаr sU Asia/Anadyrr }r jXАнадырьr sUAmerica/New_Yorkr }r jXНью-Йоркr sUPacific/Norfolkr }r jXНорфолкr sUPacific/Rarotongar }r jXРаротонгаr sUAmerica/Dominicar }r jXДоминикаr sUAfrica/Porto-Novor }r jXПорто-Новоr sUAsia/Samarkandr }r jXСамаркандr sU Asia/Dushanber }r jXДушанбеr sUAmerica/Torontor }r jXТоронтоr sU America/Bahiar }r jXБаияr sUAfrica/Kampalar }r jXКампалаr sUAfrica/Ouagadougour }r jXУагадугуr sUAntarctica/South_Poler }r jXЮжный полюсr sU Asia/Muscatr }r jX Маскатr sUAmerica/Port_of_Spainr }r jXПорт-оф-Спейнr sU Pacific/Waker }r jXУэйк, о-вr sUAmerica/Indiana/Tell_Cityr }r jXТелл-Ситиr sUAustralia/Darwinr }r jX Дарвинr sUAmerica/Whitehorser }r jXУайтхорсr sUAmerica/Swift_Currentr }r jXСвифт-Карентr sUEurope/Copenhagenr }r jXКопенгагенr! sUAmerica/Montserratr" }r# jXМонсерратr$ sU Asia/Tashkentr% }r& jXТашкентr' sUEurope/Simferopolr( }r) jXСимферопольr* sUAfrica/Blantyrer+ }r, jXБлантайрr- sUAmerica/Detroitr. }r/ jXДетройтr0 sUAmerica/Shiprockr1 }r2 jX Шипрокr3 sUAmerica/Grenadar4 }r5 jXГренадаr6 sUAmerica/Indiana/Petersburgr7 }r8 jXПетерсбургr9 sUAsia/Pontianakr: }r; jXПонтианакr< sUAfrica/Dar_es_Salaamr= }r> jXДар-эс-Саламr? sUAmerica/Port-au-Princer@ }rA jXПорт-о-ПренсrB sUAmerica/CaymanrC }rD jX!Каймановы островаrE sU Europe/AthensrF }rG jX АфиныrH sUAmerica/CuracaorI }rJ jXКюрасаоrK sUIndian/KerguelenrL }rM jXКергеленrN sUAfrica/KhartoumrO }rP jX ХартумrQ sU Asia/ManilarR }rS jX МанилаrT sUEurope/SarajevorU }rV jXСараевоrW sU America/JujuyrX }rY jX ЖужуйrZ sU Africa/Doualar[ }r\ jX Дуалаr] sU Europe/Romer^ }r_ jXРимr` sUAmerica/Argentina/San_Juanra }rb jXСан-Хуанrc sUAmerica/North_Dakota/New_Salemrd }re jXНью-Салемrf sUPacific/Port_Moresbyrg }rh jXПорт-Морсбиri sU Europe/Jerseyrj }rk jX Джерсиrl sUEurope/Andorrarm }rn jXАндорраro sUEurope/Luxembourgrp }rq jXЛюксембургrr sUPacific/Honolulurs }rt jXГонолулуru sUAmerica/St_Thomasrv }rw jXСент-Томасrx sUPacific/Majurory }rz jXМаджуроr{ sUAmerica/Mazatlanr| }r} jXМасатланr~ sU Asia/Macaur }r jX Макаоr sUEurope/Belgrader }r jXБелградr sUAsia/Choibalsanr }r jXЧойбалсанr sUEurope/Mariehamnr }r jXМариехамнr sUAntarctica/McMurdor }r jXМак-Мердоr sUAmerica/Thunder_Bayr }r jXТандер-Бейr sUAmerica/Los_Angelesr }r jXЛос-Анджелесr sU Asia/Kabulr }r jX Кабулr sUIndian/Antananarivor }r jXАнтананаривуr sUAtlantic/Reykjavikr }r jXРейкьявикr sU Asia/Nicosiar }r jXНикосияr sUPacific/Ponaper }r jXПонапе, о-вr sUPacific/Tongatapur }r jXТонгатапуr sUPacific/Pitcairnr }r jXПиткернr sUPacific/Easterr }r jXПасхи, о-вr sUAtlantic/South_Georgiar }r jX8Ю.Джорджия и Ю.Сэндвинчевы о-ваr sUAfrica/El_Aaiunr }r jX Эль-Аюнr sUAmerica/Campo_Grander }r jXКампу-Грандиr sUAmerica/Dawson_Creekr }r jXДосон-Крикr sUAntarctica/Vostokr }r jX Востокr sUEurope/Bucharestr }r jXБухарестr sUAmerica/Porto_Velhor }r jXПорту-Вельюr sU Europe/Monacor }r jX Монакоr sU Asia/Bishkekr }r jX Бишкекr sU Africa/Ceutar }r jX Сеутаr sUAmerica/Winnipegr }r jXВиннипегr sU Asia/Aqtober }r jX!Актобе (Актюбинск)r sU Africa/Dakarr }r jX Дакарr sUAmerica/Fortalezar }r jXФорталезаr sUPacific/Tarawar }r jX Тараваr sUAfrica/Addis_Ababar }r jXАддис-Абебаr sU Pacific/Efater }r jX Эфатеr sUPacific/Johnstonr }r jXДжонстон, ат.r sUAsia/Qyzylordar }r jXКызылордаr sUEurope/San_Marinor }r jXСан-Мариноr sUAsia/Jerusalemr }r jXИерусалимr sUPacific/Aucklandr }r jX Оклендr sUAmerica/Tortolar }r jXТортолаr sUAmerica/Denverr }r jX Денверr sU Indian/Chagosr }r jX Чагосr sUAmerica/Glace_Bayr }r jXГлейс-Бейr sUAmerica/Hermosillor }r jXЭрмосильоr sU Africa/Tunisr }r jX Тунисr sUAmerica/Montevideor }r jXМонтевидеоr sUAmerica/Resoluter }r jXРезолютr sU Asia/Gazar }r jXГазаr sU Asia/Taipeir }r jX Тайбэйr sUAntarctica/DumontDUrviller }r jXДюмон-д'Юрвильr sUAmerica/Indiana/Knoxr }r jXНоксr sUAsia/Novosibirskr }r jXНовосибирскr sU Africa/Kigalir }r jX Кигалиr sUAmerica/Grand_Turkr }r jXГранд Туркr sU Africa/Lagosr }r jX Лагосr sU Europe/Sofiar }r jX Софияr sU America/Limar! }r" jXЛимаr# sU Etc/Unknownr$ }r% jXНеизвестныйr& sUAmerica/Anchorager' }r( jXАнкориджr) sU Pacific/Naurur* }r+ jX Науруr, suUscriptsr- }r. (UGurur/ XГурмукхиr0 UHebrr1 X Ивритr2 UZzzzr3 XWНеизвестная или недействительная письменностьr4 UPhnxr5 XФиникийскаяr6 UMoonr7 XАзбука Мунаr8 USamrr9 XСамаритянскаяr: UChamr; XЧамскаяr< UArabr= XАрабскаяr> UGujrr? XГуджаратиr@ UZxxxrA XНенаписаннаяrB ULycirC X ЛицианrD USinhrE XСингальскаяrF UTalurG XНовый Тайский ЛеrH UMongrI XМонгольскаяrJ UXpeorK XСтароперсидскаяrL UVisprM XВидимая речьrN URjngrO XРеджангскаяrP UOlckrQ X Ол ЧикиrR UTalerS XТайский ЛеrT UMandrU XМандейскаяrV UManirW XМанихейскаяrX UMlymrY XМалаяльскаяrZ UTibtr[ XТибетскаяr\ UKalir] XКайаr^ UJpanr_ XЯпонскаяr` UPlrdra X+Поллардовская фонетикаrb UKanarc XКатаканаrd ULydire XЛидийскаяrf ULepcrg X Лепхаrh USundri XСунданскаяrj UYiiirk XЙи (ицзу)rl UJavarm XЯванскаяrn UOryaro XОрияrp ULaoorq XЛаосскаяrr UUgarrs XУгаритскаяrt UCyrlru XКириллицаrv UVaiirw XВайскаяrx UArmnry XАрмянскаяrz UCyrsr{ XСтарославянскаяr| UKhmrr} XКхмерскаяr~ UArmir XАрамейскаяr USylor XСилоти Нагриr UItalr X Староитальянскаяr USgnwr XЯзык знаковr UXsuxr X2Шумеро-аккадская клинописьr UThaar X Таанаr UThair XТайскаяr UCprtr XКипрскаяr ULinbr X Линейное письмо Бr ULinar X Линейное письмо Аr UOsmar XОсманскаяr USaurr XСаураштраr UHirar XХираганаr UHanir XКитайскаяr UEgydr X-Египетская демотическаяr UQaair XУнаследованнаяr UEgyhr X-Египетская иератическаяr UCansr XUУнифицированные Символы Канадских Аборигеновr UEgypr X3Египетская иероглифическаяr UTfngr XДревнеливийскаяr UShawr XАлфавит Шоуr UCirtr XКиртr UGeorr XГрузинскаяr UTengr XТенгварскаяr UHrktr X(Катакана или хираганаr UGeokr X!Грузинская хуцуриr UOgamr XОгамическаяr UDsrtr XДезеретr UGothr XГотскаяr UHanor X Ханунуr UBalir XБалийскаяr UKorer XКорейскаяr UHangr X Хангулr UCarir XКарийскаяr UAvstr XАвестийскаяr UTagbr XТагбанваr UHansr X'Упрощенная китайскаяr UHantr X+Традиционная китайскаяr URoror XРонго-ронгоr UDevar XДеванагариr UIndsr XEХараппская (письменность долины Инда)r UBopor XБопомофоr UMymrr XМайанмарскаяr UTglgr XТагалогr UPermr XДревнепермскаяr UBugir XБугинизийскаяr UPhagr X Пагспаr UBrair X Брайляr UBrahr X Брахмиr UBatkr XБатакскаяr UMeror XМероитскаяr ULimbr X Лимбуr UMteir XМанипуриr UTelur X Телугуr UTamlr XТамильскаяr USarar X Саратиr ULatgr X#Гэльская латинскаяr ULatfr X#Латинская фрактураr UKharr XКхароштхиr UNkoor XНкоr UPhlvr XПахлави книжнаяr ULatnr XЛатиницаr UMayar XМайяr ULanar X Ланнаr UEthir XЭфиопскаяr UKthir X Кайтхиr UHmngr XПахау хмонгr UBuhdr X Бухидr UCoptr XКоптскаяr UGlagr XГлаголицаr URunrr XРуническаяr UOrkhr X!Орхоно-енисейскаяr UCakmr XЧакмийскаяr UHungr XСтаровенгерскаяr UGrekr XГреческаяr UCherr X Черокиr UZyyyr XОбщепринятаяr USyrcr XСирийскаяr UBlisr XБлиссимволикаr UBengr XБенгальскаяr USyrer X'Сирийская эстрангелоr USyrjr! X Западносирийскаяr" USyrnr# X#Восточно-сирийскаяr$ UKndar% XКаннадаr& uUvariantsr' }r( (UBAKU1926r) XMУнифицированный тюрско-латинский алфавитr* UAREVMDAr+ X!Западно-армянскийr, U1994r- XPСтандартизированная резьянская орфографияr. UTARASKr/ XТарашкевицаr0 U1996r1 X`Правила немецкой орфографии установленные с 1996 годаr2 UMONOTONr3 XМонотонныйr4 USCOTLANDr5 X!Англо-шотландскийr6 U1606NICTr7 XLПоздне-средневековый французский до 1606 г.r8 UFONIPAr9 XBМеждународный фонетический алфавитr: UAREVELAr; X#Восточно-армянскийr< UPOSIXr= XКомпьютерныйr> UVALENCIAr? XВаленсийскийr@ UROZAJrA XРезьянскийrB UPOLYTONrC XМноготональныйrD USAAHOrE XСахоrF U1901rG X>Традиционная немецкая орфографияrH uUnumber_symbolsrI }rJ (UdecimalrK X,rL UgrouprM X rN uUcurrency_namesrO }rP (UXXXrQ XKНеизвестная или недействительная валютаrR jXАлжирский динарrS ULVRrT XЛатвийский рубльrU UGHSrV XСеди ГаныrW UBOPrX XБоливийское песоrY UEGPrZ XЕгипетский фунтr[ jXЛевr\ UBGNr] XБолгарский левr^ UPABr_ X!Панамское бальбоаr` UYUMra X,Югославский новый динарrb j XДоллар Зимбабвеrc UGHCrd XГанский седиre UXBDrf Xhрасчетная единица европейского валютного соглашения (XBD)rg jXБоливианоrh UXBAri X8Европейская составная единицаrj jXДатская кронаrk UXBCrl Xhрасчетная единица европейского валютного соглашения (XBC)rm UXBBrn X6Европейская денежная единицаro UBWPrp XБотсванская пулаrq jXЛиванский фунтrr jX'Танзанийский шиллингrs jXВьетнамский донгrt jXДоллар Намибииru UAOArv X!Ангольская кванзаrw UWSTrx XТалаry UAONrz X8Ангольская новая кванза (1990-2000)r{ jX%Камбоджийский риельr| jX'Малайзийский ринггитr} UAOKr~ X-Ангольская кванза (1977-1990)r jdX%Сомалийский шиллингr UKYDr X2Доллар Каймановых острововr jXЛивийский динарr jX!Украинская гривнаr UUAKr X+Карбованец (украинский)r UUGXr X%Угандийский шиллингr jXИорданский динарr UAORr X>Ангольская кванза реюстадо (1995-1999)r USURr XРубль СССРr UAWGr X#Арубанский гульденr jXСаудовский риалr UFIMr XФинская маркаr jX#Гонконгский долларr j0X%Суринамский гульденr UTPEr XТиморское эскудоr UMGFr X%Малагасийский франкr UCHEr X WIR евроr jX!Швейцарский франкr UGIPr X#Гибралтарский фунтr jX!Белорусский рубльr j>XАлбанский лекr UXPDr XПалладийr UUGSr X2Старый угандийский шиллингr jX!Мавританская угияr UBOVr X!Боливийский мвдолr UHRKr XХорватская кунаr jXФранк Джибутиr UHRDr XХорватский динарr UPESr XПеруанский сольr UEQEr X Эквелеr UITLr XИтальянская лираr UXAFr XФранк КФА ВЕАСr UBNDr X!Брунейский долларr UISKr XИсландская кронаr UZALr X>Южноафриканский рэнд (финансовый)r USRDr X#Суринамский долларr UNIOr XЗолотая кордобаr ULAKr XКип ЛНДРr UNICr X+Никарагуанская кордобаr jXНепальская рупияr UMZEr X%Мозамбикское эскудоr UUYUr XУругвайское песоr ULUCr X>Конвертируемый франк Люксембургаr jXЯмайский долларr UFRFr X!Французский франкr UMAFr X#Марокканский франкr jX4Старый мозамбикский метикалr UMZNr XМетикалr UPHPr X!Филиппинское песоr jX'Южноафриканский рэндr URHDr X#Родезийский долларr UGWPr X Песо Гвинеи-Бисауr ULUFr X'Люксембургский франкr UBELr X8Бельгийский франк (финансовый)r UBECr X@Бельгийский франк (конвертируемый)r UNGNr X!Нигерийская найраr UYUNr X!Югославский динарr jX!Бельгийский франкr UPLZr X Злотыйr jX'Костариканский колонr j XТурецкая лираr UDEMr XНемецкая маркаr UEEKr XЭстонская кронаr jX!Малавийская квачаr jDX/Доллар Тринидада и Тобагоr jX&Шри-Ланкийская рупияr jXСловацкая кронаr jZX Эскудо Кабо-Вердеr jX#Пакистанская рупияr jX!Венгерский форинтr jX&Старый Румынский лейr UXEUr X;ЭКЮ (единица европейской валюты)r jX!Бермудский долларr jFXОманский риалr jXЛотиr ULSMr X Малотиr jX#Монгольский тугрикr jXАрмянский драмr UYUDr X0Югославский твердый динарr UBUKr XДжаr jXСирийский фунтrj,XКатарский риалrUXDRrXEСДР (специальные права заимствования)rUNLGrX)Нидерландский гульденrUGEKrXГрузинский купонrUMTPrXМальтийский фунтr jX2Английский фунт стерлинговr jXГрузинский лариr USHPr X/Фунт острова Святой Еленыr UAFNrX АфганиrjHX4Доллар Соломоновых острововrUCSKrX4Чехословацкая твердая кронаrUKPWrX(Северо-корейская вонаrUXRErX!единица RINET-фондовrUCSDrX(Старый Сербский динарrUAFArXАфгани (1927-2002)rUTHBrXТаиландский батrUBYBrX-Белорусский рубль (1994-1999)rjX#Бангладешская такаrUGRDr XГреческая драхмаr!jXЙеменский риалr"UDDMr#X/Восточногерманская маркаr$jzX-Свазилендский лилангениr%UHTGr&XГаитянский гурдr'UTRYr(X$Новая турецкая лираr)UMGAr*X Ариариr+jX>Нидерландский антильский гульденr,ULRDr-X#Либерийский долларr.URWFr/XФранк Руандыr0jXНорвежская кронаr1UMXVr2XDМексиканская пересчетная единица (UDI)r3jNX!Кенийский шиллингr4UMOPr5X Патакаr6jXИндийская рупияr7jX,Мексиканское новое песоr8UCZKr9XЧешская кронаr:UTJSr;X!Таджикский сомониr<UTJRr=XТаджикский рубльr>jXНгултрумr?UYDDr@XЙеменский динарrAUGWErBX4Эскудо Португальской ГвинеиrCjX!Колумбийское песоrDUCOUrEXCЕдиница реальной стоимости КолумбииrFjpXМальтийская лираrGUMURrHX#Маврикийская рупияrIj X%Индонезийская рупияrJj"X'Гондурасская лемпираrKjXФранк КФПrLj$XДоллар ФиджиrMj&XЭфиопский бырrNUPENrOX(Перуанский новый сольrPj(XБелизский долларrQUCHWrRXWIR франкrSUATSrTX%Австрийский шиллингrUUILPrVXИзраильский фунтrWUZRNrXXНовый заирrYj*X#Доминиканское песоrZULULr[X6Финансовый франк Люксембургаr\UTMMr]X!Туркменский манатr^jRX.Новый тайваньский долларr_UMDLr`XМолдавский лейraUXPTrbXПлатинаrcUECVrdXGПостоянная единица стоимости ЭквадораreUECSrfX!Эквадорский сукреrgUBSDrhXБагамский долларrij.XШведская кронаrjjTX ПаангаrkUPEIrlXПеруанское интиrmUZMKrnX!Квача (замбийская)roUMVRrpX!Мальдивская руфияrqUXTSrrX(тестовый валютный кодrsjX'Австралийский долларrtj2X!Андоррская песетаruUCUPrvXКубинское песоrwj4XИрландский фунтrxUCLFryX;Условная расчетная единица Чилиrzj6X%Барбадосский долларr{jX.Франк Коморских острововr|UKRWr}X(Вона Республики Кореиr~UGMDrX!Гамбийский даласиrj8X)Гватемальский кетсальrj:X)Венесуэльский боливарrUXOFrXФранк КФА ВСЕАОrUSITrXСловенский толарrUSDPrXСуданский фунтrj<XЧилийское песоrUEURrXЕвроrUCDFrX#Конголезский франкrjX0Восточно-карибский долларrj@XКазахский тенгеrjBXРоссийский рубльrUXFUrX%Французский UIC-франкrUXAGrXСереброrUBRRrX'Бразильский крузейроrUBRNrX0Бразильское новое крузадоrUBRLrXБразильский реалrUMMKrXКьятrUUYPrX8Уругвайское старое песо (1975-1993)rjJX+Российский рубль (1991-1998)rjLXПольский злотыйrUBRErX3Бразильский крузейро (1990-1993)rUPYGrX'Парагвайский гуараниrUBRCrX%Бразильское крузадоrUBRBrX>Бразильский новый крузейро (1967-1986)rUSVCrX%Сальвадорский колонrUAEDrXДирхам (ОАЭ)rUGNSrXГвинейская силиrjPX!Македонский динарrUAZMrX6Старый азербайджанский манатrUAZNrX)Азербайджанский манатrUUSNrX/Доллар США следующего дняrUGQErX6Эквеле экваториальной ГвинеиrjXВатуrUBADrX1Динар Боснии и ГерцеговиныrjVXГвинейский франкrUMXPrXBМексиканское серебряное песо (1861-1992)rjXXИракский динарrUERNrX НакфаrUBAMrXNКонвертируемая марка Боснии и ГерцеговиныrjX!Сейшельская рупияrj\XКанадский долларrUSDDrXСуданский динарrj^XКипрский фунтrUMADrX%Марокканский дирхамrj`XКувейтский динарrjbX#Бурундийский франкrULTTrXЛитовский талонrUPGKrXКинаrULTLrXЛитовский литrjfX%Сингапурский долларrUUZSrXУзбекский сумrjhX ДобраrUXFOrX0Французский золотой франкrUMLFrXМалийский франкrUESPrXИспанская песетаrjjXИранский риалrUZRZrXЗаирrjlXЮань РенминбиrUSLLrX ЛеонеrUTNDrXТунисский динарrjnXГайанский долларrUESBrX>Испанская песета (конвертируемая)rUESArX$Испанская песета (А)rjrX)Новозеландский долларrUFKPrX2Фунт Фолклендских острововrULVLrXЛатвийский латrUUSSrX+Доллар США текущего дняrjtXДоллар СШАrUARPrX-Аргентинское песо (1983-1985)rjvXКиргизский сомrjxX!Аргентинское песоrUILSrX.Новый израильский шекельrURONrXРумынский лейrURSDrXСербский динарrj|X!Бахрейнский динарrj~XЯпонская иенаrUARArX'Аргентинский аустралrUPTErX'Португальское эскудоrUXAUrX ЗолотоruUmonthsr}r(U stand-aloner}r(Uwider}r(KX Январьr KXФевральr KXМартr KX Апрельr KXМайr KXИюньrKXИюльrKX АвгустrK XСентябрьrK XОктябрьrK X НоябрьrK XДекабрьruU abbreviatedr}r(KXянв.rKX февр.rKXмартrKXапр.rKXмайrKXиюньrKXиюльrKXавг.rK X сент.rK Xокт.r K X нояб.r!K Xдек.r"uUnarrowr#}r$(KXЯr%KXФr&KXМr'KXАr(KXМr)KXИr*KXИr+KXАr,K XСr-K XОr.K XНr/K XДr0uuUformatr1}r2(Uwider3}r4(KX январяr5KXфевраляr6KX мартаr7KX апреляr8KXмаяr9KXиюняr:KXиюляr;KXавгустаr<K Xсентябряr=K Xоктябряr>K X ноябряr?K Xдекабряr@uU abbreviatedrA}rB(KXянв.rCKX февр.rDKX мартаrEKXапр.rFKXмаяrGKXиюняrHKXиюляrIKXавг.rJK X сент.rKK Xокт.rLK X нояб.rMK Xдек.rNuuuUcurrency_formatsrO}rPNh&)rQ}rR(h)Nh+Kh,KKrSh.X ¤rTjTrUh1KKrVh3X #,##0.00 ¤rWh5h/h6rXh8Nh9KKrYubsUdaysrZ}r[(U stand-aloner\}r](Uwider^}r_(KXПонедельникr`KXВторникraKX СредаrbKXЧетвергrcKXПятницаrdKXСубботаreKXВоскресеньеrfuUnarrowrg}rh(KXПriKXВrjKXСrkKXЧrlKXПrmKXСrnKXВrouuUformatrp}rq(Uwiderr}rs(KXпонедельникrtKXвторникruKX средаrvKXчетвергrwKXпятницаrxKXсубботаryKXвоскресеньеrzuU abbreviatedr{}r|(KXПнr}KXВтr~KXСрrKXЧтrKXПтrKXСбrKXВсruuuU meta_zonesr}r(UTurkeyr}r(Ushortr}r(UgenericrXТурецкое времяrUdaylightrX(Турецкое летнее времяrUstandardrX2Турецкое стандартное времяruUcommonrUlongr}r(jXТурецкое времяrjX(Турецкое летнее времяrjX2Турецкое стандартное времяruuU Afghanistanr}r(j}rjXАфганистан времяrsjj}rjXАфганистан времяrsuU Indochinar}r(j}rjX<Индокитайское стандартное времяrsjj}rjX<Индокитайское стандартное времяrsuUEurope_Easternr}r(j}r(jX>Восточноевропейское летнее времяrjX1Восточноевропейское времяrujj}r(jX>Восточноевропейское летнее времяrjX1Восточноевропейское времяruuUAqtober}r(j}r(jX$Актобе летнее времяrjX.Актобе стандартное времяrujj}r(jX$Актобе летнее времяrjX.Актобе стандартное времяruuU Kuybyshevr}r(j}r(jX0Куйбышевское летнее времяrjX#Куйбышевское времяrujj}r(jX0Куйбышевское летнее времяrjX#Куйбышевское времяruuUArabianr}r(j}r(jX,Саудовская Аравия времяrjX9Саудовская Аравия летнее времяrjXCСаудовская Аравия стандартное времяrujj}r(jX,Саудовская Аравия времяrjX9Саудовская Аравия летнее времяrjXCСаудовская Аравия стандартное времяruuUAcrer}r(j}r(jXАкри времяrjX Акри летнее времяrjX*Акри стандартное времяrujj}r(jXАкри времяrjX Акри летнее времяrjX*Акри стандартное времяruuUIndonesia_Centralr}r(j}rjXKЦентральная Индонезия стандартное времяrsjj}rjXKЦентральная Индонезия стандартное времяrsuU Argentinar}r(j}r(jX*Аргентина летнее времяrjX4Аргентина стандартное времяrujj}r(jX*Аргентина летнее времяrjX4Аргентина стандартное времяruuU Alaska_Hawaiir}rjsUIsraelr}r(j}r(jX&Израиль летнее времяrjX0Израиль стандартное времяrujj}r(jX&Израиль летнее времяrjX0Израиль стандартное времяruuUAfrica_Westernr}r(jj}r(jX<Западноафриканское летнее времяrjX/Западноафриканское времяruuUAqtaur}r(j}r(jX"Актау летнее времяrjX,Актау стандартное времяrujj}r(jX"Актау летнее времяrjX,Актау стандартное времяruuUMoscowr}r(j}r(jXМосковское времяrjX,Московское летнее времяrjX6Московское стандартное времяrujj}r(jXМосковское времяrjX,Московское летнее времяrjX6Московское стандартное времяruuUAmerica_Mountainr}r(j}r(jX Горное время (США)rjX-Горное летнее время (США)rjX7Горное стандартное время (США)rujj}r(jX Горное время (США)rjX-Горное летнее время (США)rjX7Горное стандартное время (США)ruuUArgentina_Westernr}r(j}r jXAАргентина (запад) стандартное времяr sjj}r jXAАргентина (запад) стандартное времяr suUIndonesia_Easternr }r(j}rjXGВосточная Индонезия стандартное времяrsjj}rjXGВосточная Индонезия стандартное времяrsuU Aktyubinskr}r(j}r(jX*Актюбинск летнее времяrjX4Актюбинск стандартное времяrujj}r(jX*Актюбинск летнее времяrjX4Актюбинск стандартное времяruuU Hong_Kongr}r(j}r(jX.Гонконгское летнее времяrjX8Гонконгское стандартное времяrujj}r (jX.Гонконгское летнее времяr!jX8Гонконгское стандартное времяr"uuUAtlanticr#}r$(j}r%(jX%Атлантическое времяr&jX2Атлантическое летнее времяr'jX<Атлантическое стандартное времяr(ujj}r)(jX%Атлантическое времяr*jX2Атлантическое летнее времяr+jX<Атлантическое стандартное времяr,uuUArmeniar-}r.(j}r/(jXАрмения времяr0jX&Армения летнее времяr1jX0Армения стандартное времяr2ujj}r3(jXАрмения времяr4jX&Армения летнее времяr5jX0Армения стандартное времяr6uuUBrasiliar7}r8(j}r9(jX*Бразилия дневное времяr:jX2Бразилия стандартное времяr;ujj}r<(jX*Бразилия дневное времяr=jX2Бразилия стандартное времяr>uuUChinar?}r@(j}rAjX4Китайское стандартное времяrBsjj}rCjX4Китайское стандартное времяrDsuUAnadyrrE}rF(j}rG(jX&Анадырь летнее времяrHjX0Анадырь стандартное времяrIujj}rJ(jX&Анадырь летнее времяrKjX0Анадырь стандартное времяrLuuUKorearM}rN(j}rOjX4Корейское стандартное времяrPsjj}rQjX4Корейское стандартное времяrRsuUAfrica_EasternrS}rT(jj}rUjX1Восточноафриканское времяrVsuUAlaskarW}rX(j}rY(jXАляска времяrZjX$Аляска летнее времяr[jX.Аляска стандартное времяr\ujj}r](jXАляска времяr^jX$Аляска летнее времяr_jX.Аляска стандартное времяr`uuUAmerica_Easternra}rb(j}rc(jX4Восточно-американское времяrdjXAВосточно-американское летнее времяrejXKВосточно-американское стандартное времяrfujj}rg(jX4Восточно-американское времяrhjXAВосточно-американское летнее времяrijXKВосточно-американское стандартное времяrjuuUAfrica_Southernrk}rl(jj}rmjX)Южноафриканское времяrnsuUAmerica_Pacificro}rp(j}rq(jX%Тихоокеанское времяrrjX2Тихоокеанское летнее времяrsjX<Тихоокеанское стандартное времяrtujj}ru(jX%Тихоокеанское времяrvjX2Тихоокеанское летнее времяrwjX<Тихоокеанское стандартное времяrxuuUIndonesia_Westernry}rz(j}r{jXEЗападная Индонезия стандартное времяr|sjj}r}jXEЗападная Индонезия стандартное времяr~suUAmerica_Centralr}r(j}r(jX0Средне-американское времяrjX=Средне-американское летнее времяrjXGСредне-американское стандартное времяrujj}r(jX0Средне-американское времяrjX=Средне-американское летнее времяrjXGСредне-американское стандартное времяruuUAlmatyr}r(j}r(jX'Алма-Ата летнее времяrjX1Алма-Ата стандартное времяrujj}r(jX'Алма-Ата летнее времяrjX1Алма-Ата стандартное времяruuUIndiar}r(j}rjX4Индийское стандартное времяrsjj}rjX4Индийское стандартное времяrsuUAfrica_Centralr}r(jj}rjX5Центральноафриканское времяrsuUSamarar}r(j}r(jX*Самарское летнее времяrjX4Самарское стандартное времяrujj}r(jX*Самарское летнее времяrjX4Самарское стандартное времяruuU Volgogradr}r(j}r(jX2Волгоградское летнее времяrjX%Волгоградское времяrujj}r(jX2Волгоградское летнее времяrjX%Волгоградское времяruuUJapanr}r(j}rjX2Японское стандартное времяrsjj}rjX2Японское стандартное времяrsuUEurope_Centralr}r(j}r(jXBЦентральноевропейское летнее времяrjX5Центральноевропейское времяrujj}r(jXBЦентральноевропейское летнее времяrjX5Центральноевропейское времяruuuUerasr}r(Uwider}r(KX до н.э.rKXн.э.ruU abbreviatedr}r(KX до н.э.rKXн.э.ruuu.PK[Rll(site-packages/babel/localedata/fr_SN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[(site-packages/babel/localedata/bn_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}q(UalgqXalgqUaleqXaleqUaltqXaltqUadyqXadyqUbynqXbynqUausqXausqUadaqXadaqUbinq Xbinq!Ubikq"Xbikq#Udeq$Xdeq%Ututq&Xআলটাইকq'Ubatq(Xbatq)Ubasq*Xbasq+Ubadq,Xbadq-Ubanq.Xbanq/Ubalq0Xbalq1Ubaiq2Xbaiq3Uarpq4Xarpq5Uenq6Xenq7Uartq8Xartq9Uarwq:Xarwq;UarcqXbtkq?Uruq@XruqAUbraqBXbraqCUde_ATqDX4অস্ট্রিয়ান জারমানqEUblaqFXblaqGUen_CAqHX7ক্যানাডিয়ান ইংরেজিqIUbgqJXbgqKUbaqLXbaqMUastqNXastqOUbmqPXbmqQUboqRXboqSUbhqTXbhqUUbiqVXbiqWUbrqXXbrqYUbsqZXbsq[Urupq\Xআরমেনিয়ানq]Ujaq^Xjaq_Uaceq`XaceqaUachqbXachqcUathqdXathqeUakkqfXakkqgUzblqhX$ব্লিসসিম্বলসqiUchqjXচামোরোqkUcaqlXcaqmUceqnXceqoUangqpXangqqUzhqrXzhqsUapaqtXapaquUcuqvX%চার্চ স্লাভিকqwUptqxXptqyUchnqzX"চিনুক জার্গনq{Uchoq|Xচকটোওq}Uchpq~X'চিপেওয়াইয়ানqUawaqXawaqUchyqXচেয়েনিqUen_GBqX(ব্রিটিশ ইংরেজীqUbeqXbeqUbuaqXbuaqUbugqXbugqUbejqXbejqUbemqXbemqUcarqXcarqUcauqXcauqUcaiqXcaiqUainqXainqUberqXberqUcadqXcadqUaaqXaaqUesqXesqUabqXabqUaeqXaeqUbhoqXbhoqUafqXafqUakqXakqUamqXamqUitqXitqUanqXanqUasqXasqUarqXarqUanpqXআঙ্গিকাqUavqXavqUayqXayqUazqXazqUcebqXcebqUafhqXafhqUafaqXafaqUen_AUqX:অস্ট্রেলিয়ান ইংরাজীqUarnqXarnqUbntqXbntqUmapqX-অস্ট্রোনেসিয়ানqUfrqXfrqUcelqXcelqUfr_CAqX4ক্যানাডিয়ান ফরাসীquU territoriesq}qUCYqXCYqsU time_zonesq}qUscriptsq}q(URoroqXRoroqUJavaqXJavaqUShawqXShawqUCirtqXCirtqUGuruqXGuruqUHebrqXHebrqUGeorqXGeorqURunrqXRunrqUCyrlqXCyrlqUHrktqXHrktqUArmnqXArmnqUCyrsqXCyrsqUGeokqXGeokqULatfqXLatfqUKhmrqXKhmrqUKharqXKharqULinaqXLinaqUEgyhqXEgyhqUDsrtqXDsrtqUHmngqXHmngqUGothrXGothrUItalrXItalrUHanorXHanorUIndsrXIndsrUBalirXBalir UGujrr XGujrr UHangr XHangr UArabrXArabrUNkoorXNkoorUBuhdrXBuhdrUCoptrXCoptrUOryarXOryarUHansrXHansrUPlrdrXPlrdrUCprtrXCprtrUGlagrXGlagrULepcr XLepcr!UHantr"XHantr#UOsmar$XOsmar%UMongr&XMongr'UDevar(XDevar)ULaoor*XLaoor+USinhr,XSinhr-UHirar.XHirar/UBopor0XBopor1UMeror2XMeror3ULatnr4XLatnr5UHanir6XHanir7UOrkhr8XOrkhr9UPhagr:XPhagr;UMymrr<XMymrr=UMandr>XMandr?UPermr@XPermrAUBugirBXBugirCUHungrDXHungrEUMayarFXMayarGUBrairHXBrairIUBrahrJXBrahrKUSararLXSararMUGrekrNXGrekrOUMlymrPXMlymrQUEgydrRXEgydrSUCherrTXCherrUUEthirVXEthirWUQaairXXQaairYUKalirZXKalir[UPhnxr\XPhnxr]UBatkr^XBatkr_ULatgr`XLatgraUChamrbXChamrcULinbrdXLinbreUBlisrfXBlisrgUCansrhXCansriUBengrjXBengrkUEgyprlXEgyprmULimbrnXLimbroUOgamrpXOgamrqUSylorrXSylorsUKanartXKanaruUKndarvXKndarwuUdecimal_formatsrx}ryU meta_zonesrz}r{Uvariantsr|}r}Ucurrency_namesr~}ru.PK[D))(site-packages/babel/localedata/ms_MY.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll%site-packages/babel/localedata/iw.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[0@%2%2%site-packages/babel/localedata/eu.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX1. hiruhilekoaq KX2. hiruhilekoaq KX3. hiruhilekoaqKX4. hiruhilekoaquU abbreviatedq}q(KXHh1qKXHh2qKXHh3qKXHh4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX gujarateraqBUgdqCXeskoziar gaelikoaqDUgaqEXgaelikoaqFUgnqGX guaranieraqHUglqIXgalegoaqJUlaqKXlatinaqLUlnqMXlingalaqNUloqOXlaoseraqPUtrqQXturkieraqRUlvqSX letonieraqTUltqUX lituanieraqVUtkqWX turkmenieraqXUthqYX thailandieraqZUtiq[Xtigrinyaq\Uteq]Xteluguaq^Upt_PTq_Xportugesa (portugal)q`UfilqaXtagaloqbUtaqcXtamileraqdUyiqeX yiddisheraqfUpt_BRqgXportugesa (brasil)qhUdeqiX alemaneraqjUdaqkXdanieraqlUelqmXgrezieraqnUeoqoX esperantoaqpUenqqXingeleraqrUzhqsXtxineraqtUzh_HansquXtxinera (soildua)qvUzh_HantqwXtxinera (tradizionala)qxUen_USqyXingelesa (aeb)qzUeuq{Xeuskaraq|Uetq}X estonieraq~UesqX espainieraqUruqX errusieraqUroqX errumanieraqUbnqX bengaleraqUbeqX bielorrusieraqUbgqX bulgarieraqUukqX ukraineraqUjvqXjaveraqUbhqX biharreraqUbrqX bretoieraqUbsqXbosnieraqUjaqX japonieraqUocqX okzitanieraqUtwqXtwiaqUtlhqX klingoneraqUorqXoriyaqUxhqXxhosaqUcaqXkatalanaqUcyqX{0>welsh<}100{>galesera <0}qUcsqXtxekieraqUpsqXpaxtueraqUptqX portugaleraqUtlqXtagalogqUpaqX punjaberaqUviqX vietnameraqUplqX polonieraqUhyqX armenieraqUhrqX kroazieraqUhuqX hungarieraqUhiqXhindiaqUheqXhebreeraqUuzqXuzbekeraqUmlqX malayalameraqUmnqX mongolieraqUmkqX mazedonieraqUurqXurduqUmtqXmalteraqUen_GBqXingelesa (erresuma batua)qUmsqX malaysieraqUmrqX maratheraqUugqX uigurreraqUafqX afrikaansqUswqXswahiliqUisqX islandieraqUamqX amharikeraqUitqXitalieraqUsvqXsuedieraqUasqXassameraqUarqXarabieraqUsuqX sundaneraqUzuqXzulueraqUiaqX interlinguaqUazqX azerbaijaneraqUieqX interlingueqUidqX indonesieraqUnlqX nederlanderaqUnnqXnorvegiera (nynorsk)qUnoqX norvegieraqUneqXnepaleraqUen_AUqXingelesa (australia)qUfrqX frantseseraqUfyqX frisiarraqUfaqX pertsieraqUfiqX finlandieraqUkyqX kirgizerarUforXfaroerarUkarX georgierarUsrrXserbierarUsqrX albanierarUkor Xkoreerar Uknr Xkannadar Ukmr X khemererarUstrX sesothoerarUskrX eslovakierarUsirXsinhalarUshrXserbokroazierarUsorX somalierarUkurXkurduerarUslrX eslovenierarUsarX sanskritoarUsdrXsindhiar uU territoriesr!}r"(UBDr#X Bangladeshr$UBEr%XBelgikar&UBFr'X Burkina Fasor(UBGr)XBulgariar*UBAr+XBosnia-Herzegovinar,UWFr-XWallis eta Futunar.UBOr/XBolibiar0UJPr1XJaponiar2UBIr3XBurundir4UBJr5XBeninr6UBTr7XBh2utanr8UJMr9XJamaikar:UBVr;XBouvet Uhartear<UBWr=XBotswanar>UWSr?XSamoar@UBRrAXBrasilrBUBSrCXBahamakrDUJErEXJerseyrFUBYrGX BielorrusiarHURUrIXErrusiarJURWrKXRuandarLURSrMXSerbiarNUTLrOXEkialdeko TimorrPUTMrQX TurkmenistanrRUTJrSX TadjikistanrTUROrUX ErrumaniarVUTKrWXTokelaurXUGWrYX Ginea-BissaurZUGSr[X3Hegoaldeko Georgia eta Hegoaldeko Sandwich uharteakr\UGRr]XGreziar^UGQr_XEkuatore Ginear`UGGraXGuernseyrbUGFrcXGuyana FrantsesardUGEreXGeorgiarfUGBrgXErresuma BatuarhUGAriXGabonrjUGNrkXGinearlUGMrmXGambiarnUGLroX GroenlandiarpUGHrqXGhanarrUOMrsXOmanrtUTNruXTunisiarvUJOrwXJordaniarxUHRryXKroaziarzUHTr{XHaitir|UHUr}XHungariar~UHNrXHondurasrUHMrXHeard eta McDonald UharteakrUPSrX PalestinarUPTrXPortugalrUSJrXSvalbard eta Jan Mayen uharteakrUPYrXParaguairUSHrX Saint HelenarUPFrXPolinesia FrantsesarUPGrXPapua Ginea BerriarUPErXPerurUPKrXPakistanrUPHrX FilipinakrUPLrXPoloniarUPMrXSaint-Pierre eta MikelunerUZMrXZambiarUEHrXMendebaldeko SahararUEErXEstoniarUEGrXEgiptorUZArX HegoafrikarUECrXEkuadorrUITrXItaliarUVNrXVietnamrUSBrXSalomon uharteakrUETrXEtiopiarUZWrXZimbabwerUSArX Saudi ArabiarUESrXEspainiarUERrXEritrearUMErX MontenegrorUMDrXMoldaviarUMGrX MadagaskarrUMArXMarokorUMCrXMonakorUUZrX UzbekistanrUMMrXBirmaniarUMLrXMalirUMOrXMacaurUMNrXMongoliarUMHrXMarshall uharteakrUMKrX MazedoniarUMUrXMauriziorUMWrXMalawirUMVrXMaldivakrUMPrXIparraldeko Mariana uharteakrUMRrX MauritaniarUIMrX Man uhartearUUGrXUgandarUTZrXTanzaniarUMYrXMalasiarUMXrXMexikorUILrXIsraelrUFRrXFrantziarUFIrX FinlandiarUFKrXMalvinakrUFMrX MikronesiarUFOrXFaroe UharteakrUNIrX NikaraguarUNLrX HerbehereakrUNOrXNorvegiarUNArXNamibiarUVUrXVanuaturUNCrXKaledonia BerriarUNErXNigerrUNFrXNorfolk uhartearUNGrXNigeriarUNZrXZeelanda BerriarUNPrXNepalrUCKrX Cook uharteakrUCIrX Boli KostarUCHr XSuitzar UCOr XKolonbiar UCNr XTxinarUCMrXKamerunrUCLrXTxilerUCCrXCocos uharteakrUCArXKanadarUCGrXKongorUCFrXAfrika Erdiko ErrepublikarUCDrX Kongoko Errepublika DemokratikoarUCZrXTxekiar errepublikarUCYrXZiprer UCXr!XChristmas uhartear"UCSr#XSerbia eta Montenegror$UUYr%XUruguair&UCVr'X Cabo Verder(UCUr)XKubar*USZr+X Swazilandiar,USYr-XSiriar.UKGr/X Kirgizistanr0UKEr1XKeniar2USRr3XSurinamr4UKIr5XKiribatir6UKHr7XKanbodiar8UKNr9XSaint Kitts eta Nevisr:UKMr;XKomoreakr<USTr=XSao Tomé eta Principer>USKr?X Eslovakiar@UKRrAX Hego KorearBUSIrCX EsloveniarDUKPrEX Ipar KorearFUSOrGXSomaliarHUSNrIXSenegalrJUSMrKX San MarinorLUSLrMX Sierra LeonarNUSCrOX SeychelleakrPUKZrQX KazakhstanrRUKYrSXKaiman UharteakrTUSGrUXSingapurrVUSErWXSuediarXUSDrYXSudanrZUDOr[XDominikar Errepublikar\UDMr]XDominikar^UDJr_XDjibutir`UDKraX DanimarkarbUVGrcX"Virginia uharteak (Erresuma Batua)rdUDEreXAlemaniarfUYErgXYemenrhUDZriXAljeriarjUUSrkXAmeriketako Estatu BatuakrlUUMrmX.Estatu Batuetatik urruti dauden uharte txikiakrnULBroXLibanorpULCrqX Santa LuziarrULArsXLaosrtUTVruXTuvalurvUTWrwXTaiwanrxUTTryXTrinidad eta TobagorzUTRr{XTurkiar|ULKr}X Sri Lankar~ULIrX LiechtensteinrULVrXLetoniarUTOrXTongarULTrXLituaniarULUrX LuxenburgorULRrXLiberiarULSrXLesothorUTHrX TailandiarUTFrXFrantziaren Lurralde AustralakrUTGrXTogorUTDrXTxadrUTCrXTurk eta Caico uharteakrULYrXLibiarUVArXVatikanorUVCrXSaint Vincent eta GrenadinakrUAErXArabiar Emirrerri BatuakrUVErX VenezuelarUAGrXAntigua eta BarbudarUAFrX AfganistanrUIQrXIrakrUVIrX-Virginia uharteak (Ameriketako Estatu Batuak)rUISrXIslandiarUIRrXIranrUAMrXArmeniarUALrXAlbaniarUAOrXAngolarUANrXNederlandar AntillakrUAQrX AntartikarUASrXSamoa EstatubatuarrarUARrX ArgentinarUAUrX AustraliarUATrXAustriarUIOrX%Indiako Ozeanoko Britainiar LurraldearUINrXIndiarUAXrXAland UharteakrUAZrX AzerbaijanrUIErXIrlandarUIDrX IndonesiarUUArXUkrainarUQArXKatarrUMZrX MozambikeruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X yyyy-MMM-ddrh.X%(yyyy)s-%(MMM)s-%(dd)srubUfullrh))r}r(h,XEEEE, yyyy'eko' MMMM'ren' dd'a'rh.X)%(EEEE)s, %(yyyy)seko %(MMMM)sren %(dd)sarubUlongrh))r}r(h,Xyyyy'eko' MMM'ren' dd'a'rh.X%(yyyy)seko %(MMM)sren %(dd)sarubUshortrh))r}r(h,Xyy-MM-ddrh.X%(yy)s-%(MM)s-%(dd)srubuUcurrency_symbolsr}rUESPrX₧rsU time_zonesr}r(UAmerica/Guadelouper}rUcityrX GuadalupersUAsia/Singaporer}rjXSingapurrsU Asia/Bahrainr}rjXBahreinrsUAtlantic/Bermudar}rjXBermudakrsUEurope/Luxembourgr}rjX LuxenburgorsUAfrica/Djiboutir}rjXDjibutirsUAmerica/Dominicar}rjXDominikarsUAmerica/Martiniquer}rjX MartinikarsUAmerica/Jamaicar}r jXJamaikar sUIndian/Maldivesr }r jXMaldivakr sUAtlantic/Cape_Verder}rjX Cabo VerdersUIndian/Mauritiusr}rjXMauriziorsU Europe/Monacor}rjXMonakorsU Europe/Madridr}rjXMadrilrsuUscriptsr}rUvariantsr}rUnumber_symbolsr}r(Udecimalr X,r!Ugroupr"X.r#uUcurrency_namesr$}r%Umonthsr&}r'(U stand-aloner(}r)Unarrowr*}r+(KX1r,KX2r-KX3r.KX4r/KX5r0KX6r1KX7r2KX8r3K X9r4K X10r5K X11r6K X12r7usUformatr8}r9(Uwider:}r;(KX urtarrilar<KXotsailar=KXmartxoar>KXapirilar?KXmaiatzar@KXekainarAKXuztailarBKXabuztuarCK XirailarDK XurriarEK XazaroarFK XabenduarGuU abbreviatedrH}rI(KXurtrJKXotsrKKXmarrLKXapirMKXmairNKXekarOKXuztrPKXaburQK XirarRK XurrrSK XazarTK XaberUuuuUcurrency_formatsrV}rWNcbabel.numbers NumberPattern rX)rY}rZ(Uexp_precr[NUscaler\KU frac_precr]KKr^Usuffixr_X ¤r`j`raUint_precrbKKrch,X #,##0.00 ¤rdUprefixreXrfX-rgrhUexp_plusriNUgroupingrjKKrkubsUdaysrl}rm(U stand-alonern}roUnarrowrp}rq(Kj-Kj.Kj/Kj0Kj1Kj2Kj,usUformatrr}rs(Uwidert}ru(KX astelehenarvKX asteartearwKX asteazkenarxKXostegunaryKXostiralarzKX larunbatar{KXigandear|uU abbreviatedr}}r~(KXalrKXasrKXazrKXogrKXorrKXlrrKXigruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXBCErKXCErusu.PK[y(site-packages/babel/localedata/ar_SA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precq KKq!Usuffixq"Xq#h#q$Uint_precq%KKq&Upatternq'X#0.###q(Uprefixq)h#h#q*Uexp_plusq+NUgroupingq,MMq-ubsU date_formatsq.}q/Ucurrency_symbolsq0}q1U time_zonesq2}q3Uscriptsq4}q5UItalq6X#اللأيطالية القديمةq7sUvariantsq8}q9Unumber_symbolsq:}q;Ucurrency_namesq<}q=Umonthsq>}q?Ucurrency_formatsq@}qANh)qB}qC(hNhKh KKqDh"h#h#qEh%KKqFh'X¤#0.00qGh)X¤qHX-¤qIqJh+Nh,h-ubsUdaysqK}qLUformatqM}qNU abbreviatedqO}qP(KXالاثنينqQKXالثلاثاءqRKXالأربعاءqSKX الخميسqTKX الجمعةqUKX السبتqVKX الأحدqWussU meta_zonesqX}qYUerasqZ}q[u.PK[_.ll(site-packages/babel/localedata/ga_IE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK["%site-packages/babel/localedata/fi.datnu[}q(U zone_formatsq}q(UregionqX%sqUfallbackqX %(1)s (%(0)s)qUgmtqXUTC%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1. neljännesqKX 2. neljännesqKX 3. neljännesqKX 4. neljännesquU abbreviatedq}q(KX1. nelj.q KX2. nelj.q!KX3. nelj.q"KX4. nelj.q#uuuUperiodsq$}q%(Uamq&Xap.q'Upmq(Xip.q)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X %qFhFqGh7KKqHh9X#,##0 %qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9XH.mm.ssqXUformatqYX%(H)s.%(mm)s.%(ss)sqZubUfullq[hU)q\}q](h9X H.mm.ss vq^hYX%(H)s.%(mm)s.%(ss)s %(v)sq_ubUlongq`hU)qa}qb(h9X H.mm.ss zqchYX%(H)s.%(mm)s.%(ss)s %(z)sqdubUshortqehU)qf}qg(h9XH.mmqhhYX %(H)s.%(mm)sqiubuU languagesqj}qk(UgvqlXmanxqmUguqnX gudžaratiqoUscnqpXsisiliaqqUromqrXromaniqsUalgqtXalgonkin-kieliquUaleqvXaleuttiqwUscoqxXskottiqyUmniqzXmanipuriq{Ugdq|Xgaeliq}Ugaq~XiiriqUmnoqX manobo-kieliqUosaqXosageqUgnqXguaraniqUaltqXaltaiqUglqXgaliciaqUmwrqXmarwariqUtyqXtahitiqUtwqXtwiqUttqXtataariqUtrqXturkkiqUtsqXtsongaqUtnqXtswanaqUtoqX tongantongaqUausqXaustralialainen kieliqUavqXavaariqUtkqX turkmeeniqUthqXthaiqUroaqXromaaninen kieliqUtgqX tadžikkiqUteqXteluguqUugaqXugaritqUmwlqX mirandeesiqUkcgqXtyapqUsmiqXsaamelaiskieliqUfatqXfantiqUfanqXfangqUwoqXwolofqUrmqX retoromaaniqUdinqXdinkaqUblaqX mustajalkaqUcmcqX tšam-kieliqUmlqX malajalamqUzhqXkiinaqUtemqXtemneqUen_CAqXkanadanenglantiqUnwcqXklassinen newariqUzaqXzhuangqUcauqXkaukasialainen kieliqUzuqXzuluqUterqXterenoqUtetqXtetumqUmncqXmantšuqUkutqXkutenaiqUsukqXsukumaqUkumqXkumykkiqUsusqXsusuqUnewqXnewariqUsuxqXsumeriqUdenqXsleviqUmenqXmendeqUmulqX monia kieliäqUlezqXlezgiqUrootqXjuuriqUekaqXekajukqUakkqXakkadiqUdraqX dravidakieliqUjrbqXjuutalaisarabiaqUsgnqX viittomakieliqUsgaqX muinaisiiriqUapaqX apaššikieliqUbraqXbradžqUchbqX tšibtšaqUchgqX tšagataiqUchkqXchuukqUchmrXmarirUchnrXchinook-jargonrUchorXchoctawrUchprX chipewyanrUchrrXcherokeer Uchyr Xcheyenner Utir Xtigrinjar UvotrXvatjarUmgrX malagassirUibarXibanrUmorXmoldaviarUmnrXmongolirUmirXmaorirUmhrXmarshallrUmkrX makedoniarUmtrXmaltarUcair X!keskiamerikkalainen intiaanikielir!Udelr"Xdelawarer#Umsr$Xmalaijir%Umrr&Xmarathir'Utar(Xtamilr)Umyr*Xburmar+Ucadr,Xcaddor-Usrnr.Xsrananr/Utair0X thaikielir1Uafhr2Xafrihilir3Usitr4Xsinotiibetiläinen kielir5Uenmr6X keskienglantir7Uen_AUr8Xaustralianenglantir9Unynr:Xnyankoler;Unyor<Xnyoror=Unymr>Xnyamwezir?Usior@X sioux-kielirAUmaprBXaustronesialainen kielirCUmasrDXmaasairEUlahrFXlahndarGUladrHXladinorIUfyrJX länsifriisirKUsnkrLXsoninkerMUfarNXfarsirOUmadrPXmadurarQUmagrRXmagahirSUmairTXmaithilirUUfirVXsuomirWUfjrXXfidžirYUmanrZXmandingor[Uegyr\X muinaisegyptir]Uzndr^Xzander_Ussr`XswaziraUsrrbXserbiarcUsqrdXalbaniareUswrfXswahilirgUsvrhXruotsiriUsurjXsundarkUstrlX eteläsothormUskrnXslovakkiroUsirpXsinhalirqUshrrX serbokroaattirsUsortXsomaliruUsnrvXšonarwUsmrxXsamoaryUslrzXsloveenir{Uscr|Xsardir}Usar~XsanskritrUsgrXsangorUserX pohjoissaamerUsdrXsindhirUzenrXzenagarUkbdrXkabardirUafarXafro-aasialainen kielirUcsbrXkašubirUlgrXgandarUlbrX luxemburgrUfiurXsuomalais-ugrilainen kielirUlnrXlingalarUlorXlaorUlirXlimburgrUbynrXbilinrUltrXliettuarUlurX katanganlubarUfilrXfilipinorUyirXjiddišrUnonrX muinaisnorjarUcebrXcebuanorUyorXjorubarUnogrXnogairUbatrXbalttilainen kielirUdakrXdakotarUdarrXdargirUdayrXdajakkirUssarXniililäis-saharalainen kielirUkperXkpellerUelrXkreikkarUeorX esperantorUenrXenglantirUlamrXlambarUeerXewerUmdfrXmokšarUfrrXranskarUmdrrXmandarrUetrXvirorUesrXespanjarUrurXvenäjärUgonrXgondirUgohrXmuinaisyläsaksarUsmsrX koltansaamerUsmnrX inarinsaamerUsmjrX luulajansaamerUde_ATrXitävallansaksarUgotrXgoottirUrnrXrundirUrorXromaniarUdsbrXalasorbirUsmarX eteläsaamerUgorrX gorontalorUastrXasturiarUwalrXwalamorUcrhrX krimintataarirUathrXathabasca-kielirUgezrXge’ezrUxhrXxhosarUffrXfulanirUkforXnorsunluurannikonkororUmakrXmakassarrUzaprX sapoteekkirUkokrXkonkanirUzxxrXei kielellistä sisältöärUkosrXkosraerUforXfäärirUtogrX malawintongarUhuprXhuparUudmrXudmurttirUbejrXbedžar Ubemr Xbembar Utsir Xtsimšir UberrX berberikielirUnzirXnzimarUsairX"eteläamerikkalainen intiaanikielirUangrXmuinaisenglantirUprarX prakrit-kielirUbhorX bhodžpurirUsalrXsališilainen kielirUprorXmuinaisprovensaalirUrajrX radžastanirUsadr Xsandawer!Uanpr"Xangikar#Ues_419r$Xamerikanespanjar%Urapr&Xrapanuir'Usasr(Xsasakr)Unqor*Xn’kor+Ucarr,Xkaribir-Uminr.X minangkabaur/Umicr0Xmicmacr1Uefir2Xefikr3Uarnr4X araukaanir5Uypkr6X jupikkikielir7Umisr8Xluokittelematon kielir9Ukacr:Xkachinr;Ukabr<Xkabyylir=Ukaar>X karakalpakkir?Ukajr@XjjurAUkamrBXkambarCUkarrDXkarenrEUkawrFXkavirGUfr_CHrHXsveitsinranskarIUtyvrJXtuvarKUfr_CArLX kanadanranskarMUkarNXgeorgiarOUdoirPXdogrirQUkgrRXkongorSUkkrTXkazakkirUUkjrVXkuanjamarWUkirXXkikujurYUkorZXkorear[Uknr\Xkannadar]Ukmr^Xkhmerr_Uklr`X kalaallisutraUksrbXkašmirircUkrrdXkanurireUkwrfXkornirgUkvrhXkomiriUkurjXkurdirkUkyrlXkirgiisirmUtklrnXtokelauroUbuarpX burjaattirqUmgarrX keski-iirirsUhitrtXheettiruUdyurvXdjularwUderxXsaksaryUdarzXtanskar{Udzr|Xdzongkhar}Uluir~XluiseñorUdvrXdivehirUhilrX hiligainorUhimrX himatšalirUgemrXgermaaninen kielirUcrprXkreoli- tai pidgin-kielirUqurXketšuarUbasrXbasarUgbarXgbajarUbadrXbandarUbanrXbalirUbalrXbelutširUshnrXshanrUbairXbamileke-kielirUarprXarapahorUartrXkeinotekoinen kielirUarwrXarawakrUarcrXaramearUen_USrXamerikanenglantirUsemrXseemiläinen kielirUselrXselkuppirUnubrXnubialainen kielirUbtkrXbatakrUlusrXlusairUmusrXcreekrUluarX luluanlubarUirorX irokeesikielirUirarXiranilainen kielirUmunrX mundakielirUlunrXlundarUluorXluorUwarXvallonirUtuprX tupi-kielirUjvrXjaavarUzblrX blisskielirUtutrXaltailainen kielirUtumrXtumbukarUjarXjapanirUcoprXkoptirUilorXilokorUlarXlatinarUgwirXgwitšinrUundrXmäärittämätönrUtlirXtlingitrUtlhrXklingonrUchrX tšamorrorUcorXkorsikarUcarX katalaanirUcerX tšetšeenirUponrXpohnpeirUcyrXkymrirUsahrXjakuuttirUcsrXtšekkirUcrrXcreerUbntrX bantukielirUcvrX tšuvassirUcurX kirkkoslaavirUlvrXlatviarUdumrX keskihollantirUptrX portugalirUduarXdualarUfrorX muinaisranskarUyaprXjapirUfrmrX keskiranskarUtivrXtivrUfrsrX itäfriisirUfrrrX pohjoisfriisirUyaorXjaorUparX pandžabirUxalrXkalmukkir Ues_ESr Xespanjanespanjar Upir Xpaalir Uen_GBrXbritannianenglantirUgayrXgajorUotorX otomi-kielirUotarXosmanirUhmnrXhmongrUmyvrXersärUgaarXgarUfurrXfriulirUkhirX khoisan-kielirUainr Xainur!Urarr"X rarotongar#Uslar$Xslaavilainen kielir%Uver&Xvendar'Uvir(Xvietnamr)Uisr*Xislantir+Ukhor,Xkhotanir-Uiur.X inuktitutr/Uitr0Xitaliar1Uvor2Xvolapükr3Uiir4X sichuanin-yir5Uikr6X inupiatunr7Uior8Xidor9Uiner:Xindoeurooppalainen kielir;Uiar<X interlinguar=Ujprr>Xjuutalaispersiar?Uier@X interlinguerAUidrBX indonesiarCUigrDXigborEUpaprFX papiamenturGUeworHXewondorIUpaurJXpalaurKUpaarLXpapualaiskielirMUpagrNX pangasinanrOUsatrPXsantalirQUpalrRXpahlavirSUpamrTXpampangarUUsycrVX muinaissyyriarWUphirXXfilippiiniläinen kielirYUcelrZXkelttiläinen kielir[Uphnr\Xfoinikiar]Unicr^Xnigeriläis-kongolainen kielir_Uniar`XniasraUdgrrbXdogribrcUsyrrdXsyyriareUniurfXniuergUgswrhX sveitsinsaksariUcchrjXatsamrkUjborlXlojbanrmUnahrnXnahuatlroUsamrpXsamarianaramearqUhairrXhaidarsUgmhrtXkeskiyläsaksaruUcusrvXkuušilainen kielirwUwenrxX sorbin kieliryUadyrzXadyger{Uelxr|Xelamir}Uadar~XadangmerUpt_PTrXportugalinportugalirUhawrXhavaijirUbinrXbinirUbikrXbikolrUpt_BRrXbrasilianportugalirUmosrXmossirUmohrXmohawkrUtlrXtagalogrUzh_HansrXyksinkertaistettu kiinarUzh_HantrXperinteinen kiinarUtvlrXtuvalurUijorXidžorUkmbrXkimbundurUpeorX muinaispersiarUumbrXumbundurUtmhrXtamašekrUfonrXfonrUhsbrX yläsorbirUberX valkovenäjärUbgrXbulgariarUbarX baškiirirUpsrXpašturUbmrXbambararUbnrXbengalirUborXtiibetrUbhrXbiharirUbirXbislamarUbrrXbretonirUbsrXbosniarUruprXaromaniarUzzarXzazarUomrXoromorUojrXodžibwarUacerXacehrUachrXatšolirUocrX oksitaanirUkrurXkurukhrUsrrrXsererrUkrorX kru-kielirUkrlrXkarjalarUkrcrXkaratšai-balkaarirUndsrXalasaksarUosrXosseettirUorrXorijarUsogrXsogdirUnsorX pohjoissothorUsonrXsonghairUde_CHrXsveitsinyläsaksarUvairXvairUwakrX wakash-kielirUlolrXmongorUmkhrXmon-khmer-kielirUawarXawadhirUlozrXlozirUgilrXkiribatirUwasrXwashorUwarrXwarayrUhzrXhererorUhyrXarmeniarUanrXaragoniarUsidrXsidamorUhrrXkroatiarUhtrXhaitirUhurXunkarirUhirXhindirUhorX hiri-moturUharXhausarUbugrXbugirUherXheprear Uuzr Xuzbekkir Uurr Xurdur UplrXpuolarUukrXukrainarUugrXuiguurirUaarXafarrUabrXabhaasirUaerXavestarUafrX afrikaansrUakrXakanrUamrXamhararUnl_BEr Xflaamir!Ueur"Xbaskir#Uasr$Xassamir%Uarr&Xarabiar'Uinhr(Xinguušir)Utpir*X tok-pisinr+Umynr,X maya-kielir-Uayr.Xaimarar/Ukhar0Xkhasir1Uazr2Xazerir3Uincr4Xindoarjalainen kielir5Unlr6Xhollantir7Unnr8Xnorjan nynorskr9Unor:Xnorjar;Unar<Xnaurur=Unbr>Xnorjan bokmålr?Unair@X#pohjoisamerikkalainen intiaanikielirAUndrBXpohjois-ndebelerCUnerDXnepalirEUngrFXndongarGUnyrHXnjandžarIUnaprJXnapolirKUgrbrLXgreborMUgrcrNXmuinaiskreikkarOUnrrPXetelä-ndebelerQUtigrRXtigrerSUnvrTXnavajorUUzunrVXzunirWUrwrXXruandarYUcperZX-englantiin perustuva kreoli- tai pidgin-kielir[Ucpfr\X+ranskaan perustuva kreoli- tai pidgin-kielir]Ucppr^X.portugaliin perustuva kreoli- tai pidgin-kielir_uU territoriesr`}ra(UBDrbX BangladeshrcUBErdXBelgiareUBFrfX Burkina FasorgUBGrhXBulgariariUVErjX VenezuelarkUBArlXBosnia ja HertsegovinarmUBBrnXBarbadosroUWFrpXWallis ja FutunarqUBLrrXSaint-BarthélemyrsUBMrtXBermudaruUBNrvXBruneirwUBOrxXBoliviaryUBHrzXBahrainr{UBIr|XBurundir}UBJr~XBeninrUBTrXBhutanrU011rXLänsi-AfrikkarUBVrXBouvet’nsaarirUBWrXBotswanarU014rX Itä-AfrikkarU015rXPohjois-AfrikkarUBRrXBrasiliarU017rX Keski-AfrikkarU018rXeteläinen AfrikkarU019rXAmerikkarUBYrXValko-VenäjärUBZrXBelizerULVrXLatviarURWrXRuandarURSrXSerbiarUTLrX Itä-TimorrURErXRéunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadžikistanrUROrXRomaniarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX+Etelä-Georgia ja Eteläiset SandwichsaaretrUGRrXKreikkarUGQrXPäiväntasaajan GuinearUGPrX GuadelouperUJPrXJapanirUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXRanskan GuayanarUGErXGeorgiarUGDrXGrenadarU021rXpohjoinen AmerikkarUGBrX BritanniarUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GrönlantirU029rXKaribiarUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunisiarUJMrXJamaikarU013rXVäli-AmerikkarUWSrXSamoarU419rX Latinalainen Amerikka ja KaribiarUHRrXKroatiarUBSrXBahamarUHTrXHaitirUHUrXUnkarirUHKrX'Hongkong – Kiinan erityishallintoaluerU039rXEtelä-EuroopparUHNrXHondurasrUFIrXSuomirU142rXAasiarU030rX Itä-AasiarU034rX Etelä-AasiarU035rXKaakkois-AasiarUPRrX Puerto RicorUPSrX PalestiinarU830rX KanaalisaaretrUFKrXFalklandinsaaretrUIOrX$Brittiläinen Intian valtameren aluer UPWr XPalaur UPTr X Portugalir USJrXHuippuvuoret ja Jan MayenrUMDrXMoldovarUFMrXMikronesian liittovaltiorUIQrXIrakrUPArXPanamarUPFrXRanskan PolynesiarUPGrXPapua-Uusi-GuinearUPErXPerurUPKrXPakistanrUPHr X Filippiinitr!UFOr"X Färsaaretr#UPNr$XPitcairnr%UPLr&XPuolar'UPMr(XSaint-Pierre ja Miquelonr)UZMr*XSambiar+UEHr,X Länsi-Saharar-URUr.XVenäjär/UEEr0XViror1UEGr2XEgyptir3UZAr4XEtelä-Afrikkar5UECr6XEcuadorr7UITr8XItaliar9UVNr:XVietnamr;UZZr<X tuntematon tai virheellinen aluer=USBr>X Salomonsaaretr?UETr@XEtiopiarAUSOrBXSomaliarCUZWrDXZimbabwerEUSArFX Saudi-ArabiarGUESrHXEspanjarIUERrJXEritrearKUMErLX MontenegrorMUAQrNX AntarktisrOUMGrPX MadagaskarrQUMFrRX Saint-MartinrSUMArTXMarokkorUUMCrVXMonacorWUUZrXX UzbekistanrYUMMrZXMyanmarr[UMLr\XMalir]UMOr^X$Macao – Kiinan erityishallintoaluer_UMNr`XMongoliaraUHMrbXHeard- ja McDonaldinsaaretrcUASrdXAmerikan SamoareUMKrfX MakedoniargUMUrhX MauritiusriUMTrjXMaltarkUMWrlXMalawirmUMVrnX MalediivitroUMQrpX MartiniquerqUMPrrXPohjois-MariaanitrsUMSrtX MontserratruUMRrvX MauritaniarwUIMrxXMansaariryUUGrzXUgandar{UTZr|XTansaniar}UMYr~XMalesiarUMXrXMeksikorUILrXIsraelrUFRrXRanskarUAWrXArubarUDOrXDominikaaninen tasavaltarUSHrX Saint HelenarUVCrXSaint Vincent ja GrenadiinitrU054rX MelanesiarUDJrXDjiboutirUFJrXFidžirU057rX MikronesiarU172rX Itsenäisten valtioiden yhteisörU053rXAustralia ja Uusi-SeelantirUNIrX NicaraguarUNLrX AlankomaatrUNOrXNorjarUNArXNamibiarUVUrXVanuaturUNCrXUusi-KaledoniarUNErXNigerrUNFrXNorfolkinsaarirUNGrXNigeriarUNZrX Uusi-SeelantirUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolynesiarUCIrXNorsunluurannikkorUCHrXSveitsirUCOrXKolumbiarUCNrXKiinarUCMrXKamerunrUCLrXChilerUCCrX KookossaaretrUCArXKanadarUCGrXKongo-BrazzavillerUCFrXKeski-Afrikan tasavaltarUCDrXKongo-KinshasarUCZrXTšekkirUCYrXKyprosrUCXrX JoulusaarirUCSrXSerbia ja MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Kap VerderUCUrXKuubarUSZrXSwazimaarUSYrXSyyriarUKGrXKirgisiarUKErXKeniarUSRrXSurinamrU143rX Keski-AasiarUKHrX KambodžarUKNrXSaint Kitts ja NevisrUKMrXKomoritrUSTrXSão Tomé ja PrínciperUSKrXSlovakiarUKRrX Etelä-KorearUSIrXSloveniarUKPrX Pohjois-KorearUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellitrUKZrX KazakstanrUKYrX CaymansaaretrUSGrX SingaporerUSErXRuotsir USDr XSudanr U151r X Itä-Eurooppar U150rXEuroopparUDMrXDominicarU155rXLänsi-EuroopparU154rXPohjois-EuroopparUVGrXBrittiläiset NeitsytsaaretrUDErXSaksarUYErXJemenrUMHrXMarshallinsaaretrU062rXEtelä- ja Keski-AasiarUDZr XAlgeriar!UUSr"X Yhdysvallatr#UUYr$XUruguayr%UYTr&XMayotter'UUMr(X!Yhdysvaltain pienet erillissaaretr)ULBr*XLibanonr+ULCr,X Saint Luciar-ULAr.XLaosr/UTVr0XTuvalur1UTWr2XTaiwanr3UTTr4XTrinidad ja Tobagor5UTRr6XTurkkir7ULKr8X Sri Lankar9ULIr:X Liechtensteinr;UCKr<X Cookinsaaretr=UTOr>XTongar?ULTr@XLiettuarAULUrBX LuxemburgrCULRrDXLiberiarEULSrFXLesothorGUTHrHXThaimaarIUTFrJX&Ranskan ulkopuoliset eteläiset alueetrKUTGrLXTogorMUTDrNXTšadrOUTCrPXTurks- ja CaicossaaretrQULYrRXLibyarSUVArTX VatikaanirUU145rVX Länsi-AasiarWUAErXXArabiemiirikunnatrYUADrZXAndorrar[UAGr\XAntigua ja Barbudar]UAFr^X Afganistanr_UAIr`XAnguillaraUVIrbXYhdysvaltain NeitsytsaaretrcUISrdXIslantireUIRrfXIranrgUAMrhXArmeniariUALrjXAlbaniarkUAOrlXAngolarmUANrnXAlankomaiden AntillitroU003rpXPohjois-AmerikkarqU002rrXAfrikkarsU001rtXmaailmaruUARrvX ArgentiinarwUAUrxX AustraliaryUATrzX Itävaltar{U005r|XEtelä-Amerikkar}UINr~XIntiarUAXrX AhvenanmaarU009rXOseaniarUAZrX AzerbaidžanrUIErXIrlantirUIDrX IndonesiarUJOrXJordaniarUQUrXEuroopan unionirUUArXUkrainarUQArXQatarrUDKrXTanskarUMZrXMosambikrUQOrXulkomeriruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9Xd.M.yyyyrhYX%(d)s.%(M)s.%(yyyy)srubUfullrhU)r}r(h9XEEEE d. MMMM yyyyrhYX!%(EEEE)s %(d)s. %(MMMM)s %(yyyy)srubUlongrhU)r}r(h9X d. MMMM yyyyrhYX%(d)s. %(MMMM)s %(yyyy)srubUshortrhU)r}r(h9Xd.M.yyyyrhYX%(d)s.%(M)s.%(yyyy)srubuUcurrency_symbolsr}r(UITLrXITLrUUSDrX$rUNOKrXNkrrUINRrXINRrUJPYrX¥rUBRLrXBRLrUGBPrX£rUSEKrXRkrrUDKKrXTkrrUFIMrXmkruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanariansaaretrsU Europe/Zurichr}rjXZürichrsU Europe/Londonr}rjXLontoorsU Asia/Tashkentr}rjXTaškentrsU Asia/Tokyor}rjXTokiorsUPacific/Easterr}rjXPääsiäissaarirsU Europe/Romer}rjXRoomarsUAsia/Kamchatkar}rjX KamtšatkarsUEurope/Tallinnr}rjXTallinnarsUEurope/Vaticanr}rjX VatikaanirsUAtlantic/South_Georgiar}rjXEtelä-GeorgiarsUAtlantic/Faeroer}rjX FärsaaretrsU Europe/Warsawr}rjXVarsovarsUAsia/Krasnoyarskr}rjX KrasnojarskrsU Asia/Damascusr}rjXDamaskosrsUEurope/Isle_of_Manr}rjXMansaarirsUEurope/Copenhagenr}rjXKööpenhaminarsUEurope/Mariehamnr}rjX MaarianhaminarsUAmerica/St_Luciar}rjX Saint Luciar sUEurope/Bucharestr }r jXBukarestr sU Asia/Yakutskr }rjXJakutskrsU Asia/Tehranr}rjXTeheranrsU Europe/Tiraner}rjXTiranarsUEurope/Luxembourgr}rjX LuxemburgrsU America/Thuler}rjXQaanaaqrsUAmerica/St_Johnsr}rjX St. JohnsrsUIndian/Maldivesr}r jX Malediivitr!sU Pacific/Niuer"}r#jX Niuesaarir$sUAtlantic/Cape_Verder%}r&jX Kap Verder'sU Africa/Cairor(}r)jXKairor*sU Europe/Moscowr+}r,jXMoskovar-sU Asia/Macaur.}r/jXMacaor0sU Asia/Aqtober1}r2jXAqtöber3sUEurope/Vilniusr4}r5jXVilnar6sUAmerica/North_Dakota/Centerr7}r8jXkeskinen Pohjois-Dakotar9sU Europe/Kievr:}r;jXKiovar<sU Europe/Rigar=}r>jXRiikar?sUAmerica/St_Vincentr@}rAjX Saint VincentrBsU Asia/DushanberC}rDjXDušanberEsU Asia/YerevanrF}rGjXJerevanrHsUAmerica/JamaicarI}rJjXJamaikarKsUAsia/YekaterinburgrL}rMjX JekaterinburgrNsU Europe/BerlinrO}rPjXBerliinirQsUAsia/Hong_KongrR}rSjXHongkongrTsUAmerica/ScoresbysundrU}rVjXIttoqqortoormiitrWsUEurope/ZaporozhyerX}rYjX ZaporižžjarZsUIndian/Christmasr[}r\jXJoulur]sU Europe/Viennar^}r_jXWienr`sU Europe/Parisra}rbjXPariisircsUEurope/Stockholmrd}rejXTukholmarfsU Pacific/Fijirg}rhjXFidzirisUAmerica/Cancunrj}rkjXCancúnrlsUAmerica/St_Thomasrm}rnjX Saint ThomasrosUAmerica/El_Salvadorrp}rqjX San SalvadorrrsU Asia/Sakhalinrs}rtjXSahalinrusUAmerica/Havanarv}rwjXHavannarxsUEurope/Brusselsry}rzjXBrysselr{sU Europe/Athensr|}r}jXAteenar~sU Europe/Lisbonr}rjXLissabonrsUEurope/Belgrader}rjXBelgradrsUAtlantic/Azoresr}rjXAzoritrsU Asia/Nicosiar}rjXNikosiarsU Etc/Unknownr}rjX tuntematonrsUAmerica/Mexico_Cityr}rjXCiudad de MéxicorsU Indian/Comoror}rjXKomoritrsUEurope/Uzhgorodr}rjXUžgorodrsUAmerica/St_Kittsr}rjX Saint KittsrsUAmerica/Godthabr}rjXNuukrsUAfrica/Algiersr}rjXAlgerrsUAntarctica/South_Poler}rjX EtelänaparsUAmerica/Sao_Paulor}rjX São PaulorsuUscriptsr}r(UZsymrXsymbolitrUGururXgurmukhirUHebrrX heprealainenrUZzzzrX2tuntematon tai virheellinen kirjoitusjärjestelmärUPhnxrXfoinikialainenrUMoonrXmoon-kohokirjoitusrUSamrrXsamarianaramealainenrUChamrX tšamilainenrUArabrX arabialainenrUGujrrXgudžaratilainenrUZxxxrXkirjoittamatonrULycirX lyykialainenrUSinhrX sinhalilainenrUTalurXuusi tailuelainenrUMongrX mongolilainenrUXpeorXmuinaispersialainenrUVisprX näkyvä puherURjngrXrejangrUOlckrXol chikirUTalerX tailelainenrUMandrX mandealainenrUManirX manikealainenrUMlymrXmalajalamilainenrUTibtrXtiibetiläinenrUKalirXkayah lirUJpanrX japanilainenrUPlrdrXPollardin foneettinenrUKanarXkatakanarULydirX lyydialainenrULepcrX lepchalainenrUSundrX sundalainenrUYiiirX yiläinenrUJavarX jaavalainenrUOryarX orijalainenrULaoorX laolainenrUUgarrX ugaritilainenrUCyrlrX kyrillinenrUVaiirX vailainenrUArmnrX armenialainenrUCyrsrX'kyrillinen muinaiskirkkoslaavimuunnelmarUKhmrrX khmeriläinenrUArmirXvaltakunnanaramealainenrUSylorX syloti nagrirUItalrXmuinaisitalialainenrUSgnwrX SignWritingrUXsuxrX,sumerilais-akkadilainen nuolenpääkirjoitusrUThaarXthaanarUThairX thailainenrUCprtrXmuinaiskyproslainenr ULinbr X lineaari-Br ULinar X lineaari-Ar UOsmarX osmanjalainenrUSaurrX saurashtrarUHirarXhiraganarUHanirXkiinalainen hanrUEgydrXegyptiläinen demoottinenrUQaairXperittyrUEgyhrXegyptiläinen hieraattinenrUCansrX8Kanadan alkuperäiskansojen yhtenäistetty tavukirjoitusrUEgyprXegyptiläiset hieroglyfitrUZmthr X matemaattinenr!UTfngr"Xtifinaghr#UShawr$X shaw’lainenr%UCirtr&Xcirthr'UGeorr(X georgialainenr)UTengr*Xtengwarr+UHrktr,Xhiragana tai katakanar-UGeokr.Xmuinaisgeorgialainenr/UTavtr0Xtai vietr1UOgamr2Xogamr3UDsrtr4Xdeseretr5UGothr6X goottilainenr7UHanor8X hanunoolainenr9UBalir:X balilainenr;UKorer<X korealainenr=UHangr>Xhangulr?UCarir@X kaarialainenrAUAvstrBX avestalainenrCUTagbrDXtagbanwalainenrEUHansrFX!kiinalainen yksinkertaistettu hanrGUHantrHXkiinalainen perinteinen hanrIURororJX rongorongorKUDevarLX devanagarirMUIndsrNX induslainenrOUBoporPXbopomoforQUMymrrRX burmalainenrSUTglgrTXtagalogilainenrUUPermrVXmuinaispermiläinenrWUBugirXX bugilainenrYUPhagrZXphags-par[UBrair\Xbraille-pistekirjoitusr]UBrahr^Xbrahmir_UBatkr`X batakilainenraUMerorbX meroiittinenrcULimbrdX limbulainenreUMteirfXmeiteirgUPhlirhXpiirtokirjoituspahlavilainenriUTelurjX telugulainenrkUTamlrlX tamililainenrmUSararnXsaratiroUPhlprpXpsalttaripahlavilainenrqULatgrrXlatinalainen gaelimuunnelmarsULatfrtXlatinalainen fraktuuramuunnelmaruUKharrvX kharosthirwUNkoorxXn'koryUPhlvrzXkirjapahlavilainenr{ULatnr|X latinalainenr}UMayar~Xmaya-hieroglyfitrULanarXlannarUEthirX etiopialainenrUKthirXkaithirUHmngrX pahawh hmongrUBuhdrX buhidilainenrUCoptrX koptilainenrUPrtirXpiirtokirjoitusparthialainenrUGlagrXglagoliittinenrURunrrXriimukirjoitusrUOrkhrXorkhonrUCakmrX chakmalainenrUHungrXmuinaisunkarilainenrUGrekrX kreikkalainenrUCherrXcherokeelainenrUZyyyrXmäärittämätönrUSyrcrX syyrialainenrUBlisrXbliss-symbolitrUBengrX bengalilainenrUSyrerX!syyrialainen estrangelo-muunnelmarUSyrjrX syyrialainen läntinen muunnelmarUSyrnrXsyyrialainen itäinen muunnelmarUKndarX kannadalainenruUvariantsr}r(UMONOTONrXmonotoninen kreikkarUBOONTrXenglannin boontling-murrerUSCOUSErXenglannin scouse-murrerUAREVELArXitäarmenialainenrUSOLBArX-sloveenin resian Stolvizzan/Solbican alamurrerULIPAWrX-sloveenin resian Lipovazin/Lipovecin alamurrerU1901rX"saksan perinteinen oikeinkirjoitusrUBAKU1926rX1yhtenäistetty turkkilainen latinalainen aakkostorUOSOJSrX+sloveenin resian Oseaccon/Osojanen alamurrerU1694ACADrXvarhaisnykyranskarUVALENCIArXkatalaanin valencian murrerUPOLYTONrXpolytoninen kreikkarUNJIVArX'sloveenin resian Gnivan/Njivan alamurrerUFONIPArX(kansainvälinen foneettinen aakkosto IPArUTARASKrX,valkovenäjän taraškevitsa-oikeinkirjoitusrU1606NICTrXmyöhäiskeskiranskarUSAAHOrXafarin saho-murrerUPOSIXrXtietokonemäärittely POSIXrUFONUPArX$uralilainen foneettinen aakkosto UPArUNEDISrXsloveenin natisonen murrerUAREVMDArXlänsiarmenialainenrU1994rX9sloveenin resian murteen yhdenmukaistettu oikeinkirjoitusrU1996rXsaksan uusi oikeinkirjoitusrUREVISEDrXuudistettu oikeinkirjoitusrUSCOTLANDrXskotlanninenglantirUBISKErX,sloveenin resian San Giorgion/Bilan alamurrerUROZAJrXsloveenin resian murreruUnumber_symbolsr}r(UgrouprX rUnativeZeroDigitrX0rU exponentialrXErUperMillerX‰rUnanrXepälukurUdecimalrX,rU percentSignrX%rUlistrX;rU patternDigitrX#rUplusSignrX+rUinfinityrX∞rU minusSignrh XUkrainan hryvniar? UUAKr@ XUkrainan karbovanetzrA UUGXrB XUgandan šillinkirC UJODrD XJordanian dinaarirE UAORrF X'Angolan kwanza reajustado (1995–1999)rG USURrH XNeuvostoliiton ruplarI UAWGrJ XAruban guldenirK USARrL XSaudi-Arabian rialrM jX Suomen markkarN UHKDrO XHongkongin dollarirP USRGrQ XSurinamin guldenirR UTPErS XTimorin escudorT UMGFrU XMadagaskarin frangirV UCHErW XSveitsin WIR-eurorX UCHFrY XSveitsin frangirZ UGIPr[ XGibraltarin puntar\ UBYRr] XValko-Venäjän ruplar^ UALLr_ X Albanian lekr` UXPDra X palladiumrb UUGSrc XUgandan šillinki (1966–1987)rd UMROre XMauritanian ouguiyarf UBOVrg XBolivian mvdolrh UHRKri X Kroatian kunarj UDJFrk XDjiboutin frangirl UHRDrm XKroatian dinaarirn UPESro X Perun solrp UEQErq X-Päiväntasaajan Guinean ekwele (1986–1989)rr jX Italian liirars UXAFrt XCFA-frangi BEACru UBNDrv XBrunein dollarirw UISKrx XIslannin kruunury UZALrz XEtelä-Afrikan rahoitusrandir{ USRDr| XSurinamin dollarir} UNIOr~ XNicaraguan kultacordobar ULAKr X Laosin kipr UNICr XNicaraguan cordobar UNPRr X Nepalin rupiar UMZEr XMosambikin escudor UUYUr X Uruguayn pesor ULUCr XLuxemburgin vaihdettava frangir UJMDr XJamaikan dollarir UFRFr XRanskan frangir UMAFr XMarokon frangir UUYIr X#Uruguayn peso en unidades indexadasr UMZMr X Mosambikin metical (1980–2006)r UMZNr XMosambikin meticalr UPHPr XFilippiinien pesor UZARr XEtelä-Afrikan randir URHDr XRhodesian dollarir UGWPr XGuinea-Bissaun pesor ULUFr XLuxemburgin frangir UBELr XBelgian rahoitusfrangir UBECr XBelgian vaihdettava frangir UNGNr XNigerian nairar UYUNr XJugoslavian vaihdettava dinaarir UBEFr XBelgian frangir UPLZr XPuolan zloty (1950–1995)r UCRCr XCosta Rican colonr UTRLr XTurkin vanha liirar UDEMr X Saksan markkar UEEKr X Viron kruunur UMWKr XMalawin kwachar UTTDr XTrinidadin ja Tobagon dollarir ULKRr XSri Lankan rupiar USKKr XSlovakian korunar UCVEr XKap Verden escudor UPKRr XPakistanin rupiar UHUFr XUnkarin forinttir UROLr XRomanian vanha leur UXEUr XEuroopan valuuttayksikkö (ECU)r UBMDr XBermudan dollarir UOMRr X Omanin rialr ULSLr X Lesothon lotir ULSMr XLesothon malotir UMNTr XMongolian tugrikr UAMDr X Armenian dramr UYUDr XJugoslavian kova dinaarir UBUKr X Burman kyatr USYPr X Syyrian puntar UQARr X Qatarin rialr UXDRr Xerityisnosto-oikeus (SDR)r UNLGr XAlankomaiden guldenir UGEKr XGeorgian kuponkilarir UMTPr X Maltan puntar jXEnglannin puntar UGELr X Georgian larir USHPr XSaint Helenan puntar UAFNr XAfganistanin afgaanir USBDr XSalomonsaarten dollarir UCSKr XTšekkoslovakian kova korunar UKPWr XPohjois-Korean wonr UXREr XRINET-rahastotr UCSDr XSerbian vanha dinaarir UAFAr X"Afganistanin afgaani (1927–2002)r UTHBr X Thaimaan bahtr UBYBr X(Valko-Venäjän uusi rupla (1994–1999)r UBDTr XBangladeshin takar UGRDr XKreikan drakmar UYERr X Jemenin rialr UDDMr XItä-Saksan markkar USZLr XSwazimaan lilangenir UHTGr X Haitin gourder UTRYr X Turkin liirar UMGAr XMadagaskarin ariaryr UANGr XAlankomaiden Antillien guldenir ULRDr XLiberian dollarir URWFr XRuandan frangir jX Norjan kruunur UMXVr X Meksikon UDIr UKESr XKenian šillinkir UMOPr X Macaon patacar jX Intian rupiar UMXNr X Meksikon pesor UCZKr XTšekin korunar UTJSr XTadžikistanin somonir UTJRr XTadžikistanin ruplar UBTNr! XBhutanin ngultrumr" UYDDr# XJemenin dinaarir$ UGWEr% XPortugalin Guinean escudor& UCOPr' XKolumbian pesor( UCOUr) XKolumbian unidad de valor realr* UMTLr+ X Maltan liirar, UMURr- XMauritiuksen rupiar. UIDRr/ XIndonesian rupiar0 UHNLr1 XHondurasin lempirar2 UXPFr3 X CFP-frangir4 UFJDr5 XFidžin dollarir6 UETBr7 X Etiopian birrr8 UPENr9 XPerun uusi solr: UBZDr; XBelizen dollarir< UCHWr= XSveitsin WIR-frangir> UATSr? XItävallan šillinkir@ UILPrA XIsraelin puntarB UZRNrC XZairen uusi zairerD UDOPrE XDominikaanisen tasavallan pesorF ULULrG XLuxemburgin rahoitusfrangirH UTMMrI XTurkmenistanin manatrJ UTWDrK XTaiwanin uusi dollarirL UMDLrM X Moldovan leurN UXPTrO XplatinarP UECVrQ X Ecuadorin UVCrR UECSrS XEcuadorin sucrerT UBSDrU XBahaman dollarirV jXRuotsin kruunurW UTOPrX XTongan pa’angarY UPEIrZ X Perun intir[ UZMKr\ XSambian kwachar] UMVRr^ XMalediivien rufiyaar_ UXTSr` X*testaustarkoitukseen varattu valuuttakoodira UAUDrb XAustralian dollarirc UADPrd XAndorran pesetare UCUPrf X Kuuban pesorg UIEPrh XIrlannin puntari UCLFrj XChilen unidades de fomentork UBBDrl XBarbadosin dollarirm UKMFrn XKomorien frangiro UKRWrp XEtelä-Korean wonrq UGMDrr XGambian dalasirs UVEFrt XVenezuelan bolivar fuerteru UGTQrv XGuatemalan quetzalrw UVEBrx XVenezuelan bolivarry UXOFrz XCFA-frangi BCEAOr{ USITr| XSlovenian tolarr} USDPr~ XSudanin punta (1957–1999)r UCLPr X Chilen pesor UEURr Xeuror UCDFr X Kongon frangir UXCDr XItä-Karibian dollarir UKZTr XKazakstanin tenger URUBr XVenäjän ruplar UXFUr XRanskan UIC-frangir UXAGr Xhopear UBRRr XBrasilian cruzeiror UBRNr XBrasilian uusi cruzador jXBrasilian realr UMMKr XMyanmarin kyatr UUYPr XUruguayn peso (1975–1993)r URURr XVenäjän rupla (1991–1998)r UPLNr X Puolan zlotyr UBREr X Brasilian cruzeiro (1990–1993)r UPYGr XParaguayn guaranir UBRCr XBrasilian cruzador UBRBr X%Brasilian uusi cruzeiro (1967–1986)r USVCr XEl Salvadorin colonr UAEDr XArabiemiirikuntien dirhamir UGNSr X Guinean sylir UMKDr XMakedonian dinaarir UAZMr X"Azerbaidžanin manat (1993–2006)r UAZNr XAzerbaidžanin manatr UUSNr X'Yhdysvaltain dollari (seuraava päivä)r UGQEr X)Päiväntasaajan Guinean ekwele (–1986)r UVUVr X Vanuatun vatur UBADr XBosnia-Hertsegovinan dinaarir UGNFr XGuinean frangir UMXPr X Meksikon hopeapeso (1861–1992)r UIQDr XIrakin dinaarir UERNr XEritrean nakfar UBAMr X'Bosnia-Hertsegovinan vaihdettava markkar USCRr XSeychellien rupiar UCADr XKanadan dollarir USDDr XSudanin dinaarir UCYPr XKyproksen puntar UMADr XMarokon dirhamir UKWDr XKuwaitin dinaarir UBIFr XBurundin frangir ULTTr XLiettuan talonasr UPGKr XPapua-Uuden-Guinean kinar ULTLr X Liettuan litir USGDr XSingaporen dollarir UUZSr XUzbekistanin somr USTDr XSão Tomén ja Príncipen dobrar UXFOr XRanskan kultafrangir UMLFr X Malin frangir UESPr XEspanjan pesetar UIRRr X Iranin rialr UZRZr X Zairen zairer UCNYr X Kiinan yuanr USLLr XSierra Leonen leoner UTNDr XTunisian dinaarir UGYDr XGuyanan dollarir UESBr X"Espanjan peseta (vaihdettava tili)r UESAr XEspanjan peseta (A-tili)r UNZDr XUuden-Seelannin dollarir UFKPr XFalklandinsaarten puntar ULVLr X Latvian latir UUSSr X#Yhdysvaltain dollari (sama päivä)r jXYhdysvaltain dollarir UARPr XArgentiinan peso (1983–1985)r UKGSr X Kirgisian somr UARSr XArgentiinan pesor UILSr XIsraelin uusi sekelir URONr XRomanian uusi leur URSDr XSerbian dinaarir UBHDr XBahrainin dinaarir jX Japanin jenir UARAr XArgentiinan australr USDGr X Sudanin puntar UPTEr XPortugalin escudor UXAUr Xkultar uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXTr KXHr KXMr Kj Kj KXKr Kj KjK XSr K XLr K j K XJr usUformatr }r! (Uwider" }r# (KX tammikuutar$ KX helmikuutar% KX maaliskuutar& KX huhtikuutar' KX toukokuutar( KX kesäkuutar) KX heinäkuutar* KXelokuutar+ K X syyskuutar, K X lokakuutar- K X marraskuutar. K X joulukuutar/ uU abbreviatedr0 }r1 (KXtammir2 KXhelmir3 KXmaalisr4 KXhuhtir5 KXtoukor6 KXkesär7 KXheinär8 KXelor9 K Xsyysr: K Xlokar; K Xmarrasr< K Xjoulur= uuuUcurrency_formatsr> }r? Nh,)r@ }rA (h/Nh1Kh2KKrB h4X ¤rC jC rD h7KKrE h9X #,##0.00 ¤rF h;h5hNh?KKrH ubsUdaysrI }rJ (U stand-alonerK }rL UnarrowrM }rN (Kj Kj Kj Kj KXPrO Kj Kj usUformatrP }rQ (UwiderR }rS (KX maanantainarT KX tiistainarU KX keskiviikkonarV KX torstainarW KX perjantainarX KX lauantainarY KX sunnuntainarZ uU abbreviatedr[ }r\ (KXmar] KXtir^ KXker_ KXtor` KXpera KXlarb KXsurc uuuU meta_zonesrd }re (U Goose_Bayrf }rg Ucommonrh sU Kuybyshevri }rj jh sURotherark }rl jh sUArabianrm }rn jh sUAustralia_Easternro }rp jh sU Argentinarq }rr jh sUBoliviars }rt jh sU Turkmenistanru }rv jh sU Alaska_Hawaiirw }rx jh sU Cape_Verdery }rz jh sUAzoresr{ }r| jh sUPierre_Miquelonr} }r~ jh sUEurope_Centralr }r (jh Ulongr }r (Udaylightr XKeski-Euroopan kesäaikar Ustandardr XKeski-Euroopan normaaliaikar uuUTrukr }r jh sU Aktyubinskr }r jh sUBeringr }r jh sU Qyzylordar }r jh sUKazakhstan_Easternr }r jh sUFrunzer }r jh sU Dutch_Guianar }r jh sUYerevanr }r jh sU Kamchatkar }r jh sULiberiar }r jh sUKashgarr }r jh sUMaldivesr }r jh sUNorfolkr }r jh sU Dominicanr }r jh sUAfrica_Easternr }r jh sU Ashkhabadr }r jh sUAlaskar }r (jh j }r (j XAlaskan kesäaikar j XAlaskan normaaliaikar uuUAmerica_Easternr }r (jh j }r (j XYhdysvaltain itäinen kesäaikar j X"Yhdysvaltain itäinen normaaliaikar uuU Yekaterinburgr }r jh sUSolomonr }r jh sU Krasnoyarskr }r jh sUAmerica_Centralr }r (jh j }r (j XYhdysvaltain keskinen kesäaikar j X"Yhdysvaltain keskinen normaaliaikar uuUMawsonr }r jh sUPakistanr }r jh sUChathamr }r jh sUSamoar }r jh sUMacaur }r jh sUChamorror }r jh sUGuamr }r jh sUIndiar }r jh sU Azerbaijanr }r jh sU Marquesasr }r jh sU Tajikistanr }r jh sUPitcairnr }r jh sUTurkeyr }r jh sU Afghanistanr }r jh sU Choibalsanr }r jh sU Vladivostokr }r jh sU Shevchenkor }r jh sU Bangladeshr }r jh sUGulfr }r jh sUDaccar }r jh sUMongoliar }r jh sU Samarkandr }r jh sUWaker }r jh sUPerur }r jh sUVanuatur }r jh sUIndonesia_Centralr }r jh sUNaurur }r jh sUFalklandr }r jh sUKorear }r jh sUCubar }r jh sUIrkutskr }r jh sUArgentina_Westernr }r jh sUAmazonr }r jh sUChinar }r (Ushortr }r (j X CDT (Kiina)r j X CST (Kiina)r ujh j }r (j XKiinan kesäaikar j XKiinan normaaliaikar uuULong_Shur }r jh sUArmeniar }r jh sUCookr }r jh sUAfrica_FarWesternr }r jh sUGreenland_Westernr }r jh sUKarachir }r jh sUTongar }r jh sUSakhalinr }r jh sUBrasiliar }r jh sUSyowar }r jh sU French_Guianar }r jh sUFrench_Southernr }r jh sU Mauritiusr }r jh sUAfrica_Southernr! }r" jh sUGambierr# }r$ jh sUDavisr% }r& jh sU Newfoundlandr' }r( (jh j }r) (j XNewfoundlandin kesäaikar* j XNewfoundlandin normaaliaikar+ uuUCocosr, }r- jh sU Kyrgystanr. }r/ jh sUTokelaur0 }r1 jh sUAustralia_Westernr2 }r3 jh sUBakur4 }r5 jh sUAfrica_Centralr6 }r7 jh sU Line_Islandsr8 }r9 jh sU Novosibirskr: }r; jh sUJapanr< }r= (jh j }r> (j XJapanin kesäaikar? j XJapanin normaaliaikar@ uuU SverdlovskrA }rB jh sU New_CaledoniarC }rD jh sU KwajaleinrE }rF jh sUAqtoberG }rH jh sUGilbert_IslandsrI }rJ jh sUAustralia_CentralWesternrK }rL jh sU IndochinarM }rN jh sUPapua_New_GuinearO }rP jh sUHovdrQ }rR jh sU South_GeorgiarS }rT jh sUEcuadorrU }rV jh sUMalayarW }rX jh sUBruneirY }rZ jh sUIranr[ }r\ jh sUAqtaur] }r^ jh sU Indian_Oceanr_ }r` jh sUTuvalura }rb jh sUAmerica_Mountainrc }rd (jh j }re (j XKalliovuorten kesäaikarf j XKalliovuorten normaaliaikarg uuUHawaii_Aleutianrh }ri jh sUChangbairj }rk jh sUChilerl }rm jh sUWallisrn }ro jh sUKosraerp }rq jh sUDushanberr }rs jh sUGeorgiart }ru jh sUAnadyrrv }rw jh sU Philippinesrx }ry jh sUYakutskrz }r{ jh sUIndonesia_Westernr| }r} jh sUGreenland_Easternr~ }r jh sUOralr }r jh sUGMTr }r (jh j }r j XGreenwichin normaaliaikar suUMarshall_Islandsr }r jh sUIrishr }r jh sU Seychellesr }r jh sUUruguayr }r jh sUVostokr }r jh sU Uzbekistanr }r jh sUColombiar }r jh sUReunionr }r jh sU Volgogradr }r jh sU Kizilordar }r jh sUFijir }r jh sUAmerica_Pacificr }r (jh j }r (j X"Yhdysvaltain Tyynenmeren kesäaikar j X%Yhdysvaltain Tyynenmeren normaaliaikar uuUKazakhstan_Westernr }r jh sUPalaur }r jh sUEurope_Easternr }r (jh j }r (j XItä-Euroopan kesäaikar j XItä-Euroopan normaaliaikar uuUBhutanr }r jh sUBorneor }r jh sUNepalr }r jh sU Galapagosr }r jh sU Lord_Hower }r jh sUPhoenix_Islandsr }r jh sUSurinamer }r jh sUAcrer }r jh sUEasterr }r jh sU Christmasr }r jh sU East_Timorr }r jh sUIsraelr }r (j }r j X IST (Israel)r sjh j }r (j XIsraelin kesäaikar j XIsraelin normaaliaikar uuUAfrica_Westernr }r jh sUTashkentr }r jh sUMalaysiar }r jh sUNoronhar }r jh sU Venezuelar }r jh sUPonaper }r jh sUIndonesia_Easternr }r jh sUOmskr }r jh sUAustralia_Centralr }r jh sUAtlanticr }r (jh j }r (j XKanadan Atlantin kesäaikar j XKanadan Atlantin normaaliaikar uuU North_Marianar }r jh sULankar }r jh sUDumontDUrviller }r jh sUEurope_Westernr }r jh sU New_Zealandr }r jh sUBritishr }r jh sUUrumqir }r jh sU Hong_Kongr }r jh sUGuyanar }r jh sUMagadanr }r jh sUAlmatyr }r jh sUTbilisir }r jh sUMyanmarr }r jh sU Singaporer }r jh sUSamarar }r jh sUGreenland_Centralr }r jh sUUralskr }r jh sUTahitir }r jh sUParaguayr }r jh sUYukonr }r jh sUMoscowr }r jh sUNiuer }r jh suUerasr }r (Uwider }r (KXennen Kristuksen syntymäär KXjälkeen Kristuksen syntymänr uU abbreviatedr }r (KXeKr.r KXjKr.r uuu.PK[ڐhll(site-packages/babel/localedata/mt_MT.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99(site-packages/babel/localedata/zh_MO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[7R#//&site-packages/babel/localedata/gez.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX ጽባሕqUpmqX ምሴትquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UguqAXጉጃርቲኛqBUgdqCXእስኮትስ፡ጌልክኛqDUgaqEX አይሪሽqFUgnqGX ጓራኒኛqHUglqIX ጋለጋኛqJUlaqKX ላቲንኛqLUlnqMXሊንጋላኛqNUloqOX ላውስኛqPUttqQX ታታርኛqRUtrqSX ቱርክኛqTUtsqUX ጾንጋኛqVUlvqWXላትቪያንqXUtoqYX ቶንጋqZUltq[Xሊቱአኒያንq\Utkq]Xቱርክመንኛq^Uthq_X ታይኛq`UtiqaX ትግርኛqbUtgqcX ታጂኪኛqdUteqeX ተሉጉኛqfUtaqgX ታሚልኛqhUyiqiXይዲሻዊኛqjUyoqkXዮሩባዊኛqlUgezqmX ግዕዝኛqnUdeqoX ጀርመንqpUdaqqX ዴኒሽqrUdzqsXድዞንግኻኛqtUstquX ሶዞኛqvUquqwX ኵቿኛqxUelqyX ግሪክኛqzUeoq{Xኤስፐራንቶq|Uenq}Xእንግሊዝኛq~UzhqX ቻይንኛqUzaqXዡዋንግኛqUukqXዩክረኒኛqUeuqX ባስክኛqUetqXኤስቶኒአንqUesqX ስፓኒሽqUruqX ራሽኛqUrwqXኪንያርዋንድኛqUrmqX ሮማንስqUrnqX ሩንዲኛqUroqXሮማኒያንqUbnqXበንጋሊኛqUbeqXቤላራሻኛqUbgqXቡልጋሪኛqUbaqXባስኪርኛqUpsqX ፑሽቶኛqUwoqX ዎሎፍኛqUjvqX ጃቫንኛqUboqXትበትንኛqUbhqX ቢሃሪqUbiqXቢስላምኛqUbrqXብሬቶንኛqUjaqX ጃፓንኛqUomqX ኦሮምኛqUocqXኦኪታንኛqUtwqX ትዊኛqUorqX ኦሪያኛqUxhqX ዞሳኛqUcoqXኮርሲካኛqUcaqXካታላንኛqUcyqX ወልሽqUcsqX ቼክኛqUbynqX ብሊንqUptqXፖርቱጋሊኛqUtlqXታጋሎገኛqUpaqXፓንጃቢኛqUviqXቪትናምኛqUplqX ፖሊሽqUhyqXአርመናዊqUhrqXክሮሽያንኛqUiuqXእኑክቲቱትኛqUhuqXሀንጋሪኛqUhiqX ሐንድኛqUhaqX ሃውሳኛqUheqXዕብራስጥqUmgqXማላጋስኛqUuzqXኡዝበክኛqUmlqXማላያላምኛqUmoqXሞልዳቫዊናqUmnqXሞንጎላዊኛqUmiqX ማዮሪኛqUikqXእኑፒያቅኛqUmkqXማከዶኒኛqUurqX ኡርዱኛqUmtqXማልቲስኛqUmsqX ማላይኛqUmrqX ማራዚኛqUugqXኡዊግሁርኛqUmyqX ቡርማኛqUaaqX አፋርኛqUabqXአብሐዚኛqUssqX ስዋቲኛqUafqXአፍሪቃንስኛqUtnqXጽዋናዊኛqUswqXስዋሂሊኛrUisrXአይስላንድኛrUamrXአምሐረኛrUitrXጣሊያንኛrUsvrXስዊድንኛrUiar Xኢንቴርሊንጓr Uasr Xአሳሜዛዊr Uarr X ዐርቢኛrUsurX ሱዳንኛrUzurX ዙሉኛrUayrXአያማርኛrUazrXአዜርባይጃንኛrUierXእንተርሊንግወrUidrXእንዶኒሲኛrUskrXስሎቫክኛrUnlrXደችrUnorXኖርዌጂያንr Unar!X ናኡሩr"Uner#X ኔፓሊኛr$Uvor%Xቮላፑክኛr&Usidr'X ሲዳምኛr(Utigr)X ትግረr*Ufrr+Xፈረንሳይኛr,Usmr-X ሳሞአኛr.Ufyr/X ፍሪስኛr0Ufar1Xፐርሲያኛr2Ufir3X ፊኒሽr4Ufjr5X ፊጂኛr6Usar7Xሳንስክሪትኛr8Ufor9X ፋሮኛr:Ukar;Xጊዮርጊያንr<Ukkr=X ካዛክኛr>Usrr?X ሰርቢኛr@UsqrAX ልቤኒኛrBUkorCX ኮሪያኛrDUknrEX ካናዳኛrFUkmrGX ክመርኛrHUklrIXካላሊሱትኛrJUksrKXካሽሚርኛrLUsirMXስንሃልኛrNUsorOX ሱማልኛrPUsnrQX ሾናኛrRUkurSXኩርድሽኛrTUslrUX ስሎቪኛrVUkyrWXኪርጊዝኛrXUsgrYX ሳንጎኛrZUsdr[Xሲንድሂኛr\uU territoriesr]}r^(UBEr_X ቤልጄምr`UBGraXቡልጌሪያrbUBArcX-ቦስኒያ፡እና፡ሄርዞጎቪኒያrdUBBreXባርቤዶስrfUBMrgX ቤርሙዳrhUBOriX ቦሊቪያrjUBHrkX ባህሬንrlUBTrmX ቡህታንrnUJMroX ጃማይካrpUJOrqX ጆርዳንrrUBRrsX ብራዚልrtUBYruX ቤላሩስrvUBZrwX ቤሊዘrxURUryX ራሺያrzUTLr{Xምስራቅ፡ቲሞርr|UROr}X ሮሜኒያr~UGWrX ቢሳዎrUGRrX ግሪክrUGQrXኢኳቶሪያል፡ጊኒrUJPrX ጃፓንrUGYrX ጉያናrUGFrX!የፈረንሳይ፡ጉዊአናrUGErX ጆርጂያrUGBrXእንግሊዝrUGNrXጊኒrUGMrX ጋምቢያrUTNrX ቱኒዚያrUHRrXክሮኤሽያrUHTrX ሀይቲrUHUrX ሀንጋሪrUHKrXሆንግ፡ኮንግrUVErXቬንዙዌላrUPRrXፖርታ፡ሪኮrUPFrX$የፈረንሳይ፡ፖሊኔዢያrUPGrXፓፑዋ፡ኒው፡ጊኒrUPErXፔሩrUSOrX ሱማሌrUPLrX ፖላንድrUZMrX ዛምቢያrUEHrXምዕራባዊ፡ሳህራrUEErXኤስቶኒያrUEGrX ግብጽrUZArXደቡብ፡አፍሪካrUECrX ኢኳዶርrUITrX ጣሊያንrUETrXኢትዮጵያrUESrX ስፔንrUERrX ኤርትራrUMDrX ሞልዶቫrUMArX ሞሮኮrUUZrXዩዝበኪስታንrUMOrX ማካዎrUMNrXሞንጎሊያrUMKrXማከዶኒያrUMUrX ማሩሸስrUMTrX ማልታrUMRrXሞሪቴኒያrUUGrX ዩጋንዳrUMYrX ማሌዢያrUMXrX ሜክሲኮrUILrXእስራኤልrUFRrXፈረንሳይrUFIrXፊንላንድrUFJrXፊጂrUFMrXሚክሮኔዢያrUNLrXኔዘርላንድrUNOrX ኖርዌrUNArX ናሚቢያrUNCrXኒው፡ካሌዶኒያrUNGrXናይጄሪያrUNZrXኒው፡ዚላንድrUNPrX ኔፓልrUCHrXስዊዘርላንድrUCOrXኮሎምቢያrUCNrX ቻይናrUCMrX ካሜሩንrUCLrXቺሊrUCFrX6የመካከለኛው፡አፍሪካ፡ሪፐብሊክrUCZrXቼክ፡ሪፑብሊክrUCYrXሳይፕረስrUCSrX ሰርቢያrUCVrXኬፕ፡ቬርዴrUSYrX ሲሪያrUKHrXካምቦዲያrUKMrX ኮሞሮስrUSKr Xስሎቫኪያr UKRr Xሰሜን፡ኮሪያr USIr XስሎቬኒያrUKPrXደቡብ፡ኮሪያrUKWrX ክዌትrUSNrX ሴኔጋልrUSArXሳውድአረቢያrUSGrXሲንጋፖርrUSErX ስዊድንrUSDrX ሱዳንrUDOrXዶሚኒክ፡ሪፑብሊክrUDMrX ዶሚኒካr UDKr!Xዴንማርክr"UDEr#X ጀርመንr$UYEr%X የመንr&UDZr'Xአልጄሪያr(UUSr)X አሜሪካr*ULBr+X ሊባኖስr,UTTr-X$ትሪኒዳድ፡እና፡ቶባጎr.UTRr/X ቱርክr0ULVr1X ላትቪያr2ULTr3Xሊቱዌኒያr4UTJr5Xታጃኪስታንr6UTHr7Xታይላንድr8UTFr9X0የፈረንሳይ፡ደቡባዊ፡ግዛቶችr:UTDr;Xቻድr<ULYr=X ሊቢያr>UAEr?X0የተባበሩት፡አረብ፡ኤምሬትስr@UADrAX አንዶራrBUVGrCX0የእንግሊዝ፡ድንግል፡ደሴቶችrDUIQrEX ኢራቅrFUVIrGX-የአሜሪካ፡ቨርጂን፡ደሴቶችrHUISrIXአይስላንድrJUAMrKXአርሜኒያrLUALrMXአልባኒያrNUANrOX'ኔዘርላንድስ፡አንቲልስrPUARrQXአርጀንቲናrRUAUrSXአውስትሬሊያrTUATrUXኦስትሪያrVUINrWX ህንድrXUTZrYXታንዛኒያrZUAZr[Xአዘርባጃንr\UIEr]Xአየርላንድr^UIDr_Xኢንዶኔዢያr`uUdecimal_formatsra}rbU date_formatsrc}rd(Umediumreh))rf}rg(h,X dd-MMM-yyyyrhh.X%(dd)s-%(MMM)s-%(yyyy)sriubUfullrjh))rk}rl(h,X#EEEE፥ dd MMMM መዓልት yyyy Grmh.X7%(EEEE)s፥ %(dd)s %(MMMM)s መዓልት %(yyyy)s %(G)srnubUlongroh))rp}rq(h,X dd MMMM yyyyrrh.X%(dd)s %(MMMM)s %(yyyy)srsubUshortrth))ru}rv(h,Xdd/MM/yyrwh.X%(dd)s/%(MM)s/%(yy)srxubuUcurrency_symbolsry}rzU time_zonesr{}r|Uscriptsr}}r~ULatnrX ላቲንrsUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UJPYrXየጃፓን የንrUUSDrXየአሜሪካን ዶላርrURUBrXየራሻ ሩብልrUINRrXየሕንድ ሩፒrUCNYrX&የቻይና ዩአን ረንሚንቢrUETBrXየኢትዮጵያ ብርrUBRLrXየብራዚል ሪልrUGBPrX2የእንግሊዝ ፓውንድ ስተርሊንግrUEURrX አውሮruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXጠrKXከrKXመrKXአrKXግrKXሠrKXሐrKXነrK XከrK XጠrK XኀrK XኀrusUformatr}r(Uwider}r(KX ጠሐረrKX ከተተrKX መገበrKX አኀዘrKX ግንባትrKX ሠንየrKX ሐመለrKX ነሐሰrK X ከረመrK X ጠቀመrK X ኀደረrK X ኀሠሠruU abbreviatedr}r(KX ጠሐረrKX ከተተrKX መገበrKX አኀዘrKX ግንባrKX ሠንየrKX ሐመለrKX ነሐሰrK X ከረመrK X ጠቀመrK X ኀደረrK X ኀሠሠruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrjrUint_precrKKrh,X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXሰrKXሠrKXራrKXሐrKXዓrKXቀrKXእrusUformatr}r(Uwider}r(KX ሰኑይrKX ሠሉስrKX ራብዕrKX ሐሙስrKX ዓርበrKX ቀዳሚትrKX እኁድruU abbreviatedr}r(KX ሰኑይrKX ሠሉስrKX ራብዕrKX ሐሙስrKX ዓርበrKX ቀዳሚrKX እኁድruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXዓ/ዓrKXዓ/ምrusu.PK[&S_9 9 %site-packages/babel/localedata/dv.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X hh:mm:ss aqAUformatqBX%(hh)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X hh:mm:ss a vqGhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X hh:mm:ss a zqLhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xhh:mm aqQhBX%(hh)s:%(mm)s %(a)sqRubuU languagesqS}qTUdvqUXދިވެހިބަސްqVsU territoriesqW}qXUMVqYXދިވެހި ރާއްޖެqZsUdecimal_formatsq[}q\Nh )q]}q^(h#Nh$Kh%KKq_h'h/h/q`h*KKqah,X #,##,##0.###qbh.h/h0qch2Nh3KKqdubsU date_formatsqe}qf(Umediumqgh>)qh}qi(h,X dd-MM-yyyyqjhBX%(dd)s-%(MM)s-%(yyyy)sqkubUfullqlh>)qm}qn(h,XEEEE d MMMM yyyyqohBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)sqpubUlongqqh>)qr}qs(h,X d MMMM yyyyqthBX%(d)s %(MMMM)s %(yyyy)squubUshortqvh>)qw}qx(h,Xd-M-yyqyhBX%(d)s-%(M)s-%(yy)sqzubuUcurrency_symbolsq{}q|U time_zonesq}}q~Uscriptsq}qUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KhKhKhKhKhKhKhKhK hK X10qK X11qK X12quU abbreviatedq}q(KhKhKhKhKhKhKhKhK hK X10qK X11qK X12quuuUcurrency_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X¤ #,##,##0.00qh.X¤ qX-¤ qqh2Nh3KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KhKhKhKhKhKhKhuU abbreviatedq}q(KhKhKhKhKhKhKhuuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[D))(site-packages/babel/localedata/sr_YU.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/tt_RU.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK["ll-site-packages/babel/localedata/ha_Arab_SD.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[rQ(site-packages/babel/localedata/es_HN.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Ufullqcbabel.dates DateTimePattern q)q}q(UpatternqXEEEE dd 'de' MMMM 'de' yyyyqUformatqX'%(EEEE)s %(dd)s de %(MMMM)s de %(yyyy)sq ubUlongq!h)q"}q#(hXdd 'de' MMMM 'de' yyyyq$hX%(dd)s de %(MMMM)s de %(yyyy)sq%ubuUcurrency_symbolsq&}q'U time_zonesq(}q)Uscriptsq*}q+Uvariantsq,}q-Unumber_symbolsq.}q/(Udecimalq0X.q1Ugroupq2X,q3uUcurrency_namesq4}q5Umonthsq6}q7Ucurrency_formatsq8}q9Udaysq:}q;U meta_zonesq<}q=Uerasq>}q?u.PK[!7!7%site-packages/babel/localedata/cy.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX Chwarter 1afqKX 2il chwarterqKX 3ydd chwarterqKX 4ydd chwarterquU abbreviatedq}q(KXCh1qKXCh2qKXCh3qKXCh4quuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Upercent_formatsq&}q'U week_dataq(}q)(Umin_daysq*KU weekend_startq+KU first_dayq,KU weekend_endq-KuU time_formatsq.}q/(Umediumq0cbabel.dates DateTimePattern q1)q2}q3(Upatternq4X h:mm:ss aq5Uformatq6X%(h)s:%(mm)s:%(ss)s %(a)sq7ubUfullq8h1)q9}q:(h4X h:mm:ss a vq;h6X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq}q?(h4X h:mm:ss a zq@h6X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqAubUshortqBh1)qC}qD(h4Xh:mm aqEh6X%(h)s:%(mm)s %(a)sqFubuU languagesqG}qH(UguqIXGwjaratiqJUgdqKXGaeleg yr AlbanqLUgaqMX GwyddelegqNUgnqOXGuaraniqPUglqQXGalisegqRUlaqSXLladinqTUlnqUXLingalaqVUloqWXLaoegqXUtrqYXTwrcegqZUlvq[XLatfiegq\Ultq]X Lithwanegq^Utkq_X Tyrcmenegq`UthqaXTaiqbUtiqcXTigrinyaqdUteqeXTeluguqfUfilqgXTagalogqhUtaqiXTamilqjUyiqkXIddew-AlmaenegqlUdeqmXAlmaenegqnUdaqoXDanegqpUelqqXGroegqrUeoqsX EsperantoqtUenquXSaesnegqvUzhqwXTseineegqxUeuqyXBasgegqzUetq{XEstonegq|Uesq}XSbaenegq~UruqXRwsiegqUroqXRwmanegqUbnqXBengali; BanglaqUbeqX BelarwsiynqUbgqXBwlgaregqUukqXWcreinegqUjvqXJafanaegqUbhqXBihariqUbrqXLlydawegqUbsqXBosniegqUjaqX SiapaneegqUocqX OcsitanegqUundqXanhqUtwqXTwiqUtlhqXKlingonqUorqXOriyaqUxhqXXhosaqUcaqX CatalanegqUcyqXCymraegqUcsqXTsiecqUpsqXPashtoqUptqX PortiwgalegqUpaqXPwnjabiqUviqX FietnamegqUplqXPwylegqUhyqXArmenegqUhrqXCroategqUhuqXHwngaregqUhiqXHindiqUheqXHebraegqUuzqXWsbecegqUmlqX MalayalamqUmnqXMongolegqUmkqX MacedonegqUurqXUrduqUmtqXMaltesegqUmsqXMalaiqUmrqXMarathiqUugqXUighurqUafqX AffricanegqUswqXSwahiliqUisqXIslandegqUamqXAmharegqUitqXEidalegqUsvqXSwedegqUasqXAsamegqUarqXArabegqUkmqX CambodiegqUzuqXZwlwqUiaqX InterlinguaqUazqX AzerbaijaniqUieqX InterlingueqUidqX IndonesiegqUnlqX IseldiregqUnnqXNorwyeg (Nynorsk)qUnoqXNorwyegqUneqXNepaliqUfrqXFfrangegqUfyqXFfrisiegqUfaqXPersiegqUfiqXFfinegqUkyqXKyrgyzqUfoqXFfaroegqUkaqXGeorgegqUsrqXSerbegrUsqrXAlbanegrUkorXCorëegrUknrXKannadarUsurXSundanegrUstr XSesothegr Uskr XSlofacegr Usir XSinhalegrUshrX Serbo-CroategrUsorXSomalegrUkurXCwrdegrUslrXSlofenegrUsarXSansgritrUsdrXSindhiruU territoriesr}r(UBDrX BangladeshrUBErX Gwlad Belgr UBFr!X Burkina Fasor"UBGr#XBwlgariar$UVEr%X Venezuelar&UBAr'XBosnia a Herzegovinar(UBBr)XBarbadosr*UWFr+XWallis a Futunar,UBMr-XBermwdar.UBNr/XBruneir0UBOr1XBolifiar2UBHr3XBahrainr4UBIr5XBurundir6UBJr7XBeninr8UBTr9XBhwtanr:U011r;XGorllewin Affricar<UBVr=X Ynys Bouvetr>UBWr?XBotswanar@U014rAXDwyrain AffricarBU015rCXGogledd AffricarDUBRrEXBrasilrFU017rGX Canol AffricarHU018rIXDe Affrica [018]rJU019rKXAmericasrLUBYrMXBelarwsrNUBZrOXBelizerPULVrQXLatfiarRURWrSXRwandarTUTLrUX Timor-LesterVURErWXRéunionrXUTMrYX TyrcmenistanrZUTJr[X Tajicistanr\UROr]XRwmaniar^UTKr_XTokelaur`UGWraX Guinea-BissaurbUGUrcXGuamrdUGTreX GuatemalarfUGSrgX!Ynysoedd De Georgia a De SandwichrhUGRriX Gwlad GroegrjUGQrkXGini GyhydeddolrlUGPrmX GuadeloupernUJProXSiapanrpUGYrqXGuyanarrUGFrsXGiana FfrengigrtUGEruXGeorgiarvUGDrwXGrenadarxU021ryXGogledd AmericarzUGBr{X Prydain Fawrr|UGAr}XGabonr~USVrX El SalfadorrUGNrXGinirUGMrXGambiarUGLrX Yr Ynys LasrU029rX Y CaribîrUGIrX GibraltarrUGHrXGhanarUOMrXOmanrUTNrXTiwnisiarUJMrXJamaicarU013rXCanolbarth AmericarUWSrXSamoarUHRrXCroatiarUBSrX Y BahamasrUHTrXHaitirUHUrXHwngarirUHKrXHong Kong S.A.R., TseinarU039rXDe EwroprUHNrXHondwrasrUFIrX Y FfindirrU142rXAsiarU030rX Dwyrain AsiarU035rXDe ddwyrain AsiarUPRrX Puerto RicorUPSrXTiriogaeth PalesteinarU830rXYnysoedd y SianelrUFKrXYnysoedd y FalklandrUIOrX Tiriogaeth Cefnfor India PrydainrUPWrXPalaurUPTrX PortiwgalrUSJrXSvalbard a Jan MayenrUPYrXParaguayrUIQrXIracrUPArXPanamarUPFrXPolynesia FfraincrUPGrXPapua Gini NewyddrUPErXPerwrUPKrXPacistanrUPHrX PhilipinaurUFOrXYnysoedd FfaröerUPNrXPitcairnrUPLrX Gwlad PwylrUPMrXSaint Pierre a MiquelonrUZMrXSambiarUEHrXGorllewin SahararURUrXRwsiarUEErXEstoniarUEGrXYr AifftrUZArX De AffricarUECrXEcwadorrUITrXYr EidalrUVNrXFietnamrUSBrXYnysoedd SolomonrUETrXEthiopiarUSOrXSomaliarUZWrXSimbabwerUSArX Sawdi-ArabiarUESrXSbaenrUERrXEritrearUMDrXMoldofarUMGrX MadagascarrUMArXMorocorUMCrXMonacorUUZrX WsbecistanrUMMrXMyanmarrUMLrXMalirUMOrXMacao S.A.R., TseinarUMNrXMongoliarUHMrXYnys Heard ac Ynysoedd McDonaldrUASr XSamoa Americanaiddr UMKr X Macedoniar UMUr X MawrisiwsrUMTrXMaltarUMWrXMalawirUMVrXMaldivesrUMQrX MartiniquerUMPrXYnysoedd Gogledd MarianarUMSrX MontserratrUMRrX MawritaniarUIMrX Ynys ManawrUUGrXUgandar UTZr!X Tansanïar"UMYr#XMalaysiar$UMXr%XMecsicor&UILr'XIsraelr(UFRr)XFfraincr*UAWr+XArubar,UDOr-XY Weriniaeth Ddominicaiddr.USHr/X Saint Helenar0UVCr1XSaint Vincent a’r Grenadinesr2U054r3X Melanesiar4UDJr5XDjiboutir6UFJr7XFijir8U057r9XMicronesia [057]r:UFMr;X Micronesiar<U053r=XAwstralia a Seland Newyddr>UNIr?X Nicaragwar@UNLrAXYr IseldiroeddrBUNOrCXNorwyrDUNArEXNamibiarFUVUrGXVanuaturHUNCrIXCaledonia NewyddrJUNErKXNigerrLUNFrMX Ynys NorfolkrNUNGrOXNigeriarPUNZrQX Seland NewyddrRUNPrSXNepalrTUNRrUXNawrwrVUNUrWXNiuerXU061rYX PolynesiarZUCIr[XCôte d’Ivoirer\UCHr]X Y Swistirr^UCOr_XColombiar`UCNraXTseinarbUCMrcX Y CamerŵnrdUCLreXChilerfUCCrgXYnysoedd Cocos (Keeling)rhUCAriXCanadarjUCGrkXCongorlUCFrmXGweriniaeth Canol AffricarnUCDroX!Gweriniaeth Ddemocrataidd y CongorpUCZrqXGweriniaeth TsiecrrUCYrsXCyprusrtUCXruXYnys y NadoligrvUCRrwX Costa RicarxUCVryX Cape VerderzUCUr{XCiwbar|USZr}X Swazilandr~USYrXSyriarUKGrX CirgistanrUKErXCeniarUSRrXSwrinamrUKIrXKiribatirUKHrXCambodiarUKNrXSaint Kitts a NevisrUKMrXComorosrUSTrXSao Tome a PrinciperUSKrXSlofaciarUKRrXDe CorearUSIrXSlofeniarUKPrX Gogledd CorearUKWrXCoweitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KazakhstanrUKYrXYnysoedd CaymanrUSGrX SingaporerUSErXSwedenrUSDrXY SwdanrU151rX Dwyrain EwroprU150rXEwroprUDMrXDominicarU155rXGorllewin EwroprU154rX Gogledd EwroprUVGrXYnysoedd Prydeinig y WyryfrUDErX Yr AlmaenrUYErXYemenrUMHrXYnysoedd MarshallrU062rX De Canol AsiarUDZrXAlgeriarUUSrXYr Unol DaleithiaurUUYrXUruguayrUYTrXMayotterUUMrX)Mân Ynysoedd Pellenig yr Unol DaleithiaurULBrXLibanusrULCrX Saint LuciarULArXLaosrUTVrXTwfalwrUTWrXTaiwanrUTTrXTrinidad a ThobagorUTRrXTwrcirULKrX Sri LankarULIrX LiechtensteinrUCKrX Ynysoedd CookrUTOrXTongarULTrX LithwaniarULUrX LwcsembwrgrULRrXLiberiarULSrXLesothorUTHrX Gwlad ThairUTFrXTiriogaethau Ffrengig y DerUTGrXTogorUTDrXChadrUTCrXYnysoedd Turks a CaicosrULYrXLibiarUVArX Y FaticanrU145rXGorllewin AsiarUAErXEmiraethau Arabaidd UnedigrUADrXAndorrarUAGrXAntigwa a BarbudarUAFrX AffganistanrUAIrXAnguillarUVIrXYnysoedd Americanaidd y WyryfrUISrX Gwlad yr IârUIRrXIranrUAMr XArmeniar UALr XAlbaniar UAOr XAngolarUANrXYnysoedd Caribî yr IseldiroeddrUAQrX AntarcticarU002rXAffricarU001rXY BydrUARrX Yr ArianninrUAUrX AwstraliarUATrXAwstriarU005rX De AmericarUINrXIndiar UAXr!XYnysoedd Alandr"U009r#XOceaniar$UAZr%X Azerbaijanr&UIEr'XIwerddonr(UIDr)X Indonesiar*UJOr+X Yr Iorddonenr,UUAr-XWcráinr.UQAr/XQatarr0UDKr1XDenmarcr2UMZr3X Mozambiquer4UQOr5XYnysoedd Pellenig y Der6uUdecimal_formatsr7}r8U date_formatsr9}r:(Umediumr;h1)r<}r=(h4X d MMM yyyyr>h6X%(d)s %(MMM)s %(yyyy)sr?ubUfullr@h1)rA}rB(h4XEEEE, dd MMMM yyyyrCh6X"%(EEEE)s, %(dd)s %(MMMM)s %(yyyy)srDubUlongrEh1)rF}rG(h4X dd MMMM yyyyrHh6X%(dd)s %(MMMM)s %(yyyy)srIubUshortrJh1)rK}rL(h4X dd/MM/yyyyrMh6X%(dd)s/%(MM)s/%(yyyy)srNubuUcurrency_symbolsrO}rPUEURrQXEURrRsU time_zonesrS}rT(U Europe/LondonrU}rVUcityrWXLlundainrXsUAmerica/Mexico_CityrY}rZjWX Dinas Mecsicor[sUAmerica/St_Johnsr\}r]jWX St. John’sr^sUAntarctica/South_Poler_}r`jWX Pegwn y DerasUAmerica/New_Yorkrb}rcjWX Efrog NewyddrdsuUscriptsre}rfULatnrgXLladinrhsUvariantsri}rjUnumber_symbolsrk}rlUcurrency_namesrm}rn(UUSDroX Doler yr UDArpURUBrqX Rwbl RwsiarrUINRrsX Rwpî IndiartUCNYruXYuan Renminbi TseinarvUJPYrwX Yen SiapanrxUBRLryX Real BrasilrzUGBPr{XPunt Sterling Prydainr|jQXEwror}uUmonthsr~}r(U stand-aloner}r(Uwider}rKX GorffennafrsU abbreviatedr}r(KXChwerKXMawrKXEbrrKXGorruUnarrowr}r(KXIrKXCrKXMrKXErKjKjKXGrKXArK jK XHrK XTrK XRruuUformatr}r(Uwider}r(KXIonawrrKXChwefrorrKXMawrthrKXEbrillrKXMairKXMehefinrKX GorffenafrKXAwstrK XMedirK XHydrefrK XTachweddrK XRhagfyrruU abbreviatedr}r(KXIonrKXChwefrKXMawrthrKXEbrillrKXMairKXMehrKXGorffrKXAwstrK XMedirK XHydrK XTachrK XRhagruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrjrUint_precrKKrh4X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}r(U abbreviatedr}rKXGwersUnarrowr}r(KXLrKjKjKjKjKXSrKjuuUformatr}r(Uwider}r(KX Dydd LlunrKX Dydd MawrthrKX Dydd MercherrKXDydd IaurKX Dydd GwenerrKX Dydd SadwrnrKXDydd SulruU abbreviatedr}r(KXLlunrKXMawrKXMerrKXIaurKXGwenrKXSadrKXSulruuuU meta_zonesr}rUerasr}r(Uwider}r(KX Cyn CristrKX Oed CristruU abbreviatedr}r(KXCCrKXOCruUnarrowr}r(KjKXOruuu.PK[CԜԜ%site-packages/babel/localedata/ne.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX१q KX२q KX३qKX४qusUformatq}q(Uwideq}q(KXपहिलो सत्रqKXदोस्रो सत्रqKXतेस्रो सत्रqKXचौथो सत्रquU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quuuUperiodsq}q(Uamq X(पूर्व मध्यान्हq!Upmq"X(उत्तर मध्यान्हq#uUscientific_formatsq$}q%Upercent_formatsq&}q'U week_dataq(}q)(Umin_daysq*KU weekend_startq+KU first_dayq,KU weekend_endq-KuU time_formatsq.}q/(Umediumq0cbabel.dates DateTimePattern q1)q2}q3(Upatternq4XHH:mm:ssq5Uformatq6X%(HH)s:%(mm)s:%(ss)sq7ubUfullq8h1)q9}q:(h4X HH:mm:ss vq;h6X%(HH)s:%(mm)s:%(ss)s %(v)sq}q?(h4X HH:mm:ss zq@h6X%(HH)s:%(mm)s:%(ss)s %(z)sqAubUshortqBh1)qC}qD(h4XHH:mmqEh6X %(HH)s:%(mm)sqFubuU languagesqG}qH(UguqIXगुजरातीqJUgdqKX%स्कट्स गाएलिकqLUgaqMXआइरिशqNUglqOXगलिसियालीqPUlaqQXल्याटिनqRUlnqSXलिंगालाqTUloqUX लाओqVUtrqWXटर्कीqXUlvqYXलात्भियालीqZUltq[X!लिथुआनियालीq\Uthq]X थाईq^Utiq_Xतिग्रीन्याq`UteqaXतेलुगुqbUpt_PTqcX/आइबेरी, पर्तुगालीqdUfilqeXफिलिपिनीqfUtaqgXतामिलqhUyiqiXयिद्दिसqjUpt_BRqkXBपर्तुगाली (ब्राजिल्याली)qlUdeqmXजर्मनqnUdaqoXड्यानिशqpUelqqXग्रीकqrUeoqsX!एस्पेरान्तोqtUenquXअँग्रेजीqvUzhqwXचिनियाँqxUzh_HansqyX+सरलिकृत चिनियाँqzUzh_Hantq{X1परम्परागत चिनियाँq|Ueuq}Xबास्कq~UetqX!इस्टोनियालीqUesqXस्प्यानिशqUruqXरसियालीqUroqXरोमानियालीqUbnqXबंगालीqUbeqX$बेलारुसियालीqUbgqX$बुल्गेरियालीqUukqXयुक्रेनीqUjvqXजाभानिजqUbhqXबिहारीqUbsqXबोस्नियालीqUjaqXजापानीqUocqXअक्सिटनqUtlhqXक्लिङ्गनqUorqXओरियाqUxhqX झोसाqUcaqXक्याटालनqUcyqXवेल्शqUcsqX0चेकोस्लोभाकियालीqUpsqXपाश्तोqUptqXपोर्तुगालीqUpaqXपंजाबीqUviqXभियतनामीqUplqXपोलिशqUhrqX!क्रोएसियालीqUhuqXहंग्रीयालीqUhiqXहिन्दीqUheqXहिब्रुqUuzqXउज़्बेकqUmlqXमलयालमqUmnqXमंगोलqUmkqX$म्याकेडोनियनqUurqXउर्दुqUmtqXमाल्टिजqUmsqXमलायाqUmrqXमराठीqUafqXअफ्रिकालीqUkoqXकोरियालीqUisqX$आइसल्यान्डिकqUamqXअम्हारिकqUitqXइटालियनqUsvqXस्विडिशqUasqXआसामीqUarqX अरबीqUkmqX!कम्बोडीयालीqUzuqX जुलूqUiaqX'इन्टर्लिङ्गुआqUazqXअजरबैजानीqUieqXअन्तरभाषीqUidqX'इन्डोनेसियालीqUnlqXडचqUnoqX!नर्वेजियालीqUneqXनेपालीqUfrqXफ्रांसेलीqUfyqXफ्रिजीयनqUfaqXफारसीqUfiqXफिनिशqUfoqXफारोइजqUkaqXजोरजियनqUsrqXसर्बियालीqUsqqXअल्बेनियनqUswqXस्वाहिलीqUknqXकन्नाडाqUsuqXसुडानीqUskqX$स्लोभाकियालीrUsirXसिन्हालीrUsorXसोमालीrUkurXकुर्दिशrUslrX$स्लोभेनियालीrUsar Xसंस्कृतr uU territoriesr }r (UBDr Xबङ्गलादेशrUBErXबेल्जियमrUBFrX"बर्किना फासोrUBGrXबल्गेरियाrUVErXभेनेजुएलाrUBArXAबोस्निया र हर्जगोभिनियाrUBBrXबार्बाडोसrUWFrX&वालिस र फुटुनाrUBLrX.सेन्ट बार्थालेमीrUBMrXबर्मुडाr UBNr!Xब्रुनाइr"UBOr#Xबोलिभियाr$UBHr%Xबाह्रेनr&UBIr'Xबुरूण्डीr(UBJr)Xबेनिनr*UBTr+Xभुटानr,U011r-X+पश्चिमी अफ्रिकाr.UBVr/Xबुभेट टापुr0UBWr1Xबोट्स्वानाr2U014r3X(पूर्वी अफ्रिकाr4U015r5X(उत्तरी अफ्रिकाr6UBRr7Xब्राजिलr8U017r9X"मध्य अफ्रिकाr:U018r;X+दक्षिणी अफ्रिकाr<U019r=Xअमेरिकासr>UBYr?Xबेलारूसr@UBZrAXबेलिजrBULVrCXलाट्भियाrDURWrEXरवाण्डाrFURSrGXसर्बियाrHUTLrIX"पूर्वी टिमोरrJURErKXरियुनियनrLUTMrMX*तुर्कमेनिस्तानrNUOMrOX ओमनrPUTJrQX!ताजिकिस्तानrRUROrSXरोमानियाrTUTKrUX तोगोrVUGWrWXगिनी-बिसाउrXUGUrYXगुवामrZUGTr[Xग्वाटेमालाr\UGRr]Xग्रिशr^UGQr_X&भू-मध्यीय गिनीr`UGPraXग्वाडेलुपrbUJPrcXजापानrdUKIreXकिरिबाटीrfUGYrgXगुयानाrhUGGriXगुएर्नसेrjUGFrkX.फ्रान्सेली गायनाrlUGErmXजोर्जियाrnUGDroXग्रेनाडाrpU021rqX(उत्तरी अमेरिकाrrUGBrsX.संयुक्त अधिराज्यrtUGAruXगावोनrvUSVrwX%एल् साल्भाडोरrxUGNryX गिनीrzUGMr{Xगाम्वियाr|UGLr}X$ग्रिनल्याण्डr~U029rXक्यारिबिएनrUGIrX!जिब्राल्टारrUGHrX घानाrUJErXजर्सीrUTNrXटुनिसियाrUJMrXजमाइकाrU013rX1केन्द्रीय अमेरिकाrUWSrXसामोआrU419rXTल्याटिन अमेरिका तथा क्यारिबियनrUHRrXक्रोएशियाrUBSrXबहामासrUHTrX हैटीrUHUrXहङ्गेरीrUHKrXjहङकङ चिनिँया समाजवादी स्वायत्त क्षेत्रrU039rX%दक्षिणी युरोपrUHNrXहन्डुरासrUFIrX!फिन्ल्याण्डrU142rXएशियाrU030rX"पूर्वी एशियाrU034rX%दक्षिणी एशियाrU035rX5दक्षिण पूर्वी एशियाrUPRrX$प्युर्टोरिकोrUPSrX2प्यालेस्टनी भू-भागrUFKrX(फकल्याण्ड टापुrUIOrXQबेलायती हिन्द महासागर क्षेत्रrUPWrX पलाउrUPTrXपोर्तुगलrUSJrX<सभाल्बार्ड र जान मायेनrUMDrXमाल्डोभाrUFMrX'माइक्रोनेसियाrUIQrX इराकrUPArXपनामाrUPFrX=फ्रान्सेली पोलिनेसियाrUPGrX/पपुआ न्यू गाइनियाrUPErX पेरूrUPKrXपाकिस्तानrUPHrXफिलिपिन्सrUFOrXफारोर टापुrUPNrXपिटकाइर्नrUPLrXपोल्याण्डrUPMrXBसेन्ट पिर्रे र मिक्केलोनrUZMrXजाम्बियाrUEHrX(पश्चिमी साहाराrURUrX रूसrUEErXइस्टोनियाrUEGrXइजिप्टrUZArX(दक्षिण अफ्रिकाrUECrXइक्वडेरrUITrXइटालीrUVNrXभिएतनामrUZZrX?अपरिचित वा अवैध क्षेत्रrUSBrX"सोलोमोन टापुrUETrXइथोपियाrUSOrXसोमालियाrUZWrXजिम्बाबेrUSArXसाउदी अरबrUESrXस्पेनrUERrXएरित्रियाrUMErX$मोन्टेनेग्रोrUAQrXअन्टारतिकाrUMGrXमडागास्करrUMFrX%सेन्ट मार्टिनrUMArXमोरोक्कोrUMCrXमोनाकोrUUZrX$उज्बेकिस्तानrUMMrXम्यान्मारrUMLrX मालीrUMOrXTमकावो चिनिँया स्वशासित क्षेत्रrUMNrXमङ्गोलियाrUHMr XOहर्ड टापु र म्याकडोनाल्ड टापुr UASr X"अमेरिकी समोआr UMKr X$म्याकेडोनियाrUMUrXमाउरिटसrUMTrXमाल्टाrUMWrXमालावीrUMVrXमाल्दिभ्सrUMQrXमार्टिनिकrUMPrX5उत्तरी मारिआना टापुrUMSrX$मोन्टसेर्राटrUMRrX!माउरिटानियाrUIMrX,आइज्ले अफ् म्यानr UUGr!Xयुगाण्डाr"UTZr#Xतान्जानियाr$UMYr%Xमलेसियाr&UMXr'Xमेक्सिकोr(UILr)Xइज्रायलr*UFRr+Xफ्रान्सr,UAWr-Xआरूबाr.UDOr/X1डोमिनिकन गणतन्त्रr0USHr1X"सेन्ट हेलेनाr2UVCr3XQसेन्ट भिन्सेन्ट र ग्रेनाडिन्सr4U054r5Xमेलानेसियाr6UDJr7Xडिजिबुटीr8UFJr9X फिजीr:U057r;XCमाइक्रोनेसियाली क्षेत्रr<U172r=XSकमनवेल्थका स्वतन्त्र राज्यहरूr>U053r?XMअष्ट्रेलिया र न्युजिल्याण्डr@UNIrAXनिकारागुवाrBUNLrCX'नेदरल्याण्ड्सrDUNOrEXनर्वेrFUNArGXनामिबियाrHUVUrIXभानुआतुrJUNCrKX+नयाँ कालेडोनियाrLUNErMXनाइजरrNUNFrOX%नोरफोल्क टापुrPUNGrQXनाइजेरियाrRUNZrSX'न्युजिल्याण्डrTUNPrUXनेपालrVUNRrWXनाउरूrXUNUrYXनियुइrZU061r[Xपोलिनेशियाr\UCIr]X"आइभोरी कोष्टr^UCHr_X'स्विजरल्याण्डr`UCOraXकोलोम्बियाrbUCNrcX चीनrdUCMreXक्यामेरूनrfUCLrgX चिलीrhUCCriXकोकोस टापुrjUCArkXक्यानाडाrlUCGrmX?कोङ्गो - ब्राज्जाभिल्लेrnUCFroXJकेन्द्रीय अफ्रिकी गणतन्त्रrpUCDrqX+कोङ्गो-किन्शासाrrUCZrsX"चेख गणतन्त्रrtUCYruXसाइप्रसrvUCXrwX(क्रिष्टमस टापुrxUCRryXकोष्टारिकाrzUPYr{Xप्यारागुयेr|UCVr}Xकेप भर्डेr~UCUrXक्युबाrUSZrX'स्वाजिल्याण्डrUSYrXसिरियाrUKGrX!किर्गिस्थानrUKErXकेन्याrUSRrXसुरिनेमrU143rX+केन्द्रीय एशियाrUKHrXकम्बोडियाrUKNrX3सेन्ट किट्स र नेभिसrUKMrXकोमोरोसrUSTrX6साओ टोमे र प्रिन्सिपrUSKrXस्लोभाकियाrUKRrX%दक्षिण कोरियाrUSIrXस्लोभेनियाrUKPrX"उत्तर कोरियाrUKWrXकुवेतrUSNrXसेनेगालrUSMrXसान् मारिनोrUSLrX"सिएर्रा लिओनrUSCrXसेचेलेसrUKZrXकाजाकस्थानrUKYrXकेयमान टापुrUSGrXसिङ्गापुरrUSErXस्विडेनrUSDrXसुडानrU151rX"पूर्वी युरोपrU150rXयुरोपrUDMrXडोमिनिकाrU155rX%पश्चिमी युरोपrU154rX"उत्तरी युरोपrUVGrX5बेलायती भर्जिन टापुrUDErXजर्मनीrUYErXयेमेनrUMHrXमार्शल टापुrU062rX/दक्षिण मध्य एशियाrUDZrXअल्जेरियाrUUSrX%संयुक्त राज्यrUUYrXयुरूगुएrUYTrXमायोट्टrUUMrXOसंयुक्त राज्य अल्प बाह्य टापुrULBrXलेबनोनrULCrX"सेन्ट लुसियाrULArX लाओसrUTVrXतुभालुrUTWrXताइवानrUTTrX2त्रिनिडाड र तोबागोrUTRrXटर्कीrULKrXश्रीलङ्काrULIrX*लिएखटेन्स्टाइनrUCKrXकुक टापुrUTOrXटोंगाrULTrXलिथुअनियाrULUrXलक्जेमबर्गrULRrXलाइबेरियाrULSrXलेसोथोrUTHrXथाइल्याण्डrUTFrXJफ्रान्सेली दक्षिणी क्षेत्रrUTGrX टोगोrUTDrX चाडrUTCrX3तुर्क र काइकोस टापुrULYrXलिबियाrUVArXभेटिकनrU145rX%पश्चिमी एशियाrUAErX8संयुक्त अरब इमिराट्सrUADrXअन्डोर्राrUAGrX2एन्टिगुआ र बारबुडाrUAFrX$अफ्गानिष्तानrUAIrXआङ्गुइलाrUVIrXEसंयुक्त राज्य भर्जिन टापुrUISr X!आइस्ल्याण्डr UIRr X इरानr UAMr Xआर्मेनियाrUALrXअल्बानियाrUAOrXअङ्गोलाrUANrX@नेदरल्याण्ड्स एण्टिलिसrU003rX%उत्तर अमेरिकाrU002rXअफ्रिकाrU001rXविश्वrUARrX!अर्जेण्टिनाrUAUrX!अष्ट्रेलियाrUATrXअष्ट्रियाr U005r!X(दक्षिण अमेरिकाr"UINr#X भारतr$UAXr%Xअलान्ड टापुr&U009r'Xओसनियाr(UAZr)Xअजरबैजानr*UIEr+Xआइरल्याण्डr,UIDr-X!इन्डोनेशियाr.UJOr/Xजोर्डनr0UQUr1X+युरोपियन युनियनr2UUAr3Xयुक्रेनr4UQAr5X कटारr6UDKr7Xडेन्मार्कr8UMZr9Xमोजाम्बिकr:UQOr;X"बाह्य ओसनियाr<uUdecimal_formatsr=}r>U date_formatsr?}r@(UmediumrAh1)rB}rC(h4X yyyy MMM drDh6X%(yyyy)s %(MMM)s %(d)srEubUfullrFh1)rG}rH(h4XEEEE, yyyy MMMM ddrIh6X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srJubUlongrKh1)rL}rM(h4X yyyy MMMM drNh6X%(yyyy)s %(MMMM)s %(d)srOubUshortrPh1)rQ}rR(h4Xyy/MM/ddrSh6X%(yy)s/%(MM)s/%(dd)srTubuUcurrency_symbolsrU}rVU time_zonesrW}rX(UAtlantic/CanaryrY}rZUcityr[Xक्यानारीr\sUAntarctica/Mawsonr]}r^j[X माजनr_sUAmerica/Buenos_Airesr`}raj[X"ब्यनेश आयर्सrbsUAustralia/Melbournerc}rdj[Xमेल्बर्नresU Pacific/Wakerf}rgj[X वेकrhsUAmerica/Nipigonri}rjj[XनिपिगनrksUAmerica/Louisvillerl}rmj[Xलुइसभिल्लेrnsUAmerica/Indiana/Tell_Cityro}rpj[X3टेल सिटी, इन्डियानाrqsUAustralia/Darwinrr}rsj[Xडार्विनrtsUAmerica/Whitehorseru}rvj[Xह्वाइटहर्सrwsUAntarctica/Davisrx}ryj[XडेभिसrzsUAmerica/Coral_Harbourr{}r|j[X+कोराल बन्दरगाहाr}sUAmerica/Swift_Currentr~}rj[X(स्विफ्ट करेण्टrsU Europe/Samarar}rj[XसामाराrsUEurope/Simferopolr}rj[X!सिम्फेरोपोलrsUAmerica/Maceior}rj[XमासेइओrsU Asia/Magadanr}rj[XमागाडानrsUEurope/Zaporozhyer}rj[Xजापोरोझ्येrsU Asia/Kashgarr}rj[Xकाश्गरrsUAmerica/Detroitr}rj[Xडिट्रोइटrsU Asia/Kuchingr}rj[XकुचिङrsU Asia/Urumqir}rj[Xउरूम्कीrsU Europe/Moscowr}rj[Xमस्कोrsUAmerica/Indiana/Knoxr}rj[X,नोक्स, इण्डियानाrsUAmerica/Indiana/Petersburgr}rj[X;पिटर्सबर्ग, इन्डियानाrsUPacific/Kiritimatir}rj[XकिरितिमाटीrsUAsia/Pontianakr}rj[Xपोन्टिआनाकrsUAsia/Ulaanbaatarr}rj[XउलानबटारrsUAmerica/Rainy_Riverr}rj[XरेनिरिभरrsUAmerica/Argentina/San_Luisr}rj[Xसान लुइसrsUAntarctica/Rotherar}rj[XरोथेराrsUAustralia/Adelaider}rj[XएडेलेडrsUAmerica/Indianapolisr}rj[X*इण्डियानापोलिसrsUAmerica/Reginar}rj[XरेजिनाrsU Pacific/Trukr}rj[Xट्रुकrsUAmerica/Cambridge_Bayr}rj[X(क्याम्ब्रिज बेrsUAmerica/Mexico_Cityr}rj[X%मेक्सिको सिटीrsU America/Boiser}rj[X बोइजrsUPacific/Chathamr}rj[XचाथामrsUPacific/Midwayr}rj[XमिडवेrsU America/Jujuyr}rj[X जुजुrsUAmerica/Cordobar}rj[XकोरडोवाrsU America/Belemr}rj[XबेलेमrsU Asia/Harbinr}rj[Xहार्विनrsUAustralia/Lord_Hower}rj[Xलर्ड होवेrsUAmerica/Argentina/San_Juanr}rj[Xसान जुवानrsUPacific/Kosraer}rj[Xकोस्राएrsUAmerica/North_Dakota/New_Salemr}rj[X@नयाँ सालेम, उत्तर डाकोटाrsUAmerica/Monterreyr}rj[Xमोन्टेर्रेrsUAsia/Krasnoyarskr}rj[X-क्रास्नोयार्स्कrsUAmerica/Boa_Vistar}rj[Xबोआ भिष्टाrsUAsia/Yekaterinburgr}rj[X!एकटरिनबुर्गrsUAustralia/Currier}rj[Xक्युरीrsUAntarctica/Caseyr}rj[X केजेrsUPacific/Honolulur}rj[XहोनोलुलुrsUPacific/Enderburyr}rj[Xएन्डरबरीrsU America/Thuler}rj[X थुलेrsUAmerica/St_Johnsr}rj[Xसेन्ट जोन्सrsUAmerica/Monctonr}r j[Xमोन्कटनr sUPacific/Majuror }r j[Xमाजुरोr sUAmerica/Mazatlanr}rj[Xमाजाट्लानrsUAsia/Choibalsanr}rj[Xचोइबाल्सानrsUAmerica/Blanc-Sablonr}rj[X+ब्लान्क-साब्लोनrsU Europe/Kievr}rj[X किभrsUAntarctica/Syowar}rj[X सिओआrsUAmerica/Halifaxr}rj[Xहालेफाक्सrsUAntarctica/McMurdor }r!j[Xमाकमुर्डोr"sU Asia/Hovdr#}r$j[Xहोभ्डr%sUAmerica/Danmarkshavnr&}r'j[X'डान्मार्कशाभनr(sUAmerica/Thunder_Bayr)}r*j[Xथण्डर बेr+sUAmerica/Scoresbysundr,}r-j[X*स्कोर्सबाइसन्डr.sUAmerica/Eiruneper/}r0j[Xआइरनेपेr1sUAmerica/Manausr2}r3j[Xमानाउसr4sUAmerica/Los_Angelesr5}r6j[Xलस् एन्जेलसr7sUAmerica/Noronhar8}r9j[Xनोरोन्हाr:sUAmerica/Goose_Bayr;}r<j[Xगुज बेr=sUAmerica/Catamarcar>}r?j[Xकातामार्काr@sUAmerica/ChihuahuarA}rBj[XचिहुआहुआrCsUAmerica/Argentina/Rio_GallegosrD}rEj[X(रियो ग्यालेगोसrFsUPacific/GambierrG}rHj[Xग्याम्बियरrIsUAmerica/VancouverrJ}rKj[Xभ्यानकोभरrLsUEurope/VolgogradrM}rNj[X!भोल्गोग्रादrOsUEurope/UzhgorodrP}rQj[XउझगोरदrRsUPacific/PonaperS}rTj[XपोनापेrUsU Asia/AqtaurV}rWj[Xआक्टाउrXsUAmerica/Sao_PaulorY}rZj[Xसाओ पाउलोr[sUAmerica/Edmontonr\}r]j[Xएड्मोन्टनr^sUAustralia/Perthr_}r`j[X पर्थrasUAmerica/Mendozarb}rcj[Xमेन्डोजाrdsUAmerica/Meridare}rfj[XमेरिडाrgsUPacific/Easterrh}rij[Xइस्टरrjsU Asia/Jakartark}rlj[Xजाकार्ताrmsUAntarctica/Palmerrn}roj[Xपाल्मेरrpsUAustralia/Sydneyrq}rrj[Xसिड्नीrssUAtlantic/Madeirart}ruj[XमाडेइराrvsU Asia/Oralrw}rxj[X ओरलrysUAmerica/Campo_Granderz}r{j[X1क्याम्पो ग्रान्डेr|sUAmerica/Dawson_Creekr}}r~j[Xडेजन क्रिकrsUAfrica/Kinshasar}rj[Xकिन्शासाrsUAntarctica/Vostokr}rj[Xभास्टोकrsUAustralia/Lindemanr}rj[X!लिन्डेम्यानrsUAmerica/Porto_Velhor}rj[X%पोर्टो भेल्होrsUAmerica/Argentina/Ushuaiar}rj[XउशुआइआrsUPacific/Galapagosr}rj[XगलापागोसrsUAmerica/Indiana/Marengor}rj[X5मारेन्गो, इन्डियानाrsU Africa/Ceutar}rj[XसेउटाrsUAmerica/Winnipegr}rj[Xविन्निपेगrsUAmerica/Dawsonr}rj[X डेजनrsUAustralia/Brisbaner}rj[Xब्रिस्बेनrsU Asia/Aqtober}rj[Xआक्टोबrsUAmerica/Recifer}rj[XरिसाइफrsU Asia/Sakhalinr}rj[XसाखालिनrsUPacific/Kwajaleinr}rj[Xक्वाजालेइनrsUAmerica/Fortalezar}rj[Xफोर्टालेजाrsUAustralia/Broken_Hillr}rj[Xब्रोकन हिलrsUAmerica/Phoenixr}rj[Xफोनिक्सrsUAmerica/Cuiabar}rj[Xक्युइआबाrsUAmerica/Kentucky/Monticellor}rj[X:मोन्टिसेल्लो,केन्टकीrsUPacific/Tarawar}rj[X तरवाrsUAmerica/Yellowknifer}rj[Xयेल्लोनाइफrsUAmerica/Rio_Brancor}rj[X%रियो ब्रान्कोrsUAmerica/Cancunr}rj[XकानकुनrsUAsia/Vladivostokr}rj[X'भ्लाडिभास्टोकrsUPacific/Johnstonr}rj[Xजोन्सटनrsUEurope/Kaliningradr}rj[X$कालिनिनग्रादrsU Asia/Makassarr}rj[Xमाकास्सारrsUAsia/Qyzylordar}rj[Xकिजिलोर्डाrsUAmerica/Argentina/Tucumanr}rj[XटुकुमानrsUAtlantic/Azoresr}rj[Xआजोर्सrsUAsia/Chongqingr}rj[XचोङकिङrsUAustralia/Euclar}rj[Xइयुक्लाrsUAmerica/Chicagor}rj[XचिकागोrsUAmerica/Rankin_Inletr}rj[X(रान्किन इन्लेटrsUAmerica/Iqaluitr}rj[Xइक्वालुइटrsU Asia/Irkutskr}rj[Xइर्कुत्स्कrsUAsia/Samarkandr}rj[Xसमारकण्डrsUAmerica/Menomineer}rj[XमेनोमिनीrsUAmerica/Denverr}rj[Xडेन्भरrsUAsia/Kamchatkar}rj[Xकामचट्काrsUAmerica/Glace_Bayr}rj[Xग्लेस बेrsU Asia/Jayapurar}rj[XजयापुराrsUAmerica/Hermosillor}rj[X$हेर्मोसिल्लोrsUAmerica/North_Dakota/Centerr}rj[X9उत्तर डाकोटा, केन्द्रrsUAmerica/Pangnirtungr}rj[Xपाङ्निरतुङr sUAmerica/Resoluter }r j[Xरिजोलुटr sUAmerica/Indiana/Vevayr }rj[X)भेभे, इन्डियानाrsU Asia/Yakutskr}rj[Xयाकुत्स्कrsUAmerica/Shiprockr}rj[XशिपरकrsUAmerica/Tijuanar}rj[XतिजुआनाrsU America/Adakr}rj[X आडाकrsUAntarctica/DumontDUrviller}rj[X8दुमोन्ट डि उर्भेल्लेrsUAmerica/Indiana/Vincennesr}r j[Xभिन्सेन्सr!sU Asia/Almatyr"}r#j[Xआल्माटीr$sUAmerica/Argentina/La_Riojar%}r&j[Xला रियोजाr'sUAsia/Novosibirskr(}r)j[X'नोबोसिबिर्स्कr*sUAmerica/Indiana/Winamacr+}r,j[X2विनामाक, इन्डियानाr-sUAfrica/Lubumbashir.}r/j[Xलुबुम्बासीr0sUPacific/Marquesasr1}r2j[Xमार्केसासr3sU Asia/Anadyrr4}r5j[Xआनाडियरr6sUAmerica/New_Yorkr7}r8j[Xन्युयोर्कr9sU America/Nomer:}r;j[X नोमेr<sUAmerica/Yakutatr=}r>j[Xयाकुतातr?sUAustralia/Hobartr@}rAj[Xहोभार्टrBsUAmerica/JuneaurC}rDj[XजुनिउrEsUAmerica/InuvikrF}rGj[XइनुभिकrHsUAmerica/AraguainarI}rJj[XआरागुवानाrKsUAmerica/MontrealrL}rMj[Xमोन्ट्रिलrNsUAmerica/TorontorO}rPj[Xटोरोण्टोrQsU Etc/UnknownrR}rSj[Xअज्ञातrTsU America/BahiarU}rVj[XबाहियाrWsU Asia/OmskrX}rYj[Xओम्स्कrZsUAntarctica/South_Poler[}r\j[Xदक्षिण पोलr]suUscriptsr^}r_(UZsymr`X जसमraUGururbXगुरूमुखीrcUHebrrdXहिब्रुreUZzzzrfX6अपरिचित वा अवैध लिपीrgUPhnxrhXफोनिसियनriUMoonrjX जूनrkUSamrrlXसमारिटनrmUChamrnX चामroUArabrpX अरबrqUGujrrrXगुजरातीrsUZxxxrtXअलिखितruULycirvXलाइसियनrwUSinhrxXसिन्हालाryUTalurzX न्यू टाइ लुइr{UMongr|Xमङ्गोलr}UXpeor~X(पुरानो पर्सियनrUVisprX"दृश्यमय वाणीrURjngrXरेजाङrUOlckrXओलचिकीrUTalerXटाइलेrUMandrXमान्डाएनrUManirXमानिकाएनrUMlymrXमलायालमrUTibtrXटिबेटनrUKalirXकायाहलीrUJpanrXजापानीrUPlrdrX1पोल्लार्ड फोनेटिकrUKanarXकाताकानाrULydirXलाइडियनrUSundrXसुडानीrUYiiirXयीrUJavarXजाभानीrUOryarXओरियाrULaoorX लाओrUUgarrXयुगारिटिकrUCyrlrXसिरिलिकrUVaiirX भाइrUArmnrXआर्मेनियनrUKhmrrX खमेरrUArmirXआर्मीrUSylorX+स्ल्योटी नाग्रीrUItalrX%पुरानो इटालिकrUSgnwrXसाइनराइटिङrUThaarX थानाrUThairX थाईrUCprtrXकप्रियटrULepcrXलेप्चाrUOsmarXओस्मान्याrUSaurrXसौराष्ट्रrUHirarXहिरागानाrUHanirX हानrUEgydrX1इजिप्टियन डेमोटिकrUQaairXइन्हेरिटेडrUEgyhrX1इजिप्टियन हाइरटिकrUEgyprX@इजिप्टियन हाइरोग्लिफ्सrUZmthrX जमथrUTfngrXटिफिनाघrUShawrXशाभियनrUCirtrXकिर्थrUGeorrXग्रुजियालीrUTengrXटेङ्वारrUHrktrX8काताकाना वा हिरागानाrUGeokrX7ग्रुजियाली खुट्सुरीrUTavtrXटाभ्टrUOgamrX ओघामrUDsrtrXडेसेरेटrUGothrXगोथिकrUHanorXहानुनुrUBalirX बालीrUKorerXकोरियनrUHangrXहान्गुलrUCarirXकारियनrUAvstrXआभेस्टानrUTagbrXटाग्वान्वाrUHansrXसरलिकृत हानrUHantrX%परम्परागत हानrURororX$रोङ्गोरोङ्गोrUDevarXदेवानगरीrUIndsrXइन्दुसrUBoporXबोपोमोफोrUMymrrXम्यान्मारrUTglgrXटागालोगrUPermrX%पुरानो पर्मिकrUBugirXबुगिनिजrUPhagrXफाग्स-पाr UBrair Xब्रेलr UBrahr Xब्राह्मीr UBatkrX बाटकrUMerorXमेरियोटिकrULimbrXलिम्बुrUMteirX"माइटेइ मायेकrUPhlirX फ्लिrUTelurXटेलेगुrUTamlrXतामिलrUSararXसारतीrUPhlprXफ्ल्पrULatgr X+ग्यालिक ल्याटिनr!ULatfr"X1फ्राक्टुर ल्याटिनr#UKharr$Xखारोस्थितिr%UNkoor&Xएन्कोr'UPhlvr(Xबुक पहल्भीr)ULatnr*Xल्याटिनr+UMayar,X1माया हाइरोग्लिफ्सr-ULanar.Xलान्नाr/UEthir0Xइथियोपिकr1UKthir2X क्थीr3UHmngr4X"पहावह हमोङ्गr5UBuhdr6Xबुहिदr7UCoptr8Xकप्टिकr9UPrtir:Xपिआरटीr;UGlagr<X!ग्लागोलिटिकr=URunrr>Xरूनिकr?UOrkhr@Xओर्खोनrAUCakmrBXकाक्म्rCUHungrDX4पुरानो हङ्गेरियालीrEUGrekrFXग्रीकrGUCherrHXचेरोकीrIUZyyyrJX साझाrKUSyrcrLXसिरियाकrMUBlisrNX*ब्लिजसिम्बोल्सrOUBengrPXबङ्गालीrQUSyrerRX:इस्ट्रेनजेलो सिरियाकrSUSyrjrTX+पश्चिमी सिरियाकrUUSyrnrVX(पूर्वी सिरियाकrWUKndarXXकान्नाडाrYuUvariantsrZ}r[(UAREVELAr\X4पूर्वी आर्मेनियालीr]UPOSIXr^Xकम्प्युटरr_uUnumber_symbolsr`}raUcurrency_namesrb}rc(UALLrdX%अल्बानियन लेकreUPHPrfX%फिलिपिनी पेसोrgUAUDrhX+अष्ट्रेलियन डलरriUNOKrjX1नर्वेजियाली क्रोनrkURUBrlXरूसी रूबलrmUXXXrnX<अपरिचित वा अवैध मुद्राroUAFNrpXअफ्गानीrqUINRrrX%भारती रूपिँयाrsUAFArtX0अफ्गानी(१९२७-२००२)ruUJPYrvXजापानी येनrwUBRLrxX+ब्राजिलियन रियलryUGBPrzXAबेलायती पाउण्ड स्टर्लिङr{UCNYr|X5चिनिँया युआन रेनिबीr}UUSDr~X/संयुक्त राज्य डलरrUEURrX युरोruUmonthsr}r(U stand-aloner}rUnarrowr}r(KX१rKX२rKX३rKX४rKX५rKX६rKX७rKX८rK X९rK X१०rK X११rK X१२rusUformatr}r(Uwider}r(KXजनवरीrKXफेब्रुअरीrKXमार्चrKXअप्रिलrKXमेrKX जुनrKXजुलाईrKXअगस्तrK Xसेप्टेम्बरrK Xअक्टोबरrK Xनोभेम्बरrK Xडिसेम्बरruU abbreviatedr}r(KXजनrKX फेबrKXमार्चrKXअप्रिrKXमेrKX जुनrKX जुलाrKXअगrK Xसेप्टrK Xअक्टोrK X नोभेrK X डिसेruuuUcurrency_formatsr}rUdaysr}r(U stand-aloner}rUnarrowr}r(KX२rKX३rKX४rKX५rKX६rKX७rKX१rusUformatr}r(Uwider}r(KXसोमबारrKXमङ्गलबारrKXबुधबारrKXबिहीबारrKXशुक्रबारrKXशनिबारrKXआइतबारruU abbreviatedr}r(KX सोमrKXमङ्गलrKX बुधrKX बिहीrKXशुक्रrKX शनिrKX आइतruuuU meta_zonesr}rUAfrica_Centralr}r(UcommonrUlongr}r(UgenericrX3१३:२५ मोजाम्बिक समयrUstandardrXI१३:२५ केन्द्रीय अफ्रिकी समयruusUerasr}r(Uwider}r(KXईसा पूर्वrKX सन्ruU abbreviatedr}r(KXईसा पूर्वrKX सन्ruuu.PK[_.ll-site-packages/babel/localedata/uz_Cyrl_UZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[˟HH(site-packages/babel/localedata/el_CY.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqUpatternqX ¤#,##0.00q Uprefixq!X¤q"X-¤q#q$Uexp_plusq%NUgroupingq&KKq'ubsU languagesq(}q)U territoriesq*}q+U time_zonesq,}q-Uscriptsq.}q/Udecimal_formatsq0}q1U meta_zonesq2}q3Uvariantsq4}q5Ucurrency_namesq6}q7u.PK[%site-packages/babel/localedata/es.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX 1er trimestreqKX 2º trimestreqKX 3er trimestreqKX 4º trimestrequU abbreviatedq}q(KXT1qKXT2qKXT3qKXT4quuuUperiodsq}q(Uamq Xa.m.q!Upmq"Xp.m.q#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XHH:mm:ssqRUformatqSX%(HH)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X hh:mm:ss a vqXhSX %(hh)s:%(mm)s:%(ss)s %(a)s %(v)sqYubUlongqZhO)q[}q\(h3X HH:mm:ss zq]hSX%(HH)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XHH:mmqbhSX %(HH)s:%(mm)sqcubuU languagesqd}qe(UgvqfXgaélico manésqgUguqhXgujaratiqiUscnqjX sicilianoqkUromqlXromaníqmUalgqnXlenguas algonquinasqoUaleqpX aleutianoqqUscoqrXescocésqsUmniqtXmanipuriquUgdqvXgaélico escocésqwUgaqxX irlandésqyUmnoqzXlenguas manoboq{Uosaq|Xosageq}Ugnq~XguaraníqUaltqXaltái meridionalqUglqXgallegoqUmwrqXmarwariqUtyqX tahitianoqUtwqXtwiqUttqXtártaroqUtrqXturcoqUtsqXtsongaqUtnqX setchwanaqUtoqXtonganoqUausqXlenguas australianasqUavqXavarqUtkqX turcomanoqUthqX tailandésqUroaqXlengua romanceqUtgqXtayikoqUteqXteluguqUugaqX ugaríticoqUmwlqX mirandésqUkcgqXtyapqUsmiqX lengua samiqUfatqXfantiqUfanqXfangqUwoqXuolofqUrmqXretorrománicoqUdinqXdinkaqUblaqXsiksikaqUcmcqXlenguas chámicasqUmlqX malayalamqUzhqXchinoqUtemqXtemneqUen_CAqXinglés canadienseqUnwcqXnewari clásicoqUzaqXzhuangqUcauqXlengua caucásicaqUzuqXzulúqUterqXterenoqUtetqXtetúnqUmncqXmanchúqUkutqXkutenaiqUsukqXsukumaqUkumqXkumykqUsusqXsusuqUnewqXnewariqUsuxqXsumerioqUdenqXslave (atabasca)qUmenqXmendeqUmulqXlenguas múltiplesqUlezqXlezgianoqUrootqXraízqUekaqXekajukqUakkqXacadioqUdraqXlengua dravídicaqUjrbqX judeo-árabeqUsgnqXlenguajes de signosqUsgaqXirlandés antiguoqUapaqXlenguas apacheqUbraqXbrajqUchbqXchibchaqUchgqX chagatáiqUchkqXtrukésqUchmqXmaríqUchnqX jerga chinukqUchoqXchoctawqUchprX chipewyanrUchrrXcherokeerUchyrXcheyenerUtirXtigriñarUvotrXvóticor Umgr Xmalgacher Uibar Xibanr UmorXmoldavorUmnrXmongolrUmirXmaorírUmhrX marshalésrUmkrX macedoniorUmtrXmaltésrUcairXlengua india centroamericanarUdelrXdelawarerUmsrXmalayorUmrr Xmarathir!Utar"Xtamilr#Umyr$Xbirmanor%Ucadr&Xcaddor'Usrnr(X sranan tongor)Utair*X lengua tair+Uafhr,Xafrihilir-Usitr.Xlengua sino-tibetanar/Uenmr0Xinglés medievalr1Uen_AUr2Xinglés australianor3Unynr4Xnyankoler5Unyor6Xnyoror7Unymr8Xnyamwezir9Usior:X lenguas siouxr;Umapr<Xlengua austronesiar=Umasr>Xmasair?Ulahr@XlahndarAUladrBXladinorCUfyrDXfrisónrEUsnkrFXsoninkérGUfarHXpersarIUmadrJXmadurésrKUmagrLXmagahirMUmairNXmaithilirOUfirPXfinésrQUfjrRXfidjianorSUmanrTXmandingorUUegyrVXegipcio antiguorWUzndrXXzanderYUssrZXsiswatir[Usrr\Xserbior]Usqr^Xalbanésr_Uswr`XswahiliraUsvrbXsuecorcUsurdX sundanésreUstrfXsesothorgUskrhXeslovacoriUsirjX cingalésrkUshrlX serbocroatarmUsornXsomalíroUsnrpXshonarqUsmrrXsamoanorsUslrtXeslovenoruUscrvXsardorwUsarxX sánscritoryUsgrzXsangor{User|Xsami septentrionalr}Usdr~XsindhirUzenrXzenagarUkbdrX kabardianorUafarXlengua afroasiáticarUcsbrXcasubiorUlgrXgandarUlbrX luxemburguésrUfiurXlengua finoúgriarUlnrXlingalarUlorXlaosianorUlirX limburguésrUbynrXblinrUltrXlituanorUlurX luba-katangarUfilrXfilipinorUyirXyídishrUnonrXnórdico antiguorUcebrXcebuanorUyorXyorubarUnogrXnogairUbatrXlengua bálticarUdakrXdakotarUdarrXdargvarUdayrXdayakrUssarXlengua nilo-saharianarUkperXkpellerUelrXgriegorUeorX esperantorUenrXinglésrUlamrXlambarUeerXewerUmdfrXmoksharUfrrXfrancésrUmdrrXmandarrUetrXestoniorUesrXespañolrUrurXrusorUgonrXgondirUgohrXalemán de la alta edad antiguarUsmsrX sami skoltrUsmnrX sami inarirUsmjrX sami lulerUde_ATrXalemán de AustriarUgotrXgóticorUrnrXkiroundirUrorXrumanorUdsbrXsorbio inferiorrUsmarXsami meridionalrUgorrX gorontalorUastrX asturianorUwalrXwalamorUcrhrXtártaro de CrimearUathrXlenguas atabascasrUgezrXgeezrUxhrXxhosarUffrXfularUkforXkororUmakrXmacasarrUzaprXzapotecorUkokrXkonkanirUzxxrXsin contenido lingüísticorUkosrX kosraeanorUforXferoésrUtogrX tonga (Niasa)rUhuprXhuparUudmrXudmurtrUbejrXbejarUbemrXbembarUtsirX tsimshianorUberrXbereberr Unzir Xnzimar Usair Xlengua india sudamericanar UangrXinglés antiguorUprarXlenguas prácritasrUbhorXbhojpurirUsalrXlenguas salishrUprorXprovenzal antiguorUrajrX rajasthanirUsadrXsandawerUanprXangikarUes_419rXespañol latinoamericanorUrapr Xrapanuir!Usasr"Xsasakr#Unqor$Xn’kor%Ucarr&Xcariber'Uminr(X minangkabaur)Umicr*Xmicmacr+Uefir,Xefikr-Uarnr.Xaraucanor/Uypkr0X lenguas yupikr1Umisr2Xlenguas variasr3Ukacr4Xkachinr5Ukabr6Xcabilar7Ukaar8X karakalpakor9Ukajr:Xjjur;Ukamr<Xkambar=Ukarr>Xkarenr?Ukawr@XkawirAUfr_CHrBXfrancés de SuizarCUtyvrDX tuvinianorEUfr_CArFXfrancés canadienserGUkarHX georgianorIUdoirJXdogrirKUkgrLXkongorMUkkrNXkazajorOUkjrPXkuanyamarQUkirRXkikuyurSUkorTXcoreanorUUknrVXcanarésrWUkmrXXjemerrYUklrZX groenlandésr[Uksr\X cachemiror]Ukrr^Xkanurir_Ukwr`XcórnicoraUkvrbXkomircUkurdXkurdoreUkyrfXkirghizrgUtklrhX tokelauanoriUbuarjXburiatrkUmgarlXirlandés medievalrmUhitrnXhititaroUdyurpXdiularqUderrXalemánrsUdartXdanésruUdzrvXdzongkharwUluirxXluiseñoryUdvrzXdivehir{Uhilr|X hiligaynonr}Uhimr~X himachalirUgemrXlengua germánicarUcrprXlengua criolla o pidginrUqurXquechuarUbasrXbasarUgbarXgbayarUbadrXbandarUbanrXbalinésrUbalrXbaluchirUshnrXshanrUbairXlenguas bamilekerUarprXarapahorUartrXlengua artificialrUarwrXarahuacorUarcrXarameorUen_USrXinglés estadounidenserUsemrXlengua semíticarUselrXselkuprUnubrXlenguas nubiasrUbtkrXbatakrUlusrXlushairUmusrXcreekrUluarX luba-luluarUirorXlenguas iroquesasrUirarX lengua iraniarUmunrX lenguas mundarUlunrXlundarUluorXluorUwarXvalónrUtuprX lenguas tupírUjvrXjavanésrUtutrXlengua altaicarUtumrXtumbukarUjarXjaponésrUcoprXcoptorUilorXilocanorUlarXlatínrUgwirXkutchinrUundrX indeterminadarUtlirXtlingitrUtlhrXklingonrUchrXchamorrorUcorXcorsorUcarXcatalánrUcerXchechenorUponrX pohnpeianorUcyrXgalésrUsahrXyakutrUcsrXchecorUcrrXcreerUbntrXbantúrUcvrXchuvashrUcurXeslavo eclesiásticorUlvrXletónrUdumrXneerlandés medievalrUptrX portuguésrUduarXdualarUfrorXfrancés antiguorUyaprXyapésrUfrmrXfrancés medievalrUtivrXtivrUfrsrXfrisón orientalrUfrrrXfrisón septentrionalrUyaorXyaorUparXpunjabírUxalrXkalmykrUes_ESrXespañol de EspañarUpirXpalirUen_GBrXinglés británicorUgayrXgayor Uotor Xlenguas otomanasr Uotar X turco otomanor UhmnrXhmongrUmyvrXerzyarUgaarXgarUfurrXfriulanorUkhirXlengua joisanarUainrXainurUrarrX rarotonganorUslarX lengua eslavarUverXvendarUvir X vietnamitar!Uisr"X islandésr#Ukhor$Xkotanésr%Uiur&X inuktitutr'Uitr(Xitalianor)Uvor*Xvolapükr+Uiir,X sichuan yir-Uikr.Xinupiaqr/Uior0Xidor1Uiner2Xlengua indoeuropear3Uiar4X interlinguar5Ujprr6X judeo-persar7Uier8X interlinguer9Uidr:X indonesior;Uigr<Xigbor=Upapr>X papiamentor?Uewor@XewondorAUpaurBXpalauanorCUpaarDX lengua papúrEUpagrFX pangasinánrGUsatrHXsantalirIUpalrJXpahlavirKUpamrLXpampangarMUphirNXlengua filipinarOUcelrPX lengua celtarQUphnrRXfeniciorSUnicrTXlengua níger-cordofanarUUniarVXniasrWUdgrrXXdogribrYUsyrrZXsiriacor[Uniur\Xniueanor]Ugswr^X alemán suizor_Ucchr`XatsamraUjborbXlojbanrcUnahrdXnáhuatlreUsamrfXarameo samaritanorgUhairhXhaidariUgmhrjXalemán de la alta edad mediarkUcusrlX lengua cusitarmUwenrnXlenguas sorbiasroUadyrpXadigeorqUelxrrXelamitarsUadartXadangmeruUpt_PTrvXportugués de PortugalrwUhawrxXhawaianoryUbinrzXbinir{Ubikr|Xbicolr}Upt_BRr~Xportugués de BrasilrUmosrXmossirUmohrXmohawkrUtlrXtagalorUzh_HansrXchino simplificadorUzh_HantrXchino tradicionalrUtvlrX tuvaluanorUijorXijorUkmbrXkimbundurUpeorX persa antiguorUumbrXumbundurUtmhrXtamashekrUfonrXfonrUhsbrXsorbio superiorrUberX bielorrusorUbgrXbúlgarorUbarXbashkirrUpsrXpashtorUbmrXbambararUbnrXbengalírUborXtibetanorUbhrXbiharirUbirXbislamarUbrrXbretónrUbsrXbosniorUruprXarrumanorUzzarXzazakirUomrXoromorUojrXojibwarUacerXacehnésrUachrXacolirUocrXoccitanorUkrurXkurukhrUsrrrXsererrUkrorXkrurUkrlrXcareliorUkrcrXkarachay-balkarrUndsrX bajo alemánrUosrXoséticorUorrXoriyarUsogrXsogdianorUnsorXsotho septentrionalrUsonrXsonghairUde_CHrXalto alemán de SuizarUvairXvairUwakrXlenguas wakasharUlolrXmongorUmkhrXlengua mon-jemerrUawarXavadhirUlozrXlozirUgilrX gilbertésrUwasrXwashorUwarrXwarayrUhzrXhererorUhyrXarmeniorUanrX aragonésrUsidrXsidamorUhrrXcroatarUhtrXhaitianorUhurXhúngarorUhirXhindirUhorX hiri moturUharXhausarUbugrXbuginésrUherXhebreorUuzrXuzbekorUurrXurdurUplrXpolacorUukrX ucranianorUugrXuigurr Uaar Xafarr Uabr Xabjasior UaerX avésticorUafrX afrikaansrUakrXakanrUamrXamáricorUnl_BErXflamencorUeurXvascorUasrXasamésrUarrXáraberUinhrXingushrUtpir X tok pisinr!Umynr"Xmayar#Uayr$Xaimarar%Ukhar&Xkhasir'Uazr(Xazerír)Uincr*Xlengua índicar+Unlr,X neerlandésr-Unnr.Xnynorsk noruegor/Unor0Xnoruegor1Unar2Xnauruanor3Unbr4Xbokmal noruegor5Unair6Xlengua india norteamericanar7Undr8Xndebele septentrionalr9Uner:Xnepalír;Ungr<Xndongar=Unyr>Xnyanjar?Unapr@X napolitanorAUgrbrBXgreborCUgrcrDXgriego antiguorEUnrrFXndebele meridionalrGUtigrHXtigrérIUnvrJXnavajorKUzunrLXzunirMUrwrNX kinyarwandarOUcperPX,lengua criolla o pidgin basada en el inglésrQUcpfrRX-lengua criolla o pidgin basada en el francésrSUcpprTX/lengua criolla o pidgin basada en el portuguésrUuU territoriesrV}rW(UBDrXX BangladeshrYUBErZXBélgicar[UBFr\X Burkina Fasor]UBGr^XBulgariar_UVEr`X VenezuelaraUBArbXBosnia-HerzegovinarcUBBrdXBarbadosreUWFrfXWallis y FutunargUBLrhXSan BartolomériUBMrjXBermudasrkUBNrlXBrunéirmUBOrnXBoliviaroUBHrpXBahréinrqUBIrrXBurundirsUBJrtXBenínruUBTrvXButánrwU011rxXÁfrica occidentalryUBVrzX Isla Bouvetr{UBWr|XBotsuanar}U014r~XÁfrica orientalrU015rXÁfrica septentrionalrUBRrXBrasilrU017rXÁfrica centralrU018rXÁfrica meridionalrU019rX AméricasrUBYrX BielorrusiarUBZrXBelicerULVrXLetoniarURWrXRuandarURSrXSerbiarUTLrXTimor OrientalrURErXReuniónrUTMrX TurkmenistánrUOMrXOmánrUTJrX TayikistánrUROrXRumaníarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX(Islas Georgia del Sur y Sandwich del SurrUGRrXGreciarUGQrXGuinea EcuatorialrUGPrX GuadaluperUJPrXJapónrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXGuayana FrancesarUGErXGeorgiarUGDrXGranadarU021rX NorteaméricarUGBrX Reino UnidorUGArXGabónrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GroenlandiarU029rXCariberUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTúnezrUJMrXJamaicarU013rXCentroaméricarUWSrXSamoarU419rXLatinoamérica y el CariberUHRrXCroaciarUBSrXBahamasrUHTrXHaitírUHUrXHungríarUHKrX3Hong-Kong, Región administrativa especial de ChinarU039rXEuropa meridionalrUHNrXHondurasrUFIrX FinlandiarU142rXAsiarU030rX Asia orientalrU034rXAsia meridionalrU035rXSudeste asiáticorUPRrX Puerto RicorUPSrX PalestinarUFKrXIslas MalvinasrUIOrX)Territorio Británico del Océano ÍndicorUPWrXPalaurUPTrXPortugalrUSJrXSvalbard y Jan MayenrUMDrXMoldaviarUFMrX MicronesiarUIQrXIraqr UPAr XPanamár UPFr XPolinesia Francesar UPGrXPapúa Nueva GuinearUPErXPerúrUPKrX PakistánrUPHrX FilipinasrUFOrX Islas FeroerUPNrXPitcairnrUPLrXPoloniarUPMrXSan Pedro y MiquelónrUZMrXZambiarUEHr XSáhara Occidentalr!URUr"XRusiar#UEEr$XEstoniar%UEGr&XEgiptor'UZAr(X Sudáfricar)UECr*XEcuadorr+UITr,XItaliar-UVNr.XVietnamr/UZZr0X Región desconocida o no válidar1USBr2XIslas Salomónr3UETr4XEtiopíar5USOr6XSomaliar7UZWr8XZimbabuer9USAr:X Arabia Saudír;UESr<XEspañar=UERr>XEritrear?UMEr@X MontenegrorAUAQrBX AntártidarCUMGrDX MadagascarrEUMFrFX San MartínrGUMArHX MarruecosrIUMCrJXMónacorKUUZrLX UzbekistánrMUMMrNXMyanmarrOUMLrPXMalirQUMOrRXGRegión Administrativa Especial de Macao de la República Popular ChinarSUMNrTXMongoliarUUHMrVXIslas Heard y McDonaldrWUASrXXSamoa AmericanarYUMKrZX Macedoniar[UMUr\XMauricior]UMTr^XMaltar_UMWr`XMalauiraUMVrbXMaldivasrcUMQrdX MartinicareUMPrfXIslas Marianas del NortergUMSrhX MontserratriUMRrjX MauritaniarkUIMrlX Isla de ManrmUUGrnXUgandaroUTZrpXTanzaniarqUMYrrXMalasiarsUMXrtXMéxicoruUILrvXIsraelrwUFRrxXFranciaryUAWrzXArubar{UDOr|XRepública Dominicanar}USHr~X Santa ElenarUVCrXSan Vicente y las GranadinasrU054rX MelanesiarUDJrXYibutirUFJrXFiyirU057rXMicronesia [057]rU172rX#Comunidad de Estados IndependientesrU053rXAustralia y Nueva ZelandarUNIrX NicaraguarUNLrX Países BajosrUNOrXNoruegarUNArXNamibiarUVUrXVanuaturUNCrXNueva CaledoniarUNErXNígerrUNFrX Isla NorfolkrUNGrXNigeriarUNZrX Nueva ZelandarUNPrXNepalrUNRrXNaururUNUrX Isla NiuerU061rX PolinesiarUCIrXCosta de MarfilrUCHrXSuizarUCOrXColombiarUCNrXChinarUCMrXCamerúnrUCLrXChilerUCCrX Islas CocosrUCArXCanadárUCGrXCongorUCFrXRepública CentroafricanarUCDrX!República Democrática del CongorUCZrXRepública ChecarUCYrXChiprerUCXrXIsla ChristmasrUCSrXSerbia y MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Cabo VerderUCUrXCubarUSZrX SuazilandiarUSYrXSiriarUKGrX KirguistánrUKErXKeniarUSRrXSurinamrU143rX Asia centralrUKHrXCamboyarUKNrXSan Cristóbal y NievesrUKMrXComorasrUSTrXSanto Tomé y PrínciperUSKrX EslovaquiarUKRrX Corea del SurrUSIrX EsloveniarUKPrXCorea del NorterUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonarUSCrX SeychellesrUKZrX KazajistánrUKYrX Islas CaimánrUSGrXSingapurrUSErXSueciarUSDrXSudánrU151rXEuropa orientalrU150rXEuroparUDMrXDominicarU155rXEuropa occidentalrU154rXEuropa septentrionalr UVGr XIslas Vírgenes Británicasr UDEr XAlemaniar UYErXYemenrUMHrXIslas MarshallrU062rXAsia centromeridionalrUDZrXArgeliarUUSrXEstados UnidosrUUYrXUruguayrUYTrXMayotterUUMrX,Islas menores alejadas de los Estados UnidosrULBrXLíbanorULCr X Santa Lucíar!ULAr"XLaosr#UTVr$XTuvalur%UTWr&XTaiwánr'UTTr(XTrinidad y Tobagor)UTRr*XTurquíar+ULKr,X Sri Lankar-ULIr.X Liechtensteinr/UCKr0X Islas Cookr1UTOr2XTongar3ULTr4XLituaniar5ULUr6X Luxemburgor7ULRr8XLiberiar9ULSr:XLesotor;UTHr<X Tailandiar=UTFr>XTerritorios Australes Francesesr?UTGr@XTogorAUTDrBXChadrCUTCrDXIslas Turcas y CaicosrEULYrFXLibiarGUVArHXCiudad del VaticanorIU145rJXAsia occidentalrKUAErLXEmiratos Árabes UnidosrMUADrNXAndorrarOUAGrPXAntigua y BarbudarQUAFrRX AfganistánrSUAIrTXAnguilarUUVIrVX%Islas Vírgenes de los Estados UnidosrWUISrXXIslandiarYUIRrZXIránr[UAMr\XArmeniar]UALr^XAlbaniar_UAOr`XAngolaraUANrbXAntillas NeerlandesasrcU003rdXAmérica del NortereU002rfXÁfricargU001rhXMundoriUARrjX ArgentinarkUAUrlX AustraliarmUATrnXAustriaroU005rpX SuraméricarqUINrrXIndiarsUAXrtX Islas ÅlandruU009rvXOceaníarwUAZrxX AzerbaiyánryUIErzXIrlandar{UIDr|X Indonesiar}UJOr~XJordaniarUQUrXUnión EuropearUUArXUcraniarUQArXQatarrUDKrX DinamarcarUMZrX MozambiquerUQOrX Territorios alejados de OceaníaruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X dd/MM/yyyyrhSX%(dd)s/%(MM)s/%(yyyy)srubUfullrhO)r}r(h3XEEEE d 'de' MMMM 'de' yyyyrhSX&%(EEEE)s %(d)s de %(MMMM)s de %(yyyy)srubUlongrhO)r}r(h3Xd 'de' MMMM 'de' yyyyrhSX%(d)s de %(MMMM)s de %(yyyy)srubUshortrhO)r}r(h3Xdd/MM/yyrhSX%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUZWDrXZ$rUVUVrXVTrUUYUrXUr$rUNIOrXC$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUSCRrXSRrUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUJMDrXJ$rUGELrXlarirUAFNrXAfrUTRLrXTLr UBDTr XTkr UYERr XYRlr UANGrXNA f.rUXCDrXEC$rUNOKrXNKrrUMXNrXMEX$rUBTNrXNurUCOPrXCol$rUIDRrXRprUHNLrXLrUFJDrXF$rUETBr XBrr!UBZDr"XBZ$r#UDOPr$XRD$r%UQARr&XQRr'USEKr(XSKrr)USRGr*XSfr+UIEPr,XIR£r-UBBDr.XBDS$r/UVEFr0XBsFr1UGTQr2XQr3UVEBr4XBer5UCLPr6XCh$r7UALLr8Xlekr9UKZTr:XTr;UTTDr<XTT$r=UOMRr>XROr?USBDr@XSI$rAUPLNrBXZlrCUKESrDXK ShrEUGYDrFXG$rGUMKDrHXMDenrIUTWDrJXNT$rKUTOPrLXT$rMUGNFrNXGFrOUIQDrPXIDrQUBAMrRXKMrSUCADrTXCan$rUUCVErVXCVEscrWUKWDrXXKDrYUBIFrZXFbur[USOSr\XSr]USGDr^XS$r_USTDr`XDbraUESPrbX₧rcUIRRrdXRIreUCNYrfXYrgUCYPrhX£CriUMTLrjXLmrkUNZDrlX$NZrmUKGSrnXsomroUARSrpXArg$rqUSZLrrXErsUBHDrtXBDruuU time_zonesrv}rw(UAtlantic/Canaryrx}ryUcityrzXIslas Canariasr{sU Europe/Lisbonr|}r}jzXLisboar~sUAmerica/Buenos_Airesr}rjzX Hora de Argentina (Buenos Aires)rsUAmerica/Port_of_Spainr}rjzXPuerto EspañarsUAmerica/Meridar}rjzXMéridarsUAfrica/Tripolir}rjzXTrípolirsUEurope/Tallinnr}rjzXTallinrsUAustralia/Darwinr}rjzXHora de Australia (Darwin)rsUEurope/Copenhagenr}rjzX CopenhaguersUAmerica/St_Luciar}rjzX Santa LucíarsUAsia/Singaporer}rjzXSingapurrsU Europe/Tiraner}rjzXTiranarsUAmerica/Maceior}rjzXMaceiórsUAfrica/Djiboutir}rjzXYibutirsU Asia/Urumqir}rjzXÜrümqirsUAmerica/Grenadar}rjzXGranadarsUAmerica/El_Salvadorr}rjzXSalvadorrsU Asia/Dushanber}rjzX DuchanbérsUEurope/Kaliningradr}rjzX KaliningradorsUAsia/Ulaanbaatarr}rjzX Ulán BatorrsUIndian/Maldivesr}rjzXMaldivasrsU Europe/Parisr}rjzXParísrsUEurope/Stockholmr}rjzX EstocolmorsU Pacific/Fijir}rjzXFiyirsUAmerica/Port-au-Princer}rjzXPuerto PríncipersUAmerica/Caymanr}rjzXCaimánrsUAustralia/Adelaider}rjzXAdelaidarsU Europe/Athensr}rjzXAtenasrsUAmerica/Indianapolisr}rjzX IndianápolisrsUAmerica/Reginar}rjzXHora de Canadá (Regina)rsU Pacific/Trukr}rjzXChuukrsU Asia/Rangoonr}rjzXRangúnrsUAmerica/Mexico_Cityr}rjzXCiudad de MéxicorsUIndian/Mauritiusr}rjzXMauriciorsU Europe/Berlinr}rjzXBerlínrsU Europe/Zurichr}rjzXZúrichrsUAmerica/Cordobar}rjzXCórdobarsU Asia/Tbilisir}rjzXTiflisrsU America/Belemr}rjzXBelémrsU Europe/Romer}rjzXRomarsUAfrica/Sao_Tomer}rjzX Santo TomérsU Asia/Makassarr}rjzXMakasarrsU Europe/Warsawr}rjzXVarsoviarsUAsia/Yekaterinburgr}rjzXYekaterinburgorsUAtlantic/Bermudar}rjzXBermudasrsUAmerica/Araguainar}rjzX AraguaínarsU Asia/Tehranr}rjzXTeheránrsUPacific/Honolulur}rjzX HonolulúrsU Asia/Bakur }r jzXBakúr sUAmerica/St_Johnsr }r jzX St. John’srsUIndian/Reunionr}rjzXReuniónrsUAfrica/Khartoumr}rjzXJartúnrsUAtlantic/Cape_Verder}rjzX Cabo VerdersUAmerica/Mazatlanr}rjzX MazatlánrsU Asia/Macaur}rjzXMacaorsUAmerica/Guadelouper}rjzX Guadaluper sU Europe/Praguer!}r"jzXPragar#sUAmerica/Halifaxr$}r%jzXHora de Canadá (Halifax)r&sUAmerica/Eiruneper'}r(jzX Eirunepér)sU Asia/Baghdadr*}r+jzXBagdadr,sUAmerica/Los_Angelesr-}r.jzX Los Ángelesr/sU Asia/Sakhalinr0}r1jzXSajalínr2sUAmerica/Chihuahuar3}r4jzXHora de México (Chihuahua)r5sUAmerica/Argentina/Rio_Gallegosr6}r7jzX Río Gallegosr8sUAmerica/Vancouverr9}r:jzXHora de Canadá (Vancouver)r;sUAtlantic/Reykjavikr<}r=jzX Reikiavikr>sU Asia/Katmandur?}r@jzX KatmandúrAsUEurope/VolgogradrB}rCjzX VolgogradorDsU Asia/AqtaurE}rFjzXAktaurGsUAmerica/Sao_PaulorH}rIjzX São PaulorJsUAmerica/BelizerK}rLjzXBelicerMsUAmerica/EdmontonrN}rOjzXHora de Canadá (Edmonton)rPsUPacific/PitcairnrQ}rRjzXIslas PitcairnrSsUAustralia/PerthrT}rUjzXHora de Australia (Perth)rVsU Asia/TokyorW}rXjzXTokiorYsUPacific/EasterrZ}r[jzXIsla de Pascuar\sU Asia/Jakartar]}r^jzXYakartar_sUAustralia/Sydneyr`}rajzXSídneyrbsUAfrica/Johannesburgrc}rdjzX JohannesburgoresUAtlantic/South_Georgiarf}rgjzXGeorgia del SurrhsU Africa/Tunisri}rjjzXTúnezrksUAmerica/Campo_Granderl}rmjzXHora de Brasil (Campo Grande)rnsU Asia/Ashgabatro}rpjzXAsjabadrqsUEurope/Istanbulrr}rsjzXEstambulrtsUEurope/Bucharestru}rvjzXBucarestrwsUPacific/Galapagosrx}ryjzX GalápagosrzsU Europe/Monacor{}r|jzXMónacor}sUAmerica/Bogotar~}rjzXBogotársUAmerica/Winnipegr}rjzXHora de Canadá (Winnipeg)rsUAmerica/Phoenixr}rjzX Hora de Estados Unidos (Phoenix)rsUAustralia/Brisbaner}rjzXHora de Australia (Brisbane)rsU Asia/Aqtober}rjzXAktobersUEurope/Vilniusr}rjzXVilnarsUAmerica/Cayenner}rjzXCayenarsU Asia/Yerevanr}rjzXErevánrsU Africa/Cairor}rjzXEl CairorsUAmerica/Cuiabar}rjzXCuiabársU Europe/Moscowr}rjzXMoscúrsUAmerica/Rio_Brancor}rjzX Río BrancorsUAfrica/Addis_Ababar}rjzX Addis AbebarsUAmerica/Cancunr}rjzXCancúnrsUAsia/Vientianer}rjzX VientiánrsUAmerica/Havanar}rjzX La HabanarsUEurope/Brusselsr}rjzXBruselasrsUAmerica/Argentina/Tucumanr}rjzXTucumánrsUAsia/Jerusalemr}rjzX JerusalénrsUAmerica/St_Kittsr}rjzX St. KittsrsUAfrica/Algiersr}rjzXArgeliarsUAmerica/Panamar}rjzXPanamársU Pacific/Palaur}rjzXPalaosrsU Asia/Bahrainr}rjzXBahráinrsU Europe/Londonr}rjzXLondresrsU Asia/Riyadhr}rjzXRiadrsUAmerica/Hermosillor}rjzXHora de México (Hermosillo)rsUAtlantic/Faeroer}rjzX Islas FeroersUAmerica/Anguillar}rjzXAnguilarsU Asia/Damascusr}rjzXDamascorsUAmerica/North_Dakota/Centerr}rjzXCentrorsU Asia/Bruneir}rjzXBrunéirsUAtlantic/St_Helenar}rjzX Santa HelenarsUAmerica/Tijuanar}rjzXHora de México (Tijuana)rsUEurope/Luxembourgr}rjzX LuxemburgorsUAmerica/Martiniquer}rjzX MartinicarsUAntarctica/DumontDUrviller}rjzXDumont d'UrvillersUPacific/Tahitir}rjzXTahitírsUAmerica/St_Vincentr}rjzX San VicentersUAmerica/Asuncionr}rjzX AsunciónrsU Europe/Viennar}rjzXVienarsUAmerica/New_Yorkr}rjzX Nueva YorkrsU Europe/Dublinr}rjzXDublínrsUAustralia/Hobartr}r jzXHora de Australia (Hobart)r sU Europe/Sofiar }r jzXSofíar sUAfrica/Porto-Novor }r jzX Portonovor sUAsia/Samarkandr }r jzX Samarcandar sUAmerica/Torontor }r jzXHora de Canadá (Toronto)r sU Etc/Unknownr }r jzX Desconocidar sUAntarctica/South_Poler }r jzXPolo Surr sU America/Bahiar }r jzXBahíar sU Asia/Seoulr }r jzXSeúlr sUAmerica/Miquelonr }r jzX Miquelónr sU Indian/Comoror }r jzXComorasr suUscriptsr }r! (UGurur" Xgurmujir# UHebrr$ Xhebreor% UZzzzr& X"escritura desconocida o no válidar' UPhnxr( Xfenicior) UMoonr* Xmoonr+ UChamr, Xchamr- UArabr. Xáraber/ UGujrr0 Xgujaratir1 UZxxxr2 X no escritor3 ULycir4 Xlicior5 USinhr6 Xbinhalar7 UTalur8 X nuevo tai luer9 UMongr: Xmongolr; UXpeor< X persa antiguor= UVispr> Xlenguaje visibler? URjngr@ XrejangrA UOlckrB Xol cikirC UTalerD Xtai lerE UMandrF XmandeorG UMlymrH X malayálamrI UTibtrJ XtibetanorK UKalirL Xkayah lirM UJpanrN XjaponésrO UPlrdrP X Pollard MiaorQ UKanarR XkatakanarS ULydirT XlidiorU ULepcrV XlepcharW USundrX X sundanésrY UYiiirZ Xyir[ UJavar\ Xjavanésr] UOryar^ Xoriyar_ ULaoor` Xlaora UUgarrb X ugaríticorc UCyrlrd X cirílicore UVaiirf Xvairg UArmnrh Xarmeniori UCyrsrj X*cirílico del antiguo eslavo eclesiásticork UKhmrrl Xjemerrm USylorn X syloti nagriro UItalrp Xantigua bastardillarq USgnwrr X SignWritingrs UXsuxrt Xcuneiforme sumerio-acadioru UThaarv Xthaanarw UThairx X tailandésry UCprtrz X chipriotar{ ULinbr| Xlineal Br} ULinar~ Xlineal Ar UOsmar Xosmaniyar USaurr X saurashtrar UHirar Xhiraganar UHanir Xhanr UEgydr Xegipcio demóticor UQaair Xheredador UEgyhr Xegipcio hieráticor UCansr X,símbolos aborígenes canadienses unificadosr UEgypr Xjeroglíficos egipciosr UTfngr Xtifinaghr UShawr Xshavianor UCirtr Xcirthr UGeorr X georgianor UTengr Xtengwarr UHrktr Xkatakana o hiraganar UGeokr Xgeorgiano jutsurir UOgamr Xoghamr UDsrtr Xdeseretr UGothr Xgóticor UHanor Xhanunoor UBalir Xbalinésr UKorer Xcoreanor UHangr Xhangulr UCarir Xcarior UAvstr X avésticor UTagbr X tagbanúar UHansr Xhan simplificador UHantr Xhan tradicionalr URoror X rongo-rongor UDevar X devanagarir UIndsr XIndio (harappan)r UBopor Xbopomofor UMymrr Xbirmanor UTglgr Xtagalor UPermr Xpermiano antiguor UBugir Xbugir UPhagr Xphags-par UBrair Xbrailler UBrahr Xbrahmir UBatkr Xbatakr UMeror X meroíticor ULimbr Xlimbur UMteir Xmanipurir UTelur Xtelugur UTamlr Xtamilr USarar Xsaratir ULatgr Xlatín (variante gaélica)r ULatfr Xlatín (variante fraktur)r UKharr X kharosthir UNkoor Xn’kor ULatnr Xlatínr UMayar Xjeroglíficos mayasr ULanar Xlannar UEthir X etiópicor UHmngr X pahawh hmongr UBuhdr Xbuhidr UCoptr Xcoptor UGlagr X glagolíticor URunrr Xrúnicor UOrkhr Xorkhonr UHungr Xhúngaro antiguor UGrekr Xgriegor UCherr Xcherokeer UZyyyr Xcomúnr USyrcr Xsiriacor UBlisr Xsímbolos blisr UBengr Xbengalír USyrer Xsiriaco estrangelor USyrjr Xsiriaco occidentalr USyrnr Xsiriaco orientalr UKndar Xcanarésr uUvariantsr }r (UREVISEDr XOrtografía revisadar UFONIPAr X$alfabeto fonético internacional IPAr U1996r XOrtografía alemana de 1996r UMONOTONr X Monotónicor UAREVELAr XArmenio orientalr UPOSIXr X Ordenadorr UPOLYTONr X Politónicor U1901r XOrtografía alemana tradicionalr uUnumber_symbolsr }r! (Udecimalr" X,r# Ugroupr$ X.r% uUcurrency_namesr& }r' (UXXXr( X Sin divisar) jXdinar argelinor* ULVRr+ X rublo letónr, jXfranco comorenser- UBOPr. Xpeso bolivianor/ UEGPr0 X libra egipciar1 jXlev fuerte búlgaror2 UBGNr3 Xnuevo lev búlgaror4 UPABr5 Xbalboa panameñor6 UYUMr7 Xsuper dinar yugoslavor8 jXdólar de Zimbabuer9 UGHCr: X cedi ghanésr; UXBDr< Xunidad de cuenta europea (XBD)r= jX bolivianor> UXBAr? Xunidad compuesta europear@ jX corona danesarA UXBCrB Xunidad de cuenta europea (XBC)rC UXBBrD Xunidad monetaria europearE UBWPrF X pula botsuanorG jXlibra libanesarH jXchelín tanzanorI UVNDrJ Xdong vietnamitarK jXdólar de NamibiarL UAOArM Xkwanza angoleñorN UWSTrO X tala samoanorP UAONrQ X"nuevo kwanza angoleño (1990-2000)rR jXriel camboyanorS jXringgit malasiorT UAOKrU Xkwanza angoleño (1977-1990)rV j\Xchelín somalírW UKYDrX Xdólar de las Islas CaimánrY jX dinar libiorZ UUAHr[ Xgrivna ucranianar\ UUAKr] Xkarbovanet ucranianor^ jXchelín ugandésr_ jX dinar jordanor` UAORra X'kwanza reajustado angoleño (1995-1999)rb USURrc Xrublo soviéticord UAWGre Xflorín de Arubarf jX riyal saudírg UFIMrh Xmarco finlandésri jXdólar de Hong Kongrj j*Xflorín surinamésrk UTPErl Xescudo timorenserm UMGFrn Xfranco malgachero UCHErp Xeuro WIRrq jX franco suizorr UGIPrs Xlibra de Gibraltarrt jXrublo bielorrusoru j8X lek albanésrv UXPDrw Xpaladiorx UUGSry Xchelín ugandés (1966-1987)rz jXouguiya mauritanor{ UBOVr| XMVDOL bolivianor} UHRKr~ X kuna croatar jXfranco de Yibutir UHRDr X dinar croatar UPESr X sol peruanor UEQEr Xekueler UITLr X lira italianar UXAFr Xfranco CFA BEACr UBNDr Xdólar de Brunéir UISKr Xcorona islandesar UZALr Xrand sudafricano (financiero)r USRDr Xdólar surinamésr jXcórdoba oro nicaragüenser ULAKr X kip laosianor UNICr Xcórdoba nicaragüenser jXrupia nepalesar UMZEr Xescudo mozambiqueñor jX peso uruguayor ULUCr X franco convertible luxemburguésr jXdólar de Jamaicar UFRFr Xfranco francésr UMAFr Xfranco marroquír UUYIr X#peso uruguayo en unidades indexadasr jXantiguo metical mozambiqueñor UMZNr Xmetical mozambiqueñor UPHPr X peso filipinor jXrand sudafricanor URHDr Xdólar rodesianor UGWPr Xpeso de Guinea-Bissáur ULUFr Xfranco luxemburguésr UBELr Xfranco belga (financiero)r UBECr Xfranco belga (convertible)r UNGNr Xnaira nigerianor UYUNr Xdinar convertible yugoslavor jX franco belgar UPLZr Xzloty polaco (1950-1995)r jXcolón costarricenser jXlira turca antiguar UDEMr X marco alemánr UEEKr Xcorona estoniar jXkwacha de Malawir j<Xdólar de Trinidad y Tobagor jXrupia de Sri Lankar jXcorona eslovacar jVXescudo de Cabo Verder jXrupia pakistanír jXflorín húngaror jXantiguo leu rumanor UXEUr Xunidad de moneda europear jXdólar de Bermudasr j>X rial omanír jXloti lesothenser ULSMr Xmalotir jX tugrik mongolr jX dram armenior UYUDr Xdinar fuerte yugoslavor UBUKr X kyat birmanor jX libra siriar j&Xriyal de Qatarr UXDRr Xderechos especiales de giror UNLGr Xflorín neerlandésr UGEKr Xkupon larit georgianor UMTPr X libra maltesar UGBPr Xlibra esterlina británicar jXlari georgianor USHPr Xlibra de Santa Elenar jXafganir j@Xdólar de las Islas Salomónr UCSKr Xcorona fuerte checoslovacar UKPWr Xwon norcoreanor UXREr X fondos RINETr UCSDr Xantiguo dinar serbior UAFAr Xafgani (1927-2002)r UTHBr Xbaht tailandésr UBYBr X"nuevo rublo bielorruso (1994-1999)r j Xtaka de Bangladeshr UGRDr X dracma griegor j X rial yemenír UDDMr Xostmark de Alemania del Ester jrXlilangeni suazir UHTGr Xgourde haitianor UTRYr Xnueva lira turcar UMGAr Xariary malgacher jX$florín de las Antillas Neerlandesasr ULRDr Xdólar liberianor URWFr Xfranco ruandésr jXcorona noruegar UMXVr X#unidad de inversión (UDI) mexicanar jDXchelín keniatar UMOPr Xpataca de Macaor UINRr X rupia indiar jX peso mexicanor UCZKr X corona checar UTJSr X somoni tayikor UTJRr X rublo tayikor jXngultrum butanésr UYDDr X dinar yemenír UGWEr Xescudo de Guinea Portuguesar jXpeso colombianor UCOUr Xunidad de valor real colombianar jjX lira maltesar UMURr Xrupia mauricianar! jXrupia indonesiar" jXlempira hondureñor# jX franco CFPr$ jXdólar de las Islas Fiyir% j X birr etíoper& UPENr' Xnuevo sol peruanor( j"Xdólar de Belicer) UCHWr* X franco WIRr+ UATSr, Xchelín austriacor- UILPr. Xlibra israelír/ UZRNr0 Xnuevo zaire zaireñor1 j$Xpeso dominicanor2 ULULr3 Xfranco financiero luxemburguésr4 UTMMr5 Xmanat turcomanor6 jJXnuevo dólar taiwanésr7 UMDLr8 X leu moldavor9 UXPTr: Xplatinor; UECVr< X+unidad de valor constante (UVC) ecuatorianar= UECSr> Xsucre ecuatorianor? UBSDr@ Xdólar de las BahamasrA j(X corona suecarB jLXpaʻanga tonganorC UPEIrD X inti peruanorE UZMKrF Xkwacha zambianorG UMVRrH Xrufiyaa de MaldivasrI UXTSrJ Xcódigo reservado para pruebasrK jXdólar australianorL UADPrM Xpeseta andorranarN UCUPrO X peso cubanorP j,Xlibra irlandesarQ UCLFrR Xunidad de fomento chilenarS j.Xdólar de BarbadosrT UKRWrU Xwon surcoreanorV UGMDrW Xdalasi gambianorX j0Xbolívar fuerte venezolanorY j2Xquetzal guatemaltecorZ j4Xbolívar venezolanor[ UXOFr\ Xfranco CFA BCEAOr] USITr^ Xtólar eslovenor_ USDPr` Xlibra sudanesara j6X peso chilenorb UEURrc Xeurord UCDFre Xfranco congoleñorf jXdólar del Caribe Orientalrg j:X tenge kazakorh URUBri X rublo rusorj UXFUrk Xfranco UIC francésrl UXAGrm Xplatarn UBRRro Xcruceiro brasileñorp UBRNrq Xnuevo cruzado brasileñorr UBRLrs Xreal brasileñort UMMKru Xkyat de Myanmarrv UUYPrw Xpeso uruguayo (1975-1993)rx URURry Xrublo ruso (1991-1998)rz jBX zloty polacor{ UBREr| Xcruceiro brasileño (1990-1993)r} UPYGr~ Xguaraní paraguayor UBRCr Xcruzado brasileñor UBRBr X%nuevo cruceiro brasileño (1967-1986)r USVCr Xcolón salvadoreñor UAEDr X&dírham de los Emiratos Árabes Unidosr UGNSr X syli guineanor jHXdinar macedonior UAZMr Xmanat azerí (1993-2006)r UAZNr X manat azerír UUSNr X&dólar estadounidense (día siguiente)r UGQEr Xekuele de Guinea Ecuatorialr jXvatu vanuatuenser UBADr X dinar bosnior jNXfranco guineanor UMXPr X"peso de plata mexicano (1861-1992)r jPX dinar iraquír UERNr X nakfa eritreor jRX'marco convertible de Bosnia-Herzegovinar jXrupia de Seychellesr jTXdólar canadienser USDDr Xdinar sudanésr jhXlibra chipriotar UMADr Xdirham marroquír jXXdinar kuwaitír jZXfranco de Burundir ULTTr Xtalonas lituanor UPGKr Xkina de Papúa Nueva Guinear ULTLr X litas lituanor j^Xdólar singapurenser UUZSr X sum uzbekor j`X dobra de Santo Tomé y Prínciper UXFOr Xfranco oro francésr UMLFr X franco malír jbXpeseta españolar jdX rial iranír UZRZr Xzaire zaireñor jfXyuan renminbi chinor USLLr Xleone de Sierra Leonar UTNDr Xdinar tunecinor jFXdólar guyanésr UESBr X%peseta española (cuenta convertible)r UESAr Xpeseta española (cuenta A)r jlXdólar neozelandésr UFKPr Xlibra de las Islas Malvinasr ULVLr X lats letónr UUSSr X"dólar estadounidense (mismo día)r UUSDr Xdólar estadounidenser UARPr Xpeso argentino (1983-1985)r jnX som kirguísr jpXpeso argentinor UILSr Xnuevo sheqel israelír URONr X leu rumanor URSDr X dinar serbior jtXdinar bahreinír UJPYr X yen japonésr UARAr Xaustral argentinor UPTEr Xescudo portuguésr UXAUr Xoror uUmonthsr }r (U stand-aloner }r Unarrowr }r (KjsKXFr KjKXAr KjKXJr Kj Kj K j]K XOr K XNr K XDr usUformatr }r (Uwider }r (KXeneror KXfebreror KXmarzor KXabrilr KXmayor KXjunior KXjulior KXagostor K X septiembrer K Xoctubrer K X noviembrer K X diciembrer uU abbreviatedr }r (KXener KXfebr KXmarr KXabrr KXmayr KXjunr KXjulr KXagor K Xsepr K Xoctr K Xnovr K Xdicr uuuUcurrency_formatsr }r Nh&)r }r (h)Nh+Kh,KKr h.h/h/r h1KKr h3X ¤ #,##0.00r h5X¤ r X-¤ r r h8Nh9KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KjKjKjKj KXVr Kj]Kj usUformatr }r (Uwider }r (KXlunesr KXmartesr KX miércolesr! KXjuevesr" KXviernesr# KXsábador$ KXdomingor% uU abbreviatedr& }r' (KXlunr( KXmarr) KXmiér* KXjuer+ KXvier, KXsábr- KXdomr. uuuU meta_zonesr/ }r0 (U Turkmenistanr1 }r2 (Ucommonr3 Ulongr4 }r5 (Udaylightr6 XHora de verano de Turkmenistánr7 Ustandardr8 XHora de Turkmenistánr9 uuU Kuybyshevr: }r; (j3 j4 }r< (j6 XHora de verano de Kuibishevr= j8 XHora de Kuibishevr> uuUArabianr? }r@ (UshortrA }rB (UgenericrC X AT (Arabia)rD j6 X ADT (Arabia)rE j8 X AST (Arabia)rF uj3 j4 }rG (jC XHora de ArabiarH j6 XHora de verano de ArabiarI j8 XHora estándar de ArabiarJ uuUAustralia_EasternrK }rL (j3 j4 }rM (jC XHora de Australia orientalrN j6 X$Hora de verano de Australia orientalrO j8 X$Hora estándar de Australia orientalrP uuU ArgentinarQ }rR (j3 j4 }rS (j6 XHora de verano de ArgentinarT j8 XHora de ArgentinarU uuUBoliviarV }rW (j3 j4 }rX j8 XHora de BoliviarY suU Alaska_HawaiirZ }r[ (j3 j4 }r\ (jC XHora de Alaska-Hawáir] j6 XHora de verano de Alaska-Hawáir^ j8 XHora estándar de Alaska-Hawáir_ uuUAzoresr` }ra (j3 j4 }rb (j6 XHora de verano de las Azoresrc j8 XHora de las Azoresrd uuUPierre_Miquelonre }rf (j3 j4 }rg (jC XHora de San Pedro y Miquelónrh j6 X'Hora de verano de San Pedro y Miquelónri j8 X'Hora estándar de San Pedro y Miquelónrj uuUEurope_Centralrk }rl (j3 j4 }rm (j6 X Hora de verano de Europa Centralrn j8 XHora de Europa Centralro uuU Aktyubinskrp }rq (j3 j4 }rr (j6 XHora de verano de Aktyubinskrs j8 XHora de Aktyubinskrt uuUBeringru }rv (j3 j4 }rw (jC XHora de Beringrx j6 XHora de verano de Beringry j8 XHora estándar de Beringrz uuU Qyzylordar{ }r| (j3 j4 }r} (j6 XHora de verano de Qyzylordar~ j8 XHora de Qyzylordar uuUFrunzer }r (j3 j4 }r (j6 XHora de verano de Frunzer j8 XHora de Frunzer uuU Dutch_Guianar }r (j3 j4 }r j8 XHora de la Guayana Holandesar suUYerevanr }r (j3 j4 }r (j6 XHora de verano de Erevánr j8 XHora de Erevánr uuUKashgarr }r (j3 j4 }r j8 XHora de Kashgarr suU East_Timorr }r (j3 j4 }r j8 XHora de Timor Orientalr suUAfrica_Easternr }r (j3 j4 }r j8 XHora de África orientalr suU Ashkhabadr }r (j3 j4 }r (j6 XHora de verano de Asjabadr j8 XHora de Asjabadr uuUAlaskar }r (j3 j4 }r (jC XHora de Alaskar j6 XHora de verano de Alaskar j8 XHora estándar de Alaskar uuUAmerica_Easternr }r (j3 j4 }r (jC X Hora orientalr j6 XHora de verano orientalr j8 XHora estándar orientalr uuU Yekaterinburgr }r (j3 j4 }r (j6 X Hora de verano de Yekaterinburgor j8 XHora de Yekaterinburgor uuUAmerica_Centralr }r (j3 j4 }r (jC X Hora centralr j6 XHora de verano centralr j8 XHora estándar centralr uuUPakistanr }r (j3 j4 }r (j6 XHora de verano de Pakistánr j8 XHora de Pakistánr uuUSamoar }r (j3 j4 }r j8 XHora estándar de Samoar suUMacaur }r (j3 j4 }r (j6 XHora de verano de Macaor j8 X Hora de Macaor uuUChamorror }r (j3 j4 }r j8 XHora estándar de Chamorror suUGuamr }r (j3 j4 }r j8 XHora estándar de Guamr suUIndiar }r (j3 j4 }r j8 XHora estándar de la Indiar suU Azerbaijanr }r (j3 j4 }r (j6 XHora de verano de Azerbaiyánr j8 XHora de Azerbaiyánr uuU Tajikistanr }r (j3 j4 }r j8 XHora de Tayikistánr suUTurkeyr }r (j3 j4 }r (j6 XHora de verano de Turquíar j8 XHora de Turquíar uuU Afghanistanr }r (j3 j4 }r j8 XHora de Afganistánr suU Choibalsanr }r (j3 j4 }r (j6 XHora de verano de Choibalsanr j8 XHora de Choibalsanr uuU Shevchenkor }r (j3 j4 }r (j6 XHora de verano de Shevchenkor j8 XHora de Shevchenkor uuU Bangladeshr }r (j3 j4 }r j8 XHora de Bangladeshr suUGulfr }r (j3 j4 }r j8 XHora estándar del Golfor suUDaccar }r (j3 j4 }r j8 X Hora de Daccar suUMongoliar }r (j3 j4 }r (j6 XHora de verano de Ulán Batorr j8 XHora de Ulán Batorr uuU Samarkandr }r (jA }r (j6 XSAMST (Samarcanda)r j8 XSAMT (Samarcanda)r uj3 j4 }r (j6 XHora de verano de Samarcandar j8 XHora de Samarcandar uuUPerur }r (j3 j4 }r (j6 XHora de verano de Perúr j8 X Hora de Perúr uuUIndonesia_Centralr }r (j3 j4 }r j8 XHora de Indonesia centralr suUKorear }r (j3 j4 }r (jC X Hora de Corear j6 XHora de verano de Corear j8 XHora estándar de Corear uuUCubar }r (j3 j4 }r (jC X Hora de Cubar j6 XHora de verano de Cubar j8 XHora estándar de Cubar uuUMoscowr }r (j3 j4 }r (jC XHora de Moscúr j6 XHora de verano de Moscúr j8 XHora estándar de Moscúr uuUArgentina_Westernr }r! (j3 j4 }r" j8 XHora de Argentina occidentalr# suUAmazonr$ }r% (j3 j4 }r& (j6 XHora de verano del Amazonasr' j8 XHora del Amazonasr( uuUChinar) }r* (jA }r+ j8 X CST (China)r, sj3 j4 }r- (jC X Hora de Chinar. j6 XHora de verano de Chinar/ j8 XHora estándar de Chinar0 uuULong_Shur1 }r2 (j3 j4 }r3 j8 XHora de Long-Shur4 suUArmeniar5 }r6 (j3 j4 }r7 (j6 XHora de verano de Armeniar8 j8 XHora de Armeniar9 uuUGreenland_Westernr: }r; (j3 j4 }r< (j6 X(Hora de verano de Groenlandia occidentalr= j8 XHora de Groenlandia occidentalr> uuUKarachir? }r@ (j3 j4 }rA j8 XHora de KarachirB suUBrasiliarC }rD (j3 j4 }rE (j6 XHora de verano de BrasiliarF j8 XHora de BrasiliarG uuU French_GuianarH }rI (j3 j4 }rJ j8 XHora de la Guayana FrancesarK suUAfrica_SouthernrL }rM (j3 j4 }rN j8 X$Hora estándar de África meridionalrO suU NewfoundlandrP }rQ (j3 j4 }rR (jC XHora de TerranovarS j6 XHora de verano de TerranovarT j8 XHora estándar de TerranovarU uuU KyrgystanrV }rW (j3 j4 }rX j8 XHora de KirguistánrY suUKazakhstan_WesternrZ }r[ (j3 j4 }r\ j8 X(Hora estándar de Kazajistán occidentalr] suUAfrica_Centralr^ }r_ (j3 j4 }r` j8 XHora de África centralra suUMalaysiarb }rc (j3 j4 }rd j8 XHora de Malasiare suUJapanrf }rg (j3 j4 }rh (jC XHora de Japónri j6 XHora de verano de Japónrj j8 XHora estándar de Japónrk uuU Sverdlovskrl }rm (j3 j4 }rn (j6 XHora de verano de Sverdlovskro j8 XHora de Sverdlovskrp uuU Kwajaleinrq }rr (j3 j4 }rs j8 XHora de Kwajaleinrt suUAqtoberu }rv (jA }rw (j6 XAQTST (Aktobe)rx j8 X AQTT (Aktobe)ry uj3 j4 }rz (j6 XHora de verano de Aktober{ j8 XHora de Aktober| uuUKazakhstan_Easternr} }r~ (j3 j4 }r j8 X&Hora estándar de Kazajistán orientalr suUAustralia_CentralWesternr }r (j3 j4 }r (jC XHora de Australia centrorientalr j6 X)Hora de verano de Australia centrorientalr j8 X)Hora estándar de Australia centrorientalr uuU Indochinar }r (j3 j4 }r j8 XHora de Indochinar suUEcuadorr }r (j3 j4 }r j8 XHora de Ecuadorr suUMalayar }r (j3 j4 }r j8 XHora de Malayar suUAqtaur }r (jA }r (j6 X AQTST (Aktau)r j8 X AQTT (Aktau)r uj3 j4 }r (j6 XHora de verano de Aktaur j8 X Hora de Aktaur uuUAmerica_Mountainr }r (j3 j4 }r (jC XHora de las Montañasr j6 XHora de verano de las Montañasr j8 XHora estándar de las Montañasr uuUHawaii_Aleutianr }r (j3 j4 }r (jC XHora de Hawái-Aleutianasr j6 X#Hora de verano de Hawái-Aleutianasr j8 X#Hora estándar de Hawái-Aleutianasr uuUChangbair }r (j3 j4 }r j8 XHora de Changbair suUChiler }r (j3 j4 }r (j6 XHora de verano de Chiler j8 X Hora de Chiler uuUDushanber }r (j3 j4 }r (j6 XHora de verano de Dusambér j8 XHora de Dusambér uuUGeorgiar }r (j3 j4 }r (j6 XHora de verano de Georgiar j8 XHora de Georgiar uuU Philippinesr }r (j3 j4 }r (j6 XHora de verano de Filipinasr j8 XHora de Filipinasr uuUIndonesia_Westernr }r (j3 j4 }r j8 XHora de Indonesia occidentalr suUGreenland_Easternr }r (j3 j4 }r (j6 X&Hora de verano de Groenlandia orientalr j8 XHora de Groenlandia orientalr uuUGMTr }r (j3 j4 }r j8 XHora media de Greenwichr suUMarshall_Islandsr }r (j3 j4 }r j8 XHora de las Islas Marshallr suUUruguayr }r (j3 j4 }r (j6 XHora de verano de Uruguayr j8 XHora de Uruguayr uuU Uzbekistanr }r (j3 j4 }r (j6 XHora de verano de Uzbekistánr j8 XHora de Uzbekistánr uuUColombiar }r (j3 j4 }r (j6 XHora de verano de Colombiar j8 XHora de Colombiar uuU Volgogradr }r (j3 j4 }r (j6 XHora de verano de Volgogrador j8 XHora de Volgogrador uuU Kizilordar }r (j3 j4 }r (j6 XHora de verano de Kizil Ordar j8 XHora de Kizil Ordar uuUAustralia_Westernr }r (j3 j4 }r (jC XHora de Australia occidentalr j6 X&Hora de verano de Australia occidentalr j8 X&Hora estándar de Australia occidentalr uuUAmerica_Pacificr }r (j3 j4 }r (jC XHora del Pacíficor j6 XHora de verano del Pacíficor j8 XHora estándar del Pacíficor uuUBakur }r (j3 j4 }r (j6 XHora de verano de Bakúr j8 X Hora de Bakúr uuUEurope_Easternr }r (j3 j4 }r (j6 X!Hora de verano de Europa del Ester j8 XHora de Europa del Ester uuUBhutanr }r(j3 j4 }rj8 XHora de ButánrsuUBorneor}r(j3 j4 }r(j6 XHora de verano de Borneorj8 XHora de BorneoruuUNepalr}r (j3 j4 }r j8 X Hora de Nepalr suU Galapagosr }r (j3 j4 }rj8 XHora de GalápagosrsuU Lord_Hower}r(j3 j4 }r(jC XHora de Lord Howerj6 XHora de verano de Lord Howerj8 XHora estándar de Lord HoweruuUSurinamer}r(j3 j4 }rj8 XHora de SurinamrsuUAcrer}r(j3 j4 }r(j6 XHora de verano de Acrerj8 X Hora de AcreruuU Venezuelar}r (j3 j4 }r!j8 XHora de Venezuelar"suUIsraelr#}r$(jA }r%j8 X IST (Israel)r&sj3 j4 }r'(jC XHora de Israelr(j6 XHora de verano de Israelr)j8 XHora estándar de Israelr*uuU Hong_Kongr+}r,(j3 j4 }r-(j6 XHora de verano de Hong Kongr.j8 XHora de Hong Kongr/uuUTashkentr0}r1(j3 j4 }r2(j6 XHora de verano de Tashkentr3j8 XHora de Tashkentr4uuUNoronhar5}r6(j3 j4 }r7(j6 X%Hora de verano de Fernando de Noronhar8j8 XHora de Fernando de Noronhar9uuUIndonesia_Easternr:}r;(j3 j4 }r<j8 XHora de Indonesia orientalr=suUAustralia_Centralr>}r?(j3 j4 }r@(jC XHora de Australia centralrAj6 X#Hora de verano de Australia centralrBj8 X#Hora estándar de Australia centralrCuuUAtlanticrD}rE(j3 j4 }rF(jC XHora del AtlánticorGj6 XHora de verano del AtlánticorHj8 XHora estándar del AtlánticorIuuU North_MarianarJ}rK(j3 j4 }rLj8 X$Hora de las Islas Marianas del NorterMsuULankarN}rO(j3 j4 }rPj8 XHora de Sri LankarQsuUEurope_WesternrR}rS(j3 j4 }rT(j6 X#Hora de verano de Europa OccidentalrUj8 XHora de Europa OccidentalrVuuU New_ZealandrW}rX(j3 j4 }rY(jC XHora de Nueva ZelandarZj6 XHora de verano de Nueva Zelandar[j8 XHora estándar de Nueva Zelandar\uuUUrumqir]}r^(j3 j4 }r_j8 XHora de Ürümqir`suUAfrica_Westernra}rb(j3 j4 }rc(j6 X$Hora de verano de África occidentalrdj8 XHora de África occidentalreuuUGuyanarf}rg(j3 j4 }rhj8 XHora de la GuyanarisuUTbilisirj}rk(j3 j4 }rl(j6 XHora de verano de Tbilisirmj8 XHora de TbilisirnuuUMyanmarro}rp(j3 j4 }rqj8 XHora de MyanmarrrsuUSamarars}rt(j3 j4 }ru(j6 XHora de verano de Samararvj8 XHora de SamararwuuUGreenland_Centralrx}ry(j3 j4 }rz(j6 X%Hora de verano de Groenlandia centralr{j8 XHora de Groenlandia centralr|uuUUralskr}}r~(j3 j4 }r(j6 XHora de verano de Oralrj8 X Hora de OralruuUParaguayr}r(j3 j4 }r(j6 XHora de verano de Paraguayrj8 XHora de ParaguayruuUYukonr}r(j3 j4 }r(jC XHora del Yukónrj6 XHora de verano del Yukónrj8 XHora estándar del YukónruuuUerasr}r(Uwider}r(KXantes de CristorKX anno DóminiruU abbreviatedr}r(KXa.C.rKXd.C.ruuu.PK[Bn(n(%site-packages/babel/localedata/to.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q (Uwideq }q (KXkuata 1q KXkuata 2q KXkuata 3qKXkuata 4quUnarrowq}q(KX1qKX2qKX3qKX4quuUformatq}q(Uwideq}q(KXkuata ʻuluakiqKXkuata uaqKX kuata toluqKX kuata fāquU abbreviatedq}q(KXK1q KXK2q!KXK3q"KXK4q#uuuUperiodsq$}q%(Uamq&XHHq'Upmq(XEAq)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X%qFhFqGh7KKqHh9X#,##0%qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9XHH:mm:ssqXUformatqYX%(HH)s:%(mm)s:%(ss)sqZubUfullq[hU)q\}q](h9X HH:mm:ss vq^hYX%(HH)s:%(mm)s:%(ss)s %(v)sq_ubUlongq`hU)qa}qb(h9X HH:mm:ss zqchYX%(HH)s:%(mm)s:%(ss)s %(z)sqdubUshortqehU)qf}qg(h9XHH:mmqhhYX %(HH)s:%(mm)sqiubuU languagesqj}qk(UelqlXlea fakakalisiqmUscoqnXlea fakasikotilaniqoUenqpXlea fakapilitāniaqqUartqrXlea faʻu pē keheqsUrapqtXlea fakalapanuiquUkoqvXlea fakakōleaqwUtklqxXlea fakatokelauqyUitqzXlea fakaʻītaliq{Usvq|Xlea fakasueteniq}Utvlq~Xlea fakatūvaluqUarqXlea fakaʻalepeaqUrarqXlea fakalalotongaqUgaqXlea fakaʻaealaniqUsgnqXlea fakaʻilongaqUtyqXlea fakatahisiqUzhqXlea fakasiainaqUesqXlea fakasepeniqUruqX lea fakalusiaqUnlqXlea fakaholaniqUptqXlea fakapotukaliqUlaqXlea fakalatinaqUnaqX lea fakanauluqUtrqX lea fakatoakeqUtoqX lea fakatongaqUgrcqXlea fakakalisimuʻaqUzxxqX ʻikai ha leaqUmisqX lea kehekeheqUgilqXlea fakakilipasiqUzh_HansqXlea fakasiaina fakangofuaqUhawqXlea fakahauaiʻiqUfrqXlea fakafalanisēqUsmqXlea fakahaʻamoaqUpt_BRqXlea fakapotukali-palāsiliqUdeqXlea fakasiamaneqUzh_HantqXlea fakasiaina tukufakaholoqUfaqXlea fakapēsiaqUniuqX lea fakaniuēqUfiqXlea fakafinilaniqUfjqX lea fakafisiqUjaqXlea fakasiapaniqUheqXlea fakahepelūqUnoqXlea fakanoauēqUmiqX lea fakamauliqUmhqXlea fakamāsoloqUundqXlea taʻeʻiloaqUmsqX lea fakamaleiqUmyqX lea fakapemaquU territoriesq}q(UBEqX PelesiumeqUWFqXʻUvea mo FutunaqUJPqXSiapaniqU011qXʻAfelika hihifoqUBVqX Motu PuvetiqUBWqX PotisiuanaqU014qXʻAfelika hahakeqU015qXʻAfelika tokelauqUBRqX PalāsiliqUBSqXPahamaqU018qXʻAfelika fakatongaqU019qXOngo ʻAmelikaqUBZqXPeliseqURUqXLūsiaqURWqXLuanitāqUTKqXTokelauqUGUqXKuamiqUGSqX(ʻOtumotu Siosia-tonga mo Saniuisi-tongaqUGRqXKalisiqUGYqXKuianaqUGGqXKuenisīqUGDqX KelenatāqU021qXʻAmelika tonga angeqUGBqX PilitāniaqUGMqXKamipiaqU029qXKalipeaqUGIrX SipalālitārUGHrXKanarU013rXʻAmelika lotolotorUWSrXHaʻamoarU419rXʻAmelika fakalatina mo Kalipear U017r XʻAfelika lotolotor UHKr XHongi Kongi SAR Siainar U039rXʻEulope tongarUHNrX HonitulasirUJErXSelusīrU030rXʻĒsia hahakerU034rX ʻĒsia tongarU035rXʻĒsia tongahahakerUPWrXPalaurUPTrXPotukalirUFMrX MikolonisiarUPAr XPanamār!UPFr"XPolinisia fakafalanisēr#UPGr$X Papuaniukinir%UPKr&X Pakisitanir'UPNr(XPitikenir)UEGr*X ʻIsipiter+UZAr,XʻAfelika tongar-UZZr.XPotu fonua taʻeʻiloa pe halar/UZWr0X Simipapuer1UESr2XSepenir3UAQr4X ʻAnetātikar5UHMr6XʻOtumotu Heati mo Makitonalir7UASr8XHaʻamoa fakaʻamelikar9UUSr:XPuleʻanga fakataha ʻAmelikar;UMUr<X Maulitiusir=UMTr>XMalitar?UMWr@XMalauirAUMPrBXʻOtumotu Maliana tokelaurCUMSrDXMoʻungaselatirEUAUrFXʻAositelēliarGUMXrHX MekesikōrIUVUrJXVanuaturKUFRrLX FalanisērMUIOrNX(Potu fonua moana ʻInitia fakapilitāniarOU054rPX MelanisiarQUFIrRXFinilanirSUFJrTXFisirUU057rVXPotu fonua MikolonisiarWU172rXX KomoniuelirYU053rZXʻAositelēlia mo Nuʻusilar[UNLr\XHolanir]UNOr^XNoauēr_UNAr`XNamipiaraUNCrbX Niu KaletoniarcUNFrdXMotu NōfolikireUNGrfXNaisiliargUNZrhX NuʻusilariUNRrjXNaulurkUNUrlXNiuērmU061rnX PolinisiaroUCHrpX SuisilanirqUCNrrXSiainarsUCArtXKānataruUCXrvXMotu KilisimasirwUKErxXKeniaryUKIrzXKilipasir{UKRr|X Kōlea tongar}UKPr~XKōloa tokelaurUSCrXʻOtumotu SeiselirUSBrXʻOtumotu SolomonerUSGrX SingapularUSErXSuētenirU151rXʻEulope hahakerU150rXʻEuloperUDMrXTominikarU155rXʻEulope hihiforU154rXʻEulope tokelaurUDErXSiamanerUMHrXʻOtumotu MāsolorU062rXʻĒsia tongalotolotorUUMrXʻOtumotu siʻi ʻo ʻAmelikarUTVrXTūvalurUTTrXTilinitati mo TopakorUTRrXToakerULKrXSīlonirUCKrXʻOtumotu KukirUTOrXTongarULRrXLaipeliarULSrXLesotorUTFrXPotu fonua tonga fakafalanisērUVArXVatikanirU145rXʻĒsia hihiforU142rXʻĒsiarU143rXʻĒsia lotolotorUAGrXAnitikua mo PalaputarUVGrX!ʻOtumotu Vilikini fakapilitāniarUAIrXAnikuilarUVIrX ʻOtumotu Vilikini fakaʻamelikarUITrXʻĪtalirU003rXʻAmelika tokelaurU002rX ʻAfelikarU001rXMāmanirUIMrX Motu ManirUILrX ʻIsilelirU005rXʻAmelika tongarUINrXʻInitiarU009rX ʻOseaniarUIErX ʻAealanirUQUrXʻEulope fakataharuUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9X d MMM yyyyrhYX%(d)s %(MMM)s %(yyyy)srubUfullrhU)r}r(h9XEEEE d MMMM yyyyrhYX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrhU)r}r(h9X d MMMM yyyyrhYX%(d)s %(MMMM)s %(yyyy)srubUshortrhU)r}r(h9X dd-MM-yyyyrhYX%(dd)s-%(MM)s-%(yyyy)srubuUcurrency_symbolsr}rU time_zonesr}rUscriptsr}r(UHanirXtohinima fakasiainarULatnrXtohinima fakalatinarUHebrrXtohinima fakahepelūrUJpanrXtohinima fakasiapanirUZzzzrXtohinima taʻeʻiloarUCyrlrXtohinima fakalūsiarUArabrXtohinima fakaʻalepearUZxxxrXtohinima taʻetohitohiʻirUZyyyrXtohinima meʻatahar UKorer Xtohinima fakakolear UHansr X!tohinima fakasiaina fakafaingofuar UBrairXtohinima maʻa e kakai kuirUHantrX tohinima fakasiaina fakatukutalarUGrekrXtohinima fakakalisiruUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}rUmonthsr}r(U stand-aloner}rUnarrowr}r(KXSr KXFr!KXMr"KXEr#Kj"Kj Kj KXAr$K j K XOr%K XNr&K XTr'usUformatr(}r)(Uwider*}r+(KXSānualir,KXFēpuelir-KXMaʻasir.KX ʻEpelelir/KXMēr0KXSuner1KXSiulair2KXʻAokosir3K X Sēpitemar4K X ʻOkatopar5K XNōvemar6K XTisemar7uU abbreviatedr8}r9(KXSānr:KXFēpr;KXMaʻar<KXʻEper=KXMēr>KXSunr?KXSiur@KXʻAokrAK XSēprBK XʻOkarCK XNōvrDK XTisrEuuuUcurrency_formatsrF}rGNh,)rH}rI(h/Nh1Kh2KKrJh4h5h5rKh7KKrLh9X ¤ #,##0.00rMh;X¤ rNX-¤ rOrPh>Nh?KKrQubsUdaysrR}rS(U stand-alonerT}rUUnarrowrV}rW(Kj"Kj'KXPrXKj'Kj!Kj'Kj usUformatrY}rZ(Uwider[}r\(KXMōniter]KXTusiter^KXPulelulur_KX Tuʻapulelulur`KXFalaiteraKXTokonakirbKXSāpatercuU abbreviatedrd}re(KXMōnrfKXTusrgKXPulrhKXTuʻariKXFalrjKXTokrkKXSāprluuuU meta_zonesrm}rn(UTongaro}rp(UcommonrqUlongrr}rs(UdaylightrtXhoua fakatonga lotohēruUstandardrvXhoua fakatongarwuuUSamoarx}ry(jqjr}rzjvXhoua fakahaʻamoar{suUTokelaur|}r}(jqjr}r~jvXhoua fakatokelaursuUTuvalur}r(jqjr}rjvXhoua fakatūvalursuU New_Zealandr}r(jqjr}r(UgenericrXhoua fakanuʻusilarjtXhoua fakanuʻusila fakamaamarjvXhoua fakanuʻusila fakasīpingaruuUHawaii_Aleutianr}r(jqjr}rjvXhoua fakahauaʻirsuUWallisr}r(jqjr}rjvXhoua fakaʻuvea mo futunarsuUNiuer}r(jqjr}rjvXhoua fakaniuērsuUTahitir}r(jqjr}rjvXhoua fakatahisirsuUFijir}r(jqjr}r(jtXhoua fakafisi fakamaamarjvX houa fakafisiruuuUerasr}r(Uwider}r(KXki muʻarKXtaʻu ʻo SīsūruU abbreviatedr}r(KXKMrKXTSruUnarrowr}r(KXKāMārKXTāSāruuu.PK[D))(site-packages/babel/localedata/hr_HR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[}bff(site-packages/babel/localedata/en_BE.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)squbUfullqh)q}q(hXHH 'h' mm 'min' ss 's' vq hX"%(HH)s h %(mm)s min %(ss)s s %(v)sq!ubUlongq"h)q#}q$(hX HH:mm:ss zq%hX%(HH)s:%(mm)s:%(ss)s %(z)sq&ubUshortq'h)q(}q)(hXHH:mmq*hX %(HH)s:%(mm)sq+ubuU languagesq,}q-U territoriesq.}q/Udecimal_formatsq0}q1U date_formatsq2}q3(Umediumq4h)q5}q6(hX dd MMM yyyyq7hX%(dd)s %(MMM)s %(yyyy)sq8ubUfullq9h)q:}q;(hXEEEE d MMMM yyyyqh)q?}q@(hX d MMM yyyyqAhX%(d)s %(MMM)s %(yyyy)sqBubUshortqCh)qD}qE(hXdd/MM/yyqFhX%(dd)s/%(MM)s/%(yy)sqGubuUcurrency_symbolsqH}qIU time_zonesqJ}qKUscriptsqL}qMUvariantsqN}qOUnumber_symbolsqP}qQ(UdecimalqRX,qSUgroupqTX.qUuUcurrency_namesqV}qWUmonthsqX}qYUcurrency_formatsqZ}q[Ncbabel.numbers NumberPattern q\)q]}q^(Uexp_precq_NUscaleq`KU frac_precqaKKqbUsuffixqcX ¤qdhdqeUint_precqfKKqghX #,##0.00 ¤qhUprefixqiXqjX-qkqlUexp_plusqmNUgroupingqnKKqoubsUdaysqp}qqU meta_zonesqr}qsUerasqt}quu.PK[D))(site-packages/babel/localedata/pt_BR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll(site-packages/babel/localedata/ka_GE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[(++%site-packages/babel/localedata/zu.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+X h:mm:ss aqJUformatqKX%(h)s:%(mm)s:%(ss)s %(a)sqLubUfullqMhG)qN}qO(h+X h:mm:ss a vqPhKX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqQubUlongqRhG)qS}qT(h+X h:mm:ss a zqUhKX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqVubUshortqWhG)qX}qY(h+Xh:mm aqZhKX%(h)s:%(mm)s %(a)sq[ubuU languagesq\}q](Uguq^X IsiGujaratiq_Ugdq`XI-Scots GaelicqaUgaqbX Isi-IrishiqcUgnqdXGuraniqeUglqfX Isi-GalashiyaqgUlaqhX IsiLathiniqiUlnqjXLingalaqkUloqlXLaothianqmUtrqnX IsiThekishiqoUlvqpX Isi-LatvianqqUltqrXIsi-LithuanianqsUtkqtXumuntu wase Turkmenistan.quUthqvXIsiThayiqwUtiqxX IsiTigrinyaqyUteqzX IsiTheluguq{Upt_PTq|XIsiPotukezi (Ephothugali)q}Ufilq~X IsiThagalogiqUtaqX IsiThamilqUyiqXulimu olwi YidishqUpt_BRqXIsiputukezi (Brazil)qUdeqX isiJalimaniqUdaqX IsiDenishiqUelqXIsiGrekiqUeoqX Isi-EsperantoqUenqXisiNgisiqUeuqX Isi-BasqueqUetqXIsi-EsistoniyaqUesqX isiSpeyiniqUruqX IsiRashiyaqUroqX IsiRomaniqUbnqX IsiBhengaliqUbeqXIsiBhelarashiyaniqUbgqX Isi-BulgariaqUukqX Isi-UkrainqUjvqX IsiJavanisiqUbhqX IsiBhihariqUbrqXisihlobo sase BritainqUbsqXIsiBhosiniyaniqUjaqX IsiJaphaniqUocqX Isi-OsithaniqUtwqXTwiqUtlhqX IsiKlingoniqUorqXOriyaqUxhqXisiXhosaqUcaqX IsiKhathalaniqUcyqX IsiWelshiqUcsqX Isi-CzechqUpsqXPashtoqUptqX IsiPotukeziqUpaqX IsiPhunjabiqUviqX IsiVietnamiseqUplqX IsiPholisiqUhyqXArmenianqUhrqX Isi-CroatiaqUhuqX IsiHangariqUhiqXisiHindiqUheqX IsiHebheruqUuzqX Isi-UzibhekiqUmlqX IsiMalayamiqUmnqX MongolianqUmkqXIsiMakhedoniyaqUurqXIsi-UduqUmtqX IsiMalithizeqUmsqX IsiMalayiqUmrqX IsiMarathiqUugqXUighurqUafqXisiBhunuqUswqX isiSwahiliqUisqX Isi-IcelandicqUamqXIsi-AmaharikhiqUitqX isItalianqUsvqX IsiSwidishiqUasqXAssameseqUarqX isi-AlabhuqUsuqX IsiSundaniziqUzuqXisiZuluqUiaqXIzilimi ezihlangeneqUazqXIsi-AzebhayijaniqUieqXIzilimuqUidqX Isi-IndonesiaqUnlqX Isi-DutchqUnnrXIsiNowejiyani (Nynorsk)rUnorX IsiNoweyirUnerX IsiNepalirUfrrX isiFulentshirUfyrX IsiFriziyanir Ufar X IsiPheshiyanir Ufir X isiFinnishr UkyrXKyrgyzrUforXIsifarorUkarX IsiJojiyanirUsrrX Isi-SebhiyarUsqrX Isi-AlbaniarUkorX IsiKoriyarUknrXIkhanadarUkmrX CambodianrUstrXisiSuthurUskr X IsiSlovakir!Usir"X IsiSinhaleser#Ushr$XSerbo-Croatianr%Usor&XSomalir'Ukur(Xulimu lwama Kudishir)Uslr*XIsiSlovakiyanir+Usar,XSanskritr-Usdr.XSindhir/uU territoriesr0}r1Udecimal_formatsr2}r3Nh)r4}r5(h!Nh#Kh$KKr6h&h'h'r7h)KKr8h+X #,##0.###r9h-h'h.r:h0Nh1KKr;ubsU date_formatsr<}r=(Umediumr>hG)r?}r@(h+X d MMM yyyyrAhKX%(d)s %(MMM)s %(yyyy)srBubUfullrChG)rD}rE(h+XEEEE dd MMMM yyyyrFhKX!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)srGubUlongrHhG)rI}rJ(h+X d MMMM yyyyrKhKX%(d)s %(MMMM)s %(yyyy)srLubUshortrMhG)rN}rO(h+X yyyy-MM-ddrPhKX%(yyyy)s-%(MM)s-%(dd)srQubuUcurrency_symbolsrR}rSUZARrTXRrUsU time_zonesrV}rWUscriptsrX}rYUvariantsrZ}r[Unumber_symbolsr\}r](Udecimalr^X,r_Ugroupr`X rauUcurrency_namesrb}rcUmonthsrd}re(U stand-alonerf}rg(Uwiderh}ri(KX uJanuwarirjKX uFebruwarirkKXuMashirlKXu-AprelirmKXuMeyirnKXuJuniroKXuJulayirpKXuAgastirqK X uSepthembarrK X u-OkthobarsK XuNovembartK XuDisembaruuUnarrowrv}rw(KXJrxKXFryKXMrzKXAr{KjzKjxKjxKj{K XSr|K XOr}K XNr~K XDruuUformatr}r(Uwider}r(KXJanuwarirKX FebruwarirKXMashirKXAprelirKXMeyirKXJunirKXJulayirKXAgastirK X SepthembarK XOkthobarK XNovembarK XDisembaruU abbreviatedr}r(KXJanrKXFebrKXMasrKXAprrKXMeyrKXJunrKXJulrKXAgarK XSeprK XOktrK XNovrK XDisruuuUcurrency_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKrh+X ¤#,##0.00rh-X¤rX-¤rrh0Nh1KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjzKXBrKXTrKj|KXHrKjzKj|usUformatr}r(Uwider}r(KX MsombulukorKX LwesibilirKX LwesithathurKXuLwesinerKX LwesihlanurKXMgqibelorKXSontoruU abbreviatedr}r(KXMsorKXBilrKXTharKXSinrKXHlarKXMgqrKXSonruuuU meta_zonesr}rUerasr}r(Uwider}r(KXBCrKXADruU abbreviatedr}r(KXBCrKXADruuu.PK[!  (site-packages/babel/localedata/se_FI.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}q(UelqXelqUangqXangqUisqXisqUenqXenqUcsqXcsq Uetq!Xetq"Uapaq#Xapaq$Uesq%Xesq&Uruq'Xruq(Unnq)Xnnq*Ufiuq+Xfiuq,Unbq-Xnbq.Usmsq/Xsmsq0Usmnq1Xsmnq2Usmjq3Xsmjq4Usmiq5Xsmiq6Usmaq7Xsmaq8Ubeq9Xbeq:Ufrq;XfrqUdaq?Xdaq@UfiqAXfiqBUgemqCXgemqDUfoqEXfoqFUnoqGXnoqHUsvqIXsvqJUseqKXseqLuU territoriesqM}qN(U151qOXNuorta-EurohpáqPU150qQXEurohpaqRUFRqSXFRqTUBGqUXBGqVU155qWX Oarji-EurohpaqXU154qYX Davvi-EurohpaqZUBEq[XBEq\UHRq]XHRq^UCHq_XCHq`UDEqaXDEqbUJPqcXJPqdUGRqeXGRqfU011qgXOarji-AfrihkáqhUZAqiXZAqjU039qkXMátta-EurohpaqlU014qmX014qnU015qoXDavvi-AfrihkáqpUBRqqXBRqrU017qsXGaska-AfrihkáqtUFIquXFIqvU030qwX Nuorta-ÁsiaqxUBYqyXBYqzU034q{X Mátta-Ásiaq|UCNq}XCNq~UPSqXPSqULBqXLBqUNOqXNOqUTLqXTLqUTRqXTRqUNZqXNZqULVqXLVqUIQqXIQqULTqXLTqUMVqXMVqUNLqXNLqUPHqXPHqUFOqXFOqUPLqXPLqU145qX Oarji-ÁsiaqU143qX Gaska-ÁsiaqUCMqXCMqURUqXRUqUEEqXEEqUISqXISqUIRqXIRqUITqXITqUSJqXSJqU002qXAfrihkáqU021qXDavvi-AmerihkáqUATqXATqU005qXMátta-AmerihkáqUAXqXAXqUGLqXGLqUIEqXIEqUTDqXTDqUESqXESqUSRqXSRqUUSqXUSqUMGqXMGqUMAqXMAqUCZqXCZqUMYqXMYqUMHqXMHqUMKqXMKqUSKqXSKqUKRqXKRqUSIqXSIqUKPqXKPqUMPqXMPqUMRqXMRqUDKqXDKqUAUqXAUqUHUqXHUqUSEqXSEquUdecimal_formatsq}qU date_formatsq}qUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}q(UXAGqXXAGqUNOKqXNOKqUSEKqXSEKqUXAUqXXAUqUFIMqXFIMquUmonthsq}qUformatq}rU abbreviatedr}r(KX ođđajagerKXguovvarKXnjukčarKXcuoŋorKXmiesserKXgeasserKXsuoidner KXborger K Xčakčar K Xgolggotr K Xskábmar K XjuovlarussUcurrency_formatsr}rUdaysr}r(U stand-aloner}rUnarrowr}r(KXMrKXDrKXGrKjKXBrKXLrKXSrusUformatr}r(Uwider}r (KXmåantar!KXdäjstar"KX gaskevahkoer#KXdåarstar$KX bearjadahker%KX laavadahker&KXaejleger'uU abbreviatedr(}r)(KX2r*KX3r+KX4r,KX5r-KX6r.KX7r/KX1r0uuuU meta_zonesr1}r2Uerasr3}r4(Uwider5}r6KXBCEr7sU abbreviatedr8}r9KXBCEr:suu.PK[99(site-packages/babel/localedata/pa_PK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[!D%site-packages/babel/localedata/sw.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXrobo ya kwanzaq KX robo ya piliq KX robo ya tatuqKX robo ya nnequU abbreviatedq}q(KXR1qKXR2qKXR3qKXR4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX kigujaratiqBUgdqCX kiskotlandiqDUgaqEXkiairishqFUgnqGXguaraniqHUglqIX kigalisiaqJUlaqKXkirumiqLUlnqMX kilingalaqNUloqOXkilaosiqPUtrqQXkiturukiqRUlvqSXkilatviaqTUltqUX kilithuaniaqVUtkqWX wataki weumeqXUthqYX kithailandqZUtiq[X kitigrinyaq\Uteq]Xkiteluguq^Upt_PTq_Xkireno (ureno)q`UfilqaX kitagalogqbUtaqcXkitamilqdUyiqeXkiyidishqfUpt_BRqgXkireno (brazil)qhUdeqiX kijerumaniqjUdaqkX kidenmarkiqlUelqmXkigirikiqnUeoqoX kiesperantoqpUenqqX kiingerezaqrUzhqsXkichinaqtUeuquXkibaskiqvUetqwX kiestoniaqxUesqyX kihispaniaqzUruq{Xkirusiq|Uroq}X kiromaniaq~UbnqXkibengali; kibanglaqUbeqX kibelarusiqUbgqX kibulgariaqUukqX kiukraniaqUjvqXkijavaqUbhqXkibihariqUbrqXkibretonqUbsqXkibosniaqUjaqXkijapaniqUocqX kiositaniqUtwqXkitwiiqUtlhqX kiklingonqUorqXkioriyaqUxhqXkikhosaqUcaqX kikatalanqUcyqXkiwelshqUcsqXkichekiqUpsqXkipashtoqUptqXkirenoqUpaqX kipunjabiqUviqX kivietnamqUplqX kipolandiqUhyqXmuarmeniqUhrqX kikroeshiaqUhuqX kihungariqUhiqXkihindiqUheqXkiyahudiqUuzqXkiuzbekiqUmlqX kimalayalamqUmnqX kimongoliaqUmkqX kimasedoniaqUurqXkiurduqUmtqXkimaltaqUmsqX kimalaysiaqUmrqX kimarathiqUugqXombwaqUafqX kiafrikansqUswqX KiswahiliqUisqX kiaislandiqUamqX kiamharikiqUitqX kiitalianoqUsvqXkiswedenqUasqXkubafuqUarqXkiarabuqUkmqX kicambodiaqUzuqXkizuluqUiaqX kiinterlinguaqUazqX kiazabaijaniqUieqXlugha ya kisayansiqUidqX kiindonesiaqUnlqX kiholanziqUnoqXkinorweiqUneqXkinepaliqUfrqX kifaransaqUfyqXkifrisiaqUfaqXkiajemiqUfiqX kifinlandiqUkyqXkugiziqUfoqXkifaroeqUkaqXkijiojiaqUsrqXkiserbiaqUsqqX kialbaniaqUkoqXkikoreaqUknqX kikannadaqUsuqXkinubirUstrXsesothorUskrX kislovakiarUsirX kisinhalirUshrXkiserbia-kroeshiarUsor Xkisomalir Ukur Xkikurdir Uslr X kisloveniarUsarX kisanskritirUsdrXmsindhiruU territoriesr}r(UBErXUbelgijirUFRrXUfaransarUDMrXDominikarUDJrXJibutirUBArXBosnia na HerzegowinarUDOrXJamhuri ya Dominikanr UHRr!XKroatiar"UDEr#XUdachir$UJPr%XUjapanir&UVCr'XSaint Vincent na Grenadinesr(UHUr)XHungariar*UJMr+XJamaikar,UZAr-XAfrika ya Kusinir.UMHr/XVisiwa vya Marshallr0UUSr1XMuungano wa Nchi za Amerikar2UBRr3XBrazilir4UBSr5XVisiwa vya Bahamar6UCOr7XKolombiar8UUYr9XUrugwair:UDKr;X Udenmarkir<UISr=XBarafur>UNIr?X Nikaraguar@UNLrAXUholanzirBUCMrCXKamerunrDUPTrEXUrenorFUNOrGXUnorwerHUTTrIXTrinidad na TobagorJUPYrKXParagwairLUTRrMXUturukirNUTOrOXKitongarPUTLrQXTimor ya MasharikirRULUrSX LuksemburgrTUPGrUXPapua Guinea MpyarVUNPrWXNepalirXUPHrYXFilipinorZUGQr[XGuinea ya Ikwetar\UEGr]XMisrir^UVAr_XVatikanor`UCIraXPwani ya PemberbUCHrcXUswisirdUAEreX#Muugano wa Falme za Nchi za KiaraburfUCNrgXUchinarhUAGriXAntigua na BarbudarjURUrkXUrusirlUIQrmXIrakirnUYEroXYemenirpUCArqXKanadarrUIRrsXUajemirtUCGruXKongorvUCFrwXJamhuri ya Afrika ya KatirxUECryXEkvadorzUITr{X Uitalianir|UCZr}XJamhuri ya Czechr~UARrXAjentinarUGBrX UingerezarUINrXUhindirUCSrXSerbiya da MontenegrorUETrXUhabeshirUCVrX Rasi VerderUESrX UhispaniarUMArXMorokorUMCrXMonakorUKErXKenyarUKHrX KampuchearUKNrXSaint Kitts na NevisrUKMrXVisiwa vya KomororUSTrXSao Tome na PrinciperUKRrXKorea ya KusinirUTDrXChadirUKPrXKorea ya KaskazinirUSOrXSomalirUTZrXTanzaniarUSCrXVisiwa vya ShelishelirUSBrXVisiwa vya SolomonrUSArX Arabuni SaudirUMZrXMsumbijirUMYrXMalasyarUMXrXMeksikorUSErXUswidirUILrXUyahudiruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X yyyy MMM drh.X%(yyyy)s %(MMM)s %(d)srubUfullrh))r}r(h,XEEEE, yyyy MMMM ddrh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srubUlongrh))r}r(h,X yyyy MMMM drh.X%(yyyy)s %(MMMM)s %(d)srubUshortrh))r}r(h,Xyy/MM/ddrh.X%(yy)s/%(MM)s/%(dd)srubuUcurrency_symbolsr}r(UTZSrXTShrUKESrXKShruU time_zonesr}rUscriptsr}rUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}rjXShilingi ya TanzaniarsUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KXJanuarirKXFebruarirKXMachirKXAprilirKXMeirKXJunirKXJulairKXAgostirK XSeptembarK XOktobarK XNovembarK XDesembaruU abbreviatedr}r(KXJanrKXFebrKXMacrKXAprrKXMeirKXJunrKXJulrKXAgor K XSepr K XOktr K XNovr K XDesr uuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrX ¤rjrUint_precrKKrh,X #,##0.00 ¤rUprefixrXrX-rr Uexp_plusr!NUgroupingr"KKr#ubsUdaysr$}r%(U stand-aloner&}r'Unarrowr(}r)(KjKjKjKjKjKjKjusUformatr*}r+(Uwider,}r-(KXJumatatur.KXJumanner/KXJumatanor0KXAlhamisir1KXIjumaar2KXJumamosir3KXJumapilir4uU abbreviatedr5}r6(KXJttr7KXJnnr8KXJtnr9KXAlhr:KXIjur;KXJmor<KXJpir=uuuU meta_zonesr>}r?UAfrica_Easternr@}rA(UcommonrBUlongrC}rDUstandardrEXSaa za Africa MasharikirFsusUerasrG}rH(UwiderI}rJ(KXKabla ya KristorKKXBaada ya KristorLuU abbreviatedrM}rN(KXKKrOKXBKrPuuu.PK[:KK%site-packages/babel/localedata/ta.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX#1ஆம் காலாண்டுq KX#2ஆம் காலாண்டுq KX#3ஆம் காலாண்டுqKX#4ஆம் காலாண்டுquU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX காலைqUpmqX மாலைquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X h:mm:ss aqAUformatqBX%(h)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X h:mm:ss a vqGhBX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X h:mm:ss a zqLhBX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xh:mm aqQhBX%(h)s:%(mm)s %(a)sqRubuU languagesqS}qT(Uzh_HantqUXமரபு சீனம்qVUguqWXகுஜராத்திqXUgdqYX+ஸ்காட்ஸ் காலெக்qZUgaq[Xஐரிஷ்q\Ugnq]Xகுரானிq^Uglq_Xகெலிஸியன்q`UlaqaXலாதின்qbUlnqcXலிங்காலாqdUloqeXலோத்தியன்qfUttqgXடாடர்qhUtrqiXடர்கிஷ்qjUtsqkXஸோங்காqlUlvqmX6லேட்வியன் (லேட்டிஷ்)qnUtoqoXடோங்காqpUltqqX!லுத்தேனியன்qrUtkqsXடர்க்மென்qtUthquX தாய்qvUtiqwXடிக்ரின்யாqxUtgqyXதாஜிக்qzUteq{Xதெலுங்குq|Upt_PTq}XWபோர்த்துகீசியம் (போர்ச்சுக்கல்)q~UfilqXஃபிலிபினோqUtaqXதமிழ்qUyiqXஈத்திஷqUpt_BRqXMபோர்த்துக்கீசியம்(பிரேசில்)qUdeqXஜெர்மன்qUdaqXடானிஷ்qUdzqXபுடானிqUstqXஷெஸ்ஸோதோqUquqXகியுசாqUelqXகிரேக்கம்qUeoqXஎஸ்பரேன்டோqUenqXஆங்கிலம்qUzhqXசீனம்qUzh_HansqXஎளிய சீனம்qUzaqXஜுவாங்qUukqXஉக்ரேனியன்qUeuqXபஸ்க்qUetqXஎஸ்டோனியன்qUesqXஸ்பேனிஷ்qUruqXரஷியன்qUrwqX'கின்யர்வென்டாqUrmqX+ரைட்டோ-ரோமென்ஸ்qUrnqXகிருந்திqUroqXரோமேனியன்qUbnqXவங்காளம்qUbeqXபைலோருஷ்ன்qUbgqXபல்கேரியன்qUbaqXபாஷ்கிர்qUwoqXஒலோப்qUjvqXஜாவானீஸ்qUboqXதிபெத்துqUbhqXபிஹாரிqUbiqXபிஸ்லாமாqUbrqXபிரிடன்qUbsqXபோஸ்னியன்qUjaqXஜப்பானீஸ்qUomqXஒரோம (அபன்)qUocqXஆகிடியன்qUtwqXத்திவிqUtlhqXகிளிங்கன்qUorqXஒரியாqUxhqX ஹோஷாqUcoqXகார்சியன்qUcaqXகாடலான்qUcyqXவெல்ஷ்qUcsqX செக்qUpsqX'பேஷ்டோ (புஷ்டோ)qUkokqXகொங்கனிqUptqX$போர்த்துகீஸ்qUtlqXடாகாலோக்qUpaqXபஞ்சாபிqUviqX!வியட்நாமிஸ்qUplqXபோலிஷ்qUhyqXஆர்மேனியன்qUhrqXகரோஷியன்qUiuqXஇனுகிடட்qUhuqXஹங்கேரியன்qUhiqXஇந்திqUhaqX ஹொஸாqUheqXஹுப்ருqUmgqXமலகெஸிqUuzqXஉஸ்பெக்qUmlqXமலையாளம்qUmoqX!மோல்டேவியன்qUmnqXமங்கோலியன்rUmirX மோரிrUikrXஇனுபெக்rUmkrX$மெக்கடோனியன்rUurrXஉருதுrUmtr Xமால்டிஸ்r Umsr Xமலாய்r Umrr Xமராத்திrUugrXயுகுர்rUmyrXபர்மிஸ்rUaarXஅபார்rUabrXஅப்காஸின்rUssrXஷிஸ்வாதிrUafrXஆப்ரிகன்ஸ்rUtnrXஸெட்ஸ்வானாrUswrXசுவாஹிலிrUisrX!ஐஸ்லென்டிக்r Uamr!Xஅம்ஹாரிக்r"Uitr#Xஇத்தாலியன்r$Usvr%Xஷீவிடிஸ்r&Uiar'X/இன்டர்லிங்குவா [ia]r(Uasr)Xஅஸ்ஸாமிr*Uarr+X அரபுr,Usur-Xசுடானீஸ்r.Uzur/X ஜூலூr0Uayr1Xஅயமராr2Uazr3X$அசர்பாய்ஜானிr4Uier5X*இன்டர்லிங்குவாr6Uidr7X$இந்தோனேஷியன்r8Uskr9Xஸ்லோவெக்r:Unlr;Xடச்சுr<Uyor=Xயோருப்பாr>Unnr?XBநார்வீஜியன் (நைநோர்ஸ்க்)r@UnorAX!நார்வேகியன்rBUnarCX நாரூrDUnerEXநேப்பாலிrFUvorGXஒலபுக்rHUfrrIXபிரெஞ்சுrJUsmrKXஸெமோன்rLUfyrMXபிரிஷியன்rNUfarOXபர்ஸியன்rPUfirQXபின்னிஷ்rRUfjrSX பிஜிrTUsarUX!சமஸ்கிருதம்rVUforWXபைரோஸிrXUkarYX!ஜியோர்ஜியன்rZUkkr[Xகசாக்r\Usrr]Xசர்பியன்r^Usqr_Xஅல்பெனியன்r`UkoraXகொரியன்rbUknrcXகன்னடம்rdUkmreXகம்போடியன்rfUklrgX*கிரின்லென்டிக்rhUksriXகாஷ்மிரிrjUsirkXசிங்களம்rlUshrmX.செர்போ-க்ரோஷியன்rnUsoroXசோமாலிrpUsnrqX ஷோனாrrUkursXகுர்திஷ்rtUslruX$ஸ்லோவினேயின்rvUkyrwXகிர்கிஷ்rxUsgryXசென்க்ரோrzUsdr{Xசிந்திr|uU territoriesr}}r~(UBDrXபங்களாதேஷ்rUBErXபெல்ஜியம்rUBFrX"பர்கினோ பாஸோrUBGrXபல்கேரியாrUVErXவெனஜுவேலாrUBArX=போஸ்னியா ஹெர்ஸிகோவினாrUBBrXபார்படோஸ்rUBMrXபெர்முடாrUBNrXபுரூனேய்rUBOrXபொலிவியாrUBHrXபஹ்ரைன்rUBIrXபுருண்டிrUBJrXபெனின்rUBTrXபூடான்rUJMrXஜமாய்க்காrU013rX.மத்திய அமெரிக்காrU014rX1கிழக்கு ஆப்ரிக்காrUBRrXபிரேஸில்rUBSrXபஹாமாஸ்rUBYrXபெலாரூஸ்rUBZrXபெலிஸ்rURUrXரஷ்யாrUTLrX(கிழக்கு திமோர்rUTMrX0துர்க்மெனிஸ்தான்rUTJrX$தாஜிகிஸ்தான்rUROrXருமேனியாrUGWrX%கினி-பிஸ்ஸாவ்rUGTrX$குவாத்தாமாலாrUGRrXகிரீஸ்rUGQrX7ஈக்குவிடோரியல் கினிrUJPrXஜப்பான்rUGYrXகயானாrUGErXஜார்ஜியாrUGDrXகிரனெடாrUGBrX1பிரிடிஷ் கூட்டரசுrUGArXகாபோன்rUGNrX கினிrUGMrXகாம்பியாrU029rXகரீபியன்rUGHrX கானாrUOMrXஓமான்rUTNrXதுனிசியாrUBWrXபோட்ஸ்வானாrUWSrXசமோவாrUHRrXகுரோசியாrUHTrXஹெய்திrUHUrXஹங்கேரிrUHNrXஹாண்டுராஸ்rU142rXஆசியாrU030rX%கிழக்கு ஆசியாrU143rX"மத்திய ஆசியாrUPTrX'போர்ச்சுக்கல்rUPYrXபாரகுவேrUPArXபணாமாrUPGrX1பாப்புவா-நியூகினிrUPErX பெருrUPKrXபாகிஸ்தான்rUPHrX$பிலிப்பைன்ஸ்rUPLrXபோலந்துrUEErXஎஸ்டோனியாrUEGrXஎகிப்துrUZArX(தென் ஆப்ரிக்காrUECrXஈக்வடார்rUITrXஇத்தாலிrUVNrXவியட்நாம்rUSBrX(சாலமன் தீவுகள்rUETrX!எதியோப்பியாrUZWrXஜிம்பாப்வேrUESrXஸ்பெயின்rUMDr Xமால்டோவாr UMAr Xமொரோக்கோr UMCr Xமொனாக்கோrUUZrX'உஸ்பெகிஸ்தான்rUMMrXமியான்மார்rUMLrX மாலீrUMNrXமங்கோலியாrUMKrXமசெடோணியாrUMUrXமோரிசியஸ்rUMTrXமால்டாrUMWrXமலாவீrUMVrXமாலத்தீவுr UMYr!Xமலேஷியாr"UMXr#Xமெக்சிகோr$UILr%Xஇஸ்ரேல்r&UFRr'Xபிரான்ஸ்r(UFIr)Xபின்லாந்துr*UFJr+X பிஜிr,U053r-X]ஆஸ்திரேலியா மற்றும் நியூசிலாந்துr.UNIr/Xநிகாராகுவாr0UNLr1X!நெதர்லாந்துr2UNOr3Xநார்வேr4UNAr5Xனாமீபியாr6UVUr7Xவனுவாட்டுr8UNZr9X$நியூசிலாந்துr:UNPr;Xநேபாளம்r<UNRr=X நௌருr>UCKr?X"குக் தீவுகள்r@UCIrAXஐவரி கோஸ்ட்rBUCHrCX-ஸ்விட்சர்லாந்துrDUCOrEXகொலம்பியாrFUCNrGX சீனrHUCMrIXகேமரூன்rJUCLrKX சிலிrLUCArMX கனடாrNUCGrOXகாங்கோrPUCFrQXJமத்திய ஆப்ரிக்கக் குடியரசுrRUCDrSX-காங்கோ - கின்சாசாrTUCZrUX%செக் குடியரசுrVUCYrWXசைப்ரஸ்rXUCXrYX.கிறிஸ்துமஸ் தீவுrZUCRr[Xகோஸ்டாரிகாr\UCVr]Xகேப் வெர்டேr^UCUr_Xகியூபாr`USYraXசிரியாrbUKGrcX$கிர்கிஸ்தான்rdUKEreXகென்யாrfUSRrgXசூரினாம்rhUKIriXகிரிபடிrjUKHrkXகம்போடியாrlUSVrmX%எல் சால்வடார்rnUKMroXகோமரோஸ்rpUSKrqXஸ்லோவாகியாrrUKRrsXதென் கொரியாrtUSIruXஸ்லோவேனியாrvUKPrwXவட கொரியாrxUKWryXகுவைத்துrzUSMr{Xசான்மெரினோr|UKZr}Xகஜகஸ்தான்r~USArX%சவூதி அரேபியாrUSGrX!சிங்கப்பூர்rUSErXஸ்வீடன்rU151rX+கிழக்கு ஐரோப்பாrUDOrX4டொமினிகன் குடியரசுrUDMrXடொமினிகாrUDJrXஜிபௌடிrUDKrXடென்மார்க்rUDErXஜெர்மன்rUYErXயேமன்rUDZrXஅல்ஜீரியாrUUSrXGஐக்கிய அமெரிக்கா குடியரசுrUUYrXஉருகுவேrULBrXலெபனான்rULArXலாவோஸ்rUTVrXதுவாலூrUTWrXதைவான்rUTTrX1திரினிடாட் தொபாகோrUTRrXதுருக்கிrULKrXஇலங்கைrULIrX*லிச்டெண்ஸ்டீன்rULVrXலாட்வியாrUTOrXதொங்காrULTrXலிதுவேனியாrULUrX'லக்ஸ்சம்பர்க்rULRrXலைபீரியாrULSrXலெசோதோrUTHrXதாய்லாந்துrUTDrX சாட்rULYrXலிப்யாrUVArXவாடிகன்rUAErX>ஐக்கிய அரபு கூட்டாட்சிrUADrXஅன்டோராrUAGrX4ஆன்டிகுவா பார்புடாrUAFrX'ஆப்கானிஸ்தான்rUIQrXஇராக்rUISrXஐஸ்லாந்துrUIRrXஈரான்rUAMrXஆர்மீனியாrUALrXஅல்பேனியாrUAOrXஅங்கோலாrUAQrX!அன்டார்டிகாrU002rXஆப்ரிக்காrUASrX(அமெரிக்க சமோவாrUARrX!அர்ஜெண்டினாrUAUrX!ஆஸ்திரேலியாrUATrXஆஸ்திரியாrUINrXஇந்தியாrUAXrX(ஆலந்து தீவுகள்rUAZrXஅஜர்பைஜான்rUIErXஅயர்லாந்துrUIDrX!இந்தோனேஷியாrUJOrXஜொர்டான்rUUArXஉக்ரைன்rUQArXகாடார்ruUdecimal_formatsr}rNh )r}r(h#Nh$Kh%KKrh'h/h/rh*KKrh,X #,##,##0.###rh.h/h0rh2Nh3KKrubsU date_formatsr}r(Umediumrh>)r}r(h,X dd-MM-yyyyrhBX%(dd)s-%(MM)s-%(yyyy)srubUfullrh>)r}r(h,XEEEE d MMMM yyyyrhBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrh>)r}r(h,X d MMMM yyyyrhBX%(d)s %(MMMM)s %(yyyy)srubUshortrh>)r }r (h,Xd-M-yyr hBX%(d)s-%(M)s-%(yy)sr ubuUcurrency_symbolsr }rUINRrXரூrsU time_zonesr}r(UAmerica/North_Dakota/Centerr}rUcityrXசென்டர்rsUAmerica/Indianapolisr}rjX-இந்தியானாபோலிஸ்rsUAmerica/New_Yorkr}rjXநியூயார்க்rsUPacific/Easterr}rjXஈஸ்டர்rsU Asia/Jakartar }r!jXஜகார்த்தாr"sUAmerica/Cambridge_Bayr#}r$jX+கேம்பிரிட்ஜ் பேr%sU Asia/Jayapurar&}r'jXஜெயபூராr(sUAmerica/Denverr)}r*jXதேன்வர்r+sUAmerica/Los_Angelesr,}r-jX%லாஸ் ஏஞ்சல்ஸ்r.sUAmerica/Phoenixr/}r0jXஃபோனிக்ஸ்r1sUAustralia/Brisbaner2}r3jXபிரிஸ்பேன்r4sUAmerica/Campo_Grander5}r6jX+கேம்போ கிராண்டேr7sUAmerica/Chicagor8}r9jXசிகாகோr:suUscriptsr;}r<Uvariantsr=}r>Unumber_symbolsr?}r@Ucurrency_namesrA}rBUmonthsrC}rD(U stand-alonerE}rFUnarrowrG}rH(KX1rIKX2rJKX3rKKX4rLKX5rMKX6rNKX7rOKX8rPK X9rQK X10rRK X11rSK X12rTusUformatrU}rV(UwiderW}rX(KXஜனவரிrYKXபிப்ரவரிrZKXமார்ச்r[KXஏப்ரல்r\KXமேr]KX ஜூன்r^KX ஜூலைr_KXஆகஸ்ட்r`K Xசெப்டம்பர்raK Xஅக்டோபர்rbK Xநவம்பர்rcK Xடிசம்பர்rduU abbreviatedre}rf(KXஜன.rgKX பிப்.rhKX மார்.riKX ஏப்.rjKXமேrkKX ஜூன்rlKX ஜூலைrmKXஆக.rnK X செப்.roK X அக்.rpK Xநவ.rqK X டிச.rruuuUcurrency_formatsrs}rtNh )ru}rv(h#Nh$Kh%KKrwh'h/h/rxh*KKryh,X¤ #,##,##0.00rzh.X¤ r{X-¤ r|r}h2Nh3KKr~ubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjJKjKKjLKjMKjNKjOKjIusUformatr}r(Uwider}r(KXதிங்கள்rKXசெவ்வாய்rKXபுதன்rKXவியாழன்rKXவெள்ளிrKX சனிrKXஞாயிறுruU abbreviatedr}r(KXதிrKXசெrKXபுrKXவிrKXவெrKXசrKXஞாruuuU meta_zonesr}rUIndiar}r(UcommonrUlongr}rUstandardrX+இந்திய நேரப்படிrsusUerasr}r(Uwider}r(KX7கிறிஸ்துவுக்கு முன்rKXஅனோ டோமினிruU abbreviatedr}r(KX கிமுrKX கிபிruuu.PK[T1OO(site-packages/babel/localedata/es_NI.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}q(Udecimalq X.q Ugroupq X,q uU week_dataq }qU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[]Z(||(site-packages/babel/localedata/de_LU.datnu[}q(Ucurrency_symbolsq}qULUFqXFqsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q U week_dataq }q (Umin_daysq KU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[D))(site-packages/babel/localedata/sh_YU.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll(site-packages/babel/localedata/en_UM.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[D))(site-packages/babel/localedata/sh_CS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[&site-packages/babel/localedata/trv.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}q(U stand-aloneq}qUnarrowq }q (KX1q KX2q KX3q KX4qusUformatq}q(Uwideq}q(KXmnprxanqKXmndhaqKXmntruqKXmnspatquU abbreviatedq}q(KXmn1qKXmn2qKXmn3qKXmn4quuuUperiodsq}q(UamqX Brax kndaaxq Upmq!X Baubau kndaaxq"uUscientific_formatsq#}q$Ncbabel.numbers NumberPattern q%)q&}q'(Uexp_precq(KKq)Uscaleq*KU frac_precq+KKq,Usuffixq-Xq.h.q/Uint_precq0KKq1Upatternq2X#E0q3Uprefixq4h.X-q5q6Uexp_plusq7Ugroupingq8MMq9ubsUpercent_formatsq:}q;Nh%)q<}q=(h(Nh*Kdh+KKq>h-X%q?h?q@h0KKqAh2X#,##0%qBh4h.h5qCh7Nh8KKqDubsU week_dataqE}qF(Umin_daysqGKU weekend_startqHKU first_dayqIKU weekend_endqJKuU time_formatsqK}qL(UmediumqMcbabel.dates DateTimePattern qN)qO}qP(h2XHH:mm:ssqQUformatqRX%(HH)s:%(mm)s:%(ss)sqSubUfullqThN)qU}qV(h2X HH:mm:ss vqWhRX%(HH)s:%(mm)s:%(ss)s %(v)sqXubUlongqYhN)qZ}q[(h2X HH:mm:ss zq\hRX%(HH)s:%(mm)s:%(ss)s %(z)sq]ubUshortq^hN)q_}q`(h2XHH:mmqahRX %(HH)s:%(mm)sqbubuU languagesqc}qd(Uzh_HantqeXBaday Ipaw patasqfUruqgX patas RuskiqhUfrqiX patas BoseyqjUenqkX patas IngrisiqlUzhqmX patas IpawqnUpt_BRqoX patas PajeyqpUptqqX patas BowduqrUsrqsX patas SrpianqtUbnquXpatas MonchiaraqvUdeqwX patas TowjihqxUitqyX patas ItariyaqzUurq{X patas Yurtuq|Uhiq}X patas Heytiq~UundqXIni klayna patas niqUzh_HansqXQantan Ipaw patasqUjaqX patas NihongqUesqXpatas EspanniuquU territoriesq}q(UFRqX alang PoseyqUBAqX alang PosniyaqUHRqX alang KrowtiaqUDEqX alang TowjihqUJPqX alang NihongqUBVqX alang PuweiqUBRqX alang PajeyqUHMqXalang Htee ni MayktanqUZZqXini klayi na alang niqURUqX alang RuskiqURSqX alang SrbiaqUTFqXalang Posey niq NanqUCHqXalang SwitjrrantqUGSqXalang Nanjiouya ni NansanminjiqUCNqX alang IpawqUITqX alang ItariyaqUAQqX alang NanciqUGBqX alang InglisqUIOqXalang Inglis niq IntuqUINqX alang IntuqUMEqXalang MondineygrwqUUSqX alang AmarikaqUSMqXalang SnmarinowquUdecimal_formatsq}qNh%)q}q(h(Nh*Kh+KKqh-h.h.qh0KKqh2X #,##0.###qh4h.h5qh7Nh8KKqubsU date_formatsq}q(UmediumqhN)q}q(h2X yyyy MMM dqhRX%(yyyy)s %(MMM)s %(d)squbUfullqhN)q}q(h2XEEEE, yyyy MMMM ddqhRX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)squbUlongqhN)q}q(h2X yyyy MMMM dqhRX%(yyyy)s %(MMMM)s %(d)squbUshortqhN)q}q(h2X yyyy-MM-ddqhRX%(yyyy)s-%(MM)s-%(dd)squbuUcurrency_symbolsq}qU time_zonesq}q(UAmerica/Indianapolisq}qUcityqXJikan alang IntiannaporisqsUAmerica/New_Yorkq}qhXJikan alang NiuyueqsUAmerica/Denverq}qhXJikan alang TanboqsUPacific/Honoluluq}qhXJikan alang HonoruruqsUAmerica/Phoenixq}qhXJikan alang BonhuanqsU Etc/Unknownq}qhXIni klayi ka Jikan hiniqsUAmerica/Los_Angelesq}qhXJikan alang RosanciqsUAmerica/Rio_Brancoq}qhXJikan alang PurankqsUAmerica/Anchorageq}qhXJikan alang AnkrijiqsUAmerica/Campo_Grandeq}qhXJikan alang GradqsUAmerica/Chicagoq}qhXJikan alang JiciakqsUAmerica/Sao_Pauloq}qhXJikan alang SnpaurowqsuUscriptsr}r(UZzzzrXini klayi tasan nirUCyrlrX tasan SirorikrUArabrX tasan ArapitrUZxxxrX Unat tasanr UHansr XQantan tasan Ipawr ULatnr X tasan Ratinr UHantrXBaday tasan IpawruUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UUSDrX pila AmericarUAUDrX pila AutariarUTWDrX pila TaiwanrUNOKrX pila NoweyrURUBrX pila RuskirUMOPr X pila Macaor!UINRr"X pila Intiar#UCNYr$X pila Ipawr%UJPYr&X pila Nihongr'UBRLr(X pila Pajeyr)UGBPr*X pila Inglisr+UXXXr,Xini klayi pila nir-UHKDr.Xpila Hong Kongr/UEURr0X pila Irowr1uUmonthsr2}r3(U stand-aloner4}r5Unarrowr6}r7(KXKr8KXDr9KXTr:KXSr;KXRr<KXMr=KXEr>KXPr?K XAr@K j=K j8K j9usUformatrA}rB(UwiderC}rD(KX Kingal idasrEKXDha idasrFKXTru idasrGKX Spat idasrHKX Rima idasrIKX Mataru idasrJKX Empitu idasrKKX Maspat idasrLK X Mngari idasrMK X Maxal idasrNK XMaxal kingal idasrOK XMaxal dha idasrPuU abbreviatedrQ}rR(KXKiirSKXDhirTKXTrirUKXSpirVKXRiirWKXMtirXKXEmirYKXMairZK XMnir[K XMxir\K XMxkr]K XMxdr^uuuUcurrency_formatsr_}r`Nh%)ra}rb(h(Nh*Kh+KKrch-h.h.rdh0KKreh2X ¤ #,##0.00rfh4X¤ rgX-¤ rhrih7Nh8KKrjubsUdaysrk}rl(U stand-alonerm}rnUnarrowro}rp(Kj8Kj9Kj:Kj;Kj<Kj=Kj>usUformatrq}rr(Uwiders}rt(KXtgKingal jiyax iyax sngayanruKXtgDha jiyax iyax sngayanrvKXtgTru jiyax iyax sngayanrwKXtgSpac jiyax iyax sngayanrxKXtgRima jiyax iyax sngayanryKXtgMataru jiyax iyax sngayanrzKX Jiyax sngayanr{uU abbreviatedr|}r}(KXKinr~KXDharKXTrurKXSparKXRimrKXMatrKXEmpruuuU meta_zonesr}r(UAmerica_Pacificr}r(Ushortr}r(UgenericrXJDrUdaylightrXJADKRrUstandardrXSJADruUcommonrUlongr}r(jXJikan DaybinyanrjX&Jikan Amarika-Daybinyan o Karat RbaganrjXSnegun Jikan Amarika-DaybinyanruuUEurope_Easternr}r(j}r(jXJTKRrjXJTrujj}r(jXJikan Tonow o Karat RbaganrjX Jikan TonowruuUEurope_Westernr}r(j}r(jXJSKRrjXJSrujj}r(jXJikan Siow o Karat RbaganrjX Jikan SiowruuUEurope_Centralr}r(j}r(jXJCKRrjXJCrujj}r(jXJikan Conow o Karat RbaganrjX Jikan ConowruuUAmerica_Easternr}r(j}r(jXJTArjXJTAKRrjXSJTArujj}r(jXJikan Ton-AmarikarjX Jikan Ton-Amarika o Karat RbaganrjXSnegun Jikan Ton-AmarikaruuUAtlanticr}r(j}r(jXJYTrjXJYTKRrjXSJYTrujj}r(jXJikan Yayun TasiyanrjX"Jikan Yayun Tasiyan o Karat RbaganrjXSnegun Jikan Yayun TasiyanruuUAmerica_Centralr}r(j}r(jXJCArjXJCAKRrjXSJCArujj}r(jXJikan Con-AmarikarjX Jikan Con-Amarika o Karat RbaganrjXSnegun Jikan Con-AmarikaruuUAmerica_Mountainr}r(j}r(jXJYArjXJHYArjXSJYArujj}r(jXJikan Yama-AmarikarjXJikan Hidaw niq Yama-AmarikarjXSnegun Jikan Yama-AmarikaruuUGMTr}r(j}rjXJQGrsjj}rjXJikan Quri GrinweyjirsuuUerasr}r(Uwider}r(KXBrah jikan Yisu ThulangrKXBukuy jikan Yisu ThulangruU abbreviatedr}r(KXBRYrKXBUYruuu.PK[{==(site-packages/babel/localedata/pa_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[C %site-packages/babel/localedata/lv.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX 1. ceturksnisqKX 2. ceturksnisqKX 3. ceturksnisqKX 4. ceturksnisquU abbreviatedq}q(KXC1qKXC2qKXC3qKXC4quuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Upercent_formatsq&}q'Ncbabel.numbers NumberPattern q()q)}q*(Uexp_precq+NUscaleq,KdU frac_precq-KKq.Usuffixq/X%q0h0q1Uint_precq2KKq3Upatternq4X#,##0%q5Uprefixq6Xq7X-q8q9Uexp_plusq:NUgroupingq;KKq(Umin_daysq?KU weekend_startq@KU first_dayqAKU weekend_endqBKuU time_formatsqC}qD(UmediumqEcbabel.dates DateTimePattern qF)qG}qH(h4XHH:mm:ssqIUformatqJX%(HH)s:%(mm)s:%(ss)sqKubUfullqLhF)qM}qN(h4X HH:mm:ss vqOhJX%(HH)s:%(mm)s:%(ss)s %(v)sqPubUlongqQhF)qR}qS(h4X HH:mm:ss zqThJX%(HH)s:%(mm)s:%(ss)s %(z)sqUubUshortqVhF)qW}qX(h4XHH:mmqYhJX %(HH)s:%(mm)sqZubuU languagesq[}q\(Ugvq]Xmeniešuq^Uguq_X gudžaratuq`UscnqaX sicīliešuqbUromqcXčigānuqdUalgqeXalgonkinu valodaqfUaleqgXaleutuqhUscoqiXskotuqjUmniqkX manipūruqlUgdqmX skotu-ķeltuqnUgaqoXīruqpUmnoqqX manobu valodaqrUosaqsX važāžuqtUgnquXgvaranuqvUaltqwXdienvidaltajiešuqxUglqyX galisiešuqzUmwrq{Xmarvaruq|Utyq}X taitiešuq~UtwqXčvīqUttqXtatāruqUtrqXturkuqUtsqXconguqUtnqXcvanuqUtoqXtonguqUausqXaustrāliešu valodaqUavqXavāruqUtkqX turkmēņuqUthqXtajuqUroaqXromāņu valodaqUtgqXtadžikuqUteqXteluguqUugaqX ugaritiešuqUmwlqX mirandiešuqUsmiqX sāmu valodaqUfatqXfantuqUfanqXfanguqUwoqXvolofuqUrmqX retoromāņuqUdinqXdinkuqUblaqXsiksikuqUcmcqXčamiešu valodaqUmlqXmalajalamiešuqUzhqX ķīniešuqUtemqXtemnuqUen_CAqXKanādas angļuqUnwcqXklasiskā nevaruqUzaqXdžuanuqUcauqXkaukāziešu valodaqUzuqXzuluqUterqXterenoqUtetqXtetumuqUmncqX mandžūruqUkutqXkutenajuqUsukqXsukumuqUkumqXkumikuqUsusqXsusuqUnewqXnevaruqUsuxqXšumeruqUdenqXsleivuqUmenqXmenduqUmulqXvairākas valodasqUlezqXlezgīnuqUrootqXsakneqUekaqX ekadžukuqUakkqX akadiešuqUdraqXdravīdu valodaqUjrbqX jūdarābuqUsgnqXzīmju valodasqUsgaqXsenīruqUapaqX apaču valodaqUbraqX bradžiešuqUchbqXčibčuqUchgqX džagatajsqUchkqXčūkuqUchmqXmariešuqUchnqXčinuku žargonsqUchoqXčoktavuqUchpqX čipevaianuqUchrqXčirokuqUchyqXšejenuqUtiqXtigrinjaqUvotqXvotuqUmgqXmalagasurUibarXibanurUmorXmoldāvurUmnrXmongoļurUmirXmaorurUmhr X māršaliešur Umkr X maķedoniešur Umtr X maltiešurUcairX!Centrālamerikas indiāņu valodarUdelrX delavērurUmsrX malajiešurUmrrXmaraturUtarXtamilurUmyrX birmiešurUcadrXkadurUsrnrX sranantongorUtairX taju valodasr Uafhr!Xafrihilir"Usitr#Xsinotibetiešu valodasr$Uenmr%X vidusangļur&Uen_AUr'XAustrālijas angļur(Unynr)Xņankolur*Unyor+Xņorur,Unymr-Xņamvezur.Usior/X siū valodasr0Umapr1Xaustronēziešu valodar2Umasr3Xmasajur4Ulahr5Xlandur6Uladr7Xladinor8Ufyr9Xfrīzur:Usnkr;Xsoninkur<Ufar=X persiešur>Umadr?X maduriešur@UmagrAX magahiešurBUmairCXmaithilirDUfirEXsomurFUfjrGX fidžiešurHUmanrIXmandingurJUegyrKX ēģiptiešurLUzndrMXzandērNUssrOXsvaturPUsrrQXserburRUsqrSXalbāņurTUswrUXsvahilurVUsvrWXzviedrurXUsurYX sundaniešurZUstr[Xsesotor\Uskr]Xslovākur^Usir_X sinhalīzur`UshraXserbu-horvāturbUsorcXsomāļurdUsnreXšonurfUsmrgX samoāņurhUslriX slovēņurjUscrkX sardīniešurlUsarmX sanskritarnUsgroXsangurpUserqX ziemeļsāmurrUsdrsXsindžurtUzenruXzenagurvUkbdrwX kabardiešurxUafaryXafroaziātu valodarzUcsbr{Xkašubur|Ulgr}Xgandur~UlbrXluksemburgiešurUfiurXsomugru valodasrUlnrXlingalarUlorX laosiešurUlirX limburgiešurUbynrXbilinurUltrX lietuviešurUlurX lubakatangarUfilrXtagalurUyirXjidišsrUnonrX sennorvēģurUcebrX sebuāņurUyorXjoruburUnogrXnogajurUbatrX baltu valodasrUdakrXdakoturUdarrXdargurUdayrXdajakurUssarXnīlas-sahāras valodarUkperXkpellurUelrXgrieķurUeorX esperantorUenrXangļurUlamrXlamburUeerXevurUmdfrXmokšurUfrrXfrančurUmdrrXmandarurUetrXigauņurUesrXspāņurUrurXkrievurUgonrXgondurUgohrX senaugšvācurUsmsrX skoltsāmurUsmnrX Inari sāmurUsmjrX Luleo sāmurUde_ATrXAustrijas vācurUgotrXgoturUrnrXrundurUrorXrumāņurUdsbrX lejassorburUsmarX dienvidsāmurUgorrX gorontalurUastrX astūriešurUwalrXvalamurUcrhrXKrimas tatārurUathrXatapasku valodarUgezrXgēzurUxhrXkhosurUffrXfulurUkforXkorurUmakrXmakasarurUzaprXsapotekurUkokrXkonkanurUzxxrXlingvistiska satura navrUkosrX kosrājiešurUforXfaroisurUtogrXNjasas tongu valodarUhuprXhupurUudmrXudmurturUbejrXbedžurUbemrXbemburUtsirX cimšiāņurUberrXberberurUnzirXnzemurUsairXDienvidamerikas indiāņurUangrX senangļurUprarXprākrita valodarUbhorX bhodžpūrurUsalr Xsališu valodar Upror Xsenprovansiešur Urajr X radžastāņurUsadrXsandavurUanprXangikarUes_419rXspāņu (Latīņamerika)rUraprXrapanujurUsasrXsasakurUcarrXkarīburUminrX minangkabavurUmicrXmikmakurUefirXefikur Uarnr!X araukāņur"Uypkr#X jupiku valodar$Umisr%Xdažādas valodasr&Ukacr'Xkačinur(Ukabr)Xkabilur*Ukaar+X karakalpakur,Ukamr-Xkambur.Ukarr/Xkarenur0Ukawr1Xkāvir2Ufr_CHr3XŠveices frančur4Utyvr5Xtuviešur6Ufr_CAr7XKanādas frančur8Ukar9Xgruzīnur:Udoir;Xdogrur<Ukgr=Xkongur>Ukkr?Xkazahur@UkjrAXkvaņamurBUkirCXkikujurDUkorEX korejiešurFUknrGXkannadarHUkmrIXkhmerurJUklrKX grenlandiešurLUksrMX kašmiriešurNUkrrOXkanururPUkwrQX korniešurRUkvrSXkomiešurTUkurUXkurdurVUkyrWXkirgīzurXUtklrYX tokelaviešurZUbuar[Xburjatur\Umgar]X vidusīrur^Uhitr_Xhetur`UdyuraXdiūlurbUdercXvācurdUdareXdāņurfUdzrgXdzongkerhUluiriXluisenurjUdvrkX maldīviešurlUhilrmX hiligainonurnUhimroX himačalirpUgemrqXģermāņu valodarrUcrprsXkreoliskā vai pidžinvalodartUquruXkečvurvUbasrwXbasurxUgbaryXgbajurzUbadr{Xbandur|Ubanr}Xbaliešur~UbalrXbeludžurUshnrXšanurUbairXbamileku valodarUarprXarapahurUartrXmākslīgā valodarUarwrXaravakurUarcrX aramiešurUen_USrX angļu (ASV)rUsemrXsemītu valodarUselrXselkupurUnubrXnūbiešu valodarUbtkrXbatakurUlusrXlušejurUmusrXkrīkurUluarX lubalulvarUirorXirokēzu valodarUirarXirāņu valodasrUmunrX mundu valodarUlunrXlundurUluorXluorUwarXvaloņurUtuprX tupu valodarUjvrXjaviešurUtutrXaltajiešu valodasrUtumrXtumbukurUjarXjapāņurUcoprXkopturUilorXilokurUlarXlatīņurUgwirXkučinurUundrXnezināma vai nederīga valodarUtlirXtlinkiturUtlhrX klingoniešurUchrXčamorrurUcorX korsikāņurUcarX katalāņurUcerXčečenurUponrX ponapiešurUcyrX velsiešurUsahrXjakuturUcsrXčehurUcrrXkrīrUbntrXbanturUcvrXčuvašurUcurX baznīcslāvurUlvrX latviešurUdumrXvidusholandiešurUptrX portugāļurUduarXdualurUfrorX senfrančurUyaprXjapiešurUfrmrX vidusfrančurUtivrXtivurUfrsrX austrumfrīzurUfrrrX ziemeļfrīzurUyaorXjaorUparX pandžaburUxalrXkalmikurUes_ESrXibēriešu spāņurUpirXpālirUplrXpoļurUgayrXgajorUotorX otomu valodarUotarX turku osmaņurUhmnrXhmongurUmyvrXerzjurUgaarXgarUfurrXfriūlurUkhirXhojsanurUainr Xainur Urarr X rarotongiešur Uslar XslāvurUverXvendurUvirX vjetnamiešurUisrX islandiešurUkhorX hotaniešurUiurXinuīturUitrX itāliešurUvorXvolapiksrUiirX sičuaņas jirUikrXinupiakur Uior!Xidor"Uiner#Xindoeiropiešu valodasr$Uiar%X interlingvar&Ujprr'X jūdpersiešur(Uier)X interlinguer*Uidr+X indonēziešur,Uigr-Xigbor.Upapr/X papjamentor0Uewor1Xevondur2Upaur3X palaviešur4Upaar5Xpapuasu valodar6Upagr7X pangasinanur8Usatr9Xsantalur:Upalr;Xpehlevir<Upamr=X pampanganur>Usycr?Xklasiskā sīriešur@UphirAXfilipīniešu valodasrBUcelrCX ķeltu valodarDUphnrEX feniķiešurFUnicrGXnigēriešu-kordofāņu valodarHUniarIXnjasurJUdgrrKXdogriburLUsyrrMX sīriešurNUniurOXniuāņurPUgswrQXŠveices vācurRUjborSXložbansrTUnahrUXnavatlurVUsamrWXsamārijas aramiešurXUhairYXhaidurZUgmhr[Xvidusaugšvācur\Ucusr]Xkušītu valodasr^Uwenr_Xsorbur`UadyraXadigurbUelxrcX elamiešurdUadareXadangmurfUpt_PTrgXibēriešu portugāļurhUhawriX havajiešurjUbinrkXbinurlUbikrmXbikolurnUpt_BRroXBrazīlijas portugāļurpUmosrqXmosurrUmohrsXmohaukurtUtlruXtagalogurvUzh_HansrwXķīniešu vienkāršotārxUzh_HantryXķīniešu tradicionālārzUtvlr{X tuvaliešur|Uijor}Xidžbur~UkmbrXkimbundurUpeorXsenpersurUumbrXumbundurUtmhrXtuaregurUfonrXfonurUhsbrX augšsorburUberX baltkrievurUbgrXbulgārurUbarX baškīrurUpsrXpušturUbmrXbambarurUbnrX bengāļurUborX tibetiešurUbhrXbiharurUbirX bišlamārUbrrXbretoņurUbsrX bosniešurUruprXaromūnurUomrXoromurUojrXodžibvurUacerXačinurUachrXačolurUocrX provansiešurUkrurXkuruhurUsrrrXserērurUkrorXkrūrUkrlrXkarēļurUkrcrXkaračaju un balkārurUndsrX lejasvācurUosrXosetīnurUorrX orisiešurUsogrX sogdiešurUnsorX ziemeļsoturUsonrXsongajurUde_CHrXŠveices augšvācurUvairXvajurUwakrXvakašu valodarUlolrXmongurUmkhrXmonkhmeru valodasrUawarXavadhurUlozrXlozurUgilrX kiribatiešurUwasrXvašorUwarrXvarajurUhzrXhererurUhyrXarmēņurUanrX aragoniešurUsidrXsidamurUhrrXhorvāturUhtrX haitiešurUhurXungārurUhirXhindirUhorXhirimoturUharXhausurUbugrXbugurUherXivritsrUuzrXuzbekurUurrXurdurUukrXukraiņurUugrXuighururUaarXafārurUabrXabhāzurUaerXavestarUafrX afrikāņurUakrXakanurUamrXamharurUnl_BErXflāmurUeurXbaskurUasrX asamiešurUarr Xarābur Uinhr Xingušur Utpir X tokpisinsrUmynrX maiju valodarUayrXaimarurUkharXkhasurUazrXazerbaidžāņurUincrXindoāriešu valodasrUnlrX holandiešurUnnrX jaunnorvēģurUnorX norvēģurUnarX nauruiešur Unbr!Xnorvēģu bukmolsr"Unair#X!Ziemeļamerikas indiāņu valodasr$Undr%Xziemeļndebelur&Uner'X nepāliešur(Ungr)Xndongur*Unyr+Xčičevar,Unapr-X neapoliešur.Ugrbr/Xgrebor0Ugrcr1X sengrieķur2Unrr3Xdienvidndebelur4Utigr5Xtigrur6Unvr7Xnavahur8Uzunr9Xzunjur:Urwr;X kiņaruandar<Ucper=X0angliskās kreoliskās valodas un pidžinvalodasr>Ucpfr?X'franciskā kreoliskā vai pidžinvalodar@UcpprAX5portugāliskās kreoliskās valodas un pidžinvalodasrBuU territoriesrC}rD(UBDrEX BangladešarFUBErGX BeļģijarHUBFrIX BurkinafasorJUBGrKX BulgārijarLUVErMX VenecuēlarNUBArOXBosnija un HercegovinarPUBBrQX BarbadosarRUWFrSXVolisa un FutunarTUBMrUX Bermudu salasrVUBNrWXBrunejarXUBOrYX BolīvijarZUBHr[XBahreinar\UBIr]XBurundir^UBJr_XBeninar`UBTraXButānarbU011rcX RietumāfrikardUBVreX Buvē salarfUBWrgX BotsvānarhU014riXAustrumāfrikarjU015rkXZiemeļāfrikarlUBRrmX BrazīlijarnU017roX VidusāfrikarpU018rqXĀfrikas dienvidirrU019rsXAmerikasrtUBYruX BaltkrievijarvUBZrwXBelizarxULVryXLatvijarzURWr{XRuandar|URSr}XSerbijar~UTLrX AustrumtimorarURErXReinjonarUTMrXTurkmenistānarUOMrXOmānarUTJrXTadžikistānarUROrX RumānijarUTKrXTokelaurUGWrXGvineja-BisavarUGUrXGuamarUGTrX GvatemalarUGSrX,Dienviddžordžija un Dienvidsendviču salasrUGRrX GrieķijarUGQrXEkvatoriālā GvinejarUGPrX GvadeluparUJPrXJapānarUKIrXKiribatirUGYrXGajānarUGGrX GērnsijarUGFrXFranču GviānarUGErXGruzijarUGDrXGrenādarU021rXAmerikas ziemeļirUGBrXLielbritānijarUGArXGabonarUSVrX SalvadorarUGNrXGvinejarUGMrXGambijarUGLrX GrenlanderU029rXKarību jūras reģionsrUGIrX GibraltārsrUGHrXGanarUJErX DžērsijarUTNrXTunisijarUJMrXJamaikarU013rXCentrālamerikarUWSrXSamoarU419rX)Latīņamerika un Karību jūras reģionsrUHRrX HorvātijarUBSrXBahamasrUHTrXHaitirUHUrX UngārijarUHKrX/Honkonga, Ķīnas īpašās pārvaldes apgabalsrU039rXEiropas dienvidirUHNrX HondurasarUFIrXSomijarU142rXĀzijarU030rX AustrumāzijarU034rXĀzijas dienvidirU035rXCentrālaustrumāzijarUPRrX PuertorikorUPSrX(Palestīniešu pašpārvaldes teritorijarUFKrXFolklenda salasrUIOrX Britu Indijas okeāna teritorijarUPWrXPalaurUPTrX PortugālerUSJrXSvalbāra un Jana Majena salarUMDrXMoldovarUFMrX#Mikronēzijas Federatīvās ValstisrUIQrXIrākarUPArXPanamarUPFrXFranču PolinēzijarUPGrXPapua-JaungvinejarUPErXPerurUPKrX PakistānarUPHrX FilipīnasrUFOrX Farēru salasrUPNrX PitkērnarUPLrXPolijarUPMrXSenpjēra un MikelonarUZMr XZambijar UEHr X Rietumsahārar URUr XKrievijarUEErXIgaunijarUEGrXĒģipterUZArXDienvidāfrikarUECrXEkvadorarUITrXItālijarUVNrXVjetnamarUZZrX Nezināms vai nederīgs reģionsrUSBrXZālamana salasrUETrXEtiopijar USOr!X Somālijar"UZWr#XZimbabver$USAr%XSaūda Arābijar&UESr'XSpānijar(UERr)XEritrejar*UMEr+X Melnkalner,UAQr-X Antarktikar.UMGr/X Madagaskarar0UMAr1XMarokar2UMCr3XMonakor4UUZr5X Uzbekistānar6UMMr7XMjanmar8UMLr9XMalir:UMOr;X,Makao, Ķīnas īpašās pārvaldes apgabalsr<UMNr=X Mongolijar>UHMr?XHērda un Makdonalda salasr@UASrAXAmerikāņu SamoarBUMKrCX MaķedonijarDUMUrEX MaurīcijarFUMTrGXMaltarHUMWrIX MalāvijarJUMVrKX MaldīvijarLUMQrMX MartinikarNUMPrOXZiemeļu MarianasrPUMSrQX MontserratarRUMRrSX MauritānijarTUIMrUXMenarVUUGrWXUgandarXUTZrYX TanzānijarZUMYr[X Malaizijar\UMXr]XMeksikar^UILr_XIzraēlar`UFRraXFrancijarbUAWrcXArubardUDOreXDominikānas RepublikarfUSHrgXSv. Helēnas salarhUVCriXSentvinsenta un GrenadīnasrjU054rkX MelanēzijarlUDJrmX DžibutijarnUFJroXFidžirpU057rqXMikronēzijas reģionsrrU172rsXNeatkarīgo Valstu SavienībartU053ruXAustrālija un JaunzēlandervUNIrwX NikaragvarxUNLryX NīderlanderzUNOr{X Norvēģijar|UNAr}X Namībijar~UVUrXVanuaturUNCrXJaunkaledonijarUNErXNigērarUNFrXNorfolkarUNGrX NigērijarUNZrX JaunzēlanderUNPrXNepālarUNRrXNaururUNUrXNiuerU061rX PolinēzijarUCIrX KotdivuārarUCHrXŠveicerUCOrX KolumbijarUCNrXĶīnarUCMrX KamerūnarUCLrXČīlerUCCrXKokosu (Kīlinga) salasrUCArXKanādarUCGrXKongorUCFrXCentrālāfrikas RepublikarUCDrXKongo Demokrātiskā RepublikarUCZrXČehijarUCYrXKiprarUCXrXZiemsvētku salarUCSrXSerbija un MelnkalnerUCRrX KostarikarUPYrX ParagvajarUCVrX KaboverderUCUrXKubarUSZrX SvazilendarUSYrXSīrijarUKGrX KirgīzijarUKErXKenijarUSRrXSurinamarU143rXCentrālāzijarUKHrX KambodžarUKNrXSentkitsa un NevisarUKMrX Komoru salasrUSTrXSantome un PrinsipirUSKrX SlovākijarUKRrX DienvidkorejarUSIrX SlovēnijarUKPrX ZiemeļkorejarUKWrXKuveitarUSNrX SenegālarUSMrX SanmarīnorUSLrX SjerraleonerUSCrXSeišeļu salasrUKZrX KazahstānarUKYrX Kaimanu salasrUSGrX SingapūrarUSErX ZviedrijarUSDrXSudānarU151rX AustrumeiroparU150rXEiroparUDMrXDominikarU155rX RietumeiroparU154rXEiropas ziemeļirUVGrXBritu Virdžīnu salasrUDErXVācijarUYErXJemenarUMHrXMāršala salasrU062rXCentrāldienvidāzijarUDZrX AlžīrijarUUSrX United StatesrUUYrXUrugvajarUYTrXMajotarUUMrX ASV mazās aizjūras teritorijasrULBrXLibānarULCr X Sentlūsijar ULAr XLaosar UTVr XTuvalurUTWrXTaivānarUTTrXTrinidāda un TobāgorUTRrXTurcijarULKrX ŠrilankarULIrX LihtenšteinarUCKrX Kuka salasrUTOrXTongarULTrXLietuvarULUrX Luksemburgar ULRr!X Libērijar"ULSr#XLesotor$UTHr%XTaizemer&UTFr'XFranču dienvidu teritorijasr(UTGr)XTogor*UTDr+XČadar,UTCr-XTērksas un Kaikosas salasr.ULYr/XLībijar0UVAr1X Vatikānsr2U145r3X Rietumāzijar4UAEr5XApvienotie Arābu Emirātir6UADr7XAndorar8UAGr9XAntigva un Barbudar:UAFr;X Afganistānar<UAIr=XAngiljar>UVIr?XAmerikāņu Virdžīnu salasr@UISrAXIslanderBUIRrCXIrānarDUAMrEX ArmēnijarFUALrGX AlbānijarHUAOrIXAngolarJUANrKXAntiļasrLU003rMXZiemeļamerikarNU002rOXĀfrikarPU001rQXPasaulerRUARrSX ArgentīnarTUAUrUX AustrālijarVUATrWXAustrijarXU005rYXDienvidamerikarZUINr[XIndijar\UAXr]X Olandes salasr^U009r_X Okeānijar`UAZraXAzerbaidžānarbUIErcXĪrijardUIDreX IndonēzijarfUJOrgX JordānijarhUQUriXEiropas SavienībarjUUArkXUkrainarlUQArmXKatararnUDKroXDānijarpUMZrqX MozambikarrUQOrsXASV Mazās Aizjūras salasrtuUdecimal_formatsru}rvNh()rw}rx(h+Nh,Kh-KKryh/h7h7rzh2KKr{h4X #,##0.###r|h6h7h8r}h:Nh;KKr~ubsU date_formatsr}r(UmediumrhF)r}r(h4Xyyyy.d.MrhJX%(yyyy)s.%(d)s.%(M)srubUfullrhF)r}r(h4XEEEE, yyyy. 'gada' d. MMMMrhJX(%(EEEE)s, %(yyyy)s. gada %(d)s. %(MMMM)srubUlongrhF)r}r(h4Xyyyy. 'gada' d. MMMMrhJX%(yyyy)s. gada %(d)s. %(MMMM)srubUshortrhF)r}r(h4Xyy.d.MrhJX%(yy)s.%(d)s.%(M)srubuUcurrency_symbolsr}rULVLrXLsrsU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanāriju salasrsUAntarctica/Mawsonr}rjXMavsonarsU Europe/Parisr}rjXParīzersUAmerica/Buenos_Airesr}rjX BuenosairesarsUAustralia/Melbourner}rjXMelburnarsU Africa/Bissaur}rjXBisavarsUAfrica/Tripolir}rjXTripolersUAmerica/Nipigonr}rjXNipigonarsUEurope/Kaliningradr}rjXKaļiņingradarsUEurope/Tallinnr}rjXTallinarsU Asia/Colombor}rjXKolomborsUAmerica/Indiana/Tell_Cityr}rjX TellsitijarsUAustralia/Darwinr}rjXDārvinarsUIndian/Reunionr}rjXReinjonarsUAmerica/Whitehorser}rjX VaithorsarsUAntarctica/Davisr}rjXDeivisarsUPacific/Pitcairnr}rjX PitkērnarsUAfrica/Libreviller}rjX LibrevilarsUAmerica/Coral_Harbourr}rjX KoralharborarsUAfrica/Freetownr}rjX FrītaunarsUAsia/Kamchatkar}rjX KamčatkarsUAmerica/Swift_Currentr}rjX SviftkarentarsU Asia/Dhakar}rjXDakarsUAmerica/St_Luciar}rjX SentlūsijarsUEurope/Amsterdamr}rjX AmsterdamarsUAmerica/Montserratr}rjX MontserratarsU Asia/Tashkentr}rjX TaškentarsUEurope/Simferopolr}rjX SimferopolersU Europe/Tiraner}rjXTirānarsU Asia/Tokyor}rjXTokijarsUAsia/Pontianakr}rjX PontianakarsUAmerica/Maceior}rjXMaseiorsUAfrica/Abidjanr}rjX AbidžanarsUAfrica/Djiboutir}rjX DžibutijarsU Asia/Kashgarr}rjXKašgararsUAmerica/Detroitr}rjXDetroitarsUAsia/Vladivostokr}r jX Vladivostokar sU Asia/Kuchingr }r jXKučingar sU Asia/Urumqir}rjXUrumčirsUAmerica/Grenadar}rjXGrenādarsUAmerica/Indiana/Knoxr}rjXNoksarsUAmerica/El_Salvadorr}rjX SalvadorarsUAmerica/Indiana/Petersburgr}rjX PēterburgarsU Europe/Madridr}rjXMadridersUAsia/Pyongyangr }r!jXPhenjanar"sUAmerica/Santiagor#}r$jXSantjagor%sU Asia/Dubair&}r'jXDubaijar(sU Asia/Kuwaitr)}r*jXKuveitar+sUPacific/Noumear,}r-jXNumear.sUAmerica/Mazatlanr/}r0jX Masatlānar1sUAsia/Ulaanbaatarr2}r3jX Ulanbatorar4sUAmerica/Rainy_Riverr5}r6jX Reiniriverar7sUAmerica/Argentina/San_Luisr8}r9jXSanluisar:sUIndian/Maldivesr;}r<jX Maldīvijar=sUAmerica/Phoenixr>}r?jXFīniksar@sUAntarctica/RotherarA}rBjXRoterarCsUEurope/StockholmrD}rEjX StokholmarFsU Pacific/FijirG}rHjXFidžirIsUAmerica/Port-au-PrincerJ}rKjX PortoprensarLsUPacific/Pago_PagorM}rNjXPagopagorOsUAmerica/CaymanrP}rQjX Kaimanu SalasrRsU Asia/SakhalinrS}rTjX SahalīnarUsUAustralia/AdelaiderV}rWjXAdelaidarXsU Europe/AthensrY}rZjXAtēnasr[sUAmerica/Indianapolisr\}r]jX Indianapolisar^sUAmerica/Reginar_}r`jXRegīnarasU Pacific/Trukrb}rcjXTrūkardsUAmerica/Curacaore}rfjXNīderlandes AntiļasrgsU Asia/Rangoonrh}rijXJangonarjsUAmerica/Cambridge_Bayrk}rljX KembridžbejarmsUAmerica/Port_of_Spainrn}rojX PortofspeinarpsUIndian/Kerguelenrq}rrjX KergvelenarssUAfrica/Khartoumrt}rujXHartūmarvsUPacific/Saipanrw}rxjXSaipanarysUAmerica/Puerto_Ricorz}r{jX Puertorikor|sUPacific/Chathamr}}r~jXČetemarsUIndian/Mauritiusr}rjX MaurīcijarsU Europe/Rigar}rjXRīgarsU Europe/Berlinr}rjXBerlīnersU America/Jujuyr}rjXŽužujarsUAmerica/Cordobar}rjXKordobarsUAmerica/Guatemalar}rjX GvatemalarsU America/Belemr}rjXBelenarsU Africa/Doualar}rjXDualarsU Europe/Romer}rjXRomarsU Asia/Harbinr}rjXHarbinarsUAustralia/Lord_Hower}rjXLordhovarsUAfrica/Sao_Tomer}rjXSantomersUAmerica/Managuar}rjXManagvarsUAmerica/Argentina/San_Juanr}rjXSanhuanarsUPacific/Kosraer}rjXKosrajarsUAfrica/Bujumburar}rjX BužumburarsUAmerica/North_Dakota/New_Salemr}rjX ŅūsalemarsUEurope/Chisinaur}rjX KišiņevarsU Asia/Bangkokr}rjXBangkokarsU Europe/Warsawr}rjXVaršavarsUAmerica/Monterreyr}rjX MonterejarsUAsia/Krasnoyarskr}rjX KrasnojarskarsUAmerica/Louisviller}rjX LuisvillarsUAmerica/Boa_Vistar}rjXBoavistarsUAsia/Yekaterinburgr}rjXJekaterinburgarsUEurope/Andorrar}rjXAndorarsUAtlantic/Bermudar}rjX Bermudu salasrsUAmerica/Denverr}rjXDenverarsUAustralia/Currier}rjXKerijarsUAntarctica/Caseyr}rjXKesijarsU Asia/Saigonr}rjX HošiminarsUPacific/Enderburyr}rjX EnderburijarsU America/Thuler}rjXTūlersUAmerica/St_Johnsr}rjX SentdžonsarsUAmerica/Monctonr}rjXMonktonarsUAtlantic/Stanleyr}rjXStenlijarsUAmerica/St_Thomasr}rjX SenttomasarsUAmerica/Jamaicar}rjXJamaikarsUPacific/Majuror}rjXMadžurorsUAmerica/Mexico_Cityr}rjXMehikorsU Asia/Adenr}rjXAdenarsUAtlantic/Cape_Verder}rjX KaboverdersUAsia/Hong_Kongr}rjXHonkongarsU Asia/Macaur}rjXMakaorsU Indian/Cocosr}rjXKokosarsUAsia/Choibalsanr}rjX Čoibalsanar sUAmerica/Guadelouper }r jX Gvadelupar sUAmerica/Blanc-Sablonr }rjX BlanksablonarsUAmerica/Nassaur}rjXNasorsU Europe/Kievr}rjXKijevarsUAntarctica/Syowar}rjXSjovarsUAmerica/Halifaxr}rjX HalifaksarsUAntarctica/McMurdor}rjXMakmerdorsU Asia/Hovdr}r jXHovdar!sUAmerica/Danmarkshavnr"}r#jXDenmārkšavnar$sUAmerica/Thunder_Bayr%}r&jX Tanderbejar'sUAmerica/Scoresbysundr(}r)jX Skoresbisundar*sUAmerica/Eiruneper+}r,jXEirenuper-sUAmerica/Caracasr.}r/jXKarakasar0sU Asia/Baghdadr1}r2jXBagdāder3sUAfrica/Monroviar4}r5jX Monrovijar6sUAmerica/Manausr7}r8jXManausar9sUAmerica/Los_Angelesr:}r;jX Losandželosar<sUAmerica/Godthabr=}r>jXNūkar?sUAmerica/Goose_Bayr@}rAjXGūsbejarBsU Asia/AmmanrC}rDjXAmmānarEsU Asia/KabulrF}rGjXKabularHsUAmerica/CatamarcarI}rJjX KatamarkarKsUIndian/AntananarivorL}rMjX AntananarivurNsU Pacific/GuamrO}rPjXGuamarQsU Asia/BeirutrR}rSjXBeirūtarTsUAmerica/Argentina/Rio_GallegosrU}rVjX RiogaljegosarWsUEurope/BucharestrX}rYjX BukaresterZsU Pacific/Waker[}r\jXVeikar]sUPacific/Gambierr^}r_jXGambjerar`sUAmerica/Vancouverra}rbjX VankūverarcsUAfrica/Dar_es_Salaamrd}rejX DāresalāmarfsUAtlantic/Reykjavikrg}rhjX ReikjavīkarisU Asia/Nicosiarj}rkjXNikosijarlsUEurope/Volgogradrm}rnjX VolgogradarosUEurope/Uzhgorodrp}rqjX UžgorodarrsUPacific/Aucklandrs}rtjXOklendarusU Africa/Banjulrv}rwjX BandžularxsUEurope/Budapestry}rzjX Budapeštar{sU Asia/Thimphur|}r}jXTimpur~sUAmerica/Sao_Paulor}rjXSanpaulursUAmerica/Belizer}rjXBelizarsUAmerica/Edmontonr}rjX EdmontonarsUAfrica/Nouakchottr}rjX NuakšotarsU Europe/Minskr}rjXMinskarsUAustralia/Perthr}rjXPērtarsUAmerica/Mendozar}rjXMendosarsU Europe/Zurichr}rjXCīrihersUPacific/Easterr}rjXLieldienu salarsU Asia/Jakartar}rjX DžakartarsU Asia/Karachir}rjXKaračirsUAntarctica/Palmerr}rjXPalmerarsUAustralia/Sydneyr}rjXSidnejarsUAfrica/Johannesburgr}rjX JohannesburgarsU America/Nomer}rjXNomarsU Asia/Muscatr}rjXMuskatarsUAtlantic/South_Georgiar}rjXDienviddžordžijarsUAfrica/El_Aaiunr}rjXAjūnarsUAsia/Kuala_Lumpurr}rjX KualalumpurarsUPacific/Wallisr}rjXVallisarsUAfrica/Blantyrer}rjX BlantairarsU Asia/Oralr}rjXOrālarsUAmerica/Campo_Grander}rjX KampugrandirsUAmerica/Dawson_Creekr}rjX DousonkrīkarsU Asia/Ashgabatr}rjX AšgabatarsUEurope/Istanbulr}rjX IstanbularsU Asia/Magadanr}rjX MagadānarsUAfrica/Kinshasar}rjXKinšasarsUAntarctica/Vostokr}rjXVostokarsUAmerica/Miquelonr}rjXMikelonarsU Africa/Niameyr}rjXNiamejarsU Asia/Anadyrr}rjXAnadirarsUAustralia/Lindemanr}rjX LindemanarsUAmerica/Porto_Velhor}rjX PortuveljursUAmerica/Argentina/Ushuaiar}rjXUšuajarsUPacific/Galapagosr}rjXGalapagu salasrsU Europe/Monacor}rjXMonakorsU Asia/Bishkekr}rjXBiškekarsU Africa/Ceutar}rjXSeūtarsUEurope/Copenhagenr}rjX KopenhāgenarsUAmerica/Winnipegr}rjXVinipegarsUAmerica/Dawsonr}rjXDausonarsUAustralia/Brisbaner}rjXBrisbenarsU Asia/Aqtober }r jXAktober sUAmerica/Recifer }r jXResifir sU Africa/Accrar }r jXAkrar sUEurope/Vilniusr }r jXViļņar sU America/Adakr }r jXAdakar sUAmerica/Cayenner }r jXKajennar sU Africa/Dakarr }r jXDakārar sU Asia/Riyadhr }r jXRijādar sUPacific/Kwajaleinr }r jX Kvadžaleinar sUAmerica/Fortalezar }r jX Fortalesar sU Asia/Yerevanr }r jXErevānar sUAmerica/La_Pazr! }r" jXLapasar# sUAustralia/Broken_Hillr$ }r% jX Brokenhilar& sU Asia/Irkutskr' }r( jXIrkutskar) sU Africa/Cairor* }r+ jXKairar, sUAmerica/Cuiabar- }r. jXKujabar/ sUAmerica/Chihuahuar0 }r1 jX Čihuahuar2 sU Europe/Moscowr3 }r4 jXMaskavar5 sUPacific/Guadalcanalr6 }r7 jX Gvadelkanālar8 sUAfrica/Windhoekr9 }r: jXVindhukar; sUIndian/Christmasr< }r= jX Ziemsvētkur> sUAmerica/Yellowknifer? }r@ jX JelounaifarA sUAmerica/Rio_BrancorB }rC jX RiobrankorD sUAfrica/Addis_AbabarE }rF jX AdisabebarG sUAmerica/CancunrH }rI jXKankūnarJ sU Asia/AqtaurK }rL jXAktaurM sUPacific/JohnstonrN }rO jX DžonstaunarP sUAsia/VientianerQ }rR jX VjangčanarS sUAmerica/DominicarT }rU jXDominikarV sUAmerica/HavanarW }rX jXHavannarY sUEurope/BrusselsrZ }r[ jXBriseler\ sU Europe/Lisbonr] }r^ jXLisabonar_ sUAfrica/Conakryr` }ra jXKonakrirb sU Asia/Makassarrc }rd jXMakasarare sUAsia/Qyzylordarf }rg jX Kizilordarh sUAmerica/Argentina/Tucumanri }rj jXTukumanark sUAtlantic/Azoresrl }rm jX Azoru salasrn sUAsia/Singaporero }rp jX Singapūrarq sUAsia/Chongqingrr }rs jXČuncinart sUAustralia/Euclaru }rv jXJūklarw sUAmerica/Chicagorx }ry jXČikāgarz sUAmerica/St_Kittsr{ }r| jX Sentkitsar} sUAmerica/Rankin_Inletr~ }r jX Rankininletar sUAmerica/Iqaluitr }r jXIkaluitar sUAfrica/Algiersr }r jXAlžīrar sUAfrica/Ndjamenar }r jX Ndžamenar sUAmerica/Guayaquilr }r jX Gvajakilar sUAsia/Samarkandr }r jX Samarkandar sU Asia/Bahrainr }r jXBahreinar sU Europe/Londonr }r jXLondonar sUAmerica/Menomineer }r jX Menominīr sUAmerica/Costa_Ricar }r jX Kostarikar sU Indian/Chagosr }r jXČagosar sUAmerica/Glace_Bayr }r jX Gleisbejar sU Asia/Jayapurar }r jX Džajapūrar sUIndian/Mayotter }r jXMajotar sUAsia/Phnom_Penhr }r jX Pnompeņar sUAmerica/Hermosillor }r jX Ermosiljor sUAtlantic/Faeroer }r jX Farēru salasr sUPacific/Port_Moresbyr }r jX Portmorsbir sU Africa/Tunisr }r jXTunisar sUAmerica/Anguillar }r jXAngiljar sU Asia/Damascusr }r jXDamaskar sU Asia/Qatarr }r jXKatarar sUAmerica/North_Dakota/Centerr }r jXCentra Ziemeļdakotār sU Asia/Bruneir }r jXBrunejar sUAmerica/Resoluter }r jX Rezolūtar sUAmerica/Guyanar }r jXGajānar sUAmerica/Indiana/Vevayr }r jXVivejar sU Asia/Yakutskr }r jXJakutskar sUAtlantic/St_Helenar }r jX Sv. Helēnar sUAmerica/Barbadosr }r jX Barbadosar sUAmerica/Tijuanar }r jXTihuānar sUEurope/Luxembourgr }r jX Luksemburgar sU Africa/Banguir }r jXBangir sUAmerica/Indiana/Winamacr }r jXVinimakar sUAmerica/Martiniquer }r jX Martinikar sUAmerica/Shiprockr }r jXŠiprokar sUAntarctica/DumontDUrviller }r jXDumont D'Urviller sUAmerica/Antiguar }r jXAntigvar sUAmerica/Indiana/Vincennesr }r jXVinsensar sU Asia/Almatyr }r jXAlmatir sUPacific/Midwayr }r jXMidvejar sUAmerica/Argentina/La_Riojar }r jXLariohar sUPacific/Tahitir }r jXTaitir sUAfrica/Mogadishur }r jX Mogadīšor sUAmerica/Santo_Domingor }r jX Santodomingor sUAfrica/Casablancar }r jX Kasablankar sUAsia/Novosibirskr }r jX Novosibirskar sUAmerica/St_Vincentr }r jX Sentvinsentar sUAmerica/Pangnirtungr }r jX Pangnirtangar sUAfrica/Lubumbashir }r jX Lubumbašir sUAfrica/Brazzaviller }r jX Brazavilar sUAmerica/Grand_Turkr }r jX Grendturkar sUPacific/Marquesasr }r jXMarkvesar sUAmerica/Asuncionr }r jX Asunsjonar sUAmerica/Kentucky/Monticellor }r! jX Montiselor" sU Europe/Viennar# }r$ jXVīner% sU Asia/Seoulr& }r' jXSeular( sUPacific/Norfolkr) }r* jXNorfolkar+ sU Europe/Dublinr, }r- jXDublinar. sUAmerica/Yakutatr/ }r0 jXJakutatar1 sU Africa/Lagosr2 }r3 jXLagosar4 sUAustralia/Hobartr5 }r6 jXHobartar7 sUEurope/Zaporozhyer8 }r9 jX Zaporožjer: sU Europe/Sofiar; }r< jXSofijar= sUAmerica/Juneaur> }r? jXDžunor@ sUAmerica/InuvikrA }rB jXInuvikarC sU Asia/TaipeirD }rE jXTaipejarF sUAfrica/Porto-NovorG }rH jX PortonovorI sU Asia/DushanberJ }rK jXDušanberL sUAmerica/AraguainarM }rN jX AragvainarO sUEurope/GibraltarrP }rQ jX GibraltārsrR sUAmerica/MontrealrS }rT jX MonreālarU sU Europe/VaduzrV }rW jXVaducarX sU Asia/TehranrY }rZ jX Teherānar[ sU Etc/Unknownr\ }r] jX Nezināmar^ sU Indian/Comoror_ }r` jXKomorura sUAmerica/New_Yorkrb }rc jXŅujorkard sU America/Bahiare }rf jXBrazīlija (Salvadora)rg sUAmerica/Anchoragerh }ri jXAļaskas laiksrj sUPacific/Tarawark }rl jXTaravarm sUAfrica/Ouagadougourn }ro jXVagadugurp sU Asia/Omskrq }rr jXOmskars sUAntarctica/South_Polert }ru jX Dienvidpolsrv suUscriptsrw }rx (UArabry Xarāburz UZxxxr{ XBez rakstībasr| ULatnr} Xlatīņur~ UZzzzr X!Nezināma vai nederīga rakstībar UCyrlr Xkirilicar uUvariantsr }r Unumber_symbolsr }r (Udecimalr X,r Ugroupr X r uUcurrency_namesr }r (UCOPr XKolumbijas pesor UUSDr X ASV dolārsr UGBPr X#Lielbritānijas sterliņu mārciņar UTWDr XJaunais Taivānas dolārsr USITr XSlovēnijas tolarsr UMTLr X Maltas lirar UBNDr XBrunejas dolārsr UEGPr XĒģiptes mārciņar UIDRr XIndonēzijas rūpijar UBGNr XBulgārijas levar UFJDr XFidži dolārsr UPENr XPeru jaunais solsr UDEMr XVācijas markar UEEKr XIgaunijas kronar UBOBr XBolīvijas bolivianor UDKKr XDānijas kronar USKKr XSlovakijas kronar UFRFr XFrancijas franksr UPKRr XPakistānas rūpijar UMXNr X Meksikas pesor UHUFr XUngārijas forintsr UVNDr XVjetnamas dongir URONr XRumānijas lejar UMYRr XMalaizijas ringitsr UZARr XDienvidāfrikas randsr UUAHr XUkrainas grivnar ULTLr X Lietuvas litsr UTRLr X Turcijas lirar USARr X Saūda riālsr UCADr XKanādas dolārsr USEKr XZviedrijas kronar USGDr XSingapūras dolārsr UHKDr XHonkongas dolārsr UAUDr XAustrālijas dolārsr UCHFr XŠveices franksr UKRWr XDienvidkorejas vonar UCNYr X Ķīnas juanar UTRYr XJaunā Turcijas lirar UVEBr XVenecuēlas bolivārsr UHRKr XHorvātijas kunar UNZDr XJaunzēlandes dolārsr jX Latvijas latsr UCLPr X Čīles pesor UTHBr XTaizemes bātsr UEURr XEiror UARSr XArgentīnas pesor UILSr XIzraēlas šekelisr UKZTr XKazahstānas tenger UNOKr XNorvēģijas kronar URSDr XSerbijas dinārsr URUBr XKrievijas rublisr UINRr XIndijas rūpijar UJPYr X Japānas jenar UCZKr XČehijas kronar UBRLr XBrazīlijas reālsr UMADr XMarokas dirhēmsr UPLNr X Polijas zlotsr UPHPr XFilipīnu pesor UKESr XKenijas šiliņšr UXXXr XNezināma vai nederīga valūtar UAEDr X"Apvienoto Arābu Emirātu dirhēmsr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXJr KXFr KXMr KXAr Kj Kj Kj Kj K XSr K XOr K XNr K XDr usUformatr }r (Uwider }r (KX janvārisr KX februārisr KXmartsr KXaprīlisr KXmaijsr KXjūnijsr KXjūlijsr KXaugustsr K X septembrisr K Xoktobrisr! K X novembrisr" K X decembrisr# uU abbreviatedr$ }r% (KXJanr& KXFebr' KXMarr( KXAprr) KXMair* KXJūnr+ KXJūlr, KXAugr- K XSepr. K XOktr/ K XNovr0 K XDecr1 uuuUcurrency_formatsr2 }r3 Nh()r4 }r5 (h+Nh,Kh-KKr6 h/X ¤r7 j7 r8 h2KKr9 h4X #,##0.00 ¤r: h6h7h8r; h:Nh;KKr< ubsUdaysr= }r> (U stand-aloner? }r@ (U abbreviatedrA }rB (KXPrrC KXotrD KXTrrE KXCerF KXpkrG KXSerH uUnarrowrI }rJ (KXPrK Kj KXTrL KXCrM KjK Kj Kj uuUformatrN }rO (UwiderP }rQ (KX pirmdienarR KXotrdienarS KX trešdienarT KX ceturtdienarU KX piektdienarV KX sestdienarW KX svētdienarX uU abbreviatedrY }rZ (KjK Kj KjL KjM KXPkr[ Kj KXSvr\ uuuU meta_zonesr] }r^ Uerasr_ }r` (Uwidera }rb (KXpirms mūsu ērasrc KX mūsu ērārd uU abbreviatedre }rf (KXpmērg KXmērh uUnarrowri }rj (KXp.m.ē.rk KXm.ē.rl uuu.PK[1ll(site-packages/babel/localedata/nl_NL.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[%%site-packages/babel/localedata/ar.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX١q KX٢q KX٣qKX٤qusUformatq}q(Uwideq}q(KXالربع الأولqKXالربع الثانيqKXالربع الثالثqKXالربع الرابعquU abbreviatedq}q(KXالربع الأولqKXالربع الثانيqKXالربع الثالثqKXالربع الرابعquuuUperiodsq}q(Uamq Xصq!Upmq"Xمq#uUscientific_formatsq$}q%Upercent_formatsq&}q'U week_dataq(}q)(Umin_daysq*KU weekend_startq+KU first_dayq,KU weekend_endq-KuU time_formatsq.}q/(Umediumq0cbabel.dates DateTimePattern q1)q2}q3(Upatternq4X h:mm:ss aq5Uformatq6X%(h)s:%(mm)s:%(ss)s %(a)sq7ubUfullq8h1)q9}q:(h4X v h:mm:ss aq;h6X%(v)s %(h)s:%(mm)s:%(ss)s %(a)sq}q?(h4X z h:mm:ss aq@h6X%(z)s %(h)s:%(mm)s:%(ss)s %(a)sqAubUshortqBh1)qC}qD(h4Xh:mm aqEh6X%(h)s:%(mm)s %(a)sqFubuU languagesqG}qH(UgvqIXالمنكيةqJUguqKXالغوجاراتيةqLUscnqMXالصقليةqNUromqOXالرومانية [rom]qPUalgqQX.اللغات الأمريكية الهنديةqRUaleqSXالأليوتيةqTUscoqUXالأسكتلنديةqVUmniqWXالمانيبرىqXUgdqYX%الغيلية الأسكتلنديةqZUgaq[Xالأيرلنديةq\Umnoq]Xلغات مانوبوq^Uosaq_Xالأوساجq`UgnqaXالجوارانىqbUaltqcX#الألطائية الجنوبيةqdUglqeXالجاليكيةqfUmwrqgXالماروارىqhUtyqiXالتاهيتيةqjUtwqkX التوىqlUttqmXالتتاريةqnUtrqoXالتركيةqpUtsqqXالسونجاqrUtnqsXالتسوانيةqtUtoquXتونجا - جزر تونجاqvUausqwX!اللغات الأستراليةqxUavqyXالأفاريكيةqzUtkq{Xالتركمانيةq|Uthq}Xالتايلانديةq~UroaqXالرومانسية - أخرىqUtgqXالطاجيكيةqUteqXالتيلجوqUugaqXاليجاريتيكqUmwlqXالميرانديزqUsmiqX&اللغات السامية - أخرىqUfatqXالفانتىqUfanqX الفانجqUwoqX الولوفqUrmqXالرهايتو-رومانسqUdinqX الدنكاqUblaqXالسيكسيكيةqUcmcqX!اللغات التشاميكيةqUmlqXالماليالامqUzhqXالصينيةqUtemqX التيمنqUen_CAqX#الإنجليزية الكنديةqUnwcqX#النوارية التقليديةqUzaqXالزهيونجqUcauqXالقوقازية - أخرىqUzuqX الزولوqUterqXالتيرينوqUtetqX التيتمqUmncqXالمانشوqUkutqXالكتيناىqUsukqXالسوكوماqUkumqX الكميكqUsusqX السوسوqUnewqXالنيوارىqUsuxqXالسوماريةqUdenqXالسلافيةqUmenqX الميندqUmulqXاللغات المتعددةqUlezqXالليزجهايانيةqUrootqX الجذرqUekaqXالاكاجكqUakkqXالأكاديةqUdraqXالدرافيدين - أخرىqUjrbqXالجيدو العربىqUsgnqXلغات الأشارةqUsgaqX#الأيرلندية القديمةqUapaqXاللغات الأباتشيةqUbraqXالبراجيةqUchbqXالتشيبشاqUchgqXالتشاجاتاىqUchkqXالتشكيزيةqUchmqX الماريqUchnqXالشينوك جارجونqUchoqXالشوكتوqUchpqXالشيباوايانqUchrqXالشيروكىqUchyqXالشايانqUtiqXالتيجرينياqUvotqXالفوتيكqUmgqXالمالاجاشيةqUibaqXالايبانqUmoqXالمولدوفيةqUmnqXالمنغوليةqUmiqXالماوريةqUmhqXالمارشاليةqUmkqXالمقدونيةqUmtqXالمالطيةqUcaiqX9الهندية الأمريكية الوسطى - أخرىqUdelqXالديلويرqUmsqXلغة الملايوrUmrrXالماراثىrUtarXالتاميليةrUmyrXالبورميةrUcadrX الكادوrUsrnr Xالسرانان تونجوr Utair Xتاى - أخرىr Uafhr XالأفريهيليةrUsitrX*الصينية التيبتية - أخرىrUenmrX!الانجليزية الوسطىrUen_AUrX)الانجليزية الأستراليةrUnynrXالنيانكولrUnyorXالنيوروrUnymrXالنيامويزىrUsiorXلغات السيويونrUmaprXالأوسترونيسيانrUmasrXالماسايr Ulahr!Xاللاهنداr"Uladr#Xالاسباعبريةr$Ufyr%Xالفريزيانr&Usnkr'Xالسونينكr(Ufar)Xالفارسيةr*Umadr+Xالمادريزr,Umagr-X الماجاr.Umair/Xالمايثيليr0Ufir1Xالفنلنديةr2Ufjr3Xالفيجيةr4Umanr5Xالماندينغr6Uegyr7Xالمصرية القديمةr8Uzndr9X الزاندr:Ussr;Xالسواتىr<Usrr=Xالصربيةr>Usqr?Xالألبانيةr@UswrAXالسواحليةrBUsvrCXالسويديةrDUsurEXالسودانيةrFUstrGXالسوتو الجنوبيةrHUskrIXالسلوفاكيةrJUsirKXالسريلانكيةrLUsorMXالصوماليةrNUsnrOX الشوناrPUsmrQXالساموائيةrRUslrSXالسلوفانيةrTUscrUXالسردينيةrVUsarWXالسنسكريتيةrXUsgrYXالسانجوrZUser[Xالسامي الشمالىr\Usdr]Xالسيندىr^Uzenr_Xالزيناجاr`UkbdraXالكاباردايانrbUafarcXلغة أفرو آسيويةrdUcsbreXالكاشبايانrfUlgrgXالجانداrhUlbriXاللوكسمبرجيةrjUfiurkX"فينو أجرايان - أخرىrlUlnrmXاللينجالاrnUloroXاللاويةrpUlirqXالليمبرجيشيةrrUbynrsXالبلينيةrtUltruXاللتوانيةrvUlurwXاللبا-كاتانجاrxUfilryXالفلبينيةrzUyir{Xاليديشيةr|Unonr}Xالنورس القديمr~UcebrXالسيبيونوrUyorXاليوروبيةrUnogrXالنوجاىrUbatrXالبلطيقية - أخرىrUdakrXالداكوتاrUdarrXالدارجواrUdayrX الدياكrUssarX,النيلية الصحراوية - أخرىrUkperX الكبيلrUelrXاليونانيةrUeorXاسبرانتوrUenrXالانجليزيةrUlamrXاللامباrUeerX الايويrUmdfrXالموكشاrUfrrXالفرنسيةrUmdrrXالماندارrUetrXالأستونيةrUesrXالأسبانيةrUrurXالروسيةrUgonrX الجندىrUgohrX.الألمانية العليا القديمةrUsmsrXالسكولت سامىrUsmnrXالاينارى سامىrUsmjrXاللول سامىrUde_ATrX%الألمانية النمساويةrUgotrXالقوطيةrUrnrX الرندىrUrorXالرومانيةrUdsbrXالصربية السفلىrUsmarXالسامي الجنوبىrUgorrXالجورونتالوrUastrXالأستريةrUwalrXالوالاموrUcrhrX<تركى كريمين، لغة توركية كريمينيةrUathrX%اللغات الأزباسكانيةrUgezrX الجيزrUffrX الفلةrUkforX الكوروrUmakrXالماكاسارrUzaprXالزابوتيكrUkokrXالكونكانيةrUzxxrXبدون محتوى لغويrUkosrXالكوسراينrUforXالفارويزrUtogrXتونجا - نياساrUhuprX الهباrUudmrXالأدمرتrUbejrX البيجاrUbemrXالبيمباrUtsirXالتسيمشيانrUberrXالبربريةrUnzirXالنزيماrUsairX=الهندية الأمريكية الجنوبية - أخرىrUangrX#الانجليزية القديمةrUprarX#اللغات البراقريطيةrUbhorXالبهوجبريةrUsalrXلغات ساليشانrUprorX%البروفانسية القديمةrUrajrXالراجاسثانيةrUsadrXالسانداوىrUanprXالأنجيكاrUes_419rX.أسبانية أمريكا اللاتينيةrUraprXالرابانىrUsasrXالساساكrUnqorXانكوrUcarrXالكاريبيةrUminrXالمينانجكاباوrUmicrXالميكماكيونيةrUefir X الافيكr Uarnr Xالأروكانيةr Uypkr Xاللغات اليوبيكيةrUmisrXاللغات المتنوعةrUkacrXالكاتشينrUkabrXالقبيليةrUkaarXالكارا-كالباكrUkajrXالجوrUkamrXالكامباrUkarrXالكاريينrUkawrX الكوىrUfr_CHrX#الفرنسية السويسريةr Ufr_CAr!Xالفرنسية الكنديةr"Ukar#Xالجورجيةr$Udoir%Xالدوجرىr&Ukgr'Xالكونغوr(Ukkr)Xالكازاخستانيةr*Ukjr+Xالكيونياماr,Ukir-Xالكيكيوr.Ukor/Xالكوريةr0Uknr1Xالكاناداr2Ukmr3Xالخميريةr4Uklr5Xالكالاليستr6Uksr7Xالكاشميريةr8Ukrr9Xالكانيورىr:Ukwr;Xالكورنيةr<Ukvr=X الكومىr>Ukur?Xالكرديةr@UkyrAXالقيرغستانيةrBUtklrCXالتوكيلاوrDUbuarEXالبرياتيةrFUmgarGX!الأيرلندية الوسطىrHUhitrIX الحثيةrJUdyurKXالدايلاrLUderMXالألمانيةrNUdarOXالدانماركيةrPUdzrQXالزونخايةrRUluirSXاللوسينوrTUdvrUXالمالديفيةrVUhilrWXالهيليجينونrXUhimrYXالهيماتشالىrZUgemr[Xالجرمانية (أخرى)r\Ucrpr]Xlالكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب - أخرىr^Uqur_Xالكويتشواr`UbasraX الباساrbUgbarcX الجبياrdUbadreXالبانداrfUbanrgXاللغة الباليةrhUbalriXالبلوشيةrjUshnrkXالشانيةrlUbairmX#اللغات الباميليكيةrnUarproXالأراباهوrpUartrqXالصناعية - أخرىrrUarwrsXالأراواكيةrtUarcruXالآراميةrvUen_USrwX0إنجليزية الولايات المتحدةrxUsemryXالسامية - أخرىrzUselr{Xالسيلكبr|Unubr}Xاللغات النوبيةr~UbtkrXالباتاكيةrUlusrX اللشاىrUmusrX الكريكrUluarXاللبا-لؤلؤrUirorX'اللغات الايروكويانيةrUirarXالايرانيةrUmunrXلغات المنداrUlunrXاللونداrUluorXاللوrUwarXالولونيةrUtuprXاللغات التوبيةrUjvrXالجاويةrUtutrXالألطائية - أخرىrUtumrXالتامبوكاrUjarXاليابانيةrUcoprX قبطيةrUilorXالايلوكوrUlarXاللاتينيةrUundrXغير محددهrUtlirXالتلينغيتيةrUtlhrXالكلينجونrUchrXالتشاموروrUcorXالكورسيكيةrUcarXالكاتالوينيةrUcerXالشيشانيةrUponrXالبوهنبيايانrUcyrXالولزيةrUsahrX الياكتrUcsrXالتشيكيةrUcrrX الكرىrUbntrXالبانتوrUcvrXالتشفاشrUcurXسلافية كنسيةrUlvrXاللاتفيةrUdumrXالهولندية الوسطىrUptrXالبرتغاليةrUduarXالديولاrUfrorXالفرنسية القديمةrUyaprXاليابيزrUfrmrXالفرنسية الوسطىrUtivrX التيفrUfrsrX#الفريزينية الشرقيةrUfrrrX%الفريزينية الشماليةrUyaorX الياوrUparXالبنجابيةrUxalrXالكالميكrUes_ESrX%الأسبانية الأيبيريةrUpirXالباليةrUen_GBrX)الانجليزية البريطانيةrUgayrX الجايوrUotorXاللغات الأوتوميةrUotarX!التركية العثمانيةrUhmnrXالهمونجيةrUanrXالأراجونيةrUgaarXالجاrUfurrXالفريلايانrUkhirXالخويسان - أخرىrUainrXالآينويةrUrarrXالراروتونجانىrUslarXالسلافية - أخرىrUverXالفينداrUvirXالفيتناميةrUisrXالأيسلانديةrUkhorXالخوتانيزrUiurXالاينكتيتتrUitrXالايطاليةrUiirXالسيتشيون يىrUikrXالاينبياكrUiorX الايدوrUiner X,الهندية الأوروبية - أخرىr Uiar Xاللّغة الوسيطةr Ujprr Xالجيدو الفارسىrUierXالانترلينجrUidrXالأندونيسيةrUigrXالايجبوrUpaprXالبابيامينتوrUeworXالايوندوrUpaurXالبالوانrUpaarXالغينية - أخرىrUpagrXالبانجاسينانrUsatrXالسانتالىr Upalr!Xالبهلويةr"Upamr#Xالبامبانجاr$Usycr%Xسريانية تقليديةr&Uphir'Xالفليبينية - أخرىr(Ucelr)Xالسلتية - أخرىr*Uphnr+Xالفينيقيةr,Unicr-X'النيجر - كوردوفانايانr.Uniar/X النياسr0Udgrr1Xالدوجريبr2Usyrr3Xالسريانيةr4Uniur5X النيويr6Ugswr7X%الألمانية السويسريةr8Ucchr9Xالأتسامr:Ujbor;Xاللوجبانr<Unahr=Xالناهيوتلr>Usamr?X#الآرامية السوماريةr@UhairAX الهيداrBUgmhrCX,الألمانية العليا الوسطىrDUcusrEXالكشيتيك - أخرىrFUwenrGXاللغات الصربيةrHUadyrIXالأديجهrJUelxrKXالامايتrLUadarMXالأدانجميةrNUpt_PTrOX'البرتغالية الأيبيريةrPUhawrQXلغة أهل الهاواىrRUbinrSXالبينيةrTUbikrUXالبيكوليةrVUpt_BRrWX)البرتغالية البرازيليةrXUmosrYX الموسيrZUmohr[Xالموهوكr\Utlr]Xالتاغالوغيةr^Uzh_Hansr_Xالصينية المبسطةr`Uzh_HantraX!الصينية التقليديةrbUtvlrcXالتوفالوrdUijoreX الايجوrfUkmbrgXالكيمبندوrhUpeoriXالفارسية القديمةrjUumbrkXالأمبندوrlUtmhrmXالتاماشيكrnUfonroX الفونrpUhsbrqXالصربية العلياrrUbersXالبيلوروسيةrtUbgruXالبلغاريةrvUbarwXالباشكيريةrxUpsryXالبشتونيةrzUbmr{Xالبامباراr|Ubnr}Xالبنغاليةr~UborXالتبتيةrUbhrXالبيهاريةrUbirXالبيسلاميةrUbrrXالبريتونيةrUbsrXالبوسنيةrUruprXالأرومانيانrUomrXالأوروموrUojrXالأوجيبواrUacerXالأتشينيزيةrUachrXالأكوليةrUocrXالأوكيتانيةrUsrrrX السررrUkrorX الكروrUkrlrXالكريليةrUkrcrX!الكاراتشاى-بالكارrUndsrXالألمانية السفلىrUosrXالأوسيتيكrUorrXالأوريياrUsogrXالسوجدينrUnsorXالسوتو الشماليةrUsonrXالسونجهاىrUde_CHrX2الألمانية العليا السويسريةrUvairX الفاىrUwakrXلغات الواكاشانrUlolrX منغولىrUmkhrXالمون خمير- أخرىrUawarXالأواديةrUlozrX اللوزىrUgilrXلغة أهل جبل طارقrUwasrX الواشوrUwarrXالواراىrUhzrXالهيريروrUhyrXالأرمينيةrUsidrXالسيداموrUhrrXالكرواتيةrUhtrXالهايتيةrUhurXالهنغاريةrUhirXالهنديةrUhorXالهيرى موتوrUharX الهوساrUbugrXالبجينيزيةrUherXالعبريةrUuzrXالاوزباكيةrUurrXالأرديةrUplrXالبولنديةrUukrXالأوكرانيةrUugrXالأغوريةrUaarXالأفاريةrUabrXالأبخازيةrUaerXالأفستيةrUafrXالأفريقيةrUakrXالأكانيةrUamrXالأمهريةrUmyvrXاللغة الارزيةrUeurXلغة الباسكrUasrXالأساميةrUarrXالعربيةrUinhrXالانجوشيةrUtpirXالتوك بيسينrUmynrXلغات الماياrUayrXالأيماراrUkharXالكازيةrUazrXالأذريةrUincrXالهندية - أخرىrUnlrXالهولنديةrUnnrX#النينورسك النرويجيrUnorXالنرويجيةrUnarX النوروrUnbrX'البوكمالية النرويجيةrUnair X=الهندية الأمريكية الشمالية - أخرىr Undr Xالنديبيل الشمالىr Uner XالنيباليةrUngrXالندونجاrUnyrX4النيانجا، التشيتشوا، التشواrUnaprXاللغة النابوليةrUgrbrXالجريبوrUgrcrX!اليونانية القديمةrUnrrXالنديبيل الجنوبىrUtigrX التيجرrUnvrXالنافاجوrUzunrXالزونيةr Urwr!Xالكينياروانداr"Ucper#Xالكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الأنجليزيةr$Ucpfr%Xالكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس الفرنسيةr&Ucppr'Xالكرييولى و اللغات المبسطة الأخرى للتفاهم بين الشعوب على أساس البرتغاليةr(uU territoriesr)}r*(UBDr+Xبنجلاديشr,UBEr-X بلجيكاr.UBFr/Xبوركينا فاسوr0UBGr1Xبلغارياr2UVEr3Xفنزويلاr4UBAr5Xالبوسنة والهرسكr6UBBr7Xبربادوسr8UWFr9Xجزر والس وفوتوناr:UBMr;X برموداr<UBNr=X برونايr>UBOr?Xبوليفياr@UBHrAXالبحرينrBUBIrCXبورونديrDUBJrEXبنينrFUBTrGX بوتانrHU011rIXغرب افريقياrJUBVrKXجزيرة بوفيهrLUBWrMXبتسواناrNU014rOXشرق افريقياrPU015rQXشمال افريقياrRUBRrSXالبرازيلrTU017rUXوسط افريقياrVU018rWXجنوب افريقياrXU019rYXالأمريكتينrZUBYr[Xروسيا البيضاءr\UBZr]Xبليزr^ULVr_X لاتفياr`URWraX روانداrbURSrcX صربياrdUTLreXتيمور الشرقيةrfURErgXروينيونrhUTMriXتركمانستانrjUOMrkXعمانrlUTJrmXطاجكستانrnUROroXرومانياrpUTKrqX توكيلوrrUGWrsXغينيا بيساوrtUGUruXجوامrvUGTrwXجواتيمالاrxUGSryXHجورجيا الجنوبية وجزر ساندويتش الجنوبيةrzUGRr{Xاليونانr|UGQr}Xغينيا الاستوائيةr~UGPrXجوادلوبrUJPrXاليابانrUKIrXكيريباتيrUGYrX غياناrUGFrX غوياناrUGErX جورجياrUGDrXجريناداrU021rXشمال أمريكاrUGBrXالمملكة المتحدةrUGArXالجابونrUSVrXالسلفادورrUGNrX غينياrUGMrX غامبياrUGLrXجرينلاندrU029rXالكاريبيrUGIrXجبل طارقrUGHrXغاناrUJErX جيرسيrUTNrXتونسrUJMrXجامايكاrU013rXأمريكا الوسطىrUWSrX سامواrU419rX3أمريكا اللاتينية و الكاريبيrUHRrXكرواتياrUBSrXالباهاماrUHTrX هايتيrUHUrX المجرrUHKrX هونج كونج الصينيةrU039rXجنوب أوروباrUHNrXهندوراسrUFIrX فنلنداrU142rXآسياrU030rXشرق آسياrU034rXجنوب آسياrU035rXجنوب شرق آسياrUPRrXبورتوريكوrUPSrX فلسطينrUFKrXجزر فوكلاندrUIOrX,المحيط الهندي البريطانيrUPWrX بالاوrUPTrXالبرتغالrUSJrX$سفالبارد وجان مايانrUMDrXمولدافياrUFMrXميكرونيزياrUIQrX العراقrUPArXبنماrUPFrX#بولينيزيا الفرنسيةrUPGrX$بابوا غينيا الجديدةrUPErXبيروrUPKrXباكستانrUPHrXالفيلبينrUFOrXجزر فاروrUPNrXبتكايرنrUPLrX بولنداrUPMrX"سانت بيير وميكولونrUZMrX زامبياrUEHrXالصحراء الغربيةrURUrX روسياrUEErXاستونياrUEGrXمصرrUZArX&جمهورية جنوب افريقياrUECrXالاكوادورrUITrXايطالياrUVNrX فيتنامrUZZrXمنطقة غير معرفةrUSBrXجزر سليمانrUETrXاثيوبياrUSOrXالصومالrUZWrXزيمبابويrUSAr X.المملكة العربية السعوديةr UESr Xأسبانياr UERr XاريترياrUMErXالجبل الأسودrUAQrXالقطب الجنوبيrUMGrX مدغشقرrUMFrXسانت مارتينrUMArX المغربrUMCrX موناكوrUUZrXأوزبكستانrUMMrXميانمارrUMLrXماليr UMOr!Xماكاو الصينيةr"UMNr#Xمنغولياr$UHMr%X(جزيرة هيرد وماكدونالدr&UASr'Xساموا الأمريكيةr(UMKr)Xمقدونياr*UMUr+Xموريشيوسr,UMTr-X مالطاr.UMWr/X ملاويr0UMVr1Xجزر الملديفr2UMQr3Xمارتينيكr4UMPr5X&جزر ماريانا الشماليةr6UMSr7Xمونتسراتr8UMRr9Xموريتانياr:UIMr;Xجزيرة مانr<UUGr=X أوغنداr>UTZr?Xتانزانياr@UMYrAXماليزياrBUMXrCXالمكسيكrDUILrEXاسرائيلrFUFRrGX فرنساrHUAWrIX آروباrJUDOrKX!جمهورية الدومينيكrLUSHrMXسانت هيلناrNUVCrOX$سانت فنسنت وغرنادينrPU054rQXميلانيزياrRUDJrSX جيبوتيrTUFJrUXفيجيrVU057rWX#الجزر الميكرونيزيةrXU172rYX*كومنولث الدول المستقلةrZU053r[X%أستراليا ونيوزيلنداr\UNIr]Xنيكاراجواr^UNLr_X هولنداr`UNOraXالنرويجrbUNArcXناميبياrdUVUreXفانواتوrfUNCrgX!كاليدونيا الجديدةrhUNEriX النيجرrjUNFrkXجزيرة نورفوكrlUNGrmXنيجيرياrnUNZroXنيوزيلانداrpUNPrqX نيبالrrUNRrsXنوروrtUNUruXنيويrvU061rwXبولينيزياrxUCIryXساحل العاجrzUCHr{X سويسراr|UCOr}Xكولومبياr~UCNrX الصينrUCMrXالكاميرونrUCLrXشيليrUCCrXجزر كوكوسrUCArXكنداrUCGrX!الكونغو - برازافيلrUCFrX*جمهورية افريقيا الوسطىrUCDrX4جمهورية الكونغو الديمقراطيةrUCZrXجمهورية التشيكrUCYrXقبرصrUCXrXجزيرة الكريسماسrUCSrX$صربيا والجبل الأسودrUCRrXكوستاريكاrUPYrXباراجوايrUCVrXالرأس الأخضرrUCUrXكوباrUSZrXسوازيلاندrUSYrX سورياrUKGrXقرغيزستانrUKErX كينياrUSRrXسورينامrU143rXوسط آسياrUKHrXكمبودياrUKNrXسانت كيتس ونيفيسrUKMrXجزر القمرrUSTrX"ساو تومي وبرينسيبيrUSKrXسلوفاكياrUKRrXكوريا الجنوبيةrUSIrXسلوفينياrUKPrXكوريا الشماليةrUKWrX الكويتrUSNrXالسنغالrUSMrXسان مارينوrUSLrXسيراليونrUSCrXسيشلrUKZrXكازاخستانrUKYrXجزر الكايمنrUSGrXسنغافورةrUSErX السويدrUSDrXالسودانrU151rXشرق أوروباrU150rX أوروباrUDMrXدومينيكاrU155rXغرب أوروباrU154rXشمال أوروباrUVGrX&جزر فرجين البريطانيةrUDErXألمانياrUYErX اليمنrUMHrXجزر المارشالrU062rXجنوب وسط آسياrUDZrXالجزائرrUUSrX2الولايات المتحدة الأمريكيةrUUYrXأورجوايrUYTrX مايوتrUUMrXDجزر الولايات المتحدة البعيدة الصغيرةrULBrX لبنانrULCrXسانت لوسياrULArXلاوسrUTVrX توفالوrUTWrX تايوانrUTTrXترينيداد وتوباغوrUTRrX تركياrULKrXسريلانكاrULIrXليختنشتاينrUCKrX جزر كوكrUTOrX تونجاrULTrXليتوانياrULUrXلوكسمبورجrULRrXليبيرياrULSr X ليسوتوr UTHr X تايلندr UTFr X4المقاطعات الجنوبية الفرنسيةrUTGrXتوجوrUTDrXتشادrUTCrX جزر الترك وجايكوسrULYrX ليبياrUVArXالفاتيكانrU145rXغرب آسياrUAErX.الامارات العربية المتحدةrUADrX أندوراrUAGrXأنتيجوا وبربوداr UAFr!Xأفغانستانr"UAIr#Xأنجويلاr$UVIr%X$جزر فرجين الأمريكيةr&UISr'Xأيسلنداr(UIRr)X ايرانr*UAMr+Xأرمينياr,UALr-Xألبانياr.UAOr/X أنجولاr0UANr1X(جزر الأنتيل الهولنديةr2U003r3Xأمريكا الشماليةr4U002r5Xافريقياr6U001r7X العالمr8UARr9Xالأرجنتينr:UAUr;Xأسترالياr<UATr=X النمساr>U005r?Xأمريكا الجنوبيةr@UINrAX الهندrBUAXrCXجزر أولانrDU009rEXأوقيانوسياrFUAZrGXأذربيجانrHUIErIXأيرلانداrJUIDrKXاندونيسياrLUJOrMX الأردنrNUQUrOXالاتحاد الاوروبيrPUUArQXأوكرانياrRUQArSXقطرrTUDKrUXالدانمركrVUMZrWXموزمبيقrXUQOrYX#أوقيانوسيا النائيةrZuUdecimal_formatsr[}r\Ncbabel.numbers NumberPattern r])r^}r_(Uexp_precr`NUscaleraKU frac_precrbKKrcUsuffixrdXrejerfUint_precrgKKrhh4X #,##0.###riUprefixrjjejerkUexp_plusrlNUgroupingrmKKrnubsU date_formatsro}rp(Umediumrqh1)rr}rs(h4Xdd‏/MM‏/yyyyrth6X%(dd)s‏/%(MM)s‏/%(yyyy)sruubUfullrvh1)rw}rx(h4XEEEE، d MMMM، yyyyryh6X$%(EEEE)s، %(d)s %(MMMM)s، %(yyyy)srzubUlongr{h1)r|}r}(h4X d MMMM، yyyyr~h6X%(d)s %(MMMM)s، %(yyyy)srubUshortrh1)r}r(h4Xd‏/M‏/yyyyrh6X%(d)s‏/%(M)s‏/%(yyyy)srubuUcurrency_symbolsr}r(UKMFrX .‏ف.ج.قrUDZDrX د.ج.‏rUQARrX ر.ق.‏rUEGPrX ج.م.‏rUAEDrX د.إ.‏rUIQDrX د.ع.‏rULBPrX ل.ل.‏rUKWDrX د.ك.‏rULYDrX د.ل.‏rUBRLrX .‏ر.بrUJODrX د.أ.‏rUSARrX ر.س.‏rUTNDrX د.ت.‏rUMROrX .‏أ.مrUXAFrX .‏ف.اrUSDPrX ج.س.‏rURUBrX ر.ر.‏rUBHDrX د.ب.‏rUINRrX .‏ر.هrUSDDrX .‏د.سrUOMRrX ر.ع.‏rUSYPrX ل.س.‏rUMADrX د.م.‏rUYERrX ر.ي.‏ruU time_zonesr}r(UAtlantic/Canaryr}rUcityrX كناريrsUAntarctica/Mawsonr}rjX ماوسونrsUAmerica/Buenos_Airesr}rjXبوينوس أيرسrsUAustralia/Melbourner}rjXميلبورنrsU Pacific/Waker}rjXواكrsUAmerica/Nipigonr}rjXنيبيجونrsUAmerica/Louisviller}rjXلويس فيلrsUAustralia/Darwinr}rjX دارونrsUAmerica/Whitehorser}rjXوايت هورسrsUAntarctica/Davisr}rjX دافيزrsUAmerica/Coral_Harbourr}rjXكورال هاربرrsUAmerica/Swift_Currentr}rjXسوفت كارنتrsU Europe/Samarar}rjX سمراءrsU Asia/Tashkentr}rjX طشقندrsUEurope/Simferopolr}rjXسيمفروبولrsUAmerica/Maceior}rjX ماشيوrsU Asia/Magadanr}rjX مجادنrsUEurope/Zaporozhyer}rjXزابوروزيrsU Asia/Kashgarr}rjX كاشجارrsUAmerica/Detroitr}rjXديترويتrsU Asia/Kuchingr}rjX كيشينجrsU Asia/Urumqir}rjX أرومكيrsU Europe/Moscowr}rjX موسكوrsUAmerica/Indiana/Knoxr}rjX كونكسrsUAmerica/Indiana/Petersburgr}rjXبيترسبرجrsU Europe/Madridr}rjX مدريدrsUPacific/Kiritimatir}r jXكيريتي ماتيr sUAmerica/Santiagor }r jXسانتيجوr sUAsia/Pontianakr}rjXبونتيانكrsUAsia/Ulaanbaatarr}rjXآلانباتارrsUEurope/Guernseyr}rjXجيرونسىrsUAmerica/Rainy_Riverr}rjXراني ريفرrsUAmerica/Argentina/San_Luisr}rjXسان لويسrsUAntarctica/Rotherar}rjX روثيراrsUAustralia/Adelaider }r!jXأدلياداr"sUAmerica/Indianapolisr#}r$jXإنديانابوليسr%sUAmerica/Reginar&}r'jX ريجيناr(sU Pacific/Trukr)}r*jXتركr+sUAmerica/Cambridge_Bayr,}r-jXكامبرديج بايr.sUAmerica/Mexico_Cityr/}r0jXمدينة المكسيكr1sU America/Boiser2}r3jX بويزيr4sUPacific/Chathamr5}r6jX تشاثامr7sUPacific/Midwayr8}r9jX ميدوايr:sU America/Jujuyr;}r<jXجوجوr=sUAmerica/Cordobar>}r?jXكوردوباr@sU America/BelemrA}rBjXبلمrCsU Europe/RomerD}rEjXإيطالياrFsU Asia/HarbinrG}rHjX هاربينrIsUAustralia/Lord_HowerJ}rKjXلورد هاوrLsUAmerica/Argentina/San_JuanrM}rNjXسان خوانrOsUPacific/KosraerP}rQjX كوسراrRsUAmerica/North_Dakota/New_SalemrS}rTjXنيو ساليمrUsUAmerica/MonterreyrV}rWjXمونتيريrXsUAsia/KrasnoyarskrY}rZjXكراسنويارسكr[sU Europe/Jerseyr\}r]jX جيرسىr^sUAmerica/Boa_Vistar_}r`jXباو فيستاrasUAsia/Yekaterinburgrb}rcjXيكاترنبيرجrdsUAmerica/Araguainare}rfjXأروجوانياrgsUAntarctica/Caseyrh}rijX كاسايrjsUPacific/Honolulurk}rljXهونولولوrmsUPacific/Enderburyrn}rojXاندربيرجrpsU America/Thulerq}rrjXثيلrssUAmerica/St_Johnsrt}rujXسانت جونزrvsUAmerica/Monctonrw}rxjXوينكتونrysUPacific/Majurorz}r{jX ماجوروr|sUPacific/Aucklandr}}r~jXأوكلاندrsUAmerica/Mazatlanr}rjXمازاتلانrsUEurope/Belgrader}rjX صربياrsUAsia/Choibalsanr}rjXتشوبالسانrsU Europe/Kievr}rjXكييفrsUAntarctica/Syowar}rjX سايوواrsUAmerica/Halifaxr}rjXهاليفاكسrsUAntarctica/McMurdor}rjXماك موردوrsU Asia/Hovdr}rjXهوفدrsUAmerica/Danmarkshavnr}rjXدانمرك شافنrsUAmerica/Thunder_Bayr}rjXثندر بايrsUAmerica/Scoresbysundr}rjXسكورسبيسندrsUAmerica/Eiruneper}rjXايرونبيrsUAmerica/Manausr}rjX ماناوسrsUAmerica/Los_Angelesr}rjXلوس انجلوسrsUAmerica/Noronhar}rjXنوروناهrsUAmerica/Goose_Bayr}rjX جوس بايrsUAmerica/Catamarcar}rjXكاتاماركاrsUAmerica/Chihuahuar}rjXتشيواواrsUAmerica/Argentina/Rio_Gallegosr}rjXريو جالييوسrsUPacific/Gambierr}rjX جامبيرrsUAmerica/Vancouverr}rjXفانكوفرrsUEurope/Volgogradr}rjXفولوجرادrsU Africa/Bamakor}rjX باماكوrsUEurope/Uzhgorodr}rjXأوزجرودrsUPacific/Ponaper}rjX بانابrsU Asia/Aqtaur}rjX أكتاوrsUAmerica/Sao_Paulor}rjXساو باولوrsUAmerica/Edmontonr}rjXايدمونتونrsUAustralia/Perthr}rjXبرثاrsUAmerica/Mendozar}rjXميندوزاrsUAmerica/Meridar}rjX ميريداrsUPacific/Easterr}rjXاسترrsU Asia/Jakartar}rjX جاكرتاrsUAntarctica/Palmerr}rjX بالميرrsUAustralia/Sydneyr}rjX سيدنيrsUAmerica/Godthabr}rjX جودثابrsUAtlantic/Madeirar}rjX ماديراrsU Asia/Oralr}rjX أورالrsUAmerica/Campo_Grander}rjXكومبو جراندrsUAmerica/Dawson_Creekr}rjXداوسن كريكrsUAfrica/Kinshasar}rjXكينشاساrsUAmerica/Yakutatr}rjXياكوتاتrsUAntarctica/Vostokr}rjX فوستوكrsUAustralia/Lindemanr}rjXليندمانrsUAmerica/Porto_Velhor}rjXبورتو فيلوrsUAmerica/Argentina/Ushuaiar}rjXأشواr sUPacific/Galapagosr }r jXجلاباجوسr sUAmerica/Indiana/Marengor }rjX مارنجوrsU Africa/Ceutar}rjXسيتاrsUAmerica/Winnipegr}rjXوينيبيجrsUAmerica/Dawsonr}rjX داوسانrsUAustralia/Brisbaner}rjXبرسيبانrsU Asia/Aqtober}rjX أكتوبrsUAmerica/Recifer}r jX ريسيفr!sU Asia/Sakhalinr"}r#jX سكالينr$sUPacific/Kwajaleinr%}r&jXكواجالينr'sUAmerica/Fortalezar(}r)jXفورتاليزاr*sUAustralia/Broken_Hillr+}r,jXبروكن هيلr-sUAmerica/Phoenixr.}r/jX فينكسr0sUAmerica/Cuiabar1}r2jX كياباr3sUAmerica/Kentucky/Monticellor4}r5jXمونتيسيلوr6sUPacific/Tarawar7}r8jX تاراواr9sUAmerica/Yellowknifer:}r;jX يلونيفr<sUAmerica/Rio_Brancor=}r>jXريوبرانكوr?sUAmerica/Cancunr@}rAjX كانكونrBsUAsia/VladivostokrC}rDjXفلاديفوستكrEsUPacific/JohnstonrF}rGjXجونستونrHsUEurope/KaliningradrI}rJjXكالينجرادrKsU Europe/LisbonrL}rMjX ليسبونrNsU Asia/MakassarrO}rPjX ماكسارrQsUAsia/QyzylordarR}rSjXكيزيلورداrTsUAmerica/Argentina/TucumanrU}rVjX تاكمانrWsUAtlantic/AzoresrX}rYjX أزورسrZsUAsia/Chongqingr[}r\jXتشونجكينجr]sUAmerica/Chicagor^}r_jX شيكاغوr`sU Asia/Shanghaira}rbjXالعالميةrcsUAmerica/Rankin_Inletrd}rejXرانكن انلتrfsUAmerica/Iqaluitrg}rhjX اكويلتrisU Asia/Irkutskrj}rkjXايركيتسكrlsUAmerica/Guayaquilrm}rnjXجواياكيلrosUAsia/Kuala_Lumpurrp}rqjXكوالالمبورrrsUAmerica/Menomineers}rtjXمينومينيrusUAmerica/Denverrv}rwjXدنفرrxsUAsia/Kamchatkary}rzjXكامتشاتكاr{sUAmerica/Glace_Bayr|}r}jXجلاس بايr~sU Asia/Jayapurar}rjXجايابيوراrsUAmerica/Hermosillor}rjXهيرموسيلوrsU Europe/Londonr}rjXلندنrsUAmerica/North_Dakota/Centerr}rjXسنترrsUAmerica/Pangnirtungr}rjXبانجينتينجrsUAmerica/Indiana/Vevayr}rjX فيفايrsU Asia/Yakutskr}rjX ياكتسكrsUAmerica/Shiprockr}rjX شيبروكrsUAmerica/Tijuanar}rjXتيخواناrsU America/Adakr}rjXأداكrsUAntarctica/DumontDUrviller}rjXدي مونت دو روفيلrsUAmerica/Indiana/Vincennesr}rjXفينسينسrsU Asia/Almatyr}rjX ألماتيrsUAmerica/Argentina/La_Riojar}rjXلاريوهاrsUPacific/Tahitir}rjX تاهيتيrsUAsia/Novosibirskr}rjXنوفوسبيرسكrsUAmerica/Indiana/Winamacr}rjXويناماكrsUEurope/Podgoricar}rjXالجبل الأسودrsUAfrica/Lubumbashir}rjXلومبباشاrsUPacific/Marquesasr}rjXماركيساسrsU Asia/Anadyrr}rjX أنديرrsUAmerica/New_Yorkr}rjXنيويوركrsU America/Nomer}rjXنومrsUArctic/Longyearbyenr}rjXلونجيربنrsUAustralia/Hobartr}rjX هوبارتrsUAmerica/Juneaur}rjXجونيrsUAmerica/Inuvikr}rjXاينوفيكrsUAsia/Samarkandr}rjX سمرقندrsUAmerica/Montrealr}rjXمونتريالrsUAmerica/Torontor}rjXتورونتوrsU Etc/Unknownr}rjXغير معروفrsU America/Bahiar}rjX باهياrsUAmerica/Anchorager}rjXأنكوريجrsU Asia/Omskr}rjX أومسكrsUAntarctica/South_Poler}rjXالقطب الجنوبيrsuUscriptsr}r(UGururXالجرمخىrUHebrrXالعبريةrUZzzzrX+شفرة للنصوص الغير مشفرةrUPhnxrXالفينيقيةrUMoonrXمونrUChamrXالتشاميةrUArabrXالعربيةrUGujrrXالتاغجراتيةrUZxxxrX+شفرة للغات الغير مكتوبةrULycirXالليسيةrUSinhrXالسينهالاrUTalur Xالتاى لى الجديدr UMongr Xالمغوليةr UXpeor Xالفارسية القديمةr UVispr Xالكلام المرئىr UTaler Xالتاى لىr UMandr Xالمانداينيةr UMlymr Xالماليالامr UTibtr Xالتبتيةr UKalir Xالكياه لىr UJpanr Xاليابانيةr UPlrdr Xالصوتيات الجماءr UKanar Xالكتكاناr ULydir Xالليديةr ULepcr Xالليبتشا - رونجr USundr Xالسوندانيةr UYiiir Xاليىr UJavar Xالجاويةr! UOryar" Xالأورياr# ULaoor$ X اللاوr% UUgarr& Xالأجاريتيكيةr' UCyrlr( Xالسيريليةr) UVaiir* X الفاىr+ UArmnr, Xالأرمينيةr- UCyrsr. XNالسيريلية - متغير السلافية الكنسية القديمةr/ UKhmrr0 Xالخميريةr1 USylor2 Xالسيلوتى ناجرىr3 UItalr4 X!الإيطالية القديمةr5 UXsuxr6 XEالكتابة المسمارية الأكادية السوماريةr7 UThaar8 X الثعنةr9 UThair: Xالتايلانديةr; UCprtr< Xالقبرصيةr= ULinbr> Xالخطية بr? ULinar@ Xالخطية أrA UOsmarB XالأوسمانياrC UHirarD XالهيراجاناrE UHanirF X الهانrG UEgydrH XالديموطيقيةrI UQaairJ XالموروثrK UEgyhrL XالهيراطيقيةrM UCansrN X/مقطعيات أصلية كندية موحدةrO UEgyprP XالهيروغليفيةrQ UTfngrR X!التيفيناغ - البربرrS UShawrT XالشوانىrU UCirtrV X السيرثrW UGeorrX XالجورجيةrY UTengrZ Xالتينجوارr[ UHrktr\ X*الكتكانا أو الهيراجاناr] UGeokr^ XFالأبجدية الجورجية - أسومتافرلى و نسخرىr_ UOgamr` Xالأوجهامra UDsrtrb Xالديسيريتrc UGothrd Xالقوطيةre UHanorf Xالهانونوrg UBalirh Xالباليةri UKorerj Xالكوريةrk UHangrl Xالهانجلrm UCarirn Xالكاريةro UTagbrp Xالتاجبانواrq UHansrr Xالهان المبسطةrs UHantrt Xالهان التقليديةru URororv Xرنجورنجوrw UDevarx Xالديفاناجارىry UIndsrz Xاندس - هارابانr{ UBopor| Xالبوبوموفوr} UMymrr~ Xالميانمارr UTglgr Xالتغالوغيةr UPermr X#البيرميكية القديمةr UBugir Xالبجينيزr UPhagr Xالفاجسباr UBrair Xالبرايلr UBrahr Xالهندوسيةr UBatkr Xالباتاكr UMeror Xالميرويتيكr ULimbr Xالليمبوr UTelur Xالتيلجوr UTamlr Xالتاميليةr USarar Xالساراتىr ULatgr X(اللاتينية - متغير غيلىr ULatfr X,اللاتينية - متغير فراكترr UKharr Xالخاروشتىr UNkoor Xانكوr ULatnr Xاللاتينيةr UMayar X%المايا الهيروغليفيةr ULanar X الاناr UEthir Xالاثيوبيةr UHmngr Xالباهوه همونجr UBuhdr Xالبهيديةr UCoptr Xالقبطيةr UGlagr Xالجلاجوليتيكr URunrr X الرونىr UOrkhr Xالأورخونr UHungr Xالمجرية القديمةr UGrekr Xاليونانيةr UCherr Xالشيروكىr UZyyyr Xعامr USyrcr Xالسريانيةr UBlisr Xرموز بليسr UBengr Xالبنغاليةr USyrer Xالسريانية [Syre]r USyrjr X(السريانية - متغير غربىr USyrnr X(السريانية - متغير شرقىr UKndar Xالكاناداr uUvariantsr }r (UNEDISr Xلهجة ناتيسونr UBAKU1926r XAالأبجدية التركية اللاتينية الموحدةr UREVISEDr X كتابة تم مراجعتهاr UAREVMDAr Xارمنية غربيةr U1996r X/الكتابة الألمانية لعام 1996r UMONOTONr Xأحادي النغمةr UAREVELAr Xارمنية شرقيةr UPOSIXr Xكمبيوترr UVALENCIAr X بلنسيةr UPOLYTONr Xمتعدد النغماتr U1901r X4الكتابة الألمانية التقليديةr uUnumber_symbolsr }r (Udecimalr X٫r U percentSignr X٪r Ugroupr X٬r UnativeZeroDigitr X٠r uUcurrency_namesr }r (UXXXr Xبدون عملةr jXدينار جزائرىr ULVRr Xروبل لاتفياr jXفرنك جزر القمرr UBOPr Xبيزو بوليفىr jXجنيه مصرىr UBGLr Xليف بلغارىr UBGNr Xليف بلغارى جديدr UPABr Xبالبوا بنمىr UZWDr Xدولار زمبابوىr UGHCr Xسيدى غانىr UBOBr Xبوليفاريوr UXBAr X.الوحدة الأوروبية المركبةr UDKKr Xكرونة دانماركىr UXBCr X0الوحدة الحسابية الأوروبيةr UXBBr X.الوحدة المالية الأوروبيةr UBWPr Xبولا بتسوانىr jXجنية لبنانىr UTZSr Xشلن تنزانىr UVNDr Xدونج فيتنامىr UNADr Xدولار نامبياr UAOAr Xكوانزا أنجولىr UAONr X0كوانزا أنجولى جديدة - 1990-2000r UKHRr Xرييال كمبودىr UMYRr Xرينغيت ماليزىr UAOKr X%كوانزا أنجولى - 1977-1990r USOSr Xشلن صومالىr UKYDr Xدولار جزر كيمنr! jXدينار ليبىr" UUAHr# Xهريفنيا أوكرانىr$ UUGXr% Xشلن أوغندىr& jXدينار أردنىr' UAORr( X2كوانزا أنجولى معدلة - 1995 - 1999r) USURr* Xروبل سوفيتىr+ UAWGr, Xجلدر أروبىr- jXريال سعودىr. UFIMr/ Xماركا فنلندىr0 UHKDr1 Xدولار هونج كونجr2 USRGr3 Xجلدر سورينامىr4 UTPEr5 Xاسكود تيمورىr6 UMGFr7 Xفرنك مدغشقرr8 UCHFr9 Xفرنك سويسرىr: UGIPr; Xجنيه جبل طارقr< UBYRr= Xروبل بيلاروسىr> UALLr? Xليك ألبانيr@ jXأوقية موريتانيةrA UBOVrB Xمفدول بوليفىrC UHRKrD Xكونا كرواتىrE UDJFrF Xفرنك جيبوتىrG UHRDrH Xدينار كرواتىrI UBYBrJ X.روبل بيلاروسى جديد - 1994-1999rK UITLrL Xليرة ايطاليةrM jXفرنك افريقيrN UBNDrO Xدولار بروناىrP UISKrQ Xكرونه أيسلندىrR UZALrS X*راند جنوب أفريقيا -مالىrT USRDrU Xدولار سورينامىrV ULAKrW Xكيب لاوسىrX UNICrY X!كوردوبة نيكاراجواrZ UNPRr[ Xروبية نيباليr\ UMZEr] Xاسكود موزمبيقىr^ ULUCr_ X1فرنك لوكسمبرج قابل للتحويلr` UJMDra Xدولار جامايكىrb UFRFrc Xفرنك فرنسىrd UMAFre Xفرنك مغربيrf UPHPrg Xبيزو فلبينىrh UZARri X راند جنوب أفريقياrj URHDrk Xدولار روديسىrl UGWPrm Xبيزو غينيا بيساوrn ULUFro Xفرنك لوكسمبرجrp UBELrq X#فرنك بلجيكى (مالي)‏rr UBECrs X)فرنك بلجيكى (تحويلات)‏rt UNGNru Xنايرا نيجيرىrv UYUNrw X3دينار يوغسلافى قابل للتحويلrx UBEFry Xفرنك بلجيكىrz UCRCr{ Xكولن كوستا ريكىr| UTRLr} Xليرة تركيr~ UDEMr Xمارك المانىr UEEKr Xكرونة استونيةr UMWKr Xكواشا مالاوىr UTTDr X)دولار ترينداد و توباجوr ULKRr Xروبية سريلانكيةr USKKr Xكرونة سلوفاكيةr UCVEr X&اسكودو الرأس الخضراءr UPKRr Xروبية باكستانيr UHUFr Xفورينت مجرىr UROLr Xليو رومانى قديمr UBMDr Xدولار برمودىr UXEUr X&وحدة النقد الأوروبيةr ULSLr Xلوتى ليسوتوr ULSMr X مالوتىr UMNTr Xتوغروغ منغولىr UAMDr Xدرام أرمينىr UYUDr Xدينار يوغسلافىr UBUKr Xكيات بورمىr jXجنيه سورىr jXريال قطرىr UNLGr Xجلدر هولندىr UUGSr Xشلن أوغندى - 1966-1987r UMTPr Xجنيه مالطىr UGBPr Xجنيه سترلينيr UGELr Xلارى جورجىr USHPr Xجنيه سانت هيلينr UAFNr X أفغانىr USBDr Xدولار جزر سليمانr UCSKr X%كرونة تشيكوسلوفاكياr UKPWr X"وون كوريا الشماليةr UCSDr Xدينار صربىr UAFAr Xأفغاني - 1927-2002r UTHBr Xباخت تايلاندىr UTRYr Xليرة تركية جديدةr UBDTr Xتاكا بنجلاديشىr UGRDr Xدراخما يونانىr jXريال يمنىr UDDMr X&أوستمارك المانى شرقىr UHTGr Xجوردى هايتىr UMGAr Xارياري مدغشقرr UANGr Xجلدر هولندى [ANG]r ULRDr Xدولار ليبيريr URWFr Xفرنك رواندىr UNOKr Xكرونة نرويجيةr UKESr Xشلن كينييr UMOPr Xباتاكا ماكاوىr jXروبيه هنديr UMXNr Xبيزو مكسيكىr UCZKr Xكرونة تشيكيةr UTJSr X!سوموني طاجيكستانىr UTJRr Xروبل طاجيكستانىr UBTNr Xنولتوم بوتانىr UYDDr Xدينار يمنىr UGWEr X$اسكود برتغالى غينياr UCOPr Xبيزو كولومبىr UMURr Xروبي موريشيr UIDRr Xروبية اندونيسيةr UHNLr Xليمبيرا هنداروسr UFJDr Xدولار فيجىr UETBr Xبير أثيوبىr UBZDr Xدولار بليزىr UATSr Xشلن نمساوىr UILPr Xجنيه اسرائيلىr UZRNr X زائير زائيرى جديدr UDOPr Xبيزو الدومنيكانr ULULr X&فرنك لوكسمبرج المالىr UTMMr Xمانات تركمنستانىr UMDLr Xلاو مولدوفىr UXPTr Xالبلاتينr UBSDr Xدولار باهامىr USEKr Xكرونة سويديةr UZMKr Xكواشا زامبىr UMVRr X"روفيه جزر المالديفr UXTSr X كود اختبار العملةr UAUDr Xدولار أسترالىr UADPr Xبيستا أندورىr UCUPr Xبيزو كوبىr UIEPr Xجنيه ايرلندىr UBBDr Xدولار بربادوسىr UKRWr X"وون كوريا الجنوبيةr UGMDr Xدلاسي جامبيr UGTQr Xكوتزال جواتيمالاr UVEBr Xبوليفار فنزويليr USITr! Xتولار سلوفينيr" jXجنيه سودانىr# UCLPr$ Xبيزو شيلىr% UEURr& Xيوروr' UCDFr( Xفنك كونغولىr) UXCDr* X"دولار شرق الكاريبىr+ UKZTr, Xتينغ كازاخستانىr- jXروبل روسيr. UXAGr/ Xفضةr0 UPLZr1 X#زلوتى بولندى - 1950-1995r2 jXريال عمانىr3 jXريال برازيليr4 UMMKr5 Xكيات ميانمارr6 UUYPr7 X%بيزو أوروجواى - 1975-1993r8 URURr9 Xروبل روسى - 1991-1998r: UPLNr; Xزلوتى بولندىr< UBREr= X+كروزايرو برازيلى - 1990-1993r> UPYGr? Xجواراني باراجوايr@ UBRCrA Xكروزادو برازيلىrB UBRBrC X4نوفو كروزايرو برازيلى - 1967-1986rD USVCrE Xكولون سلفادورىrF jXدرهم اماراتىrG UGNSrH Xسيلى غينياrI UMKDrJ Xدينار مقدونىrK UAZMrL Xمانات أذريبجانىrM UTWDrN Xدولار تايوانىrO UUSNrP X4دولار أمريكي (اليوم التالي)‏rQ UGQErR X9اكويل جونينا غينيا الاستوائيّةrS UBADrT X)دينار البوسنة و الهرسكrU UGNFrV Xفرنك غينياrW UMXPrX X(بيزو فضى مكسيكى - 1861-1992rY jXدينار عراقىrZ UERNr[ Xناكفا أريترىr\ UBAMr] X?مارك البوسنة و الهرسك قابل للتحويلr^ USCRr_ Xروبية سيشيليةr` UCADra Xدولار كندىrb jXدينار سودانيrc UCYPrd Xجنيه قبرصىre jXدرهم مغربىrf jXدينار كويتىrg UBIFrh Xفرنك بروندىri ULTTrj Xتالوناس ليتوانىrk UPGKrl X-كينا بابوا غينيا الجديدةrm ULTLrn X!الليتا الليتوانيةro USGDrp Xدولار سنغافورىrq UUZSrr Xسوم أوزبكستانىrs USTDrt X-دوبرا ساو تومي وبرينسيبيru UXFOrv Xفرنك فرنسى ذهبىrw UMLFrx Xفرنك مالىry UESPrz Xبيزيتا اسبانيr{ UIRRr| Xريال ايرانىr} UZRZr~ Xزائير زائيرىr UCNYr Xيوان صينيr USLLr Xليون سيراليونىr jXدينارتونسىr UGYDr Xدولار غياناr UMTLr Xليرة مالطيةr UNZDr Xدولار نيوزيلندىr UFKPr Xجنيه جزر فوكلاندr ULVLr Xلاتس لاتفياr UUSSr X.دولار أمريكي (نفس اليوم)‏r UUSDr Xدولار أمريكيr UARPr X%بيزو أرجنتينى - 1983-1985r UKGSr Xسوم قيرغستانىr UARSr Xبيزو أرجنتينىr UILSr X"شيكل اسرائيلى جديدr USZLr X%ليلانجيني سوازيلندىr jXدينار بحرينىr UJPYr Xين يابانيr UARAr Xاسترال ارجنتينىr UPTEr Xاسكود برتغالىr UXAUr Xذهبr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXيr KXفr KXمr KXأr KXوr KXنr KXلr KXغr K Xسr K Xكr K Xبr K Xدr usUformatr }r (Uwider }r (KX ينايرr KX فبرايرr KXمارسr KX أبريلr KXمايوr KX يونيوr KX يوليوr KX أغسطسr K X سبتمبرr K X أكتوبرr K X نوفمبرr K X ديسمبرr uU abbreviatedr }r (KX ينايرr KX فبرايرr KXمارسr KX أبريلr KXمايوr KX يونيوr KX يوليوr KX أغسطسr K X سبتمبرr K X أكتوبرr K X نوفمبرr K X ديسمبرr uuuUcurrency_formatsr }r Nj])r }r (j`NjaKjbKKr jdjejer jgKKr h4X ¤ #,##0.00r jjX¤ r X¤ r r jlNjmKKr ubsUdaysr }r (U stand-aloner }r (U abbreviatedr }r (KX اثنينr KX ثلاثاءr KX أربعاءr KXخميسr KXجمعةr KXسبتr KXأحدr uUnarrowr }r (KXنr KXثr KXرr KXخr KXجr KXسr KXحr uuUformatr }r (Uwider }r (KXالاثنينr KXالثلاثاءr KXالأربعاءr KX الخميسr KX الجمعةr KX السبتr KX الأحدr uU abbreviatedr }r (KXنr KXثr KXرr KXخr KXجr KXسr KXحr uuuU meta_zonesr }r Uerasr }r (Uwider }r (KXقبل الميلادr KX ميلاديr uU abbreviatedr }r (KXق.مr KXمr uuu.PK[Rll(site-packages/babel/localedata/rw_RW.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[{==(site-packages/babel/localedata/ml_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[D))(site-packages/babel/localedata/mk_MK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[P|]]%site-packages/babel/localedata/uk.datnu[}q(U zone_formatsq}q(UregionqX%sqUgmtqXGMT%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q (U stand-aloneq }q (U abbreviatedq}q(KXI кв.qKXII кв.qKX III кв.qKXIV кв.quUnarrowq}q(KX1qKX2qKX3qKX4quuUformatq}q(Uwideq}q(KXI кварталqKXII кварталqKXIII кварталq KXIV кварталq!uU abbreviatedq"}q#(KXI кв.q$KXII кв.q%KX III кв.q&KXIV кв.q'uuuUperiodsq(}q)(Uamq*Xдпq+Upmq,Xппq-uUscientific_formatsq.}q/Ncbabel.numbers NumberPattern q0)q1}q2(Uexp_precq3KKq4Uscaleq5KU frac_precq6KKq7Usuffixq8Xq9h9q:Uint_precq;KKqUprefixq?h9X-q@qAUexp_plusqBUgroupingqCMMqDubsUpercent_formatsqE}qFNh0)qG}qH(h3Nh5Kdh6KKqIh8X%qJhJqKh;KKqLh=X#,##0%qMh?h9h@qNhBNhCKKqOubsU week_dataqP}qQ(Umin_daysqRKU weekend_startqSKU first_dayqTKU weekend_endqUKuU time_formatsqV}qW(UmediumqXcbabel.dates DateTimePattern qY)qZ}q[(h=XHH:mm:ssq\Uformatq]X%(HH)s:%(mm)s:%(ss)sq^ubUfullq_hY)q`}qa(h=X HH:mm:ss vqbh]X%(HH)s:%(mm)s:%(ss)s %(v)sqcubUlongqdhY)qe}qf(h=X HH:mm:ss zqgh]X%(HH)s:%(mm)s:%(ss)s %(z)sqhubUshortqihY)qj}qk(h=XHH:mmqlh]X %(HH)s:%(mm)sqmubuU languagesqn}qo(UgvqpXменкськаqqUguqrXгуджаратіqsUscnqtXсицилійськаquUromqvXциганськаqwUalgqxX!алгонкінські мовиqyUaleqzXалеутськаq{Uscoq|Xшотландськаq}Umniq~XманіпуріqUgdqXгаельськаqUgaqXірландськаqUmnoqXманобо мовиqUosaqX осейджqUgnqXгуараніqUaltqX"південноалтайськаqUglqXгалісійськаqUmwrqXмарваріqUtyqXтаїтянськаqUtwqXтвіqUttqXтатарськаqUtrqXтурецькаqUtsqX тсонгаqUtnqX тсванаqUtoqX ТонгаqUausqX#австралійські мовиqUavqXаварськаqUtkqXтуркменськаqUthqXтайськаqUroaqXроманські мовиqUtgqXтаджицькаqUteqX телугуqUugaqXугаритськаqUmwlqXмірандськаqUkcgqXтіапqUsmiqXсаамські мовиqUfatqX фантіqUfanqXфангqUwoqX волофqUrmqXретороманськаqUdinqX дінкаqUblaqXсіксікаqUcmcqXхамітські мовиqUmlqXмалайяламqUzhqXкитайськаqUtemqX темнеqUen_CAqX'англійська канадськаqUnwcqXневарі класичнаqUzaqX чжуанqUcauqXкавказька моваqUzuqXзулуськаqUterqX тереноqUtetqX тетумqUmncqXманчжурськаqUkutqXкутенаїqUsukqX сукумаqUkumqXкумицькаqUsusqXсусуqUnewqX неваріqUsuxqXшумерськаqUdenqX слейвqUmenqX мендеqUmulqXдекілька мовqUlezqXлезгінськаqUrootqX коріньqUekaqXекаджукqUakkqXаккадськаqUdraqX!дравідійська моваqUjrbqXіудео-арабськаqUsgnqXзнакові мовиqUsgaqX давньоірландськаqUapaqXапачі мовиqUbraqX браджqUchbqX чібчаqUchgrXчагатайськаrUchkrXчуукськаrUchmrXмарійськаrUchnrXчинук жаргонrUchorX чоктоr Uchpr Xчіпев’янr Uchrr X черокіr UchyrX чейєннrUtirXтигрініrUvotrXводськаrUmgrXмалагасійськаrUibarXібанськаrUmorXмолдавськаrUmnrXмонгольськаrUmirX маоріrUmhrXмаршалльськаrUmkr Xмакедонськаr!Umtr"Xмальтійськаr#Ucair$XJцентральноамериканьских індіанців моваr%Udelr&Xделаварськаr'Umsr(Xмалайськаr)Umrr*Xмаратхіr+Utar,Xтамільськаr-Umyr.Xбірманськаr/Ucadr0X каддоr1Usrnr2Xсранан тонгоr3Utair4Xтайські мовиr5Uafhr6Xафрихіліr7Usitr8X.китайсько-тибетські мовиr9Uenmr:X$середньоанглійськаr;Uen_AUr<X/англійська австралійськаr=Unynr>Xньянколеr?Unyor@X ньороrAUnymrBXньямвезіrCUsiorDXсіу мовиrEUmaprFX'австронезійська моваrGUmasrHX масаїrIUlahrJX ландаrKUladrLX ладіноrMUfyrNXфризькаrOUsnkrPXсонінкеrQUfarRXперськаrSUmadrTXмадурськаrUUmagrVXмагадхіrWUmairXXмайтхіліrYUfirZXфінськаr[Ufjr\X фіджіr]Umanr^Xмандінгоr_Uegyr`X давньоєгипетськаraUzndrbX зандеrcUssrdXсісватіreUsrrfXсербськаrgUsqrhXалбанськаriUswrjXсуахіліrkUsvrlXшведськаrmUsurnXсунданськаroUstrpXсото південнаrqUskrrXсловацькаrsUsirtXсингальськаruUshrvX%сербсько-хорватськаrwUsorxX сомаліryUsnrzXшонаr{Usmr|Xсамоанськаr}Uslr~XсловенськаrUscrXсардинськаrUsarXсанскритrUsgrX сангоrUserX!саамська північнаrUsdrX сіндхіrUzenrX зенагаrUkbdrXкабардинськаrUafarX"афро-азійська моваrUcsbrXкашубськаrUlgrX гандаrUlbrXлюксембурзькаrUfiurX$фінно-угорські мовиrUlnrXлінгалаrUlorXлаоськаrUlirXлімбургійськаrUbynrXблінrUltrXлитовськаrUlurXлуба-катангаrUfilrXфіліппінськаrUyirXідишrUnonrXдавньонорвезькаrUcebrXсебуанськаrUyorX йорубаrUnogrXногайськаrUbatrXбалтійська моваrUdakrX дакотаrUdarrXдаргінськаrUdayrXдаякrUssarX$ніло-сахарські мовиrUkperX кпеллєrUelrXгрецькаrUeorXесперантоrUenrXанглійськаrUlamrX ламбаrUeerXевеrUmdfrX мокшаrUfrrXфранцузькаrUmdrrXмандарськаrUetrXестонськаrUesrXіспанськаrUrurXросійськаrUgonrX гондіrUgohrX*давньоверхньонімецькаrUsmsrXсаамська скольтrUsmnrXсаамська інаріrUsmjrXсаамська лулеrUde_ATrX'німецька австрійськаrUgotrXготськаrUrnrX рундіrUrorXрумунськаrUdsbrXнижньолужицькаrUsmarX!саамська південнаrUgorrXгоронталоrUastrXастурськаrUwalrX валамоrUcrhrX"кримськотатарськаrUathrXатапаскські мовиrUgezrXгєезrUxhrX кхосаrUffrXфулаrUkforXкороrUmakrXмакасарськаrUzaprXсапотекськаrUkokrXконканіrUzxxrX&немає мовного вмістуrUkosrX косраеrUforXфарерськаrUtogrXньяса тонгаrUhuprXхупаr Uudmr Xудмуртськаr Ubejr X беджаr UbemrX бембаrUtsirXцимшианrUberrXберберськаrUnzirX нзімаrUsairXFпівденноамериканських індіанців мовиrUangrX давньоанглійськаrUprarXпракріті мовиrUbhorXбходжпуріrUsalrXсалішські мовиrUpror X(давньопровансальськаr!Urajr"Xраджастханіr#Usadr$Xсандавеr%Uanpr&X ангікаr'Ues_419r(X7латиноамериканська іспанськаr)Urapr*Xрапануїr+Usasr,Xсасакськаr-Unqor.Xнкоr/Ucarr0Xкарібськаr1Uminr2Xмінангкабауr3Umicr4X мікмакr5Uefir6Xефікr7Uarnr8Xарауканськаr9Uypkr:Xюпік мовиr;Umisr<Xінші мовиr=Ukacr>X качінr?Ukabr@XкабильськаrAUkaarBXкаракалпацькаrCUkajrDXйюrEUkamrFX камбаrGUkarrHXкаренськаrIUkawrJXкавіrKUfr_CHrLX+французька швейцарськаrMUtyvrNXтувинськаrOUfr_CArPX'французька канадськаrQUkarRXгрузинськаrSUdoirTX догріrUUkgrVXконґолезькаrWUkkrXXказахськаrYUkjrZX кунамаr[Ukir\X кікуйюr]Ukor^Xкорейськаr_Uknr`XканнадаraUkmrbXкхмерськаrcUklrdXкалааллісутreUksrfXкашмірськаrgUkrrhX кануріriUkwrjXкорнійськаrkUkvrlXкоміrmUkurnXкурдськаroUkyrpXкиргизькаrqUtklrrXтокелауrsUbuartXбурятськаruUmgarvX$середньоірландськаrwUhitrxX хітітіryUdyurzX діулаr{Uder|Xнімецькаr}Udar~XданськаrUdzrXдзонг-кеrUluirXлуїсеньоrUdvrX дівехіrUhilrXхілігайнонrUhimrXхімачаліrUgemrXгерманська моваrUcrprX=креольські та піджінізовані мовиrUqurX кечуаrUbasrXбасаrUgbarX гбайяrUbadrX бандаrUbanrXбалійськаrUbalrX балучіrUshnrXшанськаrUbairXбамілеке мовиrUarprXарапахоrUartrXштучна моваrUarwrXаравакськаrUarcrXарамейськаrUen_USrXанглійська СШАrUsemrXсемітські мовиrUselrXселькупськаrUnubrXнубійські мовиrUbtkrX батакrUlusrX лушейrUmusrXкрікrUluarXлуба-лулуаrUirorXірокезькі мовиrUirarXіранськаrUmunrXмунда мовиrUlunrX лундаrUluorXлуоrUwarXваллонськаrUtuprXтупіrUjvrXяванськаrUzblrXблісса моваrUtutrXалтайська моваrUtumrXтумбукаrUjarXяпонськаrUcoprXкоптськаrUilorXілоканськаrUlarXлатинськаrUgwirX кучінrUundrXневизначена моваrUtlirXтлінгітrUtlhrXклінгонrUchrXчаморроrUcorXкорсиканськаrUcarXкаталонськаrUcerXчеченськаrUponrX понапеrUcyrXваллійськаrUsahrXякутськаrUcsrX чеськаrUcrrXкріrUbntrX бантуrUcvrXчуваськаrUcurX'церковнослов’янськаrUlvrXлатвійськаrUdumrX*середньонідерландськаrUptrXпортугальськаrUduarX дуалаrUfrorX давньофранцузькаrUyaprXяпrUfrmrX$середньофранцузькаrUtivrXтівrUfrsrXфризька східнаrUfrrrXфризька північнаrUyaorXяоr Upar Xпанджабіr Uxalr Xкалмицькаr Ues_ESrX'іберійська іспанськаrUpirXпаліrUen_GBrX)англійська британськаrUgayrXгайоrUotorXотомі мовиrUotarXосманськаrUhmnrX хмонгrUmyvrXерзяrUgaarXгаrUfurr Xфріульськаr!Ukhir"Xкойсанські мовиr#Uainr$Xайнськаr%Urarr&Xраротонгаr'Uslar(X слов’янські мовиr)Uver*X вендаr+Uvir,Xвʼєтнамськаr-Uisr.Xісландськаr/Ukhor0Xхотаносакськаr1Uiur2Xінуктітутr3Uitr4Xіталійськаr5Uvor6Xволап’юкr7Uiir8Xсичуаньr9Uikr:Xінупіакr;Uior<Xідоr=Uiner>X'індоєвропейські мовиr?Uiar@XінтерлінгваrAUjprrBXіудео-перськаrCUierDXінтерлінгвеrEUidrFXіндонезійськаrGUigrHXігбоrIUpaprJXпап’яментоrKUeworLX евондоrMUpaurNXпалауанськаrOUpaarPXпапуаські мовиrQUpagrRXпангасінанськаrSUsatrTXсантальськаrUUpalrVXпехлевіrWUpamrXXпампангаrYUsycrZX#сирійська класичнаr[Uphir\X!філіппінські мовиr]Ucelr^Xкельтська моваr_Uphnr`X%фінікійсько-пунічнаraUnicrbX.ніґеро-кордофанські мовиrcUniardXніаськаreUdgrrfXдогрибськаrgUsyrrhXсирійськаriUniurjXніуеrkUgswrlX'німецька швейцарськаrmUcchrnX атсамroUjborpX ложбанrqUnahrrXнахуатльrsUsamrtX/самаритянська арамейськаruUhairvX хайдаrwUgmhrxX.середньоверхньонімецькаryUcusrzXкушітська моваr{Uwenr|Xлужицькі мовиr}Uadyr~XадигейськаrUelxrXеламськаrUadarXадангмеrUpt_PTrX/португальська іберійськаrUhawrXгавайськаrUbinrXбініrUbikrXбікольськаrUpt_BRrX1португальська бразильськаrUmosrX моссіrUmohrX магавкrUtlrXтагальськаrUzh_HansrX#китайська спрощенаrUzh_HantrX'китайська традиційнаrUtvlrX тувалуrUijorXіджоrUkmbrXкімбундуrUpeorXдавньоперськаrUumbrXумбундуrUtmhrXтамашекrUfonrXфонrUhsbrXверхньолужицькаrUberXбілоруськаrUbgrXболгарськаrUbarXбашкирськаrUpsrX пуштуrUbmrXбамбараrUbnrXбенгальськаrUborXтибетськаrUbhrX біхаріrUbirXбісламаrUbrrXбретонськаrUbsrXбоснійськаrUruprXарумунськаrUzzarXзазаrUomrX оромоrUojrXоджібваrUacerXачехськаrUachrX ачоліrUocrX окитанrUkrurX курукхrUsrrrX серерrUkrorXкруrUkrlrXкарельськаrUkrcrX'карачаєво-балкарськаrUndsrXнижньонімецькаrUosrXосетинськаrUorrXоріяrUsogrXсогдійськаrUnsorXсото північнаrUsonrX сонгайrUde_CHrX5верхньонімецька швейцарськаrUvairXваїrUwakrXвакашські мовиrUlolrX монгоrUmkhrX"мон-кхмерські мовиrUawarX авадхіrUlozrXлозіrUgilrXгільбертськаrUwasrXвашоrUwarrX варайrUhzrX герероrUhyrXвірменськаrUanrXарагонськаrUsidrX сідамоrUhrrXхорватськаrUhtrXгаїтянськаrUhurXугорськаrUhirX гіндіrUhorXхірі-мотуrUharX хаусаr Ubugr Xбугійськаr Uher X івритr UuzrXузбецькаrUurrXурдуrUplrXпольськаrUukrXукраїнськаrUugrXуйгурськаrUaarXафарськаrUabrXабхазькаrUaerXавестійськаrUafrXафрикаансrUakr Xаканr!Uamr"Xамхарськаr#Unl_BEr$Xфламандськаr%Ueur&X басківr'Uasr(Xассамськаr)Uarr*Xарабськаr+Uinhr,Xінгуськаr-Utpir.Xток-пісінr/Umynr0Xмайя мовиr1Uayr2X аймараr3Ukhar4X кхасіr5Uazr6Xазербайджанськаr7Uincr8Xіндійські мовиr9Unlr:Xголландськаr;Unnr<X#норвезька нюнорськr=Unor>Xнорвезькаr?Unar@X науруrAUnbrBXнорвезька букмолrCUnairDXFпівнічноамериканських індіанців мовиrEUndrFXндебелє північнаrGUnerHXнепальськаrIUngrJX ндонгаrKUnyrLXньянджаrMUnaprNXнеаполітанськаrOUgrbrPX гребоrQUgrcrRXдавньогрецькаrSUnrrTXндебелє південнаrUUtigrVX тигреrWUnvrXX навахоrYUzunrZX зуньїr[Urwr\Xкіньяруандаr]Ucper^X]англо-креольські та піджінізовані англійські мовиr_Ucpfr`Xaфранко-креольські та піджінізовані франкофонні мовиraUcpprbXsпортугальсько-креольські та піджінізовані португальські мовиrcuU territoriesrd}re(UBDrfXБангладешrgUBErhXБельгіяriUBFrjXБуркіна-ФасоrkUBGrlXБолгаріяrmUVErnXВенесуелаroUBArpX&Боснія і ГерцоговинаrqUBBrrXБарбадосrsUWFrtXУолліс і ФутунаruUBLrvX0Острів Святого БартоломеяrwUBMrxXБермудиryUBNrzX Брунейr{UBOr|XБолівіяr}UBHr~XБахрейнrUBIrXБурундіrUBJrX БенінrUBTrX БутанrU011rXЗахідна АфрикаrUBVrXОстрів БувеrUBWrXБотсванаrU014rXСхідна АфрикаrU015rXПівнічна АфрикаrUBRrXБразиліяrU017rX!Центральна АфрикаrU018rXПівденна АфрикаrU019rXАмерикиrUBYrXБілорусьrUBZrX БелізrULVrX ЛатвіяrURWrX РуандаrURSrX СербіяrUTLrXСхідний ТиморrURErXРеюньйонrUTMrXТуркменистанrUOMrXОманrUTJrXТаджикистанrUROrXРумуніяrUTKrXТокелауrUGWrXГвінея-БіссауrUGUrXГуамrUGTrXГватемалаrUGSrX[Південна Джорджія та Південні Сандвічеві ОстровиrUGRrX ГреціяrUGQrX'Екваторіальна ГвінеяrUGPrXГваделупаrUJPrX ЯпоніяrUKIrXКірибатіrUGYrX ГайанаrUGGrX ГернсіrUGFrX!Французька ГвіанаrUGErX ГрузіяrUGDrXГренадаrU021rXПівнічна АмерикаrUGBrXВеликобританіяrUGArX ГабонrUSVrXСальвадорrUGNrX ГвінеяrUGMrX ГамбіяrUGLrXГренландіяrU029rX!Карибський басейнrUGIrXГібралтарrUGHrXГанаrUJErX ДжерсіrUTNrX ТунісrUJMrX ЯмайкаrU013rX#Центральна АмерикаrUWSrX СамоаrU419rXFЛатинська Америка і Карибський басейнrUHRrXХорватіяrUBSrX БагамиrUHTrX ГаїтіrUHUrXУгорщинаrUHKrX#Гонконґ О.А.Р. КитаюrU039rXПівденна ЄвропаrUHNrXГондурасrUFIrXФінляндіяrU142rXАзіяrU030rXСхідна АзіяrU034rXПівденна АзіяrU035rX&Південно-Східна АзіяrUPRrXПуерто-РікоrUPSrXПалестинаrU830rX%Нормандські островиr UFKr X'Фолклендські островиr UIOr XKБританські території Індійського океануr UPWrX ПалауrUPTrXПортугаліяrUSJrX4Острови Свальбард та Ян-МаєнrUMDrXМолдоваrUFMrXМікронезіяrUIQrXІракrUPArX ПанамаrUPFrX'Французька ПолінезіяrUPGrX Папуа Нова ГвінеяrUPEr XПеруr!UPKr"XПакистанr#UPHr$XФіліппіниr%UFOr&X!Фарерські островиr'UPNr(XПіткернr)UPLr*X Польщаr+UPMr,X!Сен-Пʼєр і Мікелонr-UZMr.X Замбіяr/UEHr0XЗахідна Сахараr1URUr2X Росіяr3UEEr4XЕстоніяr5UEGr6X Єгипетr7UZAr8XПАРr9UECr:XЕквадорr;UITr<X Італіяr=UVNr>XВʼєтнамr?UZZr@X?Невідомий або неправильний регіонrAUSBrBX#Соломонові ОстровиrCUETrDXЕфіопіяrEUSOrFX СомаліrGUZWrHXЗімбабвеrIUSArJX!Саудівська АравіяrKUESrLXІспаніяrMUERrNXЕритреяrOUMErPXЧорногоріяrQUAQrRXАнтарктидаrSUMGrTXМадагаскарrUUMFrVX*Острів Святого МартінаrWUMArXXМароккоrYUMCrZX Монакоr[UUZr\XУзбекистанr]UMMr^X Мʼянмаr_UMLr`XМаліraUMOrbXМакао О.А.Р. КитаюrcUMNrdXМонголіяreUHMrfX0Острови Херд і Мак-ДональдrgUASrhX#Американське СамоаriUMKrjXМакедоніяrkUMUrlXМаврикійrmUMTrnX МальтаroUMWrpX МалавіrqUMVrrXМальдівиrsUMQrtXМартинікаruUMPrvX4Північні Маріанські ОстровиrwUMSrxXМонсерратryUMRrzXМавританіяr{UIMr|XОстрів Менr}UUGr~X УгандаrUTZrXТанзаніяrUMYrXМалайзіяrUMXrXМексикаrUILrXІзраїльrUFRrXФранціяrUAWrX АрубаrUDOrX/Домініканська РеспублікаrUSHrX$Острів Святої ЄлениrUVCrX-Сент-Вінсент і ГренадиниrU054rXМеланезіяrUDJrXДжібутіrUFJrX ФіджіrU057rX+Мікронезійський регіонrU172rX<Співдружність Незалежних ДержавrU053rX1Австралія та Нова ЗеландіяrUNIrXНікарагуаrUNLrXНідерландиrUNOrXНорвегіяrUNArXНамібіяrUVUrXВануатуrUNCrXНова КаледоніяrUNErX НігерrUNFrXОстрів НорфолкrUNGrXНігеріяrUNZrXНова ЗеландіяrUNPrX НепалrUNRrX НауруrUNUrXНіяrU061rXПолінезіяrUCIrXКот-д’ІвуарrUCHrXШвейцаріяrUCOrXКолумбіяrUCNrX КитайrUCMrXКамерунrUCLrXЧиліrUCCrXКокосові островиrUCArX КанадаrUCGrX!Конґо - БраззавільrUCFrX?Центральноафриканська РеспублікаrUCDrX8Демократична Республіка КонґоrUCZrX!Чеська республікаrUCYrXКіпрrUCXrXОстрів РіздваrUCSrX&Сербія та ЧорногоріяrUCRrXКоста-РикаrUPYrXПарагвайrUCVrXКабо-ВердеrUCUrXКубаrUSZrXСвазілендrUSYrX СиріяrUKGrXКиргизстанrUKErX КеніяrUSRrXСуринамrU143rXЦентральна АзіяrUKHrXКамбоджаrUKNrXСент-Кітс і НевісrUKMrX!Коморські ОстровиrUSTrX#Сан-Томе і ПрінсіпіrUSKrXСловакіяrUKRrXПівденна КореяrUSIrXСловеніяrUKPrXПівнічна КореяrUKWrX КувейтrUSNrXСенегалrUSMrXСан-МариноrUSLrXСьєрра-ЛеонеrUSCrXСейшелиrUKZrXКазахстанrUKYrX!Кайманові островиr USGr XСінгапурr USEr X Швеціяr USDrX СуданrU151rXСхідна ЄвропаrU150rX ЄвропаrUDMrXДомінікrU155rXЗахідна ЄвропаrU154rXПівнічна ЄвропаrUVGrX4Віргінські острови БританіїrUDErXНімеччинаrUYErXЄменrUMHr X#Маршаллові Островиr!U062r"X.Південно-Центральна Азіяr#UDZr$X Алжирr%UUSr&XСШАr'UUYr(XУругвайr)UYTr*X Майотr+UUMr,X(Віддалені Острови СШАr-ULBr.X Ліванr/ULCr0XСент-Люсіяr1ULAr2XЛаосr3UTVr4X Тувалуr5UTWr6XТайваньr7UTTr8X Тринідад і Тобагоr9UTRr:XТуреччинаr;ULKr<XШрі-Ланкаr=ULIr>XЛіхтенштейнr?UCKr@XОстрови КукаrAUTOrBX ТонгаrCULTrDX ЛитваrEULUrFXЛюксембургrGULRrHXЛіберіяrIULSrJX ЛесотоrKUTHrLXТаїландrMUTFrNX8Французькі Південні ТериторіїrOUTGrPXТогоrQUTDrRXЧадrSUTCrTXТеркс і КайкосrUULYrVX ЛівіяrWUVArXXВатиканrYU145rZXЗахідна Азіяr[UAEr\X2Обʼєднані Арабські Еміратиr]UADr^XАндорраr_UAGr`X Антигуа і БарбудаraUAFrbXАфганістанrcUAIrdXАнгільяreUVIrfX*Віргінські острови СШАrgUISrhXІсландіяriUIRrjXІранrkUAMrlXВірменіяrmUALrnXАлбаніяroUAOrpX АнголаrqUANrrX>Нідерландські Антильські ОстровиrsU003rtX=Північноамериканський континентruU002rvX АфрикаrwU001rxXСвітryUARrzXАргентинаr{UAUr|XАвстраліяr}UATr~XАвстріяrU005rXПівденна АмерикаrUINrX ІндіяrUAXrX!Аландські островиrU009rXОкеаніяrUAZrXАзербайджанrUIErXІрландіяrUIDrXІндонезіяrUJOrXЙорданіяrUQUrX!Європейський СоюзrUUArXУкраїнаrUQArX КатарrUDKrX ДаніяrUMZrXМозамбікrUQOrXІнша ОкеаніяruUdecimal_formatsr}rNh0)r}r(h3Nh5Kh6KKrh8h9h9rh;KKrh=X #,##0.###rh?h9h@rhBNhCKKrubsU date_formatsr}r(UmediumrhY)r}r(h=X d MMM yyyyrh]X%(d)s %(MMM)s %(yyyy)srubUfullrhY)r}r(h=XEEEE, d MMMM yyyy 'р'.rh]X%%(EEEE)s, %(d)s %(MMMM)s %(yyyy)s р.rubUlongrhY)r}r(h=Xd MMMM yyyy 'р'.rh]X%(d)s %(MMMM)s %(yyyy)s р.rubUshortrhY)r}r(h=Xdd.MM.yyrh]X%(dd)s.%(MM)s.%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUUAHrXгрн.rUUAKrXкрб.rUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUALLrXlekrUMROrXUMrUDJFrXDFrUZWDrXZ$rUVUVrXVTrUUYUrXUr$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUSCRrXSRrUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUGBPrX£rUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtr UROLr Xleur UBMDr XBer$r ULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUJMDrXJ$rUGELrXlarirUAFNrXAfrUTRLrXTLrUBDTrXTkrUYERr XYRlr!UANGr"XNA f.r#UXCDr$XEC$r%UNOKr&XNKrr'UINRr(XINRr)UMXNr*XMEX$r+UBTNr,XNur-UCOPr.XCol$r/UIDRr0XRpr1UHNLr2XLr3UXPFr4XCFPFr5UFJDr6XF$r7UETBr8XBrr9UBZDr:XBZ$r;UDOPr<XRD$r=UQARr>XQRr?USEKr@XSKrrAUSRGrBXSfrCUIEPrDXIR£rEUBBDrFXBDS$rGUGTQrHXQrIUVEBrJXBerKUCLPrLXCh$rMUITLrNX₤rOUKZTrPXTrQURUBrRXруб.rSUTTDrTXTT$rUUOMRrVXROrWUSBDrXXSI$rYUPLNrZXZlr[UKESr\XK Shr]UGYDr^XG$r_UMKDr`XMDenraUTWDrbXNT$rcUTOPrdXT$reUGNFrfXGFrgUIQDrhXIDriUBAMrjXKMrkUCADrlXCan$rmUCVErnXCVEscroUKWDrpXKDrqUBIFrrXFbursUSOSrtXSh.ruUSGDrvXS$rwUSTDrxXDbryUIRRrzXRIr{UCNYr|XYr}UCYPr~X£CrUMTLrXLmrUNZDrX$NZrUUSDrX$rUKGSrXsomrUARSrXArg$rUSZLrXErUBHDrXBDrUJPYrX¥ruU time_zonesr}r(UAtlantic/Canaryr}rUcityrX КанариrsUAustralia/Melbourner}rjXМельбурнrsU Europe/Minskr}rjX МінськrsUAmerica/Nipigonr}rjXНіпігонrsUAmerica/Miquelonr}rjXМікелонrsUPacific/Wallisr}rjX УоллісrsUAntarctica/Davisr}rjX ДевісrsUAmerica/Coral_Harbourr}rjXКорал-ХарборrsU Asia/Dhakar}rjXДакаrsUAmerica/St_Luciar}rjXСент-ЛусіяrsU Asia/Kashgarr}rjX КашгарrsUAmerica/Phoenixr}rjX ФініксrsU Asia/Kuwaitr}rjX КувейтrsUAsia/Hong_Kongr}rjXГонконгrsUArctic/Longyearbyenr}rjXЛонгербюйнrsUEurope/Guernseyr}rjX ҐернсіrsU Europe/Parisr}rjX ПарижrsUEurope/Stockholmr}rjXСтокгольмrsU Pacific/Fijir}rjX ФіджиrsU Pacific/Apiar}rjXАпіаrsUPacific/Pago_Pagor}rjXПаго ПагоrsU Asia/Rangoonr}rjX РангунrsUAmerica/Mexico_Cityr}rjX МехікоrsUAmerica/Puerto_Ricor}rjXПуерто РікоrsUIndian/Mauritiusr}rjXМаврикійrsU Europe/Berlinr}rjX БерлінrsU Europe/Zurichr}rjX ЦюріхrsU America/Belemr}rjX БеленrsU Europe/Skopjer}rjX Скоп'єrsUAsia/Krasnoyarskr}rjXКрасноярськrsUAtlantic/Bermudar}rjXБермудиrsUAustralia/Currier}rjX КарріrsU Asia/Tehranr}rjXТегеранrsU Asia/Saigonr}rjX СайгонrsU Asia/Bakur}rjXБакуrsUAmerica/Danmarkshavnr}rjXДенмарксхавнrsUAmerica/Scoresbysundr}rjXСкорсбисунrsUAmerica/Eiruneper}rjXЕйрунепеrsUAmerica/Caracasr}rjXКаракасrsU Asia/Baghdadr}r jX Багдадr sUAfrica/Monroviar }r jXМонровіяr sUAmerica/St_Vincentr}rjXСент-ВінсентrsUAmerica/Vancouverr}rjXВанкуверrsU Asia/Thimphur}rjXТхімпхуrsU Africa/Accrar}rjX АккраrsUAmerica/Belizer}rjX БелізrsUAmerica/Edmontonr}rjXЕдмонтонrsUAmerica/Mendozar }r!jXМендосаr"sU Asia/Tokyor#}r$jX Токіоr%sUPacific/Kiritimatir&}r'jXКірітіматіr(sUAustralia/Sydneyr)}r*jX Сіднейr+sU Europe/Rigar,}r-jXРигаr.sU Asia/Dilir/}r0jXДіліr1sUAfrica/Mbabaner2}r3jXМбабанеr4sU Asia/Oralr5}r6jXОралr7sU Asia/Adenr8}r9jXАденr:sUEurope/Isle_of_Manr;}r<jXОстрів Менr=sUEurope/Istanbulr>}r?jXСтамбулr@sU Asia/MagadanrA}rBjXМагаданrCsUAustralia/LindemanrD}rEjXЛіндеманrFsUPacific/GalapagosrG}rHjXҐалапагосrIsUAmerica/BogotarJ}rKjX БоготаrLsUAmerica/DawsonrM}rNjX ДоусонrOsUAmerica/ChicagorP}rQjX ЧикагоrRsUPacific/KwajaleinrS}rTjXКваджалейнrUsUAustralia/Broken_HillrV}rWjXБрокен-ГілrXsUAmerica/CuiabarY}rZjX Куябаr[sUIndian/Christmasr\}r]jXОстрів Різдваr^sU Asia/Jayapurar_}r`jXДжайпурrasUEurope/Brusselsrb}rcjXБрюссельrdsU Europe/Lisbonre}rfjXЛісабонrgsUAsia/Chongqingrh}rijX ЧунцинrjsUAmerica/Noronhark}rljXНороньяrmsUEurope/Podgoricarn}rojXПодгорицяrpsUAfrica/Algiersrq}rrjX АлжирrssU Africa/Hararert}rujX ХарареrvsUAfrica/Ndjamenarw}rxjXНджаменаrysUAmerica/Costa_Ricarz}r{jXКоста Рікаr|sUEurope/Ljubljanar}}r~jXЛюблянаrsUIndian/Mayotter}rjXМайоркаrsUAsia/Phnom_Penhr}rjXПномпеньrsUAmerica/Managuar}rjXМанагуаrsU Asia/Bruneir}rjX БрунейrsUAmerica/Tijuanar}rjXТіхуанаrsUPacific/Fakaofor}rjXФакаофоrsUAmerica/Martiniquer}rjXМартінікаrsUAmerica/Antiguar}rjXАнтигуаrsUAmerica/Argentina/La_Riojar}rjXЛа-РіохаrsUPacific/Tahitir}rjX ТаїтіrsUAmerica/Pangnirtungr}rjXПанґніртунґrsU Europe/Zagrebr}rjX ЗагребrsUAmerica/Asuncionr}rjXАсунсьйонrsU Europe/Viennar}rjX ВіденьrsUAustralia/Hobartr}rjX ХобартrsUAmerica/Juneaur}rjX ДжуноrsUAmerica/Inuvikr}rjX ІнувікrsUAmerica/Montrealr}rjXМонреальrsU Asia/Seoulr}rjXСеулrsU Indian/Comoror}rjX КомориrsUAntarctica/Rotherar}rjX РотераrsUEurope/Tallinnr}rjX ТаллінrsU Indian/Maher}rjXМахеrsU Asia/Calcuttar}rjXКалькуттаrsU America/Adakr}rjXАдакrsUAsia/Singaporer}rjXСингапурrsUAfrica/Nairobir}rjXНайробіrsUAmerica/Maceior}rjX МасейоrsU Asia/Urumqir}rjX УрумчіrsU Europe/Moscowr}rjX МоскваrsUAsia/Pyongyangr}rjXПхеньянrsUAsia/Ulaanbaatarr}rjXУлан-БаторrsUAmerica/Rainy_Riverr}rjXРейні-РіверrsUIndian/Maldivesr}rjXМальдівиrsU Asia/Colombor}rjXКоломбоrsUAustralia/Adelaider}rjXАделаїдаrsUAmerica/Cambridge_Bayr}rjXКембридж-БейrsU Africa/Luandar}rjX ЛуандаrsUPacific/Chathamr}rjX ЧатемrsUAmerica/Indiana/Winamacr}rjXВінамакrsUAmerica/Cordobar}rjXКордобаrsU Asia/Tbilisir}rjXТбілісіrsUEurope/Gibraltarr}rjXГібралтарr sU Asia/Karachir }r jX Карачіr sU Asia/Harbinr }r jX Харбінr sUAustralia/Lord_Hower }r jXЛорд-Хауr sUAmerica/Boa_Vistar }r jXБоа-Вістаr sUAfrica/Tripolir }r jXТріполіr sUIndian/Reunionr }r jXРеюньйонr sUAtlantic/Stanleyr }r jX Стенліr sUAmerica/Blanc-Sablonr }r jXБланк-Саблонr sUAmerica/Santo_Domingor }r jXСанто-Домінгоr sUAntarctica/Syowar }r jX Сьоваr sUAmerica/Jamaicar }r jX Ямайкаr! sU Europe/Kievr" }r# jXКиївr$ sUEurope/Budapestr% }r& jXБудапештr' sUPacific/Midwayr( }r) jX Мідуейr* sUAmerica/Goose_Bayr+ }r, jX Гуз-Бейr- sU Asia/Ammanr. }r/ jX Амманr0 sU Asia/Sakhalinr1 }r2 jXСахалінr3 sUAfrica/Windhoekr4 }r5 jXВіндхукr6 sU Asia/Katmandur7 }r8 jXКатмандуr9 sUAmerica/Guyanar: }r; jX Ґайанаr< sUAmerica/Sao_Paulor= }r> jXСан-Паулуr? sUAustralia/Perthr@ }rA jXПертrB sUAfrica/DjiboutirC }rD jXДжибутіrE sU Asia/JakartarF }rG jXДжакартаrH sUAntarctica/PalmerrI }rJ jX ПалмерrK sUAfrica/JohannesburgrL }rM jXЙоганнесбургrN sU Asia/IrkutskrO }rP jXІркутськrQ sU Africa/NiameyrR }rS jX НіамейrT sUAfrica/CasablancarU }rV jXКасабланкаrW sUAmerica/Indiana/MarengorX }rY jXМаренгоrZ sUAfrica/Nouakchottr[ }r\ jXНуакшотr] sUEurope/Vilniusr^ }r_ jXВільнюсr` sUAmerica/Cayennera }rb jXКайеннаrc sUAfrica/Mogadishurd }re jXМогадішоrf sUAmerica/Kentucky/Monticellorg }rh jXМонтичеллоri sUAmerica/Rio_Brancorj }rk jXРіо-Бранкоrl sUAmerica/Cancunrm }rn jX Канкунro sUAmerica/Havanarp }rq jX Гаванаrr sU Pacific/Guamrs }rt jXГуамru sU Asia/Makassarrv }rw jXМакасарrx sUAtlantic/Azoresry }rz jXАзорські островиr{ sUAustralia/Euclar| }r} jX Евклаr~ sU Asia/Shanghair }r jX Шанхайr sUAmerica/Rankin_Inletr }r jXРенкін-Інлетr sU Asia/Beirutr }r jX Бейрутr sU Africa/Maputor }r jX Мапутуr sU Asia/Bahrainr }r jXБахрейнr sU Asia/Ashgabatr }r jXАшгабатr sU Asia/Riyadhr }r jX Ер-Ріядr sU Europe/Londonr }r jX Лондонr sUAmerica/Monterreyr }r jXМонтерейr sUAmerica/Anguillar }r jXАнґільяr sU Asia/Damascusr }r jX Дамаскr sUAmerica/North_Dakota/Centerr }r jX Центрr sUAmerica/Indiana/Vevayr }r jX Вівейr sUAtlantic/St_Helenar }r jX$Острів Святої Єлениr sUAmerica/Barbadosr }r jXБарбадосr sUEurope/Vaticanr }r jXВатиканr sUAmerica/Indiana/Vincennesr }r jXВінсенсr sU Asia/Almatyr }r jX Алматиr sU Africa/Lomer }r jXЛомеr sUAfrica/Brazzaviller }r jXБраззавільr sU America/Nomer }r jXНомr sU Europe/Dublinr }r jX Дублінr sUAmerica/Yakutatr }r jX Якутатr sUAmerica/Araguainar }r jXАрагуайнаr sU Europe/Vaduzr }r jX Вадуцr sU Africa/Asmerar }r jX Асмераr sUAntarctica/Mawsonr }r jX Моусонr sUAmerica/Buenos_Airesr }r jXБуенос-Айресr sU Africa/Maserur }r jX Масеруr sUAmerica/Louisviller }r jXЛуїсвілльr sU Asia/Kuchingr }r jX Кучінґr sUAfrica/Libreviller }r jXЛібревільr sUAfrica/Freetownr }r jXФрітаунr sU Africa/Bissaur }r jX Бісауr sU Europe/Samarar }r jX Самараr sUEurope/Amsterdamr }r jXАмстердамr sU Europe/Tiraner }r jX Тіранаr sUPacific/Saipanr }r jX Сайпанr sUAfrica/Abidjanr }r jXАбіджанr sUEurope/Zaporozhyer }r jXЗапоріжжяr sUAmerica/El_Salvadorr }r jXСальвадорr sU Europe/Madridr }r jX Мадридr sUAmerica/Santiagor }r jXСантьягоr sUAmerica/Argentina/San_Luisr }r jXСан-Луїсr sU America/Arubar }r jX Арубаr sUAmerica/Indianapolisr }r jXІндіанаполісr sUAmerica/Reginar }r jXРеджайнаr sU Pacific/Trukr }r jXТрукr sUPacific/Funafutir }r jXФунафутіr sUAmerica/Meridar }r jX Мерідаr sUAmerica/Guatemalar }r jXГватемалаr sUAfrica/Sao_Tomer }r jX#Сан-Томе і Принсіпіr sUPacific/Kosraer }r jX Косраеr sUAfrica/Bujumburar }r jXБужумбураr sUEurope/Chisinaur! }r" jXКишинівr# sU Europe/Warsawr$ }r% jXВаршаваr& sUAsia/Yekaterinburgr' }r( jXЄкатеринбургr) sUAntarctica/Caseyr* }r+ jX Кейсіr, sUAmerica/Halifaxr- }r. jXГаліфаксr/ sU America/Thuler0 }r1 jXТулеr2 sUAmerica/St_Johnsr3 }r4 jXСент-Джонсr5 sUAmerica/Monctonr6 }r7 jXМонктонr8 sUEurope/Helsinkir9 }r: jXГельсінкіr; sUAtlantic/Cape_Verder< }r= jXКабо-Вердеr> sUAmerica/Tegucigalpar? }r@ jXТегусігальпаrA sU Indian/CocosrB }rC jXКокосові островиrD sU America/BoiserE }rF jX БойсеrG sUAmerica/GuadelouperH }rI jXҐваделупаrJ sUAmerica/NassaurK }rL jX НасауrM sU Europe/PraguerN }rO jX ПрагаrP sUPacific/EnderburyrQ }rR jXЕндерберіrS sU Asia/HovdrT }rU jXГовдrV sUAmerica/ManausrW }rX jX МанаусrY sUAmerica/GodthabrZ }r[ jX Готхобr\ sUAmerica/Catamarcar] }r^ jXКатамаркаr_ sUAmerica/Chihuahuar` }ra jX Чіуауаrb sUAmerica/Iqaluitrc }rd jXІкалуітre sUAmerica/Argentina/Rio_Gallegosrf }rg jXРіо-Ґалеґосrh sUPacific/Gambierri }rj jX Гамберrk sUEurope/Volgogradrl }rm jXВолгоградrn sU Africa/Bamakoro }rp jX Бамакоrq sUEurope/Uzhgorodrr }rs jXУжгородrt sU Africa/Banjulru }rv jX Банжулrw sU Asia/Aqtaurx }ry jX Актауrz sU Africa/Malabor{ }r| jX Малабоr} sUAtlantic/Madeirar~ }r jXМадейраr sUPacific/Noumear }r jX Нумеаr sUAfrica/Kinshasar }r jXКіншасаr sU Europe/Maltar }r jX Мальтаr sUAmerica/Argentina/Ushuaiar }r jX Ушуаяr sU Asia/Bangkokr }r jXБангкокr sU Pacific/Niuer }r jXНіуеr sUAustralia/Brisbaner }r jXБрисбенr sUAmerica/Recifer }r jX Ресіфіr sU Asia/Yerevanr }r jX Єреванr sUAmerica/La_Pazr }r jX Ла-Пасr sU Africa/Cairor }r jXКаїрr sU Africa/Lusakar }r jX Лусакаr sUPacific/Guadalcanalr }r jXГвадалканалr sUAmerica/Yellowknifer }r jXЄллоунайфr sUAsia/Vientianer }r jXВ’єнтьянr sUEurope/Kaliningradr }r jXКалінінградr sUAfrica/Conakryr }r jXКонакріr sUAmerica/Argentina/Tucumanr }r jXТукуманr sU Europe/Oslor }r jXОслоr sUAmerica/St_Kittsr }r jXСент-Кітс і Невісr sUAmerica/Panamar }r jX Панамаr sUAfrica/Gaboroner }r jXГаборонеr sU Pacific/Palaur }r jX Палауr sUAmerica/Guayaquilr }r jXГуаякільr sUAsia/Kuala_Lumpurr }r jXКуала-Лумпурr sUAtlantic/Faeroer }r jX!Фарерські островиr sUAmerica/Menomineer }r jXМеномініr sUAsia/Kamchatkar }r jXКамчаткаr sUAsia/Vladivostokr }r jXВладивостокr sU Asia/Qatarr }r jX Катарr sU Asia/Dubair }r jX Дубаїr sU Asia/Yakutskr }r jXЯкутськr sU Asia/Omskr }r jX Омськr sU Africa/Banguir }r jX Бангіr sUAmerica/Paramaribor }r jXПарамарібоr sUAfrica/Lubumbashir }r jXЛубумбашіr sUPacific/Marquesasr }r jXМаркизькі о-виr sUEurope/Bratislavar }r jXБратиславаr sU Asia/Anadyrr }r jX Анадирr sUAmerica/New_Yorkr }r jXНью-Йоркr sUPacific/Norfolkr }r jXНорфолкr sUPacific/Rarotongar }r jXРаротонгаr sUAmerica/Dominicar }r jXДомінікаr sUAfrica/Porto-Novor }r jXПорто-Новоr sUAsia/Samarkandr }r jXСамаркандr sU Asia/Dushanber }r jXДушанбеr sUAmerica/Torontor }r jXТоронтоr sU America/Bahiar }r jXБайяr sUAfrica/Kampalar }r jXКампалаr sUAfrica/Ouagadougour }r jXУагадугуr sUAntarctica/South_Poler }r jXПівденний полюсr sU Asia/Muscatr }r jX Маскатr sUAmerica/Port_of_Spainr }r jXПорт-оф-Спейнr sU Pacific/Waker }r! jXВейкr" sUAmerica/Indiana/Tell_Cityr# }r$ jXТелл-сітіr% sUAustralia/Darwinr& }r' jX Дарвінr( sUAmerica/Whitehorser) }r* jXВайтгорсr+ sUAmerica/Swift_Currentr, }r- jXСвіфт-Каррентr. sUEurope/Copenhagenr/ }r0 jXКопенгагенr1 sUAmerica/Montserratr2 }r3 jXМонсератr4 sU Asia/Tashkentr5 }r6 jXТашкентr7 sUEurope/Simferopolr8 }r9 jXСімферопольr: sUAfrica/Blantyrer; }r< jXБлантирr= sUAmerica/Detroitr> }r? jXДетройтr@ sUAmerica/ShiprockrA }rB jX ШипрокrC sUAmerica/GrenadarD }rE jXГренадаrF sUAmerica/Indiana/PetersburgrG }rH jXПетербургrI sUAsia/PontianakrJ }rK jXПонтіанакrL sUAfrica/Dar_es_SalaamrM }rN jXДар-ес-СалаамrO sUAmerica/Port-au-PrincerP }rQ jXПорт-о-ПренсrR sUAmerica/CaymanrS }rT jX!Кайманові островиrU sU Europe/AthensrV }rW jX АфіниrX sUAmerica/CuracaorY }rZ jXКюрасаоr[ sUIndian/Kerguelenr\ }r] jXОстрів Кергеленr^ sUAfrica/Khartoumr_ }r` jX Хартумra sU Asia/Manilarb }rc jX Манілаrd sUEurope/Sarajevore }rf jXСараєвоrg sU America/Jujuyrh }ri jX Жужуйrj sU Africa/Doualark }rl jX Дуалаrm sU Europe/Romern }ro jXРимrp sUAmerica/Argentina/San_Juanrq }rr jXСан-Хуанrs sUAmerica/North_Dakota/New_Salemrt }ru jXНью-Салемrv sUPacific/Port_Moresbyrw }rx jXПорт-Морсбіry sU Europe/Jerseyrz }r{ jX Джерсіr| sUEurope/Andorrar} }r~ jX Андораr sUEurope/Luxembourgr }r jXЛюксембургr sUPacific/Honolulur }r jXГонолулуr sUAmerica/St_Thomasr }r jXСент-Томасr sUPacific/Majuror }r jXМаджуроr sUAmerica/Mazatlanr }r jXМасатланr sU Asia/Macaur }r jX Макаоr sUEurope/Belgrader }r jXБелградr sUAsia/Choibalsanr }r jXЧойбалсанr sUEurope/Mariehamnr }r jX!Аландські островиr sUAntarctica/McMurdor }r jXМак-Мердоr sUAmerica/Thunder_Bayr }r jXТандер-Бейr sUAmerica/Los_Angelesr }r jXЛос-Анджелесr sU Asia/Kabulr }r jX Кабулr sUIndian/Antananarivor }r jXАнтананарівуr sUAtlantic/Reykjavikr }r jXРейк'явікr sU Asia/Nicosiar }r jXНікосіяr sUPacific/Ponaper }r jX Понапеr sUPacific/Tongatapur }r jXТонгатапуr sUPacific/Pitcairnr }r jXПіткернr sUPacific/Easterr }r jXОстрів Пасхиr sUAtlantic/South_Georgiar }r jX!Південна Джорджіяr sUAfrica/El_Aaiunr }r jX Ель-Аюнr sUAmerica/Campo_Grander }r jXКампу-Грандіr sUAmerica/Dawson_Creekr }r jXДоусон-Крікr sUAntarctica/Vostokr }r jX Востокr sUEurope/Bucharestr }r jXБухарестr sUAmerica/Porto_Velhor }r jXПорто-Вельюr sU Europe/Monacor }r jX Монакоr sU Asia/Bishkekr }r jX Бішкекr sU Africa/Ceutar }r jX Сеутаr sUAmerica/Winnipegr }r jXВінніпеґr sU Asia/Aqtober }r jX Актобеr sU Africa/Dakarr }r jX Дакарr sUAmerica/Fortalezar }r jXФорталезаr sUPacific/Tarawar }r jX Тараваr sUAfrica/Addis_Ababar }r jXАддис-Абебаr sU Pacific/Efater }r jX Ефатеr sUPacific/Johnstonr }r jXДжонстонr sUAsia/Qyzylordar }r jXКзил-Ордаr sUEurope/San_Marinor }r jXСан-Маріноr sUAsia/Jerusalemr }r jXЄрусалимr sUPacific/Aucklandr }r jX Оклендr sUAmerica/Tortolar }r jXТортолаr sUAmerica/Denverr }r jX Денверr sU Indian/Chagosr }r jX Чагосr sUAmerica/Glace_Bayr }r jXГлейс-Бейr sUAmerica/Hermosillor }r jXЕрмосільйоr sU Africa/Tunisr }r jX Тунісr sUAmerica/Montevideor }r jXМонтевідеоr sUAmerica/Resoluter }r jXРезолютr sU Asia/Gazar }r jXГазаr sU Asia/Taipeir }r jX Тайпейr sUAntarctica/DumontDUrviller }r jXДюмон-д'Юрвільr sUAmerica/Indiana/Knoxr }r jXНоксr! sUAsia/Novosibirskr" }r# jXНовосибірськr$ sU Africa/Kigalir% }r& jX Кігаліr' sUAmerica/Grand_Turkr( }r) jXГранд-Теркr* sU Africa/Lagosr+ }r, jX Лагосr- sU Europe/Sofiar. }r/ jX Софіяr0 sU America/Limar1 }r2 jXЛімаr3 sU Etc/Unknownr4 }r5 jXНевідомоr6 sUAmerica/Anchorager7 }r8 jXАнкориджr9 sU Pacific/Naurur: }r; jX Науруr< suUscriptsr= }r> (UZsymr? XСимвольнийr@ UGururA XГурмухіrB UHebrrC X ІвритrD UZzzzrE XНевідомийrF UPhnxrG XФінікійськийrH UMoonrI XМунrJ USamrrK XСамаритянськийrL UChamrM XХамітськийrN UArabrO XАрабськийrP UGujrrQ XГуджаратіrR UZxxxrS XБезписемнийrT ULycirU XЛікійськийrV USinhrW XСингальськийrX UTalurY X"Новий тайський луеrZ UMongr[ XМонгольськийr\ UXpeor] XДавньоперськийr^ UVispr_ X6Фонетична транскрипція Беллаr` URjngra XРеджангrb UOlckrc XСантальськийrd UTalere X Тай-ліrf UMandrg XМандейськийrh UManiri XМаніхейськийrj UMlymrk XМалайяламrl UTibtrm XТибетськийrn UKaliro X Кая Ліrp UJpanrq XЯпонськийrr UPlrdrs X%Писемність Поллардаrt UKanaru XКатаканаrv ULydirw XЛідійськийrx ULepcry X Лепчаrz USundr{ XСунданськийr| UYiiir} XЙїr~ UJavar XЯванськийr UOryar XОріяr ULaoor XЛаоськийr UUgarr XУгаритськийr UCyrlr XКириличнийr UVaiir XВаїr UArmnr XВірменськийr UCyrsr X3Давньоцерковнослов'янськийr UKhmrr XКхмерськийr UArmir XАрміr USylor XСілоті нагріr UItalr X"Давньоіталійськийr USgnwr XЗнаковийr UXsuxr X2Шумеро-аккадський клінописr UThaar X Таанаr UThair XТайськийr UCprtr XКіпрськийr ULinbr XЛінійний Вr ULinar XЛінійний Аr UOsmar XОсманськийr USaurr XСаураштраr UHirar XХіраганаr UHanir XКитайськийr UEgydr X+Єгипетський демотичнийr UQaair XУспадкованийr UEgyhr X+Єгипетський ієратичнийr UCansr XMУніфіковані символи канадських тубільцівr UEgypr X1Єгипетський ієрогліфічнийr UZmthr XМатематичнийr UTfngr XТифінагr UShawr XШоуr UCirtr XКиртr UGeorr XГрузинськийr UTengr XТенгварr UHrktr X&Катакана чи хіраганаr UGeokr XКхутсуріr UTavtr XТай-в'єтr UOgamr XОгамічнийr UDsrtr XДезеретr UGothr XГотичнийr UHanor X Ханунуr UBalir XБалійськийr UKorer XКорейськийr UHangr X Хангулr UCarir XКаріанськийr UAvstr XАвестійськийr UTagbr XТагбанваr UHansr X'Китайський спрощенийr UHantr X+Китайський традиційнийr URoror XРонго-ронгоr UDevar XДеванагаріr UIndsr XХарапськийr UBopor XБопомофоr UMymrr XМʼянмарr UTglgr XТагальськийr UPermr XДавньопермськийr UBugir XБугійськийr UPhagr XПхагс-паr UBrair XШрифт Брайляr UBrahr X Брахміr UBatkr X Батакr UMeror XМероїтськийr ULimbr X Лімбуr UMteir XМейтей майєкr UPhlir XПехлеві написівr UTelur X Телугуr UTamlr XТамільськийr USarar X Саратіr UPhlpr X#Пехлеві релігійнийr ULatgr X'Латинський гельськийr ULatfr X)Латинський фрактурнийr UKharr XКхароштхіr UNkoor XНкоr UPhlvr X'Пехлеві літературнийr ULatnr XЛатинськийr UMayar X#Майя ієрогліфічнийr ULanar X Ланнаr UEthir XЕфіопськийr UKthir X Каїтіr UHmngr XПахау хмонгr UBuhdr X Бухідr UCoptr! XКоптськийr" UPrtir# XПарфянськийr$ UGlagr% XГлаголичнийr& URunrr' XРунічнийr( UOrkhr) XОрхонськийr* UCakmr+ X Чакмаr, UHungr- XДавньоугорськийr. UGrekr/ XГрецькийr0 UCherr1 X Черокіr2 UZyyyr3 XНевизначенийr4 USyrcr5 XСирійськийr6 UBlisr7 XСимволи Бліссаr8 UBengr9 XБенгальськийr: USyrer; X5Давньосирійський естрангелоr< USyrjr= X1Давньосирійський західнийr> USyrnr? X/Давньосирійський східнийr@ UKndarA XКаннадаrB uUvariantsrC }rD (UMONOTONrE XМонотонічнийrF UBOONTrG XБунтлінгrH USCOUSErI XЛіверпульськийrJ UAREVELArK X"СхідновірменськийrL USOLBArM X.Діалект Столвіца/СолбікаrN ULIPAWrO XGЛіповазський діалект резьянської мовиrP U1901rQ X:Традиційна німецька орфографіяrR UBAKU1926rS XOУніфікований турецький латинський алфавітrT UOSOJSrU X#Осоянський діалектrV UPOLYTONrW XПолітонічнийrX UNJIVArY XДіалект НджіваrZ UFONIPAr[ X:Міжнародний фонетичний алфавітr\ UTARASKr] X+Орфографія Тараскевичаr^ U1606NICTr_ X<Пізньосередньофранцузська до 1606r` USAAHOra XСахоrb UPOSIXrc XКомп'ютернийrd UFONUPAre X8Уральський фонетичний алфавітrf UNEDISrg X'Натісонський діалектrh UAREVMDAri X$Західновірменськийrj U1994rk XHСтандартизована резьянська орфографіяrl U1996rm X:Нова німецька орфографія з 1996 р.rn UREVISEDro XНова орфографіяrp USCOTLANDrq X+Шотландська англійськаrr UBISKErs X/Діалект Сан-Джорджіо/Білаrt UROZAJru XРезьянськийrv uUnumber_symbolsrw }rx (Ugroupry X rz UnativeZeroDigitr{ X0r| Udecimalr} X,r~ U percentSignr hJUlistr X;r UplusSignr X+r Uinfinityr X∞r U minusSignr h@uUcurrency_namesr }r (UXXXr X.Невідома грошова одиницяr jXАлжирський динарr ULVRr X!Латвійський рубльr UGHSr XГанський седіr UBOPr XБолівійське песоr UEGPr XЄгипетський фунтr jX,Болгарський твердий левr UBGNr X(Болгарський новий левr UPABr X!Панамська бальбоаr UYUMr X.Югославський новий динарr jX'Зімбабвійський доларr UGHCr X%Ганський седі (1979-2007)r UXBDr XBЄвропейська розрахункова одиниця XBDr jXБолівіаноr UXBAr XEЄвропейська складена валютна одиницяr jXДатська кронаr UXBCr XBЄвропейська розрахункова одиниця XBCr UXBBr XGОдиниця Європейського валютного фондуr UBWPr XБотсванська пулаr jXЛіванський фунтr jX'Танзанійський шилінгr UVNDr X!Вʼєтнамський донгr jX#Намібійський доларr UAOAr X!Ангольська кванзаr UWSTr X&Тала Західного Самоаr UAONr X6Ангольська нова кванза (1990-2000)r jX'Камбоджійський рієльr jX'Малайзійський рингітr UAOKr X-Ангольська кванза (1977-1990)r jtX%Сомалійський шилінгr UKYDr X0Долар Кайманових островівr jXЛівійський динарr jX!Українська гривняr jX-Український карбованецьr jX%Угандійський шилінгr jX!Йорданський динарr UAORr XDАнгольська кванза реаджастадо (1995-1999)r USURr XРадянський рубльr UAWGr X!Арубський гульденr jXСаудівський ріалr UFIMr X!Фінляндська маркаr jX'Гонконгівський доларr jBX'Суринамський гульденr UTPEr X!Тіморський ескудоr UMGFr X)Мадагаскарський франкr UCHEr X Євро WIRr jX#Швейцарський франкr UGIPr X%Гібралтарський фунтr jX!Білоруський рубльr jXАлбанський лекr UXPDr XПаладійr UUGSr X1Угандійський шилінг (1966-1987)r jX!Мавританська угіяr UBOVr X#Болівійський мвдолr UHRKr XХорватська кунаr jX%Джибутійський франкr UHRDr X!Хорватський динарr UPESr XПеруанський солr UEQEr X Еквелеr jNXІталійська ліраr UXAFr XeФранк Центральноафриканського фінансового товаристваr UBNDr X!Брунейський доларr UISKr XІсландська кронаr UZALr XFПівденноафриканський фінансовий рандr USRDr X#Суринамський доларr UNIOr X2Нікарагуанська кордоба ороr ULAKr XЛаоський кіпr UNICr X+Нікарагуанська кордобаr jXНепальська рупіяr UMZEr X%Мозамбіцький ескудоr jXУругвайське песоr ULUCr XFЛюксембурґський франк (Конвертований)r jXЯмайський доларr UFRFr X!Французький франкrUMAFrX%Марокканський франкrUUYIrXNУругвайський песо в індексованих одиницяхrjX4Старий мозамбіцький метикалrUMZNrX'Мозамбіцький метикалrUPHPrX!Філіппінське песоr jX1Південноафриканський рандr URHDr X#Родезійський доларr UGWPr X Песо Гвінеї-БісауrULUFrX'Люксембурзький франкrUBELrX:Бельгійський франк (фінансовий)rUBECrX@Бельгійський франк (конвертований)rUNGNrX!Нігерійська найраrUYUNrX>Югославський конвертований динарrjX#Бельгійський франкrUPLZrX+Польський злотий (1950-1995)rjX)Костариканський колонrjX$Стара турецька ліраrUDEMrXНімецька маркаrUEEKr XЕстонська кронаr!jXКвача (Малаві)r"jTX-Долар Тринідаду і Тобагоr#jX&Шрі-ланкійська рупіяr$jXСловацька кронаr%jnX Ескудо Кабо-Вердеr&jX#Пакистанська рупіяr'jXУгорський форинтr(j X(Старий румунський лейr)UXEUr*X4Європейська валютна одиницяr+j X!Бермудський доларr,jVXОманський ріалr-jXЛесотський лотіr.ULSMr/X Малотіr0jX%Монгольський тугрикr1jXВірменський драмr2UYUDr3X2Югославський твердий динарr4UBUKr5XБірманський кіатr6jXСирійський фунтr7j>XКатарський ріалr8UXDRr9X6Спеціальні права запозиченняr:UNLGr;X+Нідерландський гульденr<UGEKr=X!Грузинський купонr>UMTPr?X!Мальтійський фунтr@jX4Англійський фунт стерлінгівrAjXГрузинський ларіrBUSHPrCX Фунт Святої ЄлениrDjX АфганіrEjXX2Долар Соломонових ОстровівrFUCSKrGX2Чехословацька тверда кронаrHUKPWrIX&Вона Північної КореїrJUXRErKXФонди RINETrLUCSDrMX*Старий сербський динарrNUAFArOXАфгані (1927-2002)rPUTHBrQXТаїландський батrRUBYBrSX8Білоруський новий рубль (1994-1999)rTjX!Бангладеська такаrUUGRDrVXГрецька драхмаrWj XЄменський ріалrXUDDMrYXМарка НДРrZjX-Свазілендські лілангеніr[UHTGr\XГаїтянський гурдr]UTRYr^XТурецька ліраr_UMGAr`X+Мадагаскарський аріаріraj"X6Гульден Нідерландських АнтілrbULRDrcX#Ліберійський доларrdURWFreX#Руандійський франкrfj&XНорвезька кронаrgUMXVrhX?Мексиканський юнідад де інверсіонrij\X!Кенійський шилінгrjUMOPrkXМакао патакаrlj(XІндійська рупіяrmj*X!Мексиканське песоrnUCZKroXЧеська кронаrpUTJSrqX!Таджицький сомоніrrUTJRrsXТаджицький рубльrtj,X%Бутанський нгултрумruUYDDrvXЄменський динарrwUGWErxX6Ескудо Португальської Гвінеїryj.X#Колумбійський песоrzUCOUr{X%Юнідад де валор ріалr|jXМальтійська ліраr}UMURr~X#Маврикійська рупіяrj0X%Індонезійська рупіяrj2X%Гондураська лемпіраrj4X>Французький тихоокеанський франкrj6XДолар Фіджіrj8XЕфіопський бірrUPENrX(Перуанський новий солrj:XБелізький доларrUCHWrXФранк WIRrUATSrX%Австрійський шилінгrUILPrX!Ізраїльський фунтrUZRNrX&Заїрський новий заїрrj<X%Домініканський песоrULULrX@Люксембурґський франк (Фінансовий)rUTMMrX#Туркменський манатrjbX,Новий тайванський доларrUMDLrXМолдовський лейrUXPTrXПлатинаrUECVrXHЕквадорський юнідад де валор константеrUECSrX#Еквадорський сукреrUBSDrXБагамський доларrj@XШведська кронаrjdXПаанга ТонгоrUPEIrXПеруанський інтіrUZMKrXКвача (Замбія)rUMVRrX!Мальдівська руфіяrUXTSrX(Код тестування валютиrjX'Австралійський доларrUADPrX!Андоррська песетаrUCUPrXКубинський песоrjDXІрландський фунтrUCLFrX9Чилійський юнідадес де фоментоrjFX#Барбадоський доларrjXКоморський франкrUKRWrX&Вона Південної КореїrUGMDrX!Гамбійська даласіrUVEFrX8Венесуельський болівар фуертеrjHX+Гватемальський кетсальrjJX+Венесуельський боліварrUXOFrX_Франк Західноафриканського фінансового товаристваrUSITrX!Словенський толарrUSDPrX*Старий суданський фунтrjLXЧілійський песоrUEURrXЄвроrUCDFrX#Конголезький франкrj$X+Східнокарибський доларrjPX'Казахстанський тенгеrjRXРосійський рубльrUXFUrX%Французький франк UICrUXAGrX СріблоrUBRRrX'Бразильське крузейроrUBRNrX.Бразильське нове крузадоrUBRLrX!Бразильський реалrUMMKrXКʼят МʼянмиrUUYPrX+Уругвайське песо (1975-1993)rURURrX+Російський рубль (1991-1998)rjZXПольський злотийrUBRErX3Бразильське крузейро (1990-1993)rUPYGrX)Парагвайський гуараніrUBRCrX%Бразильське крузадоrUBRBrX<Бразильське нове крузейро (1967-1986)rUSVCrX'Сальвадорський колонrUAEDrXДирхем ОАЕrUGNSrXГвінейське сіліrj`X#Македонський динарrUAZMrX7Азербайджанський манат (1993-2006)rUAZNrX+Азербайджанський манатrUUSNrX/Долар США (наступного дня)rUGQErX6Еквеле (Екваторіальна Ґвінея)rjXВануатська ватуrUBADrX3Динар (Боснія і Герцеговина)rjfX#Гвійнейський франкrUMXPrX:Мексиканське срібне песо (1861-1992)rjhXІракський динарrUERNrX!Еритрейська накфаrjjXJКонвертована марка Боснії і ГерцоговиниrjX!Сейшельська рупіяrjlXКанадський доларrUSDDrXСуданський динарrj~XКіпрський фунтrUMADrX'Марокканський дирхемrjpX!Кувейтський динарrjrX%Бурундійський франкrULTTrXЛитовський талонrUPGKrX+Кіна Папуа Нової ГвінеїrULTLr XЛитовський літr jvX%Сінгапурський доларr UUZSr XУзбецький сумr jxX.Добра Сан-Томе і ПрінсіпіrUXFOrX0Французький золотий франкrUMLFrXМалійський франкrUESPrXІспанська песетаrjzXІранський ріалrUZRZrXЗаїрський заїрrj|XКитайський юаньrUSLLrX"Леоне Сьєрра-ЛеонеrUTNDrXТуніський динарrj^XГайянський доларrUESBrXIІспанська песета (конвертовані рахунки)rUESAr X5Іспанська песета ("А" рахунок)r!jX)Новозеландський доларr"UFKPr#X#Фолклендський фунтr$ULVLr%XЛатвійський латr&UUSSr'X%Долар США (цього дня)r(jXДолар СШАr)UARPr*X/Аргентинський песо (1983-1985)r+jXКиргизький сомr,jX#Аргентинський песоr-UILSr.X0Ізраїльський новий шекельr/URONr0XРумунський лейr1URSDr2XСербський динарr3jX#Бахрейнський динарr4jXЯпонська єнаr5UARAr6X)Аргентинський австралr7USDGr8XСуданський фунтr9UPTEr:X)Португальський ескудоr;UXAUr<X Золотоr=uUmonthsr>}r?(U stand-aloner@}rA(UwiderB}rC(KX СіченьrDKX ЛютийrEKXБерезеньrFKXКвітеньrGKXТравеньrHKXЧервеньrIKX ЛипеньrJKXСерпеньrKK XВересеньrLK XЖовтеньrMK XЛистопадrNK XГруденьrOuU abbreviatedrP}rQ(KXСічrRKXЛютrSKXБерrTKXКвіrUKXТраrVKXЧерrWKXЛипrXKXСерrYK XВерrZK XЖовr[K XЛисr\K XГруr]uUnarrowr^}r_(KXСr`KXЛraKXБrbKXКrcKXТrdKXЧreKXЛrfKXСrgK XВrhK XЖriK XЛrjK XГrkuuUformatrl}rm(Uwidern}ro(KX січняrpKX лютогоrqKXберезняrrKX квітняrsKX травняrtKX червняruKX липняrvKX серпняrwK XвересняrxK X жовтняryK XлистопадаrzK X грудняr{uU abbreviatedr|}r}(KXсіч.r~KXлют.rKXбер.rKX квіт.rKX трав.rKX черв.rKXлип.rKX серп.rK Xвер.rK X жовт.rK X лист.rK X груд.ruuuUcurrency_formatsr}rNh0)r}r(h3Nh5Kh6KKrh8X ¤rjrh;KKrh=X #,##0.00 ¤rh?h9h@rhBNhCKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXПrKXВrKXСrKXЧrKXПrKXСrKXНrusUformatr}r(Uwider}r(KXПонеділокrKXВівторокrKX СередаrKX ЧетверrKXПʼятницяrKX СуботаrKX НеділяruU abbreviatedr}r(KXПнrKXВтrKXСрrKXЧтrKXПтrKXСбrKXНдruuuU meta_zonesr}r(UTurkeyr}r(UcommonrUlongr}r(UdaylightrX/за турецьким літнім часомrUstandardrX"за турецьким часомruuU Vladivostokr}r(jj}r(jX;за владивостоцьким літнім часомrjX.за владивостоцьким часомruuUEurope_Easternr}r(jj}r(jXAза східноєвропейським літнім часомrjX4за східноєвропейським часомruuU Kuybyshevr}r(jj}r(jX7за куйбишевським літнім часомrjX*за куйбишевським часомruuUEurope_Centralr}r(jj}r(jXIза центральноєвропейським літнім часомrjX<за центральноєвропейським часомruuUIsraelr}r(jj}rUgenericrX(за ізраїльським часомrsuUAfrica_Westernr}r(jj}r(jXCза західноафриканським літнім часомrjX6за західноафриканським часомruuUIranr}r(jj}r(jX/за іранським літнім часомrjX9за іранським стандартним часомruuUMoscowr}r(jj}r(jX&за московським часомrjX3за московським літнім часомrjX=за московським стандартним часомruuUAmerica_Mountainr}r(jj}r(jXGза північноамериканським гірним часомrjXTза північноамериканським гірним літнім часомrjX^за північноамериканським гірним стандартним часомruuUAtlanticr}r(jj}r(jX&за атлантичним часомrjX3за атлантичним літнім часомrjX=за атлантичним стандартним часомruuUArmeniar}r(jj}r(jX3за вірменським літнім часомrjX&за вірменським часомruuU Kamchatkar}r(jj}r(jX3за камчатським літнім часомrjX&за камчатським часомruuUOmskr}r(jj}r(jX+за омським літнім часомrjXза омським часомruuUEurope_Westernr}r(jj}r(jXCза західноєвропейським літнім часомrjX6за західноєвропейським часомr uuUAfrica_Easternr }r (jj}r jX4за східноафриканським часомr suUYakutskr}r(jj}r(jX/за якутським літнім часомrjX"за якутським часомruuUAmerica_Easternr}r(jj}r(jXIза північноамериканським східним часомrjXVза північноамериканським східним літнім часомrjX`за північноамериканським східним стандартним часомruuU Yekaterinburgr}r(jj}r(jX=за єкатеринбурзьким літнім часомrjX0за єкатеринбурзьким часомruuUAfrica_Southernr}r(jj}r (jX8за південноафриканським часомr!jXOза південноафриканським стандартним часомr"uuUAmerica_Pacificr#}r$(jj}r%(jXWза північноамериканським тихоокеанським часомr&jXdза північноамериканським тихоокеанським літнім часомr'jXnза північноамериканським тихоокеанським стандартним часомr(uuUAmerica_Centralr)}r*(jj}r+(jXQза північноамериканським центральним часомr,jX^за північноамериканським центральним літнім часомr-jXhза північноамериканським центральним стандартним часомr.uuUMagadanr/}r0(jj}r1(jX5за магаданським літнім часомr2jX(за магаданським часомr3uuUGMTr4}r5(jj}r6jXза Грінвічемr7suUAfrica_Centralr8}r9(jj}r:jX<за центральноафриканським часомr;suUSamarar<}r=(jj}r>(jX1за самарським літнім часомr?jX$за самарським часомr@uuU KrasnoyarskrA}rB(jj}rC(jX7за красноярським літнім часомrDjX*за красноярським часомrEuuU NovosibirskrF}rG(jj}rH(jX9за новосибірським літнім часомrIjX,за новосибірським часомrJuuU VolgogradrK}rL(jj}rM(jX9за волгоградським літнім часомrNjX,за волгоградським часомrOuuUJapanrP}rQ(jj}rR(jX"за японським часомrSjX/за японським літнім часомrTuuUIrkutskrU}rV(jj}rW(jX1за іркутським літнім часомrXjX$за іркутським часомrYuuuUerasrZ}r[(Uwider\}r](KXдо нашої ериr^KXнашої ериr_uU abbreviatedr`}ra(KX до н.е.rbKXн.е.rcuuu.PK[Rll%site-packages/babel/localedata/mo.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[(site-packages/babel/localedata/so_DJ.datnu[}q(Ucurrency_symbolsq}q(USOSqXSOSqUDJFqX$quUscientific_formatsq}qUpercent_formatsq }q Unumber_symbolsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}q U meta_zonesq!}q"Uvariantsq#}q$Ucurrency_namesq%}q&u.PK[r8^^(site-packages/babel/localedata/ps_AF.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (U weekend_startq KU first_dayq KU weekend_endq KuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq }q!u.PK[Rll(site-packages/babel/localedata/eu_ES.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[>!!%site-packages/babel/localedata/rw.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXigihembwe cya mbereq KXigihembwe cya kabiriq KXigihembwe cya gatatuqKXigihembwe cya kanequU abbreviatedq}q(KXI1qKXI2qKXI3qKXI4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX InyegujaratiqBUgdqCXIkigaluwa cy'IgisweduwaqDUgaqEX IkirilandiqFUgnqGX InyaguwaraniqHUglqIX IkigalisiyaqJUlaqKX IkilatiniqLUlnqMXIlingalaqNUloqOX IkilawotiyaniqPUtrqQX IgiturukiyaqRUlvqSXIkinyaletoviyaniqTUltqUX IkilituwaniyaqVUtkqWXInyeturukimeniqXUthqYXIgitayiqZUtiq[X Inyatigirinyaq\Uteq]X Igiteluguq^Upt_PTq_XInyeporutigali (Igiporutigali)q`UfilqaXIkinyafilipineqbUtaqcX IgitamiliqdUyiqeX InyeyidishiqfUpt_BRqgXInyeporutigali (Brezili)qhUdeqiXIkidageqjUdaqkX IkidaninwaqlUelqmX IkigerekiqnUeoqoX IcyesiperantoqpUenqqX IcyongerezaqrUeuqsX IkibasikiqtUetquX IcyesitoniyaqvUesqwX IcyesipanyoloqxUruqyX IkirusiyaqzUroq{XIkinyarumaniyaq|Ubnq}X Ikibengaliq~UbeqX IkibelarusiyaqUbgqXUrunyabuligariyaqUukqXIkinyayukereniqUjvqXInyejavaqUbhqX InyebihariqUbrqX InyebiritoniqUbsqX InyebosiniyaqUjaqX IkiyapaniqUocqX InyogusitaniqUtwqXInyetuwiqUtlhqX InyekilingoniqUorqXInyoriyaqUxhqX InyehawusaqUcaqX IgikatalaniqUcyqX IkigaluwaqUcsqXIgicekeqUpsqX ImpashitoqUptqX IgiporutugaliqUpaqX IgipunjabiqUviqXIkinyaviyetinamuqUplqX IgipoloneqUhyqXIkinyarumeniyaqUhrqX IgikorowasiyaqUhuqX IgihongiriyaqUhiqXIgihindiqUheqX IgiheburayoqUuzqX InyeyuzubekiqUmlqX IkimalayalamiqUmnqX IkimongoliqUmkqXIkimasedoniyaniqUurqX InyeyuruduqUmtqX IkimalitezeqUmsqX IkimalayiqUmrqX IkimaratiqUugqX IkiwiguriqUafqXIkinyafurikaneriqUswqX IgiswahiliqUisqX IgisilandeqUamqX InyamuharikiqUitqX IgitaliyaniqUsvqX IgisuweduwaqUasqX IcyasamiziqUarqXIcyarabuqUsuqX InyesudaniqUzuqXInyezuluqUiaqXUrurimi GahuzamiryangoqUazqXInyazeribayijaniqUieqX UruhuzandimiqUidqX IkinyendoziyaqUnlqX IkinerilandeqUnnqXInyenoruveji (Nyonorusiki)qUnoqX IkinoruvejiqUneqX IkinepaliqUfrqX IgifaransaqUfyqX IgifiriziyaniqUfaqX InyeperisiqUfiqX IgifinilandeqUkyqX InkerigiziqUfoqX InyefaroyiziqUkaqXInyejeworujiyaqUsrqX IgiseribeqUsqqX IcyalubaniyaqUkoqX IgikoreyaqUknqX IgikanadaqUkmqX IgikambodiyarUstrX InyesesotorUskrX IgisilovakirUsirX InyesimpalezerUshrXInyeseribiya na KorowasiyarUsor X Igisomalir Ukur X Inyekuridishir Uslr XIkinyasiloveniyarUsarX IgisansikirirUsdrXIgisindiruU territoriesr}rUTOrXIgitongarsUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X yyyy MMM drh.X%(yyyy)s %(MMM)s %(d)srubUfullr h))r!}r"(h,XEEEE, yyyy MMMM ddr#h.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sr$ubUlongr%h))r&}r'(h,X yyyy MMMM dr(h.X%(yyyy)s %(MMMM)s %(d)sr)ubUshortr*h))r+}r,(h,Xyy/MM/ddr-h.X%(yy)s/%(MM)s/%(dd)sr.ubuUcurrency_symbolsr/}r0U time_zonesr1}r2Uscriptsr3}r4Uvariantsr5}r6Unumber_symbolsr7}r8Ucurrency_namesr9}r:Umonthsr;}r<(U stand-aloner=}r>Unarrowr?}r@(KX1rAKX2rBKX3rCKX4rDKX5rEKX6rFKX7rGKX8rHK X9rIK X10rJK X11rKK X12rLusUformatrM}rN(UwiderO}rP(KXMutaramarQKX GashyantarerRKXWerurwerSKXMatarTKX GicuransirUKXKamenarVKXNyakangarWKXKanamarXK XNzelirYK XUkwakirarZK X Ugushyingor[K XUkubozar\uU abbreviatedr]}r^(KXmut.r_KXgas.r`KXwer.raKXmat.rbKXgic.rcKXkam.rdKXnya.reKXkan.rfK Xnze.rgK Xukw.rhK Xugu.riK Xuku.rjuuuUcurrency_formatsrk}rlUdaysrm}rn(U stand-alonero}rpUnarrowrq}rr(KjBKjCKjDKjEKjFKjGKjAusUformatrs}rt(Uwideru}rv(KX Kuwa mbererwKX Kuwa kabirirxKX Kuwa gataturyKX Kuwa kanerzKX Kuwa gatanur{KXKuwa gatandatur|KX Ku cyumwerur}uU abbreviatedr~}r(KXmbe.rKXkab.rKXgtu.rKXkan.rKXgnu.rKXgnd.rKXcyu.ruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXBCErKXCErusu.PK[,(site-packages/babel/localedata/es_VE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqUpatternqX ¤#,##0.00qUprefixqX¤qX¤-qq Uexp_plusq!NUgroupingq"KKq#ubsU languagesq$}q%U territoriesq&}q'U time_zonesq(}q)Uscriptsq*}q+Udecimal_formatsq,}q-U meta_zonesq.}q/Uvariantsq0}q1Ucurrency_namesq2}q3u.PK[Fn(site-packages/babel/localedata/en_CA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q (Upatternq!X yyyy-MM-ddq"Uformatq#X%(yyyy)s-%(MM)s-%(dd)sq$ubUshortq%h)q&}q'(h!Xyy-MM-ddq(h#X%(yy)s-%(MM)s-%(dd)sq)ubuUcurrency_symbolsq*}q+(UUSDq,XUS$q-UCADq.X$q/uU time_zonesq0}q1Uscriptsq2}q3Uvariantsq4}q5Unumber_symbolsq6}q7Ucurrency_namesq8}q9Umonthsq:}q;Ucurrency_formatsq<}q=Udaysq>}q?U meta_zonesq@}qAU NewfoundlandqB}qCUcommonqDssUerasqE}qFu.PK[f1݄ss(site-packages/babel/localedata/en_IE.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}q(Uamq Xa.m.q Upmq Xp.m.q uUscientific_formatsq }qUpercent_formatsq}qU week_dataq}q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)sq ubUfullq!h)q"}q#(hX HH:mm:ss vq$hX%(HH)s:%(mm)s:%(ss)s %(v)sq%ubUlongq&h)q'}q((hX HH:mm:ss zq)hX%(HH)s:%(mm)s:%(ss)s %(z)sq*ubUshortq+h)q,}q-(hXHH:mmq.hX %(HH)s:%(mm)sq/ubuU languagesq0}q1U territoriesq2}q3Udecimal_formatsq4}q5U date_formatsq6}q7(Umediumq8h)q9}q:(hX d MMM yyyyq;hX%(d)s %(MMM)s %(yyyy)sq}q?(hXEEEE d MMMM yyyyq@hX %(EEEE)s %(d)s %(MMMM)s %(yyyy)sqAubUlongqBh)qC}qD(hX d MMMM yyyyqEhX%(d)s %(MMMM)s %(yyyy)sqFubUshortqGh)qH}qI(hX dd/MM/yyyyqJhX%(dd)s/%(MM)s/%(yyyy)sqKubuUcurrency_symbolsqL}qM(UIEPqNX£qOUGBPqPXGBPqQuU time_zonesqR}qSUscriptsqT}qUUvariantsqV}qWUnumber_symbolsqX}qYUcurrency_namesqZ}q[Umonthsq\}q]Ucurrency_formatsq^}q_Ncbabel.numbers NumberPattern q`)qa}qb(Uexp_precqcNUscaleqdKU frac_precqeKKqfUsuffixqgXqhhhqiUint_precqjKKqkhX ¤#,##0.00qlUprefixqmX¤qnX-¤qoqpUexp_plusqqNUgroupingqrKKqsubsUdaysqt}quU meta_zonesqv}qwUerasqx}qyu.PK[{==(site-packages/babel/localedata/mr_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/sl_SI.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ֺ(site-packages/babel/localedata/es_EC.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXH:mm:ssqUformatqX%(H)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vqhX%(HH)s:%(mm)s:%(ss)s %(v)squbUlongqh)q}q (hX H:mm:ss zq!hX%(H)s:%(mm)s:%(ss)s %(z)sq"ubUshortq#h)q$}q%(hXH:mmq&hX %(H)s:%(mm)sq'ubuU languagesq(}q)U territoriesq*}q+Udecimal_formatsq,}q-U date_formatsq.}q/Ucurrency_symbolsq0}q1UUSDq2X$q3sU time_zonesq4}q5Uscriptsq6}q7Uvariantsq8}q9Unumber_symbolsq:}q;Ucurrency_namesq<}q=Umonthsq>}q?Ucurrency_formatsq@}qANcbabel.numbers NumberPattern qB)qC}qD(Uexp_precqENUscaleqFKU frac_precqGKKqHUsuffixqIXqJhJqKUint_precqLKKqMhX ¤#,##0.00qNUprefixqOX¤qPX¤-qQqRUexp_plusqSNUgroupingqTKKqUubsUdaysqV}qWU meta_zonesqX}qYUerasqZ}q[u.PK[ %site-packages/babel/localedata/ii.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}q(U stand-aloneq}qUnarrowq }q (KX1q KX2q KX3q KX4qusUformatq}q(Uwideq}q(KXꃅꑌqKXꃅꎸqKXꃅꍵqKXꃅꋆquU abbreviatedq}q(KXꃅꑌqKXꃅꎸqKXꃅꍵqKXꃅꋆquuuUperiodsq}q(UamqXꎸꄑq Upmq!Xꁯꋒq"uUscientific_formatsq#}q$Upercent_formatsq%}q&U week_dataq'}q((Umin_daysq)KU weekend_startq*KU first_dayq+KU weekend_endq,KuU time_formatsq-}q.U languagesq/}q0(Uruq1X ꊉꇩꉙq2Ufrq3X ꃔꇩꉙq4Uenq5X ꑱꇩꉙq6Uzhq7X ꍏꇩꉙq8Upt_BRq9Xꀠꑟꁍꄨꑸꉙq:Uptq;X ꁍꄨꑸꉙqUdeq?X ꄓꇩꉙq@UitqAX ꑴꄊꆺꉙqBUzh_HantqCXꀎꋏꍏꇩꉙqDUiiqEX ꆈꌠꉙqFUundqGXꅉꀋꌠꅇꂷqHUjaqIX ꏝꀪꉙqJUesqKX ꑭꀠꑸꉙqLuU territoriesqM}qN(UZZqOXꃅꄷꅉꀋꐚꌠqPURUqQX ꊉꇆꌦqRUFRqSXꃔꇩqTUCNqUXꍏꇩqVUDEqWXꄓꇩqXUJPqYXꏝꀪqZUITq[X ꑴꄊꆺq\UUSq]Xꂰꇩq^UGBq_Xꑱꇩq`UBRqaXꀠꑭqbUINqcXꑴꄗqduUdecimal_formatsqe}qfU date_formatsqg}qhUlongqicbabel.dates DateTimePattern qj)qk}ql(UpatternqmX yyyy MMMM dqnUformatqoX%(yyyy)s %(MMMM)s %(d)sqpubsUcurrency_symbolsqq}qrUXXXqsXXXXqtsU time_zonesqu}qvU Etc/Unknownqw}qxUcityqyX ꅉꀋꐚꌠqzssUscriptsq{}q|(UYiiiq}X ꆈꌠꁱꂷq~UZzzzqXꅉꀋꐚꌠꁱꂷqUCyrlqXꀊꆨꌦꇁꃚꁱꂷqUArabqXꀊꇁꀨꁱꂷqUZxxxqX ꁱꀋꉆꌠqUHansqXꈝꐯꉌꈲꁱꂷqULatnqX ꇁꄀꁱꂷqUHantqXꀎꋏꉌꈲꁱꂷquUvariantsq}qUnumber_symbolsq}q(UdecimalqX.qUgroupqX,quUcurrency_namesq}qhsX$ꅉꀋꐚꌠꌋꆀꎆꃀꀋꈁꀐꌠqsUmonthsq}q(U stand-aloneq}qUnarrowq}q(Kh Kh Kh KhKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXꋍꆪqKXꑍꆪqKXꌕꆪqKXꇖꆪqKXꉬꆪqKXꃘꆪqKXꏃꆪqKXꉆꆪqK XꈬꆪqK XꊰꆪqK X ꊰꊪꆪqK X ꊰꑋꆪquU abbreviatedq}q(Kh Kh Kh KhKhKhKhKhK hK X10qK X11qK X12quuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KXꋍqKXꑍqKXꌕqKXꇖqKXꉬqKXꃘqKXꆏqusUformatq}q(Uwideq}q(KX ꆏꊂꋍqKX ꆏꊂꑍqKX ꆏꊂꌕqKX ꆏꊂꇖqKX ꆏꊂꉬqKX ꆏꊂꃘqKX ꑭꆏꑍquU abbreviatedq}q(KXꆏꋍqKXꆏꑍqKXꆏꌕqKXꆏꇖqKXꆏꉬqKXꆏꃘqKXꆏꑍquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KX ꃅꋊꂿqKX ꃅꋊꊂqusu.PK[F$(site-packages/babel/localedata/ar_KW.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[?))%site-packages/babel/localedata/sq.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KXQ1qKXQ2qKXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quuuUperiodsq}q(Uamq XPDq!Upmq"XMDq#uUscientific_formatsq$}q%Upercent_formatsq&}q'U week_dataq(}q)(Umin_daysq*KU weekend_startq+KU first_dayq,KU weekend_endq-KuU time_formatsq.}q/(Umediumq0cbabel.dates DateTimePattern q1)q2}q3(Upatternq4X h:mm:ss.aq5Uformatq6X%(h)s:%(mm)s:%(ss)s.%(a)sq7ubUfullq8h1)q9}q:(h4X h.mm.ss.a vq;h6X%(h)s.%(mm)s.%(ss)s.%(a)s %(v)sq}q?(h4X h.mm.ss.a zq@h6X%(h)s.%(mm)s.%(ss)s.%(a)s %(z)sqAubUshortqBh1)qC}qD(h4Xh.mm.aqEh6X%(h)s.%(mm)s.%(a)sqFubuU languagesqG}qH(UguqIX GuxharatiqJUgdqKXGalishtqLUgaqMX IrlandishtqNUgnqOXGuaraniqPUglqQX GalicianishtqRUlaqSX LatinishtqTUlnqUXLingalaqVUloqWXLaosishtqXUtrqYXTurqishtqZUlvq[X Letonishtq\Ultq]X Lituanishtq^Utkq_XTurkq`UthqaX TajlandishtqbUtiqcXTigrinjaqdUteqeXTeluguqfUpt_PTqgXPortugalisht (Portugali)qhUfilqiX TagalogishtqjUtaqkXTamilqlUyiqmXJidenqnUpt_BRqoXPortugalisht (Brazil)qpUdeqqX GjermanishtqrUdaqsXDanishtqtUelquXGreqishtqvUeoqwX EsperantoqxUenqyXAnglishtqzUzhq{XKinezeq|Ueuq}XBaskishtq~UetqX EstonishtqUesqX SpanjishtqUruqXRusishtqUroqX RumanishtqUbnqX BengalishtqUbeqX BjellorusishtqUbgqX BullgarishtqUukqX UkrainishtqUjvqX JavanishtqUbhqXBihariqUbrqXBretonqUbsqX BoshnjakishtqUjaqX JapanishtqUocqX OksitanishtqUundqXUnknown or Invalid LanguageqUtwqXTwiqUtlhqXKlingonqUorqXOrijaqUxhqXXhosaqUcaqX KatalonishtqUcyqX UellsishtqUcsqXÇekishtqUpsqXPashtoqUptqX PortugezeqUpaqXPunxhabiqUviqX VietnamishtqUplqX PolonishtqUhyqXArmenqUhrqX KroatishtqUhuqX HungarishtqUhiqXHindiqUheqX HebraishtqUuzqXUzbekistanishtqUmlqX MalajalamqUmnqX MongolishtqUmkqX MaqedonishtqUurqXUrduqUmtqXMaltishtqUmsqX MalajzishtqUmrqXMaratiqUugqXUjgurqUafqX AfrikanishtqUswqX SuahilishtqUisqX IslandishtqUamqXAmharikeqUitqXItalishtqUsvqXSuedishtqUasqX AsamezishtqUarqXArabishtqUsuqX SundanishtqUzuqXZuluqUiaqX InterlinguaqUazqXAzerbajxhanishtqUieqXGjuha nderkombtareqUidqX IndonezishtqUnlqX HollandishtqUnnqXNorvegjisht (Nynorsk)qUnoqX NorvegjishtqUneqX NepalishtqUfrqX FrengjishtqUfyqX FrizianishtqUfaqXPersishtqUfiqX FinlandishtqUkyqXKyrgyzqUfoqXFaroishtrUkarX GjeorgjishtrUsrrXSerbishtrUsqrXshqiperUkorX KoreançerUknr XKanadar Ukmr X Kamboxhianer Ustr XSesothorUskrX SllovakishtrUsirX SinhalezishtrUshrXSerbo-KroatishtrUsorX SomalishtrUkurXKurdrUslrX SllovenishtrUsarX SanskritishtrUsdrXSi'ndiruU territoriesr}r (UBEr!X Belgjikër"UBGr#XBullgarir$UBAr%XBosnja dhe Hercegovinar&UBNr'XBrunejr(UBOr)XBolivir*UBHr+XBahreinr,UBTr-XButanr.UJMr/X Xhamajkër0UBWr1XBotsvanar2UBRr3XBrazilir4UBYr5X Bjellorusir6URUr7XRusir8URWr9XRuandar:UTJr;X Taxhikistanr<UROr=XRumanir>UGWr?X Guine Bisaur@UGTrAX GuatemalërBUGRrCXGreqirDUGQrEXGuineja EkuatorialerFUJPrGXJaponirHUGYrIXGuajanarJUGErKXGjeorgjirLUGBrMXMbretëria e BashkuarrNUGArOXGjabonrPUGNrQXGuinerRUGMrSXGambirTUGHrUXGanërVUTNrWXTunisirXUJOrYXJordanirZUHRr[XKroacir\UHUr]XHungarir^UVEr_X Venezuelër`UPTraX PortugalirbUPYrcXParaguajrdUPGreXPapua Guineja e RerfUSOrgXSomalirhUPHriXFilipinerjUPLrkXPolonirlUZMrmXZambirnUEHroXSaharaja PerëndimorerpUEErqXEstonirrUEGrsXEgjiptrtUZAruXAfrika e JugutrvUECrwXEkuatorrxUITryXItalirzUZZr{X"Rajon i panjohur ose i pavlefshëmr|USBr}XIshujt Solomonr~UETrXEtiopirUZWrXZimbabverUESrXSpanjërUERrXEritrerUMDrXMoldavirUMGrX MadagaskarrUMArXMarokorUMCrXMonakorUMNrXMongolirUMHrXIshujt MarshallrUMKrXMaqedonirUMTrXMaltërUMWrXMalavirUMVrXMaldivitrUMRrX MauritanirUTZrXTanzanirUMYrXMalajzirUMXrXMeksikërUILrXIzraelrUFRrXFrancërUFIrX FinlandërUFJrXFixhirUFMrX MikronezirUNIrX NikaraguarUNLrXVendet e UlëtarUNOrXNorvegjirUNArXNamibirUNGrXNigerirUNZrX Zelanda e RerUCIrXBregu i FildishtërUCHrXZvicërrUCOrXKolumbirUCNrXKinërUCMrXKamerunrUCLrXKilirUCArXKanadarUCGrXKongorUCFrXRepublika Qendrore e AfrikësrUCZrXRepublika e ÇekisërUCYrXQiprorUCSrXSerbië en MontenegrorUCRrX Kosta RikarUCVrX Kap VerderUCUrXKubërUSZrX SvazilandërUSYrXSirirUKGrX KirgistanrUKErXKeniarUKIrXQiribatirUKHrXKamboxhirUKNrXSaint Kitts e NevisrUKMrXKomorerUSTrXSao Tome e PrinsiperUSKrXSllovakirUKRrXKoreja e JugutrUSIrXSllovenirUKPrXKoreja e VeriutrUKWrXKuvajtrUSLrX Siera LeonerUSCrXSishelrUKZrX KazakistanrUSArXArabia SauditerUSGrXSingaporrUSErXSuedirUDOrXRepublika DominikanërUDMrX DominikërUDJrXXhibutirUDKrX DanimarkërUDErXGjermanirUYEr XJemenr UDZr XAlgjerir UUSr X!Shtetet e Bashkuara të AmerikësrUUYrXUruguajrULBrXLibanrUTWrXTajvanrUTTrXTrinidad e TobagorUTRrXTurqirULIrX LihtënshtajnrULVrXLetonirUTOrXTongarULTrXLituanir ULUr!X Luksemburgr"ULRr#XLiberir$ULSr%XLesotor&UTHr'X Tajlandër(UTGr)XTogor*UTDr+XÇadr,ULYr-XLibir.UVAr/XVatikanr0UVCr1XSaint Vincent e Grenadinetr2UAEr3XEmiratet Arabe te Bashkuarar4UADr5XAndorrër6UAGr7XAntigua e Barbudar8UAFr9X Afganistanr:UIQr;XIrakr<UISr=XIslandër>UAMr?XArmenir@UALrAX ShqipëriarBUAOrCXAngolërDUARrEX ArgjentinërFUAUrGXAustralirHUATrIXAustrirJUINrKXIndirLUAXrMX Ishujt AlandrNUAZrOX AzerbajxhanrPUIErQXIrlandërRUIDrSXIndonezirTUUArUXUkrainërVUQArWXKatarrXUMZrYXMozambikrZuUdecimal_formatsr[}r\U date_formatsr]}r^(Umediumr_h1)r`}ra(h4X yyyy-MM-ddrbh6X%(yyyy)s-%(MM)s-%(dd)srcubUfullrdh1)re}rf(h4XEEEE, dd MMMM yyyyrgh6X"%(EEEE)s, %(dd)s %(MMMM)s %(yyyy)srhubUlongrih1)rj}rk(h4X dd MMMM yyyyrlh6X%(dd)s %(MMMM)s %(yyyy)srmubUshortrnh1)ro}rp(h4Xyy-MM-ddrqh6X%(yy)s-%(MM)s-%(dd)srrubuUcurrency_symbolsrs}rtUALLruXLekrvsU time_zonesrw}rxU Etc/Unknownry}rzUcityr{XUnknownr|ssUscriptsr}}r~(UZxxxrX I pashkruarrULatnrXLatinerUZzzzrX#Skript i panjohur ose i pavlefshëmruUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}r(UUSDrXDollar amerikanrURUBrX Rubla ruserUXXXrXUnknown or Invalid CurrencyrUINRrX Rupee indianerUCNYrXRenminbi(Yuan) KinezrUJPYrX Jeni JaponezrUBRLrXReal BrazilianrUGBPrXPaund Sterlina BritanikerUEURrXEuroruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXJrKXSrKXMrKXPrKjKXQrKXKrKXGrK jK XTrK XNrK XDrusUformatr}r(Uwider}r(KXjanarrKXshkurtrKXmarsrKXprillrKXmajrKXqershorrKXkorrikrKXgushtrK XshtatorrK XtetorrK XnëntorrK XdhjetorruU abbreviatedr}r(KXJanrKXShkrKXMarrKXPrirKXMajrKXQerrKXKorrKXGshrK XShtrK XTetrK XNënrK XDhjruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrjrUint_precrKKrh4X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXHrKjKjKXErKjKjKjusUformatr}r(Uwider}r(KXe hënërKXe martërKX e mërkurërKXe enjterKXe premterKX e shtunërKXe dielruU abbreviatedr}r(KXHënrKXMarrKXMërrKXEnjrKXPrerKXShtrKXDieruuuU meta_zonesr}r(UEurope_Centralr}r(UcommonrUlongr}rUstandardrXOra qendrore evropianer suUEurope_Easternr }r (jj}r jXOra lindore evropianer suUMoscowr}r(jj}rjXOra standarde e MoskësrsuuUerasr}rU abbreviatedr}r(KXp.e.r.rKXn.e.r.rusu.PK[d4$..%site-packages/babel/localedata/ms.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX suku pertamaq KX suku keduaq KX suku ketigaqKX suku keempatquU abbreviatedq}q(KXS1qKXS2qKXS3qKXS4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mmq=h.X %(h)s:%(mm)sq>ubuU languagesq?}q@(UguqAXGujeratqBUgdqCX Scots GaelicqDUgaqEXIrelandqFUgnqGXGuaraniqHUglqIXGaliciaqJUlaqKXLatinqLUlnqMXLingalaqNUloqOXLaosqPUtrqQXTurkiqRUlvqSXLatviaqTUltqUX LithuaniaqVUtkqWXTurkmenqXUthqYXThaiqZUtiq[XTigrinyaq\Uteq]XTeluguq^Upt_PTq_XPortugis Iberiaq`UfilqaXTagalogqbUtaqcXTamilqdUyiqeXYahudiqfUdeqgXJermanqhUdaqiXDenmarkqjUelqkXGreekqlUeoqmX EsperantoqnUenqoXInggerisqpUeuqqXBasqueqrUetqsXEstoniaqtUesquXSepanyolqvUruqwXRusiaqxUroqyXRomaniaqzUbnq{XBenggalaq|Ubeq}XBelarusq~UbgqXBulgariaqUukqXUkraineqUjvqXJawaqUbhqXBihariqUbrqXBrittanyqUbsqXBosniaqUjaqXJepunqUocqXOccitanqUtwqXTwiqUtlhqXKlingonqUorqXOriyaqUxhqXXhosaqUcaqX CataloniaqUcyqXWalesqUcsqXCzechqUpsqXPashtoqUptqXPortugisqUpaqXPunjabiqUviqXVietnamqUplqXPolandqUhyqXArmeniaqUhrqXCroatqUhuqXHungaryqUhiqXHindiqUheqXIbraniqUuzqXUzbekqUmlqX MalayalamqUmnqXMongoliaqUmkqX MacedoniaqUurqXUrduqUmtqXMaltaqUmsqX Bahasa MelayuqUmrqXMarathiqUugqXUighurqUafqX AfrikaansqUswqXSwahiliqUisqXIcelandqUamqXAmharicqUitqXItaliqUsvqXSwedenqUasqXAssamqUarqXArabqUkmqXKhmerqUzuqXZuluqUiaqX InterlinguaqUazqX AzerbaijanqUieqX InterlingueqUidqX IndonesiaqUnlqXBelandaqUnnqXNynorsk NorwayqUnoqXNorwayqUneqXNepalqUfrqXPerancisqUfyqXFrisianqUfaqXParsiqUfiqXFinlandqUkyqXKyrgyzqUfoqXFaroeseqUkaqXGeorgiaqUsrqXSerbiaqUsqqXAlbaniaqUkoqXKoreaqUknqXKannadaqUsuqXSundaqUstqXSesotorUskrXSlovakrUsirXSinhalarUshrX SerboCroatiarUsorXSomalirUkur XKurdishr Uslr XSloveniar Usar XSanskritrUsdrXSindhiruU territoriesr}r(UBDrX BangladeshrUBErXBelgiumrUBFrX Burkina FasorUBGrXBulgariarUBArXBosnia dan HerzegovinarUBBrXBarbadosrUWFrXWallis and Futunar UBMr!XBermudar"UBNr#XBruneir$UBOr%XBoliviar&UBHr'XBahrainr(UBIr)XBurundir*UBJr+XBeninr,UBTr-XBhutanr.UJMr/XJamaikar0UBVr1X Bouvet Islandr2UBWr3XBotswanar4UWSr5XSamoar6UBRr7XBrazilr8UBSr9XBahamasr:UBYr;XBelarusr<UBZr=XBelizer>URUr?XRussiar@URWrAXRwandarBUTLrCX Timor-LesterDURErEXRéunionrFUTMrGX TurkmenistanrHUTJrIX TadjikistanrJUROrKXRomaniarLUTKrMXTokelaurNUGWrOX Guinea BissaurPUGUrQXGuamrRUGTrSX GuatemalarTUGSrUX,South Georgia and the South Sandwich IslandsrVUGRrWXYunanirXUGQrYXEquatorial GuinearZUGPr[X Guadelouper\UJPr]XJepunr^UGYr_XGuyanar`UGFraX French GuianarbUGErcXGeorgiardUGDreXGrenadarfUGBrgXUnited KingdomrhUGAriXGabonrjUSVrkX El SalvadorrlUGNrmXGuinearnUGMroXGambiarpUGLrqX GreenlandrrUGIrsX GibraltarrtUGHruXGhanarvUOMrwXOmanrxUTNryXTunisiarzUJOr{XJordanr|UHRr}XCroatiar~UHTrXHaitirUHUrXHungarirUHKrXHong Kong S.A.R., ChinarUHNrXHondurasrUHMrX!Heard Island and McDonald IslandsrUVErX VenezuelarUPRrX Puerto RicorUPSrXPalestinian TerritoryrUPWrXPalaurUPTrXFeringgirUSJrXSvalbard and Jan MayenrUPYrXParaguayrUIQrXIraqrUPArXPanamarUPFrXFrench PolynesiarUPGrXPapua New GuinearUPErXPerurUPKrXPakistanrUPHrXFilipinarUPNrXPitcairnrUPLrXPolandrUPMrXSaint Pierre and MiquelonrUZMrXZambiarUEHrX Sahara BaratrUEErXEstoniarUEGrXMesirrUZArXAfrika SelatanrUECrXEcuadorrUITrXItalirUVNrXVietnamrUSBrXKepulauan SolomonrUETrXEthiopiarUSOrXSomaliarUZWrXZimbabwerUSArX Arab SaudirUESrXSepanyolrUERrXEritrearUMDrXMoldovarUMGrX MadagaskarrUMArXMaghribirUMCrXMonacorUUZrX UzbekistanrUMMrXMyanmarrUMLrXMalirUMOrXMacao S.A.R., ChinarUMNrXMongoliarUMHrXKepulauan MarshallrUMKrX MacedoniarUMUrX MauritiusrUMTrXMaltarUMWrXMalawirUMVrXMaldivrUMQrX MartiniquerUMPrXNorthern Mariana IslandsrUMSrX MontserratrUMRrX MauritaniarUUGrXUgandarUMYrXMalaysiarUMXrXMeksikorUILrXIsraelrUFRrXPerancisrUIOrXBritish Indian Ocean TerritoryrUSHrX Saint HelenarUFIrXFinlandrUFJrXFijirUFKrXFalkland IslandsrUFMrX MicronesiarUFOrX Faroe IslandsrUNIrX NicaraguarUNLr XBelandar UNOr XNorwayr UNAr XNamibiarUVUrXVanuaturUNCrX New CaledoniarUNErXNigerrUNFrXNorfolk IslandrUNGrXNigeriarUNZrX New ZealandrUNPrXNepalrUNRrXNaururUNUrXNiuer UCKr!X Cook Islandsr"UCIr#X Pantai Gadingr$UCHr%X Switzerlandr&UCOr'XColombiar(UCNr)XCinar*UCMr+XKamerunr,UCLr-XCiler.UCCr/XCocos (Keeling) Islandsr0UCAr1XKanadar2UCGr3XCongor4UCFr5XRepublik Afrika Tengahr6UCDr7X Democratic Republic of the Congor8UCZr9XRepublik Czechr:UCYr;XKibrisr<UCXr=XChristmas Islandr>UCSr?XSerbia dan Montenegror@UCRrAX Kosta RikarBUCVrCX Cape VerderDUCUrEXCubarFUSZrGX SwazilandrHUSYrIXSyriarJUKGrKX KyrgyzstanrLUKErMXKenyarNUSRrOXSurinamrPUKIrQXKiribatirRUKHrSXKembojarTUKNrUXSaint Kitts dan NevisrVUKMrWXComorosrXUSTrYXSao Tome dan PrinciperZUSKr[XSlovakiar\UKRr]X Selatan Korear^USIr_XSloveniar`UKPraX Utara KorearbUKWrcXKuwaitrdUSNreXSenegalrfUSMrgX San MarinorhUSLriX Siera LeonrjUSCrkX SeychellesrlUKZrmX KazakhstanrnUKYroXCayman IslandsrpUSGrqX SingapurarrUSErsXSwedenrtUSDruXSudanrvUDOrwXRepublik DominicanrxUDMryXDominicarzUDJr{XJiboutir|UDKr}XDenmarkr~UVGrXBritish Virgin IslandsrUDErXJermanrUYErXYamanrUDZrXAljazairrUUSrXAmerika SyarikatrUUYrXUruguayrUYTrXMayotterUUMrX$United States Minor Outlying IslandsrULBrXLubnanrULCrX Saint LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTrXTrinidad dan TobagorUTRrXTurkirULKrX Sri LankarULIrX LiechtensteinrULVrXLatviarUTOrXTongarULTrX LithuaniarULUrX LuksembourgrULRrXLiberiarULSrXLesothorUTHrXThailandrUTFrXFrench Southern TerritoriesrUTGrXTogorUTDrXCadrUTCrXTurks and Caicos IslandsrULYrXLibyarUVArXVaticanrUVCrXSaint Vincent dan GrenadinesrUAErXEmiriah Arab BersaturUADrXAndorrarUAGrXAntigua dan BarbudarUAFrX AfghanistanrUAIrXAnguillarUVIrXU.S. Virgin IslandsrUISrXIcelandrUIRrXIranrUAMrXArmeniarUALrXAlbaniarUAOrXAngolarUANrXNetherlands AntillesrUAQrX AntarcticarUASrXAmerican SamoarUARrX ArgentinarUAUrX AustraliarUATrXAustriarUAWrXArubarUINrXHindiarUTZrXTanzaniarUAZrX AzerbaijanrUIErXIrelandrUIDrX IndonesiarUUArXUkrainerUQArXQatarrUMZrXMozambikruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X dd MMM yyyyrh.X%(dd)s %(MMM)s %(yyyy)srubUfullrh))r}r(h,XEEEE dd MMM yyyyrh.X %(EEEE)s %(dd)s %(MMM)s %(yyyy)srubUlongrh))r}r(h,X dd MMMM yyyyrh.X%(dd)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,X dd/MM/yyyyrh.X%(dd)s/%(MM)s/%(yyyy)srubuUcurrency_symbolsr }r UMYRr XRMr sU time_zonesr }rUscriptsr}rUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}rj XRinggit MalaysiarsUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3r KX4r!KX5r"KX6r#KX7r$KX8r%K X9r&K X10r'K X11r(K X12r)usUformatr*}r+(Uwider,}r-(KXJanuarir.KXFebruarir/KXMacr0KXAprilr1KXMeir2KXJunr3KXJulair4KXOgosr5K X Septemberr6K XOktoberr7K XNovemberr8K XDisemberr9uU abbreviatedr:}r;(KXJanr<KXFebr=KXMacr>KXAprr?KXMeir@KXJunrAKXJulrBKXOgosrCK XSeprDK XOktrEK XNovrFK XDisrGuuuUcurrency_formatsrH}rINcbabel.numbers NumberPattern rJ)rK}rL(Uexp_precrMNUscalerNKU frac_precrOKKrPUsuffixrQXrRX)rSrTUint_precrUKKrVh,X ¤#,##0.00rWUprefixrXX¤rYX(¤rZr[Uexp_plusr\NUgroupingr]KKr^ubsUdaysr_}r`(U stand-alonera}rbUnarrowrc}rd(KjKj Kj!Kj"Kj#Kj$KjusUformatre}rf(Uwiderg}rh(KXIsninriKXSelasarjKXRaburkKXKhamisrlKXJumaatrmKXSabturnKXAhadrouU abbreviatedrp}rq(KXIsnrrKXSelrsKXRabrtKXKharuKXJumrvKXSabrwKXAhdrxuuuU meta_zonesry}rzUerasr{}r|U abbreviatedr}}r~(KXS.M.rKXT.M.rusu.PK[_.ll(site-packages/babel/localedata/om_ET.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[{==(site-packages/babel/localedata/ta_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll*site-packages/babel/localedata/kk_Cyrl.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/af_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[+#$q$q%site-packages/babel/localedata/hr.datnu[}q(U zone_formatsq}q(UregionqX%sqUgmtqXGMT%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q Uformatq }q (Uwideq}q(KX 1. kvartalqKX 2. kvartalqKX 3. kvartalqKX 4. kvartalquU abbreviatedq}q(KX1kvqKX2kvqKX3kvqKX4kvquusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq }q!Upercent_formatsq"}q#U week_dataq$}q%(Umin_daysq&KU weekend_startq'KU first_dayq(KU weekend_endq)KuU time_formatsq*}q+(Umediumq,cbabel.dates DateTimePattern q-)q.}q/(Upatternq0XHH:mm:ssq1Uformatq2X%(HH)s:%(mm)s:%(ss)sq3ubUfullq4h-)q5}q6(h0X HH:mm:ss vq7h2X%(HH)s:%(mm)s:%(ss)s %(v)sq8ubUlongq9h-)q:}q;(h0X HH:mm:ss zqh-)q?}q@(h0XHH:mmqAh2X %(HH)s:%(mm)sqBubuU languagesqC}qD(UguqEXgujaratiqFUroaqGXromanski (ostali)qHUafaqIXostali afričko-azijskiqJUgdqKXškotski-galskiqLUgaqMXirskiqNUgnqOXguaraniqPUglqQX galicijskiqRUgmhqSX(njemački, srednji visoki (ca.1050-1500)qTUlbqUX luksemburškiqVUfiuqWXugro-finski jeziciqXUlnqYXlingalaqZUloq[Xlaoskiq\Utrq]Xturskiq^Ubntq_Xbantuq`UlvqaX latvijskiqbUltqcX litvanskiqdUtkqeX turkmenskiqfUthqgX tajlandskiqhUtiqiXtigrinyaqjUtaiqkXtajskiqlUsuqmX sundanskiqnUteqoXteluguqpUpt_PTqqXportugalski (iberijski)qrUfilqsXfilipinoqtUhawquXhavajskiqvUyiqwXjidišqxUmgaqyXirski, srednji (900-1200)qzUcelq{Xkeltski (ostali)q|Udaq}Xdanskiq~UrmqX retoromanskiqUgemqXgermanski (ostali)qUbatqXbaltički (ostali)qUelqXgrčkiqUeoqX esperantoqUenqXengleskiqUartqXumjetni (ostali)qUzh_HansqXkineski (pojednostavljeni)qUzh_HantqXkineski (tradicionalni)qUsgaqX staroirskiqUen_USqXengleski (američki)qUeuqX baskijskiqUetqX estonijskiqUesqX španjolskiqUruqXruskiqUgohqX%njemački, stari visoki (ca.750-1050)qUpeoqXstaroperzijskiqUiraqXiranskiqUroqX rumunjskiqUdsbqXlužičkosrpskiqUjvqXjavanskiqUbeqX bjeloruskiqUbgqXbugarskiqUukqX ukrajinskiqUwoqXwolofqUbnqX bengalskiqUboqX tibetanskiqUbhqXbihariqUbrqX bretonskiqUbsqXbosanskiqUjaqXjapanskiqUlaqXlatinskiqUocqX okcitanskiqUundqXnepoznati ili nevažeći jezikqUtwqXtwiqUndsqXdonjonjemačkiqUtlhqX klingonskiqUorqXorijskiqUxhqXxhosaqUcoqX korzičkiqUcaqX katalonskiqUcyqXvelškiqUcsqXčeškiqUtyqX tahićanskiqUapaqXapaškiqUcuqXcrkvenoslavenskiqUde_CHqXgornjonjemački (Švicarska)qUpsqXpaštuqUdumqX#nizozemski, srednji (ca. 1050-1350)qUptqX portugalskiqUfroqXfrancuski, stari (842-ca.1400)qUtlqXtagalogqUfrmqX!francuski, srednji (ca.1400-1600)qUmkhqXmkhqUfrsqXistočnofrizijskiqUfrrqXsjevernofrizijskiqUchrqXčerokiqUpaqXpunjabiqUviqX vijetnamskiqUzxxqXbez jezičnog sadržajaqUproqXstaroprovansalskiqUen_GBqXengleski (britanski)qUzhqXkineskiqUhyqXarmenskiqUhrqXhrvatskirUotarXturski - otomanskirUegyrXegipatski (antički)rUhtrXkreolskirUhurX mađarskirUhir Xhindur Uher X hebrejskir Uuzr XuzbečkirUmlrX malayalamrUmorX moldavskirUmnrX mongolskirUmkrX makedonskirUurrXurdurUmtrX malteškirUplrXpoljskirUmsrXmalajskirUmrrXmarathir Uberr!X berberskir"Uugr#Xturkmenski (uighur)r$Utar%Xtamilskir&Umyr'X burmanskir(Uslar)Xslavenski (drugi)r*Uangr+Xengleski, stari (ca.450-1100)r,Uafr-X afrikaansr.Uner/Xnepalskir0Uisr1X islandskir2Uamr3Xamharikr4Uitr5X talijanskir6Unl_BEr7X flamanskir8Uasr9Xasamski (Britanska Indija)r:Uarr;Xarapskir<Ues_419r=Xšpanjolski (Latinska Amerika)r>Uavr?Xavarskir@UiarAX interlinguarBUinerCXindoevropski (drugi)rDUazrEXazerbajdžanskirFUierGXSinterlingua (jezik zamišljen za internacionalnu komunikaciju među znanstvenicima)rHUidrIX indonezijskirJUincrKXindijski (drugi)rLUnlrMX nizozemskirNUnnrOX novonorveškirPUnorQX norveškirRUnbrSXknjiževni norveškirTUenmrUXengleski, srednji (1100-1500)rVUen_AUrWXengleski (australski)rXUgrcrYXgrčki, antički (do 1453)rZUzur[Xzulur\Usor]Xsomalskir^Umisr_X ostali jezicir`UtigraX tigriškirbUfrrcX francuskirdUdereX njemačkirfUsmrgX samoanskirhUfyriX frizijskirjUsvrkXšvedskirlUfarmX perzijskirnUfiroXfinskirpUfjrqX fidžijskirrUsarsX sanskrtskirtUforuX faroanskirvUkarwX gruzijskirxUkgryXkongorzUgswr{Xnjemački (Švicarska)r|Ukkr}Xkazaškir~UsrrXsrpskirUsqrXalbanskirUkorXkorejskirUknrXkannadarUkmrXkmerskirUstrXsesotskirUskrX slovačkirUsirX singaleškirUshrXsrpsko-hrvatskirUkwrXkornskirUkurXkurdskirUslrX slovenskirUscrXsardskirUkyrX kirgiškirUswrXsvahilirUsdrXsindhiruU territoriesr}r(UBDrX BangladešrUBErXBelgijarUBFrX Burkina FasorUBGrXBugarskarUVErX VenezuelarUBArXBosna i HercegovinarUBBrXBarbadosrUWFrXWallis i FutunarUBMrXBermudarUBNrXBruneirUBOrXBolivijarUBHrXBahreinrUBIrXBurundirUBJrXBeninrUBTrXButanrU011rXZapadna AfrikarUBVrX Otok BouvetrUBWrXBocvanarU014rXIstočna AfrikarU015rXSjeverna AfrikarUBRrXBrazilrU017rXSredišnja AfrikarU018rX Južna AfrikarU019rXAmerikerUBYrX BjelorusijarUBZrXBelizerULVrXLatvijarURWrXRuandarURSrXSrbijarUTLrXIstočni TimorrURErXReunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadžikistanrUROrX RumunjskarUTKrXTokelaurUGWrX Gvineja BisaurUGUrXGuamrUGTrX GvatemalarUGSrX&Južna Gruzija i Južni Sendvič OtocirUGRrXGrčkarUGQrXEkvatorska GvinejarUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGvajanarUGGrXGuernseyrUGFrXFrancuska GvajanarUGErXGruzijarUGDrXGrenadarU021rXSjeverna AmerikarUGBrXVelika BritanijarUGAr XGabonr USVr X El Salvadorr UGNr XGvinejarUGMrXGambijarUGLrX GreenlandrU029rXKaribirUGIrX GibraltarrUGHrXGanarUJErXJerseyrUTNrXTunisrUJMrXJamajkarU013rXCentralna Amerikar UWSr!XSamoar"U419r#XLatinska Amerika i Karibir$UHRr%XHrvatskar&UBSr'XBahamir(UHTr)XHaitir*UHUr+X Mađarskar,UHKr-XHong Kong S.A.R. Kiner.U039r/X Južna Europar0UHNr1XHondurasr2UFIr3XFinskar4U142r5XAzijar6U030r7XIstočna Azijar8U034r9X Južna Azijar:U035r;XJugoistočna Azijar<UPRr=X Portorikor>UPSr?XPalestinska Teritoijar@U830rAXKanalski otocirBUFKrCXFalklandski OtocirDUIOrEX$Britanski Teritorij Indijskog OceanarFUPWrGXPalaurHUPTrIXPortugalrJUSJrKXSvalbard i Jan MayenrLUMDrMX MoldavijarNUIQrOXIrakrPUPArQXPanamarRUPFrSXFrancuska PolinezijarTUPGrUXPapua Nova GvinejarVUPErWXPerurXUPKrYXPakistanrZUPHr[XFilipinir\UFOr]X Farski Otocir^UPNr_XPitcairnr`UPLraXPoljskarbUPMrcXSveti Petar i MiguelrdUZMreXZambijarfUEHrgXZapadna SahararhURUriXRusijarjUEErkXEstonijarlUEGrmXEgipatrnUZAroXJužnoafrička RepublikarpUECrqXEkvadorrrUITrsXItalijartUVNruXVijetnamrvUZZrwXnepoznata ili nevažeća oblastrxUSBryXSalamunovi OtocirzUETr{XEtiopijar|USOr}XSomalijar~UZWrXZimbabverUSArXSaudijska ArabijarUESrX ŠpanjolskarUERrXEritrejarUMErX Crna GorarUAQrX AntarktikrUMGrX MadagaskarrUMArXMarokorUMCrXMonakorUUZrX UzbekistanrUMMrXMijanmarUMLrXMalirUMOrXMakao S.A.R. KinerUMNrX MongolijarUHMrXOtok Heard i Otoci McDonaldrUASrXAmerička SamoarUMKrX)Bivša Jugoslavenska Republika MakedonijarUMUrX MauricijusrUMTrXMaltarUMWrXMalavirUMVrXMaldivirUMQrXMartinikrUMPrXSjeverni Marianski OtocirUMSrX MontseratrUMRrX MauritanijarUIMrXOtok ManrUUGrXUgandarUTZrX TanzanijarUMYrXMalezijarUMXrXMeksikorUILrXIzraelrUFRrX FrancuskarUAWrXArubarUDOrXDominikanska RepublikarUSHrX Sveta HelenarUVCrXSveti Vincent i GrenadinirU054rX MelanezijarUDJrXDžibutirUFJrXFidžirU057rX MicronezijarUFMrX MikronezijarU053rXAustralija i Novi ZelandrUNIrX NikaragvarUNLrX NizozemskarUNOrX NorveškarUNArXNamibijarUVUrXVanuaturUNCrXNova KaledonijarUNErXNigerrUNFrXNorfolški OtocirUNGrXNigerijarUNZrX Novi ZelandrUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinezijarUCIrXObala BjelokostirUCHrX ŠvicarskarUCOrX KolumbijarUCNrXKinarUCMrXKamerunrUCLrXČilerUCCrXKokosovi OtocirUCArXKanadarUCGrXKongorUCFrXSrednjoafrička RepublikarUCDrXDemokratska Republika KongorUCZrXČeška RepublikarUCYrXCiparrUCXr XBožićni Otocir UCSr XSrbija i Crna Gorar UCRr X KostarikarUPYrXParagvajrUCVrX Zeleni RtrUCUrXKubarUSZrXSvazirUSYrXSirijarUKGrX KirgistanrUKErXKenijarUSRrXSurinamrU143rX Srednja Azijar UKHr!X Kambodžar"UKNr#XSveti Kristofor i Nevisr$UKMr%XKomorir&USTr'XSveti Toma i Prinsiper(USKr)X Slovačkar*UKRr+X Južna Korejar,USIr-X Slovenijar.UKPr/XKoreja, Sjevernar0UKWr1XKuvajtr2USNr3XSenegalr4USMr5X San Marinor6USLr7X Sijera Leoner8USCr9XSejšelir:UKZr;X Kazakstanr<UKYr=XKajmanski Otocir>USGr?XSingapurr@USErAXŠvedskarBUSDrCXSudanrDU151rEXIstočna EuroparFU150rGXEuroparHUDMrIXDominikarJU155rKXZapadna EuroparLU154rMXSjeverna EuroparNUVGrOXBritanski Djevičanski OtocirPUDErQX NjemačkarRUYErSXJemenrTUMHrUXMaršalovi OtocirVU062rWXJužno-centralna AzijarXUDZrYXAlžirrZUUSr[XSjedinjene Državer\UUYr]XUrugvajr^UYTr_XMajoter`UUMraX+Ujedinjene Države Manjih Pacifičkih OtokarbULBrcXLibanonrdULCreX Sveta LucijarfULArgX$Laoska Narodna Demokratska RepublikarhUTVriXTuvalurjUTWrkXTajvanrlUTTrmXTrinidad i TobagornUTRroXTurskarpULKrqX Šri LankarrULIrsX LihtenštajnrtUCKruX Kukovi OtocirvUTOrwXTongarxULTryXLitvarzULUr{X Luksemburgr|ULRr}XLiberijar~ULSrXLesotorUTHrXTajlandrUTFrXFrancuski Južni TeritorijirUTGrXTogorUTDrXČadrUTCrXTurkski i Kaikos OtocirULYrXLibijska Arapska DžamahirijarUVArX Grad VatikanrU145rX Zapadna AzijarUAErXUjedinjeni Arapski EmiratirUADrXAndorarUAGrXAntigua i BarbudarUAFrX AfganistanrUAIrXAnguilarUVIrXAmerički Djevičanski OtocirUISrXIslandrUIRrXIranrUAMrXArmenijarUALrXAlbanijarUAOrXAngolarUANrXNizozemski AntilirU003rXSjevernoamerički kontinentrU002rXAfrikarU001rXSvijetrUARrX ArgentinarUAUrX AustralijarUATrXAustrijarU005rXJužna AmerikarUINrXIndijarUAXrXAlandski otocirU009rXOceanijarUAZrX AzerbajdžanrUIErXIrskarUIDrX IndonezijarUJOrXJordanrUQUrXEuropska UnijarUUArXUkrajinarUQArXKatarrUDKrXDanskarUMZrXMozambikrUQOrXOstala oceanijaruUdecimal_formatsr}rU date_formatsr}r(Umediumrh-)r}r(h0X d. MMM. yyyy.rh2X%(d)s. %(MMM)s. %(yyyy)s.rubUfullrh-)r}r(h0XEEEE, d. MMMM yyyy.rh2X#%(EEEE)s, %(d)s. %(MMMM)s %(yyyy)s.rubUlongrh-)r}r(h0X d. MMMM yyyy.rh2X%(d)s. %(MMMM)s %(yyyy)s.rubUshortrh-)r}r(h0X dd.MM.yyyy.rh2X%(dd)s.%(MM)s.%(yyyy)s.rubuUcurrency_symbolsr}r(UCOPrXCol$rUMKDrXMDenrUDZDrXDArUNADrXN$rUKMFrXCFrUMTLrXLmrUNZDrX$NZrUBEFrXBFrUHNLrXLrUFJDrXF$rUETBrXBrrUCRCrXCrUTRLrXTLrUGNFrXGFrUMWKrXMKrUIQDr XIDr UDOPr XRD$r UCVEr XCVEscrULKRrXSL RerUDKKrXDKrrUSKKrXSkrUCADrXCan$rUPKRrXPrarUHUFrXFtrUCYPrX£CrUROLrXleurUKWDrXKDr UBMDr!XBer$r"UKHRr#XCRr$UMYRr%XRMr&UMNTr'XTugr(UAMDr)Xdramr*UXXXr+XXXXr,ULYDr-XLDr.UZARr/XRr0USOSr1XSh.r2USYPr3XLSr4UJODr5XJDr6UIEPr7XIR£r8UTWDr9XNT$r:UPLNr;XZlr<USEKr=XSKrr>USGDr?XS$r@UHKDrAXHK$rBUGELrCXlarirDUSRGrEXSfrFUZWDrGXZ$rHUAUDrIX$ArJUCHFrKXSwFrLUTZSrMXT ShrNUIDRrOXRprPUIRRrQXRIrRUBBDrSXBDS$rTUKGSrUXsomrVUYERrWXYRlrXUBDTrYXTkrZUGYDr[XG$r\UVEBr]XBer^UUGXr_XU Shr`UHRKraXKnrbUDJFrcXDFrdUCLPreXCh$rfUALLrgXlekrhUARSriXArg$rjUSZLrkXErlUKZTrmXTrnUGTQroXQrpUKESrqXK ShrrUNOKrsXNKrrtUTTDruXTT$rvUINRrwXINRrxUMXNryXMEX$rzUOMRr{XROr|UMROr}XUMr~UJMDrXJ$rUSBDrXSI$rUMZMrXMtrUSCRrXSRrUBAMrXKMrULSLrXMrUNPRrXNrsruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanarska OtočjarsU Europe/Lisbonr}rjXLisabonrsUAmerica/Guatemalar}rjX GvatemalarsU Asia/Bahrainr}rjXBahreinrsU Asia/Tashkentr}rjXTaškentrsU Asia/Tokyor}rjXTokiorsUPacific/Easterr}rjX Uskrsni OtokrsUAmerica/Costa_Ricar}rjX KostarikarsUAsia/Kamchatkar}rjX KamčatkarsUAtlantic/South_Georgiar}rjXJužna GeorgiarsU Europe/Warsawr}rjXVaršavarsUAsia/Krasnoyarskr}rjX KrasnojarskrsU Asia/Qatarr}rjXKatarrsUAmerica/St_Luciar}rjX Sveta LucijarsUEurope/Andorrar}rjXAndorarsUAsia/Singaporer}rjXSingapurrsUEurope/Zaporozhyer}rjX ZaporožjersUEurope/Bucharestr}rjX BukureštrsU Europe/Monacor}rjXMonakorsUEurope/Luxembourgr}rjX LuksemburgrsUIndian/Reunionr}rjXRéunionrsUIndian/Maldivesr}rjXMaldivirsUAfrica/Djiboutir}rjXDžibutirsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAtlantic/Cape_Verder}rjXZelenortska RepublikarsU Europe/Romer}rjXRimrsU Europe/Moscowr}rjXMoskvarsUAmerica/El_Salvadorr}rjXSalvadorrsU Asia/Kuwaitr}rjXKuvajtrsUAmerica/Jamaicar}rjXJamajkarsUAfrica/Lubumbashir}rjX LubumbaširsU Europe/Kievr}rjXKijevrsUAfrica/Kinshasar}rjXKinšasarsUAmerica/Anchorager}rjXAlaska vremenska zonarsUAtlantic/St_Helenar}rjX Sveta HelenarsUIndian/Christmasr}rjXBožićrsU Europe/Viennar}rjXBećrsU Europe/Parisr}rjXParizrsUIndian/Mauritiusr}rjX MauricijusrsU Pacific/Fijir}rjXFidžirsUAmerica/St_Thomasr}r jX Sveti Thomasr sU Europe/Sofiar }r jXSofijar sU Europe/Athensr}rjXAtenarsUAmerica/St_Vincentr}rjX Sveti VincentrsUAmerica/Dominicar}rjXDominikarsUAmerica/Guyanar}rjXGvajanarsU Asia/Nicosiar}rjXNikozijarsU Etc/Unknownr}rjXNepoznat ili nevažeći gradrsUAmerica/Puerto_Ricor }r!jX Portorikor"sUEurope/Uzhgorodr#}r$jXUzgorodr%sU Asia/Shanghair&}r'jXŠangajr(sUAmerica/St_Kittsr)}r*jX St. Kittsr+sUEurope/Budapestr,}r-jX Budimpeštar.sUAfrica/Algiersr/}r0jXAlžirr1sUAntarctica/South_Poler2}r3jX Južni polr4sU Asia/Anadyrr5}r6jXAnadirr7suUscriptsr8}r9(URunrr:X runsko pismor;UTamlr<Xtamilsko pismor=UTibtr>Xtibetansko pismor?UHebrr@Xhebrejsko pismorAUJpanrBXjapansko pismorCUZzzzrDXnepoznato ili nevažeće pismorEUCyrlrFX ćirilicarGUArabrHX arapsko pismorIUZxxxrJXnepisani jezikrKUTfngrLXtifinarrMUSinhrNXsingaleško pismorOUEgyprPXegipatski hijeroglifirQUThairRXtajlandsko pismorSULatnrTXLatinskirUUGlagrVX glagoljicarWUGrekrXX grčko pismorYuUvariantsrZ}r[Unumber_symbolsr\}r](Udecimalr^X,r_Ugroupr`X.rauUcurrency_namesrb}rc(j+Xnepoznata ili nevažeća valutardjXAlžirski dinarrejXNamibijski dolarrfjX Comoro FrancrgUBOPrhXbolivijski pezoriUEGPrjXEgipatska funtarkUBGNrlXbugarski novi levrmUPABrnXPanamska balboaroUYUMrpXJugoslavenski novi dinarrqUYUNrrX!Jugoslavenski konvertibilni dinarrsUBOBrtX bolivijanoruUXBArvXEuropska složena jedinicarwjX Danska krunarxUXBBryXEuropska monetarna jedinicarzUBWPr{Xpular|jMXTanzanijski šilingr}UVNDr~XViejetnamski dongrUAOArXAngolska kvanzarUAONrX angolska nova kvanza (1990-2000)rj#XCambodian Rielrj%XMalaysian RinggitrUAOKrXAngolska kvanza (1977-1990)rj1XSomalijski šilingrUKYDrXKajmanski dolarrj-XLibijski dinarrUUAHrXUkrajinska hrivnjarj5XJordanski dinarrUAWGrXarupski guldenrUSARrXsaudijski rialrUFIMrX Finska markarjAXHonkonški dolarrjEXSurinamski guldenrUTPErXTimorski eskudorjKXŠvicarski franakrUGIPrXGibraltarska funtarUBYRrXbjeloruska rubljarUITLrXTalijanska lirarUUGSrXUgandski šiling (1966-1987)rj}XMauritanska ougujarUBOVrXbolivijski mvdolrjaXKunarjcXDjibouti FrancrUHRDrXHrvatski dinarrUPESrX Peruanski solrUBYBrX"bjeloruska nova rublja (1994-1999)rUTHBrXtajlandski batrUBNDrXBrunejski dolarrUISKrXIslandska krunarUZALrX!Južnoafrički rand (financijski)rULAKrX Laotian KiprUMZErXMozambique Escudorj3XSirijska funtarjXJamaičanski dolarrUFRFrXFrancuski franakrUMAFrXMorokanski franakrjXMozambique MeticalrUPHPrXFilipinski pezorj/XJužnoafrički randrUILSrXNovi izraelski šekelrULUFrXLuksemburški franakrUNGNrXNigerijska nairarjXBelgijski franakrjXKostarikanski kolonrUAEDrX UAE dirhamrUEEKrXEstonian KroonrjX Malawi KwacharjuXTrinidadtobaški dolarrjXSri Lanka RupeerjXSlovačka krunarjX Turska lirarjXPakistanska rupijarjXMađarska forintarjX Rumunjski lejrj!XBermudski dolarrUXEUrXeuropska monetarna jedinicarjX Lesotho LotirULVRrX Latvian Rublerj'XMongolski tugrikrj)X Armenian DramrUYUDrXJugoslavenski čvrsti dinarrj_XUgandski šilingrUNLGrXNizozemski guldenrUGEKrXGeorgian Kupon LaritrUMTPrXMalteška funtarUGBPrXBritanska funtarjCXGruzijski larirjGXZimbabveanski dolarrjXSolomonskootočni dolarrUCSKrXCzechoslovak Hard KorunarUCSDrXstari srpski dinarrUTRYrXNova Turska LirarjYXTakarUGRDrX Grčka drahmarUATSrXAustrijski šilingrUDDMrXEast German OstmarkrUHTGrXHaitian GourderjWX Jemenski rialrULRDrXLiberijski dolarrjsXNorveška krunarUMOPrX Macao PatacarjwXIndijska rupijarjyXMeksički pezorUCZKrX Češka krunarUTJSrXTadžikistanski somonirjXNepalska rupijarUYDDr Xjemenski dinarr UGWEr XPortuguese Guinea Escudor jXKolumbijski pezor UMURrXMauricijska rupijarjOXIndonezijska rupijarjXHoduraška lempirarjXFidžijski dolarrjX Etiopski birrUPENrXPeruanski novi solrUBZDrXbelizeanski dolarrUGWPrXGvinejskobisauski pezorUILPrXIsraelska funtarUZRNrXZairski novi zairrj XDominikanski pezorUTMMrXTurkmenistanski manatr UMDLr!X Moldovski lejr"UECVr#X'Ecuador Unidad de Valor Constante (UVC)r$UECSr%X Ecuador Sucrer&UBSDr'Xbahamski dolarr(j=XŠvedska krunar)UZMKr*XZambijska kvačar+jIXAustralski dolarr,UADPr-Xandorska pezetar.UCUPr/X Kubanski pezor0j7X Irska funtar1UCLFr2XChilean Unidades de Fomentor3jSXBarbadoski dolarr4UKRWr5Xjužnokorejski wonr6UGMDr7X Gambia Dalasir8joXKvecalr9j]XVenezuelski bolivarr:USITr;XSlovenski tolarr<USDPr=XSudanska funtar>jeXČileanski pezor?UEURr@XEurorAjgX Albanski lekrBjmXKazakhstan TengerCURUBrDX Ruska rubljarEUPLZrFXPoljska zlota (1950-1995)rGj{X Omanski rijalrHUBRLrIXBrazilski RealrJUMMKrKX Myanmar KyatrLUUYPrMXUrugvajski pezo (1975-1993)rNURURrOXRuska rublja (1991-1998)rPj;X Poljska zlotarQUPYGrRXParagvajski gvaranirSjqXKenijski šilingrTj[X Guyana DollarrUUDEMrVXNjemačka markarWUGNSrXX Guinea SylirYjXMakedonski denarrZUAZMr[XAzerbejdžanski manatr\j9XNovotajvanski dolarr]UUSNr^XAmerički dolar (sljedeći dan)r_UGQEr`X!Equatorial Guinea Ekwele GuineanaraUBADrbXbosansko-hercegovački dinarrcjXGvinejski franakrdUMXPreX"Meksički srebrni pezo (1861-1992)rfj X Irački dinarrgUERNrhXEritrean NakfarijXKonvertibilna markarjjXSejšelska rupijarkjXKanadski dolarrlUSDDrmXSudanski dinarrnj XZelenortski eskudoroUMADrpXMorokanski dirhamrqjXKuvajtski dinarrrjkX LilangenirsULTTrtXLithuanian TalonasruULTLrvXLithuanian Litarwj?XSingapurski dolarrxUMLFryX Mali FrancrzUESPr{XŠpanjolska pezetar|jQX Iranski rijalr}UZRZr~X Zairski zairrUCNYrXKineski Yuan RenminbirUTNDrX Tuniski dinarrjXCiparska funtarjXMalteška lirarjXNovozelandski dolarrUFKPrXFalklandska funtarULVLrX Latvian LatsrUUSSrXAmerički dolar (isti dan)rUUSDrXAmerički dolarrUARPrXArgentinski pezo (1983-1985)rjUX Kyrgystan SomrjiXArgentinski pezorUPEIrXPeruanski intirURONrXnovi rumunjski levrURSDrX srpski dinarrUBHDrXbahreinski dinarrUJPYrX Japanski jenrUPTErXPortugalski eskudorUXAUrXZlatoruUmonthsr}r(U stand-aloner}r(Uwider}r(KX siječanjrKXveljačarKXožujakrKXtravanjrKXsvibanjrKXlipanjrKXsrpanjrKXkolovozrK XrujanrK XlistopadrK XstudenirK XprosinacruUnarrowr}r(KXsrKXvrKXorKXtrKjKXlrKjKXkrK XrrK jK jK XpruuUformatr}r(Uwider}r(KX siječnjarKXveljačerKXožujkarKXtravnjarKXsvibnjarKXlipnjarKXsrpnjarKXkolovozarK XrujnarK X listopadarK X studenogarK XprosincaruU abbreviatedr}r(KXsijrKXvelrKXožurKXtrarKXsvirKXliprKXsrprKXkolrK XrujrK XlisrK XsturK XproruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrX ¤rX ¤rrUint_precrKKrh0X #,##0.00 ¤rUprefixrXrX-rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjKXurKjKXčrKjKjKXnrusUformatr}r(Uwider}r(KX ponedjeljakrKXutorakrKXsrijedarKX četvrtakrKXpetakrKXsubotarKXnedjeljaruU abbreviatedr}r(KXponrKXutor KXsrir KXčetr KXpetr KXsubr KXnedruuuU meta_zonesr}rUerasr}r(Uwider}r(KX Prije KristarKXPoslije KristaruU abbreviatedr}r(KXpr.n.e.rKXADruuu.PK[^N&22(site-packages/babel/localedata/af_NA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vq hX%(HH)s:%(mm)s:%(ss)s %(v)sq!ubUlongq"h)q#}q$(hX HH:mm:ss zq%hX%(HH)s:%(mm)s:%(ss)s %(z)sq&ubUshortq'h)q(}q)(hXHH:mmq*hX %(HH)s:%(mm)sq+ubuU languagesq,}q-U territoriesq.}q/Udecimal_formatsq0}q1U date_formatsq2}q3(Umediumq4h)q5}q6(hX d MMM yyyyq7hX%(d)s %(MMM)s %(yyyy)sq8ubUfullq9h)q:}q;(hXEEEE d MMMM yyyyqh)q?}q@(hX d MMMM yyyyqAhX%(d)s %(MMMM)s %(yyyy)sqBubUshortqCh)qD}qE(hX yyyy-MM-ddqFhX%(yyyy)s-%(MM)s-%(dd)sqGubuUcurrency_symbolsqH}qIU time_zonesqJ}qKUscriptsqL}qMUvariantsqN}qOUnumber_symbolsqP}qQUcurrency_namesqR}qSUmonthsqT}qUUcurrency_formatsqV}qWNcbabel.numbers NumberPattern qX)qY}qZ(Uexp_precq[NUscaleq\KU frac_precq]KKq^Usuffixq_Xq`h`qaUint_precqbKKqchX ¤ #,##0.00qdUprefixqeX¤ qfX-¤ qgqhUexp_plusqiNUgroupingqjKKqkubsUdaysql}qmU meta_zonesqn}qoUerasqp}qqu.PK[< k  &site-packages/babel/localedata/kcg.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUNGNqgXNeraqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KX Zwat JuwungqKX Zwat SwiyangqKX Zwat TsatqKX Zwat NyaiqKX Zwat TswonqKX Zwat AtaahqKX Zwat AnatatqKX Zwat ArinaiqK XZwat AkubunyungqK X Zwat SwagqK XZwat MangjuwangqK XZwat Swag-Ma-SuyangquU abbreviatedq}q(KXJuwqKXSwiqKXTsaqKXNyaqKXTswqKXAtaqKXAnaqKXAriqK XAkuqK XSwaqK XManqK XMasquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KXTaniiqKXTalataqKXLarbaqKXLamitqKXJumaqKXAsabatqKXLadiquU abbreviatedq}q(KXTanqKXTalqKXLarqKXLamqKXJumqKXAsaqKXLadquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXGabanin MiladiqKXMiladiquU abbreviatedq}q(KXGMqKXMquuu.PK["ll(site-packages/babel/localedata/so_SO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[WSM//%site-packages/babel/localedata/eo.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX 1a kvaronjaroq KX 2a kvaronjaroq KX 3a kvaronjaroqKX 4a kvaronjaroquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXatmqUpmqXptmquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,XH-'a' 'horo' 'kaj' m:ss vq3h.X#%(H)s-a horo kaj %(m)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX guĝarataqBUgdqCXgaelaqDUgaqEXirlandaqFUgnqGXgvaraniaqHUglqIXgalegaqJUlaqKXlatinoqLUlnqMXlingalaqNUloqOXlaŭaqPUttqQXtataraqRUtrqSXturkaqTUtsqUXcongaqVUlvqWXlatvaqXUtoqYXtongaaqZUltq[Xlitovaq\Utkq]Xturkmenaq^Uthq_Xtajaq`UtiqaXtigrajaqbUtgqcXtaĝikaqdUteqeXteluguaqfUpt_PTqgXportugalportugalaqhUfilqiXfilipinaqjUtaqkXtamilaqlUyiqmXjidaqnUpt_BRqoXbrazilportugalaqpUdeqqXgermanaqrUdaqsXdanaqtUdzquXdzonkoqvUstqwXsotaqxUquqyXkeĉuaqzUelq{Xgrekaq|Ueoq}X esperantoq~UenqXanglaqUzhqXĉinaqUzaqXĝuangaqUukqXukrainaqUeuqXeŭskaqUetqXestonaqUesqXhispanaqUruqXrusaqUrwqXruandaqUrmqXromanĉaqUrnqXburundaqUroqXrumanaqUbnqXbengalaqUbeqXbelorusaqUbgqXbulgaraqUbaqXbaŝkiraqUwoqXvolofaqUjvqXjavaqUboqXtibetaqUbhqXbiharaqUbiqXbislamoqUbrqXbretonaqUbsqXbosniaqUjaqXjapanaqUomqXoromaqUocqXokcitanaqUtwqXakanaqUtlhqXklingonaqUorqXorijoqUxhqXksosaqUcoqXkorsikaqUcaqXkatalunaqUcyqXkimraqUcsqXĉeĥaqUpsqXpaŝtuaqUptqX portugalaqUtlqXtagalogaqUpaqXpanĝabaqUviqXvjetnamaqUplqXpolaqUhyqXarmenaqUhrqXkroataqUiuqXinuitaqUhuqXhungaraqUhiqXhindaqUhaqXhaŭsaqUheqXhebreaqUmgqXmalagasaqUuzqXuzbekaqUmlqX malajalamaqUmnqXmongolaqUmiqXmaoriaqUikqXeskimaqUmkqXmakedonaqUurqXurduoqUmtqXmaltaqUmsqXmalajaqUmrqXmarataqUugqXujguraqUmyqXbirmaqUaaqXafaraqUabqXabĥazaqUssqXsvaziaqUafqX afrikansaqUtnqXcvanarUswrXsvahilarUisrXislandarUamrXamhararUitrXitalarUsvr Xsvedar Uiar X interlingvaor Uasr XasamarUarrXarabarUsurXsundarUzurXzuluarUayrXajmararUazrX azerbajĝanarUierX okcidentalorUidrX indoneziarUskrXslovakarUnlrX nederlandar Uyor!Xjorubar"Unnr#X novnorvegar$Unor%Xnorvegar&Unar'Xnaurar(Uner)Xnepalar*Uvor+Xvolapukor,Ufrr-Xfrancar.Usmr/Xsamoar0Ufyr1Xfrisar2Ufar3Xpersar4Ufir5Xfinnar6Ufjr7Xfiĝiar8Usar9X sanskritor:Ufor;Xferoar<Ukar=Xkartvelar>Ukkr?Xkazaĥar@UsrrAXserbarBUsqrCXalbanarDUkorEXkorearFUknrGXkanararHUkmrIXkmerarJUklrKX gronlandarLUksrMXkaŝmirarNUsirOXsinhalarPUshrQX serbo-KroatarRUsorSXsomalarTUsnrUXŝonarVUkurWXkurdarXUslrYXslovenarZUkyr[Xkirgizar\Usgr]Xsangoar^Usdr_Xsindar`uU territoriesra}rb(UBDrcX BangladeŝordUBEreXBelgujorfUBFrgXBurkinorhUBGriX BulgarujorjUBArkXBosnio-HercegovinorlUBBrmXBarbadornUWFroXValiso kaj FutunorpUBMrqXBermudojrrUBNrsXBrunejortUBOruXBoliviorvUBHrwXBarejnorxUBIryXBurundorzUBJr{XBeninor|UBTr}XButanor~UJMrXJamajkorUBWrXBocvanorUWSrXSamoorUBRrXBrazilorUBSrXBahamojrUBYrX BelorusujorUBZrXBelizorURUrXRusujorURWrXRuandorURErXReuniorUTMrX TurkmenujorUTJrX TaĝikujorUROrXRumanujorUGWrXGvineo-BisaŭorUGUrXGvamorUGTrX GvatemalorUGSrX#Sud-Georgio kaj Sud-SandviĉinsulojrUGRrXGrekujorUGQrXEkvatora GvineorUGPrX GvadeluporUJPrXJapanujorUGYrXGujanorUGFrX Franca GvianorUGErX KartvelujorUGDrXGrenadorUGBrXUnuiĝinta ReĝlandorUGArXGabonorUSVrX SalvadororUGNrXGvineorUGMrXGambiorUGLrX GronlandorUGIrX ĜibraltarorUGHrXGanaorUOMrXOmanorUTNrXTuniziorUJOrXJordaniorUHRrXKroatujorUHTrXHaitiorUHUrX HungarujorUHNrXHondurorUHMrXHerda kaj Makdonaldaj InsulojrUVErX VenezuelorUPRrX Puerto-RikorUPWrXBelaŭorUPTrX PortugalujorUSJrXSvalbardo kaj Jan-Majen-insulorUPYrX ParagvajorUIQrXIrakorUPArXPanamorUPFrXFranca PolineziorUPGrXPapuo-Nov-GvineorUPErXPeruorUPKrX PakistanorUPHrX FilipinojrUPNrXPitkarna InsulorUPLrXPollandorUPMrXSent-Piero kaj MikelonorUZMrXZambiorUEHrXOkcidenta SaharorUEErXEstonujorUEGrXEgiptorUZArX Sud-AfrikorUECrXEkvadororUITrXItalujorUVNrXVjetnamorUSBrX SalomonojrUETrXEtiopujorUSOrXSomalujorUZWrXZimbabvorUSAr XSaŭda Arabujor UESr X Hispanujor UERr XEritreorUMDrX MoldavujorUMGrX MadagaskarorUMArXMarokorUMCrXMonakorUUZrXUzbekujorUMMrXMjanmaorUMLrXMaliorUMNrX MongolujorUMHrX Marŝalojr UMKr!X Makedonujor"UMUr#X Maŭricior$UMTr%XMaltor&UMWr'XMalavior(UMVr)XMaldivojr*UMQr+X Martinikor,UMPr-X Nord-Marianojr.UMRr/X Maŭritanujor0UUGr1XUgandor2UMYr3XMalajzior4UMXr5XMeksikor6UILr7XIsraelor8UFRr9XFrancujor:UIOr;XBrita Hindoceana Teritorior<USHr=X Sent-Helenor>UFIr?X Finnlandor@UFJrAXFiĝojrBUFMrCX MikroneziorDUFOrEXFeroojrFUNIrGX NikaragvorHUNLrIX NederlandorJUNOrKX NorvegujorLUNArMXNamibiorNUVUrOXVanuatuorPUNCrQX Nov-KaledoniorRUNErSXNiĝerorTUNFrUX NorfolkinsulorVUNGrWXNiĝeriorXUNZrYX Nov-ZelandorZUNPr[XNepalor\UNRr]XNauror^UNUr_XNiuor`UCKraX KukinsulojrbUCIrcX Ebur-BordordUCHreXSvisujorfUCOrgXKolombiorhUCNriXĈinujorjUCMrkXKamerunorlUCLrmXĈiliornUCAroXKanadorpUCGrqXKongolorrUCFrsXCentr-Afrika RespublikortUCZruXĈeĥujorvUCYrwXKiprorxUCSryXSerbujorzUCRr{X Kostarikor|UCVr}X Kabo-Verdor~UCUrXKuborUSZrX SvazilandorUSYrXSiriorUKGrX KirgizistanorUKErXKenjorUSRrXSurinamorUKIrXKiribatorUKHrXKamboĝorUKNrXSent-Kristofo kaj NevisorUKMrXKomorojrUSTrXSao-Tomeo kaj PrincipeorUSKrX SlovakujorUKRrX Sud-KoreorUSIrX SlovenujorUKPrX Nord-KoreorUKWrXKuvajtorUSNrXSenegalorUSMrX San-MarinorUSLrX Siera-LeonorUSCrX SejŝelojrUKZrX KazaĥstanorUKYrXKejmanojrUSGrX SingapurorUSErXSvedujorUSDrXSudanorUDOrXDomingorUDMrXDominikorUDJrXĜibutiorUDKrXDanujorUVGrXBritaj VirgulininsulojrUDErX GermanujorUYErXJemenorUDZrXAlĝeriorUUSrXUsonorUUYrXUrugvajorUYTrXMajotorUUMrXUsonaj malgrandaj insulojrULBrXLibanorULCrX Sent-LuciorULArXLaosorUTVrXTuvalorUTWrXTajvanorUTTrXTrinidado kaj TobagorUTRrXTurkujorULKrX Sri-LankorULIrXLiĥtenŝtejnorULVrXLatvujorUTOrXTongorULTrXLitovujorULUrX LuksemburgorULRrXLiberiorULSrXLesotorUTHrXTajlandorUTGrXTogolorUTDrXĈadorULYrXLibiorUVArXVatikanorUVCrXSent-Vincento kaj la GrenadinojrUAErXUnuiĝintaj Arabaj EmirlandosrUADrXAndororUAGrXAntigvo-BarbudorUAFrXAfganujorUAIrXAngvilorUVIrXUsonaj VirgulininsulojrUISrXIslandorUIRrXIranorUAMrXArmenujorUALrXAlbanujorUAOrXAngolorUANr XNederlandaj Antilojr UAQr XAntarktor UARr X ArgentinorUAUrX AŭstraliorUATrX AŭstrujorUAWrXAruborUINrXHindujorUTZrXTanzaniorUAZrX AzerbajĝanorUIErXIrlandorUIDrX IndoneziorUUArXUkrajnor UQAr!XKataror"UMZr#X Mozambikor$uUdecimal_formatsr%}r&U date_formatsr'}r((Umediumr)h))r*}r+(h,X yyyy-MMM-ddr,h.X%(yyyy)s-%(MMM)s-%(dd)sr-ubUfullr.h))r/}r0(h,XEEEE, d-'a' 'de' MMMM yyyyr1h.X&%(EEEE)s, %(d)s-a de %(MMMM)s %(yyyy)sr2ubUlongr3h))r4}r5(h,X yyyy-MMMM-ddr6h.X%(yyyy)s-%(MMMM)s-%(dd)sr7ubUshortr8h))r9}r:(h,Xyy-MM-ddr;h.X%(yy)s-%(MM)s-%(dd)sr<ubuUcurrency_symbolsr=}r>U time_zonesr?}r@UscriptsrA}rBUvariantsrC}rDUnumber_symbolsrE}rF(UdecimalrGX,rHUgrouprIX rJuUcurrency_namesrK}rLUmonthsrM}rN(U stand-alonerO}rPUnarrowrQ}rR(KX1rSKX2rTKX3rUKX4rVKX5rWKX6rXKX7rYKX8rZK X9r[K X10r\K X11r]K X12r^usUformatr_}r`(Uwidera}rb(KXjanuarorcKXfebruarordKXmartoreKXaprilorfKXmajorgKXjuniorhKXjulioriKXaŭgustorjK X septembrorkK XoktobrorlK XnovembrormK XdecembrornuU abbreviatedro}rp(KXjanrqKXfebrrKXmarrsKXaprrtKXmajruKXjunrvKXjulrwKXaŭgrxK XsepryK XoktrzK Xnovr{K Xdecr|uuuUcurrency_formatsr}}r~Udaysr}r(U stand-aloner}rUnarrowr}r(KjTKjUKjVKjWKjXKjYKjSusUformatr}r(Uwider}r(KXlundorKXmardorKXmerkredorKXĵaŭdorKXvendredorKXsabatorKXdimanĉoruU abbreviatedr}r(KXlurKXmarKXmerKXĵarKXverKXsarKXdiruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXaKrKXpKrusu.PK[И%site-packages/babel/localedata/et.datnu[}q(U zone_formatsq}q(UregionqX%sqUgmtqXGMT%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q Uformatq }q (Uwideq}q(KX 1. kvartalqKX 2. kvartalqKX 3. kvartalqKX 4. kvartalquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq }q!Ncbabel.numbers NumberPattern q")q#}q$(Uexp_precq%KKq&Uscaleq'KU frac_precq(KKq)Usuffixq*Xq+h+q,Uint_precq-KKq.Upatternq/X#E0q0Uprefixq1h+X-q2q3Uexp_plusq4Ugroupingq5MMq6ubsUpercent_formatsq7}q8Nh")q9}q:(h%Nh'Kdh(KKq;h*X%qh/X#,##0%q?h1h+h2q@h4Nh5KKqAubsU week_dataqB}qC(Umin_daysqDKU weekend_startqEKU first_dayqFKU weekend_endqGKuU time_formatsqH}qI(UmediumqJcbabel.dates DateTimePattern qK)qL}qM(h/XH:mm:ssqNUformatqOX%(H)s:%(mm)s:%(ss)sqPubUfullqQhK)qR}qS(h/X H:mm:ss vqThOX%(H)s:%(mm)s:%(ss)s %(v)sqUubUlongqVhK)qW}qX(h/X H:mm:ss zqYhOX%(H)s:%(mm)s:%(ss)s %(z)sqZubUshortq[hK)q\}q](h/XH:mmq^hOX %(H)s:%(mm)sq_ubuU languagesq`}qa(UgvqbXmänksiqcUguqdX gudžaratiqeUscnqfX sitsiiliaqgUromqhX mustlaskeelqiUalgqjXalgonkini keeledqkUaleqlXaleuudiqmUscoqnXšotiqoUmniqpXmanipuriqqUgdqrXgaeliqsUgaqtXiiriquUmnoqvX manobo keeledqwUosaqxXoseidžiqyUgnqzXguaraniiq{Ualtq|Xaltaiq}Uglq~XgaleegiqUmwrqXmarvariqUtyqXtahitiqUtwqXtviiqUttqXtatariqUtrqXtürgiqUtsqXtsongaqUtnqXtsvanaqUtoqXtongaqUausqXAustraalia keeledqUavqXavaariqUtkqX türkmeeniqUthqXtaiqUroaqX muu romaaniqUtgqXtadžikiqUteqXteluguqUugaqXugaritiqUmwlqXmirandaqUfatqXfantiqUfanqXfangiqUwoqXvolofiqUrmqX retoromaaniqUdinqXdinkaqUblaqXsiksikaqUcmcqX tšami keeledqUmlqX malajalamiqUzhqXhiinaqUtemqXtemneqUnwcqX vananevariqUzaqXtšuangiqUcauqX muu KaukaasiaqUzuqXsuuluqUterqXterenoqUtetqXtetumiqUmncqXmandžuqUkutqXkutenaiqUsukqXsukumaqUkumqXkumõkiqUsusqXsusuqUnewqXnevariqUsuxqXsumeriqUdenqXsleiviqUmenqXmendeqUmulqX mitu keeltqUlezqXlesgiqUekaqX ekadžukiqUakkqXakadiqUdraqXmuu draviidi keelqUjrbqX juudiaraabiaqUsgnqX viipekeeledqUsgaqXvanaiiriqUapaqXapatši keeledqUbraqXbradžiqUchbqX tšibtšaqUchgqX tšagataiqUchkqXtšuugiqUchmqXmariqUchnqXtšinuki žargoonqUchoqXtšoktoqUchpqX tšipevaiqUchrqX tšerokiiqUchyqXšaieeniqUtiqXtigrinjaqUvotqXvadjaqUmgqX malagassiqUibarXibanirUmorXmoldovarUmnrXmongolirUmirXmaoorirUmhrX maršallir Umkr X makedooniar Umtr Xmaltar UcairXmuu Kesk-Ameerika indiaanirUdelrXdelavarirUmsrXmalairUmrrXmarathirUtarXtamilirUmyrXbirmarUcadrXkadorUsrnrXsrananirUtairX muu tai keelrUafhr Xafrihilir!Usitr"Xmuu Hiina-Tiibetir#Uenmr$X keskingliser%Ucsbr&Xkašuubir'Unynr(Xnkoler)Unyor*Xnjoror+Unymr,Xnjamvesir-Usior.X siuu keeledr/Umapr0Xaustroneesia keeledr1Umasr2Xmasair3Ulahr4Xlahndar5Uladr6Xladiinor7Ufyr8X läänefriisir9Usnkr:Xsoninker;Ufar<Xpärsiar=Umadr>Xmadurar?Umagr@XmagalirAUmairBXmaithilirCUfirDXsoomerEUfjrFXfidžirGUmanrHXmalinkerIUegyrJXmuinasegiptuserKUzndrLXzanderMUssrNXsvaasirOUsrrPXserbiarQUsqrRXalbaaniarSUswrTXsuahiilirUUsvrVXrootsirWUsurXXsundarYUstrZX lõunasothor[Uskr\Xslovakir]Usir^Xsingalir_Ushr`Xserbia-horvaadiraUsorbXsomaalircUsnrdXšonareUsmrfXsamoargUslrhXsloveeniriUscrjX sardiiniarkUsarlX sanskritirmUsgrnXsangoroUserpX põhjasaamirqUsdrrXsindhirsUzenrtXzenagaruUkbdrvXkabardi-tšerkessirwUafarxX muu afroaasiaryUlgrzXgandar{Ulbr|X letseburgir}Ufiur~X muu soomeugrirUlnrXlingalarUlorXlaorUlirXlimburgirUbynrXbilinirUltrXleedurUlurXlubarUfilrXfilipinorUyirXjidiširUnonrX vanapõhjalarUcebrXseburUyorXjorubarUnogrXnogairUbatrX muu baltirUdakrXsiuurUdarrXdargirUdayrXdajakirUssarXmuu Niiluse-SahararUkperXkpellerUelrXkreekarUeorX esperantorUenrXingliserUlamrXlambarUeerXeverUmdfrXmokšarUfrrX prantsuserUmdrrXmandarirUetrXeestirUesrX hispaaniarUrurXvenerUgonrXgondirUgohrXvanaülemsaksarUsmsrX koltasaamirUsmnrX Inari saamirUsmjrX Lule saamirUsmirX muu saamirUgotrXgootirUrnrXrundirUrorXrumeeniarUdsbrX alamsorbirUsmarX lõunasaamirUgorrX gorontalorUastrXastuuriarUwalrXvolamorUcrhrX krimmitatarirUathrXatapaski keeledrUgezrXetioopiarUxhrXkoosarUffrXfulberUmakrX makassarirUzaprX sapoteegirUkokrXkonkanirUzxxrXmittekeelelinerUkosrXkosraerUforXfäärirUtogrX tšitongarUhuprXhuparUudmrXudmurdirUbejrXbedžarUbemrXbembarUtsirXtšimši keeledrUberrXberberirUnzirXnzimarUsairXmuu Lõuna-Ameerika indiaanirUangrX vanaingliserUprarXpraakriti keeledrUbhorX bhodžpurirUsalrXsališi keeledrUprorX vanaprovansirUrajrX radžastanir Usadr Xsandaver Uanpr Xangikar UraprXrapanuirUsasrXsasakirUnqorXnkoorUcarrXkariibirUminrX minangkabaurUmicrXmikmakirUefirXibibiorUarnrX araukaanirUypkrX jupiki keeledrUmisr X üksikkeeledr!Ukacr"Xkatšinir#Ukabr$Xkabiilir%Ukaar&X karakalpakir'Ukamr(Xkambar)Ukarr*Xkarenir+Ukawr,Xkaavir-Utyvr.Xtõvar/Uawar0Xavadhir1Ukar2Xgruusiar3Udoir4Xdogrir5Ukgr6Xkongor7Ukkr8Xkasahhir9Ukjr:Xambor;Ukir<Xkikujur=Ukor>Xkorear?Uknr@XkannadarAUkmrBXkhmeerirCUklrDXgröönirEUksrFX kašmiirirGUkrrHXkanurirIUkwrJXkornirKUkvrLXkomirMUkurNXkurdirOUkyrPXkirgiisirQUtklrRXtokelaurSUbuarTXburjaadirUUmgarVXkeskiirirWUhitrXXhetirYUdyurZXdjular[Uder\Xsaksar]Udar^Xtaanir_Udzr`XbhutaniraUluirbXluisenjorcUdvrdXmaldiivireUhilrfX hiligainonirgUhimrhX himtšaliriUgemrjX muu germaanirkUcrprlXmuud kreool- ja pidžinkeeledrmUqurnXketšuaroUbasrpXbasarqUgbarrXgbajarsUbadrtXbandaruUbanrvXbalirwUbalrxXbelutširyUshnrzXšanir{Ubair|Xbamileke keeledr}Uarpr~XarapahorUartrX muu tehiskeelrUarwrXaravakirUarcrXaramearUen_USrXinglise keel (US)rUsemrXmuu semirUselrXsölkupirUnubrX Nuubia keeledrUbtkrXbatakirUlusrXlušeirUmusrXmaskogirUluarXluluarUirorXirokeesi keeledrUirarX muu IraanirUmunrX munda keelrUlunrXlundarUluorXluorUwarXvalloonirUtuprX tupii keeledrUjvrXjaavarUtutrX muu AltairUtumrXtumbukarUjarXjaapanirUcoprXkoptirUilorXilokorUlarXladinarUgwirX gvitšinirUundrX määramatarUtlirXtlingitirUtlhrXklingonirUchrX tšamorrorUcorXkorsikarUcarX katalaanirUcerX tšetšeenirUponrXpoonpeirUcyrXkõmrirUsahrXjakuudirUcsrXtšehhirUcrrXkriirUbntrXbanturUcvrX tšuvaširUcurX kirikuslaavirUlvrXlätirUdumrX keskhollandirUptrX portugalirUduarXdualarUfrorX vanaprantsuserUyaprXjapirUfrmrX keskprantsuserUtivrXtivirUfrsrX idafriisirUfrrrX põhjafriisirUyaorXjaorUparX pandžabirUxalrXkalmõkirUpirXpaalirUplrXpoolarUgayrXgajorUotorX otomi keeledrUotarX osmanitürgirUhmnrXhmongirUanrXaragonirUgaarXgaarUfurrXfriuulirUkhirX muu khoisanirUainrXainurUrarrX rarotongarUslarX muu slaavirUverXvendarUvirXvietnamir Uisr Xislandir Ukhor Xsakir UiurX inuktitutirUitrXitaaliarUvorX volapükirUiirX Sichuani jiirUikrX injupiakirUiorXidorUinerXmuu indoeurooparUiarX interlinguarUjprrX juudipärsiarUier X interlinguer!Uidr"X indoneesiar#Uigr$Xibor%Upapr&X papiamentor'Uewor(Xevondor)Upaur*Xbelaur+Upaar,X muu Paapuar-Upagr.X pangasinanir/Usatr0Xsantalir1Upalr2Xpahlavir3Upamr4Xpampangar5Uphir6X muu Filipiinir7Ucelr8X muu keldir9Uphnr:X foiniikiar;Unicr<Xmuu Nigeri-Kordofanir=Uniar>Xniasir?Udgrr@XdogribirAUsyrrBXsüüriarCUniurDXniuerEUgswrFXalemannirGUjborHXlojbanirIUnahrJXnahuarKUsamrLXSamaaria aramearMUhairNXhaidarOUgmhrPXkeskülemsaksarQUcusrRXmuu kuši keelrSUwenrTX sorbi keeledrUUadyrVXadõgeerWUelxrXXeelamirYUadarZXadangmer[Uhawr\Xhavair]Ubinr^Xedor_Ubikr`XbikoliraUpt_BRrbXportugali (Braziilia)rcUmosrdXmorereUmohrfXmohoogirgUtlrhXtagalogiriUzh_HansrjXhiina keel - lihtsustatudrkUzh_HantrlXhiina keel - traditsioonilinermUtvlrnXtuvaluroUijorpXidžorqUkmbrrXmbundursUpeortX vanapärsiaruUumbrvXumbundurwUtmhrxX tamašekiryUfonrzXfonir{Uhsbr|X ülemsorbir}Uber~X valgevenerUbgrX bulgaariarUbarX baškiirirUpsrXpušturUbmrXbambararUbnrXbengalirUborXtiibetirUbhrXbihaarirUbirXbislamarUbrrXbretoonirUbsrXbosniarUruprXaromuunirUomrXoromorUojrX odžibveirUacerXatšehirUachrXakolirUocrX oksitaanirUkrurXoraonirUsrrrXsererirUkrorXkruurUkrlrXkarjalarUkrcrXkaratšai-balkaarirUndsrX alamsaksarUosrXosseedirUorrXoriarUsogrXsogdirUnsorXpedirUsonrXsongairUvairXvairUwakrXvakaši keeledrUlolrXmongorUmkhrXmuu moni-khmeerirUlozrXlozirUgilrXkiribatirUwasrXvašorUwarrXvarairUhzrXhererorUhyrXarmeeniarUsidrXsidamorUhrrXhorvaadirUhtrXhaitirUhurXungarirUhirXhindirUhorXmoturUharXhausarUbugrXbugirUherXheebrearUuzrXusbekirUurrXurdurUukrXukrainarUugrXuiguurirUaarXafarirUabrXabhaasirUaerXavestarUafrX afrikaanirUakrXakanirUamrXamharirUmyvrXersarUeurXbaskirUasrXassamirUarrXaraabiarUinhrXinguširUtpirX uusmelaneesiarUmynrX maia keeledrUayrXaimararUkharXkhasirUazrXaserbaidžaanirUincrX muu IndiarUnlrXhollandirUnnrX norra nynorskr Unor Xnorrar Unar Xnaurur UnbrX norra bokmålrUnairXmuu Põhja-Ameerika indiaanirUndrX põhjandebelerUnerXnepalirUngrXndongarUnyrXnjandžarUnaprXnapolirUgrbrXgreborUgrcrX vanakreekarUnrr X lõunandebeler!Utigr"Xtigreer#Unvr$Xnavahor%Uzunr&Xsunjir'Urwr(Xruandar)Ucper*X/muud inglispõhjalised kreool- ja pidžinkeeledr+Ucpfr,X1muud prantsuspõhjalised kreool- ja pidžinkeeledr-Ucppr.X2muud portugalipõhjalised kreool- ja pidžinkeeledr/uU territoriesr0}r1(UBDr2X Bangladeshr3UBEr4XBelgiar5UBFr6X Burkina Fasor7UBGr8X Bulgaariar9UVEr:X Venezuelar;UBAr<XBosnia ja Hertsegoviinar=UBBr>XBarbadosr?UWFr@XWallis ja FutunarAUBMrBXBermudarCUBNrDXBruneirEUBOrFXBoliiviarGUBHrHXBahreinrIUBIrJXBurundirKUBJrLXBeninrMUBTrNXBhutanrOU011rPXLääne-AafrikarQUBVrRXBouvet’ saarrSUBWrTXBotswanarUU014rVX Ida-AafrikarWU015rXXPõhja-AafrikarYUBRrZX Brasiiliar[U017r\X Kesk-Aafrikar]U018r^XLõuna-Aafrikar_U019r`XAmeerika maailmajaguraUBYrbX ValgevenercUBZrdXBelizereULVrfXLätirgURWrhXRwandariURSrjXSerbiarkUTLrlX Ida-TimorrmURErnXRéunionroUTMrpX TürkmenistanrqUOMrrXOmaanrsUTJrtX TadžikistanruUROrvXRumeeniarwUTKrxXTokelauryUGWrzX Guinea-Bissaur{UGUr|XGuamr}UGTr~X GuatemalarUGSrX)Lõuna-Georgia ja Lõuna-Sandwichi saaredrUGRrXKreekarUGQrXEkvatoriaal-GuinearUGPrX GuadelouperUJPrXJaapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXPrantsuse GuajaanarUGErXGruusiarUGDrXGrenadarU021rXAmeerika põhjaosarUGBrX SuurbritanniarUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GröönimaarU029rX Kariibi merirUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTuneesiarUJMrXJamaicarU013rX Kesk-AmeerikarUWSrXSamoarU419rXLadina-Ameerika ja Kariibi merirUHRrX HorvaatiarUBSrXBahamarUHTrXHaitirUHUrXUngarirUHKrX"Hongkong - Hiina erihalduspiirkondrU039rXLõuna-EurooparUHNrXHondurasrUFIrXSoomerU142rXAasiarU030rX Ida-AasiarU034rX Lõuna-AasiarU035rX Kagu-AasiarUPRrX Puerto RicorUPSrXPalestiina alarUFKrXFalklandi saaredrUIOrXBriti India ookeani alarUPWrXBelaurUPTrXPortugalrUSJrXSvalbard ja Jan MayenrUMDrXMoldovarUFMrXMikroneesia LiiduriigidrUIQrXIraakrUPArXPanamarUPFrXPrantsuse PolüneesiarUPGrXPaapua Uus-GuinearUPErXPeruurUPKrXPakistanrUPHrX FilipiinidrUFOrXFääri saaredrUPNrXPitcairnrUPLrXPoolarUPMrXSaint-Pierre ja MiquelonrUZMrXSambiarUEHrXLääne-SahararURUrXVenemaarUEErXEestirUEGrXEgiptusrUZArXLõuna-Aafrika VabariikrUECrXEcuadorrUITrXItaaliarUVNrXVietnamrUZZrX määramatar USBr XSaalomoni Saaredr UETr XEtioopiar USOrXSomaaliarUZWrXZimbabwerUSArX Saudi AraabiarUESrX HispaaniarUERrXEritrearUMErX MontenegrorUAQrX AntarktisrUMGrX MadagaskarrUMArXMarokorUMCr XMonacor!UUZr"X Usbekistanr#UMMr$XMyanmarr%UMLr&XMalir'UMOr(XAomen - Hiina erihalduspiirkondr)UMNr*X Mongooliar+UHMr,XHeard ja McDonaldr-UASr.XAmeerika Samoar/UMKr0X Makedooniar1UMUr2X Mauritiusr3UMTr4XMaltar5UMWr6XMalawir7UMVr8X Maldiividr9UMQr:X Martiniquer;UMPr<XPõhja-Mariaanidr=UMSr>X Montserratr?UMRr@X MauritaaniarAUIMrBX Mani saarrCUUGrDXUgandarEUTZrFX TansaaniarGUMYrHXMalaisiarIUMXrJXMehhikorKUILrLXIisraelrMUFRrNX PrantsusmaarOUAWrPXArubarQUDOrRXDominikaani VabariikrSUSHrTX Saint HelenarUUVCrVXSaint Vincent ja GrenadiinidrWU054rXX MelaneesiarYUDJrZXDjiboutir[UFJr\XFidžir]U057r^X Mikroneesiar_U172r`XSõltumatute Riikide ÜhendusraU053rbXAustraalia ja Uus-MeremaarcUNIrdX NicaraguareUNLrfXHollandrgUNOrhXNorrariUNArjXNamiibiarkUVUrlXVanuaturmUNCrnXUus-KaledooniaroUNErpXNigerrqUNFrrXNorfolkrsUNGrtXNigeeriaruUNZrvX Uus-MeremaarwUNPrxXNepalryUNRrzXNaurur{UNUr|XNiuer}U061r~X PolüneesiarUCIrXCôte d'IvoirerUCHrXŠveitsrUCOrXColombiarUCNrXHiinarUCMrXKamerunrUCLrXTšiilirUCCrX KookossaaredrUCArXKanadarUCGrXKongo VabariikrUCFrXKesk-Aafrika VabariikrUCDrXKongo DVrUCZrXTšehhirUCYrXKüprosrUCXrX JõulusaarrUCSrXSerbia ja MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrXRoheneemesaaredrUCUrXKuubarUSZrX SvaasimaarUSYrXSüüriarUKGrX KõrgõzstanrUKErXKenyarUSRrXSurinamerU143rX Kesk-AasiarUKHrX KambodžarUKNrXSaint Kitts ja NevisrUKMrXKomooridrUSTrXSão Tomé ja PrínciperUSKrX SlovakkiarUKRrX Lõuna-KorearUSIrX SloveeniarUKPrX Põhja-KorearUKWrXKuveitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeišellidrUKZrX KasahstanrUKYrX KaimanisaaredrUSGrXSingapurrUSErXRootsirUSDrXSudaanrU151rX Ida-EurooparU150rXEurooparUDMrXDominicarU155rXLääne-EurooparU154rXPõhja-EurooparUVGrXBriti NeitsisaaredrUDErXSaksamaarUYErXJeemenrUMHrXMarshalli SaaredrU062rXKesk-Aasia lõunaosarUDZrX AlžeeriarUUSrXAmeerika ÜhendriigidrUUYrXUruguayrUYTrXMayotterUUMrXÜhendriikide hajasaaredrULBrXLiibanonrULCrX Saint LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTrXTrinidad ja TobagorUTRrXTürgirULKrX Sri LankarULIrX LiechtensteinrUCKrX Cooki saaredrUTOrXTongar ULTr XLeedur ULUr X Luksemburgr ULRrXLibeeriarULSrXLesothorUTHrXTairUTFrXPrantsuse LõunaaladrUTGrXTogorUTDrXTšaadrUTCrXTurks ja CaicosrULYrXLiibüarUVArXVatikanrU145r X Lääne-Aasiar!UAEr"XAraabia Ühendemiraadidr#UADr$XAndorrar%UAGr&XAntigua ja Barbudar'UAFr(X Afganistanr)UAIr*XAnguillar+UVIr,XUSA Neitsisaaredr-UISr.XIslandr/UIRr0XIraanr1UAMr2XArmeeniar3UALr4XAlbaaniar5UAOr6XAngolar7UANr8XHollandi Antillidr9U003r:XPõhja-Ameerikar;U002r<XAafrikar=U001r>Xmaailmr?UARr@X ArgentinarAUAUrBX AustraaliarCUATrDXAustriarEU005rFXLõuna-AmeerikarGUINrHXIndiarIUAXrJX AhvenamaarKU009rLXOkeaaniarMUAZrNX AserbaidžaanrOUIErPXIirimaarQUIDrRX IndoneesiarSUJOrTX JordaaniarUUQUrVX Euroopa LiitrWUUArXXUkrainarYUQArZXKatarr[UDKr\XTaanir]UMZr^X Mosambiikr_UQOr`XOkeaania hajasaaredrauUdecimal_formatsrb}rcNh")rd}re(h%Nh'Kh(KKrfh*h+h+rgh-KKrhh/X #,##0.###rih1h+h2rjh4Nh5KKrkubsU date_formatsrl}rm(UmediumrnhK)ro}rp(h/X dd.MM.yyyyrqhOX%(dd)s.%(MM)s.%(yyyy)srrubUfullrshK)rt}ru(h/XEEEE, d, MMMM yyyyrvhOX"%(EEEE)s, %(d)s, %(MMMM)s %(yyyy)srwubUlongrxhK)ry}rz(h/X d MMMM yyyyr{hOX%(d)s %(MMMM)s %(yyyy)sr|ubUshortr}hK)r~}r(h/Xdd.MM.yyrhOX%(dd)s.%(MM)s.%(yy)srubuUcurrency_symbolsr}r(UUSDrX$rUEEKrXkrrUXXXrXXXXrUJPYrX¥rUGBPrX£rUEURrX€ruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanaari saaredrsU Europe/Zurichr}rjXZürichrsU Europe/Lisbonr}rjXLissabonrsUPacific/Easterr}rjXLihavõttesaarrsU Europe/Romer}rjXRoomarsUAtlantic/South_Georgiar}rjXLõuna GruusiarsUAtlantic/Faeroer}rjXFäärirsU Europe/Warsawr}rjXVarssavirsU Asia/Qatarr}rjXKatarrsUEurope/Copenhagenr}rjX KopenhaagenrsUAmerica/St_Luciar}rjX St. LuciarsUAsia/Singaporer}rjXSingapurrsUAtlantic/Bermudar}rjXBermuudarsUEurope/Bucharestr}rjXBukarestrsUEurope/Luxembourgr}rjX LuksemburgrsUIndian/Reunionr}rjX KokkutulekrsUAmerica/St_Thomasr}rjX St. ThomasrsUEurope/Helsinkir}rjXHelsingirsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAtlantic/Cape_Verder}rjX RoheneemersU Africa/Cairor}rjXKairorsUAmerica/El_Salvadorr}rjXSalvadorrsU Indian/Cocosr}rjX KookossaaredrsU Europe/Madridr}rjXMadriidrsU Europe/Berlinr}rjXBerliinrsU Europe/Kievr}rjXKiievrsUAmerica/Anchorager}rjX Alaska aegrsUIndian/Christmasr}rjXJõuludrsU Europe/Viennar}rjXViinrsU Europe/Parisr}rjXPariisrsU Pacific/Fijir}rjXFidžirsUAmerica/Havanar}rjXHavannarsUEurope/Brusselsr}rjXBrüsselrsU Europe/Athensr}rjXAteenarsUAmerica/St_Vincentr}rjX St. VincentrsUAmerica/Port_of_Spainr}rjXHispaania SadamrsU Etc/Unknownr}rjX määramatarsUAmerica/St_Kittsr}rjX St. KittsrsUIndian/Maldivesr}rjX MaldiividrsUAfrica/Algiersr}r jXAlžiirr sUAntarctica/South_Poler }r jX Lõunapoolusr sU Europe/Rigar}rjXRiiarsuUscriptsr}r(UGururXgurmukhirUHebrrXheebrearUZzzzrX määramatarUPhnxrX foiniikiarUChamrXtšamirUGujrrX gudžaratirUZxxxrX kirjakeeletar USinhr!Xsingalir"UTalur#Xlihtsustatud tai luer$UMongr%Xmongolir&UXpeor'X vanapärsiar(UVispr)X häälduskirir*UTaler+Xtai ler,UMandr-Xmandear.UMlymr/X malajalamir0UTibtr1Xtiibetir2UKalir3Xkaja lir4UJpanr5Xjaapanir6UPlrdr7X Pollardi miaor8USylor9X silotinagrir:ULepcr;Xleptšar<UYiiir=Xjiir>UJavar?Xjaavar@UOryarAXoriarBULaoorCXlaorDUUgarrEXugaritirFUCyrlrGX kirillitsarHUVaiirIXvairJUArmnrKXarmeeniarLUCyrsrMXkirikuslaavi kirillitsarNUKhmrrOXkhmeerirPUItalrQX vanaitalirRUXsuxrSXsumeri kiilkirirTUThaarUXthaanarVUThairWXtairXUCprtrYXmuinasküproserZULinbr[X lineaar-Br\ULinar]X lineaar-Ar^UOsmar_Xosmanjar`UHiraraXhiraganarbUHanircX hiina hanrdUEgydreXegiptuse demootilinerfUQaairgXpäritudrhUEgyhriXegiptuse hieraatilinerjUCansrkX+Kanada põlisrahvaste ühtlustatud silpkirirlUEgyprmXegiptuse hieroglüüfkirirnUTfngroXtifinagirpUShawrqXShaw tähestikrrUCirtrsXcirthrtUGeorruXgruusiarvUTengrwXtengwarrxUHrktryXkatakana või hiraganarzUGeokr{Xgruusia hutsurir|UOgamr}Xogamr~UDsrtrXdeseretrUGothrXgootirUHanorXhanunoorUBalirXbalirUHangrXhangulirUTagbrXtagbanwarUHansrXhiina lihtsustatudrUHantrXhiina traditsioonilinerURororX rongorongorUDevarX devanaagarirUIndsrXinduserUBoporXbopomoforUMymrrXbirmarUTglgrXtagalogirUPermrX vanapermirUBugirXbugirUPhagrXphags-parUBrairX punktkirirUBrahrXbrahmirUBatkrXbatakirUKanarXkatakanarUMerorXmeroerULimbrXlimburUTelurXtelugurUTamlrXtamilirUSararXsaratirULatgrXladina keldi kirirULatfrXladina fraktuurkirirUKharrX kharoshthirUNkoorXnkoorULatnrXladinarUMayarXmaaja hieroglüüfkirirUEthirXetioopiarUArabrXaraabiarUBuhdrXbuhidirUCoptrXkoptirUGlagrX glagoolitsarURunrrX ruunikirirUOrkhrXorhonirUHungrX vanaungarirUGrekrXkreekarUCherrX tšerokiirUZyyyrXüldinerUSyrcrX assüüriarUBlisrXBlissi sümbolidrUBengrXbengalirUSyrerXassüüria estrangelorUSyrjrXlääneassüüriarUSyrnrX idaassüüriarUKndarXkannadaruUvariantsr}r(UNEDISrXNatisone murrerU1996rXsaksa reformitud kirjaviisrUREVISEDrX uus kirjaviisrUSAAHOrX saho murrerUROZAJrX Resia murrerUPOLYTONrXpolütoonilinerU1901rX saksa traditsiooniline kirjaviisruUnumber_symbolsr}r(UdecimalrX,rUgrouprX ruUcurrency_namesr}r(UDZDrXAlžeeria dinaarrUQARrX Quatari riaalrUBOPrXBoliivia peesorUEGPrX Egiptuse naelrUBGLrXBulgaaria püsiv leevrUBGNrXBulgaaria leevrUPABrX Panama balboarUYUMr XJugoslaavia uus dinaarr UZWDr XZimbabwe dollarr UGHCr X Ghana sedirUBOBrX boliviaanorUXBArXEURCOrUDKKrX Taani kroonrUBWPrX Botswana pularULBPrXLiibanoni naelrUTZSrXTansaania šillingrUVNDrX Vietnami dongrUAOArX Angola kvanzarUWSTrXLääne-Samoa talar UAONr!XAngola kvanza, 1990-2000r"UKHRr#XKambodža riaalr$UMYRr%XMalaisia ringgitr&UAOKr'XAngola kvanza, 1977-1990r(USOSr)XSomaalia šillingr*UUAHr+XUkraina grivnar,UUAKr-XUkraina karbovanetsr.UAORr/X#Angola reformitud kvanza, 1995-1999r0UAWGr1X Aruba guilderr2USARr3XSaudi-Araabia riaalr4UFIMr5X Soome markr6UHKDr7XHongkongi dollarr8USRGr9XSurinami kuldenr:UTPEr;XTimori eskuudor<UCHFr=XŠveitsi frankr>UGIPr?XGibraltari naelr@UBYRrAXValgevene rublarBUALLrCX Albaania lekkrDUXPDrEX pallaadiumrFUMROrGXMauretaania ugiarHUHRKrIXHorvaatia kunarJUPESrKX Peruu sollrLUBYBrMXValgevene uus rubla, 1994-1999rNUTHBrOXTai baatrPUXAFrQXCFA frank BEACrRUBNDrSX Brunei dollarrTUISKrUX Islandi kroonrVUUYUrWX Uruguai peesorXUNIOrYXNicaragua kuldkordobarZULAKr[X Laose kiipr\UNICr]XNicaragua kordobar^USYPr_X Süüria naelr`UMADraX Maroko dirhemrbUFRFrcXPrantsuse frankrdUMZNreXMosambiigi metikalrfUPHPrgXFilipiinide peesorhUZARriX LAVi randrjUGWPrkXGuinea-Bissau peesorljXSuurbritannia naelsterlingrmULUFrnXLuksemburgi frankroUBELrpXBelgia arveldusfrankrqUBECrrXBelgia konverteeritav frankrsUNGNrtXNigeeria nairaruUYUNrvX!Jugoslaavia konverteeritav dinaarrwUBEFrxX Belgia frankryUDEMrzX Saksa markr{jXkroonr|UMWKr}XMalawi kvatšar~USKKrXSlovakkia kroonrUTRLrX Türgi liirrUPKRrXPakistani ruupiarUHUFrX Ungari forintrUROLrXRumeenia lei, -2005rUBMDrXBermuda dollarrUXEUrXeküürUPTErXPortugali eskuudorUMNTrXMongoolia tugrikrUAMDrXArmeenia drammrUBUKrX Birma kjattrUUGXrXUganda šillingrUSURrX NSVL rublarUNLGrXHollandi kuldenrUJMDrXJamaica dollarrUGELrX Gruusia larirUSHPrXSaint Helena naelrUAFNrXAfganistani afgaanirUSBDrXSaalomoni saarte dollarrUKPWrXPõhja-Korea vonnrUCSDrXSerbia vana dinaarrUAFArXAfganistani afgaani, 1927-2002rUTRYrXTürgi uus liirrUBDTrXBangladeshi takarUGRDrX Kreeka drahmrUHTGrX Haiti gurdrUANGrXHollandi Antillide kuldenrUXFOrXPrantsuse kuldfrankrURWFrX Ruanda frankrUNOKrX Norra kroonrUKESrXKeenia šillingrUMOPrX Macao patakarUINRrX India ruupiarUMXNrX Mehhiko peesorUCZKrX Tšehhi kroonrUTJSrXTadžikistani somonirUNPRrX Nepali ruupiarUYDDrXJeemeni dinaarrUCOPrXKolumbia peesorUMURrXMauritiuse ruupiarUIDRrXIndoneesia ruupiarUHNLrXHondurase lempiirarUFJDrX Fidži dollarrUETBrX Etioopia birrrUPENrXPeruu uus sollrUATSrXAustria šillingrUILPrX Iisraeli naelrUTMMrXTürkmenistani manatrUTWDrXTaiwani dollarrUMDLrX Moldova leurUXPTrXplaatinarUECSrXEcuadori sukrerUSEKrX Rootsi kroonrUPEIrX Peruu intirUZMKrXSambia kvatšarUMVRrXMaldiivide ruupiarUXTSrXvääringute testkoodrUAUDrXAustraalia dollarrUADPrXAndorra peseetarUIEPrX Iiri naelrUBBDrXBarbadose dollarrUKRWrXLõuna-Korea vonnrUGMDrX Gambia dalasirUGTQrXGuatemala ketsalrUVEBrXVenezuela boliivarr USITr XSloveenia tolarr USDPr X Sudaani naelr UCLPr X Tšiili peesor jXeuror UITLr X Itaalia liirr UXCDr XIda-Kariibi dollarr UKZTr XKasahstani tenger URUBr X Venemaa rublar UXAGr Xhõber UPLZr XPoola zlott, 1950-1995r UOMRr X Omaani riaalr UBRLr XBrasiilia reaalr UMMKr XMyanmari kjattr URURr XVenemaa rubla, 1991-1998r UPLNr X Poola zlottr UPYGr XParaguai guaraniir UBRCr XBrasiilia krusador! USVCr" XSalvadori koloonr# UAEDr$ XAraabia Ühendemiraatide dirhemr% UGNSr& X Guinea sylir' jX USA dollarr( UAZMr) XAserbaidžaani manat, 1993-2006r* UAZNr+ XAserbaidžaani manatr, UUSNr- XUSA järgmise päeva dollarr. UTOPr/ X Tonga pa'angar0 UVUVr1 X Vanuatu vatur2 UBADr3 XBosnia-Hertsegoviina dinaarr4 UUSSr5 XUSA sama päeva dollarr6 UMXPr7 XMehhiko peeso, 1861-1990r8 UIQDr9 X Iraagi dinaarr: UBAMr; XBosnia-Hertsegoviina markr< USCRr= XSeišelli saarte ruupiar> UCADr? X Kanada dollarr@ UCYPrA X Küprose naelrB UKWDrC XKuveidi dinaarrD UBIFrE X Burundi frankrF jX määramatarG UPGKrH XPaapua Uus-Guinea kinarI ULTLrJ X Leedu littrK USGDrL XSingapuri dollarrM UUZSrN XUsbekistani sommrO USTDrP XSão Tomé ja Príncipe dobrarQ UESPrR XHispaania peseetarS UIRRrT X Iraani riaalrU UZRZrV X Sairi zairerW UCNYrX X Hiina jüaanrY USLLrZ XSierra Leone leooner[ UTNDr\ XTuneesia dinaarr] UGYDr^ X Guyana dollarr_ UMTLr` X Malta liirra UNZDrb XUus-Meremaa dollarrc UFKPrd XFalklandi saarte naelre ULVLrf X Läti lattrg UARPrh XArgentina peeso, 1983-1985ri UKGSrj XKõrgõzstani sommrk UARSrl XArgentina peesorm UILSrn XIisraeli uus seekelro URONrp X Rumeenia leirq URSDrr X Serbia dinaarrs UBHDrt XBahreini dinaarru jX Jaapani jeenrv UARArw XArgentina australrx UXAUry Xkuldrz uUmonthsr{ }r| (U stand-aloner} }r~ Unarrowr }r (KX1r KX2r KX3r KX4r KX5r KX6r KX7r KX8r K X9r K X10r K X11r K X12r usUformatr }r (Uwider }r (KXjaanuarr KXveebruarr KXmärtsr KXaprillr KXmair KXjuunir KXjuulir KXaugustr K X septemberr K Xoktooberr K Xnovemberr K X detsemberr uU abbreviatedr }r (KXjaanr KXveebrr KXmärtsr KXaprr KXmair KXjuunir KXjuulir KXaugr K Xseptr K Xoktr K Xnovr K Xdetsr uuuUcurrency_formatsr }r Nh")r }r (h%Nh'Kh(KKr h*X ¤r j r h-KKr h/X #,##0.00 ¤r h1h+h2r h4Nh5KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (Kj Kj Kj Kj Kj Kj Kj usUformatr }r (Uwider }r (KX esmaspäevr KX teisipäevr KX kolmapäevr KX neljapäevr KXreeder KXlaupäevr KX pühapäevr uU abbreviatedr }r (KXEr KXTr KXKr KXNr KXRr KXLr KXPr uuuU meta_zonesr }r Uerasr }r (Uwider }r (KXenne meie aegar KXmeie aja järgir uU abbreviatedr }r (KXe.m.a.r KXm.a.j.r uuu.PK[)_;;(site-packages/babel/localedata/es_CR.datnu[}q(Ucurrency_symbolsq}qUCRCqX₡qsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q U week_dataq }q U zone_formatsq }qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}q u.PK[jg''%site-packages/babel/localedata/st.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q](Uguq^X Se-gujaratiq_Ugdq`XSe-scots gaelicqaUgaqbXSe-irishqcUgnqdXGuaraniqeUglqfX Se-galiciaqgUlaqhX Se-latinoqiUtwqjXTwiqkUtrqlXSe-thekiqmUltqnX Se-LithuanoqoUtkqpXTurkmenqqUthqrXSe-thaiqsUtiqtX Se-tigrinyaquUteqvX Se-teleguqwUpt_PTqxXSe-portugal (Portugal)qyUfilqzX Se-tagalogq{Utaq|XSe-tamilq}Uyiq~XYiddishqUpt_BRqXSeputukesi (sa Brazil)qUdeqX Se-jeremaneqUdaqXSe-dutchqUelqXSe-greekqUeoqX Se-esperantoqUenqX SenyesemaneqUeuqX Se-basqueqUetqX Se-estoniaqUesqXSespainqUruqX Se-rushiaqUroqX Se-romaniaqUbnqX Se-bengaliqUbeqX Se-belarusiaqUbgqX Se-bulgariaqUukqX Se-ukraniaqUjvqX Se-javaneqUbhqX Se-bihariqUbrqXBretonqUbsqX Se-bosniaqUjaqX Se-japaneqUocqX Se-occitanqUtlhqX Se-klingonqUorqXOriyaqUxhqXse XhosaqUcaqX Se-cataliaqUcyqXSe-welshqUcsqXSe-czechqUpsqXPashtoqUptqX Se-portugalqUpaqX Se-punjabiqUviqX Se-vietnamqUplqX Se-polishqUhrqX Se-croatiaqUhuqX Se-hungariaqUhiqXSe-hindiqUheqX Se-hebrewqUuzqXSe-uzbekqUmlqX Se-malayalamqUmkqX Se-masedoniaqUurqXSe-urduqUmtqX Se-malteseqUmsqXSe-malayqUmrqX Se-marathiqUafqXSeburuqUkoqXSe-koreaqUisqX Se-icelandqUamqX Se-amhariqUitqX Se-tarianaqUknqX Se-kannadaqUarqXSe-arabqUzuqXse ZuluqUiaqXSe-interlinguaqUazqXSe-azerbaijaniqUidqX Se-indonesiaqUnlqXDutchqUnnqXSe-norway (Nynorsk)qUnoqX Se-norwayqUneqX Se-nepaliqUfrqX Se-frenchqUfyqX Se-frisiaqUfaqX Se-persiaqUfiqX Se-finnishqUfoqX Se-foroeseqUkaqX Se-geogiaqUsrrX Se-serbianrUsqrX Se-albanianrUswrX Se-swahilirUsvrX Se-swedenrUsurX Se-sundaneser Ustr XSesothor Uskr X Se-slovakr UsirX Se-sinhalirUshrXSerbo-CroatianrUkurXKurdishrUslrX Se-slovaniarUkyrXKyrgyzruU territoriesr}rUdecimal_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKr h+X #,##0.###r!h-h'h.r"h0Nh1KKr#ubsU date_formatsr$}r%(Umediumr&hG)r'}r((h+X yyyy MMM dr)hKX%(yyyy)s %(MMM)s %(d)sr*ubUfullr+hG)r,}r-(h+XEEEE, yyyy MMMM ddr.hKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sr/ubUlongr0hG)r1}r2(h+X yyyy MMMM dr3hKX%(yyyy)s %(MMMM)s %(d)sr4ubUshortr5hG)r6}r7(h+Xyy/MM/ddr8hKX%(yy)s/%(MM)s/%(dd)sr9ubuUcurrency_symbolsr:}r;U time_zonesr<}r=Uscriptsr>}r?Uvariantsr@}rAUnumber_symbolsrB}rC(UdecimalrDX,rEUgrouprFX rGuUcurrency_namesrH}rIUmonthsrJ}rK(U stand-alonerL}rMUnarrowrN}rO(KX1rPKX2rQKX3rRKX4rSKX5rTKX6rUKX7rVKX8rWK X9rXK X10rYK X11rZK X12r[usUformatr\}r](Uwider^}r_(KX Phesekgongr`KXHlakolaraKX HlakubelerbKXMmesercKX MotsheanongrdKXPhupjanereKXPhupurfKXPhatargK XLeotsherhK XMphalaneriK X PundungwanerjK XTshitwerkuU abbreviatedrl}rm(KXPhernKXKolroKXUberpKXMmerqKXMotrrKXJanrsKXUpurtKXPharuK XLeorvK XMphrwK XPunrxK XTshryuuuUcurrency_formatsrz}r{Nh)r|}r}(h!Nh#Kh$KKr~h&h'h'rh)KKrh+X ¤#,##0.00rh-X¤rX-¤rrh0Nh1KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjQKjRKjSKjTKjUKjVKjPusUformatr}r(Uwider}r(KXMmantaharKXLabobedirKXLaborarurKXLabonerKX LabohlanerKXMoqebelorKXSontaharuU abbreviatedr}r(KXMmarKXBedrKXRarrKXNerKXHlarKXMoqrKXSonruuuU meta_zonesr}rUerasr}r(Uwider}r(KXBCrKXADruU abbreviatedr}r(KXBCrKXADruuu.PK[Rll(site-packages/babel/localedata/ak_GH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Aձ(site-packages/babel/localedata/es_CO.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXH:mm:ssqUformatqX%(H)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vqhX%(HH)s:%(mm)s:%(ss)s %(v)squbUlongqh)q}q (hX H:mm:ss zq!hX%(H)s:%(mm)s:%(ss)s %(z)sq"ubUshortq#h)q$}q%(hXH:mmq&hX %(H)s:%(mm)sq'ubuU languagesq(}q)U territoriesq*}q+Udecimal_formatsq,}q-U date_formatsq.}q/(Umediumq0h)q1}q2(hX d/MM/yyyyq3hX%(d)s/%(MM)s/%(yyyy)sq4ubUshortq5h)q6}q7(hXd/MM/yyq8hX%(d)s/%(MM)s/%(yy)sq9ubuUcurrency_symbolsq:}q;UCOPq}q?Uscriptsq@}qAUvariantsqB}qCUnumber_symbolsqD}qEUcurrency_namesqF}qGh(Umin_daysq?KU weekend_startq@KU first_dayqAKU weekend_endqBKuU time_formatsqC}qD(UmediumqEcbabel.dates DateTimePattern qF)qG}qH(h4XHH:mm:ssqIUformatqJX%(HH)s:%(mm)s:%(ss)sqKubUfullqLhF)qM}qN(h4X HH:mm:ss vqOhJX%(HH)s:%(mm)s:%(ss)s %(v)sqPubUlongqQhF)qR}qS(h4X HH:mm:ss zqThJX%(HH)s:%(mm)s:%(ss)s %(z)sqUubUshortqVhF)qW}qX(h4XHH:mmqYhJX %(HH)s:%(mm)sqZubuU languagesq[}q\(Uguq]Xგუჯარათიq^Uscnq_Xსიცილიურიq`UaleqaXალეუტურიqbUgdqcX1შოტლანდიურ-გალურიqdUgaqeXირლანდიურიqfUgnqgXგუარანიqhUglqiXგალურიqjUlbqkX'ლუქსემბურგულიqlUlaqmXლათინურიqnUlnqoXლინგალაqpUloqqXლაოსურიqrUtrqsXთურქულიqtUadyquXადიღეურიqvUlvqwXლატვიურიqxUltqyXლიტვურიqzUcauq{X+კავკასიური სხვაq|Uthq}Xტაილანდურიq~UtgqXტაჯიკურიqUudmqXუდმურტიულიqUpt_PTqX:იბერიულ-პორტუგალიურიqUfilqXფილიპინურიqUyiqXიდიშიqUpt_BRqXCბრაზილიური პორტუგალიურიqUcelqX"კელტური სხვაqUdaqXდანიურიqUelqXბერძნულიqUeoqXესპერანტოqUenqXინგლისურიqUartqX(ხელოვნური სხვაqUbeqXბელორუსულიqUzh_HansqX:გამარტივებული ჩინურიqUzh_HantqX1ტრადიციული ჩინურიqUsgaqX.ძველი ირლანდიურიqUarcqXარამეულიqUen_USqX8ამერიკული ინგლისურიqUeuqXბასკურიqUetqXესტონურიqUesqXესპანურიqUruqXრუსულიqUgohqX+ძველი გერმანულიqUpeoqX(ძველი სპარსულიqUde_ATqX7ავსტრიული გერმანულიqUroqXრუმინულიqUsuxqXშუმერულიqUen_CAqX4კანადური ინგლისურიqUbgqXბულგარულიqUukqXუკრაინულიqUastqXავსტრიულიqUjvqXიავანურიqUboqXტიბეტურიqUbhqXბიჰარიqUbrqXბრეტონულიqUbsqXბოსნიურიqUjaqXიაპონურიqUocqXოციტანურიqUundqX<უცნობი ან არასწორი ენაqUtwqX თუიqUtlhqXკლინგონიqUosqXოსურიqUorqXორიულიqUxhqXქსოზაqUcaqXკატალანურიqUceqXჩეჩნურიqUcyqXუელსურიqUangqX+ძველი ინგლისურიqUcsqXჩეხურიqUpraqX+პრაკრიტის ენებიqUcuqX1საეკლესიო სლავურიqUde_CHqXPშვეიცარიული მაღალი გერმანულიqUpsqXპუშტუqUptqX$პორტუგალიურიqUfroqX(ძველი ფრანგულიqUviqXვიეტნამურიqUes_ESqX1იბერიული ესპანურიqUen_GBqX7ბრიტანული ინგლისურიqUtkqXთურქმენულიqUzhqXჩინურიqUhyqXსომხურიqUhrqXხორვატიულიqUegyqXეგვიპტურიqUhuqXუნგრულიqUhiqXჰინდიrUbuarXბურიატულიrUherXებრაულიrUuzrXუზბეკურიrUmorXმოლდოვურიrUmnr Xმონღოლურიr Umkr X!მაკედონიურიr Uurr X ურდუrUainrX აინუrUplrXპოლონურიrUmsrXმალაიზიურიrUugrXუიგურულიrUslarX"სლავური სხვაrUabrXაფხაზურიrUaerXავესტაrUafrXაფრიკულიrUtnrXტსვანაr Uswr!Xსუაჰილიr"Uisr#Xისლანდიურიr$Uitr%Xიტალიურიr&Unl_BEr'X!ფლომანდიურიr(Uasr)Xასამურიr*Uarr+Xარაბულიr,Ues_419r-XJლათინურ ამერიკული ესპანურიr.Umynr/Xმაიას ენებიr0Uiar1X-ინტერლინგუალურიr2Uiner3X2ინდო-ევროპული სხვაr4Uazr5X'აზერბაიჯანულიr6Uier7Xინტერლინგიr8Uidr9X!ინდონეზიურიr:Unlr;Xჰოლანდიურიr<Unnr=X7ნორვეგიული ნინორსკიr>Unor?Xნორვეგიულიr@UnerAXნეპალურიrBUen_AUrCX=ავსტრალიური ინგლისურიrDUnaprEX'ნეაპოლიტანურიrFUgrcrGX(ძველი ბერძნულიrHUzurIX ზულუrJUnvrKXნავახოrLUfrrMXფრანგულიrNUderOXგერმანულიrPUfarQXსპარსულიrRUfr_CHrSX:შვეიცარიული ფრანგულიrTUfirUXფინურიrVUsarWXსანსკრიტიrXUfr_CArYX1კანადური ფრანგულიrZUkar[Xქართულიr\Ukgr]Xკონგოr^Ugswr_X=შვეიცარიული გერმანულიr`UkkraXყაზახურიrbUsrrcXსერბულიrdUsqreXალბანურიrfUkorgXკორეულიrhUsvriXშვედურიrjUkmrkXკამბოჯიურიrlUstrmX/სამხრეთ სოთოს ენაrnUskroXსლოვაკურიrpUsirqXსინჰალურიrrUshrsX.სერბულ-ხორვატულიrtUsoruXსომალიურიrvUkurwXქურთულიrxUslryXსლოვენურიrzUscr{Xსარდინიულიr|Ukyr}Xყირგიზულიr~UsdrXსინდურიruU territoriesr}r(UBDrXბანგლადეშიrUBErXბელგიაrUBFrX"ბურკინა-ფასოrUBGrXბულგარეთიrUVErXვენესუელაrUBArX;ბოსნია და ჰერცეგოვინაrUBBrXბარბადოსიrUWFrX,ვალისი და ფუტუნაrUBMrXბერმუდაrUBNrXბრუნეიrUBOrXბოლივიაrUBHrXბაჰრეინიrUBIrXბურუნდიrUBJrXბენინიrUBTrXბუტანიrU011rX.დასავლეთი აფრიკაrUBVrX%ბუვეს კუნძულიrUBWrXბოტსვანაrU014rX4აღმოსავლეთი აფრიკაrU015rX.ჩრდილოეთი აფრიკაrUBRrXბრაზილიაrU017rXშუა აფრიკაrU018rX+სამხრეთი აფრიკაrU019rXამერიკებიrUBYrXბელორუსიაrUBZrXბელიზიrULVrXლატვიაrURWrXრუანდაrURSrXსერბიაrUTLrX4აღმოსავლეთი ტიმორიrURErXრეიუნიონიrUTMrXთურქმენეთიrUOMrXომანიrUTJrXტაჯიკეთიrUROrXრუმინეთიrUGWrX"გვინეა-ბისაუrUGUrXგუამიrUGTrXგვატემალაrUGSrXსამხრეთი ჯორჯია და სამხრეთ სენდვიჩის კუნძულებიrUGRrXსაბერძნეთიrUGQrX1ეკვატორული გვინეაrUGPrXგვადელუპეrUJPrXიაპონიაrUKIrXკირიბატიrUGYrXგაიანაrUGErXსაქართველოrUGDrXგრენადაrU021rX1ჩრდილოეთი ამერიკაrUGBrX(დიდი ბრიტანეთიrUGArXგაბონიrUSVrXსალვადორიrUGNrXგვინეაrUGMrXგამბიაrUGLrXგრენლანდიაrU029rXკარიბიrUGIrXგიბრალტარიrUGHrX განაrUJErXჯერსიrUTNrXტუნისიrUJMrXიამაიკაrU013rX4ცენტრალური ამერიკაrUWSrXსამოაrU419rXHლათინური ამერიკა და კარიბიrUHRrXჰორვატიაrUBSrX1ბაჰამის კუნძულებიrUHTrXჰაიტიrUHUrXუნგრეთიrUHKr Xჰონგ კონგიr U039r X+სამხრეთი ევროპაr UHNr XჰონდურასიrUFIrXფინეთიrU142rX აზიაrU030rX.აღმოსავლეთი აზიაrU034rX%სამხრეთი აზიაrU035rXDსამხრეთ-აღმოსავლეთი აზიაrUPRrXპუერტო რიკოrUPSrX:პალესტინის ტერიტორიაrUFKrX:ფალკლენდის კუნძულებიrUIOrXiბრიტანული ტერიტორია ინდოეთის ოკეანეშიr UPWr!Xპალაუr"UPTr#Xპორტუგალიაr$UMDr%Xმოლდოვაr&UFMr'Xმიკრონეზიაr(UIQr)Xერაყიr*UPAr+Xპანამაr,UPFr-X4ფრანგული პოლინეზიაr.UPGr/X2პაპუა-ახალი გვინეაr0UPEr1X პერუr2UPKr3Xპაკისტანიr4UPHr5Xფილიპინებიr6UFOr7X+ფაროს კუნძულებიr8UPLr9Xპოლონეთიr:UPMr;X<სენტ-პიერი და მიქელონიr<UZMr=Xზამბიაr>UEHr?X.დასავლეთი საჰარაr@URUrAXრუსეთიrBUEErCXესტონეთიrDUEGrEXეგვიპტეrFUZArGX(სამხრეთ აფრიკაrHUECrIXეკვადორიrJUITrKXიტალიაrLUVNrMXვიეტნამიrNUZZrOXHუცნობი ან არასწორი რეგიონიrPUSBrQX7სოლომონის კუნძულებიrRUETrSXეთიოპიაrTUSOrUXსომალიrVUZWrWXზიმბაბვეrXUSArYX(საუდის არაბეთიrZUESr[Xესპანეთიr\UERr]Xერიტრეაr^UMEr_Xმონტენეგროr`UAQraXანტარქტიკაrbUMGrcX!მადაგასკარიrdUMAreXმაროკოrfUMCrgXმონაკოrhUUZriXუზბეკეთიrjUMMrkXმიანმარიrlUMLrmX მალიrnUMOroXმაკაოrpUMNrqXმონღოლეთიrrUHMrsXmჰერდის კუნძული და მაკდონალდის კუნძულებიrtUASruX+ამერიკული სამოაrvUMKrwXმაკედონიაrxUMUryXმავრიკიაrzUMTr{Xმალტაr|UMWr}Xმალავიr~UMVrX4მალდივის კუნძულებიrUMQrXმარტინიკიrUPYrXპარაგვაიrUMSrXმონსერატიrUMRrXმავრიტანიაrUIMrX%მანის კუნძულიrUUGrXუგანდაrUTZrXტანზანიაrUMYrXმალაიზიაrUMXrXმექსიკაrUILrXისრაელიrUFRrXსაფრანგეთიrUAWrXარუბაrUDOrX@დომინიკანის რესპუბლიკაrUSHrX;წმინდა ელენეს კუნძულიrUVCrXNსენტ-ვინსენტი და გრენადინებიrU054rXმელანეზიაrUDJrXჯიბუტიrUFJrX ფიჯიrU057rXმირონეზიაrU172rXqდამოუკიდებელ სახელმწიფოთა თანამეგობრობაrU053rXKავსტრალია და ახალი ზელანდიაrUNIrXნიკარაგუაrUNLrX$ნიდერლანდებიrUNOrXნორვეგიაrUNArXნამიბიაrUVUrXვანუატუrUNCrX+ახალი კალედონიაrUNErXნიგერიrUNFrX1ნორფოლკის კუნძულიrUNGrXნიგერიაrUNZrX(ახალი ზელანდიაrUNPrXნეპალიrUNRrXნაურუrU061rXპოლინეზიაrUCIrX;სპილოს ძვლის სანაპიროrUCHrXშვეიცარიაrUCOrXკოლუმბიაrUCNrXჩინეთიrUCMrXკამერუნიrUCLrX ჩილეrUCArXკანადაrUCGrXკონგოrUCFrXSცენტრალური აფრიკის რესპუბლიკაrUCDrX'კონგო - კინშასაrUCZrX4ჩეხეთის რესპუბლიკაrUCYrXკვიპროსიrUCXrX%შობის კუნძულიrUCSrX8სერბია და მონტენეგროrUCRrXკოსტა-რიკაrUCVrXკაბო-ვერდეrUCUrX კუბაrUSZrXსვაზილენდიrUSYrXსირიაrUKGrXყირგიზეთიrUKErXკენიაrUSRrXსურინამიrU143rX+ცენტრალური აზიაrUKHrXკამბოჯაrUKNrX6სენტ-კიტსი და ნევისიrUKMrX1კომორის კუნძულებიrUSTrX6საო-ტომე და პრინსიპიrUSKrXსლოვაკეთიrUKRrX(სამხრეთი კორეაrUSIrXსლოვენიაrUKPrX+ჩრდილოეთი კორეაrUKWrXკუვეიტიrUSNrXსენეგალიrUSMrXსან-მარინოrUSLr Xსიერა-ლეონეr USCr X4სეიშელის კუნძულებიr UKZr XყაზახეთიrUKYrX4კაიმანის კუნძულებიrUSGrXსინგაპურიrUSErXშვეციაrUSDrXსუდანიrU151rX4აღმოსავლეთი ევროპაrU150rXევროპაrUDMrXდომინიკაrU155rX.დასავლეთი ევროპაrU154rX.ჩრდილოეთი ევროპაr UDEr!Xგერმანიაr"UYEr#Xიემენიr$UMHr%X4მარშალის კუნძულებიr&U062r'XAსამხრეთ-ცენტრალური აზიაr(UDZr)Xალჟირიr*UUSr+XMამერიკის შეერთებული შტატებიr,UUYr-Xურუგვაიr.UUMr/Xშეერთებული შტატების მცირე დაშორებული კუნძულებიr0ULBr1Xლიბანიr2ULCr3Xსენტ-ლუსიაr4ULAr5Xლაოსიr6UTVr7Xტუვალუr8UTWr9Xტაივანიr:UTTr;X5ტრინიდადი და ტობაგოr<UTRr=Xთურქეთიr>ULKr?Xშრი-ლანკაr@ULIrAX$ლიხტენშტაინიrBUCKrCX+კუკის კუნძულებიrDUTOrEXტონგაrFULTrGXლიტვაrHULUrIX!ლუქსემბურგიrJULRrKXლიბერიაrLULSrMXლესოთოrNUTHrOXტაილანდიrPUTFrQXVფრანგული სამხრეთის ტერიტორიებიrRUTGrSX ტოგოrTUTDrUX ჩადიrVULYrWXლიბიაrXUVArYXვატიკანიrZU145r[X(დასავლეთი აზიაr\UAEr]X\არაბეთის გაერთიანებული ემირატებიr^UADr_Xანდორაr`UAGraX2ანტიგუა და ბარბუდაrbUAFrcXავღანეთიrdUAIreXანგვილაrfUISrgXისლანდიაrhUIRriXირანიrjUAMrkXსომხეთიrlUALrmXალბანეთიrnUAOroXანგოლაrpUANrqX@ნიდერლანდების ანტილებიrrU003rsX.ჩრდილოეთ ამერიკაrtU002ruXაფრიკაrvU001rwXმსოფლიოrxUARryXარგენტინაrzUAUr{Xავსტრალიაr|UATr}Xავსტრიაr~U005rX.სამხრეთი ამერიკაrUINrXინდოეთიrUAXrX1ალანდის კუნძულებიrU009rXოკეანეთიrUAZrX!აზერბაიჯანიrUIErXირლანდიაrUIDrXინდონეზიაrUJOrXიორდანიაrUQUrX!ევროკავშირიrUUArXუკრაინაrUQArXკატარიrUDKrXდანიაrUMZrXმოზამბიკიrUQOrX4დაშორებული ოკეანიაruUdecimal_formatsr}rNh()r}r(h+Nh,Kh-KKrh/h7h7rh2KKrh4X #,##0.###rh6h7h8rh:Nh;KKrubsU date_formatsr}r(UmediumrhF)r}r(h4X yyyy MMM drhJX%(yyyy)s %(MMM)s %(d)srubUfullrhF)r}r(h4XEEEE, yyyy MMMM ddrhJX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srubUlongrhF)r}r(h4X yyyy MMMM drhJX%(yyyy)s %(MMMM)s %(d)srubUshortrhF)r}r(h4Xyy/MM/ddrhJX%(yy)s/%(MM)s/%(dd)srubuUcurrency_symbolsr}rU time_zonesr}r(UAtlantic/Canaryr}rUcityrXკანარიrsUAntarctica/Mawsonr}rjXმოუსონიrsUAmerica/Buenos_Airesr}rjX%ბუენოს აირესიrsUAustralia/Melbourner}rjXმელბურნიrsU Pacific/Waker}rjXუეიკიrsU Africa/Maserur}rjXლესოთოrsUAfrica/Tripolir}rjXლიბიაrsUAmerica/Nipigonr}rjXნიპიგონიrsUAmerica/Miquelonr}rjX<სენტ პიერი და მიკელონიrsUAmerica/Indiana/Tell_Cityr}rjX-თელ სითი, ინდიანაrsUAustralia/Darwinr}rjXდარვინიrsUAmerica/Whitehorser}rjXუაითჰორსიrsUAntarctica/Davisr}rjXდევისიrsUAfrica/Libreviller}rjXგაბონიrsUAmerica/Coral_Harbourr}rjX%ქორალ ჰარბორიrsUAfrica/Freetownr}rjXსიერა ლეონეrsUAmerica/Swift_Currentr}rjX%სვიფტ კარენტიrsU Europe/Samarar}rjXსამარაrsUAmerica/Montserratr}rjXმონსერატიrsUAfrica/Nairobir}rjXკენიაrsUEurope/Simferopolr}rjX!სიმფეროპოლიrsUAmerica/Maceior}rjXმასეიოrsUAfrica/Abidjanr}rjX;სპილოს ძვლის სანაპიროrsUAfrica/Djiboutir}rjXჯიბუტიrsU Asia/Kashgarr}r jXკაშგარიr sUAmerica/Detroitr }r jXდეტროიტიr sU Asia/Kuchingr}rjXკუჩინგიrsU Asia/Urumqir}rjXურუმქიrsUAmerica/Grenadar}rjXგრენადაrsUAmerica/Indiana/Knoxr}rjX&ნოქსი, ინდიანაrsUAmerica/El_Salvadorr}rjX"ელ სალვადორიrsUAmerica/Indiana/Petersburgr}rjX!პიტერსბურგიrsUPacific/Kiritimatir }r!jXკირიტიმატიr"sUAsia/Pontianakr#}r$jXპონტიანაკიr%sUAsia/Ulaanbaatarr&}r'jXულანბატარიr(sUAmerica/Rainy_Riverr)}r*jX"რეინი რივერიr+sUAmerica/Argentina/San_Luisr,}r-jXსან ლუისიr.sUAfrica/Kampalar/}r0jXუგანდაr1sUAmerica/Phoenixr2}r3jXფენიქსიr4sUAntarctica/Rotherar5}r6jXროთერაr7sUAfrica/Casablancar8}r9jXმაროკოr:sU America/Arubar;}r<jXარუბაr=sUAmerica/Caymanr>}r?jXკაიმანისr@sU Asia/SakhalinrA}rBjXსახალინიrCsUAustralia/AdelaiderD}rEjXადელაიდაrFsUAfrica/Dar_es_SalaamrG}rHjXტანზანიაrIsUAmerica/IndianapolisrJ}rKjX'ინდიანაპოლისიrLsUAmerica/ReginarM}rNjXრეჯინაrOsU Pacific/TrukrP}rQjXტრუკიrRsUAmerica/CuracaorS}rTjX!ნიდერლანდისrUsUAmerica/Cambridge_BayrV}rWjXკემბრიჯ ბეიrXsU Africa/LuandarY}rZjXანგოლაr[sUAmerica/Mexico_Cityr\}r]jX"მექსიკო სითიr^sU America/Boiser_}r`jXბუასიrasUPacific/Chathamrb}rcjXჩათამიrdsUPacific/Midwayre}rfjXმიდუეიrgsU America/Jujuyrh}rijXჯუჯუიrjsUAmerica/Cordobark}rljXკორდობაrmsUAmerica/Guatemalarn}rojXგუატემალაrpsUAtlantic/Madeirarq}rrjXმადეირაrssU America/Belemrt}rujXბელემიrvsU Africa/Doualarw}rxjXკამერუნიrysU Asia/Harbinrz}r{jXჰარბინიr|sUAustralia/Lord_Hower}}r~jXლორდ ჰოუიrsUAfrica/Sao_Tomer}rjX6საო ტომე და პრინსიპეrsUAmerica/Argentina/San_Juanr}rjXსან ხუანიrsUPacific/Kosraer}rjXკოსრაეrsUAfrica/Bujumburar}rjXბურუნდიrsUAmerica/North_Dakota/New_Salemr}rjXLნიუ სალემი, ჩრდილოეთი დაკოტაrsUAmerica/Monterreyr}rjXმონტერეიrsUAsia/Krasnoyarskr}rjX$კრასნოიარსკიrsUAmerica/Louisviller}rjXლუისვილიrsU Africa/Kigalir}rjXრუანდაrsUAmerica/Boa_Vistar}rjXბოა ვისტაrsUAsia/Yekaterinburgr}rjX'ეკატერინბურგიrsUAfrica/Mbabaner}rjXსვაზილენდიrsUAustralia/Currier}rjX ქურიrsUAntarctica/Caseyr}rjXკეისიrsUPacific/Honolulur}rjXჰონოლულუrsUPacific/Enderburyr}rjXენდერბურიrsU America/Thuler}rjX თულეrsUAmerica/St_Johnsr}rjXსენტ ჯონსიrsUAmerica/Monctonr}rjXმონქტონიrsUAmerica/Jamaicar}rjXიამაიკაrsUPacific/Majuror}rjXმახუროrsUAfrica/Khartoumr}rjXსუდანიrsUAmerica/Mazatlanr}rjXმაზატლანიrsU Africa/Bissaur}rjXგინეა-ბისაუrsUAsia/Choibalsanr}rjXჩოიბალსანიrsUAmerica/Guadelouper}rjXგუადელუპეrsUAmerica/Blanc-Sablonr}rjX"ბლან-საბლონიrsUAmerica/Nassaur}rjX1ბაჰამის კუნძულებიrsU Europe/Kievr}rjXკიევიrsUAntarctica/Syowar}rjXსიოუაrsUAmerica/Halifaxr}rjXჰალიფაქსიrsUAntarctica/McMurdor}rjXმაკმურდოrsU Asia/Hovdr}rjXჰოვდიrsUAmerica/Danmarkshavnr}rjX$დენმარკშავნიrsUAmerica/Thunder_Bayr}rjXთანდერ ბეიrsUAmerica/Scoresbysundr}rjX$სკორსბისუნდიrsUAmerica/Eiruneper}rjXეირუნეპეrsUAfrica/Monroviar}rjXლიბერიაrsUAmerica/Manausr}rjXმანაუსიrsUAmerica/Los_Angelesr}rjX"ლოს ანჯელესიrsUAmerica/Noronhar}rjXნორონიაrsUAmerica/Goose_Bayr}rjXგუზ ბეიrsUAmerica/Catamarcar}rjXკატამარკაrsUAmerica/Chihuahuar}rjXჩიჰუაჰუაrsUAfrica/Windhoekr}rjXნამიბიაrsUAmerica/Argentina/Rio_Gallegosr}rjX"რიო გალეგოსიr sUPacific/Gambierr }r jXგამბიერიr sUAmerica/Vancouverr }rjXვანკუვერიrsUEurope/Volgogradr}rjXვოლგოგრადიrsU Africa/Bamakor}rjX მალიrsUEurope/Uzhgorodr}rjXუჟგოროდიrsUPacific/Ponaper}rjXპონაპეrsU Africa/Banjulr}rjXგამბიაrsU Asia/Aqtaur}r jXაქტაუr!sUAmerica/Guyanar"}r#jXგუიანაr$sUAmerica/Sao_Paulor%}r&jXსაო პაულოr'sUAmerica/Belizer(}r)jXბელიზიr*sUAmerica/Edmontonr+}r,jXედმონტონიr-sU Africa/Malabor.}r/jX1ეკვატორული გვინეაr0sUAustralia/Perthr1}r2jXპერთიr3sUAmerica/Mendozar4}r5jXმენდოზაr6sUAmerica/Meridar7}r8jXმერიდაr9sUPacific/Easterr:}r;jXისთერიr<sU Asia/Jakartar=}r>jXჯაკარტაr?sUAntarctica/Palmerr@}rAjXპალმერიrBsUAustralia/SydneyrC}rDjXსიდნეიrEsUAfrica/JohannesburgrF}rGjX+სამხრეთი აფრიკაrHsUAfrica/NouakchottrI}rJjXმავრიტანიაrKsUAfrica/El_AaiunrL}rMjX.დასავლეთი საჰარაrNsUAfrica/BlantyrerO}rPjXმალავიrQsU Asia/OralrR}rSjXორალიrTsUAmerica/Campo_GranderU}rVjX"კამპო გრანდეrWsUAmerica/Dawson_CreekrX}rYjX"დოუსონ ქრიკიrZsU Asia/Magadanr[}r\jXმაგადანიr]sUAfrica/Kinshasar^}r_jXკინშასაr`sUAntarctica/Vostokra}rbjXვოსტოკიrcsU Africa/Niameyrd}rejXნიგერიrfsUAustralia/Lindemanrg}rhjXლინდმანიrisUAmerica/Porto_Velhorj}rkjXპორტო ველჰოrlsUAmerica/Argentina/Ushuaiarm}rnjXუშუაიაrosUPacific/Galapagosrp}rqjXგალაპაგოსიrrsUAmerica/Indiana/Marengors}rtjXმარენგოrusUAmerica/Bogotarv}rwjXკოლუმბიაrxsUAmerica/Denverry}rzjXდენვერიr{sUAmerica/Winnipegr|}r}jXუინიპეგიr~sUAmerica/Dawsonr}rjXდოუსონიrsUAustralia/Brisbaner}rjXბრისბეინიrsU Asia/Aqtober}rjXაქტობეrsUAmerica/Recifer}rjXრეციფეrsU Africa/Accrar}rjX განაrsU America/Adakr}rjXადაკიrsUAmerica/Cayenner}rjXგუიანაrsU Africa/Dakarr}rjXსენეგალიrsUPacific/Kwajaleinr}rjXკვაჯალეინიrsUAmerica/Fortalezar}rjXფორტალეზაrsUAmerica/La_Pazr}rjXბოლივიაrsUAustralia/Broken_Hillr}rjX"ბროუკენ ჰილიrsU Asia/Irkutskr}rjXირკუტსკიrsU Africa/Cairor}rjXეგვიპტეrsUAmerica/Cuiabar}rjXკუიაბაrsU Africa/Lusakar}rjXზამბიაrsU Europe/Moscowr}rjXმოსკოვიrsUPacific/Tarawar}rjXტარაუაrsUAmerica/Yellowknifer}rjXიელოუნაიფიrsUAmerica/Rio_Brancor}rjXრიო ბრანკოrsUAfrica/Addis_Ababar}rjXეთიოპიაrsUAmerica/Cancunr}rjXკანკუნიrsUAsia/Vladivostokr}rjX$ვლადივოსტოკიrsUPacific/Johnstonr}rjXჯონსტონიrsUAmerica/Dominicar}rjXდომინიკაrsUAmerica/Havanar}rjX კუბაrsUEurope/Kaliningradr}rjX$კალინინგრადიrsUAfrica/Conakryr}rjXგინეაrsU Asia/Makassarr}rjXმაკასარიrsUAsia/Qyzylordar}rjXყიზილორდაrsUAmerica/Argentina/Tucumanr}rjXტუკუმანიrsUAtlantic/Azoresr}rjXაზორესrsUAsia/Chongqingr}rjXჩონგქინგიrsUAustralia/Euclar}rjXეუკლაrsUAmerica/Chicagor}rjXჩიკაგოrsUAmerica/Caracasr}rjXვენესუელაrsUAmerica/Rankin_Inletr}rjX%რენკინ ინლეტიrsUAmerica/Iqaluitr}rjXიქალუიტიrsUAfrica/Algiersr}rjXალჟირიrsU Africa/Hararer}rjXზიმბაბვეrsUAfrica/Ndjamenar}rjX ჩადიrsUAmerica/Hermosillor}rjXჰერმოსიოrsU Africa/Maputor}rjXმოზამბიკიrsUAsia/Samarkandr}rjXსამარყანდიrsUAmerica/Menomineer}rjXმენომინიrsUAmerica/Costa_Ricar}rjXკოსტა რიკაrsUAsia/Kamchatkar }r jXკამჩატკაr sUAmerica/Glace_Bayr }r jXგლეის ბეიrsU America/Limar}rjX პერუrsU Asia/Jayapurar}rjXჯაიაპურაrsUAfrica/Gaboroner}rjXბოტსვანაrsU Africa/Tunisr}rjXტუნისიrsUAmerica/Montevideor}rjXურუგვაიrsUAmerica/Anguillar}rjXანგილაr sUAmerica/North_Dakota/Centerr!}r"jXBცენტრი, ჩრდილოეთი დაკოტაr#sUAmerica/Pangnirtungr$}r%jX$პანგნირტუნგიr&sUAmerica/Resoluter'}r(jXრეზოლუტეr)sUEurope/Zaporozhyer*}r+jXზაპოროჟიეr,sUAmerica/Indiana/Vevayr-}r.jX&ვივეი, ინდიანაr/sU Asia/Yakutskr0}r1jXიაკუტსკიr2sUAmerica/Shiprockr3}r4jXშიპროკიr5sUAmerica/Barbadosr6}r7jXბარბადოსიr8sUAmerica/Tijuanar9}r:jXტიხუანაr;sU Africa/Banguir<}r=jXSცენტრალური აფრიკის რესპუბლიკაr>sUAmerica/Martiniquer?}r@jXმარტინიკიrAsUAntarctica/DumontDUrvillerB}rCjX)დიუმონ დ'ურვილიrDsUAmerica/AntiguarE}rFjXბარბუდაrGsUAmerica/Indiana/VincennesrH}rIjX,ვინსენი, ინდიანაrJsU Asia/AlmatyrK}rLjXალმატიrMsUAmerica/Argentina/La_RiojarN}rOjXლა რიოხაrPsUAfrica/MogadishurQ}rRjXსომალიაrSsU Africa/LomerT}rUjX ტოგოrVsUAsia/NovosibirskrW}rXjX$ნოვოსიბირსკიrYsU Asia/OmskrZ}r[jXომსკიr\sUAmerica/Indiana/Winamacr]}r^jX/უინემაკი, ინდიანაr_sUAfrica/Lubumbashir`}rajXლუბუმბაშიrbsUAfrica/Brazzavillerc}rdjX-კონგო - ბრაზავილიresUAmerica/Grand_Turkrf}rgjX,ტერკის და კაიკოსrhsUPacific/Marquesasri}rjjXმარკეზასიrksUAmerica/Asuncionrl}rmjXპარაგვაიrnsU Asia/Anadyrro}rpjXანადირიrqsUAmerica/New_Yorkrr}rsjXნიუ იორკიrtsU America/Nomeru}rvjX ნომიrwsUAmerica/Managuarx}ryjXნიკარაგუაrzsUAmerica/Yakutatr{}r|jXიაკუტატიr}sU Africa/Lagosr~}rjXნიგერიაrsUAustralia/Hobartr}rjXჰობარტიrsUAmerica/Juneaur}rjX ჯუნოrsUAmerica/Inuvikr}rjXინუვიკიrsUAmerica/Kentucky/Monticellor}rjXმონტიჩელოrsUAfrica/Porto-Novor}rjXბენინიrsUAmerica/Araguainar}rjXარაგუაინაrsUAmerica/Montrealr}rjXმონრეალიrsUAmerica/Torontor}rjXტორონტოrsU Etc/Unknownr}rjXუცნობიrsU America/Bahiar}rjX ბაიაrsUAmerica/Anchorager}rjXენქორაჯიrsU Africa/Ceutar}rjXსეუტაrsUAfrica/Ouagadougour}rjX"ბურკინა ფასოrsU Africa/Asmerar}rjXერითრეაrsUAntarctica/South_Poler}rjX+სამხრეთი პოლუსიrsuUscriptsr}r(UTamlrXტამილურიrUGururXგურმუხულიrUHebrrXებრაულიrUGeorrXქართულიrUXpeorX(ძველი სპარსულიrUCyrlrXკირილიცაrUHrktrX8კატაკანა ან ჰირაგანაrUArmnrXსომხურიrUCyrsrXDძველი საეკლესიო კირილიცაrUGeokrXხუცურიrURunrrXრუნულიrUKhmrrXქჰმერულიrUKanarXკატაკანაrUXsuxrXGშუმერულ-აქადური ლურსმნულიrUGothrXგოთურიrULatnrXლათინურიrUMayarX1მაიას იეროგლიფებიrUBalirX ბალიrUSyrcrXსირიულიrUGujrrXგუჯარათულიrUArabrXარაბულიrUZxxxrXდაუწერელიrUCoptrXკოპტურიrUHansrX4გამარტივებული ჰანიrUThairXტაილანდურიrUCprtrXკვიპროსულიrUGlagrXგლაგოლიცაrULinarXწრფივი ArUHantrX+ტრადიციული ჰანიrUMongrXმონღოლურიrUDevarXდევანაგარიrULaoorXლაოსურიrUHirarXჰირაგანაrUZzzzrXQუცნობი ან არასწორი დამწერლობაrUSyrerXCესტრანჯელოსეული სირიულიrUHanirX ჰანიrUPhnxrXფინიკიურიrUHungrX%ძველი უნგრულიrUBrairXბრაილიrUGrekrXბერძნულიrUEgydrX:ეგვიპტური დემოტიკურიrUEthirXეთიოპურიrUTibtrXტიბეტურიrUJpanrXიაპონურიrUBatkrXბატაკიr UEgyhr X=ეგვიპტური ჰიერატიკულიr ULinbr Xწრფივი Br UBengrXბენგალურიrUEgyprX=ეგვიპტური იეროგლიფურიrUSyrjrX1დასავლეთი სირიულიrUSyrnrX7აღმოსავლეთი სირიულიruUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UXXXrXEუცნობი ან არასწორი ვალუტაrUDZDrX.ალჟირიული დინარიrULVRr X(ლატვიური რუბლიr!UQARr"X%კატარის რიალიr#UBOPr$X(ბოლივიური პესოr%UEGPr&X4ეგვიპტური გირვანქაr'UBGLr(X8ბულგარული მყარი ლევიr)UBGNr*X8ბულგარული ახალი ლევიr+UYUMr,XGიუგოსლავიური ახალი დინარიr-UYUNr.Xbიუგოსლავიური კონვერტირებადი დინარიr/UBOBr0Xბოლივიანოr1UXBAr2XSევროპული კომპპოზიტური ერთეულიr3UDKKr4X%დანიური კრონაr5UXBBr6XAევროპული ფულადი ერთეულიr7UBWPr8X.ბოტსვანიური პულაr9UTZSr:X4ტანზანიური შილინგიr;UVNDr<X.ვიეტნამური დონგიr=UNADr>X.ნამიბიური დოლარიr?UAOAr@X+ანგოლური კვანზაrAUWSTrBX8დასავლეთ სამოას ტალაrCUAONrDXGანგოლური ახალი კვანზა (1990-2000)rEUYDDrFX(იემენის დინარიrGUMYRrHX4მალაიზიური რინგიტიrIUAOKrJX7ანგოლური კვანზა (1977-1990)rKUKYDrLXJკაიმანის კუნძულების დოლარიrMULYDrNX(ლიბიური დინარიrOUUAHrPX.უკრაინული გრივნაrQUUAKrRX=უკრაინული კარბოვანეციrSUJODrTX1იორდანიული დოლარიrUUAORrVXVანგოლური მიტოლებული კვანზა (1995-1999)rWUAWGrXX1არუბანული გულდენიrYUFIMrZX"ფინური მარკაr[UHKDr\X2ჰონგ კონგის დოლარიr]USRGr^X1სურინამის გულდენიr_UMGFr`X7მადაგასკარის ფრანკიraUCHFrbX4შვეიცარიული ფრანკიrcUBYRrdX1ბელარუსიული რუბლიreUALLrfX%ალბანური ლეკიrgUUGSrhX:უგანდური შილინგი (1966-1987)riUHRKrjX+ხორვატიული კუნაrkUDJFrlX(ჯიბუტის ფრანკიrmUHRDrnX1ხორვატიული დინარიroUPESrpXპერუს სოლიrqUBYBrrXMახალი ბელარუსიული რუბლი (1994-1999)rsUZWDrtX.ზიმბაბვეს დოლარიruUBNDrvX+ბრუნეული დოლარიrwUUYPrxX1ურუგვაის პესო (1975-1993)ryUSRDrzX.სურინამის დოლარიr{UNIOr|XDნიკარაგუას ოქროს კორდობაr}UNICr~X4ნიკარაგუას კორდობაrUMZErX4მოზამბიკური ესკუდოrUUYUrX>ურუგვაის პესო ურუგვაიოrUSYPrX.სირიული გირვანქაrUMADrX+მაროკოს დირჰამიrUFRFrX+ფრანგული ფრანკიrUMAFrX(მაროკოს ფრანკიrUMZMrXJძველი მოზამბიკური მეტიკალიrUMZNrX:მოზამბიკური მეტიკალიrUPHPrX+ფილიპინური პესოrURHDrX.როდეზიული დოლარიrUNPRrX(ნეპალური რუპიაrUGBPrXPინგლისური გირვანქა სტერლინგიrUBELrXIბელგიური ფრანკი (ფინანსური)rUBECrXUბელგიური ფრანკი (კოვერტირებადი)rUNGNrX+ნიგერიული ნაირაrUBEFrX+ბელგიური ფრანკიrUPLZrX4პოლონური ზლოტი (1950-1995)rUCRCrX5კოსტა რიკული კოლონიrUDEMrX+გერმანული მარკაrUEEKrX(ესტონური კრუნაrUMWKrX(მალავის კვანჩაrUTTDrXHტრინიდად და ტობაგოს დოლარიrULKRrX,შრი ლანკის რუპიაrUPKRrX1პაკისტანური რუპიაrUHUFrX+უნგრული ფორინტიrUROLrX2ძველი რუმინული ლეუrUXEUrXGევროპული სავალუტო ერთეულიrUBMDrX.ბერმუდული დინარიrUOMRrX"ომანის რეალიrUPTErX7პორტუგალიური ესკუდოrULSMrXმალოტიrUMNTrX1მონღოლური ტუგრიკიrUAMDrX%სომხური დრამიrUYUDrXGიუგოსლავიური მყარი დინარიrUUGXrX.უგანდური შილინგიrUSURrX%საბჭოთა რუბლიrUNLGrX4ჰოლანდიური გულდენიrUGEKrX8ქართული კუპონი ლარითrUJMDrX.იამაიკური დოლარიrUGELrX"ქართული ლარიrUAFNrXავღანიrUTRLrX"თურქული ლირაrUCSKrXGჩეხოსლოვაკიის მყარი კრონაrUKPWrX;ჩრდილოეთ კორეული ვონიrUCSDrX;ძველი სერბიული დინარიrUAFArXავღანი (1927-2002)rUTRYrX2ახალი თურქული ლირაrUBDTrX1ბანგლადეშური ტაკაrUGRDrX+ბერძნული დრაჰმაrUYERrX%იემენის რეალიrUDDMrXJაღმოსავლეთ გერმანული მარკაrUMGArX7მადაგასკარის არიარიrUANGrXVნიდრელანდების ანტილიის გულდენიrULRDrX.ლიბერიული დოლარიrURWFrX+რუანდული ფრანკიrUNOKrX.ნორვეგიული კრონაrUBRCrX4ბრაზილიური კრუზადოrUINRrX"ინდური რუპიაrUMXNrX(მექსიკური პესოrUCZKrX"ჩეხური კრონაrUTJSrX+ტაჯიკური სომონიrUTJRrX(ტაჯიკური რუბლიrUGWErXGპორტუგალიური გინეა ესკუდოrUMURrX1მავრიტანული რუპიაrUIDRrX1ინდონეზიური რუპიაrUHNLrX4ჰონდურასის ლემპირაrUFJDrXფიჯი დოლარიrUISKrX.ისლანდიური კრონაrUPENrX,პერუს ახალი სოლიr ULUCr Xbლუქსემბურგის კონვერტირებადი ფრანკიr UATSr X1ავსტრიული შილინგიr ULUFrX7ლუქსემბურგის ფრანკიrUZRNrX2ზაირის ახალი ზაირიrUDOPrX+დომინიკური პესოrULULrXSლუქსემბურგის ფინანსური ფრანკიrUTMMrX1თურქმენული მანათიrUTWDrX>ტაივანური ახალი დოლარიrUMDLrX%მოლდოვური ლეუrUBSDrX+ბაჰამური დოლარიrUSEKrX%შვედური კრონაrUZMKr X+ზამბიური კვანჩაr!UMVRr"X+მალდივური რუფიაr#UAUDr$X4ავსტრალიური დოლარიr%UADPr&X+ანდორული პესეტაr'UCUPr(Xკუბური პესოr)UIEPr*X7ირლანდიური გირვანქაr+UBBDr,X4ბარბადოსული დოლარიr-UKRWr.X8სამხრეთ კორეული ვონიr/UVEBr0X7ვენესუელის ბოლივარიr1USDPr2X.სუდანის გირვანქაr3UEURr4X ევროr5UITLr6X%იტალიური ლირაr7UXCDr8XMაღმოსავლეთ კარიბიული დოლარიr9UKZTr:X(ყაზახური ტენგეr;URUBr<X"რუსული რუბლიr=UXAGr>Xვერცხლიr?UBRRr@X7ბრაზილიური კრუზეიროrAUBRNrBXAბრაზილიური კრუზადო ნოვოrCUBRLrDX.ბრაზილიური რეალიrEUMMKrFX+მიანმარის კიატიrGURURrHX.რუსული რუბლი (1991-1998)rIUPLNrJX(პოლონური ზლოტიrKUBRErLXCბრაზილიური კრუზეირო (1990-1993)rMUKESrNX+კენიური შილინგიrOUBRBrPXPბრაზილიური კრუზეირო ნოვო (1967-1986)rQUAEDrRXuგაერთიანებული არაბული საემიროების დირჰემიrSUMKDrTX4მაკედონიური დენარიrUUAZMrVXFაზერბაიჯანული მანათი (1993-2006)rWUAZNrXX:აზერბაიჯანული მანათიrYUUSNrZX>აშშ დოლარი (შემდეგი დღე)r[UVUVr\X"ვანატუს ვატუr]UBADr^XJბოსნია-ჰერცოგოვინას დინარიr_UUSSr`X8აშშ დოლარი (იგივე დღე)raUMXPrbXMმექსიკური ვერცხლის პესო (1861-1992)rcUBAMrdXrბოსნია-ჰერცოგოვინას კონვერტირებადი მარკაreUSCRrfX(სეიშელის რუპიაrgUCADrhX+კანადური დოლარიriUSDDrjX(სუდანის დინარიrkUCVErlX2კაბო ვერდეს ესკუდოrmUKWDrnX.კუვეიტური დინარიroUBIFrpX1ბურუნდიული ფრანკიrqULTTrrX(ლიტვური ტალონიrsULTLrtX"ლიტვური ლიტაruUSGDrvX1სინგაპურის დოლარიrwUUZSrxX%უზბეკური სუმიryUXFOrzX;ფრანგული ოქროს ფრანკიr{UMLFr|X"მალის ფრანკიr}UESPr~X+ესპანური პესეტაrUMTPrX+მალტის გირვანქაrUZRZrX"ზაირის ზაირიrUCNYrXჩინური უანიrUSLLrX2სიერა ლეონეს ლეონეrUTNDrX.ტუნისიური დინარიrUCYPrX4კვიპროსის გირვანქაrUMTLrXმალტის ლირაrUNZDrX>ახალი ზელანდიის დოლარიrULVLrX%ლატვიური ლატიrUUSDrXაშშ დოლარიrUARPrX:არგენტინული პესო (1983-1985)rUKGSrX(ყირღიზული სომიrUARSrX.არგენტინული პესოrUPEIrXპერუს ინტიrURONrX"რუმინული ლეუrUBHDrX1ბაჰრეინული დინარიrUJPYrX%იაპონური იენიrUARArX:არგენტინული აუსტრალიruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXიrKXთrKXმrKXაrKXმrKXიrKXიrKXაrK XსrK XოrK XნrK XდrusUformatr}r(Uwider}r(KXიანვარიrKXთებერვალიrKXმარტიrKXაპრილიrKXმაისიrKXივნისიrKXივლისიrKXაგვისტოrK XსექტემბერიrK XოქტომბერიrK XნოემბერიrK XდეკემბერიruU abbreviatedr}r(KX იანrKX თებrKX მარrKX აპრrKX მაიrKX ივნrKX ივლrKX აგვrK X სექrK X ოქტrK X ნოეrK X დეკruuuUcurrency_formatsr}rNh()r}r(h+Nh,Kh-KKrh/h7h7rh2KKrh4X ¤ #,##0.00rh6X¤ rX-¤ rrh:Nh;KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXოrKXსrKXოrKXხrKXპrKXშrKXკrusUformatr}r(Uwider}r(KXორშაბათიrKXსამშაბათიrKXოთხშაბათიrKXხუთშაბათიrKXპარასკევიrKXშაბათიrKXკვირაruU abbreviatedr}r(KX ორშrKX სამrKX ოთხrKX ხუთrKX პარrKX შაბrKX კვიr uuuU meta_zonesr }r Uerasr }r (Uwider }r (KX=ჩვენს წელთაღრიცხვამდეr KX7ჩვენი წელთაღრიცხვითr uU abbreviatedr }r (KX=ჩვენს წელთაღრიცხვამდეr KX7ჩვენი წელთაღრიცხვითr uUnarrowr }r (KX=ჩვენს წელთაღრიცხვამდეr KX7ჩვენი წელთაღრიცხვითr uuu.PK[IH}u}u%site-packages/babel/localedata/ca.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX 1r trimestreqKX 2n trimestreqKX 3r trimestreqKX 4t trimestrequU abbreviatedq}q(KX1TqKX2TqKX3TqKX4TquuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XH:mm:ssqRUformatqSX%(H)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X H:mm:ss vqXhSX%(H)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X H:mm:ss zq]hSX%(H)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XH:mmqbhSX %(H)s:%(mm)sqcubuU languagesqd}qe(UgvqfXmanxqgUguqhXgujaratiqiUscnqjXsiciliàqkUromqlXromaníqmUalgqnXllengua algonquinaqoUaleqpXaleutaqqUgdqrXescocèsqsUgaqtX irlandèsquUmnoqvXllengua manoboqwUgnqxXguaraníqyUaltqzXaltaic meridionalq{Uglq|Xgallecq}Utyq~XtahitiàqUtwqXtwiqUttqXtàtarqUtrqXturcqUtsqXtsongaqUtnqXtswanaqUtoqXtongaqUausqXllengua australianaqUtkqXturcmanqUthqXthaiqUroaqXllengua romànicaqUtgqXtadjikqUteqXteluguqUugaqX ugaríticqUmwlqX mirandèsqUde_ATqXalemany austriacqUfatqXfantiqUfanqXfangqUgotqXgòticqUdinqXdinkaqUcarqXcaribqUzhqXxinèsqUen_CAqXanglès canadencqUnwcqXnewari clàssicqUzaqXzhuangqUcauqXllengua caucàsicaqUzuqXzuluqUmncqXmanxúqUkumqXkúmikqUnewqXnewariqUsuxqXsumeriqUmenqXmendeqUlezqXlesguiàqUdraqXllengua dravidianaqUjrbqX judeoàrabqUsgnqXllengua de signesqUsgaqXirlandès anticqUapaqXllengua apatxeqUchgqXtxagataiqUtlqXtagàlogqUchnqXpidgin chinookqUchoqXchoctawqUchpqX chipewyanqUchrqXcherokeeqUchyqXxeienneqUtiqXtigrinyaqUmgqXmalgaixqUmlqX malaialamqUmoqXmoldauqUmnqXmongolqUmiqXmaoriqUmhqX marshallèsqUmkqXmacedoniqUmtqXmaltèsqUcaiqX%llengua ameríndia d'Amèrica CentralqUdelqXdelawareqUmsqXmalaiqUmrqXmarathiqUtaqXtàmilqUmyqXbirmàqUcadqXcaddoqUtaiqX llengua taiqUafhqXafrihiliqUsitqXllengua sinotibetanaqUenmqXanglès mitjàqUen_AUrXanglès australiàrUsiorX llengua siouxrUmaprXllengua autronèsiarUmasrXmassairUlahrXpanjabi occidentalr Uladr Xladír Ufyr Xfrisór UsnkrXsoninkerUfarXpersarUmadrXmadurèsrUffrXfulrUfirXfinèsrUfjrXfijiàrUmanrXmandingarUegyrX egipci anticrUssrXsiswatirUsrr Xserbir!Usqr"Xalbanèsr#Uswr$Xswahilir%Usvr&Xsuecr'Usur(X sundanèsr)Ustr*Xsothor+Uskr,Xeslovacr-Usir.X sinhalèsr/Ushr0X serbo-croatr1Usor2Xsomalir3Usnr4Xshonar5Usmr6Xsamoàr7Uslr8Xeslovèr9Uscr:Xsardr;Usar<X sànscritr=Usgr>Xsangor?User@Xsami septentrionalrAUsdrBXsindhirCUzenrDXzenagarEUkbdrFXkabardírGUafarHXllengua afroasiàticarIUcsbrJXcaixubirKUlgrLXgandarMUlbrNX luxemburguèsrOUfiurPXllengua finoúgricarQUlnrRXlingalarSUlorTXlaosiàrUUlirVX limburguèsrWUlvrXXletórYUltrZXlituàr[Ufilr\Xfilipír]Uyir^Xjiddishr_Unonr`X noruec anticraUyorbXiorubarcUnogrdXnogaireUcrprfXllengua criolla o pidginrgUdakrhXdakotariUdarrjXdarguàrkUdayrlXdaiakrmUkpernXkpelleroUelrpXgrecrqUeorrX esperantorsUenrtXanglèsruUeervXewerwUmdfrxXmordovià moksharyUfrrzXfrancèsr{Umdrr|Xmandarr}Uetr~XestoniàrUesrXespanyolrUrurXrusrUrwrX kinyarwandarUgohrXalt alemany anticrUsmsrX sami skoltrUsmnrX sami d'InarirUsmirX llengua samirUrmrX retoromànicrUrnrXkirundirUrorXromanèsrUdsbrX baix sòrabrUsmarXsami meridionalrUastrXasturiàrUbalrXbalutxirUathrXllengua atapascanarUxhrXxosarUzaprXzapotecarUzxxrXsense contingut lingüísticrUforXferoèsrUhuprXhuparUbejrXbejarUbemrXbembarUberrXberberrUsairXllengua ameríndia meridionalrUangrX anglès anticrUprarXpràcritrUsamrXarameu samaritàrUsalrXllengua salishrUprorXprovençal anticrUrajrX rajasthanirUsadrXsandawerUes_419rXcastellà americàrUsasrXsasakrUmicrXmicmacrUnahrXnàhuatlrUbtkrXbatakrUmisrXllengua miscel·làniarUkabrXcabilencrUkaarX karakalpakrUkarrXkarenrUfr_CHrXfrancès suísrUtyvrXtuviniàrUkarXgeorgiàrUkkrXkazakhrUkirXkikuiurUkorXcoreàrUknrXkannadarUkmrX cambodjàrUklrX greenlandèsrUksrXcaixmirirUkvrXkomirUkurXkurdrUkyrXkirguísrUtklrX tokelauèsrUbuarXburiatrUmgarXgaèlic irlàndès mitjàrUhitrXhititarUgezrXgueezrUderXalemanyrUdarXdanèsrUdzrX bhutanèsrUmulrXvaries llengüesrUdvrXdivehirUgemrXllengua germànicarUbatrXllengua bàlticarUqurXquètxuarUbanrXbalinèsrUcrhrXtàtar de CrimearUbairX bamilekér Uarpr Xarapahor Uartr Xllengua artificialr UarwrXarauacrUarcrXarameurUen_USrXanglès americàrUsemrXllengua semíticarUnubrXllengua nubianarUarnrXaraucàrUmusrXcreekrUworXwòlofrUirorXiroquèsrUirar Xllengua irànicar!Umunr"X llengua mundar#Uluor$Xluor%Uwar&Xvalór'Utupr(X llengua tupír)Ujvr*Xjavanèsr+Ututr,Xllengua altaïcar-Ujar.Xjaponèsr/Ucopr0Xcopter1Uilor2Xilocàr3Ular4Xllatír5Uundr6Xidioma desconegut o no vàlidr7Utlir8Xtlingitr9Utlhr:X klingoniàr;Uchr<Xchamorror=Ucor>Xcorsr?Upt_PTr@Xportuguès (portugal)rAUcerBXtxetxèrCUponrDXponapeàrEUcyrFX gal·lèsrGUsahrHXiacutrIUcsrJXtxecrKUcrrLXcreerMUbntrNXbanturOUcvrPXtxuvaixrQUcurRXeslau eclesiàsticrSUpsrTXpaixtorUUdumrVXneerlandès mitjàrWUptrXX portuguèsrYUfrorZXfrancès anticr[Uyapr\Xyapeàr]Ufrmr^Xfrancès mitjàr_Ufrsr`Xfrisó occidentalraUfrrrbXfrisó septentrionalrcUpardXpanjabireUxalrfXcalmucrgUes_ESrhXcastellà ibèricriUpirjXpalirkUen_GBrlXanglès britànicrmUotarnX turc otomàroUmyvrpXmirandès erzyarqUfurrrXfriülàrsUkhirtXllengua khoisanaruUslarvXllengua eslavarwUverxXvendaryUvirzX vietnamitar{Uisr|X islandèsr}Uavr~XàvarrUiurX inuktitutrUitrXitaliàrUvorXvolapukrUikrXinupiakrUiorXidorUiarX interlinguarUierX interlinguerUidrXindonesirUigrXigborUpaprX papiamentorUpaurXpalauàrUpaarX llengua papúrUpalrXpahlavirUcelrXllengua cèlticarUphnrXfenicirUnicrXllengua nigerokurdufanianarUsyrrXsiríacrUjborX judeopersarUnbrXnoruec bokmålrUchmrXmarirUhairXhaidarUgmhrXalt alemany mitjàrUcusrXllengua cuixíticarUwenrXsòrabrUadyrXadiguérUelxrXelamitarUcarXcatalàrUhawrXhawaiàrUpt_BRrXportuguès (brasil)rUzh_HansrXxinès simplificatrUzh_HantrXxinès tradicionalrUtvlrXtuvaluàrUkmbrXKimbundurUpeorX persa anticrUumbrXumbundurUtmhrX tamazightrUhsbrX alt sòrabrUberX bielorúsrUbgrXbúlgarrUbarXbaixkirrUbmrXbambararUbnrXbengalírUborXtibetàrUbhrXbiharirUbirXbislamarUbrrXbretórUbsrXbosniàrUruprX aromanèsrUomrX oromo (afan)rUojrXojibwarUocrXoccitàrUkrcrXkaratxairUndsrX baix alemanyrUosrXossetrUorrXoriyarUsogrXsogdiàrUnsorXsotho septentrionalrUsonrXsonghairUde_CHrX alemany suísrUvairXvairUwakrXllengua wakashanrUmkhrXllengua monkhmerrUgilrX gilbertèsrUhyrXarmenirUanrX aragonèsrUhrrXcroatrUhtrXhaitiàrUhurX hongarèsrUhirXhindir Uhar Xhausar Ubugr Xbuguir UherXhebreurUuzrXuzbekrUurrXurdúrUplrXpolonèsrUukrX ucraïnèsrUugrXuigurrUaarXàfarrUabrXabkhazrUaerXavèsticrUafr X afrikaansr!Uakr"Xàkanr#Uamr$Xamhàricr%Unl_BEr&Xflamencr'Ueur(Xbascr)Uasr*Xassamèsr+Uarr,Xàrabr-Uinhr.Xingúixr/Utpir0X tok pisinr1Ukhor2X khotanèsr3Uayr4Xaimarar5Uiner6Xllengua indoeuropear7Uazr8Xàzerir9Uincr:Xllengua índicar;Unlr<X neerlandèsr=Unnr>Xnoruec nynorskr?Unor@XnoruecrAUnarBXnauruàrCUtivrDXtivrEUnairFX llengua ameríndia septentrionalrGUndrHXndebele septentrionalrIUnerJXnepalèsrKUnyrLXnyanjarMUnaprNX napolitàrOUmynrPX llengua maiarQUgrcrRX grec anticrSUnrrTXndebele meridionalrUUtigrVXtigrérWUnvrXXnavahorYUcperZXcrioll - basat en l'anglèsr[Ucpfr\Xcrioll - basat en el francèsr]Ucppr^Xcrioll - basat en el portuguèsr_uU territoriesr`}ra(UBDrbX Bangla DeshrcUBErdXBèlgicareUBFrfX Burkina FasorgUBGrhX BulgàriariUVErjX VeneçuelarkUBArlXBòsnia i HercegovinarmUBBrnXBarbadosroUWFrpXWallis i FutunarqUBMrrXBermudesrsUBNrtXBruneiruUBOrvXBolíviarwUBHrxXBahrainryUBIrzXBurundir{UBJr|XBeninr}UBTr~XBhutanrU011rXÀfrica OccidentalrUBVrX Illa BouvetrUBWrXBotswanarU014rXÀfrica OrientalrU015rXÀfrica septentrionalrUBRrXBrasilrU017rXÀfrica CentralrU018rXÀfrica meridionalrU019rXAmèricarUBYrX BielorússiarUBZrXBelizerULVrXLetòniarURWrXRwandarURSrXSèrbiarUTLrXTimorrURErXReunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadjikistanrUROrXRomaniarUTKrXTokelaurUGWrX Guinea BissaurUGUrXGuamrUGTrX GuatemalarUGSrX)Illes Geòrgia del Sud i Sandwich del SudrUGRrXGrèciarUGQrXGuinea EquatorialrUGPrX GuadelouperUJPrXJapórUKIrXKiribatirUGYrXGuyanarUGGrXBatllia de GuernseyrUGFrXGuaiana FrancesarUGErXGeòrgiarUGDrXGrenadarU021rXAmèrica septentrionalrUGBrX Regne UnitrUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGàmbiarUGLrX GroenlàndiarU029rXCaribrUGIrX GibraltarrUGHrXGhanarUJErXBatllia de JerseyrUTNrXTunísiarUJMrXJamaicarU013rXAmèrica CentralrUWSrXSamoarU419rXAmèrica Llatina i CaribrUHRrXCroàciarUBSrXBahamesrUHTrXHaitírUHUrXHongriarUHKrX Hong KongrU039rXEuropa meridionalrUHNrXHonduresrUFIrX FinlàndiarU142rXÀsiarU030rXÀsia OrientalrU034rX Sud d'ÀsiarU035rXÀsia Sud-orientalrUPRrX Puerto RicorUPSrXTerritori PalestírUFKrXIlles MalvinesrUIOrX%Territori Britànic de l'Oceà ÍndicrUPWrXPalaurUPTrXPortugalr USJr XSvalbard i Jan Mayenr UMDr X Moldàviar UFMrX MicronèsiarUIQrXIraqrUPArXPanamàrUPFrXPolinèsia FrancesarUPGrXPapua Nova GuinearUPErXPerúrUPKrXPakistanrUPHrX FilipinesrUFOrX Illes FèroerUPNr XIlles Pitcairnr!UPLr"XPolòniar#UPMr$XSaint Pierre i Miquelonr%UZMr&XZàmbiar'UEHr(XSàhara Occidentalr)URUr*XRússiar+UEEr,XEstòniar-UEGr.XEgipter/UZAr0X Sud-àfricar1UECr2XEquadorr3UITr4XItàliar5UVNr6XVietnamr7UZZr8XRegió desconeguda o no vàlidar9USBr:X Illes Salomór;UETr<XEtiòpiar=USOr>XSomàliar?UZWr@XZimbabwerAUSArBXAràbia SaudírCUESrDXEspanyarEUERrFXEritrearGUMErHX MontenegrorIUAQrJX AntàrtidarKUMGrLX MadagascarrMUMFrNX Saint MartinrOUMArPXMarrocrQUMCrRXMònacorSUUZrTX UzbekistanrUUMMrVXMyanmarrWUMLrXXMalirYUMOrZXMacaur[UMNr\X Mongòliar]UHMr^XIlla Heard i Illes McDonaldr_UASr`XSamoa americanaraUMKrbX MacedòniarcUMUrdXMauricireUMTrfXMaltargUMWrhXMalawiriUMVrjXMaldivesrkUMQrlX MartinicarmUMPrnXIlles Mariannes del NordroUMSrpX MontserratrqUMRrrX MauritàniarsUIMrtX Illa de ManruUUGrvXUgandarwUTZrxX TanzàniaryUMYrzX Malàisiar{UMXr|XMèxicr}UILr~XIsraelrUFRrXFrançarUAWrXArubarUDOrXRepública DominicanarUSHrX Saint HelenarUVCrXSaint Vincent i les GrenadinesrU054rX MelanèsiarUDJrXDjiboutirUFJrXFijirU057rXRegió de la MicronèsiarU172rXComunitat d'Estats IndependentsrU053rXAustràlia i Nova ZelandarUNIrX NicaraguarUNLrXPaïsos BaixosrUNOrXNoruegarUNArXNamíbiarUVUrXVanuaturUNCrXNova CaledòniarUNErXNígerrUNFrX Illa NorfolkrUNGrXNigèriarUNZrX Nova ZelandarUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinèsiarUCIrXCosta d’IvorirUCHrX SwitzerlandrUCOrX ColòmbiarUCNrXXinarUCMrXCamerunrUCLrXXilerUCCrX Illes CocosrUCArXCanadàrUCGrXCongorUCFrXRepública CentrafricanarUCDrX!República Democràtica del CongorUCZrXRepública TxecarUCYrXXiprerUCXrXIlla ChristmasrUCSrXSèrbia i MontenegrorUCRrX Costa RicarUPYrXParaguairUCVrXCap VerdrUCUrXCubarUSZrX SwazilàndiarUSYrXSíriarUKGrX KirgizistanrUKErXKenyarUSRrXSurinamrU143rX Àsia CentralrUKHrXCambodjarUKNrXSaint Kitts i NevisrUKMrXComoresrUSTrXSão Tomé i PrínciperUSKrX EslovàquiarUKRrX Corea del SudrUSIrX EslovèniarUKPrXCorea del NordrUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KazakhstanrUKYrX Illes CaimanrUSGrXSingapurrUSErXSuèciarUSDrXSudanrU151rXEuropa Orientalr U150r XEuropar UDMr XDominicar U155rXEuropa OccidentalrU154rXEuropa septentrionalrUVGrXIlles Verges BritàniquesrUDErXAlemanyarUYErXIemenrUMHrXIlles MarshallrU062rXÀsia Sud-centralrUDZrXAlgèriarUUSrX Estats UnitsrUUYr XUruguair!UYTr"XMayotter#UUMr$X#Illes Perifèriques Menors dels EUAr%ULBr&XLíbanr'ULCr(X Saint Luciar)ULAr*XLaosr+UTVr,XTuvalur-UTWr.XTaiwanr/UTTr0XTrinitat i Tobagor1UTRr2XTurquiar3ULKr4X Sri Lankar5ULIr6X Liechtensteinr7UCKr8X Illes Cookr9UTOr:XTongar;ULTr<X Lituàniar=ULUr>X Luxemburgr?ULRr@XLibèriarAULSrBXLesothorCUTHrDX TailàndiarEUTFrFX Territoris Meridionals FrancesosrGUTGrHXTogorIUTDrJXTxadrKUTCrLXIlles Turks i CaicosrMULYrNXLíbiarOUVArPXVaticàrQU145rRXÀsia OccidentalrSUAErTXUnió dels Emirats ÀrabsrUUADrVXAndorrarWUAGrXXAntigua i BarbudarYUAFrZX Afganistanr[UAIr\XAnguillar]UVIr^XIlles Verges dels USAr_UISr`X IslàndiaraUIRrbXIranrcUAMrdXArmèniareUALrfXAlbàniargUAOrhXAngolariUANrjXAntilles HolandesesrkU003rlXAmèrica del NordrmU002rnXÀfricaroU001rpXMónrqUARrrX ArgentinarsUAUrtX AustràliaruUATrvXÀustriarwU005rxX SudamèricaryUINrzXÍndiar{UAXr|X Illes Alandr}U009r~XOceaniarUAZrX AzerbaidjanrUIErXIrlandarUIDrX IndonèsiarUJOrX JordàniarUQUrX Unió EuropearUUArXUcraïnarUQArXQatarrUDKrX DinamarcarUMZrX MoçambicruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X dd/MM/yyyyrhSX%(dd)s/%(MM)s/%(yyyy)srubUfullrhO)r}r(h3XEEEE d 'de' MMMM 'de' yyyyrhSX&%(EEEE)s %(d)s de %(MMMM)s de %(yyyy)srubUlongrhO)r}r(h3Xd 'de' MMMM 'de' yyyyrhSX%(d)s de %(MMMM)s de %(yyyy)srubUshortrhO)r}r(h3Xdd/MM/yyrhSX%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}rUESPrX₧rsU time_zonesr}r(UAmerica/Belizer}rUcityrXBelisersUAtlantic/Canaryr}rjXIlles CanàriesrsU Europe/Londonr}rjXLondresrsU Europe/Zurichr}rjXZuricrsUPacific/Easterr}rjXIlla de PasquarsU Asia/Jakartar}rjXDjakartarsUEurope/Stockholmr}rjXEstocolmrsUAmerica/Martiniquer}rjX MartinicarsUAfrica/Sao_Tomer}rjX Sao TomérsU Asia/Katmandur}rjX KatmandúrsUAtlantic/South_Georgiar}rjXGeòrgia del SudrsUAtlantic/Faeroer}rjXFèroersU Europe/Warsawr}rjX VarsòviarsU Africa/Tunisr}rjXTunísiarsU Asia/Damascusr}rjXDamascrsUIndian/Maldivesr}rjX Les MaldivesrsUEurope/Copenhagenr}rjX CopenhaguenrsUAmerica/St_Luciar}rjX St. LuciarsUAmerica/New_Yorkr}rjX Nova YorkrsUAsia/Singaporer}rjXSingapurrsUAmerica/Anchorager}rjX Hora d'AlaskarsUEurope/Bucharestr}rjXBucarestrsU Europe/Monacor}rjXMònacorsU Asia/Tehranr}rjXTeheranrsU Europe/Tiraner}rjXTiranarsU Asia/Tokyor}rjXTòquiorsUIndian/Reunionr}rjXReuniór sUPacific/Noumear }r jXNumear sUPacific/Galapagosr }rjX GalápagosrsUEurope/Helsinkir}rjX HèlsinkirsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAmerica/Bogotar}rjXBogotàrsUAtlantic/Cape_Verder}rjXCap VerdrsU Africa/Cairor}rjXEl CairersUAmerica/Grenadar}r jXGranadar!sUAmerica/El_Salvadorr"}r#jXSalvadorr$sUPacific/Tahitir%}r&jXTahitír'sUAmerica/Guadelouper(}r)jX Guadaluper*sU Europe/Praguer+}r,jXPragar-sU Europe/Berlinr.}r/jXBerlínr0sU Europe/Kievr1}r2jXKíevr3sUAmerica/Grand_Turkr4}r5jXIlles Turks i Caicosr6sUAsia/Ulaanbaatarr7}r8jX Ulan Batorr9sUAmerica/Asuncionr:}r;jX Asunciónr<sU Asia/Baghdadr=}r>jXBagdadr?sUIndian/Christmasr@}rAjXPasquarBsU Europe/ViennarC}rDjXVienarEsU Europe/ParisrF}rGjXParísrHsUIndian/MauritiusrI}rJjXMauricirKsUAmerica/St_VincentrL}rMjX Sant VicençrNsU Europe/DublinrO}rPjXDublínrQsUAmerica/Port-au-PrincerR}rSjX Port PrínceprTsUAmerica/CaymanrU}rVjXCaimanrWsUEurope/BrusselsrX}rYjX Brussel·lesrZsU Europe/Athensr[}r\jXAtenesr]sU Europe/Romer^}r_jXRomar`sUAmerica/Port_of_Spainra}rbjX Port EspanyarcsUAtlantic/Azoresrd}rejXAçoresrfsUEurope/Luxembourgrg}rhjX LuxemburgrisU Etc/Unknownrj}rkjXZona desconegudarlsUAmerica/Mexico_Cityrm}rnjXMèxic Districte FederalrosUAmerica/St_Kittsrp}rqjX St. KittsrrsU Asia/Seoulrs}rtjXSeülrusUAmerica/St_Thomasrv}rwjX Sant TomàsrxsUAfrica/Algiersry}rzjXAlgerr{sUAmerica/Panamar|}r}jXPanamàr~sUAntarctica/South_Poler}rjXPol sudrsU Europe/Lisbonr}rjXLisboarsuUscriptsr}r(UTamlrXTàmilrUHebrrXHebreurUZzzzrX#escriptura desconeguda o no vàlidarUCyrlrX Ciríl·licrUArmnrXArmenirULatnrXLlatírUBalirXBalinèsrUArabrXÀrabrUZxxxrXSense escripturarUCoptrXCopterUHansrXXinès Simplificat (Han)rULinbrXLineal BrULinarXLineal ArUHantrXXinès Tradicional (Han)rUMongrXMongolrUDevarX DevanagarirURunrrXRúnicrUBrairXBraillerUGrekrXGrecrUCherrXCherokeerUZyyyrXComúrUJpanrXJaponèsrUBatkrXBatakrUKanarXKatakanarUBengrXBengalíruUvariantsr}r(U1996rXortografia alemana de 1996rUPOSIXrX ordenadorrUFONIPArXalfabet fonètic internacionalrU1901rXortografia alemana tradicionalruUnumber_symbolsr}r(UgrouprX.rUnativeZeroDigitrX0rU exponentialrXErUperMillerX‰rUnanrXNaNrUdecimalrX,rU percentSignrh@UlistrX;rU patternDigitrX#rUplusSignrX+rUinfinityrX∞rU minusSignrh6uUcurrency_namesr}r(UCOPrXPeso colombiàrUUSDrX Dòlar EUArUDZDrXDinar algeriàrUTWDrXDòlar TaiwanèsrUSITrX Tolar eslovèrUMTLrX Lira maltesarUEGPrXLliura egípciarUBEFrX Franc belgarUBGNrX Lev búlgarrUFJDrX Dòlar fijiàrUPENrXNou sol peruàrUDEMrX Marc alemanyrUEEKrXCorona estonianarUBOBrX peso boliviàrUDKKrX Corona danesarUSKKrXCorona eslovacarUCADrXDòlar canadencrUPKRrXRupia paquistanesarUMXNrX Peso mexicàrUHUFrXForint hongarèsrUCYPrXLliura xipriotarUMADrXDirhem marroquírUCHFr X Franc suísr URONr XNou leu romanèsr UXEUr XUnitat de compte europearUPTErXEscut portuguèsrUMYRrXRinggit de MalàisiarUVEBrXBolívar veneçolàrUUAHrXHrívnia d’UcraïnarULTLrX Litas lituàrUNLGrXFlorí neerlandèsrUIEPrXLliura irlandesarUSARrX Rial saudírUEURrXEuror USEKr!X Corona suecar"USGDr#XDòlar De Singapurr$UGBPr%XLliura esterlina britànicar&ULUFr'XFranc luxemburguèsr(UAUDr)XDòlar australiàr*UADPr+XPesseta d'Andorrar,jXPesseta espanyolar-UIDRr.XRupia indonèsiar/UKRWr0XWon (Corea Del Sud)r1UCNYr2XIuan renmimbi xinèsr3UTRYr4XNova lira turcar5UGRDr6X Dracma gregar7UVNDr8XDong de Vietnamr9UATSr:XXíling austríacr;UHRKr<X Kuna croatar=UNZDr>XDòlar Neozelandèsr?ULVLr@XLatsrAUCLPrBX Peso xilèrCUTHBrDXBaht tailandèsrEUBNDrFXDòlar de BruneirGUTRLrHXLira turca (vella)rIUITLrJX Lira italianarKUARSrLX Peso argentírMUILSrNXXéquelrOUZARrPXRandrQUNOKrRXCorona noruegarSURSDrTX Dinar serbirUURUBrVX Ruble rusrWUFIMrXXMarc finlandèsrYUINRrZX Rupia índiar[UJPYr\X Ien japonèsr]UCZKr^X Corona txecar_UBRLr`X Real brasilerraUHKDrbXDòlar De Hong KongrcUFRFrdXFranc francèsreUPLNrfXNou zloty polonèsrgUPHPrhX Pes filipíriUKESrjXXíling kenyàrkUXXXrlX sense monedarmUAEDrnX Dirhem dels Emirats Àrabs UnitsrouUmonthsrp}rq(U stand-alonerr}rsUnarrowrt}ru(KXgrvKXfrwKXmrxKXaryKjxKXjrzKjzKjyK Xsr{K Xor|K Xnr}K Xdr~usUformatr}r(Uwider}r(KXgenerrKXfebrerrKXmarçrKXabrilrKXmaigrKXjunyrKXjuliolrKXagostrK XsetembrerK XoctubrerK XnovembrerK XdesembreruU abbreviatedr}r(KXgen.rKXfebr.rKXmarçrKXabr.rKXmaigrKXjunyrKXjul.rKXag.rK Xset.rK Xoct.rK Xnov.rK Xdes.ruuuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.X ¤rjrh1KKrh3X #,##0.00 ¤rh5h/h6rh8Nh9KKrubsUdaysr}r(U stand-aloner}r(U abbreviatedr}r(KXdlrKXdtrKXdcrKXdjrKXdvrKXdsrKXdgruUnarrowr}r(KXlrKXtrKXcrKjzKXvrKj{KjvuuUformatr}r(Uwider}r(KXdillunsrKXdimartsrKXdimecresrKXdijousrKX divendresrKXdissabterKXdiumengeruU abbreviatedr}r(KXdl.rKXdt.rKXdc.rKXdj.rKXdv.rKXds.rKXdg.ruuuU meta_zonesr}rUEurope_Centralr}r(Ushortr}rUgenericrXHora d'EspanyarsUcommonrUlongr}r(jXHora d'EspanyarUdaylightrXHora Central Europea de l'estiurUstandardrXHora Central EuropearuusUerasr}rU abbreviatedr}r(KXaCrKXdCrusu.PK[Rll*site-packages/babel/localedata/tg_Cyrl.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/cy_GB.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[D))(site-packages/babel/localedata/sr_RS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[{==(site-packages/babel/localedata/as_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[6J.ww*site-packages/babel/localedata/sr_Latn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUformatq}q(Uwideq }q (KXPrvo tromesečjeq KXDrugo tromesečjeq KXTreće tromesečjeq KXČetvrto tromesečjequU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq}q (Umin_daysq!KU weekend_startq"KU first_dayq#KU weekend_endq$KuU time_formatsq%}q&U languagesq'}q((Uguq)X Gudžaratiq*Ugdq+XŠkotski Galskiq,Ugaq-XIrskiq.Ugnq/XGvaraniq0Uglq1XGalskiq2Ulaq3XLatinskiq4Ulnq5XLingalaq6Uloq7XLaoškiq8Utrq9XTurskiq:Ulvq;XLetonskiqUtkq?X Turkmenskiq@UthqAX TajlandskiqBUtiqCXTigrinjaqDUteqEXTeluguqFUpt_PTqGXPortugalski (Portugalija)qHUfilqIXTagalogqJUhawqKXHavajskiqLUyiqMXJidišqNUdeqOXNemačkiqPUdaqQXDanskiqRUelqSXGrčkiqTUeoqUX EsperantoqVUenqWXEngleskiqXUzhqYXKineskiqZUzh_Hansq[XKineski (pojednostavljen)q\Uzh_Hantq]XKineski (tradicionalni)q^Uen_USq_XEngleski (SAD)q`UeuqaX BaskijskiqbUetqcXEstonskiqdUesqeXŠpanskiqfUruqgXRuskiqhUrmqiX Reto-RomanskiqjUroqkXRumunskiqlUbnqmX BengalskiqnUsuxqoXSumerskiqpUbeqqX BeloruskiqrUbgqsXBugarskiqtUukquX UkrajinskiqvUjvqwXJavanskiqxUbhqyXBiharskiqzUbrq{X Bretonskiq|Ubsq}XBosanskiq~UjaqXJapanskiqUocqX ProvansalskiqUundqXNepoznat ili nevažeći jezikqUtwqXTviqUtlhqX KlingonskiqUorqXOrijskiqUxhqXHausaqUcoqX KorzikanskiqUcaqX KatalonskiqUceqX ČečenskiqUcyqXVelškiqUcsqXČeškiqUcuqXStaroslovenskiqUpsqX PaštunskiqUptqX PortugalskiqUtlqXTagalskiqUchrqXČerokiqUpaqX PandžabskiqUviqX VijetnamskiqUplqXPoljskiqUhyqX JermenskiqUhrqXHrvatskiqUhuqX MađarskiqUhiqXHindiqUheqX HebrejskiqUuzqXUzbečkiqUmlqX MalajalamqUmoqX MoldavskiqUmnqX MongolskiqUmkqX MakedonskiqUurqXUrduqUmtqX MelteškiqUmsqXMalajskiqUmrqXMaratiqUugqXUjgurskiqUtaqXTamilskiqUmyqX BurmanskiqUafqX AfrikanerskiqUswqXSvahiliqUisqX IslandskiqUamqXAmharskiqUitqX ItalijanskiqUsvqXŠvedskiqUasqX AsemijskiqUarqXArapskiqUsuqXSudanskiqUzuqXZuluqUiaqX InterlingvaqUazqXAzerbejdžanskiqUieqX MeđujezičkiqUidqX IndonezijskiqUnlqX HolandskiqUnoqX NorveškiqUneqXNepalskiqUfrqX FrancuskiqUfyqX FrizijskiqUfaqX PersijskiqUfiqXFinskiqUkyqXKirgiskiqUfoqXFarskiqUkaqX GruzijskiqUsrqXSrpskiqUsqqXAlbanskiqUkoqXKorejskiqUknqXKanadarUkmrXKmerskirUstrXSesotorUskrX SlovačkirUsirX SingaleskirUshr XSrpsko-Hrvatskir Usor XSomalskir Ukur XKurdskirUslrX SlovenačkirUsarXSanskritrUsdrXSindiruU territoriesr}r(UBDrX BangladešrUBErXBelgijarUBFrX Burkina FasorUBGrXBugarskarUVErX Venecuelar UBAr!XBosna i Hercegovinar"UBBr#XBarbadosr$UWFr%XValis i Futuna Ostrvar&UBMr'XBermudar(UBNr)XBrunejr*UBOr+XBolivijar,UBHr-XBahreinr.UBIr/XBurundir0UBJr1XBeninr2UBTr3XButanr4U011r5XZapadna Afrikar6UBVr7X Buve Ostrvar8UBWr9XBocvanar:U014r;XIstočna Afrikar<U015r=XSeverna Afrikar>UBRr?XBrazilr@U017rAXCentralna AfrikarBU018rCX Južna AfrikarDU019rEXAmerikerFUBYrGX BelorusijarHUBZrIXBeliserJULVrKXLetonijarLURWrMXRuandarNURSrOXSrbijarPUTLrQXIstočni TimorrRURErSXRejunionrTUTMrUX TurkmenistanrVUTJrWX TadžikistanrXUROrYXRumunijarZUTKr[XTokelaur\UGWr]X Gvineja-Bisaor^UGUr_XGuamr`UGTraX GvatemalarbUGSrcX+Južna Džordžija i Južna Sendvič OstrvardUGRreXGrčkarfUGQrgXEkvatorijalna GvinejarhUGPriX GvadeluperjUJPrkXJapanrlUOMrmXOmanrnUGYroXGvajanarpUGGrqXGurnsirrUGFrsXFrancuska GvajanartUGEruXGruzijarvUGDrwXGrenadarxU021ryXSeverna AmerikarzUGBr{XVelika Britanijar|UGAr}XGabonr~USVrXSalvadorrUGNrXGvinejarUGMrXGambijarUGLrXGrenlandrU029rXKaribirUGIrX GibraltarrUGHrXGanarUJErXDžersirUTNrXTunisrUJMrXJamajkarU013rXCentralna AmerikarUWSrXSamoarU419rXLatinska Amerika i KaribirUHRrXHrvatskarUBSrXBahamirUHTrXHaitirUHUrX MađarskarUHKrXHong Kong (S. A. R. Kina)rU039rX Južna EvroparUHNrXHondurasrUFIrXFinskarU142rXAzijarU030rXIstočna AzijarU034rX Južna AzijarU035rXJugoistočna AzijarUPRrX Porto RikorUPSrXPalestinska TeritorijarU830rXKanalska ostrvarUFKrXFolklandska OstrvarUIOrX&Britansko Indijska Okeanska TeritorijarUPWrXPalaurUPTrXPortugalrUSJrXSvalbard i Janmajen OstrvarUMDrX MoldavijarUIQrXIrakrUPArXPanamarUPFrXFrancuska PolinezijarUPGrXPapua Nova GvinejarUPErXPerurUPKrXPakistanrUPHrXFilipinirUFOrX Farska OstrvarUPNrXPitcairnrUPLrXPoljskarUPMrXSen Pjer i MikelonrUZMrXZambijarUEHrXZapadna SahararURUrXRusijarUEErXEstonijarUEGrXEgipatrUZArXJužnoafrička RepublikarUECrXEkvadorrUITrXItalijarUVNrXVijetnamrUZZrXNepoznat ili nevažeći regionrUSBrXSolomonska OstrvarUETrXEtiopijarUSOrXSomalijarUZWrXZimbabverUSArXSaudijska ArabijarUESrXŠpanijarUERrXEritrejarUMErX Crna GorarUAQrX AntarktikarUMGrX MadagaskarrUMArXMarokorUMCrXMonakorUUZrX UzbekistanrUMMrXMijanmarrUMLr XMalir UMOr XMakao (S. A. R. Kina)r UMNr X MongolijarUHMrXHerd i Mekdonald OstrvarUASrXAmerička SamoarUMKrX MakedonijarUMUrX MauriciusrUMTrXMaltarUMWrXMalavirUMVrXMaldivirUMQrXMartinikrUMPrXSeverna Marijanska Ostrvar UMSr!XMonseratr"UMRr#X Mauritanijar$UIMr%X Ostrvo Manr&UUGr'XUgandar(UTZr)X Tanzanijar*UMYr+XMalezijar,UMXr-XMeksikor.UILr/XIzraelr0UFRr1X Francuskar2UAWr3XArubar4UDOr5XDominikanska Republikar6USHr7X Sveta Jelenar8UVCr9XSent Vinsent i Grenadinir:U054r;X Melanezijar<UDJr=XDžibutir>UFJr?XFidžir@U057rAX MicronezijarBUFMrCX MikronezijarDU053rEXAustralija i Novi ZelandrFUNIrGX NikaragvarHUNLrIX HolandijarJUNOrKX NorveškarLUNArMXNamibijarNUVUrOXVanuaturPUNCrQXNova KaledonijarRUNErSXNigerrTUNFrUXNorfolk OstrvorVUNGrWXNigerijarXUNZrYX Novi ZelandrZUNPr[XNepalr\UNRr]XNaurur^UNUr_XNiuer`U061raX PolinezijarbUCIrcXObala SlonovačerdUCHreX ŠvajcarskarfUCOrgX KolumbijarhUCNriXKinarjUCMrkXKamerunrlUCLrmXČilernUCCroXKokos (Keling) OstrvarpUCArqXKanadarrUCGrsXKongortUCFruXCentralno Afrička RepublikarvUCDrwXDemokratska Republika KongorxUCZryXČeškarzUCYr{XKiparr|UCXr}XBožićna Ostrvar~UCSrXSrbija i Crna GorarUCRrX KostarikarUPYrXParagvajrUCVrX Kape VerderUCUrXKubarUSZrX SvazilendrUSYrXSirijarUKGrX KirgizstanrUKErXKenijarUSRrXSurinamrUKIrXKiribatirUKHrX KambodžarUKNrXSent Kits i NevisrUKMrXKomorska OstrvarUSTrXSao Tome i PrinciperUSKrX SlovačkarUKRrX Južna KorejarUSIrX SlovenijarUKPrXSeverna KorejarUKWrXKuvajtrUSNrXSenegalrUSMrX San MarinorUSLrX Sijera LeonerUSCrXSejšelirUKZrX KazahstanrUKYrXKajmanska OstrvarUSGrXSingapurrUSErXŠvedskarUSDrXSudanrU151rXIstočna EvroparU150rXEvroparUDMrXDominikarU155rXZapadna EvroparU154rXSeverna EvroparUVGrXBritanska Devičanska OstrvarUDErXNemačkarUYErXJemenrUMHrXMaršalska OstrvarU062rXJužno-centralna AzijarUDZrXAlžirrUUSrXSjedinjene Američke DržaverUUYrXUrugvajrUYTrXMajoterUUMrXManja Udaljena Ostrva SADrULBrXLibanrULCrX Sent LucijarULArXLaosrUTVrXTuvalurUTWrXTajvanrUTTrXTrinidad i TobagorUTRrXTurskarULKrX Šri LankarULIrX LihtenštajnrUCKrX Kukova OstrvarUTOrXTongarULTrX LitvanijarULUrX LuksemburgrULRrXLiberijarULSrXLesotorUTHrXTajlandrUTFrXFrancuske Južne TeritorijerUTGrXTogorUTDrXČadrUTCrXTurks i Kajkos OstrvarULYrXLibijarUVArXVatikanrU145rX Zapadna AzijarUAErXUjedinjeni Arapski EmiratirUADrXAndorarUAGr XAntigva i Barbudar UAFr X Avganistanr UAIr XAngvilarUVIrXS.A.D. Devičanska OstrvarUISrXIslandrUIRrXIranrUAMrXArmenijarUALrXAlbanijarUAOrXAngolarUANrXHolandski AntilirU003rXSevernoamerički kontinentrU002rXAfrikar U001r!XSvetr"UARr#X Argentinar$UAUr%X Australijar&UATr'XAustrijar(U005r)XJužna Amerikar*UINr+XIndijar,UAXr-XAlandska ostrvar.U009r/XOkeanijar0UAZr1X Azerbejdžanr2UIEr3XIrskar4UIDr5X Indonezijar6UJOr7XJordanr8UQUr9XEvropska unijar:UUAr;XUkrajinar<UQAr=XKatarr>UDKr?XDanskar@UMZrAXMozambikrBUQOrCXOstala okeanijarDuUdecimal_formatsrE}rFU date_formatsrG}rHUcurrency_symbolsrI}rJ(UYUNrKXDinrLUCNYrMXUrNuU time_zonesrO}rP(UAtlantic/CanaryrQ}rRUcityrSXKanarska ostrvarTsUAntarctica/MawsonrU}rVjSXMosonrWsU Europe/ParisrX}rYjSXParizrZsUAmerica/Buenos_Airesr[}r\jSX Buenos Airesr]sU Europe/Minskr^}r_jSXMinskr`sUAmerica/Miquelonra}rbjSXMikelonrcsU Africa/Maserurd}rejSXMaserurfsUAfrica/Tripolirg}rhjSXTripolirisUPacific/Tongatapurj}rkjSX TongatapurlsUEurope/Tallinnrm}rnjSXTalinrosU Indian/Maherp}rqjSXMaherrsU Asia/Colombors}rtjSXKolomborusUPacific/Wallisrv}rwjSXValisrxsUAntarctica/Davisry}rzjSXDejvisr{sUAfrica/Libreviller|}r}jSXLibrevilr~sUAfrica/Freetownr}rjSXFritaunrsUAsia/Kamchatkar}rjSX KamčatkarsU Africa/Bissaur}rjSXBisaorsU Asia/Dhakar}rjSXDakarsUAmerica/St_Luciar}rjSX Sv. LucijarsUEurope/Amsterdamr}rjSX AmsterdamrsUAmerica/Montserratr}rjSX MontseratrsUAfrica/Nairobir}rjSXNajrobirsU Europe/Tiraner}rjSXTiranarsUPacific/Saipanr}rjSXSajpanrsUAmerica/Maceior}rjSXMasejorsUAfrica/Abidjanr}rjSXAbidžanrsUAfrica/Djiboutir}rjSXDžibutirsU Africa/Cairor}rjSXKairorsUAmerica/Grenadar}rjSXGrenadarsUAmerica/El_Salvadorr}rjSXSalvadorrsU Europe/Madridr}rjSXMadridrsUPacific/Kiritimatir}rjSX KiritimatirsUAmerica/Santiagor}rjSX SantijagorsU Asia/Dubair}rjSXDubairsU Asia/Kuwaitr}rjSXKuvajtrsUPacific/Noumear}rjSXNumearsUAsia/Ulaanbaatarr}rjSX Ulan BatorrsUAfrica/Dar_es_Salaamr}rjSX Dar-es-SalamrsUIndian/Maldivesr}rjSXMaldivirsUAntarctica/Rotherar}rjSXRoterarsUEurope/Stockholmr}rjSXStokholmrsU Pacific/Fijir}rjSXFidžirsU Pacific/Apiar}rjSXApijarsUAmerica/Port-au-Princer}rjSX Port-o-PrensrsUPacific/Pago_Pagor}rjSX Pago PagorsU America/Arubar}rjSXArubarsUAmerica/Caymanr}rjSXKajmanska ostrvarsU Europe/Athensr}rjSXAtinarsU Pacific/Guamr}rjSXGuamrsU Pacific/Trukr}rjSXTrukrsUAmerica/Curacaor}rjSXKirasorsU Asia/Rangoonr}rjSXRangunrsUAmerica/Port_of_Spainr}rjSX Port of SpejnrsU Africa/Luandar}rjSXLuandarsUPacific/Funafutir}rjSXFanafutirsUIndian/Kerguelenr}rjSXKergelenrsUAfrica/Khartoumr}rjSXKartumrsUAmerica/Puerto_Ricor}rjSX Porto RikorsUIndian/Mauritiusr}rjSX MauricijusrsU Asia/Manilar}rjSXManilarsU Africa/Lomer }r jSXLomer sU Europe/Rigar }r jSXRigarsU Europe/Berlinr}rjSXBerlinrsU Europe/Zurichr}rjSXCirihrsUAmerica/Guatemalar}rjSX GvatemalarsU Asia/Tbilisir}rjSXTbilisirsU America/Belemr}rjSXBelemrsU Africa/Doualar}rjSXDualar sU Europe/Romer!}r"jSXRimr#sU America/Limar$}r%jSXLimar&sUAfrica/Sao_Tomer'}r(jSXSao Tomer)sUAmerica/Managuar*}r+jSXManagvar,sUPacific/Kosraer-}r.jSXKošrer/sUAfrica/Bujumburar0}r1jSX Budžumburar2sUEurope/Chisinaur3}r4jSXKišnjevr5sUPacific/Port_Moresbyr6}r7jSX Port Morzbir8sUAsia/Krasnoyarskr9}r:jSX Krasnojarskr;sUAmerica/Boa_Vistar<}r=jSX Boa Vistar>sUEurope/Andorrar?}r@jSXAndorarAsUAfrica/MbabanerB}rCjSXMbabanerDsUAtlantic/BermudarE}rFjSXBermudirGsUAmerica/AraguainarH}rIjSX AragvajanarJsUAntarctica/CaseyrK}rLjSXKasejrMsU Asia/BakurN}rOjSXBakurPsU America/ThulerQ}rRjSXTulerSsU Pacific/NiuerT}rUjSXNiuerVsUIndian/ReunionrW}rXjSX UjedinjenjerYsUAtlantic/StanleyrZ}r[jSXStenlir\sUAmerica/St_Thomasr]}r^jSXSv. Tomar_sUEurope/Helsinkir`}rajSXHelsinkirbsUPacific/Majurorc}rdjSXMajuroresUPacific/Aucklandrf}rgjSXOklandrhsUAtlantic/Cape_Verderi}rjjSX Kape VerderksUAsia/Hong_Kongrl}rmjSX Hong KongrnsU Asia/Macauro}rpjSXMakaurqsU Indian/Cocosrr}rsjSXKokosova ostrvartsUAsia/Choibalsanru}rvjSX ČojbalsanrwsUAmerica/Guadelouperx}ryjSX GvadaluperzsUEurope/Copenhagenr{}r|jSX Kopenhagenr}sUAmerica/Nassaur~}rjSXNasaursU Europe/Kievr}rjSXKijevrsUAntarctica/Syowar}rjSXŠovarsUPacific/Enderburyr}rjSX EnderberirsUAntarctica/McMurdor}rjSXMakMurdorsU Asia/Hovdr}rjSXHovdrsUAmerica/Danmarkshavnr}rjSX DanmarkshagenrsUAmerica/Jamaicar}rjSXJamajkarsUAmerica/Scoresbysundr}rjSX SkorezbisundrsUAmerica/Caracasr}rjSXKarakasrsU Asia/Baghdadr}rjSXBagdadrsUAfrica/Monroviar}rjSX MonrovijarsUAmerica/Manausr}rjSXManausrsUAmerica/Noronhar}rjSXNoronjarsU Asia/Ammanr}rjSXAmanrsU Asia/Kabulr}rjSXKabulrsUPacific/Fakaofor}rjSXFakaoforsUIndian/Antananarivor}rjSX AntananarivorsUAfrica/Windhoekr}rjSXVindhukrsUAmerica/St_Vincentr}rjSX Sent VinsentrsU Pacific/Waker}rjSXVakersUPacific/Gambierr}rjSXGambijersUAtlantic/Reykjavikr}rjSX RejkjavikrsU Africa/Hararer}rjSXHararersU Asia/Nicosiar}rjSXNikozijarsU Africa/Bamakor}rjSXBamakorsUEurope/Uzhgorodr}rjSXUžgorodrsUPacific/Ponaper}rjSXPonapersU Africa/Banjulr}rjSXBanžulrsUEurope/Budapestr}rjSX BudimpeštarsU Asia/Thimphur}rjSXThimphursUAmerica/Sao_Paulor}rjSX Sao PaolorsUAmerica/Belizer}rjSXBelizersU Pacific/Palaur}rjSXPalaursU Africa/Malabor}rjSXMalaborsUPacific/Pitcairnr}rjSXPitkairnrsU Asia/Tashkentr}rjSXTaškentrsU Asia/Tokyor}rjSXTokiorsUPacific/Easterr}rjSXUskršnje ostrvorsU Asia/Jakartar}rjSX DžakartarsU Asia/Karachir}rjSXKaračirsUAntarctica/Palmerr}rjSXPalmerrsUAmerica/Godthabr}rjSXNukrsUAfrica/Johannesburgr}rjSX JohanesburgrsU Asia/Muscatr}rjSXMuskatrsUAtlantic/South_Georgiar}rjSXJužna DžordžijarsUAfrica/El_Aaiunr}r jSXEl Ajunr sU Asia/Dilir }r jSXDilir sUAsia/Kuala_Lumpurr}rjSX Kuala LumpurrsUAfrica/Blantyrer}rjSXBlantirrsUAmerica/Campo_Grander}rjSX Kampo GrandersU Asia/Adenr}rjSXAdenrsU Asia/Ashgabatr}rjSXAšhabadrsUEurope/Istanbulr}rjSXIstanbulrsU Asia/Bangkokr }r!jSXBankokr"sUAfrica/Kinshasar#}r$jSXKinšasar%sUAntarctica/Vostokr&}r'jSXVostokr(sUEurope/Bucharestr)}r*jSX Bukureštr+sU Africa/Niameyr,}r-jSXNijamejr.sUAsia/Pyongyangr/}r0jSX Pjongjangr1sU Asia/Anadyrr2}r3jSXAnadirr4sUEurope/Gibraltarr5}r6jSX Gibraltarr7sUAmerica/Porto_Velhor8}r9jSX Porto Veljor:sUAfrica/Nouakchottr;}r<jSX Navakšutr=sUPacific/Galapagosr>}r?jSX Galapagosr@sU Europe/MonacorA}rBjSXMonakorCsU Asia/BishkekrD}rEjSXBiškekrFsUAmerica/BogotarG}rHjSXBogotarIsU Asia/AqtoberJ}rKjSXAkutoberLsUAmerica/ReciferM}rNjSXResiferOsU Africa/AccrarP}rQjSXAkrarRsUEurope/VilniusrS}rTjSXViljnusrUsUAmerica/CayennerV}rWjSXKajenrXsU Africa/DakarrY}rZjSXDakarr[sU Asia/Taipeir\}r]jSXTajpejr^sUPacific/Kwajaleinr_}r`jSX KvadžalejinrasUAmerica/Fortalezarb}rcjSX FortalezardsU Asia/Yerevanre}rfjSXJerevanrgsUAmerica/La_Pazrh}rijSXLa PazrjsU Pacific/Naururk}rljSXNaururmsUAfrica/Mogadishurn}rojSXMogadišrpsUAmerica/Cuiabarq}rrjSXKuiabarssU Africa/Lusakart}rujSXLusakarvsU Europe/Moscowrw}rxjSXMoskvarysUPacific/Guadalcanalrz}r{jSX Gvadalkanalr|sUIndian/Christmasr}}r~jSXBožićno ostrvorsUAmerica/Rio_Brancor}rjSX Rio BrankorsUAfrica/Addis_Ababar}rjSX Adis AbebarsU Pacific/Efater}rjSXEfatersU Asia/Aqtaur}rjSXAktaursUPacific/Johnstonr}rjSX DžonstonrsUAsia/Vientianer}rjSX VijetijanrsUAmerica/Havanar}rjSXHavanarsUEurope/Brusselsr}rjSXBriselrsU Europe/Lisbonr}rjSXLisabonrsUAfrica/Conakryr}rjSXKonakrirsU Asia/Makassarr}rjSXMakasarrsUAtlantic/Azoresr}rjSXAzorirsUAfrica/Kampalar}rjSXKampalarsUAsia/Singaporer}rjSXSingapurrsU Europe/Oslor}rjSXOslorsU Asia/Shanghair}rjSXŠangajrsUAmerica/St_Kittsr}rjSX Sent KitsrsU Africa/Ceutar}rjSXSeutarsU Asia/Beirutr}rjSXBejrutrsUAfrica/Algiersr}rjSXAlžirrsUAmerica/Panamar}rjSXPanamarsUAfrica/Ndjamenar}rjSX NdžamenarsU Africa/Maputor}rjSXMaputorsUAmerica/Guayaquilr}rjSXGvajakilrsU Asia/Bahrainr}rjSXBahreinrsU Europe/Londonr}rjSXLondonrsUAmerica/Costa_Ricar}rjSX KostarikarsU Indian/Chagosr}rjSXČagosrsU Asia/Riyadhr}rjSXRijadrsU Asia/Jayapurar}rjSX DžajapurarsUIndian/Mayotter}rjSXMajotersUAsia/Phnom_Penhr}rjSXPnom PenrsUAfrica/Gaboroner}rjSXGaboronrsUAtlantic/Faeroer}rjSX Farska OstrvarsU Europe/Warsawr}rjSXVaršavarsUAmerica/Montevideor}rjSX MontevideorsU Africa/Tunisr}rjSXTunisrsUAmerica/Anguillar}rjSXAngvilarsU Asia/Damascusr}rjSXDamaskrsU Asia/Qatarr}rjSXKatarrsU Asia/Bruneir}rjSXBrunejirsUAmerica/Guyanar}rjSXGuanarsU Asia/Katmandur}rjSXKatmandursUAtlantic/St_Helenar}rjSX Sveta JelenarsUAmerica/Barbadosr}rjSXBarbadosrsUEurope/Luxembourgr}rjSX Luksemburgr sU Africa/Banguir }r jSXBanguir sU Asia/Gazar }rjSXGazarsUAmerica/Martiniquer}rjSXMartinikrsUAntarctica/DumontDUrviller}rjSXDimon d’UrvilrsUAmerica/Antiguar}rjSXAntigvarsU Asia/Almatyr}rjSXAlma-AtarsUPacific/Midwayr}rjSXMidvejrsUPacific/Tahitir}r jSXTahitir!sUAmerica/Santo_Domingor"}r#jSX Santo Domingor$sUAfrica/Casablancar%}r&jSX Kazablankar'sU Africa/Kigalir(}r)jSXKigalir*sUAmerica/Paramaribor+}r,jSX Paramirbor-sUAfrica/Lubumbashir.}r/jSX Lumumbašir0sUAfrica/Brazzaviller1}r2jSXBrazavilr3sUAmerica/Grand_Turkr4}r5jSX Grand Turkr6sUPacific/Marquesasr7}r8jSXMarkizr9sUAmerica/Asuncionr:}r;jSXAsunsionr<sU Europe/Viennar=}r>jSXBečr?sU Asia/Seoulr@}rAjSXSeulrBsUPacific/NorfolkrC}rDjSXNorfolkrEsU Europe/DublinrF}rGjSXDablinrHsU Africa/LagosrI}rJjSXLagosrKsUEurope/ZaporozhyerL}rMjSX ZaporožjerNsU Europe/SofiarO}rPjSXSofijarQsUPacific/RarotongarR}rSjSX RarotongarTsUAmerica/DominicarU}rVjSXDominikarWsU Europe/MaltarX}rYjSXMaltarZsUAfrica/Porto-Novor[}r\jSX Porto Novor]sUAmerica/Tortolar^}r_jSXTortolar`sU Asia/Dushanbera}rbjSXDušanbercsU Europe/Vaduzrd}rejSXVaducrfsU Asia/Tehranrg}rhjSXTeheranrisU Etc/Unknownrj}rkjSXNepoznat ili nevažeći gradrlsU Indian/Comororm}rnjSXKomororosUAmerica/Anchoragerp}rqjSX EnkoridžrrsUPacific/Tarawars}rtjSXTaravarusUAfrica/Ouagadougourv}rwjSXUagadugurxsU Africa/Asmerary}rzjSXAsmerar{sUAntarctica/South_Poler|}r}jSX Južni polr~suUscriptsr}r(UHebrrXhebrejsko pismorUGeorrXgruzijsko pismorUZzzzrXNepoznato ili nevažeće pismorUCyrlrX ĆirilicarUHrktrXKatakana ili HiraganarUArmnrXjermensko pismorUCyrsrX Staroslovenska crkvena ćirilicarULatfrXLatinica (Fraktur varijanta)rUKhmrrX kmersko pismorULatnrXLatinicarUDsrtrXDezeretrUGothrXGotikarUEthirXetiopsko pismorUArabrX arapsko pismorUZxxxrXNepisani jezikrUCoptrXkoptičko pismorUHansrXpojednostavljeno kinesko pismorUGlagrX glagoljicarUHantrXtradicionalno kinesko pismorUDevarX DevanagarirURunrrX runsko pismorUHirarXHiraganarUPhnxrXFeničansko pismorUBrairX Brajevo pismorUGrekrX grčko pismorUCherrXČerokirUKanarXKatakanarUBengrXbengalsko pismoruUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UCOPrXKolumbijski pezorUUSDrXAmerički dolarrUGBPrXFunta sterlingarUTWDrXNovi tajvanski dolarrUSITrXTolarrUMTLrXMalteška lirarUEGPrXEgipatska funtarUBEFrXBelgijski franakrUBGNrX Bugarski levrUFJDrX Fidži dolarrUPENrXPeruanski nuevo solrUDEMrXNemačka markarUEEKrXEstonska kroonrUBOBrXBolivijski BolivianorUBAMrXKonvertibilna markarUDKKrX Danska krunarUSKKrXSlovačka krunarUCADrXKanadski dolarrUPKRrXPakistanski rupirUMXNrXMeksički pesorUHUFrXMađarska forintarUVNDrXVijetnamski dongrUKWDrXKuvajtski dinarrURONrX Rumunski leurUPTErXPortugalski eskudorUMYRrXMalezijski ringgitrUZARrXJužna Afrika RandrUUAHrXUkrajinska hrivnjarULTLrXLitvanski litasrUNLGrXHolandski guldenrUIEPrX Irska funtarUEURrXEVROrUSEKrXŠvedska krunarUSGDrXSingapurski dolarrUHKDrXHong Kongski DolarirULUFrXLuksemburški franakrUAUDrXAustralijski dolarrUCHFr XŠvajcarski franakr UESPr XŠpanska pezetar UCSDr X!Srpski Dinar (Srbija i Crna Gora)rUKRWrXJužno-korejski VonrjMXKineski Juan RenminbirUTRYrXNova turska lirarUGRDrXDrahmarUATSrXAustrijski šilingrUHRKrXKunarUNZDrXNovozelandski dolarrUHRDrXHrvatski dinarrUCLPrXČileanski pezorUBNDr XBrunejski dolarr!UTRLr"X Turska lirar#UITLr$XItalijanska lirar%UARSr&XArgentinski pezor'UILSr(XIzraelski šekelr)UIDRr*XIndonezijska rupiahr+UNOKr,XNorveška krunar-URSDr.X Srpski Dinarr/URUBr0X Ruska rubljar1UFIMr2X Finska markar3UINRr4X Indijski Rupir5UJPYr6XJenr7UCZKr8X Češka krunar9UBRLr:XBrazilski Realr;UMADr<XMarokanski dirhamr=UFRFr>XFrancuski franakr?URURr@XRuska rublja (1991-1998)rAUVEBrBXVenecuelanski bolivarrCUPHPrDXFilipinski pesorEUKESrFXKenijski šilingrGUXXXrHXNepoznata ili nevažeća valutarIUAEDrJX!Ujedinjeni arapski emirati dirhamrKuUmonthsrL}rM(U stand-alonerN}rOUnarrowrP}rQ(KXjrRKXfrSKXmrTKXarUKjTKjRKjRKjUK XsrVK XorWK XnrXK XdrYusUformatrZ}r[(Uwider\}r](KXjanuarr^KXfebruarr_KXmartr`KXaprilraKXmajrbKXjunrcKXjulrdKXavgustreK X septembarrfK XoktobarrgK XnovembarrhK XdecembarriuU abbreviatedrj}rk(KXjanrlKXfebrmKXmarrnKXaprroKXmajrpKXjunrqKXjulrrKXavgrsK XseprtK XoktruK XnovrvK XdecrwuuuUcurrency_formatsrx}ryUdaysrz}r{(U stand-aloner|}r}Unarrowr~}r(KXprKXurKjVKXčrKjKjVKjXusUformatr}r(Uwider}r(KX ponedeljakrKXutorakrKXsredarKX četvrtakrKXpetakrKXsubotarKXnedeljaruU abbreviatedr}r(KXponrKXutorKXsrerKXčetrKXpetrKXsubrKXnedruuuU meta_zonesr}rUEurope_Centralr}r(UcommonrUlongr}r(UdaylightrXCentralnoevropsko letnje vremerUstandardrXCentralnoevropsko vremeruusUerasr}r(Uwider}r(KX Pre nove ererKXNove ereruU abbreviatedr}r(KXp. n. e.rKXn. eruUnarrowr}r(KXp.n.e.rKXn. e.ruuu.PK[:  %site-packages/babel/localedata/ig.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXA.M.qUpmqXP.M.quUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\UNGNq]X₦q^sU time_zonesq_}q`Uscriptsqa}qbUvariantsqc}qdUnumber_symbolsqe}qfUcurrency_namesqg}qhh]XNaịraqisUmonthsqj}qk(U stand-aloneql}qmUnarrowqn}qo(KX1qpKX2qqKX3qrKX4qsKX5qtKX6quKX7qvKX8qwK X9qxK X10qyK X11qzK X12q{usUformatq|}q}(Uwideq~}q(KX JenụwarịqKX FebrụwarịqKXMaachịqKXEprelqKXMeeqKXJuunqKXJulaịqKX ỌgọọstqK XSeptembaqK XỌktobaqK XNovembaqK XDisembaquU abbreviatedq}q(KXJenqKXFebqKXMaaqKXEprqKXMeeqKXJuuqKXJulqKXỌgọqK XSepqK XỌktqK XNovqK XDisquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhqKhrKhsKhtKhuKhvKhpusUformatq}q(Uwideq}q(KXMọndeqKXTiuzdeeqKXWenezdeeqKX TọọzdeeqKX FraịdeeqKX SatọdeeqKXMbọsị ỤkaquU abbreviatedq}q(KXMọnqKXTiuqKXWenqKXTọọqKXFraịqKXSatqKXỤkaquuuU meta_zonesq}qUerasq}q(Uwideq}q(KX Tupu KristiqKX Afọ KristiquU abbreviatedq}q(KXT.K.qKXA.K.quuu.PK[r8^^-site-packages/babel/localedata/uz_Arab_AF.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (U weekend_startq KU first_dayq KU weekend_endq KuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq }q!u.PK[::(site-packages/babel/localedata/ms_BN.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXH:mm:ssqUformatqX%(H)s:%(mm)s:%(ss)squbUlongqh)q}q(hX H:mm:ss zqhX%(H)s:%(mm)s:%(ss)s %(z)squbUshortqh)q}q (hXH:mmq!hX %(H)s:%(mm)sq"ubuU languagesq#}q$U territoriesq%}q&Udecimal_formatsq'}q(U date_formatsq)}q*(Umediumq+h)q,}q-(hX dd/MM/yyyyq.hX%(dd)s/%(MM)s/%(yyyy)sq/ubUfullq0h)q1}q2(hX dd MMMM yyyyq3hX%(dd)s %(MMMM)s %(yyyy)sq4ubuUcurrency_symbolsq5}q6UBNDq7X$q8sU time_zonesq9}q:Uscriptsq;}qUnumber_symbolsq?}q@(UdecimalqAX,qBUgroupqCX.qDuUcurrency_namesqE}qFUmonthsqG}qHUcurrency_formatsqI}qJNcbabel.numbers NumberPattern qK)qL}qM(Uexp_precqNNUscaleqOKU frac_precqPKKqQUsuffixqRXqShSqTUint_precqUKKqVhX ¤ #,##0.00qWUprefixqXX¤ qYX-¤ qZq[Uexp_plusq\NUgroupingq]KKq^ubsUdaysq_}q`U meta_zonesqa}qbUerasqc}qdu.PK[]Y::%site-packages/babel/localedata/wo.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UfrqAXFraañseqBUenqCXAngaleqDUnlqEXOlaandeqFUptqGX PortugeesqHUnoqIX NorweejieeqJUdeqKXAlmaaqLUitqMXItaalieeqNUdaqOXDanwaaqPUfiqQX FinlaandeqRUsvqSX SuweedwaaqTUjaqUXJapponeqVUesqWX EspañoolqXuU territoriesqY}qZUdecimal_formatsq[}q\U date_formatsq]}q^(Umediumq_h))q`}qa(h,X yyyy MMM dqbh.X%(yyyy)s %(MMM)s %(d)sqcubUfullqdh))qe}qf(h,XEEEE, yyyy MMMM ddqgh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqhubUlongqih))qj}qk(h,X yyyy MMMM dqlh.X%(yyyy)s %(MMMM)s %(d)sqmubUshortqnh))qo}qp(h,Xyy/MM/ddqqh.X%(yy)s/%(MM)s/%(dd)sqrubuUcurrency_symbolsqs}qtU time_zonesqu}qvUscriptsqw}qxUvariantsqy}qzUnumber_symbolsq{}q|Ucurrency_namesq}}q~Umonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KhKhKhKhKhKhKhKhK hK X10qK X11qK X12quU abbreviatedq}q(KhKhKhKhKhKhKhKhK hK X10qK X11qK X12quuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KhKhKhKhKhKhKhuU abbreviatedq}q(KhKhKhKhKhKhKhuuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[FwF(site-packages/babel/localedata/it_CH.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q(UpatternqXHH.mm:ss 'h' vqUformatqX%(HH)s.%(mm)s:%(ss)s h %(v)squbsU languagesq}qU territoriesq}q Udecimal_formatsq!}q"U date_formatsq#}q$(Umediumq%h)q&}q'(hX d-MMM-yyyyq(hX%(d)s-%(MMM)s-%(yyyy)sq)ubUfullq*h)q+}q,(hXEEEE, d MMMM yyyyq-hX!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)sq.ubUlongq/h)q0}q1(hX d MMMM yyyyq2hX%(d)s %(MMMM)s %(yyyy)sq3ubUshortq4h)q5}q6(hXdd.MM.yyq7hX%(dd)s.%(MM)s.%(yy)sq8ubuUcurrency_symbolsq9}q:U time_zonesq;}qUvariantsq?}q@Unumber_symbolsqA}qB(UdecimalqCX.qDUgroupqEX'qFuUcurrency_namesqG}qHUmonthsqI}qJUcurrency_formatsqK}qLNcbabel.numbers NumberPattern qM)qN}qO(Uexp_precqPNUscaleqQKU frac_precqRKKqSUsuffixqTXqUhUqVUint_precqWKKqXhX ¤ #,##0.00qYUprefixqZX¤ q[X¤-q\q]Uexp_plusq^NUgroupingq_KKq`ubsUdaysqa}qbU meta_zonesqc}qdUerasqe}qfu.PK[#&site-packages/babel/localedata/kfo.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUNGNqgXNeiraqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KX Fai WeyeneqKXFai FaniqKX Fai TatakaqKX Fai NangraqKXFai TuyoqKX Fai TsoyiqKX Fai TafakaqKX Fai WarachiqK X Fai KunobokqK X Fai BansokqK XFai KomqK XFai SaukquU abbreviatedq}q(KXWeyqKXFanqKXTatqKXNanqKXTuyqKXTsoqKXTafqKXWarqK XKunqK XBanqK XKomqK XSauquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KX Je-KubachaqKXJe-GbaiqKXTansatiqKXJe-YeiqKXJe-KoyeqKXSatiqKXLahadiquU abbreviatedq}q(KXKubqKXGbaqKXTanqKXYeiqKXKoyqKXSatqKXLahquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXKafi Mar WenomqKXBayan Chi WenomquU abbreviatedq}q(KXKMWqKXBCWquuu.PK[99(site-packages/babel/localedata/th_TH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[99(site-packages/babel/localedata/mn_CN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[޲ee%site-packages/babel/localedata/ky.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UelqAX грекчеqBUguqCXгужаратчаqDUenqEXанглисчеqFUzhqGXкытайчаqHUafqIXафрикаанчаqJUswqKXсуахиличеqLUcaqMXкаталанчаqNUitqOXиталиянчаqPUsvqQX шведчеqRUarqSX арабчаqTUsuqUXсунданчаqVUgaqWXирландчаqXUgnqYX гуарашqZUcsq[Xчех тилиq\Uetq]Xэстончоq^Uazq_Xазербайжанчаq`UidqaXиндонезиячаqbUesqcXиспанчаqdUpsqeX паштоqfUsrqgX сербчеqhUnlqiXголландчаqjUnnqkXнорвегиячаqlUlaqmXлатынчаqnUtwqoXтвиqpUjvqqXжаванизчеqrUneqsXнепалчаqtUtrquX туркчоqvUlvqwXлатвиячаqxUltqyXлитвачаqzUpaq{Xпунжабичеq|Utkq}Xтүркмөнq~UthqX тайчаqUviqXвьетнамчаqUslqXсловенчеqUroqXрумыниячаqUisqXисландчаqUfilqXтагалчаqUtaqXтамилчеqUyiqX еврейqUbeqXбеларусчаqUfrqXфранцузчаqUbgqXболгариячаqUmsqXмалайчаqUruqX орусчаqUhrqXхорватчаqUbnqXбангладешчеqUdeqXнемисчеqUbhqXбихаричеqUdaqX датчаqUfaqX фарзчаqUhiqXиндусчаqUbrqX бретонqUbsqXбосниячаqUfiqX финчеqUhuqXвенгриячаqUurqX урдучаqUjaqX япончоqUukqXукраинчеqUheqXеврейчеqUkaqXгрузинчеqUteqXтелугучаqUptqXпортугалчаqUuzqXозбекчеqUmlqXмалайаламчаqUsqqXалбанчаqUnoqXнорвежчеqUkoqXкорейчеqUknqXканнадачаqUmkqXмакедониячаqUstqX сесотоqUskqXсловакчаqUmtqXмалтизчеqUsiqXсингалачаqUshqXсерб-хорватqUplqXполякчаqUkuqXкуртqUmrqXмаратичеqUkyqX КыргызqUtlhqXклингончоqUorqXорияquU territoriesq}qUKGqXКыргызстанqsUdecimal_formatsq}qU date_formatsq}q(Umediumqh))q}q(h,X yyyy MMM dqh.X%(yyyy)s %(MMM)s %(d)squbUfullqh))q}q(h,XEEEE, yyyy MMMM ddqh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)squbUlongqh))q}q(h,X yyyy MMMM dqh.X%(yyyy)s %(MMMM)s %(d)squbUshortqh))q}q(h,Xyy/MM/ddqh.X%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}rUscriptsr}rUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}rUmonthsr }r (U stand-aloner }r Unarrowr }r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KjKjKjKjKjKjKjKjK jK X10rK X11r K X12r!uU abbreviatedr"}r#(KjKjKjKjKjKjKjKjK jK X10r$K X11r%K X12r&uuuUcurrency_formatsr'}r(Udaysr)}r*(U stand-aloner+}r,Unarrowr-}r.(KjKjKjKjKjKjKjusUformatr/}r0(Uwider1}r2(KjKjKjKjKjKjKjuU abbreviatedr3}r4(KjKjKjKjKjKjKjuuuU meta_zonesr5}r6Uerasr7}r8U abbreviatedr9}r:(KXBCEr;KXCEr<usu.PK[D))-site-packages/babel/localedata/sr_Latn_RS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[DG+G+%site-packages/babel/localedata/ia.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX1-me trimestreq KX2-nde trimestreq KX3-tie trimestreqKX4-te trimestrequU abbreviatedq}q(KXT1qKXT2qKXT3qKXT4quusUperiodsq}q(UamqXa.m.qUpmqXp.m.quUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAXgujaratiqBUgdqCX scoto gaelicqDUgaqEX irlandeseqFUgnqGXguaraniqHUglqIXgallegoqJUlaqKXlatinoqLUlnqMXlingalaqNUloqOXlaotianoqPUtrqQXturcoqRUlvqSXlettonqTUltqUXlithuanoqVUtkqWXturkmenoqXUthqYXthaiqZUtiq[Xtigrinyaq\Uteq]Xteluguq^Ufilq_Xtagalogq`UtaqaXtamilqbUyiqcXyiddishqdUdeqeXgermanoqfUdaqgXdaneseqhUelqiXgrecoqjUeoqkX esperantoqlUenqmXangleseqnUen_USqoX anglese (SUA)qpUeuqqXbascoqrUetqsX estonianoqtUesquXespaniolqvUruqwXrussoqxUroqyX romanianoqzUbnq{Xbengaliq|Ubeq}X bielorussoq~UbgqXbulgaroqUukqX ukrainianoqUjvqXjavaneseqUbhqXbihariqUbrqXbretonqUbsqXbosniacoqUjaqXjaponeseqUocqXoccitanoqUtwqXtwiqUtlhqXKlingonqUorqXoriyaqUxhqXxhosaqUcaqXcatalanoqUcyqXgalleseqUcsqXchecoqUpsqXpashtoqUptqX portugeseqUpaqXpunjabiqUviqX vietnameseqUplqXpoloneseqUhyqX armenianoqUhrqXcroatoqUhuqXhungaroqUhiqXhindiqUheqXhebreoqUuzqXuzbecoqUmlqX malayalamqUmnqX mongolicoqUmkqXmacedoneqUurqXurduqUmtqXmalteseqUen_GBqX anglese (RU)qUmsqXmalayqUmrqXmarathiqUugqXUyghurqUafqX afrikaansqUswqXswahiliqUisqX islandeseqUamqXamharicoqUitqXitalianoqUsvqXsvedeseqUasqXAssameseqUarqXarabeqUsuqX sundaneseqUzuqXzuluqUiaqX interlinguaqUazqX azerbaidzhaniqUieqX InterlingueqUidqX indonesianoqUnlqX nederlandeseqUnnqXnorvegiano (nynorsk)qUnoqX norvegianoqUneqXnepaleseqUfrqXfranceseqUfyqXfrisianoqUfaqXpersianoqUfiqXfinneseqUkyqXkirghizoqUfoqXfaroeseqUkaqX georgianoqUsrqXserboqUsqqXalbaneseqUkoqXcoreanoqUknqXkannadaqUkmqX CambodianorUstrXsesothorUskrXslovacorUsirX sinhaleserUshrX serbocroaterUsor Xsomalir Ukur Xkurdor Uslr XslovenorUsarX sanscritorUsdrXsindhiruU territoriesr}r(UBDrX BangladeshrUBErXBelgicarUBFrX Burkina FasorUBGrXBulgariarUBArXBosnia e HerzegovinarUBOrXBoliviar UJPr!XJaponr"UBIr#XBurundir$UBJr%XBeninr&UBTr'XBhutanr(UBVr)XInsula de Bouvetr*UBWr+XBotswanar,UWSr-XSamoar.UBRr/XBrasilr0UBSr1XBahamasr2UBYr3X Bielorussiar4UTNr5XTunisiar6URWr7XRuandar8UTLr9X Timor del Estr:UTJr;X Tadzhikistanr<UROr=XRomaniar>UTKr?XTokelaur@UGWrAX Guinea-BissaurBUGRrCXGreciarDUGQrEXGuinea equatorialrFUGFrGXGuyana franceserHUGErIXGeorgiarJUGBrKX Regno UniterLUGArMXGabonrNUGNrOXGuinearPUGMrQXGambiarRUGLrSX GroenlandiarTUGHrUXGhanarVUOMrWXOmanrXUJOrYXJordaniarZUHRr[XCroatiar\UHTr]XHaitir^UHUr_XHungariar`UHNraXHondurasrbUPTrcXPortugalrdUPYreXParaguayrfUPFrgXPolynesia franceserhUPGriXPapua Nove GuinearjUPErkXPerurlUPKrmXPakistanrnUPHroX PhilippinasrpUPLrqXPoloniarrUZMrsXZambiartUEHruXSahara occidentalrvUEErwXEstoniarxUEGryXEgyptorzUZAr{XAfrica del Sudr|UECr}XEcuadorr~UITrXItaliarUSBrXInsulas SolomonrUETrXEthiopiarUZWrXZimbabwerUSArXArabia SauditarUESrXEspaniarUERrXEritrearUMDrXMoldaviarUMGrX MadagascarrUMArXMaroccorUUZrX UzbekistanrUMMrXBirmania/MyanmarrUMLrXMalirUMNrXMongoliarUMHrXInsulas MarshallrUMKrX MacedoniarUMWrXMalawirUMPrXInsulas Marianna del NordrUMRrX MauritaniarUUGrXUgandarUMYrXMalaysiarUMXrXMexicorUILrXIsraelrUFRrXFranciarUFIrX FinlandiarUFMrX MicronesiarUFOrX Insulas FeroerUNIrX NicaraguarUNLrX NederlandiarUNOrXNorvegiarUNArXNamibiarUVUrXVanuaturUNCrXNove CaledoniarUNErXNigerrUNFrXInsula NorfolkrUNGrXNigeriarUNZrX Nove ZelandarUNPrXNepalrUCKrX Insulas CookrUCHrXSuissarUCOrXColombiarUCNrXChinarUCMrXCamerunrUCLrXChilerUCArXCanadarUCGrXCongorUCFrXRepublica African CentralrUCZrXRepublica TchecrUCYrXCyprorUCXrXInsula de NatalrUUYrXUruguayrUCUrXCubarUSZrX SwazilandiarUSYrXSyriarUKGrX KirghizistanrUKErXKenyarUSRrXSurinamerUKIrXKiribatirUKHrX CambodgiarUKNrXSancte Christophoro e NevisrUKMrXComorosrUSKrX SlovachiarUKRrX Corea del SudrUSIrXSloveniarUKPrXCorea del NordrUSOrXSomaliarUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCr X Seychellesr UKZr X Kazakhstanr UKYr XInsulas de CaimanrUSErXSvediarUSDrXSudanrUDOrXRepublica DominicanrUDKrXDanmarkrUDErXGermaniarUYErXYemenrUDZrXAlgeriarUUSrX Statos UniterULBrXLibanor ULCr!X Sancte Luciar"UTVr#XTuvalur$UTWr%XTaiwanr&UTTr'XTrinidad e Tobagor(UTRr)XTurchiar*ULKr+X Sri Lankar,ULIr-X Liechtensteinr.ULVr/XLettoniar0UTOr1Xtongar2ULTr3XLituaniar4UTMr5X Turkmenistanr6ULRr7XLiberiar8ULSr9XLesothor:UTHr;X Thailandiar<UTFr=XTerritorios meridional franceser>UTGr?XTogor@UTDrAXTchadrBUTCrCXInsulas Turcos e CaicosrDULYrEXLibyarFUVCrGXSancte Vincente e le GrenadinasrHUAErIXEmiratos Arabe UniterJUVErKX VenezuelarLUAGrMXAntigua e BarbudarNUAFrOX AfghanistanrPUIQrQXIrakrRUISrSXIslandarTUIRrUXIranrVUAMrWXArmeniarXUALrYXAlbaniarZUAOr[XAngolar\UANr]XAntillas nederlandeser^UAQr_X Antarcticar`UASraXSamoa americanrbUARrcX ArgentinardUAUreX AustraliarfUATrgXAustriarhUIOriX"Territorio oceanic britanno-indianrjUINrkXIndiarlUTZrmXTanzaniarnUAZroX AzerbaidzhanrpUIErqXIrlandarrUIDrsX IndonesiartUUAruXUkrainarvUMZrwX MozambiquerxuUdecimal_formatsry}rzU date_formatsr{}r|(Umediumr}h))r~}r(h,X yyyy MMM drh.X%(yyyy)s %(MMM)s %(d)srubUfullrh))r}r(h,XEEEE, yyyy MMMM ddrh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srubUlongrh))r}r(h,X yyyy MMMM drh.X%(yyyy)s %(MMMM)s %(d)srubUshortrh))r}r(h,Xyy/MM/ddrh.X%(yy)s/%(MM)s/%(dd)srubuUcurrency_symbolsr}rU time_zonesr}r(UPacific/Pitcairnr}rUcityrXInsula PitcairnrsUIndian/Mayotter}rjXMayottarsUAfrica/Djiboutir}rjXDjibutirsUAmerica/Martiniquer}rjX MartinicarsUEurope/Luxembourgr}rjX LuxemburgrsUIndian/Maldivesr}rjXMaldivasrsUAmerica/Puerto_Ricor}rjX Porto RicorsUAtlantic/Cape_Verder}rjX Capo VerdersUAsia/Hong_Kongr}rjXHongkongrsUAmerica/Grenadar}rjXGranadarsUIndian/Mauritiusr}rjXMauritiorsuUscriptsr}rUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UUSDrXDollares statouniteserUAUDrXDollares australianrUCHFrXFrancos suisserUNOKrXCoronas norvegianrUJPYrX Yen japoneserUDEMrX Marcos germanrUFRFrXfrancos franceserUCADrXDollares canadianrUSEKrXCoronas svedeserUDKKrXCoronas daneserUGBPrXLibras sterling britannicrUEURrXEurosruUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KXjanuariorKX februariorKXmartiorKXaprilrKXmaiorKXjuniorKXjuliorKXaugustorK X septembrerK XoctobrerK XnovembrerK XdecembreruU abbreviatedr}r(KXjanrKXfebrKXmarrKXaprrKXmairKXjunrKXjulrKXaugrK XseprK XoctrK XnovrK XdecruuuUcurrency_formatsr}rUdaysr }r (U stand-aloner }r Unarrowr }r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r(KXlunedirKXmartedirKX mercuridirKXjovedirKXvenerdirKXsabbatorKXdominicaruU abbreviatedr}r(KXlunrKXmarrKXmerrKXjovrKXvenr KXsabr!KXdomr"uuuU meta_zonesr#}r$Uerasr%}r&(Uwider'}r((KX ante Christor)KX post Christor*uU abbreviatedr+}r,(KXa.Chr.r-KXp.Chr.r.uuu.PK[Rll(site-packages/babel/localedata/ku_TR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[QK~~(site-packages/babel/localedata/om_KE.datnu[}q(Ucurrency_symbolsq}qUETBqXETBqsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q U week_dataq }q (Umin_daysq KU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[1ll(site-packages/babel/localedata/sk_SK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[iㆼPP%site-packages/babel/localedata/vi.datnu[}q(U zone_formatsq}qUfallbackqX %(1)s (%(0)s)qsUdatetime_formatsq}qNX{0} {1}qsUquartersq}q Uformatq }q (Uwideq }q (KXQ1qKXQ2qKXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXSAqUpmqXCHquUscientific_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#KKq$Uscaleq%KU frac_precq&KKq'Usuffixq(Xq)h)q*Uint_precq+KKq,Upatternq-X#E0q.Uprefixq/h)X-q0q1Uexp_plusq2Ugroupingq3MMq4ubsUpercent_formatsq5}q6Nh )q7}q8(h#Nh%Kdh&KKq9h(X%q:h:q;h+KKqh2Nh3KKq?ubsU week_dataq@}qA(Umin_daysqBKU weekend_startqCKU first_dayqDKU weekend_endqEKuU time_formatsqF}qG(UmediumqHcbabel.dates DateTimePattern qI)qJ}qK(h-XHH:mm:ssqLUformatqMX%(HH)s:%(mm)s:%(ss)sqNubUfullqOhI)qP}qQ(h-X HH:mm:ss vqRhMX%(HH)s:%(mm)s:%(ss)s %(v)sqSubUlongqThI)qU}qV(h-X HH:mm:ss zqWhMX%(HH)s:%(mm)s:%(ss)s %(z)sqXubUshortqYhI)qZ}q[(h-XHH:mmq\hMX %(HH)s:%(mm)sq]ubuU languagesq^}q_(Uguq`XTiếng GujaratiqaUgdqbXTiếng Xentơ (Xcốt len)qcUgaqdXTiếng Ai-lenqeUgnqfXTiếng GuaraniqgUglqhXTiếng GalicianqiUlaqjXTiếng La-tinhqkUlnqlXTiếng LingalaqmUloqnX Tiếng LàoqoUtrqpXTiếng Thổ Nhĩ KỳqqUlvqrXTiếng Lát-vi-aqsUltqtXTiếng Lít-vaquUtkqvXTiếng Tuôc-menqwUthqxX Tiếng TháiqyUtiqzXTiếng Tigrigyaq{Uteq|XTiếng Teluguq}Upt_PTq~X!Tiếng Bồ Đào Nha (I-bê-ri)qUfilqXTiếng PhilipinqUtaqX Tiếng TamilqUyiqXTiếng Y-đitqUpt_BRqXTiếng Bồ Đào Nha (Braxin)qUdeqXTiếng ĐứcqUdaqXTiếng Đan MạchqUelqXTiếng Hy LạpqUeoqXTiếng Quốc Tế NgữqUenqX Tiếng AnhqUzhqXTiếng Trung QuốcqUzh_HansqX#Tiếng Trung Quốc (Giản thể)qUzh_HantqX#Tiếng Trung Quốc (Phồn thể)qUen_USqXTiếng Anh (Mỹ)qUeuqXTiếng BasqueqUetqXTiếng E-xtô-ni-aqUesqXTiếng Tây Ban NhaqUruqX Tiếng NgaqUrmqXTiếng Rhaeto-RomanceqUroqXTiếng Ru-ma-niqUbnqXTiếng Bengali (Ấn Độ)qUbeqXTiếng Bê-la-rútqUbgqXTiếng Bun-ga-riqUukqXTiếng U-crai-naqUwoqX Tiếng WolofqUjvqXTiếng Gia-vaqUboqXTiếng Tây TạngqUbhqXTiếng BihariqUbrqXTiếng BretonqUbsqXTiếng Nam TưqUjaqXTiếng NhậtqUocqXTiếng OccitanqUundqXundqUtwqX Tiếng TwiqUtlhqXTiếng KlingonqUorqXTiếng Ô-ri-aqUxhqX Tiếng BantuqUcaqXTiếng Ca-ta-lăngqUcyqXTiếng XentơqUcsqX Tiếng SécqUpsqXTiếng Pa-tôqUptqXTiếng Bồ Đào NhaqUtlqXTiếng TagalogqUpaqXTiếng PunjabiqUviqXTiếng ViệtqUplqXTiếng Ba LanqUhyqXTiếng Ác-mê-niqUhrqXTiếng Crô-a-ti-aqUhuqXTiếng Hung-ga-riqUhiqXTiếng Hin-điqUheqXTiếng Hê-brơqUuzqXTiếng U-dơ-bếchqUmlqXTiếng MalayalamqUmnqXTiếng Mông CổqUmkqXTiếng Ma-xê-đô-ni-aqUurqX Tiếng UđuqUmtqXTiếng MantơqUen_GBqXTiếng Anh (Anh)qUmsqXTiếng Ma-lay-xi-aqUmrqXTiếng MarathiqUugqXTiếng UighurqUafqXTiếng Nam PhiqUswqXTiếng Bantu (Đông Phi)qUisqXTiếng Ai-xơ-lenqUamqXTiếng AmharicqUitrX Tiếng ÝrUsvrXTiếng Thụy ĐiểnrUiarXTiếng Khoa Học Quốc TếrUasrX Tiếng AssamrUarrXTiếng A-rậpr Usur XTiếng Xu đăngr Uzur X Tiếng Zulur UayrXTiếng AymararUazrXTiếng Ai-déc-bai-gianrUierXTiếng Khoa học quốc tếrUidrXTiếng In-đô-nê-xiarUskrXTiếng Xlô-vácrUnlrXTiếng Hà LanrUnnrXTiếng Na Uy (Nynorsk)rUnorX Tiếng Na UyrUnerXTiếng Nê-panrUfrr X Tiếng Phápr!Ufyr"XTiếng Frisianr#Ufar$XTiếng Ba Tưr%Ufir&XTiếng Phần Lanr'Ukyr(XTiếng Kyrgyzr)Ufor*X Tiếng Faorer+Ukar,XTiếng Georgianr-Usrr.XTiếng Séc-bir/Usqr0XTiếng An-ba-nir1Ukor2XTiếng Hàn Quốcr3Uknr4XTiếng Kan-na-đar5Ukmr6XTiếng Campuchiar7Ustr8XTiếng Sesothor9Uksr:XTiếng Kashmirir;Usir<XTiếng Sinhalar=Ushr>XTiếng Xéc bi - Croatiar?Usor@XTiếng Xô-ma-lirAUkurBXTiếng Kurd (Iran)rCUslrDXTiếng Xlô-venrEUsarFXTiếng PhạnrGUsdrHXTiếng Sin-hirIuU territoriesrJ}rK(UBDrLXBăng-la-đétrMUBErNXBỉrOUBFrPXBuốc-ki-na Pha-xôrQUBGrRX Bun-ga-rirSUVErTXVê-nê-zu-ê-larUUBArVXBô-xni-a Héc-xê-gô-vi-narWUBBrXXBác-ba-đốtrYUWFrZXWallis và Futunar[UBLr\XBLr]UBNr^XBru-nâyr_UBOr`X Bô-li-vi-araUBHrbXBa-renrcUBIrdX Bu-run-đireUBJrfXBê-nanhrgUBTrhXBu-tan (Bhutan)riU011rjXTây PhirkUBVrlXĐảo Bouvet (Na Uy)rmUBWrnX Bốt-xoa-naroU014rpX Đông PhírqU015rrX Bắc PhirsUBRrtXBra-xinruU017rvX Trung PhirwU018rxXMiền Nam Châu PhiryU019rzX Châu Mỹr{UBYr|X Bê-la-rútr}UBZr~X Bê-li-xêrULVrX Lát-vi-arURWrX Ru-an-đarURSrXXéc-birUTLrX Đông Ti-morURErXRErUTMrXTuốc-mê-ni-xtanrUOMrXÔ-manrUTJrXTát-gi-ki-xtanrUROrXRu-ma-nirUTKrXTokelaurUGWrXGhi-nê Bít-xaorUGUrX Đảo Gu-amrUGTrX Goa-tê-ma-larUGSrX*Quần đảo Nam Georgia và Nam SandwichrUGRrXHy LạprUGQrXGhi-nê Xích-đạorUJPrX Nhật BảnrUKIrX Ki-ri-ba-tirUGYrXGuy-a-narUGGrXGuernseyrUGFrXQuiana thuộc PháprUGErXGru-di-arUGDrX Grê-na-đarU021rXMiền Bắc Châu MỹrUGBrXVương quốc AnhrUGArXGa-bôngrUSVrX En-san-va-đorUGNrXGhi-nêrUGMrX Găm-bi-arUGLrX Băng ĐảorU029rX Ca-ri-bêrUGHrXGha-narUJErXJerseyrUTNrX Tuy-ni-dirUJMrX Ha-mai-carU013rX Trung MỹrUWSrXXa-moarU419rXChâu Mỹ La-tinh và Ca-ri-berUHRrX Crô-a-ti-arUBSrXBa-ha-marUHTrXHa-i-tirUHUrX Hung-ga-rirUHKrX;Đặc khu hành chính Hồng Kông thuộc CHND Trung HoarU039rXNam ÂurUHNrX Hôn-đu-rátrUFIrX Phần LanrU142rXChâu ÁrU030rX Đông ÁrU034rXNam ÁrU035rX Đông Nam ÁrUPSrXLãnh thổ PalestinerUFKrXQuần Đảo FalklandrUPTrXBồ Đào NharUSJrXSvalbard và Jan MayenrUMDrX Môn-đô-varUPArXPa-na-marUPFrXPolynesia thuộc PháprUPGrXPa-pu-a Niu Ghi-nêrUPErXPê-rurUPKrX Pa-ki-xtanrUPHrX Phi-lip-pinrUFOrXQuần Đảo FaroerUPLrXBa LanrUPMrXSaint Pierre và MiquelonrUZMrX Dăm-bi-arUEHrX Tây SahararURUrXNgarUEErX E-xtô-ni-arUEGrXAi Cậpr UZAr XNam Phir UECr X Ê-cu-a-đor UITrXÝrUVNrX Việt NamrUZZrX+Vùng Chưa biết hoặc không Hợp lệrUSBrXQuần đảo Xô-lô-môngrUETrX Ê-ti-ô-pi-arUSOrX Xô-ma-lirUZWrX Dim-ba-bu-êrUSArXA-rập Xê-útrUESrX Tây Ban NharUERr XÊ-ri-tơ-rê-ar!UMEr"X Montenegror#UAQr$X Nam Cựcr%UMGr&XMa-đa-gát-xcar'UMFr(XMFr)UMAr*XMa-rốcr+UMCr,X Mô-na-côr-UUZr.XU-dơ-bê-ki-xtanr/UMMr0XMi-an-mar1UMLr2XMa-lir3UMOr4X4Đặc khu hành chính Macao thuộc CHND Trung Hoar5UMNr6X Mông Cổr7UHMr8X'Đảo Heard và Quần đảo McDonaldr9UASr:XĐảo Somoa thuộc Mỹr;UMKr<XMa-xê-đô-ni-ar=UMUr>X Mô-ri-xơr?UMTr@XMan-tarAUMWrBXMa-la-uyrCUMVrDX Man-đi-vơrEUMQrFXMQrGUMPrHXQuần Đảo Bắc MarianarIUMRrJX Mô-ri-ta-nirKUIMrLX Đảo ManrMUUGrNX U-gan-đarOUTZrPX Tan-da-ni-arQUMYrRX Ma-lay-xi-arSUMXrTX Mê-hi-côrUUILrVXI-xra-enrWUFRrXXPháprYUIOrZX+Thuộc địa Anh tại Ấn Độ Dươngr[UDOr\XCộng hoà Đô-mi-ni-car]USHr^X Saint Helenar_UVCr`XXan Vin-xen và Grê-na-dinraU054rbX MelanesiarcUDJrdXGi-bu-tireUFJrfXPhi-girgU057rhXVùng MicronesianriUFMrjXMi-crô-nê-xi-arkU053rlXÚc và New ZealandrmUNIrnX Ni-ca-ra-goaroUNLrpXHà LanrqUNOrrXNa UyrsUNArtX Nam-mi-bi-aruUVUrvX Va-nu-a-turwUNCrxX New CaledoniaryUNErzXNi-giêr{UNFr|XĐảo Norfolkr}UNGr~X Ni-giê-ri-arUNZrX Niu Di-lânrUNPrXNê-panrU061rX PolynesiarUCIrXBờ Biển NgàrUCHrX Thụy SĩrUCOrX Cô-lôm-bi-arUCNrX Trung QuốcrUCMrX Ca-mơ-runrUCLrXChi-lêrUCCrXQuần đảo CocosrUCArX Ca-na-đarUCGrX Công-gôrUCFrXCộng hòa Trung PhirUCDrXCộng hoà dân chủ CôngôrUCZrXCộng hòa SécrUCYrXSíprUCXrXĐảo Giáng SinhrUCSrXSéc-biarUCRrXCốt-xta Ri-carUPYrX Pa-ra-goayrUCVrXCáp-verUCUrXCu BarUSZrX Xoa-di-lenrUSYrXXi-rirUKGrXCư-rơ-gư-xtanrUKErXKê-ni-arUSRrX Xu-ri-namrU143rXTrung ÁrUKHrX CampuchiarUKNrXXan-kít và Nê-virUKMrXCô-môrUSTrXXao Tô-mê và Prin-xi-pêrUSKrX Xlô-va-ki-arUKRrX Hàn QuốcrUSIrX Xlô-ven-ni-arUKPrXBắc Triều TiênrUKWrXCô-oétrUSNrX Xê-nê-ganrUSMrX Xan Ma-ri-nôrUSLrXXi-ê-ra Lê-ônrUSCrXXây-senrUKZrX Ka-dắc-xtanrUKYrXQuần Đảo CaymanrUSGrX Xin-ga-porUSErXThụy ĐiểnrUSDrX Xu-đăngrU151rX Đông ÂurU150rX Âu ChâurU155rXTây ÂurU154rXMiền Bắc Châu ÂurUVGrXĐảo Virgin, thuộc AnhrUDErXĐứcrUYErXY-ê-menrUMHrXQuần đảo Mác-sanrU062rX Trung Nam ÁrUDZrX An-giê-rirUUSrXHoa KỳrUUYrX U-ru-goayrUYTrXYTrUUMrX,Các đảo nhỏ xa trung tâm thuộc MỹrULBrXLi-băngrULCrX Xan Lu-xirULArXLàorUTVrXTu-va-lurUTWrX Đài LoanrUTTrXTri-ni-đát và Tô-ba-gôrUTRrXThổ Nhĩ KỳrULKrX Xri Lan-carULIrXLich-ten-xtênr UCKr XQuần Đảo Cookr UTOr XTông-gar ULTrX Li-tu-a-ni-arULUrX Lúc-xăm-buarULRrX Li-bê-ri-arULSrX Lê-xô-thôrUTHrX Thái LanrUTFrXThuộc Địa Nam của PháprUTGrXTô-gôrUTDrXSátrUTCrXQuần Đảo Turk và CaicosrULYr XLi-bir!UVAr"X Va-ti-căngr#U145r$XTây Ár%UAEr&X1Các Tiểu Vương quốc A-rập Thống nhấtr'UADr(XAndorrar)UAGr*XAn-ti-gu-a và Ba-bu-đar+UAFr,XÁp-ga-ni-xtanr-UIQr.XI-rắcr/UVIr0XQuần đảo Virgin, Mỹr1UISr2X Ai-xơ-lenr3UIRr4XI-ranr5UAMr6X Ác-mê-ni-ar7UALr8XAn-ba-nir9UAOr:X Ăng-gô-lar;UANr<XTây Ấn Hà Lanr=U003r>X Bắc Mỹr?U002r@X Châu PhirAU001rBX Thế giớirCUARrDX Ác-hen-ti-narEUAUrFXÚcrGUATrHXÁorIU005rJXNam MỹrKUINrLX Ấn ĐộrMUAXrNXQuần đảo AlandrOU009rPXChâu Đại DươngrQUAZrRXAi-déc-bai-gianrSUIErTXAi-lenrUUIDrVX Nam DươngrWUJOrXX Gióc-đa-nirYUQUrZXLiên Minh Châu Âur[UUAr\X U-crai-nar]UQAr^XCa-tar_UDKr`X Đan MạchraUMZrbXMô-dăm-bíchrcUQOrdX*Vùng xa xôi thuộc Châu Đại DươngreuUdecimal_formatsrf}rgNh )rh}ri(h#Nh%Kh&KKrjh(h)h)rkh+KKrlh-X #,##0.###rmh/h)h0rnh2Nh3KKroubsU date_formatsrp}rq(UmediumrrhI)rs}rt(h-X dd-MM-yyyyruhMX%(dd)s-%(MM)s-%(yyyy)srvubUfullrwhI)rx}ry(h-X!EEEE, 'ngày' dd MMMM 'năm' yyyyrzhMX-%(EEEE)s, ngày %(dd)s %(MMMM)s năm %(yyyy)sr{ubUlongr|hI)r}}r~(h-X!'Ngày' dd 'tháng' M 'năm' yyyyrhMX'Ngày %(dd)s tháng %(M)s năm %(yyyy)srubUshortrhI)r}r(h-X dd/MM/yyyyrhMX%(dd)s/%(MM)s/%(yyyy)srubuUcurrency_symbolsr}rUVNDrX₫rsU time_zonesr}r(UAmerica/Belizer}rUcityrX Belize TimersUAtlantic/Canaryr}rjXQuần Đảo CanaryrsUAmerica/Guatemalar}rjXGuatemala TimersU Asia/Bahrainr}rjX Bahrain TimersUAfrica/Djiboutir}rjX Djibouti TimersUAmerica/Costa_Ricar}rjXCosta Rica TimersUAtlantic/South_Georgiar}rjX1South Georgia and the South Sandwich Islands TimersU Asia/Qatarr}rjX Qatar TimersUAmerica/St_Luciar}rjXSaint Lucia TimersUEurope/Andorrar}rjX Andorra TimersUAsia/Singaporer}rjXSingapore TimersUEurope/Luxembourgr}rjXLuxembourg TimersUAmerica/Barbadosr}rjX Barbados TimersUAmerica/St_Thomasr}rjXU.S. Virgin Islands TimersU Europe/Monacor}rjX Monaco TimersUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAtlantic/Cape_Verder}rjXCape Verde TimersUAsia/Hong_Kongr}rjXHong Kong SAR China TimersUAmerica/Grenadar}rjX Grenada TimersUAmerica/El_Salvadorr}rjXEl Salvador TimersUAmerica/Jamaicar}rjX Jamaica TimersUIndian/Maldivesr}rjX Maldives TimersU Pacific/Fijir}rjX Fiji TimersU Asia/Taipeir}rjX Taiwan TimersUAsia/Vientianer}rjX Laos TimersU Asia/Kuwaitr}rjX Kuwait TimersUAmerica/St_Vincentr}rjX%Saint Vincent and the Grenadines TimersUAmerica/Dominicar}rjX Dominica TimersU Europe/Maltar}rjX Malta TimersU Etc/Unknownr}rjX Không rõrsU Asia/Saigonr}rjXGiờ Việt NamrsUAmerica/St_Kittsr}rjXSaint Kitts and Nevis TimersUIndian/Mauritiusr}rjXMauritius TimersU Pacific/Palaur}rjX Palau TimersUAmerica/Guyanar}rjX Guyana TimersUAmerica/Panamar}rjX Panama TimersU Pacific/Naurur}rjX Nauru TimersuUscriptsr}r(UZxxxrXZxxxrUZzzzrXZzzzruUvariantsr}rUnumber_symbolsr}r(UgrouprX.rUnativeZeroDigitrX0r U exponentialr XEr Unanr XNaNr UdecimalrX,rU percentSignrh:UlistrX;rU patternDigitrX#rUplusSignrX+rUinfinityrX∞rU minusSignrh0uUcurrency_namesr}r(UGNSrX Syli GuinearUILPrX Pao IxraenrUUSDr X Đô-la Mỹr!UGBPr"X Bảng Anhr#UTWDr$XĐô-la Đài Loanr%UGHSr&X Cedi Ghanar'UIDRr(XRupia Inđônêxiar)UHNLr*XHonduras Lempirar+UBGNr,X Lép Bungarir-UFJDr.X Đô-la Fi-jir/UPENr0XNuevo Sol Pêrur1UGNFr2X Franc Guinear3UGWPr4XPeso Guinea-Bissaur5UEEKr6X Crun Extôniar7UGHCr8XCedi Ghana (1979-2007)r9UIQDr:X Dinar I-rắcr;USKKr<XCuaron Xlôvácr=UTRLr>XLia Thổ Nhĩ Kỳr?UPKRr@X Rupi PakistanrAUMXNrBX Peso MêhicôrCUHUFrDXPhôrin HungarirEUGYDrFXĐô-la GuyanarGUMADrHXĐiaham MarốcrIURONrJX Lây RumanirKUMYRrLXRinhgit MalaixiarMUUAHrNXRúp U-crai-narOUJODrPX Dinar JordanrQUSARrRXRian Ả rập XêútrSULTLrTX Litat LituanirUUSEKrVXCua-ron Thuỵ ĐiểnrWUSGDrXXĐô-la SingaporerYUHKDrZXĐô-la Hồng Kôngr[UGELr\X Lari Georgiar]UFRFr^X Franc Phápr_UCHFr`XFranc Thụy sĩraUGIPrbX Pao GibraltarrcUIEPrdX Pao Ai-lenreUIRRrfX Rial I-ranrgUKRWrhXWon Hàn QuốcriUCNYrjXCNYrkUTRYrlXLia Thổ Nhĩ Kỳ MớirmUGTQrnXQuetzal GuatemalaroUGRDrpXDrachma Hy LạprqjXđồngrrUVEBrsXBôliva VênêduêlartUMTLruXLia xứ Man-tơrvUNZDrwXĐô-la New ZealandrxUSITryXTôla XlôvêniarzUTHBr{XBạt Thái Lanr|UEURr}XEuror~UHTGrX Gourde HaitirUITLrXLia ÝrUILSrX Sêken IxraenrUKZTrXKazakhstan TengerUNOKrX Curon Na UyrURSDrX Đina Xéc-birUZARrX Ran Nam PhirUINRrXRupi Ấn ĐộrUJPYrX Yên NhậtrURUBrXRúp NgarUBRLrXBRLrUJMDrXĐô la JamaicarUPLNrX Zloty Ba LanrUPHPrXPeso PhilíppinrUKESrXSi-ling Kê-ny-arUXXXrX1Tiền tệ chưa biết hoặc không hợp lệrUXAUrXVàngrUAEDrX Điram UAEruUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KX tháng mộtrKX tháng hairKX tháng barKX tháng tưrKX tháng nămrKX tháng sáurKX tháng bảyrKX tháng támrK X tháng chínrK Xtháng mườirK Xtháng mười mộtrK Xtháng mười hairuU abbreviatedr}r(KXthg 1rKXthg 2rKXthg 3rKXthg 4rKXthg 5rKXthg 6rKXthg 7rKXthg 8rK Xthg 9rK Xthg 10rK Xthg 11rK Xthg 12ruuuUcurrency_formatsr}rNh )r}r(h#Nh%Kh&KKrh(X ¤rjrh+KKrh-X #,##0.00 ¤rh/h)h0rh2Nh3KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r(KX Thứ hairKXThứ barKX Thứ tưrKX Thứ nămrKX Thứ sáurKX Thứ bảyrKX Chủ nhậtruU abbreviatedr}r(KXTh 2rKXTh 3rKXTh 4rKXTh 5rKXTh 6rKXTh 7rKXCNruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXtr. CNrKXsau CNrusu.PK[ v%site-packages/babel/localedata/cs.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX1. čtvrtletíqKX2. čtvrtletíqKX3. čtvrtletíqKX4. čtvrtletíquU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quuuUperiodsq}q(Uamq Xdop.q!Upmq"Xodp.q#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XH:mm:ssqRUformatqSX%(H)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X HH:mm:ss vqXhSX%(HH)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X HH:mm:ss zq]hSX%(HH)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XH:mmqbhSX %(H)s:%(mm)sqcubuU languagesqd}qe(Uzh_HantqfXčínština (tradiční)qgUgvqhX manštinaqiUguqjX gujaratštinaqkUugaqlX ugaritštinaqmUgdqnXskotská galštinaqoUgaqpXirštinaqqUgnqrX guaranštinaqsUglqtX haličštinaquUlbqvXLucemburštinaqwUlaqxXlatinaqyUlnqzX lingalštinaq{Uloq|X laoštinaq}Uttq~X tatarštinaqUtrqX turečtinaqUtsqXtsongaqUlvqX lotyštinaqUtoqXtongaqUltqX litevštinaqUtkqX turkmenštinaqUthqX thajštinaqUtiqXtigrinijštinaqUtgqX tádžičtinaqUteqX telugštinaqUfilqX tagalogštinaqUhawqX havajskýqUyiqXjidišqUyoqXyorubaqUdeqX němčinaqUdaqX dánštinaqUdzqXbhútánštinaqUstqXsesothoqUquqXkečuánštinaqUbalqX balúčštinaqUarpqX arapažštinaqUelqX řečtinaqUeoqX esperantoqUenqX angličtinaqUzhqX čínštinaqUbeqX běloruštinaqUtpiqX tok pisinqUzh_HansqXčínština (zjednodušená)qUzaqXzhuangqUen_USqXangličtina (USA)qUeuqX baskičtinaqUetqX estonštinaqUesqXšpanělštinaqUruqXruštinaqUrwqXkinyarwandštinaqUde_ATqXněmecky (Rakousko)qUrmqXrétorománštinaqUrnqXkirundiqUroqX rumunštinaqUbnqX bengálštinaqUsuxqX sumerskýqUen_CAqXanglicky (Kanada)qUbgqX bulharštinaqUbaqX baskirštinaqUwaqX valonštinaqUwoqXwolofqUbmqX bambarštinaqUjvqX javánštinaqUboqX tibetštinaqUbhqX biharštinaqUbiqX bislámštinaqUbrqX bretaňštinaqUbsqX bosenštinaqUjaqX japonštinaqUomqX Oromo (Afan)qUtyqX tahitštinaqUocqXoccitanqUakkqX akkadštinaqUundqXneznámý nebo neplatný jazykqUtwqXtwiqUtlhqX klingonštinaqUorqXoriyaqUxhqXxhosaqUcoqX korsičtinaqUcarXkatalánštinarUcyrX velštinarUcsrX češtinarUpsrXPashto (Pushto)rUptrXportugalštinar Utlr Xtagalogr Uukr X ukrajinštinar UparXpaňdžábštinarUvirX vietnamštinarUakrX akanštinarUplrX polštinarUhyrX arménštinarUhrrX chorvatštinarUiurXinuktitutštinarUhurX maďarštinarUhirX hindštinarUhar Xhausar!Uher"X hebrejštinar#Umgr$X malgaštinar%Uuzr&X uzbečtinar'Umlr(X malabarštinar)Umor*X moldavštinar+Umnr,X mongolštinar-Umir.X maorštinar/Uikr0X inupiakštinar1Umkr2X makedonštinar3Uurr4X urdštinar5Umtr6X maltštinar7Uainr8X ainštinar9Umsr:X malajštinar;Umrr<Xmarathir=Uugr>X uighurštinar?Utar@X tamilštinarAUmyrBX barmštinarCUslarDXslovanský jazykrEUaarFX afarštinarGUabrHX abcházštinarIUaerJXavestánštinarKUssrLX siswatštinarMUbhorNX bhojpurštinarOUafrPXafrikánštinarQUtnrRX setswanštinarSUswrTX svahilštinarUUisrVX islandštinarWUamrXX amharštinarYUitrZX italštinar[Uanr\X aragonštinar]Uiar^X interlinguar_Uasr`X assaméštinaraUarrbX arabštinarcUanprdXangikareUsurfX sundanštinargUavrhX avarštinariUayrjX aymárštinarkUazrlXazerbajdžánštinarmUiernX interlingueroUidrpX indonéštinarqUskrrX slovenštinarsUnlrtX nizozemštinaruUnnrvXnorština (nynorsk)rwUnorxX norštinaryUnarzXnaurur{Uner|X nepálštinar}Uvor~XvolapukrUgrcrXstarořečtinarUzurXzulurUfrrXfrancouzštinarUsmrX samoyštinarUfyrX fríštinarUsvrX švédštinarUfarX perštinarUmagrX magadhištinarUmairXmaithilištinarUfirX finštinarUfjrXfidžirUsarXsanskrtrUfr_CArXfrancouzsky (Kanada)rUforX faerštinarUkarX gruzínštinarUkkrX kazachštinarUsrrX srbštinarUsqrX albánštinarUkorX korejštinarUknrX kannadštinarUkmrXkambodžštinarUklrX grónštinarUksrXkašmírštinarUsirX sinhálštinarUshrXsrbochorvatštinarUsorX somálštinarUsnrXshonarUkurX kurdštinarUslrX slovinštinarUkyrX kirgizštinarUsgrXsanghorUsdrXsindhiruU territoriesr}r(UBDrX BangladéšrUBErXBelgierUBFrX Burkina FasorUBGrX BulharskorUVErX VenezuelarUBArXBosna a HercegovinarUBBrXBarbadosrUWFrXWallis a FutunarUBMrXBermudyrUBNrXBrunej DarussalamrUBOrXBolívierUBHrXBahrajnrUBIrXBurundirUBJrXBeninrUBTrXBhútánrU011rXZápadní AfrikarUBVrX Ostrov BouvetrUBWrXBotswanarU014rXVýchodní AfrikarU015rXSeverní AfrikarUBRrX BrazílierU017rXStřední AfrikarU018rXJižní AfrikarU019rXAmerikarUBYrX BěloruskorUBZrXBelizerULVrX LotyšskorURWrXRwandarURSrXSrbskorUTLrXVýchodní TimorrURErXRéunionrUTMrX TurkmenistánrUOMrXOmánrUTJrXTádžikistánrUROrXRumunskorUTKrXTokelaur UGWr X Guinea-Bissaur UGUr XGuamr UGTrX GuatemalarUGSrX-Jižní Georgie a Jižní Sandwichovy ostrovyrUGRrXŘeckorUGQrXRovníková GuinearUGPrX GuadelouperUJPrXJaponskorUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFr XFrancouzská Guyanar!UGEr"XGruzier#UGDr$XGrenadar%U021r&XSeverní Amerikar'UGBr(XVelká Británier)UGAr*XGabonr+USVr,X El Salvadorr-UGNr.XGuinear/UGMr0XGambier1UGLr2XGrónskor3U029r4XKaribikr5UGIr6X Gibraltarr7UGHr8XGhanar9UJEr:XJerseyr;UTNr<XTuniskor=UJMr>XJamajkar?U013r@XStřední AmerikarAUWSrBXSamoarCU419rDX#Latinská Amerika a Karibské mořerEUVArFX Svatý stolecrGUHRrHX ChorvatskorIUBSrJXBahamyrKUHTrLXHaitirMUHUrNX MaďarskorOUHKrPX4Hongkong, zvláštní administrativní oblast ČínyrQU039rRXJižní EvroparSUHNrTXHondurasrUUFIrVXFinskorWU142rXXAsierYU030rZXVýchodní Asier[U034r\X Jižní Asier]U035r^XJihovýchodní Asier_UPRr`X PortorikoraUPSrbXPalestinian TerritoryrcU830rdXNormanské ostrovyreUFKrfXFalklandské ostrovyrgUIOrhX$Britské území v Indickém oceánuriUPWrjXPalaurkUPTrlX PortugalskormUSJrnXSvalbard a Jan MayenroUMDrpXMoldavsko, republikarqUIQrrXIrákrsUPArtXPanamaruUPFrvXFrancouzská PolynésierwUPGrxXPapua-Nová GuinearyUPErzXPerur{UPKr|X Pákistánr}UPHr~X FilipínyrUFOrXFaerské ostrovyrUPNrXPitcairnrUPLrXPolskorUPMrXSvatý Pierre a MiquelonrUZMrXZambierUEHrXZápadní SahararURUrXRuskorUEErXEstonskorUEGrXEgyptrUZArXJihoafrická republikarUECrXEkvádorrUITrXItálierUVNrXVietnamrUZZrXNeznámá nebo neplatná oblastrUSBrXŠalamounovy ostrovyrUETrXEtiopierUSOrX SomálskorUZWrXZimbabwerUSArXSaúdská ArábierUESrX ŠpanělskorUERrXEritrearUMErX Černá HorarUAQrX AntarktidarUMGrX MadagaskarrUMFrX Svatý MartinrUMArXMarokorUMCrXMonakorUUZrX UzbekistánrUMMrXMyanmarrUMLrXMalirUMOrX0Zvláštní administrativní oblast Číny MacaorUMNrX MongolskorUHMrXOstrovy Heard a McDonaldrUASrXAmerická SamoarUMKrX MacedoniarUMUrX MauriciusrUMTrXMaltarUMWrXMalawirUMVrXMaladivyrUMQrXMartinikrUMPrXSeverní MarianyrUMSrX MontserratrUMRrX MauritánierUIMrX Ostrov ManrUUGrXUgandarUTZrXTanzanierUMYrXMalajsierUMXrXMexikorUILrXIzraelrUFRrXFrancierUAWrXArubarUDOrXDominikánská republikarUSHrX Svatá HelenarUVCrXSvatý Vincent a GrenadinyrU054rX MelanésierUDJrXDžibutirUFJrXFidžirU057rX MikronésierUFMrX MikronézierU053rXAustrálie a Nový ZélandrUNIrX NikaraguarUNLrX NizozemskorUNOrXNorskorUNArXNamibierUVUrXVanuaturUNCrXNová KaledonierUNErXNigerrUNFrXNorfolkrUNGrXNigérier UNZr X Nový Zélandr UNPr XNepálr UNRrXNaururUNUrXNiuerU061rX PolynésierUCIrXPobřeží slonovinyrUCHrX ŠvýcarskorUCOrXKolumbierUCNrXČínarUCMrXKamerunrUCLrXChilerUCCr XKokosové ostrovyr!UCAr"XKanadar#UCGr$XKongor%UCFr&XStředoafrická republikar'UCDr(XDemokratická republika Kongor)UCZr*XČeská republikar+UCYr,XKyprr-UCXr.XVánoční ostrovyr/UCSr0XSrbsko a Černá Horar1UCRr2X Kostarikar3UPYr4XParaguayr5UCVr6XKapverdyr7UCUr8XKubar9USZr:X Svazijskor;USYr<XSýrier=UKGr>X Kyrgyzstánr?UKEr@XKeňarAUSRrBXSurinamrCU143rDXStřední AsierEUKHrFX KambodžarGUKNrHXSvatý Kitts a NevisrIUKMrJXKomoryrKUSTrLXSvatý TomášrMUSKrNX SlovenskorOUKRrPX Jižní KorearQUSIrRX SlovinskorSUKPrTXSeverní KorearUUKWrVXKuvajtrWUSNrXXSenegalrYUSMrZX San Marinor[USLr\X Sierra Leoner]USCr^XSeychelyr_UKZr`X KazachstánraUKYrbXKajmanské ostrovyrcUSGrdXSingapurreUSErfX ŠvédskorgUSDrhXSúdánriU151rjXVýchodní EvroparkU150rlXEvroparmUDMrnXDominikaroU155rpXZápadní EvroparqU154rrXSeverní EvroparsUVGrtXBritské Panenské ostrovyruUDErvXNěmeckorwUYErxXJemenryUMHrzXMarshallovy ostrovyr{U062r|XJižní a centrální Asier}UDZr~X AlžírskorUUSrXSpojené státyrUUYrXUruguayrUYTrXMayotterUUMrXMenší odlehlé ostrovy USArULBrXLibanonrULCrX Svatá LucierULArX$Lidově demokratická republika LaosrUTVrXTuvalurUTWrX Tchaj-wanrUTTrXTrinidad a TobagorUTRrXTureckorULKrX Srí LankarULIrXLichtenštejnskorUCKrXCookovy ostrovyrUTOrXTongarULTrXLitvarULUrX LucemburskorULRrXLibérierULSrXLesothorUTHrXThajskorUTFrXFrancouzská jižní teritoriarUTGrXTogorUTDrXČadrUTCrXOstrovy Caicos a TurksrULYrXLibyerU200rXČeskoslovenskorU145rXZápadní AsierUAErXSpojené arabské emirátyrUADrXAndorrarUAGrXAntigua a BarbudarUAFrX AfghánistánrUAIrXAnguilarUVIrXAmerické Panenské ostrovyrUISrXIslandrUIRrXÍránrUAMrXArménierUALrXAlbánierUAOrXAngolarUANrXNizozemské AntilyrU003rX003rU002rXAfrikarU001rXSvětrUARrX ArgentinarUAUrX AustrálierUATrXRakouskorU005rXJižní AmerikarUINrXIndierUAXrXAlandyrU009rXOceánierUAZrXÁzerbájdžánrUIErXIrskorUIDrX IndonésierUJOrX JordánskorUQUrXEvropská unierUUArXUkrajinarUQArXKatarrUDKrXDánskorUMZrXMosambikrUQOrXVnější OceánieruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3Xd.M.yyyyrhSX%(d)s.%(M)s.%(yyyy)srubUfullrhO)r}r (h3XEEEE, d. MMMM yyyyr hSX"%(EEEE)s, %(d)s. %(MMMM)s %(yyyy)sr ubUlongr hO)r }r(h3X d. MMMM yyyyrhSX%(d)s. %(MMMM)s %(yyyy)srubUshortrhO)r}r(h3Xd.M.yyrhSX%(d)s.%(M)s.%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBr XBsr!UDKKr"XDKrr#ULBPr$XLLr%UTZSr&XT Shr'UKHRr(XCRr)UMYRr*XRMr+ULYDr,XLDr-UJODr.XJDr/USARr0XSRlr1UHKDr2XHK$r3UCHFr4XSwFr5UBYRr6XRblr7UXPFr8XCFPFr9UMROr:XUMr;UDJFr<XDFr=UZWDr>XZ$r?UVUVr@XVTrAUUYUrBXUr$rCUAUDrDX$ArEUSYPrFXLSrGUMZMrHXMtrIUGELrJXlarirKUZARrLXRrMUNPRrNXNrsrOUBEFrPXBFrQUCRCrRXCrSUMWKrTXMKrUULKRrVXSL RerWUSKKrXXSkrYUPKRrZXPrar[UHUFr\XFtr]UROLr^Xleur_UBMDr`XBer$raULSLrbXMrcUMNTrdXTugreUAMDrfXdramrgUUGXrhXU ShriUJMDrjXJ$rkUTTDrlXTT$rmUAFNrnXAfroUTRLrpXTLrqUBDTrrXTkrsUYERrtXYRlruUANGrvXNA f.rwUXCDrxXEC$ryUNOKrzXNKrr{UINRr|XINRr}UMXNr~XMEX$rUCZKrXKčrUBTNrXNurUCOPrXCol$rUIDRrXRprUHNLrXLrUFJDrXF$rUETBrXBrrUBZDrXBZ$rUDOPrXRD$rUQARrXQRrUSEKrXSKrrUSRGrXSfrUIEPrXIR£rUBBDrXBDS$rUGTQrXQrUVEBrXBerUCLPrXCh$rUALLrXlekrUKZTrXTrUOMRrXROrUSBDrXSI$rUPLNrXZlrUKESrXK ShrUMKDrXMDenrUTWDrXNT$rUGNFrXGFrUIQDrXIDrUBAMrXKMrUSCRrXSRrUCADrXCan$rUCVErXCVEscrUKWDrXKDrUBIFrXFburUSOSrXSh.rUSGDrXS$rUSTDrXDbrUIRRrXRIrUCNYrXYrUGYDrXG$rUMTLrXLmrUNZDrX$NZrUKGSrXsomrUARSrXArg$rUSZLrXErUBHDrXBDruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanárské ostrovyrsU Europe/Lisbonr}rjXLisabonrsU Asia/Dhakar}rjXDhákarsUAmerica/St_Luciar}rjX St. LuciarsUAsia/Singaporer}rjXSingapurrsU Europe/Tiraner}rjXTiranarsUAfrica/Djiboutir}rjXDžibutirsU Asia/Kashgarr}rjXKašgharrsU Africa/Cairor}rjXKáhirarsU Europe/Moscowr}rjXMoskvarsUAmerica/El_Salvadorr}rjXSalvadorrsU Asia/Dubair}rjXDubajrsUEurope/Brusselsr}rjXBruselrsUAsia/Ulaanbaatarr}rjX UlánbátarrsUIndian/Maldivesr}rjXMaledivyr sU Europe/Parisr }r jXPařížr sU Pacific/Fijir }rjXFidžirsU Europe/Athensr}rjXAtényrsU Asia/Rangoonr}rjXRangúnrsUAfrica/Khartoumr}rjXChartúmrsUAmerica/Puerto_Ricor}rjX PortorikorsUIndian/Mauritiusr}rjX MauriciusrsU Europe/Berlinr}r jXBerlínr!sU Europe/Zurichr"}r#jXCurychr$sUAmerica/Cordobar%}r&jXKordobar'sU America/Belemr(}r)jXBelémr*sU Asia/Karachir+}r,jX Karáčír-sU Europe/Romer.}r/jXŘímr0sUAfrica/Sao_Tomer1}r2jXSvatý Tomášr3sU Europe/Warsawr4}r5jXVaršavar6sUAsia/Krasnoyarskr7}r8jX Krasnojarskr9sUAsia/Yekaterinburgr:}r;jXJekatěrinburgr<sUAtlantic/Bermudar=}r>jXBermudyr?sUAfrica/Tripolir@}rAjXTripolisrBsUAmerica/St_JohnsrC}rDjX St. JohnsrEsUAmerica/St_ThomasrF}rGjX St. ThomasrHsUAtlantic/Cape_VerderI}rJjXKapverdyrKsUEurope/CopenhagenrL}rMjXKodaňrNsUAmerica/JamaicarO}rPjXJamajkarQsU Europe/KievrR}rSjXKyjevrTsU Asia/BaghdadrU}rVjXBagdádrWsUEurope/BudapestrX}rYjX BudapešťrZsU Asia/Ammanr[}r\jXAmmánr]sU Asia/Kabulr^}r_jXKábulr`sU Asia/Sakhalinra}rbjXSachalinrcsUAmerica/St_Vincentrd}rejX St. VincentrfsUAtlantic/Reykjavikrg}rhjX ReykjavíkrisU Asia/Nicosiarj}rkjX LefkosíarlsUEurope/Uzhgorodrm}rnjXUžhorodrosU Asia/Tashkentrp}rqjXTaškentrrsU Asia/Tokyors}rtjXTokiorusUPacific/Easterrv}rwjXVelikonoční ostrovrxsUAsia/Pyongyangry}rzjX Pchjongjangr{sUAtlantic/South_Georgiar|}r}jXJižní Georgiar~sUEurope/Bucharestr}rjX BukurešťrsUEurope/Zaporozhyer}rjX ZáporožírsUPacific/Galapagosr}rjX GalapágyrsU Asia/Bishkekr}rjXBiškekrsU Asia/Yerevanr}rjXJerevanrsUAfrica/Mogadishur}rjX MogadišorsUIndian/Christmasr}rjXVánoční ostrovrsU Asia/Kuwaitr}rjXKuvajtrsUAtlantic/Azoresr}rjXAzorské ostrovyrsUAsia/Jerusalemr}rjX JeruzalémrsU Asia/Shanghair}rjXŠanghajrsUAmerica/St_Kittsr}rjX St. KittsrsU Asia/Beirutr}rjXBejrútrsUAfrica/Algiersr}rjXAlžírrsU Asia/Bahrainr}rjXBahrajnrsU Asia/Ashgabatr}rjXAšgabadrsUAmerica/Costa_Ricar}rjX KostarikarsUAsia/Kamchatkar}rjX KamčatkarsU Asia/Riyadhr}rjXRijádrsUAsia/Phnom_Penhr}rjX PhnompenhrsU Europe/Londonr}rjXLondýnrsU Asia/Damascusr}rjXDamašekrsU Asia/Qatarr}rjXKatarrsU Asia/Bruneir}rjXBrunejrsU Asia/Dushanber}rjXDušanbersU Asia/Yakutskr}rjXJakutskrsUAtlantic/St_Helenar}rjX Sv. HelenarsUAmerica/Tijuanar}rjXTichuanarsUEurope/Luxembourgr}rjX LucemburskorsUAmerica/Martiniquer}rjXMartinikrsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersU Europe/Viennar}rjXVídeňrsU Europe/Sofiar}rjXSofiersU Asia/Tehranr}rjXTeheránrsU Etc/Unknownr}rjX Není známorsUAmerica/Anchorager}rjXAljašský časrsU Asia/Seoulr}rjXSoulrsUAntarctica/South_Poler}rjX Jižní pólrsuUscriptsr}r(UGururX GurmukhírUHebrrX HebrejskýrUZzzzrXNeznámý nebo neplatný skriptrUPhnxrX FénickýrUChamrXČamrUArabrXArabskýrUGujrrX GudžarátírUSinhrX SinhálskýrUMongrX MongolskýrUXpeorXStaroperské klínové písmorUVisprXViditelná řečrUMandr X Mandejskýr UMlymr XMalajálamskýr UTibtr X TibetskýrUKalirXKayah lirUJpanrX JaponskýrUVaiirXVairUKanarXKatakanarULepcrX LepčskýrUYiiirXYirUJavarXJávskýrUOryarXUrijskýrULaoorXLaoskýr UUgarr!XUgaritské klínové písmor"UCyrlr#XCyrilicer$UArmnr%X Arménskýr&UCyrsr'XCyrilice (staroslověnská)r(UKhmrr)X Khmerskýr*UItalr+XEtruskýr,UXsuxr-X!Sumero-akkadské klínové písmor.UThaar/XThaanar0UThair1XThajskýr2ULinbr3X Lineární Br4ULinar5X Lineární Ar6UOsmar7X Osmanskýr8UHirar9XHiraganar:UHanir;XHanr<UEgydr=XEgyptský démotickýr>UEgyhr?XEgyptský hieratickýr@UCansrAX(Slabičné písmo kanadských domorodcůrBUEgyprCXEgyptské hieroglyfyrDUTfngrEX BerberskýrFUShawrGXShawrHUCirtrIXCirthrJUGeorrKX GruzínskýrLUTengrMXTengwarrNUHrktrOXKatakana nebo HiraganarPUPlrdrQXPollardova fonetická abecedarRUOgamrSXOghamrTUDsrtrUXDeseretrVUGothrWXGotickýrXUHanorYXHanunoorZUBalir[X Balijskýr\UHangr]XHangulr^UTagbr_XTagbanwar`URororaX RongorongorbUDevarcX DevanágarírdUIndsreX HarappskýrfUBoporgXBopomoforhUMymrriXBarmskýrjUTglgrkX TagalskýrlUPermrmX StaropermskýrnUBugiroX BuginskýrpUBrairqXBraillovo písmorrUBrahrsXBráhmírtUBatkruXBatackýrvUMerorwX MeroitickýrxUTeluryX TelužskýrzUTamlr{X Tamilskýr|ULatgr}XLatinka (gaelská)r~ULatfrXLatinka (fraktura)rUKharrX KháróštírULatnrXLatinkarUMayarXMayské hieroglyfyrUEthirX EtiopskýrUHmngrX HmongskýrUBuhdrXBuhidrUCoptrXKoptskýrUGlagrX HlaholicerURunrrXRunové písmorUOrkhrX OrchonskýrUHungrXStaromaďarskýrUGrekrXŘeckýrUCherrXČerokírUZyyyrXObecnýrUSyrcrXSyrskýrUBlisrXBlissrUBengrX BengálskýrUSyrerXSyrský (estrangelo)rUSyrjrXSyrský (západní)rUSyrnrXSyrský (východní)rUKndarX KannadskýruUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX ruUcurrency_namesr}r(UXXXrXNeznámá nebo neplatná měnarjXDinár alžírskýrjXDolar namibijskýrjXFrank komorskýrUBOPrXPesorUEGPrXLibra egyptskárjXLevrUBGNrXLev BulharskýrUPABrXBalboarUYUMrX Dinár jugoslávský nový [YUM]rj>XDolar zimbabwskýrUGHCrXCedirUXBDrX"Evropská jednotka účtu 17 (XBD)rj X BolivianorUXBArXEvropská smíšená jednotkarj"XKoruna dánskárUXBCrX!Evropská jednotka účtu 9 (XBC)rUXBBrXEvropská peněžní jednotkarUBWPrXPularj$XLibra libanonskárj&XŠilink tanzanskýrUVNDrXDong vietnamskýrUAOArXKwanzarUWSTrXTalarUAONrXKwanza nová (1990-2000)rj(XRielrj*XRinggit malajskijskýrUAOKrXKwanza (1977-1990)rjXŠilink somálskýrUKYDrXDolar Kajmanských ostrovůrj,XDinár lybijskýrUUAHrXHřivnarUUAKrX Karbovanecrj.XDinár jordánskýrUAORrXKwanza reajustado (1995-1999)rUSURrXRublrUAWGrXZlatý arubskýrj0XRijál saudskýrUFIMrXMarkkarj2XDolar hongkongskýrjXZlatý surinamskýrUTPErXEscudo timorskérUMGFrXFrank madagaskarskýrj4XFrank švýcarskýrUGIPrXLibra gibraltarskárj6XRubl běloruskýrjXLekrUUGSrXŠilink ugandský (1966-1987)rj:XOuguiyarUBOVrXMvdolrUHRKrXKuna chorvatskárj<XFrank džibutskýrUHRDrXDinar chorvatskýrUPESr XSolr UBYBr X"Rubl nový běloruský (1994-1999)r UITLr X Lira italskárUXAFrXFrank BEAC/CFArUBNDrXDolar brunejskýrUISKrXKoruna islandskárUZALrXRand finančnírjBXPeso uruguayskérUNIOrX Cordoba ororULAKrXKiprUNICrXCordobarjNXRupie nepálskárUMZErXEscudo Mosambikur jFX Libra syrskár!jjXDolar jamajskýr"UFRFr#XFrank francouzskýr$UMAFr%XFrank marockýr&jHXMeticalr'UPHPr(XPeso filipínskér)jLXRandr*UGWPr+XPeso Guinnea-Bissaur,ULUFr-XFrank lucemburskýr.UBELr/XFrank finančnír0UBECr1XFrank konvertibilnír2UNGNr3XNairar4UYUNr5X#Dinár jugoslávský konvertibilnír6jPXFrank belgickýr7UPLZr8XZlotý (1950-1995)r9jRXColón kostarickýr:jpX Lira tureckár;UDEMr<XMarka německár=UEEKr>XKroonr?jTXKwacha malawskár@jlXDolar Trinidad a TobagorAjVXRupie srílanskárBjXXKoruna slovenskárCjXEscudo kapverdskérDjZXRupie pákistánskárEj\XForintrFj^XLeirGUXEUrHXEvropská měnová jednotkarIj`XDolar bermudskýrJjXRijál ománskýrKjbXLotirLULVRrMXRubl lotyšskýrNjdXTugrikrOjfXDram arménskýrPUYUDrQX Dinár jugoslávský nový [YUD]rRUBUKrSX Kyat barmskýrTjhXŠilink ugandskýrUjXRijál katarskýrVUXDRrWXSDRrXUNLGrYXZlatý holandskýrZUGEKr[XGeorgian Kupon Laritr\UMTPr]XLibra maltskár^UGBPr_XLibra šterlinkůr`jJXLariraUSHPrbXLibra Svaté HelenyrcjnXAfghánrdjXDolar Šalamounových ostrovůreUCSKrfXKoruna československárgUKPWrhXWon severokorejskýriUAFArjXAfghán (1927-2002)rkUTHBrlXBahtrmUTRYrnXLira nová tureckárojrXTakarpUGRDrqXDrachmarrjtXRijál jemenskýrsUDDMrtX Marka NDRrujX LilangenirvUHTGrwXGourderxUXOFryXFrank BCEAO/CFArzUMGAr{XAriary madagaskarskýr|jvXZlatý Nizozemských Antilr}ULRDr~XDolar liberijskýrURWFrXFrank rwandskýrjzXKoruna norskárUMXVrX!Mexican Unidad de Inversion (UDI)rjXŠilink keňskýrUMOPrXPatacarj|XRupie indickárj~X Peso mexickérjXKoruna českárUTJSrXSomonirUTJRrXTajikistan RublerjXNgultrumrUYDDrXDinár jemenskýrUGWErXEscudo guinejskérjXPeso kolumbijskérUMURrXRupie mauricijskárjXRupie indonézskárjXLempirarj8X Frank CFPrjXDolar fidžijskýrjXBirr etiopskýrUPENrX Nuevo solrjXDolar belizskýrUATSrXŠilinkrUILPrXLibra izraelskárUZRNrX Zaire novýrjXPeso dominikánskérUTMMrXManatrUMDLrXLeu moldavskýrUECVrX'Ecuador Unidad de Valor Constante (UVC)rUECSrXSucre ekvádorskýrUBSDrXDolar bahamskýrjXKoruna švédskárUTOPrXPaʻangarUPEIrXIntirUZMKrXKwacha zambijskárUMVRrXRufiyaarjDXDolar australskýrUADPrXPeseta andorrskárUCUPrXPeso kubánskérjX Libra irskárUCLFrXUnidades de fomentorjXDolar barbadoskýrUKRWrXWon jihokorejskýrUGMDrXDalasirjXQuetzalrjXBolivarrUSITrXTolarrUSDPrXLibra súdánskárjX Peso chilskérUEURrXEurorUCDFrXFrank konžskýrjxXDolar východokaribskýrjXTengerURUBrX Rubl ruskýrUXFUrX Frank UICrUBRRrX Cruzeiro realrUBRNrX Cruzado novérUBRLrXReal brazilskýrUMMKrXKyatrUUYPrXPeso uruguayské (1975-1993)rURURrXRubl ruský (1991-1998)rjXZlotýrUBRErXCruzeiro (1990-1993)rUPYGrXGuaranirUBRCrXCruzadorUBRBrXCruzeiro (1967-1986)rUSVCrXColon salvadorskýrUAEDrX Dirham SAErUGNSrX Guinea SylirjXDenárrUAZMrXManat ázerbajdžánskýrjXDolar tchajvanský novýrUUSNrX Dolar americký (příští den)rUGQErX!Equatorial Guinea Ekwele Guineanarj@XVaturUBADrXDinár Bosny a HercegovinyrjXFrank guinejskýrUMXPrX%Peso stříbrné mexické (1861-1992)rjXDinár iráckýrUERNrXNakfarjXMarka konvertibilnírjXRupie seychelskárjXDolar kanadskýrUSDDrXDinár súdánskýrUCYPrXLibra kyperskár UMADr XDirham marockýr jXDinár kuvajtskýr jXFrank burundskýr ULTTrXTalonrUPGKrXKinarULTLrXLitus litevskýrjXDolar singapurskýrUUZSrX Sum uzbeckýrjXDobrarUXFOrX Frank zlatýrUMLFrXFrank malijskýrUESPrXPeseta španělskárjXRijál íránskýrUZRZrXZairer jX Juan renminbir!USLLr"XLeoner#UTNDr$XDinár tuniskýr%jXDolar guyanskýr&jX Lira maltskár'jXDolar novozélandskýr(UFKPr)XLibra falklandskár*ULVLr+XLat lotyšskýr,UUSSr-XDolar americký (týž den)r.UUSDr/XDolar americkýr0UARPr1XPeso argentinské (1983-1985)r2jXSomr3jXPeso argentinskér4UILSr5XŠekel nový izraelskýr6URONr7X Leu rumunskér8URSDr9XDinár srbskýr:jXDinár bahrajnskýr;UJPYr<XJenr=UARAr>XAustralr?UPTEr@XEscudo portugalskérAUXAUrBXZlatorCuUmonthsrD}rE(U stand-alonerF}rG(UwiderH}rI(KXledenrJKXúnorrKKXbřezenrLKXdubenrMKXkvětenrNKXčervenrOKX červenecrPKXsrpenrQK XzářírRK XříjenrSK XlistopadrTK XprosinecrUuU abbreviatedrV}rW(KX1.rXKX2.rYKX3.rZKX4.r[KX5.r\KX6.r]KX7.r^KX8.r_K X9.r`K X10.raK X11.rbK X12.rcuUnarrowrd}re(KXlrfKXúrgKXbrhKXdriKXkrjKXčrkKXčrlKXsrmK XzrnK XřroK jfK XprpuuUformatrq}rr(Uwiders}rt(KXlednaruKXúnorarvKXbřeznarwKXdubnarxKXkvětnaryKXčervnarzKX červencer{KXsrpnar|K Xzářír}K Xříjnar~K X listopadurK XprosinceruU abbreviatedr}r(Kh Kh KhKhKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12ruuuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.X ¤rjrh1KKrh3X #,##0.00 ¤rh5h/h6rh8Nh9KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXPrKXÚrKXSrKXČrKjKjKXNrusUformatr}r(Uwider}r(KX pondělírKXúterýrKXstředarKXčtvrtekrKXpátekrKXsobotarKXneděleruU abbreviatedr}r(KXporKXútrKXstrKXčtrKXpárKXsorKXneruuuU meta_zonesr}r(UIsraelr}r(UcommonrUlongr}r(UdaylightrXIzraelský letní časrUstandardrXIzraelský standardní časruuUAmerica_Pacificr}r(jj}r(jXPacifický letní časrjXPacifický standardní časruuUEurope_Easternr}r(jj}r(jXVýchodoevropský letní časrjX"Východoevropský standardní časruuUAmerica_Mountainr}r(jj}r(jXHorský letní časrjXHorský standardní časruuUAlaskar}r(jj}r(jXAljašský letní časrjXAljašský standardní časruuUAmerica_Easternr}r(jj}r(jXVýchodní letní časrjXVýchodní standardní časruuU Newfoundlandr}r(jj}r(jXNewfoundlandský letní časrjX!Newfoundlandský standardní časruuUAtlanticr}r(jj}r(jXAtlantický letní časrjXAtlantický standardní časruuUAmerica_Centralr}r(jj}r(jXCentrální letní časrjXCentrální standardní časruuUJapanr}r(jj}r(jXJaponský letní časrjXJaponský standardní časruuUChinar}r(jj}rjXČínský standardní časrsuUEurope_Centralr}r(jj}r(jXStředoevropský letní časrjX!Středoevropský standardní časruuUGMTr}r(jj}rjXGreenwichský střední časrsuuUerasr}rU abbreviatedr}r(KXpř.Kr.rKXpo Kr.rusu.PK[W%site-packages/babel/localedata/sa.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X hh:mm:ss aqAUformatqBX%(hh)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X hh:mm:ss a vqGhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X hh:mm:ss a zqLhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xhh:mm aqQhBX%(hh)s:%(mm)s %(a)sqRubuU languagesqS}qT(UaaqUX अफरqVUabqWXअब्खासियन्qXUafqYX'अफ्रिक्कान्स्qZUalgq[X1अल्गोण्क्यन् भाषाq\Uakq]X अकन्q^Ualeq_Xअलियुट्q`UamqaXअंहाऱिक्qbUarqcXअऱबिक्qdUanpqeXअङ्गिकqfUapaqgXअपाचे भाषाqhUafhqiXअफ्रिहिलिqjUnbqkX7नोर्वीजियन् बॊकामल्qlUafaqmX/आफ्रो एष्यन् भाषाqnUgrcqoX)पुरातन यवन भाषाqpUadaqqXअडङ्गमेqrUtutqsXआळटिक् भाषाqtUegyquX4प्राचीन ईजिप्त्यन्qvUaceqwXअचिनीस्qxUsqqyXअल्बेनियन्qzUachq{Xअचोलिq|Uakkq}X!अक्काटियान्q~UainqXअयिनुqUundqXअज्ञात भाषाqUsaqX"संस्कृत भाषाquU territoriesq}qUINqXभारतम्qsUdecimal_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X #,##,##0.###qh.h/h0qh2Nh3KKqubsU date_formatsq}q(Umediumqh>)q}q(h,X dd-MM-yyyyqhBX%(dd)s-%(MM)s-%(yyyy)squbUfullqh>)q}q(h,XEEEE d MMMM yyyyqhBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)squbUlongqh>)q}q(h,X d MMMM yyyyqhBX%(d)s %(MMMM)s %(yyyy)squbUshortqh>)q}q(h,Xd-MM-yyqhBX%(d)s-%(MM)s-%(yy)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}q(UArmnqXअर्मेनियन्qUBaliqXबालिनीस्qUBatkqXबट्टक्qUArabqXअरबिक्qUAvstqXअवेस्थन्qUBengqXबंगालिqUArmiqXअर्मिquUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KhKhKhKhKhKhKhKhK hK X10qK X11qK X12quU abbreviatedq}q(KhKhKhKhKhKhKhKhK hK X10qK X11qK X12quuuUcurrency_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X ¤#,##,##0.00qh.X¤qX-¤qqh2Nh3KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KhKhKhKhKhKhKhuU abbreviatedq}q(KhKhKhKhKhKhKhuuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCErusu.PK[㭮%site-packages/babel/localedata/te.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXఒకటి 1q KXరెండు 2q KXమూడు 3qKXనాలుగు 4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXపూర్వాహ్నంqUpmqXఅపరాహ్నంquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X h:mm:ss aqAUformatqBX%(h)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X h:mm:ss a vqGhBX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X h:mm:ss a zqLhBX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xh:mm aqQhBX%(h)s:%(mm)s %(a)sqRubuU languagesqS}qT(UelqUXగ్రీకుqVUguqWXగుజరాతిqXUenqYXఆంగ్లంqZUzhq[Xచైనా భాషq\Uisq]Xఐస్ లాండుq^Uitq_X"ఇటాలియన్ భాషq`UsvqaXస్వీడిష్qbUarqcXఅరబిక్qdUgaqeXఐరిష్qfUzuqgX జూలూqhUcsqiX చెక్qjUetqkXఈస్టోనియనుqlUxhqmX ఖోసqnUidqoX!ఇండొనేసియన్qpUesqqXస్పానిష్qrUruqsXరష్యన్ భాషqtUnlquX డచ్qvUptqwX%పొర్చుగల్ భాషqxUlaqyXలాటిన్qzUneq{Xనేపాలిq|Ulvq}Xలాత్వియనుq~UltqX!లిథువేనియనుqUpaqXపంజాబిqUthqX థాయిqUroqXరొమేనియనుqUplqXపోలిష్qUtaqXతమిళంqUfrqXఫ్రెంచ్qUbnqXబెంగాలిqUdeqXఙర్మన్qUbhqXబీహారిqUdaqXడానిష్qUfaqXపార్శీqUhiqXహిందీqUnoqX!నార్వేజియన్qUfiqXఫిన్నిష్qUhuqXహంగేరియనుqUjaqXజపాను భాషqUheqXహీబ్రూqUteqXతెలుగుqUmlqXమలయాళంqUmnqXమంగోలియన్qUswqXస్వాహిలిqUknqXకన్నడqUurqXఉర్దుqUsiqXసింహళీqUmrqXమరాఠిquU territoriesq}q(URUqX రష్యqUFRqXఫ్రాన్స్‌qUCNqX చైనాqUDEqXఙర్మనిqUJPqXజపాసుqUITqX ఇటలిqUUSqX5ఐక్య రాష్ట్ర అమెరికqUTOqXఠాఙ్గqUGBqXబ్రిటన్qUBRqXబ్రజిల్qUINqXభారత దేళంquUdecimal_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X #,##,##0.###qh.h/h0qh2Nh3KKqubsU date_formatsq}q(Umediumqh>)q}q(h,X dd-MM-yyyyqhBX%(dd)s-%(MM)s-%(yyyy)squbUfullqh>)q}q(h,XEEEE d MMMM yyyyqhBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)squbUlongqh>)q}q(h,X d MMMM yyyyqhBX%(d)s %(MMMM)s %(yyyy)squbUshortqh>)q}q(h,Xdd-MM-yyqhBX%(dd)s-%(MM)s-%(yy)squbuUcurrency_symbolsq}q(URUBqXరూబల్qUBRLqXరి$qUINRqXరూ.qUCNYqXయుquU time_zonesq}qUscriptsq}q(UTeluqXతెలుగుqUCyrlqX%సిరిలిక్ లిపిqUArabqXఅరబ్బి లిపిqUBengqXBengrUHansrX,సరళమైన చైనా లిపిrULatnrXలాటిన్rUHantrX/ప్రాచీన చైనా లిపిruUvariantsr}r(UREVISEDr X:సవరించబడిన వర్ణక్రమంr U1996r X01996 ఙర్మన వర్ణక్రమంr U1901r XAప్రాచీన ఙర్మన వర్ణక్రమంruUnumber_symbolsr}rUnativeZeroDigitrX౦rsUcurrency_namesr}r(UUSDrXEఐక్య రాష్ట్ర అమెరిక డాలర్rhX&రష్య దేశ రూబల్rhXరూపాయిrhXOచైనా దేశ యువాన్ రెన్‌మిన్‌బిrUJPYrX&జపాను దేశ యెస్rhX2బ్రజిల్ దేశ రియాల్rUGBPrXDబ్ిటిష్ పౌన్డ స్టెర్లిగ్rUEURrX యురొr uUmonthsr!}r"(U stand-aloner#}r$Unarrowr%}r&(KXజr'KXఫిr(KXమr)KXఎr*KXమెr+KXజుr,KXజుr-KXఆr.K Xసెr/K Xఅr0K Xనr1K Xడిr2usUformatr3}r4(Uwider5}r6(KXజనవరిr7KXఫిబ్రవరిr8KXమార్చిr9KXఏప్రిల్r:KXమేr;KX జూన్r<KX జూలైr=KXఆగస్టుr>K Xసెప్టెంబర్r?K Xఅక్టోబర్r@K Xనవంబర్rAK Xడిసెంబర్rBuU abbreviatedrC}rD(KXజనవరిrEKXఫిబ్రవరిrFKXమార్చిrGKXఏప్రిల్rHKXమేrIKX జూన్rJKX జూలైrKKXఆగస్టుrLK Xసెప్టెంబర్rMK Xఅక్టోబర్rNK Xనవంబర్rOK Xడిసెంబర్rPuuuUcurrency_formatsrQ}rRNh )rS}rT(h#Nh$Kh%KKrUh'h/h/rVh*KKrWh,X¤ #,##,##0.00rXh.X¤ rYX-¤ rZr[h2Nh3KKr\ubsUdaysr]}r^(U stand-aloner_}r`Unarrowra}rb(KX2rcKXసొrdKXభుreKXగుrfKXశుrgKXశrhKXఆriusUformatrj}rk(Uwiderl}rm(KXసోమవారంrnKXమంగళవారంroKXబుధవారంrpKXగురువారంrqKXశుక్రవారంrrKXశనివారంrsKXఆదివారంrtuU abbreviatedru}rv(KX సోమrwKX మంగళrxKX బుధryKX గురుrzKXశుక్రr{KX శనిr|KX ఆదిr}uuuU meta_zonesr~}rUerasr}r(Uwider}r(KXఈసాపూర్వ.rKX సన్.ruU abbreviatedr}r(KXBCErKXCEruuu.PK[:%site-packages/babel/localedata/mn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXдөрөвний нэгq KXдөрөвний хоёрq KXдөрөвний гуравqKXдөрөвний дөрөвquU abbreviatedq}q(KX1/4qKX2/4qKX3/4qKX4/4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX%энэтхэгийн гужаратиqBUgdqCXшотланд келтqDUgaqEX ирландqFUgnqGXгуараниqHUglqIX галикqJUlaqKX латинqLUlnqMXлингалаqNUloqOXлаотианqPUtrqQXтуркqRUlvqSX латвиqTUltqUX литвиqVUtkqWXтуркменqXUthqYXтайqZUtiq[Xтикринаq\Uteq]X тэлүгүq^Upt_PTq_X'португали (португали)q`UfilqaX тагалоqbUtaqcX тамилqdUyiqeX иддишqfUpt_BRqgX!португали (бразил)qhUdeqiX германqjUdaqkXданиqlUelqmXгрекqnUeoqoXэсперантоqpUenqqX англиqrUzhqsX хятадqtUeuquXбаскqvUetqwX эстониqxUesqyX испаниqzUruq{Xоросq|Uroq}X румынq~UbnqXбенгальqUbeqXбеларусьqUbgqX болгарqUukqX украинqUjvqXяваqUbhqXбихари хэлqUbrqX бретонqUbsqX босниаqUjaqXяпонqUocqXфранцын окситанqUtwqXтвиqUtlhqXклингон хэлqUorqXорияqUxhqXхосаqUcaqXкаталанqUcyqXуэлсqUcsqXчехqUpsqX афганqUptqXпортугалиqUpaqXпенжабиqUviqXвьетнамqUplqX польшqUhyqX арменqUhrqXхорватиqUhuqX унгарqUhiqX хиндиqUheqXкипрqUuzqX узбекqUmlqXмалайламqUmnqX монголqUmkqXмакедониqUurqXпакистаны урдуqUmtqX малтиqUmsqX малайqUmrqX!энэтхэгийн маратиqUugqX уйгурqUafqX африкqUswqX&африкийн свахили хэлqUisqX исландqUamqXамхарикqUitqX италиqUsvqXшведqUasqXассам үндэстэнqUarqXарабqUsuqXсунданес хэлqUzuqXзулуqUiaqXинтерлингвоqUazqXазарбежанqUieqXнэгдмэл хэлqUidqXиндонезиqUnlqXголландqUnnqXнорвеги (нынорск)qUnoqXнорвегиqUneqX балбаqUfrqX францqUfyqX(голландын фрисиан хэлqUfaqXперсqUfiqXфинляндqUkyqX киргизqUfoqXфөриэс хэлqUkaqXгүржqUsrqX сербиqUsqqX албаниqUkoqXсолонгосqUknqXканнадаrUkmrX камбучrUstrX сесотоrUskrX словакrUsirXшри ланкrUshr Xхорватын сербr Usor X сомалиr Ukur XкурдrUslrXсловениrUsarXсанскиритrUsdrX синдхиruU territoriesr}r(URUrXОросrUFRrX ФранцrUMNrXМонгол улсrUDErX ГерманrUJPrXЯпонr UITr!X Италиr"UUSr#X(Америкийн Нэгдсэн Улсr$UTOr%X Тонгаr&UBRr'XБразилиr(UINr)XЭнэтхэгr*uUdecimal_formatsr+}r,U date_formatsr-}r.(Umediumr/h))r0}r1(h,X yyyy MMM dr2h.X%(yyyy)s %(MMM)s %(d)sr3ubUfullr4h))r5}r6(h,XEEEE, yyyy MMMM ddr7h.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sr8ubUlongr9h))r:}r;(h,X yyyy MMMM dr<h.X%(yyyy)s %(MMMM)s %(d)sr=ubUshortr>h))r?}r@(h,Xyy/MM/ddrAh.X%(yy)s/%(MM)s/%(dd)srBubuUcurrency_symbolsrC}rDU time_zonesrE}rFUscriptsrG}rHUvariantsrI}rJUnumber_symbolsrK}rLUcurrency_namesrM}rNUmonthsrO}rP(U stand-alonerQ}rRUnarrowrS}rT(KX1rUKX2rVKX3rWKX4rXKX5rYKX6rZKX7r[KX8r\K X9r]K X10r^K X11r_K X12r`usUformatra}rb(Uwiderc}rd(KXХулганаreKXҮхэрrfKXБарrgKX ТуулайrhKXЛууriKX МогойrjKXМорьrkKXХоньrlK XБичrmK X ТахиаrnK X НохойroK X ГахайrpuU abbreviatedrq}rr(KXхулrsKXүхэrtKXбарruKXтууrvKXлууrwKXмогrxKXморryKXхонrzK Xбичr{K Xтахr|K Xнохr}K Xгахr~uuuUcurrency_formatsr}rUdaysr}r(U stand-aloner}rUnarrowr}r(KjVKjWKjXKjYKjZKj[KjUusUformatr}r(Uwider}r(KX давааrKX мягмарrKX лхагваrKX пүрэвrKX баасанrKX бямбаrKXнямruU abbreviatedr}r(KXДаrKXМяrKXЛхrKXПүrKXБаrKXБяrKXНяruuuU meta_zonesr}rUerasr}r(Uwider}r(KX"манай эриний өмнөхrKXманай эринийruU abbreviatedr}r(KXм.э.өrKXм.э.ruuu.PK[4盓*site-packages/babel/localedata/en_Dsrt.datnu[}q(U zone_formatsq}q(UregionqX%s 𐐓𐐴𐑋qUgmtqX𐐘𐐣𐐓 %squUdatetime_formatsq}qUquartersq }q Uformatq }q (Uwideq }q(KX&1𐑅𐐻 𐐿𐐶𐐪𐑉𐐻𐐲𐑉qKX&2𐑌𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉qKX&3𐑉𐐼 𐐿𐐶𐐪𐑉𐐻𐐲𐑉qKX&4𐑉𐑃 𐐿𐐶𐐪𐑉𐐻𐐲𐑉quU abbreviatedq}q(KX𐐗1qKX𐐗2qKX𐐗3qKX𐐗4quusUperiodsq}q(UamqX𐐈𐐣qUpmqX𐐑𐐣quUscientific_formatsq}q Upercent_formatsq!}q"U week_dataq#}q$(Umin_daysq%KU weekend_startq&KU first_dayq'KU weekend_endq(KuU time_formatsq)}q*U languagesq+}q,(Ugvq-X𐐣𐐰𐑌𐐿𐑅q.Ugaq/X𐐌𐑉𐐮𐑇q0Umncq1X𐐣𐐰𐑌𐐽𐐭q2Ugmhq3X6𐐣𐐮𐐼𐐲𐑊 𐐐𐐴 𐐖𐐲𐑉𐑋𐐲𐑌q4Ulbq5X0𐐢𐐲𐐿𐑅𐐯𐑋𐐺𐐲𐑉𐑀𐐮𐑇q6Ulaq7X𐐢𐐰𐐻𐐮𐑌q8Uloq9X𐐢𐐵q:Ubntq;X𐐒𐐰𐑌𐐻𐐭qUhawq?X𐐐𐐲𐐶𐐴𐐲𐑌q@UmgaqAX%𐐣𐐮𐐼𐐲𐑊 𐐌𐑉𐐮𐑇qBUhitqCX𐐐𐐮𐐻𐐴𐐻qDUdeqEX𐐖𐐲𐑉𐑋𐑌𐐲qFUbatqGX1𐐒𐐪𐑊𐐻𐐮𐐿 𐐢𐐩𐑍𐐶𐐮𐐾qHUdaqIX𐐔𐐩𐑌𐐮𐑇qJUmohqKX𐐐𐐬𐐸𐐪𐐿qLUmulqMXA𐐣𐐲𐑊𐐻𐐮𐐹𐐲𐑊 𐐢𐐩𐑍𐐶𐐮𐐾𐐲𐑆qNUgemqOX9𐐖𐐲𐑉𐑋𐐰𐑌𐐮𐐿 𐐢𐐩𐑍𐐶𐐮𐐾qPUcrpqQX2𐐗𐑉𐐨𐐬𐑊 𐐬𐑉 𐐑𐐮𐐾𐐮𐑌qRUelqSX𐐘𐑉𐐨𐐿qTUeoqUX$𐐇𐑅𐐹𐐯𐑉𐐪𐑌𐐻𐐬qVUenqWX𐐀𐑍𐑊𐐮𐑇qXUartqYX=𐐂𐑉𐐻𐐮𐑁𐐮𐑇𐐲𐑊 𐐢𐐩𐑍𐐶𐐮𐐾qZUeuq[X𐐒𐐰𐑅𐐿q\Uetq]X 𐐀𐑅𐐻𐐬𐑌𐐨𐐲𐑌q^Uesq_X𐐝𐐹𐐰𐑌𐐮𐑇q`UmusqaX𐐗𐑉𐐨𐐿qbUkutqcX𐐢𐐰𐐼𐐨𐑌𐐬qdUgotqeX𐐘𐐱𐑃𐐮𐐿qfUdsbqgX-𐐢𐐬𐐲𐑉 𐐝𐐬𐑉𐐺𐐨𐐲𐑌qhUjvqiX𐐖𐐪𐑂𐐲𐑌𐐨𐑆qjUzblqkX-𐐒𐑊𐐮𐑅-𐑅𐐮𐑋𐐺𐐲𐑊𐑆qlUbrqmX𐐒𐑉𐐯𐐻𐐲𐑌qnUjaqoX𐐖𐐰𐐹𐐲𐑌𐐨𐑆qpUcopqqX𐐗𐐬𐐹𐐻𐐮𐐿qrUndsqsX!𐐢𐐬 𐐖𐐯𐑉𐑋𐐲𐑌qtUtlhquX𐐗𐑊𐐮𐑍𐐱𐑌qvUcoqwX 𐐗𐐬𐑉𐑅𐐮𐐿𐐲𐑌qxUjrbqyX-𐐖𐐭𐐼𐐨𐐬-𐐈𐑉𐐲𐐺𐐮𐐿qzUcaq{X𐐗𐐪𐐻𐐲𐑊𐐪𐑌q|Ucyq}X𐐎𐐯𐑊𐑇q~UcsqX 𐐕𐐯𐐿qUcrqX 𐐗𐑉𐐨qUapaqX-𐐊𐐹𐐰𐐽𐐨 𐐢𐐩𐑍𐐶𐐮𐐾qUbynqX𐐒𐑊𐐮𐑌qUdumqX!𐐣𐐮𐐼𐐲𐑊 𐐔𐐲𐐽qUfrmqX)𐐣𐐮𐐼𐐲𐑊 𐐙𐑉𐐯𐑌𐐽qUchrqX𐐕𐐯𐑉𐐬𐐿𐐨qUchyqX𐐟𐐴𐐰𐑌qUgilqX$𐐘𐐮𐑊𐐺𐐯𐑉𐐻𐐨𐑆qUzhqX𐐕𐐴𐑌𐐨𐑆qUhyqX 𐐂𐑉𐑋𐐨𐑌𐐨𐐲𐑌qUhrqX𐐗𐑉𐐬𐐩𐑇𐐲𐑌qUkaqX𐐖𐐬𐑉𐐾𐐲𐑌qUhtqX𐐐𐐩𐑇𐐲𐑌qUhiqX𐐐𐐮𐑌𐐼𐐨qUzxxqXJ𐐤𐐬 𐑊𐐨𐑍𐐶𐐮𐑅𐐻𐐮𐐿 𐐿𐐱𐑌𐐻𐐯𐑌𐐻qUmoqX$𐐣𐐬𐑊𐐼𐐩𐑂𐐨𐐲𐑌qUmnqX 𐐣𐐱𐑍𐐬𐑊𐐨𐐲𐑌qUmiqX𐐣𐐵𐑉𐐨qUmkqX(𐐣𐐰𐑅𐐯𐐼𐐬𐑌𐐨𐐲𐑌qUberqX𐐒𐐲𐑉𐐺𐐲𐑉qUmyqX𐐒𐐲𐑉𐑋𐐨𐑆qUisqX 𐐌𐑅𐑊𐐰𐑌𐐼𐐮𐐿qUitqX𐐆𐐻𐐰𐑊𐐷𐐲𐑌qUanqX 𐐈𐑉𐐲𐑀𐐱𐑌𐐨𐑆qUarqX𐐇𐑉𐐲𐐺𐐮𐐿qUcpfqXX𐐙𐑉𐐯𐑌𐐽-𐐺𐐩𐑅𐐻 𐐗𐑉𐐨𐐬𐑊 𐐬𐑉 𐐑𐐮𐐾𐐮𐑌qUmynqX)𐐣𐐴𐐲𐑌 𐐢𐐩𐑍𐐶𐐮𐐾qUiaqX(𐐆𐑌𐐻𐐲𐑉𐑊𐐮𐑍𐐶𐐲qUineqXJ𐐆𐑌𐐼𐐬-𐐏𐐯𐑉𐐬𐐹𐐨𐐲𐑌 𐐢𐐩𐑍𐐶𐐮𐐾qUjprqX-𐐖𐐭𐐼𐐨𐐬-𐐑𐐯𐑉𐑈𐐲𐑌qUidqX$𐐆𐑌𐐼𐐬𐑌𐐨𐑈𐐲𐑌qUincqX-𐐆𐑌𐐼𐐮𐐿 𐐢𐐩𐑍𐐶𐐮𐐾qUnlqX 𐐔𐐲𐐽qUnaiqXc𐐤𐐬𐑉𐑃 𐐊𐑋𐐯𐑉𐐮𐐿𐐲𐑌 𐐆𐑌𐐼𐐨𐐲𐑌 𐐢𐐩𐑍𐐶𐐮𐐾qUenmqX)𐐣𐐮𐐼𐐲𐑊 𐐀𐑍𐑊𐐮𐑇qUnapqX(𐐤𐐨𐐲𐐹𐐱𐑊𐐮𐐻𐐲𐑌qUgrcqX)𐐁𐑌𐐽𐐲𐑌𐐻 𐐘𐑉𐐨𐐿qUmisqXA𐐣𐐮𐑅𐐲𐑊𐐩𐑌𐐨𐐲𐑅 𐐢𐐩𐑍𐐶𐐮𐐾qUnvqX𐐤𐐪𐑂𐐲𐐸𐐬qUfrqX𐐙𐑉𐐯𐑌𐐽qUcelqX1𐐗𐐯𐑊𐐻𐐮𐐿 𐐢𐐩𐑍𐐶𐐮𐐾qUdakqX𐐔𐐲𐐿𐐬𐐻𐐲qUegyqX5𐐁𐑌𐐽𐐲𐑌𐐻 𐐀𐐾𐐮𐐹𐐽𐐲𐑌qUkoqX𐐗𐐬𐑉𐐨𐐲𐑌qUcpeqXX𐐀𐑍𐑊𐐮𐑇-𐐺𐐩𐑅𐐻 𐐗𐑉𐐨𐐬𐑊 𐐬𐑉 𐐑𐐮𐐾𐐮𐑌qUkmqX𐐗𐐲𐑋𐐯𐑉qUkwqX𐐗𐐬𐑉𐑌𐐮𐑇qUkuqX𐐗𐐲𐑉𐐼𐐮𐑇quU territoriesq}q(UBDqX$𐐒𐐪𐑍𐑀𐑊𐐲𐐼𐐯𐑇qUBEqX𐐒𐐯𐑊𐐾𐐲𐑋qUBFqX-𐐒𐐲𐑉𐐿𐐩𐑌𐐲 𐐙𐐰𐑅𐐬qUBGqX 𐐒𐐲𐑊𐑀𐐯𐑉𐐨𐐲qUBAqXV𐐒𐐱𐑆𐑌𐐨𐐲 𐐰𐑌𐐼 𐐐𐐲𐑉𐐻𐑅𐐲𐑀𐐬𐑂𐐨𐑌𐐲qUBBqX 𐐒𐐪𐑉𐐺𐐩𐐼𐐬𐑅qUWFqX:𐐎𐐪𐑊𐐮𐑅 𐐰𐑌𐐼 𐐙𐐭𐐻𐐭𐑌𐐲qUBLqX5𐐝𐐩𐑌𐐻 𐐒𐐪𐑉𐐻𐐩𐑊𐐲𐑋𐐨qUBMqX 𐐒𐐲𐑉𐑋𐐷𐐭𐐼𐐲qUBNqX𐐒𐑉𐐭𐑌𐐴qUBOqX𐐒𐐬𐑊𐐮𐑂𐐨𐐲qUBHqX𐐒𐐪𐑉𐐩𐑌qUBIqX𐐒𐐲𐑉𐐳𐑌𐐼𐐨qUBJqX𐐒𐐲𐑌𐐨𐑌qUBTqX𐐒𐐭𐐻𐐪𐑌rU011rX5𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲rUBVrX%𐐒𐐭𐑂𐐩 𐐌𐑊𐐲𐑌𐐼rUBWrX 𐐒𐐪𐐻𐑅𐐶𐐪𐑌𐐲rU014rX1𐐀𐑅𐐻𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲rU015r X5𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲r UBRr X𐐒𐑉𐐲𐑆𐐮𐑊r U017r X)𐐣𐐮𐐼𐑊 𐐈𐑁𐑉𐐮𐐿𐐲rU018rX1𐐝𐐲𐑄𐐲𐑉𐑌 𐐈𐑁𐑉𐐲𐐿𐐲rU019rX 𐐊𐑋𐐯𐑉𐐲𐐿𐐲𐑆rUWKrX!𐐎𐐩𐐿 𐐌𐑊𐐲𐑌𐐼rUBYrX𐐒𐐯𐑊𐐲𐑉𐐭𐑅rUBZrX𐐒𐐲𐑊𐐨𐑆rULVrX𐐢𐐰𐐻𐑂𐐨𐐲rURWrX𐐡𐐲𐐶𐐪𐑌𐐼𐐲rUPCrXk𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐌𐑊𐐲𐑌𐐼𐑆 𐐓𐑉𐐲𐑅𐐻 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨rUTLrX!𐐀𐑅𐐻 𐐓𐐨𐑋𐐱𐑉r UJTr!X1𐐖𐐪𐑌𐑅𐐻𐐲𐑌 𐐌𐑊𐐲𐑌𐐼r"UTMr#X0𐐓𐐲𐑉𐐿𐑋𐐯𐑌𐐲𐑅𐐻𐐰𐑌r$UOMr%X𐐄𐑋𐐲𐑌r&UTJr'X(𐐓𐐲𐐾𐐨𐐿𐐲𐑅𐐻𐐰𐑌r(UROr)X𐐡𐐬𐑋𐐩𐑌𐐨𐐲r*UTKr+X𐐓𐐬𐐿𐐯𐑊𐐵r,UGWr-X!𐐘𐐮𐑌𐐨-𐐒𐐮𐑅𐐵r.UGUr/X𐐘𐐶𐐪𐑋r0UGTr1X$𐐘𐐶𐐪𐐼𐐲𐑋𐐪𐑊𐐲r2UGSr3Xv𐐝𐐵𐑃 𐐖𐐱𐑉𐐾𐐲 𐐰𐑌𐐼 𐑄 𐐝𐐵𐑃 𐐝𐐰𐑌𐐼𐐶𐐮𐐽 𐐌𐑊𐐲𐑌𐐼𐑆r4UGRr5X𐐘𐑉𐐨𐑅r6UGQr7X9𐐇𐐿𐐶𐐲𐐻𐐱𐑉𐐨𐐲𐑊 𐐘𐐮𐑌𐐨r8UGPr9X 𐐘𐐶𐐪𐐼𐐲𐑊𐐭𐐹r:UJPr;X𐐖𐐲𐐹𐐰𐑌r<UKIr=X 𐐗𐐮𐑉𐐲𐐺𐐪𐐻𐐨r>UGYr?X𐐘𐐴𐐰𐑌𐐲r@UGGrAX𐐘𐐲𐑉𐑌𐑆𐐨rBUGFrCX)𐐙𐑉𐐯𐑌𐐽 𐐘𐐨𐐪𐑌𐐲rDUGErEX𐐖𐐱𐑉𐐾𐐲rFUGDrGX𐐘𐑉𐐲𐑌𐐩𐐼𐐲rHU021rIX9𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐊𐑋𐐯𐑉𐐲𐐿𐐲rJUGBrKX5𐐏𐐭𐑌𐐴𐐻𐐲𐐼 𐐗𐐨𐑍𐐼𐐲𐑋rLUGArMX𐐘𐐲𐐺𐐪𐑌rNUSVrOX)𐐇𐑊 𐐝𐐰𐑊𐑂𐐲𐐼𐐱𐑉rPUGNrQX𐐘𐐮𐑌𐐨rRUGMrSX𐐘𐐰𐑋𐐺𐐨𐐲rTUGLrUX 𐐘𐑉𐐨𐑌𐑊𐐲𐑌𐐼rVU029rWX 𐐗𐐯𐑉𐐲𐐺𐐨𐐲𐑌rXUGIrYX$𐐖𐐲𐐺𐑉𐐱𐑊𐐻𐐲𐑉rZUGHr[X𐐘𐐪𐑌𐐲r\UJEr]X𐐖𐐲𐑉𐑆𐐨r^UJMr_X𐐖𐐲𐑋𐐩𐐿𐐲r`USJraXK𐐝𐑂𐐪𐑊𐐺𐐪𐑉𐐼 𐐰𐑌𐐼 𐐖𐐰𐑌 𐐣𐐴𐐲𐑌rbU013rcX9𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐊𐑋𐐯𐑉𐐲𐐿𐐲rdUWSreX𐐝𐐲𐑋𐐬𐐲rfU419rgX`𐐢𐐰𐐻𐑌 𐐊𐑋𐐯𐑉𐐲𐐿𐐲 𐐰𐑌𐐼 𐑄 𐐗𐐯𐑉𐐲𐐺𐐨𐐲𐑌rhUBQriX^𐐒𐑉𐐮𐐼𐐮𐑇 𐐈𐑌𐐻𐐪𐑉𐐿𐐻𐐮𐐿 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨rjUVArkX𐐚𐐰𐐼𐐲𐐿𐐲𐑌rlUHRrmX𐐗𐑉𐐬𐐩𐑇𐐲rnUBSroX𐐒𐐲𐐸𐐪𐑋𐐲𐑅rpUHTrqX𐐐𐐩𐐻𐐨rrUHUrsX𐐐𐐲𐑍𐑀𐐲𐑉𐐨rtUHKruX7𐐐𐐬𐑍 𐐗𐐬𐑍 𐐝𐐈𐐡 𐐕𐐴𐑌𐐲rvU039rwX-𐐝𐐲𐑄𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹rxUHNryX 𐐐𐐪𐑌𐐼𐐭𐑉𐐲𐑅rzUSUr{X𐐏𐐭𐑌𐐷𐐲𐑌 𐐲𐑂 𐐝𐐬𐑂𐐨𐐯𐐻 𐐝𐐬𐑇𐐲𐑊𐐮𐑅𐐻 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿𐑅r|UFIr}X𐐙𐐮𐑌𐑊𐐲𐑌𐐼r~U142rX 𐐁𐑈𐐲rU030rX%𐐀𐑅𐐻𐐲𐑉𐑌 𐐁𐑈𐐲rU034rX%𐐝𐐲𐑄𐐲𐑉𐑌 𐐁𐑈𐐲rU035rX2𐐝𐐵𐑃-𐐀𐑅𐐻𐐲𐑉𐑌 𐐁𐑈𐐲rUPRrX)𐐑𐐶𐐯𐑉𐐻𐐬 𐐡𐐨𐐿𐐬rUPSrXM𐐑𐐰𐑊𐐲𐑅𐐻𐐮𐑌𐐨𐐲𐑌 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨rU830rX-𐐕𐐰𐑌𐐲𐑊 𐐌𐑊𐐲𐑌𐐼𐑆rUFKrX9𐐙𐐪𐑊𐐿𐑊𐐲𐑌𐐼 𐐌𐑊𐐲𐑌𐐼𐑆rUIOrXc𐐒𐑉𐐮𐐼𐐮𐑇 𐐆𐑌𐐼𐐨𐐲𐑌 𐐄𐑇𐐲𐑌 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨rUPWrX𐐑𐐲𐑊𐐵rUPTrX 𐐑𐐱𐑉𐐽𐐲𐑀𐐲𐑊rUPUrXi𐐏.𐐝. 𐐣𐐮𐑅𐐲𐑊𐐩𐑌𐐨𐐲𐑅 𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐌𐑊𐐲𐑌𐐼𐑆rUPZrX:𐐑𐐰𐑌𐐲𐑋𐐪 𐐗𐐲𐑌𐐰𐑊 𐐞𐐬𐑌rUMDrX𐐣𐐱𐑊𐐼𐐬𐑂𐐲rUFMrX$𐐣𐐴𐐿𐑉𐐲𐑌𐐨𐑈𐐲rUIQrX𐐆𐑉𐐰𐐿rUPArX𐐑𐐰𐑌𐐲𐑋𐐪rUPFrX5𐐙𐑉𐐯𐑌𐐽 𐐑𐐪𐑊𐐲𐑌𐐨𐑈𐐲rUPGrX2𐐑𐐰𐐹𐐷𐐳𐐲 𐐤𐐭 𐐘𐐮𐑌𐐨rUPErX𐐑𐐲𐑉𐐭rUPKrX 𐐑𐐰𐐿𐐲𐑅𐐻𐐰𐑌rUPHrX 𐐙𐐮𐑊𐐲𐐹𐐨𐑌𐑆rUFOrX)𐐙𐐯𐑉𐐬 𐐌𐑊𐐲𐑌𐐼𐑆rUPNrX𐐑𐐮𐐻𐐿𐐯𐑉𐑌rUPLrX𐐑𐐬𐑊𐐲𐑌𐐼rUPMrXK𐐝𐐩𐑌𐐻 𐐑𐐨𐐯𐑉 𐐰𐑌𐐼 𐐣𐐨𐐿𐐲𐑊𐐪𐑌rUZMrX𐐞𐐰𐑋𐐺𐐨𐐲rUEHrX5𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐝𐐲𐐸𐐱𐑉𐐲rURUrX𐐡𐐲𐑇𐐲rUEErX𐐇𐑅𐐻𐐬𐑌𐐨𐐲rUEGrX𐐀𐐾𐐲𐐹𐐻rUZArX%𐐝𐐵𐑃 𐐈𐑁𐑉𐐲𐐿𐐲rUECrX𐐇𐐿𐐶𐐲𐐼𐐱𐑉rUITrX𐐆𐐻𐐲𐑊𐐨rUVNrX𐐚𐐨𐐯𐐻𐑌𐐪𐑋rUZZrXK𐐊𐑌𐐬𐑌 𐐬𐑉 𐐆𐑌𐑂𐐰𐑊𐐮𐐼 𐐡𐐨𐐾𐐲𐑌rUSBrX5𐐝𐐪𐑊𐐲𐑋𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆rUETrX𐐀𐑃𐐨𐐬𐐹𐐨𐐲rUSOrX𐐝𐐲𐑋𐐪𐑊𐐨𐐲rUZWrX 𐐞𐐮𐑋𐐺𐐪𐐺𐐶𐐩rUSArX)𐐝𐐵𐐼𐐨 𐐊𐑉𐐩𐐺𐐨𐐲rUESrX𐐝𐐹𐐩𐑌rUERrX𐐇𐑉𐐮𐐻𐑉𐐨𐐲rUMErX$𐐣𐐪𐑌𐐲𐑌𐐨𐑀𐑉𐐬rUAQrX(𐐈𐑌𐐻𐐪𐑉𐐿𐐻𐐮𐐿𐐲rUMGrX(𐐣𐐰𐐼𐐲𐑀𐐰𐑅𐐿𐐲𐑉rUMFrX%𐐝𐐩𐑌𐐻 𐐣𐐪𐑉𐐻𐑌rUMArX𐐣𐐲𐑉𐐪𐐿𐐬rUMCrX𐐣𐐪𐑌𐐲𐐿𐐬rUUZrX(𐐅𐑆𐐺𐐯𐐿𐐲𐑅𐐻𐐰𐑌rUMMrX𐐣𐐨𐐲𐑌𐑋𐐪𐑉rUMLrX𐐣𐐪𐑊𐐨rUMOrX.𐐣𐐲𐐿𐐵 𐐝𐐈𐐡 𐐕𐐴𐑌𐐲rUMNrX 𐐣𐐪𐑍𐑀𐐬𐑊𐐨𐐲rUHMrXl𐐐𐐲𐑉𐐼 𐐌𐑊𐐲𐑌𐐼 𐐰𐑌𐐼 𐐣𐐿𐐔𐐱𐑌𐐲𐑊𐐼 𐐌𐑊𐐲𐑌𐐼𐑆rUASrX5𐐊𐑋𐐯𐑉𐐲𐐿𐐲𐑌 𐐝𐐲𐑋𐐬𐐲rUMKrX$𐐣𐐰𐑅𐐲𐐼𐐬𐑌𐐨𐐲rUMUrX𐐣𐐱𐑉𐐮𐑇𐐲𐑅rUMTrX𐐣𐐱𐑊𐐻𐐲rUMWrX𐐣𐐲𐑊𐐪𐐶𐐨rUMVrX𐐣𐐪𐑊𐐼𐐨𐑂𐑆rUMQrX𐐣𐐪𐑉𐐻𐑌𐐨𐐿rUMPrXR𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐣𐐰𐑉𐐨𐐱𐑌𐐲 𐐌𐑊𐐲𐑌𐐼𐑆rUMSrX$𐐣𐐪𐑌𐐻𐑅𐐲𐑉𐐪𐐻rUMRrX$𐐣𐐱𐑉𐐲𐐻𐐩𐑌𐐨𐐲rUIMrX"𐐌𐐲𐑊 𐐲𐑁 𐐣𐐰𐑌rUUGrX𐐏𐐭𐑀𐐰𐑌𐐼𐐲rUTZrX 𐐓𐐰𐑌𐑆𐐲𐑌𐐨𐐲rUMYrX𐐣𐐲𐑊𐐩𐑈𐐲rUMXr X𐐣𐐯𐐿𐑅𐐲𐐿𐐬r UILr X𐐆𐑆𐑉𐐨𐐲𐑊r UFQr X𐐙𐑉𐐯𐑌𐐽 𐐝𐐲𐑄𐐲𐑉𐑌 𐐰𐑌𐐼 𐐈𐑌𐐻𐐪𐑉𐐿𐐻𐐮𐐿 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨𐑆rUFRrX𐐙𐑉𐐰𐑌𐑅rUAWrX𐐊𐑉𐐭𐐺𐐲rUDOrXE𐐔𐐲𐑋𐐮𐑌𐐲𐐿𐐲𐑌 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿rUFXrXE𐐣𐐯𐐻𐑉𐐲𐐹𐐪𐑊𐐲𐐻𐐲𐑌 𐐙𐑉𐐰𐑌𐑅rUSHrX)𐐝𐐩𐑌𐐻 𐐐𐐯𐑊𐐲𐑌𐐲rUVCrXd𐐝𐐩𐑌𐐻 𐐚𐐮𐑌𐑅𐐲𐑌𐐻 𐐰𐑌𐐼 𐑄 𐐘𐑉𐐯𐑌𐐲𐐼𐐨𐑌𐑆rURErX 𐐡𐐨𐐷𐐭𐑌𐐷𐐲𐑌rU054rX 𐐣𐐯𐑊𐐲𐑌𐐨𐑈𐐲rUDJrX𐐖𐐲𐐺𐐭𐐼𐐨r UFJr!X𐐙𐐨𐐾𐐨r"U057r#X=𐐣𐐴𐐿𐑉𐐲𐑌𐐨𐑈𐐲𐑌 𐐡𐐨𐐾𐐲𐑌r$U172r%Xo𐐗𐐪𐑋𐐲𐑌𐐶𐐯𐑊𐑃 𐐲𐑂 𐐆𐑌𐐼𐐲𐐹𐐯𐑌𐐼𐐲𐑌𐐻 𐐝𐐻𐐩𐐻𐑅r&U053r'XO𐐉𐑅𐐻𐑉𐐩𐑊𐐨𐐲 𐐰𐑌𐐼 𐐤𐐭 𐐞𐐨𐑊𐐲𐑌𐐼r(UNIr)X$𐐤𐐮𐐿𐐲𐑉𐐪𐑀𐐶𐐲r*UNLr+X(𐐤𐐯𐑄𐐲𐑉𐑊𐐲𐑌𐐼𐑆r,UNOr-X𐐤𐐱𐑉𐐶𐐩r.UNAr/X𐐤𐐲𐑋𐐮𐐺𐐨𐐲r0UVUr1X𐐚𐐪𐑌𐐳𐐪𐐼𐐭r2UNCr3X-𐐤𐐭 𐐗𐐰𐑊𐐲𐐼𐐬𐑌𐐷𐐲r4UVDr5X-𐐤𐐱𐑉𐑃 𐐚𐐨𐐯𐐻𐑌𐐪𐑋r6UNEr7X𐐤𐐴𐐾𐐲𐑉r8UNFr9X-𐐤𐐱𐑉𐑁𐐲𐐿 𐐌𐑊𐐲𐑌𐐼r:UNGr;X𐐤𐐴𐐾𐐮𐑉𐐨𐐲r<UNZr=X!𐐤𐐭 𐐞𐐨𐑊𐐲𐑌𐐼r>UNPr?X𐐤𐐩𐐹𐐪𐑊r@UNQrAX6𐐔𐑉𐐱𐑌𐐮𐑍 𐐣𐐱𐐼 𐐢𐐰𐑌𐐼rBUNRrCX𐐤𐐪𐐭𐑉𐐭rDUNTrEX%𐐤𐐭𐐻𐑉𐐲𐑊 𐐞𐐬𐑌rFUNUrGX𐐤𐐷𐐭𐐩rHU061rIX 𐐑𐐪𐑊𐐲𐑌𐐨𐑈𐐲rJUCIrKX!𐐌𐑂𐑉𐐨 𐐗𐐬𐑅𐐻rLUCHrMX,𐐝𐐶𐐮𐐻𐑅𐐲𐑉𐑊𐐲𐑌𐐼rNUCOrOX 𐐗𐐲𐑊𐐲𐑋𐐺𐐨𐐲rPUCNrQX𐐕𐐴𐑌𐐲rRUCMrSX𐐗𐐰𐑋𐐲𐑉𐐭𐑌rTUCLrUX𐐕𐐨𐑊𐐩rVUCCrWX-𐐗𐐬𐐿𐐬𐑆 𐐌𐑊𐐲𐑌𐐼𐑆rXUCArYX𐐗𐐰𐑌𐐲𐐼𐐲rZUCGr[X7𐐗𐐪𐑍𐑀𐐬 - 𐐒𐑉𐐪𐑆𐐲𐑂𐐮𐑊r\UCFr]XZ𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐈𐑁𐑉𐐲𐐿𐐲𐑌 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿r^UCDr_X3𐐗𐐪𐑍𐑀𐐬 - 𐐗𐐲𐑌𐑇𐐪𐑅𐐲r`UCZraX-𐐕𐐯𐐿 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿rbUCYrcX𐐝𐐴𐐹𐑉𐐲𐑅rdUCXreX1𐐗𐑉𐐮𐑅𐑋𐐲𐑅 𐐌𐑊𐐲𐑌𐐼rfUCSrgXJ𐐝𐐲𐑉𐐺𐐨𐐲 𐐰𐑌𐐼 𐐣𐐪𐑌𐐲𐑌𐐨𐑀𐑉𐐬rhUCRriX%𐐗𐐱𐑅𐐻𐐲 𐐡𐐨𐐿𐐲rjUPYrkX𐐑𐐯𐑉𐐲𐑀𐐶𐐴rlUCVrmX!𐐗𐐩𐐹 𐐚𐐯𐑉𐐼𐐨rnUCUroX𐐗𐐷𐐭𐐺𐐲rpUCTrqXc𐐗𐐰𐑌𐐻𐐪𐑌 𐐰𐑌𐐼 𐐇𐑌𐐼𐐲𐑉𐐺𐐯𐑉𐐨 𐐌𐑊𐐲𐑌𐐼𐑆rrUSZrsX$𐐝𐐶𐐪𐑆𐐨𐑊𐐰𐑌𐐼rtUSYruX𐐝𐐮𐑉𐐨𐐲rvUKGrwX$𐐗𐐮𐑉𐑀𐐲𐑅𐐻𐐰𐑌rxUKEryX𐐗𐐯𐑌𐐷𐐲rzUSRr{X𐐝𐐭𐑉𐐲𐑌𐐪𐑋r|U143r}X)𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐁𐑈𐐲r~UKHrX 𐐗𐐰𐑋𐐺𐐬𐐼𐐨𐐲rUKNrXC𐐝𐐩𐑌𐐻 𐐗𐐮𐐻𐑅 𐐰𐑌𐐼 𐐤𐐨𐑂𐐮𐑅rUKMrX𐐗𐐪𐑋𐐲𐑉𐐬𐑆rUSTrXC𐐝𐐵 𐐓𐐬𐑋 𐐰𐑌𐐼 𐐑𐑉𐐮𐑌𐐽𐐮𐐹𐐩rUSKrX 𐐝𐑊𐐬𐑂𐐪𐐿𐐨𐐲rUKRrX!𐐝𐐵𐑃 𐐗𐐲𐑉𐐨𐐲rUSIrX 𐐝𐑊𐐬𐑂𐐨𐑌𐐨𐐲rUKPrX%𐐤𐐱𐑉𐑃 𐐗𐐲𐑉𐐨𐐲rUKWrX𐐗𐐲𐐶𐐩𐐻rUSNrX𐐝𐐯𐑌𐐲𐑀𐐱𐑊rUSMrX%𐐝𐐪𐑌 𐐣𐐲𐑉𐐨𐑌𐐬rUSLrX%𐐝𐐨𐐯𐑉𐐲 𐐢𐐨𐐬𐑌rUSCrX𐐝𐐩𐑇𐐯𐑊𐑆rUKZrX$𐐗𐐲𐑆𐐪𐐿𐑅𐐻𐐪𐑌rUKYrX-𐐗𐐩𐑋𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆rUSGrX𐐝𐐮𐑍𐐲𐐹𐐱𐑉rUSErX𐐝𐐶𐐨𐐼𐑌rUSDrX𐐝𐐭𐐼𐐰𐑌rU151rX-𐐀𐑅𐐻𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹rU150rX𐐏𐐲𐑉𐐲𐐹rUDMrX 𐐔𐐪𐑋𐐲𐑌𐐨𐐿𐐲rU155rX1𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹rU154rX1𐐤𐐱𐑉𐑄𐐲𐑉𐑌 𐐏𐐲𐑉𐐲𐐹rUVGrXJ𐐒𐑉𐐮𐐼𐐮𐑇 𐐚𐐲𐑉𐐾𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆rUMIrX-𐐣𐐮𐐼𐐶𐐩 𐐌𐑊𐐲𐑌𐐼𐑆rUDDrX)𐐀𐑅𐐻 𐐖𐐲𐑉𐑋𐐲𐑌𐐨rUDErX𐐖𐐲𐑉𐑋𐐲𐑌𐐨rUYErX𐐏𐐯𐑋𐐲𐑌rUYDrX𐐑𐐨𐐹𐐲𐑊𐑆 𐐔𐐯𐑋𐐲𐐿𐑉𐐰𐐼𐐮𐐿 𐐡𐐨𐐹𐐲𐐺𐑊𐐮𐐿 𐐲𐑂 𐐏𐐯𐑋𐐲𐑌rUMHrX1𐐣𐐪𐑉𐑇𐐲𐑊 𐐌𐑊𐐲𐑌𐐼𐑆rU062rX6𐐝𐐵𐑃-𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐁𐑈𐐲rUDZrX𐐈𐑊𐐾𐐮𐑉𐐨𐐲rUUSrX1𐐏𐐭𐑌𐐴𐐻𐐲𐐼 𐐝𐐻𐐩𐐻𐑅rUUYrX𐐏𐐳𐑉𐐲𐑀𐐶𐐴rUYTrX𐐣𐐪𐐷𐐱𐐻rUUMrX|𐐏𐐭𐑌𐐰𐐮𐐻𐐲𐐼 𐐝𐐻𐐩𐐻𐑅 𐐣𐐴𐑌𐐬𐑉 𐐍𐐻𐑊𐐴𐐨𐑍 𐐌𐑊𐐲𐑌𐐼𐑆rULBrX𐐢𐐯𐐺𐐲𐑌𐐪𐑌rULArX𐐢𐐪𐐬𐑅rUTVrX𐐓𐐲𐑂𐐪𐑊𐐭rUTWrX𐐓𐐴𐐶𐐪𐑌rUTTrXF𐐓𐑉𐐮𐑌𐐮𐐼𐐰𐐼 𐐰𐑌𐐼 𐐓𐐲𐐺𐐩𐑀𐐬rUTRrX𐐓𐐲𐑉𐐿𐐨rULKrX!𐐟𐑉𐐨 𐐢𐐰𐑍𐐿𐐲rULIrX(𐐢𐐮𐐿𐐻𐐲𐑌𐑅𐐻𐐴𐑌rUCKrX%𐐗𐐳𐐿 𐐌𐑊𐐲𐑌𐐼𐑆rUTOrX𐐓𐐪𐑍𐑀𐐲rULTrX$𐐢𐐮𐑃𐐲𐐶𐐩𐑌𐐨𐐲rULUrX(𐐢𐐲𐐿𐑅𐐲𐑋𐐺𐐲𐑉𐑀rULRrX𐐢𐐴𐐺𐐮𐑉𐐨𐐲rULSrX𐐢𐐲𐑅𐐬𐑃𐐬rUTHrX𐐓𐐴𐑊𐐰𐑌𐐼rUTFrXR𐐙𐑉𐐯𐑌𐐽 𐐝𐐲𐑄𐐲𐑉𐑌 𐐓𐐯𐑉𐐲𐐻𐐱𐑉𐐨𐑆rUTGrX𐐓𐐬𐑀𐐬rUTDrX 𐐕𐐰𐐼rUTCrXO𐐓𐐲𐑉𐐿𐑅 𐐰𐑌𐐼 𐐗𐐴𐐿𐐬𐑆 𐐌𐑊𐐲𐑌𐐼𐑆rULYrX𐐢𐐮𐐺𐐨𐐲rU200rX0𐐕𐐯𐐿𐐬𐑅𐑊𐐬𐑂𐐪𐐿𐐨𐐲rU145rX)𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐁𐑈𐐲rUAErXJ𐐏𐐭𐑌𐐴𐐼𐐮𐐼 𐐇𐑉𐐲𐐺 𐐇𐑋𐐲𐑉𐐩𐐻𐑅rUADrX𐐈𐑌𐐼𐐱𐑉𐐲rUAGrXJ𐐈𐑌𐐻𐐨𐑀𐐶𐐲 𐐰𐑌𐐼 𐐒𐐪𐑉𐐺𐐷𐐭𐐼𐐲rUAFrX(𐐈𐑁𐑀𐐰𐑌𐐲𐑅𐐻𐐰𐑌rUAIrX𐐈𐑍𐑀𐐶𐐮𐑊𐐲rUVIrX<𐐏.𐐝. 𐐚𐐲𐑉𐐾𐐲𐑌 𐐌𐑊𐐲𐑌𐐼𐑆rUISrX𐐌𐑅𐑊𐐲𐑌𐐼rUIRrX𐐆𐑉𐐪𐑌rUAMrX𐐂𐑉𐑋𐐨𐑌𐐨𐐲rUALrX𐐈𐑊𐐺𐐩𐑌𐐨𐐲rUAOrX𐐈𐑌𐑀𐐬𐑊𐐲rUANr XE𐐤𐐯𐑄𐐲𐑉𐑊𐐲𐑌𐐼𐑆 𐐈𐑌𐐻𐐮𐑊𐐨𐑆r U003r X-𐐤𐐱𐑉𐑃 𐐊𐑋𐐯𐑉𐐲𐐿𐐲r U002r X𐐈𐑁𐑉𐐲𐐿𐐲rU001rX𐐎𐐲𐑉𐑊𐐼rUARrX$𐐂𐑉𐐾𐐲𐑌𐐻𐐨𐑌𐐲rUAUrX 𐐉𐑅𐐻𐑉𐐩𐑊𐐨𐐲rUATrX𐐉𐑅𐐻𐑉𐐨𐐲rU005rX)𐐝𐐵𐑃 𐐊𐑋𐐯𐑉𐐲𐐿𐐲rUINrX𐐆𐑌𐐼𐐨𐐲rUAXrX-𐐈𐑊𐐰𐑌𐐼 𐐌𐑊𐐲𐑌𐐼𐑆rU009rX𐐄𐑇𐐨𐐰𐑌𐐨𐐲rUAZrX$𐐈𐑆𐐲𐑉𐐺𐐴𐑈𐐪𐑌r UIEr!X𐐌𐑉𐑊𐐲𐑌𐐼r"UIDr#X 𐐆𐑌𐐼𐐲𐑌𐐨𐑈𐐲r$UJOr%X𐐖𐐱𐑉𐐼𐐲𐑌r&UQUr'X9𐐏𐐲𐑉𐐲𐐹𐐨𐐲𐑌 𐐏𐐭𐑌𐐷𐐲𐑌r(URSr)X𐐝𐐲𐑉𐐺𐐨𐐲r*UQAr+X𐐗𐐲𐐻𐐪𐑉r,UDKr-X𐐔𐐯𐑌𐑋𐐪𐑉𐐿r.UMZr/X 𐐣𐐬𐑆𐐰𐑋𐐺𐐨𐐿r0UQOr1X5𐐍𐐻𐑊𐐴𐐮𐑍 𐐄𐑇𐐨𐐰𐑌𐐨𐐲r2uUdecimal_formatsr3}r4U date_formatsr5}r6Ucurrency_symbolsr7}r8U time_zonesr9}r:(UAmerica/Menomineer;}r<Ucityr=X 𐐣𐐲𐑌𐐪𐑋𐐲𐑌𐐨r>sU Pacific/Waker?}r@j=X 𐐎𐐩𐐿rAsUAmerica/DenverrB}rCj=X𐐔𐐯𐑌𐑂𐐲𐑉rDsUAmerica/New_YorkrE}rFj=X𐐤𐐭 𐐏𐐱𐑉𐐿rGsUAmerica/Indiana/Tell_CityrH}rIj=X;𐐓𐐯𐑊 𐐝𐐮𐐼𐐨, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲rJsUAmerica/North_Dakota/New_SalemrK}rLj=XH𐐤𐐭 𐐝𐐩𐑊𐐲𐑋, 𐐤𐐱𐑉𐑃 𐐔𐐲𐐿𐐬𐐼𐐲rMsUAmerica/North_Dakota/CenterrN}rOj=XC𐐝𐐯𐑌𐐻𐐲𐑉, 𐐤𐐱𐑉𐑃 𐐔𐐲𐐿𐐬𐐼𐐲rPsUAmerica/Indiana/VevayrQ}rRj=X.𐐚𐐯𐑂𐐩, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲rSsUPacific/HonolulurT}rUj=X 𐐐𐐪𐑌𐐲𐑊𐐭𐑊𐐭rVsUAmerica/LouisvillerW}rXj=X𐐢𐐭𐐶𐐨𐑂𐐮𐑊rYsU America/AdakrZ}r[j=X𐐈𐐼𐐰𐐿r\sUAmerica/Indiana/Marengor]}r^j=X:𐐣𐐲𐑉𐐯𐑍𐑀𐐬, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲r_sUAmerica/Detroitr`}raj=X𐐔𐐲𐐻𐑉𐐱𐐮𐐻rbsUAmerica/Indiana/Vincennesrc}rdj=X:𐐚𐐮𐑌𐑅𐐯𐑌𐑆, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲resUAmerica/Shiprockrf}rgj=X𐐟𐐮𐐹𐑉𐐱𐐿rhsUAmerica/Phoenixri}rjj=X𐐙𐐨𐑌𐐮𐐿𐑅rksUAmerica/Indiana/Knoxrl}rmj=X.𐐤𐐪𐐿𐑅, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲rnsUAmerica/Indiana/Petersburgro}rpj=XF𐐑𐐨𐐻𐐲𐑉𐑆𐐺𐐲𐑉𐑀, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲rqsUAmerica/Chicagorr}rsj=X𐐟𐐮𐐿𐐪𐑀𐐬rtsUAmerica/Kentucky/Monticelloru}rvj=XB𐐣𐐪𐑌𐐻𐐲𐑅𐐯𐑊𐐬, 𐐗𐐲𐑌𐐻𐐲𐐿𐐨rwsUAmerica/Los_Angelesrx}ryj=X%𐐢𐐱𐑅 𐐈𐑌𐐾𐐲𐑊𐑅rzsUAmerica/Indiana/Winamacr{}r|j=X:𐐎𐐮𐑌𐐲𐑋𐐰𐐿, 𐐆𐑌𐐼𐐨𐐰𐑌𐐲r}sU America/Nomer~}rj=X 𐐤𐐬𐑋rsUAmerica/Yakutatr}rj=X𐐏𐐰𐐿𐐭𐐻𐐰𐐻rsUPacific/Johnstonr}rj=X𐐖𐐪𐑌𐑅𐐻𐐲𐑌rsUAmerica/Juneaur}rj=X𐐖𐐭𐑌𐐬rsUAmerica/Indianapolisr}rj=X0𐐆𐑌𐐼𐐨𐐲𐑌𐐰𐐹𐐬𐑊𐐲𐑅rsU Etc/Unknownr}rj=X𐐊𐑌𐑌𐐬𐑌rsU America/Boiser}rj=X𐐒𐐱𐐮𐑆𐐨rsUAmerica/Anchorager}rj=X𐐁𐑍𐐿𐐲𐑉𐐮𐐾rsUPacific/Midwayr}rj=X𐐣𐐮𐐼𐐶𐐩rsUAntarctica/South_Poler}rj=X𐐝𐐵𐑃 𐐑𐐬𐑊rsuUscriptsr}r(UZsymrXI𐐣𐐰𐑃𐐯𐑋𐐰𐐻𐐮𐐿𐐲𐑊 𐑌𐐬𐐻𐐩𐑇𐐲𐑌rUGururX𐐘𐐳𐑉𐑋𐐲𐐿𐐨rUHebrrX𐐐𐐨𐐺𐑉𐐭rUZzzzrXO𐐊𐑌𐐬𐑌 𐐬𐑉 𐐆𐑌𐑂𐐰𐑊𐐮𐐼 𐐝𐐿𐑉𐐮𐐹𐐻rUPhnxrX𐐙𐐬𐑌𐐨𐑇𐐲𐑌rUMoonrX 𐐣𐐭𐑌rUSamrrX$𐐝𐐲𐑋𐐯𐑉𐐲𐐻𐐲𐑌rUChamrX 𐐗𐐰𐑋rUGujrrX 𐐘𐐳𐐾𐐲𐑉𐐪𐐼𐐨rUZxxxrX𐐊𐑌𐑉𐐮𐐻𐐲𐑌rULycirX𐐢𐐮𐑇𐐲𐑌rUSinhrX𐐝𐐮𐑌𐐸𐐪𐑊𐐲rUTalurX𐐤𐐭 𐐓𐐴 𐐢𐐭𐐯rUMongrX 𐐣𐐱𐑍𐐬𐑊𐐨𐐲𐑌rUXpeorX%𐐄𐑊𐐼 𐐑𐐲𐑉𐑈𐐲𐑌rUVisprX-𐐚𐐱𐑆𐐱𐐺𐐲𐑊 𐐝𐐹𐐨𐐽rURjngrX𐐡𐐲𐐾𐐰𐑍rUOlckrX𐐄𐑊 𐐕𐐨𐐿𐐨rUTalerX𐐓𐐴 𐐢𐐯rUMandrX𐐣𐐰𐑌𐐼𐐨𐐲𐑌rUManirX 𐐣𐐰𐑌𐐲𐐿𐐨𐐲𐑌rUMlymrX 𐐣𐐲𐑊𐐩𐐲𐑊𐐪𐑋rUTibtrX𐐓𐐮𐐺𐐯𐐻𐐲𐑌rUKalirX𐐗𐐪𐐷𐐪 𐐢𐐨rUJpanrX𐐖𐐪𐐹𐐲𐑌𐐨𐑆rUPlrdrX5𐐑𐐱𐑊𐐲𐑉𐐼 𐐙𐐬𐑌𐐯𐐻𐐮𐐿rUKanarX 𐐗𐐪𐐻𐐲𐐿𐐪𐑌𐐲rULydirX𐐢𐐮𐐼𐐨𐐲𐑌rULepcrX𐐢𐐯𐐹𐐽𐐲rUSundrX 𐐝𐐲𐑌𐐼𐐲𐑌𐐨𐑆rUYiiirX𐐏𐐨rUJavarX𐐖𐐪𐑂𐐲𐑌𐐨𐑆rUOryarX𐐉𐑉𐐨𐐲rULaoorX𐐢𐐵rUUgarrX$𐐏𐐭𐑀𐐲𐑉𐐮𐐻𐐮𐐿rUCyrlrX𐐝𐐲𐑉𐐮𐑊𐐮𐐿rUVaiirX𐐚𐐴rUArmnrX 𐐂𐑉𐑋𐐨𐑌𐐨𐐲𐑌rUCyrsrX[𐐄𐑊𐐼 𐐕𐐲𐑉𐐽 𐐝𐑊𐐲𐑂𐐱𐑌𐐮𐐿 𐐗𐐲𐑉𐐮𐑊𐐮𐐿rUKhmrrX𐐗𐐲𐑋𐐯𐑉rUArmirX=𐐆𐑋𐐹𐐮𐑉𐐨𐐲𐑊 𐐁𐑉𐐲𐑋𐐩𐐮𐐿rUSylorX-𐐝𐐴𐑊𐐱𐐻𐐨 𐐤𐐰𐑀𐑉𐐨rUItalrX%𐐄𐑊𐐼 𐐆𐐻𐐰𐑊𐐮𐐿rUSgnwrX!𐐝𐐴𐑌 𐐡𐐴𐐻𐐨𐑍rUXsuxrX^𐐝𐐭𐑋𐐯𐑉𐐬-𐐊𐐿𐐩𐐼𐐨𐐲𐑌 𐐗𐐷𐐭𐑌𐐨𐐲𐑁𐐱𐑉𐑋rUThaarX𐐓𐐪𐐱𐑌𐐲rUThairX𐐓𐐴rUCprtrX𐐝𐐮𐐹𐑉𐐨𐐲𐐻rULinbrX𐐢𐐮𐑌𐐨𐐲𐑉 𐐒rULinarX𐐢𐐮𐑌𐐨𐐲𐑉 𐐁rUOsmarX𐐉𐑅𐑋𐐪𐑌𐐷𐐪rUSaurrX$𐐝𐐰𐐭𐑉𐐪𐑇𐐻𐑉𐐪rUHirarX 𐐐𐐮𐑉𐐲𐑀𐐪𐑌𐐲rUHanirX 𐐐𐐪𐑌r UEgydr X9𐐀𐐾𐐮𐐹𐐽𐐲𐑌 𐐼𐐲𐑋𐐱𐐻𐐮𐐿r UQaair X$𐐆𐑌𐐸𐐯𐑉𐐮𐐻𐐲𐐼r UEgyhrX9𐐀𐐾𐐮𐐹𐐽𐐲𐑌 𐐸𐐴𐑉𐐰𐐻𐐮𐐿rUCansrX𐐏𐐭𐑌𐐮𐑁𐐴𐐼 𐐗𐐲𐑌𐐩𐐼𐐨𐐲𐑌 𐐈𐐺𐐬𐑉𐐮𐐾𐐲𐑊𐐲𐑊 𐐝𐐮𐑊𐐰𐐺𐐮𐐿𐑅rUEgyprXI𐐀𐐾𐐮𐐹𐐽𐐲𐑌 𐐸𐐴𐑉𐐬𐑀𐑊𐐮𐑁𐐮𐐿𐑅rUZmthrXI𐐣𐐰𐑃𐐲𐑋𐐰𐐻𐐲𐐿𐐲𐑊 𐐤𐐬𐐻𐐩𐑇𐐲𐑌rUTfngrX𐐓𐐮𐑁𐐮𐑌𐐪rUShawrX𐐟𐐩𐑂𐐨𐐲𐑌rUCirtrX𐐗𐐲𐑉𐑃rUGeorrX𐐖𐐬𐑉𐐾𐐲𐑌rUTengrX𐐓𐐯𐑍𐐶𐐪𐑉rUHrktr XJ𐐗𐐪𐐻𐐲𐐿𐐪𐑌𐐲 𐐬𐑉 𐐐𐐮𐑉𐐲𐑀𐐪𐑌𐐲r!UGeokr"X5𐐖𐐱𐑉𐐾𐐲𐑌 𐐗𐐳𐐻𐑅𐐭𐑉𐐨r#UTavtr$X𐐓𐐴 𐐚𐐨𐐯𐐻r%UOgamr&X 𐐄𐐲𐑋r'UDsrtr(X𐐔𐐯𐑆𐐲𐑉𐐯𐐻r)UGothr*X𐐘𐐱𐑃𐐮𐐿r+UHanor,X𐐐𐐲𐑌𐐭𐐲𐑌𐐭r-UBalir.X𐐒𐐪𐑊𐐲𐑌𐐨𐑆r/UKorer0X𐐗𐐬𐑉𐐨𐐲𐑌r1UHangr2X𐐐𐐪𐑌𐑀𐐲𐑊r3UCarir4X𐐗𐐱𐑉𐐨𐐲𐑌r5UAvstr6X𐐊𐑂𐐯𐑅𐐻𐐲𐑌r7UTagbr8X 𐐓𐐲𐑀𐐺𐐪𐑌𐐶𐐪r9UHansr:X1𐐝𐐮𐑋𐐹𐑊𐐮𐑁𐐴𐐼 𐐐𐐪𐑌r;UHantr<X5𐐓𐑉𐐲𐐼𐐮𐑇𐐲𐑌𐐲𐑊 𐐐𐐪𐑌r=URoror>X(𐐡𐐪𐑍𐑀𐐬𐑉𐐪𐑌𐑀𐐬r?UDevar@X(𐐔𐐩𐑂𐐲𐑌𐐪𐑀𐐲𐑉𐐨rAUIndsrBX𐐆𐑌𐐼𐐲𐑅rCUBoporDX 𐐒𐐱𐐹𐐱𐑋𐐱𐑁𐐱rEUMymrrFX𐐣𐐨𐐲𐑌𐑋𐐪𐑉rGUTglgrHX𐐓𐐲𐑀𐐪𐑊𐐲𐑀rIUPermrJX%𐐄𐑊𐐼 𐐑𐐯𐑉𐑋𐐮𐐿rKUBugirLX𐐒𐐭𐑀𐐮𐑌𐐨𐑆rMUBrairNX𐐒𐑉𐐩𐑊rOUBrahrPX𐐒𐑉𐐪𐑋𐐨rQUBatkrRX𐐒𐐲𐐻𐐪𐐿rSUMerorTX 𐐣𐐯𐑉𐐬𐐮𐐻𐐮𐐿rUULimbrVX𐐢𐐮𐑋𐐺𐐭rWUMteirXX!𐐣𐐩𐐻𐐩 𐐣𐐴𐐯𐐿rYUPhlirZXI𐐆𐑌𐑅𐐿𐑉𐐮𐐹𐑇𐐲𐑌𐐲𐑊 𐐑𐐪𐑊𐐲𐑂𐐨r[UTelur\X𐐓𐐯𐑊𐐭𐑀𐐭r]UTamlr^X𐐓𐐰𐑋𐐮𐑊r_USarar`X𐐝𐐪𐑉𐐪𐐮𐐻𐐨raUPhlprbX1𐐝𐐱𐑊𐐻𐐲𐑉 𐐑𐐪𐑊𐐲𐑂𐐨rcULatgrdX)𐐘𐐩𐑊𐐮𐐿 𐐢𐐰𐐻𐐮𐑌reULatfrfX1𐐙𐑉𐐰𐐿𐐻𐐲𐑉 𐐢𐐰𐐻𐐮𐑌rgUKharrhX𐐗𐐲𐑉𐐬𐑇𐑃𐐨riUNkoorjX𐐤’𐐗𐐬rkUPhlvrlX%𐐒𐐳𐐿 𐐑𐐪𐑊𐐲𐑂𐐨rmULatnrnX𐐢𐐰𐐻𐐮𐑌roUMayarpX9𐐣𐐴𐐲𐑌 𐐸𐐴𐑉𐐬𐑀𐑊𐐮𐑁𐐮𐐿rqULanarrX𐐢𐐪𐑌𐐲rsUEthirtX𐐀𐑃𐐨𐐪𐐹𐐮𐐿ruUKthirvX𐐗𐐴𐐮𐐻𐐨rwUArabrxX𐐇𐑉𐐲𐐺𐐮𐐿ryUBuhdrzX𐐒𐐭𐐸𐐮𐐼r{UCoptr|X𐐗𐐱𐐹𐐻𐐮𐐿r}UPrtir~XM𐐆𐑌𐑅𐐿𐑉𐐮𐐹𐑇𐐲𐑌𐐲𐑊 𐐑𐐱𐑉𐑃𐐨𐐲𐑌rUGlagrX(𐐘𐑊𐐰𐑀𐐬𐑊𐐮𐐻𐐮𐐿rURunrrX𐐡𐐭𐑌𐐮𐐿rUOrkhrX𐐄𐑉𐐿𐐱𐑌rUCakmrX𐐕𐐪𐐿𐑋𐐲rUHungrX-𐐄𐑊𐐼 𐐐𐐲𐑍𐐩𐑉𐐨𐐲𐑌rUGrekrX𐐘𐑉𐐨𐐿rUCherrX𐐕𐐯𐑉𐐬𐐿𐐨rUZyyyrX𐐗𐐱𐑋𐐲𐑌rUSyrcrX𐐝𐐮𐑉𐐨𐐰𐐿rUBlisrX(𐐒𐑊𐐮𐑅𐐮𐑋𐐺𐐲𐑊𐑆rUBengrX𐐒𐐯𐑌𐑀𐐪𐑊𐐨rUSyrerXA𐐇𐑅𐐻𐑉𐐪𐑍𐐾𐐯𐑊𐐬 𐐝𐐮𐑉𐐨𐐰𐐿rUSyrjrX5𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐝𐐮𐑉𐐨𐐰𐐿rUSyrnrX1𐐀𐑅𐐻𐐲𐑉𐑌 𐐝𐐮𐑉𐐨𐐰𐐿rUKndarX𐐗𐐪𐑌𐐲𐐼𐐲ruUvariantsr}r(UBAKU1926rXc𐐏𐐭𐑌𐐲𐑁𐐴𐐼 𐐓𐐲𐑉𐐿𐐮𐐿 𐐢𐐰𐐻𐑌 𐐈𐑊𐑁𐐲𐐺𐐲𐐻rUREVISEDrX=𐐡𐐲𐑂𐐴𐑆𐐼 𐐉𐑉𐑃𐐪𐑀𐑉𐐲𐑁𐐨rUAREVMDArX=𐐎𐐯𐑅𐐻𐐲𐑉𐑌 𐐂𐑉𐑋𐐨𐑌𐐨𐐲𐑌rUFONIPArX-𐐆𐐙𐐈 𐐙𐐬𐑌𐐯𐐻𐐮𐐿𐑅rU1606NICTrX@𐐢𐐩𐐻 𐐣𐐮𐐼𐑊 𐐙𐑉𐐯𐑌𐐽 𐐻𐐭 1606rUSCOTLANDrXN𐐝𐐿𐐪𐐼𐐮𐑇 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐆𐑍𐑊𐐮𐑇rUGAULISHrX𐐘𐐪𐑊𐐮𐑇rU1996rXK𐐖𐐲𐑉𐑋𐐲𐑌 𐐱𐑉𐑃𐐪𐑀𐑉𐐲𐑁𐐨 𐐲𐑂 1996rUGUOYUrX_𐐣𐐰𐑌𐐼𐐲𐑉𐐲𐑌 𐐬𐑉 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐕𐐴𐑌𐐨𐑆rUHAKKArX𐐐𐐲𐐿𐐪rULOJBANrX𐐢𐐱𐐾𐐺𐐰𐑌rU1694ACADrX>𐐊𐑉𐑊𐐨 𐐣𐐪𐐼𐐲𐑉𐑌 𐐙𐑉𐐯𐑌𐐽rUAREVELArX9𐐀𐑅𐐻𐐲𐑉𐑌 𐐂𐑉𐑋𐐨𐑌𐐨𐐲𐑌rUMONOTONrX$𐐣𐐪𐑌𐐲𐐻𐐪𐑌𐐮𐐿rUPOSIXrX$𐐗𐐲𐑋𐐹𐐷𐐭𐐻𐐯𐑉rUPOLYTONrX$𐐑𐐱𐑊𐐨𐐻𐐱𐑌𐐮𐐿rUXIANGrX6𐐟𐐨𐐰𐑍 𐐬𐑉 𐐐𐐭𐑌𐐪𐑌𐐨𐑆rU1901rXb𐐓𐑉𐐲𐐼𐐮𐑇𐐲𐑌𐑊 𐐖𐐲𐑉𐑋𐐲𐑌 𐐱𐑉𐑃𐐪𐑀𐑉𐐲𐑁𐐨ruUnumber_symbolsr}rUcurrency_namesr}rUmonthsr}r(U stand-aloner}r(Uwider}r(KX 𐐖𐐰𐑌𐐷𐐭𐐯𐑉𐐨rKX𐐣𐐪𐑉𐐽rKX𐐁𐐹𐑉𐐮𐑊rKX𐐣𐐩rKX 𐐖𐐭𐑌rKX𐐖𐐭𐑊𐐴rKX𐐂𐑀𐐲𐑅𐐻rK X$𐐝𐐯𐐹𐐻𐐯𐑋𐐺𐐲𐑉rK X𐐉𐐿𐐻𐐬𐐺𐐲𐑉rK X 𐐤𐐬𐑂𐐯𐑋𐐺𐐲𐑉rK X 𐐔𐐨𐑅𐐯𐑋𐐺𐐲𐑉ruU abbreviatedr}r(KX 𐐖𐐰𐑌rKX 𐐣𐐪𐑉rKX 𐐁𐐹𐑉rKX𐐣𐐩rKX 𐐖𐐭𐑌rKX 𐐖𐐭𐑊rKX𐐂𐑀rK X 𐐝𐐯𐐹rK X 𐐉𐐿𐐻rK X 𐐤𐐬𐑂rK X 𐐔𐐨𐑅ruUnarrowr}r(KX𐐖rKX𐐙rKX𐐣rKX𐐁rKX𐐣rKX𐐖rKX𐐖rKX𐐂rK X𐐝rK X𐐉rK X𐐤rK X𐐔ruuUformatr}r(Uwider}r(KX 𐐖𐐰𐑌𐐷𐐭𐐯𐑉𐐨rKX 𐐙𐐯𐐺𐑉𐐭𐐯𐑉𐐨rKX𐐣𐐪𐑉𐐽rKX𐐁𐐹𐑉𐐮𐑊rKX𐐣𐐩rKX 𐐖𐐭𐑌rKX𐐖𐐭𐑊𐐴rKX𐐂𐑀𐐲𐑅𐐻rK X$𐐝𐐯𐐹𐐻𐐯𐑋𐐺𐐲𐑉rK X𐐉𐐿𐐻𐐬𐐺𐐲𐑉rK X 𐐤𐐬𐑂𐐯𐑋𐐺𐐲𐑉rK X 𐐔𐐨𐑅𐐯𐑋𐐺𐐲𐑉ruU abbreviatedr}r(KX 𐐖𐐰𐑌rKX 𐐙𐐯𐐺rKX 𐐣𐐪𐑉rKX 𐐁𐐹𐑉r KX𐐣𐐩r KX 𐐖𐐭𐑌r KX 𐐖𐐭𐑊r KX𐐂𐑀r K X 𐐝𐐯𐐹rK X 𐐉𐐿𐐻rK X 𐐤𐐬𐑂rK X 𐐔𐐨𐑅ruUnarrowr}r(KX𐐖rKX𐐙rKX𐐣rKX𐐁rKX𐐣rKX𐐖rKX𐐖rKX𐐂rK X𐐝rK X𐐉rK X𐐤rK X𐐔ruuuUcurrency_formatsr }r!Udaysr"}r#(U stand-aloner$}r%Unarrowr&}r'(KX𐐣r(KX𐐓r)KX𐐎r*KX𐐛r+KX𐐙r,KX𐐝r-KX𐐝r.usUformatr/}r0(Uwider1}r2(KX𐐣𐐲𐑌𐐼𐐩r3KX𐐓𐐭𐑆𐐼𐐩r4KX𐐎𐐯𐑌𐑆𐐼𐐩r5KX𐐛𐐲𐑉𐑆𐐼𐐩r6KX𐐙𐑉𐐴𐐼𐐩r7KX𐐝𐐰𐐻𐐲𐑉𐐼𐐩r8KX𐐝𐐲𐑌𐐼𐐩r9uU abbreviatedr:}r;(KX 𐐣𐐲𐑌r<KX 𐐓𐐭𐑆r=KX 𐐎𐐯𐑌r>KX 𐐛𐐲𐑉r?KX 𐐙𐑉𐐴r@KX 𐐝𐐰𐐻rAKX 𐐝𐐲𐑌rBuuuU meta_zonesrC}rD(U Alaska_HawaiirE}rF(UshortrG}rH(UgenericrIX 𐐊𐐐𐐓rJUdaylightrKX𐐊𐐐𐐔𐐓rLUstandardrMX𐐊𐐐𐐝𐐓rNuUcommonrOUlongrP}rQ(jIX:𐐊𐑊𐐰𐑅𐐿𐐲-𐐐𐐲𐐶𐐴𐐨 𐐓𐐴𐑋rRjKXO𐐊𐑊𐐰𐑅𐐿𐐲-𐐐𐐲𐐶𐐴𐐨 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rSjMX[𐐊𐑊𐐰𐑅𐐿𐐲-𐐐𐐲𐐶𐐴𐐨 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋rTuuUAmerica_PacificrU}rV(jG}rW(jIX𐐑𐐓rXjKX 𐐑𐐔𐐓rYjMX 𐐑𐐝𐐓rZujOjP}r[(jIX)𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐓𐐴𐑋r\jKX>𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋r]jMXK𐐑𐐲𐑅𐐮𐑁𐐮𐐿 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋r^uuUAmerica_Mountainr_}r`(jG}ra(jIX𐐣𐐓rbjKX 𐐣𐐔𐐓rcjMX 𐐣𐐝𐐓rdujOjP}re(jIX%𐐣𐐵𐑌𐐻𐐲𐑌 𐐓𐐴𐑋rfjKX:𐐣𐐵𐑌𐐻𐐲𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rgjMXG𐐣𐐵𐑌𐐻𐐲𐑌 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋rhuuUAlaskari}rj(jG}rk(jIX 𐐊𐐗𐐓rljKX𐐊𐐗𐐔𐐓rmjMX𐐊𐐗𐐝𐐓rnujOjP}ro(jIX$𐐊𐑊𐐰𐑅𐐿𐐲𐐓𐐴𐑋rpjKX9𐐊𐑊𐐰𐑅𐐿𐐲𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rqjMXF𐐊𐑊𐐰𐑅𐐿𐐲 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋rruuUAmerica_Easternrs}rt(jG}ru(jIX𐐀𐐓rvjKX 𐐀𐐔𐐓rwjMX 𐐀𐐝𐐓rxujOjP}ry(jIX%𐐀𐑅𐐻𐐲𐑉𐑌 𐐓𐐴𐑋rzjKX:𐐀𐑅𐐻𐐲𐑉𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋r{jMXG𐐀𐑅𐐻𐐲𐑉𐑌 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋r|uuUBeringr}}r~(jG}r(jIX 𐐒𐐓 (𐐒𐐯𐑉𐐮𐑍 )rjKX$𐐒𐐔𐐓 (𐐒𐐯𐑉𐐮𐑍 )rjMX$𐐒𐐝𐐓 (𐐒𐐯𐑉𐐮𐑍 )rujOjP}r(jIX!𐐒𐐯𐑉𐐮𐑍 𐐓𐐴𐑋rjKX6𐐒𐐯𐑉𐐮𐑍 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rjMXB𐐒𐐯𐑉𐐮𐑍 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋ruuUAtlanticr}r(jG}r(jIX𐐈𐐓rjKX 𐐈𐐔𐐓rjMX 𐐈𐐝𐐓rujOjP}r(jIX-𐐈𐐻𐑊𐐰𐑌𐐻𐐮𐐿 𐐓𐐴𐑋rjKXB𐐈𐐻𐑊𐐰𐑌𐐻𐐮𐐿 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rjMXO𐐈𐐻𐑊𐐰𐑌𐐻𐐮𐐿 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋ruuUAmerica_Centralr}r(jG}r(jIX𐐝𐐓rjKX 𐐝𐐔𐐓rjMX 𐐝𐐝𐐓rujOjP}r(jIX)𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐓𐐴𐑋rjKX>𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rjMXK𐐝𐐯𐑌𐐻𐑉𐐲𐑊 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋ruuU Hong_Kongr}r(jG}r(jKX𐐐𐐗𐐝𐐓rjMX 𐐐𐐗𐐓rujOjP}r(jKX;𐐐𐐱𐑍 𐐗𐐱𐑍 𐐝𐐲𐑋𐐲𐑉 𐐓𐐴𐑋rjMX&𐐐𐐱𐑍 𐐗𐐱𐑍 𐐓𐐴𐑋ruuU Newfoundlandr}r(jG}r(jIX𐐤𐐓rjKX 𐐤𐐔𐐓rjMX 𐐤𐐝𐐓rujOjP}r(jIX5𐐤𐐭𐑁𐐲𐑌𐐼𐑊𐐲𐑌𐐼 𐐓𐐴𐑋rjKXJ𐐤𐐭𐑁𐐲𐑌𐐼𐑊𐐲𐑌𐐼 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rjMXV𐐤𐐭𐑁𐐲𐑌𐐼𐑊𐐲𐑌𐐼 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋ruuUYukonr}r(jG}r(jIX𐐏𐐓rjKX 𐐏𐐔𐐓rjMX 𐐏𐐝𐐓rujOjP}r(jIX6𐐏𐐭𐐿𐐪𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rjKX6𐐏𐐭𐐿𐐪𐑌 𐐔𐐩𐑊𐐴𐐻 𐐓𐐴𐑋rjMXB𐐏𐐭𐐿𐐪𐑌 𐐝𐐻𐐰𐑌𐐼𐐲𐑉𐐼 𐐓𐐴𐑋ruuuUerasr}r(Uwider}r(KX)𐐒𐐲𐑁𐐬𐑉 𐐗𐑉𐐴𐑅𐐻rKX%𐐈𐑌𐐬 𐐔𐐱𐑋𐐮𐑌𐐨ruU abbreviatedr}r(KX𐐒𐐗rKX𐐈𐐔ruUnarrowr}r(KX𐐒rKX𐐈ruuu.PK[@(site-packages/babel/localedata/ar_AE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[iRDRD'site-packages/babel/localedata/root.datnu[}q(U zone_formatsq}q(UregionqX%sqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}q(Uwideqcbabel.localedata Alias q)q}qUkeysqh UformatqUwideqqsbU abbreviatedqh)q}qhh UformatqU abbreviatedqqsbUnarrowq}q(KX1q KX2q!KX3q"KX4q#uuUformatq$}q%(Uwideq&}q'(KXQ1q(KXQ2q)KXQ3q*KXQ4q+uU abbreviatedq,h)q-}q.hh h$Uwideq/q0sbUnarrowq1h)q2}q3hh U stand-aloneq4Unarrowq5q6sbuuUperiodsq7}q8(Uamq9XAMq:Upmq;XPMqNcbabel.numbers NumberPattern q?)q@}qA(Uexp_precqBKKqCUscaleqDKU frac_precqEKKqFUsuffixqGXqHhHqIUint_precqJKKqKUpatternqLX#E0qMUprefixqNhHX-qOqPUexp_plusqQUgroupingqRMMqSubsUpercent_formatsqT}qUNh?)qV}qW(hBNhDKdhEKKqXhGX%qYhYqZhJKKq[hLX#,##0%q\hNhHhOq]hQNhRKKq^ubsU week_dataq_}q`(Umin_daysqaKU weekend_startqbKU first_dayqcKU weekend_endqdKuU time_formatsqe}qf(Umediumqgcbabel.dates DateTimePattern qh)qi}qj(hLXHH:mm:ssqkUformatqlX%(HH)s:%(mm)s:%(ss)sqmubUfullqnhh)qo}qp(hLX HH:mm:ss vqqhlX%(HH)s:%(mm)s:%(ss)s %(v)sqrubUlongqshh)qt}qu(hLX HH:mm:ss zqvhlX%(HH)s:%(mm)s:%(ss)s %(z)sqwubUshortqxhh)qy}qz(hLXHH:mmq{hlX %(HH)s:%(mm)sq|ubuU languagesq}}q~U territoriesq}qUdecimal_formatsq}qNh?)q}q(hBNhDKhEKKqhGhHhHqhJKKqhLX #,##0.###qhNhHhOqhQNhRKKqubsU date_formatsq}q(Umediumqhh)q}q(hLX yyyy MMM dqhlX%(yyyy)s %(MMM)s %(d)squbUfullqhh)q}q(hLXEEEE, yyyy MMMM ddqhlX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)squbUlongqhh)q}q(hLX yyyy MMMM dqhlX%(yyyy)s %(MMMM)s %(d)squbUshortqhh)q}q(hLX yyyy-MM-ddqhlX%(yyyy)s-%(MM)s-%(dd)squbuUcurrency_symbolsq}q(UITLqXIT₤qUUSDqXUS$qUJPYqXJP¥qUBRLqXR$qUGBPqXUK£qUEURqX€quU time_zonesq}q(UAmerica/North_Dakota/Centerq}qUcityqXCenter, North DakotaqsUAmerica/Indiana/Tell_Cityq}qhXTell City, IndianaqsUAmerica/Indiana/Vevayq}qhXVevay, IndianaqsUAntarctica/DumontDUrvilleq}qhXDumont d'UrvilleqsUAmerica/St_Johnsq}qhX St. John'sqsUAmerica/Kentucky/Monticelloq}qhXMonticello, KentuckyqsU Etc/Unknownq}qhXUnknownqsUAmerica/North_Dakota/New_Salemq}qhXNew Salem, North DakotaqsUAmerica/Indiana/Vincennesq}qhXVincennes, IndianaqsUAmerica/Indiana/Winamacq}qhXWinamac, IndianaqsUAmerica/Indiana/Knoxq}qhX Knox, IndianaqsUAmerica/Indiana/Petersburgq}qhXPetersburg, IndianaqsUAmerica/Indiana/Marengoq}qhXMarengo, IndianaqsuUscriptsq}qUvariantsq}qUnumber_symbolsq}q(UgroupqX,qUnativeZeroDigitqX0qU exponentialqXEqUperMilleqX‰qUnanqXNaNqUdecimalqX.qU percentSignqhYUlistqX;qU patternDigitqX#qUplusSignqX+qUinfinityqX∞qU minusSignqhOuUcurrency_namesq}q(hXITLqhXUSDqUINRqXINRqhXJPYqhXBRLqhXGBPqhXEURquUmonthsq}r(U stand-aloner}r(Uwiderh)r}rhhUformatrUwiderrsbU abbreviatedr h)r }r hhUformatr U abbreviatedr rsbUnarrowr}r(Kh Kh!Kh"Kh#KX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12ruuUformatr}r(Uwider}r(Kh Kh!Kh"Kh#KjKjKjKjK jK X10rK X11rK X12ruU abbreviatedr h)r!}r"hhjUwider#r$sbUnarrowr%h)r&}r'hhU stand-aloner(Unarrowr)r*sbuuUcurrency_formatsr+}r,Nh?)r-}r.(hBNhDKhEKKr/hGhHhHr0hJKKr1hLX ¤ #,##0.00r2hNX¤ r3X-¤ r4r5hQNhRKKr6ubsUdaysr7}r8(U stand-aloner9}r:(Uwider;h)r<}r=hj7Uformatr>Uwider?r@sbU abbreviatedrAh)rB}rChj7UformatrDU abbreviatedrErFsbUnarrowrG}rH(Kh!Kh"Kh#KjKjKjKh uuUformatrI}rJ(UwiderK}rL(Kh!Kh"Kh#KjKjKjKh uU abbreviatedrMh)rN}rOhj7jIUwiderPrQsbUnarrowrRh)rS}rThj7U stand-alonerUUnarrowrVrWsbuuU meta_zonesrX}rY(U TurkmenistanrZ}r[(Ushortr\}r](Udaylightr^XTMSTr_Ustandardr`XTMTrauUcommonrbuU Kuybyshevrc}rd(j\}re(j^XKUYSTrfj`XKUYTrgujbuURotherarh}ri(j\}rjj`XROTTrksjbuUArabianrl}rm(j\}rn(j^XADT (SA)roj`XAST (SA)rpujbuUAustralia_Easternrq}rr(j\}rs(j^XAEDTrtj`XAESTruujbuU Argentinarv}rw(j\}rx(j^XARSTryj`XARTrzujbuUBoliviar{}r|(j\}r}j`XBOTr~sjbuU Alaska_Hawaiir}r(j\}r(j^XAHDTrj`XAHSTrujbuU Cape_Verder}r(j\}r(j^XCVSTrj`XCVTrujbuUAzoresr}r(j\}r(j^XAZOSTrj`XAZOTrujbuUPierre_Miquelonr}r(j\}r(j^XPMDTrj`XPMSTrujbuUEurope_Centralr}r(j\}r(j^XCESTrj`XCETrujbuUTrukr}r(j\}rj`XTRUTrsjbuU Aktyubinskr}r(j\}r(j^XAKTSTrj`XAKTTrujbuUBeringr}r(j\}r(j^X BDT (Bering)rj`X BST (Bering)rujbuU Qyzylordar}r(j\}r(j^XQYZSTrj`XQYZTrujbuUKazakhstan_Easternr}r(j\}rj`XEKSTrsjbuUFrunzer}r(j\}r(j^XFRUSTrj`XFRUTrujbuU Dutch_Guianar}r(j\}rj`XNEGTrsjbuUYerevanr}r(j\}r(j^XYERSTrj`XYERTrujbuU Kamchatkar}r(j\}r(j^XPETSTrj`XPETTrujbuUKashgarr}r(j\}rj`XKASTrsjbuUMaldivesr}r(j\}rj`XMVTrsjbuUNorfolkr}r(j\}rj`XNFTrsjbuU East_Timorr}r(j\}rj`XTLTrsjbuUAfrica_Easternr}r(j\}rj`XEATrsjbuU Ashkhabadr}r(j\}r(j^XASHSTrj`XASHTrujbuUAlaskar}r(j\}r(j^XAKDTrj`XAKSTrujbuUAmerica_Easternr}r(j\}r(j^XEDTrj`XESTrujbuU Yekaterinburgr}r(j\}r(j^XYEKSTrj`XYEKTrujbuUSolomonr}r(j\}rj`XSBTrsjbuU Krasnoyarskr}r(j\}r(j^XKRASTrj`XKRATrujbuUAmerica_Centralr}r(j\}r(j^XCDTrj`XCSTrujbuUMawsonr}r(j\}rj`XMAWTrsjbuUPakistanr}r(j\}r(j^XPKSTrj`XPKTrujbuUSamoar}r(j\}rj`XSSTrsjbuUMacaur}r(j\}r(j^XMOSTrj`XMOTr ujbuUChamorror }r (j\}r j`XChSTr sjbuUGuamr}r(j\}rj`XGST (GU)rsjbuUIndiar}r(j\}rj`XISTrsjbuU Azerbaijanr}r(j\}r(j^XAZSTrj`XAZTrujbuU Marquesasr}r(j\}rj`XMARTrsjbuU Tajikistanr}r (j\}r!j`XTJTr"sjbuUPitcairnr#}r$(j\}r%j`XPNTr&sjbuUTurkeyr'}r((j\}r)(j^XTRSTr*j`XTRTr+ujbuU Afghanistanr,}r-(j\}r.j`XAFTr/sjbuU Choibalsanr0}r1(j\}r2(j^XCHOSTr3j`XCHOTr4ujbuU Vladivostokr5}r6(j\}r7(j^XVLASTr8j`XVLATr9ujbuU Shevchenkor:}r;(j\}r<(j^XSHESTr=j`XSHETr>ujbuU Bangladeshr?}r@(j\}rAj`XBDTrBsjbuUGulfrC}rD(j\}rEj`XGSTrFsjbuUDaccarG}rH(j\}rIj`XDACTrJsjbuUMongoliarK}rL(j\}rM(j^XULASTrNj`XULATrOujbuU SamarkandrP}rQ(j\}rR(j^XSAMST (Samarkand)rSj`XSAMT (Samarkand)rTujbuUWakerU}rV(j\}rWj`XWAKTrXsjbuUPerurY}rZ(j\}r[(j^XPESTr\j`XPETr]ujbuUVanuatur^}r_(j\}r`(j^XVUSTraj`XVUTrbujbuUIndonesia_Centralrc}rd(j\}rej`XCITrfsjbuUNaururg}rh(j\}rij`XNRTrjsjbuUFalklandrk}rl(j\}rm(j^XFKSTrnj`XFKTroujbuUKorearp}rq(j\}rr(j^XKDTrsj`XKSTrtujbuUCubaru}rv(j\}rw(j^XCDT (CU)rxj`XCST (CU)ryujbuUIrkutskrz}r{(j\}r|(j^XIRKSTr}j`XIRKTr~ujbuUArgentina_Westernr}r(j\}rj`XWARTrsjbuUAmazonr}r(j\}r(j^XAMSTrj`XAMTrujbuUChinar}r(j\}r(j^XCDT (CN)rj`XCST (CN)rujbuULong_Shur}r(j\}rj`XLONTrsjbuUArmeniar}r(j\}r(j^X AMST (AM)rj`XAMT (AM)rujbuUCookr}r(j\}r(j^XCKHSTrj`XCKTrujbuUChathamr}r(j\}r(j^XCHADTrj`XCHASTrujbuUGreenland_Westernr}r(j\}r(j^XWGSTrj`XWGTrujbuUKarachir}r(j\}rj`XKARTrsjbuUTongar}r(j\}r(j^XTOSTrj`XTOTrujbuUSakhalinr}r(j\}r(j^XSAKSTrj`XSAKTrujbuUBrasiliar}r(j\}r(j^XBRSTrj`XBRTrujbuUSyowar}r(j\}rj`XSYOTrsjbuU French_Guianar}r(j\}rj`XGFTrsjbuUFrench_Southernr}r(j\}rj`XTFTrsjbuU Mauritiusr}r(j\}r(j^XMUSTrj`XMUTrujbuUAfrica_Southernr}r(j\}rj`XSASTrsjbuUGambierr}r(j\}rj`XGAMTrsjbuUDavisr}r(j\}rj`XDAVTrsjbuU Newfoundlandr}r(j\}r(j^XNDTrj`XNSTrujbuUCocosr}r(j\}rj`XCCTrsjbuU Kyrgystanr}r(j\}rj`XKGTrsjbuUTokelaur}r(j\}rj`XTKTrsjbuUAustralia_Westernr}r(j\}r(j^XAWDTrj`XAWSTrujbuUBakur}r(j\}r(j^XBAKSTrj`XBAKTrujbuUAfrica_Centralr}r(j\}rj`XCATrsjbuU Line_Islandsr}r(j\}rj`XLINTrsjbuU Novosibirskr}r(j\}r(j^XNOVSTrj`XNOVTrujbuUJapanr}r(j\}r(j^XJDTrj`XJSTrujbuU Sverdlovskr}r(j\}r(j^XSVESTrj`XSVETrujbuU New_Caledoniar}r(j\}r (j^XNCSTr j`XNCTr ujbuU Kwajaleinr }r (j\}rj`XKWATrsjbuUAqtober}r(j\}r(j^XAQTST (Aqtobe)rj`X AQTT (Aqtobe)rujbuUGilbert_Islandsr}r(j\}rj`XGILTrsjbuUAustralia_CentralWesternr}r(j\}r(j^XACWDTrj`XACWSTrujbuU Indochinar}r(j\}r j`XICTr!sjbuUPapua_New_Guinear"}r#(j\}r$j`XPGTr%sjbuUHovdr&}r'(j\}r((j^XHOVSTr)j`XHOVTr*ujbuU South_Georgiar+}r,(j\}r-j`XGST (GS)r.sjbuUEcuadorr/}r0(j\}r1j`XECTr2sjbuUMalayar3}r4(j\}r5j`XMALTr6sjbuUBruneir7}r8(j\}r9j`XBNTr:sjbuUIranr;}r<(j\}r=(j^XIRDTr>j`XIRSTr?ujbuUAqtaur@}rA(j\}rB(j^X AQTST (Aqtau)rCj`X AQTT (Aqtau)rDujbuU Indian_OceanrE}rF(j\}rGj`XIOTrHsjbuUTuvalurI}rJ(j\}rKj`XTVTrLsjbuUAmerica_MountainrM}rN(j\}rO(j^XMDTrPj`XMSTrQujbuUHawaii_AleutianrR}rS(j\}rTj`XHSTrUsjbuUChangbairV}rW(j\}rXj`XCHATrYsjbuUChilerZ}r[(j\}r\(j^XCLSTr]j`XCLTr^ujbuUWallisr_}r`(j\}raj`XWFTrbsjbuUKosraerc}rd(j\}rej`XKOSTrfsjbuUDushanberg}rh(j\}ri(j^XDUSSTrjj`XDUSTrkujbuUGeorgiarl}rm(j\}rn(j^XGESTroj`XGETrpujbuUAnadyrrq}rr(j\}rs(j^XANASTrtj`XANATruujbuU Philippinesrv}rw(j\}rx(j^XPHSTryj`XPHTrzujbuUYakutskr{}r|(j\}r}(j^XYAKSTr~j`XYAKTrujbuUIndonesia_Westernr}r(j\}rj`XWITrsjbuUGreenland_Easternr}r(j\}r(j^XEGSTrj`XEGTrujbuUGMTr}r(j\}rj`XGMTrsjbuUMarshall_Islandsr}r(j\}rj`XMHTrsjbuU Seychellesr}r(j\}rj`XSCTrsjbuUUruguayr}r(j\}r(j^XUYSTrj`XUYTrujbuUVostokr}r(j\}rj`XVOSTrsjbuU Uzbekistanr}r(j\}r(j^XUZSTrj`XUZTrujbuUColombiar}r(j\}r(j^XCOSTrj`XCOTrujbuUReunionr}r(j\}rj`XRETrsjbuU Volgogradr}r(j\}r(j^XVOLSTrj`XVOLTrujbuU Kizilordar}r(j\}r(j^XKIZSTrj`XKIZTrujbuUFijir}r(j\}r(j^XFJSTrj`XFJTrujbuUAmerica_Pacificr}r(j\}r(j^XPDTrj`XPSTrujbuUKazakhstan_Westernr}r(j\}rj`XWKSTrsjbuUPalaur}r(j\}rj`XPWTrsjbuUEurope_Easternr}r(j\}r(j^XEESTrj`XEETrujbuUBhutanr}r(j\}rj`XBTTrsjbuUBorneor}r(j\}r(j^XBORSTrj`XBORTrujbuUNepalr}r(j\}rj`XNPTrsjbuU Galapagosr}r(j\}rj`XGALTrsjbuU Lord_Hower}r(j\}r(j^XLHDTrj`XLHSTrujbuUPhoenix_Islandsr}r(j\}rj`XPHOTrsjbuUSurinamer}r(j\}rj`XSRTrsjbuUAcrer}r(j\}r(j^X ACST (Acre)rj`X ACT (Acre)rujbuUEasterr}r(j\}r(j^XEASSTrj`XEASTrujbuU Christmasr}r(j\}rj`XCXTrsjbuUIsraelr}r(j\}r(j^XIDTrj`XIST (IL)rujbuUAfrica_Westernr}r(j\}r(j^XWASTrj`XWATrujbuUTashkentr}r(j\}r(j^XTASSTrj`XTASTrujbuUMalaysiar}r (j\}r j`XMYTr sjbuUNoronhar }r (j\}r(j^XFNSTrj`XFNTrujbuU Venezuelar}r(j\}rj`XVETrsjbuUPonaper}r(j\}rj`XPONTrsjbuUIndonesia_Easternr}r(j\}rj`XEITrsjbuUOmskr}r(j\}r(j^XOMSSTr j`XOMSTr!ujbuUAustralia_Centralr"}r#(j\}r$(j^XACDTr%j`XACSTr&ujbuUAtlanticr'}r((j\}r)(j^XADTr*j`XASTr+ujbuU North_Marianar,}r-(j\}r.j`XMPTr/sjbuULankar0}r1(j\}r2j`XLKTr3sjbuUDumontDUrviller4}r5(j\}r6j`XDDUTr7sjbuUEurope_Westernr8}r9(j\}r:(j^XWESTr;j`XWETr<ujbuU New_Zealandr=}r>(j\}r?(j^XNZDTr@j`XNZSTrAujbuUUrumqirB}rC(j\}rDj`XURUTrEsjbuU Hong_KongrF}rG(j\}rH(j^XHKSTrIj`XHKTrJujbuUGuyanarK}rL(j\}rMj`XGYTrNsjbuUMagadanrO}rP(j\}rQ(j^XMAGSTrRj`XMAGTrSujbuUAlmatyrT}rU(j\}rV(j^XALMSTrWj`XALMTrXujbuUTbilisirY}rZ(j\}r[(j^XTBISTr\j`XTBITr]ujbuUMyanmarr^}r_(j\}r`j`XMMTrasjbuU Singaporerb}rc(j\}rdj`XSGTresjbuUSamararf}rg(j\}rh(j^XSAMSTrij`XSAMTrjujbuUGreenland_Centralrk}rl(j\}rm(j^XCGSTrnj`XCGTroujbuUUralskrp}rq(j\}rr(j^XURASTrsj`XURATrtujbuUTahitiru}rv(j\}rwj`XTAHTrxsjbuUParaguayry}rz(j\}r{(j^XPYSTr|j`XPYTr}ujbuUYukonr~}r(j\}r(j^XYDTrj`XYSTrujbuUMoscowr}r(j\}r(j^XMSKSrj`XMSKrujbuUNiuer}r(j\}rj`XNUTrsjbuuUerasr}r(Uwiderh)r}rhjU abbreviatedrrsbj}r(KXBCErKXCEruUnarrowrh)r}rhjjrsbuu.PK[99-site-packages/babel/localedata/zh_Hans_MO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[{==(site-packages/babel/localedata/or_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/ln_CG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[}tt(site-packages/babel/localedata/de_LI.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}q(Udecimalq X.q Ugroupq X'q uU week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhq Uint_precq!KKq"Upatternq#X ¤ #,##0.00q$Uprefixq%X¤ q&X-¤ q'q(Uexp_plusq)NUgroupingq*KKq+ubsU languagesq,}q-U territoriesq.}q/U time_zonesq0}q1Uscriptsq2}q3Udecimal_formatsq4}q5U meta_zonesq6}q7Uvariantsq8}q9Ucurrency_namesq:}q;u.PK[Ѷ(site-packages/babel/localedata/en_IN.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q Ncbabel.numbers NumberPattern q )q}q(Uexp_precqNUscaleqKdU frac_precqKKqUsuffixqX%qhqUint_precqKKqUpatternqX #,##,##0%qUprefixqXqX-qqUexp_plusqNUgroupingq KKq!ubsU week_dataq"}q#U weekend_startq$KsU time_formatsq%}q&U languagesq'}q(U territoriesq)}q*Udecimal_formatsq+}q,Nh )q-}q.(hNhKhKKq/hhhq0hKKq1hX #,##,##0.###q2hhhq3hNh KKq4ubsU date_formatsq5}q6(Umediumq7cbabel.dates DateTimePattern q8)q9}q:(hX dd-MMM-yyyyq;Uformatqh8)q?}q@(hXEEEE d MMMM yyyyqAh}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q]Unrq^X isiNdebeleq_sU territoriesq`}qaUdecimal_formatsqb}qcNh)qd}qe(h!Nh#Kh$KKqfh&h'h'qgh)KKqhh+X #,##0.###qih-h'h.qjh0Nh1KKqkubsU date_formatsql}qm(UmediumqnhG)qo}qp(h+X yyyy MMM dqqhKX%(yyyy)s %(MMM)s %(d)sqrubUfullqshG)qt}qu(h+XEEEE, yyyy MMMM ddqvhKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqwubUlongqxhG)qy}qz(h+X yyyy MMMM dq{hKX%(yyyy)s %(MMMM)s %(d)sq|ubUshortq}hG)q~}q(h+Xyy/MM/ddqhKX%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}q(UdecimalqX,qUgroupqX quUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXJanabariqKX uFeberbariqKXuMatjhiqKXu-ApreliqKXMeyiqKXJuniqKXJulayiqKX ArhostosiqK XSeptembaqK XOktobaqK X UsinyikhabaqK XDisembaquU abbreviatedq}q(KXJanqKXFebqKXMatqKXAprqKXMeyqKXJunqKXJulqKXArhqK XSepqK XOktqK XUsiqK XDisquuuUcurrency_formatsq}qNh)q}q(h!Nh#Kh$KKqh&h'h'qh)KKqh+X ¤#,##0.00qh-X¤qX-¤qˆqh0Nh1KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KXuMvuloqKX uLesibiliqKX LesithathuqKXuLesineqKX ngoLesihlanuqKX umGqibeloqKXuSontoquU abbreviatedq}q(KXMvuqKXBilqKXThaqKXNeqKXHlaqKXGqiqKXSonquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXBCqKXADquU abbreviatedq}q(KXBCqKXADquuu.PK[D))-site-packages/babel/localedata/sr_Cyrl_CS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[y(site-packages/babel/localedata/ar_YE.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precq KKq!Usuffixq"Xq#h#q$Uint_precq%KKq&Upatternq'X#0.###q(Uprefixq)h#h#q*Uexp_plusq+NUgroupingq,MMq-ubsU date_formatsq.}q/Ucurrency_symbolsq0}q1U time_zonesq2}q3Uscriptsq4}q5UItalq6X#اللأيطالية القديمةq7sUvariantsq8}q9Unumber_symbolsq:}q;Ucurrency_namesq<}q=Umonthsq>}q?Ucurrency_formatsq@}qANh)qB}qC(hNhKh KKqDh"h#h#qEh%KKqFh'X¤#0.00qGh)X¤qHX-¤qIqJh+Nh,h-ubsUdaysqK}qLUformatqM}qNU abbreviatedqO}qP(KXالاثنينqQKXالثلاثاءqRKXالأربعاءqSKX الخميسqTKX الجمعةqUKX السبتqVKX الأحدqWussU meta_zonesqX}qYUerasqZ}q[u.PK[NL L %site-packages/babel/localedata/ve.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXKotara ya u thomaq KXKotara ya vhuvhiliq KXKotara ya vhuraruqKXKotara ya vhuṋaquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q]Uveq^X Tshivenḓaq_sU territoriesq`}qaUdecimal_formatsqb}qcNh)qd}qe(h!Nh#Kh$KKqfh&h'h'qgh)KKqhh+X #,##0.###qih-h'h.qjh0Nh1KKqkubsU date_formatsql}qm(UmediumqnhG)qo}qp(h+X yyyy MMM dqqhKX%(yyyy)s %(MMM)s %(d)sqrubUfullqshG)qt}qu(h+XEEEE, yyyy MMMM ddqvhKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqwubUlongqxhG)qy}qz(h+X yyyy MMMM dq{hKX%(yyyy)s %(MMMM)s %(d)sq|ubUshortq}hG)q~}q(h+Xyy/MM/ddqhKX%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}q(UdecimalqX,qUgroupqX quUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXPhandoqKXLuhuhiqKX ṰhafamuhweqKXLambamaiqKX ShundunthuleqKXFulwiqKXFulwanaqKX ṰhanguleqK X KhubvumedziqK X TshimedziqK XḼaraqK X NyendavhusikuquU abbreviatedq}q(KXPhaqKXLuhqKXṰhaqKXLamqKXShuqKXLwiqKXLwaqKXṰhaqK XKhuqK XTshqK XḼarqK XNyequuuUcurrency_formatsq}qNh)q}q(h!Nh#Kh$KKqh&h'h'qh)KKqh+X ¤#,##0.00qh-X¤qX-¤qˆqh0Nh1KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KX MusumbuluwoqKX ḼavhuvhiliqKX ḼavhuraruqKX ḼavhuṋaqKX ḼavhuṱanuqKX MugivhelaqKXSwondahaquU abbreviatedq}q(KXMusqKXVhiqKXRarqKXṊaqKXṰanqKXMugqKXSwoquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXBCqKXADquU abbreviatedq}q(KXBCqKXADquuu.PK[_.ll)site-packages/babel/localedata/haw_US.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Ze e %site-packages/babel/localedata/pt.datnu[}q(U zone_formatsq}qUregionqX Horário %sqsUdatetime_formatsq}qNX{1} {0}qsUquartersq}q (U stand-aloneq }q Unarrowq }q (KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1º trimestreqKX 2º trimestreqKX 3º trimestreqKX 4º trimestrequU abbreviatedq}q(KXT1qKXT2qKXT3qKXT4quuuUperiodsq }q!(Uamq"XAMq#Upmq$XPMq%uUscientific_formatsq&}q'Ncbabel.numbers NumberPattern q()q)}q*(Uexp_precq+KKq,Uscaleq-KU frac_precq.KKq/Usuffixq0Xq1h1q2Uint_precq3KKq4Upatternq5X#E0q6Uprefixq7h1X-q8q9Uexp_plusq:Ugroupingq;MMqNh()q?}q@(h+Nh-Kdh.KKqAh0X%qBhBqCh3KKqDh5X#,##0%qEh7h1h8qFh:Nh;KKqGubsU week_dataqH}qI(Umin_daysqJKU weekend_startqKKU first_dayqLKU weekend_endqMKuU time_formatsqN}qO(UmediumqPcbabel.dates DateTimePattern qQ)qR}qS(h5XHH:mm:ssqTUformatqUX%(HH)s:%(mm)s:%(ss)sqVubUfullqWhQ)qX}qY(h5XHH'h'mm'min'ss's' vqZhUX%(HH)sh%(mm)smin%(ss)ss %(v)sq[ubUlongq\hQ)q]}q^(h5X HH:mm:ss zq_hUX%(HH)s:%(mm)s:%(ss)s %(z)sq`ubUshortqahQ)qb}qc(h5XHH:mmqdhUX %(HH)s:%(mm)sqeubuU languagesqf}qg(UgvqhXmanxqiUguqjXguzerateqkUscnqlX sicilianoqmUromqnXromaniqoUalgqpXidiomas algonquianosqqUaleqrXaleúteqsUscoqtXescocêsquUmniqvXmanipuriqwUgdqxXgaélico escocêsqyUgaqzX irlandêsq{Umnoq|X Idioma manoboq}Uosaq~XosageqUgnqXguaraniqUaltqX altai do sulqUglqXgalegoqUmwrqXmarwariqUtyqXtaitianoqUtwqXtwiqUttqXtatarqUtrqXturcoqUtsqXtsongaqUtnqXtswanaqUtoqX tonganêsqUausqXidiomas australianosqUavqXavaricqUtkqX turcomanoqUthqX tailandêsqUroaqXIdioma românticoqUtgqXtadjiqueqUteqXteluguqUugaqX ugaríticoqUmwlqX mirandêsqUkcgqXtyapqUsmiqX Idioma samiqUfatqXfantiqUfanqXfangueqUwoqXuolofeqUrmqX reto-romanoqUdinqXdinkaqUblaqXsiksikaqUcmcqX Idioma chamicqUmlqXmalaialaqUzhqXchinêsqUtemqXtimneqUen_CAqXinglês do CanadáqUnwcqXnewari clássicoqUzaqXzhuangqUcauqXIdioma caucásicoqUzuqXzuluqUterqXterenoqUtetqXtétumqUmncqXmanchuqUkutqXkutenaiqUsukqXsukumaqUkumqXkumykqUsusqXsossoqUnewqXnewariqUsuxqXsumérioqUdenqXslaveqUmenqXmendeqUmulqXidiomas múltiplosqUlezqXlezghianqUrootqXrootqUekaqXekajukqUakkqXacadianoqUdraqXIdioma dravíticoqUjrbqXjudaico-arábicoqUsgnqXlinguagem de sinaisqUsgaqXirlandês arcaicoqUapaqXidiomas apacheqUbraqXbrajqUchbqXchibchaqUchgqXchagataiqUchkqXchuukeseqUchmqXmariqUchnqXchinook jargonqUchorXchoctawrUchprX chipewyanrUchrrXcheroquirUchyrXcheienerUtirX tigríniar Uvotr Xvoticr Umgr Xmalgaxer UibarXibãrUmorX moldáviorUmnrXmongolrUmirXmaorirUmhrX marshalêsrUmkrX macedôniorUmtrXmaltêsrUcairX!Idioma indígena centro-americanorUdelrXdelawarerUmsr Xmalaior!Umrr"Xmaratar#Utar$Xtâmilr%Umyr&X birmanêsr'Ucadr(Xcaddor)Usrnr*X sranan tongor+Utair,XIdioma tailandêsr-Uafhr.XAfrihilir/Usitr0XIdioma sino-tibetanor1Uenmr2Xinglês medievalr3Uen_AUr4Xinglês australianor5Unynr6Xnyankoler7Unyor8Xnyoror9Unymr:Xnyamwezir;Usior<X idiomas siouxr=Umapr>X austronésior?Umasr@XmassairAUlahrBXlahndarCUladrDXladinorEUfyrFXfrisãorGUsnkrHXsoninkerIUfarJXpersarKUmadrLXmadurêsrMUmagrNXmagahirOUmairPXmaithilirQUfirRX finlandêsrSUfjrTXfijianorUUmanrVXmandingarWUegyrXXegípcio arcaicorYUzndrZXzander[Ussr\Xswatir]Usrr^Xsérvior_Usqr`XalbanêsraUswrbXsuaílircUsvrdXsuecoreUsurfX sundanêsrgUstrhX soto do sulriUskrjXeslovacorkUsirlX cingalêsrmUshrnX servo-croataroUsorpXsomalirqUsnrrXshonarsUsmrtXsamoanoruUslrvXeslovenorwUscrxXsardoryUsarzX sânscritor{Usgr|Xsangor}User~X sami do norterUsdrXsindirUzenrXzenagarUkbdrX kabardianorUafarXIdioma afro-asiáticorUcsbrX kashubianrUlgrXlugandarUlbrX luxemburguêsrUfiurXIdioma ugro-finêsrUlnrXlingalarUlorXlaosianorUlirX limburgishrUbynrXBlinrUltrXlituanorUlurX luba-catangarUfilrXfilipinorUyirXiídicherUnonrXnórdico arcaicorUcebrXcebuanorUyorXiorubarUnogrXnogairUbatrXIdioma bálticorUdakrXdacotarUdarrXdargwarUdayrXdayakrUssarXIdioma nilo-saarianorUkperXkpellerUelrXgregorUeorX esperantorUenrXinglêsrUlamrXlambarUeerXeverUmdfrXmocsarUfrrXfrancêsrUmdrrXmandarrUetrX estonianorUesrXespanholrUrurXrussorUgonrXgondirUgohrXalemão arcaico altorUsmsrX skolt samirUsmnrX inari samirUsmjrX lule samirUde_ATrXalemão da ÁustriarUgotrXgóticorUrnrXrundirUrorXromenorUdsbrX sérvio baixorUsmarX sami do sulrUgorrX gorontalorUastrX asturianorUwalrXwalamorUcrhrXturco da CriméiarUathrXidiomas atabascanosrUgezrXgeezrUxhrXxosarUffrXfularUkforXkororUmakrXmakasarrUzaprXzapotecarUkokrXconcanirUzxxrXsem conteúdo lingüísticorUkosrXkosraeanrUforXferoêsrUtogrXtonganês de NyasarUhuprXhuparUudmrXudmurtrUbejrXbejarUbemrXbembarUtsirX tsimshianr Uberr Xberberer Unzir Xnzimar UsairXIdioma indígeno sul-americanorUangrXinglês arcaicorUprarXidiomas prácritorUbhorXbhojpurirUsalrXidiomas salisanosrUprorXprovençal arcaicorUrajrX rajastanirUsadrXsandawerUanprXangikarUes_419r Xespanhol (América Latina)r!Urapr"Xrapanuir#Usasr$Xsasakr%Unqor&Xn'kor'Ucarr(Xcariber)Uminr*X minangkabaur+Umicr,X miquemaquer-Uefir.Xefiquer/Uarnr0Xaraucanor1Uypkr2Xidiomas iúpiquer3Umisr4Xidiomas diversosr5Ukacr6Xkachinr7Ukabr8Xkabyler9Ukaar:X kara-Kalpakr;Ukajr<Xjjur=Ukamr>Xkambar?Ukarr@XkarenrAUkawrBXkawirCUfr_CHrDXfrancês suíçorEUtyvrFXtuvinianrGUfr_CArHXfrancês do CanadárIUkarJX georgianorKUdoirLXdogrirMUkgrNX congolêsrOUkkrPXcazaquerQUkjrRXKuanyamarSUkirTXquicuiorUUkorVXcoreanorWUknrXXcanarêsrYUkmrZXcmerr[Uklr\X groenlandêsr]Uksr^Xkashmirir_Ukrr`XcanúriraUkwrbXcórnicorcUkvrdXkomireUkurfXcurdorgUkyrhXquirguizriUtklrjX toquelauanorkUbuarlXBuriatrmUmgarnXirlandês medievalroUhitrpXhititarqUdyurrXdiúlarsUdertXalemãoruUdarvX dinamarquêsrwUdzrxXdzongaryUluirzXluisenor{Udvr|Xdivehir}Uhilr~X hiligaynonrUhimrX himachalirUgemrXIdioma germânicorUcrprXcrioulo ou pidginrUqurXquíchuarUbasrXbasarUgbarXgbaiarUbadrXbandarUbanrXbalinêsrUbalrXbalúchirUshnrXshanrUbairXidiomas bamilekerUarprXarapahorUartrXIdioma artificialrUarwrXarauaquirUarcrXaramaicorUen_USrXinglês americanorUsemrXIdioma semíticorUselrXselkuprUnubrXidiomas núbiosrUbtkrXbataquerUlusrXlushairUmusrXcreekrUluarX luba-LuluarUirorXidiomas iroquesesrUirarXiranianorUmunrX idiomas mundarUlunrXlundarUluorXluorUwarXvalãorUtuprX idiomas tupirUjvrXjavanêsrUzblrXsímbolos blisrUtutrXIdioma altaicorUtumrXtumbukarUjarXjaponêsrUcoprXcoptarUilorXilocanorUlarXlatimrUgwirX gwichʼinrUundrX indeterminadorUtlirX tlinguiterUtlhrXklingonrUchrXchamorrorUcorXcórsicorUcarXcatalãorUcerXchechenorUponrX pohnpeianrUcyrXgalêsrUsahrXiacutorUcsrXtchecorUcrrXcreerUbntrXbantorUcvrXchuvashrUcurXeslavo eclesiásticorUlvrXletãorUdumrXholandês medievalrUptrX portuguêsrUduarXdualarUfrorXfrancês arcaicorUyaprXyapeserUfrmrXfrancês medievalrUtivrXtivrUfrsrXfrisão orientalrUfrrrXfrisão do norterUyaorXiaorUparXpanjabirUxalrXkalmykrUes_ESrXespanhol ibéricorUpirXpálir Uen_GBr Xinglês britânicor Ugayr Xgayor UotorXidiomas otomanosrUotarX turco otomanorUhmnrXhmongrUmyvrXerzyarUgaarXgarUfurrXfriulanorUkhirXkhoisan (outros)rUainrXainurUrarrX rarotonganorUslar Xidiomas eslavosr!Uver"Xvendar#Uvir$X vietnamitar%Uisr&X islandêsr'Ukhor(X khotanêsr)Uiur*X inuktitutr+Uitr,Xitalianor-Uvor.X volapuquer/Uiir0X sichuan yir1Uikr2X inupiaquer3Uior4Xidor5Uiner6XIdioma indo-europeur7Uiar8X interlínguar9Ujprr:X judaico-persar;Uier<X interlinguer=Uidr>X indonésior?Uigr@XiborAUpaprBX papiamentorCUeworDXewondorEUpaurFXpalauanorGUpaarHXIdioma papuanorIUpagrJX pangasinãrKUsatrLXsantalirMUpalrNXpálavirOUpamrPXpampangarQUsycrRXsiríaco clássicorSUphirTXIdioma filipinorUUcelrVXIdioma célticorWUphnrXXfeníciorYUnicrZXIdioma cordofano-nigerianor[Uniar\Xniasr]Udgrr^Xdogribr_Usyrr`XsiríacoraUniurbXniueanorcUgswrdXalemão suíçoreUcchrfXatsamrgUjborhXlojbanriUnahrjXnáuatlerkUsamrlXaramaico samaritanormUhairnXhaidaroUgmhrpXalemão medieval altorqUcusrrXcuxitas (outros)rsUwenrtXidiomas sórbiosruUadyrvXadygherwUelxrxXelamiteryUadarzXadangmer{Upt_PTr|Xportuguês ibéricor}Uhawr~XhavaianorUbinrXbinirUbikrXbikolrUpt_BRrXportuguês do BrasilrUmosrXmossirUmohrXmohawkrUtlrXtagalogrUzh_HansrXchinês (simplificado)rUzh_HantrXchinês (tradicional)rUtvlrX tuvaluanorUijorXijorUkmbrX quimbundorUpeorX persa arcaicorUumbrXumbundurUtmhrX tamaxequerUfonrXfomrUhsbrX upper sorbianrUberX bielo-russorUbgrXbúlgarorUbarXbashkirrUpsrXpashtorUbmrXbambararUbnrXbengalirUborXtibetanorUbhrXbiarirUbirXbislamárUbrrXbretãorUbsrXbósniorUruprXaromenorUzzarXzazarUomrXoromorUojrXojibwarUacerXachineserUachrXacolirUocrX occitânicorUkrurXkurukhrUsrrrXserererUkrorXkrurUkrlrX carelianorUkrcrXkarachay-BalkarrUndsrXalto alemão; baixo saxãorUosrXosseticrUorrXoriyarUsogrXsogdienrUnsorXsoto setentrionalrUsonrXsongairUde_CHrXalto alemão suíçorUvairXvairUwakrXidiomas wakashanrUlolrXmongorUmkhrXmon-khmer (outros)rUawarXawadhirUlozrXlozirUgilrX gilbertêsrUwasrXwashorUwarrXwarayrUhzrXhererorUhyrXarmêniorUanrX aragonêsrUsidrXsidamorUhrrXcroatarUhtrXhaitianorUhurXhúngarorUhirXhindirUhorX hiri moturUharXhauçárUbugrX buguinêsrUherXhebraicorUuzrXusbequerUurrXurdur Uplr Xpolonêsr Uukr X ucranianor UugrXuighurrUaarXafarrUabrX abkhazianrUaerX avésticorUafrX africânerrUakrXAkanrUamrXamáricorUnl_BErX neerlandêsrUeurXbascorUasr Xassamêsr!Uarr"Xáraber#Uinhr$Xingucher%Utpir&X tok pisinr'Umynr(Xmaiar)Uayr*Xaimarar+Ukhar,Xkhasir-Uazr.X azerbaijanor/Uincr0XIdioma índicor1Unlr2X holandêsr3Unnr4Xnynorsk norueguêsr5Unor6X norueguêsr7Unar8Xnauruanor9Unbr:Xbokmål norueguêsr;Unair<X Idioma indígena norte-americanor=Undr>Xndebele do norter?Uner@XnepalirAUngrBXdongorCUnyrDXnianjarEUnaprFX napolitanorGUgrbrHXGerborIUgrcrJX grego arcaicorKUnrrLXndebele do sulrMUtigrNXtigrérOUnvrPXnavajorQUzunrRXzunhirSUrwrTX kinyarwandarUUcperVX$crioulo ou pidgin baseado no inglêsrWUcpfrXX%crioulo ou pidgin baseado no francêsrYUcpprZX'crioulo ou pidgin baseado no portuguêsr[uU territoriesr\}r](UBDr^X Bangladeshr_UBEr`XBélgicaraUBFrbX Burquina FasorcUBGrdX BulgáriareUVErfX VenezuelargUBArhXBósnia-HerzegovinariUBBrjXBarbadosrkUWFrlXWallis e FutunarmUBLrnXSan BartolomeuroUBMrpXBermudasrqUBNrrXBruneirsUBOrtXBolíviaruUBHrvXBahrainrwUBIrxXBurundiryUBJrzXBeninr{UBTr|XButãor}U011r~XÁfrica OcidentalrUBVrX Ilha BouvetrUBWrXBotsuanarU014rXÁfrica OrientalrU015rXÁfrica do NorterUBRrXBrasilrU017rXÁfrica CentralrU018rXÁfrica AustralrU019rX AméricasrUBYrXBelarusrUBZrXBelizerULVrXLetôniarURWrXRuandarURSrXSérviarUTLrX Timor LesterURErXReuniãorUTMrXTurcomenistãorUOMrXOmãrUTJrX TadjiquistãorUROrXRomêniarUTKrXTokelaurUGWrX Guiné BissaurUGUrXGuamrUGTrX GuatemalarUGSrX'Geórgia do Sul e Ilhas Sandwich do SulrUGRrXGréciarUGQrXGuiné EquatorialrUGPrX GuadaluperUJPrXJapãorUKIrX QuiribatirUGYrXGuianarUGGrXGuernseyrUGFrXGuiana FrancesarUGErXGeórgiarUGDrXGranadarU021rXAmérica SetentrionalrUGBrX Reino UnidorUGArXGabãorUSVrX El SalvadorrUGNrXGuinérUGMrXGâmbiarUGLrX GroênlandiarU029rXCariberUGIrX GibraltarrUGHrXGanarUJErXJerseyrUTNrXTunísiarUJMrXJamaicarU013rXAmérica CentralrUWSrXSamoarU419rXAmérica Latina e CariberUHRrXCroáciarUBSrXBahamasrUHTrXHaitirUHUrXHungriarUHKrX+Hong Kong, Região Admin. Especial da ChinarU039rX Europa do SulrUHNrXHondurasrUFIrX FinlândiarU142rXÁsiarU030rXÁsia OrientalrU034rX Ásia do SulrU035rXÁsia Oriental e do SulrUPRrX Porto RicorUPSrXTerritório da PalestinarUFKrXIlhas MalvinasrUIOrX(Território Britânico do Oceano ÍndicorUPWrXPalaurUPTrXPortugalrUSJrXSvalbard e Jan Mayenr UMDr X Moldáviar UFMr X Micronésiar UIQrXIraquerUPArXPanamárUPFrXPolinésia FrancesarUPGrXPapua-Nova GuinérUPErXPerurUPKrX PaquistãorUPHrX FilipinasrUFOrX Ilhas FaroerUPNrXPitcairnrUPLr XPolôniar!UPMr"XSaint Pierre e Miquelonr#UZMr$XZâmbiar%UEHr&XSaara Ocidentalr'URUr(XRússiar)UEEr*XEstôniar+UEGr,XEgitor-UZAr.XÁfrica do Sulr/UECr0XEquadorr1UITr2XItáliar3UVNr4XVietnãr5UZZr6X!Região desconhecida ou inválidar7USBr8XIlhas Salomãor9UETr:XEtiópiar;USOr<XSomáliar=UZWr>X Zimbábuer?USAr@XArábia SauditarAUESrBXEspanharCUERrDX EritréiarEUMErFX MontenegrorGUAQrHX AntártidarIUMGrJX MadagascarrKUMFrLX San MartinrMUMArNXMarrocosrOUMCrPXMônacorQUUZrRX UzbequistãorSUMMrTXMianmarrUUMLrVXMalirWUMOrXX'Macau, Região Admin. Especial da ChinarYUMNrZX Mongóliar[UHMr\XIlha Heard e Ilhas McDonaldr]UASr^XSamoa Americanar_UMKr`X MacedôniaraUMUrbX MauríciorcUMTrdXMaltareUMWrfXMalawirgUMVrhXMaldivasriUMQrjX MartinicarkUMPrlXIlhas Marianas do NortermUMSrnX MontserratroUMRrpX MauritâniarqUIMrrX Ilha de ManrsUUGrtXUgandaruUTZrvX TanzâniarwUMYrxXMalásiaryUMXrzXMéxicor{UILr|XIsraelr}UFRr~XFrançarUAWrXArubarUDOrXRepública DominicanarUSHrX Santa HelenarUVCrXSão Vicente e GranadinasrU054rX MelanésiarUDJrXDjibutirUFJrXFijirU057rXRegião da MicronésiarU172rX$Comunidade dos Estados IndependentesrU053rXAustrália e Nova ZelândiarUNIrX NicaráguarUNLrXHolandarUNOrXNoruegarUNArXNamíbiarUVUrXVanuaturUNCrXNova CaledôniarUNErXNígerrUNFrX Ilha NorfolkrUNGrXNigériarUNZrXNova ZelândiarUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinésiarUCIrXCosta do MarfimrUCHrXSuíçarUCOrX ColômbiarUCNrXChinarUCMrXRepública dos CamarõesrUCLrXChilerUCCrXIlhas Cocos (Keeling)rUCArXCanadárUCGrXCongorUCFrXRepública Centro-AfricanarUCDrXCongo-KinshasarUCZrXRepública TchecarUCYrXChiprerUCXrX Ilhas NatalrUCSrXSérvia e MontenegrorUCRrX Costa RicarUPYrXParaguairUCVrX Cabo VerderUCUrXCubarUSZrX SuazilândiarUSYrXSíriarUKGrX QuirguistãorUKErXQuêniarUSRrXSurinamerU143rX Ásia CentralrUKHrXCambojarUKNrXSão Cristovão e NevisrUKMrXComoresrUSTrXSão Tomé e PrínciperUSKrX EslováquiarUKRrXCoréia do SulrUSIrX EslovêniarUKPrXCoréia do NorterUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Serra LeoarUSCrX SeychellesrUKZrX CasaquistãorUKYrX Ilhas CaimanrUSGrX CingapurarUSErXSuéciarUSDrXSudãorU151rXEuropa OrientalrU150rXEuropar UDMr XDominicar U155r XEuropa Ocidentalr U154rXEuropa SetentrionalrUVGrXIlhas Virgens BritânicasrUDErXAlemanharUYErXIêmenrUMHrXIlhas MarshallrU062rXÁsia Central e do SulrUDZrXArgéliarUUSrXEstados UnidosrUUYrXUruguairUYTr XMayotter!UUMr"X*Ilhas Menores Distantes dos Estados Unidosr#ULBr$XLíbanor%ULCr&X Santa Lúciar'ULAr(X&República Democrática Popular de Laor)UTVr*XTuvalur+UTWr,XTaiwanr-UTTr.XTrinidad e Tobagor/UTRr0XTurquiar1ULKr2X Sri Lankar3ULIr4X Liechtensteinr5UCKr6X Ilhas Cookr7UTOr8XTongar9ULTr:X Lituâniar;ULUr<X Luxemburgor=ULRr>XLibériar?ULSr@XLesotorAUTHrBX TailândiarCUTFrDXTerritórios Franceses do SulrEUTGrFXTogorGUTDrHXChaderIUTCrJXIlhas Turks e CaicosrKULYrLXLíbiarMUVArNXVaticanorOU145rPXÁsia OcidentalrQUAErRXEmirados Árabes UnidosrSUADrTXAndorrarUUAGrVXAntígua e BarbudarWUAFrXX AfeganistãorYUAIrZXAnguillar[UVIr\XIlhas Virgens dos EUAr]UISr^X Islândiar_UIRr`XIrãraUAMrbXArmêniarcUALrdXAlbâniareUAOrfXAngolargUANrhXAntilhas HolandesasriU003rjXAmérica do NorterkU002rlXÁfricarmU001rnXMundoroUARrpX ArgentinarqUAUrrX AustráliarsUATrtXÁustriaruU005rvXAmérica do SulrwUINrxXÍndiaryUAXrzX Ilhas Alandr{U009r|XOceaniar}UAZr~X AzerbaijãorUIErXIrlandarUIDrX IndonésiarUJOrX JordâniarUQUrXUnião EuropéiarUUArXUcrâniarUQArXCatarrUDKrX DinamarcarUMZrX MoçambiquerUQOrXOceania ExteriorruUdecimal_formatsr}rNh()r}r(h+Nh-Kh.KKrh0h1h1rh3KKrh5X #,##0.###rh7h1h8rh:Nh;KKrubsU date_formatsr}r(UmediumrhQ)r}r(h5X dd/MM/yyyyrhUX%(dd)s/%(MM)s/%(yyyy)srubUfullrhQ)r}r(h5XEEEE, d 'de' MMMM 'de' yyyyrhUX'%(EEEE)s, %(d)s de %(MMMM)s de %(yyyy)srubUlongrhQ)r}r(h5Xd 'de' MMMM 'de' yyyyrhUX%(d)s de %(MMMM)s de %(yyyy)srubUshortrhQ)r}r(h5Xdd/MM/yyrhUX%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}r(UYERrXYRlrUPTErXEsc.rUVNDrXđrUXPFrXCFPFruU time_zonesr}r(UAtlantic/Canaryr}rUcityrX CanáriasrsU Europe/Lisbonr}rjXLisboarsUAmerica/Meridar}rjXMéridarsU Asia/Dhakar}rjXDaccarsUAmerica/St_Luciar}rjX Santa LúciarsUEurope/Amsterdamr}rjX AmsterdãrsUAfrica/Nairobir}rjXNairóbirsU Europe/Tiraner}rjXTiranarsUAmerica/Maceior}rjXMaceiórsUAfrica/Abidjanr}rjXAbidjãrsUAfrica/Djiboutir}rjXDjibutirsUAmerica/Grenadar}rjXGranadarsUAmerica/El_Salvadorr}rjXSalvadorrsU Europe/Madridr}rjXMadrirsUIndian/Maldivesr}rjXMaldivasrsUEurope/Stockholmr}rjX EstocolmorsUAmerica/Port-au-Princer}rjXPorto PríncipersUAmerica/Caymanr}rjXCaimãrsU Europe/Athensr}rjXAtenasrsUAmerica/Indianapolisr}rjX IndianápolisrsUAmerica/Curacaor}rjXCuraçaorsUAmerica/Mexico_Cityr}rjXCidade do MéxicorsUAmerica/Puerto_Ricor}rjX Porto RicorsUIndian/Mauritiusr}rjXIlhas MauríciorsU Europe/Berlinr}rjXBerlimr sU Europe/Zurichr }r jXZuriquer sUAmerica/Cordobar }rjXCórdobarsU America/Belemr}rjXBelémrsU Europe/Romer}rjXRomarsUAfrica/Sao_Tomer}rjX São TomérsUAmerica/North_Dakota/New_Salemr}rjXNew Salen, Dakota do NortersU Europe/Warsawr}rjX VarsóviarsUAtlantic/Bermudar}r jXBermudasr!sUAmerica/Araguainar"}r#jX Araguaínar$sUAfrica/Tripolir%}r&jXTrípolir'sUAmerica/St_Johnsr(}r)jX St. Johnsr*sUIndian/Reunionr+}r,jX Ilha Reuniãor-sUAmerica/St_Thomasr.}r/jX St. Thomasr0sUEurope/Helsinkir1}r2jX Helsinquer3sUAtlantic/Cape_Verder4}r5jX Cabo Verder6sUAmerica/Guadelouper7}r8jX Guadaluper9sUEurope/Copenhagenr:}r;jX Copenhaguer<sUAmerica/Eiruneper=}r>jX Eirunepér?sU Asia/Baghdadr@}rAjXBagdárBsUAfrica/MonroviarC}rDjX MonróviarEsUEurope/BudapestrF}rGjX BudapesterHsU Asia/AmmanrI}rJjXAmãrKsU Asia/KabulrL}rMjXCabulrNsUAmerica/St_VincentrO}rPjX São VicenterQsU Asia/KatmandurR}rSjXCatmandurTsUAmerica/GuyanarU}rVjXGuianarWsUAmerica/Sao_PaulorX}rYjX São PaulorZsUAmerica/Port_of_Spainr[}r\jX Porto Espanhar]sU Asia/Tokyor^}r_jXTóquior`sUPacific/Easterra}rbjXIlha de PáscoarcsU Asia/Jakartard}rejXJacartarfsUAfrica/Johannesburgrg}rhjX JohannesburgorisUAtlantic/South_Georgiarj}rkjXGeórgia do SulrlsU Africa/Tunisrm}rnjXTunísiarosUEurope/Istanbulrp}rqjXIstambulrrsUEurope/Bucharestrs}rtjX BucaresterusUPacific/Galapagosrv}rwjX GalápagosrxsU Europe/Monacory}rzjXMônacor{sUAmerica/Bogotar|}r}jXBogotár~sUAmerica/Cayenner}rjXCaienarsU Africa/Dakarr}rjXDacarrsU Asia/Yerevanr}rjXIerevanrsUAmerica/Cuiabar}rjXCuiabársU Europe/Moscowr}rjXMoscoursUAmerica/Cancunr}rjXCancúnrsUAsia/Vientianer}rjX ViencianarsUEurope/Brusselsr}rjXBruxelasrsUAmerica/Argentina/Tucumanr}rjXTucumãrsUAtlantic/Azoresr}rjXAçoresrsUAsia/Jerusalemr}rjX JerusalémrsUAsia/Singaporer}rjX CingapurarsU Asia/Shanghair}rjXXangairsUAmerica/St_Kittsr}rjXSão CristóvãorsUAmerica/Noronhar}rjXFernando de NoronharsU Asia/Beirutr}rjXBeirutersUAfrica/Algiersr}rjXArgelrsUAmerica/Panamar}rjXPanamársUAmerica/Guayaquilr}rjX GuaiaquilrsU Asia/Bahrainr}rjXBareinrsUAtlantic/Faeroer}rjX Ilhas FaroersU Asia/Riyadhr}rjXRiadrsUIndian/Mayotter}rjX Ilha MayottersU Europe/Londonr}rjXLondresrsUAmerica/Montevideor}rjX MontevidéursUAmerica/Anguillar}rjXAnguilarsU Asia/Damascusr}rjXDamascorsU Asia/Qatarr}rjXCatarrsUAmerica/North_Dakota/Centerr}rjXCentralrsU Asia/Nicosiar}rjXNicósiarsUAtlantic/St_Helenar}rjX Santa HelenarsUAmerica/Managuar}rjXManáguarsUEurope/Luxembourgr}rjX LuxemburgorsUAmerica/Martiniquer}rjX MartinicarsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAmerica/Antiguar}rjXAntíguarsUPacific/Tahitir}rjXTaitirsU Africa/Lomer}rjXLomérsUAmerica/Asuncionr}rjX AsunciónrsU Europe/Viennar}rjXVienarsUAmerica/New_Yorkr}rjX Nova IorquersU Europe/Sofiar}rjXSófiarsUAfrica/Porto-Novor}rjX Porto NovorsU Asia/Tehranr}rjXTeerãrsU Etc/Unknownr}rjX DesconhecidorsU Asia/Seoulr}rjXSeulrsUAntarctica/South_Poler }r jX Pólo Sulr suUscriptsr }r (UZsymrXzsymrUGururXgurmuquirUHebrrXhebraicorUZzzzrX!roteiro desconhecido ou inválidorUPhnxrXfeníciorUMoonrXmoonrUSamrrX samaritanorUChamrXchamrUArabrXáraberUGujrr Xgujeratir!UZxxxr"Xroteiro em brancor#ULycir$Xlícior%USinhr&X cingalêsr'UTalur(X novo tai luer)UMongr*Xmongolr+UXpeor,X persa antigor-UVispr.X fala visívelr/URjngr0Xrejangr1UOlckr2Xol chikir3UTaler4Xtai Ler5UMandr6Xmandaicor7UManir8X maniqueanor9UMlymr:Xmalaialar;UTibtr<Xtibetanor=UKalir>Xkayah lir?UJpanr@XjaponêsrAUPlrdrBXfonético pollardrCUKanarDXkatakanarEULydirFXlídiorGULepcrHXlepcharIUSundrJX sundanêsrKUYiiirLXyirMUJavarNXjavanêsrOUOryarPXoriyarQULaoorRXlaorSUUgarrTX ugaríticorUUCyrlrVX cirílicorWUVaiirXXvairYUArmnrZXarmênior[UCyrsr\Xcirílico eslavo eclesiásticor]UKhmrr^Xkhmerr_UArmir`XarmiraUSylorbX syloti nagrircUItalrdXitálico antigoreUSgnwrfX signwritingrgUXsuxrhXsumero-acadiano cuneiformeriUThaarjXthaanarkUThairlX tailandêsrmUCprtrnXcipriotaroULinbrpXb linearrqULinarrXA linearrsUOsmartXosmaniaruUSaurrvX saurashtrarwUHirarxXhiraganaryUHanirzXhanr{UEgydr|Xdemótico egípcior}UQaair~XherdadorUEgyhrXhierático egípciorUCansrX*símbolos aborígenes do Canadá UnificadorUEgyprXhieróglifos egípciosrUZmthrXzmthrUTfngrXtifinaghrUShawrXshavianorUCirtrXcirthrUGeorrX georgianorUTengrXtengwarrUHrktrXkatakana ou hiraganarUGeokrXkhutsuri georgianorUTavtrXtavtrUOgamrXogâmicorUDsrtrXdeseretrUGothrXgóticorUHanorXhanunoorUBalirXbalinêsrUKorerXcoreanorUHangrXhangulrUCarirXcarianorUAvstrXavestarUTagbrXtagbanwarUHansrXhan simplificadorUHantrXhan tradicionalrURororX rongorongorUDevarX devanágarirUIndsrXindorUBoporXbopomoforUMymrrXmyanmarrUTglgrXtagalorUPermrXpérmico antigorUBugirXbuginêsrUPhagrXphags-parUBrairXbrailerUBrahrXbrahmirUBatkrXbataquerUMerorX meroíticorULimbrXlimburUMteirX meitei mayekrUPhlirXphlirUTelurXtélugurUTamlrXtâmilrUSararXsaratirUPhlprXphlprULatgrXlatim gaélicorULatfrX latim frakturrUKharrX kharoshthirUNkoorXn'korUPhlvrXpahlavi antigorULatnrXlatimrUMayarXhieróglifos maiasrULanarXlannarUEthirX etiópicorUKthirXkthirUHmngrX pahawh hmongrUBuhdrXbuhidrUCoptrXcópticorUPrtirXprtirUGlagrX glagolíticorURunrrXrúnicorUOrkhrXorkhonrUCakmrXcakmrUHungrXhúngaro antigorUGrekrXgregorUCherr Xcheroquir UZyyyr Xcomumr USyrcr Xsiríacor UBlisr Xsímbolos blissr UBengr Xbengalir USyrer Xsiríaco estrangelor USyrjr Xsiríaco ocidentalr USyrnr Xsiríaco orientalr UKndar Xkannadar uUvariantsr }r (UMONOTONr X monotônicor UBOONTr X boontlingr USCOUSEr Xscouser UAREVELAr Xarmênio orientalr USOLBAr Xdialeto stolvizza/solbicar ULIPAWr Xdialeto lipovaz de Resianr U1901r Xortografia alemã tradicionalr! UBAKU1926r" Xalfabeto latino turco unificador# UOSOJSr$ Xdialeto oseacco/osojaner% UPOLYTONr& X politônicor' UNJIVAr( Xdialeto gniva/njivar) UFONIPAr* X-fonética do Alfabeto Fonético Internacionalr+ UTARASKr, Xortografia taraskievicar- U1606NICTr. Xfrancês antigo de 1606r/ USAAHOr0 Xsahor1 UPOSIXr2 X computadorr3 UFONUPAr4 X(fonética do Alfabeto Fonético Urálicor5 UNEDISr6 Xdialeto natisoner7 UAREVMDAr8 Xarmênio ocidentalr9 U1994r: Xortografia resiana padronizadar; U1996r< Xortografia alemã de 1996r= UREVISEDr> XOrtografia Revisadar? USCOTLANDr@ Xinglês padrão escocêsrA UBISKErB Xdialeto san giorgio/bilarC UROZAJrD XresianorE uUnumber_symbolsrF }rG (UdecimalrH X,rI UgrouprJ X.rK uUcurrency_namesrL }rM (UXXXrN XMoeda Desconhecida ou InválidarO UDZDrP XDinar argelinorQ ULVRrR X Rublo letãorS UGHSrT X Cedi ganêsrU UBOPrV XPeso bolivianorW UEGPrX XLibra egípciarY UBGLrZ XLev forte búlgaror[ UBGNr\ XLev novo búlgaror] UPABr^ XBalboa panamenhor_ UYUMr` XSuper Dinar iugoslavora UZWDrb XDólar do Zimbábuerc UGHCrd XCedi de Gana (1979-2007)re UXBDrf X Unidade de Conta Européia (XBD)rg UBOBrh X Bolivianori UXBArj XUnidade Composta Européiark UDKKrl XCoroa dinamarquesarm UXBCrn X Unidade de Conta Européia (XBC)ro UXBBrp XUnidade Monetária Européiarq UBWPrr XPula botsuanesars ULBPrt XLibra libanesaru UTZSrv XXelim da Tanzâniarw jXDong vietnamitarx UNADry XDólar da Namíbiarz UAOAr{ XCuanza angolanor| UWSTr} XTala da Samoa Ocidentalr~ UAONr X Novo cuanza angolano (1990-2000)r UKHRr XRiel cambojanor UMYRr XRinggit malaior UAOKr XCuanza angolano (1977-1990)r USOSr X Xelim somalir UKYDr XDólar das Ilhas Caimanr ULYDr X Dinar líbior UUAHr XHryvnia ucranianor UUAKr XKarbovanetz ucranianor UUGXr XXelim ugandenser UJODr XDinar jordanianor UAORr X&Cuanza angolano reajustado (1995-1999)r USURr XRublo soviéticor UAWGr XGuilder de Arubar USARr X Rial sauditar UFIMr XMarca finlandesar UHKDr XDólar de Hong Kongr USRGr XFlorim do Surinamer UTPEr XEscudo timorenser UMGFr XFranco de Madagascarr UCHEr XEuro WIRr UCHFr XFranco suíçor UGIPr XLibra de Gibraltarr UBYRr XRublo bielo-russor UALLr X Lek Albanêsr UXPDr XPaládior UUGSr XXelim ugandense (1966-1987)r UMROr XOuguiya da Mauritâniar UBOVr XMvdol bolivianor UHRKr X Kuna croatar UDJFr XFranco do Djibutir UHRDr X Dinar croatar UPESr X Sol peruanor UEQEr XEkweler UITLr X Lira italianar UXAFr XFranco CFA BEACr UBNDr XDólar do Bruneir UISKr XCoroa islandesar UZALr XRand sul-africano (financeiro)r USRDr XDólar do Surinamer UNIOr XCórdoba Ouro nicaraguenser ULAKr X Kip de Laosr UNICr XCórdoba nicaraguenser UNPRr XRupia nepalesar UMZEr XEscudo de Moçambiquer UUYUr X Peso uruguaior ULUCr X!Franco conversível de Luxemburgor UJMDr XDólar jamaicanor UFRFr XFranco francêsr UMAFr XFranco marroquinor UUYIr X#Peso uruguaio en unidades indexadasr UMZMr XMetical antigo de Moçambiquer UMZNr XMetical do Moçambiquer UPHPr X Peso filipinor UZARr XRand sul-africanor URHDr XDólar rodesianor UGWPr XPeso da Guiné-Bissaur ULUFr XFranco luxemburguêsr UBELr XFranco belga (financeiro)r UBECr XFranco belga (conversível)r UNGNr XNaira nigerianar UYUNr XDinar conversível iugoslavor UBEFr X Franco belgar UPLZr XZloti polonês (1950-1995)r UCRCr XColon da Costa Ricar UTRLr XLira turca antigar UDEMr X Marco alemãor UEEKr XCoroa estonianar UMWKr XCuacha do Maláuir UTTDr XDólar de Trinidad e Tobagor ULKRr XRupia do Sri Lankar USKKr XCoroa eslovacar UCVEr XEscudo cabo-verdianor UPKRr XRupia paquistanesar UHUFr XForinte húngaror UROLr XLeu romeno antigor UXEUr XUnidade de Moeda Européiar UBMDr XDólar das Bermudasr UOMRr X Rial de Omãr ULSLr XLoti do Lesotor ULSMr XMalotir UMNTr! X Tugrik mongolr" UAMDr# X Dram Arménior$ UYUDr% XDinar forte iugoslavor& UBUKr' XKyat birmanêsr( USYPr) X Libra síriar* UQARr+ XRial catarianor, UXDRr- XDireitos Especiais de Giror. UNLGr/ XFlorim holandêsr0 UGEKr1 XCupom Lari georgianor2 UMTPr3 X Libra maltesar4 UGBPr5 XLibra esterlina britânicar6 UGELr7 XLari georgianor8 USHPr9 XLibra de Santa Helenar: UAFNr; XAfeganer< USBDr= XDólar das Ilhas Salomãor> UCSKr? XCoroa Forte checoslovacar@ UKPWrA XWon norte-coreanorB UXRErC X Fundos RINETrD UCSDrE XDinar Antigo sérviorF UAFArG XAfegane (1927-2002)rH UTHBrI XBaht tailandêsrJ UBYBrK X"Rublo novo bielo-russo (1994-1999)rL UBDTrM XTaka de BangladeshrN UGRDrO X Dracma gregorP jX Rial iemenitarQ UDDMrR XOstmark da Alemanha OrientalrS USZLrT XLilangeni da SuazilândiarU UHTGrV XGurde do HaitirW UTRYrX X Lira turcarY UMGArZ XAriary de Madagascarr[ UANGr\ XGuilder das Antilhas Holandesasr] ULRDr^ XDólar liberianor_ URWFr` XFranco ruandêsra UNOKrb XCoroa norueguesarc UMXVrd X&Unidade de Investimento (UDI) mexicanare UKESrf XXelim quenianorg UMOPrh XPataca macaenseri UINRrj XRúpia indianark UMXNrl X Peso mexicanorm UCZKrn X Coroa checaro UTJSrp XSomoni tadjiquerq UTJRrr XRublo do Tadjiquistãors UBTNrt XNgultrum do Butãoru UYDDrv XDinar iemenitarw UGWErx XEscudo da Guiné Portuguesary UCOPrz XPeso colombianor{ UCOUr| XUnidade de Valor Realr} UMTLr~ X Lira maltesar UMURr XRupia de Maurícior UIDRr XRupia indonésiar UHNLr XLempira de Hondurasr jX Franco CFPr UFJDr XDólar de Fijir UETBr X Birr etíoper UPENr XSol Novo peruanor UBZDr XDólar do Belizer UCHWr X Franco WIRr UATSr XXelim austríacor UILPr XLibra israelitar UZRNr XZaire Novo zairenser UDOPr XPeso dominicanor ULULr XFranco financeiro de Luxemburgor UTMMr XManat do Turcomenistãor UTWDr XDólar Novo de Taiwanr UMDLr XLeu da Moldáviar UXPTr XPlatinar UECVr X+Unidade de Valor Constante (UVC) do Equadorr UECSr XSucre equatorianor UBSDr XDólar das Bahamasr USEKr X Coroa suecar UTOPr XPaʻanga de Tongar UPEIr X Inti peruanor UZMKr XCuacha zambianor UMVRr XRupias das Ilhas Maldivasr UXTSr XCódigo de Moeda de Tester UAUDr XDólar australianor UADPr XPeseta de Andorrar UCUPr X Peso cubanor UIEPr XLibra irlandesar UCLFr XUnidades de Fomento chilenasr UBBDr XDólar de Barbadosr UKMFr XFranco de Comoresr UKRWr XWon sul-coreanor UGMDr XDalasi de Gâmbiar UVEFr XBolívar v enezuelano forter UGTQr XQuetçal da Guatemalar UVEBr XBolívar venezuelanor UXOFr XFranco CFA BCEAOr USITr XTolar Bons eslovenor USDPr XLibra sudanesa antigar UCLPr X Peso chilenor UEURr XEuror UCDFr XFranco congolêsr UXCDr XDólar do Caribe Orientalr UKZTr XTenge do Cazaquistãor URUBr X Rublo russor UXFUr XFranco UIC francêsr UXAGr XPratar UBRRr XCruzeiro brasileiror UBRNr XCruzado novo brasileiror UBRLr XReal brasileiror UMMKr XKyat de Mianmarr UUYPr XPeso uruguaio (1975-1993)r URURr XRublo russo (1991-1998)r UPLNr XZloti polonêsr UBREr XCruzeiro brasileiro (1990-1993)r UPYGr XGuarani paraguaior UBRCr XCruzado brasileiror UBRBr X$Cruzeiro novo brasileiro (1967-1986)r USVCr XColom salvadorenhor UAEDr X"Dirém dos Emirados Árabes Unidosr UGNSr XSyli da Guinér UMKDr XDinar macedônior UAZMr XManat azerbaijanor UAZNr XManat do Azerbaijãor UUSNr X%Dólar norte-americano (Dia seguinte)r UGQEr XEkwele da Guiné Equatorialr UVUVr XVatu de Vanuatur UBADr XDinar da Bósnia-Herzegovinar UGNFr XFranco de Guinér UMXPr XPeso Prata mexicano (1861-1992)r UIQDr XDinar iraquianor UERNr XNakfa da Eritréiar UBAMr X&Marco bósnio-herzegovino conversívelr USCRr XRupia das Seychellesr UCADr XDólar canadenser USDDr XDinar sudanêsr UCYPr XLibra cipriotar UMADr XDirém marroquinor UKWDr! XDinar coveitianor" UBIFr# XFranco do Burundir$ ULTTr% XTalonas lituanor& UPGKr' XKina da Papua-Nova Guinér( ULTLr) X Lita lituanor* USGDr+ XDólar de Cingapurar, UUZSr- XSum do Usbequistãor. USTDr/ XDobra de São Tomé e Prínciper0 UXFOr1 XFranco-ouro francêsr2 UMLFr3 XFranco de Malir4 UESPr5 XPeseta espanholar6 UIRRr7 X Rial iranianor8 UZRZr9 XZaire zairenser: UCNYr; XYuan Renminbi chinêsr< USLLr= XLeone de Serra Leoar> UTNDr? XDinar tunisianor@ UGYDrA XDólar da GuianarB UESBrC X%Peseta espanhola (conta conversível)rD UESArE XPeseta espanhola (conta A)rF UNZDrG XDólar da Nova ZelândiarH UFKPrI XLibra das MalvinasrJ ULVLrK X Lats letãorL UUSSrM X"Dólar norte-americano (Mesmo dia)rN UUSDrO XDólar norte-americanorP UARPrQ XPeso argentino (1983-1985)rR UKGSrS XSom do QuirguistãorT UARSrU XPeso argentinorV UILSrW XSheqel Novo israelitarX URONrY X Leu romenorZ URSDr[ X Dinar sérvior\ UBHDr] XDinar bareinitar^ UJPYr_ X Iene japonêsr` UARAra XAustral argentinorb USDGrc XLibra sudanesard jXEscudo portuguêsre UXAUrf XOurorg uUmonthsrh }ri (U stand-alonerj }rk Unarrowrl }rm (KXJrn KXFro KXMrp KXArq Kjp Kjn Kjn Kjq K XSrr K XOrs K XNrt K XDru usUformatrv }rw (Uwiderx }ry (KXjaneirorz KX fevereiror{ KXmarçor| KXabrilr} KXmaior~ KXjunhor KXjulhor KXagostor K Xsetembror K Xoutubror K Xnovembror K Xdezembror uU abbreviatedr }r (KXjanr KXfevr KXmarr KXabrr KXmair KXjunr KXjulr KXagor K Xsetr K Xoutr K Xnovr K Xdezr uuuUcurrency_formatsr }r Nh()r }r (h+Nh-Kh.KKr h0h1X)r r h3KKr h5X ¤#,##0.00r h7X¤r X(¤r r h:Nh;KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (Kjr KXTr KXQr Kj Kjr Kjr Kju usUformatr }r (Uwider }r (KX segunda-feirar KX terça-feirar KX quarta-feirar KX quinta-feirar KX sexta-feirar KXsábador KXdomingor uU abbreviatedr }r (KXsegr KXterr KXquar KXquir KXsexr KXsábr KXdomr uuuU meta_zonesr }r (U Turkmenistanr }r (Ucommonr Ulongr }r (Udaylightr X$Horário de Verão do Turcomenistãor Ustandardr XHorário do Turcomenistãor uuU Kuybyshevr }r (j j }r (j XHorário de Verão de Kuybyshevr j XHorário de Kuybyshevr uuURotherar }r (j j }r j XHorário de Rotherar suUArabianr }r (Ushortr }r (Ugenericr X AT (Arábia)r j X ADT (Arábia)r j X AST (Arábia)r uj j }r (j XHorário da Arábiar j XHorário de Verão Áraber j XHorário Padrão da Arábiar uuUAustralia_Easternr }r (j j }r (j XHorário da Austrália Orientalr j X)Horário de Verão da Austrália Orientalr j X'Horário Padrão da Austrália Orientalr uuU Argentinar }r (j j }r (j XHorário de Verão da Argentinar j XHorário da Argentinar uuUBoliviar }r (j j }r j XHorário da Bolíviar suU Alaska_Hawaiir }r (j j }r (j XHorário do Alasca-Havaír j X#Horário de Verão do Alasca-Havaír j X!Horário Padrão do Alaska-Havaír uuU Cape_Verder }r (j j }r (j X Horário de Verão de Cabo Verder j XHorário de Cabo Verder uuUAzoresr }r (j j }r (j XHorário de Verão de Açoresr j XHorário de Açoresr uuUPierre_Miquelonr }r (j j }r (j XHorário de Pierre e Miquelonr j X'Horário de Verão de Pierre e Miquelonr j X%Horário Padrão de Pierre e Miquelonr uuUEurope_Centralr }r (j j }r (j X$Horário de Verão da Europa Centralr j XHorário da Europa Centralr uuUTrukr }r (j j }r j XHorário de Trukr suU Aktyubinskr }r (j j }r (j X Horário de Verão do Aktyubinskr j XHorário do Aktyubinskr uuUBeringr }r (j j }r (j XHorário de Beringr j XHorário de Verão de Beringr j XHorário Padrão de Beringr uuU Qyzylordar }r (j j }r (j XHorário de Verão de Qyzylordar j XHorário de Qyzylordar uuUKazakhstan_Easternr }r (j j }r (j X!Horário do Casaquistão do Lester j X)Horário Padrão do Cazaquistão do Lester uuUFrunzer }r! (j j }r" (j XHorário de Verão de Frunzer# j XHorário de Frunzer$ uuU Dutch_Guianar% }r& (j j }r' j XHorário da Guiana Holandesar( suUYerevanr) }r* (j j }r+ (j XHorário de Verão de Yerevanr, j XHorário de Yerevanr- uuU Kamchatkar. }r/ (j j }r0 (j X.Horário de Verão de Petropavlovsk-Kamchatskir1 j X$Horário de Petropavlovsk-Kamchatskir2 uuUKashgarr3 }r4 (j j }r5 j XHorário de Kashgarr6 suUMaldivesr7 }r8 (j j }r9 j XHorário das Ilhas Maldivasr: suUNorfolkr; }r< (j j }r= j XHorário das Ilhas Norfolkr> suU East_Timorr? }r@ (j j }rA j XHorário do Timor LesterB suUAfrica_EasternrC }rD (j j }rE j XHorário da África OrientalrF suU AshkhabadrG }rH (j j }rI (j XHorário de Verão de AshkhabadrJ j XHorário de AshkhabadrK uuUAlaskarL }rM (j j }rN (j XHorário do AlaskarO j XHorário de Verão do AlascarP j XHorário Padrão do AlascarQ uuUAmerica_EasternrR }rS (j j }rT (j XHorário OrientalrU j XHorário de Verão OrientalrV j XHorário Padrão OrientalrW uuU YekaterinburgrX }rY (j j }rZ (j X#Horário de Verão de Yekaterinburgr[ j XHorário de Yekaterinburgr\ uuUSolomonr] }r^ (j j }r_ j XHorário das Ilhas Salomãor` suU Krasnoyarskra }rb (j j }rc (j X!Horário de Verão de Krasnoyarskrd j XHorário de Krasnoyarskre uuUAmerica_Centralrf }rg (j j }rh (j XHorário Centralri j XHorário de Verão Centralrj j XHorário Padrão Centralrk uuUMawsonrl }rm (j j }rn j XHorário de Mawsonro suUPakistanrp }rq (j j }rr (j X Horário de Verão do Paquistãors j XHorário do Paquistãort uuUSamoaru }rv (j j }rw j XHorário Padrão de Samoarx suUMacaury }rz (j j }r{ (j XHorário de Verão de Macaur| j XHorário de Macaur} uuUChamorror~ }r (j j }r (j XHorário de Chamorror j XHorário Padrão de Chamorror uuUGuamr }r (j }r j X GST (Guam)r sj j }r j XHorário Padrão de Guamr suUIndiar }r (j j }r j XHorário Padrão da Índiar suU Azerbaijanr }r (j j }r (j X"Horário de Verão do Arzeibaijãor j XHorário do Arzeibaijãor uuU Marquesasr }r (j j }r j XHorário das Marquesasr suU Tajikistanr }r (j j }r j XHorário do Tajiquistãor suUPitcairnr }r (j j }r j XHorário de Pitcairnr suUTurkeyr }r (j j }r (j XHorário de Verão da Turquiar j XHorário da Turquiar uuU Afghanistanr }r (j j }r j XHorário do Afeganistãor suU Choibalsanr }r (j j }r (j X Horário de Verão de Choibalsanr j XHorário de Choibalsanr uuU Vladivostokr }r (j j }r (j X!Horário de Verão de Vladivostokr j XHorário de Vladivostokr uuU Shevchenkor }r (j j }r (j X Horário de Verão de Shevchenkor j XHorário de Shevchenkor uuU Bangladeshr }r (j j }r j XHorário de Bangladeshr suUGulfr }r (j j }r (j XHorário do Golfor j XHorário Padrão do Golfor uuUDaccar }r (j j }r j XHorário de Daccar suUMongoliar }r (j j }r (j X Horário de Verão de Ulan Batorr j XHorário de Ulan Batorr uuU Samarkandr }r (j j }r (j XHorário de Verão de Samarkandr j XHorário de Samarkandr uuUWaker }r (j j }r j XHorário das Ilhas Waker suUPerur }r (j j }r (j XHorário de Verão do Perur j XHorário do Perur uuUVanuatur }r (j j }r (j XHorário de Verão de Vanuatur j XHorário de Vanuatur uuUIndonesia_Centralr }r (j j }r j XHorário da Indonésia Centralr suUNaurur }r (j j }r j XHorário de Naurur suUFalklandr }r (j j }r (j X%Horário de Verão das Ilhas Malvinasr j XHorário das Ilhas Malvinasr uuUKorear }r (j j }r (j XHorário da Coréiar j XHorário de Verão da Coréiar j XHorário Padrão da Coréiar uuUCubar }r (j }r (j X CDT (Cuba)r j X CST (Cuba)r uj j }r (j XHorário de Cubar j XHorário de Verão de Cubar j XHorário Padrão de Cubar uuUIrkutskr }r (j j }r (j XHorário de Verão de Irkutskr j XHorário de Irkutskr uuUArgentina_Westernr }r (j j }r j XHorário da Argentina Ocidentalr suUAmazonr }r (j j }r (j XHorário de Verão do Amazonasr j XHorário do Amazonasr uuUChinar }r (j }r (j X CT (China)r j X CDT (China)r j X CST (China)r uj j }r (j XHorário da Chinar j XHorário de Verão da Chinar j XHorário Padrão da Chinar uuULong_Shur }r (j j }r j XHorário de Long-Shur suUArmeniar }r (j }r (j XAMST (Armênia)r j XAMT (Armênia)r uj j }r (j XHorário de Verão da Armêniar j XHorário da Armêniar uuUCookr }r (j j }r (j X&Meio Horário de Verão das Ilhas Cookr j XHorário das Ilhas Cookr uuUChathamr }r! (j j }r" (j XHorário de Verão de Chathamr# j XHorário de Padrão de Chathamr$ uuUGreenland_Westernr% }r& (j j }r' (j X,Horário de Verão da Groenlândia Ocidentalr( j X"Horário da Groenlândia Ocidentalr) uuUKarachir* }r+ (j j }r, j XHorário de Karachir- suUTongar. }r/ (j j }r0 (j XHorário de Verão de Tongar1 j XHorário de Tongar2 uuUSakhalinr3 }r4 (j j }r5 (j XHorário de Verão de Sakhalinr6 j XHorário de Sakhalinr7 uuUBrasiliar8 }r9 (j j }r: (j XHorário de Verão de Brasíliar; j XHorário de Brasíliar< uuUSyowar= }r> (j j }r? j XHorário de Syowar@ suU French_GuianarA }rB (j j }rC j XHorário da Guiana FrancesarD suUFrench_SouthernrE }rF (j j }rG j X*Horário da Antártida e do Sul da FrançarH suU MauritiusrI }rJ (j j }rK j XHorário das Ilhas MauríciorL suUAfrica_SouthernrM }rN (j j }rO (j XHorário da África do SulrP j X"Horário Padrão da África do SulrQ uuUGambierrR }rS (j j }rT j XHorário de GambierrU suUDavisrV }rW (j j }rX j XHorário de DavisrY suU NewfoundlandrZ }r[ (j j }r\ (j XHorário de Newfoundlandr] j X"Horário de Verão de Newfoundlandr^ j X Horário Padrão de Newfoundlandr_ uuUCocosr` }ra (j j }rb j XHorário das Ilhas Cocorc suU Kyrgystanrd }re (j j }rf j XHorário do Quirguistãorg suUTokelaurh }ri (j j }rj j XHorário de Tokelaurk suUAustralia_Westernrl }rm (j j }rn (j X Horário da Austrália Ocidentalro j X*Horário de Verão da Austrália Ocidentalrp j X(Horário Padrão da Austrália Ocidentalrq uuUBakurr }rs (j j }rt (j XHorário de Verão de Bakuru j XHorário de Bakurv uuUAfrica_Centralrw }rx (j j }ry j XHorário da África Centralrz suU Line_Islandsr{ }r| (j j }r} j XHorário das Ilhas Liner~ suU Novosibirskr }r (j j }r (j X!Horário de Verão de Novosibirskr j XHorário de Novosibirskr uuUJapanr }r (j j }r (j XHorário do Japãor j XHorário de Verão do Japãor j XHorário Padrão do Japãor uuU Sverdlovskr }r (j j }r (j X Horário de Verão de Sverdlovskr j XHorário de Sverdlovskr uuU New_Caledoniar }r (j j }r (j X%Horário de Verão da Nova Caledôniar j XHorário da Nova Caledôniar uuU Kwajaleinr }r (j j }r j XHorário de Kwajaleinr suUAqtober }r (j j }r (j XHorário de Verão do Aqtober j XHorário do Aqtober uuUGilbert_Islandsr }r (j j }r j XHorário das Ilhas Gilbertor suUAustralia_CentralWesternr }r (j j }r (j X'Horário da Austrália Centro Ocidentalr j X1Horário de Verão da Austrália Centro Ocidentalr j X/Horário Padrão da Austrália Centro Ocidentalr uuU Indochinar }r (j j }r j XHorário da Indochinar suUPapua_New_Guinear }r (j j }r j XHorário de Papua Nova Guinér suUHovdr }r (j j }r (j XHorário de Verão de Hovdr j XHorário de Hovdr uuU South_Georgiar }r (j }r j XGST (Georgia do Sul)r sj j }r j XHorário da Georgia do Sulr suUEcuadorr }r (j j }r j XHorário do Equadorr suUMalayar }r (j j }r j XHorário de Malaiar suUBruneir }r (j j }r j XHorário de Brunei Darussalamr suUIranr }r (j j }r (j XHorário de Verão do Irãr j XHorário Padrão do Irãr uuUAqtaur }r (j j }r (j XHorário de Verão do Aqtaur j XHorário do Aqtaur uuU Indian_Oceanr }r (j j }r j XHorário do Oceano Índicor suUTuvalur }r (j j }r j XHorário de Tuvalur suUAmerica_Mountainr }r (j j }r (j XHorário da Montanhar j XHorário de Verão da Montanhar j XHorário Padrão da Montanhar uuUHawaii_Aleutianr }r (j j }r j XHorário Padrão do Havaír suUChangbair }r (j j }r j XHorário de Changbair suUChiler }r (j j }r (j XHorário de Verão do Chiler j XHorário do Chiler uuUWallisr }r (j j }r j XHorário de Wallis e Fortunar suUKosraer }r (j j }r j XHorário da Coréiar suUDushanber }r (j j }r (j XHorário de Verão de Dushanber j XHorário de Dushanber uuUGeorgiar }r (j j }r (j XHorário de Verão da Georgiar j XHorário da Georgiar uuUAnadyrr }r (j j }r (j XHorário de Verão do Anadyrrj XHorário do AnadyrruuU Philippinesr}r(j j }r(j X Horário de Verão das Filipinasrj XHorário das FilipinasruuUYakutskr}r(j j }r (j XHorário de Verão de Yakutskr j XHorário de Yakutskr uuUIndonesia_Westernr }r (j j }rj X Horário da Indonésia OcidentalrsuUGreenland_Easternr}r(j j }r(j X*Horário de Verão da Groelândia Orientalrj X Horário da Groelândia OrientalruuUGMTr}r(j j }rj X"Horário do Meridiano de GreenwichrsuUMarshall_Islandsr}r(j j }rj XHorário das Ilhas MarshallrsuU Seychellesr}r(j j }rj XHorário das Ilhas Seychellesr suUUruguayr!}r"(j j }r#(j XHorário de Verão do Uruguair$j XHorário do Uruguair%uuUVostokr&}r'(j j }r(j XHorário de Vostokr)suU Uzbekistanr*}r+(j j }r,(j X"Horário de Verão do Uzbequistãor-j XHorário do Uzbequistãor.uuUColombiar/}r0(j j }r1(j XHorário de Verão da Colômbiar2j XHorário da Colômbiar3uuUReunionr4}r5(j j }r6j XHorário das Ilhas Reuniãor7suU Volgogradr8}r9(j j }r:(j XHorário de Verão de Volgogradr;j XHorário de Volgogradr<uuU Kizilordar=}r>(j j }r?(j XHorário de Verão de Kizilordar@j XHorário de KizilordarAuuUFijirB}rC(j j }rD(j XHorário de Verão de FijirEj XHorário de FijirFuuUAmerica_PacificrG}rH(j j }rI(j XHorário do PacíficorJj XHorário de Verão do PacíficorKj XHorário Padrão do PacíficorLuuUKazakhstan_WesternrM}rN(j j }rO(j X!Horário do Casaquistão do OesterPj X"Horário do Cazaquistão OcidentalrQuuUPalaurR}rS(j j }rTj XHorário de PalaurUsuUEurope_EasternrV}rW(j j }rX(j X%Horário de Verão da Europa OrientalrYj XHorário da Europa OrientalrZuuUBhutanr[}r\(j j }r]j XHorário do Butãor^suUBorneor_}r`(j j }ra(j XHorário de Verão de Bornéorbj XHorário de BornéorcuuUNepalrd}re(j j }rfj XHorário do NepalrgsuU Galapagosrh}ri(j j }rjj XHorário de GalápagosrksuU Lord_Howerl}rm(j j }rn(j XHorário de Lord Howeroj XHorário de Verão de Lord Howerpj XHorário Padrão de Lord HowerquuUPhoenix_Islandsrr}rs(j j }rtj XHorário das Ilhas FênixrusuUSurinamerv}rw(j j }rxj XHorário do SurinamerysuUAcrerz}r{(j }r|(j X ACST (Acre)r}j X ACT (Acre)r~uj j }r(j XHorário de Verão do Acrerj XHorário do AcreruuUEasterr}r(j j }r(j X%Horário de Verão da Ilha de Páscoarj XHorário da Ilha de PáscoaruuU Christmasr}r(j j }rj XHorário das Ilhas ChristmasrsuUIsraelr}r(j }rj X IST (Israel)rsj j }r(j XHorário de Israelrj XHorário de Verão de Israelrj XHorário Padrão de IsraelruuUAfrica_Westernr}r(j j }r(j X'Horário de Verão da África Ocidentalrj XHorário da África OcidentalruuUTashkentr}r(j j }r(j XHorário de Verão de Tashkentrj XHorário de TashkentruuUMalaysiar}r(j j }rj XHorário da MalásiarsuUNoronhar}r(j j }r(j X)Horário de Verão de Fernando de Noronharj XHorário de Fernando de NoronharuuU Venezuelar}r(j j }rj XHorário da VenezuelarsuUPonaper}r(j j }rj XHorário de PonapersuUIndonesia_Easternr}r(j j }rj XHorário da Indonésia OrientalrsuUOmskr}r(j j }r(j XHorário de Verão de Omskrj XHorário de OmskruuUAustralia_Centralr}r(j }r(j XACT (Austrália)rj XACDT (Austrália)rj XACST (Austrália)ruj j }r(j XHorário da Austrália Centralrj X(Horário de Verão da Austrália Centralrj X&Horário Padrão da Austrália CentralruuUAtlanticr}r(j j }r(j XHorário do Atlânticorj X Horário de Verão do Atlânticorj XHorário Padrão do AtlânticoruuU North_Marianar}r(j j }rj X#Horário das Ilhas Mariana do NortersuULankar}r(j j }rj XHorário de LankarsuUDumontDUrviller}r(j j }rj XHorário de Dumont-d'UrvillersuUEurope_Westernr}r(j j }r(j X&Horário de Verão da Europa Ocidentalrj XHorário da Europa OcidentalruuU New_Zealandr}r(j j }r(j XHorário da Nova Zelândiarj X$Horário de Verão da Nova Zelândiarj X"Horário Padrão da Nova ZelândiaruuUUrumqir}r(j j }rj XHorário de UrumqirsuU Hong_Kongr}r(j j }r(j XHorário de Verão de Hong Kongrj XHorário de Hong KongruuUGuyanar}r(j j }rj XHorário da GuianarsuUMagadanr}r(j j }r(j XHorário de Verão de Magadanrj XHorário de MagadanruuUAlmatyr}r(j j }r(j XHorário de Verão do Almatyrj XHorário do AlmatyruuUTbilisir}r(j j }r(j XHorário de Verão de Tbilisirj XHorário de TbilisiruuUMyanmarr}r(j j }rj XHorário de MianmarrsuU Singaporer}r(j j }rj XHorário Padrão de CingapurarsuUSamarar}r(j j }r(j XHorário de Verão de Samararj XHorário de SamararuuUGreenland_Centralr}r(j j }r (j X*Horário de Verão da Groenlândia Centralr j XHorário da Groelândia Centralr uuUUralskr }r (j j }r(j XHorário de Verão de Ural'skrj XHorário de Ural'skruuUTahitir}r(j j }rj XHorário do HaitirsuUParaguayr}r(j j }r(j XHorário de Verão do Paraguairj XHorário do ParaguairuuUYukonr}r(j j }r(j XHorário de Yukonrj XHorário de Verão de Yukonrj XHorário Padrão de YukonruuUMoscowr }r!(j j }r"(j XHorário de Moscour#j XHorário de Verão de Moscour$j XHorário Padrão de Moscour%uuUNiuer&}r'(j j }r(j XHorário de Niuer)suuUerasr*}r+(Uwider,}r-(KXAntes de Cristor.KX Ano do Senhorr/uU abbreviatedr0}r1(KXa.C.r2KXd.C.r3uuu.PK[V( ( &site-packages/babel/localedata/cch.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUNGNqgXAmanqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KXPen DyonqKXPen Ba'aqKXPen AtatqKXPen AnasqKX Pen AtyonqKX Pen AchirimqKX Pen AtaribaqKX Pen AwurrqK X Pen ShadonqK X Pen ShakurqK X Pen Kur NabaqK X Pen Kur NatatquU abbreviatedq}q(KXDyonqKXBaaqKXAtatqKXAnasqKXAtyoqKXAchiqKXAtarqKXAwurqK XShadqK XShakqK XNabaqK XNataquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KX Wai TungaqKX Toki GitungqKX Tsam KasuwaqKX Wai Na NasqKX Wai Na TiyonqKX Wai Na ChirimqKXWai Yoka BawaiquU abbreviatedq}q(KXTungqKXT. TungqKXTsanqKXNasqKXNatqKXChirqKXYokquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXGabanin MiladiqKXMiladiquU abbreviatedq}q(KXGMqKXMquuu.PK[_.ll(site-packages/babel/localedata/uz_UZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[3I̺22%site-packages/babel/localedata/se.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X %q8h8q9h)KKq:h+X#,##0 %q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q](Uelq^X greikkagiellaq_Uguq`XgujaratagiellaqaUangqbXboares eaŋgalasgiellaqcUcoqdX corsicagiellaqeUgaqfX iirragiellaqgUafqhXafrikánsagiellaqiUroaqjXrománalaš gielatqkUcaqlXkatalánagiellaqmUmdfqnX mokšagiellaqoUitqpX itáliagiellaqqUanqrXaragoniagiellaqsUarqtX arábagiellaquUbgqvXbulgáriagiellaqwUcsqxX čeahkagiellaqyUetqzX esttegiellaq{Uapaq|X apachegielatq}Uesq~XspánskkagiellaqUruqXruoššagiellaqUselqX selkupagiellaqUlbqXluxemburggagiellaqUnnqXođđadárogiellaqUfiuqXfenno-ugrálaš gielatqUudmqX udmurtagiellaqUnbqXgirjedárogiellaqUsmsqXnuortalašgiellaqUchmqX marigiellaqUlvqX látviagiellaqUsmnqXanárašgiellaqUltqXliettuvagiellaqUenqXeaŋgalsgiellaqUsmjqXjulevsámegiellaqUsmiqX sámegielatqUrmqXretorománagiellaqUroqXromániagiellaqUisqXislánddagiellaqUplqX polskkagiellaqUbeqXvilges-ruoššagiellaqUfrqXfránskkagiellaqUdeqX duiskkagiellaqUukqX ukrainagiellaqUwaqX vallonagiellaqUastqX asturiagiellaqUhrqXkroátiagiellaqUfyqX friisagiellaqUbnqX bengalgiellaqUcelqXkelttalaš gielatqUdaqXdánskkagiellaqUfaqX persijagiellaqUhiqX hindigiellaqUnoqX dárogiellaqUbrqX bretonagiellaqUbsqX bosniagiellaqUfiqX suomagiellaqUhyqXarmeenalaš gielatqUmyvqX ersagiellaqUgemqXgermánalaš gielatqUfoqX fearagiellaqUscnqX sisiliagiellaqUwenqX sorbigiellaqUgvqX manksgiellaqUptqXportugálagiellaqUsrqX serbiagiellaqUsqqX albánagiellaqUlaqX láhtengiellaqUocqXoksitánagiellaqUsvqX ruoŧagiellaqUmkqXmakedoniagiellaqUskqXslovákiagiellaqUkwqX kornagiellaqUkvqX komigiellaqUkrlqX gárjilgiellaqUslqX slovenagiellaqUscqX sardigiellaqUnlqXhollánddagiellaqUsmaqXlullisámegiellaqUseqXdavvisámegiellaquU territoriesq}q(UBDqX BangladeshqUBEqXBelgiaqUBFqX Burkina FasoqUBGqX BulgáriaqUVErX VenezuelarUBArXBosnia-HercegovinarUBBrXBarbadosrUWFrXWallis ja FutunarUBMrXBermudar UBNr XBruneir UBOr XBoliviar UBHrXBahrainrUBIrXBurundirUBJrXBeninrUBTrXBhutanrU011rXoarji-AfrihkkárUBWrXBotswanarU014rXnuorta-AfrihkkárU015rXdavvi-AfrihkkárUBRrXBrasilrU017r Xgaska-Afrihkkár!U018r"Xmátta-Afrihkkár#U019r$X Amerihkkár%UBYr&XVilges-Ruoššar'UBZr(XBelizer)URUr*XRuoššar+URWr,XRwandar-URSr.XSerbiar/UTLr0X Nuorta-Timorr1UREr2XReunionr3UTMr4X Turkmenistanr5UOMr6XOmanr7UTJr8X Tažikistanr9UROr:XRomániar;UTKr<XTokelaur=UGWr>X Guinea-Bissaur?UGUr@XGuamrAUGTrBX GuatemalarCUGSrDX&Lulli Georgia ja Lulli Sandwich-sullotrEUGRrFXGreikarGUGQrHXEkvatoriála GuinearIUGPrJX GuadelouperKUJPrLXJapánarMUKIrNXKiribatirOUGYrPXGuyanarQUGGrRXGuernseyrSUGFrTXFrankriikka GuayanarUUGErVXGeorgiarWUGDrXXGrenadarYU021rZXdávvi-Amerihkkár[UGBr\XStuorra-Británniar]UGAr^XGabonr_USVr`X El SalvadorraUGNrbXGuinearcUGMrdXGámbiareUGLrfXKalaallit NunaatrgU029rhXKaribiariUGIrjX GibraltarrkUGHrlXGhanarmUJErnXJerseyroUTNrpXTunisiarqUJMrrXJamaicarsU013rtXgaska-AmerihkkáruUWSrvXSamoarwU419rxXLulli-Amerihkká ja KaribiaryUHRrzXKroátiar{UBSr|XBahamasr}UHTr~XHaitirUHUrXUngárrUHKrX Hong KongrU039rXmátta-EurohpárUHNrXHondurasrUFIrXSuopmarU142rXÁsiarU030rX nuorta-ÁsiarU034rX mátta-ÁsiarU035rXmátta-nuorta-ÁsiarUPRrX Puerto RicorUPSrX PalestinarUPWrXPalaurUPTrX PortugálarUSJrXSvalbárda ja Jan MayenrUMDrX MoldáviarUIQrXIrakrUPArXPanamarUPGrXPapua-Ođđa-GuinearUPErXPerurUPKrXPakistanrUPHrX FilippiinnatrUFOrX FearsullotrUPNrXPitcairnrUPLrXPolenrUPMrXSaint Pierre ja MiquelonrUZMrXZambiarUEHrX Oarje-SahárarUEErX EstlándarUEGrXEgyptarUZArXMátta-AfrihkárUECrXEcuadorrUITrXItáliarUVNrXVietnamrUETrXEtiopiarUSOrXSomáliarUZWrXZimbabwerUESrXSpániarUERrXEritrearUMErX MontenegrorUAQrX AntárktisrUMGrX MadagaskarrUMArXMarokkorUMCrXMonacorUUZrX UsbekistanrUMMrXBurmarUMLrXMalirUMOrXMakáorUMNrXMongoliarUASrXAmerihká SamoarUMKrX MakedoniarUMUrX MauritiusrUMTrXMáltarUMWrXMalawirUMVrX MalediivvatrUMQrX MartiniquerUMPrXDavvi-MariánatrUMSrX MontserratrUMRrX MauretániarUUGrXUgandarUTZrX TanzániarUMYrXMalesiarUMXrXMeksikorUILrXIsraelrUFRrX FrankriikarUAWrXArubarUSHrX Saint HelenarUVCrXSaint Vincent ja GrenadinerU054rX MelanesiarUDJrXDjiboutir UFJr X Fijisullotr UFKr XFalklandsullotr UFMrX MikronesiarU053rXAustrália ja Ođđa-SelándarUNIrX NicaraguarUNLrXVuolleeatnamatrUNOrXNorgarUNArXNamibiarUVUrXVanuaturUNCrXOđđa-KaledoniarUNErXNigerrUNGr XNigeriar!UNZr"XOđđa-Selándar#UNPr$XNepalr%UNRr&XNaurur'UNUr(XNiuer)U061r*X Polynesiar+UCHr,XŠveicar-UCOr.XKolombiar/UCNr0XKiinnár1UCMr2XKamerunr3UCLr4XChiler5UCAr6XKanádar7UCGr8XKongo-Brazzaviller9UCDr:XKongo-Kinshasar;UCZr<XČeahkkar=UCYr>XKyprosr?UCRr@X Costa RicarAUPYrBXParaguayrCUCVrDX Kap VerderEUCUrFXKubarGUSZrHX SvazieanarIUSYrJXSyriarKUKGrLX KirgisistanrMUKErNXKeniarOUSRrPXSurinamrQU143rRX gaska-ÁsiarSUKHrTX KampučearUUKNrVXSaint Kitts ja NevisrWUKMrXX KomorosullotrYUSTrZXSão Tomé ja Prínciper[USKr\X Slovákiar]UKRr^X Mátta-Korear_USIr`XSloveniaraUKPrbX Davvi-KorearcUKWrdXKuwaitreUSNrfXSenegalrgUSMrhX San MarinoriUSLrjX Sierra LeonerkUSCrlXSeychellsullotrmUKZrnX KasakstanroUSArpX Saudi-ArábiarqUSGrrX SingaporersUSErtXRuoŧŧaruUSDrvXSudanrwU151rxXnuorta-EurohpáryU150rzXEurohpár{UDMr|XDominicar}U155r~Xoarji-EurohpárU154rXdavvi-EurohpárUDErXDuiskarUYErXJemenrUMHrXMarshallsullotrU062rXmátta-gaska-ÁsiarUDZrXAlgeriarUUSrXAmerihká ovttastuvvan stáhtatrUUYrXUruguayrUYTrXMayotterULBrXLibanonrULCrX Saint LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTrXTrinidad ja TobagorUTRrXDurkarULKrX Sri LankarULIrX LiechtensteinrULVrXLátviarUTOrXTongarULTrXLietuvarULUrX LuxembourgrULRrXLiberiarULSrXLesothorUTHrXThaieanarUTGrXTogorUTDrXChadrUTCrXTurks ja Caicos-sullotrULYrXLibyarUVArX VatikánarU145rX oarji-ÁsiarUAErXOvttastuvvan ArábaemiráhtatrUADrXAndorrarUAGrXAntigua ja BarbudarUAFrX AfghanistanrUAIrXAnguillarUISrXIslándarUIRrXIranrUAMrXArmeniarUALrXAlbániarUAOrXAngolarU003rX%dávvi-Amerihkká ja gaska-AmerihkkárU002rX AfrihkkárU001rXmáilbmirUARrX ArgentinarUAUrX AustráliarUATrX NuortariikarU005rXmátta-AmerihkkárUINrXIndiarUAXrXÅlándarU009rXOseaniarUAZrX AserbaižanrUIErXIrlándarUIDrX IndonesiarUJOrX JordániarUQUrXEUrUUArXUkrainarUQArXQatarrUDKrX DánmárkurUMZrXMosambikruUdecimal_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKrh+X #,##0.###rh-h'h.rh0Nh1KKrubsU date_formatsr}r(UmediumrhG)r}r(h+X yyyy MMM drhKX%(yyyy)s %(MMM)s %(d)srubUfullr hG)r }r (h+XEEEE, yyyy MMMM ddr hKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sr ubUlongrhG)r}r(h+X yyyy MMMM drhKX%(yyyy)s %(MMMM)s %(d)srubUshortrhG)r}r(h+Xyy/MM/ddrhKX%(yy)s/%(MM)s/%(dd)srubuUcurrency_symbolsr}rU time_zonesr}rUscriptsr}r(ULatnrX láhtenašrUCyrlr X kyrillalašr!UGrekr"X greikkalašr#uUvariantsr$}r%Unumber_symbolsr&}r'Ucurrency_namesr(}r)(UXAGr*Xsilbar+UNOKr,Xnorgga kruvdnor-USEKr.Xruoŧŧa kruvdnor/UXAUr0Xgollir1UFIMr2X suoma márkkir3uUmonthsr4}r5(U stand-aloner6}r7Unarrowr8}r9(KXOr:KXGr;KXNr<KXCr=KXMr>Kj;KXSr?KXBr@K XČrAK j;K j?K XJrBusUformatrC}rD(UwiderE}rF(KXođđajagemánnurGKX guovvamánnurHKX njukčamánnurIKX cuoŋománnurJKX miessemánnurKKX geassemánnurLKX suoidnemánnurMKX borgemánnurNK X čakčamánnurOK X golggotmánnurPK X skábmamánnurQK X juovlamánnurRuU abbreviatedrS}rT(KXođđjrUKXguovrVKXnjukrWKXcuorXKXmiesrYKXgeasrZKXsuoir[KXborgr\K Xčakčr]K Xgolgr^K Xskábr_K Xjuovr`uuuUcurrency_formatsra}rbNh)rc}rd(h!Nh#Kh$KKreh&X ¤rfjfrgh)KKrhh+X #,##0.00 ¤rih-h'h.rjh0Nh1KKrkubsUdaysrl}rm(U stand-alonern}roUnarrowrp}rq(KXvrrKXmrsKXgrtKXdruKXbrvKXlrwKXsrxusUformatry}rz(Uwider{}r|(KX vuossárgar}KX maŋŋebárgar~KX gaskavahkkurKX duorasdatrKX bearjadatrKX lávvardatrKX sotnabeaiviruU abbreviatedr}r(KXvuosrKXmaŋrKXgaskrKXduorrKXbearrKXlávrKXsotnruuuU meta_zonesr}rUerasr}r(Uwider}rKXOvdal KristtusarsU abbreviatedr}r(KXOKrKXCEruuu.PK[+%site-packages/babel/localedata/nb.datnu[}q(U zone_formatsq}q(UregionqX%sqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1. kvartalqKX 2. kvartalqKX 3. kvartalqKX 4. kvartalquU abbreviatedq}q(KXK1q KXK2q!KXK3q"KXK4q#uuuUperiodsq$}q%(Uamq&X formiddagq'Upmq(X ettermiddagq)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X %qFhFqGh7KKqHh9X#,##0 %qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9XHH.mm.ssqXUformatqYX%(HH)s.%(mm)s.%(ss)sqZubUfullq[hU)q\}q](h9X'kl'. HH.mm.ss vq^hYXkl. %(HH)s.%(mm)s.%(ss)s %(v)sq_ubUlongq`hU)qa}qb(h9X HH.mm.ss zqchYX%(HH)s.%(mm)s.%(ss)s %(z)sqdubUshortqehU)qf}qg(h9XHH.mmqhhYX %(HH)s.%(mm)sqiubuU languagesqj}qk(UgvqlXmanxqmUguqnXgujaratiqoUscnqpX sicilianskqqUromqrXromaniqsUalgqtXalgonkinsk språkquUaleqvXaleutiskqwUscoqxXskotskqyUmniqzXmanipuriq{Ugdq|Xskotsk gæliskq}Ugaq~XirskqUmnoqX manobospråkqUosaqXosageqUgnqXguaraniqUaltqX søraltaiskqUglqXgalisiskqUmwrqXmarwariqUtyqXtahitiskqUtwqXtwiqUttqXtatariskqUtrqXtyrkiskqUtsqXtsongaqUtnqXsetswanaqUtoqXtonganskqUausqXaustralsk språkqUavqXavariskqUtkqX turkmenskqUthqXthaiqUroaqXromansk språkqUtgqX tadsjikiskqUteqXteluguqUugaqX ugaritiskqUmwlqX mirandesiskqUkcgqXtyapqUsmiqX samisk språkqUfatqXfantiqUfanqXfangqUwoqXwolofqUrmqX retoromanskqUdinqXdinkaqUblaqXsiksikaqUcmcqX kamisk språkqUmlqX malayalamqUzhqXkinesiskqUtemqXtemneqUen_CAqXcanadisk engelskqUnwcqXklassisk newariqUzaqXzhuangqUcauqXkaukasisk språkqUzuqXzuluqUterqXterenoqUtetqXtetumqUmncqXmandsjuqUkutqXkutenaiqUsukqXsukumaqUkumqXkumykqUsusqXsusuqUnewqXnewariqUsuxqXsumeriskqUdenqXslaviskqUmenqXmendeqUmulqX flere språkqUlezqXlezghianqUrootqXrotqUekaqXekajukqUakkqXakkadiskqUdraqXdravidisk språkqUjrbqX jødearabiskqUsgnqX tegnspråkqUsgaqX gammelirskqUapaqX apachespråkqUbraqXbrajqUchbqXchibchaqUchgqXchagataiqUchkqX chuukesiskqUchmrXmarirUchnrXchinookrUchorXchoctawrUchprX chipewianskrUchrrXcherokeer Uchyr Xcheyenner Utir Xtigrinjar UvotrXvotiskrUmgrX madagassiskrUibarXibanrUmorX moldaviskrUmnrXmongolskrUmirXmaorirUmhrX marshallesiskrUmkrX makedonskrUmtrX maltesiskrUcair X!sentralamerikansk indiansk språkr!Udelr"Xdelawarer#Umsr$Xmalayiskr%Umrr&Xmarathir'Utar(Xtamilr)Umyr*X burmesiskr+Ucadr,Xcaddor-Usrnr.X sranan tongor/Utair0X taispråkr1Uafhr2Xafrihilir3Usitr4Xsino-tibetansk språkr5Uenmr6X mellomengelskr7Uen_AUr8Xaustralsk engelskr9Unynr:Xnyankoler;Unyor<Xnyoror=Unymr>Xnyamwezir?Usior@X siouxspråkrAUmaprBX austronesiskrCUmasrDXmasairEUlahrFXlahndarGUladrHXladinskrIUfyrJX vestfrisiskrKUsnkrLXsoninkerMUfarNXpersiskrOUmadrPX maduresiskrQUmagrRXmagahirSUmairTXmaithilirUUfirVXfinskrWUfjrXXfijianskrYUmanrZXmandingor[Uegyr\Xgammelegyptiskr]Uzndr^Xzander_Ussr`XswatiraUsrrbXserbiskrcUsqrdXalbanskreUswrfXswahilirgUsvrhXsvenskriUsurjX sundanesiskrkUstrlX sør-sothormUskrnX slovakiskroUsirpX singalesiskrqUshrrX serbokroatiskrsUsortXsomaliruUsnrvXshonarwUsmrxXsamoanskryUslrzXslovenskr{Uscr|Xsardinskr}Usar~XsanskritrUsgrXsangorUserX nordsamiskrUsdrXsindhirUzenrXzenagarUkbdrX kabardiskrUafarXafroasiatisk språkrUcsbrX kasjubiskrUlgrXgandarUlbrX luxemburgskrUfiurXfinsk-ugrisk språkrUlnrXlingalarUlorXlaotiskrUlirX limburgiskrUbynrXblinrUltrXlitauiskrUlurX luba-katangarUfilrX filippinskrUyirXjiddiskrUnonrX gammelnorskrUcebrXcebuanskrUyorXjorubarUnogrXnogairUbatrXbaltisk språkrUdakrXdakotarUdarrXdargwarUdayrXdayakrUssarXnilo-saharaspråkrUkperXkpellerUelrXgreskrUeorX esperantorUenrXengelskrUlamrXlambarUeerXewerUmdfrXmoksharUfrrXfranskrUmdrrXmandarrUetrXestiskrUesrXspanskrUrurXrussiskrUgonrXgondirUgohrXgammelhøytyskrUsmsrX skoltesamiskrUsmnrX enaresamiskrUsmjrX lulesamiskrUde_ATrXøsterriksk tyskrUgotrXgotiskrUrnrXrundirUrorXrumenskrUdsbrX lavsorbiskrUsmarX sørsamiskrUgorrX gorontalorUastrXasturiskrUwalrXwalamorUcrhrX krimtatariskrUathrXathapaskansk språkrUgezrXgesrUxhrXxhosarUffrXfulanirUkforXkororUmakrXmakasarrUzaprXzapotecrUkokrXkonkanirUzxxrXuten språklig innholdrUkosrX kosraeanskrUforX færøyskrUtogrXnyasa-tonganskrUhuprXhuparUudmrXudmurtrUbejrXbejar Ubemr Xbembar Utsir X tsimshianr UberrXberbiskrUnzirXnzimarUsairXsøramerikansk indiansk språkrUangrX gammelengelskrUprarX prakritspråkrUbhorXbhojpurirUsalrXsalishansk språkrUprorXgammelprovençalskrUrajrX rajasthanirUsadr Xsandawer!Uanpr"Xangikar#Ues_419r$Xlatinamerikansk spanskr%Urapr&Xrapanuir'Usasr(Xsasakr)Unqor*Xnkår+Ucarr,Xkaribiskr-Uminr.X minangkabaur/Umicr0Xmicmacr1Uefir2Xefikr3Uarnr4X araukanskr5Uypkr6X jupisk språkr7Umisr8X annet språkr9Ukacr:Xkachinr;Ukabr<Xkabylskr=Ukaar>X karakalpakiskr?Ukajr@XjjurAUkamrBXkambarCUkarrDXkarenskrEUkawrFXkawirGUfr_CHrHXsveitsisk franskrIUtyvrJXtuviniskrKUfr_CArLXcanadisk franskrMUkarNXgeorgiskrOUdoirPXdogrirQUkgrRXkikongorSUkkrTX kasakhiskrUUkjrVXkuanyamarWUkirXXkikuyurYUkorZXkoreanskr[Uknr\Xkannadar]Ukmr^Xkhmerr_Uklr`X grønlandskraUksrbXkasjmirircUkrrdXkanurireUkwrfXkorniskrgUkvrhXkomiriUkurjXkurdiskrkUkyrlX kirgisiskrmUtklrnXtokelauroUbuarpXburiatrqUmgarrX mellomirskrsUhitrtX hettittiskruUdyurvXdyularwUderxXtyskryUdarzXdanskr{Udzr|Xdzongkhar}Uluir~XluisenorUdvrXdivehirUhilrX hiligaynonrUhimrX himachalirUgemrXgermansk språkrUcrprXkreol- eller pidginspråkrUqurXquechuarUbasrXbasarUgbarXgbayarUbadrXbandarUbanrX balinesiskrUbalrXbaluchirUshnrXshanrUbairXbamilekisk språkrUarprXarapahorUartrXkunstig språkrUarwrXarawakrUarcrXarameiskrUen_USrXamerikansk engelskrUsemrXsemittisk språkrUselrX selkupiskrUnubrX nubisk språkrUbtkrXbatakrUlusrXlushairUmusrXcreekrUluarX luba-luluarUirorXirokansk språkrUirarXiranskrUmunrX mundaspråkrUlunrXlundarUluorXluorUwarXvallonskrUtuprX tupispråkrUjvrX javanesiskrUzblrX blissymbolerrUtutrXaltaisk språkrUtumrXtumbukarUjarXjapanskrUcoprXkoptiskrUilorXilokorUlarXlatinrUgwirXgwichinrUundrXukjent eller ugyldig språkrUtlirXtlingitrUtlhrXklingonrUchrXchamorrorUcorX korsikanskrUcarX katalanskrUcerX tsjetsjenskrUponrXponapiskrUcyrXwalisiskrUsahrXjakutskrUcsrX tsjekkiskrUcrrXcreerUbntrXbanturUcvrX tsjuvanskrUcurX kirkeslaviskrUlvrXlatviskrUdumrXmellomnederlandskrUptrX portugisiskrUduarXdualarUfrorX gammelfranskrUyaprXyapesiskrUfrmrX mellomfranskrUtivrXtivrUfrsrX østfrisiskrUfrrrX nordfrisiskrUyaorXyaorUparXpanjabirUxalrXkalmykr Ues_ESr Xiberisk spanskr Upir Xpalir Uen_GBrXbritisk engelskrUgayrXgayorUotorXotomisk språkrUotarXottomansk tyrkiskrUhmnrXhmongrUmyvrXerzyarUgaarXgarUfurrX friulianskrUkhirX khoisanspråkrUainr Xainur!Urarr"X rarotonganskr#Uslar$Xslavisk språkr%Uver&Xvendar'Uvir(X vietnamesiskr)Uisr*Xislandskr+Ukhor,X khotanesiskr-Uiur.X inuktitutr/Uitr0X italienskr1Uvor2Xvolapykr3Uiir4X sichuan-yir5Uikr6Xinupiakr7Uior8Xidor9Uiner:Xindoeuropeisk språkr;Uiar<X interlinguar=Ujprr>X jødepersiskr?Uier@X interlinguerAUidrBX indonesiskrCUigrDXiborEUpaprFX papiamentorGUeworHXewondorIUpaurJXpalauiskrKUpaarLXpapuisk språkrMUpagrNX pangasinanrOUsatrPXsantalirQUpalrRXpahlavirSUpamrTXpampangarUUsycrVXklassisk syriskrWUphirXXfilippinsk språkrYUcelrZXkeltisk språkr[Uphnr\X fønikiskr]Unicr^Xniger-kordofiansk språkr_Uniar`XniasraUdgrrbXdogribrcUsyrrdXsyriskreUniurfXniueanskrgUgswrhX sveitsertyskriUcchrjXatsamrkUjborlXlojbanrmUnahrnXnahuatlroUsamrpXsamaritansk arameiskrqUhairrXhaidarsUgmhrtXmellomhøytyskruUcusrvXkusjitisk språkrwUwenrxXsorbisk språkryUadyrzXadygher{Uelxr|X elamittiskr}Uadar~XadangmerUpt_PTrXiberisk portugisiskrUhawrXhawaiiskrUbinrXbinirUbikrXbikolrUpt_BRrXbrasiliansk portugisiskrUmosrXmossirUmohrXmohawkrUtlrXtagalogrUzh_HansrXforenklet kinesiskrUzh_HantrXtradisjonell kinesiskrUtvlrXtuvalurUijorXijorUkmbrXkimbundurUpeorX gammelpersiskrUumbrXumbundurUtmhrXtamasjekrUfonrXfonrUhsbrX høysorbiskrUberX hviterussiskrUbgrXbulgarskrUbarX basjkirskrUpsrXpashtorUbmrXbambararUbnrXbengalirUborX tibetanskrUbhrXbiharirUbirXbislamarUbrrXbretonskrUbsrXbosniskrUruprXaromanskrUzzarXzazarUomrXoromorUojrXojibwarUacerX achinesiskrUachrXacolirUocrX oksitanskrUkrurXkurukhrUsrrrXsererrUkrorXkrurUkrlrXkarelskrUkrcrXkarachay-balkarrUndsrXlavtyskrUosrXossetiskrUorrXoriyarUsogrXsogdiskrUnsorX nord-sothorUsonrXsonghairUde_CHrXsveitsisk høytyskrUvairXvairUwakrXwakasjansk språkrUlolrXmongorUmkhrXmon-khmerspråkrUawarXawadhirUlozrXlozirUgilrX kiribatiskrUwasrXwashorUwarrXwarayrUhzrXhererorUhyrXarmenskrUanrXaragonskrUsidrXsidamorUhrrXkroatiskrUhtrXhaitiskrUhurXungarskrUhirXhindirUhorX hiri moturUharXhausarUbugrX buginesiskrUherXhebraiskr Uuzr Xusbekiskr Uurr Xurdur UplrXpolskrUukrXukrainskrUugrXuiguriskrUaarXafarrUabrX abkhasiskrUaerXavestiskrUafrX afrikaansrUakrXakanrUamrXamhariskrUnl_BEr Xflamskr!Ueur"Xbaskiskr#Uasr$Xassamiskr%Uarr&Xarabiskr'Uinhr(X ingusjiskr)Utpir*X tok pisinr+Umynr,X mayaspråkr-Uayr.Xaymarar/Ukhar0Xkhasir1Uazr2Xaserbajdsjanskr3Uincr4X indisk språkr5Unlr6X nederlandskr7Unnr8X norsk nynorskr9Unor:Xnorskr;Unar<Xnaurur=Unbr>X norsk bokmålr?Unair@Xnordamerikansk indiansk språkrAUndrBX nord-ndebelerCUnerDXnepalskrEUngrFXndongarGUnyrHXnyanjarIUnaprJX napolitanskrKUgrbrLXgreborMUgrcrNX gammelgreskrOUnrrPX sør-ndebelerQUtigrRXtigrérSUnvrTXnavajorUUzunrVXzunirWUrwrXX kinjarwandarYUcperZX'engelskbasert kreol- eller pidginspråkr[Ucpfr\X&franskbasert kreol- eller pidginspråkr]Ucppr^X+portugisiskbasert kreol- eller pidginspråkr_uU territoriesr`}ra(UBDrbX BangladeshrcUBErdXBelgiareUBFrfX Burkina FasorgUBGrhXBulgariariUVErjX VenezuelarkUBArlXBosnia-HercegovinarmUBBrnXBarbadosroUWFrpXWallis og FutunarqUBLrrXSaint BarthélemyrsUBMrtXBermudaruUBNrvXBrunei DarussalamrwUBOrxXBoliviaryUBHrzXBahrainr{UBIr|XBurundir}UBJr~XBeninrUBTrXBhutanrU011rX Vest-AfrikarUBVrX BouvetøyarUBWrXBotswanarU014rX Øst-AfrikarU015rX Nord-AfrikarUBRrXBrasilrU017rXSentral-AfrikarU018rXSørlige AfrikarU019rXAmerikarUBYrX HviterusslandrUBZrXBelizerULVrXLatviarURWrXRwandarURSrXSerbiarUTLrX Øst-TimorrURErXReunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadsjikistanrUROrXRomaniarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX+Sør-Georgia og de sørlige Sandwich-øyenerUGRrXHellasrUGQrXEkvatorial-GuinearUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrX Fransk GuyanarUGErXGeorgiarUGDrXGrenadarU021rXNordlige AmerikarUGBrX StorbritanniarUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GrønlandrU029rXKaribiarUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunisiarUJMrXJamaicarU013rXSentral-AmerikarUWSrXSamoarU419rXLatin-Amerika og KaribiarUHRrXKroatiarUBSrXBahamasrUHTrXHaitirUHUrXUngarnrUHKrXHongkong S.A.R. KinarU039rX Sør-EuroparUHNrXHondurasrUFIrXFinlandrU142rXAsiarU030rX Øst-AsiarU034rX Sør-AsiarU035rX Sørøst-AsiarUPRrX Puerto RicorUPSrXPalestinsk territoriumrUFKrXFalklandsøyenerUIOrX!Britiske territorier i IndiahavetrUPWrXPalaur UPTr XPortugalr USJr XSvalbard og Jan Mayenr UMDrXMoldovarUFMrXMikronesiaføderasjonenrUIQrXIrakrUPArXPanamarUPFrXFransk PolynesiarUPGrXPapua Ny-GuinearUPErXPerurUPKrXPakistanrUPHrX FilippinenerUFOr X Færøyener!UPNr"XPitcairnr#UPLr$XPolenr%UPMr&XSt. Pierre og Miquelonr'UZMr(XZambiar)UEHr*X Vest-Saharar+URUr,XRusslandr-UEEr.XEstlandr/UEGr0XEgyptr1UZAr2X Sør-Afrikar3UECr4XEcuadorr5UITr6XItaliar7UVNr8XVietnamr9UZZr:Xukjent eller ugyldig områder;USBr<X Salomonøyener=UETr>XEtiopiar?USOr@XSomaliarAUZWrBXZimbabwerCUSArDX Saudi-ArabiarEUESrFXSpaniarGUERrHXEritrearIUMErJX MontenegrorKUAQrLX AntarktisrMUMGrNX MadagaskarrOUMFrPX Saint MartinrQUMArRXMarokkorSUMCrTXMonacorUUUZrVX UsbekistanrWUMMrXXMyanmarrYUMLrZXMalir[UMOr\XMacao S.A.R. Kinar]UMNr^XMongoliar_UHMr`XHeardøya og McDonaldøyeneraUASrbXAmerikansk SamoarcUMKrdX MakedoniareUMUrfX MauritiusrgUMTrhXMaltariUMWrjXMalawirkUMVrlX MaldivenermUMQrnX MartiniqueroUMPrpXNord-MarianenerqUMSrrX MontserratrsUMRrtX MauritaniaruUIMrvXManrwUUGrxXUgandaryUTZrzXTanzaniar{UMYr|XMalaysiar}UMXr~XMexicorUILrXIsraelrUFRrX FrankrikerUAWrXArubarUDOrXDen dominikanske republikkrUSHrX St. HelenarUVCrXSt. Vincent og GrenadinenerU054rX MelanesiarUDJrXDjiboutirUFJrXFijirU057rX MikronesiarU172rXSamveldet av uavhengige staterrU053rXAustralia og New ZealandrUNIrX NicaraguarUNLrX NederlandrUNOrXNorgerUNArXNamibiarUVUrXVanuaturUNCrX Ny-CaledoniarUNErXNigerrUNFrX NorfolkøyarUNGrXNigeriarUNZrX New ZealandrUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolynesiarUCIrXElfenbenskystenrUCHrXSveitsrUCOrXColombiarUCNrXKinarUCMrXKamerunrUCLrXChilerUCCrX KokosøyenerUCArXCanadarUCGrXKongo-BrazzavillerUCFrXDen sentralafrikanske republikkrUCDrXKongo-KinshasarUCZrXTsjekkiarUCYrXKyprosrUCXrX ChristmasøyarUCSrXSerbia og MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Kapp VerderUCUrXCubarUSZrX SwazilandrUSYrXSyriarUKGrX KirgisistanrUKErXKenyarUSRrXSurinamrU143rX Sentral-AsiarUKHrX KambodsjarUKNrXSt. Kitts og NevisrUKMrXKomorenerUSTrXSão Tomé og PrínciperUSKrXSlovakiarUKRrX Sør-KorearUSIrXSloveniarUKPrX Nord-KorearUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellenerUKZrX KasakhstanrUKYrX CaymanøyenerUSGrX SingaporerUSErXSverigerUSDrXSudanr U151r X Øst-Europar U150r XEuropar UDMrXDominicarU155rX Vest-EuroparU154rX Nord-EuroparUVGrXDe britiske jomfruøyenerUDErXTysklandrUYErXJemenrUMHrXMarshalløyenerU062rXSørsentral-AsiarUDZrXAlgerierUUSr XUSAr!UUYr"XUruguayr#UYTr$XMayotter%UUMr&XUSAs ytre småøyerr'ULBr(XLibanonr)ULCr*X St. Luciar+ULAr,XLaosr-UTVr.XTuvalur/UTWr0XTaiwanr1UTTr2XTrinidad og Tobagor3UTRr4XTyrkiar5ULKr6X Sri Lankar7ULIr8X Liechtensteinr9UCKr:X Cookøyener;UTOr<XTongar=ULTr>XLitauenr?ULUr@X LuxembourgrAULRrBXLiberiarCULSrDXLesothorEUTHrFXThailandrGUTFrHXDe franske sørterritorierrIUTGrJXTogorKUTDrLXTsjadrMUTCrNXTurks- og CaicosøyenerOULYrPXLibyarQUVArRX VatikanstatenrSU145rTX Vest-AsiarUUAErVXDe forente arabiske emiraterrWUADrXXAndorrarYUAGrZXAntigua og Barbudar[UAFr\X Afghanistanr]UAIr^XAnguillar_UVIr`XDe amerikanske jomfruøyeneraUISrbXIslandrcUIRrdXIranreUAMrfXArmeniargUALrhXAlbaniariUAOrjXAngolarkUANrlXDe nederlandske antillerrmU003rnX Nord-AmerikaroU002rpXAfrikarqU001rrXverdenrsUARrtX ArgentinaruUAUrvX AustraliarwUATrxX ØsterrikeryU005rzX Sør-Amerikar{UINr|XIndiar}UAXr~XÅlandrU009rXOseaniarUAZrX AserbajdsjanrUIErXIrlandrUIDrX IndonesiarUJOrXJordanrUQUrXDen europeiske unionrUUArXUkrainarUQArXQatarrUDKrXDanmarkrUMZrXMosambikrUQOrXavsidesliggende OceaniaruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9X d. MMM yyyyrhYX%(d)s. %(MMM)s %(yyyy)srubUfullrhU)r}r(h9XEEEE d. MMMM yyyyrhYX!%(EEEE)s %(d)s. %(MMMM)s %(yyyy)srubUlongrhU)r}r(h9X d. MMMM yyyyrhYX%(d)s. %(MMMM)s %(yyyy)srubUshortrhU)r}r(h9Xdd.MM.yyrhYX%(dd)s.%(MM)s.%(yy)srubuUcurrency_symbolsr}r(UITLrXITLrUUSDrXUSDrUBGLrXlevrUINRrXINRrUJPYrXJPYrUBRLrXBRLrUGBPrXGBPrUEURrXEURruU time_zonesr}r(UAtlantic/Canaryr}rUcityrX KanariøyenersU Europe/Zurichr}rjXZürichrsUAtlantic/Faeroer}rjX FærøyenersU Asia/Tashkentr}rjXTasjkentrsU America/Belemr}rjXBelémrsUPacific/Easterr}rjX PåskeøyarsU Europe/Romer}rjXRomarsUAfrica/Sao_Tomer}rjX São TomérsU Asia/Jayapurar}rjXJajapurarsUAtlantic/South_Georgiar}rjX Sør-GeorgiarsUAfrica/El_Aaiunr}rjX El AaiúnrsU Europe/Warsawr}rjXWarszawarsUAsia/Krasnoyarskr}rjX KrasnojarskrsU Asia/Damascusr}rjXDamaskusrsUIndian/Maldivesr}rjX MaldivenersUEurope/Copenhagenr}rjX KøbenhavnrsUAmerica/St_Luciar}rjX St. LuciarsUAmerica/Anchorager}rjXAlaskarsUEurope/Bucharestr}rjX BucurestirsUAmerica/Araguainar}rjX AraguaínarsU Asia/Tehranr}rjXTeheranr sU Europe/Tiraner }r jXTiranar sU Asia/Bishkekr }rjXBisjkekrsUIndian/Reunionr}rjXRéunionrsUAmerica/Maceior}rjXMaceiórsUPacific/Galapagosr}rjX GalápagosrsUEurope/Zaporozhyer}rjX ZaporozjersUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAmerica/Bogotar}r jXBogotár!sUAtlantic/Cape_Verder"}r#jX Kapp Verder$sU Africa/Cairor%}r&jXKairor'sU Europe/Moscowr(}r)jXMoskvar*sUAmerica/El_Salvadorr+}r,jXSalvadorr-sU Indian/Cocosr.}r/jX Kokosøyener0sUAmerica/North_Dakota/Centerr1}r2jXCenter, Nord-Dakotar3sUAmerica/St_Vincentr4}r5jX St. Vincentr6sU Asia/Dushanber7}r8jXDusjanber9sU Asia/Yerevanr:}r;jXJerevanr<sUAsia/Yekaterinburgr=}r>jX Jekaterinburgr?sU Asia/Ashgabatr@}rAjX AsjkhabadrBsUAmerica/CuiabarC}rDjXCuiabárEsUAsia/UlaanbaatarrF}rGjX Ulan BatorrHsUAmerica/AsuncionrI}rJjX AsunciónrKsU Asia/BaghdadrL}rMjXBagdadrNsUAtlantic/St_HelenarO}rPjX St. HelenarQsUIndian/ChristmasrR}rSjX ChristmasøyarTsU Europe/ViennarU}rVjXWienrWsUAfrica/Addis_AbabarX}rYjX Addis AbebarZsUAfrica/Algiersr[}r\jXAlgerr]sUAmerica/St_Thomasr^}r_jX St. Thomasr`sUAmerica/Caymanra}rbjX CaymanøyenercsUEurope/Brusselsrd}rejXBrusselrfsU Europe/Athensrg}rhjXAthenrisU Europe/Lisbonrj}rkjXLisboarlsUAmerica/Curacaorm}rnjXCuraçaorosUAfrica/Porto-Novorp}rqjX Porto NovorrsU Asia/Yakutskrs}rtjXJakutskrusUAfrica/Dar_es_Salaamrv}rwjX Dar-es-SalaamrxsUAtlantic/Azoresry}rzjXAzorener{sUEurope/Luxembourgr|}r}jX Luxemburgr~sU Etc/Unknownr}rjXUkjentrsUAmerica/Mexico_Cityr}rjX Mexico byrsU Indian/Comoror}rjXKomorenersUEurope/Uzhgorodr}rjXUzjhorodrsUPacific/Ponaper}rjXPohnpeirsUAmerica/St_Kittsr}rjX St. KittsrsUAmerica/Godthabr}rjXGodthåbrsU Asia/Thimphur}rjXThimpursU Africa/Asmerar}rjXAsmararsUAntarctica/South_Poler}rjXSydpolenrsUAmerica/Sao_Paulor}rjX São PaulorsuUscriptsr}r(UZsymrXsymbolerrUGururXgurmukhirUHebrrXhebraiskrUZzzzrXukjent eller ugyldig skriftrUPhnxrX fønikiskrUMoonrXmoonrUSamrrX samaritanskrUChamrXchamrUArabrXarabiskrUGujrrXgujaratirUZxxxrXspråk uten skriftrULycirXlykiskrUSinhrXsinhalarUTalurX ny tai luerUMongrXmongolskrUXpeorX gammelpersiskrUVisprX synlig talerURjngrXrejangrUOlckrXol-chikirUTalerXtai lerUMandrXmandaiskrUManirX manikeiskrUMlymrX malayalamrUTibtrX tibetanskrUKalirXkayah lirUJpanrXjapanskrUPlrdrXpollard-fonetiskrUKanarXkatakanarULydirXlydiskrULepcrXlepcharUSundrX sundanesiskrUYiiirXyirUJavarX javanesiskrUOryarXoriyarULaoorXlaotiskrUUgarrX ugaritiskrUCyrlrX kyrilliskrUVaiirXvairUArmnrXarmenskrUCyrsrXkirkeslavisk kyrilliskrUKhmrrXkhmerrUArmirXarameiskrUSylorX syloti nagrirUItalrX gammelitaliskrUSgnwrX tegnskriftrUXsuxrXsumersk-akkadisk kileskriftrUThaarXthaanarUThairXthairUCprtrX kypriotiskrULinbrX lineær BrULinarX lineær ArUOsmarXosmanyar USaurr X saurashtrar UHirar Xhiraganar UHanirXhanrUEgydrXegyptisk demotiskrUQaairXnedarvetrUEgyhrXegyptisk hieratiskrUCansrX#felles kanadiske urspråksstavelserrUEgyprXegyptiske hieroglyferrUZmthrXmatematisk notasjonrUTfngrXtifinaghrUShawrXshaviskrUCirtr Xcirthr!UGeorr"Xgeorgiskr#UTengr$Xtengwarr%UHrktr&Xkatakana eller hiraganar'UGeokr(Xgeorgisk khutsurir)UTavtr*Xtai vietr+UOgamr,Xoghamr-UDsrtr.Xdeseretr/UGothr0Xgotiskr1UHanor2Xhanunoor3UBalir4X balinesiskr5UKorer6Xkoreanskr7UHangr8Xhangulr9UCarir:Xkariskr;UAvstr<Xavestiskr=UTagbr>Xtagbanwar?UHansr@X forenklet hanrAUHantrBXtradisjonell hanrCURororDX rongorongorEUDevarFX devanagarirGUIndsrHXindusrIUBoporJXbopomoforKUMymrrLXmyanmarrMUTglgrNXtagalogrOUPermrPX gammelpermiskrQUBugirRX buginesiskrSUPhagrTXphags-parUUBrairVXbraillerWUBrahrXXbrahmirYUBatkrZXbatakr[UMeror\X meroitiskr]ULimbr^Xlimbur_UMteir`X meitei-mayekraUTelurbXtelugurcUTamlrdXtamilreUSararfXsaratirgULatgrhXgælisk latinskriULatfrjXfrakturlatinskrkUKharrlX kharoshthirmUNkoornXn'koroUPhlvrpXpahlavirqULatnrrXlatinskrsUMayartXmaya-hieroglyferruULanarvXlannarwUEthirxXetiopiskryUKthirzXkaithiskr{UHmngr|X pahawh hmongr}UBuhdr~XbuhidrUCoptrXkoptiskrUGlagrX glagolittiskrURunrrXrunerrUOrkhrXorkhonrUCakmrXchakmarUHungrX gammelungarskrUGrekrXgreskrUCherrXcherokeerUZyyyrXfellesrUSyrcrXsyriskrUBlisrX blissymbolrUBengrXbengalskrUSyrerXestrangelosyriakiskrUSyrjrXvestlig syriakiskrUSyrnrXøstlig syriakiskrUKndarXkannadaruUvariantsr}r(UVALENCIArXvalensisk dialektrUREVISEDrXrevidert rettskrivingrUAREVMDArX vest-armenskrUFONIPArX*det internasjonale fonetiske alfabet (IPA)rU1996rXtysk ortografi fra 1996rUBOONTrX boontlingrUSCOTLANDrXskotsk standard engelskrUSCOUSErXscouse dialektrUAREVELArX øst-armenskrUMONOTONrXmonotonisk rettskrivingrUROZAJrXresisk dialektrUFONUPArX$det uraliske fonetiske alfabet (UPA)rUPOLYTONrXpolytonisk rettskrivingrUSAAHOrX saaho dialektrU1901rXtradisjonell tysk ortografiruUnumber_symbolsr}r(UgrouprX rUnativeZeroDigitrX0rU exponentialrXErUperMillerX‰rUnanrXNaNrUdecimalrX,rU percentSignrX%rUlistrX;rU patternDigitrX#rUplusSignrX+rUinfinityrX∞rU minusSignrh X palladiumr? UUGSr@ Xugandiske shilling (1966-1987)rA UMROrB Xmauritanske ouguiyarC UBOVrD Xbolivianske mvdolrE UHRKrF Xkroatiske kunarG UDJFrH Xdjiboutiske francrI UHRDrJ Xkroatiske dinarerrK UPESrL Xperuvianske solrM UEQErN XekwelerO jXitalienske lirerP UXAFrQ XCFA franc BEACrR UBNDrS Xbruneiske dollarrT UISKrU Xislandske kronerrV UZALrW X!sørafrikanske rand (finansielle)rX USRDrY Xsurinamske dollarrZ UNIOr[ Xnicaraguanske cordoba oror\ ULAKr] X laotiske kipr^ UNICr_ Xnicaraguanske cordobar` UNPRra Xnepalske rupierrb UMZErc Xmosambikiske escudord UUYUre Xuruguayanske peso uruguayorf ULUCrg Xluxemburgske konvertible francrh UJMDri Xjamaikanske dollarrj UFRFrk X franske francrl UMAFrm Xmarokkanske francrn UMZMro Xgamle mosambikiske meticalrp UMZNrq Xmosambikiske meticalrr UPHPrs Xfilippinske pesosrt UZARru Xsørafrikanske randrv URHDrw Xrhodesiske dollarrx UGWPry XGuinea-Bissau-pesosrz ULUFr{ Xluxemburgske francr| UBELr} Xbelgiske franc (finansielle)r~ UBECr Xbelgiske franc (konvertible)r UNGNr Xnigerianske nairar UYUNr X jugoslaviske konvertible dinarerr UBEFr Xbelgiske francr UPLZr Xpolske zloty (1950-1995)r UCRCr Xcostaricanske colonr UTRLr X tyrkiske lirer UDEMr X tyske markr UEEKr X estiske kroonr UMWKr Xmalawiske kwachar UTTDr Xtrinidadiske dollarr ULKRr Xsrilankiske rupierr USKKr Xslovakiske korunar UCVEr Xkappverdiske escudor UPKRr Xpakistanske rupierr UHUFr Xungarske forinterr UROLr Xgamle rumenske leur UXEUr Xeuropeisk valutaenhetr UBMDr Xbermudiske dollarr UOMRr Xomanske rialerr ULSLr Xlesothiske lotir ULSMr Xmalotir UMNTr Xmongolske tugrikr UAMDr X armenske dramr UYUDr Xjugoslaviske dinarer (hard)r UBUKr Xburmesiske kyatr USYPr X syriske pundr UQARr Xqatarske rialerr UXDRr Xspesielle trekkrettigheterr UNLGr Xnederlandske gyldenr UGEKr Xgeorgiske kupon laritr UMTPr Xmaltesiske pundr jXbritiske pund sterlingr UGELr Xgeorgiske larir USHPr Xsankthelenske pundr UAFNr Xafghanir USBDr Xsalomonske dollarr UCSKr Xtsjekkoslovakiske koruna (hard)r UKPWr Xnordkoreanske wonr UXREr X RINET-fondr UCSDr Xgamle serbiske dinarerr UAFAr Xafghani (1927-2002)r UTHBr Xthailandske bahtr UBYBr X$hviterussiske nye rubler (1994-1999)r UBDTr Xbangladeshiske takar UGRDr Xgreske drakmerr UYERr Xjemenittiske rialerr UDDMr Xøsttyske ostmarkr USZLr Xswazilandske lilangenir UHTGr Xhaitiske gourder UTRYr Xny tyrkisk lirer UMGAr Xmadagassiske ariaryr UANGr Xnederlandske antillegyldenr ULRDr Xliberiske dollarr URWFr Xrwandiske francr UNOKr X norske kronerr UMXVr X%meksikanske unidad de inversion (UDI)r UKESr Xkenyanske shillingr UMOPr Xmakaoske patacar jXindiske rupierr UMXNr Xmeksikanske pesosr UCZKr Xtsjekkiske korunar UTJSr Xtadsjikiske somonir UTJRr Xtadsjikiske rublerr UBTNr Xbhutanske ngultrumr UYDDr Xjemenittiske dinarerr UGWEr Xportugisiske guinea escudor UCOPr Xcolombianske pesosr UCOUr Xunidad de valor realr UMTLr Xmaltesiske lirar UMURr Xmauritiske rupierr UIDRr Xindonesiske rupierr UHNLr XHoduras Lempirar UXPFr X CFP francr UFJDr Xfijianske dollarr UETBr Xetiopiske birrr UPENr Xperuvianske nye solr UBZDr Xbeliziske dollarr UCHWr X WIR francr UATSr Xøsterrikske shillingr UILPr Xisraelske pundr UZRNr Xzairiske nye zairer UDOPr! Xdominikanske pesosr" ULULr# Xluxemburgske finansielle francr$ UTMMr% Xturkmenske manatr& UTWDr' Xtaiwanske nye dollarr( UMDLr) X moldovske leur* UXPTr+ Xplatinar, UECVr- X-ecuadorianske unidad de valor constante (UVC)r. UECSr/ Xecuadorianske sucrer0 UBSDr1 Xbahamske dollarr2 USEKr3 Xsvenske kronerr4 UTOPr5 Xtonganske paʻangar6 UPEIr7 Xperuvianske intir8 UZMKr9 Xzambiske kwachar: UMVRr; Xmaldiviske rufiyaar< UAUDr= Xaustralske dollarr> UADPr? Xandorranske pesetasr@ UCUPrA Xkubanske pesosrB UIEPrC X irske pundrD UCLFrE Xchilenske unidades de fomentorF UBBDrG Xbarbadiske dollarrH UKRWrI Xsørkoreanske wonrJ UGMDrK Xgambiske dalasirL UVEFrM Xvenezuelanske bolivar fuerterN UGTQrO Xguatemalanske quetzalrP UVEBrQ Xvenezuelanske bolivarrR UXOFrS XCFA franc BCEAOrT USITrU Xslovenske tolarrV USDPrW Xsudanesiske pundrX UCLPrY Xchilenske pesosrZ jXeuror[ UCDFr\ Xkongolesiske franc (congolais)r] UXCDr^ Xøstkaribiske dollarr_ UKZTr` Xkasakhstanske tengera URUBrb Xrussiske rublerrc UXFUrd Xfranske UIC-francre UXAGrf Xsølvrg UBRRrh Xbrasilianske cruzeirori UBRNrj Xbrasilianske cruzado novork jXbrasilianske realerrl UMMKrm Xmyanmarske kyatrn UUYPro Xuruguayanske pesos (1975-1993)rp URURrq Xrussiske rubler (1991-1998)rr UPLNrs X polske zlotyrt UBREru X!brasilianske cruzeiro (1990-1993)rv UPYGrw Xparaguayanske guaranirx UBRCry Xbrasilianske cruzadorz UBRBr{ X&brasilianske cruzeiro novo (1967-1986)r| USVCr} Xsalvadoranske colonr~ UAEDr X UAE dirhamr UGNSr Xguineanske sylir UMKDr Xmakedonske denarerr UAZMr X!aserbajdsjanske manat (1993-2006)r UAZNr Xaserbajdsjanske manatr UUSNr Xamerikanske dollar (neste dag)r UGQEr X$ekvatorialguineanske ekwele guineanar UVUVr Xvanuatiske vatur UBADr Xbosnisk-hercegovinske dinarerr UGNFr Xguineanske francr UMXPr X"meksikanske sølvpesos (1861-1992)r UIQDr Xirakske dinarerr UERNr Xeritreiske nakfar UBAMr X(bosnisk-hercegovinske mark (konvertible)r USCRr Xseychelliske rupierr UCADr Xkanadiske dollarr USDDr Xsudanesiske dinarerr UCYPr Xkypriotiske pundr UMADr Xmarokkanske dirhamr UKWDr Xkuwaitiske dinarerr UBIFr Xburundiske francr ULTTr Xlitauiske talonasr UPGKr Xpapuanske kinar ULTLr Xlitauiske litar USGDr Xsingaporske dollarr UUZSr X usbekiske sumr USTDr XSao Tome og Principe-dobrar UXFOr Xfranske gullfrancr UMLFr X maliske francr UESPr Xspanske pesetar UIRRr Xiranske rialerr UZRZr Xzairiske zairer UCNYr Xkinesiske yuan renminbir USLLr Xsierraleonske leoner UTNDr Xtunisiske dinarerr UGYDr Xguyanske dollarr UESBr X"spanske peseta (konvertibel konto)r UESAr Xspanske peseta (A-konto)r UNZDr Xnew zealandske dollarr UFKPr X Falkland-pundr ULVLr X latviske latsr UUSSr Xamerikanske dollar (samme dag)r jXamerikanske dollarr UARPr Xargentinske pesos (1983-1985)r UKGSr Xkirgisiske somr UARSr Xargentinske pesosr UILSr Xisraelske nye sheklerr URONr X rumenske leur URSDr Xserbiske dinarerr UBHDr Xbahrainske dinarerr jX japanske yenr UARAr Xargentinske australerr USDGr X sudanske pundr UPTEr Xportugisiske escudor UXAUr Xgullr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXJr KXFr KXMr KXAr Kj Kj Kj Kj K XSr K XOr K XNr K XDr usUformatr }r (Uwider }r (KXjanuarr KXfebruarr KXmarsr KXaprilr KXmair KXjunir KXjulir KXaugustr K X septemberr K Xoktoberr K Xnovemberr K Xdesemberr uU abbreviatedr }r (KXjan.r KXfeb.r KXmarsr KXapr.r KXmair KXjunir KXjulir KXaug.r K Xsep.r K Xokt.r K Xnov.r K Xdes.r uuuUcurrency_formatsr }r Nh,)r }r (h/Nh1Kh2KKr h4h5h5r h7KKr h9X ¤ #,##0.00r h;X¤ r X-¤ r r! h>Nh?KKr" ubsUdaysr# }r$ (U stand-aloner% }r& Unarrowr' }r( (Kj KXTr) Kj Kj) Kj KXLr* Kj usUformatr+ }r, (Uwider- }r. (KXmandagr/ KXtirsdagr0 KXonsdagr1 KXtorsdagr2 KXfredagr3 KXlørdagr4 KXsøndagr5 uU abbreviatedr6 }r7 (KXman.r8 KXtir.r9 KXons.r: KXtor.r; KXfre.r< KXlør.r= KXsøn.r> uuuU meta_zonesr? }r@ (U IndochinarA }rB (UcommonrC UlongrD }rE UstandardrF Xindokinesisk tidrG suUEurope_EasternrH }rI (jC jD }rJ (UdaylightrK Xøsteuropeisk sommertidrL jF Xøsteuropeisk normaltidrM uuUAustralia_CentralWesternrN }rO (jC jD }rP (UgenericrQ Xvest-sentralaustralsk tidrR jK Xvest-sentralaustralsk sommertidrS jF X!vest-sentralaustralsk standardtidrT uuU New_ZealandrU }rV (jC jD }rW (jQ Xnewzealandsk tidrX jK Xnewzealandsk sommertidrY jF Xnewzealandsk standardtidrZ uuUArabianr[ }r\ (Ushortr] }r^ (jQ X AT (arabisk)r_ jK X ADT (arabisk)r` jF X AST (arabisk)ra ujC jD }rb (jQ X arabisk tidrc jK Xarabisk sommertidrd jF Xarabisk standardtidre uuUAustralia_Easternrf }rg (jC jD }rh (jQ Xøstaustralsk tidri jK Xøstaustralsk sommertidrj jF Xøstaustralsk standardtidrk uuUAcrerl }rm (jC jD }rn jK XAcre sommertidro suUIndonesia_Centralrp }rq (jC jD }rr jF Xsentralindonesisk tidrs suUIsraelrt }ru (j] }rv jF X IST (Israel)rw sjC jD }rx (jK Xisraelsk sommertidry jF Xisraelsk standardtidrz uuU Hong_Kongr{ }r| (jC jD }r} (jK XHong Kong-sommertidr~ jF X Hong Kong-tidr uuUKorear }r (jC jD }r jF Xkoreansk standardtidr suUEurope_Centralr }r (jC jD }r (jK Xsentraleuropeisk sommertidr jF Xsentraleuropeisk normaltidr uuUIndonesia_Easternr }r (jC jD }r jF Xøstindonesisk tidr suUAustralia_Centralr }r (jC jD }r (jQ Xsentralaustralsk tidr jK Xsentralaustralsk sommertidr jF Xsentralaustralsk standardtidr uuUAmazonr }r (jC jD }r jK XAmazonas sommertidr suUChinar }r (j] }r jF X CST (Kina)r sjC jD }r jF Xkinesisk standardtidr suUBrasiliar }r (jC jD }r jK XBrasilia sommertidr suUEurope_Westernr }r (jC jD }r (jK Xvesteuropeisk sommertidr jF Xvesteuropeisk tidr uuUAfrica_Easternr }r (jC jD }r jF Xøstafrikansk tidr suUAfrica_Southernr }r (jC jD }r jF Xsørafrikansk normaltidr suUAfrica_Westernr }r (jC jD }r (jK Xvestafrikansk sommertidr jF Xvestafrikansk tidr uuUIndonesia_Westernr }r (jC jD }r jF Xvestindonesisk tidr suUGMTr }r (jC jD }r jF XGreenwich middeltidr suUIndiar }r (jC jD }r jF Xindisk standardtidr suUAfrica_Centralr }r (jC jD }r jF Xsentralafrikansk tidr suUJapanr }r (jC jD }r jF Xjapansk standardtidr suUAustralia_Westernr }r (jC jD }r (jQ Xvestaustralsk tidr jK Xvestaustralsk sommertidr jF Xvestaustralsk standardtidr uuUMoscowr }r (jC jD }r (jK XMoskva sommertidr jF XMoskva normaltidr uuuUerasr }r (Uwider }r (KXf.Kr.r KXe.Kr.r uU abbreviatedr }r (KXf.Kr.r KXe.Kr.r uuu.PK[6.site-packages/babel/localedata/aa_ER_SAAHO.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}qUcurrency_symbolsq}qU time_zonesq}q Uscriptsq!}q"Uvariantsq#}q$Unumber_symbolsq%}q&Ucurrency_namesq'}q(Umonthsq)}q*Ucurrency_formatsq+}q,Udaysq-}q.Uformatq/}q0(Uwideq1}q2(KXSaniq3KXSalusq4KXRabuqq5KXCamusq6KXJumqataq7KX Qunxa Sambatq8KX Naba Sambatq9uU abbreviatedq:}q;(KXSanqKXCamq?KXJumq@KXQunqAKXNabqBuusU meta_zonesqC}qDUerasqE}qFu.PK[1ll(site-packages/babel/localedata/se_NO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[D))-site-packages/babel/localedata/sr_Latn_YU.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[VL2%site-packages/babel/localedata/om.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXWDqUpmqXWBquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UguqAXAfaan GujaratiqBUgdqCX Scots GaelicqDUgaqEXAfaan AyirishiiqFUgnqGX Afaan GuaraniqHUglqIXAfaan GalishiiqJUlaqKX Afaan LaatiniqLUtrqMX Afaan TurkiiqNUlvqOXAfaan LativiyaaqPUltqQXAfaan LiituniyaaqRUtkqSX Lammii TurkiiqTUthqUX Afaan TayiiqVUtiqWX Afaan TigireeqXUteqYX Afaan TeluguqZUpt_PTq[XAfaan Protugueseq\Ufilq]XAfaan Filippiniiq^Utaq_X Afaan Tamiliiq`Upt_BRqaXAfaan Portugali (Braazil)qbUdeqcXAfaan JarmaniiqdUdaqeXAfaan DeenmaarkqfUelqgX Afaan GiriikiqhUeoqiXAfaan EsperantooqjUenqkXIngliffaqlUzhqmXChineseqnUeuqoX Afaan BaskuuqpUetqqXAfaan IstooniyaqrUesqsX Afaan IspeenqtUruquXAfaan RushiyaaqvUroqwXAfaan RomaniyaaqxUbnqyXAfaan BaangladeshiqzUbeq{XAfaan Belarusiaq|Ubgq}XAfaan Bulgariyaq~UmsqX MalaayiffaaqUjvqX Afaan JavaqUbhqX Afaan BihariqUbsqXAfaan BosniyaaqUjaqX Afaan JapaniiqUomqXOromooqUocqX Afaan OccitqUtlhqXAfaan KilingonqUxhqX Afaan XhosaqUcaqX Afaan KatalaaqUcyqX WelishiffaaqUcsqX Afaan CzechqUptqXAfaan PorchugaalqUpaqXAfaan PunjabiiqUplqXAfaan PolandiiqUhrqXAfaan CroatianqUhuqXAfaan HangaariqUhiqX Afaan HindiiqUheqX Afaan HebrewqUuzqX Afaan UzbekqUmlqXMalayaalamiffaaqUmkqXAfaan MacedooniyaaqUurqX Afaan UrduqUmtqXAfaan MaltesiiqUukqXAfaan UkreeniiqUmrqX Afaan MaratiiqUafqX AfrikootaqUviqXAfaan VeetinamqUisqXAyiislandiffaaqUamqXAfaan SidaamaaqUitqXAfaan XaaliyaaniqUknqX Afaan KannadaqUarqX ArabiffaaqUzuqX Afaan ZuuluqUiaqX InterlinguaqUazqXAfaan AzerbaijaniqUidqXAfaan IndoneziyaqUnlqX Afaan DachiiqUnnqXAfaan NorwegianqUnoqXAfaan NorweyiiqUneqX Afaan NepaliiqUfrqXAfaan FaransaayiiqUfyqXAfaan FirisiyaaniqUfaqX Afaan PersiaqUfiqXAfaan FiilaandiqUfoqX Afaan FaroeseqUkaqXAfaan GeorgianqUsrqX Afaan SerbiyaqUsqqXAfaan AlbaniyaaqUkoqX Afaan KoreaqUsvqXAfaan SuwidiinqUsuqXAfaan SudaaniiqUskqX Afaan SlovakqUsiqXAfaan SinhaleseqUslqXAfaan IslovaniyaaqUswqX SuwahiliiquU territoriesq}q(URUqXRussiaqUFRqXFranceqUCNqXChinaqUKEqXKeeniyaaqUDEqXGermanyqUJPqXJapanqUITqXItalyqUUSqX United StatesrUGBrXUnited KingdomrUBRrXBrazilrUINrXIndiarUETrX ItoophiyaaruUdecimal_formatsr }r U date_formatsr }r (Umediumr h))r}r(h,X dd-MMM-yyyyrh.X%(dd)s-%(MMM)s-%(yyyy)srubUfullrh))r}r(h,XEEEE, MMMM d, yyyyrh.X"%(EEEE)s, %(MMMM)s %(d)s, %(yyyy)srubUlongrh))r}r(h,X dd MMMM yyyyrh.X%(dd)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,Xdd/MM/yyrh.X%(dd)s/%(MM)s/%(yy)sr ubuUcurrency_symbolsr!}r"(UETBr#X$r$UKESr%XKshr&uU time_zonesr'}r(Uscriptsr)}r*ULatnr+XLatinr,sUvariantsr-}r.Unumber_symbolsr/}r0Ucurrency_namesr1}r2(UJPYr3X Japanese Yenr4UUSDr5X US Dollarr6URUBr7X Russian Rubler8UINRr9X Indian Rupeer:UCNYr;XChinese Yuan Renminbir<j#XItoophiyaa Birriir=UBRLr>XBrazilian Realr?UGBPr@XBritish Pound SterlingrAUEURrBXEurorCuUmonthsrD}rE(U stand-alonerF}rGUnarrowrH}rI(KXJrJKXFrKKXMrLKXArMKjLKjJKjJKjMK XSrNK XOrOK XNrPK XDrQusUformatrR}rS(UwiderT}rU(KXAmajjiirVKX GuraandhalarWKX BitooteessarXKXElbarYKXCaamsarZKX Waxabajjiir[KX Adooleessar\KXHagayyar]K XFuulbanar^K X Onkololeessar_K XSadaasar`K XMuddeerauU abbreviatedrb}rc(KXAmardKXGurreKXBitrfKXElbrgKXCamrhKXWaxriKXAdorjKXHagrkK XFulrlK XOnkrmK XSadrnK XMudrouuuUcurrency_formatsrp}rqNcbabel.numbers NumberPattern rr)rs}rt(Uexp_precruNUscalervKU frac_precrwKKrxUsuffixryXrzjzr{Uint_precr|KKr}h,X ¤#,##0.00r~UprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjLKXTrKXWrKjKjKKjNKjNusUformatr}r(Uwider}r(KXWiixatarKXQibxatarKXRoobiirKXKamiisarKXJimaatarKXSanbatarKXDilbataruU abbreviatedr}r(KXWixrKXQibrKXRobrKXKamrKXJimrKXSanrKXDilruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXKDrKXKBrusu.PK[_.ll(site-packages/babel/localedata/tg_TJ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/ig_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[]zW*site-packages/babel/localedata/uz_Latn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}q(UruqXruschaqUfrqX fransuzchaqUenqX inglizchaqUzhqXxitoychaqUptqX portugalchaq Uuzq!X o'zbekchaq"Udeq#Xolmonchaq$Uitq%X italyanchaq&Uhiq'Xhindchaq(Uarq)Xarabchaq*Ujaq+Xyaponchaq,Uesq-Xispanchaq.uU territoriesq/}q0(URUq1XRossiyaq2UFRq3XFransiyaq4UCNq5XXitoyq6UAFq7X Afgʿonistonq8UDEq9XOlmoniyaq:UJPq;XYaponiyaqUUSq?XQo'shma Shtatlarq@UUZqAX OʿzbekistonqBUGBqCXBirlashgan QirollikqDUBRqEX BraziliyaqFUINqGX HindistonqHuUdecimal_formatsqI}qJU date_formatsqK}qLUcurrency_symbolsqM}qNU time_zonesqO}qPUscriptsqQ}qR(ULatnqSXLotinqTUCyrlqUXKirilqVuUvariantsqW}qXUnumber_symbolsqY}qZUcurrency_namesq[}q\(UUSDq]X AQSH dollariq^URUBq_X Rus rubliq`UINRqaX Hind rupiyasiqbUCNYqcX Xitoy yuaniqdUJPYqeX Yapon yenasiqfUBRLqgX Brazil realiqhUGBPqiXIngliz funt sterlingiqjUUZSqkXOʿzbekiston soʿmqlUEURqmXEvroqnuUmonthsqo}qp(U stand-aloneqq}qr(Uwideqs}qtKXYanvarqusUnarrowqv}qw(KXYqxKXFqyKXMqzKXAq{KhzKXIq|Kh|Kh{K XSq}K XOq~K XNqK XDquuUformatq}q(Uwideq}q(KXMuharramqKXSafarqKX Rabiul-avvalqKX Rabiul-oxirqKX Jumodiul-uloqKX Jumodiul-uxroqKXRajabqKXShaʿbonqK XRamazonqK XShavvolqK X Zil-qaʿdaqK X Zil-hijjaquU abbreviatedq}q(KXYanvqKXFevqKXMarqKXAprqKXMayqKXIyunqKXIyulqKXAvgqK XSenqK XOktqK XNoyaqK XDekquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKh}KXCqKXPqKXJqKh}KhxusUformatq}q(Uwideq}q(KXdushanbaqKXseshanbaqKX chorshanbaqKX payshanbaqKXjumaqKXshanbaqKX yakshanbaquU abbreviatedq}q(KXDushqKXSeshqKXChorqKXPayqKXJumqKXShanqKXYakshquuuU meta_zonesq}qUerasq}qu.PK[7Eо%site-packages/babel/localedata/ti.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXንጉሆ ሰዓተqUpmqXድሕር ሰዓትquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UguqAXጉጃራቲኛqBUgdqCXእስኮትስ ጌልክኛqDUgaqEX አይሪሽqFUgnqGX ጓራኒqHUglqIX ጋለቪኛqJUlaqKX ላቲንኛqLUtwqMXትዊqNUtrqOX ቱርከኛqPUlvqQXላቲቪያንqRUltqSXሊቱአኒየንqTUtkqUX,ናይ ቱርኪ ሰብዓይ (ቱርካዊ)qVUthqWX ታይኛqXUtiqYX ትግርኛqZUteq[X ተሉጉኛq\Upt_PTq]X+ፖርቱጋልኛ (ናይ ፖርቱጋል)q^Ufilq_Xታጋሎገኛq`UtaqaX ታሚልኛqbUyiqcX ዪዲሽqdUpt_BRqeX(ፖርቱጋልኛ (ናይ ብራዚል)qfUdeqgX ጀርመንqhUdaqiX ዴኒሽqjUelqkX ግሪከኛqlUeoqmXኤስፐራንቶqnUenqoXእንግሊዝኛqpUeuqqX ባስክኛqrUetqsXኤስቶኒአንqtUesquX ስፓኒሽqvUruqwX ራሽኛqxUroqyXሮማኒያንqzUbnq{Xበንጋሊኛq|Ubeq}Xቤላራሻኛq~UbgqXቡልጋሪኛqUukqXዩክረኒኛqUjvqX ጃቫንኛqUbhqX ቢሃሪqUbrqX ብሬቶንqUbsqXቦስኒያንqUjaqX ጃፓንኛqUocqXኦኪታንኛqUtlhqXክሊንግኦንኛqUorqX ኦሪያqUxhqX ዞሳኛqUcaqX ካታላንqUcyqX ወልሽqUcsqX ቼክኛqUpsqX ፓሽቶqUptqXፖርቱጋሊኛqUpaqXፑንጃቢኛqUviqXቪትናምኛqUplqX ፖሊሽqUhrqXክሮሽያንኛqUhuqXሀንጋሪኛqUhiqX ሕንደኛqUheqXዕብራስጥqUuzqXኡዝበክኛqUmlqXማላያላምኛqUmkqXማክዶኒኛqUurqX ኡርዱኛqUmtqXማልቲስኛqUmsqX ማላይኛqUmrqX ማራቲኛqUafqXአፍሪቃንሰኛqUkoqX ኮሪያኛqUisqXአይስላንደኛqUamqXአምሐረኛqUitqXጣሊያንኛqUknqX ካማደኛqUarqX ዓረበኛqUzuqX ዙሉኛqUiaqXኢንቴር ቋንቋqUazqXአዜርባይጃንኛqUidqXእንዶኑሲኛqUnlqXደችqUnnqX(ኖርዌይኛ (ናይ ኝኖርስክ)qUnoqXኖርዌጂያንqUneqX ኔፖሊኛqUfrqXፈረንሳይኛqUfyqX ፍሪሰኛqUfaqXፐርሲያኛqUfiqX ፊኒሽqUfoqX ፋሮኛqUkaqXጊዮርጊያኛqUsrqX ሰርቢኛqUsqqXአልቤኒኛqUswqXሰዋሂሊኛqUsvqXስዊድንኛqUsuqX ሱዳንኛqUstqX ሰሴቶqUskqXስሎቨክኛqUsiqXስንሃልኛqUshqXሰርቦ- ክሮዊታንqUkuqX ኩርድሽqUslqX ስቁቪኛqUkyqX ኪሩጋዚquU territoriesq}qUdecimal_formatsq}rU date_formatsr}r(Umediumrh))r}r(h,X dd-MMM-yyyyrh.X%(dd)s-%(MMM)s-%(yyyy)srubUfullrh))r }r (h,X#EEEE፣ dd MMMM መዓልቲ yyyy Gr h.X7%(EEEE)s፣ %(dd)s %(MMMM)s መዓልቲ %(yyyy)s %(G)sr ubUlongr h))r}r(h,X dd MMMM yyyyrh.X%(dd)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,Xdd/MM/yyrh.X%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}rU time_zonesr}rUscriptsr}r(ULatnrX ላቲንrUEthirX ፊደልr uUvariantsr!}r"Unumber_symbolsr#}r$Ucurrency_namesr%}r&(UJPYr'Xየጃፓን የንr(UUSDr)Xየአሜሪካን ዶላርr*URUBr+Xየራሻ ሩብልr,UINRr-Xየሕንድ ሩፒr.UCNYr/X&የቻይና ዩአን ረንሚንቢr0UETBr1Xየኢትዮጵያ ብርr2UBRLr3Xየብራዚል ሪልr4UGBPr5X2የእንግሊዝ ፓውንድ ስተርሊንግr6UEURr7X አውሮr8uUmonthsr9}r:(U stand-aloner;}r<Unarrowr=}r>(KXጃr?KXፌr@KXማrAKXኤrBKXሜrCKXጁrDKXጁrEKXኦrFK XሴrGK XኦrHK XኖrIK XዲrJusUformatrK}rL(UwiderM}rN(KXጃንዩወሪrOKXፌብሩወሪrPKX ማርችrQKX ኤፕረልrRKXሜይrSKXጁንrTKX ጁላይrUKX ኦገስትrVK XሴፕቴምበርrWK XኦክተውበርrXK XኖቬምበርrYK XዲሴምበርrZuU abbreviatedr[}r\(KX ጃንዩr]KX ፌብሩr^KX ማርችr_KX ኤፕረr`KXሜይraKXጁንrbKX ጁላይrcKX ኦገስrdK X ሴፕቴreK X ኦክተrfK X ኖቬምrgK X ዲሴምrhuuuUcurrency_formatsri}rjNcbabel.numbers NumberPattern rk)rl}rm(Uexp_precrnNUscaleroKU frac_precrpKKrqUsuffixrrXrsjsrtUint_precruKKrvh,X ¤#,##0.00rwUprefixrxX¤ryX-¤rzr{Uexp_plusr|NUgroupingr}KKr~ubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXሰrKXሠrKXረrKXኃrKXዓrKXቀrKXሰrusUformatr}r(Uwider}r(KX ሰኑይrKX ሠሉስrKX ረቡዕrKX ኃሙስrKX ዓርቢrKX ቀዳምrKX ሰንበትruU abbreviatedr}r(KX ሰኑይrKX ሠሉስrKX ረቡዕrKX ኃሙስrKX ዓርቢrKX ቀዳምrKX ሰንበruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXዓ/ዓrKXዓ/ምrusu.PK[y(site-packages/babel/localedata/en_GB.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vq hX%(HH)s:%(mm)s:%(ss)s %(v)sq!ubUlongq"h)q#}q$(hX HH:mm:ss zq%hX%(HH)s:%(mm)s:%(ss)s %(z)sq&ubUshortq'h)q(}q)(hXHH:mmq*hX %(HH)s:%(mm)sq+ubuU languagesq,}q-U territoriesq.}q/Udecimal_formatsq0}q1U date_formatsq2}q3(Umediumq4h)q5}q6(hX d MMM yyyyq7hX%(d)s %(MMM)s %(yyyy)sq8ubUfullq9h)q:}q;(hXEEEE, d MMMM yyyyqh)q?}q@(hX d MMMM yyyyqAhX%(d)s %(MMMM)s %(yyyy)sqBubUshortqCh)qD}qE(hX dd/MM/yyyyqFhX%(dd)s/%(MM)s/%(yyyy)sqGubuUcurrency_symbolsqH}qIU time_zonesqJ}qKUscriptsqL}qMUvariantsqN}qOUnumber_symbolsqP}qQUcurrency_namesqR}qSUmonthsqT}qUUcurrency_formatsqV}qWNcbabel.numbers NumberPattern qX)qY}qZ(Uexp_precq[NUscaleq\KU frac_precq]KKq^Usuffixq_Xq`h`qaUint_precqbKKqchX ¤#,##0.00qdUprefixqeX¤qfX-¤qgqhUexp_plusqiNUgroupingqjKKqkubsUdaysql}qmU meta_zonesqn}qo(UEurope_Centralqp}qqUcommonqrsUEurope_Easternqs}qthrsUEurope_Westernqu}qvhrsuUerasqw}qxu.PK[{==(site-packages/babel/localedata/te_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[ %site-packages/babel/localedata/or.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X h:mm:ss aqAUformatqBX%(h)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X h:mm:ss a vqGhBX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X h:mm:ss a zqLhBX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xh:mm aqQhBX%(h)s:%(mm)s %(a)sqRubuU languagesqS}qTUorqUXଓଡ଼ିଆqVsU territoriesqW}qXUINqYX ଭାରତqZsUdecimal_formatsq[}q\Nh )q]}q^(h#Nh$Kh%KKq_h'h/h/q`h*KKqah,X #,##,##0.###qbh.h/h0qch2Nh3KKqdubsU date_formatsqe}qf(Umediumqgh>)qh}qi(h,X dd-MM-yyyyqjhBX%(dd)s-%(MM)s-%(yyyy)sqkubUfullqlh>)qm}qn(h,XMMMM d,EEEE, yyyyqohBX!%(MMMM)s %(d)s,%(EEEE)s, %(yyyy)sqpubUlongqqh>)qr}qs(h,X MMMM d, yyyyqthBX%(MMMM)s %(d)s, %(yyyy)squubUshortqvh>)qw}qx(h,Xdd-MM-yyqyhBX%(dd)s-%(MM)s-%(yy)sqzubuUcurrency_symbolsq{}q|U time_zonesq}}q~Uscriptsq}qUvariantsq}qUnumber_symbolsq}q(UdecimalqX.qUgroupqX,qUnativeZeroDigitqX୦quUcurrency_namesq}qUINRqX ଟଙକାqsUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXଜାନୁଆରୀqKXଫେବ୍ରୁୟାରୀqKXମାର୍ଚ୍ଚqKXଅପ୍ରେଲqKXମେqKX ଜୁନqKXଜୁଲାଇqKXଅଗଷ୍ଟqK Xସେପ୍ଟେମ୍ବରqK Xଅକ୍ଟୋବରqK Xନଭେମ୍ବରqK Xଡିସେମ୍ବରquU abbreviatedq}q(KXଜାନୁଆରୀqKXଫେବ୍ରୁୟାରୀqKXମାର୍ଚ୍ଚqKXଅପ୍ରେଲqKXମେqKX ଜୁନqKXଜୁଲାଇqKXଅଗଷ୍ଟqK Xସେପ୍ଟେମ୍ବରqK Xଅକ୍ଟୋବରqK Xନଭେମ୍ବରqK Xଡିସେମ୍ବରquuuUcurrency_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X¤ #,##,##0.00qh.X¤ qX-¤ qȆqh2Nh3KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KXସୋମବାରqKXମଙ୍ଗଳବାରqKXବୁଧବାରqKXଗୁରୁବାରqKXଶୁକ୍ରବାରqKXଶନିବାରqKXରବିବାରquU abbreviatedq}q(KX ସୋମqKXମଙ୍ଗଳqKX ବୁଧqKX ଗୁରୁqKXଶୁକ୍ରqKX ଶନିqKX ରବିquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[M%site-packages/babel/localedata/pl.datnu[}q(U zone_formatsq}q(UregionqXCzas: %sqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}q(U abbreviatedq}q(KX1 kw.qKX2 kw.qKX3 kw.qKX4 kw.quUnarrowq}q(KX1qKX2qKX3qKX4quuUformatq}q(Uwideq}q(KX I kwartałq KX II kwartałq!KX III kwartałq"KX IV kwartałq#uU abbreviatedq$}q%(KXK1q&KXK2q'KXK3q(KXK4q)uuuUperiodsq*}q+(Uamq,XAMq-Upmq.XPMq/uUscientific_formatsq0}q1Ncbabel.numbers NumberPattern q2)q3}q4(Uexp_precq5KKq6Uscaleq7KU frac_precq8KKq9Usuffixq:Xq;h;qUpatternq?X#E0q@UprefixqAh;X-qBqCUexp_plusqDUgroupingqEMMqFubsUpercent_formatsqG}qHNh2)qI}qJ(h5Nh7Kdh8KKqKh:X%qLhLqMh=KKqNh?X#,##0%qOhAh;hBqPhDNhEKKqQubsU week_dataqR}qS(Umin_daysqTKU weekend_startqUKU first_dayqVKU weekend_endqWKuU time_formatsqX}qY(UmediumqZcbabel.dates DateTimePattern q[)q\}q](h?XHH:mm:ssq^Uformatq_X%(HH)s:%(mm)s:%(ss)sq`ubUfullqah[)qb}qc(h?X HH:mm:ss vqdh_X%(HH)s:%(mm)s:%(ss)s %(v)sqeubUlongqfh[)qg}qh(h?X HH:mm:ss zqih_X%(HH)s:%(mm)s:%(ss)s %(z)sqjubUshortqkh[)ql}qm(h?XHH:mmqnh_X %(HH)s:%(mm)sqoubuU languagesqp}qq(UgvqrXmanxqsUguqtX gudźarackiquUscnqvX sycylijskiqwUromqxX cygańskiqyUalgqzXjęzyki algonkinq{Ualeq|Xaleuckiq}Uscoq~XszkockiqUmniqX manipuryjskiqUgdqXszkocki gaelickiqUgaqX irlandzkiqUmnoqXmanoboqUosaqXosageqUgnqXguaraniqUaltqXpołudniowoałtajskiqUglqX galisyjskiqUmwrqXmarwariqUtyqX tahitańskiqUtwqXtwiqUttqXtatarskiqUtrqXtureckiqUtsqXtsongaqUtnqXsetswanaqUtoqXtongaqUausqXjęzyk australijskiqUavqXawarskiqUtkqX turkmeńskiqUthqXtajskiqUroaqX romańskiqUtgqX tadżyckiqUteqXteluguqUugaqXugaryckiqUmwlqX mirandeseqUkcgqXtyapqUsmiqX lapońskiqUfatqXfantiqUfanqXfangqUwoqXwolofqUrmqX retoromańskiqUdinqXdinkaqUblaqXsiksikaqUcmcqXczamqUmlqX malajalamqUzhqXchińskiqUtemqXtemneqUen_CAqXkanadyjski angielskiqUnwcqXnewarski klasycznyqUzaqXczuangqUcauqXkaukaskiqUzuqXzuluqUterqXterenoqUtetqXtetumqUmncqXmanchuqUkutqXkutenaiqUsukqXsukumaqUkumqXkumyckiqUsusqXsusuqUnewqXnewarskiqUsuxqX sumeryjskiqUdenqXslaveqUmenqXmendeqUmulqXwiele językówqUlezqX lezgijskiqUrootqX język bazowyqUekaqXekajukqUakkqX akadyjskiqUdraqX drawidyjskiqUjrbqX judeoarabskiqUsgnqXmigowyqUsgaqXstaroirlandzkiqUapaqXjęzyk ApaczówqUbraqXbradźqUchbrXczibczarUchgrX czagatajskirUchkrXtrukrUchmrXmaryjskirUchnrXżargon Chinookr Uchor Xchoctawr Uchpr X chipewyanr UchrrX czirokezkirUchyrXjęzyk CzejenówrUtirXtigriniarUvotrXwotiackirUmgrXmalgaskirUibarXibanagrUmorX mołdawskirUmnrX mongolskirUmirX maoryjskirUmhr Xmarshallr!Umkr"X macedońskir#Umtr$X maltańskir%Ucair&X%język Indian środkowoamerykańskichr'Udelr(Xdelawarer)Umsr*Xmalajskir+Umrr,Xmarathir-Utar.Xtamilskir/Umyr0X birmańskir1Ucadr2Xkaddor3Usrnr4X sranan tongor5Utair6Xtair7Uafhr8Xafrihilir9Usitr:Xchińsko-tybetańskir;Uenmr<Xśrednioangielskir=Ucsbr>X kaszubskir?Unynr@XnyankolerAUnyorBXnyororCUnymrDXniamwezirEUsiorFX siouańskirGUmaprHXaustronezyjskirIUmasrJXmasajskirKUlahrLXlahndarMUladrNX ladyńskirOUfyrPX fryzyjskirQUsnkrRXsoninkerSUfarTXperskirUUmadrVX madurajskirWUmagrXXmagahirYUmairZXmaithilir[Ufir\Xfińskir]Ufjr^X fidżijskir_Umanr`XmandingoraUegyrbXstarożytny egipskircUzndrdXazandereUssrfXsiswatirgUsrrhXserbskiriUsqrjX albańskirkUswrlXsuahilirmUsvrnXszwedzkiroUsurpX sundajskirqUstrrXsotho południowyrsUskrtX słowackiruUsirvX syngaleskirwUshrxXserbsko-chorwackiryUsorzX somalijskir{Usnr|Xszonar}Usmr~X samoańskirUslrX słoweńskirUscrX sardyńskirUsarXsanskrytrUsgrXsangorUserXlapoński północnyrUsdrXsindhirUzenrXzenagarUkbdrX kabardyjskirUafarXafro-azjatyckirUlgrXgandarUlbrX luksemburskirUfiurX ugrofińskirUlnrXlingalarUlorX laotańskirUlirX limburgijskirUbynrXblinrUltrXlitewskirUlurX luba-katangarUfilrXfilipinorUyirXjidyszrUnonrXstaronordyjskirUcebrXcebuanorUyorXjorubarUnogrXnogajskirUbatrX bałtyckirUdakrXdakotarUdarrX dargwijskirUdayrXdajakrUssarXnilosaharyjskirUkperXkpellerUelrXgreckirUeorX esperantorUenrX angielskirUlamrXlambarUeerXewerUmdfrXmoksharUfrrX francuskirUmdrrXmandarrUetrX estońskirUesrX hiszpańskirUrurXrosyjskirUgonrXgondirUgohrXstaro-wysoko-niemieckirUsmsrXlapoński SkoltrUsmnrXlapoński InarirUsmjrXlapoński LulerUde_ATrXaustriacki niemieckirUgotrXgockirUrnrXrundirUrorX rumuńskirUdsbrXdolnołużyckirUsmarXlapoński południowyrUgorrX gorontalorUastrX asturyjskirUwalrXwalamorUcrhrXkrymski tureckirUathrXjęzyk AtapaskówrUgezrXgyyzrUxhrXkhosarUffrXfulanirUkforXkororUmakrXmakasarrUzaprX zapoteckirUkokrXkonkanirUzxxrXbrak kontekstu lingwistycznegorUkosrXkosraerUforXfarerskirUtogrX tonga (Niasa)rUhuprXhupar Uudmr Xudmurckir Ubejr Xbedżar UbemrXbembarUtsirX tsimshianrUberrX berberskirUnzirXnzemarUsairX'język Indian południowoamerykańskichrUangrXstaroangielskirUprarXprakrytyrUbhorX bhodźpurirUsalrXsaliszrUpror Xstaroprowansalskir!Urajr"X radźasthanir#Usadr$Xsandawer%Uanpr&Xangikar'Ues_419r(X hiszpański (Ameryka Łacińska)r)Urapr*Xrapanuir+Usasr,Xsasakr-Unqor.Xn’kor/Ucarr0Xkaribir1Uminr2X minangkabur3Umicr4Xmicmacr5Uefir6Xefikr7Uarnr8X araukańskir9Uypkr:Xjupikr;Umisr<X inny językr=Ukacr>Xkaczinr?Ukabr@XkabylskirAUkaarBX karakałpackirCUkajrDXjjurEUkamrFXkambarGUkarrHX kareńskirIUkawrJXkawirKUtyvrLX tuwińskirMUfr_CArNXkanadyjski francuskirOUkarPX gruzińskirQUdoirRXdogrirSUkgrTXkongorUUkkrVX kazachskirWUkjrXXkwanyamarYUkirZXkikujur[Ukor\X koreańskir]Uknr^Xkannadar_Ukmr`XkhmerskiraUklrbX grenlandzkircUksrdX kaszmirskireUkrrfXkanurirgUkwrhX kornijskiriUkvrjXkomirkUkurlX kurdyjskirmUkyrnXkirgiskiroUtklrpXtokelaurqUbuarrXburiackirsUmgartXśrednioirlandzkiruUhitrvXhetyckirwUdyurxXdyularyUderzX niemieckir{Udar|Xduńskir}Udzr~XdzongkharUluirXluisenorUdvrX malediwskirUhilrX hiligajnonrUhimrX himachalirUgemrX germańskirUcrprXkreolski lub pidżinrUqurXkeczuarUbasrXbasarUgbarXgbayarUbadrX język bandarUbanrXbalijskirUbalrXbeludżirUshnrXshanrUbairXjęzyk bamilekerUarprXarapahorUartrXsztucznyrUarwrXarawakrUarcrX aramejskirUen_USrXangielski (USA)rUsemrXsemickirUselrX selkupskirUnubrXnubijskirUbtkrXbatakrUlusrXlushairUmusrXcreekrUluarX luba-luluarUirorXirokeskirUirarXirańskirUmunrX mundajskirUlunrXlundarUluorXluorUwarX walońskirUtuprXtupirUjvrXjawajskirUzblrXblissrUtutrX ałtajskirUtumrXtumbukarUjarX japońskirUcoprX koptyjskirUilorXilokanorUlarX łacińskirUgwirX GwichʼinrUundrXnieznany lub niepoprawny językrUtlirXtlingitrUtlhrX klingońskirUchrXchamorrorUcorX korsykańskirUcarX katalońskirUcerX czeczeńskirUponrX ponpejskirUcyrXwalijskirUsahrXjakuckirUcsrXczeskirUcrrXkrirUbntrXbanturUcvrXczuwaskirUcurXstaro-cerkiewno-słowiańskirUlvrX łotewskirUdumrXśredniowieczny niderlandzkirUptrX portugalskirUduarXdualarUfrorXstarofrancuskirUyaprXjapskirUfrmrXśredniofrancuskirUtivrXtiwrUfrsrXfryzyjski wschodnirUfrrrXpółnocnofryzyjskirUyaorXyaorUparX pendżabskir Uxalr X kałmuckir Upir Xpalijskir Uen_GBrXbrytyjski angielskirUgayrXgayorUotorXotomirUotarXosmańsko-tureckirUhmnrX hmongijskirUmyvrXerzyarUgaarXgarUfurrX friulijskirUkhirXkhoisanrUainr Xajnur!Urarr"X rarotongar#Uslar$X słowiańskir%Uver&Xvendar'Uvir(X wietnamskir)Uisr*X islandzkir+Ukhor,X chotańskir-Uiur.X inuktitutr/Uitr0Xwłoskir1Uvor2Xvolapukr3Uiir4X syczuańskir5Uikr6Xinupiakr7Uior8Xidor9Uiner:Xindoeuropejskir;Uiar<X interlinguar=Ujprr>X judeoperskir?Uier@X interlinguerAUidrBX indonezyjskirCUigrDXigborEUpaprFX papiamentorGUeworHXewondorIUpaurJXpalaurKUpaarLXpapuaskirMUpagrNX pangasinorOUsatrPXsantalirQUpalrRXpahlavirSUpamrTXpampangorUUsycrVXsyriackirWUphirXX filipińskirYUcelrZXceltyckir[Uphnr\Xfenickir]Unicr^Xnigrokordofańskir_Uniar`XniasraUdgrrbXdogribrcUsyrrdXsyryjskireUniurfXniuergUgswrhXniemiecki szwajcarskiriUcchrjXatsamrkUjborlXlojbanrmUnahrnXnahuatlroUsamrpXsamarytański aramejskirqUhairrXhaidarsUgmhrtXśrednio-wysoko-niemieckiruUcusrvXkuszyckirwUwenrxX łużyckiryUadyrzX adygejskir{Uelxr|Xelamickir}Uadar~XadangmerUhawrXhawajskirUbinrXbinirUbikrXbikolrUpt_BRrXbrazylyjski portugalskirUmosrXmossirUmohrXmohawkrUtlrXtagalskirUzh_HansrXchiński (uproszczony)rUzh_HantrXchiński (tradycyjny)rUtvlrXtuvalurUijorXijorUkmbrXkimbundurUpeorX staroperskirUumbrXumbundurUtmhrXtamaszekrUfonrXfonrUhsbrXgórnołużyckirUberX białoruskirUbgrX bułgarskirUbarX baszkirskirUpsrXpasztorUbmrXbambararUbnrX bengalskirUborX tybetańskirUbhrXbiharskirUbirXBislamarUbrrX bretońskirUbsrX bośniackirUruprX arumuńskirUzzarXzazakirUomrXoromskirUojrXodżibwarUacerXacehrUachrXaczolirUocrX prowansalskirUkrurXkurukhrUsrrrXsererrUkrorXkrurUkrlrXkarelskirUkrcrXkaraczajsko-bałkarskirUndsrXdolnosaksońskirUosrX osetyjskirUorrXorijarUsogrX sogdyjskirUnsorXsotho północnyrUsonrXsonghajrUde_CHrXwysokoniemiecki (Szwajcaria)rUvairXwairUwakrXwakaszrUlolrXmongorUmkhrX mon-khmerrUawarXawadhirUlozrXlozirUgilrX gilbertańskirUwasrXwashorUwarrXwarajrUhzrXhererorUhyrX ormiańskirUanrX aragońskirUsidrXsidamorUhrrX chorwackirUhtrX haitańskirUhurX węgierskirUhirXhindirUhorX hiri moturUharXhausarUbugrX bugińskirUherX hebrajskirUuzrXuzbeckir Uurr Xurdur Uplr Xpolskir UukrX ukraińskirUugrXujgurskirUaarXafarrUabrXabchaskirUaerX awestyjskirUafrX afrikaansrUakrXakanrUamrXamharskirUnl_BErXflamandzki (Belgia)rUeur X baskijskir!Uasr"Xasamskir#Uarr$Xarabskir%Uinhr&Xinguskir'Utpir(X tok pisinr)Umynr*X język Majówr+Uayr,Xajmarar-Ukhar.Xkhasir/Uazr0Xazerskir1Uincr2X indoaryjskir3Unlr4X niderlandzkir5Unnr6Xnorweski Nynorskr7Unor8Xnorweskir9Unar:Xnaurur;Unbr<Xnorweski Bokmålr=Unair>X&język Indian północnoamerykańskichr?Undr@Xndebele północnyrAUnerBXnepalskirCUngrDXndongarEUnyrFXnjandżarGUnaprHXneapolitańskirIUgrbrJXgreborKUgrcrLX starogreckirMUnrrNXndebele południowyrOUtigrPXtigrerQUnvrRXnawahorSUzunrTXzunirUUrwrVX kinya-ruandarWUcperXXangielski kreolski lub pidżinrYUcpfrZXfrancuski kreolski lub pidżinr[Ucppr\X portugalski kreolski lub pidżinr]uU territoriesr^}r_(UBDr`X BangladeszraUBErbXBelgiarcUBFrdX Burkina FasoreUBGrfX BułgariargUVErhX WenezuelariUBArjXBośnia i HercegowinarkUBBrlXBarbadosrmUWFrnXWallis i FutunaroUBLrpXSaint BarthélemyrqUBMrrXBermudyrsUBNrtXBrunei DarussalamruUBOrvXBoliwiarwUBHrxXBahrajnryUBIrzXBurundir{UBJr|XBeninr}UBTr~XBhutanrU011rXAfryka ZachodniarUBVrX Wyspa BouvetarUBWrXBotswanarU014rXAfryka WschodniarU015rXAfryka PółnocnarUBRrXBrazyliarU017rXAfryka ŚrodkowarU018rXAfryka PołudniowarU019rXAmerykarUBYrX BiałoruśrUBZrXBelizerULVrXŁotwarURWrXRwandarURSrXSerbiarUTLrXTimor WschodnirURErXReunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadżykistanrUROrXRumuniarUTKrXTokelaurUGWrX Gwinea BissaurUGUrXGuamrUGTrX GwatemalarUGSrX*Georgia Południowa i Sandwich PołudniowyrUGRrXGrecjarUGQrXGwinea RównikowarUGPrX GwadeluparUJPrXJaponiarUKIrXKiribatirUGYrXGujanarUGGrXWyspa GuernseyrUGFrXGujana FrancuskarUGErXGruzjarUGDrXGrenadarU021rX Ameryka Północna - Kanada, USArUGBrXWielka BrytaniarUGArXGabonrUSVrXSalwadorrUGNrXGwinearUGMrXGambiarUGLrX GrenlandiarU029rXKaraibyrUGIrX GibraltarrUGHrXGhanarUJErX Wyspa JerseyrUTNrXTunezjarUJMrXJamajkarU013rXAmeryka ŚrodkowarUWSrXSamoarU419rXAmeryka Łacińska i KaraibyrUHRrX ChorwacjarUBSrXBahamyrUHTrXHaitirUHUrXWęgryrUHKrX/Hongkong, Specjalny Region Administracyjny ChinrU039rXEuropa PołudniowarUHNrXHondurasrUFIrX FinlandiarU142rXAzjarU030rXAzja WschodniarU034rXAzja PołudniowarU035rXAzja Południowo-WschodniarUPRrX PortorykorUPSrXTerytoria PalestyńskierU830rXWyspy NormandzkierUFKrX FalklandyrUIOrX(Terytorium Brytyjskie Oceanu IndyjskiegorUPWrXPalaur UPTr X Portugaliar USJr XSvalbard i Jan Mayenr UMDrX MołdawiarUFMrX MikronezjarUIQrXIrakrUPArXPanamarUPFrXPolinezja FrancuskarUPGrXPapua Nowa GwinearUPErXPerurUPKrXPakistanrUPHrXFilipinyrUFOr X Wyspy Owczer!UPNr"XPitcairnr#UPLr$XPolskar%UPMr&XSaint-Pierre i Miquelonr'UZMr(XZambiar)UEHr*XSahara Zachodniar+URUr,XRosjar-UEEr.XEstoniar/UEGr0XEgiptr1UZAr2XRepublika Południowej Afrykir3UECr4XEkwadorr5UITr6XWłochyr7UVNr8XWietnamr9UZZr:X"Nieznany lub nieprawidłowy regionr;USBr<XWyspy Salomonar=UETr>XEtiopiar?USOr@XSomaliarAUZWrBXZimbabwerCUSArDXArabia SaudyjskarEUESrFX HiszpaniarGUERrHXErytrearIUMErJX CzarnogórarKUAQrLX AntarktykarMUMGrNX MadagaskarrOUMFrPX Sint MaartenrQUMArRXMarokorSUMCrTXMonakorUUUZrVX UzbekistanrWUMMrXXBirmarYUMLrZXMalir[UMOr\X,Makau, Specjalny Region Administracyjny Chinr]UMNr^XMongoliar_UHMr`XWyspy Heard i McDonaldaraUASrbXSamoa AmerykańskiercUMKrdX MacedoniareUMUrfX MauritiusrgUMTrhXMaltariUMWrjXMalawirkUMVrlXMalediwyrmUMQrnX MartynikaroUMPrpXMariany PółnocnerqUMSrrX MontserratrsUMRrtX MauretaniaruUIMrvX Wyspa ManrwUUGrxXUgandaryUTZrzXTanzaniar{UMYr|XMalezjar}UMXr~XMeksykrUILrXIzraelrUFRrXFrancjarUAWrXArubarUDOrXRepublika DominikańskarUSHrXWyspa Świętej HelenyrUVCrXSaint Vincent i GrenadynyrU054rX MelanezjarUDJrXDżibutirUFJrXFidżirU057rXRegion MikronezjirU172rX Wspólnota Niezależnych PaństwrU053rXAustralia i Nowa ZelandiarUNIrX NikaraguarUNLrXHolandiarUNOrXNorwegiarUNArXNamibiarUVUrXVanuaturUNCrXNowa KaledoniarUNErXNigerrUNFrX Wyspa NorfolkrUNGrXNigeriarUNZrX Nowa ZelandiarUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinezjarUCIrXWybrzeże Kości SłoniowejrUCHrX SzwajcariarUCOrXKolumbiarUCNrXChinyrUCMrXKamerunrUCLrXChilerUCCrXWyspy KokosowerUCArXKanadarUCGrXKongorUCFrXRepublika Środkowej AfrykirUCDrXDemokratyczna Republika KongarUCZrXCzechyrUCYrXCyprrUCXrXWyspa Bożego NarodzeniarUCSrXSerbia i CzarnogórarUCRrX KostarykarUPYrXParagwajrUCVrXWyspy Zielonego PrzylądkarUCUrXKubarUSZrXSuazirUSYrXSyriarUKGrX KirgistanrUKErXKeniarUSRrXSurinamrU143rXAzja ŚrodkowarUKHrX KambodżarUKNrXSaint Kitts i NevisrUKMrXKomoryrUSTrX&Wyspy Świętego Tomasza i KsiążęcarUSKrX SłowacjarUKRrXKorea PołudniowarUSIrX SłoweniarUKPrXKorea PółnocnarUKWrXKuwejtrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrXSeszelerUKZrX KazachstanrUKYrXKajmanyrUSGrXSingapurrUSErXSzwecjarUSDrXSudanr U151r XEuropa Wschodniar U150r XEuropar UDMrXDominikarU155rXEuropa ZachodniarU154rXEuropa PółnocnarUVGrXBrytyjskie Wyspy DziewiczerUDErXNiemcyrUYErXJemenrUMHrXWyspy MarshallarU062rXAzja Południowo-ŚrodkowarUDZrXAlgieriarUUSr XStany Zjednoczoner!UUYr"XUrugwajr#UYTr$XMajottar%UUMr&X,Dalekie Wyspy Mniejsze Stanów Zjednoczonychr'ULBr(XLibanr)ULCr*X Saint Luciar+ULAr,XLaosr-UTVr.XTuvalur/UTWr0XTajwanr1UTTr2XTrynidad i Tobagor3UTRr4XTurcjar5ULKr6X Sri Lankar7ULIr8X Liechtensteinr9UCKr:X Wyspy Cookar;UTOr<XTongar=ULTr>XLitwar?ULUr@X LuksemburgrAULRrBXLiberiarCULSrDXLesothorEUTHrFX TajlandiarGUTFrHX Francuskie Terytoria PołudniowerIUTGrJXTogorKUTDrLXCzadrMUTCrNXTurks i CaicosrOULYrPXLibiarQUVArRXWatykanrSU145rTXAzja ZachodniarUUAErVXZjednoczone Emiraty ArabskierWUADrXXAndorarYUAGrZXAntigua i Barbudar[UAFr\X Afganistanr]UAIr^XAnguillar_UVIr`X%Wyspy Dziewicze Stanów ZjednoczonychraUISrbXIslandiarcUIRrdXIranreUAMrfXArmeniargUALrhXAlbaniariUAOrjXAngolarkUANrlXAntyle HolenderskiermU003rnXAmeryka PółnocnaroU002rpXAfrykarqU001rrXŚwiatrsUARrtX ArgentynaruUAUrvX AustraliarwUATrxXAustriaryU005rzXAmeryka Południowar{UINr|XIndier}UAXr~XWyspy AlandzkierU009rXOceaniarUAZrX AzerbejdżanrUIErXIrlandiarUIDrX IndonezjarUJOrXJordaniarUQUrXUnia EuropejskarUUArXUkrainarUQArXKatarrUDKrXDaniarUMZrXMozambikrUQOrX Oceania inneruUdecimal_formatsr}rNh2)r}r(h5Nh7Kh8KKrh:h;h;rh=KKrh?X #,##0.###rhAh;hBrhDNhEKKrubsU date_formatsr}r(Umediumrh[)r}r(h?X yyyy-MM-ddrh_X%(yyyy)s-%(MM)s-%(dd)srubUfullrh[)r}r(h?XEEEE, d MMMM yyyyrh_X!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)srubUlongrh[)r}r(h?X d MMMM yyyyrh_X%(d)s %(MMMM)s %(yyyy)srubUshortrh[)r}r(h?Xyy-MM-ddrh_X%(yy)s-%(MM)s-%(dd)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUZWDrXZ$rUVUVrXVTrUUYUrXUr$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUSCRrXSRrUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUGBPrX£rUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramr UUGXr XUShr UJMDr XJ$r UGELrXlarirUAFNrXAfrUTRLrXTLrUBDTrXTkrUYERrXYRlrUANGrXNA f.rUXCDrXEC$rUNOKrXNKrrUINRrXINRrUMXNr XMEX$r!UBTNr"XNur#UCOPr$XCol$r%UIDRr&XRpr'UHNLr(XLr)UFJDr*XF$r+UETBr,XBrr-UBZDr.XBZ$r/UDOPr0XRD$r1UQARr2XQRr3USEKr4XSKrr5USRGr6XSfr7UIEPr8XIR£r9UBBDr:XBDS$r;UGTQr<XQr=UVEBr>XBer?UCLPr@XCh$rAUALLrBXlekrCUKZTrDXTrEUTTDrFXTT$rGUOMRrHXROrIUSBDrJXSI$rKUPLNrLXzłrMUKESrNXK ShrOUGYDrPXG$rQUMKDrRXMDenrSUTWDrTXNT$rUUTOPrVXT$rWUGNFrXXGFrYUIQDrZXIDr[UBAMr\XKMr]UCADr^XCan$r_UCVEr`XCVEscraUKWDrbXKDrcUBIFrdXFbureUSOSrfXSh.rgUSGDrhXS$riUSTDrjXDbrkUIRRrlXRIrmUCNYrnXYroUCYPrpX£CrqUMTLrrXLmrsUNZDrtX$NZruUUSDrvX$rwUKGSrxXsomryUARSrzXArg$r{USZLr|XEr}UBHDr~XBDrUJPYrX¥ruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXWyspy KanaryjskiersUAntarctica/Mawsonr}rjXWybrzeże MawsonarsUAtlantic/Madeirar}rjXMaderarsUAntarctica/Rotherar}rjXStacja Naukowa RotherarsU Europe/Minskr}rjXMińskrsUAmerica/Miquelonr}rjXSaint Pierre i MiquelonrsUPacific/Fakaofor}rjXTokelaursUAfrica/Tripolir}rjXTrypolisrsUEurope/Tallinnr}rjXTallinrsU Indian/Maher}rjXMahérsU Asia/Calcuttar}rjXKalkutarsUAntarctica/Davisr}rjX Stacja DavisrsU Asia/Dhakar}rjXDakkarsUAmerica/St_Luciar}rjX Saint LuciarsUEurope/Amsterdamr}rjXHolandiarsUEurope/Simferopolr}rjX SymferopolrsU Europe/Tiraner}rjXTiranarsUPacific/Saipanr}rjXMariany PółnocnersUAmerica/Maceior}rjXMaceiórsUAfrica/Abidjanr}rjXAbidżanrsUAfrica/Djiboutir}rjXDżibutirsU Asia/Kashgarr}rjXKaszgarrsU Asia/Kuchingr}rjXKuczingrsU Asia/Urumqir}rjXUrumczirsU Europe/Moscowr}rjXMoskwarsUAmerica/Indiana/Knoxr}rjXKnoxrsUAmerica/El_Salvadorr}rjXSalwadorrsUAmerica/Indiana/Petersburgr}rjX PetersburgrsU Europe/Madridr}rjXMadrytrsUAsia/Pyongyangr}rjXKorea PółnocnarsU Asia/Dubair}rjXDubajrsU Asia/Kuwaitr}rjXKuwejtrsUAsia/Ulaanbaatarr}rjX Ułan BatorrsUAfrica/Dar_es_Salaamr}rjX Dar es-SalaamrsUIndian/Maldivesr}rjXMalediwyrsU Europe/Parisr}rjXParyżrsUEurope/Stockholmr}rjX SztokholmrsU Pacific/Fijir}rjXFidżirsU Pacific/Apiar}rjXSamoarsUAmerica/Port-au-Princer}rjXHaitirsUPacific/Pago_Pagor}rjXSamoa AmerykańskiersUAmerica/Caymanr}rjXKajmanyrsUAustralia/Adelaider}rjXAdelajdarsU Europe/Athensr}rjXAtenyrsUAmerica/Curacaor }r jXCuraçaor sU Asia/Rangoonr }r jXRangunrsUPacific/Funafutir}rjXTuvalursUIndian/Kerguelenr}rjXWyspy KerguelenarsUEurope/Podgoricar}rjX CzarnogórarsUAmerica/Mexico_Cityr}rjXMeksykrsUAmerica/Puerto_Ricor}rjX PortorykorsUAmerica/Indiana/Winamacr}rjXWinamacr sU Asia/Manilar!}r"jXFilipinyr#sUEurope/Sarajevor$}r%jXSarajewor&sU Europe/Rigar'}r(jXRygar)sU Europe/Berlinr*}r+jXNiemcyr,sU Europe/Zurichr-}r.jXZurychr/sUAmerica/Guatemalar0}r1jX Gwatemalar2sU Asia/Tbilisir3}r4jXGruzjar5sU America/Belemr6}r7jXBelémr8sU Africa/Doualar9}r:jXDualar;sU Europe/Romer<}r=jXRzymr>sUAustralia/Lord_Hower?}r@jXWyspa Lord HowerAsUAfrica/Sao_TomerB}rCjX Săo TomérDsU Europe/SkopjerE}rFjX MacedoniarGsUAfrica/BujumburarH}rIjX BużumburarJsUAmerica/North_Dakota/New_SalemrK}rLjX New SalemrMsUEurope/ChisinaurN}rOjX KiszyniówrPsU Etc/GMT-1rQ}rRjXGMT-01:0rSsUPacific/Port_MoresbyrT}rUjXPapua Nowa GwinearVsU Etc/GMT-2rW}rXjX GMT-02:00rYsUAsia/YekaterinburgrZ}r[jX Jekaterynburgr\sUEurope/Andorrar]}r^jXAndorar_sUAtlantic/Bermudar`}rajXBermudyrbsUAntarctica/Caseyrc}rdjX Stacja CaseyresU Asia/Saigonrf}rgjXSajgonrhsU Asia/Bakuri}rjjX AzerbejdżanrksUPacific/Wallisrl}rmjXWallis i FutunarnsUAtlantic/Stanleyro}rpjXFalklandy (Malwiny)rqsUAmerica/St_Thomasrr}rsjX Saint ThomasrtsUEurope/Helsinkiru}rvjX FinlandiarwsU Europe/Oslorx}ryjXNorwegiarzsUAfrica/Khartoumr{}r|jXChartumr}sUAtlantic/Cape_Verder~}rjXZielony PrzylądekrsUAsia/Hong_Kongr}rjXHongkongrsUAmerica/Tegucigalpar}rjXHondurasrsU Asia/Macaur}rjXMakaursU Indian/Cocosr}rjXWyspy KokosowersUEurope/Belgrader}rjXBelgradrsUAsia/Choibalsanr}rjX CzojbalsanrsUAmerica/Guadelouper}rjX GwadeluparsUEurope/Copenhagenr}rjX KopenhagarsUAmerica/Nassaur}rjXBahamyrsUAmerica/Indiana/Marengor}rjXMarengorsU Europe/Praguer}rjXPragarsUAntarctica/Syowar}rjX Stacja SyowarsUAntarctica/McMurdor}rjXMc MurdorsU Asia/Hovdr}rjXHowdrsU Europe/Kievr}rjXKijówrsUAmerica/Jamaicar}rjXJamajkarsU Asia/Irkutskr}rjXIrkuckrsUAmerica/Caracasr}rjX WenezuelarsU Asia/Baghdadr}rjXBagdadrsUAsia/Singaporer}rjXSingapurrsUEurope/Budapestr}rjX BudapesztrsU Asia/Ammanr}rjXJordaniarsU Asia/Kabulr}rjX AfganistanrsU Asia/Sakhalinr}rjXSachalinrsUIndian/Antananarivor}rjX AntananarywarsUAfrica/Windhoekr}rjXWindhukrsUAmerica/St_Vincentr}rjX Saint VincentrsUEurope/Bratislavar}rjX BratysławarsUAtlantic/Reykjavikr}rjX RejkiawikrsU Asia/Nicosiar}rjXNikozjarsUEurope/Volgogradr}rjX WołgogradrsUEurope/Uzhgorodr}rjXUżgorodrsU Africa/Banjulr}rjXBandżulrsU Asia/Aqtaur}rjXAktaursU Asia/Thimphur}rjXBhutanrsUAmerica/Sao_Paulor}rjX Săo PaulorsUAmerica/Port_of_Spainr}rjX Port-of-SpainrsUPacific/Tongatapur}rjXTongarsUPacific/Pitcairnr}rjXWyspy PitcairnrsU Asia/Tashkentr}rjX TaszkientrsU Asia/Tokyor}rjXTokiorsUPacific/Easterr}rjXWyspa WielkanocnarsU Asia/Jakartar}r jX Dżakartar sU Asia/Karachir }r jXKaraczir sUAntarctica/Palmerr }r jXArchipelag Palmerar sU Asia/Muscatr }r jXMaskatr sUAtlantic/South_Georgiar }r jXGeorgia Południowar sUAfrica/El_Aaiunr }r jXUjunr sU Asia/Dilir }r jXTimor Wschodnir sUPacific/Noumear }r jXNumear sU Asia/Oralr }r jXUralskr sU Asia/Taipeir }r jXTajpejr sU Asia/Adenr }r jXJemenr sUEurope/Isle_of_Manr }r! jX Wyspa Manr" sUEurope/Istanbulr# }r$ jXStambułr% sUEurope/Mariehamnr& }r' jX Maarianhaminar( sUAfrica/Kinshasar) }r* jXKinszasar+ sUAntarctica/Vostokr, }r- jX Stacja Vostokr. sUEurope/Bucharestr/ }r0 jX Bukaresztr1 sU Africa/Niameyr2 }r3 jXNiamejr4 sU Asia/Colombor5 }r6 jXKolombor7 sUAmerica/Porto_Velhor8 }r9 jX Pôrto Velhor: sUAfrica/Nouakchottr; }r< jX Nawakszutr= sU Asia/Bangkokr> }r? jX Tajlandiar@ sU Europe/MonacorA }rB jXMonakorC sU Asia/BishkekrD }rE jXBiszkekrF sUAmerica/BogotarG }rH jXKolumbiarI sU Asia/AshgabatrJ }rK jX AszchabadrL sU Asia/AqtoberM }rN jX AktiubińskrO sUAsia/KamchatkarP }rQ jX KamczatkarR sU Africa/AccrarS }rT jXAkrarU sUEurope/VilniusrV }rW jXWilnorX sUAmerica/CayennerY }rZ jXKajennar[ sU Asia/Yerevanr\ }r] jXErewanr^ sUAmerica/La_Pazr_ }r` jXBoliwiara sUAfrica/Mogadishurb }rc jX Mogadiszurd sU Africa/Cairore }rf jXKairrg sUAmerica/Cuiabarh }ri jXCuiabárj sUAmerica/Tortolark }rl jXBrytyjskie Wyspy Dziewiczerm sUAmerica/Kentucky/Monticellorn }ro jX Monticellorp sUPacific/Guadalcanalrq }rr jXWyspy Salomonars sUIndian/Christmasrt }ru jXWyspa Bożego Narodzeniarv sUEurope/Ljubljanarw }rx jXLublanary sUAfrica/Addis_Ababarz }r{ jX Addis Abebar| sU Pacific/Efater} }r~ jXVanuatur sUAsia/Vientianer }r jXWientianr sUAmerica/Havanar }r jXHawanar sUEurope/Brusselsr }r jXBrukselar sU Europe/Lisbonr }r jXLizbonar sUAfrica/Conakryr }r jXKonakrir sUAsia/Qyzylordar }r jX Kyzył Ordar sUAtlantic/Azoresr }r jXAzoryr sUAsia/Jerusalemr }r jX Jerozolimar sUAsia/Chongqingr }r jXCzunkingr sU Asia/Shanghair }r jXSzanghajr sUAmerica/St_Kittsr }r jX Saint Kittsr sUAmerica/Godthabr }r jX Grenlandiar sU Asia/Beirutr }r jXBejrutr sUAfrica/Algiersr }r jXAlgierr sUAfrica/Ndjamenar }r jX Ndżamenar sUAmerica/Guayaquilr }r jXEkwadorr sUAsia/Samarkandr }r jX Samarkandar sU Asia/Bahrainr }r jXBahrajnr sU Europe/Londonr }r jXLondynr sUAmerica/Costa_Ricar }r jX Kostarykar sU Indian/Chagosr }r jXCzagosr sU Asia/Riyadhr }r jXRijadr sU America/Limar }r jXPerur sUAsia/Vladivostokr }r jX Władywostokr sUIndian/Mayotter }r jXMajottar sUAsia/Phnom_Penhr }r jX Kambodżar sUAtlantic/Faeroer }r jX Wyspy Owczer sU Europe/Warsawr }r jXWarszawar sUAmerica/Montevideor }r jXUrugwajr sUAmerica/Managuar }r jX Nikaraguar sU Asia/Damascusr }r jXDamaszekr sU Asia/Qatarr }r jXKatarr sUAmerica/North_Dakota/Centerr }r jXCenterr sUAsia/Krasnoyarskr }r jX Krasnojarskr sUAmerica/Guyanar }r jXGujanar sUAmerica/Indiana/Vevayr }r jXVevayr sU Asia/Katmandur }r jXNepalr sUAtlantic/St_Helenar }r jXŚwięta Helenar sUEurope/Luxembourgr }r jX Luksemburgr sU Africa/Banguir }r jXBangir sU Asia/Gazar }r jXTerytoria Palestyńskier sUAmerica/Martiniquer }r jX Martynikar sUEurope/Vaticanr }r jXWatykanr sU Africa/Lomer }r jXLomér sUAmerica/Antiguar }r jXAntigua i Barbudar sUAmerica/Indiana/Vincennesr }r jX Vincennesr sU Asia/Almatyr }r jX Ałma Atar sUAmerica/Santo_Domingor }r jXRepublika Dominikańskar sUAsia/Novosibirskr }r jX Nowosybirskr sUAmerica/Paramaribor }r jXSurinamr sU Europe/Zagrebr }r jXZagrzebr sUAfrica/Brazzaviller }r jXKongo Brazzaviller sUAmerica/Grand_Turkr }r jXTurks i Caicosr sUPacific/Marquesasr }r jXMarkizyr! sUAmerica/Asuncionr" }r# jX Asunciónr$ sU Europe/Viennar% }r& jXWiedeńr' sUAmerica/New_Yorkr( }r) jX Nowy Jorkr* sUPacific/Norfolkr+ }r, jX Wyspa Norfolkr- sU Europe/Dublinr. }r/ jXIrlandiar0 sUEurope/Zaporozhyer1 }r2 jX Zaporożer3 sU Europe/Sofiar4 }r5 jX Bułgariar6 sUPacific/Rarotongar7 }r8 jX Wyspy Cookar9 sUAmerica/Dominicar: }r; jXDominikar< sUAfrica/Porto-Novor= }r> jX Porto Novor? sU Asia/Yakutskr@ }rA jXJakuckrB sU Asia/DushanberC }rD jXDuszanberE sU Europe/VaduzrF }rG jX LiechtensteinrH sU Asia/TehranrI }rJ jXTeheranrK sU Etc/UnknownrL }rM jXNieznanerN sU Indian/ComororO }rP jXKomoryrQ sU America/BahiarR }rS jXSalvadorrT sU Asia/SeoulrU }rV jXSeulrW sUAfrica/OuagadougourX }rY jXWagadugurZ sU Africa/Asmerar[ }r\ jXAsmarar] sUAntarctica/South_Poler^ }r_ jXBiegun południowyr` suUscriptsra }rb (UZsymrc XSymbolsrd UGurure Xgurmukhirf UHebrrg X hebrajskierh UZzzzri Xnieznane lub niepoprawnerj UPhnxrk Xfenickirl UMoonrm XMoon'arn USamrro X samarytańskirp UChamrq Xczamskierr UArabrs Xarabskiert UGujrru X gudźarackierv UZxxxrw Xjęzyk bez systemu pismarx ULyciry X likijskierz USinhr{ X syngaleskier| UTalur} X nowy tai luer~ UMongr X mongolskier UXpeor X staroperskier UVispr XVisible Speechr URjngr Xrejangr UOlckr Xol chikir UTaler Xtai ler UMandr X mandejskier UManir X manichejskier UMlymr X malayalamr UTibtr X tybetańskier UKalir Xkayah lir UJpanr X japońskier UPlrdr Xfonetyczny Pollard'ar UKanar Xkatakanar ULydir X lidyjskier ULepcr Xlepchar USundr X sundajskier UYiiir Xyir UJavar X jawajskier UOryar Xoriyar ULaoor X laotańskier UUgarr X ugaryckier UCyrlr Xcyrylicar UVaiir Xvair UArmnr X ormiańskier UCyrsr X%cyrylica staro-cerkiewno-słowiańskar UKhmrr X khmerskier UArmir Xarmir USylor X syloti nagrir UItalr X starowłoskier USgnwr X pismo znakower UXsuxr Xklinowe sumero-akadyjskier UThaar Xthaanar UThair Xtajskier UCprtr X cypryjskier ULinbr X linearne Br ULinar X linearne Ar UOsmar Xosmanyar USaurr X saurashtrar UHirar Xhiraganar UHanir Xhanr UEgydr Xegipskie demotyczner UQaair X dziedziczoner UEgyhr Xegipskie hieratyczner UCansr X.Zunifikowane symbole kanadyjskich autochtonówr UEgypr Xhieroglify egipskier UZmthr Xnotacja matematycznar UTfngr XTifinagh (berberski)r UShawr Xshawar UCirtr Xcirthr UGeorr X gruzińskier UTengr Xtengwarr UHrktr Xkatakana lub hiraganar UGeokr Xgruzińskie chucurir UTavtr Xtai vietr UOgamr XOghamr UDsrtr Xdeseretr UGothr Xgotyckier UHanor Xhanunoor UBalir X balijskier UKorer X koreańskier UHangr Xhangylr UCarir X karyjskier UAvstr X awestyjskier UTagbr Xtagbanwar UHansr XUproszczony Hanr UHantr XTradycyjny Hanr URoror X rongorongor UDevar X devanagarir UIndsr Xindusr UBopor Xbopomofor UMymrr X birmańskier UTglgr Xtagalogr UPermr X staropermskier UBugir X bugińskier UPhagr Xphags-par UBrair X Braille’ar UBrahr Xbrahmir UBatkr Xbatakr UMeror X meroickier ULimbr Xlimbur UMteir! X meitei mayekr" UPhlir# Xinskrypcyjne pahlawir$ UTelur% Xtelugur& UTamlr' X tamilskier( USarar) Xsaratir* UPhlpr+ Xpahlawi psałterzowyr, ULatgr- Xłaciński - odmiana gaelickar. ULatfr/ Xłaciński - frakturar0 UKharr1 Xcharostir2 UNkoor3 Xn'kor4 UPhlvr5 Xpahlawi książkowyr6 ULatnr7 X łacińskier8 UMayar9 Xhieroglify Majówr: ULanar; Xlannar< UEthir= X etiopskier> UKthir? Xkaithir@ UHmngrA X pahawh hmongrB UBuhdrC XbuhidrD UCoptrE X koptyjskierF UPrtirG Xpartyjski inskrypcyjnyrH UGlagrI X głagolicarJ URunrrK XrunicznerL UOrkhrM X orchońskierN UCakmrO XchakmarP UHungrQ XstarowęgierskierR UGrekrS XgreckierT UCherrU XIrokeskirV UZyyyrW XwspólnerX USyrcrY XSyryjskirZ UBlisr[ Xsymbole Blissar\ UBengr] X bengalskier^ USyrer_ Xsyriacki estrangelor` USyrjra XSyryjski (odmiana zachodnia)rb USyrnrc XSyryjski (odmiana wschodnia)rd UKndare Xkannadarf uUvariantsrg }rh (UMONOTONri X monotonicznyrj UBOONTrk Xdialekt Boontlingrl USCOUSErm Xdialekt Scousern UAREVELAro Xormiański wchodnirp USOLBArq Xdialekt Stolvizza/Solbicarr ULIPAWrs X dialekt Lipovaz w regionie Resiart U1901ru Xtradycyjna ortografia niemieckarv UBAKU1926rw X'turecki zunifikowany alfabet łacińskirx UOSOJSry Xdialekt Oseacco/Osojanerz U1694ACADr{ Xsiedemnastowieczny francuskir| UVALENCIAr} Xwalenckir~ UPOLYTONr X politonicznyr UNJIVAr Xdialekt Gniva/Njivar UFONIPAr Xfonetyczny międzynarodowyr UTARASKr Xortografia taraszkiewickar U1606NICTr Xszesnastowieczny francuskir USAAHOr X dialekt Sahor UPOSIXr X komputerowyr UFONUPAr X fonetycznyr UNEDISr Xdialekt Natisoner UAREVMDAr Xormiański zachodnir U1994r X$standardowa ortografia regionu Resiar U1996r Xortografia niemiecka z 1996 r.r UREVISEDr Xortografia zreformowanar USCOTLANDr Xstandardowy szkocki angielskir UBISKEr Xdialekt San Giorgio/Bilar UROZAJr Xdialekt regionu Resiar uUnumber_symbolsr }r (Ugroupr X r UnativeZeroDigitr X0r U exponentialr j}UperMiller X‰r Unanr XNaNr Udecimalr X,r U percentSignr hLUlistr X;r U patternDigitr X#r UplusSignr X+r Uinfinityr X∞r U minusSignr hBuUcurrency_namesr }r (UXXXr Xnieznana/nieprawidłowa walutar jXdinar algierskir jXdolar namibijskir UGHSr X cedi Ghanyr UBOPr Xpeso boliwijskier UEGPr X funt egipskir jXlew bułgarskir UBGNr Xnowy lew bułgarskir UPABr Xbalboa panamskir UYUMr Xnowy dinar jugosławiańskir jXdolar Zimbabwer UGHCr Xcedi ghańskier jX bolivianor jXkorona duńskar UBWPr Xpular jXfunt libańskir jXszyling tanzańskir UVNDr Xdong wietnamskir UAOAr Xkwanza angolańskar UWSTr Xtala samoańskar UAONr X#nowa kwanza angolańska (1990-2000)r jXriel kambodżańskir jXringgit malezyjskir UAOKr Xkwanza angolańska (1977-1990)r jfXszyling somalijskir UKYDr Xdolar kajmańskir jXdinar libijskir UUAHr Xhrywna ukraińskar UUAKr Xkarbowaniec ukraińskir jXdinar jordańskir UAORr X)kwanza angolańska Reajustado (1995-1999)r USURr Xrubel radzieckir UAWGr Xgulden arubskir jXrial saudyjskir UFIMr X marka fińskar jXdolar hongkońskir j6Xgulden surinamskir UTPEr Xescudo timorskier UMGFr Xfrank malgaskir jXfrank szwajcarskir UGIPr Xfunt gibraltarskir jXrubel białoruskir jBX lek albańskir UXPDr Xpalladr UUGSr Xszyling ugandyjski (1966-1987)r jXouguiya mauterańskar UBOVr Xmvdol boliwijskir UHRKr Xkuna chorwackar jXfrank Dżibutir UHRDr Xdinar chorwackir UPESr Xsol peruwiańskir UBYBr Xrubel białoruski (1994-1999)r UITLr X lir włoskir UXAFr Xfrank CFA BEACr UBNDr Xdolar brunejskir UISKr Xkorona islandzkar UZALr X'rand południowoafrykański (finansowy)r USRDr Xdolar surinamskir UNIOr Xcordoba oro nikaraguańskar ULAKr Xkip laotańskir UNICr Xcordoba nikaraguańskar jXrupia nepalskar UMZEr Xescudo mozambickier jXpeso urugwajskier jX funt syryjskir! j Xdolar jamajskir" UFRFr# Xfrank francuski r$ UMAFr% Xfrank marokańskir& jXmetical Mozambikr' UMZNr( Xmetical Mozambikur) UPHPr* Xpeso filipińskier+ jXrand południowoafrykańskir, URHDr- Xdolar rodezyjskir. UGWPr/ Xpeso Guinea-Bissaur0 ULUFr1 Xfrank luksemburskir2 UBELr3 Xfrank belgijski (finansowy)r4 UBECr5 Xfrank belgijski (zamienny)r6 UNGNr7 Xnaira nigeryjskar8 UYUNr9 Xdinar jugosławiański wymiennyr: jXfrank belgijskir; UPLZr< Xzłoty polski (1950-1995)r= jXcolon kostarykańskir> jX lir tureckir? UDEMr@ Xmarka niemieckarA UEEKrB Xkorona estońskarC jXkwacha malawskarD jFXdolar Trynidadu i TobagorE jXrupia lankijskarF jXkorona słowackarG j`Xescudo Zielonego PrzylądkarH jXrupia pakistańskarI jXforint węgierski rJ jX lej rumuńskirK UXEUrL XECUrM jXdolar bermudzkirN jHX rial OmanurO jX loti LesotorP ULVRrQ Xrubel łotewskirR jXtugrik mongolskirS jXdram armeńskirT UBUKrU Xkyat birmańskirV j Xszyling ugandyjskirW j2X rial katarskirX UXDRrY Xspecjalne prawa ciągnieniarZ UNLGr[ Xgulden holenderski r\ UGEKr] Xkupon gruziński laritr^ UMTPr_ Xfunt maltańskir` jXfunt szterlingra jXlari gruzińskierb USHPrc Xfunt Wyspy Świętej Helenyrd jXafganire jJXdolar Wysp Salomonarf UCSKrg Xkorona czechosłowackarh UKPWri Xwon północnokoreańskirj UCSDrk Xstary dinar serbskirl UAFArm Xafgani (1927-2002)rn UTHBro X baht tajskirp UTRYrq Xnowa lira tureckarr jXtaka bengalskars UGRDrt Xdrachma greckaru jXrial jemeńskirv UDDMrw X"wschodnia marka wschodnioniemieckarx j|Xlilangeni Suaziry UHTGrz Xgourde haitańskier{ UXOFr| X frank CFAr} UMGAr~ Xariar malgaskir jXgulden Antyle Holenderskier ULRDr Xdolar liberyjskir URWFr Xfrank ruandyjskir jXkorona norweskar jNXszyling kenijskir UMOPr X pataka Macaor jXrupia indyjskar j Xpeso meksykańskier UCZKr X korona czeskar UTJSr Xsomoni tadżyckier UTJRr Xrubel tadżyckir j"Xngultrum Bhutanur UYDDr Xdinar jemeńskir UGWEr Xescudo Gwinea Portugalskar j$Xpeso kolumbijskier jrXlira maltańskar UMURr Xrupia Mauritiusr j&Xrupia indonezyjskar j(Xlempira Hondurasur jX frank CFPr j*X dolar fidżir j,X birr etiopskir UPENr Xnowy sol peruwiańskir j.Xdolar belizeńskir UATSr Xszyling austriacki r UILPr Xfunt izraelskir UZRNr Xnowy zair zairskir j0Xpeso dominikańskier UTMMr Xmanat turkmeńskir jTXnowy dolar tajwańskir UMDLr Xlej mołdawskir UXPTr Xplatynar UECSr Xsucre ekwadorskir UBSDr Xdolar bahamskir j4Xkorona szwedzkar jVXpaʻanga Tongar UPEIr Xinti peruwiańskir UZMKr Xkwacha zambijskar UMVRr Xrufiyaa malediwskar jXdolar australijskir UADPr Xpeseta andorskar UCUPr Xpeso kubańskier j8Xfunt irlandzkir j:Xdolar Barbadosur jXfrank komoryjskir UKRWr Xwon południowokoreańskir UGMDr Xdalasi gambijskier UVEFr Xboliwar fuerter j<Xquetzal gwatemalskir j>Xboliwar wenezuelskir USITr Xtolar słoweńskir USDPr Xstary funt sudańskir j@Xpeso chilijskier UEURr Xeuror UCDFr Xfrank kongijskir jXdolar wschodniokaraibskir jDXtenge kazachskier URUBr Xrubel rosyjskir UXFUr XUIC-frank francuskir UXAGr Xsrebror UBRRr Xcruzeiro brazylijskier UBRNr Xnowe cruzado brazylijskier UBRLr Xreal brazylijskir UMMKr X kyat Myanmarr UUYPr Xpeso urugwajskie (1975-1993)r URURr Xrubel rosyjski (1991-1998)r jLX złoty polskir UBREr X!cruzeiro brazylijskie (1990-1993)r UPYGr Xguarani paragwajskier UBRCr Xcruzado brazylijskier UBRBr X&cruzeiro novo brazylijskie (1967-1986)r USVCr Xcolon salwadorskir UAEDr Xdirham arabskir UGNSr Xsyli gwinejskier jRXdenar macedońskir UAZMr Xmanat azerbejdżańskir UAZNr X manat azerskir UGQEr X$ekwele gwinejskie Gwinei Równikowejr jX vatu Vanuatur UBADr Xdinar Bośni i Hercegowinyr jXXfrank gwinejskir UMXPr X&peso srebrne meksykańskie (1861-1992)r jZX dinar irackir UERNr Xnakfa erytrejskar j\X(marka konwertybilna Bośni i Hercegowinyr jXrupia seszelskar j^Xdolar kanadyjskir USDDr Xdinar sudańskir jpXfunt cypryjskir UMADr Xdirham marokańskir jbXdinar kuwejckir jdXfrank burundyjskir ULTTr Xtalon litewskir UPGKr Xkina Papua Nowa Gwinear ULTLr X lit litewskir jhXdolar singapurskir UUZSr X som uzbeckir jjX-dobra Wysp Świętego Tomasza i Książęcejr UXFOr Xfrank złoty francuskir UMLFr Xfrank malijskir UESPr Xpeseta hiszpańskar! jlX rial irańskir" UZRZr# X zair zairskir$ jnX juan renminbir% USLLr& Xleone Sierra Leoner' UTNDr( Xdinar tunezyjskir) jPXdolar gujańskir* UESBr+ X#peseta hiszpańska (konto wymienne)r, UESAr- Xpeseta hiszpańska (Konto A)r. jtXdolar nowozelandzkir/ UFKPr0 Xfunt Wysp Falklandzkichr1 ULVLr2 Xłat łotewskir3 jvXdolar amerykański r4 UARPr5 Xpeso argentyńskie (1983-1985)r6 jxX som kirgiskir7 jzXpeso argentyńskier8 UILSr9 Xnowy szekel izraelskir: URONr; Xnowa leja rumuńskar< URSDr= X dinar serbskir> j~Xdinar bahrańskir? jX jen japońskir@ UARArA Xaustral argentyńskirB USDGrC Xfunt sudańskirD UPTErE Xescudo portugalskierF UXAUrG XzłotorH uUmonthsrI }rJ (U stand-alonerK }rL (UwiderM }rN (KXstyczeńrO KXlutyrP KXmarzecrQ KX kwiecieńrR KXmajrS KXczerwiecrT KXlipiecrU KX sierpieńrV K X wrzesieńrW K X październikrX K XlistopadrY K X grudzieńrZ uUnarrowr[ }r\ (KXsr] KXlr^ KXmr_ KXkr` Kj_ KXcra Kj^ Kj] K Xwrb K Xprc K j^ K Xgrd uuUformatre }rf (Uwiderg }rh (KXstyczniari KXlutegorj KXmarcark KXkwietniarl KXmajarm KXczerwcarn KXlipcaro KXsierpniarp K X wrześniarq K X październikarr K X listopadars K Xgrudniart uU abbreviatedru }rv (KXstyrw KXlutrx KXmarry KXkwirz KXmajr{ KXczer| KXlipr} KXsier~ K Xwrzr K Xpaźr K Xlisr K Xgrur uuuUcurrency_formatsr }r Nh2)r }r (h5Nh7Kh8KKr h:X ¤r j r h=KKr h?X #,##0.00 ¤r hAh;hBr hDNhEKKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KXPr KXWr KXŚr KjKj KXSr KXNr usUformatr }r (Uwider }r (KX poniedziałekr KXwtorekr KXśrodar KXczwartekr KXpiątekr KXsobotar KX niedzielar uU abbreviatedr }r (KXpon.r KXwt.r KXśr.r KXczw.r KXpt.r KXsob.r KXniedz.r uuuU meta_zonesr }r (U Alaska_Hawaiir }r Ucommonr sU Afghanistanr }r j sUAfrica_Westernr }r j sUEurope_Easternr }r (j Ulongr }r (Udaylightr XCzas wschodnioeuropejski letnir Ustandardr XCzas wschodnioeuropejskir uuUEurope_Westernr }r (j j }r (j XCzas zachodnioeuropejski letnir j XCzas zachodnioeuropejskir uuUAfrica_Easternr }r j sUEurope_Centralr }r (j j }r (j XCzas środkowoeuropejski letnir j XCzas środkowoeuropejskir uuUAlaskar }r j sUAfrica_Centralr }r j sU Aktyubinskr }r j sUAfrica_Southernr }r j sUAcrer }r j sUAfrica_FarWesternr }r j suUerasr }r (Uwider }r (KXp.n.e.r KXn.e.r uU abbreviatedr }r (KXp.n.e.r KXn.e.r uuu.PK[ծ|%site-packages/babel/localedata/nl.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX 1e kwartaalqKX 2e kwartaalqKX 3e kwartaalqKX 4e kwartaalquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XHH:mm:ssqRUformatqSX%(HH)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X HH:mm:ss vqXhSX%(HH)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X HH:mm:ss zq]hSX%(HH)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XHH:mmqbhSX %(HH)s:%(mm)sqcubuU languagesqd}qe(UgvqfXManxqgUguqhXGujaratiqiUscnqjX SiciliaansqkUromqlXRomaniqmUalgqnXAlgonkium-talenqoUaleqpXAleutqqUscoqrXSchotsqsUmniqtX ManipoeriquUgdqvX Schots GaelicqwUgaqxXIersqyUmnoqzX Manobo-talenq{Uosaq|XOsageq}Ugnq~XGuaraniqUaltqXZuid-AltaïschqUglqX GalicischqUmwrqXMarwariqUtyqX TahitischqUtwqXTwiqUttqXTataarsqUtrqXTurksqUtsqXTsongaqUtnqXTswanaqUtoqXTongaqUausqXAustralische talenqUavqXAvarischqUtkqX TurkmeensqUthqXThaisqUroaqX Romaanse taalqUtgqX TadzjieksqUteqXTeloegoeqUugaqX OegaritischqUmwlqX MirandeesqUkcgqXTyapqUsmiqX Sami-taalqUfatqXFantiqUfanqXFangqUwoqXWolofqUrmqX Reto-RomaansqUdinqXDinkaqUblaqXSiksikaqUcmcqXChamische talenqUmlqX MalayalamqUzhqXChineesqUtemqXTimneqUen_CAqXCanadees EngelsqUnwcqXKlassiek NewariqUzaqXZhuangqUcauqXKaukasische taalqUzuqXZuluqUterqXTerenoqUtetqXTetumqUmncqXMantsjoeqUkutqXKutenaiqUsukqXSukumaqUkumqXKumykqUsusqXSoesoeqUnewqXNewariqUsuxqX SoemerischqUdenqXSlaveqUmenqXMendeqUmulqXMeerdere talenqUlezqXLezgischqUrootqXRootqUekaqXEkajukqUakkqX AkkadischqUdraqXDravidische taalqUjrbqXJudeo-ArabischqUsgnqX GebarentalenqUsgaqXOudiersqUapaqX Apache-talenqUbraqXBrajqUchbqXChibchaqUchgqXChagataiqUchkqXChuukeesqUchmqXMariqUchnqXChinook-jargonqUchoqXChoctawqUchprX ChipewyanrUchrrXCherokeerUchyrXCheyennerUtirXTigrinyarUvotrXVotischr Umgr X Malagasischr Uibar XIbanr UmorX MoldavischrUmnrXMongoolsrUmirXMaorirUmhrX MarshalleesrUmkrX MacedonischrUmtrXMalteesrUcairX Midden-Amerikaans Indiaanse taalrUdelrXDelawarerUmsrXMaleisrUmrr XMarathir!Utar"XTamilr#Umyr$XBirmeesr%Ucadr&XCaddor'Usrnr(X Sranantongor)Utair*XTai-taalr+Uafhr,XAfrihilir-Usitr.XSino-Tibetaanse taalr/Uenmr0X Middelengelsr1Uen_AUr2XAustralisch Engelsr3Unynr4XNyankoler5Unyor6XNyoror7Unymr8XNyamwezir9Usior:XSiouaanse talenr;Umapr<X Austronesischr=Umasr>XMasair?Ulahr@XLahndarAUladrBXLadinorCUfyrDXFriesrEUsnkrFXSoninkerGUfarHXPerzischrIUmadrJXMadureesrKUmagrLXMagahirMUmairNXMaithilirOUfirPXFinsrQUfjrRXFijischrSUmanrTXMandingorUUegyrVX OudegyptischrWUzndrXXZanderYUssrZXSwatir[Usrr\XServischr]Usqr^XAlbaneesr_Uswr`XSwahiliraUsvrbXZweedsrcUsurdX SoendaneesreUstrfX Zuid-SothorgUskrhXSlowaaksriUsirjX SingaleesrkUshrlXServokroatischrmUsornX SomalischroUsnrpXShonarqUsmrrXSamoaansrsUslrtXSloveensruUscrvX SardinischrwUsarxX SanskrietryUsgrzXSangor{User|X Noord-Samischr}Usdr~XSindhirUzenrXZenagarUkbdrX KabardischrUafarXAfro-Aziatische taalrUcsbrX KasjoebischrUlgrXGandarUlbrX LuxemburgsrUfiurXFins-Oegrische taalrUlnrXLingalarUlorXLaorUlirXLimburgsrUbynrXBlinrUltrXLitouwsrUlurX Luba-KatangarUfilrX FilippijnsrUyirXJiddischrUnonrXOudnoorsrUcebrXCebuanorUyorXYorubarUnogrXNogairUbatrXBaltische taalrUdakrXDakotarUdarrXDargwarUdayrXDajakrUssarXNilo-Saharaanse taalrUkperXKpellerUelrXGrieksrUeorX EsperantorUenrXEngelsrUlamrXLambarUeerXEwerUmdfrXMoksharUfrrXFransrUmdrrXMandarrUetrXEstlandsrUesrXSpaansrUrurXRussischrUgonrXGondirUgohrX OudhoogduitsrUsmsrX Skolt SamirUsmnrX Inari SamirUsmjrX Lule SamirUde_ATrXOostenrijks DuitsrUgotrXGothischrUrnrXRundirUrorXRoemeensrUdsbrX NedersorbischrUsmarX Zuid-SamischrUgorrX GorontalorUastrX AsturischrUwalrXWalamorUcrhrX Krim-TataarsrUathrXAthapascaanse talenrUgezrXGeezrUxhrXXhosarUffrXFulahrUkforXKororUmakrX MakassaarsrUzaprXZapotecrUkokrXKonkanirUkosrX KosraeaansrUforX FaeröersrUtogrX Nyasa TongarUhuprXHuparUudmrXUdmurtrUbejrXBejarUbemrXBembarUtsirX TsimshianrUberrXBerbersrUnzirXNzimar Usair XZuid-Amerikaans Indiaanse taalr Uangr X Oudengelsr UprarX Prakrit-talenrUbhorXBhojpurirUsalrXSalishan-talenrUprorXOudprovençaalsrUrajrX RajasthanirUsadrXSandawerUrarrX RarotonganrUes_419rXLatijns-Amerikaans SpaansrUraprXRapanuirUsasr XSasakr!Ucarr"X Caribischr#Uminr$X Minangkabaur%Umicr&XMi'kmaqr'Uefir(XEfikr)Uarnr*X Araukaansr+Uypkr,X Yupik-talenr-Umisr.X Diverse talenr/Ukacr0XKachinr1Ukabr2XKabyler3Ukaar4X Karakalpaksr5Ukajr6XJjur7Ukamr8XKambar9Ukarr:XKarenr;Ukawr<XKawir=Ufr_CHr>XZwitsers Fransr?Utyvr@X TuvinischrAUfr_CArBXCanadees FransrCUkarDX GeorgischrEUdoirFXDogrirGUkgrHXKongorIUkkrJXKazachsrKUkjrLXKuanyamarMUkirNXKikuyurOUkorPXKoreaansrQUknrRXKannadarSUkmrTXKhmerrUUklrVX KalaallisutrWUksrXXKashmirirYUkrrZXKanurir[Ukwr\XCornishr]Ukvr^XKomir_Ukur`X KoerdischraUkyrbX KirgizischrcUtklrdXTokelaureUbuarfXBuriatrgUmgarhX MiddeliersriUhitrjX HettitischrkUdyurlXDyularmUdernXDuitsroUdarpXDeensrqUdzrrXDzongkharsUluirtXLuisenoruUdvrvXDivehirwUhilrxX HiligaynonryUhimrzX Himachalir{Ugemr|XGermaanse taalr}Ucrpr~XCreools of PidginrUqurXQuechuarUbasrXBasarUgbarXGbayarUbadrXBandarUbanrXBalineesrUbalrX BaloetsjirUshnrXShanrUbairXBamileke-talenrUarprXArapahorUartrXKunstmatige taalrUarwrXArawakrUarcrXArameesrUen_USrXAmerikaans EngelsrUsemrXSemitische taalrUselrXSelkuprUnubrXNubische talenrUbtkrXBatakrUlusrXLushairUmusrXCreekrUluarX Luba-LuluarUirorX Irokese talenrUirarX Iraanse taalrUmunrX Munda-talenrUlunrXLundarUluorXLuorUwarX WallonischrUtuprX Tupi-talenrUjvrXJavaansrUtutrXAltaïsche taalrUtumrX ToemboekarUjarXJapansrUcoprXKoptischrUilorXIlokorUlarXLatijnrUgwirX GwichʼinrUundrX OnbepaaldrUtlirXTlingitrUtlhrXKlingonrUchrXChamorrorUcorX CorsicaansrUcarX CatalaansrUcerXChechenrUponrX PohnpeiaansrUcyrXWelshrUsahrXYakutrUcsrX TsjechischrUcrrXCreerUbntrXBantoerUcvrX TsjoevasjischrUcurX KerkslavischrUlvrXLetlandsrUdumrXMiddelnederlandsrUptrX PortugeesrUduarXDualarUfrorXOudfransrUyaprXYapeesrUfrmrX MiddelfransrUtivrXTivrUyaorXYaorUparXPunjabirUxalrXKalmykrUes_ESrXIberisch SpaansrUpirXPalirUen_GBrX Brits EngelsrUgayrXGayorUotorX Otomi-talenrUotarXOttomaans-TurksrUhmnrXHmongrUmyvrXErzyar Ugaar XGar Ufurr X Friulischr UkhirX Khoisan-taalrUainrXAinurUslarXSlavische taalrUverXVendarUvirX VietnameesrUisrXIJslandsrUkhorX KhotaneesrUiurX InuktitutrUitrX ItaliaansrUvor XVolapükr!Uiir"X Sichuan Yir#Uikr$XInupiaqr%Uior&XIdor'Uiner(XIndo-Europese taalr)Uiar*X Interlinguar+Ujprr,XJudeo-Perzischr-Uier.X Interlinguer/Uidr0X Indonesischr1Uigr2XIgbor3Upapr4X Papiamentor5Uewor6XEwondor7Upaur8X Palauaansr9Upaar:X Papoeataalr;Upagr<X Pangasinanr=Usatr>XSantalir?Upalr@XPahlavirAUpamrBXPampangarCUphirDXFilippijnse taalrEUcelrFXKeltische taalrGUphnrHX FoenicischrIUnicrJXNiger-Kordofanische taalrKUniarLXNiasrMUdgrrNXDogribrOUsyrrPXSyriacrQUniurRXNiueaansrSUgswrTXZwitsers DuitsrUUcchrVXAtsamrWUjborXXLojbanrYUnahrZXNahuatlr[Usamr\XSamaritaans-Arameesr]Uhair^XHaidar_Ugmhr`XMiddelhoogduitsraUcusrbXKoesjitische taalrcUwenrdXSorbische talenreUadyrfXAdyghergUelxrhX ElamitischriUadarjXAdangmerkUpt_PTrlXIberisch PortugeesrmUhawrnX HawaïaansroUbinrpXBinirqUbikrrXBikolrsUpt_BRrtXBraziliaans PortugeesruUmosrvXMossirwUmohrxXMohawkryUtlrzXTagalogr{Uzh_Hansr|XVereenvoudigd Chineesr}Uzh_Hantr~XTraditioneel ChineesrUtvlrXTuvalurUijorXIjorUkmbrXKimbundurUpeorX OudperzischrUumbrXUmbundurUtmhrXTamashekrUfonrXFonrUhsbrX OppersorbischrUberX Wit-RussischrUbgrXBulgaarsrUbarX BasjkiersrUpsrXPasjtoerUbmrXBambararUbnrX BengaleesrUborX TibetaansrUbhrXBiharirUbirXBislamarUbrrXBretonsrUbsrXBosnischrUruprX AromaniaansrUomrXOromorUojrXOjibwarUacerXAtjeesrUachrXAkolirUocrX OccitaansrUkrurXKurukhrUsrrrXSererrUkrorXKrurUkrcrXKarachay-BalkarrUndsrX LaagduitsrUosrX OssetischrUorrXOriyarUsogrXSogdischrUnsorX Noord-SothorUsonrXSonghairUde_CHrXZwitsers HoogduitsrUvairXVairUwakrXWakashan-talenrUlolrXMongorUmkhrXMon-Khmer-taalrUawarXAwadhirUlozrXLozirUgilrX GilberteesrUwasrXWashorUwarrXWarayrUhzrXHererorUhyrXArmeensrUanrX AragoneesrUsidrXSidamorUhrrX KroatischrUhtrX HaïtiaansrUhurXHongaarsrUhirXHindirUhorX Hiri MoturUharXHausarUbugrXBugineesrUherX HebreeuwsrUuzrXOezbeeksrUurrXUrdurUplrXPoolsrUukrX OekraïensrUugrXOeigoersrUaarXAfarrUabrX AbchazischrUaerX AvestischrUafrX AfrikaansrUakrXAkanrUamrXAmhaarsrUnl_BErXVlaamsr Ueur XBaskischr Uasr XAssameesr UarrXArabischrUinhrXIngoesjrUtpirX Tok PisinrUmynrX Mayan-talenrUayrXAymararUkharXKhasirUazrXAzerbeidzjaansrUincrX Indische taalrUnlrX NederlandsrUnnr XNoors - Nynorskr!Unor"XNoorsr#Unar$XNaurur%Unbr&XNoors - Bokmålr'Unair(XNoord-Amerikaans Indiaansr)Undr*X Noord-Ndbeler+Uner,XNepaleesr-Ungr.XNdongar/Unyr0XNyanjar1Unapr2X Napolitaansr3Ugrbr4XGrebor5Ugrcr6X Oudgrieksr7Unrr8X Zuid-Ndbeler9Utigr:XTigrer;Unvr<XNavajor=Uzunr>XZunir?Urwr@X KinyarwandarAUcperBX%Op Engels gebaseerd Creools of PidginrCUcpfrDX$Op Frans gebaseerd Creools of PidginrEUcpprFX(Op Portugees gebaseerd Creools of PidginrGuU territoriesrH}rI(UBDrJX BangladeshrKUBErLXBelgiërMUBFrNX Burkina FasorOUBGrPX BulgarijerQUVErRX VenezuelarSUBArTXBosnië en HerzegovinarUUBBrVXBarbadosrWUWFrXXWallis en FutunarYUBLrZXSaint Barthélemyr[UBMr\XBermudar]UBNr^XBruneir_UBOr`XBoliviaraUBHrbXBahreinrcUBIrdXBurundireUBJrfXBeninrgUBTrhXBhutanriU011rjX West-AfrikarkUBVrlX BouveteilandrmUBWrnXBotswanaroU014rpX Oost-AfrikarqU015rrX Noord-AfrikarsUBRrtX BraziliëruU017rvXCentraal-AfrikarwU018rxXZuidelijk AfrikaryU019rzXAmerikar{UBYr|X Wit-Ruslandr}UBZr~XBelizerULVrXLetlandrURWrXRwandarURSrXServiërUTLrX Oost-TimorrURErXRéunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadzjikistanrUROrX RoemeniërUTKrXTokelaurUGWrX Guinee-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX,Zuid-Georgië en Zuidelijke SandwicheilandenrUGRrX GriekenlandrUGQrXEquatoriaal-GuinearUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrX Frans-GuyanarUGErXGeorgiërUGDrXGrenadarU021rXNoordelijk AmerikarUGBrXVerenigd KoninkrijkrUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GroenlandrU029rXCaribisch gebiedrUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunesiërUJMrXJamaicarU013rXMidden-AmerikarUWSrXSamoarU419rX'Latijns-Amerika en het Caribisch gebiedrUHRrXKroatiërUBSrX Bahama’srUHTrXHaïtirUHUrX HongarijerUHKrXHongkong SAR van ChinarU039rX Zuid-EuroparUHNrXHondurasrUFIrXFinlandrU142rXAziërU030rX Oost-AziërU034rX Zuid-AziërU035rXZuidoost-AziërUPRrX Puerto RicorUPSrXPalestijns GebiedrU830rXKanaaleilandenrUFKrXFalklandeilandenrUIOrX%Britse Gebieden in de Indische OceaanrUPWrXPalaurUPTrXPortugalrUSJrXSvalbard en Jan MayenrUMDrX MoldaviërUFMrX MicronesiërUIQrXIrakrUPArXPanamarUPFrXFrans-PolynesiërUPGrXPapoea-Nieuw-GuinearUPErXPerurUPKrXPakistanrUPHrX Filipijnenr UFOr XFaeröerr UPNr XPitcairnr UPLrXPolenrUPMrXSaint Pierre en MiquelonrUZMrXZambiarUEHrXWestelijke SahararURUrXRuslandrUEErXEstlandrUEGrXEgypterUZArX Zuid-AfrikarUECrXEcuadorrUITr XItaliër!UVNr"XVietnamr#UZZr$XOnbekend of onjuist gebiedr%USBr&XSalomonseilandenr'UETr(X Ethiopiër)USOr*XSomaliër+UZWr,XZimbabwer-USAr.XSaoedi-Arabiër/UESr0XSpanjer1UERr2XEritrear3UMEr4X Montenegror5UAQr6X Antarcticar7UMGr8X Madagaskarr9UMFr:X Sint-Maartenr;UMAr<XMarokkor=UMCr>XMonacor?UUZr@X OezbekistanrAUMMrBXMyanmarrCUMLrDXMalirEUMOrFXMacao SAR van ChinarGUMNrHX MongoliërIUHMrJXHeard- en McDonaldeilandenrKUASrLXAmerikaans SamoarMUMKrNX MacedoniërOUMUrPX MauritiusrQUMTrRXMaltarSUMWrTXMalawirUUMVrVXMaldivenrWUMQrXX MartiniquerYUMPrZXNoordelijke Marianeneilandenr[UMSr\X Montserratr]UMRr^X Mauritaniër_UIMr`X Isle of ManraUUGrbXOegandarcUTZrdXTanzaniareUMYrfX MaleisiërgUMXrhXMexicoriUILrjXIsraëlrkUFRrlX FrankrijkrmUAWrnXArubaroUDOrpXDominicaanse RepubliekrqUSHrrX Sint-HelenarsUVCrtXSaint Vincent en de GrenadinesruU054rvX MelanesiërwUDJrxXDjiboutiryUFJrzXFijir{U057r|XMicronesische regior}U172r~X$Gemenebest van Onafhankelijke StatenrU053rXAustralië en Nieuw-ZeelandrUNIrX NicaraguarUNLrX NederlandrUNOrX NoorwegenrUNArXNamibiërUVUrXVanuaturUNCrXNieuw-CaledoniërUNErXNigerrUNFrX NorfolkeilandrUNGrXNigeriarUNZrX Nieuw-ZeelandrUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolynesiërUCIrX IvoorkustrUCHrX ZwitserlandrUCOrXColombiarUCNrXChinarUCMrXKameroenrUCLrXChilirUCCrX CocoseilandenrUCArXCanadarUCGrXCongorUCFrXCentraal-Afrikaanse RepubliekrUCDrXCongo-KinshasarUCZrX TsjechiërUCYrXCyprusrUCXrXChristmaseilandrUCSrXServië en MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX KaapverdiërUCUrXCubarUSZrX SwazilandrUSYrXSyriërUKGrX KirgiziërUKErXKeniarUSRrXSurinamerU143rXCentraal-AziërUKHrXCambodjarUKNrXSaint Kitts en NevisrUKMrXComorenrUSTrXSao Tomé en PrinciperUSKrX SlowakijerUKRrX Zuid-KorearUSIrX SloveniërUKPrX Noord-KorearUKWrXKoeweitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellenrUKZrX KazachstanrUKYrXCaymaneilandenrUSGrX SingaporerUSErXZwedenrUSDrXSoedanrU151rX Oost-EuroparU150rXEuroparUDMrXDominicarU155rX West-EuroparU154rX Noord-EuroparUVGrXBritse MaagdeneilandenrUDErX DuitslandrUYErXJemenrUMHrXMarshalleilandenrU062rXZuidelijk Centraal-AziërUDZrXAlgerijer UUSr XVerenigde Statenr UUYr XUruguayr UYTrXMayotterUUMrX'Amerikaanse kleinere afgelegen eilandenrULBrXLibanonrULCrX Saint LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTrXTrinidad en TobagorUTRrXTurkijerULKr X Sri Lankar!ULIr"X Liechtensteinr#UCKr$X Cookeilandenr%UTOr&XTongar'ULTr(XLitouwenr)ULUr*X Luxemburgr+ULRr,XLiberiar-ULSr.XLesothor/UTHr0XThailandr1UTFr2X0Franse Gebieden in de zuidelijke Indische Oceaanr3UTGr4XTogor5UTDr6XTsjaadr7UTCr8XTurks- en Caicoseilandenr9ULYr:XLibiër;UVAr<X Vaticaanstadr=U145r>X West-Aziër?UAEr@XVerenigde Arabische EmiratenrAUADrBXAndorrarCUAGrDXAntigua en BarbudarEUAFrFX AfghanistanrGUAIrHXAnguillarIUVIrJXAmerikaanse MaagdeneilandenrKUISrLXIJslandrMUIRrNXIranrOUAMrPXArmeniërQUALrRXAlbaniërSUAOrTXAngolarUUANrVXNederlandse AntillenrWU003rXX Noord-AmerikarYU002rZXAfrikar[U001r\XWereldr]UARr^X Argentiniër_UAUr`X AustraliëraUATrbX OostenrijkrcU005rdX Zuid-AmerikareUINrfXIndiargUAXrhX AlandeilandenriU009rjXOceaniërkUAZrlX AzerbeidzjanrmUIErnXIerlandroUIDrpX IndonesiërqUJOrrX JordaniërsUQUrtX Europese UnieruUUArvX OekraïnerwUQArxXQatarryUDKrzX Denemarkenr{UMZr|X Mozambiquer}UQOr~XOceanië (overige)ruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X d MMM yyyyrhSX%(d)s %(MMM)s %(yyyy)srubUfullrhO)r}r(h3XEEEE d MMMM yyyyrhSX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrhO)r}r(h3X d MMMM yyyyrhSX%(d)s %(MMMM)s %(yyyy)srubUshortrhO)r}r(h3Xdd-MM-yyrhSX%(dd)s-%(MM)s-%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUZWDrXZ$rUVUVrXVTrUUYUrXUr$rUSYPrXLSrUMZMrXMtrUSCRrXSRrUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUGBPrXGBPrUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUNLGrXflrUJMDrXJ$rUGELrXlarirUAFNrXAfrUTRLrXTLrUBDTrXTkrUYERrXYRlrUANGrXNA f.rUXCDrXEC$rUNOKrXNKrrUINRrXINRr UMXNr XMEX$r UBTNr XNur UCOPrXCol$rUIDRrXRprUHNLrXLrUFJDrXF$rUETBrXBrrUBZDrXBZ$rUDOPrXRD$rUQARrXQRrUSEKrXSKrrUSRGr XSfr!UIEPr"XIR£r#UBBDr$XBDS$r%UGTQr&XQr'UVEBr(XBer)UCLPr*XCh$r+UALLr,Xlekr-UKZTr.XTr/UTTDr0XTT$r1URONr2Xleir3UOMRr4XROr5USBDr6XSI$r7UPLNr8XZlr9UKESr:XK Shr;UGYDr<XG$r=UMKDr>XMDenr?UTWDr@XNT$rAUTOPrBXT$rCUGNFrDXGFrEUIQDrFXIDrGUBAMrHXKMrIUCADrJXCan$rKUCVErLXCVEscrMUKWDrNXKDrOUBIFrPXFburQUSGDrRXS$rSUSTDrTXDbrUUIRRrVXRIrWUCNYrXXYrYUCYPrZX£Cr[UMTLr\XLmr]UUSDr^XUSDr_UKGSr`XsomraUARSrbXArg$rcUSZLrdXEreUBHDrfXBDrguU time_zonesrh}ri(UAtlantic/Canaryrj}rkUcityrlXCanarische EilandenrmsU Europe/Lisbonrn}rojlXLissabonrpsUAmerica/Meridarq}rrjlXMéridarssU Indian/Mahert}rujlXMahérvsUEurope/Copenhagenrw}rxjlX KopenhagenrysUAmerica/St_Luciarz}r{jlX St. Luciar|sU Europe/Tiraner}}r~jlXTiranarsUPacific/Noumear}rjlXNouméarsUEurope/Zaporozhyer}rjlX ZaporizjarsU Europe/Moscowr}rjlXMoskoursUAmerica/El_Salvadorr}rjlXSalvadorrsU Asia/Dushanber}rjlXDusjanbersUEurope/Brusselsr}rjlXBrusselrsUAmerica/Mazatlanr}rjlX MazatlánrsUAsia/Ulaanbaatarr}rjlX UlaanbaatorrsUIndian/Maldivesr}rjlXMaldivenrsU Europe/Parisr}rjlXParijsrsU Europe/Athensr}rjlXAthenersUAmerica/Curacaor}rjlXCuraçaorsUAfrica/Khartoumr}rjlXKhartoemrsU Asia/Manilar}rjlXManillarsU Europe/Berlinr}rjlXBerlijnrsU Europe/Zurichr}rjlXZürichrsUAmerica/Cordobar}rjlXCórdobarsU America/Belemr}rjlXBelémrsUAfrica/Sao_Tomer}rjlX Sao TomérsU Europe/Warsawr}rjlXWarschaursUAsia/Krasnoyarskr}rjlX KrasnojarskrsUAsia/Yekaterinburgr}rjlXJekaterinenburgrsU Asia/Tehranr}rjlXTeheranrsU Asia/Bakur}rjlXBakoersUAmerica/St_Johnsr}rjlX St. JohnsrsUIndian/Reunionr}rjlXRéunionrsUAmerica/St_Thomasr}rjlX St. ThomasrsUAmerica/Mexico_Cityr}rjlX Mexico-stadrsUAtlantic/Cape_Verder}rjlX KaapverdiërsUAsia/Hong_Kongr}rjlXHongkongrsU Indian/Cocosr}rjlX CocoseilandenrsUPacific/Enderburyr}rjlXEnderbury-eilandrsUEurope/Budapestr}rjlX BoedapestrsU Asia/Sakhalinr}rjlXSachalinrsUAmerica/Argentina/Rio_Gallegosr}rjlX Río GallegosrsU Pacific/Waker}rjlX Wake-eilandrsUPacific/Gambierr}rjlXGambier-eilandenrsU Asia/Katmandur}rjlX KathmandursUEurope/Uzhgorodr}rjlX OezjhorodrsUPacific/Ponaper}rjlXPohnpeirsUAmerica/Sao_Paulor}rjlX São PaulorsU Asia/Tashkentr}rjlXTasjkentrsU Asia/Tokyor}rjlXTokiorsUPacific/Easterr}rjlX PaaseilandrsUAtlantic/South_Georgiar}rjlX Zuid-GeorgiërsUAmerica/Maceior}rjlXMaceiór sU Asia/Ashgabatr }r jlX Asjchabadr sUEurope/Istanbulr }rjlX IstanboelrsU Asia/Irkutskr}rjlXIrkoetskrsUEurope/Bucharestr}rjlX BoekarestrsUAmerica/Porto_Velhor}rjlX Pôrto VelhorsUPacific/Galapagosr}rjlX GalápagosrsU Asia/Bishkekr}rjlXBisjkekrsUAmerica/Bogotar}r jlXBogotár!sU Asia/Aqtober"}r#jlXAqtöber$sU Asia/Yerevanr%}r&jlXErevanr'sUAmerica/Cuiabar(}r)jlXCuiabár*sUIndian/Christmasr+}r,jlXChristmaseilandr-sUAfrica/Addis_Ababar.}r/jlX Addis Abebar0sUAmerica/Cancunr1}r2jlXCancúnr3sU Asia/Kuwaitr4}r5jlXKoeweitr6sUAtlantic/Azoresr7}r8jlXAzorenr9sUAsia/Jerusalemr:}r;jlX Jeruzalemr<sU Asia/Shanghair=}r>jlXSjanghair?sUAmerica/St_Kittsr@}rAjlX St. KittsrBsU Asia/BeirutrC}rDjlXBeiroetrEsU Asia/BahrainrF}rGjlXBahreinrHsUAtlantic/FaeroerI}rJjlXFaeröerrKsUAsia/KamchatkarL}rMjlX KamtsjatkarNsU Asia/RiyadhrO}rPjlXRiyadrQsU Europe/LondonrR}rSjlXLondenrTsU Asia/YakutskrU}rVjlXJakoetskrWsUAtlantic/St_HelenarX}rYjlX Sint-HelenarZsU Asia/Almatyr[}r\jlXAlma-Atar]sU Africa/Lomer^}r_jlXLomér`sUAmerica/St_Vincentra}rbjlX St. VincentrcsUAmerica/Grand_Turkrd}rejlXTurks EilandenrfsUPacific/Marquesasrg}rhjlXMarquesaseilandenrisUAmerica/Asuncionrj}rkjlX AsunciónrlsU Europe/Viennarm}rnjlXWenenrosUAmerica/Montrealrp}rqjlX MontréalrrsUEurope/Luxembourgrs}rtjlX LuxemburgrusU Etc/Unknownrv}rwjlXOnbekendrxsU Africa/Asmerary}rzjlXAsmarar{sUAntarctica/South_Poler|}r}jlXZuidpoolr~suUscriptsr}r(UGururXGurmukhirUHebrrX HebreeuwsrUZzzzrX&Code voor ongecodeerde schriftsystemenrUPhnxrX FoenicischrUMoonrXMoonrUChamrXChamrUArabrXArabischrUGujrrXGujaratirUZxxxrXCode voor ongeschreven talenrULycirXLycischrUSinhrXSinhalarUTalurX Nieuw Tai LuerUMongrXMongoolsrUXpeorX OudperzischrUVisprXZichtbare spraakrUOlckrXOl ChikirUTalerXTai LerUMandrX MandaeansrUMlymrX MalayalamrUTibtrX TibetaansrUKalirXKayah LirUJpanrXJapansrUPlrdrXPollard-fonetischrUKanarXKatakanarULydirXLydischrULepcrXLepcharUYiiirXYirUJavarXJavaansrUOryarXOriyarULaoorXLaorUUgarrX UgaritischrUCyrlrX CyrillischrUVaiirXVairUArmnrXArmeensrUCyrsrXOudkerkslavisch CyrillischrUKhmrrXKhmerrUSylorX Syloti NagrirUItalrX Oud-italischrUXsuxrXSumero-Akkadian CuneiformrUThaarXThaanarUThairXThaisrUCprtrXCyprischrULinbrX Lineair BrULinarX Lineair ArUOsmarXOsmanyarUHirarXHiraganarUHanirXHanrUEgydrXEgyptisch demotischrUQaairX OvergeërfdrUEgyhrXEgyptisch hiëratischrUCansrX&Verenigde Canadese Aboriginal-symbolenrUEgyprXEgyptische hiërogliefenrUTfngrXTifinaghrUShawrXShavianrUCirtrXCirthrUGeorrX GeorgischrUTengrXTengwarrUHrktrXKatakana of HiraganarUGeokrXGeorgisch KhutsurirUOgamrXOghamrUDsrtrXDeseretrUGothrXGothischrUHanorXHanunoorUBalirXBalineesr UHangr XHangulr UCarir XCarischr UTagbr XTagbanwar UHansr XVereenvoudigd Hanr UHantr XTraditioneel Hanr URoror X Rongorongor UDevar X Devanagarir UIndsr XIndusr UBopor XBopomofor UMymrr XMyanmarr UTglgr XTagalogr UPermr X Oudpermischr UBugir XBugineesr UPhagr XPhags-par UBrair XBrailler UBrahr XBrahmir UBatkr! XBatakr" UMeror# X Meroïtischr$ ULimbr% XLimbur& UMteir' XMeiteir( UTelur) XTelugur* UTamlr+ XTamilr, USarar- XSaratir. ULatgr/ XGaelisch Latijnr0 ULatfr1 XGotisch Latijnr2 UKharr3 X Kharoshthir4 UNkoor5 XN’Kor6 ULatnr7 XLatijnr8 UMayar9 XMayahiërogliefenr: ULanar; XLannar< UEthir= X Ethiopischr> UHmngr? X Pahawh Hmongr@ UBuhdrA XBuhidrB UCoptrC XKoptischrD UGlagrE X GlagolitischrF URunrrG XRunicrH UOrkhrI XOrkhonrJ UHungrK X OudhongaarsrL UGrekrM XGrieksrN UCherrO XCherokeerP UZyyyrQ XAlgemeenrR USyrcrS XSyriacrT UBlisrU X BlissymbolenrV UBengrW X BengaleesrX USyrerY XEstrangelo ArameesrZ USyrjr[ X West-Arameesr\ USyrnr] X Oost-Arameesr^ UKndar_ XKannadar` uUvariantsra }rb (UNEDISrc XNatisone-dialectrd UREVISEDre XGewijzigde spellingrf UAREVMDArg X West-Armeensrh UFONIPAri X Internationaal Fonetisch Alfabetrj U1996rk XDuitse spelling van 1996rl UOSOJSrm XOseacco/Osojane-dialectrn UNJIVAro XGniva/Njiva-dialectrp UBOONTrq X Boontlingrr USCOUSErs XLiverpools (Scouse)rt UAREVELAru X Oost-Armeensrv UMONOTONrw X Monotonaalrx UROZAJry XResiaansrz UPOSIXr{ XComputerr| UFONUPAr} XOeralisch Fonetisch Alfabetr~ UBISKEr XSan Giorgio/Bila-dialectr USOLBAr XStolvizza/Solbica-dialectr UPOLYTONr X Polytonaalr USAAHOr XSahor U1901r XTraditionele Duitse spellingr uUnumber_symbolsr }r (Ugroupr X.r UnativeZeroDigitr X0r U exponentialr jeUperMiller X‰r Unanr XNaNr Udecimalr X,r U percentSignr h@Ulistr X;r U patternDigitr X#r UplusSignr X+r Uinfinityr X∞r U minusSignr h6uUcurrency_namesr }r (UXXXr X Geen valutar jXAlgerijnse dinarr ULVRr X Letse roebelr UGHSr X Ghanese cedir UBOPr XBoliviaanse pesor UEGPr XEgyptisch pondr jXBulgaarse harde levr UBGNr XBulgaarse nieuwe levr UPABr XPanamese balboar UYUMr XJoegoslavische noviy-dinarr jXZimbabwaanse dollarr UGHCr XGhanese cedi (1979-2007)r UXBDr XEuropese rekeneenheid (XBD)r jX Bolivianor UXBAr XEuropese samengestelde eenheidr jX Deense kroonr UXBCr XEuropese rekeneenheid (XBC)r UXBBr XEuropese monetaire eenheidr UBWPr XBotswaanse pular jX Libanees pondr jXTanzaniaanse shillingr UVNDr XVietnamese dongr jXNamibische dollarr UAOAr XAngolese kwanzar UWSTr XWest-Samoaanse talar UAONr X"Angolese nieuwe kwanza (1990-2000)r jXCambodjaanse rielr jXMaleisische ringgitr UAOKr XAngolese kwanza (1977-1990)r USOSr XSomalische shillingr UKYDr XCaymaneilandse dollarr jXLibische dinarr UUAHr XOekraïense hryvniar UUAKr XOekraïense karbovanetzr jXOegandese shillingr jXJordaanse dinarr UAORr X&Angolese kwanza reajustado (1995-1999)r USURr X Sovjet-roebelr UAWGr XArubaanse guldenr jXSaoedische rialr UFIMr X Finse markkar jXHongkongse dollarr j XSurinaamse guldenr UTPEr XTimorese escudor UMGFr XMalagassische francr UCHEr XWIR euror jXZwitserse francr UGIPr XGibraltarees pondr jXWit-Russische roebelr j,X Albanese lekr UXPDr X Palladiumr UUGSr XOegandese shilling (1966-1987)r jXMauritaanse ouguiyar UBOVr XBoliviaanse mvdolr UHRKr XKroatische kunar jXDjiboutiaanse francr UHRDr XKroatische dinarr UPESr X Peruaanse solr UEQEr XEkweler UITLr XItaliaanse lirer UXAFr XCFA-franc BEACr UBNDr XBruneise dollarr UISKr XIJslandse kroonr UZALr X!Zuid-Afrikaanse rand (financieel)r USRDr XSurinaamse dollarr UNIOr XNicaraguaanse córdoba oror ULAKr XLaotiaanse kipr UNICr XNicaraguaanse córdobar jXNepalese rupeer UMZEr XMozambikaanse escudor jXUruguayaanse peso uruguayor ULUCr XLuxemburgse convertibele francr jXJamaicaanse dollarr UFRFr X Franse francr UMAFr XMarokkaanse francr UUYIr X+Uruguayaanse peso en geïndexeerde eenhedenr! jXOude Mozambikaanse meticalr" UMZNr# XMozambikaanse meticalr$ UPHPr% XFilipijnse pesor& jXZuid-Afrikaanse randr' URHDr( XRhodesische dollarr) UGWPr* XGuinee-Bissause pesor+ ULUFr, XLuxemburgse frankr- UBELr. XBelgische frank (financieel)r/ UBECr0 XBelgische frank (convertibel)r1 UNGNr2 XNigeriaanse nairar3 UYUNr4 X!Joegoslavische convertibele dinarr5 jXBelgische frankr6 UPLZr7 XPoolse zloty (1950-1995)r8 jXCostaricaanse colónr9 jX Turkse lirer: UDEMr; X Duitse markr< UEEKr= XEstlandse kroonr> jXMalawische kwachar? j0XTrinidad en Tobago-dollarr@ jXSrilankaanse rupeerA jXSlowaakse korunarB jLXKaapverdische escudorC jXPakistaanse rupeerD jXHongaarse forintrE jXOude Roemeense leurF UXEUrG XEuropean Currency UnitrH jXBermuda-dollarrI j4X Omaanse rialrJ jXLesothaanse lotirK ULSMrL XMalotirM jXMongoolse tugrikrN jX Armeense dramrO UYUDrP XJoegoslavische harde dinarrQ UBUKrR X Birmese kyatrS jX Syrisch pondrT jX Qatarese rialrU UXDRrV XSpecial Drawing RightsrW jXNederlandse guldenrX UGEKrY XGeorgische kupon laritrZ UMTPr[ X Maltees pondr\ jXBrits pond sterlingr] jXGeorgische larir^ USHPr_ XSint-Heleense pondr` jXAfghanira j6XSalomonseilandse dollarrb UCSKrc XTsjechoslowaakse harde korunard UKPWre XNoord-Koreaanse wonrf UXRErg X RINET-fondsenrh UCSDri XOude Servische dinarrj UAFArk XAfghani (1927-2002)rl UTHBrm X Thaise bahtrn UBYBro X'Wit-Russische nieuwe roebel (1994-1999)rp jXBengalese takarq UGRDrr XGriekse drachmers jXJemenitische rialrt UDDMru XOost-Duitse ostmarkrv jdXSwazische lilangenirw UHTGrx XHaïtiaanse gourdery UTRYrz XNieuwe Turkse lirer{ UMGAr| XMalagassische ariaryr} jXNederlands-Antilliaanse guldenr~ ULRDr XLiberiaanse dollarr URWFr XRwandese francr jX Noorse kroonr UMXVr X$Mexicaanse unidad de inversion (UDI)r j:XKeniaanse shillingr UMOPr XMacause patacar jX Indiase rupeer j XMexicaanse pesor UCZKr XTsjechische korunar UTJSr XTadzjikistaanse somonir UTJRr XTadzjikistaanse roebelr j XBhutaanse ngultrumr UYDDr XJemenitische dinarr UGWEr XPortugees-Guinese escudor jXColombiaanse pesor UCOUr XUnidad de Valor Realr j\X Maltese lirer UMURr XMauritiaanse rupeer jXIndonesische rupiahr jXHondurese lempirar jX CFP-francr jX Fiji dollarr jXEthiopische birrr UPENr XPeruaanse nieuwe solr jXBelizaanse dollarr UCHWr X WIR francr UATSr XOostenrijkse schillingr UILPr XIsraëlisch pondr UZRNr XZaïrese nieuwe zaïrer jXDominicaanse pesor ULULr XLuxemburgse financiële francr UTMMr XTurkmeense manatr j@XNieuwe Taiwanese dollarr UMDLr XMoldavische leur UXPTr XPlatinar UECVr X,Ecuadoraanse unidad de valor constante (UVC)r UECSr XEcuadoraanse sucrer UBSDr XBahamaanse dollarr jX Zweedse kroonr jBXTongaanse paʻangar UPEIr XPeruaanse intir UZMKr XZambiaanse kwachar UMVRr XMaldivische rufiyaar UXTSr XValutacode voor testdoeleindenr UAUDr XAustralische dollarr UADPr XAndorrese pesetar UCUPr X Cubaanse pesor j"X Iers pondr UCLFr XChileense unidades de fomentor j$XBarbadaanse dollarr jXComorese francr UKRWr XZuid-Koreaanse wonr UGMDr XGambiaanse dalasir UVEFr XVenezolaanse sterke bolivarr j&XGuatemalteekse quetzalr j(XVenezolaanse bolivarr UXOFr XCFA-franc BCEAOr USITr XSloveense tolarr USDPr XSoedanees pondr j*XChileense pesor UEURr Xeuror UCDFr XCongolese francr jXOost-Caribische dollarr j.XKazachstaanse tenger URUBr XRussische roebelr UXFUr XFranse UIC-francr UXAGr XZilverr UBRRr XBraziliaanse cruzeiror UBRNr XBraziliaanse cruzado novor UBRLr XBraziliaanse realr UMMKr XMyanmarese kyatr UUYPr XUruguayaanse peso (1975-1993)r URURr XRussische roebel (1991-1998)r j8X Poolse zlotyr UBREr X!Braziliaanse cruzeiro (1990-1993)r UPYGr XParaguayaanse guaranir UBRCr XBraziliaanse cruzador UBRBr X&Braziliaanse cruzeiro novo (1967-1986)r USVCr XSalvadoraanse colónr UAEDr X#Verenigde Arabische Emiraten-dirhamr UGNSr X Guinese sylir j>XMacedonische denarr UAZMr X!Azerbeidzjaanse manat (1993-2006)r UAZNr XAzerbeidzjaanse manatr UUSNr X!Amerikaanse dollar (volgende dag)r UGQEr X#Equatoriaal-Guinese ekwele guineanar jXVanuatuaanse vatur UBADr XBosnische dinarr jDX Guinese francr UMXPr X$Mexicaanse zilveren peso (1861-1992)r jFX Iraakse dinarr UERNr XEritrese nakfar jHXBosnische convertibele markr jXSeychelse rupeer jJXCanadese dollarr USDDr XSoedanese dinarr jZX Cyprisch pondr UMADr XMarokkaanse dirhamr jNXKoeweitse dinarr! jPXBurundese francr" ULTTr# XLitouwse talonasr$ UPGKr% XPapuaanse kinar& ULTLr' XLitouwse litasr( jRXSingaporese dollarr) UUZSr* XOezbekistaanse sumr+ jTXSantomese dobrar, UXFOr- XFranse gouden francr. UMLFr/ XMalinese francr0 UESPr1 XSpaanse pesetar2 jVX Iraanse rialr3 UZRZr4 XZaïrese zaïrer5 jXXChinese yuan renminbir6 USLLr7 XSierraleoonse leoner8 UTNDr9 XTunesische dinarr: j<XGuyaanse dollarr; UESBr< X%Spaanse peseta (convertibele account)r= UESAr> XSpaanse peseta (account A)r? UNZDr@ XNieuw-Zeelandse dollarrA UFKPrB XFalklandeilands pondrC ULVLrD X Letse latsrE UUSSrF XAmerikaanse dollar (zelfde dag)rG j^XAmerikaanse dollarrH UARPrI XArgentijnse peso (1983-1985)rJ j`XKirgizische somrK jbXArgentijnse pesorL UILSrM XIsraëlische nieuwe shekelrN j2X Roemeense leurO URSDrP XServische dinarrQ jfXBahreinse dinarrR UJPYrS X Japanse yenrT UARArU XArgentijnse australrV USDGrW XSoedanese pondrX UPTErY XPortugese escudorZ UXAUr[ XGoudr\ uUmonthsr] }r^ (U stand-aloner_ }r` Unarrowra }rb (KXJrc KXFrd KjKXAre KjKjc Kjc Kje K XSrf K XOrg K XNrh K XDri usUformatrj }rk (Uwiderl }rm (KXjanuarirn KXfebruariro KXmaartrp KXaprilrq KXmeirr KXjunirs KXjulirt KXaugustusru K X septemberrv K Xoktoberrw K Xnovemberrx K Xdecemberry uU abbreviatedrz }r{ (KXjanr| KXfebr} KXmrtr~ KXaprr KXmeir KXjunr KXjulr KXaugr K Xsepr K Xoktr K Xnovr K Xdecr uuuUcurrency_formatsr }r Nh&)r }r (h)Nh+Kh,KKr h.h/h/r h1KKr h3X ¤ #,##0.00r h5X¤ r X¤ r r h8Nh9KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KjKji KXWr Kji KXVr KXZr Kj usUformatr }r (Uwider }r (KXmaandagr KXdinsdagr KXwoensdagr KX donderdagr KXvrijdagr KXzaterdagr KXzondagr uU abbreviatedr }r (KXmar KXdir KXwor KXdor KXvrr KXzar KXzor uuuU meta_zonesr }r (U Goose_Bayr }r Ucommonr sU Kuybyshevr }r (j Ulongr }r (Ugenericr XKuybyshev standaardtijdr Udaylightr XKuybyshev-zomertijdr Ustandardr XKuybyshev-tijdr uuURotherar }r (j j }r j X Rothera-tijdr suUArabianr }r (Ushortr }r (j X AT (Arabisch)r j XADT (Arabisch)r j XAST (Arabisch)r uj j }r (j XArabische tijdr j XArabische zomertijdr j XArabische standaardtijdr uuUAustralia_Easternr }r (j j }r (j XOost-Australische tijdr j XOost-Australische zomertijdr j XOost-Australische standaardtijdr uuU Argentinar }r (j j }r (j XArgentijnse zomertijdr j XArgentijnse tijdr uuUBoliviar }r (j j }r j XBoliviaanse tijdr suU Turkmenistanr }r (j j }r (j XTurkmeense zomertijdr j XTurkmeense tijdr uuU Alaska_Hawaiir }r (j j }r (j XAlaska-Hawaii-tijdr j XAlaska-Hawaii-zomertijdr j XAlaska-Hawaii-standaardtijdr uuU Cape_Verder }r (j j }r (j XKaapverdische zomertijdr j XKaapverdische tijdr uuUAzoresr }r (j j }r (j XAzoren-zomertijdr j X Azoren-tijdr uuUPierre_Miquelonr }r (j j }r (j XPierre en Miquelon-tijdr j XPierre en Miquelon-zomertijdr j X Pierre en Miquelon-standaardtijdr uuUEurope_Centralr }r (j j }r (j XMidden-Europese zomertijdr j XMidden-Europese standaardtijdr uuUTrukr }r (j j }r j X Chuukse tijdr suU Aktyubinskr }r (j j }r (j XAktyubinsk-zomertijdr j XAktyubinsk-tijdr uuUBeringr }r (j j }r (j X Bering-tijdr j XBering-zomertijdr j XBering-standaardtijdr uuU Qyzylordar }r (j j }r (j XQyzylorda-zomertijdr j XQyzylorda-tijdr uuUKazakhstan_Easternr }r (j j }r (j XOost-Kazachse tijdr j XOost-Kazachse standaardtijdr uuUFrunzer }r (j j }r (j XFrunze-zomertijdr j X Frunze-tijdr uuU Dutch_Guianar }r (j j }r j XNederlands-Guyaanse tijdr suUYerevanr }r! (j j }r" (j XJerevan-zomertijdr# j X Jerevan-tijdr$ uuU Kamchatkar% }r& (j j }r' (j X#Petropavlovsk-Kamtsjatski-zomertijdr( j XPetropavlovsk-Kamtsjatski-tijdr) uuUKashgarr* }r+ (j j }r, j X Kashgar-tijdr- suUMaldivesr. }r/ (j j }r0 j XMaldivische tijdr1 suUNorfolkr2 }r3 (j j }r4 j XNorfolkeilandse tijdr5 suU Dominicanr6 }r7 j sUAfrica_Easternr8 }r9 (j j }r: j XOost-Afrikaanse tijdr; suU Ashkhabadr< }r= (j j }r> (j XAshkhabad-zomertijdr? j XAshkhabad-tijdr@ uuUAlaskarA }rB (j j }rC (j X Alaska-tijdrD j XAlaska - zomertijdrE j XAlaska - standaardtijdrF uuUAmerica_EasternrG }rH (j j }rI (j X Eastern-tijdrJ j XEastern-zomertijdrK j XEastern-standaardtijdrL uuU YekaterinburgrM }rN (j j }rO (j XJekaterinenburg-zomertijdrP j XJekaterinenburg-tijdrQ uuUSolomonrR }rS (j j }rT j XSolomoneilandse tijdrU suU KrasnoyarskrV }rW (j j }rX (j XKrasnojarsk-zomertijdrY j XKrasnojarsk-tijdrZ uuUAmerica_Centralr[ }r\ (j j }r] (j X Central-tijdr^ j XCentral-zomertijdr_ j XCentral-standaardtijdr` uuUMawsonra }rb (j j }rc j X Mawson-tijdrd suUPakistanre }rf (j j }rg (j XPakistaanse zomertijdrh j XPakistaanse tijdri uuUSamoarj }rk (j j }rl j XSamoaanse standaardtijdrm suUMacaurn }ro (j j }rp (j XMacause zomertijdrq j X Macause tijdrr uuUChamorrors }rt (j j }ru (j X Chamorro-tijdrv j XChamorro-standaardtijdrw uuUGuamrx }ry (j }rz j X GST (Guam)r{ sj j }r| j XGuamese standaardtijdr} suUIndiar~ }r (j j }r j XIndiaase standaardtijdr suU Azerbaijanr }r (j j }r (j XAzerbeidzjaanse zomertijdr j XAzerbeidzjaanse tijdr uuU Marquesasr }r (j j }r j XMarquesaseilandse tijdr suU Tajikistanr }r (j j }r j XTadzjiekse tijdr suUPitcairnr }r (j j }r j XPitcairnse tijdr suUTurkeyr }r (j j }r (j XTurkse zomertijdr j X Turkse tijdr uuU Afghanistanr }r (j j }r j XAfghaanse tijdr suU Choibalsanr }r (j j }r (j XChoibalsan-zomertijdr j XChoibalsan-tijdr uuU Vladivostokr }r (j j }r (j XVladivostok-zomertijdr j XVladivostok-tijdr uuU Shevchenkor }r (j j }r (j XShevchenko-zomertijdr j XShevchenko-tijdr uuU Bangladeshr }r (j j }r j XBengalese tijdr suUGulfr }r (j j }r (j X Golf-tijdr j XGolf-standaardtijdr uuUDaccar }r (j j }r j X Dhaka-tijdr suUMongoliar }r (j j }r (j XUlaanbaatar-zomertijdr j XUlaanbaatar-tijdr uuU Samarkandr }r (j j }r (j XSamarkand-zomertijdr j XSamarkand-tijdr uuUWaker }r (j j }r j XWake-eilandse tijdr suUPerur }r (j j }r (j XPeruaanse zomertijdr j XPeruaanse tijdr uuUVanuatur }r (j j }r (j XVanuatuaanse zomertijdr j XVanuatuaanse tijdr uuUIndonesia_Centralr }r (j j }r j XCentraal-Indonesische tijdr suUNaurur }r (j j }r j XNauruaanse tijdr suUFalklandr }r (j j }r (j XFalklandeilandse zomertijdr j XFalklandeilandse tijdr uuUKorear }r (j j }r (j XKoreaanse tijdr j XKoreaanse zomertijdr j XKoreaanse standaardtijdr uuUCubar }r (j }r (j X CDT (Cuba)r j X CST (Cuba)r uj j }r (j X Cubaanse tijdr j XCubaanse zomertijdr j XCubaanse standaardtijdr uuUIrkutskr }r (j j }r (j XIrkoetsk-zomertijdr j X Irkoetsk-tijdr uuUArgentina_Westernr }r (j j }r j XWest-Argentijnse tijdr suUAmazonr }r (j j }r (j XAmazone-zomertijdr j X Amazone-tijdr uuUChinar }r (j }r (j X CT (China)r j X CDT (China)r j X CST (China)r uj j }r (j X Chinese tijdr j XChinese zomertijdr j XChinese standaardtijdr uuULong_Shur }r (j j }r j X Long-Shu-tijdr suUArmeniar }r (j }r (j XAMST (Armenië)r j XAMT (Armenië)r uj j }r (j XArmeense zomertijdr j X Armeense tijdr uuUCookr }r (j j }r (j XCookeilandse halve zomertijdr j XCookeilandse tijdr uuUChathamr }r (j j }r (j XChatham-zomertijdr j XChatham-standaardtijdr uuUGreenland_Westernr }r (j j }r (j XWest-Groenlandse zomertijdr j XWest-Groenlandse tijdr uuUKarachir }r (j j }r! j X Karachi-tijdr" suUTongar# }r$ (j j }r% (j XTongaanse zomertijdr& j XTongaanse tijdr' uuUSakhalinr( }r) (j j }r* (j XSachalin-zomertijdr+ j X Sachalin-tijdr, uuUBrasiliar- }r. (j j }r/ (j XBraziliaanse zomertijdr0 j XBraziliaanse tijdr1 uuUSyowar2 }r3 (j j }r4 j X Syowa-tijdr5 suU French_Guianar6 }r7 (j j }r8 j XFrans-Guyaanse tijdr9 suUFrench_Southernr: }r; (j j }r< j X&Franse zuidelijke en Antarctische tijdr= suU Mauritiusr> }r? (j j }r@ j XMauritiaanse tijdrA suUAfrica_SouthernrB }rC (j j }rD (j XZuid-Afrikaanse tijdrE j XZuid-Afrikaanse standaardtijdrF uuUGambierrG }rH (j j }rI j XGambiereilandse tijdrJ suUDavisrK }rL (j j }rM j X Davis-tijdrN suU NewfoundlandrO }rP (j j }rQ (j XNewfoundland-tijdrR j XNewfoundland-zomertijdrS j XNewfoundland-standaardtijdrT uuUCocosrU }rV (j j }rW j XCocoseilandse tijdrX suU KyrgystanrY }rZ (j j }r[ j XKirgizische tijdr\ suUTokelaur] }r^ (j j }r_ j XTokelause tijdr` suUAustralia_Westernra }rb (j j }rc (j XWest-Australische tijdrd j XWest-Australische zomertijdre j XWest-Australische standaardtijdrf uuUBakurg }rh (j j }ri (j XBakoe-zomertijdrj j X Bakoe-tijdrk uuUAfrica_Centralrl }rm (j j }rn j XCentraal-Afrikaanse tijdro suU Line_Islandsrp }rq (j j }rr j XLine-eilandse tijdrs suU Novosibirskrt }ru (j j }rv (j XNovosibirsk-zomertijdrw j XNovosibirsk-tijdrx uuUJapanry }rz (j j }r{ (j X Japanse tijdr| j XJapanse zomertijdr} j XJapanse standaardtijdr~ uuU Sverdlovskr }r (j j }r (j XSverdlovsk-zomertijdr j XSverdlovsk-tijdr uuU New_Caledoniar }r (j j }r (j XNieuw-Caledonische zomertijdr j XNieuw-Caledonische tijdr uuU Kwajaleinr }r (j j }r j XKwajaleinse tijdr suUAqtober }r (j }r (j XAQTST (Aqtöbe)r j XAQTT (Aqtöbe)r uj j }r (j XAqtöbe-zomertijdr j X Aqtöbe-tijdr uuUGilbert_Islandsr }r (j j }r j XGilberteilandse tijdr suUAustralia_CentralWesternr }r (j j }r (j X#Midden-Australische westelijke tijdr j X(Midden-Australische westelijke zomertijdr j X,Midden-Australische westelijke standaardtijdr uuU Indochinar }r (j j }r j XIndochinese tijdr suUPapua_New_Guinear }r (j j }r j XPapoea-Nieuw-Guinea-tijdr suUHovdr }r (j j }r (j XHovd-zomertijdr j X Hovd-tijdr uuU South_Georgiar }r (j }r j XGST (Z. Georgië)r sj j }r j XZuid-Georgische tijdr suUEcuadorr }r (j j }r j XEcuadoriaanse tijdr suUMalayar }r (j j }r j X Malakka-tijdr suUBruneir }r (j j }r j X Bruneise tijdr suUIranr }r (j j }r (j XIraanse zomertijdr j XIraanse standaardtijdr uuUAqtaur }r (j j }r (j XAqtau-zomertijdr j X Aqtau-tijdr uuU Indian_Oceanr }r (j j }r j XIndische Oceaan-tijdr suUTuvalur }r (j j }r j XTuvaluaanse tijdr suUAmerica_Mountainr }r (j j }r (j X Mountain-tijdr j XMountain-zomertijdr j XMountain-standaardtijdr uuUHawaii_Aleutianr }r (j j }r j X Hawaii-Aleoetische standaardtijdr suUChangbair }r (j j }r j X Changbai-tijdr suUChiler }r (j j }r (j XChileense zomertijdr j XChileense tijdr uuUWallisr }r (j j }r j XWallis en Futunase tijdr suUKosraer }r (j j }r j X Kosraese tijdr suUDushanber }r (j j }r (j XDushanbe-zomertijdr j X Dushanbe-tijdr uuUGeorgiar }r (j j }r (j XGeorgia-zomertijdr j X Georgia-tijdr uuUAnadyrr }r (j j }r (j XAnadyr-zomertijdr j X Anadyr-tijdr uuU Philippinesr }r (j j }r (j XFilipijnse zomertijdr j XFilipijnse tijdr uuUYakutskr }r(j j }r(j XJakoetsk-zomertijdrj X Jakoetsk-tijdruuUIndonesia_Westernr}r(j j }rj XWest-Indonesische tijdrsuUGreenland_Easternr}r (j j }r (j XOost-Groenlandse zomertijdr j XOost-Groenlandse tijdr uuUOralr }rj sUGMTr}r(j j }rj XGreenwich Mean TimersuUMarshall_Islandsr}r(j j }rj XMarshalleilandse tijdrsuU Seychellesr}r(j j }rj XSeychelse tijdrsuUUruguayr}r(j j }r(j XUruguayaanse zomertijdrj XUruguayaanse tijdruuUVostokr }r!(j j }r"j X Vostok-tijdr#suU Uzbekistanr$}r%(j j }r&(j XOezbeekse zomertijdr'j XOezbeekse tijdr(uuUColombiar)}r*(j j }r+(j XColombiaanse zomertijdr,j XColombiaanse tijdr-uuUReunionr.}r/(j j }r0j XRéunionse tijdr1suU Volgogradr2}r3(j j }r4(j XWolgograd-zomertijdr5j XWolgograd-tijdr6uuU Kizilordar7}r8(j j }r9(j XKizilorda-zomertijdr:j XKizilorda-tijdr;uuUFijir<}r=(j j }r>(j XFijische zomertijdr?j X Fijische tijdr@uuUAmerica_PacificrA}rB(j j }rC(j X Pacific-tijdrDj XPacific-zomertijdrEj XPacific-standaardtijdrFuuUKazakhstan_WesternrG}rH(j j }rI(j XWest-Kazachse tijdrJj XWest-Kazachse standaardtijdrKuuUPalaurL}rM(j j }rNj X Belause tijdrOsuUEurope_EasternrP}rQ(j j }rR(j XOost-Europese zomertijdrSj XOost-Europese standaardtijdrTuuUBhutanrU}rV(j j }rWj XBhutaanse tijdrXsuUBorneorY}rZ(j j }r[(j XBorneose zomertijdr\j X Borneose tijdr]uuUNepalr^}r_(j j }r`j X Nepalese tijdrasuU Galapagosrb}rc(j j }rdj XGalapagoseilandse tijdresuU Lord_Howerf}rg(j j }rh(j XLord Howe-tijdrij XLord Howe-zomertijdrjj XLord Howe-standaardtijdrkuuUPhoenix_Islandsrl}rm(j j }rnj XPhoenixeilandse tijdrosuUSurinamerp}rq(j j }rrj XSurinaamse tijdrssuUAcrert}ru(j j }rv(j XAcre-zomertijdrwj X Acre-tijdrxuuUEasterry}rz(j j }r{(j XPaaseilandse zomertijdr|j XPaaseilandse tijdr}uuU Christmasr~}r(j j }rj XChristmaseilandse tijdrsuU East_Timorr}r(j j }rj XOost-Timorese tijdrsuUIsraelr}r(j }rj X IST (Israël)rsj j }r(j XIsraëlische tijdrj XIsraëlische zomertijdrj XIsraëlische standaardtijdruuUAfrica_Westernr}r(j j }r(j XWest-Afrikaanse zomertijdrj XWest-Afrikaanse tijdruuUTashkentr}r(j j }r(j XTasjkent-zomertijdrj X Tasjkent-tijdruuUMalaysiar}r(j j }rj XMaleisische tijdrsuUNoronhar}r(j j }r(j XFernando de Noronha-zomertijdrj XFernando de Noronha-tijdruuU Venezuelar}r(j j }rj XVenezolaanse tijdrsuUPonaper}r(j j }rj XPohnpeise tijdrsuUIndonesia_Easternr}r(j j }rj XOost-Indonesische tijdrsuUOmskr}r(j j }r(j XOmsk-zomertijdrj X Omsk-tijdruuUAustralia_Centralr}r(j j }r(j XMidden-Australische tijdrj XMidden-Australische zomertijdrj X!Midden-Australische standaardtijdruuUAtlanticr}r(j j }r(j X Atlantic-tijdrj XAtlantic - zomertijdrj XAtlantic - standaardtijdruuU North_Marianar}r(j j }rj XNoordelijk Mariaanse tijdrsuULankar}r(j j }rj X Lanka-tijdrsuUDumontDUrviller}r(j j }rj XDumont-d'Urville-tijdrsuUEurope_Westernr}r(j j }r(j XWest-Europese zomertijdrj XWest-Europese tijdruuU New_Zealandr}r(j j }r(j XNieuw-Zeelandse tijdrj XNieuw-Zeelandse zomertijdrj XNieuw-Zeelandse standaardtijdruuUUrumqir}r(j j }rj X Ürümqi-tijdrsuU Hong_Kongr}r(j j }r(j XHongkong-zomertijdrj X Hongkong-tijdruuUGuyanar}r(j j }rj X Guyaanse tijdrsuUMagadanr}r(j j }r(j XMagadan-zomertijdrj X Magadan-tijdruuUAlmatyr}r(j j }r(j XAlma-Ata-zomertijdrj X Alma-Ata-tijdruuUTbilisir}r(j j }r(j XTbilisi-zomertijdrj X Tbilisi-tijdruuUMyanmarr}r(j j }rj XMyanmarese tijdrsuU Singaporer}r(j j }rj XSingaporese standaardtijdrsuUSamarar}r(j j }r(j XSamara-zomertijdrj X Samara-tijdruuUGreenland_Centralr}r(j j }r(j XCentraal-Groenlandse zomertijdrj XCentraal-Groenlandse tijdruuUUralskr}r(j j }r(j XOral-zomertijdrj X Oral-tijdruuUTahitir}r (j j }r j XTahitiaanse tijdr suUParaguayr }r (j j }r(j XParaguayaanse zomertijdrj XParaguayaanse tijdruuUYukonr}r(j j }r(j X Yukon-tijdrj XYukon-zomertijdrj XYukon-standaardtijdruuUMoscowr}r(j j }r(j X Moskou-tijdrj XMoskou-zomertijdrj XMoskou-standaardtijdruuUNiuer}r(j j }rj X Niuese tijdr suuUerasr!}r"(Uwider#}r$(KX Voor Christusr%KX Anno Dominir&uU abbreviatedr'}r((KXv. Chr.r)KXn. Chr.r*uuu.PK[|aa%site-packages/babel/localedata/ml.datnu[}q(U zone_formatsq}q(UregionqX%s സമയംqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KXഒന്നാം പാദംqKXരണ്ടാം പാദംqKX"മൂന്നാം പാദംqKXനാലാം പാദംquU abbreviatedq}q(KXQ1q KXQ2q!KXQ3q"KXQ4q#uuuUperiodsq$}q%(Uamq&Xരാവിലെq'Upmq(Xവൈകുന്നേരംq)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X%qFhFqGh7KKqHh9X #,##,##0%qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9X h:mm:ss aqXUformatqYX%(h)s:%(mm)s:%(ss)s %(a)sqZubUfullq[hU)q\}q](h9X h:mm:ss a vq^hYX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq_ubUlongq`hU)qa}qb(h9X h:mm:ss a zqchYX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqdubUshortqehU)qf}qg(h9Xh:mm aqhhYX%(h)s:%(mm)s %(a)sqiubuU languagesqj}qk(UgvqlXമാന്‍സ്qmUguqnXഗുജറാത്തിqoUscnqpXസിസിലിയന്‍qqUromqrXറോമനിqsUalgqtX7അല്‍ഗോണ്‍ക്യന്‍ ഭാഷquUaleqvXഅലൈട്ട്qwUscoqxXസ്കോട്സ്qyUmniqzXമണിപ്പൂരിq{Ugdq|X1സ്കോട്ടിഷ് ഗൈലിക്q}Ugaq~Xഐറിഷ്qUmnoqXമനോബോ ഭാഷqUosaqXഒസേജ്qUgnqXഗ്വാറാനിqUaltqX1സതേണ്‍ അള്‍ട്ടായിqUglqXഗലീഷ്യന്‍qUmwrqXമര്‍വാരിqUtyqXടാഹിത്യന്‍qUtwqX ത്വിqUttqXടാട്ടാര്‍qUtrqXതുര്‍ക്കിqUtsqXത്സോംഗqUtnqXത്സ്വാനqUtoqXടോംഗന്‍qUausqX1ഓസ്ട്രേലിയന്‍ ഭാഷqUavqXഅവാരിക്qUtkqX$തുര്‍ക്കമന്‍qUthqX തായ്qUroaqX"റോമന്‍സ് ഭാഷqUtgqXതാജിക്qUteqXതെലുങ്ക്qUugaqXഉഗറിട്ടിക്qUmwlqXമിരാന്‍റസേqUkcgqXട്യാപ്qUsmiqXസമി ഭാഷqUfatqXഫിലിപ്പീനോqUfanqX ഫങ്qUwoqXവൊളോഫ്qUrmqX1രഹയ്ട്ടോ-റോമന്‍സ്qUdinqXദിന്‍കqUblaqXസിക്സികqUcmcqXചാമിക് ഭാഷqUmlqXമലയാളംqUzhqXചൈനീസ്qUtemqXടിംനേqUen_CAqX4കനേഡിയന്‍ ഇംഗ്ലീഷ്qUnwcqX7ക്ലാസിക്കല്‍ നേവാരിqUzaqXസ്വാംഗ്qUcauqX.കാവോകേഷ്യന്‍ ഭാഷqUzuqX സുളുqUterqXടെറേനോqUtetqXടെറ്റുംqUmncqXമന്‍ചുqUkutqXകുതേനൈqUsukqXസുകുമqUkumqXകുമൈക്qUsusqX സുസുqUnewqXനേവാരിqUsuxqXസുമേരിയന്‍qUdenqXസ്ലേവ്qUmenqXമെന്‍ഡെqUmulqXപലഭാഷകള്‍qUlezqXലഹ്ഗിയാന്‍qUrootqXമൂലഭാഷqUekaqXഎകാജുക്qUakkqX!അക്കാഡിയന്‍qUdraqXദ്രാവിഡഭാഷqUjrbqX%ജൂഡിയോ-അറബിക്qUsgnqXആംഗ്യഭാഷqUsgaqX%പ്രാചീന ഐറിഷ്qUapaqXഅപ്പാചേ ഭാഷqUbraqXബ്രജ്qUchbqXചിബ്ചqUchgqX ചഗതൈqUchkqXചൂകീസ്qUchmrX മാരിrUchnrX.ചിനൂഗ്-ജാര്‍ഗണ്‍rUchorXചോക്റ്റാവ്rUchprXചിപേവ്യന്‍rUchrrXചെരോകീr Uchyr Xചിയേന്നേr Utir Xതിഗ്രിന്യr UvotrXവോട്ടിക്rUmgrXമലഗാസിrUibarXഇബാന്‍rUmorX!മൊള്‍ഡോവന്‍rUmnrXമംഗോളിയന്‍rUmirX മൌറിrUmhrX$മാര്‍ഷല്ലീസ്rUmkrX$മാസിഡോണിയന്‍rUmtrX!മാള്‍ട്ടീസ്rUcair X]മദ്ധ്യ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷr!Udelr"Xദലവാരെr#Umsr$X മലയr%Umrr&Xമറാഠിr'Utar(Xതമിഴ്r)Umyr*Xബര്‍മീസ്r+Ucadr,X കാഡോr-Usrnr.X+ശ്രാനന്‍ ഡോങ്കോr/Utair0Xതായ് ഭാഷr1Uafhr2Xആഫ്രിഹിലിr3Usitr4X/ചീന-ടിബത്തന്‍ ഭാഷr5Uenmr6X+മദ്ധ്യ ഇംഗ്ലീഷ്r7Uen_AUr8X@ഓസ്ട്രേലിയന്‍ ഇംഗ്ലീഷ്r9Unynr:Xന്യാന്‍കലേr;Unyor<Xന്യോറോr=Unymr>Xന്യാംവേസിr?Usior@Xസിവോന്‍ ഭാഷrAUmaprBX-ഓസ്ട്രോനേഷ്യന്‍rCUmasrDX മസൈrEUlahrFXലഹ്‌ന്‍ഡrGUladrHXലാഡിനോrIUfyrJX1പശ്ചിമ ഫ്രിഷിയന്‍rKUsnkrLXസോണിന്‍കെrMUfarNX!പേര്‍ഷ്യന്‍rOUmadrPXമദുരേസേrQUmagrRXമഗാഹിrSUmairTXമൈഥിലിrUUfirVXഫിന്നിഷ്rWUfjrXXഫിജിയന്‍rYUmanrZXമണ്ഡിന്‍ഗോr[Uegyr\X7പ്രാചീന ഈജിപ്ത്യന്‍r]Uzndr^Xസാന്ദെr_Ussr`Xസ്വാറ്റിraUsrrbX!സെര്‍ബിയന്‍rcUsqrdX$അല്‍ബേനിയന്‍reUswrfXസ്വാഹിലിrgUsvrhXസ്വീഡിഷ്riUsurjXസുഡാനീസ്rkUstrlX%തെക്കന്‍ സോതോrmUskrnXസ്ലോവാക്ക്roUsirpXസിംഹളrqUsorrXസോമാലിrsUsnrtX ഷോണാruUsmrvXസമോവന്‍rwUslrxX$സ്ലോവേനിയന്‍ryUscrzX'സര്‍ഡിനിയാന്‍r{Usar|Xസംസ്കൃതംr}Usgr~Xസാങ്കോrUserX.നോര്‍ത്തേന്‍ സമിrUsdrXസിന്ധിrUzenrX സെനഗrUkbdrX$കബര്‍ഡിയാന്‍rUafarX;ആഫ്രോ-ഏഷ്യാറ്റിക് ഭാഷrUcsbrX!കാഷുബിയാന്‍rUlgrX ഗന്ധrUlbrX'ലക്സംബര്‍ഗിഷ്rUfiurX8ഫിന്നോ-ഉഗ്രിയന്‍ ഭാഷrUlnrXലിംഗാലrUlorX ലാവോrUlirX!ലിംബര്‍ഗിഷ്rUbynrXബ്ലിന്‍rUltrX$ലിത്വേനിയന്‍rUlurXലുബ-കറ്റംഗrUfilrXഫിലിപ്പിനോrUyirXയിദ്ദിഷ്rUnonrX+പഴയ പേര്‍ഷ്യന്‍rUcebrXസെബുവാനോrUyorXയൊറൂബാrUnogrX നോഗൈrUbatrX+ബാള്‍ട്ടിക് ഭാഷrUdakrXഡകോട്ടrUdarrXഡര്‍ഗ്വാrUdayrXദയാക്rUssarX,നിളോ-സഹാറന്‍ ഭാഷrUkperXകപെല്ലേrUelrXഗ്രീക്ക്rUeorXഎസ്പരാന്തോrUenrXഇംഗ്ലീഷ്rUlamrX ലംബrUeerX എവ്rUmdfrXമോക്ഷrUfrrXഫ്രഞ്ച്rUmdrrXമണ്ഡാര്‍rUetrX'എസ്റ്റോണിയന്‍rUesrXസ്പാനിഷ്rUrurXറഷ്യന്‍rUgonrXഗോണ്ഡിrUgohrX;പ്രാചീന ഉച്ച ജര്‍മന്‍rUsmsrX+സ്കോള്‍ട്ട് സമിrUsmnrXഇനാരി സാമിrUsmjrXലൂലീ സമിrUde_ATrX:ഓസ്ട്രിയന്‍ ജര്‍മന്‍rUgotrXഗോഥിക്ക്rUrnrXറുണ്ടിrUrorXറൊമാനിയന്‍rUdsbrX4ലോവര്‍ സോര്‍ബിയന്‍rUsmarXസതേണ്‍ സമിrUgorrX!ഗൊറോന്‍റാലോrUastrX$ഓസ്‌ട്രിയന്‍rUwalrX വലമൊrUcrhrX7കൃമിയന്‍ ടര്‍ക്കിഷ്rUathrX(അതപാസ്കന്‍ ഭാഷrUgezrX ഗീസ്rUxhrXക്ഷോസാrUffrX ഫുലrUkforX കോറോrUmakrXമകാസര്‍rUzaprXസാപ്പോടെക്rUkokrXകൊങ്കണിrUzxxrX$ഭാഷയല്ലാത്തവrUkosrXകൊസറേയന്‍rUforXഫാറോസ്rUtogrX"ന്യാസാ ഡോങ്കrUhuprX ഹൂപrUudmrX$ഉഡ്മുര്‍ട്ട്rUbejrXബജrUbemrX ബംബr Utsir Xസിംഷ്യന്‍r Uberr Xബര്‍ബര്‍r UnzirX സിമrUsairX]ദക്ഷിണ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷrUangrX"പഴയ ഇംഗ്ലീഷ്rUprarXപ്രാകൃതംrUbhorXഭോജ്‌പൂരിrUsalrX%സാലിഷാന്‍ ഭാഷrUprorX'പ്രൊവന്‍ഷ്ല്‍rUrajrXരാജസ്ഥാനിrUsadrXസാന്‍ഡവേrUanpr Xആന്‍ഗികr!Ues_419r"XVലാറ്റിന്‍ അമേരിക്കന്‍ സ്പാനിഷ്r#Urapr$Xരാപനൂയിr%Usasr&Xസസാക്r'Unqor(Xഇന്‍കോr)Ucarr*Xകാരിബ്r+Uminr,Xമിനാങ്കബൌr-Umicr.Xമിക്മാക്r/Uefir0Xഎഫിക്r1Uarnr2X!ആരൌകാനിയന്‍r3Uypkr4Xയുപിക്r5Umisr6Xഇതരഭാഷr7Ukacr8Xകാചിന്‍r9Ukabr:Xകബൈല്‍r;Ukaar<X%കര-കാല്‍പ്പക്r=Ukajr>X ജ്ജുr?Ukamr@X കംബrAUkarrBXകരേന്‍rCUkawrDX കാവിrEUfr_CHrFX(സ്വിസ് ഫ്രഞ്ച്rGUtyvrHXതുവിനിയന്‍rIUfr_CArJX1കനേഡിയന്‍ ഫ്രഞ്ച്rKUkarLX!ജോര്‍ജിയന്‍rMUdoirNXഡോഗ്രിrOUkgrPXകോങ്ഗോrQUkkrRXകസാഖ്rSUkjrTXക്വാന്യമrUUkirVXകികൂയുrWUkorXXകൊറിയന്‍rYUknrZXകന്നഡr[Ukmr\Xകംബോഡിയന്‍r]Uklr^X$കലാല്ലിസട്ട്r_Uksr`Xകാശ്മീരിraUkrrbXകനൂറിrcUkwrdXകോര്‍ണിഷ്reUkvrfX കോമിrgUkurhX!കുര്‍ദ്ദിഷ്riUkyrjXകിര്‍ഗിസ്rkUtklrlXടൊക്കേലൌrmUbuarnXബുറിയത്ത്roUmgarpX"മദ്ധ്യ ഐറിഷ്rqUhitrrXഹിറ്റൈറ്റേrsUdyurtXദ്വൈലruUdervXജര്‍മ്മന്‍rwUdarxXഡാനിഷ്ryUdzrzXഭൂട്ടാനിr{Uluir|Xലൂയിസെനോr}Udvr~XദിവേഹിrUhilrX$ഹിലിഗയ്നോണ്‍rUhimrXഹിമാചലിrUgemrX(ജര്‍മാനിക് ഭാഷrUcrprXമിശ്രഭാഷrUqurXക്വെച്ചുവrUbasrXബസrUgbarX ഗബ്യrUbadrXബന്‍ഡrUbanrXബാലിനീസ്rUbalrXബലൂചിrUshnrXഷാന്‍rUbairXബാമിലകേ ഭാഷrUarprXഅരപാഹോrUartrXകൃത്രിമഭാഷrUarwrXഅറാവക്rUarcrXഅരമായഭാഷrUen_USrX:അമേരിക്കന്‍ ഇംഗ്ലീഷ്rUsemrX%സെമറ്റിക് ഭാഷrUselrXസെല്‍കപ്rUnubrX"നുബിയന്‍ ഭാഷrUbtkrXബാറ്റക്rUlusrXലുഷായിrUmusrXക്രീക്ക്rUluarXലൂബ-ലുലുവrUirorX1ഇറോക്വായിയന്‍ ഭാഷrUirarX%ഇറാനിയന്‍ ഭാഷrUmunrXമുണ്ഡ ഭാഷrUlunrXലുന്‍ഡrUluorX ലവോrUwarXവല്ലൂണ്‍rUtuprXതുപി ഭാഷrUjvrXജാവാനീസ്rUzblrX-ബ്ലിസ്സിംബല്‍സ്rUtutrX:അറ്റ്ലാന്‍റിക്ക് ഭാഷrUtumrXതുംബുകrUjarXജപ്പാനീസ്rUcoprXകോപ്റ്റിക്rUilorXഇലോകോrUlarXലാറ്റിന്‍rUgwirX%ഗ്വിച്ച് ഇന്‍rUundrX`അറിയാത്തതോ നിലവിലില്ലാത്തതോ ആയ ഭാഷrUtlirX!ലിംഗ്വിറ്റ്rUtlhrX!ക്ലിങ്ഗോണ്‍rUchrXചമോറോrUcorX'കോര്‍സിക്കന്‍rUcarXകറ്റാലന്‍rUcerXചെചന്‍rUponrX!പൊന്‍പിയന്‍rUcyrXവെല്‍ഷ്rUsahrXയാകൂട്rUcsrXചെക്ക്rUcrrX ക്രീrUbntrXബാന്ധുrUcvrXചുവാഷ്rUcurX1ചര്‍ച്ച് സ്ലാവിക്rUlvrXലാത്വിയന്‍rUdumrX"മദ്ധ്യ ഡച്ച്rUptrX'പോര്‍ച്ചുഗീസ്rUduarXദ്വാലrUfrorXപഴയ ഫ്രഞ്ച്rUyaprXയെപ്പീസ്rUfrmrX(മദ്ധ്യ ഫ്രഞ്ച്rUtivrX ടിവ്rUfrsrX=ഈസ്റ്റേണ്‍ ഫ്രിഷ്യന്‍rUfrrrXCനോര്‍ത്തേന്‍ ഫ്രിഷ്യന്‍rUyaorX യാവോrUparXപഞ്ചാബിrUxalrXകല്‍മൈക്rUes_ESrX4ഇബേറിയന്‍ സ്പാനിഷ്r Upir X പാലിr Uen_GBr X7ബ്രിട്ടീഷ് ഇംഗ്ലീഷ്r UgayrX ഗയൊrUotorX+ഓട്ടോമിയന്‍ ഭാഷrUotarX=ഓട്ടോമന്‍ തുര്‍ക്കിഷ്rUhmnrX മോങ്rUmyvrXഏഴ്സ്യrUgaarXഗാrUfurrX'ഫ്രിയുലിയാന്‍rUkhirX"ഘോയിസന്‍ ഭാഷrUainrXഅയിനുrUrarr X$രാരോടോങ്കന്‍r!Uslar"X"സ്ലേവിക് ഭാഷr#Uver$Xവെന്ദr%Uvir&X'വിയറ്റ്നാമീസ്r'Uisr(X'ഐസ്‌ലാന്‍ഡിക്r)Ukhor*Xഘോറ്റാനേസേr+Uiur,X0ഇനുക്റ്റിറ്റട്ട്r-Uitr.X!ഇറ്റാലിയന്‍r/Uvor0Xവോളാപുക്r1Uiir2Xഷുവാന്‍യിr3Uikr4Xഇനുപിയാക്r5Uior6X ഇഡോr7Uiner8X;ഇന്‍ഡോ-യൂറോപ്യന്‍ ഭാഷr9Uiar:X-ഇന്‍റര്‍ലിംഗ്വാr;Ujprr<X4ജൂഡിയോ-പേര്‍ഷ്യന്‍r=Uier>X-ഇന്‍റര്‍ലിംഗ്വിr?Uidr@X*ഇന്‍ഡോനേഷ്യന്‍rAUigrBXഇഗ്ബോrCUpaprDX'പാപിയാമെന്‍റൊrEUeworFXഎവോന്‍ഡോrGUpaurHXപലാവുന്‍rIUpaarJX%പാപുവാന്‍ ഭാഷrKUpagrLX!പങ്കാസിനന്‍rMUsatrNXസന്താലിrOUpalrPXപാഹ്ലവിrQUpamrRXപാംപന്‍ഗrSUsycrTX4പുരാതന സുറിയാനിഭാഷrUUphirVX"ഫിലിപീനി ഭാഷrWUcelrXX+സെല്‍റ്റിക് ഭാഷrYUphnrZXഫീനിഷ്യന്‍r[Unicr\XFനൈ‍ജര്‍-കോര്‍‍ഡോഫാനിയന്‍r]Uniar^Xനിയാസ്r_Udgrr`Xഡോഗ്രിബ്raUsyrrbXസുറിയാനിrcUniurdXന്യുവാന്‍reUgswrfX+സ്വിസ് ജര്‍മന്‍rgUcchrhXഅറ്റ്സാംriUjborjXലോജ്ബാന്‍rkUnahrlX*നാഹ്വാള്‍‍ട്ട്rmUsamrnX:സമരിയാക്കാരുടെ അരമായroUhairpX ഹൈഡrqUgmhrrX8മദ്ധ്യ ഉച്ച ജര്‍മന്‍rsUcusrtX(കുഷിറ്റിക് ഭാഷruUwenrvX+സോര്‍ബിയന്‍ ഭാഷrwUadyrxXഅഡൈഗേryUelxrzXഎലാമൈറ്റ്r{Uadar|Xഅഡാങ്ഗമിr}Upt_PTr~XCഇബേറിയന്‍ പോര്‍ച്ചുഗീസ്rUhawrXഹവായിയന്‍rUbinrX ബിനിrUbikrXബികോല്‍rUpt_BRrXIബ്രസീലിയന്‍ പോര്‍ച്ചുഗീസ്rUmosrXമൊസ്സിrUmohrXമോഹാക്rUtlrXതഗാലോഗ്rUzh_HansrXലളിതചീനഭാഷrUzh_HantrX1പരമ്പരാഗത ചൈനീസ്‌rUtvlrXതുവാലുrUijorX ഇജോrUkmbrXക്ലിംഗന്‍rUpeorX7പ്രാചീന പേര്‍ഷ്യന്‍rUumbrXഉംബുന്ദുrUtmhrXടമഷേക്rUfonrXഫോന്‍rUhsbrX7അപ്പര്‍ സോര്‍ബിയന്‍rUberX!ബൈലോറഷ്യന്‍rUbgrX$ബള്‍ഗേറിയന്‍rUbarXബഷ്ഖിര്‍rUpsrXപഷ്തുrUbmrXബംബാറrUbnrXബംഗാളിrUborXതിബറ്റന്‍rUbhrXബീഹാറിrUbirXബിസ്‌ലാമrUbrrX!ബ്രിറ്റോണ്‍rUbsrXബോസ്നിയന്‍rUruprX!ആരോമാനിയന്‍rUzzarX സാസാrUomrXഒറോമൂrUojrXഓജിബ്വാrUacerXഅചിനീസ്rUachrXഅകോലിrUocrXഒസിറ്റാന്‍rUkrurXകുരുഖ്rUsrrrXസെറര്‍rUkrorX ക്രുrUkrlrXകരീലിയന്‍rUkrcrX(കരചൈ-ബാല്‍കര്‍rUndsrXലോജര്‍മന്‍rUosrX!ഒസ്സെറ്റിക്rUorrX ഒറിയrUsogrXസോജിഡിയന്‍rUnsorX1നോര്‍ത്തേന്‍ സോതോrUsonrXസോങ്ഗൈrUde_CHrX8സ്വിസ് ഉച്ച ജര്‍മന്‍rUvairXവൈrUwakrX(വകഷന്‍ ഭാഷകള്‍rUlolrXമോങ്കോrUmkhrX)മോണ്‍-ഖമര്‍ ഭാഷrUawarX അവധിrUlozrX ലോസിrUgilrX!ഗില്‍ബര്‍സേrUwasrX വാഷൊrUwarrXവാരേയ്rUhzrXഹെറീറോrUhyrX$അര്‍മേനിയന്‍rUanrXഅരഗോണീസ്rUsidrXസിഡാമോrUhrrX$ക്രൊയേഷ്യന്‍rUhtrX!ഹെയ്തിയാന്‍rUhurXഹംഗേറിയന്‍rUhirXഹിന്ദിrUhorXഹിരി മോതുrUharX ഹൌസrUbugrXബുഗിനീസ്rUherXഹീബ്രുrUuzrXഉസ്ബെക്r Uurr Xഉറുദുr Uplr Xപോളിഷ്r UukrX!ഉക്രേനിയന്‍rUugrXഉയ്ഘുര്‍rUaarXഅഫാര്‍rUabrX!അബ്ഖാസിയന്‍rUaerX!അവസ്റ്റാന്‍rUafrX*ആഫ്രിക്കാന്‍സ്rUakrXഅഘാന്‍rUamrXഅംഹാറിക്rUnl_BErXഫ്ലമിഷ്rUeur Xബാസ്ക്r!Uasr"Xആസ്സാമീസ്r#Uarr$X അറബിr%Uinhr&Xഇംഗ്വിഷ്r'Utpir(X"ടോക് പിസിന്‍r)Umynr*Xമായന്‍ ഭാഷr+Uayr,Xഅയ്മാറr-Ukhar.X ഘാസിr/Uazr0X!അസര്‍ബൈജാനിr1Uincr2Xഭാരതീയഭാഷr3Unlr4Xഡച്ച്r5Unnr6XIനോര്‍വീജിയന്‍ നൈനോര്‍ക്സ്r7Unor8X'നോര്‍വീജിയന്‍r9Unar:X നൌറുr;Unbr<XCനോര്‍വീജിയന്‍ ബുക്‌മല്‍r=Unair>X]വടക്കേ അമേരിക്കന്‍ ഇന്‍ഡ്യന്‍ ഭാഷr?Undr@X1നോര്‍ത്ത് ഡെബിള്‍rAUnerBXനേപ്പാളിrCUngrDXഡോങ്കrEUnyrFXന്യന്‍ജrGUnaprHX-നെപ്പോളിറ്റാന്‍rIUgrbrJXഗ്രബൊrKUgrcrLX$പുരാതനയവനഭാഷrMUnrrNX.ദക്ഷിണ നെഡിബിള്‍rOUtigrPXടൈഗ്രിrQUnvrRX നവജോrSUzunrTX സുനിrUUrwrVX$കിന്യര്‍വണ്ടrWUcperXXKഇംഗ്ലീഷ് അധിഷ്ഠിത മിശ്ര ഭാഷrYUcpfrZXGഫ്രഞ്ച് അധിഷ്ഠിത മിശ്രഭാഷr[Ucppr\XZപോര്‍ച്ചുഗീസ് അധിഷ്ടിത മിശ്ര ഭാഷr]uU territoriesr^}r_(UBDr`Xബംഗ്ലാദേശ്raUBErbXബെല്‍ജിയംrcUBFrdX.ബുര്‍ക്കിനാ ഫാസോreUBGrfXബള്‍ഗേറിയrgUVErhXവെനിസ്വേലriUBArjXIബോസ്നിയയും ഹെര്‍സഗോവിനയുംrkUBBrlXബാര്‍ബഡോസ്rmUWFrnX;വാലിസ് ആന്‍ഡ് ഫ്യുചൂനroUBMrpXബര്‍മുഡrqUBNrrXബ്രൂണയ്rsUBOrtXബൊളീവിയruUBHrvXബഹ്റൈന്‍rwUBIrxXബുറുണ്ടിryUBJrzXബെനിന്‍r{UBTr|Xഭൂട്ടാന്‍r}U011r~X*പശ്ചിമആഫ്രിക്കrUBVrX.ബൌവെറ്റ് ഐലന്‍റ്rUBWrXബോട്സ്വാനrU014rX4കിഴക്കന്‍ ആഫ്രിക്കrU015rX'ഉത്തരആഫ്രിക്കrUBRrXബ്രസീല്‍rU017rX*മദ്ധ്യആഫ്രിക്കrU018rX+തെക്കേ ആഫ്രിക്കrU019rX7അമേരിക്കന്‍ ഭൂഖണ്ഡംrUBYrXബെലറൂസ്rUBZrXബെലീസ്rULVrXലാത്വിയrURWrXറുവാണ്ടrURSrXസെര്‍ബിയrUTLrX1കിഴക്കന്‍ തിമൂര്‍rURErXറീയൂണിയന്‍rUTMrX<തുര്‍ക്ക്മെനിസ്ഥാന്‍rUOMrXഒമാന്‍rUTJrX-താജിക്കിസ്ഥാന്‍rUROrXറൊമാനിയrUTKrXടൊകെലാവുrUGWrXഗിനി-ബിസോrUGUrXഗ്വാംrUGTrX$ഗ്വാട്ടിമാലാrUGSrXദക്ഷിണ ജോര്‍ജ്ജിയയും ദക്ഷിണ സാന്‍ഡ്‌വിച്ച് ദ്വീപുകളുംrUGRrXഗ്രീസ്rUGQrXCഇക്വിറ്റോറിയല്‍ ഗ്വിനിയrUGPrXഗുവാഡെലോപ്rUJPrXജപ്പാന്‍rUKIrXകിരിബാത്തിrUGYrX ഗയാനrUGGrXഗേണ്‍സിrUGFrX"ഫ്രഞ്ച് ഗയാനrUGErXജോര്‍ജിയrUGDrXഗ്രനേഡrU021rX+വടക്കേ അമേരിക്കrUGBrXബ്രിട്ടന്‍rUGArXഗാബോണ്‍rUSVrX.എല്‍ സാല്‍വദൂര്‍rUGNrXഗ്വിനിയrUGMrXഗാംബിയrUGLrX*ഗ്രീന്‍ലാന്‍റ്rU029rXകരീബിയന്‍rUGIrX-ജിബ്രാള്‍ട്ടര്‍rUGHrX ഘാനrUJErXജേഴ്സിrUTNrXടുണീഷ്യrUJMrXജമൈക്കrU013rX*മദ്ധ്യഅമേരിക്കrUWSrXസാമോവrU419rXOലാറ്റിനമേരിക്കയും കരീബിയനുംrUHRrXക്രൊയേഷ്യrUBSrXബഹാമാസ്rUHTrXഹെയ്തിrUHUrXഹംഗറിrUHKrX?ഹോങ് കോങ് എസ്.ഏ.ആര്‍. ചൈനrU039rX+തെക്കേ യൂറോപ്പ്rUHNrXഹോണ്ടുറാസ്rUFIrX$ഫിന്‍ലാന്‍ഡ്rU142rX ഏഷ്യrU030rX(കിഴക്കന്‍ ഏഷ്യrU034rXതെക്കേ ഏഷ്യrU035rX;തെക്ക്-കിഴക്കന്‍ ഏഷ്യrUPRrX4പ്യൂര്‍ട്ടോ റിക്കോrUPSrXപാലസ്തീന്‍rUFKrX@ഫാക്ക്‌ലാന്‍റ് ഐലന്‍റ്rUIOrXlബ്രിട്ടീഷ് ഇന്ത്യന്‍ മഹാസമുദ്ര പ്രദേശംrUPWrXപലാവുrUPTrX'പോര്‍ച്ചുഗല്‍rUSJrXJസ്വാല്‍ബാഡും ജാന്‍ മായേനുംr UMDr Xമള്‍ഡോവr UFMr X!മൈക്രോനേഷ്യr UIQrXഇറാക്ക്rUPArX പനാമrUPFrX1ഫ്രഞ്ച് പോളിനേഷ്യrUPGrX2പപ്പുവ ന്യൂ ഗ്വിനിrUPErX പെറുrUPKrX'പാക്കിസ്ഥാന്‍rUPHrX'ഫിലിപ്പൈന്‍സ്rUFOrX.ഫറോയി ദ്വീപുകള്‍rUPNrX'പിറ്റ്കെയ്ന്‍rUPLr Xപോളണ്ട്r!UZMr"Xസാംബിയr#UEHr$Xപശ്ചിമ സഹാറr%URUr&X റഷ്യr'UEEr(X!എസ്റ്റോണിയ‍r)UEGr*Xഈജിപ്ത്r+UZAr,X*ദക്ഷിണാഫ്രിക്കr-UECr.Xഇക്വഡോര്‍r/UITr0Xഇറ്റലിr1UVNr2Xവിയറ്റ്നാംr3UZZr4X{അറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ പ്രദേശംr5USBr6X7സോളമന്‍‍ ദ്വീപുകള്‍r7UETr8Xഎത്യോപ്യr9USOr:Xസോമാലിയr;UZWr<Xസിംബാബ്വേr=USAr>Xസൗദി അറേബ്യr?UESr@Xസ്പെയിന്‍rAUERrBXഎറിത്രിയrCUMErDX$മോണ്ടേനേഗ്രോrEUAQrFX0അന്‍റാര്‍ട്ടിക്കrGUMGrHXമഡഗാസ്കര്‍rIUMFrJX:സെന്‍റ് മാര്‍ട്ടിന്‍rKUMArLXമൊറോക്കൊrMUMCrNXമൊണോക്കൊrOUUZrPX0ഉസ്ബെക്കിസ്ഥാന്‍rQUMMrRX$മ്യാന്‍മാര്‍rSUMLrTX മാലിrUUMOrVX;മക്കാവോ എസ്.ഏ.ആര്‍. ചൈനrWUMNrXXമംഗോളിയrYUASrZX1അമേരിക്കന്‍ സാമോവr[UMKr\Xമാസിഡോണിയr]UMUr^Xമൌറീഷ്യസ്r_UMTr`Xമാള്‍ട്ടraUMWrbXമലാവിrcUMVrdXമാലിദ്വീപ്reUMQrfX'മാര്‍ട്ടീനിക്rgUMPrhXDഉത്തര മറിയാനാ ദ്വീപുകള്‍riUMSrjX*മോണ്ട്സെറാറ്റ്rkUMRrlX!മൌറിറ്റാനിയrmUIMrnX&ഐല്‍ ഓഫ് മാന്‍roUUGrpXഉഗാണ്ടrqUTZrrXടാന്‍സാനിയrsUMYrtXമലേഷ്യruUMXrvXമെക്സിക്കോrwUILrxXഇസ്രായേല്‍ryUFRrzXഫ്രാന്‍സ്r{UAWr|X അറുബr}UDOr~XFഡൊമിനിക്കന്‍ റിപ്പബ്ലിക്rUSHrX%സെന്‍റ് ഹെലീനrU054rXമെലനേഷ്യrUDJrXജിബൂട്ടിrUFJrX ഫിജിrU057rX7മൈക്രോനേഷ്യന്‍ ഭാഗംrU172rXvസ്വതന്ത്രരാഷ്ട്രങ്ങളുടെ കോമണ്‍‌വെല്‍ത്ത്rU053rXRഓസ്ട്രേലിയയും ന്യൂസിലാന്‍ഡുംrUNIrXനിക്കാരഗ്വrUNLrX*നെതര്‍ലന്‍ഡ്സ്rUNOrXനോര്‍വെrUNArXനമീബിയrUVUrXവന്വാത്തുrUNErXനൈഗര്‍rUNGrXനൈജീരിയrUNZrX'ന്യൂസിലാന്‍റ്rUNPrXനേപ്പാള്‍rUNRrX നൌറൂrUNUrXന്യൂവേrU061rXപോളിനേഷ്യrUCIrX%ഐവറി കോസ്റ്റ്rUCHrX6സ്വിറ്റ്സര്‍ലന്‍ഡ്rUCOrXകൊളംബിയrUCNrX ചൈനrUCMrXകാമറൂണ്‍rUCLrX ചിലിrUCCrXകോക്കസ്rUCArX കാനഡrUCGrX3കോംഗോ - ബ്രാസാവില്‍rUCFrXeസെന്‍ട്രല്‍ ആഫ്രിക്കന്‍ റിപ്പബ്ലിക്rUCDrX*കോംഗോ - കിന്‍ഷാസrUCZrX4ചെക്ക് റിപ്പബ്ലിക്rUCYrXസൈപ്രസ്സ്rUCXrX.ക്രിസ്മസ് ദ്വീപ്rUCRrX$കോസ്റ്ററിക്കrUPYrXപരാഗ്വേrUCVrX(കേപ്പ് വെര്‍ഡെrUCUrXക്യൂബrUSZrX'സ്വാസിലാന്‍റ്rUSYrXസിറിയrUKGrX*കിര്‍ഗിസ്ഥാന്‍rUKErXകെനിയrUSRrXസുറിനാംrU143rXമദ്ധ്യേഷ്യrUKHrXകംബോഡിയrUKNrXMസെയ്ന്‍റ് കിറ്റ്സും നെവിസുംrUKMrXകോമറോസ്rUSTrXWസാവോ റ്റമെ ആന്‍ഡ് പ്രിന്‍സിപ്പിrUSKrXസ്ലോവാക്യrUKRrX!ദക്ഷിണകൊറിയrUSIrXസ്ലോവേനിയrUKPrXഉത്തരകൊറിയrUKWrXകുവൈറ്റ്rUSNrXസെനഗല്‍rUSMrXസാന്‍ മറിനോrUSLrX(സിയേറാ ലിയോണ്‍rUSCrX!സെയ്ഷെല്‍സ്rUKZrX$കസാഖിസ്ഥാന്‍rUKYrX:കേയ്മാന്‍ ദ്വീപുകള്‍rUSGrX!സിംഗപ്പുര്‍rUSErXസ്വീഡന്‍rUSDrXസുഡാന്‍rU151rX4കിഴക്കന്‍ യൂറോപ്പ്rU150rXയൂറോപ്പ്rUDMrXഡൊമിനിക്കrU155rX+പശ്ചിമ യൂറോപ്പ്rU154rX+വടക്കേ യൂറോപ്പ്rUVGrX\ബ്രിട്ടീഷ് വിര്‍ജിന്‍ ദ്വീപുകള്‍rUDErXജര്‍മനിrUYErXയമന്‍r UMHr X@മാര്‍ഷല്‍‍‍ ദ്വീപുകള്‍r U062r X2ദക്ഷിണ-മദ്ധ്യ ഏഷ്യr UDZrXഅള്‍ജീരിയrUUSrXFഅമേരിക്കന്‍ ഐക്യനാടുകള്‍rUUYrXഉറൂഗ്വെrUYTrXമയോട്ട്rULBrXലബനോണ്‍rULCrX%സെന്‍റ് ലൂസിയrULArXലാവോസ്rUTVrXതുവാലുrUTWrXതായ്‌വാന്‍rUTTr XCട്രിനിഡാഡും റ്റൊബാഗോയുംr!UTRr"Xതുര്‍ക്കിr#ULKr$Xശ്രീലങ്കr%ULIr&X-ലൈച്ടെസ്റ്റിന്‍r'UCKr(X1കൂക്ക് ദ്വീപുകള്‍r)UTOr*X ടോംഗr+ULTr,Xലിത്വാനിയr-ULUr.X!ലക്സംബര്‍ഗ്r/ULRr0Xലൈബീരിയr1ULSr2Xലെസോത്തോr3UTHr4X$തായ്‌ലാന്‍ഡ്r5UTFr6XDദക്ഷിണ ഫ്രഞ്ച് ഭൂപ്രദേശംr7UTGr8X ടോഗോr9UTDr:X ചാഡ്r;ULYr<Xലിബിയr=UVAr>X$വത്തിക്കാന്‍r?U145r@Xപശ്ചിമേഷ്യrAUAErBX;സംയുക്ത അറബ് രാഷ്ട്രംrCUADrDXഅന്‍റോറrEUAGrFXDആന്‍റിഗ്വ ആന്‍റ് ബര്‍ബുഡrGUAFrHX*അഫ്ഗാനിസ്ഥാന്‍rIUAIrJX!ആന്‍ഗ്വില്ലrKUVIrLXNയു എസ് വെര്‍ജിന്‍ ദ്വീപുകള്‍rMUISrNX!ഐസ്‌ലാന്‍റ്rOUIRrPXഇറാന്‍rQUAMrRXഅര്‍മേനിയrSUALrTXഅല്‍ബേനിയrUUAOrVXഅംഗോളrWUANrXXIനെതര്‍ലന്‍ഡ്സ് ആന്‍റിലിസ്rYU003rZXJവടക്കേ അമേരിക്കന്‍ ഭൂഖണ്ഡംr[U002r\Xആഫ്രിക്കr]U001r^X ലോകംr_UARr`X!അര്‍ജന്‍റീനraUAUrbXഓസ്ട്രേലിയrcUATrdXഓസ്ട്രിയreU005rfX+ദക്ഷിണ അമേരിക്കrgUINrhXഇന്ത്യriUAXrjX4അലന്‍ഡ് ദ്വീപുകള്‍rkU009rlXഓഷ്യാനിയrmUAZrnX$അസര്‍ബൈജാന്‍roUIErpX$അയര്‍ലാന്‍ഡ്rqUIDrrX!ഇന്‍ഡോനേഷ്യrsUJOrtX$ജോര്‍ദ്ദാന്‍ruUQUrvX7യൂറോപ്യന്‍ യൂണിയന്‍rwUUArxXഉക്രൈന്‍ryUQArzXഖത്തര്‍r{UDKr|X*ഡെന്‍മാര്‍ക്ക്r}UMZr~X!മൊസാംബിക്ക്rUQOrX.നോര്‍ഫോക് ദ്വീപ്ruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9X yyyy, MMM drhYX%(yyyy)s, %(MMM)s %(d)srubUfullrhU)r}r(h9Xyyyy, MMMM d, EEEErhYX"%(yyyy)s, %(MMMM)s %(d)s, %(EEEE)srubUlongrhU)r}r(h9X yyyy, MMMM drhYX%(yyyy)s, %(MMMM)s %(d)srubUshortrhU)r}r(h9Xdd-MM-yyrhYX%(dd)s-%(MM)s-%(yy)srubuUcurrency_symbolsr}r(UCOPrXCol$rUMKDrXMഡെന്‍rUDZDrXDArUGHSrXGH¢rUBGLrX ലെവ്rUHNLrXLrUFJDrXF$rUETBrXBrrUCRCrXCrUBZDrXBZ$rUGNFrXGFrUGBPrX£rUIQDrXIDrUBOBrXBsrUBAMrXKMrULKRrXSL RerUDKKrXDKrrUCADrXCan$rULBPrXLLrUHUFrXFtrUCVErXCVEscrUKWDrXKDrUBMDrXബെര്‍$rUBIFrXFburUKHRrXCRrUXXXrX*[നാണയം അറിവില്ല]rUAMDrXഡ്രാംrUJODrXJDrUIEPrXIR£rUCYPrX£CrUHKDrXHK$rUGELrX ലാരിrUKGSrX സോംrUAFNrX അഫ്rUAUDrX$ArUCHFrXSwFrUESPrX₧rUBEFrXBFrUIRRrXRIrUBBDrXBDS$rUBYRrXRblrUITLrX₤rUCNYrXYrUKMFrXCFrUBDTrXTkrUARSrXഅര്‍ജ്$rUDJFrXDFrUDOPrXRD$rUCLPrXCh$rUALLrX ലെക്rUANGrXNA f.r UKZTr XTr UIDRr XRpr UGTQrXQrUBHDrXBDrUINRrXരൂrUJPYrX´rUJMDrXJ$rULSLrXMrUBTNrXNurUKESrXK ShrUGYDrXG$ruU time_zonesr }r!(UAtlantic/Canaryr"}r#Ucityr$Xക്യാനറിr%sUAntarctica/Mawsonr&}r'j$Xമാവ്സണ്‍r(sUAmerica/Buenos_Airesr)}r*j$X%ബ്യൂനസ് ഐറിസ്r+sUAustralia/Melbourner,}r-j$Xമെല്‍ബണ്‍r.sU Pacific/Waker/}r0j$Xവെയ്ക്r1sUAmerica/Nipigonr2}r3j$X!നിപ്പിഗോണ്‍r4sUAmerica/Louisviller5}r6j$Xലൂയിവില്‍r7sUAmerica/Indiana/Tell_Cityr8}r9j$XEറ്റെല്‍ സിറ്റി, ഇന്‍ഡ്യാനr:sUAustralia/Darwinr;}r<j$Xഡാര്‍വിന്‍r=sUAmerica/Whitehorser>}r?j$X$വൈറ്റ്ഹോഴ്സ്r@sUAntarctica/DavisrA}rBj$Xഡെയ്‌വിസ്rCsUAmerica/Coral_HarbourrD}rEj$X.കോറല്‍ ഹാര്‍ബര്‍rFsUAmerica/Swift_CurrentrG}rHj$X4സ്വിഫ്റ്റ് കറന്‍റ്rIsU Europe/SamararJ}rKj$X സമാറrLsUEurope/SimferopolrM}rNj$X$സിംഫെറോപോള്‍rOsUAmerica/MaceiorP}rQj$XമാസിയോrRsU Asia/MagadanrS}rTj$Xമഗഡാന്‍rUsUEurope/ZaporozhyerV}rWj$Xസാപ്പറോസൈrXsU Asia/KashgarrY}rZj$Xകാഷ്ഗര്‍r[sUAmerica/Detroitr\}r]j$X$ഡെട്രോയിറ്റ്r^sU Asia/Kuchingr_}r`j$Xകുചിങ്rasU Asia/Urumqirb}rcj$XഉറുംഖിrdsU Europe/Moscowre}rfj$Xമോസ്കോrgsUAmerica/Indiana/Knoxrh}rij$X/നോക്സ്, ഇന്‍ഡ്യാനrjsUAmerica/Indiana/Petersburgrk}rlj$XMപീറ്റേഴ്സ്ബര്‍ഗ്, ഇന്‍ഡ്യാനrmsUPacific/Kiritimatirn}roj$X$കിരിതിമാത്തിrpsUAsia/Pontianakrq}rrj$X$പൊന്‍റിയാനക്rssUAsia/Ulaanbaatarrt}ruj$X*ഉലാന്‍ബട്ടൂര്‍rvsUAmerica/Rainy_Riverrw}rxj$X%റെയ്നി റിവര്‍rysUAmerica/Argentina/San_Luisrz}r{j$X"സാന്‍ ലൂയിസ്r|sUAntarctica/Rotherar}}r~j$XറൊതീറrsUAustralia/Adelaider}rj$Xഅഡലെയ്ഡ്rsUAmerica/Indianapolisr}rj$X0ഇന്‍ഡ്യാനാപോലീസ്rsUAmerica/Reginar}rj$XറിജീനrsU Pacific/Trukr}rj$Xട്രക്rsUAmerica/Cambridge_Bayr}rj$X1കെയ്ന്പ്രിഡ്ജ് ബേrsUAmerica/Mexico_Cityr}rj$X1മെക്സിക്കോ സിറ്റിrsU America/Boiser}rj$Xബൊയ്സിrsUPacific/Chathamr}rj$Xചാത്തംrsUPacific/Midwayr}rj$Xമിഡ്‌വേrsU America/Jujuyr}rj$Xജുജുയ്rsUAmerica/Cordobar}rj$Xകൊര്‍ദോവrsU America/Belemr}rj$X ബെലംrsU Asia/Harbinr}rj$Xഹാര്‍ബിന്‍rsUAustralia/Lord_Hower}rj$Xലോഡ് ഹോവ്rsUAmerica/Argentina/San_Juanr}rj$X%സാന്‍ ജുവാന്‍rsUPacific/Kosraer}rj$Xകൊസ്രേrsUAmerica/North_Dakota/New_Salemr}rj$XXന്യൂ സെയ്‌ലം, നോര്‍ത്ത് ഡക്കോട്ടrsUAmerica/Monterreyr}rj$X!മോണ്ടര്‍‌റേrsUAsia/Krasnoyarskr}rj$X*ക്രാസ്നോയാസ്ക്rsUAmerica/Boa_Vistar}rj$Xബോവ വിസ്റ്റrsUAsia/Yekaterinburgr}rj$X9യാകാറ്റെറിന്‍ബര്‍ഗ്rsUAustralia/Currier}rj$Xക്യൂറിrsUAntarctica/Caseyr}rj$X കാസെrsUPacific/Honolulur}rj$XഹോണലൂലുrsUPacific/Enderburyr}rj$Xഎന്‍ഡബറിrsU America/Thuler}rj$X തൂളിrsUAmerica/St_Johnsr}rj$X1സെയ്ന്‍റ് ജോണ്‍സ്rsUAmerica/Monctonr}rj$Xമോങ്റ്റണ്‍rsUPacific/Majuror}rj$XമജൂറോrsUAmerica/Mazatlanr}rj$X$മാസറ്റ്ലാന്‍rsUAsia/Choibalsanr}rj$X$ചൊയ്ബല്‍സന്‍rsUAmerica/Blanc-Sablonr}rj$X4ബ്ലാങ്ക് സാബ്ലോണ്‍rsU Europe/Kievr}rj$X കീവ്rsUAntarctica/Syowar}rj$Xസ്യോവrsUAmerica/Halifaxr}rj$Xഹാലിഫാക്സ്rsUAntarctica/McMurdor}rj$Xമാക്മര്‍ഡോrsU Asia/Hovdr}rj$X ഹൌഡ്rsUAmerica/Danmarkshavnr}rj$X?ഡാന്‍മാര്‍ക്ക്ഷാവ്ന്‍rsUAmerica/Thunder_Bayr}rj$Xതണ്ടര്‍ ബേrsUAmerica/Scoresbysundr}rj$X0സ്കോര്‍സ്ബൈസണ്ട്rsUAmerica/Eiruneper}rj$Xയെറുനീപ്പെrsUAmerica/Manausr}rj$Xമനൌസ്rsUAmerica/Los_Angelesr}rj$X(ലോസ് എയ്ഞ്ചലസ്rsUAmerica/Noronhar}rj$XനൊറോനrsUAmerica/Goose_Bayr}rj$Xഗൂസ് ബേrsUAmerica/Catamarcar}rj$X0‍ക്യാറ്റമാര്‍ക്കr sUAmerica/Chihuahuar }r j$Xചിവാവുr sUAmerica/Argentina/Rio_Gallegosr }rj$X(റിയോ ഗ്യാലഗോസ്rsUPacific/Gambierr}rj$Xഗാന്പിയര്‍rsUAmerica/Vancouverr}rj$X$വാന്‍‌കൂവര്‍rsUEurope/Volgogradr}rj$X'വോള്‍ഗോഗ്രാഡ്rsUEurope/Uzhgorodr}rj$Xഉസ്ഗൊറോഡ്rsUPacific/Ponaper}rj$Xപൊനാപ്rsU Asia/Aqtaur}r j$Xഅഖ്തൌr!sUAmerica/Sao_Paulor"}r#j$Xസാവോ പോലോr$sUAmerica/Edmontonr%}r&j$X$എഡ്മോണ്‍ടണ്‍r'sUAustralia/Perthr(}r)j$Xപെര്‍ത്ത്r*sUAmerica/Mendozar+}r,j$Xമെന്‍ഡോസr-sUAmerica/Meridar.}r/j$Xമെരിഡr0sUPacific/Easterr1}r2j$Xഈസ്റ്റര്‍r3sU Asia/Jakartar4}r5j$X!ജക്കാര്‍ത്തr6sUAntarctica/Palmerr7}r8j$Xപാമര്‍r9sUAustralia/Sydneyr:}r;j$Xസിഡ്നിr<sUAtlantic/Madeirar=}r>j$Xമഡെയ്റr?sU Asia/Oralr@}rAj$Xഓറല്‍rBsUAmerica/Campo_GranderC}rDj$X4ക്യാന്പോ ഗ്രാന്‍ഡെrEsUAmerica/Dawson_CreekrF}rGj$X1ഡോവ്സണ്‍ ക്രീക്ക്rHsUAfrica/KinshasarI}rJj$Xകിന്‍ഷാസrKsUAntarctica/VostokrL}rMj$Xവോസ്റ്റോക്rNsUAustralia/LindemanrO}rPj$X$ലിന്‍ഡെമാന്‍rQsUAmerica/Porto_VelhorR}rSj$X.പോര്‍ട്ടോ വെല്ലോrTsUAmerica/Argentina/UshuaiarU}rVj$X ഉഷിയrWsUPacific/GalapagosrX}rYj$X!ഗാലപ്പാഗോസ്rZsUAmerica/Indiana/Marengor[}r\j$X5മരെങ്കോ, ഇന്‍ഡ്യാനാr]sU Africa/Ceutar^}r_j$Xക്യൂട്ടr`sUAmerica/Winnipegra}rbj$Xവിന്നിപെഗ്rcsUAmerica/Dawsonrd}rej$Xഡോവ്സണ്‍rfsUAustralia/Brisbanerg}rhj$X*ബ്രിസ്‌ബേയ്ന്‍risU Asia/Aqtoberj}rkj$Xഅഖ്തോബ്rlsUAmerica/Reciferm}rnj$XറെസീഫെrosU Asia/Sakhalinrp}rqj$Xസഖാലിന്‍rrsUPacific/Kwajaleinrs}rtj$X$ക്വാജലെയ്ന്‍rusUAmerica/Fortalezarv}rwj$X!ഫോര്‍ട്ടലീസrxsUAustralia/Broken_Hillry}rzj$X.ബ്രോക്കണ്‍ ഹില്‍r{sUAmerica/Phoenixr|}r}j$Xഫീനിക്സ്r~sUAmerica/Cuiabar}rj$Xകുയ്ബrsUAmerica/Kentucky/Monticellor}rj$XDമോണ്ടിസെല്ലോ, കെന്‍റക്കിrsUPacific/Tarawar}rj$X തരാവrsUAmerica/Yellowknifer}rj$Xയെല്ലോനൈഫ്rsUAmerica/Rio_Brancor}rj$X%റിയോ ബ്രാങ്കോrsUAmerica/Cancunr}rj$Xകന്‍കൂന്‍rsUAsia/Vladivostokr}rj$X0വ്ളാഡിവോസ്റ്റോക്rsUPacific/Johnstonr}rj$X'ജോണ്‍സ്റ്റണ്‍rsUEurope/Kaliningradr}rj$X3ക്യാലിനിന്‍ഗ്രാഡ്rsU Asia/Makassarr}rj$Xമകസ്സര്‍rsUAsia/Qyzylordar}rj$Xഖിസിലോര്‍ഡrsUAmerica/Argentina/Tucumanr}rj$X!റ്റുകുമാന്‍rsUAtlantic/Azoresr}rj$Xഎയ്സോര്‍സ്rsUAsia/Chongqingr}rj$Xചോങ്ഖിങ്rsUAustralia/Euclar}rj$Xയൂക്ലrsUAmerica/Chicagor}rj$Xചിക്കാഗോrsUAmerica/Rankin_Inletr}rj$X:റാങ്കിന്‍ ഇന്‍ലെറ്റ്rsUAmerica/Iqaluitr}rj$Xഇഖാലിത്rsU Asia/Irkutskr}rj$Xഇര്‍കസ്ക്rsUAsia/Samarkandr}rj$X$സമര്‍ക്കന്ദ്rsUAmerica/Menomineer}rj$XമെനോമിനീrsUAmerica/Denverr}rj$Xഡെന്‍‌വര്‍rsUAsia/Kamchatkar}rj$Xകാംചട്കrsUAmerica/Glace_Bayr}rj$Xഗ്ലെയ്സ് ബേrsU Asia/Jayapurar}rj$XജയപുരrsUAmerica/Hermosillor}rj$X'ഹെര്‍മോസില്ലോrsUAmerica/North_Dakota/Centerr}rj$XQസെന്‍റര്‍, നോര്‍ത്ത് ഡക്കോട്ടrsUAmerica/Pangnirtungr}rj$X-പാന്‍ഗ്‌നിറ്റങ്rsUAmerica/Resoluter}rj$X!റെസല്യൂട്ട്rsUAmerica/Indiana/Vevayr}rj$X/വിവെയ്, ഇന്‍ഡ്യാനrsU Asia/Yakutskr}rj$Xയാകസ്ക്rsUAmerica/Shiprockr}rj$X$ഷിപ്പ്റോക്ക്rsUAmerica/Tijuanar}rj$XതിയുവാനrsU America/Adakr}rj$Xഅഡാക്rsUAntarctica/DumontDUrviller}rj$XAഡ്യൂമണ്ട് ഡി യുര്‍വില്‍rsUAmerica/Indiana/Vincennesr}rj$XAവിന്‍സെന്‍സ്, ഇന്‍ഡ്യാനrsU Asia/Almatyr}rj$Xഅല്‍മതിrsUAmerica/Argentina/La_Riojar}rj$Xലാ റിയോജrsUAsia/Novosibirskr}rj$X-നൊവോസിബിര്‍സ്ക്rsUAmerica/Indiana/Winamacr}rj$X5വിനാമാക്, ഇന്‍ഡ്യാനrsUAfrica/Lubumbashir}rj$XലൂബുംബാഷിrsUPacific/Marquesasr}rj$X'മാര്‍ക്യുസാസ്rsU Asia/Anadyrr}rj$Xഅനാഡിര്‍rsUAmerica/New_Yorkr }r j$X'ന്യൂയോര്‍ക്ക്r sU America/Nomer }r j$X നൌംr sUAmerica/Yakutatr }r j$X$യാകുറ്റാറ്റ്r sUAustralia/Hobartr }r j$X!ഹൊബാര്‍ട്ട്r sUAmerica/Juneaur }r j$Xജുനിയുr sUAmerica/Inuvikr }r j$Xഇനുവിക്r sUAmerica/Araguainar }r j$Xഅറഗ്വൈനr sUAmerica/Montrealr }r j$X'മോണ്ട്രിയാല്‍r sUAmerica/Torontor }r j$Xടൊറണ്ടോr sU Etc/Unknownr }r j$X4അറിയപ്പെടാത്ത നഗരംr sU America/Bahiar }r j$X ബഹിയr sUAmerica/Anchorager! }r" j$Xആങ്കറേജ്r# sU Asia/Omskr$ }r% j$Xഒംസ്ക്r& sUAntarctica/South_Poler' }r( j$X%ദക്ഷിണ ധ്രൂവംr) suUscriptsr* }r+ (UZsymr, X സൈംr- UGurur. Xഗുരുമുഖിr/ UHebrr0 Xഹീബ്രുr1 UZzzzr2 Xrഅറിയപ്പെടാത്തതോ നിലവിലില്ലാത്തതോ ആയ ലിപിr3 UPhnxr4 Xഫിനീഷ്യന്‍r5 UMoonr6 Xമൂണ്‍r7 USamrr8 Xസമരിയr9 UChamr: Xഛംr; UArabr< X അറബിr= UGujrr> Xഗുജറാത്തിr? UZxxxr@ X-എഴുതപ്പെടാത്തത്rA ULycirB Xലൈസിന്‍rC USinhrD XസിംഹളrE UTalurF X)പുതിയ തായ് ല്യൂrG UMongrH Xമംഗോളിയന്‍rI UXpeorJ X+പഴയ പേര്‍ഷ്യന്‍rK UVisprL Xദൃശ്യഭാഷrM URjngrN Xറെജാംഗ്rO UOlckrP Xഒല്‍ ചിക്കിrQ UTalerR Xതായ് ലേrS UMandrT Xമന്‍ഡേയന്‍rU UManirV Xമണിചേയന്‍rW UMlymrX XമലയാളംrY UTibtrZ Xടിബറ്റന്‍r[ UKalir\ Xകയാ ലിr] UJpanr^ Xജാപ്പനീസ്r_ UPlrdr` X:പൊള്ളാര്‍ഡ് ശബ്ദലിപിra UKanarb Xകടകാനrc ULydird Xലൈഡിയന്‍re ULepcrf Xലെപ്ചrg USundrh Xസന്താനീസ്ri UYiiirj Xയിrk UJavarl Xജാവനീസ്rm UOryarn X ഒറിയro ULaoorp X ലാവോrq UUgarrr X!ഉഗ്രൈറ്റിക്rs UCyrlrt Xസിറിലിക്ru UVaiirv Xവൈrw UArmnrx X$അര്‍മേനിയന്‍ry UCyrsrz X`പുരാതന ചര്‍ച്ച് സ്ലവോണിക് സിറിലിക്r{ UKhmrr| Xഖമര്‍r} UArmir~ Xഅര്‍മിr USylor X"സൈലോതി നാഗരിr UItalr X+പഴയ ഇറ്റാലിയന്‍r USgnwr Xചിഹ്നലിപിr UXsuxr XPസുമേറോ അക്കാഡിയന്‍ ക്യുണിഫോംr UThaar X ഥാനr UThair X തായ്r UCprtr X$സൈപ്രിയോട്ട്r ULinbr X+സമരേഖയിലുള്ള ബിr ULinar X(സമരേഖയിലുള്ള എr UOsmar Xഒസ്‌മാനിയr USaurr Xസൌരാഷ്ട്രr UHirar Xഹിരഗാനr UHanir Xഹാന്‍r UEgydr X@ഈജിപ്ഷ്യന്‍ ഡിമോട്ടിക്r UQaair X$പാരമ്പര്യമായr UEgyhr X@ഈജിപ്ഷ്യന്‍ ഹിരാറ്റിക്r UCansr XJഏകീകൃത കനേഡിയന്‍ ഗോത്രലിപിr UEgypr X=ഈജിപ്ഷ്യന്‍ ചിത്രലിപിr UZmthr Xസ്മത്ത്r UTfngr Xതിഫിനാഗ്r UShawr Xഷാവിയന്‍r UCirtr Xചിര്‍ത്ത്r UGeorr X'ജോര്‍ജ്ജിയന്‍r UTengr Xതെംഗ്വര്‍r UHrktr X.കടകാനയോ ഹിരഗാനയോr UGeokr X@ജോര്‍ജ്ജിയന്‍ ഖുട്സുരിr UTavtr Xത്വട്r UOgamr X ഒഖാംr UDsrtr X!ഡെസെര്‍ട്ട്r UGothr Xഗോഥിക്r UHanor Xഹനുനൂr UBalir Xബാലിനീസ്r UKorer Xകൊറിയന്‍r UHangr Xഹാംഗുള്‍r UCarir Xചരിയന്‍r UAvstr Xഅവെസ്ഥന്‍r UTagbr Xതഗ്ബന്‍വാr UHansr X(പരിഷ്കൃത ഹാന്‍r UHantr X1പരമ്പരാഗത ചീനലിപിr URoror Xറൊംഗോറൊംഗോr UDevar Xദേവനാഗരിr UIndsr Xഇന്‍ഡസ്r UBopor Xബൊപൊമോഫോr UMymrr X$മ്യാന്‍മാര്‍r UTglgr Xതഗലോഗ്r UPermr X.പുരാതന പെര്‍മിക്r UBugir Xബുഗിനീസ്r UPhagr Xഫഗസ് പr UBrair Xബ്രെയ്‌ലിr UBrahr Xബ്രാഹ്മിr UBatkr Xബട്ടക്r UMeror X$മെറോയിറ്റിക്r ULimbr Xലിംബുr UMteir X"മേറ്റി മായക്r UPhlir X ഫ്ലിr UTelur Xതെലുങ്ക്r UTamlr Xതമിഴ്r USarar X സരതിr UPhlpr Xഫ്ല്‍പ്r ULatgr X7ഗെയ്‌ലിക് ലാറ്റിന്‍r ULatfr X=ഫ്രാക്ടുര്‍ ലാറ്റിന്‍r UKharr Xഖരോഷ്ടിr UNkoor Xന്‍ കോr UPhlvr X"പഹല്‍വി ലിപിr ULatnr Xലാറ്റിന്‍r UMayar X.മായന്‍ ചിത്രലിപിr ULanar X ലന്നr UEthir Xഎത്യോപിക്r UKthir X ക്തിr UHmngr X"പഹ്വാ ഹമോംഗ്r UBuhdr Xബുഹിഡ്r UCoptr Xകോപ്റ്റിക്r UPrtir X പൃതിr UGlagr X'ഗ്ലഗോലിറ്റിക്r URunrr Xറുണിക്r UOrkhr Xഒര്‍ഖോണ്‍r UCakmr X ചകംr UHungr X1പുരാതന ഹംഗേറിയന്‍r UGrekr Xഗ്രീക്ക്r UCherr Xചെരോക്കീr UZyyyr Xസാധാരണr! USyrcr" Xസിറിയക്ക്r# UBlisr$ X/ബ്ലിസ് ചിത്ര ലിപിr% UBengr& Xബംഗാളിr' USyrer( X@എസ്റ്റ്രാംഗ്ലോ സിറിയക്r) USyrjr* X*പശ്ചിമസുറിയാനിr+ USyrnr, X1കിഴക്കന്‍ സിറിയക്r- UKndar. Xകന്നഡr/ uUvariantsr0 }r1 (UNEDISr2 XIനേറ്റിസോണ്‍ പ്രാദേശികരൂപംr3 UREVISEDr4 X4പരിഷ്ക്കരിച്ച ലിപിr5 U1996r6 X11996-ലെ ജര്‍മന്‍ ലിപിr7 UFONIPAr8 X2ഐപി‌എ സ്വനവ്യവസ്ഥr9 UBOONTr: X'ബൂണ്ട്‌ലിങ്ങ്r; UNJIVAr< XGഗ്നിവ/നിജിവ പ്രാദേശികരൂപംr= UMONOTONr> X$മോണോറ്റോണിക്r? U1606NICTr@ Xa1606 വരെയുള്ള ആധുനികമദ്ധ്യകാല ഫ്രഞ്ച്rA UAREVELArB X@കിഴക്കന്‍ അര്‍മീനിയന്‍rC UPOSIXrD XRകമ്പ്യൂട്ടറിന്റെ ഉപയോഗത്തിന്rE uUnumber_symbolsrF }rG (UgrouprH X,rI UnativeZeroDigitrJ X0rK U exponentialrL XErM UperMillerN X‰rO UnanrP Xസംഖ്യയല്ലrQ UdecimalrR X.rS U percentSignrT hFUlistrU X;rV UplusSignrW X+rX UinfinityrY X∞rZ U minusSignr[ hഉറുഗ്വേ പെയ്സോ ഉറുഗായോr ULUCr Xqലക്സംബര്‍ഗ് കണ്‍വേര്‍ട്ടിബിള്‍ ഫ്രാങ്ക്r jX.ജമൈക്കന്‍ ഡോളര്‍r UFRFr Xഫ്രാങ്ക്r UMAFr X8മൊറോക്കന്‍ ഫ്രാങ്ക്r UUYIr XTഉറുഗ്വേ പെയ്സോ എന്‍ യൂണിഡാഡ്സ്r UMZMr X\ഓള്‍ഡ് മൊസാന്പിക്ക് മെറ്റിക്കല്‍r UMZNr XIമൊസാന്പിക്ക് മെറ്റിക്കല്‍r UPHPr X4ഫിലിപ്പൈന്‍ പെയ്സോr UZARr XIദക്ഷിണാഫ്രിക്കന്‍ റാന്‍ഡ്r URHDr X1റൊഡേഷ്യന്‍ ഡോളര്‍r UGWPr X5ഗിനിയ-ബിസാവു പെയ്സോr ULUFr X:ലക്സംബര്‍ഗ് ഫ്രാങ്ക്r UBELr X7ബല്‍ജിയന്‍ ഫ്രാങ്ക്r UBECr X}ബെല്‍ജിയന്‍ ഫ്രാങ്ക് (കൈമാറ്റം ചെയ്യാവുന്നത്)r UNGNr X(നൈജീരിയന്‍ നൈറr UYUNr Xwയൂഗോസ്ലേവിയന്‍ കണ്‍വേര്‍ട്ടിബിള്‍ ദിനാര്‍r jX:ബെല്‍ജിയന്‍ ഫ്രാങ്ക്r UPLZr X8പോളിഷ് സ്ലോട്ടി (1950-1995)r jXDകോസ്റ്റാ റിക്കന്‍ കോളന്‍r UTRLr XAപ്രാചീന തുര്‍ക്കിഷ് ലിറr UDEMr X4ജര്‍മന്‍ മാര്‍ക്ക്r UEEKr X=എസ്റ്റൌനിയന്‍ ക്രൂണ്‍r UMWKr Xമലാവി ക്വാചr UTTDr X]ട്രിനിഡാഡ് ആന്‍ഡ് റ്റൊബാഗോ ഡോളര്‍r jX+ശ്രീലങ്കന്‍ രൂപr USKKr X(സ്ലോവാക് കൊരൂനr jXDകെയ്പ് വെര്‍ഡെ എസ്ക്യുഡോr UPKRr X.പാക്കിസ്ഥാനി രൂപr jX:ഹംഗേറിയന്‍ ഫോറിന്‍റ്r UROLr XAപ്രാചീന റൊമേനിയന്‍ ലിയുr UXEUr XDയൂറോപ്യന്‍ നാണയ യൂണിറ്റ്r jX4ബെര്‍മുഡന്‍ ഡോളര്‍r UOMRr X(ഒമാന്‍ റിയാല്‍r jX%ലെസോതോ ലോത്തിr ULSMr Xമലോത്തിr UMNTr X7മംഗോളിയന്‍ തുഗ്രിക്r jX4അര്‍മേനിയന്‍ ഡ്രാംr UYUDr XVയൂഗോസ്ലേവിയന്‍ ഹാര്‍ഡ് ദിനാര്‍r UBUKr X+ബര്‍മീസ് ചാറ്റ്r! USYPr" X+സിറിയന്‍ പൌണ്ട്r# UQARr$ X+ഖത്തര്‍ റിയാല്‍r% UXDRr& XSസ്പെഷ്യല്‍ ഡ്രോയിംഗ് റൈറ്റ്സ്r' UNLGr( XFനെതര്‍ലന്‍ഡ്സ് ഗില്‍ഡര്‍r) UGEKr* X`ജോര്‍‍ജ്ജിയന്‍ ക്യൂപോണ്‍ ലാരിറ്റ്r+ UMTPr, X1മല്‍ത്തീസ് പൌണ്ട്r- jX\ബ്രിട്ടീഷ് പൌണ്ട് സ്റ്റെര്‍ലിംങ്r. jX8ജോര്‍‍ജ്ജിയന്‍ ലാരിr/ USHPr0 X>സെയ്ന്‍റ് ഹെലെന പൌണ്ട്r1 jXഅഫ്ഘാനിr2 USBDr3 XJസോളമന്‍ ദ്വീപുകളുടെ ഡോളര്‍r4 UCSKr5 XVചെക്കോസ്ലൊവാക്ക് ഹാര്‍ഡ് കൊരൂനr6 UKPWr7 XDനോര്‍ത്ത് കൊറിയന്‍ വോണ്‍r8 UXREr9 XRINET ഫണ്ട്സ്r: UCSDr; XMപ്രാചീന സെര്‍ബിയന്‍ ദിനാര്‍r< UAFAr= X!അഫ്ഘാനി (1927-2002)r> UTHBr? Xതായ് ബട്ട്r@ UBYBrA XPബെലാറഷ്യന്‍ ന്യൂ റൂബിള്‍ (1994-1999)rB jX.ബംഗ്ലാദേശി ടാക്കrC UGRDrD X4ഗ്രീക്ക് ഡ്രാക്ക്മrE UYERrF X"യമനി റിയാല്‍rG UDDMrH Xfകിഴക്കന്‍ ജര്‍മന്‍ ഓസ്റ്റ്മാര്‍ക്ക്rI USZLrJ X@സ്വാസിലാന്‍ഡ് ലിലാംഗനിrK UHTGrL X4ഹെയ്ഷ്യന്‍ ഗൂര്‍ഡ്rM UTRYrN X+തുര്‍ക്കിഷ് ലിറrO UMGArP X1മഡഗാസ്കര്‍ ഏരിയറിrQ jXeനെതര്‍ലന്‍ഡ്സ് ആന്‍റിലന്‍ ഗില്‍ഡര്‍rR ULRDrS X1ലൈബീരിയന്‍ ഡോളര്‍rT URWFrU X7റുവാണ്ടന്‍ ഫ്രാങ്ക്rV UNOKrW X=നോര്‍വീജിയന്‍ ക്രോണ്‍rX UMXVrY Xrമെക്സിക്കന്‍ യൂണിഡാഡ് ഡി ഇന്‍വെര്‍ഷന്‍ (UDI)rZ jX4കെനിയന്‍ ഷില്ലിംഗ്r[ UMOPr\ Xമകൌ പതാക്കr] jX%ഇന്ത്യന്‍ രൂപr^ UMXNr_ X1മെക്സിക്കന്‍ പെസോr` UCZKra XDചെക്ക് റിപ്പബ്ലിക് കൊരൂനrb UTJSrc X7തജികിസ്ഥാന്‍ സൊമോനിrd UTJRre X:തജിക്സ്ഥാന്‍ റൂബിള്‍rf jX@ഭൂട്ടാന്‍ എന്‍ഗള്‍ട്രംrg UYDDrh X"യമനി ദിനാര്‍ri UGWErj XQപോര്‍ച്ചുഗീസ് ഗിനി എസ്ക്യൂഡോrk jX+കൊളംബിയന്‍ പെസോrl UCOUrm XEയൂണിഡാഡ് ഡി വാലര്‍ റിയല്‍rn UMTLro X(മല്‍ത്തീസ് ലിറrp UMURrq X%മൌറീഷ്യസ് രൂപrr j X1ഇന്തോനേഷ്യന്‍ രൂപrs jX:ഹോന്‍ഡ്യുറാസ് ലെംപീരrt UXPFru XCFP ഫ്രാങ്ക്rv jXഫിജി ഡോളര്‍rw jX7എത്യോപ്പിയന്‍ ബിര്‍rx UPENry XAപെറൂവിയന്‍ സോള്‍ ന്യൂവോrz jX%ബെലീസ് ഡോളര്‍r{ UCHWr| XWIR ഫ്രാങ്ക്r} UATSr~ XCഓസ്ട്രേലിയന്‍ ഷില്ലിംഗ്r UILPr X+ഇസ്രയേലി പൌണ്ട്r UZRNr X5സൈറിയന്‍ ന്യൂ സൈര്‍r jX7ഡൊമിനിക്കന്‍ പെയ്സോr ULULr Xbലക്സംബര്‍ഗ് ഫിനാന്‍ഷ്യല്‍ ഫ്രാങ്ക്r UTMMr XCതുര്‍ക്മെനിസ്ഥാന്‍ മനത്r UTWDr X1തായ്‌വാന്‍ ഡോളര്‍r UMDLr X.മൊല്‍ഡോവന്‍ ലിയൂr UXPTr Xപ്ലാറ്റിനംr UECVr X{ഇക്വഡോര്‍ യൂണിഡാഡ് വാലര്‍ കോണ്‍സ്റ്റന്‍റെ (UVC)r UECSr X.ഇക്വഡോര്‍ സൂക്രേr UBSDr X/ബഹാമിയന്‍ ഡോളര്‍r USEKr XSEKr UTOPr Xറ്റോംഗ പാംഗr UPEIr X1പെറൂവിയന്‍ ഇന്‍റിr UZMKr X+സാംബിയന്‍ ക്വാചr UMVRr X%മാലദ്വീപ് രൂപr UXTSr XJറ്റെസ്റ്റിംഗ് കറന്‍സി കോഡ്r jX:ആസ്ട്രേലിയന്‍ ഡോളര്‍r UADPr X:അന്‍ഡോറന്‍ പെസെയ്റ്റr UCUPr X%ക്യൂബന്‍ പെസോr jX"ഐറിഷ് പൌണ്ട്r UCLFr XZചിലിയന്‍ യൂണിഡാഡ്സ് ഡി ഫോമെന്‍റോr jX1ബാര്‍ബഡോസ് ഡോളര്‍r jX+കൊമോറോ ഫ്രാങ്ക്r UKRWr X;ദക്ഷിണ കൊറിയന്‍ വോണ്‍r UGMDr X%ഗാന്പിയ ദലാസിr UVEFr X\വെനസ്വേലന്‍ ബോലിവര്‍ ഫുവെര്‍റ്റെr jXFഗ്വാട്ടിമാല ക്വെറ്റ്സല്‍r UVEBr X:വെനസ്വേലന്‍ ബോലിവര്‍r UXOFr X"CFA ഫ്രാങ്ക് BCEAOr USITr X4സ്ലൊവേനിയ റ്റോളര്‍r USDPr XAപ്രാചീന സുഡാനീസ് പൌണ്ട്r jX%ചിലിയന്‍ പെസോr UEURr X യൂറോr UCDFr XSകോങ്കളീസ് ഫ്രാങ്ക് കോങ്കൊളൈസ്r UXCDr XKകിഴക്കന്‍ കരീബിയന്‍ ഡോളര്‍r j X:കസാഖ്സ്ഥാന്‍ റ്റെംഗെr URUBr X+റഷ്യന്‍ റൂബിള്‍r UXFUr X5ഫ്രെഞ്ച് UIC-ഫ്രാങ്ക്r UXAGr Xവെള്ളിr UBRRr XAബ്രസീലിയന്‍ ക്രുസെയ്റോr UBRNr XGബ്രസീലിയന്‍ ക്രുസാഡോ നോവോr UBRLr X7ബ്രസീലിയന്‍ റിയാല്‍r UMMKr X7മ്യാന്‍മാര്‍ ചാറ്റ്r UUYPr X4ഉറുഗ്വേ പെയ്സോ (1975-1993)r URURr X7റഷ്യന്‍ റൂബിള്‍ (1991-1998)r UPLNr X+പോളിഷ് സ്ലോട്ടിr UBREr XMബ്രസീലിയന്‍ ക്രുസെയ്റോ (1990-1993)r UPYGr X(പരാഗ്വേ ഗ്വരനീr UBRCr X:ബ്രസീലിയന്‍ ക്രുസാഡോr UBRBr XZബ്രസീലിയന്‍ ക്രുസെയ്റോ നോവോ (1967-1986)r USVCr XAഎല്‍ സാല്‍വഡോര്‍ കോളന്‍r UAEDr X%യു.എ.ഇ. ദിര്‍ഹംr UGNSr Xഗിനിയ സൈലിr jX:മാസിഡോണിയന്‍ ദിനാര്‍r UAZMr XIഅസര്‍ബയ്ജാനിയന്‍ മനത് (1993-2006)r UAZNr X=അസര്‍ബയ്ജാനിയന്‍ മനത്r UUSNr XGയുഎസ് ഡോളര്‍ (അടുത്ത ദിവസം)r UGQEr Xiഇക്വിറ്റോറിയല്‍ ഗിനിയ എക്വീലെ ഗിനിയാനr UVUVr X"വനുവാതു വാതുr UBADr XMബോസ്നിയ-ഹെര്‍സഗോവിന ദിനാര്‍r jX(ഗിനിയ ഫ്രാങ്ക്r UMXPr X`മെക്സിക്കന്‍ സില്‍വര്‍ പെയ്സോ (1861-1992)r jX+ഇറാക്കി ദിനാര്‍r UERNr X.എറിത്രിയന്‍ നക്ഫr jXബോസ്നിയ-ഹെര്‍സഗോവിന കണ്‍വേര്‍ട്ടിബിള്‍ മാര്‍ക്ക്r USCRr X+സെയ്ഷെല്‍സ് രൂപr jX.കനേഡിയന്‍ ഡോളര്‍r USDDr XDപ്രാചീന സുഡാനീസ് ദിനാര്‍r jX(സൈപ്രസ് പൌണ്ട്r UMADr X4മൊറോക്കന്‍ ദിര്‍ഹംr jX.കുവൈറ്റി ദിനാര്‍r jX1ബുറുണ്ടി ഫ്രാങ്ക്r ULTTr X:ലിത്വാനിയന്‍ തലോനാസ്r UPGKr X3പാപുവ ന്യൂ ഗിനി കിനr ULTLr X.ലിത്വാനിയന്‍ ലിതr USGDr X4സിംഗപ്പൂര്‍ ഡോളര്‍r UUZSr X4ഉസ്ബക്കിസ്ഥാന്‍ സംr USTDr Xjസാവോ റ്റോമി ആന്‍ഡ് പ്രിന്‍സിപ്പി ഡോബ്രr UXFOr XGഫ്രെഞ്ച് ഗോള്‍ഡ് ഫ്രാങ്ക്r UMLFr X%മാലി ഫ്രാങ്ക്r jX1സ്പാനിഷ് പസെയ്റ്റr jX1ഇറാനിയന്‍ റിയാല്‍r UZRZr X(സൈറിയന്‍ സൈര്‍r jX(ചൈനീസ് യുവാന്‍r USLLr X;സിയറാ ലിയോണ്‍ ലിയോണ്‍r UTNDr X4തുനീസിയന്‍ ദിനാര്‍r jXഗയാന ഡോളര്‍r UESBr Xസ്പാനിഷ് പസെയ്റ്റ (കൈമാറ്റം ചെയ്യാവുന്ന അക്കൌണ്ട്)r UESAr XQസ്പാനിഷ് പസെയ്റ്റ (A അക്കൌണ്ട്)r UNZDr X:ന്യൂസിലാന്‍ഡ് ഡോളര്‍r! UFKPr" XYഫോക്‌ലാന്‍ഡ് ദ്വീപുകളുടെ പൌണ്ട്r# ULVLr$ X=ലാറ്റ്വിയന്‍ ലാറ്റ്സ്r% UUSSr& X>യുഎസ് ഡോളര്‍ (അതേ ദിവസം)r' UUSDr( X$യു.എസ്. ഡോളര്‍r) UARPr* XFഅര്‍ജന്‍റീന്‍ പെയ്സോ (1983-1985)r+ jX4കിര്‍ഗിസ്ഥാന്‍ സോംr, jX:അര്‍ജന്‍റീന്‍ പെയ്സോr- UILSr. X4ഇസ്രായേലി ഷക്കേല്‍r/ URONr0 X+റൊമേനിയന്‍ ലിയുr1 URSDr2 X7സെര്‍ബിയന്‍ ദിനാര്‍r3 jX+ബഹറിന്‍ ദിനാര്‍r4 jX+ജപ്പാനീസ് യെന്‍r5 UARAr6 XCഅര്‍ജന്‍റീന്‍ ഓസ്ട്രല്‍r7 USDGr8 X+സുഡാനീസ് പൌണ്ട്r9 UPTEr: XCപോര്‍ച്ചുഗീസ് എസ്ക്യുഡോr; UXAUr< Xസ്വര്‍ണ്ണംr= uUmonthsr> }r? (U stand-aloner@ }rA UnarrowrB }rC (KXജrD KXഫെrE KXമrF KXഏrG KXമേrH KXജൂrI KXജൂrJ KXആrK K XസെrL K XഒrM K XനrN K XഡിrO usUformatrP }rQ (UwiderR }rS (KXജനുവരിrT KXഫെബ്രുവരിrU KXമാര്‍ച്ച്rV KXഏപ്രില്‍rW KX മേയ്rX KXജൂണ്‍rY KX ജൂലൈrZ KXഓഗസ്റ്റ്r[ K X$സെപ്റ്റംബര്‍r\ K Xഒക്ടോബര്‍r] K Xനവംബര്‍r^ K Xഡിസംബര്‍r_ uU abbreviatedr` }ra (KX ജനുrb KXഫെബ്രുrc KXമാര്‍rd KXഏപ്രിre KX മേയ്rf KXജൂണ്‍rg KX ജൂലൈrh KXആഗri K Xസെപ്റ്റംrj K Xഒക്ടോrk K X നവംrl K X ഡിസംrm uuuUcurrency_formatsrn }ro Nh,)rp }rq (h/Nh1Kh2KKrr h4X¤rs js rt h7KKru h9X #,##,##0.00¤rv h;h5hNh?KKrx ubsUdaysry }rz (U stand-aloner{ }r| (Uwider} }r~ KXതിങ്കളാഴ്ചr sUnarrowr }r (KXതr KXചr KXബr KXവr KXവr KXശr KXഞr uuUformatr }r (Uwider }r (KXതിങ്കള്‍r KXചൊവ്വr KXബുധന്‍r KXവ്യാഴംr KXവെള്ളിr KX ശനിr KXഞായര്‍r uU abbreviatedr }r (KXതിr KXചൊr KXബുr KX വ്യാr KXവെr KXശr KXഞാr uUnarrowr }r KXചൊr suuU meta_zonesr }r (U Turkmenistanr }r (Ucommonr Ulongr }r (Udaylightr Xkതുര്‍ക്ക്മെനിസ്ഥാന്‍ വേനല്‍ക്കാല സമയംr Ustandardr XIതുര്‍ക്ക്മെനിസ്ഥാന്‍ സമയംr uuU Kuybyshevr }r (j j }r (j XMകുയ്ബൈഷെവ് വേനല്‍ക്കാല സമയംr j X+കുയ്ബൈഷെവ് സമയംr uuURotherar }r (j j }r j Xറൊതീറ സമയംr suUArabianr }r (Ushortr }r (Ugenericr X AT (അറേബ്യന്‍)r j X!ADT (അറേബ്യന്‍)r j X!AST (അറേബ്യന്‍)r uj j }r (j X(അറേബ്യന്‍ സമയംr j X8അറേബ്യന്‍ പകല്‍ സമയംr j XYഅറേബ്യന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuUAustralia_Easternr }r (j j }r (j XJഈസ്റ്റേണ്‍ ഓസ്ട്രേലിയ സമയംr j Xcഓസ്ട്രേലിയന്‍ ഈസ്റ്റേണ്‍ പകല്‍ സമയംr j Xഓസ്ട്രേലിയന്‍ ഈസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuU Argentinar }r (j j }r (j XPഅര്‍ജന്‍റീന വേനല്‍ക്കാല സമയംr j X.അര്‍ജന്‍റീന സമയംr uuUBoliviar }r (j j }r j X"ബൊളീവിയ സമയംr suU Alaska_Hawaiir }r (j j }r (j X/അലാസ്ക-ഹവായി സമയംr j X?അലാസ്ക-ഹവായി പകല്‍ സമയംr j X`അലാസ്ക-ഹവായി സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuU Cape_Verder }r (j j }r (j XWകെയ്പ് വെര്‍ഡെ വേനല്‍ക്കാല സമയംr j X5കെയ്പ് വെര്‍ഡെ സമയംr uuUAzoresr }r (j j }r (j XMഎയ്സോര്‍സ് വേനല്‍ക്കാല സമയംr j X+എയ്സോര്‍സ് സമയംr uuUPierre_Miquelonr }r (j j }r (j XQപിയറി ആന്‍ഡ് മിക്വിലോണ്‍ സമയംr j Xaപിയറി ആന്‍ഡ് മിക്വിലോണ്‍ പകല്‍ സമയംr j Xപിയറി ആന്‍ഡ് മിക്വിലോണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ്സമയംr uuUEurope_Centralr }r (j j }r (j Xoസെന്‍ട്രല്‍ യൂറോപ്യന്‍ വേനല്‍ക്കാല സമയംr j XMസെന്‍ട്രല്‍ യൂറോപ്യന്‍ സമയംr uuUTrukr }r (j j }r j X"ട്രക്ക് സമയംr suU Aktyubinskr }r (j j }r (j X_അക്ത്യുബിന്‍സ്ക് വേനല്‍ക്കാല സമയംr j X=അക്ത്യുബിന്‍സ്ക് സമയംr uuUBeringr }r (j }r (j XBT (ബെറിങ് )r j XBDT (ബെറിങ് )r j XBST (ബെറിങ് )r uj j }r (j Xബെറിങ് സമയംr j X/ബെറിങ് പകല്‍ സമയംr j XPബെറിങ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuU Qyzylordar }r (j j }r (j XMഖിസിലോര്‍ഡ വേനല്‍ക്കാല സമയംr j X+ഖിസിലോര്‍ഡ സമയംr uuUKazakhstan_Easternr }r (j j }r (j XMകിഴക്കന്‍ കസാഖ്സ്ഥാന്‍ സമയംr j X~കിഴക്കന്‍ കസാഖ്സ്ഥാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuUFrunzer }r (j j }r (j XJഫ്രൂന്‍സ് വേനല്‍ക്കാല സമയംr j X(ഫ്രൂന്‍സ് സമയംr uuU Dutch_Guianar }r (j j }r j X)ഡച്ച് ഗയാന സമയംr suU Kamchatkar }r (j j }r (j X{പെട്രോപാവ്‌ലോസ്ക് കംചാസ്കി വേനല്‍ക്കാല സമയംr j XYപെട്രോപാവ്‌ലോസ്ക് കംചാസ്കി സമയംr uuUKashgarr }r (j j }r j X%കാഷ്ഗര്‍ സമയംr suUMaldivesr }r (j j }r j X+മാലിദ്വീപ് സമയംr suUNorfolkr }r (j j }r j XGനോര്‍ഫോക് ദ്വീപുകള്‍ സമയംr suU East_Timorr! }r" (j j }r# j X>കിഴക്കന്‍ തിമൂര്‍ സമയംr$ suUAfrica_Easternr% }r& (j j }r' j XDകിഴക്കേ ആഫ്രിക്കന്‍ സമയംr( suU Ashkhabadr) }r* (j j }r+ (j XJഅഷ്ഖാബാദ് വേനല്‍ക്കാല സമയംr, j X(അഷ്ഖാബാദ് സമയംr- uuUAlaskar. }r/ (j j }r0 (j X(അലാസ്ക്കാ സമയംr1 j X/അലാസ്ക പകല്‍ സമയംr2 j XPഅലാസ്ക സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr3 uuUAmerica_Easternr4 }r5 (j j }r6 (j X(കിഴക്കന്‍ സമയംr7 j X8കിഴക്കന്‍ പകല്‍ സമയംr8 j XYകിഴക്കന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr9 uuU Yekaterinburgr: }r; (j j }r< (j Xkയെക്കാറ്ററിന്‍ബര്‍ഗ് വേനല്‍ക്കാല സമയംr= j XIയെക്കാറ്ററിന്‍ബര്‍ഗ് സമയംr> uuUSolomonr? }r@ (j j }rA j XAസോളമന്‍ ദ്വീപുകള്‍ സമയംrB suU KrasnoyarskrC }rD (j j }rE (j X_ക്രാസ്നോയാഴ്സ്ക് വേനല്‍ക്കാല സമയംrF j X=ക്രാസ്നോയാഴ്സ്ക് സമയംrG uuUAmerica_CentralrH }rI (j j }rJ (j X.സെന്‍ട്രല്‍ സമയംrK j X>സെന്‍ട്രല്‍ പകല്‍ സമയംrL j X_സെന്‍ട്രല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrM uuUMawsonrN }rO (j j }rP j X%മാവ്സണ്‍ സമയംrQ suUPakistanrR }rS (j j }rT (j XPപാകിസ്ഥാന്‍ വേനല്‍ക്കാല സമയംrU j X.പാകിസ്ഥാന്‍ സമയംrV uuUSamoarW }rX (j j }rY j XMസമോവാ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrZ suUMacaur[ }r\ (j j }r] (j X8മകൌ വേനല്‍ക്കാല സമയംr^ j Xമകൌ സമയംr_ uuUChamorror` }ra (j j }rb (j Xകമോറോ സമയംrc j XMകമോറോ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrd uuUGuamre }rf (j }rg j XGST (ഗ്വാം)rh sj j }ri j XMഗ്വാം സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrj suUIndiark }rl (j j }rm j XVഇന്‍‌ഡ്യ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrn suU Azerbaijanro }rp (j j }rq (j XVഅസര്‍ബയ്ജാന്‍ വേനല്‍ക്കാല സമയംrr j X4അസര്‍ബയ്ജാന്‍ സമയംrs uuU Marquesasrt }ru (j j }rv j X4മാര്‍ക്യുസാസ് സമയംrw suU Tajikistanrx }ry (j j }rz j X1തജികിസ്ഥാന്‍ സമയംr{ suUPitcairnr| }r} (j j }r~ j X4പിറ്റ്കെയ്ന്‍ സമയംr suUTurkeyr }r (j j }r (j XJതുര്‍ക്കി വേനല്‍ക്കാല സമയംr j X(തുര്‍ക്കി സമയംr uuU Afghanistanr }r (j j }r j X7അഫ്ഗാനിസ്ഥാന്‍ സമയംr suU Choibalsanr }r (j j }r (j XSചോയ്ബല്‍സന്‍ വേനല്‍ക്കാല സമയംr j X1ചോയ്ബല്‍സന്‍ സമയംr uuU Vladivostokr }r (j j }r (j Xbവ്‌ളാഡിവോസ്റ്റോക് വേനല്‍ക്കാല സമയംr j X@വ്‌ളാഡിവോസ്റ്റോക് സമയംr uuU Shevchenkor }r (j j }r (j XMഷെവ്ചെങ്കോ വേനല്‍ക്കാല സമയംr j X+ഷെവ്ചെങ്കോ സമയംr uuU Bangladeshr }r (j j }r j X+ബംഗ്ലാദേശ് സമയംr suUGulfr }r (j j }r (j Xഗള്‍ഫ് സമയംr j XPഗള്‍ഫ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuUDaccar }r (j j }r j Xഡാക്ക സമയംr suUMongoliar }r (j j }r (j X]യുലാന്‍ ബാറ്റര്‍ വേനല്‍ക്കാല സമയംr j X;യുലാന്‍ ബാറ്റര്‍ സമയംr uuU Samarkandr }r (j }r (j X'SAMST (സമര്‍കന്ദ് )r j X&SAMT (സമര്‍കന്ദ് )r uj j }r (j XMസമര്‍കന്ദ് വേനല്‍ക്കാല സമയംr j X+സമര്‍കന്ദ് സമയംr uuUWaker }r (j j }r j X2വെയ്ക് ദ്വീപ് സമയംr suUPerur }r (j j }r (j X;പെറു വേനല്‍ക്കാല സമയംr j Xപെറു സമയംr uuUVanuatur }r (j j }r (j XDവന്വാതു വേനല്‍ക്കാല സമയംr j X"വന്വാതു സമയംr uuUIndonesia_Centralr }r (j j }r j XPസെന്‍ട്രല്‍ ഇന്‍ഡോനേഷ്യ സമയംr suUNaurur }r (j j }r j Xനൌറു സമയംr suUFalklandr }r (j j }r (j Xrഫാക്‌ലാന്‍ഡ് ദ്വീപുകള്‍ വേനല്‍ക്കാല സമയംr j XPഫാക്‌ലാന്‍ഡ് ദ്വീപുകള്‍ സമയംr uuUKorear }r (j j }r (j X%കൊറിയന്‍ സമയംr j X5കൊറിയന്‍ പകല്‍ സമയംr j XVകൊറിയന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuUCubar }r (j }r (j XCST (ക്യൂബ )r j XCDT (ക്യൂബ )r j XCST (ക്യൂബ)r uj j }r (j Xക്യൂബ സമയംr j X,ക്യൂബ പകല്‍ സമയംr j XMക്യൂബ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuUIrkutskr }r (j j }r (j XJഇര്‍കസ്ക് വേനല്‍ക്കാല സമയംr j X(ഇര്‍കസ്ക് സമയംr uuUArgentina_Westernr }r (j j }r j XAപശ്ചിമ അര്‍ജന്‍റീന സമയംr suUAmazonr }r (j j }r (j XDആമസോണ്‍ വേനല്‍ക്കാല സമയംr j X"ആമസോണ്‍ സമയംr uuUChinar }r (j }r (j XCT (ചൈന)r j XCDT (ചൈന)r j XCST (ചൈന)r uj j }r (j Xചൈന സമയംr j X&ചൈന പകല്‍ സമയംr j XJചൈനാ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuULong_Shur }r (j j }r j X ലോങ്-ഷു സമയംr suUArmeniar }r (j }r (j X"AMST (അര്‍മേനിയ)r j X!AMT (അര്‍മേനിയ)r uj j }r (j XJഅര്‍മേനിയ വേനല്‍ക്കാല സമയംr j X(അര്‍മേനിയ സമയംruuUCookr}r(j j }r(j Xvകുക്ക് ദ്വീപുകള്‍ അര്‍ദ്ധ വേനല്‍ക്കാല സമയംrj X>കുക്ക് ദ്വീപുകള്‍ സമയംruuUChathamr}r(j j }r(j X;ചാതം വേനല്‍ക്കാല സമയംr j XJചാതം സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuUGreenland_Westernr }r (j j }r (j Xlപശ്ചിമ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയംrj XJപശ്ചിമ ഗ്രീന്‍ലാന്‍ഡ് സമയംruuUKarachir}r(j j }rj X"കറാച്ചി സമയംrsuUTongar}r(j j }r(j XDറ്റോംഗാ വേനല്‍ക്കാല സമയംrj X"റ്റോംഗാ സമയംruuUSakhalinr}r(j j }r(j XGസഖാലിന്‍ വേനല്‍ക്കാല സമയംrj X%സഖാലിന്‍ സമയംruuUBrasiliar}r(j j }r (j XHബ്രസീലിയ വേനല്‍ക്കാല സമയംr!j X%ബ്രസീലിയ സമയംr"uuUSyowar#}r$(j j }r%j Xസ്യോവ സമയംr&suU French_Guianar'}r((j j }r)j X2ഫ്രെഞ്ച് ഗയാന സമയംr*suUFrench_Southernr+}r,(j j }r-j Xyഫ്രെഞ്ച് സതേണ്‍ ആന്‍ഡ് അന്‍റാര്‍ട്ടിക് സമയംr.suU Mauritiusr/}r0(j j }r1j X(മൌറിഷ്യസ് സമയംr2suUAfrica_Southernr3}r4(j j }r5(j X@ദക്ഷിണാഫ്രിക്കന്‍ സമയംr6j Xqദക്ഷിണാഫ്രിക്കന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr7uuUGambierr8}r9(j j }r:j X+ഗാന്പിയര്‍ സമയംr;suUDavisr<}r=(j j }r>j X(ഡെയ്‌വിസ് സമയംr?suU Newfoundlandr@}rA(j j }rB(j XCന്യൂഫൌണ്ട്‌ലാന്‍ഡ് സമയംrCj XVന്യൂഫൌണ്ട്‌ലാന്‍ഡ് പകല്‍‌ സമയംrDj Xtന്യൂഫൌണ്ട്‌ലാന്‍ഡ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrEuuUCocosrF}rG(j j }rHj XDകൊക്കോസ് ദ്വീപുകള്‍ സമയംrIsuU KyrgystanrJ}rK(j j }rLj X7കിര്‍ഗിസ്ഥാന്‍ സമയംrMsuUTokelaurN}rO(j j }rPj X+റ്റോക്കിലൌ സമയംrQsuUAustralia_WesternrR}rS(j j }rT(j XMവെസ്റ്റേണ്‍ ഓസ്ട്രേലിയ സമയംrUj Xiഓസ്ട്രേലിയന്‍ ‍വെസ്റ്റേണ്‍ പകല്‍ സമയംrVj X~ഓസ്ട്രേലിയന്‍ ‍വെസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ്rWuuUBakurX}rY(j j }rZ(j X;ബാകു വേനല്‍ക്കാല സമയംr[j Xബാകു സമയംr\uuUAfrica_Centralr]}r^(j j }r_j XAമദ്ധ്യ ആഫ്രിക്കന്‍ സമയംr`suU Line_Islandsra}rb(j j }rcj X;ലൈന്‍ ദ്വീപുകള്‍ സമയംrdsuU Novosibirskre}rf(j j }rg(j X\നോവോസിബിര്‍സ്ക് വേനല്‍ക്കാല സമയംrhj X:നോവോസിബിര്‍സ്ക് സമയംriuuUJapanrj}rk(j j }rl(j X%ജപ്പാന്‍ സമയംrmj X5ജപ്പാന്‍ പകല്‍ സമയംrnj XVജപ്പാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrouuU Sverdlovskrp}rq(j j }rr(j X_സ്‌വേഡ്‌ലോവ്സ്ക് വേനല്‍ക്കാല സമയംrsj X=സ്‌വേഡ്‌ലോവ്സ്ക് സമയംrtuuU New_Caledoniaru}rv(j j }rw(j XWന്യൂ കാലിഡോണിയ വേനല്‍ക്കാല സമയംrxj X5ന്യൂ കാലിഡോണിയ സമയംryuuU Kwajaleinrz}r{(j j }r|j X1ക്വാജലെയ്ന്‍ സമയംr}suUAqtober~}r(j }r(j XAQTST (അഖ്തോബ്)rj XAQTT (അഖ്തോബ്)ruj j }r(j XDഅഖ്തോബ് വേനല്‍ക്കാല സമയംrj X"അഖ്തോബ് സമയംruuUGilbert_Islandsr}r(j j }rj XSഗില്‍ബര്‍ട്ട് ദ്വീപുകള്‍ സമയംrsuUAustralia_CentralWesternr}r(j j }r(j Xxഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ സമയംrj Xഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ പകല്‍ സമയംrj Xഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ വെസ്റ്റേണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuU Indochinar}r(j j }rj X(ഇന്‍ഡോചൈന സമയംrsuUPapua_New_Guinear}r(j j }rj X<പാപ്യു ന്യൂ ഗിനിയ സമയംrsuUHovdr}r(j j }r(j X;ഹൌഡ് വേനല്‍ക്കാല സമയംrj Xഹൌഡ് സമയംruuU South_Georgiar}r(j }rj X7GST (ദക്ഷിണ ജോര്‍ജ്ജിയ)rsj j }rj X>ദക്ഷിണ ജോര്‍ജ്ജിയ സമയംrsuUEcuadorr}r(j j }rj X(ഇക്വഡോര്‍ സമയംrsuUMalayar}r(j j }rj Xമലയ സമയംrsuUBruneir}r(j j }rj X>ബ്രൂണെ ഡാറുസ്സലാം സമയംrsuUIranr}r(j j }r(j X/ഇറാന്‍ പകല്‍ സമയംrj XPഇറാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuUAqtaur}r(j }r(j XAQTST (അഖ്തൌ)rj XAQTT (അഖ്തൌ)ruj j }r(j X>അഖ്തൌ വേനല്‍ക്കാല സമയംrj Xഅഖ്തൌ സമയംruuU Indian_Oceanr}r(j j }rj XGഇന്‍ഡ്യന്‍ മഹാസമുദ്ര സമയംrsuUTuvalur}r(j j }rj Xതുവാലു സമയംrsuUAmerica_Mountainr}r(j j }r(j X%മൌണ്ടന്‍ സമയംrj X5മൌണ്ടന്‍ പകല്‍ സമയംrj XVമൌണ്ടന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuUHawaii_Aleutianr}r(j j }rj Xiഹവായി-അലൂഷ്യന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrsuUChangbair}r(j j }rj X"ചാങ്ബയ് സമയംrsuUChiler}r(j j }r(j X;ചിലി വേനല്‍ക്കാല സമയംrj Xചിലി സമയംruuUWallisr}r(j j }rj XHവാലിസ് ആന്‍ഡ് ഫ്യൂചുന സമയംrsuUKosraer}r(j j }rj Xകൊസ്റേ സമയംrsuUDushanber}r(j j }r(j XJദുഷാന്‍ബെ വേനല്‍ക്കാല സമയംrj X(ദുഷാന്‍ബെ സമയംruuUGeorgiar}r(j j }r(j XMജോര്‍ജ്ജിയ വേനല്‍ക്കാല സമയംrj X+ജോര്‍ജ്ജിയ സമയംruuUAnadyrr}r(j j }r(j XGഅനാഡിര്‍ വേനല്‍ക്കാല സമയംrj X%അനാഡിര്‍ സമയംruuU Philippinesr}r(j j }r(j XPഫിലിപ്പീന്‍ വേനല്‍ക്കാല സമയംrj X.ഫിലിപ്പീന്‍ സമയംruuUYakutskr}r(j j }r(j XDയാകസ്ക് വേനല്‍ക്കാല സമയംrj X"യാകസ്ക് സമയംruuUIndonesia_Westernr}r(j j }rj XAപശ്ചിമ ഇന്‍ഡോനേഷ്യ സമയംrsuUGreenland_Easternr}r(j j }r(j Xuകിഴക്കന്‍ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയംrj XSകിഴക്കന്‍ ഗ്രീന്‍ലാന്‍ഡ് സമയംruuUYerevanr}r(j j }r(j XJയെരെവാന്‍ വേനല്‍ക്കാല സമയംrj X(യെരെവാന്‍ സമയംruuUMarshall_Islandsr}r(j j }rj XGമാര്‍ഷല്‍ ദ്വീപുകള്‍ സമയംr suU Seychellesr }r (j j }r j X.സെയ്ഷെല്‍സ് സമയംr suUUruguayr}r(j j }r(j XDഉറുഗ്വെ വേനല്‍ക്കാല സമയംrj X"ഉറുഗ്വെ സമയംruuUVostokr}r(j j }rj X+വോസ്റ്റോക് സമയംrsuU Uzbekistanr}r(j j }r(j X_ഉസ്ബക്കിസ്ഥാന്‍ വേനല്‍‌ക്കാല സമയംrj X:ഉസ്ബക്കിസ്ഥാന്‍ സമയംruuUColombiar}r(j j }r(j XDകൊളംബിയ വേനല്‍ക്കാല സമയംrj X"കൊളംബിയ സമയംr uuUReunionr!}r"(j j }r#j X+റീയൂണിയന്‍ സമയംr$suU Volgogradr%}r&(j j }r'(j XVവോള്‍ഗോഗ്രാഡ് വേനല്‍ക്കാല സമയംr(j X4വോള്‍ഗോഗ്രാഡ് സമയംr)uuU Kizilordar*}r+(j j }r,(j XMകിസിലോര്‍ഡ വേനല്‍ക്കാല സമയംr-j X+കിസിലോര്‍ഡ സമയംr.uuUFijir/}r0(j j }r1(j X;ഫിജി വേനല്‍ക്കാല സമയംr2j Xഫിജി സമയംr3uuUAmerica_Pacificr4}r5(j j }r6(j Xപസഫിക് സമയംr7j X/പസഫിക് പകല്‍ സമയംr8j XPപസഫിക് സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr9uuUKazakhstan_Westernr:}r;(j j }r<(j XSപടിഞ്ഞാറന്‍ കസാഖ്സ്ഥാന്‍ സമയംr=j Xപടിഞ്ഞാറന്‍ കസാഖ്സ്ഥാന്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr>uuUPalaur?}r@(j j }rAj Xപലൌ സമയംrBsuUEurope_EasternrC}rD(j j }rE(j Xiകിഴക്കന്‍ യൂറോപ്യന്‍ വേനല്‍ക്കാല സമയംrFj XGകിഴക്കന്‍ യൂറോപ്യന്‍ സമയംrGuuUBhutanrH}rI(j j }rJj X(ഭൂട്ടാന്‍ സമയംrKsuUBorneorL}rM(j j }rN(j XJബോര്‍ണിയോ വേനല്‍ക്കാല സമയംrOj X(ബോര്‍ണിയോ സമയംrPuuUNepalrQ}rR(j j }rSj X(നേപ്പാള്‍ സമയംrTsuU GalapagosrU}rV(j j }rWj X.ഗാലപ്പാഗോസ് സമയംrXsuU Lord_HowerY}rZ(j j }r[(j X/ലോര്‍ഡ് ഹോവ് സമയംr\j X?ലോര്‍ഡ് ഹോവ് പകല്‍ സമയംr]j X`ലോര്‍ഡ് ഹോവ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr^uuUPhoenix_Islandsr_}r`(j j }raj XDഫീനിക്സ് ദ്വീപുകള്‍ സമയംrbsuUSurinamerc}rd(j j }rej X"സൂറിനാം സമയംrfsuUAcrerg}rh(j }ri(j X"ACST (എയ്ക്കര്‍)rjj X!ACT (എയ്ക്കര്‍)rkuj j }rl(j XJഎയ്ക്കര്‍ വേനല്‍ക്കാല സമയംrmj X(എയ്ക്കര്‍ സമയംrnuuUEasterro}rp(j j }rq(j X]ഈസ്റ്റര്‍ ദ്വീപ് വേനല്‍ക്കാല സമയംrrj X;ഈസ്റ്റര്‍ ദ്വീപ് സമയംrsuuU Christmasrt}ru(j j }rvj X;ക്രിസ്മസ് ദ്വീപ് സമയംrwsuUIsraelrx}ry(j }rzj X$IST (ഇസ്രായേല്‍)r{sj j }r|(j X+ഇസ്രായേല്‍ സമയംr}j X;ഇസ്രായേല്‍ പകല്‍ സമയംr~j X]ഇസ്രായേല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuUAfrica_Westernr}r(j j }r(j Xbപശ്ചിമാഫ്രിക്കന്‍ വേനല്‍ക്കാല സമയംrj X@പശ്ചിമാഫ്രിക്കന്‍ സമയംruuUTashkentr}r(j j }r(j XJതാഷ്കന്ദ് വേനല്‍ക്കാല സമയംrj X(താഷ്കന്ദ് സമയംruuUMalaysiar}r(j j }rj Xമലേഷ്യ സമയംrsuUNoronhar}r(j j }r(j Xgഫെര്‍ണാണ്ടോ ഡി നൊറോന വേനല്‍ക്കാല സമയംrj XEഫെര്‍ണാണ്ടോ ഡി നൊറോന സമയംruuU Venezuelar}r(j j }rj X%വെനസ്വേല സമയംrsuUPonaper}r(j j }rj Xപൊനാപ് സമയംrsuUIndonesia_Easternr}r(j j }rj XJകിഴക്കന്‍ ഇന്‍ഡോനേഷ്യ സമയംrsuUOmskr}r(j j }r(j XBഓംസ്ക് വേനല്‍ക്കാല സമയംrj Xഓംസ്ക് സമയംruuUAustralia_Centralr}r(j j }r(j XMസെന്‍ട്രല്‍ ഓസ്ട്രേലിയ സമയംrj Xfഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ പകല്‍ സമയംrj Xഓസ്ട്രേലിയന്‍ സെന്‍ട്രല്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuUAtlanticr}r(j j }r(j X7അറ്റ്ലാന്‍റിക് സമയംrj XGഅറ്റ്ലാന്‍റിക് പകല്‍ സമയംrj Xhഅറ്റ്ലാന്‍റിക് സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuU North_Marianar}r(j j }rj X]നോര്‍ത്ത് മറിയാനാ ദ്വീപുകള്‍ സമയംrsuULankar}r(j j }rj Xലങ്ക സമയംrsuUDumontDUrviller}r(j j }rj XNഡ്യൂമണ്ട് ഡി യൂര്‍വില്‍ സമയംrsuU New_Zealandr}r(j j }r(j X1ന്യൂസീലന്‍ഡ് സമയംrj XAന്യൂസീലന്‍ഡ് പകല്‍ സമയംrj Xbന്യൂസീലന്‍ഡ് സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuUUrumqir}r(j j }rj XDഉറുംഖി വേനല്‍‌ക്കാല സമയംrsuU Hong_Kongr}r(j j }r(j XHഹോങ് കോങ് വേനല്‍ക്കാല സമയംrj X&ഹോങ് കോങ് സമയംruuUGuyanar}r(j j }rj Xഗയാന സമയംrsuUMagadanr}r(j j }r(j XDമഗാഡന്‍ വേനല്‍ക്കാല സമയംrj X"മഗാഡന്‍ സമയംruuUAlmatyr}r(j j }r(j XDഅല്‍മതി വേനല്‍ക്കാല സമയംrj X"അല്‍മതി സമയംruuUTbilisir}r(j j }r(j XGതിബിലീസി വേനല്‍ക്കാല സമയംrj X%തിബിലീസി സമയംruuUMyanmarr}r(j j }rj X1മ്യാന്‍മാര്‍ സമയംrsuU Singaporer}r(j j }rj Xbസിങ്കപ്പൂര്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംrsuUSamarar}r(j j }r(j X;സമാറ വേനല്‍ക്കാല സമയംrj Xസമാറ സമയംruuUGreenland_Centralr}r(j j }r(j X{സെന്‍ട്രല്‍ ഗ്രീന്‍ലാന്‍ഡ് വേനല്‍ക്കാല സമയംrj XYസെന്‍ട്രല്‍ ഗ്രീന്‍ലാന്‍ഡ് സമയംruuUUralskr}r(j j }r(j XPയുറാല്‍സ്ക് വേനല്‍ക്കാല സമയംrj X.യുറാല്‍സ്ക് സമയംruuUTahitir}r(j j }rj Xതഹിതി സമയംrsuUParaguayr}r(j j }r(j XDപരാഗ്വേ വേനല്‍ക്കാല സമയംrj X"പരാഗ്വേ സമയംruuUYukonr}r(j j }r(j X(യൂക്കോണ്‍ സമയംrj X5യൂക്കണ്‍ പകല്‍ സമയംrj XYയൂക്കോണ്‍ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംruuUMoscowr}r(j j }r(j Xമോസ്കോ സമയംrj XAമോസ്കോ വേനല്‍ക്കാല സമയംrj XPമോസ്കോ സ്റ്റാന്‍ഡേര്‍ഡ് സമയംr uuUNiuer }r (j j }r j Xനിയു സമയംr suuUerasr}r(Uwider}r(KX=ക്രിസ്തുവിനു് മുമ്പ്‌rKX:ക്രിസ്തുവിനു് പിമ്പ്ruU abbreviatedr}r(KXക്രി.മു.rKXക്രി.പി.ruUnarrowr}r(KXക്രി.മു.rKXക്രി.പി.ruuu.PK[99(site-packages/babel/localedata/ja_JP.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll%site-packages/babel/localedata/tl.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99(site-packages/babel/localedata/zh_TW.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[0wN.5.5%site-packages/babel/localedata/kn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXಒಂದು 1q KXಎರಡು 2q KXಮೂರು 3qKXನಾಲೃಕ 4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXಪೂರ್ವಾಹ್ನqUpmqXಅಪರಾಹ್ನquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X hh:mm:ss aqAUformatqBX%(hh)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X hh:mm:ss a vqGhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X hh:mm:ss a zqLhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xhh:mm aqQhBX%(hh)s:%(mm)s %(a)sqRubuU languagesqS}qT(UguqUXಗುಜರಾತಿqVUgdqWX1ಸ್ಕಾಟಿಶ್ ಗ್ಯಾಲಿಕ್qXUgaqYXಐರಿಷ್qZUgnq[Xಗ್ವಾರಾನಿq\Uglq]X!ಗ್ಯಾಲೀಷಿಯನ್q^Ulaq_Xಲ್ಯಾಟಿನ್q`UlnqaXಲಿಂಗಾಲqbUloqcX ಲಾವೋqdUtrqeXಟರ್ಕಿಷ್qfUlvqgXಲಾಟ್ವಿಯನ್qhUltqiX!ಲಿತುವೇನಿಯನ್qjUtkqkXತುರ್ಕ್ಮನ್qlUthqmX ಥಾಯ್qnUtiqoXತಿಗ್ರಿನ್ಯqpUteqqXತೆಲುಗುqrUpt_PTqsX<ಪೋರ್ಚುಗೀಸ್ (ಪೋರ್ಚುಗಲ್)qtUfilquXಟ್ಯಾಗಲಾಗ್qvUtaqwXತಮಿಳುqxUyiqyXಯಿದ್ದಿಶ್qzUpt_BRq{X8ಪೋರ್ಚುಗೀಸ್(ಬ್ರೆಜಿಲ್)q|Udeq}Xಜರ್ಮನ್q~UdaqXಡ್ಯಾನಿಷ್qUelqXಗ್ರೀಕ್qUeoqXಎಸ್ಪರಾಂಟೋqUenqXಇಂಗ್ಲೀಷ್qUzhqXಚೈನೀಸ್qUzh_HansqX4ಸಿಂಪ್ಲಿಫೈಡ್ ಚೈನೀಸ್qUzh_HantqX1ಟ್ರೆಡೀಶನಲ್ ಚೈನೀಸ್qUeuqXಬಾಸ್ಕ್qUetqXಎಸ್ಟೋನಿಯನ್qUesqXಸ್ಪ್ಯಾನಿಷ್qUruqXರಷಿಯನ್qUroqXರೊಮೇನಿಯನ್qUbnqXಬಂಗಾಳಿqUbeqXಬೆಲರೂಸಿಯನ್qUbgqXಬಲ್ಗೇರಿಯನ್qUukqXಉಕ್ರೇನಿಯನ್qUastqXಆಸ್ಟುರಿಯನ್qUjvqXಜಾವನೀಸ್qUbhqXಬಿಹಾರಿqUbrqXಬ್ರೆಟನ್qUbsqXಬೋಸ್ನಿಯನ್qUjaqXಜಪಾನೀಸ್qUocqXಆಕ್ಸಿಟಾನ್qUundqXBಗೊತ್ತಿರದ ಅಥವ ಅಮಾನ್ಯ ಭಾಷೆqUtwqX ಟ್ವಿqUtlhqXಕ್ಲಿಂಗನ್qUorqXಒರಿಯಾqUxhqXಕ್ಷೋಸqUcaqXಕ್ಯಾಟಲನ್qUcyqXವೆಲ್ಶ್qUcsqX ಚೆಕ್qUpsqXಪಶ್ತೊqUptqXಪೋರ್ಚುಗೀಸ್qUpaqXಪಂಜಾಬಿqUviqXವಿಯೆಟ್ನಾಮಿqUplqXಪೋಲಿಷ್qUhyqXಆರ್ಮೇನಿಯನ್qUhrqX!ಕ್ರೊಯೇಶಿಯನ್qUhuqXಹಂಗೇರಿಯನ್qUhiqXಹಿಂದಿqUheqXಹಿಬ್ರೂqUuzqXಉಜ್ಬೆಕ್qUmlqXಮಲೆಯಾಳಂqUmnqXಮಂಗೋಲಿಯನ್qUmkqX'ಮ್ಯಾಸೆಡೋನಿಯನ್qUurqXಉರ್ದುqUmtqXಮಾಲ್ಟೀಸ್qUmsqX ಮಲಯqUmrqXಮರಾಠಿqUafqX$ಅಫ್ರಿಕಾನ್ಸ್‍qUswqXಸ್ವಾಹಿಲಿqUisqX$ಐಸ್ಲ್ಯಾಂಡಿಕ್qUamqXಅಮ್ಹಾರಿಕ್qUitqXಇಟಾಲಿಯನ್qUsvqXಸ್ವೀಡಿಷ್qUasqXಅಸ್ಸಾಮೀಸ್qUarqXಅರೇಬಿಕ್qUsuqXಸುಂದನೀಸ್qUzuqX ಜುಲುqUiaqX$ಇಂಟರ್ಲಿಂಗುವಾqUazqXಅಜರ್ಬೈಜಾನಿqUidqX!ಇಂಡೋನೇಷ್ಯನ್qUnlqX ಡಚ್qUnnqXEನಾರ್ವೇಜಿಯನ್ (ನೂನಾರ್ಸ್ಕ್‍)qUnoqX!ನಾರ್ವೇಜಿಯನ್rUnerXನೇಪಾಳಿrUfrrXಫ್ರೆಂಚ್rUfyrXಫ್ರಿಸಿಯನ್rUfarXಪರ್ಷಿಯನ್rUfir Xಫಿನ್ನಿಷ್r Ukyr Xಕಿರ್ಗಿಜ್r Ufor Xಫೆರೋಯಿಸ್rUkarXಜಾರ್ಜಿಯನ್rUsrrXಸರ್ಬಿಯನ್rUsqrXಆಲ್ಬೇನಿಯನ್rUkorXಕೊರಿಯನ್rUknrXಕನ್ನಡrUkmrXಕಾಂಬೋಡಿಯನ್rUstrXಸೆಸೊತೊrUskrXಸ್ಲೊವಾಕ್rUsirXಸಿಂಹಳr Ushr!X1ಸರ್ಬೋ-ಕ್ರೊಯೇಶಿಯನ್r"Usor#Xಸೊಮಾಲಿr$Ukur%Xಕುರ್ದಿಶ್r&Uslr'X!ಸ್ಲೊವೇನಿಯನ್r(Usar)Xಸಂಸ್ಕೃತr*Usdr+Xಸಿಂಧಿr,uU territoriesr-}r.(U151r/X"ಪೂರ್ವ ಯೂರೋಪ್r0U150r1Xಯೂರೋಪ್r2UFRr3Xಫ್ರಾನ್ಸ್‍r4UBGr5Xಬಲ್ಗೇರಿಯನ್r6UDKr7Xಡೆನ್ಮಾರ್ಕ್r8UBEr9Xಬೆಲ್ಜಿಯಮ್r:UDEr;Xಜರ್ಮನಿr<UBVr=X+ಬೋವೆಟ್ ಐಲ್ಯಾಂಡ್r>U013r?X"ಮಧ್ಯ ಅಮೇರಿಕಾr@U014rAX%ಪೂರ್ವ ಆಫ್ರಿಕಾrBUBRrCXಬ್ರಝಿಲ್rDUFIrEX'ಫಿನ್‍‍ಲ್ಯಾಂಡ್rFU019rGXಅಮೆರಿಕಾಸ್rHU030rIXಪೂರ್ವ ಎಶಿಯಾrJUGRrKXಗ್ರೀಸ್rLUCNrMX ಚೀನrNUTRrOXತುರ್ಕಿrPUTOrQX ಟೊಂಗrRUNPrSXನೆಪಾಳrTU053rUXVಆಸ್ಟ್ರೇಲಿಯಾ ಹಾಗು ನ್ಯೂಝಿಲ್ಯಾಂಡ್rVU142rWXಏಶಿಯಾrXU143rYXಮಧ್ಯ ಏಶಿಯಾrZUEEr[Xಎಸ್ತೊನಿಯr\UAQr]Xಅಂಟಾರ್ಟಿಕಾr^UCZr_X(ಚೆಕ್ ರಿಪಬ್ಲಿಕ್r`UCYraXಸೈಪ್ರಸ್rbUTFrcXDಫ್ರೆಂಚ್ ದಕ್ಷಿಣ ಪ್ರದೇಶಗಳುrdUAUreXಆಸ್ಟ್ರೆಲಿಯrfUATrgXಆಸ್ಟ್ರಿಯಾrhUIOriXWಬ್ರಿಟೀಶ್ ಇಂಡಿಯನ್ ಓಶಿಯನ್ ಟೆರಿಟರಿrjUINrkX ಭಾರತrlU029rmXಕೆರೇಬಿಯನ್rnUQUroX1ಯುರೋಪಿಯನ್ ಯೂನಿಯನ್rpU002rqXಆಫ್ರಿಕಾrrUMVrsX.ಮಾಲ್ಡಿವ ದ್ವೀಪಗಳುrtUSGruXಸಿಂಗಪುರrvuUdecimal_formatsrw}rxNh )ry}rz(h#Nh$Kh%KKr{h'h/h/r|h*KKr}h,X #,##,##0.###r~h.h/h0rh2Nh3KKrubsU date_formatsr}r(Umediumrh>)r}r(h,X dd-MM-yyyyrhBX%(dd)s-%(MM)s-%(yyyy)srubUfullrh>)r}r(h,XEEEE d MMMM yyyyrhBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrh>)r}r(h,X d MMMM yyyyrhBX%(d)s %(MMMM)s %(yyyy)srubUshortrh>)r}r(h,Xd-M-yyrhBX%(d)s-%(M)s-%(yy)srubuUcurrency_symbolsr}rU time_zonesr}rUscriptsr}r(UJavarXಜಾವನೀಸ್rUZxxxrXಬರೆಯದೆ ಇರುವrUCirtrXಸಿರ್ಥ್rUGururXಗುರುಮುಖಿrUHebrrXಹೀಬ್ರೂrUGeorrXಜಾರ್ಜಿಯನ್rUZzzzrXEಅಜ್ಞಾತ ಅಥವ ಅಮಾನ್ಯವಾದ ಲಿಪಿrUCyrlrXಸಿರಿಲಿಕ್rUHrktrX2ಕಟಕಾನಾ ಅಥವ ಹಿರಗಾನಾrUArmnrXಅರ್ಮೇನಿಯನ್rUGeokrX4ಜಾರ್ಜಿಯನ್ ಖುಸ್ತುರಿrULatfrX4ಫ್ರಾಕ್ತರ್ ಲ್ಯಾಟಿನ್rUKhmrrXಖಮೇರ್rUArmirXಅರ್ಮಿrUKharrXಖರೋಶ್ತಿrUEgyhrX=ಈಜಿಪ್ಟಿಯನ್ ಹಿಯಾರ್ಟಿಕ್rUDsrtrXಡಸರ್ಟ್rUPhlvrX"ಬುಕ್ ಪಾಹ್ಲವಿrUZyyyrXಸಾಮಾನ್ಯrUGothrXಗೋತಿಕ್rULatnrXಲ್ಯಾಟಿನ್rUHanorXಹನೂನೂrUIndsrXಇಂಡಸ್rUBalirXಬಾಲಿನೀಸ್rUGujrrXಗುಜರಾತಿrUKorerXಕೊರಿಯನ್rUHangrXಹ್ಯಾಂಗಲ್rUBuhdrXಬುಹಿದ್rUArabrXಅರೇಬಿಕ್rULycirXಲೈಸಿಯನ್rUNkoorXಎನ್‍ಕೋrUCarirXಕರೇನ್rUAvstrXಅವೆಸ್ತಾನ್rULinbrXಲೀನಯರ್ ಬಿrUCoptrXಕಾಪ್ಟಿಕ್rUHansrX"ಸರಳೀಕೃತ ಹಾನ್rUCprtrXಸಿಪ್ರಿಯಾಟ್rUGlagrX$ಗ್ಲಾಗೋಲಿಟಿಕ್rULepcrXಲೆಪ್ಚಾrUHantrX.ಸಾಂಪ್ರದಾಯಿಕ ಹಾನ್rUMongrXಮಂಗೋಲಿಯನ್rUDevarXದೇವನಾಗರಿrULaoorX ಲಾವೋrUHirarXಹಿರಗಾನಾrUMoonrX ಮೂನ್rUBoporXಬೋಪೊಮೋಫೋrUMerorXಮೆರೊಯಿಟಿಕ್rUHanirX ಹಾನ್rUCakmrX ಕಾಕಂrUMymrrXಮ್ಯಾನ್ಮಾರ್rUMandrXಮಂಡೇಯನ್rUBugirXಬಗಿನೀಸ್rUManirXಮನಿಚಯೇಯನ್rUBrairXಬ್ರೈಲ್rUBrahr Xಬ್ರಾಹ್ಮಿr USyrer X=ಎಸ್ಟ್ರಾಂಜಿಲೋ ಸಿರಿಯಾಕ್r UGrekr Xಗ್ರೀಕ್rUMlymrXಮಲೆಯಾಳಂrUEgydrX7ಈಜಿಪ್ಟಿಯನ್ ಡೆಮೋಟಿಕ್rUCherrXಚೆರೋಕೀrUEthirXಇಥಿಯೋಪಿಯಾrUQaairX$ಇನ್‍ಹೆರಿಟೆಡ್rUKalirXಕೆಯಾ ಲಿrUJpanrXಜಾಪನೀಸ್rUBatkrXಬಾಟಕ್rULatgrX+ಗೇಲಿಕ್ ಲ್ಯಾಟಿನ್r UChamr!X ಚಾಮ್r"UKthir#X ಕೈಥಿr$UBlisr%X'ಬ್ಲಿಸಿಂಬಲ್ಸ್‍r&ULanar'X ಲಾನಾr(ULydir)Xಲಿಡಿಯನ್r*ULinar+Xಲೀನಯರ್ ಎr,UBengr-Xಬೆಂಗಾಲಿr.UEgypr/XFಈಜಿಪ್ಟಿಯನ್ ಹೀರೋಗ್ಲಿಫ್ಸ್‍r0ULimbr1Xಲಿಂಬುr2UMteir3Xಮೈತಿ ಮಯೆಕ್r4UMayar5X7ಮಯಾನ್ ಹೈರೋಗ್ಲಿಫ್ಸ್‍r6USyrnr7X(ಪೂರ್ವ ಸಿರಿಯಾಕ್r8UKanar9Xಕಟಕಾನಾr:UKndar;Xಕನ್ನಡr<uUvariantsr=}r>Unumber_symbolsr?}r@Ucurrency_namesrA}rBUmonthsrC}rD(U stand-alonerE}rFUnarrowrG}rH(KX1rIKX2rJKX3rKKX4rLKX5rMKX6rNKX7rOKX8rPK X9rQK X10rRK X11rSK X12rTusUformatrU}rV(UwiderW}rX(KXಜನವರೀrYKXಫೆಬ್ರವರೀrZKXಮಾರ್ಚ್r[KXಎಪ್ರಿಲ್r\KXಮೆr]KX ಜೂನ್r^KX ಜುಲೈr_KXಆಗಸ್ಟ್r`K Xಸಪ್ಟೆಂಬರ್raK Xಅಕ್ಟೋಬರ್rbK Xನವೆಂಬರ್rcK Xಡಿಸೆಂಬರ್rduU abbreviatedre}rf(KXಜನವರೀrgKXಫೆಬ್ರವರೀrhKXಮಾರ್ಚ್riKXಎಪ್ರಿಲ್rjKXಮೆrkKX ಜೂನ್rlKX ಜುಲೈrmKXಆಗಸ್ಟ್rnK Xಸಪ್ಟೆಂಬರ್roK Xಅಕ್ಟೋಬರ್rpK Xನವೆಂಬರ್rqK Xಡಿಸೆಂಬರ್rruuuUcurrency_formatsrs}rtNh )ru}rv(h#Nh$Kh%KKrwh'h/h/rxh*KKryh,X¤ #,##,##0.00rzh.X¤ r{X-¤ r|r}h2Nh3KKr~ubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjJKjKKjLKjMKjNKjOKjIusUformatr}r(Uwider}r(KXಸೋಮವಾರrKXಮಂಗಳವಾರrKXಬುಧವಾರrKXಗುರುವಾರrKXಶುಕ್ರವಾರrKXಶನಿವಾರrKXರವಿವಾರruU abbreviatedr}r(KXಸೋ.rKXಮಂ.rKXಬು.rKXಗು.rKXಶು.rKX ಶನಿ.rKXರ.ruuuU meta_zonesr}rUerasr}r(Uwider}r(KXಈಸಪೂವ೯.rKX ಸನ್.ruU abbreviatedr}r(KXBCErKXCEruuu.PK[7zu((site-packages/babel/localedata/fr_CA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q(UpatternqXHH 'h' mm 'min' ss 's' vqUformatqX"%(HH)s h %(mm)s min %(ss)s s %(v)squbsU languagesq}qU territoriesq}q Udecimal_formatsq!}q"U date_formatsq#}q$(Umediumq%h)q&}q'(hX yyyy-MM-ddq(hX%(yyyy)s-%(MM)s-%(dd)sq)ubUshortq*h)q+}q,(hXyy-MM-ddq-hX%(yy)s-%(MM)s-%(dd)sq.ubuUcurrency_symbolsq/}q0(UUSDq1X$ USq2UCADq3X$q4uU time_zonesq5}q6Uscriptsq7}q8Uvariantsq9}q:Unumber_symbolsq;}qUmonthsq?}q@Ucurrency_formatsqA}qBNcbabel.numbers NumberPattern qC)qD}qE(Uexp_precqFNUscaleqGKU frac_precqHKKqIUsuffixqJX ¤qKX ¤)qLqMUint_precqNKKqOhX #,##0.00 ¤qPUprefixqQXqRX(qSqTUexp_plusqUNUgroupingqVKKqWubsUdaysqX}qYU meta_zonesqZ}q[(UAmerica_Pacificq\}q]Ucommonq^sUEurope_Easternq_}q`h^sUAmerica_Mountainqa}qbh^sUAlaskaqc}qdh^sUAmerica_Easternqe}qfh^sU Newfoundlandqg}qhh^sUAtlanticqi}qjh^sUAmerica_Centralqk}qlh^sUEurope_Centralqm}qnh^suUerasqo}qpu.PK[2G*site-packages/babel/localedata/ha_Arab.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}q(Uamq XA.M.q Upmq XP.M.q uUscientific_formatsq }qUpercent_formatsq}qU week_dataq}q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q Ucurrency_symbolsq!}q"U time_zonesq#}q$Uscriptsq%}q&Uvariantsq'}q(Unumber_symbolsq)}q*Ucurrency_namesq+}q,UNGNq-X نَيْرَq.sUmonthsq/}q0Uformatq1}q2(Uwideq3}q4(KXجَنَيْرُq5KXڢَبْرَيْرُq6KX مَرِسْq7KXأَڢْرِلُq8KXمَيُq9KX يُونِq:KX يُولِq;KXأَغُسْتَqK Xنُوَمْبَq?K Xدِسَمْبَq@uU abbreviatedqA}qB(KXجَنqCKXڢَبqDKXمَرqEKX أَڢْرqFKXمَيqGKXيُونqHKXيُولqIKXأَغُqJK XسَتqKK X أُكْتqLK XنُوqMK XدِسqNuusUcurrency_formatsqO}qPUdaysqQ}qRUformatqS}qT(UwideqU}qV(KXلِتِنِنْqWKX تَلَتَqXKX لَرَبَqYKXأَلْحَمِسْqZKX جُمَعَq[KXأَسَبَرْq\KX لَحَدِq]uU abbreviatedq^}q_(KXلِتq`KXتَلqaKXلَرqbKX أَلْحqcKXجُمqdKXأَسَqeKXلَحqfuusU meta_zonesqg}qhUerasqi}qj(Uwideqk}ql(KXغَبَنِنْ مِلَدِqmKX مِلَدِqnuU abbreviatedqo}qp(KXغَبَنِنْ مِلَدِqqKX مِلَدِqruuu.PK[99-site-packages/babel/localedata/mn_Mong_CN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll)site-packages/babel/localedata/wal_ET.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Q;$$%site-packages/babel/localedata/ln.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXsánzá mísáto ya yamboq KXsánzá mísáto ya míbaléq KXsánzá mísáto ya mísátoqKXsánzá mísáto ya míneiquU abbreviatedq}q(KXSM1qKXSM2qKXSM3qKXSM4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX liguzaratiqBUgdqCX ligaelikiqDUgaqEXlirlandeqFUgnqGX ligwaraniqHUglqIX ligaliciaqJUlaqKXkilatiniqLUlnqMXlingálaqNUloqOXlilaoqPUtrqQXturkqRUlvqSXlilativaqTUltqUXlituaniqVUtkqWXturkmenqXUthqYXthaiqZUtiq[X tigirinyaq\Uteq]Xliteleguq^Ufilq_X litagalogq`UtaqaXtamiliqbUyiqcXyiddishqdUpt_BRqeXlipulutugɛ́si (Brazil)qfUdeqgX lialemaniqhUdaqiX lidanemarkqjUnlqkX lifalamáqlUbaiqmXnkótá ya BamilekeqnUelqoXligrekiqpUeoqqX lisipelantoqrUenqsX lingɛlɛ́saqtUbequXbelarusiqvUeuqwXlibaskeqxUetqyX liestoniaqzUesq{X lispanyolaq|Uruq}Xlirusiq~UluaqXcilubaqUmulqXnkótá míngiqUroqXlirumaniqUbnqXbengaliqUlunqXlundaqUen_CAqXlingɛlɛ́sa (CA)qUbgqX kibulgariaqUukqX liukreniaqUbmqXbambaraqUjvqXlizavaqUbhqXlibiyariqUbrqXbretonqUbsqX libosiniaqUjaqXliyapaniqUocqXliositaqUundqXlokótá eyébámí tɛ́qUtwqXtwiqUtlhqX kilingoniqUorqXoriyaqUxhqXxhosaqUcaqXkatalaniqUcyqXliwelesiqUcsqX litshɛkiqUpsqXpashtoqUptqXlipulutugɛ́siqUpaqX lipunzabiqUviqX livietnamiqUakqXakanqUplqXlipoloniqUhyqX liarmenyaqUhrqX likroasiaqUhuqX liungariaqUhiqXlihindiqUheqXliyudaqUuzqX liusibekiqUmlqX limalayalamiqUmnqX limongoliqUmkqX limasedoniaqUurqXliurduqUmtqXlimaltaqUmsqXlimalasiqUmrqXlimaratiqUugqXuighurqUafqX afrikánsiqUswqX kiswahiliqUisqXlislandaqUamqX liamarikiqUitqX litalianoqUsvqX liswédwaqUasqXliasameqUarqXliarabuqUsuqXlisundanɛ́siqUzuqXzuluqUiaqX interlinguaqUazqX liazerbayaniqUieqX interlingueqUidqX lindonesiqUafhqX afríhiliqUnnqXlinovezi-nynorskqUnoqXlinoveziqUneqXlinepaliqUfrqX lifalanséqUfyqXlifrisiqUfaqXlipɛrsiqUfiqX lifilandirUkyrXkirgizirUfr_CArXlifalansé (CA)rUforXlifaroserUkarXlizorzirUkgr X kikɔ́ngɔr Usrr Xliserbiar Usqr X lialbaniarUkorXlikorearUknrXkanadarUkmrX likambodiarUstrX Sotho ya SidirUskrX lisolovakirUsirX lisinalɛ́sirUshrX liserbokroatarUsorXlisomalirUkurXlikurdir Uslr!X lisolovenir"Usar#X indu-ya-kalar$Usgr%Xsangor&Usdr'Xlisindir(uU territoriesr)}r*(UBDr+XBángaladɛ́sir,UBEr-X Bɛ́ljikar.UBFr/X Burkina Fasor0UBGr1XBulgariar2UBAr3XBosnia na Erzegovinar4UJPr5XYapanr6UBIr7XBurundir8UBTr9XButánir:U011r;XAfríka ya límber<UBWr=XBotswanar>U015r?XAfríka ya Nolar@UBRrAXBresílirBU018rCXAfríka ya SídirDUBYrEX BielorusiarFURUrGXRusírHURWrIXRwandarJUTMrKXTurkmenistánirLUTJrMX TazikistánirNUROrOXRumaniarPUGWrQX Gine-BisaurRUGRrSXGresirTUGBrUXIngɛlɛ́tɛlɛrVUGNrWXGinerXUGMrYXGambiarZUGIr[X Gibraltarr\UGHr]XGhanar^UTNr_XTuniziar`UJOraXZordanírbUHRrcXKroasiardUHUreXUngrirfUFIrgX FinilandarhUPTriX PulutugalrjUSHrkX Santu HelenarlUPKrmX PakistánirnUPLroXPolonirpUZMrqXZambiarrUEHrsXSahara ya límbertUEGruXEjiptirvUZArwX SidafríkarxUVNryXVietnamirzUZZr{XEsíká eyébámí tɛ́r|UETr}XEtiopyar~UZWrXZimbabwerUESrXEspaniarUUZrX UzbekistánirUMLrXMalirUMOrXMakaurUMNrXMongolírUMKrXMasedonirUMVrXMadívirUMZrX MozambíkirUFRrXFalansiarUDJrXDjibutirUNLrXHolandarUNOrXNorvejrUNArXNamibiarUNErXNijérUNGrXNijeriarUNPrXNepálirUCHrXSwisirUCNrXSínarUCMrXKamerunrUCArXKanadárUCGrXKongó-BrazzavillerUCFrX SantrafríkarUCDrXKongó-KinsásárUCZrXRepubliki ShekirUSYrXSirírUKGrXKirghizistánirUKErXKenyarUKIrXKIrUSTrXSǎo Tomé na PrinciperUKRrX Kore ya SidirUKPrX Kore ya NolarUSOrXSomaliarUSMrX Santu MarinorUKZrX KazakstánirUSErXSwésirUSDrXSudanirU150rXEróparU155rXErópa ya límberU154rXErópa ya NolarUDErXAlémanirUYErXYeménirUDZrXAljeriarUUSrXEtazínirULBrXLibanrUTWrXTaiwanrUTTrXTrinidad mpé TobagorUTRrXTurkírULVrXLetonirULTrXLitwanirULUrX LuksamburgrULRrXLiberiarUTGrXTogorULYrXLibíyarUVArX VatikánirU142rXAzíarUADrXAndorarUAGrXAntigua mpé BarbudarUAFrX AfganistánirUISrXIslandirUITrXItaliarUAOrXAngólarU002rXAfríkarU001rXmokili mobimbarUARrX ArgentinarU005rXAmeríka ya SídirUINrXƐndɛrUAXrXAlbaniarUIErXIrlandírUIDr X Indoneziár uUdecimal_formatsr }r U date_formatsr }r(Umediumrh))r}r(h,X yyyy MMM drh.X%(yyyy)s %(MMM)s %(d)srubUfullrh))r}r(h,XEEEE, yyyy MMMM ddrh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srubUlongrh))r}r(h,X yyyy MMMM drh.X%(yyyy)s %(MMMM)s %(d)srubUshortrh))r}r (h,Xyy/MM/ddr!h.X%(yy)s/%(MM)s/%(dd)sr"ubuUcurrency_symbolsr#}r$U time_zonesr%}r&(UAfrica/Kinshasar'}r(Ucityr)X Kinsásár*sU Africa/Banguir+}r,j)X Santrafríkar-suUscriptsr.}r/(UArabr0Xarabur1UZxxxr2X ekomí tɛ́r3ULatnr4Xlatɛ́r5UZzzzr6Xbokomi boyébámí tɛ́r7uUvariantsr8}r9Unumber_symbolsr:}r;Ucurrency_namesr<}r=(UCDFr>Xfalánga kongolér?UFRFr@XFalánga ya FalansiarAUCHFrBXFalánga ya SwisirCUBIFrDXfalánga ya BurundirEUXXXrFXmbɔ́ngɔ eyébámí tɛ́rGUBEFrHXfalánga ya Bɛ́ljikarIUXPFrJX Falánga CFPrKUXOFrLXFalánga CFA BCEAOrMuUmonthsrN}rO(U stand-alonerP}rQUnarrowrR}rS(KX1rTKX2rUKX3rVKX4rWKX5rXKX6rYKX7rZKX8r[K X9r\K X10r]K X11r^K X12r_usUformatr`}ra(Uwiderb}rc(KXsánzá ya yambordKXsánzá ya míbaléreKXsánzá ya mísátorfKXsánzá ya míneirgKXsánzá ya mítánorhKXsánzá ya motóbáriKXsánzá ya nsamborjKXsánzá ya mwamberkK Xsánzá ya libwarlK Xsánzá ya zómirmK Xsánzá ya zómi na mɔ̌kɔ́rnK Xsánzá ya zómi na míbalérouU abbreviatedrp}rq(KXs1rrKXs2rsKXs3rtKXs4ruKXs5rvKXs6rwKXs7rxKXs8ryK Xs9rzK Xs10r{K Xs11r|K Xs12r}uuuUcurrency_formatsr~}rUdaysr}r(U stand-aloner}rUnarrowr}r(KjUKjVKjWKjXKjYKjZKjTusUformatr}r(Uwider}r(KXmokɔlɔ ya libosórKXmokɔlɔ ya míbalérKXmokɔlɔ ya mísátorKXmokɔlɔ ya mínéirKXmokɔlɔ ya mítánorKX mpɔ́sɔrKXeyengaruU abbreviatedr}r(KXm1rKXm2rKXm3rKXm4rKXm5rKXmpsrKXeyeruuuU meta_zonesr}rUerasr}r(Uwider}r(KXlibosó ya Y.-K.rKXnsima ya Y.-K.ruU abbreviatedr}r(KXlibosó ya Y.-K.rKXnsima ya Y.-K.ruuu.PK[D))(site-packages/babel/localedata/id_ID.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll(site-packages/babel/localedata/is_IS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll)site-packages/babel/localedata/kaj_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/kl_GL.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[D))(site-packages/babel/localedata/bn_BD.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[{==-site-packages/babel/localedata/pa_Guru_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll(site-packages/babel/localedata/ti_ET.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[aZw w &site-packages/babel/localedata/haw.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@UhawqAXʻōlelo HawaiʻiqBsU territoriesqC}qD(URUqEXLūkiaqFUFRqGXPalaniqHUNLqIXHōlaniqJUCNqKXKinaqLUCAqMXKanakāqNUDEqOX KelemāniaqPUJPqQXIāpanaqRUITqSX ʻĪkāliaqTUILqUX ʻIseraʻelaqVUGRqWXHeleneqXUNZqYXAotearoaqZUAUq[X Nūhōlaniq\UGBq]XAupuni Mōʻī Hui Pū ʻIaq^UUSq_XʻAmelika Hui Pū ʻIaq`UINqaXʻĪniaqbUPHqcXʻĀina PilipinoqdUIEqeX ʻIlelaniqfUMXqgXMekikoqhUESqiXKepaniaqjUDKqkXKenemakaqluUdecimal_formatsqm}qnU date_formatsqo}qp(Umediumqqh))qr}qs(h,X d MMM yyyyqth.X%(d)s %(MMM)s %(yyyy)squubUfullqvh))qw}qx(h,XEEEE, d MMMM yyyyqyh.X!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)sqzubUlongq{h))q|}q}(h,X d MMMM yyyyq~h.X%(d)s %(MMMM)s %(yyyy)squbUshortqh))q}q(h,Xd/M/yyqh.X%(d)s/%(M)s/%(yy)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXIanualiqKX PepelualiqKXMalakiqKX ʻApelilaqKXMeiqKXIuneqKXIulaiqKXʻAukakeqK X KepakemapaqK X ʻOkakopaqK XNowemapaqK XKekemapaquU abbreviatedq}q(KXIan.qKXPep.qKXMal.qKXʻAp.qKXMeiqKXIun.qKXIul.qKXʻAu.qK XKep.qK XʻOk.qK XNow.qK XKek.quuuUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqX)q̆qUint_precqKKqh,X ¤#,##0.00qUprefixqX¤qX(¤qӆqUexp_plusqNUgroupingqKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KX PoʻakahiqKXPoʻaluaqKX PoʻakoluqKXPoʻahāqKX PoʻalimaqKXPoʻaonoqKXLāpulequU abbreviatedq}q(KXP1qKXP2qKXP3qKXP4qKXP5qKXP6qKXLPquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[_.ll-site-packages/babel/localedata/en_Dsrt_US.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[{==(site-packages/babel/localedata/ne_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll)site-packages/babel/localedata/cch_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK["ll(site-packages/babel/localedata/ha_SD.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/ny_MW.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK["ll)site-packages/babel/localedata/byn_ER.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[:2??&site-packages/babel/localedata/cop.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUmonthsqg}qh(U stand-aloneqi}qjUnarrowqk}ql(KX1qmKX2qnKX3qoKX4qpKX5qqKX6qrKX7qsKX8qtK X9quK X10qvK X11qwK X12qxusUformatqy}qz(Uwideq{}q|(KhmKhnKhoKhpKhqKhrKhsKhtK huK X10q}K X11q~K X12quU abbreviatedq}q(KhmKhnKhoKhpKhqKhrKhsKhtK huK X10qK X11qK X12quuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhnKhoKhpKhqKhrKhsKhmusUformatq}q(Uwideq}q(KhnKhoKhpKhqKhrKhsKhmuU abbreviatedq}q(KhnKhoKhpKhqKhrKhsKhmuuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[_.ll)site-packages/babel/localedata/syr_SY.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[nvv-site-packages/babel/localedata/sr_Cyrl_BA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)squbUfullqh)q}q(hX;HH 'часова', mm 'минута', ss 'секунди' vqhXE%(HH)s часова, %(mm)s минута, %(ss)s секунди %(v)squbUshortqh)q}q (hXHH:mmq!hX %(HH)s:%(mm)sq"ubuU languagesq#}q$Usrq%X српскиq&sU territoriesq'}q(Udecimal_formatsq)}q*U date_formatsq+}q,(Umediumq-h)q.}q/(hX yyyy-MM-ddq0hX%(yyyy)s-%(MM)s-%(dd)sq1ubUshortq2h)q3}q4(hXyy-MM-ddq5hX%(yy)s-%(MM)s-%(dd)sq6ubuUcurrency_symbolsq7}q8UBAMq9XКМ.q:sU time_zonesq;}qUvariantsq?}q@Unumber_symbolsqA}qBUcurrency_namesqC}qDh9X%Конвертибилна МаркаqEsUmonthsqF}qGUformatqH}qIUwideqJ}qK(KXјуниqLKXјулиqMussUcurrency_formatsqN}qOUdaysqP}qQUformatqR}qS(UwideqT}qUKXсриједаqVsU abbreviatedqW}qXKXсриqYsusU meta_zonesqZ}q[Uerasq\}q]u.PK[ZZ%site-packages/babel/localedata/gl.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KX 1o trimestreqKX 2o trimestreqKX 3o trimestreqKX 4o trimestrequU abbreviatedq}q(KXT1qKXT2qKXT3qKXT4quuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XHH:mm:ssqRUformatqSX%(HH)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X HH:mm:ss vqXhSX%(HH)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X HH:mm:ss zq]hSX%(HH)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XHH:mmqbhSX %(HH)s:%(mm)sqcubuU languagesqd}qe(Uzh_HantqfXChinés tradicionalqgUguqhX GuxaratianoqiUalgqjXLingua algonquinaqkUneqlXNepalíqmUgdqnXGaélico escocésqoUgaqpX IrlandésqqUgnqrXGuaraníqsUglqtXgalegoquUfiuqvXLingua finno-úgricaqwUlnqxXLingalaqyUloqzXLaotianoq{Utrq|XTurcoq}Ulvq~XLetónqUausqXLingua australianaqUcauqXLingua caucásicaqUthqX TailandésqUroaqXLingua románicaqUsuqX SondanésqUteqXTeluguqUpt_PTqXPortugués ibéricoqUfilqXFilipinoqUtaqXTamilqUyiqXYiddishqUpt_BRqXPortugués brasileiroqUcelqXLingua célticaqUdaqX DinamarquésqUssaqXLingua do Nilo-SáharaqUgemqXLingua xermánicaqUbatqXLingua bálticaqUtlqXTagaloqUelqXGregoqUeoqX EsperantoqUenqXInglésqUartqXLingua artificialqUbeqX BielorrusoqUzh_HansqXChinés simplificadoqUphiqXLingua filipinaqUarcqXArameoqUen_USqXInglés americanoqUeuqXÉuscaroqUetqX EstonianoqUsemqX Lingua semitaqUnubqX Lingua nubiaqUesqXEspañolqUruqXRusoqUde_ATqXAlemán de AustriaqUmulqXVarias linguasqUroqXRomanésqUbnqXBengalíqUen_CAqXInglés canadianoqUbgqXBúlgaroqUukqXUcraínoqUastqX AsturianoqUtutqXLingua altaicaqUjvqXXavanésqUbhqX BiharianoqUbrqXBretónqUbsqXBosnioqUjaqXXaponésqUlaqXLatínqUocqXOccitanoqUundqX"Lingua descoñecida ou non válidaqUtwqXTwiqUtlhqXClingonqUorqXOrissaqUxhqXXhosaqUcaqXCatalánqUcyqXGalésqUsgnqXLingua de signosqUcsqXChecoqUzhqXChinésqUapaqX Lingua apacheqUcuqXEslavo eclesiásticoqUde_CHqXAlemán suízoqUpsqXPashtoqUptqX PortuguésqUltqXLituanoqUparXPunjabirUvirX VietnamitarUzxxrXSen contido lingüísticorUes_ESrX CastelánrUen_GBrXInglés británicor Uhyr XArmenior Uhrr XCroatar UtirXTigriñarUegyrXExipcio antigorUhurXHúngarorUhirXHindirUnl_BErXFlamencorUherXHebreorUuzrXUzbecorUmlrX MalaialamrUmnrXMongolrUmkr X Macedonior!Uurr"XUrdúr#Umtr$XMaltésr%Ucair&XLingua india centroamericanar'Uplr(XPolacor)Umsr*XMalaior+Umrr,XMarathir-Uugr.XUighurr/Uslar0XLingua eslávicar1Usair2XLingua india sudamericanar3Uafr4X Afrikaansr5Uswr6XSuaxilir7Uisr8X Islandésr9Uamr:XAmáricor;Uitr<XItalianor=Uanr>X Aragonésr?Uasr@XAssamésrAUarrBXÁraberCUes_419rDXEspañol latinoamericanorEUzurFXZulúrGUiarHX InterlinguarIUinerJXLingua indoeuropearKUazrLX AzerbaianorMUidrNX IndonesiorOUincrPXLingua índicarQUnlrRX HolandésrSUnnrTXNoruegués nynorskrUUnorVX NorueguésrWUnbrXXNoruegués BokmalrYUnairZXLingua india norteamericanar[Uafar\XLingua afro-asiáticar]Uen_AUr^XInglés australianor_Ugrcr`X Grego antigoraUmisrbXLingua miscelánearcUfrrdXFrancésreUderfXAlemánrgUfyrhXFrisónriUsvrjXSuecorkUfarlXPersarmUfr_CHrnXFrancés suízoroUfirpXFinésrqUsarrX SánscritorsUfr_CArtXFrancés canadianoruUforvXFaroésrwUkarxX XeorxianoryUsrrzXSerbior{Usqr|XAlbanésr}Ukor~XCoreanorUknrXKannadarUkmrX CambodianorUstrXSesothorUskrXEslovacorUsirX SinhalésrUshrX SerbocroatarUsorXSomalírUkurXKurdorUslrXEslovenorUkyrXKyrgizrUsdrXSindhiruU territoriesr}r(UBDrX BangladeshrUBErXBélxicarUBFrX Burkina FasorUBGrXBulgariarUVErX VenezuelarUBArXBosnia e HercegovinarUBBrXBarbadosrUWFrXWallis e FutunarUBLrXSan BartolomérUBMrXBermudasrUBNrXBruneirUBOrXBoliviarUBHrXBahreinrUBIrXBurundirUBJrXBeninrUBTrXButánrU011rXÁfrica OccidentalrUBVrX Illa BouvetrUBWrXBotsuanarU014rXÁfrica OrientalrU015rXÁfrica SeptentrionalrUBRrXBrasilrU017rXÁfrica CentralrU018rXÁfrica MeridionalrU019rXAméricarUBYrX BielorrusiarUBZrXBelicerULVrXLetoniarURWrXRuandarURSrXSerbiarUTLrX Timor LesterURErXReuniónrUTMrX TurkmenistánrUOMrXOmánrUTJrX TaxiquistánrUROrXRomaníarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrXXeorxia do Sur e Illas SandwichrUGRrXGreciarUGQrXGuinea EcuatorialrUGPrX GuadaluperUJPrXXapónrUKIrXKiribatirUGYrXGüianarUGGrXGuernseyrUGFrXGüiana FrancesarUGErXXeorxiarUGDrXGranadarU021rXAmérica do NorterUGBrX Reino UnidorUGArXGabónrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiar UGLr X Grenlandiar U029r XCariber UGIrX XibraltarrUGHrXGanarUJErXJerseyrUTNrXTunisiarUJMrXXamaicarU013rXAmérica CentralrUWSrXSamoarU419rXAmérica Latina e o CariberUHRrXCroaciarUBSr XBahamasr!UHTr"XHaitír#UHUr$XHungríar%UHKr&XHong Kong RAE de Chinar'U039r(XEuropa Meridionalr)UHNr*XHondurasr+UFIr,X Finlandiar-U142r.XAsiar/U030r0X Asia Orientalr1U034r2X Sul de Asiar3U035r4XSureste Asiáticor5UPRr6X Porto Ricor7UPSr8X Palestinar9UFKr:XIllas Malvinasr;UIOr<X(Territorio Británico do Océano Índicor=UPWr>XPalaur?UPTr@XPortugalrAUSJrBXSvalbard e Jan MayenrCUMDrDXMoldovarEUFMrFX MicronesiarGUIQrHXIraqrIUPArJXPanamárKUPFrLXPolinesia FrancesarMUPGrNXPapúa Nova GuinearOUPErPXPerúrQUPKrRX PaquistánrSUPHrTX FilipinasrUUFOrVX Illas FeroerWUPNrXXPitcairnrYUPLrZXPoloniar[UPMr\XSan Pedro e Miguelónr]UZMr^XZambiar_UEHr`XSahara OccidentalraURUrbXRusiarcUEErdXEstoniareUEGrfXExiptorgUZArhX SudáfricariUECrjXEcuadorrkUITrlXItaliarmUVNrnXVietnamroUZZrpX#rexión descoñecida ou non válidarqUSBrrXIllas SalomónrsUETrtXEtiopíaruUSOrvXSomaliarwUZWrxXCimbabueryUSArzXArabia Sauditar{UESr|XEspañar}UERr~XEritrearUMErX MontenegrorUAQrX AntártidarUMGrX MadagascarrUMFrX San MartiñorUMArXMarrocosrUMCrXMónacorUUZrX UzbekistánrUMMrXMyanmarrUMLrXMalirUMOrXMacau RAE de ChinarUMNrXMongoliarUHMrXIlla Heard e Illas McDonaldrUASrXSamoa AmericanarUMKrX MacedoniarUMUrXMauriciorUMTrXMaltarUMWrXMalauirUMVrXMaldivasrUMQrX MartinicarUMPrXIllas Marianas do norterUMSrX MontserratrUMRrX MauritaniarUIMrX Illa de ManrUUGrXUgandarUTZrXTanzaniarUMYrXMalaisiarUMXrXMéxicorUILrXIsraelrUFRrXFranciarUAWrXArubarUDOrXRepública DominicanarUSHrX Santa HelenarUVCrXSan Vicente e GranadinasrU054rX MelanesiarUDJrXXibutirUFJrXFixirU057rXRexión da MicronesiarU172rX#Comunidade de Estados IndependentesrU053rXAustralia e Nova CelandiarUNIrX NicaraguarUNLrXPaíses BaixosrUNOrXNoruegarUNArXNamibiarUVUrXVanuaturUNCrXNova CaledoniarUNErXNíxerrUNFrX Illa NorfolkrUNGrXNixeriarUNZrX Nova CelandiarUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinesiarUCIrXCosta de MarfilrUCHrXSuízarUCOrXColombiarUCNrXChinarUCMrXCamerúnrUCLrXChilerUCCrX Illas CocosrUCArXCanadárUCGrXCongorUCFrXRepública Africana CentralrUCDrX República Democrática do CongorUCZrXRepública ChecarUCYrXChiprerUCXrXIlla ChristmasrUCSrXSerbia e MontenegrorUCRrX Costa Ricar UPYr XParaguair UCVr X Cabo Verder UCUrXCubarUSZrX SuacilandiarUSYrXSiriarUKGrXQuirguicistánrUKErXQueniarUSRrXSurinamrU143rX Asia CentralrUKHrXCambodiarUKNrXSan Cristovo e NevisrUKMr XComoresr!USTr"XSanto Tomé e Prínciper#USKr$X Eslovaquiar%UKRr&X Corea do Surr'USIr(X Esloveniar)UKPr*XCorea do Norter+UKWr,XKuwaitr-USNr.XSenegalr/USMr0X San Marinor1USLr2X Serra Leoar3USCr4XSeixelesr5UKZr6X Kazakhstanr7UKYr8X Illas Caimánr9USGr:XSingapurr;USEr<XSueciar=USDr>XSudánr?U151r@XEuropa do LesterAU150rBXEuroparCUDMrDXDominicarEU155rFXEuropa OccidentalrGU154rHXEuropa SeptentrionalrIUVGrJXIllas Virxes BritánicasrKUDErLXAlemañarMUYErNXIemenrOUMHrPXIllas MarshallrQU062rRXAsia do Sul-CentrorSUDZrTXArxeliarUUUSrVXEstados Unidos de AméricarWUUYrXXUruguairYUYTrZXMayotter[UUMr\X Illas Menores Distantes dos EUA.r]ULBr^XLíbanor_ULCr`X Santa LucíaraULArbXLaosrcUTVrdXTuvalureUTWrfXTaiwánrgUTTrhXTrindade e TobagoriUTRrjXTurquíarkULKrlX Sri LankarmULIrnX LiechtensteinroUCKrpX Illas CookrqUTOrrXTongarsULTrtXLituaniaruULUrvX LuxemburgorwULRrxXLiberiaryULSrzXLesothor{UTHr|X Tailandiar}UTFr~XTerritorios Franceses do SulrUTGrXTogorUTDrXXadrUTCrXIllas Turks e CaicosrULYrXLibiarUVArXCidade do VaticanorU145rXAsia OccidentalrUAErXEmiratos Árabes UnidosrUADrXAndorrarUAGrXAntiga e BarbudarUAFrX AfganistánrUAIrXAnguilarUVIrXIllas Virxes EstadounidensesrUISrXIslandiarUIRrXIránrUAMrXArmeniarUALrXAlbaniarUAOrXAngolarUANrXAntillas HolandesasrU003rX NorteaméricarU002rXÁfricarU001rXMundorUARrX ArxentinarUAUrX AustraliarUATrXAustriarU005rX SudaméricarUINrXIndiarUAXrX Illas AlandrU009rXOceaníarUAZrX AcerbaixánrUIErXIrlandarUIDrX IndonesiarUJOrXXordaniarUQUrXUnión EuropearUUArXUcraínarUQArXQatarrUDKrX DinamarcarUMZrX MozambiquerUQOrXOceanía DistanteruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X d MMM, yyyyrhSX%(d)s %(MMM)s, %(yyyy)srubUfullrhO)r}r(h3XEEEE dd MMMM yyyyrhSX!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)srubUlongrhO)r}r(h3X dd MMMM yyyyrhSX%(dd)s %(MMMM)s %(yyyy)srubUshortrhO)r}r(h3Xdd/MM/yyrhSX%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}rUESPrX₧rsU time_zonesr}r(UAmerica/Belizer}rUcityrXBelicersUAtlantic/Canaryr}rjXIllas CanariasrsUAmerica/Cordobar}rjXCórdobarsUAmerica/Buenos_Airesr}rjX Bos AiresrsU America/Belemr}rjXBelémrsUPacific/Easterr}rjXIlla de PascuarsU Asia/Jakartar}rjXIacartarsUAmerica/Indiana/Tell_Cityr}r jX Tell Cityr sUAmerica/North_Dakota/New_Salemr }r jX New Salemr sUAmerica/Monterreyr}rjX MonterreirsUAmerica/Indiana/Marengor}rjXMarengorsUAmerica/Anguillar}rjXAnguilarsUAmerica/North_Dakota/Centerr}rjXCentralrsUAmerica/Martiniquer}rjX MartinicarsUAsia/Singaporer}rjXSingapurrsUAtlantic/Bermudar }r!jXBermudasr"sUAmerica/Indiana/Vevayr#}r$jXVevayr%sU Europe/Monacor&}r'jXMónacor(sUEurope/Luxembourgr)}r*jX Luxemburgor+sUPacific/Honolulur,}r-jX Honolulúr.sUEurope/Gibraltarr/}r0jX Xibraltarr1sUAmerica/St_Johnsr2}r3jXSt Johnsr4sUIndian/Reunionr5}r6jXReuniónr7sUAmerica/Maceior8}r9jXMaceiór:sUPacific/Galapagosr;}r<jXIllas Galápagosr=sUAfrica/Djiboutir>}r?jXXubutir@sUAntarctica/DumontDUrvillerA}rBjXDumont-d'UrvillerCsUAmerica/Indiana/VincennesrD}rEjX VincennesrFsUAtlantic/Cape_VerderG}rHjX Cabo VerderIsUAmerica/MazatlanrJ}rKjX MazatlánrLsUAmerica/GrenadarM}rNjXGranadarOsUAmerica/Indiana/KnoxrP}rQjXKnoxrRsUAmerica/El_SalvadorrS}rTjX O SalvadorrUsUAmerica/Indiana/PetersburgrV}rWjX PetersburgrXsUAmerica/GuadelouperY}rZjX Guadaluper[sUAsia/Yekaterinburgr\}r]jX Ecaterinburgor^sUAmerica/Jamaicar_}r`jXXamaicarasUAsia/Ulaanbaatarrb}rcjX Ulan BatorrdsU Europe/Moscowre}rfjXMoscovargsUEurope/Volgogradrh}rijX VolgogradorjsUIndian/Maldivesrk}rljXMaldivasrmsU Europe/Parisrn}rojXParísrpsUAmerica/Indiana/Winamacrq}rrjXWinamacrssU Pacific/Fijirt}rujXFidxirvsUAmerica/Cancunrw}rxjXCancúnrysUEurope/Kaliningradrz}r{jX Kaliningrador|sUAmerica/Argentina/Rio_Gallegosr}}r~jX Río GallegosrsUAmerica/Kentucky/Monticellor}rjX MonticellorsUAsia/Samarkandr}rjX SamarcandarsUAmerica/Argentina/Tucumanr}rjXTucumánrsUAmerica/Meridar}rjXMéridarsU Etc/Unknownr}rjX DescoñecidorsUAmerica/Mexico_Cityr}rjXCidade de MéxicorsUAmerica/Puerto_Ricor}rjX Porto RicorsUIndian/Mauritiusr}rjXMauriciorsUAmerica/Guyanar}rjXGüianarsUAmerica/Panamar}rjXPanamársUAntarctica/South_Poler}rjXPolo SulrsUAmerica/Sao_Paulor}rjX São PaulorsuUscriptsr}r(UHebrrXhebreorUZzzzrX%escritura descoñecida ou non válidarUCyrlrX cirílicorUArabrXáraberUZxxxrX non escritarUCansrX%silabario aborixe canadiano unificadorUBrairXbraillerULatnrXlatinorUGrekrXgregoruUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}r(UCOPrXPeso colombianorUUSDrXDólar estadounidenserULUFrXFranco luxemburguésrUBELrXFranco belga (financeiro)rUGNSrX Syli guineanorUBOPrXPeso bolivianorUBECrXFranco belga (convertible)rUGQErXEkwele guineanarUBEFrX Franco belgarUHNLrXLempira hondureñorUBOVrXMVDOL bolivianorUPESrX Sol peruanorUISKrXCoroa islandesarUCRCrXColón costarricenserUPABrXBalboa panameñorULUCrX Franco convertible luxemburguésrUGNFrXFranco guineanorUDEMrX Marco alemánrUGBPrXLibra esterlinarUBOBrX BolivianorULULrXFranco financeiro luxemburguésrUDKKrXCoroa dinamarquesarUCADrXDólar canadianorUMXNrX Peso mexicanorUHUFrXFlorín húngarorUZARrXRand sudafricanorUCHFrX Franco suizorUUYIrX#Peso en unidades indexadas uruguaiorUPTErXEscudo portuguésrjXPeseta españolarURUBrX Rublo rusorUXXXrX-Unidade monetaria descoñecida ou non válidarUECVrX&Unidade de valor constante ecuatorianarUECSrXSucre ecuatorianorUNLGrXFlorín holandésrUNICrXCórdoba nicaragüenserUXPTr XPlatinor UXAGr XPratar UMXPr X"Peso de prata mexicano (1861-1992)rUSEKrX Coroa suecarUFRFrXFranco francésrUADPrXpeseta andorranarUCUPrX Peso cubanorUIEPrXLibra irlandesarUCLFrXUnidades de fomento chilenasrUSVCrXColón salvadoreñorUSURrXRublo soviéticorUCNYrXIuan renminbi chinésr UVEFr!XBolívar forte venezolanor"UGTQr#XQuetzal guatemaltecor$UGRDr%X Dracma gregor&UVEBr'XBolívar venezolanor(UESBr)X$Peseta española (conta convertible)r*UESAr+XPeseta española (conta A)r,UDOPr-XPeso dominicanor.UXPDr/XPaladior0UCLPr1X Peso chilenor2UXAUr3XOuror4UEURr5XEuror6UARPr7XPeso arxentino (1983-1985)r8UUYPr9XPeso uruguaio (1975-1993)r:UITLr;X Lira italianar<UARSr=XPeso arxentinor>UUYUr?X Peso uruguaior@UNIOrAXCórdoba de ouro nicaragüenserBUNOKrCXCoroa norueguesarDUMXVrEXUnidade de inversión mexicanarFUGIPrGXLibra de XibraltarrHUPYGrIXGuaraní paraguaiorJUBRRrKXCruzeiro brasileirorLUINRrMX Rupia indiarNUJPYrOX Ien xaponésrPUBRNrQXCruzado novo brasileirorRUBRLrSXReal brasileirorTUMADrUXDirham marroquírVUMAFrWXFranco marroquírXURURrYXRublo ruso (1991-1998)rZUBREr[XCruzeiro brasileiro (1990-1993)r\UPHPr]X Peso filipinor^UBRCr_XCruzado brasileiror`UBRBraX$Cruzeiro novo brasileiro (1967-1986)rbUPENrcXSol novo peruanordUPEIreX Inti peruanorfuUmonthsrg}rh(U stand-aloneri}rjUnarrowrk}rl(KXXrmKXFrnKXMroKXArpKjoKjmKjmKjpK XSrqK XOrrK XNrsK XDrtusUformatru}rv(Uwiderw}rx(KXXaneiroryKXFebreirorzKXMarzor{KXAbrilr|KXMaior}KXXuñor~KXXullorKXAgostorK XSetembrorK XOutubrorK XNovembrorK XDecembroruU abbreviatedr}r(KXXanrKXFebrKXMarrKXAbrrKXMairKXXuñrKXXulrKXAgorK XSetrK XOutrK XNovrK XDecruuuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.X ¤rjrh1KKrh3X #,##0.00 ¤rh5h/h6rh8Nh9KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXLrKjoKjoKjmKXVrKjqKjtusUformatr}r(Uwider}r(KXLunsrKXMartesrKX MércoresrKXXovesrKXVenresrKXSábadorKXDomingoruU abbreviatedr}r(KXLunrKXMarrKXMérrKXXovrKXVenrKXSábrKXDomruuuU meta_zonesr}r(UEurope_Centralr}r(UcommonrUlongr}r(UdaylightrX!horario de verán europeo centralrUstandardrXhorario europeo centralruuUGMTr}r(jj}rjXhorario medio de GreenwichrsuUEurope_Easternr}r(jj}r(jX"horario de verán europeo orientalrjXhorario europeo orientalruuUEurope_Westernr}r(jj}r(jX$horario de verán europeo occidentalrjXhorario europeo occidentalruuuUerasr}r(Uwider}r(KXantes de CristorKXdespois de CristoruU abbreviatedr}r(KXa.C.rKXd.C.ruuu.PK[..%site-packages/babel/localedata/tn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q](Uviq^X Vietnameseq_Uelq`XSeGerikaqaUeoqbX EsperantoqcUenqdXSekgoaqeUafqfXSeburuqgUtnqhXSetswanaqiUocqjXOccitanqkUcaqlXCatalanqmUamqnXAmharikiqoUguqpXGujaratiqqUsvqrXSwedishqsUcsqtXSe CzeckquUcyqvXWelshqwUarqxXArabicqyUsuqzX Mo/SeSundaneq{Ugaq|XIrishq}Uzuq~XIsiZuluqUeuqXBasqueqUetqXEstonianqUxhqXIsiXhosaqUazqX AzerbaijaniqUidqX IndonesianqUesqXSpanishqUruqXRussianqUglqXGalicianqUnlqXSe DutchqUptqX Se PotoketsiqUlaqXLatinqUjvqXJavaneseqUneqXNepaliqUtrqXTurkishqUlvqXLatvianqUltqX LithuanianqUpaqXPunjabiqUthqXThaiqUtiqXTigrinyaqUitqX Se ItalianoqUheqX Se heberuqUiaqX InterlinguaqUisqX IcelandicqUfilqXTagalogqUtaqXTamilqUbeqX BelarusianqUfrqXSe ForaqUbgqX BulgarianqUukqX UkrainianqUslqX SlovenianqUhrqXCroatianqUfyqXFrisianqUbnqXBengaliqUdeqXGermanqUbhqXBihariqUdaqXDanishqUfaqX Mo/SePerishiaqUhiqXHindiqUbsqXSeBosniaqUfiqX Se-FinlandqUhuqX HungarianqUjaqXSe JapanqUfoqXFaroeseqUkaqX Mo/SeJojiaqUroqXSe RomaqUuzqXUzbekqUmlqX MalayalamqUsqqXAlbanianqUnoqXPuo ya kwa NorwayqUkoqXSe KoreaqUknqXKannadaqUmkqX MacedonianqUurqXUrduqUskqXSlovakqUmtqXMalteseqUsrqXSerbianqUgdqX Scots GaelicqUplqX Se PolandqUmsqXMalayqUmrqXMarathiqUteqXTeluguqUtlhqXKlingonqUswqXSwahiliquU territoriesq}qUdecimal_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKrh+X #,##0.###rh-h'h.rh0Nh1KKr ubsU date_formatsr }r (Umediumr hG)r }r(h+X yyyy MMM drhKX%(yyyy)s %(MMM)s %(d)srubUfullrhG)r}r(h+XEEEE, yyyy MMMM ddrhKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srubUlongrhG)r}r(h+X yyyy MMMM drhKX%(yyyy)s %(MMMM)s %(d)srubUshortrhG)r}r(h+Xyy/MM/ddrhKX%(yy)s/%(MM)s/%(dd)srubuUcurrency_symbolsr }r!U time_zonesr"}r#Uscriptsr$}r%Uvariantsr&}r'Unumber_symbolsr(}r)(Udecimalr*X,r+Ugroupr,X r-uUcurrency_namesr.}r/Umonthsr0}r1(U stand-aloner2}r3Unarrowr4}r5(KX1r6KX2r7KX3r8KX4r9KX5r:KX6r;KX7r<KX8r=K X9r>K X10r?K X11r@K X12rAusUformatrB}rC(UwiderD}rE(KX FerikgongrFKXTlhakolerGKXMopitlorHKXMoranangrIKX MotsheganangrJKX SeetebosigorKKXPhukwirLKXPhatwerMK XLwetserNK X DiphalanerOK X NgwanatselerPK X SedimontholerQuU abbreviatedrR}rS(KXFerrTKXTlhrUKXMoprVKXMorrWKXMotrXKXSeerYKXPhurZKXPhar[K XLwer\K XDipr]K XNgwr^K XSedr_uuuUcurrency_formatsr`}raNh)rb}rc(h!Nh#Kh$KKrdh&h'h'reh)KKrfh+X ¤#,##0.00rgh-X¤rhX-¤rirjh0Nh1KKrkubsUdaysrl}rm(U stand-alonern}roUnarrowrp}rq(Kj7Kj8Kj9Kj:Kj;Kj<Kj6usUformatrr}rs(Uwidert}ru(KX MosopulogorvKXLabobedirwKXLaborarorxKXLaboneryKX LabotlhanorzKX Matlhatsor{KXTshipir|uU abbreviatedr}}r~(KXMosrKXBedrKXRarrKXNerKXTlarKXMatrKXTshruuuU meta_zonesr}rUerasr}r(Uwider}r(KXBCrKXADruU abbreviatedr}r(KXBCrKXADruuu.PK[#x &site-packages/babel/localedata/syr.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,Xh:mm:ssq-Uformatq.X%(h)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mmq=h.X %(h)s:%(mm)sq>ubuU languagesq?}q@UsyrqAX ܣܘܪܝܝܐqBsU territoriesqC}qDUSYqEX ܣܘܪܝܝܐqFsUdecimal_formatsqG}qHNcbabel.numbers NumberPattern qI)qJ}qK(Uexp_precqLNUscaleqMKU frac_precqNKKqOUsuffixqPXqQhQqRUint_precqSKKqTh,X #,##0.###qUUprefixqVhQhQqWUexp_plusqXNUgroupingqYKKqZubsU date_formatsq[}q\(Umediumq]h))q^}q_(h,X dd/MM/yyyyq`h.X%(dd)s/%(MM)s/%(yyyy)sqaubUfullqbh))qc}qd(h,X dd MMMM, yyyyqeh.X%(dd)s %(MMMM)s, %(yyyy)sqfubUlongqgh))qh}qi(h,X dd MMMM, yyyyqjh.X%(dd)s %(MMMM)s, %(yyyy)sqkubUshortqlh))qm}qn(h,X dd/MM/yyyyqoh.X%(dd)s/%(MM)s/%(yyyy)sqpubuUcurrency_symbolsqq}qrU time_zonesqs}qtUscriptsqu}qvUvariantsqw}qxUnumber_symbolsqy}qzUcurrency_namesq{}q|Umonthsq}}q~(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KX ܏ܟܢ ܏ܒqKXܫܒܛqKXܐܕܪqKXܢܝܣܢqKXܐܝܪqKX ܚܙܝܪܢqKXܬܡܘܙqKXܐܒqK X ܐܝܠܘܠqK X ܏ܬܫ ܏ܐqK X ܏ܬܫ ܏ܒqK X ܏ܟܢ ܏ܐquU abbreviatedq}q(KX ܏ܟܢ ܏ܒqKXܫܒܛqKXܐܕܪqKXܢܝܣܢqKXܐܝܪqKX ܚܙܝܪܢqKXܬܡܘܙqKXܐܒqK X ܐܝܠܘܠqK X ܏ܬܫ ܏ܐqK X ܏ܬܫ ܏ܒqK X ܏ܟܢ ܏ܐquuuUcurrency_formatsq}qNhI)q}q(hLNhMKhNKKqhPhQhQqhSKKqh,X ¤ #,##0.00qhVX¤ qX¤ qqhXNhYKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KhKhKhKhKhKhKhuU abbreviatedq}q(KhKhKhKhKhKhKhuuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[PSpd d %site-packages/babel/localedata/fa.datnu[}q(U zone_formatsq}q(UregionqX وقت %sqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1}، ساعت {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX۱qKX۲qKX۳qKX۴qusUformatq}q(Uwideq}q(KXسه‌ماههٔ اولqKXسه‌ماههٔ دومqKXسه‌ماههٔ سومqKXسه‌ماههٔ چهارمquU abbreviatedq}q(KXQ1q KXQ2q!KXQ3q"KXQ4q#uuuUperiodsq$}q%(Uamq&Xقبل از ظهرq'Upmq(Xبعد از ظهرq)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X'‬'qFhFqGh7KKqHh9X'‪'%#,##0'‬'qIh;X'‪'%qJX-'‪'%qKqLh>Nh?KKqMubsU week_dataqN}qO(Umin_daysqPKU weekend_startqQKU first_dayqRKU weekend_endqSKuU time_formatsqT}qU(UmediumqVcbabel.dates DateTimePattern qW)qX}qY(h9XH:mm:ssqZUformatq[X%(H)s:%(mm)s:%(ss)sq\ubUfullq]hW)q^}q_(h9XH:mm:ss (vvvv)q`h[X%(H)s:%(mm)s:%(ss)s (%(vvvv)s)qaubUlongqbhW)qc}qd(h9XH:mm:ss (zzzz)qeh[X%(H)s:%(mm)s:%(ss)s (%(zzzz)s)qfubUshortqghW)qh}qi(h9XH:mmqjh[X %(H)s:%(mm)sqkubuU languagesql}qm(UgvqnXمانیqoUguqpX گجراتیqqUscnqrX سیسیلیqsUromqtXرومانوییquUalgqvXزبان آلگونکینیqwUaleqxX آلئوتیqyUscoqzXاسکاتلندیq{Umniq|Xمانیپوریq}Ugdq~Xگیلی اسکاتلندیqUgaqXایرلندیqUmnoqXزبان مانوبوqUosaqX اوسیجیqUgnqXگوارانیqUaltqXaltqUglqXگالیسیاییqUmwrqXمارواریqUtyqXتاهیتیاییqUtwqXتوی‌یاییqUttqX تاتاریqUtrqXترکی استانبولیqUtsqXتسونگاییqUtnqXتسواناییqUtoqXتونگاییqUausqXزبان استرالیاییqUavqX آواریqUtkqX ترکمنیqUthqXتایلندیqUroaqXزبان رومیاییqUtgqX تاجیکیqUteqXتلوگوییqUugaqXاوگاریتیqUmwlqXmwlqUkcgqXkcgqUsmiqXsmiqUfatqXفانتیاییqUfanqX فانکیqUwoqX ولوفیqUrmqXرتو‐رومیاییqUdinqXدینکاییqUblaqXblaqUcmcqXcmcqUmlqXمالایالامیqUzhqXچینیqUtemqXتیمنه‌ایqUen_CAqXانگلیسی کاناداqUnwcqXنواریایی کلاسیکqUzaqX چوانگیqUcauqXزبان قفقازیqUzuqX زولوییqUterqXترنوqUtetqX تتومیqUmncqXمانچوییqUkutqX کوتنیqUsukqXسوکوماییqUkumqX کومیکیqUsusqX سوسوییqUnewqXنواریاییqUsuxqX سومریqUdenqXdenqUmenqXمنده‌ایqUmulqXچندین زبانqUlezqXلزگیqUrootqXریشهqUekaqX اکاجوکqUakkqXآکدیqUdraqXزبان دراویدیqUjrbqXعربی یهودیqUsgnqXزبان نشانه‌ایqUsgaqXایرلندی باستانqUapaqXزبان آپاچیاییqUbraqXبراجqUchbqX چیبچاqUchgqXچاگاتاییqUchkrX چوکزیrUchmrXماریاییrUchnrXchnrUchorXچوکتوییrUchprXچیپه‌ویه‌ایr Uchrr Xچروکیاییr Uchyr X شایانیr UtirXتیگرینیاییrUvotrXوتیکrUmgrXمالاگاسیاییrUibarXآیبنrUmorXمولداویاییrUmnrX مغولیrUmirXمائوریاییrUmhrXمارشالیrUmkrX مقدونیrUmtr X مالتیr!Ucair"X3زبان سرخپوستی امریکای مرکزیr#Udelr$Xدلاواریr%Umsr&Xمالزیاییr'Umrr(X مراتیr)Utar*X تامیلیr+Umyr,Xبرمه‌ایr-Ucadr.X کادوییr/Utair0Xزبان تاییr1Uafhr2Xآفریهیلیr3Usitr4Xزبان چین و تبتیr5Uenmr6Xانگلیسی میانهr7Uen_AUr8Xانگلیسی استرالیاr9Unynr:Xنیانکوله‌ایr;Unyor<Xنیوروییr=Unymr>Xnymr?Usior@Xزبان سوییrAUmaprBXآسترونیزیاییrCUmasrDX ماساییrEUlahrFX لاهنداrGUladrHX لادینوrIUfyrJXفریزی غربیrKUsnkrLXسونینکه‌ایrMUfarNX فارسیrOUmadrPXمادوراییrQUmagrRXماگاهیاییrSUmairTXمایدیلیrUUfirVXفنلاندیrWUfjrXXفیجیاییrYUmanrZXماندینگوییr[Uegyr\Xمصری کهنr]Uzndr^Xزانده‌ایr_Ussr`XssraUsrrbXصربیrcUsqrdXآلبانیاییreUswrfX سواحلیrgUsvrhX سوئدیriUsurjXسونداییrkUstrlXسوتویی جنوبیrmUskrnXاسلواکیroUsirpXسینهالیrqUshrrXصرب و کرواتیrsUsortXسومالیاییruUsnrvX شوناییrwUsmrxXساموآییryUslrzXاسلووینیاییr{Uscr|Xساردینیاییr}Usar~XسنسکریتrUsgrXسانگوییrUserXسامی شمالیrUsdrXسندیrUzenrX زناگاrUkbdrXکاباردینیrUafarX%زبان افریقا و آسیاییrUcsbrX کاشوبیrUlgrXگانداییrUlbrXلوگزامبورگیrUfiurX!زبان فین و اوگراییrUlnrXلینگالاrUlorX لائوسیrUlirXلیمبورگیrUbynrXبلینrUltrXلیتوانیاییrUlurXلوبایی‐کاتانگاrUfilrXفیلیپینیrUyirXیدیrUnonrXنرس باستانrUcebrX سبوییrUyorXیوروباییrUnogrX نغاییrUbatrXزبان بالتیکیrUdakrXداکوتاییrUdarrX دارگواrUdayrX دایاکrUssarX!زبان نیلی و صحراییrUkperXکپله‌ایrUelrX یونانیrUeorXاسپرانتوrUenrXانگلیسیrUlamrX لامباrUeerX اوه‌ایrUmdfrX مکشاییrUfrrXفرانسویrUmdrrX ماندارrUetrXاستونیاییrUesrXاسپانیاییrUrurXروسیrUgonrX گوندیrUgohrX$آلمانی علیای باستانrUsmsrXسامی اسکالتrUsmnrXسامی ایناریrUsmjrXسامی لولrUde_ATrXآلمانی اتریشrUgotrX گاتیکrUrnrXروندیاییrUrorXرومانیاییrUdsbrXصُربی سفلیrUsmarXسامی جنوبیrUgorrXگورونتالوrUastrXastrUwalrX والاموrUcrhrXترکی کریمهrUathrXزبان آتاپاسکاییrUgezrX گی‌ئزیrUxhrX خوساییrUffrX فولاییrUkforXکوروrUmakrXماکاسارrUzaprXزاپوتکیrUkokrX کنکانیrUzxxrXzxxrUkosrXkosrUforX فاروییrUtogrXتونگایی نیاساrUhuprXهوپاrUudmrXاودمورتیrUbejrX بجاییr Ubemr X بمباییr Utsir Xتسیم‌شیانیr UberrX بربریrUnzirXنزیماییrUsairX3زبان سرخپوستی امریکای جنوبیrUangrXانگلیسی باستانrUprarXزبان پراکریتیrUbhorXبوجپوریrUsalrXزبان سالیشیrUprorXprorUrajrXراجستانیrUsadr Xسانداوه‌ایr!Uanpr"X آنگیکاr#Ues_419r$X,اسپانیایی امریکای لاتینr%Urapr&Xراپانوییr'Usasr(X ساساکr)Unqor*Xnqor+Ucarr,X کاریبیr-Uminr.Xمینانگ‌کابوییr/Umicr0Xمیکماکیr1Uefir2X افیکیr3Uarnr4Xآروکانیاییr5Uypkr6Xزبان یوپیکیr7Umisr8Xزبان متفرقهr9Ukacr:X کاچینیr;Ukabr<X قبایلیr=Ukaar>Xقره‌قالپاقیr?Ukajr@XجوrAUkamrBXکامباییrCUkarrDX کارنیrEUkawrFXکاویrGUfr_CHrHXفرانسوی سوئیسrIUtyvrJX توواییrKUfr_CArLXفرانسوی کاناداrMUkarNXگرجیrOUdoirPX دوگریrQUkgrRX کنگوییrSUkkrTX قزاقیrUUkjrVXکوانیاماrWUkirXXکیکویوییrYUkorZX کره‌ایr[Uknr\Xکاناده‌ایr]Ukmr^Xخمریr_Uklr`XگرینلندیraUksrbX کشمیریrcUkrrdXکانوریاییreUkwrfXکرنوالیrgUkvrhXکومیاییriUkurjXکردیrkUkyrlX قرقیزیrmUtklrnX توکلویroUbuarpXبوریاتیrqUmgarrXایرلندی میانهrsUhitrtXهیتیruUdyurvXدایولاییrwUderxX آلمانیryUdarzXدانمارکیr{Udzr|Xجونخاییr}Uluir~X لویسنوrUdvrXdvrUhilrXهیلی‌گاینونیrUhimrXهیماچالیrUgemrXزبان ژرمنیrUcrprXکریول یا پیجینrUqurX کچواییrUbasrX باساییrUgbarXگبایاییrUbadrXبانداییrUbanrXبالیاییrUbalrX بلوچیrUshnrXشانیrUbairXbairUarprXآراپاهوییrUartrXزبان ساختگیrUarwrXآراواکیrUarcrX آرامیrUen_USrXانگلیسی امریکاrUsemrXزبان سامیrUselrX سلکوپیrUnubrXزبان نوبیاییrUbtkrX باتاکیrUlusrXلوشه‌ایrUmusrX کریکیrUluarXلوبایی‐لولواrUirorXزبان ایروکواییrUirarXزبان ایرانیrUmunrXزبان مونداییrUlunrXلونداییrUluorX لوئوییrUwarX والونیrUtuprXزبان توپیاییrUjvrXجاوه‌ایrUzblrXzblrUtutrXزبان آلتاییکrUtumrXتومبوکاییrUjarX ژاپنیrUcoprXقبطیrUilorXایلوکوییrUlarX لاتینیrUgwirXگویچ اینrUundrX)زبان نامشخص یا نامعتبرrUtlirXتلین‌گیتیrUtlhrXکلینگونrUchrXچاموروییrUcorX کورسیrUcarXکاتالونیاییrUcerXچچنیrUponrXponrUcyrX ویلزیrUsahrX یاقوتیrUcsrXچکیrUcrrX کریاییrUbntrXبانتوییrUcvrX چوواشیrUcurXاسلاوی کلیساییrUlvrXلتونیاییrUdumrXهلندی میانهrUptrXپرتغالیrUduarXدوآلاییrUfrorXفرانسوی باستانrUyaprXیاپیrUfrmrXفرانسوی میانهrUtivrXتیویrUfrsrXفریزی شرقیrUfrrrXفریزی شمالیrUyaorX یائوییrUparX پنجابیrUxalrX قلموقیr Ues_ESr X!اسپانیایی اسپانیاr Upir Xپالیr Uen_GBrXنگلیسی بریتانیاrUgayrXگایوrUotorXزبان اتومیاییrUotarXترکی عثمانیrUhmnrX همونگrUmyvrXارزیاییrUgaarXگاییrUfurrXفریولیاییrUkhirXزبان خواسیrUainr Xآینوr!Urarr"Xراروتونگاییr#Uslar$Xزبان اسلاویr%Uver&X ونداییr'Uvir(Xویتنامیr)Uisr*Xایسلندیr+Ukhor,Xختنیr-Uiur.Xاینوکتیتوتr/Uitr0Xایتالیاییr1Uvor2X ولاپوکr3Uiir4Xیی سیچوانr5Uikr6Xاینوپیکr7Uior8Xایدوr9Uiner:X!زبان هند و اروپاییr;Uiar<Xمیان‌زبانr=Ujprr>Xفارسی یهودیr?Uier@Xبین زبانیrAUidrBXاندونزیاییrCUigrDXایگبوییrEUpaprFXپاپیامنتوrGUeworHX اواندوrIUpaurJXپالائوییrKUpaarLXزبان پاپواییrMUpagrNXپانگاسینانیrOUsatrPXسانتالیrQUpalrRX پهلویrSUpamrTXپامپانگاییrUUsycrVXسریانی کلاسیکrWUphirXXزبان فیلیپینیrYUcelrZXزبان سلتیr[Uphnr\X فنیقیr]Unicr^Xnicr_Uniar`XنیاسraUdgrrbX دوگریبrcUsyrrdX سریانیreUniurfX نیوییrgUgswrhXآلمانی سوئیسیriUcchrjXcchrkUjborlX لوجبانrmUnahrnXناواتلیroUsamrpXsamrqUhairrXهایداییrsUgmhrtX"آلمانی علیای میانهruUcusrvXزبان کوشیrwUwenrxXزبان صُربیryUadyrzXآدیجیاییr{Uelxr|X عیلامیr}Uadar~Xآدانگمه‌ایrUpt_PTrXپرتغالی پرتغالrUhawrXهاوائیاییrUbinrXبینیrUbikrX بیکولیrUpt_BRrXپرتغالی برزیلrUmosrXماسیاییrUmohrX موهاکیrUtlrXتاگالوگیrUzh_HansrXچینی ساده‌شدهrUzh_HantrXچینی سنتیrUtvlrXتووالوییrUijorX ایجوییrUkmbrXکیمبوندوییrUpeorXفارسی باستانrUumbrXامبندوییrUtmhrXتاماشقیrUfonrXفونیrUhsbrXصُربی علیاrUberXبلوروسیrUbgrX بلغاریrUbarXباشغیریrUpsrXپشتوrUbmrXبامباراییrUbnrX بنگالیrUborXتبتیrUbhrX بیهاریrUbirXبیسلاماrUbrrXبرتانیاییrUbsrXبوسنیاییrUruprXruprUzzarX زازاییrUomrXاوروموییrUojrXاوجیبواییrUacerXآچئیrUachrXآچولیاییrUocrXاوکیتاییrUkrurX کوروخیrUsrrrX سریریrUkrorX کروییrUkrlrXkrlrUkrcrX"قره‌چایی‐بالکاریrUndsrXآلمانی سفلیrUosrXآسیrUorrXاوریه‌ایrUsogrXسغدیrUnsorXسوتویی شمالیrUsonrXسونغاییrUde_CHrX"آلمانی علیای سوئیسrUvairX ویاییrUwakrXزبان واکاشیrUlolrXمونگوییrUmkhrXزبان مون‌خمریrUawarXawarUlozrXلوزیاییrUgilrXگیلبرتیrUwasrX واشوییrUwarrX واراییrUhzrXهریروییrUhyrX ارمنیrUanrXanrUsidrXسیداموییrUhrrX کرواتیrUhtrXهائیتیاییrUhurX مجاریrUhirXهندیrUhorXهیری موتوrUharXهوسیاییrUbugrXبوگیاییrUherXعبریr Uuzr X ازبکیr Uurr Xاردوr UplrXلهستانیrUukrXاوکراینیrUugrXاویغوریrUaarX آفاریrUabrX آبخازیrUaerXاوستاییrUafrXآفریکانسrUakrXآکانrUamrX امهریrUnl_BEr Xهلندی بلژیکr!Ueur"X باسکیr#Uasr$X آسامیr%Uarr&Xعربیr'Uinhr(Xاینگوشیr)Utpir*Xtpir+Umynr,Xزبان مایاییr-Uayr.Xآیماراییr/Ukhar0Xخازیاییr1Uazr2Xترکی آذربایجانیr3Uincr4Xزبان هندیکr5Unlr6X هلندیr7Unnr8Xنرس جدید نروژیr9Unor:X نروژیr;Unar<Xنائوروییr=Unbr>Xبوکسمال نروژیr?Unair@X3زبان سرخپوستی امریکای شمالیrAUndrBX#انده‌بله‌ای شمالیrCUnerDX نپالیrEUngrFXندونگاییrGUnyrHXنیانجاییrIUnaprJX ناپلیrKUgrbrLXگریبوییrMUgrcrNXیونانی کهنrOUnrrPX#انده‌بله‌ای جنوبیrQUtigrRXتیگره‌ایrSUnvrTXناواهوییrUUzunrVXزونیاییrWUrwrXXکینیاروانداییrYUcperZX9کریول یا پیجین مبتنی بر انگلیسیr[Ucpfr\X9کریول یا پیجین مبتنی بر فرانسویr]Ucppr^X9کریول یا پیجین مبتنی بر پرتغالیr_uU territoriesr`}ra(UBDrbXبنگلادشrcUBErdX بلژیکreUBFrfXبورکینافاسوrgUBGrhXبلغارستانriUVErjXونزوئلاrkUBArlXبوسنی و هرزگوینrmUBBrnXباربادوسroUWFrpXوالیس و فیوتوناrqUBLrrXسنت بارتلیمیrsUBMrtX برموداruUBNrvX برونئیrwUBOrxX بولیویryUBHrzX بحرینr{UBIr|Xبوروندیr}UBJr~XبنینrUBTrX بوتانrU011rXغرب افریقاrUBVrXجزیرهٔ بووتrUBWrXبوتسواناrU014rXشرق افریقاrU015rXشمال افریقاrUBRrX برزیلrU017rXمرکز افریقاrU018rXجنوب افریقاrU019rX امریکاrUBYrXبیلوروسیrUBZrXبلیزrULVrX لتونیrURWrX روانداrURSrXصربستانrUTLrXتیمور شرقیrURErXریونیونrUTMrXترکمنستانrUOMrXعمانrUTJrXتاجیکستانrUROrX رومانیrUTKrXتوکلائوrUGWrXگینهٔ بیسائوrUGUrXگوامrUGTrXگواتمالاrUGSrXAجورجیای جنوبی و جزایر ساندویچ جنوبیrUGRrX یونانrUGQrXگینهٔ استواییrUGPrXگوادلوپrUJPrXژاپنrUKIrXکیریباتیrUGYrX گویانrUGGrX گورنسیrUGFrXگویان فرانسهrUGErXگرجستانrUGDrXگراناداrU021rXشمال امریکاrUGBrXبریتانیاrUGArX گابونrUSVrXالسالوادورrUGNrXگینهrUGMrX گامبیاrUGLrXگروئنلندrU029rXکارائیبrUGIrXگیبرالتارrUGHrXغناrUJErXجرسیrUTNrXتونسrUJMrXجامائیکاrU013rXامریکای مرکزیrUWSrX سامواrU419rX+امریکای لاتین و کارائیبrUHRrX کرواسیrUBSrX باهاماrUHTrX هاییتیrUHUrXمجارستانrUHKrX=هنگ‌کنگ، ناحیهٔ ویژهٔ حکومتی چینrU039rXجنوب اروپاrUHNrXهندوراسrUFIrX فنلاندrU142rXآسیاrU030rXشرق آسیاrU034rXجنوب آسیاrU035rXجنوب شرقی آسیاrUPRrXپورتو ریکوrUPSrX فلسطینrUFKrXجزایر فالکلندrUIOrXCمستعمره‌های انگلستان در اقیانوس هندrUPWrX پالائوr UPTr X پرتغالr USJr X%اسوالبارد و جان ماینr UMDrXمولدوواrUFMrXمیکرونزیrUIQrXعراقrUPArX پاناماrUPFrXپلی‌نزی فرانسهrUPGrXپاپوا گینهٔ نوrUPErXپروrUPKrXپاکستانrUPHrXفیلیپینrUFOr Xجزایر فاروr!UPNr"Xپیتکایرنr#UPLr$X لهستانr%UPMr&Xسنت پیر و میکلونr'UZMr(X زامبیاr)UEHr*Xصحرای غربیr+URUr,X روسیهr-UEEr.X استونیr/UEGr0Xمصرr1UZAr2Xافریقای جنوبیr3UECr4X اکوادرr5UITr6Xایتالیاr7UVNr8X ویتنامr9UZZr:X-ناحیهٔ نامشخص یا نامعتبرr;USBr<Xجزایر سلیمانr=UETr>X اتیوپیr?USOr@X سومالیrAUZWrBXزیمبابوهrCUSArDXعربستان سعودیrEUESrFXاسپانیاrGUERrHX اریترهrIUMErJXمونته‌نگروrKUAQrLXجنوبگانrMUMGrNXماداگاسکارrOUMFrPXسنت مارتینrQUMArRX مراکشrSUMCrTX موناکوrUUUZrVXازبکستانrWUMMrXXمیانمارrYUMLrZXمالیr[UMOr\X:ماکائو، ناحیهٔ ویژهٔ حکومتی چینr]UMNr^Xمغولستانr_UHMr`X5جزیرهٔ هرد و جزایر مک‌دونالدraUASrbXساموای امریکاrcUMKrdXمقدونیهreUMUrfXموریتیوسrgUMTrhXمالتriUMWrjX مالاویrkUMVrlX مالدیوrmUMQrnXمارتینیکroUMPrpX&جزایر ماریانای شمالیrqUMSrrXمونت‌سراتrsUMRrtXموریتانیruUIMrvXIMrwUUGrxXاوگانداryUTZrzXتانزانیاr{UMYr|X مالزیr}UMXr~X مکزیکrUILrXاسرائیلrUFRrX فرانسهrUAWrX آروباrUDOrXجمهوری دومینیکنrUSHrX سنت هلنrUVCrX%سنت وینسنت و گرنادینrU054rX ملانزیrUDJrX جیبوتیrUFJrXفیجیrU057rXناحیهٔ میکرونزیrU172rX5کشورهای مستقل مشترک‌المنافعrU053rX#استرالیا و زلاند نوrUNIrXنیکاراگوئهrUNLrXهلندrUNOrXنروژrUNArXنامیبیاrUVUrXوانواتوrUNCrXکالدونیای جدیدrUNErXنیجرrUNFrXجزیرهٔ نورفولکrUNGrX نیجریهrUNZrXزلاند نوrUNPrXنپالrUNRrX نائوروrUNUrX نیوئهrU061rXپلی‌نزیrUCIrXساحل عاجrUCHrX سوئیسrUCOrX کلمبیاrUCNrXچینrUCMrX کامرونrUCLrXشیلیrUCCrXجزایر کوکوسrUCArX کاناداrUCGrXکنگو برازویلrUCFrX&جمهوری افریقای مرکزیrUCDrXکنگو کینشاساrUCZrXجمهوری چکrUCYrXقبرسrUCXrXجزیرهٔ کریسمسrUCSrX'صربستان و مونته‌نگروrUCRrXکاستاریکاrUPYrXپاراگوئهrUCVrX کیپ وردrUCUrXکوباrUSZrXسوازیلندrUSYrX سوریهrUKGrXقرقیزستانrUKErXکنیاrUSRrXسورینامrU143rXآسیای مرکزیrUKHrX کامبوجrUKNrXسنت کیتس و نویسrUKMrX کوموروrUSTrX%سائو تومه و پرینسیپهrUSKrXاسلواکیrUKRrXکرهٔ جنوبیrUSIrXاسلوونیrUKPrXکرهٔ شمالیrUKWrXکویتrUSNrX سنگالrUSMrXسان مارینوrUSLrXسیرالئونrUSCrXسیشلrUKZrXقزاقستانrUKYrXجزایر کِیمنrUSGrXسنگاپورrUSErXسوئدrUSDrX سودانr U151r Xشرق اروپاr U150r X اروپاr UDMrXدومینیکrU155rXغرب اروپاrU154rXشمال اروپاrUVGrX(جزایر ویرجین بریتانیاrUDErX آلمانrUYErXیمنrUMHrXجزایر مارشالrU062rX*جنوب آسیا و آسیای میانهrUDZrXالجزایرrUUSr X&ایالات متحدهٔ امریکاr!UUYr"Xاوروگوئهr#UYTr$X مایوتr%UUMr&X@جزایر کوچک دورافتادهٔ ایالات متحدهr'ULBr(X لبنانr)ULCr*Xسنت لوسیاr+ULAr,X لائوسr-UTVr.X تووالوr/UTWr0X تایوانr1UTTr2X ترینیداد و توباگوr3UTRr4X ترکیهr5ULKr6Xسری‌لانکاr7ULIr8Xلیختن‌اشتاینr9UCKr:Xجزایر کوکr;UTOr<X تونگاr=ULTr>Xلیتوانیr?ULUr@XلوکزامبورگrAULRrBX لیبریاrCULSrDX لسوتوrEUTHrFX تایلندrGUTFrHX/مستعمره‌های جنوبی فرانسهrIUTGrJXتوگوrKUTDrLXچادrMUTCrNX!جزایر ترک و کایکوسrOULYrPXلیبیrQUVArRXواتیکانrSU145rTXغرب آسیاrUUAErVX"امارات متحدهٔ عربیrWUADrXX آندوراrYUAGrZX آنتیگوا و باربوداr[UAFr\Xافغانستانr]UAIr^X آنگیلr_UVIr`X/جزایر ویرجین ایالات متحدهraUISrbX ایسلندrcUIRrdX ایرانreUAMrfXارمنستانrgUALrhX آلبانیriUAOrjX آنگولاrkUANrlXآنتیل هلندrmU003rnXامریکای شمالیroU002rpX افریقاrqU001rrXجهانrsUARrtXآرژانتینruUAUrvXاسترالیاrwUATrxX اتریشryU005rzXامریکای جنوبیr{UINr|Xهندr}UAXr~Xجزایر آلاندrU009rXاقیانوسیهrUAZrXجمهوری آذربایجانrUIErX ایرلندrUIDrXاندونزیrUJOrXاردنrUQUrXاتحادیهٔ اروپاrUUArXاوکراینrUQArXقطرrUDKrXدانمارکrUMZrXموزامبیکrUQOrX!اقیانوسیهٔ دوردستruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5X'‬'rrh7KKrh9X #,##0.###rh;h5X'‪'-rrh>Nh?KKrubsU date_formatsr}r(UmediumrhW)r}r(h9Xyyyy/M/drh[X%(yyyy)s/%(M)s/%(d)srubUfullrhW)r}r(h9XEEEE d MMMM yyyy GGGGrh[X)%(EEEE)s %(d)s %(MMMM)s %(yyyy)s %(GGGG)srubUlongrhW)r}r(h9X d MMMM yyyyrh[X%(d)s %(MMMM)s %(yyyy)srubUshortrhW)r}r(h9Xyy/M/drh[X%(yy)s/%(M)s/%(d)srubuUcurrency_symbolsr}rUIRRrX﷼rsU time_zonesr}r(UAtlantic/Canaryr}rUcityrX قناریrsUAntarctica/Mawsonr}rjX ماوسونrsUAmerica/Buenos_Airesr}rjXبوئنوس‌آیرسrsUAustralia/Melbourner}rjX ملبورنrsU Pacific/Waker}rjXویکrsUAmerica/Nipigonr}rjXنیپیگانrsUAmerica/Louisviller}rjXلوئیزویلrsUAmerica/Indiana/Tell_Cityr}rjX"تل‌سیتی، ایندیاناrsUAustralia/Darwinr}rjX داروینrsUIndian/Reunionr}rjXریونیونrsUAmerica/Whitehorser}rjXوایت‌هورسrsUAntarctica/Davisr}rjX دیویسrsUAmerica/Coral_Harbourr}rjXکورال هاربرrsUAmerica/Swift_Currentr}rjXسوئیفت کورنتrsU Europe/Samarar}rjX ساماراrsUAsia/Singaporer}rjXسنگاپورrsUAmerica/Montserratr}rjXمنتسراتrsU Asia/Tashkentr}rjX تاشکندrsUEurope/Simferopolr}rjXسیمفروپلrsUAmerica/Maceior}rjX ماسیوrsU Asia/Magadanr}rjX مگادنrsUAfrica/Djiboutir}rjXدجیبوتیrsU Asia/Kashgarr}rjX کاشغرrsUAmerica/Detroitr}rjX دترویتrsU Asia/Kuchingr}rjX کوچینگr sU Asia/Urumqir }r jX ارومچیr sUAmerica/Grenadar }rjXگریناداrsUAmerica/Indiana/Knoxr}rjXناکسrsUAmerica/El_Salvadorr}rjXال سالوادرrsUAmerica/Indiana/Petersburgr}rjXپترزبرگrsU Europe/Madridr}rjX مادریدrsUPacific/Kiritimatir}rjXکریتیماتیrsUAmerica/Santiagor}r jXسانتیاگوr!sUAsia/Pontianakr"}r#jXپونتیاناکr$sUEurope/Kaliningradr%}r&jXکالینینگرادr'sUAmerica/Mazatlanr(}r)jXماساتلانr*sUAsia/Ulaanbaatarr+}r,jXاولان باتارr-sUAmerica/Rainy_Riverr.}r/jXرینی‌ریورr0sUAmerica/Argentina/San_Luisr1}r2jXسن لوئیسr3sUIndian/Maldivesr4}r5jX مالدیوr6sUAntarctica/Rotherar7}r8jX روتراr9sU Pacific/Fijir:}r;jXفیجیr<sU America/Arubar=}r>jX آروباr?sUAustralia/Adelaider@}rAjX آدلایدrBsUAmerica/IndianapolisrC}rDjXایندیاناپولیسrEsUAmerica/ReginarF}rGjX رجایناrHsU Pacific/TrukrI}rJjXتراکrKsUAmerica/Cambridge_BayrL}rMjXخلیج کمبریجrNsU America/BoiserO}rPjX بویسیrQsUAmerica/Mexico_CityrR}rSjXمکزیکوسیتیrTsUAmerica/Puerto_RicorU}rVjXپورتو ریکوrWsUPacific/ChathamrX}rYjX چاتامrZsUIndian/Mauritiusr[}r\jXماوریتیوسr]sU America/Jujuyr^}r_jX خوخوئیr`sUAmerica/Cordobara}rbjXکوردوواrcsUAmerica/Guatemalard}rejXگواتمالاrfsU America/Belemrg}rhjXبلمrisU Asia/Harbinrj}rkjX هاربینrlsUAustralia/Lord_Howerm}rnjX لردهاوrosUAmerica/Argentina/San_Juanrp}rqjX سن خوانrrsUPacific/Kosraers}rtjX کوسارهrusUAmerica/North_Dakota/New_Salemrv}rwjX-سالم جدید، داکوتای شمالیrxsUAmerica/Monterreyry}rzjXمونترئیr{sUAsia/Krasnoyarskr|}r}jXکراسنویارسکr~sUAmerica/Boa_Vistar}rjXبوئاویشتاrsUAsia/Yekaterinburgr}rjXیکاترینبرگrsUEurope/Andorrar}rjX آندوراrsUAtlantic/Bermudar}rjX برموداrsUAustralia/Currier}rjXکوریrsUAntarctica/Caseyr}rjXکیسیrsUPacific/Honolulur}rjXهونولولوrsUPacific/Enderburyr}rjXاندربریrsU America/Thuler}rjXتولrsUAmerica/St_Johnsr}rjX سنت جانrsUAmerica/Monctonr}rjXمانکتونrsUAmerica/Jamaicar}rjXجامایکاrsUPacific/Majuror}rjX ماجوروrsU America/Adakr}rjXایدکrsUAtlantic/Cape_Verder}rjX کیپ وردrsUAsia/Hong_Kongr}rjXهونگ کنگrsU Asia/Macaur}rjXمکاوrsUAsia/Choibalsanr}rjXچیو بال سانrsUAmerica/Guadelouper}rjXگوادلوپrsUAmerica/Blanc-Sablonr}rjXبلنک-سابلنrsU Europe/Kievr}rjXکیفrsUAntarctica/Syowar}rjX سی وواrsUAmerica/Halifaxr}rjX هلیفکسrsUAntarctica/McMurdor}rjXمک موردوrsU Asia/Hovdr}rjXهودrsUAmerica/Danmarkshavnr}rjXدانمارک شاونrsUAmerica/Thunder_Bayr}rjXثاندر بیrsUAmerica/Scoresbysundr}rjXاسکورسبیساندrsUAmerica/Eiruneper}rjXایرونپهrsUAmerica/Manausr}rjX ماناوسrsUAmerica/Los_Angelesr}rjXلوس‌آنجلسrsUAmerica/Noronhar}rjXنورونیاrsUAmerica/Goose_Bayr}rjXخلیج گوسrsU Asia/Kabulr}rjXکابلrsUAmerica/Catamarcar}rjXکاتامارکاrsUAmerica/Chihuahuar}rjXچیئوائواrsUAmerica/Argentina/Rio_Gallegosr}rjXریو گالگوسrsUPacific/Gambierr}rjX گامبیرrsUAmerica/Vancouverr}rjX ونکوورrsUEurope/Volgogradr}rjXولگاگرادrsUEurope/Uzhgorodr}rjXاوژگورودrsUPacific/Ponaper}rjX پناپهrsU Asia/Aqtaur}rjXآکتاrsU Asia/Tehranr}rjX تهرانrsUAmerica/Guyanar}rjX گویاناrsUAmerica/Sao_Paulor}rjXسائوپائولوrsUAmerica/Belizer }r jXبلیزr sUAmerica/Edmontonr }r jXادمونتونrsUPacific/Pitcairnr}rjXپیتکیرنrsUAustralia/Perthr}rjXپرتrsUAmerica/Mendozar}rjX مندوساrsUAmerica/Meridar}rjX مریداrsUPacific/Easterr}rjX ایسترrsU Asia/Jakartar}rjXجاکارتاr sUAntarctica/Palmerr!}r"jX پالمرr#sUAustralia/Sydneyr$}r%jX سیدنیr&sUAmerica/Godthabr'}r(jX گودهوبr)sUAtlantic/Madeirar*}r+jX مادریاr,sU Asia/Oralr-}r.jX اورالr/sUAmerica/Campo_Grander0}r1jXکمپو گراندهr2sUAmerica/Dawson_Creekr3}r4jXداوسن کریکr5sUAfrica/Kinshasar6}r7jXکینشاساr8sUAntarctica/Vostokr9}r:jX ووستوکr;sU Pacific/Niuer<}r=jXنیوهr>sU Europe/Maltar?}r@jX مالتاrAsUAustralia/LindemanrB}rCjX لیندمنrDsUAmerica/Porto_VelhorE}rFjXپورتوولیوrGsUAmerica/Argentina/UshuaiarH}rIjXاوشوایاrJsUPacific/GalapagosrK}rLjXگالاپاگوسrMsU Europe/MonacorN}rOjX موناکوrPsUAmerica/Indiana/MarengorQ}rRjX مارنگوrSsU Africa/CeutarT}rUjX سئوتاrVsUAmerica/DenverrW}rXjXدنورrYsUAmerica/WinnipegrZ}r[jX وینیپگr\sUAmerica/Dawsonr]}r^jX داوسنr_sUAustralia/Brisbaner`}rajXبریسبینrbsU Asia/Aqtoberc}rdjX آکتوبهresUAmerica/Reciferf}rgjX ریسایفrhsU Asia/Sakhalinri}rjjXساخالینrksUPacific/Kwajaleinrl}rmjXکواجالینrnsUAmerica/Fortalezaro}rpjXفورتالزاrqsUAustralia/Broken_Hillrr}rsjXبروکن هیلrtsUAmerica/Phoenixru}rvjX فینکسrwsUAmerica/Cuiabarx}ryjX کویاواrzsU Europe/Moscowr{}r|jXمسکوr}sUPacific/Tarawar~}rjX تاراواrsUAmerica/Yellowknifer}rjXیلونایفrsUAmerica/Rio_Brancor}rjXریو برانکوrsUAmerica/Cancunr}rjX کانکونrsUAsia/Vladivostokr}rjXولادی‌وستوکrsUPacific/Johnstonr}rjXجانستونrsUAmerica/Dominicar}rjXدمونیکاrsU Asia/Kuwaitr}rjXکویتrsU Europe/Lisbonr}rjX لیسبونrsU Pacific/Guamr}rjXگوامrsU Asia/Makassarr}rjXماکاسارrsUAsia/Qyzylordar}rjXکویزیلورداrsUAmerica/Argentina/Tucumanr}rjX توکومنrsUAtlantic/Azoresr}rjX آزورسrsUAsia/Chongqingr}rjXچونگ کینگrsUAustralia/Euclar}rjX اوکلاrsUAmerica/Chicagor}rjX شیکاگوrsU Asia/Shanghair}rjXشانگهایrsUAmerica/Rankin_Inletr}rjXخلیجک رنکینrsUAmerica/Iqaluitr}rjXایکلوئتrsU Asia/Irkutskr}rjXایرکوتسکrsUAmerica/Panamar}rjX پاناماrsU Pacific/Palaur}rjX پالاوrsUAmerica/Guayaquilr}rjXگوایاکیلrsUAsia/Samarkandr}rjX سمرقندrsU Asia/Bahrainr}rjX بحرینrsUAmerica/Menomineer}rjXمنامینیrsUAmerica/Costa_Ricar}rjXکستا ریکاrsUAsia/Kamchatkar}rjXکامچاتکاrsUAmerica/Glace_Bayr}rjX گلیس بیrsU Asia/Jayapurar}rjXجیاپوراrsUIndian/Mayotter}rjX مایوتهrsUAmerica/Hermosillor}rjXارموسیوrsUAmerica/Anguillar}rjXآنگویلاrsU Asia/Qatarr}rjXقطرrsUAmerica/North_Dakota/Centerr}rjX$سنتر، داکوتای شمالیrsUAmerica/Pangnirtungr}rjXپانگنیرتونگrsUAmerica/Resoluter}rjX رسولوتrsUEurope/Zaporozhyer}rjXزاپوروژیrsUAmerica/Indiana/Vevayr}rjXویویrsU Asia/Yakutskr}rjXیاکوتسکrsUAmerica/Shiprockr}rjX شیپراکrsUAmerica/Barbadosr}rjXباربادسrsUAmerica/Tijuanar}r jXتی جواناr sUEurope/Luxembourgr }r jXلاکسمبورگr sUAmerica/Martiniquer }r jXمارتینیکوr sUAntarctica/DumontDUrviller }r jXدومونت د اورویلr sUAmerica/Indiana/Vincennesr }r jXوینسنس ایندیاناr sU Asia/Almatyr }r jX آلماتیr sUPacific/Midwayr }r jX میدویr sUAmerica/Argentina/La_Riojar }r jXلاریوجاr sUPacific/Tahitir }r jX تاهیتیr sUAsia/Novosibirskr }r jXنووسیبیریسکr sUAmerica/Indiana/Winamacr }r jXویناماک ایندیاناr sUAfrica/Lubumbashir }r! jXلوبومباشیr" sUPacific/Marquesasr# }r$ jX مارکوسr% sU Asia/Anadyrr& }r' jX آنادیرr( sUAmerica/New_Yorkr) }r* jXنیویورکr+ sU America/Nomer, }r- jXنومr. sUAmerica/Yakutatr/ }r0 jXیاکوتاتr1 sUAustralia/Hobartr2 }r3 jX هوبارتr4 sUAmerica/Juneaur5 }r6 jXجونوr7 sUAmerica/Inuvikr8 }r9 jXاینوویکr: sUAmerica/Kentucky/Monticellor; }r< jXمانتیسلوr= sUAmerica/Araguainar> }r? jXآراگوایناr@ sUEurope/GibraltarrA }rB jXجبل الطارقrC sUAmerica/MontrealrD }rE jXمونرئالrF sUAmerica/TorontorG }rH jX تورنتوrI sU Etc/UnknownrJ }rK jX نامشخصrL sU Pacific/NaururM }rN jX ناوروrO sU America/BahiarP }rQ jX باهیاrR sUAmerica/AnchoragerS }rT jX انکریجrU sU Asia/OmskrV }rW jX اومسکrX sUAntarctica/South_PolerY }rZ jXقطب جنوبr[ suUscriptsr\ }r] (UGurur^ Xگورموخیr_ UHebrr` Xعبریra UZzzzrb X%خط نامشخص یا نامعتبرrc UPhnxrd X فنیقیre UMoonrf Xمونیrg USamrrh Xساماراتیri UChamrj Xچمیrk UArabrl Xعربیrm UGujrrn X گجراتیro UZxxxrp Xنوشته‌نشدهrq ULycirr X لسیاییrs USinhrt Xسینهالیru UTalurv XTalurw UMongrx X مغولیry UXpeorz Xفارسی باستانr{ UVispr| X گفتار قابل مشاهدهr} URjngr~ X رجنگیr UOlckr XOlckr UTaler XTaler UMandr Xمنده‌ایr UManir X مانویr UMlymr Xمالایالامیr UTibtr Xتبتیr UKalir X کایالیr UJpanr X ژاپنیr UPlrdr XPlrdr UKanar Xکاتاکاناr ULydir X لدیاییr ULepcr XLepcr USundr XSundr UYiiir Xییr UJavar Xجاوه‌ایr UOryar Xاوریه‌ایr ULaoor X لائوسیr UCyrlr X سیریلیr UVaiir X ویاییr UArmnr X ارمنیr UCyrsr XCyrsr UKhmrr Xخمریr UArmir Xآرمیr USylor Xسیلوتی نگاریr UItalr XItalr USgnwr XSgnwr UXsuxr Xمیخی سومری‐آکدیr UThaar X ثاناییr UThair Xتایلندیr UCprtr XCprtr ULinbr X خطی بr ULinar X خطی الفr UOsmar XOsmar USaurr Xسوراشتراییr UHirar Xهیراگاناr UHanir Xهانr UEgydr XEgydr UQaair X موروثیr UEgyhr Xکاهنی مصریr UCansr XCansr UEgypr Xهیروگلیف مصریr UTfngr XTfngr UShawr Xشاویr UCirtr XCirtr UGeorr Xگرجیr UTengr X تنگوارr UHrktr X&کاتاکانا یا هیراگاناr UGeokr Xگرجی خوتسوریr UOgamr X اوگامیr UDsrtr X دیسرتیr UGothr X گوتیکr UHanor Xهانونوییr UBalir Xبالیاییr UKorer X کره‌ایr UHangr X هانگولr UCarir Xکاریr UAvstr Xاوستاییr UTagbr Xتگبنواییr UHansr Xهان ساده‌شدهr UHantr Xهان سنتیr URoror XRoror UDevar Xدوناگریr UIndsr X ایندوسr UBopor Xبوپوموفوr UMymrr Xمیانمارr UTglgr Xتاگالوگیr UPermr XPermr UBugir Xبوگیاییr UBrair Xبریلr UBrahr X براهمیr UBatkr X باتاکیr UMeror Xمروییتیr ULimbr Xلیمباییr UMteir Xمایک میتیr UPhlir XPhlir UTelur Xتلوگوییr UTamlr X تامیلیr USarar X ساراتیr ULatgr Xلاتینی گیلیr ULatfr XLatfr UKharr XKharr! UNkoor" XNkoor# UPhlvr$ Xپهلوی کتابیr% ULatnr& X لاتینیr' UMayar( Xهیروگلیف مایاییr) ULanar* X لاناییr+ UEthir, Xاتیوپیاییr- UKthir. Xکثیr/ UHmngr0 XHmngr1 UBuhdr2 X بوهیدr3 UCoptr4 Xقبطیr5 UPrtir6 Xپرتیr7 UGlagr8 Xگلاگولیتیکr9 URunrr: Xرونیr; UOrkhr< Xاورخونیr= UCakmr> Xکاکمr? UHungr@ Xمجاری باستانrA UGrekrB X یونانیrC UCherrD XچروکیاییrE UZyyyrF X مشترکrG USyrcrH X سریانیrI UBlisrJ Xنمادهای بلیسrK UBengrL X بنگالیrM USyrerN XSyrerO USyrjrP Xسریانی غربیrQ USyrnrR Xسریانی شرقیrS UKndarT Xکاناده‌ایrU uUvariantsrV }rW (U1996rX X4رسم‌الخط آلمانی ۱۹۹۶ میلادیrY UREVISEDrZ X(رسم‌الخط تجدیدنظرشدهr[ USCOTLANDr\ X*انگلیسی معیار اسکاتلندr] UAREVELAr^ Xارمنی شرقیr_ UPOSIXr` Xکامپیوتریra U1901rb X'رسم‌الخط سنتی آلمانیrc uUnumber_symbolsrd }re (Ugrouprf X٬rg UnativeZeroDigitrh X۰ri U exponentialrj X×۱۰^rk Udecimalrl X٫rm U percentSignrn X٪ro Ulistrp X؛rq UplusSignrr X+rs Uinfinityrt X∞ru U minusSignrv X−rw uUcurrency_namesrx }ry (UDZDrz Xدینار الجزایرr{ UNADr| Xدلار نامیبیاr} UKMFr~ Xفرانک کوموروr UBOPr Xپزوی بولیویr UZWDr Xدلار زیمبابوهr UDKKr Xکرون دانمارکr UTZSr Xشیلینگ تانزانیاr UYDDr Xدینار یمنr UQARr Xریال قطرr UKYDr Xدلار جزایر کِیمنr ULYDr Xدینار لیبیr UJODr Xدینار اردنr USARr Xریال سعودیr UXAGr Xنقرهr UHKDr Xدلار هنگ‌کنگr USRGr Xگیلدر سورینامr UCHFr Xفرانک سوئیسr UBYRr Xروبل بیلوروسیr UALLr Xلک آلبانیr UXPDr Xپالادیمr UDJFr Xفرانک جیبوتیr UHRDr Xدینار کرواسیr UTHBr Xبات تایلندr UBNDr Xدلار برونئیr USYPr Xلیرهٔ سوریهr UMADr Xدرهم مراکشr UFRFr Xفرانک فرانسهr UMAFr Xفرانک مراکشr UPHPr Xپزوی فیلیپینr UZARr X"راند افریقای جنوبیr URHDr Xدلار رودزیاr UNPRr Xروپیهٔ نپالr UBEFr Xفرانک بلژیکr UAEDr X+درهم امارات متحدهٔ عربیr UGBPr Xپوند بریتانیاr ULKRr X روپیهٔ سری‌لانکاr UPKRr Xروپیهٔ پاکستانr UHUFr Xفورینت مجارستانr UBMDr Xدلار برموداr UAMDr Xدرم ارمنستانr UUGXr Xشیلینگ اوگانداr USURr Xروبل شورویr UNLGr Xگیلدر هلندr UUGSr X$شیلینگ قدیم اوگانداr jXریال ایرانr UJMDr Xدلار جامائیکاr UTTDr X)دلار ترینیداد و توباگوr UAFNr X افغانیr UTRLr Xلیرهٔ قدیم ترکیهr UCSDr X"دینار قدیم صربستانr UAFAr Xافغانی قدیمr UTRYr Xلیرهٔ ترکیهr UGRDr Xدراخمای یونانr UATSr Xشیلینگ اتریشr UYERr Xریال یمنr UMGFr Xفرانک ماداگاسکارr URWFr Xفرانک روانداr UNOKr Xکرون نروژr UINRr Xروپیهٔ هندr UMXNr Xپزوی مکزیکr UTJSr Xسامانی تاجیکستانr UTJRr Xروبل تاجیکستانr UCOPr Xپزوی کلمبیاr UIDRr Xروپیهٔ اندونزیr UFJDr Xدلار فیجیr UBZDr Xدلار بلیزr UGWPr X پزوی گینهٔ بیسائوr ULUFr Xفرانک لوکزامبورگr UDOPr Xپزوی دومینیکاr UTMMr Xمنات ترکمنستانr UTWDr Xدلار جدید تایوانr UXFOr X فرانک طلای فرانسهr UXPTr X پلاتینr UBSDr Xدلار باهاماr USEKr Xکرون سوئدr UAUDr Xدلار استرالیاr USRDr Xدلار سورینامr UCUPr Xپزوی کوباr UIEPr Xپوند ایرلندr UBBDr Xدلار باربادوسr UCLPr Xپزوی شیلیr UEURr Xیوروr UITLr Xلیرهٔ ایتالیاr UXCDr Xدلار شرق کارائیبr URUBr! Xروبل روسیهr" UOMRr# Xریال عمانr$ UBRLr% Xرئال برزیلr& USBDr' X دلار جزایر سلیمانr( URURr) Xروبل قدیم روسیهr* UPLNr+ Xزواتی لهستانr, UKESr- Xشیلینگ کنیاr. UDEMr/ Xمارک آلمانr0 UUSDr1 Xدلار امریکاr2 UAZMr3 X1منات قدیم جمهوری آذربایجانr4 UAZNr5 X(منات جمهوری آذربایجانr6 UBADr7 X'دینار بوسنی و هرزگوینr8 UGNFr9 Xفرانک گینهr: UIQDr; Xدینار عراقr< UCADr= Xدلار کاناداr> USDDr? Xدینار قدیم سودانr@ UGYDrA Xدلار گویانrB UKWDrC Xدینار کویتrD UBIFrE Xفرانک بوروندیrF UXXXrG X'ارز نامشخص یا نامعتبرrH USGDrI Xدلار سنگاپورrJ UUZSrK Xسوم ازبکستانrL UMLFrM Xفرانک مالیrN ULVRrO Xروبل لتونیrP UMTPrQ Xپوند مالتrR UCNYrS Xیوآن چینrT UTNDrU Xدینار تونسrV ULRDrW Xدلار لیبریاrX UMTLrY Xلیرهٔ مالتrZ UNZDr[ Xدلار زلاند نوr\ UARPr] X5پزوی آرژانتین (۱۹۸۳ تا ۱۹۸۵)‏r^ UARSr_ Xپزوی آرژانتینr` URSDra Xدینار صربستانrb UBHDrc Xدینار بحرینrd UJPYre X ین ژاپنrf UXAUrg Xطلاrh uUmonthsri }rj (U stand-alonerk }rl (Uwiderm }rn (KX ژانویهro KX فوریهrp KXمارسrq KX آوریلrr KXمهrs KXژوئنrt KX ژوئیهru KXاوتrv K Xسپتامبرrw K X اکتبرrx K X نوامبرry K X دسامبرrz uU abbreviatedr{ cbabel.localedata Alias r| )r} }r~ Ukeysr ji jk Uwider r sbUnarrowr }r (KXژr KXفr KXمr KXآr KXمr KXژr KXژr KXاr K Xسr K Xاr K Xنr K Xدr uuUformatr }r (Uwider }r (KXژانویهٔr KX فوریهٔr KXمارسr KX آوریلr KXمهٔr KXژوئنr KX ژوئیهٔr KXاوتr K Xسپتامبرr K X اکتبرr K X نوامبرr K X دسامبرr uU abbreviatedr }r (KXژانویهٔr KX فوریهٔr KXمارسr KX آوریلr KXمهٔr KXژوئنr KX ژوئیهٔr KXاوتr K Xسپتامبرr K X اکتبرr K X نوامبرr K X دسامبرr uuuUcurrency_formatsr }r Nh,)r }r (h/Nh1Kh2KKr h4X ¤r X '‬' ¤r r h7KKr h9X #,##0.00 ¤r h;h5X'‪'-r r h>Nh?KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KXدr KXسr KXچr KXپr KXجr KXشr KXیr usUformatr }r (Uwider }r (KX دوشنبهr KXسه‌شنبهr KXچهارشنبهr KXپنجشنبهr KXجمعهr KXشنبهr KX یکشنبهr uU abbreviatedr }r (KX دوشنبهr KXسه‌شنبهr KXچهارشنبهr KXپنجشنبهr KXجمعهr KXشنبهr KX یکشنبهr uuuU meta_zonesr }r (U Turkmenistanr }r (Ucommonr Ulongr }r (Udaylightr X*وقت تابستانی ترکمنستانr Ustandardr Xوقت ترکمنستانr uuU Kuybyshevr }r j sUArabianr }r (j j }r (Ugenericr Xوقت عربستانr j X&وقت تابستانی عربستانr j Xوقت عادی عربستانr uuUAustralia_Easternr }r (j j }r (j Xوقت شرق استرالیاr j X/وقت تابستانی شرق استرالیاr j X'وقت عادی شرق استرالیاr uuU Argentinar }r (j j }r (j X(وقت تابستانی آرژانتینr j Xوقت آرژانتینr uuUBoliviar }r (j j }r j Xوقت بولیویr suU Alaska_Hawaiir }r (j j }r (j X"وقت آلاسکا‐هاوائیr j X3وقت تابستانی آلاسکا‐هاوائیr j X+وقت عادی آلاسکا‐هاوائیr uuU Cape_Verder }r (j j }r (j X%وقت تابستانی کیپ وردr j Xوقت کیپ وردr uuUEurope_Centralr }r (j j }r (j X+وقت تابستانی مرکز اروپاr j Xوقت مرکز اروپاr uuUBeringr }r (j j }r (j Xوقت برینگr j X"وقت تابستانی برینگr j Xوقت عادی برینگr uuU Dutch_Guianar }r (j j }r j Xوقت گویان هلندr suUYerevanr }r (j j }r (j X$وقت تابستانی ایروانr j Xوقت ایروانr uuUKashgarr }r (j j }r j Xوقت کاشغرr! suUMaldivesr" }r# (j j }r$ j Xوقت مالدیوr% suU East_Timorr& }r' (j j }r( j Xوقت تیمور شرقیr) suUAfrica_Easternr* }r+ (j j }r, j Xوقت شرق افریقاr- suU Ashkhabadr. }r/ (j j }r0 (j X)وقت تابستانی عشق‌آبادr1 j Xوقت عشق‌آبادr2 uuUAlaskar3 }r4 (j j }r5 (j Xوقت آلاسکاr6 j X$وقت تابستانی آلاسکاr7 j Xوقت عادی آلاسکاr8 uuUAmerica_Easternr9 }r: (j j }r; (j Xوقت شرق امریکاr< j X+وقت تابستانی شرق امریکاr= j X#وقت عادی شرق امریکاr> uuUSolomonr? }r@ (j j }rA j Xوقت جزایر سلیمانrB suUAmerica_CentralrC }rD (j j }rE (j Xوقت مرکز امریکاrF j X-وقت تابستانی مرکز امریکاrG j X%وقت عادی مرکز امریکاrH uuUPakistanrI }rJ (j j }rK (j X&وقت تابستانی پاکستانrL j Xوقت پاکستانrM uuUSamoarN }rO (j j }rP j Xوقت عادی سامواrQ suUMacaurR }rS (j j }rT (j X$وقت تابستانی ماکائوrU j Xوقت ماکائوrV uuUGuamrW }rX (j j }rY j Xوقت عادی گوامrZ suUIndiar[ }r\ (j j }r] j Xوقت عادی هندr^ suU Azerbaijanr_ }r` (j j }ra (j X7وقت تابستانی جمهوری آذربایجانrb j X&وقت جمهوری آذربایجانrc uuU Tajikistanrd }re (j j }rf j Xوقت تاجیکستانrg suUTurkeyrh }ri (j j }rj (j X"وقت تابستانی ترکیهrk j Xوقت ترکیهrl uuU Afghanistanrm }rn (j j }ro (j Xوقت افغانستانrp j X*وقت تابستانی افغانستانrq j Xوقت افغانستانrr uuU Indochinars }rt (j j }ru j Xوقت هندوچینrv suU Bangladeshrw }rx (j j }ry j Xوقت بنگلادشrz suU Samarkandr{ }r| (j j }r} (j X$وقت تابستانی سمرقندr~ j Xوقت سمرقندr uuUWaker }r (j j }r j Xوقت جزیرهٔ ویکr suUPerur }r (j j }r (j Xوقت تابستانی پروr j X وقت پروr uuUVanuatur }r (j j }r (j X$وقت تابستانی واناتوr j Xوقت واناتوr uuUIndonesia_Centralr }r (j j }r j Xوقت مرکز اندونزیr suUNaurur }r (j j }r j Xوقت نائوروr suU Uzbekistanr }r (j j }r (j X(وقت تابستانی ازبکستانr j Xوقت ازبکستانr uuUKorear }r (j j }r (j X وقت کرهr j Xوقت تابستانی کرهr j Xوقت عادی کرهr uuUCubar }r (j j }r (j Xوقت کوباr j X وقت تابستانی کوباr j Xوقت عادی کوباr uuUMoscowr }r (j j }r (j Xوقت مسکوr j X وقت تابستانی مسکوr j Xوقت عادی مسکوr uuUArgentina_Westernr }r (j j }r j Xوقت غرب آرژانتینr suUAmazonr }r (j j }r (j X$وقت تابستانی آمازونr j Xوقت آمازونr uuUChinar }r (j j }r (j X وقت چینr j Xوقت تابستانی چینr j Xوقت عادی چینr uuUArmeniar }r (j j }r (j X(وقت تابستانی ارمنستانr j Xوقت ارمنستانr uuUCookr }r (j j }r j Xوقت جزایر کوکr suUGreenland_Westernr }r (j j }r (j X/وقت تابستانی غرب گروئنلندr j Xوقت غرب گروئنلندr uuUKarachir }r (j j }r j Xوقت کراچیr suUTongar }r (j j }r (j X"وقت تابستانی تونگاr j Xوقت تونگاr uuUBrasiliar }r (j j }r (j X(وقت تابستانی برازیلیاr j Xوقت برازیلیاr uuU French_Guianar }r (j j }r j Xوقت گویان فرانسهr suUAfrica_Southernr }r (j j }r (j Xوقت جنوب افریقاr j X%وقت عادی جنوب افریقاr uuUDavisr }r (j j }r j Xوقت دیویسr suUCocosr }r (j j }r j Xوقت جزایر کوکوسr suU Kyrgystanr }r (j j }r j Xوقت قرقیزستانr suUAustralia_Westernr }r (j j }r (j Xوقت غرب استرالیاr j X/وقت تابستانی غرب استرالیاr j X'وقت عادی غرب استرالیاr uuUKazakhstan_Westernr }r (j j }r (j Xوقت غرب قزاقستانr j X'وقت عادی غرب قزاقستانr uuUAfrica_Centralr }r (j j }r j Xوقت مرکز افریقاr suUMalaysiar }r (j j }r j Xوقت مالزیr suUJapanr }r (j j }r (j Xوقت ژاپنr j X وقت تابستانی ژاپنr j Xوقت عادی ژاپنr uuUKazakhstan_Easternr }r (j j }r (j Xوقت شرق قزاقستانr j X'وقت عادی شرق قزاقستانr uuUPapua_New_Guinear }r (j j }r j X!وقت پاپوا گینهٔ نوr suU South_Georgiar }r (j j }r j X وقت جورجیای جنوبیr suUEcuadorr }r (j j }r j Xوقت اکوادورr suUIranr }r (j j }r (j Xوقت ایرانr j X"وقت تابستانی ایرانr j Xوقت عادی ایرانr uuU Indian_Oceanr }r (j j }r j Xوقت اقیانوس هندr suUTuvalur! }r" (j j }r# j Xوقت تووالوr$ suUAmerica_Mountainr% }r& (j j }r' (j X$وقت کوهستانی امریکاr( j X5وقت تابستانی کوهستانی امریکاr) j X-وقت عادی کوهستانی امریکاr* uuUHawaii_Aleutianr+ }r, j sUChiler- }r. (j j }r/ (j X وقت تابستانی شیلیr0 j Xوقت شیلیr1 uuUDushanber2 }r3 (j j }r4 (j X$وقت تابستانی دوشنبهr5 j Xوقت دوشنبهr6 uuUGeorgiar7 }r8 (j j }r9 (j X&وقت تابستانی گرجستانr: j Xوقت گرجستانr; uuU Philippinesr< }r= (j j }r> (j X&وقت تابستانی فیلیپینr? j Xوقت فیلیپینr@ uuUYakutskrA }rB (j j }rC (j X&وقت تابستانی یاکوتسکrD j Xوقت یاکوتسکrE uuUIndonesia_WesternrF }rG (j j }rH j Xوقت غرب اندونزیrI suUGreenland_EasternrJ }rK (j j }rL (j X/وقت تابستانی شرق گروئنلندrM j Xوقت شرق گروئنلندrN uuUGMTrO }rP (j j }rQ j Xوقت گرینویچrR suUMarshall_IslandsrS }rT (j j }rU j Xوقت جزایر مارشالrV suU SeychellesrW }rX (j j }rY j Xوقت سیشلrZ suUUruguayr[ }r\ (j j }r] (j X&وقت تابستانی اروگوئهr^ j Xوقت اروگوئهr_ uuUFalklandr` }ra (j j }rb (j X1وقت تابستانی جزایر فالکلندrc j X وقت جزایر فالکلندrd uuUColombiare }rf (j j }rg (j X$وقت تابستانی کلمبیاrh j Xوقت کلمبیاri uuU Volgogradrj }rk j sUFijirl }rm (j j }rn (j X وقت تابستانی فیجیro j Xوقت فیجیrp uuUAmerica_Pacificrq }rr (j j }rs (j Xوقت غرب امریکاrt j X+وقت تابستانی غرب امریکاru j X#وقت عادی غرب امریکاrv uuUBakurw }rx (j j }ry (j X وقت تابستانی باکوrz j Xوقت باکوr{ uuUPalaur| }r} (j j }r~ j Xوقت پالائوr suUEurope_Easternr }r (j j }r (j X)وقت تابستانی شرق اروپاr j Xوقت شرق اروپاr uuUBhutanr }r (j j }r j Xوقت بوتانr suU New_Zealandr }r (j j }r (j Xوقت زلاند نوr j X'وقت تابستانی زلاند نوr j Xوقت عادی زلاند نوr uuU Galapagosr }r (j j }r j Xوقت گالاپاگوسr suUSurinamer }r (j j }r j Xوقت سورینامr suUEasterr }r (j j }r (j X/وقت تابستانی جزیرهٔ ایسترr j Xوقت جزیرهٔ ایسترr uuU Christmasr }r (j j }r j X وقت جزیرهٔ کریسمسr suUIsraelr }r (j j }r (j Xوقت اسرائیلr j X&وقت تابستانی اسرائیلr j Xوقت عادی اسرائیلr uuU Hong_Kongr }r (j j }r (j X'وقت تابستانی هنگ‌کنگr j Xوقت هنگ‌کنگr uuUTashkentr }r (j j }r (j X$وقت تابستانی تاشکندr j Xوقت تاشکندr uuU Venezuelar }r (j j }r j Xوقت ونزوئلاr suUIndonesia_Easternr }r (j j }r j Xوقت شرق اندونزیr suUAustralia_Centralr }r (j j }r (j X وقت مرکز استرالیاr j X1وقت تابستانی مرکز استرالیاr j X)وقت عادی مرکز استرالیاr uuUAtlanticr }r (j j }r (j Xوقت آتلانتیکr j X(وقت تابستانی آتلانتیکr j X وقت عادی آتلانتیکr uuU North_Marianar }r (j j }r j X-وقت جزایر ماریانای شمالیr suULankar }r (j j }r j Xوقت لانکاr suUEurope_Westernr }r (j j }r (j X)وقت تابستانی غرب اروپاr j Xوقت غرب اروپاr uuUUrumqir }r (j j }r j Xوقت ارومچیr suUAfrica_Westernr }r (j j }r (j X+وقت تابستانی غرب افریقاr j Xوقت غرب افریقاr uuUGuyanar }r (j j }r j Xوقت گویانr suUNepalr }r (j j }r j Xوقت نپالr suUTbilisir }r (j j }r (j X"وقت تابستانی تفلیسr j Xوقت تفلیسr uuUMyanmarr }r (j j }r j Xوقت میانمارr suU Singaporer }r (j j }r j Xوقت عادی سنگاپورr suUSamarar }r j sUGreenland_Centralr }r (j j }r (j X1وقت تابستانی مرکز گروئنلندr j X وقت مرکز گروئنلندr uuUTahitir }r (j j }r j Xوقت تاهیتیr suUParaguayr }r (j j }r (j X(وقت تابستانی پاراگوئهr j Xوقت پاراگوئهr uuUIrkutskr }r(j j }r(j X(وقت تابستانی ایرکوتسکrj Xوقت ایرکوتسکruuuUerasr}r(Uwider}r(KXقبل از میلادrKX میلادیr uU abbreviatedr }r (KXق.م.r KXم.r uuu.PK[Rll-site-packages/babel/localedata/ha_Latn_GH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[{(site-packages/babel/localedata/ar_TN.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precq KKq!Usuffixq"Xq#h#q$Uint_precq%KKq&Upatternq'X#0.###q(Uprefixq)h#h#q*Uexp_plusq+NUgroupingq,MMq-ubsU date_formatsq.}q/Ucurrency_symbolsq0}q1U time_zonesq2}q3Uscriptsq4}q5UItalq6X#اللأيطالية القديمةq7sUvariantsq8}q9Unumber_symbolsq:}q;UnativeZeroDigitq}q?Umonthsq@}qAUcurrency_formatsqB}qCNh)qD}qE(hNhKh KKqFh"h#h#qGh%KKqHh'X¤#0.00qIh)X¤qJX-¤qKqLh+Nh,h-ubsUdaysqM}qNUformatqO}qPU abbreviatedqQ}qR(KXالاثنينqSKXالثلاثاءqTKXالأربعاءqUKX الخميسqVKX الجمعةqWKX السبتqXKX الأحدqYussU meta_zonesqZ}q[Uerasq\}q]u.PK[Rll*site-packages/babel/localedata/mn_Cyrl.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[D))(site-packages/babel/localedata/si_LK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[F$(site-packages/babel/localedata/ar_BH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[\CC(site-packages/babel/localedata/ar_SY.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precq KKq!Usuffixq"Xq#h#q$Uint_precq%KKq&Upatternq'X#0.###q(Uprefixq)h#h#q*Uexp_plusq+NUgroupingq,MMq-ubsU date_formatsq.}q/Ucurrency_symbolsq0}q1U time_zonesq2}q3Uscriptsq4}q5UItalq6X#اللأيطالية القديمةq7sUvariantsq8}q9Unumber_symbolsq:}q;Ucurrency_namesq<}q=Umonthsq>}q?Uformatq@}qA(UwideqB}qC(KXكانون الثانيqDKXشباطqEKXآذارqFKX نيسانqGKXنوارqHKX حزيرانqIKXتموزqJKXآبqKK X أيلولqLK Xتشرين الأولqMK Xتشرين الثانيqNK Xكانون الأولqOuU abbreviatedqP}qQ(KXكانون الثانيqRKXشباطqSKXآذارqTKX نيسانqUKXنوارqVKX حزيرانqWKXتموزqXKXآبqYK X أيلولqZK Xتشرين الأولq[K Xتشرين الثانيq\K Xكانون الأولq]uusUcurrency_formatsq^}q_Nh)q`}qa(hNhKh KKqbh"h#h#qch%KKqdh'X¤#0.00qeh)X¤qfX-¤qgqhh+Nh,h-ubsUdaysqi}qjUformatqk}qlU abbreviatedqm}qn(KXالاثنينqoKXالثلاثاءqpKXالأربعاءqqKX الخميسqrKX الجمعةqsKX السبتqtKX الأحدquussU meta_zonesqv}qwUerasqx}qyu.PK[Rll%site-packages/babel/localedata/in.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[|~~)site-packages/babel/localedata/gez_ET.datnu[}q(Ucurrency_symbolsq}qUERNqXERNqsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q U week_dataq }q (Umin_daysq KU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[{==(site-packages/babel/localedata/sa_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/ro_MD.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[A%site-packages/babel/localedata/tg.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX пе. чо.qUpmqX па. чо.quUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UelqAX ЮнонӣqBUeoqCXЭсперантоqDUenqEXАнглисӣqFUzhqGXЧинӣqHUugqIX ӮйғурӣqJUcaqKXКаталанӣqLUguqMXГуҷаратӣqNUcsqOXЧехӣqPUgdqQXШотландӣ-ГаликӣqRUgaqSXИрландӣqTUgnqUX ГоранӣqVUeuqWX БаскӣqXUetqYX ЭстонӣqZUglq[XГалисианӣq\Uidq]XИндонезӣq^Uesq_X Испанӣq`UruqaXРусӣqbUnlqcXҲолландӣqdUptqeXПортугалӣqfUlaqgX ЛотинӣqhUloqiX ЛаосӣqjUjvqkXҶаванизӣqlUlvqmXЛатвиягӣqnUltqoXЛитвонӣqpUzuqqXЗулуqrUheqsX ЯҳудӣqtUiaquXБайни забонӣqvUisqwXИсландӣqxUfilqyXФилиппинӣqzUyiq{X&Яҳудии Аврупои шарқӣq|Ubeq}XБелорусӣq~UfrqXФаронсавӣqUbgqXБулғорӣqUpt_BRqX%Португалӣ (Бразилия)qUfyqXФрисианӣqUbnqXБенгалӣqUdeqX НемисӣqUbhqX БиҳарӣqUdaqXДаниягӣqUfaqX ФорсӣqUhiqX ҲиндӣqUbrqXБретонӣqUbsqXБосниягӣqUfiqX ФиннӣqUhuqX МаҷорӣqUjaqX ҶопонӣqUfoqX ФарозӣqUkaqX ГурҷӣqUroqX РуминӣqUuzqX ӮзбекӣqUnoqXНорвегӣqUsvqX ШведӣqUurqXУрдуqUplqXЛаҳистонӣqUukqXУкраинӣqUkyqXҚирғизӣqUorqX УрисоӣquU territoriesq}q(UTOqX ТонгаqUAFqXАфғонистанquUdecimal_formatsq}qU date_formatsq}q(Umediumqh))q}q(h,X yyyy MMM dqh.X%(yyyy)s %(MMM)s %(d)squbUfullqh))q}q(h,XEEEE, yyyy MMMM ddqh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)squbUlongqh))q}q(h,X yyyy MMMM dqh.X%(yyyy)s %(MMMM)s %(d)squbUshortqh))q}q(h,Xyy/MM/ddqh.X%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUArabqX АрабӣqsUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}qUTJSqX СомонӣqsUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KX ЯнварqKX ФевралqKXМартqKX АпрелqKXМайqKXИюнqKXИюлqKX АвгустqK XСентябрqK X ОктябрrK X НоябрrK X ДекабрruU abbreviatedr}r(KXЯнвrKXФевrKXМарrKXАпрrKXМайr KXИюнr KXИюлr KXАвгr K XСенr K XОктrK XНояrK XДекruuuUcurrency_formatsr}rUdaysr}r(U stand-aloner}rUnarrowr}r(KhKhKhKhKhKhKhusUformatr}r(Uwider}r(KXДушанбеrKXСешанбеrKXЧоршанбеrKXПанҷшанбеr KX Ҷумъаr!KX Шанбеr"KXЯкшанбеr#uU abbreviatedr$}r%(KXДшбr&KXСшбr'KXЧшбr(KXПшбr)KXҶмъr*KXШнбr+KXЯшбr,uuuU meta_zonesr-}r.Uerasr/}r0(Uwider1}r2(KXПеш аз милодr3KXПаМr4uU abbreviatedr5}r6(KXПеМr7KXПаМr8uuu.PK[_.ll(site-packages/babel/localedata/az_AZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99(site-packages/babel/localedata/mn_MN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[ȽHH(site-packages/babel/localedata/en_TT.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqUpatternqX ¤#,##0.00q Uprefixq!X¤q"X-¤q#q$Uexp_plusq%NUgroupingq&KKq'ubsU languagesq(}q)U territoriesq*}q+U time_zonesq,}q-Uscriptsq.}q/Udecimal_formatsq0}q1U meta_zonesq2}q3Uvariantsq4}q5Ucurrency_namesq6}q7u.PK[xQvv%site-packages/babel/localedata/id.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXkuartal pertamaq KX kuartal keduaq KXkuartal ketigaqKXkuartal keempatquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XH:mm:ssq-Uformatq.X%(H)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X H:mm:ss vq3h.X%(H)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X H:mm:ss zq8h.X%(H)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XH:mmq=h.X %(H)s:%(mm)sq>ubuU languagesq?}q@(UgvqAXManxqBUguqCXGujaratiqDUscnqEXSisiliaqFUromqGXRomanyqHUalgqIXBahasa AlgonquiaqJUaleqKXAleutqLUscoqMX SkotlandiaqNUmniqOXManipuriqPUgdqQXGaelik SkotlandiaqRUgaqSXIrlandiaqTUmnoqUX Bahasa ManoboqVUosaqWXOsageqXUgnqYXGuaraniqZUaltq[X Altai Selatanq\Uglq]XGalleganq^Umwrq_XMarwariq`UtyqaXTahitianqbUtwqcXTwiqdUttqeXTatarqfUtrqgXTurkishqhUtsqiXTsongaqjUtnqkXTswanaqlUtoqmXTongaqnUausqoXBahasa-bahasa AustraliaqpUavqqXAvarikqrUtkqsXTurkmenqtUthquXThaiqvUroaqwX Romance LainqxUtgqyXTajikqzUteq{XTeluguq|Uugaq}XUgaritikq~UmwlqXMirandqUkcgqXTyapqUsmiqXBahasa Sami LainqUfatqXFantiqUfanqXFangqUwoqXWolofqUrmqXRhaeto-RomanceqUdinqXDinkaqUblaqXSiksikaqUcmcqX Bahasa ChamicqUmlqX MalayalamqUzhqXCinaqUtemqXTimneqUen_CAqXInggris KanadaqUnwcqX Newari KlasikqUzaqXZhuangqUcauqXKaukasia (Lainnya)qUzuqXZuluqUterqXTerenoqUtetqXTetumqUmncqXManchuqUkutqXKutenaiqUsukqXSukumaqUkumqXKumykqUsusqXSusuqUnewqXNewariqUsuxqXSumeriaqUdenqXSlaveqUmenqXMendeqUmulqXBeberapa BahasaqUlezqXLezghiaqUrootqXRootqUekaqXEkajukqUakkqXAkkadienqUdraqX Dravidia LainqUjrbqX Judeo-ArabqUsgnqXBahasa IsyaratqUsgaqX Irlandia LamaqUapaqXBahasa-bahasa ApacheqUbraqXBrajqUchbqXChibchaqUchgqXChagataiqUchkqXChuukeqUchmqXMariqUchnqXJargon ChinookqUchoqXChoctawqUchpqX ChipewyanqUchrqXCherokeeqUchyqXCheyenneqUtiqXTigrinyaqUvotqXVotikqUmgqXMalagasiqUibaqXIbanqUmoqX MoldavianqUmnqX MongolianqUmiqXMaoriqUmhqXMarshallqUmkqX MacedonianqUmtqXMalteseqUcaiqXIndia Amerika Tengah (Lainnnya)qUdelqXDelawareqUmsqXMalayqUmrqXMarathiqUtaqXTamilqUmyqXBurmarUcadrXCaddorUsrnrX Sranan TongorUtairXTai LainrUafhrXAfrihilirUsitr XSino-Tibet Lainr Uenmr X%Inggris, Abad Pertengahan (1100-1500)r Uen_AUr XInggris AustraliarUnynrXNyankolerUnyorXNyororUnymrXNyamwezirUsiorX Bahasa SiouanrUmaprX AustronesiarUmasrXMasairUlahrXLahndarUladrXLadinorUfyrXFrisir Usnkr!XSoninker"Ufar#XPersiar$Umadr%XMadurar&Umagr'XMagahir(Umair)XMaithilir*Ufir+X Finlandiar,Ufjr-XFijir.Umanr/XMandingor0Uegyr1X Mesir Kunor2Uzndr3XZander4Ussr5XSwatir6Usrr7XSerbianr8Usqr9XAlbanianr:Uswr;XSwahilir<Usvr=XSwediar>Usur?XSundanr@UstrAX Sotho SelatanrBUskrCXSlovakrDUsirEX SinhaleserFUshrGXSerbo-CroatianrHUsorIXSomalirJUsnrKXShonarLUsmrMXSamoanrNUslrOX SlovenianrPUscrQX SardinianrRUsarSXSanskritrTUsgrUXSangorVUserWX Northern SamirXUsdrYXSindhirZUzenr[XZenagar\Ukbdr]X Kabardianr^Uafar_XAfro-Asiatik (Lainnya)r`UcsbraX KashubianrbUlgrcXGandardUlbreX LuxembourgrfUfiurgXFinno - Ugria LainrhUlnriXLingalarjUlorkXLaorlUlirmXLimburgrnUbynroXBlinrpUltrqX LithuaniarrUlursX Luba-KatangartUfilruXFilipinarvUyirwXYiddishrxUnonryX Norse LamarzUcebr{XCebuanor|Uyor}XYorubar~UnogrXNogairUbatrXBaltik (Lainnya)rUdakrXDakotarUdarrXDargwarUdayrXDayakrUssarXNilo-Sahara LainrUkperXKpellerUelrXYunanirUeorX EsperantorUenrXInggrisrUlamrXLambarUeerXEwerUmdfrXMoksharUfrrXPerancisrUmdrrXMandarrUetrXEstonianrUesrXSpanyolrUrurXRussianrUgonrXGondirUgohrXJerman Kuno (kl.750-1050)rUsmsrX Skolt SamirUsmnrX Inari SamirUsmjrX Lule SamirUde_ATrXJerman AustriarUgotrXGothikrUrnrXRundirUrorXRomanianrUdsbrXSorbia RendahanrUsmarX Sami SelatanrUgorrX GorontalorUastrXAsturrUwalrXWalamorUcrhrX Turki KrimearUathrXBahasa-bahasa AthapaskarUgezrXGeezrUxhrXXhosarUffrXFulahrUkforXKororUmakrXMakassarrUzaprXZapotekrUkokrXKonkanirUzxxrXTidak ada konten linguistikrUkosrXKosraerUforXFarorUtogrX Nyasa TongarUhuprXHuparUudmrXUdmurtrUbejrXBejarUbemrXBembarUtsirX TsimshianrUberrXBerberrUnzirXNzimarUsairXIndian Amerika Selatan LainrUangrXInggris Kuno (kl.450-1100)rUprarXBahasa PrakritrUbhorXBhojpurirUsalrXBahasa SalisharUprorXProvençal LamarUrajrX RajasthanirUsadrXSandawerUanprXAngikarUes_419rXSpanyol Amerika LatinrUraprXRapanuirUsasrXSasakrUnqorXN'KorUcarrXKaribrUminrX MinangkabaurUmicrXMicmacrUefirXEfikrUarnr XAraucanr Uypkr X Bahasa Yupikr Umisr XBahasa Lain-lainrUkacrXKachinrUkabrXKabylerUkaarX Kara-KalpakrUkajrXJjurUkamrXKambarUkarrXKarenrUkawrXKawirUfr_CHrX Prancis SwissrUtyvrXTuviniar Ufr_CAr!XPrancis Kanadar"Ukar#XGeorgianr$Udoir%XDogrir&Ukgr'XKongor(Ukkr)XKazakhr*Ukjr+XKuanyamar,Ukir-XKikuyur.Ukor/XKorear0Uknr1XKannadar2Ukmr3XKhmerr4Uklr5X Kalaallisutr6Uksr7XKashmirr8Ukrr9XKanurir:Ukwr;XCornishr<Ukvr=XKomir>Ukur?XKurdir@UkyrAXKirghizrBUtklrCXTokelaurDUbuarEXBuriatrFUmgarGX$Irlandia Abad Pertengahan (900-1200)rHUhitrIXHittiterJUdyurKXDyularLUderMXJermanrNUdarOXDenmarkrPUdzrQXDzongkharRUluirSXLuisenorTUdvrUXDivehirVUhilrWX HiligaynonrXUhimrYX HimachalirZUgemr[XJermanik (Lainnya)r\Ucrpr]XKreol dan Pidgins Lainr^Uqur_XQuechuar`UbasraXBasarbUgbarcXGbayardUbadreXBandarfUbanrgXBalinrhUbalriXBaluchirjUshnrkXShanrlUbairmXBahasa-bahasa BamilekernUarproXArapahorpUartrqXBuatan (Lainnya)rrUarwrsXArawakrtUarcruXAramrvUen_USrwX Inggris A.S.rxUsemryX Semitic LainrzUselr{XSelkupr|Unubr}X Bahasa Nubiar~UbtkrXBatakrUlusrXLushairUmusrXCreekrUluarX Luba-LuluarUirorXBahasa IroquoiarUirarX Iran LainrUmunrX Bahasa MundarUlunrXLundarUluorXLuorUwarXWalloonrUtuprX Bahasa TupirUjvrXJawarUtutrX Altaic LainrUtumrXTumbukarUjarXJapaneserUcoprXKoptikrUilorXIlokorUlarXLatinrUgwirXGwich'inrUundrX%Bahasa Tidak Dikenal atau Tidak ValidrUtlirXTingitrUtlhrXKlingonrUchrXChamorrorUcorXKorsikarUcarXCatalanrUcerXChechenrUponrXPohnpeiarUcyrXWelshrUsahrXYakutrUcsrXCekorUcrrXCreerUbntrXBanturUcvrXChuvashrUcurX Church SlavicrUlvrXLatvianrUdumrXBelanda MenengahrUptrXPortugisrUduarXDualarUfrorXPerancis Kuno (842-kl.1400)rUyaprXYaprUfrmrX)Perancis, Abad Pertengahan (kl.1400-1600)rUtivrXTivrUfrsrX Frisia TimurrUfrrrX Frisia UtararUyaorXYaorUparXPunjabirUxalrXKalmykrUes_ESrXSpanyol (Iberia)rUpirXPalirUen_GBrXInggris (British)rUgayrXGayorUotorX Bahasa OtomiarUotarX Turki OttomanrUhmnrXHmongrUmyvrXErzyarUgaarXGarUfurrXFriulirUkhirX Khoisa LainrUainrXAinurUrarrX RarotonganrUslarX Slavic LainrUverXVendarUvirX VietnameserUisrX IcelandicrUkhorXKhotanrUiurX InuktitutrUitrXItalianrUvorXVolapükrUiirX Sichuan YirUikr XInupiaqr Uior XIdor Uiner XIndo-Eropa LainrUiarX InterlinguarUjprrX Judeo-PersiarUierX InterlinguerUidrXBahasa IndonesiarUigrXIgborUpaprX PapiamentorUeworXEwondorUpaurXPalauarUpaarXPapuan (Lainnya)r Upagr!X Pangasinar"Usatr#XSantalir$Upalr%XPahlavir&Upamr'XPampangar(Uphir)XFilipina (Lainnya)r*Ucelr+XCeltic (Lainnya)r,Uphnr-X Phoeniciar.Unicr/XNiger - Kordofania Lainr0Uniar1XNiasr2Udgrr3XDogribr4Usyrr5XSyriar6Uniur7XNiuear8Ugswr9X Jerman Swissr:Ucchr;XAtsamr<Ujbor=XLojbanr>Unahr?XNahuatir@UsamrAXAramaic SamaritanrBUhairCXHaidarDUgmhrEX'Jerman, Abad Pertengahan (kl.1050-1500)rFUcusrGX Cushitic LainrHUwenrIX Bahasa SerbiarJUadyrKXAdygherLUelxrMXElamiterNUadarOXAdangmerPUpt_PTrQXPortugis (Iberia)rRUhawrSXHawaiirTUbinrUXBinirVUbikrWXBikolrXUpt_BRrYXPortugis BrasilrZUmosr[XMossir\Umohr]XMohawkr^Utlr_XTagalogr`Uzh_HansraXCina SederhanarbUzh_HantrcXCina TradisionalrdUtvlreXTuvalurfUijorgXIjorhUkmbriXKimbundurjUpeorkXPersia Kuno (kl.600-400 SM.)rlUumbrmXUmbundurnUtmhroXTamashekrpUfonrqXFonrrUhsbrsX Sorbia AtasrtUberuX BelarusiarvUbgrwXBulgariarxUbaryXBashkirrzUpsr{XPashto (Pushto)r|Ubmr}XBambarar~UbnrXBengalrUborXTibetrUbhrXBiharirUbirXBislamarUbrrXBretonrUbsrXBosniarUruprX AromanianrUzzarXZazarUomrXOromorUojrXOjibwarUacerXAcehrUachrXAcolirUocrX Bahasa OccitrUkrurXKurukhrUsrrrXSererrUkrorXKrurUkrlrXKarelianrUkrcrXKarachay-BalkarrUndsrX Jerman RendahrUosrXOsseticrUorrXOriyarUsogrXSogdienrUnsorX Sotho UtararUsonrXSonghairUde_CHrXJerman Tinggi SwissrUvairXVairUwakrXBahasa WakasharUlolrXMongorUmkhrXMon-Khmer (Lainnya)rUawarXAwadhirUlozrXLozirUgilrXGilbertrUwasrXWashorUwarrXWarayrUhzrXHererorUhyrXArmeniarUanrXAragonrUsidrXSidamorUhrrXKroasiarUhtrXHaitirUhurXHungariarUhirXHindirUhorX Hiri MoturUharXHausarUbugrXBugisrUherXIbranirUuzrXUzbekrUurrXUrdurUplrXPolishrUukrX UkrainianrUugrXUighurrUaarXAfarrUabrXAbkhazrUaerXAvestanrUafrX AfrikaansrUakrXAkanrUamrXAmharikrUnl_BErXFlemishrUeurXBasquerUasrXAssamrUarrXArabrUinhrXIngushrUtpirX Tok PisinrUmynrX Bahasa MayanrUayrXAymararUkharXKhasirUazrX AzerbaijanrUincrX Indic LainrUnlrXBelandarUnnr XNorwegian Nynorskr Unor X Norwegianr Unar XNaururUnbrXNorwegian BokmålrUnairXIndian Amerika Utara LainrUndrX Ndebele UtararUnerXNepalrUngrXNdongarUnyrXNyanja; Chichewa; ChewarUnaprX NeapolitanrUgrbrXGreborUgrcrXYunani Kuno (sd 1453)r Unrr!XNdebele Selatanr"Utigr#XTigrer$Unvr%XNavajor&Uzunr'XZunir(Urwr)X Kinyarwandar*Ucper+X'Kreol dan Pidgins Lain Berbasis Inggrisr,Ucpfr-X'Kreol dan Pidgins Lain berbasis Prancisr.Ucppr/X(Kreol dan Pidgins Lain berbasis Portugisr0uU territoriesr1}r2(UBDr3X Bangladeshr4UBEr5XBelgiar6UBFr7X Burkina Fasor8UBGr9XBulgariar:UBAr;XBosnia dan Herzegovinar<UBBr=XBarbadosr>UWFr?XWallis dan Futunar@UBMrAXBermudarBUBNrCXBruneirDUBOrEXBoliviarFUBHrGXBahrainrHUBIrIXBurundirJUBJrKXBeninrLUBTrMXBhutanrNUJMrOXJamaikarPUBVrQXKepulauan BouvetrRUBWrSXBotswanarTUWSrUXSamoarVUBRrWXBrazilrXUBSrYXBahamasrZUJEr[XJerseyr\UBYr]X Belarusiar^UBZr_XBelizer`URUraXRusiarbURWrcXRwandardURSreXSerbiarfUTLrgX Timor TimurrhUREriXRéunionrjUTMrkX TurkmenistanrlUTJrmX TajikistanrnUROroXRomaniarpUTKrqXTokelaurrUGWrsX Guinea-BissaurtUGUruXGuamrvUGTrwX GuatemalarxUGSryX.Georgia Selatan dan Kepulauan Sandwich SelatanrzUGRr{XYunanir|UGQr}XGuinea Khatulistiwar~UGPrX GuadelouperUJPrXJepangrUGYrXGuyanarUGGrXGuernseyrUGFrXGuyana PerancisrUGErXGeorgiarUGDrXGrenadarUGBrX Inggris RayarUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GreenlandrUGIrX GibraltarrUGHrXGhanarUOMrXOmanrUTNrXTunisiarUJOrXYordaniarUHRrXKroasiarUHTrXHaitirUHUrXHungariarUHKrXHong Kong S.A.R., CinarUHNrXHondurasrUHMrX"Pulau Heard dan Kepulauan McDonaldrUVErX VenezuelarUPRrX Puerto RikorUPSrXOtoritas PalestinarUPWrXPalaurUPTrXPortugisrUSJrXSvalbard dan Jan MayenrUPYrXParaguayrUIQrXIraqrUPArXPanamarUPFrXPolynesia PerancisrUPGrX Papua NuginirUPErXPerurUPKrXPakistanrUPHrXFilipinarUPNrXPitcairnrUPLrXPolandiarUPMrXSaint Pierre dan MiquelonrUZMrXZambiarUEHrX Sahara BaratrUEErXEstoniarUEGrXMesirrUZArXAfrika SelatanrUECrXEkuadorrUITrXItalirUVNrXVietnamrUSBrXKepulauan SolomonrUETrXEthiopiarUSOrXSomaliarUZWrXZimbabwerUSArX Arab SaudirUESrXSpanyolrUERrXEritrearUMErX MontenegrorUMDrXMoldovarUMGrX MadagaskarrUMArXMarokorUMCrXMonacorUUZrX UzbekistanrUMMrXMyanmarrUMLrXMalirUMOrXMakao S.A.R. CinarUMNrXMongoliarUMHrXKepulauan MarshallrUMKrX MacedoniarUMUrX MauritiusrUMTr XMaltar UMWr XMalawir UMVr XMaldivesrUMQrX MartiniquerUMPrXKepualuan Mariana UtararUMSrX MontserratrUMRrX MauritaniarUIMrX Isle of ManrUUGrXUgandarUTZrXTanzaniarUMYrXMalaysiarUMXrXMexicor UILr!XIsraelr"UFRr#XPerancisr$UIOr%XBritish Indian Ocean Territoryr&USHr'X Saint Helenar(UFIr)X Finlandiar*UFJr+XFijir,UFKr-XKepulauan Falklandr.UFMr/X Mikronesiar0UFOr1XKepulauan Faroer2UNIr3X Nicaraguar4UNLr5X Netherlandsr6UNOr7XNorwegiar8UNAr9XNamibiar:UVUr;XVanuatur<UNCr=XKaledonia Barur>UNEr?XNigerr@UNFrAXKepulauan NorfolkrBUNGrCXNigeriarDUNZrEX Selandia BarurFUNPrGXNepalrHUNRrIXNaururJUNUrKXNiuerLUCKrMXKepulauan CookrNUCIrOX Pantai GadingrPUCHrQXSwissrRUCOrSXKolombiarTUCNrUXCinarVUCMrWXKamerunrXUCLrYXChilirZUCCr[XKepulauan Cocosr\UCAr]XKanadar^UCGr_XKongor`UCFraXRepublik Afrika TengahrbUCDrcXRepublik Demokratik KongordUCZreX Republik CekorfUCYrgXSiprusrhUCXriXPulau ChristmasrjUCSrkXSerbia dan MontenegrorlUCRrmX Kosta RikarnUCVroX Tanjung VerderpUCUrqXKubarrUSZrsX SwazilandrtUSYruXSyriarvUKGrwX KyrgyzstanrxUKEryXKenyarzUSRr{XSurinamer|UKIr}XKiribatir~UKHrXKambojarUKNrXSaint Kitts dan NevisrUKMrXKomorosrUSTrXSao Tome dan PrinciperUSKrXSlovakiarUKRrX Korea SelatanrUSIrXSloveniarUKPrX Korea UtararUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KazakhstanrUKYrXKepulauan KaymanrUSGrX SingapurarUSErXSwedenrUSDrXSudanrUDOrXRepublik DominikarUDMrXDominikarUDJrXJiboutirUDKrXDenmarkrUVGrXKepulauan British VirginrUDErXJermanrUYErXYamanrUDZrXAlgeriarUUSrXAmerika SerikatrUUYrXUruguayrUYTrXMayotterUUMrX'Kepulauan minor sekitar Amerika SerikatrULBrXLebanonrULCrX Santa LusiarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTrXTrinidad dan TobagorUTRrXTurkeyrULKrX Sri LankarULIrX LiechtensteinrULVrXLatviarUTOrXTongarULTrX LithuaniarULUrX LuxembourgrULRrXLiberiarULSrXLesothorUTHrXThailandrUTFrXWilayah Prancis SelatanrUTGrXTogorUTDrXChadrUTCrXKepulauan Turks dan CaicosrULYrXLibyarUVArXVatikanrUVCrXSaint Vincent dan GrenadinesrUAErXUni Emirat ArabrUADrXAndorarUAGrXAntigua dan BarbudarUAFrX AfghanistanrUAIrXAnguillarUVIrXKepulauan U.S. VirginrUISrXIslandiarUIRrXIranrUAMrXArmeniarUALrXAlbaniarUAOrXAngolarUANrXAntilles BelandarUAQrX AntarktikarUASrX Samoa AmerikarUARrX ArgentinarUAUrX AustraliarUATr XAustriar UAWr XArubar UINr XIndiarUAXrX�Land IslandsrUAZrX AzerbaijanrUIErXIrlandiarUIDrX IndonesiarUUArXUkrainarUQArXQatarrUMZrX MozambiqueruUdecimal_formatsr}rU date_formatsr}r (Umediumr!h))r"}r#(h,X dd MMM yyyyr$h.X%(dd)s %(MMM)s %(yyyy)sr%ubUfullr&h))r'}r((h,XEEEE dd MMMM yyyyr)h.X!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)sr*ubUlongr+h))r,}r-(h,X dd MMMM yyyyr.h.X%(dd)s %(MMMM)s %(yyyy)sr/ubUshortr0h))r1}r2(h,Xdd/MM/yyr3h.X%(dd)s/%(MM)s/%(yy)sr4ubuUcurrency_symbolsr5}r6UIDRr7XRpr8sU time_zonesr9}r:(UAtlantic/Canaryr;}r<Ucityr=XCanary Islandsr>sUAmerica/Guadelouper?}r@j=X GuadaluperAsUEurope/AndorrarB}rCj=XAndorarDsUAsia/SingaporerE}rFj=X SingapurarGsUAmerica/St_VincentrH}rIj=X St. VincentrJsUAmerica/DominicarK}rLj=XDominikarMsUAmerica/St_LuciarN}rOj=X St. LuciarPsUPacific/EasterrQ}rRj=X Easter IslandrSsUAmerica/Costa_RicarT}rUj=X Kosta RikarVsUAmerica/St_ThomasrW}rXj=X St. ThomasrYsUAmerica/JamaicarZ}r[j=XJamaikar\sUAntarctica/DumontDUrviller]}r^j=XDumont D'Urviller_sUAmerica/El_Salvadorr`}raj=XSalvadorrbsUAmerica/Anchoragerc}rdj=X Alaska TimeresUAsia/Hong_Kongrf}rgj=XHongkongrhsUAmerica/St_Kittsri}rjj=X St. KittsrksU Asia/Macaurl}rmj=XMakaurnsUAmerica/Anguillaro}rpj=XAnguilarqsU Europe/Monacorr}rsj=XMonakortsUAntarctica/South_Poleru}rvj=X Kutub SelatanrwsuUscriptsrx}ry(UGururzXGurmukhir{UHebrr|XIbranir}UZzzzr~X&Skrip tidak diketahui atau tidak validrUPhnxrXPhoenixrUMoonrXMoonrUGujrrXGujaratrUZxxxrXTidak tertulisrULycirXLycianrUSinhrXSinhalarUTalurX Tai Lue BarurUMongrXMongolrUVisprXUcapan TerlihatrURjngrXRejangrUOlckrX Chiki LamarUTalerXTai LerUMandrXMandaeanrUMlymrX MalayalamrUTibtrXTibetrUKalirXKayah LirUJpanrXJepangrUPlrdrXFonetik PollardrUSylorX Syloti NagrirULydirXLydianrULepcrXLepcharUSundrXSundarUYiiirXYirUJavarXJawarUOryarXOriyarULaoorXLaorUUgarrXUgariticrUCyrlrXCyrillicrUVaiirXVairUArmnrXArmeniarUCyrsrXChurch Slavonic Cyrillic LamarUKhmrrXKhmerrUItalrX Italia LamarUSgnwrXTulisan IsyaratrUXsuxrXSumero-Akkadian CuneiformrUThaarXThaanarUThairXThairUCprtrXCypriotrULinbrXLinear BrULinarXLinear ArUOsmarXOsmanyarUSaurrX SaurashtrarUHirarXHiraganarUHanirXHanrUEgydrX Demotik MesirrUQaairXWarisanrUKanarXKatakanarUCansrXSimbol Aborigin Kanada KesatuanrUEgyprXHieroglip MesirrUTfngrXTifinaghrUShawrXShavianrUCirtrXCirthrUGeorrXGeorgianrUTengrXTenghwarrUHrktrXKatakana atau HiraganarUGeokrXGeorgian KhutsurirUOgamrXOghamrUDsrtrXDeseretrUGothrXGothicrUHanorXHanunoorUHangrXHangulrUCarirXCarianrUTagbrXTagbanwarUHansrX Han SederhanarUHantrXHan TradisionalrURororX RongorongorUDevarX DevanagarirUIndsrXIndusrUBoporXBopomofor UMymrr XMyanmarr UTglgr XTagalogr UBugirXBugisrUPhagrXPhags-parUBrairXBrailerUBrahrXBrahmirUBatkrXBatakrUMerorXMeroiticrULimbrXLimburUMteirX Meitei MayekrUTelurXTelugurUTamlr XTamilr!USarar"XSaratir#ULatgr$X Latin Gaelicr%ULatfr&X Latin Frakturr'UKharr(X Kharoshthir)UNkoor*XN'Kor+ULatnr,XLatinr-UMayar.XHieroglip Mayar/ULanar0XLannar1UEthir2XEthiopicr3UHmngr4X Pahawh Hmongr5UBuhdr6XBuhidr7UCoptr8XCopticr9UEgyhr:XHieratik Mesirr;UGlagr<X Glagoliticr=URunrr>XRunicr?UOrkhr@XOrkhonrAUHungrBX Hongaria LamarCUGrekrDXYunanirEUCherrFXCherokeerGUZyyyrHXCommonrIUSyrcrJXSyriacrKUBlisrLX BlissymbolsrMUBengrNXBengalirOUSyrerPXSiria EstrangelorQUSyrjrRX Syriac BaratrSUSyrnrTX Siria TimurrUUKndarVXKannadarWuUvariantsrX}rYUnumber_symbolsrZ}r[(Udecimalr\X,r]Ugroupr^X.r_uUcurrency_namesr`}ra(UCOPrbX Peso KolombiarcUUSDrdX Dolar AmerikareUGBPrfXPondsterling InggrisrgUTWDrhXDolar Taiwan BaruriUSITrjXTolar SloveniarkUMTLrlX Lira MaltarmUBNDrnX Dollar BruneiroUEGPrpX Pound Mesirrqj7XRupiah IndonesiarrUBGNrsX Lev BulgariartUFJDruX Dollar FijirvUPENrwXNuevo Sol PeruvianrxUDEMryX Mark JermanrzUEEKr{X Kroon Estoniar|UBOBr}XBoliviano Boliviar~UDKKrXKroner DenmarkrUSKKrXKoruna SlovakiarUFRFrX Frank PrancisrUPKRrXRupee PakistanrUMXNrX Peso MeksikorUHUFrXForint HungariarUVNDrX Dong VietnamrURONrXLeu Rumania BarurUMYRrXRinggit MalaysiarUZARrXRand Afrika SelatanrUUAHrXHryvnia UkraniarULTLrXLitas LithuaniarUTRLrX Lira TurkirUSARrX Real SaudirUCADrX Dolar KanadarUSEKrX Kronor SwediarUSGDrXDolar SingapurarUHKDrXDolar Hong KongrUAUDrXDolar AustraliarUCHFrX Franc SwissrUKRWrXWon Korea SelatanrUCNYrX Yuan RenminbirUTRYrXLira Turki BarurUVEBrXBolivar VenezuelarUHRKrX Kuna KroasiarUNZDrXDolar New ZealandrUCLPrX Peso ChilirUTHBrX Baht ThailandrUEURrXEurorUARSrXPeso ArgentinarUILSrX Shekel IsraelrUNOKrXKroner NorwegiarURSDrX Dinar SerbiarURUBrX Rubel RusiarUINRrX Rupee IndiarUJPYrX Yen JepangrUCZKrX Koruna CzechrUBRLrX Real BrazilrUMADrX Dirham MarokorUPLNrXNewZloty PolandiarUPHPrX Peso FilipinarUKESrXShilling KenyarUAEDrXDirham Uni Emirat ArabruUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KXJanuarirKXFebruarirKXMaretrKXAprilrKXMeirKXJunirKXJulirKXAgustusrK X SeptemberrK XOktoberrK XNovemberrK XDesemberruU abbreviatedr}r(KXJanrKXFebrKXMarrKXAprrKXMeirKXJunrKXJulrKXAgurK XSeprK XOktrK XNovrK XDesruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r (Uexp_precr NUscaler KU frac_precr KKr UsuffixrXrjrUint_precrKKrh,X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r (KjKjKjKjKjKjKjusUformatr!}r"(Uwider#}r$(KXSeninr%KXSelasar&KXRabur'KXKamisr(KXJumatr)KXSabtur*KXMinggur+uU abbreviatedr,}r-(KXSenr.KXSelr/KXRabr0KXKamr1KXJumr2KXSabr3KXMinr4uuuU meta_zonesr5}r6Uerasr7}r8U abbreviatedr9}r:(KXBCEr;KXCEr<usu.PK[_.ll(site-packages/babel/localedata/he_IL.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[۟%site-packages/babel/localedata/it.datnu[}q(U zone_formatsq}qUgmtqXGMT%sqsUdatetime_formatsq}qNX{1} {0}qsUquartersq}q (U stand-aloneq }q Unarrowq }q (KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1o trimestreqKX 2o trimestreqKX 3o trimestreqKX 4o trimestrequU abbreviatedq}q(KXT1qKXT2qKXT3qKXT4quuuUperiodsq }q!(Uamq"Xm.q#Upmq$Xp.q%uUscientific_formatsq&}q'Ncbabel.numbers NumberPattern q()q)}q*(Uexp_precq+KKq,Uscaleq-KU frac_precq.KKq/Usuffixq0Xq1h1q2Uint_precq3KKq4Upatternq5X#E0q6Uprefixq7h1X-q8q9Uexp_plusq:Ugroupingq;MMqNh()q?}q@(h+Nh-Kdh.KKqAh0X%qBhBqCh3KKqDh5X#,##0%qEh7h1h8qFh:Nh;KKqGubsU week_dataqH}qI(Umin_daysqJKU weekend_startqKKU first_dayqLKU weekend_endqMKuU time_formatsqN}qO(UmediumqPcbabel.dates DateTimePattern qQ)qR}qS(h5XHH.mm.ssqTUformatqUX%(HH)s.%(mm)s.%(ss)sqVubUfullqWhQ)qX}qY(h5X HH.mm.ss vqZhUX%(HH)s.%(mm)s.%(ss)s %(v)sq[ubUlongq\hQ)q]}q^(h5X HH.mm.ss zq_hUX%(HH)s.%(mm)s.%(ss)s %(z)sq`ubUshortqahQ)qb}qc(h5XHH.mmqdhUX %(HH)s.%(mm)sqeubuU languagesqf}qg(UgvqhXmanxqiUguqjXgujaratiqkUscnqlX sicilianoqmUromqnXromaniqoUalgqpXlingue algonchineqqUaleqrXaleutoqsUscoqtXscozzesequUmniqvXmanipuriqwUgdqxXgaelico scozzeseqyUgaqzX irlandeseq{Umnoq|Xmanoboq}Uosaq~XosageqUgnqXguaranaqUaltqXaltai meridionaleqUglqX galizianoqUmwrqXmarwariqUtyqXtaitianoqUtwqXciqUttqXtataricoqUtrqXturcoqUtsqXtsongaqUtnqXtswanaqUtoqXtongaqUausqXlingue australianeqUavqXavaroqUtkqX turcomannoqUthqXthaiqUroaqXlingua romanzaqUtgqXtagiccoqUteqXteluguqUugaqX ugariticoqUmwlqX mirandeseqUkcgqXtyapqUsmiqX lingua samiqUfatqXfantiqUfanqXfangqUwoqXvolofqUrmqXlingua rhaeto-romanceqUdinqXdincaqUblaqXsiksikaqUcmcqX lingue chamicqUmlqX malayalamqUzhqXcineseqUtemqXtemneqUen_CAqXinglese canadeseqUnwcqXnewari classicoqUzaqXzhuangqUcauqXlingua caucasicaqUzuqXzuluqUterqXterenoqUtetqXtetumqUmncqXmanchuqUkutqXkutenaiqUsukqXsukumaqUkumqXkumykqUsusqXsusuqUnewqXnewariqUsuxqXsumeroqUdenqXslaveqUmenqXmendeqUmulqX multilinguaqUlezqXlezghianqUrootqXrootqUekaqXekajukaqUakkqXaccadoqUdraqXlingua dravidicaqUjrbqX giudeo araboqUsgnqX lingue signqUsgaqXirlandese anticoqUapaqX lingue apacheqUbraqXbrajqUchbqXchibchaqUchgqX ciagataicoqUchkqXchuukeseqUchmqXmariqUchnqX gergo chinookqUchorXchoctawrUchprX chipewyanrUchrrXcherokeerUchyrXcheyennerUtirXtigrinyar Uvotr Xvotor Umgr X malgascior UibarXibanrUmorXmoldavorUmnrXmongolorUmirXmaorirUmhrX marshalleserUmkrXmacedonerUmtrXmalteserUcairX$lingua indiana dell'America CentralerUdelrXdelawarerUmsr Xmaleser!Umrr"Xmarathir#Utar$Xtamilr%Umyr&Xbirmanor'Ucadr(Xcaddor)Usrnr*X sranan tongor+Utair,Xlingua tailandeser-Uafhr.Xafrihilir/Usitr0Xlingua sino-tibetanar1Uenmr2X inglese medior3Uen_AUr4Xinglese australianor5Unynr6Xnyankoler7Unyor8Xnyoror9Unymr:Xnyamwezir;Usior<X lingue siouxr=Umapr>X austronesianor?Umasr@XmasairAUlahrBXlahndarCUladrDXladinorEUfyrFXfrisonerGUsnkrHXsoninkerIUfarJXpersianorKUmadrLXmadureserMUmagrNXmagahirOUmairPXmaithilirQUfirRX finlandeserSUfjrTXfigianorUUmanrVXmandingorWUegyrXXegiziano anticorYUzndrZXzander[Ussr\Xswatir]Usrr^Xserbor_Usqr`XalbaneseraUswrbXswahilircUsvrdXsvedesereUsurfX sundanesergUstrhX sotho del sudriUskrjXslovaccorkUsirlX singalesermUshrnX serbo-croatoroUsorpXsomalorqUsnrrXshonarsUsmrtXsamoanoruUslrvXslovenorwUscrxXsardoryUsarzX sanscritor{Usgr|Xsangor}User~X sami del nordrUsdrXsindhirUzenrXzenagarUkbdrXkabardiarUafarXlingua afroasiaticarUcsbrX kashubianrUlgrXgandarUlbrXlussemburgheserUfiurXlingua ungrofinnicarUlnrXlingalarUlorXlaorUlirX limburgeserUbynrXblinrUltrXlituanorUlurX luba-katangarUfilrX filippinorUyirXyiddishrUnonrX norse anticorUcebrXcebuanorUyorXyorubarUnogrXnogairUbatrXlingua balticarUdakrXdakotarUdarrXdargwarUdayrXdayakrUssarXlingua nilo-saharianarUkperXkpellerUelrXgrecorUeorX esperantorUenrXingleserUlamrXlambarUeerXewerUmdfrXmoksharUfrrXfranceserUmdrrXmandarrUetrXestonerUesrXspagnolorUrurXrussorUgonrXgondirUgohrXtedesco antico altorUsmsrX sami skoltrUsmnrX sami inarirUsmjrX sami lulerUde_ATrXtedesco austriacorUgotrXgoticorUrnrXrundirUrorXrumenorUdsbrX basso soraborUsmarX sami del sudrUgorrX gorontalorUastrX asturianorUwalrXwalamorUcrhrX turco crimeorUathrXlingue athabaskarUgezrXgeezrUxhrXxosarUffrXfulahrUkforXkforUmakrXmakasarrUzaprXzapotecrUkokrXkonkanirUzxxrXNessun contenuto linguisticorUkosrXkosraeanrUforXfaroeserUtogrXnyasa del TongarUhuprXhuparUudmrXudmurtrUbejrXbegiarUbemrXwembarUtsirX tsimshianr Uberr Xberberor Unzir Xnzimar UsairXlingua indiana del Sud AmericarUangrXinglese anticorUprarXpracritorUbhorXbhojpurirUsalrX lingue salishrUprorXprovenzale anticorUrajrX rajasthanirUsadrXsandawerUanprXangikarUes_419r Xspagnolo latinoamericanor!Urapr"Xrapanuir#Usasr$Xsasakr%Unqor&Xn'kor'Ucarr(Xcaribicor)Uminr*X menangkabaur+Umicr,Xmicmacr-Uefir.Xefikr/Uarnr0Xaraucanor1Uypkr2X lingue yupikr3Umisr4Xlingue diverser5Ukacr6Xkachinr7Ukabr8Xkabyler9Ukaar:X kara-kalpakr;Ukajr<Xkair=Ukamr>Xkambar?Ukarr@XkarenrAUkawrBXkawirCUfr_CHrDXfrancese svizzerorEUtyvrFXtuvinianrGUfr_CArHXfrancese canadeserIUkarJX georgianorKUdoirLXdogrirMUkgrNXkongorOUkkrPXkazakorQUkjrRXkuanyamarSUkirTXkikuyurUUkorVXcoreanorWUknrXXkannadarYUkmrZXkhmerr[Uklr\X kalaallisutr]Uksr^Xkashmirir_Ukrr`XkanuriraUkwrbXcornicorcUkvrdXkomireUkurfXcurdorgUkyrhXkirghisoriUtklrjXtokelaurkUbuarlXburiatrmUmgarnXirlandese medioroUhitrpXhittiterqUdyurrXdiularsUdertXtedescoruUdarvXdaneserwUdzrxXdzongkharyUluirzXluisenor{Udvr|Xdivehir}Uhilr~X hiligaynarUhimrX himachalirUgemrXlingua germanicarUcrprXcreolo o pidginrUqurXquechuarUbasrXbasarUgbarXgbayarUbadrXbandarUbanrXbalineserUbalrXbelucirUshnrXshanrUbairXlingue bamilekerUarprXarapahorUartrXlingua artificialerUarwrXaruacorUarcrXaramaicorUen_USrXinglese americanorUsemrXlingua semiticarUselrXselkuprUnubrXnubianorUbtkrXbatakrUlusrXlushairUmusrXcreekrUluarX luba-luluarUirorXlingue irochesirUirarXiranianarUmunrX lingua mundarUlunrXlundarUluorXluorUwarXvallonerUtuprX lingue tupirUjvrX giavaneserUtutrXlingua altaicarUtumrXtumbukarUjarX giapponeserUcoprXcoptorUilorXilocanorUlarXlatinorUgwirX gwichʼinrUundrXlingua imprecisatarUtlirXtlingitrUtlhrXklingonrUchrXchamorrorUcorXcorsorUcarXcatalanorUcerXcecenorUponrXponaperUcyrXgalleserUsahrXyakutrUcsrXcecorUcrrXcreerUbntrXbanturUcvrXchuvashrUcurXslavo della ChiesarUlvrXlettonerUdumrXolandese mediorUptrX portogheserUduarXdualarUfrorXfrancese anticorUyaprXyapeserUfrmrXfrancese mediorUtivrXtivrUfrrrXfrisone settentrionalerUyaorX yao (bantu)rUparXpunjabirUxalrXkalmykrUes_ESrXspagnolo della SpagnarUpirXpalirUen_GBrXinglese britannicorUgayrXgayor Uotor X lingue otomir Uotar Xturco ottomanor UhmnrXhmongrUmyvrXerzyarUgaarXgarUfurrXfriulanorUkhirXlingua khoisanrUainrXainurUrarrX rarotongarUslarX lingua slavarUverXvendarUvir X vietnamitar!Uisr"X islandeser#Ukhor$X khotaneser%Uiur&X inuktitutr'Uitr(Xitalianor)Uvor*Xvolapükr+Uiir,X sichuan yir-Uikr.Xinupiakr/Uior0Xidor1Uiner2Xlingua indoeuropear3Uiar4X interlinguar5Ujprr6Xgiudeo persianor7Uier8X interlinguer9Uidr:X indonesianor;Uigr<Xigbor=Upapr>X papiamentor?Uewor@XewondorAUpaurBXpalaurCUpaarDXlingua papuanarEUpagrFX pangasinanrGUsatrHXsantalirIUpalrJXpahlavirKUpamrLXpampangarMUphirNXlingua filippinarOUcelrPXceltica altra linguarQUphnrRXfeniciorSUnicrTXlingua niger-cordofanrUUniarVXniasrWUdgrrXXdogribrYUsyrrZXsiriacor[Uniur\Xniuer]Ugswr^Xtedesco svizzeror_Ucchr`XatsamraUjborbXlojbanrcUnahrdXnahuatlreUsamrfXaramaico samaritanorgUhairhXhaidariUgmhrjXtedesco medio altorkUcusrlXlingua cusciticarmUwenrnXsoraboroUadyrpXadygherqUelxrrX elamiticorsUadartXadangmeruUpt_PTrvXportoghese del PortogallorwUhawrxXhawaianoryUbinrzXbinir{Ubikr|Xbicolr}Upt_BRr~Xportoghese brasilianorUmosrXmossirUmohrXmohawkrUtlrXtagalogrUzh_HansrXcinese semplificatorUzh_HantrXcinese tradizionalerUtvlrXtuvalurUkmbrXkimbundurUpeorXpersiano anticorUumbrXmbundurUtmhrXtamashekrUhsbrX alto soraborUberX bielorussorUbgrXbulgarorUbarXbaschirorUpsrXpashtorUbmrXbambararUbnrX bengaleserUborXtibetanorUbhrXbiharirUbirXbislamarUbrrXbretonerUbsrXbosniacorUruprXarumenorUzzarXzazarUomrXoromorUojrXojibwarUacerXaccineserUachrXaciolirUocrXoccitanorUkrurXkurukhrUsrrrXsererrUkrorXkrurUkrlrX carelianorUkrcrXkarachay-BalkarrUndsrX basso tedescorUosrXosseticorUorrXoriyarUsogrXsogdianorUnsorXsotho del nordrUsonrXsonghairUde_CHrXalto tedesco svizzerorUvairXvairUwakrX lingue wakashrUlolrX lolo banturUmkhrXlingua mon-khmerrUawarXawadhirUlozrXlozirUgilrX gilberteserUwasrXwashorUwarrXwarayrUhzrXhererorUhyrXarmenorUanrX aragoneserUsidrXsidamorUhrrXcroatorUhtrXhaitianorUhurX unghereserUhirXhindirUhorX hiri moturUharXhaussarUbugrXbugirUherXebraicorUuzrXusbecorUurrXurdurUplrXpolaccorUukrXucrainorUugrXuiguricorUaarXafarrUabrX abkhazianr Uaer Xavestanr Uafr X afrikaansr UakrXakanrUamrXamaricorUnl_BErXfiammingo belgarUeurXbascorUasrXassameserUarrXaraborUinhrXingushrUtpirX tok pisinrUmynrX lingue mayarUayr Xaymarar!Ukhar"Xkhasir#Uazr$X azerbaigianor%Uincr&Xlingua indianar'Unlr(Xolandeser)Unnr*Xnorvegese nynorskr+Unor,X norvegeser-Unar.Xnaurur/Unbr0Xnorvegese bokmalr1Unair2Xlingua indiana del Nord Americar3Undr4Xndebele del nordr5Uner6Xnepaleser7Ungr8Xndongar9Unyr:Xnyanjar;Unapr<X napoletanor=Ugrbr>Xgerbor?Ugrcr@X greco anticorAUnrrBXndebele del sudrCUtigrDXtigrerEUnvrFXnavajorGUzunrHXzunirIUrwrJX kinyarwandarKUcperLX#creolo o pidgin basati sull'ingleserMUcpfrNX#creolo o pidgin basati sul franceserOUcpprPX%creolo o pidgin basati sul portogheserQuU territoriesrR}rS(UBDrTX BangladeshrUUBErVXBelgiorWUBFrXX Burkina FasorYUBGrZXBulgariar[UVEr\X Venezuelar]UBAr^XBosnia Erzegovinar_UBBr`XBarbadosraUWFrbXWallis e FutunarcUBMrdXBermudareUBNrfXBruneirgUBOrhXBoliviariUBHrjXBahreinrkUBIrlXBurundirmUBJrnXBeninroUBTrpXBhutanrqU011rrXAfrica occidentalersUBVrtX Isola BouvetruUBWrvXBotswanarwU014rxXAfrica orientaleryU015rzXAfrica del Nordr{UBRr|XBrasiler}U017r~XAfrica centralerU018rXAfrica del SudrU019rXAmericherUBYrX BielorussiarUBZrXBelizerULVrXLettoniarURWrXRuandarURSrXSerbiarUTLrX Timor EstrURErXRéunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TagikistanrUROrXRomaniarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX(Georgia del Sud e Isole Sandwich del SudrUGRrXGreciarUGQrXGuinea EquatorialerUGPrX GuadaluparUJPrXGiapponerUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXGuiana FranceserUGErXGeorgiarUGDrXGrenadarU021rXAmerica del NordrUGBrX Regno UnitorUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GroenlandiarU029rXCaraibirUGIrX GibilterrarUGHrXGhanarUJErXJerseyrUTNrXTunisiarUJMrXGiamaicarU013rXAmerica centralerUWSrXSamoarU419rXAmerica Latina e CaraibirUHRrXCroaziarUBSrXBahamasrUHTrXHaitirUHUrXUngheriarUHKrX2Regione Amministrativa Speciale di Hong Kong, CinarU039rXEuropa del SudrUHNrXHondurasrUFIrX FinlandiarU142rXAsiarU030rXAsia orientalerU034rX Asia del SudrU035rXAsia sudorientalerUPRrX PortoricorUPSrX PalestinarUFKrXIsole FalklandrUIOrX+Territorio Britannico dell’Oceano IndianorUPWrXPalaurUPTrX PortogallorUSJrXSvalbard e Jan MayenrUMDrXMoldaviarUFMrX MicronesiarUIQrXIraqrUPArXPanamarUPFrXPolinesia FranceserUPGrXPapua Nuova Guinear UPEr XPerùr UPKr XPakistanr UPHrX FilippinerUFOrX Isole FaroerUPNrXPitcairnrUPLrXPoloniarUPMrXSaint Pierre e MiquelonrUZMrXZambiarUEHrXSahara OccidentalerURUrXFederazione RussarUEErXEstoniarUEGr XEgittor!UZAr"X Sudafricar#UECr$XEcuadorr%UITr&XItaliar'UVNr(XVietnamr)UZZr*X regione non valida o sconosciutar+USBr,X Isole Solomonr-UETr.XEtiopiar/USOr0XSomaliar1UZWr2XZimbabwer3USAr4XArabia Sauditar5UESr6XSpagnar7UERr8XEritrear9UMEr:X Montenegror;UAQr<X Antartider=UMGr>X Madagascarr?UMAr@XMaroccorAUMCrBXMonacorCUUZrDX UzbekistanrEUMMrFXMyanmarrGUMLrHXMalirIUMOrJX.Regione Amministrativa Speciale di Macao, CinarKUMNrLXMongoliarMUHMrNXIsole Heard ed Isole McDonaldrOUASrPXSamoa AmericanerQUMKrRXRepubblica di MacedoniarSUMUrTX MauritiusrUUMTrVXMaltarWUMWrXXMalawirYUMVrZXMaldiver[UMQr\X Martinicar]UMPr^XIsole Marianne Settentrionalir_UMSr`X MontserratraUMRrbX MauritaniarcUIMrdX Isola di ManreUUGrfXUgandargUTZrhXTanzaniariUMYrjXMalesiarkUMXrlXMessicormUILrnXIsraeleroUFRrpXFranciarqUAWrrXArubarsUDOrtXRepubblica DominicanaruUSHrvX Sant’ElenarwUVCrxXSaint Vincent e GrenadinesryU054rzX Melanesiar{UDJr|XGibutir}UFJr~XFigirU057rXRegione MicronesianarU172rXComunità di Stati IndipendentirU053rXAustralia e Nuova ZelandarUNIrX NicaraguarUNLrX Paesi BassirUNOrXNorvegiarUNArXNamibiarUVUrXVanuaturUNCrXNuova CaledoniarUNErXNigerrUNFrX Isola NorfolkrUNGrXNigeriarUNZrX Nuova ZelandarUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinesiarUCIrXCosta d’AvoriorUCHrXSvizzerarUCOrXColombiarUCNrXCinarUCMrXCamerunrUCLrXCilerUCCrX Isole CocosrUCArXCanadarUCGrXCongorUCFrXRepubblica CentrafricanarUCDrX Repubblica Democratica del CongorUCZrXRepubblica CecarUCYrXCiprorUCXrXIsola di ChristmasrUCSrXSerbia e MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Capo VerderUCUrXCubarUSZrX SwazilandrUSYrXSiriarUKGrX KirghizistanrUKErXKenyarUSRrXSurinamerU143rX Asia centralerUKHrXCambogiarUKNrXSaint Kitts e NevisrUKMrXComorerUSTrXSao Tomé e PrínciperUSKrX SlovacchiarUKRrX Corea del SudrUSIrXSloveniarUKPrXCorea del NordrUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KazakistanrUKYrX Isole CaymanrUSGrX SingaporerUSErXSveziarUSDrXSudanrU151rXEuropa orientalerU150rXEuroparUDMrXDominicarU155rXEuropa occidentalerU154rXEuropa del NordrUVGrXIsole Vergini BritannicherUDErXGermaniarUYErXYemenrUMHrXIsole Marshallr U062r XAsia centro-meridionaler UDZr XAlgeriar UUSrX Stati UnitirUUYrXUruguayrUYTrXMayotterUUMrX&Isole Minori lontane dagli Stati UnitirULBrXLibanorULCrX Saint LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTr XTrinidad e Tobagor!UTRr"XTurchiar#ULKr$X Sri Lankar%ULIr&X Liechtensteinr'UCKr(X Isole Cookr)UTOr*XTongar+ULTr,XLituaniar-ULUr.X Lussemburgor/ULRr0XLiberiar1ULSr2XLesothor3UTHr4X Tailandiar5UTFr6XTerritori australi francesir7UTGr8XTogor9UTDr:XCiadr;UTCr<XIsole Turks e Caicosr=ULYr>XLibiar?UVAr@XVaticanorAU145rBXAsia occidentalerCUAErDXEmirati Arabi UnitirEUADrFXAndorrarGUAGrHXAntigua e BarbudarIUAFrJX AfghanistanrKUAIrLXAnguillarMUVIrNXIsole Vergini AmericanerOUISrPXIslandarQUIRrRXIranrSUAMrTXArmeniarUUALrVXAlbaniarWUAOrXXAngolarYUANrZXAntille Olandesir[U003r\X Nord Americar]U002r^XAfricar_U001r`XMondoraUARrbX ArgentinarcUAUrdX AustraliareUATrfXAustriargU005rhXAmerica del SudriUINrjXIndiarkUAXrlX Isole AlandrmU009rnXOceaniaroUAZrpX AzerbaigianrqUIErrXIrlandarsUIDrtX IndonesiaruUJOrvX GiordaniarwUQUrxXUnione EuropearyUUArzXUcrainar{UQAr|XQatarr}UDKr~X DanimarcarUMZrX MozambicorUQOrXOceania lontanaruUdecimal_formatsr}rNh()r}r(h+Nh-Kh.KKrh0h1h1rh3KKrh5X #,##0.###rh7h1h8rh:Nh;KKrubsU date_formatsr}r(UmediumrhQ)r}r(h5X dd/MMM/yyyyrhUX%(dd)s/%(MMM)s/%(yyyy)srubUfullrhQ)r}r(h5XEEEE d MMMM yyyyrhUX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrhQ)r}r(h5X dd MMMM yyyyrhUX%(dd)s %(MMMM)s %(yyyy)srubUshortrhQ)r}r(h5Xdd/MM/yyrhUX%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}r(UCOPrXCol$rUMKDrXMDenrUDZDrXDArUNADrXN$rUKMFrXCFrUTOPrXT$rUNZDrX$NZrUIDRrXRprUHNLrXLrUBGNrXlevrUFJDrXF$rUETBrXBrrUCRCrXCrUBZDrXBZ$rUGNFrXGFrUMWKrXMKrUIQDrXIDrUDOPrXRD$rUBAMrXKMrULKRrXSL RerUSCRrXSRrUSKKrXSkrUPLNrXZlrUPKRrXPrarULBPrXLLrUTZSrXT ShrUCVErXCVEscrUKWDrXKDrUBMDrXBer$rUBIFrXFburUKHRrXCRrUMYRrXRMrUMNTrXTugrUAMDrXdramrULYDrXLDrUSOSrXSh.rUSYPrXLSrUQARrXQRrUJMDrXJ$rUGELrXlarirUSTDrXDbrUKGSrXsomrUAFNrXAfrUSRGrXSfrUCHFrXSFr.rUIEPrXIR£rUIRRrXRIrUBBDrXBDS$rUBYRrXRblrUITLrX₤r UXPFr XCFPFr UBDTr XTkr UGYDrXG$rUTTDrXTT$rUUGXrXU ShrUMTLrXLmrUDJFrXDFrUTWDrXNT$rUZWDrXZ$rUXCDrXEC$rUVUVrXVTrUALLr Xlekr!UYERr"XYRlr#UUYUr$XUr$r%USZLr&XEr'UKZTr(XTr)UGTQr*XQr+UVEBr,XBer-UBHDr.XBDr/UMXNr0XMEX$r1UOMRr2XROr3UMROr4XUMr5USBDr6XSI$r7UMZMr8XMtr9UBTNr:XNur;UKESr<XK Shr=ULSLr>XMr?UNPRr@XNrsrAuU time_zonesrB}rC(U Europe/BerlinrD}rEUcityrFXBerlinorGsUAtlantic/CanaryrH}rIjFXCanarierJsUAmerica/CordobarK}rLjFXCordovarMsU Asia/BahrainrN}rOjFXBahreinrPsU Europe/LondonrQ}rRjFXLondrarSsU Europe/ZurichrT}rUjFXZurigorVsUPacific/EasterrW}rXjFXPasquarYsU Asia/JakartarZ}r[jFXGiacartar\sUAfrica/Sao_Tomer]}r^jFX Sao Tomèr_sU Pacific/Fijir`}rajFXFigirbsUAtlantic/South_Georgiarc}rdjFXGeorgia meridionaleresUAtlantic/Faeroerf}rgjFX Isole FaeroerhsU Europe/Warsawri}rjjFXVarsaviarksU Africa/Tunisrl}rmjFXTunisirnsU Asia/Damascusro}rpjFXDamascorqsUIndian/Maldivesrr}rsjFXMaldivertsUEurope/Copenhagenru}rvjFX CopenaghenrwsUAmerica/St_Luciarx}ryjFX Santa LuciarzsUEurope/Bucharestr{}r|jFXBucarestr}sU Asia/Tehranr~}rjFXTeheranrsU Europe/Tiraner}rjFXTiranarsUEurope/Gibraltarr}rjFX GibilterrarsUAmerica/St_Johnsr}rjFX St. JohnsrsUIndian/Reunionr}rjFXRiunione, isola dirsUAmerica/Martiniquer}rjFX MartinicarsUAfrica/Djiboutir}rjFXGibutirsUAntarctica/DumontDUrviller}rjFXDumont D'UrvillersUAtlantic/Cape_Verder}rjFX Capo VerdersU Europe/Romer}rjFXRomarsU Europe/Moscowr}rjFXMoscarsU Asia/Macaur}rjFXMacaorsUAmerica/Puerto_Ricor}rjFX PortoricorsUAmerica/Guadelouper}rjFX GuadaluparsUAmerica/North_Dakota/Centerr}rjFXCenter, Dakota del nordrsUAmerica/Jamaicar}rjFXGiamaicarsUAfrica/Mogadishur}rjFX MogadisciorsUAmerica/Anchorager}rjFXFuso orario AlaskarsUAtlantic/St_Helenar}rjFX Sant'ElenarsUIndian/Christmasr}rjFXNatalersU Europe/Parisr}rjFXParigirsUEurope/Stockholmr}rjFX StoccolmarsUAfrica/Addis_Ababar}rjFX Addis AbebarsUAmerica/St_Vincentr}rjFX St. VincentrsU Europe/Dublinr}rjFXDublinorsUAmerica/St_Thomasr}rjFX St. ThomasrsUAmerica/El_Salvadorr}rjFXSalvadorrsUEurope/Brusselsr}rjFX BruxellesrsU Europe/Athensr}rjFXAtenersU Europe/Lisbonr}rjFXLisbonarsUAmerica/Guyanar}rjFXGuianarsUAsia/Samarkandr}rjFX SamarcandarsUAtlantic/Azoresr}rjFXAzzorrersUAsia/Jerusalemr}rjFX GerusalemmersUEurope/Luxembourgr}rjFX LussemburgorsU Etc/Unknownr}rjFX SconosciutorsUAmerica/Mexico_Cityr}rjFXCittà del MessicorsUPacific/Pitcairnr}rjFXPitcairn, isolersU Indian/Comoror}rjFXComorersUAmerica/St_Kittsr}rjFX St. KittsrsU Asia/Seoulr}rjFXSeulrsUAfrica/Algiersr}rjFXAlgerirsUAntarctica/South_Poler}rjFXPolo SudrsUAmerica/Sao_Paulor}rjFX San PaolorsuUscriptsr}r(UGururXgurmukhirUHebrrXebraicorUZzzzrXignoto o non validor UPhnxr Xfenicior UMoonr XMoonr UChamrXchamrUArabrXaraborUGujrrXgujaratirUZxxxrX non scrittorULycirXlycirUSinhrX singaleserUTalurXtai luerUMongrXmongolorUXpeorXpersiano anticorUVispr Xalfabeto visivor!URjngr"Xrejangr#UOlckr$Xol chikir%UTaler&Xtai ler'UMandr(Xmandaicor)UMlymr*X malayalamr+UTibtr,Xtibetanor-UKalir.Xkayah lir/UJpanr0X giapponeser1UPlrdr2Xfonetica di pollardr3UKanar4Xkatakanar5ULydir6Xlydir7ULepcr8Xlepchar9USundr:X sundaneser;UYiiir<Xyir=UJavar>Xjavaneser?UOryar@XoriyarAULaoorBXlaorCUUgarrDXugaritarEUCyrlrFX cirillicorGUVaiirHXvaiirIUArmnrJXarmenorKUCyrsrLX,cirillico (variante antica chiesa slavonica)rMUKhmrrNXkhmerrOUSylorPX syloti nagrirQUItalrRXitalico anticorSUSgnwrTXlinguaggio dei segnirUUXsuxrVXsumero-accadiano cuneiformerWUThaarXXthaanarYUThairZX tailandeser[UCprtr\Xcipriotar]ULinbr^X lineare Br_ULinar`X lineare AraUOsmarbXosmanyarcUSaurrdX saurashtrareUHirarfXhiraganargUHanirhXhanriUEgydrjXegiziano demoticorkUQaairlX ereditatormUEgyhrnXieratico egizianoroUCansrpX$simboli aborigeni canadesi unificatirqUEgyprrXgeroglifici egizianirsUTfngrtXtifinaghruUShawrvXshavianorwUCirtrxXcirthryUGeorrzX georgianor{UTengr|Xtengwarr}UHrktr~Xkatanaka o hiraganarUGeokrXkutsurirUOgamrXoghamrUDsrtrXdeseretrUGothrXgoticorUHanorXhanunoorUBalirXbalineserUHangrXhangulrUCarirXcarianrUTagbrXtagbanwarUHansrXhan semplificatorUHantrXhan tradizionalerURororX rongorongorUDevarX devanagarirUIndsrXindurUBoporXbopomoforUMymrrXmyanmarrUTglgrXtagalogrUPermrXpermico anticorUBugirXbugineserUPhagrXphags-parUBrairXbraillerUBrahrXbrahmirUBatkrXbatakrUMerorX meroiticorULimbrXlimburUMteirX meetei mayekrUTelurXtelugurUTamlrXtamilrUSararXsaratirULatgrXlatino (variante gaelica)rULatfrXlatino (variante fraktur)rUKharrX kharoshthirUNkoorXn'korULatnrXlatinorUMayarXgeroglifici mayarULanarXlannarUEthirXetioperUHmngrX pahawn hmongrUBuhdrXbuhidrUCoptrXcoptorUGlagrX glagoliticorURunrrXrunicorUOrkhrXorkhonrUHungrXantico unghereserUGrekrXgrecorUCherrXcherokeerUZyyyrXcomunerUSyrcrXsirianorUBlisrX simboli blissrUBengrXbengalirUSyrerXsiriaco estrangelorUSyrjrXsiriaco occidentalerUSyrnrXsiriaco orientalerUKndarXkannadaruUvariantsr}r(UNEDISrXdialetto del NatisonerUREVISEDrXortografia revisionatarUAREVMDArXarmeno occidentalerUFONIPArX fonetica IPArU1996rXortografia tedesca del 1996rUBOONTrX boontlingrUAREVELArXarmeno orientalerUMONOTONrX monotonicorUROZAJrXresianorUPOSIXr Xcomputerr UFONUPAr X fonetica UPAr UPOLYTONr X politonicor USAAHOr Xsahor U1901r Xortografia tradizionale tedescar uUnumber_symbolsr }r (Udecimalr X,r Ugroupr X.r uUcurrency_namesr }r (UXXXr XNessuna valutar jXDinaro Algerinor ULVRr X Rublo Lettoner jXFranco Comorianor UBOPr XPeso Bolivianor UEGPr XSterlina Egizianar UBGLr X Lev Bulgaror jXNuovo Lev Bulgaror UPABr XBalboa di Panamar UYUMr! XDinaro Noviy Yugoslavor" jXDollaro dello Zimbabwer# UGHCr$ XCedi del Ghanar% UXBDr& XUnità di acconto europea (XBD)r' UBOBr( X Bolivianor) UXBAr* XUnità composita europear+ UDKKr, X Corona Daneser- UXBCr. XUnità di acconto europea (XBC)r/ UXBBr0 XUnità monetaria europear1 UBWPr2 XPula del Botswanar3 jXSterlina Libaneser4 jXScellino della Tanzaniar5 UVNDr6 XDong Vietnamitar7 jXDollaro Namibianor8 UAOAr9 XKwanza Angolanor: UWSTr; XTala della Samoa Occidentaler< UAONr= X!Nuovo Kwanza Angolano (1990-2000)r> jXRiel Cambogianor? jXRinggit della Malesiar@ UAOKrA XKwanza Angolano (1977-1990)rB jXScellino SomalorC UKYDrD XDollaro delle Isole CaymanrE jX Dinaro LibicorF UUAHrG XHrivna UcrainarH UUAKrI XKarbovanetz UcrainorJ jXScellino UgandeserK UJODrL XDinaro GiordanorM UAORrN X&Kwanza Reajustado Angolano (1995-1999)rO USURrP XRublo SovieticorQ UAWGrR XFiorino di ArubarS USARrT X Ryal SauditarU UFIMrV XMarkka FinlandeserW UHKDrX XDollaro di Hong KongrY jXFiorino del SurinamerZ UTPEr[ XEscudo di Timorr\ UMGFr] XFranco Malgascior^ jXFranco Svizzeror_ UGIPr` XSterlina di Gibilterrara jXRublo Bielorussiarb j X Lek Albaneserc UUGSrd XScellino Ugandese (1966-1987)re j4XOuguiya della Mauritaniarf UBOVrg XMvdol Bolivianorh UHRKri X Kuna Croatarj jXFranco Gibutianork UHRDrl X Dinaro Croatorm UPESrn X Sol Peruvianoro UBYBrp X#Nuovo Rublo Bielorussia (1994-1999)rq jX Lira Italianarr UXAFrs XFranco CFA BEACrt UBNDru XDollaro del Bruneirv UISKrw XCorona Islandeserx UZALry XRand Sudafricano (finanziario)rz j$XPeso Uruguayo uruguaianor{ UNIOr| XCórdoba oro nicaraguenser} ULAKr~ X Kip Laotianor UNICr XCordoba Nicaraguenser j@XRupia Nepaleser UMZEr XEscudo del Mozambicor ULUCr X#franco convertibile del Lussemburgor jXDollaro Giamaicanor UFRFr XFranco Franceser UMAFr XFranco Marocchinor j8XMetical del Mozambicor UMZNr Xmetical del Mozambicor UPHPr XPeso delle Filippiner UZARr XRand Sudafricanor URHDr Xdollaro della Rhodesiar UGWPr XPeso della Guinea-Bissaur ULUFr XFranco del Lussemburgor UBELr XFranco Belga (finanziario)r UBECr XFranco Belga (convertibile)r UNGNr XNaira Nigerianar UYUNr XDinaro Convertibile Yugoslavor UBEFr X Franco Belgar UPLZr XZloty Polacco (1950-1995)r jXColón Costaricanor UTRLr X Lira Turcar UDEMr X Marco Tedescor UEEKr XCorona dell’Estoniar jXKwacha Malawianor jXDollaro di Trinidad e Tobagor jXRupia di Sri Lankar jXCorona Slovaccar jXEscudo del Capo Verder jXRupia del Pakistanr UHUFr XFiorino Unghereser UROLr XLeu della Romaniar UXEUr XUnità Monetaria Europear jXDollaro delle Bermudar j2X Rial Omanitar j>XLoti del Lesothor ULSMr Xmalotir jXTugrik Mongolor jX Dram Armenor UYUDr XDinaro Forte Yugoslavor UBUKr X Kyat Birmanor jXSterlina Sirianar jXRial del Qatarr UXDRr XDiritti Speciali di Incassor UNLGr XFiorino Olandeser UGEKr XKupon Larit Georgianor UMTPr XSterlina Malteser UGBPr XSterlina Ingleser jXLari Georgianor USHPr XSterlina di Sant’Elenar jXAfganir j6XDollaro delle Isole Solomonr UCSKr XCorona forte cecoslovaccar UKPWr XWon Nordcoreanor UXREr X fondi RINETr UCSDr Xantico dinaro serbor UAFAr XAfgani (1927-2002)r UTHBr XBaht Tailandeser UTRYr Xnuova Lira turcar j XTaka Bangladeser UGRDr X Dracma Grecar j"XRial dello Yemenr UDDMr X Ostmark della Germania Orientaler j&XLilangeni dello Swazilandr UHTGr XGourde Haitianor UXOFr XFranco CFA BCEAOr UMGAr XAriary Malgascior UANGr XFiorino delle Antille Olandesir ULRDr XDollaro Liberianor URWFr XFranco Ruandeser UNOKr XCorona Norvegeser UMXVr X#Unidad de Inversion (UDI) Messicanar j<XScellino Keniotar UMOPr XPataca di Macaor UINRr X Rupia Indianar j0XPeso Messicanor UCZKr X Corona Cecar UTJSr XSomoni del Tajikistanr UTJRr XRublo del Tajikistanr j:XNgultrum Butaneser UYDDr XDinaro dello Yemenr UGWEr XEscudo della Guinea portogheser jXPeso Colombianor jX Lira Malteser UMURr XRupia Maurizianar jXRupia Indonesianar jXLempira Hoduregnor j X Franco CFPr jXDollaro delle Figir jX Birr Etiopicor UPENr XSol Nuevo Peruvianor jXDollaro Belizer UATSr XScellino Austriacor UILPr XSterlina Israelianar UZRNr XNuovo Zaire dello Zairer jXPeso Dominicanor ULULr X"franco finanziario del Lussemburgor UTMMr XManat Turkmenor jXNuovo dollaro taiwaneser! UMDLr" X Leu Moldavor# UXPTr$ Xplatinor% UECVr& X.Unidad de Valor Constante (UVC) dell’Ecuadorr' UECSr( XSucre dell’Ecuadorr) UBSDr* XDollaro delle Bahamasr+ USEKr, XCorona Svedeser- jXPaʻanga di Tongar. UPEIr/ XInti Peruvianor0 UZMKr1 XKwacha dello Zambiar2 UMVRr3 XRufiyaa delle Maldiver4 UXTSr5 Xcodice di verifica della valutar6 UAUDr7 XDollaro Australianor8 UADPr9 XPeseta Andorranar: UCUPr; X Peso Cubanor< jXLira Irlandeser= UCLFr> XUnidades de Fomento Chilener? jXDollaro di Barbadosr@ UKRWrA XWon SudcoreanorB UGMDrC XDalasi del GambiarD j*XQuetzal GuatemaltecorE j,XBolivar VenezuelanorF USITrG XTallero SlovenorH USDPrI XSterlina SudaneserJ UCLPrK X Peso CilenorL UEURrM XEurorN UCDFrO XFranco CongoleserP jXDollaro dei Caraibi OrientalirQ j(X Tenge KazacorR URUBrS X Rublo RussorT UXFUrU XFranco UIC FranceserV UBRRrW XCruzeiro BrasilianorX UBRNrY XCruzado Novo BrasilianorZ UBRLr[ XReal Brasilianor\ UMMKr] XKyat di Myanmarr^ UUYPr_ XPeso Uruguaiano (1975-1993)r` URURra XRublo della CSIrb jX Zloty Polaccorc UBRErd XCruzeiro Brasiliano (1990-1993)re UPYGrf XGuarani del Paraguayrg UBRCrh XCruzado Brasilianori UBRBrj X$Cruzeiro Novo Brasiliano (1967-1986)rk USVCrl XColón Salvadoregnorm UAEDrn X Dirham degli Emirati Arabi Unitiro UGNSrp XSyli della Guinearq jXDinaro Macedonerr UAZMrs X Manat Azerort UAZNru X manat azerorv UUSNrw XDollaro Statunitense (Next day)rx UGQEry XEkwele della Guinea Equatorialerz jXVatu di Vanuatur{ UBADr| XDinar Bosnia-Herzegovinar} jXFranco della Guinear~ UMXPr X&Peso messicano d’argento (1861-1992)r jXDinaro Irachenor UERNr X Nakfa Eritreor jXMarco Conv. Bosnia-Erzegovinar jXRupia delle Seychellesr UCADr XDollaro Canadeser USDDr XDinaro Sudaneser UCYPr XSterlina Cipriotar UMADr XDirham Marocchinor jXDinaro Kuwaitianor jXFranco del Burundir ULTTr XTalonas Lituanir UPGKr XKina della Papua Nuova Guinear ULTLr X Lita Lituanar USGDr XDollaro di Singaporer UUZSr XSum dell’Uzbekistanr jXDobra di Sao Tomé e Principer UXFOr XFranco Oro Franceser UMLFr XFranco di Malir UESPr XPeseta Spagnolar jX Rial Iranianor UZRZr XZaire dello Zairer UCNYr XRenmimbi Cineser USLLr XLeone della Sierra Leoner UTNDr XDinaro Tunisinor jXDollaro della Guyanar UESBr X$peseta spagnola account convertibiler UESAr Xpeseta spagnola accountr jXDollaro Neozelandeser UFKPr XSterlina delle Falklandr ULVLr X Lat Lettoner UUSSr XDollaro Statunitense (Same day)r UUSDr XDollaro Statunitenser UARPr XPeso Argentino (vecchio Cod.)r jX Som Kirghisor UARSr XPeso Argentinor UILSr XNuovo sheqel israelianor URONr X leu rumenor URSDr X Dinaro serbor j.XDinaro del Bahrainir UJPYr XYen Giapponeser UARAr XAustral Argentinor UPTEr XEscudo Portogheser UXAUr XOror uUmonthsr }r (U stand-aloner }r (Uwider }r (KXGennaior KXFebbraior KXMarzor KXApriler KXMaggior KXGiugnor KXLuglior uUnarrowr }r (KXGr KXFr Kj?KXAr Kj?Kj KjKj K XSr K XOr K XNr K XDr uuUformatr }r (Uwider }r (KXgennaior KXfebbraior KXmarzor KXapriler KXmaggior KXgiugnor KXLuglior KXagostor K X settembrer K Xottobrer K Xnovembrer K Xdicembrer uU abbreviatedr }r (KXgenr KXfebr KXmarr KXaprr KXmagr KXgiur KXlugr KXagor K Xsetr K Xottr K Xnovr K Xdicr uuuUcurrency_formatsr }r Nh()r }r (h+Nh-Kh.KKr h0h1h1r h3KKr h5X ¤ #,##0.00r h7X¤ r X-¤ r r h:Nh;KKr ubsUdaysr }r (U stand-aloner }r (Uwider }r (KXLunedìr KXMartedìr KX Mercoledìr KXGiovedìr KXVenerdìr KXSabator KXDomenicar uUnarrowr }r (KjKj?Kj?Kj KXVr Kj Kj uuUformatr }r (Uwider }r (KXlunedìr KXmartedìr! KX mercoledìr" KXgiovedìr# KXvenerdìr$ KXsabator% KXdomenicar& uU abbreviatedr' }r( (KXlunr) KXmarr* KXmerr+ KXgior, KXvenr- KXsabr. KXdomr/ uuuU meta_zonesr0 }r1 (U Turkmenistanr2 }r3 (Ucommonr4 Ulongr5 }r6 (Udaylightr7 XTurkmenistan Summer Timer8 Ustandardr9 XTurkmenistan Timer: uuU Kuybyshevr; }r< (j4 j5 }r= (j7 XKuybyshev Summer Timer> j9 XKuybyshev Timer? uuUArabianr@ }rA (UshortrB }rC (j7 X ADT araborD j9 XST araborE uj4 j5 }rF (UgenericrG X Arabian TimerH j7 XArabian Daylight TimerI j9 XArabian Standard TimerJ uuUAustralia_EasternrK }rL (j4 j5 }rM (jG XEastern Australia TimerN j7 XAustralian Eastern Daylight TimrO j9 X Australian Eastern Standard TimerP uuU ArgentinarQ }rR (j4 j5 }rS (j7 XArgentina Summer TimerT j9 XArgentina TimerU uuU Alaska_HawaiirV }rW (j4 j5 }rX (j7 XAlaska-Hawaii Daylight TimerY j9 XAlaska-Hawaii Standard TimerZ uuUAzoresr[ }r\ (j4 j5 }r] (j7 XAzores Summer Timer^ j9 X Azores Timer_ uuUPierre_Miquelonr` }ra (j4 j5 }rb (jG XPierre and Miquelon Timerc j7 X!Pierre and Miquelon Daylight Timerd j9 X!Pierre and Miquelon Standard Timere uuUEurope_Centralrf }rg (j4 j5 }rh (j7 XOra Legale Europa Centraleri j9 XOra Standard Europa Centralerj uuU Aktyubinskrk }rl (j4 j5 }rm (j7 XAktyubinsk Summer Timern j9 XAktyubinsk Timero uuUBeringrp }rq (jB }rr (j7 X BDT Beringrs j9 X BST Beringrt uj4 j5 }ru (jG X Bering Timerv j7 XBering Daylight Timerw j9 XBering Standard Timerx uuU Qyzylordary }rz (j4 j5 }r{ (j7 XQyzylorda Summer Timer| j9 XQyzylorda Timer} uuUFrunzer~ }r (j4 j5 }r (j7 XFrunze Summer Timer j9 X Frunze Timer uuUChinar }r (jB }r (j7 X CDT (Cina)r j9 X CST (Cina)r uj4 j5 }r (j7 XOra Legale Cinar j9 XOra Standard Cinar uuUYerevanr }r (j4 j5 }r (j7 XYerevan Summer Timer j9 X Yerevan Timer uuUKashgarr }r (j4 j5 }r j9 X Kashgar Timer suU East_Timorr }r (j4 j5 }r j9 XEast Timor Timer suUAfrica_Easternr }r (j4 j5 }r j9 XEast Africa Timer suU Ashkhabadr }r (j4 j5 }r (j7 XAshkhabad Summer Timer j9 XAshkhabad Timer uuUAlaskar }r (j4 j5 }r (jG X Alaska Timer j7 XOra Legale Alaskar j9 XOra Standard Alaskar uuUAmerica_Easternr }r (j4 j5 }r (jG X Eastern Timer j7 XEastern Daylight Timer j9 XEastern Standard Timer uuUAmerica_Centralr }r (j4 j5 }r (jG X Central Timer j7 XCentral Daylight Timer j9 XCentral Standard Timer uuUPakistanr }r (j4 j5 }r (j7 XPakistan Summer Timer j9 X Pakistan Timer uuUSamoar }r (j4 j5 }r j9 XSamoa Standard Timer suUMacaur }r (j4 j5 }r (j7 XMacau Summer Timer j9 X Macau Timer uuUChamorror }r (j4 j5 }r j9 XChamorro Standard Timer suUGuamr }r (jB }r j9 XGST Guamr sj4 j5 }r j9 XGuam Standard Timer suUIndiar }r (j4 j5 }r j9 XIndia Standard Timer suU Tajikistanr }r (j4 j5 }r j9 XTajikistan Timer suUTurkeyr }r (j4 j5 }r (j7 XTurkey Summer Timer j9 X Turkey Timer uuU Choibalsanr }r (j4 j5 }r (j7 XChoibalsan Summer Timer j9 XChoibalsan Timer uuU Shevchenkor }r (j4 j5 }r (j7 XShevchenko Summer Timer j9 XShevchenko Timer uuU Bangladeshr }r (j4 j5 }r j9 XBangladesh Timer suUGulfr }r (j4 j5 }r j9 XGulf Standard Timer suUDaccar }r (j4 j5 }r j9 X Dacca Timer suUMongoliar }r (j4 j5 }r (j7 XUlan Bator Summer Timer j9 XUlan Bator Timer uuU Samarkandr }r (jB }r (j7 XSAMST Samarkandr j9 XSAMT Samarkandr uj4 j5 }r (j7 XSamarkand Summer Timer j9 XSamarkand Timer uuUIndonesia_Centralr }r (j4 j5 }r j9 XCentral Indonesia Timer suUKorear }r (j4 j5 }r (jG X Korean Timer j7 XKorean Daylight Timer j9 XKorean Standard Timer uuUArgentina_Westernr }r (j4 j5 }r j9 XWestern Argentina Timer suUAmazonr }r (j4 j5 }r (j7 XAmazon Summer Timer j9 X Amazon Timer uuU Dutch_Guianar }r (j4 j5 }r j9 XDutch Guiana Timer suULong_Shur }r (j4 j5 }r j9 X Long-Shu Timer suUArmeniar }r (jB }r (j7 X AMST Armeniar j9 X AMT Armeniar uj4 j5 }r (j7 XArmenia Summer Timer j9 X Armenia Timer uuUGreenland_Westernr }r (j4 j5 }r (j7 XWest Greenland Summer Timer! j9 XWest Greenland Timer" uuUKarachir# }r$ (j4 j5 }r% j9 X Karachi Timer& suUBrasiliar' }r( (j4 j5 }r) (j7 XBrasilia Summer Timer* j9 X Brasilia Timer+ uuUAfrica_Southernr, }r- (j4 j5 }r. j9 XSouth Africa Standard Timer/ suU Newfoundlandr0 }r1 (j4 j5 }r2 (jG XNewfoundland Timer3 j7 XNewfoundland Daylight Timer4 j9 XNewfoundland Standard Timer5 uuU Kyrgystanr6 }r7 (j4 j5 }r8 j9 XKyrgystan Timer9 suUKazakhstan_Westernr: }r; (j4 j5 }r< j9 XWest Kazakhstan Standard Timer= suUAfrica_Centralr> }r? (j4 j5 }r@ j9 XCentral Africa TimerA suUMalaysiarB }rC (j4 j5 }rD j9 X Malaysia TimerE suUJapanrF }rG (j4 j5 }rH (j7 XOra Legale GiapponerI j9 XOra Standard GiapponerJ uuU SverdlovskrK }rL (j4 j5 }rM (j7 XSverdlovsk Summer TimerN j9 XSverdlovsk TimerO uuU KwajaleinrP }rQ (j4 j5 }rR j9 XKwajalein TimerS suUAqtoberT }rU (j4 j5 }rV (j7 XAqtobe Summer TimerW j9 X Aqtobe TimerX uuUKazakhstan_EasternrY }rZ (j4 j5 }r[ j9 XEast Kazakhstan Standard Timer\ suU Yekaterinburgr] }r^ (j4 j5 }r_ (j7 XYekaterinburg Summer Timer` j9 XYekaterinburg Timera uuUEcuadorrb }rc (j4 j5 }rd j9 X Ecuador Timere suUMalayarf }rg (j4 j5 }rh j9 X Malaya Timeri suUAqtaurj }rk (j4 j5 }rl (j7 XAqtau Summer Timerm j9 X Aqtau Timern uuUAmerica_Mountainro }rp (j4 j5 }rq (jG X Mountain Timerr j7 XMountain Daylight Timers j9 XMountain Standard Timert uuUHawaii_Aleutianru }rv (j4 j5 }rw (jG XHawaii-Aleutian Timerx j7 XHawaii-Aleutian Daylight Timery j9 XHawaii-Aleutian Standard Timerz uuUChangbair{ }r| (j4 j5 }r} j9 X Changbai Timer~ suUChiler }r (j4 j5 }r (j7 XChile Summer Timer j9 X Chile Timer uuUDushanber }r (j4 j5 }r (j7 XDushanbe Summer Timer j9 X Dushanbe Timer uuUGeorgiar }r (j4 j5 }r (j7 XGeorgia Summer Timer j9 X Georgia Timer uuUIndonesia_Westernr }r (j4 j5 }r j9 XWestern Indonesia Timer suUGreenland_Easternr }r (j4 j5 }r (j7 XEast Greenland Summer Timer j9 XEast Greenland Timer uuUGMTr }r (j4 j5 }r j9 XGreenwich Mean Timer suUMarshall_Islandsr }r (j4 j5 }r j9 XMarshall Islands Timer suU Uzbekistanr }r (j4 j5 }r (j7 XUzbekistan Summer Timer j9 XUzbekistan Timer uuU Kizilordar }r (j4 j5 }r (j7 XKizilorda Summer Timer j9 XKizilorda Timer uuUAustralia_Westernr }r (j4 j5 }r (jG XWestern Australia Timer j7 X Australian Western Daylight Timer j9 X Australian Western Standard Timer uuUBakur }r (j4 j5 }r (j7 XBaku Summer Timer j9 X Baku Timer uuUEurope_Easternr }r (j4 j5 }r (j7 XOra Legale Europa Orientaler j9 XOra Standard Europa Orientaler uuUBhutanr }r (j4 j5 }r j9 X Bhutan Timer suUBorneor }r (j4 j5 }r (j7 XBorneo Summer Timer j9 X Borneo Timer uuU New_Zealandr }r (j4 j5 }r (jG XNew Zealand Timer j7 XNew Zealand Daylight Timer j9 XNew Zealand Standard Timer uuU Galapagosr }r (j4 j5 }r j9 XGalapagos Timer suU Lord_Hower }r (j4 j5 }r (jG XLord Howe Timer j7 XLord Howe Daylight Timer j9 XLord Howe Standard Timer uuUSurinamer }r (j4 j5 }r j9 X Suriname Timer suUAcrer }r (j4 j5 }r (j7 XAcre Summer Timer j9 X Acre Timer uuUIsraelr }r (j4 j5 }r (j7 XOra Legale Israeler j9 XOra Standard Israeler uuUAfrica_Westernr }r (j4 j5 }r (j7 XWest Africa Summer Timer j9 XWest Africa Timer uuUTashkentr }r (j4 j5 }r (j7 XTashkent Summer Timer j9 X Tashkent Timer uuUIndonesia_Easternr }r (j4 j5 }r j9 XEastern Indonesia Timer suUAustralia_Centralr }r (j4 j5 }r (jG XCentral Australia Timer j7 X Australian Central Daylight Timer j9 X Australian Central Standard Timer uuUAtlanticr }r (j4 j5 }r (jG X Atlantic Timer j7 XAtlantic Daylight Timer j9 XAtlantic Standard Timer uuU North_Marianar }r (j4 j5 }r j9 XNorth Mariana Islands Timer suULankar }r (j4 j5 }r j9 X Lanka Timer suUEurope_Westernr }r (j4 j5 }r (j7 XWestern European Summer Timer j9 XWestern European Timer uuUHawaiir }r (j4 j5 }r (jG X Hawaii Timer j7 XOra Legale Hawaiir j9 XOra Standard Hawaiir uuUUrumqir }r (j4 j5 }r j9 X Urumqi Timer suUAmerica_Pacificr }r (j4 j5 }r (jG X Pacific Timer j7 XPacific Daylight Timer j9 XPacific Standard Timer uuUTbilisir }r (j4 j5 }r (j7 XTbilisi Summer Timer j9 X Tbilisi Timer uuUSamarar }r (j4 j5 }r (j7 XSamara Summer Timer j9 X Samara Timer uuUGreenland_Centralr! }r" (j4 j5 }r# (j7 XCentral Greenland Summer Timer$ j9 XCentral Greenland Timer% uuUUralskr& }r' (j4 j5 }r( (j7 XUral'sk Summer Timer) j9 X Ural'sk Timer* uuUYukonr+ }r, (j4 j5 }r- (jG X Yukon Timer. j7 XYukon Daylight Timer/ j9 XYukon Standard Timer0 uuuUerasr1 }r2 (Uwider3 }r4 (KXa.C.r5 KXd.Cr6 uU abbreviatedr7 }r8 (KXaCr9 KXdCr: uuu.PK[ %site-packages/babel/localedata/aa.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXsaakuqUpmqXcarraquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UaaqAXQafarqBUruqCXRussianqDUfrqEXFrenchqFUenqGXEnglishqHUzhqIXChineseqJUptqKX PortugueseqLUdeqMXGermanqNUitqOXItalianqPUarqQXArabicqRUhiqSXHindiqTUjaqUXJapaneseqVUesqWXSpanishqXuU territoriesqY}qZ(URUq[XRussiaq\UFRq]XFranceq^UDJq_XYabuutiq`UCNqaXChinaqbUDEqcXGermanyqdUJPqeXJapanqfUITqgXItalyqhUUSqiX United StatesqjUGBqkXUnited KingdomqlUBRqmXBrazilqnUINqoXIndiaqpUETqqXOtobbiaqrUERqsXEretriaqtuUdecimal_formatsqu}qvU date_formatsqw}qx(Umediumqyh))qz}q{(h,X dd-MMM-yyyyq|h.X%(dd)s-%(MMM)s-%(yyyy)sq}ubUfullq~h))q}q(h,XEEEE, MMMM dd, yyyyqh.X#%(EEEE)s, %(MMMM)s %(dd)s, %(yyyy)squbUlongqh))q}q(h,X dd MMMM yyyyqh.X%(dd)s %(MMMM)s %(yyyy)squbUshortqh))q}q(h,Xdd/MM/yyqh.X%(dd)s/%(MM)s/%(yy)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qULatnqXLatinqsUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}q(UUSDqX US DollarqURUBqX Russian RubleqUINRqX Indian RupeeqUCNYqXChinese Yuan RenminbiqUJPYqX Japanese YenqUBRLqXBrazilian RealqUGBPqXBritish Pound SterlingqUEURqXEuroquUmonthsq}q(U stand-aloneq}qUnarrowq}q(KXQqKXNqKXCqKXAqKhKhKhKXLqK XWqK XDqK XXqK XKqusUformatq}q(Uwideq}q(KX Qunxa GarabluqKXKudoqKX Ciggilta KudoqKX Agda BaxisqKX Caxah AlsaqKX Qasa DirriqKX Qado DirriqKXLiiqenqK XWaysuqK XDiteliqK XXimoliqK X Kaxxa GarabluquU abbreviatedq}q(KXQunqKXNahqKXCigqKXAgdqKXCaxqKXQasqKXQadqKXLeqqK XWayqK XDitqK XXimqK XKaxquuuUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqh,X ¤#,##0.00qUprefixqX¤qX-¤qqUexp_plusqNUgroupingqKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KXEqKXTqKhKhKXGqKXSqKhusUformatq}q(Uwideq}q(KXEtleeniqKXTalaataqKXArbaqaqKXKamiisiqKXGumqatarKXSabtirKXAcaadaruU abbreviatedr}r(KXEtlrKXTalrKXArbrKXKamrKXGumr KXSabr KXAcar uuuU meta_zonesr }r Uerasr}rU abbreviatedr}r(KXYaasuusuk DumarKXYaasuusuk Wadirrusu.PK[F$(site-packages/babel/localedata/ar_LY.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[D))(site-packages/babel/localedata/km_KH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[:S(site-packages/babel/localedata/es_CL.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXH:mm:ssqUformatqX%(H)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vqhX%(HH)s:%(mm)s:%(ss)s %(v)squbUlongqh)q}q (hX H:mm:ss zq!hX%(H)s:%(mm)s:%(ss)s %(z)sq"ubUshortq#h)q$}q%(hXH:mmq&hX %(H)s:%(mm)sq'ubuU languagesq(}q)(Uiraq*Xiraníesq+Uarnq,X mapudungunq-uU territoriesq.}q/(UPSq0XTerritorio Palestinoq1UAZq2X Azerbayánq3UTZq4X Tanzaníaq5UEHq6XSahara Occidentalq7UANq8XAntillas Holandesasq9U005q:X Sudaméricaq;USAqXRumaniaq?uUdecimal_formatsq@}qAU date_formatsqB}qC(UmediumqDh)qE}qF(hX dd-MM-yyyyqGhX%(dd)s-%(MM)s-%(yyyy)sqHubUshortqIh)qJ}qK(hXdd-MM-yyqLhX%(dd)s-%(MM)s-%(yy)sqMubuUcurrency_symbolsqN}qOUCLPqPX$qQsU time_zonesqR}qSUscriptsqT}qUUBaliqVXbalinésqWsUvariantsqX}qYUnumber_symbolsqZ}q[Ucurrency_namesq\}q]hPX Peso Chilenoq^sUmonthsq_}q`Ucurrency_formatsqa}qbNcbabel.numbers NumberPattern qc)qd}qe(Uexp_precqfNUscaleqgKU frac_precqhKKqiUsuffixqjXqkhkqlUint_precqmKKqnhX ¤#,##0.00qoUprefixqpX¤qqX¤-qrqsUexp_plusqtNUgroupingquKKqvubsUdaysqw}qxU meta_zonesqy}qzUerasq{}q|u.PK[_.ll(site-packages/babel/localedata/en_GU.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll*site-packages/babel/localedata/ku_Arab.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[W o(site-packages/babel/localedata/en_NZ.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q (Upatternq!X d/MM/yyyyq"Uformatq#X%(d)s/%(MM)s/%(yyyy)sq$ubUfullq%h)q&}q'(h!XEEEE, d MMMM yyyyq(h#X!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)sq)ubUlongq*h)q+}q,(h!X d MMMM yyyyq-h#X%(d)s %(MMMM)s %(yyyy)sq.ubUshortq/h)q0}q1(h!Xd/MM/yyq2h#X%(d)s/%(MM)s/%(yy)sq3ubuUcurrency_symbolsq4}q5(UUSDq6XUS$q7UNZDq8X$q9uU time_zonesq:}q;Uscriptsq<}q=Uvariantsq>}q?Unumber_symbolsq@}qAUcurrency_namesqB}qCUmonthsqD}qEUcurrency_formatsqF}qGNcbabel.numbers NumberPattern qH)qI}qJ(Uexp_precqKNUscaleqLKU frac_precqMKKqNUsuffixqOXqPhPqQUint_precqRKKqSh!X ¤#,##0.00qTUprefixqUX¤qVX-¤qWqXUexp_plusqYNUgroupingqZKKq[ubsUdaysq\}q]U meta_zonesq^}q_(UAustralia_Centralq`}qaUcommonqbsUAustralia_CentralWesternqc}qdhbsU New_Zealandqe}qfhbsUAustralia_Westernqg}qhhbsUAustralia_Easternqi}qjhbsuUerasqk}qlu.PK[J***&site-packages/babel/localedata/wal.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX ማለዶqUpmqXቃማquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UruqAX ራሽኛqBUfrqCXፈረንሳይኛqDUenqEXእንግሊዝኛqFUzhqGX ቻይንኛqHUptqIXፖርቱጋሊኛqJUdeqKX ጀርመንqLUitqMXጣሊያንኛqNUhiqOX ሐንድኛqPUwalqQXወላይታቱqRUarqSX ዐርቢኛqTUjaqUX ጃፓንኛqVUesqWX ስፓኒሽqXuU territoriesqY}qZ(UBEq[X ቤልጄምq\UBGq]Xቡልጌሪያq^UBAq_X)ቦስኒያ እና ሄርዞጎቪኒያq`UBBqaXባርቤዶስqbUBMqcX ቤርሙዳqdUBOqeX ቦሊቪያqfUBHqgX ባህሬንqhUBTqiX ቡህታንqjUJMqkX ጃማይካqlUJOqmX ጆርዳንqnUBRqoX ብራዚልqpUBYqqX ቤላሩስqrUBZqsX ቤሊዘqtURUquX ራሺያqvUTLqwXምስራቅ ቲሞርqxUROqyX ሮሜኒያqzUGWq{X ቢሳዎq|UGRq}X ግሪክq~UGQqXኢኳቶሪያል ጊኒqUJPqX ጃፓንqUGYqX ጉያናqUGFqXየፈረንሳይ ጉዊአናqUGEqX ጆርጂያqUGBqXእንግሊዝqUGNqXጊኒqUGMqX ጋምቢያqUTNqX ቱኒዚያqUHRqXክሮኤሽያqUHTqX ሀይቲqUHUqX ሀንጋሪqUHKqXሆንግ ኮንግqUVEqXቬንዙዌላqUPRqXፖርታ ሪኮqUPFqX"የፈረንሳይ ፖሊኔዢያqUPGqXፓፑዋ ኒው ጊኒqUPEqXፔሩqUSOqX ሱማሌqUPLqX ፖላንድqUZMqX ዛምቢያqUEHqXምዕራባዊ ሳህራqUEEqXኤስቶኒያqUEGqX ግብጽqUZAqXደቡብ አፍሪካqUECqX ኢኳዶርqUITqX ጣሊያንqUETqXኢትዮጵያqUESqX ስፔንqUERqX ኤርትራqUMDqX ሞልዶቫqUMAqX ሞሮኮqUUZqXዩዝበኪስታንqUMOqX ማካዎqUMNqXሞንጎሊያqUMKqXማከዶኒያqUMUqX ማሩሸስqUMTqX ማልታqUMRqXሞሪቴኒያqUUGqX ዩጋንዳqUMYqX ማሌዢያqUMXqX ሜክሲኮqUILqXእስራኤልqUFRqXፈረንሳይqUFIqXፊንላንድqUFJqXፊጂqUFMqXሚክሮኔዢያqUNLqXኔዘርላንድqUNOqX ኖርዌqUNAqX ናሚቢያqUNCqXኒው ካሌዶኒያqUNGqXናይጄሪያqUNZqXኒው ዚላንድqUNPqX ኔፓልqUCHqXስዊዘርላንድqUCOqXኮሎምቢያqUCNqX ቻይናqUCMqX ካሜሩንqUCLqXቺሊqUCFqX2የመካከለኛው አፍሪካ ሪፐብሊክqUCDqX ኮንጎqUCZqXቼክ ሪፑብሊክqUCYqXሳይፕረስqUCSqX ሰርቢያqUCVqXኬፕ ቬርዴrUSYrX ሲሪያrUKHrXካምቦዲያrUKMrX ኮሞሮስrUSKrXስሎቫኪያrUKRr Xሰሜን ኮሪያr USIr Xስሎቬኒያr UKPr Xደቡብ ኮሪያrUKWrX ክዌትrUSNrX ሴኔጋልrUSArXሳውድአረቢያrUSGrXሲንጋፖርrUSErX ስዊድንrUSDrX ሱዳንrUDOrXዶሚኒክ ሪፑብሊክrUDMrX ዶሚኒካrUDKrXዴንማርክr UDEr!X ጀርመንr"UYEr#X የመንr$UDZr%Xአልጄሪያr&UUSr'X አሜሪካr(ULBr)X ሊባኖስr*UTTr+X ትሪኒዳድ እና ቶባጎr,UTRr-X ቱርክr.ULVr/X ላትቪያr0ULTr1Xሊቱዌኒያr2UTJr3Xታጃኪስታንr4UTHr5Xታይላንድr6UTFr7X,የፈረንሳይ ደቡባዊ ግዛቶችr8UTDr9Xቻድr:ULYr;X ሊቢያr<UAEr=X,የተባበሩት አረብ ኤምሬትስr>UADr?X አንዶራr@UVGrAX,የእንግሊዝ ድንግል ደሴቶችrBUIQrCX ኢራቅrDUVIrEX)የአሜሪካ ቨርጂን ደሴቶችrFUISrGXአይስላንድrHUAMrIXአርሜኒያrJUALrKXአልባኒያrLUANrMX%ኔዘርላንድስ አንቲልስrNUARrOXአርጀንቲናrPUAUrQXአውስትሬሊያrRUATrSXኦስትሪያrTUINrUX ህንድrVUTZrWXታንዛኒያrXUAZrYXአዘርባጃንrZUIEr[Xአየርላንድr\UIDr]Xኢንዶኔዢያr^uUdecimal_formatsr_}r`U date_formatsra}rb(Umediumrch))rd}re(h,X dd-MMM-yyyyrfh.X%(dd)s-%(MMM)s-%(yyyy)srgubUfullrhh))ri}rj(h,X EEEE፥ dd MMMM ጋላሳ yyyy Grkh.X4%(EEEE)s፥ %(dd)s %(MMMM)s ጋላሳ %(yyyy)s %(G)srlubUlongrmh))rn}ro(h,X dd MMMM yyyyrph.X%(dd)s %(MMMM)s %(yyyy)srqubUshortrrh))rs}rt(h,Xdd/MM/yyruh.X%(dd)s/%(MM)s/%(yy)srvubuUcurrency_symbolsrw}rxU time_zonesry}rzUscriptsr{}r|ULatnr}X ላቲንr~sUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UJPYrXየጃፓን የንrUUSDrXየአሜሪካን ዶላርrURUBrXየራሻ ሩብልrUINRrXየሕንድ ሩፒrUCNYrX&የቻይና ዩአን ረንሚንቢrUETBrXየኢትዮጵያ ብርrUBRLrXየብራዚል ሪልrUGBPrX2የእንግሊዝ ፓውንድ ስተርሊንግrUEURrX አውሮruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXጃrKXፌrKXማrKXኤrKXሜrKXጁrKXጁrKXኦrK XሴrK XኦrK XኖrK XዲrusUformatr}r(Uwider}r(KXጃንዩወሪrKXፌብሩወሪrKX ማርችrKX ኤፕረልrKXሜይrKXጁንrKX ጁላይrKX ኦገስትrK XሴፕቴምበርrK XኦክተውበርrK XኖቬምበርrK XዲሴምበርruU abbreviatedr}r(KX ጃንዩrKX ፌብሩrKX ማርችrKX ኤፕረrKXሜይrKXጁንrKX ጁላይrKX ኦገስrK X ሴፕቴrK X ኦክተrK X ኖቬምrK X ዲሴምruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrjrUint_precrKKrh,X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXሳrKXማrKXአrKXሃrKXአrKXቄrKXወrusUformatr}r(Uwider}r(KX ሳይኖrKX ማቆሳኛrKX አሩዋrKX ሃሙሳrKX አርባrKXቄራrKXወጋruU abbreviatedr}r(KX ሳይኖrKX ማቆሳrKX አሩዋrKX ሃሙሳrKX አርባrKXቄራrKXወጋruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KX አዳ ዎዴrKXግሮተታ ላይታrusu.PK[Rll(site-packages/babel/localedata/xh_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/ro_RO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[r8^^(site-packages/babel/localedata/uz_AF.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (U weekend_startq KU first_dayq KU weekend_endq KuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq }q!u.PK[br%site-packages/babel/localedata/gu.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXપેહલા હંત 1q KXડૂસઋા હંત 2q KXતીસઋા હંત 3qKXચૌતા હંત 4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX)પૂર્વ મધ્યાહ્નqUpmqX)ઉત્તર મધ્યાહ્નquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X hh:mm:ss aqAUformatqBX%(hh)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X hh:mm:ss a vqGhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X hh:mm:ss a zqLhBX %(hh)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xhh:mm aqQhBX%(hh)s:%(mm)s %(a)sqRubuU languagesqS}qT(UguqUXગુજરાતીqVUgdqWX0ગેલિક (સ્કૉટલૅન્ડ)qXUgaqYXઆયરિશqZUgnq[Xગ્વારનીq\Uglq]Xગૅલિશિયનq^Ulaq_Xલૅટિનq`UlnqaXલિંગાલાqbUloqcXલૅઓથિયનqdUtrqeXતુર્કીqfUlvqgXલાતવીqhUltqiXલિથ્વેનિયનqjUtkqkXતુર્કમિનqlUthqmX થાઇqnUtiqoXટગ્રિન્યાqpUteqqXતેલુગુqrUpt_PTqsX0પોર્ચગીઝ (પોર્ચગલ)qtUfilquXફિલિપિનોqvUtaqwX તમિલqxUyiqyXયિડિશqzUpt_BRq{X0પોર્ચગીઝ (બ્રાઝિલ)q|Udeq}Xજર્મનq~UdaqXડૅનિશqUelqXગ્રીકqUeoqX!ઍસ્પૅરેન્તોqUenqXઅંગ્રેજીqUeuqXબાસ્કqUetqXએસ્ટોનિયનqUesqXસ્પેનિસqUruqX રૂસીqUroqXરોમૅનિયનqUbnqXબંગાળીqUbeqXબેલરૂશિયનqUbgqXબલ્ગેરિયનqUukqXયુક્રેનિયનqUjvqXજાવાનીઝqUbhqXબિહારીqUbrqXબ્રેટોનqUbsqXબૉઝ્નિયનqUjaqXજાપાનીqUocqXઑક્સીટૅનqUtwqX ટ્વીqUorqXઊડિયાqUxhqX કોસાqUcaqXકેટલૅનqUcyqXવેલ્શqUcsqX ચેકqUpsqXપાશ્તુનqUptqXપોર્ચગીઝqUpaqXપંજાબીqUviqXવિયેતનામીqUplqXપોલિશqUhyqXઆર્મેનિયનqUhrqXક્રોએશિયનqUhuqXહંગેરિયનqUhiqXહિન્દીqUheqXહીબ્રૂqUuzqXઉઝબેકqUmlqXમળયાલમqUmnqXમોંગોલિયનqUmkqXમૅસિડોનિયનqUmtqXમાલ્ટીqUmsqX મલયqUmrqXમરાઠીqUugqXવિગ઼ુરqUbhoqXભોજપુરીqUafqXઆફ્રિકીqUswqXસ્વાહિલીqUisqXઆઇસલૅન્ડિકqUamqX6ઍમ્હૅરિક (ઈથિયોપિયા)qUitqXઇટાલિયનqUsvqXસ્વીડીશqUasqXઆસામીqUarqX અરબીqUsuqXસુન્ડનીઝqUzuqX ઝુલુqUiaqXઇન્ટરલિંગાqUazqXઍઝરબૈજાનીqUidqX!ઇન્ડોનેશિયનqUnlqX ડચ્ચqUnnqX<નોર્વેજિયન (નુનોર્સ્ક)qUnoqXનોર્વેજિયનqUneqXનેપાળીqUfrqXફ્રેંચqUfyqXફ્રિઝનqUfaqX'ફારસી (પર્શિયન)qUfiqXફિન્નિશrUkyrXકિર્ગિઝrUforXફારોઈઝrUkarXજ્યોર્જિયનrUsrrXસર્બિયનrUsqr Xઆલ્બેનિયનr Ukor Xકોરીયનr Uknr Xકન્નડrUkmrXકમ્બોડિયનrUstrXસેસોથોrUskrXસ્લોવૅકrUsirXસિંહાલીrUshrX+સર્બો-ક્રોએશ્યનrUsorXસોમાલીrUkurXકુર્ડિશrUslrXસ્લોવેનિયનrUsarXસંસ્કૃતr Usdr!Xસિંધીr"uU territoriesr#}r$(UCNr%X ચીનr&UEGr'X મિસરr(UDEr)Xજમિનીr*UTRr+Xતુર્કસ્તાનr,UUSr-X8સંયુકત રાજ્ય અમેરિકાr.UGEr/Xજ્યોર્જીયાr0UTMr1X*તુર્ક્મનિસ્તાનr2UINr3X ભારતr4UNPr5Xનેપાળr6UPKr7Xકરાંચીr8uUdecimal_formatsr9}r:Nh )r;}r<(h#Nh$Kh%KKr=h'h/h/r>h*KKr?h,X #,##,##0.###r@h.h/h0rAh2Nh3KKrBubsU date_formatsrC}rD(UmediumrEh>)rF}rG(h,X dd-MM-yyyyrHhBX%(dd)s-%(MM)s-%(yyyy)srIubUfullrJh>)rK}rL(h,XEEEE d MMMM yyyyrMhBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srNubUlongrOh>)rP}rQ(h,X d MMMM yyyyrRhBX%(d)s %(MMMM)s %(yyyy)srSubUshortrTh>)rU}rV(h,Xd-MM-yyrWhBX%(d)s-%(MM)s-%(yy)srXubuUcurrency_symbolsrY}rZUINRr[Xરુr\sU time_zonesr]}r^Uscriptsr_}r`(UArabraXઅરેબીrbUArmnrcXઅર્મેનિયાઈrdUBengreXબંગાળીrfuUvariantsrg}rhUnumber_symbolsri}rjUnativeZeroDigitrkX૦rlsUcurrency_namesrm}rnUmonthsro}rp(U stand-alonerq}rrUnarrowrs}rt(KX1ruKX2rvKX3rwKX4rxKX5ryKX6rzKX7r{KX8r|K X9r}K X10r~K X11rK X12rusUformatr}r(Uwider}r(KXજાન્યુઆરીrKXફેબ્રુઆરીrKXમાર્ચrKXએપ્રિલrKXમેrKX જૂનrKXજુલાઈrKXઑગસ્ટrK Xસપ્ટેમ્બરrK Xઑક્ટ્બરrK Xનવેમ્બરrK Xડિસેમ્બરruU abbreviatedr}r(KXજાન્યુrKXફેબ્રુrKXમાર્ચrKXએપ્રિલrKXમેrKX જૂનrKXજુલાઈrKXઑગસ્ટrK Xસપ્ટેrK Xઑક્ટોrK X નવેrK X ડિસેruuuUcurrency_formatsr}rNh )r}r(h#Nh$Kh%KKrh'h/h/rh*KKrh,X¤ #,##,##0.00rh.X¤ rX-¤ rrh2Nh3KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjvKjwKjxKjyKjzKj{KjuusUformatr}r(Uwider}r(KXસોમવારrKXમંગળવારrKXબુધવારrKXગુરુવારrKXશુક્રવારrKXશનિવારrKXરવિવારruU abbreviatedr}r(KX સોમrKX મંગળrKX બુધrKX ગુરુrKXશુક્રrKX શનિrKX રવિruuuU meta_zonesr}rUerasr}r(Uwider}r(KXઈસાપૂઋ્વ.rKXસન.ruU abbreviatedr}r(KXBCErKXCEruuu.PK[1ll(site-packages/babel/localedata/sv_SE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[=(site-packages/babel/localedata/de_AT.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Ufullqcbabel.dates DateTimePattern q)q}q (Upatternq!XEEEE, dd. MMMM yyyyq"Uformatq#X#%(EEEE)s, %(dd)s. %(MMMM)s %(yyyy)sq$ubUlongq%h)q&}q'(h!X dd. MMMM yyyyq(h#X%(dd)s. %(MMMM)s %(yyyy)sq)ubuUcurrency_symbolsq*}q+U time_zonesq,}q-Uscriptsq.}q/Uvariantsq0}q1Unumber_symbolsq2}q3Ucurrency_namesq4}q5Umonthsq6}q7Uformatq8}q9(Uwideq:}q;KXJännerq(KXJänq?KXMärq@uusUcurrency_formatsqA}qBNcbabel.numbers NumberPattern qC)qD}qE(Uexp_precqFNUscaleqGKU frac_precqHKKqIUsuffixqJXqKhKqLUint_precqMKKqNh!X ¤ #,##0.00qOUprefixqPX¤ qQX-¤ qRqSUexp_plusqTNUgroupingqUKKqVubsUdaysqW}qXU meta_zonesqY}qZUerasq[}q\u.PK[Rll(site-packages/babel/localedata/pl_PL.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[(site-packages/babel/localedata/ar_LB.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}qUcurrency_symbolsq}qU time_zonesq}q Uscriptsq!}q"UItalq#X#اللأيطالية القديمةq$sUvariantsq%}q&Unumber_symbolsq'}q(Ucurrency_namesq)}q*Umonthsq+}q,Uformatq-}q.(Uwideq/}q0(KXكانون الثانيq1KXشباطq2KXآذارq3KX نيسانq4KXنوارq5KX حزيرانq6KXتموزq7KXآبq8K X أيلولq9K Xتشرين الأولq:K Xتشرين الثانيq;K Xكانون الأولq(KXكانون الثانيq?KXشباطq@KXآذارqAKX نيسانqBKXنوارqCKX حزيرانqDKXتموزqEKXآبqFK X أيلولqGK Xتشرين الأولqHK Xتشرين الثانيqIK Xكانون الأولqJuusUcurrency_formatsqK}qLUdaysqM}qNUformatqO}qPU abbreviatedqQ}qR(KXالاثنينqSKXالثلاثاءqTKXالأربعاءqUKX الخميسqVKX الجمعةqWKX السبتqXKX الأحدqYussU meta_zonesqZ}q[Uerasq\}q]u.PK[Rll)site-packages/babel/localedata/nso_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99-site-packages/babel/localedata/ug_Arab_CN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[{==(site-packages/babel/localedata/hi_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll-site-packages/babel/localedata/ha_Latn_NE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[QQ(site-packages/babel/localedata/aa_DJ.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}qUcurrency_symbolsq}qUETBqXETBq sU time_zonesq!}q"Uscriptsq#}q$Uvariantsq%}q&Unumber_symbolsq'}q(Ucurrency_namesq)}q*Umonthsq+}q,Uformatq-}q.Uwideq/}q0(KXLeqeeniq1KX Naharsi Kudoq2KX Agda Baxissoq3ussUcurrency_formatsq4}q5Udaysq6}q7U meta_zonesq8}q9Uerasq:}q;u.PK[99-site-packages/babel/localedata/pa_Arab_PK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Np %site-packages/babel/localedata/ku.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}q(UguqXگوجاراتیqUgdqX%گه‌لیكی سكۆتله‌ندیqUgaqXئیرله‌ندیqUgnqXگووارانیqUglqX گالیسیq Ulaq!X لاتینیq"Ulnq#Xلينگالاq$Uloq%X لاو‏ىq&Utrq'X توركیq(Ulvq)X لێتۆنیq*Ultq+Xلیتوانیq,Utkq-Xتروكمانیq.Uthq/Xتایله‌ندیq0Utiq1Xتیگرینیایq2Uteq3Xته‌لۆگویq4Upt_PTq5X%پورتوگاڵی (پورتوگاڵ)q6Ufilq7Xتاگالۆگیq8Utaq9X تامیلیq:Uyiq;X یوددیqUdeq?Xئاڵمانیq@UdaqAXدانماركیqBUelqCX یۆنانیqDUeoqEXئێسپیرانتۆqFUenqGXئینگلیزیqHUeuqIX باسكیqJUetqKXئیستۆنیqLUesqMXئیسپانیqNUruqOX ڕووسیqPUroqQX ڕۆمانیqRUbnqSXبه‌نگلادێشیqTUbeqUXبێلاڕووسیqVUbgqWXبۆلگاریqXUukqYXئۆكراینیqZUjvq[X جاڤانیq\Ubhq]X بیهاریq^Ubrq_Xبرێتونیq`UbsqaX بۆسنیqbUjaqcX ژاپۆنیqdUocqeXئۆسیتانیqfUtwqgXتویqhUtlhqiXكلینگۆنqjUorqkX ئۆرییاqlUxhqmX سسوساqnUcaqoXكاتالۆنیqpUcyqqX وێلزیqrUcsqsX چه‌كیqtUpsquXپه‌شتووqvUptqwXپۆرتۆگالیqxUpaqyXپه‌نجابیqzUviq{Xڤیه‌تنامیq|Uplq}X(پۆڵۆنیایی (له‌هستانی)q~UhyqXئه رمه نیqUhrqX كرواتیqUhuqX#هه‌نگاری (مه‌جاری)qUhiqX هیندیqUheqX هیبرێqUuzqXئۆزبه‌كیqUmlqXمالایلامqUmnqXمه‌نگۆلیqUmkqXماكێدۆنیqUurqXئۆردو‌وqUmtqXماڵتاییqUmsqX مالیزیqUmrqX ماراتیqUugqXئويخووریqUafqXئه‌فریكایqUswqXسواهیلیqUisqXئیسله‌ندیqUamqXئه‌مهه‌رینجیqUitqX ئیتالیqUsvqX سویدیqUasqXئا سسامی (زوبان)qUarqXعه‌ره‌بیqUkmqXکامبۆجی (زوبان)qUzuqXزولوqUiaqXئینترلینگویqUazqXئازه‌ربایجانیqUieqX$ئه نته ر لينگ (زوبان)qUidqXئێه‌ندونیزیqUnlqXهۆڵه‌ندیqUnoqXنۆروێژیqUneqX نێپالیqUfrqXفه‌رانسیqUfyqX فریسیqUfaqX فارسیqUfiqXفینله‌ندیqUkyqX كرگیزیqUfoqXفه‌رئۆییqUkaqXگۆرجستانیqUsrqX سه‌ربیqUsqqXئاڵبانیqUkoqXكۆریqUknqXكه‌نه‌داییqUsuqX سودانیqUstqX سێسۆتۆqUskqXسلۆڤاكیqUsiqXسینهه‌لیqUshqXسێربۆكرواتیqUsoqX سۆمالیqUkuqX كوردیqUslqXسلۆڤێنیqUsaqXسانسکريتqUsdqXسيندی(زوبان)quU territoriesq}qUdecimal_formatsq}qU date_formatsq}qUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}qUmonthsq}qUcurrency_formatsq}qUdaysq}qU meta_zonesq}rUerasr}ru.PK[Rll)site-packages/babel/localedata/kpe_GN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK["ll)site-packages/babel/localedata/tig_ER.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[]N  %site-packages/babel/localedata/kl.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@UklqAX kalaallisutqBsU territoriesqC}qDUGLqEXKalaallit NunaatqFsUdecimal_formatsqG}qHU date_formatsqI}qJ(UmediumqKh))qL}qM(h,X MMM dd, yyyyqNh.X%(MMM)s %(dd)s, %(yyyy)sqOubUfullqPh))qQ}qR(h,XEEEE dd MMMM yyyyqSh.X!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)sqTubUlongqUh))qV}qW(h,X dd MMMM yyyyqXh.X%(dd)s %(MMMM)s %(yyyy)sqYubUshortqZh))q[}q\(h,Xdd/MM/yyq]h.X%(dd)s/%(MM)s/%(yy)sq^ubuUcurrency_symbolsq_}q`UDKKqaXkrqbsU time_zonesqc}qdUscriptsqe}qfUvariantsqg}qhUnumber_symbolsqi}qj(UdecimalqkX,qlUgroupqmX.qnuUcurrency_namesqo}qpUmonthsqq}qr(U stand-aloneqs}qtUnarrowqu}qv(KX1qwKX2qxKX3qyKX4qzKX5q{KX6q|KX7q}KX8q~K X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXjanuariqKXfebruariqKXmartsiqKXapriliqKXmajiqKXjuniqKXjuliqKX augustusiqK X septemberiqK XoktoberiqK X novemberiqK X decemberiquU abbreviatedq}q(KXjanqKXfebqKXmarqKXaprqKXmajqKXjunqKXjulqKXaugqK XsepqK XoktqK XnovqK XdecquuuUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqh,X ¤#,##0.00qUprefixqX¤qX¤-qqUexp_plusqNUgroupingqKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhxKhyKhzKh{Kh|Kh}KhwusUformatq}q(Uwideq}q(KXataasinngorneqqKX marlunngorneqqKXpingasunngorneqqKXsisamanngorneqqKXtallimanngorneqqKXarfininngorneqqKXsabaatquU abbreviatedq}q(KXataqKXmarqKXpinqKXsisqKXtalqKXarfqKXsabquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[ KfKf%site-packages/babel/localedata/mk.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAXгуџаратиqBUgdqCXшкотско галскиqDUgaqEX ирскиqFUgnqGXгуараниqHUglqIXгалицискиqJUlaqKXлатинскиqLUtwqMX:тви (диалект на аканскиот јазик)qNUtrqOX турскиqPUlvqQXлатвискиqRUltqSXлитванскиqTUtkqUXтуркменистанскиqVUthqWXтајландскиqXUtiqYXтигрејскиqZUteq[X телугуq\Upt_PTq]X4португалски (во Португалија)q^Ufilq_X%тагалог (филипински)q`UtaqaXтамилскиqbUyiqcX јидскиqdUpt_BRqeX*португалски (во Бразил)qfUdeqgXгерманскиqhUdaqiX данскиqjUelqkX грчкиqlUeoqmXесперантоqnUenqoXанглискиqpUzhqqXкинескиqrUeuqsXбаскискиqtUetquXестонскиqvUesqwXшпанскиqxUruqyX рускиqzUroq{Xроманскиq|Ubnq}Xбенгалскиq~UbeqXбелорускиqUbgqXбугарскиqUukqXукраинскиqUjvqXјаванскиqUbhqX бихариqUbrqXбретонскиqUbsqXбосанскиqUjaqXјапонскиqUocqXокситанскиqUtlhqXклингонскиqUorqX оријаqUxhqX хаусаqUcaqXкаталонскиqUcyqX велшкиqUcsqX чешкиqUpsqX паштоqUptqXпортугалскиqUpaqXпунџабиqUviqXвиетнамскиqUplqX полскиqUhyqXерменскиqUhrqXхрватскиqUhuqXунгарскиqUhiqX хиндиqUheqXхебрејскиqUuzqXузбечкиqUmlqXмалајаламqUmnqXмонголскиqUmkqXмакедонскиqUurqXурдуqUmtqXмалтешкиqUmsqXмалезискиqUmrqX маратиqUugqXујгурскиqUafqXафриканскиqUkoqXкорејскиqUisqXисландскиqUamqXамхарискиqUitqXиталијанскиqUsvqXшведскиqUasqXасамскиqUarqXарапскиqUzuqXзулуqUiaqXинтерлингваqUazqXазербејџанскиqUidqXиндонезискиqUnlqXхоландскиqUnnqX!норвешки (Ниноршк)qUnoqXнорвешкиqUneqXнепалскиqUfrqXфранцускиqUfyqXфризискиqUfaqXперсискиqUfiqX финскиqUkyqXкиргистанскиqUfoqX фарскиqUkaqXгрузискиqUsrqX српскиqUsqqXалбанскиqUswqXсвахилиqUknqXканнадаqUkmqXкамбоџанскиqUstqX сесотоqUskqXсловачкиqUsiqXсинхалискиrUshrXсрпско-хрватскиrUsorXсомалискиrUkurXкурдскиrUslrXсловенечки јазикrUsar Xсанскритr Usdr X синдиr uU territoriesr }r(UBDrXБангладешrUBErXБелгијаrUBFrXБуркина ФасоrUBGrXБугаријаrUBArX$Босна и ХерцеговинаrUBBrXБарбадосrUWFrX)Волис и Футуна островиrUBMrXБермудиrUBNrX Брунеиr UBOr!XБоливијаr"UBHr#XБахреинr$UBIr%XБурундиr&UBJr'X Бенинr(UBTr)X Бутанr*UJMr+XЈамајкаr,UBVr-X!Боувитови островиr.UBWr/XБоцванаr0UWSr1X Самоаr2UBRr3X Бразилr4UBSr5X Бахамиr6UBYr7XБелорусијаr8UBZr9X Белизеr:URUr;X Русијаr<URWr=X Руандаr>UTLr?XИсточен Тиморr@URErAXРејунионrBUTMrCXТуркменистанrDUTJrEXТаџикистанrFUROrGXРоманијаrHUTKrIXТокелауrJUGWrKXГвинеа-БисаrLUGUrMXГвамrNUGTrOXГватемалаrPUGSrQXEЈужна Џорџија и Јужни Сендвич ОстровиrRUGRrSX ГрцијаrTUGQrUX#Екваторска ГвинејаrVUGPrWXГвадалупеrXUJPrYXЈапонијаrZUGYr[XГвајанаr\UGFr]XФранцуска Гуанаr^UGEr_XЏорџијаr`UGDraXГренадаrbUGBrcXВелика БританијаrdUGAreX ГабонrfUSVrgXЕл СалвадорrhUGNriXГвинејаrjUGMrkXГамбијаrlUGLrmXГренландrnUGIroXГилбартарrpUGHrqXГанаrrUOMrsXОманrtUTNruX ТунисrvUJOrwX ЈорданrxUHRryXХрватскаrzUHTr{X Хаитиr|UHUr}XУнгаријаr~UHKrX!Хон Конг С.А.Р КинаrUHNrXХондурасrUHMrXBХардови острови и Мекдоналд ОстровиrUVErXВенецуелаrUPRrXПорторикоrUPSrX+Палестинска ТериторијаrUPWrX ПалауrUPTrXПортугалијаrUSJrX4Свалбард и Жан Мијен ОстровиrUPYrXПарагвајrUIQrXИракrUPArX ПанамаrUPFrX'Француска ПолинезијаrUPGrX"Папуа Нова ГвинејаrUPErXПеруrUPKrXПакистанrUPHrXФилипиниrUPNrXПиткарнrUPLrX ПолскаrUPMrX#Сент Пјер и МикеланrUZMrXЗамбијаrUEHrXЗападна СахараrUEErXЕстонијаrUEGrX ЕгипетrUZArXЈужна АфрикаrUECrXЕквадорrUITrXИталијаrUVNrXВиетнамrUSBrX'Соломоновите ОстровиrUETrXЕтиопијаrUSOrXСомалијаrUZWrXЗимбабвеrUSArXСаудиска АрабијаrUESrXШпанијаrUERrXЕритрејаrUMDrXМолдоваrUMGrXМадагаскарrUMArX МарокоrUMCrX МонакоrUUZrXУзбекистанrUMMrXМуанмарrUMLrXМалиrUMOrXМакао С.А.Р КинаrUMNrXМонголијаrUMHrX!Маршалови ОСтровиrUMKrXМакедонијаrUMUrXМауритусrUMTrX МалтаrUMWrX МалавиrUMVrXМалдивиrUMQrXМартиникrUMPrX2Северни Маријанини ОстровиrUMSrXМонсератrUMRrXМавританијаrUUGrX УгандаrUMYrXМалезијаrUMXrXМексикоrUILrX ИзраелrUFRrXФранцијаrUIOrXGБританско Индиско Океанска територијаrUSHrXСвета ЕленаrUFIrX ФинскаrUFJrXФиџиrUFKrX#Фокландски ОстровиrUFMrXМикронезијаrUFOrXФарски ОстровиrUNIrXНикаракваrUNLrXХоландијаrUNOrXНорвешкаrUNAr XНамибијаr UVUr X Ванатуr UNCr XНова КаледонијаrUNErX НигерrUNFrXНофролк ОстровrUNGrXНигеријаrUNZrXНов ЗеландrUNPrX НепалrUNRrX НауруrUNUrXНиеrUCKrXКукови ОстровиrUCIrX/Брегот на Слоновата Коскаr UCHr!XШвајцаријаr"UCOr#XКолумбијаr$UCNr%XКинаr&UCMr'XКамерунr(UCLr)XЧилеr*UCCr+XКокосови островиr,UCAr-X Канадаr.UCGr/X Конгоr0UCFr1X4Централан Афричка републикаr2UCDr3X4Демократска Република Конгоr4UCZr5XЧешка Републикаr6UCYr7X Кипарr8UCXr9XБожиќни Островиr:UCSr;X!Србија и Црна Гораr<UCRr=XКостарикаr>UCVr?X%Зеленортски Островиr@UCUrAXКубаrBUSZrCXСвазилендrDUSYrEX СиријаrFUKGrGXКургистанrHUKErIX КенијаrJUSRrKXСуринамrLUKIrMXКирибатиrNUKHrOXКамбоџаrPUKNrQX)Сент Кристофер и НевисrRUKMrSXКоморосrTUSTrUX#Сао Томе и ПринципеrVUSKrWXСловачкаrXUKRrYXЈужна КореаrZUSIr[XСловенијаr\UKPr]XСеверна Кореаr^UKWr_X Кувајтr`USNraXСенегалrbUSMrcXСан МариноrdUSLreXСиера ЛеонеrfUSCrgXСејшелиrhUKZriXКазаџстанrjUKYrkX!Кајманови ОстровиrlUSGrmXСингапурrnUSEroXШведскаrpUSDrqX СуданrrUDOrsX+Доминиканска РепубликаrtUDMruXДоминикаrvUDJrwX ЏибутиrxUDKryX ДанскаrzUVGr{X4Британски Девствени Островиr|UDEr}XГерманијаr~UYErX ЈеменrUDZrX АлжирrUUSrXОбединети ДржавиrUUYrXУругвајrUYTrX МајотеrULBrXЛибанонrULCrXСвета ЛучијаrULArXЛаосrUTVrX ТувалуrUTWrX ТајванrUTTrX Тринидад и ТобагоrUTRrXТурцијаrULKrXШри ЛанкаrULIrXЛихтенштајнrULVrXЛатвијаrUTOrX ТонгаrULTrXЛитванијаrULUrXЛуксембургrULRrXЛибериаrULSrX ЛешотоrUTHrXТајландrUTFrX0Француски Јужни територииrUTGrXТогоrUTDrXЧадrUTCrX'Турк и Каикос ОстровиrULYrX ЛибијаrUVArXВатиканrUVCrX1Сент Винцент и ГренадинитеrUAErX0Обединети Арапски ЕмиратиrUADrX АндораrUAGrX Антигуа и БарбудаrUAFrXАвганистанrUAIrXАнгвилаrUVIrX-Девствени Острови на САДrUISrX ИсландrUIRrXИранrUAMrXЕрменијаrUALrXАлбанијаrUAOrX АнголаrUANrXХоландски АнтилиrUAQrXАнтарктикrUASrX!Американска СамоаrUARrXАргентинаrUAUrXАвстралијаrUATrXАвстријаrUAWrX АрубаrUINrX ИндијаrUTZrXТанзанијаrUAZrXАзејберџанrUIErX ИрскаrUIDrXИндонезијаrUUArXУкраинаrUQArX КватарrUMZrXМозамбеruUdecimal_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrX)rrUint_precrKKrh,X #,##0.###rUprefixrjX(rrUexp_plusrNUgroupingrKKrubsU date_formatsr}r(Umediumrh))r}r(h,X dd.M.yyyyrh.X%(dd)s.%(M)s.%(yyyy)srubUfullrh))r }r (h,XEEEE, dd MMMM yyyyr h.X"%(EEEE)s, %(dd)s %(MMMM)s %(yyyy)sr ubUlongr h))r}r(h,X dd MMMM yyyyrh.X%(dd)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,Xdd.M.yyrh.X%(dd)s.%(M)s.%(yy)srubuUcurrency_symbolsr}r(UCOPrXCol$rUMKDrXMDenrUDZDrXDArUNADrXN$r UKMFr!XCFr"UBGLr#Xlevr$UHNLr%XLr&UFJDr'XF$r(UETBr)XBrr*UCRCr+XCr,UTRLr-XTLr.UBZDr/XBZ$r0UGNFr1XGFr2UIQDr3XIDr4UDOPr5XRD$r6UBAMr7XKMr8ULKRr9XSL Rer:USKKr;XSkr<UCADr=XCan$r>UPKRr?XPrar@ULBPrAXLLrBUHUFrCXFtrDUCYPrEX£CrFUROLrGXleurHUKWDrIXKDrJUBMDrKXBer$rLUBIFrMXFburNUKHRrOXCRrPUMYRrQXRMrRUMNTrSXTugrTUAMDrUXdramrVULYDrWXLDrXUSOSrYXSh.rZUUGXr[XU Shr\UJODr]XJDr^UIEPr_XIR£r`UQARraXQRrbUSARrcXSRlrdUPLNreXZlrfUSEKrgXSKrrhUSGDriXS$rjUHKDrkXHK$rlUGELrmXlarirnUSRGroXSfrpUAFNrqXAfrrUAUDrsX$ArtUCHFruXSwFrvUTZSrwXT ShrxUBEFryXBFrzUIRRr{XRIr|UBBDr}XBDS$r~UBYRrXRblrUKGSrXsomrUYERrXYRlrUGTQrXQrUGYDrXG$rUVEBrXBerUMTLrXLmrUNZDrX$NZrUTWDrXNT$rUZWDrXZ$rUXCDrXEC$rUVUVrXVTrUALLrXlekrUARSrXArg$rUSZLrXErUKZTrXTrUNOKrXNKrrUZARrXRrUBHDrXBDrUINRrXINRrUMXNrXMEX$rUOMRrXROrUSYPrXLSrUJMDrXJ$rUSBDrXSI$rUMZMrXMtrUSCRrXSRrUKESrXK ShrULSLrXMrUNPRrXNrsruU time_zonesr}rUscriptsr}rUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}r(jXАлгериски ДинарrjXНамибиски доларrj!XКоморски доларrUEGPrXЕгипетска Фунтаrj#X"Бугарски цврст левrUBGNrXБугарски нов левrUPABrXПанамска балбоаrjX!Зимбабвиски доларrUGHCrXГанајски СедиrUYUDrX%Југословенски динарrUBWPrXБоцвантска ПулаrjAXЛибиска фунтаrjwX!Танзаниски шилингrUVNDrXВиетнамски донгrUAOArXАнголска КванзаrUWSTrXСамоа талаrUAONrX2Анголска нова Кванза (1990-2000)rjOXКамбоџиски релrjQXМалазиски рингитrUAOKrX)Анголска Кванза (1977-1990)rjYX!Сомалијски шилингrjWXЛибијски динарrUUAHrX#Украинска хривнијаrj]XЈордански динарrjcXСаудиски риалrUFIMrXФинска маркаrjkXХонгкошки доларrjoX!Суринамски гилдерrUTPErXТиморски ескудоrjuXШвајцарски ФранкrUGIPrX#Гибралтарска фунтаrjXБелоруска РубљаrjXАлбански ЛекrUHRKrXХрватска КунаrUHRDrXХрватски динарrUPESrXПеруански солrUBYBrX2Белоруска нова рубља (1994-1999)rUTHBrX Таи батrUBNDrXБрунејски доларrUISKrXИсландска кронаrUZALrX8Јужно афрички ранд(финансиски)rULAKr XЛаоски кипr UNICr X)Никарагванска кордобаr UMZEr X!Мозамбиско ескудоrjXСириска фунтаrUMADrX!Марокански ДирхамrUFRFrXФранцуски франкrUMAFrXМарконски франкrjX#Мозамбиски метикалrUPHPrXФилипински пезосrjX"Јужно афрички рандrUILSrX$Израелски нов шекелrULUFrX#Луксембуршки франкrUBELrX2Белгиски Франк (финансиски)rUBECr X8Белгиски Франк (конвертибилен)r!UNGNr"XНигериска наираr#UYUNr$X@Југословенски конвертибилен динарr%jyXБелгиски Франкr&j+X%Костарикански Колонr'UAEDr(X Дирхамr)UGBPr*XБританска Фунтаr+j9X%Шриланканска рупијаr,j;XСловачка крунаr-j?X#Пакистанска рупијаr.jCXУнгарска форинтаr/jGXРоманска леаr0jKXБермудски Доларr1jXЛесотско лотиr2ULVRr3XЛатвијска рубљаr4jSX!Монголиски тугрикr5jUXЕрмениски Драмr6j[XУгандиски шилингr7USURr8XСоветска рубљаr9UNLGr:XХоландски гилдерr;UUGSr<X+Угандиски шилинг (1966-1987)r=UMTPr>XМалтиска финтаr?jX!Јамајкански доларr@jmXГрузиски лариrAjqX АвганиrBj-XТурска лираrCUCSKrDX2Чехословачка цврста коронаrEUKPWrFX&Северно корејски вонrGUAFArHXАвгани (1927-2002)rIUGRDrJXГрчка драхмаrKUATSrLX#Австралиски ШилингrMUHTGrNXХаитски гурдrOjXЈеменски риалrPULRDrQXЛибериски доларrRURWFrSXРуандски франкrTjXНорвешка крунаrUUMOPrVXМакао патакаrWjXИндиска рупијаrXjX!Мексикански пезосrYUCZKrZXЧешка коронаr[UTJSr\X)Таџикистантски сомониr]UTJRr^X%таџикистанска рубљаr_jXНепалска рупијаr`UYDDraXЈеменски дианрrbjXКолумбиски ПезосrcjaXКватарски риалrdj%X!Хондурска лемпираrej'XФиџи доларrfj)XЕтиописки БирrgUPENrhX Перуански нов солrij/XБелизиски ДоларrjUGWPrkX(Гвинејски Бисау пезосrlUILPrmXИзрелска фунтаrnUZRNroX!Заирско новозаиреrpj5X#Доминикански ПезосrqUTMMrrX+Турментистантски мататrsUMDLrtXМолдавски леуruUBSDrvXБахамски ДоларrwjgXШведска крунаrxUZMKryXЗамбиска кванчаrzjsX!Австралиски Доларr{UADPr|XАндорска Пезетаr}UCUPr~XКубански пезосrj_XИрска фунтаrj}XБарбадоски ДоларrUKRWrX"Јужно корејски вонrUGMDrXГамбиски ДаласиrjX%Гватемалски кветцалrjX%Венецуелски боливарrUSITrXСловенски толарrUEURrXЕвроrUITLrXИталијанкса лираrjX,Источно карибиски доларrjX%Казакстантска тенгаrURUBrXРуска рубљаrUPLZrX#Полска злота (1950-1995)rjXОмански РиалrjXСоломонски доларrUUYPrX)Уругвајско песо (1975-1993)rURURrX!Руска рубља (1991-1998)rjeXПолска злотаrUPYGrX%Парагвајска гуаранаrjXКениски шилингrUDEMrXГерманска МаркаrjXМакедонски денарrjX$Тајвански нов доларrUUSNrXСАД долар (Next day)rjXВанатски ватуrUBADrX2Босанско-Херцеговски Динарrj1XГвинејски франкrUMXPrX<Мексикански сребрен пезос (1861-1992)rj3XИрачки динарrj7XXБосанско-Херцеговски Динар конвертабилна маркаrjXСејшелска рупијаrj=XКанадски ДоларrUSDDrXСудански динарrjEXКипарска фунтаrjIXКувајтски динарrjMXБуриндиски ФранкrULTTrXЛитваниски литазrUPGKrX0Папуа новогвинејскиа кинаrULTLrXЛитваниска литаrjiX!Сингапурски доалрrUUZSrX!УЗбекистански СумrUMLFrXМалски франкrUESPrXШпанска Пезетаrj{XИрански риалrUZRZrXЗирско заиреrUSVCrX#Елсавадорски колонrUSLLrX#Сиералеонско леонеrUTNDrXТунезиски динарrjXГвијански ДоларrjXМалтиска лираrjX#Новозелански доларrUFKPrXФакландска фунтаrULVLrXЛатвијски латrUUSSrXСАД долар (Same day)rUUSDrXСАД доларrUARPrX-Аргентински Пезос (1983-1985)rjXКиргистански сомrjX!Аргентински ПезосrUSDPrXСуданска фунтаrjX'Свазилендски лилагенrjXБахраински ДинарrUJPYrXЈапонски јенrUPTErX#Португалско ескудоruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXјrKXфrKXмrKXаrKXмrKXјrKXјrKXаrK XсrK XоrK XнrK XдrusUformatr}r(Uwider}r(KXјануариrKXфевруариrKXмартrKX априлrKXмајrKXјуниrKXјулиrKX августrK XсептемвриrK XоктомвриrK XноемвриrK XдекемвриruU abbreviatedr}r(KXјан.rKXфев.rKXмар.rKXапр.rKXмајrKXјун.r KXјул.r KXавг.r K X септ.r K Xокт.r K X ноем.rK X декем.ruUnarrowr}r(K XсrK XнruuuUcurrency_formatsr}rUdaysr}r(U stand-aloner}rUnarrowr}r(KXпrKXвrKXсrKXчrKXпr KXсr!KXнr"usUformatr#}r$(Uwider%}r&(KXпонеделникr'KXвторникr(KX средаr)KXчетвртокr*KX петокr+KX саботаr,KX неделаr-uU abbreviatedr.}r/(KXпон.r0KXвт.r1KXсре.r2KXчет.r3KXпет.r4KXсаб.r5KXнед.r6uuuU meta_zonesr7}r8Uerasr9}r:U abbreviatedr;}r<(KX пр.н.е.r=KXае.r>usu.PK[F$(site-packages/babel/localedata/ar_SD.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[՛%site-packages/babel/localedata/bs.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX Prvi kvartalq KX Drugi kvartalq KXTreći kvartalqKXČetvrti kvartalquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX gudžaratiqBUgdqCXškotski gelskiqDUgaqEXirskiqFUgnqGXguaraniqHUglqIX galicijskiqJUlaqKXlatinskiqLUlnqMXn/aqNUloqOXlaothianqPUtrqQXturskiqRUlvqSX latvijskiqTUltqUX litvanskiqVUtkqWX turkmenskiqXUthqYX tajlandskiqZUtiq[Xtigrinya (eritrejski)q\Uteq]Xteluguq^Upt_PTq_Xportugalski (Portugal)q`UfilqaX filipinskiqbUtaqcXtamilskiqdUyiqeXjidišqfUpt_BRqgXportugalski (Brazil)qhUdeqiX njemačkiqjUdaqkXdanskiqlUelqmXgrčkiqnUeoqoX esperantoqpUenqqXengleskiqrUzhqsXkineskiqtUeuquX baskijskiqvUetqwXestonskiqxUesqyX španjolskiqzUruq{Xruskiq|Uroq}Xrumunskiq~UbnqX bengalskiqUbeqX bjeloruskiqUbgqXbugarskiqUukqX ukrajinskiqUjvqXjavanskiqUboqX tibetanskiqUbhqXbihariqUbrqXbretonacqUbsqXbosanskiqUjaqXjapanskiqUocqX oksitanskiqUundqXnepoznati ili nevažeći jezikqUtwqXtwiqUtlhqX klingonskiqUorqXindijskiqUxhqXbantuqUcaqX katalonskiqUcyqXvelškiqUcsqXčeškiqUpsqX pakistanskiqUptqX portugalskiqUpaqX pendžabiqUviqX vijetnamskiqUplqXpoljskiqUhyqXarmenskiqUhrqXhrvatskiqUhuqX mađarskiqUhiqXhinduqUheqX hebrejskiqUuzqX uzbekistanskiqUmlqX malajalamskiqUmnqX mongolskiqUmkqX makedonskiqUurqXurduqUmtqX malteškiqUmsqXmalajskiqUmrqXmaratiqUugqXuighurqUafqX afrikaansqUswqXsvahiliqUisqX islandskiqUamqXamharskiqUitqX talijanskiqUsvqXšvedskiqUasqXasameskiqUarqXarapskiqUsuqXsudanskiqUzuqXzuluqUiaqX interlinguaqUazqXazerbejdžanskiqUieqX međujezičniqUidqX indonezijskiqUnlqX holandskiqUnnqXnorveški (novonorveški)qUnoqX norveškiqUneqXnepalskiqUfrqX francuskiqUfyqX frizijskiqUfaqX perzijskiqUfiqXfinskiqUkyqXkirgiskiqUfoqXfarskiqUkaqX gruzijskiqUsrqXsrpskiqUsqqXalbanskirUkorX koreanskirUknrXkannadarUkmrX kambodžanskirUstrXsesotorUskr X slovačkir Usir X sinhaleskir Ushr Xsrpsko-hrvatskirUsorXsomalskirUkurXkurdskirUslrX slovenačkirUsarXsanskritrUsdrXsindiruU territoriesr}r(UMErX Crna GorarUTOrXTongarUBArXBosna i Hercegovinar UZZr!XNepoznata ili nevažeća oblastr"URSr#XSrbijar$uUdecimal_formatsr%}r&U date_formatsr'}r((Umediumr)h))r*}r+(h,X yyyy MMM dr,h.X%(yyyy)s %(MMM)s %(d)sr-ubUfullr.h))r/}r0(h,XEEEE, yyyy MMMM ddr1h.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sr2ubUlongr3h))r4}r5(h,X yyyy MMMM dr6h.X%(yyyy)s %(MMMM)s %(d)sr7ubUshortr8h))r9}r:(h,Xyy/MM/ddr;h.X%(yy)s/%(MM)s/%(dd)sr<ubuUcurrency_symbolsr=}r>UXXXr?XXXXr@sU time_zonesrA}rBU Etc/UnknownrC}rDUcityrEXNepoznati ili nevažeći gradrFssUscriptsrG}rH(UZxxxrIXnepisani jezikrJUZzzzrKXnepoznato ili nevažeće pismorLuUvariantsrM}rNUnumber_symbolsrO}rPUcurrency_namesrQ}rR(UBAMrSXKonvertibilna markarTj?XNepoznata ili nevažeća valutarUuUmonthsrV}rW(U stand-alonerX}rYUnarrowrZ}r[(KX1r\KX2r]KX3r^KX4r_KX5r`KX6raKX7rbKX8rcK X9rdK X10reK X11rfK X12rgusUformatrh}ri(Uwiderj}rk(KXJanuarrlKXFebruarrmKXMartrnKXAprilroKXMajrpKXJunirqKXJulirrKXAvgustrsK X SeptembarrtK XOktobarruK XNovembarrvK XDecembarrwuU abbreviatedrx}ry(KXJanrzKXFebr{KXMarr|KXAprr}KXMajr~KXJunrKXJulrKXAvgrK XSeprK XOktrK XNovrK XDecruuuUcurrency_formatsr}rUdaysr}r(U stand-aloner}rUnarrowr}r(Kj]Kj^Kj_Kj`KjaKjbKj\usUformatr}r(Uwider}r(KX PonedjeljakrKXUtorakrKXSrijedarKX ČetvrtakrKXPetakrKXSubotarKXNedjeljaruU abbreviatedr}r(KXPonrKXUtorKXSrirKXČetrKXPetrKXSubrKXNedruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXBCrKXADrusu.PK[Rll-site-packages/babel/localedata/ku_Latn_TR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll*site-packages/babel/localedata/ug_Arab.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[P@jj%site-packages/babel/localedata/ha.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KXQ1qKXQ2qKXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XHH:mm:ssqRUformatqSX%(HH)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X HH:mm:ss vqXhSX%(HH)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X HH:mm:ss zq]hSX%(HH)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XHH:mmqbhSX %(HH)s:%(mm)sqcubuU languagesqd}qe(UguqfXGujaratiqgUgdqhXK'abilan Scots GaelicqiUgaqjX Dan AilanqkUgnqlX GuwaraniyanciqmUglqnXBagalikeqoUlaqpXDan Kabilar LatinqqUlnqrXLingalaqsUloqtXLaothianquUtrqvXBaturkeqwUlvqxX LatbiyanciqyUltqzX Lituweniyanciq{Utkq|X Tukmenistanciq}Uthq~XTayanciqUtiqX TigriyanciqUteqXD'an/'Yar Kabilar TelugqUpt_PTqXYaren Kasar PortugalqUfilqX Dan FilifinqUtaqXD'an/'Yar Kabilar TamilqUpt_BRqXFotigis (Burazil)qUdeqX JamusanchiqUdaqXDanishqUelqXGirkanciqUeoqXD'an/'Yar Kabilar AndalusqUenqXTuranciqUeuqXDan/'Yar Kabilar BasqUetqX IstoniyanciqUesqXMutanen EspanyaqUruqXRashanciqUroqX RomaniyanciqUbnqX Dan BengalqUbeqXBelarushiyanciqUbgqX BulgeriyanqUukqX Dan UkirainqUjvqX JavanisanciqUbhqXBihariqUbrqX BuretananciqUbsqX BosniyanciqUjaqX JafananciqUocqXOsitanciqUtwqX TiwiniyanciqUtlhqXKlingonqUorqXOriyanciqUxhqXBazosaqUcaqX KataloniyanciqUcyqX Kabilar WelshqUcsqXYaren Jamhuriyar CekqUpsqX PashtanciqUptqXYaren mutanen PortugalqUpaqXDan/'Yar Garin PunjabqUviqXK'abilan BiyetnamqUplqXYaren mutanen PolandqUhyqX ArmeniyanciqUhrqX KuroshiyanqUhuqX HongeriyanciqUhiqXBahindeqUhaqXHaoussaqUheqX YahudanciqUuzqXUzbekqUmlqXKabilar MaleyalamqUmnqX MongolianqUmkqXDan MasedoniyaqUurqXUrduqUmtqXHarshen MaltisqUmsqXDan Kabilar MaleqUmrqXK'abilan MarathiqUugqXUgiranciqUafqX AfirkanciqUswqXHarshen SuwahiliqUisqXYaren mutanen IcelandqUamqXAmharicqUitqX ItaliyanciqUsvqXYaren mutanen SwedenqUasqX AsamisanciqUarqXHarshen LarabciqUsuqX SundaneseqUzuqXBazuleqUiaqXYare Tsakanin KasasheqUazrX AzerbaijancirUierX IntagulancirUidrX IndonesiyanrUnlrXYaren mutanen HollandrUnnrXYaren Kasar Norwayr Unor XYaren mutanen Norwayr Uner XD'an/'Yar Kabilar Nepalr UfrrXFaranshirUfyrXK'abilan FirsirUfarXPersianrUfirXYaren mutanen FinlandrUkyrX KirgizancirUforXFaroeserUkarX JojiyancirUsrrXSabiyanrUsqrXD'an/'Yar Kabilar AlbaniyarUkor XYaren mutanen Koriyar!Uknr"XDan/'Yar Kabilar Kannadar#Ukmr$X Kambodiyancir%Ustr&X Sesotancir'Uskr(XBasulaker)Usir*X Sinhalancir+Ushr,XKuroweshiyancin-Sabiyar-Usor.XSomaalir/Ukur0XKurdancir1Uslr2XBasulaber3Usar4Xsanskritr5Usdr6X Sindiyancir7uU territoriesr8}r9UNGr:XNijeriyar;sUdecimal_formatsr<}r=Nh&)r>}r?(h)Nh+Kh,KKr@h.h/h/rAh1KKrBh3X #,##0.###rCh5h/h6rDh8Nh9KKrEubsU date_formatsrF}rG(UmediumrHhO)rI}rJ(h3X d MMM, yyyyrKhSX%(d)s %(MMM)s, %(yyyy)srLubUfullrMhO)rN}rO(h3XEEEE, d MMMM, yyyyrPhSX"%(EEEE)s, %(d)s %(MMMM)s, %(yyyy)srQubUlongrRhO)rS}rT(h3X d MMMM, yyyyrUhSX%(d)s %(MMMM)s, %(yyyy)srVubUshortrWhO)rX}rY(h3Xd/M/yyrZhSX%(d)s/%(M)s/%(yy)sr[ubuUcurrency_symbolsr\}r]UNGNr^X₦r_sU time_zonesr`}raUscriptsrb}rcUvariantsrd}reUnumber_symbolsrf}rg(UdecimalrhX.riUgrouprjX,rkuUcurrency_namesrl}rm(UXOFrnXSefaroj^XNeirarpUGHCrqXSidirruUmonthsrs}rt(U stand-aloneru}rvUnarrowrw}rx(KXJryKXFrzKXMr{KXAr|Kj{KXYr}Kj}Kj|K XSr~K XOrK XNrK XDrusUformatr}r(Uwider}r(KXJanairurKXFabrairurKXMarisrKXAfrilurKXMayurKXYunirKXYulirKXAugustarK XSatumbarK XOktobarK XNuwambarK XDisambaruU abbreviatedr}r(KXJanrKXFabrKXMarrKXAfrrKXMayrKXYunrKXYulrKXAugrK XSatrK XOktrK XNuwrK XDisruuuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X ¤ #,##0.00rh5X¤ rX-¤ rrh8Nh9KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXLrKXTrKjKj|KjyKj|KjusUformatr}r(Uwider}r(KXLitinirKXTalatarKXLarabarKXAlhamisrKXJumma'arKXAsabarrKXLahadiruU abbreviatedr}r(KXLitrKXTalrKXLarrKXAlhrKXJumrKXAsarKXLahruuuU meta_zonesr}rUerasr}r(Uwider}r(KXGabanin MiladirKXMiladiruU abbreviatedr}r(KXGMrKj{uuu.PK[QK~~(site-packages/babel/localedata/aa_ER.datnu[}q(Ucurrency_symbolsq}qUETBqXETBqsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q U week_dataq }q (Umin_daysq KU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[Bl^%^%%site-packages/babel/localedata/ja.datnu[}q(U zone_formatsq}q(UregionqX%s時間qUgmtqXGMT%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q (U stand-aloneq }q Unarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 第1四半期qKX 第2四半期qKX 第3四半期qKX 第4四半期quU abbreviatedq}q(KXQ1qKXQ2qKXQ3q KXQ4q!uuuUperiodsq"}q#(Uamq$X午前q%Upmq&X午後q'uUscientific_formatsq(}q)Ncbabel.numbers NumberPattern q*)q+}q,(Uexp_precq-KKq.Uscaleq/KU frac_precq0KKq1Usuffixq2Xq3h3q4Uint_precq5KKq6Upatternq7X#E0q8Uprefixq9h3X-q:q;Uexp_plusqubsUpercent_formatsq?}q@Nh*)qA}qB(h-Nh/Kdh0KKqCh2X%qDhDqEh5KKqFh7X#,##0%qGh9h3h:qHhX スー語族r?Umapr@Xオーストロネシア諸語rAUmasrBX マサイ語rCUlahrDXラフンダー語rEUladrFX ラジノ語rGUfyrHXフリジア語rIUsnkrJXソニンケ語rKUfarLXペルシア語rMUmadrNXマドゥラ語rOUmagrPXマガヒー語rQUmairRXマイティリー語rSUfirTXフィンランド語rUUfjrVXフィジー語rWUmanrXXマンディンゴ語rYUegyrZX古代エジプト語r[Uzndr\X ザンデ語r]Ussr^Xシスワティ語r_Usrr`Xセルビア語raUsqrbXアルバニア語rcUswrdXスワヒリ語reUsvrfXスウェーデン語rgUsurhX スンダ語riUstrjX南部ソト語rkUskrlXスロバキア語rmUsirnXシンハラ語roUshrpXセルボ=クロアチア語rqUsorrX ソマリ語rsUsnrtX ショナ語ruUsmrvX サモア語rwUslrxXスロベニア語ryUscrzXサルデーニャ語r{Usar|Xサンスクリット語r}Usgr~X サンゴ語rUserX北サーミ語rUsdrX シンド語rUzenrX ゼナガ語rUkbdrXカバルド語rUafarXセム・ハム諸語rUlgrX ガンダ語rUlbrXルクセンブルク語rUfiurXフィン・ウゴル諸語rUlnrXリンガラ語rUlorX ラオ語rUlirXリンブルフ語rUbynrX ビリン語rUltrXリトアニア語rUlurXルバ・カタンガ語rUfilrXフィリピノ語rUyirXイディッシュ語rUnonrX古ノルド語rUcebrXセブアノ語rUyorX ヨルバ語rUnogrX ノガイ語rUbatrXバルト諸語rUdakrX ダコタ語rUdarrXダルガン語rUdayrX ダヤク語rUssarXナイル・サハラ諸語rUkperX クペレ語rUelrXギリシャ語rUeorXエスペラント語rUenrX英語rUlamrX ランバ語rUeerX エウェ語rUmdfrXモクシャ語rUfrrXフランス語rUmdrrXマンダル語rUetrXエストニア語rUesrXスペイン語rUrurX ロシア語rUgonrXゴーンディー語rUgohrX古高ドイツ語rUsmsrXスコルト・サーミ語rUsmnrXイナリ・サーミ語rUsmjrXルレ・サーミ語rUde_ATrX$ドイツ語(オーストリア)rUgotrX ゴート語rUrnrXルンディ語rUrorXルーマニア語rUdsbrX低ソルビア語rUsmarX南サーミ語rUgorrXゴロンタロ語rUastrXアストゥリアス語rUwalrXワッラモ語rUcrhrXクリミア・タタール語rUathrXアサパスカン語族rUgezrX ゲエズ語rUxhrX コサ語rUffrX フラニ語rUkforX コロ語rUmakrXマカッサル語rUzaprXザポテック語rUkokrXコンカニ語rUkosrXコシャエ語rUforXフェロー語rUtogrXトンガ語 (ニアサ)rUhuprXアタパスカ語rUudmrXウドムルト語rUbejrX ベジャ語rUbemrX ベンバ語rUtsirXチムシュ語rUberrXベルベル諸語r Unzir X ンゼマ語r Usair X南米インディアン諸語r UangrX 古代英語rUprarXプラークリット語族rUbhorXボージプリー語rUsalrXセイリッシュ語族rUprorX古期プロバンス語rUrajrXラージャスターン語rUsadrXサンダウェ語rUanprXアンギカ語rUes_419rX*スペイン語(ラテンアメリカ)rUrapr Xラパヌイ語r!Usasr"X ササク語r#Unqor$X ンコ語r%Ucarr&X カリブ語r'Uminr(Xミナンカバウ語r)Umicr*Xミクマク語r+Uefir,Xエフィック語r-Uarnr.Xアラウカン語r/Uypkr0Xユピック語族r1Umisr2Xその他の言語r3Ukacr4X カチン語r5Ukabr6X カビル語r7Ukaar8Xカラ・カルパク語r9Ukajr:X カジェ語r;Ukamr<X カンバ語r=Ukarr>X カレン語r?Ukawr@X カウィ語rAUfr_CHrBXフランス語(スイス)rCUtyvrDXトゥヴァ語rEUfr_CArFXフランス語(カナダ)rGUkarHXグルジア語rIUdoirJX ドグリ語rKUkgrLX コンゴ語rMUkkrNX カザフ語rOUkjrPXクアニャマ語rQUkirRX キクユ語rSUkorTX 韓国語rUUknrVXカンナダ語rWUkmrXXクメール語rYUklrZXグリーンランド語r[Uksr\Xカシミール語r]Ukrr^X カヌリ語r_Ukwr`Xコーンウォール語raUkvrbX コミ語rcUkurdX クルド語reUkyrfXキルギス語rgUtklrhXトケラウ語riUbuarjXブリヤート語rkUmgarlX中期アイルランド語rmUhitrnXヒッタイト語roUdyurpXデゥウラ語rqUderrX ドイツ語rsUdartXデンマーク語ruUdzrvX ゾンカ語rwUluirxXルイセーニョ語ryUdvrzXディベヒ語r{Uhilr|Xヒリガイノン語r}Uhimr~Xヒマチャル語rUgemrXゲルマン諸語rUcrprX!その他の混成語・混合語rUqurXケチュア語rUbasrX バサ語rUgbarX バヤ語rUbadrX バンダ語rUbanrX バリ語rUbalrXバルーチー語rUshnrX シャン語rUbairXバミレケ語族rUarprXアラパホー語rUartrX 人工諸語rUarwrXアラワク語rUarcrX アラム語rUen_USrXアメリカ英語rUsemrX セム諸語rUselrXセリクプ語rUnubrXヌビア語族rUbtkrX バタク語rUlusrXルシャイ語rUmusrXクリーク語rUluarXルバ・ルルア語rUirorXイロコイ語族rUirarX イラン語rUmunrXムンダ語族rUlunrX ルンダ語rUluorX ルオ語rUwarX ワロン語rUtuprXトゥピ語族rUjvrX ジャワ語rUtutrXアルタイ諸語rUtumrXトゥンブカ語rUjarX 日本語rUcoprX コプト語rUilorXイロカノ語rUlarX ラテン語rUgwirXグウィッチン語rUundrX 非確定rUtlirXトリンギット語rUtlhrXクリンゴン語rUchrXチャモロ語rUcorXコルシカ語rUcarXカタロニア語rUcerXチェチェン語rUponrXポンペイ語rUcyrXウェールズ語rUsahrXヤクート語rUcsrX チェコ語rUcrrX クリー語rUbntrXバントゥ諸語rUcvrXチュヴァシュ語rUcurX教会スラブ語rUlvrXラトビア語rUdumrX中世オランダ語rUptrXポルトガル語rUduarXドゥアラ語rUfrorX古フランス語rUyaprX ヤップ語rUfrmrX中期フランス語rUtivrX ティブ語rUfrsrX東フリジア語rUyaorX ヤオ語rUparXパンジャブ語rUxalrXカルムイク語rUes_ESrX'スペイン語(イベリア半島)rUpirX パーリ語rUen_GBrXイギリス英語rUgayrX ガヨ語rUotorXオトミ語族r Uotar Xオスマントルコ語r Uhmnr X フモン語r UmyvrXエルジャ語rUgaarXガ語rUfurrXフリウリ語rUkhirXコイサン諸語rUainrX アイヌ語rUrarrXラロトガ語rUslarXスラブ諸語rUverX ベンダ語rUvirXベトナム語rUisr Xアイスランド語r!Ukhor"Xコータン語r#Uiur$Xイヌクウティトット語r%Uitr&Xイタリア語r'Uvor(Xボラピュク語r)Uiir*X 四川イ語r+Uikr,Xイヌピアック語r-Uior.X イド語r/Uiner0X 印欧諸語r1Uiar2Xインターリングア語r3Ujprr4Xユダヤ・ペルシア語r5Uier6Xインターリング語r7Uidr8Xインドネシア語r9Uigr:X イボ語r;Upapr<Xパピアメント語r=Uewor>Xエウォンド語r?Upaur@X パラオ語rAUpaarBXパプア諸語rCUpagrDXパンガシナン語rEUsatrFXサンターリー語rGUpalrHXパフラヴィ語rIUpamrJXパンパンガ語rKUphirLXフィリピン諸語rMUcelrNXケルト諸語rOUphnrPXフェニキア語rQUnicrRX*ニジェール・コルドファン諸語rSUniarTX ニアス語rUUdgrrVXドグリブ語rWUsyrrXX シリア語rYUniurZXニウーエイ語r[Ugswr\X$スイスドイツ語(スイス)r]Ucchr^Xチャワイ語r_Ujbor`Xロジバン語raUnahrbXナワトル語rcUsamrdXサマリア・アラム語reUhairfX ハイダ語rgUgmhrhX中高ドイツ語riUcusrjXクシュ諸語rkUwenrlXソルビア語族rmUadyrnXアディゲ語roUelxrpX エラム語rqUadarrXアダングメ語rsUpt_PTrtX*ポルトガル語(イベリア半島)ruUhawrvX ハワイ語rwUbinrxX ビニ語ryUbikrzX ビコル語r{Upt_BRr|X!ポルトガル語 (ブラジル)r}Umosr~X モシ語rUmohrXモーホーク語rUtlrXタガログ語rUzh_HansrX簡体中国語rUzh_HantrX繁体中国語rUtvlrX ツバル語rUijorXイジョー語rUkmbrXキンブンドゥ語rUpeorX古代ペルシア語rUumbrXウンブンドゥ語rUtmhrXタマシェク語rUfonrX フォン語rUhsbrX上ソルビア語rUberXベラルーシ語rUbgrXブルガリア語rUbarXバシキール語rUpsrXパシュトゥー語rUbmrXバンバラ語rUbnrXベンガル語rUborXチベット語rUbhrXビハール語rUbirXビスラマ語rUbrrXブルトン語rUbsrXボスニア語rUruprXアルーマニア語rUomrX オロモ語rUojrXオブジワ語rUacerXアチェー語rUachrXアチョリ語rUocrX オック語rUkrurX クルク語rUsrrrX セレル語rUkrorX クルー語rUkrlrXカレリア語rUkrcrXカラチャイ語rUndsrX*低地ドイツ語、低地サクソン語rUosrX オセト語rUorrXオリヤー語rUsogrX ソグド語rUnsorX北部ソト語rUsonrXソンガイ語rUde_CHrX!正統ドイツ語(スイス)rUvairX ヴァイ語rUwakrXワカシ語族rUlolrX モンゴ語rUmkhrXモン・クメール諸語rUawarXアワディー語rUlozrX ロズィ語rUgilrXキリバス語rUwasrX ワショ語rUwarrX ワライ語rUhzrX ヘレロ語rUhyrXアルメニア語rUanrXアラゴン語rUsidrX シダモ語rUhrrXクロアチア語rUhtrX ハイチ語rUhurXハンガリー語rUhirXヒンディー語rUhorXヒリモトゥ語rUharX ハウサ語rUbugrX ブギ語rUherXヘブライ語rUuzrXウズベク語rUurrXウルドゥー語rUplrXポーランド語rUukrXウクライナ語rUugrXウイグル語rUaarXアファル語rUabrXアブハズ語r Uaer Xアヴェスタ語r Uafr Xアフリカーンス語r UakrX アカン語rUamrXアムハラ語rUnl_BErXフレミッシュ語rUeurX バスク語rUasrXアッサム語rUarrXアラビア語rUinhrXイングシ語rUtpirXトク・ピシン語rUmynrX マヤ語族rUayr Xアイマラ語r!Ukhar"X カシ語r#Uazr$Xアゼルバイジャン語r%Uincr&Xインド諸語r'Unlr(Xオランダ語r)Unnr*X'ノルウェー語 (ニーノシュク)r+Unor,Xノルウェー語r-Unar.X ナウル語r/Unbr0X'ノルウェー語 (ブークモール)r1Unair2X北米インディアン諸語r3Undr4X北ンデベレ語r5Uner6Xネパール語r7Ungr8Xンドンガ語r9Unyr:X3ニャンジャ語、チチェワ語、チェワ語r;Unapr<X ナポリ語r=Ugrbr>X グレボ語r?Ugrcr@X古代ギリシャ語rAUnrrBX南ンデベレ語rCUtigrDXティグレ語rEUnvrFX ナバホ語rGUzunrHX ズニ語rIUrwrJXルワンダ語rKUcperLX'英語が基盤の混成語・混合語rMUcpfrNX0フランス語が基盤の混成語・混合語rOUcpprPX3ポルトガル語が基盤の混成語・混合語rQuU territoriesrR}rS(UBDrTXバングラデシュrUUBErVX ベルギーrWUBFrXXブルキナファソrYUBGrZXブルガリアr[UVEr\Xベネズエラr]UBAr^X$ボスニア・ヘルツェゴビナr_UBBr`XバルバドスraUWFrbXウォリス・フツナrcUBLrdXサン・バルテルミーreUBMrfXバミューダrgUBNrhX ブルネイriUBOrjX ボリビアrkUBHrlXバーレーンrmUBIrnX ブルンジroUBJrpX ベニンrqUBTrrX ブータンrsU011rtX西アフリカruUBVrvX ブーベ島rwUBWrxX ボツワナryU014rzX東アフリカr{U015r|X北アフリカr}UBRr~X ブラジルrU017rX中部アフリカrU018rX南部アフリカrU019rXアメリカ大陸rUBYrXベラルーシrUBZrX ベリーズrULVrX ラトビアrURWrX ルワンダrURSrX セルビアrUTLrX東ティモールrURErXレユニオン島rUTMrXトルクメニスタンrUOMrX オマーンrUTJrXタジキスタンrUROrXルーマニアrUTKrXトケラウ諸島rUGWrXギニアビサウrUGUrX グアムrUGTrXグアテマラrUGSrX3南ジョージア島・南サンドイッチ諸島rUGRrX ギリシャrUGQrX赤道ギニアrUGPrXグアドループrUJPrX日本rUKIrX キリバスrUGYrX ガイアナrUGGrXガーンジーrUGFrX仏領ギアナrUGErX グルジアrUGDrX グレナダrU021rX北アメリカrUGBrX イギリスrUGArX ガボンrUSVrXエルサルバドルrUGNrX ギニアrUGMrX ガンビアrUGLrXグリーンランドrU029rX カリブ海rUGIrXジブラルタルrUGHrX ガーナrUJErXジャージーrUTNrXチュニジアrUJMrXジャマイカrU013rX中央アメリカrUWSrX サモアrU419rX'ラテンアメリカ・カリブ地域rUHRrXクロアチアrUBSrX バハマrUHTrX ハイチrUHUrXハンガリーrUHKrX*中華人民共和国香港特別行政区rU039rX南ヨーロッパrUHNrXホンジュラスrUFIrXフィンランドrU142rX アジアrU030rX 東アジアrU034rX 南アジアrU035rX東南アジアrUPRrXプエルトリコrUPSrXパレスチナ領土rU830rXチャネル諸島rUFKrXフォークランド諸島rUIOrX英領インド洋植民地rUPWrX パラオrUPTrXポルトガルrUSJrX0スバールバル諸島・ヤンマイエン島rUMDrX モルドバrUFMrXミクロネシアrUIQrX イラクrUPArX パナマr UPFr X仏領ポリネシアr UPGr Xパプアニューギニアr UPErX ペルーrUPKrXパキスタンrUPHrXフィリピンrUFOrXフェロー諸島rUPNrXピトケアン島rUPLrXポーランドrUPMrX'サンピエール島・ミクロン島rUZMrX ザンビアrUEHrX 西サハラrURUr X ロシアr!UEEr"Xエストニアr#UEGr$X エジプトr%UZAr&X南アフリカr'UECr(Xエクアドルr)UITr*X イタリアr+UVNr,X ベトナムr-UZZr.X不明な地域r/USBr0Xソロモン諸島r1UETr2Xエチオピアr3USOr4X ソマリアr5UZWr6Xジンバブエr7USAr8Xサウジアラビアr9UESr:X スペインr;UERr<Xエリトリアr=UMEr>Xモンテネグロr?UAQr@X 南極大陸rAUMGrBXマダガスカルrCUMFrDXセント・マーチンrEUMArFX モロッコrGUMCrHX モナコrIUUZrJXウズベキスタンrKUMMrLXミャンマーrMUMLrNXマリrOUMOrPX-中華人民共和国マカオ特別行政区rQUMNrRX モンゴルrSUHMrTX'ハード島・マクドナルド諸島rUUASrVX米領サモアrWUMKrXXマケドニアrYUMUrZXモーリシャスr[UMTr\X マルタr]UMWr^X マラウィr_UMVr`X モルジブraUMQrbXマルティニーク島rcUMPrdX北マリアナ諸島reUMSrfXモントセラト島rgUMRrhXモーリタニアriUIMrjX マン島rkUUGrlX ウガンダrmUTZrnXタンザニアroUMYrpXマレーシアrqUMXrrX メキシコrsUILrtXイスラエルruUFRrvX フランスrwUAWrxX アルバ島ryUDOrzXドミニカ共和国r{USHr|Xセントヘレナr}UVCr~X6セントビンセント・グレナディーン諸島rU054rXメラネシアrUDJrX ジブチrUFJrX フィジーrU057rXミクロネシア地域rU172rX独立国家共同体rU053rX0オーストラリア・ニュージーランドrUNIrXニカラグアrUNLrX オランダrUNOrXノルウェーrUNArX ナミビアrUVUrX バヌアツrUNCrXニューカレドニアrUNErXニジェールrUNFrXノーフォーク島rUNGrXナイジェリアrUNZrXニュージーランドrUNPrX ネパールrUNRrX ナウルrUNUrX ニウエ島rU061rXポリネシアrUCIrXコートジボワールrUCHrX スイスrUCOrXコロンビアrUCNrX中国rUCMrXカメルーンrUCLrXチリrUCCrX"ココス (キーリング) 諸島rUCArX カナダrUCGrX$コンゴ共和国 (ブラザビル)rUCFrX中央アフリカ共和国rUCDrX*コンゴ民主共和国 (キンシャサ)rUCZrXチェコ共和国rUCYrX キプロスrUCXrXクリスマス島rUCSrX!セルビア・モンテネグロrUCRrXコスタリカrUPYrXパラグアイrUCVrXカーボベルデrUCUrX キューバrUSZrXスワジランドrUSYrX シリアrUKGrXキルギスタンrUKErX ケニアrUSRrX スリナムrU143rX中央アジアrUKHrXカンボジアrUKNrX-セントクリストファー・ネイビスrUKMrX コモロrUSTrXサントメ・プリンシペrUSKrXスロバキアrUKRrX 大韓民国rUSIrXスロベニアrUKPrX!朝鮮民主主義人民共和国rUKWrXクウェートrUSNrX セネガルrUSMrXサンマリノrUSLrXシエラレオネrUSCrXセーシェルrUKZrXカザフスタンrUKYrXケイマン諸島rUSGrXシンガポールrUSErXスウェーデンrUSDrX スーダンrU151rX東ヨーロッパrU150rXヨーロッパrUDMrXドミニカ国rU155rX西ヨーロッパrU154rX北ヨーロッパrUVGrX$イギリス領ヴァージン諸島r UDEr X ドイツr UYEr X イエメンr UMHrXマーシャル諸島共和国rU062rX南中央アジアrUDZrXアルジェリアrUUSrXアメリカ合衆国rUUYrXウルグアイrUYTrXマヨット島rUUMrX米領太平洋諸島rULBrX レバノンrULCrXセントルシアrULAr X ラオスr!UTVr"X ツバルr#UTWr$X台湾r%UTTr&Xトリニダード・トバゴr'UTRr(X トルコr)ULKr*Xスリランカr+ULIr,Xリヒテンシュタインr-UCKr.Xクック諸島r/UTOr0X トンガr1ULTr2Xリトアニアr3ULUr4Xルクセンブルグr5ULRr6X リベリアr7ULSr8X レソトr9UTHr:Xタイr;UTFr<Xフランス領極南諸島r=UTGr>X トーゴr?UTDr@X チャドrAUTCrBX'タークス諸島・カイコス諸島rCULYrDX リビアrEUVArFXバチカン市国rGU145rHX 西アジアrIUAErJXアラブ首長国連邦rKUADrLX アンドラrMUAGrNX$アンティグア・バーブーダrOUAFrPXアフガニスタンrQUAIrRX アンギラrSUVIrTX$アメリカ領ヴァージン諸島rUUISrVXアイスランドrWUIRrXX イランrYUAMrZXアルメニアr[UALr\Xアルバニアr]UAOr^X アンゴラr_UANr`X$オランダ領アンティル諸島raU003rbX北米rcU002rdX アフリカreU001rfX世界rgUARrhXアルゼンチンriUAUrjXオーストラリアrkUATrlXオーストリアrmU005rnX南アメリカroUINrpX インドrqUAXrrXオーランド諸島rsU009rtXオセアニアruUAZrvXアゼルバイジャンrwUIErxXアイルランドryUIDrzXインドネシアr{UJOr|X ヨルダンr}UQUr~X 欧州連合rUUArXウクライナrUQArX カタールrUDKrXデンマークrUMZrXモザンビークrUQOrXその他のオセアニアruUdecimal_formatsr}rNh*)r}r(h-Nh/Kh0KKrh2h3h3rh5KKrh7X #,##0.###rh9h3h:rh}r?jX ベリーズr@sUAmerica/Port_of_SpainrA}rBjXポートオブスペインrCsUAmerica/MendozarD}rEjXメンドーサrFsU Asia/TokyorG}rHjX東京rIsUPacific/KiritimatirJ}rKjXキリティマティrLsUAustralia/SydneyrM}rNjX シドニーrOsU Europe/RigarP}rQjXリガrRsU Asia/DilirS}rTjX ディリrUsUAfrica/MbabanerV}rWjX ムババネrXsU Asia/OralrY}rZjX オラルr[sU Asia/Adenr\}r]jX アデンr^sUEurope/Istanbulr_}r`jXイスタンブールrasU Asia/Magadanrb}rcjX マガダンrdsUAustralia/Lindemanre}rfjXリンデマンrgsUPacific/Galapagosrh}rijXガラパゴスrjsUAmerica/Bogotark}rljX ボゴタrmsUAmerica/Dawsonrn}rojX ドーソンrpsUAmerica/Chicagorq}rrjX シカゴrssUPacific/Kwajaleinrt}rujXクワジェリンrvsUAustralia/Broken_Hillrw}rxjXブロークンヒルrysUAmerica/Cuiabarz}r{jX クイアバr|sUIndian/Christmasr}}r~jXクリスマスrsU Asia/Jayapurar}rjXジャヤプラrsUEurope/Brusselsr}rjXブリュッセルrsU Europe/Lisbonr}rjXヨーロッパ/リスボンrsUAsia/Chongqingr}rjX重慶rsUAmerica/Noronhar}rjX ノロニャrsUAfrica/Algiersr}rjX アルジェrsU Africa/Hararer}rjX ハラーレrsUAfrica/Ndjamenar}rjXンジャメナrsUAmerica/Costa_Ricar}rjXコスタリカ共和国rsUIndian/Mayotter}rjXマイヨット島rsUAsia/Phnom_Penhr}rjXプノンペンrsUAmerica/Managuar}rjX マナグアrsU Asia/Bruneir}rjX ブルネイrsUAmerica/Tijuanar}rjXティフアナrsUPacific/Fakaofor}rjXファカオフォrsU America/Adakr}rjX アダックrsUAmerica/Antiguar}rjXアンチグアrsUAmerica/Argentina/La_Riojar}rjX ラリオハrsUPacific/Tahitir}rjX太平洋/タヒチrsUAmerica/Pangnirtungr}rjXパンナータングrsUAmerica/Asuncionr}rjXアスンシオンrsU Europe/Viennar}rjX ウィーンrsUAustralia/Hobartr}rjX ホバートrsUAmerica/Juneaur}rjX ジュノーrsUAmerica/Inuvikr}rjXイヌヴィクrsUAmerica/Montrealr}rjXモントリオールrsU Asia/Seoulr}rjX ソウルrsU Indian/Comoror}rjX コモロrsUAntarctica/Rotherar}rjX ロデラrsUEurope/Tallinnr}rjX タリンrsU Indian/Maher}rjXマエrsUAmerica/Martiniquer}rjXマルチニークrsUAsia/Singaporer}rjXシンガポールrsUAfrica/Nairobir}rjX ナイロビrsUAmerica/Maceior}rjX マセイオrsU Asia/Urumqir}rjX ウルムチrsU Europe/Moscowr}rjX モスクワrsUAsia/Pyongyangr}rjX平壌rsUAsia/Ulaanbaatarr}rjXウランバートルrsUAmerica/Rainy_Riverr}rjXレイニーリバーrsUIndian/Maldivesr}rjXモルディブ共和国rsU Asia/Colombor}rjX コロンボrsUAustralia/Adelaider}rjXアデレードrsUAmerica/Cambridge_Bayr}rjXケンブリッジベイrsU Africa/Luandar}rjX ルアンダrsUPacific/Chathamr}rjX チャタムr sUAmerica/Indiana/Winamacr }r jX'インディアナ州ウィナマックr sUAmerica/Cordobar }rjX コルドバrsU Asia/Tbilisir}rjX トビリシrsUEurope/Gibraltarr}rjXジブラルタルrsU Asia/Karachir}rjX カラチrsU Asia/Harbinr}rjX ハルビンrsUAustralia/Lord_Hower}rjXロードハウrsUAmerica/Boa_Vistar}r jXボアビスタr!sUAfrica/Tripolir"}r#jX トリポリr$sUIndian/Reunionr%}r&jXレユニオンr'sUAtlantic/Stanleyr(}r)jXスタンリーr*sUAmerica/Blanc-Sablonr+}r,jXブラン・サブロンr-sUAntarctica/Syowar.}r/jX 昭和基地r0sUAmerica/Jamaicar1}r2jXジャマイカr3sU Europe/Kievr4}r5jX キエフr6sUEurope/Budapestr7}r8jXブダペストr9sUPacific/Midwayr:}r;jXミッドウェーr<sUAmerica/Goose_Bayr=}r>jXグースベイr?sU Asia/Ammanr@}rAjX アンマンrBsU Asia/SakhalinrC}rDjX サハリンrEsUAfrica/WindhoekrF}rGjXビントフックrHsU Asia/KatmandurI}rJjXカトマンズrKsUAmerica/GuyanarL}rMjX ガイアナrNsUAmerica/Sao_PaulorO}rPjXサンパウロrQsUAustralia/PerthrR}rSjX パースrTsUAfrica/DjiboutirU}rVjXジブチ共和国rWsU Asia/JakartarX}rYjXジャカルタrZsUAntarctica/Palmerr[}r\jX パーマーr]sUAfrica/Johannesburgr^}r_jXヨハネスブルグr`sU Asia/Irkutskra}rbjXイルクーツクrcsU Africa/Niameyrd}rejX ニアメーrfsUAfrica/Casablancarg}rhjXカサブランカrisUAmerica/Indiana/Marengorj}rkjX!インディアナ州マレンゴrlsUAfrica/Nouakchottrm}rnjXヌアクショットrosUEurope/Vilniusrp}rqjXヴィルニアスrrsUAmerica/Cayenners}rtjXカイエンヌrusUAfrica/Mogadishurv}rwjXモガディシュrxsUAmerica/Kentucky/Monticellory}rzjX*ケンタッキー州モンティチェロr{sUAmerica/Rio_Brancor|}r}jXリオブランコr~sUAmerica/Cancunr}rjX カンクンrsUAmerica/Havanar}rjX ハバナrsU Pacific/Guamr}rjX グアムrsU Asia/Makassarr}rjXマカッサルrsUAtlantic/Azoresr}rjXアゾレス諸島rsUAustralia/Euclar}rjX ユークラrsU Asia/Shanghair}rjX上海rsUAmerica/Rankin_Inletr}rjXランキン湾rsU Asia/Beirutr}rjXベイルートrsU Africa/Maputor}rjX マプトrsU Asia/Bahrainr}rjXバーレーン国rsU Asia/Ashgabatr}rjXアシガバードrsU Asia/Riyadhr}rjX リヤドrsU Europe/Londonr}rjXヨーロッパ/ロンドンrsUAmerica/Monterreyr}rjXモンテレイrsUAmerica/Anguillar}rjX アンギラrsU Asia/Damascusr}rjXダマスカスrsUAmerica/North_Dakota/Centerr}rjX!ノースダコタ州センターrsUAmerica/Indiana/Vevayr}rjXインディアナ州ビベーrsUAtlantic/St_Helenar}rjXセントヘレナrsUAmerica/Barbadosr}rjXバルバドスrsUAmerica/Indiana/Vincennesr}rjX$インディアナ州ビンセンスrsU Asia/Almatyr}rjXアルマトイrsU Africa/Lomer}rjXロメrsUAfrica/Brazzaviller}rjXブラザビルrsU America/Nomer}rjX ノーメrsU Asia/Taipeir}rjX台北rsUAmerica/Yakutatr}rjXヤクタットrsUAmerica/Araguainar}rjXアラグァイナrsU Europe/Vaduzr}rjXファドゥーツrsU Africa/Asmerar}rjX アスマラrsUAntarctica/Mawsonr}rjX モーソンrsUAmerica/Buenos_Airesr}rjXブエノスアイレスrsU Africa/Maserur}rjX マセルrsUAmerica/Louisviller}rjXルイスビルrsU Asia/Kuchingr}rjX クチンrsUAfrica/Libreviller}rjXリーブルビルrsUAfrica/Freetownr}rjXフリータウンrsU Africa/Bissaur}rjX ビサウrsU Europe/Samarar}rjX サマラrsUEurope/Amsterdamr}rjXアムステルダムrsU Europe/Tiraner}rjX チラナrsUPacific/Saipanr}rjX サイパンrsUAfrica/Abidjanr }r jXアビジャンr sUEurope/Zaporozhyer }r jXザポロージェr sUAmerica/El_Salvadorr }r jXサルバドルr sU Europe/Madridr }r jXヨーロッパ/マドリードr sUAmerica/Santiagor }r jXアメリカ/サンチアゴr sUAmerica/Argentina/San_Luisr }r jXサンルイスr sU America/Arubar }r jX アルバr sUAmerica/Indianapolisr }r jXインディアナポリスr sUAmerica/Reginar }r jXレジャイナr sU Pacific/Trukr }r jX トラックr sUPacific/Funafutir }r jXフナフティr sUAmerica/Meridar! }r" jX メリダr# sUAmerica/Guatemalar$ }r% jXグァテマラ共和国r& sUAfrica/Sao_Tomer' }r( jX サントメr) sUPacific/Kosraer* }r+ jX コシャエr, sUAfrica/Bujumburar- }r. jXブジュンブラr/ sUEurope/Chisinaur0 }r1 jX キシナウr2 sU Europe/Warsawr3 }r4 jXワルシャワr5 sUAsia/Yekaterinburgr6 }r7 jXエカテリンブルグr8 sUAntarctica/Caseyr9 }r: jX ケーシーr; sUAmerica/Halifaxr< }r= jXハリファクスr> sU America/Thuler? }r@ jX チューレrA sUAmerica/St_JohnsrB }rC jXセントジョンズrD sUAmerica/MonctonrE }rF jXモンクトンrG sUEurope/HelsinkirH }rI jXヘルシンキrJ sUAtlantic/Cape_VerderK }rL jXカボベルデ共和国rM sU Indian/CocosrN }rO jX ココスrP sU America/BoiserQ }rR jX ボイシrS sUAmerica/GuadelouperT }rU jXグアダループrV sUAmerica/NassaurW }rX jX ナッサウrY sUPacific/EnderburyrZ }r[ jXエンダベリーr\ sU Asia/Hovdr] }r^ jX ホブドr_ sUAmerica/Manausr` }ra jX マナウスrb sUAmerica/Godthabrc }rd jXアメリカ/ゴッドホープre sUAmerica/Catamarcarf }rg jXカタマルカrh sUAmerica/Chihuahuari }rj jX チワワrk sUAmerica/Iqaluitrl }rm jXイカルイットrn sUAmerica/Argentina/Rio_Gallegosro }rp jXリオガイェゴスrq sUPacific/Gambierrr }rs jX ガンビアrt sUEurope/Volgogradru }rv jXボルゴグラードrw sU Africa/Bamakorx }ry jXアフリカ/バマコrz sUEurope/Uzhgorodr{ }r| jXウジゴロドr} sU Africa/Banjulr~ }r jXバンジュルr sU Asia/Aqtaur }r jX アクタウr sU Africa/Malabor }r jX マラボr sUAtlantic/Madeirar }r jX マデイラr sUPacific/Noumear }r jX ヌメアr sUAfrica/Kinshasar }r jXキンシャサr sU Europe/Maltar }r jXマルタ共和国r sUAmerica/Argentina/Ushuaiar }r jXウスアイアr sU Asia/Bangkokr }r jX バンコクr sU Pacific/Niuer }r jX ニウエr sUAustralia/Brisbaner }r jXブリスベンr sUAmerica/Recifer }r jX レシフェr sU Asia/Yerevanr }r jX エレバンr sUAmerica/La_Pazr }r jX ラパスr sU Africa/Cairor }r jX カイロr sU Africa/Lusakar }r jX ルサカr sUPacific/Guadalcanalr }r jXガダルカナルr sUAmerica/Yellowknifer }r jXイエローナイフr sUAsia/Vientianer }r jXビエンチャンr sUEurope/Kaliningradr }r jXカリーニングラードr sUAfrica/Conakryr }r jX コナクリr sUAmerica/Argentina/Tucumanr }r jXトゥクマンr sU Europe/Oslor }r jX オスロr sUAmerica/St_Kittsr }r jXセントキッツネイビスr sUAmerica/Panamar }r jXパナマ共和国r sUAfrica/Gaboroner }r jXガボローネr sU Pacific/Palaur }r jXパラオ共和国r sUAmerica/Guayaquilr }r jXアメリカ/グアヤキルr sUAsia/Kuala_Lumpurr }r jX"アジア/クアラルンプールr sUAtlantic/Faeroer }r jX フェローr sUAmerica/Menomineer }r jXメノミニーr sUAsia/Kamchatkar }r jXカムチャッカr sUAsia/Vladivostokr }r jXウラジオストクr sU Asia/Qatarr }r jX カタールr sU Asia/Dubair }r jX ドバイr sU Asia/Yakutskr }r jXヤクーツクr sU Asia/Omskr }r jX オムスクr sU Africa/Banguir }r jX バンギr sUAmerica/Paramaribor }r jXパラマリボr sUAfrica/Lubumbashir }r jXルブンバシr sUPacific/Marquesasr }r jXマルケサスr sU Asia/Anadyrr }r jX アナジルr sUAmerica/New_Yorkr }r jXニューヨークr sUPacific/Norfolkr }r jXノーフォークr sUPacific/Rarotongar }r jXラロトンガr sUAmerica/Dominicar }r jXドミニカ国r sUAfrica/Porto-Novor }r jXポルトノボr sUAsia/Samarkandr }r jXサマルカンドr sU Asia/Dushanber }r jXドゥシャンベr sUAmerica/Torontor }r jX トロントr sU America/Bahiar }r jX バイーアr sUAfrica/Kampalar }r jX カンパラr sUAfrica/Ouagadougour }r jXワガドゥグーr sUAntarctica/South_Poler }r jX 南極点r sU Asia/Muscatr }r! jXマスカットr" sUAmerica/Edmontonr# }r$ jXエドモントンr% sU Pacific/Waker& }r' jX ウェークr( sUAmerica/Indiana/Tell_Cityr) }r* jX$インディアナ州テルシティr+ sUAustralia/Darwinr, }r- jXダーウィンr. sUAmerica/Whitehorser/ }r0 jXホワイトホースr1 sUAmerica/Swift_Currentr2 }r3 jXスウィフトカレントr4 sUEurope/Copenhagenr5 }r6 jXコペンハーゲンr7 sUAmerica/Montserratr8 }r9 jXモントセラト島r: sU Asia/Tashkentr; }r< jXアジア/タシケントr= sUEurope/Simferopolr> }r? jXシンフェローポリr@ sUAfrica/BlantyrerA }rB jXブランタイアrC sUAmerica/DetroitrD }rE jXデトロイトrF sUAmerica/ShiprockrG }rH jXシップロックrI sUAmerica/GrenadarJ }rK jX グレナダrL sUAmerica/Indiana/PetersburgrM }rN jX-インディアナ州ピーターズバーグrO sUAsia/PontianakrP }rQ jXポンティアナクrR sUAfrica/Dar_es_SalaamrS }rT jXダルエスサラームrU sUAmerica/Port-au-PrincerV }rW jXポルトープランスrX sUAmerica/CaymanrY }rZ jX ケイマンr[ sU Europe/Athensr\ }r] jX アテネr^ sUAmerica/Curacaor_ }r` jXキュラソーra sUIndian/Kerguelenrb }rc jXケルゲレーヌrd sUAfrica/Khartoumre }rf jXハルツームrg sU Asia/Manilarh }ri jX マニラrj sUAmerica/Santo_Domingork }rl jXサントドミンゴrm sU America/Jujuyrn }ro jX フフイrp sU Africa/Doualarq }rr jX ドゥアラrs sU Europe/Romert }ru jX ローマrv sUAmerica/Argentina/San_Juanrw }rx jXサンファンry sUAmerica/North_Dakota/New_Salemrz }r{ jX*ノースダコタ州ニューセーラムr| sUPacific/Port_Moresbyr} }r~ jXポートモレスビーr sUEurope/Andorrar }r jXアンドラ公国r sUEurope/Luxembourgr }r jXルクセンブルグ大公国r sUPacific/Honolulur }r jX ホノルルr sUAmerica/St_Thomasr }r jXセントトマスr sUPacific/Majuror }r jX マジュロr sUAmerica/Mazatlanr }r jXマサトランr sU Asia/Macaur }r jX マカオr sUAsia/Choibalsanr }r jXチョイバルサンr sUAntarctica/McMurdor }r jXマクムードr sUAmerica/Thunder_Bayr }r jXサンダーベイr sUAmerica/Los_Angelesr }r jXロサンゼルスr sU Asia/Kabulr }r jX カブールr sUIndian/Antananarivor }r jXアンタナナリボr sUAtlantic/Reykjavikr }r jXレイキャビークr sU Asia/Nicosiar }r jX ニコシアr sUPacific/Ponaper }r jX ポナペr sUPacific/Tongatapur }r jXトンガタプr sUPacific/Pitcairnr }r jXピトケアン島r sUPacific/Easterr }r jXイースター島r sUAtlantic/South_Georgiar }r jX南ジョージア島r sUAfrica/El_Aaiunr }r jX アイウンr sUAmerica/Campo_Grander }r jXカンポグランデr sUAmerica/Dawson_Creekr }r jXドーソンクリークr sUAntarctica/Vostokr }r jXボストークr sUEurope/Bucharestr }r jXブカレストr sUAmerica/Porto_Velhor }r jXポルトベーリョr sU Europe/Monacor }r jXモナコ公国r sU Asia/Bishkekr }r jXビシュケクr sU Africa/Ceutar }r jX セウタr sUAmerica/Winnipegr }r jXウィニペグr sU Asia/Aqtober }r jX アクトベr sU Africa/Dakarr }r jX ダカールr sUAmerica/Fortalezar }r jXフォルタレザr sUPacific/Tarawar }r jX タラワr sUAfrica/Addis_Ababar }r jXアジスアベバr sU Pacific/Efater }r jX エファテr sUPacific/Johnstonr }r jXジョンストンr sUAsia/Qyzylordar }r jXキジルオルダr sUAsia/Jerusalemr }r jXエルサレムr sUPacific/Aucklandr }r jX太平洋/オークランドr sUAmerica/Tortolar }r jXトルトーラr sUAmerica/Denverr }r jX デンバーr sU Indian/Chagosr }r jX チャゴスr sUAmerica/Glace_Bayr }r jXグレースベイr sUAmerica/Hermosillor }r jXエルモシヨr sU Africa/Tunisr }r jXチュニジアr sUAmerica/Montevideor }r jXモンテビデオr sUAmerica/Resoluter }r jXレソリュートr sU Asia/Gazar }r jXガザr sU Europe/Dublinr }r jX ダブリンr sUAntarctica/DumontDUrviller }r jXデュモン デュルビルr sUAmerica/Indiana/Knoxr }r jX!インディアナ州ノックスr sUAsia/Novosibirskr }r jXノボシビルスクr sU Africa/Kigalir }r jX キガリr! sUAmerica/Grand_Turkr" }r# jXグランドタークr$ sU Africa/Lagosr% }r& jX ラゴスr' sU Europe/Sofiar( }r) jX ソフィアr* sU America/Limar+ }r, jXリマr- sU Etc/Unknownr. }r/ jX不明r0 sUAmerica/Anchorager1 }r2 jXアンカレッジr3 sU Pacific/Naurur4 }r5 jXナウル共和国r6 suUscriptsr7 }r8 (UGurur9 Xグルムキー文字r: UHebrr; Xヘブライ文字r< UZzzzr= X0コード化されていない文字のコードr> UPhnxr? Xフェニキア文字r@ UMoonrA Xムーン文字rB UChamrC Xチャム文字rD UArabrE Xアラビア文字rF UGujrrG Xグジャラート文字rH UZxxxrI X口承言語のコードrJ USinhrK Xシンハラ文字rL UTalurM X新タイ・ルー文字rN UMongrO Xモンゴル文字rP UXpeorQ X古代ペルシア文字rR UVisprS X 視話法rT UOlckrU Xオルチキ文字rV UTalerW Xタイレ文字rX UMandrY Xマンダ文字rZ UMlymr[ Xマラヤーラム文字r\ UTibtr] Xチベット文字r^ UKalir_ Xカヤー文字r` UJpanra X日本語の文字rb UPlrdrc Xポラード音声記号rd USylore Xシロティ・ナグリ文字rf ULepcrg X!レプチャ文字 (ロン文字)rh UYiiiri X イ文字rj UJavark Xジャワ文字rl UOryarm Xオリヤー文字rn ULaooro X ラオ文字rp UUgarrq Xウガリト文字rr UCyrlrs Xキリル文字rt UVaiiru Xヴァイ文字rv UArmnrw Xアルメニア文字rx UCyrsry X3キリル文字 (古代教会スラブ語の文字)rz UKhmrr{ Xクメール文字r| UItalr} X古代イタリアの文字r~ UXsuxr X-シュメール=アッカド語楔形文字r UThaar Xターナ文字r UThair X タイ文字r UCprtr Xキプロス文字r ULinbr X 線文字Br ULinar X 線文字Ar UOsmar Xオスマニア文字r UHirar X ひらがなr UHanir X漢字r UEgydr Xエジプト民衆文字r UQaair X系統r UEgyhr Xエジプト神官文字r UCansr X統合カナダ先住民記号r UEgypr Xエジプト聖刻文字r UTfngr X*ティフナグ文字 (ベルベル文字)r UShawr Xショー文字r UCirtr Xキアス文字r UGeorr Xグルジア文字r UTengr Xテングワール文字r UHrktr Xカタカナとひらがなr UGeokr X!グルジア文字(フツリ)r UOgamr Xオガム文字r UDsrtr Xデセレット文字r UGothr Xゴート文字r UHanor Xハヌノオ文字r UBalir X バリ文字r UKorer X韓国語の文字r UHangr X ハングルr UCarir X カリ文字r UTagbr Xタグバンワ文字r UHansr X 簡体字r UHantr X 繁体字r URoror Xロンゴロンゴ文字r UDevar Xデーバナーガリー文字r UIndsr X'インダス文字 (ハラッパ文字)r UBopor X 注音字母r UMymrr Xミャンマー文字r UTglgr Xタガログ文字r UPermr X古ペルミック文字r UBugir Xブギス文字r UPhagr Xパスパ文字r UBrair Xブライユ点字r UBrahr Xブラーフミー文字r UBatkr Xバタク文字r UKanar X カタカナr UMeror Xメロエ文字r ULimbr Xリンブ文字r UMteir Xメイテイ文字r UTelur Xテルグ文字r UTamlr Xタミール文字r USarar Xサラティ文字r ULatgr X'ラテン文字 (ゲール語の文字)r ULatfr X!ラテン文字 (ドイツ文字)r UKharr Xカローシュティー文字r UNkoor Xインコ文字r ULatnr Xラテン文字r UMayar Xマヤ象形文字r UEthir Xエチオピア文字r UHmngr Xパハウ・フモン文字r UBuhdr Xブヒッド文字r UCoptr Xコプト文字r UGlagr Xグラゴール文字r URunrr Xルーン文字r UOrkhr Xオルホン文字r UHungr X古代ハンガリー文字r UGrekr Xギリシャ文字r UCherr Xチェロキー文字r UZyyyr X共通コードr USyrcr Xシリア文字r UBlisr Xブリスシンボルr UBengr Xベンガル文字r USyrer X-シリア文字 (エストランゲロ文字)r USyrjr X'シリア文字 (西方シリア文字)r USyrnr X'シリア文字 (東方シリア文字)r UKndar Xカンナダ文字r uUvariantsr }r (UNEDISr Xナティゾーネ方言r UVALENCIAr Xバレンシア方言r UREVISEDr X 改訂版r UAREVMDAr X西アルメニア文語r UFONIPAr X国際音声記号r U1606NICTr! X(後期中世フランス語(〜1606)r" U1996r# Xドイツ語正書法(1996)r$ UBOONTr% Xブーントリングr& USCOUSEr' Xリバプール方言r( U1694ACADr) X初期現代フランス語r* UAREVELAr+ X東アルメニア文語r, UMONOTONr- Xモノトニックr. UROZAJr/ Xレシア方言r0 UPOSIXr1 Xコンピュータr2 UFONUPAr3 Xウラル音声記号r4 UPOLYTONr5 Xポリトニックr6 USAAHOr7 X サホ語r8 U1901r9 X(伝統的ドイツ語正書法(1901)r: uUnumber_symbolsr; }r< (Udecimalr= X.r> Ugroupr? X,r@ uUcurrency_namesrA }rB (UXXXrC X不明または無効な通貨rD UDZDrE X"アルジェリア ディナールrF ULVRrG Xラトビア ルーブルrH UGHSrI Xガーナ セディrJ UBOPrK Xボリビア ペソrL UEGPrM Xエジプト ポンドrN UBGLrO Xブルガリア レフrP UBGNrQ Xブルガリア 新レフrR UPABrS Xパナマ バルボアrT UYUMrU X2ユーゴスラビア スーパー ディナールrV UZWDrW Xジンバブエ ドルrX UGHCrY Xガーナ セディ (1979-2007)rZ UXBDr[ X$ヨーロッパ勘定単位 (EUA-17)r\ UBOBr] Xボリビアーノr^ UXBAr_ X#ヨーロッパ混合単位 (EURCO)r` UDKKra Xデンマーク クローネrb UXBCrc X#ヨーロッパ勘定単位 (EUA-9)rd UXBBre X#ヨーロッパ通貨単位 (EMU-6)rf UBWPrg Xボツワナ プラrh ULBPri Xレバノン ポンドrj UTZSrk Xタンザニア シリングrl jXベトナム ドンrm UNADrn Xナミビア ドルro UAOArp X クワンザrq UWSTrr X西サモア タラrs UAONrt X(アンゴラ 新クワンザ (1990-2000)ru UKHRrv Xカンボジア リエルrw UMYRrx Xマレーシア リンギットry UAOKrz Xクワンザ (1977-1990)r{ USOSr| Xソマリア シリングr} UKYDr~ Xケイマン諸島 ドルr ULYDr Xリビア ディナールr UUAHr Xウクライナ グリブナr UUAKr X"ウクライナ カルボバネツr UUGXr Xウガンダ シリングr UJODr Xヨルダン ディナールr UAORr X(アンゴラ 旧クワンザ (1995-1999)r USURr Xソ連 ルーブルr UAWGr Xアルバ ギルダーr USARr Xサウジ リヤルr UFIMr Xフィンランド マルカr UHKDr X 香港ドルr USRGr Xスリナム ギルダーr UTPEr Xティモール エスクードr UMGFr Xマダガスカル フランr UCHEr X WIR ユーロr UCHFr Xスイス フランr UGIPr Xジブラルタル ポンドr UBYRr Xベラルーシ ルーブルr UALLr Xアルバニア レクr UXPDr Xパラジウムr UUGSr X%ウガンダ シリング (1966-1987)r UMROr Xモーリタニア ウギアr UBOVr Xボリビア Mvdolr UHRKr Xクロアチア クーナr UDJFr Xジブチ フランr UHRDr Xクロアチア ディナールr UPESr Xペルー ソルr UEQEr Xエクウェレr UITLr Xイタリア リラr UXAFr XCFA フラン BEACr UBNDr Xブルネイ ドルr UISKr Xアイスランド クローナr UZALr X南アフリカ ランド (ZAL)r USRDr Xスリナム ドルr UNIOr X#ニカラグア コルドバ オロr ULAKr Xラオス キープr UNICr Xニカラグア コルドバr UNPRr Xネパール ルピーr UMZEr X"モザンピーク エスクードr UUYUr Xウルグアイ ペソr ULUCr X%ルクセンブルク 兌換フランr UJMDr Xジャマイカ ドルr UFRFr Xフランス フランr UMAFr Xモロッコ フランr UMZMr X"モザンピーク メティカルr UMZNr X"モザンビーク メティカルr UPHPr Xフィリピン ペソr UZARr X南アフリカ ランドr URHDr Xローデシア ドルr UGWPr Xギニアビサウ ペソr ULUFr Xルクセンブルグ フランr UBELr Xベルギー フラン (BEL)r UBECr Xベルギー フラン (BEC)r UNGNr Xナイジェリア ナイラr UYUNr X.ユーゴスラビア 新ディナール (YUN)r UBEFr Xベルギー フランr UPLZr X+ポーランド ズウォティ (1950-1995)r UCRCr Xコスタリカ コロンr UTRLr Xトルコ リラr UDEMr Xドイツ マルクr UEEKr Xエストニア クルーンr UMWKr Xマラウィ クワチャr UTTDr X"トリニダードトバゴ ドルr ULKRr Xスリランカ ルピーr USKKr Xスロバキア コルナr UCVEr X"カーボベルデ エスクードr UPKRr Xパキスタン ルピーr UHUFr Xハンガリー フォリントr UROLr Xルーマニア 旧レイr UXEUr Xヨーロッパ通貨単位r UBMDr Xバミューダ ドルr UOMRr Xオマーン リアルr ULSLr Xレソト ロティr ULSMr X マロティr UMNTr Xモンゴル トグログr UAMDr Xアルメニア ドラムr UYUDr X%ユーゴスラビア ディナールr UBUKr Xビルマ チャットr USYPr Xシリア ポンドr UQARr Xカタール リアルr UXDRr X特別引き出し権r! UNLGr" Xオランダ ギルダーr# UGEKr$ X グルジア クーポン ラリr% UMTPr& Xマルタ ポンドr' UGBPr( X英国ポンドr) UGELr* Xグルジア ラリr+ USHPr, Xセントヘレナ島 ポンドr- jXアフガニーr. USBDr/ Xソロモン諸島 ドルr0 UCSKr1 X"チェコスロバキア コルナr2 UKPWr3 X北朝鮮 ウォンr4 UXREr5 X RINET基金r6 UCSDr7 Xセルビアン ディナールr8 UAFAr9 Xアフガニー (1927-2002)r: UTHBr; Xタイ バーツr< UBYBr= X(ベラルーシ ルーブル (1994-1999)r> UBDTr? Xバングラデシュ タカr@ UGRDrA Xギリシャ ドラクマrB UYERrC Xイエメン リアルrD UDDMrE X東ドイツ マルクrF USZLrG X"スワジランド リランゲニrH UHTGrI Xハイチ グールドrJ UTRYrK X新トルコリラrL UMGArM Xマダガスカル アリアリrN UANGrO X+オランダ領アンティル ギルダーrP ULRDrQ Xリベリア ドルrR URWFrS Xルワンダ フランrT UNOKrU Xノルウェー クローネrV UMXVrW Xメキシコ UDIrX UKESrY Xケニア シリングrZ UMOPr[ Xマカオ パタカr\ jXインド ルピーr] UMXNr^ Xメキシコ ペソr_ UCZKr` Xチェコ コルナra UTJSrb Xタジキスタン ソモニrc UTJRrd Xタジキスタン ルーブルre UBTNrf Xブータン ニュルタムrg UYDDrh Xイエメン ディナールri UGWErj X+ポルトガル領ギニア エスクードrk UCOPrl Xコロンビア ペソrm UCOUrn Xレアル (UVR)ro UMTLrp Xマルタ リラrq UMURrr Xモーリシャス ルピーrs UIDRrt Xインドネシア ルピアru UHNLrv Xホンジュラス レンピラrw UXPFrx X CFP フランry UFJDrz Xフィジー諸島 ドルr{ UETBr| Xエチオピア ブルr} UPENr~ Xペルー 新ソルr UBZDr Xベリーズ ドルr UCHWr X WIR フランr UATSr Xオーストリア シリングr UILPr Xイスラエル ポンドr UZRNr Xザイール 新ザイールr UDOPr Xドミニカ ペソr ULULr X%ルクセンブルク 金融フランr UTMMr X"トルクメニスタン マナトr UTWDr X新台湾ドルr UMDLr Xモルドバ レイr UXPTr X プラチナr UECVr Xエクアドル UVCr UECSr Xエクアドル スクレr UBSDr Xバハマ ドルr USEKr Xスウェーデン クローナr UTOPr Xトンガ パ・アンガr UPEIr Xペルー インティr UZMKr Xザンビア クワチャr UMVRr X"モルディブ諸島 ルフィアr UXTSr Xテスト用通貨コードr UAUDr Xオーストラリア ドルr UADPr Xアンドラ ペセタr UCUPr Xキューバ ペソr UIEPr Xアイリッシュ ポンドr UCLFr X$チリ ウニダ デ フォメントr UBBDr Xバルバドス ドルr UKMFr Xコモロ フランr jX韓国 ウォンr UGMDr Xガンビア ダラシr UVEFr X(ベネズエラ ボリバルフエルテr UGTQr Xグアテマラ ケツァルr UVEBr Xベネズエラ ボリバルr UXOFr XCFA フラン BCEAOr USITr Xスロベニア トラールr USDPr X旧スーダン ポンドr UCLPr X チリ ペソr UEURr X ユーロr UCDFr Xコンゴ フランr jX東カリブ ドルr UKZTr Xカザフスタン テンゲr URUBr Xロシア ルーブルr UXFUr Xフランス UIC フランr UXAGr X銀r UBRRr X&ブラジル クルゼイロ レアルr UBRNr Xブラジル 新クルゼイロr UBRLr Xブラジル レアルr UMMKr Xミャンマー チャットr UUYPr X"ウルグアイ ペソ (1975-1993)r URURr X"ロシア ルーブル (1991-1998)r UPLNr Xポーランド ズウォティr UBREr X(ブラジル クルゼイロ (1990-1993)r UPYGr Xパラグアイ グアラニr UBRCr Xブラジル クルゼイロr UBRBr X+ブラジル 新クルゼイロ (1967-1986)r USVCr Xエルサルバドル コロンr UAEDr XUAE ディルハムr UGNSr Xギニア シリーr UMKDr Xマケドニア デナルr UAZMr X.アゼルバイジャン マナト (1993-2006)r UAZNr X"アゼルバイジャン マナトr UUSNr X米ドル (翌日)r UGQEr X赤道ギニア ギニーr UVUVr Xバヌアツ バツr UBADr Xボスニア ディナールr UGNFr Xギニア フランr UMXPrXメキシコ ペソ (1861-1992)rUIQDrXイラク ディナールrUERNrXエリトリア ナクファrUBAMrXボスニア マルク (BAM)rUSCRrXセイシェル ルピーr UCADr Xカナダ ドルr USDDr Xスーダン ディナールr UCYPrXキプロス ポンドrUMADrXモロッコ ディルハムrUKWDrXクウェート ディナールrUBIFrXブルンジ フランrULTTrXリトアニア タロナrUPGKrX"パプアニューギニア キナrULTLrXリトアニア リタスrUSGDrXシンガポール ドルrUUZSrXウズベキスタン スムrUSTDr X(サントメ・プリンシペ ドブラr!UXFOr"Xフランス金フランr#UMLFr$Xマリ フランr%UESPr&Xスペイン ペセタr'UIRRr(Xイラン リアルr)UZRZr*Xザイール ザイールr+jX中国人民元r,USLLr-Xシエラレオネ レオンr.UTNDr/Xチュニジア ディナールr0UGYDr1Xガイアナ ドルr2UESBr3Xスペイン 兌換ペセタr4UESAr5Xスペインペセタr6UNZDr7Xニュージーランド ドルr8UFKPr9X:フォークランド(マルビナス)諸島 ポンドr:ULVLr;Xラトビア ラッツr<UUSSr=X米ドル (当日)r>UUSDr?X 米ドルr@UARPrAX%アルゼンチン ペソ (1983-1985)rBUKGSrCXキルギスタン ソムrDUARSrEXアルゼンチン ペソrFUILSrGXイスラエル新シェケルrHURONrIXルーマニア レイrJURSDrKXディナール (セルビア)rLUBHDrMXバーレーン ディナールrNjX 日本円rOUARArPX(アルゼンチン アゥストラールrQUSDGrRXスーダン ポンドrSUPTErTXポルトガル エスクードrUUXAUrVX金rWuUmonthsrX}rY(U stand-alonerZ}r[(U abbreviatedr\}r](KX1月r^KX2月r_KX3月r`KX4月raKX5月rbKX6月rcKX7月rdKX8月reK X9月rfK X10月rgK X11月rhK X12月riuUnarrowrj}rk(KhKhKhKhKX5rlKX6rmKX7rnKX8roK X9rpK X10rqK X11rrK X12rsuuUformatrt}ru(Uwiderv}rw(KX1月rxKX2月ryKX3月rzKX4月r{KX5月r|KX6月r}KX7月r~KX8月rK X9月rK X10月rK X11月rK X12月ruU abbreviatedr}r(KX1月rKX2月rKX3月rKX4月rKX5月rKX6月rKX7月rKX8月rK X9月rK X10月rK X11月rK X12月ruuuUcurrency_formatsr}rNh*)r}r(h-Nh/Kh0KKrh2h3h3rh5KKrh7X ¤#,##0.00rh9X¤rX-¤rrh(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X #,##,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3X h:mm:ss aqRUformatqSX%(h)s:%(mm)s:%(ss)s %(a)sqTubUfullqUhO)qV}qW(h3X h:mm:ss a vqXhSX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqYubUlongqZhO)q[}q\(h3X h:mm:ss a zq]hSX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq^ubUshortq_hO)q`}qa(h3Xh:mm aqbhSX%(h)s:%(mm)s %(a)sqcubuU languagesqd}qe(UgvqfXম্যাঙ্কসqgUguqhXগুজরাটিqiUscnqjXসিসিলিয়ানqkUromqlXরোমানিqmUalgqnXআলগোঙকুইআনqoUaleqpXআলেউতqqUscoqrXস্কটসqsUmniqtXমণিপুরীquUgdqvX%স্কটস-গ্যেলিকqwUgaqxXআইরিশqyUmnoqzX%ম্যানোবো ভাষাq{Uosaq|Xওস্যাগেq}Ugnq~Xগুয়ারানিqUaltqX"দক্ষিন আলতাইqUglqXগ্যালিশিয়qUmwrqXমারোয়ারিqUtyqXতাহিতিয়ানqUtwqXটোয়াইqUttqXতাতারqUtrqXতুর্কীqUtsqXত্‍সঙ্গাqUtnqXত্‍সওয়ানাqUtoqXটঙ্গাqUausqX!অস্ট্রেলিয়qUavqXআভেরিকqUtkqXতুর্কমেনীqUthqX থাইqUroaqXরোমান ভাষাqUtgqXতাজিকqUteqXতেলেগুqUugaqXউগারিটিকqUmwlqXমিরান্ডিজqUkcgqXটাইয়াপqUsmiqXসামি ভাষাqUfatqXফান্তিqUfanqXফ্যাঙ্গqUwoqXউওলোফqUrmqX%রেটো-রোমানীয়qUdinqXডিংকাqUblaqXসিকসিকাqUcmcqXচামিক ভাষাqUmlqXমালেয়ালামqUzhqX চীনাqUtemqXটাইম্নেqUen_CAqX+কানাডীয় ইংরেজিqUnwcqX.প্রাচীন নেওয়ারীqUzaqXঝু্য়াঙqUcauqXককেশীযqUzuqX জুলুqUterqXতেরেনোqUtetqXতেতুমqUmncqXমাঞ্চুqUkutqXকুটেনাইqUsukqXসুকুমাqUkumqXকুমিকqUsusqX সুসুqUnewqXনেওয়ারিqUsuxqXসুমেরীয়qUdenqXস্ল্যাভqUmenqXমেন্ডেqUmulqX4বহুগুণিতক ভাষাসমূহqUlezqXলেজঘিয়ানqUrootqX মূলqUekaqXইকাজুকqUakkqX!আক্কাদিয়ানqUdraqX%দ্রাবীড় ভাষাqUjrbqXজুদেও আরবিqUsgnqXচিহ্ন ভাষাqUsgaqX%প্রাচীন আইরিশqUapaqXঅ্যাপাচিqUbraqXব্রাজqUchbqXচিবচাqUchgqXচাগাতাইqUchkqX চুকিqUchmqX মারিqUchnqX%চিনুক পরিভাষাqUchoqXচক্টোqUchprXচিপেওয়ানrUchrrXচেরোকিrUchyrXশাইয়েনrUtirXতিগরিনিয়াrUvotrXভোটিকr Umgr Xমালাগাসিr Uibar X ইবানr UmorXমলদাভিয়rUmnrXমঙ্গোলিয়rUmirXমাওরিrUmhrXমার্শালিজrUmkrX!ম্যাসেডোনীযrUmtrXমল্টিয়rUcairX]মধ্য যুক্তরাষ্ঠের আদিবাসীদের ভাষাrUdelrXডেলাওয়েরrUmsrX মালেrUmrr Xমারাঠিr!Utar"Xতামিলr#Umyr$Xবর্মিr%Ucadr&Xক্যাডোr'Usrnr(X(স্রানান টোঙ্গোr)Utair*Xতাই ভাষাr+Uafhr,Xআফ্রিহিলিr-Usitr.X8সিনো-তিব্বোতীয় ভাষাr/Uenmr0Xমধ্য ইংরেজিr1Uen_AUr2X4অস্ট্রেলীয় ইংরেজিr3Unynr4X!নায়াঙ্কোলেr5Unyor6Xনায়োরোr7Unymr8X$নায়ামওয়েজিr9Usior:X+সিওয়ুয়ান ভাষাr;Umapr<X'অস্ট্রোনেশীয়r=Umasr>Xমাসাইr?Ulahr@Xলান্ডাrAUladrBXলাডিনোrCUfyrDX+পশ্চিম ফ্রিসিয়rEUsnkrFXসোনিঙ্কেrGUfarHXফার্সিrIUmadrJXমাদুরেসেrKUmagrLX মাঘিrMUmairNXমৈথিলিrOUfirPXফিনিশrQUfjrRXফিজিওrSUmanrTX$ম্যান্ডিঙ্গোrUUegyrVX+প্রাচীন মিশরীয়rWUzndrXXজান্ডেrYUssrZXসোয়াতিr[Usrr\Xসার্বীয়r]Usqr^Xআলবেনীয়r_Uswr`Xসোয়াহিলিraUsvrbXসুইডিশrcUsurdXসুদানীreUstrfXদক্ষিন সোথোrgUskrhXস্লোভাকriUsirjXসিংহলীrkUshrlX4সার্বো-ক্রোয়েশিয়rmUsornXসোমালীroUsnrpX শোনাrqUsmrrXসামোয়ানrsUslrtXস্লোভেনীয়ruUscrvX$সার্ডিনোয়ানrwUsarxXসংষ্কৃতryUsgrzXসাঙ্গোr{User|X4উত্তরাঞ্চলীয় সামিr}Usdr~Xসিন্ধিrUzenrXজেনাগাrUkbdrX$কাবার্ডিয়ানrUafarX+অফ্রো-এশিয়াটিকrUcsbrXকাশুবিয়ানrUlgrXগ্যান্ডাrUlbrX-লুক্সেমবার্গীয়rUfiurX"ফিনো-ইউগ্রিকrUlnrXলিঙ্গালাrUlorX লাওrUlirX!লিম্বুর্গিশrUbynrXব্লিনrUltrXলিথুয়েনীযrUlurX%লুবা-কাটাঙ্গাrUfilrXফিলিপিনোrUyirXয়িদ্দিশrUnonrX"প্রাচীন নর্সrUcebrXচেবুয়ানোrUyorXইওরুবাrUnogrXনৌগাইrUbatrXবাল্টিকrUdakrXডাকোটাrUdarrXদার্গওয়াrUdayrXদায়াকrUssarX/নিলো-সাহারান ভাষাrUkperXক্‌পেল্লেrUelrXগ্রিকrUeorX!এস্পেরান্তোrUenrXইংরেজিrUlamrXলাম্বাrUeerXইওয়েrUmdfrXমোকশাrUfrrXফরাসিrUmdrrXম্যাণ্ডারrUetrXএস্তোনীয়rUesrXস্পেনীয়rUrurX রুশrUgonrXগোন্ডিrUgohrX;প্রাচীন উচ্চ জার্মানিrUsmsrX"স্কোল্ট সামিrUsmnrXইনারি সামিrUsmjrXলুলে সামিrUde_ATrX:অস্ট্রিয়ান জার্মানিrUgotrX গথিকrUrnrXরুন্দিrUrorXরোমানীয়rUdsbrX4নিম্নতর সোর্বিয়ানrUsmarX7দক্ষিণাঞ্চলীয় সামিrUgorrXগোরোন্তালোrUastrXআস্তুরিয়rUwalrXওয়ালামোrUcrhrX+ক্রাইমিও তুর্কিrUathrXআথাপাস্কানrUgezrX গীজrUxhrX জোসাrUffrXফুলাহ্rUkforX কোরোrUmakrXম্যাকাসারrUzaprXজাপোটেকrUkokrXকোঙ্কানিrUzxxrXVভাষাতাত্তিক বিষয়সূচী বহির্ভুতrUkosrXকোস্রাইনrUforXফেরাউনিrUtogrX(নায়াসা টোঙ্গাrUhuprX হুপাrUudmrXউডমুর্টrUbejrX বেজাrUbemrXবেম্বাrUtsirXসিমশিয়ানrUberrXবেরবেরr Unzir Xএন্.জিমাr Usair XQউত্তর আমেরিকান ইন্ডিয়ান ভাষাr UangrX(প্রাচীন ইংরেজীrUprarX"প্রাকৃত ভাষাrUbhorXভোজপুরিrUsalrX"শালিশান ভাষাrUprorX:প্রাচীন প্রোভেনক্যালrUrajrXরাজস্থানীrUsadrX$স্যান্ডাওয়েrUanprXআঙ্গীকাrUes_419rXJল্যাটিন আমেরিকান স্প্যানিশrUrapr Xরাপানুইr!Usasr"Xসাসাকr#Unqor$Xএন’কোr%Ucarr&Xক্যারিবr'Uminr(X*মিনাঙ্গ্‌কাবাউr)Umicr*Xমিকম্যাকr+Uefir,X এফিকr-Uarnr.X$অ্যারোকেনিয়r/Uypkr0X"ইয়ুপিক ভাষাr1Umisr2Xবিবিধ ভাষাr3Ukacr4Xকাচিনr5Ukabr6Xকাবাইলেr7Ukaar8X"কারা-কাল্পাকr9Ukajr:Xঅজ্জুr;Ukamr<Xকাম্বাr=Ukarr>Xকারেনr?Ukawr@X কাউইrAUfr_CHrBXসুইস ফরাসিrCUtyvrDXটুভিনিয়ানrEUfr_CArFX(কানাডীয় ফরাসিrGUkarHXজর্জিয়ানrIUdoirJXদোগরিrKUkgrLXকোঙ্গোrMUkkrNXকাজাখrOUkjrPX$কোয়ানিয়ামাrQUkirRXকিকু্ইয়ুrSUkorTXকোরিয়ানrUUknrVXকান্নাড়ীrWUkmrXX খমেরrYUklrZX'ক্যালাল্লিসুটr[Uksr\Xকাশ্মীরীr]Ukrr^Xকানুরিr_Ukwr`Xকর্ণিশraUkvrbX কোমিrcUkurdXকুর্দিreUkyrfXকির্গিজrgUtklrhXটোকেলাউriUbuarjXবুরিয়াতrkUmgarlXমধ্য আইরিশrmUhitrnXহিট্টিটroUdyurpXডিউলাrqUderrXজার্মানrsUdartXডেনিশruUdzrvXভুটানিrwUluirxXলুইসেনোryUdvrzXদিবেহিr{Uhilr|X'হিলিগ্যায়নোনr}Uhimr~XহিমাচালিrUgemrX(জার্মানিক ভাষাrUcrprX/ক্রেওল অথবা পিজিনrUqurXকেচুয়াrUbasrX বাসাrUgbarXবায়াrUbadrXবান্দাrUbanrXবালিনীয়rUbalrXবেলুচীয়rUshnrXশ্যানrUbairXবামিলেকেrUarprXআরাপাহোrUartrXকৃত্রিমrUarwrXআরাওয়াকrUarcrXআরামাইকrUen_USrX7যুক্তরাষ্ট্র ইংরেজিrUsemrX"সেমেটিক ভাষাrUselrXসেল্কুপrUnubrX%নুবিয়ান ভাষাrUbtkrXবাতাকrUlusrXলুশাইrUmusrXক্রিকrUluarX"লুবা-লুলুয়াrUirorX.ইরোকুওইয়ান ভাষাrUirarXইরানী ভাষাrUmunrXমুণ্ডা ভাষাrUlunrXলুন্ডাrUluorXলুয়োrUwarXওয়ালুনrUtuprXতুপি ভাষাrUjvrXজাভানিrUzblrXচিত্র ভাষাrUtutrX%আলতায়ীক ভাষাrUtumrXতুম্বুকাrUjarXজাপানিrUcoprXকপটিকrUilorXইলোকোrUlarXলাটিনrUgwirXগওইচ্’ইনrUundrX-অজানা বা ভুল ভাষাrUtlirXত্লিঙ্গিটrUtlhrXক্লিঙ্গনrUchrXচামেরোrUcorXকর্সিকানrUcarXকাতালানrUcerXচেচেনrUponrX$পোহ্নপেইয়ানrUcyrXওয়েলশrUsahrXইয়াকুটrUcsrX চেকrUcrrX ক্রিrUbntrXবান্টুrUcvrXচুবাসrUcurX%চার্চ স্লাভিওrUlvrXলাত্‌ভীয়rUdumrXমধ্য ডাচrUptrXপর্তুগীজrUduarXদুয়ালাrUfrorX%প্রাচীন ফরাসিrUyaprXইয়াপেসেrUfrmrXমধ্য ফরাসিrUtivrX টিভrUfrsrX(পূর্ব ফ্রিসিয়rUfrrrXFউত্তরাঞ্চলীয় ফ্রিসিয়ানrUyaorXইয়াওrUparXপাঞ্জাবীrUxalrXকাল্মাইকrUes_ESrX:আইবেরিয়ান স্প্যানিশrUpirX পালিrUen_GBrX(ব্রিটিশ ইংরেজিr Ugayr Xগায়োr Uotor Xঅটোমান ভাষাr UotarX%অটোমান তুর্কিrUhmnrXহ্‌মোঙrUmyvrXএরজিয়াrUgaarXগাrUfurrX!ফ্রিউলিয়ানrUkhirX%খোয়েশান ভাষাrUainrX আইনুrUrarrX!রারোটোগ্যানrUslarX(স্ল্যাভিক ভাষাrUver Xভেন্ডাr!Uvir"Xভিয়েতনামীr#Uisr$X'আইসল্যান্ডীয়r%Ukhor&Xখোটানিজr'Uiur(Xইনুক্টিটুটr)Uitr*Xইতালীয়r+Uvor,Xভোলাপুকr-Uiir.Xসিছুয়ানr/Uikr0Xইনুপিয়াকr1Uior2X ইডোr3Uiner4X5ইন্দো-ইউরোপীয় ভাষাr5Uiar6X-ইন্টারলিঙ্গুয়াr7Ujprr8X"জুদেও ফার্সিr9Uier:X$ইন্টারলিঙ্গ্r;Uidr<X!ইন্দোনেশীয়r=Uigr>Xইগ্‌বোr?Upapr@X'পাপিয়ামেন্টোrAUeworBXইওন্ডোrCUpaurDX!পালায়ুয়ানrEUpaarFX%পাপুয়ান ভাষাrGUpagrHX!পাঙ্গাসিনানrIUsatrJXসাঁওতালিrKUpalrLXপাহ্লাভিrMUpamrNXপাম্পাঙ্গাrOUsycrPX%প্রাচীন সিরিওrQUphirRX%ফিলিপাইন ভাষাrSUcelrTXকেল্টিকrUUphnrVXফিনিশীয়rWUnicrXXJনাইজার-কোর্ডোফানিয়ান ভাষাrYUniarZXনিয়াসr[Udgrr\Xদোগ্রীবr]Usyrr^Xসিরিয়াকr_Uniur`Xনিউয়ানraUgswrbX%সুইস জার্মানিrcUcchrdXআত্সামreUjborfXলোজবানrgUnahrhXনাহুৎলriUsamrjX.সামারিটান আরামিকrkUhairlXহাইডাrmUgmhrnX2মধ্য-উচ্চ জার্মানিroUcusrpX"কুশিতিক ভাষাrqUwenrrX(সোরবিয়ান ভাষাrsUadyrtXআদেগেruUelxrvXএলামাইটrwUadarxXঅদাগ্মেryUpt_PTrzX7আইবেরিয়ান পর্তুগিজr{Uhawr|X!হাওয়াইয়ানr}Ubinr~X বিনিrUbikrXবিকোলrUpt_BRrX7ব্রাজিলীয় পর্তুগীজrUmosrX মসিrUmohrXমোহাওকrUtlrXতাগালগrUzh_HansrXসহজ চীনাrUzh_HantrX"প্রথাগত চীনাrUtvlrXটুভালুrUijorX ইজোrUkmbrXকিম্বুন্দুrUpeorX(প্রাচীন ফার্সিrUumbrXউম্বুন্দুrUtmhrXতামাশেকrUfonrXফনrUhsbrX+উচ্চ সোর্বিয়ানrUberXবেলারুশিয়rUbgrXবুলগেরিয়rUbarXবাশকিরrUpsrXপশ্তুrUbmrXবামবারাrUbnrXবাংলাrUborXতিব্বতিrUbhrXবিহারিrUbirXবিসলামাrUbrrXব্রেটোনrUbsrXবসনীয়rUruprXআরোমানিয়rUzzarX জাজাrUomrXঅরোমোrUojrXওজিবওয়াrUacerXআচিনিয়rUachrXআকোলীrUocrXঅক্সিটানrUkrurXকুরুখrUsrrrX সেরেrUkrorX ক্রুrUkrlrXকারেলিয়ানrUkrcrX%কারচে-বাল্কারrUndsrX(নিম্ন জার্মানিrUosrXওসেটিকrUorrXউড়িয়াrUsogrXসোগডিয়ানrUnsorX4উত্তরাঞ্চলীয় সোথোrUsonrXসোঙ্গহাইrUde_CHrX2সুইস উচ্চ জার্মানিrUvairX ভাইrUwakrX(ওয়াকাশান ভাষাrUlolrXমোঙ্গোrUmkhrX মন-খমের ভাষাrUawarXআওয়াধিrUlozrX লোজিrUgilrXগিলবার্টিজrUwasrXওয়াশাrUwarrXওয়ারেrUhzrXহেরেরোrUhyrXআর্মেনিয়rUanrXআর্গোনিজrUsidrXসিডামোrUhrrX!ক্রোয়েশীয়rUhtrXহাইতিয়ানrUhurXহাঙ্গেরীয়rUhirXহিন্দিrUhorXহিরি মোতুrUharXহাউসাrUbugrXবুগিনিrUherXহিব্রুrUuzrXউজবেকীয়rUurrXউর্দুrUplrXপোলিশr Uukr Xইউক্রেনীয়r Uugr Xউইঘুরr UaarX আফারrUabrXআব্খাজিয়rUaerXআবেস্তীয়rUafrXআফ্রিকান্সrUakrX আকানrUamrXআমহারিকrUnl_BErXফ্লেমিশrUeurXবাস্কrUasrXআসামিrUarr X আরবীr!Uinhr"Xইঙ্গুশr#Utpir$Xটোক পিসিনr%Umynr&Xমায়ান ভাষাr'Uayr(Xআয়মারাr)Ukhar*X খাশিr+Uazr,X'আজারবাইজানীয়r-Uincr.X"ভারতীয় ভাষাr/Unlr0X ডাচr1Unnr2X9নরওয়েজীয় (নিনর্স্ক)r3Unor4Xনরওয়েজীয়r5Unar6Xনাউরুr7Unbr8X%নরওয়ে বোকমালr9Unair:XQউত্তৱ আমেরিকার ইন্ডিয়ান ভাষাr;Undr<X+উত্তর এন্দেবিলিr=Uner>Xনেপালীr?Ungr@Xএন্দোঙ্গাrAUnyrBXনায়াঞ্জাrCUnaprDX$নেয়াপোলিটানrEUgrbrFXগ্রেবোrGUgrcrHX%প্রাচীন গ্রীকrIUnrrJX+দক্ষিণ এনডেবেলেrKUtigrLXটাইগ্রেrMUnvrNXনাভাজোrOUzunrPX জুনিrQUrwrRX-কিনয়ারোয়ান্ডাrSUcperTXLইংরেজি জাত ক্রেওল অথবা পিজিনrUUcpfrVXIফরাসি জাত ক্রেওল অথবা পিজিনrWUcpprXXXপোর্তুগিজ-ভিত্তিক ক্রেওল বা পিজনrYuU territoriesrZ}r[(UBDr\Xবাংলাদেশr]UBEr^Xবেল্জিয়মr_UBFr`X"বুরকিনা ফাসোraUBGrbXবুলগেরিয়াrcUVErdX!ভেনেজুয়েলাreUBArfX>বসনিয়া ও হার্জেগোভিনাrgUBBrhXবারবাদোসriUWFrjX,ওয়ালিস ও ফুটুনাrkUBLrlXসেন্টrmUBMrnXবারমুডাroUBNrpXব্রুনেইrqUBOrrXবোলিভিয়াrsUBHrtXবাহরাইনruUBIrvXবুরুন্ডিrwUBJrxXবেনিনryUBTrzXভুটানr{U011r|X@পশ্চিমাঞ্চলীয় আফ্রিকাr}UBVr~Xবোভেট দ্বীপrUBWrXবতসোয়ানাrU014rX(পশ্চিম আফ্রিকাrU015rX%উত্তর আফ্রিকাrUBRrXব্রাজিলrU017rX"মধ্য আফ্রিকাrU018rX@দক্ষিণাঞ্চলীয় আফ্রিকাrU019rXআমেরিকাrUBYrX!বেলোরুশিয়াrUBZrXবেলজিয়ামrULVrXলাত্ভিয়াrURWrXরুয়ান্ডাrURSrXসারবিয়াrUTLrXপূর্ব-তিমুরrURErXরিইউনিয়নrUTMrX$তুর্কমেনিয়াrUOMrX ওমানrUTJrXতাজিকস্থানrUROrXরুমানিয়াrUTKrXটোকেলাউrUGWrXগিনি-বিসাউrUGUrXগুয়ামrUGTrX!গোয়াটিমালাrUGSrXzদক্ষিণ জর্জিয়া ও দক্ষিণ স্যান্ডউইচ দ্বীপপুঞrUGRrXগ্রীস্rUGQrX(নিরক্ষীয় গিনিrUGPrXগুয়াদেলৌপrUJPrXজাপানrUKIrXকিরিবাতিrUGYrXগিয়ানাrUGGrXগ্রাঞ্জিrUGFrX%ফরাসী গায়ানাrUGErXজর্জিয়াrUGDrXগ্রেনাডাrU021rX=উত্তরাঞ্চলীয় আমেরিকাrUGBrXগ্রেটবৃটেনrUGArXগ্যাবনrUSVrXসালভেডরrUGNrX গিনিrUGMrXগাম্বিয়াrUGLrX$গ্রীনল্যান্ডrU029rX$ক্যারাবিয়ানrUGIrX!জিব্রাল্টারrUGHrX গানাrUJErXজার্সিrUTNrXটিউনিস্rUJMrXজ্যামেকাrU013rX"মধ্য আমেরিকাrUWSrXসামোয়াrU419rXZল্যাটিন আমেরিকা এবং ক্যারাবিয়ানrUHRrX$ক্রোয়েশিয়াrUBSrX1বাহামা দ্বীপপুঞ্জrUHTrXহাইতিrUHUrXহাঙ্গেরিrUHKrX)হংকং এসএআর চীনাrU039rX:দক্ষিণাঞ্চলীয় ইউরোপrUHNrXহণ্ডুরাসrUFIrX!ফিন্ল্যাণ্ডrU142rXএশিয়াrU030rX%পশ্চিম এশিয়াrU034rX=দক্ষিণাঞ্চলীয় এশিয়াrU035rX5দক্ষিন পূর্ব এশিয়াrUPRrX'পুয়ের্টোরিকোrUPSrX+ফিলিস্তিন অঞ্চলrUFKrX:ফকল্যান্ড দ্বীপপুঞ্জrUIOrXQব্রিটিশ ভারত মহাসাগরীয় অঞ্চলrUPWrXপালাউrUPTrXপর্তুগালrUSJrX?স্বালবার্ড ও জান মেয়েনrUMDrX!মোল্দাভিয়াr UFMr X*মাইক্রোনেশিয়াr UIQr X ইরাকr UPArXপানামাrUPFrX.ফরাসী পলিনেশিয়াrUPGrX,পাপুয়া নিউ গিনিrUPErX পিরুrUPKrXপাকিস্তানrUPHrXফিলিপাইনrUFOrX1ফ্যারও দ্বীপপুঞ্জrUPNrX!পিটকেয়ার্নrUPLrXপোল্যাণ্ডrUPMr XBসেন্ট পিয়ের ও মিকুয়েলনr!UZMr"Xজাম্বিয়াr#UEHr$X(পশ্চিমী সাহারাr%URUr&Xরাশিয়াr'UEEr(Xএস্তোনিয়াr)UEGr*X মিশরr+UZAr,X(দক্ষিণ আফ্রিকাr-UECr.Xইকোয়াডরr/UITr0Xইতালীr1UVNr2Xভিয়েতনামr3UZZr4X6অজানা অথবা ভুল স্থানr5USBr6X.সলোমন দ্বীপপুঞ্জr7UETr8Xইফিওপিয়াr9USOr:Xসোমালিr;UZWr<X!জিম্বাবুয়েr=USAr>Xসাউদি আরবr?UESr@Xস্পেনrAUERrBXইরিত্রিয়াrCUMErDX!মন্টিনিগ্রোrEUAQrFX$এন্টার্কটিকাrGUMGrHX!মাদাগাস্কারrIUMFrJX%সেন্ট মার্টিনrKUMArLXমোরক্কোrMUMCrNXমোনাকোrOUUZrPX$উজ্বেকিস্থানrQUMMrRXমায়ানমারrSUMLrTX মালিrUUMOrVX2ম্যাকাও এসএআর চীনাrWUMNrXXমঙ্গোলিয়াrYUHMrZXmহার্ড দ্বীপ এবং ম্যাকডোনাল্ড দ্বীপপুঞ্জr[UASr\X.আমেরিকান সামোয়াr]UMKr^X'ম্যাসাডোনিয়াr_UMUr`XমরিশাসraUMTrbXমাল্টাrcUMWrdXমালাউইreUMVrfXমালদ্বীপrgUMQrhXমার্টিনিকriUMPrjXbউত্তরাঞ্চলীয় মারিয়ানা দ্বীপপুঞ্জrkUMSrlXমন্টসেরাটrmUMRrnXমরিতানিয়াroUIMrpXম্যানদ্বীপrqUUGrrXউগান্ডাrsUTZrtX!তাঞ্জানিয়াruUMYrvX!মাল্যাশিয়াrwUMXrxXমক্সিকোryUILrzXইস্রায়েলr{UFRr|Xফ্রান্সr}UAWr~XআরুবাrUDOrX=ডোমেনিকান প্রজাতন্ত্রrUSHrXসেন্ট হেলেনrUVCrXXসেন্ট ভিনসেন্ট ও দ্যা গ্রেনাডিনসrU054rXম্যালেনিশাrUDJrXজিবুতিrUFJrX ফিজিrU057rX.ম্যালেনিশা অঞ্চলrU172rXMস্বাধীন রাষ্ট্রের কমনওয়েলথrU053rXSঅস্ট্রেলিয়া এবং নিউজিল্যান্ডrUNIrX!নিকারাগোয়াrUNLrXহলণ্ডrUNOrXনরওয়েrUNArXনামিবিয়াrUVUrXভানুয়াটুrUNCrX1নিউ ক্যালেডোনিয়াrUNErXনাইজারrUNFrX"নিরফোক দ্বীপrUNGrXনাইজেরিয়াrUNZrXনিউ জিলণ্ডrUNPrXনেপালrUNRrXনাউরুrUNUrXনিউয়েrU061rXপলিনেশিয়াrUCIrXআইভরি কোস্টrUCHrXসুইজর্লণ্ডrUCOrX!কোলোম্বিয়াrUCNrX চীনrUCMrXক্যামেরুনrUCLrX চিলিrUCCrX.কোকোস দ্বীপপুঞ্জrUCArXকানাডাrUCGrXকঙ্গোrUCFrXGমধ্য আফ্রিকান প্রজাতন্ত্রrUCDrX'কঙ্গো - কিনসাসাrUCZrX+চেক প্রজাতন্ত্রrUCYrXসাইপ্রাসrUCXrX(ক্রিসমাস দ্বীপrUCRrXকোস্টারিকাrUPYrX!প্যারাগোয়েrUCVrXকেপভার্দেrUCUrXকিউবাrUSZrX*সোয়াজিল্যান্ডrUSYrXসিরিয়াrUKGrX!কির্গিজিয়াrUKErXকেনিয়াrUSRrXসুরিনামrU143rXমধ্য এশিয়াrUKHrXকাম্বোজrUKNrX0সেন্ট কিটস ও নেভিসrUKMrXকমোরোসrUSTrX;সাওটোমা ও প্রিন্সিপালrUSKrX!শ্লোভাকিয়াrUKRrX(দক্ষিণ কোরিয়াrUSIrX!স্লোভানিয়াrUKPrX%উত্তর কোরিয়াrUKWrXকুয়েতrUSNrXসেনেগালrUSMrXসান মারিনোrUSLrX!সিয়েরালিওনrUSCrXসিসিলিrUKZrXকাজাকস্থানrUKYrX4কেম্যান দ্বীপপুঞ্জrUSGrXসিঙ্গাপুরrUSErXসুইডেনrUSDrXসুদানrU151rX"পশ্চিম ইউরোপrU150rXইউরোপrUDMrXডোমেনিকাrU155rX:পশ্চিমাঞ্চলীয় ইউরোপr U154r X7উত্তরাঞ্চলীয় ইউরোপr UVGr XJব্রিটিশ ভার্জিন দ্বীপপুঞ্জr UDErXজার্মানিrUYErX ইমেনrUMHrX4মার্শাল দ্বীপপুঞ্জrU062rX2দক্ষিন মধ্য এশিয়াrUDZrXএলজিরিয়াrUUSrX:মার্কিন যুক্তরাষ্ট্রrUUYrXউরুগোয়েrUYTrXমায়োত্তেrUUMrXযুক্তরাষ্ট্রের ক্ষুদ্র ও পার্শ্ববর্তী দ্বীপপুঞ্জrULBr Xলেবাননr!ULCr"X%সেন্ট লুসিয়াr#ULAr$X লাওসr%UTVr&Xটুভালুr'UTWr(Xতাইওয়ানr)UTTr*X8ত্রিনিনাদ ও টোব্যাগোr+UTRr,Xতুরস্কr-ULKr.Xশ্রীলঙ্কাr/ULIr0X!লিচেনস্টেইনr1UCKr2X(কুক দ্বীপপুঞ্জr3UTOr4Xটোঙ্গাr5ULTr6Xলিত্ভাr7ULUr8X$লাক্সেমবার্গr9ULRr:Xলাইবিরিয়াr;ULSr<Xলেসোথোr=UTHr>X থাইr?UTFr@X1ফরাসী দক্ষিণাঞ্চলrAUTGrBX টোগোrCUTDrDX চাদrEUTCrFXHতুর্কস ও কাইকোস দ্বীপপুঞ্জrGULYrHXলিবিয়াrIUVArJX(ভ্যাটিকান সিটিrKU145rLX=পশ্চিমাঞ্চলীয় এশিয়াrMUAErNX2সংযুক্ত আরব আমিরাতrOUADrPXএ্যান্ডোরাrQUAGrRX8এন্টিগুয়া ও বারবুডাrSUAFrTX!আফগানিস্তানrUUAIrVX!এ্যাঙ্গুইলাrWUVIrXXJমার্কিন ভার্জিন দ্বীপপুঞ্জrYUISrZXআইসলণ্ডr[UIRr\X ইরানr]UAMr^Xআর্মেনিয়াr_UALr`X!আলব্যানিয়াraUAOrbXএ্যাঙ্গোলাrcUANrdXIনেদারল্যান্ডস এ্যান্টিলিসreU003rfX"উত্তর আমেরিকrgU002rhXআফ্রিকাriU001rjXপৃথিবীrkUARrlX$আর্জেণ্টাইনাrmUAUrnX$অস্ট্রেলিয়াroUATrpXঅস্ট্রিয়াrqU005rrX(দক্ষিন আমেরিকাrsUINrtX ভারতruUAXrvX1আলান্ড দ্বীপপুঞ্জrwU009rxXওসানিয়াryUAZrzXআজারবাইজানr{UIEr|Xআয়ার্লণ্ডr}UIDr~X$ইন্দোনেশিয়াrUJOrXজর্ডনrUQUrX.ইউরোপীয় ইউনিয়নrUUArXইউক্রেইনrUQArXকাতারrUDKrXডেন্মার্কrUMZrXমোজাম্বিকrUQOrX4আউটলাইনিং ওসানিয়াruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X d MMM, yyyyrhSX%(d)s %(MMM)s, %(yyyy)srubUfullrhO)r}r(h3XEEEE, d MMMM, yyyyrhSX"%(EEEE)s, %(d)s %(MMMM)s, %(yyyy)srubUlongrhO)r}r(h3X d MMMM, yyyyrhSX%(d)s %(MMMM)s, %(yyyy)srubUshortrhO)r}r(h3Xd/M/yyrhSX%(d)s/%(M)s/%(yy)srubuUcurrency_symbolsr}r(UBDTrX৳rUINRrX টাকাruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXকানেরিrsUAntarctica/Mawsonr}rjX মসোনrsUAmerica/Buenos_Airesr}rjX.বুয়েনোস আয়েরেসrsUAustralia/Melbourner}rjXমেলবার্নrsU Pacific/Waker}rjXওয়েকrsUAmerica/Nipigonr}rjXনিপিগোনrsUAmerica/Louisviller}rjXলুইসভিলrsUAmerica/Indiana/Tell_Cityr}rjX5টেলসিটি, ইন্ডিয়ানাrsUAustralia/Darwinr}rjXডারউইনrsUAmerica/Whitehorser}rjX%হো্য়াইট হর্সrsUAntarctica/Davisr}rjXডেভিসrsUAmerica/Coral_Harbourr}rjX%কোরাল হার্বারrsUAmerica/Swift_Currentr}rjX(সুইফ্ট কারেন্টrsU Europe/Samarar}rjXসামারাrsUEurope/Simferopolr}rjXসিমফেরোপোলrsUAmerica/Maceior}rjXমাসেয়োrsU Asia/Magadanr}rjXম্যাগাডানrsUEurope/Zaporozhyer}rjXজাপোরোঝাrsU Asia/Kashgarr}rjXক্যাশগারrsUAmerica/Detroitr}rjXডেট্রোইটrsU Asia/Kuchingr}rjXকুচিংrsU Asia/Urumqir}rjXউরুমকিrsU Europe/Moscowr}rjXমস্কোrsUAmerica/Indiana/Knoxr}rjX,নক্স, ইন্ডিয়ানাrsUAmerica/Indiana/Petersburgr}rjXGপিটারর্সবার্গ, ইন্ডিয়ানাrsUPacific/Kiritimatir}rjXকিরিতিমাতিrsUAsia/Pontianakr}rjX'পন্টিয়ান্যাকrsUAsia/Ulaanbaatarr}r jXউলানবাতারr sUAmerica/Rainy_Riverr }r jXরেইনি রিভারr sUAmerica/Argentina/San_Luisr}rjXসান লুইসrsUAntarctica/Rotherar}rjXরথেরাrsUAustralia/Adelaider}rjXএ্যাডেলেইডrsUAmerica/Indianapolisr}rjX-ইন্ডিয়ানাপোলিসrsUAmerica/Reginar}rjXরেজিনাrsU Pacific/Trukr}rjXট্রুকrsUAmerica/Cambridge_Bayr }r!jXকেমব্রিজ বেr"sUAmerica/Mexico_Cityr#}r$jX%মেক্সিকো সিটিr%sU America/Boiser&}r'jXবয়জিr(sUPacific/Chathamr)}r*jXচ্যাঠামr+sUPacific/Midwayr,}r-jXমিডওয়েr.sU America/Jujuyr/}r0jXহুহুইr1sUAmerica/Cordobar2}r3jXকর্ডোবাr4sU America/Belemr5}r6jXবেলেমr7sU Asia/Harbinr8}r9jXহার্বিনr:sUAustralia/Lord_Hower;}r<jXলর্ড হাওr=sUAmerica/Argentina/San_Juanr>}r?jXসান হুয়ানr@sUPacific/KosraerA}rBjXকোসরায়rCsUAmerica/North_Dakota/New_SalemrD}rEjX=নিউ সালেম, উত্তর ডাকোটাrFsUAmerica/MonterreyrG}rHjXমন্টেরিrIsUAsia/KrasnoyarskrJ}rKjX0ক্রাসনোইয়ার্স্কrLsUAmerica/Boa_VistarM}rNjX"বোয়া ভিস্তাrOsUAsia/YekaterinburgrP}rQjX0ইয়েকাটেরিনবার্গrRsUAustralia/CurrierS}rTjXকিউরিrUsUAntarctica/CaseyrV}rWjXকেইসিrXsUPacific/HonolulurY}rZjXহনোলুলুr[sUPacific/Enderburyr\}r]jXএন্ডারবারিr^sU America/Thuler_}r`jX থুলিrasUAmerica/St_Johnsrb}rcjXসেন্ট জন্সrdsUAmerica/Monctonre}rfjXমঙ্কটোনrgsUPacific/Majurorh}rijXমাজুরোrjsUAmerica/Mazatlanrk}rljXমাজাটলানrmsUAsia/Choibalsanrn}rojX'চোইবাল্‌স্যানrpsUAmerica/Blanc-Sablonrq}rrjX+ব্লাঙ্ক-সাব্লোনrssU Europe/Kievrt}rujXকিয়েভrvsUAntarctica/Syowarw}rxjXসিওয়াrysUAmerica/Halifaxrz}r{jX'হ্যালিফ্যাক্সr|sUAntarctica/McMurdor}}r~jX!ম্যাকমুর্ডোrsU Asia/Hovdr}rjXহোভ্ডrsUAmerica/Danmarkshavnr}rjX*ডানমার্কশ্যাভনrsUAmerica/Thunder_Bayr}rjXথান্ডার বেrsUAmerica/Scoresbysundr}rjX0স্কোর্সবায়সুন্ডrsUAmerica/Eiruneper}rjXআইরুনেপেrsUAmerica/Manausr}rjXমানাউসrsUAmerica/Los_Angelesr}rjX(লস এ্যাঞ্জেলেসrsUAmerica/Noronhar}rjXনরোন্‌হাrsUAmerica/Goose_Bayr}rjXগুস বেrsUAmerica/Catamarcar}rjX$ক্যাটামার্কাrsUAmerica/Chihuahuar}rjX$চিহুয়াহুয়াrsUAmerica/Argentina/Rio_Gallegosr}rjX"রিও গায়েগোসrsUPacific/Gambierr}rjXগাম্বিয়েরrsUAmerica/Vancouverr}rjX!ভ্যাঙ্কুভারrsUEurope/Volgogradr}rjX!ভোল্গোগ্রাদrsUEurope/Uzhgorodr}rjXউঝগোরোডrsUPacific/Ponaper}rjXপোনাপেrsU Asia/Aqtaur}rjXআকটাউrsUAmerica/Sao_Paulor}rjXসাও পাউলোrsUAmerica/Edmontonr}rjXএডমন্টোনrsUAustralia/Perthr}rjXপার্থrsUAmerica/Mendozar}rjXমেন্ডোজাrsUAmerica/Meridar}rjXমেরিডাrsUPacific/Easterr}rjXইস্টারrsU Asia/Jakartar}rjXজাকার্তাrsUAntarctica/Palmerr}rjXপামারrsUAustralia/Sydneyr}rjXসিডনিrsUAtlantic/Madeirar}rjXমাডেইরাrsU Asia/Oralr}rjX ওরালrsUAmerica/Campo_Grander}rjX+কাম্পো গ্রান্ডেrsUAmerica/Dawson_Creekr}rjXডসোন ক্রিকrsUAfrica/Kinshasar}rjXকিনশাসাrsUAntarctica/Vostokr}rjXভস্টোকrsUAustralia/Lindemanr}rjXলিনডেম্যানrsUAmerica/Porto_Velhor}rjX(পোর্তো ভেল্‌হোrsUAmerica/Argentina/Ushuaiar}rjXউশুয়াইয়াrsUPacific/Galapagosr}rjX'গ্যালাপ্যাগোসrsUAmerica/Indiana/Marengor}rjX8মারেঙ্গো, ইন্ডিয়ানাrsU Africa/Ceutar}rjXসেউটাrsUAmerica/Winnipegr}rjXউইনিপেগrsUAmerica/Dawsonr}rjX ডসোনrsUAustralia/Brisbaner}rjXব্রিসবেনrsU Asia/Aqtober}rjXআকটোবেrsUAmerica/Recifer}rjXরেসিফেrsU Asia/Sakhalinr}rjXসাখালিনrsUPacific/Kwajaleinr}rjX!কোয়াজালেইনr sUAmerica/Fortalezar }r jXফোর্টালেজাr sUAustralia/Broken_Hillr }rjXব্রোকেন হিলrsUAmerica/Phoenixr}rjXফিনিক্সrsUAmerica/Cuiabar}rjXকুইয়াবাrsUAmerica/Kentucky/Monticellor}rjX5মন্টিচেলো, কেন্টাকিrsUPacific/Tarawar}rjXটারাওয়াrsUAmerica/Yellowknifer}rjXইয়েলোনাইফrsUAmerica/Rio_Brancor}r jX"রিও ব্রাঙ্কোr!sUAmerica/Cancunr"}r#jXক্যানকুনr$sUAsia/Vladivostokr%}r&jX$ভ্লাদিভস্তোকr'sUPacific/Johnstonr(}r)jXজনস্টনr*sUEurope/Kaliningradr+}r,jX$কালিনিঙগ্রাডr-sU Asia/Makassarr.}r/jXমাকাসসারr0sUAsia/Qyzylordar1}r2jXকিজিলর্ডাr3sUAmerica/Argentina/Tucumanr4}r5jXটুকুমানr6sUAtlantic/Azoresr7}r8jXআজোরেসr9sUAsia/Chongqingr:}r;jXচোঙকিংr<sUAustralia/Euclar=}r>jXইউক্লাr?sUAmerica/Chicagor@}rAjXশিকাগোrBsUAmerica/Rankin_InletrC}rDjX.র‌্যাঙ্কিন ইনলেটrEsUAmerica/IqaluitrF}rGjXইকুয়ালুইটrHsU Asia/IrkutskrI}rJjXইর্কুট্স্কrKsUAsia/SamarkandrL}rMjXসমরখন্দrNsUAmerica/MenomineerO}rPjXমেনোমিনিrQsUAmerica/DenverrR}rSjXডেনভারrTsUAsia/KamchatkarU}rVjXকামচাটকাrWsUAmerica/Glace_BayrX}rYjXগ্লাস বেrZsU Asia/Jayapurar[}r\jXজয়াপুরাr]sUAmerica/Hermosillor^}r_jX!হারমোসিল্লোr`sUAmerica/North_Dakota/Centerra}rbjX0মধ্য, উত্তর ডাকোটাrcsUAmerica/Pangnirtungrd}rejX*প্যাঙ্গনির্টুংrfsUAmerica/Resoluterg}rhjXরেসোলুটrisUAmerica/Indiana/Vevayrj}rkjX2ভেভেয়, ইন্ডিয়ানাrlsU Asia/Yakutskrm}rnjX!ইয়াকুট্স্কrosUAmerica/Shiprockrp}rqjXশিপ্রকrrsUAmerica/Tijuanars}rtjX!তিয়াওয়ানাrusU America/Adakrv}rwjX আডাকrxsUAntarctica/DumontDUrvillery}rzjX+ডুমন্ট ডি’উরভিলr{sUAmerica/Indiana/Vincennesr|}r}jX>ভিনসেন্নেস, ইন্ডিয়ানাr~sU Asia/Almatyr}rjXআলমাটিrsUAmerica/Argentina/La_Riojar}rjXলা রিওহাrsUAsia/Novosibirskr}rjX$নভোসিবির্স্কrsUAmerica/Indiana/Winamacr}rjX;উইনাম্যাক, ইন্ডিয়ানাrsUAfrica/Lubumbashir}rjXলুবুম্বাশিrsUPacific/Marquesasr}rjXমার্কেসাসrsU Asia/Anadyrr}rjXঅ্যানাডিরrsUAmerica/New_Yorkr}rjXনিউইয়র্কrsU America/Nomer}rjX নোমrsUAmerica/Yakutatr}rjXইয়াকুটাটrsUAustralia/Hobartr}rjXহোবার্টrsUAmerica/Juneaur}rjX জুনোrsUAmerica/Inuvikr}rjXইনুভ্যাকrsUAmerica/Araguainar}rjX!আরাগুয়াইনাrsUAmerica/Montrealr}rjX!মন্ট্রিয়ালrsUAmerica/Torontor}rjXটোরন্টোrsU Etc/Unknownr}rjXঅজানাrsU America/Bahiar}rjXবাহিয়াrsUAmerica/Anchorager}rjXএনকোরেজrsU Asia/Omskr}rjXওম্স্কrsUAntarctica/South_Poler}rjXদক্ষিণ মেরুrsuUscriptsr}r(UZsymrXপ্রতীকসমুহrUGururXগুরুমুখিrUHebrrXহিব্রুrUZzzzrX-অজানা বা ভুল ভাষাrUPhnxrXফিনিশিয়rUMoonrX মুনrUSamrrXসমেরিটনrUChamrXচ্যামrUArabrX আরবিrUGujrrXগুজরাটিrUZxxxrXঅলিখিতrULycirXলাইসিয়ানrUSinhrXসিংহলিrUTalurXনতুন তাই লুrUMongrXমোঙ্গোলীয়rUXpeorX(প্রাচীন ফার্সিrUVisprX%দৃশ্যমান ভাষাrURjngrXরেজ্যাঙ্গrUOlckrXওই চিকিrUTalerXতাইলেrUMandrX!ম্যান্ডায়ীনrUManirXম্যানিচাইনrUMlymrXমালায়ালামrUTibtrXতিব্বতিrUKalirXকায়াহ লিrUJpanrXজাপানীrUPlrdrX(পোলার্ড ধ্বনিকrUKanarXকাটাকানাrULydirXলাইডিয়ানrULepcrXলেপ্চাrUSundrXসান্দানিজrUYiiirXউইrUJavar X জাভাr UOryar Xউড়িয়াr ULaoor X লাওr UUgarr Xউগারিটিকr UCyrlr Xসিরিলিকr UVaiir X ভাইr UArmnr Xআর্মেনীয়r UCyrsr XIস্লাবোনিক সিরিলিক (প্রাচীন)r UKhmrr X খমেরr UArmir X আরমিr USylor X"সিলেটি নাগরিr UItalr X%প্রাচীন ইতালিr USgnwr Xচিহ্ন লিখনr UXsuxr X>সুমের-আক্কাদীয় কীলকরূপr UThaar X থানাr UThair X থাইr UCprtr Xসাইপ্রোয়েটr! ULinbr" Xলিনিয়ার বিr# ULinar$ Xলিনিয়ার এr% UOsmar& Xওসমানিয়r' USaurr( Xসৌরাষ্ট্রr) UHirar* Xহিরাগানাr+ UHanir, Xহ্যানr- UEgydr. X(মিশরীয় ডেমোটিকr/ UQaair0 X কাইr1 UEgyhr2 X+মিশরীয় হায়রেটিকr3 UCansr4 Xক্যান্সr5 UEgypr6 X4মিশরীয় হায়ারোগ্লিপr7 UZmthr8 X%গানিতিক চিহ্নr9 UTfngr: Xতিফিনাগr; UShawr< Xসাভিয়ানr= UCirtr> Xকির্টr? UGeorr@ Xজর্জিয়ানrA UTengrB Xতেঙ্গোয়ারrC UHrktrD X>কাটাকানা অথবা হিরাগানাrE UGeokrF X(জর্জিয় খুৎসুরিrG UTavtrH Xতাই ভিয়েৎrI UOgamrJ X ওঘামrK UDsrtrL XদেসেরাতrM UGothrN XগোথিকrO UHanorP Xহ্যানুনুrQ UBalirR Xবালীয়rS UKorerT Xকোরিয়ানrU UHangrV Xহাঙ্গুলrW UCarirX Xক্যারিয়ানrY UAvstrZ Xআভেসতানr[ UTagbr\ Xটাগোওয়ানাr] UHansr^ X%সরলীকৃত হ্যানr_ UHantr` X%প্রথাগত হ্যানra URororb X$রোঙ্গোরোঙ্গোrc UDevard Xদেবনাগরিre UIndsrf Xসিন্ধুrg UBoporh Xবোপোমোফোri UMymrrj Xমায়ানমারrk UTglgrl Xটাগালগrm UPermrn X+প্রাচীন পার্মিকro UBugirp X বুগিrq UPhagrr Xফাগ্সপাrs UBrairt Xব্রাইলেru UBrahrv Xব্রাহ্মীrw UBatkrx Xবাটাকry UMerorz Xমেরোটিকr{ ULimbr| Xলিম্বুr} UMteir~ X"মেইটেই মায়েকr UPhlir Xখদিত পাহলভিr UTelur Xতেলেগুr UTamlr Xতামিলr USarar Xসারাতিr UPhlpr X%সল্টার পাহলভিr ULatgr X+গ্যালিক ল্যাটিনr ULatfr X1ফ্রাক্টুর ল্যাটিনr UKharr Xখরোষ্ঠীr UNkoor X এনকোr UPhlvr X%পুস্তক পাহলভিr ULatnr Xল্যাটিনr UMayar X1মায়ান হায়ারোগ্লিপr ULanar Xলান্নাr UEthir Xইথিওপিয়r UKthir Xকাইথিr UHmngr Xফাহাও মঙr UBuhdr Xবুহি্দr UCoptr Xকোপ্টিকr UPrtir Xপার্থিয়নr UGlagr X!গ্লাগোলিটিকr URunrr Xরুনিকr UOrkhr Xঅর্খোনr UCakmr Xচাকমাr UHungr X.পুরোনো হাঙ্গেরীয়r UGrekr Xগ্রিকr UCherr Xচেরোকিr UZyyyr Xসাধারনr USyrcr Xসিরিয়াকr UBlisr X!ব্লিসপ্রতীকr UBengr Xবাংলাr USyrer X@এস্ট্রেঙ্গেলো সিরিয়াকr USyrjr X=পশ্চিমাঞ্চলীয় সিরিয়াকr USyrnr X:পূর্বাঞ্চলীয় সিরিয়াকr UKndar Xকান্নাডাr uUvariantsr }r Unumber_symbolsr }r Ucurrency_namesr }r (UXXXr X3অজানা বা ভুল মুদ্রাr UDZDr X(আলজেরীয় দিনারr ULVRr X.ল্যাটভিয়ান রুবলr UGHSr Xঘানা সেডিr UBOPr X(বলিভিয়ান পেসোr UEGPr X(মিশরীয় পাউন্ডr UBGLr X5বুলগেরীয় হার্ড লেভr UBGNr X/বুলগেরীয় নিউ লেভr UPABr X+পানামা বেলবোয়াr UYUMr XAযুগোশ্লাভিয় নোভি দিনারr UZWDr X.জিম্বাবুয়ে ডলারr UGHCr X5ঘানা সেডি (১৯৭৯-২০০৭)r UBOBr Xবলিভিয়ানোr UDKKr X%ড্যানিশ ক্রৌনr UXBBr X5ইউরোপীয় আর্থিক এককr UBWPr X+বত্সওয়ানা পুলাr ULBPr X(লেবানিজ পাউন্ডr UTZSr X.তাঞ্জনিয়া শিলিংr UVNDr X+ভিয়েতনামি ডঙ্গr UNADr X(নামিবিয়া ডলারr UAOAr X:এ্যাঙ্গোলান কওয়ানজাr UWSTr XPপশ্চিমাঞ্চলীয় সামোয়ান টালাr UAONr Xcএ্যাঙ্গোলান নতুন কওয়ানজা (১৯৯৫-২০০০)r UKHRr X4কম্বোডিয়ান রিয়েলr UMYRr X:মালয়েশিয়ান রিঙ্গিৎr UAOKr XVএ্যাঙ্গোলান কওয়ানজা (১৯৭৭-১৯৯০)r UKYDr XGকেম্যান দ্বীপপুঞ্জের ডলারr ULYDr X%লিবিয়ান ডলারr UUAHr X1ইউক্রেইন হৃভনিয়াr UUAKr XCইউক্রেইন কার্বোভ্যান্টসr UUGXr X(উগান্ডান শিলিংr UJODr X1জর্ডানিয়ান দিনারr UAORr XVএ্যাঙ্গোলান কওয়ানজা (১৯৯৫-১৯৯৯)r USURr X%সোভিয়েত রুবলr UAWGr X%আরুবা গিল্ডারr USARr X%সৌদি রিয়্যালr ULTLr X.লিথুইনিয়ান লিটাr UHKDr Xহংকং ডলারr USRGr X+সুরিনাম গিল্ডারr UTPEr X"তিমুর এসকুডোr UMGFr X7মাদাগাস্কার ফ্রাঙ্কr UCHEr X4সুইজারল্যান্ড ইউরোr UCHFr X"সুইস ফ্রাঙ্কr UGIPr X4জিব্রাল্টার পাউন্ডr! UBYRr" X4বেলারুশিয়ান রুবেলr# UALLr$ X(আলবেনিয়ান লেকr% UXPDr& X$প্যালেডিয়ামr' UUGSr( XDউগান্ডান শিলিং (১৯৬৬-১৯৮৭)r) UMROr* X=মৌরিতানিয়ান ওউগুইয়াr+ UBOVr, X+বলিভিয়ান মভডোলr- UHRKr. X4ক্রোয়েশিয়ান কুনাr/ UDJFr0 X(জিবুতি ফ্রাঙ্কr1 UHRDr2 X7ক্রোয়েশিয়ান দিনারr3 UPESr4 X(পেরুভিয়ান সোলr5 UEQEr6 Xইকুয়েলেr7 UITLr8 X"ইতালীয় লিরাr9 UXAFr: X>সিএফএ ফ্র্যাঙ্ক বিইএসিr; UBNDr< X"ব্রুনেই ডলারr= UUYPr> XAউরুগুয়ে পেসো (১৯৭৫-১৯৯৩)r? UZALr@ XDদক্ষিণ আফ্রিকান র‌্যান্ডrA USRDrB X"সুরিনাম ডলারrC UNIOrD XDনিকারাগুয়ান কর্ডোবা ওরোrE ULAKrF Xলেউশান কিপrG UNICrH X:নিকারাগুয়ান কর্ডোবাrI UNPRrJ Xনেপালি রুপিrK UMZErL X.মোজাম্বিক এসকুডোrM UUYUrN XAউরুগুয়ে পেসো উরুগুয়েওrO ULUCrP X_লুক্সেমবার্গ রুপান্তযোগ্য ফ্রাঙ্কrQ UJMDrR X+জ্যামাইকান ডলারrS UFRFrT X%ফরাসি ফ্রাঙ্কrU UMAFrV X1মোরোক্কান ফ্রাঙ্কrW UMZMrX XGপ্রাচীন মোজাম্বিক মেটিকেলrY UMZNrZ X1মোজাম্বিক মেটিকেলr[ UPHPr\ X%ফিলিপাইন পেসোr] UZARr^ X;দক্ষিণ আফ্রিকান রেন্ডr_ URHDr` X+রোডেশিয়ান ডলারra UGWPrb X)গিনি বিসাউ পেসোrc ULUFrd X:লুক্সেমবার্গ ফ্রাঙ্কre UBELrf XFবেলজিয়ান ফ্রাঙ্ক (আর্থিক)rg UBECrh X[বেলজিয়ান ফ্রাঙ্ক (রূপান্তরযোগ্য)ri UNGNrj X4নাইজেরিয়ান নায়রাrk UYUNrl X\যুগোশ্লাভিয় রুপান্তরযোগ্য দিনারrm UBEFrn X1বেলজিয়ান ফ্রাঙ্কro UPLZrp X>পোলিশ জ্লোটি (১৯৫০-১৯৯৫)rq UCRCrr X/কোস্টা রিকা কোলোনrs UTRLrt X5প্রাচীন তুর্কি লিরাru UDEMrv Xডয়চ্ মার্কrw UEEKrx X1এস্তোনিয়া ক্রুনিry UMWKrz X1মালাউইয়ান কওয়াচr{ UTTDr| XEত্রিনিদাদ এবং টোবাগো ডলারr} ULKRr~ X+শ্রীলঙ্কান রুপিr USKKr X(স্লোভাক কোরুনাr UCVEr X/কেপ ভার্দে এসকুডোr UPKRr X+পাকিস্তানি রুপিr UHUFr X:হাঙ্গেরিয়ান ফোরিন্টr UROLr XAপ্রাচীন রুমানিয়া লেয়ুr UXEUr X5ইউরোপীয় মুদ্রা এককr UBMDr X(বারমিউডান ডলারr UOMRr X"ওমানি রিয়ালr ULSLr Xলেসুটু লোটিr ULSMr Xমালোটিr UMNTr X4মঙ্গোলিয়ান তুগরিকr UAMDr X.আরমেনিয়ান দ্রামr UYUDr XDযুগোশ্লাভিয় হার্ড দিনারr UBUKr X"বর্মি কিয়াৎr USYPr X+সিরিয়ান পাউন্ডr UQARr X(কাতার রিয়্যালr UNLGr X:নেদারল্যান্ড গুল্ডেরr UGEKr X8জর্জিয়ান কুপন লারিটr UMTPr X%মাল্টা পাউন্ডr UGBPr XDব্রিটিশ পাউন্ড স্টার্লিংr UGELr X(জর্জিয়ান লারিr USHPr X5সেন্ট হেলেনা পাউন্ডr UAFNr Xআফগানিr USBDr X;সলোমন দ্বীপপুঞ্জ ডলারr UCSKr XDচেকোস্লোভাক হার্ড কোরুনাr UKPWr X4নাইজেরিয়ান পাউন্ডr UCSDr XAপ্রাচীন সারবিয়ান দিনারr UAFAr X.আফগানি (১৯২৭-২০০২)r UTHBr Xথাই বাতr UBYBr XZবেলারুশিয়ান নিউ রুবেল (১৯৯৪-১৯৯৯)r jX%বাংলাদেশ টাকাr UGRDr X%গ্রীক দ্রাচমাr UYERr X+ইয়েমেনি রিয়ালr UDDMr X5পূর্ব জার্মান মার্কr USZLr XIসোয়াজিল্যান্ড লিলাঙ্গেনিr UHTGr X"হাইতি গৌর্দেr UTRYr Xতুর্কি লিরাr UMGAr X:মাদাগাস্কার আরিয়ারিr UANGr Xeনেদারল্যান্ড এ্যান্টিলিয়ান গুল্ডেরr ULRDr X.লাইবেরিয়ান ডলারr URWFr X4রুয়ান্ডান ফ্রাঙ্কr UNOKr X"নরওয়ে ক্রৌনr UKESr X(কেনিয়ান শিলিংr UMOPr X.ম্যাক্যাও পাটাকাr jX"ভারতীয় রুপিr UMXNr X.ম্যাক্সিকান পেসোr UCZKr X4চেকোস্লোভাক কোরুনাr UTJSr X4তাজিকিস্তান সোমোনিr UTJRr X.তাজিকিস্তান রুবলr UBTNr X1ভুটান এনগুল্ট্রুমr UYDDr X(ইয়েমেনি দিনারr UGWEr X8পর্তুগিজ গিনি এসকুডোr UCOPr X.কলোম্বিয়ান পেসোr UMTLr Xমাল্টা লিরাr UMURr X1মৌরিতানিয়ান রুপিr UIDRr X=ইন্দোনেশিয়া রুপিয়াহr UHNLr X1হন্ডুরাস লেম্পিরাr UXPFr X.সিএফপি ফ্র্যাঙ্কr UFJDr Xফিজি ডলারr UISKr X.আইসল্যান্ড ক্রৌনr UPENr X>পেরুভিয়ান সোল নুয়েভোr UBZDr Xবেলিজ ডলারr UCHWr X=সুইজারল্যান্ড ফ্রাঙ্কr UATSr X1অস্ট্রিয়ান শিলিংr UILPr X+ইস্রাইলি পাউন্ডr UZRNr X5জাইরিয়ান নিউ জাইরেr UDOPr X(ডোমিনিকান পেসোr ULULr X_লুক্সেমবার্গ ফাইনেনশিয়াল ফ্রাঙ্কr UTMMr X=তুর্কমেনিস্টানি মানাতr UTWDr XWনূতন তাইওয়ান ক্যারাবিয়ান ডলারr UMDLr X+মোল্ডোভান লেয়ুr UXPTr Xপ্লাটিনামr UECVr Xyইকুয়াডোর উনিদাদেস দি ভেলর কনসতান্তে (ইউভিসি)r UECSr X.ইকুয়াডোর সুক্রেr UBSDr X+বাহামিয়ান ডলারr USEKr X%সুইডেশ ক্রোনাr UPEIr X.পেরুভিয়ান ইন্তিr UZMKr X4জাম্বিয়ান কওয়াচাr UAUDr X4অস্ট্রেলিয়ান ডলারr UADPr X4এ্যান্ডোরান পেসেতাr UCUPr Xকিউবান পেসোr UIEPr Xইরিশ পাউন্ডr! UCLFr" XQচিলিয়ান উনিদাদেস দি ফোমেন্তোr# UBBDr$ X(বার্বেডোজ ডলারr% UKMFr& X+কম্বোরো ফ্রাঙ্কr' UKRWr( X2দক্ষিণ কোরিয়ান ওনr) UGMDr* X.গাম্বিয়া ডালাসিr+ UVEFr, XMভেনিজুয়েলীয় বলিভার র্ফুতেr- UGTQr. X=গুয়াতেমালা কুয়েৎজালr/ UVEBr0 X7ভেনিজুয়েলান বলিভারr1 UXOFr2 XAসিএফএ ফ্র্যাঙ্ক বিসিইএওr3 USITr4 X1স্লোভানিয়া টোলারr5 USDPr6 X;প্রাচীন সুদানি পাউন্ডr7 UCLPr8 Xচিলি পেসোr9 UEURr: X ইউরোr; UCDFr< XGকঙ্গো ফ্র্যাঙ্ক কঙ্গোলাইসr= UXCDr> XAপূর্ব ক্যারাবিয়ান ডলারr? UKZTr@ X1কাজাক্সটান টেঙ্গেrA URUBrB X(রাশিয়ান রুবেলrC UXFUrD X:ফরাসি ইউআইসি - ফ্রাঙ্কrE UXAGrF XসিলভারrG UBRRrH XCব্রাজিলিয়ান ক্রুজেয়রোrI UBRNrJ XMব্রাজিলিয়ান ক্রুজেইডো নোভোrK UBRLrL X7ব্রাজিলিয়ান রিয়েলrM UMMKrN X.মায়ানমার কিয়াতrO URURrP XAরাশিয়ান রুবল (১৯৯১-১৯৯৮)rQ UPLNrR X"পোলিশ জ্লোটিrS UBRErT X_ব্রাজিলিয়ান ক্রুজেয়রো (১৯৯০-১৯৯৩)rU UPYGrV X!প্যারগুয়ানrW UBRCrX XCব্রাজিলিয়ান ক্রুজেইডাউrY UBRBrZ Xkব্রাজিলিয়ান ক্রুজেয়রোনোভো (১৯৬৭-১৯৮৬)r[ USVCr\ X5এল স্যালভোডোর কোলোনr] UAEDr^ XEসংযুক্ত আরব আমিরাত দিরহামr_ UGNSr` Xগিনি সাইলিra UMKDrb X:ম্যাসেডোনিয়ান দিনারrc UAZMrd XJআজারবাইজান মানাত (১৯৯৩-২০০৬)re UAZNrf X.আজারবাইজান মানাতrg UUSNrh XDমার্কিন ডলার (পরবর্তী দিন)ri UTOPrj X+টোঙ্গা পা’আঙ্গাrk UBADrl XTবসনিয়া এবং হার্জেগোভিনা দিনারrm UGNFrn X"গিনি ফ্রাঙ্কro UMXPrp X]ম্যাক্সিকান সিলভার পেসো (১৮৬১-১৯৯২)rq UIQDrr Xইরাকি দিনারrs UBAMrt XTবসনিয়া এবং হার্জেগোভিনা মার্কru USCRrv X1সেয়চেল্লোইস রুপিrw UCADrx X.কম্বোডিয়ান ডলারry USDDrz X8প্রাচীন সুদানি দিনারr{ UCYPr| X+সাইপ্রাস পাউন্ডr} UMADr~ X.মোরোক্কান দিরহামr UKWDr X%কুয়েতি দিনারr UBIFr X.বুরুন্ডি ফ্রাঙ্কr ULTTr X=লিথুইনিয়ান টালোন্যাসr UPGKr X4পপুয়ানিউগিনি কিনাr USOSr X"সোমালি শিলিংr USGDr X(সিঙ্গাপুর ডলারr UUZSr X.উজবেকিস্তানি সোমr USTDr XPসাও টোমে এবং প্রিন্সিপে ডোবরাr UXFOr X5ফরাসি গোল্ড ফ্রাঙ্কr UMLFr X"মালি ফ্রাঙ্কr UESPr X.স্প্যানিশ পেসেতাr UIRRr X.ইরানিয়ান রিয়ালr UZRZr X+জাইরিয়ান জাইরেr UCNYr XDচীনা য়ুয়ান রেন্মিন্‌বিr USLLr X4সিয়েরালিয়ন লিয়নr UTNDr X1তিউনেশিয়ান দিনারr UGYDr X%গাইয়েনা ডলারr UESBr Xhস্প্যানিশ পেসেতা (রূপান্তরযোগ্য হিসাব)r UESAr XJস্প্যানিশ পেসেতা (একই হিসাব)r UNZDr X1নিউজিল্যান্ড ডলারr UFKPr XMফকল্যান্ড দ্বীপপুঞ্জ পাউন্ডr ULVLr Xল্যাট্‌সr UUSSr X8মার্কিন ডলার (একই দিন)r UUSDr X"মার্কিন ডলারr UARPr XJআর্জেন্টিনা পেসো (১৯৮৩-১৯৮৫)r UKGSr X+কিরগিজস্তান সোমr UARSr X.আর্জেন্টিনা পেসোr UILSr X5ইস্রাইলি নতুন শেকেলr URONr X+রুমানিয়া লেয়ুr URSDr X+সারবিয়ান দিনারr UBHDr X(বাহরাইনি দিনারr UJPYr X%জাপানিজ ইয়েনr UARAr X:আর্জেন্টিনা অস্ট্রালr USDGr X%সুদানি পাউন্ডr UPTEr X+পর্তুগিজ এসকুডোr UXAUr Xগোল্ডr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXজাr KXফেr KXমাr KXএr KXমেr KX জুনr KXজুr KXআr K Xসেr K Xঅr K Xনr K Xডিr usUformatr }r (Uwider }r (KXজানুয়ারীr KX!ফেব্রুয়ারীr KXমার্চr KXএপ্রিলr KXমেr KX জুনr KXজুলাইr KXআগস্টr K Xসেপ্টেম্বরr K Xঅক্টোবরr K Xনভেম্বরr K Xডিসেম্বরr uU abbreviatedr }r (KXজানুয়ারীr KX!ফেব্রুয়ারীr KXমার্চr KXএপ্রিলr KXমেr KX জুনr KXজুলাইr KXআগস্টr K Xসেপ্টেম্বরr K Xঅক্টোবরr K Xনভেম্বরr K Xডিসেম্বরr uuuUcurrency_formatsr }r Nh&)r }r (h)Nh+Kh,KKr h.X¤r X¤)r r h1KKr h3X #,##,##0.00¤r h5h/X(r r h8Nh9KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KXসোr KXমr KXবুr KXবৃr KXশুr KXশr KXরr usUformatr }r (Uwider }r (KXসোমবারr KXমঙ্গলবারr KXবুধবারr KX!বৃহষ্পতিবারr KXশুক্রবারr KXশনিবারr KXরবিবারr uU abbreviatedr }r (KX সোমr KXমঙ্গলr KX বুধr! KXবৃহস্পতিr" KXশুক্রr# KX শনিr$ KX রবিr% uuuU meta_zonesr& }r' U Bangladeshr( }r) (Ucommonr* Ulongr+ }r, Ustandardr- X%বাংলাদেশ সময়r. susUerasr/ }r0 (Uwider1 }r2 (KXখৃষ্টপূর্বr3 KXখৃষ্টাব্দr4 uU abbreviatedr5 }r6 (KXখৃষ্টপূর্বr7 KXখৃষ্টাব্দr8 uuu.PK[_.ll(site-packages/babel/localedata/ky_KG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[y00&site-packages/babel/localedata/tig.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXቀደም ሰርምዕልqUpmqXሓቆ ስርምዕልquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UguqAXጉጃርቲኛqBUgdqCXእስኮትስ ጌልክኛqDUgaqEX አይሪሽqFUgnqGX ጓራኒኛqHUglqIX ጋለጋኛqJUlaqKX ላቲንኛqLUlnqMXሊንጋላኛqNUloqOX ላውስኛqPUttqQX ታታርኛqRUtrqSX ቱርክኛqTUtsqUX ጾንጋኛqVUlvqWXላትቪያንqXUtoqYX ቶንጋqZUltq[Xሊቱአኒያንq\Utkq]Xቱርክመንኛq^Uthq_X ታይኛq`UtiqaX ትግርኛqbUtgqcX ታጂኪኛqdUteqeX ተሉጉኛqfUtaqgX ታሚልኛqhUyiqiXይዲሻዊኛqjUyoqkXዮሩባዊኛqlUgezqmX ግዕዝኛqnUdeqoX ጀርመንqpUdaqqX ዴኒሽqrUdzqsXድዞንግኻኛqtUstquX ሶዞኛqvUquqwX ኵቿኛqxUelqyX ግሪክኛqzUeoq{Xኤስፐራንቶq|Uenq}Xእንግሊዝኛq~UzhqX ቻይንኛqUzaqXዡዋንግኛqUukqXዩክረኒኛqUeuqX ባስክኛqUetqXኤስቶኒአንqUesqX ስፓኒሽqUruqX ራሽኛqUrwqXኪንያርዋንድኛqUrmqX ሮማንስqUrnqX ሩንዲኛqUroqXሮማኒያንqUbnqXበንጋሊኛqUbeqXቤላራሻኛqUbgqXቡልጋሪኛqUbaqXባስኪርኛqUpsqX ፑሽቶኛqUwoqX ዎሎፍኛqUjvqX ጃቫንኛqUboqXትበትንኛqUbhqX ቢሃሪqUbiqXቢስላምኛqUbrqXብሬቶንኛqUjaqX ጃፓንኛqUomqX ኦሮምኛqUocqXኦኪታንኛqUtwqX ትዊኛqUorqX ኦሪያኛqUxhqX ዞሳኛqUcoqXኮርሲካኛqUcaqXካታላንኛqUcyqX ወልሽqUcsqX ቼክኛqUbynqX ብሊንqUptqXፖርቱጋሊኛqUtlqXታጋሎገኛqUpaqXፓንጃቢኛqUviqXቪትናምኛqUplqX ፖሊሽqUhyqXአርመናዊqUhrqXክሮሽያንኛqUiuqXእኑክቲቱትኛqUhuqXሀንጋሪኛqUhiqX ሐንድኛqUhaqX ሃውሳኛqUheqXዕብራስጥqUmgqXማላጋስኛqUuzqXኡዝበክኛqUmlqXማላያላምኛqUmoqXሞልዳቫዊናqUmnqXሞንጎላዊኛqUmiqX ማዮሪኛqUikqXእኑፒያቅኛqUmkqXማከዶኒኛqUurqX ኡርዱኛqUmtqXማልቲስኛqUmsqX ማላይኛqUmrqX ማራዚኛqUugqXኡዊግሁርኛqUmyqX ቡርማኛqUaaqX አፋርኛqUabqXአብሐዚኛqUssqX ስዋቲኛqUafqXአፍሪቃንስኛqUtnqXጽዋናዊኛqUswqXስዋሂሊኛrUisrXአይስላንድኛrUamrXአምሐረኛrUitrXጣሊያንኛrUsvrXስዊድንኛrUiar Xኢንቴርሊንጓr Uasr Xአሳሜዛዊr Uarr X ዐርቢኛrUsurX ሱዳንኛrUzurX ዙሉኛrUayrXአያማርኛrUazrXአዜርባይጃንኛrUierXእንተርሊንግወrUidrXእንዶኒሲኛrUskrXስሎቫክኛrUnlrXደችrUnorXኖርዌጂያንr Unar!X ናኡሩr"Uner#X ኔፓሊኛr$Uvor%Xቮላፑክኛr&Usidr'X ሲዳምኛr(Utigr)X ትግረr*Ufrr+Xፈረንሳይኛr,Usmr-X ሳሞአኛr.Ufyr/X ፍሪስኛr0Ufar1Xፐርሲያኛr2Ufir3X ፊኒሽr4Ufjr5X ፊጂኛr6Usar7Xሳንስክሪትኛr8Ufor9X ፋሮኛr:Ukar;Xጊዮርጊያንr<Ukkr=X ካዛክኛr>Usrr?X ሰርቢኛr@UsqrAX ልቤኒኛrBUkorCX ኮሪያኛrDUknrEX ካናዳኛrFUkmrGX ክመርኛrHUklrIXካላሊሱትኛrJUksrKXካሽሚርኛrLUsirMXስንሃልኛrNUsorOX ሱማልኛrPUsnrQX ሾናኛrRUkurSXኩርድሽኛrTUslrUX ስሎቪኛrVUkyrWXኪርጊዝኛrXUsgrYX ሳንጎኛrZUsdr[Xሲንድሂኛr\uU territoriesr]}r^(UBEr_X ቤልጄምr`UBGraXቡልጌሪያrbUBArcX)ቦስኒያ እና ሄርዞጎቪኒያrdUBBreXባርቤዶስrfUBMrgX ቤርሙዳrhUBOriX ቦሊቪያrjUBHrkX ባህሬንrlUBTrmX ቡህታንrnUJMroX ጃማይካrpUJOrqX ጆርዳንrrUBRrsX ብራዚልrtUBYruX ቤላሩስrvUBZrwX ቤሊዘrxURUryX ራሺያrzUTLr{Xምስራቅ ቲሞርr|UROr}X ሮሜኒያr~UGWrX ቢሳዎrUGRrX ግሪክrUGQrXኢኳቶሪያል ጊኒrUJPrX ጃፓንrUGYrX ጉያናrUGFrXየፈረንሳይ ጉዊአናrUGErX ጆርጂያrUGBrXእንግሊዝrUGNrXጊኒrUGMrX ጋምቢያrUTNrX ቱኒዚያrUHRrXክሮኤሽያrUHTrX ሀይቲrUHUrX ሀንጋሪrUHKrXሆንግ ኮንግrUVErXቬንዙዌላrUPRrXፖርታ ሪኮrUPFrX"የፈረንሳይ ፖሊኔዢያrUPGrXፓፑዋ ኒው ጊኒrUPErXፔሩrUSOrX ሱማሌrUPLrX ፖላንድrUZMrX ዛምቢያrUEHrXምዕራባዊ ሳህራrUEErXኤስቶኒያrUEGrX ግብጽrUZArXደቡብ አፍሪካrUECrX ኢኳዶርrUITrX ጣሊያንrUETrXኢትዮጵያrUESrX ስፔንrUERrX ኤርትራrUMDrX ሞልዶቫrUMArX ሞሮኮrUUZrXዩዝበኪስታንrUMOrX ማካዎrUMNrXሞንጎሊያrUMKrXማከዶኒያrUMUrX ማሩሸስrUMTrX ማልታrUMRrXሞሪቴኒያrUUGrX ዩጋንዳrUMYrX ማሌዢያrUMXrX ሜክሲኮrUILrXእስራኤልrUFRrXፈረንሳይrUFIrXፊንላንድrUFJrXፊጂrUFMrXሚክሮኔዢያrUNLrXኔዘርላንድrUNOrX ኖርዌrUNArX ናሚቢያrUNCrXኒው ካሌዶኒያrUNGrXናይጄሪያrUNZrXኒው ዚላንድrUNPrX ኔፓልrUCHrXስዊዘርላንድrUCOrXኮሎምቢያrUCNrX ቻይናrUCMrX ካሜሩንrUCLrXቺሊrUCFrX2የመካከለኛው አፍሪካ ሪፐብሊክrUCDrX ኮንጎrUCZrXቼክ ሪፑብሊክrUCYrXሳይፕረስrUCSrX ሰርቢያrUCVrXኬፕ ቬርዴrUSYrX ሲሪያrUKHrXካምቦዲያrUKMr X ኮሞሮስr USKr Xስሎቫኪያr UKRr Xሰሜን ኮሪያrUSIrXስሎቬኒያrUKPrXደቡብ ኮሪያrUKWrX ክዌትrUSNrX ሴኔጋልrUSArXሳውድአረቢያrUSGrXሲንጋፖርrUSErX ስዊድንrUSDrX ሱዳንrUDOrXዶሚኒክ ሪፑብሊክr UDMr!X ዶሚኒካr"UDKr#Xዴንማርክr$UDEr%X ጀርመንr&UYEr'X የመንr(UDZr)Xአልጄሪያr*UUSr+X አሜሪካr,ULBr-X ሊባኖስr.UTTr/X ትሪኒዳድ እና ቶባጎr0UTRr1X ቱርክr2ULVr3X ላትቪያr4ULTr5Xሊቱዌኒያr6UTJr7Xታጃኪስታንr8UTHr9Xታይላንድr:UTFr;X,የፈረንሳይ ደቡባዊ ግዛቶችr<UTDr=Xቻድr>ULYr?X ሊቢያr@UAErAX,የተባበሩት አረብ ኤምሬትስrBUADrCX አንዶራrDUVGrEX,የእንግሊዝ ድንግል ደሴቶችrFUIQrGX ኢራቅrHUVIrIX)የአሜሪካ ቨርጂን ደሴቶችrJUISrKXአይስላንድrLUAMrMXአርሜኒያrNUALrOXአልባኒያrPUANrQX%ኔዘርላንድስ አንቲልስrRUARrSXአርጀንቲናrTUAUrUXአውስትሬሊያrVUATrWXኦስትሪያrXUINrYX ህንድrZUTZr[Xታንዛኒያr\UAZr]Xአዘርባጃንr^UIEr_Xአየርላንድr`UIDraXኢንዶኔዢያrbuUdecimal_formatsrc}rdU date_formatsre}rf(Umediumrgh))rh}ri(h,X dd-MMM-yyyyrjh.X%(dd)s-%(MMM)s-%(yyyy)srkubUfullrlh))rm}rn(h,XEEEE፡ dd MMMM ዮም yyyy Groh.X1%(EEEE)s፡ %(dd)s %(MMMM)s ዮም %(yyyy)s %(G)srpubUlongrqh))rr}rs(h,X dd MMMM yyyyrth.X%(dd)s %(MMMM)s %(yyyy)sruubUshortrvh))rw}rx(h,Xdd/MM/yyryh.X%(dd)s/%(MM)s/%(yy)srzubuUcurrency_symbolsr{}r|U time_zonesr}}r~Uscriptsr}rULatnrX ላቲንrsUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UJPYrXየጃፓን የንrUUSDrXየአሜሪካን ዶላርrURUBrXየራሻ ሩብልrUINRrXየሕንድ ሩፒrUCNYrX&የቻይና ዩአን ረንሚንቢrUETBrXየኢትዮጵያ ብርrUBRLrXየብራዚል ሪልrUGBPrX2የእንግሊዝ ፓውንድ ስተርሊንግrUEURrX አውሮruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXጃrKXፌrKXማrKXኤrKXሜrKXጁrKXጁrKXኦrK XሴrK XኦrK XኖrK XዲrusUformatr}r(Uwider}r(KXጃንዩወሪrKXፌብሩወሪrKX ማርችrKX ኤፕረልrKXሜይrKXጁንrKX ጁላይrKX ኦገስትrK XሴፕቴምበርrK XኦክተውበርrK XኖቬምበርrK XዲሴምበርruU abbreviatedr}r(KX ጃንዩrKX ፌብሩrKX ማርችrKX ኤፕረrKXሜይrKXጁንrKX ጁላይrKX ኦገስrK X ሴፕቴrK X ኦክተrK X ኖቬምrK X ዲሴምruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrjrUint_precrKKrh,X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXሰrKXታrKXኣrKXከrKXጅrKXሰrKXሰrusUformatr}r(Uwider}r(KXሰኖrKX ታላሸኖrKXኣረርባዓrKX ከሚሽrKX ጅምዓትrKXሰንበት ንኢሽrKXሰንበት ዓባይruU abbreviatedr}r(KXሰኖrKX ታላሸrKX ኣረርrKX ከሚሽrKX ጅምዓrKXሰ/ንrKXሰ/ዓruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXዓ/ዓrKXዓ/ምr usu.PK[_.ll(site-packages/babel/localedata/gv_GB.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll*site-packages/babel/localedata/wo_Latn.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/ve_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[&P[P[%site-packages/babel/localedata/sl.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXPrvo četrtletjeq KXQ2q KXTretje četrtletjeqKXČetrto četrtletjequU abbreviatedq}q(KXQ1qKXK2qKXQ3qKXQ4quusUperiodsq}q(UamqXdop.qUpmqXpop.quUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XH:mm:ssqJUformatqKX%(H)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X H:mm:ss vqPhKX%(H)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X H:mm:ss zqUhKX%(H)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XH:mmqZhKX %(H)s:%(mm)sq[ubuU languagesq\}q](Uguq^X gudžaratiq_Ugdq`Xškotska galščinaqaUgaqbX irščinaqcUgnqdXgvaranijščinaqeUglqfXgalicijščinaqgUlbqhXluksemburščinaqiUlaqjX latinščinaqkUlnqlXlingalaqmUloqnX laoščinaqoUtrqpX turščinaqqUlvqrX letonščinaqsUltqtX litovščinaquUtkqvXturkmenščinaqwUthqxX tajščinaqyUtiqzX tigrejščinaq{Uteq|Xtelugijščinaq}Upt_PTq~Xiberska portugalščinaqUfilqXtagalogščinaqUtaqX tamilščinaqUyiqXjidišqUdeqX nemščinaqUdaqX danščinaqUelqX grščinaqUeoqX esperantoqUenqX angleščinaqUzhqX kitajščinaqUzh_HansqXpoenostavljena kitajščinaqUzh_HantqXtradicionalna kitajščinaqUen_USqXangleščina (ZDA)qUeuqX baskovščinaqUetqX estonščinaqUesqX španščinaqUruqX ruščinaqUrmqXreto-romanščinaqUroqX romunščinaqUbnqX bengalščinaqUbeqX beloruščinaqUbgqX bolgarščinaqUbaqXbaškirščinaqUwoqX volofščinaqUjvqX javanščinaqUbhqXbihariqUbrqX bretonščinaqUbsqX bosanščinaqUjaqX japonščinaqUocqXokcitanščinaqUundqXNeznan ali neveljaven jezikqUtwqXtvi (dialekt jezika akan)qUtlhqXklingonščinaqUorqX orijščinaqUxhqXxhosaqUcaqXkatalonščinaqUcyqXvaližanščinaqUcsqX češčinaqUpsqXpaštuqUptqXportugalščinaqUtlqXtagalogqUukqXukrajinščinaqUpaqXpandžabščinaqUviqXvietnamščinaqUplqX poljščinaqUhyqX armenščinaqUhrqX hrvaščinaqUhuqXmadžarščinaqUhiqX hindijščinaqUheqX hebrejščinaqUuzqXuzbekistanščinaqUmlqXmalajalamščinaqUmnqX mongolščinaqUmkqXmakedonščinaqUurqXurduqUmtqX malteščinaqUen_GBqXangleščina (VB)qUmsqX malajščinaqUmrqX maharaščinaqUugqX ujgurščinaqUmyqX burmanščinaqUaaqXafarqUabqX abhaščinaqUafqXafrikanščinaqUswqXsvahiliqUisrX islandščinarUamrX amharščinarUitrXitalijanščinarUsvrX švedščinarUiarX interlinguar Uasr X asamščinar Uarr X arabščinar UsurX sundanščinarUzurX zulujščinarUayrXajmararUazrXazerbajdžanščinarUierXjezikirUidrXindonezijščinarUskrX slovaščinarUnlrXnizozemščinarUnnrXnovonorveščinarUnor X norveščinar!Uner"X nepalščinar#Ufrr$X francoščinar%Ufyr&X frizijščinar'Ufar(X perzijščinar)Ufir*X finščinar+Ukyr,Xkirgizijščinar-Ufor.X ferščinar/Ukar0X gruzinščinar1Usrr2X srbščinar3Usqr4X albanščinar5Ukor6X korejščinar7Uknr8Xkanadar9Ukmr:X kamboščinar;Ustr<Xsesotor=Uksr>Xkašmirščinar?Usir@X singalščinarAUshrBXsrbohrvaščinarCUsorDX somalščinarEUkurFX kurdščinarGUslrHX slovenščinarIUsarJXsanskrtrKUsdrLXsindirMuU territoriesrN}rO(UBDrPX BangladešrQUBErRXBelgijarSUBFrTX Burkina FasorUUBGrVX BolgarijarWUVErXX VenezuelarYUBArZXBosna in Hercegovinar[UBBr\XBarbadosr]UWFr^XWallis in Futunar_UBMr`XBermudaraUBNrbXBrunejrcUBOrdXBolivijareUBHrfXBahrajnrgUBIrhXBurundiriUBJrjXBeninrkUBTrlXButanrmU011rnXZahodna AfrikaroUBVrpX Otok BouvetrqUBWrrXBocvanarsU014rtXVzhodna AfrikaruU015rvXSeverna AfrikarwUBRrxX BrazilijaryU017rzXCentralna Afrikar{U018r|XJužna Afrika [018]r}U019r~XAmerikerUBYrX BelorusijarUBZrXBelizerULVrXLatvijarURWrXRuandarURSrXSrbijarUTLrX Vzhodni TimorrURErXReunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadžikistanrUROrXRomunijarUTKrXTokelaurUGWrXGvineja BissaurUGUrXGuamrUGTrX GvatemalarUGSrX*Južna Georgija in Južni Sandwich IslandsrUGRrXGrčijarUGQrXEkvatorialna GvinejarUGPrX GuadelouperUJPrXJaponskarUKIrXKiribatirUGYrXGvajanarUGGrXGuernseyrUGFrXFrancoska GvajanarUGErXGruzijarUGDrXGrenadarU021rXSeverna AmerikarUGBrXVelika BritanijarUGArXGabonrUSVrXSalvadorrUGNrXGvinejarUGMrXGambijarUGLrX GrenlandijarU029rXKaribirUGIrX GibraltarrUGHrXGanarUJErXJerseyrUTNrXTunizijarUJMrXJamajkarU013rXCentralna AmerikarUWSrXSamoarU419rX$Latinska Amerika in Karibsko otočjerUHRrXHrvaškarUBSrXBahamirUHTrXHaitirUHUrX MadžarskarUHKrXHong Kong S.A.R. KitajskerU039rX Južna EvroparUHNrXHondurasrUFIrXFinskarU142rXAzijarU030rX Vzhodna AzijarU034rX Južna AzijarU035rXJugovzhodna AzijarUPRrX PortorikorUPSrXPalestinsko ozemljerU830rXKanalski otokirUFKrXFalklandski (Malvinski) otokirUIOrXBritanska IndijarUPWrXPalaurUPTrX PortugalskarUSJrXSvalbard in Jan MayenrUPYrXParagvajrUFMrX MikronezijarUIQrXIrakrUPArXPanamarUPFrXFrancoska PolinezijarUPGrXPapua Nova GvinejarUPErXPerur UPKr XPakistanr UPHr XFilipinir UFOrXFererski otokirUPNrXPitcairnrUPLrXPoljskarUPMrXSaint Pierre in MiquelonrUZMrXZambijarUEHrXZahodna SahararURUrXRuska federacijarUEErXEstonijarUEGrXEgiptrUZAr X Južna Afrikar!UECr"XEkvadorr#UITr$XItalijar%UVNr&XVietnamr'UZZr(XNeznana ali neveljavna regijar)USBr*XSalomonovo otočjer+UETr,XEtiopijar-USOr.XSomalijar/UZWr0XZimbabver1USAr2XSaudova Arabijar3UESr4XŠpanijar5UERr6XEritrejar7UMEr8X Črna gorar9UMDr:XRepublika Moldovar;UMGr<X Madagaskarr=UMAr>XMarokor?UMCr@XMonakorAUUZrBX UzbekistanrCUMMrDXMyanmarrEUMLrFXMalirGUMOrHXMakao S.A.R. KitajskerIUMNrJX MongolijarKUHMrLX!Heardov otok in McDonaldovi otokirMUASrNXAmeriška SamoarOUMKrPXRepublika MakedonijarQUMUrRX MauritiusrSUMTrTXMaltarUUMWrVXMalavirWUMVrXXMaldivirYUMQrZXMartinikr[UMPr\XSeverni Marianski otokir]UMSr^X Montserratr_UMRr`X MavretanijaraUIMrbXOtok ManrcUUGrdXUgandareUTZrfX TanzanijargUMYrhXMalezijariUMXrjXMehikarkUILrlXIzraelrmUFRrnXFrancijaroUAWrpXArubarqUDOrrXDominikanska republikarsUSHrtX Sveta HelenaruUVCrvXSaint Vincent in GrenadinerwU054rxX MelanezijaryUDJrzXDžibutir{UFJr|XFidžir}U057r~X MicronezijarU172rXSkupnost neodvisnih državrU053rXAvstralija i Nova ZelandijarUNIrX NikaragvarUNLrX NizozemskarUNOrX NorveškarUNArXNamibijarUVUrXVanuaturUNCrXNova KaledonijarUNErXNigerrUNFrX Otok NorfolkrUNGrXNigerijarUNZrXNova ZelandijarUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinezijarUCIrXSlonokoščena obalarUCHrXŠvicarUCOrX KolumbijarUCNrXKitajskarUCMrXKamerunrUCLrXČilerUCCrXKokosovi otokirUCArXKanadarUCGrXKongorUCFrXCentralnoafriška republikarUCDrXDemokratična republika KongorUCZrXČeškarUCYrXCiperrUCXrXBožični otokrUCSrXSrbija in Črna gorarUCRrX KostarikarUCVrXKapverdski otokirUCUrXKubarUSZrXSvazirUSYrXSirijarUKGrX KirgizistanrUKErXKenijarUSRrXSurinamrU143rXOsrednja AzijarUKHrX KambodžarUKNrXSaint Kitts in NevisrUKMrXKomorirUSTrXSao Tome in PrinciperUSKrX SlovaškarUKRrX Južna KorejarUSIrX SlovenijarUKPrXSeverna KorejarUKWrXKuvajtrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrXSejšelirUKZrX KazahstanrUKYrXKajmanski otokirUSGrXSingapurrUSErXŠvedskarUSDrXSudanrU151rXVzhodna EvroparU150rXEvroparUDMrXDominikarU155rXZapadna EvroparU154rXSeverna EvroparUVGrXBritanski Deviški otokirUDErXNemčijarUYErXJemenrUMHrXMarshallovi otokirU062rXJužno-centralna AzijarUDZrX Alžirijar UUSr XZdružene države Ameriker UUYr XUrugvajr UYTrXMayotterUUMrX!Ameriški manjši oddaljeni otokirULBrXLibanonrULCrX Saint LuciarULArX$Ljudska demokratična republika LaosrUTVrXTuvalurUTWrXTajvanrUTTrXTrinidad in TobagorUTRrXTurčijarULKr X Šrilankar!ULIr"X Liechtensteinr#UCKr$X Cookovi otokir%UTOr&XTongar'ULTr(XLitvar)ULUr*X Luxemburgr+ULRr,XLiberijar-ULSr.XLesotor/UTHr0XTajskar1UTFr2XFrancoski južni teritorijr3UTGr4XTogor5UTDr6XČadr7UTCr8XOtočji Turks in Caicosr9ULYr:XLibijar;UVAr<XVatikanr=U145r>X Zahodna Azijar?UAEr@XZdruženi arabski emiratirAUADrBXAndorarCUAGrDXAntigva in BarbudarEUAFrFX AfganistanrGUAIrHXAngvilarIUVIrJXAmeriški Deviški otokirKUISrLX IslandijarMUIRrNXIranrOUAMrPXArmenijarQUALrRXAlbanijarSUAOrTXAngolarUUANrVXNizozemski AntilirWUAQrXX AntarktikarYU002rZXAfrikar[U001r\XSvetr]UARr^X Argentinar_UAUr`X AvstralijaraUATrbXAvstrijarcU005rdXJužna AmerikareUINrfXIndijargUAXrhXAlandski otokiriU009rjXOceanijarkUAZrlX AzerbajdžanrmUIErnXIrskaroUIDrpX IndonezijarqUJOrrXJordanrsUQUrtXEvropska unijaruUUArvXUkrajinarwUQArxXKatarryUDKrzXDanskar{UMZr|XMozambikr}UQOr~XOstala oceanijaruUdecimal_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKrh+X #,##0.###rh-h'h.rh0Nh1KKrubsU date_formatsr}r(UmediumrhG)r}r(h+Xd.M.yyyyrhKX%(d)s.%(M)s.%(yyyy)srubUfullrhG)r}r(h+XEEEE, dd. MMMM yyyyrhKX#%(EEEE)s, %(dd)s. %(MMMM)s %(yyyy)srubUlongrhG)r}r(h+X dd. MMMM yyyyrhKX%(dd)s. %(MMMM)s %(yyyy)srubUshortrhG)r}r(h+Xd.M.yyrhKX%(d)s.%(M)s.%(yy)srubuUcurrency_symbolsr}rU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanarski otokirsU Europe/Lisbonr}rjXLizbonarsUEurope/Tallinnr}rjXTalinrsUAmerica/Indiana/Tell_Cityr}rjX Tell CityrsU Africa/Bissaur}rjXBisaursU Asia/Dhakar}rjXDakarsUAmerica/St_Luciar}rjX St. LuciarsUAsia/Singaporer}rjXSingapurrsU Europe/Tiraner}rjXTiranarsUAfrica/Abidjanr}rjXAbidžanrsUAfrica/Djiboutir}rjXDžibutirsU Africa/Cairor}rjXKairorsU Europe/Moscowr}rjXMoskvarsUAmerica/Indiana/Knoxr}rjXKnoxrsUAmerica/El_Salvadorr}rjXSalvadorrsUAmerica/Indiana/Petersburgr}rjX PetersburgrsU Asia/Dubair}rjXDubajrsUEurope/Brusselsr}rjXBruseljrsUAsia/Ulaanbaatarr}rjX Ulan BatorrsUAfrica/Dar_es_Salaamr}rjX DarussalamrsUIndian/Maldivesr}rjXMaldivirsU Europe/Parisr}rjXParizrsU Pacific/Fijir}rjXFidžirsUAmerica/Caymanr}rjXKajmanrsU Europe/Athensr}rjXAtenersUAfrica/Khartoumr}rjXKartumrsUAmerica/Puerto_Ricor}rjX PortorikorsUAmerica/Indiana/Winamacr}rjXWinamacrsUAmerica/Guatemalar}rjX GvatemalarsU Asia/Karachir}rjXKaračirsU Europe/Romer}rjXRimrsUAmerica/North_Dakota/New_Salemr}rjX New SalemrsU Europe/Warsawr}rjXVaršavarsUAsia/Krasnoyarskr}r jX Krasnojarskr sUAsia/Yekaterinburgr }r jX Jekaterinburgr sUEurope/Andorrar}rjXAndorarsUAtlantic/Bermudar}rjXBermudirsU Asia/Tehranr}rjXTeheranrsU Asia/Saigonr}rjXSajgonrsUAmerica/St_Johnsr}rjXSt JohnsrsUAmerica/St_Thomasr}rjX St. ThomasrsUAtlantic/Cape_Verder }r!jXZelenortski otokir"sUAsia/Hong_Kongr#}r$jXHongkongr%sU Asia/Macaur&}r'jXMacaor(sU Indian/Cocosr)}r*jXKokosovir+sUAmerica/Guadelouper,}r-jX Gvadeluper.sUEurope/Copenhagenr/}r0jX Kopenhagenr1sUAmerica/Jamaicar2}r3jXJamajkar4sU Europe/Kievr5}r6jXKijevr7sU Asia/Baghdadr8}r9jXBagdadr:sUEurope/Budapestr;}r<jX Budimpeštar=sU Asia/Ammanr>}r?jXAmanr@sUAmerica/St_VincentrA}rBjX St. VincentrCsU Asia/NicosiarD}rEjXNikozijarFsUEurope/UzhgorodrG}rHjXUžgorodrIsUAmerica/GuyanarJ}rKjXGvajanarLsU Europe/ViennarM}rNjXDunajrOsU Asia/TashkentrP}rQjXTaškentrRsU Asia/TokyorS}rTjXTokiorUsUPacific/EasterrV}rWjXVelikonočni otokrXsU Asia/JakartarY}rZjX Džakartar[sUAsia/Pyongyangr\}r]jX Pjongjangr^sUAfrica/Kinshasar_}r`jXKinšasarasUEurope/Bucharestrb}rcjX BukareštardsUEurope/Zaporozhyere}rfjX ZaporožjergsUAmerica/Indiana/Marengorh}rijXMarengorjsU Europe/Monacork}rljXMonakormsU Asia/Bishkekrn}rojXBiškekrpsUEurope/Vilniusrq}rrjXVilnarssU Asia/Yerevanrt}rujXErevanrvsUAfrica/Mogadishurw}rxjXMogadišrysUAmerica/Kentucky/Monticellorz}r{jX Monticellor|sUIndian/Christmasr}}r~jX BožičnirsUAfrica/Addis_Ababar}rjX Adis AbebarsU Asia/Kuwaitr}rjXKuvajtrsUAtlantic/Azoresr}rjXAzorirsU Asia/Shanghair}rjXŠangajrsUAmerica/St_Kittsr}rjX St. KittsrsU Asia/Beirutr}rjXBejrutrsUAfrica/Algiersr}rjXAlžirrsU Asia/Bahrainr}rjXBahrajnrsU Asia/Ashgabatr}rjXAšgabatrsUAmerica/Costa_Ricar}rjX KostarikarsUAsia/Kamchatkar}rjX KamčatkarsU Asia/Riyadhr}rjXRijadrsUAtlantic/Faeroer}rjX Ferski otokirsU Asia/Damascusr}rjXDamaskrsU Asia/Qatarr}rjXKatarrsUAmerica/North_Dakota/Centerr}rjXCenterrsU Asia/Bruneir}rjXBrunejrsUAmerica/Indiana/Vevayr}rjXVevayrsUAtlantic/St_Helenar}rjX St. HelenarsUAmerica/Martiniquer}rjXMartinikrsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAmerica/Indiana/Vincennesr}rjX VincennesrsU Asia/Almatyr}rjXAlmatirsUAfrica/Lubumbashir}rjX LubumbaširsU Asia/Anadyrr}rjXAnadirrsU Europe/Sofiar}rjXSofijarsUAmerica/Dominicar}rjXDominikarsUEurope/Luxembourgr}rjX LuksemburgrsU Etc/Unknownr}rjXNeznanorsU Asia/Seoulr}rjXSeulrsU Africa/Accrar}rjXAkrarsUAntarctica/South_Poler}rjX Južni polrsuUscriptsr}r(UArmnrXarmenskirUHebrrX hebrejskirUZzzzrXNeznan ali neveljaven zapisrUJpanrXjaponskirUXpeorXstara perzijščinarUCyrlrXcirilicarUArabrXarabskirUCyrsrXstarocerkveno slovanskirUZxxxrX NenapisanorUBengrX bengalskirUBrairXBraillova pisavarULatnrXLatinskirUGrekrXgrškiruUvariantsr}r(UAREVELArXarmenska (vzhodna)rUAREVMDArXarmenska (zahodna)ruUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}r (UCOPr Xkolumbijski pesor UUSDr XAmeriški Dolarr UGBPrXBritanski Funt SterlingrUTWDrXnovi tajvanski dolarrUSITrXSlovenski tolarrUMTLrXmalteška lirarUBNDrXbrunejski dolarrUEGPrXegiptovski funtrUIDRrXindonezijska rupijarUBGNrX bolgarski levrUFJDrXfidžijski dolarrUPENr Xperujski novi solr!UDEMr"X nemška markar#UEEKr$Xestonska kronar%UBOBr&Xbolivijski bolivianor'UDKKr(X danska kroner)USKKr*Xslovaška kronar+UFRFr,Xfrancoski frankr-UPKRr.Xpakistanska rupijar/UMXNr0X mehiški pesor1UHUFr2Xmadžarski forintr3UVNDr4Xvientnamski dongr5URONr6X romunski leur7UMYRr8Xmalezijski ringgitr9UZARr:Xjužnoafriški randr;UUAHr<Xukrajinska grivnar=ULTLr>Xlitovski litasr?UTRLr@X turška lirarAUSARrBX saudski rialrCUCADrDXkanadski dolarrEUSEKrFXšvedska kronarGUSGDrHXsingapurski dolarrIUHKDrJXhongkonški dolarrKUAUDrLXavstralski dolarrMUCHFrNXšvicarski frankrOUKRWrPXjužnokorejski vonrQUCNYrRXKitajski Yuan RenminbirSUTRYrTXnova turška lirarUUVEBrVXvenezuelski bolivarrWUHRKrXX hrvaška kunarYUNZDrZXnovozelandski dolarr[UCLPr\X čilski pesor]UTHBr^X tajski bahtr_UEURr`XEvroraUARSrbXargentinski pesorcUILSrdXizraelski šekelreUNOKrfXnorveška kronargURSDrhX srbski dinarriURUBrjX Ruska RubljarkUINRrlX Indijski RupirmUJPYrnX Japonski JenroUCZKrpX češka kronarqUBRLrrXBrazilski RealrsUMADrtXmaroški dirhamruUPLNrvXpoljski novi zlotrwUPHPrxXfilipinski pesoryUKESrzXkenijski šilingr{UXXXr|XNeznana ali neveljavna valutar}UAEDr~X#dirham Združenih Arabskih EmiratovruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXjrKXfrKXmrKXarKjKjKjKjK XsrK XorK XnrK XdrusUformatr}r(Uwider}r(KXjanuarrKXfebruarrKXmarecrKXaprilrKXmajrKXjunijrKXjulijrKXavgustrK X septemberrK XoktoberrK XnovemberrK XdecemberruU abbreviatedr}r(KXjanrKXfebrKXmarrKXaprrKXmajrKXjunrKXjulrKXavgrK XseprK XoktrK XnovrK XdecruuuUcurrency_formatsr}rNh)r}r(h!Nh#Kh$KKrh&X ¤rjrh)KKrh+X #,##0.00 ¤rh-h'h.rh0Nh1KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXprKXtrKjKXčrKjKjKjusUformatr}r(Uwider}r(KX ponedeljekrKXtorekrKXsredarKXčetrtekrKXpetekrKXsobotarKXnedeljaruU abbreviatedr}r(KXponrKXtorrKXsrerKXčetrKXpetrKXsobrKXnedruuuU meta_zonesr}r(UEurope_Centralr}r(UcommonrUlongr}r(UdaylightrXSrednjeevropski poletni časrUstandardrXSrednjeevropski časruuUEurope_Easternr}r(jj}r(jXVzhodnoevropski poletni časrjXVzhodnoevropski časruuuUerasr}r(Uwider}r(KXpred našim štetjemrKX naše štetjeruU abbreviatedr}r(KXpr.n.š.rKXpo Kr.ruuu.PK[ 0site-packages/babel/localedata/hy_AM_REVISED.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUpmq XԿե․q sUscientific_formatsq }q Upercent_formatsq }qU week_dataq}q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}qUcurrency_symbolsq}q U time_zonesq!}q"Uscriptsq#}q$Uvariantsq%}q&Unumber_symbolsq'}q(Ucurrency_namesq)}q*Umonthsq+}q,Uformatq-}q.(Uwideq/}q0(KXՀունվարq1KXՓետրվարq2KX Հունիսq3KX Հուլիսq4uU abbreviatedq5}q6(KXՀնվq7KXՓտվq8KXՀնսq9KXՀլսq:uusUcurrency_formatsq;}qU meta_zonesq?}q@UerasqA}qBU abbreviatedqC}qD(KXՄ․Թ․Ա․qEKX Մ․Թ․qFusu.PK[ J(site-packages/babel/localedata/ur_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq NUscaleq KdU frac_precq KKq UsuffixqX%qhqUint_precqKKqUpatternqX #,##,##0%qUprefixqXqX-qqUexp_plusqNUgroupingqKKqubsUnumber_symbolsq}qU week_dataq}qU weekend_startq KsU zone_formatsq!}q"Ucurrency_formatsq#}q$Nh)q%}q&(h Nh Kh KKq'hhhq(hKKq)hX¤ #,##,##0.00q*hX¤ q+X-¤ q,q-hNhKKq.ubsU languagesq/}q0U territoriesq1}q2U time_zonesq3}q4Uscriptsq5}q6Udecimal_formatsq7}q8Nh)q9}q:(h Nh Kh KKq;hhhqhhhq?hNhKKq@ubsU meta_zonesqA}qBUvariantsqC}qDUcurrency_namesqE}qFu.PK[Rll*site-packages/babel/localedata/az_Latn.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK['q%site-packages/babel/localedata/az.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX 1-ci kvartalq KX 2-ci kvartalq KX 3-cü kvartalqKX 4-cü kvartalquU abbreviatedq}q(KX1-ci kv.qKX2-ci kv.qKX 3-cü kv.qKX 4-cü kv.quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UgvqAX manks diliqBUguqCX gujarati diliqDUscnqEX sisili diliqFUromqGX roman diliqHUalgqIXalgonguyan diliqJUaleqKXaleutcaqLUscoqMX skots diliqNUmniqOXmanipüri diliqPUgdqQXskot gaelik diliqRUgaqSXirlandcaqTUmnoqUX manobo diliqVUosaqWX osage diliqXUgnqYX quaranicəqZUaltq[Xcənub altay diliq\Uglq]X qalisian diliq^Umwrq_X maruari diliq`UtyqaX taxiti diliqbUtwqcXTvi diliqdUttqeXtatarcaqfUtrqgXtürkcəqhUtsqiX sonqa diliqjUtnqkX svana diliqlUtoqmX tonqa diliqnUausqoX avstraliycaqpUavqqX avarikcəqrUtkqsX türkməncəqtUthquXtaycaqvUtiqwX tiqrin diliqxUtgqyX tacik diliqzUteq{X teluqu diliq|Uugaq}X uqaritik diliq~UmwlqX mirand diliqUkcgqX tiyap diliqUsmiqX səmi diliqUfatqX fanti diliqUfanqX fang diliqUwoqX volof diliqUdinqX dinka diliqUblaqX siksikə diliqUcmcqX çamik diliqUmlqX malayalamcaqUzhqXçincəqUtemqX timne diliqUen_CAqXingiliscə (CA)qUzaqX juənq diliqUcauqX qavqaz diliqUzuqX zulu diliqUterqX tereno diliqUtetqX tetum diliqUmncqX mançu diliqUkutqX kutenay diliqUsukqX sukuma diliqUkumqX kumuk diliqUsusqX susu diliqUnewqX nevari diliqUsuxqX sumeryan diliqUdenqXslaveyqUmenqX mende diliqUmulqXdigər dillərqUlezqX ləzqi diliqUrootqXrut diliqUekaqX ekacuk diliqUakkqX akadiancaqUdraqX dravid diliqUjrbqXjude-ərəbcəqUsgnqX işarət diliqUsgaqXqədimi irlandcaqUapaqX apaçi diliqUbraqX braj diliqUchbqX çibçə diliqUchgqXçağatay diliqUchkqX çukiz diliqUchmqX mari diliqUchnqXçinuk ləhçəsiqUchoqX çoktau diliqUchpqXçipevyan diliqUchrqX çiroki diliqUchyqX çeyen diliqUvotqX votik diliqUmgqX malaqas diliqUibaqX iban diliqUmoqXmoldavcaqUmnqXmonqolcaqUmiqX maori diliqUmhqX marşal diliqUmkqXmakedoniya diliqUmtqX malta diliqUcaiqXmərkəzi amerika indus diliqUdelqX delaver diliqUmsqXmalaycaqUmrqX marati diliqUtaqXtamilcəqUmyqX burmis diliqUcadqX kado diliqUsrnqXsranan tonqo diliqUtaiqXtay dilirUafhrX afrihili dilirUsitrXsino-tibet dilirUenmrXortacaq ingiliscərUen_AUrXingiliscə (AU)rUnynr X nyankol dilir Unyor X niyoro dilir Unymr X nyamvezi dilirUsiorX sioyan dilirUmaprX avstronezicərUmasrX masay dilirUlahrX laxnda dilirUladrX ladin dilirUfyrX frisk dilirUsnkrX soninke dilirUfarXfarscarUmadrX maduriz dilir Umagr!X maqahi dilir"Umair#X maitili dilir$Ufir%Xfincər&Ufjr'X fiji dilir(Umanr)Xməndinqo dilir*Uegyr+Xqədimi misir dilir,Uzndr-X zande dilir.Ussr/X svati dilir0Usrr1X serb dilir2Usqr3XAlbancar4Uswr5X suahilicər6Usvr7X isveçcər8Usur9Xsundancar:Ustr;X Sesoto dilir<Uskr=Xslovakcar>Usir?X sinhaliscər@UshrAX serb-xorvatcarBUsorCX somali dilirDUsnrEX şona dilirFUsmrGX samoa dilirHUslrIX slovencərJUscrKX sardin dilirLUsarMX Sanskrit dilirNUsgrOX sanqo dilirPUserQXşimal sami dilirRUsdrSX sindhi dilirTUzenrUX zenaqa dilirVUkbdrWXkabardcarXUafarYXafro-aziat dilirZUcsbr[Xkaşubyan dilir\Ulgr]X qanda dilir^Ulbr_Xluksemburq dilir`UfiuraXfin-uğri dilirbUlnrcX Linqala dilirdUloreX laos dilirfUlirgXlimburqiş dilirhUbynriXbilincərjUltrkX litva dilirlUlurmXluba-katanqa dilirnUfilroX taqaloqcarpUyirqX Yahudi dilirrUnonrsXqədimi norscartUcebruX kebuano dilirvUyorwX yoruba dilirxUnogryX noqay dilirzUbatr{X baltik dilir|Udakr}X dakota dilir~UdarrX darqva dilirUdayrX dayak dilirUssarXnilo-sahara dilirUkperX kpelle dilirUelrXyunancarUeorXesperanto dilirUenrX ingiliscərUlamrX lamba dilirUeerXeve dilirUmdfrX mokşa dilirUfrrX fransızcarUmdrrX mandar dilirUetrXestoncarUesrXispancarUrurXruscarUgonrX qondi dilirUgohrXqədimi almancarUsmsrX skolt dilirUsmnrX inari samirUsmjrXlule sami dilirUde_ATrX almanca (AT)rUgotrXgotçarUrnrX rundi dilirUrorXrumınrUdsbrXaşağı sorbcarUsmarXcənub sami dilirUgorrXqorontalo dilirUastrX asturicərUwalrX valamo dilirUcrhrXkrım türkçərUathrX atapaskancarUgezrXqez dilirUxhrX xosa dilirUffrX fula dilirUkforX koro dilirUmakrX makasar dilirUzaprX zapotek dilirUkokrX konkan dilirUkosrX kosreyan dilirUforX farer dilirUtogrXniyasa tonga dilirUhuprX hupa dilirUudmrX udmurt dilirUbejrX beja dilirUbemrX bemba dilirUtsirX simşyan dilirUberrX berber dilirUnzirX nizima dilirUsairXcənub amerika yerli dilirUangrXqədimi ingiliscərUprarX prakrit dilirUbhorXbxoçpuri dilirUsalrX salişan dilirUprorXqədimi provensialcarUrajrX racastan dilirUsadrX sandave dilirUanprX angikə dilirUes_419rXlatın amerika ispancasırUraprX rapanu dilirUsasrX sasak dilirUnqorXnqo dilirUcarrX karib dilirUminrXminanqkaban dilirUmicrX mikmak dilirUefirX efik dilirUarnrX araukancarUypkrX yupik dilirUmisrXçeşitli dillerrUkacrXkaçincarUkabr X kabule dilir Ukaar Xqara-qalpaq dilir Ukajr Xju dilirUkamrX kamba dilirUkarrX karen dilirUkawrX kavi dilirUfr_CHrXisveç fransızcarUtyvrX tuvinyan dilirUfr_CArXfransızca (CA)rUkarX gürcü dilirUdoirX doqri dilirUkgrX konqo dilir Ukkr!X qazax dilir"Ukjr#X kuanyama dilir$Ukir%X kikuyu dilir&Ukor'X koreya dilir(Uknr)X kannada dilir*Ukmr+Xkambodiya dilir,Uklr-Xkalalisut dilir.Uksr/X kəşmir dilir0Ukrr1X kanur dilir2Ukwr3X korniş dilir4Ukvr5X komi dilir6Ukur7Xkürdcər8Ukyr9X qırğızcar:Utklr;X tokelay dilir<Ubuar=X buryat dilir>Umgar?Xortacaq irlandcar@UhitrAX hittit dilirBUdyurCX dyula dilirDUderEXalmancarFUdarGXdanimarka dilirHUdzrIX dzonqa dilirJUluirKX luyseno dilirLUdvrMX diveh dilirNUhilrOXhiliqaynon dilirPUhimrQXhimaçali dilirRUgemrSX Alman dilirTUcrprUX kreol dilirVUqurWX kuechya dilirXUbasrYX basa dilirZUgbar[X qabaya dilir\Ubadr]X banda dilir^Ubanr_Xbalincər`UbalraX baluc dilirbUshnrcX şan dilirdUbaireX bamilek dilirfUarprgX arapaho dilirhUartriXsuni dilrjUarwrkX aravakçarlUarcrmX aramik dilirnUen_USroXingiliscə (ABŞ)rpUsemrqX ivrit dilirrUselrsX selkup dilirtUnubruX nubiy dilirvUbtkrwX batak dilirxUlusryXlushaycarzUmusr{X krik dilir|Uluar}Xluba-lulua dilir~UirorX irokuay dilirUirarXirancarUmunrX munda dilirUlunrX lunda dilirUluorXluo dilirUwarX valun dilirUtuprX tupi dilirUjvrX yavaca dilirUzblrXblisimbols dilirUtutrX altaik dilirUtumrX tumbuka dilirUjarXyaponcarUcoprX kopt dilirUilorX iloko dilirUlarXlatıncarUgwirX qviçin dilirUundrX!bilinməyən vəya gəcərsiz dilrUtlirX tlinqit dilirUtlhrXklinqonrUchrX çamoro dilirUcorX korsikan dilirUcarX katalancarUcerX çeçen dilirUponrX ponpeyan dilirUcyrXuelscərUsahrX yakut dilirUcsrX çex dilirUcrrXkri dilirUbntrX bantu dilirUcvrX çuvaş dilirUcurXkilsə slav dilirUlvrX latışcarUdumrXortacaq hollandcarUptrX portuqalcarUduarX duala dilirUfrorXqədimi fransızcarUyaprX yapiz dilirUfrmrXortacaq fransızcarUtivrXtiv dilirUfrrrXşimal fris dilirUyaorXyao dilirUparX puncab dilirUxalrX kalmıqcarUes_ESrX iber-ispancarUpirX pali dilirUen_GBrXingiliscə (GB)rUgayrX qayo dilirUotorX otomian dilirUotarX osman dilirUhmnrX monq dilirUmyvrX erzya dilirUgaarXqa dilirUfurrX friul dilirUkhirX xoyzan dilirUainrXaynucarUrarrXrarotonqan dilirUslarX slav dilirUverX venda dilirUvirX vyetnamcarUisrX isləndcərUkhorX xotan dilirUiurXinuktikut dilirUitrX italyancarUvorX volapük dilirUiirXsiçuan yi dilirUikrX inupiaq dilirUiorXido dilirUinerXhint-yevropa dilirUiarXinterlingua dilirUjprr X judo-farscar Uier Xinterlingue dilir Uidr Xindoneziya dilirUigrX iqbo dilirUpaprXpapyamento dilirUeworX evondo dilirUpaurX palayancarUpaarX papua dilirUpagrXpanqasinan dilirUsatrX santal dilirUpalrX paxlavi dilirUpamrX pampanqa dilir Uphir!X filipin dilir"Ucelr#X kelt dilir$Uphnr%X foyenik dilir&Unicr'Xniger-kordofyan dilir(Uniar)X nyas dilir*Udgrr+X doqrib dilir,Usyrr-X siryak dilir.Uniur/X niyuan dilir0Ugswr1Xisveç almancar2Ucchr3Xatsamcar4Ujbor5X loğban dilir6Unahr7X nahuatl dilir8Usamr9Xsamaritan dilir:Uhair;X hayda dilir<Ugmhr=Xortacaq yüksək almancar>Ucusr?X kuşitik dilir@UwenrAX sorb dilirBUadyrCX aduge dilirDUelxrEX elamit dilirFUadarGX adangme dilirHUpt_PTrIXİber portuqalcarJUhawrKXQavaycarLUbinrMX bini dilirNUbikrOXbikolcarPUmosrQX mosi dilirRUmohrSX moxak dilirTUtlrUX taqaloq dilirVUzh_HansrWX adi çincərXUzh_HantrYXgələnəksəl çincərZUtvlr[X tuvalu dilir\Uijor]Xico dilir^Ukmbr_X kimbundu dilir`UpeoraXqədimi farscarbUumbrcX umbundu dilirdUtmhreX tamaşek dilirfUfonrgXfon dilirhUhsbriXyuxarı sorbcarjUberkX belaruscarlUbgrmXbolqarcarnUbaroX başkir dilirpUpsrqX Puştu dilirrUbmrsX bambara dilirtUbnruX Benqal dilirvUborwX tibet dilirxUbhryX biharicərzUbir{X bislama dilir|Ubrr}XBretoncar~UbsrX bosniya dilirUruprXaromancarUzzarX zaza dilirUomrX oromo dilirUojrX ocibva dilirUacerX akin dilirUachrX akoli dilirUocrX oksitancarUkrurX kurux dilirUsrrrX serer diliirUkrorXkru dilirUkrlrX karelyan dilirUkrcrXqaraçay-balkar dilirUndsrXaşağı almancarUosrX osetik dilirUorrX Oriyə dilirUsogrX soqdiyen dilirUnsorXşimal soto dilirUsonrX sonqay dilirUde_CHrXisveç yüksək almancasırUvairXvay dilirUwakrX vakaşan dilirUlolrX monqo dilirUmkhrX mon-xmer dilirUawarXavadicərUlozrX lozi dilirUgilrX qilbert gilirUwasrX vaşo dilirUwarrX varay dilirUhzrX Herer dilirUhyrX ErmənicərUanrXaragoncarUsidrX sidamo dilirUhrrXxorvatcarUhtrX haiti dilirUhurXmacarcarUhirX hindi dilirUhorXhiri motu dilirUharX Hausa dilirUbugrX bugin dilirUherXivritcərUuzrX özbəkcərUurrXurducarUplrX Polish dilirUukrX ukraynacarUugrXuyğurcarUaarXafarcarUabrXabxazcarUaerX avestancarUafrX AfrikaancarUakrXakancarUamrX amarikcərUnl_BErX flem dilirUeurX bask dilirUasrXasrUarrX ƏrəbcərUinhrX inquş dilirUtpirXtok pisin dilirUmynrX maya dilirUayrXaymarcarUkharX xazi dilirUazrX azərbaycancarUincrXdiqər hint dilirUnlrX hollandcarUnnrXnorveç ninorsk dilirUnorX norveç dilirUnarX nauru dilirUnbrXnorvec bokmal dilirUnairXşimal amerika yerli dilirUndr Xşimal ndebele dilir Uner Xnepalcar Ungr X nqonka dilirUnyrX nyanca dilirUnaprXneapolital dilirUgrbrX qrebo dilirUgrcrXqədimi yunancarUnrrXcənub ndebele dilirUtigrX tiqre dilirUnvrX navayo dilirUzunrX zuni dilirUrwrXkinyarvanda dilir Ucper!Xinglis kreol dilir"Ucpfr#Xfransız kreol dilir$Ucppr%Xportugal kreol dilir&uU territoriesr'}r((UBDr)X Banqladeşr*UBEr+XBelçikar,UBFr-X Burkina Fasor.UBGr/X Bolqariyar0UVEr1X Venesuelar2UBAr3XBosniya və Herzokovinar4UBBr5XBarbadosr6UWFr7XValis və Futunar8UBLr9XSeynt Bartelemeyr:UBMr;XBermudar<UBNr=XBruneyr>UBOr?XBoliviyar@UBHrAXBahreynrBUBIrCXBurundirDUBJrEXBeninrFUBTrGXButanrHU011rIX Qərb afrikarJUBVrKX Bove AdasırLUBWrMXBotsvanarNU014rOX Şərq AfrikarPU015rQX Şimal AfrikarRUBRrSX BraziliyarTU017rUX Orta AfrikarVU018rWX018rXU019rYX AmerikalarrZUBYr[XBelarusr\UBZr]XBelizr^ULVr_XLatviyar`URWraXRvandarbURSrcXSerbiyardUTLreX Şərq TimorrfURErgXReyunionrhUTMriXTürkmənistanrjUOMrkXOmanrlUTJrmX tacikistanrnUROroXRomaniyarpUTKrqXTokelaurrUGWrsX Qvineya-BisaurtUGUruXQuamrvUGTrwX QvatemalarxUGSryX0Cənub Gürcüstan və Cənub Sandvilç AdalarırzUGRr{X Yunanıstanr|UGQr}XEkvator Qineyar~UGPrXQvadaluprUJPrXYaponiyarUKIrXKiribatirUGYrXQuyanarUGGrXGörnseyrUGFrXFransız QuyanasırUGErX GürcüstanrUGDrXQrenadarU021rX021rUGBrXBirləşmiş KrallıqrUGArXQabonrUSVrX El SalvadorrUGNrXQvineyarUGMrXQambiyarUGLrXQrinlandrU029rX KariyıplarrUGIrX GibraltarrUGHrXQanarUJErXCörsirUTNrXTunisiyarUJMrXYamaykarU013rX Orta AmerikarUWSrXSamoarU419rXLatın Amerikası və KariblərrUHRrX XorvatiyarUBSrX BahamalarrUHTrXHaitirUHUrX MacaristanrUHKrXHonk Konq çinarU039rX Cənub AvroparUHNrXQondurasrUFIrX FinlandiyarU142rXAziyarU030rX Şərq AsiyarU034rX Cənub AsiyarU035rXCənub Şərq AsiyarUPRrX Puerto RikorUPSrXFələstin BölqüsürUFKrXFolkland AdalarırUIOrX*Britaniya-Hindistan Okeanik territoriyasırUPWrXPalavrUPTrXPortuqalrUSJrXsvalbard və yan mayenrUMDrXMoldovarUFMrX MikronesiyarUIQrXİrakrUPArXPanamarUPFrXFransız PolineziyarUPGrXPapua Yeni QvineyarUPErXPerurUPKrXPakistanrUPHrXFilipinrUFOrX Faro AdalarırUPNrXPitkarnrUPLrXPolşarUPMrXSeynt Piyer və MikelonrUZMrXZambiyarUEHrX Qərb SahararURUrXRusiyarUEErXEstoniyarUEGrXMisirrUZArX Cənub AfrikarUECrXEkvadorrUITrXİtaliyarUVNrXVyetnamrUZZrXbilinmirrUSBrXSolomon AdalarırUETrXEfiopiyarUSOrXSomaliyarUZWr XZimbabver USAr XSaudi Ərəbistanr UESr X İspaniyarUERrXEritreyarUMErX MonteneqrorUAQrX AntarktikarUMGrX MadaqaskarrUMFrX Seynt MartinrUMArXMorokkorUMCrXMonakorUUZrX ÖzbəkistanrUMMrXMyanmarr UMLr!XMalir"UMOr#X Makao Çinar$UMNr%X Monqoliyar&UHMr'XHörd və Makdonald Adalarır(UASr)XAmerika Samoasır*UMKr+X Masedoniyar,UMUr-XMavritisr.UMTr/XMaltar0UMWr1XMalavir2UMVr3XMaldivr4UMQr5X Martiniqur6UMPr7XŞimal Mariana Adalarır8UMSr9X Montseratr:UMRr;X Mavritaniyar<UIMr=X Man Adasır>UUGr?XUqandar@UTZrAX tanzaniyarBUMYrCX MalaysiyarDUMXrEXMeksikarFUILrGXİzrailrHUFRrIXFransarJUAWrKXArubarLUDOrMXDominik RespublikasırNUSHrOX Seynt ElenarPUVCrQXSeynt Vinsent və QrenadarRU054rSX MelanesyarTUDJrUXCibotirVUFJrWXFicirXU057rYXMikronesiya reqionurZU172r[X172r\U053r]XAvstraliya və Yeni Zelandiyar^UNIr_X Nikaraquar`UNLraX HollandiyarbUNOrcXNorvecrdUNAreXNamibiyarfUVUrgXVanuaturhUNCriXYeni KaledoniyarjUNErkXnijerrlUNFrmXNorfolk AdasırnUNGroXNijeriyarpUNZrqXYeni ZelandiyarrUNPrsXNepalrtUNRruXNaururvUNUrwXNiyerxU061ryX PolineziyarzUCIr{X İvori Sahilir|UCHr}X isveçriyar~UCOrX KolumbiyarUCNrXÇinrUCMrXKamerunrUCLrXÇilerUCCrXKokos AdalarırUCArXKanadarUCGrXKonqo - BrazavilrUCFrXOrta Afrika respublikasırUCDrXKonqo - KinşasarUCZrXÇex respublikasırUCYrXKiprrUCXrXÇristmas AdasırUCRrX Kosta RikarUPYrXParaqvayrUCVrX Kape VerderUCUrXKubarUSZrX svaziləndrUSYrXsiriyarUKGrX KırqızstanrUKErXKenyarUSRrX surinamərU143rX Orta AziyarUKHrX KambodiyarUKNrXSeynt Kits və NevisrUKMrXKomorosrUSTrXSao Tom və PrinsiprUSKrX SlovakiyarUKRrX Cənub KoreyarUSIrX SloveniyarUKPrX Şimal KoreyarUKWrXKuveytrUSNrXSeneqalrUSMrX San MarinorUSLrX Siyera LeonrUSCrXSeyçelsrUKZrX KazaxstanrUKYrXKayman AdalarırUSGrXSinqapurrUSErXisveçrUSDrXsudanrU151rX Şərq AvroparU150rXAvroparUDMrXDominikarU155rX Qərb AvroparU154rX Şimal AvroparUVGrXBritaniya Virgin AdalarırUDErXAlmaniyarUYErXYemenrUMHrXMarşal AdalarırU062rXCənub Orta AsiyarUDZrXCezayırrUUSrXAmerika Birləşmiş ŞtatlarırUUYrXUruqvayrUYTrXMayotrUUMrX&Birləşmiş Ştatların uzaq adalarırULBrXLebanonrULCrX Seynt LusiyarULArXLaosrUTVrXTuvalurUTWrXtayvanrUTTrXTrinidan və TobaqorUTRrXTürkiyarULKrX Şri LankarULIrX LixtenşteynrUCKrX Kuk AdalarırUTOrXTonqarULTrXLitvarULUrX LüksemburqrULRrXLiberiyarULSr XLesotor UTHr Xtaylandr UTFr XFransız Cənub teritoriyasırUTGrXToqorUTDrXÇadrUTCrXTürk və Kaykos AdalarırULYrXLibyarUVArXVatikanrU145rX Qərb AsiyarUAErXBirləşmiş Ərəb EmiratlarırUADrXAndorrarUAGrXAntiqua və Barbudar UAFr!X Əfqənistanr"UAIr#XAnquilar$UVIr%XABŞ Virqin Adalarır&UISr'X İslandiyar(UIRr)Xİranr*UAMr+X Ermənistanr,UALr-XAlbaniyar.UAOr/XAngolar0UANr1XHollandiya antillerir2U003r3XŞimal Amerikar4U002r5XAfrikar6U001r7XDünyar8UARr9X Arqentinar:UAUr;X Avstraliyar<UATr=XAvstriyar>U005r?XCənub Amerikar@UINrAX HindistanrBUAXrCXAland AdalarırDU009rEX OkeyaniyarFUAZrGX AzərbaycanrHUIErIX İrlandiyarJUIDrKX İndoneziyarLUJOrMXÜrdünrNUQUrOXAvropa BirləşliyirPUUArQXUkrainarRUQArSXQatarrTUDKrUX DanemarkarVUMZrWXMazambikrXUQOrYXUzak OkeyaniyarZuUdecimal_formatsr[}r\U date_formatsr]}r^(Umediumr_h))r`}ra(h,X yyyy MMM drbh.X%(yyyy)s %(MMM)s %(d)srcubUfullrdh))re}rf(h,XEEEE, yyyy MMMM ddrgh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srhubUlongrih))rj}rk(h,X yyyy MMMM drlh.X%(yyyy)s %(MMMM)s %(d)srmubUshortrnh))ro}rp(h,Xyy/MM/ddrqh.X%(yy)s/%(MM)s/%(dd)srrubuUcurrency_symbolsrs}rtUAZMruXman.rvsU time_zonesrw}rx(UAtlantic/Canaryry}rzUcityr{XKanarir|sUAntarctica/Mawsonr}}r~j{XmosonrsUAmerica/Buenos_Airesr}rj{X Buenos AyresrsUAustralia/Melbourner}rj{XmelburnrsU Pacific/Waker}rj{XveykrsUAmerica/Nipigonr}rj{XnipiqonrsUAmerica/Louisviller}rj{XLuisvilrsUAmerica/Indiana/Tell_Cityr}rj{Xtell şəhərirsUAustralia/Darwinr}rj{XDarvinrsUAmerica/Whitehorser}rj{XvaythorsrsUAntarctica/Davisr}rj{XDeyvisrsUAmerica/Coral_Harbourr}rj{X Koral HarborrsUAmerica/Swift_Currentr}rj{X svift kurentrsU Europe/Samarar}rj{XsamararsUEurope/Simferopolr}rj{X simferopolrsUAmerica/Maceior}rj{XMaseyorsU Asia/Magadanr}rj{XMaqadanrsUEurope/Zaporozhyer}rj{X zaporojyersU Asia/Kashgarr}rj{XKaşqarrsUAmerica/Detroitr}rj{XDetroytrsU Asia/Kuchingr}rj{XKuçinqrsU Asia/Urumqir}rj{XurumçirsU Europe/Moscowr}rj{XmoskvarsUAmerica/Indiana/Knoxr}rj{XNoksrsUAmerica/Indiana/Petersburgr}rj{X pitersburqrsUAsia/Pontianakr}rj{X pontiyanakrsUAsia/Ulaanbaatarr}rj{X ulanbatarrsUAmerica/Rainy_Riverr}rj{X reyni riverrsUAmerica/Argentina/San_Luisr}rj{Xsan luisrsUAntarctica/Rotherar}rj{XroferarsUAustralia/Adelaider}rj{XAdelaydrsUAmerica/Indianapolisr}rj{X İndianapolisrsUAmerica/Reginar}rj{XrecinarsUAmerica/Cambridge_Bayr}rj{X Kəmbric BeyrsUAmerica/Mexico_Cityr}rj{XmexikorsU America/Boiser}rj{XBoysersUPacific/Chathamr}rj{XÇatamrsUPacific/Midwayr}rj{XmidveyrsU America/Jujuyr}rj{XCucuyrsUAmerica/Cordobar}rj{XKordobarsUAustralia/Lord_Hower}rj{X Lord HoversUAmerica/Argentina/San_Juanr}rj{Xsan xuanrsUPacific/Kosraer}rj{XKosrayersUAmerica/North_Dakota/New_Salemr}rj{X nyu salemrsUAmerica/Monterreyr}rj{XmontereyrsU Asia/Irkutskr}rj{XİrkutskrsUAsia/Yekaterinburgr}rj{X yekaterinburqrsUAustralia/Currier}rj{XKuriyer sUAntarctica/Caseyr }r j{XKeysir sUPacific/Enderburyr }rj{X EnderbörirsU America/Thuler}rj{XtulrsUAmerica/St_Johnsr}rj{XSt JohnsrsUAmerica/Monctonr}rj{XmonktonrsUPacific/Majuror}rj{XMaxirorsUAmerica/Mazatlanr}rj{XmazaltanrsUAsia/Choibalsanr}r j{X Coybalsanr!sUAmerica/Blanc-Sablonr"}r#j{X Blank-Sablonr$sU Europe/Kievr%}r&j{XKiyevr'sUAntarctica/Syowar(}r)j{Xsyovar*sUAmerica/Halifaxr+}r,j{XHalifaksr-sUAntarctica/McMurdor.}r/j{Xmakmurdor0sUAmerica/Danmarkshavnr1}r2j{X Danmarkşavnr3sUAmerica/Thunder_Bayr4}r5j{X funder beyr6sUAmerica/Scoresbysundr7}r8j{X skoresbisundr9sUAmerica/Eiruneper:}r;j{Xİruneper<sUAmerica/Los_Angelesr=}r>j{X Los Ancelesr?sUAmerica/Noronhar@}rAj{XnoronharBsUAmerica/Goose_BayrC}rDj{XQus BeyrEsUAmerica/CatamarcarF}rGj{X KatamarkarHsUAmerica/ChihuahuarI}rJj{XCihuvavarKsUAmerica/Argentina/Rio_GallegosrL}rMj{X rio qayegosrNsUPacific/GambierrO}rPj{XQambiyerrQsUAmerica/VancouverrR}rSj{X vənkuverrTsUEurope/VolgogradrU}rVj{X volqoqradrWsUEurope/UzhgorodrX}rYj{XujgorodrZsUPacific/Ponaper[}r\j{Xponaper]sU Asia/Aqtaur^}r_j{XAktaur`sUAmerica/Sao_Paulora}rbj{X sao paulorcsUAmerica/Edmontonrd}rej{X EdmondtonrfsUAustralia/Perthrg}rhj{XperfrisUAmerica/Mendozarj}rkj{XmendozarlsUPacific/Easterrm}rnj{XİsterrosU Asia/Jakartarp}rqj{XCakartarrsUPacific/Kiritimatirs}rtj{XKirimatirusUAustralia/Sydneyrv}rwj{XsidneyrxsUAtlantic/Madeirary}rzj{XMadeyrar{sUAmerica/Campo_Grander|}r}j{X Kampo Qrander~sUAmerica/Dawson_Creekr}rj{X Douson KrikrsUAfrica/Kinshasar}rj{XKinşasarsUAntarctica/Vostokr}rj{XvostokrsUAmerica/Porto_Velhor}rj{X porto velorsUAmerica/Argentina/Ushuaiar}rj{XuşuyarsUPacific/Galapagosr}rj{X QalapaqosrsUAmerica/Indiana/Marengor}rj{XMarenqorsU Africa/Ceutar}rj{XSeutarsUAmerica/Winnipegr}rj{XvinipeqrsUAmerica/Dawsonr}rj{XDousonrsUAustralia/Brisbaner}rj{XBrisbeynrsUAmerica/Recifer}rj{XresifrsU Asia/Sakhalinr}rj{XsaxalinrsUPacific/Kwajaleinr}rj{X KvajaleynrsUAustralia/Broken_Hillr}rj{X Broken HilrsUAmerica/Phoenixr}rj{XfiniksrsUAmerica/Cuiabar}rj{XKuyabarsUAmerica/Kentucky/Monticellor}rj{X montiçelorsUPacific/Tarawar}rj{XtaravarsUAmerica/Yellowknifer}rj{X yelounayfrsUAmerica/Rio_Brancor}rj{X Rio BrankorsUAmerica/Cancunr}rj{XKankunrsUAsia/Vladivostokr}rj{X vladivostokrsUPacific/Johnstonr}rj{XConstonrsUEurope/Kaliningradr}rj{X KalininqradrsU Asia/Makassarr}rj{XMakasarrsUAsia/Qyzylordar}rj{X qüzülordarsUAmerica/Argentina/Tucumanr}rj{XtukumanrsUAsia/Chongqingr}rj{XConqinqrsUAustralia/Euclar}rj{XYuklarsUAmerica/Chicagor}rj{XCikaqorsUAmerica/Rankin_Inletr}rj{X rankin inletrsUAmerica/Iqaluitr}rj{XİqalutrsUAsia/Samarkandr}rj{X səmərkəndrsUAmerica/Menomineer}rj{XmenominirsUAsia/Kamchatkar}rj{X KamçatkarsUAmerica/Glace_Bayr}rj{X Qleys BeyrsU Asia/Jayapurar}rj{XCayapurarsUAmerica/Hermosillor}rj{X HermosilorsUAmerica/North_Dakota/Centerr}rj{XOrta, Şimal DakotarsUAmerica/Pangnirtungr}rj{X panqnirtanqrsUAmerica/Resoluter}rj{XresolutrsUAmerica/Indiana/Vevayr}rj{XveveyrsU Asia/Yakutskr}rj{XyakutskrsUAmerica/Tijuanar}rj{XtixuanarsUAntarctica/DumontDUrviller}rj{XDumont de UrvilersUAmerica/Indiana/Vincennesr }r j{Xvinsenesr sU Asia/Almatyr }r j{XAlmatirsUAmerica/Argentina/La_Riojar}rj{XLa RioharsUAsia/Novosibirskr}rj{X novosibirskrsUAmerica/Indiana/Winamacr}rj{XvinamakrsUAfrica/Lubumbashir}rj{X LubumbaşirsUPacific/Marquesasr}rj{X MarkuyesasrsU Asia/Anadyrr}rj{XAnadırr sUAmerica/New_Yorkr!}r"j{Xnyu yorkr#sU America/Nomer$}r%j{Xnomr&sUAmerica/Yakutatr'}r(j{Xyakutatr)sUAmerica/Juneaur*}r+j{XCüneaur,sUAmerica/Inuvikr-}r.j{Xİnuvikr/sUAmerica/Araguainar0}r1j{X Araguaynar2sUAmerica/Montrealr3}r4j{Xmontrealr5sUAmerica/Torontor6}r7j{Xtorontor8sU Etc/Unknownr9}r:j{XBilinmirr;sU America/Bahiar<}r=j{XBahiyar>sUAmerica/Anchorager?}r@j{XAnkoracrAsUAmerica/ShiprockrB}rCj{XşiprokrDsUAntarctica/South_PolerE}rFj{X çənub polusrGsuUscriptsrH}rI(UZsymrJXzsymrKUGururLXqurmuxirMUHebrrNXyahudirOUZzzzrPXbilinməyən veya gəcərsizrQUPhnxrRXfoenikrSUMoonrTXmunrUUSamrrVX samaritanrWUChamrXXçamrYUArabrZXərəbr[UGujrr\Xqucaratr]UZxxxr^X yazısızr_ULycir`XlusianraUSinhrbXsinhalarcUTalurdX təzə tay lureUMongrfXmonqolrgUXpeorhX qədimi farsriUVisprjXdanışma səslərirkURjngrlXrecəngrmUOlckrnXol çikiroUTalerpXtay lerqUMandrrXmandayenrsUManirtX maniçayenruUMlymrvX malayalamrwUTibtrxXtibetryUKalirzXkayax lir{UJpanr|Xyaponr}UPlrdr~Xpolard fonetikrUKanarXkatakanarULydirXludianrUSundrXsundanrUYiiirXyirUJavarXcavarUOryarXoriyarULaoorXlaorUUgarrXuqaritrUCyrlrXkirilrUVaiirXvayrUArmnrXermənirUCyrsrXqədimi kilsa kirilirUKhmrrXxmerrUArmirXarmirUSylorX siloti nəqrirUItalrXqədimi italyalırUSgnwrXişarət yazısırUXsuxrXsumer-akadyan kuneyformrUThaarXtxanarUThairXtayrUCprtrXkiprrULepcrXlepçərUOsmarXosmanyarUSaurrX saurastrarUHirarXiraganarUHanirXhanrUEgydrX misir demotikrUEgyhrXmisir hiyeratikrUCansrX"birləşmiş kanada yerli yazısırUEgyprXmisir hiyeroqlifrUZmthrXzmthrUTfngrXtifinaqrUShawrXşavyanrUCirtrXsirtrUGeorrXgürcürUTengrXtengvarrUHrktrXkatakana vəya hiraqanarUGeokrXgürcü xutsurirUTavtrXtavtrUOgamrXoğamrUDsrtrXdeseretrUGothrXqotikrUHanorXhanunurUBalirXbalirUKorerXkoreanrUHangrXhanqulrUCarirXkariyanrUAvstrXavestanrUTagbrXtaqbanvarUHansrXbasitləştirilmiş hanrUHantrX qədimi hanrURororX ronqoronqorUDevarX devanagarirUIndsrX hindistanrUBoporXBopomoforUMymrrXmiyanmarrUTglgrXtaqaloqrUPermrXqədimi permikrUBugirXbuqinrUPhagrXfaqs-parUBrairX kor yazısırUBrahrXbrahmirUBatkrXbatakrUMerorXmeroytikrULimbr Xlimbur UMteir X meytey mayekr UPhlir Xflir UTelur Xtelugur UTamlr Xtamilr USarar Xsaratir UPhlpr Xflpr ULatgr X gael latınır ULatfr Xfraktur latınır UKharr Xxaroştir UNkoor Xnkor UPhlvr X kitab paxlavir ULatnr Xlatınr UMayar Xmaya hiyeroqlifir ULanar Xlannar UEthir Xefiopiyar UKthir Xktir! UHmngr" X pahav monqr# UBuhdr$ Xbuhidr% UCoptr& Xkoptikr' UPrtir( Xprtir) UGlagr* X qlaqolitikr+ URunrr, Xrunikr- UOrkhr. Xorxonr/ UCakmr0 Xkakmr1 UHungr2 X qədimi macarr3 UGrekr4 Xyunanr5 UCherr6 Xçirokir7 UZyyyr8 Xadi yazir9 USyrcr: Xsiryakr; UBlisr< X blissymbolsr= UBengr> Xbenqalr? USyrer@ Xestrangela süryanicerA USyrnrB XSyrnrC UKndarD XkannadarE uUvariantsrF }rG Unumber_symbolsrH }rI Ucurrency_namesrJ }rK (UXXXrL Xbilinməyən vəya gəcərsizrM UDZDrN XAlcəzir dinarırO ULVRrP X Latviya rublurQ UGHSrR X Qana sedisirS UBOPrT XBoliviya pesosurU UEGPrV X misir paundurW UBGLrX XBolqariya levasırY UBGNrZ XBolqariya yeni levasır[ UPABr\ XPanamaniya balboar] UYUMr^ XYuqoslaviya yeni dinarı (hard)r_ UZWDr` XZimbabve dollarıra UGHCrb XQana sedisi (1979-2007)rc UBOBrd X Bolivianore UDKKrf XDanemarka kronasırg UBWPrh XBotsvana pulasıri ULBPrj XLebanon paundurk UTZSrl XTanzaniya şilingirm UVNDrn X vyetnam donquro UNADrp XNamibiya dollarırq UAOArr XAnqola kvanzasırs UWSTrt Xqərb samoa talasıru UAONrv X!Anqola yeni kvanzası (1990-2000)rw UKHRrx XKambodiya riyeliry UMYRrz XMalaysiya rinqitir{ UAOKr| XAnqola kvanzasi (1977-1990)r} USOSr~ XSomaliya şillingir UKYDr XKeyman Adaları dollarır ULYDr XLiviya dinarır UUAHr XUkraina hrivnyasır UUAKr XUkraina karbovenesasır UUGXr XUqanda şelingir UJODr Xİordaniya dinarır UAORr XAnqola kvanzası (1995-1999)r USURr X Sovet rublur UAWGr X Aruba qilderir USARr X Saudi riyalır UFIMr X Fin markasır UHKDr XHonk Konq dollarır UTPEr X Timor eskudur UMGFr XMadaqaskar frankasır UCHEr X WIR Yevrosur UCHFr Xİsveçriya frankasır UGIPr XGibraltar paundur UBYRr XBelarusiya rublur UALLr X Alban lekir UXPDr X Palladiumr UUGSr XUqanda şelingi (1966-1987)r UMROr XMavritaniya oyuquyasır UBOVr XBoliviya mvdolır UHRKr XXorvatiya kunur UDJFr Xjibouti frankasır UHRDr XXorvatiya dinarır UPESr X Peru solur UEQEr Xekveler UITLr Xİtaliya lirasır UBNDr XBruney dollarır UISKr XAysland kronasır UZALr XCənub afrika randı (finans)r USRDr XSurinam dollarır ULAKr X Laotiya kipir UNICr XNikaraqua kordobur UNPRr X Nepal rupiyir UMZEr XMozambik eskudosur UUYUr XUruqvay pesosu (Uruguayo)r ULUCr X Luksemburq frankası (dəyişik)r UJMDr XYamayka dollarır UFRFr XFransız markasır UMAFr XMorokko frankasır UUYIr X!Uruqvay pesosu Unidades Indexadasr UMZMr XQədim Mozambik metikalır UMZNr XMozambik metikalır UPHPr XFilipin pesosur UZARr XCənub afrika randır URHDr XRodezian dollarır UGWPr XQvineya-Bisau pesosur ULUFr XLuksemburq frankasır UBELr XBelçika frankı (finans)r UBECr XBelçika frankı (deyşirik)r UNGNr XNigeriya nairir UYUNr XYuqoslaviya dinarı (dəyişik)r UBEFr XBelçika frankır UPLZr XPolsha zlotisi (1950-1995)r UCRCr XKosta rika kolonur UTRLr XTürk köhnə lirasır UDEMr Xalman markasır UEEKr XEstoniya krunur UMWKr XMalavi kvaçasır ULKRr XŞri Lanka rupisir USKKr XSlovak korunasır UCVEr XKape Verde eskudosur UPKRr XPakistan rupiyir UHUFr XMacarıstan forintir UROLr XQədim Roman leyur UBMDr XBermuda dollarır UOMRr X Mman rialır ULSLr X Lesoto lotisir ULSMr XMalotir UMNTr XMonqoliya tuqrikir UAMDr XErməni dramır UYUDr XYuqoslaviya dinarı (hard)r UBUKr X Burmis kyatır USYPr X Siriya paundur UQARr X Qatar rialır UNLGr XHollandiya gilderir UGEKr XGürcüstan kupon laritir UMTPr X Maltiz paundur UGBPr XBritaniya paund sterlingir! UGELr" XGürcüstan larisir# UAFNr$ XƏfgənir% USBDr& XSolomon Adaları dollarır' UCSKr( XÇexoslavakiya korunasır) UKPWr* XŞimal koreya vonur+ UCSDr, XQədimi Serb dinarır- UAFAr. XƏfgəni (AFA)r/ UTHBr0 X tay bahtır1 UBYBr2 XBelarusiya yeni rublur3 UBDTr4 XBanqladeş takasır5 UGRDr6 XYunan draçmasır7 UYERr8 X yemen rialır9 UDDMr: Xşərq almaniya ostmarkır; USZLr< XSvazilənd lilangenir= UHTGr> X Haiti qourdur? UTRYr@ X Türk lirasırA UMGArB XMadaqaskar ariarisirC UANGrD XHollandiya antila gilderirE ULRDrF XLiberiya dollarırG URWFrH XRvanda frankırI UNOKrJ X Norveç kronurK UKESrL XKenya şillingirM UMOPrN XMakao patakasırO UINRrP XHindistan rupisirQ UMXNrR XMeksika pesosurS UCZKrT XÇex respublikası korunasırU UTJSrV XTacikistan somonirW UTJRrX XTacikistan rublurY UBTNrZ XButan ngultrumur[ UYDDr\ X yemen dinarır] UGWEr^ XPortugal Qvineya eskudosur_ UCOPr` XKolombiya pesosura UMURrb XMavritis rupiyirc UIDRrd Xİndoneziya rupisire UHNLrf XHonduras lempirasırg UXPFrh X CFP frankıri UFJDrj X Fici dollarırk UETBrl XEfiopiya birasırm UPENrn XPeru sol nuyevosuro UBZDrp XBeliz dollarırq UATSrr XAvstriya şilingirs UILPrt Xİzrail paunduru UZRNrv XZair yeni zairirw UDOPrx Xdominika pesosury ULULrz XLuksemburq frankası (finans)r{ UTMMr| XTürkmənistan manatır} UTWDr~ XTayvan yeni dollarır UMDLr XMoldova leyusur UXPTr Xplatinumr UECSr Xekvador sukresir UBSDr XBahama dollarır USEKr X İsveç kronur UTOPr XTonqa panqasır UPEIr X Peru intir UZMKr XZambiya kvaçır UMVRr XMaldiv Adaları rufiyir UAUDr XAvstraliya dollarır UADPr XAndora pesetasır UCUPr X Kuba pesosur UIEPr Xİrlandiya paundur UCHWr X WIR frankasır UBBDr XBarbados dollarır UKMFr XKomoro frankır UKRWr XCənub koreya vonur UGMDr XQambiya dalasir UVEFr Xvenesuela bolivar fuertir UGTQr XQvatemala küetzalır UVEBr Xvenesuela bolivarır USITr XSloveniya tolarır UCLPr X Çili pesosur UEURr XYevror UCDFr XKonqoliz frank konqolaysır UXCDr Xşərq karib dollarır UKZTr XKazaxstan tenqesir URUBr X Rusiya rublur UXFUr XFransız UİC frankır UXAGr Xgümüşr UBRRr XBraziliya kruzeyrosur UBRNr XBraziliya kruzado novasır UBRLr XBraziliya realır UMMKr XMyanmar kiyatır UUYPr XUruqvay pesosu (1975-1993)r URURr XRusiya rublu (1991-1998)r UPLNr XPolsha zlotisir UBREr X Braziliya kruzeyrosu (1990-1993)r UPYGr XParaqvay quaranir UBRCr XBraziliya kruzadosur UBRBr XBraziliya kruzeyro novasır USVCr Xel salvador kolonur UAEDr X&Birləşmiş ərəb emiratlar dirhamır UGNSr XQvineya sulisir UMKDr XMasedoniya denarır juXManatr UAZNr XAzərbaycan manatır UUSNr XABŞ dolları (yeni gün)r UGQEr X$Ekvatoriya Gvineya ekvele quneanasır UBADr XBosniya-Herzeqovina dinarır UGNFr XQvineya frankasır UMXPr XMeksika gümüş pesosur UIQDr X İraq dinarır UERNr XEirtreya nakfasır UBAMr XBosniya-Herzeqovina markasır USCRr XSeyçel rupiyir UCADr XKanadiya dollarır UCYPr X Kipr paundur UMADr XMorokko dirhamır UKWDr XKuveyt dinarır UBIFr XBurundi frankasır ULTTr XLitva talonasır UPGKr XPapua Yeni Qvineya kinir ULTLr X Litva litasır USGDr XSinqapur dollarır UUZSr Xözbəkistan sumur UXFOr XFransız gızıl frankır UMLFr X Mali frankır UESPr Xİspan pesetasır UIRRr X İran rialır UZRZr X Zair zairir UCNYr XÇin yuan renminbir UXOFr XCFA franka BCEAOr UTNDr X Tunis dinarır UGYDr XQuyana dollarır UESBr Xİspan pesetası (dəyşirik)r UESAr Xİspan pesetası (A)r UNZDr XYeni Zelandiya dollarır UFKPr XFolkland Adası paundur ULVLr XLatviya latsır UUSSr XABŞ dolları (həmin gün)r UUSDr! X ABŞ dollarır" UARPr# XArgentina pesosu (1983-1985)r$ UKGSr% XKırğızstan somur& UARSr' XArgentina pesosur( UILSr) Xİzrail yeni şekelir* URONr+ X Roman leyur, URSDr- XSerbiya dinarır. UBHDr/ XBahreyn dinarır0 UJPYr1 X Yapon yenir2 UARAr3 XArgentina avstralır4 USDGr5 X Sudan paundur6 UPTEr7 XPortuqal eskudosur8 UXAUr9 Xqızılr: uUmonthsr; }r< (U stand-aloner= }r> Unarrowr? }r@ (KX1rA KX2rB KX3rC KX4rD KX5rE KX6rF KX7rG KX8rH K X9rI K X10rJ K X11rK K X12rL usUformatrM }rN (UwiderO }rP (KXYanvarrQ KXFevralrR KXMartrS KXAprelrT KXMayrU KXİyunrV KXİyulrW KXAvqustrX K XSentyabrrY K XOktyabrrZ K XNoyabrr[ K XDekabrr\ uU abbreviatedr] }r^ (KXyanr_ KXfevr` KXmarra KXaprrb KXmayrc KXiynrd KXiylre KXavqrf K Xsenrg K Xoktrh K Xnoyri K Xdekrj uuuUcurrency_formatsrk }rl Ncbabel.numbers NumberPattern rm )rn }ro (Uexp_precrp NUscalerq KU frac_precrr KKrs Usuffixrt Xru ju rv Uint_precrw KKrx h,X ¤ #,##0.00ry Uprefixrz X¤ r{ X-¤ r| r} Uexp_plusr~ NUgroupingr KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KjA KjB KjC KjD KjE KjF KjG usUformatr }r (Uwider }r (KX bazar ertəsir KXçərşənbə axşamır KX çərşənbər KXcümə axşamır KXcümər KXşənbər KXbazarr uU abbreviatedr }r (KXB.E.r KXÇ.A.r KXÇ.r KXC.A.r KXCr KXŞ.r KXB.r uuuU meta_zonesr }r (UTurkeyr }r (Ucommonr Ulongr }r (Udaylightr X Türkiya/yayr Ustandardr XTürkiyar uuUIrishr }r j sUEurope_Easternr }r (Ushortr }r (j XŞərq Avropa/yazr j XŞərq Avropa/standartr uj j }r (j XŞərq Avropa/yayr j X Şərq Avropar uuUMoscowr }r (j j }r (Ugenericr XMoskvar j X Moskva/yayr j XMoskva/standartr uuU Kuybyshevr }r (j j }r (j X Kuybuşev/yayr j X Kuybuşevr uuUBritishr }r j sUSamarar }r (j j }r (j X Samara/yayr j XSamarar uuU Volgogradr }r (j j }r (j X Volqoqrad/yayr j X Volqoqradr uuUEurope_Centralr }r (j }r (j XOrta Avropa/yazr j XOrta Avropa/standartr uj j }r (j XOrta Avropa/yayr j X Orta Avropar uuuUerasr }r (Uwider }r (KXeramızdan əvvəlr KXbizim eramızınr uU abbreviatedr }r (KXe.ə.r KXb.e.r uuu.PK[/&site-packages/babel/localedata/gaa.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXLBqUpmqXSNquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUGHCqgXSidiqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KX AharabataqKXOfloqKX OchokrikriqKXAbeibeeqKXAgbeinaaqKX OtukwadanqKXMaaweqKX ManyawaleqK XGboqK XAntonqK XAlemleqK XAfuabeequU abbreviatedq}q(KXAhaqKXOflqKXOchqKXAbeqKXAgbqKXOtuqKXMaaqKXManqK XGboqK XAntqK XAleqK XAfuquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KXDzuqKXDzufoqKXShoqKXSooqKXSohaaqKXHoqKXHogbaaquU abbreviatedq}q(KXDzuqKXDzfqKXShoqKXSooqKXSohqKXHoqKXHoquuuU meta_zonesq}qUerasq}q(Uwideq}q(KX Dani JesuqKXKJquU abbreviatedq}q(KXDJqKXKJquuu.PK[_.ll(site-packages/babel/localedata/fo_FO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[mJ%site-packages/babel/localedata/uz.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UruqAX РусчаqBUfrqCXФранцузчаqDUenqEXИнглизчаqFUzhqGXХитойчаqHUptqIXПортугалчаqJUuzqKX ЎзбекqLUdeqMXОлмончаqNUitqOXИталянчаqPUhiqQX ҲиндчаqRUarqSX АрабчаqTUjaqUX ЯпончаqVUesqWXИспанчаqXuU territoriesqY}qZ(URUq[X Россияq\UFRq]XФранцияq^UCNq_X Хитойq`UAFqaXАфғонистонqbUDEqcXОлмонияqdUJPqeX ЯпонияqfUITqgX ИталияqhUUSqiXҚўшма ШтатларqjUUZqkXЎзбекистонqlUGBqmX#Бирлашган ҚиролликqnUBRqoXБразилияqpUINqqXҲиндистонqruUdecimal_formatsqs}qtU date_formatsqu}qv(Umediumqwh))qx}qy(h,X yyyy MMM dqzh.X%(yyyy)s %(MMM)s %(d)sq{ubUfullq|h))q}}q~(h,XEEEE, yyyy MMMM ddqh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)squbUlongqh))q}q(h,X yyyy MMMM dqh.X%(yyyy)s %(MMMM)s %(d)squbUshortqh))q}q(h,Xyy/MM/ddqh.X%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}qU Asia/Kabulq}qUcityqXکابلqssUscriptsq}q(UArabqXАрабqULatnqX ЛотинqUCyrlqX КирилquUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}q(UUSDqXАҚШ доллариqURUBqXРус рублиqUINRqXҲинд рупиясиqUCNYqXХитой юаниqUJPYqXЯпон йенасиqUBRLqXБразил реалиqUGBPqX(Инглиз фунт стерлингиqUUZSqXЎзбекистон сўмqUEURqXЕвроquUmonthsq}q(U stand-aloneq}qUnarrowq}q(KXЯqKXФqKXМqKXАqKXМqKXИqKXИqKXАqK XСqK XОqK XНqK XДqusUformatq}q(Uwideq}q(KXМуҳаррамqKX СафарqKXРабиул-аввалqKXРабиул-охирqKXЖумодиул-улоqKXЖумодиул-ухроqKX РажабqKX ШаъбонqK XРамазонqK X ШавволqK XЗил-қаъдаqK XЗил-ҳижжаquU abbreviatedq}q(KXЯнвqKXФевqKXМарqKXАпрqKXМайqKXИюнqKXИюлqKXАвгqK XСенqK XОктqK XНояqK XДекquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KXДqKXСqKXЧqKXПqKXЖqKXШqKXЯqusUformatq}q(Uwideq}q(KXдушанбаqKXсешанбаqKXчоршанбаqKXпайшанбаqKXжумаqKX шанбаqKXякшанбаquU abbreviatedq}q(KXДушqKXСешrKXЧорrKXПайrKXЖумrKXШанrKXЯкшruuuU meta_zonesr}rU Afghanistanr}r (Ucommonr Ulongr }r Ustandardr Xافغانستان وقتیrsusUerasr}rU abbreviatedr}r(KXBCErKXCErusu.PK[99(site-packages/babel/localedata/zh_HK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[p(site-packages/babel/localedata/en_ZA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q (Upatternq!X dd MMM yyyyq"Uformatq#X%(dd)s %(MMM)s %(yyyy)sq$ubUfullq%h)q&}q'(h!XEEEE dd MMMM yyyyq(h#X!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)sq)ubUlongq*h)q+}q,(h!X dd MMMM yyyyq-h#X%(dd)s %(MMMM)s %(yyyy)sq.ubUshortq/h)q0}q1(h!X yyyy/MM/ddq2h#X%(yyyy)s/%(MM)s/%(dd)sq3ubuUcurrency_symbolsq4}q5U time_zonesq6}q7Uscriptsq8}q9Uvariantsq:}q;Unumber_symbolsq<}q=(Udecimalq>X,q?Ugroupq@X qAuUcurrency_namesqB}qCUmonthsqD}qEUcurrency_formatsqF}qGNcbabel.numbers NumberPattern qH)qI}qJ(Uexp_precqKNUscaleqLKU frac_precqMKKqNUsuffixqOXqPhPqQUint_precqRKKqSh!X ¤#,##0.00qTUprefixqUX¤qVX-¤qWqXUexp_plusqYNUgroupingqZKKq[ubsUdaysq\}q]U meta_zonesq^}q_(UAfrica_Easternq`}qaUcommonqbsUAfrica_Southernqc}qdhbsUAfrica_Westernqe}qfhbsUAfrica_Centralqg}qhhbsuUerasqi}qju.PK[y t<<%site-packages/babel/localedata/xh.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX1 unyangantathuq KX2 unyangantathuq KX3 unyangantathuqKX4 unyangantathuquU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q](Uguq^X Isi-Gujaratiq_Ugdq`X Scots GaelicqaUgaqbX Isi-IrishqcUgnqdXGuaraniqeUglqfX Isi-GalicianqgUlaqhX Isi-LatinqiUlnqjXIilwimiqkUloqlX IsiLoathianqmUtrqnX Isi-TurkishqoUlvqpX Isi-LatvianqqUltqrXIsi-LithuanianqsUtkqtXTurkmenquUthqvXIsi-ThaiqwUtiqxX Isi-TigrinyaqyUteqzX Isi-Teleguq{Upt_PTq|XIsi-Portuguese (Portugal)q}Ufilq~X Isi-TaglogqUtaqX Isi-TamilqUyiqXYiddishqUpt_BRqXportokugusseeeqUdeqX Isi-GermanqUdaqX Isi-DanishqUelqX Isi-GreekqUeoqX Isi-EsperantoqUenqXisiNgesiqUeuqX Isi-BasqueqUetqX Isi-EstonianqUesqX Isi-SpanishqUruqX Isi-RussianqUroqX Isi-RomanianqUbnqX Isi-BengaliqUbeqXIsi-BelarusianqUbgqX Isi-BulgariaqUukqX Isi-UkranianqUjvqX Isi-JavaneseqUbhqX Isi-BihariqUbrqXBretonqUbsqX Isi-BosniaqUjaqX Isi-JapaneseqUocqX Iso-OccitanqUtwqXTwiqUtlhqXKlingonqUorqXOriyaqUxhqXisiXhosaqUcaqX Isi-CalatanqUcyqX Isi-WelshqUcsqX Isi-CzechqUpsqXPashtoqUptqXIsi-PortugueseqUpaqX Isi-PunjabiqUviqXIsi-VietnameseqUplqX Isi-PolishqUhyqX isiArmenianqUhrqX Isi-CroatiaqUhuqX Isi-HungarianqUhiqX Isi-HindiqUheqX Isi-HebrewqUuzqX Isi-UzbekqUmlqX Isi-MalayalamqUmnqX IsiMongolianqUmkqXIsi-MacedonianqUurqXUrduqUmtqX Isi-MalteseqUmsqX Isi-MalayqUmrqX Isi-MarathiqUugqX Isi UighurqUafqXisiBhuluqUswqX Isi-SwahiliqUisqX Isi-IcelandicqUamqX Isi-AmharicqUitqX Isi-ItalianqUsvqX Isi-SwedishqUasqX isiAssameseqUarqX Isi-ArabicqUsuqX Isi-SudaneseqUzuqXisiZuluqUiaqX InterlinguaqUazqXIsi-AzerbaijaniqUieqXisiInterlingueqUidqXIsi-IndonesianqUnlqX Isi-DutchqUnnrXIsi-Norwegia (Nynorsk)rUnorX Isi-NorwegianrUnerX Isi-NepalirUfrrX Isi-FrenchrUfyrX Isi-Frisianr Ufar X Isi-Persiar Ufir X Isi-Finnishr UkyrXKyrgyzrUforX Isi-FaroeserUkarX Isi-GeorgiarUsrrX Isi-SerbiarUsqrX Isi-AlbaniarUkorX Isi-KoreanrUknrX Isi-KannadarUkmrX isiCambodiarUstrXSesothorUskr X Isi-Slovakr!Usir"X Isi-Sinhaleser#Ushr$XSerbo-Croatianr%Usor&X IsiSomaliyar'Ukur(XKurdishr)Uslr*X Isi-Slovenianr+Usar,X iSanskritr-Usdr.X isiSindhir/uU territoriesr0}r1Udecimal_formatsr2}r3Nh)r4}r5(h!Nh#Kh$KKr6h&h'h'r7h)KKr8h+X #,##0.###r9h-h'h.r:h0Nh1KKr;ubsU date_formatsr<}r=(Umediumr>hG)r?}r@(h+X yyyy MMM drAhKX%(yyyy)s %(MMM)s %(d)srBubUfullrChG)rD}rE(h+XEEEE, yyyy MMMM ddrFhKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srGubUlongrHhG)rI}rJ(h+X yyyy MMMM drKhKX%(yyyy)s %(MMMM)s %(d)srLubUshortrMhG)rN}rO(h+Xyy/MM/ddrPhKX%(yy)s/%(MM)s/%(dd)srQubuUcurrency_symbolsrR}rSUZARrTXRrUsU time_zonesrV}rWUscriptsrX}rYUvariantsrZ}r[Unumber_symbolsr\}r](Udecimalr^X,r_Ugroupr`X rauUcurrency_namesrb}rcUmonthsrd}re(U stand-alonerf}rgUnarrowrh}ri(KX1rjKX2rkKX3rlKX4rmKX5rnKX6roKX7rpKX8rqK X9rrK X10rsK X11rtK X12ruusUformatrv}rw(Uwiderx}ry(KX JanyuwarirzKX Februwarir{KXMatshir|KXEprelir}KXMeyir~KXJunirKXJulayirKXAgastirK XSeptembarK XOkthobarK XNovembarK XDisembaruU abbreviatedr}r(KXJanrKXFebrKXMatrKXEprrKXMeyrKXJunrKXJulrKXAgarK XSeprK XOktrK XNovrK XDisruuuUcurrency_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKrh+X ¤#,##0.00rh-X¤rX-¤rrh0Nh1KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjkKjlKjmKjnKjoKjpKjjusUformatr}r(Uwider}r(KXMvulorKX LwesibinirKX LwesithathurKXLwesinerKX LwesihlanurKXMgqibelorKXCaweruU abbreviatedr}r(KXMvurKXBinrKXTharKXSinrKXHlarKXMgqrKXCawruuuU meta_zonesr}rUerasr}r(Uwider}r(KXBCrKXumnyaka wokuzalwa kukaYesuruU abbreviatedr}r(KXBCrKXADruuu.PK[~S%%%site-packages/babel/localedata/so.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXsnqUpmqXgnquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UguqAX GujaraatiqBUgdqCX Iskot GiilikqDUgaqEXAyrishqFUgnqGXGuraaniqHUglqIX GaliisiyaanqJUlaqKXLaatiinqLUlnqMXLingalaqNUloqOXLaothianqPUtrqQXTurkishqRUlvqSX LaatfiyaanqTUltqUX LituwaanaysqVUtkqWX TurkumaanishqXUthqYX TaaylandaysqZUtiq[XTigrinyaq\Usuq]X Suudaaniisq^Uteq_XTeluuguq`Upt_PTqaXBoortaqiis (Boortuqaal)qbUfilqcXTagalogqdUtaqeXTamiilqfUyiqgXYadhishqhUpt_BRqiXBoortaqiiska BaraasiilqjUdeqkXJarmalqlUdaqmX DanmarkaysqnUelqoXGiriikqpUeoqqX IsberentoqrUenqsX IngiriisiqtUzhquXJayniisqvUen_USqwXIngiriisi (Maraykan)qxUeuqyXBasquuqzUetq{X Istooniyaanq|Uesq}X Isbaanishq~UruqXRuushqUroqXRomankaqUbnqXBangaaliqUbeqX BeleruusiyaanqUbgqX BulgeeriyaanqUukqX YukreeniyaanqUjvqX JafaaniisqUbhqXBixaariqUbrqXBeretonqUbsqXBoosniyaqUjaqX JabbaaniisqUocqXOkitaanqUundqX!Af aan la aqoon ama aan sax ahaynqUtwqXTiwiyanqUtlhqXKiligoonqUorqXOriyaqUxhqXHoostaqUcaqXKatalaanqUcyqXWelshqUcsqXJeegqUde_CHqXJarmal (Iswiiserlaand)qUpsqXBashtuuqUptqX BoortaqiisqUpaqXBunjaabiqUviqX FiitnaamaysqUes_ESqXIsbaanish (Isbayn)qUplqXBoolishqUhyqX ArmeeniyaanqUhrqXKoro'eeshiyaanqUhuqX HangariyaanqUhiqXHindiqUheqXCibriqUuzqXUsbakisqUmlqX MalayalamqUmnqXMangooliqUmkqX MasadooniyaanqUurqXUrduuqUmtqXMaltiisqUen_GBqX!Ingiriisi (Boqortooyada Midowday)qUmsqXMalaayqUmrqXMaaratiqUugqXUIGHURqUafqX AfrikaanaysqUswqX SawaaxiliqUisqX AyslandaysqUamqXAmhariqUitqXTalyaaniqUsvqXSwiidhisqUasqXAsaamiisqUarqXCarabiqUes_419qXIsbaanishka Laatiin AmeerikaqUzuqXZuuluqUiaqX InterlinguwaqUazqX AzerbaijanqUieqX InterlingueqUidqX IndunuusiyaanqUnlqX HolandaysqUnnqXNowrwejiyan (naynoroski)qUnoqXAf NoorwiijiyaanqUneqXNebaaliqUfrqX FaransiisqUfyqXFiriisiyan GalbeedqUfaqXFaarisiqUfr_CHqXFaransiis (Iswiiserlaand)qUfiqX FiinlaandeesrUkyrXKirgiisrUforXFarowsirUkarX JoorijiyaanrUsrrX SeerbiyaanrUsqr X Albaaniyaanr Ukor X Kuuriyaanr Uknr X KannadaysrUkmrX KamboodhianrUstrXSesootorUskrX IsloofaakrUsirX SinhaleysrUshrX SerbiyaanrUsorXSoomaalirUkurX KurdishkarUslrX IslofeeniyaanrUsarXSanskritr Usdr!XSINDHIr"uU territoriesr#}r$(UBDr%XBangaala-Deeshr&UBEr'XBeljiyamr(UBAr)XBoosniya Heersigoviinar*UBBr+X Baarbadoosr,UBHr-XBaxraynr.UBJr/XBeniinr0UJMr1XJameykar2UJOr3XUrdunr4U014r5X Afrikada Barir6UBRr7XBraasiilr8URUr9XRuushr:UROr;X Rumaaniyar<UGRr=XGiriiggar>UJPr?XJabbaanr@UGDrAX GiriinaadarBUGBrCXUnited KingdomrDUGNrEXGinirFUOMrGXCumaanrHUTNrIX TuniisiyarJUILrKX IsraaʼiilrLUHRrMX KorweeshiyarNUHUrOXHangerirPU030rQX Aasiyada BarirRUPTrSX BortuqaalrTUPKrUX BakistaanrVUPHrWXFilibiinrXUPLrYXBoolandrZUZMr[XSaambiyar\UEGr]XMasarr^UZAr_XKoonfur Afrikar`UECraXIkwadoorrbUVNrcX FiyetnaamrdUZZreX"Far aan la aqoon amase aan saxnaynrfUETrgXItoobiyarhUSOriX SoomaaliyarjUZWrkX SimbaabwerlUESrmXIsbeynrnUMAroXMarookorpUMCrqXMoonakorrUMLrsXMaalirtUMKruX MakadooniyarvUMTrwXMaaldarxUMWryXMalaawirzUMVr{X Maaldiqeenr|UMRr}X Muritaaniyar~UUGrXUgaandarUMXrXMeksikorUMZrX MusambiigrUFRrX FaransiisrUFIrX FiinlaandrUNIrX NikaraaguwarUNOrXNoorweeyrUNArX NamiibiyarUNGrX NayjeeriyarUNZrX NeyuusilaandrUCHrX SwiiserlaandrUCNrXShiinaharUCMrXKameruunrUCLrXJilirUCArXKanadarUCZrXJekoslafaakiyarUCUrXKuubarUSYrXSuuriyarUKErXKiiniyarUKHrX KamboodiyarUKRrXKuuriyada KoonfureedrUKPrXKuuriyada WaqooyirUKWrXKuwaytrUSLrX SiraaliyoonrUKZrX KasaakhistaanrUSArXSacuudi CarabiyarUSErXIswidhanrUSDrXSudaanrU151rX Yurubta BarirUDJrXJabuutirUDKrXDanmaarkrUDErXJarmalrUYErXYamanrUUSrXQaramada Midoobey ee MaraykankarULBrXLubnaanrUTRrXTurkirULKrX SiirilaankarULVrXLaatfiyarUTOrXTongarULUrX LuksemboorgrULRrX LaybeeriyarULSrXLosootorUTHrXTaylaandrUTGrXToogorUTDrXJaadrULYrXLiibiyarUVArX FaatikaanrUAErXImaaraadka Carabta ee MidoobayrUVErX FenisuweelarUAFrX AfgaanistaanrUIQrXCiraaqrUISrXIislaandrUIRrXIiraanrUAMrX ArmeeniyarUITrXTalyaanirUAOrXAngoolarUAUrX AwstraaliyarUATrX OsteeriyarUINrXHindiyarUTZrX TansaaniyarUIErX AyrlaandarUIDrX IndoneesiyarUQArXQadarruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X dd-MMM-yyyyrh.X%(dd)s-%(MMM)s-%(yyyy)srubUfullrh))r}r(h,XEEEE, MMMM dd, yyyyr h.X#%(EEEE)s, %(MMMM)s %(dd)s, %(yyyy)sr ubUlongr h))r }r (h,X dd MMMM yyyyrh.X%(dd)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,Xdd/MM/yyrh.X%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}r(USOSrX$rUKESrXKshruU time_zonesr}rU Etc/Unknownr}rUcityrX"Far aan la aqoon amase aan saxnaynr ssUscriptsr!}r"(UZxxxr#X Aan la qorinr$ULatnr%XLaatiinr&UZzzzr'X"Far aan la aqoon amase aan saxnaynr(uUvariantsr)}r*Unumber_symbolsr+}r,(Udecimalr-X.r.Ugroupr/X,r0uUcurrency_namesr1}r2(UJPYr3X Japanese Yenr4UUSDr5XDoollar maraykanr6URUBr7X Russian Rubler8UXXXr9X!Lacag aan la qoon ama aan saxnaynr:UINRr;X Indian Rupeer<UCNYr=XChinese Yuan Renminbir>UETBr?XBirta Itoobbiyar@jXShilin soomaalirAUBRLrBXBrazilian RealrCUGBPrDXBritish Pound SterlingrEUDJFrFXFaran JabbuutirGUEURrHXYuuroorIuUmonthsrJ}rK(U stand-alonerL}rMUnarrowrN}rO(KXKrPKXLrQKXSrRKXArSKjRKjQKXTrTKjRK jRK jTK jPK jQusUformatrU}rV(UwiderW}rX(KX Bisha KoobaadrYKX Bisha LabaadrZKXBisha Saddexaadr[KX Bisha Afraadr\KX Bisha Shanaadr]KX Bisha Lixaadr^KXBisha Todobaadr_KXBisha Sideedaadr`K XBisha SagaalaadraK X Bisha TobnaadrbK XBisha Kow iyo TobnaadrcK XBisha Laba iyo TobnaadrduU abbreviatedre}rf(KXKobrgKXLabrhKXSadriKXAfrrjKXSharkKXLixrlKXTodrmKXSidrnK XSagroK XTobrpK XKITrqK XLITrruuuUcurrency_formatsrs}rtNcbabel.numbers NumberPattern ru)rv}rw(Uexp_precrxNUscaleryKU frac_precrzKKr{Usuffixr|Xr}j}r~Uint_precrKKrh,X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXIrKjRKjSKjPKXJrKjRKjSusUformatr}r(Uwider}r(KXIsniinrKXSalaasorKXArbacorKXKhamiisrKXJimcorKXSabtirKXAxadruU abbreviatedr}r(KXIsnrKXSalrKXArbrKXKharKXJimrKXSabrKXAxaruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KX Ciise ka horrKX Ciise ka dibrusu.PK[F$(site-packages/babel/localedata/ar_IQ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}qU meta_zonesq}q Uvariantsq!}q"Ucurrency_namesq#}q$u.PK[Rll(site-packages/babel/localedata/st_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99(site-packages/babel/localedata/ii_CN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[99(site-packages/babel/localedata/zh_SG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[' [J%site-packages/babel/localedata/ps.datnu[}q(U zone_formatsq}qUregionqXد %s په وختqsUdatetime_formatsq}qNX{1} {0}qsUquartersq}q Uformatq }q (Uwideq }q (KXQ1qKXQ2qKXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXغ.م.qUpmqXغ.و.quUscientific_formatsq}qUpercent_formatsq }q!U week_dataq"}q#(Umin_daysq$KU weekend_startq%KU first_dayq&KU weekend_endq'KuU time_formatsq(}q)(Umediumq*cbabel.dates DateTimePattern q+)q,}q-(Upatternq.XH:mm:ssq/Uformatq0X%(H)s:%(mm)s:%(ss)sq1ubUfullq2h+)q3}q4(h.X H:mm:ss (v)q5h0X%(H)s:%(mm)s:%(ss)s (%(v)s)q6ubUlongq7h+)q8}q9(h.X H:mm:ss (z)q:h0X%(H)s:%(mm)s:%(ss)s (%(z)s)q;ubUshortq(h.XH:mmq?h0X %(H)s:%(mm)sq@ubuU languagesqA}qB(UguqCX ګجراتيqDUgdqEXسکاټلېنډي ګېلکqFUgaqGXائيرلېنډيqHUgnqIX ګورانيqJUglqKXګلېشياييqLUlaqMX لاتینيqNUloqOX لويتينqPUttqQX تاتارqRUtrqSXترکيqTUlvqUXلېټوانيqVUltqWXليتوانيqXUtkqYX ترکمنيqZUthq[Xتايلېنډيq\Utiq]Xتيګرينيq^Utgq_Xتاجکq`UteqaX تېليګوqbUpt_PTqcXپرتګالي (پرتګال)qdUfilqeX تګالوګqfUtaqgXتاملqhUyiqiXيديشqjUpt_BRqkXپرتگال (برازيل)qlUdeqmX المانيqnUdaqoXډېنشqpUbalqqX بلوڅيqrUelqsX یونانيqtUeoquXاسپرانتوqvUenqwXانګلیسيqxUzhqyXچینيqzUeuq{X باسکيq|Uetq}Xحبشيq~UesqXهسپانويqUruqXروسيqUroqX رومانيqUbnqX بنګاليqUbeqXبېلاروسيqUbgqX بلغاريqUukqXاوکراناييqUjvqX جاوايېqUbhqX بيهاريqUbrqX برېتونqUbsqX بوسنيqUjaqX جاپانیqUocqXاوکسيټانيqUtwqXتویqUtlhqXکلينګانيqUorqX اورياqUxhqXخوساqUcaqX کټلانيqUcyqX ويلشيqUcsqXچېکqUpsqXپښتوqUptqXپورتګاليqUpaqX پنجابيqUviqXوېتناميqUplqX پولنډيqUhyqX ارمنيqUhrqXکروواتيqUhuqX هنګريqUhiqXهنديqUheqXعبريqUmgqX ملغاسيqUuzqX ازبکيqUmlqXمالايالمqUmnqX مغوليqUmkqX مقدونيqUurqXاردوqUmtqXمالټاييqUmsqX ملایاqUmrqX مراټهيqUugqX اويگورqUafqXافريکانيqUswqXسواهېليqUisqXأيسلېنډيqUamqX امهاريqUitqXایټالويqUsvqX سویډنیqUasqXاسمائى ژبهqUarqXعربيqUsuqX سوډانيqUzuqXزولوqUiaqXانټرلنګواqUineqXهند و اروپایيqUazqXأذربائجانيqUieqXآسا نا جبةqUidqXانډونېشياييqUnlqXهالېنډيqUnnqX!ناروېئي (نائنورسک)qUnoqXناروېئېqUneqX نېپاليqUfrqXفرانسويqUfyqX فريزيqUfaqX فارسيqUfiqXفینلنډيqUkyqX کرګيزqUfoqX فاروئېrUkarXجورجيائيrUsrrXسربيائيrUsqrX البانيrUkorXکوريائيrUknr X کنأډهr Ukmr X)کمبوډيايې يا د کمبوډياr Ustr X سيسوتوrUskrXسلوواکيrUsirXسينهاليrUshrXسرب-کروشياييrUsorX سوماليrUkurXکرديrUslrXسلووانيrUsarXسنسکریټrUsdrX سندهيruU territoriesr}r (UBDr!Xبنګله‌دیشr"UFRr#X فرانسهr$UBGr%Xبلغاریهr&UDKr'X ډنمارکr(URUr)X روسیهr*UNOr+X ناروېr,UDEr-X المانr.UJPr/X جاپانr0UHUr1Xمجارستانr2UJMr3X جمیکاr4UGTr5Xګواتیمالاr6UDZr7Xالجزایرr8UGNr9X ګیاناr:UFIr;X فنلینډr<UGRr=X یونانr>UISr?Xآیسلینډr@UNIrAXنکاراګواrBURWrCX رونداrDULBrEX لبنانrFUPTrGXپورتګالrHULArIXلاوسrJUNGrKXنایجیریاrLUNZrMXنیوزیلنډrNULRrOXلایبریاrPUCUrQX کیوباrRUMNrSXمغولستانrTUNLrUX هالېنډrVUNPrWX نیپالrXUPKrYXپاکستانrZUYEr[Xیمنr\UEGr]Xمصرr^UPLr_X پولنډr`ULYraX لیبیاrbUCHrcXسویسrdUCOreXکولمبیاrfUCNrgXچینrhUAFriXافغانستانrjUIQrkXعراقrlUPSrmX فلسطینrnUCAroX کاناډاrpUALrqXالبانیهrrUAOrsX انګولاrtUITruXایټالیهrvUAQrwXانتارکتیکاrxUGBryXبرتانیهrzUINr{Xهندr|UETr}Xحبشهr~UTJrXتاجکستانrUIDrXاندونیزیاrUESrXهسپانیهrUGHrXګاناrUSYrX سوریهrUMArX مراکشrUKHrXکمبودیاrUSVrXسالوېډورrUUYrXیوروګوایrUKWrXکویټrUHNrXهانډوراسrUSArXسعودی عربستانrUTZrXتنزانیاrUMYrXمالیزیاrUSErX سویډنrUATrX اتریشruUdecimal_formatsr}rU date_formatsr}r(Umediumrh+)r}r(h.X d MMM yyyyrh0X%(d)s %(MMM)s %(yyyy)srubUfullrh+)r}r(h.XEEEE د yyyy د MMMM drh0X&%(EEEE)s د %(yyyy)s د %(MMMM)s %(d)srubUlongrh+)r}r(h.Xد yyyy د MMMM drh0Xد %(yyyy)s د %(MMMM)s %(d)srubUshortrh+)r}r(h.Xyyyy/M/drh0X%(yyyy)s/%(M)s/%(d)srubuUcurrency_symbolsr}rUAFNrX؋rsU time_zonesr}rU Asia/Kabulr}rUcityrXکابلrssUscriptsr}rUArabrXعربيrsUvariantsr}rUnumber_symbolsr}r(UgrouprX٬rUnativeZeroDigitrX۰rU exponentialrX×۱۰^rU minusSignrX−rU percentSignrX٪rUdecimalrX٫ruUcurrency_namesr}rjX افغانۍrsUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KX جنوريrKX فبروريrKXمارچrKX اپریلrKXمیrKXجونrKX جولایrKXاګستrK X سپتمبرrK X اکتوبرrK X نومبرrK X دسمبرruU abbreviatedr}r(KjKjKjKjKXمـیrKXجونrKjKjK jK X10rK X11rK X12ruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKr Usuffixr X ¤r j r Uint_precr KKrh.X #,##0.00 ¤rUprefixrXrX-rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r (KX دوشنبهr!KXسه‌شنبهr"KXچهارشنبهr#KXپنجشنبهr$KXجمعهr%KXشنبهr&KX یکشنبهr'uU abbreviatedr(}r)(KjKjKjKjKjKjKjuuuU meta_zonesr*}r+Uerasr,}r-U abbreviatedr.}r/(KXق.م.r0KXم.r1usu.PK[D))-site-packages/babel/localedata/sr_Cyrl_ME.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[.site-packages/babel/localedata/en_US_POSIX.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqKKq Uscaleq KU frac_precq KKq Usuffixq XqhqUint_precqKKqUpatternqX 0.000000E+000qUprefixqhX-qqUexp_plusqUgroupingqMMqubsUpercent_formatsq}qNh)q}q(hNh Kdh KKqh X%qhq hKKq!hX#0%q"hhhq#hNhhubsUnumber_symbolsq$}q%(UperMilleq&X0/00q'Uinfinityq(XINFq)uU week_dataq*}q+(Umin_daysq,KU weekend_startq-KU first_dayq.KU weekend_endq/KuU zone_formatsq0}q1Ucurrency_formatsq2}q3Nh)q4}q5(hNh Kh KKq6h hhq7hKKq8hX ¤ #0.00q9hX¤ q:X-¤ q;qU territoriesq?}q@U time_zonesqA}qBUscriptsqC}qDUdecimal_formatsqE}qFNh)qG}qH(hNh Kh KKqIh hhqJhKKqKhX #0.######qLhhhqMhNhhubsU meta_zonesqN}qOUvariantsqP}qQUcurrency_namesqR}qSu.PK[z9(site-packages/babel/localedata/es_PE.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q(UpatternqXHH'H'mm''ss" vqUformatqX%(HH)sH%(mm)s'%(ss)s" %(v)squbsU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q Ushortq!h)q"}q#(hXd/MM/yyq$hX%(d)s/%(MM)s/%(yy)sq%ubsUcurrency_symbolsq&}q'U time_zonesq(}q)Uscriptsq*}q+Uvariantsq,}q-Unumber_symbolsq.}q/(Udecimalq0X.q1Ugroupq2X,q3uUcurrency_namesq4}q5Umonthsq6}q7Ucurrency_formatsq8}q9Udaysq:}q;U meta_zonesq<}q=Uerasq>}q?u.PK[D))(site-packages/babel/localedata/es_BO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[D))(site-packages/babel/localedata/bs_BA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[ɐ%site-packages/babel/localedata/nn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX 1. kvartalq KX 2. kvartalq KX 3. kvartalqKX 4. kvartalquU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqX formiddagqUpmqX ettermiddagquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X %q8h8q9h)KKq:h+X#,##0 %q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH.mm.ssqJUformatqKX%(HH)s.%(mm)s.%(ss)sqLubUfullqMhG)qN}qO(h+X'kl'. HH.mm.ss vqPhKXkl. %(HH)s.%(mm)s.%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH.mm.ss zqUhKX%(HH)s.%(mm)s.%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH.mmqZhKX %(HH)s.%(mm)sq[ubuU languagesq\}q](Ugvq^Xmanxq_Uguq`XgujaratiqaUscnqbX sicilianskqcUromqdXromaniqeUalgqfXalgonkinsk språkqgUaleqhXaleutiskqiUscoqjXskotskqkUmniqlXmanipuriqmUgdqnXskotsk-gæliskqoUgaqpXirskqqUmnoqrX manobospråkqsUosaqtXosagequUgnqvXguaraniqwUaltqxX sør-altaiqyUglqzXgaliciskq{Umwrq|Xmarwariq}Utyq~XtahitiskqUtwqXtwiqUttqXtatariskqUtrqXtyrkiskqUtsqXtsongaqUtnqXtswanaqUtoqXtonga (Tonga-øyane)qUausqXaustralsk språkqUavqXavariskqUtkqX turkmenskqUthqXthaiqUroaqXromansk språkqUtgqX tatsjikiskqUteqXteluguqUugaqX ugaritiskqUmwlqX mirandesiskqUkcgqXtyapqUfatqXfantiqUfanqXfangqUwoqXwolofqUrmqX retoromanskqUdinqXdinkaqUblaqXsiksikaqUcmcqX kamisk språkqUmlqX malayalamqUzhqXkinesiskqUtemqXtemneqUnwcqXklassisk newariskqUzaqXzhuangqUcauqXkaukasisk språkqUzuqXzuluqUterqXterenoqUtetqXtetumqUmncqXmandsjuqUkutqXkutenaiqUsukqXsukumaqUkumqXkumykqUsusqXsusuqUnewqXnewariqUsuxqXsumeriskqUdenqXslavejqUmenqXmendeqUmulqX fleire språkqUlezqXlezghianqUrootqXrotqUekaqXekajukqUakkqXakkadiskqUdraqXdravidisk språkqUjrbqX jødearabiskqUsgnqX teiknspråkqUsgaqX gammalirskqUapaqX apache-språkqUbraqXbrajqUchbqXchibchaqUchgqXchagataiqUchkqX chuukesiskqUchmqXmariqUchnqXchinookqUchoqXchoctawqUchpqX chipewianskqUchrqXcherokeeqUchyqXcheyenneqUtiqXtigrinjaqUvotqXvotiskqUmgqX madagassiskqUibarXibanrUmorX moldaviskrUmnrXmongolskrUmirXmaorirUmhrX marshallesiskr Umkr X makedonskr Umtr X maltesiskr UcairX!sentralamerikansk indiansk språkrUdelrXdelawarerUmsrXmalayiskrUmrrXmarathirUtarXtamilrUmyrX burmesiskrUcadrXcaddorUsrnrX sranan tongorUtairX taispråkrUafhr Xafrihilir!Usitr"Xsino-tibetansk språkr#Uenmr$X mellomengelskr%Ucsbr&X kasjubiskr'Unynr(Xnyankoler)Unyor*Xnyoror+Unymr,Xnyamwezir-Usior.X sioux-språkr/Umapr0X austronesiskr1Umasr2Xmasair3Ulahr4Xlahndar5Uladr6Xladinskr7Ufyr8X vestfrisiskr9Usnkr:Xsoninker;Ufar<Xpersiskr=Umadr>X maduresiskr?Umagr@XmagahirAUmairBXmaithilirCUfirDXfinskrEUfjrFXfijianskrGUmanrHXmandingorIUegyrJXgammalegyptiskrKUzndrLXzanderMUssrNXswatirOUsrrPXserbiskrQUsqrRXalbanskrSUswrTXswahilirUUsvrVXsvenskrWUsurXX sundanesiskrYUstrZX sørsothor[Uskr\X slovakiskr]Usir^X singalesiskr_Ushr`X serbokroatiskraUsorbXsomalircUsnrdXshonareUsmrfXsamoanskrgUslrhXslovenskriUscrjXsardinskrkUsarlXsanskritrmUsgrnXsangoroUserpX nordsamiskrqUsdrrXsindhirsUzenrtXzenagaruUkbdrvX kabardiskrwUafarxXafroasiatisk språkryUlgrzXgandar{Ulbr|X luxemburgskr}Ufiur~Xfinsk-ugrisk språkrUlnrXlingalarUlorXlaotiskrUlirX limburgiskrUbynrXblinrUltrXlitauiskrUlurX luba-katangarUfilrX filippinskrUyirXjiddiskrUnonrX gammalnorskrUcebrXcebuanskrUyorXjorubarUnogrXnogairUbatrXbaltisk språkrUdakrXdakotarUdarrXdargwarUdayrXdayakrUssarXnilo-saharaspråkrUkperXkpellerUelrXgreskrUeorX esperantorUenrXengelskrUlamrXlambarUeerXewerUmdfrXmoksharUfrrXfranskrUmdrrXmandarrUetrXestiskrUesrXspanskrUrurXrussiskrUgonrXgondirUgohrXgammalhøgtyskrUsmsrX skoltesamiskrUsmnrX enaresamiskrUsmjrX lulesamiskrUsmirX samisk språkrUgotrXgotiskrUrnrXrundirUrorXrumenskrUdsbrX lågsorbiskrUsmarX sørsamiskrUgorrX gorontalorUastrXasturiskrUwalrXwalamorUcrhrX krimtatariskrUathrXathapaskansk språkrUgezrXgesrUxhrXxhosarUffrXfulanirUkforXkororUmakrXmakasarrUzaprXzapotecrUkokrXkonkanirUzxxrXutan språkleg innhaldrUkosrX kosraeanskrUforX færøyskrUtogrX tonga (Nyasa)rUhuprXhuparUudmrXudmurtrUbejrXbejarUbemrXbembarUtsirX tsimshianrUberrXberbiskrUnzirXnzimarUsairXsøramerikansk indiansk språkrUangrX gammalengelskrUprarXprakrit-språkrUbhorXbhojpurirUsalrXsalishansk språkrUprorXgammalprovençalskr Urajr X rajasthanir Usadr Xsandawer UanprXangikarUraprXrapanuirUsasrXsasakrUnqorXn'korUcarrXkaribiskrUminrX minangkabaurUmicrXmicmacrUefirXefikrUarnrX araukanskrUypkr X jupisk språkr!Umisr"X anna språkr#Ukacr$Xkachinr%Ukabr&Xkabylskr'Ukaar(X karakalpakiskr)Ukajr*Xjjur+Ukamr,Xkambar-Ukarr.Xkarenskr/Ukawr0Xkawir1Utyvr2Xtuviniskr3Uawar4Xawadhir5Ukar6Xgeorgiskr7Udoir8Xdogrir9Ukgr:Xkikongor;Ukkr<X kasakhiskr=Ukjr>Xkuanyamar?Ukir@XkikuyurAUkorBXkoreanskrCUknrDXkannadarEUkmrFXkhmerrGUklrHXkalaallisut; grønlandskrIUksrJXkasjmirirKUkrrLXkanurirMUkwrNXkorniskrOUkvrPXkomirQUkurRXkurdiskrSUkyrTX kirgisiskrUUtklrVXtokelaurWUbuarXX burjatiskrYUmgarZX mellomirskr[Uhitr\X hettittiskr]Udyur^Xdyular_Uder`XtyskraUdarbXdanskrcUdzrdXdzongkhareUluirfXluisenorgUdvrhXdivehiriUhilrjX hiligaynonrkUhimrlX himachalirmUgemrnXgermansk språkroUcrprpXkreol- eller pidginspråkrqUqurrXquechuarsUbasrtXbasaruUgbarvXgbayarwUbadrxXbandaryUbanrzX balinesiskr{Ubalr|Xbaluchir}Ushnr~XshanrUbairXbamilekisk språkrUarprXarapahorUartrXkunstig språkrUarwrXarawakrUarcrXarameiskrUen_USrXengelsk (amerikansk)rUsemrXsemittisk språkrUselrX selkupiskrUnubrX nubisk språkrUbtkrXbatakrUlusrXlushairUmusrXcreekrUluarX luba-luluarUirorXirokansk språkrUirarXiranskrUmunrX mundaspråkrUlunrXlundarUluorXluorUwarXvallonskrUtuprX tupi-språkrUjvrX javanesiskrUzblrX blissymbolrUtutrXaltaisk språkrUtumrXtumbukarUjarXjapanskrUcoprXkoptiskrUilorXilokorUlarXlatinrUgwirXgwichinrUundrX ikkje bestemtrUtlirXtlingitrUtlhrXklingonrUchrXchamorrorUcorX korsikanskrUcarX katalanskrUcerX tsjetsjenskrUponrXponapiskrUcyrXwalisiskrUsahrXjakutskrUcsrX tsjekkiskrUcrrXcreerUbntrXbanturUcvrX tsjuvanskrUcurX kyrkjeslaviskrUlvrXlatviskrUdumrXmellumnederlandskrUptrX portugisiskrUduarXdualarUfrorX gammalfranskrUyaprXyapesiskrUfrmrX mellomfranskrUtivrXtivirUfrsrX austfrisiskrUfrrrX nordfrisiskrUyaorXyaorUparXpanjabirUxalrXkalmykrUpirXpalirUplrXpolskrUgayrXgayorUotorXotomisk språkrUotarXottomansk tyrkiskrUhmnrXhmongrUanrXaragonskrUgaarXgarUfurrX friulianskrUkhirX khoisanspråkrUainrXainurUrarrX rarotonganskr Uslar Xslavisk språkr Uver Xvendar UvirX vietnamesiskrUisrXislandskrUkhorX khotanesiskrUiurX inuktitutrUitrX italienskrUvorXvolapykrUiirX sichuan-yirUikrXinupiakrUiorXidorUiner Xindo-europeisk språkr!Uiar"X interlinguar#Ujprr$X jødepersiskr%Uier&X interlinguer'Uidr(X indonesiskr)Uigr*Xibor+Upapr,X papiamentor-Uewor.Xewondor/Upaur0Xpalauiskr1Upaar2Xpapuisk språkr3Upagr4X pangasinanr5Usatr6Xsantalir7Upalr8Xpahlavir9Upamr:Xpampangar;Usycr<Xklassisk syriskr=Uphir>Xfilippinsk språkr?Ucelr@Xkeltisk språkrAUphnrBX fønikiskrCUnicrDXniger-kordofaniansk språkrEUniarFXniasrGUdgrrHXdogribrIUsyrrJXsyriskrKUniurLXniueanskrMUgswrNX sveitsertyskrOUcchrPXatsamrQUjborRXlojbanrSUnahrTXnahuatlrUUsamrVXsamaritansk arameiskrWUhairXXhaidarYUgmhrZXmellomhøgtyskr[Ucusr\Xkusjitisk språkr]Uwenr^Xsorbisk språkr_Uadyr`XadygheraUelxrbX elamittiskrcUadardXadangmereUhawrfXhawaiiskrgUbinrhXbiniriUbikrjXbikolrkUmosrlXmossirmUmohrnXmohawkroUtlrpXtagalogrqUzh_HansrrXforenkla kinesiskrsUzh_HantrtXtradisjonell kinesiskruUtvlrvXtuvalurwUijorxXijoryUkmbrzXkimbundur{Upeor|X gammalpersiskr}Uumbr~XumbundurUtmhrXtamasjekrUfonrXfonrUhsbrX høgsorbiskrUberX kviterussiskrUbgrXbulgarskrUbarX basjkirskrUpsrXpashtorUbmrXbambararUbnrXbengalirUborX tibetanskrUbhrXbiharirUbirXbislamarUbrrXbretonskrUbsrXbosniskrUruprXaromanskrUzzarXzazarUomrXoromorUojrXojibwarUacerX achinesiskrUachrXacolirUocrX oksitanskrUkrurXkurukhrUsrrrXsererrUkrorXkrurUkrlrXkarelskrUkrcrXkarachay-balkarrUndsrXlågtyskrUosrXossetiskrUorrXoriyarUsogrXsogdiskrUnsorX nordsothorUsonrXsonghairUvairXvairUwakrXwakasjansk språkrUlolrXmongorUmkhrXmon-khmerspråkrUlozrXlozirUgilrX kiribatiskrUwasrXwashorUwarrXwarayrUhzrXhererorUhyrXarmenskrUsidrXsidamorUhrrXkroatiskrUhtrXhaitiskrUhurXungarskrUhirXhindirUhorX hiri moturUharXhausarUbugrX buginesiskrUherXhebraiskrUuzrXusbekiskrUurrXurdurUukrXukrainskrUugrXuiguriskrUaarXafarrUabrX abkhasiskrUaerXavestiskrUafrX afrikaansrUakrXakanrUamrXamhariskrUmyvrXerzyarUeurXbaskiskrUasrXassamiskrUarrXarabiskrUinhrX ingusjiskrUtpirX tok pisinrUmynrX mayaspråkrUayrXaymarar Ukhar Xkhasir Uazr Xaserbajdsjanskr UincrX indisk språkrUnlrX nederlandskrUnnrXnynorskrUnorXnorskrUnarXnaururUnbrXbokmålrUnairXnordamerikansk indiansk språkrUndrX nord-ndebelerUnerXnepalskrUngr Xndongar!Unyr"Xnyanjar#Unapr$X napolitanskr%Ugrbr&Xgrebor'Ugrcr(X gammalgreskr)Unrr*X sør-ndebeler+Utigr,Xtigrér-Unvr.Xnavajor/Uzunr0Xzunir1Urwr2X kinjarwandar3Ucper4X'engelskbasert kreol- eller pidginspråkr5Ucpfr6X&franskbasert kreol- eller pidginspråkr7Ucppr8X+portugisiskbasert kreol- eller pidginspråkr9uU territoriesr:}r;(UBDr<X Bangladeshr=UBEr>XBelgiar?UBFr@X Burkina FasorAUBGrBXBulgariarCUVErDX VenezuelarEUBArFXBosnia og HercegovinarGUBBrHXBarbadosrIUWFrJXWallis og FutunarKUBMrLXBermudarMUBNrNXBrunei DarussalamrOUBOrPXBoliviarQUBHrRXBahrainrSUBIrTXBurundirUUBJrVXBeninrWUBTrXXBhutanrYU011rZX Vest-Afrikar[UBVr\X Bouvetøyar]UBWr^XBotswanar_U014r`X Aust-AfrikaraU015rbX Nord-AfrikarcUBRrdXBrasilreU017rfXSentral-AfrikargU018rhXSørlege AfrikariU019rjXAmerikarkUBYrlX KviterusslandrmUBZrnXBelizeroULVrpXLatviarqURWrrXRwandarsURSrtXSerbiaruUTLrvX Aust-TimorrwURErxXRéunionryUTMrzX Turkmenistanr{UOMr|XOmanr}UTJr~X TadsjikistanrUROrXRomaniarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX$Sør-Georgia og Sør-Sandwich-øyanerUGRrXHellasrUGQrXEkvatorial-GuinearUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrX Fransk GuyanarUGErXGeorgiarUGDrXGrenadarU021rXnordlege AmerikarUGBrX StorbritanniarUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GrønlandrU029rXKaribiarUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunisiarUJMrXJamaicarU013rXSentral-AmerikarUWSrXSamoarU419rXLatin-Amerika og KaribiarUHRrXKroatiarUBSrXBahamasrUHTrXHaitirUHUrXUngarnrUHKrXHong Kong S.A.R. (Kina)rU039rX Sør-EuroparUHNrXHondurasrUFIrXFinlandrU142rXAsiarU030rX Aust-AsiarU034rX Sør-AsiarU035rX Søraust-AsiarUPRrX Puerto RicorUPSrXPalestinsk territoriumrU830rX KanaløyanerUFKrXFalklandsøyanerUIOrX"Britiske område i Det indiske havrUPWrXPalaurUPTrXPortugalrUSJrXSvalbard og Jan MayenrUMDrXMoldovarUFMrXMikronesiaføderasjonenrUIQrXIrakrUPArXPanamarUPFrXFransk PolynesiarUPGrXPapua Ny-GuinearUPErXPerurUPKrXPakistanrUPHrX FilippinanerUFOrX FærøyanerUPNrXPitcairnrUPLrXPolenrUPMrXSt. Pierre og MiquelonrUZMrXZambiarUEHrX Vest-SahararURUrXRusslandrUEErXEstlandr UEGr XEgyptr UZAr X Sør-Afrikar UECrXEcuadorrUITrXItaliarUVNrXVietnamrUZZrX(ukjent eller ugyldig område)rUSBrX SalomonøyanerUETrXEtiopiarUSOrXSomaliarUZWrXZimbabwerUSArX Saudi ArabiarUESr XSpaniar!UERr"XEritrear#UMEr$X Montenegror%UAQr&X Antarktisr'UMGr(X Madagaskarr)UMAr*XMarokkor+UMCr,XMonacor-UUZr.X Usbekistanr/UMMr0XMyanmarr1UMLr2XMalir3UMOr4XMacao S.A.R. (Kina)r5UMNr6XMongoliar7UHMr8XHeard- og McDonaldsøyaner9UASr:XAmerikansk Samoar;UMKr<X Makedoniar=UMUr>X Mauritiusr?UMTr@XMaltarAUMWrBXMalawirCUMVrDX MaldivanerEUMQrFX MartiniquerGUMPrHXNord-MariananerIUMSrJX MontserratrKUMRrLX MauritaniarMUIMrNXManrOUUGrPXUgandarQUTZrRXTanzaniarSUMYrTXMalaysiarUUMXrVXMexicorWUILrXXIsraelrYUFRrZX Frankriker[UAWr\XArubar]UDOr^XDen dominikanske republikkenr_USHr`X Saint HelenaraUVCrbXSt. Vincent og GrenadinanercU054rdX MelanesiareUDJrfXDjiboutirgUFJrhXFijiriU057rjX MikronesiarkU172rlXSamveldet av uavhengige statarrmU053rnXAustralia og New ZealandroUNIrpX NicaraguarqUNLrrX NederlandrsUNOrtXNoregruUNArvXNamibiarwUVUrxXVanuaturyUNCrzX Ny-Caledoniar{UNEr|XNigerr}UNFr~X NorfolkøyanerUNGrXNigeriarUNZrX New ZealandrUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolynesiarUCIrXElfenbeinskystenrUCHrXSveitsrUCOrXColombiarUCNrXKinarUCMrXKamerunrUCLrXChilerUCCrX KokosøyanerUCArXCanadarUCGrXKongo-BrazzavillerUCFrX!Den sentralafrikanske republikkenrUCDrXKongo-KinshasarUCZrXTsjekkiarUCYrXKyprosrUCXrX ChristmasøyarUCSrXSerbia og MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Kapp VerderUCUrXCubarUSZrX SwazilandrUSYrXSyriarUKGrX KirgisistanrUKErXKenyarUSRrXSurinamrU143rX Sentral-AsiarUKHrX KambodsjarUKNrXSt. Christopher og NevisrUKMrXKomorenerUSTrXSão Tomé og PrínciperUSKrXSlovakiarUKRrX Sør-KorearUSIrXSloveniarUKPrX Nord-KorearUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellanerUKZrX KasakhstanrUKYrX CaymanøyanerUSGrX SingaporerUSErXSverigerUSDrXSudanrU151rX Aust-EuroparU150rXEuroparUDMrXDominicarU155rX Vest-EuroparU154rX Nord-EuroparUVGrXJomfruøyane (britisk)rUDErXTysklandrUYErXYemenrUMHrXMarshalløyanerU062rXSørlege Sentral-AsiarUDZrXAlgerierUUSrXUSArUUYrXUruguayrUYTrXMayotterUUMrXUSAs ytre småøyarrULBrXLibanonrULCrX St. LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanr UTTr XTrinidad og Tobagor UTRr XTyrkiar ULKrX Sri LankarULIrX LiechtensteinrUCKrX CookøyanerUTOrXTongarULTrXLitauenrULUrX LuxembourgrULRrXLiberiarULSrXLesothorUTHrXThailandrUTFr XFranske sørområder!UTGr"XTogor#UTDr$XTchadr%UTCr&XTurks- og Caicosøyaner'ULYr(XLibyar)UVAr*X Vatikanstatenr+U145r,X Vest-Asiar-UAEr.XDei sameinte arabiske emiratar/UADr0XAndorrar1UAGr2XAntigua og Barbudar3UAFr4X Afghanistanr5UAIr6XAnguillar7UVIr8XJomfruøyane (USA)r9UISr:XIslandr;UIRr<XIranr=UAMr>XArmeniar?UALr@XAlbaniarAUAOrBXAngolarCUANrDXDei nederlandske AntillanerEU003rFX Nord-AmerikarGU002rHXAfrikarIU001rJXverdarKUARrLX ArgentinarMUAUrNX AustraliarOUATrPX AusterrikerQU005rRX Sør-AmerikarSUINrTXIndiarUUAXrVXÅlandrWU009rXXOseaniarYUAZrZX Aserbajdsjanr[UIEr\XIrlandr]UIDr^X Indonesiar_UJOr`XJordanraUQUrbXDen europeiske unionenrcUUArdXUkrainareUQArfXQatarrgUDKrhXDanmarkriUMZrjXMosambikrkUQOrlX Ytre OseaniarmuUdecimal_formatsrn}roNh)rp}rq(h!Nh#Kh$KKrrh&h'h'rsh)KKrth+X #,##0.###ruh-h'h.rvh0Nh1KKrwubsU date_formatsrx}ry(UmediumrzhG)r{}r|(h+X d. MMM. yyyyr}hKX%(d)s. %(MMM)s. %(yyyy)sr~ubUfullrhG)r}r(h+XEEEE d. MMMM yyyyrhKX!%(EEEE)s %(d)s. %(MMMM)s %(yyyy)srubUlongrhG)r}r(h+X d. MMMM yyyyrhKX%(d)s. %(MMMM)s %(yyyy)srubUshortrhG)r}r(h+Xdd.MM.yyrhKX%(dd)s.%(MM)s.%(yy)srubuUcurrency_symbolsr}r(UUSDrXUSDrUNOKrXkrrUINRrXINRrUJPYrXJPYrUBRLrXBRLrUGBPrXGBPrUEURrXEURruU time_zonesr}r(UAtlantic/Canaryr}rUcityrX KanariøyanersU Europe/Lisbonr}rjXLisboarsUIndian/Mauritiusr}rjX MauritaniarsU Asia/Tashkentr}rjXTasjkentrsUPacific/Easterr}rjX PåskeøyarsUAtlantic/Azoresr}rjXAzoranersUAsia/Ulaanbaatarr}rjX Ulan BatorrsUEurope/Luxembourgr}rjX LuxemburgrsU Etc/Unknownr}rjXukjendrsUAmerica/Mexico_Cityr}rjX Mexico byrsUIndian/Maldivesr}rjX MaldivanersUAtlantic/Cape_Verder}rjX Kapp VerdersUAsia/Hong_Kongr}rjXHongkongrsU Europe/Moscowr}rjXMoskvarsUAmerica/Godthabr}rjXGodthåbrsUAntarctica/South_Poler}rjX SørpolenrsuUscriptsr}r(UZsymrXsymbolrUGururXgurmukhirUHebrrXhebraiskrUZzzzrXukjend eller ugyldig skriftrUPhnxrX fønikiskrUMoonrXmoonrUSamrrX samaritanskrUChamrXchamrUArabrXarabiskrUGujrrXgujaratirUZxxxrXkode for språk utan skriftrULycirXlykiskrUSinhrXsinhalarUTalurX ny tai luerUMongrXmongolskrUXpeorX gammalpersiskrUVisprX synleg talerURjngrXrejangrUOlckrXol-chikirUTalerXtai lerUMandrXmandaiskrUManirX manikeiskrUMlymrX malayalamrUTibtrX tibetanskrUKalirXkayah lirUJpanrXjapanskrUPlrdrXpollard-fonetiskrUKanar Xkatakanar ULydir Xlydiskr ULepcr Xlepcha (róng)rUSundrX sundanesiskrUYiiirXyirUJavarX javanesiskrUOryarXoriyarULaoorXlaotiskrUUgarrX ugaritiskrUCyrlrX kyrilliskrUVaiirXvairUArmnrXarmenskr UCyrsr!X!kyrillisk (kyrkjeslavisk variant)r"UKhmrr#Xkhmerr$UArmir%Xarmiskr&USylor'X syloti nagrir(UItalr)X gammalitaliskr*USgnwr+X teiknskriftr,UXsuxr-Xsumero-akkadisk kileskriftr.UThaar/Xthaanar0UThair1Xthair2UCprtr3X kypriotiskr4ULinbr5X lineær Br6ULinar7X lineær Ar8UOsmar9Xosmanyar:USaurr;X saurashtrar<UHirar=Xhiraganar>UHanir?Xhanr@UEgydrAXegyptisk demotiskrBUQaairCXnedarvarDUEgyhrEXegyptisk hieratiskrFUCansrGX#felles kanadiske urspråksstavingarrHUEgyprIXegyptiske hieroglyfarrJUZmthrKXmatematisk notasjonrLUTfngrMXtifinagh (berber)rNUShawrOXshaviskrPUCirtrQXcirthrRUGeorrSXgeorgiskrTUTengrUXtengwarrVUHrktrWXkatakana eller hiraganarXUGeokrYX"khutsuri (asomtavruli og nuskhuri)rZUTavtr[Xtai vietr\UOgamr]Xoghamr^UDsrtr_Xdeseretr`UGothraXgotiskrbUHanorcXhanunoordUBalireX balinesiskrfUKorergXkoreanskrhUHangriXhangulrjUCarirkXkariskrlUAvstrmXavestiskrnUTagbroXtagbanwarpUHansrqXforenkla kinesiskrrUHantrsXtradisjonell kinesiskrtURororuX rongorongorvUDevarwX devanagarirxUIndsryXindus (Harappan)rzUBopor{Xbopomofor|UMymrr}Xmyanmarr~UTglgrXtagalogrUPermrX gammalpermiskrUBugirX buginesiskrUPhagrXphags-parUBrairXbraillerUBrahrXbrahmirUBatkrXbatakrUMerorX meroitiskrULimbrXlumburUMteirX meitei-mayekrUTelurXtelugurUTamlrXtamilskrUSararXsaratirULatgrXlatinsk (gælisk variant)rULatfrXlatinsk (frakturvariant)rUKharrX kharoshthirUNkoorXn'korULatnrXlatinskrUMayarXmaya-hieroglyfarrULanarXlannarUEthirXetiopiskrUKthirXkaithiskrUHmngrX pahawk hmongrUBuhdrXbuhidrUCoptrXkoptiskrUGlagrX glagolittiskrURunrrXrunerrUOrkhrXorkhonrUCakmrXchakmarUHungrX gammalungarskrUGrekrXgreskrUCherrXcherokeerUZyyyrXfellesrUSyrcrX syriakiskrUBlisrX blissymbolrUBengrXbengalirUSyrerXsyriakisk (estrangelo-variant)rUSyrjrXsyriakisk (vestleg variant)rUSyrnrXsyriakisk (austleg variant)rUKndarXkannadaruUvariantsr}r(UVALENCIArXvalensisk dialektrUREVISEDrXrevidert rettskrivingrUAREVMDArX vestarmenskrUFONIPArX,det internasjonale fonetiske alfabetet (IPA)rU1996rXtysk ortografi frå 1996rUBOONTrX boontlingrUSCOUSErXscouse-dialektrUAREVELArX austarmenskrUMONOTONrXmonotonisk rettskrivingrUROZAJrXresisk dialektrUFONUPArX#det uralske fonetiske alfabetet UPArUPOLYTONrXpolytonisk rettskrivingrUSAAHOrX saaho-dialektrU1901rXtradisjonell tysk ortografiruUnumber_symbolsr}r(UgrouprX rUnativeZeroDigitrX0rUperMillerX‰rUdecimalrX,rU percentSignrX%rUlistrX;rUplusSignrX+rUinfinityrX∞rU minusSignrX−ruUcurrency_namesr}r(jXamerikansk dollarrUAZMrXaserbaijansk manatrUBELrXbelgisk franc (finansiell)rUZRZrX zairisk zairer UBOPr X bolivisk pesor UBECr Xbelgisk franc (konvertibel)r UBEFrX belgisk francrUBGNrXbulgarsk ny levrUBRRrXbrasiliansk cruzeirorUBADrXbosnisk-hercegovinsk dinarrUBSDrXbahamisk dollarrUATSrXausterriksk schillingrjXbritisk pund sterlingrUBOBrX bolivianorUBAMrX'bosnisk-hercegovinsk mark (konvertibel)rUDKKrX dansk kroner UCVEr!Xkappverdisk escudor"UGWPr#XGuinea-Bissau-pesor$UZALr%Xsørafrikansk rand (finansiell)r&UAOAr'Xangolsk kwanzar(UBRNr)Xbrasiliansk cruzado novor*UBIFr+Xburundisk francr,UAONr-Xangolsk ny kwanza (1990-2000)r.UXXXr/Xukjend eller ugyldig valutar0UAOKr1Xangolsk kwanza (1977-1990)r2UAMDr3X armensk dramr4UBUKr5Xburmesisk kyatr6UAORr7X%angolsk kwanza reajustado (1995-1999)r8UZWDr9Xzimbabwisk dollarr:UAWGr;Xarubisk gyldenr<jXeuror=USTDr>XSao Tome og Principe-dobrar?UZMKr@Xzambisk kwacharAUAFNrBXafghanirCUAUDrDXaustralsk dollarrEUADPrFXandorransk pesetarGUBGLrHXbulgarsk hard levrIUBBDrJXbarbadisk dollarrKUAFArLXafghani (1927-2002)rMUCNYrNXkinesisk yuan renminbirOUXOFrPXCFA franc BCEAOrQUBDTrRXbangladeshisk takarSUARSrTXargentinsk pesorUUBOVrVXbolivisk mvdolrWUZRNrXXzairisk ny zairerYUMZNrZXmosambikisk meticalr[UBNDr\Xbruneisk dollarr]UARPr^Xargentinsk peso (1983-1985)r_UALLr`X albansk lekraUANGrbXnederlansk antillegyldenrcUBMDrdXbermudisk dollarrejX norsk kronerfURUBrgX russisk rubelrhUZARriXsørafrikansk randrjUBHDrkXbahrainsk dinarrljX indisk rupirmjX japansk yenrnUARAroXargentisk australrpjXbrasiliansk realrqUBRErrX brasiliansk cruzeiro (1990-1993)rsUBTNrtXbhutansk ngultrumruUBRCrvXbrasiliansk cruzadorwUBRBrxX%brasiliansk cruzeiro novo (1967-1986)ryUAEDrzX UAE dirhamr{uUmonthsr|}r}(U stand-aloner~}rUnarrowr}r(KXJrKXFrKXMrKXArKjKjKjKjK XSrK XOrK XNrK XDrusUformatr}r(Uwider}r(KXjanuarrKXfebruarrKXmarsrKXaprilrKXmairKXjunirKXjulirKXaugustrK X septemberrK XoktoberrK XnovemberrK XdesemberruU abbreviatedr}r(KXjanrKXfebrKXmarrKXaprrKXmairKXjunrKXjulrKXaugrK XseprK XoktrK XnovrK XdesruuuUcurrency_formatsr}rNh)r}r(h!Nh#Kh$KKrh&X ¤rjrh)KKrh+X #,##0.00 ¤rh-h'h.rh0Nh1KKrubsUdaysr}r(U stand-aloner}r(U abbreviatedr}r(KXmå.rKXla.ruUnarrowr}r(KjKXTrKjKjKjKXLrKjuuUformatr}r(Uwider}r(KXmåndagrKXtysdagrKXonsdagrKXtorsdagrKXfredagrKXlaurdagrKXsøndagruU abbreviatedr}r(KXmårKXtyrKXonrKXtorKXfrrKXlarKXsø.ruuuU meta_zonesr}r(UAfrica_Westernr}r(UcommonrUlongr}r(UdaylightrXvestafrikansk sommartidrUstandardrXvestafrikansk tidruuUEurope_Easternr}r(jj}r(jXausteuropeisk sommartidrjXausteuropeisk tidruuUEurope_Westernr}r(jj}r(jXvesteuropeisk sommartidrjXvesteuropeisk tidruuUAfrica_Easternr}r(jj}rjXaustafrikansk tidrsuUAustralia_CentralWesternr}r(jj}r(UgenericrXvest-sentralaustralsk tidrjXvest-sentralaustralsk sommartidrjX!vest-sentralaustralsk standardtidruuUAfrica_Centralr}r(jj}rjXsentralafrikansk tidrsuUAustralia_Centralr}r(jj}r(jXsentralaustralsk tidrjXsentralaustralsk sommartidrjXsentralaustralsk standardtidruuUAfrica_Southernr}r(jj}r(jXsørafrikansk tidr jXsørafrikansk standardtidr uuUAustralia_Easternr }r (jj}r (jXaustaustralsk tidr jXaustaustralsk sommartidr jXaustaustralsk standardtidr uuUAustralia_Westernr }r (jj}r (jXvestaustralsk tidr jXvestaustralsk sommartidr jXvestaustralsk standardtidr uuUEurope_Centralr }r (jj}r (jXsentraleuropeisk sommartidr jXsentraleuropeisk tidr uuUGMTr }r (jj}r jXGreenwich middeltidr suuUerasr }r (Uwider }r (KXf.Kr.r KXe.Kr.r uU abbreviatedr }r (KXf.Kr.r KXe.Kr.r uuu.PK[99(site-packages/babel/localedata/ur_PK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll*site-packages/babel/localedata/ha_Latn.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[LL(site-packages/babel/localedata/en_PH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qUPHPq XPesoq!su.PK[Rll*site-packages/babel/localedata/zh_Hans.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK['6GG%site-packages/babel/localedata/ur.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KXپہلی سہ ماہیqKXدوسری سہ ماہیqKXتيسری سہ ماہیqKXچوتهی سہ ماہیquU abbreviatedq}q(KX1سہ ماہیqKX2سہ ماہیqKX3سہ ماہیqKX4سہ ماہیquuuUperiodsq}q(Uamq Xقبل دوپہرq!Upmq"Xبعد دوپہرq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3X h:mm:ss aqRUformatqSX%(h)s:%(mm)s:%(ss)s %(a)sqTubUfullqUhO)qV}qW(h3X h:mm:ss a vqXhSX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqYubUlongqZhO)q[}q\(h3X h:mm:ss a zq]hSX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq^ubUshortq_hO)q`}qa(h3Xh:mm aqbhSX%(h)s:%(mm)s %(a)sqcubuU languagesqd}qe(UguqfX گجراتیqgUgdqhXسکاٹ گيلِکqiUgaqjX آئيرِشqkUgnqlXگُارانیqmUglqnXگاليشيائیqoUlaqpX لاطينیqqUlnqrXلِنگَلاqsUloqtXلاؤشِیَنquUtrqvXترکیqwUlvqxX ليٹوينqyUltqzXلتھُواینینq{Utkq|Xترکمانیq}Uthq~X تهائیqUtiqX تگرینیqUteqX تيلوگوqUpt_PTqXپرتگالی (پرتگال)qUfilqXٹيگالاگیqUtaqX تامِلqUyiqXيادشqUpt_BRqX#پرتگالی (ﺑﺮﺍﺯﻳﻞ)qUdeqXجرمنqUdaqXڈينشqUelqX يونانیqUeoqXايسپرانٹوqUenqXانگريزیqUzh_HansqXچینی (آسان کردہ)qUzh_HantqXچینی (روایتی)qUen_USqX امریکہ کی انگریزیqUeuqX باسکیqUetqXاسٹونينqUesqXہسپانویqUruqXروسیqUroqX رومنیqUbnqX بنگالیqUbeqXبيلاروسیqUbgqX بلغاریqUukqXيُوکرينیqUjvqXجاویqUbhqX بِہاریqUbrqX برِیٹنqUbsqX بوسنیqUjaqX جاپانیqUocqXآکيٹانیqUtwqXتویqUtlhqX کلنگانqUorqX اورِیاqUxhqXخوسہqUcaqXکاٹالانينqUcyqXويلشqUcsqXچيکqUpsqXپشتوqUptqXپُرتگالیqUtlqXٹیگا لوگqUpaqX پنجابیqUviqXويتنامیqUplqXپولستانیqUhyqX ارمینیqUhrqX کراتیqUhuqXہنگیرینqUhiqXہندیqUheqX عبرانیqUuzqXازبکqUmlqXمالايالمqUmnqX منگؤلیqUmkqXمقدونيائیqUurqXاردوqUmtqX مالٹیqUen_GBqXبرطانوی انگریزیqUmsqX مالائیqUmrqX مراٹهیqUugqXاُئِیگُورqUafqXايفريکانزqUswqXسواہیلیqUisqXبرفستانیqUamqX امہاریqUitqX اطالویqUsvqX سويڈشqUasrX آسامیrUarrXعربیrUsurXسُوڈانیrUzurX زُولُوrUiarXانٹرلنگویr Uazr Xآزربائیجانیr Uidr Xانڈونيثيائیr UnlrXڈچrUnnrX#نورویجینی (نینورسک)rUnorXنارويجينrUnerX نيپالیrUfrrXفرانسيسیrUfyrX فريژينrUfarX فارسیrUfirX فنّنِشrUkyrX کرغیزیrUfor Xفیروئیزr!Ukar"X جارجیr#Usrr$Xصربیr%Usqr&X البانیr'Ukor(X کورينr)Uknr*X کنّاڈاr+Ukmr,Xکمبوڈیَنr-Ustr.Xسیسوتھوr/Uskr0Xسلاواکیr1Usir2X سنہالیr3Ushr4Xسربو-کروئیشینr5Usor6X سومالیr7Ukur8Xكردشr9Uslr:X سلوينیr;Usar<Xسَنسکرِتr=Usdr>X سندھیr?uU territoriesr@}rA(UBDrBXبنگلا دیشrCUBErDXبیلجئیمrEUBFrFXبرکینا فاسوrGUBGrHXبلغاریہrIUBArJXبوسنیا ہرزگویناrKUWFrLXوالس اور فتونہrMUBOrNXبولیویاrOUJPrPX جاپانrQUBIrRX برنڈیrSUBJrTXبیننrUUBTrVX بھوٹانrWUBVrXXجزیرہ بووٹrYUBWrZXبوٹسواناr[UWSr\X سامواr]UBRr^X برازیلr_UBSr`Xباھا ماسraUJErbXجرسیrcUBYrdX بیلا رسreURUrfXروسrgURWrhX روانڈاriUTLrjXمشرقی تیمورrkUTJrlXتاجکستانrmUROrnXرومانیہroUTKrpXٹوکیلاؤrqUGWrrXگنی بسائوrsUGSrtXAجنوبی جارجیا اور جزائر جنوبی سینڈوچruUGRrvX یونانrwUGQrxXاستوائی گنیryUGGrzX گرنزیr{UGFr|Xفرانسیسی گی آناr}UGEr~X جارجیاrUGBrXبرطانیہrUGArX غیبونrUGNrXگنیrUGMrX گیمبیاrUGLrXگرین لینڈrUGHrX گھاناrUOMrXعمانrUTNrX تیونسrUJOrXاردنrUHRrX کروشیاrUHTrX ہائٹیrUHUrX ہنگریrUHNrXہونڈوراسrUHMrX2جزیرہ ہرڈ اور جزائر مکڈونلڈrUPSrX فلسطینrUPTrX پرتگالrUPYrXپیراگوئےrUSHrXسینٹ ھیلیناrUPFrX#فرانسیسی پولینیسیاrUPGrXپاپوا نیو گنیrUPErXپیروrUPKrXپاکستانrUPHrX فلپائنrUPLrX پولینڈrUPMrX+سینٹ پائرے اور میکویلونrUZMrX زیمبیاrUEHrXمغربی صحاراrUEErXایسٹونیاrUEGrXمصرrUZArXجنوبی افریقہrUECrXایکواڈورrUITrXاٹلیrUVNrX ویت نامrUZZrXUnknown or Invalid RegionrUSBrXجزائرسولمونrUETrXایتھوپیاrUZWrXزمبابوےrUSArXسعودی عربrUESrXسپینrUERrXاریٹیریاrUMDrXمالدوواrUMGrXمڈغاسکرrUMArX مراکشrUUZrXازبکستانrUMMrX میانمرrUMLrXمالیrUMOrX ماکاؤrUMNrXمنگولیاrUMHrXجزائر مارشلrUMKrXمقدونیہrUUMrX=ریاست ہائے متحدہ اور بیرونی جزائرrUMWrX ملاویrUMPrX#شمالی ماریاناجزائرrUMRrXموریطانیہrUUGrX یوگنڈاrUMYrXملائیشیاrUMXrXمیکسیکوrUILrXاسرائیلrUFRrX فرانسrUFIrX فن لینڈrUFKrXجزائر فاک لینڈrUFMrXمائکرونیزیاrUFOrXجزائرفاروrUNIrXنکاراگواrUNLrXنیدرلینڈrUNOrX ناروےrUNArX نمیبیاrUVUrXوانواٹوrUNCrXنیو کیلیڈونیاr UNEr X نائیجرr UNFr Xجزیرہ نارفولکr UNGrXنائیجیریاrUNZrXنیوزی لینڈrUNPrX نیپالrUCKrXجزائر کُکrUCHrXسوئزر لینڈrUCOrXکولمبیاrUCNrXچینrUCMrX کیمرونrUCLrXچلیrUCCr Xجزائر کوکوزr!UCAr"X کینیڈاr#UCGr$X کانگوr%UCFr&X$جمہوریہ وسطی افریقہr'UCDr(X$کانگو، جمہوری ریاستr)UCZr*Xجمہوریہ چیکr+UCYr,Xقبرصr-UCXr.Xجزیرہ کرسمسr/UCSr0X&سربیا اور مانٹینیگروr1UUYr2Xہوراگوئےr3UCUr4X کیوباr5USZr6Xسوازی لینڈr7USYr8X سیریاr9UKGr:Xکرغستانr;UKEr<X کینیاr=USRr>Xسورینامr?UKIr@XکِرباتیrAUKHrBXکمبوڈیاrCUKNrDXسینٹ کٹس اور نیوسrEUKMrFXکوموروسrGUSKrHXسلوواکیہrIUKRrJXجنوبی کوریاrKUSIrLXسلوانیہrMUKPrNXشمالی کوریاrOUSOrPXصوپالیہrQUSNrRXسینیگالrSUSMrTXسان میرینوrUUSLrVXسیرالیونrWUSCrXX سے شلزrYUKZrZXقزاقستانr[UKYr\Xجزائر کیمنr]USEr^X سویڈنr_USDr`X سوڈانraUDOrbXڈومینیکن ریپبلکrcUDKrdX ڈنمارکreUVGrfXجزائر ورجن، برٹشrgUDErhX جرمنیriUYErjXیمنrkUDZrlXالجیریاrmUUSrnX+ریاست ہائے متحدہ امریکاroULBrpX لبنانrqULCrrXسینٹ لوسیاrsULArtXلاؤسruUTVrvX ٹوالوrwUTWrxXتائیوانryUTTrzX$ٹرینیڈاڈ اور ٹوباگوr{UTRr|Xترکیr}ULKr~Xسری لنکاrULIrXلکٹنسٹائنrULVrX لٹوِیاrUTOrX تونگاrULTrXلتھوانیاrUTMrXترکمانستانrULRrXلائبیریاrULSrXلیسوتھوrUTHrXتھائی لینڈrUTFrX-جنوبی فرانسیسی علاقہ جاتrUTGrXٹوگوrUTDrXچاڈrUTCrX'جزائر کیکس اور ترکیّہrULYrX لیبیاrUVArXویٹیکن سٹیrUVCrX-سینٹ کیرن اور گریناڈائنزrUAErXمتحدہ عرب اماراتrUVErXوینزولاrUAGrX$انٹیگوا اور باربوداrUAFrXافغانستانrUIQrXعراقrUVIrX"جزائر ورجن، امریکہrUISrXآئس لینڈrUIRrX ایرانrUAMrXآر مینیاrUALrXالبانیاrUAOrX انگولاrUANrX!نیدرلینڈز انٹیلیزrUAQrXانٹار ٹکاrUASrXامریکی سامواrUARrXارجنٹیناrUAUrXآسٹریلیاrUATrX آسٹریاrUIOrX%بحرھند کا برٹش علاقہrUINrX بھارتrUTZrXتنزانیہrUAZrXآذر بائجانrUIErXآئر لینڈrUIDrXانڈونیشیاrUUArXیوکرائنrUMZrXموزنبیقruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X d, MMM yyyyrhSX%(d)s, %(MMM)s %(yyyy)srubUfullrhO)r}r(h3XEEEE, d, MMMM yyyyrhSX"%(EEEE)s, %(d)s, %(MMMM)s %(yyyy)srubUlongrhO)r}r(h3X d, MMMM yyyyrhSX%(d)s, %(MMMM)s %(yyyy)srubUshortrhO)r}r(h3Xd/M/yyrhSX%(d)s/%(M)s/%(yy)srubuUcurrency_symbolsr}rU time_zonesr}r(UAmerica/Belizer}rUcityrX بیلیزrsU Pacific/Palaur}rjX پالائوrsUAmerica/Guatemalar}rjXگوئٹے مالاrsU Asia/Bahrainr}rjX بحرینrsUEurope/Gibraltarr}rjXجبرالٹرrsUAfrica/Djiboutir}rjX جبوتیrsUAmerica/Costa_Ricar}rjXکوسٹا ریکاr sUIndian/Mayotter }r jX مایوٹr sUPacific/Pitcairnr }rjX پٹ کیرنrsUAmerica/Anguillar}rjXانگویلاrsU Asia/Qatarr}rjXقطرrsU Asia/Bruneir}rjXبرونائیrsUEurope/Andorrar}rjX انڈوراrsUAsia/Singaporer}rjXسنگاپورrsUAmerica/Montserratr}r jXمونٹ سراٹr!sUAtlantic/Bermudar"}r#jX برمودہr$sU Pacific/Niuer%}r&jX نیوئےr'sUEurope/Luxembourgr(}r)jXلیگزمبرگr*sUAmerica/Barbadosr+}r,jXبار باڈوسr-sUIndian/Reunionr.}r/jXری یونینr0sUAmerica/Martiniquer1}r2jXمارٹنیکr3sU Europe/Monacor4}r5jX موناکوr6sUAmerica/El_Salvadorr7}r8jXایلسلواڈورr9sUAtlantic/Cape_Verder:}r;jX کیپ ورڈr<sUAsia/Hong_Kongr=}r>jXہانگ کانگr?sUAmerica/Grenadar@}rAjX غرناطہrBsU Asia/MacaurC}rDjX مکائوrEsUAmerica/GuadelouperF}rGjXگواڈیلوپrHsUAmerica/JamaicarI}rJjXجمائیکاrKsUIndian/MaldivesrL}rMjX مالدیپrNsU Pacific/FijirO}rPjXفجیrQsU America/ArubarR}rSjX اروباrTsU Asia/KuwaitrU}rVjXکویتrWsUAmerica/DominicarX}rYjXڈومینیکاrZsU Pacific/Guamr[}r\jXگوامr]sU Europe/Maltar^}r_jX مالٹاr`sU Etc/Unknownra}rbjXUnknownrcsUAmerica/Puerto_Ricord}rejXپورٹو ریکوrfsUIndian/Mauritiusrg}rhjX ماریشسrisUAmerica/Guyanarj}rkjX گیاناrlsUAmerica/Panamarm}rnjX پانامہrosU Pacific/Naururp}rqjXنوروrrsuUscriptsrs}rt(UArabruXالعربيةrvUZxxxrwXZxxxrxUZzzzryXZzzzrzuUvariantsr{}r|Unumber_symbolsr}}r~(UdecimalrX.rUgrouprX,ruUcurrency_namesr}r(UCOPrXکولمبین پیسہrUUSDrXامریکی ڈالرrUGBPrX*انگلستانی پاونڈ سٹرلنگrUTWDrXنیو تائیوان ڈالرrUSITrXسلوانین ٹولرrUEGPrXمصری پائونڈrUIDRrXانڈونیشین روپیہrUBGNrXبلغارین لیوrUPENrXپیروین نیووسولrUDEMrXڈچ مارکسrUEEKrXایسٹونین کرونrUBOBrX!بولیوین بولیویانوrUDKKrXڈنمارک کرونرrUSKKrXسلووک کروناrUFRFrXفرانسیسی فرانکrUPKRrXپاکستانی روپیہrUMXNrXمیکسیکی پیسہrUHUFrXہنگرین فورنٹrURONrX نیا رومانیائی لیوrUMYRrXملائیشین رنگٹrULTLrXلیتھوانی لیٹاسrUTRLrXترکی لیراrUSARrXسعودی ریالrUCADrXکنیڈین ڈالرrUSEKrXسویڈن کرونرrUSGDrXسنگا پور ڈالرrUHKDrXھانگ کانگ ڈالرrUAUDrXآسٹریلین ڈالرrUCHFrXسوئس فرانکسrUKRWrX$جنوبی کوریائی جیتا۔rUCNYrXیوآن رینمنبیrUTRYrXنیا ترکی لیراrUVEBrXوینزویلا بولیورrUHRKrXکروشین کوناrUNZDrXنیوزی لینڈ ڈالرrUCLPrXچلّین پیسہrUTHBrXتھائی باہتrUEURrXیوروrUARSrXارجنٹائن پیسہrUILSrXاسرائیلی شیکلrUNOKrXناروے کرونرrURSDrXسربین دینارrURUBrXروسی روبلrUINRrXانڈین روپیہrUJPYrXجاپانی ینrUCZKrXچیک کروناrUBRLrXبرازیلی ریئلrUMADrXمراکشی درہمrUPLNrXپولش نیو زلوٹیrUPHPrXفلپائینی پیسہrUZARrX جنوبی افریقی رانڈrUAEDrX)متحدہ عرب اماراتی درہمruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXجrKXفrKXمrKXاrKXمrKXجrKXجrKXاrK XسrK XاrK XنrK XدrusUformatr}rUwider}r(KX جنوریrKX فروریrKX مار چrKX اپريلrKXمئrKXجونrKX جولائr KXاگستr K X ستمبرr K X اکتوبرr K X نومبرr K X دسمبرrusuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X ¤#,##0.00rh5X¤rX-¤rrh8Nh9KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r (Kh KhKhKX5r!KX6r"KX7r#Kh usUformatr$}r%(Uwider&}r'(KXپيرr(KXمنگلr)KXبدهr*KX جمعراتr+KXجمعہr,KXہفتہr-KX اتوارr.uUnarrowr/}r0(KXپr1KXمr2KXبr3KXجr4KXجr5KXہr6KXاr7uuuU meta_zonesr8}r9Uerasr:}r;(Uwider<}r=(KXقبل مسيحr>KXعيسوی سنr?uU abbreviatedr@}rA(KXق مrBKXعيسوی سنrCuuu.PK[ķ %site-packages/babel/localedata/kw.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXa.m.qUpmqXp.m.quUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@UkwqAXkernewekqBsU territoriesqC}qDUGBqEXRywvaneth UnysqFsUdecimal_formatsqG}qHU date_formatsqI}qJ(UmediumqKh))qL}qM(h,X d MMM yyyyqNh.X%(d)s %(MMM)s %(yyyy)sqOubUfullqPh))qQ}qR(h,XEEEE d MMMM yyyyqSh.X %(EEEE)s %(d)s %(MMMM)s %(yyyy)sqTubUlongqUh))qV}qW(h,X d MMMM yyyyqXh.X%(d)s %(MMMM)s %(yyyy)sqYubUshortqZh))q[}q\(h,X dd/MM/yyyyq]h.X%(dd)s/%(MM)s/%(yyyy)sq^ubuUcurrency_symbolsq_}q`U time_zonesqa}qbUscriptsqc}qdUvariantsqe}qfUnumber_symbolsqg}qhUcurrency_namesqi}qjUmonthsqk}ql(U stand-aloneqm}qnUnarrowqo}qp(KX1qqKX2qrKX3qsKX4qtKX5quKX6qvKX7qwKX8qxK X9qyK X10qzK X11q{K X12q|usUformatq}}q~(Uwideq}q(KX Mys GenverqKX Mys WhevrelqKX Mys MerthqKX Mys EbrelqKXMys MeqKXMys EfanqKX Mys GortherenqKXMye EstqK X Mys GwyngalaqK X Mys HedraqK XMys DuqK X Mys KevardhuquU abbreviatedq}q(KXGenqKXWheqKXMerqKXEbrqKXMeqKXEfnqKXGorqKXEstqK XGwnqK XHedqK XDuqK XKevquuuUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqh,X ¤#,##0.00qUprefixqX¤qX-¤qqUexp_plusqNUgroupingqKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhrKhsKhtKhuKhvKhwKhqusUformatq}q(Uwideq}q(KXDe LunqKXDe MerthqKX De MerherqKXDe YowqKX De GwenerqKX De SadornqKXDe SulquU abbreviatedq}q(KXLunqKXMthqKXMhrqKXYowqKXGweqKXSadqKXSulquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXRCqKXADqusu.PK[Rll(site-packages/babel/localedata/sw_TZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[jFF&site-packages/babel/localedata/fil.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KXQ1qKXQ2qKXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quuuUperiodsq}q(Uamq XAMq!Upmq"XPMq#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XHH:mm:ssqRUformatqSX%(HH)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X HH:mm:ss vqXhSX%(HH)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X HH:mm:ss zq]hSX%(HH)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XHH:mmqbhSX %(HH)s:%(mm)sqcubuU languagesqd}qe(UguqfXGujaratiqgUgdqhX Scots GaelicqiUgaqjXIrishqkUgnqlXGuaraniqmUglqnXGalicianqoUlaqpXLatinqqUlnqrXLingalaqsUloqtXLaoquUtrqvXTurkoqwUlvqxXLatvianqyUltqzX Lithuanianq{Utkq|XTurkmenq}Uthq~XThaiqUtiqXTigrinyaqUteqXTeluguqUfilqXFilipinoqUtaqXTamilqUyiqXYiddishqUpt_BRqXPortuges (Brasil)qUdeqXAlemanqUdaqXDanishqUelqXGriyegoqUeoqX EsperantoqUenqXInglesqUzhqXzhqUzh_HansqXIntsik (Pinadali)qUzh_HantqXIntsik (Tradisyunal)qUen_USqX Ingles (US)qUeuqXBasqueqUetqXEstonianqUesqXEspanyolqUruqXRusoqUrmqXRhaeto-RomanceqUroqXRomanianqUbnqXBengali; BanglaqUbeqX BelarusianqUbgqX BulgarianqUukqXUkranianqUwoqXWolofqUjvqXJavaneseqUbhqXBihariqUbrqXBretonqUbsqXBosnianqUjaqXJapaneseqUocqXOccitanqUundqXundqUtwqXTwiqUtlhqXKlingonqUorqXOriyaqUxhqXXhosaqUcaqXCatalanqUcyqXWelshqUcsqXCzechqUpsqXPashtoqUptqXPortugesqUtlqXTagalogqUpaqXPunjabiqUviqX VietnameseqUplqXPolishqUhyqXArmenianqUhrqXCroatianqUhuqX HungarianqUhiqXHinduqUheqXHebreoqUuzqXUzbekoqUmlqX MalayalamqUmnqX MongolianqUmkqX MacedonianqUurqXUrduqUmtqXMalteseqUen_GBqX Ingles (UK)qUmsqXMalayqUmrqXMarathiqUugqXUighurqUafqX AfrikaansqUswqXSwahiliqUisqX IcelandicqUamrXAmharicrUitrXItalyanorUsvrXSuwisorUasrXAssameserUarrXArabicr Usur X Taga Sundanr Uzur XZulur UiarX InterlinguarUazrX AzerbaijanirUierX InterlinguerUidrX IndonesianrUnlrXOlandesrUnnrXNorwegian NynorskrUnorX NorwegianrUnerXNepalirUfrrXPransesrUfyr XPrisianr!Ufar"XPersianr#Ufir$XFinnishr%Ukyr&XKirghizr'Ufor(XFaroesor)Ukar*XGeorgianr+Usrr,XSerbiranr-Usqr.XAlbanianr/Ukor0XKoreanr1Uknr2XKannadar3Ukmr4XKhmerr5Ustr6XSesotor7Uskr8XEslobakr9Usir:X Sinhaleser;Ushr<XSerbo-Croatianr=Usor>XSomalir?Ukur@XKurdishrAUslrBX EslobenyanrCUsarDXSanskritrEUsdrFXSindhirGuU territoriesrH}rI(UBDrJX BangladeshrKUBErLXBelgiumrMUBFrNX Burkina FasorOUBGrPXBulgariarQUVErRX VenezuelarSUBArTXBosnia and HerzegovinarUUBBrVXBarbadosrWUWFrXXWallis and FutunarYUBMrZXBermudar[UBNr\XBruneir]UBOr^XBoliviar_UBHr`XBahrainraUBIrbXBurundircUBJrdXBeninreUBTrfXBhutanrgU011rhXKanlurang AfricariUBVrjX Bouvet IslandrkUBWrlXBotswanarmU014rnXSilangang AfricaroU015rpXHilagang AfricarqUBRrrXBrazilrsU017rtXGitnang AfricaruU018rvXKatimugang AfricarwU019rxXAmericasryUBYrzXBelarusr{UBZr|XBelizer}ULVr~XLatviarURWrXRwandarURSrXSerbiarUTLrX East TimorrUOMrXOmanrUTJrX TajikistanrUROrXRomaniarUTKrXTokelaurUGWrX Guinea-BissaurUGSrX,South Georgia and the South Sandwich IslandsrUGRrXGriyegorUGQrXEquatorial GuinearUJPrXJapanrUKIrXKiribatirUGGrXGuernseyrUGFrX French GuianarUGErXGeorgiarU021rXHilagang AmerikarUGBrXUnited KingdomrUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GreenlandrU029rX CarribbeanrUGHrXGhanarUJErXJerseyrUTNrXTunisiarU013rXGitnang AmerikarUWSrXSamoarU419rXLatin America at ang CaribbeanrUHRrXCroatiarUBSrXBahamasrUHTrXHaitirUHUrXHungaryrUHKrXHong Kong SAR ChinarU039rXKatimugang EuroparUHNrXHondurasrUFIrXFinlandrU142rXAsyarU030rXSilangang AsyarU034rXKatimugang AsyarU035rXTimog-Silangang AsyarUPSrX PalestinerUFKrXFalkland IslandsrUIOrXBritish Indian Ocean TerritoryrUPTrXPortugalrUSJrXSvalbard and Jan MayenrUMDrXMoldovarUIQrXIraqrUSHrX Saint HelenarUPFrXFrench PolynesiarUPGrXPapua New GuinearUPErXPerurUPKrXPakistanrUPHrX PilipinasrUFOrX Faroe IslandsrUPLrXPolandrUPMrXSaint Pierre at MiquelonrUZMrXZambiarUEHrXWestern SahararURUrXRussiarUEErXEstoniarUEGrXEhiptorUZArX Timog AfrikarUECrXEcuadorrUITrXItalyarUVNrXVietnamrUZZrX$Hindi kilala o Hindi wastong RehiyonrUSBrXSolomon Islandsr UETr XEthiopiar UZWr XZimbabwer USArX Saudi ArabyarUESrXEspanyarUERrXEritrearUMErX MontenegrorUAQrX AntarticarUMGrX MadagascarrUMArXMoroccorUUZrX UzbekistanrUMMrXMyanmarrUMLr XMalir!UMOr"XMacaor#UMNr$XMongoliar%UHMr&X!Heard Island and McDonald Islandsr'UASr(XAmerican Samoar)UMKr*X Macedoniar+UUMr,X$United States minor outlying islandsr-UMWr.XMalawir/UMPr0XNorthern Mariana Islandsr1UMRr2X Mauritaniar3UIMr4X Isle of Manr5UUGr6XUgandar7UTZr8XTanzaniar9UMYr:XMalaysiar;UMXr<XMehikor=UILr>XIsraelr?UFRr@XPransesrAUAWrBXArubarCUDOrDXDominican RepublicrEUVCrFX Saint Vincent and the GrenadinesrGU054rHX MelanesiarIUDJrJXDjiboutirKUFJrLXFijirMU057rNXRehiyong MicronesiarOUFMrPX MicronesiarQU053rRXAustralia at New ZealandrSUNIrTX NicaraguarUUNLrVX NetherlandsrWUNOrXXNorwayrYUNArZXNamibiar[UVUr\XVanuatur]UNCr^X New Caledoniar_UNEr`XNigerraUNFrbXNorfolk IslandrcUNGrdXNigeriareUNZrfX New ZealandrgUNPrhXNepalriU061rjX PolynesiarkUCIrlXCôte d'IvoirermUCHrnX SwitzerlandroUCOrpXColombiarqUCNrrXTsinarsUCMrtXCameroonruUCLrvXChilerwUCCrxX Cocos IslandsryUCArzXCanadar{UCGr|XCongor}UCFr~XCentral African RepublicrUCDrXCongo - KinshasarUCZrXCzech RepublicrUCYrXCyprusrUCXrXChristmas IslandrUCSrXSerbia at MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Cape VerderUCUrXCubarUSZrX SwazilandrUSYrXSyriarUKGrX KyrgyzstanrUKErXKenyarUSRrXSurinamerU143rX Gitnang AsyarUKHrXCambodiarUKNrXSaint Kitts and NevisrUKMrXComorosrUSTrXSao Tome and PrinciperUSKrXSlovakiarUKRrX Timog KorearUSIrXSloveniarUKPrXHilagang KorearUSOrXSomaliarUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KazakhstanrUKYrXCayman IslandsrUSErXSwedenrUSDrXSudanrU151rXSilangang EuroparU150rXEuroparUDMrXDominicarU155rXKanlurang EuroparU154rXHilagang EuroparUVGrXBritish Virgin IslandsrUDErXAlemayarUYErXYemenrUMHrXMarshall IslandsrU062rXTimog-Gitnang AsyarUDZrXAlgeriarUUSrX United StatesrUUYrXUruguayrULBrXLebanonrULCrX Saint LuciarULArXLaosrUTVrXTuvalurUTWrXTaiwanrUTTrXTrinidad and TobagorUTRrXTurkeyrULKrX Sri LankarULIrX LiechtensteinrUCKrX Cook IslandsrUTOrXTongarULTrX LithuaniarUTMrX TurkmenistanrULRrXLiberiarULSrXLesothorUTHrXThailandrUTFrXFrench Southern TerritoriesrUTGrXTogorUTDrXChadrUTCrXTurks and Caicos IslandsrULYrXLibyarUVArX Vatican CityrU145rXKanlurang AsyarUAErXUnited Arab Emiratesr UADr XAndorrar UAGr XAntigua at Barbudar UAFrX AfghanistanrUAIrXAnguillarUVIrXU.S. Virgin IslandsrUISrXIcelandrUIRrXIranrUAMrXArmeniarUALrXAlbaniarUAOrXAngolarUANrXNetherlands AntillesrU003r X North Americar!U002r"XAfricar#U001r$XMundor%UARr&X Argentinar'UAUr(X Australiar)UATr*XAustriar+U005r,X South Americar-UINr.XIndiar/UAXr0X Aland Islandsr1U009r2XOceaniar3UAZr4X Azerbaijanr5UIEr6XIrelandr7UIDr8X Indonesiar9UJOr:XJordanr;UQUr<XEuropean Unionr=UUAr>XUkrainer?UDKr@XDenmarkrAUMZrBX MozambiquerCUQOrDXMalayong bahagi ng OceaniarEuUdecimal_formatsrF}rGNh&)rH}rI(h)Nh+Kh,KKrJh.h/h/rKh1KKrLh3X #,##0.###rMh5h/h6rNh8Nh9KKrOubsU date_formatsrP}rQ(UmediumrRhO)rS}rT(h3X MMM d, yyyyrUhSX%(MMM)s %(d)s, %(yyyy)srVubUfullrWhO)rX}rY(h3XEEEE, MMMM dd yyyyrZhSX"%(EEEE)s, %(MMMM)s %(dd)s %(yyyy)sr[ubUlongr\hO)r]}r^(h3X MMMM d, yyyyr_hSX%(MMMM)s %(d)s, %(yyyy)sr`ubUshortrahO)rb}rc(h3XM/d/yyrdhSX%(M)s/%(d)s/%(yy)sreubuUcurrency_symbolsrf}rgUPHPrhXPhPrisU time_zonesrj}rk(UAmerica/St_Luciarl}rmUcityrnX St. LuciarosUAmerica/St_Vincentrp}rqjnX St. VincentrrsU Asia/Tbilisirs}rtjnXTbilisi.rusUAfrica/Conakryrv}rwjnXConarkyrxsUAmerica/Port_of_Spainry}rzjnXPort nang Espanyar{sUAfrica/Porto-Novor|}r}jnX Porto - Novor~sU Asia/Dushanber}rjnX Dushanbe.rsUAmerica/St_Thomasr}rjnX St. ThomasrsU Etc/Unknownr}rjnXUnknownrsUIndian/Christmasr}rjnXPasko.rsU Africa/Maserur}rjnXMaseru.rsUAmerica/St_Kittsr}rjnX St. KittsrsU Africa/Hararer}rjnXHarare.rsuUscriptsr}r(UJavarXJavarUZxxxrXZxxxrUCirtrXCirtrUGururXGururUHebrrXHebrrUGeorrXGeorrUZzzzrXZzzzrUCyrlrXCyrlrUHrktrXHrktrUArmnrXArmnrUGeokrXGeokrULatfrXLatfrUKhmrrXKhmrrUArmirXArmirUKharrXKharrUEgyhrXEgyhrUDsrtrXDsrtrUPhlvrXPhlvrUZyyyrXZyyyrUGothrXGothrULatnrXLatnrUHanorXHanorUIndsrXIndsrUBalirXBalirUGujrrXGujrrUKorerXKorerUHangrXHangrUBuhdrXBuhdrUArabrXArabrULycirXLycirUNkoorXNkoorUCarirXCarirUAvstrXAvstrULinbrXLinbrUCoptrXCoptrUHansrXHansrUCprtrXCprtrUGlagrXGlagrULepcrXLepcrUHantrXHantrUMongrXMongrUDevarXDevarULaoorXLaoorUHirarXHirarUMoonrXMoonrUBoporXBoporUMerorXMerorUHanirXHanirUCakmrXCakmrUMymrrXMymrrUMandrXMandrUBugirXBugirUManirXManirUBrairXBrairUBrahrXBrahrUSyrerXSyrerUGrekrXGrekrUMlymrXMlymr UEgydr XEgydr UCherr XCherr UEthirXEthirUQaairXQaairUKalirXKalirUJpanrXJpanrUBatkrXBatkrULatgrXLatgrUChamrXChamrUKthirXKthirUBlisrXBlisrULanar XLanar!ULydir"XLydir#ULinar$XLinar%UBengr&XBengr'UEgypr(XEgypr)ULimbr*XLimbr+UMteir,XMteir-UMayar.XMayar/USyrnr0XSyrnr1UKanar2XKanar3UKndar4XKndar5uUvariantsr6}r7Unumber_symbolsr8}r9Ucurrency_namesr:}r;(UCOPr<XColombian Pesor=UUSDr>X US Dollarr?UGBPr@XBritish Pounds SterlingrAUTWDrBXNew Taiwan DollarrCUSITrDXSlovenian TolarrEUEGPrFXEgyptian PoundrGUIDRrHXIndonesian RupiahrIUBGNrJX Bulgarian LevrKUPENrLXPeruvian Nuevo SolrMUDEMrNXDeutsche MarksrOUEEKrPXEstonian KroonrQUBOBrRXBolivian BolivianorSUDKKrTXDenmark KronerrUUSKKrVX Slovak KorunarWUFRFrXX French FrancrYUPKRrZXPakistan Rupeer[UMXNr\X Mexico Pesor]UHUFr^XHungarian Forintr_URONr`X Romanian LeuraUMYRrbXMalaysian RinggitrcULTLrdXLithuanian LitasreUTRLrfX Turkish LirargUSARrhX Saudi RiyalriUCADrjXCanadian DollarrkUSEKrlX Sweden KronorrmUSGDrnXSingapore DollarsroUHKDrpXHong Kong DollarsrqUAUDrrXAustralian DollarrsUCHFrtX Swiss FrancsruUKRWrvXSouth Korean WonrwUCNYrxX Yuan RenminbiryUTRYrzX Turkish Lirar{UVEBr|XVenezuela Bolivarr}UHRKr~X Croatian KunarUNZDrXNew Zealand DollarsrUCLPrX Chilean PesorUTHBrX Thai BahtrUEURrXEurosrUARSrXArgentine PesorUILSrXIsraeli ShekelrUNOKrXNorwegian KronerrURSDrX Serbian DinarrURUBrX Russian RublerUINRrX Indian RupeerUJPYrX Japanese YenrUCZKrX Czech KorunarUBRLrXBrazilian RealrUMADrXMoroccan DirhamrUPLNrXPolish NewZlotyrjhXPhilippine PesorUZARrXSouth African RandrUXXXrXXXXrUAEDrXUnited Arab Emirates DirhamruUmonthsr}r(U stand-aloner}r(Uwider}r(KXEnerorKXPebrerorKXMarsorKXAbrilrKXMayorKXHunyorKXHulyorKXAgostorK X SetyembrerK XOktubrerK X NobyembrerK X DisyembreruUnarrowr}r(KXErKXPrKXMrKXArKjKXHrKjKjK XSrK XOrK XNrK XDruuUformatr}r(Uwider}r(KXEnerorKXPebrerorKXMarsorKXAbrilrKXMayorKXHunyorKXHulyorKXAgostorK X SetyembrerK XOktubrerK X NobyembrerK X DisyembreruU abbreviatedr}r(KXEnerKXPebrKXMarrKXAbrrKXMayrKXHunrKXHulrKXAgorK XSetrK XOktrK XNobrK XDisruuuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X ¤ #,##0.00rh5X¤ rX-¤ rrh8Nh9KKrubsUdaysr}r(U stand-aloner}r(U abbreviatedr}r(KXMiyrKXBiyruUnarrowr}r(KXLrKjKjKjKXBrKjKjuuUformatr}r(Uwider}r(KXLunesrKXMartesrKX MiyerkulesrKXHuwebesrKXBiyernesrKXSabadorKXLinggoruU abbreviatedr}r(KXLunrKXMarrKXMyerKXHuwrKXByer KXSabr KXLinr uuuU meta_zonesr }r Uerasr}rU abbreviatedr}r(KXBCErKXCErusu.PK[4ʎ33%site-packages/babel/localedata/ko.datnu[}q(U zone_formatsq}q(UregionqX %s 시간qUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 제 1/4분기qKX 제 2/4분기qKX 제 3/4분기qKX 제 4/4분기quU abbreviatedq}q(KX1분기q KX2분기q!KX3분기q"KX4분기q#uuuUperiodsq$}q%(Uamq&X오전q'Upmq(X오후q)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X%qFhFqGh7KKqHh9X#,##0%qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9X a h:mm:ssqXUformatqYX%(a)s %(h)s:%(mm)s:%(ss)sqZubUfullq[hU)q\}q](h9Xa hh시 mm분 ss초 vq^hYX)%(a)s %(hh)s시 %(mm)s분 %(ss)s초 %(v)sq_ubUlongq`hU)qa}qb(h9Xa hh시 mm분 ss초 zqchYX)%(a)s %(hh)s시 %(mm)s분 %(ss)s초 %(z)sqdubUshortqehU)qf}qg(h9Xa h:mmqhhYX%(a)s %(h)s:%(mm)sqiubuU languagesqj}qk(UgvqlX 맹크스어qmUguqnX구자라트어qoUscnqpX시칠리아어qqUromqrX 집시어qsUalgqtX알공킨어족quUaleqvX 알류트어qwUscoqxX스코틀랜드어qyUmniqzX마니푸리어q{Ugdq|X스코틀랜드 게일어q}Ugaq~X아일랜드어qUmnoqX 마노보어qUosaqX오세이지어qUgnqX 과라니어qUaltqX남부 알타이어qUglqX갈리시아어qUmwrqX마르와리어qUtyqX 타히티어qUtwqX 트위어qUttqX 타타르어qUtrqX 터키어qUtsqX 총가어qUtnqX세츠와나어qUtoqX 통가어qUausqX오스트레일리아어족qUavqX 아바릭어qUtkqX투르크멘어qUthqX 태국어qUroaqX로망스어 (기타)qUtgqX타지키스탄어qUteqX 텔루구어qUugaqX유가리틱어qUmwlqX 미란데어qUfatqX 판티어qUfanqX 팡그어qUwoqX 올로프어qUrmqX레토로만어qUdinqX 딩카어qUblaqX 식시카어qUcmcqX 참어군qUmlqX말라얄람어qUzhqX 중국어qUtemqX 팀니어qUen_CAqX캐나다 영어qUnwcqX네와르어 (고전)qUzaqX 주앙어qUcauqX카프카스어 (기타)qUzuqX 줄루어qUterqX 테레노어qUtetqX 테툼어qUmncqX 만주어qUkutqX 쿠테네어qUsukqX수쿠마족어qUkumqX 쿠믹어qUsusqX 수수어qUnewqX 네와르어qUsuxqX 수메르어qUdenqX 슬라브어qUmenqX 멘데어qUmulqX 다중 언어qUlezqX레즈기안어qUrootqX어근qUekaqX 이카죽어qUakkqX 아카드어qUdraqX드라비다어 (기타)qUjrbqX유대-아라비아어qUsgnqX수화qUsgaqX$아일랜드, 고대 (900년 까지)qUapaqX 아파치어qUbraqX 브라지어qUchbqX 치브차어qUchgqX차가타이어qUchkqX 추크어qUchmqX 마리어qUchnqX0치누크어와 영어 프랑스어의 혼성어qUchorX 촉토어rUchprX 치페우얀rUchrrX 체로키어rUchyrX 샤이엔어rUtirX티그리냐어r Uvotr X 보틱어r Umgr X마다가스카르어r UibarX 이반어rUmorX 몰도바어rUmnrX 몽고어rUmirX 마오리어rUmhrX마셜제도어rUmkrX마케도니아어rUmtrX 몰타어rUcairX)중앙 아메리카 인디안어 (기타)rUdelrX델라웨어어rUmsr X 말레이어r!Umrr"X 마라티어r#Utar$X 타밀어r%Umyr&X 버마어r'Ucadr(X 카도어r)Usrnr*X스라난 통가어r+Utair,X태국어 (기타)r-Uafhr.X아프리히리어r/Usitr0X중국 티베트 어족r1Uenmr2X영어, 중세 (1100-1500)r3Uen_AUr4X영어(호주)r5Unynr6X 니안콜어r7Unyor8X 뉴로어r9Unymr:X니암웨지어r;Usior<X 수족어r=Umapr>X 남도어r?Umasr@X 마사이어rAUlahrBX 라한다어rCUladrDX 라디노어rEUfyrFX프리지아어rGUsnkrHX 소닌케어rIUfarJX페르시아어rKUmadrLX 마두라어rMUmagrNX 마가히rOUmairPX 마이틸리rQUfirRX 핀란드어rSUfjrTX 피지어rUUmanrVX 만딩고어rWUegyrXX이집트어 (고대)rYUzndrZX아잔데족어r[Ussr\X시스와티어r]Usrr^X세르비아어r_Usqr`X알바니아어raUswrbX스와힐리어rcUsvrdX 스웨덴어reUsurfX 순다어rgUstrhX소토어 (남부)riUskrjX슬로바키아어rkUsirlX스리랑카어rmUshrnX세르비아-크로아티아어roUsorpX소말리아어rqUsnrrX 쇼나어rsUsmrtX 사모아어ruUslrvX슬로베니아어rwUscrxX사르디니아어ryUsarzX산스크리트어r{Usgr|X 산고어r}User~X북부 사미어rUsdrX 신디어rUzenrX 제나가어rUkbdrX카바르디어rUafarX"아시아-아프리카어 (기타)rUcsbrX카슈비아어rUlgrX 간다어rUlbrX룩셈부르크어rUfiurX피노우그리아어 (기타)rUlnrX 링갈라어rUlorX 라오어rUlirX 림버거어rUbynrX 브린어rUltrX리투아니아어rUlurX루바-카탄가어rUfilrX 필리핀어rUyirX 이디시어rUnonrX노르웨이, 고대rUcebrX세부아노어rUyorX 요루바어rUnogrX 노가이어rUbatrX발트어 (기타)rUdakrX 다코타어rUdarrX다르그와어rUdayrX 다야크어rUssarX니로-사하람어 (기타)rUkperX 크펠레어rUelrX 그리스어rUeorX에스페란토어rUenrX영어rUlamrX 람바어rUeerX 에웨어rUmdfrX 모크샤어rUfrrX 프랑스어rUmdrrX 만다르어rUetrX에스토니아어rUesrX 스페인어rUrurX 러시아어rUgonrX 곤디어rUgohrX고대 고지 독일어rUsmsrX스콜트 사미어rUsmnrX이나리 사미어rUsmjrX룰레 사미어rUsmirX사미어 (기타)rUgotrX 고트어rUrnrX 룬디어rUrorX루마니아어rUdsbrX저지 소르비아어rUsmarX남부 사미어rUgorrX고론탈로어rUastrX아스투리아어rUwalrX 와라모어rUcrhrX+크리민 터키어; 크리민 타타르어rUathrX아타파스카어군rUgezrX 게이즈어rUxhrX 코사어rUffrX 풀라어rUkforX 코로어rUmakrX 마카사어rUzaprX사포테크어rUkokrX 코카니어rUkosrX코스라이엔어rUforX 페로어rUtogrX통가어 (니아살랜드)rUhuprX 후파어rUudmrX우드말트어rUbejrX 베자어rUbemrX 벰바어rUtsirX트심시안어rUberrX베르베르어r Unzir X 느지마어r Usair X%남아메리카 인디언어 (기타)r UangrX 고대 영어rUprarX프라크리트어rUbhorX호즈푸리어rUsalrX샐리시어어rUprorX고대 프로방스어rUrajrX라자스탄어rUsadrX 산다웨어rUanprX 앙가어rUes_419rX중남미 스페인어rUrapr X 라파뉴이r!Usasr"X 사사크어r#Unqor$X 응코어r%Ucarr&X 카리브어r'Uminr(X미낭카바우r)Umicr*X 미크맥어r+Uefir,X 이픽어r-Uarnr.X아라우칸어r/Uypkr0X 야픽어r1Umisr2X 기타 언어r3Ukacr4X 카친어r5Ukabr6X 커바일어r7Ukaar8X카라칼파크어r9Ukamr:X 캄바어r;Ukarr<X 카렌어r=Ukawr>X 카위어r?Utyvr@X투비니안어rAUawarBX 아와히어rCUkarDX그루지야어rEUdoirFX 도그리어rGUkgrHX 콩고어rIUkkrJX 카자흐어rKUkjrLX쿠안야마어rMUkirNX 키쿠유어rOUkorPX 한국어rQUknrRX 카나다어rSUkmrTX캄보디아어rUUklrVX그린란드어rWUksrXX카슈미르어rYUkrrZX 칸누리어r[Ukwr\X 콘월어r]Ukvr^X 코미어r_Ukur`X 쿠르드어raUkyrbX키르기스어rcUtklrdX토켈라우제도어reUbuarfX 부리아타rgUmgarhX"아일랜드어, 중세 (900-1200)riUhitrjX하타이트어rkUdyurlX 드율라어rmUdernX 독일어roUdarpX 덴마크어rqUdzrrX 종카어rsUluirtX루이세노어ruUdvrvX 디베히어rwUhilrxX헤리가뇬어ryUhimrzX히마차리어r{Ugemr|X독일어 (기타)r}Ucrpr~X#크리올어 및 피진어 (기타)rUqurX 케추아어rUbasrX 바사어rUgbarX 그바야어rUbadrX 반다어rUbanrX 발리어rUbalrX 발루치어rUshnrX샨어rUbairX바밀레케어족rUarprX아라파호어rUartrX기계어 (기타)rUarwrX아라와크어rUarcrX 아람어rUen_USrX영어 (미국식)rUsemrX셈어 (기타)rUselrX 셀쿠프어rUnubrX 누비안어rUbtkrX 바타크어rUlusrX 루샤이어rUmusrX 크리크어rUluarX루바-룰루아어rUirorX이러쿼이어rUirarX이란어 [ira]rUmunrX 문다어rUlunrX 룬다어rUluorX 루오어rUwarX 왈론어rUtuprX 투피어rUjvrX 자바어rUzblrX블리스 심볼rUtutrX알타이어족 (기타)rUtumrX 툼부카어rUjarX 일본어rUcoprX 콥트어rUilorX 이로코어rUlarX 라틴어rUgwirX 그위친어rUundrX결정되지않음rUtlirX틀링깃족어rUtlhrX 클링온어rUchrX 차모로어rUcorX코르시카어rUcarX카탈로니아어rUcerX 체첸어rUponrX 폼페이어rUcyrX 웨일스어rUsahrX 야큐트어rUcsrX 체코어rUcrrX 크리어rUbntrX 반투어rUcvrX 추바시어rUcurX교회 슬라브어rUlvrX라트비아어rUdumrX중세 네덜란드어rUptrX포르투갈어rUduarX 드와라어rUfrorX고대 프랑스어rUyaprX 얍페세어rUfrmrX중세 프랑스어rUtivrX 티비어rUfrsrX동부 프리슬란드어rUfrrrX북부 프리슬란드어rUyaorX 야오족어rUparX 펀잡어rUxalrX 칼미크어rUpirX 팔리어rUen_GBrX영어 (영국식)rUgayrX 가요어rUotorX오토미안어rUotarX 터키어, 오스만 (1500-1928)r Uhmnr X 히몸어r Umyvr X 엘즈야어r UgaarX가어rUfurrX프리우리안어rUkhirX코이산어 (기타)rUainrX 아이누어rUrarrX라로통가어rUslarX슬라브어 (기타)rUverX 벤다어rUvirX 베트남어rUisrX아이슬란드어rUkhor X 호탄어r!Uiur"X이눅티투트어r#Uitr$X이탈리아어r%Uvor&X볼라퓌크어r'Uiir(X 쓰촨 이어r)Uikr*X이누피아크어r+Uior,X 이도어r-Uiner.X인도유럽어 (기타)r/Uiar0X)인테르링구아(국제보조어협회)r1Ujprr2X유대-페르시아어r3Uier4X인테르링구에r5Uidr6X인도네시아어r7Uigr8X 이그보어r9Upapr:X파피아먼토어r;Uewor<X 이원도어r=Upaur>X파라우안어r?Upaar@X파푸아어 (기타)rAUpagrBX판가시난어rCUsatrDX 산탈리어rEUpalrFX 팔레비어rGUpamrHX 팜팡가어rIUsycrJX시리아어 (고전)rKUphirLX필리핀어 (기타)rMUcelrNX켈트어 (기타)rOUphnrPX페니키아어rQUnicrRX*니제르 - 코르도파니아어 (기타)rSUniarTX 니아스어rUUdgrrVX도그리브어rWUsyrrXX 시리아어rYUniurZX 니웨언어r[Ugswr\X독일어 (스위스)r]Ucchr^X 아삼어r_Ujbor`X 로반어raUnahrbX나우아틀어rcUsamrdX사마리아 아랍어reUhairfX 하이다어rgUgmhrhX중세 고지 독일어riUcusrjX 쿠시어족rkUwenrlX 소르브어rmUadyrnX 아닥헤어roUelxrpX 엘람어rqUadarrX 아당메어rsUhawrtX 하와이어ruUbinrvX 비니어rwUbikrxX 비콜어ryUpt_BRrzX포르투갈어 (브라질)r{Umosr|X 모시어r}Umohr~X 모호크어rUtlrX타갈로그어rUzh_HansrX중국어(간체)rUzh_HantrX중국어 (번체)rUtvlrX 투발루어rUijorX 이조어rUkmbrX 킴분두어rUpeorX고대 페르시아어rUumbrX 윤번두어rUtmhrX 타마섹어rUfonrX폰어rUhsbrX고지 소르비아어rUberX벨로루시어rUbgrX불가리아어rUbarX바슈키르어rUpsrX파시토어 (푸시토)rUbmrX 밤바라어rUbnrX 벵골어rUborX 티베트어rUbhrX 비하르어rUbirX비슬라마어rUbrrX브르타뉴어rUbsrX보스니아어rUruprX아로마니아어rUzzarX 자자어rUomrX오로모어 (아판)rUojrX오지브웨이어rUacerX 아체어rUachrX 아콜리어rUocrX 오크어rUkrurX 쿠르크어rUsrrrX 세레르어rUkrorX 크루어rUkrlrX카렐리야어rUkrcrX카라챠이-발카르어rUndsrX저지 독일어rUosrX 오세트어rUorrX 오리야어rUsogrX소그디엔어rUnsorX소토어, 북부rUsonrX송가이족어rUde_CHrX고지 독일어 (스위스)rUvairX 바이어rUwakrX 와카샨어rUlolrX 몽구어rUmkhrX몬크메르어 (기타)rUlozrX 로지어rUgilrX키리바시어rUwasrX 와쇼어rUwarrX 와라이어rUhzrX 헤레로어rUhyrX아르메니아어rUanrX 아라곤어rUsidrX 시다모어rUhrrX크로아티아어rUhtrX 아이티어rUhurX 헝가리어rUhirX 힌디어rUhorX히리 모투어rUharX 하우사어rUbugrX 부기어rUherX 히브리어rUuzrX우즈베크어rUurrX 우르두어rUplrX 폴란드어rUukrX우크라이나어rUugrX 위구르어rUaarX 아파르어rUabrX 압카즈어rUaerX아베스타어r Uafr X남아공 공용어r Uakr X 아칸어r UamrX 암하라어rUnl_BErX 플라망어rUeurX 바스크어rUasrX 아샘어rUarrX 아랍어rUinhrX 인귀시어rUtpirX토크 피신어rUmynrX 마야어rUayrX아이마라어rUkhar X 카시어r!Uazr"X아제르바이잔어r#Uincr$X인도어 (기타)r%Unlr&X네덜란드어r'Unnr(X노르웨이어(뉴노시크)r)Unor*X노르웨이어r+Unar,X 나우루어r-Unbr.X보크말 노르웨이어r/Unair0X$북아메리카 인디언어(기타)r1Undr2X은데벨레어, 북부r3Uner4X 네팔어r5Ungr6X 느동가어r7Unyr8X니안자어; 치츄어; 츄어r9Unapr:X 나폴리어r;Ugrbr<X 게르보어r=Ugrcr>X%그리스어, 고대 (1453년 까지)r?Unrr@X은데벨레어, 남부rAUtigrBX 티그레어rCUnvrDX 나바호어rEUzunrFX 주니어rGUrwrHX 르완다어rIUcperJX>크리올어 및 피진어 (영어를 기반으로 한 기타)rKUcpfrLXD크리올어 및 피진어 (프랑스어를 기반으로 한 기타)rMUcpprNXG크리올어 및 피진어 (포르투갈어를 기반으로 한 기타)rOuU territoriesrP}rQ(UBDrRX방글라데시rSUBErTX 벨기에rUUBFrVX부르키나파소rWUBGrXX 불가리아rYUVErZX베네수엘라r[UBAr\X보스니아 헤르체고비나r]UBBr^X바베이도스r_UWFr`X왈리스-푸투나 제도raUBLrbX생 바르텔르미rcUBMrdX 버뮤다reUBNrfX 브루나이rgUBOrhX 볼리비아riUBHrjX 바레인rkUBIrlX 부룬디rmUBJrnX베냉roUBTrpX부탄rqU011rrX서아프리카rsUBVrtX부베ruUBWrvX 보츠와나rwU014rxX동부 아프리카ryU015rzX북부 아프리카r{UBRr|X 브라질r}U017r~X중부 아프리카rU018rX남부 아프리카rU019rX아메리카 대륙rUBYrX 벨라루스rUBZrX 벨리즈rULVrX 라트비아rURWrX 르완다rURSrX 세르비아rUTLrX 동티모르rURErX 리유니온rUTMrX투르크메니스탄rUOMrX오만rUTJrX타지키스탄rUROrX 루마니아rUTKrX 토켈라우rUGWrX 기네비쏘rUGUrX괌rUGTrX 과테말라rUGSrX.사우스조지아-사우스샌드위치제도rUGRrX 그리스rUGQrX 적도 기니rUGPrX 과달로프rUJPrX일본rUKIrX 키리바시rUGYrX 가이아나rUGGrX건지rUGFrX프랑스령 기아나rUGErX 그루지야rUGDrX 그레나다rU021rX북부 아메리카rUGBrX영국rUGArX가봉rUSVrX엘살바도르rUGNrX기니rUGMrX 감비아rUGLrX 그린란드rU029rX카리브 해 제도rUGIrX 지브롤터rUGHrX가나rUJErX저지rUTNrX 튀니지rUJMrX 자메이카rU013rX중앙 아메리카rUWSrX 사모아rU419rX,라틴 아메리카 및 카리브 해 제도rUHRrX크로아티아rUBSrX 바하마rUHTrX 아이티rUHUrX 헝가리rUHKrX홍콩, 중국 특별행정구rU039rX 남유럽rUHNrX 온두라스rUFIrX 핀란드rU142rX 아시아rU030rX 동아시아rU034rX 남아시아rU035rX동남 아시아rUPRrX푸에르토리코rUPSrX팔레스타인 지구rUFKrX포클랜드 군도rUIOrX영국령인도양식민지rUPWrX 팔라우rUPTrX 포르투갈rUSJrX스발바르제도-얀마웬섬rUMDrX 몰도바rUFMrX마이크로네시아rUIQrX 이라크rUPArX 파나마rUPFrX프랑스령 폴리네시아rUPGrX파푸아뉴기니r UPEr X페루r UPKr X 파키스탄r UPHrX 필리핀rUFOrX 페로제도rUPNrX 핏케언섬rUPLrX 폴란드rUPMrX세인트피에르-미케롱rUZMrX 잠비아rUEHrX 서사하라rURUrX 러시아rUEErX에스토니아rUEGr X 이집트r!UZAr"X남아프리카r#UECr$X 에콰도르r%UITr&X 이탈리아r'UVNr(X 베트남r)UZZr*X*알수없거나 유효하지 않은 지역r+USBr,X솔로몬 제도r-UETr.X이디오피아r/USOr0X 소말리아r1UZWr2X 짐바브웨r3USAr4X사우디아라비아r5UESr6X 스페인r7UERr8X에리트리아r9UMEr:X몬테네그로r;UAQr<X 남극 대륙r=UMGr>X마다가스카르r?UMFr@X 생 마르탱rAUMArBX 모로코rCUMCrDX 모나코rEUUZrFX우즈베키스탄rGUMMrHX 미얀마rIUMLrJX말리rKUMOrLX!마카오, 중국 특별행정구rMUMNrNX몽골rOUHMrPX허드섬-맥도널드제도rQUASrRX아메리칸 사모아rSUMKrTX마케도니아rUUMUrVX 모리셔스rWUMTrXX몰타rYUMWrZX 말라위r[UMVr\X 몰디브r]UMQr^X 말티니크r_UMPr`X북마리아나제도raUMSrbX몬트세라트rcUMRrdX 모리타니reUIMrfX맨 섬rgUUGrhX 우간다riUTZrjX 탄자니아rkUMYrlX말레이시아rmUMXrnX 멕시코roUILrpX 이스라엘rqUFRrrX 프랑스rsUAWrtX 아루바ruUDOrvX도미니카 공화국rwUSHrxX세인트헬레나ryUVCrzX세인트빈센트그레나딘r{U054r|X멜라네시아r}UDJr~X 지부티rUFJrX피지rU057rX미크로네시아 지역rU172rX독립 국가 연합rU053rX%오스트레일리아와 뉴질랜드rUNIrX 니카라과rUNLrX 네덜란드rUNOrX 노르웨이rUNArX 나미비아rUVUrX 바누아투rUNCrX뉴 칼레도니아rUNErX 니제르rUNFrX 노퍽섬rUNGrX나이지리아rUNZrX 뉴질랜드rUNPrX네팔rUNRrX 나우루rUNUrX 니우에rU061rX폴리네시아rUCIrX코트디부아르rUCHrX 스위스rUCOrX 콜롬비아rUCNrX중국rUCMrX 카메룬rUCLrX칠레rUCCrX코코스제도rUCArX 캐나다rUCGrX콩고rUCFrX중앙 아프리카 공화국rUCDrX콩고 민주공화국rUCZrX체코rUCYrX사이프러스rUCXrX크리스마스섬rUCSrX 세르비아 및 몬테네그로rUCRrX코스타리카rUPYrX 파라과이rUCVrX까뽀베르데rUCUrX쿠바rUSZrX스와질랜드rUSYrX 시리아rUKGrX키르기스스탄rUKErX케냐rUSRrX 수리남rU143rX중앙 아시아rUKHrX 캄보디아rUKNrX"세인트크리스토퍼 네비스rUKMrX 코모로스rUSTrX상투메 프린시페rUSKrX슬로바키아rUKRrX 대한민국rUSIrX슬로베니아rUKPrX$조선 민주주의 인민 공화국rUKWrX 쿠웨이트rUSNrX 세네갈rUSMrX 산마리노rUSLrX시에라리온rUSCrX 쉐이쉘rUKZrX카자흐스탄rUKYrX케이맨제도rUSGrX 싱가포르rUSErX 스웨덴rUSDrX수단rU151rX 동유럽rU150rX유럽rUDMrX 도미니카rU155rX 서유럽rU154rX 북유럽rUVGrX영국령 버진 아일랜드rUDErX독일rUYErX예멘r UMHr X 마샬 군도r U062r X중남 아시아r UDZrX 알제리rUUSrX미국rUUYrX 우루과이rUYTrX 마요티rUUMrX미국령 해외 제도rULBrX 레바논rULCrX세인트루시아rULArX 라오스rUTVrX 투발루rUTWr X대만r!UTTr"X트리니다드 토바고r#UTRr$X터키r%ULKr&X 스리랑카r'ULIr(X리히텐슈타인r)UCKr*X 쿡제도r+UTOr,X통가r-ULTr.X리투아니아r/ULUr0X룩셈부르크r1ULRr2X라이베리아r3ULSr4X 레소토r5UTHr6X태국r7UTFr8X프랑스 남부 지방r9UTGr:X토고r;UTDr<X차드r=UTCr>X터크스케이커스제도r?ULYr@X 리비아rAUVArBX 바티칸rCU145rDX 서아시아rEUAErFX아랍에미리트 연합rGUADrHX 안도라rIUAGrJX앤티가 바부다rKUAFrLX아프가니스탄rMUAIrNX 안길라rOUVIrPX미국령 버진 아일랜드rQUISrRX아이슬란드rSUIRrTX이란rUUAMrVX아르메니아rWUALrXX 알바니아rYUAOrZX 앙골라r[UANr\X네덜란드령 안틸레스r]U003r^X북아메리카r_U002r`X 아프리카raU001rbX세계rcUARrdX아르헨티나reUAUrfX오스트레일리아rgUATrhX오스트리아riU005rjX남아메리카[남미]rkUINrlX인도rmUAXrnX올란드 제도roU009rpX오세아니아, 대양주rqUAZrrX아제르바이잔rsUIErtX 아일랜드ruUIDrvX인도네시아rwUJOrxX 요르단ryUQUrzX 유럽 연합r{UUAr|X우크라이나r}UQAr~X 카타르rUDKrX 덴마크rUMZrX 모잠비크rUQOrX오세아니아 외곽ruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9X yyyy. M. d.rhYX%(yyyy)s. %(M)s. %(d)s.rubUfullrhU)r}r(h9Xyyyy년 M월 d일 EEEErhYX&%(yyyy)s년 %(M)s월 %(d)s일 %(EEEE)srubUlongrhU)r}r(h9Xyyyy년 M월 d일rhYX%(yyyy)s년 %(M)s월 %(d)s일rubUshortrhU)r}r(h9X yy. M. d.rhYX%(yy)s. %(M)s. %(d)s.rubuUcurrency_symbolsr}r(UCOPrXCol$rUTWDrXNT$rUFJDrXF$rUBZDrXBZ$rUDOPrXRD$rUFRFrX₣rUCYPrX£CrUBMDrXBM$rUAMDrX드램rUKRWrX₩rUCADrXCan$rUSGDrXS$rUHKDrXHK$rUAUDrXA$rUKPWrX₩rUIEPrXIR£rUBBDrXBDS$rUITLrX₤rUCNYrX¥rUGYDrXG$rUCLPrXCh$rUBNDrXB$rUALLrX레크rUINRrX0≤Rs.|1≤Re.|1sUAmerica/Danmarkshavnr?}r@jX덴마크샤븐rAsUAmerica/ScoresbysundrB}rCjX스코레스바이선드rDsUAmerica/EiruneperE}rFjX아이루네페rGsUAmerica/CaracasrH}rIjX 카라카스rJsU Asia/BaghdadrK}rLjX 바그다드rMsUAfrica/MonroviarN}rOjX 몬로비아rPsUAmerica/St_VincentrQ}rRjX세인트 빈센트rSsUAmerica/VancouverrT}rUjX 벤쿠버rVsU Asia/ThimphurW}rXjX팀부rYsU Africa/AccrarZ}r[jX 아크라r\sUAmerica/Belizer]}r^jX 벨리즈r_sUAmerica/Port_of_Spainr`}rajX포트오브스페인rbsUAmerica/Mendozarc}rdjX 멘도사resU Asia/Tokyorf}rgjX도쿄rhsUPacific/Kiritimatiri}rjjX키리티마티rksUAustralia/Sydneyrl}rmjX 시드니rnsU Europe/Rigaro}rpjX리가rqsU Asia/Dilirr}rsjX딜리rtsUAfrica/Mbabaneru}rvjX 음바바네rwsU Asia/Oralrx}ryjX오랄rzsU Asia/Adenr{}r|jX아덴r}sUEurope/Istanbulr~}rjX 이스탄불rsU Asia/Magadanr}rjX 마가단rsUAustralia/Lindemanr}rjX 린데만rsUPacific/Galapagosr}rjX갈라파고스rsUAmerica/Bogotar}rjX 보고타rsUAmerica/Dawsonr}rjX도슨rsUAmerica/Chicagor}rjX 시카고rsUPacific/Kwajaleinr}rjX 콰잘렌rsUAustralia/Broken_Hillr}rjX 브로컨힐rsUAmerica/Cuiabar}rjX 쿠이아바rsUIndian/Christmasr}rjX크리스마스rsU Asia/Jayapurar}rjX 자야푸라rsUEurope/Brusselsr}rjX 브뤼셀rsU Europe/Lisbonr}rjX 리스본rsUAsia/Chongqingr}rjX충칭rsUAmerica/Noronhar}rjX 노롱야rsUAfrica/Algiersr}rjX알제rsU Africa/Hararer}rjX 하라레rsUAfrica/Ndjamenar}rjX 엔자메나rsUAmerica/Costa_Ricar}rjX코스타리카rsUIndian/Mayotter}rjX 메요트rsUAsia/Phnom_Penhr}rjX 프놈펜rsUAmerica/Managuar}rjX 마나과rsU Asia/Bruneir}rjX 브루나이rsUAmerica/Tijuanar}rjX 티후아나rsUPacific/Fakaofor}rjX 파카오푸rsU America/Adakr}rjX 에이닥rsUAmerica/Antiguar}rjX 안티과rsUAmerica/Argentina/La_Riojar}rjX 라 리오하rsUPacific/Tahitir}rjX 타히티rsUAmerica/Pangnirtungr}rjX 팡니르퉁rsUAmerica/Asuncionr}rjX 아순시온rsU Europe/Viennar}rjX 비엔나rsUAustralia/Hobartr}rjX 호바트rsUAmerica/Juneaur}rjX주노rsUAmerica/Inuvikr}rjX 이누빅rsUAmerica/Montrealr}rjX 몬트리올rsU Asia/Seoulr}rjX서울rsU Indian/Comoror}rjX 코모로rsUAntarctica/Rotherar}rjX 로데라rsUEurope/Tallinnr}rjX탈린rsU Indian/Maher}rjX마헤rsUAmerica/Martiniquer}rjX 마티니크rsUAsia/Singaporer}rjX 싱가포르rsUAfrica/Nairobir}rjX 나이로비rsUAmerica/Maceior}rjX 마세이오rsU Asia/Urumqir}r jX 우루무치r sU Europe/Moscowr }r jX 모스크바r sUAsia/Pyongyangr}rjX평양rsUAsia/Ulaanbaatarr}rjX울란바토르rsUAmerica/Rainy_Riverr}rjX 레이니강rsUIndian/Maldivesr}rjX 몰디브rsU Asia/Colombor}rjX 콜롬보rsUAustralia/Adelaider}rjX애들레이드rsUAmerica/Cambridge_Bayr }r!jX케임브리지 베이r"sU Africa/Luandar#}r$jX 루안다r%sUPacific/Chathamr&}r'jX채텀r(sUAmerica/Indiana/Winamacr)}r*jX인디아나주, 워너맥r+sUAmerica/Cordobar,}r-jX 코르도바r.sU Asia/Tbilisir/}r0jX 트빌리시r1sUEurope/Gibraltarr2}r3jX 지브랄타r4sU Asia/Karachir5}r6jX 카라치r7sU Asia/Harbinr8}r9jX 하얼빈r:sUAustralia/Lord_Hower;}r<jX 로드 하우r=sUAmerica/Boa_Vistar>}r?jX보아 비스타r@sUAfrica/TripolirA}rBjX 트리폴리rCsUIndian/ReunionrD}rEjX불령 리유니온rFsUAtlantic/StanleyrG}rHjX 스탠리rIsUAmerica/Blanc-SablonrJ}rKjX블랑 사블롱rLsUAntarctica/SyowarM}rNjX쇼와rOsUAmerica/JamaicarP}rQjX 자메이카rRsU Europe/KievrS}rTjX 키예프rUsUEurope/BudapestrV}rWjX부다페스트rXsUPacific/MidwayrY}rZjX 미드웨이r[sUAmerica/Goose_Bayr\}r]jX 구즈베이r^sU Asia/Ammanr_}r`jX암만rasU Asia/Sakhalinrb}rcjX 사할린rdsUAfrica/Windhoekre}rfjX 빈트후크rgsU Asia/Katmandurh}rijX 카트만두rjsUAmerica/Guyanark}rljX 가이아나rmsUAmerica/Sao_Paulorn}rojX 상파울로rpsUAustralia/Perthrq}rrjX퍼스rssUAfrica/Djiboutirt}rujX 지부티rvsU Asia/Jakartarw}rxjX 자카르타rysUAntarctica/Palmerrz}r{jX파머r|sUAfrica/Johannesburgr}}r~jX요하네스버그rsU Asia/Irkutskr}rjX이르쿠츠크rsU Africa/Niameyr}rjX 니아메rsUAfrica/Casablancar}rjX카사블랑카rsUAmerica/Indiana/Marengor}rjX인디애나주, 마렝고rsUAfrica/Nouakchottr}rjX 누악쇼트rsUEurope/Vilniusr}rjX 빌니우스rsUAmerica/Cayenner}rjX 샤이엔rsUAfrica/Mogadishur}rjX 모가디슈rsUAmerica/Kentucky/Monticellor}rjX켄터키주, 몬티첼로rsUAmerica/Rio_Brancor}rjX리오 브랑코rsUAmerica/Cancunr}rjX칸쿤rsUAmerica/Havanar}rjX 하바나rsU Pacific/Guamr}rjX괌rsU Asia/Makassarr}rjX 마카사르rsUAtlantic/Azoresr}rjX 아조레스rsUAustralia/Euclar}rjX 유클라rsU Asia/Shanghair}rjX 상하이rsUAmerica/Rankin_Inletr}rjX 랭킹 인렛rsU Asia/Beirutr}rjX 베이루트rsU Africa/Maputor}rjX 마푸토rsU Asia/Bahrainr}rjX 바레인rsU Asia/Ashgabatr}rjX아쉬가바트rsU Asia/Riyadhr}rjX 리야드rsU Europe/Londonr}rjX런던rsUAmerica/Monterreyr}rjX 몬테레이rsUAmerica/Anguillar}rjX 앙귈라rsU Asia/Damascusr}rjX다마스쿠스rsUAmerica/North_Dakota/Centerr}rjX중부, 노스다코타rsUAmerica/Indiana/Vevayr}rjX 자포로제rsUAtlantic/St_Helenar}rjX세인트 헬레나rsUAmerica/Barbadosr}rjX바베이도스rsUAmerica/Indiana/Vincennesr}rjX인디아나주, 뱅센rsU Asia/Almatyr}rjX 알마티rsU Africa/Lomer}rjX로메rsUAfrica/Brazzaviller}rjX 브라자빌rsU America/Nomer}rjX놈rsU Asia/Taipeir}rjX 타이베이rsUAmerica/Yakutatr}rjX 야쿠타트rsUAmerica/Araguainar}rjX아라과이나rsU Europe/Vaduzr}rjX 파두츠rsU Africa/Asmerar}rjX 아스메라rsUAntarctica/Mawsonr}rjX모슨rsUAmerica/Buenos_Airesr}rjX부에노스 아이레스r sU Africa/Maserur }r jX 마세루r sUAmerica/Louisviller }r jX 루이빌r sU Asia/Kuchingr }r jX쿠칭r sUAfrica/Libreviller }r jX 리브르빌r sUAfrica/Freetownr }r jX 프리타운r sU Africa/Bissaur }r jX 비사우r sU Europe/Samarar }r jX 사마라r sUEurope/Amsterdamr }r jX 암스텔담r sU Europe/Tiraner }r jX 티라나r sUPacific/Saipanr }r jX 사이판r sUAfrica/Abidjanr }r jX 아비장r! sUEurope/Zaporozhyer" }r# jX자포로지예r$ sUAmerica/El_Salvadorr% }r& jX엘살바도르r' sU Europe/Madridr( }r) jX 마드리드r* sUAmerica/Santiagor+ }r, jX 산티아고r- sUAmerica/Argentina/San_Luisr. }r/ jX 산루이스r0 sU America/Arubar1 }r2 jX 아루바r3 sUAmerica/Indianapolisr4 }r5 jX인디애나폴리스r6 sUAmerica/Reginar7 }r8 jX 리자이나r9 sU Pacific/Trukr: }r; jX 트루크r< sUPacific/Funafutir= }r> jX 푸나푸티r? sUAmerica/Meridar@ }rA jX 메리다rB sUAmerica/GuatemalarC }rD jX 과테말라rE sUAfrica/Sao_TomerF }rG jX 사오 투메rH sUPacific/KosraerI }rJ jX 코스레rK sUAfrica/BujumburarL }rM jX 부줌부라rN sUEurope/ChisinaurO }rP jX 키시나우rQ sU Europe/WarsawrR }rS jX 바르샤바rT sUAsia/YekaterinburgrU }rV jX예카테린부르크rW sUAntarctica/CaseyrX }rY jX 케이시rZ sUAmerica/Halifaxr[ }r\ jX 핼리팩스r] sU America/Thuler^ }r_ jX툴레r` sUAmerica/St_Johnsra }rb jX St. Johnsrc sUAmerica/Monctonrd }re jX몽턴rf sUEurope/Helsinkirg }rh jX 헬싱키ri sUAtlantic/Cape_Verderj }rk jX카보 베르데rl sU Indian/Cocosrm }rn jX 코코스ro sU America/Boiserp }rq jX 보이시rr sUAmerica/Guadeloupers }rt jX 과델로프ru sUAmerica/Nassaurv }rw jX나소rx sUPacific/Enderburyry }rz jX 엔더베리r{ sU Asia/Hovdr| }r} jX 호브드r~ sUAmerica/Manausr }r jX 마나우스r sUAmerica/Godthabr }r jX 고드호프r sUAmerica/Catamarcar }r jX카타마르카r sUAmerica/Chihuahuar }r jX 치와와r sUAmerica/Iqaluitr }r jX이칼루이트r sUAmerica/Argentina/Rio_Gallegosr }r jX리오 가예고스r sUPacific/Gambierr }r jX 감비어r sUEurope/Volgogradr }r jX볼고그라트r sU Africa/Bamakor }r jX 바마코r sUEurope/Uzhgorodr }r jX우주고로트r sU Africa/Banjulr }r jX반줄r sU Asia/Aqtaur }r jX 아크타우r sU Africa/Malabor }r jX 말라보r sUAtlantic/Madeirar }r jX 마데이라r sUPacific/Noumear }r jX 누메아r sUAfrica/Kinshasar }r jX 킨샤사r sU Europe/Maltar }r jX몰타r sUAmerica/Argentina/Ushuaiar }r jX우수아이아r sU Asia/Bangkokr }r jX방콕r sU Pacific/Niuer }r jX 니우에r sUAustralia/Brisbaner }r jX브리스베인r sUAmerica/Recifer }r jX 레시페r sU Asia/Yerevanr }r jX 예레반r sUAmerica/La_Pazr }r jX 라파스r sU Africa/Cairor }r jX 카이로r sU Africa/Lusakar }r jX 루사카r sUPacific/Guadalcanalr }r jX 과달카날r sUAmerica/Yellowknifer }r jX옐로나이프r sUAsia/Vientianer }r jX 비엔티안r sUEurope/Kaliningradr }r jX칼리닌그라드r sUAfrica/Conakryr }r jX 코나크리r sUAmerica/Argentina/Tucumanr }r jX 뚜꾸만r sU Europe/Oslor }r jX 오슬로r sUAmerica/St_Kittsr }r jX세인트 키츠r sUAmerica/Panamar }r jX 파나마r sUAfrica/Gaboroner }r jX 가보로네r sU Pacific/Palaur }r jX 팔라우r sUAmerica/Guayaquilr }r jX 과야킬r sUAsia/Kuala_Lumpurr }r jX쿠알라룸푸르r sUAtlantic/Faeroer }r jX페로r sUAmerica/Menomineer }r jX 메노미니r sUAsia/Kamchatkar }r jX 캄차카r sUAsia/Vladivostokr }r jX블라디보스토크r sU Asia/Qatarr }r jX 카타르r sU Asia/Dubair }r jX 두바이r sU Asia/Yakutskr }r jX 야쿠츠크r sU Asia/Omskr }r jX 옴스크r sU Africa/Banguir }r jX방기r sUAmerica/Paramaribor }r jX파라마리보r sUAfrica/Lubumbashir }r jX 루붐바시r sUPacific/Marquesasr }r jX 마퀘사스r sU Asia/Anadyrr }r jX 아나디리r sUAmerica/New_Yorkr }r jX뉴욕r sUPacific/Norfolkr }r jX노퍽r sUPacific/Rarotongar! }r" jX 라로통가r# sUAmerica/Dominicar$ }r% jX 도미니카r& sUAfrica/Porto-Novor' }r( jX포르토노보r) sUAsia/Samarkandr* }r+ jX사마르칸트r, sU Asia/Dushanber- }r. jX 두샨베r/ sUAmerica/Torontor0 }r1 jX 토론토r2 sU America/Bahiar3 }r4 jX 바히아r5 sUAfrica/Kampalar6 }r7 jX 캄팔라r8 sUAfrica/Ouagadougour9 }r: jX 와가두구r; sUAntarctica/South_Poler< }r= jX남극r> sU Asia/Muscatr? }r@ jX 무스카트rA sUAmerica/EdmontonrB }rC jX 에드먼턴rD sU Pacific/WakerE }rF jX 웨이크rG sUAmerica/Indiana/Tell_CityrH }rI jX인디아나주, 텔시티rJ sUAustralia/DarwinrK }rL jX다윈rM sUAmerica/WhitehorserN }rO jX화이트호스rP sUAmerica/Swift_CurrentrQ }rR jX스위프트커런트rS sUEurope/CopenhagenrT }rU jX 코펜하겐rV sUAmerica/MontserratrW }rX jX 몬세라rY sU Asia/TashkentrZ }r[ jX 타슈켄트r\ sUEurope/Simferopolr] }r^ jX 심페로폴r_ sUAfrica/Blantyrer` }ra jX블랜타이어rb sUAmerica/Detroitrc }rd jX디트로이트re sUAmerica/Shiprockrf }rg jX십록rh sUAmerica/Grenadari }rj jX 그라나다rk sUAmerica/Indiana/Petersburgrl }rm jX인디애나주, 피츠버그rn sUAsia/Pontianakro }rp jX폰티아나크rq sUAfrica/Dar_es_Salaamrr }rs jX다르에스살람rt sUAmerica/Port-au-Princeru }rv jX포르토프랭스rw sUAmerica/Caymanrx }ry jX 카이만rz sU Europe/Athensr{ }r| jX 아테네r} sUAmerica/Curacaor~ }r jX 쿠라사오r sUIndian/Kerguelenr }r jX 케르켈렌r sUAfrica/Khartoumr }r jX 카르툼r sU Asia/Manilar }r jX 마닐라r sUAmerica/Santo_Domingor }r jX산토도밍고r sU America/Jujuyr }r jX 후후이r sU Africa/Doualar }r jX 두알라r sU Europe/Romer }r jX로마r sUAmerica/Argentina/San_Juanr }r jX 산후안r sUAmerica/North_Dakota/New_Salemr }r jX노스 다코타주, 뉴살렘r sUPacific/Port_Moresbyr }r jX포트모르즈비r sUEurope/Andorrar }r jX 안도라r sUEurope/Luxembourgr }r jX룩셈부르크r sUPacific/Honolulur }r jX 호놀룰루r sUAmerica/St_Thomasr }r jX세인트 토마스r sUPacific/Majuror }r jX 마주로r sUAmerica/Mazatlanr }r jX 마사틀란r sU Asia/Macaur }r jX 마카오r sUAsia/Choibalsanr }r jX 초이발산r sUAntarctica/McMurdor }r jX 맥머도r sUAmerica/Thunder_Bayr }r jX 선더베이r sUAmerica/Los_Angelesr }r jX로스앤젤레스r sU Asia/Kabulr }r jX카불r sUIndian/Antananarivor }r jX안타나나리보r sUAtlantic/Reykjavikr }r jX레이캬비크r sU Asia/Nicosiar }r jX 니코시아r sUPacific/Ponaper }r jX 포나페r sUPacific/Tongatapur }r jX 통가타푸r sUPacific/Pitcairnr }r jX피트카이른r sUPacific/Easterr }r jX 이스터 섬r sUAtlantic/South_Georgiar }r jX남부 조지아r sUAfrica/El_Aaiunr }r jX 엘아이운r sUAmerica/Campo_Grander }r jX캄포 그란데r sUAmerica/Dawson_Creekr }r jX 도슨크릭r sUAntarctica/Vostokr }r jX 보스토크r sUEurope/Bucharestr }r jX부쿠레슈티r sUAmerica/Porto_Velhor }r jX포르토 벨로r sU Europe/Monacor }r jX 모나코r sU Asia/Bishkekr }r jX 비슈케크r sU Africa/Ceutar }r jX 세우타r sUAmerica/Winnipegr }r jX 위니펙r sU Asia/Aqtober }r jX 악토브r sU Africa/Dakarr }r jX 다카르r sUAmerica/Fortalezar }r jX포르탈레자r sUPacific/Tarawar }r jX 타라와r sUAfrica/Addis_Ababar }r jX아디스아바바r sU Pacific/Efater }r jX 에파테r sUPacific/Johnstonr }r jX 존스톤r sUAsia/Qyzylordar }r jX키질로르다r sUAsia/Jerusalemr }r jX 예루살렘r sUPacific/Aucklandr }r jX 오클랜드r sUAmerica/Tortolar }r jX 토르톨라r sUAmerica/Denverr }r jX덴버r sU Indian/Chagosr }r jX 차고스r sUAmerica/Glace_Bayr }r! jX글라스베이r" sUAmerica/Hermosillor# }r$ jX에르모시요r% sU Africa/Tunisr& }r' jX 튀니스r( sUAmerica/Montevideor) }r* jX몬테비데오r+ sUAmerica/Resoluter, }r- jX 리졸루트r. sU Asia/Gazar/ }r0 jX가자r1 sU Europe/Dublinr2 }r3 jX 더블린r4 sUAntarctica/DumontDUrviller5 }r6 jX뒤몽 뒤르빌r7 sUAmerica/Indiana/Knoxr8 }r9 jX인디애나주 녹스r: sUAsia/Novosibirskr; }r< jX노보시비르스크r= sU Africa/Kigalir> }r? jX 키갈리r@ sUAmerica/Grand_TurkrA }rB jX그랜드 터크rC sU Africa/LagosrD }rE jX 라고스rF sU Europe/SofiarG }rH jX 소피아rI sU America/LimarJ }rK jX리마rL sU Etc/UnknownrM }rN jX알 수 없는 장소rO sUAmerica/AnchoragerP }rQ jX 앵커리지rR sU Pacific/NaururS }rT jX 나우루rU suUscriptsrV }rW (UGururX X구르무키 문자rY UHebrrZ X 히브리어r[ UZzzzr\ X"기록되지 않은 문자(구전)r] UPhnxr^ X페니키아 문자r_ UChamr` X 칸 고어ra UArabrb X 아랍 문자rc UGujrrd X구쟈라티 문자re UZxxxrf X구전rg ULycirh X 리키아어ri USinhrj X 신할라어rk UTalurl X신 타이 루에rm UMongrn X 몽골어ro UXpeorp X고대 페르시아 문자rq UVisprr X 시화법rs URjngrt X 레장 문자ru UOlckrv X올 치키 문자rw UTalerx X 타이 레어ry UMandrz X 만데아어r{ UMlymr| X말라얄람어r} UTibtr~ X 티벳어r UKalir X카야 리 문자r UJpanr X 일본 문자r UVaiir X 바이어r UKanar X 가타카나r ULydir X 리디아어r ULepcr X 렙차문자r USundr X 순다 문자r UYiiir X이어r UJavar X 자바 문자r UOryar X 오리야어r ULaoor X 라오어r UUgarr X 우가릿어r UCyrlr X 키릴 문자r UArmnr X아르메니아 문자r UCyrsr X%고대교회슬라브어 키릴문자r UKhmrr X 크메르어r USylor X실헤티 나가리r UItalr X고이탈리아어r USgnwr X 수화 문자r UXsuxr X#수메르-아카드어 설형문자r UThaar X 타나어r UThair X 태국어r UCprtr X키프로스 문자r ULinbr X선형 문자 Br ULinar X선형 문자 Ar UOsmar X오스만야어r USaurr X사우라슈트라 문자r UHirar X 히라카나r UHanir X한자r UEgydr X고대 이집트 민중문자r UEgyhr X고대 이집트 신관문자r UCansr X통합 캐나다 토착어r UEgypr X고대 이집트 신성문자r UTfngr X 티피나그r UShawr X 샤비안어r UCirtr X 키르쓰r UGeorr X그루지야 문자r UTengr X 텡과르r UHrktr X가나r UPlrdr X폴라드 표음 문자r UOgamr X 오검 문자r UDsrtr X디저렛 문자r UGothr X 고트 문자r UHanor X 하누누어r UBalir X 발리 문자r UKorer X 한국어r UHangr X한글r UCarir X 카리 문자r UTagbr X 타반와어r UHansr X중국어 간체r UHantr X중국어 번체r URoror X 롱고롱고r UDevar X데바나가리r UIndsr X인더스 문자r UBopor X 주음부호r UMymrr X 미얀마어r UTglgr X타갈로그어r UPermr X고대 페름어r UBugir X 부기 문자r UPhagr X파스파 문자r UBrair X브라유 점자r UBrahr X 브라미r UBatkr X바타크 문자r UMeror X메로에 문자r ULimbr X 림부어r UTelur X 탤루그어r UTamlr X 타밀어r USarar X 사라티r ULatgr X아일랜드식 로마자r ULatfr X독일식 로마자r UKharr X 카로슈티r UNkoor X 응코 문자r ULatnr X 라틴어r UMayar X마야 상형 문자r ULanar X 란나 문자r UEthir X에티오피아 문자r UHmngr X파하우 몽 문자r UBuhdr X부히드 문자r UCoptr X 콥트 문자r UGlagr X글라골 문자r URunrr X 룬 문자r! UOrkhr" X 오르혼어r# UHungr$ X고대 헝가리 문자r% UGrekr& X그리스 문자r' UCherr( X체로키 문자r) UZyyyr* X 일반 문자r+ USyrcr, X 시리아어r- UBlisr. X블리스기호 문자r/ UBengr0 X 벵골 문자r1 USyrer2 X&에스트랑겔로식 시리아 문자r3 USyrjr4 X서부 시리아 문자r5 USyrnr6 X동부 시리아 문자r7 UKndar8 X 칸나다r9 uUvariantsr: }r; (UNEDISr< X나티소네 방언r= UBAKU1926r> X$통합 투르크어 라틴 알파벳r? UREVISEDr@ X개정rA UNJIVArB X 니바 방언rC U1994rD X표준 레지아어 철자법rE U1996rF X독일어 철자법 (1996년)rG UBOONTrH X 분틀링어rI USCOTLANDrJ X스코틀랜드 표준 영어rK USCOUSErL X스카우스어rM U1606NICTrN X후기 중세 프랑스어rO UFONIPArP XIPA 음성기호rQ UAREVELArR X동아르메니아어rS UPOSIXrT X컴퓨터 (POSIX)rU UROZAJrV X 레지아어rW UFONUPArX X UPA 음성어rY UBISKErZ X산조르지오/빌라 방언r[ UVALENCIAr\ X발렌시아어r] USAAHOr^ X 사호어r_ U1901r` X$전통 독일어 철자법 (1901년)ra uUnumber_symbolsrb }rc (Ugrouprd X,re UnativeZeroDigitrf X0rg U exponentialrh XEri UperMillerj X‰rk Unanrl XNaNrm Udecimalrn X.ro U percentSignrp hFUlistrq X;rr U patternDigitrs X#rt UplusSignru X+rv Uinfinityrw X∞rx U minusSignry h UOMRr? X 오만 리얄r@ ULSLrA X레소토 로티rB ULSMrC X로티rD UMNTrE X몽골 투그릭rF jX아르메니아 드람rG UYUDrH X#유고슬라비아 동전 디나르rI UBUKrJ X 버마 차트rK USYPrL X시리아 파운드rM UQARrN X카타르 리얄rO UXDRrP X특별인출권rQ UNLGrR X네델란드 길더rS UGEKrT X그루지야 지폐 라리트rU UMTPrV X몰타 파운드rW UGBPrX X영국령 파운드 스털링rY UGELrZ X그루지야 라리r[ USHPr\ X세인트헬레나 파운드r] UAFNr^ X 아프가니r_ USBDr` X솔로몬 제도 달러ra UCSKrb X&체코슬로바키아 동전 코루나rc jX(조선 민주주의 인민 공화국 원rd UXREre X RINET 기금rf UCSDrg X고 세르비아 디나르rh UAFAri X아프가니 (1927-2002)rj UTHBrk X 태국 바트rl UTRYrm X새로운 터키 리라rn UBDTro X방글라데시 타카rp UGRDrq X그리스 드라크마rr UYERrs X 예멘 리알rt UDDMru X동독 오스트마르크rv USZLrw X스와질란드 릴랑게니rx UHTGry X하이티 구르드rz UXOFr{ XCFA 프랑 BCEAOr| UMGAr} X마다가스카르 아리아리r~ UANGr X#네덜란드령 안틸레스 길더r ULRDr X라이베리아 달러r URWFr X르완다 프랑r UNOKr X노르웨이 크로네r UMXVr X"멕시코 UDI(Unidad de Inversion)r UKESr X 케냐 실링r UMOPr X마카오 파타카r jX 인도 루피r UMXNr X멕시코 페소r UCZKr X체코 공화국 코루나r UTJSr X타지키스탄 소모니r UTJRr X타지키스탄 루블r UBTNr X부탄 눌투눔r UYDDr X예멘 디나르r UGWEr X#포르투갈령 기니 에스쿠도r jX콜롬비아 페소r UMTLr X 몰타 리라r UMURr X모리셔스 루피r UIDRr X인도네시아 루피아r UHNLr X온두라스 렘피라r UXPFr X CFP 프랑r jX 피지 달러r UETBr X이디오피아 비르r UPENr X페루 솔 누에보r jX벨리즈 달러r UATSr X 호주 실링r UILPr X이스라엘 파운드r UZRNr X자이르 신권 자이르r jX도미니카 페소r ULULr X룩셈부르크 재정 프랑r UTMMr X투르크메니스탄 마나트r jX대만 신권 달러r UMDLr X몰도바 레이r UXPTr X백금r UECSr X에쿠아도르 수크레r UBSDr X바하마 달러r USEKr X스웨덴 크로나r UPEIr X 페루 인티r UZMKr X쟘비아 콰쳐r UMVRr X몰디브 제도 루피아r UXTSr X테스트 통화 코드r jX 호주 달러r UADPr X안도라 페세타r UCUPr X 쿠바 페소r jX아일랜드 파운드r UCHWr X WIR 프랑r jX바베이도스 달러r jX대한민국 원r UGMDr X감비아 달라시r UGTQr X과테말라 케트살r UVEBr X베네주엘라 볼리바르r USITr X슬로베니아 톨라르r USDPr X수단 파운드r jX 칠레 페소r UEURr X 유로화r UCDFr X콩고 프랑 콩골라스r UXCDr X동카리브 달러r UKZTr X카자흐스탄 텐게r URUBr X러시아 루블r UXFUr X프랑스 UIC-프랑r UXAGr X은화r UBRRr X브라질 크루제이루r UBRNr X브라질 크루자두 노보r UBRLr X브라질 레알r UMMKr X미얀마 키얏r UUYPr X우루과이 페소 (1975-1993)r URURr X러시아 루블 (1991-1998)r UPLNr X폴란드 즐로티r UBREr X%브라질 크루제이루 (1990-1993)r UPYGr X파라과이 과라니r UBRCrX브라질 크루자두rUBRBrX2볼리비아노 크루제이루 노보 (1967-1986)rUSVCrX엘살바도르 콜론rUAEDrX아랍에미리트 디르함rUGNSrX 기니 시리r UMKDr X마케도니아 디나르r UAZMr X아제르바이젠 마나트r UAZNrX아제르바이잔 마나트rUUSNrX미국 달러(다음날)rUTOPrX통가 파앙가rUVUVrX바누아투 바투rUBADrX)보스니아-헤르체고비나 디나르rUGNFrX 기니 프랑rUMXPrX#멕시코 실버 페소 (1861-1992)rUIQDrX이라크 디나르rUERNrX에리트리아 나크파rUBAMr X0보스니아-헤르체고비나 태환 마르크r!USCRr"X세이쉴 루피r#jX캐나다 달러r$USDDr%X수단 디나르r&jX싸이프러스 파운드r'UMADr(X모로코 디렘r)UKWDr*X쿠웨이트 디나르r+UBIFr,X부룬디 프랑r-ULTTr.X룩셈부르크 타로나r/UPGKr0X파푸아뉴기니 키나r1ULTLr2X리투아니아 리타r3jX싱가폴 달러r4UUZSr5X우즈베키스탄 숨r6USTDr7X 상투메 프린시페 도브라r8UXFOr9X프랑스 Gold 프랑r:UMLFr;X 말리 프랑r<UESPr=X스페인 페세타r>UIRRr?X 이란 리얄r@UZRZrAX자이르 자이르rBjX중국 위안 인민폐rCUSLLrDX시에라리온 리온rEUTNDrFX튀니지 디나르rGjX가이아나 달러rHUESBrIX"스페인 페세타(변환 예금)rJUESArKX스페인 페세타(예금)rLUNZDrMX뉴질랜드 달러rNUFKPrOX포클랜드제도 파운드rPULVLrQX라트비아 라트rRUUSSrSX미국 달러(당일)rTUUSDrUX 미국 달러rVUARPrWX"아르헨티나 페소 (1983-1985)rXUKGSrYX키르기스스탄 솜rZUARSr[X아르헨티나 페소r\UILSr]X이스라엘 신권 세켈r^URONr_X루마니아 레우r`URSDraX세르비아 디나르rbUBHDrcX바레인 디나르rdjX 일본 엔reUARArfX아르헨티나 오스트랄rgUPTErhX포르투갈 에스쿠도riUXAUrjX금rkuUmonthsrl}rm(U stand-alonern}ro(Uwiderp}rq(KX1월rrKX2월rsKX3월rtKX4월ruKX5월rvKX6월rwKX7월rxKX8월ryK X9월rzK X10월r{K X11월r|K X12월r}uU abbreviatedr~}r(KX1월rKX2월rKX3월rKX4월rKX5월rKX6월rKX7월rKX8월rK X9월rK X10월rK X11월rK X12월ruUnarrowr}r(KX1월rKX2월rKX3월rKX4월rKX5월rKX6월rKX7월rKX8월rK X9월rK X10월rK X11월rK X12월ruuUformatr}r(Uwider}r(KX1월rKX2월rKX3월rKX4월rKX5월rKX6월rKX7월rKX8월rK X9월rK X10월rK X11월rK X12월ruU abbreviatedr}r(KX1월rKX2월rKX3월rKX4월rKX5월rKX6월rKX7월rKX8월rK X9월rK X10월rK X11월rK X12월ruuuUcurrency_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X ¤#,##0.00rh;X¤rX-¤rrh>Nh?KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KX월rKX화rKX수rKX목rKX금rKX토rKX일rusUformatr}r(Uwider}r(KX 월요일rKX 화요일rKX 수요일rKX 목요일rKX 금요일rKX 토요일rKX 일요일ruU abbreviatedr}r(KX월rKX화rKX수rKX목rKX금rKX토rKX일ruuuU meta_zonesr}r(U Goose_Bayr}rUcommonrsU Kuybyshevr}rjsURotherar}r(jUlongr}rUstandardrX로데라 표준시rsuUArabianr}r(Ushortr}r(UgenericrXAT(아라비아)rUdaylightrXADT(아라비아)rjXAST(아라비아)rujj}r(jX아라비아 시간rjX아라비아 하계 표준시rjX아라비아 표준시ruuUAustralia_Easternr}r(jj}r(jX#동부 오스트레일리아 시간rjX-오스트레일리아 동부 하계 표준시rjX&오스트레일리아 동부 표준시ruuU Argentinar}rjsUBoliviar}rjsU Turkmenistanr }r jsU Alaska_Hawaiir }r jsU Cape_Verder }r(jj}r(jX!카보 베르데 하계 표준시rjX카보 베르데 표준시ruuUAzoresr}r(jj}r(jX아조레스 하계 표준시rjX아조레스 표준시ruuUPierre_Miquelonr}rjsUEurope_Centralr}r(jj}r(jX중부유럽 하계 표준시rjX중부유럽 표준시ruuUTrukr}rjsU Aktyubinskr }r!jsUBeringr"}r#jsU Qyzylordar$}r%jsUKazakhstan_Easternr&}r'jsUFrunzer(}r)jsU Dutch_Guianar*}r+jsUYerevanr,}r-jsU Kamchatkar.}r/jsULiberiar0}r1jsUKashgarr2}r3jsUMaldivesr4}r5(jj}r6jX몰디브 표준시r7suUNorfolkr8}r9jsU Dominicanr:}r;jsUAfrica_Easternr<}r=(jj}r>jX동아프리카 시간r?suU Ashkhabadr@}rAjsUAlaskarB}rC(jj}rD(jX알래스카 하계 표준시rEjX알래스카 표준시rFuuUAmerica_EasternrG}rH(jj}rI(jX동부 표준시rJjX미 동부 하계 표준시rKjX동부 표준시rLuuU YekaterinburgrM}rNjsUSolomonrO}rPjsU KrasnoyarskrQ}rRjsUAmerica_CentralrS}rT(jj}rU(jX중부 표준시rVjX미 중부 하계 표준시rWjX중부 표준시rXuuUMawsonrY}rZ(jj}r[jX모슨 표준시r\suUPakistanr]}r^jsUChathamr_}r`(jj}ra(jX채텀 하계 표준시rbjX채텀 표준시rcuuUSamoard}rejsUMacaurf}rgjsUChamorrorh}ri(jj}rj(jX차모로 시간rkjX차모로 표준시rluuUGuamrm}rnjsUIndiaro}rp(jj}rqjX인도 표준시rrsuU Azerbaijanrs}rtjsU Marquesasru}rvjsU Tajikistanrw}rxjsUPitcairnry}rzjsUTurkeyr{}r|jsU Afghanistanr}}r~jsU Choibalsanr}rjsU Vladivostokr}rjsU Shevchenkor}rjsU Bangladeshr}rjsUGulfr}rjsUDaccar}rjsUMongoliar}rjsU Samarkandr}rjsUWaker}rjsUPerur}rjsUVanuatur}rjsUIndonesia_Centralr}r(jj}rjX중앙인도네시아 시간rsuUNaurur}rjsUFalklandr}r(jj}r(jX포클랜드 하계 표준시rjX포클랜드 표준시ruuUKorear}r(jj}r(jX한국 하계 표준시rjX한국 표준시ruuUCubar}rjsUIrkutskr}rjsUArgentina_Westernr}rjsUAmazonr}r(jj}r(jX아마존 하계 표준시rjX아마존 표준시ruuUChinar}r(j}rjX CST (중국)rsjj}r(jX중국 하계 표준시rjX중국 표준시ruuULong_Shur}rjsUArmeniar}rjsUCookr}r(jj}r(jX쿡제도 하계 표준시rjX쿡제도 표준시ruuUAfrica_FarWesternr}rjsUGreenland_Westernr}rjsUKarachir}rjsUTongar}rjsUSakhalinr}rjsUBrasiliar}r(jj}r(jX 브라질리아 하계 표준시rjX브라질리아 표준시ruuUSyowar}r(jj}rjX쇼와 표준시rsuU French_Guianar}rjsUFrench_Southernr}r(jj}rjX&프랑스령 남쪽식민지 표준시rsuU Mauritiusr}r(jj}rjX모리셔스 표준시rsuUAfrica_Southernr}r(jj}r(jX남아프리카 시간rjX남아프리카 표준시ruuUGambierr}rjsUDavisr}r(jj}rjX데이비스 표준시rsuU Newfoundlandr}r(jj}r(jX 뉴펀들랜드 하계 표준시rjX뉴펀들랜드 표준시ruuUCocosr}r(jj}rjX코코스섬 표준시rsuU Kyrgystanr}rjsUTokelaur}rjsUAustralia_Westernr}r(jj}r(jX#서부 오스트레일리아 시간rjX-오스트레일리아 서부 하계 표준시rjX&오스트레일리아 서부 표준시ruuUBakur}rjsUAfrica_Centralr}r(jj}rjX중앙아프리카 시간rsuU Line_Islandsr}rjsU Novosibirskr}rjsUJapanr}r(jj}r(jX일본 하계 표준시rjX일본 표준시r uuU Sverdlovskr }r jsU New_Caledoniar }r jsU Kwajaleinr}rjsUAqtober}rjsUGilbert_Islandsr}rjsUAustralia_CentralWesternr}r(jj}r(jX&오스트레일리아 중서부 시간rjX0오스트레일리아 중서부 하계 표준시rjX)오스트레일리아 중서부 표준시ruuU Indochinar}r(jj}rjX인도차이나 시간rsuUPapua_New_Guinear}rjsUHovdr }r!jsU South_Georgiar"}r#(j}r$jXGST (사우스 조지아)r%sjj}r&jX사우스 조지아 표준시r'suUEcuadorr(}r)jsUMalayar*}r+jsUIranr,}r-jsUAqtaur.}r/jsU Indian_Oceanr0}r1(jj}r2jX'영국령 인도양 식민지 표준시r3suUTuvalur4}r5jsUAmerica_Mountainr6}r7(jj}r8(jX산지 표준시r9jX미 산지 하계 표준시r:jX산악 표준시r;uuUHawaii_Aleutianr<}r=jsUChangbair>}r?jsUChiler@}rAjsUWallisrB}rCjsUKosraerD}rEjsUDushanberF}rGjsUGeorgiarH}rIjsUAnadyrrJ}rKjsU PhilippinesrL}rMjsUYakutskrN}rOjsUIndonesia_WesternrP}rQ(jj}rRjX서인도네시아 시간rSsuUGreenland_EasternrT}rUjsUOralrV}rWjsUGMTrX}rY(jj}rZjX그리니치 표준시r[suUMarshall_Islandsr\}r]jsUIrishr^}r_jsU Seychellesr`}ra(jj}rbjX세이셸 표준시rcsuUUruguayrd}rejsUVostokrf}rg(jj}rhjX모스토크 표준시risuU Uzbekistanrj}rkjsUColombiarl}rmjsUReunionrn}ro(jj}rpjX리유니온 표준시rqsuU Volgogradrr}rsjsU Kizilordart}rujsUFijirv}rw(jj}rx(jX피지 하계 표준시ryjX피지 표준시rzuuUAmerica_Pacificr{}r|(jj}r}(jX태평양 표준시r~jX미 태평양 하계 표준시rjX태평양 표준시ruuUKazakhstan_Westernr}rjsUPalaur}rjsUEurope_Easternr}r(jj}r(jX동부 유럽 서머타임rjX동부유럽 표준시ruuUBhutanr}rjsUBorneor}rjsUNepalr}rjsU Galapagosr}r(jj}rjX갈라파고스 표준시rsuU Lord_Hower}r(jj}r(jX로드 하우 시간rjX로드 하우 하계 표준시rjX로드 하우 표준시ruuUPhoenix_Islandsr}rjsUSurinamer}rjsUAcrer}r(j}r(jXACST (아크레)rjXACT (아크레)rujj}r(jX아크레 하계 표준시rjX아크레 표준시ruuUEasterr}r(jj}r(jX이스터섬 하계 표준시rjX이스터섬 표준시ruuU Christmasr}r(jj}rjX크리스마스섬 표준시rsuU East_Timorr}rjsUIsraelr}r(j}rjXISTrsjj}r(jX이스라엘 하계 표준시rjX이스라엘 표준시ruuUAfrica_Westernr}r(jj}r(jX 서아프리카 하계 표준시rjX서아프리카 시간ruuUTashkentr}rjsUMalaysiar}rjsUNoronhar}rjsU Venezuelar}rjsUPonaper}rjsUIndonesia_Easternr}r(jj}rjX동인도네시아 시간rsuUOmskr}rjsUAustralia_Centralr}r(jj}r(jX#중앙 오스트레일리아 시간rjX-오스트레일리아 중부 하계 표준시rjX&오스트레일리아 중부 표준시ruuUAtlanticr}r(jj}r(jX대서양 표준시rjX미 대서양 하계 표준시rjX대서양 표준시ruuU North_Marianar}rjsULankar}rjsUDumontDUrviller}r(jj}rjX뒤몽 뒤르빌 표준시rsuUEurope_Westernr}r(jj}r(jX서부 유럽 서머타임rjX서부 유럽 시간ruuU New_Zealandr}r(jj}r(jX뉴질랜드 시간rjX뉴질랜드 하계 표준시rjX뉴질랜드 표준시ruuUBritishr}rjsUUrumqir}rjsU Hong_Kongr}r(jj}r(jX홍콩 하계 표준시rjX 홍콩 시간ruuUGuyanar}rjsUMagadanr}rjsUAlmatyr}rjsUTbilisir}rjsUMyanmarr}rjsU Singaporer}rjsUSamarar}rjsUGreenland_Centralr}rjsUUralskr}rjsUTahitir}rjsUParaguayr }r jsUYukonr }r jsUMoscowr }r(jj}r(jX모스크바 서머타임rjX모스크바 표준시ruuUNiuer}rjsuUerasr}r(Uwider}r(KX서력기원전rKX 서력기원ruU abbreviatedr}r(KX 기원전rKX서기ruuu.PK[4TT-site-packages/babel/localedata/zh_Hant_HK.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1}{0}qsUquartersq}qUperiodsq}q Uscientific_formatsq }q Upercent_formatsq }q U week_dataq}qU first_dayqKsU time_formatsq}qUmediumqcbabel.dates DateTimePattern q)q}q(UpatternqX ahh:mm:ssqUformatqX%(a)s%(hh)s:%(mm)s:%(ss)squbsU languagesq}q(UitqX 意大利文qUlolqX 蒙古語q uU territoriesq!}q"(UTWq#X台灣q$UITq%X 意大利q&uUdecimal_formatsq'}q(U date_formatsq)}q*(Umediumq+h)q,}q-(hXyyyy年M月d日q.hX%(yyyy)s年%(M)s月%(d)s日q/ubUfullq0h)q1}q2(hXyyyy年M月d日EEEEq3hX#%(yyyy)s年%(M)s月%(d)s日%(EEEE)sq4ubUlongq5h)q6}q7(hXyyyy年M月d日q8hX%(yyyy)s年%(M)s月%(d)s日q9ubUshortq:h)q;}q<(hX yy年M月d日q=hX%(yy)s年%(M)s月%(d)s日q>ubuUcurrency_symbolsq?}q@U time_zonesqA}qBUscriptsqC}qD(UKoreqEX韓文qFUHangqGX 韓文字母qHuUvariantsqI}qJ(UNJIVAqKXGniva/Njiva 方言qLU1996qMX1996 德國拼字法qNUOSOJSqOXOseacco/Osojane 方言qPUREVISEDqQX已修訂拼字法qRUSCOTLANDqSX蘇格蘭標準英語qTUBISKEqUXSan Giorgio/Bila 方言qVUSOLBAqWXStolvizza/Solbica 方言qXU1901qYX傳統德國拼字法qZuUnumber_symbolsq[}q\Ucurrency_namesq]}q^(UITLq_X意大利里拉q`UAUDqaX澳元qbUTWDqcX 新台幣qdURSDqeX塞爾維亞第納爾qfUBADqgX%波斯尼亞-黑塞哥維那第納爾qhUNZDqiX 紐西蘭元qjUBAMqkX+波斯尼亞-黑塞哥維那可轉換馬克qlUSGDqmX 新加坡元qnUHKDqoX港元qpUCADqqX加元qruUmonthsqs}qtUcurrency_formatsqu}qvNcbabel.numbers NumberPattern qw)qx}qy(Uexp_precqzNUscaleq{KU frac_precq|KKq}Usuffixq~XqX)qqUint_precqKKqhX ¤#,##0.00qUprefixqX¤qX(¤qqUexp_plusqNUgroupingqKKqubsUdaysq}qU meta_zonesq}qUerasq}qu.PK[ktt%site-packages/babel/localedata/am.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX ጡዋትqUpmqX ከሳዓትquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X hh:mm:ss a vq3h.X %(hh)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X hh:mm:ss a zq8h.X %(hh)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UguqAXጉጃርቲኛqBUgdqCXእስኮትስ ጌልክኛqDUgaqEX አይሪሽqFUgnqGX ጓራኒኛqHUglqIX ጋለጋኛqJUlaqKX ላቲንኛqLUlnqMXሊንጋላኛqNUloqOX ላውስኛqPUttqQX ታታርኛqRUtrqSX ቱርክኛqTUtsqUX ጾንጋኛqVUlvqWXላትቪያንqXUtoqYX ቶንጋqZUltq[Xሊቱአኒያንq\Utkq]Xቱርክመንኛq^Uthq_X ታይኛq`UtiqaX ትግርኛqbUtgqcX ታጂኪኛqdUteqeX ተሉጉኛqfUpt_PTqgX'ፖርቱጋሊኛ (የፖርቱጋል)qhUfilqiXፊሊፕንኛqjUtaqkX ታሚልኛqlUyiqmXይዲሻዊኛqnUpt_BRqoX$ፖርቱጋሊኛ (የብራዚል)qpUgezqqX ግዕዝኛqrUdeqsX ጀርመንqtUdaquX ዴኒሽqvUdzqwXድዞንግኻኛqxUstqyX ሶዞኛqzUquq{X ኵቿኛq|Uelq}X ግሪክኛq~UeoqXኤስፐራንቶqUenqXእንግሊዝኛqUzhqX ቻይንኛqUzaqXዡዋንግኛqUukqXዩክረኒኛqUeuqX ባስክኛqUetqXኤስቶኒአንqUesqX ስፓኒሽqUruqX ራሽኛqUrwqXኪንያርዋንድኛqUrmqX ሮማንስqUrnqX ሩንዲኛqUroqXሮማኒያንqUbnqXበንጋሊኛqUbeqXቤላራሻኛqUbgqXቡልጋሪኛqUbaqXባስኪርኛqUpsqX ፑሽቶኛqUwoqX ዎሎፍኛqUjvqX ጃቫንኛqUboqXትበትንኛqUbhqX ቢሃሪqUbiqXቢስላምኛqUbrqXብሬቶንኛqUbsqXቦስኒያንኛqUjaqX ጃፓንኛqUomqX ኦሮምኛqUocqXኦኪታንኛqUundqXያልተወሰነqUtwqX ትዊኛqUtlhqXክሊንግኦንኛqUorqX ኦሪያኛqUxhqX ዞሳኛqUcoqXኮርሲካኛqUcaqXካታላንኛqUcyqX ወልሽqUcsqX ቼክኛqUbynqX ብሊንqUptqXፖርቱጋሊኛqUtlqXታጋሎገኛqUpaqXፓንጃቢኛqUviqXቪትናምኛqUplqX ፖሊሽqUhyqXአርመናዊqUhrqXክሮሽያንኛqUiuqXእኑክቲቱትኛqUhuqXሀንጋሪኛqUhiqX ሐንድኛqUhaqX ሃውሳኛqUheqXዕብራስጥqUmgqXማላጋስኛqUuzqXኡዝበክኛqUmlqXማላያላምኛqUmoqXሞልዳቫዊናqUmnqXሞንጎላዊኛqUmiqX ማዮሪኛqUikqXእኑፒያቅኛqUmkqXማከዶኒኛqUurqX ኡርዱኛqUmtqXማልቲስኛqUmsqX ማላይኛqUmrqX ማራዚኛqUugqXኡዊግሁርኛqUmyqX ቡርማኛqUaaqX አፋርኛrUabrXአብሐዚኛrUssrX ስዋቲኛrUafrXአፍሪካንስኛrUtnrXጽዋናዊኛrUswr Xስዋሂሊኛr Uisr Xአይስላንድኛr Uamr X አማርኛrUitrXጣሊያንኛrUsvrXስዊድንኛrUiarXኢንቴርሊንጓrUasrXአሳሜዛዊrUarrX ዐርቢኛrUsurX ሱዳንኛrUzurX ዙሉኛrUayrXአያማርኛrUazrXአዜርባይጃንኛr Uier!Xእንተርሊንግወr"Uidr#Xእንዶኒሲኛr$Uskr%Xስሎቫክኛr&Unlr'Xደችr(Uyor)Xዮሩባዊኛr*Unnr+X,የኖርዌ አዲሱ ኖርዌጅያንኛr,Unor-Xኖርዌጂያንr.Unar/X ናኡሩr0Uner1X ኔፓሊኛr2Uvor3Xቮላፑክኛr4Usidr5X ሲዳምኛr6Utigr7X ትግረr8Ufrr9Xፈረንሳይኛr:Usmr;X ሳሞአኛr<Ufyr=X ፍሪስኛr>Ufar?Xፐርሲያኛr@UfirAX ፊኒሽrBUfjrCX ፊጂኛrDUsarEXሳንስክሪትኛrFUforGX ፋሮኛrHUkarIXጊዮርጊያንrJUkkrKX ካዛክኛrLUsrrMX ሰርቢኛrNUsqrOX ልቤኒኛrPUkorQX ኮሪያኛrRUknrSX ካናዳኛrTUkmrUX ክመርኛrVUklrWXካላሊሱትኛrXUksrYXካሽሚርኛrZUsir[Xስንሃልኛr\Ushr]Xሰርቦ-ክሮኤሽያኛr^Usor_X ሱማልኛr`UsnraX ሾናኛrbUkurcXኩርድሽኛrdUslreX ስሎቪኛrfUkyrgXኪርጊዝኛrhUsgriX ሳንጎኛrjUsdrkXሲንድሂኛrluU territoriesrm}rn(UBDroXባንግላዲሽrpUBErqX ቤልጄምrrUBFrsXቡርኪና ፋሶrtUBGruXቡልጌሪያrvUVErwXቬንዙዌላrxUBAryX)ቦስኒያ እና ሄርዞጎቪኒያrzUBBr{Xባርቤዶስr|UWFr}X'ዋሊስ እና ፉቱና ደሴቶችr~UBMrX ቤርሙዳrUBNrX ብሩኒrUBOrX ቦሊቪያrUBHrX ባህሬንrUBIrX ብሩንዲrUBJrX ቤኒንrUBTrX ቡህታንrU011rXምዕራባዊ አፍሪካrUBVrXየቦውቬት ደሴትrUBWrXቦትስዋናrU014rXምስራቃዊ አፍሪካrU015rXሰሜናዊ አፍሪካrUBRrX ብራዚልrU017rXመካከለኛ አፍሪካrU018rXደቡባዊ አፍሪካrU019rXአሜሪካዎችrUBYrX ቤላሩስrUBZrX ቤሊዘrULVrX ላትቪያrURWrX ሩዋንዳrUTLrXምስራቅ ቲሞርrURErXሪዩኒየንrUTMrXቱርክሜኒስታንrUTJrXታጃኪስታንrUROrX ሮሜኒያrUTKrX ቶክላውrUGWrX ቢሳዎrUGUrX ጉዋምrUGTrXጉዋቲማላrUGSrXGደቡብ ጆርጂያ እና የደቡድ ሳንድዊች ደሴቶችrUGRrX ግሪክrUGQrXኢኳቶሪያል ጊኒrUGPrXጉዋደሉፕrUJPrX ጃፓንrUGYrX ጉያናrUGFrXየፈረንሳይ ጉዊአናrUGErX ጆርጂያrUGDrX ግሬናዳrU021rXሰሜናዊ አሜሪካrUGBrXእንግሊዝrUGArX ጋቦንrUSVrXኤል ሳልቫዶርrUGNrXጊኒrUGMrX ጋምቢያrUGLrXግሪንላንድrU029rXካሪቢያንrUGIrXጊብራልታርrUGHrXጋናrUOMrX ኦማንrUTNrX ቱኒዚያrUJMrX ጃማይካrU013rX"መካከለኛ አሜሪካ [013]rUWSrX ሳሞአrUKIrX ኪሪባቲrUHRrXክሮኤሽያrUBSrX ባሃማስrUHTrX ሀይቲrUHUrX ሀንጋሪrUHKrXሆንግ ኮንግrU039rXደቡባዊ አውሮፓrUHNrXሆንዱራስrUFIrXፊንላንድrU142rX እስያrU030rX)ደቡብ-ምሥራቃዊ እስያ [030]rU034rXምሥራቃዊ እስያrU035rX)ደቡብ-ምሥራቃዊ እስያ [035]rUPRrXፖርታ ሪኮrUPSrXየፍልስጤም ግዛትrUFKrX"የፎልክላንድ ደሴቶችrUIOr X6የብሪታኒያ ህንድ ውቂያኖስ ግዛትr UPWr X ፓላውr UPTr XፖርቱጋልrUSJrX:የስቫልባርድ እና ዣን ማየን ደሴቶችrUPYrX ፓራጓይrUIQrX ኢራቅrUPArX ፓናማrUPFrX"የፈረንሳይ ፖሊኔዢያrUPGrXፓፑዋ ኒው ጊኒrUPErXፔሩrUPKrXፓኪስታንrUPHrXፊሊፒንስr UFOr!Xየፋሮይ ደሴቶችr"UPNr#Xፒትካኢርንr$UPLr%X ፖላንድr&UPMr'X*ቅዱስ ፒዬር እና ሚኩኤሎንr(UZMr)X ዛምቢያr*UEHr+Xምዕራባዊ ሳህራr,URUr-X ራሺያr.UEEr/Xኤስቶኒያr0UEGr1X ግብጽr2UZAr3Xደቡብ አፍሪካr4UECr5X ኢኳዶርr6UITr7X ጣሊያንr8UVNr9X ቬትናምr:UETr;Xኢትዮጵያr<USOr=X ሱማሌr>UZWr?X ዚምቧቤr@USArAXሳውድአረቢያrBUESrCX ስፔንrDUERrEX ኤርትራrFUMDrGX ሞልዶቫrHUMGrIXማዳጋስካርrJUMArKX ሞሮኮrLUMCrMX ሞናኮrNUUZrOXዩዝበኪስታንrPUMMrQXማያንማርrRUMLrSXማሊrTUMOrUX ማካዎrVUMNrWXሞንጎሊያrXUHMrYX6የኧርድ እና የማክዶናልድ ደሴቶችrZUASr[Xየአሜሪካ ሳሞአr\UMKr]Xማከዶኒያr^UMUr_X ማሩሸስr`UMTraX ማልታrbUMWrcX ማላዊrdUMVreXማልዲቭስrfUMQrgXማርቲኒክrhUMPriX)የሰሜናዊ ማሪያና ደሴቶችrjUMSrkXሞንትሴራትrlUMRrmXሞሪቴኒያrnUUGroX ዩጋንዳrpUTZrqXታንዛኒያrrUMYrsX ማሌዢያrtUMXruX ሜክሲኮrvUILrwXእስራኤልrxUFRryXፈረንሳይrzUAWr{X አሩባr|UDOr}Xዶሚኒክ ሪፑብሊክr~USHrXሴንት ሄለናrUVCrX3ቅዱስ ቪንሴንት እና ግሬናዲንስrU054rXሜላኔሲያrUDJrX ጂቡቲrUFJrXፊጂrU057rXሚክሮኔዢያ [057]rUFMrXሚክሮኔዢያrU053rX0አውስትራሊያ እና ኒው ዚላንድrUNIrX ኒካራጓrUNLrXኔዘርላንድrUNOrX ኖርዌrUNArX ናሚቢያrUVUrX ቫኑአቱrUNCrXኒው ካሌዶኒያrUNErX ኒጀርrUNFrXኖርፎልክ ደሴትrUNGrXናይጄሪያrUNZrXኒው ዚላንድrUNPrX ኔፓልrUNRrX ናኡሩrUNUrX ኒኡይrU061rXፖሊኔዢያrUCIrXኮት ዲቯርrUCHrXስዊዘርላንድrUCOrXኮሎምቢያrUCNrX ቻይናrUCMrX ካሜሩንrUCLrXቺሊrUCCrX#ኮኮስ ኬሊንግ ደሴቶችrUCArX ካናዳrUCGrX ኮንጐrUCFrX2የመካከለኛው አፍሪካ ሪፐብሊክrUCDrX ኮንጎrUCZrXቼክ ሪፑብሊክrUCYrXሳይፕረስrUCXrXየገና ደሴቶችrUCSrX ሰርቢያrUCRrXኮስታ ሪካrUCVrXኬፕ ቬርዴrUCUrXኩባrUSZrXሱዋዚላንድrUSYrX ሲሪያrUKErX ኬንያrUSRrX ሱሪናምrU143rX"መካከለኛ አሜሪካ [143]rUKHrXካምቦዲያrUKNrX$ቅዱስ ኪትስ እና ኔቪስrUKMrX ኮሞሮስrUSTrX$ሳኦ ቶሜ እና ፕሪንሲፔrUSKrXስሎቫኪያrUKRrXደቡብ ኮሪያrUSIrXስሎቬኒያrUKPrXሰሜን ኮሪያrUKWrX ክዌትrUSNrX ሴኔጋልrUSMrXሳን ማሪኖrUSLrXሴራሊዮንrUSCrX ሲሼልስrUSBrXሰሎሞን ደሴትrUKYrXካይማን ደሴቶችrUSGrXሲንጋፖርrUSErX ስዊድንrUSDrX ሱዳንrU151rXምስራቃዊ አውሮፓrU150rX አውሮፓrUDMrX ዶሚኒካrU155rXምዕራባዊ አውሮፓrU154rXሰሜናዊ አውሮፓrUVGrX,የእንግሊዝ ድንግል ደሴቶችrUDEr X ጀርመንr UYEr X የመንr UMHr Xማርሻል አይላንድrUDZrXአልጄሪያrUUSrX አሜሪካrUUYrX ኡራጓይrUYTrX ሜይኦቴrUUMrX4የአሜሪካ ራቅ ያሉ አናሳ ደሴቶችrULBrX ሊባኖስrULCrXሴንት ሉቺያrULArX ላኦስrUTVrX ቱቫሉr UTWr!X ታይዋንr"UTTr#X ትሪኒዳድ እና ቶባጎr$UTRr%X ቱርክr&ULKr'Xሲሪላንካr(ULIr)Xሊችተንስታይንr*UCKr+Xኩክ ደሴቶችr,UTOr-X ቶንጋr.ULTr/Xሊቱዌኒያr0ULUr1Xሉክሰምበርግr2ULRr3Xላይቤሪያr4ULSr5X ሌሶቶr6UTHr7Xታይላንድr8UTFr9X,የፈረንሳይ ደቡባዊ ግዛቶችr:UTGr;Xቶጐr<UTDr=Xቻድr>UTCr?X/የቱርኮችና የካኢኮስ ደሴቶችr@ULYrAX ሊቢያrBUVArCX ቫቲካንrDU145rEXምዕራባዊ እስያrFUAErGX,የተባበሩት አረብ ኤምሬትስrHUADrIX አንዶራrJUAGrKXአንቲጓ እና ባሩዳrLUAFrMXአፍጋኒስታንrNUAIrOXአንጉኢላrPUVIrQX)የአሜሪካ ቨርጂን ደሴቶችrRUISrSXአይስላንድrTUIRrUX ኢራንrVUAMrWXአርሜኒያrXUALrYXአልባኒያrZUAOr[X አንጐላr\UANr]X%ኔዘርላንድስ አንቲልስr^UAQr_Xአንታርክቲካr`U002raX አፍሪካrbU001rcX ዓለምrdUARreXአርጀንቲናrfUAUrgXአውስትሬሊያrhUATriXኦስትሪያrjU005rkXደቡባዊ አሜሪካrlUINrmX ህንድrnUAXroXየአላንድ ደሴቶችrpU009rqX ኦሽኒያrrUAZrsXአዘርባጃንrtUIEruXአየርላንድrvUIDrwXኢንዶኔዢያrxUJOryX ጆርዳንrzUUAr{X ዩክሬንr|UQAr}X ኳታርr~UDKrXዴንማርክrUMZrXሞዛምቢክrUQOrXወጣ ያለ ኦሽኒያruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X MMM d yyyyrh.X%(MMM)s %(d)s %(yyyy)srubUfullrh))r}r(h,XEEEE፣ dd MMMM ቀን yyyy Grh.X1%(EEEE)s፣ %(dd)s %(MMMM)s ቀን %(yyyy)s %(G)srubUlongrh))r}r(h,X dd MMMM yyyyrh.X%(dd)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,Xdd/MM/yyrh.X%(dd)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}rU time_zonesr}r(UAtlantic/Canaryr}rUcityrX ካናሪrsUAntarctica/Mawsonr}rjX ማውሰንrsUAmerica/Buenos_Airesr}rjXቡኤኖስ-ኤይሪስrsUAustralia/Melbourner}rjXሜልቦኡመrsU Pacific/Waker}rjXዌክrsUAmerica/Nipigonr}rjX ኒፒጎንrsUAmerica/Louisviller}rjXሉዊስቪለrsUAustralia/Darwinr}rjX ዳርዊንrsUAmerica/Whitehorser}rjXሁዋይትሆርስrsUAntarctica/Davisr}rjX ዴቪስrsUAmerica/Swift_Currentr}rjXስዊፍት ከረንትrsU Europe/Samarar}rjX ሳማራrsU Asia/Tashkentr}rjXታሽኬንትrsUEurope/Simferopolr}rjXሲምፈሮፖልrsUAmerica/Maceior}rjX ማቺዎrsU Asia/Magadanr}rjX ማጋዳንrsUEurope/Zaporozhyer}rjXዛፖሮዝሂይrsU Asia/Kashgarr}rjX ካሽጋርrsUAmerica/Detroitr}rjXዲትሮይትrsU Asia/Kuchingr}rjX ኩቺንግrsU Asia/Urumqir}rjX ኡሩምኪrsU Europe/Moscowr}rjX ማስኮrsU Europe/Madridr}rjXማርድሪድrsUPacific/Kiritimatir}rjXኪሪቲማቲrsUAmerica/Santiagor}rjXሳንቲያጎrsUAsia/Pontianakr}rjXፖንቲአንካrsUAsia/Ulaanbaatarr}rjXኡላንባታርrsUAmerica/Rainy_Riverr}rjXሬኒ ሪቨርrsUAntarctica/Rotherar}rjX ሮተራrsUAustralia/Adelaider}rjXአዴላኢደrsUAmerica/Indianapolisr}rjXኢንዲያናፖሊስrsUAmerica/Reginar}rjX ሬጂናrsU Pacific/Trukr}rjX ትሩክrsUAmerica/Cambridge_Bayr}rjXካምብሪጅ ቤይrsUAmerica/Mexico_Cityr}r jXሜክሲኮ ሲቲr sU America/Boiser }r jX ቦይስr sUPacific/Chathamr}rjX ቻትሃምrsUPacific/Midwayr}rjX ሚድዌrsU America/Jujuyr}rjX ጁጁይrsUAmerica/Cordobar}rjX ኮርዶባrsU America/Belemr}rjX በለምrsU Asia/Harbinr}rjX ባርቢንrsUAustralia/Lord_Hower }r!jXሎርድ ሆዌr"sUAmerica/Argentina/San_Juanr#}r$jXSan_Juanr%sUPacific/Kosraer&}r'jX ኮስራይr(sUAmerica/Monterreyr)}r*jX ሞንተሪr+sUAsia/Krasnoyarskr,}r-jXክራስኖያሽክr.sUAmerica/Boa_Vistar/}r0jXቦአ ቪስታr1sUAsia/Yekaterinburgr2}r3jXየካተሪንበርግr4sUAmerica/Araguainar5}r6jXአራጉአኢናr7sUAntarctica/Caseyr8}r9jXቼሲr:sUPacific/Honolulur;}r<jX ሆኖሉሉr=sUPacific/Enderburyr>}r?jXእንደርቡርይr@sU America/ThulerA}rBjXቱለrCsUAmerica/St_JohnsrD}rEjXሴንት ጆንስrFsUPacific/MajurorG}rHjX ማጁሮrIsUPacific/AucklandrJ}rKjXኦክላንድrLsUAmerica/MazatlanrM}rNjXማዛቲአንrOsUAsia/ChoibalsanrP}rQjXቾይባልሳንrRsU Europe/KievrS}rTjX ካይቭrUsUAntarctica/SyowarV}rWjX ስዮዋrXsUAmerica/HalifaxrY}rZjXሀሊፋክስr[sUAntarctica/McMurdor\}r]jXማክሙርዶr^sU Asia/Hovdr_}r`jX ሆቭድrasUAmerica/Danmarkshavnrb}rcjXዴንማርክrdsUAmerica/Thunder_Bayre}rfjXተንደር ቤይrgsUAmerica/Scoresbysundrh}rijXስኮረስቢሱንድrjsUAmerica/Eiruneperk}rljX ኢሩኔፕrmsUAmerica/Manausrn}rojX ማናኡስrpsUAmerica/Los_Angelesrq}rrjXሎስ አንጀለስrssUAmerica/Godthabrt}rujXጐድታኽብrvsUAmerica/Goose_Bayrw}rxjX ጉዝ ቤይrysUAmerica/Catamarcarz}r{jXካታማርካr|sUAmerica/Chihuahuar}}r~jXቺኽዋኽዋrsUAmerica/Argentina/Rio_Gallegosr}rjX Rio_GallegosrsUPacific/Gambierr}rjXጋምባየርrsUAmerica/Vancouverr}rjXቫንኩቨርrsU Africa/Bamakor}rjX ባማኮrsUEurope/Uzhgorodr}rjXኡዝጎሩድrsUPacific/Ponaper}rjX ፖኔፕrsU Asia/Aqtaur}rjX አክታውrsUAmerica/Sao_Paulor}rjXሳኦ ፓውሎrsUAmerica/Edmontonr}rjXኤድመንተንrsUAustralia/Perthr}rjX ፕርዝrsUAmerica/Mendozar}rjX ሜንዶዛrsUAmerica/Meridar}rjX ሜሪዳrsUPacific/Easterr}rjX ኢስተርrsU Asia/Jakartar}rjX ጃካርታrsUAntarctica/Palmerr}rjX ፓልመርrsUAustralia/Sydneyr}rjX ሲድኒrsUAtlantic/Madeirar}rjX ማዴኢራrsU Asia/Oralr}rjX ኦራልrsUAmerica/Campo_Grander}rjX Campo_GrandersUAmerica/Dawson_Creekr}rjXዳውሰን ክሪክrsUAfrica/Kinshasar}rjX ኪንሻሳrsUAntarctica/Vostokr}rjX ቮስቱክrsUAustralia/Lindemanr}rjXሊንደማንrsUAmerica/Porto_Velhor}rjXፖርቶ ቨልሆrsUPacific/Galapagosr}rjXጋላፓጎስrsUAmerica/Indiana/Marengor}rjX ማሬንጎrsU Africa/Ceutar}rjX ኬውታrsUAmerica/Winnipegr}rjX ዊኒፔግrsUAmerica/Dawsonr}rjX ዳውሰንrsUAustralia/Brisbaner}rjXቢሪስባንrsU Asia/Aqtober}rjX አክቶቤrsUAmerica/Recifer}rjX ሪሲፋይrsU Asia/Sakhalinr}rjXሳክሃሊንrsUPacific/Kwajaleinr}rjXክዋጃላይንrsUAmerica/Fortalezar}rjXፎርታለዛrsUAustralia/Broken_Hillr}rjXብሮከን ሂልrsUAmerica/Phoenixr}rjX ፎኔክስrsUAmerica/Cuiabar}rjXኩባrsUAmerica/Kentucky/Monticellor}rjXሞንቲሴሎrsUPacific/Tarawar}rjX ታራዋrsUAmerica/Yellowknifer}rjXየሎውናይፍrsUAmerica/Rio_Brancor}rjXሪኦ ብራንኮrsUAmerica/Cancunr}rjX ካንኩንrsUAsia/Vladivostokr}rjXቭላዲቮስቱክrsUPacific/Johnstonr}rjXጆንስቶንrsUEurope/Kaliningradr}rjXካሊኒንጋርድr sU Europe/Lisbonr }r jX ሊስቦንr sU Asia/Makassarr }rjX ማካሳርrsUAsia/Qyzylordar}rjXኪዝያሎርዳrsUAtlantic/Azoresr}rjX አዞረስrsUAsia/Chongqingr}rjXቾንግኪንግrsUAmerica/Chicagor}rjX ቺካጐrsU Asia/Shanghair}rjX ሻንጋይrsUAmerica/Rankin_Inletr}r jXራንኪን ኢንሌትr!sUAmerica/Iqaluitr"}r#jXኢካሊኡትr$sU Asia/Irkutskr%}r&jXኢርኩትስክr'sUAmerica/Guayaquilr(}r)jX ጓያኪልr*sUAsia/Kuala_Lumpurr+}r,jXኳላልምፑርr-sUAmerica/Menomineer.}r/jX መኖሚኔr0sUAmerica/Denverr1}r2jX ዴንቨርr3sUAsia/Kamchatkar4}r5jXካምቻትካr6sUAmerica/Glace_Bayr7}r8jXግሌስ ቤይr9sU Asia/Jayapurar:}r;jX ጃያፑራr<sUAmerica/Hermosillor=}r>jXሄርሞሲሎr?sU Europe/Londonr@}rAjX ሎንዶንrBsUAmerica/North_Dakota/CenterrC}rDjX መካከልrEsUAmerica/PangnirtungrF}rGjXፓንግኒርቱንግrHsUAmerica/Indiana/VevayrI}rJjX ቬቫይrKsU Asia/YakutskrL}rMjXያኩትስክrNsUAmerica/TijuanarO}rPjX ቲጁአናrQsU America/AdakrR}rSjX አዳክrTsUAntarctica/DumontDUrvillerU}rVjXዱሞንትዱርቪልrWsUAmerica/Indiana/KnoxrX}rYjX ክኖክስrZsU Asia/Almatyr[}r\jX አልማቲr]sUAmerica/Argentina/La_Riojar^}r_jXLa_Riojar`sUPacific/Tahitira}rbjX ታሂቲrcsUAmerica/Noronhard}rejX ኖሮሃrfsUAsia/Novosibirskrg}rhjXኖቮሲቢርስክrisUAfrica/Lubumbashirj}rkjXሉቡምባሺrlsUPacific/Marquesasrm}rnjXማሩኩሳስrosU Asia/Anadyrrp}rqjX አናዲርrrsUAmerica/New_Yorkrs}rtjXኒውዮርክrusU America/Nomerv}rwjXኖሜrxsUAmerica/Yakutatry}rzjX ያኩታትr{sUAustralia/Hobartr|}r}jX ሆባርትr~sUAmerica/Juneaur}rjX ጁነአኡrsUAmerica/Inuvikr}rjX ኢኑቪክrsUAsia/Samarkandr}rjXሳማርካንድrsUAmerica/Montrealr}rjXሞንትሪያልrsUAmerica/Torontor}rjX ቶሮንቶrsU America/Bahiar}rjX America/BahiarsUAmerica/Anchorager}rjXአንኮራጅrsU Asia/Omskr}rjX ኦምስክrsUAntarctica/South_Poler}rjX South_PolersuUscriptsr}r(UYiiirXዪrUTalurXአዲስ ታኢ ሉrUTagbrXትአግባንዋrUTelurX ቴሉጉrUShawrXየሻቪያ ፊደልrUTamlrX ታሚልrUGururX ጉርሙኪrUHebrrXእብራይስጥrUGeorrXየጆርጂያ ፊደልrUUgarrXኡጋሪቲክrUCyrlrX ሲርሊክrUHrktrX&ካታካና ወይንም ሂራጋናrUArmnrXየአርማኒያ ፊደልrURunrrX ሩኒክrUKhmrrX ካኽሜርrULatnrX ላቲንrUDsrtrX ዴዘረትrUHanirXሀንrUHanorX ሀኑኦrUEthirX ፊደልrUGujrrX ጉጃራቲrUHangrX ሀንጉልrUArabrX አረቢክrUThaarX ታኸናrUBuhdrX ቡሂድrUCoptrX ኮፕቲክrUOryarX ኦሪያrUHansrXቀላል ሀንrUThairXታኢrUCprtrXሲፕሪኦትrULinbrXሊኒያር ቢrULinarXሊኒያር ኤrUHantrXባሕላዊ ሀንrUOsmarXኦስማኒያrUMongrXየሞንጎሊያ ፊደልrUDevarXዴቫናጋሪrULaoorXላኦrUSinhrX ሲንሃላrUHirarX ሂራጋናrUBoporX ቡፖሞፎrUGothrX ጐቲክrUTalerX ታኢ ለrUMymrrXሚአንማርrUTglgrX ታጋሎግrUBrairX ብሬይልrUGrekrX ግሪክrUMlymrXማላያላምrUCherrX ቼሮኪrUTibtrX ቲቤታንrUQaairXየተወረሰrUVaiirXቫይrUKanarXክአታካናrUSyrcrX ሲሪክrUCansrX9የተዋሐዱ የካናዳ ጥንታዊ ምልክቶችrUBengrX ቤንጃሊr ULimbr X ሊምቡr UOgamr X ኦግሀምr UKndarX ካናዳruUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UJPYrXየጃፓን የንrUUSDrXየአሜሪካን ዶላርrURUBrXየራሻ ሩብልrUINRrXየሕንድ ሩፒrUCNYrX&የቻይና ዩአን ረንሚንቢrUETBr Xየኢትዮጵያ ብርr!UBRLr"Xየብራዚል ሪልr#UGBPr$X2የእንግሊዝ ፓውንድ ስተርሊንግr%UEURr&Xዩሮr'uUmonthsr(}r)(U stand-aloner*}r+Unarrowr,}r-(KXጃr.KXፌr/KXማr0KXኤr1KXሜr2KXጁr3KXጁr4KXኦr5K Xሴr6K Xኦr7K Xኖr8K Xዲr9usUformatr:}r;(Uwider<}r=(KXጃንዩወሪr>KXፌብሩወሪr?KX ማርችr@KX ኤፕረልrAKXሜይrBKXጁንrCKX ጁላይrDKX ኦገስትrEK XሴፕቴምበርrFK XኦክተውበርrGK XኖቬምበርrHK XዲሴምበርrIuU abbreviatedrJ}rK(KX ጃንዩrLKX ፌብሩrMKX ማርችrNKX ኤፕረrOKXሜይrPKXጁንrQKX ጁላይrRKX ኦገስrSK X ሴፕቴrTK X ኦክተrUK X ኖቬምrVK X ዲሴምrWuuuUcurrency_formatsrX}rYNcbabel.numbers NumberPattern rZ)r[}r\(Uexp_precr]NUscaler^KU frac_precr_KKr`UsuffixraX ¤rbjbrcUint_precrdKKreh,X #,##0.00 ¤rfUprefixrgXrhX-rirjUexp_plusrkNUgroupingrlKKrmubsUdaysrn}ro(U stand-alonerp}rqUnarrowrr}rs(KXሰrtKXማruKXረrvKXሐrwKXዓrxKXቅryKXእrzusUformatr{}r|(Uwider}}r~(KXሰኞrKX ማክሰኞrKX ረቡዕrKX ሐሙስrKX ዓርብrKX ቅዳሜrKX እሑድruU abbreviatedr}r(KXሰኞrKX ማክሰrKX ረቡዕrKX ሐሙስrKX ዓርብrKX ቅዳሜrKX እሑድruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXዓ/ዓrKXዓ/ምrusu.PK[Rll-site-packages/babel/localedata/kk_Cyrl_KZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99(site-packages/babel/localedata/lo_LA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[CCYXX%site-packages/babel/localedata/ug.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUREVISEDqcXUyghurqdsUnumber_symbolsqe}qfUcurrency_namesqg}qhUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KhoKhpKhqKhrKhsKhtKhuKhvK hwK X10qK X11qK X12quU abbreviatedq}q(KhoKhpKhqKhrKhsKhtKhuKhvK hwK X10qK X11qK X12quuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KhpKhqKhrKhsKhtKhuKhouU abbreviatedq}q(KhpKhqKhrKhsKhtKhuKhouuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[99(site-packages/babel/localedata/ug_CN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[{==(site-packages/babel/localedata/kn_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/bg_BG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[KiMM%site-packages/babel/localedata/zh.datnu[}q(U zone_formatsq}q(UregionqX%sqUgmtqX格林尼治标准时间%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q (U stand-aloneq }q Unarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 第1季度qKX 第2季度qKX 第3季度qKX 第4季度quU abbreviatedq}q(KX1季qKX2季qKX3季q KX4季q!uuuUperiodsq"}q#(Uamq$X上午q%Upmq&X下午q'uUscientific_formatsq(}q)Ncbabel.numbers NumberPattern q*)q+}q,(Uexp_precq-KKq.Uscaleq/KU frac_precq0KKq1Usuffixq2Xq3h3q4Uint_precq5KKq6Upatternq7X#E0q8Uprefixq9h3X-q:q;Uexp_plusqubsUpercent_formatsq?}q@Nh*)qA}qB(h-Nh/Kdh0KKqCh2X%qDhDqEh5KKqFh7X#,##0%qGh9h3h:qHhX苏语诸语言r?Umapr@X澳斯特罗尼西亚语系rAUmasrBX 萨伊语rCUlahrDX 拉亨达文rEUladrFX 拉迪诺文rGUfyrHX弗里斯兰文rIUsnkrJX 索尼基文rKUfarLX 波斯文rMUmadrNX 马都拉文rOUmagrPX 马加伊文rQUmairRX 迈蒂利文rSUfirTX 芬兰文rUUfjrVX 斐济文rWUmanrXX 曼丁哥文rYUegyrZX 古埃及文r[Uzndr\X 赞德文r]Ussr^X 斯瓦特文r_Usrr`X塞尔维亚文raUsqrbX阿尔巴尼亚文rcUswrdX斯瓦希里文reUsvrfX 瑞典文rgUsurhX 巽他文riUstrjX 塞索托文rkUskrlX斯洛伐克文rmUsirnX 僧伽罗文roUshrpX塞尔维亚-克罗地亚文rqUsorrX 索马里文rsUsnrtX 绍纳文ruUsmrvX 萨摩亚文rwUslrxX斯洛文尼亚文ryUscrzX 萨丁文r{Usar|X梵文r}Usgr~X 桑戈文rUserX 北萨米文rUsdrX 信德文rUzenrX 泽纳加文rUkbdrX卡巴尔达文rUafarX其他亚非语系rUcsbrX 卡舒文rUlgrX 卢干达文rUlbrX 卢森堡文rUfiurX其他芬兰乌戈尔语系rUlnrX 林加拉文rUlorX 老挝文rUlirX淋布尔吉文rUbynrX 布林文rUltrX 立陶宛文rUlurX鲁巴加丹加文rUfilrX 菲律宾文rUyirX 依地文rUnonrX古诺尔斯文rUcebrX 宿务文rUyorX 约鲁巴文rUnogrX 诺盖文rUbatrX其他波罗的语系rUdakrX 达科他文rUdarrX达尔格瓦文rUdayrX 达雅克文rUssarX'非洲撒哈拉沙漠边缘地带语言rUkperX 克佩列文rUelrX 希腊文rUeorX 世界文rUenrX英文rUlamrX 兰巴文rUeerX 埃维文rUmdfrX 莫克沙文rUfrrX法文rUmdrrX 曼达尔rUetrX爱沙尼亚文rUesrX 西班牙文rUrurX俄文rUgonrX 岗德文rUgohrX古高地德文rUsmsrX斯科特萨米文rUsmnrX伊纳里萨米语rUsmjrX律勒欧萨莫斯语rUde_ATrX德语(奥地利)rUgotrX 哥特文rUrnrX 基隆迪文rUrorX罗马尼亚文rUdsbrX 下索布文rUsmarX 南萨米文rUgorrX科洛涅达罗文rUastrX阿斯图里亚思特文rUwalrX 瓦拉莫文rUcrhrX0克里米亚土耳其文;克里米亚塔塔文rUathrX阿萨帕斯坎语系rUgezrX 吉兹文rUxhrX 科萨文rUffrX 夫拉文rUkforX 科罗文rUmakrX 望加锡文rUzaprX萨波蒂克文rUkokrX 刚卡尼文rUzxxrX无语言内容rUkosrX科斯拉伊文rUforX 法罗文rUtogrX汤加文(尼亚萨地区)rUhuprX 胡帕文rUudmrX乌德穆尔特文rUbejrX 别札文rUbemrX 别姆巴文r Utsir X蒂姆西亚文r Uberr X 柏柏尔文r UnzirX 恩济马文rUsairX其他南美印第安文rUangrX 古英文rUprarX普拉克里特诸语言rUbhorX博杰普尔文rUsalrX 萨利什文rUprorX普罗文斯文rUrajrX拉贾斯坦文rUsadrX 散达维文rUanpr X 安吉卡文r!Ues_419r"X西班牙语(拉丁美洲)r#Urapr$X拉帕努伊文r%Usasr&X 萨萨克文r'Unqor(X西非书面语言r)Ucarr*X 巴勒比文r+Uminr,X米南卡保文r-Umicr.X米克马克文r/Uefir0X 埃菲克文r1Uarnr2X 阿劳坎文r3Uypkr4X尤皮克诸语言r5Umisr6X各种不同语系r7Ukacr8X 卡琴文r9Ukabr:X 卡比尔文r;Ukaar<X卡拉卡尔帕克文r=Ukajr>Xkajr?Ukamr@X 卡姆巴文rAUkarrBX 喀伦文rCUkawrDX 卡威文rEUfr_CHrFX法语 (瑞士)rGUtyvrHX 图瓦文rIUfr_CArJX法语(加拿大)rKUkarLX格鲁吉亚文rMUdoirNX 多格拉文rOUkgrPX 刚果文rQUkkrRX 哈萨克文rSUkjrTX 宽亚玛文rUUkirVX 吉库尤文rWUkorXX韩文rYUknrZX 坎纳达文r[Ukmr\X 柬埔寨文r]Uklr^X 格陵兰文r_Uksr`X克什米尔文raUkrrbX 卡努里文rcUkwrdX 凯尔特文reUkvrfX 科米文rgUkurhX 库尔德文riUkyrjX吉尔吉斯文rkUtklrlX 托克劳文rmUbuarnX布里亚特文roUmgarpX中古爱尔兰文rqUhitrrX 赫梯文rsUdyurtX 迪尤拉文ruUdervX德文rwUdarxX 丹麦文ryUdzrzX 不丹文r{Uluir|X路易塞诺文r}Udvr~X 迪维希文rUhilrX希利盖农文rUhimrX赫马查利文rUgemrX其他日尔曼语系rUcrprX其他克里奥尔混合语系rUqurX 盖丘亚文rUbasrX 巴萨文rUgbarX 葛巴亚文rUbadrX 班达文rUbanrX 巴里文rUbalrX 俾路支文rUshnrX掸文rUbairX巴米累克语系rUarprX阿拉帕霍文rUartrX其他人工语系rUarwrX阿拉瓦克文rUarcrX 阿拉米文rUen_USrX英语(美国)rUsemrX其他闪族语系rUselrX塞尔库普文rUnubrX努比亚语系rUbtkrX 巴塔克文rUlusrX 卢晒文rUmusrX 克里克文rUluarX鲁巴鲁瓦文rUirorX伊洛魁语系rUirarX 伊朗文rUmunrX 蒙达语系rUlunrX 隆达文rUluorX 卢奥文rUwarX 瓦隆文rUtuprX 图皮语系rUjvrX 爪哇文rUtutrX阿尔泰诸语言(其他)rUtumrX 通布卡文rUjarX日文rUcoprX 科普特文rUilorX伊洛干诺文rUlarX 拉丁文rUgwirX吉维克琴文rUundrX 未定语种rUtlirX特林吉特文rUtlhrX 克林贡文rUchrX 查莫罗文rUcorX 科西嘉文rUcarX加泰罗尼亚文rUcerX 车臣文rUponrX 波纳佩文rUcyrX 威尔士文rUsahrX 雅库特文rUcsrX 捷克文rUcrrX 克里族文rUbntrX 班图文rUcvrX 楚瓦什文rUcurX宗教斯拉夫文rUlvrX拉脱维亚文rUdumrX中古荷兰文rUptrX 葡萄牙文rUduarX 都阿拉文rUfrorX 古法文rUyaprX 雅浦文rUfrmrX 中古法文rUtivrX 蒂夫文rUfrsrX东弗里西亚文rUfrrrX北弗里西亚语rUyaorX 瑶族文rUparX 旁遮普文rUxalrX卡尔梅克文rUes_ESrX西班牙语(伊比利亚)rUpirX 巴利文r Uen_GBr X英语(英国)r Ugayr X 迦约文r UotorX奥托米语系rUotarX奥托曼土耳其文rUhmnrX 赫蒙文rUmyvrX 俄日亚文rUgaarX加文rUfurrX 弗留利文rUkhirX其他科伊桑语系rUainrX 阿伊努文rUrarrX拉罗汤加文rUslar X其他斯拉夫语系r!Uver"X 文达文r#Uvir$X 越南文r%Uisr&X 冰岛文r'Ukhor(X 和田文r)Uiur*X伊努伊特文r+Uitr,X 意大利文r-Uvor.X沃拉普克文r/Uiir0X 四川话r1Uikr2X依奴皮维克文r3Uior4X 伊多文r5Uiner6X其他印欧语系r7Uiar8X 国际文 Ar9Ujprr:X犹太波斯文r;Uier<X 国际文 Er=Uidr>X印度尼西亚文r?Uigr@X 伊格博文rAUpaprBX帕皮亚门托文rCUeworDX 旺杜文rEUpaurFX 帕劳文rGUpaarHX其他巴布亚文rIUpagrJX邦阿西楠语rKUsatrLX 桑塔利文rMUpalrNX 帕拉维文rOUpamrPX 邦板牙文rQUphirRX其他菲律宾语系rSUcelrTX其他凯尔特语系rUUphnrVX 腓尼基文rWUnicrXX!其他尼日尔科尔多凡语系rYUniarZX 尼亚斯文r[Udgrr\X多格里布文r]Usyrr^X 叙利亚文r_Uniur`X 纽埃文raUgswrbX德文 (瑞士)rcUcchrdXcchreUjborfX 逻辑文rgUnahrhX纳瓦特尔文riUsamrjX萨玛利亚文rkUhairlX 海达文rmUgmhrnX中古高地德文roUcusrpX其他库施特语系rqUwenrrX索布诸语言rsUadyrtX 阿迪何文ruUelxrvX艾拉米特文rwUadarxX 阿当梅文ryUpt_PTrzX依伯利亚葡萄牙文r{Uhawr|X 夏威夷文r}Ubinr~X 比尼文rUbikrX 毕库尔文rUpt_BRrX葡萄牙语(巴西)rUmosrX 莫西文rUmohrX 摩霍克文rUtlrX 他加禄文rUzh_HansrX中文(简体)rUzh_HantrX中文(繁体)rUtvlrX 图瓦卢文rUijorX 伊乔文rUkmbrX 金邦杜文rUpeorX古老波斯语rUumbrX 翁本杜文rUtmhrX塔马奇克文rUfonrX丰文rUhsbrX 上索布文rUberX白俄罗斯文rUbgrX保加利亚文rUbarX巴什客尔文rUpsrX 普什图文rUbmrX 班巴拉文rUbnrX 孟加拉文rUborX藏文rUbhrX 比哈尔文rUbirX比斯拉马文rUbrrX布里多尼文rUbsrX波斯尼亚文rUruprX亚美尼亚语rUzzarX 扎扎文rUomrX 奥洛莫文rUojrX奥吉布瓦文rUacerX 亚齐文rUachrX 阿乔利文rUocrX奥克西唐语rUkrurX 库鲁克文rUsrrrX 谢列尔文rUkrorX 克鲁文rUkrlrX卡累利阿文rUkrcrX卡拉恰伊巴尔卡尔文rUndsrX!低地德文;低地撒克逊文rUosrX 奥塞梯文rUorrX 欧里亚文rUsogrX 古粟特语rUnsorX 北索托文rUsonrX 桑海文rUde_CHrX高地德文 (瑞士)rUvairX 瓦伊文rUwakrX瓦卡什诸语言rUlolrX 芒戈文rUmkhrX其他孟高棉语系rUawarX 阿瓦乔文rUlozrX 洛兹文rUgilrX吉尔伯特斯文rUwasrX 瓦绍文rUwarrX 瓦赖文rUhzrX 赫雷罗文rUhyrX亚美尼亚文rUanrX 阿拉贡文rUsidrX 悉达摩文rUhrrX克罗地亚文rUhtrX 海地文rUhurX 匈牙利文rUhirX 印地文rUhorX希里莫图文rUharX 豪撒文rUbugrX 布吉文rUherX 希伯来文rUuzrX乌兹别克文rUurrX 乌尔都文rUplrX 波兰文r Uukr X 乌克兰文r Uugr X 维吾尔文r UaarX 阿法文rUabrX阿布哈西亚文rUaerX阿维斯塔文rUafrX南非荷兰文rUakrX 阿肯文rUamrX阿姆哈拉文rUnl_BErX 弗拉芒语rUeurX 巴斯克文rUasrX 阿萨姆文rUarr X 阿拉伯文r!Uinhr"X 印古什文r#Utpir$X托克皮辛文r%Umynr&X 玛雅语系r'Uayr(X 艾马拉文r)Ukhar*X 卡西文r+Uazr,X阿塞拜疆文r-Uincr.X其他印度语系r/Unlr0X 荷兰文r1Unnr2X挪威尼诺斯克文r3Unor4X 挪威文r5Unar6X 瑙鲁文r7Unbr8X挪威博克马尔文r9Unair:X其他北美印第安语系r;Undr<X北恩德贝勒文r=Uner>X 尼泊尔文r?Ungr@X 恩东加文rAUnyrBX'尼扬贾文;齐切瓦文;切瓦文rCUnaprDX 拿波里文rEUgrbrFX 格列博文rGUgrcrHX 古希腊文rIUnrrJX南部恩德贝勒文rKUtigrLX 提格雷文rMUnvrNX 纳瓦霍文rOUzunrPX 祖尼语rQUrwrRX 卢旺达文rSUcperTX3其他以英文为基础的克里奥尔混合语系rUUcpfrVX3其他以法文为基础的克里奥尔混合语系rWUcpprXX9其他以葡萄牙文为基础的克里奥尔混合语系rYuU territoriesrZ}r[(UBDr\X 孟加拉国r]UBEr^X 比利时r_UBFr`X布基纳法索raUBGrbX 保加利亚rcUVErdX 委内瑞拉reUBArfX波斯尼亚和黑塞哥维那rgUBBrhX 巴巴多斯riUWFrjX瓦利斯和富图纳rkUBLrlX圣巴泰勒米rmUBMrnX 百慕大roUBNrpX文莱rqUBOrrX 玻利维亚rsUBHrtX巴林ruUBIrvX 布隆迪rwUBJrxX贝宁ryUBTrzX不丹r{U011r|X西非r}UBVr~X 布维特岛rUBWrX 博茨瓦纳rU014rX东非rU015rX北非rUBRrX巴西rU017rX中非rU018rX 南部非洲rU019rX美洲rUBYrX 白俄罗斯rUBZrX 伯利兹rULVrX 拉脱维亚rURWrX 卢旺达rURSrX 塞尔维亚rUTLrX 东帝汶rURErX 留尼汪rUTMrX土库曼斯坦rUOMrX阿曼rUTJrX塔吉克斯坦rUROrX 罗马尼亚rUTKrX 托克劳rUGWrX几内亚比绍rUGUrX关岛rUGTrX 危地马拉rUGSrX!南佐治亚和南三明治群岛rUGRrX希腊rUGQrX赤道几内亚rUGPrX瓜德罗普岛rUJPrX日本rUKIrX 基里巴斯rUGYrX 圭亚那rUGGrX 格恩西岛rUGFrX法属圭亚那rUGErX 格鲁吉亚rUGDrX 格林纳达rU021rX 美洲北部rUGBrX英国rUGArX加蓬rUSVrX 萨尔瓦多rUGNrX 几内亚rUGMrX 冈比亚rUGLrX 格陵兰rU029rX 加勒比海rUGIrX 直布罗陀rUGHrX加纳rUJErX 泽西岛rUTNrX 突尼斯rUJMrX 牙买加rU013rX 中美洲rUWSrX 萨摩亚rU419rX拉丁美洲和加勒比海rUHRrX 克罗地亚rUBSrX 巴哈马rUHTrX海地rUHUrX 匈牙利rUHKrX中国香港特别行政区rU039rX南欧rUHNrX 洪都拉斯rUFIrX芬兰rU142rX亚洲rU030rX东亚rU034rX南亚rU035rX 东南亚rUPRrX 波多黎各rUPSrX巴勒斯坦领土rU830rX 海峡群岛rUFKrX福克兰群岛rUIOrX英属印度洋领地rUPWrX帕劳rUPTrX 葡萄牙rUSJrX斯瓦尔巴特和扬马延r UMDr X 摩尔多瓦r UFMr X密克罗尼西亚联邦r UIQrX 伊拉克rUPArX 巴拿马rUPFrX法属波利尼西亚rUPGrX巴布亚新几内亚rUPErX秘鲁rUPKrX 巴基斯坦rUPHrX 菲律宾rUFOrX 法罗群岛rUPNrX 皮特凯恩rUPLr X波兰r!UPMr"X圣皮埃尔和密克隆r#UZMr$X 赞比亚r%UEHr&X 西撒哈拉r'URUr(X 俄罗斯r)UEEr*X 爱沙尼亚r+UEGr,X埃及r-UZAr.X南非r/UECr0X 厄瓜多尔r1UITr2X 意大利r3UVNr4X越南r5UZZr6X未知或无效地区r7USBr8X所罗门群岛r9UETr:X埃塞俄比亚r;USOr<X 索马里r=UZWr>X 津巴布韦r?USAr@X沙特阿拉伯rAUESrBX 西班牙rCUERrDX厄立特里亚rEUMErFX黑山共和国rGUAQrHX 南极洲rIUMGrJX马达加斯加rKUMFrLX 圣马丁rMUMArNX 摩洛哥rOUMCrPX 摩纳哥rQUUZrRX乌兹别克斯坦rSUMMrTX缅甸rUUMLrVX马里rWUMOrXX中国澳门特别行政区rYUMNrZX蒙古r[UHMr\X赫德与麦克唐纳群岛r]UASr^X美属萨摩亚r_UMKr`X 马其顿raUMUrbX 毛里求斯rcUMTrdX 马耳他reUMWrfX 马拉维rgUMVrhX 马尔代夫riUMQrjX马提尼克群岛rkUMPrlX北马里亚纳群岛rmUMSrnX蒙塞拉特群岛roUMRrpX毛里塔尼亚rqUIMrrX曼岛rsUUGrtX 乌干达ruUTZrvX 坦桑尼亚rwUMYrxX 马来西亚ryUMXrzX 墨西哥r{UILr|X 以色列r}UFRr~X法国rUAWrX 阿鲁巴rUDOrX多米尼加共和国rUSHrX 圣赫勒拿rUVCrX圣文森特和格林纳丁斯rU054rX美拉尼西亚rUDJrX 吉布提rUFJrX斐济rU057rX密克罗尼西亚rU172rX 独联体rU053rX澳大利亚和新西兰rUNIrX 尼加拉瓜rUNLrX荷兰rUNOrX挪威rUNArX 纳米比亚rUVUrX 瓦努阿图rUNCrX新喀里多尼亚rUNErX 尼日尔rUNFrX 诺福克岛rUNGrX 尼日利亚rUNZrX 新西兰rUNPrX 尼泊尔rUNRrX瑙鲁rUNUrX纽埃rU061rX玻利尼西亚rUCIrX 象牙海岸rUCHrX瑞士rUCOrX 哥伦比亚rUCNrX中国rUCMrX 喀麦隆rUCLrX智利rUCCrX科科斯群岛rUCArX 加拿大rUCGrX刚果(布)rUCFrX中非共和国rUCDrX刚果(金)rUCZrX捷克共和国rUCYrX 塞浦路斯rUCXrX 圣诞岛rUCSrX塞尔维亚和黑山rUCRrX哥斯达黎加rUPYrX 巴拉圭rUCVrX 佛得角rUCUrX古巴rUSZrX 斯威士兰rUSYrX 叙利亚rUKGrX吉尔吉斯斯坦rUKErX 肯尼亚rUSRrX 苏里南rU143rX中亚rUKHrX 柬埔寨rUKNrX圣基茨和尼维斯rUKMrX 科摩罗rUSTrX圣多美和普林西比rUSKrX 斯洛伐克rUKRrX韩国rUSIrX斯洛文尼亚rUKPrX 北朝鲜rUKWrX 科威特rUSNrX 塞内加尔rUSMrX 圣马力诺rUSLrX 塞拉利昂rUSCrX塞舌尔群岛rUKZrX哈萨克斯坦rUKYrX 开曼群岛rUSGrX 新加坡rUSErX瑞典rUSDrX苏丹rU151rX东欧rU150rX欧洲r UDMr X 多米尼加r U155r X西欧r U154rX北欧rUVGrX英属维京群岛rUDErX德国rUYErX也门rUMHrX马绍尔群岛rU062rX 中南亚rUDZrX阿尔及利亚rUUSrX美国rUUYrX 乌拉圭rUYTr X 马约特r!UUMr"X美国边远小岛r#ULBr$X 黎巴嫩r%ULCr&X 圣卢西亚r'ULAr(X老挝人民民主共和国r)UTVr*X 图瓦卢r+UTWr,X台湾r-UTTr.X特立尼达和多巴哥r/UTRr0X 土耳其r1ULKr2X 斯里兰卡r3ULIr4X列支敦士登r5UCKr6X 库克群岛r7UTOr8X汤加r9ULTr:X 立陶宛r;ULUr<X 卢森堡r=ULRr>X 利比里亚r?ULSr@X 莱索托rAUTHrBX泰国rCUTFrDX法属南部领土rEUTGrFX多哥rGUTDrHX乍得rIUTCrJX特克斯和凯科斯群岛rKULYrLX 利比亚rMUVArNX 梵蒂冈rOU145rPX西亚rQUAErRX阿拉伯联合酋长国rSUADrTX 安道尔rUUAGrVX安提瓜和巴布达rWUAFrXX 阿富汗rYUAIrZX 安圭拉r[UVIr\X美属维京群岛r]UISr^X冰岛r_UIRr`X伊朗raUAMrbX 亚美尼亚rcUALrdX阿尔巴尼亚reUAOrfX 安哥拉rgUANrhX荷属安的列斯群岛riU003rjX 北美洲rkU002rlX非洲rmU001rnX世界roUARrpX 阿根廷rqUAUrrX 澳大利亚rsUATrtX 奥地利ruU005rvX 南美洲rwUINrxX印度ryUAXrzX 奥兰群岛r{U009r|X 大洋洲r}UAZr~X 阿塞拜疆rUIErX 爱尔兰rUIDrX印度尼西亚rUJOrX约旦rUQUrX欧盟rUUArX 乌克兰rUQArX 卡塔尔rUDKrX丹麦rUMZrX 莫桑比克rUQOrX大洋洲边远群岛ruUdecimal_formatsr}rNh*)r}r(h-Nh/Kh0KKrh2h3h3rh5KKrh7X #,##0.###rh9h3h:rhsUAfrica/Monroviar?}r@jX 蒙罗维亚rAsUAmerica/St_VincentrB}rCjX 圣文森特rDsUAmerica/VancouverrE}rFjX 温哥华rGsU Asia/ThimphurH}rIjX廷布rJsU Africa/AccrarK}rLjX 阿克拉rMsUAmerica/BelizerN}rOjX 伯利兹rPsUAmerica/Port_of_SpainrQ}rRjX 西班牙港rSsUAmerica/MendozarT}rUjX 门多萨rVsU Asia/TokyorW}rXjX东京rYsUPacific/KiritimatirZ}r[jX基里地马地岛r\sUAustralia/Sydneyr]}r^jX悉尼r_sU Europe/Rigar`}rajX里加rbsU Asia/Dilirc}rdjX帝力resUAfrica/Mbabanerf}rgjX 姆巴巴纳rhsU Asia/Oralri}rjjX 乌拉尔rksU Asia/Adenrl}rmjX亚丁rnsUEurope/Isle_of_Manro}rpjX 马恩岛rqsUEurope/Istanbulrr}rsjX伊斯坦布尔rtsU Asia/Magadanru}rvjX 马加丹rwsUAustralia/Lindemanrx}ryjX 林德曼rzsUPacific/Galapagosr{}r|jX加拉帕哥斯r}sUAmerica/Bogotar~}rjX 波哥大rsUAmerica/Dawsonr}rjX道森rsUAmerica/Chicagor}rjX 芝加哥rsUPacific/Kwajaleinr}rjX 夸贾林rsUAustralia/Broken_Hillr}rjX布罗肯希尔rsUAmerica/Cuiabar}rjX 库亚巴rsUIndian/Christmasr}rjX 圣诞岛rsU Asia/Jayapurar}rjX 查亚普拉rsUEurope/Brusselsr}rjX 布鲁塞尔rsU Europe/Lisbonr}rjX 里斯本rsUAsia/Chongqingr}rjX重庆rsUAmerica/Noronhar}rjX 洛罗尼亚rsUEurope/Podgoricar}rjX波德戈里察rsUAfrica/Algiersr}rjX 阿尔及尔rsU Africa/Hararer}rjX 哈拉雷rsUAfrica/Ndjamenar}rjX 恩贾梅纳rsUAmerica/Costa_Ricar}rjX哥斯达黎加rsUEurope/Ljubljanar}rjX 卢布尔维rsUIndian/Mayotter}rjX 马约特rsUAsia/Phnom_Penhr}rjX金边rsUAmerica/Managuar}rjX 马那瓜rsU Asia/Bruneir}rjX文莱rsUAmerica/Tijuanar}rjX 提华纳rsUPacific/Fakaofor}rjX 法考福rsUAmerica/Martiniquer}rjX 马提尼克rsUAmerica/Antiguar}rjX 安提瓜rsUAmerica/Argentina/La_Riojar}rjX 拉里奥哈rsUPacific/Tahitir}rjX 塔希提rsUAmerica/Pangnirtungr}rjX 旁涅唐rsU Europe/Zagrebr}rjX 萨格勒布rsUAmerica/Asuncionr}rjX 亚松森rsU Europe/Viennar}rjX 维也纳rsUAustralia/Hobartr}rjX 霍巴特rsUAmerica/Juneaur}rjX朱诺rsUAmerica/Inuvikr}rjX 伊努维克rsUAmerica/Montrealr}rjX 蒙特利尔rsU Asia/Seoulr}rjX首尔rsU Indian/Comoror}rjX 科摩罗rsUAntarctica/Rotherar}rjX 罗瑟拉rsUEurope/Tallinnr}rjX塔林rsU Indian/Maher}rjX马埃rsU Asia/Calcuttar}rjX 加尔各答rsU America/Adakr}rjX 艾德克rsUAsia/Singaporer}rjX 新加坡rsUAfrica/Nairobir}rjX 内罗毕rsUAmerica/Maceior}rjX 马塞约rsU Asia/Urumqir}r jX 乌鲁木齐r sU Europe/Moscowr }r jX 莫斯科r sUAsia/Pyongyangr}rjX平壤rsUAsia/Ulaanbaatarr}rjX 乌兰巴托rsUAmerica/Rainy_Riverr}rjX雨河rsUIndian/Maldivesr}rjX 马尔代夫rsU Asia/Colombor}rjX 科伦坡rsUAustralia/Adelaider}rjX 阿德莱德rsUAmerica/Cambridge_Bayr }r!jX坎布里季贝r"sU Africa/Luandar#}r$jX 罗安达r%sUPacific/Chathamr&}r'jX 查塔姆r(sUAmerica/Cordobar)}r*jX 科尔多瓦r+sU Asia/Tbilisir,}r-jX 第比利斯r.sUEurope/Gibraltarr/}r0jX 直布罗陀r1sU Asia/Karachir2}r3jX 卡拉奇r4sU Asia/Harbinr5}r6jX 哈尔滨r7sUAustralia/Lord_Hower8}r9jX 豪勋爵r:sUAmerica/Boa_Vistar;}r<jX博阿维斯塔r=sUAfrica/Tripolir>}r?jX 的黎波里r@sUIndian/ReunionrA}rBjX 留尼旺rCsUAtlantic/StanleyrD}rEjX 史丹利rFsUAmerica/Santo_DomingorG}rHjX 圣多明各rIsUAntarctica/SyowarJ}rKjX 斯尤瓦rLsUAmerica/JamaicarM}rNjX 牙买加rOsU Europe/KievrP}rQjX基辅rRsUEurope/BudapestrS}rTjX 布达佩斯rUsUPacific/MidwayrV}rWjX 中途岛rXsUAmerica/Goose_BayrY}rZjX 古斯湾r[sU Asia/Ammanr\}r]jX安曼r^sU Asia/Sakhalinr_}r`jX 萨哈林rasUAfrica/Windhoekrb}rcjX 温得和克rdsU Asia/Katmandure}rfjX 加德满都rgsUAmerica/Guyanarh}rijX 圭亚那rjsUAmerica/Sao_Paulork}rljX 圣保罗rmsUAustralia/Perthrn}rojX佩思rpsUAfrica/Djiboutirq}rrjX 吉布提rssU Asia/Jakartart}rujX 雅加达rvsUAntarctica/Palmerrw}rxjX 帕默尔rysUAfrica/Johannesburgrz}r{jX约翰内斯堡r|sU Asia/Irkutskr}}r~jX伊尔库茨克rsU Africa/Niameyr}rjX 尼亚美rsUAfrica/Casablancar}rjX卡萨布兰卡rsUAmerica/Indiana/Marengor}rjX 马伦戈rsUAfrica/Nouakchottr}rjX努瓦克肖特rsUEurope/Vilniusr}rjX 维尔纽斯rsUAmerica/Cayenner}rjX卡宴rsUAfrica/Mogadishur}rjX 摩加迪沙rsUAmerica/Kentucky/Monticellor}rjX 蒙蒂塞洛rsUAmerica/Rio_Brancor}rjX里奥布郎库rsUAmerica/Cancunr}rjX坎昆rsUAmerica/Havanar}rjX 哈瓦那rsU Pacific/Guamr}rjX关岛rsU Asia/Makassarr}rjX 望加锡rsUAtlantic/Azoresr}rjX亚述尔群岛rsUAustralia/Euclar}rjX 尤克拉rsU Asia/Shanghair}rjX上海rsUAmerica/Rankin_Inletr}rjX 雷今海口rsU Asia/Beirutr}rjX 贝鲁特rsU Africa/Maputor}rjX 马普托rsU Asia/Bahrainr}rjX巴林rsU Asia/Ashgabatr}rjX阿什哈巴德rsU Asia/Riyadhr}rjX 利雅得rsU Europe/Londonr}r(jX伦敦rUshortr}rUdaylightrXBSTrsuUAmerica/Monterreyr}rjX 蒙特雷rsUAmerica/Anguillar}rjX 安圭拉rsU Asia/Damascusr}rjX 大马士革rsUAmerica/North_Dakota/Centerr}rjX 北达科他rsUAmerica/Indiana/Vevayr}rjX维维市(印第安纳州)rsUAtlantic/St_Helenar}rjX 圣赫勒拿rsUAmerica/Barbadosr}rjX 巴巴多斯rsUEurope/Vaticanr}rjX 梵蒂冈rsUAmerica/Indiana/Vincennesr}rjX 温森斯rsU Asia/Almatyr}rjX 阿拉木图rsU Africa/Lomer}rjX洛美rsUAfrica/Brazzaviller}rjX 布拉扎维rsU America/Nomer}rjX诺姆rsU Asia/Taipeir}rjX台北rsUAmerica/Yakutatr}rjX 亚库塔特rsUAmerica/Araguainar}rjX阿拉瓜伊纳rsU Europe/Vaduzr}rjX 瓦杜兹rsU Africa/Asmerar}rjX 阿斯马拉rsUAntarctica/Mawsonr}r jX莫森r sUAmerica/Buenos_Airesr }r jX布宜诺斯艾利斯r sU Africa/Maserur }r jX 马塞卢r sUAmerica/Louisviller }r jX路易斯维尔r sU Asia/Kuchingr }r jX古晋r sUAfrica/Libreviller }r jX 利伯维尔r sUAfrica/Freetownr }r jX 弗里敦r sU Africa/Bissaur }r jX比绍r sU Europe/Samarar }r jX 萨马拉r sUEurope/Amsterdamr }r jX阿姆斯特丹r sU Europe/Tiraner }r jX 地拉那r sUPacific/Saipanr }r! jX塞班r" sUAfrica/Abidjanr# }r$ jX 阿比让r% sUEurope/Zaporozhyer& }r' jX 扎波罗热r( sUAmerica/El_Salvadorr) }r* jX 萨尔瓦多r+ sU Europe/Madridr, }r- jX 马德里r. sUAmerica/Santiagor/ }r0 jX 圣地亚哥r1 sU America/Arubar2 }r3 jX 阿鲁巴r4 sUAmerica/Indianapolisr5 }r6 jX印地安纳波利斯r7 sUAmerica/Reginar8 }r9 jX 里贾纳r: sU Pacific/Trukr; }r< jX特鲁克群岛r= sUPacific/Funafutir> }r? jX 富纳富提r@ sUAmerica/MeridarA }rB jX 梅里达rC sUAmerica/GuatemalarD }rE jX 危地马拉rF sUAfrica/Sao_TomerG }rH jX 圣多美rI sUPacific/KosraerJ }rK jX 库赛埃rL sUAfrica/BujumburarM }rN jX 布琼布拉rO sUEurope/ChisinaurP }rQ jX 基希讷乌rR sU Europe/WarsawrS }rT jX华沙rU sUAsia/YekaterinburgrV }rW jX叶卡捷林堡rX sUAntarctica/CaseyrY }rZ jX卡塞r[ sUAmerica/Halifaxr\ }r] jX哈利法克斯r^ sU America/Thuler_ }r` jX图勒ra sUAmerica/St_Johnsrb }rc jX 圣约翰rd sUAmerica/Monctonre }rf jX 蒙克顿rg sUEurope/Helsinkirh }ri jX 赫尔辛基rj sUAtlantic/Cape_Verderk }rl jX 佛得角rm sUAmerica/Tegucigalparn }ro jX特古西加尔巴rp sU Indian/Cocosrq }rr jX 可可斯rs sU America/Boisert }ru jX 博伊西rv sUAmerica/Guadelouperw }rx jX 瓜德罗普ry sUAmerica/Nassaurz }r{ jX拿骚r| sU Europe/Praguer} }r~ jX 布拉格r sUPacific/Enderburyr }r jX 恩德贝里r sU Asia/Hovdr }r jX 科布多r sUAmerica/Manausr }r jX 马瑙斯r sUAmerica/Godthabr }r jX 戈特霍布r sUAmerica/Catamarcar }r jX 卡塔马卡r sUAmerica/Chihuahuar }r jX 奇瓦瓦r sUAmerica/Iqaluitr }r jX伊魁鲁伊特r sUAmerica/Argentina/Rio_Gallegosr }r jX里奥加耶戈斯r sUPacific/Gambierr }r jX 甘比尔r sUEurope/Volgogradr }r jX伏尔加格勒r sU Africa/Bamakor }r jX 巴马科r sUEurope/Uzhgorodr }r jX乌日戈罗德r sU Africa/Banjulr }r jX 班珠尔r sU Asia/Aqtaur }r jX 阿克图r sU Africa/Malabor }r jX 马拉博r sUAtlantic/Madeirar }r jX 马德拉r sUPacific/Noumear }r jX 努美阿r sUAfrica/Kinshasar }r jX 金沙萨r sU Europe/Maltar }r jX 马耳他r sUAmerica/Argentina/Ushuaiar }r jX 乌斯怀亚r sU Asia/Bangkokr }r jX曼谷r sU Pacific/Niuer }r jX纽埃r sUAustralia/Brisbaner }r jX 布里斯班r sUAmerica/Recifer }r jX 累西腓r sU Asia/Yerevanr }r jX 埃里温r sUAmerica/La_Pazr }r jX 拉巴斯r sU Africa/Cairor }r jX开罗r sU Africa/Lusakar }r jX 卢萨卡r sUPacific/Guadalcanalr }r jX瓜达尔卡纳尔r sUAmerica/Yellowknifer }r jX 耶洛奈夫r sUAsia/Vientianer }r jX万象r sUEurope/Kaliningradr }r jX加里宁格勒r sUAfrica/Conakryr }r jX 科纳克里r sUAmerica/Argentina/Tucumanr }r jX 图库曼r sU Europe/Oslor }r jX 奥斯陆r sUAmerica/St_Kittsr }r jX 圣基茨r sUAmerica/Panamar }r jX 巴拿马r sUAfrica/Gaboroner }r jX 哈博罗内r sU Pacific/Palaur }r jX帕劳r sUAmerica/Guayaquilr }r jX 瓜亚基尔r sUAsia/Kuala_Lumpurr }r jX 吉隆坡r sUAtlantic/Faeroer }r jX法罗r sUAmerica/Menomineer }r jX 密诺米尼r sUAsia/Kamchatkar }r jX 堪察加r sUAsia/Vladivostokr }r jX符拉迪沃斯托克r sU Asia/Qatarr }r jX 卡塔尔r sU Asia/Dubair }r jX迪拜r sU Asia/Yakutskr }r jX 雅库茨克r sU Asia/Omskr }r jX 鄂木斯克r sU Africa/Banguir }r jX班吉r sUAmerica/Paramaribor }r jX帕拉马利玻r sUAfrica/Lubumbashir }r jX 卢本巴希r sUPacific/Marquesasr }r jX 马克萨斯r sUEurope/Bratislavar }r jX布拉迪斯拉发r! sU Asia/Anadyrr" }r# jX 阿纳德尔r$ sUAmerica/New_Yorkr% }r& jX纽约r' sUPacific/Norfolkr( }r) jX 诺福克r* sUPacific/Rarotongar+ }r, jX 拉罗汤加r- sUAmerica/Dominicar. }r/ jX 多米尼加r0 sUAfrica/Porto-Novor1 }r2 jX 波多诺伏r3 sUAsia/Samarkandr4 }r5 jX 撒马尔罕r6 sU Asia/Dushanber7 }r8 jX 杜尚别r9 sUAmerica/Torontor: }r; jX 多伦多r< sU America/Bahiar= }r> jX 巴伊亚r? sUAfrica/Kampalar@ }rA jX 坎帕拉rB sUAfrica/OuagadougourC }rD jX 瓦加杜古rE sUAntarctica/South_PolerF }rG jX南极rH sU Asia/MuscatrI }rJ jX 马斯喀特rK sUAmerica/EdmontonrL }rM jX 埃德蒙顿rN sU Pacific/WakerO }rP jX威克rQ sUAustralia/DarwinrR }rS jX 达尔文rT sUAmerica/WhitehorserU }rV jX 怀特霍斯rW sUAmerica/Swift_CurrentrX }rY jX斯威夫特卡伦特rZ sUEurope/Copenhagenr[ }r\ jX 哥本哈根r] sUAmerica/Montserratr^ }r_ jX蒙特塞拉特r` sU Asia/Tashkentra }rb jX 塔什干rc sUEurope/Simferopolrd }re jX辛菲罗波尔rf sUAfrica/Blantyrerg }rh jX 布兰太尔ri sUAmerica/Detroitrj }rk jX 底特律rl sUAmerica/Shiprockrm }rn jX 舰石城ro sUAmerica/Grenadarp }rq jX 格林纳达rr sUAmerica/Indiana/Petersburgrs }rt jX 彼得斯堡ru sUAsia/Pontianakrv }rw jX坤甸rx sUAfrica/Dar_es_Salaamry }rz jX达累斯萨拉姆r{ sUAmerica/Port-au-Princer| }r} jX 太子港r~ sUAmerica/Caymanr }r jX开曼r sU Europe/Athensr }r jX雅典r sUAmerica/Curacaor }r jX 库拉卡r sUIndian/Kerguelenr }r jX 凯尔盖朗r sUAfrica/Khartoumr }r jX 哈土穆r sU Asia/Manilar }r jX 马尼拉r sUEurope/Sarajevor }r jX 萨拉热窝r sU America/Jujuyr }r jX 胡胡伊r sU Africa/Doualar }r jX 杜阿拉r sU Europe/Romer }r jX罗马r sUAmerica/Argentina/San_Juanr }r jX 圣胡安r sUPacific/Port_Moresbyr }r jX莫尔兹比港r sU Europe/Jerseyr }r jX 泽西岛r sUEurope/Andorrar }r jX 安道尔r sUEurope/Luxembourgr }r jX 卢森堡r sUPacific/Honolulur }r jX 檀香山r sUAmerica/St_Thomasr }r jX 圣托马斯r sUPacific/Majuror }r jX 马朱罗r sUAmerica/Mazatlanr }r jX 马萨特兰r sU Asia/Macaur }r jX澳门r sUEurope/Belgrader }r jX贝尔格莱德r sUAsia/Choibalsanr }r jX 卓巴尔塞r sUEurope/Mariehamnr }r jX 玛丽港r sUAntarctica/McMurdor }r jX 马克默多r sUAmerica/Thunder_Bayr }r jX 桑德贝r sUAmerica/Los_Angelesr }r jX 洛杉矶r sU Asia/Kabulr }r jX 喀布尔r sUIndian/Antananarivor }r jX安塔那利佛r sUAtlantic/Reykjavikr }r jX雷克雅未克r sU Asia/Nicosiar }r jX 尼科西亚r sUPacific/Ponaper }r jX 波纳佩岛r sUPacific/Tongatapur }r jX 东加塔布r sUPacific/Pitcairnr }r jX 皮特凯恩r sUPacific/Easterr }r jX 复活节岛r sUAtlantic/South_Georgiar }r jX 南乔治亚r sUAfrica/El_Aaiunr }r jX 阿尤恩r sUAmerica/Campo_Grander }r jX 大坎普r sUAmerica/Dawson_Creekr }r jX道森克里克r sUAntarctica/Vostokr }r jX 沃斯托克r sUEurope/Bucharestr }r jX布加勒斯特r sUAmerica/Porto_Velhor }r jX 波多韦柳r sU Europe/Monacor }r jX 摩纳哥r sU Asia/Bishkekr }r jX 比什凯克r sU Africa/Ceutar }r jX休达r sUAmerica/Winnipegr }r jX 温尼伯r sU Asia/Aqtober }r jX 阿克托别r sU Africa/Dakarr }r jX 达喀尔r sUAmerica/Fortalezar }r jX 福塔雷萨r sUPacific/Tarawar }r jX 塔拉瓦r sUAfrica/Addis_Ababar }r jX亚的斯亚贝巴r sU Pacific/Efater }r jX 埃法特r sUPacific/Johnstonr }r jX 约翰斯顿r sUAsia/Qyzylordar }r jX克孜勒奥尔达r sUEurope/San_Marinor }r jX 圣马力诺r sUAsia/Jerusalemr! }r" jX 耶路撒冷r# sUPacific/Aucklandr$ }r% jX 奥克兰r& sUAmerica/Tortolar' }r( jX 托尔托拉r) sUAmerica/Denverr* }r+ jX丹佛r, sU Indian/Chagosr- }r. jX 查戈斯r/ sUAmerica/Glace_Bayr0 }r1 jX 格莱斯贝r2 sUAmerica/Hermosillor3 }r4 jX 埃莫西约r5 sU Africa/Tunisr6 }r7 jX 突尼斯r8 sUAmerica/Montevideor9 }r: jX蒙得维的亚r; sU Asia/Gazar< }r= jX加沙r> sU Europe/Dublinr? }r@ jX 都柏林rA sUAntarctica/DumontDUrvillerB }rC jX杜蒙杜威勒rD sUAmerica/Indiana/KnoxrE }rF jX 诺克斯rG sUAsia/NovosibirskrH }rI jX诺沃西比尔斯克rJ sU Africa/KigalirK }rL jX 基加利rM sUAmerica/Grand_TurkrN }rO jX 大土耳其rP sU Africa/LagosrQ }rR jX 拉各斯rS sU Europe/SofiarT }rU jX 索非亚rV sU America/LimarW }rX jX利马rY sU Etc/UnknownrZ }r[ jX未知r\ sUAmerica/Anchorager] }r^ jX 安克雷奇r_ sU Pacific/Naurur` }ra jX瑙鲁rb suUscriptsrc }rd (UGurure X果鲁穆奇语rf UHebrrg X 希伯来语rh UZzzzri X脚本未知或者无效rj UPhnxrk X 腓尼基语rl UMoonrm X 韩文语系rn UChamro X占语rp UArabrq X 阿拉伯语rr UGujrrs X古吉拉特语rt UZxxxru X 撤销写入rv ULycirw X 利西亚语rx USinhry X 辛哈拉语rz UTalur{ X 新傣文r| UMongr} X 蒙古语r~ UXpeor X 古波斯语r UVispr X 可见语音r URjngr X 拉让语r UOlckr X 桑塔利语r UTaler X 泰乐语r UMandr X 阿拉米语r UMlymr X马拉亚拉姆语r UTibtr X藏语r UKalir X克耶李文字r UJpanr X日语r UPlrdr X波拉德音标文字r UKanar X 片假名r ULydir X 吕底亚语r ULepcr X 雷布查语r USundr X 巽他文r UYiiir X彝语r UJavar X 爪哇语r UOryar X 奥里亚语r ULaoor X 老挝语r UUgarr X乌加里特语r UCyrlr X 西里尔语r UVaiir X 瓦依语r UArmnr X亚美尼亚语r UCyrsr X3西里尔文字(古教会斯拉夫语的变体)r UKhmrr X 高棉语r USylor XSyloti Nagri 书写体r UItalr X古意大利语r USgnwr X 书写符号r UXsuxr X苏美尔-阿卡德楔形文字r UThaar X 塔安娜语r UThair X泰语r UCprtr X塞浦路斯语r ULinbr X线形文字 Br ULinar X线形文字 Ar UOsmar X奥斯曼亚语r USaurr X索拉什特拉语r UHirar X 平假名r UHanir X汉语r UEgydr X后期埃及语r UQaair X遗传学术语r UEgyhr X古埃及僧侣书写体r UCansr X加拿大土著统一符号语r UEgypr X古埃及象形文r UTfngr X 提非纳文r UShawr X萧伯纳式语r UCirtr X 色斯文r UGeorr X格鲁吉亚语r UTengr X 格瓦文字r UHrktr X片假名或平假名r UGeokr X0格鲁吉亚语文字 (Asomtavruli and Nuskhuri)r UOgamr X 欧甘语r UDsrtr X德塞莱特文r UGothr X 哥特语r UHanor X 汉奴罗语r UBalir X 巴厘语r UKorer X 朝鲜语r UHangr X韩语r UCarir X 卡里亚语r UTagbr X塔格班瓦语r UHansr X 简体中文r UHantr X 繁体中文r URoror X朗格朗格文r UDevar X梵文r UIndsr X古希腊哈拉潘r UBopor X 汉语拼音r UMymrr X缅甸r UTglgr X 塔加路语r UPermr X古彼尔姆诸语r UBugir X 布吉语r UPhagr X 八思巴文r UBrair X布莱叶盲文r UBrahr X婆罗米文字r UBatkr X 巴塔克语r UMeror X麦若提克文r ULimbr X 林布语r UMteir X曼尼普尔语r UTelur X 泰卢固语r UTamlr X 泰米尔语r USarar X 沙拉堤文r ULatgr X拉丁文(盖尔语变体)r ULatfr X$拉丁文(哥特式字体变体)r UKharr! X卡罗须提文r" UNkoor# XN’Ko(西非书面语言)r$ ULatnr% X 拉丁语r& UMayar' X玛雅圣符文r( ULanar) X 兰拿语r* UEthir+ X埃塞俄比亚语r, UHmngr- X杨松录苗文r. UBuhdr/ X 布希德语r0 UCoptr1 X 克普特语r2 UGlagr3 X格拉哥里语r4 URunrr5 X古代北欧文r6 UOrkhr7 X 鄂尔浑文r8 UHungr9 X古匈牙利语r: UGrekr; X 希腊语r< UCherr= X 切罗基语r> UZyyyr? X通用r@ USyrcrA X 叙利亚语rB UBlisrC X布列斯符号rD UBengrE X 孟加拉语rF USyrerG X福音体叙利亚文rH USyrjrI X西叙利亚语rJ USyrnrK X东叙利亚语rL UKndarM X卡纳塔克语rN uUvariantsrO }rP (UAREVMDArQ X西亚美尼亚语rR UFONIPArS X 国际音标rT U1996rU X1996 年的德语拼字学rV UREVISEDrW X已修订的拼字学rX UAREVELArY X东亚美尼亚语rZ UPOLYTONr[ X多音r\ USAAHOr] X萨霍r^ U1901r_ X传统德语拼字学r` uUnumber_symbolsra }rb (Udecimalrc X.rd Ugroupre X,rf uUcurrency_namesrg }rh (UXXXri X货币未知或无效rj UDZDrk X阿尔及利亚第纳尔rl ULVRrm X拉脱维亚卢布rn UGHSro X 加纳塞迪rp UBOPrq X玻利维亚比索rr UEGPrs X 埃及镑rt UBGLru X保加利亚硬列弗rv UBGNrw X保加利亚新列弗rx UPABry X巴拿马巴波亚rz UYUMr{ X南斯拉夫偌威第纳尔r| UZWDr} X津巴布韦元r~ UGHCr X 加纳塞第r UXBDr X欧洲计算单位 (XBD)r UBOBr X玻利维亚诺r UXBAr X欧洲复合单位r UDKKr X 丹麦克朗r UXBCr X欧洲计算单位 (XBC)r UXBBr X欧洲货币联盟r UBWPr X博茨瓦纳普拉r ULBPr X 黎巴嫩镑r UTZSr X坦桑尼亚先令r UVNDr X 越南盾r UNADr X纳米比亚元r UAOAr X安哥拉宽扎r UWSTr X西萨摩亚塔拉r UAONr X安哥拉新宽扎 (1990-2000)r UKHRr X柬埔寨瑞尔r UMYRr X马来西亚林吉特r UAOKr X安哥拉宽扎 (1977-1990)r USOSr X索马里先令r UKYDr X 开曼元r ULYDr X利比亚第纳尔r UUAHr X乌克兰格里夫尼亚r UUAKr X 乌克兰币r UUGXr X乌干达先令r UJODr X约旦第纳尔r UAORr X&安哥拉宽扎 Reajustado (1995-1999)r USURr X 苏联卢布r UAWGr X阿鲁巴基尔德元r jX沙特里亚尔r UFIMr X 芬兰马克r jX港元r USRGr X 苏里南盾r UTPEr X帝汶埃斯库多r UMGFr X马达加斯加法郎r UCHFr X 瑞士法郎r UGIPr X直布罗陀镑r UBYRr X白俄罗斯卢布r UALLr X阿尔巴尼亚列克r UXPDr X钯r UUGSr X乌干达先令 (1966-1987)r UMROr X毛里塔尼亚乌吉亚r UBOVr X玻利维亚 Mvdol(资金)r UHRKr X克罗地亚库纳r UDJFr X吉布提法郎r UHRDr X克罗地亚第纳尔r UPESr X 秘鲁索尔r UEQEr X 埃奎勒r jX意大利里拉r UXAFr X中非金融合作法郎r UBNDr X 文莱元r UISKr X 冰岛克朗r UZALr X南非兰特 (金融)r USRDr X 苏里南元r UNIOr X尼加拉瓜金科多巴r ULAKr X 老挝基普r UNICr X尼加拉瓜科多巴r UNPRr X尼泊尔卢比r UMZEr X莫桑比克埃斯库多r UUYUr X乌拉圭比索r ULUCr X卢森堡可兑换法郎r UJMDr X 牙买加元r UFRFr X 法国法郎r UMAFr X摩洛哥法郎r UMZMr X莫桑比克梅蒂卡尔r UMZNr X莫桑比克美提卡r UPHPr X菲律宾比索r UZARr X 南非兰特r URHDr X罗得西亚元r UGWPr X几内亚比绍比索r ULUFr X卢森堡法郎r UBELr X比利时法郎(金融)r UBECr X比利时法郎兑换券r UNGNr X尼日利亚奈拉r UYUNr X南斯拉夫可兑换第纳尔r UBEFr X比利时法郎r UPLZr X波兰兹罗提 (1950-1995)r UCRCr X哥斯达黎加科朗r UTRLr X土耳其里拉r UDEMr X 德国马克r UEEKr X爱沙尼亚克朗r UMWKr X马拉维克瓦查r UTTDr X特立尼达和多巴哥元r ULKRr X斯里兰卡卢比r! USKKr" X斯洛伐克克朗r# UCVEr$ X佛得角埃斯库多r% UPKRr& X巴基斯坦卢比r' UHUFr( X匈牙利福林r) UROLr* X旧罗马尼亚列伊r+ UXEUr, X欧洲货币单位r- UBMDr. X 百慕大元r/ UOMRr0 X阿曼里亚尔r1 ULSLr2 X莱索托洛蒂r3 ULSMr4 X 马洛蒂r5 UMNTr6 X蒙古图格里克r7 UAMDr8 X亚美尼亚德拉姆r9 UYUDr: X南斯拉夫硬第纳尔r; UBUKr< X缅元r= USYPr> X 叙利亚镑r? UQARr@ X卡塔尔里亚尔rA UXDRrB X特别提款权rC UNLGrD X 荷兰盾rE UGEKrF X乔治亚库蓬拉瑞特rG UMTPrH X 马耳他镑rI UGBPrJ X英镑rK UGELrL X乔治亚拉瑞rM USHPrN X圣赫勒拿镑rO UAFNrP X 阿富汗尼rQ USBDrR X所罗门群岛元rS UCSKrT X捷克硬克郎rU UKPWrV X 朝鲜圆rW UXRErX X RINET 基金rY UCSDrZ X旧塞尔维亚第纳尔r[ UAFAr\ X阿富汗尼 (1927-2002)r] UTHBr^ X泰铢r_ UBYBr` X!白俄罗斯新卢布 (1994-1999)ra UBDTrb X孟加拉塔卡rc UGRDrd X希腊德拉克马re UYERrf X也门里亚尔rg UDDMrh X东德奥斯特马克ri USZLrj X斯威士兰里兰吉尼rk UHTGrl X 海地古德rm UTRYrn X新土耳其里拉ro UMGArp X马达加斯加阿里亚里rq UANGrr X荷兰安替兰盾rs ULRDrt X 利比亚元ru URWFrv X卢旺达法郎rw UNOKrx X 挪威克朗ry UMXVrz X/墨西哥 Unidad de Inversion (UDI)(资金)r{ UKESr| X肯尼亚先令r} jX 澳门元r~ UINRr X 印度卢比r UMXNr X墨西哥比索r UCZKr X 捷克克郎r UTJSr X塔吉克斯坦索莫尼r UTJRr X塔吉克斯坦卢布r UBTNr X不丹努扎姆r UYDDr X也门第纳尔r UGWEr X葡萄牙几内亚埃斯库多r UCOPr X哥伦比亚比索r UMTLr X马耳他里拉r UMURr X毛里求斯卢比r UIDRr X印度尼西亚盾r UHNLr X洪都拉斯拉伦皮拉r UXPFr X太平洋法郎r UFJDr X 斐济元r UETBr X埃塞俄比亚比尔r UPENr X秘鲁新索尔r UBZDr X 伯利兹元r UATSr X奥地利先令r UILPr X 以色列镑r UZRNr X 新扎伊尔r UDOPr X多米尼加比索r ULULr X卢森堡金融法郎r UTMMr X土库曼斯坦马纳特r jX 新台币元r UMDLr X摩尔多瓦列伊r UXPTr X铂r UECVr X,厄瓜多尔 Unidad de Valor Constante (UVC)r UECSr X厄瓜多尔苏克雷r UBSDr X 巴哈马元r USEKr X 瑞典克朗r UTOPr X 汤加潘加r UPEIr X 秘鲁印锑r UZMKr X赞比亚克瓦查r UMVRr X马尔代夫拉菲亚r UXTSr X为测试保留的代码r UAUDr X澳大利亚元r UADPr X安道尔比塞塔r UCUPr X 古巴比索r UIEPr X 爱尔兰镑r UCLFr X&智利 Unidades de Fomento(资金)r UBBDr X巴巴多斯元r UKMFr X科摩罗法郎r jX韩圆r UGMDr X冈比亚达拉西r UVEFr XVenezuelan Bolivar Fuerter UGTQr X危地马拉格查尔r UVEBr X委内瑞拉博利瓦r UXOFr X非洲金融共同体法郎r USITr X斯洛文尼亚托拉尔r USDPr X 旧苏丹镑r UCLPr X 智利比索r UEURr X欧元r UCDFr X 刚果法郎r UXCDr X东加勒比元r UKZTr X哈萨克斯坦坚戈r URUBr X 俄国卢布r UXFUr X法国 UIC 法郎r UXAGr X银r UBRRr X巴西克鲁塞罗r UBRNr X巴西克鲁扎多 Novor UBRLr X巴西雷亚尔r UMMKr X缅甸开亚特r UUYPr X乌拉圭新比索 (1975-1993)r URURr X俄国卢布 (1991-1998)r UPLNr X波兰兹罗提rUBRErX巴西克鲁塞罗 (1990-1993)rUPYGrX巴拉圭瓜拉尼rUBRCrX巴西克鲁扎多rUBRBrX#巴西克鲁赛罗 Novo (1967-1986)rUSVCr X萨尔瓦多科朗r UAEDr X阿联酋迪拉姆r UGNSr X几内亚西里rUMKDrX马其顿戴代纳尔rUAZMrX!阿塞拜疆马纳特 (1993-2006)rUAZNrX阿塞拜疆马纳特rUUSNrX美元(次日)rUGQErX赤道几内亚埃奎勒rUVUVrX瓦努阿图瓦图rUBADrX%波士尼亚-赫塞哥维纳第纳尔rUGNFrX几内亚法郎rUMXPrX墨西哥银比索 (1861-1992)r UIQDr!X伊拉克第纳尔r"UERNr#X厄立特里亚纳克法r$UBAMr%X%波士尼亚-赫塞哥维纳兑换券r&USCRr'X塞舌尔卢比r(UCADr)X 加拿大元r*USDDr+X苏丹第纳尔r,UCYPr-X塞浦路斯镑r.UMADr/X摩洛哥迪拉姆r0UKWDr1X科威特第纳尔r2UBIFr3X布隆迪法郎r4ULTTr5X立陶宛塔咯呐司r6UPGKr7X巴布亚新几内亚基那r8ULTLr9X立陶宛立特r:jX 新加坡元r;UUZSr<X乌兹别克斯苏姆r=USTDr>X!圣多美和普林西比多布拉r?UXFOr@X法国金法郎rAUMLFrBX 马里法郎rCUESPrDX西班牙比塞塔rEUIRRrFX伊朗里亚尔rGUZRZrHX 扎伊尔rIjX 人民币rJUSLLrKX塞拉利昂利昂rLUTNDrMX突尼斯第纳尔rNUGYDrOX 圭亚那元rPUESBrQX$西班牙比塞塔(兑换帐户)rRUESArSX 西班牙比塞塔(帐户 A)rTUNZDrUX 新西兰元rVUFKPrWX 福克兰镑rXULVLrYX拉脱维亚拉特rZUUSSr[X美元(当日)r\UUSDr]X美元r^UARPr_X阿根廷比索 (1983-1985)r`UKGSraX吉尔吉斯斯坦索姆rbUARSrcX阿根廷比索rdUILSreX以色列新谢克尔rfURONrgX罗马尼亚列伊rhURSDriX塞尔维亚第纳尔rjUBHDrkX巴林第纳尔rlUJPYrmX日元rnUARAroX阿根廷奥斯特rpUSDGrqX 苏丹镑rrUPTErsX葡萄牙埃斯库多rtUXAUruX黄金rvuUmonthsrw}rx(U stand-alonery}rz(Uwider{}r|(KX一月r}KX二月r~KX三月rKX四月rKX五月rKX六月rKX七月rKX八月rK X九月rK X十月rK X 十一月rK X 十二月ruU abbreviatedr}r(KX一月rKX二月rKX三月rKX四月rKX五月rKX六月rKX七月rKX八月rK X九月rK X十月rK X 十一月rK X 十二月ruUnarrowr}r(KX1月rKX2月rKX3月rKX4月rKX5月rKX6月rKX7月rKX8月rK X9月rK X10月rK X11月rK X12月ruuUformatr}r(Uwider}r(KX1月rKX2月rKX3月rKX4月rKX5月rKX6月rKX7月rKX8月rK X9月rK X10月rK X11月rK X12月ruU abbreviatedr}r(KX1月rKX2月rKX3月rKX4月rKX5月rKX6月rKX7月rKX8月rK X9月rK X10月rK X11月rK X12月ruuuUcurrency_formatsr}rNh*)r}r(h-Nh/Kh0KKrh2h3h3rh5KKrh7X ¤#,##0.00rh9X¤rX-¤rrhjX阿克约宾斯克夏令时间r?jX阿克约宾斯克标准时间r@uuUBeringrA}rB(jj}rC(jX 白令时间rDjX白令夏令时间rEjX白令标准时间rFuuU QyzylordarG}rH(jj}rI(jX克孜勒奥尔达时间rJjX克孜勒奥尔达夏令时间rKjX克孜勒奥尔达标准时间rLuuUFrunzerM}rN(jj}rO(jX伏龙芝时间rPjX伏龙芝夏令时间rQjX伏龙芝标准时间rRuuU Dutch_GuianarS}rT(jj}rU(jX荷属圭亚那时间rVjX荷属圭亚那夏令时间rWjX荷属圭亚那标准时间rXuuUYerevanrY}rZ(jj}r[(jX埃里温时间r\jX埃里温夏令时间r]jX埃里温标准时间r^uuUKashgarr_}r`(jj}rajX喀什标准时间rbsuU East_Timorrc}rd(jj}re(jX东帝汶时间rfjX东帝汶夏令时间rgjX东帝汶标准时间rhuuUAfrica_Easternri}rj(j}rkjX东部非洲时间rlsjj}rm(jX非洲东部时间rnjX东部非洲时间rouuU Ashkhabadrp}rq(jj}rr(jX阿什哈巴德时间rsjX阿什哈巴德夏令时间rtjX阿什哈巴德标准时间ruuuUAlaskarv}rw(j}rx(jX阿拉斯加夏令时间ryjX阿拉斯加标准时间rzujj}r{(jX阿拉斯加时间r|jX阿拉斯加夏令时间r}jX阿拉斯加标准时间r~uuUAmerica_Easternr}r(jj}r(jX美国东部时间rjX东部夏令时间rjX东部标准时间ruuUAmerica_Centralr}r(jj}r(jX美国中部时间rjX中部夏令时间rjX中部标准时间ruuUPakistanr}r(jj}r(jX巴基斯坦时间rjX巴基斯坦夏令时间rjX巴基斯坦标准时间ruuUSamoar}r(j}rjX瑞典夏令时间rsjj}r(jX萨摩亚时间rjX萨摩亚夏令时间rjX萨摩亚标准时间ruuUMacaur}r(jj}r(jX 澳门时间rjX澳门夏令时间rjX澳门标准时间ruuUChamorror}r(j}rjX查莫罗标准时区rsjj}rjX查莫罗标准时区rsuUGuamr}r(j}r(jX 关岛时间rjX关岛夏令时间rjX关岛标准时间rujj}r(jX 关岛时间rjX关岛夏令时间rjX关岛标准时间ruuUIndiar}r(jj}rjX印度标准时间rsuU Azerbaijanr}r(jj}r(jX阿塞拜疆时间rjX阿塞拜疆夏令时间rjX阿塞拜疆标准时间ruuU Tajikistanr}r(jj}r(jX塔吉克斯坦时间rjX塔吉克斯坦夏令时间rjX塔吉克斯坦标准时间ruuUTurkeyr}r(j}r(jX土耳其夏令时间rjX土耳其时间rujj}r(jX土耳其时间rjX土耳其夏令时间rjX土耳其时间ruuU Afghanistanr}r(jj}rjX阿富汗時間rsuU Choibalsanr}r(jj}r(jX乔巴山时间rjX乔巴山夏令时间rjX乔巴山标准时间ruuU Vladivostokr}r(jj}r(jX海參崴夏令時間rjX海參崴時間ruuU Shevchenkor}r(jj}r(jX舍甫琴科夏令时间rjX舍甫琴科时间ruuU Bangladeshr}r(j}r(jXBDTrjX孟加拉夏令时间rujj}r(jX孟加拉时间rjX孟加拉夏令时间rjX孟加拉标准时间ruuUGulfr}r(jj}rjX海湾标准时间rsuUDaccar}r(jj}r(jX 达卡时间rjX达卡夏令时间rjX达卡标准时间ruuUMongoliar}r(jj}r(jX乌兰巴托时间rjX乌兰巴托夏令时间rjX乌兰巴托标准时间ruuU Samarkandr}r(jj}r(jX撒马尔罕时间rjX撒马尔罕夏令时间rjX撒马尔罕标准时间ruuUPerur}r(jj}r(jX秘魯夏令時間rjX 秘魯時間ruuUIndonesia_Centralr}r(jj}rjX!印度尼西亚中部标准时间rsuUKorear}r(jj}r(jX 韩国时间rjX韩国夏令时间rjX韩国标准时间r uuUCubar }r (jj}r (jX 古巴時間r jX古巴夏令時間rjX古巴標準時間ruuUIrkutskr}r(jj}r(jX伊爾庫茨克夏令時間rjX伊爾庫茨克時間ruuUArgentina_Westernr}r(jj}r(jX阿根廷西部时间rjX阿根廷西部夏令时间rjX阿根廷西部标准时间ruuUAmazonr}r(jj}r(jX亚马逊时间rjX亚马逊夏令时间rjX亚马逊标准时间r uuUChinar!}r"(j}r#(jXCT(中国)r$jXCDT(中国)r%jXCST(中国)r&ujj}r'(jX 中国时间r(jX中国夏令时间r)jX中国标准时间r*uuULong_Shur+}r,(jj}r-(jXLong-Shu 时间r.jXLong-Shu 夏令时间r/jXLong-Shu 标准时间r0uuUArmeniar1}r2(j}r3(jX AMT (Armenia)r4jXAMDT (Armenia)r5jXAMST (Armenia)r6ujj}r7(jX亚美尼亚时间r8jX亚美尼亚夏令时间r9jX亚美尼亚标准时间r:uuUGreenland_Westernr;}r<(jj}r=(jX格林兰西部时间r>jX格林兰西部夏令时间r?jX格林兰西部标准时间r@uuUKarachirA}rB(jj}rC(jX卡拉奇时间rDjX卡拉奇夏令时间rEjX卡拉奇标准时间rFuuUSakhalinrG}rH(jj}rI(jX庫頁島夏令時間rJjX庫頁島時間rKuuUBrasiliarL}rM(jj}rN(jX巴西利亚时间rOjX巴西利亚夏令时间rPjX巴西利亚标准时间rQuuU French_GuianarR}rS(jj}rTjX法屬圭亞那時間rUsuUAfrica_SouthernrV}rW(j}rX(jX南部非洲时间rYjX南部非洲标准时间rZujj}r[(jX非洲南部时间r\jX南部非洲标准时间r]uuU Newfoundlandr^}r_(j}r`(jX纽芬兰夏令时间rajX纽芬兰标准时间rbujj}rc(jX纽芬兰时间rdjX纽芬兰夏令时间rejX纽芬兰标准时间rfuuU Kyrgystanrg}rh(jj}ri(jXKyrgystan 时间rjjXKyrgystan 夏令时间rkjXKyrgystan 标准时间rluuUKazakhstan_Westernrm}rn(jj}ro(jX哈萨克斯坦西部时间rpjX!哈萨克斯坦西部标准时间rquuUAfrica_Centralrr}rs(j}rtjX中部非洲时间rusjj}rv(jX非洲中部时间rwjX中部非洲时间rxuuUMalaysiary}rz(jj}r{(jX马来西亚时间r|jX马来西亚夏令时间r}jX马来西亚标准时间r~uuU Novosibirskr}r(jj}r(jX新西伯利亞夏令時間rjX新西伯利亞時間ruuUJapanr}r(jj}r(jX 日本時間rjX日本夏令时间rjX日本标准时间ruuU Sverdlovskr}r(jj}r(jX斯维尔德洛夫斯克时间rjX$斯维尔德洛夫斯克夏令时间rjX$斯维尔德洛夫斯克标准时间ruuU Kwajaleinr}r(j}rjX夸贾林时间rsjj}r(jX夸贾林时间rjX夸贾林夏令时间rjX夸贾林时间ruuUAqtober}r(jj}r(jX阿克托别时间rjX阿克托别夏令时间rjX阿克托别标准时间ruuUKazakhstan_Easternr}r(jj}r(jX哈萨克斯坦东部时间rjX!哈萨克斯坦东部标准时间ruuUAustralia_CentralWesternr}r(j}r(jX!澳大利亚中西部夏令时间rjX!澳大利亚中西部标准时间rujj}r(jX!澳大利亚中西部夏令时间rjX!澳大利亚中西部标准时间ruuU Yekaterinburgr}r(jj}r(jX叶卡捷琳堡时间rjX叶卡捷琳堡夏令时间rjX叶卡捷琳堡标准时间ruuUHovdr}r(jj}r(jX科布多夏令時間rjX科布多時間ruuUEcuadorr}r(jj}rjX厄瓜多尔标准时间rsuUMalayar}r(jj}r(jX马来亚时间rjX马来亚夏令时间rjX马来亚标准时间ruuUBruneir}r(jj}rjX 汶萊時間rsuUIranr}r(jj}r(jX伊朗夏令時間rjX伊朗標準時間ruuUAqtaur}r(jj}r(jX阿克图时间rjX阿克图夏令时间rjX阿克图标准时间ruuUAmerica_Mountainr}r(jj}r(jX美国山区时间rjX山区夏令时间rjX山区标准时间ruuUHawaii_Aleutianr}r(j}rjX!夏威夷—阿留申标准时间rsjj}rjX!夏威夷—阿留申标准时间rsuUChangbair}r(jj}rjX长白山时间rsuUChiler}r(jj}r(jX 智利时间rjX智利夏令时间rjX智利标准时间ruuUDushanber}r(jj}r(jX杜尚别时间rjX杜尚别夏令时间rjX杜尚别标准时间ruuUGeorgiar}r(jj}r(jX格鲁吉亚时间rjX格鲁吉亚夏令时间rjX格鲁吉亚标准时间ruuUAnadyrr}r(jj}r(jX阿納德爾夏令時間rjX阿納德爾時間ruuU Philippinesr}r(jj}r(jX菲律賓夏令時間rjX菲律賓時間ruuUYakutskr}r(jj}r(jX雅庫茨克夏令時間rjX雅庫茨克時間ruuUIndonesia_Westernr}r(jj}rjX!印度尼西亚西部标准时间rsuUGreenland_Easternr}r(jj}r(jX格林兰东部时间rjX格林兰东部夏令时间rjX格林兰东部标准时间r uuUGMTr }r (jj}r jX格林尼治标准时间r suUMarshall_Islandsr}r(j}rjX马绍尔群岛时间rsjj}r(jX马绍尔群岛时间rjX马绍尔群岛夏令时间rjX马绍尔群岛时间ruuUUruguayr}r(jj}r(jX烏拉圭夏令時間rjX烏拉圭時間ruuU Uzbekistanr}r(jj}r(jX乌兹别克斯坦时间rjX乌兹别克斯坦夏令时间rjX乌兹别克斯坦标准时间r uuUColombiar!}r"(jj}r#(jX哥倫比亞夏令時間r$jX哥倫比亞時間r%uuU Kizilordar&}r'(jj}r((jXKizilorda 时间r)jXKizilorda 夏令时间r*jXKizilorda 标准时间r+uuUAustralia_Westernr,}r-(j}r.(jX澳大利亚西部时间r/jX澳大利亚西部夏令时间r0jX澳大利亚西部标准时间r1ujj}r2(jX澳大利亚西部时间r3jX澳大利亚西部夏令时间r4jX澳大利亚西部标准时间r5uuUAmerica_Pacificr6}r7(jj}r8(jX美国太平洋时间r9jX太平洋夏令时间r:jX太平洋标准时间r;uuUBakur<}r=(j}r>(jX巴库标准时间r?jX 巴库时间r@ujj}rA(jX 巴库时间rBjX巴库夏令时间rCjX巴库标准时间rDuuUEurope_EasternrE}rF(jj}rG(jX 东欧时间rHjX东欧夏令时间rIjX东欧标准时间rJuuUBhutanrK}rL(j}rMjX孟加拉标准时间rNsjj}rO(jX 不丹时间rPjX不丹夏令时间rQjX不丹标准时间rRuuUBorneorS}rT(jj}rU(jX婆罗洲时间rVjX婆罗洲夏令时间rWjX婆罗洲标准时间rXuuUNepalrY}rZ(jj}r[jX尼泊爾時間r\suU Galapagosr]}r^(j}r_(jX加拉帕哥斯时间r`jX加拉帕哥斯夏令时间rajX加拉帕戈斯时间rbujj}rc(jX加拉帕戈斯时间rdjX加拉帕戈斯夏令时间rejX加拉帕戈斯时间rfuuU Lord_Howerg}rh(j}rijX罗德毫岛标准时间rjsjj}rk(jX罗德毫岛时间rljX罗德毫岛夏令时间rmjX罗德毫岛标准时间rnuuUSurinamero}rp(j}rqjX蘇利南夏令時間rrsjj}rs(jX苏里南夏令时间rtjX苏里南标准时间ruuuUAcrerv}rw(jj}rx(jX Acre 时间ryjX阿克里夏令时间rzjX阿克里标准时间r{uuU Venezuelar|}r}(jj}r~jX委內瑞拉時間rsuUIsraelr}r(j}rjX IST (Israel)rsjj}r(jX以色列时间rjX以色列夏令时间rjX以色列标准时间ruuU Hong_Kongr}r(jj}r(jX香港夏令時間rjX 香港時間ruuUTashkentr}r(jj}r(jX塔什干时间rjX塔什干夏令时间rjX塔什干标准时间ruuUNoronhar}r(jj}r(jX(爾南多-迪諾羅尼亞島夏令時間rjX"爾南多-迪諾羅尼亞島時間ruuUIndonesia_Easternr}r(jj}rjX!印度尼西亚东部标准时间rsuUOmskr}r(jj}r(jX鄂木斯克夏令時間rjX鄂木斯克時間ruuUAustralia_Centralr}r(j}r(jX澳大利亚中部时间rjX澳大利亚中部夏令时间rjX澳大利亚中部标准时间rujj}r(jX澳大利亚中部时间rjX澳大利亚中部夏令时间rjX澳大利亚中部标准时间ruuUAtlanticr}r(jj}r(jX大西洋时间rjX大西洋夏令时间rjX大西洋标准时间ruuU North_Marianar}r(jj}r(jX北马里亚纳群岛时间rjX!北马里亚纳群岛夏令时间rjX北马里亚纳群岛时间ruuULankar}r(jj}r(jX Lanka 时间rjXLanka 夏令时间rjXLanka 标准时间ruuUEurope_Westernr}r(j}r(jX 西欧时间rjX欧洲西部夏令时间rjX欧洲西部时间rujj}r(jX 西欧时间rjX欧洲西部夏令时间rjX欧洲西部时间ruuU New_Zealandr}r(j}r(jX新西兰时间rjX新西兰夏令时间rjX新西兰标准时间rujj}r(jX新西兰时间rjX新西兰夏令时间rjX新西兰标准时间ruuUUrumqir}r(jj}r(jX乌鲁木齐时间rjX乌鲁木齐夏令时间rjX乌鲁木齐标准时间ruuUAfrica_Westernr}r(j}r(jX西部非洲标准时间rjX南部非洲时间rujj}r(jX西部非洲时间rjX西部非洲夏令时间rjX西部非洲时间ruuUGuyanar}r(jj}rjX蓋亞那時間rsuUMagadanr}r(jj}r(jX馬加丹夏令時間rjX馬加丹時間ruuUAlmatyr}r(jj}r(jX Almaty 时间rjX阿拉木图夏令时间rjXAlmaty 标准时间ruuUTbilisir}r(jj}r(jX第比利斯时间rjX第比利斯夏令时间rjX第比利斯标准时间ruuUMyanmarr}r(jj}rjX 緬甸時間rsuU Singaporer}r(jj}rjX新加坡標準時間rsuUSamarar}r(j}r(jX萨马拉夏令时间rjX萨马拉时间rujj}r(jX萨马拉时间rjX萨马拉夏令时间rjX萨马拉时间ruuUGreenland_Centralr}r(jj}r(jX格林兰中部时间r jX格林兰中部夏令时间r jX格林兰中部标准时间r uuUUralskr }r (jj}r(jX乌拉尔斯克时间rjX乌拉尔斯克夏令时间rjX乌拉尔斯克标准时间ruuUParaguayr}r(jj}r(jX巴拉圭夏令時間rjX巴拉圭時間ruuUMoscowr}r(jj}r(jX莫斯科时间rjX莫斯科夏令时间rjX莫斯科标准时间ruuUYukonr}r(jj}r(jX 育空时间r jX育空夏令时间r!jX育空标准时间r"uuuUerasr#}r$(Uwider%}r&(KX 公元前r'KX公元r(uU abbreviatedr)}r*(KX 公元前r+KX公元r,uuu.PK[Rll(site-packages/babel/localedata/el_GR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99-site-packages/babel/localedata/zh_Hans_HK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[99)site-packages/babel/localedata/fil_PH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/wo_SN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/ha_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[1ll(site-packages/babel/localedata/fr_MC.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/uk_UA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Q(-site-packages/babel/localedata/zh_Hant_MO.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU first_dayqKsU time_formatsq}qUmediumqcbabel.dates DateTimePattern q)q}q(UpatternqX ahh:mm:ssqUformatqX%(a)s%(hh)s:%(mm)s:%(ss)squbsU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq }q!(Umediumq"h)q#}q$(hXyyyy年M月d日q%hX%(yyyy)s年%(M)s月%(d)s日q&ubUfullq'h)q(}q)(hXyyyy年MM月dd日EEEEq*hX%%(yyyy)s年%(MM)s月%(dd)s日%(EEEE)sq+ubUlongq,h)q-}q.(hXyyyy年MM月dd日q/hX%(yyyy)s年%(MM)s月%(dd)s日q0ubUshortq1h)q2}q3(hX yy年M月d日q4hX%(yy)s年%(M)s月%(d)s日q5ubuUcurrency_symbolsq6}q7U time_zonesq8}q9Uscriptsq:}q;Uvariantsq<}q=Unumber_symbolsq>}q?Ucurrency_namesq@}qAUmonthsqB}qCUcurrency_formatsqD}qEUdaysqF}qGU meta_zonesqH}qIUerasqJ}qKu.PK[_`-mvmv%site-packages/babel/localedata/sk.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KX 1. štvrťrokq KX 2. štvrťrokq KX 3. štvrťrokqKX 4. štvrťrokquU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XH:mm:ssq-Uformatq.X%(H)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X H:mm:ss vq3h.X%(H)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X H:mm:ss zq8h.X%(H)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XH:mmq=h.X %(H)s:%(mm)sq>ubuU languagesq?}q@(UguqAX gudžaratskyqBUscnqCX sicílskyqDUgdqEXškótskou gaelštinouqFUgaqGXírskyqHUgnqIX guaranskyqJUglqKX galicijskyqLUlbqMX luxemburgskýqNUfiuqOXugrofínsky jazykqPUlnqQX lingalskyqRUloqSXlaoskýqTUttqUX tatárskyqVUtrqWXtureckýqXUlvqYX lotyšskýqZUltq[X litovskýq\Utkq]X turkménskyq^Uthq_Xthajskýq`UtiqaX tigrinyjskýqbUtgqcX tadžidskýqdUteqeXtelugskyqfUfilqgX filipínskyqhUhawqiX havajskýqjUyiqkX jidišskyqlUdeqmXnemeckýqnUdaqoXdánskyqpUgotqqXgotickýqrUgemqsXgermánsky jazykqtUbatquXbaltský jazykqvUtlqwX tagalogčinaqxUmlqyX malajalamskyqzUbanq{X balijskýq|Uelq}Xgréckyq~UeoqX esperantskyqUenqX anglickýqUartqX umelý jazykqUzh_HansqXčínština (zjednodušená)qUzh_HantqXčínština (tradičná)qUen_USqXanglický (USA)qUeuqX baskickýqUetqX estónskyqUesqX španielskyqUruqXruskýqUrmqXrétorománskyqUiraqXiránsky jazykqUroqX rumunskýqUbnqX bengálskyqUsuxqX sumerskýqUbeqX bieloruskýqUbgqX bulharskýqUbaqX baškírskyqUwaqX valónskyqUwoqXwolofqUjvqX javanskýqUboqX tibetskýqUbhqX biharskýqUbrqX bretónskyqUbsqX bosnianskyqUjaqX japonskýqUsyrqXsýrskyqUlaqX latinskýqUocqX okcitánskyqUakkqXakadskýqUundqXneznámy alebo neplatný jazykqUtwqXtwiskyqUtlhqX klingonskýqUorqXurijskýqUxhqXxhoskyqUcaqX katalánskyqUceqX čečenskýqUcyqXwaleskyqUsgnqX znaková rečqUcsqXčeskýqUtyqX tahitskýqUpsqX paštúnskyqUptqX portugalskýqUausqXaustrálsky jazykqUukqX ukrajinskýqUpaqX pandžábskyqUviqX vietnamskýqUzxxqXbez jazykového obsahuqUen_GBqXanglický (Veľká Británia)qUzhqXčínskyqUhyqX arménskyqUhrqX chorvátskyqUkaqX gruzínskyqUhtqXhaitskýqUhuqX maďarskýqUhiqX hindštinaqUheqX hebrejskýqUuzqXuzbeckýqUcarqX karibskýqUmnqX mongolskýqUcauqXkaukazský jazykqUurqX urdštinaqUmtqXmaltskýqUcaiqX!jazyk stredoamerických indiánovqUainqXainskýrUplrXpoľskýrUmsrX malajskýrUmrrX marathskyrUberrX berberskýrUugr X uighurskyr Utar X tamilskýr Umyr XburmskýrUslarXslovanský jazykrUsairXjazyk juhoamerických indiánovrUabrX abcházskyrUafrXafrickýrUswrX swahilskyrUisrX islandskýrUmynrX jazyk mayovrUamrX amharskýrUitrX talianskyr Usvr!X švédskyr"Uasr#Xasámskyr$Uarr%Xarabskýr&Usur'Xsundskyr(Uavr)Xavarskýr*Uiar+X interlinguar,Uiner-Xindoeurópsky jazykr.Uazr/Xazerbajdžanskýr0Uier1X interlinguer2Uidr3X indonézskyr4Unlr5X holandskýr6Unnr7Xnórsky (nynorsk)r8Unor9Xnórskyr:Unair;X!jazyk severoamerických indiánovr<Uner=X nepálskyr>Upaar?X papuánskyr@UgrcrAX starogréckyrBUzurCXzulurDUnvrEX jazyk navajovrFUfrrGX francúzskyrHUcelrIXkeltský jazykrJUfyrKX frizijskyrLUfarMXperzskýrNUfirOXfínskyrPUdakrQX dakotskýrRUsarSX sanskrtomrTUforUXfaerskyrVUegyrWXstaroegyptskýrXUkgrYX konžskýrZUgswr[Xnemecký (Švajčiarsko)r\Usrr]Xsrbskýr^Usqr_X albánskyr`UkoraX kórejskýrbUknrcX kanadskýrdUkmreX kambodžskýrfUstrgX sesothskyrhUskriX slovenskýrjUsirkX sinhalézskyrlUshrmXsrbochorvátskyrnUsoroX somálskyrpUmkrqX macedónskyrrUkursXkurdskýrtUslruX slovinskýrvUkyrwX kyrgyzskýrxUsdryXsindhskyrzuU territoriesr{}r|(UBDr}X Bangladéšr~UBErXBelgickorUBFrX Burkina FasorUBGrX BulharskorUVErX VenezuelarUBArXBosna a HercegovinarUBBrXBarbadosrUWFrXWallis a FutunarUBLrXSvätý BartolomejrUBMrXBermudyrUBNrXBrunejrUBOrXBolíviarUBHrXBahrajnrUBIrXBurundirUBJrXBeninrUBTrXButánrU011rXZápadná AfrikarUBVrXBouvetov ostrovrUBWrXBotswanarU014rXVýchodná AfrikarU015rXSeverná AfrikarUBRrX BrazíliarU017rXStredná AfrikarU018rXJužná Afrika [018]rU019rXAmerický kontinentrUBYrX BieloruskorUBZrXBelizerULVrX LotyšskorURWrXRwandarURSrXSrbskorUTLrXVýchodný TimorrURErXReunionrUTMrX TurkménskorUOMrXOmánrUTJrX TadžikistanrUROrXRumunskorUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX-Južná Georgia a Južné Sandwichove ostrovyrUGRrXGréckorUGQrXRovníková GuinearUGPrX GuadelouperUJPrXJaponskorUKIrXKiribatirUGYrXGuayanarUGGrXGuernseyrUGFrXFrancúzska GuayanarUGErX GruzínskorUGDrXGrenadarU021rXSeverná AmerikarUGBrXSpojené kráľovstvorUGArXGabonrUSVrXSalvadorrUGNrXGuinearUGMrXGambiarUGLrXGrónskorU029rXKaribikrUGIrX GibraltárrUGHrXGhanarUJErXJerseyrUTNrXTuniskorUJMrXJamajkarU013rXStredná AmerikarUWSrXSamoarU419rXLatinská Amerika a KaribikrUVArX-Svätá stolica (Vatikánsky mestský štát)rUHRrX ChorvátskorUBSrXBahamyrUHTr XHaitir UHUr X Maďarskor UHKr XHong Kong S.A.R. ČínyrU039rXJužná EuróparUHNrXHondurasrUFIrXFínskorU142rXÁziarU030rXVýchodná ÁziarU034rX Južná ÁziarU035rXJuhovýchodná ÁziarUPRrX PortorikorUPSrXPalestínske územier U830r!XKanál La Mancher"UFKr#XFalklandské ostrovyr$UIOr%X#Britské územie v Indickom oceáner&UPWr'XPalaur(UPTr)X Portugalskor*USJr+XŠpicbergy a Jan Mayenr,UMDr-XMoldavsko, republikar.UFMr/X!Mikronézia, Federatívne štátyr0UIQr1XIrakr2UPAr3XPanamar4UPFr5XFrancúzska Polynéziar6UPGr7XPapua Nová Guinear8UPEr9XPerur:UPKr;XPakistanr<UPHr=X Filipínyr>UFOr?XFaerské ostrovyr@UPNrAXPitcairnove ostrovyrBUPLrCXPoľskorDUPMrEXSaint Pierre a MiquelonrFUZMrGXZambiarHUEHrIXZápadná SahararJURUrKXRuská federáciarLUEErMX EstónskorNUEGrOXEgyptrPUZArQXJužná AfrikarRUECrSXEkvádorrTUITrUX TalianskorVUVNrWXVietnamrXUZZrYX Neznámy alebo neplatný regiónrZUSBr[XŠalamúnove ostrovyr\UETr]XEtiópiar^USOr_X Somálskor`UZWraXZimbabwerbUSArcXSaudská ArábiardUESreX ŠpanielskorfUERrgXEritrearhUMEriX Čierna HorarjUAQrkX AntarcticarlUMGrmX MadagaskarrnUMFroXSvätý MartinrpUMArqXMarokorrUMCrsXMonakortUUZruX UzbekistanrvUMMrwX MjanmarskorxUMLryXMalirzUMOr{XMakao S.A.R. Čínyr|UMNr}X Mongolskor~UHMrX&Heardove ostrovy a McDonaldove ostrovyrUASrXAmerická SamoarUMKrXMacedónsko, republikarUMUrX MauríciusrUMTrXMaltarUMWrXMalawirUMVrXMaldivyrUMQrXMartinikrUMPrXSeverné MariányrUMSrX MontserratrUMRrX MauritániarUIMrX Ostrov ManrUUGrXUgandarUTZrX TanzániarUMYrXMalajziarUMXrXMexikorUILrXIzraelrUFRrX FrancúzskorUAWrXArubarUDOrXDominikánska republikarUSHrXSvätá HelenarUVCrXSvätý Vincent a GrenadínyrU054rX MelanéziarUDJrXDžibutirUFJrXFidžirU057rX MikronésiarU172rX$Spoločenstvo nezávislých štátovrU053rXAustrália a Nový ZélandrUNIrX NikaraguarUNLrX HolandskorUNOrXNórskorUNArXNamíbiarUVUrXVanuaturUNCrXNová KaledóniarUNErXNigerrUNFrXNorfolkov ostrovrUNGrXNigériarUNZrX Nový ZélandrUNPrXNepálrUNRrXNaururUNUrXNiuerU061rX PolynéziarUCIrXPobrežie SlonovinyrUCHrX ŠvajčiarskorUCOrXKolumbiarUCNrXČínarUCMrXKamerunrUCLrXČilerUCCrXKokosové (Keelingove) ostrovyrUCArXKanadarUCGrXKongorUCFrXStredoafrická republikarUCDrX!Konžská demokratická republikarUCZrXČeská republikarUCYrXCyprusrUCXrXVianočný ostrovrUCSrXSrbsko a Čierna HorarUCRrX KostarikarUPYrXParaguajrUCVrXKapverdyrUCUrXKubarUSZrX SvazijskorUSYrXSýrska arabská republikarUKGrX KirgizskorUKErXKeňarUSRrXSurinamrU143rXStredná ÁziarUKHrX KambodžarUKNrXSaint Kitts a NevisrUKMr XKomoryr USTr X"Svätý Tomáš a Princove ostrovyr USKr XSlovenská republikarUKRrXKórea, JužnárUSIrX SlovinskorUKPrXKórea, SevernárUKWrXKuvajtrUSNrXSenegalrUSMrX San MarínorUSLrX Sierra LeonerUSCrXSeychelské ostrovyrUKZrX Kazachstanr UKYr!XKajmanské ostrovyr"USGr#XSingapurr$USEr%X Švédskor&USDr'XSudánr(U151r)XVýchodná Európar*U150r+XEurópar,UDMr-XDominikar.U155r/XZápadná Európar0U154r1XSeverná Európar2UVGr3XBritské panenské ostrovyr4UDEr5XNemeckor6UYEr7XJemenr8UMHr9XMarshallove ostrovyr:U062r;XStredná a južná Áziar<UDZr=X Alžírskor>UUSr?XSpojené štátyr@UUYrAXUruguajrBUYTrCXMayotterDUUMrEXMenšie odľahlé ostrovy USArFULBrGXLibanonrHULCrIX Svätá LuciarJULArKX&Laoská ľudovodemokratická republikarLUTVrMXTuvalurNUTWrOXTajwanrPUTTrQXTrinidad a TobagorRUTRrSXTureckorTULKrUX Srí LankarVULIrWXLichtenštajnskorXUCKrYXCookove ostrovyrZUTOr[XTongar\ULTr]XLitvar^ULUr_X Luxemburskor`ULRraXLibériarbULSrcXLesothordUTHreXThajskorfUTFrgXFrancúzske južné územiarhUTGriXTogorjUTDrkXČadrlUTCrmXTurks a CaicosrnULYroX!Lýbijská arabská džamahírijarpU200rqXČeskoslovenskorrU145rsXZápadná ÁziartUAEruXSpojené arabské emirátyrvUADrwXAndorrarxUAGryXAntigua a BarbadosrzUAFr{X Afganistanr|UAIr}XAnguillar~UVIrXPanenské ostrovy - USArUISrXIslandrUIRrXIránrUAMrX ArménskorUALrX AlbánskorUAOrXAngolarUANrXHolandské AntilyrU003rXSeverná Amerika (003)rU002rXAfrikarU001rXSvetrUARrX ArgentínarUAUrX AustráliarUATrXRakúskorU005rXJužná AmerikarUINrXIndiarUAXrXAlandské ostrovyrU009rXOceániarUAZrX AzerbajdžanrUIErXÍrskorUIDrX IndonéziarUJOrX JordánskorUQUrXEurópska úniarUUArXUkrajinarUQArXKatarrUDKrXDánskorUMZrXMozambikrUQOrXTichomorie - ostatnéruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,Xd.M.yyyyrh.X%(d)s.%(M)s.%(yyyy)srubUfullrh))r}r(h,XEEEE, d. MMMM yyyyrh.X"%(EEEE)s, %(d)s. %(MMMM)s %(yyyy)srubUlongrh))r}r(h,X d. MMMM yyyyrh.X%(d)s. %(MMMM)s %(yyyy)srubUshortrh))r}r(h,Xd.M.yyyyrh.X%(d)s.%(M)s.%(yyyy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUCHFrXSwFrUBYRrXRblrUXPFrXCFPFrUMROrXUMrUDJFrXDFrUVUVrXVTrUUYUrXUr$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUGELrXlarirUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUMWKrXMKrULKRr XSL Rer USKKr XSkr UPKRr XPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUJMDrXJ$rUTTDrXTT$r UZWDr!XZ$r"UTRLr#XTLr$UBDTr%XTkr&UYERr'XYRlr(UANGr)XNA f.r*UXCDr+XEC$r,UNOKr-XNKrr.UINRr/XINRr0UMXNr1XMEX$r2UBTNr3XNur4UCOPr5XCol$r6UIDRr7XRpr8UHNLr9XLr:UFJDr;XF$r<UETBr=XBrr>UBZDr?XBZ$r@UDOPrAXRD$rBUQARrCXQRrDUSEKrEXSKrrFUSRGrGXSfrHUIEPrIXIR£rJUBBDrKXBDS$rLUGTQrMXQrNUVEBrOXBerPUCLPrQXCh$rRUALLrSXlekrTUKZTrUXTrVUOMRrWXROrXUSBDrYXSI$rZUPLNr[XZlr\UKESr]XK Shr^UGYDr_XG$r`UMKDraXMDenrbUTWDrcXNT$rdUTOPreXT$rfUGNFrgXGFrhUIQDriXIDrjUBAMrkXKMrlUSCRrmXSRrnUCADroXCan$rpUCVErqXCVEscrrUKWDrsXKDrtUBIFruXFburvUSOSrwXSh.rxUSGDryXS$rzUSTDr{XDbr|UIRRr}XRIr~UCNYrXYrUCYPrX£CrUMTLrXLmrUNZDrX$NZrUKGSrXsomrUARSrXArg$rUSZLrXErUBHDrXBDruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanárske ostrovyrsU Europe/Lisbonr}rjXLisabonrsUPacific/Pitcairnr}rjXPitcairnove ostrovyrsU Asia/Tashkentr}rjXTaškentrsUEurope/Gibraltarr}rjX GibraltárrsUPacific/Easterr}rjXVeľkonočné ostrovyrsUAmerica/Costa_Ricar}rjX KostarikarsUAsia/Kamchatkar}rjX KamčatkarsUAmerica/North_Dakota/New_Salemr}rjXNew Salem, Severná DakotarsU Europe/Londonr}rjXLondýnrsUEurope/Zaporozhyer}rjX ZáporožiersUAsia/Krasnoyarskr}rjX KrasnojarskorsU Asia/Qatarr}rjXKatarrsUAmerica/St_Luciar}rjX St. LuciarsU Asia/Irkutskr}rjXIrkutskorsUAsia/Singaporer}rjXSingapurrsUAtlantic/Bermudar}rjXBermudyrsU Europe/Monacor}rjXMonakorsUEurope/Luxembourgr}rjX LuxemburskorsUPacific/Galapagosr}rjX GalapágyrsUAfrica/Djiboutir}rjX DžibutskorsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAmerica/Martiniquer}rjXMartinikrsUAtlantic/Cape_Verder}rjXKapverdyrsUAsia/Hong_Kongr}rjXHongkongrsU Europe/Moscowr}rjXMoskvarsU Asia/Macaur}rjXMacaorsUAsia/Yekaterinburgr}rjX JekaterinburgrsUAmerica/Jamaicar}rjXJamajkarsU Europe/Kievr}rjXKyjevrsUAsia/Ulaanbaatarr}rjX UlanbátarrsUAmerica/Anchorager}rjXAljaškarsUIndian/Maldivesr}rjXMaledivyrsU Pacific/Fijir}rjXFidžirsUAmerica/St_Thomasr}rjX St. ThomasrsUAmerica/El_Salvadorr}rjX SalvádorrsU Asia/Sakhalinr}rjXSachalinrsU Asia/Kuwaitr}rjXKuvajtrsUAmerica/St_Vincentr}rjX St. VincentrsUAmerica/Dominicar}rjXDominikar sU Asia/Yakutskr }r jXJakutskor sUAtlantic/Azoresr }rjXAzorské ostrovyrsU Etc/Unknownr}rjXNeznáme časové pásmorsUAmerica/Puerto_Ricor}rjX PortorikorsUEurope/Uzhgorodr}rjXUžhorodrsU Asia/Shanghair}rjXŠanghajrsUAmerica/St_Kittsr}rjX St. KittsrsUIndian/Mauritiusr}r jX Mauríciusr!sUAntarctica/South_Poler"}r#jX Južný pólr$suUscriptsr%}r&(UHebrr'X hebrejskýr(UCyrlr)XCyrilikar*UArmnr+X Arménskyr,UCyrsr-Xcyrilikar.UKhmrr/Xkmérskyr0ULatnr1Xlatinkar2UGothr3Xgotickýr4UMayar5Xmayské hieroglyfyr6UEthir7X etiópskyr8UKorer9X kórejskýr:UArabr;XArabskýr<ULinbr=X lineárna Br>ULinar?X lineárna Ar@UOsmarAX osmanskýrBUMongrCX mongolskýrDURunrrEXRunové písmorFUBrairGXBraillovo písmorHUGrekrIXGréckyrJUBalirKX balijskýrLUTibtrMX tibetskýrNUZyyyrOXObecnýrPUJpanrQX japonskýrRUGlagrSX hlaholikarTUBengrUX bengálskyrVUEgyprWXegyptské hieroglyfyrXuUvariantsrY}rZUnumber_symbolsr[}r\(Udecimalr]X,r^Ugroupr_X r`uUcurrency_namesra}rb(jXAlžírsky dinárrcjXNamibský dolárrdjX Comoro frankreUBOPrfXBolivíjske pesorgUEGPrhXEgyptská librarijXBulharský levarjUBGNrkXBulharský leva novýrlUPABrmXPanamská balboarnUYUMroXJuhoslávsky Noviy dinárrpUGHCrqX Ghanský cedirrUBOBrsXBolívijské BolivianortjX Dánska kroneruUBWPrvXBotswanan PularwjXLibanonská librarxjXTanzanský šilingryUVNDrzXVietnamský dongr{UAOAr|XAngolská kwanzar}UWSTr~XZápadná Samoa talarUAONrX"Angolská nová kwanza (1990-2000)rjXKambodžský rielrjXMalajský ringgitrUAOKrXAngolská kwanza (1977-1990)rjwXSomálsky šilingrUKYDrXKajmanský dolárrjXLibyjský dinárrUUAHrXUkrainská hrivnarUUAKrXUkrainský karbovanetzrjXJordánsky dinárrUAORrX'Angolská kwanza Reajustado (1995-1999)rUSURrXSovietský rubeľrUAWGrXArubský guilderrjXSaudský riyalrUFIMrX Finská markarjXHong Kongský dolárrjGXSurinamský guilderrUTPErXTimorské eskudorUMGFrXMadagaskarský frankrjXŠvajčiarský frankrUGIPrXGibraltarská librarjXBelarussian rubeľrjSX Albánsky lekrUUGSrXUgandan šiling (1966-1987)rjXMauritania OuguiyarUBOVrXBolivíjske mvdolrUHRKrXChorvátska kunarjXDžibutský frankrUHRDrXChorvátsky dinárrUPESrX Peruvský solrUBYBrX$Belarussian nový rubeľ (1994-1999)rUITLrXTalianská lirarUXAFrXCFA frank BEACrUBNDrXBruneiský dolárrUISKrXIslandská kronarUZALrXJuhoafrický rand (financial)rjXUruguajské peso UruguayorUNIOrXNikaragujská Cordoba OrorULAKrX Laoský kiprUNICrXNikaragujská cordobarjXNepálska rupiarUMZErXMozambijské eskudorjX Syrská librarjXJamajský dolárrUFRFrXFrancúzsky frankrUMAFrXMarocký frankrjXMozambijské meticalrUPHPrXFilipínske pesorjXJuhoafrický randrUGWPrXGuinea-Bissau pesorULUFrXLuxemburský frankrUBELrXBelgický frank (finančný)rUBECrX Belgický frank (konvertibilný)rUNGNrXNigerská nairarUYUNrXJuhoslávsky dinárrjXBelgický frankrUPLZrXPolský zloty (1950-1995)rjXKostarikský colonrj#X Turecká lirarUDEMrXNemecká markarUEEKrXEstónska kroonrjXMalavská kwacharjXTrinidad a Tobago dolárrj XŠrilanská rupiarj XSlovenská korunarjqXCape Verde eskudorj XPakistanská rupiarjXMaďarský forintrjX Rumunský leurjXBermudský dolárrjWXOmánský rialrjXLesothský lotirULVRrXLotyšský rubeľrjXMongolský tugrikrjXArmenský dramrUYUDrXJuhoslávsky dinár [YUD]rUBUKrX Burmese KyatrjXUgandský šilingrjCXQatarský rialrUXDRrXŠpeciálne práva čerpaniarUNLGrXNizozemský guilderrUGEKrXGruzínsky Kupon LaritrUMTPrXMaltská librarUGBPrXBritská librarjXGruzínsky larirUSHPrXLibrarj!XZimbabský dolárrjYXSolomon Islands dolárrUCSKrXČeskoslovenská korunar UKPWr XSeverokórejský wonr UTHBr X Thajský bátr UTRYrXNová turecká lírarj%XBangladéšska takarUGRDrXGrécka drachmarj'XJemenský rialrUDDMrXVýchodonemecká markarjXSwaziland lilangenirUHTGrXHaitské gourderUXOFrXCFA frank BCEAOrUMGArXMadagaskarský ariaryrj)XNizozemský Antilský guilderrULRDrXLibérský dolárrURWFr XRwandský frankr!j-X Nórksy kroner"UMXVr#X"Mexické Unidad de Inversion (UDI)r$j]XKeňský šilingr%UMOPr&X Macao Patacar'j/XIndijská rupiar(j1X Mexické pesor)UCZKr*XČeská korunar+UTJSr,XTadžikistanský somonir-UTJRr.XTadžikistanský rubeľr/j3XBhutansky ngultrumr0UYDDr1XJemenský dinárr2UGWEr3XPortugalská Guinea eskudor4j5XColombijské pesor5UMURr6XMauritská rupiar7j7XIndonézska rupiar8j9XHoduraská lempirar9jX CFP frankr:j;X Fiji dolárr;j=XEthiopský birrr<UPENr=XPeruvský sol Nuevor>j?X Belize dolárr?UATSr@XRakúsky šilingrAUILPrBXIzraelská librarCUZRNrDXZairský nový zairerEjAXDominikánske pesorFUTMMrGXTurkménsky manatrHUMDLrIXMoldavský leurJUECVrKX+Ekuadorský Unidad de Valor Constante (UVC)rLUECSrMXEkuadorský sucrerNUBSDrOXBahamský dolárrPjEXŠvédska kronarQjeXTonga PaʻangarRUPEIrSXPeruvský intirTUZMKrUXZambská kwacharVUMVRrWXMaldivská rufiyaarXjXAustrálsky dolárrYUADPrZXAndorská pesetar[UCUPr\XKubánske pesor]jIX Írska librar^UCLFr_XČílske Unidades de Fomentor`jKXBarbadoský dolárraUKRWrbXJuhokórejský wonrcUGMDrdXGambský dalasirejMXGuatemalský quetzalrfjOXVenezuelský bolivarrgUSITrhXSlovinský TolarriUSDPrjXSudánska librarkjQX Čílske pesorlUEURrmXEurornUCDFroXKonžský frank Congolaisrpj+XEast Caribbean dolárrqjUXKazažský tengerrURUBrsX Ruský rubeľrtUXFUruXFrancúzsky UIC-frankrvUBRRrwXBrazílske cruzeirorxUBRNryXBrazílske Cruzado NovorzUBRLr{XBolivíjsky realr|UMMKr}XMyanmarský kyatr~UUYPrXUruguajské peso (1975-1993)rURURrXRuský rubeľ (1991-1998)rj[X Polský zlotyrUBRErX Bolivíjske cruzeiro (1990-1993)rUPYGrXParaguayské guaranirUBRCrXBolivíjske cruzadorUBRBrX%Bolivíjske Cruzeiro Novo (1967-1986)rUSVCrXEl Salvadorský colonrUAEDrX UAE dirhamrUGNSrXGuinejský sylirjaXMacedónsky denárrUAZMrXAzerbaidžanský manatrjcXTaiwanský nový dolárrUUSNrXUS dolár (Next day)rUGQErX"Rovníková Guinea Ekwele GuineanarjX Vanuatu vaturUBADrXBosnianský dinárrjgXGuinejský frankrUMXPrX$Mexické striborné peso (1861-1992)rjiXIracký dinárrUERNrXEritrejská nakfarjkX Bosnianský konvertibilná markarjmXSejšelská rupiarjoXKanadský dolárrUSDDrXSudánsky dinárrjXCypruská librarUMADrXMarocký dirhamrjsXKuvaitský dinárrjuXBurundský frankrULTTrXLitevský talonasrUPGKrXPapua Nová Guinea kinarULTLrXLitevská litarjyXSingapúrsky dolárrUUZSrXUzbekistanský sumrj{XSao Tome a Principe dobrarUXFOrXFrancúzsky zlatý frankrUMLFrX Malský frankrUESPrXŠpanielská pesetarj}X Iránsky rialrUZRZrXZairský ZairerjXČínsky Yuan RenminbirUSLLrXSierra Leone LeonerUTNDrXTuniský dinárrj_XGuyanský dolárrjX Maltská lirarjXNovozélandský dolárrUFKPrXFalklandská librarULVLrXLotyšský latsrUUSSrXUS dolár (Same day)rUUSDrX US dolárrUARPrXArgentinské peso (1983-1985)rjX Kyrgyský somrjXArgentinské pesorUILSrXIzraelský šekelrURONrX Rumunský LeirURSDrXSrbský dinárrjXBahraiský dinárrUJPYrX Japonský yenrUARArXArgentinský australrUPTErXPortugalské eskudorUXAUrXZlatoruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXjrKXfrKXmrKXarKjKjKjKjK XsrK XorK XnrK XdrusUformatr}r(Uwider}r(KXjanuárrKXfebruárrKXmarecrKXaprílrKXmájrKXjúnrKXjúlrKXaugustrK X septemberrK XoktóberrK XnovemberrK XdecemberruU abbreviatedr}r(KXjanrKXfebrKXmarrKXaprrKXmájrKXjúnrKXjúlr KXaugr K Xsepr K Xoktr K Xnovr K XdecruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrX ¤rjrUint_precrKKrh,X #,##0.00 ¤rUprefixrXrX-r r!Uexp_plusr"NUgroupingr#KKr$ubsUdaysr%}r&(U stand-aloner'}r(Unarrowr)}r*(KXPr+KXUr,KXSr-KXŠr.Kj+Kj-KXNr/usUformatr0}r1(Uwider2}r3(KXPondelokr4KXUtorokr5KXStredar6KXŠtvrtokr7KXPiatokr8KXSobotar9KXNedeľar:uU abbreviatedr;}r<(KXPor=KXUtr>KXStr?KXŠtr@KXPirAKXSorBKXNerCuuuU meta_zonesrD}rEUerasrF}rGU abbreviatedrH}rI(KX pred n.l.rJKXn.l.rKusu.PK[l%site-packages/babel/localedata/sr.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXПрво тромесечјеq KXДруго тромесечјеq KXТреће тромесечјеqKX#Четврто тромесечјеquU abbreviatedq}q(KXК1qKXК2qKXК3qKXК4quusUperiodsq}q(UamqXпреподнеqUpmqXпоподнеquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH.mm.ssqJUformatqKX%(HH)s.%(mm)s.%(ss)sqLubUfullqMhG)qN}qO(h+X HH.mm.ss vqPhKX%(HH)s.%(mm)s.%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH.mm.ss zqUhKX%(HH)s.%(mm)s.%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH.mmqZhKX %(HH)s.%(mm)sq[ubuU languagesq\}q](Uzh_Hantq^X+Кинески (традиционални)q_Uguq`XГуџаратиqaUscnqbXСицилијанскиqcUgdqdXШкотски ГалскиqeUgaqfX ИрскиqgUgnqhXГвараниqiUglqjX ГалскиqkUlbqlXЛуксембуршкиqmUfiuqnXУгро-финскиqoUlnqpXЛингалаqqUloqrX ЛаоскиqsUttqtXТатарскиquUtrqvX ТурскиqwUbntqxX БантуqyUlvqzXЛетонскиq{Uausq|X#Аустралијски језикq}Utkq~XТуркменскиqUthqXТајландскиqUtiqXТигрињаqUsuqXСуданскиqUteqX ТелугуqUpt_PTqX/Португалски (Португалија)qUfilqXТагалогqUhawqXХавајскиqUyiqX ЈидишqUdeqXНемачкиqUdaqX ДанскиqUiraqXИрански језикqUgemqXГермански језикqUbatqXБалтички језикqUtlqXТагалскиqUelqX ГрчкиqUeoqXЕсперантоqUenqXЕнглескиqUzhqXКинескиqUzh_HansqX-Кинески (поједностављен)qUmasqX МасаиqUsgaqXСтароирскиqUen_USqXЕнглески (САД)qUeuqXБаскијскиqUetqXЕстонскиqUesqXШпанскиqUruqX РускиqUgohqXСтаронемачкиqUrmqXРето-РоманскиqUpeoqXСтароперсијскиqUgotqX ГотскиqUroqXРумунскиqUbnqXБенгласкиqUsuxqXСумерскиqUbeqXБелорускиqUbgqXБугарскиqUukqXУкрајинскиqUjvqXЈаванскиqUboqXТибетанскиqUbhqXБихарскиqUbrqXБретонскиqUbsqXБосанскиqUjaqXЈапанскиqUcopqXКоптскиqUlaqXЛатинскиqUocqXПровансалскиqUakkqXАкадијскиqUundqX3Непознат или неважећи језикqUtwqXТвиqUtlhqXКлингонскиqUorqXОријскиqUxhqX ХаусаqUcoqXКорзиканскиqUjrbqXЈудео-арапскиqUcaqXКаталонскиqUceqXЧеченскиqUcyqX ВелшкиqUsgnqXЗнаковни језикqUcsqX ЧешкиqUtyqXТахићанскиqUapaqXАпачки језикqUcuqXСтарословенскиqUpsqXПаштунскиqUptqXПортугалскиqUfroqXСтарофранцускиqUltrXЛитванскиrUchrrX ЧерокиrUparXПанџабскиrUvirXВијетнамскиrUzxxrX2Без лингвистичког садржајаr Upror X"Старопровансалскиr Uplr X Пољскиr UhyrXЈерменскиrUhrrXХрватскиrUegyrXСтароегипатскиrUhtrXХаитскиrUhurXМађарскиrUhirX ХиндиrUherXХебрејскиrUuzrXУзбечкиrUmlrXМалајаламrUmor XМолдавскиr!Umnr"XМонголскиr#Umir$XМаорскиr%Umkr&XМакедонскиr'Uurr(XУрдуr)Umtr*XМелтешкиr+Ucair,XCЦентрално амерички Индијански језикr-Udelr.XДелаверr/Umsr0XМалајскиr1Umrr2X Маратиr3Uugr4XУјгурскиr5Utar6XТамилскиr7Umyr8XБурманскиr9Uslar:XСловенски језикr;Usair<X<Језик јужноамеричких Индијанацаr=Uangr>XСтароенглескиr?Uafr@XАфриканерскиrAUswrBXСвахилиrCUisrDXИсландскиrEUamrFXАмхарскиrGUitrHXИталијанскиrIUnl_BErJXФламанскиrKUasrLXАсемијскиrMUarrNXАрапскиrOUes_419rPX:Шпански (Јужна Америка и Кариби)rQUavrRXАварскиrSUiarTXИнтерлингваrUUinerVX$Индо-европски језикrWUazrXXАзербејџанскиrYUierZXМеђујезичкиr[Uidr\XИндонежанскиr]Ujprr^XЈудео-персијскиr_Unlr`XХоландскиraUnorbXНорвешкиrcUnairdX@Језик северноамеричких ИндијанацаreUnerfXНепалскиrgUphirhXФилипински језикriUgrcrjXСтарогрчкиrkUzurlXЗулуrmUnvrnX НавахоroUfrrpXФранцускиrqUcelrrXКелтскиrsUfyrtXФризијскиruUsvrvXШведскиrwUfarxXПерсијскиryUfirzX Финскиr{Udakr|X Дакотаr}Usar~XСанскритrUforX ФарскиrUkarXГрузијскиrUgswrX%Немачки (Швајцарска)rUkkrXКозачкиrUsrrX СрпскиrUsqrXАлбанскиrUkorXКорејскиrUknrX КанадаrUkmrXКмерскиrUstrX СесотоrUskrXСловачкиrUsirXСингалескиrUshrXСрпскохрватскиrUsorXСомалскиrUkurXКурдскиrUslrXСловеначкиrUscrXСардињаскиrUkyrXКиргискиrUsdrX СиндиruU territoriesr}r(UBDrXБангладешrUBErXБелгијаrUBFrXБуркина ФасоrUBGrXБугарскаrUVErXВенецуелаrUBArX$Босна и ХерцеговинаrUBBrXБарбадосrUWFrX'Валис и Футуна ОстрваrUBMrXБермудаrUBNrX БрунејrUBOrXБоливијаrUBHrXБахреинrUBIrXБурундиrUBJrX БенинrUBTrX БутанrU011rXЗападна АфрикаrUBVrXБуве ОстрваrUBWrXБоцванаrU014rXИсточна АфрикаrU015rXСеверна АфрикаrUBRrX БразилrU017rXЦентрална АфрикаrU018rXЈужна АфрикаrU019rXАмерикеrUBYrXБелорусијаrUBZrX БелизеrULVrXЛетонијаrURWrX РуандаrURSrX СрбијаrUTLrXТимор-ЛестеrURErXРеинионrUTMrXТуркменистанrUOMrXОманrUTJrXТаџикистанrUROrXРумунијаrUTKrXТокелауrUGWrXГвинеја-БисаоrUGUrXГуамrUGTrXГватемалаrUGSrXCЈужна Џорџија и Јужна Сендвич ОстрваrUGRrX ГрчкаrUGQrX)Екваторијална ГвинејаrUGPrXГваделупеrUJPrX ЈапанrUKIrXКирибатиrUGYrXГвајанаrUGGrX ГурнсиrUGFrX!Француска ГвајанаrUGErXГрузијаr UGDr XГренадаr U021r XСеверна Америкаr UGBrXВелика БританијаrUGArX ГабонrUSVrXСалвадорrUGNrXГвинејаrUGMrXГамбијаrUGLrXГренландrU029rX КарибиrUGIrXГибралтарrUGHrXГанаrUJEr X Џерсиr!UTNr"X Тунисr#UJMr$XЈамајкаr%U013r&X!Централна Америкаr'UWSr(X Самоаr)U419r*X/Латинска Америка и Карибиr+UHRr,XХрватскаr-UBSr.X Бахамиr/UHTr0X Хаитиr1UHUr2XМађарскаr3UHKr4X(Хонг Конг (С. А. Р. Кина)r5U039r6XЈужна Европаr7UHNr8XХондурасr9UFIr:X Финскаr;U142r<X Азијаr=U030r>XИсточна Азијаr?U034r@XЈужна АзијаrAU035rBX!Југоисточна АзијаrCUPRrDXПорто РикоrEUPSrFX+Палестинска територијаrGU830rHXКаналска острваrIUFKrJX#Фолкландска ОстрваrKUIOrLXIБританско Индијска океанска територијаrMUPWrNX ПалауrOUPTrPXПортугалrQUSJrRX1Свалбард и Јанмајен ОстрваrSUMDrTXМолдавијаrUUIQrVXИракrWUPArXX ПанамаrYUPFrZX'Француска Полинезијаr[UPGr\X"Папуа Нова Гвинејаr]UPEr^XПеруr_UPKr`XПакистанraUPHrbXФилипиниrcUFOrdXФарска ОстрваreUPNrfXПиткернrgUPLrhX ПољскаriUPMrjX!Сен Пјер и МикелонrkUZMrlXЗамбијаrmUEHrnXЗападна СахараroURUrpX РусијаrqUEErrXЕстонијаrsUEGrtX ЕгипатruUZArvX+Јужноафричка РепубликаrwUECrxXЕквадорryUITrzXИталијаr{UVNr|XВијетнамr}UZZr~X7Непозната или неважећа областrUSBrX!Соломонска ОстрваrUETrXЕтиопијаrUSOrXСомалијаrUZWrXЗимбабвеrUSArX!Саудијска АрабијаrUESrXШпанијаrUERrXЕритрејаrUMErXЦрна ГораrUAQrXАнтарктикrUMGrXМадагаскарrUMFrXСент МартинrUMArX МарокоrUMCrX МонакоrUUZrXУзбекистанrUMMrXМијанмарrUMLrXМалиrUMOrX!Макао (С. А. Р. Кина)rUMNrXМонголијаrUHMrX+Херд и Мекдоналд ОстрваrUASrXАмеричка СамоаrUMKrXМакедонијаrUMUrXМаурицијусrUMTrX МалтаrUMWrX МалавиrUMVrXМалдивиrUMQrXМартиникrUMPrX0Северна Маријанска ОстрваrUMSrXМонсератrUMRrXМауританијаrUIMrXОстрво МанrUUGrX УгандаrUTZrXТанзанијаrUMYrXМалезијаrUMXrXМексикоrUILrX ИзраелrUFRrXФранцускаrUAWrX АрубаrUDOrX+Доминиканска РепубликаrUSHrXСвета ЈеленаrUVCrX-Сент Винсент и ГренадиниrU054rXМеланезијаrUDJrX ЏибутиrUFJrXФиџиrU057rX'Микронезијски регионrUFMrXМикронезијаrU053rX-Аустралија и Нови ЗеландrUNIrXНикарагваrUNLrXХоландијаrUNOrXНорвешкаrUNArXНамибијаrUVUrXВануатуrUNCrXНова КаледонијаrUNErX НигерrUNFrXНорфолк ОстрвоrUNGrXНигеријаrUNZrXНови ЗеландrUNPrX НепалrUNRrX НауруrUNUrXНиуеrU061rXПолинезијаrUCIrXОбала СлоновачеrUCHrXШвајцарскаrUCOrXКолумбијаrUCNrXКинаrUCMrXКамерунrUCLrXЧилеrUCCrX&Кокос (Келинг) ОстрваrUCArX КанадаrUCGrX Конгоr UCFr X4Централно Афричка Републикаr UCDr X4Демократска република Конгоr UCZrX ЧешкаrUCYrX КипарrUCXrXБожићна острваrUCSrX!Србија и Црна ГораrUCRrXКостарикаrUPYrXПарагвајrUCVrXКапе ВердеrUCUrXКубаrUSZrXСвазилендrUSYr X Сиријаr!UKGr"XКиргизстанr#UKEr$X Кенијаr%USRr&XСуринамr'U143r(XЦентрална Азијаr)UKHr*XКамбоџаr+UKNr,XСент Китс и Невисr-UKMr.XКоморска Острваr/USTr0X#Сао Томе и Принципеr1USKr2XСловачкаr3UKRr4XЈужна Корејаr5USIr6XСловенијаr7UKPr8XСеверна Корејаr9UKWr:X Кувајтr;USNr<XСенегалr=USMr>XСан Мариноr?USLr@XСијера ЛеонеrAUSCrBXСејшелиrCUKZrDXКазахстанrEUKYrFXКајманска ОстрваrGUSGrHXСингапурrIUSErJXШведскаrKUSDrLX СуданrMU151rNXИсточна ЕвропаrOU150rPX ЕвропаrQUDMrRXДоминикаrSU155rTXЗападна ЕвропаrUU154rVXСеверна ЕвропаrWUVGrXX4Британска Девичанска ОстрваrYUDErZXНемачкаr[UYEr\X Јеменr]UMHr^XМаршалска Острваr_U062r`X(Јужно-централна АзијаraUDZrbX АлжирrcUUSrdX0Сједињене Америчке ДржавеreUUYrfXУругвајrgUYTrhX МајотеriUUMrjX+Мања удаљена острва САДrkULBrlX ЛибанrmULCrnXСент ЛуцијаroULArpXЛаосrqUTVrrX ТувалуrsUTWrtX ТајванruUTTrvX Тринидад и ТобагоrwUTRrxX ТурскаryULKrzXШри Ланкаr{ULIr|XЛихтенштајнr}UCKr~XКукова ОстрваrUTOrX ТонгаrULTrXЛитванијаrULUrXЛуксембургrULRrXЛиберијаrULSrX ЛесотоrUTHrXТајландrUTFrX2Француске Јужне ТериторијеrUTGrXТогоrUTDrXЧадrUTCrX'Туркс и Кајкос ОстрваrULYrX ЛибијаrUVArXВатиканrU145rXЗападна АзијаrUAErX0Уједињени Арапски ЕмиратиrUADrX АндораrUAGrX Антигве и БарбудаrUAFrXАвганистанrUAIrXАнгвилаrUVIrX+С.А.Д. Девичанска ОстрваrUISrX ИсландrUIRrXИранrUAMrXАрменијаrUALrXАлбанијаrUAOrX АнголаrUANrXХоландски АнтилиrU003rX1Северноамерички континентrU002rX АфрикаrU001rXСветrUARrXАргентинаrUAUrXАустралијаrUATrXАустријаrU005rXЈужна АмерикаrUINrX ИндијаrUAXrXАландска острваrU009rXОкеанијаrUAZrXАзербејџанrUIErX ИрскаrUIDrXИндонезијаrUJOrX ЈорданrUQUrXЕвропска унијаrUUArXУкрајинаrUQArX КатарrUDKrX ДанскаrUMZrXМозамбикrUQOrXОстала океанијаruUdecimal_formatsr}rNh)r}r(h!Nh#Kh$KKrh&h'h'rh)KKrh+X #,##0.###rh-h'h.rh0Nh1KKrubsU date_formatsr}r(UmediumrhG)r}r(h+X dd.MM.yyyy.rhKX%(dd)s.%(MM)s.%(yyyy)s.rubUfullrhG)r}r(h+XEEEE, dd. MMMM yyyy.rhKX$%(EEEE)s, %(dd)s. %(MMMM)s %(yyyy)s.rubUlongrhG)r}r(h+Xdd. MMMM yyyy.rhKX%(dd)s. %(MMMM)s %(yyyy)s.rubUshortrhG)r}r(h+Xd.M.yy.rhKX%(d)s.%(M)s.%(yy)s.rubuUcurrency_symbolsr}r(UAUDrX$ArUCHFrXSwFrUNOKrXNKrrUIEPrXIR£rUBEFrXBFrUINRrXINRrUCNYrXYr UYUNr XДинr UKWDr XKDr UBAMrXKMrUSEKrXSKrrUDKKrXDKrrUCADrXCan$ruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXКанарска острваrsUAustralia/Melbourner}rjXМелбурнrsU Europe/Minskr}r jX Минскr!sUAmerica/Miquelonr"}r#jXМикелонr$sUIndian/Reunionr%}r&jXУједињењеr'sUAntarctica/Davisr(}r)jX Дејвисr*sUAmerica/Coral_Harbourr+}r,jXКорал Харбурr-sU Asia/Dhakar.}r/jXДакаr0sUAmerica/St_Luciar1}r2jXСв. Луцијаr3sU Asia/Kashgarr4}r5jX Кашгарr6sUAmerica/Phoenixr7}r8jX Фениксr9sUAsia/Hong_Kongr:}r;jXХонг Конгr<sU Europe/Parisr=}r>jX Паризr?sUEurope/Stockholmr@}rAjXСтокхолмrBsU Pacific/FijirC}rDjXФиџиrEsU Pacific/ApiarF}rGjX АпијаrHsUPacific/Pago_PagorI}rJjXПаго ПагоrKsU Asia/RangoonrL}rMjX РангунrNsUAmerica/Mexico_CityrO}rPjXМексико СитиrQsUAmerica/Puerto_RicorR}rSjXПорто РикоrTsUIndian/MauritiusrU}rVjXМаурицијусrWsU Europe/BerlinrX}rYjX БерлинrZsU Europe/Zurichr[}r\jX Цирихr]sU America/Belemr^}r_jX Белемr`sUAsia/Krasnoyarskra}rbjXКраснојарскrcsUAtlantic/Bermudard}rejXБермудиrfsUAustralia/Currierg}rhjX КуриеrisU Asia/Tehranrj}rkjXТехеранrlsU Asia/Bakurm}rnjXБакуrosUAmerica/Danmarkshavnrp}rqjXДанмарксхагенrrsUAmerica/Scoresbysundrs}rtjXСкорезбисундrusUAmerica/Eiruneperv}rwjXЕирунепеrxsUAmerica/St_Kittsry}rzjXСент Китсr{sU Asia/Baghdadr|}r}jX Багдадr~sUAfrica/Monroviar}rjXМонровијаrsUAmerica/St_Vincentr}rjXСент ВинсентrsUAmerica/Vancouverr}rjXВанкуверrsU Asia/Thimphur}rjXТхимпхуrsU Africa/Accrar}rjXАкраrsUAmerica/Belizer}rjX БелизеrsUAmerica/Port_of_Spainr}rjXПорт оф СпејнrsU Asia/Tashkentr}rjXТашкентrsU Asia/Tokyor}rjX ТокиоrsUPacific/Kiritimatir}rjXКиритиматиrsUAustralia/Sydneyr}rjX СиднејrsU Europe/Rigar}rjXРигаrsU Asia/Dilir}rjXДилиrsUAfrica/Mbabaner}rjXМбабанеrsU Asia/Oralr}rjXОралrsU Asia/Adenr}rjXАденrsUEurope/Istanbulr}rjXИстанбулrsU Asia/Magadanr}rjXМагаданrsUPacific/Galapagosr}rjXГалапагосrsUAmerica/Bogotar}rjX БоготаrsUAmerica/Dawsonr}rjX ДосонrsUAmerica/Chicagor}rjX ЧикагоrsUPacific/Kwajaleinr}rjXКваџалејинrsUAustralia/Broken_Hillr}rjXБрокен ХилrsUAmerica/Cuiabar}rjX КуиабаrsUIndian/Christmasr}rjXБожићно острвоrsU Asia/Jayapurar}rjXЏајапураrsUEurope/Brusselsr}rjX БриселrsU Europe/Lisbonr}rjXЛисабонrsUAsia/Chongqingr}rjXЧонгкингrsUAmerica/Noronhar}rjX НороњаrsUAfrica/Algiersr}rjX АлжирrsU Africa/Hararer}rjX ХарареrsUAfrica/Ndjamenar}rjXНџаменаrsUAmerica/Costa_Ricar}rjXКостарикаrsUIndian/Mayotter}rjX МајотеrsUAsia/Phnom_Penhr}rjXПном ПенrsUAmerica/Managuar}rjXМанагваrsU Asia/Bruneir}rjXБрунејиrsUAmerica/Tijuanar}rjXТихуанаrsUPacific/Fakaofor}rjXФакаофоrsU America/Adakr}rjXАдакrsUAmerica/Antiguar}rjXАнтигваrsUPacific/Tahitir}rjX ТахитиrsUAmerica/Asuncionr}rjXАсунсионrsU Europe/Viennar}rjXБечrsUAustralia/Hobartr }r jX Хобартr sUAmerica/Inuvikr }r jX ИнувикrsUAmerica/Montrealr}rjXМонтреалrsU Asia/Seoulr}rjXСеулrsU Indian/Comoror}rjX КомороrsUAntarctica/Rotherar}rjX РотераrsUEurope/Tallinnr}rjX ТалинrsU Indian/Maher}rjXМахеr sUAmerica/Martiniquer!}r"jXМартиникr#sUAsia/Singaporer$}r%jXСингапурr&sUAfrica/Nairobir'}r(jXНајробиr)sUAmerica/Maceior*}r+jX Масејоr,sU Africa/Cairor-}r.jX Каироr/sU Europe/Moscowr0}r1jX Москваr2sUAsia/Pyongyangr3}r4jXПјонгјангr5sUAsia/Ulaanbaatarr6}r7jXУлан Баторr8sUIndian/Maldivesr9}r:jXМалдивиr;sU Asia/Colombor<}r=jXКоломбоr>sUAustralia/Adelaider?}r@jXАделајдrAsUAmerica/Cambridge_BayrB}rCjXКембриџ БејrDsU Africa/LuandarE}rFjX ЛуандаrGsUPacific/ChathamrH}rIjX КатхамrJsUAmerica/CordobarK}rLjXКордобаrMsU Asia/TbilisirN}rOjXТбилисиrPsUEurope/GibraltarrQ}rRjXГибралтарrSsU Asia/KarachirT}rUjX КарачиrVsU Asia/HarbinrW}rXjX ХарбинrYsUAmerica/Boa_VistarZ}r[jXБоа Вистаr\sUAfrica/Tripolir]}r^jXТриполиr_sUPacific/Wallisr`}rajX ВалисrbsUAtlantic/Stanleyrc}rdjX СтенлиresUAmerica/Blanc-Sablonrf}rgjXБланк-СејблонrhsUAntarctica/Syowari}rjjXШоваrksUAmerica/Jamaicarl}rmjXЈамајкаrnsU Europe/Kievro}rpjX КијевrqsUEurope/Budapestrr}rsjXБудимпештаrtsUPacific/Midwayru}rvjX МидвејrwsUAmerica/Goose_Bayrx}ryjX Гус БејrzsU Asia/Ammanr{}r|jXАманr}sU Asia/Sakhalinr~}rjXСахалинrsUAfrica/Windhoekr}rjXВиндхукrsU Asia/Katmandur}rjXКатмандуrsUAmerica/Guyanar}rjX ГуанаrsUAmerica/Sao_Paulor}rjXСао ПаолоrsUAustralia/Perthr}rjXПертrsUAfrica/Djiboutir}rjX ЏибутиrsU Asia/Jakartar}rjXЏакартаrsUAntarctica/Palmerr}rjX ПалмерrsUAfrica/Johannesburgr}rjXЈоханесбургrsU Asia/Irkutskr}rjX ИркуцкrsU Africa/Niameyr}rjXНијамејrsUAfrica/Casablancar}rjXКазабланкаrsU Asia/Bishkekr}rjX БишкекrsUAfrica/Nouakchottr}rjXНавакшутrsUEurope/Vilniusr}rjX ВиљнусrsUAmerica/Cayenner}rjX КајенrsUAfrica/Mogadishur}rjXМогадишrsUAmerica/Kentucky/Monticellor}rjX"Монтичело, КентакиrsUAmerica/Rio_Brancor}rjXРио БранкоrsUAmerica/Cancunr}rjX КанкунrsUAmerica/Havanar}rjX ХаванаrsU Pacific/Guamr}rjXГуамrsU Asia/Makassarr}rjXМакасарrsUAtlantic/Azoresr}rjX АзориrsUAustralia/Euclar}rjX ИуклаrsU Asia/Shanghair}rjX ШангајrsUAmerica/Godthabr}rjXНукrsU Asia/Beirutr}rjX БејрутrsU Africa/Maputor}rjX МапутоrsU Asia/Bahrainr}rjXБахреинrsU Asia/Ashgabatr}rjXАшхабадrsU Asia/Riyadhr}rjX РијадrsU Europe/Londonr}rjX ЛондонrsUAmerica/Monterreyr}rjXМонтерејrsUAmerica/Anguillar}rjXАнгвилаrsU Asia/Damascusr}rjX ДамаскrsUAmerica/North_Dakota/Centerr}rjX)Центар, Северна ДакотаrsUAtlantic/St_Helenar}rjXСвета ЈеленаrsUAmerica/Barbadosr}rjXБарбадосrsU Asia/Almatyr}rjXАлма-АтаrsU Africa/Lomer}rjXЛомеrsUAfrica/Brazzaviller}rjXБразавилrsU Asia/Taipeir}rjX ТајпејrsUAmerica/Tortolar}rjXТортолаrsU Europe/Vaduzr}rjX ВадуцrsU Africa/Asmerar}r jX Асмераr sUAntarctica/Mawsonr }r jX Мосонr sUAmerica/Buenos_Airesr}rjXБуенос АиресrsU Africa/Maserur}rjX МасеруrsUAmerica/St_Johnsr}rjX Св. ЏонrsUAfrica/Libreviller}rjXЛибревилrsUAfrica/Freetownr}rjXФритаунrsU Africa/Bissaur}rjX БисаоrsU Europe/Samarar }r!jX Самараr"sUEurope/Amsterdamr#}r$jXАмстердамr%sU Europe/Tiraner&}r'jX Тиранаr(sUPacific/Saipanr)}r*jX Сајпанr+sUAfrica/Abidjanr,}r-jX Абиџанr.sUEurope/Zaporozhyer/}r0jXЗапорожјеr1sUAmerica/El_Salvadorr2}r3jXСалвадорr4sU Europe/Madridr5}r6jX Мадридr7sUAmerica/Santiagor8}r9jXСантијагоr:sU America/Arubar;}r<jX Арубаr=sUAmerica/Indianapolisr>}r?jXИндианаполисr@sU Pacific/TrukrA}rBjXТрукrCsUPacific/FunafutirD}rEjXФанафутиrFsUAmerica/MeridarG}rHjX МеридаrIsUAmerica/GuatemalarJ}rKjXГватемалаrLsUAfrica/Sao_TomerM}rNjXСао ТомеrOsUPacific/KosraerP}rQjX КошреrRsUAfrica/BujumburarS}rTjXБуџумбураrUsUEurope/ChisinaurV}rWjX КишњевrXsU Europe/WarsawrY}rZjXВаршаваr[sUAsia/Yekaterinburgr\}r]jXЈекатеринбургr^sUAntarctica/Caseyr_}r`jX КасејrasUAmerica/Halifaxrb}rcjXХалифаксrdsU America/Thulere}rfjXТулеrgsUAmerica/Louisvillerh}rijXЛуивилеrjsUEurope/Helsinkirk}rljXХелсинкиrmsUAtlantic/Cape_Verdern}rojXКапе ВердеrpsU Indian/Cocosrq}rrjXКокосова острваrssU America/Boisert}rujX БојзиrvsUAmerica/Guadelouperw}rxjXГвадалупеrysUAmerica/Nassaurz}r{jX Насауr|sUPacific/Enderburyr}}r~jXЕндербериrsU Asia/Hovdr}rjXХовдrsUAmerica/Manausr}rjX МанаусrsUAmerica/Catamarcar}rjXКатамаркаrsUAmerica/Chihuahuar}rjXЧихуахуаrsUPacific/Gambierr}rjXГамбијеrsUEurope/Volgogradr}rjXВолгоградrsU Africa/Bamakor}rjX БамакоrsUEurope/Uzhgorodr}rjXУжгородrsU Africa/Banjulr}rjX БанжулrsU Asia/Aqtaur}rjX АктауrsU Africa/Malabor}rjX МалабоrsUPacific/Noumear}rjX НумеаrsUAfrica/Kinshasar}rjXКиншасаrsU Europe/Maltar}rjX МалтаrsU Asia/Bangkokr}rjX БанкокrsU Pacific/Niuer}rjXНиуеrsUAustralia/Brisbaner}rjXБризбејнrsUAmerica/Recifer}rjX РесифеrsU Asia/Yerevanr}rjXЈереванrsUAmerica/La_Pazr}rjX Ла ПазrsU Africa/Lusakar}rjX ЛусакаrsUPacific/Guadalcanalr}rjXГвадалканалrsUAsia/Vientianer}rjXВијетијанrsU Asia/Kuwaitr}rjX КувајтrsUAfrica/Conakryr}rjXКонакриrsU Europe/Oslor}rjXОслоrsUAmerica/Caracasr}rjXКаракасrsUAmerica/Panamar}rjX ПанамаrsUAfrica/Gaboroner}rjXГаборонrsU Pacific/Palaur}rjX ПалауrsUAmerica/Guayaquilr}rjXГвајакилrsUAsia/Kuala_Lumpurr}rjXКуала ЛумпурrsUAtlantic/Faeroer}rjXФарска ОстрваrsUAsia/Kamchatkar}rjXКамчаткаrsUAsia/Vladivostokr}rjXВладивостокrsU Asia/Qatarr}rjX КатарrsU Asia/Dushanber}rjXДушанбеrsU Asia/Yakutskr}rjXЈакутскrsU Asia/Omskr}rjXОмскrsU Africa/Banguir}rjX БангуиrsUAmerica/Paramaribor}rjXПарамирбоrsUAfrica/Lubumbashir}rjXЛумумбашиrsUPacific/Marquesasr}rjX МаркизrsU Asia/Anadyrr}rjX АнадирrsUAmerica/New_Yorkr}rjX ЊујоркrsUPacific/Norfolkr}rjXНорфолкr sUPacific/Rarotongar }r jXРаротонгаr sUAmerica/Dominicar }rjXДоминикаrsUAfrica/Porto-Novor}rjXПорто НовоrsUAsia/Samarkandr}rjXСамаркандrsUAmerica/Torontor}rjXТоронтоrsU America/Bahiar}rjX БахиаrsUAfrica/Kampalar}rjXКампалаrsUAfrica/Ouagadougour}r jXУагадугуr!sUAntarctica/South_Poler"}r#jXЈужни полr$sU Asia/Muscatr%}r&jX Мускатr'sUAmerica/Edmontonr(}r)jXЕдмонтонr*sU Pacific/Waker+}r,jXВакеr-sUAmerica/Indiana/Tell_Cityr.}r/jXТел Ситиr0sUAustralia/Darwinr1}r2jX Дарвинr3sUEurope/Copenhagenr4}r5jXКопенхагенr6sUAmerica/Montserratr7}r8jXМонтсератr9sUAmerica/Mendozar:}r;jXМендозаr<sUAfrica/Blantyrer=}r>jXБлантирr?sUAmerica/Detroitr@}rAjXДетроитrBsUAmerica/ShiprockrC}rDjX ШипрокrEsUAmerica/GrenadarF}rGjXГренадаrHsUAmerica/Indiana/PetersburgrI}rJjX&Петерсбург, ИндијанаrKsU Asia/DubairL}rMjX ДубаиrNsU Europe/AthensrO}rPjX АтинаrQsUAmerica/Port-au-PrincerR}rSjXПорт-о-ПренсrTsUAmerica/AraguainarU}rVjXАрагвајанаrWsUAmerica/CaymanrX}rYjXКајманска острваrZsUAfrica/Dar_es_Salaamr[}r\jXДар-ес-Саламr]sUAmerica/Curacaor^}r_jX Кирасоr`sUIndian/Kerguelenra}rbjXКергеленrcsUAfrica/Khartoumrd}rejX КартумrfsU Asia/Manilarg}rhjX МанилаrisUAmerica/Santo_Domingorj}rkjXСанто ДомингоrlsU Africa/Doualarm}rnjX ДуалаrosU Europe/Romerp}rqjXРимrrsUAmerica/Argentina/San_Juanrs}rtjXСан ХуанrusUAmerica/North_Dakota/New_Salemrv}rwjX0Нови Салем, Северна ДаткоаrxsUPacific/Port_Moresbyry}rzjXПорт Морзбиr{sUEurope/Andorrar|}r}jX Андораr~sUEurope/Luxembourgr}rjXЛуксембургrsUPacific/Honolulur}rjXХонолулуrsUAmerica/St_Thomasr}rjXСв. ТомаrsUPacific/Majuror}rjX МајуроrsUAmerica/Mazatlanr}rjXМазатланrsU Asia/Macaur}rjX МакауrsUAsia/Choibalsanr}rjXЧојбалсанrsUAntarctica/McMurdor}rjXМакмурдоrsUAmerica/Los_Angelesr}rjXЛос АнђелесrsU Asia/Kabulr}rjX КабулrsUIndian/Antananarivor}rjXАнтананаривоrsUAtlantic/Reykjavikr}rjXРејкјавикrsU Asia/Nicosiar}rjXНикозијаrsUPacific/Ponaper}rjX ПонапеrsUPacific/Tongatapur}rjXТонгатапуrsUPacific/Pitcairnr}rjXПиткаирнrsUPacific/Easterr}rjXУскршње острвоrsUAtlantic/South_Georgiar}rjXЈужна ЏорџијаrsUAfrica/El_Aaiunr}rjX Ел АјунrsUAmerica/Campo_Grander}rjXКампо ГрандеrsUAmerica/Dawson_Creekr}rjXДосон КрикrsUAntarctica/Vostokr}rjX ВостокrsUEurope/Bucharestr}rjXБукурештrsUAmerica/Porto_Velhor}rjXПорто ВељоrsU Europe/Monacor}rjX МонакоrsUAmerica/Indiana/Marengor}rjX Маренго, ИндијанаrsU Africa/Ceutar}rjX СеутаrsUAmerica/Winnipegr}rjXВинипегrsU Asia/Aqtober}rjXАкутобеrsU Africa/Dakarr}rjX ДакарrsUAmerica/Fortalezar}rjXФорталезаrsUPacific/Tarawar}rjX ТараваrsUAfrica/Addis_Ababar}rjXАдис АбебаrsU Pacific/Efater}rjX ЕфатеrsUPacific/Johnstonr}rjXЏонстонrsUPacific/Aucklandr}rjX ОкландrsUAmerica/Denverr}rjX ДенверrsU Indian/Chagosr}rjX ЧагосrsUAmerica/Glace_Bayr}rjXГлејс БејrsUAmerica/Hermosillor}rjXХермосиљоrsU Africa/Tunisr}rjX ТунисrsUAmerica/Montevideor}rjXМонтевидеоrsU Asia/Gazar}rjXГазаrsU Europe/Dublinr}rjX ДаблинrsUAntarctica/DumontDUrviller}rjXДимон д’УрвилrsUAmerica/Indiana/Knoxr}rjXКнокс, ИндијанаrsUAsia/Novosibirskr }r jXНовосибирскr sU Africa/Kigalir }r jX КигалиrsUAmerica/Grand_Turkr}rjXГранд ТуркrsU Africa/Lagosr}rjX ЛагосrsU Europe/Sofiar}rjX СофијаrsU America/Limar}rjXЛимаrsU Etc/Unknownr}rjX1Непознат или неважећи градrsUAmerica/Anchorager}rjXЕнкориџr sU Pacific/Naurur!}r"jX Науруr#suUscriptsr$}r%(UHebrr&Xхебрејско писмоr'UGeorr(Xгрузијско писмоr)UXpeor*X'староперсијско писмоr+UCyrlr,XЋирилицаr-UHrktr.X(Катакана или Хираганаr/UArmnr0Xјерменско писмоr1UCyrsr2X<Старословенска црквена ћирилицаr3ULatgr4Xгалска латиницаr5ULatfr6X4латиница (фрактур варијанта)r7UKhmrr8Xкмерско писмоr9ULatnr:XЛатиницаr;UDsrtr<XДезеретr=UGothr>X Готикаr?UEthir@Xетиопско писмоrAUKorerBXкорејско писмоrCUArabrDXарапско писмоrEUZxxxrFXНеписани језикrGUCoptrHXкоптичко писмоrIUHansrJX8поједностављено кинеско писмоrKUThairLXтајландско писмоrMUGlagrNXглагољицаrOUHantrPX4традиционално кинеско писмоrQUMongrRXмонголско писмоrSUDevarTXДеванагариrUURunrrVXрунско писмоrWUHirarXXХираганаrYUZzzzrZX5Непознато или неважеће писмоr[UTglgr\XТагалогr]UPhnxr^XФеничанско писмоr_UHungr`X%старомађарско писмоraUBrairbXБрајево писмоrcUBrahrdXбраманско писмоreUGrekrfXгрчко писмоrgUCherrhX ЧерокиriUKanarjXКатаканаrkUBengrlXбенгалско писмоrmUEgyprnX)египатски хијероглифиroUSyrjrpX)западносиријско писмоrquUvariantsrr}rs(U1606NICTrtXGФранцуски из касног средњег века до 1606.ruUSCOTLANDrvX4Шкотски стандардни ЕнглескиrwuUnumber_symbolsrx}ry(U patternDigitrzX#r{Udecimalr|X,r}Ugroupr~X.ruUcurrency_namesr}r(UCOPrXКолумбијски пезоrUMKDrX#Македонијски денарrUGBPrXФунта стерлингаrUTWDrX&Нови тајвански доларrUSITrX ТоларrUMTLrXМалтешка лираrUEGPrXЕгипатска фунтаrjXБелгијски франакrUBGNrXБугарски левrUFJDrXФиџи доларrUBADrX4Босанско-Херцеговачки динарrUUSDrXАмерички доларrUDEMrXНемачка маркаrUEEKrXЕстонска кроонrUBOBrX'Боливијски БоливианоrjX%Конвертибилна маркаrjXДанска крунаrUSKKrXСловачка крунаrjXКанадски доларrUAEDrX=Уједињени арапски емирати дирхамrUMXNrXМексички песоrUHUFrXМађарска форинтаrUVNDrXВијетнамски донгrj XКувајтски динарrURONrXРумунски леуrUPTErX#Португалски ескудоrUMYRrX#Малезијски ринггитrUAMDrXЈерменски драмrULYDrXЛибијски динарrUUAHrX!Украјинска хривњаrULTLrXЛитвански литасrUKRWrX!Јужнокорејски ВонrjXИрска фунтаrUEURrXЕвроrjXШведска крунаrUSGDrX!Сингапурски доларrUHKDrX$Хонг Конгски ДолариrULUFrX%Луксембуршки франакrUPKRrXПакистански рупиrjX#Аустралијски доларrjX!Швајцарски франакrUESPrXШпанска пезетаrUCSDrX;Српски Динар (Србија и Црна Гора)rUITLrXИталијанска лираrjX(Кинески Јуан РенминбиrUTRYrXНова турска лираrUGRDrX ДрахмаrUVEBrX)Венецуелански боливарrUHRKrXКунаrUNZDrX%Новозеландски доларrUHRDrXХрватски динарrUCLPrXЧилеански пезоrUBNDrXБрунејски доларrUTRLrX Стара Турска ЛираrUALLrXАлбански лекrUARSrXАргентински пезоrUILSrXИзраелски шекелrUZARrX"Јужно Афрички РандrUIDRrX%Индонезијска рупиахrjXНорвешка крунаrURSDrXСрпски ДинарrURUBrXРуска рубљаrUFIMrXФинска маркаrUPENrX$Перуански нуево солrjXИндијски РупиrUNLGrXХоландски гулденrUJPYrXЈенrUCZKrXЧешка крунаrUBRLrXБразилски РеалrUMADr X!Марокански дирхамr UFRFr XФранцуски франакr URURr X!Руска рубља (1991-1998)r UPHPr XФилипински песоr UKESr XКенијски шилингr UXXXr X7Непозната или неважећа валутаr UATSr X!Аустријски шилингr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXјr KXфr KXмr KXаr KXмr KXјr KXјr KXаr K Xсr K Xоr K Xнr K Xдr usUformatr }r! (Uwider" }r# (KX јануарr$ KXфебруарr% KXмартr& KX априлr' KXмајr( KXјунr) KXјулr* KX августr+ K Xсептембарr, K Xоктобарr- K Xновембарr. K Xдецембарr/ uU abbreviatedr0 }r1 (KXјанr2 KXфебr3 KXмарr4 KXапрr5 KXмајr6 KXјунr7 KXјулr8 KXавгr9 K Xсепr: K Xоктr; K Xновr< K Xдецr= uuuUcurrency_formatsr> }r? Nh)r@ }rA (h!Nh#Kh$KKrB h&X ¤rC jC rD h)KKrE h+X #,##0.00 ¤rF h-h'h.rG h0Nh1KKrH ubsUdaysrI }rJ (U stand-alonerK }rL UnarrowrM }rN (KXпrO KXуrP KXсrQ KXчrR KXпrS KXсrT KXнrU usUformatrV }rW (UwiderX }rY (KXпонедељакrZ KX уторакr[ KX средаr\ KXчетвртакr] KX петакr^ KX суботаr_ KX недељаr` uU abbreviatedra }rb (KXпонrc KXутоrd KXсреre KXчетrf KXпетrg KXсубrh KXнедri uuuU meta_zonesrj }rk (UEurope_Centralrl }rm (Ucommonrn Ulongro }rp (Udaylightrq X3Средњеевропско летње времеrr Ustandardrs X'Средњеевропско времеrt uuUEurope_Easternru }rv (jn jo }rw (jq X4Источноевропско летње времеrx js X)Источноевропско времеry uuuUerasrz }r{ (Uwider| }r} (KXПре нове ереr~ KXНове ереr uU abbreviatedr }r (KX п. н. е.r KXн. еr uUnarrowr }r (KX п.н.е.r KXн.е.r uuu.PK["ll)site-packages/babel/localedata/kam_KE.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[b޵%site-packages/babel/localedata/bg.datnu[}q(U zone_formatsq}q(UregionqX%sqUgmtqXГриинуич%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q Uformatq }q (Uwideq}q(KX1-во тримесечиеqKX2-ро тримесечиеqKX3-то тримесечиеqKX4-то тримесечиеquU abbreviatedq}q(KX I трим.qKX II трим.qKX III трим.qKX IV трим.quusUperiodsq}q(UamqX пр. об.qUpmqX сл. об.quUscientific_formatsq }q!Upercent_formatsq"}q#Ncbabel.numbers NumberPattern q$)q%}q&(Uexp_precq'NUscaleq(KdU frac_precq)KKq*Usuffixq+X%q,h,q-Uint_precq.KKq/Upatternq0X#0%q1Uprefixq2Xq3X-q4q5Uexp_plusq6NUgroupingq7MMq8ubsU week_dataq9}q:(Umin_daysq;KU weekend_startqKuU time_formatsq?}q@(UmediumqAcbabel.dates DateTimePattern qB)qC}qD(h0XHH:mm:ssqEUformatqFX%(HH)s:%(mm)s:%(ss)sqGubUfullqHhB)qI}qJ(h0X HH:mm:ss vqKhFX%(HH)s:%(mm)s:%(ss)s %(v)sqLubUlongqMhB)qN}qO(h0X HH:mm:ss zqPhFX%(HH)s:%(mm)s:%(ss)s %(z)sqQubUshortqRhB)qS}qT(h0XHH:mmqUhFX %(HH)s:%(mm)sqVubuU languagesqW}qX(Uzh_HantqYX)китайски (традиционен)qZUgvq[Xманкскиq\Uguq]Xгуджаратиq^Uscnq_Xсицилианскиq`Unl_BEqaXфламандскиqbUromqcXцигански езикqdUukqeXукраинскиqfUsqqgXалбанскиqhUalgqiXалгонквинqjUphnqkXфиникийскиqlUaleqmXалеутскиqnUkbdqoXкабардианqpUenmqqXанглийски (1100-1500)qrUkhaqsX кхасиqtUgdquX!шотландски галскиqvUgaqwXирландскиqxUgnqyXгуараниqzUaltq{Xюжноалтайскиq|Uen_AUq}X+австралийски английскиq~UmkqXмакедонскиqUhaiqX хайдаqUgmhqXнемски (1050-1500)qUcusqXкушитски езициqUfiuqXугрофинскиqUlnqXлингалаqUloqX лаоскиqUttqXтатарскиqUrajqXраджастанскиqUtrqX турскиqUadyqX адигеqUbynqXбиленскиqUausqX#австралийски езициqUpeoqX2староперсийски (600-400 пр.н.е.)qUtkqXтуркменскиqUthqXтаиqUadaqXадангмеqUtaiqX!тайландски (други)qUsuqXсунданскиqUteqX телугуqUfilqXФилипинскиqUgrcqXдревногръцкиqUbinqXбиниqUmgaqXирландски (900-1200)qUhitqX хитскиqUbikqXбиколскиqUdyuqX диулаqUcelqXкелтскиqUelxqXеламитскиqUcrpqXкреолски (други)qUfatqX ФантиqUdaqX датскиqUjaqXяпонскиqUdzqX дзонхаqUsrqXсръбскиqUdarqX даргваqUiraqXиранскиqUdvqX дивехиqUhilqXхилигайнонqUdayqXДаякскиqUgemqXгермански (други)qUbatqX%прибалтийски (други)qUtlqXтагалогqUquqX кечуаqUbasqXбасаqUgbaqXгбаяqUdsbqXДолносербскиqUknqXканнадаqUcmcqX чамскиqUbadqX бандаqUkpeqX кпелеqUibaqXибанqUbanqXбалинейскиqUbalqX балучиqUnlqXхоландскиqUotaqX,турски, отомански (1500-1928)qUbaiqXбамикелеqUarpqXарапахоqUelqX гръцкиqUeoqXесперантоqUenqXанглийскиqUartqXизкуственqUarwqX аравакqUeeqXеуеqUkmqXкхмерскиrUzh_HansrX#китайски (опростен)rUsgnrX!жестомимичен езикrUroarXромански (други)rUkaarXКаракалпашкиrUhimr Xхимачалиr Uyir Xидишr Usgar X'староирландски (до 900)rUarcrXарамейскиrUen_USrX)американски английскиrUeurX баскиrUetrXестонскиrUsemrXсемитски (други)rUkokrXконканиrUnubrXнубийски езициrUbtkrX батакrUijorXиджоr Urur!X рускиr"Uglr#Xгалисийскиr$Ugohr%X"старовисоконемскиr&Uklr'X)Гренландски ескимоскиr(Uhar)X хаузаr*Ukutr+Xкутенайr,Urmr-Xретороманскиr.Ukumr/Xкумикскиr0Ultr1Xлитовскиr2Ucur3X#църковно славянскиr4Uiror5X!Ироквиански езициr6Ugotr7Xготическиr8Ufonr9XФонr:Uror;Xрумънскиr<Ublar=Xсиксикаr>Ujvr?Xяванскиr@UsuxrAXшумерскиrBUgorrCXгоронталоrDUhsbrEXГорносербскиrFUberGXбеларускиrHUbgrIXбългарскиrJUbarKXбашкирскиrLUastrMXастурскиrNUworOX волофrPUbmrQXбамбараrRUbnrSXбенгалскиrTUborUXтибетскиrVUbhrWX бихариrXUbirYXбисламаrZUtar[Xтамилскиr\Uuzr]Xузбекскиr^Ubrr_Xбретонскиr`UbsraXбосненскиrbUlbrcXлюксембургскиrdUcrhreXкримскотатарскиrfUcoprgXкоптскиrhUmsriXмалайскиrjUacerkXачинскиrlUkarrmXкаренскиrnUiloroX илокоrpUachrqX аколиrrUocrsXокситанскиrtUsoruXсомалийскиrvUathrwXатабаски езициrxUkruryX КурукrzUakkr{Xакадскиr|Uundr}Xнеопределенr~UkrorXКруrUstrX сесутоrUtwrXтуиrUdrarXдравидски езициrUkrcrX!карачай-балкарскиrUmgrXмалгашкиrUtlhrXклингонrUosrXосетскиrUorrXорияrUtyrXтаитянскиrUxhrX ксосаrUchrX чамороrUcorXкорсиканскиrUjrbrXеврейско-арабскиrUcarXкаталонскиrUcerXчеченскиrUmasrXмасайскиrUcyrX уелскиrUangrX*староанглийски (ca.450-1100)rUmlrXмалаяламrUfrmrXфренски (1400-1600)rUfirX финскиrUcsrX чешкиrUcrrXкрииrUaparXезици на апахитеrUcvrXчувашкиrUbrarX браджrUlvrXлатвийскиrUchbrX чибчаrUdumrX:холандски, средновековен (1050-1350)rUptrXпортугалскиrUchgrXчагатайrUduarX дуалаrUchkrXчуукrUfrorXфренски (842-1400)rUchmrXмарийскиrUchnrXжаргон чинуукrUchorX чоктоrUchprXЧиипувскиrUpaarXпапуаски (други)rUchrrX черокиrUparXпенджабскиrUrwrXкиняруандаrUvirXвиетнамскиrUchyrXчейенскиrUgilrXГилбертскиrUisrXисландскиrUen_GBrX%британски английскиrUhzrX херероrUzhrXкитайскиrUhyrXарменскиrUgayrXгайоrUotorX!старотурски езициrUhrrXхърватскиrUiurXинуктитутrUtirXтигриняrUkarXгрузинскиrUhtrXхаитянскиrUhurXунгарскиrUsyrrXсирийскиrUhmnrX хмонгrUhirX хиндиrUhuprXхупаrUhorXхири мотуrUtgrXтаджикскиrUtutrXалтайскиrUbuarXбурятскиrUbugrXбугинскиrUgaarXгаrUher X ивритr Ubejr Xбеяr Ukhir Xезици коисанrUfurrXФриулианскиrUscrXсардинскиrUbemrX бембаrUcarrXкарибскиrUmorXмолдовскиrUmnrXмонголскиrUmirXмаорскиrUikrXинупиакrUcaurXкавказскиr Uurr!Xурдуr"Umtr#Xмалтийскиr$Ucair%X;централноамерикански индианскиr&Uainr'Xайнуr(Udelr)XДелауерr*Uplr+X полскиr,Udenr-Xславянскиr.Umrr/Xмаратхиr0Uberr1Xберберскиr2Uugr3Xуйгурскиr4Uhawr5Xхавайскиr6Umyr7Xбирманскиr8Uslar9Xславянски (други)r:Ucadr;X каддоr<Uaar=Xафарr>Uesr?Xиспанскиr@UsairAX>южноамерикански индиански (други)rBUabrCXабхазскиrDUaerEXавестскиrFUssrGX суазиrHUbhorIXбожпуриrJUafrKXафрикансrLUnerMXнепалскиrNUakrOXаканrPUkhorQX котскиrRUamrSXамхарскиrTUitrUXиталианскиrVUprorWXпровансалскиrXUanrYXарагонскиrZUiar[Xинтерлингваr\Uasr]Xасамскиr^Uarr_Xарабскиr`UinhraXингушетскиrbUekarcX екажукrdUioreXидоrfUavrgXаварскиrhUayriX аймараrjUinerkX*индо-европейски (други)rlUazrmXазърбайджанскиrnUieroXоксиденталrpUidrqXиндонезийскиrrUigrsXигбоrtUcebruXсебуаноrvUskrwXсловашкиrxUjprryX#еврейско-персийскиrzUafhr{Xафрихилиr|Unnr}X%съвременен норвежкиr~UnorXнорвежкиrUkmbrXкимбундуrUnairXDсеверноамерикански индиански (други)rUafarXафро-азиатскиrUcsbrXкашубскиrUphirX!филипински (други)rUefirXефикrUnaprXнеаполитанскиrUgrbrX гребоrUarnrX мапучеrUgezrXГиизrUzurXзулускиrUbntrX бантуrUmisrXдруги езициrUincrXиндийски (други)rUsahrXякутскиrUnyrXчинянджаrUkacrXКачинскиrUkabrXкабилскиrUfrrXфренскиrUderX немскиrUlarXлатинскиrUdinrX ДинкаrUfyrXфризийскиrUsvrXшведскиrUsmrXсамоанскиrUpsrXпущуrUkamrX камбаrUdgrrX догрибrUfarXперсийскиrUgonrX гондиrUkawrXкавиrUffrXФулаrUeworX евондоrUfjrXФиджийскиrUdakrXдакотскиrUsarXсанкскритскиrUawarX авадиrUforXФарьорскиrUegyrXегипетскиrUdoirX догриrUkgrXконгоанскиrUrnrX рундиrUkkrXказахскиrUkjrXКванямаrUkirX кикуйуrUkorXкорейскиrUcperX6креолски, от английски (други)rUcpfrX2креолски, от френски (други)rUjborXлоджбанrUksrXкашмирскиrUkrrX кануриrUsirXсинхалскиrUshrXсърбохърватскиrUkwrX#корнуолски келтскиrUkvrXКомиrUkurXкюрдскиrUslrXсловенскиrUcpprX:креолски, от португалски (други)rUfanrXФангrUkyrXкиргизскиrUsgrX сангоrUswrXсуахилиrUsdrX синдхиruU territoriesr}r(UBDrXБангладешrUBErX БелгияrUBFrXБуркина ФасоrUBGrXБългарияrUVEr XВенецуелаr UBAr X$Босна и Херцеговинаr UBBr XБарбадосrUWFrXУолис и ФутунаrUBMrXБермудаrUBNrXБруней ДарусаламrUBOrXБоливияrUBHrXБахрейнrUBIrXБурундиrUBJrX БенинrUBTrX БутанrU011rXЗападна Афиркаr UBVr!XОстров Бувеr"UBWr#XБотсуанаr$U014r%XИзточна Африкаr&U015r'XСеверна Африкаr(UBRr)XБразилияr*U017r+XЦентрална Африкаr,U018r-X)Южноафрикански регионr.U019r/XАмерикаr0UBYr1XБеларусr2UBZr3X Белизr4ULVr5X Латвияr6URWr7X Руандаr8URSr9X Сърбияr:UTLr;XИзточен Тиморr<UREr=XРеюниънr>UTMr?XТуркменистанr@UOMrAXОманrBUTJrCXТаджикистанrDUROrEXРумънияrFUTKrGXТокелауrHUGWrIXГвинея-БисауrJUGUrKXГуамrLUGTrMXГватемалаrNUGSrOXIЮжна Джорджия и Южни Сандвичеви ОстровиrPUGRrQX ГърцияrRUGQrSX%Екваториална ГвинеяrTUGPrUXГваделупаrVUJPrWX ЯпонияrXUKIrYXКирибатиrZUGYr[X Гвианаr\UGGr]Xо. Гърнзиr^UGFr_XФренска Гвианаr`UGEraX ГрузияrbUGDrcXГренадаrdU021reXСеверна АмерикаrfUGBrgX#Обединено кралствоrhUGAriX ГабонrjUSVrkXЕл СалвадорrlUGNrmX ГвинеяrnUGMroX ГамбияrpUGLrqXГренландияrrU029rsXКарибски о-виrtUGIruXГибралтарrvUGHrwXГанаrxUJEryXо. ДжързиrzUTNr{X Тунисr|UJMr}X Ямайкаr~U013rX!Централна АмерикаrUWSrX СамоаrU419rX@Латинска Америка и Карибски басейнrUHRrXХърватскаrUBSrX БахамиrUHTrX ХаитиrUHUrXУнгарияrUHKrX+Хонг-Конг О.А.Р. на КитайrU039rXЮжна ЕвропаrUHNrXХондурасrUFIrXФинландияrU142rXАзияrU030rXИзточна АзияrU034rXЮжна АзияrU035rXЮгоизточна АзияrUPRrXПуерто РикоrUPSrX)Палестински територииrU830rXНормандски о-виrUFKrX%Фолклендски островиrUIOrXFБритански територии в Индийския океанrUPWrX ПалауrUPTrXПортугалияrUSJrX#Свалбард и Ян МайенrUMDrX"Молдова, РепубликаrUFMrX1Микронезия, Обединени ЩатиrUIQrXИракrUPArX ПанамаrUPFrX!Френска ПолинезияrUPGrX Папуа Нова ГвинеяrUPErXПеруrUPKrXПакистанrUPHrXФилипиниrUFOrX!Фарьорски островиrUPNrXПиткайрнrUPLrX ПолшаrUPMrX!Сен Пиер и МигелонrUZMrX ЗамбияrUEHrXЗападна СахараrURUrXРуска ФедерацияrUEErXЕстонияrUEGrX ЕгипетrUZArXЮжна АфрикаrUECrXЕквадорrUITrX ИталияrUVNrXВиетнамrUZZrXBНепознатa или несъществуваща областrUSBrX#Соломонови ОстровиrUETrXЕтиопияrUSOrXСомалияrUZWrXЗимбабвеrUSArXСаудитска АрабияrUESrXИспанияrUERrXЕритреяrUMErXЧерна ГораrUAQrXАнтарктикаrUMGrXМадагаскарrUMArX МарокоrUMCrX МонакоrUUZrXУзбекистанrUMMrXМианмарrUMLrXМалиrUMOrX$Макао О.А.Р. на КитайrUMNrXМонголияrUHMrX:Остров Хърд и Острови МакдоналдrUASrX!Американско СамоаrUMKrX&Македония, РепубликаrUMUrXМаврицийrUMTrX МалтаrUMWrX МалавиrUMVr XМалдивиr UMQr XМартиникаr UMPr X0Северни Мариански ОстровиrUMSrXМонсератrUMRrXМавританияrUIMrX о.МанrUUGrX УгандаrUTZrXТанзанияrUMYrXМалайзияrUMXrXМексикоrUILrX ИзраелrUFRrXФранцияr UAWr!X Арубаr"UDOr#X+Доминиканска Републикаr$USHr%XСвета Еленаr&UVCr'X/Сейнт Винсънт и Гренадиниr(U054r)XМеланезияr*UDJr+XДжибутиr,UFJr-X Фиджиr.U057r/XМикронезияr0U172r1X;Общност на независимите държавиr2U053r3X/Австралия и Нова Зеландияr4UNIr5XНикарагуаr6UNLr7XХоландияr8UNOr9XНорвегияr:UNAr;XНамибияr<UVUr=XВануатуr>UNCr?XНова Каледонияr@UNErAX НигерrBUNFrCXОстров НорфолкrDUNGrEXНигерияrFUNZrGXНова ЗеландияrHUNPrIX НепалrJUNRrKX НауруrLUNUrMXНиуеrNU061rOXПолинезияrPUCIrQX)Бряг на Слоновата костrRUCHrSXШвейцарияrTUCOrUXКолумбияrVUCNrWX КитайrXUCMrYXКамерунrZUCLr[XЧилиr\UCCr]X0Кокосови (Кийлинг) островиr^UCAr_X Канадаr`UCGraX КонгоrbUCFrcX9Централноафриканска РепубликаrdUCDreX6Демократична Република КонгоrfUCZrgXЧешка РепубликаrhUCYriX КипърrjUCXrkXОстров КристмасrlUCSrmX#Сърбия и Черна ГораrnUCRroXКоста РикаrpUPYrqXПарагвайrrUCVrsXКабо ВердеrtUCUruXКубаrvUSZrwXСуазилендrxUSYryX2Сирийска Арабска РепубликаrzUKGr{XКиргизстанr|UKEr}X Кенияr~USRrXСуринамrU143rXЦентрална АзияrUKHrXКамбоджаrUKNrX!Сейнт Китс и НевисrUKMrX КомориrUSTrX#Сао Томе и ПринципеrUSKrXСловакияrUKRrXКорея, ЮжнаrUSIrXСловенияrUKPrXКорея, СевернаrUKWrX КувейтrUSNrXСенегалrUSMrXСан МариноrUSLrXСиера ЛеонеrUSCrXСейшелиrUKZrXКазахстанrUKYrX!Кайманови островиrUSGrXСингапурrUSErX ШвецияrUSDrX СуданrU151rXИзточна ЕвропаrU150rX ЕвропаrUDMrXДоминикаrU155rXЗападна ЕвропаrU154rXСеверна ЕвропаrUVGrX6Британски Вирджински ОстровиrUDErXГерманияrUYErX ЙеменrUMHrX!Маршалови ОстровиrU062rXЮжна Азия [062]rUDZrX АлжирrUUSrXСАЩrUUYrXУругвайrUYTrX МейотrUUMrX$САЩ - външни островиrULBrX ЛиванrULCrXСейнт ЛусияrULArXCНародна Демократична Република ЛаосrUTVrX ТувалуrUTWrX ТайванrUTTrX Тринидад и ТобагоrUTRrX ТурцияrULKrXШри ЛанкаrULIrXЛихтенщайнrUCKrXОстрови КукrUTOrX ТонгаrULTrX ЛитваrULUrXЛюксембургrULRrXЛиберияrULSrX ЛесотоrUTHrXТайландrUTFrX*Френски Южни ТериторииrUTGrXТогоrUTDrXЧадrUTCrX)Острови Туркс и КайкосrULYrX4Либийска Арабска ДжамахирияrUVArX=Свещено море (Ватиканска държава)rU145rXЗападна АзияrUAErX2Обединени Арабски ЕмирстваrUADrX АндораrUAGrX Антигуа и БарбудаrUAFrXАфганистанrUAIrXАнгуилаrUVIrX+САЩ, Вирджински ОстровиrUISrXИсландияrUIRrX-Иран, Ислямска републикаrUAMrXАрменияrUALrXАлбанияrUAOrX АнголаrUANr XХоландски Антилиr U003r X7Северноамерикански континентr U002r X АфрикаrU001rX ЗемятаrUARrXАржентинаrUAUrXАвстралияrUATrXАвстрияrU005rXЮжна АмерикаrUINrX ИндияrUAXrXАландски о-виrU009rXОкеанияrUAZrXАзербайджанr UIEr!XИрландияr"UIDr#XИндонезияr$UJOr%XЙорданияr&UQUr'XЕвропейски съюзr(UUAr)XУкрайнаr*UQAr+X Катарr,UDKr-X Данияr.UMZr/XМозамбикr0UQOr1XОкеания [QO]r2uUdecimal_formatsr3}r4Nh$)r5}r6(h'Nh(Kh)KKr7h+h3h3r8h.KKr9h0X #,##0.###r:h2h3h4r;h6Nh7KKr<ubsU date_formatsr=}r>(Umediumr?hB)r@}rA(h0X dd.MM.yyyyrBhFX%(dd)s.%(MM)s.%(yyyy)srCubUfullrDhB)rE}rF(h0Xdd MMMM yyyy, EEEErGhFX"%(dd)s %(MMMM)s %(yyyy)s, %(EEEE)srHubUlongrIhB)rJ}rK(h0X dd MMMM yyyyrLhFX%(dd)s %(MMMM)s %(yyyy)srMubUshortrNhB)rO}rP(h0Xdd.MM.yyrQhFX%(dd)s.%(MM)s.%(yy)srRubuUcurrency_symbolsrS}rT(UDZDrUXDArVUNADrWXN$rXUKMFrYXCFrZUBGLr[Xлвr\UBGNr]Xлв.r^UBOBr_XBsr`UDKKraXDKrrbULBPrcXLLrdUTZSreXT ShrfUKHRrgXCRrhUMYRriXRMrjULYDrkXLDrlUJODrmXJDrnUSARroXSRlrpUHKDrqXHK$rrUCHFrsXSwFrtUBYRruXRblrvUXPFrwXCFPFrxUMROryXUMrzUDJFr{XDFr|UZWDr}XZ$r~UVUVrXVTrUUYUrXUr$rUAUDrX$ArUSYPrXLSrUMZMrXMtrUSCRrXSRrUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLrXMrUMNTrXTugrUAMDrXdramrUUGXrXU ShrUJMDrXJ$rUGELrXlarirUAFNrXAfrUTRLrXTLrUBDTrXTkrUYERrXYRlrUANGrXNA f.rUXCDrXEC$rUNOKrXNKrrUINRrXINRrUMXNrXMEX$rUBTNrXNurUCOPrXCol$rUIDRrXRprUHNLrXLrUFJDrXF$rUETBrXBrrUBZDrXBZ$rUDOPrXRD$rUQARrXQRrUSEKrXSKrrUSRGrXSfrUIEPrXIR£rUBBDrXBDS$rUGTQrXQrUVEBrXBerUCLPrXCh$rUALLrXlekrUKZTrXTrURUBrXРуб.rUTTDrXTT$rUOMRrXROrUSBDrXSI$rUPLNrXZlrUKESrXK ShrUGYDrXG$rUMKDrXMDenrUTWDrXNT$rUTOPrXT$rUGNFrXGFrUIQDrXIDrUBAMrXKMrUCADrXCan$rUCVErXCVEscrUKWDrXKDrUBIFrXFburUSOSrXSh.rUSGDrXS$rUSTDr XDbr UIRRr XRIr UCNYr XYrUCYPrX£CrUMTLrXLmrUNZDrX$NZrUKGSrXsomrUARSrXArg$rUSZLrXErUBHDrXBDruU time_zonesr}r(UAtlantic/Canaryr}r Ucityr!XКанарски о-виr"sUAustralia/Melbourner#}r$j!XМелбърнr%sU Europe/Minskr&}r'j!X Минскr(sUAmerica/Nipigonr)}r*j!XНипигонr+sUAmerica/Miquelonr,}r-j!XМикелонr.sUPacific/Wallisr/}r0j!X Уолисr1sUAntarctica/Davisr2}r3j!XБаза Дейвисr4sU Asia/Dhakar5}r6j!XДакаr7sUAmerica/St_Luciar8}r9j!XСв. Лучияr:sU Asia/Kashgarr;}r<j!X Кашгарr=sUAmerica/Phoenixr>}r?j!X Финиксr@sU Asia/KuwaitrA}rBj!X КувейтrCsUAsia/Hong_KongrD}rEj!XХонг КонгrFsUArctic/LongyearbyenrG}rHj!XЛонгирбюенrIsU Europe/ParisrJ}rKj!X ПарижrLsUEurope/StockholmrM}rNj!XСтокхолмrOsU Pacific/FijirP}rQj!X ФиджиrRsU Pacific/ApiarS}rTj!XАпиаrUsUPacific/Pago_PagorV}rWj!XПаго ПагоrXsU Asia/RangoonrY}rZj!X Рангунr[sUAmerica/Mexico_Cityr\}r]j!XМексикоr^sUAmerica/Puerto_Ricor_}r`j!XПуерто РикоrasUIndian/Mauritiusrb}rcj!XМаврицийrdsU Europe/Berlinre}rfj!X БерлинrgsU Europe/Zurichrh}rij!X ЦюрихrjsU America/Belemrk}rlj!X БелемrmsUAsia/Krasnoyarskrn}roj!XКрасноярскrpsUAtlantic/Bermudarq}rrj!XБермудски О-виrssUAmerica/Araguainart}ruj!XАрагуайнаrvsU Asia/Tehranrw}rxj!XТехеранrysU Asia/Saigonrz}r{j!X Сайгонr|sU Asia/Bakur}}r~j!XБакуrsUAmerica/Danmarkshavnr}rj!XДанмаркшавнrsUAmerica/Scoresbysundr}rj!XСгорсбисонrsUAmerica/Eiruneper}rj!XЕйрунепеrsUAmerica/Caracasr}rj!XКаракасrsU Asia/Baghdadr}rj!X БагдадrsUAfrica/Monroviar}rj!XМонровияrsUAmerica/St_Vincentr}rj!XСв. ВинсентrsUAmerica/Vancouverr}rj!XВанкувърrsU Asia/Thimphur}rj!X ТхимпуrsU Africa/Accrar}rj!XАкраrsUAmerica/Belizer}rj!XБелмопанrsUAmerica/Port_of_Spainr}rj!XПорт ъф СпейнrsUAmerica/Mendozar}rj!XМендосаrsU Asia/Tokyor}rj!X ТокиоrsUPacific/Kiritimatir}rj!Xо. РождествоrsUAustralia/Sydneyr}rj!X СидниrsU Europe/Rigar}rj!XРигаrsU Asia/Dilir}rj!XДилиrsUAfrica/Mbabaner}rj!XМбабанеrsU Asia/Oralr}rj!XАралrsU Asia/Adenr}rj!XАденrsUEurope/Istanbulr}rj!XИстанбулrsU Asia/Magadanr}rj!XМагаданrsUAustralia/Lindemanr}rj!XЛиндеманrsUPacific/Galapagosr}rj!Xо-ви ГалапагосrsUAmerica/Bogotar}rj!X БоготаrsUAmerica/Dawsonr}rj!X ДоусънrsUAmerica/Chicagor}rj!X ЧикагоrsUPacific/Kwajaleinr}rj!XКвайджаленrsUAustralia/Broken_Hillr}rj!XБроукън ХилrsUAmerica/Cuiabar}rj!X ЧуябаrsUIndian/Christmasr}rj!XКоледни о-виrsU Asia/Jayapurar}rj!XДжаяпураrsUEurope/Brusselsr}rj!XБрюкселrsU Europe/Lisbonr}rj!XЛисабонrsUAsia/Chongqingr}rj!X ЧунцинrsUAmerica/Noronhar}rj!XНоронхаrsUAfrica/Algiersr}rj!X АлжирrsU Africa/Hararer}rj!X ХарареrsUAfrica/Ndjamenar}rj!XНджаменаrsUAmerica/Costa_Ricar}rj!XСан ХосеrsUIndian/Mayotter}rj!X МайотеrsUAsia/Phnom_Penhr}rj!XПном ПенrsUAmerica/Managuar}rj!XМанагуаrsU Asia/Bruneir}rj!X БрунейrsUAmerica/Tijuanar}rj!XТихуанаr sUPacific/Fakaofor }r j!XФакаофоr sU America/Adakr }rj!XАдакrsUAmerica/Antiguar}rj!XАнтигуаrsUAmerica/Argentina/La_Riojar}rj!XЛа РиохаrsUPacific/Tahitir}rj!X ТаитиrsUAmerica/Pangnirtungr}rj!XПангниртунгrsUAmerica/Asuncionr}rj!XАсунсионrsU Europe/Viennar}r j!X Виенаr!sUAustralia/Hobartr"}r#j!XХоубартr$sUAmerica/Juneaur%}r&j!X Джуноr'sUAmerica/Inuvikr(}r)j!X Инувикr*sUAmerica/Montrealr+}r,j!XМонреалr-sU Asia/Seoulr.}r/j!XСеулr0sU Indian/Comoror1}r2j!XКоморски о-виr3sUAntarctica/Rotherar4}r5j!X Ротераr6sUEurope/Tallinnr7}r8j!X Талинr9sU Indian/Maher:}r;j!XМахеr<sUAmerica/Martiniquer=}r>j!XМартиникr?sUAsia/Singaporer@}rAj!XСингапурrBsUAfrica/NairobirC}rDj!XНайробиrEsUAmerica/MaceiorF}rGj!X МасейоrHsU Asia/UrumqirI}rJj!X УрумчиrKsU Europe/MoscowrL}rMj!X МоскваrNsUAsia/PyongyangrO}rPj!X ПхенянrQsUAsia/UlaanbaatarrR}rSj!XУланбаторrTsUAmerica/Rainy_RiverrU}rVj!XРейни РивърrWsUIndian/MaldivesrX}rYj!XМалдивски О-виrZsU Asia/Colombor[}r\j!XКоломбоr]sUAustralia/Adelaider^}r_j!X Адълидr`sUAmerica/Cambridge_Bayra}rbj!XКеймбридж БейrcsU Africa/Luandard}rej!X ЛуандаrfsUPacific/Chathamrg}rhj!Xо-ви ЧатамrisUAmerica/Cordobarj}rkj!XКордобаrlsU Asia/Tbilisirm}rnj!XТбилисиrosUEurope/Gibraltarrp}rqj!XГибралтарrrsU Asia/Karachirs}rtj!X КарачиrusU Asia/Harbinrv}rwj!X ХарбинrxsUAustralia/Lord_Howery}rzj!XЛорд Ховr{sUAmerica/Boa_Vistar|}r}j!XБуа Вистаr~sUAfrica/Tripolir}rj!XТриполиrsUIndian/Reunionr}rj!XРеюнионrsUAtlantic/Stanleyr}rj!X СтенлиrsUAntarctica/Syowar}rj!X СуоваrsUAmerica/Jamaicar}rj!XКингстънrsU Europe/Kievr}rj!XКиевrsUEurope/Budapestr}rj!XБудапещаrsUPacific/Midwayr}rj!Xо. МидуейrsUAmerica/Goose_Bayr}rj!X Гус БейrsU Asia/Ammanr}rj!XАманrsU Asia/Sakhalinr}rj!XСахалинrsUAfrica/Windhoekr}rj!XВиндхукrsU Asia/Katmandur}rj!XКатмандуrsUAmerica/Guyanar}rj!XДжорджтаунrsUAmerica/Sao_Paulor}rj!XСао ПаулоrsUAustralia/Perthr}rj!XПъртrsUAfrica/Djiboutir}rj!XДжибутиrsU Asia/Jakartar}rj!XДжакартаrsUAntarctica/Palmerr}rj!X ПалмърrsUAfrica/Johannesburgr}rj!XЙоханесбургrsU Asia/Irkutskr}rj!XИркутскrsU Africa/Niameyr}rj!X НиамейrsUAfrica/Casablancar}rj!XКазабланкаrsUAmerica/Indiana/Marengor}rj!XМаренгоrsUAfrica/Nouakchottr}rj!XНуакшотrsUEurope/Vilniusr}rj!X ВилнюсrsUAmerica/Cayenner}rj!X КайенrsUAfrica/Mogadishur}rj!XМогадишоrsUAmerica/Kentucky/Monticellor}rj!XМонтичелоrsUAmerica/Rio_Brancor}rj!XРио БранкоrsUAmerica/Cancunr}rj!X КанкунrsUAmerica/Havanar}rj!X ХаванаrsU Pacific/Guamr}rj!XГуамrsU Asia/Makassarr}rj!X!Макасарски протокrsUAtlantic/Azoresr}rj!XАзорски о-виrsU Asia/Shanghair}rj!X ШанхайrsUAmerica/Rankin_Inletr}rj!XРанкин ИнлетrsU Asia/Beirutr}rj!X БейрутrsU Africa/Maputor}rj!X МапутуrsU Asia/Bahrainr}rj!XБахрейнrsU Asia/Ashgabatr}rj!XАшхабадrsU Asia/Riyadhr}rj!XРиядrsU Europe/Londonr}rj!X ЛондонrsUAmerica/Monterreyr}rj!XМонтерейrsUAmerica/Anguillar}rj!X АнгилаrsU Asia/Damascusr}rj!X ДамаскrsUAmerica/North_Dakota/Centerr }r j!X Сентърr sUAmerica/Indiana/Vevayr }r j!XВевеrsUAtlantic/St_Helenar}rj!XСв. ЕленаrsUAmerica/Barbadosr}rj!XБриджтаунrsU Asia/Almatyr}rj!XАлма АтаrsU Africa/Lomer}rj!XЛомеrsUAfrica/Brazzaviller}rj!XБразавилrsU America/Nomer}rj!XНоумr sU Asia/Taipeir!}r"j!X Тайпейr#sUAmerica/Yakutatr$}r%j!X Якутатr&sUAmerica/Tortolar'}r(j!XТортолаr)sU Europe/Vaduzr*}r+j!X Вадуцr,sU Africa/Asmerar-}r.j!X Асмераr/sUAntarctica/Mawsonr0}r1j!X Моусънr2sUAmerica/Buenos_Airesr3}r4j!XБуенос Айресr5sU Africa/Maserur6}r7j!X Масеруr8sUAmerica/Louisviller9}r:j!XЛуизвилr;sU Asia/Kuchingr<}r=j!X Кучинr>sUAfrica/Libreviller?}r@j!XЛибървилrAsUAfrica/FreetownrB}rCj!XФрийтаунrDsU Africa/BissaurE}rFj!X БисауrGsU Europe/SamararH}rIj!X СамараrJsUEurope/AmsterdamrK}rLj!XАмстердамrMsU Europe/TiranerN}rOj!X ТиранаrPsUPacific/SaipanrQ}rRj!X СайпанrSsUAfrica/AbidjanrT}rUj!XАбиджанrVsUEurope/ZaporozhyerW}rXj!XЗапорожиеrYsUAmerica/El_SalvadorrZ}r[j!XСан Салвадорr\sU Europe/Madridr]}r^j!X Мадридr_sUAmerica/Santiagor`}raj!XСантиагоrbsU America/Arubarc}rdj!X АрубаresUAmerica/Indianapolisrf}rgj!XИндианополисrhsUAmerica/Reginari}rjj!X РегинаrksU Pacific/Trukrl}rmj!Xо-ви ТрукrnsUPacific/Funafutiro}rpj!XФунафутиrqsUAmerica/Meridarr}rsj!X МеридаrtsUAmerica/Guatemalaru}rvj!XГватемалаrwsUAfrica/Sao_Tomerx}ryj!XСао ТомеrzsUPacific/Kosraer{}r|j!Xо. Косраеr}sUAfrica/Bujumburar~}rj!XБужумбураrsUEurope/Chisinaur}rj!XКишиневrsU Europe/Warsawr}rj!XВаршаваrsUAsia/Yekaterinburgr}rj!XЕкатерининбургrsUAntarctica/Caseyr}rj!X КейсиrsUAmerica/Halifaxr}rj!XХалифаксrsU America/Thuler}rj!XТулеrsUAmerica/St_Johnsr}rj!XСейнт ДжоунсrsUEurope/Helsinkir}rj!XХелзинкиrsUAtlantic/Cape_Verder}rj!XКабо ВердеrsU Indian/Cocosr}rj!X КокосrsU America/Boiser}rj!XБуазrsUAmerica/Guadelouper}rj!X Бас ТерrsUAmerica/Nassaur}rj!X НасауrsUPacific/Enderburyr}rj!Xо. ЕндърбъриrsU Asia/Hovdr}rj!X КобдоrsUAmerica/Manausr}rj!X МануасrsUAmerica/Godthabr}rj!X ГотхобrsUAmerica/Catamarcar}rj!XКатамаркаrsUAmerica/Chihuahuar}rj!X ЧиуауаrsUAmerica/Iqaluitr}rj!XИквалуитrsUAmerica/Argentina/Rio_Gallegosr}rj!XРио ГалегосrsUPacific/Gambierr}rj!XГамбиерrsU Africa/Bamakor}rj!X БамакоrsUEurope/Uzhgorodr}rj!XУжгородrsU Africa/Banjulr}rj!XБанджулrsU Asia/Aqtaur}rj!X АятауrsU Africa/Malabor}rj!X МалабоrsUAtlantic/Madeirar}rj!XМадейраrsUPacific/Noumear}rj!X НумеаrsUAfrica/Kinshasar}rj!XКиншасаrsU Europe/Maltar}rj!XЛа ВалетаrsUAmerica/Argentina/Ushuaiar}rj!X УшуаяrsU Asia/Bangkokr}rj!XБангкокrsU Pacific/Niuer}rj!XНиуеrsUAustralia/Brisbaner}rj!XБризбейнrsUAmerica/Recifer}rj!X РесифеrsU Asia/Yerevanr}rj!X ЕреванrsUAmerica/La_Pazr}rj!X Ла ПасrsU Africa/Cairor}rj!X КайроrsU Africa/Lusakar}rj!X ЛусакаrsUPacific/Guadalcanalr}rj!XГуадалканалrsUAmerica/Yellowknifer}rj!XЙелоунайфrsUAsia/Vientianer}r j!XВиентянr sUEurope/Kaliningradr }r j!XКалининградr sUAfrica/Conakryr }r j!XКонакриr sUAmerica/Argentina/Tucumanr }r j!XТукуманr sU Europe/Oslor }r j!XОслоr sUAmerica/St_Kittsr }r j!XСейнт Китсr sUAmerica/Panamar }r j!X Панамаr sUAfrica/Gaboroner }r j!XГаборонеr sU Pacific/Palaur }r j!X Палауr sUAmerica/Guayaquilr }r j!XГуаякилr sUAsia/Kuala_Lumpurr }r j!XКуала Лумпурr sUAtlantic/Faeroer }r! j!XФарьоритеr" sUAmerica/Menomineer# }r$ j!XМеномнииr% sUAsia/Kamchatkar& }r' j!Xп-в Камчаткаr( sUAsia/Vladivostokr) }r* j!XВладивостокr+ sU Asia/Qatarr, }r- j!X Катарr. sU Asia/Dubair/ }r0 j!X Дубайr1 sU Asia/Yakutskr2 }r3 j!X Якутскr4 sU Asia/Omskr5 }r6 j!XОмскr7 sU Africa/Banguir8 }r9 j!X Бангиr: sUAmerica/Paramaribor; }r< j!XПарамарибоr= sUAfrica/Lubumbashir> }r? j!XЛубумбашиr@ sUPacific/MarquesasrA }rB j!XМаркизки о-виrC sU Asia/AnadyrrD }rE j!X АнадирrF sUAmerica/New_YorkrG }rH j!X Ню ЙоркrI sUPacific/NorfolkrJ }rK j!XНорфолкrL sUPacific/RarotongarM }rN j!XРаротонгаrO sUAmerica/DominicarP }rQ j!XДоминикаrR sUAfrica/Porto-NovorS }rT j!XПорто НовоrU sUAsia/SamarkandrV }rW j!XСамаркандrX sU Asia/DushanberY }rZ j!XДушанбеr[ sUAmerica/Torontor\ }r] j!XТоронтоr^ sU America/Bahiar_ }r` j!X Бахиаra sUAfrica/Kampalarb }rc j!XКампалаrd sUAfrica/Ouagadougoure }rf j!XУагадугуrg sUAntarctica/South_Polerh }ri j!XЮжен полюсrj sU Asia/Muscatrk }rl j!X Мускатrm sUAmerica/Edmontonrn }ro j!XЕдмънтънrp sU Pacific/Wakerq }rr j!X о. Уейкrs sUAustralia/Darwinrt }ru j!X Даруинrv sUAmerica/Whitehorserw }rx j!XУайтхорсry sUAmerica/Swift_Currentrz }r{ j!XСуифт Кърентr| sUEurope/Copenhagenr} }r~ j!XКопенхагенr sUAmerica/Montserratr }r j!XМонсератr sU Asia/Tashkentr }r j!XТашкентr sUEurope/Simferopolr }r j!XСевастополr sUAfrica/Blantyrer }r j!XБлантайрr sUAmerica/Detroitr }r j!XДетройтr sUAmerica/Shiprockr }r j!X Шипрокr sUAmerica/Grenadar }r j!XСент Джорджесr sUAsia/Pontianakr }r j!XПонтианакr sU Europe/Athensr }r j!X Атинаr sUAmerica/Port-au-Princer }r j!XПорт-о-Пренсr sUAmerica/Caymanr }r j!XКайманитеr sUAfrica/Dar_es_Salaamr }r j!XДар ес Салаамr sUAmerica/Curacaor }r j!XКюрасаоr sUIndian/Kerguelenr }r j!XКергеленr sUAfrica/Khartoumr }r j!X Хартумr sU Asia/Manilar }r j!X Манилаr sUAmerica/Santo_Domingor }r j!XСанто Домингоr sU America/Jujuyr }r j!XДжуджуюr sU Africa/Doualar }r j!X Дуалаr sU Europe/Romer }r j!XРимr sUAmerica/Argentina/San_Juanr }r j!XСан Хуанr sUPacific/Port_Moresbyr }r j!XПорт Морсбиr sUEurope/Andorrar }r j!X Андораr sUEurope/Luxembourgr }r j!XЛюксембургr sUPacific/Honolulur }r j!XХонолулуr sUAmerica/St_Thomasr }r j!XСв. Томасr sUPacific/Majuror }r j!X Мажуроr sUAmerica/Mazatlanr }r j!XМацатланr sU Asia/Macaur }r j!X Макауr sUAsia/Choibalsanr }r j!XЧойбалсанr sUAntarctica/McMurdor }r j!XМак Мърдоуr sUAmerica/Thunder_Bayr }r j!XТъндър Бейr sUAmerica/Los_Angelesr }r j!XЛос Анжелисr sU Asia/Kabulr }r j!X Кабулr sUIndian/Antananarivor }r j!XАнтананаривоr sUAtlantic/Reykjavikr }r j!XРейкявикr sU Asia/Nicosiar }r j!XНикозияr sUPacific/Ponaper }r j!Xо. Понапеr sUPacific/Tongatapur }r j!XТонгатапуr sUPacific/Pitcairnr }r j!XПиткернr sUPacific/Easterr }r j!XВеликденски о-виr sUAtlantic/South_Georgiar }r j!XЮжна Джорджияr sUAfrica/El_Aaiunr }r j!X Ел Аюнr sUAmerica/Campo_Grander }r j!XКампо Грандеr sUAmerica/Dawson_Creekr }r j!XДоусън Крийкr sUAntarctica/Vostokr }r j!X Востокr sUEurope/Bucharestr }r j!XБукурещr sUAmerica/Porto_Velhor }r j!XПорту Вельоr sU Europe/Monacor }r j!X Монакоr sU Asia/Bishkekr }r j!X Бишкекr sU Africa/Ceutar }r j!X Сеутаr sUAmerica/Winnipegr }r j!XУинипегr sU Asia/Aqtober }r j!X Аятобеr sU Africa/Dakarr }r j!X Дакарr! sUAmerica/Fortalezar" }r# j!XФортацелаr$ sUPacific/Tarawar% }r& j!Xо. Тараваr' sUAfrica/Addis_Ababar( }r) j!XАдис Абебаr* sU Pacific/Efater+ }r, j!X Ефатеr- sUPacific/Johnstonr. }r/ j!Xо. Джонсънr0 sUAsia/Qyzylordar1 }r2 j!XЯзилордаr3 sUAsia/Jerusalemr4 }r5 j!XЙерусалимr6 sUPacific/Aucklandr7 }r8 j!X Окландr9 sUAmerica/Denverr: }r; j!X Денвърr< sU Indian/Chagosr= }r> j!X Чагосr? sUAmerica/Glace_Bayr@ }rA j!XГлейс БейrB sUAmerica/HermosillorC }rD j!XХермосилоrE sU Africa/TunisrF }rG j!X ТунисrH sUAmerica/MontevideorI }rJ j!XМонтевидеоrK sU Asia/GazarL }rM j!XГазаrN sU Europe/DublinrO }rP j!X ДъблинrQ sUAntarctica/DumontDUrvillerR }rS j!XДюмон ДюрвилrT sUAmerica/Indiana/KnoxrU }rV j!XНоксrW sUAsia/NovosibirskrX }rY j!XНовосибирскrZ sU Africa/Kigalir[ }r\ j!X Кигалиr] sUAmerica/Grand_Turkr^ }r_ j!XГранд Тюркr` sU Africa/Lagosra }rb j!X Лагосrc sU Europe/Sofiard }re j!X Софияrf sU America/Limarg }rh j!XЛимаri sU Etc/Unknownrj }rk j!XНеизвестенrl sUAmerica/Anchoragerm }rn j!XАнкориджro sU Pacific/Naururp }rq j!X Науруrr suUscriptsrs }rt (UJavaru XЯванскиrv UTamlrw XТамилскаrx UHebrry X Ивритrz UGeorr{ XГрузинскаr| UXpeor} XСтароперсийскиr~ UCyrlr XКирилицаr UHrktr X(Катакана или Хираганаr UArmnr XАрменскаr UCyrsr XNКирилица (Стар църковно-славянски вариант)r URunrr XРуническаr UKhmrr XКхмерскаr UTelur X Телугуr UKanar XЯпонски катаканаr UXsuxr X,Шумеро-акадски клинописr UGothr XГотическаr ULatnr XЛатинскаr UMayar X"Йероглифи на Маитеr UBalir XБалийскиr UGujrr XГуджаратиr UHangr XКорейскаr UArabr XАрабскаr UZxxxr XБез писменостr UBuhdr X Бухидr UCoptr XКоптскаr UHansr X!Опростен китайскиr UThair XТаиr UCprtr XКипърскиr UGlagr XГлаголическиr UHantr X'Традиционен китайскиr URoror XРонго-ронгоr UMongr XМонголскаr UDevar XДеванагариr ULaoor X Лаоскаr UHirar XЯпонски хираганаr UZzzzr XIНепозната или недействителна писменостr UBopor XБопомофоr UHanir XКитайскаr UMymrr XБирманскаr UTglgr XТагалогr UPhnxr XФиникийскаr UBugir XБугинскиr UHungr XСтароунгарскиr UBrair XБрайловаr UBrahr X Брахмиr UGrekr X Гръцкаr UEgydr X0Египетско демотично писмоr UCherr X Черокиr UEthir XЕтиопскаr UTibtr XТибетскаr UZyyyr XОбщаr UJpanr XЯпонскаr UBatkr XБатакскиr UEgyhr X0Египетско йератично писмоr UBengr XБенгалскаr UEgypr X%Египетски йероглифиr uUvariantsr }r Unumber_symbolsr }r (Udecimalr X,r Ugroupr X r uUcurrency_namesr }r (jUXАлжирски динарr jWXНамибийски доларr jYXКоморски франкr UBOPr XБоливийско песоr UEGPr XЕгипетска лираr j[X>Български конвертируем лев (1962-1999)r j]XБългарски левr UPABr XПанамски балбоаr UYUMr XЮгославски динарr j}X#Зимбабвийски доларr UGHCr XГанайски седиr j_X'Боливийско боливианоr jaXДатска кронаr UBWPr XБотсуанска пулаr jcXЛиванска лираr jeX#Танзанийски шилингr UVNDr XВиетнамски донгr UAOAr XАнголска кванцаr UWSTr XСамоа - талаr UAONr X2Анголска нова кванца (1990-2000)r jgX!Камбоджански риелr jiX#Малайзийски рингитr UAOKr X)Анголска кванца (1977-1990)r jX!Сомалийски шилингr UKYDr X.Кайманови острови - доларr jkXЛибийски динарr UUAHr XУкраинска хривняr UUAKr X'Украински карбованецr jmXЙордански динарr UAORr X2Анголска нова кванца (1995-1999)r USURr XСъветска рублаr UAWGr X,Арубски гилдер - о. Арубаr joX)Саудитскоарабски риалr UFIMr XФинландска маркаr jqX!Хонгконгски доларr! jX!Суринамски гилдерr" UTPEr# XТиморско ескудоr$ UMGFr% X2Малгашки франк - Мадагаскарr& jsXШвейцарски франкr' UGIPr( X!Гибралтарска лираr) juXБеларуска рублаr* jXАлбански лекr+ jyXМавританска огияr, UHRKr- XХърватска кунаr. j{XДжибутски франкr/ UHRDr0 XХърватски динарr1 UPESr2 XПеруански солr3 UBYBr4 X2Беларуска нова рубла (1994-1999)r5 UITLr6 XИталианска лираr7 UXAFr8 X*Буркина Фасо - CFA - франкr9 UBNDr: XБрунейски доларr; UISKr< XИсландска кронаr= UZALr> X8Южноафрикански ранд (финансов)r? jXУругвайско песоr@ ULAKrA XЛаоски кипrB UNICrC X)Никарагуанска кордобаrD jXНепалска рупияrE UMZErF X#Мозамбикско ескудоrG jXСирийска лираrH jXЯмайски доларrI UFRFrJ XФренски франкrK UMAFrL XМарокански франкrM jX%Мозамбикски метикалrN UPHPrO XФилипинско песоrP jX%Южноафрикански рандrQ UGWPrR X Гвинея-Бисау песоrS ULUFrT X%Люксембургски франкrU UBELrV X0Белгийски франк (финансов)rW UBECrX X8Белгийски франк (конвертируем)rY UNGNrZ XНигерийска найраr[ UYUNr\ X8Югославски конвертируем динарr] jXБелгийски франкr^ jX%Костарикански колонr_ UDEMr` XГерманска маркаra UEEKrb XЕстонска кронаrc jXМалавийска квачаrd jX-Тринидат и Тобаго - доларre jXШриланкска рупияrf jXСловашка кронаrg jXТурска лираrh jX!Пакистанска рупияri jXУнгарски форинтrj jX"Стара румънска леяrk jXБермудски доларrl UXEUrm XЕку на ЕИОrn jXЛесотско лотиro ULVRrp XЛатвийска рублаrq jXМонголски тугрикrr jXАрменски драмrs jX(Угандийски нов шилингrt jXКатарски риалru UNLGrv XХоландски гулденrw UUGSrx X-Угандийски шилинг (1966-1987)ry UGBPrz XБританска лираr{ jXГрузински лариr| USHPr} XСвета Елена лираr~ jX%Афганистански афганr jX0Соломонови острови - доларr UCSKr X>Чехословашка конвертируема кронаr UKPWr X%Севернокорейски вонr UAFAr X1Афганистански афган (1927-2002)r UTHBr XТайландски батr UTRYr XНова турска лираr jXБангладешка такаr UGRDr XГръцка драхмаr jXЙеменски риалr jX Кабо Верде ескудоr jX+Свазилендски лилангениr UHTGr XХаитски гурдr UXOFr XБенин - CFA франкr jXАнтилски гулденr ULRDr XЛиберийски доларr URWFr XРуандски франкr jXНорвежка кронаr UMOPr XМакао - патакаr jXИндийска рупияr jX(Мексиканско ново песоr UCZKr XЧешка кронаr UTJSr X)Таджикистански сомониr UTJRr X'Таджикистанска рублаr jX!Бутански нгултрумr UYDDr XЙеменски динарr jXКолумбийско песоr UMURr X!Маврицийска рупияr jX#Индонезийска рупияr jX#Хондураска лемпираr jwX1Френскополинезийски франкr jXФиджи - доларr jXЕтиопски бирr UPENr X Перуански нов солr jXБелизийски доларr UATSr X!Австрийски шилингr UILPr XИзраелска лираr UZRNr X"Заирско ново зайреr jX!Доминиканско песоr UTMMr X)Туркменистански манатr UMDLr XМолдовско леуr UECSr XЕквадорско сукреr UBSDr XБахамски доларr jXШведска кронаr UZMKr XЗамбийска квачаr UMVRr XМалдивска руфияr jX#Австралийски доларr UADPr XАндорска песетаr UCUPr XКубинско песоr jXИрландска лираr jX!Барбейдоски доларr UKRWr XКНДР вонr UGMDr XГамбийски даласиr jX%Гватемалски кветзалr jX%Венесуелски боливарr USITr XСловенски толарr USDPr XСуданска лираr jXЧилийско песоr UEURr XЕвроr UCDFr XКонгоански франкr jX:Източнокарибски долар - Антигуаr jX#Казахстанско тенгеr jXРуска рублаr UPLZr X#Полска злота (1950-1995)r jXОмански риалr UBRLr XБразилски реалr UMMKr X*Миянмарски (Бирма) киятr UUYPr X)Уругвайско песо (1975-1993)r URURr X!Руска рубла (1991-1998)r jXПолска злотаr UPYGr X%Парагвайско гуараниr jXКенийски шилингr USVCr X!Салвадорски колонr UAEDr X?Обединени арабски емирства-дирхамr jXМакедонски денарr UAZMr X'Азербайджански манатr jXТайвански доларr jXТонга - па ангаr jXВануату - ватуr UBADr X/Босна и Херцеговина-динарr jXГвинейски франкr UMXPr X<Мексиканско сребърно песо (1861-1992)r jXИракски динарr UERNr XЕритрейска накфаr jX8Босненска конвертируема маркаr jXСейшелска рупияr jXКанадски доларr USDDr XСудански динарr jXКипърска лираr UMADr X!Марокански дирхамr jXКувейтски динарr jX!Бурундийски франкr UXXXr X9Непозната или невалидна валутаr UPGKr X.Папуа-новогвинейска кинаr ULTLr XЛитовски литазr jX!Сингапурски доларr UUZSr X!Узбекистански сумr j X0Сао Томе и Принсипи - добраr UXFOr X&Френски златен франкr UESPr XИспанска песетаr j XИрански риалr UZRZr XЗаирско зайреr j X(Китайски ренминби юанr USLLr X#Сиералеонско леонеr UTNDr XТунизийски динарr jXГаянски доларr! jXМалтийска лираr" jX%Новозеландски доларr# UFKPr$ XФолкландска лираr% ULVLr& XЛатвийски латr' UUSDr( XСАЩ доларr) UARPr* X+Аржентинско песо (1983-1985)r+ jXКиргистански сомr, jXАржентинско песоr- UILSr. X$Израелски нов шекелr/ URONr0 XРумънска леяr1 URSDr2 XСръбски динарr3 jXБахрейнски динарr4 UJPYr5 XЯпонска йенаr6 UPTEr7 X#Португалско ескудоr8 UXAUr9 X Златоr: uUmonthsr; }r< (U stand-aloner= }r> Unarrowr? }r@ (KXяrA KXфrB KXмrC KXаrD KXмrE KXюrF KXюrG KXаrH K XсrI K XоrJ K XнrK K XдrL usUformatrM }rN (UwiderO }rP (KX януариrQ KXфевруариrR KXмартrS KX априлrT KXмайrU KXюниrV KXюлиrW KX августrX K XсептемвриrY K XоктомвриrZ K Xноемвриr[ K Xдекемвриr\ uU abbreviatedr] }r^ (KXян.r_ KX февр.r` KXмартra KXапр.rb KXмайrc KXюниrd KXюлиre KXавг.rf K X септ.rg K Xокт.rh K X ноем.ri K Xдек.rj uuuUcurrency_formatsrk }rl Nh$)rm }rn (h'Nh(Kh)KKro h+X ¤rp jp rq h.KKrr h0X #,##0.00 ¤rs h2h3h4rt h6Nh7KKru ubsUdaysrv }rw (U stand-alonerx }ry Unarrowrz }r{ (KXпr| KXвr} KXсr~ KXчr KXпr KXсr KXнr usUformatr }r (Uwider }r (KXпонеделникr KXвторникr KX срядаr KXчетвъртъкr KX петъкr KX съботаr KX неделяr uU abbreviatedr }r (KXпнr KXвтr KXсрr KXчтr KXптr KXсбr KXндr uuuU meta_zonesr }r (UIsraelr }r (Ucommonr Ulongr }r (Udaylightr X-Лятна часова зона Израелr Ustandardr X"Часова зона Израелr uuUAmerica_Pacificr }r (j j }r (j X9Тихоокеанска лятна часова зонаr j X.Тихоокеанска часова зонаr uuUEurope_Easternr }r (j j }r (j XCИзточноевропейска лятна часова зонаr j X8Източноевропейска часова зонаr uuUAmerica_Mountainr }r (j j }r (j XJАмериканска планинска лятна часова зонаr j X?Американска планинска часова зонаr uuUAlaskar }r (j j }r (j X-Лятна часова зона Аляскаr j X"Часова зона Аляскаr uuUAmerica_Easternr }r (j j }r (j XFАмериканска източна лятна часова зонаr j X;Американска източна часова зонаr uuU Newfoundlandr }r (j j }r (j X7Лятна часова зона Нюфаундлендr j X,Часова зона Нюфаундлендr uuUAtlanticr }r (j j }r (j X9Атлантическа лятна часова зонаr j X.Атлантическа часова зонаr uuUAmerica_Centralr }r (j j }r (j XJАмериканска централна лятна часова зонаr j X?Американска централна часова зонаr uuUJapanr }r (j j }r (j X$Японска часова зонаr j X$Японска часова зонаr uuUChinar }r (j j }r j X&Китайска часова зонаr suUEurope_Centralr }r (j j }r (j XGЦентралноевропейска лятна часова зонаr j X<Централноевропейска часова зонаr uuUGMTr }r (j j }r j X$Часова зона Гринуичr suuUerasr }r (Uwider }r (KX пр.Хр.r KX сл.Хр.r uU abbreviatedr }r (KX пр. н. е.r KX от н. е.r uUnarrowr }r KX сл.н.е.r suu.PK[D))(site-packages/babel/localedata/vi_VN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/be_BY.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/hy_AM.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[E(site-packages/babel/localedata/fr_CH.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q(UpatternqXHH.mm:ss 'h' vqUformatqX%(HH)s.%(mm)s:%(ss)s h %(v)squbsU languagesq}qU territoriesq}q Udecimal_formatsq!}q"U date_formatsq#}q$(Ufullq%h)q&}q'(hXEEEE, d MMMM yyyyq(hX!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)sq)ubUshortq*h)q+}q,(hXdd.MM.yyq-hX%(dd)s.%(MM)s.%(yy)sq.ubuUcurrency_symbolsq/}q0U time_zonesq1}q2Uscriptsq3}q4Uvariantsq5}q6Unumber_symbolsq7}q8(Udecimalq9X.q:Ugroupq;X'qUmonthsq?}q@Ucurrency_formatsqA}qBNcbabel.numbers NumberPattern qC)qD}qE(Uexp_precqFNUscaleqGKU frac_precqHKKqIUsuffixqJXqKhKqLUint_precqMKKqNhX ¤ #,##0.00qOUprefixqPX¤ qQX¤-qRqSUexp_plusqTNUgroupingqUKKqVubsUdaysqW}qXU meta_zonesqY}qZUerasq[}q\u.PK[Rll(site-packages/babel/localedata/ha_GH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll*site-packages/babel/localedata/uz_Cyrl.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[2-2-%site-packages/babel/localedata/dz.datnu[}q(U zone_formatsq}qUdatetime_formatsq}q(UfullqX{1} {0}qNX{1} {0}quUquartersq}q Uformatq }q (Uwideq }q (KX'བཞི་དཔྱ་དང་པ་qKX-བཞི་དཔྱ་གཉིས་པ་qKX-བཞི་དཔྱ་གསུམ་པ་qKX*བཞི་དཔྱ་བཞི་པ་quU abbreviatedq}q(KXབཞི་དཔྱ་༡qKXབཞི་དཔྱ་༢qKXབཞི་དཔྱ་༣qKXབཞི་དཔྱ་༤quusUperiodsq}q(UamqXསྔ་ཆ་qUpmqXཕྱི་ཆ་quUscientific_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#KKq$Uscaleq%KU frac_precq&KKq'Usuffixq(Xq)h)q*Uint_precq+KKq,Upatternq-X#E+00q.Uprefixq/h)X-q0q1Uexp_plusq2Ugroupingq3MMq4ubsUpercent_formatsq5}q6Nh )q7}q8(h#Nh%Kdh&KKq9h(X %q:h:q;h+KKqh2Nh3KKq?ubsU week_dataq@}qA(Umin_daysqBKU weekend_startqCKU first_dayqDKU weekend_endqEKuU time_formatsqF}qG(UmediumqHcbabel.dates DateTimePattern qI)qJ}qK(h-Xཆུ་ཚོད་h:mm:ss aqLUformatqMX.ཆུ་ཚོད་%(h)s:%(mm)s:%(ss)s %(a)sqNubUfullqOhI)qP}qQ(h-XMཆུ་ཚོད་ h སྐར་མ་ mm སྐར་ཆཱ་ ss a vvvvqRhMXaཆུ་ཚོད་ %(h)s སྐར་མ་ %(mm)s སྐར་ཆཱ་ %(ss)s %(a)s %(vvvv)sqSubUlongqThI)qU}qV(h-XLཆུ་ཚོད་ h སྐར་མ་ mm སྐར་ཆཱ་ ss a zzzqWhMX`ཆུ་ཚོད་ %(h)s སྐར་མ་ %(mm)s སྐར་ཆཱ་ %(ss)s %(a)s %(zzz)sqXubUshortqYhI)qZ}q[(h-X/ཆུ་ཚོད་ h སྐར་མ་ mm aq\hMX;ཆུ་ཚོད་ %(h)s སྐར་མ་ %(mm)s %(a)sq]ubuU languagesq^}q_(Uelq`XགིརིཀqaUenqbXཨིང་ལིཤqcUartqdX$བཟོ་བཟོཝ (གཞན)qeUitqfXཨི་ཊ་ལི་རནqgUmniqhXམ་ནི་པུ་རིqiUasqjXཨ་ས་མི་སིqkUarqlXཨེ་ར་སྦིགqmUgaqnXཨའི་རིཤqoUcsqpX ཅེཀqqUzhqrXརགྱ་མི་ཁqsUmncqtXམཱན་ཅུquUesqvXསིཔེ་ནིཤqwUincqxX!ཨིན་ཌིཀ (གཞན)qyUruqzXར་ཤི་ཡནq{Unlq|Xཌཆq}Unoq~X$ནོར་ཝི་ཇི་ཡནqUloqX ལའོqUneqXནེ་པ་ལིqUpaqXཔཱན་ཇ་བིqUgrcqX>གིརིཀ, སྔ་དུས་ཀྱི (༡༤༥༣)qUthqX ཐཱའེqUnewqXནི་ཝ་རིqUpiqX པ་ལིqUtaqXཏ་མིལqUfrqXཕེ་རེནཆེqUboqXབོད་ཁqUbnqXབེངྒ་ལིqUdeqXཇཱར་མཱནqUbhqXབི་ཧ་ལིqUdaqXཌེ་ནིཤqUfaqXཔར་ཤི་ཡནqUhiqXཧིན་དིqUdzqXརྫོང་ཁqUdvqXདི་བེ་ཧིqUhimqXཧི་མ་ཅ་ལིqUheqXཧི་བུརུqUegyqX?ཨི་ཇིཔ་ཤཱན (སྔ་དུས་ཀྱི)qUteqXཏེ་ལུ་གུqUmlqXམ་ལ་ཡ་ལམqUmnqXསོག་པོའི་ཁqUkoqXཀོ་རིཡནqUknqXཀ་ན་ཌqUkmqXཁེ་མརqUurqXཨུར་དུqUksqXཀེཤ་མི་རིqUsiqXསིན་ཧ་ལིསིqUmrqXམ་ར་ཐིqUsaqXསཾསྐྲྀཏqUmyqXབར་མིསིqUorqXཨོ་རི་ཡquU territoriesq}q(UBDqXབངྒ་ལ་དེཤqUBEqXབེལ་ཇིཡམqUFRqXཕརཱནསིqUMNqXསོག་པོqUDKqXཌེན་མཱཀqUNOqXནོ་ཝེqUDEqXཇཱར་མ་ནིqUBHqXབཧ་རེནqUUZqX-ཨུཛ་བེ་ཀིསི་ཏཱནqUBTqXའབྲུགqUHKqXཧོང་ཀོངqUBRqXབཱརཱ་ཛིལqUFIqXཕིན་ལེནཌqUGRqXགིརིསིqUISqXཨའིསི་ལེནཌqUPSqXRཔེ་ལིསི་ཊི་ནིཡ ན་ཊེ་རི་ངོ་རིqULBqXལེ་བཱ་ནཱོནqUPTqXཔོར་ཅུ་གལqULAqXལ་འོསུqUTWqXཏའི་ཝཱནqULKqXཤྲཱྀ་ལངཀqUNZqX$ནིའུ་ཛི་ལེནཌqUMVqXམཱལ་ཌིབསqUTJqX'ཏ་ཇག་ཀིསི་ཏཱནqUESqXསིཔཱེནqUTHqXཐཱའི་ལེནཌqUNPqXབལ་ཡུལqUPKqXཔ་ཀིསི་ཏཱནqUEGqXཨི་ཇིཔཊqUZMrXཛམ་བི་ཡrUCHrX$སུའིཊ་ཛར་ལེནrUAErXRཡུ་ནའི་ཊེཊ་ཨ་ར བ་ཨེ་མི་རེཊསིrUCNrXརྒྱ་མིrUAFrX'ཨཕ་ག་ནིསི་ཏཱནr UIQr Xཨི་རཀr UJPr Xཇ་པཱནr UCArXཀེ་ན་ཌrUIRrXཨི་རཱནrUITrXཨྀཊ་ལིrUVNrXབེཊ་ནཱམrUZArX$སའུཐ་ཨཕ་རི་ཀrUAQrX$ཨེན་ཊཱག་ཊི་ཀrUCZrX'ཅེཀ་རི་པབ་ལིཀrUARrX!ཨར་ཇེན་ཊི་ནrUAUrX$ཨས་ཊེཡེ་ལི་ཡrUATr Xཨས་ཊི་ཡr!UINr"Xརྒྱ་གརr#UNLr$X$ནེ་དར་ལེནཌསིr%UZWr&Xཛིམ་བབ་ཝེr'UIEr(Xཨའིརི་ལེནཌr)UCUr*Xཀིའུ་སྦr+UQAr,X ཀ་ཏརr-UPAr.Xཔ་ན་མཱr/UKEr0Xཀེ་ནི་ཡr1UJMr2Xཇ་མའི་ཀr3UMMr4Xམེ་མརr5UILr6Xཨིཛ་རཱེལr7UKHr8Xཀམ་བོ་ཌི་ཡr9UUSr:X3ཡུ་ནའིཊེཊ་སི་ཊེསིr;UMUr<X!མོ་རི་ཤིཡསིr=UKRr>X!ལྷོ་ཀོ་རི་ཡr?USIr@X$སིལོ་བེ་ནི་ཡrAUKPrBX!བྱང་ཀོ་རི་ཡrCUKWrDXཀུ་ཝེཊrEUMSrFXམོན་ས་རཊིrGUSArHX3སའུ་དི་ཨེ་ར་སྦི་ཡrIUMYrJXམ་ལེ་ཤི་ཡrKUMXrLXམེཀསི་ཀོrMUSErNXསུའི་ཌནrOUGBrPX3ཡུ་ནའི་ཊེཊ་ཀིང་ཌམrQuUdecimal_formatsrR}rSNh )rT}rU(h#Nh%Kh&KKrVh(h)h)rWh+KKrXh-X #,##,##0.###rYh/h)h0rZh2Nh3KKr[ubsU date_formatsr\}r](Umediumr^hI)r_}r`(h-X:སྤྱི་ལོ་yyyy ཟླ་ MMM ཚེས་ ddrahMXFསྤྱི་ལོ་%(yyyy)s ཟླ་ %(MMM)s ཚེས་ %(dd)srbubUfullrchI)rd}re(h-X;སྤྱི་ལོ་yyyy ཟླ་ MMMM ཚེས་ ddrfhMXGསྤྱི་ལོ་%(yyyy)s ཟླ་ %(MMMM)s ཚེས་ %(dd)srgubUlongrhhI)ri}rj(h-X;སྤྱི་ལོ་yyyy ཟླ་ MMMM ཚེས་ ddrkhMXGསྤྱི་ལོ་%(yyyy)s ཟླ་ %(MMMM)s ཚེས་ %(dd)srlubUshortrmhI)rn}ro(h-X:སྤྱི་ལོ་ yyyy ཟླ་ MM ཚེས་ ddrphMXFསྤྱི་ལོ་ %(yyyy)s ཟླ་ %(MM)s ཚེས་ %(dd)srqubuUcurrency_symbolsrr}rsU time_zonesrt}ruU Asia/Thimphurv}rwUcityrxXཐིམ་ཕུགryssUscriptsrz}r{(UTelur|Xཏེ་ལུ་གུr}UTamlr~Xཏ་མིལrUGururXགུར་མུ་ཁིrUHebrrXཧི་བུརུrULaoorX ལའོrUCyrlrXསིརི་ལིཀrUKhmrrXཁེ་མརrULatnrXལེ་ཊིནrUHanirX ཧཱནrUGujrrXགུ་ཇ་ར་ཏིrUHangrXཧང་གུལrUArabrXཨེ་རེ་སྦིགrUThaarX ཐཱ་ནrUSinhrXསིན་ཧ་ལrUOryarXཨོ་རི་ཡrUHansrX"ལུགས་གསར ཧཱནrUHantrX%ལུགས་རྙིང ཧཱནrUMongrXསོག་པོrUDevarXདི་ཝ་ན་གརིrUHirarXཧི་ར་ག་ནrUMymrrXམི་མརrUBrairXབེརེལrUGrekrXགིརིཀrUMlymrXམ་ལ་ཡ་ལམrUTibtrX བོདrUQaairXསྔར་རྒྱུནrUZyyyrXསྤྱིརrUKanarXཀ་ཏ་ཀ་ནrUBengrXབེངྒ་ལིrULimbrXལིམ་བུrUKndarXཀ་ན་ཌruUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}rUBTNrXདངུལ་ཀྲམ་rsUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KX'སྤྱི་ཟླཝ་དངཔ་rKX0སྤྱི་ཟླཝ་གཉིས་པ་rKX0སྤྱི་ཟླཝ་གསུམ་པ་rKX-སྤྱི་ཟླཝ་བཞི་པ་rKX*སྤྱི་ཟླཝ་ལྔ་པ་rKX0སྤྱི་ཟླཝ་དྲུག་པ་rKX0སྤྱི་ཟླཝ་བདུན་པ་rKX3སྤྱི་ཟླཝ་བརྒྱད་པ་rK X-སྤྱི་ཟླཝ་དགུ་པ་rK X-སྤྱི་ཟླཝ་བཅུ་པ་rK X<སྤྱི་ཟླཝ་བཅུ་གཅིག་པ་rK X<སྤྱི་ཟླཝ་བཅུ་གཉིས་པ་ruU abbreviatedr}r(KX ཟླ་ ༡rKX ཟླ་ ༢rKX ཟླ་ ༣rKX ཟླ་ ༤rKX ཟླ་ ༥rKX ཟླ་ ༦rKX ཟླ་ ༧rKX ཟླ་ ༨rK X ཟླ་ ༩rK Xཟླ་ ༡༠rK Xཟླ་ ༡༡rK Xཟླ་ ༡༢ruuuUcurrency_formatsr}rNh )r}r(h#Nh%Kh&KKrh(h)h)rh+KKrh-X ¤#,##,##0.00rh/X¤rX-¤rrh2Nh3KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r(KX$གཟའ་མིག་དམར་rKXགཟའ་ལྷག་པ་r KX!གཟའ་ཕུར་བུ་r KXགཟའ་པ་སངས་r KX!གཟའ་སྤེན་པ་r KXགཟའ་ཉི་མ་r KXགཟའ་ཟླ་བ་ruU abbreviatedr}r(KX མིར་rKX ལྷག་rKX ཕུར་rKX སངས་rKXསྤེན་rKX ཉི་rKX ཟླ་ruuuU meta_zonesr}rUBhutanr}r(Ushortr}r(UgenericrXBTrUstandardr XBSTr!uUcommonr"Ulongr#}r$(jX Bhutan Timer%j XBhutan Standard Timer&uusUerasr'}r(U abbreviatedr)}r*(KXBCEr+KXCEr,usu.PK[1ll(site-packages/babel/localedata/nb_NO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ %site-packages/babel/localedata/ss.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qNcbabel.numbers NumberPattern q)q}q (Uexp_precq!KKq"Uscaleq#KU frac_precq$KKq%Usuffixq&Xq'h'q(Uint_precq)KKq*Upatternq+X#E0q,Uprefixq-h'X-q.q/Uexp_plusq0Ugroupingq1MMq2ubsUpercent_formatsq3}q4Nh)q5}q6(h!Nh#Kdh$KKq7h&X%q8h8q9h)KKq:h+X#,##0%q;h-h'h.q}q?(Umin_daysq@KU weekend_startqAKU first_dayqBKU weekend_endqCKuU time_formatsqD}qE(UmediumqFcbabel.dates DateTimePattern qG)qH}qI(h+XHH:mm:ssqJUformatqKX%(HH)s:%(mm)s:%(ss)sqLubUfullqMhG)qN}qO(h+X HH:mm:ss vqPhKX%(HH)s:%(mm)s:%(ss)s %(v)sqQubUlongqRhG)qS}qT(h+X HH:mm:ss zqUhKX%(HH)s:%(mm)s:%(ss)s %(z)sqVubUshortqWhG)qX}qY(h+XHH:mmqZhKX %(HH)s:%(mm)sq[ubuU languagesq\}q]Ussq^XSiswatiq_sU territoriesq`}qaUdecimal_formatsqb}qcNh)qd}qe(h!Nh#Kh$KKqfh&h'h'qgh)KKqhh+X #,##0.###qih-h'h.qjh0Nh1KKqkubsU date_formatsql}qm(UmediumqnhG)qo}qp(h+X yyyy MMM dqqhKX%(yyyy)s %(MMM)s %(d)sqrubUfullqshG)qt}qu(h+XEEEE, yyyy MMMM ddqvhKX"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqwubUlongqxhG)qy}qz(h+X yyyy MMMM dq{hKX%(yyyy)s %(MMMM)s %(d)sq|ubUshortq}hG)q~}q(h+Xyy/MM/ddqhKX%(yy)s/%(MM)s/%(dd)squbuUcurrency_symbolsq}qU time_zonesq}qUscriptsq}qUvariantsq}qUnumber_symbolsq}q(UdecimalqX,qUgroupqX quUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KX BhimbidvwaneqKX iNdlovanaqKXiNdlovu-lenkhuluqKXMabasaqKX iNkhwekhwetiqKXiNhlabaqKXKholwaneqKXiNgciqK XiNyoniqK XiMphalaqK XLwetiqK X iNgongoniquU abbreviatedq}q(KXBhiqKXVanqKXVolqKXMabqKXNkhqKXNhlqKXKhoqKXNgcqK XNyoqK XMphqK XLweqK XNgoquuuUcurrency_formatsq}qNh)q}q(h!Nh#Kh$KKqh&h'h'qh)KKqh+X ¤#,##0.00qh-X¤qX-¤qˆqh0Nh1KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KX uMsombulukoqKXLesibiliqKX LesitsatfuqKXLesineqKX LesihlanuqKX uMgcibeloqKXLisontfoquU abbreviatedq}q(KXMsoqKXBilqKXTsaqKXNeqKXHlaqKXMgcqKXSonquuuU meta_zonesq}qUerasq}q(Uwideq}q(KXBCqKXADquU abbreviatedq}q(KXBCqKXADquuu.PK[9 9 %site-packages/babel/localedata/sv.datnu[}q(U zone_formatsq}q(UregionqX%sqUgmtqXGMT%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q (U stand-aloneq }q Unarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1:a kvartaletqKX 2:a kvartaletqKX 3:e kvartaletqKX 4:e kvartaletquU abbreviatedq}q(KXK1qKXK2qKXK3q KXK4q!uuuUperiodsq"}q#(Uamq$Xfmq%Upmq&Xemq'uUscientific_formatsq(}q)Ncbabel.numbers NumberPattern q*)q+}q,(Uexp_precq-KKq.Uscaleq/KU frac_precq0KKq1Usuffixq2Xq3h3q4Uint_precq5KKq6Upatternq7X#E0q8Uprefixq9h3X-q:q;Uexp_plusqubsUpercent_formatsq?}q@Nh*)qA}qB(h-Nh/Kdh0KKqCh2X %qDhDqEh5KKqFh7X#,##0 %qGh9h3h:qHhX siouxspråkr?Umapr@Xaustronesiskt språkrAUmasrBX massajiskarCUlahrDXlahndarEUladrFXladinorGUfyrHX västfrisiskarIUsnkrJXsoninkerKUfarLXpersiskarMUmadrNX maduresiskarOUmagrPXmagahirQUmairRXmaithilirSUfirTXfinskarUUfjrVX fidjianskarWUmanrXXmanderYUegyrZX fornegyptiskar[Uzndr\Xzandér]Ussr^Xswatir_Usrr`XserbiskaraUsqrbXalbanskarcUswrdXswahilireUsvrfXsvenskargUsurhX sundanesiskariUstrjXsydsothorkUskrlX slovakiskarmUsirnX singalesiskaroUshrpXserbokroatiskarqUsorrX somaliskarsUsnrtXshonaruUsmrvX samoanskarwUslrxX slovenskaryUscrzXsardiskar{Usar|Xsanskritr}Usgr~XsangorUserX nordsamiskarUsdrXsindhirUzenrXzenagarUkbdrX kabardinskarUafarXafroasiatiskt språkrUcsbrX kasjubiskarUlgrXlugandarUlbrX luxemburgiskarUfiurXfinskugriskt språkrUlnrXlingalarUlorXlaotiskarUlirX limburgiskarUbynrXblinrUltrX litauiskarUlurX luba-katangarUfilrX filippinskarUyirXjiddischrUnonrX fornnordiskarUcebrXcebuanorUyorXyorubarUnogrXnogairUbatrXbaltiskt språkrUdakrXdakotarUdarrX darginskarUdayrX dajakiskarUssarXnilosahariskt språkrUkperXkpellerUelrXgrekiskarUeorX esperantorUenrXengelskarUlamrXlambarUeerXewerUmdfrXmoksjarUfrrXfranskarUmdrrXmandarrUetrXestniskarUesrXspanskarUrurXryskarUgonrXgondirUgohrX fornhögtyskarUsmsrX skoltsamiskarUsmnrX enaresamiskarUsmjrX lulesamiskarUde_ATrXösterrikisk tyskarUgotrXgotiskarUrnrXrundirUrorX rumänskarUdsbrX lågsorbiskarUsmarX sydsamiskarUgorrX gorontalorUastrX asturiskarUwalrXwalamorUcrhrX krimtatariskarUathrXathapaskiskt språkrUgezrX etiopiskarUxhrXxhosarUffrXfulanirUkforXkororUmakrXmakasarrUzaprXzapotekrUkokrXkonkanirUzxxrXinget språkligt innehållrUkosrX kosreanskarUforX färöiskarUtogrXnyasatonganskarUhuprXhuparUudmrX udmurtiskarUbejrXbeyjarUbemrXbembar Utsir X tsimshianr Uberr X berberspråkr UnzirXnzimarUsairXsydamerikanskt indianspråkrUangrX fornengelskarUprarX prakritspråkrUbhorXbhojpurirUsalrXsalikiskt språkrUprorXfornprovensalskarUrajrX rajasthanirUsadrXsandawerUanpr Xangikar!Ues_419r"Xlatinamerikansk spanskar#Urapr$Xrapanuir%Usasr&Xsasakr'Unqor(Xn-kår)Ucarr*X karibiskar+Uminr,X minangkabaur-Umicr.Xmic-macr/Uefir0Xefikr1Uarnr2X araukanskar3Uypkr4X eskimåspråkr5Umisr6X annat språkr7Ukacr8Xkachinr9Ukabr:X kabyliskar;Ukaar<Xkarakalpakiskar=Ukajr>Xjjur?Ukamr@XkambarAUkarrBXkarenskarCUkawrDXkawirEUfr_CHrFXschweizisk franskarGUtyvrHX tuviniskarIUfr_CArJXkanadensisk franskarKUkarLX georgiskarMUdoirNXdogrirOUkgrPXkikongorQUkkrRX kazakiskarSUkjrTXkuanyamarUUkirVXkikuyurWUkorXX koreanskarYUknrZXkannadar[Ukmr\X kambodjanskar]Uklr^X grönländskar_Uksr`X kashmiriskaraUkrrbXkanurircUkwrdXkorniskareUkvrfXkomergUkurhXkurdiskariUkyrjX kirgisiskarkUtklrlX tokelauiskarmUbuarnX burjätiskaroUmgarpX medeliriskarqUhitrrX hettitiskarsUdyurtXdyularuUdervXtyskarwUdarxXdanskaryUdzrzX bhutanesiskar{Uluir|Xluiseñor}Udvr~XdivehirUhilrX hiligaynonrUhimrX himachalirUgemrXgermanskt språkrUcrprXkreol- eller pidginspråkrUqurXquechuarUbasrXbasarUgbarXgbayarUbadrXbandarUbanrX balinesiskarUbalrXbaluchirUshnrXshanrUbairXbamilekespråkrUarprXarapahorUartrXkonstgjort språkrUarwrX arawakiskarUarcrX arameiskarUen_USrXamerikansk engelskarUsemrXsemitiskt språkrUselrXselkuprUnubrXnubiskt språkrUbtkrXbatakrUlusrXlushairUmusrXmuskogeerUluarX luba-luluarUirorXirokesiskt språkrUirarXiranskt språkrUmunrX mundaspråkrUlunrXlundarUluorXluorUwarX vallonskarUtuprX tupíspråkrUjvrX javanesiskarUzblrX blissymbolerrUtutrXaltaiskt språkrUtumrXtumbukarUjarXjapanskarUcoprXkoptiskarUilorXilokorUlarXlatinrUgwirXgwichinrUundrXobestämt språkrUtlirXtlingitrUtlhrX klingonskarUchrXchamorrorUcorX korsikanskarUcarX katalanskarUcerX tjetjenskarUponrXponaperUcyrX walesiskarUsahrX jakutiskarUcsrX tjeckiskarUcrrXcreerUbntrX bantuspråkrUcvrX tjuvasjiskarUcurX kyrkslaviskarUlvrXlettiskarUdumrXmedelnederländskarUptrX portugisiskarUduarXdualarUfrorX fornfranskarUyaprX japetiskarUfrmrX medelfranskarUtivrXtivirUfrsrX östfrisiskarUfrrrX nordfrisiskarUyaorXkiyaorUparXpunjabirUxalrX kalmuckiskarUes_ESrXeuropeisk spanskar Upir Xpalir Uen_GBr Xbrittisk engelskar UgayrXgayorUotorX otomispråkrUotarX ottomanskarUhmnrX hmongspråkrUmyvrXerjyarUgaarXgãrUfurrX friulianskarUkhirX khoisanspråkrUainrXainurUrarr X rarotonganskar!Uslar"Xslaviskt språkr#Uver$Xvendar%Uvir&X vietnamesiskar'Uisr(X isländskar)Ukhor*X khotanesiskar+Uiur,X inuktitutr-Uitr.X italienskar/Uvor0Xvolapükr1Uiir2X szezuan ir3Uikr4Xinupiakr5Uior6Xidor7Uiner8Xindoeuropeiskt språkr9Uiar:X interlinguar;Ujprr<Xjudisk persiskar=Uier>X interlinguer?Uidr@X indonesiskarAUigrBXiborCUpaprDX papiamentorEUeworFXewondorGUpaurHXpalaurIUpaarJXpapuanskt språkrKUpagrLX pangasinanrMUsatrNXsantalirOUpalrPX medelpersiskarQUpamrRXpampangarSUsycrTXklassisk syriskarUUphirVXfilippinskt språkrWUcelrXXkeltiskt språkrYUphnrZX feniciskar[Unicr\XNiger-Kongospråkr]Uniar^Xniasr_Udgrr`XdogribraUsyrrbXsyriskarcUniurdX niueanskareUgswrfXschweizertyskargUcchrhXatsamriUjborjXlojbanrkUnahrlX aztekiskarmUsamrnX samaritanskaroUhairpXhaidarqUgmhrrXmedelhögtyskarsUcusrtXkusjitiskt språkruUwenrvXsorbiskt språkrwUadyrxX adygeiskaryUelxrzX elamitiskar{Uadar|Xadangmer}Upt_PTr~Xeuropeisk portugisiskarUhawrX hawaiiskarUbinrXbinirUbikrXbikolrUpt_BRrXbrasiliansk portugisiskarUmosrXmossirUmohrXmohawkrUtlrXtagalogrUzh_HansrXförenklad kinesiskarUzh_HantrXtraditionell kinesiskarUtvlrX tuvaluanskarUijorX ijospråketrUkmbrXkimbundurUpeorX fornpersiskarUumbrXumbundurUtmhrXtamashekrUfonrX fonspråketrUhsbrX högsorbiskarUberXvitryskarUbgrX bulgariskarUbarX basjkiriskarUpsrX afghanskarUbmrXbambararUbnrXbengalirUborX tibetanskarUbhrXbiharirUbirXbislamarUbrrX bretonskarUbsrXbosniskarUruprX arumänskarUzzarXzazarUomrXoromorUojrXodjibwarUacerX achinesiskarUachrXacolirUocrX occitanskarUkrurXkurukhrUsrrrXsererrUkrorXkrurUkrlrXkarelskarUkrcrXkarachay-balkarrUndsrX lågtyskarUosrX ossetiskarUorrXoriyarUsogrXsogdiskarUnsorX nordsothorUsonrXsonghairUde_CHrXschweizisk högtyskarUvairXvajrUwakrXwakusjiskt språkrUlolrXmongorUmkhrXmon-khmeriskt språkrUawarXawadhirUlozrXlozirUgilrX gilbertiskarUwasrXwashorUwarrXwarayrUhzrXhererorUhyrX armeniskarUanrX aragonesiskarUsidrXsidamorUhrrX kroatiskarUhtrXhaitiskarUhurXungerskarUhirXhindirUhorXhirimoturUharXhaussarUbugrX buginesiskarUherX hebreiskarUuzrX uzbekiskar Uurr Xurdur Uplr Xpolskar UukrX ukrainskarUugrX uiguriskarUaarXafarrUabrX abchasiskarUaerX avestiskarUafrX afrikaansrUakrXakanrUamrX amhariskarUnl_BErX flamländskarUeur Xbaskiskar!Uasr"X assamesiskar#Uarr$Xarabiskar%Uinhr&X ingusjiskar'Utpir(X tok pisinr)Umynr*X mayaspråkr+Uayr,Xaymarar-Ukhar.Xkhasir/Uazr0Xazerbajdzjanskar1Uincr2Xindiskt språkr3Unlr4X nederländskar5Unnr6Xnynorskar7Unor8Xnorskar9Unar:Xnaurur;Unbr<Xnorskt bokmålr=Unair>Xnordamerikanskt indianspråkr?Undr@X nordndebelerAUnerBX nepalesiskarCUngrDXndongarEUnyrFXnyanjarGUnaprHX napolitanskarIUgrbrJXgreborKUgrcrLX forngrekiskarMUnrrNX sydndebelerOUtigrPXtigrérQUnvrRXnavahorSUzunrTXzunirUUrwrVX kinjarwandarWUcperXX(engelskbaserat kreol- eller pidginspråkrYUcpfrZX'franskbaserat kreol- eller pidginspråkr[Ucppr\X,portugisiskbaserat kreol- eller pidginspråkr]uU territoriesr^}r_(UBDr`X BangladeshraUBErbXBelgienrcUBFrdX Burkina FasoreUBGrfX BulgarienrgUVErhX VenezuelariUBArjXBosnien och HercegovinarkUBBrlXBarbadosrmUWFrnXWallis- och FutunaöarnaroUBLrpXS:t BarthélemyrqUBMrrXBermudarsUBNrtXBruneiruUBOrvXBoliviarwUBHrxXBahrainryUBIrzXBurundir{UBJr|XBeninr}UBTr~XBhutanrU011rX VästafrikarUBVrX BouvetönrUBWrXBotswanarU014rX ÖstafrikarU015rX NordafrikarUBRrX BrasilienrU017rX CentralafrikarU018rX södra AfrikarU019rXNord- och SydamerikarUBYrX VitrysslandrUBZrXBelizerULVrXLettlandrURWrXRwandarURSrXSerbienrUTLrX ÖsttimorrURErXRéunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadzjikistanrUROrX RumänienrUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX%Sydgeorgien och Södra SandwichöarnarUGRrXGreklandrUGQrXEkvatorialguinearUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXFranska GuyanarUGErXGeorgienrUGDrXGrenadarU021rX norra AmerikarUGBrXStorbritannienrUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GrönlandrU029rXKaribienrUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunisienrUJMrXJamaicarU013rXCentralamerikarUWSrXSamoarU419rXLatinamerika och KaribienrUHRrXKroatienrUBSrXBahamasrUHTrXHaitirUHUrXUngernrUHKrXHonkong S.A.R. KinarU039rX SydeuroparUHNrXHondurasrUFIrXFinlandrU142rXAsienrU030rX ÖstasienrU034rX södra AsienrU035rX SydostasienrUPRrX Puerto RicorUPSrXPalestinska territorietrU830rX KanalöarnarUFKrXFalklandsöarnarUIOrXBrittiska Indiska oceanöarnarUPWrXPalaur UPTr XPortugalr USJr XSvalbard och Jan Mayenr UMDrX MoldavienrUFMrX MikronesienrUIQrXIrakrUPArXPanamarUPFrXFranska PolynesienrUPGrXPapua Nya GuinearUPErXPerurUPKrXPakistanrUPHrX FilippinernarUFOr X Färöarnar!UPNr"XPitcairnr#UPLr$XPolenr%UPMr&XS:t Pierre och Miquelonr'UZMr(XZambiar)UEHr*X Västsaharar+URUr,XRysslandr-UEEr.XEstlandr/UEGr0XEgyptenr1UZAr2X Sydafrikar3UECr4XEcuadorr5UITr6XItalienr7UVNr8XVietnamr9UZZr:Xokänd eller ogiltig regionkodr;USBr<X Salomonöarnar=UETr>XEtiopienr?USOr@XSomaliarAUZWrBXZimbabwerCUSArDX SaudiarabienrEUESrFXSpanienrGUERrHXEritrearIUMErJX MontenegrorKUAQrLX AntarktisrMUMGrNX MadagaskarrOUMFrPX S:t MartinrQUMArRXMarockorSUMCrTXMonacorUUUZrVX UzbekistanrWUMMrXXMyanmarrYUMLrZXMalir[UMOr\XMacao (S.A.R. Kina)r]UMNr^X Mongolietr_UHMr`XHeard- och McDonaldöarnaraUASrbXAmerikanska SamoarcUMKrdX MakedonienreUMUrfX MauritiusrgUMTrhXMaltariUMWrjXMalawirkUMVrlX MaldivernarmUMQrnX MartiniqueroUMPrpXNordmarianernarqUMSrrX MontserratrsUMRrtX MauretanienruUIMrvX Isle of ManrwUUGrxXUgandaryUTZrzXTanzaniar{UMYr|XMalaysiar}UMXr~XMexikorUILrXIsraelrUFRrX FrankrikerUAWrXArubarUDOrXDominikanska republikenrUSHrX S:t HelenarUVCrXS:t Vincent och GrenadinernarU054rX MelanesienrUDJrXDjiboutirUFJrXFijirU057rXMikronesiska öarnarU172rXOberoende staters samvälderU053rXAustralien och Nya ZeelandrUNIrX NicaraguarUNLrXNederländernarUNOrXNorgerUNArXNamibiarUVUrXVanuaturUNCrXNya KaledonienrUNErXNigerrUNFrX NorfolkönrUNGrXNigeriarUNZrX Nya ZeelandrUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolynesienrUCIrXElfenbenskustenrUCHrXSchweizrUCOrXColombiarUCNrXKinarUCMrXKamerunrUCLrXChilerUCCrX KokosöarnarUCArXKanadarUCGrXKongo-BrazzavillerUCFrXCentralafrikanska republikenrUCDrXKongo-KinshasarUCZrXTjeckienrUCYrXCypernrUCXrXJulönrUCSrXSerbien och MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Kap VerderUCUrXKubarUSZrX SwazilandrUSYrXSyrienrUKGrX KirgizistanrUKErXKenyarUSRrXSurinamrU143rX CentralasienrUKHrXKambodjarUKNrXS:t Kitts och NevisrUKMrX KomorernarUSTrXSão Tomé och PrínciperUSKrX SlovakienrUKRrXSydkorearUSIrX SlovenienrUKPrX NordkorearUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellernarUKZrX KazakstanrUKYrX CaymanöarnarUSGrX SingaporerUSErXSverigerUSDrXSudanr U151r X Östeuropar U150r XEuropar UDMrXDominicarU155rX VästeuroparU154rX NordeuroparUVGrXBrittiska JungfruöarnarUDErXTysklandrUYErXJemenrUMHrXMarshallöarnarU062rXsödra CentralasienrUDZrXAlgerietrUUSr XUSAr!UUYr"XUruguayr#UYTr$XMayotter%UUMr&XUSA:s yttre öarr'ULBr(XLibanonr)ULCr*X S:t Luciar+ULAr,XLaosr-UTVr.XTuvalur/UTWr0XTaiwanr1UTTr2XTrinidad och Tobagor3UTRr4XTurkietr5ULKr6X Sri Lankar7ULIr8X Liechtensteinr9UCKr:X Cooköarnar;UTOr<XTongar=ULTr>XLitauenr?ULUr@X LuxemburgrAULRrBXLiberiarCULSrDXLesothorEUTHrFXThailandrGUTFrHXFranska SydterritoriernarIUTGrJXTogorKUTDrLXTchadrMUTCrNXTurks- och CaicosöarnarOULYrPXLibyenrQUVArRX VatikanstatenrSU145rTX VästasienrUUAErVXFörenade ArabemiratenrWUADrXXAndorrarYUAGrZXAntigua och Barbudar[UAFr\X Afghanistanr]UAIr^XAnguillar_UVIr`XAmerikanska JungfruöarnaraUISrbXIslandrcUIRrdXIranreUAMrfXArmenienrgUALrhXAlbanienriUAOrjXAngolarkUANrlXNederländska AntillernarmU003rnX NordamerikaroU002rpXAfrikarqU001rrXvärldenrsUARrtX ArgentinaruUAUrvX AustralienrwUATrxX ÖsterrikeryU005rzX Sydamerikar{UINr|XIndienr}UAXr~XÅlandrU009rXOceanienrUAZrX AzerbajdzjanrUIErXIrlandrUIDrX IndonesienrUJOrX JordanienrUQUrXEuropeiska unionenrUUArXUkrainarUQArXQatarrUDKrXDanmarkrUMZrX MoçambiquerUQOrXYttre öar i OceanienruUdecimal_formatsr}rNh*)r}r(h-Nh/Kh0KKrh2h3h3rh5KKrh7X #,##0.###rh9h3h:rhXlekr?UKZTr@XTrAUTTDrBXTT$rCUOMRrDXROrEUSBDrFXSI$rGUPLNrHXZlrIUKESrJXK ShrKUGYDrLXG$rMUMKDrNXMDenrOUTWDrPXNT$rQUTOPrRXT$rSUBADrTXBADrUUGNFrVXGFrWUIQDrXXIDrYUBAMrZXKMr[UCADr\XCan$r]UCVEr^XCVEscr_UKWDr`XKDraUBIFrbXFburcUSOSrdXSh.reUSGDrfXS$rgUSTDrhXDbriUIRRrjXRIrkUCNYrlXYrmUCYPrnX£CroUMTLrpXLmrqUNZDrrX$NZrsUKGSrtXsomruUARSrvXArg$rwUSZLrxXEryUBHDrzXBDr{uU time_zonesr|}r}(UAtlantic/Canaryr~}rUcityrX KanarieöarnarsU Asia/Muscatr}rjXMuskatrsU Europe/Lisbonr}rjXLissabonrsUAmerica/Meridar}rjXMéridarsUEurope/Tallinnr}rjXTallinrsU Asia/Calcuttar}rjXKolkatarsU Asia/Dhakar}rjXDaccarsUAmerica/St_Luciar}rjX S:t LuciarsU Europe/Tiraner}rjXTiranarsUAmerica/Maceior}rjXMaceiórsUEurope/Zaporozhyer}rjX ZaporizjzjarsU Africa/Cairor}rjXKairorsU Europe/Moscowr}rjXMoskvarsUAmerica/El_Salvadorr}rjX San SalvadorrsUEurope/Podgoricar}rjX PodgorikarsU Asia/Dushanber}rjXDusjanbersUAmerica/Mazatlanr}rjX MazatlánrsUAsia/Ulaanbaatarr}rjX Ulan BatorrsUIndian/Maldivesr}rjX MaldivernarsUAmerica/Port-au-Princer}rjXPort au PrincersUPacific/Pago_Pagor}rjX Pango PangorsU Europe/Athensr}rjXAtenrsUAmerica/Reginar}rjXRéginarsUAmerica/Curacaor}rjXCuraçaorsU Asia/Manilar}rjXManillarsU America/Jujuyr}rjXSan Salvador de JujuyrsUAmerica/Cordobar}rjXCórdobarsU America/Belemr}rjXBelémrsU Europe/Romer}rjXRomrsUAfrica/Sao_Tomer}rjX São TomérsUEurope/Chisinaur}rjX ChrisinaursU Europe/Warsawr}rjXWarszawarsUAsia/Krasnoyarskr}rjX KrasnojarskrsUAsia/Yekaterinburgr}rjX JekaterinburgrsU Asia/Tehranr}rjXTeheranrsU America/Thuler}rjXQaanaaqrsUAmerica/St_Johnsr}rjX St. JohnsrsUIndian/Reunionr}rjXRéunionrsUAmerica/St_Thomasr}rjX Saint ThomasrsUEurope/Helsinkir}rjX HelsingforsrsUAtlantic/Cape_Verder}rjX Kap VerdersUAsia/Hong_Kongr}rjXHongkongrsUAmerica/Tegucigalpar}rjX TequciqalparsU Asia/Macaur}rjXMacaorsUEurope/Belgrader}rjXBelgradrsUAsia/Choibalsanr}rjX TjojbalsanrsUEurope/Copenhagenr }r jX Köpenhamnr sU Europe/Praguer }r jXPragrsUAmerica/Danmarkshavnr}rjX DanmarkshamnrsUAmerica/Scoresbysundr}rjXIttoqqortoormiitrsUAmerica/Eiruneper}rjX EirunepérsU Asia/Baghdadr}rjXBagdadrsU Asia/Sakhalinr}rjXSachalinrsUAmerica/St_Vincentr}rjX Saint Vincentr sU Asia/Katmandur!}r"jX Kathmandur#sUEurope/Uzhgorodr$}r%jXUzjgorodr&sU Asia/Thimphur'}r(jXThimpur)sUAmerica/Sao_Paulor*}r+jX São Paulor,sU Africa/Malabor-}r.jXMalobor/sU Asia/Tashkentr0}r1jXTasjkentr2sU Europe/Zurichr3}r4jXZürichr5sUPacific/Easterr6}r7jXPåskönr8sUAtlantic/South_Georgiar9}r:jX Grytvikenr;sUEurope/Bucharestr<}r=jXBukarestr>sU Asia/Anadyrr?}r@jXAnadirrAsUAmerica/Argentina/UshuaiarB}rCjXUshuaïarDsUPacific/GalapagosrE}rFjX GalápagosrGsUAmerica/BogotarH}rIjXBogotárJsU Asia/AqtoberK}rLjXAqtöberMsU Asia/YerevanrN}rOjXJerevanrPsUAmerica/CuiabarQ}rRjXCuiabárSsU Africa/LusakarT}rUjXLukasarVsUIndian/ChristmasrW}rXjXJulönrYsUAfrica/Addis_AbabarZ}r[jX Addis Abebar\sUAmerica/Cancunr]}r^jXCancúnr_sUAmerica/Havanar`}rajXHavannarbsUEurope/Brusselsrc}rdjXBrysselresUAtlantic/Azoresrf}rgjXAzorernarhsUAmerica/St_Kittsri}rjjX S:t KittsrksUAmerica/Godthabrl}rmjXGodthåbrnsUAfrica/Algiersro}rpjXAlgerrqsUAsia/Kamchatkarr}rsjX KamtjatkartsUEurope/Ljubljanaru}rvjX LjublianarwsUAfrica/Gaboronerx}ryjXGabonorerzsUAtlantic/Faeroer{}r|jXTorshamnr}sU Asia/Damascusr~}rjXDamaskusrsUAmerica/North_Dakota/Centerr}rjX North DakotarsU Asia/Yakutskr}rjXJakutskrsUAntarctica/DumontDUrviller}rjXDumont d’UrvillersU Asia/Almatyr}rjXAlma-AtarsUAmerica/Asuncionr}rjX AsunciónrsU Europe/Viennar}rjXWienrsUAfrica/Porto-Novor}rjX Porto NovorsUAmerica/Montrealr}rjX MontréalrsU Europe/Vaduzr}rjXVadusrsUEurope/Luxembourgr}rjX LuxemburgrsU Etc/Unknownr}rjXOkändrsU Asia/Seoulr}rjXSöulrsUAntarctica/South_Poler}rjXsydpolenrsuUscriptsr}r(UZsymrXsymbolerrUGururXgurmukhirUHebrrX hebreiskarUZzzzrX okodat skriptrUPhnxrX fenikiskarUMoonrXmoonrUSamrrX samaritiskarUChamrXchamrUArabrXarabiskarUGujrrXgujaratirUZxxxrXoskrivet språkrULycirXlykiskarUSinhrX singalesiskarUTalurXtai luerUMongrX mongoliskarUXpeorX fornpersiskarUVisprX synligt talrURjngrXrejangrUOlckrXol-chikirUTalerXtai lerUMandrX mandaéiskarUManirX manikeanskarUMlymrX malayalamrUTibtrX tibetanskarUKalirXkaya lirUJpanrXjapanskarUPlrdrX pollardteckenrUKanarXkatakanarULydirXlydiskarULepcrXrongrUSundrX sundanesiskarUYiiirXyirUJavarXjavanskarUOryarXoriyarULaoorXlaotiskarUUgarrX ugaritiskarUCyrlrX kyrilliskarUVaiirXvajrUArmnrX armeniskarUCyrsrXfornkyrkoslavisk kyrilliskarUKhmrrX khmeriskarUArmirXimperisk arameiskarUSylorX syloti nagrirUItalr X fornitaliskar USgnwr Xteckningsskriftr UXsuxr Xsumeo-akkadisk kilskriftr UThaar Xtaanar UThair X thailändskar UCprtr X cypriotiskar ULinbr X linjär Br ULinar X linjär Ar UOsmar Xosmanjar USaurr X saurashtrar UHirar Xhiraganar UHanir Xhanr UEgydr X demotiskar UQaair Xärvdar UEgyhr X hieratiskar UCansr Xkanadensiska stavelseteckenr UEgypr Xegyptiska hieroglyferr! UZmthr" Xmatematisk notationr# UTfngr$ Xtifinaghr% UShawr& Xshawiskar' UCirtr( Xcirtr) UGeorr* X georgiskar+ UTengr, Xtengwarr- UHrktr. Xkatakana/hiraganar/ UGeokr0 Xkutsurir1 UTavtr2 Xtai vietr3 UOgamr4 Xoghamr5 UDsrtr6 Xdeseretr7 UGothr8 Xgotiskar9 UHanor: Xhanunår; UBalir< X balinesiskar= UKorer> X koreanskar? UHangr@ XhangulrA UCarirB XkariskarC UAvstrD X avestiskarE UTagbrF XtagbanwarG UHansrH Xförenklad hanrI UHantrJ Xtraditionell hanrK URororL X rongo-rongorM UDevarN X devanagarirO UIndsrP XindusrQ UBoporR XbopomoforS UMymrrT X burmesiskarU UTglgrV XtagalogrW UPermrX X fornpermiskarY UBugirZ X buginesiskar[ UPhagr\ Xphags-par] UBrair^ X blindskriftr_ UBrahr` Xbramira UBatkrb Xbatakrc UMerord X meriotiskare ULimbrf Xlimburg UMteirh X meitei-mayekri UPhlirj X tidig pahlavirk UTelurl Xtelugurm UTamlrn Xtamilro USararp Xsaratirq UPhlprr Xpsalmbokspahlavirs ULatgrt Xgaeliskt latinru ULatfrv X frakturlatinrw UKharrx X kharoshtiry UNkoorz Xn-kår{ UPhlvr| X bokpahlavir} ULatnr~ Xlatinskar UMayar Xmayahieroglyferr ULanar Xlannar UEthir X etiopiskar UKthir X kaithiskar UHmngr X pahaw mongr UBuhdr Xbuhidr UCoptr Xkoptiskar UPrtir Xtidig parthianskar UGlagr X glagolitiskar URunrr Xrunorr UOrkhr Xorkonr UCakmr Xchakmar UHungr X fornungerskar UGrekr Xgrekiskar UCherr Xcherokeer UZyyyr X gemensammar USyrcr Xsyriskar UBlisr X blissymbolerr UBengr X bengaliskar USyrer Xestrangelosyriskar USyrjr X västsyriskar USyrnr X östsyriskar UKndar X kanaresiskar uUvariantsr }r (UMONOTONr Xmonotonisk stavningr UBOONTr X boontlingr USCOUSEr Xscouser UAREVELAr X östarmeniskar USOLBAr XSolbica-dialektr ULIPAWr XLipovaz-dialektr U1901r Xtraditionell tysk stavningr UBAKU1926r X1926 års stavningr UOSOJSr XOsojane-dialektr U1694ACADr X1694 års stavningr UVALENCIAr Xvalensisk dialektr UPOLYTONr Xpolytonisk stavningr UNJIVAr X Njiva-dialektr UFONIPAr X&internationell fonetisk notation - IPAr UTARASKr XTaraskievika-stavningr U1606NICTr X1606 års stavningr USAAHOr X saho-dialektr UFONUPAr Xuralisk fonetisk notationr UNEDISr Xnatisonsk dialektr UAREVMDAr Xvästarmeniskar U1994r X1994 års stavningr U1996r X"1996 års reformerad tysk stavningr UREVISEDr Xreformerad stavningr USCOTLANDr Xskotskar UBISKEr X Bila-dialektr UROZAJr Xresisk dialektr uUnumber_symbolsr }r (Udecimalr X,r Ugroupr X r U minusSignr X−r uUcurrency_namesr }r (ULSMr Xlesothisk malotir jXalgerisk dinarr ULVRr X lettisk rubelr UGHSr X ghanansk cedir UBOPr Xboliviansk pesor UEGPr Xegyptiskt pundr UBGLr Xbulgarisk lev (1962–1999)r UBGMr Xbulgarisk lev (1952–1962)r UBGNr Xbulgarisk ny levr jXöstkaribisk dollarr UPABr Xpanamansk balboar UYUMr Xjugoslavisk ny dinarr j XZimbabwe-dollarr UGHCr Xghanansk cedi (1979-2007)r UXBDr Xeuropeisk kontoenhet (XBD)r UBOBr X bolivianor UXBAr Xeuropeisk kompositenhetr jX dansk kronar UXBCr Xeuropeisk kontoenhet (XBC)r UXBBr Xeuropeisk monetär enhetr UBWPr Xbotswansk pular jXlibanesiskt pundr jXtanzanisk shillingr UVNDr Xvietnamesisk dongr UVNCr Xvietnamesisk gammal dongr jXNamibia-dollarr UAOAr Xangolansk kwanzar UWSTr Xvästsamoansk talar UAONr Xangolansk ny kwanza (1990-2000)r jXkambodjansk rielr! jXmalaysisk ringgitr" UAOKr# Xangolansk kwanza (1977-1990)r$ jdXsomalisk shillingr% jX Cayman-dollarr& jX libysk dinarr' UUAHr( Xukrainsk hryvniar) UUAKr* Xukrainsk karbovanetzr+ jXugandisk shillingr, jXjordansk dinarr- UAORr. X'angolansk kwanza reajustado (1995-1999)r/ USURr0 Xsovjetisk rubelr1 UAWGr2 X Aruba-guldenr3 jX saudisk riyalr4 jX finsk markr5 jXHongkong-dollarr6 j2Xsurinamesisk guldenr7 UTPEr8 Xtimoriansk escudor9 UMGFr: Xmadagaskisk francr; UCHEr< X,euro (konvertibelt konto, WIR Bank, Schweiz)r= jXschweizisk francr> UGIPr? Xgibraltiskt pundr@ jX vitrysk rubelrA j>X albansk lekrB UXPDrC X palladiumrD UUGSrE Xugandisk shilling (1966-1987)rF jXmauretansk ouguiyarG UBOVrH Xboliviansk mvdolrI UHRKrJ X kroatisk kunarK jXdjiboutisk francrL UHRDrM Xkroatisk dinarrN UPESrO X peruansk solrP UEQErQ XekwelerR UITLrS Xitaliensk lirarT UXAFrU XCFA Franc BEACrV UBNDrW X Brunei-dollarrX UISKrY Xisländsk kronarZ UZALr[ Xsydafrikansk rand (finansiell)r\ USRDr] XSurinam-dollarr^ UNIOr_ Xnicaraguansk córdoba oror` ULAKra X laotisk kiprb UNICrc Xnicaraguansk córdobard jXnepalesisk rupiere UMZErf Xmoçambikisk escudorg jXuruguayansk pesorh ULUCri Xluxemburgsk franc (konvertibel)rj jXJamaica-dollarrk UFRFrl X fransk francrm UMAFrn Xmarockansk francro UUYIrp X'uruguayanska peso en unidades indexadasrq UILRrr Xisraelisk gammal shekelrs UMZNrt Xmoçambikisk meticalru UPHPrv Xfilippinsk pesorw jXsydafrikansk randrx URHDry Xrhodesisk dollarrz UGWPr{ XGuinea-Bissau-pesor| ULUFr} Xluxemburgsk francr~ UBELr Xbelgisk franc (finansiell)r UBECr Xbelgisk franc (konvertibel)r UNGNr Xnigeriansk nairar UYUNr Xjugoslavisk dinar (konvertibel)r jX belgisk francr UPLZr Xpolsk zloty (1950-1995)r jXcostarikansk colónr jXgammal turkisk lirar UDEMr X tysk markr UEEKr X estnisk kronar jXmalawisk kwachar jBXTrinidad ochTobago-dollarr jXsrilankesisk rupier jXslovakisk korunar j^Xkapverdisk escudor jXpakistansk rupier jXungersk forintr UROKr XROKr jXgammal rumänsk leur UXEUr Xeuropeisk valutaenhetr jXBermuda-dollarr jDX omansk rialr jXlesothisk lotir UKPWr Xnordkoreansk wonr jXmongolisk tugrikr jX armenisk dramr UXXXr Xokänd eller ogiltig valutar UYUDr Xjugoslavisk hård dinarr UBUKr Xburmesisk kyatr jX syriskt pundr j.X qatarisk rialr UXDRr XIMF särskild dragningsrättr UNLGr Xnederländsk guldenr UGEKr Xgeorgisk kupon laritr UUGWr XUGWr UMTPr Xmaltesiskt pundr UGBPr Xbrittiskt pund sterlingr j X georgisk larir USHPr XS:t Helena-pundr UAFNr Xafghanir jFXSalomon-dollarr UCSKr Xtjeckisk hård korunar UCSJr Xtjeckoslovakiska kronar UXREr X RINET-fondr UCSDr Xjugoslavisk dinarr UAFAr Xafghani (1927-2002)r UTHBr Xthailändsk bahtr UBYBr Xvitrysk ny rubel (1994-1999)r jXbangladeshisk takar UGRDr Xgrekisk drachmar jXjemenitisk rialr UDDMr X östtysk markr jXgammal moçambikisk meticalr jxXswaziländsk lilangenir UHTGr Xhaitisk gourder UTRYr Xny turkisk lirar UMGAr Xmadagaskisk ariaryr jX Nederländska Antillernas guldenr ULRDr XLiberia-dollarr URWFr Xrwandisk francr jX norsk kronar UMXVr Xmexikansk unidad de inversionr jJXkenyansk shillingr UMOPr X Macao-patacar jX indisk rupier jXmexikansk pesor UCZKr Xtjeckisk korunar UTJSr Xtadzjikisk somonir UTJRr Xtadzjikisk rubelr jXbhutanesisk ngultrumr UYDDr Xjemenitisk dinarr UGWEr XPortugisiska Guinea-escudor j Xcolombiansk pesor UCOUr X colombiansk unidad de valor realr jpXmaltesisk lirar UMURr Xmauritisk rupier j"Xindonesisk rupiahr j$Xhonduransk lempirar jX CFP-francr j&X Fiji-dollarr j(X etiopisk birrr UPENr Xperuansk sol nuevor j*Xbelizisk dollarr UCHWr X-franc (konvertibelt konto, WIR Bank, Schweiz)r UATSr Xösterrikisk schillingr UILPr Xisraeliskt pundr UZRNr Xzairisk ny zairer j,Xdominikansk pesor ULULr Xluxemburgsk franc (finansiell)r UTMMr Xturkmensk manatr jPXtaiwanesisk ny dollarr UMDLr X moldavisk leur UXPTr Xplatinar UECVr X&ecuadoriansk unidad de valor constanter UECSr Xecuadoriansk sucrer UBSDr XBahamas-dollarr j0X svensk kronar jRXtongansk paʻangar UPEIr X peruansk intir UZMKr Xzambisk kwachar UMVRr Xmaldivisk rufiyaar UXTSr Xtest-valutakodr jXaustralisk dollarr! UADPr" Xandorransk pesetar# UCUPr$ X kubansk pesor% j4Xirländskt pundr& UCLFr' Xchilensk unidad de fomentor( j6XBarbados-dollarr) jXkomorisk francr* UKRWr+ Xsydkoreansk wonr, UGMDr- Xgambisk dalasir. UVEFr/ Xvenezuelansk bolivar fuerter0 j8Xguatemalansk quetzalr1 j:Xvenezuelansk bolivarr2 UXOFr3 XCFA Franc BCEAOr4 USITr5 Xslovensk tolarr6 USDPr7 Xgammalt sudanesiskt pundr8 j<X chilensk pesor9 UEURr: Xeuror; UCDFr< Xkongolesisk francr= UALKr> Xalbansk gamla lekr? j@Xkazakisk tenger@ URUBrA X rysk rubelrB UXFUrC XFrench UIC-FrancrD UXAGrE XsilverrF UBRRrG Xbrasiliansk cruzeirorH UBRNrI Xbrasiliansk cruzado novorJ UBRLrK Xbrasiliansk realrL UMMKrM Xmyanmarisk kyatrN UUYPrO Xuruguayansk peso (1975-1993)rP URURrQ Xrysk rubel (1991-1998)rR jHX polsk zlotyrS UBRErT X brasiliansk cruzeiro (1990-1993)rU UPYGrV Xparaguaysk guaranirW UBRCrX Xbrasiliansk cruzadorY UBRBrZ X%brasiliansk cruzeiro novo (1967-1986)r[ USVCr\ Xsalvadoransk colónr] UAEDr^ XFörenade Arabemiratens dirhamr_ UGNSr` Xguineansk sylira jNXmakedonisk denarrb UAZMrc X azerbajdzjansk manat (1993-2006)rd UAZNre Xazerbajdzjansk manatrf UUSNrg XUS-dollar (nästa dag)rh UGQEri Xekvatorialguineansk ekwelerj UUYNrk XUYNrl jXvanuatisk vaturm jTXbosnisk-hercegovinsk dinarrn jVXguineansk francro UMXPrp X mexikansk silverpeso (1861-1992)rq UGNErr Xguineansk syli (1972-1986)rs jXX irakisk dinarrt UERNru Xeritreansk nakfarv jZX'bosnisk-hercegovinsk mark (konvertibel)rw jXseychellisk rupierx j\Xkanadensisk dollarry USDDrz Xsudanesisk dinarr{ jnXcypriotiskt pundr| UMADr} Xmarockansk dirhamr~ j`Xkuwaitisk dinarr jbXburundisk francr ULTTr Xlettisk talonasr UPGKr X papuansk kinar ULTLr X lettisk litar jfXSingapore-dollarr UUZSr X uzbekisk sumr jhXSão Tomé och Príncipe-dobrar UXFOr Xfransk guldfrancr UMLFr X malisk francr UESPr X spansk pesetar jjX iransk rialr UZRZr X zairisk zairer UCNXr X Kina-dollarr jlXkinesisk yuan renminbir USLLr Xsierraleonsk leoner UTNDr Xtunisisk dinarr jLXguyanansk dollarr UESBr X"spansk peseta (konvertibelt konto)r UESAr Xspansk peseta (konto)r jrXnyzeeländsk dollarr UFKPr XFalklandsöarnas pundr ULVLr X lettisk latsr UUSSr XUS-dollar (samma dag)r UUSDr X US-dollarr UARPr Xargentinsk peso (1983-1985)r jtX kirgizisk somr jvXargentinsk pesor UILSr Xisraelisk ny shekelr URONr X rumänsk leur URSDr X Serbisk dinarr UARYr Xargentinsk gamla pesor jzX Bahrain-dinarr UJPYr X japansk yenr UARAr Xargentinsk australr USDGr Xsudanesiskt pundr UPTEr Xportugisisk escudor UXAUr Xguldr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXJr KXFr KjKXAr KjKj Kj Kj K XSr K XOr K XNr K XDr usUformatr }r (Uwider }r (KXjanuarir KXfebruarir KXmarsr KXaprilr KXmajr KXjunir KXjulir KXaugustir K X septemberr K Xoktoberr K Xnovemberr K Xdecemberr uU abbreviatedr }r (KXjanr KXfebr KXmarr KXaprr KXmajr KXjunr KXjulr KXaugr K Xsepr K Xoktr K Xnovr K Xdecr uuuUcurrency_formatsr }r Nh*)r }r (h-Nh/Kh0KKr h2X ¤r j r h5KKr h7X #,##0.00 ¤r h9h3h:r h j Xboliviansk normaltidr? uuU Turkmenistanr@ }rA (j j }rB (j Xturkmenisk tidrC j Xturkmenisk sommartidrD j Xturkmenisk normaltidrE uuU Alaska_HawaiirF }rG (j j }rH (j X hawaiisk tidrI j Xhawaiisk sommartidrJ j Xhawaiisk normaltidrK uuU Cape_VerderL }rM (j j }rN (j X Kap VerdetidrO j XKap VerdesommartidrP j XKap VerdenormaltidrQ uuUAzoresrR }rS (j j }rT (j X azorisk tidrU j Xazorisk sommartidrV j Xazorisk normaltidrW uuUPierre_MiquelonrX }rY (j j }rZ (j XPierre och Miquelontidr[ j XPierre och Miquelonsommartidr\ j XPierre och Miquelonnormalidr] uuUEurope_Centralr^ }r_ (j j }r` (j Xcentraleuropeisk tidra j Xcentraleuropeisk sommartidrb j Xcentraleuropeisk normaltidrc uuUTrukrd }re (j j }rf (j XTruktidrg j X Truksommartidrh j X Truknormaltidri uuU Aktyubinskrj }rk (j j }rl (j X Aqtobetidrm j XAqtobesommartidrn j XAqtobenormaltidro uuUBeringrp }rq (j j }rr (j X aleutisk tidrs j Xaleutisk sommartidrt j Xaleutisk normaltidru uuU Qyzylordarv }rw (j j }rx (j X Qyzylordatidry j XQyzylordasommartidrz j XQyzylordanormaltidr{ uuUKazakhstan_Easternr| }r} (j j }r~ (j X Alma-Atatidr j XAlma-Atasommartidr j XAlma-Atanormaltidr uuUFrunzer }r (j j }r (j X Bisjkektidr j XBisjkeksommartidr j XBisjkeknormaltidr uuU Dutch_Guianar }r (j j }r (j XHolländska Guianatidr j XHolländska Guianasommartidr j XHolländska Guiananormaltidr uuUYerevanr }r (j j }r (j X Yerevantidr j XYerevansommartidr j XYerevannormaltidr uuU Kamchatkar }r (j j }r (j X Kamtjatkatidr j XKamtjatkasommartidr j XKamtjatkanormaltidr uuULiberiar }r (j j }r (j Xliberiansk tidr j Xliberiansk sommartidr j Xliberiansk normaltidr uuUKashgarr }r (j j }r (j X Kashgartidr j XKashgarsommartidr j XKashgarnormaltidr uuUMaldivesr }r (j j }r (j XMaldivernas tidr j XMaldivernas sommartidr j XMaldivernas normaltidr uuUNorfolkr }r (j j }r (j XNorfolköns tidr j XNorfolköns sommartidr j XNorfolköns normaltidr uuU Dominicanr }r (j j }r (j Xdominikansk tidr j Xdominikansk sommartidr j Xdominikansk normaltidr uuUAfrica_Easternr }r (j j }r (j Xöstafrikansk tidr j Xöstafrikansk sommartidr j Xöstafrikansk normaltidr uuU Ashkhabadr }r (j j }r (j X Ashkhabadtidr j XAshkhabadsommartidr j XAshkhabadnormaltidr uuUAlaskar }r (j j }r (j X Alaskatidr j XAlaskasommartidr j XAlaskanormaltidr uuUAmerica_Easternr }r (j j }r (j Xöstnordamerikansk tidr j Xöstnordamerikansk sommartidr j Xöstnordamerikansk normaltidr uuU Yekaterinburgr }r (j j }r (j XJekaterinburgtidr j XJekaterinburgsommartidr j XJekaterinburgnormaltidr uuUSolomonr }r (j j }r (j XSalomonöarnas tidr j XSalomonöarnas sommartidr j XSalomonöarnas normaltidr uuU Krasnoyarskr }r (j j }r (j XKrasnojarsktidr j XKrasnojarsksommartidr j XKrasnojarsknormaltidr uuUAmerica_Centralr }r (j j }r (j Xcentralnordamerikansk tidr j Xcentralnordamerikansk sommartidr j Xcentralnordamerikansk normaltidr uuUPakistanr }r (j j }r (j Xpakistansk tidr j Xpakistansk sommartidr j Xpakistansk normaltidr uuUChathamr }r (j j }r (j X Chathamtidr j XChathamsommartidr j XChathamnormaltidr uuUSamoar }r (j j }r (j X samoansk tidr j Xsamoansk sommartidr j Xsamoansk normaltidr uuUMacaur }r (j j }r (j XMacautidr j XMacausommartidr j XMacaunormaltidr uuUChamorror }r (j j }r (j X Chamorrotidr j XChamorrosommartidr j XChamorronormaltidr uuUGuamr }r (j j }r (j XGuamtidr j X Guamsommartidr j X Guamnormaltidr uuUIndiar }r (j j }r (j X indisk tidr j Xindisk sommartidr j Xindisk normaltidr uuU Azerbaijanr }r (j j }r (j Xazerbajdzjansk tidr j Xazerbajdzjansk sommartidr j Xazerbajdzjansk normaltidr uuU Marquesasr }r (j j }r (j X Marquesastidr j XMarquesassommartidr j XMarquesasnormaltidr uuU Tajikistanr }r (j j }r (j XTadzjikistantidr! j XTadzjikistansommartidr" j XTadzjikistannormaltidr# uuUPitcairnr$ }r% (j j }r& (j X Pitcairntidr' j XPitcairnsommartidr( j XPitcairnnormaltidr) uuUTurkeyr* }r+ (j j }r, (j X turkisk tidr- j Xturkisk sommartidr. j Xturkisk normaltidr/ uuU Afghanistanr0 }r1 (j j }r2 (j X afghanisk tidr3 j Xafghanisk sommartidr4 j Xafghanisk normalidr5 uuU Choibalsanr6 }r7 (j j }r8 (j X Choibalsantidr9 j XChoibalsansommartidr: j XChoibalsannormaltidr; uuU Vladivostokr< }r= (j j }r> (j XVladivostoktidr? j XVladivostoksommartidr@ j XVladivostoknormaltidrA uuU ShevchenkorB }rC (j j }rD (j XAqtautidrE j XAqtausommartidrF j XAqtaunormaltidrG uuU BangladeshrH }rI (j j }rJ (j Xbangladeshisk tidrK j Xbangladeshisk sommartidrL j Xbangladeshisk normaltidrM uuUGulfrN }rO (j j }rP (j XPersiska GolfentidrQ j XPersiska GolfensommartidrR j XPersiska GolfennormaltidrS uuUDaccarT }rU (j j }rV (j XDaccatidrW j XDaccasommartidrX j XDaccanormaltidrY uuUMongoliarZ }r[ (j j }r\ (j X Ulan Batortidr] j XUlan Batorsommartidr^ j XUlan Batornormaltidr_ uuU Samarkandr` }ra (j j }rb (j X Samarkandtidrc j XSamarkandsommartidrd j XSamarkandnormaltidre uuUWakerf }rg (j j }rh (j XWaketidri j X Wakesommartidrj j X Wakenormaltidrk uuUPerurl }rm (j j }rn (j X peruansk tidro j Xperuansk sommartidrp j Xperuansk normalidrq uuUVanuaturr }rs (j j }rt (j X Vanuatutidru j XVanuatusommartidrv j XVanuatunormaltidrw uuUIndonesia_Centralrx }ry (j j }rz (j Xcentralindonesisk tidr{ j Xcentralindonesisk sommartidr| j Xcentralindonesisk normaltidr} uuUNaurur~ }r (j j }r (j XNaurutidr j XNaurusommartidr j XNaurunormaltidr uuUFalklandr }r (j j }r (j Xfalklandsöarnas tidr j Xfalklandsöarnas sommartidr j Xfalklandsöarnas normaltidr uuUKorear }r (j j }r (j X koreansk tidr j Xkoreansk sommartidr j Xkoreansk normaltidr uuUCubar }r (j j }r (j X kubansk tidr j Xkubansk sommartidr j Xkubansk normaltidr uuUIrkutskr }r (j j }r (j X Irkutsktidr j XIrkutsksommartidr j XIrkutsknormaltidr uuUArgentina_Westernr }r (j j }r (j Xvästargentinsk tidr j Xvästargentinsk sommartidr j Xvästargentinsk normaltidr uuUAmazonr }r (j j }r (j X Amazonastidr j XAmazonassommartidr j XAmazonasnormaltidr uuUChinar }r (j j }r (j X kinesisk tidr j Xkinesisk sommartidr j Xkinesisk normaltidr uuULong_Shur }r (j j }r (j X Chongqingtidr j XChongqingsommartidr j XChongqingnormaltidr uuUArmeniar }r (j j }r (j X armenisk tidr j Xarmenisk somartidr j Xarmenisk normaltidr uuUCookr }r (j j }r (j XCooköarnas tidr j XCooköarnas sommartidr j XCooköarnas normaltidr uuUAfrica_FarWesternr }r (j j }r (j Xvästsaharisk tidr j Xvästsaharisk sommartidr j Xvästsaharisk normaltidr uuUGreenland_Westernr }r (j j }r (j Xvästgrönländsk tidr j Xvästgrönländsk sommartidr j Xvästgrönländsk normaltidr uuUKarachir }r (j j }r j XKarachisommartidr suUTongar }r (j j }r (j XTongasommmartidr j XTongatidr uuUSakhalinr }r (j j }r (j X Sachalintidr j XSachalinsommartidr j XSachalinnormaltidr uuUBrasiliar }r (j j }r (j X Brasiliatidr j XBrasiliasommartidr j XBrasilianormaltidr uuU French_Guianar }r (j j }r (j XFranska Guianatidr j XFranska Guianasommartidr j XFranska Guiananormaltidr uuUFrench_Southernr }r (j j }r (j XFranska Sydterritoriernas tidr j X"Franska Sydterritoriernassommartidr j X#Franska Sydterritoriernas normaltidr uuU Mauritiusr }r (j j }r (j XMauritiussommartidr j X Mauritiustidr uuUAfrica_Southernr }r (j j }r (j Xsydafrikansk tidr j Xsydafrikansk sommartidr j Xsydafrikansk normaltidr uuUGambierr }r (j j }r (j X Gambiertidr j XGambiersommartidr j XGambiernormaltidr uuU Newfoundlandr }r (j j }r(j XNewfoundlandtidrj XNewfoundlandsommartidrj XNewfoundlandnormaltidruuUCocosr}r(j j }r(j XKeelingöarnas tidrj XKeelingöarnas sommartidrj XKeelingöarnas normaltidr uuU Kyrgystanr }r (j j }r (j X kirgizisk tidr j Xkirgizisk sommartidrj Xkirgizisk normaltidruuUTokelaur}r(j j }r(j X Tokelautidrj XTokelausommartidrj XTokelaunormaltidruuUAustralia_Westernr}r(j j }r(j Xvästaustralisk tidrj Xvästaustralisk sommartidrj Xvästaustralisk normaltidruuUBakur}r(j j }r(j XBakutidrj X Bakusommartidr j X Bakunormaltidr!uuUAfrica_Centralr"}r#(j j }r$(j Xcentralafrikansk tidr%j Xcentralafrikansk sommartidr&j Xcentralafrikansk normaltidr'uuU Line_Islandsr(}r)(j j }r*(j XLineöarnas tidr+j XLineöarnas sommartidr,j XLineöarnas normaltidr-uuU Novosibirskr.}r/(j j }r0(j XNovosibirsktidr1j XNovosibirsksommartidr2j XNovosibirsknormaltidr3uuUJapanr4}r5(j j }r6(j X japansk tidr7j Xjapansk sommartidr8j Xjapansk normaltidr9uuU Sverdlovskr:}r;(j j }r<(j X Sverdlovsktidr=j XSverdlovsksommartidr>j XSverdlovsknormaltidr?uuU New_Caledoniar@}rA(j j }rB(j XNya KaledonientidrCj XNya KaledoniensommartidrDj XNya KaledoniennormaltidrEuuU KwajaleinrF}rG(j j }rH(j XMarshallöarnas tidrIj XMarshallöarnas sommartidrJj XMarshallöarnas normaltidrKuuUAqtoberL}rM(j j }rN(j X AqtöbetidrOj XAqtöbesommartidrPj XAqtöbenormaltidrQuuUGilbert_IslandsrR}rS(j j }rT(j X KiribatitidrUj XKiribatisommartidrVj XKiribatinormaltidrWuuU IndochinarX}rY(j j }rZ(j Xindokinesisk tidr[j Xindokinesisk sommartidr\j Xindokinesisk normaltidr]uuUPapua_New_Guinear^}r_(j j }r`(j XPapua Nya Guineas tidraj XPapua Nya Guineas sommartidrbj XPapua Nya Guineas normaltidrcuuUHovdrd}re(j j }rf(j XHovdtidrgj X Hovdsommartidrhj X HovdnormaltidriuuU South_Georgiarj}rk(j j }rl(j Xsydgeorgisk tidrmj Xsydgeorgisk sommartidrnj Xsydgeorgisk normaltidrouuUEcuadorrp}rq(j j }rr(j Xequadoriansk tidrsj Xequadoriansk sommartidrtj Xequadoriansk normaltidruuuUMalayarv}rw(j j }rx(j X malaysisk tidryj Xmalaysisk sommartidrzj Xmalaysisk normaltidr{uuUBruneir|}r}(j j }r~(j X Bruneitidrj XBruneisommartidrj XBruneinormaltidruuUIranr}r(j j }r(j X iransk tidrj Xiransk sommartidrj Xiransk normaltidruuUAqtaur}r(j j }r(j XAqtautidrj XAqtausommartidrj XAqtaunormaltidruuU Indian_Oceanr}r(j j }r(j X"Brittiska Indiska oceanöarnas tdirj X(Brittiska Indiska oceanöarnas sommartdirj X(Brittiska Indiska oceanöarnas normaltdiruuUTuvalur}r(j j }r(j X Tuvalutidrj XTuvalusommartidrj XTuvalunormaltidruuUAmerica_Mountainr}r(j j }r(j XKlippiga Bergentidrj XKlippiga Bergensommartidrj XKlippiga BergennormaltidruuUHawaii_Aleutianr}r(j j }r(j X Honolulutidrj XHonolulusommartidrj XHonolulunormaltidruuUChangbair}r(j j }r(j X Changbaitidrj XChangbaisommartidrj XChangbainormaltidruuUChiler}r(j j }r(j X chilensk tidrj Xchilensk sommartidrj Xchilensk normaltidruuUWallisr}r(j j }r(j XWallis- och Futunaöarnas tidrj X#Wallis- och Futunaöarnas sommartidrj X#Wallis- och Futunaöarnas normaltidruuUKosraer}r(j j }r(j X Kosraetidrj XKosraesommartidrj XKosraenormaltidruuUDushanber}r(j j }r(j X Dushanbetidrj XDushanbesommartidrj XDushanbenormaltidruuUGeorgiar}r(j j }r(j X georgisk tidrj Xgeorgisk sommartidrj Xgeorgisk normaltidruuUAnadyrr}r(j j }r(j X Anadirtidrj XAnadirsommartidrj XAnadirnormaltidruuU Philippinesr}r(j j }r(j Xfilippinsk tidrj Xfilippinsk sommartidrj Xfilippinsk normaltidruuUYakutskr}r(j j }r(j X Jakutsktidrj XJakutsksommartidrj XJakutsknormaltidruuUIndonesia_Westernr}r(j j }r(j Xvästindonesisk tidrj Xvästindonesisk sommartidrj Xvästindonesisk normaltidruuUGreenland_Easternr}r(j j }r(j Xöstgrönländsk tidrj Xöstgrönländsk sommartidrj Xöstgrönländsk normaltidruuUOralr}r(j j }r(j XOraltidrj X Oralsommartidrj X OralnormaltidruuUGMTr}r(j j }r(j X Greenwichtidrj X/Greenwichtid har per definition ingen sommartidrj X GreenwichtidruuUMarshall_Islandsr}r(j j }r(j X Marshallötidrj XMarshallösommartidrj XMarshallönormaltidruuUIrishr}r(j j }r(j X irländsk tidrj Xirländsk sommartidrj Xirländsk normaltidruuU Seychellesr}r(j j }r(j XSeychellernas tidrj XSeychellernas sommartidrj XSeychellernas normaltidruuUUruguayr}r(j j }r(j Xuruguayansk tidr j Xuruguayansk sommartidr j Xuruguayansk normaltidr uuU Uzbekistanr }r (j j }r(j X uzbeskisk tidrj Xuzbeskisk sommartidrj Xuzbeskisk normaltidruuUColombiar}r(j j }r(j Xcolombiansk tidrj Xcolombiansk sommartidrj Xcolombiansk normaltidruuUReunionr}r(j j }r(j X Réuniontidrj XRéunionsommartidrj XRéunionnormaltidruuU Volgogradr}r(j j }r (j X Volvogradtidr!j XVolvogradsommartidr"j XVolvogradnormaltidr#uuU Kizilordar$}r%(j j }r&(j X Qyzylordatidr'j XQyzylordasommartidr(j XQyzylordanormaltidr)uuUFijir*}r+(j j }r,(j X Fijis tidr-j XFijis sommartidr.j XFijis normaltidr/uuUAmerica_Pacificr0}r1(j j }r2(j Xvästnordamerikansk tidr3j Xvästnordamerikansk sommartidr4j Xvästnordamerikansk normaltidr5uuUKazakhstan_Westernr6}r7(j j }r8(j X Aqtöbetidr9j XAqtöbesommartidr:j XAqtöbenormaltidr;uuUPalaur<}r=(j j }r>(j XPalautidr?j XPalausommartidr@j XPalaunormaltidrAuuUEurope_EasternrB}rC(j j }rD(j Xösteuropeisk tidrEj Xösteuropeisk sommatidrFj Xösteuropeisk normaltidrGuuUBhutanrH}rI(j j }rJ(j X bhutansk tidrKj Xbhutansk sommartidrLj Xbhutansk normaltidrMuuUBorneorN}rO(j j }rP(j X BorneotidrQj XBorneosommartidrRj XBorneonormaltidrSuuUNepalrT}rU(j j }rV(j Xnepalesisk tidrWj Xnepalesisk sommartidrXj Xnepalesisk normaltidrYuuU GalapagosrZ}r[(j j }r\(j X Galápagostidr]j XGalápagossommartidr^j XGalápagosnormaltidr_uuUPhoenix_Islandsr`}ra(j j }rb(j X Enderburytidrcj XEnderburysommartidrdj XEnderburynormaltidreuuUSurinamerf}rg(j j }rh(j X Surinamtidrij XSurinamsommartidrjj XSurinamnormaltidrkuuUAcrerl}rm(j j }rn(j Xvästbrasiliansk tidroj Xvästbrasiliansk sommartidrpj Xvästbrasiliansk normaltidrquuUEasterrr}rs(j j }rt(j X Påsköns tidruj XPåsköns sommartidrvj XPåsköns normaltidrwuuU Christmasrx}ry(j j }rz(j X Julöns tidr{j XJulöns sommartidr|j XJulöns normaltidr}uuU East_Timorr~}r(j j }r(j Xöstimorisk tidrj Xöstimorisk sommartidrj Xöstimorisk normaltidruuUIsraelr}r(j% }r(j XITrj X IST (Israel)ruj j }r(j X israelisk tidrj Xisraelisk sommartidrj Xisraelisk normaltidruuUAfrica_Westernr}r(j j }r(j Xvästafrikansk tidrj Xvästafrikansk sommartidrj Xvästafrikansk normaltidruuUTashkentr}r(j j }r(j X uzbekisk tidrj Xuzbekisk sommartidrj Xuzbekisk normaltidruuUMalaysiar}r(j j }r(j X malaysisk tidrj Xmalaysisk sommartidrj Xmalaysisk normaltidruuUNoronhar}r(j j }r(j XFernando de Noronhatidrj XFernando de Noronhasommartidrj XFernando de NoronhanormalidruuU Venezuelar}r(j j }r(j Xvenezulansk tidrj Xvenezulansk sommartidrj Xvenezulansk normaltidruuUPonaper}r(j j }r(j X Ponapetidrj XPonapesommartidrj XPonapenormaltidruuUIndonesia_Easternr}r(j j }r(j Xöstindonesisk tidrj Xöstindonesisk sommartidrj Xöstindonesisk normaltidruuUOmskr}r(j j }r(j XOmsktidrj X Omsksommartidrj X OmsknormaltidruuUAustralia_Centralr}r(j j }r(j Xcentralaustralisk tidrj Xcentralaustralisk sommartidrj Xcentralaustralisk normaltidruuUAtlanticr}r(j j }r(j Xnordamerikansk atlanttidrj Xnordamerikansk atlantsommartidrj Xnordamerikansk atlantnormaltidruuU North_Marianar}r(j j }r(j XNordmarianernas tidrj XNordmarianernas sommartidrj XNordmarianernas normaltidruuULankar}r(j j }r(j X Sri Lankatidrj XSri Lankasommartidrj XSri LankanormaltidruuUEurope_Westernr}r(j j }r(j Xvästeuropeisk tidrj Xvästeuropeisk sommartidrj Xvästeuropeisk normaltidruuU New_Zealandr}r(j j }r(j Xnyzeeländsk tidrj Xnyzeeländsk sommartidrj Xnyzeeländsk normaltidruuUBritishr}r(j j }r(j X brittisk tidrj Xbrittisk sommartidrj Xbrittisk normaltidruuUUrumqir}r(j j }r(j X Urumqitidrj XUrumqisommartidrj XUrumqinormaltidruuU Hong_Kongr}r(j j }r(j X Hongkongtidrj XHongkongsommartidrj XHongkongnormaltidruuUGuyanar}r(j j }r(j X Guyanatidrj XGuyanasommartidrj XGuyananormaltidruuUMagadanr}r(j j }r(j X Magadantidrj XMagadansommartidrj XMagadannormaltidruuUAlmatyr}r(j j }r(j X Alma-Atatidrj XAlma-Atasommartidrj XAlma-AtanormaltidruuUTbilisir}r(j j }r(j X georgisk tidrj Xgeorgisk sommartidr j Xgeorgisk normaltidr uuUMyanmarr }r (j j }r (j X burmesisk tidrj Xburmesisk sommartidrj Xburmesisk normaltidruuU Singaporer}r(j j }r(j X Singaporetidrj XSingaporesommartidrj XSingaporenormaltidruuUSamarar}r(j j }r(j X Samaratidrj XSamarasommartidrj XSamaranormaltidruuUGreenland_Centralr}r(j j }r(j Xcentralgrönländsk tidr j Xcentralgrönländsk sommartidr!j Xcentralgrönländsk normaltidr"uuUUralskr#}r$(j j }r%(j XOraltidr&j X Oralsommartidr'j X Oralnormaltidr(uuUTahitir)}r*(j j }r+(j X Tahititidr,j XTahitisommartidr-j XTahitinormaltidr.uuUParaguayr/}r0(j j }r1(j Xparaguyansk tidr2j Xparaguyansk sommartidr3j Xparaguyansk normalidr4uuUYukonr5}r6(j j }r7(j XYukontidr8j XYukonsommartidr9j XYukonnormaltidr:uuUMoscowr;}r<(j j }r=(j X Moskvatidr>j XMoskvasommartidr?j XMoskvanormaltidr@uuUNiuerA}rB(j j }rC(j XNiuetidrDj X NiuesommartidrEj X NiuenormaltidrFuuuUerasrG}rH(UwiderI}rJ(KX före KristusrKKX efter KristusrLuU abbreviatedrM}rN(KXf.Kr.rOKXe.Kr.rPuuu.PK[Rll(site-packages/babel/localedata/nr_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[*eb(site-packages/babel/localedata/sv_FI.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qUphnqX fenikiskaqsU territoriesq}q(UUMqXUSA:s yttre öarqU019qXAmerikaqUMOqXMacaoq UBAq!XBosnien-Hercegovinaq"UHKq#XHongkongq$uUdecimal_formatsq%}q&U date_formatsq'}q(Ucurrency_symbolsq)}q*U time_zonesq+}q,Uscriptsq-}q.Uvariantsq/}q0(UFONUPAq1Xuralisk fonetisk notation (UPA)q2UFONIPAq3X&internationell fonetisk notation (IPA)q4U1996q5X1996 års stavningq6uUnumber_symbolsq7}q8Ucurrency_namesq9}q:Umonthsq;}qUdaysq?}q@U meta_zonesqA}qBUerasqC}qDu.PK[Rll(site-packages/babel/localedata/ee_GH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[.W:jj(site-packages/babel/localedata/ru_UA.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vq hX%(HH)s:%(mm)s:%(ss)s %(v)sq!ubUlongq"h)q#}q$(hX HH:mm:ss zq%hX%(HH)s:%(mm)s:%(ss)s %(z)sq&ubUshortq'h)q(}q)(hXHH:mmq*hX %(HH)s:%(mm)sq+ubuU languagesq,}q-(Uapaq.Xапачскийq/Umhq0Xмаршальскийq1Udenq2X слэйвиq3Utlhq4Xклингонq5uU territoriesq6}q7Udecimal_formatsq8}q9U date_formatsq:}q;(Umediumq(hX d MMM yyyyq?hX%(d)s %(MMM)s %(yyyy)sq@ubUlongqAh)qB}qC(hX d MMMM yyyyqDhX%(d)s %(MMMM)s %(yyyy)sqEubuUcurrency_symbolsqF}qGU time_zonesqH}qIUscriptsqJ}qKUvariantsqL}qMUnumber_symbolsqN}qOUcurrency_namesqP}qQ(UYUMqRXYUMqSUESBqTXESBqUURHDqVXRHDqWuUmonthsqX}qYUcurrency_formatsqZ}q[Udaysq\}q]U meta_zonesq^}q_Uerasq`}qau.PK['(¡ *site-packages/babel/localedata/en_Shaw.datnu[}q(U zone_formatsq}q(UregionqX%s 𐑑𐑲𐑥qUgmtqX·𐑜𐑥𐑑%squUdatetime_formatsq}qUquartersq }q Uformatq }q (Uwideq }q(KX1𐑕𐑑 𐑒𐑢𐑸𐑛𐑸qKX2𐑯𐑛 𐑒𐑢𐑸𐑛𐑸qKX3𐑻𐑛 𐑒𐑢𐑸𐑛𐑸qKX4𐑹𐑔 𐑒𐑢𐑸𐑛𐑸quU abbreviatedq}q(KX𐑒1qKX𐑒2qKX𐑒3qKX𐑒4quusUperiodsq}q(UamqX𐑨𐑥qUpmqX𐑐𐑥quUscientific_formatsq}q Upercent_formatsq!}q"U week_dataq#}q$(Umin_daysq%KU weekend_startq&KU first_dayq'KU weekend_endq(KuU time_formatsq)}q*U languagesq+}q,U territoriesq-}q.Udecimal_formatsq/}q0U date_formatsq1}q2Ucurrency_symbolsq3}q4U time_zonesq5}q6Uscriptsq7}q8Uvariantsq9}q:Unumber_symbolsq;}qUmonthsq?}q@(U stand-aloneqA}qBUnarrowqC}qD(KX𐑡qEKX𐑓qFKX𐑥qGKX𐑱qHKX𐑥qIKX𐑡qJKX𐑡qKKX𐑪qLK X𐑕qMK X𐑷qNK X𐑯qOK X𐑛qPusUformatqQ}qR(UwideqS}qT(KX"·𐑡𐑨𐑙𐑘𐑭𐑢𐑺𐑰qUKX"·𐑓𐑧𐑚𐑘𐑵𐑢𐑺𐑰qVKX·𐑥𐑸𐑗qWKX·𐑱𐑐𐑮𐑭𐑤qXKX ·𐑥𐑱qYKX·𐑡𐑵𐑯qZKX·𐑡𐑫𐑤𐑲q[KX·𐑪𐑜𐑭𐑕𐑑q\K X"·𐑕𐑧𐑐𐑑𐑧𐑥𐑚𐑸q]K X·𐑷𐑒𐑑𐑴𐑚𐑸q^K X·𐑯𐑴𐑝𐑧𐑥𐑚𐑸q_K X·𐑛𐑭𐑕𐑧𐑥𐑚𐑸q`uU abbreviatedqa}qb(KX ·𐑡𐑨qcKX ·𐑓𐑧qdKX ·𐑥𐑸qeKX ·𐑱𐑐qfKX ·𐑥𐑱qgKX ·𐑡𐑵qhKX ·𐑡𐑫qiKX ·𐑪𐑜qjK X ·𐑕𐑧qkK X ·𐑷𐑒qlK X ·𐑯𐑴qmK X ·𐑛𐑭qnuuuUcurrency_formatsqo}qpUdaysqq}qr(U stand-aloneqs}qtUnarrowqu}qv(KX𐑥qwKX𐑑qxKX𐑢qyKX𐑔qzKX𐑓q{KX𐑕q|KX𐑕q}usUformatq~}q(Uwideq}q(KX·𐑥𐑭𐑙𐑛𐑱qKX·𐑑𐑵𐑟𐑛𐑱qKX·𐑢𐑧𐑙𐑟𐑛𐑱qKX·𐑔𐑻𐑟𐑛𐑱qKX·𐑓𐑮𐑲𐑛𐑱qKX·𐑕𐑨𐑛𐑻𐑛𐑱qKX·𐑕𐑭𐑙𐑛𐑱quU abbreviatedq}q(KX ·𐑥𐑭qKX ·𐑑𐑵qKX ·𐑢𐑧qKX ·𐑔𐑻qKX ·𐑓𐑮qKX ·𐑕𐑨qKX ·𐑕𐑭quuuU meta_zonesq}qUerasq}q(Uwideq}q(KX+𐑚𐑰𐑓𐑪𐑮 ·𐑒𐑮𐑲𐑕𐑑qKX%𐑨𐑙𐑴 𐑛𐑪𐑥𐑦𐑙𐑰quU abbreviatedq}q(KX 𐑚·𐑒qKX𐑨𐑛quUnarrowq}q(KX𐑚qKX𐑨quuu.PK[_.ll(site-packages/babel/localedata/am_ET.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[REbb%site-packages/babel/localedata/mt.datnu[}q(U zone_formatsq}q(UregionqX Ħin ta’ %sqUgmtqXGMT%squUdatetime_formatsq}qNX{1} {0}q sUquartersq }q Uformatq }q (Uwideq}q(KXK1qKXK2qKXK3qKXK4quU abbreviatedq}q(KXK1qKXK2qKXK3qKXK4quusUperiodsq}q(UamqXQNqUpmqXWNquUscientific_formatsq }q!Upercent_formatsq"}q#U week_dataq$}q%(Umin_daysq&KU weekend_startq'KU first_dayq(KU weekend_endq)KuU time_formatsq*}q+(Umediumq,cbabel.dates DateTimePattern q-)q.}q/(Upatternq0XHH:mm:ssq1Uformatq2X%(HH)s:%(mm)s:%(ss)sq3ubUfullq4h-)q5}q6(h0X HH:mm:ss vq7h2X%(HH)s:%(mm)s:%(ss)s %(v)sq8ubUlongq9h-)q:}q;(h0X HH:mm:ss zqh-)q?}q@(h0XHH:mmqAh2X %(HH)s:%(mm)sqBubuU languagesqC}qD(UgvqEXManksqFUguqGX GuġaratiqHUromqIXŻingaruqJUalgqKXLingwi AlgonqwinjaniqLUaleqMXAleutqNUscoqOX SkoċċiżqPUmniqQXManipuriqRUgdqSXGalliku SkoċċiżqTUgaqUX IrlandiżqVUmnoqWX Lingwi ManoboqXUosaqYXOsaġjanqZUgnq[XGwaraniq\Uglq]X Gallegjanq^Umwrq_XMarwariq`UtyqaX TaħitjanqbUtwqcXTwiqdUttqeXTatarqfUtrqgXTorkqhUtsqiXTsongaqjUtnqkXZwanaqlUtoqmXTongan (Gżejjer ta’ Tonga)qnUausqoXLingwi AwstraljaniqpUavqqXAvarikqrUtkqsXTurkmeniqtUthquX TajlandiżqvUroaqwXRomanz (Oħra)qxUtgqyXTaġikqzUteq{XTeluguq|Uugaq}X Ugaritikuq~UmwlqX MirandiżqUfatqXFantiqUfanqXFangqUwoqXWolofqUrmqX Reto-RomanzqUdinqXDinkaqUblaqXSiksikaqUcmcqXLingwi ĊamikiqUmlqX MalajalamqUzhqXĊiniżqUtemqXTimneqUnwcqXClassical NewariqUzaqXŻwangqUcauqXKawkasu (Oħra)qUzuqXŻuluqUterqXTerenoqUtetqXTetumqUmncqX ManċurjanqUkutqXKutenajqUsukqXSukumaqUkumqXKumikuqUsusqXSusuqUnewqXNewariqUsuxqXSumerjanqUdenqXSlavqUmenqXMendeqUmulqXLingwi DiversiqUlezqXLeżgjanqUrootqXGħerqqUekaqXEkajukqUakkqXAkkadjenqUdraqXDravidjan (Oħra)qUjrbqX Lhudi-GħarbiqUsgnqXLingwa tas-SinjaliqUsgaqXIrlandiż, Antik (sa l-900)qUapaqX Lingwi ApaċiqUbraqXBrajqUchbqXĊibċaqUchgqXĊagatajqUchkqXĊukeseqUchmqXMariqUchnqXĠargon taċ-ĊinukqUchoqXĊostawqUchpqX ĊipewjanqUchrqXĊerokijqUchyqXXajennqUtiqXTigrinjaqUvotqXVotikqUmgqX MalagażiqUibaqXIbanqUmoqX MoldavjanqUmnqX MongoljanqUmiqXMaoriqUmhqXMarxallqUmkqX MaċedonjanqUmtqXMaltiqUcaiqXAmerika Ċentrali (Oħra)qUdelqX DelawerjanqUmsqXMalajanqUmrqXMaratiqUtaqXTamilqUmyqXBurmiżqUcadqXKaddoqUtaiqX Tai (Oħra)qUafhqX AfriħilirUsitrXSino-Tibetjani (Oħra)rUenmrXIngliż, Medjevali (1100-1500)rUcsbrX KashubianrUnynrXNyankolerUnyor XNjoror Unymr X Njamweżir Usior XLingwi SuwjanirUmaprX AwstronesjanrUmasrXMasajrUlahrXLandarUladrXLadinorUfyrXFriżjanrUsnkrXSoninkerUfarXPersjanrUmadrXMaduriżrUmagrXMagaħir Umair!XMajtilir"Ufir#X Finlandiżr$Ufjr%XFiġir&Umanr'X Mandingwanr(Uegyr)XEġizzjan (Antik)r*Uzndr+XŻander,Ussr-XSwatir.Usrr/XSerbr0Usqr1XAlbaniżr2Uswr3XSwaħilir4Usvr5XSvediżr6Usur7X Sundaniżr8Ustr9XSoto, t’Isfelr:Uskr;XSlovakkr<Usir=X Sinħaliżr>Ushr?X Serbo-Kroatr@UsorAXSomalirBUsnrCXXonarDUsmrEXSamojanrFUslrGXSlovenrHUscrIX SardinjanrJUsarKXSanskritrLUsgrMXSangorNUserOXSami ta’ FuqrPUsdrQXSindirRUzenrSXŻenagarTUkbdrUX KabardianrVUafarWXAfro-Asjatiku (Oħra)rXUlgrYXGandarZUlbr[X Letżburgiżr\Ufiur]XFinno - Ugrijanr^Ulnr_X Lingaljanr`UloraXLaorbUlircX LimburgishrdUbynreXBlinrfUltrgX LitwanjanrhUluriX Luba-KatangarjUfilrkX FilippinorlUyirmXJiddixrnUnonroXSkandinav, AntikrpUcebrqXSibwanorrUyorsXJorubartUnogruXNogairvUbatrwXBaltiku (Oħra)rxUdakryXDakotarzUdarr{XDargwar|Udayr}XDajakr~UssarX Nilo-SaħaramrUkperXKpellerUelrXGriegrUeorX EsperantorUenrXIngliżrUlamrXLambarUeerXEwerUmdfrXMoksharUfrrX FranċiżrUmdrrXMandarrUetrXEstonjanrUesrXSpanjolrUrurXRussurUgonrXGondirUgohrXĠermaniku, Antik PulitrUsmsrX Skolt SamirUsmnrX Inari SamirUsmjrX Lule SamirUsmirXSami languages (Other)rUgotrXGotikurUrnrXRundirUrorXRumenrUdsbrX Lower SorbianrUsmarX Southern SamirUgorrX GorontalorUastrXAsturianrUwalrXWalamorUcrhrXCrimean Turkish; Crimean TatarrUathrXLingwi AtabaskanirUgezrXGeezrUxhrXĦożarUffrXFulaħrUmakrXMakasarrUzaprXŻapotekrUkokrXKonkanirUkosrXKosrejanrUforXFawriżrUtogrX Tonga (Njasa)rUhuprXĦuparUudmrXUdmurtrUbejrXBejarUbemrXBembarUtsirXZimxjanrUberrXBeberrUnzirXNżimarUsairX$Indjan tal-Amerika t’Isfel (Oħra)rUangrXIngliż, AntikrUprarXLingwi PrakritirUbhorXBojpurirUsalrXSalixanrUprorXProvenzal, Antik (sa l-1500)rUrajrX RaġastanirUsadrXSandawerUanprXAngikarUraprXRapanwirUsasrXSaskarUcarrXKaribrUminrX MinangkabawrUmicrXMikmekrUefirXEfikrUarnrX ArawkanjanrUypkrXLingwi JupiċirUmisrX Lingwi OħrarUkacrXKaċinrUkabrXKabuljanrUkaarX Kara-KalpakrUkamrXKambarUkarrXKarenrUkawrXKawirUtyvr XTuvinjanr Uawar XAwadħir Ukar X ĠorġjanrUdoirXDogrirUkgrXKongorUkkrXKażakrUkjrXKuanyamarUkirXKikujurUkorXKorejanrUknrXKannadarUkmrXKmerrUklrX Kalallisutr Uksr!XKaxmirir"Ukrr#XKanurir$Ukwr%XKornikur&Ukvr'XKomir(Ukur)XKurdiżr*Ukyr+XKirgiżr,Utklr-XTokelaur.Ubuar/XBurjatr0Umgar1XIrlandiż, Medjevali (900-1200)r2Uhitr3XĦittitr4Udyur5XDjular6Uder7X Ġermaniżr8Udar9XDaniżr:Udzr;XDżongkar<Uluir=X Luwisinużr>Udvr?XDiveħir@UhilrAX HiligaynonrBUhimrCX ĦimaċalirDUgemrEXĠermaniku (Oħra)rFUcrprGXKreoli u Piġini (Oħra)rHUqurIXKeċwarJUbasrKXBasarLUgbarMXGbajarNUbadrOXBandarPUbanrQXBaliniżrRUbalrSXBaluċirTUshnrUXXanrVUbairWXLingwi BamilekerXUarprYXArapaħorZUartr[XArtifiċjali (Oħra)r\Uarwr]XArawakr^Uarcr_XAramajkr`UsemraXSemitikurbUselrcXSelkuprdUnubreXLingwi NubjanirfUbtkrgXBatakrhUlusriXLuxajrjUmusrkXKriekrlUluarmX Luba-LuluwarnUiroroXLingwi IrogwjanirpUirarqXIranjanrrUmunrsXLingwi tal-MundartUlunruXLundarvUluorwXLuwarxUwaryXWalloonrzUtupr{XTupi languagesr|Ujvr}X Ġavaniżr~UtutrXAltajk (Oħra)rUtumrXTumbukarUjarX ĠappuniżrUcoprXKoptikurUilorXIlokorUlarXLatinrUgwirXGwiċinrUundrX IndeterminatrUtlirXTlingitrUtlhrXKlingonrUchrXĊamorrorUcorXKorsikurUcarXKatalanrUcerXĊeċenrUponrXPonpejanrUcyrXWelxrUsahrXJakutrUcsrXĊekrUcrrXKrijrUbntrXBanturUcvrXĊuvaxrUcurXSlaviku tal-KnisjarUlvrXLatvjan (Lettix)rUdumrXOlandiż, MedjevalirUptrX PortugiżrUduarXDwalarUfrorXFranċiż, AntikrUyaprXJapeserUfrmrXFranċiż, MedjevalirUtivrXTivrUyaorXJaorUparXPunġabirUxalrXKalmykrUpirXPalirUplrXPollakkrUgayrXGajorUotorXLingwi OtomjanirUotarXTork (Imperu Ottoman)rUhmnrXĦmongrUanrX AragoneserUgaarXGarUfurrX FrijuljanrUkhirXKojsanrUainrXAjnurUrarrX RarotonganirUslarXSlavic (Other)rUverXVendarUvirX VjetnamiżrUisrX IżlandiżrUkhorXKotaniżrUiurXInukitutrUitrXTaljanrUvorXVolapukrUiirX Sichuan YirUikrXInupjakrUiorXIdorUinerX Indo-EwropewrUiarX InterlinguarUjprrX Lhudi-PersjanrUierX InterlinguerUidrX IndoneżjanrUigrXIgborUpaprX PapjamentorUeworXEwondorUpaurXPalawjanrUpaarXPapwan (Oħra)rUpagrX PangasinjanrUsatrXSantalirUpalrXPaħlavirUpamr XPampamgar Uphir XFilippin (Oħra)r Ucelr XKeltiku (Oħra)rUphnrXFeniċjurUnicrXNiġerjan - KordofanjanrUniarXNijasrUdgrrXDogribrUsyrrXSirjanrUniurX NijuwejanrUcchrXAtsamrUjborXLojbanrUnahrX Naħwatilr Usamr!XSamritanr"Uhair#XĦajdar$Ugmhr%XĠermaniku, Medjevali Pulitr&Ucusr'XKuxtiku (Oħra)r(Uwenr)XLingwi Sorbjanir*Uadyr+XAdygher,Uelxr-XElamitr.Uadar/XAdangmer0Uhawr1X Ħawajjanr2Ubinr3XBinir4Ubikr5XBikolr6Umosr7XMossir8Umohr9XMoħakr:Utlr;XTagalogr<Utvlr=XTuvalur>Uijor?XIġor@UkmbrAXKimbundurBUpeorCX Persjan AntikrDUumbrEXUmbundurFUtmhrGXTamaxekrHUfonrIXFonrJUhsbrKX Upper SorbianrLUberMX BelarussurNUbgrOXBulgarurPUbarQXBaxkirrRUpsrSXPaxtunrTUbmrUXBambararVUbnrWXBengalirXUborYXTibetjanrZUbhr[XBiħarir\Ubir]XBislamar^Ubrr_XBrentonr`UbsraXBosnijanrbUruprcX AromanijanrdUomreX Oromo (Afan)rfUojrgXOġibwarhUaceriXAċiniżrjUachrkXAkolirlUocrmX OċċitanrnUkruroXKuruskrpUsrrrqXSererrrUkrorsXKrurtUkrcruXKarachay-BalkarrvUndsrwX!Ġermaniż Komuni; Sassonu KomunirxUosryX OssettikurzUorr{XOrijar|Usogr}XSogdienr~UnsorXSoto, ta’ FuqrUsonrXSongajrUvairXVairUwakrXLingwi WakaxanirUlolrXMongorUmkhrXMon-Kmer (Oħra)rUlozrXLożirUgilrX GilbertjanrUwasrXWaxorUwarrXWarajrUhzrXĦererorUhyrXArmenjanrUsidrXSidamorUhrrXKroatrUhtrXHaitianrUhurXUngeriżrUhirXĦindirUhorX Ħiri MoturUharXĦawsarUbugrXBuginiżrUherXEbrajkrUuzrXUżbekrUurrXUrdurUukrXUkranjanrUugrXWigurrUaarXAfarrUabrX AbkażjanrUaerXAvestanrUafrXAfrikansrUakrXAkanrUamrX AmħarikurUmyvrXErzyarUeurXBaskrUasrXAssameserUarrXGħarbirUinhrXIngushrUtpirX Tok PisinrUmynrXMajanrUayrXAjmararUkharXKasirUazrX AżerbajġanirUincrXIndjan (Oħra)rUnlrXOlandiżrUnnrXNinorsk NorveġiżrUnorX NorveġiżrUnarXNawururUnbrXBokmahal NorveġiżrUnairX$Indjan tal-Amerika ta’ Fuq (Oħra)rUndrXNdebele, ta’ FuqrUnerXNepaliżrUngrXNdongarUnyrXĊiċewa; NjanġarUnaprX NeapolitanrUgrbrXĠerborUgrcrXGrieg, Antik (to 1453)rUnrrXNdebele, t’IsfelrUtigrXTigrerUnvrXNavaħorUzunrXŻunirUrwrX KinjarwandarUcperX/Kreoli u Piġini, Bbażat fuq l-Ingliż (Oħra)rUcpfrX2Kreoli u Piġini, Bbażat fuq il-Franċiż (Oħra)rUcpprX2Kreoli u Piġini, Bbażat fuq il-Portugiż (Oħra)ruU territoriesr}r(UBDrX BangladexxrUBErXBelġjurUBFrX Burkina FasorUBGrX BulgarijarUVErX VenezwelarUBAr XBożnija Ħerżegovinar UBBr XBarbadosr UWFr XWallis and FutunarUBMrXBermudarUBNrXBrunejrUBOrXBolivjarUBHrXBaħrajnrUBIrXBurundirUBJrXBeninrUBTrXButanrU011rXAffrika tal-PunentrUBVrX Bouvet Islandr UBWr!XBotswanar"U014r#XAffrika tal-Lvantr$U015r%XAffrika ta’ Fuqr&UBRr'XBrażilr(U017r)XAffrika Nofsanir*U018r+XAffrika t’Isfelr,U019r-XAmerikar.UBYr/X Bjelorussjar0UBZr1XBeliżer2ULVr3XLatvjar4URWr5XRwandar6UTLr7XTimor tal-Lvantr8UREr9XRéunionr:UTMr;X Turkmenistanr<UTJr=X Taġikistanr>UROr?XRumanijar@UTKrAXTokelawrBUGWrCX Ginea-BissawrDUGUrEXGwamrFUGTrGX GwatemalarHUGSrIX,South Georgia and the South Sandwich IslandsrJUGRrKXGreċjarLUGQrMXGinea EkwatorjalirNUGPrOX GwadeluperPUJPrQXĠappunrRUKIrSXKiribatirTUGYrUXGujanarVUGFrWXGujana FranċiżarXUGErYXĠorġjarZUGDr[XGrenadar\U021r]XAmerika Nòrdikur^UGBr_X Ingilterrar`UGAraXGabonrbUSVrcX El SalvadorrdUGNreXGinejarfUGMrgXGambjarhUGLriX GrinlandjarjU029rkXKaribewrlUGIrmX GibraltarrnUGHroXGanarpUOMrqXOmanrrUTNrsXTuneżrtUJMruXĠamajkarvU013rwXAmerika ĊentralirxUWSryXSamoarzU419r{XAmerika Latina u l-Karibewr|UHRr}XKroazjar~UBSrXBaħamasrUHTrXĦaitirUHUrXUngerijarUHKrXĦong Kong S.A.R., ĊinarU039rXEwropa t’IsfelrUHNrX ĦondurasrUFIrX FinlandjarU142rXAsjarU030rXAsja tal-LvantrU034rXAsja t’Isfel ĊentralirU035rXAsja tax-XlokkrUPRrX Puerto RicorUPSrXPalestinian TerritoryrU830rXGżejjer tal-Kanal IngliżrUFKrXFalkland IslandsrUIOrXBritish Indian Ocean TerritoryrUPWrXPalaurUPTrX PortugallrUSJrXSvalbard and Jan MayenrUMDrXMaldovarUFMrX MikronesjarUIQrXIraqrUPArXPanamarUPFrXPolinesja FranċiżarUPGrXPapwa-Ginea ĠdidarUPErXPerurUPKrXPakistanrUPHrX FilippinirUFOrXGżejjer FaroerUPNrXPitcairnrUPLrXPolonjarUPMrXSaint Pierre and MiquelonrUZMrXŻambjarUEHrXSahara tal-PunentrURUrXRussjarUEErXEstonjarUEGrXEġitturUZArXAfrika t’IsfelrUECrXEkwadorrUITrXItaljarUVNrXVjetnamrUZZrX%Reġjun Mhux Magħruf jew Mhux ValidurUSBrXSolomon IslandsrUETrXEtijopjarUSOrXSomaljarUZWrX ŻimbabwerUSArXGħarabja SawditarUESrXSpanjarUERrXEritrejarUAQrX AntartikarUMGrX MadagaskarrUMArXMarokkrUMCrXMonakorUUZrX UżbekistanrUMMrXMjanmarrUMLrXMalirUMOrXMacao S.A.R., ChinarUMNrXMongoljarUHMrX!Heard Island and McDonald IslandsrUASrXSamoa AmerikanarUMKrX MaċedonjarUMUrXMawrizjurUMTrXMaltarUMWrXMalawirUMVrXMaldivesrUMQrXMartinikrUMPrXGżejjer Marjana ta’ FuqrUMSrX MontserratrUMRrX MawritanjarUIMr X Isle of Manr UUGr XUgandar UTZr X TanżanijarUMYrXMalasjarUMXrXMessikurUILrXIżraelrUFRrXFranzarUAWrXArubarUDOrXRepublikka DomenikanarUSHrX Saint HelenarUVCrX Saint Vincent and the GrenadinesrU054rX Melanesjar UDJr!XĠibutir"UFJr#XFiġir$U057r%XReġjun ta’ Mikroneżjar&U172r'X$Commonwealth tal-Istati Independentir(U053r)XAwstralja u New Zealandr*UNIr+X Nikaragwar,UNLr-XOlandar.UNOr/X Norveġjar0UNAr1XNamibjar2UVUr3XVanwatur4UNCr5X New Caledoniar6UNEr7XNiġerr8UNFr9XNorfolk Islandr:UNGr;XNiġerjar<UNZr=X New Zealandr>UNPr?XNepalr@UNRrAXNaururBUNUrCXNiuerDU061rEX PolinesjarFUCIrGXKosta ta’ l-AvorjurHUCHrIXSvizzerarJUCOrKXKolumbjarLUCNrMXĊinarNUCMrOXKamerunrPUCLrQXĊilirRUCCrSXCocos (Keeling) IslandsrTUCArUXKanadarVUCGrWXKongorXUCFrYXRepubblika Afrikana ĊentralirZUCDr[X Democratic Republic of the Congor\UCZr]XRepubblika Ċekar^UCYr_XĊiprur`UCXraXChristmas IslandrbUCSrcXSerbja u MontenegrordUCRreX Kosta RikarfUPYrgXParagwajrhUCVriX Kape VerderjUCUrkXKubarlUSZrmX SważilandrnUSYroXSirjarpUKGrqX KirgistanrrUKErsXKenjartUSRruXSurinamrvU143rwXAsja ĊentralirxUKHryXKambodjarzUKNr{XSaint Kitts and Nevisr|UKMr}XKomorosr~USTrXSao Tome and PrinciperUSKrX SlovakkjarUKRrXKoreja t’IsfelrUSIrXSlovenjarUKPrXKoreja ta’ FuqrUKWrXKuwajtrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KażakstanrUKYrXGżejjer KajmanirUSGrXSingaporrUSErXŻvezjarUSDrXSudanrU151rXEwropa tal-LvantrU150rXEwroparUDMrXDominikarU155rXEwropa tal-PunentrU154rXEwropa ta’ FuqrUVGrXBritish Virgin IslandsrUDErX ĠermanjarUYErXJemenrUMHrXGżejjer ta’ MarshallrUDZrX AlġerijarUUSrX Stati UnitirUUYrXUrugwajrUYTrXMajotterUUMrX$United States Minor Outlying IslandsrULBrXLibanurULCrX Santa LuċijarULArXLaosrUTVrXTuvalurUTWrXTajwanrUTTrXTrinidad u TobagorUTRrXTurkijarULKrX Sri LankarULIrX LiechtensteinrUCKrX Cook IslandsrUTOrXTongarULTrXLitwanjarULUrX LussemburgurULRrXLiberjarULSrXLesotorUTHrX TajlandjarUTFrX%Territorji Franċiżi ta’ NofsinharrUTGrXTogorUTDrXĊadrUTCrXTurks and Caicos IslandsrULYrXLibjarUVArXVatikanrU145rXAsja tal-PunentrUAErXEmirati Għarab MaqgħudarUADrXAndorrarUAGrXAntigua and BarbudarUAFrX AfganistanrUAIrXAngwillarUVIrXU.S. Virgin IslandsrUISrXIslandarUIRrXIranrUAMrXArmenjarUALrXAlbanijarUAOrXAngolarUANrXAntilles OlandiżirU003rXAmerika ta’ FuqrU002rXAffrikarU001rXDinjarUARrX ArġentinarUAUrX AwstraljarUATr XAwstrijar U005r XAmerika t’Isfelr UINr XIndjarUAXrXGżejjer AlandrU009rX OċejanjarUAZrX AżerbajġanrUIErXIrlandarUIDrX IndoneżjarUJOrXĠordanrUQUrXUnjoni EwropearUUArXUkrainarUQArXQatarr UDKr!X Danimarkar"UMZr#X Możambikr$uUdecimal_formatsr%}r&U date_formatsr'}r((Umediumr)h-)r*}r+(h0X dd MMM yyyyr,h2X%(dd)s %(MMM)s %(yyyy)sr-ubUfullr.h-)r/}r0(h0XEEEE, d 'ta'’ MMMM yyyyr1h2X'%(EEEE)s, %(d)s ta’ %(MMMM)s %(yyyy)sr2ubUlongr3h-)r4}r5(h0Xd 'ta'’ MMMM yyyyr6h2X%(d)s ta’ %(MMMM)s %(yyyy)sr7ubUshortr8h-)r9}r:(h0X dd/MM/yyyyr;h2X%(dd)s/%(MM)s/%(yyyy)sr<ubuUcurrency_symbolsr=}r>(UXXXr?XXXXr@UMTLrAXLmrBuU time_zonesrC}rD(U Europe/MaltarE}rFUcityrGXVallettarHsU Etc/UnknownrI}rJjGX Mhux MagħrufrKsU Europe/LondonrL}rMjGXLondrarNsuUscriptsrO}rP(UZyyyrQXKomunirRUXpeorSX Persjan AntikrTUZzzzrUX$Skritt Mhux Magħruf jew Mhux ValidurVUArabrWXGħarbirXUZxxxrYX Mhux MiktubrZUGrekr[XGriegr\UHansr]XĦan Sempliċir^ULatnr_XLatinr`UHantraXĦan TradizzjonalirbuUvariantsrc}rdUREVISEDreXOrtografija IrrivedarfsUnumber_symbolsrg}rh(UdecimalriX.rjUgrouprkX,rluUcurrency_namesrm}rn(j?X$Munita Mhux Magħruf jew Mhux ValidurojAX Lira MaltijarpUEURrqXEwrorruUmonthsrs}rt(U stand-aloneru}rvUnarrowrw}rx(KXJryKXFrzKXMr{KXAr|Kj{KXĠr}KXLr~Kj|K XSrK XOrK XNrK XDrusUformatr}r(Uwider}r(KXJannarrKXFrarrKXMarzurKXAprilrKXMejjurKXĠunjurKXLuljurKXAwissurK X SettembrurK XOttubrurK XNovembrurK X DiċembruruU abbreviatedr}r(KXJanrKXFrarKXMarrKXAprrKXMejrKXĠunrKXLulrKXAwirK XSetrK XOttrK XNovrK XDiċruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrjrUint_precrKKrh0X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXTrKjKXErKXĦrKXĠrKjKXĦrusUformatr}r(Uwider}r(KXIt-TnejnrKX It-TlietarKX L-ErbgħarKX Il-ĦamisrKX Il-ĠimgħarKXIs-SibtrKXIl-ĦaddruU abbreviatedr}r(KXTnerKXTlirKXErbrKXĦamrKXĠimrKXSibrKXĦadruuuU meta_zonesr}rUEurope_Centralr}r(UcommonrUlongr}r(UdaylightrXĦin Ċentrali Ewropew tas-SajfrUstandardrXĦin Ċentrali EwropewruusUerasr}r(Uwider}r(KX Qabel KristurKX Wara KristuruU abbreviatedr}r(KXQKrKXWKruuu.PK[D))-site-packages/babel/localedata/sr_Latn_CS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[D))-site-packages/babel/localedata/sr_Cyrl_RS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[D))-site-packages/babel/localedata/sr_Cyrl_YU.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[<'a{??%site-packages/babel/localedata/en.datnu[}q(U zone_formatsq}q(UregionqX%s TimeqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1st quarterqKX 2nd quarterqKX 3rd quarterqKX 4th quarterquU abbreviatedq}q(KXQ1q KXQ2q!KXQ3q"KXQ4q#uuuUperiodsq$}q%(Uamq&XAMq'Upmq(XPMq)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X%qFhFqGh7KKqHh9X#,##0%qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9X h:mm:ss aqXUformatqYX%(h)s:%(mm)s:%(ss)s %(a)sqZubUfullq[hU)q\}q](h9X h:mm:ss a vq^hYX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq_ubUlongq`hU)qa}qb(h9X h:mm:ss a zqchYX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqdubUshortqehU)qf}qg(h9Xh:mm aqhhYX%(h)s:%(mm)s %(a)sqiubuU languagesqj}qk(UgvqlXManxqmUguqnXGujaratiqoUscnqpXSicilianqqUromqrXRomanyqsUalgqtXAlgonquian LanguagequUaleqvXAleutqwUscoqxXScotsqyUmniqzXManipuriq{Ugdq|XScottish Gaelicq}Ugaq~XIrishqUmnoqXManobo LanguageqUosaqXOsageqUgnqXGuaraniqUaltqXSouthern AltaiqUglqXGalicianqUmwrqXMarwariqUtyqXTahitianqUtwqXTwiqUttqXTatarqUtrqXTurkishqUtsqXTsongaqUtnqXTswanaqUtoqXTongaqUausqXAustralian LanguageqUavqXAvaricqUtkqXTurkmenqUthqXThaiqUroaqXRomance LanguageqUtgqXTajikqUteqXTeluguqUugaqXUgariticqUmwlqX MirandeseqUkcgqXTyapqUsmiqX Sami LanguageqUfatqXFantiqUfanqXFangqUwoqXWolofqUrmqXRhaeto-RomanceqUdinqXDinkaqUblaqXSiksikaqUcmcqXChamic LanguageqUmlqX MalayalamqUzhqXChineseqUtemqXTimneqUen_CAqXCanadian EnglishqUnwcqXClassical NewariqUzaqXZhuangqUcauqXCaucasian LanguageqUzuqXZuluqUterqXTerenoqUtetqXTetumqUmncqXManchuqUkutqXKutenaiqUsukqXSukumaqUkumqXKumykqUsusqXSusuqUnewqXNewariqUsuxqXSumerianqUdenqXSlaveqUmenqXMendeqUmulqXMultiple LanguagesqUlezqXLezghianqUrootqXRootqUekaqXEkajukqUakkqXAkkadianqUdraqXDravidian LanguageqUjrbqX Judeo-ArabicqUsgnqX Sign LanguageqUsgaqX Old IrishqUapaqXApache LanguageqUbraqXBrajqUchbqXChibchaqUchgqXChagataiqUchkqXChuukeseqUchmrXMarirUchnrXChinook JargonrUchorXChoctawrUchprX ChipewyanrUchrrXCherokeer Uchyr XCheyenner Utir XTigrinyar UvotrXVoticrUmgrXMalagasyrUibarXIbanrUmorX MoldavianrUmnrX MongolianrUmirXMaorirUmhrX MarshalleserUmkrX MacedonianrUmtrXMalteserUcair X Central American Indian Languager!Udelr"XDelawarer#Umsr$XMalayr%Umrr&XMarathir'Utar(XTamilr)Umyr*XBurmeser+Ucadr,XCaddor-Usrnr.X Sranan Tongor/Utair0X Tai Languager1Uafhr2XAfrihilir3Usitr4XSino-Tibetan Languager5Uenmr6XMiddle Englishr7Uen_AUr8XAustralian Englishr9Unynr:XNyankoler;Unyor<XNyoror=Unymr>XNyamwezir?Usior@XSiouan LanguagerAUmaprBX AustronesianrCUmasrDXMasairEUlahrFXLahndarGUladrHXLadinorIUfyrJXWestern FrisianrKUsnkrLXSoninkerMUfarNXPersianrOUmadrPXMadureserQUmagrRXMagahirSUmairTXMaithilirUUfirVXFinnishrWUfjrXXFijianrYUmanrZXMandingor[Uegyr\XAncient Egyptianr]Uzndr^XZander_Ussr`XSwatiraUsrrbXSerbianrcUsqrdXAlbanianreUswrfXSwahilirgUsvrhXSwedishriUsurjX SundaneserkUstrlXSouthern SothormUskrnXSlovakroUsirpXSinhalarqUshrrXSerbo-CroatianrsUsortXSomaliruUsnrvXShonarwUsmrxXSamoanryUslrzX Slovenianr{Uscr|X Sardinianr}Usar~XSanskritrUsgrXSangorUserX Northern SamirUsdrXSindhirUzenrXZenagarUkbdrX KabardianrUafarXAfro-Asiatic LanguagerUcsbrX KashubianrUlgrXGandarUlbrX LuxembourgishrUfiurXFinno-Ugrian LanguagerUlnrXLingalarUlorXLaorUlirX LimburgishrUbynrXBlinrUltrX LithuanianrUlurX Luba-KatangarUfilrXFilipinorUyirXYiddishrUnonrX Old NorserUcebrXCebuanorUyorXYorubarUnogrXNogairUbatrXBaltic LanguagerUdakrXDakotarUdarrXDargwarUdayrXDayakrUssarXNilo-Saharan LanguagerUkperXKpellerUelrXGreekrUeorX EsperantorUenrXEnglishrUlamrXLambarUeerXEwerUmdfrXMoksharUfrrXFrenchrUmdrrXMandarrUetrXEstonianrUesrXSpanishrUrurXRussianrUgonrXGondirUgohrXOld High GermanrUsmsrX Skolt SamirUsmnrX Inari SamirUsmjrX Lule SamirUde_ATrXAustrian GermanrUgotrXGothicrUrnrXRundirUrorXRomanianrUdsbrX Lower SorbianrUsmarX Southern SamirUgorrX GorontalorUastrXAsturianrUwalrXWalamorUcrhrXCrimean TurkishrUathrXAthapascan LanguagerUgezrXGeezrUxhrXXhosarUffrXFulahrUkforXKororUmakrXMakasarrUzaprXZapotecrUkokrXKonkanirUzxxrXNo linguistic contentrUkosrXKosraeanrUforXFaroeserUtogrX Nyasa TongarUhuprXHuparUudmrXUdmurtrUbejrXBejar Ubemr XBembar Utsir X Tsimshianr UberrXBerberrUnzirXNzimarUsairXSouth American Indian LanguagerUangrX Old EnglishrUprarXPrakrit LanguagerUbhorXBhojpurirUsalrXSalishan LanguagerUprorXOld ProvençalrUrajrX RajasthanirUsadr XSandawer!Uanpr"XAngikar#Ues_419r$XLatin American Spanishr%Urapr&XRapanuir'Usasr(XSasakr)Unqor*XN’Kor+Ucarr,XCaribr-Uminr.X Minangkabaur/Umicr0XMicmacr1Uefir2XEfikr3Uarnr4X Araucanianr5Uypkr6XYupik Languager7Umisr8XMiscellaneous Languager9Ukacr:XKachinr;Ukabr<XKabyler=Ukaar>X Kara-Kalpakr?Ukajr@XJjurAUkamrBXKambarCUkarrDXKarenrEUkawrFXKawirGUfr_CHrHX Swiss FrenchrIUtyvrJXTuvinianrKUfr_CArLXCanadian FrenchrMUkarNXGeorgianrOUdoirPXDogrirQUkgrRXKongorSUkkrTXKazakhrUUkjrVXKuanyamarWUkirXXKikuyurYUkorZXKoreanr[Uknr\XKannadar]Ukmr^XKhmerr_Uklr`X KalaallisutraUksrbXKashmirircUkrrdXKanurireUkwrfXCornishrgUkvrhXKomiriUkurjXKurdishrkUkyrlXKirghizrmUtklrnXTokelauroUbuarpXBuriatrqUmgarrX Middle IrishrsUhitrtXHittiteruUdyurvXDyularwUderxXGermanryUdarzXDanishr{Udzr|XDzongkhar}Uluir~XLuisenorUdvrXDivehirUhilrX HiligaynonrUhimrX HimachalirUgemrXGermanic LanguagerUcrprXCreole or PidginrUqurXQuechuarUbasrXBasarUgbarXGbayarUbadrXBandarUbanrXBalineserUbalrXBaluchirUshnrXShanrUbairXBamileke LanguagerUarprXArapahorUartrXArtificial LanguagerUarwrXArawakrUarcrXAramaicrUen_USrX U.S. EnglishrUsemrXSemitic LanguagerUselrXSelkuprUnubrXNubian LanguagerUbtkrXBatakrUlusrXLushairUmusrXCreekrUluarX Luba-LuluarUirorXIroquoian LanguagerUirarXIranian LanguagerUmunrXMunda LanguagerUlunrXLundarUluorXLuorUwarXWalloonrUtuprX Tupi LanguagerUjvrXJavaneserUzblrX BlissymbolsrUtutrXAltaic LanguagerUtumrXTumbukarUjarXJapaneserUcoprXCopticrUilorXIlokorUlarXLatinrUgwirX GwichʼinrUundrXUnknown or Invalid LanguagerUtlirXTlingitrUtlhrXKlingonrUchrXChamorrorUcorXCorsicanrUcarXCatalanrUcerXChechenrUponrX PohnpeianrUcyrXWelshrUsahrXYakutrUcsrXCzechrUcrrXCreerUbntrXBanturUcvrXChuvashrUcurX Church SlavicrUlvrXLatvianrUdumrX Middle DutchrUptrX PortugueserUduarXDualarUfrorX Old FrenchrUyaprXYapeserUfrmrX Middle FrenchrUtivrXTivrUfrsrXEastern FrisianrUfrrrXNorthern FrisianrUyaorXYaorUparXPunjabirUxalrXKalmykr Ues_ESr XIberian Spanishr Upir XPalir Uen_GBrXBritish EnglishrUgayrXGayorUotorXOtomian LanguagerUotarXOttoman TurkishrUhmnrXHmongrUmyvrXErzyarUgaarXGarUfurrXFriulianrUkhirXKhoisan LanguagerUainr XAinur!Urarr"X Rarotonganr#Uslar$XSlavic Languager%Uver&XVendar'Uvir(X Vietnameser)Uisr*X Icelandicr+Ukhor,X Khotaneser-Uiur.X Inuktitutr/Uitr0XItalianr1Uvor2XVolapükr3Uiir4X Sichuan Yir5Uikr6XInupiaqr7Uior8XIdor9Uiner:XIndo-European Languager;Uiar<X Interlinguar=Ujprr>X Judeo-Persianr?Uier@X InterlinguerAUidrBX IndonesianrCUigrDXIgborEUpaprFX PapiamentorGUeworHXEwondorIUpaurJXPalauanrKUpaarLXPapuan LanguagerMUpagrNX PangasinanrOUsatrPXSantalirQUpalrRXPahlavirSUpamrTXPampangarUUsycrVXClassical SyriacrWUphirXXPhilippine LanguagerYUcelrZXCeltic Languager[Uphnr\X Phoenicianr]Unicr^XNiger-Kordofanian Languager_Uniar`XNiasraUdgrrbXDogribrcUsyrrdXSyriacreUniurfXNiueanrgUgswrhX Swiss GermanriUcchrjXAtsamrkUjborlXLojbanrmUnahrnXNahuatlroUsamrpXSamaritan AramaicrqUhairrXHaidarsUgmhrtXMiddle High GermanruUcusrvXCushitic LanguagerwUwenrxXSorbian LanguageryUadyrzXAdygher{Uelxr|XElamiter}Uadar~XAdangmerUpt_PTrXIberian PortugueserUhawrXHawaiianrUbinrXBinirUbikrXBikolrUpt_BRrXBrazilian PortugueserUmosrXMossirUmohrXMohawkrUtlrXTagalogrUzh_HansrXSimplified ChineserUzh_HantrXTraditional ChineserUtvlrXTuvalurUijorXIjorUkmbrXKimbundurUpeorX Old PersianrUumbrXUmbundurUtmhrXTamashekrUfonrXFonrUhsbrX Upper SorbianrUberX BelarusianrUbgrX BulgarianrUbarXBashkirrUpsrXPashtorUbmrXBambararUbnrXBengalirUborXTibetanrUbhrXBiharirUbirXBislamarUbrrXBretonrUbsrXBosnianrUruprX AromanianrUzzarXZazarUomrXOromorUojrXOjibwarUacerXAchineserUachrXAcolirUocrXOccitanrUkrurXKurukhrUsrrrXSererrUkrorXKrurUkrlrXKarelianrUkrcrXKarachay-BalkarrUndsrX Low GermanrUosrXOsseticrUorrXOriyarUsogrXSogdienrUnsorXNorthern SothorUsonrXSonghairUde_CHrXSwiss High GermanrUvairXVairUwakrXWakashan LanguagerUlolrXMongorUmkhrXMon-Khmer LanguagerUawarXAwadhirUlozrXLozirUgilrX GilberteserUwasrXWashorUwarrXWarayrUhzrXHererorUhyrXArmenianrUanrX AragoneserUsidrXSidamorUhrrXCroatianrUhtrXHaitianrUhurX HungarianrUhirXHindirUhorX Hiri MoturUharXHausarUbugrXBugineserUherXHebrewr Uuzr XUzbekr Uurr XUrdur UplrXPolishrUukrX UkrainianrUugrXUighurrUaarXAfarrUabrX AbkhazianrUaerXAvestanrUafrX AfrikaansrUakrXAkanrUamrXAmharicrUnl_BEr XFlemishr!Ueur"XBasquer#Uasr$XAssameser%Uarr&XArabicr'Uinhr(XIngushr)Utpir*X Tok Pisinr+Umynr,XMayan Languager-Uayr.XAymarar/Ukhar0XKhasir1Uazr2X Azerbaijanir3Uincr4XIndic Languager5Unlr6XDutchr7Unnr8XNorwegian Nynorskr9Unor:X Norwegianr;Unar<XNaurur=Unbr>XNorwegian Bokmålr?Unair@XNorth American Indian LanguagerAUndrBX North NdebelerCUnerDXNepalirEUngrFXNdongarGUnyrHXNyanjarIUnaprJX NeapolitanrKUgrbrLXGreborMUgrcrNX Ancient GreekrOUnrrPX South NdebelerQUtigrRXTigrerSUnvrTXNavajorUUzunrVXZunirWUrwrXX KinyarwandarYUcperZXEnglish-based Creole or Pidginr[Ucpfr\XFrench-based Creole or Pidginr]Ucppr^X!Portuguese-based Creole or Pidginr_uU territoriesr`}ra(UBDrbX BangladeshrcUBErdXBelgiumreUBFrfX Burkina FasorgUBGrhXBulgariariUVErjX VenezuelarkUBArlXBosnia and HerzegovinarmUBBrnXBarbadosroUWFrpXWallis and FutunarqUBLrrXSaint BarthélemyrsUBMrtXBermudaruUBNrvXBruneirwUBOrxXBoliviaryUBHrzXBahrainr{UBIr|XBurundir}UBJr~XBeninrUBTrXBhutanrU011rXWestern AfricarUBVrX Bouvet IslandrUBWrXBotswanarU014rXEastern AfricarU015rXNorthern AfricarUBRrXBrazilrU017rX Middle AfricarU018rXSouthern AfricarU019rXAmericasrUWKrX Wake IslandrUBYrXBelarusrUBZrXBelizerULVrXLatviarURWrXRwandarUPCrXPacific Islands Trust TerritoryrUTLrX East TimorrUJTrXJohnston IslandrUTMrX TurkmenistanrUOMrXOmanrUTJrX TajikistanrUROrXRomaniarUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX,South Georgia and the South Sandwich IslandsrUGRrXGreecerUGQrXEquatorial GuinearUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrX French GuianarUGErXGeorgiarUGDrXGrenadarU021rXNorthern AmericarUGBrXUnited KingdomrUGArXGabonrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GreenlandrU029rX CaribbeanrUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunisiarUJMrXJamaicarUSJrXSvalbard and Jan MayenrU013rXCentral AmericarUWSrXSamoarU419rXLatin America and the CaribbeanrUBQrXBritish Antarctic TerritoryrUVArXVaticanrUHRrXCroatiarUBSrXBahamasrUHTrXHaitirUHUrXHungaryrUHKrXHong Kong SAR ChinarU039rXSouthern EuroperUHNrXHondurasrUSUrX#Union of Soviet Socialist RepublicsrUFIrXFinlandrU142rXAsiarU030rX Eastern AsiarUUArXUkrainerU034rX Southern Asiar U035r XSouth-Eastern Asiar UPRr X Puerto Ricor UPSrXPalestinian TerritoryrU830rXChannel IslandsrUFKrXFalkland IslandsrUIOrXBritish Indian Ocean TerritoryrUPWrXPalaurUPTrXPortugalrUPUrX"U.S. Miscellaneous Pacific IslandsrUPZrXPanama Canal ZonerUMDrXMoldovarUFMr X Micronesiar!UIQr"XIraqr#UPAr$XPanamar%UPFr&XFrench Polynesiar'UPGr(XPapua New Guinear)UPEr*XPerur+UPKr,XPakistanr-UPHr.X Philippinesr/UFOr0X Faroe Islandsr1UPNr2XPitcairnr3UPLr4XPolandr5UPMr6XSaint Pierre and Miquelonr7UZMr8XZambiar9UEHr:XWestern Saharar;URUr<XRussiar=UEEr>XEstoniar?UEGr@XEgyptrAUZArBX South AfricarCUECrDXEcuadorrEUITrFXItalyrGUVNrHXVietnamrIUZZrJXUnknown or Invalid RegionrKUSBrLXSolomon IslandsrMUETrNXEthiopiarOUSOrPXSomaliarQUZWrRXZimbabwerSUSArTX Saudi ArabiarUUESrVXSpainrWUERrXXEritrearYUMErZX Montenegror[UAQr\X Antarcticar]UMGr^X Madagascarr_UMFr`X Saint MartinraUMArbXMoroccorcUMCrdXMonacoreUUZrfX UzbekistanrgUMMrhXMyanmarriUMLrjXMalirkUMOrlXMacau SAR ChinarmUMNrnXMongoliaroUHMrpX!Heard Island and McDonald IslandsrqUASrrXAmerican SamoarsUMKrtX MacedoniaruUMUrvX MauritiusrwUMTrxXMaltaryUMWrzXMalawir{UMVr|XMaldivesr}UMQr~X MartiniquerUMPrXNorthern Mariana IslandsrUMSrX MontserratrUMRrX MauritaniarUIMrX Isle of ManrUUGrXUgandarUTZrXTanzaniarUMYrXMalaysiarUMXrXMexicorUILrXIsraelrUFQrX)French Southern and Antarctic TerritoriesrUFRrXFrancerUAWrXArubarUDOrXDominican RepublicrUFXrXMetropolitan FrancerUSHrX Saint HelenarUVCrX Saint Vincent and the GrenadinesrURErXReunionrU054rX MelanesiarUDJrXDjiboutirUFJrXFijirU057rXMicronesian RegionrU172rX"Commonwealth of Independent StatesrU053rXAustralia and New ZealandrUNIrX NicaraguarUNLrX NetherlandsrUNOrXNorwayrUNArXNamibiarUVUrXVanuaturUNCrX New CaledoniarUVDrX North VietnamrUNErXNigerrUNFrXNorfolk IslandrUNGrXNigeriarUNZrX New ZealandrUNPrXNepalrUNQrXDronning Maud LandrUNRrXNaururUNTrX Neutral ZonerUNUrXNiuerU061rX PolynesiarUCIrX Ivory CoastrUCHrX SwitzerlandrUCOrXColombiarUCNrXChinarUCMrXCameroonrUCLrXChilerUCCrX Cocos IslandsrUCArXCanadarUCGrXCongo - BrazzavillerUCFrXCentral African RepublicrUCDrXCongo - KinshasarUCZrXCzech RepublicrUCYrXCyprusrUCXrXChristmas IslandrUCSrXSerbia and MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Cape VerderUCUrXCubarUCTrXCanton and Enderbury IslandsrUSZrX SwazilandrUSYrXSyriarUKGrX KyrgyzstanrUKErXKenyarUSRrXSurinamerU143rX Central AsiarUKHrXCambodiarUKNrXSaint Kitts and NevisrUKMrXComorosr USTr XSao Tome and Principer USKr XSlovakiar UKRrX South KorearUSIrXSloveniarUKPrX North KorearUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellesrUKZrX KazakhstanrUKYr XCayman Islandsr!USGr"X Singaporer#USEr$XSwedenr%USDr&XSudanr'U151r(XEastern Europer)U150r*XEuroper+UDMr,XDominicar-U155r.XWestern Europer/U154r0XNorthern Europer1UVGr2XBritish Virgin Islandsr3UMIr4XMidway Islandsr5UDDr6X East Germanyr7UDEr8XGermanyr9UYEr:XYemenr;UYDr<X%People's Democratic Republic of Yemenr=UMHr>XMarshall Islandsr?U062r@XSouth-Central AsiarAUDZrBXAlgeriarCUUSrDX United StatesrEUUYrFXUruguayrGUYTrHXMayotterIUUMrJX$United States Minor Outlying IslandsrKULBrLXLebanonrMULCrNX Saint LuciarOULArPXLaosrQUTVrRXTuvalurSUTWrTXTaiwanrUUTTrVXTrinidad and TobagorWUTRrXXTurkeyrYULKrZX Sri Lankar[ULIr\X Liechtensteinr]UCKr^X Cook Islandsr_UTOr`XTongaraULTrbX LithuaniarcULUrdX LuxembourgreULRrfXLiberiargULSrhXLesothoriUTHrjXThailandrkUTFrlXFrench Southern TerritoriesrmUTGrnXTogoroUTDrpXChadrqUTCrrXTurks and Caicos IslandsrsULYrtXLibyaruU200rvXCzechoslovakiarwU145rxX Western AsiaryUAErzXUnited Arab Emiratesr{UADr|XAndorrar}UAGr~XAntigua and BarbudarUAFrX AfghanistanrUAIrXAnguillarUVIrXU.S. Virgin IslandsrUISrXIcelandrUIRrXIranrUAMrXArmeniarUALrXAlbaniarUAOrXAngolarUANrXNetherlands AntillesrU003rX North AmericarU002rXAfricarU001rXWorldrUARrX ArgentinarUAUrX AustraliarUATrXAustriarU005rX South AmericarUINrXIndiarUAXrX Aland IslandsrU009rXOceaniarUAZrX AzerbaijanrUIErXIrelandrUIDrX IndonesiarUJOrXJordanrUQUrXEuropean UnionrURSrXSerbiarUQArXQatarrUDKrXDenmarkrUMZrX MozambiquerUQOrXOutlying OceaniaruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9X MMM d, yyyyrhYX%(MMM)s %(d)s, %(yyyy)srubUfullrhU)r}r(h9XEEEE, MMMM d, yyyyrhYX"%(EEEE)s, %(MMMM)s %(d)s, %(yyyy)srubUlongrhU)r}r(h9X MMMM d, yyyyrhYX%(MMMM)s %(d)s, %(yyyy)srubUshortrhU)r}r(h9XM/d/yyrhYX%(M)s/%(d)s/%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUGHSrX₵rUBGLrXlevrUBOBrXBsrUDKKrXDkrrUBWPrXPrULBPrXLLrUTZSrXT ShrUVNDrX₫rUAOArXKzrUKHRrXCRrUMYRrXRMrULYDrXLDrUUAHrX₴rUJODrXJDrUAWGrXAfl.rUSARrXSRlrUHKDrXHK$rUSRGrXSfrUCHFrXFr.rUBYRrXRblrUALLrXlekr UMROr XUMr UDJFr XFdjr UTHBrX฿rUBNDrXB$rUVUVrXVTrUUYUrXUr$rUNICrXC$rUSYPrXLSrUMZMrXMtrUMZNrXMTnrUPHPrX₱rUZARr XRr!UNPRr"XNrsr#UNGNr$X₦r%UBEFr&XBFr'UCRCr(X₡r)UGBPr*X£r+UMWKr,XMKr-ULKRr.XSL Rer/USKKr0XSkr1UPKRr2XPrar3UHUFr4XFtr5UBMDr6XBD$r7ULSLr8XMr9UMNTr:X₮r;UAMDr<Xdramr=UUGXr>XU Shr?UZWDr@XZ$rAUJMDrBXJ$rCUGELrDXlarirEUAFNrFXAfrGUTRLrHXTLrIUBDTrJXTkrKUYERrLXYRlrMUANGrNXNAf.rOUXCDrPXEC$rQUNOKrRXNKrrSUINRrTX₨rUUMXNrVXMEX$rWUCZKrXXKčrYUBTNrZXNur[UCOPr\XCO$r]UIDRr^XRpr_UHNLr`XLraUXPFrbXCFPFrcUFJDrdXF$reUETBrfXBrrgUBZDrhXBZ$riUILSrjX₪rkUDOPrlXRD$rmUTWDrnXNT$roUQARrpXQRrqUSEKrrXSKrrsUAUDrtXA$ruUIEPrvXIR£rwUBBDrxXBds$ryUKMFrzXCFr{UKRWr|X₩r}UVEFr~XBsFrUGTQrXQrUVEBrXBerUCLPrXCL$rUITLrX₤rUKZTrXTrUTTDrXTT$rUOMRrXROrUSBDrXSI$rUPLNrXzłrUPYGrX₲rUKESrXK ShrUGYDrXG$rUMKDrXMDenrUAZNrXman.rUTOPrXT$rUGNFrXGFrUIQDrXIDrUBAMrXKMrUSCRrXSRrUCADrXCA$rUCVErXEscrUKWDrXKDrUBIFrXFBurUSOSrXSh.rUSGDrXS$rUSTDrXDbrUESPrX₧rUIRRrXRIrUCNYrXRMBrUCYPrX£CrUMTLrXLmrUNZDrXNZ$rUUSDrX$rUKGSrXsomrUARSrXAR$rUSZLrXErUBHDrXBDrUJPYrX¥ruU time_zonesr}r(U Europe/Dublinr}r(Ushortr}rUdaylightrX IST (Irish)rsUlongr}rjXIrish Summer TimersuU Etc/Unknownr}rUcityrXUnknownrsUAntarctica/DumontDUrviller}rjXDumont d’UrvillersU Europe/Londonr}r(j}rjXBSTrsj}rjXBritish Summer TimersuuUscriptsr}r(UZsymrXSymbolsrUGururXGurmukhirUHebrrXHebrewrUZzzzrXUnknown or Invalid ScriptrUPhnxrX PhoenicianrUMoonrXMoonrUSamrrX SamaritanrUChamrXChamrUArabrXArabicrUGujrrXGujaratirUZxxxrX UnwrittenrULycirXLycianrUSinhrXSinhalarUTalurX New Tai LuerUMongrX MongolianrUXpeorX Old PersianrUVisprXVisible SpeechrURjngrXRejangr UOlckr XOl Chikir UTaler XTai Ler UMandrXMandaeanrUManirX ManichaeanrUMlymrX MalayalamrUTibtrXTibetanrUKalirXKayah LirUJpanrXJapaneserUPlrdrXPollard PhoneticrUKanarXKatakanarULydirXLydianrULepcr XLepchar!USundr"X Sundaneser#UYiiir$XYir%UJavar&XJavaneser'UOryar(XOriyar)ULaoor*XLaor+UUgarr,XUgariticr-UCyrlr.XCyrillicr/UVaiir0XVair1UArmnr2XArmenianr3UCyrsr4XOld Church Slavonic Cyrillicr5UKhmrr6XKhmerr7UArmir8XImperial Aramaicr9USylor:X Syloti Nagrir;UItalr<X Old Italicr=USgnwr>X SignWritingr?UXsuxr@XSumero-Akkadian CuneiformrAUThaarBXThaanarCUThairDXThairEUCprtrFXCypriotrGULinbrHXLinear BrIULinarJXLinear ArKUOsmarLXOsmanyarMUSaurrNX SaurashtrarOUHirarPXHiraganarQUHanirRXHanrSUEgydrTXEgyptian demoticrUUQaairVX InheritedrWUEgyhrXXEgyptian hieraticrYUCansrZX%Unified Canadian Aboriginal Syllabicsr[UEgypr\XEgyptian hieroglyphsr]UZmthr^XMathematical Notationr_UTfngr`XTifinaghraUShawrbXShavianrcUCirtrdXCirthreUGeorrfXGeorgianrgUTengrhXTengwarriUHrktrjXKatakana or HiraganarkUGeokrlXGeorgian KhutsurirmUTavtrnXTai VietroUOgamrpXOghamrqUDsrtrrXDeseretrsUGothrtXGothicruUHanorvXHanunoorwUBalirxXBalineseryUKorerzXKoreanr{UHangr|XHangulr}UCarir~XCarianrUAvstrXAvestanrUTagbrXTagbanwarUHansrXSimplified HanrUHantrXTraditional HanrURororX RongorongorUDevarX DevanagarirUIndsrXIndusrUBoporXBopomoforUMymrrXMyanmarrUTglgrXTagalogrUPermrX Old PermicrUBugirXBugineserUPhagrXPhags-parUBrairXBraillerUBrahrXBrahmirUBatkrXBatakrUMerorXMeroiticrULimbrXLimburUMteirX Meitei MayekrUPhlirXInscriptional PahlavirUTelurXTelugurUTamlrXTamilrUSararXSaratirUPhlprXPsalter PahlavirULatgrX Gaelic LatinrULatfrX Fraktur LatinrUKharrX KharoshthirUNkoorXN’KorUPhlvrX Book PahlavirULatnrXLatinrUMayarXMayan hieroglyphsrULanarXLannarUEthirXEthiopicrUKthirXKaithirUHmngrX Pahawh HmongrUBuhdrXBuhidrUCoptrXCopticrUPrtirXInscriptional ParthianrUGlagrX GlagoliticrURunrrXRunicrUOrkhrXOrkhonrUCakmrXChakmarUHungrX Old HungarianrUGrekrXGreekrUCherrXCherokeerUZyyyrXCommonrUSyrcrXSyriacrUBlisrX BlissymbolsrUBengrXBengalirUSyrerXEstrangelo SyriacrUSyrjrXWestern SyriacrUSyrnrXEastern SyriacrUKndarXKannadaruUvariantsr}r(UREVISEDrXRevised OrthographyrUBOONTrX BoontlingrUSCOUSErXScouserUAREVELArXEastern ArmenianrUSOLBArXStolvizza/Solbica dialectrULIPAWrXThe Lipovaz dialect of ResianrU1901rXTraditional German orthographyrUBAKU1926rXUnified Turkic Latin AlphabetrUHAKKArXHakkarUOSOJSrXOseacco/Osojane dialectrU1694ACADr XEarly Modern Frenchr UVALENCIAr X Valencianr UPOLYTONr X Polytonicr UNJIVAr XGniva/Njiva dialectr UFONIPAr X IPA Phoneticsr UTARASKr XTaraskievica orthographyr UGAULISHr XGaulishr UGUOYUr XMandarin or Standard Chineser U1606NICTr XLate Middle French to 1606r UBISKEr XSan Giorgio/Bila dialectr UPOSIXr XComputerr UFONUPAr X UPA Phoneticsr UXIANGr XXiang or Hunaneser UNEDISr XNatisone dialectr UAREVMDAr XWestern Armenianr U1994r XStandardized Resian orthographyr U1996r XGerman orthography of 1996r! UMONOTONr" X Monotonicr# USCOTLANDr$ XScottish Standard Englishr% ULOJBANr& XLojbanr' USAAHOr( XSahor) UROZAJr* XResianr+ uUnumber_symbolsr, }r- (Ugroupr. X,r/ UnativeZeroDigitr0 X0r1 U exponentialr2 jUperMiller3 X‰r4 Unanr5 XNaNr6 Udecimalr7 X.r8 U percentSignr9 hFUlistr: X;r; U patternDigitr< X#r= UplusSignr> X+r? Uinfinityr@ X∞rA U minusSignrB hXUgandan Shillingrx jXJordanian Dinarry UAORrz X%Angolan Kwanza Reajustado (1995-1999)r{ USURr| X Soviet Roubler} jX Aruban Florinr~ jX Saudi Riyalr UFIMr XFinnish Markkar jXHong Kong Dollarr jXSuriname Guilderr UTPEr X Timor Escudor UMGFr XMadagascar Francr UCHEr XWIR Euror jX Swiss Francr UGIPr XGibraltar Poundr jXBelarussian Rubler jX Albanian Lekr UXPDr X Palladiumr UUGSr XUgandan Shilling (1966-1987)r j XMauritania Ouguiyar UBOVr XBolivian Mvdolr UHRKr X Croatian Kunar j XDjibouti Francr UHRDr XCroatian Dinarr UPESr X Peruvian Solr UEQEr XEkweler jX Italian Lirar UXAFr XCFA Franc BEACr jX Brunei Dollarr UISKr XIcelandic Kronar UZALr XSouth African Rand (financial)r USRDr XSurinam Dollarr UNIOr XNicaraguan Cordoba Oror ULAKr X Laotian Kipr jXNicaraguan Cordobar j"XNepalese Rupeer UMZEr XMozambique Escudor jXUruguay Peso Uruguayor ULUCr XLuxembourg Convertible Francr jBXJamaican Dollarr UFRFr X French Francr UMAFr XMoroccan Francr UUYIr X"Uruguay Peso en Unidades Indexadasr jXOld Mozambique Meticalr jXMozambique Meticalr jXPhilippine Pesor j XSouth African Randr URHDr XRhodesian Dollarr UGWPr XGuinea-Bissau Pesor ULUFr XLuxembourg Francr UBELr XBelgian Franc (financial)r UBECr XBelgian Franc (convertible)r j$XNigerian Nairar UYUNr XYugoslavian Convertible Dinarr j&X Belgian Francr UPLZr XPolish Zloty (1950-1995)r j(XCosta Rican Colonr jHXOld Turkish Lirar UDEMr X Deutsche Markr UEEKr XEstonian Kroonr j,X Malawi Kwachar jXTrinidad and Tobago Dollarr j.XSri Lanka Rupeer j0X Slovak Korunar jXCape Verde Escudor j2XPakistan Rupeer j4XHungarian Forintr UROLr XOld Romanian Leur UXEUr XEuropean Currency Unitr j6XBermudan Dollarr jX Oman Rialr j8X Lesotho Lotir ULSMr XMalotir j:XMongolian Tugrikr j<X Armenian Dramr UYUDr XYugoslavian Hard Dinarr UBUKr X Burmese Kyatr jX Syrian Poundr jpX Qatari Rialr UXDRr XSpecial Drawing Rightsr UNLGr XNetherlands Guilderr UGEKr XGeorgian Kupon Laritr UMTPr X Maltese Poundr j*XBritish Pound Sterlingr jDX Georgian Larir USHPr XSaint Helena Poundr jFXAfghanir jXSolomon Islands Dollarr UCSKr XCzechoslovak Hard Korunar UKPWr XNorth Korean Wonr UXREr X RINET Fundsr UCSDr XOld Serbian Dinarr UAFAr XAfghani (1927-2002)r jX Thai Bahtr UBYBr X!Belarussian New Ruble (1994-1999)r jJXBangladeshi Takar UGRDr X Greek Drachmar jLX Yemeni Rialr UDDMr XEast German Ostmarkr jXSwaziland Lilangenir UHTGr XHaitian Gourder UTRYr X Turkish Lirar UMGAr XMadagascar Ariaryr jNXNetherlands Antillan Guilderr ULRDr XLiberian Dollarr URWFr X Rwandan Francr jRXNorwegian Kroner UMXVr X!Mexican Unidad de Inversion (UDI)r jXKenyan Shillingr UMOPr X Macao Patacar jTX Indian Rupeer jVX Mexican Pesor! jXXCzech Republic Korunar" UTJSr# XTajikistan Somonir$ UTJRr% XTajikistan Rubler& jZXBhutan Ngultrumr' UYDDr( X Yemeni Dinarr) UGWEr* XPortuguese Guinea Escudor+ j\XColombian Pesor, UCOUr- XUnidad de Valor Realr. jX Maltese Lirar/ UMURr0 XMauritius Rupeer1 j^XIndonesian Rupiahr2 j`XHonduras Lempirar3 jbX CFP Francr4 jdX Fiji Dollarr5 jfXEthiopian Birrr6 UPENr7 XPeruvian Sol Nuevor8 jhX Belize Dollarr9 UCHWr: X WIR Francr; UATSr< XAustrian Schillingr= UILPr> X Israeli Poundr? UZRNr@ XZairean New ZairerA jlXDominican PesorB ULULrC XLuxembourg Financial FrancrD UTMMrE XTurkmenistan ManatrF jnXTaiwan New DollarrG UMDLrH X Moldovan LeurI UXPTrJ XPlatinumrK UECVrL X'Ecuador Unidad de Valor Constante (UVC)rM UECSrN X Ecuador SucrerO UBSDrP XBahamian DollarrQ jrX Swedish KronarR jXTonga PaʻangarS UPEIrT X Peruvian IntirU UZMKrV XZambian KwacharW UMVRrX XMaldive Islands RufiyaarY UXTSrZ XTesting Currency Coder[ jtXAustralian Dollarr\ UADPr] XAndorran Pesetar^ UCUPr_ X Cuban Pesor` jvX Irish Poundra UCLFrb XChilean Unidades de Fomentorc jxXBarbados Dollarrd jzX Comoro Francre j|XSouth Korean Wonrf UGMDrg X Gambia Dalasirh j~XVenezuelan Bolivar Fuerteri jXGuatemala Quetzalrj jXVenezuelan Bolivarrk UXOFrl XCFA Franc BCEAOrm USITrn XSlovenia Tolarro USDPrp XOld Sudanese Poundrq jX Chilean Pesorr UEURrs XEurort UCDFru XCongolese Franc Congolaisrv jPXEast Caribbean Dollarrw jXKazakhstan Tengerx URUBry X Russian Rublerz UXFUr{ XFrench UIC-Francr| UXAGr} XSilverr~ UBRRr XBrazilian Cruzeiror UBRNr XBrazilian Cruzado Novor UBRLr XBrazilian Realr UMMKr X Myanmar Kyatr UUYPr XUruguay Peso (1975-1993)r URURr XRussian Ruble (1991-1998)r jX Polish Zlotyr UBREr XBrazilian Cruzeiro (1990-1993)r jXParaguay Guaranir UBRCr XBrazilian Cruzador UBRBr X#Brazilian Cruzeiro Novo (1967-1986)r USVCr XEl Salvador Colonr UAEDr XUnited Arab Emirates Dirhamr UGNSr X Guinea Sylir jXMacedonian Denarr UAZMr XAzerbaijanian Manat (1993-2006)r jXAzerbaijanian Manatr UUSNr XUS Dollar (Next day)r UGQEr X!Equatorial Guinea Ekwele Guineanar jX Vanuatu Vatur UBADr XBosnia-Herzegovina Dinarr jX Guinea Francr UMXPr XMexican Silver Peso (1861-1992)r jX Iraqi Dinarr UERNr XEritrean Nakfar jX#Bosnia-Herzegovina Convertible Markr jXSeychelles Rupeer jXCanadian Dollarr USDDr XOld Sudanese Dinarr jX Cyprus Poundr UMADr XMoroccan Dirhamr jX Kuwaiti Dinarr jX Burundi Francr ULTTr XLithuanian Talonasr UPGKr XPapua New Guinea Kinar ULTLr XLithuanian Litar jXSingapore Dollarr UUZSr XUzbekistan Sumr jXSao Tome and Principe Dobrar UXFOr XFrench Gold Francr UMLFr X Mali Francr jXSpanish Pesetar jX Iranian Rialr UZRZr X Zairean Zairer jXChinese Yuan Renminbir USLLr XSierra Leone Leoner UTNDr XTunisian Dinarr jX Guyana Dollarr UESBr X$Spanish Peseta (convertible account)r UESAr XSpanish Peseta (A account)r jXNew Zealand Dollarr UFKPr XFalkland Islands Poundr ULVLr X Latvian Latsr UUSSr XUS Dollar (Same day)r jX US Dollarr UARPr XArgentine Peso (1983-1985)r jX Kyrgystan Somr jXArgentine Pesor jjXNew Israeli Sheqelr URONr X Romanian Leur URSDr X Serbian Dinarr jXBahraini Dinarr jX Japanese Yenr UARAr XArgentine Australr USDGr XSudanese Poundr UPTEr XPortuguese Escudor UXAUr XGoldr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXJr KXFr Kj9KXAr Kj9Kj Kj Kj K XSr K XOr K XNr K XDr usUformatr }r (Uwider }r (KXJanuaryr KXFebruaryr KXMarchr KXAprilr KXMayr KXJuner KXJulyr KXAugustr K X Septemberr K XOctoberr K XNovemberr K XDecemberr uU abbreviatedr }r (KXJanr KXFebr KXMarr KXAprr KXMayr KXJunr KXJulr KXAugr K XSepr K XOctr K XNovr K XDecr uuuUcurrency_formatsr }r Nh,)r }r (h/Nh1Kh2KKr h4h5X)r r h7KKr h9X ¤#,##0.00r h;X¤r X(¤r r! h>Nh?KKr" ubsUdaysr# }r$ (U stand-aloner% }r& Unarrowr' }r( (Kj9KjKXWr) KjKj Kj Kj usUformatr* }r+ (Uwider, }r- (KXMondayr. KXTuesdayr/ KX Wednesdayr0 KXThursdayr1 KXFridayr2 KXSaturdayr3 KXSundayr4 uU abbreviatedr5 }r6 (KXMonr7 KXTuer8 KXWedr9 KXThur: KXFrir; KXSatr< KXSunr= uuuU meta_zonesr> }r? (U Turkmenistanr@ }rA (UcommonrB j}rC (jXTurkmenistan Summer TimerD UstandardrE XTurkmenistan TimerF uuU KuybyshevrG }rH (jB j}rI (jXKuybyshev Summer TimerJ jE XKuybyshev TimerK uuURotherarL }rM (jB j}rN jE X Rothera TimerO suUArabianrP }rQ (j}rR (UgenericrS X AT (Arabian)rT jX ADT (Arabian)rU jE X AST (Arabian)rV ujB j}rW (jS X Arabian TimerX jXArabian Daylight TimerY jE XArabian Standard TimerZ uuUAustralia_Easternr[ }r\ (j}r] jS XAETr^ sjB j}r_ (jS XEastern Australia Timer` jX Australian Eastern Daylight Timera jE X Australian Eastern Standard Timerb uuU Argentinarc }rd (jB j}re (jXArgentina Summer Timerf jE XArgentina Timerg uuUBoliviarh }ri (jB j}rj jE X Bolivia Timerk suU Alaska_Hawaiirl }rm (j}rn jS XAHTro sjB j}rp (jS XAlaska-Hawaii Timerq jXAlaska-Hawaii Daylight Timerr jE XAlaska-Hawaii Standard Timers uuU Cape_Verdert }ru (jB j}rv (jXCape Verde Summer Timerw jE XCape Verde Timerx uuUAzoresry }rz (jB j}r{ (jXAzores Summer Timer| jE X Azores Timer} uuUPierre_Miquelonr~ }r (j}r jS XPMTr sjB j}r (jS XPierre and Miquelon Timer jX!Pierre and Miquelon Daylight Timer jE X!Pierre and Miquelon Standard Timer uuUEurope_Centralr }r (jB j}r (jXCentral European Summer Timer jE XCentral European Timer uuUTrukr }r (jB j}r jE X Truk Timer suU Aktyubinskr }r (jB j}r (jXAktyubinsk Summer Timer jE XAktyubinsk Timer uuUBeringr }r (j}r jS X BT (Bering)r sjB j}r (jS X Bering Timer jXBering Daylight Timer jE XBering Standard Timer uuU Qyzylordar }r (jB j}r (jXQyzylorda Summer Timer jE XQyzylorda Timer uuUKazakhstan_Easternr }r (jB j}r (jS XEast Kazakhstan Timer jE XEast Kazakhstan Standard Timer uuUFrunzer }r (jB j}r (jXFrunze Summer Timer jE X Frunze Timer uuU Dutch_Guianar }r (jB j}r jE XDutch Guiana Timer suUYerevanr }r (jB j}r (jXYerevan Summer Timer jE X Yerevan Timer uuU Kamchatkar }r (jB j}r (jX$Petropavlovsk-Kamchatski Summer Timer jE XPetropavlovsk-Kamchatski Timer uuUKashgarr }r (jB j}r jE X Kashgar Timer suUMaldivesr }r (jB j}r jE X Maldives Timer suUNorfolkr }r (jB j}r jE XNorfolk Islands Timer suU East_Timorr }r (jB j}r jE XEast Timor Timer suUAfrica_Easternr }r (jB j}r jE XEast Africa Timer suU Ashkhabadr }r (jB j}r (jXAshkhabad Summer Timer jE XAshkhabad Timer uuUAlaskar }r (j}r jS XAKTr sjB j}r (jS X Alaska Timer jXAlaska Daylight Timer jE XAlaska Standard Timer uuUAmerica_Easternr }r (j}r jS XETr sjB j}r (jS X Eastern Timer jXEastern Daylight Timer jE XEastern Standard Timer uuU Yekaterinburgr }r (jB j}r (jXYekaterinburg Summer Timer jE XYekaterinburg Timer uuUSolomonr }r (jB j}r jE XSolomon Islands Timer suU Krasnoyarskr }r (jB j}r (jXKrasnoyarsk Summer Timer jE XKrasnoyarsk Timer uuUAmerica_Centralr }r (j}r jS XCTr sjB j}r (jS X Central Timer jXCentral Daylight Timer jE XCentral Standard Timer uuUMawsonr }r (jB j}r jE X Mawson Timer suUPakistanr }r (jB j}r (jXPakistan Summer Timer jE X Pakistan Timer uuUSamoar }r (jB j}r jE XSamoa Standard Timer suUMacaur }r (jB j}r (jXMacau Summer Timer jE X Macau Timer uuUChamorror }r (j}r jS XChTr sjB j}r (jS X Chamorro Timer jE XChamorro Standard Timer uuUGuamr }r (j}r jE X GST (Guam)r sjB j}r jE XGuam Standard Timer suUIndiar }r (jB j}r jE XIndia Standard Timer suU Azerbaijanr }r (jB j}r (jXAzerbaijan Summer Timer jE XAzerbaijan Timer uuU Marquesasr }r! (jB j}r" jE XMarquesas Timer# suU Tajikistanr$ }r% (jB j}r& jE XTajikistan Timer' suUPitcairnr( }r) (jB j}r* jE X Pitcairn Timer+ suUTurkeyr, }r- (jB j}r. (jXTurkey Summer Timer/ jE X Turkey Timer0 uuU Afghanistanr1 }r2 (jB j}r3 jE XAfghanistan Timer4 suU Choibalsanr5 }r6 (jB j}r7 (jXChoibalsan Summer Timer8 jE XChoibalsan Timer9 uuU Vladivostokr: }r; (jB j}r< (jXVladivostok Summer Timer= jE XVladivostok Timer> uuU Shevchenkor? }r@ (jB j}rA (jXShevchenko Summer TimerB jE XShevchenko TimerC uuU BangladeshrD }rE (jB j}rF jE XBangladesh TimerG suUGulfrH }rI (j}rJ jS XGTrK sjB j}rL (jS X Gulf TimerM jE XGulf Standard TimerN uuUDaccarO }rP (jB j}rQ jE X Dacca TimerR suUMongoliarS }rT (jB j}rU (jXUlan Bator Summer TimerV jE XUlan Bator TimerW uuU SamarkandrX }rY (jB j}rZ (jXSamarkand Summer Timer[ jE XSamarkand Timer\ uuUWaker] }r^ (jB j}r_ jE XWake Island Timer` suUPerura }rb (jB j}rc (jXPeru Summer Timerd jE X Peru Timere uuUVanuaturf }rg (jB j}rh (jXVanuatu Summer Timeri jE X Vanuatu Timerj uuUIndonesia_Centralrk }rl (jB j}rm jE XCentral Indonesia Timern suUNaururo }rp (jB j}rq jE X Nauru Timerr suUFalklandrs }rt (jB j}ru (jXFalkland Islands Summer Timerv jE XFalkland Islands Timerw uuUKorearx }ry (j}rz jS XKTr{ sjB j}r| (jS X Korean Timer} jXKorean Daylight Timer~ jE XKorean Standard Timer uuUCubar }r (j}r (jX CDT (Cuba)r jE X CST (Cuba)r ujB j}r (jS X Cuba Timer jXCuba Daylight Timer jE XCuba Standard Timer uuUIrkutskr }r (jB j}r (jXIrkutsk Summer Timer jE X Irkutsk Timer uuUArgentina_Westernr }r (jB j}r jE XWestern Argentina Timer suUAmazonr }r (jB j}r (jXAmazon Summer Timer jE X Amazon Timer uuUChinar }r (j}r (jS X CT (China)r jX CDT (China)r jE X CST (China)r ujB j}r (jS X China Timer jXChina Daylight Timer jE XChina Standard Timer uuULong_Shur }r (jB j}r jE X Long-Shu Timer suUArmeniar }r (j}r (jXAMST (Armenia)r jE X AMT (Armenia)r ujB j}r (jXArmenia Summer Timer jE X Armenia Timer uuUCookr }r (jB j}r (jXCook Islands Half Summer Timer jE XCook Islands Timer uuUChathamr }r (jB j}r (jXChatham Daylight Timer jE XChatham Standard Timer uuUGreenland_Westernr }r (jB j}r (jXWest Greenland Summer Timer jE XWest Greenland Timer uuUKarachir }r (jB j}r jE X Karachi Timer suUTongar }r (jB j}r (jXTonga Summer Timer jE X Tonga Timer uuUSakhalinr }r (jB j}r (jXSakhalin Summer Timer jE X Sakhalin Timer uuUBrasiliar }r (jB j}r (jXBrasilia Summer Timer jE X Brasilia Timer uuUSyowar }r (jB j}r jE X Syowa Timer suU French_Guianar }r (jB j}r jE XFrench Guiana Timer suUFrench_Southernr }r (jB j}r jE X"French Southern and Antarctic Timer suU Mauritiusr }r (jB j}r (jXMauritius Summer Timer jE XMauritius Timer uuUAfrica_Southernr }r (j}r jS XSATr sjB j}r (jS XSouth Africa Timer jE XSouth Africa Standard Timer uuUGambierr }r (jB j}r jE X Gambier Timer suUDavisr }r (jB j}r jE X Davis Timer suU Newfoundlandr }r (j}r jS XNTr sjB j}r (jS XNewfoundland Timer jXNewfoundland Daylight Timer jE XNewfoundland Standard Timer uuUCocosr }r (jB j}r jE XCocos Islands Timer suU Kyrgystanr }r (jB j}r jE XKyrgystan Timer suUTokelaur }r (jB j}r jE X Tokelau Timer suUAustralia_Westernr }r (j}r jS XAWTr sjB j}r (jS XWestern Australia Timer jX Australian Western Daylight Timer jE X Australian Western Standard Timer uuUBakur }r (jB j}r (jXBaku Summer Timer jE X Baku Timer uuUAfrica_Centralr }r (jB j}r jE XCentral Africa Timer suU Line_Islandsr }r (jB j}r jE XLine Islands Timer suU Novosibirskr }r (jB j}r (jXNovosibirsk Summer Timer jE XNovosibirsk Timer uuUJapanr }r (j}r jS XJTr sjB j}r! (jS X Japan Timer" jXJapan Daylight Timer# jE XJapan Standard Timer$ uuU Sverdlovskr% }r& (jB j}r' (jXSverdlovsk Summer Timer( jE XSverdlovsk Timer) uuU New_Caledoniar* }r+ (jB j}r, (jXNew Caledonia Summer Timer- jE XNew Caledonia Timer. uuU Kwajaleinr/ }r0 (jB j}r1 jE XKwajalein Timer2 suUAqtober3 }r4 (jB j}r5 (jXAqtobe Summer Timer6 jE X Aqtobe Timer7 uuUGilbert_Islandsr8 }r9 (jB j}r: jE XGilbert Islands Timer; suUAustralia_CentralWesternr< }r= (j}r> jS XACWTr? sjB j}r@ (jS XAustralian Central Western TimerA jX(Australian Central Western Daylight TimerB jE X(Australian Central Western Standard TimerC uuU IndochinarD }rE (jB j}rF jE XIndochina TimerG suUPapua_New_GuinearH }rI (jB j}rJ jE XPapua New Guinea TimerK suUHovdrL }rM (jB j}rN (jXHovd Summer TimerO jE X Hovd TimerP uuU South_GeorgiarQ }rR (j}rS jE XGST (S. Georgia)rT sjB j}rU jE XSouth Georgia TimerV suUEcuadorrW }rX (jB j}rY jE X Ecuador TimerZ suUMalayar[ }r\ (jB j}r] jE X Malaya Timer^ suUBruneir_ }r` (jB j}ra jE XBrunei Darussalam Timerb suUIranrc }rd (jB j}re (jXIran Daylight Timerf jE XIran Standard Timerg uuUAqtaurh }ri (jB j}rj (jXAqtau Summer Timerk jE X Aqtau Timerl uuU Indian_Oceanrm }rn (jB j}ro jE XIndian Ocean Timerp suUTuvalurq }rr (jB j}rs jE X Tuvalu Timert suUAmerica_Mountainru }rv (j}rw jS XMTrx sjB j}ry (jS X Mountain Timerz jXMountain Daylight Timer{ jE XMountain Standard Timer| uuUHawaii_Aleutianr} }r~ (jB j}r jE XHawaii-Aleutian Standard Timer suUChangbair }r (jB j}r jE X Changbai Timer suUChiler }r (jB j}r (jXChile Summer Timer jE X Chile Timer uuUWallisr }r (jB j}r jE XWallis and Futuna Timer suUKosraer }r (jB j}r jE X Kosrae Timer suUDushanber }r (jB j}r (jXDushanbe Summer Timer jE X Dushanbe Timer uuUGeorgiar }r (jB j}r (jXGeorgia Summer Timer jE X Georgia Timer uuUAnadyrr }r (jB j}r (jXAnadyr Summer Timer jE X Anadyr Timer uuU Philippinesr }r (jB j}r (jXPhilippine Summer Timer jE XPhilippine Timer uuUYakutskr }r (jB j}r (jXYakutsk Summer Timer jE X Yakutsk Timer uuUIndonesia_Westernr }r (jB j}r jE XWestern Indonesia Timer suUGreenland_Easternr }r (jB j}r (jXEast Greenland Summer Timer jE XEast Greenland Timer uuUGMTr }r (jB j}r jE XGreenwich Mean Timer suUMarshall_Islandsr }r (jB j}r jE XMarshall Islands Timer suU Seychellesr }r (jB j}r jE XSeychelles Timer suUUruguayr }r (jB j}r (jXUruguay Summer Timer jE X Uruguay Timer uuUVostokr }r (jB j}r jE X Vostok Timer suU Uzbekistanr }r (jB j}r (jXUzbekistan Summer Timer jE XUzbekistan Timer uuUColombiar }r (jB j}r (jXColombia Summer Timer jE X Colombia Timer uuUReunionr }r (jB j}r jE X Reunion Timer suU Volgogradr }r (jB j}r (jXVolgograd Summer Timer jE XVolgograd Timer uuU Kizilordar }r (jB j}r (jXKizilorda Summer Timer jE XKizilorda Timer uuUFijir }r (jB j}r (jXFiji Summer Timer jE X Fiji Timer uuUAmerica_Pacificr }r (j}r jS XPTr sjB j}r (jS X Pacific Timer jXPacific Daylight Timer jE XPacific Standard Timer uuUKazakhstan_Westernr }r (jB j}r (jS XWest Kazakhstan Timer jE XWest Kazakhstan Standard Timer uuUPalaur }r (jB j}r jE X Palau Timer suUEurope_Easternr }r (jB j}r (jXEastern European Summer Timer jE XEastern European Timer uuUBhutanr }r (jB j}r jE X Bhutan Timer suUBorneor}r(jB j}r(jXBorneo Summer TimerjE X Borneo TimeruuUNepalr}r(jB j}rjE X Nepal TimersuU Galapagosr }r (jB j}r jE XGalapagos Timer suU Lord_Hower }r(j}rjS XLHTrsjB j}r(jS XLord Howe TimerjXLord Howe Daylight TimerjE XLord Howe Standard TimeruuUPhoenix_Islandsr}r(jB j}rjE XPhoenix Islands TimersuUSurinamer}r(jB j}rjE X Suriname TimersuUAcrer}r(jB j}r(jXAcre Summer Timer jE X Acre Timer!uuUEasterr"}r#(jB j}r$(jXEaster Island Summer Timer%jE XEaster Island Timer&uuU Christmasr'}r((jB j}r)jE XChristmas Island Timer*suUIsraelr+}r,(j}r-jE X IST (Israel)r.sjB j}r/(jS X Israel Timer0jXIsrael Daylight Timer1jE XIsrael Standard Timer2uuUAfrica_Westernr3}r4(jB j}r5(jXWest Africa Summer Timer6jE XWest Africa Timer7uuUTashkentr8}r9(jB j}r:(jXTashkent Summer Timer;jE X Tashkent Timer<uuUMalaysiar=}r>(jB j}r?jE X Malaysia Timer@suUNoronharA}rB(jB j}rC(jXFernando de Noronha Summer TimerDjE XFernando de Noronha TimerEuuU VenezuelarF}rG(jB j}rHjE XVenezuela TimerIsuUPonaperJ}rK(jB j}rLjE X Ponape TimerMsuUIndonesia_EasternrN}rO(jB j}rPjE XEastern Indonesia TimerQsuUOmskrR}rS(jB j}rT(jXOmsk Summer TimerUjE X Omsk TimerVuuUAustralia_CentralrW}rX(j}rYjS XACTrZsjB j}r[(jS XCentral Australia Timer\jX Australian Central Daylight Timer]jE X Australian Central Standard Timer^uuUAtlanticr_}r`(j}rajS XATrbsjB j}rc(jS X Atlantic TimerdjXAtlantic Daylight TimerejE XAtlantic Standard TimerfuuU North_Marianarg}rh(jB j}rijE XNorth Mariana Islands TimerjsuULankark}rl(jB j}rmjE X Lanka TimernsuUDumontDUrvillero}rp(jB j}rqjE XDumont-d'Urville TimerrsuUEurope_Westernrs}rt(jB j}ru(jXWestern European Summer TimervjE XWestern European TimerwuuU New_Zealandrx}ry(j}rzjS XNZTr{sjB j}r|(jS XNew Zealand Timer}jXNew Zealand Daylight Timer~jE XNew Zealand Standard TimeruuUUrumqir}r(jB j}rjE X Urumqi TimersuU Hong_Kongr}r(jB j}r(jXHong Kong Summer TimerjE XHong Kong TimeruuUGuyanar}r(jB j}rjE X Guyana TimersuUMagadanr}r(jB j}r(jXMagadan Summer TimerjE X Magadan TimeruuUAlmatyr}r(jB j}r(jXAlmaty Summer TimerjE X Almaty TimeruuUTbilisir}r(jB j}r(jXTbilisi Summer TimerjE X Tbilisi TimeruuUMyanmarr}r(jB j}rjE X Myanmar TimersuU Singaporer}r(jB j}rjE XSingapore Standard TimersuUSamarar}r(jB j}r(jXSamara Summer TimerjE X Samara TimeruuUGreenland_Centralr}r(jB j}r(jXCentral Greenland Summer TimerjE XCentral Greenland TimeruuUUralskr}r(jB j}r(jXUral'sk Summer TimerjE X Ural'sk TimeruuUTahitir}r(jB j}rjE X Tahiti TimersuUParaguayr}r(jB j}r(jXParaguay Summer TimerjE X Paraguay TimeruuUYukonr}r(j}rjS XYTrsjB j}r(jS X Yukon TimerjXYukon Daylight TimerjE XYukon Standard TimeruuUMoscowr}r(jB j}r(jS X Moscow TimerjXMoscow Summer TimerjE XMoscow Standard TimeruuUNiuer}r(jB j}rjE X Niue TimersuuUerasr}r(Uwider}r(KX Before ChristrKX Anno DominiruU abbreviatedr}r(KXBCrKXADruUnarrowr}r(KXBrKj uuu.PK[|8#8#&site-packages/babel/localedata/kok.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX म.पू.qUpmqX म.नं.quUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X h:mm:ss aqAUformatqBX%(h)s:%(mm)s:%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X h:mm:ss a vqGhBX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X h:mm:ss a zqLhBX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xh:mm aqQhBX%(h)s:%(mm)s %(a)sqRubuU languagesqS}qT(UguqUXगुजरातीqVUgdqWX(स्काटस् गेलिक्qXUgaqYX ऐरिषqZUgnq[Xगौरानीq\Uglq]Xगेलीशियनq^Ulaq_Xलाटिनq`UlnqaXलिंगालाqbUloqcXलाओतियन्qdUttqeX तटारqfUtrqgXतुर्किषqhUtsqiXत्सोगाqjUlvqkX6लाट्वियन् (लेट्टिष्)qlUtoqmXतोंगाqnUltqoXलिथुआनियन्qpUtkqqXतुर्कमनqrUthqsX थाईqtUtiquXतिग्रिन्याqvUtgqwX तजिकqxUteqyXतेलुगूqzUtaq{X तमिळq|Uyiq}Xइद्दिष्q~UyoqXयूरुबाqUdeqXजर्मनqUdaqXडानिषqUdzqXभूटानीqUstqXसेसोथोqUquqXक्वेच्वाqUelqXग्रीक्qUeoqXइस्परान्टोqUenqXआंग्लqUzhqXचीनीस्qUzaqXझ्हुन्गqUukqX!युक्रेनियन्qUeuqXबास्कqUetqXइस्टोनियन्qUesqXस्पानिषqUruqXरष्यन्qUrwqX*किन्यार्वान्डाqUrmqX%रहटो-रोमान्स्qUrnqXकिरुन्दीqUroqXरोमानियन्qUbnqXबंगालीqUbeqX!बैलोरुसियन्qUbgqXबल्गेरियनqUbaqXबष्किरqUwoqXउलोफ़qUjvqXजावनीस्qUboqXतिबेतियनqUbhqXबीहारीqUbiqXबिसलमाqUbrqXब्रेटनqUjaqXजापनीस्qUomqXओरोमो (अफान)qUocqXओसिटान्qUtwqX त्विqUorqXओरियाqUxhqXझ़ौसाqUcoqXकोर्शियनqUcaqXकटलानqUcyqXवेळ्ष्qUcsqXज़ेक्qUpsqX'पाष्टो (पुष्टो)qUkokqXकोंकणीqUptqX!पोर्चुगीज़्qUtlqXतगालोगqUpaqXपंजाबीqUviqX!वियत्नामीज़qUplqXपोलिषqUhyqXआर्मीनियन्qUhrqX!क्रोयेषियन्qUiuqXइन्युकट्टqUhuqXहंगेरियन्qUhiqXहिन्दीqUhaqX हौसाqUheqXहेब्रुqUmgqXमलागसीqUuzqXउज़बेकqUmlqXमळियाळमqUmoqX!मोल्डावियन्qUmnqXमंगोलियन्qUmiqXमाओरीqUikqXइनूपेयाक्qUmkqXमसीडोनियन्qUurqXउर्दूqUmtqXमालतीस्qUmsqX मलयrUmrrXमराठीrUugrX उधूरrUmyrXबर्मीज़्rUaarX अफारrUabr Xअबखेज़ियनr Ussr Xसिस्वातीr Uafr Xअफ्रिकान्सrUtnrXसेत्स्वानाrUswrXस्वाहिलीrUisrX!आईस्लान्डिकrUamrXअमहारिक्rUitrXइटालियनrUsvrXस्वीदीषrUiarX$इन्टरलिंग्वाrUasrXअसामीrUarrXअरेबिक्r Usur!Xसुंदनीसr"Uzur#X जुलूr$Uayr%X ऐमराr&Uazr'Xअज़रबैजानीr(Uier)Xइन्टरलिंग्r*Uidr+X!इन्डोनेषियनr,Uskr-Xस्लोवाकr.Unlr/X डच्r0Unor1Xनोर्वेजियनr2Unar3X नौरोr4Uner5Xनेपाळीr6Uvor7Xओलापुकr8Ufrr9Xफ्रेन्चr:Usmr;X समोनr<Ufyr=Xफ्रिशियन्r>Ufar?Xपर्षियन्r@UfirAXफिन्निष्rBUfjrCX फिजीrDUsarEXसंस्कृतrFUforGXफेरोस्rHUkarIXजार्जियन्rJUkkrKXकज़ख्rLUsrrMXसेर्बियन्rNUsqrOXआल्बेनियन्rPUkorQXकोरियन्rRUknrSXकन्नडाrTUkmrUXकंबोडियनrVUklrWX$ग्रीनलान्डिकrXUksrYXकश्मीरीrZUsir[Xसिन्हलीस्r\Ushr]X4सेर्बो-क्रोयेषियन्r^Usor_Xसोमाळीr`UsnraX शोनाrbUkurcXकुर्दिषrdUslreX!स्लोवेनियन्rfUkyrgXकिर्गिज़rhUsgriXसांग्रोrjUsdrkXसिंधीrluU territoriesrm}rnUINroX भारतrpsUdecimal_formatsrq}rrNh )rs}rt(h#Nh$Kh%KKruh'h/h/rvh*KKrwh,X #,##,##0.###rxh.h/h0ryh2Nh3KKrzubsU date_formatsr{}r|(Umediumr}h>)r~}r(h,X dd-MM-yyyyrhBX%(dd)s-%(MM)s-%(yyyy)srubUfullrh>)r}r(h,XEEEE d MMMM yyyyrhBX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srubUlongrh>)r}r(h,X d MMMM yyyyrhBX%(d)s %(MMMM)s %(yyyy)srubUshortrh>)r}r(h,Xd-M-yyrhBX%(d)s-%(M)s-%(yy)srubuUcurrency_symbolsr}rUINRrXरुrsU time_zonesr}rUscriptsr}rUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}rUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KXजानेवारीrKXफेब्रुवारीrKXमार्चrKXएप्रिलrKXमेrKX जूनrKX जुलैrKXओगस्टrK Xसेप्टेंबरrK Xओक्टोबरrK Xनोव्हेंबरrK XडिसेंबरruU abbreviatedr}r(KXजानेवारीrKXफेबृवारीrKXमार्चrKXएप्रिलrKXमेrKX जूनrKX जुलैrKXओगस्टrK Xसेप्टेंबरrK Xओक्टोबरrK Xनोव्हेंबरrK XडिसेंबरruuuUcurrency_formatsr}rNh )r}r(h#Nh$Kh%KKrh'h/h/rh*KKrh,X¤ #,##,##0.00rh.X¤ rX-¤ rrh2Nh3KKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r(KXसोमवारrKXमंगळारrKXबुधवारrKXगुरुवारrKXशुक्रवारrKXशनिवारrKXआदित्यवारruU abbreviatedr}r(KX सोमrKX मंगळrKX बुधrKX गुरुrKXशुक्रrKX शनिrKX रविruuuU meta_zonesr}rUIndiar}r(UcommonrUlongr}rUstandardrXभारतीय समयrsusUerasr}rU abbreviatedr}r(KX$क्रिस्तपूर्वrKXक्रिस्तशखाrusu.PK[j'0'0&site-packages/babel/localedata/byn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXፋዱስ ጃብqUpmqXፋዱስ ደምቢquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,X h:mm:ss aq-Uformatq.X%(h)s:%(mm)s:%(ss)s %(a)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X h:mm:ss a zq8h.X%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq9ubUshortq:h))q;}q<(h,Xh:mm aq=h.X%(h)s:%(mm)s %(a)sq>ubuU languagesq?}q@(UguqAXጉጃርቲኛqBUgdqCXእስኮትስ ጌልክኛqDUgaqEX አይሪሽqFUgnqGX ጓራኒኛqHUglqIX ጋለጋኛqJUlaqKX ላቲንኛqLUlnqMXሊንጋላኛqNUloqOX ላውስኛqPUttqQX ታታርኛqRUtrqSX ቱርክኛqTUtsqUX ጾንጋኛqVUlvqWXላትቪያንqXUtoqYX ቶንጋqZUltq[Xሊቱአኒያንq\Utkq]Xቱርክመንኛq^Uthq_X ታይኛq`UtiqaX ትግርኛqbUtgqcX ታጂኪኛqdUteqeX ተሉጉኛqfUtaqgX ታሚልኛqhUyiqiXይዲሻዊኛqjUyoqkXዮሩባዊኛqlUgezqmX ግዕዝኛqnUdeqoX ጀርመንqpUdaqqX ዴኒሽqrUdzqsXድዞንግኻኛqtUstquX ሶዞኛqvUquqwX ኵቿኛqxUelqyX ግሪክኛqzUeoq{Xኤስፐራንቶq|Uenq}Xእንግሊዝኛq~UzhqX ቻይንኛqUzaqXዡዋንግኛqUukqXዩክረኒኛqUeuqX ባስክኛqUetqXኤስቶኒአንqUesqX ስፓኒሽqUruqX ራሽኛqUrwqXኪንያርዋንድኛqUrmqX ሮማንስqUrnqX ሩንዲኛqUroqXሮማኒያንqUbnqXበንጋሊኛqUbeqXቤላራሻኛqUbgqXቡልጋሪኛqUbaqXባስኪርኛqUpsqX ፑሽቶኛqUwoqX ዎሎፍኛqUjvqX ጃቫንኛqUboqXትበትንኛqUbhqX ቢሃሪqUbiqXቢስላምኛqUbrqXብሬቶንኛqUjaqX ጃፓንኛqUomqX ኦሮምኛqUocqXኦኪታንኛqUtwqX ትዊኛqUorqX ኦሪያኛqUxhqX ዞሳኛqUcoqXኮርሲካኛqUcaqXካታላንኛqUcyqX ወልሽqUcsqX ቼክኛqUbynqX ብሊንqUptqXፖርቱጋሊኛqUtlqXታጋሎገኛqUpaqXፓንጃቢኛqUviqXቪትናምኛqUplqX ፖሊሽqUhyqXአርመናዊqUhrqXክሮሽያንኛqUiuqXእኑክቲቱትኛqUhuqXሀንጋሪኛqUhiqX ሐንድኛqUhaqX ሃውሳኛqUheqXዕብራስጥqUmgqXማላጋስኛqUuzqXኡዝበክኛqUmlqXማላያላምኛqUmoqXሞልዳቫዊናqUmnqXሞንጎላዊኛqUmiqX ማዮሪኛqUikqXእኑፒያቅኛqUmkqXማከዶኒኛqUurqX ኡርዱኛqUmtqXማልቲስኛqUmsqX ማላይኛqUmrqX ማራዚኛqUugqXኡዊግሁርኛqUmyqX ቡርማኛqUaaqX አፋርኛqUabqXአብሐዚኛqUssqX ስዋቲኛqUafqXአፍሪቃንስኛqUtnqXጽዋናዊኛqUswqXስዋሂሊኛrUisrXአይስላንድኛrUamrX አማርኛrUitrXጣሊያንኛrUsvrXስዊድንኛrUiar Xኢንቴርሊንጓr Uasr Xአሳሜዛዊr Uarr X ዐርቢኛrUsurX ሱዳንኛrUzurX ዙሉኛrUayrXአያማርኛrUazrXአዜርባይጃንኛrUierXእንተርሊንግወrUidrXእንዶኒሲኛrUskrXስሎቫክኛrUnlrXደችrUnorXኖርዌጂያንr Unar!X ናኡሩr"Uner#X ኔፓሊኛr$Uvor%Xቮላፑክኛr&Usidr'X ሲዳምኛr(Utigr)X ትግረr*Ufrr+Xፈረንሳይኛr,Usmr-X ሳሞአኛr.Ufyr/X ፍሪስኛr0Ufar1Xፐርሲያኛr2Ufir3X ፊኒሽr4Ufjr5X ፊጂኛr6Usar7Xሳንስክሪትኛr8Ufor9X ፋሮኛr:Ukar;Xጊዮርጊያንr<Ukkr=X ካዛክኛr>Usrr?X ሰርቢኛr@UsqrAX ልቤኒኛrBUkorCX ኮሪያኛrDUknrEX ካናዳኛrFUkmrGX ክመርኛrHUklrIXካላሊሱትኛrJUksrKXካሽሚርኛrLUsirMXስንሃልኛrNUsorOX ሱማልኛrPUsnrQX ሾናኛrRUkurSXኩርድሽኛrTUslrUX ስሎቪኛrVUkyrWXኪርጊዝኛrXUsgrYX ሳንጎኛrZUsdr[Xሲንድሂኛr\uU territoriesr]}r^(UBEr_X ቤልጄምr`UBGraXቡልጌሪያrbUBArcX)ቦስኒያ እና ሄርዞጎቪኒያrdUBBreXባርቤዶስrfUBMrgX ቤርሙዳrhUBOriX ቦሊቪያrjUBHrkX ባህሬንrlUBTrmX ቡህታንrnUJMroX ጃማይካrpUJOrqX ጆርዳንrrUBRrsX ብራዚልrtUBYruX ቤላሩስrvUBZrwX ቤሊዘrxURUryX ራሺያrzUTLr{Xምስራቅ ቲሞርr|UROr}X ሮሜኒያr~UGWrX ቢሳዎrUGRrX ግሪክrUGQrXኢኳቶሪያል ጊኒrUJPrX ጃፓንrUGYrX ጉያናrUGFrXየፈረንሳይ ጉዊአናrUGErX ጆርጂያrUGBrXእንግሊዝrUGNrXጊኒrUGMrX ጋምቢያrUTNrX ቱኒዚያrUHRrXክሮኤሽያrUHTrX ሀይቲrUHUrX ሀንጋሪrUHKrXሆንግ ኮንግrUVErXቬንዙዌላrUPRrXፖርታ ሪኮrUPFrX"የፈረንሳይ ፖሊኔዢያrUPGrXፓፑዋ ኒው ጊኒrUPErXፔሩrUSOrX ሱማሌrUPLrX ፖላንድrUZMrX ዛምቢያrUEHrXምዕራባዊ ሳህራrUEErXኤስቶኒያrUEGrX ግብጽrUZArXደቡብ አፍሪካrUECrX ኢኳዶርrUITrX ጣሊያንrUETrXኢትዮጵያrUESrX ስፔንrUERrX ኤርትራrUMDrX ሞልዶቫrUMArX ሞሮኮrUUZrXዩዝበኪስታንrUMOrX ማካዎrUMNrXሞንጎሊያrUMKrXማከዶኒያrUMUrX ማሩሸስrUMTrX ማልታrUMRrXሞሪቴኒያrUUGrX ዩጋንዳrUMYrX ማሌዢያrUMXrX ሜክሲኮrUILrXእስራኤልrUFRrXፈረንሳይrUFIrXፊንላንድrUFJrXፊጂrUFMrXሚክሮኔዢያrUNLrXኔዘርላንድrUNOrX ኖርዌrUNArX ናሚቢያrUNCrXኒው ካሌዶኒያrUNGrXናይጄሪያrUNZrXኒው ዚላንድrUNPrX ኔፓልrUCHrXስዊዘርላንድrUCOrXኮሎምቢያrUCNrX ቻይናrUCMrX ካሜሩንrUCLrXቺሊrUCFrX2የመካከለኛው አፍሪካ ሪፐብሊክrUCDrX ኮንጎrUCZrXቼክ ሪፑብሊክrUCYrXሳይፕረስrUCSrX ሰርቢያrUCVrXኬፕ ቬርዴrUSYrX ሲሪያrUKHrXካምቦዲያrUKMr X ኮሞሮስr USKr Xስሎቫኪያr UKRr Xሰሜን ኮሪያrUSIrXስሎቬኒያrUKPrXደቡብ ኮሪያrUKWrX ክዌትrUSNrX ሴኔጋልrUSArXሳውድአረቢያrUSGrXሲንጋፖርrUSErX ስዊድንrUSDrX ሱዳንrUDOrXዶሚኒክ ሪፑብሊክr UDMr!X ዶሚኒካr"UDKr#Xዴንማርክr$UDEr%X ጀርመንr&UYEr'X የመንr(UDZr)Xአልጄሪያr*UUSr+X አሜሪካr,ULBr-X ሊባኖስr.UTTr/X ትሪኒዳድ እና ቶባጎr0UTRr1X ቱርክr2ULVr3X ላትቪያr4ULTr5Xሊቱዌኒያr6UTJr7Xታጃኪስታንr8UTHr9Xታይላንድr:UTFr;X,የፈረንሳይ ደቡባዊ ግዛቶችr<UTDr=Xቻድr>ULYr?X ሊቢያr@UAErAX,የተባበሩት አረብ ኤምሬትስrBUADrCX አንዶራrDUVGrEX,የእንግሊዝ ድንግል ደሴቶችrFUIQrGX ኢራቅrHUVIrIX)የአሜሪካ ቨርጂን ደሴቶችrJUISrKXአይስላንድrLUAMrMXአርሜኒያrNUALrOXአልባኒያrPUANrQX%ኔዘርላንድስ አንቲልስrRUARrSXአርጀንቲናrTUAUrUXአውስትሬሊያrVUATrWXኦስትሪያrXUINrYX ህንድrZUTZr[Xታንዛኒያr\UAZr]Xአዘርባጃንr^UIEr_Xአየርላንድr`UIDraXኢንዶኔዢያrbuUdecimal_formatsrc}rdU date_formatsre}rf(Umediumrgh))rh}ri(h,X dd-MMM-yyyyrjh.X%(dd)s-%(MMM)s-%(yyyy)srkubUfullrlh))rm}rn(h,X EEEE፡ dd MMMM ግርጋ yyyy Groh.X4%(EEEE)s፡ %(dd)s %(MMMM)s ግርጋ %(yyyy)s %(G)srpubUlongrqh))rr}rs(h,X dd MMMM yyyyrth.X%(dd)s %(MMMM)s %(yyyy)sruubUshortrvh))rw}rx(h,Xdd/MM/yyryh.X%(dd)s/%(MM)s/%(yy)srzubuUcurrency_symbolsr{}r|U time_zonesr}}r~Uscriptsr}rULatnrX ላቲንrsUvariantsr}rUnumber_symbolsr}rUcurrency_namesr}r(UJPYrXየጃፓን የንrUUSDrXየአሜሪካን ዶላርrURUBrXየራሻ ሩብልrUINRrXየሕንድ ሩፒrUCNYrX&የቻይና ዩአን ረንሚንቢrUETBrXየኢትዮጵያ ብርrUBRLrXየብራዚል ሪልrUGBPrX2የእንግሊዝ ፓውንድ ስተርሊንግrUEURrX አውሮruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXልrKXካrKXክrKXፋrKXክrKXምrKXኰrKXማrK XያrK XመrK XምrK XተrusUformatr}r(Uwider}r(KX ልደትሪrKXካብኽብቲrKX ክብላrKX ፋጅኺሪrKX ክቢቅሪrKXምኪኤል ትጟኒሪrKX ኰርኩrKXማርያም ትሪrK Xያኸኒ መሳቅለሪrK X መተሉrK Xምኪኤል መሽወሪrK XተሕሳስሪruU abbreviatedr}r(KX ልደትrKX ካብኽrKX ክብላrKX ፋጅኺrKX ክቢቅrKXም/ትrKXኰርrKX ማርያrK X ያኸኒrK X መተሉrK Xም/ምrK X ተሕሳruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrXrjrUint_precrKKrh,X ¤#,##0.00rUprefixrX¤rX-¤rrUexp_plusrNUgroupingrKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXሰrKXሰrKXለrKXኣrKXኣrKXሰrKXሰrusUformatr}r(Uwider}r(KXሰኑrKX ሰሊጝrKXለጓ ወሪ ለብዋrKX ኣምድrKX ኣርብrKXሰንበር ሽጓዅrKXሰንበር ቅዳዅruU abbreviatedr}r(KXሰኑrKX ሰሊጝrKXለጓrKX ኣምድrKX ኣርብrKXሰ/ሽrKXሰ/ቅruuuU meta_zonesr}rUerasr}rU abbreviatedr}r(KXይጅrKXኣድr usu.PK[Rll(site-packages/babel/localedata/cs_CZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[J6(site-packages/babel/localedata/de_CH.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}q(UBDqX BangladeshqURWqXRwandaqUDJqXDjiboutiqUBNqXBruneiq UMHq!XMarshall-Inselnq"USTq#XSao Tomé und Principeq$UBWq%XBotswanaq&UGBq'XGrossbritannienq(USBq)XSalomon-Inselnq*UZWq+XZimbabweq,UCVq-X Kapverdenq.uUdecimal_formatsq/}q0U date_formatsq1}q2Ucurrency_symbolsq3}q4U time_zonesq5}q6Uscriptsq7}q8Uvariantsq9}q:Unumber_symbolsq;}q<(Udecimalq=X.q>Ugroupq?X'q@uUcurrency_namesqA}qBUmonthsqC}qDUcurrency_formatsqE}qFNcbabel.numbers NumberPattern qG)qH}qI(Uexp_precqJNUscaleqKKU frac_precqLKKqMUsuffixqNXqOhOqPUint_precqQKKqRUpatternqSX ¤ #,##0.00qTUprefixqUX¤ qVX¤-qWqXUexp_plusqYNUgroupingqZKKq[ubsUdaysq\}q]U meta_zonesq^}q_Uerasq`}qau.PK[LI  *site-packages/babel/localedata/zh_Hant.datnu[}q(U zone_formatsq}q(UregionqX%s時間qUfallbackqX %(1)s(%(0)s)quUdatetime_formatsq}qUquartersq }q Uformatq }q (Uwideq }q(KX第1季qKX第2季qKX第3季qKX第4季quU abbreviatedq}q(KX第1季qKX第2季qKX第3季qKX第4季quusUperiodsq}qUscientific_formatsq}qUpercent_formatsq}qU week_dataq}q (Umin_daysq!KU weekend_startq"KU first_dayq#KU weekend_endq$KuU time_formatsq%}q&(Umediumq'cbabel.dates DateTimePattern q()q)}q*(Upatternq+Xah:mm:ssq,Uformatq-X%(a)s%(h)s:%(mm)s:%(ss)sq.ubUfullq/h()q0}q1(h+Xahh時mm分ss秒vq2h-X%%(a)s%(hh)s時%(mm)s分%(ss)s秒%(v)sq3ubUlongq4h()q5}q6(h+Xahh時mm分ss秒zq7h-X%%(a)s%(hh)s時%(mm)s分%(ss)s秒%(z)sq8ubuU languagesq9}q:(Ugvq;X 曼島文qUromq?X 吉普賽文q@UalgqAX阿爾岡昆文qBUaleqCX 阿留申文qDUscoqEX 蘇格蘭文qFUmniqGX曼尼普裡文qHUgdqIX蘇格蘭 - 蓋爾文qJUgaqKX 愛爾蘭文qLUmnoqMX 馬諾波文qNUosaqOX 歐塞奇文qPUaltqQX南阿爾泰文qRUglqSX加里西亞文qTUmwrqUX馬爾尼裡文qVUtyqWX 大溪地文qXUttqYX 韃靼文qZUtsq[X 特松加文q\Utnq]X突尼西亞文q^Utoq_X 東加文q`UausqaX 澳洲英文qbUtkqcX 土庫曼文qdUroaqeX其他羅曼文qfUteqgX 泰盧固文qhUugaqiX 烏加列文qjUmwlqkX米蘭德斯文qlUsmiqmX其他薩米文qnUfanqoX 芳族文qpUwoqqX 沃爾夫文qrUgotqsX 哥德文qtUdsbquX 下索布文qvUcmcqwX佔語諸語言qxUcarqyX 加勒比文qzUtemq{X 提姆文q|Unwcq}X古尼瓦爾文q~UzaqX壯文qUcauqX高加索文(其他)qUzuqX 祖魯文qUterqX 泰雷諾文qUtetqX 泰頓文qUmncqX 滿族文qUkutqX 庫特奈文qUsukqX 蘇庫馬文qUkumqX 庫密克文qUsusqX 蘇蘇文qUnewqX 尼瓦爾文qUsuxqX 蘇美文qUdenqX 斯拉夫qUmenqX 門德文qUmulqX 多種語言qUlezqX 列茲干文qUmyqX 緬甸文qUekaqX艾卡朱克文qUdraqX德拉威文(其他)qUjrbqX猶太阿拉伯文qUsgnqX手語qUsgaqX古愛爾蘭文(至 900)qUapaqX阿帕奇語言qUchbqX 奇布查文qUchkqX 處奇斯文qUchmqX 馬里文qUchnqX 契奴克文qUchoqX 喬克托文qUchpqX奇佩瓦揚文qUchrqX 柴羅基文qUchyqX 沙伊安文qUtiqX提格利尼亞文qUmgqX馬爾加什文qUmlqX馬來亞拉姆文qUmoqX摩爾多瓦文qUmhqX 馬紹爾文qUmkqX 馬其頓文qUmtqX 馬爾他文qUcaiqX中美印第安文(其他)qUdelqX 德拉瓦文qUmsqX 馬來文qUmrqX 馬拉地文qUtaqX 坦米爾文qUrootqX 根語言qUsrnqX蘇拉南東墎文qUtaiqX 其他泰文qUsitqX其他漢藏文qUafaqX非閃族及非亞語言qUen_AUqX英文 (澳洲)qUnynqX尼揚科萊文qUnyoqX 尼奧囉文qUsidqX 希達摩文qUsioqX 大蘇文qUlamqX 蘭巴文qUmasqX 馬賽文qUlahqX 拉亨達文qUnymqX尼揚韋齊文qUladqX 拉迪諾文qUfyqX弗里斯蘭文qUmadqX 馬都拉文qUmagqX 馬加伊文qUmaiqX 邁蒂利文qUfiqX 芬蘭文qUmakqX 望加錫文qUfoqX 法羅文rUegyrX 古埃及文rUzndrX 贊德文rUssrX辛辛那提文rUsrrX塞爾維亞文rUsqr X阿爾巴尼亞文r Uswr X史瓦希里文r Usur X 巽他語rUsirX 僧伽羅文rUshrX塞爾維亞克羅埃西亞文rUsorX 索馬利文rUsnrX塞內加爾文rUsmrX 薩摩亞文rUslrX斯洛維尼亞文rUscrX 撒丁文rUserX北方薩米文rUsdrX 印度語r Uzenr!X 澤納加文r"Ukbdr#X卡巴爾達文r$Ucsbr%X 卡舒布文r&Ulgr'X 干達文r(Ulbr)X 盧森堡文r*Ufiur+X芬烏諸語言r,Ulor-X 寮國文r.Ulir/X 林堡文r0Ubynr1X 比林文r2Ultr3X 立陶宛語r4Ulur5X魯巴加丹加文r6Ufilr7X 菲律賓文r8Uyir9X 意第緒文r:Unonr;X古諾爾斯文r<Ucebr=X 宿霧文r>Uyor?X 約魯巴文r@UcelrAX克爾特文(其他)rBUcrprCX克里奧爾文和皮欽文rDUdakrEX 達科他文rFUdarrGX達爾格瓦文rHUdayrIX 迪雅克文rJUssarKX$非洲撒哈拉沙漠邊緣地帶文rLUelrMX 希臘文rNUeorOX 世界語rPUmaprQX南島諸語言rRUeerSX 埃維文rTUmdrrUX 曼達文rVUetrWX愛沙尼亞文rXUrwrYX 盧安達文rZUgohr[X古高地日耳曼文r\Usmsr]X斯科特薩米文r^Usmnr_X伊納裡薩米文r`UsmjraX魯勒薩米文rbUde_ATrcX德文 (奧地利)rdUrmreX里托羅曼斯文rfUrnrgX 隆迪文rhUroriX羅馬尼亞文rjUblarkX錫克錫卡文rlUsmarmX 南薩米文rnUgorroX科隆達羅文rpUastrqX阿斯圖里亞文rrUathrsX阿薩帕斯坎諸語言rtUxhruX 科薩文rvUffrwX 富拉文rxUkforyX 科羅文rzUfjr{X 斐濟文r|Uzapr}X薩波特克文r~UkokrX 貢根文rUzxxrX無語言內容rUkosrX科斯雷恩文rUtogrX湯加文(尼亞薩文)rUudmrX沃蒂艾克文rUbejrX 貝扎文rUbemrX 別姆巴文rUberrX 柏柏爾文rUnzirX 尼茲馬文rUsairX南美印第安諸語言rUangrX 古英文rUprarX0印度古代及中世紀之中部及北部方言rUsamrX薩瑪利亞阿拉姆文rUsalrX 薩利甚文rUprorX古普羅旺斯文rUrajrX拉賈斯坦諸文rUsadrX 桑達韋文rUrarrX拉羅通加文rUes_419rX西班牙文 (拉丁美洲)rUraprX 復活島文rUsasrX 撒撒克文rUnqorX西非書面語言(N'ko)rUsatrX 散塔利文rUminrX米南卡堡文rUmicrX米克馬克文rUefirX 埃菲克文rUypkrX愛斯基摩文rUmisrX 其他語言rUkabrX 卡比爾文rUkaarX卡拉卡爾帕克文rUkarrX 克倫文rUfr_CHrX法文 (瑞士)rUtyvrX 土凡文rUawarX 阿瓦文rUkarX 喬治亞文rUdoirX 多格來文rUkgrX 剛果文rUkkrX 哈薩克文rUkjrX 廣亞馬文rUkirX 吉庫尤文rUkorX韓文rUknrX 坎那達文rUkmrX 高棉文rUklrX 格陵蘭文rUksrX克什米爾文rUkrrX 卡努裡文rUkwrX 康瓦耳文rUkurX 庫爾德文rUkyrX吉爾吉斯文rUtklrX 托克勞文rUmgarX中古愛爾蘭文rUhitrX 赫梯文rUgezrX 吉茲文rUdarX 丹麥文rUirarX 伊芳朗文rUdvrX 迪維西文rUhilrX希利蓋農文rUhimrX赫馬查利文rUgemrX日耳曼諸語言rUbatrX波羅的海諸語言rUqurX 蓋丘亞文rUbasrX 巴薩文rUgbarX 葛巴亞文rUbadrX 班達文rUbanrX 峇里文rUcrhrXE克里米亞半島的土耳其文;克里米亞半島的塔塔爾文rUshnrX撣文rUbairX巴米累克諸語言rUartrX 人工語言rUen_USr X英文 (美國)r Usemr X其他閃族語言r Uselr X瑟爾卡普文rUnubrX 努比亞文rUarnrX 阿勞坎文rUlusrX 盧晒文rUmusrX 克里克文rUluarX魯巴魯魯亞文rUirorX 易洛魁文rUluirX路易塞諾文rUmunrX 蒙達文rUlunrX 盧恩達文r Uluor!X 盧奧文r"Utupr#X 圖皮文r$Uzblr%X布列斯符號r&Ututr'X阿爾泰諸語言r(Utumr)X圖姆布卡文r*Uilor+X 伊洛闊文r,Utsir-X 欽西安文r.Ugwir/X 圭契文r0Uundr1X 未確定的r2Utlir3X特林基特文r4Utlhr5X 克林貢文r6Uchr7X 查莫洛文r8Upt_PTr9X葡萄牙文 (葡萄牙)r:Ucer;X 車臣文r<Uponr=X 波那貝文r>Ucyr?X 威爾士文r@UsahrAX 雅庫特文rBUcrrCX 克裡文rDUbntrEX班圖諸語言rFUlvrGX拉脫維亞文rHUdumrIX中古荷蘭文rJUduarKX 杜亞拉文rLUtivrMX 提夫文rNUfrsrOX東弗里西亞文rPUfrrrQX北弗里西亞文rRUyaorSX瑤文rTUxalrUX卡爾梅克文rVUes_ESrWX西班牙文 (西班牙)rXUen_GBrYX英文 (英國)rZUgayr[X 加約文r\Uotor]X 奧托米文r^Uotar_X!鄂圖曼土耳其文 (1500-1928)r`UhmnraX孟文rbUmyvrcX厄爾茲亞文rdUgaareX 加族文rfUainrgX 愛努文rhUslariX其他斯拉夫文rjUverkX 溫達文rlUvirmX 越南語rnUisroX 冰島文rpUavrqX 阿瓦爾文rrUiursX 因紐特文rtUitruX 義大利文rvUiirwX 四川話rxUikryX依奴皮維克文rzUior{X 伊朗文r|Uiar}X 國際文Ar~UjprrX猶太教-波斯文rUierX 國際文ErUidrX 印尼文rUigrX 伊布文rUpaprX帕皮阿門托文rUeworX 依汪都文rUpaurX 帛琉文rUpaarX其他巴布亞諸語言rUpagrX 潘加辛文rUpalrX 巴列維文rUpamrX 潘帕嘉文rUsycrX古敘利亞文rUphirX其他菲律賓文rUnogrX 諾蓋文rUnicrX其他尼日剛果語系rUniarX 尼亞斯文rUdgrrX多格里布文rUsyrrX 敘利亞文rUniurX 紐埃文rUcchrX 阿燦文rUjborX 邏輯文rUnahrX 納瓦特文rUhairX 海達文rUgmhrX中古高地日耳曼文rUcusrX庫施特語系(其他)rUwenrX 文德文rUadyrX 阿迪各文rUelxrX 埃蘭文rUadarX 阿當莫文rUcarX加泰羅尼亞文rUbikrX 比科爾文rUmohrX 莫霍克文rUbhorX博傑普爾文rUtlrX塔加路族文rUzh_HansrX 簡體中文rUzh_HantrX 繁體中文rUtvlrX 吐瓦魯文rUijorX 伊喬文rUpeorX古波斯文 (ca.600-400 B.C.)rUumbrX 姆本杜文rUtmhrX塔馬奇克文rUfonrX豐文rUberX白俄羅斯文rUbgrX保加利亞文rUbarX巴什客爾文rUpsrX 普什圖文rUborX藏文rUbhrX 比哈爾文rUbirX比斯拉馬文rUbsrX波士尼亞文rUruprX羅馬尼亞語系rUomrX 阿曼文rUojrX奧杰布瓦文rUacerX 亞齊文rUachrX 阿僑利文rUocrX奧克西坦文rUkrurX 庫魯科文rUsrrrX 塞雷爾文rUkrorX 克魯文rUkrcrX卡拉柴-包爾卡爾文rUndsrX'低地日耳曼文;低地薩克遜文rUosrX 奧塞提文rUorrX 歐里亞文rUsogrX索格底亞納文rUvairX 越南文 VairUwakrX夸基武特文rUlolrX 芒戈文rUmkhrX其他高棉語系rUlozrX 洛齊文rUgilr X吉爾伯特群島文r Uwasr X 瓦紹文r Uwarr X 瓦瑞文rUhzrX 赫雷羅文rUhyrX亞美尼亞文rUanrX 阿拉貢文rUhrrX克羅埃西亞文rUhtrX 海地人rUhirX 北印度文rUhorX西里莫圖土文rUbuarX布里阿特文rUbugrX 布吉斯文r Uher!X 希伯來文r"Uuzr#X烏茲別克文r$Uurr%X 烏爾都文r&Uplr'X 波蘭文r(Uukr)X 烏克蘭文r*Uugr+X 維吾爾文r,Uabr-X阿布哈茲文r.Uaer/X阿緯斯陀文r0Uafr1X南非荷蘭文r2Uakr3X 阿坎文r4Unl_BEr5X法蘭德斯文r6Ukhir7X科依桑諸語言r8Uasr9X 阿薩姆文r:Utpir;X 托比辛文r<Ukhor=X 和闐文r>Uayr?X 艾馬拉文r@UinerAX印歐語系(其他)rBUazrCX亞塞拜然文rDUincrEX印度諸語言rFUnlrGX 荷蘭文rHUnnrIX 新挪威文rJUnarKX 諾魯文rLUnbrMX挪威波克默爾文rNUnairOX其他北美印地安文rPUndrQX北地畢列文rRUnerSX 尼泊爾文rTUngrUX 恩東加文rVUnyrWX 尼揚賈文rXUmynrYX 馬雅文rZUgrcr[X 古希臘文r\Unrr]X南地畢列文r^Utigr_X 蒂格雷文r`UnvraX 納瓦約文rbUzunrcX 祖尼文rdUgonreX 岡德文rfUcpergX2歐洲腔調和洋涇濱,源自英文的(其他)rhUcpfriX2歐洲腔調和洋涇濱,源自法文的(其他)rjUcpprkX8歐洲腔調和洋涇濱,源自葡萄牙文的(其他)rluU territoriesrm}rn(UBDroX 孟加拉rpUBErqX 比利時rrUBFrsX布吉納法索rtUBGruX 保加利亞rvUBArwX波士尼亞與赫塞格維納rxUBBryX 巴貝多rzUWFr{X瓦利斯和福杜納群島r|UBLr}X 聖巴瑟米r~UBMrX 百慕達rUBNrX汶萊rUBOrX 玻利維亞rUBIrX 蒲隆地rUBJrX貝南rUJMrX 牙買加rUBVrX 布威島rUBWrX 波札那rU014rX東非rUBSrX 巴哈馬rU018rX 非洲南部rUJErX 澤西島rUBYrX 白俄羅斯rUBZrX 貝里斯rULVrX 拉脫維亞rURWrX 盧安達rURSrX 塞爾維亞rURErX 留尼旺rUTMrX 土庫曼rUTJrX 塔吉克rUROrX 羅馬尼亞rUTKrX托克勞群島rUGWrX幾內亞比索rUGUrX關島rUGTrX 瓜地馬拉rUGSrX!南喬治亞與南三明治群島rUGRrX希臘rUGQrX赤道幾內亞rUGPrX 哥德普洛rUGYrX 蓋亞納rUGGrX 根西島rUGFrX法屬圭亞那rUGErX喬治亞共和國rUGDrX 格瑞納達rUGBrX英國rUGArX加彭rUGNrX 幾內亞rUGMrX 甘比亞rUGLrX 格陵蘭rUGIrX 直布羅陀rUGHrX迦納rUOMrX 阿曼王國rUTNrX 突尼西亞rUJOrX約旦rUWSrX薩摩亞群島rUKIrX 吉里巴斯rUHRrX克羅埃西亞rUSVrX 薩爾瓦多rUHKrX*中華人民共和國香港特別行政區rU039rX南歐rUHNrX 宏都拉斯rUHMrX赫德與麥克當諾群島rU142rX亞洲rU030rX東亞rU034rX南亞rU035rX 東南亞rUPSrX 巴勒斯坦rU830rX 海峽群島rUFKrX福克蘭群島rUPWrX帛琉rUSJrX冷岸及央麥恩群島rUFMrX密克羅尼西亞群島rUPArX 巴拿馬rUPFrX法屬玻里尼西亞rUPGrX巴布亞紐幾內亞rUPErX秘魯rUPHrX 菲律賓rUFOrX 法羅群島rUPNrX 皮特康rUPLr X波蘭r UPMr X聖彼德與密啟崙r UZMr X 尚比亞rURUrX 俄羅斯rUEErX 愛沙尼亞rUECrX 厄瓜多爾rUITrX 義大利rUZZrX未確定的區域rUSBrX索羅門群島rUETrX 衣索比亞rUZWrX 辛巴威rUSArX沙烏地阿拉伯r UERr!X 厄利垂亞r"UMEr#X蒙特內哥羅r$UMDr%X 摩爾多瓦r&UMGr'X馬達加斯加r(UMFr)X 聖馬丁r*UUYr+X 烏拉圭r,UMCr-X 摩納哥r.UUZr/X 烏茲別克r0UMMr1X緬甸r2UMLr3X馬利r4UMOr5X*中華人民共和國澳門特別行政區r6UMHr7X馬紹爾群島r8UMKr9X 馬其頓r:UMUr;X 模里西斯r<UMTr=X 馬爾他r>UMWr?X 馬拉威r@UMVrAX 馬爾地夫rBUMQrCX馬丁尼克島rDUMPrEX北馬里亞納群島rFUMSrGX蒙特色拉特島rHUMRrIX茅利塔尼亞rJUIMrKX曼島rLUUGrMX 烏干達rNUMYrOX 馬來西亞rPUMZrQX 莫三比克rRUFRrSX法國rTUIOrUX英屬印度洋領土rVUDOrWX多明尼加共和國rXUSHrYX聖赫勒拿島rZUVCr[X聖文森及格瑞那丁r\U054r]X美拉尼西亞r^UFIr_X芬蘭r`UFJraX斐濟rbU057rcX密克羅尼西亞rdU172reX 獨立國協rfU053rgX澳洲與紐西蘭rhUNLriX荷蘭rjUNArkX 納米比亞rlUVUrmX 萬那杜rnUNCroX新喀里多尼亞群島rpUNErqX尼日rrUNFrsX 諾福克島rtUNGruX 奈及利亞rvUNZrwX 紐西蘭rxUNPryX 尼泊爾rzUNRr{X諾魯r|UNUr}X 紐威島r~U061rX玻里尼西亞rUCIrX 科特迪瓦rU062rX 中南亞rUCOrX 哥倫比亞rUCNrX中華人民共和國rUCMrX 喀麥隆rUCCrX可可斯群島rUVErX 委內瑞拉rUCGrX剛果rUCFrX中非共和國rUCDrX剛果民主共和國rUCZrX捷克共和國rUCYrX 賽普勒斯rUCXrX 聖誕島rUCSrX塞爾維亞和蒙特尼哥羅rUCRrX哥斯大黎加rUCVrX 維德角rUSZrX 史瓦濟蘭rUSYrX 敘利亞rUKGrX 吉爾吉斯rUKErX肯亞rUSRrX 蘇利南rU143rX中亞rUKNrX聖克里斯多福及尼維斯rUKMrX科摩羅群島rUSTrX聖多美及普林西比rUKRrX南韓rUSIrX斯洛維尼亞rUKPrX北韓rUSOrX 索馬利亞rUSNrX 塞內加爾rUSMrX 聖馬利諾rUSLrX 獅子山rUSCrX 塞席爾rUKZrX 哈薩克rUKYrX 開曼群島rUSDrX蘇丹rU151rX東歐rU150rX歐洲rUDMrX 多明尼加rU155rX西歐rU154rX北歐rUDErX德國rUYErX葉門rUDZrX阿爾及利亞rUUSrX美國rUYTrX 馬約特rUUMrX美屬邊疆群島rUTZrX 坦尚尼亞rULCrX 聖露西亞rULArX寮國rUTVrX 吐瓦魯rUTWrX臺灣rUTTrX千里達及托巴哥rULKrX 斯里蘭卡rULIrX列支敦斯登rUCKrX 庫克群島rUTOrX東加rUTLrX 東帝汶rULUrX 盧森堡rULRrX 賴比瑞亞rULSrX 賴索扥rUTHrX泰國rUTFrX法國南屬地rUTGrX多哥共和國rUTDrX查德rUTCrX土克斯及開科斯群島rULYrX 利比亞rUVArX 梵蒂岡rU145r X西亞r UAEr X阿拉伯聯合大公國r UADr X 安道爾rUAGrX安地卡及巴布達rUVGrX英屬維京群島rUAIrX 安圭拉島rUVIrX美屬維京群島rUISrX冰島rUAMrX 亞美尼亞rUALrX阿爾巴尼亞rUANrX荷屬安地列斯rUAQrX 南極洲r UASr!X美屬薩摩亞群島r"UAUr#X澳洲r$UATr%X 奧地利r&UAWr'X 阿路巴r(UAXr)X 亞蘭群島r*UDJr+X 吉布地r,UAZr-X 亞塞拜然r.UIEr/X 愛爾蘭r0UIDr1X印尼r2UQUr3X歐盟r4UUAr5X 烏克蘭r6UQAr7X卡達r8UDKr9X丹麥r:UQOr;X大洋洲邊疆群島r<uUdecimal_formatsr=}r>U date_formatsr?}r@(UmediumrAh()rB}rC(h+Xyyyy/M/drDh-X%(yyyy)s/%(M)s/%(d)srEubUshortrFh()rG}rH(h+Xyyyy/M/drIh-X%(yyyy)s/%(M)s/%(d)srJubuUcurrency_symbolsrK}rL(UMOPrMXMOPrNUKRWrOXKRWrPUGBPrQXGBPrRUNZDrSX$NZrTUSGDrUXSGDrVUEURrWXEURrXuU time_zonesrY}rZ(UAtlantic/Canaryr[}r\Ucityr]X 加納利r^sUAustralia/Melbourner_}r`j]X 墨爾本rasUAmerica/Nipigonrb}rcj]X 尼皮岡rdsUAmerica/Miquelonre}rfj]X聖皮里及米圭隆rgsUPacific/Wallisrh}rij]X瓦利斯與富圖納群島rjsUAntarctica/Davisrk}rlj]X 戴維斯rmsU Asia/Dhakarn}roj]X 孟加拉rpsUAmerica/St_Luciarq}rrj]X 聖露西亞rssU Asia/Kashgarrt}ruj]X 喀什米爾rvsUAmerica/Phoenixrw}rxj]X 鳳凰城rysUAsia/Hong_Kongrz}r{j]X*中華人民共和國香港特別行政區r|sUArctic/Longyearbyenr}}r~j]X隆意耳拜恩rsUEurope/Guernseyr}rj]X根息rsUAntarctica/Rotherar}rj]X 羅瑟拉rsUEurope/Stockholmr}rj]X斯德哥爾摩rsU Pacific/Fijir}rj]X斐濟rsU Pacific/Apiar}rj]X亞庇rsUPacific/Pago_Pagor}rj]X 派哥派哥rsU Asia/Rangoonr}rj]X緬甸rsUAmerica/Mexico_Cityr}rj]X 墨西哥市rsUIndian/Mauritiusr}rj]X 模里西斯rsU Europe/Berlinr}rj]X德國rsU Europe/Zurichr}rj]X瑞士rsU America/Belemr}rj]X貝倫rsU Europe/Skopjer}rj]X 斯科普耶rsUAsia/Krasnoyarskr}rj]X克拉斯諾雅斯克rsUAtlantic/Bermudar}rj]X 百慕達rsUAustralia/Currier}rj]X克黎rsU Asia/Tehranr}rj]X伊朗rsU Asia/Saigonr}rj]X越南rsU Asia/Bakur}rj]X 亞塞拜然rsUAmerica/Danmarkshavnr}rj]X 丹馬沙文rsUAmerica/Scoresbysundr}rj]X斯可比海峽rsUAmerica/Eiruneper}rj]X 艾魯內佩rsUAmerica/Caracasr}rj]X 卡拉卡斯rsU Asia/Baghdadr}rj]X 伊拉克rsUAfrica/Monroviar}rj]X 蒙羅維亞rsUAmerica/St_Vincentr}rj]X 聖文森rsUAmerica/Vancouverr}rj]X 溫哥華rsU Asia/Thimphur}rj]X不丹rsU Africa/Accrar}rj]X迦納rsUAmerica/Belizer}rj]X 貝里斯rsUAmerica/Port_of_Spainr}rj]X 千里達rsUAmerica/Mendozar}rj]X 門多薩rsU Asia/Tokyor}rj]X東京rsUPacific/Kiritimatir}rj]X 吉里巴斯rsUAustralia/Sydneyr}rj]X雪梨rsU Europe/Rigar}rj]X 拉脫維亞rsU Asia/Dilir}rj]X 東帝汶rsUAfrica/Mbabaner}rj]X 史瓦濟蘭rsU Asia/Oralr}rj]X 奧拉爾rsU Asia/Adenr}rj]X葉門rsUEurope/Istanbulr}rj]X 伊斯坦堡rsU Asia/Magadanr}rj]X 馬加丹rsUPacific/Galapagosr}rj]X加拉巴哥群島rsUAmerica/Bogotar}rj]X 哥倫比亞rsUAmerica/Dawsonr}rj]X 道生河rsUPacific/Kwajaleinr}rj]X 瓜加林島r sUAustralia/Broken_Hillr }r j]X 斷丘市r sUAmerica/Cuiabar }rj]X 古雅巴rsUIndian/Christmasr}rj]X 聖誕島rsU Asia/Jayapurar}rj]X 加亞布拉rsUEurope/Brusselsr}rj]X 布魯塞爾rsUAsia/Chongqingr}rj]X重慶rsUAmerica/Noronhar}rj]X 諾倫哈rsUEurope/Podgoricar}r j]X 波多里察r!sUAfrica/Algiersr"}r#j]X阿爾及利亞r$sU Africa/Hararer%}r&j]X 辛巴威r'sUAfrica/Ndjamenar(}r)j]X 恩加納美r*sUAmerica/Costa_Ricar+}r,j]X哥斯大黎加r-sUEurope/Ljubljanar.}r/j]X斯洛維尼亞r0sUIndian/Mayotter1}r2j]X 馬約特島r3sUAsia/Phnom_Penhr4}r5j]X 柬埔寨r6sUAmerica/Managuar7}r8j]X 尼加拉瓜r9sU Asia/Bruneir:}r;j]X汶萊r<sUAmerica/Tijuanar=}r>j]X 提華納r?sUPacific/Fakaofor@}rAj]X 托克勞rBsU America/AdakrC}rDj]X 艾達克rEsUAmerica/AntiguarF}rGj]X安地卡及巴布達rHsUAmerica/Argentina/La_RiojarI}rJj]X 拉略哈rKsUPacific/TahitirL}rMj]X 大溪地rNsUAmerica/PangnirtungrO}rPj]X 潘尼爾東rQsU Europe/ZagrebrR}rSj]X克羅埃西亞rTsUAmerica/AsuncionrU}rVj]X 巴拉圭rWsU Europe/ViennarX}rYj]X 奧地利rZsUAustralia/Hobartr[}r\j]X 荷巴特r]sUAmerica/Juneaur^}r_j]X朱諾r`sUAmerica/Inuvikra}rbj]X 伊奴維克rcsUAmerica/Montrealrd}rej]X 蒙特婁rfsU Asia/Seoulrg}rhj]X首爾risU Indian/Comororj}rkj]X科摩羅群島rlsUEurope/Tallinnrm}rnj]X 愛沙尼亞rosU Indian/Maherp}rqj]X 塞席爾rrsU Asia/Calcuttars}rtj]X印度rusUAmerica/Martiniquerv}rwj]X 馬丁尼克rxsUAfrica/Nairobiry}rzj]X 奈洛比r{sUAmerica/Maceior|}r}j]X 馬瑟歐r~sU Asia/Urumqir}rj]X 烏魯木齊rsUAsia/Pyongyangr}rj]X北韓rsUAsia/Ulaanbaatarr}rj]X 烏蘭巴托rsUAmerica/Rainy_Riverr}rj]X 雨河鎮rsUIndian/Maldivesr}rj]X 馬爾地夫rsU Asia/Colombor}rj]X 可倫坡rsUAustralia/Adelaider}rj]X 阿得雷德rsUAmerica/Cambridge_Bayr}rj]X 劍橋灣rsU Africa/Luandar}rj]X 安哥拉rsUPacific/Chathamr}rj]X查坦rsUAmerica/Indiana/Winamacr}rj]X威納麥克,印第安那州rsUAmerica/Cordobar}rj]X 哥多華rsU Asia/Tbilisir}rj]X 喬治亞rsUEurope/Gibraltarr}rj]X 直布羅陀rsU Asia/Karachir}rj]X 喀拉蚩rsU Asia/Harbinr}rj]X 哈爾濱rsUAustralia/Lord_Hower}rj]X 羅豪島rsUAmerica/Boa_Vistar}rj]X 保維斯塔rsUAfrica/Tripolir}rj]X 利比亞rsUIndian/Reunionr}rj]X 留尼旺島rsUAtlantic/Stanleyr}rj]X 史坦萊rsUAmerica/Blanc-Sablonr}rj]X白朗薩布隆rsUAmerica/Santo_Domingor}rj]X多明尼加共和國rsUAntarctica/Syowar}rj]X昭和rsUAmerica/Jamaicar}rj]X 牙買加rsU Europe/Kievr}rj]X基輔rsUEurope/Budapestr}rj]X 匈牙利rsUPacific/Midwayr}rj]X 中途島rsUAmerica/Goose_Bayr}rj]X鵝灣rsU Asia/Ammanr}rj]X約旦rsU Asia/Sakhalinr}rj]X 庫頁島rsUAfrica/Windhoekr}rj]X 溫荷克rsU Asia/Katmandur}rj]X 尼泊爾rsUAmerica/Guyanar}rj]X 圭亞那rsUAmerica/Sao_Paulor}rj]X 聖保羅rsUAustralia/Perthr}rj]X伯斯rsUAfrica/Djiboutir}rj]X 吉布地rsU Asia/Jakartar}rj]X 雅加達rsUAntarctica/Palmerr}rj]X帕麥rsUAfrica/Johannesburgr}rj]X南非rsU Asia/Irkutskr}rj]X伊爾庫次克rsU Africa/Niameyr}rj]X尼日rsUAfrica/Casablancar}rj]X卡薩布蘭卡rsUAmerica/Indiana/Marengor}rj]X 馬倫哥rsUAfrica/Nouakchottr}rj]X茅利塔尼亞rsUEurope/Vilniusr}rj]X 立陶宛rsUAmerica/Cayenner }r j]X法屬蓋亞那r sUAfrica/Mogadishur }r j]X 摩加迪休rsUAmerica/Kentucky/Monticellor}rj]X 蒙提瑟洛rsUAmerica/Rio_Brancor}rj]X 布蘭科rsUAmerica/Cancunr}rj]X康庫rsUAmerica/Havanar}rj]X古巴rsU Pacific/Guamr}rj]X關島rsU Asia/Makassarr}rj]X 馬卡沙爾r sUAtlantic/Azoresr!}r"j]X亞速爾群島r#sUAmerica/Rankin_Inletr$}r%j]X 蘭今灣r&sU Asia/Beirutr'}r(j]X 貝鲁特特r)sU Africa/Maputor*}r+j]X 莫三比克r,sU Asia/Ashgabatr-}r.j]X 土庫曼r/sU Asia/Riyadhr0}r1j]X 利雅德r2sU Europe/Londonr3}r4j]X倫敦r5sUAmerica/Monterreyr6}r7j]X 蒙特瑞r8sUAmerica/Anguillar9}r:j]X 安吉拉r;sU Asia/Damascusr<}r=j]X 敘利亞r>sUAmerica/North_Dakota/Centerr?}r@j]X 申特城rAsUAmerica/Indiana/VevayrB}rCj]X維威rDsUAtlantic/St_HelenarE}rFj]X聖赫勒拿島rGsUAmerica/BarbadosrH}rIj]X 巴貝多rJsUEurope/VaticanrK}rLj]X 梵蒂岡rMsUAmerica/Indiana/VincennesrN}rOj]X 溫森斯rPsU Asia/AlmatyrQ}rRj]X 阿拉木圖rSsU Africa/LomerT}rUj]X多哥rVsUAfrica/BrazzavillerW}rXj]X剛果共和國rYsU America/NomerZ}r[j]X諾姆r\sU Asia/Taipeir]}r^j]X台灣r_sUAmerica/Yakutatr`}raj]X 雅庫塔rbsUAmerica/Araguainarc}rdj]X 阿拉圭那resU Europe/Vaduzrf}rgj]X列支敦斯登rhsU Africa/Asmerari}rjj]X 厄利垂亞rksU Europe/Minskrl}rmj]X 白俄羅斯rnsUAmerica/Buenos_Airesro}rpj]X布宜諾斯艾利斯rqsU Africa/Maserurr}rsj]X 賴索托rtsUAmerica/Louisvilleru}rvj]X路易斯維爾rwsU Asia/Kuchingrx}ryj]X古晉rzsUAfrica/Libreviller{}r|j]X加彭r}sUAfrica/Freetownr~}rj]X 獅子山rsU Africa/Bissaur}rj]X幾內亞比索rsU Europe/Samarar}rj]X 沙馬拉rsUEurope/Amsterdamr}rj]X荷蘭rsU Europe/Tiraner}rj]X阿爾巴尼亞rsUPacific/Saipanr}rj]X北馬里亞納群島rsUAfrica/Abidjanr}rj]X 象牙海岸rsUEurope/Zaporozhyer}rj]X 札波羅結rsUAmerica/El_Salvadorr}rj]X 薩爾瓦多rsU Europe/Madridr}rj]X 馬德里rsUAmerica/Santiagor}rj]X 聖地牙哥rsUAmerica/Argentina/San_Luisr}rj]X 聖路易rsU America/Arubar}rj]X 阿魯巴rsUAmerica/Indianapolisr}rj]X印第安那波里斯rsUAmerica/Reginar}rj]X 利宅那rsU Pacific/Trukr}rj]X土魯克群島rsUPacific/Funafutir}rj]X 吐瓦魯rsUAmerica/Meridar}rj]X 美里達rsUAmerica/Guatemalar}rj]X 瓜地馬拉rsUAfrica/Sao_Tomer}rj]X聖多美普林西比rsUPacific/Kosraer}rj]X 科斯里rsUAfrica/Bujumburar}rj]X 蒲隆地rsUEurope/Chisinaur}rj]X 奇西瑙rsU Europe/Warsawr}rj]X波蘭rsUAsia/Yekaterinburgr}rj]X葉卡捷林堡rsUAntarctica/Caseyr}rj]X凱西rsUAmerica/Halifaxr}rj]X哈里法克斯rsU America/Thuler}rj]X杜里rsUAmerica/St_Johnsr}rj]X 聖約翰rsUAmerica/Monctonr}rj]X 蒙克頓rsUEurope/Helsinkir}rj]X芬蘭rsUAtlantic/Cape_Verder}rj]X 維德角rsUAmerica/Tegucigalpar}rj]X德古斯加巴rsU Indian/Cocosr}rj]X科科斯群島rsU America/Boiser}rj]X 波伊斯rsUAmerica/Guadelouper}rj]X 瓜德羅普rsUAmerica/Nassaur}rj]X 巴哈馬rsU Europe/Praguer}rj]X捷克rsUPacific/Enderburyr}rj]X恩得伯理島rsUAmerica/Manausr}rj]X 瑪瑙斯rsUAmerica/Godthabr}rj]X 高特哈市rsUAmerica/Catamarcar}rj]X 卡塔馬卡rsUAmerica/Chihuahuar}rj]X 奇華華rsUAmerica/Iqaluitr}rj]X 伊魁特rsUAmerica/Argentina/Rio_Gallegosr}rj]X 加拉哥斯rsUPacific/Gambierr}rj]X岡必爾群島rsUEurope/Volgogradr}r j]X伏爾加格勒r sU Africa/Bamakor }r j]X 巴馬科r sUEurope/Uzhgorodr}rj]X 烏茲哥洛rsU Africa/Banjulr}rj]X斑竹rsU Asia/Aqtaur}rj]X 艾克陶rsU Africa/Malabor}rj]X赤道幾內亞rsUAtlantic/Madeirar}rj]X馬得拉群島rsUPacific/Noumear}rj]X新喀里多尼亞rsUAfrica/Kinshasar }r!j]X 金夏沙r"sU Europe/Maltar#}r$j]X 馬爾他r%sUAmerica/Argentina/Ushuaiar&}r'j]X 烏斯懷亞r(sU Asia/Bangkokr)}r*j]X泰國r+sU Pacific/Niuer,}r-j]X紐埃r.sUAustralia/Brisbaner/}r0j]X 布利斯班r1sUAmerica/Recifer2}r3j]X 雷西非r4sU Asia/Yerevanr5}r6j]X 亞美尼亞r7sUAmerica/La_Pazr8}r9j]X 玻利維亞r:sU Africa/Cairor;}r<j]X埃及r=sU Africa/Lusakar>}r?j]X 尚比亞r@sUPacific/GuadalcanalrA}rBj]X 瓜達卡納rCsUAmerica/YellowkniferD}rEj]X 耐羅耐佛rFsUAsia/VientianerG}rHj]X寮國rIsUEurope/KaliningradrJ}rKj]X加里寧格勒rLsUAfrica/ConakryrM}rNj]X 幾內亞rOsUAmerica/Argentina/TucumanrP}rQj]X 吐庫曼rRsU Europe/OslorS}rTj]X 奧斯陸rUsUAmerica/St_KittsrV}rWj]X聖啟斯與尼維斯rXsUAmerica/PanamarY}rZj]X 巴拿馬r[sUAfrica/Gaboroner\}r]j]X 波札那r^sU Pacific/Palaur_}r`j]X帛琉rasUAmerica/Guayaquilrb}rcj]X 瓜亞基爾rdsUAtlantic/Faeroere}rfj]X 法羅群島rgsUAmerica/Menomineerh}rij]X 美諾米克rjsUAsia/Kamchatkark}rlj]X 堪查加rmsUAsia/Vladivostokrn}roj]X 海參崴rpsU Asia/Qatarrq}rrj]X卡達rssU Asia/Dushanbert}ruj]X 塔吉克rvsU Asia/Yakutskrw}rxj]X 雅庫次克rysU Africa/Banguirz}r{j]X中非共和國r|sUAmerica/Paramaribor}}r~j]X巴拉馬利波rsUAfrica/Lubumbashir}rj]X 蘆佈巴西rsUPacific/Marquesasr}rj]X馬可薩斯島rsUEurope/Bratislavar}rj]X布拉提拉瓦rsU Asia/Anadyrr}rj]X 阿那底河rsUAmerica/New_Yorkr}rj]X紐約rsUPacific/Norfolkr}rj]X諾福克群島rsUPacific/Rarotongar}rj]X拉洛東加島rsUAmerica/Dominicar}rj]X 多明尼加rsUAfrica/Porto-Novor}rj]X貝南rsUAsia/Samarkandr}rj]X 撒馬爾罕rsUAmerica/Torontor}rj]X 多倫多rsU America/Bahiar}rj]X 巴伊阿rsUAfrica/Kampalar}rj]X 康培拉rsUAfrica/Ouagadougour}rj]X布吉納法索rsUAntarctica/South_Poler}rj]X南極rsU Asia/Muscatr}rj]X阿曼rsUAmerica/Edmontonr}rj]X 艾德蒙吞rsUAmerica/Indiana/Tell_Cityr}rj]X 泰爾城rsUAustralia/Darwinr}rj]X 達爾文rsUAmerica/Whitehorser}rj]X 懷特霍斯rsUAmerica/Swift_Currentr}rj]X瑞夫卡倫特rsUEurope/Copenhagenr}rj]X丹麥rsUAmerica/Montserratr}rj]X 蒙賽拉特rsUEurope/Simferopolr}rj]X 辛非洛浦rsUAfrica/Blantyrer}rj]X 馬拉威rsUAmerica/Shiprockr}rj]X 船岩峰rsUAmerica/Grenadar}rj]X 格瑞納達rsUAmerica/Indiana/Petersburgr}rj]X彼得堡,印第安那州rsU Asia/Dubair}rj]X杜拜rsUAfrica/Dar_es_Salaamr}rj]X 尚尼亞rsUAmerica/Port-au-Princer}rj]X海地rsUAmerica/Caymanr}rj]X開曼rsU Europe/Athensr}rj]X希臘rsUAmerica/Curacaor}rj]X荷屬安地列斯rsUIndian/Kerguelenr}rj]X克格連群島rsUAfrica/Khartoumr}rj]X 卡土穆rsU Asia/Manilar}rj]X 菲律賓rsUEurope/Sarajevor}rj]X 沙拉耶佛rsU America/Jujuyr}rj]X胡韋rsU Africa/Doualar}rj]X 喀麥隆rsU Europe/Romer}rj]X羅馬rsUAmerica/Argentina/San_Juanr}rj]X 聖胡安rsUAmerica/North_Dakota/New_Salemr}rj]X紐沙倫,北達科他州r sUPacific/Port_Moresbyr }r j]X巴布亞新幾內亞r sUEurope/Andorrar }r j]X 安道爾r sUEurope/Luxembourgr }r j]X 盧森堡r sUAmerica/St_Thomasr }r j]X美屬維京群島r sUPacific/Majuror }r j]X 馬朱諾r sUAmerica/Mazatlanr }r j]X 馬薩特蘭r sU Asia/Macaur }r j]X*中華人民共和國澳門特別行政區r sUEurope/Belgrader }r j]X 塞爾維亞r sUAsia/Choibalsanr }r j]X 卓巴爾塞r sUEurope/Mariehamnr }r j]X 奧蘭群島r sUAntarctica/McMurdor }r j]X 麥克馬多r! sUAmerica/Thunder_Bayr" }r# j]X 珊德灣r$ sUAmerica/Los_Angelesr% }r& j]X 洛杉磯r' sU Asia/Kabulr( }r) j]X 阿富汗r* sUIndian/Antananarivor+ }r, j]X馬達加斯加r- sUAtlantic/Reykjavikr. }r/ j]X冰島r0 sU Asia/Nicosiar1 }r2 j]X 塞浦勒斯r3 sUPacific/Ponaper4 }r5 j]X 波納佩r6 sUPacific/Tongatapur7 }r8 j]X東加r9 sUPacific/Pitcairnr: }r; j]X匹特開恩群島r< sUPacific/Easterr= }r> j]X 復活島r? sUAtlantic/South_Georgiar@ }rA j]X南喬治亞與南三明治島rB sUAfrica/El_AaiunrC }rD j]X 西撒哈拉rE sUAmerica/Campo_GranderF }rG j]X 格蘭場rH sUAmerica/Dawson_CreekrI }rJ j]X 道生灣rK sUAntarctica/VostokrL }rM j]X 莫斯托克rN sUAmerica/Porto_VelhorO }rP j]X 維留港rQ sU Europe/MonacorR }rS j]X 摩納哥rT sU Asia/BishkekrU }rV j]X 吉爾吉斯rW sU Africa/CeutarX }rY j]X休達rZ sUAmerica/Winnipegr[ }r\ j]X 溫尼伯r] sU Asia/Aqtober^ }r_ j]X 阿克糾賓r` sU Africa/Dakarra }rb j]X 塞內加爾rc sUAmerica/Fortalezard }re j]X 福塔力莎rf sUAfrica/Addis_Ababarg }rh j]X 衣索比亞ri sU Pacific/Efaterj }rk j]X 愛發提rl sUPacific/Johnstonrm }rn j]X 強斯頓ro sUAsia/Qyzylordarp }rq j]X 奎茲羅答rr sUEurope/San_Marinors }rt j]X 聖馬利諾ru sUPacific/Aucklandrv }rw j]X 奧克蘭rx sUAmerica/Tortolary }rz j]X 托托拉島r{ sU Indian/Chagosr| }r} j]X英屬印度洋領地r~ sUAmerica/Glace_Bayr }r j]X 格雷斯貝r sUAmerica/Hermosillor }r j]X 厄莫休r sU Africa/Tunisr }r j]X 坦尚尼亞r sUAmerica/Montevideor }r j]X 烏拉圭r sUAmerica/Resoluter }r j]X 羅斯魯特r sU Asia/Gazar }r j]X加薩r sU Europe/Dublinr }r j]X 愛爾蘭r sUAntarctica/DumontDUrviller }r j]X杜蒙杜爾維爾r sUAmerica/Indiana/Knoxr }r j]X 諾克斯r sUAsia/Novosibirskr }r j]X新西伯利亞r sU Africa/Kigalir }r j]X 盧安達r sUAmerica/Grand_Turkr }r j]X土克斯和開卡斯群島r sU Africa/Lagosr }r j]X 奈及利亞r sU Europe/Sofiar }r j]X 保加利亞r sU America/Limar }r j]X秘魯r sU Etc/Unknownr }r j]X 未知地區r sUAmerica/Anchorager }r j]X 安克里治r sU Pacific/Naurur }r j]X諾魯r suUscriptsr }r (UGurur X古爾穆奇文r UHebrr X 希伯來文r UZzzzr X未編碼工序指令碼r UPhnxr X 腓尼基文r UMoonr XMoonr UChamr X占文r UArabr X 阿拉伯文r UGujrr X古吉拉特文r UZxxxr X非書寫語言碼r ULycir X 呂西亞語r USinhr X 錫蘭文r UTalur X 新彝族文r UMongr X 蒙古文r UXpeor X 古波斯文r UVispr X視覺語音文r URjngr X 拉讓文r UOlckr XOlckr UTaler X 泰樂文r UMandr X 曼安底文r UMlymr X馬來亞拉姆文r UTibtr X 西藏文r UKalir X 克耶李文r UJpanr X日文r UPlrdr X柏格理拼音符r USylor X希洛弟納格里文r ULydir X 里底亞語r ULepcr X雷布查文(榮)r UYiiir X彞文r UJavar X 爪哇文r UOryar X 歐利亞文r ULaoor X 寮國文r UUgarr X 烏加列文r UCyrlr X斯拉夫語系r UVaiir X 瓦依文r UArmnr X亞美尼亞文r UCyrsr X-西里爾文(古教會斯拉夫文變體)r UKhmrr X 高棉文r UItalr X古意大利文r USgnwr X手語書寫符號r UXsuxr X蘇米魯亞甲文楔形文字r UThaar X 塔安那文r UThair X泰文r UCprtr X塞浦路斯文r ULinbr X線性文字 Br ULinar X線性文字 Ar UOsmar X歐斯曼亞文r USaurr X索拉什特拉文r UHanir X漢語r UEgydr X古埃及世俗體r UQaair XQaair UEgyhr X古埃及僧侶體r UCansr X加拿大原住民通用字符r UEgypr X古埃及象形文字r UTfngr! X提非納(柏柏爾文)r" UShawr# X簫柏納字符r$ UGeorr% X 喬治亞文r& UTengr' X 談格瓦文r( UGeokr) X<格魯吉亞語系(阿索他路里和努斯克胡里文)r* UOgamr+ X 歐甘文r, UDsrtr- X德瑟雷特文r. UGothr/ X 歌德文r0 UHanor1 X 哈努諾文r2 UBalir3 X 峇里文r4 UHangr5 X韓文r6 UCarir7 X 卡里亞文r8 UAvstr9 X阿維斯陀文r: UTagbr; X 南島文r< UHansr= X 簡體中文r> UHantr? X 繁體中文r@ URororA X朗格朗格象形文rB ULanarC X 藍拿文rD UBoporE X 注音符號rF UMymrrG X 緬甸文rH UTglgrI X 塔加拉文rJ UPermrK X古彼爾姆諸文rL UBugirM X 布吉斯文rN UBrairO X盲人用點字法rP UBrahrQ X 婆羅米文rR UBatkrS X 巴塔克文rT UMerorU X 麥羅埃文rV ULimbrW X 林佈文rX UMteirY X曼尼普爾文rZ UTelur[ X 泰魯古文r\ UTamlr] X 坦米爾文r^ ULatgr_ X拉丁文(蓋爾語變體)r` ULatfra X$拉丁文(尖角體活字變體)rb UKharrc X卡羅須提文rd UNkoore XNkoorf ULatnrg X 拉丁文rh UMayari X瑪雅象形文字rj UIndsrk X!印度河流域(哈拉帕文)rl UEthirm X衣索匹亞文rn UHmngro X楊松錄苗文rp UBuhdrq X 布希德文rr UCoptrs X 科普特文rt UGlagru X格拉哥里文rv URunrrw X古北歐文字rx UOrkhry X 鄂爾渾文rz UHungr{ X古匈牙利文r| UGrekr} X 希臘文r~ UCherr X 柴羅基文r UZyyyr X 一般文字r USyrcr X 敍利亞文r UBlisr X 布列斯文r UBengr X 孟加拉文r USyrer X'敘利亞文(福音體文字變體)r USyrjr X$敘利亞文(西方文字變體)r USyrnr X$敘利亞文(東方文字變體)r UKndar X 坎那達文r uUvariantsr }r (UNEDISr XNatisone 方言r UREVISEDr X 已修訂r UAREVMDAr X亞美尼亞西部r UFONIPAr X IPA 拼音r U1996r X1996r UMONOTONr X單音r UAREVELAr X亞美尼亞東部r UPOSIXr X電腦r UFONUPAr X UPA 拼音r USAAHOr XSAAHOr U1901r X1901r uUnumber_symbolsr }r Ucurrency_namesr }r (UXXXr XXXXr UDZDr X阿爾及利亞第納爾r ULVRr X拉脫維亞盧布r UKMFr X科摩羅法郎r UBOPr X玻利維亞披索r UEGPr X 埃及鎊r UBGLr X保加利亞硬列弗r UBGNr X保加利亞新列弗r UPABr X巴拿馬巴波亞r UYUMr X南斯拉夫挪威亞第納爾r UGHCr X 迦納仙蔕r UXBDr X歐洲會計單位(XBD)r UBOBr X玻利維亞貨幣單位r UXBAr X歐洲綜合單位r UDKKr X丹麥克羅納r UXBCr X歐洲會計單位(XBC)r UXBBr X歐洲貨幣單位 XBBr UBWPr X波札那 - 普拉r ULBPr X 黎巴嫩鎊r UTZSr X坦尚尼亞先令r UNADr X納米比亞元r UAOAr X安哥拉寬扎r UWSTr X西薩摩亞塔拉r UAONr X安哥拉新寬扎 (1990-2000)r UKHRr X柬埔寨瑞爾r UMYRr X馬來西亞 - 林吉特r UAOKr X安哥拉寬扎(1977-1990)r USOSr X索馬利亞先令r UKYDr X開曼群島美元r ULYDr X利比亞第納爾r UUAHr X烏克蘭格里夫那r UUAKr X烏克蘭卡本瓦那茲r UUGXr X烏干達先令r UJODr X約旦第納爾r UAORr X)安哥拉新寬扎 Reajustado (1995-1999)r USURr X 蘇聯盧布r UAWGr X 阿魯巴盾r USARr X沙烏地里雅r UFIMr X 芬蘭馬克r UHKDr X港幣r UTPEr X帝汶埃斯庫多r UMGFr X馬達加斯加法郎r UCHEr X WIR 歐元r USRGr X 蘇里南盾r UGIPr X直布羅陀鎊r UBYRr X白俄羅斯盧布r UALLr X阿爾巴尼亞列克r UXPDr X 帕拉狄昂r UUGSr X烏干達先令 (1966-1987)r UMROr X茅利塔尼亞烏吉亞r UBOVr X玻利維亞幕多r UHRKr X克羅地亞庫納r UDJFr X吉布地法郎r UHRDr X克羅地亞第納爾r UPESr X秘魯太陽幣r UEQEr X 埃奎維勒r UITLr X義大利里拉r UXAFr X西非法郎 BEACr UBNDr! X 汶萊元r" UISKr# X 冰島克朗r$ UZALr% X南非 - 蘭特 (金融)r& USRDr' X 蘇利南元r( UNIOr) X尼加拉瓜金科多巴r* ULAKr+ X 寮國基普r, UNPRr- X尼泊爾盧布r. UMZEr/ X莫桑比克埃斯庫多r0 UUYUr1 X烏拉圭披索r2 ULUCr3 X盧森堡可兌換法郎r4 UJMDr5 X 牙買加元r6 UFRFr7 X 法國法郎r8 UMZMr9 X莫三比克梅蒂卡爾r: UPHPr; X菲律賓披索r< UZARr= X 南非蘭特r> URHDr? X羅德西亞元r@ UGWPrA X幾內亞披索披索rB ULUFrC X盧森堡法郎rD UBELrE X比利時法郎 (金融)rF UBECrG X比利時法郎 (可轉換)rH UNGNrI X奈及利亞奈拉rJ UYUNrK X南斯拉夫 可轉換第納爾rL UBEFrM X比利時法郎rN UPLZrO X波蘭茲羅提 (1950-1995)rP UCRCrQ X哥斯大黎加科郎rR UDEMrS X 德國馬克rT UEEKrU X愛沙尼亞克朗rV UMWKrW X馬拉維克瓦查rX UTTDrY X千里達及托巴哥元rZ ULKRr[ X斯里蘭卡盧布r\ USKKr] X斯洛伐克克朗r^ UCVEr_ X維德角埃斯庫多r` UPKRra X巴基斯坦盧布rb UHUFrc X匈牙利 - 福林rd UROLre X舊羅馬尼亞列伊rf UXEUrg X歐洲貨幣單位 XEUrh UBMDri X 百慕達幣rj UOMRrk X 阿曼里奧rl ULSLrm X賴索托羅蒂rn ULSMro X 馬洛蒂rp UMNTrq X蒙古圖格里克rr UAMDrs X亞美尼亞德拉姆rt UYUDru X南斯拉夫第納爾硬幣rv UBUKrw X 緬甸元 BUKrx USYPry X 敘利亞鎊rz UQARr{ X卡達爾里亞爾r| UXDRr} X特殊提款權r~ UNLGr X 荷蘭盾r UGEKr X喬治庫旁拉里r UMTPr X 馬爾他鎊r jQX英鎊r UGELr X 喬治拉里r USHPr X聖赫勒拿鎊r UZWDr X 辛巴威元r USBDr X索羅門群島元r UCSKr X捷克斯洛伐克硬克朗r UKPWr X 北朝鮮幣r UCSDr X舊塞爾維亞第納爾r UTHBr X泰銖r UBYBr X!白俄羅斯新盧布 (1994-1999)r UBDTr X孟加拉塔卡r UGRDr X希臘德拉克馬r UYERr X也門里亞爾r UDDMr X東德奧斯特馬克r USZLr X史瓦濟蘭里朗吉尼r UXOFr X西非法郎 BCEAOr UMGAr X馬達加斯加艾瑞爾r UANGr X荷屬安地列斯盾r ULRDr X賴比瑞亞元r URWFr X盧安達法郎r UNOKr X挪威克羅納r UMXVr X墨西哥轉換單位(UDI)r UKESr X肯尼亞先令r jMX 澳門元r UINRr X 印度盧布r UMXNr X墨西哥 - 披索r UCZKr X 捷克克朗r UTJSr X塔吉克索莫尼r UTJRr X塔吉克斯坦盧布r UBTNr X不丹那特倫r UYDDr X葉門第納爾r UGWEr X葡屬幾內亞埃斯庫多r UCOPr X哥倫比亞披索r UMTLr X馬爾他里拉r UMURr X模里西斯盧布r UIDRr X印尼 - 盧布r UHNLr X洪都拉斯倫皮拉r UXPFr X CFP 法郎r UFJDr X 斐濟元r UETBr X衣索比亞比爾r UPENr X秘魯新太陽幣r UBZDr X 伯利茲元r UCHWr X WIR 法郎r UATSr X奧地利先令r UILPr X 以色列鎊r UZRNr X薩伊新扎伊爾r UDOPr X多明尼加披索r ULULr X盧森堡金融法郎r UTMMr X土庫曼馬納特r UTWDr X 新臺幣r UMDLr X摩杜雲列伊r UXPTr X白金r UECVr X'厄瓜多爾由里達瓦康斯坦 (UVC)r UECSr X厄瓜多蘇克雷r UBSDr X 巴哈馬元r USEKr X瑞典克羅納r UTOPr X 東加潘加r UPEIr X 祕魯因蒂r UZMKr X尚比亞克瓦查r UMVRr X馬爾地夫海島盧非亞r UXTSr XXTSr UAUDr X澳幣r UADPr X安道爾陪士特r UCUPr X 古巴披索r UIEPr X 愛爾蘭鎊r UCLFr X卡林油達佛曼跎r UBBDr X 巴貝多元r jOX 韓國圜r UGMDr X甘比亞達拉西r UGTQr X瓜地馬拉格查爾r UVEBr X委內瑞拉博利瓦r USITr X斯洛維尼亞托勒r USDPr X 蘇丹鎊r UCLPr X 智利披索r jWX歐元r UCDFr X 剛果法郎r UXCDr X格瑞那達元r UKZTr X卡扎克斯坦坦吉r URUBr X俄羅斯盧布r UXFUr X法國 UIC 法郎r UXAGr! XXAGr" UBRRr# X巴西克魯賽羅r$ UBRNr% X巴西克如爾達農瓦r& UBRLr' X 巴西里拉r( UMMKr) X 緬甸元r* UUYPr+ X烏拉圭披索 (1975-1993)r, URURr- X俄羅斯盧布 (1991-1998)r. UPLNr/ X波蘭茲羅提r0 UBREr1 X巴西克魯賽羅 (1990-1993)r2 UPYGr3 X巴拉圭瓜拉尼r4 UBRCr5 X巴西克魯賽羅 (1986-1989)r6 UBRBr7 X'巴西克魯薩多農瓦(1967-1986)r8 USVCr9 X薩爾瓦多科郎r: UAEDr; X!阿拉伯聯合大公國迪爾汗r< UGNSr= X幾內亞西里r> UMKDr? X馬其頓第納爾r@ UAZMrA X阿塞拜彊馬特納rB UAZNrC X亞塞拜然蒙納特rD UUSNrE X美元 (第二天)rF UGQErG X赤道幾內亞埃奎勒rH UVUVrI X萬那杜萬杜rJ UBADrK X%波士尼亞-黑塞哥維那第納爾rL UGNFrM X幾內亞法郎rN UMXPrO X墨西哥銀披索 (1861-1992)rP UIQDrQ X伊拉克第納爾rR UERNrS X厄立特里亞納克法rT UBAMrU X+波士尼亞-黑塞哥維那可轉換馬克rV USCRrW X塞舌爾群島盧布rX UCADrY X加幣rZ USDDr[ X蘇丹第納爾r\ UCYPr] X賽浦路斯鎊r^ UKWDr_ X科威特第納爾r` UBIFra X蒲隆地法郎rb ULTTrc X立陶宛特羅rd UPGKre X巴布亞紐幾內亞基那rf ULTLrg X立陶宛里塔rh jUX 新加坡幣ri UUZSrj X烏茲別克斯坦薩木rk USTDrl X'聖多美島和普林西比島多布拉rm UXFOrn X法國金法郎ro UMLFrp X 馬里法郎rq UESPrr X西班牙陪士特rs UIRRrt X伊朗里亞爾ru UZRZrv X扎伊爾扎伊爾rw UCNYrx X 人民幣ry USLLrz X獅子山利昂r{ UTNDr| X突尼西亞第納爾r} UGYDr~ X 圭亞那元r UESBr X-西班牙比塞塔(可轉換會計單位)r UESAr X$西班牙比塞塔(會計單位)r jSX 紐西蘭幣r UFKPr X福克蘭群島鎊r ULVLr X拉脫維亞拉特銀幣r UUSSr X美元 (同一天)r UARPr X阿根廷披索(1983-1985)r UKGSr X吉爾吉斯索馬r UARSr X阿根廷披索r UILSr X以色列新謝克爾r URONr X羅馬尼亞列伊r UBHDr X巴林第納爾r UJPYr X日圓r UARAr X阿根廷奧斯特納爾r UPTEr X葡萄牙埃斯庫多r UXAUr X黃金r uUmonthsr }r U stand-aloner }r (Uwider }r (KX1月r KX2月r KX3月r KX4月r KX5月r KX6月r KX7月r KX8月r K X9月r K X10月r K X11月r K X12月r uU abbreviatedr }r (KX1月r KX2月r KX3月r KX4月r KX5月r KX6月r KX7月r KX8月r K X9月r K X10月r K X11月r K X12月r uUnarrowr }r (KX1r KX2r KX3r KX4r KX5r KX6r KX7r KX8r K X9r K X10r K X11r K X12r uusUcurrency_formatsr }r Udaysr }r Uformatr }r U abbreviatedr }r (KX週一r KX週二r KX週三r KX週四r KX週五r KX週六r KX週日r ussU meta_zonesr }r (U Turkmenistanr }r (Ucommonr Ulongr }r (Udaylightr X土庫曼夏令時間r Ustandardr X土庫曼時間r uuU Kuybyshevr }r (j j }r (j X古比雪夫夏令時間r j X古比雪夫時間r uuUArabianr }r (Ushortr }r (Ugenericr XAT(阿拉伯)r j XADT(阿拉伯)r j XAST(阿拉伯)r uj j }r (j X阿拉伯時間r j X阿拉伯夏令時間r j X阿拉伯標準時間r uuUAustralia_Easternr }r (j j }r (j X澳洲東部時間r j X澳洲東部夏令時間r j X澳洲東部標準時間r uuU Argentinar }r (j j }r (j X阿根廷夏令時間r j X阿根廷時間r uuU Alaska_Hawaiir }r (j j }r (j X阿拉斯加-夏威夷時間r j X"阿拉斯加-夏威夷夏令時間r j X"阿拉斯加-夏威夷標準時間r uuUAzoresr }r (j j }r (j X亞速爾群島夏令時間r j X亞速爾群島時間r uuUPierre_Miquelonr }r (j j }r (j X聖彼德與密啟崙時間r j X!聖彼德與密啟崙夏令時間r j X!聖彼德與密啟崙標準時間r uuUEurope_Centralr }r (j j }r (j X中歐夏令時間r j X中歐標準時間r uuU Aktyubinskr }r (j j }r (j X阿克秋賓斯克夏令時間r j X阿克秋賓斯克時間r uuUBeringr }r (j }r (j XBT(白令)r! j XBDT(白令)r" j XBST(白令)r# uj j }r$ (j X 白令時間r% j X白令夏令時間r& j X白令標準時間r' uuU Qyzylordar( }r) (j j }r* (j X克孜勒奧爾達夏令時間r+ j X克孜勒奧爾達時間r, uuUFrunzer- }r. (j j }r/ (j X伏龍芝夏令時間r0 j X伏龍芝時間r1 uuUChinar2 }r3 (j }r4 (j XCT(中國)r5 j XCDT(中國)r6 j XCST(中國)r7 uj j }r8 (j X 中國時間r9 j X中國夏令時間r: j X中國標準時間r; uuUYerevanr< }r= (j j }r> (j X葉里溫夏令時間r? j X葉里溫時間r@ uuUKashgarrA }rB (j j }rC j X 喀什時間rD suU East_TimorrE }rF (j j }rG j X東帝汶時間rH suUAfrica_EasternrI }rJ (j j }rK j X 東非時間rL suU AshkhabadrM }rN (j j }rO (j X阿什哈巴德夏令時間rP j X阿什哈巴德時間rQ uuUAlaskarR }rS (j }rT (j X阿拉斯加時間rU j X阿拉斯加標準時間rV uj j }rW (j X阿拉斯加時間rX j X阿拉斯加夏令時間rY j X阿拉斯加標準時間rZ uuUAmerica_Easternr[ }r\ (j j }r] (j X 東部時間r^ j X東部夏令時間r_ j X東部標準時間r` uuUAmerica_Centralra }rb (j j }rc (j X 中部時間rd j X中部夏令時間re j X中部標準時間rf uuUPakistanrg }rh (j j }ri (j X巴基斯坦夏令時間rj j X巴基斯坦時間rk uuUSamoarl }rm (j j }rn j X薩摩亞標準時間ro suUMacaurp }rq (j j }rr (j X澳門夏令時間rs j X 澳門時間rt uuUGuamru }rv (j }rw j X GST (關島)rx sj j }ry j X關島標準時間rz suUIndiar{ }r| (j j }r} j X印度標準時間r~ suU Azerbaijanr }r (j j }r (j X亞塞拜然夏令時間r j X亞塞拜然時間r uuU Tajikistanr }r (j j }r j X塔吉克時間r suUTurkeyr }r (j j }r (j X土耳其夏令時間r j X土耳其時間r uuU Choibalsanr }r (j j }r (j X喬巴山夏令時間r j X喬巴山時間r uuU Shevchenkor }r (j j }r j X舍甫琴科時間r suU Bangladeshr }r (j j }r j X孟加拉時間r suUDaccar }r (j j }r j X 達卡時間r suUMongoliar }r (j j }r (j X烏蘭巴托夏令時間r j X烏蘭巴托時間r uuU Samarkandr }r (j }r (j XSAMST(撒馬爾罕)r j XSAMT(撒馬爾罕)r uj j }r (j X撒馬爾罕夏令時間r j X撒馬爾罕時間r uuUIndonesia_Centralr }r (j j }r j X印尼中部時間r suUKorear }r (j j }r (j X 韓國時間r j X韓國夏令時間r j X韓國標準時間r uuUCubar }r (j }r (j XCDT(古巴)r j XCST(古巴)r uj uUArgentina_Westernr }r (j j }r (j X阿根廷西部時間r j X阿根廷西部夏令時間r j X阿根廷西部時間r uuUAmazonr }r (j j }r (j X亞馬遜夏令時間r j X亞馬遜時間r uuU Dutch_Guianar }r (j j }r (j X荷屬圭亞那時間r j X荷屬圭亞那夏令時間r j X荷屬圭亞那時間r uuULong_Shur }r (j j }r j X 隴蜀時間r suUArmeniar }r (j }r (j XAMST(亞美尼亞)r j XAMT(亞美尼亞)r uj j }r (j X亞美尼亞夏令時間r j X亞美尼亞時間r uuUGreenland_Westernr }r (j j }r (j X格陵蘭西部時間r j X格陵蘭西部夏令時間r j X格陵蘭西部時間r uuUKarachir }r (j j }r j X喀拉蚩時間r suUBrasiliar }r (j j }r (j X巴西利亞時間r j X巴西利亞夏令時間r j X巴西利亞時間r uuUAfrica_Southernr }r (j j }r j X南非標準時間r suU Newfoundlandr }r (j j }r (j X紐芬蘭時間r j X紐芬蘭夏令時間r j X紐芬蘭標準時間r uuU Kyrgystanr }r (j j }r j X吉爾吉斯時間r suUKazakhstan_Westernr }r (j j }r (j X西哈薩克時間r j X西哈薩克標準時間r uuUAfrica_Centralr }r (j j }r j X 中非時間r suUMalaysiar }r (j j }rj X馬來西亞時間rsuUJapanr}r(j j }r(j X日本夏令時間rj X日本標準時間ruuU Sverdlovskr}r(j j }r (j X$斯維爾德洛夫斯克夏令時間r j X斯維爾德洛夫斯克時間r uuU Kwajaleinr }r (j j }rj X瓜加林環礁時間rsuUAqtober}r(j }r(j XAQTST(阿克托比)rj XAQTT(阿克托比)ruj j }r(j X阿克托比夏令時間rj X阿克托比時間ruuUKazakhstan_Easternr}r(j j }r(j X東哈薩克時間rj X東哈薩克標準時間ruuU Yekaterinburgr}r(j j }r(j X凱薩琳堡夏令時間r j X凱薩琳堡時間r!uuUEcuadorr"}r#(j j }r$j X厄瓜多時間r%suUMalayar&}r'(j j }r(j X馬來亞時間r)suUAqtaur*}r+(j }r,(j XAQTST(阿克陶)r-j XAQTT(阿克陶)r.uj j }r/(j X阿克陶夏令時間r0j X阿克陶時間r1uuUAmerica_Mountainr2}r3(j j }r4(j X 山區時間r5j X山區日光節約時間r6j X山區標準時間r7uuUHawaii_Aleutianr8}r9(j j }r:j X夏威夷-阿留申標準時間r;suUChangbair<}r=(j j }r>j X長白山時間r?suUChiler@}rA(j j }rB(j X 智利時間rCj X智利夏令時間rDj X 智利時間rEuuUDushanberF}rG(j j }rH(j X杜尚別夏令時間rIj X杜尚別時間rJuuUGeorgiarK}rL(j j }rM(j X喬治亞夏令時間rNj X喬治亞時間rOuuUIndonesia_WesternrP}rQ(j j }rRj X印尼西部時間rSsuUGreenland_EasternrT}rU(j j }rV(j X格陵蘭東部時間rWj X格陵蘭東部夏令時間rXj X格陵蘭東部時間rYuuUGMTrZ}r[(j j }r\j X格林威治標準時間r]suUMarshall_Islandsr^}r_(j j }r`j X馬紹爾群島時間rasuU Uzbekistanrb}rc(j j }rd(j X烏茲別克夏令時間rej X烏茲別克時間rfuuU Kizilordarg}rh(j j }ri(j X吉力羅達夏令時間rjj X吉力羅達時間rkuuUAustralia_Westernrl}rm(j j }rn(j X澳洲西部時間roj X澳洲西部夏令時間rpj X澳洲西部標準時間rquuUBakurr}rs(j j }rt(j X巴庫夏令時間ruj X 巴庫時間rvuuUEurope_Easternrw}rx(j j }ry(j X東歐夏令時間rzj X東歐標準時間r{uuUBhutanr|}r}(j j }r~j X 不丹時間rsuUBorneor}r(j j }r(j X婆羅洲夏令時間rj X婆羅洲時間ruuU New_Zealandr}r(j j }r(j X紐西蘭時間rj X紐西蘭夏令時間rj X紐西蘭標準時間ruuU Galapagosr}r(j j }rj X加拉帕戈群島時間rsuU Lord_Hower}r(j j }r(j X豪勳爵島時間rj X豪勳爵島夏令時間rj X豪勳爵島標準時間ruuUSurinamer}r(j j }r(j X蘇利南時間rj X蘇利南時間ruuUAcrer}r(j }r(j XACST(艾克)rj XACT(艾克)ruj j }r(j X艾克夏令時間rj X 艾克時間ruuUIsraelr}r(j }rj XIST(以色列)rsj j }r(j X以色列時間rj X以色列夏令時間rj X以色列標準時間ruuUAfrica_Westernr}r(j j }r(j X西非夏令時間rj X 西非時間ruuUTashkentr}r(j j }r(j X塔什干夏令時間rj X塔什干時間ruuUIndonesia_Easternr}r(j j }rj X印尼東部時間rsuUAustralia_Centralr}r(j j }r(j X澳洲中部時間rj X澳洲中部夏令時間rj X澳洲中部標準時間ruuUAtlanticr}r(j j }r(j X大西洋時間rj X大西洋夏令時間rj X大西洋標準時間ruuU North_Marianar}r(j j }rj X北馬里亞納群島時間rsuULankar}r(j j }rj X 蘭卡時間rsuUEurope_Westernr}r(j j }r(j X西歐夏令時間rj X 西歐時間ruuUUrumqir}r(j j }rj X烏魯木齊時間rsuUAmerica_Pacificr}r(j j }r(j X太平洋時間rj X太平洋夏令時間rj X太平洋標準時間ruuUAlmatyr}r(j j }r(j X阿拉木圖夏令時間rj X阿拉木圖時間ruuUTbilisir}r(j j }r(j X第比利斯夏令時間rj X第比利斯時間ruuUSamarar}r(j j }r(j X薩馬拉夏令時間rj X薩馬拉時間ruuUGreenland_Centralr}r(j j }r(j X格陵蘭中部夏令時間rj X格陵蘭中部時間ruuUUralskr}r(j j }r(j X烏拉斯克夏令時間rj X烏拉斯克時間ruuUYukonr}r(j j }r(j X 育空時間rj X育空夏令時間rj X育空標準時間ruuuUerasr}rUwider}r(KX 西元前rKX西元rusu.PK[ȽHH(site-packages/babel/localedata/en_JM.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqUpatternqX ¤#,##0.00q Uprefixq!X¤q"X-¤q#q$Uexp_plusq%NUgroupingq&KKq'ubsU languagesq(}q)U territoriesq*}q+U time_zonesq,}q-Uscriptsq.}q/Udecimal_formatsq0}q1U meta_zonesq2}q3Uvariantsq4}q5Ucurrency_namesq6}q7u.PK[99(site-packages/babel/localedata/zh_CN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/ee_TG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[-%site-packages/babel/localedata/de.datnu[}q(U zone_formatsq}q(UregionqX%sqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1. QuartalqKX 2. QuartalqKX 3. QuartalqKX 4. QuartalquU abbreviatedq}q(KXQ1q KXQ2q!KXQ3q"KXQ4q#uuuUperiodsq$}q%(Uamq&Xvorm.q'Upmq(Xnachm.q)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4X %qFhFqGh7KKqHh9X#,##0 %qIh;h5hNh?KKqKubsU week_dataqL}qM(Umin_daysqNKU weekend_startqOKU first_dayqPKU weekend_endqQKuU time_formatsqR}qS(UmediumqTcbabel.dates DateTimePattern qU)qV}qW(h9XHH:mm:ssqXUformatqYX%(HH)s:%(mm)s:%(ss)sqZubUfullq[hU)q\}q](h9X HH:mm:ss vq^hYX%(HH)s:%(mm)s:%(ss)s %(v)sq_ubUlongq`hU)qa}qb(h9X HH:mm:ss zqchYX%(HH)s:%(mm)s:%(ss)s %(z)sqdubUshortqehU)qf}qg(h9XHH:mmqhhYX %(HH)s:%(mm)sqiubuU languagesqj}qk(UgvqlXManxqmUguqnXGujaratiqoUscnqpX SizilianischqqUromqrXZigeunerspracheqsUalgqtXAlgonkin-SprachenquUaleqvX AleutischqwUscoqxX SchottischqyUmniqzXMeithei-Spracheq{Ugdq|XSchottisches Gälischq}Ugaq~XIrischqUmnoqXManobo-SpracheqUosaqX Osage-SpracheqUgnqXGuaraniqUaltqX Süd-AltaischqUglqX GalizischqUmwrqXMarwariqUtyqX TahitischqUtwqXTwiqUttqX TatarischqUtrqX TürkischqUtsqXTsongaqUtnqXTswana-SpracheqUtoqX TongaischqUausqXAustralische SprachenqUavqXAwarischqUtkqX TurkmenischqUthqX ThailändischqUroaqXRomanische SpracheqUtgqX TadschikischqUteqXTeluguqUugaqX UgaritischqUmwlqX MirandesischqUkcgqXTyapqUsmiqXLappischqUfatqX Fanti-SpracheqUfanqXPangwe-SpracheqUwoqXWolofqUrmqXRätoromanischqUdinqX Dinka-SpracheqUblaqXBlackfoot-SpracheqUcmcqX Cham-SprachenqUmlqX MalayalamqUzhqX ChinesischqUtemqXTemneqUen_CAqXKanadisches EnglischqUnwcqX Alt-NewariqUzaqXZhuangqUcauqXKaukasische SpracheqUzuqXZuluqUterqXTereno-SpracheqUtetqX Tetum-SpracheqUmncqX MandschurischqUkutqXKutenai-SpracheqUsukqXSukuma-SpracheqUkumqX KumükischqUsusqXSusuqUnewqXNewariqUsuxqX SumerischqUdenqXSlaveyqUmenqX Mende-SpracheqUmulqX MehrsprachigqUlezqXLesgischqUrootqXRootqUekaqXEkajukqUakkqX AkkadischqUdraqXDrawidische SpracheqUjrbqXJüdisch-ArabischqUsgnqXGebärdenspracheqUsgaqX AltirischqUapaqXApachen-SpracheqUbraqX Braj-BhakhaqUchbqXChibcha-SprachenqUchgqX TschagataischqUchkqX TrukesischqUchmrXTscheremissischrUchnrXChinookrUchorXChoctawrUchprX ChipewyanrUchrrXCherokeer Uchyr XCheyenner Utir XTigrinjar UvotrXWotischrUmgrXMalagassi-SpracherUibarXIbanrUmorX MoldauischrUmnrX MongolischrUmirXMaorirUmhrXMarschallesischrUmkrX MazedonischrUmtrX MaltesischrUcair X$Zentralamerikanische Indianerspracher!Udelr"XDelaware-Spracher#Umsr$X Malaiischr%Umrr&XMarathir'Utar(X Tamilischr)Umyr*X Birmanischr+Ucadr,XCaddor-Usrnr.X Srananischr/Utair0X Thaispracher1Uafhr2XAfrihilir3Usitr4XSinotibetische Spracher5Uenmr6XMittelenglischr7Uen_AUr8XAustralisches Englischr9Unynr:XNyankoler;Unyor<XNyoror=Unymr>XNyamwezi-Spracher?Usior@XSioux-SprachenrAUmaprBXAustronesische SprachenrCUmasrDXMassai-SpracherEUlahrFXLahndarGUladrHX JudenspanischrIUfyrJX FriesischrKUsnkrLXSoninke-SpracherMUfarNXPersischrOUmadrPX MaduresischrQUmagrRXKhottarSUmairTXMaithilirUUfirVXFinnischrWUfjrXX FidschianischrYUmanrZXManding-Spracher[Uegyr\X Ägyptischr]Uzndr^X Zande-Spracher_Ussr`XSwaziraUsrrbXSerbischrcUsqrdX AlbanischreUswrfXSuahelirgUsvrhX SchwedischriUsurjX SundanesischrkUstrlXSüd-Sotho-SprachermUskrnX SlowakischroUsirpX SinghalesischrqUshrrXSerbo-KroatischrsUsortXSomaliruUsnrvXShonarwUsmrxX SamoanischryUslrzX Slowenischr{Uscr|XSardischr}Usar~XSanskritrUsgrXSangorUserX Nord-SamischrUsdrXSindhirUzenrXZenagarUkbdrX KabardinischrUafarXAfro-Asiatische SpracherUcsbrX KaschubischrUlgrX Ganda-SpracherUlbrX LuxemburgischrUfiurXFinnougrische SpracherUlnrXLingalarUlorXLaotischrUlirX LimburgischrUbynrXBlinrUltrX LitauischrUlurXLubarUfilrXFilipinorUyirXJiddischrUnonrX AltnordischrUcebrXCebuanorUyorXYorubarUnogrXNogairUbatrXBaltische SpracherUdakrXDakota-SpracherUdarrX DarginischrUdayrXDajakrUssarXNilosaharanische SpracherUkperXKpelle-SpracherUelrX GriechischrUeorX EsperantorUenrXEnglischrUlamrX Lamba-SpracherUeerX Ewe-SpracherUmdfrXMoksharUfrrX FranzösischrUmdrrX MandaresischrUetrXEstnischrUesrXSpanischrUrurXRussischrUgonrX Gondi-SpracherUgohrXAlthochdeutschrUsmsrXSkolt-LappischrUsmnrXInari-LappischrUsmjrX Lule-LappischrUde_ATrXÖsterreichisches DeutschrUgotrXGotischrUrnrX Rundi-SpracherUrorX RumänischrUdsbrXNiedersorbischrUsmarX Süd-SamischrUgorrX MongondourUastrX AsturianischrUwalrXWalamo-SpracherUcrhrX KrimtatarischrUathrXAthapaskische SprachenrUgezrXGeezrUxhrXXhosarUffrXFulrUkforXKororUmakrX MakassarischrUzaprX ZapotekischrUkokrXKonkanirUzxxrXKeine SprachinhalterUkosrX KosraeanischrUforX FäröischrUtogrXTsonga-SpracherUhuprXHuparUudmrX UdmurtischrUbejrXBedauyer Ubemr X Bemba-Spracher Utsir XTsimshian-Spracher UberrX BerberspracherUnzirXNzimarUsairX!Südamerikanische IndianerspracherUangrX AltenglischrUprarXPrakritrUbhorX BhodschpurirUsalrXSalish-SpracherUprorXAltprovenzalischrUrajrX RajasthanirUsadr XSandawe-Spracher!Uanpr"XAngikar#Ues_419r$XLateinamerikanisches Spanischr%Urapr&XOsterinsel-Spracher'Usasr(XSasakr)Unqor*XN’Kor+Ucarr,XKaribische Sprachenr-Uminr.XMinangkabau-Spracher/Umicr0XMicmac-Spracher1Uefir2XEfikr3Uarnr4X Araukanischr5Uypkr6X Yupik-Spracher7Umisr8XVerschiedene Sprachenr9Ukacr:XKachin-Spracher;Ukabr<X Kabylischr=Ukaar>XKarakalpakischr?Ukajr@XJjurAUkamrBXKambarCUkarrDX KarenischrEUkawrFXKawirGUfr_CHrHXSchweizer FranzösischrIUtyvrJX TuwinischrKUfr_CArLXKanadisches FranzösischrMUkarNX GeorgischrOUdoirPXDogrirQUkgrRXKongorSUkkrTX KasachischrUUkjrVXKwanyamarWUkirXXKikuyu-SpracherYUkorZX Koreanischr[Uknr\XKannadar]Ukmr^XKambodschanischr_Uklr`XGrönländischraUksrbX KaschmirischrcUkrrdXKanuri-SprachereUkwrfXKornischrgUkvrhX Komi-SpracheriUkurjXKurdischrkUkyrlX KirgisischrmUtklrnX TokelauanischroUbuarpX BurjatischrqUmgarrX MittelirischrsUhitrtX HethitischruUdyurvX Dyula-SpracherwUderxXDeutschryUdarzXDänischr{Udzr|X Bhutanischr}Uluir~XLuiseno-SpracherUdvrX MaledivischrUhilrXHiligaynon-SpracherUhimrX HimachalirUgemrXGermanische SpracherUcrprXKreolische SprachenrUqurXQuechuarUbasrX Basaa-SpracherUgbarX Gbaya-SpracherUbadrX Banda-SpracherUbanrX BalinesischrUbalrX BelutschischrUshnrX Schan-SpracherUbairXBamileke-SpracherUarprXArapaho-SpracherUartrX KunstspracherUarwrXArawak-SprachenrUarcrX AramäischrUen_USrXEnglisch (USA)rUsemrXSemitische SpracherUselrX SelkupischrUnubrXNubische SprachenrUbtkrXBatakrUlusrXLushai-SpracherUmusrXMuskogee-SprachenrUluarX Luba-LuluarUirorXIrokesische SprachenrUirarXIranische SpracherUmunrXMunda-SprachenrUlunrX Lunda-SpracherUluorX Luo-SpracherUwarX WallonischrUtuprX Tupi-SprachenrUjvrX JavanischrUzblrX Bliss-SymbolerUtutrXAltaische SpracherUtumrXTumbuka-SpracherUjarX JapanischrUcoprXKoptischrUilorXIlokano-SpracherUlarXLateinrUgwirXKutchin-SpracherUundrXUnbestimmte SpracherUtlirXTlingit-SpracherUtlhrX KlingonischrUchrXChamorro-SpracherUcorXKorsischrUcarX KatalanischrUcerXTschetschenischrUponrX PonapeanischrUcyrXKymrischrUsahrX JakutischrUcsrX TschechischrUcrrXCreerUbntrX BantuspracherUcvrXTschuwaschischrUcurXKirchenslawischrUlvrXLettischrUdumrXMittelniederländischrUptrX PortugiesischrUduarXDualarUfrorXAltfranzösischrUyaprX YapesischrUfrmrXMittelfranzösischrUtivrX Tiv-SpracherUfrsrX OstfriesischrUfrrrX NordfriesischrUyaorX Yao-SpracherUparX PandschabischrUxalrX Kalmückischr Ues_ESr XIberisches Spanischr Upir XPalir Uen_GBrXBritisches EnglischrUgayrXGayorUotorXOtomangue-SprachenrUotarX OsmanischrUhmnrX Miao-SprachenrUmyvrXErzyarUgaarX Ga-SpracherUfurrX FriulischrUkhirXKhoisan-SpracherUainr X Ainu-Spracher!Urarr"XRarotonganischr#Uslar$XSlawische Spracher%Uver&X Venda-Spracher'Uvir(X Vietnamesischr)Uisr*X Isländischr+Ukhor,XSakischr-Uiur.XInukitutr/Uitr0X Italienischr1Uvor2XVolapükr3Uiir4X Sichuan Yir5Uikr6XInupiakr7Uior8X Ido-Spracher9Uiner:XIndogermanische Spracher;Uiar<X Interlinguar=Ujprr>XJüdisch-Persischr?Uier@X InterlinguerAUidrBX IndonesischrCUigrDX Igbo-SpracherEUpaprFX PapiamentorGUeworHXEwondorIUpaurJXPalaurKUpaarLX PapuaspracherMUpagrNXPangasinan-SpracherOUsatrPXSantalirQUpalrRXMittelpersischrSUpamrTXPampanggan-SpracherUUsycrVX AltsyrischrWUphirXX"Philippinen-Austronesische SpracherYUcelrZXKeltische Spracher[Uphnr\X Phönikischr]Unicr^XNigerkordofanische Spracher_Uniar`X Nias-SpracheraUdgrrbXDogribrcUsyrrdXSyrischreUniurfX Niue-SprachergUgswrhXSchweizerdeutschriUcchrjXAtsamrkUjborlXLojbanrmUnahrnXNahuatlroUsamrpX SamaritanischrqUhairrX Haida-SprachersUgmhrtXMittelhochdeutschruUcusrvXKuschitische SpracherwUwenrxXSorbischryUadyrzXAdygair{Uelxr|XElamischr}Uadar~XAdangmerUpt_PTrXIberisches PortugiesischrUhawrX HawaiianischrUbinrX Bini-SpracherUbikrX Bikol-SpracherUpt_BRrXBrasilianisches PortugiesischrUmosrX Mossi-SpracherUmohrXMohawk-SpracherUtlrXTagalogrUzh_HansrXVereinfachtes ChinesischrUzh_HantrXTraditionelles ChinesischrUtvlrX ElliceanischrUijorX Ijo-SpracherUkmbrXKimbundu-SpracherUpeorX AltpersischrUumbrXMbundu-SpracherUtmhrXTamaseqrUfonrX Fon-SpracherUhsbrX ObersorbischrUberX WeißrussischrUbgrX BulgarischrUbarX BaschkirischrUpsrXPaschturUbmrXBambara-SpracherUbnrX BengalischrUborX TibetischrUbhrX BiharischrUbirXBislamarUbrrX BretonischrUbsrXBosnischrUruprX AromunischrUzzarXZazarUomrXOromorUojrXOjibwa-SpracherUacerX Aceh-SpracherUachrXAcholi-SpracherUocrX OkzitanischrUkrurX Oraon-SpracherUsrrrX Serer-SpracherUkrorX Kru-SprachenrUkrlrX KarelischrUkrcrXKaratschaiisch-BalkarischrUndsrX NiederdeutschrUosrX OssetischrUorrXOrijarUsogrXSogdischrUnsorXNord-Sotho-SpracherUsonrXSonghai-SpracherUde_CHrXSchweizer HochdeutschrUvairX Vai-SpracherUwakrX WakashanischrUlolrXMongorUmkhrXMon-Khmer-SpracherUawarXAwadhirUlozrX Rotse-SpracherUgilrX GilbertesischrUwasrX Washo-SpracherUwarrXWarayrUhzrXHerero-SpracherUhyrX ArmenischrUanrX AragonesischrUsidrXSidamorUhrrX KroatischrUhtrX KreolischrUhurX UngarischrUhirXHindirUhorX Hiri-MoturUharXHausarUbugrX BuginesischrUherX Hebräischr Uuzr X Usbekischr Uurr XUrdur UplrXPolnischrUukrX UkrainischrUugrX UigurischrUaarXAfarrUabrX AbchasischrUaerX AvestischrUafrX AfrikaansrUakrXAkanrUamrX AmharischrUnl_BEr X Flämischr!Ueur"XBaskischr#Uasr$X Assamesischr%Uarr&XArabischr'Uinhr(XIngushr)Utpir*XNeumelanesischr+Umynr,X Maya-Sprachenr-Uayr.XAymarar/Ukhar0X Khasi-Spracher1Uazr2XAserbaidschanischr3Uincr4XIndoarische Spracher5Unlr6XNiederländischr7Unnr8XNorwegisch Nynorskr9Unor:X Norwegischr;Unar<X Nauruischr=Unbr>XNorwegisch Bokmålr?Unair@X!Nordamerikanische IndianerspracherAUndrBXNord-Ndebele-SpracherCUnerDX NepalesischrEUngrFXNdongarGUnyrHX Chewa-SpracherIUnaprJXNeapolitanischrKUgrbrLX Grebo-SpracherMUgrcrNX AltgriechischrOUnrrPXSüd-Ndebele-SpracherQUtigrRXTigrerSUnvrTXNavajo-SpracherUUzunrVX Zuni-SpracherWUrwrXX RuandischrYUcperZXKreolisch-Englische Spracher[Ucpfr\XKreolisch-Französische Spracher]Ucppr^X Kreolisch-Portugiesische Spracher_uU territoriesr`}ra(UBDrbX BangladeschrcUBErdXBelgienreUBFrfX Burkina FasorgUBGrhX BulgarienriUVErjX VenezuelarkUBArlXBosnien und HerzegowinarmUBBrnXBarbadosroUWFrpXWallis und FutunarqUBLrrXSt. BarthélemyrsUBMrtXBermudaruUBNrvXBrunei DarussalamrwUBOrxXBolivienryUBHrzXBahrainr{UBIr|XBurundir}UBJr~XBeninrUBTrXBhutanrU011rX WestafrikarUBVrX BouvetinselrUBWrXBotsuanarU014rX OstafrikarU015rX NordafrikarUBRrX BrasilienrU017rX ZentralafrikarU018rXSüdliches AfrikarU019rXNord-, Mittel- und SüdamerikarUBYrX WeißrusslandrUBZrXBelizerULVrXLettlandrURWrXRuandarURSrXSerbienrUTLrXOsttimorrURErXRéunionrUTMrX TurkmenistanrUOMrXOmanrUTJrX TadschikistanrUROrX RumänienrUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX.Südgeorgien und die Südlichen SandwichinselnrUGRrX GriechenlandrUGQrXÄquatorialguinearUGPrX GuadelouperUJPrXJapanrUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXFranzösisch-GuayanarUGErXGeorgienrUGDrXGrenadarU021rXNördliches AmerikarUGBrXVereinigtes KönigreichrUGArXGabunrUSVrX El SalvadorrUGNrXGuinearUGMrXGambiarUGLrX GrönlandrU029rXKaribikrUGIrX GibraltarrUGHrXGhanarUJErXJerseyrUTNrXTunesienrUJMrXJamaikarU013rX MittelamerikarUWSrXSamoarU419rXLateinamerika und KaribikrUHRrXKroatienrUBSrXBahamasrUHTrXHaitirUHUrXUngarnrUHKrXSonderverwaltungszone HongkongrU039rX SüdeuroparUHNrXHondurasrUFIrXFinnlandrU142rXAsienrU030rXOstasienrU034rX SüdasienrU035rX SüdostasienrUPRrX Puerto RicorUPSrXPalästinensische GebieterU830rX KanalinselnrUFKrXFalklandinselnrUIOrX)Britisches Territorium im Indischen Ozeanr UPWr XPalaur UPTr XPortugalr USJrXSvalbard und Jan MayenrUMDrXRepublik MoldaurUFMrX MikronesienrUIQrXIrakrUPArXPanamarUPFrXFranzösisch-PolynesienrUPGrXPapua-NeuguinearUPErXPerurUPKrXPakistanrUPHr X Philippinenr!UFOr"XFäröerr#UPNr$XPitcairnr%UPLr&XPolenr'UPMr(XSt. Pierre und Miquelonr)UZMr*XSambiar+UEHr,X Westsaharar-URUr.XRussische Föderationr/UEEr0XEstlandr1UEGr2XÄgyptenr3UZAr4X Südafrikar5UECr6XEcuadorr7UITr8XItalienr9UVNr:XVietnamr;UZZr<X!Unbekannte oder ungültige Regionr=USBr>X Salomonenr?UETr@X ÄthiopienrAUSOrBXSomaliarCUZWrDXSimbabwerEUSArFX Saudi-ArabienrGUESrHXSpanienrIUERrJXEritrearKUMErLX MontenegrorMUAQrNX AntarktisrOUMGrPX MadagaskarrQUMFrRX St. MartinrSUMArTXMarokkorUUMCrVXMonacorWUUZrXX UsbekistanrYUMMrZXMyanmarr[UMLr\XMalir]UMOr^XSonderverwaltungszone Macaor_UMNr`XMongoleiraUHMrbXHeard- und McDonald-InselnrcUASrdXAmerikanisch-SamoareUMKrfX MazedonienrgUMUrhX MauritiusriUMTrjXMaltarkUMWrlXMalawirmUMVrnX MaledivenroUMQrpX MartiniquerqUMPrrXNördliche MarianenrsUMSrtX MontserratruUMRrvX MauretanienrwUIMrxX Isle of ManryUUGrzXUgandar{UTZr|XTansaniar}UMYr~XMalaysiarUMXrXMexikorUILrXIsraelrUFRrX FrankreichrUAWrXArubarUDOrXDominikanische RepublikrUSHrX St. HelenarUVCrXSt. Vincent und die GrenadinenrU054rX MelanesienrUDJrX DschibutirUFJrXFidschirU057rXMikronesisches InselgebietrU172rX"Gemeinschaft Unabhängiger StaatenrU053rXAustralien und NeuseelandrUNIrX NicaraguarUNLrX NiederlanderUNOrXNorwegenrUNArXNamibiarUVUrXVanuaturUNCrX NeukaledonienrUNErXNigerrUNFrX NorfolkinselrUNGrXNigeriarUNZrX NeuseelandrUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolynesienrUCIrXCôte d’IvoirerUCHrXSchweizrUCOrX KolumbienrUCNrXChinarUCMrXKamerunrUCLrXChilerUCCrX KokosinselnrUCArXKanadarUCGrXKongorUCFrXZentralafrikanische RepublikrUCDrXDemokratische Republik KongorUCZrXTschechische RepublikrUCYrXZypernrUCXrXWeihnachtsinselrUCSrXSerbien und MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Kap VerderUCUrXKubarUSZrX SwasilandrUSYrXSyrienrUKGrX KirgisistanrUKErXKeniarUSRrXSurinamerU143rX ZentralasienrUKHrX KambodscharUKNrXSt. Kitts und NevisrUKMrXKomorenrUSTrXSão Tomé und PrínciperUSKrXSlowakeirUKRrXRepublik KorearUSIrX SlowenienrUKPrX!Demokratische Volksrepublik KorearUKWrXKuwaitrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeychellenrUKZrX KasachstanrUKYrX KaimaninselnrUSGrXSingapurrUSErXSchwedenr USDr XSudanr U151r X Osteuropar U150rXEuroparUDMrXDominicarU155rX WesteuroparU154rX NordeuroparUVGrXBritische JungferninselnrUDErX DeutschlandrUYErXJemenrUMHrXMarshallinselnrU062rXSüd-ZentralasienrUDZr XAlgerienr!UUSr"XVereinigte Staatenr#UUYr$XUruguayr%UYTr&XMayotter'UUMr(XAmerikanisch-Ozeanienr)ULBr*XLibanonr+ULCr,X St. Luciar-ULAr.XLaosr/UTVr0XTuvalur1UTWr2XTaiwanr3UTTr4XTrinidad und Tobagor5UTRr6XTürkeir7ULKr8X Sri Lankar9ULIr:X Liechtensteinr;UCKr<X Cookinselnr=UTOr>XTongar?ULTr@XLitauenrAULUrBX LuxemburgrCULRrDXLiberiarEULSrFXLesothorGUTHrHXThailandrIUTFrJX(Französische Süd- und AntarktisgebieterKUTGrLXTogorMUTDrNXTschadrOUTCrPXTurks- und CaicosinselnrQULYrRXLibyenrSUVArTX VatikanstadtrUU145rVX WestasienrWUAErXXVereinigte Arabische EmiraterYUADrZXAndorrar[UAGr\XAntigua und Barbudar]UAFr^X Afghanistanr_UAIr`XAnguillaraUVIrbXAmerikanische JungferninselnrcUISrdXIslandreUIRrfXIranrgUAMrhXArmenienriUALrjXAlbanienrkUAOrlXAngolarmUANrnXNiederländische AntillenroU003rpX NordamerikarqU002rrXAfrikarsU001rtXWeltruUARrvX ArgentinienrwUAUrxX AustralienryUATrzX Österreichr{U005r|X Südamerikar}UINr~XIndienrUAXrX AlandinselnrU009rXOzeanienrUAZrX AserbaidschanrUIErXIrlandrUIDrX IndonesienrUJOrX JordanienrUQUrXEuropäische UnionrUUArXUkrainerUQArXKatarrUDKrX DänemarkrUMZrXMosambikrUQOrXÄußeres OzeanienruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhU)r}r(h9X dd.MM.yyyyrhYX%(dd)s.%(MM)s.%(yyyy)srubUfullrhU)r}r(h9XEEEE, d. MMMM yyyyrhYX"%(EEEE)s, %(d)s. %(MMMM)s %(yyyy)srubUlongrhU)r}r(h9X d. MMMM yyyyrhYX%(d)s. %(MMMM)s %(yyyy)srubUshortrhU)r}r(h9Xdd.MM.yyrhYX%(dd)s.%(MM)s.%(yy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUCHFrXSFr.rUBYRrXRblrUMROrXUMrUDJFrXDFrUZWDrXZ$rUUYUrXUr$rUAUDrX$ArUSYPrXLSrUFRFrXFFrUMZMrXMtrUMZNrXMTnrUPHPrXPhprUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUDEMrXDMrUGBPrX£rUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUBMDrXBer$rULSLrXMrUMNTrXTugrUUGXrXU ShrUJMDrXJ$r UTTDr XTT$r UAFNr XAfr UTRLrXTLrUBDTrXTkrUYERrXYRlrUXCDrXEC$rUNOKrXNKrrUINRrX0≤Rs.|1≤Re.|1XROr?USBDr@XSI$rAUPLNrBXZlrCUKESrDXK ShrEUGYDrFXG$rGUMKDrHXMDenrIUTWDrJXNT$rKUTOPrLXT$rMUGNFrNXGFrOUIQDrPXIDrQUBAMrRXKMrSUSCRrTXSRrUUCADrVXCan$rWUCVErXXCVEscrYUKWDrZXKDr[UBIFr\XFbur]USGDr^XS$r_USTDr`XDbraUESPrbX₧rcUIRRrdXRIreUCNYrfXYrgUCYPrhX£CriUMTLrjXLmrkUNZDrlX$NZrmUUSDrnX$roUKGSrpXsomrqUARSrrXArg$rsUSZLrtXEruUBHDrvXBDrwUJPYrxX¥ryuU time_zonesrz}r{(UAtlantic/Canaryr|}r}Ucityr~XKanarenrsU Asia/Muscatr}rj~XMuskatrsU Europe/Lisbonr}rj~XLissabonrsUEurope/Copenhagenr}rj~X KopenhagenrsUAmerica/St_Luciar}rj~X St. LuciarsUAsia/Singaporer}rj~XSingapurrsU Europe/Tiraner}rj~XTiranarsUPacific/Easterr}rj~X OsterinselrsU Africa/Cairor}rj~XKairorsU Europe/Moscowr}rj~XMoskaursUAmerica/El_Salvadorr}rj~XSalvadorrsU Asia/Dushanber}rj~X DuschanbersUAsia/Ulaanbaatarr}rj~X Ulan-BatorrsUAfrica/Dar_es_Salaamr}rj~X DaressalamrsUIndian/Maldivesr}rj~X MaledivenrsU Pacific/Fijir}rj~XFidschirsUAmerica/Caymanr}rj~X KaimaninselnrsU Europe/Athensr}rj~XAthenrsUAmerica/Curacaor}rj~XCuraçaorsUAfrica/Khartoumr}rj~XKhartumrsU Europe/Zurichr}rj~XZürichrsU Asia/Tbilisir}rj~XTiflisrsU Europe/Romer}rj~XRomrsUAfrica/Sao_Tomer}rj~X São TomérsUEurope/Chisinaur}rj~X KischinaursU Europe/Warsawr}rj~XWarschaursUAsia/Krasnoyarskr}rj~X KrasnojarskrsUAsia/Yekaterinburgr}rj~X JekaterinburgrsUAtlantic/Bermudar}rj~XBermudasrsUAfrica/Tripolir}rj~XTripolisrsUIndian/Reunionr}rj~XRéunionrsUAmerica/St_Thomasr}rj~X St. ThomasrsUAmerica/Mexico_Cityr}rj~X Mexiko-StadtrsUAtlantic/Cape_Verder}rj~X Kap VerdersUAsia/Hong_Kongr}rj~XHongkongrsU Asia/Macaur}rj~XMacaorsUAmerica/Jamaicar}rj~XJamaikarsU Europe/Kievr}rj~XKiewrsUAmerica/Scoresbysundr}rj~XIttoqqortoormiitrsU Asia/Baghdadr}rj~XBagdadrsU Asia/Sakhalinr}rj~XSachalinrsUAmerica/St_Vincentr}rj~X St. VincentrsU Asia/Nicosiar}rj~XNikosiarsUEurope/Uzhgorodr}rj~X UschgorodrsU Africa/Accrar}rj~XAkkrarsUAmerica/Port_of_Spainr}rj~X Port-of-SpainrsU Asia/Tashkentr}rj~X Taschkentr sU Asia/Tokyor }r j~XTokior sUAfrica/Djiboutir }rj~X DschibutirsUAsia/Pyongyangr}rj~X PjöngjangrsUAtlantic/South_Georgiar}rj~X Süd-GeorgienrsUAfrica/El_Aaiunr}rj~X El AaiúnrsUAntarctica/Vostokr}rj~XWostokrsUEurope/Bucharestr}rj~XBukarestrsU Africa/Niameyr}r j~XNigerr!sU Asia/Bishkekr"}r#j~XBischkekr$sU Asia/Aqtober%}r&j~XAktober'sUEurope/Vilniusr(}r)j~XWilnar*sU Asia/Yerevanr+}r,j~XErivanr-sUAfrica/Mogadishur.}r/j~X Mogadischur0sUIndian/Christmasr1}r2j~XWeihnachts-Inselnr3sUAfrica/Addis_Ababar4}r5j~X Addis Abebar6sUAmerica/Havanar7}r8j~XHavannar9sUEurope/Brusselsr:}r;j~XBrüsselr<sUAtlantic/Azoresr=}r>j~XAzorenr?sUAmerica/St_Kittsr@}rAj~X St. KittsrBsUAfrica/AlgiersrC}rDj~XAlgierrEsUAsia/KamchatkarF}rGj~X KamtschatkarHsU Asia/RiyadhrI}rJj~XRiadrKsUAsia/VladivostokrL}rMj~X WladiwostokrNsUAtlantic/FaeroerO}rPj~XFäröerrQsU Asia/DamascusrR}rSj~XDamaskusrTsU Asia/QatarrU}rVj~XKatarrWsUEurope/ZaporozhyerX}rYj~X SaporischjarZsU Asia/Yakutskr[}r\j~XJakutskr]sUAtlantic/St_Helenar^}r_j~X St. Helenar`sUEurope/Luxembourgra}rbj~X LuxemburgrcsUAntarctica/DumontDUrvillerd}rej~XDumont D'UrvillerfsUAmerica/Indiana/Knoxrg}rhj~XKnoxrisUAsia/Novosibirskrj}rkj~X NowosibirskrlsUAmerica/Asuncionrm}rnj~X AsunciónrosU Europe/Viennarp}rqj~XWienrrsU Asia/Taipeirs}rtj~XTaipehrusU Asia/Tehranrv}rwj~XTeheranrxsU Etc/Unknownry}rzj~X Unbekanntr{sUAntarctica/South_Poler|}r}j~XSüdpolr~sUAfrica/Ouagadougour}rj~XWagadugursU Indian/Comoror}rj~XKomorenrsuUscriptsr}r(UZsymrXZsymrUGururXGurmukhirUHebrrX HebräischrUZzzzrXUncodierte SchriftrUPhnxrX PhönizischrUMoonrXMoonrUSamrrX SamaritanischrUChamrXChamrUArabrXArabischrUGujrrXGujaratirUZxxxrXSchriftlose SprachenrULycirXLykischrUSinhrX SinghalesischrUTalurXTai LuerUMongrX MongolischrUXpeorX AltpersischrUVisprXVisible SpeechrURjngrXRejangrUOlckrXOl ChikirUTalerXTai LerUMandrX MandäischrUManirX ManichäischrUMlymrX MalaysischrUTibtrX TibetischrUKalirXKayah LirUJpanrX JapanischrUPlrdrXPollard PhonetischrUKanarXKatakanarULydirXLydischrULepcrXLepcharUSundrX SundanesischrUYiiirXYirUJavarX JavanesischrUOryarXOriyarULaoorXLaotischrUUgarrX UgaritischrUCyrlrX KyrillischrUVaiirXVairUArmnrX ArmenischrUCyrsrXAltkirchenslawischrUKhmrrXKhmerrUArmirXArmirUSylorX Syloti NagrirUItalrX AltitalischrUSgnwrXGebärdenspracherUXsuxrX Sumerisch-akkadische KeilschriftrUThaarXThaanarUThairXThairUCprtrX ZypriotischrULinbrXLinear BrULinarXLinear ArUOsmarX OsmanischrUSaurrX SaurashtrarUHirarXHiraganarUHanirX ChinesischrUEgydrXÄgyptisch - DemotischrUQaairXGeerbter SchriftwertrUEgyhrXÄgyptisch - HieratischrUCansrXUCASrUEgyprXÄgyptische HieroglyphenrUZmthrXZmthr UTfngr XTifinaghr UShawr X Shaw-Alphabetr UCirtr XCirthr UGeorr X Georgischr UTengr XTengwarr UHrktr XKatakana oder Hiraganar UGeokr XKhutsurir UTavtr XTavtr UOgamr XOghamr UDsrtr XDeseretr UGothr XGotischr UHanor XHanunoor UBalir X Balinesischr UKorer X Koreanischr UHangr XHangulr UCarir XKarischr UAvstr! X Avestischr" UTagbr# XTagbanwar$ UHansr% X Vereinfachte Chinesische Schriftr& UHantr' X!Traditionelle Chinesische Schriftr( URoror) X Rongorongor* UDevar+ X Devanagarir, UIndsr- X Indus-Schriftr. UBopor/ XBopomofor0 UMymrr1 X Burmesischr2 UTglgr3 XTagalogr4 UPermr5 X Altpermischr6 UBugir7 X Buginesischr8 UPhagr9 XPhags-par: UBrair; XBlindenschriftr< UBrahr= XBrahmir> UBatkr? X Battakischr@ UMerorA X MeroitischrB ULimbrC XLimburD UMteirE X Meitei MayekrF UPhlirG XPhlirH UTelurI XTelugurJ UTamlrK X TamilischrL USararM XSaratirN UPhlprO XPhlprP ULatgrQ XLateinisch - Gälische VarianterR ULatfrS XLateinisch - Fraktur-VarianterT UKharrU X KharoshthirV UNkoorW XN’KorX UPhlvrY XPahlavirZ ULatnr[ X Lateinischr\ UMayar] XMaya-Hieroglyphenr^ ULanar_ XLannar` UEthira X Äthiopischrb UKthirc XKthird UHmngre X Pahawh Hmongrf UBuhdrg XBuhidrh UCoptri XKoptischrj UPrtirk XPrtirl UGlagrm X Glagolitischrn URunrro X Runenschriftrp UOrkhrq X Orchon-Runenrr UCakmrs XCakmrt UHungru X Altungarischrv UGrekrw X Griechischrx UCherry XCherokeerz UZyyyr{ X Unbestimmtr| USyrcr} XSyrischr~ UBlisr X Bliss-Symboler UBengr X Bengalischr USyrer XSyrisch - Estrangelo-Varianter USyrjr X Westsyrischr USyrnr X Ostsyrischr UKndar XKannadar uUvariantsr }r (UMONOTONr X Monotonischr UBOONTr X Boontlingr USCOUSEr XScouse-Dialektr UAREVELAr X Ostarmenischr USOLBAr XSolbica-Dialektr ULIPAWr XLipovaz-Dialektr U1901r XAlte deutsche Rechtschreibungr UBAKU1926r X"Einheitliches Türkisches Alphabetr UOSOJSr XOsojane-Dialektr UPOLYTONr X Polytonischr UNJIVAr X Njiva-Dialektr UFONIPAr XIPA Phonetischr UTARASKr XTaraskievica-Orthographier U1606NICTr XSpätes Mittelfranzösischr USAAHOr XSahor UPOSIXr XPosixr UFONUPAr XPhonetisch (UPA)r UNEDISr XNatisone-Dialektr UAREVMDAr X Westarmenischr U1994r X+Standardisierte Resianische Rechtschreibungr U1996r XNeue deutsche Rechtschreibungr UREVISEDr XRevidierte Rechtschreibungr USCOTLANDr XSchottisches Standardenglischr UBISKEr X Bela-Dialektr UROZAJr X Resianischr uUnumber_symbolsr }r (Ugroupr X.r UnativeZeroDigitr X0r U exponentialr juUperMiller X‰r Unanr XNaNr Udecimalr X,r U percentSignr X%r Ulistr X;r U patternDigitr X#r UplusSignr X+r Uinfinityr X∞r U minusSignr h XCFA Franc (Äquatorial)r? UBNDr@ X Brunei-DollarrA UISKrB XIsländische KronerC USRDrD XSurinamischer DollarrE UNIOrF X Gold-CordobarG ULAKrH XKiprI UNICrJ XCordobarK jXNepalesische RupierL UMZErM XMosambikanischer EscudorN jXUruguayischer PesorO ULUCrP X#Luxemburgischer Franc (konvertibel)rQ jXJamaika DollarrR jXFranzösischer FrancrS UMAFrT XMarokkanischer FrancrU jX Alter MeticalrV jXMeticalrW jXPhilippinischer PesorX jXRandrY URHDrZ XRhodesischer Dollarr[ UGWPr\ XGuinea Bissau Pesor] ULUFr^ XLuxemburgischer Francr_ UBELr` XBelgischer Finanz-Francra UBECrb XBelgischer Franc (konvertibel)rc UNGNrd XNairare UYUNrf X"Jugoslawischer Dinar (konvertibel)rg jXBelgischer Francrh UPLZri XZloty (1950-1995)rj jXCosta Rica Colonrk jXTürkische Lirarl jX Deutsche Markrm UEEKrn XEstnische Kronero jX Malawi Kwacharp j XTrinidad und Tobago Dollarrq jXSri Lanka Rupierr jXSlowakische Kroners jXXKap Verde Escudort jXPakistanische Rupieru jXForintrv UROLrw XLeurx UXEUry X#Europäische Währungseinheit (XEU)rz jXBermuda-Dollarr{ j>X Rial Omanir| jXLotir} ULSMr~ XMalotir jXTugrikr UAMDr XDramr UYUDr X Jugoslawischer Dinar (1966-1990)r UBUKr XBirmanischer Kyatr jXSyrisches Pfundr j,X Katar Riyalr UXDRr XSonderziehungsrechter UNLGr XHolländischer Guldenr UGEKr XGeorgischer Kupon Laritr UMTPr XMaltesisches Pfundr jXPfund Sterlingr j6XGeorgischer Larir USHPr XSt. Helena Pfundr j XAfghanir j@XSalomonen Dollarr UCSKr XTschechoslowakische Kroner UKPWr XNordkoreanischer Wonr UXREr X RINET Fundsr UCSDr XAlter Serbischer Dinarr UAFAr XAfghani (1927-2002)r UTHBr XBahtr UBYBr XBelarus Rubel (alt)r jXTakar UGRDr XGriechische Drachmer jX Jemen Rialr UDDMr X Mark der DDRr jtX Lilangenir UHTGr XGourder UTRYr XNeue Türkische Lirar UMGAr XMadagaskar Ariaryr UANGr XNiederl. Antillen Guldenr ULRDr XLiberianischer Dollarr URWFr X Ruanda Francr jXNorwegische Kroner UMXVr X!Mexican Unidad de Inversion (UDI)r jDXKenia Schillingr UMOPr XPatacar jXIndische Rupier jXMexikanischer Pesor UCZKr XTschechische Kroner UTJSr XTadschikistan Somonir UTJRr XTadschikistan Rubelr jXNgultrumr UYDDr X Jemen Dinarr UGWEr XPortugiesisch Guinea Escudor jXKolumbianischer Pesor UCOUr XUnidad de Valor Realr jjXMaltesische Lirar UMURr XMauritius Rupier j XRupiahr j"XLempirar UXPFr X CFP Francr j$XFidschi Dollarr j&XBirrr UPENr X Neuer Solr j(X Belize-Dollarr UCHWr X WIR Frankenr j*XÖsterreichischer Schillingr UILPr XIsraelisches Pfundr UZRNr X Neuer Zairer UDOPr XDominikanischer Pesor ULULr XLuxemburgischer Finanz-Francr UTMMr XTurkmenistan-Manatr jJXNeuer Taiwan Dollarr UMDLr X Moldau Leur UXPTr XPlatinr UECVr XVerrechnungseinheit für ECr UECSr XEcuadorianischer Sucrer UBSDr X Bahama-Dollarr USEKr XSchwedische Kroner jLXPaʻangar UPEIr XPeruanischer Intir UZMKr XKwachar UMVRr XRufiyaar UXTSr X Testwährungr jXAustralischer Dollarr UADPr XAndorranische Peseter UCUPr XKubanischer Pesor j0XIrisches Pfundr UCLFr XUnidades de Fomentor j2XBarbados-Dollarr jX Komoren Francr UKRWr XSüdkoreanischer Wonr UGMDr XDalasir UVEFr XBolívar Fuerter UGTQr XQuetzalr j4XBolivarr UXOFr XCFA Franc (West)r USITr XTolarr USDPr XSudanesisches Pfund (alt)r j8XChilenischer Pesor UEURr XEuror UCDFr XFranc congolaisr jXOstkaribischer Dollarr j<XTenger URUBr XRussischer Rubel (neu)r UXFUr XFranzösischer UIC-Francr UXAGr! XSilberr" UBRRr# XBrasilianischer Cruzeiror$ UBRNr% XBrasilianischer Cruzado Novor& UBRLr' XRealr( UMMKr) XKyatr* UUYPr+ X$Uruguayischer Neuer Peso (1975-1993)r, URURr- XRussischer Rubel (alt)r. jBXZlotyr/ UBREr0 X$Brasilianischer Cruzeiro (1990-1993)r1 UPYGr2 XGuaranir3 UBRCr4 XBrasilianischer Cruzador5 UBRBr6 X)Brasilianischer Cruzeiro Novo (1967-1986)r7 USVCr8 XEl Salvador Colonr9 UAEDr: X UAE Dirhamr; UGNSr< XGuineischer Sylir= jHXDenarr> UAZMr? XAserbeidschan Manatr@ UAZNrA XAserbaidschan-ManatrB UUSNrC XUS Dollar (Nächster Tag)rD UGQErE X!Äquatorialguinea Ekwele GuineanarF UVUVrG XVaturH UBADrI XBosnien und Herzegowina DinarrJ jNX Guinea FrancrK UMXPrL X%Mexikanischer Silber-Peso (1861-1992)rM jPX Irak DinarrN UERNrO XNakfarP jRXKonvertierbare MarkrQ jTXSeychellen RupierR jVXKanadischer DollarrS USDDrT XSudanesischer DinarrU jhX Zypern PfundrV UMADrW XMarokkanischer DirhamrX jZX Kuwait DinarrY j\X Burundi-FrancrZ ULTTr[ XLitauischer Talonasr\ UPGKr] XKinar^ ULTLr_ XLitauischer Litasr` j^XSingapur-Dollarra UUZSrb XUsbekistan Sumrc j`XDobrard UXFOre XFranzösischer Gold-Francrf UMLFrg XMalischer Francrh jbXSpanische Peseteri jdXRialrj UZRZrk XZairerl jfX Renminbi Yuanrm USLLrn XLeonero UTNDrp XTunesischer Dinarrq jFX Guyana Dollarrr UESBrs XSpanische Peseta (konvertibel)rt UESAru XSpanische Peseta (A-Konten)rv jlXNeuseeland-Dollarrw UFKPrx XFalkland Pfundry ULVLrz XLettischer Latsr{ UUSSr| XUS Dollar (Gleicher Tag)r} jnX US-Dollarr~ UARPr XArgentinischer Peso (1983-1985)r jpXSomr jrXArgentinischer Pesor UILSr XSchekelr URONr XRumänischer Leur URSDr XSerbischer Dinarr jvX Bahrain-Dinarr jxXYenr UARAr XArgentinischer Australr USDGr XSudanesisches Pfundr UPTEr XPortugiesischer Escudor UXAUr XGoldr uUmonthsr }r (U stand-aloner }r (U abbreviatedr }r (KXMärr KXJulr KXAugr K XSepr K XOktr K XNovr K XDezr uUnarrowr }r (KXJr KXFr KjKXAr KjKj Kj Kj K XSr K XOr K XNr K XDr uuUformatr }r (Uwider }r (KXJanuarr KXFebruarr KXMärzr KXAprilr KXMair KXJunir KXJulir KXAugustr K X Septemberr K XOktoberr K XNovemberr K XDezemberr uU abbreviatedr }r (KXJanr KXFebr KXMrzr KXAprr KXMair KXJunr KXJulr KXAugr K XSepr K XOktr K XNovr K XDezr uuuUcurrency_formatsr }r Nh,)r }r (h/Nh1Kh2KKr h4X ¤r j r h7KKr h9X #,##0.00 ¤r h;h5hNh?KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KjKj KjKj Kj Kj Kj usUformatr }r (Uwider }r (KXMontagr KXDienstagr KXMittwochr KX Donnerstagr KXFreitagr KXSamstagr KXSonntagr uU abbreviatedr }r (KXMo.r KXDi.r KXMi.r KXDo.r KXFr.r KXSa.r KXSo.r uuuU meta_zonesr }r (U Alaska_Hawaiir }r (Ucommonr Ulongr }r (Ugenericr XAlaska-Hawaii-Zeitr Ustandardr XAlaska-Hawaii-Standardzeitr uuU Afghanistanr }r (j j }r j XAfghanistan-Zeitr suUAfrica_Westernr }r (j j }r (Udaylightr XWestafrikanische Sommerzeitr j XWestafrikanische Zeitr uuUEurope_Easternr }r (Ushortr }r (j XOESZr j XOEZr uj j }r (j XOsteuropäische Sommerzeitr j XOsteuropäische Zeitr uuUAmazonr }r (j j }r j XAmazonas-Sommerzeitr suUAfrica_Easternr }r (j j }r j XOstafrikanische Zeitr suUEurope_Centralr }r (j }r (j XMESZr j XMEZr uj j }r (j XMitteleuropäische Sommerzeitr j XMitteleuropäische Zeitr uuUEurope_Westernr }r (j }r (j XWESZr j XWEZr uj j }r (j XWesteuropäische Sommerzeitr j XWesteuropäische Zeitr! uuUAlaskar" }r# (j j }r$ (j X Alaska-Zeitr% j XAlaska-Standardzeitr& uuUAfrica_Centralr' }r( (j j }r) j XZentralafrikanische Zeitr* suU Aktyubinskr+ }r, (j j }r- (j XAktyubinsk-Sommerzeitr. j XAktyubinsk-Zeitr/ uuUAfrica_Southernr0 }r1 (j j }r2 (j XSüdafrikanische Zeitr3 j XSüdafrikanische Standardzeitr4 uuUAcrer5 }r6 (j j }r7 (j XAcre-Sommerzeitr8 j X Acre-Zeitr9 uuUAlmatyr: }r; (j j }r< (j XAlmaty-Sommerzeitr= j X Almaty-Zeitr> uuUMoscowr? }r@ (j j }rA (j XMoskauer SommerzeitrB j X Moskauer ZeitrC uuuUerasrD }rE (UwiderF }rG (KXv. Chr.rH KXn. Chr.rI uU abbreviatedrJ }rK (KXv. Chr.rL KXn. Chr.rM uuu.PK[W}[(site-packages/babel/localedata/es_DO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}q(Udecimalq X.q Ugroupq X,q uU week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}q U meta_zonesq!}q"Uvariantsq#}q$Ucurrency_namesq%}q&u.PK[~BB%site-packages/babel/localedata/lo.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1}, {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXກ່ອນທ່ຽງqUpmqXຫລັງທ່ຽງquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XH:mm:ssq-Uformatq.X%(H)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X/Hໂມງ mນາທີ ss ວິນາທີvq3h.X?%(H)sໂມງ %(m)sນາທີ %(ss)s ວິນາທີ%(v)sq4ubUlongq5h))q6}q7(h,XH ໂມງ mນາທີss zq8h.X-%(H)s ໂມງ %(m)sນາທີ%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XH:mmq=h.X %(H)s:%(mm)sq>ubuU languagesq?}q@(UguqAXກູຊາຣາຕີqBUgdqCX"ສະກັອດ ແກລິກqDUgaqEXໄອແລນqFUgnqGXກົວຣານີqHUglqIXກາລິດqJUlaqKXລາແຕັງqLUlnqMXລິງກາລາqNUloqOX ລາວqPUttqQX ຕາດqRUtrqSXຕວກກີqTUtsqUXຊອງກາqVUlvqWXລັດເວຍqXUtoqYXທອງກ້າqZUltq[Xລີທົວນີq\Utkq]Xຕວຽກເມນq^Uthq_Xໄທq`UtiqaXຕີກຣິນຢາqbUtgqcXທາຈິດqdUteqeXເຕລູກູqfUpt_PTqgX9ປອກຕຸຍການ (ປອກຕຸຍການ)qhUfilqiXຕາກາລ໊ອກqjUtaqkXທະມິນqlUyiqmXຢິດດິສqnUpt_BRqoX0ປອກຕຸຍການ (ບຣາຊີນ)qpUdeqqXເຍຍລະມັນqrUdaqsXເດັນມາກqtUdzquXພູຖານີqvUstqwXເຊໂຊໂທqxUquqyXຄິວຊົວqzUelq{Xກເຣັກq|Ueoq}Xເອສເປຣັງໂຕq~UenqXອັງກິດqUzhqX ຈີນqUzaqX ຈວງqUukqXອູແກຣນqUeuqXບັສເກີqUetqXເອສໂຕນີqUesqXແອສປາໂຍນqUruqXລັດເຊຍqUrwqXຄິນຍາວັນດາqUrmqXເລໂຕ-ໂລແມນqUrnqXຄິລັນສີqUroqXໂຣມານີqUbnqXເບັງການqUbeqXເບລາລຸດຊີqUbgqXບຸນກາຣີqUbaqXບາສສີqUwoqX ວູບqUjvqX ຊວາqUboqXທິເບດqUbhqXບີຮາຣີqUbiqXບິສລາມາqUbrqXບເຣີຕົງqUbsqXບອສນີqUjaqXຍີ່ປຸ່ນqUomqX#ໂອໂລໂມ(ອາຟານ)qUocqXອົກຊີຕານqUtwqX ຕວີqUtlhqXກລິງກອງqUorqXໂອຣີຢາqUxhqX ໂຊຊາqUcoqXຄໍຊິກ້າqUcaqXກາຕາລັງqUcyqX ແວວqUcsqX ເຊັກqUpsqXປາສໂຕqUptqXປອກຕຸຍການqUtlqXຕາກາລັອກqUpaqXປັນຈາບqUviqXຫວຽດນາມqUplqXໂປໂລຍqUhyqXອາກເມນີqUhrqXໂກຣອາຊີqUiuqXໄອນຸກຕິຕັກqUhuqXຮັງກາຣີqUhiqXຮິນດູqUhaqX ໂອຊາqUheqX ຍິວqUmgqXມາລາກາຊິqUuzqX3ອຸດຊະເບັກກິດສະຖານqUmlqXມາລາຢາລຳqUmoqXໂມຄາເວຍqUmnqXມົງໂກນqUmiqXເມົາລີqUikqXໄອນູປຽກqUmkqXມາເຊໂດນີqUurqXອູຣະດູqUmtqXມານຕາqUmsqX ມາເລqUmrqXມາຣາທີqUugqXອຸຍເຄີqUmyqXພະມ່າqUaaqX ອາຟາqUabqXແອບຄາເຊຍqUssqXຊິສວາຕິqUafqXອັຟຣິກາrUtnrXເຊຕະສະວານາrUswrXຊວາຮີລີrUisrXອິສລັງrUamrXອຳຫາຣິກrUitr Xອີຕາລີr Usvr Xຊູແອັດr Uiar X!ອິນເຕີລິງກາrUasrXອັສສຳrUarrXອາຣັບrUsurXຊັນດານrUzurX ຊູລູrUayrXໄອມາລາrUazrX!ອາແຊກບາຍຊານrUierXອິນເຕີລິງrUidrXອິນໂດເນເຊຍrUskrXສະໂລວັກກີr Unlr!Xໂຮນລັງr"Uyor#Xໂຢລູບາr$Unnr%X!ນອກແວ (ນີນອກ)r&Unor'Xນອກແວr(Unar)X ນໍລູr*Uner+Xເນປານr,Uvor-Xໂວລາພຸກr.Ufrr/Xຝຣັ່ງr0Usmr1Xຊາມົວr2Ufyr3Xຟຣີຊຽນr4Ufar5Xເປີເຊຍr6Ufir7Xແຟງລັງr8Ufjr9X ຟິຈິr:Usar;Xສັນສະກິດr<Ufor=X ຟາໂຣr>Ukar?Xຊອກຊີr@UkkrAXຄາຊັກrBUsrrCXແຊກບີrDUsqrEXອານບານີrFUkorGXເກົາຫຼີrHUknrIXກັນນາດາrJUkmrKXກຳປູເຈຍrLUklrMXກຼີນແລນດິດrNUksrOXຄັດຊະມີລີrPUsirQXສິງຫານrRUshrSX(ແຊັກໂບ-ໂກຣແອັດrTUsorUXໂຊມາລີrVUsnrWX ໂຊນາrXUkurYXເຄີດິສrZUslr[Xສະໂລວານີr\Ukyr]Xເກຍກິສr^Usgr_Xສັນໂຄr`UsdraXສິນທິrbuU territoriesrc}rd(UBDreXບັງກະລາເທດrfUBErgXເບວຢຽມrhUBFriX!ເບີກິນາຟາໂຊrjUBGrkXບັງກາເລຍrlUBArmXDບັອດສເນຍ ແລະ ເຮີດໂກວິເນຍrnUBBroXບາບາຄັອດrpUBMrqXເບີມິວດາrrUBNrsXບູຮໄນrtUBOruXໂບລິເວຍrvUBHrwXບາເລນrxUBIryXບູລັນຕິrzUBJr{Xເບນິນr|UBTr}Xພູຖານr~UJMrXຈາໄມກາrUBWrXບອັດສະວານາrUBRrXບຼາຊິວrUBSrXບາຮາມາສrUBYrXເບນລາຮັສrUBZrXເບລິຊrURUrXລັດເຊຍrURWrXລາວັນດາrUTLrX'ຕິມໍຕາເວັນອອກrUTMrX*ເຕຣີກເມນິສະຖານrUTJrX!ທາຈິກິສະຖານrUROrXລູເມເນຍrUTKrXໂທກິໂລrUGWrXກິວນີ-ບິສໂຊrUGTrXກົວເຕມາລາrUGRrX ກິຼກrUGQrX0ເອຄົວໂທເລຍລະກິນີrUGPrXກົວເດີລູບrUJPrXຍີ່ປຸ່ນrUGYrXກູຢານາrUGFrXເຟັນສກິວນາrUGErXຈໍເຈຍrUGBrX0ສະຫະລາດຊະອານາຈັກrUGArXກາບອນrUGNrXກິວນີrUGMrXແກມເບຍrUGHrXການ່າrUOMrXໂອມານrUTNrXຕູນິເຊຍrUJOrXຈໍແດນrUHRrXໂຄເອເຊຍrUHTrX ໄອທີrUHUrXຮົງກາຣີrUHKrXຮ່ອງກົງrUHNrXອວນຄູຣັສrUVErXເວເນຊູເອລາrUPRrXເປີໂຕລິໂກrUPTrXໂປຕຸກກັນrUPYrXປາລາກວຍrUIQrXອີລັກrUPArXປານາມາrUPFrX*ເຟັນຣໂພລິນີເຊຍrUPGrX$ປາປົວນິວກີນີrUPErX ເປລູrUPKrXປາກິສຖານrUPHrXຟິລິປິນrUPLrXໂປແລນrUZMrXແຊມເບຍrUEHrX-ຊາຮາລາຕະເວັນຕົກrUEErXເອສໂຕເນຍrUEGrXອີຢິບrUZArX!ອາຟະລິກາໃຕ້rUECrXເອກວາດໍrUITrXອິຕາລີrUVNrXຫວຽດນາມrUETrXເອທິໂອເປຍrUSOrXໂຊມາເລຍrUZWrXຊິມບັບເວrUESrXສະເປນrUERrXອິນຊີrUMDrXໂມນໂຄວາrUMGrXມາຄາກັສກາrUMArXໂມລັອກໂຄrUMCrXໂມນາໂກrUUZrX$ອຸດເບກິສະຖານrUMMrX$ສະຫະພາບພະມ້າrUMLrX ມາລິrUMOrXມາເກົ້າrUMNrXມົງໂກລີrUMKr Xແມຊິໂຄເນຍr UMUr Xມໍຣິຕຽດr UMTr XມັນຕາrUMQrXມາຕິນິກrUMSrXມອນເຊີລາດrUMRrXມໍລິກທາເນຍrUUGrXອູການດາrUMYrXມາເລເຊຍrUMXrXແມັກຊິໂກrUILrXອິສລະເອວrUFRrXຝລັ່ງrUFIrXຟິນແລນr UFJr!X ຟິຈິr"UFMr#Xໄມໂຄນິເຊຍr$UNIr%Xນິຄາລາກົວr&UNLr'Xເນເທີແລນr(UNOr)X ນໍເວr*UNAr+Xນາມິເບຍr,UVUr-Xວານົວຕູr.UNCr/X$ນິວຄາລິໂຄເນຍr0UNEr1Xໄນເຈີr2UNGr3Xໄນຈີເລຍr4UNZr5Xນິວຊີແລນr6UNPr7Xເນປານr8UNUr9X ນີຢູr:UCIr;X*ຝັ່ງທະເລໄອວໍລິr<UCHr=X!ສະວິດເຊີແລນr>UCOr?Xໂຄລຳເບຍr@UCNrAX ຈີນrBUCMrCXຄາເມລູນrDUCLrEX ຊິສິrFUCArGXການາດາrHUCGrIXຄອງໂກrJUCFrKXEສາທາລະນະລັດອັບຟຼິກກາກາງrLUCZrMX-ສາທາລະນະລັດເຊັກrNUCYrOXໄຊປັຼດrPUCSrQXເຊີເບຍrRUCRrSXຄອສຕາລິກາrTUCVrUXເຄບວອດrVUCUrWXຄິວບາrXUSZrYXສະວາຊິແລນrZUSYr[Xຊິເລຍr\UKGr]X!ເດີກິດສະຖານr^UKEr_Xເຄນຢ່າr`USRraXຊູລິນາມິrbUKIrcXຄີລິບາດrdUKHreXກຳປູເຈຍrfUSVrgXເອຊາວາດໍrhUKMriXໂຄໂມຣອດrjUSKrkXສະໂລວາເກຍrlUKRrmXເກົາຫລີໃຕ້rnUSIroXສະໂລເວເນຍrpUKPrqX!ເກົາຫລີເໜືອrrUKWrsXຄູເວດrtUSNruXຊິນີກັນrvUSLrwXເຊຍລາສິອອນrxUSCryXເຊແຊວrzUKZr{Xຄາຊັດສະຖານr|USAr}X'ຊາອຸດິອາລະເບຍr~USGrXສິງກະໂປrUSErXສະວິເດັນrUSDrXຊູດານrUDOrX<ສາທາລະນະລັດໂດມິນິກັນrUDMrXໂດເມນິກາrUDJrXຄິໂບຕິrUDKrXເດນມາກrUVGrX3ບຣິທິດເວີຈິນໄອແລນrUDErXເຢຍລະມັນrUYErXເຢເມນrUDZrXແອລຈິເລຍrUUSrX-ສະຫະລັດອາເມລິກາrUUYrXລູກວຍອຸຣrUYTrXມາຢອດrULBrXເລບານອນrULArX ລາວrUTWrXໄຕ້ຫວັນrUTTrXທິນິແດດrUTRrXຕຸນກີrULKrXສີລັງກາrULIrXໄລເທນສະໄຕrULVrXລຼາດເວຍrUTOrXຕອງກາrULTrXລິເທີເນຍrULUrXລຸກແຊມເບີກrULRrXລິເບີເລຍrULSrXເລໂຊໂທrUTHrXປະເທດໄທrUTFrXHອານາເຂດທາງໃຕ້ຂອງຝລັ່ງເສດrUTGrX ໂຕໂກrUTDrX ຊາດrULYrXລິເບຍrUVArXວາຕິກັນrUAErX<ສະຫະລັດອາຫລັບເອມິເລດrUADrXອັນດໍລາrUAFrX'ອັຟການິດສະຖານrUAIrXອັນກິລາrUVIrX0ຢູເອສເວີຈິນໄອແລນrUISrXໄອສແລນrUIRrXອີລ່ານrUAMrXອາມິເນຍrUALrXແອລເບເນຍrUAOrXອັນໂກລາrUANrX-ເນເທີແລນແອນເທິນrUARrXອາເຈນຕິນາ່rUAUrXອົອດສະຕາລີrUATrXອົອດສະເຕຼຍrUAWrXອາລູບາrUINrXອິນເດຍrUTZrXທານຊາເນຍrUAZrXອາເຊີໄບຈັນrUIErXໄອແລນrUIDrXອິນໂດເນເຊຍrUUArXຢູເຄຼນrUQArX ກາຕາrUMZrXໂມແຊມບິກruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X d MMM yyyyrh.X%(d)s %(MMM)s %(yyyy)srubUfullrh))r}r(h,XEEEEທີ d MMMM G yyyyrh.X-%(EEEE)sທີ %(d)s %(MMMM)s %(G)s %(yyyy)srubUlongrh))r}r(h,X d MMMM yyyyrh.X%(d)s %(MMMM)s %(yyyy)srubUshortrh))r}r(h,Xd/M/yyyyrh.X%(d)s/%(M)s/%(yyyy)srubuUcurrency_symbolsr}rU time_zonesr }r Uscriptsr }r Uvariantsr }rUnumber_symbolsr}rUcurrency_namesr}rULAKrX ກີບrsUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6r KX7r!KX8r"K X9r#K X10r$K X11r%K X12r&usUformatr'}r((Uwider)}r*(KXມັງກອນr+KXກຸມພາr,KX ມີນາr-KX ເມສາr.KXພຶດສະພາr/KXມິຖຸນາr0KXກໍລະກົດr1KXສິງຫາr2K Xກັນຍາr3K X ຕຸລາr4K Xພະຈິກr5K Xທັນວາr6uU abbreviatedr7}r8(KXມ.ກ.r9KXກ.ພ.r:KX ມີ.ນ.r;KX ມ.ສ..r<KXພ.ພ.r=KX ມິ.ຖ.r>KXກ.ລ.r?KXສ.ຫ.r@K Xກ.ຍ.rAK Xຕ.ລ.rBK Xພ.ຈ.rCK Xທ.ວ.rDuuuUcurrency_formatsrE}rFNcbabel.numbers NumberPattern rG)rH}rI(Uexp_precrJNUscalerKKU frac_precrLKKrMUsuffixrNXrOjOrPUint_precrQKKrRh,X ¤#,##0.00rSUprefixrTX¤rUX¤-rVrWUexp_plusrXNUgroupingrYKKrZubsUdaysr[}r\(U stand-aloner]}r^Unarrowr_}r`(KjKjKjKjKj Kj!KjusUformatra}rb(Uwiderc}rd(KXວັນຈັນreKXວັນອັງຄານrfKXວັນພຸດrgKXວັນພະຫັດrhKXວັນສຸກriKXວັນເສົາrjKXວັນອາທິດrkuU abbreviatedrl}rm(KXຈ.rnKXອ.roKXພ.rpKXພຫ.rqKXສກ.rrKXສ.rsKXອາ.rtuuuU meta_zonesru}rvUerasrw}rx(Uwidery}rz(KX3ປີກ່ອນຄິດສະການທີ່r{KX!ຄິດສະການທີ່r|uU abbreviatedr}}r~(KX3ປີກ່ອນຄິດສະການທີ່rKXຄ.ສ.ruuu.PK[!^%site-packages/babel/localedata/tr.datnu[}q(U zone_formatsq}q(UregionqX%s SaatiqUfallbackqX %(1)s (%(0)s)qUgmtqXGMT%squUdatetime_formatsq }q NX{1} {0}q sUquartersq }q (U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX 1. çeyrekqKX 2. çeyrekqKX 3. çeyrekqKX 4. çeyrekquU abbreviatedq}q(KXÇ1q KXÇ2q!KXÇ3q"KXÇ4q#uuuUperiodsq$}q%(Uamq&XAMq'Upmq(XPMq)uUscientific_formatsq*}q+Ncbabel.numbers NumberPattern q,)q-}q.(Uexp_precq/KKq0Uscaleq1KU frac_precq2KKq3Usuffixq4Xq5h5q6Uint_precq7KKq8Upatternq9X#E0q:Uprefixq;h5X-qUgroupingq?MMq@ubsUpercent_formatsqA}qBNh,)qC}qD(h/Nh1Kdh2KKqEh4h5h5qFh7KKqGh9X% #,##0qHh;X% qIX-% qJqKh>Nh?KKqLubsU week_dataqM}qN(Umin_daysqOKU weekend_startqPKU first_dayqQKU weekend_endqRKuU time_formatsqS}qT(UmediumqUcbabel.dates DateTimePattern qV)qW}qX(h9XHH:mm:ssqYUformatqZX%(HH)s:%(mm)s:%(ss)sq[ubUfullq\hV)q]}q^(h9X HH:mm:ss vq_hZX%(HH)s:%(mm)s:%(ss)s %(v)sq`ubUlongqahV)qb}qc(h9X HH:mm:ss zqdhZX%(HH)s:%(mm)s:%(ss)s %(z)sqeubUshortqfhV)qg}qh(h9XHH:mmqihZX %(HH)s:%(mm)sqjubuU languagesqk}ql(UgvqmXManksqnUguqoXGujaratiqpUscnqqX SicilyacaqrUromqsXRomancaqtUalgquXAlgonquian DilleriqvUaleqwXAleutqxUscoqyXİskoçqzUmniq{XManipuriq|Ugdq}Xİskoç Gal Diliq~UgaqX İrlanda DiliqUmnoqXManobo DilleriqUosaqXOsageqUgnqXGuaraniqUaltqXGüney AltaycaqUglqX Galiçya DiliqUmwrqXMarwariqUtyqX Tahiti DiliqUtwqXTwiqUttqXTatarcaqUtrqXTürkçeqUtsqXTsongaqUtnqXSetswanaqUtoqXTongaqUausqXAvustralya DilleriqUavqX Avar DiliqUtkqX TürkmenceqUthqXTay DiliqUroaqXDiğer Roman DilleriqUtgqX Tacik DiliqUteqXTeluguqUugaqX Ugarit DiliqUmwlqX Miranda DiliqUkcgqXTyapqUsmiqXDiğer Sami DilleriqUfatqXFantiqUfanqXFangqUwoqXWolofqUrmqXRhaeto-Roman DiliqUdinqXDinkaqUblaqXSiksikaqUcmcqXChamic DilleriqUmlqX MalayalamqUzhqXÇinceqUtemqXTimneqUen_CAqXKanada İngilizcesiqUnwcqX Klasik NevariqUzaqXZhuangqUcauqXDiğer Kafkas DilleriqUzuqXZuluqUterqXTerenoqUtetqXTetumqUmncqXMançurya DiliqUkutqXKutenaiqUsukqXSukumaqUkumqXKumukçaqUsusqXSusuqUnewqXNewariqUsuxqXSümerceqUdenqXSlaveyqUmenqXMendeqUmulqXBirden Fazla DilqUlezqXLezgiceqUrootqXKökenqUekaqXEkajukqUakkqX Akad DiliqUdraqXDiğer Dravid DilleriqUjrbqXYahudi ArapçasıqUsgnqXİşaret DilleriqUsgaqXEski İrlandacaqUapaqXApaçi DilleriqUbraqXBrajqUchbqXChibchaqUchgqXÇağatay DiliqUchkqXChuukeserUchmrXMarirUchnrXChinook JargonrUchorXChoctawrUchprX ChipewyanrUchrr XÇerokir Uchyr X Şayen Dilir Utir XTigrinyarUvotrXVoticrUmgrX Malaga DilirUibarXIbanrUmorX MoldovacarUmnrXMoğolcarUmirXMaorirUmhrXMarshall Adaları DilirUmkrX MakedoncarUmtrX Malta Dilir Ucair!X!Diğer Orta Amerika Yerli Dillerir"Udelr#XDelawarer$Umsr%XMalayr&Umrr'XMarathir(Utar)XTamilr*Umyr+X Birmanya Dilir,Ucadr-XCaddor.Usrnr/X Sranan Tongor0Utair1XTai Dilir2Uafhr3XAfrihilir4Usitr5XDiğer Sino-Tibet Dillerir6Uenmr7XOrtaçağ İngilizcesir8Uen_AUr9XAvustralya İngilizcesir:Unynr;XNyankoler<Unyor=XNyoror>Unymr?XNyamwezir@UsiorAX Siu DillerirBUmaprCXAvustronezya DilirDUmasrEXMasairFUlahrGXLahndarHUladrIXLadinorJUfyrKXBatı FrizcesirLUsnkrMXSoninkerNUfarOXFarsçarPUmadrQX Madura DilirRUmagrSXMagahirTUmairUXMaithilirVUfirWXFincerXUfjrYX Fiji DilirZUmanr[XMandingor\Uegyr]XEski Mısır Dilir^Uzndr_XZander`UssraXSiswatirbUsrrcXSırpçardUsqreX ArnavutçarfUswrgXSwahilirhUsvriX İsveççerjUsurkX Sunda DilirlUstrmX Güney SothornUskroX SlovakçarpUsirqX Sinhal DilirrUshrsXSırp-Hırvat DilirtUsoruX Somali DilirvUsnrwXShonarxUsmryX Samoa DilirzUslr{XSlovencer|Uscr}X Sardunya Dilir~UsarX SanskritçerUsgrXSanghorUserX Kuzey SamirUsdrXSindhirUzenrXZenagarUkbdrX KabardeycerUafarXDiğer Afro-Asyatik DillerrUcsbrX KashubianrUlgrXGandarUlbrXLüksemburg DilirUfiurXDiğer Finno - Ugrik DillerirUlnrXLingalarUlorX Laos DilirUlirX LimburgishrUbynrXBlinrUltrX Litvanya DilirUlurX Luba-KatangarUfilrXFilipinorUyirXYiddişrUnonrX Old NorserUcebrXCebuanorUyorXYorubarUnogrX Nogay DilirUbatrXDiğer Baltık DillerirUdakrXDakotarUdarrXDargvarUdayrXDayakrUssarXDiğer Nil-Sahara DillerirUkperXKpellerUelrXYunancarUeorX EsperantorUenrX İngilizcerUlamrXLambarUeerXEwerUmdfrXMoksharUfrrX FransızcarUmdrrXMandarrUetrX Estonya DilirUesrX İspanyolcarUrurXRusçarUgonrXGondirUgohrXEski Yüksek AlmancarUsmsrX Skolt SamirUsmnrX Inari SamirUsmjrX Lule SamirUde_ATrXAvusturya AlmancasırUgotrXGotçarUrnrXKirundirUrorXRomencerUdsbrXAşağı SorbçarUsmarX Güney SamirUgorrX GorontalorUastrX AsturyascarUwalrXWalamorUcrhrXKırım TürkçesirUathrXAtabaşkan DillerirUgezrXGeezrUxhrXXhosarUffrXFulahrUkforXKororUmakrXMakasarrUzaprX Zapotek DilirUkokrXKonkanirUzxxrXDilbilim içeriği yokrUkosrXKosraeanrUforX Faroe DilirUtogrX Nyasa TongarUhuprXHuparUudmrX UdmurtçarUbejr X Beja Dilir Ubemr XBembar Utsir X TsimshianrUberrXBerberirUnzirXNzimarUsairX#Diğer Güney Amerika Yerli DillerirUangrXEski İngilizcerUprarXPrakrit DillerirUbhorXBhojpurirUsalrXSalishan DillerirUprorXEski ProvensalrUrajrX Rajasthanir Usadr!XSandawer"Uanpr#XAngikar$Ues_419r%XLatin Amerika İspanyolcasır&Urapr'XRapanuir(Usasr)XSasakr*Unqor+XN’Kor,Ucarr-XCaribr.Uminr/X Minangkabaur0Umicr1XMicmacr2Uefir3XEfikr4Uarnr5XAraucanian Dilir6Uypkr7X Yupik Dillerir8Umisr9XÇeşitli Dillerr:Ukacr;XKaçinr<Ukabr=XKabiler>Ukaar?X Karakalpakçar@UkajrAXJjurBUkamrCXKambarDUkarrEXKarenrFUkawrGXKawirHUfr_CHrIXİsviçre FransızcasırJUtyvrKXTuvacarLUfr_CArMXKanada FransızcasırNUkarOX GürcücerPUdoirQXDogrirRUkgrSXKongorTUkkrUX Kazak DilirVUkjrWXKuanyamarXUkirYXKikuyurZUkor[XKorecer\Uknr]XKannadar^Ukmr_XKamboçya Dilir`UklraXGrönland DilirbUksrcX KeşmircerdUkrreXKanurirfUkwrgXCornishrhUkvriXKomirjUkurkXKürtçerlUkyrmX KırgızcarnUtklroXTokelaurpUbuarqXBuryatrrUmgarsXOrtaçağ İrlandacasırtUhitruXHititçervUdyurwXDyularxUderyXAlmancarzUdar{XDancar|Udzr}X Butan Dilir~UluirXLuisenorUdvrXDivehirUhilrX HiligaynonrUhimrX HimachalirUgemrXDiğer Germen DillerirUcrprXDiğer Creole ve Pidgin DillerirUqurXQuechuarUbasrX Basa DilirUgbarXGbayarUbadrX Banda DilirUbanrX Bali DilirUbalrXBaluchirUshnrX Shan DilirUbairXBamileke DillerirUarprX Arapaho DilirUartrXDiğer Yapay DillerrUarwrX Arawak DilirUarcrXAramicerUen_USrXAmerikan İngilizcesirUsemrXDiğer Semitik DillerrUselrXSelkuprUnubrXNubian DillerirUbtkrXBatakrUlusrXLushairUmusrXCreekrUluarX Luba-LuluarUirorXIroquoian DillerirUirarXDiğer İran DillerirUmunrX Munda DillerirUlunrXLundarUluorXLuorUwarXWalloonrUtuprX Tupi dillerirUjvrX Java DilirUzblrXBlis SembollerirUtutrXDiğer Altay DillerirUtumrXTumbukarUjarXJaponcarUcoprXKipticerUilorXIlokorUlarXLatincerUgwirX GwichʼinrUundrXBilinmeyen veya Geçersiz DilrUtlirXTlingitrUtlhrXKlingonrUchrXChamorrorUcorX Korsika DilirUcarX KatalancarUcerX ÇeçencerUponrX PohnpeianrUcyrXGalcerUsahrXYakutçarUcsrXÇekçerUcrrXCreerUbntrX Bantu DilirUcvrXÇuvaşrUcurXKilise SlavcasırUlvrX Letonya DilirUdumrXOrtaçağ FelemenkçesirUptrX PortekizcerUduarXDualarUfrorXEski FransızcarUyaprXYapçarUfrmrXOrtaçağ FransızcasırUtivrXTivrUfrsrXDoğu FrizcesirUfrrrX Kuzey FrizcerUyaorXYaorUparX Pencap DilirUxalr XKalmıkr Ues_ESr Xİber İspanyolcasır Upir XPalirUen_GBrXİngiliz İngilizcesirUgayrXGayorUotorX Otomi DillerirUotarXOsmanlı TürkçesirUhmnrXHmongrUmyvrXErzyarUgaarXGarUfurrXFriulianrUkhirXDiğer Hoisan Dillerir Uainr!XAinur"Urarr#X Rarotonganr$Uslar%XDiğer Slav Dillerir&Uver'XVendar(Uvir)X Vietnamcar*Uisr+X İzlandacar,Ukhor-XHotancar.Uiur/X Inuktitutr0Uitr1X İtalyancar2Uvor3XVolapükr4Uiir5X Sichuan Yir6Uikr7XInupiakr8Uior9XIdor:Uiner;XDiğer Hint-Avrupa Dillerir<Uiar=X Interlinguar>Ujprr?XYahudi Farsçasır@UierAX InterlinguerBUidrCXEndonezya DilirDUigrEXIgborFUpaprGX PapiamentorHUeworIXEwondorJUpaurKX Palau DilirLUpaarMXDiğer Papua DillerirNUpagrOX PangasinanrPUsatrQXSantalirRUpalrSXPehlevirTUpamrUXPampangarVUsycrWXKlasik SüryanicerXUphirYXDiğer Filipinler DillerirZUcelr[XDiğer Kelt Dillerir\Uphnr]X Fenike Dilir^Unicr_XDiğer Nijer-Kordofan Dillerir`UniaraXNiasrbUdgrrcXDogribrdUsyrreX SüryanicerfUniurgXNiueanrhUgswriXİsviçre AlmancasırjUcchrkXAtsamrlUjbormXLojbanrnUnahroXNahuatlrpUsamrqXSamarit AramcasırrUhairsXHaidartUgmhruXOrtaçağ Yüksek AlmancasırvUcusrwXDiğer Kuşitik DillerrxUwenryX Sorb DillerirzUadyr{X Çerkezcer|Uelxr}XElamr~UadarXAdangmerUpt_PTrXİber PortekizcesirUhawrX Hawaii DilirUbinrXBinirUbikrXBikolrUpt_BRrXBrezilya PortekizcesirUmosrXMossirUmohrXMohawkrUtlrXTagalogrUzh_HansrXBasitleştirilmiş ÇincerUzh_HantrXGeleneksel ÇincerUtvlrXTuvalurUijorXIjorUkmbrXKimbundurUpeorX Eski FarsçarUumbrXUmbundurUtmhrXTamaşekrUfonrXFonrUhsbrXYukarı SorbçarUberX Beyaz RusçarUbgrXBulgarcarUbarXBaşkırt DilirUpsrXPeştucarUbmrXBambararUbnrX Bengal DilirUborXTibetçerUbhrXBiharirUbirXBislamarUbrrX Breton DilirUbsrX BoşnakçarUruprXAromancarUzzarXZazacarUomrXOromorUojrXOjibwarUacerXAchineserUachrXAcolirUocrXOccitanrUkrurXKurukhrUsrrrXSererrUkrorXKrurUkrlrXKarelianrUkrcrXKaraçay-BalkarrUndsrXAşağı AlmancarUosrXOsetrUorrXOriyarUsogrXSogdiana DilirUnsorX Kuzey SothorUsonrXSonghairUde_CHrXİsviçre Yüksek AlmancasırUvairXVairUwakrXWakashan DillerirUlolrXMongorUmkhrXDiğer Mon-Khmer DillerirUawarXAwadhirUlozrXLozirUgilrX GilberteserUwasrXWashorUwarrXWarayrUhzrXHererorUhyrXErmenicerUanrXAragoncarUsidrXSidamorUhrrX HırvatçarUhtrX Haiti DilirUhurXMacarcarUhirXHintçerUhorX Hiri MoturUharXHausarUbugrXBugisrUher X İbranicer Uuzr X Özbekçer Uurr XUrducarUplrXLehçerUukrX UkraynacarUugrXUygurcarUaarXAfarrUabrXAbazcarUaerXAvestçerUafrX Afrikaan DilirUakrXAkanrUamrXAmharikr Unl_BEr!X Felemenkçer"Ueur#XBaskçar$Uasr%XAssamcar&Uarr'XArapçar(Uinhr)X İnguş Dilir*Utpir+X Tok Pisinr,Umynr-X Maya Dillerir.Uayr/XAymarar0Ukhar1XKhasir2Uazr3XAzericer4Uincr5XDiğer Hint Dillerir6Unlr7X Hollanda Dilir8Unnr9XNorveççe Nynorskr:Unor;X Norveççer<Unar=X Nauru Dilir>Unbr?XNorveççe Bokmålr@UnairAX"Diğer Kuzey Amerika Yerli DillerirBUndrCX Kuzey NdebelerDUnerEXNepalcerFUngrGXNdongarHUnyrIXNyanjarJUnaprKXNapolicerLUgrbrMXGreborNUgrcrOX Antik YunancarPUnrrQXGüney NdebelerRUtigrSXTigrerTUnvrUX Navaho DilirVUzunrWXZunirXUrwrYX KinyarwandarZUcper[X3Diğer İngilizce tabanlı Creole ve Pidgin Dillerir\Ucpfr]X3Diğer Fransızca tabanlı Creole ve Pidgin Dillerir^Ucppr_X3Diğer Portekizce tabanlı Creole ve Pidgin Dillerir`uU territoriesra}rb(UBDrcX BangladeşrdUBEreXBelçikarfUBFrgX Burkina FasorhUBGriX BulgaristanrjUVErkX VenezuelarlUBArmX Bosna HersekrnUBBroXBarbadosrpUWFrqXWallis ve FutunarrUBLrsXSaint BarthelemyrtUBMruXBermudarvUBNrwXBruneirxUBOryXBolivyarzUBHr{XBahreynr|UBIr}XBurundir~UBJrXBeninrUBTrXBhutanrU011rX Batı AfrikarUBVrX Bouvet AdasırUBWrXBotsvanarU014rX Doğu AfrikarU015rX Kuzey AfrikarUBRrXBrezilyarU017rX Orta AfrikarU018rXGüney Afrika [018]rU019rXAmerikarUBYrX Beyaz RusyarUBZrXBelizerULVrXLetonyarURWrXRuandarURSrX SırbistanrUTLrX Doğu TimorrURErXReunionrUTMrX TürkmenistanrUOMrXUmmanrUTJrX TacikistanrUROrXRomanyarUTKrXTokelaurUGWrX Gine-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX*Güney Georgia ve Güney Sandwich AdalarırUGRrX YunanistanrUGQrXEkvator GinesirUGPrX GuadelouperUJPrXJaponyarUKIrXKiribatirUGYrXGuyanarUGGrXGuernseyrUGFrXFransız GuyanasırUGErX GürcistanrUGDrXGranadarU021rXAmerika'nın KuzeyirUGBrXBirleşik KrallıkrUGArXGabonrUSVrX El SalvadorrUGNrXGinerUGMrXGambiarUGLrX GrönlandrU029rX KarayiplerrUGIrX CebelitarıkrUGHrXGanarUJErXJerseyrUTNrXTunusrUJMrXJamaikarU013rX Orta AmerikarUWSrXSamoarU419rXLatin Amerika ve KarayiplerrUHRrX HırvatistanrUBSrX BahamalarrUHTrXHaitirUHUrX MacaristanrUHKrXHong Kong SAR - ÇinrU039rX Güney AvruparUHNrXHondurasrUFIrX FinlandiyarU142rXAsyarU030rX Doğu AsyarU034rX Güney AsyarU035rXGüney Doğu AsyarUPRrX Porto RikorUPSrXFilistin BölgesirU830rXKanal AdalarırUFKrXFalkland AdalarırUIOr XHint Okyanusu İngiliz Bölgesir UPWr XPalaur UPTr XPortekizrUSJrXSvalbard ve Jan MayenrUMDrXMoldovya CumhuriyetirUFMrXMikronezya Federal EyaletlerirUIQrXIrakrUPArXPanamarUPFrXFransız PolinezyasırUPGrXPapua Yeni GinerUPErXPerurUPKrXPakistanr UPHr!X Filipinlerr"UFOr#XFaroe Adalarır$UPNr%XPitcairnr&UPLr'XPolonyar(UPMr)XSaint Pierre ve Miquelonr*UZMr+XZambiyar,UEHr-X Batı Saharar.URUr/XRusya Federasyonur0UEEr1XEstonyar2UEGr3XMısırr4UZAr5X Güney Afrikar6UECr7XEkvatorr8UITr9Xİtalyar:UVNr;XVietnamr<UZZr=X Bilinmeyen veya Geçersiz Bölger>USBr?XSolomon Adalarır@UETrAXEtiyopyarBUSOrCXSomalirDUZWrEXZimbabverFUSArGXSuudi ArabistanrHUESrIXİspanyarJUERrKXEritrerLUMErMXKaradağrNUAQrOX AntarktikarPUMGrQX MadagaskarrRUMFrSX Saint MartinrTUMArUXFasrVUMCrWXMonakorXUUZrYX ÖzbekistanrZUMMr[XMyanmarr\UMLr]XMalir^UMOr_XMakao S.A.R. Çinr`UMNraX MoğolistanrbUHMrcX!Heard Adası ve McDonald AdalarırdUASreXAmerikan SamoasırfUMKrgX MakedonyarhUMUriX MauritiusrjUMTrkXMaltarlUMWrmXMalavirnUMVroX MaldivlerrpUMQrqXMartinikrrUMPrsXKuzey Mariana AdalarırtUMSruX MontserratrvUMRrwX MoritanyarxUIMryX Man AdasırzUUGr{XUgandar|UTZr}XTanzanyar~UMYrXMalezyarUMXrXMeksikarUILrXİsrailrUFRrXFransarUAWrXArubarUDOrXDominik CumhuriyetirUSHrX Saint HelenarUVCrXSaint Vincent ve GrenadinlerrU054rX MelanezyarUDJrXCibutirUFJrXFijirU057rX MikronezyarU172rX Bağımsız Devletler TopluluğurU053rXAvustralya ve Yeni ZelandarUNIrX NikaraguarUNLrXHollandarUNOrXNorveçrUNArXNamibyarUVUrXVanuaturUNCrXYeni KaledonyarUNErXNijerrUNFrXNorfolk AdasırUNGrXNijeryarUNZrX Yeni ZelandarUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinezyarUCIrXFildişi SahillerirUCHrX İsviçrerUCOrX KolombiyarUCNrXÇinrUCMrXKamerunrUCLrXŞilirUCCrXCocos AdalarırUCArXKanadarUCGrXKongorUCFrXOrta Afrika CumhuriyetirUCDrXKongo Demokratik CumhuriyetirUCZrXÇek CumhuriyetirUCYrXGüney Kıbrıs Rum KesimirUCXrXChristmas AdasırUCSrXSırbistan-KaradağrUCRrX Kosta RikarUPYrXParaguayrUCVrX Cape VerderUCUrXKübarUSZrX SvazilandrUSYrXSuriyerUKGrX KırgızistanrUKErXKenyarUSRrXSurinamrU143rX Orta AsyarUKHrX KamboçyarUKNrXSaint Kitts ve NevisrUKMrXKomorlarrUSTrXSao Tome ve PrinciperUSKrXSlovakyarUKRrX Güney KorerUSIrXSlovenyarUKPrX Kuzey KorerUKWrXKuveytrUSNrXSenegalrUSMrX San MarinorUSLrX Sierra LeonerUSCrX SeyşellerrUKZrX KazakistanrUKYrXKayman AdalarırUSGrXSingapurrUSEr Xİsveçr USDr XSudanr U151r X Doğu AvruparU150rXAvruparUDMrXDominikrU155rX Batı AvruparU154rX Kuzey AvruparUVGrXİngiliz Virgin AdalarırUDErXAlmanyarUYErXYemenrUMHrXMarshall AdalarırU062rXGüney Orta Asyar UDZr!XCezayirr"UUSr#XAmerika Birleşik Devletlerir$UUYr%XUruguayr&UYTr'XMayotter(UUMr)X4Amerika Birleşik Devletleri Küçük Dış Adalarır*ULBr+XLübnanr,ULCr-X Saint Luciar.ULAr/XLaosr0UTVr1XTuvalur2UTWr3XTayvanr4UTTr5XTrinidad ve Tobagor6UTRr7XTürkiyer8ULKr9X Sri Lankar:ULIr;X Liechtensteinr<UCKr=X Cook Adalarır>UTOr?XTongar@ULTrAXLitvanyarBULUrCX LüksemburgrDULRrEXLiberyarFULSrGXLesothorHUTHrIXTaylandrJUTFrKXFransız Güney BölgelerirLUTGrMXTogorNUTDrOXÇadrPUTCrQXTurks ve Caicos AdalarırRULYrSXLibyarTUVArUXVatikanrVU145rWX Batı AsyarXUAErYXBirleşik Arap EmirliklerirZUADr[XAndorar\UAGr]XAntigua ve Barbudar^UAFr_X Afganistanr`UAIraXAnguillarbUVIrcXABD Virgin AdalarırdUISreXİzlandarfUIRrgXİranrhUAMriX ErmenistanrjUALrkX ArnavutlukrlUAOrmXAngolarnUANroXHollanda AntillerirpU003rqX Kuzey AmerikarrU002rsXAfrikartU001ruXDünyarvUARrwXArjantinrxUAUryX AvustralyarzUATr{X Avusturyar|U005r}XGüney Amerikar~UINrX HindistanrUAXrXAland AdalarırU009rX OkyanusyarUAZrX AzerbaycanrUIErXİrlandarUIDrX EndonezyarUJOrXÜrdünrUQUrXAvrupa BirliğirUUArXUkraynarUQArXKatarrUDKrX DanimarkarUMZrXMozambikrUQOrXUzak OkyanusyaruUdecimal_formatsr}rNh,)r}r(h/Nh1Kh2KKrh4h5h5rh7KKrh9X #,##0.###rh;h5hNh?KKrubsU date_formatsr}r(UmediumrhV)r}r(h9X dd.MMM.yyyyrhZX%(dd)s.%(MMM)s.%(yyyy)srubUfullrhV)r}r(h9Xdd MMMM yyyy EEEErhZX!%(dd)s %(MMMM)s %(yyyy)s %(EEEE)srubUlongrhV)r}r(h9X d MMMM yyyyrhZX%(d)s %(MMMM)s %(yyyy)srubUshortrhV)r}r(h9X dd.MM.yyyyrhZX%(dd)s.%(MM)s.%(yyyy)srubuUcurrency_symbolsr}r(UDZDrXDArUNADrXN$rUKMFrXCFrUBGLrXlevrUBOBrXBsrUDKKrXDKrrULBPrXLLrUTZSrXT ShrUKHRrXCRrUMYRrXRMrULYDrXLDrUJODrXJDrUSARrXSRlrUHKDrXHK$rUSRGrXSfrUCHFrXSwFrUBYRrXRblrUALLrXlekrUMROrXUMrUDJFrXDFrUZWDrXZ$rUVUVrXVTrUUYUrXUr$rUSYPrXLSrUMZMrXMtrUMZNrXMTnrUPHPrXPhprUZARrXRrUNPRrXNrsrUBEFrXBFrUCRCrXCrUGBPrX£rUMWKrXMKrULKRrXSL RerUSKKrXSkrUPKRrXPrarUHUFrXFtrUROLrXleurUBMDrXBer$rULSLr XMr UMNTr XTugr UAMDr XdramrUUGXrXU ShrUJMDrXJ$rUGELrXlarirUAFNrXAfrUTRLrXTLrUBDTrXTkrUYERrXYRlrUANGrXNA f.rUXCDrXEC$r UNOKr!XNKrr"UINRr#XINRr$UMXNr%XMEX$r&UBTNr'XNur(UCOPr)XCol$r*UIDRr+XRpr,UHNLr-XLr.UXPFr/XCFPFr0UFJDr1XF$r2UETBr3XBrr4UBZDr5XBZ$r6UDOPr7XRD$r8UQARr9XQRr:USEKr;XSKrr<UAUDr=X$Ar>UIEPr?XIR£r@UBBDrAXBDS$rBUVEFrCXBsFrDUGTQrEXQrFUVEBrGXBerHUCLPrIXCh$rJUITLrKX₤rLUKZTrMXTrNUTTDrOXTT$rPUOMRrQXROrRUSBDrSXSI$rTUPLNrUXZlrVUKESrWXK ShrXUGYDrYXG$rZUMKDr[XMDenr\UTWDr]XNT$r^UTOPr_XT$r`UGNFraXGFrbUIQDrcXIDrdUBAMreXKMrfUSCRrgXSRrhUCADriXCan$rjUCVErkXCVEscrlUKWDrmXKDrnUBIFroXFburpUSOSrqXSh.rrUSGDrsXS$rtUSTDruXDbrvUESPrwX₧rxUIRRryXRIrzUCNYr{XYr|UCYPr}X£Cr~UMTLrXLmrUNZDrX$NZrUUSDrX$rUKGSrXsomrUARSrXArg$rUSZLrXErUBHDrXBDrUJPYrX¥ruU time_zonesr}r(UAtlantic/Canaryr}rUcityrXKanarya AdalarırsU Europe/Lisbonr}rjXLizbonrsU Asia/Kuchingr}rjXKuçingrsUEurope/Copenhagenr}rjXKopenhagrsUAmerica/St_Luciar}rjX St. LuciarsUAsia/Singaporer}rjXSingapurrsU Europe/Tiraner}rjXTiranrsUEurope/Zaporozhyer}rjX ZaporojyersU Asia/Kashgarr}rjXKaşgarrsU Asia/Urumqir}rjXUrumçirsU Europe/Moscowr}rjXMoskovarsUAmerica/El_Salvadorr}rjXSalvadorrsU Asia/Dushanber}rjXDuşanbersUEurope/Brusselsr}rjXBrükselrsUAsia/Ulaanbaatarr}rjX UlanbatorrsUIndian/Maldivesr}rjX MaldivlerrsUEurope/Stockholmr}rjXStokholmrsU Asia/Colombor}rjXKolomborsUAmerica/Caymanr}rjXKaymanrsU Europe/Athensr}rjXAtinarsUAfrica/Khartoumr}rjXKartumrsUAmerica/Puerto_Ricor}rjX Porto RikorsUIndian/Mauritiusr}rjXMoritusrsU Europe/Zurichr}rjXZürihrsU Asia/Tbilisir}rjXTiflisrsUEurope/Gibraltarr}rjX CebelitarıkrsU Asia/Karachir}rjXKaraçirsU Europe/Romer}rjXRomarsUAmerica/North_Dakota/New_Salemr}rjXNew Salem, Kuzey DakotarsU Europe/Warsawr}rjXVarşovarsUAfrica/Tripolir}rjXTrablusrsU Asia/Saigonr}rjXSaygonrsU Asia/Bakur}rjXBakürsUIndian/Reunionr}rjXReunion AdasırsUAmerica/St_Thomasr}rjX St. ThomasrsUAmerica/Mexico_Cityr}rjX Meksiko CityrsU Asia/Macaur}rjXMakaursUAsia/Choibalsanr}rjX ÇoybalsanrsUAmerica/Jamaicar}rjXJameikarsU Asia/Hovdr}rjXKobdor sU Asia/Baghdadr }r jXBağdatr sUEurope/Budapestr }rjX BudapeştersU Asia/Kabulr}rjXKabilrsU Asia/Sakhalinr}rjXSahalinrsUAmerica/St_Vincentr}rjX St. VincentrsU Asia/Nicosiar}rjXLefkoşarsUEurope/Uzhgorodr}rjXUjgorodrsU Asia/Aqtaur}r jX Şevçenkor!sU Europe/Viennar"}r#jXViyanar$sUAmerica/Port_of_Spainr%}r&jXİspanya Limanır'sUPacific/Pitcairnr(}r)jXPitcairn Adalarır*sU Asia/Tashkentr+}r,jXTaşkentr-sUAfrica/Djiboutir.}r/jXCibutir0sU Asia/Jakartar1}r2jXCakartar3sUAustralia/Sydneyr4}r5jXSidneyr6sUAtlantic/South_Georgiar7}r8jXGüney Gürcistanr9sUAfrica/El_Aaiunr:}r;jXEl Ayunr<sU Asia/Oralr=}r>jXUralskr?sUEurope/Istanbulr@}rAjX İstanbulrBsU Asia/IrkutskrC}rDjXİrkutskrEsUEurope/BucharestrF}rGjXBükreşrHsUAfrica/CasablancarI}rJjX KazablankarKsUAmerica/Indiana/MarengorL}rMjXMarengorNsU Europe/MonacorO}rPjXMonakorQsU Asia/BishkekrR}rSjXBişkekrTsU Africa/CeutarU}rVjXSepterWsU Asia/AqtoberX}rYjXAktöberZsUAmerica/Chicagor[}r\jXŞikagor]sU Africa/Cairor^}r_jXKahirer`sUIndian/Christmasra}rbjXNoelrcsU Asia/Kuwaitrd}rejXKuveytrfsUAsia/Qyzylordarg}rhjX KızılordarisUAtlantic/Azoresrj}rkjX Azor AdalarırlsUAsia/Jerusalemrm}rnjXKudüsrosUAsia/Chongqingrp}rqjXÇunkingrrsU Asia/Shanghairs}rtjXŞangayrusUAmerica/St_Kittsrv}rwjX St. KittsrxsU Asia/Beirutry}rzjXBeyrutr{sUAfrica/Algiersr|}r}jXCezayirr~sU Asia/Bahrainr}rjXBahreynrsU Asia/Ashgabatr}rjXAşkabatrsUAmerica/Costa_Ricar}rjX Kosta RikarsUAsia/Kamchatkar}rjX KamçatkarsU Asia/Riyadhr}rjXRiyadrsUIndian/Mayotter}rjXMayotersU Europe/Londonr}rjXLondrarsU Africa/Tunisr}rjXTunusrsU Asia/Damascusr}rjXŞamrsU Asia/Qatarr}rjXKatarrsUAmerica/North_Dakota/Centerr}rjXMerkez, Kuzey DakotarsUEurope/Luxembourgr}rjX LüksemburgrsU Asia/Gazar}rjXGazzersUAmerica/Martiniquer}rjXMartinikrsUAntarctica/DumontDUrviller}rjXDumont D'UrvillersUAmerica/Indiana/Knoxr}rjXKnoxrsU Asia/Almatyr}rjXAlmatırsUPacific/Marquesasr}rjXMarkizrsU Asia/Anadyrr}rjXAnadırrsU Europe/Sofiar}rjXSofyarsUAmerica/Dominicar}rjXDominikrsUAsia/Samarkandr}rjX SemerkandrsU Asia/Tehranr}rjXTahranrsU Etc/Unknownr}rjX BilinmeyenrsUAntarctica/South_Poler}rjX Güney KutbursU Asia/Seoulr}rjXSeulrsU Pacific/Naurur}rjX Nauru AdasırsuUscriptsr}r(UZsymrXZsymrUGururXGurmukhirUHebrrX İbranicerUZzzzrXBilinmeyen veya Geçersiz BetikrUPhnxrXFonetikrUMoonrXMoonrUSamrrXSamaritrUChamrXChamrUArabrXArapçarUGujrrXGujaratirUZxxxrXYazılı OlmayanrULycirX Likya DilirUSinhrXSinhalrUTalurX New Tai LuerUMongrXMoğolcarUXpeorX Eski FarsçarUVisprXKonuşma Sesleri ÇizimlemesirURjngrXRejangrUOlckrXOl ChikirUTalerXTai LerUMandrXMandaeanrUManirX Mani AlfabesirUMlymrX MalayalamrUTibtr XTibetçer UKalir XKayah Lir UJpanr XJaponcar UPlrdr XPollard Fonetikr UKanar XKatakanar ULydir X Lidya DIlir ULepcr XLepchar USundr XSundar UYiiir XYir UJavar X Cava Dilir UOryar XOriyar ULaoor XLao Dilir UUgarr XUgarit Çivi Yazısır UCyrlr XKirilr UVaiir XVair UArmnr XErmenicer UCyrsr XEski Kilise Slavcar! UKhmrr" XKhmerr# UArmir$ XArmir% USylor& X Syloti Nagrir' UItalr( XEski İtalyancar) USgnwr* Xİşaret Dili Yazımır+ UXsuxr, XSümer-Akad Çivi Yazısır- UThaar. XThaanar/ UThair0 XTaycar1 UCprtr2 XKıbrısr3 ULinbr4 XLineer Br5 ULinar6 XLineer Ar7 UOsmar8 XOsmanyar9 USaurr: X Saurashtrar; UHirar< XHiraganar= UHanir> XHunr? UEgydr@ XMısır Yazısı - DemotikrA UQaairB X KalıtsalrC UEgyhrD XMısır Yazısı - HiyeratikrE UCansrF XUCASrG UEgyprH XMısır Yazısı - HiyeroglifrI UZmthrJ XZmthrK UTfngrL XTifinaghrM UShawrN XShavianrO UCirtrP XCirthrQ UGeorrR X GürcücerS UTengrT XTengwarrU UHrktrV XKatakana veya HiraganarW UGeokrX XHutsuri GürcücerY UTavtrZ XTavtr[ UOgamr\ XOghamr] UDsrtr^ XDeseretr_ UGothr` XGotikra UHanorb XHanunoorc UBalird X Bali Dilire UKorerf XKorecerg UHangrh XHangulri UCarirj XKaryark UAvstrl XAvestçerm UTagbrn XTagbanwaro UHansrp XBasitleştirilmiş Hanrq UHantrr XGeleneksel Hanrs URorort X Rongorongoru UDevarv X Devanagarirw UIndsrx XIndusry UBoporz XBopomofor{ UMymrr| XMyanmarr} UTglgr~ X Takalotçar UPermr X Eski Permicr UBugir XBugisr UPhagr XPhags-par UBrair XBrailler UBrahr XBrahmir UBatkr XBatakr UMeror XMeroitikr ULimbr XLimbur UMteir X Meitei Mayekr UPhlir XPhlir UTelur XTelugur UTamlr XTamilr USarar XSaratir UPhlpr XPhlpr ULatgr X Gael Latinr ULatfr X Fraktur Latinr UKharr X Kharoshthir UNkoor XN’Kor UPhlvr XKitap Pehlevi Dilir ULatnr XLatinr UMayar XMaya Hiyerogliflerir ULanar XLannar UEthir XEtiyopyar UKthir XKthir UHmngr X Pahawh Hmongr UBuhdr XBuhidr UCoptr XKoptikr UPrtir XPrtir UGlagr XGlagolitr URunrr XRunikr UOrkhr XOrhunr UCakmr XCakmr UHungr X Eski Macarcar UGrekr XYunanr UCherr XÇerokir UZyyyr XCommonr USyrcr X Süryanicer UBlisr XBlis Sembollerir UBengr XBengalcer USyrer XEstrangela Süryanicer USyrjr XBatı Süryanicer USyrnr XDoğu Süryanicer UKndar XKannadar uUvariantsr }r (UMONOTONr X Monotonikr UBOONTr X Boontlingr USCOUSEr XScouser UAREVELAr XDoğu Ermenicesir USOLBAr XStolvizza/Solbica Lehçesir ULIPAWr XResia Lipovaz Lehçesir U1901r X"Geleneksel Alman Yazım Kurallarır UBAKU1926r X$Birleştirilmiş Yeni Türk Alfabesir UOSOJSr XOseacco/Osojane Lehçesir UPOLYTONr X Politonikr UNJIVAr XGniva/Njiva Lehçesir UFONIPAr XIPA Ses Bilimir UTARASKr XTaraskievica Yazım Kurallarır U1606NICTr X(1606'ya Dek Geç Ortaçağ Fransızcasır USAAHOr XSahor UPOSIXr X Bilgisayarr UFONUPAr XUPA Ses Bilimir UNEDISr XNatisone Lehçesir UAREVMDAr XBatı Ermenicesir U1994r X Standart Resia Yazım Kurallarır U1996r X1996 Alman Yazım Kurallarır UREVISEDr X&Gözden Geçirilmiş Yazım Kurallarır USCOTLANDr Xİskoç Standart İngilizcesir UBISKEr XSan Giorgio/Bila Lehçesir UROZAJr XResia Lehçesir uUnumber_symbolsr }r (Ugroupr X.r UnativeZeroDigitr X0r U exponentialr jUperMiller X‰r Unanr XNaNr Udecimalr X,r U percentSignr X%r Ulistr X;r U patternDigitr X#r UplusSignr X+r Uinfinityr X∞r U minusSignr! h UXBCr? XAvrupa Hesap Birimi (XBC)r@ UXBBrA XAvrupa Para Birimi (EMU)rB UBWPrC XBotsvana PulasırD jXLübnan LirasırE jXTanzanya ŞilinirF UVNDrG X Vietnam DongurH jXNamibya DolarırI UAOArJ XAngola KvanzasırK UWSTrL XBatı Samoa TalasırM UAONrN X!Yeni Angola Kvanzası (1990-2000)rO jXKamboçya RielirP jXMalezya RingitirQ UAOKrR XAngola Kvanzası (1977-1990)rS jqXSomali ŞilinirT UKYDrU XKayman Adaları DolarırV jX Libya DinarırW UUAHrX XUkrayna GrivnasırY UUAKrZ XUkrayna Karbovanetzr[ jXUganda Şilinir\ jXÜrdün Dinarır] UAORr^ X'Angola Kvanzası Reajustado (1995-1999)r_ USURr` XSovyet Rublesira UAWGrb X Aruba Florinirc jXSuudi Arabistan Riyalird UFIMre X Fin Markkasırf jXHong Kong Dolarırg jXSurinam Guldenirh UTPEri XTimor Esküdosurj UMGFrk XMadagaskar Frangırl UCHErm X WIR Avrosurn jXİsviçre Frangıro UGIPrp XCebelitarık Lirasırq jXBeyaz Rusya Rublesirr jXArnavutluk Lekirs UXPDrt XPaladyumru UUGSrv XUganda Şilini (1966-1987)rw jXMoritanya Ouguiyasırx UBOVry X Bolivya Mvdolrz UHRKr{ XHırvat Kunasır| jXCibuti Frangır} UHRDr~ XHırvat Dinarır UPESr X Peru Solur UEQEr XEkueler jKXİtalyan Liretir UXAFr XCFA Frangı BEACr UBNDr XBrunei Dolarır UISKr Xİzlanda Kronur UZALr XGüney Afrika Randı (finansal)r USRDr XSurinam Dolarır UNIOr XNikaragua Kordobası (Oro)r ULAKr X Laos Kipir UNICr XNikaragua Kordobasır jX Nepal Rupisir UMZEr XMozambik Esküdosur jXUruguay Pezosu (Uruguayo)r ULUCr XKonvertibl Lüksemburg Frangır jXJamaika Dolarır UFRFr XFransız Frangır UMAFr X Fas Frangır UUYIr X"Uruguay Peso en Unidades Indexadasr jXEski Mozambik Metikalir jXMozambik Metikalir jXFilipinler Pezosur jXGüney Afrika Randır URHDr XRodezya Dolarır UGWPr XGine-Bissau Pezosur ULUFr XLüksemburg Frangır UBELr XBelçika Frangı (finansal)r UBECr XBelçika Frangı (konvertibl)r UNGNr XNijerya Nairasır UYUNr XKonvertibl Yugoslav Dinarır jXBelçika Frangır UPLZr XPolonya Zlotisi (1950-1995)r jXKosta Rika Kolonur jXEski Türk Lirasır UDEMr X Alman Markır UEEKr X Estonya Krunur jXMalavi Kvaçasır jOXTrinidad ve Tobago Dolarır jXSri Lanka Rupisir jXSlovak Korunasır jkXCape Verde Esküdosur jXPakistan Rupisir jX Macar Forintir jXEski Romen Leyir UXEUr XAvrupa Para Birimir jXBermuda Dolarır jQX Umman Riyalir j XLesotho Lotisir ULSMr XMalotir j XMoğol Tugrikir j XErmenistan Dramır UYUDr XYugoslav Dinarı (Hard)r UBUKr X Burma Kyatır jXSuriye Lirasır j9X Katar Riyalir UXDRr XÖzel Çekme Hakkı (SDR)r UNLGr XHollanda Florinir UGEKr XGürcistan Kupon Larisir UMTPr XMalta Sterlinir jXİngiliz Sterlinir jXGürcistan Larisir USHPr XSaint Helena Lirasır jXAfganistan Afganisir jSXSolomon Adaları Dolarır UCSKr XÇekoslavak Korunası (Hard)r UKPWr XKuzey Kore Wonur UXREr XRINET Fonlarır UCSDr XEski Sırbistan Dinarır UAFAr XAfganistan Afganisi (1927-2002)r UTHBr XTayland Bahtır UBYBr X$Yeni Beyaz Rusya Rublesi (1994-1999)r jXBangladeş Takasır UGRDr XYunan Drahmisir jX Yemen Riyalir UDDMr XDoğu Alman Markır jXSwaziland Lilangenisir UHTGr X Haiti Gurdur UTRYr X Türk Lirasır UMGAr XMadagaskar Ariaryr jXHollanda Antilleri Guldenir ULRDr XLiberya Dolarır URWFr XRuanda Frangır j!X Norveç Kronur UMXVr X!Meksika Unidad de Inversion (UDI)r jWX Kenya Şilinir UMOPr XMakao Patacasır j#XHindistan Rupisir j%XMeksika Pezosur UCZKr XÇek Cumhuriyeti Korunasır UTJSr XTacikistan Somonisir UTJRr XTacikistan Rublesir j'XBhutan Ngultrumur UYDDr X Yemen Dinarır UGWEr XPortekiz Ginesi Esküdosur j)XKolombiya Pezosur UCOUr XUnidad de Valor Realr jX Malta Lirasır UMURr XMauritius Rupisir j+XEndonezya Rupiahır j-XHonduras Lempirasır j/X CFP Frangır j1X Fiji Dolarır j3XEtiyopya Birrir UPENr XYeni Peru Solur! j5XBelize Dolarır" UCHWr# X WIR Frangır$ UATSr% XAvusturya Şilinir& UILPr' Xİsrail Lirasır( UZRNr) XYeni Zaire Zairesir* j7XDominik Pezosur+ ULULr, XFinansal Lüksemburg Frangır- UTMMr. XTürkmenistan Manatır/ j]XYeni Tayvan Dolarır0 UMDLr1 X Moldova Leyir2 UXPTr3 XPlatinr4 UECVr5 X'Ekvator Unidad de Valor Constante (UVC)r6 UECSr7 XEkvator Sukresir8 UBSDr9 XBahama Dolarır: j;X İsveç Kronur; j_XTonga Paʻangasır< UPEIr= X Peru İntir> UZMKr? XZambiya Kvaçasır@ UMVRrA XMaldiv Adaları RufiyaarB UXTSrC XTest Para Birimi KodurD j=XAvustralya DolarırE UADPrF XAndora PesetasırG UCUPrH X Küba PezosurI j?Xİrlanda LirasırJ UCLFrK XŞili Unidades de FomentorL jAXBarbados DolarırM jXKomorlar FrangırN UKRWrO XGüney Kore WonurP UGMDrQ XGambiya DalasisirR jCXGüçlü Venezuela BolivarırS jEXGuatemala KetzalirT jGXVenezuela BolivarırU UXOFrV XCFA Frangı BCEAOrW USITrX XSlovenya TolarırY USDPrZ XEski Sudan Lirasır[ jIX Şili Pezosur\ UEURr] XEuror^ UCDFr_ X Kongo Frangır` jXDoğu Karayip Dolarıra jMXKazakistan Tengesirb URUBrc X Rus Rublesird UXFUre XFransız UIC-Frangırf UXAGrg XGümüşrh UBRRri XBrezilya Kruzeirosurj UBRNrk XYeni Brezilya Kruzadosurl UBRLrm XBrezilya Realirn UMMKro XMyanmar Kyatırp UUYPrq XUruguay Pezosu (1975-1993)rr URURrs XRus Rublesi (1991-1998)rt jUXPolonya Zlotisiru UBRErv XBrezilya Kruzeirosu (1990-1993)rw UPYGrx XParaguay Guaranisiry UBRCrz XBrezilya Kruzadosur{ UBRBr| X$Yeni Brezilya Kruzeirosu (1967-1986)r} USVCr~ XEl Salvador Kolonur UAEDr X"Birleşik Arap Emirlikleri Dirhemir UGNSr X Gine Sylir j[XMakedonya Dinarır UAZMr XAzerbaycan Manatır UAZNr X Azeri Manatır UUSNr XABD Doları (Ertesi gün)r UGQEr XEkvator Ginesi Ekuelesir jXVanuatu Vatusur UBADr XBosna Hersek Dinarır jaX Gine Frangır UMXPr X#Gümüş Meksika Pezosu (1861-1992)r jcX Irak Dinarır UERNr XEritre Nakfasır jeXKonvertibl Bosna Hersek Markır jgXSeyşeller Rupisir jiXKanada Dolarır USDDr X Sudan Dinarır j}XGüney Kıbrıs Lirasır UMADr X Fas Dirhemir jmXKuveyt Dinarır joXBurundi Frangır ULTTr XLitvanya Talonur UPGKr XPapua Yeni Gine Kinasır ULTLr XLitvanya Litasır jsXSingapur Dolarır UUZSr XÖzbekistan Sumur juXSao Tome ve Principe Dobrasır UXFOr XFransız Altın Frangır UMLFr X Mali Frangır jwXİspanyol Pezetasır jyX İran Riyalir UZRZr X Zaire Zairesir j{XÇin Yuanı Renminbir USLLr XSierra Leone Leonesir UTNDr X Tunus Dinarır jYXGuyana Dolarır UESBr X&İspanyol Pesetası (konvertibl hesap)r UESAr Xİspanyol Pesetası (A hesabı)r jXYeni Zelanda Dolarır UFKPr XFalkland Adaları Lirasır ULVLr X Letonya Latır UUSSr XABD Doları (Aynı gün)r jX ABD Dolarır UARPr XArjantin Pezosu (1983-1985)r jX Kırgız Somur jXArjantin Pezosur UILSr XYeni İsrail Şekelir URONr X Romen Leyir URSDr X Sırp Dinarır jXBahreyn Dinarır jX Japon Yenir UARAr XArjantin Australir USDGr X Sudan Lirasır UPTEr XPortekiz Esküdosur UXAUr XAltınr uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXOr KXŞr Kj KXNr Kj KXHr KjNKXAr K jK jK XKr K j usUformatr }r (Uwider }r (KXOcakr KXŞubatr KXMartr KXNisanr KXMayısr KXHaziranr KXTemmuzr KXAğustosr K XEylülr K XEkimr K XKasımr K XAralıkr uU abbreviatedr }r (KXOcar KXŞubr KXMarr KXNisr KXMayr KXHazr KXTemr KXAğur K XEylr K XEkir K XKasr K XArar uuuUcurrency_formatsr }r Nh,)r }r (h/Nh1Kh2KKr h4X ¤r j r h7KKr h9X #,##0.00 ¤r h;h5hNh?KKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (KXPr KXSr KXÇr Kj KjKjKj usUformatr }r (Uwider }r (KX Pazartesir KXSalır KX Çarşambar KX Perşember KXCumar KX Cumartesir KXPazarr uU abbreviatedr! }r" (KXPztr# KXSalr$ KXÇarr% KXPerr& KXCumr' KXCmtr( KXPazr) uuuU meta_zonesr* }r+ (U Turkmenistanr, }r- (Ucommonr. Ulongr/ }r0 (Udaylightr1 XTürkmenistan Yaz Saatir2 Ustandardr3 XTürkmenistan Saatir4 uuU Kuybyshevr5 }r6 (j. j/ }r7 (j1 XKuybişev Yaz Saatir8 j3 XKuybişev Saatir9 uuURotherar: }r; (j. j/ }r< j3 X Rothera Saatir= suUArabianr> }r? (Ushortr@ }rA (UgenericrB XAT (Arabistan)rC j1 X ADT (Arap)rD j3 X AST (Arap)rE uj. j/ }rF (jB X Arap SaatirG j1 XArap Yaz SaatirH j3 XArap Standart SaatirI uuUAustralia_EasternrJ }rK (j. j/ }rL (jB XDoğu Avustralya SaatirM j1 XDoğu Avustralya Yaz SaatirN j3 XDoğu Avustralya Standart SaatirO uuU ArgentinarP }rQ (j. j/ }rR (j1 XArjantin Yaz SaatirS j3 XArjantin SaatirT uuUBoliviarU }rV (j. j/ }rW j3 X Bolivya SaatirX suU Alaska_HawaiirY }rZ (j. j/ }r[ (jB XAlaska-Hawaii Saatir\ j1 XAlaska-Hawaii Yaz Saatir] j3 XAlaska-Hawaii Standart Saatir^ uuU Cape_Verder_ }r` (j. j/ }ra (j1 XCape Verde Yaz Saatirb j3 XCape Verde Saatirc uuUAzoresrd }re (j. j/ }rf (j1 XAzor Yaz Saatirg j3 X Azor Saatirh uuUPierre_Miquelonri }rj (j. j/ }rk (jB XPierre ve Miquelon Saatirl j1 XPierre ve Miquelon Yaz Saatirm j3 X!Pierre ve Miquelon Standart Saatirn uuUEurope_Centralro }rp (j. j/ }rq (j1 XOrta Avrupa Yaz Saatirr j3 XOrta Avrupa Saatirs uuUTrukrt }ru (j. j/ }rv j3 X Truk Saatirw suU Aktyubinskrx }ry (j. j/ }rz (j1 XAktyubinsk Yaz Saatir{ j3 XAktyubinsk Saatir| uuUBeringr} }r~ (j. j/ }r (jB X Bering Saatir j1 XBering Yaz Saatir j3 XBering Standart Saatir uuU Qyzylordar }r (j. j/ }r (j1 XKızılorda Yaz Saatir j3 XKızılorda Saatir uuUKazakhstan_Easternr }r (j. j/ }r (jB XDoğu Kazakistan Saatir j3 XDoğu Kazakistan Standart Saatir uuUFrunzer }r (j. j/ }r (j1 XBişkek Yaz Saatir j3 X Bişkek Saatir uuU Dutch_Guianar }r (j. j/ }r j3 XHollanda Guyanası Saatir suUYerevanr }r (j. j/ }r (j1 XErivan Yaz Saatir j3 X Erivan Saatir uuU Kamchatkar }r (j. j/ }r (j1 X"Petropavlovsk-Kamçatski Yaz Saatir j3 XPetropavlovsk-Kamçatski Saatir uuUKashgarr }r (j. j/ }r j3 X Kaşgar Saatir suUMaldivesr }r (j. j/ }r j3 XMaldivler Saatir suUNorfolkr }r (j. j/ }r j3 XNorfolk Adası Saatir suU East_Timorr }r (j. j/ }r j3 XDoğu Timor Saatir suUAfrica_Easternr }r (j. j/ }r j3 XDoğu Afrika Saatir suU Ashkhabadr }r (j. j/ }r (j1 XAşkabat Yaz Saatir j3 XAşkabat Saatir uuUAlaskar }r (j. j/ }r (jB X Alaska Saatir j1 XAlaska Yaz Saatir j3 XAlaska Standart Saatir uuUAmerica_Easternr }r (j. j/ }r (jB X Doğu Saatir j1 XDoğu Yaz Saatir j3 XDoğu Standart Saatir uuU Yekaterinburgr }r (j. j/ }r (j1 XYekaterinburg Yaz Saatir j3 XYekaterinburg Saatir uuUSolomonr }r (j. j/ }r j3 XSolomon Adaları Saatir suU Krasnoyarskr }r (j. j/ }r (j1 XKrasnoyarsk Yaz Saatir j3 XKrasnoyarsk Saatir uuUAmerica_Centralr }r (j. j/ }r (jB X Merkezi Saatr j1 XMerkezi Yaz Saatir j3 XMerkezi Standart Saatir uuUMawsonr }r (j. j/ }r j3 X Mawson Saatir suUPakistanr }r (j. j/ }r (j1 XPakistan Yaz Saatir j3 XPakistan Saatir uuUSamoar }r (j. j/ }r j3 XSamoa Standart Saatir suUMacaur }r (j. j/ }r (j1 XMakao Yaz Saatir j3 X Makao Saatir uuUChamorror }r (j. j/ }r (jB XChamorro Saatir j3 XChamorro Standart Saatir uuUGuamr }r (j@ }r j3 X GST (Guam)r sj. j/ }r j3 XGuam Standart Saatir suUIndiar }r (j. j/ }r j3 XHindistan Standart Saatir suU Azerbaijanr }r (j. j/ }r (j1 XAzerbaycan Yaz Saatir j3 XAzerbaycan Saatir uuU Marquesasr }r (j. j/ }r j3 X Markiz Saatir suU Tajikistanr }r (j. j/ }r j3 XTacikistan Saatir suUPitcairnr }r (j. j/ }r j3 XPitcairn Saatir suUTurkeyr }r (j. j/ }r (j1 XTürkiye Yaz Saatir j3 XTürkiye Saatir uuU Afghanistanr }r (j. j/ }r j3 XAfganistan Saatir suU Choibalsanr }r (j. j/ }r (j1 XÇoybalsan Yaz Saatir j3 XÇoybalsan Saatir uuU Vladivostokr }r (j. j/ }r (j1 XVladivostok Yaz Saatir j3 XVladivostok Saatir uuU Shevchenkor }r (j. j/ }r (j1 XŞevçenko Yaz Saatir! j3 XŞevçenko Saatir" uuU Bangladeshr# }r$ (j. j/ }r% j3 XBangladeş Saatir& suUGulfr' }r( (j. j/ }r) (jB X Körfez Saatir* j3 XGulf Standart Saatir+ uuUDaccar, }r- (j. j/ }r. j3 X Dakka Saatir/ suUMongoliar0 }r1 (j. j/ }r2 (j1 XUlan Batur Yaz Saatir3 j3 XUlan Batur Saatir4 uuU Samarkandr5 }r6 (j@ }r7 (j1 XSAMST (Semerkand)r8 j3 XSAMT (Semerkand)r9 uj. j/ }r: (j1 XSemerkand Yaz Saatir; j3 XSemerkand Saatir< uuUWaker= }r> (j. j/ }r? j3 XWake Adası Saatir@ suUPerurA }rB (j. j/ }rC (j1 XPeru Yaz SaatirD j3 X Peru SaatirE uuUVanuaturF }rG (j. j/ }rH (j1 XVanuatu Yaz SaatirI j3 X Vanuatu SaatirJ uuUIndonesia_CentralrK }rL (j. j/ }rM j3 XOrta Endonezya SaatirN suUNaururO }rP (j. j/ }rQ j3 X Nauru SaatirR suUFalklandrS }rT (j. j/ }rU (j1 XFalkland Adaları Yaz SaatirV j3 XFalkland Adaları SaatirW uuUKorearX }rY (j. j/ }rZ (jB X Kore Saatir[ j1 XKore Yaz Saatir\ j3 XKore Standart Saatir] uuUCubar^ }r_ (j@ }r` (j1 X CDT (Küba)ra j3 X CST (Küba)rb uj. j/ }rc (jB X Küba Saatird j1 XKüba Yaz Saatire j3 XKüba Standart Saatirf uuUIrkutskrg }rh (j. j/ }ri (j1 XIrkutsk Yaz Saatirj j3 X Irkutsk Saatirk uuUArgentina_Westernrl }rm (j. j/ }rn j3 XBatı Arjantin Saatiro suUAmazonrp }rq (j. j/ }rr (j1 XAmazon Yaz Saatirs j3 X Amazon Saatirt uuUChinaru }rv (j@ }rw (jB X CT (Çin)rx j1 X CDT (Çin)ry j3 X CST (Çin)rz uj. j/ }r{ (jB X Çin Saatir| j1 XÇin Yaz Saatir} j3 XÇin Standart Saatir~ uuULong_Shur }r (j. j/ }r j3 XLong-Shu Saatir suUArmeniar }r (j@ }r (j1 XAMST (Ermenistan)r j3 XAMT (Ermenistan)r uj. j/ }r (j1 XErmenistan Yaz Saatir j3 XErmenistan Saatir uuUCookr }r (j. j/ }r (j1 XCook Adaları Yarı Yaz Saatir j3 XCook Adaları Saatir uuUChathamr }r (j. j/ }r (j1 XChatham Yaz Saatir j3 XChatham Standart Saatir uuUGreenland_Westernr }r (j. j/ }r (j1 XBatı Grönland Yaz Saatir j3 XBatı Grönland Saatir uuUKarachir }r (j. j/ }r j3 X Karaçi Saatir suUTongar }r (j. j/ }r (j1 XTonga Yaz Saatir j3 X Tonga Saatir uuUSakhalinr }r (j. j/ }r (j1 XSakhalin Yaz Saatir j3 XSakhalin Saatir uuUBrasiliar }r (j. j/ }r (j1 XBrezilya Yaz Saatir j3 XBrezilya Saatir uuUSyowar }r (j. j/ }r j3 X Showa Saatir suU French_Guianar }r (j. j/ }r j3 XFransız Guyanası Saatir suUFrench_Southernr }r (j. j/ }r j3 X Fransız Güney Bölgeleri Saatir suU Mauritiusr }r (j. j/ }r j3 XMauritius Saatir suUAfrica_Southernr }r (j. j/ }r (jB XGüney Afrika Saatir j3 XGüney Afrika Standart Saatir uuUGambierr }r (j. j/ }r j3 X Gambier Saatir suUDavisr }r (j. j/ }r j3 X Davis Saatir suU Newfoundlandr }r (j. j/ }r (jB XNewfoundland Saatir j1 XNewfoundland Yaz Saatir j3 XNewfoundland Standart Saatir uuUCocosr }r (j. j/ }r j3 XCocos Adaları Saatir suU Kyrgystanr }r (j. j/ }r j3 XKırgızistan Saatir suUTokelaur }r (j. j/ }r j3 X Tokelau Saatir suUAustralia_Westernr }r (j. j/ }r (jB XBatı Avustralya Saatir j1 XBatı Avustralya Yaz Saatir j3 XBatı Avustralya Standart Saatir uuUBakur }r (j. j/ }r (j1 XBakü Yaz Saatir j3 X Bakü Saatir uuUAfrica_Centralr }r (j. j/ }r j3 XOrta Afrika Saatir suU Line_Islandsr }r (j. j/ }r j3 XLine Adaları Saatir suU Novosibirskr }r (j. j/ }r (j1 XNovosibirsk Yaz Saatir j3 XNovosibirsk Saatir uuUJapanr }r (j. j/ }r (jB X Japonya Saatir j1 XJaponya Yaz Saatir j3 XJaponya Standart Saatir uuU Sverdlovskr }r (j. j/ }r (j1 XSverdlovsk Yaz Saatir j3 XSverdlovsk Saatir uuU New_Caledoniar }r(j. j/ }r(j1 XYeni Kaledonya Yaz Saatirj3 XYeni Kaledonya SaatiruuU Kwajaleinr}r(j. j/ }rj3 XKwajalein SaatirsuUAqtober}r (j@ }r (j1 XAQTST (Aktöbe)r j3 XAQTT (Aktöbe)r uj. j/ }r (j1 XAktöbe Yaz Saatirj3 X Aktöbe SaatiruuUGilbert_Islandsr}r(j. j/ }rj3 XGilbert Adaları SaatirsuUAustralia_CentralWesternr}r(j. j/ }r(jB XAvustralya Batı Merkezi Saatirj1 X"Avustralya Batı Merkezi Yaz Saatirj3 X'Avustralya Batı Merkezi Standart SaatiruuU Indochinar}r(j. j/ }rj3 XÇinhindi SaatirsuUPapua_New_Guinear}r(j. j/ }r j3 XPapua Yeni Gine Saatir!suUHovdr"}r#(j. j/ }r$(j1 XHovd Yaz Saatir%j3 X Hovd Saatir&uuU South_Georgiar'}r((j@ }r)j3 XGST (Güney Georgia)r*sj. j/ }r+j3 XGüney Georgia Saatir,suUEcuadorr-}r.(j. j/ }r/j3 X Ekvator Saatir0suUMalayar1}r2(j. j/ }r3j3 X Malaya Saatir4suUBruneir5}r6(j. j/ }r7j3 X Brunei Saatir8suUIranr9}r:(j. j/ }r;(j1 Xİran Yaz Saatir<j3 Xİran Standart Saatir=uuUAqtaur>}r?(j@ }r@(j1 X AQTST (Aktau)rAj3 X AQTT (Aktau)rBuj. j/ }rC(j1 XAktau Yaz SaatirDj3 X Aktau SaatirEuuU Indian_OceanrF}rG(j. j/ }rHj3 XHint Okyanusu SaatirIsuUTuvalurJ}rK(j. j/ }rLj3 X Tuvalu SaatirMsuUAmerica_MountainrN}rO(j. j/ }rP(jB XABD Sıradağlar SaatirQj1 XABD Sıradağlar Yaz SaatirRj3 XABD Sıradağlar Standart SaatirSuuUHawaii_AleutianrT}rU(j. j/ }rVj3 XHawaii-Aleutian Standart SaatirWsuUChangbairX}rY(j. j/ }rZj3 XChangbai Saatir[suUChiler\}r](j. j/ }r^(j1 XŞili Yaz Saatir_j3 X Şili Saatir`uuUWallisra}rb(j. j/ }rcj3 XWallis ve Futuna SaatirdsuUKosraere}rf(j. j/ }rgj3 X Kosrae SaatirhsuUDushanberi}rj(j. j/ }rk(j1 XDuşanbe Yaz Saatirlj3 XDuşanbe SaatirmuuUGeorgiarn}ro(j. j/ }rp(j1 XGürcistan Yaz Saatirqj3 XGürcistan SaatirruuUAnadyrrs}rt(j. j/ }ru(j1 XAnadır Yaz Saatirvj3 X Anadır SaatirwuuU Philippinesrx}ry(j. j/ }rz(j1 XFilipinler Yaz Saatir{j3 XFilipinler Saatir|uuUYakutskr}}r~(j. j/ }r(j1 XYakutsk Yaz Saatirj3 X Yakutsk SaatiruuUIndonesia_Westernr}r(j. j/ }rj3 XBatı Endonezya SaatirsuUGreenland_Easternr}r(j. j/ }r(j1 XDoğu Grönland Yaz Saatirj3 XDoğu Grönland SaatiruuUGMTr}r(j. j/ }rj3 XGreenwich Merkez SaatirsuUMarshall_Islandsr}r(j. j/ }rj3 XMarshall Adaları SaatirsuU Seychellesr}r(j. j/ }rj3 XSeyşeller SaatirsuUUruguayr}r(j. j/ }r(j1 XUruguay Yaz Saatirj3 X Uruguay SaatiruuUVostokr}r(j. j/ }rj3 X Vostok SaatirsuU Uzbekistanr}r(j. j/ }r(j1 XÖzbekistan Yaz Saatirj3 XÖzbekistan SaatiruuUColombiar}r(j. j/ }r(j1 XKolombiya Yaz Saatirj3 XKolombiya SaatiruuUReunionr}r(j. j/ }rj3 X Reunion SaatirsuU Volgogradr}r(j. j/ }r(j1 XVolgograd Yaz Saatirj3 XVolgograd SaatiruuU Kizilordar}r(j. j/ }r(j1 XKızılorda Yaz Saatirj3 XKızılorda SaatiruuUFijir}r(j. j/ }r(j1 XFiji Yaz Saatirj3 X Fiji SaatiruuUAmerica_Pacificr}r(j. j/ }r(jB X Pasifik Saatirj1 XPasifik Yaz Saatirj3 XPasifik Standart SaatiruuUKazakhstan_Westernr}r(j. j/ }r(jB XBatı Kazakistan Saatirj3 XBatı Kazakistan Standart SaatiruuUPalaur}r(j. j/ }rj3 X Palau SaatirsuUEurope_Easternr}r(j. j/ }r(j1 XDoğu Avrupa Yaz Saatirj3 XDoğu Avrupa SaatiruuUBhutanr}r(j. j/ }rj3 X Bhutan SaatirsuUBorneor}r(j. j/ }r(j1 XBorneo Yaz Saatirj3 X Borneo SaatiruuUNepalr}r(j. j/ }rj3 X Nepal SaatirsuU Galapagosr}r(j. j/ }rj3 XGalapagos SaatirsuU Lord_Hower}r(j. j/ }r(jB XLord Howe Saatirj1 XLord Howe Yaz Saatirj3 XLord Howe Standart SaatiruuUPhoenix_Islandsr}r(j. j/ }rj3 XPhoenix Adaları SaatirsuUSurinamer}r(j. j/ }rj3 X Surinam SaatirsuUAcrer}r(j. j/ }r(j1 XAcre Yaz Saatirj3 X Acre SaatiruuUEasterr}r(j. j/ }r(j1 XEaster Adası Yaz Saatirj3 XEaster Adası SaatiruuU Christmasr}r(j. j/ }rj3 XChristmas Adası SaatirsuUIsraelr}r(j@ }rj3 X IST (İsrail)rsj. j/ }r(jB X İsrail Saatirj1 Xİsrail Yaz Saatirj3 Xİsrail Standart SaatiruuUAfrica_Westernr}r(j. j/ }r(j1 XBatı Afrika Yaz Saatir j3 XBatı Afrika Saatir uuUTashkentr }r (j. j/ }r (j1 XTaşkent Yaz Saatirj3 XTaşkent SaatiruuUMalaysiar}r(j. j/ }rj3 X Malezya SaatirsuUNoronhar}r(j. j/ }r(j1 XFernando de Noronha Yaz Saatirj3 XFernando de Noronha SaatiruuU Venezuelar}r(j. j/ }rj3 XVenezuela SaatirsuUPonaper}r(j. j/ }rj3 X Ponape Saatir suUIndonesia_Easternr!}r"(j. j/ }r#j3 XDoğu Endonezya Saatir$suUOmskr%}r&(j. j/ }r'(j1 XOmsk Yaz Saatir(j3 X Omsk Saatir)uuUAustralia_Centralr*}r+(j. j/ }r,(jB XOrta Avustralya Saatir-j1 XOrta Avustralya Yaz Saatir.j3 XOrta Avustralya Standart Saatir/uuUAtlanticr0}r1(j. j/ }r2(jB XAtlantik Saatir3j1 XAtlantik Yaz Saatir4j3 XAtlantik Standart Saatir5uuU North_Marianar6}r7(j. j/ }r8j3 XKuzey Mariana Adaları Saatir9suULankar:}r;(j. j/ }r<j3 X Lanka Saatir=suUDumontDUrviller>}r?(j. j/ }r@j3 XDumont-d'Urville SaatirAsuUEurope_WesternrB}rC(j. j/ }rD(j1 XBatı Avrupa Yaz SaatirEj3 XBatı Avrupa SaatirFuuU New_ZealandrG}rH(j. j/ }rI(jB XYeni Zelanda SaatirJj1 XYeni Zelanda Yaz SaatirKj3 XYeni Zelanda Standart SaatirLuuUUrumqirM}rN(j. j/ }rOj3 X Urumçi SaatirPsuU Hong_KongrQ}rR(j. j/ }rS(j1 XHong Kong Yaz SaatirTj3 XHong Kong SaatirUuuUGuyanarV}rW(j. j/ }rXj3 X Guyana SaatirYsuUMagadanrZ}r[(j. j/ }r\(j1 XMagadan Yaz Saatir]j3 X Magadan Saatir^uuUAlmatyr_}r`(j. j/ }ra(j1 XAlmati Yaz Saatirbj3 X Almati SaatircuuUTbilisird}re(j. j/ }rf(j1 XTiflis Yaz Saatirgj3 X Tiflis SaatirhuuUMyanmarri}rj(j. j/ }rkj3 X Myanmar SaatirlsuU Singaporerm}rn(j. j/ }roj3 XSingapur Standart SaatirpsuUSamararq}rr(j. j/ }rs(j1 XSamara Yaz Saatirtj3 X Samara SaatiruuuUGreenland_Centralrv}rw(j. j/ }rx(j1 XOrta Grönland Yaz Saatiryj3 XOrta Grönland SaatirzuuUUralskr{}r|(j. j/ }r}(j1 XUral Yaz Saatir~j3 X Ural SaatiruuUTahitir}r(j. j/ }rj3 X Tahiti SaatirsuUParaguayr}r(j. j/ }r(j1 XParaguay Yaz Saatirj3 XParaguay SaatiruuUYukonr}r(j. j/ }r(jB X Yukon Saatirj1 XYukon Yaz Saatirj3 XYukon Standart SaatiruuUMoscowr}r(j. j/ }r(jB X Moskova Saatirj1 XMoskova Yaz Saatirj3 XMoskova Standart SaatiruuUNiuer}r(j. j/ }rj3 X Niue SaatirsuuUerasr}r(Uwider}r(KXMilattan ÖncerKXMilattan SonraruU abbreviatedr}r(KXMÖrKXMSruuu.PK[Rll%site-packages/babel/localedata/sh.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/yo_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[1ll)site-packages/babel/localedata/fur_IT.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll-site-packages/babel/localedata/tg_Cyrl_TJ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[ћ(site-packages/babel/localedata/so_ET.datnu[}q(Ucurrency_symbolsq}q(UETBqX$qUSOSqXSOSquUscientific_formatsq}qUpercent_formatsq }q Unumber_symbolsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}q U meta_zonesq!}q"Uvariantsq#}q$Ucurrency_namesq%}q&u.PK[IƼaa%site-packages/babel/localedata/as.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXপূৰ্বাqUpmqXঅপquUscientific_formatsq}qUpercent_formatsq}qNcbabel.numbers NumberPattern q )q!}q"(Uexp_precq#NUscaleq$KdU frac_precq%KKq&Usuffixq'X%q(h(q)Uint_precq*KKq+Upatternq,X #,##,##0%q-Uprefixq.Xq/X-q0q1Uexp_plusq2NUgroupingq3KKq4ubsU week_dataq5}q6(Umin_daysq7KU weekend_startq8KU first_dayq9KU weekend_endq:KuU time_formatsq;}q<(Umediumq=cbabel.dates DateTimePattern q>)q?}q@(h,X h.mm.ss aqAUformatqBX%(h)s.%(mm)s.%(ss)s %(a)sqCubUfullqDh>)qE}qF(h,X h.mm.ss a vqGhBX%(h)s.%(mm)s.%(ss)s %(a)s %(v)sqHubUlongqIh>)qJ}qK(h,X h.mm.ss a zqLhBX%(h)s.%(mm)s.%(ss)s %(a)s %(z)sqMubUshortqNh>)qO}qP(h,Xh.mm. aqQhBX%(h)s.%(mm)s. %(a)sqRubuU languagesqS}qT(UasqUXঅসমীয়াqVUieqWX%উপস্থাপন ভাষাqXUkmqYX!কম্বোডিয়ানqZuU territoriesq[}q\(UZZq]X6অজ্ঞাত বা অবৈধ অঞ্চলq^URUq_X ৰুচq`UFRqaXফ্ৰান্সqbUGSqcXwদক্ষিণ জৰ্জিয়া আৰু দক্ষিণ চেণ্ডৱিচ্‌ দ্বীপqdUCNqeX চীনqfUINqgX ভাৰতqhUIOqiX`ব্ৰিটিশ্ব ইণ্ডিয়ান মহাসাগৰৰ অঞ্চলqjUDEqkXজাৰ্মানিqlUJPqmXজাপানqnUITqoXইটালিqpUUSqqX$যুক্তৰাষ্ট্ৰqrUAQqsX!এন্টাৰ্টিকাqtUBVquXবভেট দ্বীপqvUGBqwX%সংযুক্ত ৰাজ্যqxUBRqyXব্ৰাজিলqzUHMq{X^হাৰ্ড দ্বীপ আৰু মেক্‌ডোনাল্ড দ্বীপq|UTFq}X;দক্ষিণ ফ্ৰান্সৰ অঞ্চলq~uUdecimal_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X #,##,##0.###qh.h/h0qh2Nh3KKqubsU date_formatsq}q(Umediumqh>)q}q(h,X dd-MM-yyyyqhBX%(dd)s-%(MM)s-%(yyyy)squbUfullqh>)q}q(h,XEEEE, d MMMM, yyyyqhBX"%(EEEE)s, %(d)s %(MMMM)s, %(yyyy)squbUlongqh>)q}q(h,X d MMMM, yyyyqhBX%(d)s %(MMMM)s, %(yyyy)squbUshortqh>)q}q(h,Xd-M-yyyyqhBX%(d)s-%(M)s-%(yyyy)squbuUcurrency_symbolsq}qUINRqX টকাqsU time_zonesq}qU Asia/Calcuttaq}qUcityqXএলাহাৱাদqssUscriptsq}qUBengqXবঙালীqsUvariantsq}qUnumber_symbolsq}qUcurrency_namesq}qUmonthsq}q(U stand-aloneq}qUnarrowq}q(KX1qKX2qKX3qKX4qKX5qKX6qKX7qKX8qK X9qK X10qK X11qK X12qusUformatq}q(Uwideq}q(KXজানুয়াৰীqKX!ফেব্ৰুয়াৰীqKXমাৰ্চqKXএপ্ৰিলqKXমেqKX জুনqKXজুলাইqKXআগষ্টqK Xসেপ্টেম্বৰqK Xঅক্টোবৰqK Xনভেম্বৰqK Xডিসেম্বৰquU abbreviatedq}q(KX জানুqKXফেব্ৰুqKXমাৰ্চqKXএপ্ৰিলqKXমেqKX জুনqKXজুলাইqKXআগqK Xসেপ্টqK Xঅক্টোqK X নভেqK X ডিসেquuuUcurrency_formatsq}qNh )q}q(h#Nh$Kh%KKqh'h/h/qh*KKqh,X¤ #,##,##0.00qh.X¤ qX-¤ qqh2Nh3KKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhKhKhKhKhKhKhusUformatq}q(Uwideq}q(KXসোমবাৰqKXমঙ্গলবাৰqKXবুধবাৰqKX!বৃহষ্পতিবাৰqKXশুক্ৰবাৰqKXশনিবাৰqKXদেওবাৰquU abbreviatedr}r(KX সোমrKXমঙ্গলrKX বুধrKXবৃহষ্পতিrKXশুক্ৰrKX শনিrKX ৰবিruuuU meta_zonesr }r UIndiar }r (Ushortr }rUstandardrX ভা. স.rsUcommonrUlongr}rjX"ভাৰতীয় সময়rsusUerasr}rU abbreviatedr}r(KXBCErKXCErusu.PK[lw_GG%site-packages/babel/localedata/my.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q (Uwideq }q (KX"ပထမ သုံးလပတ်q KX(ဒုတိယ သုံးလပတ်q KX%တတိယ သုံးလပတ်qKX+စတုတ္ထ သုံးလပတ်quU abbreviatedq}q(KXပ-စိတ်qKXဒု-စိတ်qKXတ-စိတ်qKXစ-စိတ်quUnarrowq}q(KXပqKXဒုqKXတqKXစquuUformatq}q(Uwideq}q(KX"ပထမ သုံးလပတ်q KX(ဒုတိယ သုံးလပတ်q!KX%တတိယ သုံးလပတ်q"KX+စတုတ္ထ သုံးလပတ်q#uU abbreviatedq$}q%(KXပ-စိတ်q&KXဒု-စိတ်q'KXတ-စိတ်q(KXစ-စိတ်q)uuuUperiodsq*}q+(Uamq,Xနံနက်q-Upmq.X ညနေq/uUscientific_formatsq0}q1Ncbabel.numbers NumberPattern q2)q3}q4(Uexp_precq5KKq6Uscaleq7KU frac_precq8KKq9Usuffixq:Xq;h;qUpatternq?X#E0q@UprefixqAh;X-qBqCUexp_plusqDUgroupingqEMMqFubsUpercent_formatsqG}qHNh2)qI}qJ(h5Nh7Kdh8KKqKh:X%qLhLqMh=KKqNh?X#,##0%qOhAh;hBqPhDNhEKKqQubsU week_dataqR}qS(Umin_daysqTKU weekend_startqUKU first_dayqVKU weekend_endqWKuU time_formatsqX}qY(UmediumqZcbabel.dates DateTimePattern q[)q\}q](h?XHH:mm:ssq^Uformatq_X%(HH)s:%(mm)s:%(ss)sq`ubUfullqah[)qb}qc(h?X HH:mm:ss vqdh_X%(HH)s:%(mm)s:%(ss)s %(v)sqeubUlongqfh[)qg}qh(h?X HH:mm:ss zqih_X%(HH)s:%(mm)s:%(ss)s %(z)sqjubUshortqkh[)ql}qm(h?XHH:mmqnh_X %(HH)s:%(mm)sqoubuU languagesqp}qq(Uzh_HantqrX7ရှေးရိုးစဉ်လာ တရုတ်qsUguqtXဂူဂျာရသီquUscoqvXစကော့qwUneqxXနီပေါလ်qyUmniqzXမနိပူရီq{Ugaq|Xအိုင်းရစ်q}Umnoq~X.မနိုဘို ဘာသာစကားqUmncqXမန်ချူးqUgmhqXBအလယ်ပိုင်းအမြင့်ဂျာမန်qUlaqXလက်တင်qUloqXလာအိုqUthqXထိုင်းqUtaiqX(တိုင် ဘာသာစကားqUsuqXဆူဒန်qUfilqXဖိလစ်ပီနိုqUhawqXဟာဝေယံqUmgaqX:အလယ်ပိုင်း အိုင်းရစ်qUsmiqX%ဆာမိ ဘာသာစကားqUpt_BRqX+ဘရာဇီး ပေါ်တူဂီqUdeqXဂျာမန်qUbatqX1ဘော်လတစ် ဘာသာစကားqUdaqXဒိန်းမတ်qUdzqXဒွန်ကာqUmulqXLအကြိမ်များစွာ ဘာသာစကားများqUgemqX=ဂျာမန် အခြေခံဘာသာစကားqUcrpqXအနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကားqUbasqX ဘာဆာqUcpfqXပြင်သစ် အခြေခံ အနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကားqUbanqX ဘာလီqUshnqXရှမ်းqUelqX ဂရိqUenqXအင်္ဂလိပ်qUartqX:အယောင်ဆောင် ဘာသာစကားqUbeqXဘီလာရုqUzh_HansqX4ရိုးရှင်းသော တရုတ်qUphiqX7ဖိလစ်ပိုင် ဘာသာစကားqUsgaqX.အိုင်းရစ် ဟောင်းqUen_USqX4အမေရိကန် အင်္ဂလိပ်qUetqX0အက်စ်တိုးနီးရန်းqUesqXစပိန်qUruqX ရုရှqUpeoqX(ပါရှန် အဟောင်းqUde_ATqX(ဩစတြီးယ ဂျာမန်qUiraqX;အီရန် အခြေခံ ဘာသာစကားqUroqXရိုမေနီယားqUbnqXဘင်္ဂါလီqUsmaqX.တောင်ပိုင်း ဆာမိqUen_CAqX+ကနေဒါ အင်္ဂလိပ်qUbgqX!ဘူဂေးရီးယားqUukqXယူကရိန်းqUtupqX%တူပီ ဘာသာစကားqUjvqX!ဂျာဗားနီးစ်qUboqXတိဘက်qUbsqX$ဘော့စ်နီးယားqUjaqXဂျပန်qUfaqXပါရှန်qUrootqX!မူလရင်းမြစ်qUundqXUမသိ သို့မဟုတ် မရှိ သော ဘာသာစကားqUndsqX%အနိမ့် ဂျာမန်qUjrbqX+ဂျူဒီယို-အာရေဗျqUceqXချေချင်းqUcyqX ဝေလqUsgnqX.အချက်ပြ ဘာသာစကားqUcsqX ချက်qUcrqX ခရီးqUde_CHqX2ဆွစ် အမြင့် ဂျာမန်qUdumqX1အလယ်ပိုင်း ဒတ်ချ်qUptqXပေါ်တူဂီqUfroqX'ပြင်သစ်ဟောင်းqUfrmqX3အလယ်ပိုင်းပြင်သစ်qUmkhqX/မွန်-ခမာ ဘာသာစကားqUfrsrX:အရှေ့ပိုင်း ဖရီစီရန်rUfrrrX=မြောက်ပိုင်း ဖရီစီရန်rUchrrXချာရိုကီrUparXပန်ဂျာပီrUzxxrXZဘာသာစကား နှင့် ပတ်သက် သောအရာမရှိr Upir X ပါဠိr Uen_GBr X4ဗြိတိသျှ အင်္ဂလိပ်r UzhrXတရုတ်rUhrrXခရိုအေရှန်rUkarX!ဂျော်ဂျီယန်rUhurXဟန်ဂေရီrUhirXဟိန္ဒီrUherXဟီးဘရူးrUmlrXမလေးရာလမ်rUmnrX*မွန်ဂိုလီးယန်းrUcaurX=ကောက်ကေးရှပ် ဘာသာစကားrUcair Xiအလယ်ပိုင်း အမေရိကန် အိန္ဒြိယ ဘာသာစကားr!Udelr"Xဒီလာဝဲr#Uplr$Xပိုလန်r%Umsr&X မလေးr'Umrr(Xမာရသီr)Utar*Xတမီးလ်r+Umyr,X ဗမာr-Uslar.X.စလိုဗစ် ဘာသာစကားr/Usair0XZတောင် အမေရိကန် အိန္ဒြိယ ဘာသာစကားr1Uangr2X3အင်္ဂလိပ်စာဟောင်းr3Uvir4Xဗီယက်နမ်r5Uitr6Xအီတလီr7Ucper8Xအင်္ဂလိပ် အခြေခံ အနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကားr9Uiir:Xစီချွမ် ရီr;Uarr<Xအာရေဗီr=Ues_419r>X4လက်တင်အမေရိက စပိန်r?Uiner@X;အင်ဒို ဥရောပ ဘာသာစကားrAUkharBX ခါစီrCUjprrDX+ဂျူဒီယို-ပါရှန်rEUidrFX'အင်ဒိုနီးရှားrGUincrHXDအိန္ဒြိယ အခြေခံ ဘာသာစကားrIUnlrJXဒတ်ချ်rKUnorLXနော်ဝေးrMUenmrNX:အလယ်ပိုင်း အင်္ဂလိပ်rOUen_AUrPX7ဩစတြေးလျှ အင်္ဂလိပ်rQUpaarRX.ပါပူရန် ဘာသာစကားrSUgrcrTX(ရှေးဟောင်း ဂရိrUUzurVX ဇူလူrWUmisrXXCအမျိုးမျိုးသော ဘာသာစကားrYUkacrZXကချင်r[Ufrr\Xပြင်သစ်r]Ufyr^X=အနောက်ပိုင်း ဖရီစီရန်r_Usvr`Xဆွီဒင်raUkarrbX ကရင်rcUfr_CHrdX"ဆွစ် ပြင်သစ်reUfirfXဖင်နစ်ရှ်rgUfjrhXဖီဂျီriUdakrjXဒါကိုတာrkUfr_CArlX%ကနေဒါ ပြင်သစ်rmUegyrnX1ရှေးဟောင်း အီဂျစ်roUkgrpXကွန်ဂိုrqUgswrrXဆွစ် ဂျာမန်rsUsrrtXဆားဗီးယန်းruUsqrvX-အယ်လ်ဘေးနီးယန်းrwUsitrxX8တရုတ်-တိဘက် ဘာသာစကားryUkorzXကိုးရီးယားr{Uknr|Xကန်နာဒါr}Ukmr~X ခမာrUskrXစလိုဗက်rUsirXဆင်ဟာလrUsorXဆိုမာလီrUkurX ကဒ်rUslrX*စလိုဗေးနီးယမ်းrUcpprXပေါ်တူဂီ အခြေခံ အနောက်အိန္ဒြိယ ကျွန်းစုသား သို့မဟုတ် ဗန်းစကားrUsarX!သင်္သကရိုက်rUsdrXစင်ဒီruU territoriesr}r(UBDrX*ဘင်္ဂလားဒေ့ရှ်rUBErX!ဘယ်လ်ဂျီယမ်rUBGrX!ဘူဂေးရီးယားrUVErX!ဗင်နီဇွဲလားrUBArXYဘော့စနီးယား နှင့် ဟာဇီဂိုဘီးနားrUBMrXဘာမူဒါrUBNrXဘရူနိုင်းrUBOrX$ဘိုလီးဘီးယားrUBHrXဘာရိန်းrUBTrXဘူတန်rU011rX%အနောက် အာဖရိကrUBWrXဘော့စ်ဝါနာrU014rX4အရှေ့ပိုင်း အာဖရိကrU015rX7မြောက်ပိုင်း အာဖရိကrUBRrXဘရာဇီးrU017rX1အလယ်ပိုင်း အာဖရိကrU018rX4တောင်ပိုင်း အာဖရိကrU019rXအမေရိကများrUBYrXဘီလာရုစ်rUBZrXဘေလီဇ်rURUrX ရုရှrURWrXရဝန်ဒါrURSrXဆားဘီးယားrUTLrXအရှေ့တီမောrUTJrX$တာဂျီကစ္စတန်rUROrX$ရိုမေးနီးယားrUGUrXဂူအမ်rUGTrXဂွာတီမာလာrUGSrXတောင် ဂျော်ဂျီယာ နှင့် တောင် ဆင်းဒဝစ်ဂျ် ကျွန်းစုများrUGRrX ဂရိrUGQrX(အီကွေတာ ဂီရာနာrUJPrXဂျပန်rUGFrX(ပြင်သစ် ဂီယာနာrUGErXဂျော်ဂျီယာrU021rX7မြောက်ပိုင်း အမေရိကrUGBrX6ယူနိုက်တက်ကင်းဒမ်းrUGNrXဂီရာနာrUGMrXဂန်ဘီရာrUGLrXဂရင်းလန်းrU029rXကာရီဘီယံrUGIrX$ဂျီဘရော်လ်တာrUGHrX ဂါနာrUOMrXအိုမန်rUTNrXတူနီးရှားrUJMrXဂျမေနီကာrU013rX1အလယ်ပိုင်း အမေရိကrU419rXQလက်တင် အမေရိက နှင့် ကာရီဘီယန်rUHRrX!ခရိုအေးရှားrUBSrXဘဟားမားrUHTrX ဟေတီrUHUrXဟန်ဂေရီrUHKrXkတရုတ်၏ အထူးအုပ်ချုပ်ခွင့်ရ ဟောင်ကောင်rU039rX1တောင်ပိုင်း ဥရောပrUHNrX$ဟွန်ဒူးရပ်စ်rUJErXဂျာစီrU142rX အာရှrU030rX.အရှေ့ပိုင်း အာရှrU034rX.တောင်ပိုင်း အာရှrU035rX@အ‌ရှေ့တောင်ပိုင်း အာရှrUPRrX!ပေါ်တူရီကိုr UPSr X=ပါလက်စတိုင်း ပိုင်နက်r UPTr Xပေါ်တူဂီr UPYrXပါရာဂွေးrUIQrXအီရတ်rUPArXပနားမားrUPFrX=ပြင်သစ် ပေါ်လီနေးရှားrUPGrX*ပါပူရာနယူးဂီနီrUPErXပီရူးrUPKrXပါကစ္စတန်rUPHrXဖိလစ်ပိုင်rUFOrX7ဖာရိုး ကျွန်းစုများrUPLr Xပိုလန်r!UZMr"Xဇမ်ဘီယာr#UEHr$X4အနောက်ပိုင်း ဆာဟာရr%UEEr&X*အက်စတိုးနီးယားr'UEGr(Xအီဂျစ်r)UZAr*X!တောင်အာဖရိကr+UECr,Xအီကွေဒေါr-UVNr.Xဗီယက်နမ်r/UZZr0XIမသိ သို့မဟုတ် မရှိ သော နေရာr1USBr2X3ဆော်လမွန်ကျွန်းစုr3UETr4X*အီသီယိုးပီးယားr5USOr6Xဆိုမာလီယာr7UZWr8Xဇင်ဘာဘွေr9USAr:X3ဆော်ဒီအာရေးဗီးယားr;UESr<Xစပိန်r=UMEr>X'မွန်တီနိဂရိုးr?UAQr@Xအန္တာတိကrAUMGrBXမဒဂတ်စကာrCUMFrDXစိန့်မာတင်rEUMArFXမော်ရိုကိုrGUMCrHXမိုနကိုrIUUZrJX!ဥဘက်ကစ္စတန်rKUMMrLXမြန်မာrMUMLrNX မာလီrOUMOrPX_တရုတ်၏ အထူးအုပ်ချုပ်ခွင့်ရ မကာအိုrQUMNrRX*မွန်ဂိုးလီးယားrSUASrTX(အမေရိကန် စမိုအrUUMKrVX*မာစီဒိုးနီးယားrWUUMrXXယူနိုက်တက်စတိတ် အပြင်ထွက် နေသည့် သေးငယ်သောကျွန်းများrYUMWrZXမာလာဝီr[UMVr\Xမော်လဒိုက်r]UUGr^Xယူဂန္ဒာr_UMYr`XမလေးရှားraUMXrbXမက္ကဆီကိုrcUILrdXအစ္စရေးreUFRrfXပြင်သစ်rgUIOrhXcဗြိတိသျှ အိန္ဒြိယ သမုဒ္ဒရာ ပိုင်နက်riUDOrjXဒိုမီနီကန်rkUFIrlXဖင်လန်rmUFJrnXဖီဂျီroUFKrpX4ဖောက်ကလန် ကျွန်းစုrqU172rrXqလွတ်လပ်သော ပြည်ထောင်စုများ၏ ဓနသဟာယအဖွဲ့rsU053rtXGဩစတြေးလျှ နှင့် နယူးဇီလန်ruUNIrvXနီကာရာဂွာrwUNLrxXနယ်သာလန်ryUNOrzXနော်ဝေr{UNAr|X$နမ်မီးဘီးယားr}UNCr~X7နယူး ကယ်လီဒိုနီးယားrUNErXနိုင်ဂျာrUNGrX-နိုင်ဂျီးရီးယားrUNZrXနယူးဇီလန်rUNPrXနီပေါrUCKrX%ကွတ် ကျွန်းစုrUCIrX*အိုင်ဗရီကိုစ့်rUCHrXဆွစ်ဇလန်rUCOrXကိုလံဘီယာrUCNrXတရုတ်rUCMrXကင်မရွန်းrUCLrXချီလီrUCCrX.ကိုကိုး ကျွန်းစုrUCArXကနေဒါrUCFrXSအလယ်ပိုင်း အာဖရိက ပြည်ထောင်စုrUCZrX.ချက် ပြည်ထောင်စုrUCYrX!ဆိုက်ပရက်စ်rUCXrX+ခရစ်စမတ် ကျွန်းrUCRrX$ကော့စ်တာရီကာrUCUrXကျူးဘားrUSYrXဆီးရီးယားrUKGrXခယ်ကစ်စတန်rUKErXကင်ညာrUKHrX$ကမ္ဘောဒီးယားrUSVrX*အယ်လ်ဆာဗေးဒိုးrUSKrX'စလိုဗေးကီးယားrUKRrX*တောင်ကိုရီးယားrUSIrX'စလိုဗေးနီးယားrUKPrX-မြောက်ကိုရီးယားrUKWrXကူဝိတ်rUSNrXဆီနီဂေါrUKZrXကာဇက်စတန်rUKYrX(ကေမန် ကျွန်းစုrUSGrXစင်္ကာပူrUSErXဆွီဒင်rUSDrXဆူဒန်rU151rX1အရှေ့ပိုင်း ဥရောပrU150rXဥရောပrUDMrXဒိုမီနီကာrU155rX4အနောက်ပိုင်း ဥရောပrU154rX4မြောက်ပိုင်း ဥရောပrUVGrXGဗြိတိသျှ ဗာဂျင်း ကျွန်းစုrUDErXဂျာမဏီrUYErXယီမင်rUMHrX+မာရှယ် ကျွန်းစုrU062rX)တောင်-အလယ် အာရှrUDZrX-အယ်လ်ဂျီးရီးယားrUUSrX-ယူနိုက်တက်စတိတ်rUUYrXဥရုဂွေးrULBrXလက်ဘနွန်rULArXလာအိုrUTWrXထိုင်ဝမ်rUTRrXတူရကီrULKrXသီရိလင်္ကာrULVrXလတ်ဗီးယားrUTOrXတွန်ဂါrULTrX*လစ်သူယေးနီးယားrULUrXလူဇင်ဘတ်rULRrX*လိုင်ဘေးရီးယားrUTHrXထိုင်းrUTFrX\ပြင်သစ် တောင်ပိုင်း ပိုင်နက်များrUTDrX ချဒ်rUVArXဗာတီကန်rU145rXအနောက် အာရှrUAErXယူအေအီးrU143rXအလယ် အာရှrUAFrX'အာဖဂန်နစ္စတန်rUAIrXအန်ကွီလာrUVIrXDယူအက်စ် ဗာဂျင်း ကျွန်းစုrUISrXအိုက်စလန်r UIRr Xအီရန်r UAMr Xအာမေနီးယားr UITrXအီတလီrUAOrXအင်ဂိုလာrU003rX%မြောက် အမေရိကrU002rXအာဖရိကrU001rXကမ္ဘာrUARrX$အာဂျင်တီးနားrUAUrX!ဩစတြေးလျှားrUATrXဩစတြီးယားrU005rX"တောင် အမေရိကrUINr Xအိန္ဒိယr!UTZr"X$တန်ဇန်နီးယားr#U009r$X!သမုဒ္ဒရာဒေသr%UAZr&X$အဇာဘိုင်ဂျန်r'UIEr(Xအိုင်ယာလန်r)UIDr*X'အင်ဒိုနီးရှားr+UJOr,Xဂျော်ဒန်r-UQUr.Xဥရောပသမဂ္ဂr/UUAr0Xယူကရိန်းr1UQAr2X ကာတာr3UDKr4Xဒိန်းမတ်r5UMZr6Xမိုဇန်ဘစ်r7uUdecimal_formatsr8}r9Nh2)r:}r;(h5Nh7Kh8KKr<h:h;h;r=h=KKr>h?X #,##0.###r?hAh;hBr@hDNhEKKrAubsU date_formatsrB}rC(UmediumrDh[)rE}rF(h?X yyyy MMM drGh_X%(yyyy)s %(MMM)s %(d)srHubUfullrIh[)rJ}rK(h?XEEEE, yyyy MMMM ddrLh_X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)srMubUlongrNh[)rO}rP(h?X yyyy MMMM drQh_X%(yyyy)s %(MMMM)s %(d)srRubUshortrSh[)rT}rU(h?Xyy/MM/ddrVh_X%(yy)s/%(MM)s/%(dd)srWubuUcurrency_symbolsrX}rYU time_zonesrZ}r[(UAmerica/Indianapolisr\}r]Ucityr^X3အင်ဒီယားနားပိုလစ်r_sUAmerica/New_Yorkr`}raj^Xနယူးယောက်rbsUAmerica/Denverrc}rdj^Xဒင်ဗာresUPacific/Honolulurf}rgj^XဟိုနိုလူလူrhsUAmerica/Phoenixri}rjj^Xဖီးနစ်rksU Etc/Unknownrl}rmj^XမသိသောrnsUAmerica/Los_Angelesro}rpj^X6လော့စ်အိန်ဂျယ်လိစ်rqsUAmerica/Rio_Brancorr}rsj^X%ရီယို ဗြန်ကိုrtsUAmerica/Anchorageru}rvj^X!အန်ကာရေ့ဂျ်rwsUAmerica/Campo_Granderx}ryj^X%ကိမ်ပို ဂရန်ဒrzsUAmerica/Chicagor{}r|j^Xချီကာကိုr}sUAmerica/Sao_Paulor~}rj^XဆာပိုလိုrsuUscriptsr}r(UYiiirXရီrUJavarX!ဂျာဗားနီးစ်rUTamlrXတမီးလ်rUHebrrXဟီဗရူးrUGeorrX!ဂျော်ဂျီယန်rUXpeorX(ပါရှန် အဟောင်းrUCyrlrXစစ်ရိလစ်rUHrktrX8ခတခဏ သို့မဟုတ် ဟိရဂဏrUArmnrX!အာမေးနီးယားrUKhmrrX ခမာrULatnrXလက်တင်rUHanirX ဟန်rUEthirX*အီသီယိုးပီးယားrUGujrrXဂုဂျာရသီrUKorerXကိုးရီးယားrUHangrXဟန်ဂူးလ်rUArabrXအာရေဗျrUZxxxrXမရေးထားသောrUSinhrXဆင်ဟာလrUHansrX4ရိုးရှင်းသော တရုတ်rUThairXထိုင်းrUHantrX7ရှေးရိုးစဉ်လာ တရုတ်rUMongrX'မွန်ဂိုလီးယားrUDevarXဒီဗနာဂရီrULaoorXလာအိုrUHirarXဟိရဂဏrUZzzzrXTမသိ သို့မဟုတ် မရှိသော စကားလုံးrUVisprX1မြင်နိုင်သော စကားrUTalerXတိုင်လီrUMymrrXမြန်မာrUTglgrXတဂလော့ဂ်rUBrahrXဗြဟ္မမီrUGrekrX ဂရိrUTibtrXတိဘက်rUKalirXကယားလီrUJpanrXဂျပန်rUKanarX ခတခဏrUBengrXဘင်္ဂါလီrUSundrXဆူဒန်ruUvariantsr}r(UBAKU1926rXhပေါင်းစပ်ထားသော တူရကီ လက်တင်စကားလုံးrUREVISEDrXLပြန်လည်စီစစ်ထားသော ရေးထုံးrUFONIPArXIPA အသံထွက်rU1606NICTrXdအလယ်ပိုင်းနောက်ကျသောပြင်သစ်မှ ၁၆၀၆rU1996rX5၁၉၉၆ ဂျာမန် ရေးထုံးrUSCOTLANDrX2စကော့ စံ အင်္ဂလိပ်rU1694ACADrX၁၆၉၄ACADrUAREVELArXEအရှေ့ပိုင်းအာမေးနီးယန်းrUPOSIXrXကွန်ပျူတာrUFONUPArXUPA အသံထွက်rU1901rXPရှေးရိုးစဉ်လာ ဂျာမန် ရေးထုံးruUnumber_symbolsr}rUcurrency_namesr}r(UNADrX7နမ်မီးဘီးယား ဒေါ်လာrUBOPrX4ဘိုလီးဘီးယား ပီဆိုrUEGPrX"အီဂျစ် ပေါင်rUXAGrX ငွေrUDKKrX+ဒိန်းမတ် ခရိုဏာrUXBBrX3ဥရောပငွေကြေးစံနစ်rUBWPrX(ဘော့စ်ဝါနာ ပုလrULBPrX(လက်ဘနွန် ပေါင်rUVNDrX(ဗီယက်နမ် ဒေါင်rUKHRrX4ကမ္ဘောဒီးယား ရီးယဲrUMYRrX.မလေးရှား ရင်းဂစ်rUKYDrX;ကေမန် ကျွန်းစု ဒေါ်လာrUAWGrX(အရူဘန် ဂင်းဒါးrUBNDrX.ဘရူနိုင်း ဒေါ်လာrUHKDr X1ဟောင်ကောင် ဒေါ်လာr UCHFr Xဆွစ် ဖရန့်r UGIPr X4ဂျီဘရော်လ်တာ ပေါင်rUBYRrX(ဘီလာရုစ် ရူဘယ်rUXAUrX ရွှေrUBYBrXPဘီလာရုစ် ရူဘယ်အသစ် (၁၉၉၄-၁၉၉၉)rUTHBrXထိုင်းဘတ်rUXPTrXပလက်တီနမ်rUFRFrX%ပြင်သစ် ဖရန့်rUPHPrX.ဖိလစ်ပိုင် ပီဆိုrUNPRrXနီပေါ ရူပီးrUBEFrX1ဘယ်လ်ဂျီယမ် ဖရန့်r UDEMr!Xဂျာမဏီ မတ်r"UGBPr#X(ဗြိတိသျှ ပေါင်r$ULKRr%X.သီရိလင်္ကာ ရူပီးr&UPKRr'X+ပါကစ္စတန် ရူပီးr(UBMDr)X%ဘာမူဒါ ဒေါ်လာr*UBUKr+Xဗမာ ကျပ်r,UXDRr-X-အထူးထုတ်ယူခွင့်r.UJMDr/X+ဂျမေနီကာ ဒေါ်လာr0UTRLr1XCရှေးဟောင်းတူရကီ လိုင်ရာr2UKPWr3X:မြောက်ကိုးရီးယား ဝမ်r4UTRYr5X%တူရကီ လိုင်ရာr6UBDTr7X7ဘင်္ဂလားဒေ့ရှ် တာကာr8UPLNr9X+ပိုလန် ဇ‌လော့တီr:UANGr;XGနယ်သာလန် အန်တီလန် ဂင်းဒါးr<ULRDr=X=လိုင်ဘေးရီးယား ဒေါ်လာr>URWFr?X"ရဝန်ဒါ ဖရန့်r@UNOKrAX%နော်ဝေ ခရိုဏာrBUINRrCX(အိန္ဒြိယ ရူပီးrDUMXNrEX+မက္ကဆီကို ပီဆိုrFUCOPrGX+ကိုလံဘီယာ ပီဆိုrHUIDRrIX@အင်ဒိုနီးရှား ရူပီးယားrJUFJDrKX"ဖီဂျီ ဒေါ်လာrLUBZDrMX%ဘေလီဇ် ဒေါ်လာrNUSURrOX(ဆိုဗီယက် ရူဗယ်rPUILPrQX%အစ္စရေး ပေါင်rRUDOPrSX.ဒိုမီနီကန် ပီဆိုrTUMMKrUXမြန်မာ ကျပ်rVUBSDrWX(ဘဟားမား ဒေါ်လာrXUSEKrYX%ဆွီဒင် ခရိုဏာrZUXTSr[X8စမ်းသပ် ငွေကြေး ကုဒ်r\UAUDr]X4ဩစတြေးလျှား ဒေါ်လာr^USRDr_X(ဆူရိနမ် ဒေါ်လာr`UCUPraX%ကျူးဘား ပီဆိုrbUZWDrcX+ဇင်ဘာဘွေ ဒေါ်လာrdUKRWreX7တောင်ကိုးရီးယား ဝမ်rfUCLPrgXချီလီ ပီဆိုrhUEURriXယူရိုrjURUBrkXရုရှ ရူဘယ်rlUBRLrmX"ဘရာဇီး ရီးယဲrnUSBDroXFဆော်လမွန်ကျွန်းစု ဒေါ်လာrpURURrqX8ရုရှ ရူဘယ် (၁၉၉၁-၁၉၉၈)rrUUSSrsXFအမေရိကန် ဒေါ်လာ (တနေ့တည်း)rtUUSDruX+အမေရိကန် ဒေါ်လာrvUTWDrwX7ထိုင်ဝမ် ဒေါ်လာအသစ်rxUUSNryXFအမေရိကန် ဒေါ်လာ (နောက်နေ့)rzUGNFr{X"ဂီရာနာ ဖရန့်r|UCADr}X"ကနေဒါ ဒေါ်လာr~UCYPrX1ဆိုက်ပရက်စ် ပေါင်rUBIFrX(ဘူရွန်ဒီ ဖရန့်rUXXXrXQမသိ သို့မဟုတ် မရှိသော ငွေကြေးrUSGDrX+စင်္ကာပူ ဒေါ်လာrUESPrX(စပိန် ပယ်စေးတာrUCNYrXတရုတ် ယွမ်rUXOFrXCFA ဖရန့် BCEAOrUNZDrX.နယူးဇီလန် ဒေါ်လာrUFKPrXDဖောက်ကလန် ကျွန်းစု ပေါင်rUARPrXPအာဂျင်တီးနား ပီဆို (၁၉၈၃-၁၉၈၅)rUARSrX4အာဂျင်တီးနား ပီဆိုrUSDPrX4ဆူဒန် ပေါင်အဟောင်းrUJPYrXဂျပန်ယန်းrUSDGrXဆူဒန် ပေါင်ruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXဇrKXဖrKXမrKXဧrKXမrKXဇrKXဇrKXဩrK XစrK XအrK XနrK XဒrusUformatr}r(Uwider}r(KXဇန်နဝါရီrKXဖေဖော်ဝါရီrKX မတ်rKX ဧပြီrKXမေrKX ဇွန်rKXဇူလိုင်rKXဩဂုတ်rK Xစက်တင်ဘာrK Xအောက်တိုဘာrK Xနိုဝင်ဘာrK Xဒီဇင်ဘာruU abbreviatedr}r(KX ဇန်rKXဖေrKX မတ်rKXဧrKXမေrKX ဇွန်rKXဇူrKXဩrK X စက်rK Xအောက်rK X နိုrK XဒီruuuUcurrency_formatsr}rNh2)r}r(h5Nh7Kh8KKrh:h;h;rh=KKrh?X ¤ #,##0.00rhAX¤ rX-¤ rrhDNhEKKrubsUdaysr}r(U stand-aloner}rUnarrowr}r(KXတrKXအrKXဗrKXကrKXသrKXစrKXတrusUformatr}r(Uwider}r(KXတနင်္လာrKXအင်္ဂါrKXဗုဒ္ဓဟူးrKXကြာသပတေးrKXသောကြာrKX စနေrKXတနင်္ဂနွေruU abbreviatedr}r(KXလာrKXဂါrKX ဟူးrKX တေးrKX ကြာrKXနေrKX နွေruuuU meta_zonesr}r(UTurkeyr}r(UcommonrUlongr}r(UdaylightrX8တူရကီ နွေရာသီ အချိန်rUstandardrXDတူရကီ စံတော်ချိန် အချိန်ruuU Afghanistanr}r(jj}rjX:အာဖဂန်နစ္စတန် အချိန်rsuU Indochinar}r(jj}r jXCအင်ဒိုချိုင်းနား အချိန်r suU South_Georgiar }r (jj}r jX@တောင်ဂျော်ဂျီယာ အချိန်rsuU Bangladeshr}r(jj}rjX=ဘင်္ဂလားဒေ့ရှ် အချိန်rsuUBhutanr}r(jj}rjX"ဘူတန် အချိန်rsuUEurope_Easternr}r(jj}r(UgenericrX7ရိုမေးနီးယား အချိန်rjXGအရှေ့ဥရောပ နွေရာသီ အချိန်rjX1အရှေ့ဥရောပ အချိန်ruuUKazakhstan_Easternr}r(jj}r (jX=အရှေ့ကာဇက်စတန် အချိန်r!jXLအရှေ့ကာဇက်စတန် စံတော်ချိန်r"uuUAustralia_CentralWesternr#}r$(jj}r%(jXeအလယ်အနောက်ပိုင်း ဩစတြေးလျှား အချိန်r&jXအလယ်အနောက်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန်r'jXtအလယ်အနောက်ပိုင်း ဩစတြေးလျှား စံတော်ချိန်r(uuUNepalr)}r*(jj}r+jX"နီပေါ အချိန်r,suU Uzbekistanr-}r.(jj}r/(jXJဥဘက်ကစ္စတန် နွေရာသီ အချိန်r0jX4ဥဘက်ကစ္စတန် အချိန်r1uuUArabianr2}r3(jj}r4(jX%အာရေဗျ အချိန်r5jXAအာရေဗျ နေ့ပိုင်း အချိန်r6jX4အာရေဗျ စံတော်ချိန်r7uuUAustralia_Easternr8}r9(jj}r:(jXCအရှေ့ဩစတြေးလျှား အချိန်r;jXrအရှေ့ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန်r<jXeအရှေ့ပိုင်း ဩစတြေးလျှား စံတော်ချိန်r=uuUIndonesia_Centralr>}r?(jj}r@jXYအလယ်ပိုင်း အင်ဒိုနီးရှား အချိန်rAsuU ArgentinarB}rC(jj}rD(jXMအာဂျင်တီးနား နွေရာသီ အချိန်rEjX7အာဂျင်တီးနား အချိန်rFuuUBoliviarG}rH(jj}rIjX7ဘိုလီးဘီးယား အချိန်rJsuU VenezuelarK}rL(jj}rMjX4ဗင်နီဇွဲလား အချိန်rNsuUEcuadorrO}rP(jj}rQjX+အီကွေဒေါ အချိန်rRsuU East_TimorrS}rT(jj}rUjX1အရှေ့တီမော အချိန်rVsuUBruneirW}rX(jj}rYjX=ဘရူနိုင်း စံတော်ချိန်rZsuUIsraelr[}r\(Ushortr]}r^jXIST (အစ္စရေး)r_sjj}r`(jX(အစ္စရေး အချိန်rajXDအစ္စရေး နေ့ပိုင်း အချိန်rbjX7အစ္စရေး စံတော်ချိန်rcuuUAfrica_Westernrd}re(jj}rf(jX`အနောက်ပိုင်း အာဖရိက နွေရာသီ အချိန်rgjXJအနောက်ပိုင်း အာဖရိက အချိန်rhuuUIranri}rj(jj}rk(jX>အီရန် နေ့ပိုင်း အချိန်rljX1အီရန် စံတော်ချိန်rmuuUGulfrn}ro(jj}rp(jX1ပင်လယ်ဂွေ့ အချိန်rqjX@ပင်လယ်ဂွေ့ စံတော်ချိန်rruuU Indian_Oceanrs}rt(jj}rujXDအိန္ဒြိယ သမုဒ္ဒရာ အချိန်rvsuUCubarw}rx(jj}ry(jX(ကျူးဘား အချိန်rzjX>ကျူးဘား နွေရာသီ အချိန်r{jX7ကျူးဘား စံတော်ချိန်r|uuUAmerica_Mountainr}}r~(jj}r(jX5အမေရိက တောင် အချိန်rjXQအမေရိက တောင် နေ့ပိုင်း အချိန်rjXDအမေရိက တောင် စံတော်ချိန်ruuUMalaysiar}r(jj}rjX+မလေးရှား အချိန်rsuUArgentina_Westernr}r(jj}rjXJအနောက် အာဂျင်တီးနား အချိန်rsuUIndonesia_Easternr}r(jj}rjX\အရှေ့ပိုင်း အင်ဒိုနီးရှား အချိန်rsuUPerur}r(jj}r(jX8ပီရူး နွေရာသီ အချိန်rjX"ပီရူး အချိန်ruuUAustralia_Centralr}r(jj}r(jX@အလယ်ဩစတြေးလျှား အချိန်rjXoအလယ်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန်rjXbအလယ်ပိုင်း ဩစတြေးလျှား စံတော်ချိန်ruuU Hong_Kongr}r(jj}r(jXGဟောင်ကောင် နွေရာသီ အချိန်rjX1ဟောင်ကောင် အချိန်ruuUAtlanticr}r(jj}r(jX1အတ္ထလန်တစ် အချိန်rjXMအတ္ထလန်တစ် နေ့ပိုင်း အချိန်rjX@အတ္ထလန်တစ် စံတော်ချိန်ruuUArmeniar}r(jj}r(jXGအာမေနီးယား နွေရာသီ အချိန်rjX1အာမေနီးယား အချိန်ruuUBrasiliar}r(jj}r(jX;ဘရာဇီး နွေရာသီ အချိန်rjX%ဘရာဇီး အချိန်ruuUChinar}r(jj}r(jX"တရုတ် အချိန်rjX>တရုတ် နေ့ပိုင်း အချိန်rjX1တရုတ် စံတော်ချိန်ruuUGreenland_Westernr}r(jj}r(jXWအနောက် ဂရင်းလန်း နွေရာသီ အချိန်rjXAအနောက် ဂရင်းလန်း အချိန်ruuUMoscowr}r(jj}r(jX+မော်စကို အချိန်rjXAမော်စကို နွေရာသီ အချိန်rjX:မော်စကို စံတော်ချိန်ruuUGeorgiar}r(jj}r(jXGဂျော်ဂျီယာ နွေရာသီ အချိန်rjX1ဂျော်ဂျီယာ အချိန်ruuUChiler}r(jj}r(jX8ချီလီ နွေရာသီ အချိန်rjX"ချီလီ အချိန်ruuUKorear}r(jj}r(jX1ကိုးရီးယား အချိန်rjXMကိုးရီးယား နေ့ပိုင်း အချိန်rjX@ကိုးရီးယား စံတော်ချိန်ruuUEurope_Westernr}r(jj}r(jX]အနောက်ပိုင်း ဥရောပ နွေရာသီ အချိန်rjXGအနောက်ပိုင်း ဥရောပ အချိန်ruuUAfrica_Easternr}r(jj}rjXGအရှေ့ပိုင်း အာဖရိက အချိန်rsuU Philippinesr}r(jj}r(jXGဖိလစ်ပိုင် နွေရာသီ အချိန်rjX1ဖိလစ်ပိုင် အချိန်ruuU French_Guianar}r(jj}rjX;ပြင်သစ် ဂီယာနာ အချိန်rsuU New_Zealandr}r(jj}r(jX.နယူးဇီလန် အချိန်rjXJနယူးဇီလန် နေ့ပိုင်း အချိန်rjX=နယူးဇီလန် စံတော်ချိန်ruuUAlaskar}rjsUAmerica_Easternr}r(jj}r(jXGအရှေ့ပိုင်း အမေရိက အချိန်rjXGအရှေ့ပိုင်း အမေရိက အချိန်rjXVအရှေ့ပိုင်း အမေရိက စံတော်ချိန်ruuUParaguayr}r(jj}r(jXAပါရာဂွေး နွေရာသီ အချိန်rjX+ပါရာဂွေး အချိန်ruuUAfrica_Southernr}r(jj}r(jX4တောင်အာဖရိက အချိန်rjXCတောင်အာဖရိက စံတော်ချိန်ruuUAmerica_Pacificr}r(jj}r(jX(ပစိဖိတ် အချိန်rjXDပစိဖိတ် နေ့ပိုင်း အချိန်rjX7ပစိဖိတ် စံတော်ချိန်ruuUIndonesia_Westernr}r(jj}rjX_အနောက်ပိုင်း အင်ဒိုနီးရှား အချိန်rsuUAmerica_Centralr}r(jj}r(jXDအလယ်ပိုင်း အမေရိက အချိန်rjXZအလယ်ပိုင်း အမေရိက နွေရာသီ အချိန်rjXSအလယ်ပိုင်း အမေရိက စံတော်ချိန်r uuUGreenland_Easternr }r (jj}r (jXSအရှေ့ဂရင်းလန်း နွေရာသီ အချိန်r jX=အရှေ့ဂရင်းလန်း အချိန်ruuU Dutch_Guianar}r(jj}rjX8ဒတ်ချ် ဂီယာနာ အချိန်rsuU Newfoundlandr}r(jj}r(jX7နယူးဖောင်လန် အချိန်rjXSနယူးဖောင်လန် နေ့ပိုင်း အချိန်rjXFနယူးဖောင်လန် စံတော်ချိန်ruuUGMTr}r(jj}rjX:ဂရင်းနစ် စံတော်ချိန်rsuUPakistanr}r(jj}r(jXDပါကစ္စတန် နွေရာသီ အချိန်r jX.ပါကစ္စတန် အချိန်r!uuUIrishr"}r#(jj}r$jX1အိုင်ယာလန် အချိန်r%suUMyanmarr&}r'(jj}r(jX%မြန်မာ အချိန်r)suUMacaur*}r+(jj}r,(jX;မကာအို နွေရာသီ အချိန်r-jX%မကာအို အချိန်r.uuUUruguayr/}r0(jj}r1(jX>ဥရုဂွေး နွေရာသီ အချိန်r2jX(ဥရုဂွေး အချိန်r3uuULankar4}r5(jj}r6jX1သီရိလင်္ကာ အချိန်r7suU Singaporer8}r9(jj}r:jX:စင်္ကာပူ စံတော်ချိန်r;suUIndiar<}r=(jj}r>jX:အိန္ဒြိယ စံတော်ချိန်r?suU Azerbaijanr@}rA(jj}rB(jXMအဇာဘိုင်ဂျန် နွေရာသီ အချိန်rCjX7အဇာဘိုင်ဂျန် အချိန်rDuuUAfrica_CentralrE}rF(jj}rGjXDအလယ်ပိုင်း အာဖရိက အချိန်rHsuUFalklandrI}rJ(jj}rK(jX\ဖောင်ကလန်ကျွန်းစု နွေရာသီ အချိန်rLjXFဖောင်ကလန်ကျွန်းစု အချိန်rMuuUGreenland_CentralrN}rO(jj}rP(jXPအလယ်ဂရင်းလန်း နွေရာသီ အချိန်rQjX:အလယ်ဂရင်းလန်း အချိန်rRuuUPapua_New_GuinearS}rT(jj}rUjX=ပါပူရာနယူးဂီနီ အချိန်rVsuUColombiarW}rX(jj}rY(jXDကိုလံဘီယာ နွေရာသီ အချိန်rZjX.ကိုလံဘီယာ အချိန်r[uuUBritishr\}r](jj}r^(jX+ဗြိတိသျှ အချိန်r_jXAဗြိတိသျှ နွေရာသီ အချိန်r`uuUJapanra}rb(jj}rc(jX"ဂျပန် အချိန်rdjX>ဂျပန် နေ့ပိုင်း အချိန်rejX1ဂျပန် စံတော်ချိန်rfuuUAustralia_Westernrg}rh(jj}ri(jXGအနောက် ဩစတြေးလျှား အချိန်rjjXuအနောက်ပိုင်း ဩစတြေးလျှား နေ့ပိုင်း အချိန်rkjXhအနောက်ပိုင်း ဩစတြေးလျှား စံတော်ချိန်rluuUEurope_Centralrm}rn(jj}ro(jX(ပြင်သစ် အချိန်rpjXWဥရောပ အလယ်ပိုင်း နွေရာသီ အချိန်rqjXAဥရောပ အလယ်ပိုင်း အချိန်rruuuUerasrs}rt(Uwideru}rv(KX7ခရစ်တော် မပေါ်မီကာလrwKXIခရစ်တော် ပေါ်ထွန်းပြီးကာလrxuU abbreviatedry}rz(KX ဘီစီr{KX အေဒီr|uuu.PK[^DD(site-packages/babel/localedata/en_MT.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqXHH:mm:ssqUformatqX%(HH)s:%(mm)s:%(ss)squbUfullqh)q}q(hX HH:mm:ss vq hX%(HH)s:%(mm)s:%(ss)s %(v)sq!ubUlongq"h)q#}q$(hX HH:mm:ss zq%hX%(HH)s:%(mm)s:%(ss)s %(z)sq&ubUshortq'h)q(}q)(hXHH:mmq*hX %(HH)s:%(mm)sq+ubuU languagesq,}q-U territoriesq.}q/Udecimal_formatsq0}q1U date_formatsq2}q3(Umediumq4h)q5}q6(hX dd MMM yyyyq7hX%(dd)s %(MMM)s %(yyyy)sq8ubUfullq9h)q:}q;(hXEEEE, d MMMM yyyyqh)q?}q@(hX dd MMMM yyyyqAhX%(dd)s %(MMMM)s %(yyyy)sqBubUshortqCh)qD}qE(hX dd/MM/yyyyqFhX%(dd)s/%(MM)s/%(yyyy)sqGubuUcurrency_symbolsqH}qIUGBPqJXGBPqKsU time_zonesqL}qMUscriptsqN}qOUvariantsqP}qQUnumber_symbolsqR}qSUcurrency_namesqT}qUUmonthsqV}qWUcurrency_formatsqX}qYNcbabel.numbers NumberPattern qZ)q[}q\(Uexp_precq]NUscaleq^KU frac_precq_KKq`UsuffixqaXqbhbqcUint_precqdKKqehX ¤#,##0.00qfUprefixqgX¤qhX-¤qiqjUexp_plusqkNUgroupingqlKKqmubsUdaysqn}qoU meta_zonesqp}qqUerasqr}qsu.PK[D))(site-packages/babel/localedata/sr_CS.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll%site-packages/babel/localedata/no.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_|V(site-packages/babel/localedata/en_ZW.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q (Upatternq!X dd MMM,yyyyq"Uformatq#X%(dd)s %(MMM)s,%(yyyy)sq$ubUfullq%h)q&}q'(h!XEEEE dd MMMM yyyyq(h#X!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)sq)ubUlongq*h)q+}q,(h!X dd MMMM yyyyq-h#X%(dd)s %(MMMM)s %(yyyy)sq.ubUshortq/h)q0}q1(h!Xd/M/yyyyq2h#X%(d)s/%(M)s/%(yyyy)sq3ubuUcurrency_symbolsq4}q5U time_zonesq6}q7Uscriptsq8}q9Uvariantsq:}q;Unumber_symbolsq<}q=Ucurrency_namesq>}q?UZWDq@XZimbabwean DollarqAsUmonthsqB}qCUcurrency_formatsqD}qENcbabel.numbers NumberPattern qF)qG}qH(Uexp_precqINUscaleqJKU frac_precqKKKqLUsuffixqMXqNhNqOUint_precqPKKqQh!X ¤#,##0.00qRUprefixqSX¤qTX-¤qUqVUexp_plusqWNUgroupingqXKKqYubsUdaysqZ}q[U meta_zonesq\}q](UAfrica_Easternq^}q_Ucommonq`sUAfrica_Southernqa}qbh`sUAfrica_Westernqc}qdh`sUAfrica_Centralqe}qfh`suUerasqg}qhu.PK[Oy//(site-packages/babel/localedata/pt_PT.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUformatq}qUwideq }q (KX1.º trimestreq KX2.º trimestreq KX3.º trimestreq KX4.º trimestrequssUperiodsq}q(UamqXAntes do meio-diaqUpmqXDepois do meio-diaquUscientific_formatsq}qUpercent_formatsq}qU week_dataq}q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}q Ufullq!cbabel.dates DateTimePattern q")q#}q$(Upatternq%XHH'H'mm'm'ss's' vq&Uformatq'X%(HH)sH%(mm)sm%(ss)ss %(v)sq(ubsU languagesq)}q*(Uromq+Xromanêsq,Ualgq-Xidioma algonquianoq.Uafaq/Xidioma afro-asiáticoq0Umnoq1X idioma manoboq2Ugmhq3X(alemão, medieval alto (aprox.1050-1500)q4Ucusq5Xidioma cuchitaq6Ufiuq7Xidioma ugro-finêsq8Uwenq9Xidioma sórbioq:Ubynq;XblinqUausq?Xidioma australianoq@UroaqAXidioma românicoqBUtgqCXtajiqueqDUtaqEXtamilqFUmgaqGXirlandês, medieval (900-1200)qHUdyuqIXdiulaqJUcelqKXidioma célticoqLUbatqMXidioma bálticoqNUrmqOX reto-romanceqPUssaqQXidioma nilo-sarianoqRUgemqSXidioma germânicoqTUcrpqUXCrioulo ou PidginqVUcmcqWX idioma chamicqXUcrhqYXturco da CrimeiaqZUbaiq[Xbamileke Languagesq\Uenq]XInglêsq^Uartq_Xidioma artificalq`Uzh_HansqaXchinês simplificadoqbUphiqcXidioma filipinoqdUmkqeX macedónioqfUetqgXestónioqhUsemqiXidioma semíticoqjUnubqkX idioma núbioqlUgohqmX&alemão, arcaico alto (aprox.750-1050)qnUluaqoX luba-luluaqpUpeoqqX#persa arcaico (aprox. 600-400 a.C.)qrUsmiqsX idioma samiqtUmulquXvárias línguasqvUhsbqwXsorbiano superiorqxUtupqyX idioma tupiqzUjvq{Xjvq|Ututq}Xidioma altaicoq~UlezqX lezghianoqUzzaqXzazakiqUocqX provençalqUathqXidioma atabascanoqUdraqXidioma dravíticoqUkrcqXkarachay-balkarqUndsqX baixo alemãoqUosqX osséticoqUnsoqXsoto, setentrionalqUpt_PTqXportuguês europeuqUceqXchecheneqUfrmqX$francês, medieval (aprox.1400-1600)qUsgnqXlinguages de sinaisqUcsqXchecoqUapaqX idioma apacheqUde_CHqXalemão alto (Suíça)qUwakqXidioma wakashanqUsalqXsalishan languagesqUfroqX"francês, arcaico (842-aprox.1400)qUtlqX tagalogueqUchnqXjargão chinookqUmkhqXmon-khmer (other)qUfrsqXfrísio orientalqUzxxqXsem conteúdo linguísticoqUakqXakanqUplqXpolacoqUhyqXarménioqUotoqXidioma otomanoqUzh_HantqXchinês tradicionalqUbuaqXburiatqUbugqXBugineseqUibaqXIbanqUcauqXidioma caucásicoqUtogqXtoganêsqUcaiqX!idioma indígena centro-americanoqUslaqX idioma eslavoqUsaiqXidioma indígeno sul-americanoqUangqX"inglês, arcaico (aprox. 450-1100)qUpraqXidioma prácitoqUafqX afrikaansqUproqXprovençal, arcaico (até 1500)qUnonqX norse, oldqUnl_BEqXflamengo (Bélgica)qUkhiqXkhoisanqUikqXInupiaqqUineqXidioma indo-europeuqUtaiqXidioma tailândesqUigqXigboqUincqXidioma índicoqUafhqXafrihiliqUsitqXidioma sino-tibetanoqUtetqXtetumqUnahqXNauatleqUnaiqX idioma indígena norte-americanoqUenmqXinglês, medieval (1100-1500)qUpaaqXidioma papuanoqUgrbqXgreboqUgrcqXgrego clássicoqUypkqXidioma iúpiqueqUsioqX idioma siouxqUkaaqX kara-kalpakqUnicqXnigeriano - cordofanoqUtyvqX tuvinianoqUawaqXAwadhiqUegyqXegípcio clássicorUgswrXalemão da SuíçarUkjrXkuanyamarUcperXcrioulo ou pidgin do inglêsrUcpfrXcrioulo ou pidgin do francêsrUcppr Xcrioulo ou pidgin do portuguêsr uU territoriesr }r (U151r XEuropa de LesterUBDrX BangladecherUBFrX Burkina-FasorUSJrXEsvalbarda e Jan MayenrU154rXEuropa do NorterUSMrX São MarinorU017rXÁfrica InteriorrUBHrXBareinerUBJrXBenimrUHKrX4Hong Kong - Região Administrativa Especial da Chinar UVCr!X;The main pump fixing screws with the correct strength classr"U015r#XNorte de Áfricar$UUMr%XIlhas Minor Outlying (E.U.A)r&UBSr'XBaamasr(U018r)XÁfrica Meridionalr*U057r+X Micronésiar,UBYr-X Bielorrússiar.U035r/XSudeste Asiáticor0UPSr1XTerritório Palestinianor2UFKr3XIlhas Falkland ou Malvinasr4UNLr5XPaíses Baixosr6UEEr7XEstóniar8ULAr9X$Lao, República Popular Democráticar:UTTr;XTrindade e Tobagor<UNCr=XNova Caledóniar>USIr?X Eslovéniar@UNFrAXIlha NorfolquerBU172rCX172rDULVrEXLetóniarFUCCrGX Ilhas CocosrHUGLrIX GronelândiarJUTMrKXTurquemenistãorLUFMrMX Estados Federados da MicronésiarNUPGrOXPapua Nova GuinérPUZWrQX ZimbabuérRUVIrSXIlhas Virgin E.U.A.rTUTJrUX TajiquistãorVUYErWXIémenrXUFOrYX Ilhas FaroérZUTCr[XIlhas Turcas e Caicosr\UPLr]XPolóniar^UTKr_XToquelaur`UGWraX Guiné-BissaurbU062rcXÁsia Sul-CentralrdUAEreXEmiratos Árabes UnidosrfUEHrgXSara OcidentalrhUAIriXAnguilharjUCGrkXCongo-BrazzavillerlUEGrmXEgiptornUIRroXIrãorpUAMrqXArméniarrUVNrsXVietnamertUCDruX República Democrática do CongorvUAQrwX AntárcticarxUCZryXRepública ChecarzUCXr{X Ilha do Natalr|UAXr}X Ilhas Alandar~U009rXOceâniarUAZrX AzerbeijãorUQUrXUnião EuropeiarUERrXEritreiarUMDrXMoldávia, República darUMGrX MadagáscarrUROrXRoméniarUKGrXQuirguizistãorUMCrXMónacorUKErXQuéniarUUZrX UsbequistãorUMOrX0Macau - Região Administrativa Especial da ChinarUKNrXSaint Kitts e NevisrUMKrXMacedónia, República darUMUrX MauríciasrUKRrX Coreia do SulrUMWrXMalauirUKPrXCoreia do NorterUKWrXCuaiterUMPrXIlhas Mariana do NorterUMSrX MonserraterUSCrX SeichelesrUKZrX CazaquistãorUKYrX Ilhas CaimãorUSGrX SingapurarUQOrXOceânia InsularruUdecimal_formatsr}rU date_formatsr}r(Umediumrh")r}r(h%X yyyy/MM/ddrh'X%(yyyy)s/%(MM)s/%(dd)srubUshortrh")r}r(h%Xyy/MM/ddrh'X%(yy)s/%(MM)s/%(dd)srubuUcurrency_symbolsr}rU time_zonesr}r(UAmerica/North_Dakota/Centerr}rUcityrXCenterrsUEurope/Kaliningradr}rjX KaliningradorsUAmerica/Indiana/Petersburgr}rjX PetersburgorsUAmerica/Araguainar}rjX AraguainarsUPacific/Easterr}rjXPáscoarsUAfrica/Casablancar}rjXMarrocosrsUAmerica/Cuiabar}rjXCuibársUAmerica/St_Johnsr}rjX St.John'srsUAmerica/Argentina/Tucumanr}rjXTucumánrsU America/Bahiar}rjXBaíarsU Europe/Moscowr}rjXMoscovorsUAmerica/Cancunr}rjXCancunrsUAsia/Ulaanbaatarr}rjX Ulan BatorrsU Asia/Sakhalinr}rjXSacalinarsU Europe/Madridr}rjXMadridrsuUscriptsr}r(UTelurXtelugurUTamlrXtamilrUTengrXtenguarrUNkoorXn’korUArmnrXarméniorUCyrsrX$cirílico (eslavónico sacro antigo)rUGeokrXgeorgiano khutsurirULatfrXlatim (fraktur)rUEgyhrXegípcio hieráticorUSgnwrXescrita gestualrUXsuxr Xcuneiforme sumero-acadianor UZxxxr X não escritor ULinbr Xlinear BrULinarXlinear ArUTalurXtai lue modernorUIndsrXindusrUZzzzrXinválido ou desconhecidorUTalerXtai lerUMandrX mandaeanorUBrahrXBrahmirUMlymrX malaialamrUEgydrXegípcio demóticor UPlrdr!XPollard fonéticor"USylor#X siloti nagrir$UBlisr%Xsímbolos Blissr&UCansr'X símbolos aborígenes canadianosr(uUvariantsr)}r*(UNEDISr+Xdialecto natisoner,USAAHOr-XSahor.UREVISEDr/XRevisão Ortográficar0UAREVMDAr1Xarménio ocidentalr2UFONIPAr3X Alfabeto Fonético Internacionalr4U1996r5XAlemão Modernor6UOSOJSr7Xdialecto oseacco/osojaner8UNJIVAr9Xdialecto gniva/njivar:UBOONTr;X buntlinguer<USCOUSEr=XScouser>UAREVELAr?Xarménio orientalr@UMONOTONrAX monotónicorBUPOSIXrCX ComputadorrDUFONUPArEXAlfabeto Fonético UrálicorFUBISKErGXdialecto san giorgio/bilarHUSOLBArIXdialecto stolvizza/solbicarJUPOLYTONrKX politónicorLULIPAWrMXdialecto lipovaz de ResianrNU1901rOXAlemão TradicionalrPuUnumber_symbolsrQ}rRUcurrency_namesrS}rT(UMKDrUXDinar macedóniorVUQARrWX Rial do QatarrXUBECrYXFranco belga (convertível)rZUYUNr[XDinar conversível jugoslavor\UZWDr]XDólar do Zimbabwer^UHNLr_XLempira das Hondurasr`UFJDraXDólar das FijirbUBADrcXDinar da Bósnia-HerzegóvinardUGNFreXFranco da GuinérfUAEDrgX"Dirham dos Emirados Árabes UnidosrhUGHCriX Cedi do GanarjUMWKrkXCuacha do MalawirlUXBDrmXUnidade de Conta Europeia (XBD)rnUBAMroX'Marco bósnio-herzegóvino conversívelrpUXBArqXUnidade Composta EuropeiarrUYUDrsXDinar forte jugoslavortUXBCruXUnidade de Conta Europeia (XBC)rvUXBBrwXUnidade Monetária EuropeiarxUTZSryXXelim de TanzâniarzUCYPr{XLibra de Chiprer|UKWDr}XDinar koweitianor~UXEUrXUnidade da Moeda EuropeiarUXXXrXMoeda inválida ou desconhecidarUKYDrXDólar das Ilhas CaimãorUECVrX*Unidad de Valor Constante (UVC) do EquadorrUAWGrXFlorim de ArubarUSGDrXDólar de SingapurarUAFNrXAfeghanirUMLFrXFranco do MalirUAFArXAfeghani (1927-2002)rUGMDrXDalasi da GâmbiarUGTQrXQuetzal da GuatemalarUBYBrX!Rublo novo bielorusso (1994-1999)rUYUMrXSuper Dinar jugoslavorUANGrXFlorim das Antilhas HolandesarUNIOrXCórdoba Ouro nicaraguanorUMXVrX"Unidad de Inversion (UDI) mexicanarUNICrXCórdoba nicaraguanorUPLZrXZloti polaco (1950-1995)rUMXPrXPeso Plata mexicano (1861-1992)rUCZKrXCoroa da República ChecarUPLNrX Zloti polacorUWSTrXTala de Samoa OcidentalruUmonthsr}rUformatr}r(Uwider}r(KXJaneirorKX FevereirorKXMarçorKXAbrilrKXMaiorKXJunhorKXJulhorKXAgostorK XSetembrorK XOutubrorK XNovembrorK XDezembroruU abbreviatedr}r(KXJanrKXFevrKXMarrKXAbrrKXMairKXJunrKXJulrKXAgorK XSetrK XOutrK XNovrK XDezruusUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrX ¤rjrUint_precrKKrh%X #,##0.00 ¤rUprefixrXrX-rrUexp_plusrNUgroupingrKKrubsUdaysr}rU meta_zonesr}r(U Goose_Bayr}rUcommonrsU Kuybyshevr}r(jUlongr}r(UdaylightrXHora de Verão de KuybyshevrUstandardrXHora de KuybyshevruuURotherar}r(jj}rjXHora de RotherarsuUArabianr}r(jj}r(UgenericrXHora da ArábiarjXHora de Verão da ArábiarjXHora Padrão da ArábiaruuUAustralia_Easternr}r(jj}r(jXHora da Austrália OrientalrjX%Hora de Verão da Austrália OrientalrjX#Hora Padrão da Austrália OrientalruuU Argentinar}r(jj}r(jXHora de Verão da ArgentinarjXHora da ArgentinaruuUBoliviar}r(jj}rjXHora da Bolíviar suU Turkmenistanr }r (Ushortr }r jXHora do Turquemenistãorsjj}r(jXHora do TurquemenistãorjX!Hora de Verão do TurquemenistãorjXHora do TurquemenistãoruuU Alaska_Hawaiir}r(jj}r(jXHora do Alaska- HavairjXHora de Verão do Alaska-HavairjXHora Padrão do Alaska-HavairuuU Cape_Verder}r(jj}r(jXHora de Verão de Cabo VerderjXHora de Cabo VerderuuUAzoresr}r(jj}r (jXHora de Verão dos Açoresr!jXHora dos Açoresr"uuUEurope_Centralr#}r$(jj}r%(jX Hora de Verão da Europa Centralr&jXHora da Europa Centralr'uuUTrukr(}r)(jj}r*jX Hora de Trukr+suU Aktyubinskr,}r-(jj}r.(jXHora de Verão de Aktyubinskr/jXHora de Aktyubinskr0uuUBeringr1}r2(jj}r3(jXHora de Beringr4jXHora de Verão de Bringr5jXHora Padrão de Beringr6uuU Qyzylordar7}r8(jj}r9(jXHora de Verão de Qyzylordar:jXHora de Qyzylordar;uuUKazakhstan_Easternr<}r=(jj}r>(jXHora do Casaquistão do Lester?jX%Hora Padrão do Cazaquistão do Lester@uuUFrunzerA}rB(j }rCjXHora do QuirguizistãorDsjj}rE(jXHora do QuirguizistãorFjXHora de Verão de FrunzerGjXHora de FrunzerHuuU Dutch_GuianarI}rJ(jj}rKjXHora da Guiana HolandesarLsuUYerevanrM}rN(j }rOjXHora da ArméniarPsjj}rQ(jXHora da ArméniarRjXHora de Verão de YerevanrSjXHora de YerevanrTuuU KamchatkarU}rV(jj}rW(jX*Hora de Verão de Petropavlovsk-KamchatskirXjX Hora de Petropavlovsk-KamchatskirYuuULiberiarZ}r[(j }r\jXHora da Libériar]sjj}r^jXHora da Libériar_suUKashgarr`}ra(jj}rbjXHora de KashgarrcsuUMaldivesrd}re(jj}rfjXHora das Ilhas MaldivasrgsuUNorfolkrh}ri(j }rjjXHora da Ilha Norfolquerksjj}rljXHora da Ilha NorfolquermsuU Dominicanrn}rojsUAfrica_Easternrp}rq(jj}rrjXHora da África OrientalrssuU Ashkhabadrt}ru(j }rvjXHora do Turquemenistãorwsjj}rx(jXHora do TurquemenistãoryjXHora de Verão de AshkhabadrzjXHora de Ashkhabadr{uuUAlaskar|}r}(jj}r~(jXHora do AlaskarjXHora de Verão do AlaskarjXHora Padrão do AlaskaruuUAmerica_Easternr}r(jj}r(jX Hora OrientalrjXHora de Verão OrientalrjXHora Padrão OrientalruuU Yekaterinburgr}r(jj}r(jXHora de Verão de YekaterinburgrjXHora de YekaterinburgruuUSolomonr}r(j }rjXHora das Ilhas Salomãorsjj}rjXHora das Ilhas SalomãorsuU Krasnoyarskr}r(jj}r(jXHora de Verão de KrasnoyarskrjXHora de KrasnoyarskruuUAmerica_Centralr}r(jj}r(jX Hora CentralrjXHora de Verão CentralrjXHora Padrão CentralruuUMawsonr}r(jj}rjXHora de MawsonrsuUPakistanr}r(j }rjXHora do Paquistãorsjj}r(jXHora de Verão do PaquistãorjXHora do PaquistãoruuUChathamr}r(jj}r(jXHora de Verão de ChathamrjXHora Padrão de ChathamruuUSamoar}r(j }rjX Hora da Samoarsjj}r(jX Hora da SamoarjXHora Padrão da SamoaruuUMacaur}r(j }rjX8Hora de Macau - Região Administrativa Especial da Chinarsjj}r(jX8Hora de Macau - Região Administrativa Especial da ChinarjXHora de Verão de MacaurjX Hora de MacauruuUChamorror}r(jj}r(jXHora de ChamarrorjXHora Padrão de ChamarroruuUGuamr}r(jj}rjXHora Padrão de GuamrsuUIndiar}r(j }rjXHora da Índiarsjj}r(jXHora da ÍndiarjXHora Padrão da ÍndiaruuU Azerbaijanr}r(j }rjXHora do Azerbeijãorsjj}r(jXHora do AzerbeijãorjXHora de Verão do AzerbeijãorjXHora do AzerbeijãoruuU Marquesasr}r(jj}rjXHora das MarquesasrsuU Tajikistanr}r(j }rjXHora do Tajiquistãorsjj}r(jXHora do TajiquistãorjXHora do TajiquistãoruuUPitcairnr}r(j }rjXHora de Pitcairnrsjj}r(jXHora de PitcairnrjXHora de PitcairnruuUTurkeyr}r(jj}r(jXHora de Verão da TurquiarjXHora da TurquiaruuU Afghanistanr}r(jj}rjXHora do AfeganistãorsuU Choibalsanr}r(jj}r(jXHora de Verão de ChoibalsanrjXHora de ChoibalsanruuU Vladivostokr}r(jj}r(jXHora de Verão de VladivostokrjXHora de VladivostokruuU Shevchenkor}r(jj}r(jXHora de Verão de ShevchenkorjXHora de ShevchenkoruuU Bangladeshr}r(j }rjXHora do Bangladeshrsjj}r(jXHora do BangladeshrjXHora do BangladeshruuUGulfr}r(jj}rjXHora Padrão do Golfor suUDaccar }r (j }r jXHora do Bangladeshr sjj}r(jXHora do BangladeshrjX Hora de DaccaruuUMongoliar}r(jj}r(jXHora de Verão de Ulan BatorrjXHora de Ulan BatorruuU Samarkandr}r(jj}r(jXHora de Verão de SamarkandrjXHora de SamarkandruuUWaker}r(jj}rjXHora das Ilhas WakersuUVanuatur}r (j }r!jXHora de Vanuatur"sjj}r#(jXHora de Vanuatur$jXHora de Vanuatur%uuUIndonesia_Centralr&}r'(jj}r(jXHora da Indonésia Centralr)suUNaurur*}r+(jj}r,jX Hora de Naurur-suUFalklandr.}r/(jj}r0(jX!Hora de Verão das Ilhas Malvinasr1jXHora das Ilhas Malvinasr2uuUKorear3}r4(jj}r5(jXHora da Coreiar6jXHora de Verão da Coreiar7jXHora Padrão da Coreiar8uuUCubar9}r:(jj}r;(jX Hora de Cubar<jXHora de Verão de Cubar=jXHora Padrão de Cubar>uuUIrkutskr?}r@(jj}rA(jXHora de Verão de IrkutskrBjXHora de IrkutskrCuuUArgentina_WesternrD}rE(jj}rFjXHora da Argentina OcidentalrGsuUAmazonrH}rI(jj}rJ(jXHora de Verão do AmazonasrKjXHora do AmazonasrLuuUChinarM}rN(jj}rO(jX Hora da ChinarPjXHora de Verão da ChinarQjXHora Padrão da ChinarRuuULong_ShurS}rT(jj}rUjXHora de Long-ShurVsuUArmeniarW}rX(j }rY(jXHora da ArméniarZjXAMST (Arménia)r[jXAMT (Arménia)r\ujj}r](jXHora da Arméniar^jXHora de Verão da Arméniar_jXHora da Arméniar`uuUCookra}rb(j }rcjXHora das Ilhas Cookrdsjj}re(jXHora das Ilhas CookrfjX)Hora Intermédia de Verão das Ilhas CookrgjXHora das Ilhas CookrhuuUAfrica_FarWesternri}rj(j }rkjXHora do Sara Ocidentalrlsjj}rmjXHora do Sara OcidentalrnsuUKarachiro}rp(j }rqjXHora do Paquistãorrsjj}rs(jXHora do PaquistãortjXHora de CarachiruuuUTongarv}rw(j }rxjX Hora de Tongarysjj}rz(jX Hora de Tongar{jXHora de Verão de Tongar|uuUSakhalinr}}r~(jj}r(jXHora de Verão de SakhalinrjXHora de SakhalinruuUBrasiliar}r(jj}r(jXHora de Verão de BrasíliarjXHora de BrasíliaruuUSyowar}r(jj}rjX Hora de SyowarsuU French_Guianar}r(jj}rjXHora da Guiana FrancesarsuUFrench_Southernr}r(jj}rjX6Hora da Antártida e dos Territórios Franceses do SulrsuU Mauritiusr}r(jj}rjXHora das Ilhas MauríciasrsuUAfrica_Southernr}r(jj}r(jXHora da África do SulrjXHora Padrão da África do SulruuUGambierr}r(jj}rjXHora de GambierrsuUDavisr}r(jj}rjX Hora de DavisrsuU Newfoundlandr}r(jj}r(jXHora de Verão da Terra NovarjXHora Padrão da Terra NovaruuUCocosr}r(jj}rjXHora das Ilhas CocosrsuU Kyrgystanr}r(j }rjXHora do Quirguizistãorsjj}r(jXHora do QuirguizistãorjXHora do QuirguizistãoruuUTokelaur}r(j }rjXHora de Toquelaursjj}r(jXHora de ToquelaurjXHora de ToquelauruuUAustralia_Westernr}r(jj}r(jXHora da Austrália OcidentalrjX&Hora de Verão da Austrália OcidentalrjX$Hora Padrão da Austrália OcidentalruuUBakur}r(j }rjXHora do Azerbeijãorsjj}r(jXHora do AzerbeijãorjXHora de Verão de BakurjX Hora de BakuruuUAfrica_Centralr}r(jj}rjXHora da África CentralrsuU Line_Islandsr}r(jj}rjXHora das Ilhas LinersuU Novosibirskr}r(jj}r(jXHora de Verão de NovosibirskrjXHora de NovosibirskruuUJapanr}r(jj}r(jXHora do JapãorjXHora de Verão do JapãorjXHora Padrão do JapãoruuU Sverdlovskr}r(jj}r(jXHora de Verão de SverdlovskrjXHora de SverdlovskruuU New_Caledoniar}r(j }rjXHora da Nova Caledóniarsjj}r(jXHora da Nova CaledóniarjX!Hora de Verão da Nova CaledóniarjXHora da Nova CaledóniaruuU Kwajaleinr}r(jj}rjXHora de KwajaleinrsuUAqtober}r(jj}r(jXHora de Verão de AqtoberjXHora de AqtoberuuUGilbert_Islandsr}r(jj}rjXHora das Ilhas GilbertrsuUAustralia_CentralWesternr}r(jj}r(jX$Hora da Austrália Central OcidentalrjX.Hora de Verão da Austrália Central OcidentalrjX,Hora Padrão da Austrália Central OcidentalruuU Indochinar}r(j }rjXHora do Vietnamersjj}rjXHora do VietnamersuUPapua_New_Guinear}r(j }rjXHora da Papua Nova Guinérsjj}r(jXHora da Papua Nova GuinérjXHora da Papua Nova GuinéruuUHovdr }r (jj}r (jXHora de Verão de Hovdr jX Hora de Hovdr uuU South_Georgiar}r(jj}rjXHora da Georgia do SulrsuUEcuadorr}r(jj}rjXHora do EquadorrsuUMalayar}r(j }rjXHora da Malásiarsjj}r(jXHora da MalásiarjXHora de MalaiaruuUBruneir}r(j }rjXHora do Bruneir sjj}r!(jXHora do Bruneir"jXHora do Brunei Darussalamr#uuUIranr$}r%(j }r&jX Hora do Irãor'sjj}r((jX Hora do Irãor)jXHora de Verão do Irãor*jXHora Padrão do Irãor+uuUAqtaur,}r-(jj}r.(jXHora de Verão de Aqtaur/jX Hora de Aqtaur0uuU Indian_Oceanr1}r2(jj}r3jXHora do Oceano Índicor4suUTuvalur5}r6(j }r7jXHora de Tuvalur8sjj}r9jXHora de Tuvalur:suUAmerica_Mountainr;}r<(jj}r=(jXHora da Montanhar>jXHora de Verão da Montanhar?jXHora Padrão da Montanhar@uuUHawaii_AleutianrA}rB(jj}rCjXHora Padrão do HavairDsuUChangbairE}rF(jj}rGjXHora de ChangbairHsuUChilerI}rJ(jj}rK(jXHora de Verão do ChilerLjX Hora do ChilerMuuUWallisrN}rO(j }rPjXHora de Wallis e FutunarQsjj}rR(jXHora de Wallis e FutunarSjXHora de Wallis e FutunarTuuUKosraerU}rV(jj}rWjXHora de KosraerXsuUDushanberY}rZ(j }r[jXHora do Tajiquistãor\sjj}r](jXHora do Tajiquistãor^jXHora de Verão de Dushanber_jXHora de Dushanber`uuUGeorgiara}rb(j }rcjXHora da Geórgiardsjj}re(jXHora da GeórgiarfjXHora de Verão da GeorgiargjXHora da GeorgiarhuuUAnadyrri}rj(jj}rk(jXHora de Verão de AnadyrrljXHora de AnadyrrmuuU Philippinesrn}ro(j }rpjXHora das Filipinasrqsjj}rr(jXHora das FilipinasrsjXHora de Verão das FilipinasrtjXHora das FilipinasruuuUYakutskrv}rw(jj}rx(jXHora de Verão de YakutskryjXHora de YakutskrzuuUIndonesia_Westernr{}r|(jj}r}jXHora da Indonésia Ocidentalr~suUOralr}rjsUGMTr}r(jj}rjXHora do Meridiano de GreenwichrsuUMarshall_Islandsr}r(jj}rjXHora das Ilhas MarshallrsuUIrishr}rjsU Seychellesr}r(jj}rjXHora das Ilhas SeichelesrsuUVostokr}r(jj}rjXHora de VostokrsuU Uzbekistanr}r(j }rjXHora do Uzbequistãorsjj}r(jXHora do UzbequistãorjXHora de Verão do UzbequistãorjXHora do UzbequistãoruuUColombiar}r(jj}r(jXHora de Verão da ColômbiarjXHora da ColômbiaruuUReunionr}r(jj}rjXHora das Ilhas de ReuniãorsuU Volgogradr}r(jj}r(jXHora de Verão de VolgogradrjXHora de VolvogradruuU Kizilordar}r(jj}r(jXHora de Verão de KizilordarjXHora de KizilordaruuUFijir}r(j }rjXHora das Ilhas Fijirsjj}r(jXHora das Ilhas FijirjXHora de Verão das Ilhas FijirjXHora das Ilhas FijiruuUAmerica_Pacificr}r(jj}r(jXHora do PacíficorjXHora de Verão do PacíficorjXHora Padrão do PacíficoruuUKazakhstan_Westernr}r(jj}r(jXHora do Casaquistão do OesterjX%Hora Padrão do Casaquistão do OesteruuUPalaur}r(j }rjX Hora de Palaursjj}r(jX Hora de PalaurjX Hora de PalauruuUEurope_Easternr}r(jj}r(jX!Hora de Verão da Europa OrientalrjXHora da Europa OrientalruuUBhutanr}r(j }rjXHora do Botãorsjj}r(jXHora do BotãorjXHora do BotãoruuUBorneor}r(jj}r(jXHora de Verão do BornéurjXHora do BornéuruuUNepalr}r(j }rjX Hora do Nepalrsjj}r(jX Hora do NepalrjX Hora do NepalruuU Galapagosr}r(jj}rjXHora de GalápagosrsuU Lord_Hower}r(jj}r(jXHora de Lord HowerjXHora de Verão de Lord HowerjXHora Padrão de Lord HoweruuUPhoenix_Islandsr}r(jj}rjXHora das Ilhas FénixrsuUAcrer}r(jj}r(jXHora de Verão do AcrerjX Hora do AcreruuUEasterr}r(jj}r(jX!Hora de Verão da Ilha de PáscoarjXHora da Ilha de PáscoaruuU Christmasr}r(jj}rjXHora da Ilha de NatalrsuU East_Timorr}r(j }rjXHora de Timor Lestersjj}r(jXHora de Timor LesterjXHora de Timor LesteruuUIsraelr}r(j }rjXHora de Israelrsjj}r(jXHora de IsraelrjXHora de Verão de Israelr jXHora Padrão de Israelr uuUAfrica_Westernr }r (j }r jXHora da Nigériarsjj}r(jXHora da NigériarjX#Hora de Verão da África OcidentalrjXHora da África OcidentalruuUTashkentr}r(j }rjXHora do Uzbequistãorsjj}r(jXHora de TashkentrjXHora de Verão de TashkentrjXHora de TashkentruuUMalaysiar}r(jj}rjXHora da MalásiarsuUPonaper}r (jj}r!jXHora de Ponaper"suUIndonesia_Easternr#}r$(jj}r%jXHora da Indonésia Orientalr&suUOmskr'}r((jj}r)(jXHora de Verão de Omskr*jX Hora de Omskr+uuUAustralia_Centralr,}r-(jj}r.(jXHora da Austrália Centralr/jX$Hora de Verão da Austrália Centralr0jX"Hora Padrão da Austrália Centralr1uuUAtlanticr2}r3(jj}r4(jXHora do Atlânticor5jXHora de Verão do Atlânticor6jXHora Padrão do Atlânticor7uuU North_Marianar8}r9(j }r:jXHora das Ilhas Mariana do Norter;sjj}r<(jXHora das Ilhas Mariana do Norter=jXHora das Ilhas Mariana do Norter>uuULankar?}r@(j }rAjXHora do Sri LankarBsjj}rC(jXHora do Sri LankarDjXHora do Sri LankarEuuUDumontDUrvillerF}rG(jj}rHjXHora de Dumont-d'UrvillerIsuUEurope_WesternrJ}rK(jj}rL(jX"Hora de Verão da Europa OcidentalrMjXHora da Europa OcidentalrNuuU New_ZealandrO}rP(jj}rQ(jXHora da Nova ZelândiarRjX Hora de Verão da Nova ZelândiarSjXHora Padrão da Nova ZelândiarTuuUBritishrU}rVjsUUrumqirW}rX(jj}rYjXHora de UrumqirZsuU Hong_Kongr[}r\(j }r]jX<Hora de Hong Kong - Região Administrativa Especial da Chinar^sjj}r_(jX<Hora de Hong Kong - Região Administrativa Especial da Chinar`jXHora de Verão de Hong KongrajXHora de Hong KongrbuuUMagadanrc}rd(jj}re(jXHora de Verão de MagadanrfjXHora de MagadanrguuUAlmatyrh}ri(jj}rj(jXHora de Verão de AlmatyrkjXHora de AlmatyrluuUTbilisirm}rn(j }rojXHora de Geórgiarpsjj}rq(jXHora da GeórgiarrjXHora de Verão de TbilisirsjXHora de TbilisirtuuUMyanmarru}rv(j }rwjXHora de Mianmarrxsjj}ryjXHora de MianmarrzsuU Singaporer{}r|(j }r}jXHora de Singapurar~sjj}r(jXHora de SingapurarjXHora Padrão de SingapuraruuUSamarar}r(jj}r(jXHora de Verão de SamararjXHora de SamararuuUGreenland_Centralr}r(jj}r(jX&Hora de Verão da Gronelândia CentralrjXHora da Gronelândia CentralruuUUralskr}r(jj}r(jXHora de Verão de Ural'skrjXHora de Ural'skruuUTahitir}r(j }rjXHora da Polinésia Francesarsjj}r(jXHora da Polinésia FrancesarjXHora do TahitiruuUMoscowr}r(jj}r(jXHora de MoscovorjXHora de Verão de MoscovorjXHora Padrão de MoscovoruuUNiuer}r(j }rjX Hora de Niuersjj}r(jX Hora de NiuerjX Hora de NiueruuuUerasr}rUwider}r(KXa.C.rKXd.C.rusu.PK[_.ll-site-packages/babel/localedata/az_Cyrl_AZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/ts_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[*NN&site-packages/babel/localedata/fur.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q Unarrowq }q (KX1q KX2q KX3qKX4qusUformatq}q(Uwideq}q(KXPrin trimestriqKXSecont trimestriqKXTierç trimestriqKXCuart trimestriquU abbreviatedq}q(KXT1qKXT2qKXT3qKXT4quuuUperiodsq}q(Uamq Xa.q!Upmq"Xp.q#uUscientific_formatsq$}q%Ncbabel.numbers NumberPattern q&)q'}q((Uexp_precq)KKq*Uscaleq+KU frac_precq,KKq-Usuffixq.Xq/h/q0Uint_precq1KKq2Upatternq3X#E0q4Uprefixq5h/X-q6q7Uexp_plusq8Ugroupingq9MMq:ubsUpercent_formatsq;}q(h)Nh+Kdh,KKq?h.X%q@h@qAh1KKqBh3X#,##0%qCh5h/h6qDh8Nh9KKqEubsU week_dataqF}qG(Umin_daysqHKU weekend_startqIKU first_dayqJKU weekend_endqKKuU time_formatsqL}qM(UmediumqNcbabel.dates DateTimePattern qO)qP}qQ(h3XHH:mm:ssqRUformatqSX%(HH)s:%(mm)s:%(ss)sqTubUfullqUhO)qV}qW(h3X HH:mm:ss vqXhSX%(HH)s:%(mm)s:%(ss)s %(v)sqYubUlongqZhO)q[}q\(h3X HH:mm:ss zq]hSX%(HH)s:%(mm)s:%(ss)s %(z)sq^ubUshortq_hO)q`}qa(h3XHH:mmqbhSX %(HH)s:%(mm)sqcubuU languagesqd}qe(UgvqfXmanxqgUscoqhXscozêsqiUscnqjXsicilianqkUroaqlXlenghe romanzeqmUgdqnXgaelic scozêsqoUgaqpXgaelic irlandêsqqUglqrXgalizianqsUlbqtXlussemburghêsquUlaqvXlatinqwUlnqxXlingalaqyUttqzXtartarq{Utrq|Xturcq}Uliq~X limburghêsqUlvqXletonqUltqXlituanqUthqXthaiqUtgqXtagicqUteqXteleguqUmwlqX mirandêsqUyiqXyiddishqUnonqXvieri norvegjêsqUpt_BRqXportughês brasilianqUcelqXlenghe celticheqUdaqXdanêsqUmulqXlenghis multiplisqUgemqXlenghe gjermanicheqUtlqXtagalogqUquqXquechuaqUelqXgrêcqUeoqX esperantoqUenqXinglêsqUzhqXcinêsqUzh_HansqXcinês semplificâtqUzh_HantqXcinês tradizionâlqUsgaqXvieri irlandêsqUarcqXaramaicqUukqXucrainqUeuqXbascqUetqXestonqUtetqXtetumqUesqXspagnûlqUruqXrusqUrmqXrumançqUpeoqX vieri persianqUgotqXgoticqUroqXromenqUsuxqXsumericqUbeqX bielorùsqUbgqXbulgarqUmsqXmalêsqUwaqXvalonqUastqXasturianqUbnqX bengalêsqUboqXtibetanqUbrqXbretonqUbsqXbosniacqUjaqX gjaponêsqUcopqXcopticqUtyqXtahitianqUocqXocitanqUundqX indeterminadeqUndsqX bas todescqUosqXoseticqUchqXchamorroqUcoqXcorsqUcaqXcatalanqUceqXcecenqUcyqXgalêsqUcsqXcecqUcrqXcreeqUapaqX lenghe ApacheqUcuqXsclâf de glesieqUpsqXpashtoqUptqX portughêsqUfroqXvieri francêsqUausqXlenghis australianisqUpaqXpunjabiqUvirX vietnamiterUprorXvieri provenzâlrUplrXpolacrUhyrXarmenrUhrrXcravuatr Uiur X inuktitutr Uegyr Xvieri egjizianr UhtrXhaitianrUhurX ongjarêsrUhirXhindirUherXebraicrUfurrXfurlanrUuzrXuzbecrUmlrX malayalamrUmorXmoldâfrUmnrXmongulrUmir Xmaorir!Uikr"Xinupiaqr#Umkr$Xmacedonr%Uurr&Xurdur'Umtr(Xmaltêsr)Udenr*Xsclâfr+Umrr,Xmarathir-Utar.Xtamilr/Uslar0X lenghe sclaver1Uaar2Xafarr3Uangr4X vieri inglêsr5Uaer6Xavestanr7Uafr8X afrikaansr9Uswr:Xswahilir;Uisr<X islandêsr=Umynr>X lenghis Mayar?Uamr@XamaricrAUitrBXtalianrCUanrDX aragonêsrEUasrFXassamêsrGUarrHXaraprIUiorJXidorKUavrLXavarrMUayrNXaymaràrOUazrPX azerbaijanirQUidrRX indonesianrSUpaprTX papiamentorUUnlrVXolandêsrWUnnrXXnorvegjês nynorskrYUnorZX norvegjêsr[Unbr\Xnorvegjês bokmålr]Uner^Xnepalêsr_Unapr`X napoletanraUgrcrbX vieri grêcrcUotardX turc otomanreUzurfXzulurgUsorhXsomalriUmisrjXlenghis variisrkUnvrlXnavajormUmaprnX austronesianroUfrrpXfrancêsrqUderrXtodescrsUsmrtXsamoanruUladrvXladinrwUfyrxXfrisianryUsvrzXsvedêsr{Ufar|Xpersianr}Uffr~XfulahrUfirX finlandêsrUfjrXfizianrUforXfaroêsrUkarX gjeorgjianrUkkrXkazacrUsrrXserprUsqrXalbanêsrUkorXcoreanrUknrXkannadarUkmrXkhmerrUklrX kalaallisutrUskrXslovacrUsirXsinalêsrUkwrX cornualiêsrUkurXcurdrUslrXslovenrUscrX sardegnûlrUsarXsanscritrUserXsami setentrionâlrUsdrXsindhiruU territoriesr}r(UBDrX BangladeshrUBErX BelgjicherUBFrX Burkina FasorUBGrXBulgarierUVErX VenezuelarUBArXBosnie e ErcegovinerUBBrXBarbadosrUWFrXWallis e FutunarUBLrXSant BarthélemyrUBMrXBermudarUBNrXBruneirUBOrXBolivierUBHrXBahrainrUBIrXBurundirUBJrXBeninrUBTrXBhutanrU011rXAfriche ocidentâlrUBVrX Isule BouvetrUBWrXBotswanarU014rXAfriche orientâlrU015rXAfriche setentrionâlrUBRrXBrasîlrU017rXAfriche di mieçrU018rXAfriche meridionâlrU019rX AmerichisrUBYrX BielorussierUBZrXBelizerULVrXLetonierURWrXRuanderURSrXSerbierUTLrXTimor orientâlrURErXReunionrUTMrX TurkmenistanrUTJrX TazikistanrUROrXRomanierUTKrXTokelaurUGWrX Guinea-BissaurUGUrXGuamrUGTrX GuatemalarUGSrX)Georgia dal Sud e Isulis Sandwich dal SudrUGRrXGrecierUGQrXGuinee ecuatoriâlrUGPrX GuadaluperUJPrXGjaponrUKIrXKiribatirUGYrXGuyanarUGFrXGuiana francêsrUGErX Gjeorgjier UGDr XGrenadar U021r XAmeriche setentrionâlr UGBrX Ream unîtrUGArXGabonrUSVrX El SalvadorrUGNrXGuineerUGMrXGambiarUGLrX GroenlanderU029rXcaraibicrUGIrX GjibraltarrUGHrXGhanarUOMr XOmanr!UTNr"XTunisier#UJMr$X Gjamaicher%U013r&XAmeriche centrâlr'UWSr(XSamoar)U419r*XAmeriche latine e caraibicher+UHRr,X Cravuazier-UBSr.XBahamasr/UHTr0XHaitir1UHUr2XOngjarier3UHKr4X2Regjon aministrative speciâl de Cine di Hong Kongr5U039r6XEurope meridionâlr7UHNr8XHondurasr9UFIr:X Finlandier;U142r<XAsier=U030r>XAsie orientâlr?U034r@XAsie meridionâlrAU035rBXAsie sud orientâlrCUPRrDX Porto RicorEUPSrFXTeritori palestinêsrGUFKrHXIsulis FalklandrIUIOrJX"Teritori britanic dal Ocean IndianrKUPWrLXPalaurMUPTrNXPortugalrOUSJrPXSvalbard e Jan MayenrQUMDrRXMoldavierSUFMrTX MicronesierUUIQrVXIraqrWUPArXXPanamàrYUPFrZXPolinesie francêsr[UPGr\XPapue Gnove Guineer]UPEr^XPerùr_UPKr`XPakistanraUPHrbX FilipinisrcUFOrdX Isulis FaroereUPNrfXPitcairnrgUPLrhXPolonieriUPMrjXSan Pierre e MiquelonrkUZMrlXZambiarmUEHrnXSahara ocidentâlroURUrpXRussierqUEErrXEstoniersUEGrtXEgjitruUZArvX Sud AfricherwUECrxXEcuadorryUITrzXItalier{UVNr|XVietnamr}UZZr~X Regjon no cognossude o no validerUSBrXIsulis SalomonrUETrXEtiopierUSOrXSomalierUZWrXZimbabwerUSArXArabie SaudiderUESrXSpagnerUERrXEritreerUAQrXAntarticrUMGrX MadagascarrUMFrX Sant MartinrUMArXMarocrUMCrXMonacorUUZrX UzbechistanrUMMrXBirmanierUMLrXMalirUMOrX.Regjon aministrative speciâl de Cine di MacaorUMNrXMongolierUHMrXIsule Heard e Isulis McDonaldrUASrXSamoa merecanisrUMKrX MacedonierUMUrXMaurizirUMTrXMaltarUMWrXMalawirUMVrXMaldivisrUMQrX MartinicherUMPrXIsulis Mariana dal NordrUMSrX MontserratrUMRrX MauritanierUIMrX Isule di ManrUUGrXUgandarUTZrXTanzanierUMYrXMalaysiarUMXrXMessicrUILrXIsraêlrUFRrXFrancerUAWrXArubarUDOrXRepubliche dominicanerUSHrX Sante ElinerUVCrXSan Vincent e lis GrenadinisrU054rX MelanesierUDJrXGibutirUFJrXFizirU057rXRegjon de MicronesierU172rX$Commonwealth dai stâts indipendentsrU053rXAustralie e Gnove ZelanderUNIrX NicaraguarUNLrX Paîs basrUNOrXNorvegjerUNArXNamibierUVUrXVanuaturUNCrXGnove CaledonierUNErXNigerrUNFrX Isole NorfolkrUNGrXNigerierUNZrX Gnove ZelanderUNPrXNepalrUNRrXNaururUNUrXNiuerU061rX PolinesierUCIrXCueste di AvolirUCHrXSvuizarerUCOrXColombierUCNrXCinerUCMrXCamerunrUCLrXCilerUCCrX Isulis CocosrUCArXCanaderUCGrXCongorUCFrXRepubliche centri africaner UCDr X!Republiche Democratiche dal Congor UCZr XRepubliche cecher UCYrXCiprirUCXrXIsule ChristmasrUCSrXSerbia e MontenegrorUCRrX Costa RicarUPYrXParaguayrUCVrX Cjâf vertrUCUrXCubarUSZrX SwazilandrUSYrXSirierUKGr X Kirghizstanr!UKEr"XKenyar#USRr$XSurinamer%U143r&X Asie centrâlr'UKHr(XCambozer)UKNr*XSan Kitts e Nevisr+UKMr,XComorisr-USTr.XSao Tomè e Principer/USKr0X Slovachier1UKRr2X Coree dal sudr3USIr4XSlovenier5UKPr6XCoree dal nordr7UKWr8XKuwaitr9USNr:XSenegalr;USMr<X San Marinr=USLr>X Sierra Leoner?USCr@X SeychellesrAUKZrBX KazachistanrCUKYrDX Isulis CaymanrEUSGrFX SingaporerGUSErHXSvezierIU151rJXEurope orientâlrKU150rLXEuroperMUDMrNX DominicherOU155rPXEurope ocidentâlrQU154rRXEurope setentrionâlrSUVGrTXIsulis vergjinis britanichisrUUDErVX GjermanierWUYErXXYemenrYUMHrZXIsulis Marshallr[UDZr\XAlzerier]UUSr^X Stâts Unîtsr_UUYr`XUruguayraUYTrbXMayottercUUMrdX-Isulis periferichis minôrs dai Stâts UnîtsreULBrfXLibanrgULCrhX Sante LusieriULArjXLaosrkUTVrlXTuvalurmUTWrnXTaiwanroUTTrpXTrinidad e TobagorqUTRrrXTurchiersULKrtX Sri LankaruULIrvX LiechtensteinrwUCKrxX Isulis CookryUTOrzXTongar{ULTr|XLituanier}ULUr~X LussemburcrULRrXLiberierULSrXLesothorUTHrX TailandierUTFrXTeritoris meridionâi francêsrUTGrXTogorUTDrXÇadrUTCrXIsulis Turks e CaicosrULYrXLibierUVArXVaticanrU145rXAsie ocidentâlrUAErXEmirâts araps unîtsrUADrXAndorrarUAGrXAntigua e BarbudarUAFrX AfghanistanrUAIrXAnguillarUVIrXIsulis vergjinis americanisrUISrXIslanderUIRrXIranrUAMrXArmenierUALrXAlbanierUAOrXAngolarUANrXAntilis olandesisrU003rXAmeriche dal NordrU002rXAfricherU001rXMontrUARrX ArgjentinerUAUrX AustralierUATrXAustrierU005rXAmeriche meridionâlrUINrXIndiarUAXrX Isulis AlandrU009rXOceanierUAZrX AzerbaigianrUIErXIrlanderUIDrX IndonesierUJOrXJordanierUQUrXUnion europeanerUUArXUcrainerUQArXQatarrUDKrX DanimarcjerUMZrXMozambicrUQOrXOceanie perifericheruUdecimal_formatsr}rNh&)r}r(h)Nh+Kh,KKrh.h/h/rh1KKrh3X #,##0.###rh5h/h6rh8Nh9KKrubsU date_formatsr}r(UmediumrhO)r}r(h3X d MMM yyyyrhSX%(d)s %(MMM)s %(yyyy)srubUfullrhO)r}r(h3XEEEE d 'di' MMMM 'dal' yyyyrhSX'%(EEEE)s %(d)s di %(MMMM)s dal %(yyyy)srubUlongrhO)r}r(h3X d MMMM yyyyrhSX%(d)s %(MMMM)s %(yyyy)srubUshortrhO)r}r(h3Xd/MM/yyrhSX%(d)s/%(MM)s/%(yy)srubuUcurrency_symbolsr}rU time_zonesr}r(UAtlantic/Canaryr}rUcityrXCanariisrsU Europe/Lisbonr}rjXLisbonersUAtlantic/Azoresr}rjXAzorisrsU Etc/Unknownr}rjX No cognossudersUAmerica/New_Yorkr}rjX Gnove YorkrsU Europe/Moscowr}r jXMoscher sUAmerica/Sao_Paulor }r jXSan Pauli dal Brasîlr suUscriptsr}r(UJavarX gjavanêsrUTamlrXtamilrUHebrrXebreurUGeorrX georgjianrUXpeorX vieri persianrUUgarrXugariticrUCyrlrXcirilicrUHrktrXkatakana o hiraganarUArmnr Xarmenr!UCyrsr"X$cirilic dal vieri slavonic de glesier#ULatgr$X latin gaelicr%ULatfr&X latin Frakturr'UKhmrr(Xkhmerr)UTelur*Xtelegur+ULatnr,Xlatinr-UXsuxr.Xcuneiform sumeric-acadicr/UHanir0Xhanr1UMayar2Xjeroglifics Mayar3UBalir4Xbalinêsr5USyrcr6Xsiriacr7URunrr8Xrunicr9UItalr:X vieri italicr;UArabr<Xarapr=UZxxxr>Xcodiç pes lenghis no scritisr?UCoptr@XcoptrAUHansrBXHan semplificâtrCUThairDXthairEUCprtrFXcipriotrGUGlagrHX glagoliticrIULinarJX lineâr ArKUHantrLXHan tradizionâlrMUMongrNXmongulrOUDevarPX devanagarirQULaoorRXlaorSUZzzzrTX#codiç par scrituris no codificadisrUUSyrerVXsiriac EstrangelorWUGothrXXgoticrYUTglgrZXtagalogr[UBugir\Xbuginêsr]UHungr^Xvieri ongjarêsr_UBrair`XBrailleraUGrekrbXgrêcrcUMlymrdX malayalamreUEgydrfXdemotic egjizianrgUEthirhXetiopicriUTibtrjXtibetanrkUZyyyrlXcomunrmUEgyhrnXjeratic egjizianroULinbrpX lineâr BrqUCansrrX&Silabari unificât aborigjens canadêsrsUBengrtX bengalêsruUEgyprvXjeroglifics egjiziansrwUSyrjrxXsiriac ocidentâlryUSyrnrzXsiriac orientâlr{UKndar|Xkannadar}uUvariantsr~}r(UNEDISrXDialet des valadis dal NadisonrU1994rXOrtografie resiane standardrU1996rXOrtografie todescje dal 1996rUREVISEDrXOrtografie revisaderUROZAJrXResianrUPOLYTONrX PolitonicherU1901rX Ortografie todescje tradizionâlruUnumber_symbolsr}rUcurrency_namesr}r(UUSDrXDolar americanrUDZDrX Dinar algerinrUNADrXDolar namibianrUSITrX Talar slovenrUBNDrXDolar dal BruneirUBEFrXFranc de BelgjicherUTRLrXViere Lire turcherUDEMrX Marc todescrUGBPrXSterline britanicherULVLrX Lats letonrUDKKrX Corone danêsrUSKKrXCorone slovacherUFRFrXFranc francêsrUPKRrXRupie pachistanerUMXNrX Peso messicanrUBIFrXFranc burundêsrUXXXrX Monede no valide o no cognossuderUAMDrX Dram armenrUCADrXDolar canadêsrUSEKrXCorone svedeserUAUDrXDolar australianrUCHFrX Franc svuizarrUCUPrX Peso cubanrUCSDrXVieri dinar serprUIRRrX Rial iranianrUBYRrXRubli bielorùsrUKRWrXWon de Coree dal SudrUCNYrXYuan Renminbi cinêsrUTRYrX Lire turcherUHRKrX Kuna cravuaterUNZDrXDollar neozelandêsrUHRDrX Dinar cravuatrUEURrXEurorUITLrX Lire talianerUARSrXPeso argjentinrUNIOrXCórdoba oro nicaraguanrUNOKrXCorone norvegjêserURSDrX Dinar serprURUBrX Rubli rusrUINRrX Rupie indianerUJPYrX Yen gjaponêsrUCZKrXCorone de Republiche CecherUBRLrXReal brasilianrUPLNrX Zloty polacrUZARrXRand sudafricanrUATSrXSelin austriacruUmonthsr}r(U stand-aloner}rUnarrowr}r(KXZrKXFrKXMrKXArKjKXJrKXLrKjK XSrK XOrK XNrK XDrusUformatr}r(Uwider}r(KXZenârrKXFevrârrKXMarçrKXAvrîlrKXMairKXJugnrKXLuirKXAvostr K XSetembarr K XOtubarr K XNovembarr K XDicembarr uU abbreviatedr}r(KXZenrKXFevrKXMarrKXAvrrKXMairKXJugrKXLuirKXAvorK XSetrK XOturK XNovrK XDicruuuUcurrency_formatsr}rNh&)r}r(h)Nh+Kh,KKr h.h/h/r!h1KKr"h3X ¤ #,##0.00r#h5X¤ r$X-¤ r%r&h8Nh9KKr'ubsUdaysr(}r)(U stand-aloner*}r+Unarrowr,}r-(KjKjKjKjKXVr.KjKjusUformatr/}r0(Uwider1}r2(KXlunisr3KXmartarsr4KXmiercusr5KXjoiber6KXvinarsr7KXsabider8KXdomenier9uU abbreviatedr:}r;(KXlunr<KXmarr=KXmier>KXjoir?KXvinr@KXsabrAKXdomrBuuuU meta_zonesrC}rD(UMoscowrE}rF(UcommonrGUlongrH}rIUgenericrJX Ore di MoscherKsuUEurope_CentralrL}rM(jGjH}rN(UdaylightrOXOre estive de Europe centrâlrPUstandardrQXOre de Europe centrâlrRuuUEurope_EasternrS}rT(jGjH}rU(jOXOre estive de Europe orientâlrVjQXOre de Europe orientâlrWuuUEurope_WesternrX}rY(jGjH}rZ(jOXOre estive de Europe ocidentâlr[jQXOre de Europe ocidentâlr\uuuUerasr]}r^(Uwider_}r`(KXpdCraKXddCrbuU abbreviatedrc}rd(KXpdCreKXddCrfuuu.PK[1ll(site-packages/babel/localedata/nn_NO.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Qgee%site-packages/babel/localedata/hi.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q (Uwideq }q KXप्रथम चौथाईq sUnarrowq }q(KX1qKX2quuUformatq}q(Uwideq}q(KXप्रथम चौथाईqKX%द्वितीय चौथाईqKXतृतीय चौथाईqKX"चतुर्थ चौथाईquU abbreviatedq}qKXQ2qsuuUperiodsq}q(UamqXपूर्वाह्नqUpmq Xअपराह्नq!uUscientific_formatsq"}q#Ncbabel.numbers NumberPattern q$)q%}q&(Uexp_precq'KKq(Uscaleq)KU frac_precq*KKq+Usuffixq,Xq-h-q.Uint_precq/KKq0Upatternq1X#E0q2Uprefixq3h-X-q4q5Uexp_plusq6Ugroupingq7MMq8ubsUpercent_formatsq9}q:Nh$)q;}q<(h'Nh)Kdh*KKq=h,X%q>h>q?h/KKq@h1X #,##,##0%qAh3h-h4qBh6Nh7KKqCubsU week_dataqD}qE(Umin_daysqFKU weekend_startqGKU first_dayqHKU weekend_endqIKuU time_formatsqJ}qK(UmediumqLcbabel.dates DateTimePattern qM)qN}qO(h1X h:mm:ss aqPUformatqQX%(h)s:%(mm)s:%(ss)s %(a)sqRubUfullqShM)qT}qU(h1X h:mm:ss a vqVhQX%(h)s:%(mm)s:%(ss)s %(a)s %(v)sqWubUlongqXhM)qY}qZ(h1X h:mm:ss a zq[hQX%(h)s:%(mm)s:%(ss)s %(a)s %(z)sq\ubUshortq]hM)q^}q_(h1Xh:mm aq`hQX%(h)s:%(mm)s %(a)sqaubuU languagesqb}qc(Uzh_HantqdX*चीनी (पारम्परिक)qeUguqfXगुज़रातीqgUneqhXनेपालीqiUmniqjXमणिपूरीqkUgdqlX1स्काट्स् गायेलिक्qmUgaqnXआयरिशqoUnwcqpX.पारम्परिक नेवारीqqUgnqrXगुआरानीqsUglqtXगैलिशियन्quUmwrqvXमारवाड़ीqwUlaqxXलैटीनqyUlnqzXलिंगालाq{Uloq|Xलाओथीयन्q}Uttq~X टाटरqUrajqXराजस्थानीqUtrqXतुर्कीqUtsqXसोंगाqUlvqX0लाटवियन् (लेट्टीश)qUtoqXटोंगाqUausqX1आस्ट्रेलियाई भाषाqUtkqXतुक्रमेनqUthqX थाईqUtiqXतिग्रीन्याqUsuqXसुंडानीqUteqXतेलेगुqUpt_PTqX4ईवेरियाई पुर्तगालीqUfilqXफिलिपिनोqUmwlqXमिरांडीqUyiqXयेहुदीqUkcgqXkcgqUsmiqXसामी भाषाqUpt_BRqX6पुर्तगाली (ब्राज़ील)qUdeqXज़र्मनqUdaqXडैनीशqUtlqXतागालोगqUdzqXभुटानीqUiraqXईरानी भाषाqUssaqX&नील सहारी भाषाqUhimqXहिमाचलीqUbatqX"बल्कानी भाषाqUroqXरोमानियाईqUquqXक्वेशुआqUbalqXबलूचीqUnlqX डच्qUarpqXअराफाओqUelqXग्रीकqUeoqX!एस्पेरान्तोqUenqXअंग्रेजीqUartqX"कृत्रिम भाषाqUbeqX!बैलोरूशियन्qUzh_HansqX$चीनी (सरलीकृत)qUzaqXज़ुआंगqUarcqXअरामीqUen_USqX1अंग्रेज़ी अमेरीकीqUeuqXबास्क्qUetqXऐस्तोनियन्qUesqXस्पेनिशqUruqX रूसीqUgonqXगाँडीqUrmqX+रहेय्टो-रोमान्सqUpeoqX"पुरानी फारसीqUsusqX सुसुqUde_ATqX-जर्मन (ऑस्ट्रिया)qUgotqXगॉथिकqUrnqXरुन्दीqUmunqXमुन्डा भाषाqUjvqXजावानीसqUen_CAqX/अंग्रेज़ी(कनाडाई)qUbgqXबल्गेरियन्qUbaqXबशख़िरqUwoqXवोलोफqUbnqXबँगालीqUboqXतिब्बतीqUbhqXबिहारीqUbiqXबिस्लामाqUbrqXब्रेटनqUbsqXबोस्नियाईqUmulqX"विविध भाषाएँqUjarXजापानीrUomrX!ओरोमो (अफ़ान)rUrootrX शिखरrUachrXअकोलीrUocrXओसीटानr Uakkr Xअकाडिनीr Uundr X3अज्ञात या अवैध भाषाr UstrXसेसोथोrUtwrX ट्वीrUdrarXद्रविण भाषाrUtlhrXक्लिंगनrUorrXउड़ियाrUxhrX षोसाrUcorXकोर्सीकनrUcarXकातालानrUcerX चेचनrUcyr Xवेल्शr!Uangr"X.पुरानी अंग्रेज़ीr#Usgnr$X%सांकेतिक भाषाr%Ucsr&X चेकr'Uprar(Xप्राकृतr)Uapar*Xअपाची भाषाr+Ubrar,X ब्रजr-Upsr.X!पॉशतो (पुशतो)r/Ukokr0Xकोंकणीr1Udumr2X(मध्य पुर्तगालीr3Uptr4Xपुर्तगालीr5Ufror6X.पुरानी फ्रांसीसीr7Ultr8Xलिथुनियन्r9Ulolr:Xमोंगोr;Uukr<Xयूक्रेनीr=Upar>Xपंजाबीr?Uawar@X अवधीrAUvirBXवियेतनामीrCUes_ESrDX.ईवेरियाई स्पेनिशrEUpirFX पालीrGUisrHX!आईस्लैंडिक्rIUen_GBrJX/अंग्रेजी(ब्रिटिश)rKUzhrLX चीनीrMUhyrNXअरमेनियन्rOUgayrPX गायोrQUhrrRXक्रोएशन्rSUiurTXइनूकीटूत्rUUkarVXजॉर्जीयन्rWUhurXXहंगेरीrYUhirZXहिन्दीr[Uhupr\X हूपाr]Utgr^Xताजिक्r_Uhar`XहोउसाraUherbXहीब्रूrcUmgrdXमालागासीreUuzrfXउज़्बेकrgUmlrhXमलयालमriUmorjXमोलडावियन्rkUmnrlXमंगोलीयाईrmUmirnXमेओरीroUikrpXइनुपियाक्rqUcaurrXकाकेशी भाषाrsUurrtXउर्दूruUmtrvXमालटिस्rwUcairxXBमध्य अमेरिकी भारतीय भाषाryUainrzX ऐनूr{Uplr|Xपॉलिशr}Umsr~X मलयrUmrrXमराठीrUugrXउईघुरrUtarX तमिलrUmyrXबर्लिसrUslarX(स्लोवियाई भाषाrUaarXअफ़ारrUabrX!अब्खाज़ियन्rUaerXअवेस्तनrUssrXस्वातीrUbhorXभोजपुरीrUafrXअफ्रीकीrUtnrXसेत्स्वानाrUswrXस्वाहिलीrUakrX अकनrUmynrXमाया भाषाrUamrXअम्हारिक्rUitrXइतालवीrUanrXअर्गोनीrUiarX!ईन्टरलिंगुआrUasrXअसामीrUarrX अरबीrUanprXअंगीकाrUes_419rX;लेटिन अमेरिकी स्पेनिशrUavrXअवेरिकrUayrXआयमाराrUazrX!अज़रबैंजानीrUierX!ईन्टरलिंगुइrUidrX$इन्डोनेशियाईrUsatrXसंतालीrUskrXस्लोवाक्rUafhrXअफ्रीलीयाईrUyorXयोरूबाrUnnrXनार्वेजियनrUnorX!नार्वेजीयन्rUnarXनायरूrUafarX5अफ्रो-एशियाई भाषाएँrUen_AUrX?अंग्रेज़ी (ऑस्ट्रेलिया)rUvorXवोलापुकrUgrcrX(प्राचीन यूनानीrUzurXज़ुलूrUnewrXनेवाड़ीrUmisrXविविध भाषाrUsnrX सोणाrUsqrXअल्बेनियन्rUfrrXफ्रेंचrUcelrXकेल्ट भाषाrUsmrXसामोनrUfyrX4पश्चिमी फ़्रिसियाईrUsvrXस्विडिशrUfarXपर्शियन्rUrwrX'किन्यारवाण्डाrUfirXफिनिशrUfjrXफ़ीजीrUsarXसंस्कृतrUfr_CArX)फ़्रेंच(कनाडाई)rUforXफिरोज़ीrUegyrX(प्राचीन मिस्रीrUkkrXकज़ाखrUsrrXसर्बियन्rUmdrrXमंधारrUsitrX2चीनी-तिब्ब्ती भाषाrUkorXकोरीयन्rUknrXकन्नड़rUkmrX!कैम्बोडियन्rUklrX!ग्रीनलैंडिकrUksrXकश्मीरीrUsirXशिंघालीस्rUshrX+सेर्बो-क्रोएशन्rUsorXसोमालीr Umkr X!मैसेडोनियन्r Ukur Xकुरदीशr UslrX!स्लोवेनियन्rUkyrXकिरघिज़rUsgrXसांगोrUsdrXसिन्धीruU territoriesr}r(UBDrXबाँग्लादेशrUBErXबेल्जियमrUBFrX(बुर्किना फ़ासोrUBGrXबुल्गारियाrUVEr Xवेनेजुएलाr!UBAr"XDबोस्निया और हर्ज़िगोविनाr#UBBr$Xबारबाडोसr%UWFr&X2वालिस और फ़्यूचूनाr'UBMr(Xबरमूडाr)UBNr*Xब्रुनेईr+UBOr,Xबोलीवियाr-UBHr.Xबहरीनr/UBIr0Xबुरुंडीr1UBJr2Xबेनिनr3UBTr4Xभूटानr5U011r6X+पश्चिमी अफ्रीकाr7UBVr8Xबौवेत द्वीपr9UBWr:Xबोत्स्वानाr;U014r<X(पूर्वी अफ्रीकाr=U015r>X(उत्तरी अफ्रीकाr?UBRr@Xब्राजीलrAU017rBX"मध्य अफ्रीकाrCU018rDX+दक्षिणी अफ्रीकाrEU019rFXअमेरीकासrGUBYrHXबेलारूसrIUBZrJXबेलिजrKULVrLXलात्वियाrMURWrNXरूआण्डाrOURSrPXसर्बियाrQUTLrRX"पूर्वी तिमोरrSURErTXरियूनियनrUUTMrVX*तुर्कमेनिस्तानrWUTJrXX!ताजिकिस्तानrYUROrZXरोमानियाr[UTKr\Xटोकेलौr]UGWr^Xगीनी-बिसाउr_UGUr`X गुआमraUGTrbXगोतेदालाrcUGSrdXkदक्षिण जोर्जिया और दक्षिण सैंडवीच द्वीपreUGRrfXग्रीसrgUGQrhX.इक्वेटोरियल गिनीriUGPrjXग्वाडेलोपrkUJPrlXजापानrmUOMrnX ओमानroUGYrpXगुयानाrqUGGrrXग्वेर्नसेrsUGFrtX.फ़्रांसीसी गिआनाruUGErvXजॉर्जियाrwUGDrxXग्रेनेडाryU021rzX(उत्तरी अमेरिकाr{UGBr|Xब्रितनr}UGAr~XगैबॉनrUSVrX"अल साल्वाडोरrUGNrX गिनीrUGMrXगाम्बियाrUGLrXग्रीनलैण्डrU029rXकैरिबियनrUGIrXजिब्राल्टरrUGHrX घानाrUJErXजर्सीrUTNrXतुनिशियाrUJMrXजमाइकाrU013rXमध्य अमरीकाrUWSrX समोआrUKIrXकिरिबातीrUHRrXक्रोशियाrUBSrXबहामाrUHTrXहाइतीrUHUrXहंगरीrUHKrXdहांगकांग विशेष प्रशासनिक क्षेत्र चीनrU039rX%दक्षिणी यूरोपrUHNrXहाण्डूरसrUFIrXफिनलैंडrU142rXएशियाrU030rX"पूर्वी एशियाrU034rX%दक्षिणी एशियाrU035rX2दक्षिण-पूर्व एशियाrUPRrXपर्टो रीकोrUPSrXफ़िलिस्तीनrUIOrXTब्रिटिश हिंद महासागरीय क्षेत्रrUPWrX पलाऊrUPTrXपुर्तगालrUSJrX?स्वाल्बार्ड और जॅन मेयनrUMDrXमोल्डावियाrUIQrX इराकrUPArXपनामाrUPFrX=फ़्रांसीसी पॉलिनेशियाrUPGrX)पापुआ न्यू गिनीrUPErX पेरूrUPKrXपाकिस्तानrUPHrXफिलीपिंसrUFOrXफरोए द्वीपrUPNrXपिटकेर्नrUPLrXपोलैंडrUPMrXHसेण्‍ट पीयर और मि‍क्‍वेलोनrUZMrXजाम्बियाrUEHrX%पश्चिमी सहाराrURUrX रूसrUEErXएस्टोनियाrUEGrXमिस्रrUZArX(दक्षिण अफ्रीकाrUECrXइक्वाडोरrUITrX इटलीrUVNrXवियतनामrUZZrX9अज्ञात या अवैध प्रदेशrUSBrX"सोलोमन द्वीपrUETrXइथियोपियाrUSOrXसोमालियाrUZWrXजिम्बाब्वेrUSArXसऊदी अरबrUESrXस्पेनrUERrXइरिट्रियाrUMErX!मोंटेनेग्रोrUAQrX!अंटार्कटिकाrUMGrXमदागास्करrUMFrXसंत मार्टीनrUMArXमोरक्कोrUMCrXमोनाकोrUUZrX!उजबेकिस्तानrUMMrXम्यानमारrUMLrX मालीr UMOr XXमकाओ विशेष प्रशासनिक क्षेत्र चीनr UMNr Xमंगोलियाr UHMrXRहर्ड द्वीप और मैकडोनॉल्ड द्वीपrUASrX"अमेरिकी समोआrUMKrXमैसेडोनियाrUMUrXमौरिसrUMTrXमाल्टाrUMWrXमलावीrUMVrXमालदीवrUMQrXमार्टीनिकrUMPrX;उत्तरी मारियाना द्वीपrUMSr X!मॉन्ट्सेराटr!UMRr"Xमॉरिटानियाr#UUGr$Xयुगांडाr%UTZr&Xतंजानियाr'UMYr(Xमलेशियाr)UMXr*Xमेक्सिकोr+UILr,Xइसराइलr-UFRr.Xफ्रांसr/UAWr0Xअरूबाr1UDOr2X.डोमिनिकन गणराज्यr3USHr4X%सेण्‍ट हेलेनाr5UVCr6XRसेंट विंसेंट और द ग्रेनाडाइन्सr7UDJr8Xजिबूतीr9UFJr:X फिजीr;UFKr<X(फ़ॉकलैंड द्वीपr=UFMr>X'माइक्रोनेशियाr?U053r@XJऑस्ट्रेलिया एवं न्यूजीलैंडrAUNIrBXनिकारागुआrCUNLrDXनीदरलैण्डrEUNOrFXनॉर्वेrGUNArHXनामीबियाrIUVUrJXवानुअतुrKUNCrLX+न्यू कैलेडोनियाrMUNErNXनाइजरrOUNFrPX(नॉरफ़ॉक आइलैंडrQUNGrRXनाइजीरियाrSUNZrTX!न्यूज़ीलैंडrUUNPrVXनेपालrWUNRrXX नॉरूrYUNUrZX नीयूr[U061r\Xपोलीनेशियाr]UCIr^Xआईवरी कोस्टr_UCHr`Xस्विसraUCOrbXकोलम्बियाrcUCNrdX चीनreUCMrfXकैमरूनrgUCLrhX चिलीriUCCrjXकोकोस द्वीपrkUCArlXकनाडाrmUCGrnXकांगोroUCFrpXDसेंट्रल अफ्रीकन रिपब्लिकrqUCDrrXDकोंगो जनतांत्रिक गणतंत्रrsUCZrtXचेक गणराज्यruUCYrvXसाइप्रसrwUCXrxX%क्रिसमस द्वीपryUCSrzX>सर्बिया व मॉण्टेनेग्रोr{UCRr|Xकोस्टारीकाr}UPYr~XपारागुएrUCVrXकैप वर्डेrUCUrXक्यूबाrUSZrXसुआजीलैंडrUSYrXसीरियाrUKGrXकिर्गिजrUKErXकेन्याrUSRrXसुरिनामrU143rXमध्य एशियाrUKHrXकम्बोडियाrUKNrX3सेंट किट्स और नेविसrUKMrXकोमोरोसrUSTrX,साउ-तोम-प्रिंसिपrUSKrXस्लोवाकियाrUKRrX%दक्षिण कोरियाrUSIrXस्लोवेनियाrUKPrX"उत्तर कोरियाrUKWrXकुवैतrUSNrXसेनेगलrUSMrXसैन मेरीनोrUSLrXसियरालेओनrUSCrXसेशेल्सrUKZrXकजाखस्तानrUKYrXकेमैन द्वीपrUSGrXसिंगापुरrUSErXस्वीडनrUSDrXसूडानrU151rX"पूर्वी यूरोपrU150rXयूरोपrUDMrXडोमिनिकrU155rX(पश्चिमी यूरोप्rU154rX"उत्तरी यूरोपrUVGrXAब्रिटिश वर्जीन ऌईलैंडस्rUDErXजर्मनीrUYErX यमनrUMHrX"मार्शल द्वीपrU062rX/दक्षिण-मध्य एशियाrUDZrXअल्जीरियाrUUSrX8संयुक्त राज्य अमरिकाrUUYrXयुरूगुएrUYTrX मैयटrUUMrXdयुनाइटेड स्टेट्स छोटे आउटलाइंग द्वीपrULBrXलेबनानrULCrXसेंट लूसियाrULArX लाओसrUTVrXतुवालुrUTWrXताइवानrUTTrX5ट्रिनिडाड और टोबैगोrUTRrXतुर्कीrULKrXश्रीलंकाrULIrX!लिकटेंस्टीनrUCKrXकुक द्वीपrUTOrXटोंगाrULTrXलिथुआनियाrULUrXलक्समबर्गrULRrXलाइबेरियाrULSrXलेसोथोrUTHrXथाइलैंडrUTFrXJफ़्रांसीसी दक्षिणी क्षेत्रrUTGrX टोगोrUTDrX चाडrUTCrX?तुर्क् और् कैकोज़ द्वीपrULYrXलीबियाrUVArXवैटिकनrU145rX%पश्चिमी ऐशियाrUAErX2संयुक्त अरब अमीरातrUADrXअन्डोराrUAGrX/एंटिगुआ और बरबुडाrUAFrX!अफगानिस्तानrUAIrXएंगुइलाr UVIr X:ईउ, एस वर्जीन आईलैंडस्r UISr Xआइसलैंडr UIRrX ईरानrUAMrXआर्मेनियाrUALrXअल्बानियाrUAOrXअंगोलाrUANrX7नीदरलैंड्स एंटिलीज़rU003rX%उत्तर अमेरिकाrU002rXअफ्रीकाrU001rXदुनियाrUARrX!अर्जेन्टीनाrUAUr X!ऑस्ट्रेलियाr!UATr"Xऑस्ट्रियाr#U005r$X(दक्षिण अमेरिकाr%UINr&X भारतr'UAXr(Xआलैंड द्वीपr)U009r*Xओशिआनियाr+UAZr,Xअजरबैजानr-UIEr.Xआयरलैंडr/UIDr0Xइंडोनेशियाr1UJOr2Xजोर्डनr3UQUr4Xयूरोपीय संघr5UUAr6Xयूक्रेनr7UQAr8X कतरr9UDKr:Xडेनमार्कr;UMZr<Xमोजाम्बिकr=uUdecimal_formatsr>}r?Nh$)r@}rA(h'Nh)Kh*KKrBh,h-h-rCh/KKrDh1X #,##,##0.###rEh3h-h4rFh6Nh7KKrGubsU date_formatsrH}rI(UmediumrJhM)rK}rL(h1X dd-MM-yyyyrMhQX%(dd)s-%(MM)s-%(yyyy)srNubUfullrOhM)rP}rQ(h1XEEEE d MMMM yyyyrRhQX %(EEEE)s %(d)s %(MMMM)s %(yyyy)srSubUlongrThM)rU}rV(h1X d MMMM yyyyrWhQX%(d)s %(MMMM)s %(yyyy)srXubUshortrYhM)rZ}r[(h1Xd-M-yyr\hQX%(d)s-%(M)s-%(yy)sr]ubuUcurrency_symbolsr^}r_(URUBr`X रूबलraUCSDrbXस. ढीनारrcUINRrdXरु.reUFJDrfX#फ़िजी का डालरrgUBRLrhXरीयालriUCNYrjXयुवानrkuU time_zonesrl}rm(UAtlantic/Canaryrn}roUcityrpXकेनरी द्वीपrqsUAustralia/Melbournerr}rsjpXमेलबोर्नrtsU Europe/Minskru}rvjpXमिंस्कrwsUAmerica/Nipigonrx}ryjpXनिपिगनrzsUAmerica/Miquelonr{}r|jpXमिक्वेलोनr}sUPacific/Wallisr~}rjpXवालिसrsUAntarctica/Davisr}rjpXडेविसrsUAmerica/Coral_Harbourr}rjpX%कोरल बन्दरगाहrsU Asia/Dhakar}rjpX ढाकाrsUAmerica/St_Luciar}rjpXसेंट लुसीयाrsU Asia/Kashgarr}rjpXकाश्गरrsUAmerica/Phoenixr}rjpXफोनिक्सrsU Asia/Kuwaitr}rjpXकुवैतrsUAsia/Hong_Kongr}rjpXहाँगकाँगrsU Europe/Parisr}rjpXपेरिसrsUEurope/Stockholmr}rjpXस्टॉकहोमrsU Pacific/Fijir}rjpXफ़िजीrsU Pacific/Apiar}rjpXएपियाrsUPacific/Pago_Pagor}rjpXपागो पागोrsU Asia/Rangoonr}rjpXरंगूनrsUAmerica/Mexico_Cityr}rjpX%मेक्सिको सिटीrsUAmerica/Puerto_Ricor}rjpX%प्योर्तो रिकोrsUIndian/Mauritiusr}rjpXमॉरिशसrsU Europe/Berlinr}rjpXबर्लिनrsU Europe/Zurichr}rjpXज़्यूरिकrsU America/Belemr}rjpXबेलेमrsUAsia/Krasnoyarskr}rjpX*क्राशनोयार्श्कrsUAtlantic/Bermudar}rjpXबरमूडाrsUAustralia/Currier}rjpXक्यूरीrsU Asia/Tehranr}rjpXतेहरानrsU Asia/Saigonr}rjpXसाइगॉनrsU Asia/Bakur}rjpX बाकूrsUAmerica/Danmarkshavnr}rjpX$डेनमार्क्षवनrsUAmerica/Scoresbysundr}rjpX'स्कोर्सबाइसंडrsUAmerica/Eiruneper}rjpXईरोंपेrsUAmerica/Caracasr}rjpXकाराकसrsU Asia/Baghdadr}rjpXबगदादrsUAfrica/Monroviar}rjpXमोन्रोवियाrsUAmerica/St_Vincentr}rjpX"सेंट विंसेंटrsUAmerica/Vancouverr}rjpXवांकूवरrsU Asia/Thimphur}rjpXथिम्फूrsU Africa/Accrar}rjpXऐक्राrsUAmerica/Belizer}rjpXबेलिज़ेrsUAmerica/Port_of_Spainr}rjpX)पोर्ट ऑफ़ स्पेनrsUAmerica/Mendozar}rjpXमेंडोजाrsU Asia/Tokyor}rjpXटोक्योrsUPacific/Kiritimatir}rjpXकिरीतिमातिrsUAustralia/Sydneyr}rjpXसिडनीrsU Europe/Rigar}rjpX रिगाrsU Asia/Dilir}rjpX डिलीrsUAfrica/Mbabaner}rjpXम्बाबेनrsU Asia/Oralr}r jpX ओरलr sU Asia/Adenr }r jpX ऐडेनr sUEurope/Istanbulr}rjpXइस्तानबुलrsU Asia/Magadanr}rjpXमगादनrsUAustralia/Lindemanr}rjpXलिंडेमानrsUPacific/Galapagosr}rjpXगेलापगोसrsUAmerica/Bogotar}rjpXबोगोटाrsUAmerica/Dawsonr}rjpX डोसनrsUAmerica/Chicagor }r!jpXशिकागोr"sUPacific/Kwajaleinr#}r$jpXक्वजलेनr%sUAustralia/Broken_Hillr&}r'jpX"ब्रोकन हिल्सr(sUAmerica/Cuiabar)}r*jpXकूईआबाr+sUIndian/Christmasr,}r-jpXक्रिसमसr.sU Asia/Jayapurar/}r0jpXजयापुराr1sUEurope/Brusselsr2}r3jpXब्रसल्सr4sU Europe/Lisbonr5}r6jpXलिस्बनr7sUAsia/Chongqingr8}r9jpXचोंग्पिंगr:sUAmerica/Noronhar;}r<jpXनोरोन्हाr=sUAfrica/Algiersr>}r?jpXअल्जीरियाr@sU Africa/HararerA}rBjpXहरारेrCsUAfrica/NdjamenarD}rEjpXजमेनाrFsUAmerica/Costa_RicarG}rHjpXकोस्टा रिकाrIsUIndian/MayotterJ}rKjpXमायोत्तेrLsUAsia/Phnom_PenhrM}rNjpXनोम पेन्हrOsUAmerica/ManaguarP}rQjpXमनागुआrRsU Asia/BruneirS}rTjpXब्रूनेइrUsUAmerica/TijuanarV}rWjpXटिज्यूआनाrXsUPacific/FakaoforY}rZjpXफ़काओफ़ोr[sU America/Adakr\}r]jpX अडकr^sUAmerica/Antiguar_}r`jpXएंटिगुआrasUAmerica/Argentina/La_Riojarb}rcjpXला रिओजाrdsUPacific/Tahitire}rfjpXटहीटिrgsUAmerica/Pangnirtungrh}rijpX$पंग्निर्टंग्rjsUAmerica/Asuncionrk}rljpXऐसन्क्षनrmsU Europe/Viennarn}rojpXवियनाrpsUAustralia/Hobartrq}rrjpXहोबर्ट्rssUAmerica/Juneaurt}rujpXजुनेऔrvsUAmerica/Inuvikrw}rxjpXइनूविकrysUAmerica/Montrealrz}r{jpXमोंट्रियलr|sU Asia/Seoulr}}r~jpX सोलrsU Indian/Comoror}rjpXकोमोरोrsUAntarctica/Rotherar}rjpXरोथेराrsUEurope/Tallinnr}rjpXटैलिनrsU Indian/Maher}rjpX माहेrsUAmerica/Martiniquer}rjpXमारटीनीकrsUAsia/Singaporer}rjpXसिंगापुरrsUAfrica/Nairobir}rjpXनैरोबीrsUAmerica/Maceior}rjpXमेसीओrsU Asia/Urumqir}rjpXउरम्चीrsU Europe/Moscowr}rjpXमॉस्कोrsUAsia/Pyongyangr}rjpXप्योंगयांगrsUAsia/Ulaanbaatarr}rjpXउलानबाटरrsUAmerica/Rainy_Riverr}rjpXरेनी नदीrsUIndian/Maldivesr}rjpXमालदीवrsU Asia/Colombor}rjpXकोलंबोrsUAustralia/Adelaider}rjpXएडिलेडrsUAmerica/Cambridge_Bayr}rjpX(केम्ब्रिज खाडीrsU Africa/Luandar}rjpXलूएंडाrsUPacific/Chathamr}rjpX चाथमrsUAmerica/Indiana/Winamacr}rjpXविनामेकrsUAmerica/Cordobar}rjpXकोर्डोवाrsU Asia/Tbilisir}rjpXबिलिसीrsUEurope/Gibraltarr}rjpXजिब्राल्टरrsU Asia/Karachir}rjpXकराचीrsU Asia/Harbinr}rjpXहर्बिनrsUAustralia/Lord_Hower}rjpXलोर्ड होवेrsUAmerica/Boa_Vistar}rjpXबोआ विस्ताrsUAfrica/Tripolir}rjpXत्रिपोलीrsUIndian/Reunionr}rjpXरियूनियनrsUAtlantic/Stanleyr}rjpXस्टैन्लीrsUAmerica/Blanc-Sablonr}rjpX%ब्लांक-सेबलोनrsUAntarctica/Syowar}rjpXस्योवाrsUAmerica/Jamaicar}rjpXजमैकाrsU Europe/Kievr}rjpX कीवrsUEurope/Budapestr}rjpXबुडापेस्टrsUPacific/Midwayr}rjpXमिडवेrsUAmerica/Goose_Bayr}rjpXगूस खाडीrsU Asia/Ammanr}rjpXअम्मानrsU Asia/Sakhalinr}rjpXसखालिनrsUAfrica/Windhoekr}rjpXविन्डोएकrsU Asia/Katmandur}rjpXकाठमांडूrsUAmerica/Guyanar}rjpXगुयानाrsUAmerica/Sao_Paulor}rjpXसाओ पॉलोrsUAustralia/Perthr}rjpX पर्थrsUAfrica/Djiboutir}rjpXडिजिबौटीrsU Asia/Jakartar}rjpXजकार्ताr sUAntarctica/Palmerr }r jpX पॉमरr sUAfrica/Johannesburgr }rjpXजोहानसबर्गrsU Asia/Irkutskr}rjpXईर्कुत्स्कrsU Africa/Niameyr}rjpXन्यामेrsUAfrica/Casablancar}rjpX!कैसाब्लैंकाrsUAmerica/Indiana/Marengor}rjpXमारेंगोrsUAfrica/Nouakchottr}rjpXनौवाक्चॉटrsUEurope/Vilniusr}r jpXविल्निअसr!sUAmerica/Cayenner"}r#jpX कयेनr$sUAfrica/Mogadishur%}r&jpXमोगाडिशूr'sUAmerica/Kentucky/Monticellor(}r)jpXमोंटीसेलोr*sUAmerica/Rio_Brancor+}r,jpX%रियो ब्रान्कोr-sUAmerica/Cancunr.}r/jpX कनकनr0sUAmerica/Havanar1}r2jpXहवानाr3sU Pacific/Guamr4}r5jpXग्वामr6sU Asia/Makassarr7}r8jpXमकस्सरr9sUAtlantic/Azoresr:}r;jpXअज़ोरसr<sUAustralia/Euclar=}r>jpXयूक्लाr?sUAmerica/Rankin_Inletr@}rAjpX"रेंकिन इंलेटrBsU Asia/BeirutrC}rDjpXबेरुतrEsU Africa/MaputorF}rGjpXमाइपुटोrHsU Asia/BahrainrI}rJjpXबहरीनrKsU Asia/AshgabatrL}rMjpXअश्गाबातrNsU Asia/RiyadhrO}rPjpXरियाधrQsU Europe/LondonrR}rSjpX लंदनrTsUAmerica/MonterreyrU}rVjpXमोंटेरेrWsUAmerica/AnguillarX}rYjpXएंग्विलाrZsU Asia/Damascusr[}r\jpXदमास्कसr]sUAmerica/North_Dakota/Centerr^}r_jpX मध्यr`sUAmerica/Indiana/Vevayra}rbjpX विवेrcsUAtlantic/St_Helenard}rejpXसेंट हेलेनाrfsUAmerica/Barbadosrg}rhjpXबारबाडोसrisUAmerica/Indiana/Vincennesrj}rkjpXविंसिनेसrlsU Asia/Almatyrm}rnjpXअल्माटीrosU Africa/Lomerp}rqjpX लोमrrsUAfrica/Brazzavillers}rtjpXब्राज़ाविलrusU America/Nomerv}rwjpX नोमrxsU Asia/Taipeiry}rzjpXताइपेइr{sUAmerica/Yakutatr|}r}jpXयकूततr~sUAmerica/Araguainar}rjpXअरग्वैनाrsU Europe/Vaduzr}rjpXवादुज़rsU Africa/Asmerar}rjpXअसमेराrsUAntarctica/Mawsonr}rjpX मॉसनrsUAmerica/Buenos_Airesr}rjpXब्यूनस आयरसrsU Africa/Maserur}rjpXमसेरूrsUAmerica/Louisviller}rjpXलोईसविलेrsU Asia/Kuchingr}rjpXकूचिंगrsUAfrica/Libreviller}rjpXलिबरविलrsUAfrica/Freetownr}rjpXफ़्रीटाउनrsU Africa/Bissaur}rjpXबिस्साउrsU Europe/Samarar}rjpXसमाराrsUEurope/Amsterdamr}rjpXऐम्स्टरडमrsU Europe/Tiraner}rjpXटिरेनrsUPacific/Saipanr}rjpXसइपानrsUAfrica/Abidjanr}rjpXअबिद्जानrsUEurope/Zaporozhyer}rjpXझापोरोझेrsUAmerica/El_Salvadorr}rjpXसैल्वेडोरrsU Europe/Madridr}rjpXमैड्रिडrsUAmerica/Santiagor}rjpXसेंटिएगोrsUAmerica/Argentina/San_Luisr}rjpXसान लुईसrsU America/Arubar}rjpXअरूबाrsUAmerica/Indianapolisr}rjpX*इन्डियानापोलिसrsUAmerica/Reginar}rjpXरेजिनाrsU Pacific/Trukr}rjpXट्रुकrsUPacific/Funafutir}rjpXफ़ुनाफ़ूटीrsUAmerica/Meridar}rjpXमेरिडाrsUAmerica/Guatemalar}rjpXग्वाटेमालाrsUAfrica/Sao_Tomer}rjpXसाओ टोमrsUPacific/Kosraer}rjpXकोसराएrsUAfrica/Bujumburar}rjpXबुजुम्बुराrsUEurope/Chisinaur}rjpXचिसीनौrsU Europe/Warsawr}rjpXवॉरसाrsUAsia/Yekaterinburgr}rjpX*येकांतिरिंबर्गrsUAntarctica/Caseyr}rjpXक़ेसीrsUAmerica/Halifaxr}rjpXहेलिफेक्सrsU America/Thuler}rjpXथ्यूलेrsUAmerica/St_Johnsr}rjpXसेंट जोंसrsUAmerica/Monctonr}rjpXमोंक्ट्नrsUEurope/Helsinkir}rjpXहेल्सिंकीrsUAtlantic/Cape_Verder}rjpXकेप वर्डेrsU Indian/Cocosr}rjpXकोकोसrsU America/Boiser}rjpX बोईसrsUAmerica/Guadelouper}rjpXगौडलोपrsUAmerica/Nassaur}rjpXनस्साउrsUPacific/Enderburyr}rjpXएंडरबेरीrsU Asia/Hovdr }r jpXहोव्डr sUAmerica/Manausr }r jpX मनौसrsUAmerica/Godthabr}rjpXगॉडथैबrsUAmerica/Catamarcar}rjpXकटामार्काrsUAmerica/Chihuahuar}rjpXचिहुआहुआrsUAmerica/Iqaluitr}rjpX!इक्याल्यूईतrsUAmerica/Argentina/Rio_Gallegosr}rjpX"रियो गालेगोसrsUPacific/Gambierr}rjpXगैम्बियरr sUEurope/Volgogradr!}r"jpX!वोल्गोग्रेडr#sU Africa/Bamakor$}r%jpXबमाकोr&sUEurope/Uzhgorodr'}r(jpXउझ्गोरोड्r)sU Africa/Banjulr*}r+jpXबनजुलr,sU Asia/Aqtaur-}r.jpXअक्तावr/sU Africa/Malabor0}r1jpXमालाबोr2sUAtlantic/Madeirar3}r4jpXमडेएराr5sUPacific/Noumear6}r7jpXनूमियाr8sUAfrica/Kinshasar9}r:jpXकिन्शासाr;sU Europe/Maltar<}r=jpXमाल्टाr>sUAmerica/Argentina/Ushuaiar?}r@jpXउशूयियाrAsU Asia/BangkokrB}rCjpXबैंगकॉकrDsU Pacific/NiuerE}rFjpX नियुrGsUAustralia/BrisbanerH}rIjpXबिर्स्बेनrJsUAmerica/ReciferK}rLjpXरेचीफ़ेrMsU Asia/YerevanrN}rOjpXयेरेवनrPsUAmerica/La_PazrQ}rRjpXला पाज़rSsU Africa/CairorT}rUjpXकायरोrVsU Africa/LusakarW}rXjpXलुसाकाrYsUPacific/GuadalcanalrZ}r[jpXग्वाडलकनालr\sUAmerica/Yellowknifer]}r^jpXयेलोनाईफr_sUAsia/Vientianer`}rajpXवियंतियेनrbsUEurope/Kaliningradrc}rdjpX$कालिलींग्राडresUAfrica/Conakryrf}rgjpXकोनाक्रीrhsUAmerica/Argentina/Tucumanri}rjjpXटोकूमनrksU Europe/Oslorl}rmjpXओस्लोrnsUAmerica/St_Kittsro}rpjpX"सेंट किट्ट्सrqsUAmerica/Panamarr}rsjpXपनामाrtsUAfrica/Gaboroneru}rvjpXगैबोरोनrwsU Pacific/Palaurx}ryjpX पलाऊrzsUAmerica/Guayaquilr{}r|jpX!ग्वायाक्विलr}sUAsia/Kuala_Lumpurr~}rjpX%क्वाला लम्पुरrsUAtlantic/Faeroer}rjpXफ़ैरोrsUAmerica/Menomineer}rjpXमेनोमिनीrsUAsia/Kamchatkar}rjpXकमचटकाrsUAsia/Vladivostokr}rjpX'ब्लाडिवोस्टोकrsU Asia/Qatarr}rjpX क़तरrsU Asia/Dubair}rjpX दुबईrsU Asia/Yakutskr}rjpXयाकूत्स्कrsU Asia/Omskr}rjpXओम्स्कrsU Africa/Banguir}rjpXबैंगुइrsUAmerica/Paramaribor}rjpXपरामरीबोrsUAfrica/Lubumbashir}rjpXलुबुमबाशीrsUPacific/Marquesasr}rjpXमार्केससrsU Asia/Anadyrr}rjpXअनाडेरrsUAmerica/New_Yorkr}rjpXन्यूयार्कrsUPacific/Norfolkr}rjpXनोर्फ़ोकrsUPacific/Rarotongar}rjpXरारोटोंगाrsUAmerica/Dominicar}rjpXडॉमिनिकाrsUAfrica/Porto-Novor}rjpXपोर्टो-नोवोrsUAsia/Samarkandr}rjpXसमरकंडrsU Asia/Dushanber}rjpXदुशांबेrsUAmerica/Torontor}rjpXटोरंटोrsU America/Bahiar}rjpXबहियाrsUAfrica/Kampalar}rjpXकम्पालाrsUAfrica/Ouagadougour}rjpXओआगदूगूrsUAntarctica/South_Poler}rjpX%दक्षिणी ध्रुवrsU Asia/Muscatr}rjpXमस्कटrsUAmerica/Edmontonr}rjpXएडमंटनrsU Pacific/Waker}rjpX वेकrsUAmerica/Indiana/Tell_Cityr}rjpXटेल सिटीrsUAustralia/Darwinr}rjpXडार्विन्rsUAmerica/Whitehorser}rjpX!व्हाईटहोर्सrsUAmerica/Swift_Currentr}rjpX"स्विफ्ट करंटrsUEurope/Copenhagenr}rjpXकोपनहेगनrsUAmerica/Montserratr}rjpXमोन्त्सेरतrsU Asia/Tashkentr}rjpXताशकंदrsUEurope/Simferopolr}rjpX!सिम्फेरोपोलrsUAfrica/Blantyrer}rjpXब्लैंटायरrsUAmerica/Detroitr}rjpXडेट्रोईटrsUAmerica/Shiprockr}rjpXशिपरेकrsUAmerica/Grenadar}rjpXग्रेनाडाrsUAmerica/Indiana/Petersburgr}rjpX!पिटर्स्वर्गrsUAsia/Pontianakr}rjpXपोंतिआंकrsUAfrica/Dar_es_Salaamr}rjpXदार एस सलामrsUAmerica/Port-au-Princer}rjpX)पोर्ट-आउ-प्रिंसrsUAmerica/Caymanr}rjpX केमनrsU Europe/Athensr}r jpXएथेंसr sUAmerica/Curacaor }r jpXक्यूराकाओr sUIndian/Kerguelenr}rjpXकर्ग्वेलेनrsUAfrica/Khartoumr}rjpXखार्तूमrsU Asia/Manilar}rjpXमनीलाrsUAmerica/Santo_Domingor}rjpX"संटो डोमिंगोrsU America/Jujuyr}rjpXजुजोएrsU Africa/Doualar}rjpXदोआलाrsU Europe/Romer }r!jpX रोमr"sUAmerica/Argentina/San_Juanr#}r$jpXसान जुआनr%sUAmerica/North_Dakota/New_Salemr&}r'jpXन्यू सालेमr(sUPacific/Port_Moresbyr)}r*jpX+पोर्ट मोरेस्बाइr+sUEurope/Andorrar,}r-jpXअंडोराr.sUEurope/Luxembourgr/}r0jpXलक्ज़मबर्गr1sUPacific/Honolulur2}r3jpXहानूलुलुr4sUAmerica/St_Thomasr5}r6jpXसेंट टॉमसr7sUPacific/Majuror8}r9jpXमजूरोr:sUAmerica/Mazatlanr;}r<jpXम्जाटलानr=sU Asia/Macaur>}r?jpX मकाऊr@sUAsia/ChoibalsanrA}rBjpXचोइबालसनrCsUAntarctica/McMurdorD}rEjpXमैकमुर्डोrFsUAmerica/Thunder_BayrG}rHjpXथंडर खाडीrIsUAmerica/Los_AngelesrJ}rKjpXलोस एंजिलेसrLsU Asia/KabulrM}rNjpXकाबूलrOsUIndian/AntananarivorP}rQjpXऐंटनानरीवोrRsUAtlantic/ReykjavikrS}rTjpXरेक्याविकrUsU Asia/NicosiarV}rWjpXनिकोसियाrXsUPacific/PonaperY}rZjpXपोनापेr[sUPacific/Tongatapur\}r]jpXटोंगाटापूr^sUPacific/Pitcairnr_}r`jpXपिट्कैर्नrasUPacific/Easterrb}rcjpX.ईस्टर द्वीप (चिली)rdsUAtlantic/South_Georgiare}rfjpX%साउथ जॉर्जियाrgsUAfrica/El_Aaiunrh}rijpXएल आइउनrjsUAmerica/Campo_Granderk}rljpX+केम्पो ग्रान्देrmsUAmerica/Dawson_Creekrn}rojpXडोसन क्रिकrpsUAntarctica/Vostokrq}rrjpXवोस्तोकrssUEurope/Bucharestrt}rujpX!बुक्कारेस्टrvsUAmerica/Porto_Velhorw}rxjpX%पोर्टो वेल्होrysU Europe/Monacorz}r{jpXमोनाकोr|sU Asia/Bishkekr}}r~jpXबिश्केकrsU Africa/Ceutar}rjpXक्यूटाrsUAmerica/Winnipegr}rjpXविनीपेगrsU Asia/Aqtober}rjpXअक़्टोवेrsU Africa/Dakarr}rjpX डकारrsUAmerica/Fortalezar}rjpX$फ़ोर्टालेज़ाrsUPacific/Tarawar}rjpXटरावाrsUAfrica/Addis_Ababar}rjpXऐडिस अबाबाrsU Pacific/Efater}rjpXएफ़ेटrsUPacific/Johnstonr}rjpXजॉनस्टनrsUAsia/Qyzylordar}rjpX!केज़ेलोर्डाrsUAsia/Jerusalemr}rjpXयेरुसलमrsUPacific/Aucklandr}rjpXऔकलैंडrsUAmerica/Tortolar}rjpXटॉरटोलाrsUAmerica/Denverr}rjpXडेनवरrsU Indian/Chagosr}rjpXचागोसrsUAmerica/Glace_Bayr}rjpXग्लेस खाडीrsUAmerica/Hermosillor}rjpXहर्मोसिलोrsU Africa/Tunisr}rjpXट्यूनिसrsUAmerica/Montevideor}rjpX$मोन्टेवीडियोrsUAmerica/Resoluter}rjpXरिसोल्यूटrsU Asia/Gazar}rjpXगाज़ाrsU Europe/Dublinr}rjpXडबलिनrsUAntarctica/DumontDUrviller}rjpX)डुमोंट ड'अर्विलrsUAmerica/Indiana/Knoxr}rjpXनोक्सrsUAsia/Novosibirskr}rjpX*नॉवोसिविर्स्क्rsU Africa/Kigalir}rjpXकिगालिrsUAmerica/Grand_Turkr}rjpX"ग्रैँड तुर्कrsU Africa/Lagosr}rjpXलागोसrsU Europe/Sofiar}rjpXसोफ़ियाrsU America/Limar}rjpX लीमाrsU Etc/Unknownr}rjpXअज्ञातrsUAmerica/Anchorager}rjpXअलास्काrsU Pacific/Naurur}rjpX नौरूrsuUscriptsr}r(UYiiirXयीrUJavarXजावानीसrUCirtrXसिर्थrUGururXगुरमुखीrUHebrrXहिब्रूrULaoorX लाओrUXpeorX"पुरानी फारसीrUCyrlrXसिरिलिकrUMoonrX चाँदrUArmnrXअर्मेनियाईrULatfrX(फ्रैकतुर लैटिनrUKhmrrX खमेरrUTamlrX तमिलrUArmirXअर्मीr UTelur Xतेलुगूr ULatnr Xलाटिनr UHanir Xहनr UItalr Xपुरानी इटलीr UIndsr Xसिन्धुr UBalir X बालीr UGujrr Xगुजरातीr UKorer Xकोरियाईr UHangr Xहंगुलr UZxxxr Xअलिखितr USgnwr X"सांकेतिक लेखr UArabr X अरबीr UThaar X थानाr UAvstr Xअवेस्तनr USinhr Xसिहंलीr UOryar Xउडियाr UHansr! Xसरलीकृत हनr" UThair# X थाईr$ ULepcr% Xलेपचाr& UHantr' X"पारम्परिक हनr( UTalur) Xनया ताई लुएr* UMongr+ Xमंगोलियाईr, UDevar- Xदेवनागरीr. URunrr/ Xरूनिकr0 UHirar1 Xहीरागानाr2 UZzzzr3 X3अज्ञात या अवैध लिपिr4 UOrkhr5 Xओरखोनr6 UTaler7 Xताई लीr8 UMymrr9 Xम्यांमारr: UTglgr; Xटैगालोगr< UBrair= Xब्रेलr> UBrahr? Xब्रह्ममीr@ USararA XसरातीrB UGrekrC Xग्रीकrD UMlymrE XमलयालमrF UCherrG XचिरूकीrH UEthirI XईथोपियाईrJ UTibtrK Xतिब्बतीrL UQaairM XविरासतrN UZyyyrO XआमrP USaurrQ Xसौराष्ट्रrR UJpanrS XजापानीrT UBatkrU X बटकीrV UVaiirW X वाईrX UNkoorY Xएन् कोrZ ULanar[ X लानाr\ USundr] Xसूडानीr^ UBengr_ Xबंगालीr` ULimbra Xलिम्बूrb UOgamrc X ओगमrd UKndare Xकन्नड़rf uUvariantsrg }rh (UREVISEDri X(संशोधित वर्तनीrj UNJIVArk Xजीवा बोलीrl U1996rm X4जर्मेनी की 1996 वर्तनीrn UMONOTONro Xएकस्वरीयrp UAREVELArq X1पूर्वी अर्मेनियाईrr UPOSIXrs Xकम्प्यूटरrt UPOLYTONru Xबहुस्वरीयrv U1901rw XAपारम्पारिक जर्मन वर्तनीrx uUnumber_symbolsry }rz (Ugroupr{ X,r| UnativeZeroDigitr} X०r~ U exponentialr XEr UperMiller X‰r Unanr XNaNr Udecimalr X.r U percentSignr h>Ulistr X;r U patternDigitr X#r UplusSignr X+r Uinfinityr X∞r U minusSignr h4uUcurrency_namesr }r (UDZDr X.अल्जीरीयाई दिनारr UNADr X(नामीबियाई डालरr USITr X1स्लोवेनियाई तोलारr UEGPr X%मिस्री पाउण्डr UBGNr X.बुल्गारियाई लेव्r UBOBr X:बोलिवियाई बोलिवियानोr UDKKr X(डेनमार्क क्रोनr ULBPr X%लेबनानी पाउंडr UVNDr X%वियतनामी डोंगr UMYRr X+मलेशियाई रिंगितr USARr Xसउदी रियालr UEURr X युरोr UHKDr X%हाँगकाँग डॉलरr UCHFr X%स्विस फ़्रैंकr UHRKr X+क्रोएशियाई कुनाr UHRDr X+क्रोएशियन दिनारr UTHBr Xथाई बाहतr UAUDr X1ऑस्ट्रेलियाई डॉलरr USYPr X%सीरियाई पाउंडr UMADr X(मोराक्को दिरहमr UFRFr X4फ़्रांसीसी फ़्रैंकr UMAFr X(मोरक्को फ्रैंकr UPHPr X(फ़िलिपीनी पीसोr UZARr X;दक्षिण अफ़्रीकी रॅण्डr URHDr X(रोडेशियाई डालरr UILSr X(इस्राइली शेकेलr UDEMr Xडच मार्कr UEEKr X1एस्टोनियाई क्रून्r ULKRr X+श्रीलंकाई रुपयाr USKKr X(स्लोवाक कोरुनाr UPKRr X.पाकिस्तानी रुपयाr UHUFr X%हंगरी फोरेंट्r URONr X(रोमानियाई ल्यूr UAMDr X%अरमेनियाई दरमr UAFNr Xअफगानीr UTRLr X2पुरानी तुर्की लीराr UKPWr X/उत्तर कोरियाई वोनr jbX)सर्बिय का ढीनारr UAFAr Xअफगानी (1927-2002)r UTRYr X&नई तुर्की लीराr ULRDr X+लाईबेरीयाई डालरr URWFr X(रवांडाई फ्रैंकr UNOKr X"नॉर्वे क्रोनr jdX#भारतीय रूपयाr UMXNr X%मेक्सिको पेसोr UCZKr Xचेक कोरुनाr UTJSr X"तजाखी सोमोनीr UTJRr Xतजाखी रूबलr UNPRr X"नेपाली रुपयाr UCOPr X+कोलम्बियाई पीसोr UIDRr X7इण्डोनेशियाई रुपियाr jfX#फ़िजी का डालरr UPENr X2पेरुवाई न्यूवो सोलr USURr Xसोवियत रूबलr USEKr X%स्वीडन क्रोनाr USRGr X+सूरीनामी गिल्डरr USRDr X%सूरीनामी डालरr UKRWr X2दक्षिण कोरियाई वोनr UVEBr X7वेनेज़ुएलाई बोलिवारr UCLPr Xचिली पीसोr ULTLr X.लिथुआनियाई लितासr UITLr X इतली का लीराr j`Xरूसी रूबलr UOMRr Xओमानी रियालr jhXरीयालr UPLNr X/पोलिश नया ज़्लॉटीr UAEDr XHसंयुक्त अरब अमीरात दिर्हामr UUSDr Xअमरीकी डालरr UGBPr XBब्रितन का पौन्ड स्टर्लिगr UTWDr X,नया ताईवानी डॉलरr UUSNr X+अमेरीकी डालर (कल)r UUSSr X+अमेरीकी डालर (आज)r UIQDr Xइराकी दिनारr UCADr X"कनेडियन डॉलरr! UJPYr" Xजापानी येनr# UCYPr$ X%साईप्रस पाऊंडr% UKWDr& X"कुवैती दिनारr' UXXXr( X9अज्ञात या अवैध मुद्राr) USOSr* X%सोमाली शिलिंगr+ USGDr, X%सिंगापुर डॉलरr- jjXयुवानr. UNZDr/ X.न्यूज़ीलैंड डॉलरr0 UARSr1 X.अर्जेण्टीनी पीसोr2 USDPr3 X5पुराना सूडानी पाउंडr4 URSDr5 X%सर्बियन दिनारr6 USDDr7 X5पुरानी सूडानी दिनारr8 USDGr9 X"सूडानी पाउंडr: uUmonthsr; }r< (U stand-aloner= }r> Unarrowr? }r@ (KhKhKX3rA KX4rB KX5rC KX6rD KX7rE KX8rF K X9rG K X10rH K X11rI K X12rJ usUformatrK }rL (UwiderM }rN (KXजनवरीrO KXफरवरीrP KXमार्चrQ KXअप्रैलrR KXमईrS KX जूनrT KXजुलाईrU KXअगस्तrV K Xसितम्बरrW K Xअक्तूबरrX K Xनवम्बरrY K Xदिसम्बरrZ uU abbreviatedr[ }r\ (KXजनवरीr] KXफरवरीr^ KXमार्चr_ KXअप्रैलr` KXमईra KX जूनrb KXजुलाईrc KXअगस्तrd K Xसितम्बरre K Xअक्तूबरrf K Xनवम्बरrg K Xदिसम्बरrh uuuUcurrency_formatsri }rj Nh$)rk }rl (h'Nh)Kh*KKrm h,h-h-rn h/KKro h1X¤ #,##,##0.00rp h3X¤ rq X-¤ rr rs h6Nh7KKrt ubsUdaysru }rv (U stand-alonerw }rx Unarrowry }rz (KhKXमंr{ KjB KXगुr| KjD KjE KXरr} usUformatr~ }r (Uwider }r (KXसोमवारr KXमंगलवारr KXबुधवारr KXगुरुवारr KXशुक्रवारr KXशनिवारr KXरविवारr uU abbreviatedr }r (KX सोमr KX मंगलr KX बुधr KX गुरुr KXशुक्रr KX शनिr KX रविr uuuU meta_zonesr }r UIndiar }r (Ucommonr Ulongr }r Ustandardr Xभारतीय समयr susUerasr }r U abbreviatedr }r (KXईसापूर्वr KXसनr usu.PK[Rll(site-packages/babel/localedata/ss_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[3)>%%%site-packages/babel/localedata/yo.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqX àárọ̀qUpmqX ọ̀sánquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@(UguqAX Ede GujaratiqBUgdqCXEde Gaelik ti Ilu ScotlandqDUgaqEX Ede IrelandqFUgnqGXGuaraniqHUglqIX Ede GaliciaqJUlaqKX Ede LatiniqLUlnqMXTaqNUloqOXara LaosqPUtrqQX Ede TurkeyqRUlvqSX Ede LatvianuqTUltqUX Ede LithuaniaqVUtkqWXTurkmenqXUthqYXEde ThaiqZUtiq[X Ede Tigrinyaq\Uteq]X Ede Teluguq^Upt_PTq_X Ede Portugalq`UfilqaX Ede TagalogiqbUtaqcX Ede TamiliqdUyiqeXYiddishiqfUyoqgXYorùbáqhUdeqiXÈdè Ilẹ̀ GermanyqjUdaqkXÈdè Ilẹ̀ DenmarkqlUelqmXgirikiqnUeoqoX Ede EsperantoqpUenqqXÈdè Gẹ̀ẹ́sìqrUeuqsX Ede BaskiqtUetquX Ede EstoniaqvUesqwXPanyanqxUruqyX Ede RoosiaqzUroq{X Ede Romaniaq|Ubnq}X Ede Bengaliq~UbeqX Ede BelarusiqUbgqX Ede BulgariaqUukqX Ede UkraniqUjvqX Ede JavanaqUbhqX Ede BihariqUbrqXBretoniqUbsqX Ede BosniaqUjaqXJapanisiqUocqX Ede OccitaniqUtwqXTwiqUtlhqX Ede KlingoniqUorqXOriyaqUxhqX Ede XhosaqUcaqX Ede CatalaqUcyqX Ede WelshiqUcsqXOrile-ede TsekiqUpsqXPashtoqUptqX Ede PortugiqUpaqX Ede PunjabiqUviqX Ede VietnamuqUplqXÈdè Ilẹ̀ PolandiqUhyqX Ile ArmeniaqUhrqX Ede KroatiaqUhuqX Ede HungariaqUhiqX Ede HindiqUheqXHeberuqUuzqX Ede UzbekqUmlqXEde MalayalamiqUmnqX ara MangoliqUmkqX Ede MacedoniaqUurqXEde UrduqUmtqX Ede MaltaqUmsqX Ede MalayaqUmrqX Ede marathiqUugqXUighurqUafqX Ede AfrikaniqUswqX Ede SwahiliqUisqX Ede IcelandicqUamqX Ede AmharicqUitqXItalianiqUsvqX suwidiisiqUasqXTi AssamqUarqX Ede ArabiaqUkmqX CambodianqUzuqXEde ZuluqUiaqXEde pipoqUazqXEde AzerbaijaniqUieqXIru EdeqUidqX Ede IndonesiaqUnlqX Ede DutchqUnoqX Ede NorwayqUneqX Ede NepaliqUfrqXÈdè FaranséqUfyqX Ede FrisiaqUfaqX Ede PersiaqUfiqXFinisiqUkyqXKyrgyzqUfoqX Ede FaroesiqUkaqX Ede GeorgiaqUsrqX Ede SerbiaqUsqqX Ede AlbaniaqUkoqXKoreanqUknqX Ede KannadaqUsuqX Ede SudaniqUstqXSesotorUskrX Ede SlovakirUsirX Ede SinhaleserUshrXSerbo-CroatianirUsorX ara SomaliarUkur XKurdishr Uslr X Ede Sloveniar Usar Xede awon ara IndorUsdrXSindhiruU territoriesr}r(UTOrXTongarUBWrXBWrUNGrXNGruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X yyyy MMM dr h.X%(yyyy)s %(MMM)s %(d)sr!ubUfullr"h))r#}r$(h,XEEEE, yyyy MMMM ddr%h.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sr&ubUlongr'h))r(}r)(h,X yyyy MMMM dr*h.X%(yyyy)s %(MMMM)s %(d)sr+ubUshortr,h))r-}r.(h,Xyy/MM/ddr/h.X%(yy)s/%(MM)s/%(dd)sr0ubuUcurrency_symbolsr1}r2UNGNr3X₦r4sU time_zonesr5}r6U Etc/Unknownr7}r8Ucityr9XAfrica/​Lagos/​exemplarCityr:ssUscriptsr;}r<Uvariantsr=}r>Unumber_symbolsr?}r@Ucurrency_namesrA}rBj3XNairarCsUmonthsrD}rE(U stand-alonerF}rGUnarrowrH}rI(KX1rJKX2rKKX3rLKX4rMKX5rNKX6rOKX7rPKX8rQK X9rRK X10rSK X11rTK X12rUusUformatrV}rW(UwiderX}rY(KXOṣù Ṣẹ́rẹ́rZKXOṣù Èrèlèr[KXOṣù Ẹrẹ̀nàr\KX Oṣù Ìgbér]KXOṣù Ẹ̀bibir^KXOṣù Òkúdur_KXOṣù Agẹmọr`KX Oṣù ÒgúnraK X Oṣù OwewerbK XOṣù Ọ̀wàràrcK X Oṣù BélúrdK XOṣù Ọ̀pẹ̀reuU abbreviatedrf}rg(KXṢẹ́rẹ́rhKXÈrèlèriKX Ẹrẹ̀nàrjKXÌgbérkKX Ẹ̀bibirlKXÒkúdurmKX AgẹmọrnKXÒgúnroK XOwewerpK X Ọ̀wàràrqK XBélúrrK X Ọ̀pẹ̀rsuuuUcurrency_formatsrt}ruUdaysrv}rw(U stand-alonerx}ryUnarrowrz}r{(KjKKjLKjMKjNKjOKjPKjJusUformatr|}r}(Uwider~}r(KXỌjọ́ AjérKXỌjọ́ Ìsẹ́gunrKX Ọjọ́rúrKX#Ọjọ́ Àṣẹ̀ṣẹ̀dáiyérKXỌjọ́ ẸtìrKXỌjọ́ Àbámẹ́tarKXỌjọ́ ÀìkúruU abbreviatedr}r(KXAjérKX Ìsẹ́gunrKX Ọjọ́rúrKXÀṣẹ̀ṣẹ̀dáiyérKXẸtìrKX Àbámẹ́tarKXÀìkúruuuU meta_zonesr}rUerasr}r(Uwider}r(KX Saju KristirKX Lehin KristiruU abbreviatedr}r(KXSKrKXLKruuu.PK[{==(site-packages/babel/localedata/gu_IN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U weekend_startq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[A/(site-packages/babel/localedata/ar_DZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qUnativeZeroDigitq X0q sU week_dataq }q (Umin_daysq KU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}q U meta_zonesq!}q"Uvariantsq#}q$Ucurrency_namesq%}q&u.PK[.jiEiE%site-packages/babel/localedata/km.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1}, {0}qsUquartersq}qUformatq}q (Uwideq }q (KXត្រីមាសទី១q KXត្រីមាសទី២q KXត្រីមាសទី៣qKXត្រីមាសទី៤quU abbreviatedq}q(KXត្រី១qKXត្រី២qKXត្រី៣qKXត្រី៤quusUperiodsq}q(UamqXព្រឹកqUpmqXល្ងាចquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XH:mm:ssq-Uformatq.X%(H)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X8H ម៉ោង m នាទី ss វិនាទី​ vq3h.XH%(H)s ម៉ោង %(m)s នាទី %(ss)s វិនាទី​ %(v)sq4ubUlongq5h))q6}q7(h,X7H ម៉ោង m នាទី ss វិនាទី​zq8h.XG%(H)s ម៉ោង %(m)s នាទី %(ss)s វិនាទី​%(z)sq9ubUshortq:h))q;}q<(h,XH:mmq=h.X %(H)s:%(mm)sq>ubuU languagesq?}q@(UguqAX-ភាសាហ្កុយ៉ារាទីqBUgdqCX&ភាសាហ្កែលិគ [gd]qDUgaqEX!ភាសាហ្កែលិគqFUgnqGX'ភាសាហ្កួរ៉ានីqHUglqIX'ភាសាហ្កាលីស៉ីqJUlaqKXភាសាឡាតំាងqLUlnqMXលីនកាឡាqNUloqOXភាសាឡាវqPUttqQXភាសាតាតារqRUtrqSXភាសាទួរគីqTUlvqUX$ភាសាឡាតវីយ៉ាqVUtoqWX!ភាសាតុងហ្គោqXUltqYX'ភាសាលីទុយអានីqZUtkq[X0ភាសាទួគមេនីស្តង់q\Uthq]Xភាសាថៃq^Utiq_Xទីរិនយាq`UtgqaX9ភាសាតាដហ្ស៉ីគីស្តង់qbUteqcX$ភាសាតេលូហ្គូqdUfilqeXពីលីពីនqfUtaqgXភាសាតាមីលqhUyiqiX!ភាសាយីឌីហ្សqjUyoqkXភាសាយរូបាqlUdeqmX*ភាសាអាល្លឺម៉ង់qnUdaqoX$ភាសាដាណឺម៉ាកqpUdzqqXភាសាប៊ូតានqrUquqsX$ភាសាកេទ្ជូអាqtUelquXភាសាក្រិចqvUeoqwX3ភាសាអេស្ពេរ៉ាន្ទោqxUenqyX$ភាសាអង់គ្លេសqzUzhq{Xភាសាចិនq|Uzaq}Xភាសាចួងq~UeuqXភាសាបាស្កេqUetqX$ភាសាអេស្តូនីqUesqX$ភាសាអេស្ប៉ាញqUruqX'ភាសាรัរូស្ស៉ីqUrnqXភាសារូន្ឌីqUroqX!ភាសារូម៉ានីqUbnqX$ភាសាបេន្កាលីqUbeqX'ភាសាបេឡារុស្សqUbgqX*ភាសាប៊ុលហ្ការីqUukqX'ភាសាអ៊ុយក្រែនqUbmqX$ភាសាបាម្បារាqUjvqXភាសាយ៉ាវាqUboqXភាសាទីបេqUbhqXភាសាបិហារqUbrqXប្រីស្តុនqUbsqXប៊ូស្នៀរqUjaqXភាសាជប៉ុនqUocqXអូសីតាន់qUtwqX ទ្វីqUtlhqXខ្លិងសុនqUorqX!ភាសាអូរីយ៉ាqUxhqXភាសាឃសាqUcaqX!ភាសាកាតាឡានqUcyqX វេលqUcsqXភាសាឆេកqUpsqXបាស្តូqUptqX0ភាសាព័រទុយហ្កាល់qUpaqX'ភាសាពូនយ៉ាប៊ីqUviqXភាសាវៀតណាមqUplqXភាសាប៉ូឡូញqUhyqX!ភាសាអារមេនីqUhrqXក្រូអាទៀនqUhuqX!ភាសាហុងគ្រីqUhiqXភាសាហ៉ិនឌីqUheqXភាសាហេប្រិqUmgqX3ភាសាម៉ាដាហ្កាសការqUuzqX9ភាសាអ៊ូហ្សបេគីស្តង់qUmlqX-ភាសាម៉ាឡាឡាយ៉ានqUmoqX$ភាសាម៉ុលដាវីqUmnqX*ភាសាម៉ុងហ្គោលីqUmiqXភាសាម៉ោរីqUmkqX'ភាសាម៉ាសេដូនីqUurqX!ភាសាអ៊ូរ្ឌូqUmtqX!ភាសាម៉ាល់តាqUmsqX$ភាសាម៉ាលេស៉ីqUmrqX!ភាសាម៉ារាធីqUaaqX!ភាសាអាហ្វារqUaeqX'ភាសាអាវែស្តង់qUafqX3ភាសាអាហ្វ្រីកាអានqUswqX'ភាសាស្វាហ៉ីលីqUisqX$ភាសាអ៉ីស្លង់qUamqXអំហារិកqUitqX!ភាសាអ៊ីតាលីqUanqX*ភាសាអារ៉ាហ្គោនqUiaqXអីនធើលីងqUarqX!ភាសាអារ៉ាប់qUsuqX!ភាំសាស៊ូដង់qUzuqX!ភាសាហ្ស៉ូលូqUayqX$ភាសាអីម៉ារ៉ាqUazqX9ភាសាអាហ៊្សែរបែហ្សង់qUidqX*ភាសាឥណ្ឌូនេស៊ីqUnlqX!ភាសាហុល្លង់qUnnqXន័រវេqUnoqXភាសាន័រវែសqUneqX!ភាសានេប៉ាល់rUfrrXភាសាបារាំងrUsmrXភាសាសាមូអាrUfyrXហ្រីសង់rUsvrX!ភាសាស៊ុយអែដrUfar Xភឺសៀនr Ufir X'ភាសាហ្វាំងឡង់r Ufjr Xហ្វ៉ីហ្ស៉ីrUsarX'ភាសាសំស្ក្រឹតrUforXហ្វារូសrUkarX'ភាសាហ្សកហ្ស៉ីrUkkrX6ភាសាកាហ្សាក់ស្តង់់rUsrrXសើបៀនrUsqrX$ភាសាអាល់បានីrUkorXភាសាកូរ៉េrUknrXភាសាកិណាដាrUkmrXភាសាខ្មែរr Ustr!Xសេសូដូr"Uskr#X'ភាសាស្លូវ៉ាគីr$Usir%Xសីនហាលិសr&Ushr'X!សើបូក្រូទៀនr(Usor)X!ភាសាសូម៉ាលីr*Ukur+Xភាសាឃឺដr,Uslr-X'ភាសាស្លូវ៉ានីr.Ukyr/X0ភាសាគៀរហ្គីស្តង់r0Usdr1X!ភាសាស៉ីន្ដីr2uU territoriesr3}r4(UBDr5X$បង់ក្លាដេស្ហr6UBEr7Xបែលហ្ស៉ិកr8UBFr9X*ប៊ូរគីណាហ្វាសូr:UBGr;Xប៊ុលហ្គារីr<UBAr=Xបូស្ន៉ីr>UBBr?Xបារបាដូសr@UBNrAXប៊្រុយណេrBUBOrCXបូលីវីrDUBHrEXបារ៉ែនrFUBIrGXប៊ូរុនឌីrHUBJrIXបេណាំងrJUBTrKXប៊ូតានrLUJMrMX!ហ្សាម៉ាអ៉ិគrNUBWrOXបុតស្វាណាrPUWSrQXសាមូអាrRUBRrSXប្រេស៊ីលrTUBSrUXបាហាម៉ាrVUBYrWXបេឡារុស្សrXUBZrYXបេលីហ្សrZURUr[Xរូស្ស៊ីr\URWr]Xរវ៉ាន់ដាr^UTLr_X!ទីម័រខាងកើតr`UTMraX$ទួគមេនីស្តង់rbUTJrcX-តាដហ្ស៉ីគីស្តង់rdUROreXរូម៉ានីrfUGWrgX!ហ្គីណេប៊ីសូrhUGTriX!ហ្គាតេម៉ាឡាrjUGRrkXក្រិចrlUGQrmX-ហ្គីណេអេក្វាទ័រrnUJProXជប៉ុនrpUGYrqXហ្គីយ៉ាណាrrUGErsXហ្សកហ្ស៉ីrtUGAruXហ្គាបុងrvUGNrwXហ្គីណេrxUGMryXហ្គាំប៊ីrzUGHr{Xហ្កាណាr|UOMr}Xអូម៉ង់r~UTNrXទុយនេស៊ីrUJOrXហ៊្សកដានីrUHRrXក្រូអាស៊ីrUHTrX ហៃទីrUHUrXហុងគ្រីrUHKrXហុងកុងrUHNrXហុងឌួរ៉ាស់rUVErX$វេនេហ្ស៊ុយឡាrUPRrXព័រតូរីកូrUPSrXប៉ាលេស្ទីនrUPTrX$ព័រទុយហ្កាល់rUPYrX!ប៉ារ៉ាហ្គាយrUPArXប៉ាណាម៉ាrUPGrX6ប៉ាពូអានូវែលហ្គីណេrUPErXប៉េរូrUPKrXប៉ាគីស្ថានrUPHrXហ្វ៉ីលីពីនrUPLrXប៉ូលូញrUZMrXហ្សាំប៊ីrUEHrX'សាហារ៉ាខាងលិចrUEErXអេស្តូនីrUEGrXអេហ្ស៉ីបrUZArX3អាហ្វ្រិកខាងត្បូងrUECrXអេក្វាឌ័រrUITrXអ៊ីតាលីrUVNrXវៀតណាមrUETrXអេត្យូពីrUSOrXសូម៉ាលីrUZWrX$ហ្ស៊ីមបាបវ៉េrUESrXអេស្ប៉ាញrUERrXអេរីទ្រាrUMDrX6សាធារណរដ្ឋម៉ុលដាវីrUMGrX*ម៉ាដាហ្កាស្ការrUMArXម៉ារ៉ុកrUMCrXម៉ូណាកូrUUZrX-អ៊ូហ្សបេគីស្តង់rUMMrXមីយ៉ាន់ម៉ាrUMLrXម៉ាលីrUMNrXម៉ុងហ្គោលីrUMKrXម៉ាសេដនrUMUrXម៉ូរីទុសrUMTrXម៉ាល់តាrUMRrXម៉ូរីតានីrUUGrXអ៊ូហ្កង់ដាrUMYrXម៉ាលេស៉ីrUMXrXម៉ិចសិកrUILrXអ៊ីស្រាអែលrUFRrXបារាំងrUFIrXហ្វាំងឡង់rUFJrXហ្វ៉ីហ្ស៉ីrUFMrX!មិក្រូនេស៊ីrUNIrX$នីការ៉ាហ្គ័រrUNLrXហូល្លង់rUNOrXន័រវែសrUNArXណាមីប៊ីrUNErXនីហ្សេរrUNGrX!នីហ្សេរីយ៉ាrUNZrX$នូវែលហ្សេឡង់rUNPrXនេប៉ាល់rUCIrXកូដឌីវ័រrUCHrXស្វីសrUCOrXកូឡុំប៊ីrUCNrX ចិនrUCMrXកាមេរូនrUCLrX ឈីលីrUCArXកាណាដាrUCGrXកុងហ្គោrUCFrXKសាធារណរដ្ឋអាហ្វ្រិកកណ្ដាលrUCZrX'សាធារណរដ្ឋឆេកrUCYr Xស៉ីពរ៍r UCRr Xកូស្តារីកាr UCVr XកាបវែរrUCUrXគុយបាrUSZrXសូហ្ស៉ីឡង់rUSYrXស៊ីរីrUKGrX$គៀរហ្គីស្តង់rUKErXកេនយ៉ាrUSRrXសូរីណាមrUKIrXគិរិបាទីrUKHrXកម្ពុជាrUSVrX'អែលសាល់វ៉ាឌ័រr UKMr!Xកុំម៉ូរ៉ូសr"USKr#Xស្លូវ៉ាគីr$UKRr%X-សាធារណរដ្ឋកូរ៉េr&USIr'Xស្លូវេនីr(UKPr)Xrសាធារណរដ្ឋប្រជាធិបតេយ្យប្រជាមានិតកូរ៉េr*UKWr+Xគុយវ៉ែតr,USNr-Xសេនេហ្កាល់r.USLr/Xសេរ៉ាឡេអូនr0USCr1Xសីសែលr2UKZr3X-កាហ្សាក់ស្តាង់់r4USAr5X0អារ៉ាប៊ីសាអ៊ូឌីតr6USGr7Xសិង្ហបុរីr8USEr9Xស៊ុយអែដr:USDr;Xស៊ូដង់r<UDOr=X9សាធារណរដ្ឋដូមីនីកែនr>UDMr?Xដូមីនីកាr@UDJrAXហ្ស៉ីបូទីrBUDKrCXដាណឺម៉ាកrDUDErEXអាល្លឺម៉ង់rFUYErGXយេមែនrHUDZrIXអាល់ហ្សេរីrJUUSrKX'សហរដ្ឋអាមេរិកrLUUYrMX$អ៊ុយរុយហ្គាយrNULBrOXលីបង់rPULArQX ឡាវrRUTWrSXតៃវ៉ាន់rTUTTrUX<ទ្រីនីដាដនឹងតូបាហ្គោrVUTRrWXទួរគីrXULKrYXស្រីលង្កាrZULIr[X!លិចទេនស្តែនr\ULVr]Xឡាតវីយ៉ាr^UTOr_Xតុងហ្គាr`ULTraXលីទុយអានីrbULUrcXលុចហ្សំបួរrdULRreXលីបេរីយ៉ាrfULSrgXលើសូតូrhUTHriXថៃrjUTGrkXតូហ្គូrlUTDrmX ឆាដrnULYroXលីប៊ីrpUVArqXវ៉ាទីកង់rrUAErsX6អេមីរ៉ែទអារ៉ាប់រួមrtUADruXអានដូរ៉ាrvUAFrwX0អាហ្វហ្គានីស្ថានrxUIQryXអ៊ីរ៉ាក់rzUISr{Xអ៉ីស្លង់r|UIRr}Xអ៊ីរ៉ង់r~UAMrXអារមេនីrUALrXអាល់បានីrUAOrXអង់ហ្គោឡាrUARrXអាហ្សង់ទីនrUAUrXអូស្ត្រាលីrUATrXអូទ្រីសrUINrXឥណ្ឌាrUTZrXតង់ហ្សានីrUAZrX-អាហ៊្សែរបែហ្សង់rUIErXអៀរឡង់rUIDrXឥណ្ឌូនេស៊ីrUUArXអ៊ុយក្រែនrUQArXកាតារrUMZrX$ម៉ូហ្សាំប៊ិកruUdecimal_formatsr}rU date_formatsr}r(Umediumrh))r}r(h,X d MMM yyyyrh.X%(d)s %(MMM)s %(yyyy)srubUfullrh))r}r(h,X5EEEE ថ្ងៃ d ខែ MMMM ឆ្នាំ yyyyrh.XE%(EEEE)s ថ្ងៃ %(d)s ខែ %(MMMM)s ឆ្នាំ %(yyyy)srubUlongrh))r}r(h,X#d ខែ MMMM ឆ្នាំ yyyyrh.X/%(d)s ខែ %(MMMM)s ឆ្នាំ %(yyyy)srubUshortrh))r}r(h,Xd/M/yyyyrh.X%(d)s/%(M)s/%(yyyy)srubuUcurrency_symbolsr}rUKHRrX៛rsU time_zonesr}rUscriptsr}rUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}rjXRielrsUmonthsr}r(U stand-aloner}rUnarrowr}r(KX1rKX2rKX3rKX4rKX5rKX6rKX7rKX8rK X9rK X10rK X11rK X12rusUformatr}r(Uwider}r(KX មករាrKXកុម្ភៈrKX មិនាrKX មេសាrKX ឧសភាrKXមិថុនាrKXកក្កដាrKX សីហាrK Xកញ្ញាrK X តុលាrK Xវិច្ឆិកាrK X ធ្នូruU abbreviatedr}r(KX១rKX២rKX៣rKX៤rKX៥rKX៦rKX៧rKX៨rK X៩rK X១០rK X១១rK X១២ruuuUcurrency_formatsr}rNcbabel.numbers NumberPattern r)r}r(Uexp_precrNUscalerKU frac_precrKKrUsuffixrX¤rjrUint_precrKKrh,X #,##0.00¤rUprefixrXrX-rrUexp_plusr NUgroupingr KKr ubsUdaysr }r (U stand-aloner}rUnarrowr}r(KjKjKjKjKjKjKjusUformatr}r(Uwider}r(KX​ថ្ងៃច័ន្ទrKXថ្ងៃអង្គារrKXថ្ងៃពុធrKX*ថ្ងៃព្រហស្បតិ៍rKXថ្ងៃសុក្រrKXថ្ងៃសៅរ៍rKX!ថ្ងៃអាទិត្យruU abbreviatedr}r(KXចrKXអr KXពុr!KX ព្រr"KXសុr#KXសr$KXអាr%uuuU meta_zonesr&}r'Uerasr(}r)(Uwider*}r+(KX0មុន​គ្រិស្តសករាជr,KX$គ្រិស្តសករាជr-uU abbreviatedr.}r/(KXមុន​គ.ស.r0KXគ.ស.r1uuu.PK[Rll*site-packages/babel/localedata/mn_Mong.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll-site-packages/babel/localedata/ha_Arab_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[A/(site-packages/babel/localedata/ar_MA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qUnativeZeroDigitq X0q sU week_dataq }q (Umin_daysq KU weekend_startqKU first_dayqKU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUItalqX#اللأيطالية القديمةqsUdecimal_formatsq}q U meta_zonesq!}q"Uvariantsq#}q$Ucurrency_namesq%}q&u.PK[(site-packages/babel/localedata/en_BW.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Ufullqcbabel.dates DateTimePattern q)q}q (Upatternq!XEEEE dd MMMM yyyyq"Uformatq#X!%(EEEE)s %(dd)s %(MMMM)s %(yyyy)sq$ubUlongq%h)q&}q'(h!X dd MMMM yyyyq(h#X%(dd)s %(MMMM)s %(yyyy)sq)ubUshortq*h)q+}q,(h!Xdd/MM/yyq-h#X%(dd)s/%(MM)s/%(yy)sq.ubuUcurrency_symbolsq/}q0UXXXq1XXXXq2sU time_zonesq3}q4Uscriptsq5}q6Uvariantsq7}q8Unumber_symbolsq9}q:Ucurrency_namesq;}qUcurrency_formatsq?}q@Ncbabel.numbers NumberPattern qA)qB}qC(Uexp_precqDNUscaleqEKU frac_precqFKKqGUsuffixqHXqIhIqJUint_precqKKKqLh!X ¤#,##0.00qMUprefixqNX¤qOX-¤qPqQUexp_plusqRNUgroupingqSKKqTubsUdaysqU}qVU meta_zonesqW}qXUerasqY}qZu.PK[99-site-packages/babel/localedata/zh_Hans_CN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll)site-packages/babel/localedata/kpe_LR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99-site-packages/babel/localedata/zh_Hant_TW.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[Rll(site-packages/babel/localedata/lv_LV.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[_.ll(site-packages/babel/localedata/en_MP.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[Rll(site-packages/babel/localedata/ss_SZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK["ll)site-packages/babel/localedata/gez_ER.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[˟HH(site-packages/babel/localedata/en_NA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqhqUint_precqKKqUpatternqX ¤#,##0.00q Uprefixq!X¤q"X-¤q#q$Uexp_plusq%NUgroupingq&KKq'ubsU languagesq(}q)U territoriesq*}q+U time_zonesq,}q-Uscriptsq.}q/Udecimal_formatsq0}q1U meta_zonesq2}q3Uvariantsq4}q5Ucurrency_namesq6}q7u.PK[3$""(site-packages/babel/localedata/es_UY.datnu[}q(Ucurrency_symbolsq}qUUYUqX$UqsUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq }q U week_dataq }q U zone_formatsq }qUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqXqX)qqUint_precqKKqUpatternqX ¤ #,##0.00qUprefixq X¤ q!X(¤ q"q#Uexp_plusq$NUgroupingq%KKq&ubsU languagesq'}q(U territoriesq)}q*U time_zonesq+}q,Uscriptsq-}q.Udecimal_formatsq/}q0U meta_zonesq1}q2Uvariantsq3}q4Ucurrency_namesq5}q6u.PK[D))(site-packages/babel/localedata/sr_BA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[D))(site-packages/babel/localedata/my_MM.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[99(site-packages/babel/localedata/ko_KR.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[1ll(site-packages/babel/localedata/it_IT.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[^<;R__*site-packages/babel/localedata/ku_Latn.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUformatq}q(Uwideq }q (KXÇ1q KXÇ2q KXÇ3q KXÇ4quU abbreviatedq}q(KXÇ1qKXÇ2qKXÇ3qKXÇ4quusUperiodsq}q(UamqXBNqUpmqXPNquUscientific_formatsq}qUpercent_formatsq}qU week_dataq}q (Umin_daysq!KU weekend_startq"KU first_dayq#KU weekend_endq$KuU time_formatsq%}q&U languagesq'}q((Uarq)Xerebîq*Uenq+X îngilîzîq,Ujaq-Xjaponîq.Ukuq/Xkurdîq0uU territoriesq1}q2(U001q3XCîhanq4UTRq5XTirkiyeq6uUdecimal_formatsq7}q8U date_formatsq9}q:Ushortq;cbabel.dates DateTimePattern q<)q=}q>(Upatternq?Xyy/MM/ddq@UformatqAX%(yy)s/%(MM)s/%(dd)sqBubsUcurrency_symbolsqC}qDU time_zonesqE}qFUscriptsqG}qHUArabqIXerebîqJsUvariantsqK}qLUnumber_symbolsqM}qNUcurrency_namesqO}qPUmonthsqQ}qR(U stand-aloneqS}qTUnarrowqU}qV(KXçqWKXsqXKXaqYKXnqZKXgq[KXhq\usUformatq]}q^(Uwideq_}q`(KXçileqaKXsibatqbKXadarqcKXnîsanqdKXgulanqeKXhezîranqfuU abbreviatedqg}qh(KXçilqiKXsibqjKXadrqkKXnîsqlKXgulqmKXhezqnKXtîrqouuuUcurrency_formatsqp}qqUdaysqr}qs(U stand-aloneqt}quUnarrowqv}qw(KXdqxKhXKXçqyKXpqzKXîq{KXşq|KXyq}usUformatq~}q(Uwideq}q(KXduşemqKXşêqKXçarşemqKX pêncşemqKXînqKXşemîqKXyekşemquU abbreviatedq}q(KXdşqKXsşqKXçşqKXpşqKXînqKXşqKXyşquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBZqKXPZqusu.PK[Rll(site-packages/babel/localedata/kk_KZ.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[D))(site-packages/babel/localedata/sr_ME.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U zone_formatsq }q Ucurrency_formatsq }qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll)site-packages/babel/localedata/kcg_NG.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[99-site-packages/babel/localedata/mn_Cyrl_MN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q U first_dayq KsU zone_formatsq }q Ucurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}qUcurrency_namesq}qu.PK[_.ll(site-packages/babel/localedata/en_MH.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[88%site-packages/babel/localedata/he.datnu[}q(U zone_formatsq}qUregionqX שעון %sqsUdatetime_formatsq}qNX{1} {0}qsUquartersq}q (U stand-aloneq }q Unarrowq }q (KX1qKX2qKX3qKX4qusUformatq}q(Uwideq}q(KX רבעון 1qKX רבעון 2qKX רבעון 3qKX רבעון 4quU abbreviatedq}q(KX רבעון 1qKX רבעון 2qKX רבעון 3qKX רבעון 4quuuUperiodsq }q!(Uamq"X לפנה"צq#Upmq$X אחה"צq%uUscientific_formatsq&}q'Ncbabel.numbers NumberPattern q()q)}q*(Uexp_precq+KKq,Uscaleq-KU frac_precq.KKq/Usuffixq0Xq1h1q2Uint_precq3KKq4Upatternq5X#E0q6Uprefixq7h1X-q8q9Uexp_plusq:Ugroupingq;MMqNh()q?}q@(h+Nh-Kdh.KKqAh0X%qBhBqCh3KKqDh5X#,##0%qEh7h1h8qFh:Nh;KKqGubsU week_dataqH}qI(Umin_daysqJKU weekend_startqKKU first_dayqLKU weekend_endqMKuU time_formatsqN}qO(UmediumqPcbabel.dates DateTimePattern qQ)qR}qS(h5XHH:mm:ssqTUformatqUX%(HH)s:%(mm)s:%(ss)sqVubUfullqWhQ)qX}qY(h5X HH:mm:ss vqZhUX%(HH)s:%(mm)s:%(ss)s %(v)sq[ubUlongq\hQ)q]}q^(h5X HH:mm:ss zq_hUX%(HH)s:%(mm)s:%(ss)s %(z)sq`ubUshortqahQ)qb}qc(h5XHH:mmqdhUX %(HH)s:%(mm)sqeubuU languagesqf}qg(Uzh_HantqhXסינית מסורתיתqiUgvqjX מאניתqkUguqlXגוג'ראטיתqmUscnqnXסיציליאניתqoUnl_BEqpX פלמיתqqUromqrXרומאניתqsUukqtXאוקראיניתquUalgqvXalgqwUugaqxXאוגריתיתqyUaleqzXaleq{Uzenq|X זנאגהq}Uscoq~X סקוטיתqUenmqXאנגלית תיכונהqUmniqXמניפוריתqUgdqXסקוטית גאליתqUgaqX איריתqUnwcqXנווארית קלאסיתqUes_419qX)ספרדית לטינו־אמריקאיתqUgnqX גוארניqUglqXגליציאניתqUmkqXמקדוניתqUlgqXlgqUhaqX האוסהqUcusqXcusqUfiuqXfiuqUlnqXלינגאלהqUloqXלאוqUttqX טטריתqUrajqX ראג'סטןqUtrqX טורקיתqUadyqX אדיגיתqUbynqXbynqUausqXשפות אוסטרליותqUpeoqXפרסית עתיקהqUtkqXטורקמניתqUthqXתאיqUadaqXadaqUsuqX סודניתqUteqX טלוגוqUfilqXפיליפיניתqUgrcqXיוונית עתיקהqUbinqXbinqUmgaqXאירית תיכונהqUhitqX חיתיתqUbikqXbikqUpt_BRqX#פורטוגזית ברזילאיתqUdyuqXdyuqUcelqX קלטיתqUcrpqXcrpqUfatqXfatqUdaqXדניתqUjaqX יפניתqUdzqX דזונקהqUdarqXdarqUiraqXאיראניתqUdvqX דיבהיqUdayqXdayqUgemqXגרמאנית אחרתqUbatqXbatqUtlqX טגלוגqUbasqXbasqUgbaqXgbaqUknqX קאנאדהqUcmcqXcmcqUbadqXbadqUlvqX לטביתqUbanqXבלינזיתqUbalqX באלוצ'יqUnlqXהולנדיתqUbaiqXbaiqUarpqXarpqUelqX יווניתqUeoqXאספרנטוqUenqX אנגליתqUartqX שפה מלאכותית אחרתqUarwqXarwqUeerXeerUkmrX קמריתrUzh_HansrXסינית (מפושטת)rUsgnrXשפת סימניםrUmasrX מאסאיתr Usgar Xאירית עתיקהr Uarcr X ארמיתr Uen_USrXאנגלית אמריקניתrUeurX בסקיתrUetrXאסטוניתrUsemrXשפה שמיתrUurrX אורדוrUnubrXשפות נבטיותrUbtkrXbtkrUphnrX פניקיתrUrurX רוסיתrUgonr X גונדיr!Umusr"Xmusr#Ultr$X ליטאיתr%Ucur&X(סלאבית כנסייתית עתיקהr'Ude_ATr(Xגרמנית אוסטריתr)Ugotr*X גותיתr+Ufonr,Xfonr-Uror.X רומניתr/Ujvr0Xג'אווהניתr1Usuxr2X שומריתr3Ugorr4Xgorr5Uber6Xבלארוסיתr7Ubgr8Xבולגריתr9Umyvr:Xmyvr;Ubar<Xבשקיריתr=Uastr>Xאסטוריתr?Uwor@X ג'ולוףrAUbmrBXbmrCUbnrDX בנגליתrEUborFX טיבטיתrGUbhrHX ביהאריrIUbirJX ביסלמהrKUtarLX טמיליתrMUuzrNXאוזבקיתrOUbrrPXברטוניתrQUbsrRX בוסניתrSUlbrTXלוקסמבורגיתrUUruprVXארומניתrWUcrhrXXטטרית של קריםrYUcoprZX קופטיתr[Uzapr\X זאפוטקr]Umsr^X מאלזיתr_Uacer`XaceraUsyrrbX סוריתrcUachrdXachreUocrfXאוקסיטניתrgUsorhX סומליתriUathrjXathrkUakkrlX אכדיתrmUmaprnXאוסטרונזיתroUundrpX)שפה לא ידועה או לא תקפהrqUzblrrXzblrsUtwrtXטוויruUdrarvXdrarwUndsrxXגרמנית תחתיתryUtlhrzXקלינגוניתr{Uorr|X אוריהr}Utyr~X טהיטיתrUxhrX קוהסהrUchrXchrUcorXקורסיקאיתrUjrbrXעברית-ערביתrUcarXקטלוניתrUcerX צ'צ'ניתrUyaprX יאפזיתrUsmrX סמואיתrUcyrX וולשיתrUangrXאנגלית עתיקהrUmlrXמלאיאלםrUfrmrXצרפתית תיכונהrUfirX פיניתrUcsrX צ׳כיתrUcrrXcrrUaparXשפות אפצ'יותrUcvrXcvrUbrarXbrarUfrsrXfrsrUchbrXchbrUdumrXהולנדית תיכונהrUptrXפורטוגזיתrUchgrXצ'אגאטאיrUduarXduarUchkrXchkrUfrorXצרפתית עתיקהrUelxrX עילמיתrUchnrXchnrUchorXchorUchprXchprUchrrXצ'ירוקיתrUparXפונג'אביתrUswrXסווהיליתrUfr_CArXצרפתית קנדיתrUvirXויאטנמיתrUchyrXchyrUes_ESrXספרדית איבריתrUgilrXgilrUisrXאיסלנדיתrUen_GBrXאנגלית בריטיתrUzhrX סיניתrUhyrX ארמניתrUsidrX סידמוrUgayrXgayrUhrrXקרואטיתrUotarXטורקית עותומניתrUtirXטיגרינאיתrUkarXגרוזיניתrUhtrX האיטיתrUhurXהונגריתrUsamrXארמית שומרוניתrUhirX הינדיתrUhorXהארי מוטוrUzxxrXללא תוכן לשוניrUtutrXtutrUbuarXbuarUbugrXbugrUgaarXgaarUherX עבריתrUbejrXבז'הrUmgrX מלגשיתrUfurrXfurrUbemrXbemrUmagrXמאגאהיתrUcarrXcarrUmorXמולדביתrUmnrXמונגוליתrUmirX מאוריתrUcaurXקווקזית אחרתr Usmir X שפות סאמיות אחרותr Umtr X מלטזיתr UcairX5אינדיאנית מרכז אמריקאית אחרתrUainrXאינוrUdelrX דלאוורrUplrX פולניתrUdenrX סלאביתrUmrrX מארתיתrUberrX ברבריתrUinhrXאינגושיתrUugrXאויגהורrUhawr X הוואיתr!Umyr"Xבורמזיתr#Uslar$Xשפה סלאביתr%Ucadr&Xקאדוr'Uaar(Xאתיופיתr)Uesr*X ספרדיתr+Usair,X3שפה אינדיאנית דרום אמריקאיתr-Uabr.X אבחזיתr/Uaer0X אבסטןr1Ubhor2Xbhor3Uafr4Xאפריקאנסr5Uner6X נפאליתr7Uakr8Xאקאןr9Umynr:Xמאיהr;Uamr<X אמהריתr=Uitr>Xאיטלקיתr?Uanr@XanrAUiarBXאינטרלינגוהrCUasrDX אסאמיתrEUarrFX ערביתrGUanprHXanprIUekarJXekarKUiorLXאידוrMUavrNXavrOUayrPXאיימאריתrQUinerRX"אינדו-אירופית אחרתrSUen_CArTXאנגלית קנדיתrUUazrVX אזריתrWUierXXאינטרלינגואהrYUidrZXאינדונזיתr[Ucebr\X קבואנוr]Uskr^Xסלובקיתr_Ujprr`Xעברית-פרסיתraUafhrbXאפריהיליrcUyordX יורובהreUnnrfX(נורבגית חדשה - נינורשקrgUnorhXנורווגיתriUnarjX נאוריתrkUnahrlXנאהואטלrmUnairnX5אינדיאנית צפון אמריקאית אחרתroUafarpX אפרו-אסיאתית (אחר)rqUen_AUrrXאנגלית אוסטרליתrsUphirtXפיליפינית אחרתruUefirvXefirwUnaprxXנפוליטניתryUshrzXסרבו-קרואטיתr{Ugrbr|Xgrbr}Uarnr~XarnrUgezrXגעזrUzurXזולוrUbntrXבנטוrUmisrXשפה שונהrUsatrX סאנטליrUyirX יידישrUnvrXנבחוrUsycrXsycrUkabrX קבילהrUfrrX צרפתיתrUderX גרמניתrUlarX לטיניתrUdinrXdinrUladrX לדינוrUfyrX פריזיתrUsvrX שוודיתrUpsrX פאשטוrUdgrrXdgrrUfarX פרסיתrUrwrXקיניהרואנדהrUffrXffrUfr_CHrXצרפתית שוויצריתrUmairXמאיטיליתrUeworXeworUfjrX פיג'יתrUdakrX דקוטהrUsarXסנסקריטrUawarXאוואדיתrUforXפארואזיתrUegyrXמצרית עתיקהrUdoirX דוגריrUgswrXגרמנית שוויצריתrUkkrX קזחיתrUsrrX סרביתrUsqrX אלבניתrUsitrXשפה סינו־טיבטיתrUkorXקוריאניתrUcperXcperUcpfrXcpfrUstrX ססות'וrUksrXקשמיריתrUsirX סינהלהrUmulrXמספר שפותrUkwrX קורניתrUcchrXcchrUkurX כורדיתrUslrXסלובניתrUscrXסרדיניתrUfanrXfanrUkyrXקירגיזיתrUnbrX-נורבגית שפה הספר - בוקמולrUsdrXסינדהיתruU territoriesr}r(UBDrX בנגלדשrUBErX בלגיהrUBFrXבורקינה פאסוrUBGrXבולגריהrUVErXונצואלהrUBArX!בוסניה והרצגובינהrUBBrX ברבדוסrUWFrX איי ווליס ופוטונהrUBLrXסנט ברתולומיאוrUBMrX ברמודהrUBNrX ברונייrUBOrXבוליביהrUBHrX בחרייןrUBIrXבורונדיrUBJrXבניןrUBTrX בהוטןr U011r Xמערב אפריקהr UBVr Xאיי בובהr UBWrXבוטסוואנהrU014rXמזרח אפריקהrU015rXצפון אפריקהrUBRrX ברזילrU017rXמרכז אפריקהrU018rXדרום יבשת אפריקהrU019rX אמריקהrUBYrX בלארוסrUBZrXבליזrULVr X לטביהr!URWr"X רואנדהr#URSr$X סרביהr%UTLr&Xמזרח טימורr'UREr(Xראוניוןr)UTMr*Xטורקמניסטןr+UOMr,X עומאןr-UTJr.Xטג׳יקיסטןr/UROr0X רומניהr1UTKr2X טוקלאוr3UGWr4Xגיניאה-ביסאוr5UGUr6Xגואםr7UGTr8Xגווטמלהr9UGSr:XJג׳ורג׳יה הדרומית ואיי סנדוויץ׳ הדרומייםr;UGRr<Xיווןr=UGQr>Xגיניאה המשווניתr?UGPr@XגוואדלופrAUJPrBXיפןrCUKIrDXקיריבאטיrEUGYrFX גיאנהrGUGGrHX גרנסיrIUGFrJXגיאנה הצרפתיתrKUGErLXגאורגיהrMUGDrNX גרנדהrOU021rPXאמריקה הצפוניתrQUGBrRXבריטניהrSUGArTX גאבוןrUUSVrVXאל סלבדורrWUGNrXX גיניאהrYUGMrZX גמביהr[UGLr\Xגרינלנדr]U029r^Xקריבייםr_UGIr`XגיברלטרraUGHrbXגאנהrcUJErdX ג'רסיreUTNrfXתוניסיהrgUJMrhXג׳מייקהriU013rjXמרכז אמריקהrkUWSrlX סמואהrmU419rnX.אמריקה הלטינית והקריבייםroUHRrpXקרואטיהrqUBSrrXאיי באהאמהrsUHTrtX האיטיruUHUrvXהונגריהrwUHKrxX$הונג קונג S.A.R. של סיןryU039rzXדרום אירופהr{UHNr|Xהונדורסr}UFIr~X פינלנדrU142rXאסיהrU030rXמזרח אסיהrU034rXדרום אסיהrU035rXדרום-מזרח אסיהrUPRrXפורטו ריקוrUPSrXהרשות הפלשתיניתrU830rXאיי התעלהrUFKrXאיי פוקלנדrUIOrX;טריטוריה בריטית באוקיאנוס ההודיrUPWrX פאלאוrUPTrXפורטוגלrUSJrX&סוולבארד וז׳אן מאייןrUMDrXמולדובהrUFMrXמיקרונזיהrUIQrXעירקrUPArXפנמהrUPFrXפולינזיה הצרפתיתrUPGrX"פפואה גיניאה החדשהrUPErXפרוrUPKrX פקיסטןrUPHrXפיליפיניםrUFOrXאיי פארוrUPNrX פיטקרןrUPLrX פוליןrUPMrXסנט פייר ומיקלוןrUZMrX זמביהrUEHrXסהרה המערביתrURUrX רוסיהrUEErXאסטוניהrUEGrX מצריםrUZArXדרום אפריקהrUECrXאקוודורrUITrX איטליהrUVNrXוייטנאםrUZZrX)איזור לא ידוע או לא תקףrUSBrXאיי שלמהrUETrXאתיופיהrUSOrX סומליהrUZWrXזימבאבווהrUSArXערב הסעודיתrUESrXספרדrUERrXאריתראהrUMErXמונטנגרוrUAQrXאנטארקטיקהrUMGrX מדגסקרrUMFrXסנט מרטיןrUMArX מרוקוrUMCrX מונקוrUUZrXאוזבקיסטןrUMMrXמייאנמארrUMLrXמאליrUMOrXמקאו S.A.R. של סיןrUMNrXמונגוליהrUHMrX'איי הרד ואיי מקדונלנדrUASrXסמואה האמריקניתrUMKrXמקדוניהrUMUrXמאוריציוסrUMTrXמלטהrUMWrX מלאוויrUMVrXמלדיביםrUMQrXמרטיניקrUMPrX$איי מריאנה הצפונייםrUMSrXמונסראטrUMRrXמאוריטניהrUIMrX האי מאןrUUGrX אוגנדהrUTZrX טנזניהrUMYrX מלזיהrUMXrX מקסיקוr UILr X ישראלr UFRr Xצרפתr UAWrX ארובהrUDOrX)הרפובליקה הדומיניקניתrUSHrXסנט הלנהrUVCrX(סנט וינסנט והגרנדיניםrU054rX מלנסיהrUDJrXג׳יבוטיrUFJrX פיג׳יrU057rXהאיזור המיקרונזיrU172rX&חבר המדינות העצמאיותrU053r X$אוסטרליה וניו-זילנדr!UNIr"Xניקרגואהr#UNLr$X הולנדr%UNOr&Xנורווגיהr'UNAr(X נמיביהr)UVUr*X ונואטוr+UNCr,Xקלדוניה החדשהr-UNEr.X ניז׳רr/UNFr0Xאיי נורפוקr1UNGr2X ניגריהr3UNZr4Xניו זילנדr5UNPr6Xנפאלr7UNRr8X נאורוr9UNUr:X ניווהr;U061r<Xפולינזיהr=UCIr>Xחוף השנהבr?UCHr@X שווייץrAUCOrBXקולומביהrCUCNrDXסיןrEUCMrFX קמרוןrGUCLrHX צ׳ילהrIUCCrJXאיי קוקוסrKUCArLXקנדהrMUCGrNX קונגוrOUCFrPX-הרפובליקה של מרכז אפריקהrQUCDrRX5הרפובליקה הדמוקרטית של קונגוrSUCZrTX צ׳כיהrUUCYrVXקפריסיןrWUCXrXXאיי כריסטמסrYUCSrZXסרביה ומונטנגרוr[UCRr\Xקוסטה ריקהr]UPYr^Xפרגוואיr_UCVr`X כף ורדהraUCUrbXקובהrcUSZrdXסווזילנדreUSYrfX סוריהrgUKGrhXקירגיזסטןriUKErjXקניהrkUSRrlX סורינםrmU143rnXמרכז אסיהroUKHrpXקמבודיהrqUKNrrXסנט קיטס ונוויסrsUKMrtXקומורוסruUSTrvX"סאו טומה ופרינסיפהrwUSKrxXסלובקיהryUKRrzXדרום קוריאהr{USIr|Xסלובניהr}UKPr~Xצפון קוריאהrUKWrX כוויתrUSNrXסנגלrUSMrXסן מרינוrUSLrXסיירה לאונהrUSCrXאיי סיישלrUKZrX קזחסטןrUKYrXאיי קיימןrUSGrXסינגפורrUSErX שוודיהrUSDrXסודןrU151rXמזרח אירופהrU150rX אירופהrUDMrXדומיניקהrU155rXמערב אירופהrU154rXצפון אירופהrUVGrX$איי הבתולה הבריטייםrUDErX גרמניהrUYErXתימןrUMHrXאיי מרשלrU062rXדרום-מרכז אסיהrUDZrXאלג׳יריהrUUSrXארצות הבריתrUUYrXאורוגוואיrUYTrX מאיוטrUUMrX4איים קטנים שלחוף ארצות הבריתrULBrX לבנוןrULCrXסנט לוסיהrULArXלאוסrUTVrX טובלוrUTWrXטייוואןrUTTrXטרינידד וטובגוrUTRrX טורקיהrULKrXסרי לנקהrULIrXליכטנשטייןrUCKrX איי קוקrUTOrX טונגהrULTrXליטאrULUrXלוקסמבורגrULRrX ליבריהrULSrX לסוטוrUTHrX תאילנדrUTFrX/טריטוריות דרומיות של צרפתrUTGrXטוגוrUTDrXצ׳אדrUTCrX איי טורקס וקאיקוסrULYrXלובrUVArX ותיקןrU145rXמערב אסיהrUAErX,איחוד האמירויות הערביותrUADrX אנדורהrUAGrXאנטיגואה וברבודהrUAFrXאפגניסטןrUAIrX אנגילהrUVIrX(איי הבתולה האמריקנייםrUISrX איסלנדrUIRrX איראןrUAMrX ארמניהrUALrX אלבניהrUAOrX אנגולהrUANrXאנטילים הולנדייםrU003rXצפון אמריקהrU002rX אפריקהrU001rX העולםrUARrXארגנטינהrUAUrXאוסטרליהrUATrXאוסטריהrU005rXדרום אמריקהrUINrXהודוrUAXrXאיי אלנדr U009r Xאוקיאניהr UAZr Xאזרביג'ןr UIErX אירלנדrUIDrXאינדונזיהrUJOrXירדןrUQUrXהאיחוד האירופיrUUArXאוקראינהrUQArXקטרrUDKrX דנמרקrUMZrXמוזמביקrUQOrXQOruUdecimal_formatsr }r!Nh()r"}r#(h+Nh-Kh.KKr$h0h1h1r%h3KKr&h5X #,##0.###r'h7h1h8r(h:Nh;KKr)ubsU date_formatsr*}r+(Umediumr,hQ)r-}r.(h5X dd/MM/yyyyr/hUX%(dd)s/%(MM)s/%(yyyy)sr0ubUfullr1hQ)r2}r3(h5XEEEE d MMMM yyyyr4hUX %(EEEE)s %(d)s %(MMMM)s %(yyyy)sr5ubUlongr6hQ)r7}r8(h5X d MMMM yyyyr9hUX%(d)s %(MMMM)s %(yyyy)sr:ubUshortr;hQ)r<}r=(h5Xdd/MM/yyr>hUX%(dd)s/%(MM)s/%(yy)sr?ubuUcurrency_symbolsr@}rAUILSrBX₪rCsU time_zonesrD}rE(UAtlantic/CanaryrF}rGUcityrHXאטלנטי/קנריrIsUAntarctica/MawsonrJ}rKjHX מאוסוןrLsU Europe/ParisrM}rNjHXפריסrOsUAmerica/Buenos_AiresrP}rQjHXבואנוס איירסrRsUAustralia/MelbournerS}rTjHXאוסטרליה/מלבורןrUsUAmerica/MiquelonrV}rWjHX מיקלוןrXsU Africa/MaserurY}rZjHX מאסרוr[sUAfrica/Tripolir\}r]jHXטריפוליr^sUPacific/Tongatapur_}r`jHXטונגטאפוrasUEurope/Tallinnrb}rcjHX טאליןrdsU Indian/Mahere}rfjHXמאההrgsU Asia/Colomborh}rijHXקולומבוrjsUAustralia/Darwinrk}rljHXאוסטרליה/דרוויןrmsUPacific/Wallisrn}rojHX ואליסrpsUAntarctica/Davisrq}rrjHX דייויסrssUPacific/Pitcairnrt}rujHX פיטקרןrvsUAfrica/Librevillerw}rxjHXליברוויילrysUAfrica/Freetownrz}r{jHXפריטאוןr|sU Africa/Bissaur}}r~jHX ביסאוrsU Asia/Dhakar}rjHXדאקהrsUAmerica/St_Luciar}rjHXסנט לוצ'יהrsUEurope/Amsterdamr}rjHXאמסטרדםrsUAmerica/Montserratr}rjHXמונטסראטrsU Asia/Tashkentr}rjHXאסיה/טשקנטrsUAfrica/Nairobir}rjHXניירוביrsU Europe/Tiraner}rjHX טירנהrsUPacific/Saipanr}rjHX סאיפאןrsUAmerica/Maceior}rjHX מאסיוrsUAfrica/Abidjanr}rjHX אבידג'ןrsUAfrica/Djiboutir}rjHXג'יבאוטיrsUAmerica/Detroitr}rjHXאמריקה/דטרויטrsUAmerica/Shiprockr}rjHXאמריקה/שיפרוקrsU Africa/Cairor}rjHXקהירrsUAmerica/Grenadar}rjHX גרנדהrsUAmerica/El_Salvadorr}rjHX סלבדורrsU Europe/Madridr}rjHXאירופה/מדרידrsUPacific/Kiritimatir}rjHXקיריטימאטיrsUAmerica/Santiagor}rjHXאמריקה/סנטיאגוrsU Asia/Dubair}rjHX דובאיrsU Asia/Kuwaitr}rjHX כוויתrsUPacific/Noumear}rjHX נומאהrsUAmerica/Mazatlanr}rjHXאמריקה/מזטלןrsUAsia/Ulaanbaatarr}rjHXאולאאנבטארrsUAfrica/Dar_es_Salaamr}rjHXדאר א-סאלםrsUIndian/Maldivesr}rjHXמולדוביהrsUAntarctica/Rotherar}rjHX רות'רהrsUEurope/Stockholmr}rjHXשטוקהולםrsU Pacific/Fijir}rjHX פיג'יrsU Pacific/Apiar}rjHXאפיהrsUAmerica/Port-au-Princer}rjHXפורט או פרינסrsUPacific/Pago_Pagor}rjHXפאגו פאגוrsU America/Arubar}rjHX ארובהrsUAmerica/Caymanr}rjHX קיימןrsUAustralia/Adelaider}rjHX אדליידrsU Europe/Athensr}rjHX אתונהrsUAmerica/Indianapolisr}rjHXאינדיאנפוליסrsU Pacific/Guamr}rjHXגואםrsU Pacific/Trukr}rjHXטרוקrsUAmerica/Curacaor}rjHX קורסאוrsU Asia/Rangoonr}rjHX ראנגוןrsUAmerica/Port_of_Spainr}rjHXנמל ספרדrsU Africa/Luandar}rjHX לואנדהrsUPacific/Funafutir}rjHXפונאפוטיrsUIndian/Kerguelenr}rjHXקרגואלןrsUAfrica/Khartoumr}rjHX חרטוםr sUAmerica/Mexico_Cityr }r jHX"אמריקה/מקסיקו סיטיr sUAsia/Choibalsanr }rjHXצ'ואיבלסאןrsUIndian/Mauritiusr}rjHXמאוריטיוסrsU Asia/Manilar}rjHX מנילהrsU Africa/Lomer}rjHXלומהrsU Europe/Rigar}rjHXריגהrsU Europe/Berlinr}rjHX ברליןrsU Europe/Zurichr}r jHX ציריךr!sUAmerica/Cordobar"}r#jHXאמריקה/קורדובהr$sUAmerica/Guatemalar%}r&jHXגוואטמלהr'sU Asia/Tbilisir(}r)jHXטביליסיr*sU America/Belemr+}r,jHXבלםr-sU Africa/Doualar.}r/jHX דואלהr0sU Europe/Romer1}r2jHXרומאr3sU America/Limar4}r5jHXלימהr6sUAfrica/Sao_Tomer7}r8jHXסאו טומהr9sUAmerica/Managuar:}r;jHXמנאגואהr<sUAmerica/Argentina/San_Juanr=}r>jHX-אמריקה/ארגנטינה/סאן-חואןr?sUPacific/Kosraer@}rAjHX קוסרהrBsUAfrica/BujumburarC}rDjHXבוג'ומבורהrEsUEurope/ChisinaurF}rGjHX קישינבrHsU Europe/WarsawrI}rJjHXורשהrKsUAmerica/MonterreyrL}rMjHXאמריקה/מונטרייrNsUAmerica/LouisvillerO}rPjHXאמריקה/לואיסווילrQsU Africa/KigalirR}rSjHX קיגאליrTsUAmerica/Boa_VistarU}rVjHXבואה ויסטהrWsUEurope/AndorrarX}rYjHX אנדורהrZsUAfrica/Mbabaner[}r\jHXמבאבאנהr]sUAtlantic/Bermudar^}r_jHX ברמודהr`sUAmerica/Araguainara}rbjHXאראגואינהrcsUAntarctica/Caseyrd}rejHX קאסייrfsU Asia/Saigonrg}rhjHX סייגוןrisUPacific/Honolulurj}rkjHXפסיפי/הונולולוrlsU Asia/Bakurm}rnjHXבאקוrosU America/Thulerp}rqjHXטולהrrsU Pacific/Niuers}rtjHX ניווהrusUIndian/Reunionrv}rwjHX ריוניןrxsUAtlantic/Stanleyry}rzjHX סטנליr{sUAmerica/St_Thomasr|}r}jHXסנט תומאסr~sUEurope/Helsinkir}rjHXהלסינקיrsUPacific/Majuror}rjHX מאג'ורוrsUPacific/Aucklandr}rjHXפסיפי/אוקלנדrsU Asia/Adenr}rjHXעדןrsUAtlantic/Cape_Verder}rjHXקייפ ורדהrsUAsia/Hong_Kongr}rjHXהונג קונגrsU Asia/Macaur}rjHXמקאוrsU Indian/Cocosr}rjHX קוקוסrsUPacific/Enderburyr}rjHXאנדרבוריrsUAmerica/Puerto_Ricor}rjHXפוארטו ריקוrsUAmerica/Guadelouper}rjHXגוואדלופrsUEurope/Copenhagenr}rjHXקופנהגןrsUAmerica/Nassaur}rjHXנסאוrsU Europe/Kievr}rjHXאירופה/קייבrsUAntarctica/Syowar}rjHXשויהrsUAmerica/Halifaxr}rjHXאמריקה/הליפקסrsUAntarctica/McMurdor}rjHX מקמרדוrsU Asia/Hovdr}rjHXחובדrsUAmerica/Danmarkshavnr}rjHXדנמרקסהווןrsUAmerica/Jamaicar}rjHX ג'מייקהrsUAmerica/Scoresbysundr}rjHXסקורסביסונדrsUAmerica/Caracasr}rjHXקאראקאסrsU Asia/Baghdadr}rjHXבגדדrsUAfrica/Monroviar}rjHXמונרוביהrsUAmerica/Manausr}rjHX מנאוסrsUAmerica/Los_Angelesr}rjHXאמריקה/לוס-אנג'לסrsUAmerica/Godthabr}rjHX גודת'אבrsU Asia/Ammanr}rjHXרבת עמוןrsU Asia/Kabulr}rjHX קאבולrsUPacific/Fakaofor}rjHXפאקאופוrsUIndian/Antananarivor}rjHXאנטננרבינוrsUAfrica/Windhoekr}rjHXווינדהוקrsUAmerica/St_Vincentr}rjHXסנט וינסנטrsU Pacific/Waker}rjHXוואקrsUPacific/Gambierr}rjHXאיי גמבירrsUAmerica/Vancouverr}rjHXאמריקה/ונקוברrsUAtlantic/Reykjavikr}rjHXרייקיאוויקrsU Africa/Hararer}rjHXהררהrsU Asia/Nicosiar}rjHXניקוסיהrsU Pacific/Palaur}rjHXפלאוrsU Africa/Bamakor}rjHX באמאקוrsUPacific/Ponaper}rjHX פונפהrsU Africa/Banjulr}rjHX באנג'ולrsUEurope/Budapestr}rjHX בודפשטrsU Asia/Tehranr}rjHXטהרןrsU Asia/Thimphur}rjHX טימפוrsUAmerica/Sao_Paulor }r jHXאמריקה/סאן-פאולוr sUAmerica/Belizer }r jHXבליזrsUAmerica/Edmontonr}rjHXאמריקה/אדמנטוןrsU Africa/Malabor}rjHX מאלאבוrsU Europe/Minskr}rjHX מינסקrsUAustralia/Perthr}rjHXאוסטרליה/פרת'rsUAmerica/Mendozar}rjHXאמריקה/מנדוזהrsU Asia/Tokyor}rjHX טוקיוr sUPacific/Easterr!}r"jHXאיי הפסחאr#sU Asia/Jakartar$}r%jHXאסיה/ג'קרטהr&sU Asia/Karachir'}r(jHX קאראצ'יr)sUAntarctica/Palmerr*}r+jHXאמריקה/פאלמרr,sUAustralia/Sydneyr-}r.jHXאוסטרליה/סידניr/sUAfrica/Johannesburgr0}r1jHXיוהנסבורגr2sU Asia/Muscatr3}r4jHX מוסקטr5sUAtlantic/South_Georgiar6}r7jHX$איי ג'ורג'יה הדרומיתr8sUAfrica/El_Aaiunr9}r:jHX אל עיוןr;sU Asia/Dilir<}r=jHXדיליr>sUAsia/Kuala_Lumpurr?}r@jHXקואלה לומפורrAsUAfrica/BlantyrerB}rCjHX בלנטירrDsU Asia/OralrE}rFjHXאסיה/אורלrGsUAmerica/Campo_GranderH}rIjHXקמפו גרנדהrJsUAmerica/Dawson_CreekrK}rLjHX אמריקה/דוסון-קריקrMsU Asia/AshgabatrN}rOjHX אשחבאדrPsUEurope/IstanbulrQ}rRjHXאיסטנבולrSsU Asia/BangkokrT}rUjHX בנקוקrVsUAfrica/KinshasarW}rXjHX קינשסהrYsUAntarctica/VostokrZ}r[jHX ווסטוקr\sUEurope/Bucharestr]}r^jHX בוקרשטr_sU Africa/Niameyr`}rajHX ניאמייrbsUAsia/Pyongyangrc}rdjHXצפון קוריאהresUEurope/Gibraltarrf}rgjHXגיברלטרrhsUAmerica/Porto_Velhori}rjjHXפורטו וולהוrksUAfrica/Nouakchottrl}rmjHX נוקשוטrnsUPacific/Galapagosro}rpjHXפסיפי/גלאפגוסrqsU Europe/Monacorr}rsjHX מונקוrtsU Asia/Bishkekru}rvjHX בישקקrwsUAmerica/Bogotarx}ryjHX בוגוטהrzsUAmerica/Denverr{}r|jHXאמריקה/דנוורr}sUAmerica/Winnipegr~}rjHXאמריקה/וויניפוגrsUAustralia/Brisbaner}rjHXאוסטרליה/בריסבןrsU Asia/Aqtober}rjHX אקטובהrsUAmerica/Recifer}rjHX רסיפהrsU Africa/Accrar}rjHXאקרהrsUEurope/Vilniusr}rjHXוילניאוסrsU Asia/Taipeir}rjHX טייפהrsUAmerica/Cayenner}rjHX קאייןrsU Africa/Dakarr}rjHX דאקארrsU Asia/Riyadhr}rjHXריאדrsUAmerica/Fortalezar}rjHXפורטאלזהrsU Asia/Yerevanr}rjHX ירבאןrsUAmerica/La_Pazr}rjHX לה פאזrsUAustralia/Broken_Hillr}rjHX"אוסטרליה/ברוקן-הילrsUAfrica/Mogadishur}rjHXמוגדישוrsUAmerica/Phoenixr}rjHXאמריקה/פיניקסrsUAmerica/Cuiabar}rjHX קויאבהrsU Africa/Lusakar}rjHX לוסאקהrsU Europe/Moscowr}rjHXאירופה/מוסקבהrsUPacific/Guadalcanalr}rjHXגואדלקנלrsUIndian/Christmasr}rjHXאיי חג המולדrsUAmerica/Rio_Brancor}rjHXריאו ברנצ'וrsUAfrica/Addis_Ababar}rjHXאדיס אבבהrsUAmerica/Cancunr}rjHXאמריקה/קנקוןrsU Pacific/Efater}rjHXאפטהrsU Asia/Aqtaur}rjHX אקטאוrsUPacific/Johnstonr}rjHXג'ונסטוןrsUAsia/Vientianer}rjHXוינטיאןrsUAmerica/Havanar}rjHX הוואנהrsUEurope/Brusselsr}rjHX בריסלrsU Europe/Lisbonr}rjHXאירופה/ליסבוןrsUAfrica/Conakryr}rjHXקונאקריrsU Asia/Makassarr}rjHXמאקאסארrsUPacific/Tarawar}rjHXטאראווהrsUAtlantic/Azoresr}rjHXהאיים האזוריםrsUAsia/Jerusalemr}rjHXירושליםrsUAfrica/Kampalar}rjHX קמפלהrsUAsia/Singaporer}rjHXסינגפורrsU Europe/Oslor}rjHX אוסלוrsUAmerica/Chicagor}rjHXאמריקה/שיקגוrsU Asia/Shanghair}rjHXאסיה/שנחאיrsUAmerica/St_Kittsr}rjHXסנט קיטסrsUAmerica/Noronhar}rjHXנורונההrsU Asia/Beirutr}rjHX ביירותrsUAfrica/Algiersr}rjHX אלג'ירrsUAmerica/Panamar}rjHXפנמהrsUAfrica/Ndjamenar}r jHX נג'מנהr sU Africa/Maputor }r jHX מאפוטוr sUAmerica/Guayaquilr}rjHXגוויקילrsUAmerica/Tortolar}rjHXטורטולהrsU Asia/Bahrainr}rjHX בהריןrsU Europe/Londonr}rjHXאירופה/לונדוןrsUAmerica/Costa_Ricar}rjHXקוסטה ריקהrsU Indian/Chagosr}rjHXאיי צ'גוסrsU Pacific/Naurur }r!jHX נאורוr"sU Asia/Jayapurar#}r$jHXג'איאפורהr%sUIndian/Mayotter&}r'jHX מאיוטr(sUAsia/Phnom_Penhr)}r*jHX פנום פןr+sUAfrica/Gaboroner,}r-jHXגאבורונהr.sUAtlantic/Faeroer/}r0jHXפארוr1sUPacific/Port_Moresbyr2}r3jHXפורט מורנסביr4sUAmerica/Montevideor5}r6jHXמונטווידאוr7sU Africa/Tunisr8}r9jHXתוניסיהr:sUAmerica/Anguillar;}r<jHXאנגווילהr=sU Asia/Damascusr>}r?jHXדמשקr@sU Asia/QatarrA}rBjHXקתרrCsUAmerica/North_Dakota/CenterrD}rEjHX)אמריקה/צפון דקוטה/מרכזrFsU Asia/BruneirG}rHjHX ברונייrIsUAmerica/GuyanarJ}rKjHX גוינהrLsUAmerica/New_YorkrM}rNjHXאמריקה/ניו-יורקrOsU Asia/KatmandurP}rQjHX קטמנדוrRsUAtlantic/St_HelenarS}rTjHXסנט הלנהrUsUAmerica/BarbadosrV}rWjHX ברבדוסrXsU Asia/OmskrY}rZjHXאיה/אומסקr[sUEurope/Luxembourgr\}r]jHXלוקסמבורגr^sU Africa/Banguir_}r`jHX בנגואיrasU Asia/Gazarb}rcjHXעזהrdsUAmerica/Martiniquere}rfjHXמרטיניקrgsUAntarctica/DumontDUrvillerh}rijHXדומון ד'אורוויrjsUAmerica/Antiguark}rljHXאנטיגואהrmsU Asia/Almatyrn}rojHX אלמאטיrpsUPacific/Midwayrq}rrjHXמידווייrssUPacific/Tahitirt}rujHXפסיפי/טהיטיrvsUAmerica/Santo_Domingorw}rxjHXסנטו דומינגוrysUAfrica/Casablancarz}r{jHXקזבלנקהr|sUAsia/Novosibirskr}}r~jHXאסיה/נובוסיבירסקrsU Europe/Samarar}rjHXאירופה/סמרהrsUAmerica/Paramaribor}rjHXפרמאריבוrsUAfrica/Lubumbashir}rjHXלובומבאשיrsUAfrica/Brazzaviller}rjHXבראזאוויילrsUAmerica/Grand_Turkr}rjHXגרנד טורקrsUPacific/Marquesasr}rjHXאיי מרקיזrsUAmerica/Asuncionr}rjHXאסונסיוןrsU Europe/Viennar}rjHXוינהrsU Asia/Seoulr}rjHXדרום קוריאהrsUPacific/Norfolkr}rjHXאיי נורפוקrsU Europe/Dublinr}rjHX דבליןrsU Africa/Lagosr}rjHX לאגוסrsUAustralia/Hobartr}rjHXאוסטרליה/הוברטrsU Europe/Sofiar}rjHX סופיהrsUPacific/Rarotongar}rjHXרארוטונגהrsUAmerica/Dominicar}rjHXדומיניקהrsU Europe/Maltar}rjHX מאלטהrsUAfrica/Porto-Novor}rjHXפורטו-נובוrsUAsia/Samarkandr}rjHXאסיה/סמרקנדrsU Asia/Dushanber}rjHX דושנבהrsUAmerica/Montrealr}rjHXאמריקה/מונטריאולrsU Europe/Vaduzr}rjHX ואדוזrsUAmerica/Torontor}rjHXאמריקה/טורנטוrsU Etc/Unknownr}rjHX לא ידועrsU Indian/Comoror}rjHX קומורוrsU America/Bahiar}rjHXאמריקה/בהיאהrsUAmerica/Anchorager}rjHXזמן אלסקהrsU Africa/Ceutar}rjHX סאוטהrsUAfrica/Ouagadougour}rjHXואגאדוגוrsU Africa/Asmerar}rjHX אסמרהrsUAntarctica/South_Poler}rjHXהקוטב הדרומיrsuUscriptsr}r(UJavarXJavarUCirtrXCirtrUGururXGururUHebrrXעבריrUGeorrX גאורגיrURunrrXרוניrUUgarrXאוגריתיrUCyrlrX קיריליrUHrktrXHrktrUArmnrX ארמניrUCyrsrX3קירילי סלאבוני כנסייתי עתיקrUGeokrXGeokrULatfrXLatfrUKhmrrX קמריתrUTamlrXטמילrUArmirXArmirUKharrXKharr UTelur X טלוגוr UEgyhr XEgyhr UDsrtr XDsrtr UPhlvr XPhlvr UZyyyr XZyyyr UGothr Xגותיr UItalr Xאיטלקי עתיקr UHanor XHanor UIndsr X אינדוסr UBalir Xבאלינזיr USyrcr Xסוריr UGujrr XGujrr UKorer Xקוריאניr UHangr X האנגולr UBuhdr XBuhdr UArabr Xערביr UZxxxr! X לא כתובr" UCarir# XCarir$ UAvstr% XAvstr& UCoptr' X קופטיr( UOryar) X אורייהr* UHansr+ Xהאן מפושטr, UThair- Xתאיr. UCprtr/ Xקפריסאיr0 UGlagr1 XGlagr2 ULepcr3 XLepcr4 UHantr5 Xהאן מסורתיr6 UMongr7 Xמונגוליr8 UDevar9 Xדוואנגריr: ULaoor; Xלאיתr< UHirar= XHirar> UXpeor? Xפרסי עתיקr@ UBoporA XBoporB USyrerC XSyrerD ULatnrE X לטיניrF UHanirG XהאןrH UZzzzrI X%כתב לא ידוע או לא תקףrJ UCakmrK XCakmrL UPhnxrM X פיניקיrN UBugirO XBugirP UHungrQ Xהונגרי עתיקrR UBrairS X בריילrT UBrahrU XBrahrV UGrekrW X יווניrX UEgydrY XEgydrZ UCherr[ Xצ׳ירוקיr\ UEthir] X אתיופיr^ UTibtr_ X טיבטיr` UQaaira XQaairb UKalirc XKalird UJpanre Xיפניrf UBatkrg XBatkrh ULatgri Xלטיני גאליrj UChamrk XChamrl UKthirm XKthirn UBlisro XBlisrp ULanarq XLanarr UBengrs X בנגליrt UEgypru Xכתב חרטומיםrv USyrjrw Xסורי מערביrx USyrnry Xסורי מזרחיrz UKanar{ XKanar| UKndar} X קאנדהr~ uUvariantsr }r (UPOSIXr Xמחשבr UAREVELAr Xמזרח ארמניתr UMONOTONr Xמונוטוניתr UAREVMDAr Xמערב ארמניתr U1901r X כתיב גרמני מסורתיr uUnumber_symbolsr }r (Udecimalr X.r Ugroupr X,r uUcurrency_namesr }r (UDZDr Xדינר אלג'יריr UNADr Xדולר נמיביr UKMFr Xפרנק קומורואיr UBOPr Xפזו בוליביr UEGPr Xלירה מיצריתr UBGLr Xלבr UBGNr Xלב בולגריr UPABr X בלבואהr UYUMr Xדינר יגוסלביr UZWDr Xדולר זימבבואיr UBOBr Xבוליביאנוr UDKKr X כתר דניr UBWPr Xפולהr ULBPr Xלירה לבנוניתr UTZSr Xשילינג טנזניr UVNDr Xדונג וייטנאמיr UAOAr Xקואנזה אנגוליr UWSTr Xטלהr UAONr X קואנזה חדש אנגוליr UKHRr Xרילr UMYRr Xרינגיט מלזיr USOSr Xשילינג סומאליr UKYDr Xדולר קיימאניr ULYDr Xדינר לוביr UUAHr Xגריבנה אוקראיניr UJODr Xדינר ירדניr UAORr Xקואנזה רג'וסטדוr USURr Xרובל סובייטיr UAWGr X פלוריןr USARr Xריאל סעודיr UFIMr Xמרק פיניr UHKDr Xדולר הונג קונגיr USRGr Xגילדר סורינאמיr UTPEr Xאסקודו טימוראיr UMGFr Xפרנק מדגסקאריr UCHFr Xפרנק שוויצריr UGIPr Xפאונד גיברלטרr UALLr Xלק אלבניr UXPDr X פלדיוםr UHRKr Xקונה קרואטיr UDJFr Xפרנק [DJF]r UUYUr Xפזו אורוגוואיr USZLr Xלילנגניr UEQEr X אקוולהr UITLr Xלירה איטלקיתr UXAFr Xפרנקr UBNDr Xדולר ברונייr UISKr Xקרונה איסלנדיתr UZALr X+ראנד דרום אפריקאי (כספי)r USRDr Xדולר סורינאמיr UNIOr Xקורדובהr ULAKr Xקיפr UNPRr Xרופי נפאליr USYPr Xלירה סוריתr UJMDr Xדולר ג'מאיקניr UFRFr Xפרנק צרפתיr UMAFr Xפרנק מאליr UMZMr X מטיקלr UPHPr Xפזו פיליפיניr UZARr X ראנד דרום אפריקאיr UGWPr Xפזו גינאיr ULUFr Xפרנק לוקסמבורגיr UBECr X!פרנק בלגי (בר המרה)r UNGNr X נאירהr UBEFr Xפרנק בלגיr UCRCr X קולוןr UDEMr Xמרק גרמניr UEEKr Xקרון אסטוניr UMWKr X קאווצ'הr UTTDr Xדולר טרינידדיr ULKRr Xרופי סרי לנקיr USKKr! Xקורונה סלובקיr" UTRLr# Xלירה טורקיתr$ UPKRr% Xרופי פקיסטניr& UHUFr' Xפורינט הונגריr( UROLr) Xלאוr* UBMDr+ Xדולר ברמודהr, ULSLr- Xלוטיr. UMNTr/ X טוגרוגr0 UAMDr1 Xדראם ארמניr2 UYUDr3 Xדינר יגוסלבי חדשr4 UUGXr5 Xשילינג אוגנדיr6 UQARr7 Xריאל קטאריr8 UXDRr9 X&זכויות משיכה מיוחדותr: UNLGr; X גילדרr< UUGSr= X'שילינג אוגנדי (1966 - 1987)r> UGBPr? Xלירה שטרלינגr@ UGELrA XלריrB USHPrC Xפאונד סנט הלניrD UAFNrE X אפגניrF USBDrG Xדולר איי שלמהrH UCSKrI X"קורונה צ'כית [1953-1992]rJ UKPWrK Xוון צפון קוראניrL UCSDrM Xדינר סרבי ישןrN UTHBrO Xבהט תאילנדיrP UTRYrQ Xלירה טורקית חדשהrR UBDTrS XטאקהrT UGRDrU X דרכמהrV UYERrW Xריאל תימניrX UDDMrY Xמרק מזרח גרמניrZ UHTGr[ Xגארדr\ UANGr] Xגילדר [ANG]r^ ULRDr_ Xדולר ליבריr` URWFra Xפרנק רואנדיrb UNOKrc Xכתר נורבגיrd UKESre Xשילינג קנייאתיrf UMOPrg Xפטקהrh UINRri Xרופי הודיתrj UMXNrk Xפזו מקסיקניrl UCZKrm Xקורונה צ'כיתrn UTJSro Xסומוני טג'קיסטניrp UBTNrq Xנגולטרוםrr UYDDrs Xדינר תימניrt UCOPru Xפזו קולומביאניrv UMTLrw Xלירה מלטיתrx UMURry Xרופי מאוריציניrz UIDRr{ Xרופיה אינדונזיתr| UHNLr} X למפירהr~ UFJDr Xדולר פיג'יr UETBr Xבירr UPENr Xסול פרואני חדשr UBZDr Xדולר בליזאיr UATSr Xשילינג אוסטריr UILPr Xלירה ישראליתr UZRNr Xזאיר חדשr UDOPr Xפזוr UTMMr Xמנאט טורקמאניr UTWDr Xדולר טאייוני חדשr UMDLr Xליאו מולדובניr UXPTr X פלטינהr UECSr Xסוקרr UBSDr Xדולר בהאמיr USEKr Xכתר שוודיr UZMKr X קוואצ'הr UMVRr X רופיהr UXTSr X"סימון למטרות בדיקהr UAUDr Xדולר אוסטרליr UADPr Xפזו אנדוריr UCUPr Xפזו קובניr UIEPr Xלירה איריתr UBBDr Xדולר ברבדיאניr UKRWr Xוון דרום קוראניr UGMDr Xדלסיr UGTQr Xקצאלr UVEBr Xבוליבר ונצואליr USITr Xטולאר סלובניr USDPr Xלירה סודניתr UCLPr Xפזו צ'ילאניr UEURr Xאירוr UCDFr Xפרנק קונגיניr UXCDr Xדולר מזרח קריביr UKZTr Xטנגהr URUBr Xרובלr UXAGr Xכסףr UPLZr Xזלוטי (1950 - 1995)r UBRLr Xריאל ברזילאיr UMMKr Xקיאטr URURr Xרובל רוסי (1991 - 1998)r UPLNr Xזלוטי פולניr UPYGr Xגווארניr UBRCr X קרוזדוr UBRBr Xקרוזיארוr UAEDr X<דירהם של איחוד הנסיכויות הערביותr UUSDr Xדולר אמריקאיr UAZMr X מאנאטr UAZNr Xמאנאט אזרביג׳ניr UUSNr X)דולר אמריקאי (היום הבא)r UTOPr X פאנגהr UVUVr Xואטוr UBADr X.דינר של בוסניה־הרצגובינהr UGNFr Xפרנק גינאיr UMXPr X#פזו מקסיקני (1861 - 1992)r UIQDr Xדינר עירקיr UERNr X נאקפהr UBAMr Xמארק בר המרהr USCRr Xרופי סיישליr UCADr Xדולר קנדיr USDDr Xדינר סודניr UCYPr Xלירה קפריסאיתr UMADr Xדירהם מרוקאיr UKWDr Xדינר כוויתיr UBIFr Xפרנק בורונדיr UXXXr Xסימון "ללא מטבע"r UPGKr Xקינהr ULTLr Xליטא ליטאיr USGDr Xדולר סינגפוריr UUZSr Xסום אוזבקיr USTDr X דוברהr UXFOr Xפרנק זהבr UESPr Xפסטה ספרדיr UIRRr Xריאל איראניr UCNYr Xיואןr USLLr X ליאוןr UTNDr Xדינר טוניסאיr UGYDr Xדולר גיאניr UESBr Xפזטה [ESB]r UESAr Xפזטה [ESA]r UNZDr Xדולר ניו זילנדיr UFKPr X פאונדr ULVLr! Xלטr" UUSSr# X)דולר אמריקאי (היום הזה)r$ UARPr% X%פזו ארגנטינאי (1983-1985)r& UKGSr' Xסום קירגיזיr( UARSr) Xפזו ארגנטינאיr* jBXש"חr+ URONr, Xלאו רומני חדשr- URSDr. Xדינר סרביr/ UBHDr0 Xדינר בחרייניr1 UJPYr2 X ין יפניr3 UPTEr4 X אסקודוr5 UXAUr6 Xזהבr7 uUmonthsr8 }r9 (U stand-aloner: }r; (Uwider< }r= KXמרסr> sU abbreviatedr? }r@ KXמרסrA sUnarrowrB }rC (KhKhKhKhKX5rD KX6rE KX7rF KX8rG K X9rH K X10rI K X11rJ K X12rK uuUformatrL }rM (UwiderN }rO (KX ינוארrP KX פברוארrQ KXמרץrR KX אפרילrS KXמאיrT KXיוניrU KXיוליrV KX אוגוסטrW K X ספטמברrX K XאוקטוברrY K X נובמברrZ K X דצמברr[ uU abbreviatedr\ }r] (KXינוr^ KXפברr_ KXמרץr` KXאפרra KXמאיrb KXיונrc KXיולrd KXאוגre K Xספטrf K Xאוקrg K Xנובrh K Xדצמri uuuUcurrency_formatsrj }rk Nh()rl }rm (h+Nh-Kh.KKrn h0X ¤ro jo rp h3KKrq h5X #,##0.00 ¤rr h7h1h8rs h:Nh;KKrt ubsUdaysru }rv (U stand-alonerw }rx Unarrowry }rz (KXבr{ KXגr| KXדr} KXהr~ KXוr KXשr KXאr usUformatr }r (Uwider }r (KX יום שניr KXיום שלישיr KXיום רביעיr KXיום חמישיr KXיום שישיr KXשבתr KXיום ראשוןr uU abbreviatedr }r (KXבr KXגr KXדr KXהr KXוr KXשr KXאr uuuU meta_zonesr }r (UIsraelr }r (Ushortr }r Ustandardr XISTr sUcommonr Ulongr }r Ugenericr Xשעון ישראלr suUIndiar }r (j }r j XIST (הודו)r sj uuUerasr }r (Uwider }r (KXלפני הספירהr KX לספירהr uU abbreviatedr }r (KX לפנה״סr KX לסה״נr uuu.PK[Rll(site-packages/babel/localedata/gl_ES.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[i(site-packages/babel/localedata/en_AU.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q (Upatternq!X dd/MM/yyyyq"Uformatq#X%(dd)s/%(MM)s/%(yyyy)sq$ubUfullq%h)q&}q'(h!XEEEE, d MMMM yyyyq(h#X!%(EEEE)s, %(d)s %(MMMM)s %(yyyy)sq)ubUlongq*h)q+}q,(h!X d MMMM yyyyq-h#X%(d)s %(MMMM)s %(yyyy)sq.ubUshortq/h)q0}q1(h!Xd/MM/yyq2h#X%(d)s/%(MM)s/%(yy)sq3ubuUcurrency_symbolsq4}q5(UUSDq6XUS$q7UAUDq8X$q9uU time_zonesq:}q;Uscriptsq<}q=Uvariantsq>}q?Unumber_symbolsq@}qAUcurrency_namesqB}qCUmonthsqD}qEUcurrency_formatsqF}qGNcbabel.numbers NumberPattern qH)qI}qJ(Uexp_precqKNUscaleqLKU frac_precqMKKqNUsuffixqOXqPhPqQUint_precqRKKqSh!X ¤#,##0.00qTUprefixqUX¤qVX-¤qWqXUexp_plusqYNUgroupingqZKKq[ubsUdaysq\}q]U meta_zonesq^}q_(UAustralia_CentralWesternq`}qaUcommonqbsU New_Zealandqc}qdhbsUAustralia_Centralqe}qfhbsUAtlanticqg}qhhbsUAustralia_Easternqi}qjhbsUAustralia_Westernqk}qlhbsuUerasqm}qnu.PK[1ll(site-packages/babel/localedata/da_DK.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[q1%site-packages/babel/localedata/is.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}q(U stand-aloneq}q (Uwideq }q (KX1. fjórðungurq KX2. fjórðungurq KX3. fjórðungurqKX4. fjórðungurquU abbreviatedq}q(KX1FqKX2FqKX3FqKX4FquUnarrowq}q(KX1qKX2qKX3qKX4quuUformatq}q(Uwideq}q(KX1st fjórðungurq KX2nd fjórðungurq!KX3rd fjórðungurq"KX4th fjórðungurq#uU abbreviatedq$}q%(KXF1q&KXF2q'KXF3q(KXF4q)uuuUperiodsq*}q+(Uamq,Xf.h.q-Upmq.Xe.h.q/uUscientific_formatsq0}q1Ncbabel.numbers NumberPattern q2)q3}q4(Uexp_precq5KKq6Uscaleq7KU frac_precq8KKq9Usuffixq:Xq;h;qUpatternq?X#E0q@UprefixqAh;X-qBqCUexp_plusqDUgroupingqEMMqFubsUpercent_formatsqG}qHNh2)qI}qJ(h5Nh7Kdh8KKqKh:X%qLhLqMh=KKqNh?X#,##0%qOhAh;hBqPhDNhEKKqQubsU week_dataqR}qS(Umin_daysqTKU weekend_startqUKU first_dayqVKU weekend_endqWKuU time_formatsqX}qY(UmediumqZcbabel.dates DateTimePattern q[)q\}q](h?XHH:mm:ssq^Uformatq_X%(HH)s:%(mm)s:%(ss)sq`ubUfullqah[)qb}qc(h?X HH:mm:ss vqdh_X%(HH)s:%(mm)s:%(ss)s %(v)sqeubUlongqfh[)qg}qh(h?X HH:mm:ss zqih_X%(HH)s:%(mm)s:%(ss)s %(z)sqjubUshortqkh[)ql}qm(h?XHH:mmqnh_X %(HH)s:%(mm)sqoubuU languagesqp}qq(UgvqrXmanxqsUguqtX gújaratíquUscnqvX sikileyskaqwUromqxXromaníqyUalgqzXalgonkvínsk málq{Ualeq|Xaleúskaq}Uscoq~XskoskaqUmniqX manípúríqUgdqXskosk gelískaqUgaqXírskaqUmnoqX manóbómálqUosaqXósageqUgnqXgvaraníqUaltqXsuðuraltaískaqUglqX gallegskaqUmwrqXmarvaríqUtyqX tahítískaqUtwqXtvíqUttqXtatarskaqUtrqX tyrkneskaqUtsqXtsongaqUtnqXtsúanaqUtoqXTongverska (Tongaeyjar)qUausqXáströlsk málqUavqX avarískaqUtkqX túrkmenskaqUthqX taílenskaqUroaqXrómönsk mál (önnur)qUtgqX tadsjikskaqUteqXtelúgúqUugaqX úgarítískaqUmwlqX mirandesískaqUkcgqXtyapqUsmiqXsamísk mál (önnur)qUfatqXfantíqUfanqXfangqUwoqXvolofqUrmqXretórómanskaqUdinqXdinkaqUblaqXsiksikaqUcmcqX kamísk málqUmlqX malajalamqUzhqX kínverskaqUtemqXtímneqUen_CAqXkanadísk enskaqUnwcqXklassisk nevaríqUzaqXsúangqUcauqXkákasusmál (önnur)qUzuqXsúlúqUterqXterenóqUtetqXtetúmqUmncqXmansjúqUkutqX kútenaíqUsukqXsúkúmaqUkumqXkúmíkqUsusqXsúsúqUnewqXnevaríqUsuxqX súmerskaqUdenqXslavqUmenqXmendeqUmulqXmargvísleg málqUlezqX lesgískaqUrootqXrótqUekaqXekajúkqUakkqX akkadískaqUdraqXdravidísk mál (önnur)qUjrbqXgyðingaarabískaqUsgnqX táknmálqUsgaqXfornírska (til 900)qUapaqX apatsjamálqUbraqXbraíqUchbrXsíbsjarUchgrX sjagataírUchkrX sjúkískarUchmrXmarírUchnrXsínúkr Uchor Xsjoktár Uchpr X sípevískar UchrrX sjerókírUchyrXsjeyenrUtirX tígrinjarUvotrXvotískarUmgrX malagasískarUibarXíbanrUmorX moldóvskarUmnrX mongólskarUmirXmaórírUmhr X marshallskar!Umkr"X makedónskar#Umtr$X maltneskar%Ucair&X$Indíánamál Mið-Ameríku (önnur)r'Udelr(Xdelaverr)Umsr*X malaískar+Umrr,Xmaratír-Utar.X tamílskar/Umyr0X burmneskar1Ucadr2Xkaddór3Usrnr4X sranan tongor5Utair6Xtaímál (önnur)r7Uafhr8X afríhílír9Usitr:Xsínótíbesk málr;Uenmr<Xmiðenska (1100-1500)r=Uen_AUr>Xáströlsk enskar?Unynr@X njankólerAUnyorBXnjórórCUnymrDX njamvesírEUsiorFX síúmálrGUmaprHXástrónesískarIUmasrJXmasaírKUlahrLXlandarMUladrNX ladínskarOUfyrPX frísneskarQUsnkrRXsóninkerSUfarTX persneskarUUmadrVX madúrskarWUmagrXXmagahírYUmairZX maítílír[Ufir\Xfinnskar]Ufjr^X fídjeyskar_Umanr`X mandingóraUegyrbX fornegypskarcUzndrdXsandereUssrfXsvatírgUsrrhX serbneskariUsqrjXalbanskarkUswrlX svahílírmUsvrnXsænskaroUsurpX súndanskarqUstrrX suðursótórsUskrtX slóvakískaruUsirvX singalesískarwUshrxXserbókróatískaryUsorzX sómalskar{Usnr|Xshónar}Usmr~XsamóskarUslrX slóvenskarUscrX sardínskarUsarX sanskrítrUsgrXsangórUserXnorðursamískarUsdrXsindírUzenrXsenagarUkbdrX kabardískarUafarXafróasísk mál (önnur)rUcsbrX kasúbískarUlgrXgandarUlbrXlúxemborgískarUfiurXfinnskúgrísk mál (önnur)rUlnrXlingalarUlorXlaórUlirX limbúrgískarUbynrXblínrUltrX litháískarUlurX lúbakatangarUfilrX filipínskarUyirX jiddískarUnonrXnorrænarUcebrX kebúanórUyorXjórúbarUnogrXnógaírUbatrXbaltnesk mál (önnur)rUdakrXdakótarUdarrXdargvarUdayrXdajakrUssarXnílósaharamál (önnur)rUkperXkpellerUelrXnýgríska (1453-)rUeorX esperantórUenrXenskarUlamrXlambarUeerXeverUmdfrXmoksarUfrrXfranskarUmdrrXmandarrUetrX eistneskarUesrXspænskarUrurX rússneskarUgonrXgondírUgohrXfornháþýska (um 750-1050)rUsmsrXskoltesamískarUsmnrX enaresamískarUsmjrX lúlesamískarUde_ATrXausturrísk þýskarUgotrXgotneskarUrnrXrúndírUrorX rúmenskarUdsbrX lágsorbneskarUsmarXsuðursamískarUgorrX gorontalórUastrX astúrískarUwalrXvalamórUcrhrXkrímtyrkneskarUathrXatapaskísk málrUgezrXgísrUxhrXsósarUffrXfúlarUkforXkororUmakrXmakasarrUzaprXsapótekrUkokrXkonkanírUzxxrXekkert tungutengt efnirUkosrXkosraskarUforX færeyskarUtogrXTongverska (Nyasa)r Uhupr Xhúpar Uudmr Xúdmúrtr UbejrXbejarUbemrXbembarUtsirX tsimsískarUberrX berbamálrUnzirXnsímarUsairX&Indíánamál Suður-Ameríku (önnur)rUangrXfornenska (um 450-1100)rUprarX prakrítmálrUbhorX bojpúrírUsalr X salísmálr!Upror"Xfornpróvensalska (til 1500)r#Urajr$X rajastanír%Usadr&Xsandaver'Uanpr(Xangíkar)Ues_419r*Xlatnesk-amerísk spænskar+Urapr,X rapanúír-Usasr.Xsasakr/Unqor0Xnkår1Ucarr2X karíbamálr3Uminr4X mínangkabár5Umicr6Xmikmakr7Uefir8Xefíkr9Uarnr:X arákanískar;Uypkr<X júpísk málr=Umisr>X ýmis málr?Ukacr@XkasínrAUkabrBXkabílerCUkaarDX karakalpakrEUkajrFXjjurGUkamrHXkambarIUkarrJXkarenrKUkawrLXkavírMUfr_CHrNXsvissnesk franskarOUtyvrPX túvínskarQUfr_CArRXkanadísk franskarSUkarTX georgískarUUdoirVXdogrírWUkgrXXkongórYUkkrZXkasakskar[Ukjr\X kúanjamar]Ukir^X kíkújúr_Ukor`XkóreskaraUknrbXkannadarcUkmrdXkmerreUklrfX grænlenskargUksrhX kasmírskariUkrrjXkanúrírkUkwrlX kornískarmUkvrnXkomískaroUkurpX kúrdneskarqUkyrrXkirgiskarsUtklrtX tókeláskaruUbuarvXbúríatrwUmgarxXmiðírska (900-1200)ryUhitrzX hettitískar{Udyur|Xdjúlar}Uder~XþýskarUdarXdanskarUdzrXdsongkarUluirX lúisenórUdvrXdívehírUhilrX híligaínonrUhimrX hímasjalírUgemrXgermönsk mál (önnur)rUcrprXkreól- og pidginmál (önnur)rUqurXkvesjúarUbasrXbasarUgbarXgbajarUbadrXbandarUbanrXbalískarUbalrXbalúkírUshnrXsjanrUbairX bamílekemálrUarprXarapahórUartrXalþjóðamál (önnur)rUarwrX aravakskarUarcrX arameískarUen_USrXbandarísk enskarUsemrXsemísk mál (önnur)rUselrXselkúprUnubrX núbísk málrUbtkrXbatakrUlusrXlúsaírUmusrXkríkrUluarX lúbalúlúarUirorXírókesk málrUirarXíranskarUmunrX múndamálrUlunrXlúndarUluorXlúórUwarX vallónskarUtuprX túpímálrUjvrXjavanskarUzblrX blisstáknrUtutrXaltaísk mál (önnur)rUtumrX túmbúkarUjarXjapanskarUcoprX koptískarUilorXílokórUlarXlatínarUgwirXgvísínrUundrXóljóstrUtlirXtlingitrUtlhrX klingónskarUchrXkamorrórUcorX korsískarUcarX katalónskarUcerX tsjetsjenskarUponrX ponpeiskarUcyrXvelskarUsahrXjakútrUcsrX tékkneskarUcrrXkrírUbntrX bantúmálrUcvrXsjúvasrUcurXkirkjuslavneskarUlvrX lettneskarUdumrXmiðhollenska (um 1050-1350)rUptrX portúgalskarUduarXdúalarUfrorXfornfranska (842 - um 1400)rUyaprXjapískarUfrmrXmiðfranska (um 1400-1600)rUtivrXtívrUfrsrXausturfrísneskarUfrrrXnorðurfrísneskar Uyaor Xjaór Upar X púnjabír UxalrX kalmúkskarUes_ESrXspænsk spænskarUpirXpalírUen_GBrX bresk enskarUgayrXgajórUotorX ótommálrUotarXtyrkneska, ottóman (1500-1928)rUhmnrXhmongrUmyvrXersjarUgaar Xgar!Ufurr"X fríúlskar#Ukhir$Xkoímál (önnur)r%Uainr&Xaínur'Urarr(X rarótongskar)Uslar*Xslavnesk mál (önnur)r+Uver,Xvendar-Uvir.X víetnamskar/Uisr0X íslenskar1Ukhor2Xkotaskar3Uiur4X inúktitútr5Uitr6Xítalskar7Uvor8Xvolapykr9Uiir:X sísúanjír;Uikr<X ínúpíakr=Uior>Xídór?Uiner@Xindóevrópsk mál (önnur)rAUiarBX interlingvarCUjprrDXgyðingapersneskarEUierFX interlingverGUidrHX indónesískarIUigrJXígbórKUpaprLX papíamentórMUeworNXevondórOUpaurPXpaláskarQUpaarRXpapúsk mál (önnur)rSUpagrTX pangasínmálrUUsatrVXsantalírWUpalrXXpalavírYUpamrZXpampangar[Usycr\Xklassisk sýrlenskar]Uphir^Xfilippseysk mál (önnur)r_Ucelr`Xkeltnesk (önnur)raUphnrbX fönikískarcUnicrdXnígerkordófanmál (önnur)reUniarfXníasrgUdgrrhXdogríbriUsyrrjX sýrlenskarkUniurlXníveskarmUgswrnXsvissnesk þýskaroUcchrpXatsamrqUjborrXlojbanrsUnahrtXnahúatlruUsamrvXsamversk arameískarwUhairxXhaídaryUgmhrzXmiðháþýska (um 1050-1500r{Ucusr|Xkúsitísk mál (önnur)r}Uwenr~X sorbnesk málrUadyrXadýgerUelxrXelamítrUadarXadangmerUpt_PTrXíberísk portúgalskarUhawrX havaískarUbinrXbínírUbikrXbíkolrUpt_BRrXbrasílísk portúgalskarUmosrXmossírUmohrX móhískarUtlrXtagalogrUzh_HansrXkínverska (einfölduð)rUzh_HantrXkínverska (hefðbundin)rUtvlrX túvalúskarUijorXíjórUkmbrX kimbúndúrUpeorX fornpersneskarUumbrX úmbúndúrUtmhrXtamasjekrUfonrXfónrUhsbrX hásorbneskarUberXhvítrússneskarUbgrX búlgarskarUbarXbaskírrUpsrXpastúrUbmrXbambararUbnrX bengalskarUborXtíbeskarUbhrXbíharírUbirXbíslamarUbrrX bretónskarUbsrX bosnískarUruprX arúmenskarUzzarXzázárUomrXórómórUojrXojibvarUacerXakkískarUachrXakólírUocrX&Okkitíska (eftir 1500); PróvensalskarUkrurXkúrúkrUsrrrXsererrUkrorXkrúrUkrlrX karélskarUkrcrXkarasaíbalkarrUndsrXLágþýska; LágsaxneskarUosrX ossetískarUorrXóríarUsogrXsogdíenrUnsorX norðursótórUsonrXsonghaírUde_CHrXsvissnesk háþýskarUvairXvaírUwakrX vakasmálrUlolrXmongórUmkhrXmonkmermál (önnur)rUawarXavadírUlozrXlosírUgilrX gilberskarUwasrXvasjórUwarrXvaraírUhzrXhererórUhyrXarmenskarUanrX aragonskarUsidrXsídamórUhrrX króatískarUhtrX haítískarUhurX ungverskarUhirXhindírUhorX hírímótúr Uhar Xhásar Ubugr X búgískar UherXhebreskarUuzrX úsbekskarUurrXúrdúrUplrXpólskarUukrX úkraínskarUugrXúígúrrUaarXafárrUabrX abkasískarUaerX avestískarUafr X afríkanskar!Uakr"Xakanr#Uamr$X amharískar%Unl_BEr&Xflæmskar'Ueur(X baskneskar)Uasr*Xassamskar+Uarr,X arabískar-Uinhr.Xingúsr/Utpir0Xtokpisinr1Umynr2Xmajamálr3Uayr4Xaímarar5Ukhar6Xkasír7Uazr8Xaserskar9Uincr:Xindversk mál (önnur)r;Unlr<X hollenskar=Unnr>X nýnorskar?Unor@XnorskarAUnarBX nárúskarCUnbrDXnorskt bókmálrEUnairFX'Indíánamál Norður-Ameríku (önnur)rGUndrHXnorðurndebelerIUnerJXnepalskarKUngrLXndongarMUnyrNXNjanja; Sísjeva; SjevarOUnaprPX napólískarQUgrbrRXgerbórSUgrcrTXforngríska (til 1453)rUUnrrVX suðurndebelerWUtigrXXtígrerYUnvrZXnavahór[Uzunr\Xsúnír]Urwr^X kínjarvandar_Ucper`X&kreól- og pidginmál á enskum grunniraUcpfrbX)kreól- og pidginmál á frönskum grunnircUcpprdX.kreól- og pidginmál á portúgölskum grunnireuU territoriesrf}rg(UBDrhX BangladessriUBErjXBelgíarkUBFrlXBúrkína FasórmUBGrnX BúlgaríaroUVErpX VenesúelarqUBArrXBosnía og HersegóvínarsUBBrtXBarbadosruUWFrvXWallis- og FútúnaeyjarrwUBLrxXSaint BarthélemyryUBMrzX Bermúdaeyjarr{UBNr|XBrúneir}UBOr~X BólivíarUBHrXBareinrUBIrX BúrúndírUBJrXBenínrUBTrXBútanrU011rXVestur-AfríkarUBVrX BouveteyjarUBWrXBotsvanarU014rXAustur-AfríkarU015rXNorður-AfríkarUBRrX BrasilíarU017rX Mið-AfríkarU018rXSuðurhluti AfríkurU019rXAmeríkarUBYrXHvíta-RússlandrUBZrXBelísrULVrXLettlandrURWrXRúandarURSrXSerbíarUTLrX Austur-TímorrURErXRéunionrUTMrX TúrkmenistanrUOMrXÓmanrUTJrX TadsjikistanrUROrX RúmeníarUTKrXTókelárUGWrX Gínea-BissárUGUrXGvamrUGTrX GvatemalarUGSrX)Suður-Georgía og Suður-SandvíkureyjarrUGRrX GrikklandrUGQrXMiðbaugs-GínearUGPrXGvadelúpeyjarrUJPrXJapanrUKIrX KíribatírUGYrXGvæjanarUGGrXGuernseyrUGFrXFranska GvæjanarUGErXGeorgíarUGDrXGrenadarU021rXAmeríka norðan MexikórUGBrXBretlandrUGArXGabonrUSVrX El SalvadorrUGNrXGínearUGMrXGambíarUGLrX GrænlandrU029rX KaríbahafrUGIrX GíbraltarrUGHrXGanarUJErXJerseyrUTNrXTúnisrUJMrXJamaíkarU013rX Mið-AmeríkarUWSrXSamóarU419rXLatín-Ameríka og KaríbahafrUHRrX KróatíarUBSrX BahamaeyjarrUHTrXHaítírUHUrX UngverjalandrUHKrX Hong KongrU039rXSuður-EvróparUHNrX HondúrasrUFIrXFinnlandrU142rXAsíarU030rX Austur-AsíarU034rXsuðurhluti AsíurU035rXSuðaustur-AsíarUPRrXPúertó RíkórUPSrX Palestínar U830r XErmasundseyjarr UFKr XFalklandseyjarr UIOrXBresku IndlandshafseyjarrUPWrXPalárUPTrX PortúgalrUSJrXSvalbarði og Jan MayenrUMDrXMoldóvarUFMrX MikrónesíarUIQrXÍrakrUPArXPanamarUPFrXFranska PólýnesíarUPGr XPapúa Nýja-Gínear!UPEr"XPerúr#UPKr$XPakistanr%UPHr&X Filippseyjarr'UFOr(X Færeyjarr)UPNr*XPitcairnr+UPLr,XPóllandr-UPMr.XSankti Pierre og Miquelonr/UZMr0XSambíar1UEHr2X Vestur-Saharar3URUr4X Rússlandr5UEEr6XEistlandr7UEGr8X Egyptalandr9UZAr:XSuður-Afríkar;UECr<XEkvadorr=UITr>XÍtalíar?UVNr@XVíetnamrAUZZrBXÓþekkt eða ógilt svæðirCUSBrDXSalómonseyjarrEUETrFX EþíópíarGUSOrHX SómalíarIUZWrJXSimbabverKUSArLX Sádi-ArabíarMUESrNXSpánnrOUERrPXErítrearQUMErRXSvartfjallalandrSUAQrTXSuðurskautslandiðrUUMGrVX MadagaskarrWUMFrXX Saint MartinrYUMArZXMarokkór[UMCr\XMónakór]UUZr^X Úsbekistanr_UMMr`XMjanmarraUMLrbXMalírcUMOrdXMakaóreUMNrfX MongólíargUHMrhXHeard og McDonaldseyjarriUASrjXBandaríska SamóarkUMKrlX MakedóníarmUMUrnX MáritíusroUMTrpXMaltarqUMWrrXMalavírsUMVrtX MaldíveyjarruUMQrvX MartiníkrwUMPrxXNorður-MaríanaeyjarryUMSrzX Montserratr{UMRr|X Máritaníar}UIMr~XMönrUUGrXÚgandarUTZrX TansaníarUMYrXMalasíarUMXrXMexíkórUILrXÍsraelrUFRrX FrakklandrUAWrXArúbarUDOrXDóminíska lýðveldiðrUSHrX Sankti HelenarUVCrX Sankti Vinsent og GrenadíneyjarrU054rX MelanesíarUDJrX DjíbútírUFJrX FídjieyjarrU057rX MíkrónesíarU172rXSamveldi sjálfstæðra ríkjarU053rXÁstralía og Nýja-SjálandrUNIrX NíkaragvarUNLrX NiðurlöndrUNOrXNoregurrUNArXNamibíarUVUrX VanúatúrUNCrXNýja-KaledóníarUNErXNígerrUNFrX NorfolkeyjarUNGrX NígeríarUNZrXNýja-SjálandrUNPrXNepalrUNRrXNárúrUNUrXNiuerU061rX PólýnesíarUCIrXFílabeinsströndinrUCHrXSvissrUCOrX KólumbíarUCNrXKínarUCMrXKamerúnrUCLrXChílerUCCrX KókoseyjarrUCArXKanadarUCGrX Vestur-KongórUCFrXMið-AfríkulýðveldiðrUCDrX Austur-KongórUCZrX TékklandrUCYrXKýpurrUCXrXJólaeyrUCSrXSerbía og SvartfjallalandrUCRrX KostaríkarUPYrXParagværUCVrXGrænhöfðaeyjarrUCUrXKúbarUSZrX SvasílandrUSYrXSýrlandrUKGrX KirgisistanrUKErXKeníarUSRrX SúrínamrU143rX Mið-AsíarUKHrX KambódíarUKNrXSankti Kristófer og NevisrUKMrX KómoreyjarrUSTrXSaó Tóme og PrinsíperUSKrX SlóvakíarUKRrX Suður-KórearUSIrX SlóveníarUKPrXNorður-KórearUKWrXKúveitrUSNrXSenegalrUSMrX San MarínórUSLrXSíerra LeónerUSCrXSeychelleseyjarrUKZrX Kasakstanr UKYr X Caymaneyjarr USGr X Singapúrr USErX SvíþjóðrUSDrXSúdanrU151rXAustur-EvróparU150rXEvróparUDMrX DóminíkarU155rXvestur-EvróparU154rXNorður-EvróparUVGrXJómfrúaeyjar (bresku)rUDErX ÞýskalandrUYEr XJemenr!UMHr"X Marshalleyjarr#U062r$XSyðri-Mið-Asíar%UDZr&XAlsírr'UUSr(X Bandaríkinr)UUYr*X Úrúgvær+UYTr,XMayotter-UUMr.XSmáeyjar Bandaríkjannar/ULBr0XLíbanonr1ULCr2XSankti Lúsíar3ULAr4XLaosr5UTVr6XTúvalúr7UTWr8XTaívanr9UTTr:XTrínidad og Tóbagór;UTRr<XTyrklandr=ULKr>X Srí Lankar?ULIr@X LiechtensteinrAUCKrBX CookseyjarrCUTOrDXTongarEULTrFXLitháenrGULUrHX LúxemborgrIULRrJX LíberíarKULSrLXLesótórMUTHrNXTaílandrOUTFrPXFrönsku suðlægu landsvæðinrQUTGrRXTógórSUTDrTXTsjadrUUTCrVXTurks- og CaicoseyjarrWULYrXXLíbíarYUVArZX Páfagarðurr[U145r\X vestur-Asíar]UAEr^X!Sameinuðu arabísku furstadæminr_UADr`XAndorraraUAGrbXAntígva og BarbúdarcUAFrdX AfganistanreUAIrfXAngvillargUVIrhXJómfrúaeyjar (bandarísku)riUISrjXÍslandrkUIRrlXÍranrmUAMrnXArmeníaroUALrpXAlbaníarqUAOrrXAngólarsUANrtXHollensku AntillurruU003rvXNorður-AmeríkarwU002rxXAfríkaryU001rzXheimurr{UARr|X Argentínar}UAUr~X ÁstralíarUATrX AusturríkirU005rXSuður-AmeríkarUINrXIndlandrUAXrX ÁlandseyjarrU009rX EyjaálfarUAZrX AserbaídsjanrUIErXÍrlandrUIDrX IndónesíarUJOrX JórdaníarUQUrXEvrópusambandiðrUUArX ÚkraínarUQArXKatarrUDKrXDanmörkrUMZrX MósambíkrUQOrXYtri EyjaálfaruUdecimal_formatsr}rNh2)r}r(h5Nh7Kh8KKrh:h;h;rh=KKrh?X #,##0.###rhAh;hBrhDNhEKKrubsU date_formatsr}r(Umediumrh[)r}r(h?Xd.M.yyyyrh_X%(d)s.%(M)s.%(yyyy)srubUfullrh[)r}r(h?XEEEE, d. MMMM yyyyrh_X"%(EEEE)s, %(d)s. %(MMMM)s %(yyyy)srubUlongrh[)r}r(h?X d. MMMM yyyyrh_X%(d)s. %(MMMM)s %(yyyy)srubUshortrh[)r}r(h?Xd.M.yyyyrh_X%(d)s.%(M)s.%(yyyy)srubuUcurrency_symbolsr}r(UCOPrXCol$rUMKDrXMDenrUNADrXN$rUKMFrXCFrUNZDrX$NZrUBGLrXlevrUHNLrXLrUXPFrXCFPFrUFJDrXF$rUISKrXkr.rUXCDrXEC$rUTRLrXTLrUBZDrXBZ$rUGNFrXGFrUIQDrXIDrUDOPrXRD$rUCVErXCVEscrULKRrXSL RerUDKKrXDKrrUSKKrXSkrUCADrXCan$rUPKRrXPrarULBPrXLLrUHUFrXFtrUCYPrX£CrUROLrXleurUKWDrXKDrUBMDrXBer$rULSLrXMrUMYRrXRMrUMNTrXTugrUAMDrXdramrULYDrXLDrUSYPrXLSrUIEPrXIR£rUTWDrXNT$rUSARrXSRlr USEKr XSKrr USGDr XS$r UHKDrXHK$rUSCRrXSRrUSRGrXSfrUZWDrXZ$rUAUDrX$ArUCHFrXSwFrUBEFrXBFrUIRRrXRIrUBBDrXBDS$rUTZSr XT Shr!UCNYr"XYr#UYERr$XYRlr%UGTQr&XQr'UARSr(XArg$r)USTDr*XDbr+UMTLr,XLmr-UDJFr.XDFr/UCLPr0XCh$r1UVUVr2XVTr3UALLr4Xlekr5UANGr6XNA f.r7UKZTr8XTr9UIDRr:XRpr;UNOKr<XNKrr=UINRr>XINRr?UMXNr@XMEX$rAUOMRrBXROrCUMROrDXUMrEUJMDrFXJ$rGUSBDrHXSI$rIUVEBrJXBerKUTTDrLXTT$rMUGYDrNXG$rOuU time_zonesrP}rQ(UAtlantic/CanaryrR}rSUcityrTX KanaríeyjarrUsU Europe/LisbonrV}rWjTXLissabonrXsU Africa/BissaurY}rZjTXBissár[sUEurope/Copenhagenr\}r]jTXKaupmannahöfnr^sUAmerica/St_Luciar_}r`jTX St. LuciarasUAsia/Singaporerb}rcjTX SingapúrrdsUAfrica/Djiboutire}rfjTX DjíbútírgsU Africa/Cairorh}rijTXKaírórjsU Europe/Moscowrk}rljTXMoskvarmsUAmerica/El_Salvadorrn}rojTXSalvadorrpsU Europe/Madridrq}rrjTXMadrídrssUEurope/Brusselsrt}rujTXBrusselrvsUAsia/Ulaanbaatarrw}rxjTX Úlan BatorrysUIndian/Maldivesrz}r{jTX Maldíveyjarr|sU Europe/Parisr}}r~jTXParísrsUEurope/Stockholmr}rjTX StokkhólmurrsU Pacific/Fijir}rjTX FidjieyjarrsU America/Arubar}rjTXArúbarsU Europe/Athensr}rjTXAþenarsUAmerica/Indianapolisr}rjTX IndianapolisrsUAmerica/Reginar}rjTXRegínarsUAmerica/Mexico_Cityr}rjTX MexíkóborgrsUAmerica/Puerto_Ricor}rjTXPúertó RíkórsUIndian/Mauritiusr}rjTX MáritíusrsU Europe/Berlinr}rjTXBerlínrsU Europe/Zurichr}rjTXZürichrsUAmerica/Guatemalar}rjTX GvatemalarsUEurope/Gibraltarr}rjTX GíbraltarrsU Europe/Romer}rjTXRómrsU Europe/Warsawr}rjTXVarsjársUAtlantic/Bermudar}rjTX BermúdaeyjarrsU Asia/Tehranr}rjTXTeheranrsUPacific/Honolulur}rjTXHonolulursUAmerica/St_Thomasr}rjTX St. ThomasrsUAtlantic/Cape_Verder}rjTXGrænhöfðaeyjarrsU Asia/Macaur}rjTXMakaórsUAmerica/Guadelouper}rjTX GvadelúprsUAmerica/Jamaicar}rjTXJamaíkarsU Asia/Baghdadr}rjTXBagdadrsUAfrica/Monroviar}rjTX MonróvíarsUEurope/Budapestr}rjTX BúdapestrsU Asia/Kabulr}rjTXKabúlrsUAmerica/St_Vincentr}rjTX St. VincentrsUAtlantic/Reykjavikr}rjTX ReykjavíkrsUAmerica/Guyanar}rjTXGvæjanarsUAmerica/Belizer}rjTXBelísrsU Asia/Tokyor}rjTXTókýórsUPacific/Easterr}rjTX PáskaeyjarsU Asia/Jakartar}rjTXDjakartarsUAsia/Pyongyangr}rjTX PjongjangrsUAfrica/Johannesburgr}rjTXJóhannesarborgrsUAtlantic/South_Georgiar}rjTXSuður-GeorgíarsUEurope/Istanbulr}rjTX IstanbúlrsUEurope/Bucharestr}rjTX BúkarestrsU Pacific/Niuer}rjTXNíúersU Europe/Monacor}rjTXMónakórsUAmerica/Denverr}rjTXDenverrsUEurope/Vilniusr}rjTXVilníusrsUAmerica/Rio_Brancor}rjTX Rio BrancorsUAmerica/Cancunr}rjTXKankúnrsU Asia/Kuwaitr}rjTXKúveitr sU Pacific/Guamr }r jTXGúamr sUAtlantic/Azoresr }rjTX AzoreyjarrsU Europe/Oslor}rjTXOslórsUAmerica/St_Kittsr}rjTX St. KittsrsUAmerica/Godthabr}rjTXNuukrsU Asia/Beirutr}rjTXBeirútrsUAfrica/Algiersr}rjTXAlsírrsU Pacific/Palaur}r jTXPalaúr!sU Asia/Bahrainr"}r#jTXBareinr$sUAtlantic/Faeroer%}r&jTX Færeyjarr'sUAmerica/Costa_Ricar(}r)jTX Kostaríkar*sU Africa/Tunisr+}r,jTXTúnisr-sUAmerica/Anguillar.}r/jTX Angúillar0sU Asia/Damascusr1}r2jTXDamaskusr3sU Asia/Qatarr4}r5jTXKvatarr6sU Asia/Bruneir7}r8jTXBrúneir9sUAtlantic/St_Helenar:}r;jTX St. Helenar<sUAmerica/Barbadosr=}r>jTX Barbadoseyjarr?sUAmerica/Martiniquer@}rAjTX MartínikrBsUAntarctica/DumontDUrvillerC}rDjTXDumont D'UrvillerEsUPacific/MarquesasrF}rGjTXMarquesas-eyjarrHsU Europe/ViennarI}rJjTX VínarborgrKsU Europe/SofiarL}rMjTXSofíarNsUAmerica/DominicarO}rPjTX DóminíkarQsUEurope/LuxembourgrR}rSjTX LúxemborgrTsU Etc/UnknownrU}rVjTXóþekktrWsUAntarctica/South_PolerX}rYjTXSuðurpóllinnrZsUAmerica/Anchorager[}r\jTX Anchorager]sU Asia/Seoulr^}r_jTXSeúlr`sU Pacific/Naurura}rbjTXNárúrcsuUscriptsrd}re(UHanirfX kínverskrgUJpanrhXjapönskriUHirarjXhiraganarkUEthirlX eþíópískrmUQaairnXerfðirroUHebrrpXhebreskrqUZzzzrrXÓþekkt eða ógilt leturrsUGeorrtX georgrískruUHangrvXhangulrwUCyrlrxX kyrillískryUHrktrzXkatakana eða hiraganar{UArabr|Xarabískr}UZxxxr~X ÓskrifaðrUCansrXCansrUKorerX kórönskrUHansrXeinfaldað hanrUHantrXhefðbundið hanrUKanarXkatakanarULatnrXlatneskrUGrekrXgrískruUvariantsr}rUnumber_symbolsr}r(UdecimalrX,rUgrouprX.ruUcurrency_namesr}r(UXXXrX#Óþekktur eða ógildur gjaldeyrirrjXNamibískur dalurrjXKómoreyskur frankirUBOPrXBólivískur pesirUEGPrX Egypskt pundrjXLefrUBGNrX Lef, nýttrUPABrXBalbóirUYUMrXJúgóslavneskur denarirUBOBrXbólivískt bólívíanórjX Dönsk krónarjXLíbanskt pundrj XTanzanian ShillingrUVNDrXvíetnamskt dongrUYDDrXJemenskur denarirjXMalaysian RinggitrUKYDrXCaymaneyskur dalurrjXLíbískur denarirUUAHrXHrinjarUUAKrXUkrainian KarbovanetzrjXSádiarabískt ríalrUEURrXEurorjXHong Kong-dalurrjXSuriname GuilderrUTPErXTímorskur skútirUMGFrXMadagaskur frankirjXSvissneskur frankirUGIPrXGíbraltarspundrj4XLekrjDXMauritania OuguiyarUBOVrXBolivian MvdolrUHRKrXKúnarj.XDjibouti FrancrUTHBrXBatrUXAFrXMiðafrískur franki, BEACrUBNDrXBrúneiskur dalurrj2X Vanuatu VaturUZALrXRand (viðskipta)rUMZErXMósambískur skútirjXSýrlenskt pundrUMADrXMarokkóskt dírhamrUFRFrXFranskur frankirUMAFrXMarokkóskur frankirUPHPrXfilippeyskir pesóarrUZARrXsuðurafríkskt randrUATSrXAusturrískur skildingurrULUFrXLúxemborgarfrankirUNGNrXNigerian NairarjXBelgískur frankirUAEDrXArabískt dírhamrUGBPrX SterlingspundrjLXTrínidad og Tóbagó-dalurrjXSrílönsk rúpíarjXSlóvakísk krónarjXTyrknesk lírarjXPakistönsk rúpíarjXFórintarjX Rúmenskt leirjXBermúdeyskur dalurrjX Lesotho LotirUESPrXSpænskur pesetirjX TúríkurrjXDrammrUBUKrXBúrmverskt kjatrUSURrX Soviet RoublerUXDRrXSérstök dráttarréttindirUNLGrXHollenskt gyllinir UMTPr XMaltneskt pundr jFXJamaískur dalurr jXSeychelles rúpíar USHPr X Helenskt pundr jXSimbabveskur dalurr jHXSalómonseyskur dalurr UCSKr XTékknesk króna, eldrir UKPWr XNorðurkóreskt vonnr UTRYr XNý tyrknesk lírar UGRDr XDrakmar j$XJemenskt ríalr UDDMr XAusturþýskt markr UMGAr XMadagascar Ariaryr j6XHollenskt Antillugyllinir ULRDr XLíberískur dalurr URWFr X Rwandan Francr j<X Norsk krónar UMXVr XMexíkóskur pesi, UDIr UMOPr X Macao Patacar j>XIndversk rúpíar j@XMexíkóskur pesir! UCZKr" XTékknesk krónar# UTJSr$ XTajikistan Somonir% UTJRr& XTadsjiksk rúblar' UGWEr( XPortúgalskur, gíneskur skútir) jXKólumbískur pesir* j:XIndónesísk rúpíar+ jXHoduras Lempirar, jXPólinesískur frankir- jXFídjeyskur dalurr. jXÍslensk krónar/ UPENr0 Xperúskar sol nuevor1 jXBelískur dalurr2 UILSr3 XSikillr4 UILPr5 XÍsraelskt pundr6 jXDóminískur pesir7 UTMMr8 XTúrkmenskt manatr9 UXFOr: XFranskur gullfrankir; UECSr< X Ecuador Sucrer= UBSDr> XBahameyskur dalurr? j X Sænsk krónar@ UZMKrA XZambian KwacharB jXÁstralskur dalurrC UADPrD XAndorrskur pesetirE UCUPrF XKúbverskur pesirG jX Írskt pundrH UCLFrI XChilean Unidades de FomentorJ jXBarbadoskur dalurrK UKRWrL XSuðurkóreskt vonnrM j&XGuatemala QuetzalrN jJXVenezuelan BolivarrO USITrP XSlóvenskur dalurrQ j0XChileskur pesirR ULTLrS XLítrT UITLrU XÍtölsk lírarV jXAustur-KaríbahafsdalurrW j8XKazakhstan TengerX URUBrY Xrússnesk rúblarZ UXFUr[ XFranskur franki, UICr\ UFIMr] X Finnskt markr^ UPLZr_ XSlotr` jBXÓmanskt ríalra UBRLrb XBrasilískt ríalrc UMMKrd XMjanmarskt kjatre URURrf XRússnesk rúbla (1991-1998)rg UPLNrh Xpólskt zlotýri UKESrj Xkenískur skildingurrk USVCrl XEl Salvador Colonrm UDEMrn X Þýskt markro jXMakedónskur denarirp UEEKrq XEistnesk krónarr jXTaívanskur dalurrs UUSNrt XBandaríkjadalur (næsta dag)ru jX Gíneufrankirv UMXPrw X$Mexíkóskur silfurpesi (1861-1992)rx jXÍrakskur denariry jXGrænhöfðeyskur skútirz jXKanadískur dalurr{ USDDr| XSúdanskur denarir} jXKýpverskt pundr~ jXKúveiskur denarir ULTTr XLithuanian Talonasr j XSingapúrskur dalurr j*XSao Tome and Principe Dobrar UMLFr XMalískur frankir ULVRr XLettnesk rúblar jXÍranskt ríalr j"XJúanr UXOFr XMiðafrískur franki, BCEAOr jNXGvæjanskur dalurr j,XMeltnesk lírar jXNýsjálenskur dalurr UFKPr XFalklenskt pundr ULVLr XLatr UUSSr XBandaríkjadalur (sama dag)r UUSDr XBandaríkjadalurr UARPr XArgentískur pesi (1983-1985)r j(XArgentískur pesir USDPr XSúdanskt pundr URONr X rúmensk leur URSDr Xserbneskur dínarr UJPYr XJenr UARAr XArgentine Australr UPTEr XPortúgalskur skútir uUmonthsr }r (U stand-aloner }r Unarrowr }r (KXjr KXfr KXmr KXar Kj Kj Kj KXár K Xsr K Xor K Xnr K Xdr usUformatr }r (Uwider }r (KXjanúarr KXfebrúarr KXmarsr KXaprílr KXmaír KXjúnír KXjúlír KXágústr K X septemberr K Xoktóberr K X nóvemberr K Xdesemberr uU abbreviatedr }r (KXjanr KXfebr KXmarr KXaprr KXmaír KXjúnr KXjúlr KXágúr K Xsepr K Xoktr K Xnóvr K Xdesr uuuUcurrency_formatsr }r Nh2)r }r (h5Nh7Kh8KKr h:X ¤r j r h=KKr h?X #,##0.00 ¤r hAh;hBr hDNhEKKr ubsUdaysr }r (U stand-aloner }r Unarrowr }r (Kj KXþr Kj Kj Kj KXlr Kj usUformatr }r (Uwider }r (KX mánudagurr KX þriðjudagurr KX miðvikudagurr KX fimmtudagurr KX föstudagurr KX laugardagurr KX sunnudagurr uU abbreviatedr }r (KXmánr KXþrir KXmiðr KXfimr KXfösr KXlaur KXsunr uuuU meta_zonesr }r (UEurope_Centralr }r (Ushortr }r (Udaylightr XSTMEr Ustandardr XMETr uUcommonr Ulongr }r (j Xsumartími Mið-Evrópur j XMið-Evróputímir uuUEurope_Easternr }r (j }r (j XSTAEr j XAETr uj j }r (j Xsumartími Austur-Evrópur j XAustur-Evróputímir uuuUerasr }r (U abbreviatedr }r (KX fyrir Kristr KX eftir Kristr uUnarrowr }r (KXf.k.r KXe.k.r uuu.PK[Rll(site-packages/babel/localedata/tn_ZA.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[M4Gm &site-packages/babel/localedata/kam.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XHH:mm:ssq-Uformatq.X%(HH)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X HH:mm:ss vq3h.X%(HH)s:%(mm)s:%(ss)s %(v)sq4ubUlongq5h))q6}q7(h,X HH:mm:ss zq8h.X%(HH)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XHH:mmq=h.X %(HH)s:%(mm)sq>ubuU languagesq?}q@U territoriesqA}qBUdecimal_formatsqC}qDU date_formatsqE}qF(UmediumqGh))qH}qI(h,X yyyy MMM dqJh.X%(yyyy)s %(MMM)s %(d)sqKubUfullqLh))qM}qN(h,XEEEE, yyyy MMMM ddqOh.X"%(EEEE)s, %(yyyy)s %(MMMM)s %(dd)sqPubUlongqQh))qR}qS(h,X yyyy MMMM dqTh.X%(yyyy)s %(MMMM)s %(d)sqUubUshortqVh))qW}qX(h,Xyy/MM/ddqYh.X%(yy)s/%(MM)s/%(dd)sqZubuUcurrency_symbolsq[}q\U time_zonesq]}q^Uscriptsq_}q`Uvariantsqa}qbUnumber_symbolsqc}qdUcurrency_namesqe}qfUKESqgXSilingi ya KenyaqhsUmonthsqi}qj(U stand-aloneqk}qlUnarrowqm}qn(KX1qoKX2qpKX3qqKX4qrKX5qsKX6qtKX7quKX8qvK X9qwK X10qxK X11qyK X12qzusUformatq{}q|(Uwideq}}q~(KX Mwei wa mbeeqKX Mwei wa keliqKXMwei wa katatuqKX Mwei wa kanneqKXMwei wa katanoqKXMwei wa thanthatuqKXMwei wa muonzaqKXMwei wa nyanyaqK X Mwei wa kendaqK X Mwei wa ikumiqK XMwei wa ikumi na imweqK XMwei wa ikumi na iliquU abbreviatedq}q(KX Mwei wa mbeeqKX Mwei wa keliqKXMwei wa katatuqKX Mwei wa kanneqKXMwei wa katanoqKXMwei wa thanthatuqKXMwei wa muonzaqKXMwei wa nyanyaqK X Mwei wa kendaqK X Mwei wa ikumiqK XMwei wa ikumi na imweqK XMwei wa ikumi na iliquuuUcurrency_formatsq}qUdaysq}q(U stand-aloneq}qUnarrowq}q(KhpKhqKhrKhsKhtKhuKhousUformatq}q(Uwideq}q(KXJumatatuqKXJumanneqKXJumatanoqKXAlamisiqKXIjumaaqKXJumamosiqKXJumapiliquU abbreviatedq}q(KXJttqKXJnnqKXJtnqKXAlhqKXIjmqKXJmsqKXJplquuuU meta_zonesq}qUerasq}q(Uwideq}q(KX mbee wa yesuqKXIYquU abbreviatedq}q(KXMYqKXIYquuu.PK[Rll-site-packages/babel/localedata/wo_Latn_SN.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[T`(site-packages/babel/localedata/es_GT.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }qU time_formatsq}qU languagesq}qU territoriesq}qUdecimal_formatsq}qU date_formatsq}q(Umediumqcbabel.dates DateTimePattern q)q}q(UpatternqX d/MM/yyyyqUformatqX%(d)s/%(MM)s/%(yyyy)sq ubUshortq!h)q"}q#(hXd/MM/yyq$hX%(d)s/%(MM)s/%(yy)sq%ubuUcurrency_symbolsq&}q'U time_zonesq(}q)Uscriptsq*}q+Uvariantsq,}q-Unumber_symbolsq.}q/(Udecimalq0X.q1Ugroupq2X,q3uUcurrency_namesq4}q5Umonthsq6}q7Ucurrency_formatsq8}q9Udaysq:}q;U meta_zonesq<}q=Uerasq>}q?u.PK[GlP33-site-packages/babel/localedata/el_POLYTON.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qU languagesq}q(UelqXἙλληνικάqUenqXἈγγλικάqUisqXἸσλανδικάqUitqXἸταλικάqUcyqXΟὐαλικάq Ugdq!XΣκωτικὰ κελτικάq"Ugaq#XἸρλανδικάq$Uetq%XἘσθονικάq&Uineq'X(Ἰνδοευρωπαϊκὰ (ἄλλα)q(Usemq)XΣημιτικὰ (ἄλλα)q*Uidq+XἸνδονησιακάq,Uesq-XἹσπανικάq.Unlq/XὉλλανδικάq0Unaiq1XBἸνδιανικὰ βόρειας Ἀμερικῆς (ἄλλα)q2Upeoq3X/Ἀρχαῖα περσικὰ (600-400 π.Χ.)q4Ugrcq5X Ἀρχαῖα Ἑλληνικάq6Uiraq7XἸρανικάq8Uarq9XἈραβικάq:Uyiq;XἸουδαϊκάqUhyq?XἈρμενικάq@UotaqAX2Τουρκικά, ὀθωμανικὰ (1500-1928)qBUhuqCXΟὑγγρικάqDUmulqEX"Πολλαπλές γλῶσσεςqFUjaqGXἸαπωνικάqHUheqIXἙβραϊκάqJUegyqKX'Αἰγυπτιακὰ (ἀρχαῖα)qLUsqqMXἈλβανικάqNUarcqOXἈραμαϊκάqPUukqQXΟὐκρανικάqRUslaqSXΣλαβικὰ (ἄλλα)qTuU territoriesqU}qV(UWFqWX4Νῆσοι Οὐάλλις καὶ ΦουτουνάqXUBAqYX$Βοσνία - ἘρζεγοβίνηqZUBMq[XΒερμοῦδεςq\UJPq]XἸαπωνίαq^UBVq_XΝῆσος Μπουβέq`UJOqaXἸορδανίαqbUGSqcXLΝότια Γεωργία καὶ Νότιες Νήσοι ΣάντουιτςqdUGRqeX ἙλλάδαqfUGQqgX#Ἰσημερινὴ ΓουινέαqhUGFqiXΓαλλικὴ ΓουιάναqjUGBqkX Ἡνωμένο ΒασίλειοqlUOMqmX ὈμάνqnUHTqoX ἉϊτήqpUHUqqXΟὑγγαρίαqrUHKqsXdΧὸνγκ Κόνγκ, Εἰδικὴ Διοικητικὴ Περιφέρεια τῆς ΚίναςqtUHNquXὉνδούραqvUHMqwX6Νῆσοι Χὲρντ καὶ ΜακντόναλντqxUPSqyX'Παλαιστινιακὰ ἘδάφηqzUKNq{X(Σαὶντ Κὶτς καὶ Νέβιςq|UVGq}X2Βρετανικὲς Παρθένοι Νῆσοιq~UIQqX ἸράκqUPFqX"Γαλλικὴ ΠολυνησίαqUPMqX,Σαὶντ Πιὲρ καὶ ΜικελόνqUEHqXΔυτικὴ ΣαχάραqUEEqXἘσθονίαqUEGqXΑἴγυπτοςqUZAqXΝότια ἈφρικήqUECqXἸσημερινόςqUITqX ἸταλίαqUETqXΑἰθιοπίαqUSAqXΣαουδικὴ ἈραβίαqUESqXἹσπανίαqUERqXἘρυθραίαqUMDqX.Μολδαβία, Δημοκρατία τῆςqUUYqXΟὐρουγουάηqUUZqXΟὐζμπεκιστάνqUMLqXΜαλίqUMOqXXΜακάο, Εἰδικὴ Διοικητικὴ Περιφέρεια τῆς ΚίναςqUMHqXΝῆσοι ΜάρσαλqUUSqX%Ἡνωμένες ΠολιτεῖεςqUUMqXZἈπομακρυσμένες Νησίδες τῶν Ἡνωμένων ΠολιτειῶνqUMPqX+Νῆσοι Βόρειες ΜαριάνεςqUUGqXΟὐγκάνταqUUAqXΟὐκρανίαqUILqX ἸσραήλqUAWqXἈρούμπαqUFMqXGΜικρονησία, Ὁμόσπονδες Πολιτεῖες τῆςqUFOqXΝῆσοι ΦερόεςqUNLqXὉλλανδίαqUNFqXΝῆσος ΝόρφολκqUCKqXΝῆσοι ΚούκqUCIqX$Ἀκτὴ ἘλεφαντοστούqUCHqXἙλβετίαqUCCqX'Νῆσοι Κόκος (Κήλινγκ)qUCFqX6Κεντροαφρικανικὴ ΔημοκρατίαqUCDqX6Κονγκό, Λαϊκὴ Δημοκρατία τοῦqUCXqX&Νῆσος ΧριστουγέννωνqUCVqX"Πράσινο ἈκρωτήριοqUSYqX9Συρία, Ἀραβικὴ Δημοκρατία τῆςqUSVqXἚλ ΣαλβαδόρqUSTqX)Σάο Τομὲ καὶ ΠρίνσιπεqUSJqX;Νῆσοι Σβάλμπαρ καὶ Γιὰν ΜαγιένqUSHqXἉγία ἙλένηqUSMqXἍγιος ΜαρίνοςqUSBqX!Νῆσοι ΣολομῶντοςqUKYqXΝῆσοι ΚέιμανqUDOqX*Δομινικανὴ ΔημοκρατίαqUYEqX ὙεμένηqUDZqXἈλγερίαqULCqXἉγία ΛουκίαqULAqX!Λατινικὴ ἈμερικήqUTTqX*Τρινιδὰδ καὶ ΤομπάγκοqULKqXΣρὶ ΛάνκαqUTLqXἈνατολικὸ ΤιμόρqULUqXΛουξεμβοῦργοqUTFqX&Γαλλικὰ Νότια ἘδάφηqUTDqX ΤσάντqUTCqX,Νῆσοι Τὲρκς καὶ ΚάικοςqUVAqX&Ἁγία Ἕδρα (Βατικανό)qUVCqX;Ἅγιος Βικέντιος καὶ ΓρεναδίνεςqUAEqX0Ἠνωμένα Ἀραβικὰ ἘμιράταqUADqX ἈνδόραqUAGqX2Ἀντίγκουα καὶ ΜπαρμπούνταqUAFqXἈφγανιστάνqUAIqXἈνγκουίλαrUVIrX7Ἀμερικανικὲς Παρθένοι ΝῆσοιrUISrXἸσλανδίαrUIRrX:Ἰράν, Ἰσλαμικὴ Δημοκρατία τοῦrUAMrXἈρμενίαrUALr XἈλβανίαr UAOr XἈνγκόλαr UANr X(Ὁλλανδικὲς ἈντίλλεςrUAQrXἈνταρκτικήrUASrX#Ἀμερικανικὴ ΣαμόαrUARrXἈργεντινήrUAUrXΑὐστραλίαrUATrXΑὐστρίαrUIOrXAΒρετανικὰ Ἐδάφη Ἰνδικοῦ ὨκεανοῦrUINrX ἸνδίαrUAZrXἈζερμπαϊτζάνrUIErXἸρλανδίαr UIDr!XἸνδονησίαr"uUdecimal_formatsr#}r$U date_formatsr%}r&Ucurrency_symbolsr'}r(UGBPr)X£r*sU time_zonesr+}r,Uscriptsr-}r.(UArabr/XἈραβικόr0UArmnr1XἈρμενικόr2UHebrr3XἙβραϊκόr4UEthir5XΑἰθιοπικόr6UGrekr7XἙλληνικόr8uUvariantsr9}r:Unumber_symbolsr;}r<Ucurrency_namesr=}r>(UDZDr?X Δηνάριο Ἀλγερίαςr@UNADrAX!Δολάριο ΝαμίμπιαςrBUEGPrCXΛίρα ΑἰγύπτουrDUBGLrEX0Μεταλλικὸ Λὲβ ΒουλγαρίαςrFUBGNrGX#Νέο Λὲβ ΒουλγαρίαςrHUPABrIXΜπαλμπόα ΠαναμᾶrJUXBDrKX?Εὐρωπαϊκὴ Μονάδα Λογαριασμοῦ (XBD)rLUXBArMX0Εὐρωπαϊκὴ Σύνθετη ΜονάδαrNUYUDrOX?Μεταλλικὸ Δηνάριο ΓιουγκοσλαβίαςrPUXBCrQX?Εὐρωπαϊκὴ Μονάδα Λογαριασμοῦ (XBC)rRUXBBrSX9Εὐρωπαϊκὴ Νομισματικὴ ΜονάδαrTUAOArUXKwanza ἈνγκόλαςrVUAONrWX+Νέα Kwanza Ἀνγκόλας (1990-2000)rXUYDDrYXΔηνάριο ὙεμένηςrZUAOKr[X$Kwanza Ἀνγκόλας (1977-1990)r\UUAHr]XHryvnia Οὐκρανίαςr^UUAKr_XKarbovanetz Οὐκρανίαςr`UJODraX"Δηνάριο ἸορδανίαςrbUAORrcX/Kwanza Reajustado Ἀνγκόλας (1995-1999)rdUAWGreXΓκίλντα ἈρούμπαrfUHKDrgX%Δολάριο Χὸνγκ ΚόνγκrhUTPEriXἘσκούδο ΤιμόρrjUCHFrkXΦράγκο ἙλβετίαςrlUUYPrmX,Πέσο Οὐρουγουάης (1975-1993)rnUALLroXΛὲκ ἈλβανίαςrpUTHBrqXΜπὰτ ΤαϊλάνδηςrrUISKrsX Κορόνα ἸσλανδίαςrtUZALruX>Ραντ Νότιας Ἀφρικῆς (οἰκονομικό)rvUUYUrwX)Πέσο Uruguayo ΟὐρουγουάηςrxUNIOryX1Χρυσὴ Κόρδοβα ΝικαράγουαςrzUMZEr{X$Ἐσκούδο Μοζαμβίκηςr|USCRr}XΡούπια Σεϋχελῶνr~UZARrX'Ρὰντ Νότιας ἈφρικῆςrUSURrX Σοβιετικὸ ΡούβλιrUBELrX3Φράγκο Βελγίου (οἰκονομικό)rUAEDrXDΝτιρὰμ Ἡνωμένων Ἀραβικῶν ἘμιράτωνrUEEKrXΚορόνα ἘστονίαςrULKRrX!Ρούπια Σρὶ ΛάνκαςrUHUFrX"Φιορίνι ΟὑγγαρίαςrUSZLrX"Lilangeni ΖουαζιλάνδηςrUPTErX&Ἐσκούδο ΠορτογαλίαςrUAMDrXDram ἈρμενίαςrUUGXrX Σελίνι ΟὐγκάνταςrUXDRrX5Εἰδικὰ Δικαιώματα ἈνάληψηςrUNLGrX"Γκίλντα ὉλλανδίαςrUUGSrX,Σελίνι Οὐγκάντας (1966-1987)rUTTDrX9Δολάριο Τρινιδὰδ καὶ ΤομπάγκοrUSHPrX"Λίρα Ἀγίας ἙλένηςrUCSKrX7Σκληρὴ Κορόνα ΤσεχοσλοβακίαςrUYERrXRial ὙεμένηςrUDDMrX1Ostmark Ἀνατολικῆς ΓερμανίαςrUHTGrXGourde ἉϊτῆςrUANGrX8Γκίλντα Ὁλλανδικῶν ἈντιλλῶνrUXCDrX;Δολάριο Ἀνατολικῆς ΚαραϊβικῆςrUMXVrX)Unidad de Inversion (UDI) ΜεξικοῦrUMOPrXPataca ΜακάουrUMXPrX6Ἀσημένιο Πέσο Μεξικοῦ (1861-1992)rUMXNrXΠέσο ΜεξικοῦrUPYGrX(Γκουαρανὶ ΠαραγουάηςrUGWErX3Γκινέα Ἐσκούδο ΠορτογαλίαςrUIDRrX"Ρούπια ἸνδονησίαςrUETBrXBirr ΑἰθιοπίαςrUATSrXΣελίνι ΑὐστρίαςrUILPrXΛίρα ἸσραήλrUTMMrX&Μανὰτ ΤουρκμενιστάνrUXFOrX'Χρυσὸ Φράγκο ΓαλλίαςrUECVrX6Unidad de Valor Constante (UVC) ἸσημερινοῦrUECSrXSucre ἸσημερινοῦrUAUDrX$Δολάριο ΑὐστραλίαςrUADPrXΠεσέτα ἈνδόραςrUIEPrXΛίρα ἸρλανδίαςrUCLFrXUnidades de Fomento ΧιλῆςrUGMDrXDalasi ΓκάμπιαςrUGTQrXQuetzal ΓουατεμάλαςrUVEBrX(Μπολιβὰλ ΒενεζουέλαςrUCLPrXΠέσο ΧιλῆςrUEURrX ΕὐρώrUITLrXΛιρέτα ἸταλίαςrUXEUrX?Εὐρωπαϊκὴ Συναλλαγματικὴ ΜονάδαrUSBDrX/Δολάριο Νήσων ΣολομῶντοςrUWSTrX!Tala Δυτικῆς ΣαμόαςrUAZMrX%Μανὰτ ἈζερμπαϊτζάνrUUSNrX3Δολάριο ΗΠΑ (Ἑπόμενη ἡμέρα)rUGQErX7Ekwele Guineana Ἰσημερινῆς ΓουινέαςrUBADrX5Δηνάριο Βοσνίας-ἙρζεγοβίνηςrUUSSrX-Δολάριο ΗΠΑ (Ἴδια ἡμέρα)rUINRrXΡούπια ἸνδίαςrUIQDrXΔηνάριο ἸράκrUERNrXNakfa ἘρυθραίαςrUBAMrX1Μάρκο Βοσνίας-ἙρζεγοβίνηςrUCADrXΔολάριο ΚαναδᾶrUCVErX6Ἐσκούδο Πράσινου ἈκρωτηρίουrUPGKrX)Kina Παπούα Νέα ΓουινέαςrUUZSrXSum ΟὐζμπεκιστάνrUESPrXΠεσέτα ἹσπανίαςrUIRRrXRial ἸράκrUSVCrXColon Ἒλ ΣαλβαδόρrUFKPrX$Λίρα Νήσων ΦώλκλαντrUARPrX+Πέσο Ἀργεντινῆς (1983-1985)rUARSrXΠέσο ἈργεντινῆςrUILSrXΝέο Sheqel ἸσραήλrUJPYr XΓιὲν Ἰαπωνίαςr UARAr XAustral Ἀργεντινῆςr uUmonthsr }r(U stand-aloner}r(Uwider}r(KXἸανουάριοςrKXἈπρίλιοςrKXἸούνιοςrKXἸούλιοςrKXΑὔγουστοςrK XὈκτώβριοςruU abbreviatedr}r(KXἸανrKXἈπρrKX ἸουνrKX ἸουλrKXΑὐγrK XὈκτr uuUformatr!}r"(Uwider#}r$(KXἸανουαρίουr%KXἈπριλίουr&KXἸουνίουr'KXἸουλίουr(KXΑὐγούστουr)K XὈκτωβρίουr*uU abbreviatedr+}r,(KXἸανr-KXἈπρr.KX Ἰουνr/KX Ἰουλr0KXΑὐγr1K XὈκτr2uuuUcurrency_formatsr3}r4Udaysr5}r6U meta_zonesr7}r8Uerasr9}r:u.PK[n44%site-packages/babel/localedata/tt.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qNX{1} {0}qsUquartersq}qUformatq}q (Uwideq }q (KXQ1q KXQ2q KXQ3qKXQ4quU abbreviatedq}q(KXQ1qKXQ2qKXQ3qKXQ4quusUperiodsq}q(UamqXAMqUpmqXPMquUscientific_formatsq}qUpercent_formatsq}qU week_dataq }q!(Umin_daysq"KU weekend_startq#KU first_dayq$KU weekend_endq%KuU time_formatsq&}q'(Umediumq(cbabel.dates DateTimePattern q))q*}q+(Upatternq,XH:mm:ssq-Uformatq.X%(H)s:%(mm)s:%(ss)sq/ubUfullq0h))q1}q2(h,X h:mm:ss a vq3h.X%(h)s:%(mm)s:%(ss)s %(a)s %(v)sq4ubUlongq5h))q6}q7(h,X H:mm:ss zq8h.X%(H)s:%(mm)s:%(ss)s %(z)sq9ubUshortq:h))q;}q<(h,XH:mmq=h.X %(H)s:%(mm)sq>ubuU languagesq?}q@UttqAX ТатарqBsU territoriesqC}qDURUqEX РоссияqFsUdecimal_formatsqG}qHU date_formatsqI}qJ(UmediumqKh))qL}qM(h,X dd.MM.yyyyqNh.X%(dd)s.%(MM)s.%(yyyy)sqOubUfullqPh))qQ}qR(h,X d MMMM yyyyqSh.X%(d)s %(MMMM)s %(yyyy)sqTubUlongqUh))qV}qW(h,X d MMMM yyyyqXh.X%(d)s %(MMMM)s %(yyyy)sqYubUshortqZh))q[}q\(h,X dd.MM.yyyyq]h.X%(dd)s.%(MM)s.%(yyyy)sq^ubuUcurrency_symbolsq_}q`U time_zonesqa}qbUscriptsqc}qdUvariantsqe}qfUnumber_symbolsqg}qhUcurrency_namesqi}qjUmonthsqk}ql(U stand-aloneqm}qnUnarrowqo}qp(KX1qqKX2qrKX3qsKX4qtKX5quKX6qvKX7qwKX8qxK X9qyK X10qzK X11q{K X12q|usUformatq}}q~(Uwideq}q(KhqKhrKhsKhtKhuKhvKhwKhxK hyK X10qK X11qK X12quU abbreviatedq}q(KhqKhrKhsKhtKhuKhvKhwKhxK hyK X10qK X11qK X12quuuUcurrency_formatsq}qNcbabel.numbers NumberPattern q)q}q(Uexp_precqNUscaleqKU frac_precqKKqUsuffixqX¤qhqUint_precqKKqh,X #,##0.00¤qUprefixqXqX-qqUexp_plusqNUgroupingqKKqubsUdaysq}q(U stand-aloneq}qUnarrowq}q(KhrKhsKhtKhuKhvKhwKhqusUformatq}q(Uwideq}q(KhrKhsKhtKhuKhvKhwKhquU abbreviatedq}q(KhrKhsKhtKhuKhvKhwKhquuuU meta_zonesq}qUerasq}qU abbreviatedq}q(KXBCEqKXCEqusu.PK[ (site-packages/babel/localedata/de_BE.datnu[}q(U zone_formatsq}qUdatetime_formatsq}qUquartersq}qUperiodsq}qUscientific_formatsq }q Upercent_formatsq }q U week_dataq }q(Umin_daysqKU weekend_startqKU first_dayqKU weekend_endqKuU time_formatsq}qUfullqcbabel.dates DateTimePattern q)q}q(UpatternqXHH 'h' mm 'min' ss 's' vqUformatqX"%(HH)s h %(mm)s min %(ss)s s %(v)squbsU languagesq}qU territoriesq}q Udecimal_formatsq!}q"U date_formatsq#}q$(Ufullq%h)q&}q'(hXEEEE d MMMM yyyyq(hX %(EEEE)s %(d)s %(MMMM)s %(yyyy)sq)ubUlongq*h)q+}q,(hX d MMMM yyyyq-hX%(d)s %(MMMM)s %(yyyy)sq.ubUshortq/h)q0}q1(hXd/MM/yyq2hX%(d)s/%(MM)s/%(yy)sq3ubuUcurrency_symbolsq4}q5U time_zonesq6}q7Uscriptsq8}q9Uvariantsq:}q;Unumber_symbolsq<}q=Ucurrency_namesq>}q?UFRFq@XFrankenqAsUmonthsqB}qCUformatqD}qEU abbreviatedqF}qGKXMärqHsssUcurrency_formatsqI}qJUdaysqK}qLUformatqM}qNU abbreviatedqO}qP(KXMonqQKXDieqRKXMitqSKXDonqTKXFreqUKXSamqVKXSonqWussU meta_zonesqX}qYUerasqZ}q[u.PK[1ll(site-packages/babel/localedata/ln_CD.datnu[}q(Ucurrency_symbolsq}qUscientific_formatsq}qUpercent_formatsq}qUnumber_symbolsq}qU week_dataq }q (Umin_daysq KU weekend_startq KU first_dayq KU weekend_endqKuU zone_formatsq}qUcurrency_formatsq}qU languagesq}qU territoriesq}qU time_zonesq}qUscriptsq}qUdecimal_formatsq}qU meta_zonesq}qUvariantsq}q Ucurrency_namesq!}q"u.PK[.oosite-packages/babel/core.pycnu[ Mc@sdZddlZddlZddlmZdddddgZd Zead Z i'd d 6d d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6Z de fdYYZ de fdZYZee d[Zd\e d]Zd\d^ZdS(_s2Core locale representation and locale data access.iN(t localedatatUnknownLocaleErrortLocaletdefault_localetnegotiate_localet parse_localesrestructuredtext encCstdkrrtjjtjjt}tjj|d}t|d}ztj |aWd|j Xntj |iS(sReturn the dictionary for the given key in the global data. The global data is stored in the ``babel/global.dat`` file and contains information independent of individual locales. >>> get_global('zone_aliases')['UTC'] 'Etc/GMT' >>> get_global('zone_territories')['Europe/Berlin'] 'DE' :param key: the data key :return: the dictionary found in the global data under the given key :rtype: `dict` :since: version 0.9 s global.dattrbN( t _global_datatNonetostpathtjointdirnamet__file__topentpickletloadtclosetget(tkeyR tfilenametfileobj((s./usr/lib/python2.7/site-packages/babel/core.pyt get_globals tar_SYtartbg_BGtbgtbs_BAtbstca_EStcatcs_CZtcstda_DKtdatde_DEtdetel_GRtelten_UStentes_EStestet_EEtettfa_IRtfatfi_FItfitfr_FRtfrtgl_EStglthe_ILthethu_HUthutid_IDtidtis_IStistit_ITtittja_JPtjatkm_KHtkmtko_KRtkotlt_LTtlttlv_LVtlvtmk_MKtmktnl_NLtnltnn_NOtnntnb_NOtnotpl_PLtpltpt_PTtpttro_ROtrotru_RUtrutsk_SKtsktsl_SItsltsv_SEtsvtth_THtthttr_TRttrtuk_UAtukcBseZdZdZRS(s[Exception thrown when a locale is requested for which no locale data is available. cCs!tj|d|||_dS(srCreate the exception. :param identifier: the identifier string of the unsupported locale sunknown locale %rN(t Exceptiont__init__t identifier(tselfRg((s./usr/lib/python2.7/site-packages/babel/core.pyRfHs(t__name__t __module__t__doc__Rf(((s./usr/lib/python2.7/site-packages/babel/core.pyRCscBseZdZdDdDdDdZdDedZeeZdedZeeZddZ ee Z dZ dZ dZ d Z d ZeeZdDd Zeed d ZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZd Zeed d!Zd"Zeed d#Zd$Zeed d%Zd&Zeed d'Zd(Zeed d)Zd*Z ee d d+Z d,Z!ee!d d-Z!d.Z"ee"d d/Z"d0Z#ee#d d1Z#d2Z$ee$d d3Z$d4Z%ee%d d5Z%d6Z&ee&d d7Z&d8Z'ee'd d9Z'd:Z(ee(d d;Z(d<Z)ee)d d=Z)d>Z*ee*d d?Z*d@Z+ee+d dAZ+dBZ,ee,d dCZ,RS(EsxRepresentation of a specific locale. >>> locale = Locale('en', 'US') >>> repr(locale) '' >>> locale.display_name u'English (United States)' A `Locale` object can also be instantiated from a raw locale string: >>> locale = Locale.parse('en-US', sep='-') >>> repr(locale) '' `Locale` objects provide access to a collection of locale data, such as territory and language names, number and date format patterns, and more: >>> locale.number_symbols['decimal'] u'.' If a locale is requested for which no locale data is available, an `UnknownLocaleError` is raised: >>> Locale.parse('en_DE') Traceback (most recent call last): ... UnknownLocaleError: unknown locale 'en_DE' :see: `IETF RFC 3066 `_ cCs[||_||_||_||_d|_t|}tj|sWt |ndS(sInitialize the locale object from the given identifier components. >>> locale = Locale('en', 'US') >>> locale.language 'en' >>> locale.territory 'US' :param language: the language code :param territory: the territory (country or region) code :param script: the script code :param variant: the variant code :raise `UnknownLocaleError`: if no locale data is available for the requested locale N( tlanguaget territorytscripttvariantRt _Locale__datatstrRtexistsR(RhRlRmRnRoRg((s./usr/lib/python2.7/site-packages/babel/core.pyRfqs      cCs|t|d|S(sxReturn the system default locale for the specified category. >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: ... os.environ[name] = '' >>> os.environ['LANG'] = 'fr_FR.UTF-8' >>> Locale.default('LC_MESSAGES') :param category: one of the ``LC_XXX`` environment variable names :param aliases: a dictionary of aliases for locale identifiers :return: the value of the variable, or any of the fallbacks (``LANGUAGE``, ``LC_ALL``, ``LC_CTYPE``, and ``LANG``) :rtype: `Locale` :see: `default_locale` taliases(R(tclstcategoryRs((s./usr/lib/python2.7/site-packages/babel/core.pytdefaultst_cCs8t||d|d|}|r4tj|d|SdS(s Find the best match between available and requested locale strings. >>> Locale.negotiate(['de_DE', 'en_US'], ['de_DE', 'de_AT']) >>> Locale.negotiate(['de_DE', 'en_US'], ['en', 'de']) >>> Locale.negotiate(['de_DE', 'de'], ['en_US']) You can specify the character used in the locale identifiers to separate the differnet components. This separator is applied to both lists. Also, case is ignored in the comparison: >>> Locale.negotiate(['de-DE', 'de'], ['en-us', 'de-de'], sep='-') :param preferred: the list of locale identifers preferred by the user :param available: the list of locale identifiers available :param aliases: a dictionary of aliases for locale identifiers :return: the `Locale` object for the best match, or `None` if no match was found :rtype: `Locale` :see: `negotiate_locale` tsepRsN(RRtparse(Rtt preferredt availableRxRsRg((s./usr/lib/python2.7/site-packages/babel/core.pyt negotiates cCs)t|tr%|t|d|S|S(sLCreate a `Locale` instance for the given locale identifier. >>> l = Locale.parse('de-DE', sep='-') >>> l.display_name u'Deutsch (Deutschland)' If the `identifier` parameter is not a string, but actually a `Locale` object, that object is returned: >>> Locale.parse(l) :param identifier: the locale identifier string :param sep: optional component separator :return: a corresponding `Locale` instance :rtype: `Locale` :raise `ValueError`: if the string does not appear to be a valid locale identifier :raise `UnknownLocaleError`: if no locale data is available for the requested locale :see: `parse_locale` Rx(t isinstancet basestringR(RtRgRx((s./usr/lib/python2.7/site-packages/babel/core.pyRyscCst|t|kS(N(Rq(Rhtother((s./usr/lib/python2.7/site-packages/babel/core.pyt__eq__scCs|j| S(N(R(RhR((s./usr/lib/python2.7/site-packages/babel/core.pyt__ne__scCsdt|S(Ns (Rq(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt__repr__scCs.djtd|j|j|j|jgS(NRw(R tfilterRRlRnRmRo(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt__str__scCs:|jdkr3tjtjt||_n|jS(N(RpRRtLocaleDataDictRRq(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt_datas$cCs|dkr|}ntj|}|jj|j}|jsT|jsT|jrg}|jr|j |j j|jn|jr|j |j j|jn|jr|j |j j|jnt d|}|r|ddj|7}qn|S(sReturn the display name of the locale using the given locale. The display name will include the language, territory, script, and variant, if those are specified. >>> Locale('zh', 'CN', script='Hans').get_display_name('en') u'Chinese (Simplified Han, China)' :param locale: the locale to use :return: the display name s (%s)u, N(RRRyt languagesRRlRmRnRotappendtscriptst territoriestvariantsRR (Rhtlocaletretvaltdetails((s./usr/lib/python2.7/site-packages/babel/core.pytget_display_names     tdocs& The localized display name of the locale. >>> Locale('en').display_name u'English' >>> Locale('en', 'US').display_name u'English (United States)' >>> Locale('sv').display_name u'svenska' :type: `unicode` cCs|jtdS(NR((RR(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt english_namess The english display name of the locale. >>> Locale('de').english_name u'German' >>> Locale('de', 'DE').english_name u'German (Germany)' :type: `unicode` cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR$ss Mapping of language codes to translated language names. >>> Locale('de', 'DE').languages['ja'] u'Japanisch' :type: `dict` :see: `ISO 639 `_ cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR0ss Mapping of script codes to translated script names. >>> Locale('en', 'US').scripts['Hira'] u'Hiragana' :type: `dict` :see: `ISO 15924 `_ cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR<ss Mapping of script codes to translated script names. >>> Locale('es', 'CO').territories['DE'] u'Alemania' :type: `dict` :see: `ISO 3166 `_ cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRHss Mapping of script codes to translated script names. >>> Locale('de', 'DE').variants['1901'] u'Alte deutsche Rechtschreibung' :type: `dict` cCs |jdS(Ntcurrency_names(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt currenciesUss Mapping of currency codes to translated currency names. >>> Locale('en').currencies['COP'] u'Colombian Peso' >>> Locale('de', 'DE').currencies['COP'] u'Kolumbianischer Peso' :type: `dict` cCs |jdS(Ntcurrency_symbols(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRbss Mapping of currency codes to symbols. >>> Locale('en', 'US').currency_symbols['USD'] u'$' >>> Locale('es', 'CO').currency_symbols['USD'] u'US$' :type: `dict` cCs |jdS(Ntnumber_symbols(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRoss Symbols used in number formatting. >>> Locale('fr', 'FR').number_symbols['decimal'] u',' :type: `dict` cCs |jdS(Ntdecimal_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRzss Locale patterns for decimal number formatting. >>> Locale('en', 'US').decimal_formats[None] :type: `dict` cCs |jdS(Ntcurrency_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss\ Locale patterns for currency number formatting. >>> print Locale('en', 'US').currency_formats[None] :type: `dict` cCs |jdS(Ntpercent_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale patterns for percent number formatting. >>> Locale('en', 'US').percent_formats[None] :type: `dict` cCs |jdS(Ntscientific_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale patterns for scientific number formatting. >>> Locale('en', 'US').scientific_formats[None] :type: `dict` cCs |jdS(Ntperiods(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for day periods (AM/PM). >>> Locale('en', 'US').periods['am'] u'AM' :type: `dict` cCs |jdS(Ntdays(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for weekdays. >>> Locale('de', 'DE').days['format']['wide'][3] u'Donnerstag' :type: `dict` cCs |jdS(Ntmonths(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for months. >>> Locale('de', 'DE').months['format']['wide'][10] u'Oktober' :type: `dict` cCs |jdS(Ntquarters(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for quarters. >>> Locale('de', 'DE').quarters['format']['wide'][1] u'1. Quartal' :type: `dict` cCs |jdS(Nteras(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for eras. >>> Locale('en', 'US').eras['wide'][1] u'Anno Domini' >>> Locale('en', 'US').eras['abbreviated'][0] u'BC' :type: `dict` cCs |jdS(Nt time_zones(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss' Locale display names for time zones. >>> Locale('en', 'US').time_zones['Europe/London']['long']['daylight'] u'British Summer Time' >>> Locale('en', 'US').time_zones['America/St_Johns']['city'] u"St. John's" :type: `dict` cCs |jdS(Nt meta_zones(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for meta time zones. Meta time zones are basically groups of different Olson time zones that have the same GMT offset and daylight savings time. >>> Locale('en', 'US').meta_zones['Europe_Central']['long']['daylight'] u'Central European Summer Time' :type: `dict` :since: version 0.9 cCs |jdS(Nt zone_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss(\ Patterns related to the formatting of time zones. >>> Locale('en', 'US').zone_formats['fallback'] u'%(1)s (%(0)s)' >>> Locale('pt', 'BR').zone_formats['region'] u'Hor\xe1rio %s' :type: `dict` :since: version 0.9 cCs|jddS(Nt week_datat first_day(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pytfirst_week_day ss The first day of a week, with 0 being Monday. >>> Locale('de', 'DE').first_week_day 0 >>> Locale('en', 'US').first_week_day 6 :type: `int` cCs|jddS(NRt weekend_start(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss The day the weekend starts, with 0 being Monday. >>> Locale('de', 'DE').weekend_start 5 :type: `int` cCs|jddS(NRt weekend_end(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR#ss The day the weekend ends, with 0 being Monday. >>> Locale('de', 'DE').weekend_end 6 :type: `int` cCs|jddS(NRtmin_days(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt min_week_days.ss The minimum number of days in a week so that the week is counted as the first week of a year or month. >>> Locale('de', 'DE').min_week_days 4 :type: `int` cCs |jdS(Nt date_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR:ss Locale patterns for date formatting. >>> Locale('en', 'US').date_formats['short'] >>> Locale('fr', 'FR').date_formats['long'] :type: `dict` cCs |jdS(Nt time_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRGss Locale patterns for time formatting. >>> Locale('en', 'US').time_formats['short'] >>> Locale('fr', 'FR').time_formats['long'] :type: `dict` cCs |jdS(Ntdatetime_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRTss Locale patterns for datetime formatting. >>> Locale('en').datetime_formats[None] u'{1} {0}' >>> Locale('th').datetime_formats[None] u'{1}, {0}' :type: `dict` N(-RiRjRkRRftLOCALE_ALIASESRvt classmethodR|RyRRRRRtpropertyRt display_nameRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s./usr/lib/python2.7/site-packages/babel/core.pyRQs                                                                                  cCs|ddddf}xtd |D]}tj|}|r%|dkrnd|krn|jdd}n|d krd }n|r||kr||}ny d jtd t|SWqtk rqXq%q%Wd S( sReturns the system default locale for a given category, based on environment variables. >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: ... os.environ[name] = '' >>> os.environ['LANG'] = 'fr_FR.UTF-8' >>> default_locale('LC_MESSAGES') 'fr_FR' The "C" or "POSIX" pseudo-locales are treated as aliases for the "en_US_POSIX" locale: >>> os.environ['LC_MESSAGES'] = 'POSIX' >>> default_locale('LC_MESSAGES') 'en_US_POSIX' :param category: one of the ``LC_XXX`` environment variable names :param aliases: a dictionary of aliases for locale identifiers :return: the value of the variable, or any of the fallbacks (``LANGUAGE``, ``LC_ALL``, ``LC_CTYPE``, and ``LANG``) :rtype: `str` tLANGUAGEtLC_ALLtLC_CTYPEtLANGt:itCtPOSIXt en_US_POSIXRwN(RR(RRR tgetenvtsplitR Rt ValueError(RuRstvarnamestnameR((s./usr/lib/python2.7/site-packages/babel/core.pyRbs     Rwc Csg|D]}|r|j^q}x|D]}|j}||krN|S|r|j|}|r|jd|}|j|kr|Sqn|j|}t|dkr,|dj|kr,|dSq,WdS(s Find the best match between available and requested locale strings. >>> negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) 'de_DE' >>> negotiate_locale(['de_DE', 'en_US'], ['en', 'de']) 'de' Case is ignored by the algorithm, the result uses the case of the preferred locale identifier: >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) 'de_DE' >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) 'de_DE' By default, some web browsers unfortunately do not include the territory in the locale identifier for many locales, and some don't even allow the user to easily add the territory. So while you may prefer using qualified locale identifiers in your web-application, they would not normally match the language-only locale sent by such browsers. To workaround that, this function uses a default mapping of commonly used langauge-only locale identifiers to identifiers including the territory: >>> negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US']) 'ja_JP' Some browsers even use an incorrect or outdated language code, such as "no" for Norwegian, where the correct locale identifier would actually be "nb_NO" (Bokmål) or "nn_NO" (Nynorsk). The aliases are intended to take care of such cases, too: >>> negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE']) 'nb_NO' You can override this default mapping by passing a different `aliases` dictionary to this function, or you can bypass the behavior althogher by setting the `aliases` parameter to `None`. :param preferred: the list of locale strings preferred by the user :param available: the list of locale strings available :param sep: character that separates the different parts of the locale strings :param aliases: a dictionary of aliases for locale identifiers :return: the locale identifier for the best match, or `None` if no match was found :rtype: `str` RwiiN(tlowerRtreplaceRtlenR( RzR{RxRstaRtlltaliastparts((s./usr/lib/python2.7/site-packages/babel/core.pyRs1%    ( c Csd|kr%|jddd}nd|krJ|jddd}n|j|}|jdj}|jstd|nd }}}|rt|ddkr|djr|jdj}qn|rat|ddkr&|djr&|jdj}qat|ddkra|dj ra|jd}qan|rt|ddkr|ddj st|dd kr|ddjr|j}qn|rtd |n||||fS( sParse a locale identifier into a tuple of the form:: ``(language, territory, script, variant)`` >>> parse_locale('zh_CN') ('zh', 'CN', None, None) >>> parse_locale('zh_Hans_CN') ('zh', 'CN', 'Hans', None) The default component separator is "_", but a different separator can be specified using the `sep` parameter: >>> parse_locale('zh-CN', sep='-') ('zh', 'CN', None, None) If the identifier cannot be parsed into a locale, a `ValueError` exception is raised: >>> parse_locale('not_a_LOCALE_String') Traceback (most recent call last): ... ValueError: 'not_a_LOCALE_String' is not a valid locale identifier Encoding information and locale modifiers are removed from the identifier: >>> parse_locale('it_IT@euro') ('it', 'IT', None, None) >>> parse_locale('en_US.UTF-8') ('en', 'US', None, None) >>> parse_locale('de_DE.iso885915@euro') ('de', 'DE', None, None) :param identifier: the locale identifier string :param sep: character that separates the different components of the locale identifier :return: the ``(language, territory, script, variant)`` tuple :rtype: `tuple` :raise `ValueError`: if the string does not appear to be a valid locale identifier :see: `IETF RFC 4646 `_ t.iit@sexpected only letters, got %riiiis#%r is not a valid locale identifierN( RtpopRtisalphaRRRttitletuppertisdigit(RgRxRtlangRnRmRo((s./usr/lib/python2.7/site-packages/babel/core.pyRs0+   &&&**(RkR RtbabelRt__all__t __docformat__RRRRReRtobjectRRRR(((s./usr/lib/python2.7/site-packages/babel/core.pyts0     #######(APK[t]/Э44site-packages/babel/util.pyonu[ Mc@sdZddlZddlmZmZddlZddlZy eZWn!ek rmddl m ZnXddl Z ddl Z ddl mZmZeZdddd d d d gZd ZdZejdejZdZdZde jfdYZddddZd efdYZyejjZWne k rfddZnXyddl!m"Z"m#Z#Wne$k rdZ#nXydj%dddZ%Wn e k rdddZ%nXedZ'defd YZ(ydd!l)m*Z*Wn e$k r3e(dd Z*nXed"e j+ Z,e j-rfed"e j. Z/ne,Z/e/e,Z0d#efd$YZ1e1Z2dS(%s&Various utility classes and functions.iN(t timedeltattzinfo(tSet(tiziptimaptdistinctt pathmatchtrelpathtwraptexttodicttUTCtLOCALTZsrestructuredtext enccsEt}x5t|D]'}||kr|V|j|qqWdS(sYield all items in an iterable collection that are distinct. Unlike when using sets for a similar effect, the original ordering of the items in the collection is preserved by this function. >>> print list(distinct([1, 2, 1, 3, 4, 4])) [1, 2, 3, 4] >>> print list(distinct('foobar')) ['f', 'o', 'b', 'a', 'r'] :param iterable: the iterable collection providing the data :return: the distinct items in the collection :rtype: ``iterator`` N(tsettitertadd(titerabletseentitem((s./usr/lib/python2.7/site-packages/babel/util.pyR"s   s([ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)cCs |j}|jdz|j}|jtj}|rV|ttj}ntj|}|syddl }|j |Wnt t fk rqX|j}tj|}n|r|rt dndS|r|j dSdSWd|j|XdS(sDeduce the encoding of a source file from magic comment. It does this in the same way as the `Python interpreter`__ .. __: http://docs.python.org/ref/encodings.html The ``fp`` argument should be a seekable file object. (From Jeff Dairiki) iiNs\python refuses to compile code with both a UTF8 byte-order-mark and a magic encoding commenttutf_8i(ttelltseektreadlinet startswithtcodecstBOM_UTF8tlentPYTHON_MAGIC_COMMENT_retmatchtparsertsuitet ImportErrort SyntaxErrortgrouptNone(tfptpostline1thas_bomtmRtline2((s./usr/lib/python2.7/site-packages/babel/util.pytparse_encoding:s2       cCsidd6dd6dd6dd6d d 6d d 6}g}xcttjd |D]I\}}|dry|j||qO|rO|jtj|qOqOWtjdj|d|jtj d}|dk S(sExtended pathname pattern matching. This function is similar to what is provided by the ``fnmatch`` module in the Python standard library, but: * can match complete (relative or absolute) path names, and not just file names, and * also supports a convenience pattern ("**") to match files at any directory level. Examples: >>> pathmatch('**.py', 'bar.py') True >>> pathmatch('**.py', 'foo/bar/baz.py') True >>> pathmatch('**.py', 'templates/index.html') False >>> pathmatch('**/templates/*.html', 'templates/index.html') True >>> pathmatch('**/templates/*.html', 'templates/foo/bar.html') False :param pattern: the glob pattern :param filename: the path name of the file to match against :return: `True` if the path name matches the pattern, `False` otherwise :rtype: `bool` s[^/]t?s[^/]/s?/s[^/]+t*s[^/]+/s*/s (?:.+/)*?s**/s(?:.+/)*?[^/]+s**s ([?*]+/?)itt$t/N( t enumeratetretsplittappendtescapeRtjointreplacetostsepR!(tpatterntfilenametsymbolstbuftidxtpartR((s./usr/lib/python2.7/site-packages/babel/util.pyRis % .t TextWrappercBseZejdZRS(s((\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))(t__name__t __module__R/tcompilet wordsep_re(((s./usr/lib/python2.7/site-packages/babel/util.pyR=siFR+c Cs.td|d|d|dt}|j|S(s Simple wrapper around the ``textwrap.wrap`` function in the standard library. This version does not wrap lines on hyphens in words. :param text: the text to wrap :param width: the maximum line width :param initial_indent: string that will be prepended to the first line of wrapped output :param subsequent_indent: string that will be prepended to all lines save the first of wrapped output :return: a list of lines :rtype: `list` twidthtinitial_indenttsubsequent_indenttbreak_long_words(R=tFalsetwrap(ttextRBRCRDtwrapper((s./usr/lib/python2.7/site-packages/babel/util.pyRs  cBseZdZddZdZdZdZeZdZ dZ dZ dZ d Z ed Zd Zdd Zd ZdZdZRS(soOrdered dict implementation. :see: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 cCs,tj||pitj||_dS(N(tdictt__init__tkeyst_keys(tselftdata((s./usr/lib/python2.7/site-packages/babel/util.pyRKscCs$tj|||jj|dS(N(RJt __delitem__RMtremove(RNtkey((s./usr/lib/python2.7/site-packages/babel/util.pyRPscCs9tj|||||jkr5|jj|ndS(N(RJt __setitem__RMR1(RNRRR((s./usr/lib/python2.7/site-packages/babel/util.pyRSscCs t|jS(N(R RM(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt__iter__scCstj|g|_dS(N(RJtclearRM(RN((s./usr/lib/python2.7/site-packages/babel/util.pyRUs cCst}|j||S(N(R tupdate(RNtd((s./usr/lib/python2.7/site-packages/babel/util.pytcopys  cCst|j|jS(N(tzipRMtvalues(RN((s./usr/lib/python2.7/site-packages/babel/util.pytitemsscCst|j|jS(N(RRMt itervalues(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt iteritemsscCs|jS(N(RM(RN((s./usr/lib/python2.7/site-packages/babel/util.pyRLscCsO|tkrtj||S||kr,|S|jj|tj|||S(N(tmissingRJtpopRMRQ(RNRRtdefault((s./usr/lib/python2.7/site-packages/babel/util.pyR_s   cCs|jj|tj|S(N(RMRQRJtpopitem(RNRR((s./usr/lib/python2.7/site-packages/babel/util.pyRascCs9tj|||||jkr5|jj|ndS(N(RJt setdefaultRMR1(RNRRtfailobj((s./usr/lib/python2.7/site-packages/babel/util.pyRbscCs+x$|jD]\}}|||R?t__doc__R!RKRPRSRTtiterkeysRURXR[R]RLR^R_RaRbRVRZR\(((s./usr/lib/python2.7/site-packages/babel/util.pyR s"              t.cCstjj|jtj}tjj|jtj}ttjj||g}tjjgt||||}tjj|S(sCompute the relative path to one path from another. >>> relpath('foo/bar.txt', '').replace(os.sep, '/') 'foo/bar.txt' >>> relpath('foo/bar.txt', 'foo').replace(os.sep, '/') 'bar.txt' >>> relpath('foo/bar.txt', 'baz').replace(os.sep, '/') '../foo/bar.txt' :return: the relative path :rtype: `basestring` ( R5tpathtabspathR0R6Rt commonprefixtpardirR3(Rjtstartt start_listt path_listtitrel_list((s./usr/lib/python2.7/site-packages/babel/util.pyRs %(t attrgettert itemgettercsfd}|S(Ncs|S(N((tobj(tname(s./usr/lib/python2.7/site-packages/babel/util.pyt_getitems((RvRw((Rvs./usr/lib/python2.7/site-packages/babel/util.pyRtscCs|j||S(N(trsplit(ta_stringR6tmaxsplit((s./usr/lib/python2.7/site-packages/babel/util.pyRxscCsi|j|}|dks-t||kr1|St||}|j|| }||}|g|S(N(R0R!RR3(RyR6Rztpartstmaxsplit_indextnon_splitted_parttsplitted((s./usr/lib/python2.7/site-packages/babel/util.pyRxs itFixedOffsetTimezonecBsGeZdZddZdZdZdZdZdZ RS(s&Fixed offset in minutes east from UTC.cCs8td||_|dkr+d|}n||_dS(Ntminutess Etc/GMT+%d(Rt_offsetR!tzone(RNtoffsetRv((s./usr/lib/python2.7/site-packages/babel/util.pyRK,s  cCs|jS(N(R(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt__str__2scCsd|j|jfS(Ns(RR(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt__repr__5scCs|jS(N(R(RNtdt((s./usr/lib/python2.7/site-packages/babel/util.pyt utcoffset8scCs|jS(N(R(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyttzname;scCstS(N(tZERO(RNR((s./usr/lib/python2.7/site-packages/babel/util.pytdst>sN( R>R?RgR!RKRRRRR(((s./usr/lib/python2.7/site-packages/babel/util.pyR)s     (R tsecondst LocalTimezonecBs,eZdZdZdZdZRS(cCs|j|rtStSdS(N(t_isdstt DSTOFFSETt STDOFFSET(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyRVscCs|j|rtStSdS(N(RtDSTDIFFR(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyR\scCstj|j|S(N(ttimeRR(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyRbsc Csd|j|j|j|j|j|j|jddf }tj|}tj |}|j dkS(Nii( tyeartmonthtdaythourtminutetsecondtweekdayRtmktimet localtimettm_isdst(RNRttttstamp((s./usr/lib/python2.7/site-packages/babel/util.pyRes (R>R?RRRR(((s./usr/lib/python2.7/site-packages/babel/util.pyRTs   (3RgRtdatetimeRRR5R/R t NameErrortsetsRttextwrapRt itertoolsRRtobjectR^t__all__t __docformat__RR@tVERBOSERR(RR=RRJR RjRtAttributeErrortoperatorRsRtRRxR!RRtpytzR ttimezoneRtdaylighttaltzoneRRRR (((s./usr/lib/python2.7/site-packages/babel/util.pytsf           / 0D         PK[ UHUHsite-packages/babel/numbers.pyonu[ Mc@sdZddlZddlZyddlmZeZWnek rQeZnXddl m Z m Z ddl m Z dddd d d d d gZdZe dZedZedZedZedZedZedZedZedZdedZdedZdedZdedZd efdYZedZ edZ!dZ"d Z#d!e"Z$d"e#Z%d#Z&ej'd$e$e%e&fZ(d%Z)d&d'Z*d(Z+d)e,fd*YZ-dS(+sLocale dependent formatting and parsing of numeric data. The default locale for the functions in this module is determined by the following environment variables, in that order: * ``LC_NUMERIC``, * ``LC_ALL``, and * ``LANG`` iN(tDecimal(tdefault_localetLocale(trsplitt format_numbertformat_decimaltformat_currencytformat_percenttformat_scientifict parse_numbert parse_decimaltNumberFormatErrorsrestructuredtext ent LC_NUMERICcCstj|jj||S(s<Return the name used by the locale for the specified currency. >>> get_currency_name('USD', 'en_US') u'US Dollar' :param currency: the currency code :param locale: the `Locale` object or locale identifier :return: the currency symbol :rtype: `unicode` :since: version 0.9.4 (Rtparset currenciestget(tcurrencytlocale((s1/usr/lib/python2.7/site-packages/babel/numbers.pytget_currency_name,s cCstj|jj||S(sReturn the symbol used by the locale for the specified currency. >>> get_currency_symbol('USD', 'en_US') u'$' :param currency: the currency code :param locale: the `Locale` object or locale identifier :return: the currency symbol :rtype: `unicode` (RR tcurrency_symbolsR(RR((s1/usr/lib/python2.7/site-packages/babel/numbers.pytget_currency_symbol:s cCstj|jjddS(sReturn the symbol used by the locale to separate decimal fractions. >>> get_decimal_symbol('en_US') u'.' :param locale: the `Locale` object or locale identifier :return: the decimal symbol :rtype: `unicode` tdecimalu.(RR tnumber_symbolsR(R((s1/usr/lib/python2.7/site-packages/babel/numbers.pytget_decimal_symbolGs cCstj|jjddS(sReturn the plus sign symbol used by the current locale. >>> get_plus_sign_symbol('en_US') u'+' :param locale: the `Locale` object or locale identifier :return: the plus sign symbol :rtype: `unicode` tplusSignu+(RR RR(R((s1/usr/lib/python2.7/site-packages/babel/numbers.pytget_plus_sign_symbolSs cCstj|jjddS(sReturn the plus sign symbol used by the current locale. >>> get_minus_sign_symbol('en_US') u'-' :param locale: the `Locale` object or locale identifier :return: the plus sign symbol :rtype: `unicode` t minusSignu-(RR RR(R((s1/usr/lib/python2.7/site-packages/babel/numbers.pytget_minus_sign_symbol_s cCstj|jjddS(sReturn the symbol used by the locale to separate mantissa and exponent. >>> get_exponential_symbol('en_US') u'E' :param locale: the `Locale` object or locale identifier :return: the exponential symbol :rtype: `unicode` t exponentialuE(RR RR(R((s1/usr/lib/python2.7/site-packages/babel/numbers.pytget_exponential_symbolks cCstj|jjddS(sReturn the symbol used by the locale to separate groups of thousands. >>> get_group_symbol('en_US') u',' :param locale: the `Locale` object or locale identifier :return: the group symbol :rtype: `unicode` tgroupu,(RR RR(R((s1/usr/lib/python2.7/site-packages/babel/numbers.pytget_group_symbolws cCst|d|S(sReturn the given number formatted for a specific locale. >>> format_number(1099, locale='en_US') u'1,099' :param number: the number to format :param locale: the `Locale` object or locale identifier :return: the formatted number :rtype: `unicode` R(R(tnumberR((s1/usr/lib/python2.7/site-packages/babel/numbers.pyRs cCsFtj|}|s*|jj|}nt|}|j||S(sReturn the given decimal number formatted for a specific locale. >>> format_decimal(1.2345, locale='en_US') u'1.234' >>> format_decimal(1.2346, locale='en_US') u'1.235' >>> format_decimal(-1.2346, locale='en_US') u'-1.235' >>> format_decimal(1.2345, locale='sv_SE') u'1,234' >>> format_decimal(12345, locale='de') u'12.345' The appropriate thousands grouping and the decimal separator are used for each locale: >>> format_decimal(12345.5, locale='en_US') u'12,345.5' :param number: the number to format :param format: :param locale: the `Locale` object or locale identifier :return: the formatted decimal number :rtype: `unicode` (RR tdecimal_formatsRt parse_patterntapply(R tformatRtpattern((s1/usr/lib/python2.7/site-packages/babel/numbers.pyRs  cCsLtj|}|s*|jj|}nt|}|j||d|S(u~Return formatted currency value. >>> format_currency(1099.98, 'USD', locale='en_US') u'$1,099.98' >>> format_currency(1099.98, 'USD', locale='es_CO') u'US$\xa01.099,98' >>> format_currency(1099.98, 'EUR', locale='de_DE') u'1.099,98\xa0\u20ac' The pattern can also be specified explicitly: >>> format_currency(1099.98, 'EUR', u'¤¤ #,##0.00', locale='en_US') u'EUR 1,099.98' :param number: the number to format :param currency: the currency code :param locale: the `Locale` object or locale identifier :return: the formatted currency value :rtype: `unicode` R(RR tcurrency_formatsRR"R#(R RR$RR%((s1/usr/lib/python2.7/site-packages/babel/numbers.pyRs  cCsFtj|}|s*|jj|}nt|}|j||S(sNReturn formatted percent value for a specific locale. >>> format_percent(0.34, locale='en_US') u'34%' >>> format_percent(25.1234, locale='en_US') u'2,512%' >>> format_percent(25.1234, locale='sv_SE') u'2\xa0512\xa0%' The format pattern can also be specified explicitly: >>> format_percent(25.1234, u'#,##0\u2030', locale='en_US') u'25,123\u2030' :param number: the percent number to format :param format: :param locale: the `Locale` object or locale identifier :return: the formatted percent number :rtype: `unicode` (RR tpercent_formatsRR"R#(R R$RR%((s1/usr/lib/python2.7/site-packages/babel/numbers.pyRs  cCsFtj|}|s*|jj|}nt|}|j||S(sReturn value formatted in scientific notation for a specific locale. >>> format_scientific(10000, locale='en_US') u'1E4' The format pattern can also be specified explicitly: >>> format_scientific(1234567, u'##0E00', locale='en_US') u'1.23E06' :param number: the number to format :param format: :param locale: the `Locale` object or locale identifier :return: value formatted in scientific notation. :rtype: `unicode` (RR tscientific_formatsRR"R#(R R$RR%((s1/usr/lib/python2.7/site-packages/babel/numbers.pyRs  cBseZdZRS(s>Exception raised when a string cannot be parsed into a number.(t__name__t __module__t__doc__(((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR scCsHy t|jt|dSWn!tk rCtd|nXdS(s|Parse localized number string into a long integer. >>> parse_number('1,099', locale='en_US') 1099L >>> parse_number('1.099', locale='de_DE') 1099L When the given string cannot be parsed, an exception is raised: >>> parse_number('1.099,98', locale='de') Traceback (most recent call last): ... NumberFormatError: '1.099,98' is not a valid number :param string: the string to parse :param locale: the `Locale` object or locale identifier :return: the parsed number :rtype: `long` :raise `NumberFormatError`: if the string can not be converted to a number ts%r is not a valid numberN(tlongtreplaceRt ValueErrorR (tstringR((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR s  cCsitj|}y2t|jt|djt|dSWn!tk rdtd|nXdS(sParse localized decimal string into a float. >>> parse_decimal('1,099.98', locale='en_US') 1099.98 >>> parse_decimal('1.099,98', locale='de') 1099.98 When the given string cannot be parsed, an exception is raised: >>> parse_decimal('2,109,998', locale='de') Traceback (most recent call last): ... NumberFormatError: '2,109,998' is not a valid decimal number :param string: the string to parse :param locale: the `Locale` object or locale identifier :return: the parsed decimal number :rtype: `float` :raise `NumberFormatError`: if the string can not be converted to a decimal number R,t.s %r is not a valid decimal numberN(RR tfloatR.RRR/R (R0R((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR s  s [^0-9@#.,]s [0-9@#.\-,E+]s(?P(?:'[^']*'|%s)*)s(?P%s+)s(?P.*)s%s%s%scCstr$t|tr$t|}nd|jd}d|krs|jdd\}}|dkrd}qn |d}}||fS(s=Convert a number into a (intasstring, fractionasstring) tuples%.9ft0R1iR,(t have_decimalt isinstanceRtstrtrstriptsplit(tvaluettexttatb((s1/usr/lib/python2.7/site-packages/babel/numbers.pyt split_numberEs    ic Cs&t|dkrdpd}t|}t|\}}||}d}t||}|dks|t|kr}nF||dkrd}n-||dkr||ddkrd}nd|}trt|trtt|||||Stt|||||SdS(sCRound a number to a given precision. Works like round() except that the round-half-even (banker's rounding) algorithm is used instead of round-half-up. >>> bankersround(5.5, 0) 6.0 >>> bankersround(6.5, 0) 6.0 >>> bankersround(-6.5, 0) -6.0 >>> bankersround(1234.0, -2) 1200.0 iiit5t13579i N(tinttabsR=tlenR4R5RR2( R9tndigitstsignR;R<tdigitstaddtitscale((s1/usr/lib/python2.7/site-packages/babel/numbers.pyt bankersroundSs    $   c Cst|tr|Sd|krv|jdd\}}tj|j\}}}tj|j\}}}n.tj|j\}}}d|}|}d|kr|jdd\}}nd}d|krd|krd|krtdqnd|kr.t|dd\} } n |} d } d } } d } d }| | }| | }|r| | | }|j d }|j d }| |}n d}d}|| }t|||f||f|||||S(sParse number format patternst;it-tEt@R1R3s5Significant digit patterns can not contain "@" or "0"R,icSstd}}x]|D]U}|dkr:|d7}|d7}q|dkrS|d7}q|dkreqqPqW||fS(s(Calculate the min and max allowed digitsis@0it#t,((tptmintmaxtc((s1/usr/lib/python2.7/site-packages/babel/numbers.pytparse_precisions        cSst|}|jd}|dkr+dS||d}|| d jd}|dkrg||fS|||d}||fS(sParse primary and secondary digit grouping >>> parse_grouping('##') 0, 0 >>> parse_grouping('#,###') 3, 3 >>> parse_grouping('#,####,###') 3, 4 ROiiii(ii(RBtrfind(RPtwidthtg1tg2((s1/usr/lib/python2.7/site-packages/babel/numbers.pytparse_groupings    t+N( R5t NumberPatternR8t number_retsearchtgroupstNoneR/Rt startswithtlstrip(R%t neg_patternt pos_prefixR t pos_suffixt neg_prefixt_t neg_suffixtexptintegertfractiontmin_fractmax_fracRTRYtint_prect frac_prectexp_plustexp_prectgrouping((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR"tsH !           R[cBsAeZdZdZddZdZdZdZRS(c Cs||_||_||_||_||_||_||_||_ddj|j|jkrsd|_ n4ddj|j|jkrd|_ n d|_ dS(Nt%R,idu‰ii( R%tprefixtsuffixRqRmRnRpRotjoinRH( tselfR%RsRtRqRmRnRpRo((s1/usr/lib/python2.7/site-packages/babel/numbers.pyt__init__s          cCsdt|j|jfS(Ns<%s %r>(ttypeR)R%(Rv((s1/usr/lib/python2.7/site-packages/babel/numbers.pyt__repr__sc CsP||j9}t|dk}|jrt|}|r^ttjtj|d}nd}|jd|jdkr||jdd8}n2|jdrt||jd|jd}nt st |t  rt |}n|dkr |d| }n|d|}d}|dkr;t |}n|j rSt|}nt|}d|j||jd|jdt|||jt||jd|jd|f}n(d|jkrs|jt||jd|jd}d|krX|jd\} } |j| dd|} | rKt|| } n| | }q|j|dd|}nvttt||jd\} } | pd } |j| |jd|jd|} |j| |} | | }d |j|||j|f} d | krL| jd |j} | jd t||} n| S( Nii iR,u%s%s%s%sRMR1iR3u%s%s%su¤u¤¤(RHR@RpRAtmathtfloortlogRmR4R5RR2RRoRt_format_sigdigRnRt _format_intR6R%R8RR=RIt _format_fracRsRtR.tupperR( RvR9RRt is_negativeRhtexp_signR R:R;R<tretval((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR#sh   $ %            cCs t|\}}t|}|dkri|dkrid}x*|jdre|d}|d8}q?Wntt|||\}}t||jd}|sd}nt||kr|dkr|S||kr|d||7}n|rd||fS|S(sConvert value to a string. The resulting string will contain between (min, max) number of significant digits. R3R,iis%s.%s(R=RBR`RIRa(RvR9RQRRR;R<t ndecimalsRE((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR}s$    c Cst|}||kr-d|||}n|jd}d}t|}xAt||kr||| |}|| }|jd}qOW||S(NR3iR,i(RBRqR( RvR9RQRRRRVtgsizetrettsymbol((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR~2s     cCs|j\}}t||kr<|d|t|7}n|dksf|dkrjt|dkrjdSt|}x0t||kr|ddkr|d }qyWt||S(NR3iR,i(RnRBR@R(RvR9RRQRRRV((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR?s* %N( R)R*RwRyR_R#R}R~R(((s1/usr/lib/python2.7/site-packages/babel/numbers.pyR[s    <  (.R+RztreRRtTrueR4t ImportErrortFalset babel.coreRRt babel.utilRt__all__t __docformat__R RRRRRRRRR_RRRRR/R R R t PREFIX_ENDt NUMBER_TOKENtPREFIX_PATTERNtNUMBER_PATTERNtSUFFIX_PATTERNtcompileR\R=RIR"tobjectR[(((s1/usr/lib/python2.7/site-packages/babel/numbers.pytsP                   ! RPK[ DDsite-packages/babel/support.pycnu[ Mc@sdZddlmZmZmZddlZddlmZddlmZm Z m Z m Z ddl m Z mZmZmZmZmZddlmZmZdd d gZd Zdefd YZd efd YZd ejefdYZdS(sSeveral classes and functions that help with integrating and using Babel in applications. .. note: the code in this module is not used by Babel itself i(tdatetdatetimettimeN(tLocale(t format_datetformat_datetimet format_timetLC_TIME(t format_numbertformat_decimaltformat_currencytformat_percenttformat_scientifict LC_NUMERIC(tsettUTCtFormatt LazyProxyt Translationssrestructuredtext encBszeZdZd dZd ddZd ddZd ddZdZd dZ dZ d d Z d Z RS( sWrapper class providing the various date and number formatting functions bound to a specific locale and time-zone. >>> fmt = Format('en_US', UTC) >>> fmt.date(date(2007, 4, 1)) u'Apr 1, 2007' >>> fmt.decimal(1.2345) u'1.234' cCstj||_||_dS(sInitialize the formatter. :param locale: the locale identifier or `Locale` instance :param tzinfo: the time-zone info (a `tzinfo` instance or `None`) N(Rtparsetlocalettzinfo(tselfRR((s1/usr/lib/python2.7/site-packages/babel/support.pyt__init__,stmediumcCst||d|jS(sReturn a date formatted according to the given pattern. >>> fmt = Format('en_US') >>> fmt.date(date(2007, 4, 1)) u'Apr 1, 2007' :see: `babel.dates.format_date` R(RR(RRtformat((s1/usr/lib/python2.7/site-packages/babel/support.pyR5s cCst||d|jd|jS(sHReturn a date and time formatted according to the given pattern. >>> from pytz import timezone >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern')) >>> fmt.datetime(datetime(2007, 4, 1, 15, 30)) u'Apr 1, 2007 11:30:00 AM' :see: `babel.dates.format_datetime` RR(RRR(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pyR@s cCst||d|jd|jS(s+Return a time formatted according to the given pattern. >>> from pytz import timezone >>> fmt = Format('en_US', tzinfo=timezone('US/Eastern')) >>> fmt.time(datetime(2007, 4, 1, 15, 30)) u'11:30:00 AM' :see: `babel.dates.format_time` RR(RRR(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pyRMs cCst|d|jS(sReturn an integer number formatted for the locale. >>> fmt = Format('en_US') >>> fmt.number(1099) u'1,099' :see: `babel.numbers.format_number` R(RR(Rtnumber((s1/usr/lib/python2.7/site-packages/babel/support.pyRYs cCst||d|jS(sReturn a decimal number formatted for the locale. >>> fmt = Format('en_US') >>> fmt.decimal(1.2345) u'1.234' :see: `babel.numbers.format_decimal` R(R R(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pytdecimalds cCst||d|jS(sReturn a number in the given currency formatted for the locale. :see: `babel.numbers.format_currency` R(R R(RRtcurrency((s1/usr/lib/python2.7/site-packages/babel/support.pyRoscCst||d|jS(sReturn a number formatted as percentage for the locale. >>> fmt = Format('en_US') >>> fmt.percent(0.34) u'34%' :see: `babel.numbers.format_percent` R(R R(RRR((s1/usr/lib/python2.7/site-packages/babel/support.pytpercentvs cCst|d|jS(sReturn a number formatted using scientific notation for the locale. :see: `babel.numbers.format_scientific` R(R R(RR((s1/usr/lib/python2.7/site-packages/babel/support.pyt scientificsN( t__name__t __module__t__doc__tNoneRRRRRRRRR(((s1/usr/lib/python2.7/site-packages/babel/support.pyR!s      cBs(eZdZddddgZdZdZeeZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z RS(!sClass for proxy objects that delegate to a specified function to evaluate the actual object. >>> def greeting(name='world'): ... return 'Hello, %s!' % name >>> lazy_greeting = LazyProxy(greeting, name='Joe') >>> print lazy_greeting Hello, Joe! >>> u' ' + lazy_greeting u' Hello, Joe!' >>> u'(%s)' % lazy_greeting u'(Hello, Joe!)' This can be used, for example, to implement lazy translation functions that delay the actual translation until the string is actually used. The rationale for such behavior is that the locale of the user may not always be available. In web applications, you only know the locale when processing a request. The proxy implementation attempts to be as complete as possible, so that the lazy objects should mostly work as expected, for example for sorting: >>> greetings = [ ... LazyProxy(greeting, 'world'), ... LazyProxy(greeting, 'Joe'), ... LazyProxy(greeting, 'universe'), ... ] >>> greetings.sort() >>> for greeting in greetings: ... print greeting Hello, Joe! Hello, universe! Hello, world! t_funct_argst_kwargst_valuecOsPtj|d|tj|d|tj|d|tj|dddS(NR#R$R%R&(tobjectt __setattr__R"(Rtfunctargstkwargs((s1/usr/lib/python2.7/site-packages/babel/support.pyRscCsD|jdkr=|j|j|j}tj|d|n|jS(NR&(R&R"R#R$R%R'R((Rtvalue((s1/usr/lib/python2.7/site-packages/babel/support.pyR,scCs ||jkS(N(R,(Rtkey((s1/usr/lib/python2.7/site-packages/babel/support.pyt __contains__scCs t|jS(N(tboolR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt __nonzero__scCs t|jS(N(tdirR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__dir__scCs t|jS(N(titerR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__iter__scCs t|jS(N(tlenR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__len__scCs t|jS(N(tstrR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__str__scCs t|jS(N(tunicodeR,(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt __unicode__scCs |j|S(N(R,(Rtother((s1/usr/lib/python2.7/site-packages/babel/support.pyt__add__scCs ||jS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__radd__scCs |j|S(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__mod__scCs ||jS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__rmod__scCs |j|S(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__mul__scCs ||jS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__rmul__scOs|j||S(N(R,(RR*R+((s1/usr/lib/python2.7/site-packages/babel/support.pyt__call__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__lt__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__le__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__eq__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__ne__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__gt__scCs |j|kS(N(R,(RR;((s1/usr/lib/python2.7/site-packages/babel/support.pyt__ge__scCst|j|dS(N(tdelattrR,(Rtname((s1/usr/lib/python2.7/site-packages/babel/support.pyt __delattr__scCst|j|S(N(tgetattrR,(RRJ((s1/usr/lib/python2.7/site-packages/babel/support.pyt __getattr__scCst|j||dS(N(tsetattrR,(RRJR,((s1/usr/lib/python2.7/site-packages/babel/support.pyR(scCs|j|=dS(N(R,(RR-((s1/usr/lib/python2.7/site-packages/babel/support.pyt __delitem__scCs |j|S(N(R,(RR-((s1/usr/lib/python2.7/site-packages/babel/support.pyt __getitem__scCs||j|R?R@RARBRCRDRERFRGRHRKRMR(RORPRQ(((s1/usr/lib/python2.7/site-packages/babel/support.pyRs>"                            cBseZdZdZd edZd d edZeeZdZe dZ dZ dZ dZ d Zd Zd Zd ZRS(s&An extended translation catalog class.tmessagescCsMtjj|d|tdt|ddg|_||_i|_dS(sInitialize the translations catalog. :param fileobj: the file-like object the translation should be read from tfpRJN( tgettexttGNUTranslationsRtfilterR"RLtfilestdomaint_domains(RtfileobjRZ((s1/usr/lib/python2.7/site-packages/babel/support.pyRs! cCs|dk rOt|ttfs-|g}ng|D]}t|^q4}n|sa|j}ntj|||}|stjS|dt |dd|S(sLoad translations from the given directory. :param dirname: the directory containing the ``MO`` files :param locales: the list of locales in order of preference (items in this list can be either `Locale` objects or locale strings) :param domain: the message domain :return: the loaded catalog, or a ``NullTranslations`` instance if no matching translations were found :rtype: `Translations` R\trbRZN( R"t isinstancetlistttupleR7tDEFAULT_DOMAINRVtfindtNullTranslationstopen(tclstdirnametlocalesRZRtfilename((s1/usr/lib/python2.7/site-packages/babel/support.pytloads  "  cCs#dt|j|jjdfS(Ns <%s: "%s">sproject-id-version(ttypeRt_infotget(R((s1/usr/lib/python2.7/site-packages/babel/support.pyt__repr__3scCst|d|j}|r7||jkr7|j|S|jj|}|rk|dk rk|j|n|j|||j|<|S(sAdd the given translations to the catalog. If the domain of the translations is different than that of the current catalog, they are added as a catalog that is only accessible by the various ``d*gettext`` functions. :param translations: the `Translations` instance with the messages to add :param merge: whether translations for message domains that have already been added should be merged with the existing translations :return: the `Translations` instance (``self``) so that `merge` calls can be easily chained :rtype: `Translations` RZN(RLRaRZtmergeR[RlR"t add_fallback(Rt translationsRnRZtexisting((s1/usr/lib/python2.7/site-packages/babel/support.pytadd7s   cCsQt|tjrM|jj|jt|trM|jj|jqMn|S(sMerge the given translations into the catalog. Message translations in the specified catalog override any messages with the same identifier in the existing catalog. :param translations: the `Translations` instance with the messages to merge :return: the `Translations` instance (``self``) so that `merge` calls can be easily chained :rtype: `Translations` (R^RVRWt_catalogtupdateRRYtextend(RRp((s1/usr/lib/python2.7/site-packages/babel/support.pyRnTs cCs|jj||j|S(sULike ``gettext()``, but look the message up in the specified domain. (R[RlRV(RRZtmessage((s1/usr/lib/python2.7/site-packages/babel/support.pytdgettextgscCs|jj||j|S(sWLike ``lgettext()``, but look the message up in the specified domain. (R[Rltlgettext(RRZRv((s1/usr/lib/python2.7/site-packages/babel/support.pyt ldgettextmscCs|jj||j|S(sVLike ``ugettext()``, but look the message up in the specified domain. (R[Rltugettext(RRZRv((s1/usr/lib/python2.7/site-packages/babel/support.pyt dugettextsscCs"|jj||j|||S(sVLike ``ngettext()``, but look the message up in the specified domain. (R[Rltngettext(RRZtsingulartpluraltnum((s1/usr/lib/python2.7/site-packages/babel/support.pyt dngettextyscCs"|jj||j|||S(sWLike ``lngettext()``, but look the message up in the specified domain. (R[Rlt lngettext(RRZR}R~R((s1/usr/lib/python2.7/site-packages/babel/support.pyt ldngettextscCs"|jj||j|||S(sVLike ``ungettext()`` but look the message up in the specified domain. (R[Rlt ungettext(RRZR}R~R((s1/usr/lib/python2.7/site-packages/babel/support.pyt dungettextsN(RR R!RaR"RRit classmethodRmtTrueRrRnRwRyR{RRR(((s1/usr/lib/python2.7/site-packages/babel/support.pyR s          (R!RRRRVt babel.coreRt babel.datesRRRRt babel.numbersRR R R R R t babel.utilRRt__all__t __docformat__R'RRRWR(((s1/usr/lib/python2.7/site-packages/babel/support.pyts ".hPK[i말site-packages/babel/dates.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2007 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://babel.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision # history and logs, available at http://babel.edgewall.org/log/. """Locale dependent formatting and parsing of dates and times. The default locale for the functions in this module is determined by the following environment variables, in that order: * ``LC_TIME``, * ``LC_ALL``, and * ``LANG`` """ from datetime import date, datetime, time, timedelta, tzinfo import re from babel.core import default_locale, get_global, Locale from babel.util import UTC __all__ = ['format_date', 'format_datetime', 'format_time', 'get_timezone_name', 'parse_date', 'parse_datetime', 'parse_time'] __docformat__ = 'restructuredtext en' LC_TIME = default_locale('LC_TIME') # Aliases for use in scopes where the modules are shadowed by local variables date_ = date datetime_ = datetime time_ = time def get_period_names(locale=LC_TIME): """Return the names for day periods (AM/PM) used by the locale. >>> get_period_names(locale='en_US')['am'] u'AM' :param locale: the `Locale` object, or a locale string :return: the dictionary of period names :rtype: `dict` """ return Locale.parse(locale).periods def get_day_names(width='wide', context='format', locale=LC_TIME): """Return the day names used by the locale for the specified format. >>> get_day_names('wide', locale='en_US')[1] u'Tuesday' >>> get_day_names('abbreviated', locale='es')[1] u'mar' >>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1] u'D' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of day names :rtype: `dict` """ return Locale.parse(locale).days[context][width] def get_month_names(width='wide', context='format', locale=LC_TIME): """Return the month names used by the locale for the specified format. >>> get_month_names('wide', locale='en_US')[1] u'January' >>> get_month_names('abbreviated', locale='es')[1] u'ene' >>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1] u'J' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of month names :rtype: `dict` """ return Locale.parse(locale).months[context][width] def get_quarter_names(width='wide', context='format', locale=LC_TIME): """Return the quarter names used by the locale for the specified format. >>> get_quarter_names('wide', locale='en_US')[1] u'1st quarter' >>> get_quarter_names('abbreviated', locale='de_DE')[1] u'Q1' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of quarter names :rtype: `dict` """ return Locale.parse(locale).quarters[context][width] def get_era_names(width='wide', locale=LC_TIME): """Return the era names used by the locale for the specified format. >>> get_era_names('wide', locale='en_US')[1] u'Anno Domini' >>> get_era_names('abbreviated', locale='de_DE')[1] u'n. Chr.' :param width: the width to use, either "wide", "abbreviated", or "narrow" :param locale: the `Locale` object, or a locale string :return: the dictionary of era names :rtype: `dict` """ return Locale.parse(locale).eras[width] def get_date_format(format='medium', locale=LC_TIME): """Return the date formatting patterns used by the locale for the specified format. >>> get_date_format(locale='en_US') >>> get_date_format('full', locale='de_DE') :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the date format pattern :rtype: `DateTimePattern` """ return Locale.parse(locale).date_formats[format] def get_datetime_format(format='medium', locale=LC_TIME): """Return the datetime formatting patterns used by the locale for the specified format. >>> get_datetime_format(locale='en_US') u'{1} {0}' :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the datetime format pattern :rtype: `unicode` """ patterns = Locale.parse(locale).datetime_formats if format not in patterns: format = None return patterns[format] def get_time_format(format='medium', locale=LC_TIME): """Return the time formatting patterns used by the locale for the specified format. >>> get_time_format(locale='en_US') >>> get_time_format('full', locale='de_DE') :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the time format pattern :rtype: `DateTimePattern` """ return Locale.parse(locale).time_formats[format] def get_timezone_gmt(datetime=None, width='long', locale=LC_TIME): """Return the timezone associated with the given `datetime` object formatted as string indicating the offset from GMT. >>> dt = datetime(2007, 4, 1, 15, 30) >>> get_timezone_gmt(dt, locale='en') u'GMT+00:00' >>> from pytz import timezone >>> tz = timezone('America/Los_Angeles') >>> dt = datetime(2007, 4, 1, 15, 30, tzinfo=tz) >>> get_timezone_gmt(dt, locale='en') u'GMT-08:00' >>> get_timezone_gmt(dt, 'short', locale='en') u'-0800' The long format depends on the locale, for example in France the acronym UTC string is used instead of GMT: >>> get_timezone_gmt(dt, 'long', locale='fr_FR') u'UTC-08:00' :param datetime: the ``datetime`` object; if `None`, the current date and time in UTC is used :param width: either "long" or "short" :param locale: the `Locale` object, or a locale string :return: the GMT offset representation of the timezone :rtype: `unicode` :since: version 0.9 """ if datetime is None: datetime = datetime_.utcnow() elif isinstance(datetime, (int, long)): datetime = datetime_.utcfromtimestamp(datetime).time() if datetime.tzinfo is None: datetime = datetime.replace(tzinfo=UTC) locale = Locale.parse(locale) offset = datetime.tzinfo.utcoffset(datetime) seconds = offset.days * 24 * 60 * 60 + offset.seconds hours, seconds = divmod(seconds, 3600) if width == 'short': pattern = u'%+03d%02d' else: pattern = locale.zone_formats['gmt'] % '%+03d:%02d' return pattern % (hours, seconds // 60) def get_timezone_location(dt_or_tzinfo=None, locale=LC_TIME): """Return a representation of the given timezone using "location format". The result depends on both the local display name of the country and the city associated with the time zone: >>> from pytz import timezone >>> tz = timezone('America/St_Johns') >>> get_timezone_location(tz, locale='de_DE') u"Kanada (St. John's)" >>> tz = timezone('America/Mexico_City') >>> get_timezone_location(tz, locale='de_DE') u'Mexiko (Mexiko-Stadt)' If the timezone is associated with a country that uses only a single timezone, just the localized country name is returned: >>> tz = timezone('Europe/Berlin') >>> get_timezone_name(tz, locale='de_DE') u'Deutschland' :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines the timezone; if `None`, the current date and time in UTC is assumed :param locale: the `Locale` object, or a locale string :return: the localized timezone name using location format :rtype: `unicode` :since: version 0.9 """ if dt_or_tzinfo is None or isinstance(dt_or_tzinfo, (int, long)): dt = None tzinfo = UTC elif isinstance(dt_or_tzinfo, (datetime, time)): dt = dt_or_tzinfo if dt.tzinfo is not None: tzinfo = dt.tzinfo else: tzinfo = UTC else: dt = None tzinfo = dt_or_tzinfo locale = Locale.parse(locale) if hasattr(tzinfo, 'zone'): zone = tzinfo.zone else: zone = tzinfo.tzname(dt or datetime.utcnow()) # Get the canonical time-zone code zone = get_global('zone_aliases').get(zone, zone) info = locale.time_zones.get(zone, {}) # Otherwise, if there is only one timezone for the country, return the # localized country name region_format = locale.zone_formats['region'] territory = get_global('zone_territories').get(zone) if territory not in locale.territories: territory = 'ZZ' # invalid/unknown territory_name = locale.territories[territory] if territory and len(get_global('territory_zones').get(territory, [])) == 1: return region_format % (territory_name) # Otherwise, include the city in the output fallback_format = locale.zone_formats['fallback'] if 'city' in info: city_name = info['city'] else: metazone = get_global('meta_zones').get(zone) metazone_info = locale.meta_zones.get(metazone, {}) if 'city' in metazone_info: city_name = metainfo['city'] elif '/' in zone: city_name = zone.split('/', 1)[1].replace('_', ' ') else: city_name = zone.replace('_', ' ') return region_format % (fallback_format % { '0': city_name, '1': territory_name }) def get_timezone_name(dt_or_tzinfo=None, width='long', uncommon=False, locale=LC_TIME): r"""Return the localized display name for the given timezone. The timezone may be specified using a ``datetime`` or `tzinfo` object. >>> from pytz import timezone >>> dt = time(15, 30, tzinfo=timezone('America/Los_Angeles')) >>> get_timezone_name(dt, locale='en_US') u'Pacific Standard Time' >>> get_timezone_name(dt, width='short', locale='en_US') u'PST' If this function gets passed only a `tzinfo` object and no concrete `datetime`, the returned display name is indenpendent of daylight savings time. This can be used for example for selecting timezones, or to set the time of events that recur across DST changes: >>> tz = timezone('America/Los_Angeles') >>> get_timezone_name(tz, locale='en_US') u'Pacific Time' >>> get_timezone_name(tz, 'short', locale='en_US') u'PT' If no localized display name for the timezone is available, and the timezone is associated with a country that uses only a single timezone, the name of that country is returned, formatted according to the locale: >>> tz = timezone('Europe/Berlin') >>> get_timezone_name(tz, locale='de_DE') u'Deutschland' >>> get_timezone_name(tz, locale='pt_BR') u'Hor\xe1rio Alemanha' On the other hand, if the country uses multiple timezones, the city is also included in the representation: >>> tz = timezone('America/St_Johns') >>> get_timezone_name(tz, locale='de_DE') u"Kanada (St. John's)" The `uncommon` parameter can be set to `True` to enable the use of timezone representations that are not commonly used by the requested locale. For example, while in French the central European timezone is usually abbreviated as "HEC", in Canadian French, this abbreviation is not in common use, so a generic name would be chosen by default: >>> tz = timezone('Europe/Paris') >>> get_timezone_name(tz, 'short', locale='fr_CA') u'France' >>> get_timezone_name(tz, 'short', uncommon=True, locale='fr_CA') u'HEC' :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines the timezone; if a ``tzinfo`` object is used, the resulting display name will be generic, i.e. independent of daylight savings time; if `None`, the current date in UTC is assumed :param width: either "long" or "short" :param uncommon: whether even uncommon timezone abbreviations should be used :param locale: the `Locale` object, or a locale string :return: the timezone display name :rtype: `unicode` :since: version 0.9 :see: `LDML Appendix J: Time Zone Display Names `_ """ if dt_or_tzinfo is None or isinstance(dt_or_tzinfo, (int, long)): dt = None tzinfo = UTC elif isinstance(dt_or_tzinfo, (datetime, time)): dt = dt_or_tzinfo if dt.tzinfo is not None: tzinfo = dt.tzinfo else: tzinfo = UTC else: dt = None tzinfo = dt_or_tzinfo locale = Locale.parse(locale) if hasattr(tzinfo, 'zone'): zone = tzinfo.zone else: zone = tzinfo.tzname(dt) # Get the canonical time-zone code zone = get_global('zone_aliases').get(zone, zone) info = locale.time_zones.get(zone, {}) # Try explicitly translated zone names first if width in info: if dt is None: field = 'generic' else: dst = tzinfo.dst(dt) if dst is None: field = 'generic' elif dst == 0: field = 'standard' else: field = 'daylight' if field in info[width]: return info[width][field] metazone = get_global('meta_zones').get(zone) if metazone: metazone_info = locale.meta_zones.get(metazone, {}) if width in metazone_info and (uncommon or metazone_info.get('common')): if dt is None: field = 'generic' else: field = tzinfo.dst(dt) and 'daylight' or 'standard' if field in metazone_info[width]: return metazone_info[width][field] # If we have a concrete datetime, we assume that the result can't be # independent of daylight savings time, so we return the GMT offset if dt is not None: return get_timezone_gmt(dt, width=width, locale=locale) return get_timezone_location(dt_or_tzinfo, locale=locale) def format_date(date=None, format='medium', locale=LC_TIME): """Return a date formatted according to the given pattern. >>> d = date(2007, 04, 01) >>> format_date(d, locale='en_US') u'Apr 1, 2007' >>> format_date(d, format='full', locale='de_DE') u'Sonntag, 1. April 2007' If you don't want to use the locale default formats, you can specify a custom date pattern: >>> format_date(d, "EEE, MMM d, ''yy", locale='en') u"Sun, Apr 1, '07" :param date: the ``date`` or ``datetime`` object; if `None`, the current date is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param locale: a `Locale` object or a locale identifier :rtype: `unicode` :note: If the pattern contains time fields, an `AttributeError` will be raised when trying to apply the formatting. This is also true if the value of ``date`` parameter is actually a ``datetime`` object, as this function automatically converts that to a ``date``. """ if date is None: date = date_.today() elif isinstance(date, datetime): date = date.date() locale = Locale.parse(locale) if format in ('full', 'long', 'medium', 'short'): format = get_date_format(format, locale=locale) pattern = parse_pattern(format) return pattern.apply(date, locale) def format_datetime(datetime=None, format='medium', tzinfo=None, locale=LC_TIME): """Return a date formatted according to the given pattern. >>> dt = datetime(2007, 04, 01, 15, 30) >>> format_datetime(dt, locale='en_US') u'Apr 1, 2007 3:30:00 PM' For any pattern requiring the display of the time-zone, the third-party ``pytz`` package is needed to explicitly specify the time-zone: >>> from pytz import timezone >>> format_datetime(dt, 'full', tzinfo=timezone('Europe/Paris'), ... locale='fr_FR') u'dimanche 1 avril 2007 17:30:00 HEC' >>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz", ... tzinfo=timezone('US/Eastern'), locale='en') u'2007.04.01 AD at 11:30:00 EDT' :param datetime: the `datetime` object; if `None`, the current date and time is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param tzinfo: the timezone to apply to the time for display :param locale: a `Locale` object or a locale identifier :rtype: `unicode` """ if datetime is None: datetime = datetime_.utcnow() elif isinstance(datetime, (int, long)): datetime = datetime_.utcfromtimestamp(datetime) elif isinstance(datetime, time): datetime = datetime_.combine(date.today(), datetime) if datetime.tzinfo is None: datetime = datetime.replace(tzinfo=UTC) if tzinfo is not None: datetime = datetime.astimezone(tzinfo) if hasattr(tzinfo, 'normalize'): # pytz datetime = tzinfo.normalize(datetime) locale = Locale.parse(locale) if format in ('full', 'long', 'medium', 'short'): return get_datetime_format(format, locale=locale) \ .replace('{0}', format_time(datetime, format, tzinfo=None, locale=locale)) \ .replace('{1}', format_date(datetime, format, locale=locale)) else: return parse_pattern(format).apply(datetime, locale) def format_time(time=None, format='medium', tzinfo=None, locale=LC_TIME): """Return a time formatted according to the given pattern. >>> t = time(15, 30) >>> format_time(t, locale='en_US') u'3:30:00 PM' >>> format_time(t, format='short', locale='de_DE') u'15:30' If you don't want to use the locale default formats, you can specify a custom time pattern: >>> format_time(t, "hh 'o''clock' a", locale='en') u"03 o'clock PM" For any pattern requiring the display of the time-zone, the third-party ``pytz`` package is needed to explicitly specify the time-zone: >>> from pytz import timezone >>> t = datetime(2007, 4, 1, 15, 30) >>> tzinfo = timezone('Europe/Paris') >>> t = tzinfo.localize(t) >>> format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR') u'15:30:00 HEC' >>> format_time(t, "hh 'o''clock' a, zzzz", tzinfo=timezone('US/Eastern'), ... locale='en') u"09 o'clock AM, Eastern Daylight Time" As that example shows, when this function gets passed a ``datetime.datetime`` value, the actual time in the formatted string is adjusted to the timezone specified by the `tzinfo` parameter. If the ``datetime`` is "naive" (i.e. it has no associated timezone information), it is assumed to be in UTC. These timezone calculations are **not** performed if the value is of type ``datetime.time``, as without date information there's no way to determine what a given time would translate to in a different timezone without information about whether daylight savings time is in effect or not. This means that time values are left as-is, and the value of the `tzinfo` parameter is only used to display the timezone name if needed: >>> t = time(15, 30) >>> format_time(t, format='full', tzinfo=timezone('Europe/Paris'), ... locale='fr_FR') u'15:30:00 HEC' >>> format_time(t, format='full', tzinfo=timezone('US/Eastern'), ... locale='en_US') u'3:30:00 PM ET' :param time: the ``time`` or ``datetime`` object; if `None`, the current time in UTC is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param tzinfo: the time-zone to apply to the time for display :param locale: a `Locale` object or a locale identifier :rtype: `unicode` :note: If the pattern contains date fields, an `AttributeError` will be raised when trying to apply the formatting. This is also true if the value of ``time`` parameter is actually a ``datetime`` object, as this function automatically converts that to a ``time``. """ if time is None: time = datetime.utcnow() elif isinstance(time, (int, long)): time = datetime.utcfromtimestamp(time) if time.tzinfo is None: time = time.replace(tzinfo=UTC) if isinstance(time, datetime): if tzinfo is not None: time = time.astimezone(tzinfo) if hasattr(tzinfo, 'normalize'): # pytz time = tzinfo.normalize(time) time = time.timetz() elif tzinfo is not None: time = time.replace(tzinfo=tzinfo) locale = Locale.parse(locale) if format in ('full', 'long', 'medium', 'short'): format = get_time_format(format, locale=locale) return parse_pattern(format).apply(time, locale) def parse_date(string, locale=LC_TIME): """Parse a date from a string. This function uses the date format for the locale as a hint to determine the order in which the date fields appear in the string. >>> parse_date('4/1/04', locale='en_US') datetime.date(2004, 4, 1) >>> parse_date('01.04.2004', locale='de_DE') datetime.date(2004, 4, 1) :param string: the string containing the date :param locale: a `Locale` object or a locale identifier :return: the parsed date :rtype: `date` """ # TODO: try ISO format first? format = get_date_format(locale=locale).pattern.lower() year_idx = format.index('y') month_idx = format.index('m') if month_idx < 0: month_idx = format.index('l') day_idx = format.index('d') indexes = [(year_idx, 'Y'), (month_idx, 'M'), (day_idx, 'D')] indexes.sort() indexes = dict([(item[1], idx) for idx, item in enumerate(indexes)]) # FIXME: this currently only supports numbers, but should also support month # names, both in the requested locale, and english numbers = re.findall('(\d+)', string) year = numbers[indexes['Y']] if len(year) == 2: year = 2000 + int(year) else: year = int(year) month = int(numbers[indexes['M']]) day = int(numbers[indexes['D']]) if month > 12: month, day = day, month return date(year, month, day) def parse_datetime(string, locale=LC_TIME): """Parse a date and time from a string. This function uses the date and time formats for the locale as a hint to determine the order in which the time fields appear in the string. :param string: the string containing the date and time :param locale: a `Locale` object or a locale identifier :return: the parsed date/time :rtype: `datetime` """ raise NotImplementedError def parse_time(string, locale=LC_TIME): """Parse a time from a string. This function uses the time format for the locale as a hint to determine the order in which the time fields appear in the string. >>> parse_time('15:30:00', locale='en_US') datetime.time(15, 30) :param string: the string containing the time :param locale: a `Locale` object or a locale identifier :return: the parsed time :rtype: `time` """ # TODO: try ISO format first? format = get_time_format(locale=locale).pattern.lower() hour_idx = format.index('h') if hour_idx < 0: hour_idx = format.index('k') min_idx = format.index('m') sec_idx = format.index('s') indexes = [(hour_idx, 'H'), (min_idx, 'M'), (sec_idx, 'S')] indexes.sort() indexes = dict([(item[1], idx) for idx, item in enumerate(indexes)]) # FIXME: support 12 hour clock, and 0-based hour specification # and seconds should be optional, maybe minutes too # oh, and time-zones, of course numbers = re.findall('(\d+)', string) hour = int(numbers[indexes['H']]) minute = int(numbers[indexes['M']]) second = int(numbers[indexes['S']]) return time(hour, minute, second) class DateTimePattern(object): def __init__(self, pattern, format): self.pattern = pattern self.format = format def __repr__(self): return '<%s %r>' % (type(self).__name__, self.pattern) def __unicode__(self): return self.pattern def __mod__(self, other): assert type(other) is DateTimeFormat return self.format % other def apply(self, datetime, locale): return self % DateTimeFormat(datetime, locale) class DateTimeFormat(object): def __init__(self, value, locale): assert isinstance(value, (date, datetime, time)) if isinstance(value, (datetime, time)) and value.tzinfo is None: value = value.replace(tzinfo=UTC) self.value = value self.locale = Locale.parse(locale) def __getitem__(self, name): char = name[0] num = len(name) if char == 'G': return self.format_era(char, num) elif char in ('y', 'Y', 'u'): return self.format_year(char, num) elif char in ('Q', 'q'): return self.format_quarter(char, num) elif char in ('M', 'L'): return self.format_month(char, num) elif char in ('w', 'W'): return self.format_week(char, num) elif char == 'd': return self.format(self.value.day, num) elif char == 'D': return self.format_day_of_year(num) elif char == 'F': return self.format_day_of_week_in_month() elif char in ('E', 'e', 'c'): return self.format_weekday(char, num) elif char == 'a': return self.format_period(char) elif char == 'h': if self.value.hour % 12 == 0: return self.format(12, num) else: return self.format(self.value.hour % 12, num) elif char == 'H': return self.format(self.value.hour, num) elif char == 'K': return self.format(self.value.hour % 12, num) elif char == 'k': if self.value.hour == 0: return self.format(24, num) else: return self.format(self.value.hour, num) elif char == 'm': return self.format(self.value.minute, num) elif char == 's': return self.format(self.value.second, num) elif char == 'S': return self.format_frac_seconds(num) elif char == 'A': return self.format_milliseconds_in_day(num) elif char in ('z', 'Z', 'v', 'V'): return self.format_timezone(char, num) else: raise KeyError('Unsupported date/time field %r' % char) def format_era(self, char, num): width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[max(3, num)] era = int(self.value.year >= 0) return get_era_names(width, self.locale)[era] def format_year(self, char, num): value = self.value.year if char.isupper(): week = self.get_week_number(self.get_day_of_year()) if week == 0: value -= 1 year = self.format(value, num) if num == 2: year = year[-2:] return year def format_quarter(self, char, num): quarter = (self.value.month - 1) // 3 + 1 if num <= 2: return ('%%0%dd' % num) % quarter width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num] context = {'Q': 'format', 'q': 'stand-alone'}[char] return get_quarter_names(width, context, self.locale)[quarter] def format_month(self, char, num): if num <= 2: return ('%%0%dd' % num) % self.value.month width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num] context = {'M': 'format', 'L': 'stand-alone'}[char] return get_month_names(width, context, self.locale)[self.value.month] def format_week(self, char, num): if char.islower(): # week of year day_of_year = self.get_day_of_year() week = self.get_week_number(day_of_year) if week == 0: date = self.value - timedelta(days=day_of_year) week = self.get_week_number(self.get_day_of_year(date), date.weekday()) return self.format(week, num) else: # week of month week = self.get_week_number(self.value.day) if week == 0: date = self.value - timedelta(days=self.value.day) week = self.get_week_number(date.day, date.weekday()) pass return '%d' % week def format_weekday(self, char, num): if num < 3: if char.islower(): value = 7 - self.locale.first_week_day + self.value.weekday() return self.format(value % 7 + 1, num) num = 3 weekday = self.value.weekday() width = {3: 'abbreviated', 4: 'wide', 5: 'narrow'}[num] context = {3: 'format', 4: 'format', 5: 'stand-alone'}[num] return get_day_names(width, context, self.locale)[weekday] def format_day_of_year(self, num): return self.format(self.get_day_of_year(), num) def format_day_of_week_in_month(self): return '%d' % ((self.value.day - 1) / 7 + 1) def format_period(self, char): period = {0: 'am', 1: 'pm'}[int(self.value.hour >= 12)] return get_period_names(locale=self.locale)[period] def format_frac_seconds(self, num): value = str(self.value.microsecond) return self.format(round(float('.%s' % value), num) * 10**num, num) def format_milliseconds_in_day(self, num): msecs = self.value.microsecond // 1000 + self.value.second * 1000 + \ self.value.minute * 60000 + self.value.hour * 3600000 return self.format(msecs, num) def format_timezone(self, char, num): width = {3: 'short', 4: 'long'}[max(3, num)] if char == 'z': return get_timezone_name(self.value, width, locale=self.locale) elif char == 'Z': return get_timezone_gmt(self.value, width, locale=self.locale) elif char == 'v': return get_timezone_name(self.value.tzinfo, width, locale=self.locale) elif char == 'V': if num == 1: return get_timezone_name(self.value.tzinfo, width, uncommon=True, locale=self.locale) return get_timezone_location(self.value.tzinfo, locale=self.locale) def format(self, value, length): return ('%%0%dd' % length) % value def get_day_of_year(self, date=None): if date is None: date = self.value return (date - date_(date.year, 1, 1)).days + 1 def get_week_number(self, day_of_period, day_of_week=None): """Return the number of the week of a day within a period. This may be the week number in a year or the week number in a month. Usually this will return a value equal to or greater than 1, but if the first week of the period is so short that it actually counts as the last week of the previous period, this function will return 0. >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('de_DE')) >>> format.get_week_number(6) 1 >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('en_US')) >>> format.get_week_number(6) 2 :param day_of_period: the number of the day in the period (usually either the day of month or the day of year) :param day_of_week: the week day; if ommitted, the week day of the current date is assumed """ if day_of_week is None: day_of_week = self.value.weekday() first_day = (day_of_week - self.locale.first_week_day - day_of_period + 1) % 7 if first_day < 0: first_day += 7 week_number = (day_of_period + first_day - 1) / 7 if 7 - first_day >= self.locale.min_week_days: week_number += 1 return week_number PATTERN_CHARS = { 'G': [1, 2, 3, 4, 5], # era 'y': None, 'Y': None, 'u': None, # year 'Q': [1, 2, 3, 4], 'q': [1, 2, 3, 4], # quarter 'M': [1, 2, 3, 4, 5], 'L': [1, 2, 3, 4, 5], # month 'w': [1, 2], 'W': [1], # week 'd': [1, 2], 'D': [1, 2, 3], 'F': [1], 'g': None, # day 'E': [1, 2, 3, 4, 5], 'e': [1, 2, 3, 4, 5], 'c': [1, 3, 4, 5], # week day 'a': [1], # period 'h': [1, 2], 'H': [1, 2], 'K': [1, 2], 'k': [1, 2], # hour 'm': [1, 2], # minute 's': [1, 2], 'S': None, 'A': None, # second 'z': [1, 2, 3, 4], 'Z': [1, 2, 3, 4], 'v': [1, 4], 'V': [1, 4] # zone } def parse_pattern(pattern): """Parse date, time, and datetime format patterns. >>> parse_pattern("MMMMd").format u'%(MMMM)s%(d)s' >>> parse_pattern("MMM d, yyyy").format u'%(MMM)s %(d)s, %(yyyy)s' Pattern can contain literal strings in single quotes: >>> parse_pattern("H:mm' Uhr 'z").format u'%(H)s:%(mm)s Uhr %(z)s' An actual single quote can be used by using two adjacent single quote characters: >>> parse_pattern("hh' o''clock'").format u"%(hh)s o'clock" :param pattern: the formatting pattern to parse """ if type(pattern) is DateTimePattern: return pattern result = [] quotebuf = None charbuf = [] fieldchar = [''] fieldnum = [0] def append_chars(): result.append(''.join(charbuf).replace('%', '%%')) del charbuf[:] def append_field(): limit = PATTERN_CHARS[fieldchar[0]] if limit and fieldnum[0] not in limit: raise ValueError('Invalid length for field: %r' % (fieldchar[0] * fieldnum[0])) result.append('%%(%s)s' % (fieldchar[0] * fieldnum[0])) fieldchar[0] = '' fieldnum[0] = 0 for idx, char in enumerate(pattern.replace("''", '\0')): if quotebuf is None: if char == "'": # quote started if fieldchar[0]: append_field() elif charbuf: append_chars() quotebuf = [] elif char in PATTERN_CHARS: if charbuf: append_chars() if char == fieldchar[0]: fieldnum[0] += 1 else: if fieldchar[0]: append_field() fieldchar[0] = char fieldnum[0] = 1 else: if fieldchar[0]: append_field() charbuf.append(char) elif quotebuf is not None: if char == "'": # end of quote charbuf.extend(quotebuf) quotebuf = None else: # inside quote quotebuf.append(char) if fieldchar[0]: append_field() elif charbuf: append_chars() return DateTimePattern(pattern, u''.join(result).replace('\0', "'")) PK[ο255site-packages/babel/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2007-2008 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://babel.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision # history and logs, available at http://babel.edgewall.org/log/. """Integrated collection of utilities that assist in internationalizing and localizing applications. This package is basically composed of two major parts: * tools to build and work with ``gettext`` message catalogs * a Python interface to the CLDR (Common Locale Data Repository), providing access to various locale display names, localized number and date formatting, etc. :see: http://www.gnu.org/software/gettext/ :see: http://docs.python.org/lib/module-gettext.html :see: http://www.unicode.org/cldr/ """ from babel.core import * __docformat__ = 'restructuredtext en' try: from pkg_resources import get_distribution, ResolutionError try: __version__ = get_distribution('Babel').version except ResolutionError: __version__ = None # unknown except ImportError: __version__ = None # unknown PK[۝Vsite-packages/babel/dates.pycnu[ Mc@sdZddlmZmZmZmZmZddlZddlmZm Z m Z ddl m Z dddd d d d gZ d ZedZeZeZeZedZddedZddedZddedZdedZdedZdedZdedZddedZdedZddeedZddedZ dddedZ!ddded Z"ed!Z#ed"Z$ed#Z%d$e&fd%YZ'd&e&fd'YZ(id(d)d*d+d,gd-6dd.6dd/6dd06d(d)d*d+gd16d(d)d*d+gd26d(d)d*d+d,gd36d(d)d*d+d,gd46d(d)gd56d(gd66d(d)gd76d(d)d*gd86d(gd96dd:6d(d)d*d+d,gd;6d(d)d*d+d,gd<6d(d*d+d,gd=6d(gd>6d(d)gd?6d(d)gd@6d(d)gdA6d(d)gdB6d(d)gdC6d(d)gdD6ddE6ddF6d(d)d*d+gdG6d(d)d*d+gdH6d(d+gdI6d(d+gdJ6Z)dKZ*dS(LsLocale dependent formatting and parsing of dates and times. The default locale for the functions in this module is determined by the following environment variables, in that order: * ``LC_TIME``, * ``LC_ALL``, and * ``LANG`` i(tdatetdatetimettimet timedeltattzinfoN(tdefault_localet get_globaltLocale(tUTCt format_datetformat_datetimet format_timetget_timezone_namet parse_datetparse_datetimet parse_timesrestructuredtext entLC_TIMEcCstj|jS(sReturn the names for day periods (AM/PM) used by the locale. >>> get_period_names(locale='en_US')['am'] u'AM' :param locale: the `Locale` object, or a locale string :return: the dictionary of period names :rtype: `dict` (Rtparsetperiods(tlocale((s//usr/lib/python2.7/site-packages/babel/dates.pytget_period_names)s twidetformatcCstj|j||S(s*Return the day names used by the locale for the specified format. >>> get_day_names('wide', locale='en_US')[1] u'Tuesday' >>> get_day_names('abbreviated', locale='es')[1] u'mar' >>> get_day_names('narrow', context='stand-alone', locale='de_DE')[1] u'D' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of day names :rtype: `dict` (RRtdays(twidthtcontextR((s//usr/lib/python2.7/site-packages/babel/dates.pyt get_day_names5scCstj|j||S(s4Return the month names used by the locale for the specified format. >>> get_month_names('wide', locale='en_US')[1] u'January' >>> get_month_names('abbreviated', locale='es')[1] u'ene' >>> get_month_names('narrow', context='stand-alone', locale='de_DE')[1] u'J' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of month names :rtype: `dict` (RRtmonths(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_month_namesGscCstj|j||S(sReturn the quarter names used by the locale for the specified format. >>> get_quarter_names('wide', locale='en_US')[1] u'1st quarter' >>> get_quarter_names('abbreviated', locale='de_DE')[1] u'Q1' :param width: the width to use, one of "wide", "abbreviated", or "narrow" :param context: the context, either "format" or "stand-alone" :param locale: the `Locale` object, or a locale string :return: the dictionary of quarter names :rtype: `dict` (RRtquarters(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_quarter_namesYscCstj|j|S(sReturn the era names used by the locale for the specified format. >>> get_era_names('wide', locale='en_US')[1] u'Anno Domini' >>> get_era_names('abbreviated', locale='de_DE')[1] u'n. Chr.' :param width: the width to use, either "wide", "abbreviated", or "narrow" :param locale: the `Locale` object, or a locale string :return: the dictionary of era names :rtype: `dict` (RRteras(RR((s//usr/lib/python2.7/site-packages/babel/dates.pyt get_era_namesis tmediumcCstj|j|S(sReturn the date formatting patterns used by the locale for the specified format. >>> get_date_format(locale='en_US') >>> get_date_format('full', locale='de_DE') :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the date format pattern :rtype: `DateTimePattern` (RRt date_formats(RR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_date_formatxscCs/tj|j}||kr'd}n||S(sReturn the datetime formatting patterns used by the locale for the specified format. >>> get_datetime_format(locale='en_US') u'{1} {0}' :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the datetime format pattern :rtype: `unicode` N(RRtdatetime_formatstNone(RRtpatterns((s//usr/lib/python2.7/site-packages/babel/dates.pytget_datetime_formats   cCstj|j|S(sReturn the time formatting patterns used by the locale for the specified format. >>> get_time_format(locale='en_US') >>> get_time_format('full', locale='de_DE') :param format: the format to use, one of "full", "long", "medium", or "short" :param locale: the `Locale` object, or a locale string :return: the time format pattern :rtype: `DateTimePattern` (RRt time_formats(RR((s//usr/lib/python2.7/site-packages/babel/dates.pytget_time_formatstlongcCs|d krtj}n-t|ttfrHtj|j}n|jd krl|j dt }nt j |}|jj |}|jddd|j}t|d\}}|dkrd}n|jdd}|||dfS( sReturn the timezone associated with the given `datetime` object formatted as string indicating the offset from GMT. >>> dt = datetime(2007, 4, 1, 15, 30) >>> get_timezone_gmt(dt, locale='en') u'GMT+00:00' >>> from pytz import timezone >>> tz = timezone('America/Los_Angeles') >>> dt = datetime(2007, 4, 1, 15, 30, tzinfo=tz) >>> get_timezone_gmt(dt, locale='en') u'GMT-08:00' >>> get_timezone_gmt(dt, 'short', locale='en') u'-0800' The long format depends on the locale, for example in France the acronym UTC string is used instead of GMT: >>> get_timezone_gmt(dt, 'long', locale='fr_FR') u'UTC-08:00' :param datetime: the ``datetime`` object; if `None`, the current date and time in UTC is used :param width: either "long" or "short" :param locale: the `Locale` object, or a locale string :return: the GMT offset representation of the timezone :rtype: `unicode` :since: version 0.9 Rii<itshortu %+03d%02dtgmts %+03d:%02dN(R%t datetime_tutcnowt isinstancetintR*tutcfromtimestampRRtreplaceRRRt utcoffsetRtsecondstdivmodt zone_formats(RRRtoffsetR4thourstpattern((s//usr/lib/python2.7/site-packages/babel/dates.pytget_timezone_gmts   c Cs,|dks!t|ttfr0d}t}nKt|ttfro|}|jdk rf|j}q{t}n d}|}tj |}t |dr|j }n|j |ptj }tdj||}|jj|i}|jd}tdj|}||jkr'd}n|j|}|rfttdj|gdkrf||S|jd} d |kr|d } ntd j|} |jj| i} d | krtd } nCd |kr|jd ddjd d } n|jd d } || i| d6|d6S(sHReturn a representation of the given timezone using "location format". The result depends on both the local display name of the country and the city associated with the time zone: >>> from pytz import timezone >>> tz = timezone('America/St_Johns') >>> get_timezone_location(tz, locale='de_DE') u"Kanada (St. John's)" >>> tz = timezone('America/Mexico_City') >>> get_timezone_location(tz, locale='de_DE') u'Mexiko (Mexiko-Stadt)' If the timezone is associated with a country that uses only a single timezone, just the localized country name is returned: >>> tz = timezone('Europe/Berlin') >>> get_timezone_name(tz, locale='de_DE') u'Deutschland' :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines the timezone; if `None`, the current date and time in UTC is assumed :param locale: the `Locale` object, or a locale string :return: the localized timezone name using location format :rtype: `unicode` :since: version 0.9 tzonet zone_aliasestregiontzone_territoriestZZtterritory_zonesitfallbacktcityt meta_zonest/t_t t0t1N(R%R/R0R*RRRRRRthasattrR;ttznameR.Rtgett time_zonesR6t territoriestlenRCtmetainfotsplitR2( t dt_or_tzinfoRtdtRR;tinfot region_formatt territorytterritory_nametfallback_formatt city_nametmetazonet metazone_info((s//usr/lib/python2.7/site-packages/babel/dates.pytget_timezone_locationsH!       *      % c Cs5|d ks!t|ttfr0d }t}nKt|ttfro|}|jd k rf|j}q{t}n d }|}tj |}t |dr|j }n|j |}t dj||}|jj|i}||kr`|d krd}n?|j|} | d kr&d}n| dkr;d}nd}|||kr`|||Snt dj|} | r|jj| i} || kr|s| jdr|d krd}n|j|rdpd}|| |kr| ||Sqn|d k r%t|d |d |St|d |S( s Return the localized display name for the given timezone. The timezone may be specified using a ``datetime`` or `tzinfo` object. >>> from pytz import timezone >>> dt = time(15, 30, tzinfo=timezone('America/Los_Angeles')) >>> get_timezone_name(dt, locale='en_US') u'Pacific Standard Time' >>> get_timezone_name(dt, width='short', locale='en_US') u'PST' If this function gets passed only a `tzinfo` object and no concrete `datetime`, the returned display name is indenpendent of daylight savings time. This can be used for example for selecting timezones, or to set the time of events that recur across DST changes: >>> tz = timezone('America/Los_Angeles') >>> get_timezone_name(tz, locale='en_US') u'Pacific Time' >>> get_timezone_name(tz, 'short', locale='en_US') u'PT' If no localized display name for the timezone is available, and the timezone is associated with a country that uses only a single timezone, the name of that country is returned, formatted according to the locale: >>> tz = timezone('Europe/Berlin') >>> get_timezone_name(tz, locale='de_DE') u'Deutschland' >>> get_timezone_name(tz, locale='pt_BR') u'Hor\xe1rio Alemanha' On the other hand, if the country uses multiple timezones, the city is also included in the representation: >>> tz = timezone('America/St_Johns') >>> get_timezone_name(tz, locale='de_DE') u"Kanada (St. John's)" The `uncommon` parameter can be set to `True` to enable the use of timezone representations that are not commonly used by the requested locale. For example, while in French the central European timezone is usually abbreviated as "HEC", in Canadian French, this abbreviation is not in common use, so a generic name would be chosen by default: >>> tz = timezone('Europe/Paris') >>> get_timezone_name(tz, 'short', locale='fr_CA') u'France' >>> get_timezone_name(tz, 'short', uncommon=True, locale='fr_CA') u'HEC' :param dt_or_tzinfo: the ``datetime`` or ``tzinfo`` object that determines the timezone; if a ``tzinfo`` object is used, the resulting display name will be generic, i.e. independent of daylight savings time; if `None`, the current date in UTC is assumed :param width: either "long" or "short" :param uncommon: whether even uncommon timezone abbreviations should be used :param locale: the `Locale` object, or a locale string :return: the timezone display name :rtype: `unicode` :since: version 0.9 :see: `LDML Appendix J: Time Zone Display Names `_ R;R<tgenericitstandardtdaylightRCtcommonRRN(R%R/R0R*RRRRRRRIR;RJRRKRLtdstRCR:R[( RQRtuncommonRRRRR;RStfieldR`RYRZ((s//usr/lib/python2.7/site-packages/babel/dates.pyR -sNB!           !   cCs|dkrtj}nt|tr9|j}ntj|}|dkrit|d|}nt |}|j ||S(sReturn a date formatted according to the given pattern. >>> d = date(2007, 04, 01) >>> format_date(d, locale='en_US') u'Apr 1, 2007' >>> format_date(d, format='full', locale='de_DE') u'Sonntag, 1. April 2007' If you don't want to use the locale default formats, you can specify a custom date pattern: >>> format_date(d, "EEE, MMM d, ''yy", locale='en') u"Sun, Apr 1, '07" :param date: the ``date`` or ``datetime`` object; if `None`, the current date is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param locale: a `Locale` object or a locale identifier :rtype: `unicode` :note: If the pattern contains time fields, an `AttributeError` will be raised when trying to apply the formatting. This is also true if the value of ``date`` parameter is actually a ``datetime`` object, as this function automatically converts that to a ``date``. tfullR*R!R+RN(RcslongR!sshort( R%tdate_ttodayR/RRRRR#t parse_patterntapply(RRRR9((s//usr/lib/python2.7/site-packages/babel/dates.pyR s   c CsP|d krtj}nQt|ttfrBtj|}n*t|trltjt j |}n|j d kr|j dt }n|d k r|j|}t|dr|j|}qntj|}|d kr6t|d|j dt||dd d|j d t||d|St|j||Sd S( s(Return a date formatted according to the given pattern. >>> dt = datetime(2007, 04, 01, 15, 30) >>> format_datetime(dt, locale='en_US') u'Apr 1, 2007 3:30:00 PM' For any pattern requiring the display of the time-zone, the third-party ``pytz`` package is needed to explicitly specify the time-zone: >>> from pytz import timezone >>> format_datetime(dt, 'full', tzinfo=timezone('Europe/Paris'), ... locale='fr_FR') u'dimanche 1 avril 2007 17:30:00 HEC' >>> format_datetime(dt, "yyyy.MM.dd G 'at' HH:mm:ss zzz", ... tzinfo=timezone('US/Eastern'), locale='en') u'2007.04.01 AD at 11:30:00 EDT' :param datetime: the `datetime` object; if `None`, the current date and time is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param tzinfo: the timezone to apply to the time for display :param locale: a `Locale` object or a locale identifier :rtype: `unicode` Rt normalizeRcR*R!R+Rs{0}s{1}N(sfullslongsmediumsshort(R%R-R.R/R0R*R1RtcombineRReRR2Rt astimezoneRIRhRRR'R R RfRg(RRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR s&    cCs*|dkrtj}n't|ttfrBtj|}n|jdkrf|jdt }nt|tr|dk r|j |}t |dr|j |}qn|j }n!|dk r|jd|}ntj|}|d krt|d|}nt|j||S( s Return a time formatted according to the given pattern. >>> t = time(15, 30) >>> format_time(t, locale='en_US') u'3:30:00 PM' >>> format_time(t, format='short', locale='de_DE') u'15:30' If you don't want to use the locale default formats, you can specify a custom time pattern: >>> format_time(t, "hh 'o''clock' a", locale='en') u"03 o'clock PM" For any pattern requiring the display of the time-zone, the third-party ``pytz`` package is needed to explicitly specify the time-zone: >>> from pytz import timezone >>> t = datetime(2007, 4, 1, 15, 30) >>> tzinfo = timezone('Europe/Paris') >>> t = tzinfo.localize(t) >>> format_time(t, format='full', tzinfo=tzinfo, locale='fr_FR') u'15:30:00 HEC' >>> format_time(t, "hh 'o''clock' a, zzzz", tzinfo=timezone('US/Eastern'), ... locale='en') u"09 o'clock AM, Eastern Daylight Time" As that example shows, when this function gets passed a ``datetime.datetime`` value, the actual time in the formatted string is adjusted to the timezone specified by the `tzinfo` parameter. If the ``datetime`` is "naive" (i.e. it has no associated timezone information), it is assumed to be in UTC. These timezone calculations are **not** performed if the value is of type ``datetime.time``, as without date information there's no way to determine what a given time would translate to in a different timezone without information about whether daylight savings time is in effect or not. This means that time values are left as-is, and the value of the `tzinfo` parameter is only used to display the timezone name if needed: >>> t = time(15, 30) >>> format_time(t, format='full', tzinfo=timezone('Europe/Paris'), ... locale='fr_FR') u'15:30:00 HEC' >>> format_time(t, format='full', tzinfo=timezone('US/Eastern'), ... locale='en_US') u'3:30:00 PM ET' :param time: the ``time`` or ``datetime`` object; if `None`, the current time in UTC is used :param format: one of "full", "long", "medium", or "short", or a custom date/time pattern :param tzinfo: the time-zone to apply to the time for display :param locale: a `Locale` object or a locale identifier :rtype: `unicode` :note: If the pattern contains date fields, an `AttributeError` will be raised when trying to apply the formatting. This is also true if the value of ``time`` parameter is actually a ``datetime`` object, as this function automatically converts that to a ``time``. RRhRcR*R!R+RN(sfullslongsmediumsshort(R%RR.R/R0R*R1RR2RRjRIRhttimetzRRR)RfRg(RRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR s$>    c Cshtd|jj}|jd}|jd}|dkrT|jd}n|jd}|df|df|d fg}|jtgt|D]\}}|d |f^q}tjd |} | |d} t | d krd t | } n t | } t | |d} t | |d } | dkrX| | } } nt | | | S(sParse a date from a string. This function uses the date format for the locale as a hint to determine the order in which the date fields appear in the string. >>> parse_date('4/1/04', locale='en_US') datetime.date(2004, 4, 1) >>> parse_date('01.04.2004', locale='de_DE') datetime.date(2004, 4, 1) :param string: the string containing the date :param locale: a `Locale` object or a locale identifier :return: the parsed date :rtype: `date` RtytmitltdtYtMtDis(\d+)iii ( R#R9tlowertindextsorttdictt enumeratetretfindallRNR0R( tstringRRtyear_idxt month_idxtday_idxtindexestidxtitemtnumberstyeartmonthtday((s//usr/lib/python2.7/site-packages/babel/dates.pyR Ps& ! 5  cCs tdS(swParse a date and time from a string. This function uses the date and time formats for the locale as a hint to determine the order in which the time fields appear in the string. :param string: the string containing the date and time :param locale: a `Locale` object or a locale identifier :return: the parsed date/time :rtype: `datetime` N(tNotImplementedError(RzR((s//usr/lib/python2.7/site-packages/babel/dates.pyR{s c Cs!td|jj}|jd}|dkrE|jd}n|jd}|jd}|df|df|d fg}|jtgt|D]\}}|d |f^q}tjd |} t | |d} t | |d} t | |d } t | | | S( sParse a time from a string. This function uses the time format for the locale as a hint to determine the order in which the time fields appear in the string. >>> parse_time('15:30:00', locale='en_US') datetime.time(15, 30) :param string: the string containing the time :param locale: a `Locale` object or a locale identifier :return: the parsed time :rtype: `time` RthitkRmtstHRqtSis(\d+)( R)R9RsRtRuRvRwRxRyR0R( RzRRthour_idxtmin_idxtsec_idxR~RRRthourtminutetsecond((s//usr/lib/python2.7/site-packages/babel/dates.pyRs ! 5tDateTimePatterncBs5eZdZdZdZdZdZRS(cCs||_||_dS(N(R9R(tselfR9R((s//usr/lib/python2.7/site-packages/babel/dates.pyt__init__s cCsdt|j|jfS(Ns<%s %r>(ttypet__name__R9(R((s//usr/lib/python2.7/site-packages/babel/dates.pyt__repr__scCs|jS(N(R9(R((s//usr/lib/python2.7/site-packages/babel/dates.pyt __unicode__scCs#t|tkst|j|S(N(RtDateTimeFormattAssertionErrorR(Rtother((s//usr/lib/python2.7/site-packages/babel/dates.pyt__mod__scCs|t||S(N(R(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRgs(Rt __module__RRRRRg(((s//usr/lib/python2.7/site-packages/babel/dates.pyRs     RcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZddZddZRS(cCsvt|tttfstt|ttfrW|jdkrW|jdt}n||_ t j ||_ dS(NR( R/RRRRRR%R2RtvalueRRR(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs $ cCs|d}t|}|dkr2|j||S|d"krN|j||S|d#krj|j||S|d$kr|j||S|d%kr|j||S|d kr|j|jj|S|d kr|j |S|dkr|j S|d&kr|j ||S|dkr(|j |S|dkrw|jj ddkrZ|jd|S|j|jj d|Sn1|dkr|j|jj |S|dkr|j|jj d|S|dkr|jj dkr|jd|S|j|jj |Sn|dkr(|j|jj|S|dkrJ|j|jj|S|dkrc|j|S|dkr||j|S|d'kr|j||Std!|dS((NitGRlRptutQtqRqtLtwtWRoRrtFtEtetctaRi RtKRiRmRRtAtztZtvtVsUnsupported date/time field %r(RlRpR(RR(RqR(RR(RRR(RRRR(RNt format_erat format_yeartformat_quartert format_montht format_weekRRRtformat_day_of_yeartformat_day_of_week_in_monthtformat_weekdayt format_periodRRRtformat_frac_secondstformat_milliseconds_in_daytformat_timezonetKeyError(Rtnametchartnum((s//usr/lib/python2.7/site-packages/babel/dates.pyt __getitem__sZ                          cCsTidd6dd6dd6td|}t|jjdk}t||j|S(Nt abbreviatediRitnarrowii(tmaxR0RRR R(RRRRtera((s//usr/lib/python2.7/site-packages/babel/dates.pyRs(cCsx|jj}|jrI|j|j}|dkrI|d8}qIn|j||}|dkrt|d}n|S(Niiii(RRtisuppertget_week_numbertget_day_of_yearR(RRRRtweekR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs     cCs~|jjddd}|dkr0d||Sidd6dd6dd 6|}id d 6d d 6|}t|||j|S(Niiis%%0%ddRRiRiRRs stand-aloneR(RRRR(RRRtquarterRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR s   cCsr|dkrd||jjSidd6dd6dd6|}id d 6d d 6|}t|||j|jjS( Nis%%0%ddRiRiRiRRqs stand-aloneR(RRRR(RRRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs  cCs|jr}|j}|j|}|dkrm|jtd|}|j|j||j}n|j||S|j|jj}|dkr|jtd|jj}|j|j|j}nd|SdS(NiRs%d(tislowerRRRRtweekdayRR(RRRt day_of_yearRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRs    cCs|dkrV|jrMd|jj|jj}|j|dd|Sd}n|jj}idd6dd6dd6|}id d6d d6d d6|}t|||j|S( NiiiRRiRiRs stand-alone(RRtfirst_week_dayRRRR(RRRRRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyR,s   cCs|j|j|S(N(RR(RR((s//usr/lib/python2.7/site-packages/babel/dates.pyR7scCsd|jjdddS(Ns%dii(RR(R((s//usr/lib/python2.7/site-packages/babel/dates.pyR:scCs>idd6dd6t|jjdk}td|j|S(Ntamitpmii R(R0RRRR(RRtperiod((s//usr/lib/python2.7/site-packages/babel/dates.pyR=s*cCs=t|jj}|jttd||d||S(Ns.%si (tstrRt microsecondRtroundtfloat(RRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRAscCsJ|jjd|jjd|jjd|jjd}|j||S(Nii`i6(RRRRRR(RRtmsecs((s//usr/lib/python2.7/site-packages/babel/dates.pyREs:cCsidd6dd6td|}|dkrFt|j|d|jS|dkrkt|j|d|jS|dkrt|jj|d|jS|d kr|d krt|jj|d td|jSt|jjd|jSdS( NR+iR*iRRRRRiRa(RR RRR:RtTrueR[(RRRR((s//usr/lib/python2.7/site-packages/babel/dates.pyRJs!      cCs d||S(Ns%%0%dd((RRtlength((s//usr/lib/python2.7/site-packages/babel/dates.pyRYscCs6|dkr|j}n|t|jddjdS(Ni(R%RRdRR(RR((s//usr/lib/python2.7/site-packages/babel/dates.pyR\s  cCs|dkr|jj}n||jj|dd}|dkrS|d7}n||dd}d||jjkr|d7}n|S(sReturn the number of the week of a day within a period. This may be the week number in a year or the week number in a month. Usually this will return a value equal to or greater than 1, but if the first week of the period is so short that it actually counts as the last week of the previous period, this function will return 0. >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('de_DE')) >>> format.get_week_number(6) 1 >>> format = DateTimeFormat(date(2006, 1, 8), Locale.parse('en_US')) >>> format.get_week_number(6) 2 :param day_of_period: the number of the day in the period (usually either the day of month or the day of year) :param day_of_week: the week day; if ommitted, the week day of the current date is assumed iiiN(R%RRRRt min_week_days(Rt day_of_periodt day_of_weekt first_dayt week_number((s//usr/lib/python2.7/site-packages/babel/dates.pyRas    N(RRRRRRRRRRRRRRRRRR%RR(((s//usr/lib/python2.7/site-packages/babel/dates.pyRs"  2            iiiiiRRlRpRRRRqRRRRoRrRtgRRRRRRRRRmRRRRRRRcst|tkr|Sgd }gdgdgfd}fd}x7t|jddD]\}}|d krY|dkrdr|nr|ng}q|tkr5r|n|dkr dcd7>> parse_pattern("MMMMd").format u'%(MMMM)s%(d)s' >>> parse_pattern("MMM d, yyyy").format u'%(MMM)s %(d)s, %(yyyy)s' Pattern can contain literal strings in single quotes: >>> parse_pattern("H:mm' Uhr 'z").format u'%(H)s:%(mm)s Uhr %(z)s' An actual single quote can be used by using two adjacent single quote characters: >>> parse_pattern("hh' o''clock'").format u"%(hh)s o'clock" :param pattern: the formatting pattern to parse tics*jdjjdd2dS(NRt%s%%(tappendtjoinR2((tcharbuftresult(s//usr/lib/python2.7/site-packages/babel/dates.pyt append_charss"csxtd}|rCd|krCtdddnjddddds\(    /R  y&  0R + %&,.? 4 CPK[_9((site-packages/babel/util.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2007 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://babel.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision # history and logs, available at http://babel.edgewall.org/log/. """Various utility classes and functions.""" import codecs from datetime import timedelta, tzinfo import os import re try: set = set except NameError: from sets import Set as set import textwrap import time from itertools import izip, imap missing = object() __all__ = ['distinct', 'pathmatch', 'relpath', 'wraptext', 'odict', 'UTC', 'LOCALTZ'] __docformat__ = 'restructuredtext en' def distinct(iterable): """Yield all items in an iterable collection that are distinct. Unlike when using sets for a similar effect, the original ordering of the items in the collection is preserved by this function. >>> print list(distinct([1, 2, 1, 3, 4, 4])) [1, 2, 3, 4] >>> print list(distinct('foobar')) ['f', 'o', 'b', 'a', 'r'] :param iterable: the iterable collection providing the data :return: the distinct items in the collection :rtype: ``iterator`` """ seen = set() for item in iter(iterable): if item not in seen: yield item seen.add(item) # Regexp to match python magic encoding line PYTHON_MAGIC_COMMENT_re = re.compile( r'[ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)', re.VERBOSE) def parse_encoding(fp): """Deduce the encoding of a source file from magic comment. It does this in the same way as the `Python interpreter`__ .. __: http://docs.python.org/ref/encodings.html The ``fp`` argument should be a seekable file object. (From Jeff Dairiki) """ pos = fp.tell() fp.seek(0) try: line1 = fp.readline() has_bom = line1.startswith(codecs.BOM_UTF8) if has_bom: line1 = line1[len(codecs.BOM_UTF8):] m = PYTHON_MAGIC_COMMENT_re.match(line1) if not m: try: import parser parser.suite(line1) except (ImportError, SyntaxError): # Either it's a real syntax error, in which case the source is # not valid python source, or line2 is a continuation of line1, # in which case we don't want to scan line2 for a magic # comment. pass else: line2 = fp.readline() m = PYTHON_MAGIC_COMMENT_re.match(line2) if has_bom: if m: raise SyntaxError( "python refuses to compile code with both a UTF8 " "byte-order-mark and a magic encoding comment") return 'utf_8' elif m: return m.group(1) else: return None finally: fp.seek(pos) def pathmatch(pattern, filename): """Extended pathname pattern matching. This function is similar to what is provided by the ``fnmatch`` module in the Python standard library, but: * can match complete (relative or absolute) path names, and not just file names, and * also supports a convenience pattern ("**") to match files at any directory level. Examples: >>> pathmatch('**.py', 'bar.py') True >>> pathmatch('**.py', 'foo/bar/baz.py') True >>> pathmatch('**.py', 'templates/index.html') False >>> pathmatch('**/templates/*.html', 'templates/index.html') True >>> pathmatch('**/templates/*.html', 'templates/foo/bar.html') False :param pattern: the glob pattern :param filename: the path name of the file to match against :return: `True` if the path name matches the pattern, `False` otherwise :rtype: `bool` """ symbols = { '?': '[^/]', '?/': '[^/]/', '*': '[^/]+', '*/': '[^/]+/', '**/': '(?:.+/)*?', '**': '(?:.+/)*?[^/]+', } buf = [] for idx, part in enumerate(re.split('([?*]+/?)', pattern)): if idx % 2: buf.append(symbols[part]) elif part: buf.append(re.escape(part)) match = re.match(''.join(buf) + '$', filename.replace(os.sep, '/')) return match is not None class TextWrapper(textwrap.TextWrapper): wordsep_re = re.compile( r'(\s+|' # any whitespace r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))' # em-dash ) def wraptext(text, width=70, initial_indent='', subsequent_indent=''): """Simple wrapper around the ``textwrap.wrap`` function in the standard library. This version does not wrap lines on hyphens in words. :param text: the text to wrap :param width: the maximum line width :param initial_indent: string that will be prepended to the first line of wrapped output :param subsequent_indent: string that will be prepended to all lines save the first of wrapped output :return: a list of lines :rtype: `list` """ wrapper = TextWrapper(width=width, initial_indent=initial_indent, subsequent_indent=subsequent_indent, break_long_words=False) return wrapper.wrap(text) class odict(dict): """Ordered dict implementation. :see: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 """ def __init__(self, data=None): dict.__init__(self, data or {}) self._keys = dict.keys(self) def __delitem__(self, key): dict.__delitem__(self, key) self._keys.remove(key) def __setitem__(self, key, item): dict.__setitem__(self, key, item) if key not in self._keys: self._keys.append(key) def __iter__(self): return iter(self._keys) iterkeys = __iter__ def clear(self): dict.clear(self) self._keys = [] def copy(self): d = odict() d.update(self) return d def items(self): return zip(self._keys, self.values()) def iteritems(self): return izip(self._keys, self.itervalues()) def keys(self): return self._keys[:] def pop(self, key, default=missing): if default is missing: return dict.pop(self, key) elif key not in self: return default self._keys.remove(key) return dict.pop(self, key, default) def popitem(self, key): self._keys.remove(key) return dict.popitem(key) def setdefault(self, key, failobj = None): dict.setdefault(self, key, failobj) if key not in self._keys: self._keys.append(key) def update(self, dict): for (key, val) in dict.items(): self[key] = val def values(self): return map(self.get, self._keys) def itervalues(self): return imap(self.get, self._keys) try: relpath = os.path.relpath except AttributeError: def relpath(path, start='.'): """Compute the relative path to one path from another. >>> relpath('foo/bar.txt', '').replace(os.sep, '/') 'foo/bar.txt' >>> relpath('foo/bar.txt', 'foo').replace(os.sep, '/') 'bar.txt' >>> relpath('foo/bar.txt', 'baz').replace(os.sep, '/') '../foo/bar.txt' :return: the relative path :rtype: `basestring` """ start_list = os.path.abspath(start).split(os.sep) path_list = os.path.abspath(path).split(os.sep) # Work out how much of the filepath is shared by start and path. i = len(os.path.commonprefix([start_list, path_list])) rel_list = [os.path.pardir] * (len(start_list) - i) + path_list[i:] return os.path.join(*rel_list) try: from operator import attrgetter, itemgetter except ImportError: def itemgetter(name): def _getitem(obj): return obj[name] return _getitem try: ''.rsplit def rsplit(a_string, sep=None, maxsplit=None): return a_string.rsplit(sep, maxsplit) except AttributeError: def rsplit(a_string, sep=None, maxsplit=None): parts = a_string.split(sep) if maxsplit is None or len(parts) <= maxsplit: return parts maxsplit_index = len(parts) - maxsplit non_splitted_part = sep.join(parts[:maxsplit_index]) splitted = parts[maxsplit_index:] return [non_splitted_part] + splitted ZERO = timedelta(0) class FixedOffsetTimezone(tzinfo): """Fixed offset in minutes east from UTC.""" def __init__(self, offset, name=None): self._offset = timedelta(minutes=offset) if name is None: name = 'Etc/GMT+%d' % offset self.zone = name def __str__(self): return self.zone def __repr__(self): return '' % (self.zone, self._offset) def utcoffset(self, dt): return self._offset def tzname(self, dt): return self.zone def dst(self, dt): return ZERO try: from pytz import UTC except ImportError: UTC = FixedOffsetTimezone(0, 'UTC') """`tzinfo` object for UTC (Universal Time). :type: `tzinfo` """ STDOFFSET = timedelta(seconds = -time.timezone) if time.daylight: DSTOFFSET = timedelta(seconds = -time.altzone) else: DSTOFFSET = STDOFFSET DSTDIFF = DSTOFFSET - STDOFFSET class LocalTimezone(tzinfo): def utcoffset(self, dt): if self._isdst(dt): return DSTOFFSET else: return STDOFFSET def dst(self, dt): if self._isdst(dt): return DSTDIFF else: return ZERO def tzname(self, dt): return time.tzname[self._isdst(dt)] def _isdst(self, dt): tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1) stamp = time.mktime(tt) tt = time.localtime(stamp) return tt.tm_isdst > 0 LOCALTZ = LocalTimezone() """`tzinfo` object for local time-zone. :type: `tzinfo` """ PK[.oosite-packages/babel/core.pyonu[ Mc@sdZddlZddlZddlmZdddddgZd Zead Z i'd d 6d d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6Z de fdYYZ de fdZYZee d[Zd\e d]Zd\d^ZdS(_s2Core locale representation and locale data access.iN(t localedatatUnknownLocaleErrortLocaletdefault_localetnegotiate_localet parse_localesrestructuredtext encCstdkrrtjjtjjt}tjj|d}t|d}ztj |aWd|j Xntj |iS(sReturn the dictionary for the given key in the global data. The global data is stored in the ``babel/global.dat`` file and contains information independent of individual locales. >>> get_global('zone_aliases')['UTC'] 'Etc/GMT' >>> get_global('zone_territories')['Europe/Berlin'] 'DE' :param key: the data key :return: the dictionary found in the global data under the given key :rtype: `dict` :since: version 0.9 s global.dattrbN( t _global_datatNonetostpathtjointdirnamet__file__topentpickletloadtclosetget(tkeyR tfilenametfileobj((s./usr/lib/python2.7/site-packages/babel/core.pyt get_globals tar_SYtartbg_BGtbgtbs_BAtbstca_EStcatcs_CZtcstda_DKtdatde_DEtdetel_GRtelten_UStentes_EStestet_EEtettfa_IRtfatfi_FItfitfr_FRtfrtgl_EStglthe_ILthethu_HUthutid_IDtidtis_IStistit_ITtittja_JPtjatkm_KHtkmtko_KRtkotlt_LTtlttlv_LVtlvtmk_MKtmktnl_NLtnltnn_NOtnntnb_NOtnotpl_PLtpltpt_PTtpttro_ROtrotru_RUtrutsk_SKtsktsl_SItsltsv_SEtsvtth_THtthttr_TRttrtuk_UAtukcBseZdZdZRS(s[Exception thrown when a locale is requested for which no locale data is available. cCs!tj|d|||_dS(srCreate the exception. :param identifier: the identifier string of the unsupported locale sunknown locale %rN(t Exceptiont__init__t identifier(tselfRg((s./usr/lib/python2.7/site-packages/babel/core.pyRfHs(t__name__t __module__t__doc__Rf(((s./usr/lib/python2.7/site-packages/babel/core.pyRCscBseZdZdDdDdDdZdDedZeeZdedZeeZddZ ee Z dZ dZ dZ d Z d ZeeZdDd Zeed d ZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZdZeed dZd Zeed d!Zd"Zeed d#Zd$Zeed d%Zd&Zeed d'Zd(Zeed d)Zd*Z ee d d+Z d,Z!ee!d d-Z!d.Z"ee"d d/Z"d0Z#ee#d d1Z#d2Z$ee$d d3Z$d4Z%ee%d d5Z%d6Z&ee&d d7Z&d8Z'ee'd d9Z'd:Z(ee(d d;Z(d<Z)ee)d d=Z)d>Z*ee*d d?Z*d@Z+ee+d dAZ+dBZ,ee,d dCZ,RS(EsxRepresentation of a specific locale. >>> locale = Locale('en', 'US') >>> repr(locale) '' >>> locale.display_name u'English (United States)' A `Locale` object can also be instantiated from a raw locale string: >>> locale = Locale.parse('en-US', sep='-') >>> repr(locale) '' `Locale` objects provide access to a collection of locale data, such as territory and language names, number and date format patterns, and more: >>> locale.number_symbols['decimal'] u'.' If a locale is requested for which no locale data is available, an `UnknownLocaleError` is raised: >>> Locale.parse('en_DE') Traceback (most recent call last): ... UnknownLocaleError: unknown locale 'en_DE' :see: `IETF RFC 3066 `_ cCs[||_||_||_||_d|_t|}tj|sWt |ndS(sInitialize the locale object from the given identifier components. >>> locale = Locale('en', 'US') >>> locale.language 'en' >>> locale.territory 'US' :param language: the language code :param territory: the territory (country or region) code :param script: the script code :param variant: the variant code :raise `UnknownLocaleError`: if no locale data is available for the requested locale N( tlanguaget territorytscripttvariantRt _Locale__datatstrRtexistsR(RhRlRmRnRoRg((s./usr/lib/python2.7/site-packages/babel/core.pyRfqs      cCs|t|d|S(sxReturn the system default locale for the specified category. >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: ... os.environ[name] = '' >>> os.environ['LANG'] = 'fr_FR.UTF-8' >>> Locale.default('LC_MESSAGES') :param category: one of the ``LC_XXX`` environment variable names :param aliases: a dictionary of aliases for locale identifiers :return: the value of the variable, or any of the fallbacks (``LANGUAGE``, ``LC_ALL``, ``LC_CTYPE``, and ``LANG``) :rtype: `Locale` :see: `default_locale` taliases(R(tclstcategoryRs((s./usr/lib/python2.7/site-packages/babel/core.pytdefaultst_cCs8t||d|d|}|r4tj|d|SdS(s Find the best match between available and requested locale strings. >>> Locale.negotiate(['de_DE', 'en_US'], ['de_DE', 'de_AT']) >>> Locale.negotiate(['de_DE', 'en_US'], ['en', 'de']) >>> Locale.negotiate(['de_DE', 'de'], ['en_US']) You can specify the character used in the locale identifiers to separate the differnet components. This separator is applied to both lists. Also, case is ignored in the comparison: >>> Locale.negotiate(['de-DE', 'de'], ['en-us', 'de-de'], sep='-') :param preferred: the list of locale identifers preferred by the user :param available: the list of locale identifiers available :param aliases: a dictionary of aliases for locale identifiers :return: the `Locale` object for the best match, or `None` if no match was found :rtype: `Locale` :see: `negotiate_locale` tsepRsN(RRtparse(Rtt preferredt availableRxRsRg((s./usr/lib/python2.7/site-packages/babel/core.pyt negotiates cCs)t|tr%|t|d|S|S(sLCreate a `Locale` instance for the given locale identifier. >>> l = Locale.parse('de-DE', sep='-') >>> l.display_name u'Deutsch (Deutschland)' If the `identifier` parameter is not a string, but actually a `Locale` object, that object is returned: >>> Locale.parse(l) :param identifier: the locale identifier string :param sep: optional component separator :return: a corresponding `Locale` instance :rtype: `Locale` :raise `ValueError`: if the string does not appear to be a valid locale identifier :raise `UnknownLocaleError`: if no locale data is available for the requested locale :see: `parse_locale` Rx(t isinstancet basestringR(RtRgRx((s./usr/lib/python2.7/site-packages/babel/core.pyRyscCst|t|kS(N(Rq(Rhtother((s./usr/lib/python2.7/site-packages/babel/core.pyt__eq__scCs|j| S(N(R(RhR((s./usr/lib/python2.7/site-packages/babel/core.pyt__ne__scCsdt|S(Ns (Rq(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt__repr__scCs.djtd|j|j|j|jgS(NRw(R tfilterRRlRnRmRo(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt__str__scCs:|jdkr3tjtjt||_n|jS(N(RpRRtLocaleDataDictRRq(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt_datas$cCs|dkr|}ntj|}|jj|j}|jsT|jsT|jrg}|jr|j |j j|jn|jr|j |j j|jn|jr|j |j j|jnt d|}|r|ddj|7}qn|S(sReturn the display name of the locale using the given locale. The display name will include the language, territory, script, and variant, if those are specified. >>> Locale('zh', 'CN', script='Hans').get_display_name('en') u'Chinese (Simplified Han, China)' :param locale: the locale to use :return: the display name s (%s)u, N(RRRyt languagesRRlRmRnRotappendtscriptst territoriestvariantsRR (Rhtlocaletretvaltdetails((s./usr/lib/python2.7/site-packages/babel/core.pytget_display_names     tdocs& The localized display name of the locale. >>> Locale('en').display_name u'English' >>> Locale('en', 'US').display_name u'English (United States)' >>> Locale('sv').display_name u'svenska' :type: `unicode` cCs|jtdS(NR((RR(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt english_namess The english display name of the locale. >>> Locale('de').english_name u'German' >>> Locale('de', 'DE').english_name u'German (Germany)' :type: `unicode` cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR$ss Mapping of language codes to translated language names. >>> Locale('de', 'DE').languages['ja'] u'Japanisch' :type: `dict` :see: `ISO 639 `_ cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR0ss Mapping of script codes to translated script names. >>> Locale('en', 'US').scripts['Hira'] u'Hiragana' :type: `dict` :see: `ISO 15924 `_ cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR<ss Mapping of script codes to translated script names. >>> Locale('es', 'CO').territories['DE'] u'Alemania' :type: `dict` :see: `ISO 3166 `_ cCs |jdS(NR(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRHss Mapping of script codes to translated script names. >>> Locale('de', 'DE').variants['1901'] u'Alte deutsche Rechtschreibung' :type: `dict` cCs |jdS(Ntcurrency_names(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt currenciesUss Mapping of currency codes to translated currency names. >>> Locale('en').currencies['COP'] u'Colombian Peso' >>> Locale('de', 'DE').currencies['COP'] u'Kolumbianischer Peso' :type: `dict` cCs |jdS(Ntcurrency_symbols(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRbss Mapping of currency codes to symbols. >>> Locale('en', 'US').currency_symbols['USD'] u'$' >>> Locale('es', 'CO').currency_symbols['USD'] u'US$' :type: `dict` cCs |jdS(Ntnumber_symbols(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRoss Symbols used in number formatting. >>> Locale('fr', 'FR').number_symbols['decimal'] u',' :type: `dict` cCs |jdS(Ntdecimal_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRzss Locale patterns for decimal number formatting. >>> Locale('en', 'US').decimal_formats[None] :type: `dict` cCs |jdS(Ntcurrency_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss\ Locale patterns for currency number formatting. >>> print Locale('en', 'US').currency_formats[None] :type: `dict` cCs |jdS(Ntpercent_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale patterns for percent number formatting. >>> Locale('en', 'US').percent_formats[None] :type: `dict` cCs |jdS(Ntscientific_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale patterns for scientific number formatting. >>> Locale('en', 'US').scientific_formats[None] :type: `dict` cCs |jdS(Ntperiods(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for day periods (AM/PM). >>> Locale('en', 'US').periods['am'] u'AM' :type: `dict` cCs |jdS(Ntdays(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for weekdays. >>> Locale('de', 'DE').days['format']['wide'][3] u'Donnerstag' :type: `dict` cCs |jdS(Ntmonths(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for months. >>> Locale('de', 'DE').months['format']['wide'][10] u'Oktober' :type: `dict` cCs |jdS(Ntquarters(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for quarters. >>> Locale('de', 'DE').quarters['format']['wide'][1] u'1. Quartal' :type: `dict` cCs |jdS(Nteras(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for eras. >>> Locale('en', 'US').eras['wide'][1] u'Anno Domini' >>> Locale('en', 'US').eras['abbreviated'][0] u'BC' :type: `dict` cCs |jdS(Nt time_zones(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss' Locale display names for time zones. >>> Locale('en', 'US').time_zones['Europe/London']['long']['daylight'] u'British Summer Time' >>> Locale('en', 'US').time_zones['America/St_Johns']['city'] u"St. John's" :type: `dict` cCs |jdS(Nt meta_zones(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss Locale display names for meta time zones. Meta time zones are basically groups of different Olson time zones that have the same GMT offset and daylight savings time. >>> Locale('en', 'US').meta_zones['Europe_Central']['long']['daylight'] u'Central European Summer Time' :type: `dict` :since: version 0.9 cCs |jdS(Nt zone_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss(\ Patterns related to the formatting of time zones. >>> Locale('en', 'US').zone_formats['fallback'] u'%(1)s (%(0)s)' >>> Locale('pt', 'BR').zone_formats['region'] u'Hor\xe1rio %s' :type: `dict` :since: version 0.9 cCs|jddS(Nt week_datat first_day(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pytfirst_week_day ss The first day of a week, with 0 being Monday. >>> Locale('de', 'DE').first_week_day 0 >>> Locale('en', 'US').first_week_day 6 :type: `int` cCs|jddS(NRt weekend_start(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRss The day the weekend starts, with 0 being Monday. >>> Locale('de', 'DE').weekend_start 5 :type: `int` cCs|jddS(NRt weekend_end(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR#ss The day the weekend ends, with 0 being Monday. >>> Locale('de', 'DE').weekend_end 6 :type: `int` cCs|jddS(NRtmin_days(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyt min_week_days.ss The minimum number of days in a week so that the week is counted as the first week of a year or month. >>> Locale('de', 'DE').min_week_days 4 :type: `int` cCs |jdS(Nt date_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyR:ss Locale patterns for date formatting. >>> Locale('en', 'US').date_formats['short'] >>> Locale('fr', 'FR').date_formats['long'] :type: `dict` cCs |jdS(Nt time_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRGss Locale patterns for time formatting. >>> Locale('en', 'US').time_formats['short'] >>> Locale('fr', 'FR').time_formats['long'] :type: `dict` cCs |jdS(Ntdatetime_formats(R(Rh((s./usr/lib/python2.7/site-packages/babel/core.pyRTss Locale patterns for datetime formatting. >>> Locale('en').datetime_formats[None] u'{1} {0}' >>> Locale('th').datetime_formats[None] u'{1}, {0}' :type: `dict` N(-RiRjRkRRftLOCALE_ALIASESRvt classmethodR|RyRRRRRtpropertyRt display_nameRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s./usr/lib/python2.7/site-packages/babel/core.pyRQs                                                                                  cCs|ddddf}xtd |D]}tj|}|r%|dkrnd|krn|jdd}n|d krd }n|r||kr||}ny d jtd t|SWqtk rqXq%q%Wd S( sReturns the system default locale for a given category, based on environment variables. >>> for name in ['LANGUAGE', 'LC_ALL', 'LC_CTYPE']: ... os.environ[name] = '' >>> os.environ['LANG'] = 'fr_FR.UTF-8' >>> default_locale('LC_MESSAGES') 'fr_FR' The "C" or "POSIX" pseudo-locales are treated as aliases for the "en_US_POSIX" locale: >>> os.environ['LC_MESSAGES'] = 'POSIX' >>> default_locale('LC_MESSAGES') 'en_US_POSIX' :param category: one of the ``LC_XXX`` environment variable names :param aliases: a dictionary of aliases for locale identifiers :return: the value of the variable, or any of the fallbacks (``LANGUAGE``, ``LC_ALL``, ``LC_CTYPE``, and ``LANG``) :rtype: `str` tLANGUAGEtLC_ALLtLC_CTYPEtLANGt:itCtPOSIXt en_US_POSIXRwN(RR(RRR tgetenvtsplitR Rt ValueError(RuRstvarnamestnameR((s./usr/lib/python2.7/site-packages/babel/core.pyRbs     Rwc Csg|D]}|r|j^q}x|D]}|j}||krN|S|r|j|}|r|jd|}|j|kr|Sqn|j|}t|dkr,|dj|kr,|dSq,WdS(s Find the best match between available and requested locale strings. >>> negotiate_locale(['de_DE', 'en_US'], ['de_DE', 'de_AT']) 'de_DE' >>> negotiate_locale(['de_DE', 'en_US'], ['en', 'de']) 'de' Case is ignored by the algorithm, the result uses the case of the preferred locale identifier: >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) 'de_DE' >>> negotiate_locale(['de_DE', 'en_US'], ['de_de', 'de_at']) 'de_DE' By default, some web browsers unfortunately do not include the territory in the locale identifier for many locales, and some don't even allow the user to easily add the territory. So while you may prefer using qualified locale identifiers in your web-application, they would not normally match the language-only locale sent by such browsers. To workaround that, this function uses a default mapping of commonly used langauge-only locale identifiers to identifiers including the territory: >>> negotiate_locale(['ja', 'en_US'], ['ja_JP', 'en_US']) 'ja_JP' Some browsers even use an incorrect or outdated language code, such as "no" for Norwegian, where the correct locale identifier would actually be "nb_NO" (Bokmål) or "nn_NO" (Nynorsk). The aliases are intended to take care of such cases, too: >>> negotiate_locale(['no', 'sv'], ['nb_NO', 'sv_SE']) 'nb_NO' You can override this default mapping by passing a different `aliases` dictionary to this function, or you can bypass the behavior althogher by setting the `aliases` parameter to `None`. :param preferred: the list of locale strings preferred by the user :param available: the list of locale strings available :param sep: character that separates the different parts of the locale strings :param aliases: a dictionary of aliases for locale identifiers :return: the locale identifier for the best match, or `None` if no match was found :rtype: `str` RwiiN(tlowerRtreplaceRtlenR( RzR{RxRstaRtlltaliastparts((s./usr/lib/python2.7/site-packages/babel/core.pyRs1%    ( c Csd|kr%|jddd}nd|krJ|jddd}n|j|}|jdj}|jstd|nd }}}|rt|ddkr|djr|jdj}qn|rat|ddkr&|djr&|jdj}qat|ddkra|dj ra|jd}qan|rt|ddkr|ddj st|dd kr|ddjr|j}qn|rtd |n||||fS( sParse a locale identifier into a tuple of the form:: ``(language, territory, script, variant)`` >>> parse_locale('zh_CN') ('zh', 'CN', None, None) >>> parse_locale('zh_Hans_CN') ('zh', 'CN', 'Hans', None) The default component separator is "_", but a different separator can be specified using the `sep` parameter: >>> parse_locale('zh-CN', sep='-') ('zh', 'CN', None, None) If the identifier cannot be parsed into a locale, a `ValueError` exception is raised: >>> parse_locale('not_a_LOCALE_String') Traceback (most recent call last): ... ValueError: 'not_a_LOCALE_String' is not a valid locale identifier Encoding information and locale modifiers are removed from the identifier: >>> parse_locale('it_IT@euro') ('it', 'IT', None, None) >>> parse_locale('en_US.UTF-8') ('en', 'US', None, None) >>> parse_locale('de_DE.iso885915@euro') ('de', 'DE', None, None) :param identifier: the locale identifier string :param sep: character that separates the different components of the locale identifier :return: the ``(language, territory, script, variant)`` tuple :rtype: `tuple` :raise `ValueError`: if the string does not appear to be a valid locale identifier :see: `IETF RFC 4646 `_ t.iit@sexpected only letters, got %riiiis#%r is not a valid locale identifierN( RtpopRtisalphaRRRttitletuppertisdigit(RgRxRtlangRnRmRo((s./usr/lib/python2.7/site-packages/babel/core.pyRs0+   &&&**(RkR RtbabelRt__all__t __docformat__RRRRReRtobjectRRRR(((s./usr/lib/python2.7/site-packages/babel/core.pyts0     #######(APK[~@xߍߍsite-packages/babel/global.datnu[}q(Uzone_territoriesq}q(UAtlantic/CanaryqUESqUAustralia/MelbourneqUAUqU Etc/GMT+9qU001qU Etc/GMT+8q U001q U Europe/Lisbonq UPTq U Etc/GMT+3q U001qU Etc/GMT+2qU001qU Etc/GMT+1qU001qUAmerica/NipigonqUCAqU Etc/GMT+6qU001qU Etc/GMT+5qU001qUAmerica/MiquelonqUPMqUPacific/WallisqUWFqUAntarctica/DavisqUAQqUAmerica/Coral_HarbourqUCAq U Asia/Dhakaq!UBDq"UAmerica/St_Luciaq#ULCq$U Asia/Kashgarq%UCNq&UAmerica/Phoenixq'UUSq(UEurope/Kaliningradq)URUq*U Etc/GMT+7q+U001q,UAmerica/Mazatlanq-UMXq.UArctic/Longyearbyenq/USJq0UEurope/Guernseyq1UGGq2UAntarctica/Rotheraq3UAQq4UEurope/Stockholmq5USEq6U Pacific/Fijiq7UFJq8U Pacific/Apiaq9UWSq:U Etc/GMT+4q;U001qU Asia/Rangoonq?UMMq@UAmerica/Mexico_CityqAUMXqBUAmerica/Puerto_RicoqCUPRqDUIndian/MauritiusqEUMUqFU Europe/BerlinqGUDEqHU Europe/ZurichqIUCHqJUAfrica/CasablancaqKUMAqLU Europe/SkopjeqMUMKqNU Europe/WarsawqOUPLqPUAsia/KrasnoyarskqQURUqRUAtlantic/BermudaqSUBMqTUAustralia/CurrieqUUAUqVU Asia/TehranqWUIRqXU Asia/SaigonqYUVNqZU Asia/Bakuq[UAZq\UAmerica/St_Barthelemyq]UBLq^UAmerica/Santaremq_UBRq`UAmerica/DanmarkshavnqaUGLqbUAmerica/ScoresbysundqcUGLqdUAmerica/EirunepeqeUBRqfUAmerica/CaracasqgUVEqhU Asia/BaghdadqiUIQqjUAfrica/MonroviaqkULRqlUAmerica/St_VincentqmUVCqnUAmerica/VancouverqoUCAqpU Asia/ThimphuqqUBTqrUAfrica/OuagadougouqsUBFqtUAmerica/BelizequUBZqvUAmerica/Port_of_SpainqwUTTqxU Asia/TashkentqyUUZqzU Asia/Tokyoq{UJPq|UPacific/Kiritimatiq}UKIq~UAustralia/SydneyqUAUqU Europe/RigaqULVqU Asia/DiliqUTLqUAfrica/MbabaneqUSZqU Asia/OralqUKZqU Asia/AdenqUYEqUEurope/Isle_of_ManqUIMqUEurope/IstanbulqUTRqU Asia/MagadanqURUqUAustralia/LindemanqUAUqUPacific/GalapagosqUECqUAmerica/BogotaqUCOqUAmerica/DawsonqUCAqUAmerica/ChicagoqUUSqUPacific/KwajaleinqUMHqUAustralia/Broken_HillqUAUqUAmerica/CuiabaqUBRqUIndian/ChristmasqUCXqU Asia/JayapuraqUIDqUEurope/BrusselsqUBEqUAsia/ChongqingqUCNqUAmerica/NoronhaqUBRqUEurope/PodgoricaqUMEqUAfrica/AlgiersqUDZqU Africa/HarareqUZWqUAfrica/NdjamenaqUTDqUAmerica/Costa_RicaqUCRqUEurope/LjubljanaqUSIqUIndian/MayotteqUYTqUAsia/Phnom_PenhqUKHqUAmerica/ManaguaqUNIqUAmerica/PangnirtungqUCAqU Etc/GMT+12qU001qUAmerica/TijuanaqUMXqUPacific/FakaofoqUTKqUAmerica/MartiniqueqUMQqUAmerica/AntiguaqUAGqUAmerica/Argentina/La_RiojaqUARqUPacific/TahitiqUPFqU Asia/BruneiqUBNqU Europe/ZagrebqUHRqUAmerica/AsuncionqUPYqU Europe/ViennaqUATqUAustralia/HobartqUAUqUAmerica/JuneauqUUSqUAmerica/InuvikqUCAqUAmerica/MontrealqUCAqU Asia/SeoulqUKRqU Indian/ComoroqUKMqU Europe/ParisqUFRqUEurope/TallinnqUEEqU Indian/MaheqUSCqU Asia/CalcuttaqUINqU America/AdakqUUSqUAsia/SingaporeqUSGqUAfrica/NairobiqUKEqUAmerica/MaceioqUBRqU Africa/CairoqUEGqU Europe/MoscowqURUqUAntarctica/PalmerqUAQqUAsia/UlaanbaatarqUMNqUAmerica/Rainy_RiverqUCAqUAfrica/KampalaqUUGqU Asia/ColomboqULKqUAustralia/AdelaideqUAUrUAmerica/Cambridge_BayrUCArU Africa/LuandarUAOrUPacific/ChathamrUNZrUAmerica/Indiana/WinamacrUUSrUAmerica/Cordobar UARr U Asia/Tbilisir UGEr UEurope/Gibraltarr UGIrU Asia/KarachirUPKrU Asia/HarbinrUCNrUAustralia/Lord_HowerUAUrU Etc/GMT-9rU001rU Etc/GMT-8rU001rU Etc/GMT-1rU001rU Etc/GMT-3rU001rU Etc/GMT-2rU001rU Etc/GMT-5rU001r U Etc/GMT-4r!U001r"U Etc/GMT-7r#U001r$U Etc/GMT-6r%U001r&UAmerica/Boa_Vistar'UBRr(UAfrica/Tripolir)ULYr*UIndian/Reunionr+UREr,UAtlantic/Stanleyr-UFKr.UAfrica/Lubumbashir/UCDr0UAmerica/Blanc-Sablonr1UCAr2UAntarctica/Syowar3UAQr4UAmerica/Jamaicar5UJMr6U Europe/Kievr7UUAr8UEurope/Budapestr9UHUr:UPacific/Midwayr;UUMr<UAmerica/Goose_Bayr=UCAr>U Asia/Ammanr?UJOr@U Asia/SakhalinrAURUrBUAfrica/WindhoekrCUNArDU Asia/KatmandurEUNPrFUAmerica/GuyanarGUGYrHUAmerica/Sao_PaulorIUBRrJUAustralia/PerthrKUAUrLUAfrica/DjiboutirMUDJrNU Asia/JakartarOUIDrPUAsia/PyongyangrQUKPrRUAfrica/JohannesburgrSUZArTU Asia/IrkutskrUURUrVU Africa/NiameyrWUNErXU America/BelemrYUBRrZU Asia/Bishkekr[UKGr\UAfrica/Nouakchottr]UMRr^UEurope/Vilniusr_ULTr`UAmerica/CayenneraUGFrbUAfrica/MogadishurcUSOrdUAmerica/Kentucky/MonticelloreUUSrfUAmerica/Rio_BrancorgUBRrhUAmerica/CancunriUMXrjUAmerica/HavanarkUCUrlU Pacific/GuamrmUGUrnUPacific/KosraeroUFMrpUAtlantic/AzoresrqUPTrrUAustralia/EuclarsUAUrtU Asia/ShanghairuUCNrvUAmerica/GodthabrwUGLrxU Asia/BeirutryULBrzU Africa/Maputor{UMZr|U Asia/Bahrainr}UBHr~U Asia/AshgabatrUTMrU Asia/RiyadhrUSArUAtlantic/FaeroerUFOrUAmerica/MontevideorUUYrUAmerica/AnguillarUAIrU Asia/DamascusrUSYrUAmerica/North_Dakota/CenterrUUSrUAmerica/Indiana/VevayrUUSrUAtlantic/St_HelenarUSHrUAmerica/BarbadosrUBBrUEurope/VaticanrUVArUAmerica/Indiana/VincennesrUUSrU Asia/AlmatyrUKZrUAmerica/Santo_DomingorUDOrUAfrica/BrazzavillerUCGrU America/NomerUUSrU Europe/DublinrUIErUAmerica/YakutatrUUSrUAmerica/AraguainarUBRrU Europe/VaduzrULIrU Africa/AsmerarUERrUAntarctica/MawsonrUAQrUAmerica/Buenos_AiresrUARrU Africa/MaserurULSrUAmerica/St_JohnsrUCArU Asia/KuchingrUMYrUAfrica/LibrevillerUGArUAfrica/FreetownrUSLrU Africa/BissaurUGWrU Europe/SamararURUrUEurope/AmsterdamrUNLrU Europe/TiranerUALrUPacific/SaipanrUMPrUAfrica/AbidjanrUCIrUEurope/ZaporozhyerUUArUAmerica/El_SalvadorrUSVrU Europe/MadridrUESrUAmerica/SantiagorUCLrUAmerica/Argentina/San_LuisrUARrU America/ArubarUAWrUAmerica/IndianapolisrUUSrUAmerica/ReginarUCArU Pacific/TrukrUFMrUPacific/FunafutirUTVrUAmerica/MeridarUMXrUAmerica/GuatemalarUGTrUAfrica/Sao_TomerUSTrU Asia/MakassarrUIDrUAfrica/BujumburarUBIrUEurope/ChisinaurUMDrUAmerica/MonterreyrUMXrUAsia/YekaterinburgrURUrUAntarctica/CaseyrUAQrUPacific/EnderburyrUKIrU America/ThulerUGLrUAmerica/LouisvillerUUSrUAmerica/MonctonrUCArUEurope/HelsinkirUFIrUAtlantic/Cape_VerderUCVrUAmerica/TegucigalparUHNrU Indian/CocosrUCCrU America/BoiserUUSrUAmerica/GuadelouperUGPrUAmerica/NassaurUBSrU Europe/PraguerUCZrUAmerica/HalifaxrUCArU Asia/HovdrUMNrUAmerica/ManausrUBRrUAmerica/Rankin_InletrUCArUAmerica/Catamarcar UARr UAmerica/Chihuahuar UMXr UAmerica/Iqaluitr UCArUAmerica/Argentina/Rio_GallegosrUARrUPacific/GambierrUPFrUEurope/VolgogradrURUrU Africa/BamakorUMLrUEurope/UzhgorodrUUArU Africa/BanjulrUGMrU Asia/AqtaurUKZrU Africa/MalaborUGQrU Europe/MinskrUBYr UAtlantic/Madeirar!UPTr"UPacific/Noumear#UNCr$UAfrica/Kinshasar%UCDr&U Europe/Maltar'UMTr(UAmerica/Argentina/Ushuaiar)UARr*U Asia/Bangkokr+UTHr,U Pacific/Niuer-UNUr.UAustralia/Brisbaner/UAUr0UAmerica/Recifer1UBRr2U Asia/Yerevanr3UAMr4UAmerica/La_Pazr5UBOr6U Asia/Urumqir7UCNr8U Africa/Lusakar9UZMr:UPacific/Guadalcanalr;USBr<UAmerica/Yellowknifer=UCAr>UAsia/Vientianer?ULAr@U Asia/KuwaitrAUKWrBUAfrica/ConakryrCUGNrDUAmerica/Argentina/TucumanrEUARrFU Europe/OslorGUNOrHUAmerica/St_KittsrIUKNrJUAmerica/PanamarKUPArLUAfrica/GaboronerMUBWrNU Pacific/PalaurOUPWrPUAmerica/GuayaquilrQUECrRUAsia/Kuala_LumpurrSUMYrTU Europe/LondonrUUGBrVUAmerica/MenomineerWUUSrXUAsia/KamchatkarYURUrZUAsia/Vladivostokr[URUr\U Asia/Qatarr]UQAr^U Asia/Dubair_UAEr`U Asia/YakutskraURUrbU Asia/OmskrcURUrdU Africa/BanguireUCFrfUAmerica/ParamariborgUSRrhU Etc/GMT-11riU001rjU Etc/GMT-10rkU001rlU Etc/GMT-13rmU001rnU Etc/GMT-12roU001rpU Etc/GMT-14rqU001rrUPacific/MarquesasrsUPFrtUEurope/BratislavaruUSKrvU Asia/AnadyrrwURUrxUAmerica/New_YorkryUUSrzUPacific/Norfolkr{UNFr|UPacific/Rarotongar}UCKr~UAmerica/DominicarUDMrUAfrica/Porto-NovorUBJrUAsia/SamarkandrUUZrU Asia/DushanberUTJrUAmerica/TorontorUCArU America/BahiarUBRrUIndian/MaldivesrUMVrU Africa/AccrarUGHrUAntarctica/South_PolerUAQrU Asia/MuscatrUOMrUAmerica/EdmontonrUCArU Pacific/WakerUUMrUAmerica/Indiana/Tell_CityrUUSrUAustralia/DarwinrUAUrUAmerica/WhitehorserUCArUAmerica/Swift_CurrentrUCArUEurope/CopenhagenrUDKrUAmerica/MontserratrUMSrUAmerica/MendozarUARrUEurope/SimferopolrUUArUAfrica/BlantyrerUMWrUAmerica/DetroitrUUSrUAmerica/ShiprockrUUSrUAmerica/GrenadarUGDrUAmerica/Indiana/PetersburgrUUSrUAsia/PontianakrUIDrU Europe/AthensrUGRrUAmerica/Port-au-PrincerUHTrUAmerica/CaymanrUKYrUAfrica/Dar_es_SalaamrUTZrUAmerica/CuracaorUANrUIndian/KerguelenrUTFrUAfrica/KhartoumrUSDrU Asia/ManilarUPHrU Africa/LomerUTGrU America/JujuyrUARrU Africa/DoualarUCMrU Europe/RomerUITrUAmerica/Argentina/San_JuanrUARrUAmerica/North_Dakota/New_SalemrUUSrUPacific/Port_MoresbyrUPGrU Europe/JerseyrUJErUEurope/AndorrarUADrUEurope/LuxembourgrULUrUPacific/HonolulurUUSrUAmerica/St_ThomasrUVIrUPacific/MajurorUMHrUAsia/Hong_KongrUHKrU Asia/MacaurUMOrUEurope/BelgraderURSrUAsia/ChoibalsanrUMNrUEurope/MariehamnrUAXrUAntarctica/McMurdorUAQrUAmerica/Thunder_BayrUCArUAmerica/Los_AngelesrUUSrU Asia/KabulrUAFrUIndian/AntananarivorUMGrUEurope/SarajevorUBArUAtlantic/ReykjavikrUISrU Asia/NicosiarUCYrU Etc/GMT+11rU001rU Etc/GMT+10rU001rUPacific/PonaperUFMrUPacific/TongatapurUTOrUAmerica/MarigotrUMFrUPacific/PitcairnrUPNrUPacific/EasterrUCLrUAtlantic/South_GeorgiarUGSrUAfrica/El_AaiunrUEHrUAmerica/Campo_Grander UBRr UAmerica/Dawson_Creekr UCAr UAntarctica/Vostokr UAQrUEurope/BucharestrUROrUAmerica/Porto_VelhorUBRrU Europe/MonacorUMCrUAmerica/Indiana/MarengorUUSrU Africa/CeutarUESrUAmerica/WinnipegrUCArU Asia/AqtoberUKZrU Africa/DakarrUSNrUAmerica/FortalezarUBRr UPacific/Tarawar!UKIr"UAfrica/Addis_Ababar#UETr$U Pacific/Efater%UVUr&UPacific/Johnstonr'UUMr(UAsia/Qyzylordar)UKZr*UEurope/San_Marinor+USMr,UAsia/Jerusalemr-UILr.UPacific/Aucklandr/UNZr0UAmerica/Tortolar1UVGr2UAmerica/Denverr3UUSr4U Indian/Chagosr5UIOr6UAmerica/Glace_Bayr7UCAr8UAmerica/Hermosillor9UMXr:U Africa/Tunisr;UTNr<UAmerica/Resoluter=UCAr>UEtc/GMTr?U001r@U Asia/GazarAUPSrBU Asia/TaipeirCUTWrDUAntarctica/DumontDUrvillerEUAQrFUAmerica/Indiana/KnoxrGUUSrHUAsia/NovosibirskrIURUrJU Africa/KigalirKURWrLUAmerica/Grand_TurkrMUTCrNU Africa/LagosrOUNGrPU Europe/SofiarQUBGrRU America/LimarSUPErTU Etc/UnknownrUU001rVUAmerica/AnchoragerWUUSrXU Pacific/NaururYUNRrZuU meta_zonesr[}r\(UAtlantic/Canaryr]UEurope_Westernr^UAustralia/Melbourner_UAustralia_Easternr`U Europe/MinskraUEurope_EasternrbUAmerica/NipigonrcUAmerica_EasternrdUAmerica/MiquelonreUPierre_MiquelonrfUPacific/WallisrgUWallisrhUAntarctica/DavisriUDavisrjUAmerica/Coral_HarbourrkUAmerica_EasternrlU Asia/DhakarmU BangladeshrnUAmerica/St_LuciaroUAtlanticrpU Asia/KashgarrqUChinarrUAmerica/PhoenixrsUAmerica_MountainrtU Asia/KuwaitruUArabianrvUAsia/Hong_KongrwU Hong_KongrxUArctic/LongyearbyenryUEurope_CentralrzUEurope/Guernseyr{UGMTr|U Europe/Parisr}UEurope_Centralr~UEurope/StockholmrUEurope_CentralrU Pacific/FijirUFijirU Pacific/ApiarUSamoarUPacific/Pago_PagorUSamoarU Asia/RangoonrUMyanmarrUAmerica/Mexico_CityrUAmerica_CentralrUAmerica/Puerto_RicorUAtlanticrUIndian/MauritiusrU MauritiusrU Europe/BerlinrUEurope_CentralrU Europe/ZurichrUEurope_CentralrU America/BelemrUBrasiliarU Europe/SkopjerUEurope_CentralrUAsia/KrasnoyarskrU KrasnoyarskrUAtlantic/BermudarUAtlanticrUAustralia/CurrierUAustralia_EasternrU Asia/TehranrUIranrU Asia/SaigonrU IndochinarU Asia/BakurU AzerbaijanrUAmerica/St_BarthelemyrUAtlanticrUAmerica/SantaremrUBrasiliarUAmerica/DanmarkshavnrUGMTrUAmerica/ScoresbysundrUGreenland_EasternrUAmerica/EiruneperUAmazonrUAmerica/CaracasrU VenezuelarU Asia/BaghdadrUArabianrUAfrica/MonroviarUGMTrUAmerica/St_VincentrUAtlanticrUAmerica/VancouverrUAmerica_PacificrU Asia/ThimphurUBhutanrU Africa/AccrarUGMTrUAmerica/BelizerUAmerica_CentralrUAmerica/EdmontonrUAmerica_MountainrUAmerica/MendozarU ArgentinarU Asia/TokyorUJapanrUPacific/KiritimatirU Line_IslandsrUAustralia/SydneyrUAustralia_EasternrU Europe/RigarUEurope_EasternrU Asia/DilirU East_TimorrUAfrica/MbabanerUAfrica_SouthernrU Asia/OralrUKazakhstan_WesternrU Asia/AdenrUArabianrUEurope/Isle_of_ManrUGMTrUEurope/IstanbulrUEurope_EasternrU Asia/MagadanrUMagadanrUAustralia/LindemanrUAustralia_EasternrUPacific/GalapagosrU GalapagosrUAmerica/BogotarUColombiarUAmerica/DawsonrUAmerica_PacificrUAmerica/ChicagorUAmerica_CentralrUPacific/KwajaleinrUMarshall_IslandsrUAustralia/Broken_HillrUAustralia_CentralrUAmerica/CuiabarUAmazonrUIndian/ChristmasrU ChristmasrU Asia/JayapurarUIndonesia_EasternrUEurope/BrusselsrUEurope_CentralrU Europe/LisbonrUEurope_WesternrUAsia/ChongqingrUChinarUAmerica/NoronharUNoronharUEurope/PodgoricarUEurope_CentralrUAfrica/AlgiersrUEurope_CentralrU Africa/HararerUAfrica_CentralrUAfrica/NdjamenarUAfrica_WesternrUAmerica/Costa_RicarUAmerica_CentralrUEurope/LjubljanarUEurope_CentralrUIndian/MayotterUAfrica_EasternrUAsia/Phnom_PenhrU IndochinarUAmerica/ManaguarUAmerica_CentralrU Asia/BruneirUBruneirUAmerica/TijuanarUAmerica_PacificrUPacific/Fakaofor UTokelaur UAmerica/Martiniquer UAtlanticr UAmerica/Antiguar UAtlanticrUAmerica/Argentina/La_RiojarU ArgentinarUPacific/TahitirUTahitirUAmerica/PangnirtungrUAmerica_EasternrU Europe/ZagrebrUEurope_CentralrUAmerica/AsuncionrUParaguayrU Europe/ViennarUEurope_CentralrUAustralia/HobartrUAustralia_EasternrUAmerica/JuneaurUAlaskarUAmerica/InuvikrUAmerica_Mountainr UAmerica/Montrealr!UAmerica_Easternr"U Asia/Seoulr#UKorear$U Indian/Comoror%UAfrica_Easternr&UAntarctica/Rotherar'URotherar(UEurope/Tallinnr)UEurope_Easternr*U Indian/Maher+U Seychellesr,U Asia/Calcuttar-UIndiar.U America/Adakr/UHawaii_Aleutianr0UAsia/Singaporer1U Singaporer2UAfrica/Nairobir3UAfrica_Easternr4UAmerica/Maceior5UBrasiliar6U Asia/Urumqir7UChinar8U Europe/Moscowr9UMoscowr:UAsia/Pyongyangr;UKorear<UAsia/Ulaanbaatarr=UMongoliar>UAmerica/Rainy_Riverr?UAmerica_Centralr@UIndian/MaldivesrAUMaldivesrBU Asia/ColomborCUIndiarDUAustralia/AdelaiderEUAustralia_CentralrFUAmerica/Cambridge_BayrGUAmerica_MountainrHU Africa/LuandarIUAfrica_WesternrJUPacific/ChathamrKUChathamrLUAmerica/Indiana/WinamacrMUAmerica_EasternrNUAmerica/CordobarOU ArgentinarPU Asia/TbilisirQUGeorgiarRUEurope/GibraltarrSUEurope_CentralrTU Asia/KarachirUUPakistanrVU Asia/HarbinrWUChinarXUAustralia/Lord_HowerYU Lord_HowerZUAmerica/Boa_Vistar[UAmazonr\UAfrica/Tripolir]UEurope_Easternr^UIndian/Reunionr_UReunionr`UAtlantic/StanleyraUFalklandrbUAmerica/Blanc-SablonrcUAtlanticrdUAmerica/Santo_DomingoreUAtlanticrfUAntarctica/SyowargUSyowarhUAmerica/JamaicariUAmerica_EasternrjU Europe/KievrkUEurope_EasternrlUEurope/BudapestrmUEurope_CentralrnUPacific/MidwayroUSamoarpUAmerica/Goose_BayrqUAtlanticrrU Asia/AmmanrsUEurope_EasternrtU Asia/SakhalinruUSakhalinrvUAfrica/WindhoekrwUAfrica_WesternrxU Asia/KatmanduryUNepalrzUAmerica/Guyanar{UGuyanar|UAmerica/Sao_Paulor}UBrasiliar~UAustralia/PerthrUAustralia_WesternrUAfrica/DjiboutirUAfrica_EasternrU Asia/JakartarUIndonesia_WesternrUAntarctica/PalmerrUChilerUAfrica/JohannesburgrUAfrica_SouthernrU Asia/IrkutskrUIrkutskrU Africa/NiameyrUAfrica_WesternrUAfrica/CasablancarUEurope_WesternrUAmerica/Indiana/MarengorUAmerica_EasternrUAfrica/NouakchottrUGMTrUEurope/VilniusrUEurope_EasternrUAmerica/CayennerU French_GuianarUAfrica/MogadishurUAfrica_EasternrUAmerica/Kentucky/MonticellorUAmerica_EasternrUAmerica/Rio_BrancorUAmazonrUAmerica/CancunrUAmerica_CentralrUAmerica/HavanarUCubarU Pacific/GuamrUChamorrorU Asia/MakassarrUIndonesia_CentralrUAtlantic/AzoresrUAzoresrUAustralia/EuclarUAustralia_CentralWesternrU Asia/ShanghairUChinarUAmerica/Rankin_InletrUAmerica_CentralrU Asia/BeirutrUEurope_EasternrU Africa/MaputorUAfrica_CentralrU Asia/BahrainrUArabianrU Asia/AshgabatrU TurkmenistanrU Asia/RiyadhrUArabianrU Europe/LondonrUGMTrUAmerica/MonterreyrUAmerica_CentralrUAmerica/AnguillarUAtlanticrU Asia/DamascusrUEurope_EasternrUAmerica/North_Dakota/CenterrUAmerica_CentralrUAmerica/Indiana/VevayrUAmerica_EasternrUAtlantic/St_HelenarUGMTrUAmerica/BarbadosrUAtlanticrUEurope/VaticanrUEurope_CentralrUAmerica/Indiana/VincennesrUAmerica_EasternrU Asia/AlmatyrUKazakhstan_EasternrU Africa/LomerUGMTrUAfrica/BrazzavillerUAfrica_WesternrU America/NomerUAlaskarU Europe/DublinrUGMTrUAmerica/YakutatrUAlaskarUAmerica/AraguainarUBrasiliarU Europe/VaduzrUEurope_CentralrU Africa/AsmerarUAfrica_EasternrUAntarctica/MawsonrUMawsonrUAmerica/Buenos_AiresrU ArgentinarU Africa/MaserurUAfrica_SouthernrUAmerica/LouisvillerUAmerica_EasternrU Asia/KuchingrUMalaysiarUAfrica/LibrevillerUAfrica_WesternrUAfrica/FreetownrUGMTrU Africa/BissaurUGMTrU Europe/SamararUSamararUEurope/AmsterdamrUEurope_CentralrU Europe/TiranerUEurope_CentralrUPacific/SaipanrUChamorrorUAfrica/AbidjanrUGMTrUEurope/ZaporozhyerUEurope_EasternrUAmerica/El_SalvadorrUAmerica_CentralrU Europe/MadridrUEurope_CentralrUAmerica/SantiagorUChilerUAmerica/Argentina/San_LuisrU ArgentinarU America/ArubarUAtlanticrUAmerica/IndianapolisrUAmerica_EasternrUAmerica/ReginarUAmerica_CentralrU Pacific/TrukrUTrukrUPacific/Funafutir UTuvalur UAmerica/Meridar UAmerica_Centralr UAmerica/Guatemalar UAmerica_CentralrUAfrica/Sao_TomerUGMTrUPacific/KosraerUKosraerUAfrica/BujumburarUAfrica_CentralrUEurope/ChisinaurUEurope_EasternrU Europe/WarsawrUEurope_CentralrUAsia/YekaterinburgrU YekaterinburgrUAntarctica/CaseyrUAustralia_WesternrUAmerica/HalifaxrUAtlanticrU America/ThulerUAtlanticr UAmerica/St_Johnsr!U Newfoundlandr"UAmerica/Monctonr#UAtlanticr$UEurope/Helsinkir%UEurope_Easternr&UAtlantic/Cape_Verder'U Cape_Verder(UAmerica/Tegucigalpar)UAmerica_Centralr*U Indian/Cocosr+UCocosr,U America/Boiser-UAmerica_Mountainr.UAmerica/Guadelouper/UAtlanticr0UAmerica/Nassaur1UAmerica_Easternr2U Europe/Praguer3UEurope_Centralr4UPacific/Enderburyr5UPhoenix_Islandsr6U Asia/Hovdr7UHovdr8UAmerica/Manausr9UAmazonr:UAmerica/Godthabr;UGreenland_Westernr<UAmerica/Catamarcar=U Argentinar>UAmerica/Chihuahuar?UAmerica_Mountainr@UAmerica/IqaluitrAUAmerica_EasternrBUAmerica/Argentina/Rio_GallegosrCU ArgentinarDUPacific/GambierrEUGambierrFUEurope/VolgogradrGU VolgogradrHU Africa/BamakorIUGMTrJUEurope/UzhgorodrKUEurope_EasternrLU Africa/BanjulrMUGMTrNU Asia/AqtaurOUKazakhstan_WesternrPU Africa/MalaborQUAfrica_WesternrRUAtlantic/MadeirarSUEurope_WesternrTUPacific/NoumearUU New_CaledoniarVUAfrica/KinshasarWUAfrica_WesternrXU Europe/MaltarYUEurope_CentralrZUAmerica/Argentina/Ushuaiar[U Argentinar\U Asia/Bangkokr]U Indochinar^U Pacific/Niuer_UNiuer`UAustralia/BrisbaneraUAustralia_EasternrbUAmerica/RecifercUBrasiliardU Asia/YerevanreUArmeniarfUAmerica/La_PazrgUBoliviarhU Africa/CairoriUEurope_EasternrjU Africa/LusakarkUAfrica_CentralrlUPacific/GuadalcanalrmUSolomonrnUAmerica/YellowkniferoUAmerica_MountainrpUAsia/VientianerqU IndochinarrUEurope/KaliningradrsUEurope_EasternrtUAfrica/ConakryruUGMTrvUAmerica/Argentina/TucumanrwU ArgentinarxU Europe/OsloryUEurope_CentralrzUAmerica/St_Kittsr{UAtlanticr|UAmerica/Panamar}UAmerica_Easternr~UAfrica/GaboronerUAfrica_CentralrU Pacific/PalaurUPalaurUAmerica/GuayaquilrUEcuadorrUAsia/Kuala_LumpurrUMalaysiarUAtlantic/FaeroerUEurope_WesternrUAmerica/MenomineerUAmerica_CentralrUAsia/KamchatkarU KamchatkarUAsia/VladivostokrU VladivostokrU Asia/QatarrUArabianrU Asia/DubairUGulfrU Asia/YakutskrUYakutskrU Asia/OmskrUOmskrU Africa/BanguirUAfrica_WesternrUAmerica/ParamariborUSurinamerUAfrica/LubumbashirUAfrica_CentralrUPacific/MarquesasrU MarquesasrUEurope/BratislavarUEurope_CentralrU Asia/AnadyrrUAnadyrrUAmerica/New_YorkrUAmerica_EasternrUPacific/NorfolkrUNorfolkrUPacific/RarotongarUCookrUAmerica/DominicarUAtlanticrUAfrica/Porto-NovorUAfrica_WesternrUAsia/SamarkandrU UzbekistanrU Asia/DushanberU TajikistanrUAmerica/TorontorUAmerica_EasternrU America/BahiarUBrasiliarUAfrica/KampalarUAfrica_EasternrUAfrica/OuagadougourUGMTrU Asia/MuscatrUGulfrUAmerica/Port_of_SpainrUAtlanticrU Pacific/WakerUWakerUAmerica/Indiana/Tell_CityrUAmerica_CentralrUAustralia/DarwinrUAustralia_CentralrUAmerica/WhitehorserUAmerica_PacificrUAmerica/Swift_CurrentrUAmerica_CentralrUEurope/CopenhagenrUEurope_CentralrUAmerica/MontserratrUAtlanticrU Asia/TashkentrU UzbekistanrUEurope/SimferopolrUEurope_EasternrUAfrica/BlantyrerUAfrica_CentralrUAmerica/DetroitrUAmerica_EasternrUAmerica/ShiprockrUAmerica_MountainrUAmerica/GrenadarUAtlanticrUAmerica/Indiana/PetersburgrUAmerica_EasternrUAsia/PontianakrUIndonesia_WesternrUAfrica/Dar_es_SalaamrUAfrica_EasternrUAmerica/Port-au-PrincerUAmerica_EasternrUAmerica/CaymanrUAmerica_EasternrU Europe/AthensrUEurope_EasternrUAmerica/CuracaorUAtlanticrUIndian/KerguelenrUFrench_SouthernrUAfrica/KhartoumrUAfrica_EasternrU Asia/ManilarU PhilippinesrUEurope/SarajevorUEurope_CentralrU America/JujuyrU ArgentinarU Africa/DoualarUAfrica_WesternrU Europe/RomerUEurope_CentralrUAmerica/Argentina/San_JuanrU ArgentinarUAmerica/North_Dakota/New_SalemrUAmerica_CentralrUPacific/Port_MoresbyrUPapua_New_GuinearU Europe/JerseyrUGMTrUEurope/AndorrarUEurope_CentralrUEurope/LuxembourgrUEurope_CentralrUPacific/HonolulurUHawaii_AleutianrUAmerica/St_ThomasrUAtlanticrUPacific/MajurorUMarshall_IslandsrUAmerica/MazatlanrUAmerica_MountainrU Asia/MacaurUChinarUEurope/Belgrader UEurope_Centralr UAsia/Choibalsanr U Choibalsanr UEurope/Mariehamnr UEurope_EasternrUAntarctica/McMurdorU New_ZealandrUAmerica/Thunder_BayrUAmerica_EasternrUAmerica/Los_AngelesrUAmerica_PacificrU Asia/KabulrU AfghanistanrUIndian/AntananarivorUAfrica_EasternrUAtlantic/ReykjavikrUGMTrU Asia/NicosiarUEurope_EasternrUPacific/PonaperUPonaperUPacific/TongatapurUTongar UAmerica/Marigotr!UAtlanticr"UPacific/Pitcairnr#UPitcairnr$UPacific/Easterr%UEasterr&UAtlantic/South_Georgiar'U South_Georgiar(UAfrica/El_Aaiunr)UEurope_Westernr*UAmerica/Campo_Grander+UAmazonr,UAmerica/Dawson_Creekr-UAmerica_Mountainr.UAntarctica/Vostokr/UVostokr0UEurope/Bucharestr1UEurope_Easternr2UAmerica/Porto_Velhor3UAmazonr4U Europe/Monacor5UEurope_Centralr6U Asia/Bishkekr7U Kyrgystanr8U Africa/Ceutar9UEurope_Centralr:UAmerica/Winnipegr;UAmerica_Centralr<U Asia/Aqtober=UKazakhstan_Westernr>U Africa/Dakarr?UGMTr@UAmerica/FortalezarAUBrasiliarBUPacific/TarawarCUGilbert_IslandsrDUAfrica/Addis_AbabarEUAfrica_EasternrFU Pacific/EfaterGUVanuaturHUPacific/JohnstonrIUHawaii_AleutianrJUAsia/QyzylordarKUKazakhstan_EasternrLUEurope/San_MarinorMUEurope_CentralrNUAsia/JerusalemrOUIsraelrPUPacific/AucklandrQU New_ZealandrRUAmerica/TortolarSUAtlanticrTUAmerica/DenverrUUAmerica_MountainrVU Indian/ChagosrWU Indian_OceanrXUAmerica/Glace_BayrYUAtlanticrZUAmerica/Hermosillor[UAmerica_Mountainr\U Africa/Tunisr]UEurope_Centralr^UAmerica/Montevideor_UUruguayr`UAmerica/ResoluteraUAmerica_EasternrbU Asia/GazarcUEurope_EasternrdU Asia/TaipeireUChinarfUAntarctica/DumontDUrvillergUDumontDUrvillerhUAmerica/Indiana/KnoxriUAmerica_CentralrjUAsia/NovosibirskrkU NovosibirskrlU Africa/KigalirmUAfrica_CentralrnUAmerica/Grand_TurkroUAmerica_EasternrpU Africa/LagosrqUAfrica_WesternrrU Europe/SofiarsUEurope_EasternrtU America/LimaruUPerurvUAmerica/AnchoragerwUAlaskarxU Pacific/NaururyUNaururzuUterritory_zonesr{}r|(h"]r}h!ah]r~haht]rhsajR]rjQaj]rjaj]rjah]rhah^]rh]ahT]rhSah]rhaj6]rj5aj~]rj}aj]rjaj]rjahr]rhqaj6]rj5ajN]rjMah:]rh9aj]r(jjjYj'j hhejhjhjj1jgh_jIej]rjaj]rjaj ]rjahv]rhuajx]r(jwjUjYhQhjIjcjAj[jajh)hjjejL]rjKaj]rjaj`]rj_aj,]rj+aj]rjaj]rjaj]rjah]rhaj]rjajn]rjmaj]rjaj]rjaj]rjaj]rjaj]rjah|]rh{ajH]rjGah2]rh1ajb]rjaaj ]rj aj]rjajV]rjUaj]rjajD]rjCaj]rjahb]r(hajwhcjejB]rjAaj]rj aj]rjah>]rh=aj]rjaj@]rj?ah]rhaj]rjajJ]rjIaj]rjaj]rjaj]rjahD]rhCajB]rjAaj6]rj5ajP]rjOajr]r(jqj!h eh]rhah]rhahj]rhiajL]rjKaj]r(jjshej]rjajT]rjSaj]rjaj]rjaj]rjahP]rhOah]rhaj:]rj9aj]rjah]rhah]rhajT]rjSajR]r(jQhej]rjahZ]rhYaj<]rj;aj$]rj#ah]rhaj]rjaj]r(jhjej]rjah]rhaj]rjaj]rjaj]rjaj]rjaj]rjaj]r(jhyeh@]rh?aj]rjaj]rjaj]r(jjheh]r(hjeh]r(hjWjhj3jjGjjjjjjjhjejjjWjyjjjh'jjjehF]rhEaj(]rj'aj]rjaj]rjah]rhaj]rjaj]rjaj^]rj]ah]rhah]rhajT]r(jSjejj]r(jij j9h-jhAjhej|]rj{ah]rhahL]rhKaj]rjaj]rjaj]rjaj]rjah8]rh7aj.]rj-ajp]r(jojjej]rjah]rhaj]rjajH]rjGajD]rjCaj&]rj%aj$]rj#ajX]rjWaj|]rj{ajP]rjOaj0]r(j/jejF]rjEajZ]r jYaj.]r j-aj~]r j}aj]r jahJ]r hIah]rhah]r(hjh%juj7ej]rjaj]r(jjej]rjaj2]r(j1jhhj jj7j=jhj jhhhhjjj=jjjjhojjj=ej]rjajf]rjeaj&]r(j%j/ej]rjaj]rjah]rhah]rhaj:]rj9aj]rjajl]rjkah]rhaj]rjaj\]r j[ah]r!hajh]r"jgaj]r#(jh}j!eh]r$haj]r%jah]r&haj]r'jajv]r(juah0]r)h/ah]r*hajR]r+jQajd]r,jcaj]r-jaj,]r.j+aj]r/jah]r0haj]r1(jjjhj)ej]r2jah]r3hah6]r4h5aj]r5jaj]r6jaj]r7jajN]r8jMaj]r9jahH]r:hGah]r;hah]r<hah]r=hahN]r>hMah]r?hah]r@haj(]rA(j'j;jej]rBjah$]rCh#aj@]rDj?aj]rEjajD]rFjCahx]rGhwah]rHhah]rIhaj]rJjaj<]rKj;aj]rLjah]rMhaj]rNjahl]rOhkaj]rPjaj,]rQj+aj]rRjaj]rSjah]rThajN]rUjMaj*]rVj)aj]rWjahn]rXhmaj`]rYj_ahh]rZhgah]r[haj2]r\j1aj]r]jaj]r^jaj]r_jahX]r`hWaj4]raj3aj]rbjaj]rcjaj]rdjaj]re(jhjEjjhh3jj3j ej@]rf(j?jjjj!jj%j#jjjkjijojmjqhhh h;hhh+h hjjhjUeh]rg(hjjjjEj)jj j jjej]rh(hj/hhUjjshhjhjKhej.]rij-aj]rjjah]rkhajz]rljyah\]rmh[aj]rnjajP]ro(jOhjjej8]rp(j7jjjej^]rqj]auU zone_aliasesrr}rs(UAmerica/VirginrtjU Asia/KolkataruhUHongkongrvjUAmerica/AtikokanrwhU SystemV/AST4rxh;USystemV/PST8PDTryjU Pacific/YaprzjUAustralia/Southr{hUAmerica/Argentina/Jujuyr|jU America/Atkar}hUAmerica/Fort_Wayner~jU Australia/LHIrjUPRCrjuU Asia/ThimburhqUHSTrjU SystemV/PST8rh UBrazil/DeNoronharhUAmerica/Argentina/Buenos_AiresrjU Etc/Universalrj?UGBrjUUChile/EasterIslandrjUJamaicarj5UNavajorjUAmerica/EnsenadarhUAfrica/TimbukturjU Universalrj?UTurkeyrhU Asia/Daccarh!USystemV/CST6CDTrhUAustralia/TasmaniarhUEurope/NicosiarjU Asia/MacaorjUAustralia/CanberrarhUROKrhU US/HawaiirjUAsia/Ujung_PandangrjUCubarjkUROCrjCUCanada/MountainrjU SystemV/HST10rjUAmerica/Porto_AcrerjgUMST7MDTrj3UAustralia/WestrjKU Brazil/WestrjU Australia/NSWrhULibyarj)UCanada/SaskatchewanrjUSystemV/AST4ADTrjUCanada/EasternrjUEtc/UCTrj?UAustralia/VictoriarhUGB-EirerjUU Etc/Greenwichrj?UAtlantic/Jan_Mayenrh/UMexico/BajaSurrh-U Australia/ACTrhUPortugalrh UEurope/TiraspolrjUAsia/Ho_Chi_MinhrhYUEtc/GMT0rj?UJapanrh{UAsia/Ulan_BatorrhU KwajaleinrhUAustralia/YancowinnarhU Greenwichrj?USystemV/MST7MDTrj3UPST8PDTrjUEST5EDTrjyUUS/East-IndianarjU America/Argentina/ComodRivadaviarj UCanada/East-SaskatchewanrjUUS/Pacific-NewrjUChile/ContinentalrjU Asia/Tel_Avivrj-UMexico/GeneralrhAU Asia/IstanbulrhUAmerica/Rosariorj UGMT0rj?UIranrhWU US/AleutianrhU US/PacificrjUAustralia/NorthrjUUS/Samoarh=U US/MichiganrjUAsia/ChungkingrhUNZrj/UAsia/AshkhabadrjU Africa/AsmararjUAmerica/Knox_INrjGUEirerjUGMT+0rj?UPolandrhOUW-SUrhUUS/Indiana-StarkerjGUCanada/NewfoundlandrjUGMTrj?U Canada/YukonrjU SystemV/YST9rhUCanada/AtlanticrjU US/Arizonarh'U SystemV/CST6rhUAmerica/Argentina/Cordobarj UCanada/PacificrhoUSystemV/EST5EDTrjyUEtc/Zulurj?UMSTrh+U SystemV/EST5rhU US/AlaskarjWU Etc/GMT-0rj?UIsraelrj-UUCTrj?UNZ-CHATrjUIcelandrjU Brazil/AcrerjgU US/Mountainrj3UAmerica/Argentina/Catamarcarj UAtlantic/FaroerjUAustralia/Queenslandrj/UAmerica/Indiana/IndianapolisrjUSystemV/YST9YDTrjWUUTCrj?UESTrhUMexico/BajaNorterhU SystemV/MST7rh+U Etc/GMT+0rj?UEurope/BelfastrjUU US/EasternrjyU US/CentralrhUCanada/CentralrjUCST6CDTrhUGMT-0rj?U Pacific/Samoarh=UAmerica/Argentina/MendozarjUZulurj?UEgyptrhU SingaporerhUEtc/UTCrj?UAmerica/Kentucky/LouisvillerjU Brazil/EastrjIuu.PK[t]/Э44site-packages/babel/util.pycnu[ Mc@sdZddlZddlmZmZddlZddlZy eZWn!ek rmddl m ZnXddl Z ddl Z ddl mZmZeZdddd d d d gZd ZdZejdejZdZdZde jfdYZddddZd efdYZyejjZWne k rfddZnXyddl!m"Z"m#Z#Wne$k rdZ#nXydj%dddZ%Wn e k rdddZ%nXedZ'defd YZ(ydd!l)m*Z*Wn e$k r3e(dd Z*nXed"e j+ Z,e j-rfed"e j. Z/ne,Z/e/e,Z0d#efd$YZ1e1Z2dS(%s&Various utility classes and functions.iN(t timedeltattzinfo(tSet(tiziptimaptdistinctt pathmatchtrelpathtwraptexttodicttUTCtLOCALTZsrestructuredtext enccsEt}x5t|D]'}||kr|V|j|qqWdS(sYield all items in an iterable collection that are distinct. Unlike when using sets for a similar effect, the original ordering of the items in the collection is preserved by this function. >>> print list(distinct([1, 2, 1, 3, 4, 4])) [1, 2, 3, 4] >>> print list(distinct('foobar')) ['f', 'o', 'b', 'a', 'r'] :param iterable: the iterable collection providing the data :return: the distinct items in the collection :rtype: ``iterator`` N(tsettitertadd(titerabletseentitem((s./usr/lib/python2.7/site-packages/babel/util.pyR"s   s([ \t\f]* \# .* coding[=:][ \t]*([-\w.]+)cCs |j}|jdz|j}|jtj}|rV|ttj}ntj|}|syddl }|j |Wnt t fk rqX|j}tj|}n|r|rt dndS|r|j dSdSWd|j|XdS(sDeduce the encoding of a source file from magic comment. It does this in the same way as the `Python interpreter`__ .. __: http://docs.python.org/ref/encodings.html The ``fp`` argument should be a seekable file object. (From Jeff Dairiki) iiNs\python refuses to compile code with both a UTF8 byte-order-mark and a magic encoding commenttutf_8i(ttelltseektreadlinet startswithtcodecstBOM_UTF8tlentPYTHON_MAGIC_COMMENT_retmatchtparsertsuitet ImportErrort SyntaxErrortgrouptNone(tfptpostline1thas_bomtmRtline2((s./usr/lib/python2.7/site-packages/babel/util.pytparse_encoding:s2       cCsidd6dd6dd6dd6d d 6d d 6}g}xcttjd |D]I\}}|dry|j||qO|rO|jtj|qOqOWtjdj|d|jtj d}|dk S(sExtended pathname pattern matching. This function is similar to what is provided by the ``fnmatch`` module in the Python standard library, but: * can match complete (relative or absolute) path names, and not just file names, and * also supports a convenience pattern ("**") to match files at any directory level. Examples: >>> pathmatch('**.py', 'bar.py') True >>> pathmatch('**.py', 'foo/bar/baz.py') True >>> pathmatch('**.py', 'templates/index.html') False >>> pathmatch('**/templates/*.html', 'templates/index.html') True >>> pathmatch('**/templates/*.html', 'templates/foo/bar.html') False :param pattern: the glob pattern :param filename: the path name of the file to match against :return: `True` if the path name matches the pattern, `False` otherwise :rtype: `bool` s[^/]t?s[^/]/s?/s[^/]+t*s[^/]+/s*/s (?:.+/)*?s**/s(?:.+/)*?[^/]+s**s ([?*]+/?)itt$t/N( t enumeratetretsplittappendtescapeRtjointreplacetostsepR!(tpatterntfilenametsymbolstbuftidxtpartR((s./usr/lib/python2.7/site-packages/babel/util.pyRis % .t TextWrappercBseZejdZRS(s((\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))(t__name__t __module__R/tcompilet wordsep_re(((s./usr/lib/python2.7/site-packages/babel/util.pyR=siFR+c Cs.td|d|d|dt}|j|S(s Simple wrapper around the ``textwrap.wrap`` function in the standard library. This version does not wrap lines on hyphens in words. :param text: the text to wrap :param width: the maximum line width :param initial_indent: string that will be prepended to the first line of wrapped output :param subsequent_indent: string that will be prepended to all lines save the first of wrapped output :return: a list of lines :rtype: `list` twidthtinitial_indenttsubsequent_indenttbreak_long_words(R=tFalsetwrap(ttextRBRCRDtwrapper((s./usr/lib/python2.7/site-packages/babel/util.pyRs  cBseZdZddZdZdZdZeZdZ dZ dZ dZ d Z ed Zd Zdd Zd ZdZdZRS(soOrdered dict implementation. :see: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/107747 cCs,tj||pitj||_dS(N(tdictt__init__tkeyst_keys(tselftdata((s./usr/lib/python2.7/site-packages/babel/util.pyRKscCs$tj|||jj|dS(N(RJt __delitem__RMtremove(RNtkey((s./usr/lib/python2.7/site-packages/babel/util.pyRPscCs9tj|||||jkr5|jj|ndS(N(RJt __setitem__RMR1(RNRRR((s./usr/lib/python2.7/site-packages/babel/util.pyRSscCs t|jS(N(R RM(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt__iter__scCstj|g|_dS(N(RJtclearRM(RN((s./usr/lib/python2.7/site-packages/babel/util.pyRUs cCst}|j||S(N(R tupdate(RNtd((s./usr/lib/python2.7/site-packages/babel/util.pytcopys  cCst|j|jS(N(tzipRMtvalues(RN((s./usr/lib/python2.7/site-packages/babel/util.pytitemsscCst|j|jS(N(RRMt itervalues(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt iteritemsscCs|jS(N(RM(RN((s./usr/lib/python2.7/site-packages/babel/util.pyRLscCsO|tkrtj||S||kr,|S|jj|tj|||S(N(tmissingRJtpopRMRQ(RNRRtdefault((s./usr/lib/python2.7/site-packages/babel/util.pyR_s   cCs|jj|tj|S(N(RMRQRJtpopitem(RNRR((s./usr/lib/python2.7/site-packages/babel/util.pyRascCs9tj|||||jkr5|jj|ndS(N(RJt setdefaultRMR1(RNRRtfailobj((s./usr/lib/python2.7/site-packages/babel/util.pyRbscCs+x$|jD]\}}|||R?t__doc__R!RKRPRSRTtiterkeysRURXR[R]RLR^R_RaRbRVRZR\(((s./usr/lib/python2.7/site-packages/babel/util.pyR s"              t.cCstjj|jtj}tjj|jtj}ttjj||g}tjjgt||||}tjj|S(sCompute the relative path to one path from another. >>> relpath('foo/bar.txt', '').replace(os.sep, '/') 'foo/bar.txt' >>> relpath('foo/bar.txt', 'foo').replace(os.sep, '/') 'bar.txt' >>> relpath('foo/bar.txt', 'baz').replace(os.sep, '/') '../foo/bar.txt' :return: the relative path :rtype: `basestring` ( R5tpathtabspathR0R6Rt commonprefixtpardirR3(Rjtstartt start_listt path_listtitrel_list((s./usr/lib/python2.7/site-packages/babel/util.pyRs %(t attrgettert itemgettercsfd}|S(Ncs|S(N((tobj(tname(s./usr/lib/python2.7/site-packages/babel/util.pyt_getitems((RvRw((Rvs./usr/lib/python2.7/site-packages/babel/util.pyRtscCs|j||S(N(trsplit(ta_stringR6tmaxsplit((s./usr/lib/python2.7/site-packages/babel/util.pyRxscCsi|j|}|dks-t||kr1|St||}|j|| }||}|g|S(N(R0R!RR3(RyR6Rztpartstmaxsplit_indextnon_splitted_parttsplitted((s./usr/lib/python2.7/site-packages/babel/util.pyRxs itFixedOffsetTimezonecBsGeZdZddZdZdZdZdZdZ RS(s&Fixed offset in minutes east from UTC.cCs8td||_|dkr+d|}n||_dS(Ntminutess Etc/GMT+%d(Rt_offsetR!tzone(RNtoffsetRv((s./usr/lib/python2.7/site-packages/babel/util.pyRK,s  cCs|jS(N(R(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt__str__2scCsd|j|jfS(Ns(RR(RN((s./usr/lib/python2.7/site-packages/babel/util.pyt__repr__5scCs|jS(N(R(RNtdt((s./usr/lib/python2.7/site-packages/babel/util.pyt utcoffset8scCs|jS(N(R(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyttzname;scCstS(N(tZERO(RNR((s./usr/lib/python2.7/site-packages/babel/util.pytdst>sN( R>R?RgR!RKRRRRR(((s./usr/lib/python2.7/site-packages/babel/util.pyR)s     (R tsecondst LocalTimezonecBs,eZdZdZdZdZRS(cCs|j|rtStSdS(N(t_isdstt DSTOFFSETt STDOFFSET(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyRVscCs|j|rtStSdS(N(RtDSTDIFFR(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyR\scCstj|j|S(N(ttimeRR(RNR((s./usr/lib/python2.7/site-packages/babel/util.pyRbsc Csd|j|j|j|j|j|j|jddf }tj|}tj |}|j dkS(Nii( tyeartmonthtdaythourtminutetsecondtweekdayRtmktimet localtimettm_isdst(RNRttttstamp((s./usr/lib/python2.7/site-packages/babel/util.pyRes (R>R?RRRR(((s./usr/lib/python2.7/site-packages/babel/util.pyRTs   (3RgRtdatetimeRRR5R/R t NameErrortsetsRttextwrapRt itertoolsRRtobjectR^t__all__t __docformat__RR@tVERBOSERR(RR=RRJR RjRtAttributeErrortoperatorRsRtRRxR!RRtpytzR ttimezoneRtdaylighttaltzoneRRRR (((s./usr/lib/python2.7/site-packages/babel/util.pytsf           / 0D         PK[E site-packages/babel/__init__.pyonu[ Mc@s{dZddlTdZyGddlmZmZyedjZWnek r[dZnXWne k rvdZnXdS(sIntegrated collection of utilities that assist in internationalizing and localizing applications. This package is basically composed of two major parts: * tools to build and work with ``gettext`` message catalogs * a Python interface to the CLDR (Common Locale Data Repository), providing access to various locale display names, localized number and date formatting, etc. :see: http://www.gnu.org/software/gettext/ :see: http://docs.python.org/lib/module-gettext.html :see: http://www.unicode.org/cldr/ i(t*srestructuredtext en(tget_distributiontResolutionErrortBabelN( t__doc__t babel.coret __docformat__t pkg_resourcesRRtversiont __version__tNonet ImportError(((s2/usr/lib/python2.7/site-packages/babel/__init__.pyts   PK[Y**)site-packages/babel/messages/frontend.pyonu[ uMSc@sRdZddlmZddlmZddlmZddlmZddlm Z m Z ddl m Z ddl Z dd lmZddlZddlZddlZdd lmZddlZddlZdd lmZdd lmZmZdd lmZddlmZddlm Z m!Z!m"Z"ddl#m$Z$ddl%m&Z&m'Z'ddl(m)Z)ddl*m+Z+m,Z,ddddddgZ-dZ.defdYZ/defdYZ0dZ1defdYZ2defdYZ3de4fd YZ5d!Z6e7d"Z8gd#Z9e:d$krNe6ndS(%s3Frontends for the message extraction functionality.i(tRawConfigParser(tdatetime(tlog(tCommand(tDistutilsOptionErrortDistutilsSetupError(tgetpreferredencodingN(t OptionParser(tStringIO(t __version__(tLocalet localedata(tUnknownLocaleError(tCatalog(textract_from_dirtDEFAULT_KEYWORDStDEFAULT_MAPPING(twrite_mo(tread_potwrite_po(tPLURALS(todicttLOCALTZtCommandLineInterfacetcompile_catalogtextract_messagest init_catalogtcheck_message_extractorstupdate_catalogsrestructuredtext enc BsVeZdZdZddddddd gZddgZdZdZdZ RS(!sCatalog compilation command for use in ``setup.py`` scripts. If correctly installed, this command is available to Setuptools-using setup scripts automatically. For projects using plain old ``distutils``, the command needs to be registered explicitly in ``setup.py``:: from babel.messages.frontend import compile_catalog setup( ... cmdclass = {'compile_catalog': compile_catalog} ) :since: version 0.9 :see: `Integrating new distutils commands `_ :see: `setuptools `_ s+compile message catalogs to binary MO filessdomain=tDs&domain of PO file (default 'messages')s directory=tds.path to base directory containing the catalogss input-file=tisname of the input files output-file=tosQname of the output file (default '//LC_MESSAGES/.po')slocale=tls locale of the catalog to compiles use-fuzzytfsalso include fuzzy translationst statisticss#print statistics about translationscCsCd|_d|_d|_d|_d|_t|_t|_dS(Ntmessages( tdomaintNonet directoryt input_filet output_filetlocaletFalset use_fuzzyR#(tself((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pytinitialize_optionsVs      cCsJ|j r#|j r#tdn|j rF|j rFtdndS(Ns<you must specify either the input file or the base directory(R(R'RR)(R-((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pytfinalize_options_sc Cs@g}g}|js!|jr|j|jtjj|j|jd|jdf|jtjj|j|jd|jdqxtj|jD]}tjj|j|d|jd}tjj |r|j||f|jtjj|j|d|jdqqWnd|j|j|jf|j rV|j|j n/|jtjj|j|jd|jd|st dnxt |D]\}\}}||}t |d}zt||}Wd|jX|jr~d} x.t|dD]} | jr| d7} qqWd} t|r\| dt|} ntjd | t|| |n|jr|j rtjd |qnxD|jD]6\} } x'| D]} tjd || j| qWqWtjd ||t |d }zt||d|jWd|jXqWdS(Nt LC_MESSAGESs.pos.mosno message catalogs foundtriiids)%d of %d messages (%d%%) translated in %rs'catalog %r is marked as fuzzy, skippingserror: %s:%d: %sscompiling catalog %r to %rtwbR,(R(R*tappendtostpathtjoinR'R%tlistdirtexistsR)Rt enumeratetopenRtcloseR#tlisttstringtlenRtinfotfuzzyR,twarntcheckterrortlinenoR(R-tpo_filestmo_filesR*tpo_filetidxtmo_filetinfiletcatalogt translatedtmessaget percentageterrorsRCtoutfile((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pytrungsn           (sdomain=Rs&domain of PO file (default 'messages')(s directory=Rs.path to base directory containing the catalogs(s input-file=Rsname of the input file(s output-file=R sQname of the output file (default '//LC_MESSAGES/.po')(slocale=R!s locale of the catalog to compile(s use-fuzzyR"salso include fuzzy translationsN(s statisticsNs#print statistics about translations( t__name__t __module__t__doc__t descriptionR&t user_optionstboolean_optionsR.R/RQ(((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyR/s(   cBseZdZdZd,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;gZdd ddddd#gZd'Zd(Zd)Z d*Z RS(<sjMessage extraction command for use in ``setup.py`` scripts. If correctly installed, this command is available to Setuptools-using setup scripts automatically. For projects using plain old ``distutils``, the command needs to be registered explicitly in ``setup.py``:: from babel.messages.frontend import extract_messages setup( ... cmdclass = {'extract_messages': extract_messages} ) :see: `Integrating new distutils commands `_ :see: `setuptools `_ s1extract localizable strings from the project codescharset=s!charset to use in the output files keywords=tksHspace-separated list of keywords to look for in addition to the defaultssno-default-keywordss#do not include the default keywordss mapping-file=tFs&path to the mapping configuration files no-locations>do not include location comments with filename and line numbers omit-headers'do not include msgid "" entry in headers output-file=R sname of the output fileswidth=tws"set output line width (default 76)sno-wrapsVdo not break long message lines, longer than the output line width, into several liness sort-outputs&generate sorted output (default False)s sort-by-files,sort output by file location (default False)smsgid-bugs-address=sset report address for msgidscopyright-holder=sset copyright holder in outputs add-comments=tcsuplace comment block with TAG (or those preceding keyword lines) in output file. Seperate multiple TAGs with commas(,)sstrip-commentss)strip the comment TAGs from the comments.s input-dirs=s/directories that should be scanned for messagescCsd|_d|_tj|_t|_d|_t|_ t|_ d|_ d|_ d|_ t|_t|_t|_d|_d|_d|_g|_t|_dS(Nsutf-8t(tcharsettkeywordsRtcopyt _keywordsR+tno_default_keywordsR&t mapping_filet no_locationt omit_headerR)t input_dirstwidthtno_wrapt sort_outputt sort_by_filetmsgid_bugs_addresstcopyright_holdert add_commentst _add_commentststrip_comments(R-((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyR.s$                c Csr|jr"|j r"tdn|jr7i|_n|jrb|jjt|jjn|jsztdn|jr|j rtdn|j r|j rd|_ n$|j dk rt |j |_ n|j r|j rtdn|jsMtjg|jjD]}|jddd^qj|_n|jrn|jjd |_ndS( Ns=you must specify new keywords if you disable the default onessno output file specifieds0'--no-wrap' and '--width' are mutually exclusiveiLs;'--sort-output' and '--sort-by-file' are mutually exclusivet.iit,(RaR^RR`tupdatetparse_keywordstsplitR)RgRfR&tintRhRiRetdicttfromkeyst distributiontpackagestkeysRlRm(R-RX((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyR/s*   "    ; c s|j}t|jd}zYtd|jjd|jjd|jd|jd|j }x|j D]\\}}fd}t ||d|j d |j d |d |j}x]|D]U\}} } } tjjtjj|} |j| d| | fgd | qWqpWtjd |jt||d|jd|jd|jd|jd|jWd|jXdS(NRZtprojecttversionRjRkR]cs|dkrdStjjtjj|}d}|r|ddjg|jD]\}}d||f^qS}ntjd||dS(NtignoreR\s (%s)s, s%s="%s"sextracting messages from %s%s(R4R5tnormpathR6titemsRR?(tfilenametmethodtoptionstfilepathtoptstrRXtv(tdirname(s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pytcallback)s ! 3R^t comment_tagsRtstrip_comment_tagst auto_commentsswriting PO template file to %sRfRcRdRhRi(t _get_mappingsR:R)R Rwtget_namet get_versionRjRkR]R~RR`RmRnR4R5R}R6taddR&RR?RRfRcRdRhRiR;( R-tmappingsRPRKt method_mapt options_mapRt extractedRRDRMtcommentsR((Rs;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRQs4        !   c CsYi}|jrlt|jd}z:t|\}}x!|jD]}||f||do not include location comments with filename and line number(s omit-headerNs'do not include msgid "" entry in header(s output-file=R sname of the output file(swidth=RZs"set output line width (default 76)(sno-wrapNsVdo not break long message lines, longer than the output line width, into several lines(s sort-outputNs&generate sorted output (default False)(s sort-by-fileNs,sort output by file location (default False)(smsgid-bugs-address=Nsset report address for msgid(scopyright-holder=Nsset copyright holder in output(s add-comments=R[suplace comment block with TAG (or those preceding keyword lines) in output file. Seperate multiple TAGs with commas(,)(sstrip-commentsNs)strip the comment TAGs from the comments.(s input-dirs=Ns/directories that should be scanned for messages( RRRSRTRUR&RVRWR.R/RQR(((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRsP     )cCs"t|tstdndS(sValidate the ``message_extractors`` keyword argument to ``setup()``. :param dist: the distutils/setuptools ``Distribution`` object :param name: the name of the keyword argument (should always be "message_extractors") :param value: the value of the keyword argument :raise `DistutilsSetupError`: if the value is not valid :see: `Adding setup() arguments `_ sDthe value of the "message_extractors" parameter must be a dictionaryN(RRuR(tdisttnametvalue((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRfs cBsDeZdZdZdddddgZdZdZdZRS(sfNew catalog initialization command for use in ``setup.py`` scripts. If correctly installed, this command is available to Setuptools-using setup scripts automatically. For projects using plain old ``distutils``, the command needs to be registered explicitly in ``setup.py``:: from babel.messages.frontend import init_catalog setup( ... cmdclass = {'init_catalog': init_catalog} ) :see: `Integrating new distutils commands `_ :see: `setuptools `_ s(create a new catalog based on a POT filesdomain=Rs&domain of PO file (default 'messages')s input-file=Rsname of the input files output-dir=Rspath to output directorys output-file=R sQname of the output file (default '//LC_MESSAGES/.po')slocale=R!s$locale for the new localized catalogcCs1d|_d|_d|_d|_d|_dS(NR$(R&t output_dirR)R(R*R%(R-((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyR.s     cCs |jstdn|js0tdnytj|j|_Wntk rj}t|nX|j r|j rtdn|jst j j |j|jd|j d|_nt j j t j j|jst jt j j|jndS(Nsyou must specify the input files-you must provide a locale for the new catalogs%you must specify the output directoryR0s.po(R(RR*R tparset_localeR R)RR4R5R6R%R8Rtmakedirs(R-te((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyR/s   !cCstjd|j|jt|jd}zt|d|j}Wd|jX|j|_t |_ t|jd}zt ||Wd|jXdS(Nscreating catalog %r based on %rR1R*RZ( RR?R)R(R:RR*R;RR+R@R(R-RJRKRP((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRQs    (sdomain=Rs&domain of PO file (default 'messages')(s input-file=Rsname of the input file(s output-dir=Rspath to output directory(s output-file=R sQname of the output file (default '//LC_MESSAGES/.po')(slocale=R!s$locale for the new localized catalog(RRRSRTRURVR.R/RQ(((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRws   c Bs\eZdZdZdddd d!d#d$d%gZdddgZdZdZdZ RS(&syCatalog merging command for use in ``setup.py`` scripts. If correctly installed, this command is available to Setuptools-using setup scripts automatically. For projects using plain old ``distutils``, the command needs to be registered explicitly in ``setup.py``:: from babel.messages.frontend import update_catalog setup( ... cmdclass = {'update_catalog': update_catalog} ) :since: version 0.9 :see: `Integrating new distutils commands `_ :see: `setuptools `_ s'update message catalogs from a POT filesdomain=Rs&domain of PO file (default 'messages')s input-file=Rsname of the input files output-dir=Rs.path to base directory containing the catalogss output-file=R sQname of the output file (default '//LC_MESSAGES/.po')slocale=R!s locale of the catalog to compilesignore-obsolete=s1whether to omit obsolete messages from the outputsno-fuzzy-matchingtNsdo not use fuzzy matchingtpreviouss+keep previous msgids of translated messagestignore_obsoletetno_fuzzy_matchingcCsLd|_d|_d|_d|_d|_t|_t|_t|_ dS(NR$( R%R&R(RR)R*R+RRR(R-((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyR.s       cCs|jstdn|j r;|j r;tdn|jr]|j r]tdn|jr{|jr{t|_ndS(Nsyou must specify the input files-you must specify the output file or directorysyou must specify the locale(R(RR)RR*RRR+(R-((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyR/s c Csg}|js|jrS|j|jtjj|j|jd|jdfqxtj|jD]S}tjj|j|d|jd}tjj |rf|j||fqfqfWn|j|j|jf|j}|stjj tjj |j d}nt |j d}zt|}Wd|jX|sUtdnx]|D]U\}}tjd||j t |d}zt|d|d|}Wd|jX|j||jtjjtjj|tjtjj |} t | d } y5z#t| |d |jd |jWd| jXWntj| nXytj| |Wq\tk rtj|tj| |tj| q\Xq\WdS( NR0s.poiRsno message catalogs foundsupdating catalog %r based on %rR*R%RZRtinclude_previous( R)R*R3R4R5R6RR%R7R8tsplitexttbasenameR(R:RR;RRR?RqRRttempfilet gettempprefixRRRtremovetrenametOSErrortshutilR_( R-RER*RGR%RJttemplateRRKttmpnamettmpfile((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRQsd    (          (sdomain=Rs&domain of PO file (default 'messages')(s input-file=Rsname of the input file(s output-dir=Rs.path to base directory containing the catalogs(s output-file=R sQname of the output file (default '//LC_MESSAGES/.po')(slocale=R!s locale of the catalog to compileN(signore-obsolete=Ns1whether to omit obsolete messages from the output(sno-fuzzy-matchingRsdo not use fuzzy matching(spreviousNs+keep previous msgids of translated messages( RRRSRTRUR&RVRWR.R/RQ(((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRs,  cBseZdZdZdeZidd6dd6dd6d d 6Zejd Z d Z d Z dZ dZ dZdZRS(sCommand-line interface. This class provides a simple command-line interface to the message extraction and PO file generation functionality. s%%prog %s [options] %ss %%prog %ss$compile message catalogs to MO filestcompiles:extract messages from source files and generate a POT filetextracts+create new message catalogs from a POT filetinits0update existing message catalogs from a POT fileRqc Cstd|jdd|j|_|jj|j|j_|jjddddd d d |jjd d dddddtj d d|jjdddddddtj d d|jj dt dtj |jj|d\}}|j|j|jrtj}tg|D]}t|^q#}|jd|d}xV|D]N}tj|}|||jf} | jtjjptpddGHq]WdS|s|jjdn|d} | |j kr|jjd| nt!|| |dS(s{Main entry point of the command-line interface. :param argv: list of arguments passed on the command-line tusagetcommands[args]R{s--list-localestdestt list_localestactiont store_truethelps print all known locales and exits-vs --verboset store_consttlogleveltconstsprint as much as possibles-qs--quietsprint as little as possibleiu %%-%ds %%stasciitreplaceisQno valid command or option passed. Try the -h/--help option for more information.sunknown command "%s"(scommands[args]("RRR{tparsertdisable_interspersed_argst_helpt print_helpt add_optiontloggingtDEBUGtERRORt set_defaultsR+tINFOt parse_argst_configure_loggingRRR R<tmaxR>tsortR Rt english_nametencodetsyststdouttencodingRRCtcommandsR( R-targvRtargst identifierst identifiertlongesttformatR*toutputtcmdname((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRQ^sD   %    cCstjd|_|jj||jjrA|jjd}ntj}|jj||j|tjd}|j|dS(Ntbabelis %(message)s( Rt getLoggerRtsetLevelthandlerst StreamHandlert addHandlert Formattert setFormatter(R-Rthandlert formatter((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRs   cCs|jjGHdGHtg|jD]}t|^q }dtd|d}|jj}|jx#|D]\}}|||fGHqrWdS(Ns commands:s %%-%ds %%sii(Rt format_helpRRR>R~R(R-RRRRRRU((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRs( c Cstd|jd9d|jd}|jddddd d |jd d dd ddd d|jddddddd d|jddddddd d|jddddddd d|jdd dd!d"d#d d$|jd%dd&d"d#d d'|jdd(d!td)td&t|j|\}}g}g}|jsy|jsm|j d*n|j r|j |j t j j|j|j d+|jd,f|j t j j|j|j d+|jd-qxt j|jD]}t j j|j|d+|jd,}t j j|r|j ||f|j t j j|j|d+|jd-qqWn}|j |j |jf|jr|j |jnH|js|j d*n|j t j j|j|j d+|jd-|s |j d.nxt|D]\} \}}|| } t|d/} zt| |} Wd0| jX|jrd1} x.t| d2D]}|jr| d27} qqWd1}t| r| d3t| }n|jjd4| t| ||n| jr|j r|jjd5|qnxG| j D]9\}}x*|D]"}|jj d6||j!|q?Wq,W|jjd7|| t| d8}zt"|| d!|jWd0|jXqWd0S(:sSubcommand for compiling a message catalog to a MO file. :param argv: the command arguments :since: version 0.9 RRR\RUs--domains-DRR%Rs.domain of MO and PO files (default '%default')s --directorys-dR'tmetavartDIRsbase directory of catalog filess--locales-lR*tLOCALEslocale of the catalogs --input-files-iR(tFILEsname of the input files --output-files-oR)sQname of the output file (default '//LC_MESSAGES/.mo')s --use-fuzzys-fR,RRs2also include fuzzy translations (default %default)s --statisticsR#s#print statistics about translationsR$t compile_alls<you must specify either the input file or the base directoryR0s.pos.mosno message catalogs foundR1Niiids)%d of %d messages (%d%%) translated in %rs'catalog %r is marked as fuzzy, skippingserror: %s:%d: %sscompiling catalog %r to %rR2(scompileR\(#RRRRRR+RR(R'RCR*R3R4R5R6R%R7R8R)R9R:RR;R#R<R=R>RR?R@R,RARBRDR(R-RRRRRERFR*RGRHRIRJRKRLRMRNRORCRP((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRs                  csctdjdWdjd}|jddddd |jd d dd d ddd|jdddd ddd|jdddddd|jdddd ddd|jdddd ddd|jdddd dd!|jd"d#dd$d%d&dd'|jd(dd)d ddd*|jd+dd,d ddd-|jd.dd/d ddd0|jd1dd2d3d4dd5|jd6dd7dd8|jd9dd:dd;|jd<dd=dd>|jd?d@ddAd3dBd dddC|jdDdEddFd dddG|jddHd gdtdtdtd$dNd)td,td/tdAgdFt |j|\}}|s|jdIn|j dXkrt |j dK}n t j }t j}|jr|js|jdLni}n|jr#|jt|jn|jret |jdM}zt|\}} WdN|jXn t}i} |jr|jr|jdOn |j r|j rdP|_n|jr|jr|jdQnzptd:|jd=|jd2|jd7|jd|j } x|D]t!j"j#sA|jdRnfdS} t$|| ||j%dT| dF|j&} x]| D]U\} }}}t!j"j't!j"j(| }| j)|dN||fgdU|qWqW|j dYkr j*j+dV|j nt,|| d$|jd|j-d|j.d,|jd/|jWdN|j r^|jnXdNS(ZsSubcommand for extracting messages from source files and generating a POT file. :param argv: the command arguments RRsdir1 ...RUs --charsetRR]Rs1charset to use in the output (default "%default")s-ks --keywordR^RR3shkeywords to look for in addition to the defaults. You can specify multiple -k flags on the command line.s--no-default-keywordsRaRs#do not include the default keywordss --mappings-FRbs#path to the extraction mapping files --no-locationRcs>do not include location comments with filename and line numbers --omit-headerRds'do not include msgid "" entry in headers-os--outputRspath to the output POT files-ws--widthRfttypeRts"set output line width (default 76)s --no-wrapRgsVdo not break long message lines, longer than the output line width, into several liness --sort-outputRhs&generate sorted output (default False)s--sort-by-fileRis,sort output by file location (default False)s--msgid-bugs-addressRjRs EMAIL@ADDRESSsset report address for msgids--copyright-holderRksset copyright holder in outputs --projectRzsset project name in outputs --versionR{sset project version in outputs--add-commentss-cRtTAGsiplace comment block with TAG (or those preceding keyword lines) in output file. One TAG per argument calls--strip-comment-tagss-sRs)Strip the comment tags from the comments.sutf-8sincorrect number of argumentst-RZs=you must specify new keywords if you disable the default onesRNs1'--no-wrap' and '--width' are mutually exclusive.iLs;'--sort-output' and '--sort-by-file' are mutually exclusives%r is not a directorycs|dkrdStjjtjj|}d}|r|ddjg|jD]\}}d||f^qS}njjd||dS(NR|R\s (%s)s, s%s="%s"sextracting messages from %s%s(R4R5R}R6R~RR?(RRRRRRXR(RR-(s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRs ! 3RRswriting PO template file to %s(sextractsdir1 ...(NR(NR(/RRRRRR+R&RRCRR:RRRR_RaR^RqRrRbRR;RRfRgRhRiR RzR{RjRkR]R4R5tisdirRRRR}R6RRR?RRcRd(R-RRRRRPR^RRRRKRRRRDRMRR((RR-s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRs                     !    c Cstd|jd)d|jd}|jddddd d |jd d dd ddd d|jddddddd d|jddddddd d|jddddddd d|jdd|j|\}}|js|jd nytj |j}Wn t k r=}|j|nX|j sW|jd!n|j r{|j r{|jd"n|j stjj|j |jd#|jd$|_ ntjjtjj|j stjtjj|j nt|j d%}zt|d|j}Wd&|jX||_tjt|_|jjd'|j |j t|j d(} zt| |Wd&| jXd&S(*srSubcommand for creating new message catalogs from a template. :param argv: the command arguments RRR\RUs--domains-DRR%Rs&domain of PO file (default '%default')s --input-files-iR(RRsname of the input files --output-dirs-dRRspath to output directorys --output-files-oR)sQname of the output file (default '//LC_MESSAGES/.po')s--locales-lR*Rs$locale for the new localized catalogR$s-you must provide a locale for the new catalogsyou must specify the input files-you must specify the output file or directoryR0s.poR1Nscreating catalog %r based on %rRZ(sinitR\(RRRRRRR*RCR RR R(R)RR4R5R6R%R8RRR:RR;RtnowRt revision_dateRR?R( R-RRRRR*RRJRKRP((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRsV      !   c Cstd|jd8d|jd}|jddddd d |jd d dd ddd d|jddddddd d|jddddddd d|jddddddd d|jddd d!d"d d#|jd$d%dd&d!d"d d'|jd(dd)d!d"d d*|jdd+d td&td)t|j|\}}|jsw|jd,n|j r|j r|jd-n|j r|j r|jd.n|j r|j rt|_ ng}|j s|j r/|j|j tjj|j |j d/|jd0fqxtj|j D]S}tjj|j |d/|jd0}tjj|rB|j||fqBqBWn|j|j |j f|j}|stjjtjj|jd1}nt|jd2} zt| } Wd3| jX|s2|jd4nx`|D]X\}} |jjd5| |jt| d2} zt| d|d|} Wd3| jX| j| |j tjjtjj| tjtjj| } t| d6}y5z#t || d |j!d7|j Wd3|jXWntj"| nXytj#| | Wq9t$k rtj"| t%j&| | tj"| q9Xq9Wd3S(9sSubcommand for updating existing message catalogs from a template. :param argv: the command arguments :since: version 0.9 RRqR\RUs--domains-DRR%Rs&domain of PO file (default '%default')s --input-files-iR(RRsname of the input files --output-dirs-dRRspath to output directorys --output-files-oR)sQname of the output file (default '//LC_MESSAGES/.po')s--locales-lR*Rs"locale of the translations catalogs--ignore-obsoleteRRRsAdo not include obsolete messages in the output (default %default)s--no-fuzzy-matchings-NRs,do not use fuzzy matching (default %default)s --previousRs>keep previous msgids of translated messages (default %default)R$syou must specify the input files-you must specify the output file or directorysyou must specify the localeR0s.poiRNsno message catalogs foundsupdating catalog %r based on %rRZR(supdateR\('RRRRRR+RR(RCR)RR*RRR3R4R5R6R%R7R8RRR:RR;RR?RqRRRRRRRRRR_(R-RRRRRER*RGR%RJRRRKRR((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRqs          (         (RRRSRTRtVERSIONR{RRRRQRRRRRRq(((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRNs  .  k @cCstjtjS(N(RRQRR(((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pytmainQsc Cs4i}g}i}t}t|j|_|j||x|jD]}|dkrtt|j|}qJg|jddD]}|j^q\}} |j | |ft|j||| >> buf = StringIO(''' ... [extractors] ... custom = mypackage.module:myfunc ... ... # Python source files ... [python: **.py] ... ... # Genshi templates ... [genshi: **/templates/**.html] ... include_attrs = ... [genshi: **/templates/**.txt] ... template_class = genshi.template:TextTemplate ... encoding = latin-1 ... ... # Some custom extractor ... [custom: **/custom/*.*] ... ''') >>> method_map, options_map = parse_mapping(buf) >>> len(method_map) 4 >>> method_map[0] ('**.py', 'python') >>> options_map['**.py'] {} >>> method_map[1] ('**/templates/**.html', 'genshi') >>> options_map['**/templates/**.html']['include_attrs'] '' >>> method_map[2] ('**/templates/**.txt', 'genshi') >>> options_map['**/templates/**.txt']['template_class'] 'genshi.template:TextTemplate' >>> options_map['**/templates/**.txt']['encoding'] 'latin-1' >>> method_map[3] ('**/custom/*.*', 'mypackage.module:myfunc') >>> options_map['**/custom/*.*'] {} :param fileobj: a readable file-like object containing the configuration text to parse :return: a `(method_map, options_map)` tuple :rtype: `tuple` :see: `extract_from_directory` t extractorst:i( RRt _sectionstreadfptsectionsRuR~RststripR3R9( RRRRRRtsectiontpartRRRH((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRTs$3  1  cCsi}x|D]}d|kr7|jd\}}n |d}}||kr |rtg|jdD]}t|^qi}n|||>> kw = parse_keywords(['_', 'dgettext:2', 'dngettext:2,3']).items() >>> kw.sort() >>> for keyword, indices in kw: ... print (keyword, indices) ('_', None) ('dgettext', (2,)) ('dngettext', (2, 3)) RRpN(RsR&ttupleRt(tstringsR^R=tfuncnametindicestx((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pyRrs     1t__main__(;RTt ConfigParserRRt distutilsRt distutils.cmdRtdistutils.errorsRRR*RRtoptparseRR4treRRRRRR RR R t babel.coreR tbabel.messages.catalogR tbabel.messages.extractRRRtbabel.messages.mofileRtbabel.messages.pofileRRtbabel.messages.pluralsRt babel.utilRRt__all__t __docformat__RRRRRtobjectRRR&RRrRR(((s;/usr/lib/python2.7/site-packages/babel/messages/frontend.pytsN        S  J  PK[鹩>>&site-packages/babel/messages/pofile.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2007 Edgewall Software # All rights reserved. # # This software is licensed as described in the file COPYING, which # you should have received as part of this distribution. The terms # are also available at http://babel.edgewall.org/wiki/License. # # This software consists of voluntary contributions made by many # individuals. For the exact contribution history, see the revision # history and logs, available at http://babel.edgewall.org/log/. """Reading and writing of files in the ``gettext`` PO (portable object) format. :see: `The Format of PO Files `_ """ from datetime import date, datetime import os import re from babel import __version__ as VERSION from babel.messages.catalog import Catalog, Message from babel.util import set, wraptext, LOCALTZ __all__ = ['read_po', 'write_po'] __docformat__ = 'restructuredtext en' def unescape(string): r"""Reverse `escape` the given string. >>> print unescape('"Say:\\n \\"hello, world!\\"\\n"') Say: "hello, world!" :param string: the string to unescape :return: the unescaped string :rtype: `str` or `unicode` """ return string[1:-1].replace('\\\\', '\\') \ .replace('\\t', '\t') \ .replace('\\r', '\r') \ .replace('\\n', '\n') \ .replace('\\"', '\"') def denormalize(string): r"""Reverse the normalization done by the `normalize` function. >>> print denormalize(r'''"" ... "Say:\n" ... " \"hello, world!\"\n"''') Say: "hello, world!" >>> print denormalize(r'''"" ... "Say:\n" ... " \"Lorem ipsum dolor sit " ... "amet, consectetur adipisicing" ... " elit, \"\n"''') Say: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " :param string: the string to denormalize :return: the denormalized string :rtype: `unicode` or `str` """ if string.startswith('""'): lines = [] for line in string.splitlines()[1:]: lines.append(unescape(line)) return ''.join(lines) else: return unescape(string) def read_po(fileobj, locale=None, domain=None, ignore_obsolete=False): """Read messages from a ``gettext`` PO (portable object) file from the given file-like object and return a `Catalog`. >>> from StringIO import StringIO >>> buf = StringIO(''' ... #: main.py:1 ... #, fuzzy, python-format ... msgid "foo %(name)s" ... msgstr "" ... ... # A user comment ... #. An auto comment ... #: main.py:3 ... msgid "bar" ... msgid_plural "baz" ... msgstr[0] "" ... msgstr[1] "" ... ''') >>> catalog = read_po(buf) >>> catalog.revision_date = datetime(2007, 04, 01) >>> for message in catalog: ... if message.id: ... print (message.id, message.string) ... print ' ', (message.locations, message.flags) ... print ' ', (message.user_comments, message.auto_comments) (u'foo %(name)s', '') ([(u'main.py', 1)], set([u'fuzzy', u'python-format'])) ([], []) ((u'bar', u'baz'), ('', '')) ([(u'main.py', 3)], set([])) ([u'A user comment'], [u'An auto comment']) :param fileobj: the file-like object to read the PO file from :param locale: the locale identifier or `Locale` object, or `None` if the catalog is not bound to a locale (which basically means it's a template) :param domain: the message domain :param ignore_obsolete: whether to ignore obsolete messages in the input :return: an iterator over ``(message, translation, location)`` tuples :rtype: ``iterator`` """ catalog = Catalog(locale=locale, domain=domain) counter = [0] offset = [0] messages = [] translations = [] locations = [] flags = [] user_comments = [] auto_comments = [] obsolete = [False] in_msgid = [False] in_msgstr = [False] def _add_message(): translations.sort() if len(messages) > 1: msgid = tuple([denormalize(m) for m in messages]) else: msgid = denormalize(messages[0]) if isinstance(msgid, (list, tuple)): string = [] for idx in range(catalog.num_plurals): try: string.append(translations[idx]) except IndexError: string.append((idx, '')) string = tuple([denormalize(t[1]) for t in string]) else: string = denormalize(translations[0][1]) message = Message(msgid, string, list(locations), set(flags), auto_comments, user_comments, lineno=offset[0] + 1) if obsolete[0]: if not ignore_obsolete: catalog.obsolete[msgid] = message else: catalog[msgid] = message del messages[:]; del translations[:]; del locations[:]; del flags[:]; del auto_comments[:]; del user_comments[:] obsolete[0] = False counter[0] += 1 def _process_message_line(lineno, line): if line.startswith('msgid_plural'): in_msgid[0] = True msg = line[12:].lstrip() messages.append(msg) elif line.startswith('msgid'): in_msgid[0] = True offset[0] = lineno txt = line[5:].lstrip() if messages: _add_message() messages.append(txt) elif line.startswith('msgstr'): in_msgid[0] = False in_msgstr[0] = True msg = line[6:].lstrip() if msg.startswith('['): idx, msg = msg[1:].split(']', 1) translations.append([int(idx), msg.lstrip()]) else: translations.append([0, msg]) elif line.startswith('"'): if in_msgid[0]: messages[-1] += u'\n' + line.rstrip() elif in_msgstr[0]: translations[-1][1] += u'\n' + line.rstrip() for lineno, line in enumerate(fileobj.readlines()): line = line.strip() if not isinstance(line, unicode): line = line.decode(catalog.charset) if line.startswith('#'): in_msgid[0] = in_msgstr[0] = False if messages and translations: _add_message() if line[1:].startswith(':'): for location in line[2:].lstrip().split(): pos = location.rfind(':') if pos >= 0: try: lineno = int(location[pos + 1:]) except ValueError: continue locations.append((location[:pos], lineno)) elif line[1:].startswith(','): for flag in line[2:].lstrip().split(','): flags.append(flag.strip()) elif line[1:].startswith('~'): obsolete[0] = True _process_message_line(lineno, line[2:].lstrip()) elif line[1:].startswith('.'): # These are called auto-comments comment = line[2:].strip() if comment: # Just check that we're not adding empty comments auto_comments.append(comment) else: # These are called user comments user_comments.append(line[1:].strip()) else: _process_message_line(lineno, line) if messages: _add_message() # No actual messages found, but there was some info in comments, from which # we'll construct an empty header message elif not counter[0] and (flags or user_comments or auto_comments): messages.append(u'') translations.append([0, u'']) _add_message() return catalog WORD_SEP = re.compile('(' r'\s+|' # any whitespace r'[^\s\w]*\w+[a-zA-Z]-(?=\w+[a-zA-Z])|' # hyphenated words r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w)' # em-dash ')') def escape(string): r"""Escape the given string so that it can be included in double-quoted strings in ``PO`` files. >>> escape('''Say: ... "hello, world!" ... ''') '"Say:\\n \\"hello, world!\\"\\n"' :param string: the string to escape :return: the escaped string :rtype: `str` or `unicode` """ return '"%s"' % string.replace('\\', '\\\\') \ .replace('\t', '\\t') \ .replace('\r', '\\r') \ .replace('\n', '\\n') \ .replace('\"', '\\"') def normalize(string, prefix='', width=76): r"""Convert a string into a format that is appropriate for .po files. >>> print normalize('''Say: ... "hello, world!" ... ''', width=None) "" "Say:\n" " \"hello, world!\"\n" >>> print normalize('''Say: ... "Lorem ipsum dolor sit amet, consectetur adipisicing elit, " ... ''', width=32) "" "Say:\n" " \"Lorem ipsum dolor sit " "amet, consectetur adipisicing" " elit, \"\n" :param string: the string to normalize :param prefix: a string that should be prepended to every line :param width: the maximum line width; use `None`, 0, or a negative number to completely disable line wrapping :return: the normalized string :rtype: `unicode` """ if width and width > 0: prefixlen = len(prefix) lines = [] for idx, line in enumerate(string.splitlines(True)): if len(escape(line)) + prefixlen > width: chunks = WORD_SEP.split(line) chunks.reverse() while chunks: buf = [] size = 2 while chunks: l = len(escape(chunks[-1])) - 2 + prefixlen if size + l < width: buf.append(chunks.pop()) size += l else: if not buf: # handle long chunks by putting them on a # separate line buf.append(chunks.pop()) break lines.append(u''.join(buf)) else: lines.append(line) else: lines = string.splitlines(True) if len(lines) <= 1: return escape(string) # Remove empty trailing line if lines and not lines[-1]: del lines[-1] lines[-1] += '\n' return u'""\n' + u'\n'.join([(prefix + escape(l)) for l in lines]) def write_po(fileobj, catalog, width=76, no_location=False, omit_header=False, sort_output=False, sort_by_file=False, ignore_obsolete=False, include_previous=False): r"""Write a ``gettext`` PO (portable object) template file for a given message catalog to the provided file-like object. >>> catalog = Catalog() >>> catalog.add(u'foo %(name)s', locations=[('main.py', 1)], ... flags=('fuzzy',)) >>> catalog.add((u'bar', u'baz'), locations=[('main.py', 3)]) >>> from StringIO import StringIO >>> buf = StringIO() >>> write_po(buf, catalog, omit_header=True) >>> print buf.getvalue() #: main.py:1 #, fuzzy, python-format msgid "foo %(name)s" msgstr "" #: main.py:3 msgid "bar" msgid_plural "baz" msgstr[0] "" msgstr[1] "" :param fileobj: the file-like object to write to :param catalog: the `Catalog` instance :param width: the maximum line width for the generated output; use `None`, 0, or a negative number to completely disable line wrapping :param no_location: do not emit a location comment for every message :param omit_header: do not include the ``msgid ""`` entry at the top of the output :param sort_output: whether to sort the messages in the output by msgid :param sort_by_file: whether to sort the messages in the output by their locations :param ignore_obsolete: whether to ignore obsolete messages and not include them in the output; by default they are included as comments :param include_previous: include the old msgid as a comment when updating the catalog """ def _normalize(key, prefix=''): return normalize(key, prefix=prefix, width=width) \ .encode(catalog.charset, 'backslashreplace') def _write(text): if isinstance(text, unicode): text = text.encode(catalog.charset) fileobj.write(text) def _write_comment(comment, prefix=''): # xgettext always wraps comments even if --no-wrap is passed; # provide the same behaviour if width and width > 0: _width = width else: _width = 76 for line in wraptext(comment, _width): _write('#%s %s\n' % (prefix, line.strip())) def _write_message(message, prefix=''): if isinstance(message.id, (list, tuple)): _write('%smsgid %s\n' % (prefix, _normalize(message.id[0], prefix))) _write('%smsgid_plural %s\n' % ( prefix, _normalize(message.id[1], prefix) )) for idx in range(catalog.num_plurals): try: string = message.string[idx] except IndexError: string = '' _write('%smsgstr[%d] %s\n' % ( prefix, idx, _normalize(string, prefix) )) else: _write('%smsgid %s\n' % (prefix, _normalize(message.id, prefix))) _write('%smsgstr %s\n' % ( prefix, _normalize(message.string or '', prefix) )) messages = list(catalog) if sort_output: messages.sort() elif sort_by_file: messages.sort(lambda x,y: cmp(x.locations, y.locations)) for message in messages: if not message.id: # This is the header "message" if omit_header: continue comment_header = catalog.header_comment if width and width > 0: lines = [] for line in comment_header.splitlines(): lines += wraptext(line, width=width, subsequent_indent='# ') comment_header = u'\n'.join(lines) + u'\n' _write(comment_header) for comment in message.user_comments: _write_comment(comment) for comment in message.auto_comments: _write_comment(comment, prefix='.') if not no_location: locs = u' '.join([u'%s:%d' % (filename.replace(os.sep, '/'), lineno) for filename, lineno in message.locations]) _write_comment(locs, prefix=':') if message.flags: _write('#%s\n' % ', '.join([''] + list(message.flags))) if message.previous_id and include_previous: _write_comment('msgid %s' % _normalize(message.previous_id[0]), prefix='|') if len(message.previous_id) > 1: _write_comment('msgid_plural %s' % _normalize( message.previous_id[1] ), prefix='|') _write_message(message) _write('\n') if not ignore_obsolete: for message in catalog.obsolete.values(): for comment in message.user_comments: _write_comment(comment) _write_message(message, prefix='#~ ') _write('\n') PK[@r{?AA(site-packages/babel/messages/extract.pycnu[ Mc@s|dZddlZyeWn!ek r=ddlmZnXddlZddlmZm Z m Z m Z m Z ddl mZmZmZddlmZddd gZd Zd Zidd 6dd 6d!d6dd6d"d6d#d6d$d6dd6Zd%gZdZdZejeded&dedZed'dedZed(dedZdZ dZ!d Z"dS()sBasic infrastructure for extracting localizable messages from source files. This module defines an extensible system for collecting localizable message strings from a variety of sources. A native extractor for Python source files is builtin, extractors for other sources can be added using very simple plugins. The main entry points into the extraction functionality are the functions `extract_from_dir` and `extract_from_file`. iN(tSet(tgenerate_tokenstCOMMENTtNAMEtOPtSTRING(tparse_encodingt pathmatchtrelpath(tdedenttextracttextract_from_dirtextract_from_filesrestructuredtext ensbabel.extractorst_tgettextiitngettexttugettextt ungettexttdgettextit dngettexttN_s**.pytpythons%s: warning: Empty msgid. It is reserved by GNU gettext: gettext("") returns the header entry with meta information, not the empty string.cs#fd}t|||(dS(sHelper function for `extract` that strips comment tags from strings in a list of comment lines. This functions operates in-place. cs8x1D])}|j|r|t|jSqW|S(N(t startswithtlentstrip(tlinettag(ttags(s:/usr/lib/python2.7/site-packages/babel/messages/extract.pyt_strip>s N(tmap(tcommentsRR((Rs:/usr/lib/python2.7/site-packages/babel/messages/extract.pyt_strip_comment_tags:sccs|dkri}ntjj|}xtj|D]\}} } x<| D]4} | jdsq| jdrM| j| qMqMW| j| jx| D]} ttjj || j tj d|} x|D]\} }t | | rtjj || }i}x2|j D]$\}}t || r|}qqW|r^|| ||nxIt||d|d|d|d|D] \}}}| |||fVqWPqqWqWq7WdS( sR Extract messages from any source files found in the given directory. This function generates tuples of the form: ``(filename, lineno, message, comments)`` Which extraction method is used per file is determined by the `method_map` parameter, which maps extended glob patterns to extraction method names. For example, the following is the default mapping: >>> method_map = [ ... ('**.py', 'python') ... ] This basically says that files with the filename extension ".py" at any level inside the directory should be processed by the "python" extraction method. Files that don't match any of the mapping patterns are ignored. See the documentation of the `pathmatch` function for details on the pattern syntax. The following extended mapping would also use the "genshi" extraction method on any file in "templates" subdirectory: >>> method_map = [ ... ('**/templates/**.*', 'genshi'), ... ('**.py', 'python') ... ] The dictionary provided by the optional `options_map` parameter augments these mappings. It uses extended glob patterns as keys, and the values are dictionaries mapping options names to option values (both strings). The glob patterns of the `options_map` do not necessarily need to be the same as those used in the method mapping. For example, while all files in the ``templates`` folders in an application may be Genshi applications, the options for those files may differ based on extension: >>> options_map = { ... '**/templates/**.txt': { ... 'template_class': 'genshi.template:TextTemplate', ... 'encoding': 'latin-1' ... }, ... '**/templates/**.html': { ... 'include_attrs': '' ... } ... } :param dirname: the path to the directory to extract messages from :param method_map: a list of ``(pattern, method)`` tuples that maps of extraction method names to extended glob patterns :param options_map: a dictionary of additional options (optional) :param keywords: a dictionary mapping keywords (i.e. names of functions that should be recognized as translation functions) to tuples that specify which of their arguments contain localizable strings :param comment_tags: a list of tags of translator comments to search for and include in the results :param callback: a function that is called for every file that message are extracted from, just before the extraction itself is performed; the function is passed the filename, the name of the extraction method and and the options dictionary as positional arguments, in that order :param strip_comment_tags: a flag that if set to `True` causes all comment tags to be removed from the collected comments. :return: an iterator over ``(filename, lineno, funcname, message)`` tuples :rtype: ``iterator`` :see: `pathmatch` t.R t/tkeywordst comment_tagstoptionststrip_comment_tagsN(tNonetostpathtabspathtwalkRtremovetsortRtjointreplacetsepRtitemsR (tdirnamet method_mapt options_mapR"R#tcallbackR%tabsnametroottdirnamest filenamestsubdirtfilenametpatterntmethodtfilepathR$topatterntodicttlinenotmessageR((s:/usr/lib/python2.7/site-packages/babel/messages/extract.pyR Fs<G      !   cCsDt|d}z#tt||||||SWd|jXdS(sExtract messages from a specific file. This function returns a list of tuples of the form: ``(lineno, funcname, message)`` :param filename: the path to the file to extract messages from :param method: a string specifying the extraction method (.e.g. "python") :param keywords: a dictionary mapping keywords (i.e. names of functions that should be recognized as translation functions) to tuples that specify which of their arguments contain localizable strings :param comment_tags: a list of translator tags to search for and include in the results :param strip_comment_tags: a flag that if set to `True` causes all comment tags to be removed from the collected comments. :param options: a dictionary of additional options (optional) :return: the list of extracted messages :rtype: `list` tUN(topentlistR tclose(R<R:R"R#R$R%tfileobj((s:/usr/lib/python2.7/site-packages/babel/messages/extract.pyR s c csd}d|ksd|krd|krU|jd}|| ||d}} n|jdd\}} tt|ii| g| }n{yddlm} Wn4tk ritd6t d6} | j |}n1Xx-| j t |D]} | j dt}PqW|dkr+td |n|||j|d |pIi} x| D]\}}}}|r||p{d}nd}t|ttfs|g}n|sqVng}t}t|}xU|D]M}||krt}Pn||d}|dkrt}Pn|j|qW|r0qVn|d d}||sd t|d rc|jpfd|f}tjt|IJqVnt|}t|dkr|d }n|rt||n|||fVqVWdS(sExtract messages from the given file-like object using the specified extraction method. This function returns a list of tuples of the form: ``(lineno, message, comments)`` The implementation dispatches the actual extraction to plugins, based on the value of the ``method`` parameter. >>> source = '''# foo module ... def run(argv): ... print _('Hello, world!') ... ''' >>> from StringIO import StringIO >>> for message in extract('python', StringIO(source)): ... print message (3, u'Hello, world!', []) :param method: a string specifying the extraction method (.e.g. "python"); if this is a simple name, the extraction function will be looked up by entry point; if it is an explicit reference to a function (of the form ``package.module:funcname`` or ``package.module.funcname``), the corresponding function will be imported and used :param fileobj: the file-like object the messages should be extracted from :param keywords: a dictionary mapping keywords (i.e. names of functions that should be recognized as translation functions) to tuples that specify which of their arguments contain localizable strings :param comment_tags: a list of translator tags to search for and include in the results :param options: a dictionary of additional options (optional) :param strip_comment_tags: a flag that if set to `True` causes all comment tags to be removed from the collected comments. :return: the list of extracted messages :rtype: `list` :raise ValueError: if the extraction method is not registered t:R ii(t working_settignoreRtrequiresUnknown extraction method %rR$is%s:%itnames (unknown)N(i(i(R&trfindtsplittgetattrt __import__t pkg_resourcesRHt ImportErrortextract_nothingtextract_pythontgettiter_entry_pointst GROUP_NAMEtloadtTruet ValueErrortkeyst isinstanceRDttupletFalseRtappendthasattrRKtsyststderrtempty_msgid_warningR(R<RFR"R#R$R%tfunctlastdottmoduletattrnameRHtbuiltint entry_pointtresultsR@tfuncnametmessagesRtspectmsgstinvalidt last_indextindexRAtfirst_msg_indextwhere((s:/usr/lib/python2.7/site-packages/babel/messages/extract.pyR sl* $            cCsgS(sdPseudo extractor that does not actually extract anything, but simply returns an empty list. ((RFR"R#R$((s:/usr/lib/python2.7/site-packages/babel/messages/extract.pyRR@sccsd}}}d}g}g} g} t} } d} t|pQ|jdd}t|j}x|D]\}}\}}}}|dkr|tkr|dkrt} qj|tkr|dkr| rt} qjn|r|}|d7}qqj| r"|tkr"|dkr"t} qjqj|dkr|t kr|j |dj }| r| dd |dkr| j ||fqjnx|D]2} |j | rt} | j ||fPqqWqj|r|d kr|tkr|d kr|r| j d j||2n | j dt| dkrEt| } n | d } | rv| dd |dkrvg} n||| g| D]}|d^qfVd}}}d}g} g} t} q|tkr'td ||fiid 6i}t|tr|j |}n|j |q|tkr|dkr|rb| j d j||2n | j d| r| j\}}| j |d|fqqqj|d kr|tkr|d kr|d8}qj|r|dkrd}qj|tkrj||krj|}qjqjWdS(sAExtract messages from Python source code. :param fileobj: the seekable, file-like object the messages should be extracted from :param keywords: a list of keywords (i.e. function names) that should be recognized as translation functions :param comment_tags: a list of translator tags to search for and include in the results :param options: a dictionary of additional options (optional) :return: an iterator over ``(lineno, funcname, message, comments)`` tuples :rtype: ``iterator`` itencodings iso-8859-1tdeftclasst(iRGit)ts# coding=%s %st __builtins__t,N(RtRu(R&R]RRTRtreadlineRRXRRtdecodeRR^RR-RR\RtevalR[tstrtpop(RFR"R#R$RjR@tmessage_linenot call_stacktbufRkttranslator_commentstin_deftin_translator_commentst comment_tagRsttokensttoktvalueR tcommentt old_linenot old_comment((s:/usr/lib/python2.7/site-packages/babel/messages/extract.pyRSGs  "$           $  ccsddlm}m}d}}g}d} g} t} |jdd} d} d}xb||jj| D]E}|jdkr|j dkr|r|j }|d7}qn|dkrc|jdkrc|j d j }| r | dd |j dkr | j |j |fqrnx|D]5}|j |r'| j |j |j fPq'q'WnN|jd kr8g} |j d d !j }x |D]}|j |r|j}|r-|d j |d sD   (   hq  pPK[!IT)site-packages/babel/messages/checkers.pyonu[ Mc@sdZddlmZddlmZmZddlmZedddgedd ged d d d ggZdZ dZ dZ dZ e Z dS(sQVarious routines that help with validation of translations. :since: version 0.9 i(tizip(tTranslationErrort PYTHON_FORMAT(tsettitdtutxtXtftFtgtGcCs|js.t|jts*tdndS|dkr>dS|j}t|ttfsh|f}nt||j krtd|j ndS(s0Verify the number of plurals in the translation.s/Found plural forms for non-pluralizable messageNs*Wrong number of plural forms (expected %d)( t pluralizablet isinstancetstringt basestringRtNonetlistttupletlent num_plurals(tcatalogtmessagetmsgstrs((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyRs    cCsd|jkrdS|j}t|ttfs=|f}n|j}t|ttfsg|f}nx3t||D]"\}}|rwt||qwqwWdS(s9Verify the format string placeholders in the translation.s python-formatN(tflagstidRRRRRt_validate_format(RRtmsgidsRtmsgidtmsgstr((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt python_format3s    c Csd}d}d}t|||f\}}t|||f\}}|rt| rt| rttdn||krtdn|r&t|t|krtdnxtt||D]M\} \\} } \} } || | std| d| | fqqWnut|} xf|D]^\}}|| krdtd |q9||| |s9td ||| |fq9q9Wd S( sTest format string `alternative` against `format`. `format` can be the msgid of a message and `alternative` one of the `msgstr`\s. The two arguments are not interchangeable as `alternative` may contain less placeholders if `format` uses named placeholders. The behavior of this function is undefined if the string does not use string formattings. If the string formatting of `alternative` is compatible to `format` the function returns `None`, otherwise a `TranslationError` is raised. Examples for compatible format strings: >>> _validate_format('Hello %s!', 'Hallo %s!') >>> _validate_format('Hello %i!', 'Hallo %d!') Example for an incompatible format strings: >>> _validate_format('Hello %(name)s!', 'Hallo %s!') Traceback (most recent call last): ... TranslationError: the format strings are of different kinds This function is used by the `python_format` checker. :param format: The original format string :param alternative: The alternative format string that should be checked against format :return: None on success :raises TranslationError: on formatting errors cSspg}xctj|D]R}|j\}}}|dkrO|dkrOqn|j|t|fqW|S(Nt%(RtfinditertgroupsRtappendtstr(Rtresulttmatchtnametformatttypechar((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt_parsedscSsA||krtSx*tD]"}||kr||krtSqWtS(N(tTruet_string_format_compatibilitiestFalse(tatbR((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt _compatiblems   cSscd}xP|D]H\}}|dkr4|dk}q |dk|kr tdq q Wt|S(Ns5format string mixes positional and named placeholders(RRtbool(tresultst positionalR'tchar((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt_check_positionalus splaceholders are incompatibles)the format strings are of different kindss-positional format placeholders are unbalancedsDincompatible format for placeholder %d: %r and %r are not compatibleisunknown named placeholder %rsDincompatible format for placeholder %r: %r and %r are not compatibleN(tmapRRt enumerateRtdict(R(t alternativeR*R0R5R.R/t a_positionalt b_positionaltidxt_tfirsttsecondttype_mapR'R)((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyRCs.!   4!  cCsfyddlm}Wntk r.ttgSXg}x*|jdD]}|j|jqEW|S(Ni(t working_setsbabel.checkers(t pkg_resourcesRAt ImportErrorRRtiter_entry_pointsR#tload(RAtcheckerst entry_point((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyt_find_checkerss  N(t__doc__t itertoolsRtbabel.messages.catalogRRt babel.utilRR,RRRRHRF(((s;/usr/lib/python2.7/site-packages/babel/messages/checkers.pyts   ` PK["_  )site-packages/babel/messages/__init__.pycnu[ Mc@sdZddlTdS(s)Support for ``gettext`` message catalogs.i(t*N(t__doc__tbabel.messages.catalog(((s;/usr/lib/python2.7/site-packages/babel/messages/__init__.pytsPK[Ǖ !!(site-packages/babel/messages/jslexer.pyonu[ Mc+@sdZddlZddlmZdddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.g+Zejd/id0d16d2d36d4d56d6d76d8d96Zdejd:fdejd;fd<ejd=fd>ejd?fd@ejdAfdBejdCfdDejdEdj e ej efdFejdGfgZ ejdHZ ejdIZejdJZejdKejZejdLZdMefdNYZdOZdPZdQZdS(RsJA simple JavaScript 1.5 lexer which is used for the JavaScript extractor. iN(t itemgettert+t-t*t%s!=s==ts<=s>=t=s+=s-=s*=s%=s<>s>>>s<<=s>>=s>>>=t&s&=t|s|=s&&s||t^s^=t(t)t[t]t{t}t!s--s++t~t,t;t.t:cCstt| t| S(N(tcmptlen(tatb((s:/usr/lib/python2.7/site-packages/babel/messages/jslexer.pytssRs tfs tns trs tts\s+(?u)s 0.42261 # 256 --> 0.57851 # 512 --> 0.74851 # 1024 --> 0.89384 # 2048 --> 0.97583 # # Idea Distribution Ratio = 0.74851/(1-0.74851) =2.98 # Random Distribution Ration = 512/(5401-512)=0.105 # # Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR EUCTW_TYPICAL_DISTRIBUTION_RATIO = 0.75 # Char to FreqOrder table , EUCTW_TABLE_SIZE = 8102 EUCTWCharToFreqOrder = ( 1,1800,1506, 255,1431, 198, 9, 82, 6,7310, 177, 202,3615,1256,2808, 110, # 2742 3735, 33,3241, 261, 76, 44,2113, 16,2931,2184,1176, 659,3868, 26,3404,2643, # 2758 1198,3869,3313,4060, 410,2211, 302, 590, 361,1963, 8, 204, 58,4296,7311,1931, # 2774 63,7312,7313, 317,1614, 75, 222, 159,4061,2412,1480,7314,3500,3068, 224,2809, # 2790 3616, 3, 10,3870,1471, 29,2774,1135,2852,1939, 873, 130,3242,1123, 312,7315, # 2806 4297,2051, 507, 252, 682,7316, 142,1914, 124, 206,2932, 34,3501,3173, 64, 604, # 2822 7317,2494,1976,1977, 155,1990, 645, 641,1606,7318,3405, 337, 72, 406,7319, 80, # 2838 630, 238,3174,1509, 263, 939,1092,2644, 756,1440,1094,3406, 449, 69,2969, 591, # 2854 179,2095, 471, 115,2034,1843, 60, 50,2970, 134, 806,1868, 734,2035,3407, 180, # 2870 995,1607, 156, 537,2893, 688,7320, 319,1305, 779,2144, 514,2374, 298,4298, 359, # 2886 2495, 90,2707,1338, 663, 11, 906,1099,2545, 20,2436, 182, 532,1716,7321, 732, # 2902 1376,4062,1311,1420,3175, 25,2312,1056, 113, 399, 382,1949, 242,3408,2467, 529, # 2918 3243, 475,1447,3617,7322, 117, 21, 656, 810,1297,2295,2329,3502,7323, 126,4063, # 2934 706, 456, 150, 613,4299, 71,1118,2036,4064, 145,3069, 85, 835, 486,2114,1246, # 2950 1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,7324,2127,2354, 347,3736, 221, # 2966 3503,3110,7325,1955,1153,4065, 83, 296,1199,3070, 192, 624, 93,7326, 822,1897, # 2982 2810,3111, 795,2064, 991,1554,1542,1592, 27, 43,2853, 859, 139,1456, 860,4300, # 2998 437, 712,3871, 164,2392,3112, 695, 211,3017,2096, 195,3872,1608,3504,3505,3618, # 3014 3873, 234, 811,2971,2097,3874,2229,1441,3506,1615,2375, 668,2076,1638, 305, 228, # 3030 1664,4301, 467, 415,7327, 262,2098,1593, 239, 108, 300, 200,1033, 512,1247,2077, # 3046 7328,7329,2173,3176,3619,2673, 593, 845,1062,3244, 88,1723,2037,3875,1950, 212, # 3062 266, 152, 149, 468,1898,4066,4302, 77, 187,7330,3018, 37, 5,2972,7331,3876, # 3078 7332,7333, 39,2517,4303,2894,3177,2078, 55, 148, 74,4304, 545, 483,1474,1029, # 3094 1665, 217,1869,1531,3113,1104,2645,4067, 24, 172,3507, 900,3877,3508,3509,4305, # 3110 32,1408,2811,1312, 329, 487,2355,2247,2708, 784,2674, 4,3019,3314,1427,1788, # 3126 188, 109, 499,7334,3620,1717,1789, 888,1217,3020,4306,7335,3510,7336,3315,1520, # 3142 3621,3878, 196,1034, 775,7337,7338, 929,1815, 249, 439, 38,7339,1063,7340, 794, # 3158 3879,1435,2296, 46, 178,3245,2065,7341,2376,7342, 214,1709,4307, 804, 35, 707, # 3174 324,3622,1601,2546, 140, 459,4068,7343,7344,1365, 839, 272, 978,2257,2572,3409, # 3190 2128,1363,3623,1423, 697, 100,3071, 48, 70,1231, 495,3114,2193,7345,1294,7346, # 3206 2079, 462, 586,1042,3246, 853, 256, 988, 185,2377,3410,1698, 434,1084,7347,3411, # 3222 314,2615,2775,4308,2330,2331, 569,2280, 637,1816,2518, 757,1162,1878,1616,3412, # 3238 287,1577,2115, 768,4309,1671,2854,3511,2519,1321,3737, 909,2413,7348,4069, 933, # 3254 3738,7349,2052,2356,1222,4310, 765,2414,1322, 786,4311,7350,1919,1462,1677,2895, # 3270 1699,7351,4312,1424,2437,3115,3624,2590,3316,1774,1940,3413,3880,4070, 309,1369, # 3286 1130,2812, 364,2230,1653,1299,3881,3512,3882,3883,2646, 525,1085,3021, 902,2000, # 3302 1475, 964,4313, 421,1844,1415,1057,2281, 940,1364,3116, 376,4314,4315,1381, 7, # 3318 2520, 983,2378, 336,1710,2675,1845, 321,3414, 559,1131,3022,2742,1808,1132,1313, # 3334 265,1481,1857,7352, 352,1203,2813,3247, 167,1089, 420,2814, 776, 792,1724,3513, # 3350 4071,2438,3248,7353,4072,7354, 446, 229, 333,2743, 901,3739,1200,1557,4316,2647, # 3366 1920, 395,2744,2676,3740,4073,1835, 125, 916,3178,2616,4317,7355,7356,3741,7357, # 3382 7358,7359,4318,3117,3625,1133,2547,1757,3415,1510,2313,1409,3514,7360,2145, 438, # 3398 2591,2896,2379,3317,1068, 958,3023, 461, 311,2855,2677,4074,1915,3179,4075,1978, # 3414 383, 750,2745,2617,4076, 274, 539, 385,1278,1442,7361,1154,1964, 384, 561, 210, # 3430 98,1295,2548,3515,7362,1711,2415,1482,3416,3884,2897,1257, 129,7363,3742, 642, # 3446 523,2776,2777,2648,7364, 141,2231,1333, 68, 176, 441, 876, 907,4077, 603,2592, # 3462 710, 171,3417, 404, 549, 18,3118,2393,1410,3626,1666,7365,3516,4319,2898,4320, # 3478 7366,2973, 368,7367, 146, 366, 99, 871,3627,1543, 748, 807,1586,1185, 22,2258, # 3494 379,3743,3180,7368,3181, 505,1941,2618,1991,1382,2314,7369, 380,2357, 218, 702, # 3510 1817,1248,3418,3024,3517,3318,3249,7370,2974,3628, 930,3250,3744,7371, 59,7372, # 3526 585, 601,4078, 497,3419,1112,1314,4321,1801,7373,1223,1472,2174,7374, 749,1836, # 3542 690,1899,3745,1772,3885,1476, 429,1043,1790,2232,2116, 917,4079, 447,1086,1629, # 3558 7375, 556,7376,7377,2020,1654, 844,1090, 105, 550, 966,1758,2815,1008,1782, 686, # 3574 1095,7378,2282, 793,1602,7379,3518,2593,4322,4080,2933,2297,4323,3746, 980,2496, # 3590 544, 353, 527,4324, 908,2678,2899,7380, 381,2619,1942,1348,7381,1341,1252, 560, # 3606 3072,7382,3420,2856,7383,2053, 973, 886,2080, 143,4325,7384,7385, 157,3886, 496, # 3622 4081, 57, 840, 540,2038,4326,4327,3421,2117,1445, 970,2259,1748,1965,2081,4082, # 3638 3119,1234,1775,3251,2816,3629, 773,1206,2129,1066,2039,1326,3887,1738,1725,4083, # 3654 279,3120, 51,1544,2594, 423,1578,2130,2066, 173,4328,1879,7386,7387,1583, 264, # 3670 610,3630,4329,2439, 280, 154,7388,7389,7390,1739, 338,1282,3073, 693,2857,1411, # 3686 1074,3747,2440,7391,4330,7392,7393,1240, 952,2394,7394,2900,1538,2679, 685,1483, # 3702 4084,2468,1436, 953,4085,2054,4331, 671,2395, 79,4086,2441,3252, 608, 567,2680, # 3718 3422,4087,4088,1691, 393,1261,1791,2396,7395,4332,7396,7397,7398,7399,1383,1672, # 3734 3748,3182,1464, 522,1119, 661,1150, 216, 675,4333,3888,1432,3519, 609,4334,2681, # 3750 2397,7400,7401,7402,4089,3025, 0,7403,2469, 315, 231,2442, 301,3319,4335,2380, # 3766 7404, 233,4090,3631,1818,4336,4337,7405, 96,1776,1315,2082,7406, 257,7407,1809, # 3782 3632,2709,1139,1819,4091,2021,1124,2163,2778,1777,2649,7408,3074, 363,1655,3183, # 3798 7409,2975,7410,7411,7412,3889,1567,3890, 718, 103,3184, 849,1443, 341,3320,2934, # 3814 1484,7413,1712, 127, 67, 339,4092,2398, 679,1412, 821,7414,7415, 834, 738, 351, # 3830 2976,2146, 846, 235,1497,1880, 418,1992,3749,2710, 186,1100,2147,2746,3520,1545, # 3846 1355,2935,2858,1377, 583,3891,4093,2573,2977,7416,1298,3633,1078,2549,3634,2358, # 3862 78,3750,3751, 267,1289,2099,2001,1594,4094, 348, 369,1274,2194,2175,1837,4338, # 3878 1820,2817,3635,2747,2283,2002,4339,2936,2748, 144,3321, 882,4340,3892,2749,3423, # 3894 4341,2901,7417,4095,1726, 320,7418,3893,3026, 788,2978,7419,2818,1773,1327,2859, # 3910 3894,2819,7420,1306,4342,2003,1700,3752,3521,2359,2650, 787,2022, 506, 824,3636, # 3926 534, 323,4343,1044,3322,2023,1900, 946,3424,7421,1778,1500,1678,7422,1881,4344, # 3942 165, 243,4345,3637,2521, 123, 683,4096, 764,4346, 36,3895,1792, 589,2902, 816, # 3958 626,1667,3027,2233,1639,1555,1622,3753,3896,7423,3897,2860,1370,1228,1932, 891, # 3974 2083,2903, 304,4097,7424, 292,2979,2711,3522, 691,2100,4098,1115,4347, 118, 662, # 3990 7425, 611,1156, 854,2381,1316,2861, 2, 386, 515,2904,7426,7427,3253, 868,2234, # 4006 1486, 855,2651, 785,2212,3028,7428,1040,3185,3523,7429,3121, 448,7430,1525,7431, # 4022 2164,4348,7432,3754,7433,4099,2820,3524,3122, 503, 818,3898,3123,1568, 814, 676, # 4038 1444, 306,1749,7434,3755,1416,1030, 197,1428, 805,2821,1501,4349,7435,7436,7437, # 4054 1993,7438,4350,7439,7440,2195, 13,2779,3638,2980,3124,1229,1916,7441,3756,2131, # 4070 7442,4100,4351,2399,3525,7443,2213,1511,1727,1120,7444,7445, 646,3757,2443, 307, # 4086 7446,7447,1595,3186,7448,7449,7450,3639,1113,1356,3899,1465,2522,2523,7451, 519, # 4102 7452, 128,2132, 92,2284,1979,7453,3900,1512, 342,3125,2196,7454,2780,2214,1980, # 4118 3323,7455, 290,1656,1317, 789, 827,2360,7456,3758,4352, 562, 581,3901,7457, 401, # 4134 4353,2248, 94,4354,1399,2781,7458,1463,2024,4355,3187,1943,7459, 828,1105,4101, # 4150 1262,1394,7460,4102, 605,4356,7461,1783,2862,7462,2822, 819,2101, 578,2197,2937, # 4166 7463,1502, 436,3254,4103,3255,2823,3902,2905,3425,3426,7464,2712,2315,7465,7466, # 4182 2332,2067, 23,4357, 193, 826,3759,2102, 699,1630,4104,3075, 390,1793,1064,3526, # 4198 7467,1579,3076,3077,1400,7468,4105,1838,1640,2863,7469,4358,4359, 137,4106, 598, # 4214 3078,1966, 780, 104, 974,2938,7470, 278, 899, 253, 402, 572, 504, 493,1339,7471, # 4230 3903,1275,4360,2574,2550,7472,3640,3029,3079,2249, 565,1334,2713, 863, 41,7473, # 4246 7474,4361,7475,1657,2333, 19, 463,2750,4107, 606,7476,2981,3256,1087,2084,1323, # 4262 2652,2982,7477,1631,1623,1750,4108,2682,7478,2864, 791,2714,2653,2334, 232,2416, # 4278 7479,2983,1498,7480,2654,2620, 755,1366,3641,3257,3126,2025,1609, 119,1917,3427, # 4294 862,1026,4109,7481,3904,3760,4362,3905,4363,2260,1951,2470,7482,1125, 817,4110, # 4310 4111,3906,1513,1766,2040,1487,4112,3030,3258,2824,3761,3127,7483,7484,1507,7485, # 4326 2683, 733, 40,1632,1106,2865, 345,4113, 841,2524, 230,4364,2984,1846,3259,3428, # 4342 7486,1263, 986,3429,7487, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562,3907, # 4358 3908,2939, 967,2751,2655,1349, 592,2133,1692,3324,2985,1994,4114,1679,3909,1901, # 4374 2185,7488, 739,3642,2715,1296,1290,7489,4115,2198,2199,1921,1563,2595,2551,1870, # 4390 2752,2986,7490, 435,7491, 343,1108, 596, 17,1751,4365,2235,3430,3643,7492,4366, # 4406 294,3527,2940,1693, 477, 979, 281,2041,3528, 643,2042,3644,2621,2782,2261,1031, # 4422 2335,2134,2298,3529,4367, 367,1249,2552,7493,3530,7494,4368,1283,3325,2004, 240, # 4438 1762,3326,4369,4370, 836,1069,3128, 474,7495,2148,2525, 268,3531,7496,3188,1521, # 4454 1284,7497,1658,1546,4116,7498,3532,3533,7499,4117,3327,2684,1685,4118, 961,1673, # 4470 2622, 190,2005,2200,3762,4371,4372,7500, 570,2497,3645,1490,7501,4373,2623,3260, # 4486 1956,4374, 584,1514, 396,1045,1944,7502,4375,1967,2444,7503,7504,4376,3910, 619, # 4502 7505,3129,3261, 215,2006,2783,2553,3189,4377,3190,4378, 763,4119,3763,4379,7506, # 4518 7507,1957,1767,2941,3328,3646,1174, 452,1477,4380,3329,3130,7508,2825,1253,2382, # 4534 2186,1091,2285,4120, 492,7509, 638,1169,1824,2135,1752,3911, 648, 926,1021,1324, # 4550 4381, 520,4382, 997, 847,1007, 892,4383,3764,2262,1871,3647,7510,2400,1784,4384, # 4566 1952,2942,3080,3191,1728,4121,2043,3648,4385,2007,1701,3131,1551, 30,2263,4122, # 4582 7511,2026,4386,3534,7512, 501,7513,4123, 594,3431,2165,1821,3535,3432,3536,3192, # 4598 829,2826,4124,7514,1680,3132,1225,4125,7515,3262,4387,4126,3133,2336,7516,4388, # 4614 4127,7517,3912,3913,7518,1847,2383,2596,3330,7519,4389, 374,3914, 652,4128,4129, # 4630 375,1140, 798,7520,7521,7522,2361,4390,2264, 546,1659, 138,3031,2445,4391,7523, # 4646 2250, 612,1848, 910, 796,3765,1740,1371, 825,3766,3767,7524,2906,2554,7525, 692, # 4662 444,3032,2624, 801,4392,4130,7526,1491, 244,1053,3033,4131,4132, 340,7527,3915, # 4678 1041,2987, 293,1168, 87,1357,7528,1539, 959,7529,2236, 721, 694,4133,3768, 219, # 4694 1478, 644,1417,3331,2656,1413,1401,1335,1389,3916,7530,7531,2988,2362,3134,1825, # 4710 730,1515, 184,2827, 66,4393,7532,1660,2943, 246,3332, 378,1457, 226,3433, 975, # 4726 3917,2944,1264,3537, 674, 696,7533, 163,7534,1141,2417,2166, 713,3538,3333,4394, # 4742 3918,7535,7536,1186, 15,7537,1079,1070,7538,1522,3193,3539, 276,1050,2716, 758, # 4758 1126, 653,2945,3263,7539,2337, 889,3540,3919,3081,2989, 903,1250,4395,3920,3434, # 4774 3541,1342,1681,1718, 766,3264, 286, 89,2946,3649,7540,1713,7541,2597,3334,2990, # 4790 7542,2947,2215,3194,2866,7543,4396,2498,2526, 181, 387,1075,3921, 731,2187,3335, # 4806 7544,3265, 310, 313,3435,2299, 770,4134, 54,3034, 189,4397,3082,3769,3922,7545, # 4822 1230,1617,1849, 355,3542,4135,4398,3336, 111,4136,3650,1350,3135,3436,3035,4137, # 4838 2149,3266,3543,7546,2784,3923,3924,2991, 722,2008,7547,1071, 247,1207,2338,2471, # 4854 1378,4399,2009, 864,1437,1214,4400, 373,3770,1142,2216, 667,4401, 442,2753,2555, # 4870 3771,3925,1968,4138,3267,1839, 837, 170,1107, 934,1336,1882,7548,7549,2118,4139, # 4886 2828, 743,1569,7550,4402,4140, 582,2384,1418,3437,7551,1802,7552, 357,1395,1729, # 4902 3651,3268,2418,1564,2237,7553,3083,3772,1633,4403,1114,2085,4141,1532,7554, 482, # 4918 2446,4404,7555,7556,1492, 833,1466,7557,2717,3544,1641,2829,7558,1526,1272,3652, # 4934 4142,1686,1794, 416,2556,1902,1953,1803,7559,3773,2785,3774,1159,2316,7560,2867, # 4950 4405,1610,1584,3036,2419,2754, 443,3269,1163,3136,7561,7562,3926,7563,4143,2499, # 4966 3037,4406,3927,3137,2103,1647,3545,2010,1872,4144,7564,4145, 431,3438,7565, 250, # 4982 97, 81,4146,7566,1648,1850,1558, 160, 848,7567, 866, 740,1694,7568,2201,2830, # 4998 3195,4147,4407,3653,1687, 950,2472, 426, 469,3196,3654,3655,3928,7569,7570,1188, # 5014 424,1995, 861,3546,4148,3775,2202,2685, 168,1235,3547,4149,7571,2086,1674,4408, # 5030 3337,3270, 220,2557,1009,7572,3776, 670,2992, 332,1208, 717,7573,7574,3548,2447, # 5046 3929,3338,7575, 513,7576,1209,2868,3339,3138,4409,1080,7577,7578,7579,7580,2527, # 5062 3656,3549, 815,1587,3930,3931,7581,3550,3439,3777,1254,4410,1328,3038,1390,3932, # 5078 1741,3933,3778,3934,7582, 236,3779,2448,3271,7583,7584,3657,3780,1273,3781,4411, # 5094 7585, 308,7586,4412, 245,4413,1851,2473,1307,2575, 430, 715,2136,2449,7587, 270, # 5110 199,2869,3935,7588,3551,2718,1753, 761,1754, 725,1661,1840,4414,3440,3658,7589, # 5126 7590, 587, 14,3272, 227,2598, 326, 480,2265, 943,2755,3552, 291, 650,1883,7591, # 5142 1702,1226, 102,1547, 62,3441, 904,4415,3442,1164,4150,7592,7593,1224,1548,2756, # 5158 391, 498,1493,7594,1386,1419,7595,2055,1177,4416, 813, 880,1081,2363, 566,1145, # 5174 4417,2286,1001,1035,2558,2599,2238, 394,1286,7596,7597,2068,7598, 86,1494,1730, # 5190 3936, 491,1588, 745, 897,2948, 843,3340,3937,2757,2870,3273,1768, 998,2217,2069, # 5206 397,1826,1195,1969,3659,2993,3341, 284,7599,3782,2500,2137,2119,1903,7600,3938, # 5222 2150,3939,4151,1036,3443,1904, 114,2559,4152, 209,1527,7601,7602,2949,2831,2625, # 5238 2385,2719,3139, 812,2560,7603,3274,7604,1559, 737,1884,3660,1210, 885, 28,2686, # 5254 3553,3783,7605,4153,1004,1779,4418,7606, 346,1981,2218,2687,4419,3784,1742, 797, # 5270 1642,3940,1933,1072,1384,2151, 896,3941,3275,3661,3197,2871,3554,7607,2561,1958, # 5286 4420,2450,1785,7608,7609,7610,3942,4154,1005,1308,3662,4155,2720,4421,4422,1528, # 5302 2600, 161,1178,4156,1982, 987,4423,1101,4157, 631,3943,1157,3198,2420,1343,1241, # 5318 1016,2239,2562, 372, 877,2339,2501,1160, 555,1934, 911,3944,7611, 466,1170, 169, # 5334 1051,2907,2688,3663,2474,2994,1182,2011,2563,1251,2626,7612, 992,2340,3444,1540, # 5350 2721,1201,2070,2401,1996,2475,7613,4424, 528,1922,2188,1503,1873,1570,2364,3342, # 5366 3276,7614, 557,1073,7615,1827,3445,2087,2266,3140,3039,3084, 767,3085,2786,4425, # 5382 1006,4158,4426,2341,1267,2176,3664,3199, 778,3945,3200,2722,1597,2657,7616,4427, # 5398 7617,3446,7618,7619,7620,3277,2689,1433,3278, 131, 95,1504,3946, 723,4159,3141, # 5414 1841,3555,2758,2189,3947,2027,2104,3665,7621,2995,3948,1218,7622,3343,3201,3949, # 5430 4160,2576, 248,1634,3785, 912,7623,2832,3666,3040,3786, 654, 53,7624,2996,7625, # 5446 1688,4428, 777,3447,1032,3950,1425,7626, 191, 820,2120,2833, 971,4429, 931,3202, # 5462 135, 664, 783,3787,1997, 772,2908,1935,3951,3788,4430,2909,3203, 282,2723, 640, # 5478 1372,3448,1127, 922, 325,3344,7627,7628, 711,2044,7629,7630,3952,2219,2787,1936, # 5494 3953,3345,2220,2251,3789,2300,7631,4431,3790,1258,3279,3954,3204,2138,2950,3955, # 5510 3956,7632,2221, 258,3205,4432, 101,1227,7633,3280,1755,7634,1391,3281,7635,2910, # 5526 2056, 893,7636,7637,7638,1402,4161,2342,7639,7640,3206,3556,7641,7642, 878,1325, # 5542 1780,2788,4433, 259,1385,2577, 744,1183,2267,4434,7643,3957,2502,7644, 684,1024, # 5558 4162,7645, 472,3557,3449,1165,3282,3958,3959, 322,2152, 881, 455,1695,1152,1340, # 5574 660, 554,2153,4435,1058,4436,4163, 830,1065,3346,3960,4437,1923,7646,1703,1918, # 5590 7647, 932,2268, 122,7648,4438, 947, 677,7649,3791,2627, 297,1905,1924,2269,4439, # 5606 2317,3283,7650,7651,4164,7652,4165, 84,4166, 112, 989,7653, 547,1059,3961, 701, # 5622 3558,1019,7654,4167,7655,3450, 942, 639, 457,2301,2451, 993,2951, 407, 851, 494, # 5638 4440,3347, 927,7656,1237,7657,2421,3348, 573,4168, 680, 921,2911,1279,1874, 285, # 5654 790,1448,1983, 719,2167,7658,7659,4441,3962,3963,1649,7660,1541, 563,7661,1077, # 5670 7662,3349,3041,3451, 511,2997,3964,3965,3667,3966,1268,2564,3350,3207,4442,4443, # 5686 7663, 535,1048,1276,1189,2912,2028,3142,1438,1373,2834,2952,1134,2012,7664,4169, # 5702 1238,2578,3086,1259,7665, 700,7666,2953,3143,3668,4170,7667,4171,1146,1875,1906, # 5718 4444,2601,3967, 781,2422, 132,1589, 203, 147, 273,2789,2402, 898,1786,2154,3968, # 5734 3969,7668,3792,2790,7669,7670,4445,4446,7671,3208,7672,1635,3793, 965,7673,1804, # 5750 2690,1516,3559,1121,1082,1329,3284,3970,1449,3794, 65,1128,2835,2913,2759,1590, # 5766 3795,7674,7675, 12,2658, 45, 976,2579,3144,4447, 517,2528,1013,1037,3209,7676, # 5782 3796,2836,7677,3797,7678,3452,7679,2602, 614,1998,2318,3798,3087,2724,2628,7680, # 5798 2580,4172, 599,1269,7681,1810,3669,7682,2691,3088, 759,1060, 489,1805,3351,3285, # 5814 1358,7683,7684,2386,1387,1215,2629,2252, 490,7685,7686,4173,1759,2387,2343,7687, # 5830 4448,3799,1907,3971,2630,1806,3210,4449,3453,3286,2760,2344, 874,7688,7689,3454, # 5846 3670,1858, 91,2914,3671,3042,3800,4450,7690,3145,3972,2659,7691,3455,1202,1403, # 5862 3801,2954,2529,1517,2503,4451,3456,2504,7692,4452,7693,2692,1885,1495,1731,3973, # 5878 2365,4453,7694,2029,7695,7696,3974,2693,1216, 237,2581,4174,2319,3975,3802,4454, # 5894 4455,2694,3560,3457, 445,4456,7697,7698,7699,7700,2761, 61,3976,3672,1822,3977, # 5910 7701, 687,2045, 935, 925, 405,2660, 703,1096,1859,2725,4457,3978,1876,1367,2695, # 5926 3352, 918,2105,1781,2476, 334,3287,1611,1093,4458, 564,3146,3458,3673,3353, 945, # 5942 2631,2057,4459,7702,1925, 872,4175,7703,3459,2696,3089, 349,4176,3674,3979,4460, # 5958 3803,4177,3675,2155,3980,4461,4462,4178,4463,2403,2046, 782,3981, 400, 251,4179, # 5974 1624,7704,7705, 277,3676, 299,1265, 476,1191,3804,2121,4180,4181,1109, 205,7706, # 5990 2582,1000,2156,3561,1860,7707,7708,7709,4464,7710,4465,2565, 107,2477,2157,3982, # 6006 3460,3147,7711,1533, 541,1301, 158, 753,4182,2872,3562,7712,1696, 370,1088,4183, # 6022 4466,3563, 579, 327, 440, 162,2240, 269,1937,1374,3461, 968,3043, 56,1396,3090, # 6038 2106,3288,3354,7713,1926,2158,4467,2998,7714,3564,7715,7716,3677,4468,2478,7717, # 6054 2791,7718,1650,4469,7719,2603,7720,7721,3983,2661,3355,1149,3356,3984,3805,3985, # 6070 7722,1076, 49,7723, 951,3211,3289,3290, 450,2837, 920,7724,1811,2792,2366,4184, # 6086 1908,1138,2367,3806,3462,7725,3212,4470,1909,1147,1518,2423,4471,3807,7726,4472, # 6102 2388,2604, 260,1795,3213,7727,7728,3808,3291, 708,7729,3565,1704,7730,3566,1351, # 6118 1618,3357,2999,1886, 944,4185,3358,4186,3044,3359,4187,7731,3678, 422, 413,1714, # 6134 3292, 500,2058,2345,4188,2479,7732,1344,1910, 954,7733,1668,7734,7735,3986,2404, # 6150 4189,3567,3809,4190,7736,2302,1318,2505,3091, 133,3092,2873,4473, 629, 31,2838, # 6166 2697,3810,4474, 850, 949,4475,3987,2955,1732,2088,4191,1496,1852,7737,3988, 620, # 6182 3214, 981,1242,3679,3360,1619,3680,1643,3293,2139,2452,1970,1719,3463,2168,7738, # 6198 3215,7739,7740,3361,1828,7741,1277,4476,1565,2047,7742,1636,3568,3093,7743, 869, # 6214 2839, 655,3811,3812,3094,3989,3000,3813,1310,3569,4477,7744,7745,7746,1733, 558, # 6230 4478,3681, 335,1549,3045,1756,4192,3682,1945,3464,1829,1291,1192, 470,2726,2107, # 6246 2793, 913,1054,3990,7747,1027,7748,3046,3991,4479, 982,2662,3362,3148,3465,3216, # 6262 3217,1946,2794,7749, 571,4480,7750,1830,7751,3570,2583,1523,2424,7752,2089, 984, # 6278 4481,3683,1959,7753,3684, 852, 923,2795,3466,3685, 969,1519, 999,2048,2320,1705, # 6294 7754,3095, 615,1662, 151, 597,3992,2405,2321,1049, 275,4482,3686,4193, 568,3687, # 6310 3571,2480,4194,3688,7755,2425,2270, 409,3218,7756,1566,2874,3467,1002, 769,2840, # 6326 194,2090,3149,3689,2222,3294,4195, 628,1505,7757,7758,1763,2177,3001,3993, 521, # 6342 1161,2584,1787,2203,2406,4483,3994,1625,4196,4197, 412, 42,3096, 464,7759,2632, # 6358 4484,3363,1760,1571,2875,3468,2530,1219,2204,3814,2633,2140,2368,4485,4486,3295, # 6374 1651,3364,3572,7760,7761,3573,2481,3469,7762,3690,7763,7764,2271,2091, 460,7765, # 6390 4487,7766,3002, 962, 588,3574, 289,3219,2634,1116, 52,7767,3047,1796,7768,7769, # 6406 7770,1467,7771,1598,1143,3691,4198,1984,1734,1067,4488,1280,3365, 465,4489,1572, # 6422 510,7772,1927,2241,1812,1644,3575,7773,4490,3692,7774,7775,2663,1573,1534,7776, # 6438 7777,4199, 536,1807,1761,3470,3815,3150,2635,7778,7779,7780,4491,3471,2915,1911, # 6454 2796,7781,3296,1122, 377,3220,7782, 360,7783,7784,4200,1529, 551,7785,2059,3693, # 6470 1769,2426,7786,2916,4201,3297,3097,2322,2108,2030,4492,1404, 136,1468,1479, 672, # 6486 1171,3221,2303, 271,3151,7787,2762,7788,2049, 678,2727, 865,1947,4493,7789,2013, # 6502 3995,2956,7790,2728,2223,1397,3048,3694,4494,4495,1735,2917,3366,3576,7791,3816, # 6518 509,2841,2453,2876,3817,7792,7793,3152,3153,4496,4202,2531,4497,2304,1166,1010, # 6534 552, 681,1887,7794,7795,2957,2958,3996,1287,1596,1861,3154, 358, 453, 736, 175, # 6550 478,1117, 905,1167,1097,7796,1853,1530,7797,1706,7798,2178,3472,2287,3695,3473, # 6566 3577,4203,2092,4204,7799,3367,1193,2482,4205,1458,2190,2205,1862,1888,1421,3298, # 6582 2918,3049,2179,3474, 595,2122,7800,3997,7801,7802,4206,1707,2636, 223,3696,1359, # 6598 751,3098, 183,3475,7803,2797,3003, 419,2369, 633, 704,3818,2389, 241,7804,7805, # 6614 7806, 838,3004,3697,2272,2763,2454,3819,1938,2050,3998,1309,3099,2242,1181,7807, # 6630 1136,2206,3820,2370,1446,4207,2305,4498,7808,7809,4208,1055,2605, 484,3698,7810, # 6646 3999, 625,4209,2273,3368,1499,4210,4000,7811,4001,4211,3222,2274,2275,3476,7812, # 6662 7813,2764, 808,2606,3699,3369,4002,4212,3100,2532, 526,3370,3821,4213, 955,7814, # 6678 1620,4214,2637,2427,7815,1429,3700,1669,1831, 994, 928,7816,3578,1260,7817,7818, # 6694 7819,1948,2288, 741,2919,1626,4215,2729,2455, 867,1184, 362,3371,1392,7820,7821, # 6710 4003,4216,1770,1736,3223,2920,4499,4500,1928,2698,1459,1158,7822,3050,3372,2877, # 6726 1292,1929,2506,2842,3701,1985,1187,2071,2014,2607,4217,7823,2566,2507,2169,3702, # 6742 2483,3299,7824,3703,4501,7825,7826, 666,1003,3005,1022,3579,4218,7827,4502,1813, # 6758 2253, 574,3822,1603, 295,1535, 705,3823,4219, 283, 858, 417,7828,7829,3224,4503, # 6774 4504,3051,1220,1889,1046,2276,2456,4004,1393,1599, 689,2567, 388,4220,7830,2484, # 6790 802,7831,2798,3824,2060,1405,2254,7832,4505,3825,2109,1052,1345,3225,1585,7833, # 6806 809,7834,7835,7836, 575,2730,3477, 956,1552,1469,1144,2323,7837,2324,1560,2457, # 6822 3580,3226,4005, 616,2207,3155,2180,2289,7838,1832,7839,3478,4506,7840,1319,3704, # 6838 3705,1211,3581,1023,3227,1293,2799,7841,7842,7843,3826, 607,2306,3827, 762,2878, # 6854 1439,4221,1360,7844,1485,3052,7845,4507,1038,4222,1450,2061,2638,4223,1379,4508, # 6870 2585,7846,7847,4224,1352,1414,2325,2921,1172,7848,7849,3828,3829,7850,1797,1451, # 6886 7851,7852,7853,7854,2922,4006,4007,2485,2346, 411,4008,4009,3582,3300,3101,4509, # 6902 1561,2664,1452,4010,1375,7855,7856, 47,2959, 316,7857,1406,1591,2923,3156,7858, # 6918 1025,2141,3102,3157, 354,2731, 884,2224,4225,2407, 508,3706, 726,3583, 996,2428, # 6934 3584, 729,7859, 392,2191,1453,4011,4510,3707,7860,7861,2458,3585,2608,1675,2800, # 6950 919,2347,2960,2348,1270,4511,4012, 73,7862,7863, 647,7864,3228,2843,2255,1550, # 6966 1346,3006,7865,1332, 883,3479,7866,7867,7868,7869,3301,2765,7870,1212, 831,1347, # 6982 4226,4512,2326,3830,1863,3053, 720,3831,4513,4514,3832,7871,4227,7872,7873,4515, # 6998 7874,7875,1798,4516,3708,2609,4517,3586,1645,2371,7876,7877,2924, 669,2208,2665, # 7014 2429,7878,2879,7879,7880,1028,3229,7881,4228,2408,7882,2256,1353,7883,7884,4518, # 7030 3158, 518,7885,4013,7886,4229,1960,7887,2142,4230,7888,7889,3007,2349,2350,3833, # 7046 516,1833,1454,4014,2699,4231,4519,2225,2610,1971,1129,3587,7890,2766,7891,2961, # 7062 1422, 577,1470,3008,1524,3373,7892,7893, 432,4232,3054,3480,7894,2586,1455,2508, # 7078 2226,1972,1175,7895,1020,2732,4015,3481,4520,7896,2733,7897,1743,1361,3055,3482, # 7094 2639,4016,4233,4521,2290, 895, 924,4234,2170, 331,2243,3056, 166,1627,3057,1098, # 7110 7898,1232,2880,2227,3374,4522, 657, 403,1196,2372, 542,3709,3375,1600,4235,3483, # 7126 7899,4523,2767,3230, 576, 530,1362,7900,4524,2533,2666,3710,4017,7901, 842,3834, # 7142 7902,2801,2031,1014,4018, 213,2700,3376, 665, 621,4236,7903,3711,2925,2430,7904, # 7158 2431,3302,3588,3377,7905,4237,2534,4238,4525,3589,1682,4239,3484,1380,7906, 724, # 7174 2277, 600,1670,7907,1337,1233,4526,3103,2244,7908,1621,4527,7909, 651,4240,7910, # 7190 1612,4241,2611,7911,2844,7912,2734,2307,3058,7913, 716,2459,3059, 174,1255,2701, # 7206 4019,3590, 548,1320,1398, 728,4020,1574,7914,1890,1197,3060,4021,7915,3061,3062, # 7222 3712,3591,3713, 747,7916, 635,4242,4528,7917,7918,7919,4243,7920,7921,4529,7922, # 7238 3378,4530,2432, 451,7923,3714,2535,2072,4244,2735,4245,4022,7924,1764,4531,7925, # 7254 4246, 350,7926,2278,2390,2486,7927,4247,4023,2245,1434,4024, 488,4532, 458,4248, # 7270 4025,3715, 771,1330,2391,3835,2568,3159,2159,2409,1553,2667,3160,4249,7928,2487, # 7286 2881,2612,1720,2702,4250,3379,4533,7929,2536,4251,7930,3231,4252,2768,7931,2015, # 7302 2736,7932,1155,1017,3716,3836,7933,3303,2308, 201,1864,4253,1430,7934,4026,7935, # 7318 7936,7937,7938,7939,4254,1604,7940, 414,1865, 371,2587,4534,4535,3485,2016,3104, # 7334 4536,1708, 960,4255, 887, 389,2171,1536,1663,1721,7941,2228,4027,2351,2926,1580, # 7350 7942,7943,7944,1744,7945,2537,4537,4538,7946,4539,7947,2073,7948,7949,3592,3380, # 7366 2882,4256,7950,4257,2640,3381,2802, 673,2703,2460, 709,3486,4028,3593,4258,7951, # 7382 1148, 502, 634,7952,7953,1204,4540,3594,1575,4541,2613,3717,7954,3718,3105, 948, # 7398 3232, 121,1745,3837,1110,7955,4259,3063,2509,3009,4029,3719,1151,1771,3838,1488, # 7414 4030,1986,7956,2433,3487,7957,7958,2093,7959,4260,3839,1213,1407,2803, 531,2737, # 7430 2538,3233,1011,1537,7960,2769,4261,3106,1061,7961,3720,3721,1866,2883,7962,2017, # 7446 120,4262,4263,2062,3595,3234,2309,3840,2668,3382,1954,4542,7963,7964,3488,1047, # 7462 2704,1266,7965,1368,4543,2845, 649,3383,3841,2539,2738,1102,2846,2669,7966,7967, # 7478 1999,7968,1111,3596,2962,7969,2488,3842,3597,2804,1854,3384,3722,7970,7971,3385, # 7494 2410,2884,3304,3235,3598,7972,2569,7973,3599,2805,4031,1460, 856,7974,3600,7975, # 7510 2885,2963,7976,2886,3843,7977,4264, 632,2510, 875,3844,1697,3845,2291,7978,7979, # 7526 4544,3010,1239, 580,4545,4265,7980, 914, 936,2074,1190,4032,1039,2123,7981,7982, # 7542 7983,3386,1473,7984,1354,4266,3846,7985,2172,3064,4033, 915,3305,4267,4268,3306, # 7558 1605,1834,7986,2739, 398,3601,4269,3847,4034, 328,1912,2847,4035,3848,1331,4270, # 7574 3011, 937,4271,7987,3602,4036,4037,3387,2160,4546,3388, 524, 742, 538,3065,1012, # 7590 7988,7989,3849,2461,7990, 658,1103, 225,3850,7991,7992,4547,7993,4548,7994,3236, # 7606 1243,7995,4038, 963,2246,4549,7996,2705,3603,3161,7997,7998,2588,2327,7999,4550, # 7622 8000,8001,8002,3489,3307, 957,3389,2540,2032,1930,2927,2462, 870,2018,3604,1746, # 7638 2770,2771,2434,2463,8003,3851,8004,3723,3107,3724,3490,3390,3725,8005,1179,3066, # 7654 8006,3162,2373,4272,3726,2541,3163,3108,2740,4039,8007,3391,1556,2542,2292, 977, # 7670 2887,2033,4040,1205,3392,8008,1765,3393,3164,2124,1271,1689, 714,4551,3491,8009, # 7686 2328,3852, 533,4273,3605,2181, 617,8010,2464,3308,3492,2310,8011,8012,3165,8013, # 7702 8014,3853,1987, 618, 427,2641,3493,3394,8015,8016,1244,1690,8017,2806,4274,4552, # 7718 8018,3494,8019,8020,2279,1576, 473,3606,4275,3395, 972,8021,3607,8022,3067,8023, # 7734 8024,4553,4554,8025,3727,4041,4042,8026, 153,4555, 356,8027,1891,2888,4276,2143, # 7750 408, 803,2352,8028,3854,8029,4277,1646,2570,2511,4556,4557,3855,8030,3856,4278, # 7766 8031,2411,3396, 752,8032,8033,1961,2964,8034, 746,3012,2465,8035,4279,3728, 698, # 7782 4558,1892,4280,3608,2543,4559,3609,3857,8036,3166,3397,8037,1823,1302,4043,2706, # 7798 3858,1973,4281,8038,4282,3167, 823,1303,1288,1236,2848,3495,4044,3398, 774,3859, # 7814 8039,1581,4560,1304,2849,3860,4561,8040,2435,2161,1083,3237,4283,4045,4284, 344, # 7830 1173, 288,2311, 454,1683,8041,8042,1461,4562,4046,2589,8043,8044,4563, 985, 894, # 7846 8045,3399,3168,8046,1913,2928,3729,1988,8047,2110,1974,8048,4047,8049,2571,1194, # 7862 425,8050,4564,3169,1245,3730,4285,8051,8052,2850,8053, 636,4565,1855,3861, 760, # 7878 1799,8054,4286,2209,1508,4566,4048,1893,1684,2293,8055,8056,8057,4287,4288,2210, # 7894 479,8058,8059, 832,8060,4049,2489,8061,2965,2490,3731, 990,3109, 627,1814,2642, # 7910 4289,1582,4290,2125,2111,3496,4567,8062, 799,4291,3170,8063,4568,2112,1737,3013, # 7926 1018, 543, 754,4292,3309,1676,4569,4570,4050,8064,1489,8065,3497,8066,2614,2889, # 7942 4051,8067,8068,2966,8069,8070,8071,8072,3171,4571,4572,2182,1722,8073,3238,3239, # 7958 1842,3610,1715, 481, 365,1975,1856,8074,8075,1962,2491,4573,8076,2126,3611,3240, # 7974 433,1894,2063,2075,8077, 602,2741,8078,8079,8080,8081,8082,3014,1628,3400,8083, # 7990 3172,4574,4052,2890,4575,2512,8084,2544,2772,8085,8086,8087,3310,4576,2891,8088, # 8006 4577,8089,2851,4578,4579,1221,2967,4053,2513,8090,8091,8092,1867,1989,8093,8094, # 8022 8095,1895,8096,8097,4580,1896,4054, 318,8098,2094,4055,4293,8099,8100, 485,8101, # 8038 938,3862, 553,2670, 116,8102,3863,3612,8103,3498,2671,2773,3401,3311,2807,8104, # 8054 3613,2929,4056,1747,2930,2968,8105,8106, 207,8107,8108,2672,4581,2514,8109,3015, # 8070 890,3614,3864,8110,1877,3732,3402,8111,2183,2353,3403,1652,8112,8113,8114, 941, # 8086 2294, 208,3499,4057,2019, 330,4294,3865,2892,2492,3733,4295,8115,8116,8117,8118, # 8102 #Everything below is of no interest for detection purpose 2515,1613,4582,8119,3312,3866,2516,8120,4058,8121,1637,4059,2466,4583,3867,8122, # 8118 2493,3016,3734,8123,8124,2192,8125,8126,2162,8127,8128,8129,8130,8131,8132,8133, # 8134 8134,8135,8136,8137,8138,8139,8140,8141,8142,8143,8144,8145,8146,8147,8148,8149, # 8150 8150,8151,8152,8153,8154,8155,8156,8157,8158,8159,8160,8161,8162,8163,8164,8165, # 8166 8166,8167,8168,8169,8170,8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181, # 8182 8182,8183,8184,8185,8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197, # 8198 8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213, # 8214 8214,8215,8216,8217,8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229, # 8230 8230,8231,8232,8233,8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245, # 8246 8246,8247,8248,8249,8250,8251,8252,8253,8254,8255,8256,8257,8258,8259,8260,8261, # 8262 8262,8263,8264,8265,8266,8267,8268,8269,8270,8271,8272,8273,8274,8275,8276,8277, # 8278 8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,8290,8291,8292,8293, # 8294 8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,8308,8309, # 8310 8310,8311,8312,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322,8323,8324,8325, # 8326 8326,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337,8338,8339,8340,8341, # 8342 8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353,8354,8355,8356,8357, # 8358 8358,8359,8360,8361,8362,8363,8364,8365,8366,8367,8368,8369,8370,8371,8372,8373, # 8374 8374,8375,8376,8377,8378,8379,8380,8381,8382,8383,8384,8385,8386,8387,8388,8389, # 8390 8390,8391,8392,8393,8394,8395,8396,8397,8398,8399,8400,8401,8402,8403,8404,8405, # 8406 8406,8407,8408,8409,8410,8411,8412,8413,8414,8415,8416,8417,8418,8419,8420,8421, # 8422 8422,8423,8424,8425,8426,8427,8428,8429,8430,8431,8432,8433,8434,8435,8436,8437, # 8438 8438,8439,8440,8441,8442,8443,8444,8445,8446,8447,8448,8449,8450,8451,8452,8453, # 8454 8454,8455,8456,8457,8458,8459,8460,8461,8462,8463,8464,8465,8466,8467,8468,8469, # 8470 8470,8471,8472,8473,8474,8475,8476,8477,8478,8479,8480,8481,8482,8483,8484,8485, # 8486 8486,8487,8488,8489,8490,8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501, # 8502 8502,8503,8504,8505,8506,8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517, # 8518 8518,8519,8520,8521,8522,8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533, # 8534 8534,8535,8536,8537,8538,8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549, # 8550 8550,8551,8552,8553,8554,8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,8565, # 8566 8566,8567,8568,8569,8570,8571,8572,8573,8574,8575,8576,8577,8578,8579,8580,8581, # 8582 8582,8583,8584,8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597, # 8598 8598,8599,8600,8601,8602,8603,8604,8605,8606,8607,8608,8609,8610,8611,8612,8613, # 8614 8614,8615,8616,8617,8618,8619,8620,8621,8622,8623,8624,8625,8626,8627,8628,8629, # 8630 8630,8631,8632,8633,8634,8635,8636,8637,8638,8639,8640,8641,8642,8643,8644,8645, # 8646 8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,8657,8658,8659,8660,8661, # 8662 8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672,8673,8674,8675,8676,8677, # 8678 8678,8679,8680,8681,8682,8683,8684,8685,8686,8687,8688,8689,8690,8691,8692,8693, # 8694 8694,8695,8696,8697,8698,8699,8700,8701,8702,8703,8704,8705,8706,8707,8708,8709, # 8710 8710,8711,8712,8713,8714,8715,8716,8717,8718,8719,8720,8721,8722,8723,8724,8725, # 8726 8726,8727,8728,8729,8730,8731,8732,8733,8734,8735,8736,8737,8738,8739,8740,8741) # 8742 # flake8: noqa PK[GcLL%site-packages/chardet/cp949prober.pyonu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tEUCKRDistributionAnalysis(t CP949SMModelt CP949ProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pyR#s  cCsdS(NtCP949((R ((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pytget_charset_name+s(t__name__t __module__RR (((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pyR"s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pytsPK[i l l )site-packages/chardet/mbcharsetprober.pyonu[ ۝Rc@sFddlZddlmZddlmZdefdYZdS(iNi(t constants(t CharSetProbertMultiByteCharSetProbercBs5eZdZdZdZdZdZRS(cCs2tj|d|_d|_ddg|_dS(Ni(Rt__init__tNonet_mDistributionAnalyzert _mCodingSMt _mLastChar(tself((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR$s   cCsRtj||jr&|jjn|jr?|jjnddg|_dS(Ni(RtresetRRR(R((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR *s    cCsdS(N((R((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pytget_charset_name2scCst|}xtd|D]}|jj||}|tjkrtjr{tjj |j dt |dntj |_ Pq|tjkrtj|_ Pq|tjkr|jj}|dkr|d|jd<|jj|j|q#|jj||d|d!|qqW||d|jd<|jtjkr|jjr|jtjkrtj|_ qn|jS(Nis prober hit error at byte s i(tlentrangeRt next_stateRteErrort_debugtsyststderrtwriteR tstrteNotMet_mStateteItsMeteFoundItteStarttget_current_charlenRRtfeedt get_statet eDetectingtgot_enough_datatget_confidencetSHORTCUT_THRESHOLD(RtaBuftaLentit codingStatetcharLen((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR5s2   "   cCs |jjS(N(RR(R((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyRUs(t__name__t __module__RR R RR(((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR#s     (RtRt charsetproberRR(((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyts PK[:L L &site-packages/chardet/hebrewprober.pycnu[ ۝Rc@sddlmZddlmZmZddlmZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdefdYZdS(i(t CharSetProber(teNotMet eDetecting(twrap_ordiiiiiiiiiiig{Gz?s ISO-8859-8s windows-1255t HebrewProbercBsPeZdZdZdZdZdZdZdZdZ RS(cCs-tj|d|_d|_|jdS(N(Rt__init__tNonet_mLogicalProbert_mVisualProbertreset(tself((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyRs   cCs(d|_d|_d|_d|_dS(Nit (t_mFinalCharLogicalScoret_mFinalCharVisualScoret_mPrevt _mBeforePrev(R ((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyR s   cCs||_||_dS(N(RR(R t logicalProbert visualProber((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytset_model_proberss cCst|tttttgkS(N(Rt FINAL_KAFt FINAL_MEMt FINAL_NUNtFINAL_PEt FINAL_TSADI(R tc((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytis_finalscCst|ttttgkS(N(Rt NORMAL_KAFt NORMAL_MEMt NORMAL_NUNt NORMAL_PE(R R((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyt is_non_finals cCs|jtkrtS|j|}x|D]}|dkr|jdkr|j|jrq|jd7_q|j|jr|jd7_qqn?|jdkr|j|jr|dkr|jd7_n|j|_||_q,Wt S(NR i( t get_stateRtfilter_high_bit_onlyRRRR RR R(R taBuftcur((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytfeeds     cCs|j|j}|tkr tS|t kr1tS|jj|jj}|tkr]tS|t krntS|dkr~tStS(Ng( R R tMIN_FINAL_CHAR_DISTANCEtLOGICAL_HEBREW_NAMEtVISUAL_HEBREW_NAMERtget_confidenceRtMIN_MODEL_DISTANCE(R tfinalsubtmodelsub((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytget_charset_names      cCs2|jjtkr.|jjtkr.tStS(N(RRRRR(R ((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyRs( t__name__t __module__RR RRRR#R+R(((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyRs    ; N(t charsetproberRt constantsRRtcompatRRRRRRRRRRt NORMAL_TSADIR$R(R&R%R(((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyts"dPK['5a5a,site-packages/chardet/langbulgarianmodel.pycnu[ ۝Rc@shdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6ZdS(iiiiiMiZicidiHimikieiOiiQifiLi^iRiniili[iJiwiTi`ioiisiAiEiFiBi?iDipigi\iihi_iViWiGitiiUi]iaiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii-iiii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=iiCii<i8iii ii iiiiii i iiii iiiiiiiiiiiiKi4ii*ii>iiii:iibiiiiiiixiNi@iSiyiuiXiziYijiIiPiviritcharToOrderMaptprecedenceMatrixg! _B?tmTypicalPositiveRatiotkeepEnglishLetters ISO-8859-5t charsetNames windows-1251N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMiZicidiHimikieiOiiQifiLi^iRiniili[iJiwiTi`ioiisiiiiiiiAiEiFiBi?iDipigi\iihi_iViWiGitiiUi]iaiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiQiiiiiiiiiiiiii-iiii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=iiCii<i8iii ii iiiiii i iiii iiiiiiiiiiiiKi4ii*ii>iiii:iibiiiiiii[ii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMiZicidiHimikieiOiiQifiLi^iRiniili[iJiwiTi`ioiisiiiiiiiAiEiFiBi?iDipigi\iihi_iViWiGitiiUi]iaiqiiiiiiiiiiiiiiiiiiixiiiiiiiiiNi@iSiyibiuiiiiiiiiiiiXiiiiiziYijiiiiii-iiiIiPiviriiiiii>i:iiiiiii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=iiCii<i8iii ii iiiiii i iiii iiiiiiiiiiiiKi4ii*i(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tLatin5_BulgarianCharToOrderMaptwin1251BulgarianCharToOrderMaptBulgarianLangModeltFalsetLatin5BulgarianModeltWin1251BulgarianModel(((s>/usr/lib/python2.7/site-packages/chardet/langbulgarianmodel.pyt&sV  PK[j.`.` site-packages/chardet/jpcntx.pyonu[ jRc@s+RddlmZdZdZdZdZdZdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddd dddd dddddd d dd dd d ddd d d ddddd d dd dd dd dd d d dd d dddd ddd d dd d dddddd dd d dddddd d d d d dddddd dfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd dd ddddd ddd d d d dd d dd ddd dd d dd d ddd d d d d d d d d d d dd d d dd ddd ddddddddd d dd d dddddd ddd dd ddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd dddd dd ddd dd d d d dd d ddd d ddd dd ddddd d ddd dd d dd d ddd dd dd d dd d ddddd d dd d d d d dddd dddd dd d ddddd dfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd dd dddd ddd dddddd dd d d d d dd dd d d d d ddd dd dd d d ddd ddd dddddddddddddd dddddd dddddd d dd dddddd fSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd dd dddddddddddddddd d d dd d d d dddd d d dddddddd d ddddd ddd d dd dddddd d ddddd ddddd dddd d dddd ddddfSdddddddddd d ddd dd d dd d dd d ddddd dddd d dd dd ddd dd d ddd dddd ddd d ddd dd dddd d dd dd ddddd d dd dddddd dfSdd dd dddd dddd dd d d dddddd dd dd d ddddd ddd dddd ddd d ddd dd dddd d d dd dddd d dd d d ddddd ddd dddd dddddd fSdd dddd dddd ddd dddd d dd dd dd ddd dd dd dddddd d ddd d d dd ddd ddd ddddd ddd ddd d d d dd d d d ddddd dddd d ddd fSdddd ddddddd dddddddddd d d ddd ddddddddd d ddd d ddd d dd d ddddddddddddddddddd ddddd d d ddd ddd ddd d fSdddddd dd ddddd d d d d d dd dddd dd d ddd dd dddd d d dd d d ddd d d d dd d ddd dd ddd d ddd d d ddddd ddd ddd d ddddd dfSdddd dd ddddddddddddd dd dd ddd ddd dd d d dd d d ddd dd dddd dddd ddddddd ddddd d ddd dddddd dd dd d dd dddd fSdd dd dddddd d dd dd dddd ddd dd d d ddd dd dd ddd dd d ddddd d dddddddd ddddddddddd d d dd ddddddd d d ddddddfSdddddd dd ddd d d dd dddd dd dd dd ddddddddddd ddd ddddd dd dd dddddddddddddddddddd dddd dddd dddddd d fSdddddd dddddddd d dd d d d d d dd ddd ddd d d dddd ddd d d dd dd d dddd d ddd dddddd ddd d d d dd dddd dddd d dd dddd fSdddd dd ddddd dd dddddd dd dd dd ddd d dd dd ddd dddddddddd d ddddddddddddddd ddd d ddddddd d ddddd dddd fSdddd dddddddddd dd d d dddd dd ddd dd d d d dddd ddd ddddd d ddd ddd dddddddd d ddd d d ddddddd d d dd ddd dddd fSdd ddddddddd dddd dd dddddd dddddddddddd ddddddd ddddd ddddddd ddddddddddd ddd dddddddd dddddddfSdddd dd dd ddd ddd d d d ddd ddd d d d ddddd dd dddd d ddd d dd d ddddd d ddd dd ddd d dd ddddddd d d ddd d d ddd ddddfSdddd ddddddd d d dddd dd dd ddddddddddd dddd ddddddd ddd d ddddddd ddddddddd ddd d dd d d dd d dd d ddddd d fSdddddd ddddd d d ddddddd d ddd dd dd d ddd dd dd dd dddddddd d d ddddddddd dd d ddd d d ddd dddddd d d ddd ddd d fSdd dddd dddd dd d dd d d dd dd ddd d dddd dd d ddddddd dd d d dd d dd ddddddddd ddddd d dd d dd ddddd d ddddddddd fSdddddddd ddd d d dd dddd dd d dd dddddddd dddd dd d d ddddd d d dddd ddddddddddddd d d dd ddddddd d ddd d dd d fSdddd dddd ddd dddddddd ddd d ddd ddd ddd ddd ddd d dddddddddddddddddddddddddddddddddd ddddddddddfSdd dd dd dddddd dd d dddd dddd dddddd d ddd ddd ddd d dd d ddd d ddd d dddddddd ddddd d d dddddd dddd ddd ddd d fSdd dd dd dddd d d d dd dddddddddddddddddddd dddd d ddd ddd d dddddddddddddddd ddd dd dddd ddddd ddddd d fSdddd dd dd ddd d dd d d dd d d d dd d dddd dd dd d d ddd ddd dddd dd d ddd ddd ddd d ddd ddd d d d dd dd dd d d d ddddddddfSdddddd dd dd d dddd dd dd dd dddd dd d dd d d d dd ddd d d d dddddd ddd dddd ddd dd dddd dd ddd ddddddd dd ddddd dfSdd dd dd dddd ddd d d ddddd d dd d d dddd ddd dd ddddddd ddd dddd dd d dd d ddddddddd dd d d dd d d ddd d dddd ddddfSddddddddddddd dddddddddddddddddd ddddddd ddddddddddddddddddddddddddddd ddddddddddddddddfSddddddddddddddddd dddd dddd dd dddd ddddd dd dd dddddddddddd ddd ddd dddddddddddddddddddddddddfSdddd dd dddd d ddd dd d d dd d ddd d d d d d dddd dd ddd ddd dddd d dd d d dddd d dd dd d d d d d dd dd dd dd dd ddd dd dddd fSddddddddddddddddddd dddddddddddd ddddd ddddddddddddddddddddd ddddd ddddddddddd dd d dddddddfSdd dd dd dd dd ddd dd d d ddd dd d d dd d ddd dd d dd d dddd dddd dd d d dd ddd d dd ddd d ddd d d d dddd dddd d d d dd dddd fSdd dd dd dddddd d ddd d d dddd d d d d d ddddd d dd d dddddd dd d d d d dd ddd dddddd ddddd dd dddd ddd dd dddd d dd d fSdddd dd ddddd d d d dd d dd ddd d d d d dddd ddd dddd dd ddd d dd d d ddd d dd d dd dddd dddd dd ddddddd ddd d ddddd d fSdddddd dddd d ddd ddd dd dd dd dd dddd dd d dddd ddddd dddd d dddd dddd dd ddd ddd ddd d dd dddd dd d ddddddddfSdddd dddd ddd d dd d d d d d d d dd d dd d dd dd d ddd dd dd dd d dddd dd dd d dd dddd ddddd dd d d dd ddddd d d dd ddddd d fSdd dddddddd dd dd dd d d dd ddd d d d dddd ddddd d dddddd d dd dd d d d d d d d ddddd d ddd d d d d ddd d d d ddddddd dd d fSdddd dd ddddd d d dd d d dd dddd dd ddddddd ddd ddddddd d ddd d d ddddddddd dd ddd dddd dddddd d dd d dddddd d fSdddd dddddddd ddd dddddd ddd dd dddddd dd d d dddd d d d ddd dddddddddddddddd dd ddddddddd d d dddddddd fSdd dddd ddddd d d d dd d dd ddddddd dddd d d dd d dd d d d dd d dd dd d ddd dd d dd d ddd ddd d d d dddd dd d d ddd ddddd d fSdd dd dddddddd dd d d d d d ddddddd d d d ddddd ddd d ddd d d d dd dd d dd d d d dddddd d d ddd ddddd dddddddddddddfSdddddd dddd d dd dd dddddd d dddd d dddd d d dd d ddd d d d d d d d d ddddddddddddddd dddd dd dddddd d dddd ddddfSddddddddddddddddddddddddddddddd dd dd ddddddd ddddddddddddddddddddddddddddddd ddddddddddfSdddd dddddd d d d dd dd d d d d d dddddddddd dd d d ddd d dd d d d d d d ddd ddddddddddddddd dd d dd d ddd dddddddd fSdd dd dddd ddd d d dd dddd d dd d dd dd dd ddd ddd d ddd d dd dd dd d ddddddddddddddddddd dd dddd d d d d dddddd d fSddddddddddd dddd dddddddd dddddddd dd dd dddddddddddddddddddddddddddddddddd ddddd ddddddddd fSdddd dd dd ddd d d dd dd dd dd d d dd ddd dddd d dd d dddddd d ddddd ddd dd dddd ddddd d ddd dd dddd dddd ddd ddd d fSddddddddddd dddd dddd dd dd dddddddd d d dd d dddd dd d ddd ddddddddddd ddddddddd dd dddd dddd dddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddd fSdd dd dddd dd d d dd ddddd dd d d dd d ddd dd ddddd ddd dd d dd dd dddd dddd dd dddddd dd dd dd dddd d ddddddddddfSdddd ddddddddd dddddddd dddddddddddddd d dd dd dd d ddd dd dddddddddddddddddd dddddd d d dd d dddddd fSddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddddd fSdddd dddd dddd ddd dddd dddd dddddd dddddd ddd dd d ddddd dddd ddddddddd dddddd dddddddd d ddd ddddddfSdddddd dd ddddddddd dd dd dd dd dddd dd dd dd d dddddddddddddddddddddddddddddddddddddd d d d ddddddfSdddd dd ddddd dddd dddddddddddddddd ddddd ddddd ddddddddddddddddddddddddddddddddd ddddddddd fSdddd dd dddd dd d d dd d d dd ddd dd d d dd dd d ddd dd dd dd ddd d dd d dd dddd dd ddd d dd d dd d dd dd dd dd dd d ddd dd dfSdd dd dd dd dd d dd dd dd ddd d d d d d d d dd ddd d dd dd dddd ddd ddddddddddddddd ddd d ddd dd ddddd ddd d dd ddddfSdd dd dddddddd d dd dd dddd dddd dd dddd d d dd d d dd ddd d dd dd d ddddddddddd ddd dddd ddddddd d dd d ddddd d fSdd dddddd dd dd d dd d d dd dd d dd d d ddd dd d d dd d dd dd d dd d dd d ddddddddddddddddddd dd dddddd d d dddddd dfSdd dddd dddddd d dd d d ddd ddd d dd dddddd ddd ddddddd ddd d ddddddd ddd ddd dddd d d ddddd ddddd d d ddddd dfSdddddd dddd d d ddd d ddd d ddd dddddd dddddd ddddd d dd dd d dddddd ddddd ddddd ddd d dd ddddd d dd d ddddddfSdddddddddd ddd dddd dd d d ddd ddd dddd d ddd dddd dd dd dd d ddddddd d ddddd ddddd dd ddddddddddddd ddd d fSddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddfSdddd ddddddd d d dddddddddddd dddddd dddd d ddddddddddddddddd dddddddddddd dddddddd d dd ddddd ddfSdddd dd ddddddddd dddd ddddddddddddddddddddd dddddddddddddddddddd ddddddddddddddddd dddddd fSdddd dd dddddd d dd dd dd d d dddddd dddddddd d dddddd ddd d d dddddddddddd dddd ddd ddddddd d ddddd dddd fSdddd ddddddd dd d dd d d dd ddd d dd ddddd dd ddddd d ddd d ddd d d dd d ddd dd d dd d ddd ddddd dddd d ddd dddd ddd fSdddddd dd dd dddd d ddd dd dd d d dd ddddddd dd dddd d d dd ddd dd dd ddd ddd ddd d d d d d d d dddd d dd d d dddd dddd fSdddd dddd dd d d d ddd ddd ddddddd d d dd d d dd d dddd d d d d dd d d ddd ddd d ddd dddddd dd d dddd dd dd dd dddddddfSdd ddddddddd d d d d d d dddd dddd dddd dd dd d d d dd d dd d d dd d d d dd dddddd dddddd dd dddd dd ddd dd dd ddddd dfSdd dddd dd dd ddd dd dd d d d d ddd d dddd d d d d dd d d dddd ddddddddd dddddddddd dd d dd ddd dddd dd dddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd dd dddd ddd dd d d dddddd dddddd dd ddd dddd d d dd dd d dd ddd ddd dddddddddddddd ddddddd dddd ddddddd fSdddddddddddddddddddddddddddddddddddddd dddd dddddddddddddddddddd dddddddddddddddddddddfSddddddddddddddddddddddddddddddd ddddddddddddddddddd ddddddddddddd ddddddddddddddddddddfSdddddddd dddd dddd dddddd d d d d d ddddd dd ddddd dddd d d dddd ddd dd ddddd d d ddd d d dddd ddd d d dddd ddd d fSdddd dd dd dd d d d d d d dd dd d d dddd d d d dd d d d dd ddd d d d dd dd d d ddd d d d dd d ddd ddd d d dddddddd dddddd ddddfSfSZd fd YZd efdYZ defdYZ dS(i(twrap_ordiiidiiiiiitJapaneseContextAnalysiscBs>eZdZdZdZdZdZdZRS(cCs|jdS(N(treset(tself((s2/usr/lib/python2.7/site-packages/chardet/jpcntx.pyt__init__|scCs8d|_dgt|_d|_d|_t|_dS(Nii(t _mTotalReltNUM_OF_CATEGORYt _mRelSamplet_mNeedToSkipCharNumt_mLastCharOrdertFalset_mDone(R((s2/usr/lib/python2.7/site-packages/chardet/jpcntx.pyRs    cCs|jr dS|j}x||kr|j|||d!\}}||7}||krt|||_d|_q|dkr|jdkr|jd7_|jtkrt|_Pn|jt|j|cd7s8PK[ښV)site-packages/chardet/sbcsgroupprober.pycnu[ ۝Rc@sddlmZddlmZddlmZmZmZmZm Z m Z ddl m Z m Z ddlmZmZddlmZmZddlmZddlmZdd lmZd efd YZd S( i(tCharSetGroupProber(tSingleByteCharSetProber(tWin1251CyrillicModelt Koi8rModeltLatin5CyrillicModeltMacCyrillicModelt Ibm866Modelt Ibm855Model(tLatin7GreekModeltWin1253GreekModel(tLatin5BulgarianModeltWin1251BulgarianModel(tLatin2HungarianModeltWin1250HungarianModel(tTIS620ThaiModel(tWin1255HebrewModel(t HebrewProbertSBCSGroupProbercBseZdZRS(cCstj|tttttttttttttt tt tt tt tt ttttg |_t}ttt|}ttt|}|j|||jj|||g|jdS(N(Rt__init__RRRRRRRRR R R R R Rt _mProbersRRtFalsetTruetset_model_proberstextendtreset(tselft hebrewProbertlogicalHebrewProbertvisualHebrewProber((s;/usr/lib/python2.7/site-packages/chardet/sbcsgroupprober.pyR+s.                  (t__name__t __module__R(((s;/usr/lib/python2.7/site-packages/chardet/sbcsgroupprober.pyR*sN(tcharsetgroupproberRtsbcharsetproberRtlangcyrillicmodelRRRRRRtlanggreekmodelRR tlangbulgarianmodelR R tlanghungarianmodelR R t langthaimodelRtlanghebrewmodelRt hebrewproberRR(((s;/usr/lib/python2.7/site-packages/chardet/sbcsgroupprober.pyts.PK[e~R[R['site-packages/chardet/langthaimodel.pyonu[ ۝Rc@s9dZdZied6ed6dd6ed6dd6ZdS(iiiiiijikidiiiiei^iiiliminioiiiiYi_ipiqiiiii@iHiIiriJisitifiQiiuiZigiNiRi`ii[iOiTihiiiaibi\iiiiiiiXiiiiiiiiviiiiiciUiSiiiiiiiiiiiiiiiiiiKiii4i"i3iwi/i:i9i1i5i7i+iii,ii0iiii'i>ii6i-i iii=iii i*i.iiiLiiBi?ii ii$ii i(ii i#iViiiiii ii)ii!ii2i%iiiCiMi&i]iiiDi8i;iAiEi<iFiPiGiWiiiiitcharToOrderMaptprecedenceMatrixg@?tmTypicalPositiveRatiotkeepEnglishLettersTIS-620t charsetNameN(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijikidiiiiei^iiiliminioiiiiYi_ipiqiiiiiiiiiii@iHiIiriJisitifiQiiuiZigiNiRi`ii[iOiTihiiiaibi\iiiiiiiiiiiiXiiiiiiiiviiiiiciUiSiiiiiiiiiiiiiiiiiiKiii4i"i3iwi/i:i9i1i5i7i+iii,ii0iiii'i>ii6i-i iii=iii i*i.iiiLiiBi?ii ii$ii i(ii i#iViiiiii ii)ii!ii2i%iiiCiMi&i]iiiDi8i;iAiEi<iFiPiGiWiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tTIS620CharToOrderMapt ThaiLangModeltFalsetTIS620ThaiModel(((s9/usr/lib/python2.7/site-packages/chardet/langthaimodel.pyt%s* PK[GcLL%site-packages/chardet/cp949prober.pycnu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tEUCKRDistributionAnalysis(t CP949SMModelt CP949ProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pyR#s  cCsdS(NtCP949((R ((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pytget_charset_name+s(t__name__t __module__RR (((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pyR"s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/cp949prober.pytsPK[i,$site-packages/chardet/utf8prober.pycnu[ ۝Rc@s`ddlmZddlmZddlmZddlmZdZdefdYZ dS( i(t constants(t CharSetProber(tCodingStateMachine(t UTF8SMModelg?t UTF8ProbercBs5eZdZdZdZdZdZRS(cCs*tj|tt|_|jdS(N(Rt__init__RRt _mCodingSMtreset(tself((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyR%s cCs'tj||jjd|_dS(Ni(RRRt _mNumOfMBChar(R((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyR*s  cCsdS(Nsutf-8((R((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pytget_charset_name/scCsx|D]}|jj|}|tjkr>tj|_Pq|tjkr]tj|_Pq|tjkr|jj dkr|j d7_ qqqW|j tj kr|j tjkrtj|_qn|j S(Nii(Rt next_stateRteErrorteNotMet_mStateteItsMeteFoundItteStarttget_current_charlenR t get_statet eDetectingtget_confidencetSHORTCUT_THRESHOLD(RtaBuftct codingState((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pytfeed2s   cCsLd}|jdkrDx$td|jD]}|t}q(Wd|S|SdS(NgGz?iig?(R tranget ONE_CHAR_PROB(Rtunliketi((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyREs (t__name__t __module__RRR RR(((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyR$s     N( tRt charsetproberRtcodingstatemachineRtmbcssmRRR(((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyts PK[jzA A #site-packages/chardet/escprober.pycnu[ ۝Rc@s|ddlmZddlmZmZmZmZddlmZddl m Z ddl m Z defdYZ dS( i(t constants(t HZSMModeltISO2022CNSMModeltISO2022JPSMModeltISO2022KRSMModel(t CharSetProber(tCodingStateMachine(twrap_ordtEscCharSetProbercBs5eZdZdZdZdZdZRS(cCsHtj|ttttttttg|_|jdS(N( Rt__init__RRRRRt _mCodingSMtreset(tself((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyR %s     cCs_tj|x0|jD]%}|s)qnt|_|jqWt|j|_d|_dS(N( RR R tTruetactivetlent _mActiveSMtNonet_mDetectedCharset(R tcodingSM((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyR /s  cCs|jS(N(R(R ((s5/usr/lib/python2.7/site-packages/chardet/escprober.pytget_charset_name9scCs|jr dSdSdS(NgGz?g(R(R ((s5/usr/lib/python2.7/site-packages/chardet/escprober.pytget_confidence<s cCsx|D]}x|jD]}|s)qn|js8qn|jt|}|tjkrt|_|jd8_|jdkrtj|_ |j Sq|tj krtj |_ |j |_|j SqWqW|j S(Nii(R Rt next_stateRRteErrortFalseRteNotMet_mStatet get_stateteItsMeteFoundIttget_coding_state_machineR(R taBuftcRt codingState((s5/usr/lib/python2.7/site-packages/chardet/escprober.pytfeedBs$      (t__name__t __module__R R RRR"(((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyR$s   N(tRtescsmRRRRt charsetproberRtcodingstatemachineRtcompatRR(((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyts "PK[?2#site-packages/chardet/euctwfreq.pycnu[ ۝Rc@sdZdZdZdS(g?iiiiiiii iRiiiiiii inii!i iiLi,iAiis iiiiiiL iS iii iiii.iNiiiiii:iiii?iii=iNiKiiiil iii i ii i ii iiii ioi$ iiiii ici8iiiiiiiiizi|iit i"i ie i@i\ii iiiiiiiFiiM iQiHiiiPiviif iiiiDiT iiiFiN iiEi iOii/iisii3i<i2i ii&iLiiiO iiiGiiiM iii?ii i`iiF i*iigi iZi i:ii iiKi ii iiiiii`iiiig ii i iqii~iiiP i ii iii!iiuiii*iii i ii~iiiiieiiGi^iiii iUiCiiBiiiiiii ijioi/iiiOi2 i[iii i& iiiiiSi(ii iipi]ii6iii i' iiiiii8ii+i% i[iii\iiiiiiX i( iii i0ii iHi i i"i!ii+i i1i"iii iOiG iiifi1iiiiiiii2i9iili,ii iiiiii}ih i#iq iQiMi&i iXiii#iii iiiijiiiMiii i%ii ii$iii'i iiN ii ii7iiJii!iiiiiiMii) iPiU iiii ii%i i ii ii i iIii3 ii iir ii i iiiimiii$iiixii iii ii ii%i&ii iiiiiiii&ii'iii'iii.ii iiiH iiiii$i#iiDi&iAi iiiiiiUiGiiii iQ iPiSi'iiidi i0iFiii* iiiiiiiJii iUiiiiI iR iii<iiS i:i7 i ii i i9ii}ii iiiViPiT ii)iCiiii& i i i)iiim iiiiiii4 iiiin i*iiiiiiiO iiiii i+ i(i i iiiU i(ii5iYiji iliiuii)i i*i+iV i i=i iiiiiii4ii!iiiTi, ixiiieii iiJ iPiis i5iAiV i/iki i iili!i iiAii`ii i iiAii iiii ii i iiiiiiMi iiiiiiW iii it iii+i}iij i8 iiiiiiiii- i)imi iiW ii ii iiaii iP iK i i,ii ii7i' iu ii{ik iiiii i9 iiiiiiiiiii1iibii i iiio iiX i,iQ iiiiii i i iX iiii5iDiiiliii[i iiiY ii%ii. iY ii*iii iiR iii ipiiinicigi+iii'i2iiii{iil iim iii: iifi ii|i5 iiiiiZ i i i i ii i,ii iii;iiIiYiii[ iXi"ii iiii~iii,iikiii-iiiiiiDiiii>i]ii,iiiiviLiBiii&iii iiiiGiiiiBii i! iiiu iiiii i iaiiiiv iS ii}i; iiDii=ii0i ii\ i( iiiivi iiiiii.iii9iHiiiii] iEiiiiii!ii/ iii i i-iiiQi*ii.i/iiiii0 i3ii" ii*iRiiiiWiii/iibi.ii iiiiiiiRii ii) ii2ii iiiiiiiZ iiT iiw iiii iiiiiii[ iOii i i`i7ix i^ iiiiiii\ iiiiiiigiiin ii i_ii~iiii0ii iaiiy i] iiiii iii i;ii i-i iiL iiii/iiiii`ii#i"iiiii0i isiiiidisi iiY ii ikiwio ii iiii1ii2iigip iQiiUi iv iiiiiCiSii^ iii5iiiBii_i ibiNiiiXiiii iiLici i i iKiw i* iaiGi3ii i iii1i6i i2i6 iNiii i i3ii:ii\iqiiii-iii i3i iiiix i ii irii4i i_ iiU iiii@ii5i ii ii ii/i+ i6i iiiiiii i7 iZ iiii8i4iiCiii iilii` iiiiiiYiiiii5i i{iiiii$i7iiMiV i0irii iigiiVii8ii9i, iZiii{i#iW i0iii$i i i ii4ii[iiviiiciiViM i$i- iiiiX iii idiiiWi[ iii iiiq i ii1 iiiiitiiii ii i i2 ii2i:i3 i i.iii2ii iiiiii%i iii i i iiiiiii i i6i i4 ii|iiiSiiii_ i iiiii`iiiii i3iii;ir iiii7iYiLi;ii i iiiiiTi\iiii<iiVi5 iii iii ii"ixi%ii;i8 i iii2iEi=i!iiii^iiwi i"iiiis ii#i<iQiiiri$ii]ii%ii. i&i i3i5iBiiy i'iii ii i i>iY ia ib i(i i i)i*i iiiii:ii6ii^ii iii(i i+i+i i ixi,i i.ihi/ i-iiii iVi ii ihiiz i.iiiii<iii;i/i?iii i i0i8i i ii5i6i i_i)i1i2i i3iyi iii i i^i4i i i?i$i+i\ i i5i_iWii iz i6i0 ii i] i iip i7i ii8i^ i< iiVi9i i6 iiIiwi}ic i^ii i9i@ii iAi iii i:iei1iiiBiiiiii i i ii7 i;i<ii=i{ ii(i`iRi1 iYiiIi ii i i6i id i>iiie i?iioiiqiYiniiiliiCiDi{ ii i_ iEiPiUii i iiiiEimii@ii:i ii iAiiiiii# i iNi i iBiiCiWiTiTiii iif i;iDii&i i| iiiiii iii<i= i iii iVii iioii iEi iFiii iiii iiiDi-i8 iiGidi i i iHit iiiIizi iiJi i iKii i| iiiii> iiiiiiiLi:i i=iiMii? i iiiHiiiiiNiii iOiPiiFikiQi9 i iii i iu iiv iiiiiiRiSiii} i i>iiiii i: iTi iiN iiCiiiiUi~ii iWiiGiiii,iiiiiOii|iiiiOi?iVi` ii ii~ i iw iiii@i!iii; iiiiiWii"i iXiiYiiRig iuii ih i ix i=i iiZii< iii[i i#ii= i i\i$ii]iHiIi^i7iO i$ i i_i%iviJii i!iwitii`iaibi9 i&ii"i{ii i i'iciidi8iiiii[i9iiidiZ i ieiii i@ i!i(i"ifiiii i#i$iTigiKii i%iiWiMihiiiiiiii%iiiiii i` iiyi7imiLijiki i: i> i!iiii iBi)ili|i ii iziiii iiMi ii iiimiiniuiq ivii i i*iNioipiiiqi7i.iriiy i iii iifii i isi! iyi iOi i iii+iPij i i>iiii iiYi iAitiiui% i i ivi iiz i2 iwi,i i iii3iQiii ixi i6i9ik iii&i6i ii-i iiRiyiiQi9ici i'i.i ioi(iBiFi? il i i)iei i izi iSiTi iii{i/iii" i ibi/ii`iii0iuiiviii1ii i iiUii*i i/iEiiSii8iZi|i}iFi+i ii!i~i2i,iFiP iim ii iieisiiCi ir iiii iiai3iZi%i-iiii i4iiiiAiii i iii iiiiDi.iiii inii iii iii ii3 i5iJi0i is i ii ii@ iiiVii/i i i6iWiA i7ioi iiPi0ii1iin iiiaiQi2iipi:iiiPiibiiiii i{ i3i7iEiii iii| iFiGiXiiiiii]i i4iii} iii i5ii&ii8i i ii iiiii iLiiiii i iYi iiiii4 i iB i9i8iiiii iHi i/i3iZi[ii io iii:i0i ini\ii]ii^iiii i iiiIiiii;ii4ii<ii=i;i ii iiiXi iiii5 i_ii i iiiii}i0i>ip iJiiiKii ii& iFiiii i i#ii[iiiifi i>iq ii?ir ii6iiii i iiiiijiiiii@i-ipi9i; i6iyiAiii i i' iiiiiiiiViii`ii4iii iKi iai i6 i iiiiii"iiiKi i iiii iYiGioiibifici7i is ipiri i8iiiii i iA iQ i iC i,i ii iiii\iLiiuii~ i iii9iiiBiiZiii iCiiiijidii0ihigiiei iMi} i7 i ii iiDi iiiiifi:iiiNi;i iEiFii( iii<iiiGiMi=iwigii~ it i?iiii itimi# i ii+iiihiiiiii[ i iOi i iii iiB iii$ it ii iiia ii iiHiiiiiQi"i< i i ii-i1ii#iu i'iiD i i ii i iIii>iJi% iiiPi i iii i i=ia iiKiiv iiii i ii ii_iijii?iE i1i i iikii8iQii iliii i imi@i iibiiii iRi iii5ii iiiLi iw iiniiii4iHi iiMii iiiiiii\ iioiiNi] i ii ii\ix igiiEi iiiiiiipii iiqi iiiiiiOiii iri iZi isitiiii iPieiii iiioi ii^ ii}iiiiziAi& iii i iiini-ii iQiiii iiiiRiiui iiiiBiii iy ii iviwiBihiqiiii<ii*iiiSi"iTiCi>i)i ixiUiiii~iiiiziiViiiiiC i)iqiiiWi i iiiDiiEiTiFipiii#i#iyii iiiGiiz iiiii ii iiSiiXi iiiiiu i i=iHiii_ iiRiiiiiiwiiiYizi{iqiii3ii5ii i i{ ii i|i}iSi~ii i i iZi[iiiiii` iiF ii]i i iniiiIii i iiiii iG iTiJiiKiziSiri\i) ii iv ii5iiii ib iiijiiiii iii]i^ii iiciiii i ii iai:i1i iiiiAihi ia i i6iiii ib i-ii iH i_ii ii i iii iiii| ii* ifii ii i iD ii iLiWiiiiUii i ii$ii i i iNiiiR ikiiE iiiiiMiiS i' ii`iisiiF ii iai} i i i( ijii i~ iViBi[ib iWi iibi iI iic i i ii{ii i ii ici i i idi i i]iiii= ieiiiiii iii iNi iiifigi i i iihiiiii i=iiXiiiiiiiiid iiHiCi iiiiTiWi i ii9ii iNi iKiEiji4iJ i iYi iiG i ikiiihiOii i i i]iPiZiiliiQi[ikiiminiRioic iiiiiiSiXiiii\i+iiiiiIiTiUiUiii iili iDiiiipiiqi iki imii iK iiiiiiiVi8 i i iiri@iWiri iCiGiiii ii^i ii i8iti i:i i i!iinisi i"i i#i$i]iti i%i i&iriui'i+ i(i)iie i i}i iiii*i4i1i+ii i i ii ii,ii i> iXitiri? ii i-i iviui{iiw iwii.ixiT i, iii i/i0ii ii1i ii2i iGiRi i i^iiYi iZi i i[i3i^iiii ii i) i\i i4i@ivii5ii6i7iid i]i ii^i8ii&i i ii i9 iyiuii i iiziRii{ii ii(i_ii<i9iili iii_i iSi`iki i[i iii ixi:i i;i<i! i$i=ii|iii>idi i i?iei iiii ii iii i}i@iAiBii.i~iaiOi i ii`ibii i%i iii i;i iiiiCiiDi iiiif i" iL i i i ii iEi;iiFi&iGi i iix iHi)iiiciiIidiTii i ieiiiii iiJi igi~iiUiie i iiiifiai8igi i ibihiKiy iii iLii: i iii ii*iM iiii icitiiMiNiii ii ii iiif iiiYidieii*i iiOiH ii# ii#i; i i iiiiI i\i@ iii isi$ i iPiQi i i iRijiSiTii+iiUiiVi iiLi i!i iJ i\i4iWi iiXiYiZii[i>iwikifiii+iii% iii$ii\iiiili i]iili^i_ig i%ii`iaigiiii iiN iK ibicidii ic iwi iei ibiyi ifihigihihii'iii imiiz ijid iii i i i<iii|iiiiii iiiO iki iliii iaiiimiii ini iiui iniiiie i& i ioiii i i< iipiqiP iQ iiji ii iii(ii_irisi i iii<iEiR ifiiiii]iiiIiti=iiuiivii iioi i iki,iliwi' ii imiiiiFi`ii if i ii iSiJixiiyiziniiL iipiOii ii i{i i iiA iyiiiU ii|i}i~iFi iqii i iiiiii iiiipiiiB iioi iiiipii- iiriiiqiqii( iiriiiisi iii iii i(i. isi) iiti i ii* iiuiiiTiviM i{ iiitii'iiii iiiiiiiig iZiwi i iciiji+ ipiiiixiii ih iiii iiii i, i= i ii i iuiiiii/ iyii i iyivi i iiwiiiiii ii iziiiii>iiCi'iiii{iiZiiii iii iiaiii iiqi?ii ii|ii i"ii ii i}iiiii=iiAi i1ii)iiii?i i iiiixi ii ii i i iihiiS iiii(ii iii'ixiyii ii i i iiiii_i iii> ii}iPiii iiii~ii iN iicii iiiiHii ii iiiiiiiiiiiiij iii i* iiii i i iiih iii_iii/i i<ii~i7ik iT iii]i iU ibi itiiig iizii ii| iiiiiiiii{iii ii0 ii ii+ i i, iiiiIiiiii i iiiBi ii4isi iiiii i iii?iCiii iiGi iiiiiiiiiiiiiii|i1 iiimiC iiil iiii i} ii? iiii iiih iiiIiiiiV iiiiiiii^iiii i- i. iii)iii iiii2 iiiiii ii iiAii ii- iiiii i ii ii iiiiii ii iii iiiQi i iO iiiiiiiiziKii ii[i iJiii@ ii. iiiiiD ii}i/ i@ii iii i i@iiRiii ij i~iiiJiii iiiii i0 iimiiiim i~ ii i ii1 iii iiiiii idiiiiXiii9iii iiiUiiiiiiLii3 ii ii i i iii i iii iii$i(iviii&iibii iii i iiiiii{iiiiiiiiiii2 ii iiii iii iiiiiiii^iiiV i iiiiiiiiiiiiii2iW ii iW ioii iik iX iii iA i4 ii ii3 iii iii ii iii iiiiiii i iiHiiiiiiiiiiiDiiiIisi iii ii iiiiiwii{iiiiiii/ in i,iiiii i iii ii ii i ii4 iB iiiiP i5 i ii i ii ii iii|iiziiiii i'ii5 iiii! ii iyiiiViii i i iiiiiiiiii i iii-iiiiii ii i i iiii ii" i%iiiiJiC iiixiiii i i iil i6 iiiii ii iiiXii ii7 ii i iNi im iiii iWi i i!i ii i i>i8 ii"i#i9 ij iD i i ii$i i%ii iiiXi&ii'iE i i(iF ii)iixi ikiiiii*i+ii iiDiii,iiiiiiiKi-i.i/i: ii0iJiii1i|i iii iii iEi*i2i iiiiiiHixi iii3ii iii3iiii; ipii< i iii ii4i5i i i6iiOii i7i8ii9ii:i ii;iiiii<i iiY i=i>i i i?ii@iAiBi i ii= i iiio i ifiiii i i i iCi iDii# ii i> iiEii iFiZ iE iii i[ i$ i iiGi? ii iiiG iiii@ iHiiA i\ iLiiiii iIi i iiiiiiiJi i i i iKiLi] iMiNi iijiiQ i iB iOiPiiiQi iiiRi iSiTii(iiiiC iiUiiVi iWiXiiiYiiiiZiiidi[iciH ii_ii#i0 i\ii]iini i iiii^iii_ik iD ii`iaii ibii i iciiiiidiii iiiidi^ iE ieiiii iiiifii_ i7iiii i iiF iiigi-iii! iiihi iqi;i iiiiXii i iiiiijiiii ikiliii~imiG i` iniyip iiioi>iipiiqi iiiriia iiiisiti" iui|ii?iiiiviiiiiieiiiwixiyiiiiizi{i@i|ii i}i i iii% isiiR ii.iiMi?i ii~iiib iii@ii iiiii iiiiiiii ii6 iI iiii iiiiic iiiiii i i2iiiimii@iiii iiiNii iifiiiiZi iiiiii i\iH iid iiiJ ii ii i iiii iiK iiii# iiii ii iiiiKiiiiigiiiihii>ii.iiiiiiiii)in itiiii io i iI i i iiiq iiir i iiiiiip ii ii iziiiiUiiJ iii1 iK itiiiiiii iiiJiiiL i iiiiiii iMiii ii iiiieii iiii i iiiiiiiriiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"N(iiiiiii iRiiiiiii inii!i iiLi,iAiis iiiiiiL iS iii iiii.iNiiiiii:iiii?iii=iNiKiiiil iii i ii i ii iiii ioi$ iiiii ici8iiiiiiiiizi|iit i"i ie i@i\ii iiiiiiiFiiM iQiHiiiPiviif iiiiDiT iiiFiN iiEi iOii/iisii3i<i2i ii&iLiiiO iiiGiiiM iii?ii i`iiF i*iigi iZi i:ii iiKi ii iiiiii`iiiig ii i iqii~iiiP i ii iii!iiuiii*iii i ii~iiiiieiiGi^iiii iUiCiiBiiiiiii ijioi/iiiOi2 i[iii i& iiiiiSi(ii iipi]ii6iii i' iiiiii8ii+i% i[iii\iiiiiiX i( iii i0ii iHi i i"i!ii+i i1i"iii iOiG iiifi1iiiiiiii2i9iili,ii iiiiii}ih i#iq iQiMi&i iXiii#iii iiiijiiiMiii i%ii ii$iii'i iiN ii ii7iiJii!iiiiiiMii) iPiU iiii ii%i i ii ii i iIii3 ii iir ii i iiiimiii$iiixii iii ii ii%i&ii iiiiiiii&ii'iii'iii.ii iiiH iiiii$i#iiDi&iAi iiiiiiUiGiiii iQ iPiSi'iiidi i0iFiii* iiiiiiiJii iUiiiiI iR iii<iiS i:i7 i ii i i9ii}ii iiiViPiT ii)iCiiii& i i i)iiim iiiiiii4 iiiin i*iiiiiiiO iiiii i+ i(i i iiiU i(ii5iYiji iliiuii)i i*i+iV i i=i iiiiiii4ii!iiiTi, ixiiieii iiJ iPiis i5iAiV i/iki i iili!i iiAii`ii i iiAii iiii ii i iiiiiiMi iiiiiiW iii it iii+i}iij i8 iiiiiiiii- i)imi iiW ii ii iiaii iP iK i i,ii ii7i' iu ii{ik iiiii i9 iiiiiiiiiii1iibii i iiio iiX i,iQ iiiiii i i iX iiii5iDiiiliii[i iiiY ii%ii. iY ii*iii iiR iii ipiiinicigi+iii'i2iiii{iil iim iii: iifi ii|i5 iiiiiZ i i i i ii i,ii iii;iiIiYiii[ iXi"ii iiii~iii,iikiii-iiiiiiDiiii>i]ii,iiiiviLiBiii&iii iiiiGiiiiBii i! iiiu iiiii i iaiiiiv iS ii}i; iiDii=ii0i ii\ i( iiiivi iiiiii.iii9iHiiiii] iEiiiiii!ii/ iii i i-iiiQi*ii.i/iiiii0 i3ii" ii*iRiiiiWiii/iibi.ii iiiiiiiRii ii) ii2ii iiiiiiiZ iiT iiw iiii iiiiiii[ iOii i i`i7ix i^ iiiiiii\ iiiiiiigiiin ii i_ii~iiii0ii iaiiy i] iiiii iii i;ii i-i iiL iiii/iiiii`ii#i"iiiii0i isiiiidisi iiY ii ikiwio ii iiii1ii2iigip iQiiUi iv iiiiiCiSii^ iii5iiiBii_i ibiNiiiXiiii iiLici i i iKiw i* iaiGi3ii i iii1i6i i2i6 iNiii i i3ii:ii\iqiiii-iii i3i iiiix i ii irii4i i_ iiU iiii@ii5i ii ii ii/i+ i6i iiiiiii i7 iZ iiii8i4iiCiii iilii` iiiiiiYiiiii5i i{iiiii$i7iiMiV i0irii iigiiVii8ii9i, iZiii{i#iW i0iii$i i i ii4ii[iiviiiciiViM i$i- iiiiX iii idiiiWi[ iii iiiq i ii1 iiiiitiiii ii i i2 ii2i:i3 i i.iii2ii iiiiii%i iii i i iiiiiii i i6i i4 ii|iiiSiiii_ i iiiii`iiiii i3iii;ir iiii7iYiLi;ii i iiiiiTi\iiii<iiVi5 iii iii ii"ixi%ii;i8 i iii2iEi=i!iiii^iiwi i"iiiis ii#i<iQiiiri$ii]ii%ii. i&i i3i5iBiiy i'iii ii i i>iY ia ib i(i i i)i*i iiiii:ii6ii^ii iii(i i+i+i i ixi,i i.ihi/ i-iiii iVi ii ihiiz i.iiiii<iii;i/i?iii i i0i8i i ii5i6i i_i)i1i2i i3iyi iii i i^i4i i i?i$i+i\ i i5i_iWii iz i6i0 ii i] i iip i7i ii8i^ i< iiVi9i i6 iiIiwi}ic i^ii i9i@ii iAi iii i:iei1iiiBiiiiii i i ii7 i;i<ii=i{ ii(i`iRi1 iYiiIi ii i i6i id i>iiie i?iioiiqiYiniiiliiCiDi{ ii i_ iEiPiUii i iiiiEimii@ii:i ii iAiiiiii# i iNi i iBiiCiWiTiTiii iif i;iDii&i i| iiiiii iii<i= i iii iVii iioii iEi iFiii iiii iiiDi-i8 iiGidi i i iHit iiiIizi iiJi i iKii i| iiiii> iiiiiiiLi:i i=iiMii? i iiiHiiiiiNiii iOiPiiFikiQi9 i iii i iu iiv iiiiiiRiSiii} i i>iiiii i: iTi iiN iiCiiiiUi~ii iWiiGiiii,iiiiiOii|iiiiOi?iVi` ii ii~ i iw iiii@i!iii; iiiiiWii"i iXiiYiiRig iuii ih i ix i=i iiZii< iii[i i#ii= i i\i$ii]iHiIi^i7iO i$ i i_i%iviJii i!iwitii`iaibi9 i&ii"i{ii i i'iciidi8iiiii[i9iiidiZ i ieiii i@ i!i(i"ifiiii i#i$iTigiKii i%iiWiMihiiiiiiii%iiiiii i` iiyi7imiLijiki i: i> i!iiii iBi)ili|i ii iziiii iiMi ii iiimiiniuiq ivii i i*iNioipiiiqi7i.iriiy i iii iifii i isi! iyi iOi i iii+iPij i i>iiii iiYi iAitiiui% i i ivi iiz i2 iwi,i i iii3iQiii ixi i6i9ik iii&i6i ii-i iiRiyiiQi9ici i'i.i ioi(iBiFi? il i i)iei i izi iSiTi iii{i/iii" i ibi/ii`iii0iuiiviii1ii i iiUii*i i/iEiiSii8iZi|i}iFi+i ii!i~i2i,iFiP iim ii iieisiiCi ir iiii iiai3iZi%i-iiii i4iiiiAiii i iii iiiiDi.iiii inii iii iii ii3 i5iJi0i is i ii ii@ iiiVii/i i i6iWiA i7ioi iiPi0ii1iin iiiaiQi2iipi:iiiPiibiiiii i{ i3i7iEiii iii| iFiGiXiiiiii]i i4iii} iii i5ii&ii8i i ii iiiii iLiiiii i iYi iiiii4 i iB i9i8iiiii iHi i/i3iZi[ii io iii:i0i ini\ii]ii^iiii i iiiIiiii;ii4ii<ii=i;i ii iiiXi iiii5 i_ii i iiiii}i0i>ip iJiiiKii ii& iFiiii i i#ii[iiiifi i>iq ii?ir ii6iiii i iiiiijiiiii@i-ipi9i; i6iyiAiii i i' iiiiiiiiViii`ii4iii iKi iai i6 i iiiiii"iiiKi i iiii iYiGioiibifici7i is ipiri i8iiiii i iA iQ i iC i,i ii iiii\iLiiuii~ i iii9iiiBiiZiii iCiiiijidii0ihigiiei iMi} i7 i ii iiDi iiiiifi:iiiNi;i iEiFii( iii<iiiGiMi=iwigii~ it i?iiii itimi# i ii+iiihiiiiii[ i iOi i iii iiB iii$ it ii iiia ii iiHiiiiiQi"i< i i ii-i1ii#iu i'iiD i i ii i iIii>iJi% iiiPi i iii i i=ia iiKiiv iiii i ii ii_iijii?iE i1i i iikii8iQii iliii i imi@i iibiiii iRi iii5ii iiiLi iw iiniiii4iHi iiMii iiiiiii\ iioiiNi] i ii ii\ix igiiEi iiiiiiipii iiqi iiiiiiOiii iri iZi isitiiii iPieiii iiioi ii^ ii}iiiiziAi& iii i iiini-ii iQiiii iiiiRiiui iiiiBiii iy ii iviwiBihiqiiii<ii*iiiSi"iTiCi>i)i ixiUiiii~iiiiziiViiiiiC i)iqiiiWi i iiiDiiEiTiFipiii#i#iyii iiiGiiz iiiii ii iiSiiXi iiiiiu i i=iHiii_ iiRiiiiiiwiiiYizi{iqiii3ii5ii i i{ ii i|i}iSi~ii i i iZi[iiiiii` iiF ii]i i iniiiIii i iiiii iG iTiJiiKiziSiri\i) ii iv ii5iiii ib iiijiiiii iii]i^ii iiciiii i ii iai:i1i iiiiAihi ia i i6iiii ib i-ii iH i_ii ii i iii iiii| ii* ifii ii i iD ii iLiWiiiiUii i ii$ii i i iNiiiR ikiiE iiiiiMiiS i' ii`iisiiF ii iai} i i i( ijii i~ iViBi[ib iWi iibi iI iic i i ii{ii i ii ici i i idi i i]iiii= ieiiiiii iii iNi iiifigi i i iihiiiii i=iiXiiiiiiiiid iiHiCi iiiiTiWi i ii9ii iNi iKiEiji4iJ i iYi iiG i ikiiihiOii i i i]iPiZiiliiQi[ikiiminiRioic iiiiiiSiXiiii\i+iiiiiIiTiUiUiii iili iDiiiipiiqi iki imii iK iiiiiiiVi8 i i iiri@iWiri iCiGiiii ii^i ii i8iti i:i i i!iinisi i"i i#i$i]iti i%i i&iriui'i+ i(i)iie i i}i iiii*i4i1i+ii i i ii ii,ii i> iXitiri? ii i-i iviui{iiw iwii.ixiT i, iii i/i0ii ii1i ii2i iGiRi i i^iiYi iZi i i[i3i^iiii ii i) i\i i4i@ivii5ii6i7iid i]i ii^i8ii&i i ii i9 iyiuii i iiziRii{ii ii(i_ii<i9iili iii_i iSi`iki i[i iii ixi:i i;i<i! i$i=ii|iii>idi i i?iei iiii ii iii i}i@iAiBii.i~iaiOi i ii`ibii i%i iii i;i iiiiCiiDi iiiif i" iL i i i ii iEi;iiFi&iGi i iix iHi)iiiciiIidiTii i ieiiiii iiJi igi~iiUiie i iiiifiai8igi i ibihiKiy iii iLii: i iii ii*iM iiii icitiiMiNiii ii ii iiif iiiYidieii*i iiOiH ii# ii#i; i i iiiiI i\i@ iii isi$ i iPiQi i i iRijiSiTii+iiUiiVi iiLi i!i iJ i\i4iWi iiXiYiZii[i>iwikifiii+iii% iii$ii\iiiili i]iili^i_ig i%ii`iaigiiii iiN iK ibicidii ic iwi iei ibiyi ifihigihihii'iii imiiz ijid iii i i i<iii|iiiiii iiiO iki iliii iaiiimiii ini iiui iniiiie i& i ioiii i i< iipiqiP iQ iiji ii iii(ii_irisi i iii<iEiR ifiiiii]iiiIiti=iiuiivii iioi i iki,iliwi' ii imiiiiFi`ii if i ii iSiJixiiyiziniiL iipiOii ii i{i i iiA iyiiiU ii|i}i~iFi iqii i iiiiii iiiipiiiB iioi iiiipii- iiriiiqiqii( iiriiiisi iii iii i(i. isi) iiti i ii* iiuiiiTiviM i{ iiitii'iiii iiiiiiiig iZiwi i iciiji+ ipiiiixiii ih iiii iiii i, i= i ii i iuiiiii/ iyii i iyivi i iiwiiiiii ii iziiiii>iiCi'iiii{iiZiiii iii iiaiii iiqi?ii ii|ii i"ii ii i}iiiii=iiAi i1ii)iiii?i i iiiixi ii ii i i iihiiS iiii(ii iii'ixiyii ii i i iiiii_i iii> ii}iPiii iiii~ii iN iicii iiiiHii ii iiiiiiiiiiiiij iii i* iiii i i iiih iii_iii/i i<ii~i7ik iT iii]i iU ibi itiiig iizii ii| iiiiiiiii{iii ii0 ii ii+ i i, iiiiIiiiii i iiiBi ii4isi iiiii i iii?iCiii iiGi iiiiiiiiiiiiiii|i1 iiimiC iiil iiii i} ii? iiii iiih iiiIiiiiV iiiiiiii^iiii i- i. iii)iii iiii2 iiiiii ii iiAii ii- iiiii i ii ii iiiiii ii iii iiiQi i iO iiiiiiiiziKii ii[i iJiii@ ii. iiiiiD ii}i/ i@ii iii i i@iiRiii ij i~iiiJiii iiiii i0 iimiiiim i~ ii i ii1 iii iiiiii idiiiiXiii9iii iiiUiiiiiiLii3 ii ii i i iii i iii iii$i(iviii&iibii iii i iiiiii{iiiiiiiiiii2 ii iiii iii iiiiiiii^iiiV i iiiiiiiiiiiiii2iW ii iW ioii iik iX iii iA i4 ii ii3 iii iii ii iii iiiiiii i iiHiiiiiiiiiiiDiiiIisi iii ii iiiiiwii{iiiiiii/ in i,iiiii i iii ii ii i ii4 iB iiiiP i5 i ii i ii ii iii|iiziiiii i'ii5 iiii! ii iyiiiViii i i iiiiiiiiii i iii-iiiiii ii i i iiii ii" i%iiiiJiC iiixiiii i i iil i6 iiiii ii iiiXii ii7 ii i iNi im iiii iWi i i!i ii i i>i8 ii"i#i9 ij iD i i ii$i i%ii iiiXi&ii'iE i i(iF ii)iixi ikiiiii*i+ii iiDiii,iiiiiiiKi-i.i/i: ii0iJiii1i|i iii iii iEi*i2i iiiiiiHixi iii3ii iii3iiii; ipii< i iii ii4i5i i i6iiOii i7i8ii9ii:i ii;iiiii<i iiY i=i>i i i?ii@iAiBi i ii= i iiio i ifiiii i i i iCi iDii# ii i> iiEii iFiZ iE iii i[ i$ i iiGi? ii iiiG iiii@ iHiiA i\ iLiiiii iIi i iiiiiiiJi i i i iKiLi] iMiNi iijiiQ i iB iOiPiiiQi iiiRi iSiTii(iiiiC iiUiiVi iWiXiiiYiiiiZiiidi[iciH ii_ii#i0 i\ii]iini i iiii^iii_ik iD ii`iaii ibii i iciiiiidiii iiiidi^ iE ieiiii iiiifii_ i7iiii i iiF iiigi-iii! iiihi iqi;i iiiiXii i iiiiijiiii ikiliii~imiG i` iniyip iiioi>iipiiqi iiiriia iiiisiti" iui|ii?iiiiviiiiiieiiiwixiyiiiiizi{i@i|ii i}i i iii% isiiR ii.iiMi?i ii~iiib iii@ii iiiii iiiiiiii ii6 iI iiii iiiiic iiiiii i i2iiiimii@iiii iiiNii iifiiiiZi iiiiii i\iH iid iiiJ ii ii i iiii iiK iiii# iiii ii iiiiKiiiiigiiiihii>ii.iiiiiiiii)in itiiiii io i iI i i iiiq iiir i iiiiiip ii ii iziiiiUiiJ iii1 iK itiiiiiii iiiJiiiL i iiiiiii iMiii ii iiiieii iiii i iiiiiiiriiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"(t EUCTW_TYPICAL_DISTRIBUTION_RATIOtEUCTW_TABLE_SIZEtEUCTWCharToFreqOrder(((s5/usr/lib/python2.7/site-packages/chardet/euctwfreq.pyt,sPK[#site-packages/chardet/big5prober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import Big5DistributionAnalysis from .mbcssm import Big5SMModel class Big5Prober(MultiByteCharSetProber): def __init__(self): MultiByteCharSetProber.__init__(self) self._mCodingSM = CodingStateMachine(Big5SMModel) self._mDistributionAnalyzer = Big5DistributionAnalysis() self.reset() def get_charset_name(self): return "Big5" PK[qs (site-packages/chardet/mbcharsetprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # Proofpoint, Inc. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### import sys from . import constants from .charsetprober import CharSetProber class MultiByteCharSetProber(CharSetProber): def __init__(self): CharSetProber.__init__(self) self._mDistributionAnalyzer = None self._mCodingSM = None self._mLastChar = [0, 0] def reset(self): CharSetProber.reset(self) if self._mCodingSM: self._mCodingSM.reset() if self._mDistributionAnalyzer: self._mDistributionAnalyzer.reset() self._mLastChar = [0, 0] def get_charset_name(self): pass def feed(self, aBuf): aLen = len(aBuf) for i in range(0, aLen): codingState = self._mCodingSM.next_state(aBuf[i]) if codingState == constants.eError: if constants._debug: sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') self._mState = constants.eNotMe break elif codingState == constants.eItsMe: self._mState = constants.eFoundIt break elif codingState == constants.eStart: charLen = self._mCodingSM.get_current_charlen() if i == 0: self._mLastChar[1] = aBuf[0] self._mDistributionAnalyzer.feed(self._mLastChar, charLen) else: self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], charLen) self._mLastChar[0] = aBuf[aLen - 1] if self.get_state() == constants.eDetecting: if (self._mDistributionAnalyzer.got_enough_data() and (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): self._mState = constants.eFoundIt return self.get_state() def get_confidence(self): return self._mDistributionAnalyzer.get_confidence() PK[Utt"site-packages/chardet/big5freq.pyonu[ ۝Rc6@sգdZdZdddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd 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# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 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) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 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) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 dd 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$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 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) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 dddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd 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# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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!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)!d*!d+!d,!d-!d.!d/!d0!d1!d2!d3!d4!d5!d6!d7!d8!d9!d:!d;!d!d?!d@!dA!dB!dC!dD!dE!dF!dG!dH!dI!dJ!dK!dL!dM!dN!dO!dP!dQ!dR!dS!dT!dU!dV!dW!dX!dY!dZ!d[!d\!d]!d^!d_!d`!da!db!dc!dd!de!df!dg!dh!di!dj!dk!dl!dm!dn!do!dp!dq!dr!ds!dt!du!dv!dw!dx!dy!dz!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!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!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!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"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)"d*"d+"d,"d-"d."d/"d0"d1"d2"d3"d4"d5"d6"d7"d8"d9"d:"d;"d<"d="d>"d?"d@"dA"dB"dC"dD"dE"dF"dG"dH"dI"dJ"dK"dL"dM"dN"dO"dP"dQ"dR"dS"dT"dU"dV"dW"dX"dY"dZ"d["d\"d]"d^"d_"d`"da"db"dc"dd"de"df"dg"dh"di"dj"dk"dl"dm"dn"do"dp"dq"dr"ds"dt"du"dv"dw"dx"dy"dz"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"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"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"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#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)#d*#d+#d,#d-#d.#d/#d0#d1#d2#d3#d4#d5#d6#d7#d8#d9#d:#d;#d<#d=#d>#d?#d@#dA#dB#dC#dD#dE#dF#dG#dH#dI#dJ#dK#dL#dM#dN#dO#dP#dQ#dR#dS#dT#dU#dV#dW#dX#dY#dZ#d[#d\#d]#d^#d_#d`#da#db#dc#dd#de#df#dg#dh#di#dj#dk#dl#dm#dn#do#dp#dq#dr#ds#dt#du#dv#dw#dx#dy#dz#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#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#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#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$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)$d*$d+$d,$d-$d.$d/$d0$d1$d2$d3$d4$d5$d6$d7$d8$d9$d:$d;$d<$d=$d>$d?$d@$dA$dB$dC$dD$dE$dF$dG$dH$dI$dJ$dK$dL$dM$dN$dO$dP$dQ$dR$dS$dT$dU$dV$dW$dX$dY$dZ$d[$d\$d]$d^$d_$d`$da$db$dc$dd$de$df$dg$dh$di$dj$dk$dl$dm$dn$do$dp$dq$dr$ds$dt$du$dv$dw$dx$dy$dz$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$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$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$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%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)%d*%d+%d,%d-%d.%d/%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%d:%d;%d<%d=%d>%d?%d@%dA%dB%dC%dD%dE%dF%dG%dH%dI%dJ%dK%dL%dM%dN%dO%dP%dQ%dR%dS%dT%dU%dV%dW%dX%dY%dZ%d[%d\%d]%d^%d_%d`%da%db%dc%dd%de%df%dg%dh%di%dj%dk%dl%dm%dn%do%dp%dq%dr%ds%dt%du%dv%dw%dx%dy%dz%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%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%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%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&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)&d*&d+&d,&d-&d.&d/&d0&d1&d2&d3&d4&d5&d6&d7&d8&d9&d:&d;&d<&d=&d>&d?&d@&dA&dB&dC&dD&dE&dF&dG&dH&dI&dJ&dK&dL&dM&dN&dO&dP&dQ&dR&dS&dT&dU&dV&dW&dX&dY&dZ&d[&d\&d]&d^&d_&d`&da&db&dc&dd&de&df&dg&dh&di&dj&dk&dl&dm&dn&do&dp&dq&dr&ds&dt&du&dv&dw&dx&dy&dz&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&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&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&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'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)'d*'d+'d,'d-'d.'d/'d0'd1'd2'd3'd4'd5'd6'd7'd8'd9'd:'d;'d<'d='d>'d?'d@'dA'dB'dC'dD'dE'dF'dG'dH'dI'dJ'dK'dL'dM'dN'dO'dP'dQ'dR'dS'dT'dU'dV'dW'dX'dY'dZ'd['d\'d]'d^'d_'d`'da'db'dc'dd'de'df'dg'dh'di'dj'dk'dl'dm'dn'do'dp'dq'dr'ds'dt'du'dv'dw'dx'dy'dz'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'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'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'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(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)(d*(d+(d,(d-(d.(d/(d0(d1(d2(d3(d4(d5(d6(d7(d8(d9(d:(d;(d<(d=(d>(d?(d@(dA(dB(dC(dD(dE(dF(dG(dH(dI(dJ(dK(dL(dM(dN(dO(dP(dQ(dR(dS(dT(dU(dV(dW(dX(dY(dZ(d[(d\(d](d^(d_(d`(da(db(dc(dd(de(df(dg(dh(di(dj(dk(dl(dm(dn(do(dp(dq(dr(ds(dt(du(dv(dw(dx(dy(dz(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(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(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(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)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))d*)d+)d,)d-)d.)d/)d0)d1)d2)d3)d4)d5)d6)d7)d8)d9)d:)d;)d<)d=)d>)d?)d@)dA)dB)dC)dD)dE)dF)dG)dH)dI)dJ)dK)dL)dM)dN)dO)dP)dQ)dR)dS)dT)dU)dV)dW)dX)dY)dZ)d[)d\)d])d^)d_)d`)da)db)dc)dd)de)df)dg)dh)di)dj)dk)dl)dm)dn)do)dp)dq)dr)ds)dt)du)dv)dw)dx)dy)dz)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)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)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)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*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)*d**d+*d,*d-*d.*d/*d0*d1*d2*d3*d4*d5*d6*d7*d8*d9*d:*d;*d<*d=*d>*d?*d@*dA*dB*dC*dD*dE*dF*dG*dH*dI*dJ*dK*dL*dM*dN*dO*dP*dQ*dR*dS*dT*dU*dV*dW*dX*dY*dZ*d[*d\*d]*d^*d_*d`*da*db*dc*dd*de*df*dg*dh*di*dj*dk*dl*dm*dn*do*dp*dq*dr*ds*dt*du*dv*dw*dx*dy*dz*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*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*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*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+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)+d*+d++d,+d-+d.+d/+d0+d1+d2+d3+d4+d5+d6+d7+d8+d9+d:+d;+d<+d=+d>+d?+d@+dA+dB+dC+dD+dE+dF+dG+dH+dI+dJ+dK+dL+dM+dN+dO+dP+dQ+dR+dS+dT+dU+dV+dW+dX+dY+dZ+d[+d\+d]+d^+d_+d`+da+db+dc+dd+de+df+dg+dh+di+dj+dk+dl+dm+dn+do+dp+dq+dr+ds+dt+du+dv+dw+dx+dy+dz+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+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+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+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,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),d*,d+,d,,d-,d.,d/,d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d:,d;,d<,d=,d>,d?,d@,dA,dB,dC,dD,dE,dF,dG,dH,dI,dJ,dK,dL,dM,dN,dO,dP,dQ,dR,dS,dT,dU,dV,dW,dX,dY,dZ,d[,d\,d],d^,d_,d`,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,do,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,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,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,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,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-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)-d*-d+-d,-d--d.-d/-d0-d1-d2-d3-d4-d5-d6-d7-d8-d9-d:-d;-d<-d=-d>-d?-d@-dA-dB-dC-dD-dE-dF-dG-dH-dI-dJ-dK-dL-dM-dN-dO-dP-dQ-dR-dS-dT-dU-dV-dW-dX-dY-dZ-d[-d\-d]-d^-d_-d`-da-db-dc-dd-de-df-dg-dh-di-dj-dk-dl-dm-dn-do-dp-dq-dr-ds-dt-du-dv-dw-dx-dy-dz-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-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-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-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.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).d*.d+.d,.d-.d..d/.d0.d1.d2.d3.d4.d5.d6.d7.d8.d9.d:.d;.d<.d=.d>.d?.d@.dA.dB.dC.dD.dE.dF.dG.dH.dI.dJ.dK.dL.dM.dN.dO.dP.dQ.dR.dS.dT.dU.dV.dW.dX.dY.dZ.d[.d\.d].d^.d_.d`.da.db.dc.dd.de.df.dg.dh.di.dj.dk.dl.dm.dn.do.dp.dq.dr.ds.dt.du.dv.dw.dx.dy.dz.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.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.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.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/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)/d*/d+/d,/d-/d./d//d0/d1/d2/d3/d4/d5/d6/d7/d8/d9/d:/d;/d/d?/d@/dA/dB/dC/dD/dE/dF/dG/dH/dI/dJ/dK/dL/dM/dN/dO/dP/dQ/dR/dS/dT/dU/dV/dW/dX/dY/dZ/d[/d\/d]/d^/d_/d`/da/db/dc/dd/de/df/dg/dh/di/dj/dk/dl/dm/dn/do/dp/dq/dr/ds/dt/du/dv/dw/dx/dy/dz/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/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/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/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/d0d0d0d0d0d0d0d0d0d 0d 0d 0d 0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d 0d!0d"0d#0d$0d%0d&0d'0d(0d)0d*0d+0d,0d-0d.0d/0d00d10d20d30d40d50d60d70d80d90d:0d;0d<0d=0d>0d?0d@0dA0dB0dC0dD0dE0dF0dG0dH0dI0dJ0dK0dL0dM0dN0dO0dP0dQ0dR0dS0dT0dU0dV0dW0dX0dY0dZ0d[0d\0d]0d^0d_0d`0da0db0dc0dd0de0df0dg0dh0di0dj0dk0dl0dm0dn0do0dp0dq0dr0ds0dt0du0dv0dw0dx0dy0dz0d{0d|0d}0d~0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1d1d1d1d1d1d1d1d1d 1d 1d 1d 1d 1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d 1d!1d"1d#1d$1d%1d&1d'1d(1d)1d*1d+1d,1d-1d.1d/1d01d11d21d31d41d51d61d71d81d91d:1d;1d<1d=1d>1d?1d@1dA1dB1dC1dD1dE1dF1dG1dH1dI1dJ1dK1dL1dM1dN1dO1dP1dQ1dR1dS1dT1dU1dV1dW1dX1dY1dZ1d[1d\1d]1d^1d_1d`1da1db1dc1dd1de1df1dg1dh1di1dj1dk1dl1dm1dn1do1dp1dq1dr1ds1dt1du1dv1dw1dx1dy1dz1d{1d|1d}1d~1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2d2d2d2d 2d 2d 2d 2d 2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d 2d!2d"2d#2d$2d%2d&2d'2d(2d)2d*2d+2d,2d-2d.2d/2d02d12d22d32d42d52d62d72d82d92d:2d;2d<2d=2d>2d?2d@2dA2dB2dC2dD2dE2dF2dG2dH2dI2dJ2dK2dL2dM2dN2dO2dP2dQ2dR2dS2dT2dU2dV2dW2dX2dY2dZ2d[2d\2d]2d^2d_2d`2da2db2dc2dd2de2df2dg2dh2di2dj2dk2dl2dm2dn2do2dp2dq2dr2ds2dt2du2dv2dw2dx2dy2dz2d{2d|2d}2d~2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3d3d3d3d3d3d3d3d3d 3d 3d 3d 3d 3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d 3d!3d"3d#3d$3d%3d&3d'3d(3d)3d*3d+3d,3d-3d.3d/3d03d13d23d33d43d53d63d73d83d93d:3d;3d<3d=3d>3d?3d@3dA3dB3dC3dD3dE3dF3dG3dH3dI3dJ3dK3dL3dM3dN3dO3dP3dQ3dR3dS3dT3dU3dV3dW3dX3dY3dZ3d[3d\3d]3d^3d_3d`3da3db3dc3dd3de3df3dg3dh3di3dj3dk3dl3dm3dn3do3dp3dq3dr3ds3dt3du3dv3dw3dx3dy3dz3d{3d|3d}3d~3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4d4d4d4d4d4d4d4d4d 4d 4d 4d 4d 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d 4d!4d"4d#4d$4d%4d&4d'4d(4d)4d*4d+4d,4d-4d.4d/4d04d14d24d34d44d54d64d74d84d94d:4d;4d<4d=4d>4d?4d@4dA4dB4dC4dD4dE4dF4dG4dH4dI4dJ4dK4dL4dM4dN4dO4dP4dQ4dR4dS4dT4dU4dV4dW4dX4dY4dZ4d[4d\4d]4d^4d_4d`4da4db4dc4dd4de4df4dg4dh4di4dj4dk4dl4dm4dn4do4dp4dq4dr4ds4dt4du4dv4dw4dx4dy4dz4d{4d|4d}4d~4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d5d5d5d5d5d5d5d5d5d 5d 5d 5d 5d 5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d 5d!5d"5d#5d$5d%5d&5d'5d(5d)5d*5d+5d,5d-5d.5d/5d05d15d25d35d45d55d65d75d85d95d:5d;5d<5d=5d>5d?5d@5dA5dB5dC5dD5dE5dF5dG5dH5dI5dJ5dK5dL5dM5dN5dO5dP5dQ5dR5dS5dT5dU5dV5dW5dX5dY5dZ5d[5d\5d]5d^5d_5d`5da5db5dc5dd5de5df5dg5dh5di5dj5dk5dl5dm5dn5do5dp5dq5dr5ds5dt5du5dv5dw5dx5dy5dz5d{5d|5d}5d~5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d6d6d6d6d6d6d6d6d6d 6d 6d 6d 6d 6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d 6d!6d"6d#6d$6d%6d&6d'6d(6d)6d*6d+6d,6d-6d.6d/6d06d16d26d36d46d56d66d76d86d96d:6d;6d<6d=6d>6d?6d@6dA6dB6dC6dD6dE6dF6dG6dH6dI6dJ6dK6dL6dM6dN6dO6dP6dQ6dR6dS6dT6dU6dV6dW6dX6dY6dZ6d[6d\6d]6d^6d_6d`6da6db6dc6dd6de6df6dg6dh6di6dj6dk6dl6dm6dn6do6dp6dq6dr6ds6dt6du6dv6dw6dx6dy6dz6d{6d|6d}6d~6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6f6Zd6S(6g?iii iiiii iRiiiiiaii inii!i iiLi,iBii iiiiii{ i] iii ijiii.iNiiiiii:iiii?iii=iNiKiiikiq iii i ii ibii iiii ioi2 iiiii ici8iiiiiiiii{i|ii i"i i i@i\ii iiiiiiiFii| iQiHiiiPivii iiiiDi^ iiiFi} iiEi iOii0iisii4i<i2i ii&iMiii~ iiiGiii[ iii?ii iaiiK i*iigi iZi i:ii iiKi ii iiiiii`iliii ii i iqii~iii i ii iiiciiuiii*iii i ii~imiiiieiiGi^iinii iUiCiiCiiiiiii ijioi/iiiPi7 i[iii i? iiiioiSi(ii iipi]ii6iji i@ iiiiii8ii+i3 i[iii\iiiiii] iA iii i1iiiHi i idiii+i i2iiii iOiL iiifi1iiiiiiii3i9iili,ii iiiiiii ieiz iQiMi&i iXiiiiii iiiikipiiMiii i%ii iiiii'i ii\ i ii7iiJii!iiiiiiNiiB iPi_ iqiii iii i ii ii i iIii8 ii ii{ ii i iiiimiiifiiixii iii ii iigiii iiiiiiii&ii'iiiiii.ii iiiM iiiii$i#iiDihiAi iiiriiiUiGiiii i iQiSiiiiidi i0iFiiiC iiiii iiJii iUiiiiN i iii<ii i:iA i ii i i9ii}ii iiiWiPi ii)iDiiii4 i i i)iiir iisiiitii9 iiiis i*iiiiiii] iiiii iD iji( i iii iiui5iYiji iliiuiii iii` i i=i iiiiiii5ii!iiiTiE ixiiieii iiO iPii| i6iAi i/iki i iili!i iiBii`ii i iiAii iiii ivi i iiwiiiiMi iiiiiia iii i} iixi,i}ii iB iiiiiiiiiF ikimi ii ii ii iibii) i^ iP i i,ii ii7i5 i~ iyi|i iziiii iC i{iiiiiiiiii1iibii i iiit ii ii_ iiiiii i i ib iiii5iDiiilii|i[i* iii ii%iiG i^ iiliii ii` iii ipiiinicigimiii'i2iiii{ii ii iiiD iifi ii|i: iiiii i i i i ii inii iii;iiIiYi}ii iXi"ii iiiiiii-iiliiiiiiiiiEii~ii>i]ii,iiiiviLiBiii&iii iiiiGiiiiBii i+ iii iiiii i iaiiii ia ii}iE iiDii=ii0i ii i6 iiiivi!iiiiiiiii9iHiiiii iFiiiiii"iiH iii i ioiiiRi*ii.iiiiiiI i3ii, ii*iSiiiiXiii/iibipii iiiiiiiRii ii7 ii2ii iiiiiii_ iib ii iiii iiiiiii` iOii i i`i7i i iiiiiiia iiiiiiigiii ii i_ii~iiiiii iaii ib iiiii iii i;ii i-i iiQ iiiiqiiiii`ii#i#iiiiiri isiiiiditi iic ii ikiwi ii iiiiiiiigi iQiiUi i iiiiiCiSiic iii5iiiBii_i iciNiiiYiiii iiLidi i i iKi i8 iaiGiii i iiisi6i iti; iNiii i i4ii:ii\iqiiii.iii iui iiii i ii iriii i iic iiii@iii ii ii ii/i9 ii iiiiiii i< id iiii8iviiCiii iimii iiiiiiZiiiiiwi i{iiiii$iiiMid i0irii iigiiViiiii: iZiii{i$ie i0iii$i i i ii5ii[iiviiiciiViR i$i; iiiif iii idiiiWie iii iii i iiJ iiiiiuii ii ii i iK ii2iiL i i.iii2ii iiiiii%i iii i iiiiiiii i ixi iM ii}iiiTiiiid i iiiii`iiiii i3iii;i iiiiyiYiLiii i iiiiiUi\iiiiiiViN iii iii ii"ixi%ii;i= i iii2iEii!iiii^ii"iwi i#iiii ii$i<iQiiiri%ii]ii&ii< i'i i3i6iBii i(iii ii i iig i i i)i i i*i+i! iiiii:ii7ii^ii iii(i i,i+i i ixi-ii/ihi= i.iiiiiVi ii ihii i/iiiii<iii;i0iiii i i1izi i ii5i6i i_i)i2i3ii4iyi" iii ii^i5i i i?i%i+if i i6i_iWiii i7i> ii ig i# iiu i8i ii9ih iF iiVi{i iO iiIiwi~i i^iii:iiiiiiii i;iei1iiiiiiiii i i iiP i<i=ii>i ii(i`iRi? iYiiIi iii i7i i i?iii i@iioiiqiYiniiiliiii ii ii iEiPiVii! i iiiiiniiAii|i ii iBiiiiii- i iOi i iCiiDiWiTiTiiiii i}iEii&i i iiiiii iii~iG i iii$ iWiiiioii iFiiGiii" iiii# iiiDi-iQ iiHiei i iiIi iiiJizi iiKiiiLii$ i iiiiiH iiiiiiiMi:i iiiNiiI i iiiHiiiiiOiii iPiQiiikiRiR i iii i i ii iiiiiiSiTiii i% iiiiii& iS iUi iiS iiCiiiiVi~ii!iXiiiiii,iiiiiOii|iiiiPiie iiii i i iiiiiiiiT iiiiiWiiiiXiiYiiRi iviii ii i=i iiZiiU iii[i iiiV i% i\iii]iii^i8iT i. i' i_iiviiiiiwitii`iaibi> iii"i{ii i iiciidi9iiiii[i9iiidih i ieiii iJ i!iiifiiii iiiTigiii i%iiWiMihiiiiiiiiiiiiii( ij iiyi7imiijiki i? iW i"iiii iBiili|i ii) iziii iii iiiiimiiniuiv iwii i* iiioipiiiqi7i.irii i iii iifii i isi& iyi ii i iiiii i i>iiii iiYi iitiiui/ i+ i ivi ii i@ iwii i iii3iiii, ixi i6i9i i iii6i iii! iiiyiiQi:ici iii- ioiiiFiX i i iifi iizi iii iii{i/iii' i ibiii`iiiiui iviiiii i i iiii i0iEiiSii8i[i|i}iGii ii!i~iiiFiU ii ii iieisiii iw iiii" i iai iZi&iiiii i iiiiAiii iiii iiiiiiiii ioii ii i i ii iiA i iJi0i ix i ii iiY iiiiii i i iiZ i8ioiiiQiiiii iiiaiQiiipi;iiiPiibiiiii i ii iiii iii iiiiiiiii]iiiii iiiiii'iii. i ii iiiii iLiiiiii ii/ iiiiiB i0 i[ ii8iiiii iii/i3iiiii iiii0i iniiiiiiiii i iiiiiiiii4iiiii<i ii iiiYi iiiiC iiii iiiii}i1ii iiiiKii ii0 iFiiii ii#ii\iiiifi i>i iii iiiiii i iiiiijiiiiii-ipi9i@ i6iyiiii i i1 iiiiiiiiViiiii4iii iKi1 ii iD i iiiiii#iiii i2 iiii iZiHipiiigiii i iqiri iiiiii i iK iV i i\ i,i ii iiii]iiiuii iiiiiiiiiZiii iiiiijiii0ihihiii ii iE iii iii iiiiiiiiiii iiii2 iiiiiiiMiiwiii iy i?iiii itimi( i ii+iiiiiiiiii i ii i iii iiL iii) i ii iiif ii iiiiiiiRi"iA i3 i ii-i1ii$i i(ii] i i# ii$ i iiii i* iiii i ii i i=ik ii!ii iiii i ii ii_iiiii^ i2ii iiii9iii iiii4 i iii iibiiii ii iii5ii iii"i i iiiiii4iIi ii#ii iiiiiiij iiii$ik i ii ii\i igiiEi5 iiiiiiiii iii6 iiii ii%iii ii i[i iiiiii i&ieiii iiioi iil i i}iiiizii+ iii iiiini-ii i'iiii iiii(iii iiiiiiii ii iiiBiiiqiiii<ii*iji)i"i*ii>i)i7 ii+iiiiiiiizii,iiiiiM i)iriii-i i iiiiiiTiipiii#i#iiiiiiii iiii i ii iiSii.i8 iiiiiz i9 i=iiiim iiSiiiiiixiii/iiiqiii3ii5ii: i i ii iiiiii i; i i0i1iiiiiin ii_ ii]i i iniiiii i% iiiii i` iiiiiziTisi2i3 ii i{ ii5iiii ig iiikiiiii iii3i4ii iici iii i iiiai:i1i iii!iAihi io i i6i"iii il i-ii ia i5ii ii i ii#i! ii$ii ii4 ifii i%i& i iN i iiWiiiiii i' ii$iii< i iNiiiW ikiiO iiiiiiiX i, ii6i&itiiP ii i7i i i i- ijii i iiCi[ip ii i'i8i ib iim i i ii{i(i i ii i9i i i i:i i i^iiiiB i;iiiiii iii ii ii)i<i=i ii ii>iiiii i=iiiiiiiiiiin iiHiDi i?iiUiWi i= ii:ii iNi iKiEi@i4ic i ii> iiQ i iAiiihiii i i( i]iiiiBi*iiiliiCiDiiEih iiiiiiiXiiiii+iiii+iJiiiUiii iimi iEiiiiFiiGi iki inii id iiiiiiiiF i!i iiri@iiHi"iCiGiiii ii^i ii i8iti) i;i i? i!iioiIi i"i#i#i$iiJi i%i i&iriKi'i5 i(i)iio i@ i}iA ii,ii*i4i1i+ii i i ii" ii,ii iC iiuiriD i-i i-i iLivi{ii| iMi.i.iNiY i6 iii i/i0i/i ii1i$ii2i%iGiRiB i i_iiiC ii iD ii3iiiii ii i. ii i4i@iwii5ii6i7iii ii&i0ii8i i&i i* ii+ iG iOiuii# i i1iPiRiiQii ii)iii=i9iili iiiiE iSiiki i\i iii iyi:i i;i<iF i%i=iiRiii>idi'i, i?iei$ ii2i3i- ii i4ii(iSi@iAiBii.iTiiOi i iiiii i&i iii i<i iiiiCiiDi iiUiip iG ie i i i ii iEi;iViFi'iGi)i ii} iHi*iiWiiiIiiTii i iiiiii iiJi. igi~iiUiij i iiiXiii8ii*i iiiKi~ iii iLiiH i iii% ii+if iii iitiiMiNiii ii ii iiik iYiiYiiii*i/ iiOiR iZiH ii#iI i i iii5iS i]iE i[i\i isiI i+iPiQi,i i iRiiSiTii,iiUi]iVi iiLi-i!i iT i\i4iWi iiXiYiZii[i>iwiiiii+i^iiJ ii_i$ii\iiiili.i]i`ii^i_iq i%ii`iaiiii i6ig iU ibicidiai iq ixi iei ibiyi ifihigihiii'iii iii ijir ii i0 i i=iibi|iiiiii i iih iki iliii iaiicimiii ini iiui iidieiis iK i/ioi7ii& i iJ i8ipiqii ij ifii igi iii(ii`irisi i iii<iFik ifiiiii]iiiIiti>iiuiivii iii i0ii-iiwiL ii iiiiiGiaii it i ii iSiKixiiyiziiiV iiiOii1 ii i{i i iiF iyii9iZ ii|i}i~iFi iii i i:iiiii2 iiiipii;iG iii ihiiiii7 iiiiiqiiiM iiiiiii iii iii i(i8 iiN i ii3 i iiO i<iiiiTiiW i iiiii(iiii1iiiiiiiiu iZii i iciijiP ipiii iiii iv iiijii iiii iQ iK i ii i' iiiiii9 iii i izii i iiikiiiii ii2i iiliii>i=iCi'iii>i iiZiiii imini iibiii i iqi?ii ii ii i"ii i?i i}iiioi@i>iiAi i1ii)iiii?i i iiiixi ii ii i3i i ihii il iiii)ii ipii'iiii4ii i i iiiiAi_i iBiiL ii iPiqii iiriiiiiX iicisi! iiiiHii iw iiiiCiDitiiiiiiix i ii i/ iiii5i i4 iuiir iii_iii/i i<ii~i7iy im iii^i5 in ibi itiiil iiii6ii i7iiiiiiiviiii i8i: ii ii0 i i1 iiwiiIiiiii i( iiiBi ii4isi iiiii i iii?iCiixi iEiHi iiFiyiziGiiiii{iiii|ii; i}i9imiH i~iiz iiis i iiM iiii iiim iiiIiiiio iiiiiiii_iiii i2 i3 iHii*iii iiii< iiii:ii ii iiAii iiR iiiii i ii" ii iiiiii ii iii iiiQi i iY iiiiiiii{iKii ii[i iJiiiN iiS iiiiiI iiiT i@ii iii i i@iiRiii it iiiiJiIii iiiii iU iimiiii{ i ii i i;iV iii iii<iii idiiiiXiii9iii6 iiiUiiii iiLi!i= ii) ii i i iii i iii ii=i$i(iviii&iicii iii i ii>iiii{i"iiiii#iiiiiW ii iiii ii$i i%iiiiii&i^iii[ i ii'iiiiiiii(i iii2i\ iJi ip ipin iiu iq i)ii iO i> ii i*iX iii i+ii i,i iii iiiiiKii i iiIi-iii!iiiiii.iDiiiJisi# iii ii7 iiii/iwii|iiiiii"i4 i| i,iiiii iiiiiiiii?iY iP i0ii1iZ iZ i ii i ii i#i@i2ii|iiziiiiiAi'ii? ii ii8 ii iyiiLiVi i3i i i i$iiiiMii%ii i i i i i.ii4iNiii ii i i iiii i5i9 i%iiiiKiQ iiixi6i7iiBi i iOiv i[ iii&ii ii iiiXii* ii\ iPi i iNi+ iw iiiiiWiCi ii iQiDi i?i] iiii^ io iR i i iEii iiFi i'iiXiiGiiS i iiT iRii8ixi ikiSiiTiii ii iiDii9i!iiiii(iiLi"i#i$i%i_ ii&iJi:iUii}i i)ii i;i<i iEi+i'i iiHi=iVi*iHiyi, i+iWi3i>i ii?i(iIi,i-i` iqiia i iii ii)i*iXi i+iiOiiYi,i-ii.ii/i ii0i.iiii1i iJir i2i3i$ i i4ii5i6i7i iib i iii} i ifiiKii i i i i8iZi9ii: ii ic ii:ii i;is iJ i@ii it i; i i/i<id ii iiiU ii0iie i=iif iu iMiiiii i>i i[iiAiLiiii?i i i i i@iAiv iBiCi\iijii[ i ig iDiEiiiFi iBiiGi iiHii(iiMiCih iiIiNiJi iKiLiiiMii1i2iNiiidiOidiV iDi`ii#i5 iPi]iQiEini i iii^iRi_iFiSip ii iiTiUii i iVii i iiGiiiieiHiOi iiPi`iWiw ij iXi ii3i iaiiIiYiJix i7iiii- i i4ik iibiZi-iii. icii[i iri;i iKi5iLiXii i iii\i]iii6i% i^i_iii~i`il iy iaizi~ iiibi?iici7idi iiieiiz iiiMifigi/ ihi|ii@idiiiiiNiiii8ifiiijikiiOiPiiilimi@ini9i ioi i iii< isii\ iQi.iRiNi@i iipiiSi{ iqiiAii iiiiTi iiii:iiiri isi@ iW i;itiui iviwixiyi| iiiiizi i i3iQiiimiiAi{i|ii ii}iOiRi iigiii~iZi iiiiii i\im ii} ii<iX ii ii i iiii iiY iiii0 iiii i=i iiiiLiiiiihiiiiii>i>ii/i?iUiiiiiiei)ix itiifiSii iy i in i i iiTi i@ii i iiiiiiii ii iziUigiiViio iii6 ip itiiiiiii iAiiJiVihiZ i iiWiiiii iMiii iii iiBiieiCi iijii i iiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiViPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i iq i i i iiiiiiiiiiiiiXiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6ii7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMikiliNiOiPiQi iYiRiSiTiUiZiViWiXiYiZi[i\i]i^i_i`iiaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiimiiiiiiiiiiiiiiiiiiiini iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiiiii iiiiiiiiiioi iiiiiiiiEiiiiiiiiiiiiiiiiiii i i i i iiiFiiipiiiiiiiiiGiiii~ iiiiii i!i"i#i$i%i&i'i(i)ii*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNi[iOiPiQiRiSiTiUiViWiXiYi\iZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}iHi~iir iiiiiiiiiIiiiiiiiiiiiiiiiiiiiiiiiii]iii^iiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiqiiiiiiiiiiiiiiiiiiiiiiii iiiiii_iiiiiiiiiiiiiiiiiiiiiiiJiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiii iiiiiii`iii i!i"iai#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiWiSiTiUiViiWiXiYiZi i[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviiwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiibiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiKiLiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiXiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiidii ii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2ii3i4i5i= i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNi iOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaiibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}iii~iiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiieiiiiiiiiiiiiiiiiiii i i i i iiiiis iiiiiifiiiiiiiiii i!i i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3iri4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFi> iGiHiiIiJiKiiLiMiNiOiPiNiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiit iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiOiiiiiiiiiiii& iiiiiiiiigiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-ii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<ii=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiPiQiRiSiTiUiViWiiXiYiZi[i\i]i^i_i`iaibicidiihieifigihiiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiQiiiiiiiiiiiiiiiiiiiiiiRiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiSiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iu iA iB iC iD iE iF ijiG iH iI iJ iK iL iM iN iO iP ikiQ iR iS iT i iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ilib ic id ie if ig ih ii ij ik il im in io ip iq ir is iit iu iv iw ix i iy iz i{ i| i} i~ i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i iimi i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i ini i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!iTi!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iiu!iv!iw!ix!iy!iz!i{!i|!i}!i i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!ii!i!i!i!i!i!i!i!i ii!i!i!i!i!i!i!i!iti!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i1 i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!ioi!i!i!i i i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!ipi!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"ii"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"iUi"i"i "i!"i""i#"i$"i%"i&"i'"i("i)"i*"i+"i,"i-"i."i/"i0"i1"i2"i3"i4"i5"i6"i7"i8"i9"i:"i;"i i<"i="i>"i?"i@"iA"iB"iC"iD"iE"iF"iG"iH"iI"iJ"iK"iL"iM"iN"iO"iP"iQ"iR"iS"iT"iiU"iiV"iW"iX"iiY"iZ"i["i\"i]"i^"i_"i`"ia"iib"ic"id"ie"if"ig"ih"ii"ij"ik"il"im"in"io"iuip"iq"ir"is"it"iu"iv"iw"ix"iy"iz"i{"i|"i}"i~"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"ii"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"iqi"i"i"i"i"i"i"i"ii"i"i"i"i"i"i"i"i"i"i"ii"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i#i#i#i#i#i#ii#i#i#i #i #i #i #i #i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i #ii!#i"#i##i$#i%#i&#i'#i(#i)#i*#i+#i,#i-#i.#i/#i0#i1#i2#i3#i4#i5#i6#i7#i8#i9#i:#i;#i<#i=#iVi>#i?#i@#iA#iB#iC#iD#iE#iF#iG#iH#iI#iJ#iK#iL#iM#iN#iO#iP#iQ#iR#iS#iT#iU#iV#iW#iX#iY#iZ#i[#i\#i]#i^#i_#i`#ia#ib#ic#id#ie#if#ig#iih#ii#ij#ik#il#im#iin#io#ip#iq#ir#is#it#iu#iv#iw#ix#iy#iz#i{#i|#i}#i~#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#ivi#i#i#i#i#i#i#i#i#i#ii#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#ii#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#ii#i#i#i#i#i#i#i#i#i#i#i#i$i$i$i$i$i$i$iri$i$i $i $i $i $i $i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$ii$i$i $i!$i"$i#$i$$i%$i&$i'$i($i)$ii*$i+$i,$i-$iii.$i/$i0$i1$i2$i3$i4$i5$i6$i7$i8$i9$isi:$i;$i<$i=$i>$i?$i@$iA$iB$iC$iD$iE$iYiF$iG$iH$iI$iJ$iK$iL$iM$iN$iO$iP$iQ$iR$iS$iT$iU$iV$iW$iX$iY$iZ$i[$i\$i]$i^$i_$i`$ia$ib$ic$id$ie$if$ig$ih$ii$ij$iik$il$im$in$io$ip$iq$ir$is$it$iu$iv$iw$ix$iy$iz$i{$i|$i}$i~$i$i$i$i$i$iti$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i i$iui$i$i$i$i$i!i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$ivi$i i$i$iZi i$i$i$i$i$i$i$i$i$i$i$i$i"i$i$i$i$i$i$i$i$iwi$i$i$i$i$i$i$iwi$i$i$i$i$i$i$i$i$i$i$i$i$i$i i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i%i#i%i%i%i%i%i$i%i%i%i %i %i %i %i %i%i%i%i i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i %i!%i"%i#%i$%i%%i&%i'%i(%i)%i*%i+%i,%i-%i.%i/%i0%i%i1%i2%i3%i4%i5%i6%i&i7%i8%i9%i:%i;%i<%i=%i>%i?%i@%iA%iB%iC%iD%iE%iF%iG%iH%iI%iJ%iK%iL%iM%iN%iO%iP%iQ%iR%iS%iT%iU%iV%iW%iX%iY%iZ%i[%i\%i]%i^%i_%i`%ia%ib%ic%id%ie%if%ig%ih%ii%ij%ik%il%im%in%io%ip%iiq%ir%is%it%iu%iv%iw%ix%iy%iz%i{%i|%i}%i~%i%i%i%i%i'i%i%i%i%i%i(i%i%i%i%i%i%i%i)i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i*i%i%i%i%i%i%i%i%i%i%i%i+i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%iWi%i%i%i%i%i,i%i%i%i%i-i%i%i%i%i%i%i%i%i%i.i%i%i%i[i%i%i%i i%i%i%i%i%i%i%i%i%i/i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i&i&i&i&i&i&i&i&i0i&i &i &i &i &i1i &i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i2i&i &i!&i"&i#&i$&i%&i&&i'&i(&i)&i*&i+&i,&i-&i.&i/&i0&i1&i2&i3&i4&i5&i6&i3i7&i8&i9&i:&i;&i<&i=&i>&i?&i@&iA&i4iB&iC&iD&iE&iF&iG&iH&iI&iJ&iK&iL&iM&iN&iO&iP&iQ&iR&iS&iT&iU&iV&iW&iX&iY&iZ&i[&i\&i]&i^&i_&i`&ia&ib&ic&id&ie&if&ig&ih&ii&ij&ik&il&im&in&io&ip&iq&ir&is&it&iu&iv&iw&ix&iy&iz&i{&i|&i}&i~&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i5i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&ixi&i&i&i&i&ii&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i6i&i&i&i7i&i&i&i&iXi&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i8i&i&i&i&i&i&i&i&i&iYi&i&i&i&i&i&i&i&i&i&i9i&i&i&iyi&i&i&i&i&i&i&i&i&izi&i&i&i&i&i&i'i'i'i'i'i'i'i'i'i 'i 'i 'i 'i 'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i 'i!'i"'i#'i$'i%'i:i&'i;i''i('i)'i*'i+'i,'i-'i.'i/'i0'i1'i2'i3'i4'i5'i6'i7'i8'i9'i:'i;'i<'i='i>'i?'i@'i<iA'iB'iC'iD'iE'iF'iG'iH'iI'iJ'iK'iL'iM'iN'iO'iP'iQ'iR'iS'iT'iU'iV'iW'iX'iY'iZ'i['i\'i]'i^'i_'i`'ia'ib'ic'id'ie'if'ig'i{ih'ii'ij'ik'il'im'in'io'ip'iq'i|ir'is'it'iu'iv'iw'ix'iy'iz'i{'i|'i}'i~'i'i~i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'iiZi=i'i'i'i'i'i'i'i}i[i'i'i'i'i'i'i\i'i'i'i'i'i'i'i'i>i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i i'i'i'i'i'i'i'i'i~i'i'i'i'ii'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i?i'i'i'i'i'i(i(i(i(i(i(i(i(i(i (i (i (i (i (i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i (i!(ii@iAi"(i#(i$(i%(i&(i'(i((i)(i*(i+(i,(i-(i.(i/(i0(i1(i2(i3(i4(i5(i6(i7(i8(i9(i:(i;(i<(i=(i>(i?(i@(iA(iB(iC(iD(iE(iF(iG(iH(iI(iJ(iK(iL(iM(iN(iO(iP(iQ(iR(iS(iT(iU(iV(iW(iX(iY(iZ(i[(i\(i](i^(iBi_(i`(ia(ib(ic(id(ie(if(iCig(ih(ii(ij(ik(il(im(in(io(ip(iq(ir(is(i it(i iu(iv(iw(ix(i]iy(iz(i{(i|(i}(i~(i(i(i(i(i(i(i(i(i(iDi(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(iEi(i(i(iFi(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(iv i(i(i(i(i(i(i(i(i(i(i(iGi(i(i(i(i(i(i(iHi(i(i(i(i(i(i(i(i(i(i(i(i(iIi(i(i(i(ii(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i)i)i)i)i)i)i)i)i)i )iJi )i )i )i )i)i i)i)i)i)i)i)iw i)i)i)i)i)i)i)i)i)i)i)i )i!)i")i#)i$)i%)i&)i')i()i))i*)i+)i,)i-)i.)i/)ii0)iKi1)i2)i3)i4)i5)i6)i7)i8)i9)i:)i;)i<)i=)i>)i?)i@)iA)iB)iC)iD)iE)iF)iG)i\iiH)iI)iJ)iK)iL)ix iM)iN)iO)iP)iQ)iR)iS)iT)iU)iV)iW)iX)iY)iZ)i[)i\)i])i^)i_)i`)ia)ib)ic)id)ie)if)ig)ih)ii)ij)ik)il)im)in)io)ip)iq)ir)is)it)iu)iv)iw)ix)iy)iz)i{)i|)i})i~)i)i)i)i)i)ii)i)i)i)i)iLi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)iMi)i)i)i' i)i)i)i)i)i)i)i i)i)i)i)i)i)i)i)i)i)i)i)i)i)iNi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)ii)i)i)i)i)i)i)iOi)i]i)i)i)i)i)i)i)iPi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)iQi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i*i*i*i*i*i*i*i*i*i *iRi *i *i *i *i*i*iSiTi*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i *i!*i"*i#*i$*i%*i&*i'*i(*i)*i**i+*i,*i-*i.*i/*i0*i1*i2*i3*i4*i5*i6*i7*i8*i9*i:*i;*i<*i=*i>*i?*i@*iA*iB*iC*iD*iE*iF*iG*iH*iI*iJ*iK*iL*iM*iN*iO*iP*iQ*iR*iS*iT*iU*iV*iW*iX*iY*iZ*i[*i\*i]*i^*i_*i`*ia*ib*ic*id*ie*if*ig*ih*ii*ij*ik*il*im*in*io*ip*iq*ir*is*it*iu*iv*iw*ix*iy*iz*i{*i|*i}*i~*ii*i*i*i*i*i*i*iUi*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*ii*i*i*i*i*i*i*i*i*i*i*i*i*iVi*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*ii*i*i*i*i*i*i*i*i*i*i^i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*ixi*i+i+i+i+i+i+i+i+i+i +i +i +i +i +i+i+i+i+i+i+i+i+i+i+i+iWi+i+i+i+i+i+i+i +i!+i"+i#+i$+i%+i&+i'+ii(+i)+i*+i++iXi,+i-+i.+i/+i0+i1+i2+iYi3+i4+i5+i6+i7+i8+i9+i:+i;+i<+i=+i>+i?+iZi@+iA+iB+iC+iD+iE+iF+iG+iH+iI+iJ+iK+iL+iM+iN+iO+iP+iQ+iR+iS+iT+iU+iV+iW+iX+iY+iZ+i[+i\+i]+i^+i_+i`+ia+ib+ic+id+ie+if+ig+ih+ii+ij+ik+iil+im+in+io+ip+iq+ir+is+it+iu+iv+iw+ix+iy+iz+i{+i|+i}+i~+i[i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i\i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i]i+i+i+i+i+i+i^i+i+i+i+i+i+i+i+i+i+i+i+i+i+i^i+i+i+i+i+i+i_i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i_i+i+i+i+i+i+i+i+i+i+i+i+i,i,i,i,i,i,i,i,i,i ,i ,i ,i ,i ,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i ,i!,i",i#,i$,i%,i&,i',i(,i),i*,i+,i,,i-,i.,i/,i0,i1,i2,i_i3,i4,i5,i6,ii7,i8,i9,i:,i;,i<,i=,i>,i?,i@,iA,iB,iC,iD,iE,iF,iG,iH,iI,iJ,iK,iL,iM,iN,iO,iP,iQ,iR,iS,i`iT,iU,iV,iW,iX,iY,iZ,i[,i\,i],i^,i_,i`,ia,ib,ic,id,ie,if,ig,ih,ii,ij,ik,il,im,in,io,ip,iq,iyiair,is,it,iu,iv,iw,ix,iy,iz,i{,i|,i},i~,i,i,i,i,i,i,i,i`i,i,i,i,i,i,i,i,i,i,i,i,i,i,ibi,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,ici,i,ii,i,i,i,idi,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,iei,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i-i-i-i-i-i-i-i-i-i -izi -i -i -i -i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i -i!-i"-i#-i$-i%-i&-i'-i(-i)-i*-i+-i,-iaibi--i.-i/-i0-i1-i2-i3-i4-i5-i6-i7-i8-i9-i:-i;-i<-i=-i>-i?-i@-iA-iB-iC-iD-iE-iF-iG-ificiH-iI-iJ-iK-iL-iM-iN-iO-iP-iQ-iR-iS-iT-i iU-iV-iW-iX-iY-iZ-igi[-i\-i]-i^-i_-i`-ia-ib-ic-id-ie-if-ig-ih-ii-ij-ik-il-im-in-io-ip-iq-ir-is-it-iu-iv-iw-ix-iy-iz-i{-i|-i}-i~-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-ihi-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-ii-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i i-i-i-i-i-i-i-i-i-i-i-i-iii-i-i-i-i-i-i-i-i-i-ii-i-i-i-i-i-i-i-i-i-i-i-iji-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i.i.i.i.i.i.i.i.i.i .i .i .i .i .i.iki.i.i.i.i.i.i.ili.i.i.i.i.i.i.i.i.i.i .i!.i".imi#.i$.i%.i&.i'.i(.i).i*.i+.i,.i-.i..i/.i0.i1.i2.i3.i4.i5.i6.i7.i8.i9.i:.i`ii;.i<.ini=.i>.i?.i@.iA.iB.iC.iD.iE.iF.iG.iH.iI.iJ.iK.iL.iM.iN.iO.iP.iQ.iR.iS.iT.iU.iV.iW.iX.iY.iZ.i[.i\.i].i^.i_.i`.ia.ib.ic.id.ie.if.ig.ih.ii.ij.ik.il.iim.in.io.ip.iq.ir.is.it.iu.iv.iw.ix.iy.iz.i{.i|.i}.i~.i.i.i.i.i.i.i.i.i.i.i.i.i.ioi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.ipi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.idi.i.i.i.i.iqi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i/i/i/i/i/i/i/i/i/i /i /i /i /i /i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/iri/i/i /i!/i"/i#/i$/i%/i&/i'/i(/i)/i*/i+/i,/i-/i./i//i0/i1/i2/i3/i4/i5/i6/i7/i8/i9/i:/i;/i/i?/i@/iA/iB/iC/iD/iE/iF/iG/iH/iI/iJ/iK/iL/iM/iN/iO/iP/iQ/iR/iS/iT/iU/iV/iW/iX/iY/iZ/i[/isi\/i]/i^/i_/i`/ieia/ib/ic/id/ie/if/ig/ih/ii/ij/ik/il/im/in/io/ip/iq/ir/is/it/iu/iv/iw/ix/iy/iz/iti{/i|/i}/i~/i/i/ii/i/i/i/ii/i/i/i/i/ii/i/ii/i/i/i/i/ii/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/iui/i/i/i/i/i/i/i/i/i/i/i/i/i/ivi/i/i/i/i/i/i/i/i/i/iwi/i/i/i/ixi/i/i/i/i/i/i/i/i/i/i/i/i/i/i/iyi/ii/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/izi0i0i0i0i0i0i0i0i0i i 0i 0i 0i 0i 0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i{i 0i!0i"0i#0i$0i%0i&0i'0i(0i)0i*0i+0i,0i{i-0i.0i/0i00i10i20i30i40i50i60i70i80i90i:0i;0i<0i=0i>0i?0i@0iA0iB0iC0iD0iE0iF0iG0i|iH0iI0iJ0iK0iL0iM0iN0iO0iP0iQ0iR0i}iS0iT0iU0iV0iW0iX0iY0iZ0i[0i\0i]0i^0i_0i`0ia0ib0ic0id0ie0if0ig0ih0ii0ij0ik0il0im0in0io0ip0iq0ir0is0it0iu0iv0iw0ix0i|iy0iz0i{0i|0i}0i~0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i}i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i~i0i0i0i0i0i0i0i0i0ii0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i1i1i1i1i1i1i1i1ii1i 1i 1i 1i 1i 1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i 1i!1i"1i i#1i$1i%1i&1i'1i~i(1i)1i*1i+1i,1i-1i.1i/1i01i11i21i31i41i51i61i71i81i91i:1i;1i<1i=1i>1i?1i@1iA1iB1iC1iD1iE1iF1iG1iH1iI1iJ1iK1iL1iM1iN1iO1iP1iQ1iR1iS1iT1iU1iV1iW1iX1iY1iZ1i[1i\1i]1i^1i_1i`1ia1ib1ic1id1ie1if1iig1ih1ii1ij1ik1il1im1in1io1ip1iq1ir1is1it1iu1iv1iw1ix1iy1iz1i{1i|1i}1i~1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1ii1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1iii1i1i1i1i1i1i1i1ii1i1i1i1i1i1i1i1i1i1i1i1i1i2i2i2i2i2i2i2i2i2i 2i 2i 2i 2i 2i2i2i2i2i2i2i2i2i2i2i2i2i2ifii2i2i2i2i2i 2i!2i"2i#2i$2i%2i&2i'2i(2i)2i*2i+2i,2i-2i.2i/2i02i12i22i32i42i52i62i72i82i92i:2i;2i<2i=2igi>2i?2i@2iA2iB2iC2iD2iE2iF2iG2iH2iI2iJ2iK2iL2iM2iN2iO2iP2iQ2iR2iS2iT2iU2iV2iW2iiX2iY2iZ2i[2i\2i]2i^2i_2i`2ia2ib2ic2id2ie2if2ig2ih2ii2ij2ik2il2im2in2io2ip2iiq2ir2is2it2iu2iv2iw2ix2iy2iz2i{2i|2i}2i~2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2ii2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2ii2ii2i2i2i2i2ii2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2iy i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i3i3i3i3i3i3i3i3i3i 3i 3i 3i 3i 3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i 3i!3i"3i#3i$3i%3i&3i'3i(3i)3i*3i+3i,3i-3i.3i/3i03i13i23i33i43i53i63i73i83i93i:3i;3i<3i=3i>3ii?3ii@3iA3iB3iC3iD3iE3iF3iG3iiH3iI3iJ3iK3iL3iM3iN3iiiO3iP3iQ3iR3iS3iiT3iU3iV3iW3iX3iY3iZ3i[3i\3i]3i^3i_3i`3ia3ib3ic3id3ie3if3ig3iih3ii3ij3ik3il3im3in3io3ip3iq3ir3is3it3iu3iv3iw3ix3iiy3iz3i{3i|3i}3i~3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3ii3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3ihii3i3i3i3i3i3i3i3i3i3i3i3i3ii3i3i3i3ii3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3iz i3i3i3i3i3i3i3i3ii3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3ii3i3i3i3i3i3i3i3i3i4i4i4i4i4i4i4i4i4i 4i 4i 4i 4i 4i4i4i4ii4i4i4i4i4i4i4i4i4i4i4i4i4ii4i4i 4i!4i"4i#4i$4i%4i&4i'4i(4i)4i*4i+4i,4i-4i.4i/4i04i14i24i34i44i54i64i74ii84i94i:4i;4i<4i=4i>4i?4i@4iA4iB4iC4iD4iE4iF4iG4iH4iI4iJ4iK4iL4iM4iN4iO4iP4iQ4iR4iS4iT4iU4iV4iW4iX4iY4iZ4i[4i\4i]4i^4i_4i`4ia4ib4ic4id4ie4if4ig4ih4ii4ij4ik4il4im4in4io4ip4iq4ir4is4it4iu4iv4iw4ix4iiy4iz4i{4iii|4i}4i~4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4ii4i4i4i4i4i4i4i4i4i4i4i4i4ii4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i5i5i5i5i5i5i5i5i5i 5i 5i 5i 5i 5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i 5i!5i"5i#5i$5i%5i&5i'5i(5i)5i*5i+5i,5i-5i.5i/5i05i15i25i35i45i55i65i75i85i95i:5i;5i<5i=5i>5i?5i@5iA5iB5iC5iD5iE5iF5iG5iH5iI5iJ5iiK5iL5iM5iN5iO5iP5iQ5iR5iS5iiT5iU5iV5iW5iX5iY5iZ5i[5i\5i]5i^5i_5i`5ia5ib5ic5id5ie5if5ig5ih5ii5ij5ik5il5im5in5io5ip5iq5ir5is5it5iu5iv5iw5ix5iy5iz5i{5i|5i}5i~5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i6i6i6i6i6i6i6i6i6i 6i 6i 6i 6i 6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i 6i!6i"6i#6i$6i%6i&6i'6i(6i)6i*6i+6i,6i-6i.6i/6i06i16i26i36i46i56i66i76i86i96i:6i;6i<6i=6i>6i?6i@6iA6iB6iC6iD6iE6iF6iG6iH6iI6iJ6iK6iL6iM6iN6iO6iP6iQ6iR6iS6iT6iU6iV6iW6iX6iY6iZ6i[6i\6i]6i^6i_6i`6ia6ib6ic6id6ie6if6ig6ih6ii6ij6ik6il6im6in6io6ip6iq6ir6is6it6iu6iv6iw6ix6iy6iz6i{6i|6i}6i~6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6N(tBIG5_TYPICAL_DISTRIBUTION_RATIOtBIG5_TABLE_SIZEtBig5CharToFreqOrder(((s4/usr/lib/python2.7/site-packages/chardet/big5freq.pyt+s000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000PK[9 #site-packages/chardet/gb2312freq.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # GB2312 most frequently used character table # # Char to FreqOrder table , from hz6763 # 512 --> 0.79 -- 0.79 # 1024 --> 0.92 -- 0.13 # 2048 --> 0.98 -- 0.06 # 6768 --> 1.00 -- 0.02 # # Ideal Distribution Ratio = 0.79135/(1-0.79135) = 3.79 # Random Distribution Ration = 512 / (3755 - 512) = 0.157 # # Typical Distribution Ratio about 25% of Ideal one, still much higher that RDR GB2312_TYPICAL_DISTRIBUTION_RATIO = 0.9 GB2312_TABLE_SIZE = 3760 GB2312CharToFreqOrder = ( 1671, 749,1443,2364,3924,3807,2330,3921,1704,3463,2691,1511,1515, 572,3191,2205, 2361, 224,2558, 479,1711, 963,3162, 440,4060,1905,2966,2947,3580,2647,3961,3842, 2204, 869,4207, 970,2678,5626,2944,2956,1479,4048, 514,3595, 588,1346,2820,3409, 249,4088,1746,1873,2047,1774, 581,1813, 358,1174,3590,1014,1561,4844,2245, 670, 1636,3112, 889,1286, 953, 556,2327,3060,1290,3141, 613, 185,3477,1367, 850,3820, 1715,2428,2642,2303,2732,3041,2562,2648,3566,3946,1349, 388,3098,2091,1360,3585, 152,1687,1539, 738,1559, 59,1232,2925,2267,1388,1249,1741,1679,2960, 151,1566, 1125,1352,4271, 924,4296, 385,3166,4459, 310,1245,2850, 70,3285,2729,3534,3575, 2398,3298,3466,1960,2265, 217,3647, 864,1909,2084,4401,2773,1010,3269,5152, 853, 3051,3121,1244,4251,1895, 364,1499,1540,2313,1180,3655,2268, 562, 715,2417,3061, 544, 336,3768,2380,1752,4075, 950, 280,2425,4382, 183,2759,3272, 333,4297,2155, 1688,2356,1444,1039,4540, 736,1177,3349,2443,2368,2144,2225, 565, 196,1482,3406, 927,1335,4147, 692, 878,1311,1653,3911,3622,1378,4200,1840,2969,3149,2126,1816, 2534,1546,2393,2760, 737,2494, 13, 447, 245,2747, 38,2765,2129,2589,1079, 606, 360, 471,3755,2890, 404, 848, 699,1785,1236, 370,2221,1023,3746,2074,2026,2023, 2388,1581,2119, 812,1141,3091,2536,1519, 804,2053, 406,1596,1090, 784, 548,4414, 1806,2264,2936,1100, 343,4114,5096, 622,3358, 743,3668,1510,1626,5020,3567,2513, 3195,4115,5627,2489,2991, 24,2065,2697,1087,2719, 48,1634, 315, 68, 985,2052, 198,2239,1347,1107,1439, 597,2366,2172, 871,3307, 919,2487,2790,1867, 236,2570, 1413,3794, 906,3365,3381,1701,1982,1818,1524,2924,1205, 616,2586,2072,2004, 575, 253,3099, 32,1365,1182, 197,1714,2454,1201, 554,3388,3224,2748, 756,2587, 250, 2567,1507,1517,3529,1922,2761,2337,3416,1961,1677,2452,2238,3153, 615, 911,1506, 1474,2495,1265,1906,2749,3756,3280,2161, 898,2714,1759,3450,2243,2444, 563, 26, 3286,2266,3769,3344,2707,3677, 611,1402, 531,1028,2871,4548,1375, 261,2948, 835, 1190,4134, 353, 840,2684,1900,3082,1435,2109,1207,1674, 329,1872,2781,4055,2686, 2104, 608,3318,2423,2957,2768,1108,3739,3512,3271,3985,2203,1771,3520,1418,2054, 1681,1153, 225,1627,2929, 162,2050,2511,3687,1954, 124,1859,2431,1684,3032,2894, 585,4805,3969,2869,2704,2088,2032,2095,3656,2635,4362,2209, 256, 518,2042,2105, 3777,3657, 643,2298,1148,1779, 190, 989,3544, 414, 11,2135,2063,2979,1471, 403, 3678, 126, 770,1563, 671,2499,3216,2877, 600,1179, 307,2805,4937,1268,1297,2694, 252,4032,1448,1494,1331,1394, 127,2256, 222,1647,1035,1481,3056,1915,1048, 873, 3651, 210, 33,1608,2516, 200,1520, 415, 102, 0,3389,1287, 817, 91,3299,2940, 836,1814, 549,2197,1396,1669,2987,3582,2297,2848,4528,1070, 687, 20,1819, 121, 1552,1364,1461,1968,2617,3540,2824,2083, 177, 948,4938,2291, 110,4549,2066, 648, 3359,1755,2110,2114,4642,4845,1693,3937,3308,1257,1869,2123, 208,1804,3159,2992, 2531,2549,3361,2418,1350,2347,2800,2568,1291,2036,2680, 72, 842,1990, 212,1233, 1154,1586, 75,2027,3410,4900,1823,1337,2710,2676, 728,2810,1522,3026,4995, 157, 755,1050,4022, 710, 785,1936,2194,2085,1406,2777,2400, 150,1250,4049,1206, 807, 1910, 534, 529,3309,1721,1660, 274, 39,2827, 661,2670,1578, 925,3248,3815,1094, 4278,4901,4252, 41,1150,3747,2572,2227,4501,3658,4902,3813,3357,3617,2884,2258, 887, 538,4187,3199,1294,2439,3042,2329,2343,2497,1255, 107, 543,1527, 521,3478, 3568, 194,5062, 15, 961,3870,1241,1192,2664, 66,5215,3260,2111,1295,1127,2152, 3805,4135, 901,1164,1976, 398,1278, 530,1460, 748, 904,1054,1966,1426, 53,2909, 509, 523,2279,1534, 536,1019, 239,1685, 460,2353, 673,1065,2401,3600,4298,2272, 1272,2363, 284,1753,3679,4064,1695, 81, 815,2677,2757,2731,1386, 859, 500,4221, 2190,2566, 757,1006,2519,2068,1166,1455, 337,2654,3203,1863,1682,1914,3025,1252, 1409,1366, 847, 714,2834,2038,3209, 964,2970,1901, 885,2553,1078,1756,3049, 301, 1572,3326, 688,2130,1996,2429,1805,1648,2930,3421,2750,3652,3088, 262,1158,1254, 389,1641,1812, 526,1719, 923,2073,1073,1902, 468, 489,4625,1140, 857,2375,3070, 3319,2863, 380, 116,1328,2693,1161,2244, 273,1212,1884,2769,3011,1775,1142, 461, 3066,1200,2147,2212, 790, 702,2695,4222,1601,1058, 434,2338,5153,3640, 67,2360, 4099,2502, 618,3472,1329, 416,1132, 830,2782,1807,2653,3211,3510,1662, 192,2124, 296,3979,1739,1611,3684, 23, 118, 324, 446,1239,1225, 293,2520,3814,3795,2535, 3116, 17,1074, 467,2692,2201, 387,2922, 45,1326,3055,1645,3659,2817, 958, 243, 1903,2320,1339,2825,1784,3289, 356, 576, 865,2315,2381,3377,3916,1088,3122,1713, 1655, 935, 628,4689,1034,1327, 441, 800, 720, 894,1979,2183,1528,5289,2702,1071, 4046,3572,2399,1571,3281, 79, 761,1103, 327, 134, 758,1899,1371,1615, 879, 442, 215,2605,2579, 173,2048,2485,1057,2975,3317,1097,2253,3801,4263,1403,1650,2946, 814,4968,3487,1548,2644,1567,1285, 2, 295,2636, 97, 946,3576, 832, 141,4257, 3273, 760,3821,3521,3156,2607, 949,1024,1733,1516,1803,1920,2125,2283,2665,3180, 1501,2064,3560,2171,1592, 803,3518,1416, 732,3897,4258,1363,1362,2458, 119,1427, 602,1525,2608,1605,1639,3175, 694,3064, 10, 465, 76,2000,4846,4208, 444,3781, 1619,3353,2206,1273,3796, 740,2483, 320,1723,2377,3660,2619,1359,1137,1762,1724, 2345,2842,1850,1862, 912, 821,1866, 612,2625,1735,2573,3369,1093, 844, 89, 937, 930,1424,3564,2413,2972,1004,3046,3019,2011, 711,3171,1452,4178, 428, 801,1943, 432, 445,2811, 206,4136,1472, 730, 349, 73, 397,2802,2547, 998,1637,1167, 789, 396,3217, 154,1218, 716,1120,1780,2819,4826,1931,3334,3762,2139,1215,2627, 552, 3664,3628,3232,1405,2383,3111,1356,2652,3577,3320,3101,1703, 640,1045,1370,1246, 4996, 371,1575,2436,1621,2210, 984,4033,1734,2638, 16,4529, 663,2755,3255,1451, 3917,2257,1253,1955,2234,1263,2951, 214,1229, 617, 485, 359,1831,1969, 473,2310, 750,2058, 165, 80,2864,2419, 361,4344,2416,2479,1134, 796,3726,1266,2943, 860, 2715, 938, 390,2734,1313,1384, 248, 202, 877,1064,2854, 522,3907, 279,1602, 297, 2357, 395,3740, 137,2075, 944,4089,2584,1267,3802, 62,1533,2285, 178, 176, 780, 2440, 201,3707, 590, 478,1560,4354,2117,1075, 30, 74,4643,4004,1635,1441,2745, 776,2596, 238,1077,1692,1912,2844, 605, 499,1742,3947, 241,3053, 980,1749, 936, 2640,4511,2582, 515,1543,2162,5322,2892,2993, 890,2148,1924, 665,1827,3581,1032, 968,3163, 339,1044,1896, 270, 583,1791,1720,4367,1194,3488,3669, 43,2523,1657, 163,2167, 290,1209,1622,3378, 550, 634,2508,2510, 695,2634,2384,2512,1476,1414, 220,1469,2341,2138,2852,3183,2900,4939,2865,3502,1211,3680, 854,3227,1299,2976, 3172, 186,2998,1459, 443,1067,3251,1495, 321,1932,3054, 909, 753,1410,1828, 436, 2441,1119,1587,3164,2186,1258, 227, 231,1425,1890,3200,3942, 247, 959, 725,5254, 2741, 577,2158,2079, 929, 120, 174, 838,2813, 591,1115, 417,2024, 40,3240,1536, 1037, 291,4151,2354, 632,1298,2406,2500,3535,1825,1846,3451, 205,1171, 345,4238, 18,1163, 811, 685,2208,1217, 425,1312,1508,1175,4308,2552,1033, 587,1381,3059, 2984,3482, 340,1316,4023,3972, 792,3176, 519, 777,4690, 918, 933,4130,2981,3741, 90,3360,2911,2200,5184,4550, 609,3079,2030, 272,3379,2736, 363,3881,1130,1447, 286, 779, 357,1169,3350,3137,1630,1220,2687,2391, 747,1277,3688,2618,2682,2601, 1156,3196,5290,4034,3102,1689,3596,3128, 874, 219,2783, 798, 508,1843,2461, 269, 1658,1776,1392,1913,2983,3287,2866,2159,2372, 829,4076, 46,4253,2873,1889,1894, 915,1834,1631,2181,2318, 298, 664,2818,3555,2735, 954,3228,3117, 527,3511,2173, 681,2712,3033,2247,2346,3467,1652, 155,2164,3382, 113,1994, 450, 899, 494, 994, 1237,2958,1875,2336,1926,3727, 545,1577,1550, 633,3473, 204,1305,3072,2410,1956, 2471, 707,2134, 841,2195,2196,2663,3843,1026,4940, 990,3252,4997, 368,1092, 437, 3212,3258,1933,1829, 675,2977,2893, 412, 943,3723,4644,3294,3283,2230,2373,5154, 2389,2241,2661,2323,1404,2524, 593, 787, 677,3008,1275,2059, 438,2709,2609,2240, 2269,2246,1446, 36,1568,1373,3892,1574,2301,1456,3962, 693,2276,5216,2035,1143, 2720,1919,1797,1811,2763,4137,2597,1830,1699,1488,1198,2090, 424,1694, 312,3634, 3390,4179,3335,2252,1214, 561,1059,3243,2295,2561, 975,5155,2321,2751,3772, 472, 1537,3282,3398,1047,2077,2348,2878,1323,3340,3076, 690,2906, 51, 369, 170,3541, 1060,2187,2688,3670,2541,1083,1683, 928,3918, 459, 109,4427, 599,3744,4286, 143, 2101,2730,2490, 82,1588,3036,2121, 281,1860, 477,4035,1238,2812,3020,2716,3312, 1530,2188,2055,1317, 843, 636,1808,1173,3495, 649, 181,1002, 147,3641,1159,2414, 3750,2289,2795, 813,3123,2610,1136,4368, 5,3391,4541,2174, 420, 429,1728, 754, 1228,2115,2219, 347,2223,2733, 735,1518,3003,2355,3134,1764,3948,3329,1888,2424, 1001,1234,1972,3321,3363,1672,1021,1450,1584, 226, 765, 655,2526,3404,3244,2302, 3665, 731, 594,2184, 319,1576, 621, 658,2656,4299,2099,3864,1279,2071,2598,2739, 795,3086,3699,3908,1707,2352,2402,1382,3136,2475,1465,4847,3496,3865,1085,3004, 2591,1084, 213,2287,1963,3565,2250, 822, 793,4574,3187,1772,1789,3050, 595,1484, 1959,2770,1080,2650, 456, 422,2996, 940,3322,4328,4345,3092,2742, 965,2784, 739, 4124, 952,1358,2498,2949,2565, 332,2698,2378, 660,2260,2473,4194,3856,2919, 535, 1260,2651,1208,1428,1300,1949,1303,2942, 433,2455,2450,1251,1946, 614,1269, 641, 1306,1810,2737,3078,2912, 564,2365,1419,1415,1497,4460,2367,2185,1379,3005,1307, 3218,2175,1897,3063, 682,1157,4040,4005,1712,1160,1941,1399, 394, 402,2952,1573, 1151,2986,2404, 862, 299,2033,1489,3006, 346, 171,2886,3401,1726,2932, 168,2533, 47,2507,1030,3735,1145,3370,1395,1318,1579,3609,4560,2857,4116,1457,2529,1965, 504,1036,2690,2988,2405, 745,5871, 849,2397,2056,3081, 863,2359,3857,2096, 99, 1397,1769,2300,4428,1643,3455,1978,1757,3718,1440, 35,4879,3742,1296,4228,2280, 160,5063,1599,2013, 166, 520,3479,1646,3345,3012, 490,1937,1545,1264,2182,2505, 1096,1188,1369,1436,2421,1667,2792,2460,1270,2122, 727,3167,2143, 806,1706,1012, 1800,3037, 960,2218,1882, 805, 139,2456,1139,1521, 851,1052,3093,3089, 342,2039, 744,5097,1468,1502,1585,2087, 223, 939, 326,2140,2577, 892,2481,1623,4077, 982, 3708, 135,2131, 87,2503,3114,2326,1106, 876,1616, 547,2997,2831,2093,3441,4530, 4314, 9,3256,4229,4148, 659,1462,1986,1710,2046,2913,2231,4090,4880,5255,3392, 3274,1368,3689,4645,1477, 705,3384,3635,1068,1529,2941,1458,3782,1509, 100,1656, 2548, 718,2339, 408,1590,2780,3548,1838,4117,3719,1345,3530, 717,3442,2778,3220, 2898,1892,4590,3614,3371,2043,1998,1224,3483, 891, 635, 584,2559,3355, 733,1766, 1729,1172,3789,1891,2307, 781,2982,2271,1957,1580,5773,2633,2005,4195,3097,1535, 3213,1189,1934,5693,3262, 586,3118,1324,1598, 517,1564,2217,1868,1893,4445,3728, 2703,3139,1526,1787,1992,3882,2875,1549,1199,1056,2224,1904,2711,5098,4287, 338, 1993,3129,3489,2689,1809,2815,1997, 957,1855,3898,2550,3275,3057,1105,1319, 627, 1505,1911,1883,3526, 698,3629,3456,1833,1431, 746, 77,1261,2017,2296,1977,1885, 125,1334,1600, 525,1798,1109,2222,1470,1945, 559,2236,1186,3443,2476,1929,1411, 2411,3135,1777,3372,2621,1841,1613,3229, 668,1430,1839,2643,2916, 195,1989,2671, 2358,1387, 629,3205,2293,5256,4439, 123,1310, 888,1879,4300,3021,3605,1003,1162, 3192,2910,2010, 140,2395,2859, 55,1082,2012,2901, 662, 419,2081,1438, 680,2774, 4654,3912,1620,1731,1625,5035,4065,2328, 512,1344, 802,5443,2163,2311,2537, 524, 3399, 98,1155,2103,1918,2606,3925,2816,1393,2465,1504,3773,2177,3963,1478,4346, 180,1113,4655,3461,2028,1698, 833,2696,1235,1322,1594,4408,3623,3013,3225,2040, 3022, 541,2881, 607,3632,2029,1665,1219, 639,1385,1686,1099,2803,3231,1938,3188, 2858, 427, 676,2772,1168,2025, 454,3253,2486,3556, 230,1950, 580, 791,1991,1280, 1086,1974,2034, 630, 257,3338,2788,4903,1017, 86,4790, 966,2789,1995,1696,1131, 259,3095,4188,1308, 179,1463,5257, 289,4107,1248, 42,3413,1725,2288, 896,1947, 774,4474,4254, 604,3430,4264, 392,2514,2588, 452, 237,1408,3018, 988,4531,1970, 3034,3310, 540,2370,1562,1288,2990, 502,4765,1147, 4,1853,2708, 207, 294,2814, 4078,2902,2509, 684, 34,3105,3532,2551, 644, 709,2801,2344, 573,1727,3573,3557, 2021,1081,3100,4315,2100,3681, 199,2263,1837,2385, 146,3484,1195,2776,3949, 997, 1939,3973,1008,1091,1202,1962,1847,1149,4209,5444,1076, 493, 117,5400,2521, 972, 1490,2934,1796,4542,2374,1512,2933,2657, 413,2888,1135,2762,2314,2156,1355,2369, 766,2007,2527,2170,3124,2491,2593,2632,4757,2437, 234,3125,3591,1898,1750,1376, 1942,3468,3138, 570,2127,2145,3276,4131, 962, 132,1445,4196, 19, 941,3624,3480, 3366,1973,1374,4461,3431,2629, 283,2415,2275, 808,2887,3620,2112,2563,1353,3610, 955,1089,3103,1053, 96, 88,4097, 823,3808,1583, 399, 292,4091,3313, 421,1128, 642,4006, 903,2539,1877,2082, 596, 29,4066,1790, 722,2157, 130, 995,1569, 769, 1485, 464, 513,2213, 288,1923,1101,2453,4316, 133, 486,2445, 50, 625, 487,2207, 57, 423, 481,2962, 159,3729,1558, 491, 303, 482, 501, 240,2837, 112,3648,2392, 1783, 362, 8,3433,3422, 610,2793,3277,1390,1284,1654, 21,3823, 734, 367, 623, 193, 287, 374,1009,1483, 816, 476, 313,2255,2340,1262,2150,2899,1146,2581, 782, 2116,1659,2018,1880, 255,3586,3314,1110,2867,2137,2564, 986,2767,5185,2006, 650, 158, 926, 762, 881,3157,2717,2362,3587, 306,3690,3245,1542,3077,2427,1691,2478, 2118,2985,3490,2438, 539,2305, 983, 129,1754, 355,4201,2386, 827,2923, 104,1773, 2838,2771, 411,2905,3919, 376, 767, 122,1114, 828,2422,1817,3506, 266,3460,1007, 1609,4998, 945,2612,4429,2274, 726,1247,1964,2914,2199,2070,4002,4108, 657,3323, 1422, 579, 455,2764,4737,1222,2895,1670, 824,1223,1487,2525, 558, 861,3080, 598, 2659,2515,1967, 752,2583,2376,2214,4180, 977, 704,2464,4999,2622,4109,1210,2961, 819,1541, 142,2284, 44, 418, 457,1126,3730,4347,4626,1644,1876,3671,1864, 302, 1063,5694, 624, 723,1984,3745,1314,1676,2488,1610,1449,3558,3569,2166,2098, 409, 1011,2325,3704,2306, 818,1732,1383,1824,1844,3757, 999,2705,3497,1216,1423,2683, 2426,2954,2501,2726,2229,1475,2554,5064,1971,1794,1666,2014,1343, 783, 724, 191, 2434,1354,2220,5065,1763,2752,2472,4152, 131, 175,2885,3434, 92,1466,4920,2616, 3871,3872,3866, 128,1551,1632, 669,1854,3682,4691,4125,1230, 188,2973,3290,1302, 1213, 560,3266, 917, 763,3909,3249,1760, 868,1958, 764,1782,2097, 145,2277,3774, 4462, 64,1491,3062, 971,2132,3606,2442, 221,1226,1617, 218, 323,1185,3207,3147, 571, 619,1473,1005,1744,2281, 449,1887,2396,3685, 275, 375,3816,1743,3844,3731, 845,1983,2350,4210,1377, 773, 967,3499,3052,3743,2725,4007,1697,1022,3943,1464, 3264,2855,2722,1952,1029,2839,2467, 84,4383,2215, 820,1391,2015,2448,3672, 377, 1948,2168, 797,2545,3536,2578,2645, 94,2874,1678, 405,1259,3071, 771, 546,1315, 470,1243,3083, 895,2468, 981, 969,2037, 846,4181, 653,1276,2928, 14,2594, 557, 3007,2474, 156, 902,1338,1740,2574, 537,2518, 973,2282,2216,2433,1928, 138,2903, 1293,2631,1612, 646,3457, 839,2935, 111, 496,2191,2847, 589,3186, 149,3994,2060, 4031,2641,4067,3145,1870, 37,3597,2136,1025,2051,3009,3383,3549,1121,1016,3261, 1301, 251,2446,2599,2153, 872,3246, 637, 334,3705, 831, 884, 921,3065,3140,4092, 2198,1944, 246,2964, 108,2045,1152,1921,2308,1031, 203,3173,4170,1907,3890, 810, 1401,2003,1690, 506, 647,1242,2828,1761,1649,3208,2249,1589,3709,2931,5156,1708, 498, 666,2613, 834,3817,1231, 184,2851,1124, 883,3197,2261,3710,1765,1553,2658, 1178,2639,2351, 93,1193, 942,2538,2141,4402, 235,1821, 870,1591,2192,1709,1871, 3341,1618,4126,2595,2334, 603, 651, 69, 701, 268,2662,3411,2555,1380,1606, 503, 448, 254,2371,2646, 574,1187,2309,1770, 322,2235,1292,1801, 305, 566,1133, 229, 2067,2057, 706, 167, 483,2002,2672,3295,1820,3561,3067, 316, 378,2746,3452,1112, 136,1981, 507,1651,2917,1117, 285,4591, 182,2580,3522,1304, 335,3303,1835,2504, 1795,1792,2248, 674,1018,2106,2449,1857,2292,2845, 976,3047,1781,2600,2727,1389, 1281, 52,3152, 153, 265,3950, 672,3485,3951,4463, 430,1183, 365, 278,2169, 27, 1407,1336,2304, 209,1340,1730,2202,1852,2403,2883, 979,1737,1062, 631,2829,2542, 3876,2592, 825,2086,2226,3048,3625, 352,1417,3724, 542, 991, 431,1351,3938,1861, 2294, 826,1361,2927,3142,3503,1738, 463,2462,2723, 582,1916,1595,2808, 400,3845, 3891,2868,3621,2254, 58,2492,1123, 910,2160,2614,1372,1603,1196,1072,3385,1700, 3267,1980, 696, 480,2430, 920, 799,1570,2920,1951,2041,4047,2540,1321,4223,2469, 3562,2228,1271,2602, 401,2833,3351,2575,5157, 907,2312,1256, 410, 263,3507,1582, 996, 678,1849,2316,1480, 908,3545,2237, 703,2322, 667,1826,2849,1531,2604,2999, 2407,3146,2151,2630,1786,3711, 469,3542, 497,3899,2409, 858, 837,4446,3393,1274, 786, 620,1845,2001,3311, 484, 308,3367,1204,1815,3691,2332,1532,2557,1842,2020, 2724,1927,2333,4440, 567, 22,1673,2728,4475,1987,1858,1144,1597, 101,1832,3601, 12, 974,3783,4391, 951,1412, 1,3720, 453,4608,4041, 528,1041,1027,3230,2628, 1129, 875,1051,3291,1203,2262,1069,2860,2799,2149,2615,3278, 144,1758,3040, 31, 475,1680, 366,2685,3184, 311,1642,4008,2466,5036,1593,1493,2809, 216,1420,1668, 233, 304,2128,3284, 232,1429,1768,1040,2008,3407,2740,2967,2543, 242,2133, 778, 1565,2022,2620, 505,2189,2756,1098,2273, 372,1614, 708, 553,2846,2094,2278, 169, 3626,2835,4161, 228,2674,3165, 809,1454,1309, 466,1705,1095, 900,3423, 880,2667, 3751,5258,2317,3109,2571,4317,2766,1503,1342, 866,4447,1118, 63,2076, 314,1881, 1348,1061, 172, 978,3515,1747, 532, 511,3970, 6, 601, 905,2699,3300,1751, 276, 1467,3725,2668, 65,4239,2544,2779,2556,1604, 578,2451,1802, 992,2331,2624,1320, 3446, 713,1513,1013, 103,2786,2447,1661, 886,1702, 916, 654,3574,2031,1556, 751, 2178,2821,2179,1498,1538,2176, 271, 914,2251,2080,1325, 638,1953,2937,3877,2432, 2754, 95,3265,1716, 260,1227,4083, 775, 106,1357,3254, 426,1607, 555,2480, 772, 1985, 244,2546, 474, 495,1046,2611,1851,2061, 71,2089,1675,2590, 742,3758,2843, 3222,1433, 267,2180,2576,2826,2233,2092,3913,2435, 956,1745,3075, 856,2113,1116, 451, 3,1988,2896,1398, 993,2463,1878,2049,1341,2718,2721,2870,2108, 712,2904, 4363,2753,2324, 277,2872,2349,2649, 384, 987, 435, 691,3000, 922, 164,3939, 652, 1500,1184,4153,2482,3373,2165,4848,2335,3775,3508,3154,2806,2830,1554,2102,1664, 2530,1434,2408, 893,1547,2623,3447,2832,2242,2532,3169,2856,3223,2078, 49,3770, 3469, 462, 318, 656,2259,3250,3069, 679,1629,2758, 344,1138,1104,3120,1836,1283, 3115,2154,1437,4448, 934, 759,1999, 794,2862,1038, 533,2560,1722,2342, 855,2626, 1197,1663,4476,3127, 85,4240,2528, 25,1111,1181,3673, 407,3470,4561,2679,2713, 768,1925,2841,3986,1544,1165, 932, 373,1240,2146,1930,2673, 721,4766, 354,4333, 391,2963, 187, 61,3364,1442,1102, 330,1940,1767, 341,3809,4118, 393,2496,2062, 2211, 105, 331, 300, 439, 913,1332, 626, 379,3304,1557, 328, 689,3952, 309,1555, 931, 317,2517,3027, 325, 569, 686,2107,3084, 60,1042,1333,2794, 264,3177,4014, 1628, 258,3712, 7,4464,1176,1043,1778, 683, 114,1975, 78,1492, 383,1886, 510, 386, 645,5291,2891,2069,3305,4138,3867,2939,2603,2493,1935,1066,1848,3588,1015, 1282,1289,4609, 697,1453,3044,2666,3611,1856,2412, 54, 719,1330, 568,3778,2459, 1748, 788, 492, 551,1191,1000, 488,3394,3763, 282,1799, 348,2016,1523,3155,2390, 1049, 382,2019,1788,1170, 729,2968,3523, 897,3926,2785,2938,3292, 350,2319,3238, 1718,1717,2655,3453,3143,4465, 161,2889,2980,2009,1421, 56,1908,1640,2387,2232, 1917,1874,2477,4921, 148, 83,3438, 592,4245,2882,1822,1055, 741, 115,1496,1624, 381,1638,4592,1020, 516,3214, 458, 947,4575,1432, 211,1514,2926,1865,2142, 189, 852,1221,1400,1486, 882,2299,4036, 351, 28,1122, 700,6479,6480,6481,6482,6483, # last 512 #Everything below is of no interest for detection purpose 5508,6484,3900,3414,3974,4441,4024,3537,4037,5628,5099,3633,6485,3148,6486,3636, 5509,3257,5510,5973,5445,5872,4941,4403,3174,4627,5873,6276,2286,4230,5446,5874, 5122,6102,6103,4162,5447,5123,5323,4849,6277,3980,3851,5066,4246,5774,5067,6278, 3001,2807,5695,3346,5775,5974,5158,5448,6487,5975,5976,5776,3598,6279,5696,4806, 4211,4154,6280,6488,6489,6490,6281,4212,5037,3374,4171,6491,4562,4807,4722,4827, 5977,6104,4532,4079,5159,5324,5160,4404,3858,5359,5875,3975,4288,4610,3486,4512, 5325,3893,5360,6282,6283,5560,2522,4231,5978,5186,5449,2569,3878,6284,5401,3578, 4415,6285,4656,5124,5979,2506,4247,4449,3219,3417,4334,4969,4329,6492,4576,4828, 4172,4416,4829,5402,6286,3927,3852,5361,4369,4830,4477,4867,5876,4173,6493,6105, 4657,6287,6106,5877,5450,6494,4155,4868,5451,3700,5629,4384,6288,6289,5878,3189, 4881,6107,6290,6495,4513,6496,4692,4515,4723,5100,3356,6497,6291,3810,4080,5561, 3570,4430,5980,6498,4355,5697,6499,4724,6108,6109,3764,4050,5038,5879,4093,3226, 6292,5068,5217,4693,3342,5630,3504,4831,4377,4466,4309,5698,4431,5777,6293,5778, 4272,3706,6110,5326,3752,4676,5327,4273,5403,4767,5631,6500,5699,5880,3475,5039, 6294,5562,5125,4348,4301,4482,4068,5126,4593,5700,3380,3462,5981,5563,3824,5404, 4970,5511,3825,4738,6295,6501,5452,4516,6111,5881,5564,6502,6296,5982,6503,4213, 4163,3454,6504,6112,4009,4450,6113,4658,6297,6114,3035,6505,6115,3995,4904,4739, 4563,4942,4110,5040,3661,3928,5362,3674,6506,5292,3612,4791,5565,4149,5983,5328, 5259,5021,4725,4577,4564,4517,4364,6298,5405,4578,5260,4594,4156,4157,5453,3592, 3491,6507,5127,5512,4709,4922,5984,5701,4726,4289,6508,4015,6116,5128,4628,3424, 4241,5779,6299,4905,6509,6510,5454,5702,5780,6300,4365,4923,3971,6511,5161,3270, 3158,5985,4100, 867,5129,5703,6117,5363,3695,3301,5513,4467,6118,6512,5455,4232, 4242,4629,6513,3959,4478,6514,5514,5329,5986,4850,5162,5566,3846,4694,6119,5456, 4869,5781,3779,6301,5704,5987,5515,4710,6302,5882,6120,4392,5364,5705,6515,6121, 6516,6517,3736,5988,5457,5989,4695,2457,5883,4551,5782,6303,6304,6305,5130,4971, 6122,5163,6123,4870,3263,5365,3150,4871,6518,6306,5783,5069,5706,3513,3498,4409, 5330,5632,5366,5458,5459,3991,5990,4502,3324,5991,5784,3696,4518,5633,4119,6519, 4630,5634,4417,5707,4832,5992,3418,6124,5993,5567,4768,5218,6520,4595,3458,5367, 6125,5635,6126,4202,6521,4740,4924,6307,3981,4069,4385,6308,3883,2675,4051,3834, 4302,4483,5568,5994,4972,4101,5368,6309,5164,5884,3922,6127,6522,6523,5261,5460, 5187,4164,5219,3538,5516,4111,3524,5995,6310,6311,5369,3181,3386,2484,5188,3464, 5569,3627,5708,6524,5406,5165,4677,4492,6312,4872,4851,5885,4468,5996,6313,5709, 5710,6128,2470,5886,6314,5293,4882,5785,3325,5461,5101,6129,5711,5786,6525,4906, 6526,6527,4418,5887,5712,4808,2907,3701,5713,5888,6528,3765,5636,5331,6529,6530, 3593,5889,3637,4943,3692,5714,5787,4925,6315,6130,5462,4405,6131,6132,6316,5262, 6531,6532,5715,3859,5716,5070,4696,5102,3929,5788,3987,4792,5997,6533,6534,3920, 4809,5000,5998,6535,2974,5370,6317,5189,5263,5717,3826,6536,3953,5001,4883,3190, 5463,5890,4973,5999,4741,6133,6134,3607,5570,6000,4711,3362,3630,4552,5041,6318, 6001,2950,2953,5637,4646,5371,4944,6002,2044,4120,3429,6319,6537,5103,4833,6538, 6539,4884,4647,3884,6003,6004,4758,3835,5220,5789,4565,5407,6540,6135,5294,4697, 4852,6320,6321,3206,4907,6541,6322,4945,6542,6136,6543,6323,6005,4631,3519,6544, 5891,6545,5464,3784,5221,6546,5571,4659,6547,6324,6137,5190,6548,3853,6549,4016, 4834,3954,6138,5332,3827,4017,3210,3546,4469,5408,5718,3505,4648,5790,5131,5638, 5791,5465,4727,4318,6325,6326,5792,4553,4010,4698,3439,4974,3638,4335,3085,6006, 5104,5042,5166,5892,5572,6327,4356,4519,5222,5573,5333,5793,5043,6550,5639,5071, 4503,6328,6139,6551,6140,3914,3901,5372,6007,5640,4728,4793,3976,3836,4885,6552, 4127,6553,4451,4102,5002,6554,3686,5105,6555,5191,5072,5295,4611,5794,5296,6556, 5893,5264,5894,4975,5466,5265,4699,4976,4370,4056,3492,5044,4886,6557,5795,4432, 4769,4357,5467,3940,4660,4290,6141,4484,4770,4661,3992,6329,4025,4662,5022,4632, 4835,4070,5297,4663,4596,5574,5132,5409,5895,6142,4504,5192,4664,5796,5896,3885, 5575,5797,5023,4810,5798,3732,5223,4712,5298,4084,5334,5468,6143,4052,4053,4336, 4977,4794,6558,5335,4908,5576,5224,4233,5024,4128,5469,5225,4873,6008,5045,4729, 4742,4633,3675,4597,6559,5897,5133,5577,5003,5641,5719,6330,6560,3017,2382,3854, 4406,4811,6331,4393,3964,4946,6561,2420,3722,6562,4926,4378,3247,1736,4442,6332, 5134,6333,5226,3996,2918,5470,4319,4003,4598,4743,4744,4485,3785,3902,5167,5004, 5373,4394,5898,6144,4874,1793,3997,6334,4085,4214,5106,5642,4909,5799,6009,4419, 4189,3330,5899,4165,4420,5299,5720,5227,3347,6145,4081,6335,2876,3930,6146,3293, 3786,3910,3998,5900,5300,5578,2840,6563,5901,5579,6147,3531,5374,6564,6565,5580, 4759,5375,6566,6148,3559,5643,6336,6010,5517,6337,6338,5721,5902,3873,6011,6339, 6567,5518,3868,3649,5722,6568,4771,4947,6569,6149,4812,6570,2853,5471,6340,6341, 5644,4795,6342,6012,5723,6343,5724,6013,4349,6344,3160,6150,5193,4599,4514,4493, 5168,4320,6345,4927,3666,4745,5169,5903,5005,4928,6346,5725,6014,4730,4203,5046, 4948,3395,5170,6015,4150,6016,5726,5519,6347,5047,3550,6151,6348,4197,4310,5904, 6571,5581,2965,6152,4978,3960,4291,5135,6572,5301,5727,4129,4026,5905,4853,5728, 5472,6153,6349,4533,2700,4505,5336,4678,3583,5073,2994,4486,3043,4554,5520,6350, 6017,5800,4487,6351,3931,4103,5376,6352,4011,4321,4311,4190,5136,6018,3988,3233, 4350,5906,5645,4198,6573,5107,3432,4191,3435,5582,6574,4139,5410,6353,5411,3944, 5583,5074,3198,6575,6354,4358,6576,5302,4600,5584,5194,5412,6577,6578,5585,5413, 5303,4248,5414,3879,4433,6579,4479,5025,4854,5415,6355,4760,4772,3683,2978,4700, 3797,4452,3965,3932,3721,4910,5801,6580,5195,3551,5907,3221,3471,3029,6019,3999, 5908,5909,5266,5267,3444,3023,3828,3170,4796,5646,4979,4259,6356,5647,5337,3694, 6357,5648,5338,4520,4322,5802,3031,3759,4071,6020,5586,4836,4386,5048,6581,3571, 4679,4174,4949,6154,4813,3787,3402,3822,3958,3215,3552,5268,4387,3933,4950,4359, 6021,5910,5075,3579,6358,4234,4566,5521,6359,3613,5049,6022,5911,3375,3702,3178, 4911,5339,4521,6582,6583,4395,3087,3811,5377,6023,6360,6155,4027,5171,5649,4421, 4249,2804,6584,2270,6585,4000,4235,3045,6156,5137,5729,4140,4312,3886,6361,4330, 6157,4215,6158,3500,3676,4929,4331,3713,4930,5912,4265,3776,3368,5587,4470,4855, 3038,4980,3631,6159,6160,4132,4680,6161,6362,3923,4379,5588,4255,6586,4121,6587, 6363,4649,6364,3288,4773,4774,6162,6024,6365,3543,6588,4274,3107,3737,5050,5803, 4797,4522,5589,5051,5730,3714,4887,5378,4001,4523,6163,5026,5522,4701,4175,2791, 3760,6589,5473,4224,4133,3847,4814,4815,4775,3259,5416,6590,2738,6164,6025,5304, 3733,5076,5650,4816,5590,6591,6165,6592,3934,5269,6593,3396,5340,6594,5804,3445, 3602,4042,4488,5731,5732,3525,5591,4601,5196,6166,6026,5172,3642,4612,3202,4506, 4798,6366,3818,5108,4303,5138,5139,4776,3332,4304,2915,3415,4434,5077,5109,4856, 2879,5305,4817,6595,5913,3104,3144,3903,4634,5341,3133,5110,5651,5805,6167,4057, 5592,2945,4371,5593,6596,3474,4182,6367,6597,6168,4507,4279,6598,2822,6599,4777, 4713,5594,3829,6169,3887,5417,6170,3653,5474,6368,4216,2971,5228,3790,4579,6369, 5733,6600,6601,4951,4746,4555,6602,5418,5475,6027,3400,4665,5806,6171,4799,6028, 5052,6172,3343,4800,4747,5006,6370,4556,4217,5476,4396,5229,5379,5477,3839,5914, 5652,5807,4714,3068,4635,5808,6173,5342,4192,5078,5419,5523,5734,6174,4557,6175, 4602,6371,6176,6603,5809,6372,5735,4260,3869,5111,5230,6029,5112,6177,3126,4681, 5524,5915,2706,3563,4748,3130,6178,4018,5525,6604,6605,5478,4012,4837,6606,4534, 4193,5810,4857,3615,5479,6030,4082,3697,3539,4086,5270,3662,4508,4931,5916,4912, 5811,5027,3888,6607,4397,3527,3302,3798,2775,2921,2637,3966,4122,4388,4028,4054, 1633,4858,5079,3024,5007,3982,3412,5736,6608,3426,3236,5595,3030,6179,3427,3336, 3279,3110,6373,3874,3039,5080,5917,5140,4489,3119,6374,5812,3405,4494,6031,4666, 4141,6180,4166,6032,5813,4981,6609,5081,4422,4982,4112,3915,5653,3296,3983,6375, 4266,4410,5654,6610,6181,3436,5082,6611,5380,6033,3819,5596,4535,5231,5306,5113, 6612,4952,5918,4275,3113,6613,6376,6182,6183,5814,3073,4731,4838,5008,3831,6614, 4888,3090,3848,4280,5526,5232,3014,5655,5009,5737,5420,5527,6615,5815,5343,5173, 5381,4818,6616,3151,4953,6617,5738,2796,3204,4360,2989,4281,5739,5174,5421,5197, 3132,5141,3849,5142,5528,5083,3799,3904,4839,5480,2880,4495,3448,6377,6184,5271, 5919,3771,3193,6034,6035,5920,5010,6036,5597,6037,6378,6038,3106,5422,6618,5423, 5424,4142,6619,4889,5084,4890,4313,5740,6620,3437,5175,5307,5816,4199,5198,5529, 5817,5199,5656,4913,5028,5344,3850,6185,2955,5272,5011,5818,4567,4580,5029,5921, 3616,5233,6621,6622,6186,4176,6039,6379,6380,3352,5200,5273,2908,5598,5234,3837, 5308,6623,6624,5819,4496,4323,5309,5201,6625,6626,4983,3194,3838,4167,5530,5922, 5274,6381,6382,3860,3861,5599,3333,4292,4509,6383,3553,5481,5820,5531,4778,6187, 3955,3956,4324,4389,4218,3945,4325,3397,2681,5923,4779,5085,4019,5482,4891,5382, 5383,6040,4682,3425,5275,4094,6627,5310,3015,5483,5657,4398,5924,3168,4819,6628, 5925,6629,5532,4932,4613,6041,6630,4636,6384,4780,4204,5658,4423,5821,3989,4683, 5822,6385,4954,6631,5345,6188,5425,5012,5384,3894,6386,4490,4104,6632,5741,5053, 6633,5823,5926,5659,5660,5927,6634,5235,5742,5824,4840,4933,4820,6387,4859,5928, 4955,6388,4143,3584,5825,5346,5013,6635,5661,6389,5014,5484,5743,4337,5176,5662, 6390,2836,6391,3268,6392,6636,6042,5236,6637,4158,6638,5744,5663,4471,5347,3663, 4123,5143,4293,3895,6639,6640,5311,5929,5826,3800,6189,6393,6190,5664,5348,3554, 3594,4749,4603,6641,5385,4801,6043,5827,4183,6642,5312,5426,4761,6394,5665,6191, 4715,2669,6643,6644,5533,3185,5427,5086,5930,5931,5386,6192,6044,6645,4781,4013, 5745,4282,4435,5534,4390,4267,6045,5746,4984,6046,2743,6193,3501,4087,5485,5932, 5428,4184,4095,5747,4061,5054,3058,3862,5933,5600,6646,5144,3618,6395,3131,5055, 5313,6396,4650,4956,3855,6194,3896,5202,4985,4029,4225,6195,6647,5828,5486,5829, 3589,3002,6648,6397,4782,5276,6649,6196,6650,4105,3803,4043,5237,5830,6398,4096, 3643,6399,3528,6651,4453,3315,4637,6652,3984,6197,5535,3182,3339,6653,3096,2660, 6400,6654,3449,5934,4250,4236,6047,6401,5831,6655,5487,3753,4062,5832,6198,6199, 6656,3766,6657,3403,4667,6048,6658,4338,2897,5833,3880,2797,3780,4326,6659,5748, 5015,6660,5387,4351,5601,4411,6661,3654,4424,5935,4339,4072,5277,4568,5536,6402, 6662,5238,6663,5349,5203,6200,5204,6201,5145,4536,5016,5056,4762,5834,4399,4957, 6202,6403,5666,5749,6664,4340,6665,5936,5177,5667,6666,6667,3459,4668,6404,6668, 6669,4543,6203,6670,4276,6405,4480,5537,6671,4614,5205,5668,6672,3348,2193,4763, 6406,6204,5937,5602,4177,5669,3419,6673,4020,6205,4443,4569,5388,3715,3639,6407, 6049,4058,6206,6674,5938,4544,6050,4185,4294,4841,4651,4615,5488,6207,6408,6051, 5178,3241,3509,5835,6208,4958,5836,4341,5489,5278,6209,2823,5538,5350,5206,5429, 6675,4638,4875,4073,3516,4684,4914,4860,5939,5603,5389,6052,5057,3237,5490,3791, 6676,6409,6677,4821,4915,4106,5351,5058,4243,5539,4244,5604,4842,4916,5239,3028, 3716,5837,5114,5605,5390,5940,5430,6210,4332,6678,5540,4732,3667,3840,6053,4305, 3408,5670,5541,6410,2744,5240,5750,6679,3234,5606,6680,5607,5671,3608,4283,4159, 4400,5352,4783,6681,6411,6682,4491,4802,6211,6412,5941,6413,6414,5542,5751,6683, 4669,3734,5942,6684,6415,5943,5059,3328,4670,4144,4268,6685,6686,6687,6688,4372, 3603,6689,5944,5491,4373,3440,6416,5543,4784,4822,5608,3792,4616,5838,5672,3514, 5391,6417,4892,6690,4639,6691,6054,5673,5839,6055,6692,6056,5392,6212,4038,5544, 5674,4497,6057,6693,5840,4284,5675,4021,4545,5609,6418,4454,6419,6213,4113,4472, 5314,3738,5087,5279,4074,5610,4959,4063,3179,4750,6058,6420,6214,3476,4498,4716, 5431,4960,4685,6215,5241,6694,6421,6216,6695,5841,5945,6422,3748,5946,5179,3905, 5752,5545,5947,4374,6217,4455,6423,4412,6218,4803,5353,6696,3832,5280,6219,4327, 4702,6220,6221,6059,4652,5432,6424,3749,4751,6425,5753,4986,5393,4917,5948,5030, 5754,4861,4733,6426,4703,6697,6222,4671,5949,4546,4961,5180,6223,5031,3316,5281, 6698,4862,4295,4934,5207,3644,6427,5842,5950,6428,6429,4570,5843,5282,6430,6224, 5088,3239,6060,6699,5844,5755,6061,6431,2701,5546,6432,5115,5676,4039,3993,3327, 4752,4425,5315,6433,3941,6434,5677,4617,4604,3074,4581,6225,5433,6435,6226,6062, 4823,5756,5116,6227,3717,5678,4717,5845,6436,5679,5846,6063,5847,6064,3977,3354, 6437,3863,5117,6228,5547,5394,4499,4524,6229,4605,6230,4306,4500,6700,5951,6065, 3693,5952,5089,4366,4918,6701,6231,5548,6232,6702,6438,4704,5434,6703,6704,5953, 4168,6705,5680,3420,6706,5242,4407,6066,3812,5757,5090,5954,4672,4525,3481,5681, 4618,5395,5354,5316,5955,6439,4962,6707,4526,6440,3465,4673,6067,6441,5682,6708, 5435,5492,5758,5683,4619,4571,4674,4804,4893,4686,5493,4753,6233,6068,4269,6442, 6234,5032,4705,5146,5243,5208,5848,6235,6443,4963,5033,4640,4226,6236,5849,3387, 6444,6445,4436,4437,5850,4843,5494,4785,4894,6709,4361,6710,5091,5956,3331,6237, 4987,5549,6069,6711,4342,3517,4473,5317,6070,6712,6071,4706,6446,5017,5355,6713, 6714,4988,5436,6447,4734,5759,6715,4735,4547,4456,4754,6448,5851,6449,6450,3547, 5852,5318,6451,6452,5092,4205,6716,6238,4620,4219,5611,6239,6072,4481,5760,5957, 5958,4059,6240,6453,4227,4537,6241,5761,4030,4186,5244,5209,3761,4457,4876,3337, 5495,5181,6242,5959,5319,5612,5684,5853,3493,5854,6073,4169,5613,5147,4895,6074, 5210,6717,5182,6718,3830,6243,2798,3841,6075,6244,5855,5614,3604,4606,5496,5685, 5118,5356,6719,6454,5960,5357,5961,6720,4145,3935,4621,5119,5962,4261,6721,6455, 4786,5963,4375,4582,6245,6246,6247,6076,5437,4877,5856,3376,4380,6248,4160,6722, 5148,6456,5211,6457,6723,4718,6458,6724,6249,5358,4044,3297,6459,6250,5857,5615, 5497,5245,6460,5498,6725,6251,6252,5550,3793,5499,2959,5396,6461,6462,4572,5093, 5500,5964,3806,4146,6463,4426,5762,5858,6077,6253,4755,3967,4220,5965,6254,4989, 5501,6464,4352,6726,6078,4764,2290,5246,3906,5438,5283,3767,4964,2861,5763,5094, 6255,6256,4622,5616,5859,5860,4707,6727,4285,4708,4824,5617,6257,5551,4787,5212, 4965,4935,4687,6465,6728,6466,5686,6079,3494,4413,2995,5247,5966,5618,6729,5967, 5764,5765,5687,5502,6730,6731,6080,5397,6467,4990,6258,6732,4538,5060,5619,6733, 4719,5688,5439,5018,5149,5284,5503,6734,6081,4607,6259,5120,3645,5861,4583,6260, 4584,4675,5620,4098,5440,6261,4863,2379,3306,4585,5552,5689,4586,5285,6735,4864, 6736,5286,6082,6737,4623,3010,4788,4381,4558,5621,4587,4896,3698,3161,5248,4353, 4045,6262,3754,5183,4588,6738,6263,6739,6740,5622,3936,6741,6468,6742,6264,5095, 6469,4991,5968,6743,4992,6744,6083,4897,6745,4256,5766,4307,3108,3968,4444,5287, 3889,4343,6084,4510,6085,4559,6086,4898,5969,6746,5623,5061,4919,5249,5250,5504, 5441,6265,5320,4878,3242,5862,5251,3428,6087,6747,4237,5624,5442,6266,5553,4539, 6748,2585,3533,5398,4262,6088,5150,4736,4438,6089,6267,5505,4966,6749,6268,6750, 6269,5288,5554,3650,6090,6091,4624,6092,5690,6751,5863,4270,5691,4277,5555,5864, 6752,5692,4720,4865,6470,5151,4688,4825,6753,3094,6754,6471,3235,4653,6755,5213, 5399,6756,3201,4589,5865,4967,6472,5866,6473,5019,3016,6757,5321,4756,3957,4573, 6093,4993,5767,4721,6474,6758,5625,6759,4458,6475,6270,6760,5556,4994,5214,5252, 6271,3875,5768,6094,5034,5506,4376,5769,6761,2120,6476,5253,5770,6762,5771,5970, 3990,5971,5557,5558,5772,6477,6095,2787,4641,5972,5121,6096,6097,6272,6763,3703, 5867,5507,6273,4206,6274,4789,6098,6764,3619,3646,3833,3804,2394,3788,4936,3978, 4866,4899,6099,6100,5559,6478,6765,3599,5868,6101,5869,5870,6275,6766,4527,6767) # flake8: noqa PK[[ +site-packages/chardet/universaldetector.pycnu[ jRc@sddlmZddlZddlZddlmZddlmZddlm Z ddl m Z ddl Z dZ d ZdZd Zd d d YZdS(i(t constantsiN(t Latin1Prober(tMBCSGroupProber(tSBCSGroupProber(tEscCharSetProberg?iitUniversalDetectorcBs,eZdZdZdZdZRS(cCsDtjd|_tjd|_d|_g|_|jdS(Ns[-]s(|~{)(tretcompilet_highBitDetectort _escDetectortNonet_mEscCharSetProbert_mCharSetProberstreset(tself((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyt__init__-s   cCsidd6dd6|_t|_t|_t|_t|_d|_ |j r]|j j nx|j D]}|j qgWdS(Ntencodinggt confidencet( R tresulttFalsetdonetTruet_mStartt _mGotDatat ePureAsciit _mInputStatet _mLastCharR R R (Rtprober((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyR 4s      cCs|jr dSt|}|s#dS|jsd|d tjkrYidd6dd6|_qd|d tjkridd6dd6|_qd|d tjkridd6dd6|_qd|d d krid d6dd6|_qd|d d krid d6dd6|_qd|d tjkr4idd6dd6|_qd|d tj krdidd6dd6|_qdnt |_|jdr|jddkrt |_dS|j t kr|j j|rt|_ q|j t kr|jj|j|rt|_ qn|d|_|j tkr|js2t|_n|jj|tjkri|jjd6|jjd6|_t |_qn|j tkr|jstttg|_nx\|jD]N}|j|tjkri|jd6|jd6|_t |_PqqWndS(NisUTF-8Rg?RisUTF-32LEsUTF-32BEssX-ISO-10646-UCS-4-3412tsX-ISO-10646-UCS-4-2143isUTF-16LEsUTF-16BEgi(RtlenRtcodecstBOMRt BOM_UTF32_LEt BOM_UTF32_BEtBOM_LEtBOM_BERRRRtsearcht eHighbyteR Rt eEscAsciiR RtfeedRteFoundIttget_charset_nametget_confidenceR RRR(RtaBuftaLenR((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyR(@sh            cCs|jr dS|js6tjr2tjjdndSt|_|jt krlidd6dd6|_ |j S|jt krd}d}d}xD|j D]9}|sqn|j}||kr|}|}qqW|r|tkri|jd6|jd6|_ |j Sntjr|tjjdxM|j djD]8}|sOq=ntjjd |j|jfq=WndS( Nsno data received! tasciiRg?Rgs"no probers hit minimum threshhold is%s confidence = %s (RRRt_debugtsyststderrtwriteRRRRR&R R R+tMINIMUM_THRESHOLDR*tmProbers(RtproberConfidencetmaxProberConfidencet maxProberR((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pytclosesB           (t__name__t __module__RR R(R8(((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyR,s  F((RRR0Rt latin1proberRtmbcsgroupproberRtsbcsgroupproberRt escproberRRR3RR'R&R(((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyts   PK[i,$site-packages/chardet/utf8prober.pyonu[ ۝Rc@s`ddlmZddlmZddlmZddlmZdZdefdYZ dS( i(t constants(t CharSetProber(tCodingStateMachine(t UTF8SMModelg?t UTF8ProbercBs5eZdZdZdZdZdZRS(cCs*tj|tt|_|jdS(N(Rt__init__RRt _mCodingSMtreset(tself((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyR%s cCs'tj||jjd|_dS(Ni(RRRt _mNumOfMBChar(R((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyR*s  cCsdS(Nsutf-8((R((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pytget_charset_name/scCsx|D]}|jj|}|tjkr>tj|_Pq|tjkr]tj|_Pq|tjkr|jj dkr|j d7_ qqqW|j tj kr|j tjkrtj|_qn|j S(Nii(Rt next_stateRteErrorteNotMet_mStateteItsMeteFoundItteStarttget_current_charlenR t get_statet eDetectingtget_confidencetSHORTCUT_THRESHOLD(RtaBuftct codingState((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pytfeed2s   cCsLd}|jdkrDx$td|jD]}|t}q(Wd|S|SdS(NgGz?iig?(R tranget ONE_CHAR_PROB(Rtunliketi((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyREs (t__name__t __module__RRR RR(((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyR$s     N( tRt charsetproberRtcodingstatemachineRtmbcssmRRR(((s6/usr/lib/python2.7/site-packages/chardet/utf8prober.pyts PK[&$site-packages/chardet/cp949prober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCKRDistributionAnalysis from .mbcssm import CP949SMModel class CP949Prober(MultiByteCharSetProber): def __init__(self): MultiByteCharSetProber.__init__(self) self._mCodingSM = CodingStateMachine(CP949SMModel) # NOTE: CP949 is a superset of EUC-KR, so the distribution should be # not different. self._mDistributionAnalyzer = EUCKRDistributionAnalysis() self.reset() def get_charset_name(self): return "CP949" PK[uBOO'site-packages/chardet/charsetprober.pycnu[ ۝Rc@s3ddlmZddlZdddYZdS(i(t constantsiNt CharSetProbercBsYeZdZdZdZdZdZdZdZdZ dZ RS( cCsdS(N((tself((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyt__init__"scCstj|_dS(N(Rt eDetectingt_mState(R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytreset%scCsdS(N(tNone(R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytget_charset_name(scCsdS(N((RtaBuf((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfeed+scCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyt get_state.scCsdS(Ng((R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytget_confidence1scCstjdd|}|S(Ns([-])+t (tretsub(RR ((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfilter_high_bit_only4scCstjdd|}|S(Ns ([A-Za-z])+R (RR(RR ((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfilter_without_english_letters8scCs|S(N((RR ((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfilter_with_english_letters<s( t__name__t __module__RRRR R R RRR(((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyR!s        ((tRRR(((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyts PK[; )site-packages/chardet/sbcharsetprober.pyonu[ ۝Rc@sddlZddlmZddlmZddlmZdZdZdZ d Z d Z d Z e dZ d efd YZdS(iNi(t constants(t CharSetProber(twrap_ordi@igffffff?g?iitSingleByteCharSetProbercBs;eZeddZdZdZdZdZRS(cCs6tj|||_||_||_|jdS(N(Rt__init__t_mModelt _mReversedt _mNameProbertreset(tselftmodeltreversedt nameProber((s;/usr/lib/python2.7/site-packages/chardet/sbcharsetprober.pyR-s     cCsEtj|d|_dgt|_d|_d|_d|_dS(Nii(RRt _mLastOrdertNUMBER_OF_SEQ_CATt _mSeqCounterst _mTotalSeqst _mTotalChart _mFreqChar(R ((s;/usr/lib/python2.7/site-packages/chardet/sbcharsetprober.pyR6s     cCs%|jr|jjS|jdSdS(Nt charsetName(Rtget_charset_nameR(R ((s;/usr/lib/python2.7/site-packages/chardet/sbcharsetprober.pyR@s  cCs|jds|j|}nt|}|s;|jSx|D]}|jdt|}|tkr}|jd7_n|tkr|jd7_|j tkr|j d7_ |j s|j t|}|jd|}n"|t|j }|jd|}|j |cd7s  PK[b $site-packages/chardet/sjisprober.pycnu[ jRc@sddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z d efd YZ dS( iNi(tMultiByteCharSetProber(tCodingStateMachine(tSJISDistributionAnalysis(tSJISContextAnalysis(t SJISSMModel(t constantst SJISProbercBs5eZdZdZdZdZdZRS(cCsBtj|tt|_t|_t|_|j dS(N( Rt__init__RRt _mCodingSMRt_mDistributionAnalyzerRt_mContextAnalyzertreset(tself((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR&s    cCstj||jjdS(N(RR R (R ((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR -s cCsdS(Nt SHIFT_JIS((R ((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pytget_charset_name1scCst|}x`td|D]O}|jj||}|tjkrtjr{tjj |j dt |dntj |_ Pq|tjkrtj|_ Pq|tjkr|jj}|dkr|d|jd<|jj|jd|||jj|j|qk|jj||d||d|!||jj||d|d!|qqW||d|jd<|jtjkr|jjr|jtjkrtj|_ qn|jS(Nis prober hit error at byte s iii(tlentrangeRt next_stateRteErrort_debugtsyststderrtwriteRtstrteNotMet_mStateteItsMeteFoundItteStarttget_current_charlent _mLastCharR tfeedR t get_statet eDetectingtgot_enough_datatget_confidencetSHORTCUT_THRESHOLD(R taBuftaLentit codingStatetcharLen((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR4s:   "   cCs+|jj}|jj}t||S(N(R R#R tmax(R tcontxtCft distribCf((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR#Xs(t__name__t __module__RR RRR#(((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR%s     $(RtmbcharsetproberRtcodingstatemachineRtchardistributionRtjpcntxRtmbcssmRtRR(((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyts PK[,ZZ#site-packages/chardet/euckrfreq.pycnu[ ۝Rc&"@sdZdZd("Zd'"S()"g@i0 i iixitiiiiHiaiiiii+iiWiuiihii]iiiiiiiiiiiviwiiiiimiFi!ipii iiiiiiixii/iiiiiiiii9iiiitii-iyiiKiiiiiiiiOiiniiiiiii0iii<i4i{iiiiiiiiiriiiiiiiiiiiiXiXiiiiiYiii&iiPiiiiiiii^iiiiiiii9iiiiiiiQii"iitiiiiii]i{i7iiii{ii;iiuiizi/ii|iiiii7iii.iiiiiiiiiiiiii{iiii#i|i}ii~iiti8ii_i i i i i i!iiii_iiiiiii*iiuii`i"iii|iiiiiiiaiiiiiii?iiRi!i i/iii!i"i=iii#ii$i%i&i'i(i)i,ii'ibi$i*ii+ii-ii,iiiiii&iUiii#iii-i.i'iiifi/isii0iiiiii ii9iei[i1iiiiZiii:iiii2i3iiGiiiiyi4iiii5i6i7i,iwiiisi8iii9i:iii~i;ii<i;i}i=i>i?ioi)iii@iiAiBiii2iYiCiDii<iEiFiGiHiIi%iJiKiLiMiNiOii`i>iPii=iQiiRiiSiTi;iiiii iUiiViWiXi4iYiiiZi[ii\i]iii^iii_i"iPiii`i;ii~iHiaiiviizi?iiiibiii<icididieifici0iidiigiyiiihiiisi0iji=ikiiliiii<ibiiiUi iiiiIiminioiipiqirisitiuiiiii6iviwii*ii]ixiyiiiziZii-i:iibi i{i|ii&i'iii5iiii>i}i~iwiigiiii6ii%iii(iiviiiiwiiiiiEiiiiiiiiiifiiVii7iiiiiBiiNii[ii'iiiiiiiiSiiiiiieiiixiiiiiiiiiiiiiiiiiiiiii?iiiiiqiifii(i)iii~ii\iiiiii)iiiiiiiiiiii$iiiiiiiliiiii~iiiCiiiii@iiiiii2iiiKiiziViiiiiiQirifiiiiii ihi+i3ii1ii iiiiigi(iiiiziiiiiiiiiiiiiiiiiiAii<ijiiiMigii2iiiiiiiiiiVihiiiJiii0iiibiiiiiiiiiiYiiiiiiiai!i*iiiiiiKiDi8iiRiiBii@iiiiiiiiyiiiiiiXi:iii#iiiiiiiGiiikiii=iiiii!iiiiJiii=iiii}iiijiiiiiiiiiiiiiEiiiiiijiOi4iiiiiiiiii ivi]iiCiiiiiiiioiiiii iiiiliciAiiiiiiiiiiTiiikiiiiiii3i*iiqiii>iiiiiii+iiiiii;iipiixiiiii iiiii ii i ii i iiiiiliiiiiii)iiiiimi8iiiDiiiii iiiiiiii7iLiBiiiDiiiiiitiiii i!i i"i#i$i%iRi&i'i(i)i*ii+i,ii,i-i.imii i^i/iciiEiiiiaimi0iEi1i2i3iiii4iTiiii5iiiii6i7iiniiioi8i9iFiiii:iGi;i<i=i>i?i@iAiBiCiDiEi$iFiGiii%iiipiHiIiJiKiLiiiiiiiiMiNiOiPiQiRiiiSi/iTiiUiiiiViiIiHiiiiiiWiiXiiqiYiZi[i\iiriisi]i^i_i`i iviLiaiii.iibiFi>iiijiciZiiiBi6ii`idieiii|iifiii5igiihiiiiHiijiiikiilii1iminioipiqiriCisitiuiviwiixiyizi{iii|i}i~iiiiiiiiiOiiiiiiiiiiiiiEiiiqiiiIii\ii-iiiSiiii iieiiiiliiMiiiQiiPiii^ii i-iFiiiiiiiiiiiiiiiiiii i.iitiiiiiJiiiiiiiigiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuiiii9i iiii ii$iiiiii5i%iikiLiiiiiiiiiiiAiiiiiiiiiiRiiuiiiiii)iii:iiiiiiii"i$iviiiiciZiiiiiii*iWiiKiiLii+iiiiiiiiii iBiii?iiiiiiiiiiMi[i5iiiiniiiiiiCii'iiiiiiiii iiii iiiiiiiiFiTi/iiiiii8iiuiiiiKii(iMiiiiiiiiiiiiiiiTii?iiiiiiiiei i(iiiiiii%i0iiiiOii i8i i i i i iiii i i iii#iii iiiVi iiiPi i iMiWii ii ii|i i iSiiiiiiii i iii i i i i i ii i ii9iDiiiiiii i3iii i i i{i iii i i ii iiiiii! ikiiiiiNiiYii" i# i$ i% i& i' i( i]i) i* i+ i, i- i. ii/ iii>iiii1 iiiii\ii2 ii3 iii4 i5 i6 iwi7 ii8 ii3iiii9 i: iLi iii; ii< iiiiiii iiii= iiJi> i? i@ iiA iiB iC iD iiE iiiF iG iH iI iiiiiiiJ iK iiiL iM iN iiIiO iP iiQ iR iS iiT iiU iV iW iX iiY iZ i[ i\ i] iii^ i_ i` ia iiib ic id ie iiif ig iUiixi ih iiii ij iiii4i&iiii!iiiiSiyi iii"i ii#ik iil im in iiiipiQii.io iUiiOiip iiq ir is ixit iiu iv iw iii$ix iiy ii`iz i{ i| i} ii~ i i i i i i i iiCiiiii%iyiiioi ii i i i i i ii i i i iii iii i ii@iii iGi iiii2iiiii i i i iNi i iiiii i i i i iri iiziniiiiPi i#i i&iQi iimi iciii i'i iwi i ii(ili@iiii)ii*i i i i ii i i i iii iii i i iHii i ii iii i i ii i iri iiiAi iiiii i}i,iii:iiiii iiIi iNii1i iWiiiiiiii i+i i i1iibii iqi i,i iiieiii_iidi i i i i i iii2iiii ii i i i ii ii i ii-i iii i i i i i ii i i i i i ii ii i iii7i ii ii i i i i i i iiiiiiiii,iGiiii ii^i i i.i iigii ii i i iii iiii_ii i i iiihihii{i i|iiii3i i i iii i i i\iiiii i i i i i i ii i i i iiii iji iiii4ii i i i i i iii i i i ii6idii/i i iiiioi iiRiiii i&i ikiniziiiii ii iiiXiidiiSii}i i}iii~iiiii i! iNi" iiiiiii# iiisi$ i% i& ifiDii1i' iii( i@i) i^iiii* ii+ i, i- i. i/ iJi+i0 i1 i2 iiTii3 i4 i5 i6 ii7 iAi.iiii8 i9 ii"i: i; ii< i= i> iii0i? ii@ iiA iB iiC iD iE iF iG iii_i[iH iI iii`iaiJ iiiiiK iL iM iN iiO iiiiiiiP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i iipi i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i iUi i i i i i i i i i i i i i i i i i i i i i i i1i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i i) i* i+ i, ii- i. ii/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: iVi2i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir i3is it iu iv iw ix iy iz i{ i| i} i~ i ii i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i ii i4i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i iii i i i i i i i i i i i i i ii i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i! i" i# i$ ii% i& i' i( i) ii* i+ i, i- iWi. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih i5ii ij ik il im in io ip iq ir is it iu iiv iw i6ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i7i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i8i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV i9iW iX iY iZ i[ i:i\ i] i^ iii_ i` ia ib ic id ie if ig iih ii ij i;ik il im in io iip iq ir is it iu iv iw ix iy iz i{ i| i} i~ ii i i i i iii i i!i i i i"i i i i i i#i i i i i i$i i i i i i i i i i i i i i<i i i i i i ii i i i i i i%i i=i i i i i i i i i i i i i>i i i i i i&i?i i i i'i i(i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i)i i i*i iiiiiiiiii i i i i iiiiiiii+iiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i,i.i/i-i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHi.iIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiiyizi{i|i/ii}i~iiiiiii0iiiiiiiiiiiiiiiiiiiiiiiiiiiiii@iiiiiiiiiiii1iiiiiiiiiii2iiiiiiiiiiiiiAiiiiiiiiiiiiiiiiiiBi3iii4iiiiiiiiiiCiiiiii5iiiiiiiiiii6iii7iDiiiiiiii8iii9iiiiiiiiiiiiiEiiiii i i i i iiiiii:iiiiiiiiiiii;iii i!i<i"i#i$i%i&i'i(i)i*i+i,i-i.i=i/i0i1i2i3i4i5i6i7i>i8i9i:i?i@i;iFi<iGi=i>iHi?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiiUiViWiXiYiZi[ii\iAi]i^i_i`iaibicidieifigiBihiiijikiliCiminioipiqirisitiuiviwixiyizi{i|i}iDi~iiiiiiiiiiiiIiiiiiiiiiiiiiiiJiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiiiiiiiiiiEiiiiiiiiiiiiiiiiiiiiiFiiiiiGiiiiiiiiiiiiiiiiHiiiiiiiiiiIiiiiiiiiiiiiiiiiii i i i ii iiiiiiiiiiiiiiiiiiiiJi i!i"i#i$i%i&i'i(i)iLi*i+i,i-i.i/i0iKi1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{iLi|i}i~iiiiiiMiiMiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiQi i i i i iRiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iSiAiBiCiDiEiFiGiHiIiXiJiKiLiMiNiTiOiPiQiRiSiTiUiViWiXiYiZiii[i\i]i^i_i`iaibicidieifigiOihiiijikiliminioipiqiUirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiViiiiWiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiXiiiiiiYiiiiiiiiiZiiiiiiiiiiii[iiiiiiiiiiiiiiiiiiiii\ii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)iQi*i+i,i-i.i/i0i1i2i3i4i5iRi6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJi]iKiLiMiNiOi^iPiQiRiSiiTiUiViYiWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii_ii`iiiiiiiiiaiiiiiiiiiiiiSiiiiiiiiiiiiiiibiiiiiiiiiiiciiiiiiiiiiiidiiiiiiiiiiiiiiiiiieiiiifiiiiiiiiiigiiiiiiiiiiiiiiii5iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiihiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/iji0i1i2iTi3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCikiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiliuiviwiximiyizini{i|i}i~iiiiiiiiiiiiiiiioiipiiiiiii6iiiiiiiiiiiiiiiiiUiiiiiiiiiiiiqiiiiiiiViiiiiiiiiiiriiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiitiiiiiiiiiWiiiiiiiiiii iui i i i iiiiiiiiiiiiiiiiiXiiviiYi i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:iZi;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiwiOiPiQiRixiSiTiUiVi[iWi\iXiYiZi[i]i\i]i^i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiyiiiiiziiiiiii_iiiiiiiiiiiiiiiiiiiiiiiiiiii{iiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiii`iiiiiiiiiiiiiiiiiiiiiiii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i~i%i&i'i(ii)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifiigihiiijikilimiinioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaiiiiiiiiiiiiiiiiiiiiiiiZiiiiiiiiiiiiiiiiiiiiiiibiiiiiiiiiiiiiiiiiiiiiiiciiiiiiiiiiiiiiiiiiiiidiiiiiii i i i i iiiiiei iiiiiiiiiiiiiiii i!i"i#i$ii%ii&i'i(i)i*i+i,i-i.ii/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiiCiDiEiFiGiHiIiiJiKiLiMiNiiOiPiQiRifiSiTiUiViWiXiYiZi[i\i]ii^i_iii`iaibicidieifigihiiiijikiliminioipiiqirisitiuiviwigixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihiiiiiiiiiiiiiiiiiiii[i\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/ii0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iiiAiiBiCiDiEiFiGiHiIiiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]iii^iji_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)ii*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikilimiinioipiqirisitiuiviwiixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&ii'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiliiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEimiFiGiHiIiJiKiLiMiNiOiPiniiQiRiSiTiUiViiWiXiYiZioi[i\i]i^i_i`iaibicidieipifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|ii}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiriMiNiOiPiQiRiSiTiUiViWiXiiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'isi(i)i*i+i,i-ii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"N(&"i iixitiiiiHiaiiiii+iiWiuiihii]iiiiiiiiiiiviwiiiiimiFi!ipii iiiiiiixii/iiiiiiiii9iiiitii-iyiiKiiiiiiiiOiiniiiiiii0iii<i4i{iiiiiiiiiriiiiiiiiiiiiXiXiiiiiYiii&iiPiiiiiiii^iiiiiiii9iiiiiiiQii"iitiiiiii]i{i7iiii{ii;iiuiizi/ii|iiiii7iii.iiiiiiiiiiiiii{iiii#i|i}ii~iiti8ii_i i i i i i!iiii_iiiiiii*iiuii`i"iii|iiiiiiiaiiiiiii?iiRi!i i/iii!i"i=iii#ii$i%i&i'i(i)i,ii'ibi$i*ii+ii-ii,iiiiii&iUiii#iii-i.i'iiifi/isii0iiiiii ii9iei[i1iiiiZiii:iiii2i3iiGiiiiyi4iiii5i6i7i,iwiiisi8iii9i:iii~i;ii<i;i}i=i>i?ioi)iii@iiAiBiii2iYiCiDii<iEiFiGiHiIi%iJiKiLiMiNiOii`i>iPii=iQiiRiiSiTi;iiiii iUiiViWiXi4iYiiiZi[ii\i]iii^iii_i"iPiii`i;ii~iHiaiiviizi?iiiibiii<icididieifici0iidiigiyiiihiiisi0iji=ikiiliiii<ibiiiUi iiiiIiminioiipiqirisitiuiiiii6iviwii*ii]ixiyiiiziZii-i:iibi i{i|ii&i'iii5iiii>i}i~iwiigiiii6ii%iii(iiviiiiwiiiiiEiiiiiiiiiifiiVii7iiiiiBiiNii[ii'iiiiiiiiSiiiiiieiiixiiiiiiiiiiiiiiiiiiiiii?iiiiiqiifii(i)iii~ii\iiiiii)iiiiiiiiiiii$iiiiiiiliiiii~iiiCiiiii@iiiiii2iiiKiiziViiiiiiQirifiiiiii ihi+i3ii1ii iiiiigi(iiiiziiiiiiiiiiiiiiiiiiAii<ijiiiMigii2iiiiiiiiiiVihiiiJiii0iiibiiiiiiiiiiYiiiiiiiai!i*iiiiiiKiDi8iiRiiBii@iiiiiiiiyiiiiiiXi:iii#iiiiiiiGiiikiii=iiiii!iiiiJiii=iiii}iiijiiiiiiiiiiiiiEiiiiiijiOi4iiiiiiiiii ivi]iiCiiiiiiiioiiiii iiiiliciAiiiiiiiiiiTiiikiiiiiii3i*iiqiii>iiiiiii+iiiiii;iipiixiiiii iiiii ii i ii i iiiiiliiiiiii)iiiiimi8iiiDiiiii iiiiiiii7iLiBiiiDiiiiiitiiii i!i i"i#i$i%iRi&i'i(i)i*ii+i,ii,i-i.imii i^i/iciiEiiiiaimi0iEi1i2i3iiii4iTiiii5iiiii6i7iiniiioi8i9iFiiii:iGi;i<i=i>i?i@iAiBiCiDiEi$iFiGiii%iiipiHiIiJiKiLiiiiiiiiMiNiOiPiQiRiiiSi/iTiiUiiiiViiIiHiiiiiiWiiXiiqiYiZi[i\iiriisi]i^i_i`i iviLiaiii.iibiFi>iiijiciZiiiBi6ii`idieiii|iifiii5igiihiiiiHiijiiikiilii1iminioipiqiriCisitiuiviwiixiyizi{iii|i}i~iiiiiiiiiOiiiiiiiiiiiiiEiiiqiiiIii\ii-iiiSiiii iieiiiiliiMiiiQiiPiii^ii i-iFiiiiiiiiiiiiiiiiiii i.iitiiiiiJiiiiiiiigiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuiiii9i iiii ii$iiiiii5i%iikiLiiiiiiiiiiiAiiiiiiiiiiRiiuiiiiii)iii:iiiiiiii"i$iviiiiciZiiiiiii*iWiiKiiLii+iiiiiiiiii iBiii?iiiiiiiiiiMi[i5iiiiniiiiiiCii'iiiiiiiii iiii iiiiiiiiFiTi/iiiiii8iiuiiiiKii(iMiiiiiiiiiiiiiiiTii?iiiiiiiiei i(iiiiiii%i0iiiiOii i8i i i i i iiii i i iii#iii iiiVi iiiPi i iMiWii ii ii|i i iSiiiiiiii i iii i i i i i ii i ii9iDiiiiiii i3iii i i i{i iii i i ii iiiiii! ikiiiiiNiiYii" i# i$ i% i& i' i( i]i) i* i+ i, i- i. ii/ iii>iiii0 i1 iiiii\ii2 ii3 iii4 i5 i6 iwi7 ii8 ii3iiii9 i: iLi iii; ii< iiiiiii iiii= iiJi> i? i@ iiA iiB iC iD iiE iiiF iG iH iI iiiiiiiJ iK iiiL iM iN iiIiO iP iiQ iR iS iiT iiU iV iW iX iiY iZ i[ i\ i] iii^ i_ i` ia iiib ic id ie iiif ig iUiixi ih iiii ij iiii4i&iiii!iiiiSiyi iii"i ii#ik iil im in iiiipiQii.io iUiiOiip iiq ir is ixit iiu iv iw iii$ix iiy ii`iz i{ i| i} ii~ i i i i i i i iiCiiiii%iyiiioi ii i i i i i ii i i i iii iii i ii@iii iGi iiii2iiiii i i i iNi i iiiii i i i i iri iiziniiiiPi i#i i&iQi iimi iciii i'i iwi i ii(ili@iiii)ii*i i i i ii i i i iii iii i i iHii i ii iii i i ii i iri iiiAi iiiii i}i,iii:iiiii iiIi iNii1i iWiiiiiiii i+i i i1iibii iqi i,i iiieiii_iidi i i i i i iii2iiii ii i i i ii ii i ii-i iii i i i i i ii i i i i i ii ii i iii7i ii ii i i i i i i iiiiiiiii,iGiiii ii^i i i.i iigii ii i i iii iiii_ii i i iiihihii{i i|iiii3i i i iii i i i\iiiii i i i i i i ii i i i iiii iji iiii4ii i i i i i iii i i i ii6idii/i i iiiioi iiRiiii i&i ikiniziiiii ii iiiXiidiiSii}i i}iii~iiiii i! iNi" iiiiiii# iiisi$ i% i& ifiDii1i' iii( i@i) i^iiii* ii+ i, i- i. i/ iJi+i0 i1 i2 iiTii3 i4 i5 i6 ii7 iAi.iiii8 i9 ii"i: i; ii< i= i> iii0i? ii@ iiA iB iiC iD iE iF iG iii_i[iH iI iii`iaiJ iiiiiK iL iM iN iiO iiiiiiiP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i iipi i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i iUi i i i i i i i i i i i i i i i i i i i i i i i1i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i i) i* i+ i, ii- i. ii/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: iVi2i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir i3is it iu iv iw ix iy iz i{ i| i} i~ i ii i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i ii i4i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i iii i i i i i i i i i i i i i ii i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i! i" i# i$ ii% i& i' i( i) ii* i+ i, i- iWi. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih i5ii ij ik il im in io ip iq ir is it iu iiv iw i6ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i7i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i8i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV i9iW iX iY iZ i[ i:i\ i] i^ iii_ i` ia ib ic id ie if ig iih ii ij i;ik il im in io iip iq ir is it iu iv iw ix iy iz i{ i| i} i~ ii i i i i iii i i!i i i i"i i i i i i#i i i i i i$i i i i i i i i i i i i i i<i i i i i i ii i i i i i i%i i=i i i i i i i i i i i i i>i i i i i i&i?i i i i'i i(i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i)i i i*i iiiiiiiiii i i i i iiiiiiii+iiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i,i.i/i-i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHi.iIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiiyizi{i|i/ii}i~iiiiiii0iiiiiiiiiiiiiiiiiiiiiiiiiiiiii@iiiiiiiiiiii1iiiiiiiiiii2iiiiiiiiiiiiiAiiiiiiiiiiiiiiiiiiBi3iii4iiiiiiiiiiCiiiiii5iiiiiiiiiii6iii7iDiiiiiiii8iii9iiiiiiiiiiiiiEiiiii i i i i iiiiii:iiiiiiiiiiii;iii i!i<i"i#i$i%i&i'i(i)i*i+i,i-i.i=i/i0i1i2i3i4i5i6i7i>i8i9i:i?i@i;iFi<iGi=i>iHi?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiiUiViWiXiYiZi[ii\iAi]i^i_i`iaibicidieifigiBihiiijikiliCiminioipiqirisitiuiviwixiyizi{i|i}iDi~iiiiiiiiiiiiIiiiiiiiiiiiiiiiJiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiiiiiiiiiiEiiiiiiiiiiiiiiiiiiiiiFiiiiiGiiiiiiiiiiiiiiiiHiiiiiiiiiiIiiiiiiiiiiiiiiiiii i i i ii iiiiiiiiiiiiiiiiiiiiJi i!i"i#i$i%i&i'i(i)iLi*i+i,i-i.i/i0iKi1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{iLi|i}i~iiiiiiMiiMiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiQi i i i i iRiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iSiAiBiCiDiEiFiGiHiIiXiJiKiLiMiNiTiOiPiQiRiSiTiUiViWiXiYiZiii[i\i]i^i_i`iaibicidieifigiOihiiijikiliminioipiqiUirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiViiiiWiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiXiiiiiiYiiiiiiiiiZiiiiiiiiiiii[iiiiiiiiiiiiiiiiiiiii\ii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)iQi*i+i,i-i.i/i0i1i2i3i4i5iRi6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJi]iKiLiMiNiOi^iPiQiRiSiiTiUiViYiWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii_ii`iiiiiiiiiaiiiiiiiiiiiiSiiiiiiiiiiiiiiibiiiiiiiiiiiciiiiiiiiiiiidiiiiiiiiiiiiiiiiiieiiiifiiiiiiiiiigiiiiiiiiiiiiiiii5iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiihiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/iji0i1i2iTi3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCikiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiliuiviwiximiyizini{i|i}i~iiiiiiiiiiiiiiiioiipiiiiiii6iiiiiiiiiiiiiiiiiUiiiiiiiiiiiiqiiiiiiiViiiiiiiiiiiriiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiitiiiiiiiiiWiiiiiiiiiii iui i i i iiiiiiiiiiiiiiiiiXiiviiYi i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:iZi;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiwiOiPiQiRixiSiTiUiVi[iWi\iXiYiZi[i]i\i]i^i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiyiiiiiziiiiiii_iiiiiiiiiiiiiiiiiiiiiiiiiiii{iiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiii`iiiiiiiiiiiiiiiiiiiiiiii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i~i%i&i'i(ii)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifiigihiiijikilimiinioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaiiiiiiiiiiiiiiiiiiiiiiiZiiiiiiiiiiiiiiiiiiiiiiibiiiiiiiiiiiiiiiiiiiiiiiciiiiiiiiiiiiiiiiiiiiidiiiiiii i i i i iiiiiei iiiiiiiiiiiiiiii i!i"i#i$ii%ii&i'i(i)i*i+i,i-i.ii/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiiCiDiEiFiGiHiIiiJiKiLiMiNiiOiPiQiRifiSiTiUiViWiXiYiZi[i\i]ii^i_iii`iaibicidieifigihiiiijikiliminioipiiqirisitiuiviwigixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihiiiiiiiiiiiiiiiiiiii[i\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/ii0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iiiAiiBiCiDiEiFiGiHiIiiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]iii^iji_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)ii*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikilimiinioipiqirisitiuiviwiixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&ii'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiliiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEimiFiGiHiIiJiKiLiMiNiOiPiniiQiRiSiTiUiViiWiXiYiZioi[i\i]i^i_i`iaibicidieipifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|ii}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiriMiNiOiPiQiRiSiTiUiViWiXiiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'isi(i)i*i+i,i-ii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"(t EUCKR_TYPICAL_DISTRIBUTION_RATIOtEUCKR_TABLE_SIZEtEUCKRCharToFreqOrder(((s5/usr/lib/python2.7/site-packages/chardet/euckrfreq.pyt)sHPK[b~ ~ &site-packages/chardet/latin1prober.pyonu[ ۝Rc@sddlmZddlmZddlmZdZdZdZdZ dZ dZ dZ d Z d Zd Zeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee e e e e e e e e e e e e e e e e e e e e e e e e e eeeeeee e e e e e e e e e e e e e e e e e e e e e e e e e eeeeeeeeeeeeeeee ee ee eeeeeeeeeeeeeeeee eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee e e e e e e e e e e e e e e e e e e e e e e ee e e e e e e e e e e e e e eee e e e e e e e eee e e e e ee e e e e eeefZdZd efd YZdS(i(t CharSetProber(teNotMe(twrap_ordiiiiiiiit Latin1ProbercBs5eZdZdZdZdZdZRS(cCstj||jdS(N(Rt__init__treset(tself((s8/usr/lib/python2.7/site-packages/chardet/latin1prober.pyRbs cCs*t|_dgt|_tj|dS(Ni(tOTHt_mLastCharClasst FREQ_CAT_NUMt _mFreqCounterRR(R((s8/usr/lib/python2.7/site-packages/chardet/latin1prober.pyRfs cCsdS(Ns windows-1252((R((s8/usr/lib/python2.7/site-packages/chardet/latin1prober.pytget_charset_namekscCs|j|}xh|D]`}tt|}t|jt|}|dkrZt|_Pn|j|cd7<||_qW|j S(Nii( tfilter_with_english_letterstLatin1_CharToClassRtLatin1ClassModelRt CLASS_NUMRt_mStateR t get_state(RtaBuftct charClasstfreq((s8/usr/lib/python2.7/site-packages/chardet/latin1prober.pytfeedns     cCs|jtkrdSt|j}|dkr:d}n$|jd||jdd|}|dkrsd}n|d}|S(Ng{Gz?giig4@g?(RRtsumR (Rttotalt confidence((s8/usr/lib/python2.7/site-packages/chardet/latin1prober.pytget_confidence|s     (t__name__t __module__RRR RR(((s8/usr/lib/python2.7/site-packages/chardet/latin1prober.pyRas     N(@iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(t charsetproberRt constantsRtcompatRR tUDFRtASCtASStACVtACOtASVtASORR RR(((s8/usr/lib/python2.7/site-packages/chardet/latin1prober.pytsj PK[uBOO'site-packages/chardet/charsetprober.pyonu[ ۝Rc@s3ddlmZddlZdddYZdS(i(t constantsiNt CharSetProbercBsYeZdZdZdZdZdZdZdZdZ dZ RS( cCsdS(N((tself((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyt__init__"scCstj|_dS(N(Rt eDetectingt_mState(R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytreset%scCsdS(N(tNone(R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytget_charset_name(scCsdS(N((RtaBuf((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfeed+scCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyt get_state.scCsdS(Ng((R((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytget_confidence1scCstjdd|}|S(Ns([-])+t (tretsub(RR ((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfilter_high_bit_only4scCstjdd|}|S(Ns ([A-Za-z])+R (RR(RR ((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfilter_without_english_letters8scCs|S(N((RR ((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pytfilter_with_english_letters<s( t__name__t __module__RRRR R R RRR(((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyR!s        ((tRRR(((s9/usr/lib/python2.7/site-packages/chardet/charsetprober.pyts PK[[RLLsite-packages/chardet/mbcssm.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .constants import eStart, eError, eItsMe # BIG5 BIG5_cls = ( 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as legal value 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 1,1,1,0,1,1,1,1, # 18 - 1f 1,1,1,1,1,1,1,1, # 20 - 27 1,1,1,1,1,1,1,1, # 28 - 2f 1,1,1,1,1,1,1,1, # 30 - 37 1,1,1,1,1,1,1,1, # 38 - 3f 2,2,2,2,2,2,2,2, # 40 - 47 2,2,2,2,2,2,2,2, # 48 - 4f 2,2,2,2,2,2,2,2, # 50 - 57 2,2,2,2,2,2,2,2, # 58 - 5f 2,2,2,2,2,2,2,2, # 60 - 67 2,2,2,2,2,2,2,2, # 68 - 6f 2,2,2,2,2,2,2,2, # 70 - 77 2,2,2,2,2,2,2,1, # 78 - 7f 4,4,4,4,4,4,4,4, # 80 - 87 4,4,4,4,4,4,4,4, # 88 - 8f 4,4,4,4,4,4,4,4, # 90 - 97 4,4,4,4,4,4,4,4, # 98 - 9f 4,3,3,3,3,3,3,3, # a0 - a7 3,3,3,3,3,3,3,3, # a8 - af 3,3,3,3,3,3,3,3, # b0 - b7 3,3,3,3,3,3,3,3, # b8 - bf 3,3,3,3,3,3,3,3, # c0 - c7 3,3,3,3,3,3,3,3, # c8 - cf 3,3,3,3,3,3,3,3, # d0 - d7 3,3,3,3,3,3,3,3, # d8 - df 3,3,3,3,3,3,3,3, # e0 - e7 3,3,3,3,3,3,3,3, # e8 - ef 3,3,3,3,3,3,3,3, # f0 - f7 3,3,3,3,3,3,3,0 # f8 - ff ) BIG5_st = ( eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,#08-0f eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart#10-17 ) Big5CharLenTable = (0, 1, 1, 2, 0) Big5SMModel = {'classTable': BIG5_cls, 'classFactor': 5, 'stateTable': BIG5_st, 'charLenTable': Big5CharLenTable, 'name': 'Big5'} # CP949 CP949_cls = ( 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,0,0, # 00 - 0f 1,1,1,1,1,1,1,1, 1,1,1,0,1,1,1,1, # 10 - 1f 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 20 - 2f 1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1, # 30 - 3f 1,4,4,4,4,4,4,4, 4,4,4,4,4,4,4,4, # 40 - 4f 4,4,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 50 - 5f 1,5,5,5,5,5,5,5, 5,5,5,5,5,5,5,5, # 60 - 6f 5,5,5,5,5,5,5,5, 5,5,5,1,1,1,1,1, # 70 - 7f 0,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 80 - 8f 6,6,6,6,6,6,6,6, 6,6,6,6,6,6,6,6, # 90 - 9f 6,7,7,7,7,7,7,7, 7,7,7,7,7,8,8,8, # a0 - af 7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7, # b0 - bf 7,7,7,7,7,7,9,2, 2,3,2,2,2,2,2,2, # c0 - cf 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # d0 - df 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,2, # e0 - ef 2,2,2,2,2,2,2,2, 2,2,2,2,2,2,2,0, # f0 - ff ) CP949_st = ( #cls= 0 1 2 3 4 5 6 7 8 9 # previous state = eError,eStart, 3,eError,eStart,eStart, 4, 5,eError, 6, # eStart eError,eError,eError,eError,eError,eError,eError,eError,eError,eError, # eError eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe, # eItsMe eError,eError,eStart,eStart,eError,eError,eError,eStart,eStart,eStart, # 3 eError,eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 4 eError,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart,eStart, # 5 eError,eStart,eStart,eStart,eStart,eError,eError,eStart,eStart,eStart, # 6 ) CP949CharLenTable = (0, 1, 2, 0, 1, 1, 2, 2, 0, 2) CP949SMModel = {'classTable': CP949_cls, 'classFactor': 10, 'stateTable': CP949_st, 'charLenTable': CP949CharLenTable, 'name': 'CP949'} # EUC-JP EUCJP_cls = ( 4,4,4,4,4,4,4,4, # 00 - 07 4,4,4,4,4,4,5,5, # 08 - 0f 4,4,4,4,4,4,4,4, # 10 - 17 4,4,4,5,4,4,4,4, # 18 - 1f 4,4,4,4,4,4,4,4, # 20 - 27 4,4,4,4,4,4,4,4, # 28 - 2f 4,4,4,4,4,4,4,4, # 30 - 37 4,4,4,4,4,4,4,4, # 38 - 3f 4,4,4,4,4,4,4,4, # 40 - 47 4,4,4,4,4,4,4,4, # 48 - 4f 4,4,4,4,4,4,4,4, # 50 - 57 4,4,4,4,4,4,4,4, # 58 - 5f 4,4,4,4,4,4,4,4, # 60 - 67 4,4,4,4,4,4,4,4, # 68 - 6f 4,4,4,4,4,4,4,4, # 70 - 77 4,4,4,4,4,4,4,4, # 78 - 7f 5,5,5,5,5,5,5,5, # 80 - 87 5,5,5,5,5,5,1,3, # 88 - 8f 5,5,5,5,5,5,5,5, # 90 - 97 5,5,5,5,5,5,5,5, # 98 - 9f 5,2,2,2,2,2,2,2, # a0 - a7 2,2,2,2,2,2,2,2, # a8 - af 2,2,2,2,2,2,2,2, # b0 - b7 2,2,2,2,2,2,2,2, # b8 - bf 2,2,2,2,2,2,2,2, # c0 - c7 2,2,2,2,2,2,2,2, # c8 - cf 2,2,2,2,2,2,2,2, # d0 - d7 2,2,2,2,2,2,2,2, # d8 - df 0,0,0,0,0,0,0,0, # e0 - e7 0,0,0,0,0,0,0,0, # e8 - ef 0,0,0,0,0,0,0,0, # f0 - f7 0,0,0,0,0,0,0,5 # f8 - ff ) EUCJP_st = ( 3, 4, 3, 5,eStart,eError,eError,eError,#00-07 eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f eItsMe,eItsMe,eStart,eError,eStart,eError,eError,eError,#10-17 eError,eError,eStart,eError,eError,eError, 3,eError,#18-1f 3,eError,eError,eError,eStart,eStart,eStart,eStart#20-27 ) EUCJPCharLenTable = (2, 2, 2, 3, 1, 0) EUCJPSMModel = {'classTable': EUCJP_cls, 'classFactor': 6, 'stateTable': EUCJP_st, 'charLenTable': EUCJPCharLenTable, 'name': 'EUC-JP'} # EUC-KR EUCKR_cls = ( 1,1,1,1,1,1,1,1, # 00 - 07 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 1,1,1,0,1,1,1,1, # 18 - 1f 1,1,1,1,1,1,1,1, # 20 - 27 1,1,1,1,1,1,1,1, # 28 - 2f 1,1,1,1,1,1,1,1, # 30 - 37 1,1,1,1,1,1,1,1, # 38 - 3f 1,1,1,1,1,1,1,1, # 40 - 47 1,1,1,1,1,1,1,1, # 48 - 4f 1,1,1,1,1,1,1,1, # 50 - 57 1,1,1,1,1,1,1,1, # 58 - 5f 1,1,1,1,1,1,1,1, # 60 - 67 1,1,1,1,1,1,1,1, # 68 - 6f 1,1,1,1,1,1,1,1, # 70 - 77 1,1,1,1,1,1,1,1, # 78 - 7f 0,0,0,0,0,0,0,0, # 80 - 87 0,0,0,0,0,0,0,0, # 88 - 8f 0,0,0,0,0,0,0,0, # 90 - 97 0,0,0,0,0,0,0,0, # 98 - 9f 0,2,2,2,2,2,2,2, # a0 - a7 2,2,2,2,2,3,3,3, # a8 - af 2,2,2,2,2,2,2,2, # b0 - b7 2,2,2,2,2,2,2,2, # b8 - bf 2,2,2,2,2,2,2,2, # c0 - c7 2,3,2,2,2,2,2,2, # c8 - cf 2,2,2,2,2,2,2,2, # d0 - d7 2,2,2,2,2,2,2,2, # d8 - df 2,2,2,2,2,2,2,2, # e0 - e7 2,2,2,2,2,2,2,2, # e8 - ef 2,2,2,2,2,2,2,2, # f0 - f7 2,2,2,2,2,2,2,0 # f8 - ff ) EUCKR_st = ( eError,eStart, 3,eError,eError,eError,eError,eError,#00-07 eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,eStart #08-0f ) EUCKRCharLenTable = (0, 1, 2, 0) EUCKRSMModel = {'classTable': EUCKR_cls, 'classFactor': 4, 'stateTable': EUCKR_st, 'charLenTable': EUCKRCharLenTable, 'name': 'EUC-KR'} # EUC-TW EUCTW_cls = ( 2,2,2,2,2,2,2,2, # 00 - 07 2,2,2,2,2,2,0,0, # 08 - 0f 2,2,2,2,2,2,2,2, # 10 - 17 2,2,2,0,2,2,2,2, # 18 - 1f 2,2,2,2,2,2,2,2, # 20 - 27 2,2,2,2,2,2,2,2, # 28 - 2f 2,2,2,2,2,2,2,2, # 30 - 37 2,2,2,2,2,2,2,2, # 38 - 3f 2,2,2,2,2,2,2,2, # 40 - 47 2,2,2,2,2,2,2,2, # 48 - 4f 2,2,2,2,2,2,2,2, # 50 - 57 2,2,2,2,2,2,2,2, # 58 - 5f 2,2,2,2,2,2,2,2, # 60 - 67 2,2,2,2,2,2,2,2, # 68 - 6f 2,2,2,2,2,2,2,2, # 70 - 77 2,2,2,2,2,2,2,2, # 78 - 7f 0,0,0,0,0,0,0,0, # 80 - 87 0,0,0,0,0,0,6,0, # 88 - 8f 0,0,0,0,0,0,0,0, # 90 - 97 0,0,0,0,0,0,0,0, # 98 - 9f 0,3,4,4,4,4,4,4, # a0 - a7 5,5,1,1,1,1,1,1, # a8 - af 1,1,1,1,1,1,1,1, # b0 - b7 1,1,1,1,1,1,1,1, # b8 - bf 1,1,3,1,3,3,3,3, # c0 - c7 3,3,3,3,3,3,3,3, # c8 - cf 3,3,3,3,3,3,3,3, # d0 - d7 3,3,3,3,3,3,3,3, # d8 - df 3,3,3,3,3,3,3,3, # e0 - e7 3,3,3,3,3,3,3,3, # e8 - ef 3,3,3,3,3,3,3,3, # f0 - f7 3,3,3,3,3,3,3,0 # f8 - ff ) EUCTW_st = ( eError,eError,eStart, 3, 3, 3, 4,eError,#00-07 eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eStart,eError,#10-17 eStart,eStart,eStart,eError,eError,eError,eError,eError,#18-1f 5,eError,eError,eError,eStart,eError,eStart,eStart,#20-27 eStart,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f ) EUCTWCharLenTable = (0, 0, 1, 2, 2, 2, 3) EUCTWSMModel = {'classTable': EUCTW_cls, 'classFactor': 7, 'stateTable': EUCTW_st, 'charLenTable': EUCTWCharLenTable, 'name': 'x-euc-tw'} # GB2312 GB2312_cls = ( 1,1,1,1,1,1,1,1, # 00 - 07 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 1,1,1,0,1,1,1,1, # 18 - 1f 1,1,1,1,1,1,1,1, # 20 - 27 1,1,1,1,1,1,1,1, # 28 - 2f 3,3,3,3,3,3,3,3, # 30 - 37 3,3,1,1,1,1,1,1, # 38 - 3f 2,2,2,2,2,2,2,2, # 40 - 47 2,2,2,2,2,2,2,2, # 48 - 4f 2,2,2,2,2,2,2,2, # 50 - 57 2,2,2,2,2,2,2,2, # 58 - 5f 2,2,2,2,2,2,2,2, # 60 - 67 2,2,2,2,2,2,2,2, # 68 - 6f 2,2,2,2,2,2,2,2, # 70 - 77 2,2,2,2,2,2,2,4, # 78 - 7f 5,6,6,6,6,6,6,6, # 80 - 87 6,6,6,6,6,6,6,6, # 88 - 8f 6,6,6,6,6,6,6,6, # 90 - 97 6,6,6,6,6,6,6,6, # 98 - 9f 6,6,6,6,6,6,6,6, # a0 - a7 6,6,6,6,6,6,6,6, # a8 - af 6,6,6,6,6,6,6,6, # b0 - b7 6,6,6,6,6,6,6,6, # b8 - bf 6,6,6,6,6,6,6,6, # c0 - c7 6,6,6,6,6,6,6,6, # c8 - cf 6,6,6,6,6,6,6,6, # d0 - d7 6,6,6,6,6,6,6,6, # d8 - df 6,6,6,6,6,6,6,6, # e0 - e7 6,6,6,6,6,6,6,6, # e8 - ef 6,6,6,6,6,6,6,6, # f0 - f7 6,6,6,6,6,6,6,0 # f8 - ff ) GB2312_st = ( eError,eStart,eStart,eStart,eStart,eStart, 3,eError,#00-07 eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,#08-0f eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,eStart,#10-17 4,eError,eStart,eStart,eError,eError,eError,eError,#18-1f eError,eError, 5,eError,eError,eError,eItsMe,eError,#20-27 eError,eError,eStart,eStart,eStart,eStart,eStart,eStart #28-2f ) # To be accurate, the length of class 6 can be either 2 or 4. # But it is not necessary to discriminate between the two since # it is used for frequency analysis only, and we are validing # each code range there as well. So it is safe to set it to be # 2 here. GB2312CharLenTable = (0, 1, 1, 1, 1, 1, 2) GB2312SMModel = {'classTable': GB2312_cls, 'classFactor': 7, 'stateTable': GB2312_st, 'charLenTable': GB2312CharLenTable, 'name': 'GB2312'} # Shift_JIS SJIS_cls = ( 1,1,1,1,1,1,1,1, # 00 - 07 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 1,1,1,0,1,1,1,1, # 18 - 1f 1,1,1,1,1,1,1,1, # 20 - 27 1,1,1,1,1,1,1,1, # 28 - 2f 1,1,1,1,1,1,1,1, # 30 - 37 1,1,1,1,1,1,1,1, # 38 - 3f 2,2,2,2,2,2,2,2, # 40 - 47 2,2,2,2,2,2,2,2, # 48 - 4f 2,2,2,2,2,2,2,2, # 50 - 57 2,2,2,2,2,2,2,2, # 58 - 5f 2,2,2,2,2,2,2,2, # 60 - 67 2,2,2,2,2,2,2,2, # 68 - 6f 2,2,2,2,2,2,2,2, # 70 - 77 2,2,2,2,2,2,2,1, # 78 - 7f 3,3,3,3,3,3,3,3, # 80 - 87 3,3,3,3,3,3,3,3, # 88 - 8f 3,3,3,3,3,3,3,3, # 90 - 97 3,3,3,3,3,3,3,3, # 98 - 9f #0xa0 is illegal in sjis encoding, but some pages does #contain such byte. We need to be more error forgiven. 2,2,2,2,2,2,2,2, # a0 - a7 2,2,2,2,2,2,2,2, # a8 - af 2,2,2,2,2,2,2,2, # b0 - b7 2,2,2,2,2,2,2,2, # b8 - bf 2,2,2,2,2,2,2,2, # c0 - c7 2,2,2,2,2,2,2,2, # c8 - cf 2,2,2,2,2,2,2,2, # d0 - d7 2,2,2,2,2,2,2,2, # d8 - df 3,3,3,3,3,3,3,3, # e0 - e7 3,3,3,3,3,4,4,4, # e8 - ef 4,4,4,4,4,4,4,4, # f0 - f7 4,4,4,4,4,0,0,0 # f8 - ff ) SJIS_st = ( eError,eStart,eStart, 3,eError,eError,eError,eError,#00-07 eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f eItsMe,eItsMe,eError,eError,eStart,eStart,eStart,eStart #10-17 ) SJISCharLenTable = (0, 1, 1, 2, 0, 0) SJISSMModel = {'classTable': SJIS_cls, 'classFactor': 6, 'stateTable': SJIS_st, 'charLenTable': SJISCharLenTable, 'name': 'Shift_JIS'} # UCS2-BE UCS2BE_cls = ( 0,0,0,0,0,0,0,0, # 00 - 07 0,0,1,0,0,2,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 0,0,0,3,0,0,0,0, # 18 - 1f 0,0,0,0,0,0,0,0, # 20 - 27 0,3,3,3,3,3,0,0, # 28 - 2f 0,0,0,0,0,0,0,0, # 30 - 37 0,0,0,0,0,0,0,0, # 38 - 3f 0,0,0,0,0,0,0,0, # 40 - 47 0,0,0,0,0,0,0,0, # 48 - 4f 0,0,0,0,0,0,0,0, # 50 - 57 0,0,0,0,0,0,0,0, # 58 - 5f 0,0,0,0,0,0,0,0, # 60 - 67 0,0,0,0,0,0,0,0, # 68 - 6f 0,0,0,0,0,0,0,0, # 70 - 77 0,0,0,0,0,0,0,0, # 78 - 7f 0,0,0,0,0,0,0,0, # 80 - 87 0,0,0,0,0,0,0,0, # 88 - 8f 0,0,0,0,0,0,0,0, # 90 - 97 0,0,0,0,0,0,0,0, # 98 - 9f 0,0,0,0,0,0,0,0, # a0 - a7 0,0,0,0,0,0,0,0, # a8 - af 0,0,0,0,0,0,0,0, # b0 - b7 0,0,0,0,0,0,0,0, # b8 - bf 0,0,0,0,0,0,0,0, # c0 - c7 0,0,0,0,0,0,0,0, # c8 - cf 0,0,0,0,0,0,0,0, # d0 - d7 0,0,0,0,0,0,0,0, # d8 - df 0,0,0,0,0,0,0,0, # e0 - e7 0,0,0,0,0,0,0,0, # e8 - ef 0,0,0,0,0,0,0,0, # f0 - f7 0,0,0,0,0,0,4,5 # f8 - ff ) UCS2BE_st = ( 5, 7, 7,eError, 4, 3,eError,eError,#00-07 eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f eItsMe,eItsMe, 6, 6, 6, 6,eError,eError,#10-17 6, 6, 6, 6, 6,eItsMe, 6, 6,#18-1f 6, 6, 6, 6, 5, 7, 7,eError,#20-27 5, 8, 6, 6,eError, 6, 6, 6,#28-2f 6, 6, 6, 6,eError,eError,eStart,eStart #30-37 ) UCS2BECharLenTable = (2, 2, 2, 0, 2, 2) UCS2BESMModel = {'classTable': UCS2BE_cls, 'classFactor': 6, 'stateTable': UCS2BE_st, 'charLenTable': UCS2BECharLenTable, 'name': 'UTF-16BE'} # UCS2-LE UCS2LE_cls = ( 0,0,0,0,0,0,0,0, # 00 - 07 0,0,1,0,0,2,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 0,0,0,3,0,0,0,0, # 18 - 1f 0,0,0,0,0,0,0,0, # 20 - 27 0,3,3,3,3,3,0,0, # 28 - 2f 0,0,0,0,0,0,0,0, # 30 - 37 0,0,0,0,0,0,0,0, # 38 - 3f 0,0,0,0,0,0,0,0, # 40 - 47 0,0,0,0,0,0,0,0, # 48 - 4f 0,0,0,0,0,0,0,0, # 50 - 57 0,0,0,0,0,0,0,0, # 58 - 5f 0,0,0,0,0,0,0,0, # 60 - 67 0,0,0,0,0,0,0,0, # 68 - 6f 0,0,0,0,0,0,0,0, # 70 - 77 0,0,0,0,0,0,0,0, # 78 - 7f 0,0,0,0,0,0,0,0, # 80 - 87 0,0,0,0,0,0,0,0, # 88 - 8f 0,0,0,0,0,0,0,0, # 90 - 97 0,0,0,0,0,0,0,0, # 98 - 9f 0,0,0,0,0,0,0,0, # a0 - a7 0,0,0,0,0,0,0,0, # a8 - af 0,0,0,0,0,0,0,0, # b0 - b7 0,0,0,0,0,0,0,0, # b8 - bf 0,0,0,0,0,0,0,0, # c0 - c7 0,0,0,0,0,0,0,0, # c8 - cf 0,0,0,0,0,0,0,0, # d0 - d7 0,0,0,0,0,0,0,0, # d8 - df 0,0,0,0,0,0,0,0, # e0 - e7 0,0,0,0,0,0,0,0, # e8 - ef 0,0,0,0,0,0,0,0, # f0 - f7 0,0,0,0,0,0,4,5 # f8 - ff ) UCS2LE_st = ( 6, 6, 7, 6, 4, 3,eError,eError,#00-07 eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,#08-0f eItsMe,eItsMe, 5, 5, 5,eError,eItsMe,eError,#10-17 5, 5, 5,eError, 5,eError, 6, 6,#18-1f 7, 6, 8, 8, 5, 5, 5,eError,#20-27 5, 5, 5,eError,eError,eError, 5, 5,#28-2f 5, 5, 5,eError, 5,eError,eStart,eStart #30-37 ) UCS2LECharLenTable = (2, 2, 2, 2, 2, 2) UCS2LESMModel = {'classTable': UCS2LE_cls, 'classFactor': 6, 'stateTable': UCS2LE_st, 'charLenTable': UCS2LECharLenTable, 'name': 'UTF-16LE'} # UTF-8 UTF8_cls = ( 1,1,1,1,1,1,1,1, # 00 - 07 #allow 0x00 as a legal value 1,1,1,1,1,1,0,0, # 08 - 0f 1,1,1,1,1,1,1,1, # 10 - 17 1,1,1,0,1,1,1,1, # 18 - 1f 1,1,1,1,1,1,1,1, # 20 - 27 1,1,1,1,1,1,1,1, # 28 - 2f 1,1,1,1,1,1,1,1, # 30 - 37 1,1,1,1,1,1,1,1, # 38 - 3f 1,1,1,1,1,1,1,1, # 40 - 47 1,1,1,1,1,1,1,1, # 48 - 4f 1,1,1,1,1,1,1,1, # 50 - 57 1,1,1,1,1,1,1,1, # 58 - 5f 1,1,1,1,1,1,1,1, # 60 - 67 1,1,1,1,1,1,1,1, # 68 - 6f 1,1,1,1,1,1,1,1, # 70 - 77 1,1,1,1,1,1,1,1, # 78 - 7f 2,2,2,2,3,3,3,3, # 80 - 87 4,4,4,4,4,4,4,4, # 88 - 8f 4,4,4,4,4,4,4,4, # 90 - 97 4,4,4,4,4,4,4,4, # 98 - 9f 5,5,5,5,5,5,5,5, # a0 - a7 5,5,5,5,5,5,5,5, # a8 - af 5,5,5,5,5,5,5,5, # b0 - b7 5,5,5,5,5,5,5,5, # b8 - bf 0,0,6,6,6,6,6,6, # c0 - c7 6,6,6,6,6,6,6,6, # c8 - cf 6,6,6,6,6,6,6,6, # d0 - d7 6,6,6,6,6,6,6,6, # d8 - df 7,8,8,8,8,8,8,8, # e0 - e7 8,8,8,8,8,9,8,8, # e8 - ef 10,11,11,11,11,11,11,11, # f0 - f7 12,13,13,13,14,15,0,0 # f8 - ff ) UTF8_st = ( eError,eStart,eError,eError,eError,eError, 12, 10,#00-07 9, 11, 8, 7, 6, 5, 4, 3,#08-0f eError,eError,eError,eError,eError,eError,eError,eError,#10-17 eError,eError,eError,eError,eError,eError,eError,eError,#18-1f eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#20-27 eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,#28-2f eError,eError, 5, 5, 5, 5,eError,eError,#30-37 eError,eError,eError,eError,eError,eError,eError,eError,#38-3f eError,eError,eError, 5, 5, 5,eError,eError,#40-47 eError,eError,eError,eError,eError,eError,eError,eError,#48-4f eError,eError, 7, 7, 7, 7,eError,eError,#50-57 eError,eError,eError,eError,eError,eError,eError,eError,#58-5f eError,eError,eError,eError, 7, 7,eError,eError,#60-67 eError,eError,eError,eError,eError,eError,eError,eError,#68-6f eError,eError, 9, 9, 9, 9,eError,eError,#70-77 eError,eError,eError,eError,eError,eError,eError,eError,#78-7f eError,eError,eError,eError,eError, 9,eError,eError,#80-87 eError,eError,eError,eError,eError,eError,eError,eError,#88-8f eError,eError, 12, 12, 12, 12,eError,eError,#90-97 eError,eError,eError,eError,eError,eError,eError,eError,#98-9f eError,eError,eError,eError,eError, 12,eError,eError,#a0-a7 eError,eError,eError,eError,eError,eError,eError,eError,#a8-af eError,eError, 12, 12, 12,eError,eError,eError,#b0-b7 eError,eError,eError,eError,eError,eError,eError,eError,#b8-bf eError,eError,eStart,eStart,eStart,eStart,eError,eError,#c0-c7 eError,eError,eError,eError,eError,eError,eError,eError #c8-cf ) UTF8CharLenTable = (0, 1, 0, 0, 0, 0, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6) UTF8SMModel = {'classTable': UTF8_cls, 'classFactor': 16, 'stateTable': UTF8_st, 'charLenTable': UTF8CharLenTable, 'name': 'UTF-8'} # flake8: noqa PK[%site-packages/chardet/gb2312prober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import GB2312DistributionAnalysis from .mbcssm import GB2312SMModel class GB2312Prober(MultiByteCharSetProber): def __init__(self): MultiByteCharSetProber.__init__(self) self._mCodingSM = CodingStateMachine(GB2312SMModel) self._mDistributionAnalyzer = GB2312DistributionAnalysis() self.reset() def get_charset_name(self): return "GB2312" PK[^lu,site-packages/chardet/codingstatemachine.pycnu[ ۝Rc@s7ddlmZddlmZdddYZdS(i(teStart(twrap_ordtCodingStateMachinecBs5eZdZdZdZdZdZRS(cCs)||_d|_d|_|jdS(Ni(t_mModelt_mCurrentBytePost_mCurrentCharLentreset(tselftsm((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyt__init__!s   cCs t|_dS(N(Rt_mCurrentState(R((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyR'scCs|jdt|}|jtkrFd|_|jd||_n|j|jd|}|jd||_|jd7_|jS(Nt classTableit charLenTablet classFactort stateTablei(RRR RRR(RtctbyteClst curr_state((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyt next_state*s cCs|jS(N(R(R((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pytget_current_charlen9scCs |jdS(Ntname(R(R((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pytget_coding_state_machine<s(t__name__t __module__R RRRR(((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyR s     N((t constantsRtcompatRR(((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pytsPK[ Wyyy%site-packages/chardet/latin1prober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber from .constants import eNotMe from .compat import wrap_ord FREQ_CAT_NUM = 4 UDF = 0 # undefined OTH = 1 # other ASC = 2 # ascii capital letter ASS = 3 # ascii small letter ACV = 4 # accent capital vowel ACO = 5 # accent capital other ASV = 6 # accent small vowel ASO = 7 # accent small other CLASS_NUM = 8 # total classes Latin1_CharToClass = ( OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 00 - 07 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 08 - 0F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 10 - 17 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 18 - 1F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 20 - 27 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 28 - 2F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 30 - 37 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 38 - 3F OTH, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 40 - 47 ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 48 - 4F ASC, ASC, ASC, ASC, ASC, ASC, ASC, ASC, # 50 - 57 ASC, ASC, ASC, OTH, OTH, OTH, OTH, OTH, # 58 - 5F OTH, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 60 - 67 ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 68 - 6F ASS, ASS, ASS, ASS, ASS, ASS, ASS, ASS, # 70 - 77 ASS, ASS, ASS, OTH, OTH, OTH, OTH, OTH, # 78 - 7F OTH, UDF, OTH, ASO, OTH, OTH, OTH, OTH, # 80 - 87 OTH, OTH, ACO, OTH, ACO, UDF, ACO, UDF, # 88 - 8F UDF, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # 90 - 97 OTH, OTH, ASO, OTH, ASO, UDF, ASO, ACO, # 98 - 9F OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A0 - A7 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # A8 - AF OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B0 - B7 OTH, OTH, OTH, OTH, OTH, OTH, OTH, OTH, # B8 - BF ACV, ACV, ACV, ACV, ACV, ACV, ACO, ACO, # C0 - C7 ACV, ACV, ACV, ACV, ACV, ACV, ACV, ACV, # C8 - CF ACO, ACO, ACV, ACV, ACV, ACV, ACV, OTH, # D0 - D7 ACV, ACV, ACV, ACV, ACV, ACO, ACO, ACO, # D8 - DF ASV, ASV, ASV, ASV, ASV, ASV, ASO, ASO, # E0 - E7 ASV, ASV, ASV, ASV, ASV, ASV, ASV, ASV, # E8 - EF ASO, ASO, ASV, ASV, ASV, ASV, ASV, OTH, # F0 - F7 ASV, ASV, ASV, ASV, ASV, ASO, ASO, ASO, # F8 - FF ) # 0 : illegal # 1 : very unlikely # 2 : normal # 3 : very likely Latin1ClassModel = ( # UDF OTH ASC ASS ACV ACO ASV ASO 0, 0, 0, 0, 0, 0, 0, 0, # UDF 0, 3, 3, 3, 3, 3, 3, 3, # OTH 0, 3, 3, 3, 3, 3, 3, 3, # ASC 0, 3, 3, 3, 1, 1, 3, 3, # ASS 0, 3, 3, 3, 1, 2, 1, 2, # ACV 0, 3, 3, 3, 3, 3, 3, 3, # ACO 0, 3, 1, 3, 1, 1, 1, 3, # ASV 0, 3, 1, 3, 1, 1, 3, 3, # ASO ) class Latin1Prober(CharSetProber): def __init__(self): CharSetProber.__init__(self) self.reset() def reset(self): self._mLastCharClass = OTH self._mFreqCounter = [0] * FREQ_CAT_NUM CharSetProber.reset(self) def get_charset_name(self): return "windows-1252" def feed(self, aBuf): aBuf = self.filter_with_english_letters(aBuf) for c in aBuf: charClass = Latin1_CharToClass[wrap_ord(c)] freq = Latin1ClassModel[(self._mLastCharClass * CLASS_NUM) + charClass] if freq == 0: self._mState = eNotMe break self._mFreqCounter[freq] += 1 self._mLastCharClass = charClass return self.get_state() def get_confidence(self): if self.get_state() == eNotMe: return 0.01 total = sum(self._mFreqCounter) if total < 0.01: confidence = 0.0 else: confidence = ((self._mFreqCounter[3] / total) - (self._mFreqCounter[1] * 20.0 / total)) if confidence < 0.0: confidence = 0.0 # lower the confidence of latin1 so that other more accurate # detector can take priority. confidence = confidence * 0.5 return confidence PK[y %site-packages/chardet/eucjpprober.pyonu[ ۝Rc@sddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z d efd YZ dS( iNi(t constants(tMultiByteCharSetProber(tCodingStateMachine(tEUCJPDistributionAnalysis(tEUCJPContextAnalysis(t EUCJPSMModelt EUCJPProbercBs5eZdZdZdZdZdZRS(cCsBtj|tt|_t|_t|_|j dS(N( Rt__init__RRt _mCodingSMRt_mDistributionAnalyzerRt_mContextAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR&s    cCstj||jjdS(N(RR R (R ((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR -s cCsdS(NsEUC-JP((R ((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pytget_charset_name1scCst|}xPtd|D]?}|jj||}|tjkrtjr{tjj |j dt |dntj |_ Pq|tjkrtj|_ Pq|tjkr|jj}|dkr|d|jd<|jj|j||jj|j|q[|jj||d|d!||jj||d|d!|qqW||d|jd<|jtjkr|jjr|jtjkrtj|_ qn|jS(Nis prober hit error at byte s i(tlentrangeRt next_stateRteErrort_debugtsyststderrtwriteR tstrteNotMet_mStateteItsMeteFoundItteStarttget_current_charlent _mLastCharR tfeedR t get_statet eDetectingtgot_enough_datatget_confidencetSHORTCUT_THRESHOLD(R taBuftaLentit codingStatetcharLen((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR4s6   "   "cCs+|jj}|jj}t||S(N(R R"R tmax(R tcontxtCft distribCf((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR"Ws(t__name__t __module__RR R RR"(((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR%s     #(RtRtmbcharsetproberRtcodingstatemachineRtchardistributionRtjpcntxRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyts PK[³  $site-packages/chardet/gb2312freq.pyonu[ ۝Rcp@sdZdZdrZdqS(sg?iiiii< iTii iQii i iii<iw ii9 ii iiiiZ iiiqi i i iW iyiiieioiiv ii i iiii iLiBi iQ iiiiQiiiEiifiiiiiiiidi( iyiii,i i i iE ieii iWiRiii| iR ii i i iX i ijiEii i+iPiiiiiii;iim iiliiii iiieiHiiiii^ iki6ii" iFi i i i i^ i i iiii?i`iui$i1i ii i iUi i1 iiigiliii iiGii2iiq i i iPiiL iiiiiy iii i iMiikii4 iiiiii i i@ i`ii5iiiN ii7i3iiniiuiGi&ibihi0i iM iNii i iY i ii i iii i&i iQi i7i^ihiiiJ iiPiiiiriiiiiiiT i-iGi,iui i ii$iii<iBii$i>iiix iLiWiiini iiTiiZii i i{ iii i iii i?i i0ibi;iDiiiiiCiSiiUi> i|igi ii i iKii iiii% i5 iiiiil iihi iii?ii i iUiiii ii*i< i i ii ii iii ii i! iX iii iiQ igiiii iiri ii iqii iiz ii i3ii iii i i]iciziii7 ii_ii iCii&iaiHi| ili ii=iiiIiPi ii~ i8i`i iw i i iTii i iiii iiiiii[iq iii igii|iCi ii iN iIiii5 i i(ii/iHiK i iiiii9iiIiii|iiii ii iWii iii^i~iiii i i= iXii3i iIiii iiiii3iriiiioi ii i{iiiiCii!iHi iiiifii= ii1i[i i| iDii%iitii i ii ii.iiiiyiiTiii9 i i i#iiiJiiniiii ii>iBi"iiiai iiMiKii iW i i i i! ir iFi+ i i i iix iHiJiiiii2iKiiR i$ii9i it ii ii iiiiiiiiii%i~i i` iiiii'iviii ii|ii'i iin i*ii iiFii%ii)i~ii iiiJi&ii i!iD iiwii[i ii i i i' i iikiii i i iiiiiiiih iBi_i i?iigihii'iiiiiiiiiiiii5i] ii iiiiiiii1 ii)ia iiiii; iii_iiiQi/iu i i iji[ii}ii iii iiiiQi^ i iGiizi iiiViOii ii ii imiui i6ii i-i$i iiRii} i ipir i] i iDi iiiiiiiiiiii1iniiiitiYiG i i i/ i|iti0i iiiii\i i iivii iiciiii i~iAi"ii" i!i8iCi8 ii iji i1iili>i ii] i i i~iiLi(iiiKidiiviDiiii%i iii i, ii2ii iiij i-i.i imiKi iiioi i;i ii idi@iai iM i1 iLi@i2 iiwiitiQi i/ii ii~iiiii i/ii i_ i#i iOiiOiGiiiki[iOioiii- i iii i!i i iIiiii{iri i.ihi i iT iiii'iL iaii i@iii iii iT i/ iiiii iiMiii il iii i{i8i#i iii9iiSiRi iwiiZii0 iEigig ii i iiLiiipiiiSi iiiii i@iiI iLi; iOiqiii) i i:iFii5iJidiA ii i) iEiLiYiiii im i ii i iiic iiRii!iiii ii(iii]iIii i iieiiii iiii`ii iii ii[iiC i(iPi,i i}iO i' iLi\ i i i iiiiZiiisi'i iUiiiiiN iiii i iiMiiiiii iiiiiigi'iii ii iiPi0 is iiiip i iniiii i\i iii i!ihiiimi(i& i iCiiBi)i5 iiiiiii iii>iiiii i ii{iNiiiiEi3iiJi#iicii ii$ ii5iixi i]iiikii iiiiP ii iiiriiL i izidiii#i iii[ iSiihiiGiiiii iUi+i iyiiwi"iiVi2 i&izi i iiJ iP i iiiii% iZi$ io iT iKi1 i ii`iVi ii id ii iii+i iiAii iiii$ii i_i3i\ iiiiiibi ifiiiii iAiniiixiiFi iOi[iii(i ii i#i7i2 ixiif i i i!i6i{ iiiYiiii+iiiii iiii i iKiei i i iTi$iiiih ii iRiii"i iiZi i_ ii@iiai iii3 i iki)ijiii ieii iA i^ii iW iiihi: iz i) ii| iii ii i8 ijii iii3i i iziipiyi i i2 ioiD i=ii.ii9 iaifii*i_ii i*ii i i ii i- ii i}ii i ii* i itiiti6 iqiiiiiii iSi iii!i)iiyi iii ij ii iiViIiiig iiiLii iipiDii i ii%ii iM iiii$i i iiE i"iU iie i i|i iQiii ii ii i1 iiiii$i i]i4i&iiiziii`iiwi iiii i)i% i&iiii*iii8i2i> iSi iii1i#i ii ii#i i iiii iF iii, i> i+i i iiZ i3iqii i$ii iVi i;iiiNiimiKiWiiii5i i iRi4i iIiiDiiii i i i iiii%iKi|iii iiiii9iin iii i-i3 i2 ipiii? ii~iiiiiiCii[ii iii i3 i> iili i`ix iiii i# iiii0iiii iL i iiQiiRii?i(imii` ii3iiii& i ii isiDii0 ib ifi@ i iii ii=i i i<iiii ii6iiis iii iSiii i8iZ iii ii iii i ii iiiiNi i i iLi iJ iii ibiig iii[ iiiiii~ ii i iiifiiiii i i` i4i= iiiili? iici ii iiii iiiiiiiiwiii i%ii id i^i+iii iZiiF iI iit ii i/i iiiyi* isi&i+iii) iii iii i i ie iiiQi] ii i_i7 ii0iciuiiiLiki iiiii#iiiiiiii?iiii ini i iii iii iHiiYiiu ii i iiJii_ i_i&iiii iiiZi%ii isiiSii i iViiiiii1i'iiiFi\i i|i iWiii|iiSiWi i* i iRiliPi#i i i-iq iii i ii4iiiiiia iiiii@ i iXiii%iii8 i3i,ii} iiiidixi ii# ii6i i i.iiiAi iir i i iR idiii+ iiii i{i{iHi i iiiiiici i i iii,iiI iici ii iii=i iJi. i,i>iiiiLiei]ii iC iiii*i; i ii iipi iiiRii9 i i ii iii?i:i i i iQi'isiiwi[i ii-i i)iiiMiiiii]i}i6i@i iiUiiii/iiis i iiik i? ii, i= i1iMi iii/iS id iiio i6 ikiui iiiWi{iixiWii iiiix i^ iii[ i+ i7i:iiU iii!iii i.iHiTiiYiii ii@i"iCisi i i iG ibii7i~i. iUi iqi iiii{iiiiYi/i iiiAi ii*i:i8i'i i ii iiA i_i0iiiiiiiiKi i iit i* iii iiii i i iiiDiiii>iiivii i i'iiViii iiikii i\iiiii!i ii*iU iiiiiizii\if iii i iiii iiii i iiB iii iii{ii=i ii&i iiV i ii"i! i i iii i( i=ii i ii9i ii4iaiii-iQ ii ii imiiiiiCiii7i}iqiDi4iiuii iiiv iiiF iiu ia iiH ioi i iliKiA iii izi4 i i! iH ii ii5 iijii`ii iB i:iOiai i#iiiidiii(i i& ii^imig iE iio ii(iG i$i@i iIiiiAi ii`iXii7ii/ii$ii iihiiii iUi"iTiiiiimiii!iiiiii iiMi iiii i2iqiii9iii iiiii/iiii ipi@iX iijiii i^ ibi i iniiviiiioioiiiviii0ii9ii$ iifiS izi iiDi{iiXiii iVi3 iYi ii iAiiiiiiqiU i i: ii2iji ii i{ ii iFi i i ii iiiiciiiR i;ik ihii i iiY iOixiiziZi<iv ii i i iiIiii4 iMiiiiib iiii ii iiCii iiiO ii8iii i.i]i iVic i iii iH iiTiii ii> i ii i3iiii,iiifiiiiliTiWiHi.i'i>ipiiii"ii iJii i ivi2iii ixi i2iigi i4iii i iii{ iz i i i iii iiiiii?iiii iJiiii i i8iiiE ij i\ii8i8 ii iiii`ii>ibiSiiii i iii0i iiiEi iidiiii1iiiini@ii iiTii iiiQiiCii iK i;ikiiiiii_i\ ieiiwiiiiiMii. iriaiii i ii iiiigii i' i iii i iTiii4ioii iXiyiixii i i iU i^i: iiii ii"i#iii ii iiiiNiUiiip ii" i-i i iii:ii ii iiii iiiW i iG iLii iGiw ioiii iMir iii iiQ iiI iNi%i iXiii i7 i iaii iii i' iiihi i}iNiyi?itii iD iiiii iliiii iiie iJisi2i*iyiiiiii iiqi ii5i}is i$iiii5 iBiiii# idisi} ii~iiib iiO i/ i]iii i]i2iiifi7iiiOi iRii# i i[iiEii if iS i idiFiiiiC iV i>ii iiBii i i1i6imiii iiiiip i ii i i<izi i| iXiiiisie i]iiii i iiOi i+i iiiiii:i iAii ii ii( i imii4iP ii inii ioioiiimiiyiii8i ii<iii<ic iC iii&iwi i i$i i9i&ii i)i`iiiiiiGibiEii:iQio iF i iii i iFi|i;i iii3i4 i%ii:i iciipi6 i\iCii0i9 ii iiii~ iii"ih iiii i)ii i iii* ii i i i%ii iiii i.iii9i iii iii ii"i! ii, i ig iJ igiF iiii ii;ii iZiEi^iA iiili5ii ii4i' iiiki ii i2ii ii iXi7iii i{iiBixi=iei(ii iii'iiiiiiiiiii iD iiikii iii-i, i iei7 i iii iiiini} ip i7ijii ii9ii iiiii0iPi iiiiiiO i i i iiUi iii< iii iJiitiNii)i i.iii*i iAiir i] i)iiiiiGii_ ipik iii i% i ii ii>ibi_i^i?ii:iYiDi%iii iiiiiiYii i iiiiil iAii i i iDiBi i ii i@ i(iv iiiigi i i}iviiii iiiii iiiiiiii i-i~iiy i%i i i_i iiiiiijiMi iiGi+i iiii iiii3 i;i iGi)ii iii i ii ii i ii,iIi iii iXiAi\iiiiP ivii iVii=i i i6 i<iiX i i i ii8 i- iY iiiii iiiciiii9i i- iuii ii iR i i ii6ii iih i}i i? iw i ii ia i( i ii1ii ii>iii i ii]i iXiriPi0 i,ii+ ijii`iiiii. iii ii& iWiB iii|i7 iUii iiWiiYii iiw i iii iiiiiuiibiiq iiibiii ii=i$ iiNiJiiiUiiii iiiiiKi,iii4iri{i iiHiipi5iii=i i iEi9ii;i i<ii5i iii ii\iiiipiiiiiriiNiii^iiiiiK ii i*ii{ i+ i ii*i8iiii iiii ij ii@il i6ii2i8ii iiii'iiiiB iiii\iiiS iV ii~iiiii i iiVi iz i i^i i iii_ i} iG iqiiI i iii8itihiS ii}iRi i9iiSin iPiiB iiiisiiXi}ifiiii iiiiiiin iIi^iiTiixiiriii_iibiiOiPiQiRiSiiTi<iV iiYii iiii1iUiL iVi4ii iiUiEiiMi3if iiiiiiFiiiiiBiGiiiiii iiiiii i i?i iiVi&iHiWiWiXiiii@iisi:iiXiYiZiitii. iKi[iiiriiYiiii'ii(i4iiiiiii iii5iiiii iiZiBiIi i&iii i?ii0ii[i iiai iY iiiii\iiiLi@iiiiWi iiii}iiiMi]ii1iiiiJi^i;iiKitii iiiiu iiii_ii`iTiisii iaiiiii iNi\ibiiAicitiiiiiiii iiiaiUi ii iiiriiBiOiiiiiziiiiDiiiiiidiCii iiiiiiiiiiiDi4 i i]iiiijiiiiieiLiiiiifii^igiuiCi~ ihiiibii2iii iiiii(iiiNiiiMiXiiZijiiiii5i_iiiiuiiii iiiiii<i=iMii ikiiiei:i`iEiviiliiiii` iiii)iminiNiFiii i;iioi)i iV iaiici iGiiioi iisiipiOiiiiqiwi~iriiibii*iiiViiPiiiiiHiciifiiii(iiIisiitiuiidiQieiWi iiiiiii ikii+iii iiN iiviiiiJi i i9iiiiRiSiifii igiipiiiiwiiiAiKiihiZ iiiiiibixii iiiiijiyii<iiii!ii+is iiiiiijiliiii,iiRiizi{iiTiCiDici iii ikiiiim i: i iDi ii+iLi|ii-iEiiiiiitiliiMiNii iiiiii iUiiiOii}i*i~iiBiiPii[ iuiQiiiiiiii ii5iOiliRii=iiiVi5iiiiiiiSiiTiiXiiYiiiimiiiPiiinii iiiEiiUiiiqiiiv iWiimioiiiiiipigi" i.iiiiqi i ii&iiPiriiie iiiiiiii'i,isitiiidiiiiiiiYiiii i+iiiQiiiiiuii iiiiXiieiii3iiiiFii iiiiriiiii i iui iVi i(ii iiiYiwiiiiiiiZio ini6ii iviii.iiiiiifiiiiiiiiiiiiiJi=iiwiixiiiiiiiiciiiifiiiGiiiiiiiiiioiZii[ipiii iiiiiPiii[idi4iiiii5iiii6iiiiii7iii i!iiiiHi8iii-iiiiiiigihiiii\iiiiiqiiii,iihiii i]iii ixiiyiii[iii i iii iWiii iN ii6iii)i|iRiit iii>ii iiZiiiijiif i^iiiiiiii>i/iii*i ii iiiiivii i-iiyiCi]i i iEiDiiXiki iiii< iZii iiFii iii ii iii iiiiiiiii i iiziiiiYii!i{iiiiiAiZiiiSiiiii% i_iii iii|i[ii\i}iiiX iiIiiii0iii?iRii1iii@ii]i~izikiiTiC i2ii6ii^iiii iiieiiiii iirixiiiii_i!iiii`i`i iii iiiFi ii ii iiiiiiii[iiiiiii^iiii iii ifiiih i_ik iii+i"ii#ihiii~ iiiiiiiiJi$iiii%iii&i'iQiiiii'iiiici i\iidi}i\ii.iiiKi ii i i iiiiiiit i iib iiisiiiiiniiiiiii iiiiii"iii iGiNiUi iiiJ iivi i ii#i]iViiiii iiiiiiiiii/ ivij i/iiiii+i iiiii ii3iiEii iiiiii i iiai,ii.iii iwii i\iAiiiBiiii( iivii iti/iii$iHiiiSiiiiiiii)ii iiiiii iii# iiiiiiiibiiiiiiiii]iOi iiaii%iiiii i(ii iiiiiiiiiiii^iiiD iiiiu iiiicidi iiiLiii4i:ii iiiiiiiiii iic iW iRiiii? iiiii iH i?iii= iiiiiii iiii iViiiiiii iiiiiiii/i)iiEibiixi iliiiieiiiWiiii*iciiH i9iiiiiii iiiiiiyidi,imiieiiiiiji iiiii`ii+iifiiiiii iiiigiiiiniii!i6 iIiii i ii: i"iiiiifiiiiiaiiiigiiiqi iiiNiiCii0iii0ii-i i ii ii iM i~ii$iiiaiii iiiT ihiib i ii i#ic i i i& ii"i iiiii/ iiiM iii:i-i$iFiiiuiiiFiviiKii iiii:iii%il iiiiiiiioiiiiXiii) iii&i'ii i{iiiiii iiiipi iiiii,iiiii5iiiiO iYiiji i ii iiki6i-iMi< ii iiiii@iihi@ iix ii(iiiiy iii iiiiiii" i.ii/i0i.iiiiiiliim i7iiigiNiiiOii1iii i)i iiiiiii!i iqiii*iPiiii iPii\ iiriiiiiiiiiQiiiwiz iiGii"iiiiiii iiii iiiiii+isitii%iziiiiE iy i#iiiijiiiiiJia iiiii ikii.i$i` iii%iiiDiiiiiiiliiGiiiKiiiZiii,i1iii6iiiiimiiii&iii'iisiniiiEiiii(i[ii/iiiiiiiiilioii8iii ii iiiitii>iipiiwiiOiiii7iiii)iii-ii.i ii i iiii iiiiWiii2iii!i/ikim iiiiq i3ii*i+i i0iiiiiqiiSii&iiirixii i1i iimi,i4iXiisiii ii-iiii"ii; iiii*i\ii2i8iRiyiii3iiiniii iiiiii4ii iiiuiiii;ii iiei iiii5iin i ii id iiiy i.iiiiiiioiiii6i7iiiiK i;iiiiQ ii(i iiiitiii iii;iiFiHi/iiiiiiiiviiiSi8iTi9iiiiiii/i]i:ii"iuiii i0i9i#i i i i<ii i ii;iiiiiiiiUi$ii iiii<i1iiQi%i[ iii=i[ii ii7iiii>ii2iiiYiii+iipi?iii:i i ii@i^iiiqiiAi iiiVi5iii ii iLi2ii3ii iii iriii iii3i iiiiiiii4iwi iiiiii4i6iBiiii|iSiiiiP i&ii i ixivii iiii'iii?i0iiii iiiiCi i5i iiiwii=ii6iii7ii i>i0iiiii iii!i8isiip iiiiiiiii(i iiii"ii#ii)iii$iiiDiii*iii%iii+iiiiifiiEiixiiiiiii_iik iiiiFi iili7i`iMiGiyi&iiHi'ii9iii:i;iAixii;iiIigii<iJiii(iiiKii^iLiMii,i8iiiiiyizii5i<iizii}ii_i)iNi?i=iiai<iOii ii*iiiFiWi<iii>iiiiiiiPii ii+ii{iii ii ii,iii iiIii!iei"i-i ii iiQi9i#iRiii|iiSii.imii$i/iiiiii i%iiiTiiiiiUiiViii,i?iimi@iii6i-iWiiXi.i&i`i:i/i0iAiHi1i0i\ i2izi7iii}iiBi@ii i1i iiiiCi'ibi3ii(i iAii)i2i4i;iti~i3i iiBiiiNiuiiYiii*iZiiaii{iXii[i+icii ii\ii; i,i-iTiUiiiviii5i i6iiDi i]i{iii7ii iyiii8iibi.iii9i:i|i<i/i~ii;iiihii0ii1i2i iii3i4iimi<i^i i{ii_iiiiEiFii`i5iiiaiiiZi|iYiiii i iwi=ibiGiii4ii iiiIiiiiiZi=i>i>iici iiidiiiiixi5iii?i6iHiiIi@i1i_i iiJiiAi7iiKiiieifigii=i ii0 iihi@iBii8i[i9iCini:iDiiiii i;ijiiiyi}i<iziEikiliii{i ii=i>iii|iLii2i?iJiiiimiii|iMini}i}i@iiFiiii~iBi>iiidi- iiioipiiiiiciGiidiiiqiii\ieiGiOiAiHiBi6ii i=i iiNiiIiOiii7i~iJiKiiiCi~iriLiiiiMioi8i?iiiiiNiiisii=iiitiiCiii@iuiiK i iii9iiiOiiPiiiQii iiiiii iriY iiiivii?iiRiwiSiTii`iUiDiVixiiEiiPiWiiXii!iYiiii$ ii\ii1iiiiiii"iQiZiii7iiiiAiyiii iiid ii[iiiBiziii\i i iiiiiiVii{iifi]i|i^i}iiiBiiiii:i_iii;iiii`i<ipiiFiiPiiai ibiGi i-ici]iidi iiigiHiiIii ieiiiuiiiiiqiJifiigijiKi~ihiii^iii#iiiiiiiiiHiLiiijiiRiiSiiiiMii i!iTiiiiikiwiiiiniiiili#i>iiiZ iiHiii#iiiiNimiiiiiiiniioN(piiii< iTii iQii i iii<iw ii9 ii iiiiZ iiiqi i i iW iyiiieioiiv ii i iiii iLiBi iQ iiiiQiiiEiifiiiiiiiidi( iyiii,i i i iE ieii iWiRiii| iR ii i i iX i ijiEii i+iPiiiiiii;iim iiliiii iiieiHiiiii^ iki6ii" iFi i i i i^ i i iiii?i`iui$i1i ii i iUi i1 iiigiliii iiGii2iiq i i iPiiL iiiiiy iii i iMiikii4 iiiiii i i@ i`ii5iiiN ii7i3iiniiuiGi&ibihi0i iM iNii i iY i ii i iii i&i iQi i7i^ihiiiJ iiPiiiiriiiiiiiT i-iGi,iui i ii$iii<iBii$i>iiix iLiWiiini iiTiiZii i i{ iii i iii i?i i0ibi;iDiiiiiCiSiiUi> i|igi ii i iKii iiii% i5 iiiiil iihi iii?ii i iUiiii ii*i< i i ii ii iii ii i! iX iii iiQ igiiii iiri ii iqii iiz ii i3ii iii i i]iciziii7 ii_ii iCii&iaiHi| ili ii=iiiIiPi ii~ i8i`i iw i i iTii i iiii iiiiii[iq iii igii|iCi ii iN iIiii5 i i(ii/iHiK i iiiii9iiIiii|iiii ii iWii iii^i~iiii i i= iXii3i iIiii iiiii3iriiiioi ii i{iiiiCii!iHi iiiifii= ii1i[i i| iDii%iitii i ii ii.iiiiyiiTiii9 i i i#iiiJiiniiii ii>iBi"iiiai iiMiKii iW i i i i! ir iFi+ i i i iix iHiJiiiii2iKiiR i$ii9i it ii ii iiiiiiiiii%i~i i` iiiii'iviii ii|ii'i iin i*ii iiFii%ii)i~ii iiiJi&ii i!iD iiwii[i ii i i i' i iikiii i i iiiiiiiih iBi_i i?iigihii'iiiiiiiiiiiii5i] ii iiiiiiii1 ii)ia iiiii; iii_iiiQi/iu i i iji[ii}ii iii iiiiQi^ i iGiizi iiiViOii ii ii imiui i6ii i-i$i iiRii} i ipir i] i iDi iiiiiiiiiiii1iniiiitiYiG i i i/ i|iti0i iiiii\i i iivii iiciiii i~iAi"ii" i!i8iCi8 ii iji i1iili>i ii] i i i~iiLi(iiiKidiiviDiiii%i iii i, ii2ii iiij i-i.i imiKi iiioi i;i ii idi@iai iM i1 iLi@i2 iiwiitiQi i/ii ii~iiiii i/ii i_ i#i iOiiOiGiiiki[iOioiii- i iii i!i i iIiiii{iri i.ihi i iT iiii'iL iaii i@iii iii iT i/ iiiii iiMiii il iii i{i8i#i iii9iiSiRi iwiiZii0 iEigig ii i iiLiiipiiiSi iiiii i@iiI iLi; iOiqiii) i i:iFii5iJidiA ii i) iEiLiYiiii im i ii i iiic iiRii!iiii ii(iii]iIii i iieiiii iiii`ii iii ii[iiC i(iPi,i i}iO i' iLi\ i i i iiiiZiiisi'i iUiiiiiN iiii i iiMiiiiii iiiiiigi'iii ii iiPi0 is iiiip i iniiii i\i iii i!ihiiimi(i& i iCiiBi)i5 iiiiiii iii>iiiii i ii{iNiiiiEi3iiJi#iicii ii$ ii5iixi i]iiikii iiiiP ii iiiriiL i izidiii#i iii[ iSiihiiGiiiii iUi+i iyiiwi"iiVi2 i&izi i iiJ iP i iiiii% iZi$ io iT iKi1 i ii`iVi ii id ii iii+i iiAii iiii$ii i_i3i\ iiiiiibi ifiiiii iAiniiixiiFi iOi[iii(i ii i#i7i2 ixiif i i i!i6i{ iiiYiiii+iiiii iiii i iKiei i i iTi$iiiih ii iRiii"i iiZi i_ ii@iiai iii3 i iki)ijiii ieii iA i^ii iW iiihi: iz i) ii| iii ii i8 ijii iii3i i iziipiyi i i2 ioiD i=ii.ii9 iaifii*i_ii i*ii i i ii i- ii i}ii i ii* i itiiti6 iqiiiiiii iSi iii!i)iiyi iii ij ii iiViIiiig iiiLii iipiDii i ii%ii iM iiii$i i iiE i"iU iie i i|i iQiii ii ii i1 iiiii$i i]i4i&iiiziii`iiwi iiii i)i% i&iiii*iii8i2i> iSi iii1i#i ii ii#i i iiii iF iii, i> i+i i iiZ i3iqii i$ii iVi i;iiiNiimiKiWiiii5i i iRi4i iIiiDiiii i i i iiii%iKi|iii iiiii9iin iii i-i3 i2 ipiii? ii~iiiiiiCii[ii iii i3 i> iili i`ix iiii i# iiii0iiii iL i iiQiiRii?i(imii` ii3iiii& i ii isiDii0 ib ifi@ i iii ii=i i i<iiii ii6iiis iii iSiii i8iZ iii ii iii i ii iiiiNi i i iLi iJ iii ibiig iii[ iiiiii~ ii i iiifiiiii i i` i4i= iiiili? iici ii iiii iiiiiiiiwiii i%ii id i^i+iii iZiiF iI iit ii i/i iiiyi* isi&i+iii) iii iii i i ie iiiQi] ii i_i7 ii0iciuiiiLiki iiiii#iiiiiiii?iiii ini i iii iii iHiiYiiu ii i iiJii_ i_i&iiii iiiZi%ii isiiSii i iViiiiii1i'iiiFi\i i|i iWiii|iiSiWi i* i iRiliPi#i i i-iq iii i ii4iiiiiia iiiii@ i iXiii%iii8 i3i,ii} iiiidixi ii# ii6i i i.iiiAi iir i i iR idiii+ iiii i{i{iHi i iiiiiici i i iii,iiI iici ii iii=i iJi. i,i>iiiiLiei]ii iC iiii*i; i ii iipi iiiRii9 i i ii iii?i:i i i iQi'isiiwi[i ii-i i)iiiMiiiii]i}i6i@i iiUiiii/iiis i iiik i? ii, i= i1iMi iii/iS id iiio i6 ikiui iiiWi{iixiWii iiiix i^ iii[ i+ i7i:iiU iii!iii i.iHiTiiYiii ii@i"iCisi i i iG ibii7i~i. iUi iqi iiii{iiiiYi/i iiiAi ii*i:i8i'i i ii iiA i_i0iiiiiiiiKi i iit i* iii iiii i i iiiDiiii>iiivii i i'iiViii iiikii i\iiiii!i ii*iU iiiiiizii\if iii i iiii iiii i iiB iii iii{ii=i ii&i iiV i ii"i! i i iii i( i=ii i ii9i ii4iaiii-iQ ii ii imiiiiiCiii7i}iqiDi4iiuii iiiv iiiF iiu ia iiH ioi i iliKiA iii izi4 i i! iH ii ii5 iijii`ii iB i:iOiai i#iiiidiii(i i& ii^imig iE iio ii(iG i$i@i iIiiiAi ii`iXii7ii/ii$ii iihiiii iUi"iTiiiiimiii!iiiiii iiMi iiii i2iqiii9iii iiiii/iiii ipi@iX iijiii i^ ibi i iniiviiiioioiiiviii0ii9ii$ iifiS izi iiDi{iiXiii iVi3 iYi ii iAiiiiiiqiU i i: ii2iji ii i{ ii iFi i i ii iiiiciiiR i;ik ihii i iiY iOixiiziZi<iv ii i i iiIiii4 iMiiiiib iiii ii iiCii iiiO ii8iii i.i]i iVic i iii iH iiTiii ii> i ii i3iiii,iiifiiiiliTiWiHi.i'i>ipiiii"ii iJii i ivi2iii ixi i2iigi i4iii i iii{ iz i i i iii iiiiii?iiii iJiiii i i8iiiE ij i\ii8i8 ii iiii`ii>ibiSiiii i iii0i iiiEi iidiiii1iiiini@ii iiTii iiiQiiCii iK i;ikiiiiii_i\ ieiiwiiiiiMii. iriaiii i ii iiiigii i' i iii i iTiii4ioii iXiyiixii i i iU i^i: iiii ii"i#iii ii iiiiNiUiiip ii" i-i i iii:ii ii iiii iiiW i iG iLii iGiw ioiii iMir iii iiQ iiI iNi%i iXiii i7 i iaii iii i' iiihi i}iNiyi?itii iD iiiii iliiii iiie iJisi2i*iyiiiiii iiqi ii5i}is i$iiii5 iBiiii# idisi} ii~iiib iiO i/ i]iii i]i2iiifi7iiiOi iRii# i i[iiEii if iS i idiFiiiiC iV i>ii iiBii i i1i6imiii iiiiip i ii i i<izi i| iXiiiisie i]iiii i iiOi i+i iiiiii:i iAii ii ii( i imii4iP ii inii ioioiiimiiyiii8i ii<iii<ic iC iii&iwi i i$i i9i&ii i)i`iiiiiiGibiEii:iQio iF i iii i iFi|i;i iii3i4 i%ii:i iciipi6 i\iCii0i9 ii iiii~ iii"ih iiii i)ii i iii* ii i i i%ii iiii i.iii9i iii iii ii"i! ii, i ig iJ igiF iiii ii;ii iZiEi^iA iiili5ii ii4i' iiiki ii i2ii ii iXi7iii i{iiBixi=iei(ii iii'iiiiiiiiiii iD iiikii iii-i, i iei7 i iii iiiini} ip i7ijii ii9ii iiiii0iPi iiiiiiO i i i iiUi iii< iii iJiitiNii)i i.iii*i iAiir i] i)iiiiiGii_ ipik iii i% i ii ii>ibi_i^i?ii:iYiDi%iii iiiiiiYii i iiiiil iAii i i iDiBi i ii i@ i(iv iiiigi i i}iviiii iiiii iiiiiiii i-i~iiy i%i i i_i iiiiiijiMi iiGi+i iiii iiii3 i;i iGi)ii iii i ii ii i ii,iIi iii iXiAi\iiiiP ivii iVii=i i i6 i<iiX i i i ii8 i- iY iiiii iiiciiii9i i- iuii ii iR i i ii6ii iih i}i i? iw i ii ia i( i ii1ii ii>iii i ii]i iXiriPi0 i,ii+ ijii`iiiii. iii ii& iWiB iii|i7 iUii iiWiiYii iiw i iii iiiiiuiibiiq iiibiii ii=i$ iiNiJiiiUiiii iiiiiKi,iii4iri{i iiHiipi5iii=i i iEi9ii;i i<ii5i iii ii\iiiipiiiiiriiNiii^iiiiiK ii i*ii{ i+ i ii*i8iiii iiii ij ii@il i6ii2i8ii iiii'iiiiB iiii\iiiS iV ii~iiiii i iiVi iz i i^i i iii_ i} iG iqiiI i iii8itihiS ii}iRi i9iiSin iPiiB iiiisiiXi}ifiiii iiiiiiin iIi^iiTiixiiriii_iibiiOiPiQiRiSiiTi<iV iiYii iiii1iUiL iVi4ii iiUiEiiMi3if iiiiiiFiiiiiBiGiiiiii iiiiii i i?i iiVi&iHiWiWiXiiii@iisi:iiXiYiZiitii. iKi[iiiriiYiiii'ii(i4iiiiiii iii5iiiii iiZiBiIi i&iii i?ii0ii[i iiai iY iiiii\iiiLi@iiiiWi iiii}iiiMi]ii1iiiiJi^i;iiKitii iiiiu iiii_ii`iTiisii iaiiiii iNi\ibiiAicitiiiiiiii iiiaiUi ii iiiriiBiOiiiiiziiiiDiiiiiidiCii iiiiiiiiiiiDi4 i i]iiiijiiiiieiLiiiiifii^igiuiCi~ ihiiibii2iii iiiii(iiiNiiiMiXiiZijiiiii5i_iiiiuiiii iiiiii<i=iMii ikiiiei:i`iEiviiliiiii` iiii)iminiNiFiii i;iioi)i iV iaiici iGiiioi iisiipiOiiiiqiwi~iriiibii*iiiViiPiiiiiHiciifiiii(iiIisiitiuiidiQieiWi iiiiiii ikii+iii iiN iiviiiiJi i i9iiiiRiSiifii igiipiiiiwiiiAiKiihiZ iiiiiibixii iiiiijiyii<iiii!ii+is iiiiiijiliiii,iiRiizi{iiTiCiDici iii ikiiiim i: i iDi ii+iLi|ii-iEiiiiiitiliiMiNii iiiiii iUiiiOii}i*i~iiBiiPii[ iuiQiiiiiiii ii5iOiliRii=iiiVi5iiiiiiiSiiTiiXiiYiiiimiiiPiiinii iiiEiiUiiiqiiiv iWiimioiiiiiipigi" i.iiiiqi i ii&iiPiriiie iiiiiiii'i,isitiiidiiiiiiiYiiii i+iiiQiiiiiuii iiiiXiieiii3iiiiFii iiiiriiiii i iui iVi i(ii iiiYiwiiiiiiiZio ini6ii iviii.iiiiiifiiiiiiiiiiiiiJi=iiwiixiiiiiiiiciiiifiiiGiiiiiiiiiioiZii[ipiii iiiiiPiii[idi4iiiii5iiii6iiiiii7iii i!iiiiHi8iii-iiiiiiigihiiii\iiiiiqiiii,iihiii i]iii ixiiyiii[iii i iii iWiii iN ii6iii)i|iRiit iii>ii iiZiiiijiif i^iiiiiiii>i/iii*i ii iiiiivii i-iiyiCi]i i iEiDiiXiki iiii< iZii iiFii iii ii iii iiiiiiiii i iiziiiiYii!i{iiiiiAiZiiiSiiiii% i_iii iii|i[ii\i}iiiX iiIiiii0iii?iRii1iii@ii]i~izikiiTiC i2ii6ii^iiii iiieiiiii iirixiiiii_i!iiii`i`i iii iiiFi ii ii iiiiiiii[iiiiiii^iiii iii ifiiih i_ik iii+i"ii#ihiii~ iiiiiiiiJi$iiii%iii&i'iQiiiii'iiiici i\iidi}i\ii.iiiKi ii i i iiiiiiit i iib iiisiiiiiniiiiiii iiiiii"iii iGiNiUi iiiJ iivi i ii#i]iViiiii iiiiiiiiii/ ivij i/iiiii+i iiiii ii3iiEii iiiiii i iiai,ii.iii iwii i\iAiiiBiiii( iivii iti/iii$iHiiiSiiiiiiii)ii iiiiii iii# iiiiiiiibiiiiiiiii]iOi iiiaii%iiiii i(ii iiiiiiiiiiii^iiiD iiiiu iiiicidi iiiLiii4i:ii iiiiiiiiii iic iW iRiiii? iiiii iH i?iii= iiiiiii iiii iViiiiiii iiiiiiii/i)iiEibiixi iliiiieiiiWiiii*iciiH i9iiiiiii iiiiiiyidi,imiieiiiiiji iiiii`ii+iifiiiiii iiiigiiiiniii!i6 iIiii i ii: i"iiiiifiiiiiaiiiigiiiqi iiiNiiCii0iii0ii-i i ii ii iM i~ii$iiiaiii iiiT ihiib i ii i#ic i i i& ii"i iiiii/ iiiM iii:i-i$iFiiiuiiiFiviiKii iiii:iii%il iiiiiiiioiiiiXiii) iii&i'ii i{iiiiii iiiipi iiiii,iiiii5iiiiO iYiiji i ii iiki6i-iMi< ii iiiii@iihi@ iix ii(iiiiy iii iiiiiii" i.ii/i0i.iiiiiiliim i7iiigiNiiiOii1iii i)i iiiiiii!i iqiii*iPiiii iPii\ iiriiiiiiiiiQiiiwiz iiGii"iiiiiii iiii iiiiii+isitii%iziiiiE iy i#iiiijiiiiiJia iiiii ikii.i$i` iii%iiiDiiiiiiiliiGiiiKiiiZiii,i1iii6iiiiimiiii&iii'iisiniiiEiiii(i[ii/iiiiiiiiilioii8iii ii iiiitii>iipiiwiiOiiii7iiii)iii-ii.i ii i iiii iiiiWiii2iii!i/ikim iiiiq i3ii*i+i i0iiiiiqiiSii&iiirixii i1i iimi,i4iXiisiii ii-iiii"ii; iiii*i\ii2i8iRiyiii3iiiniii iiiiii4ii iiiuiiii;ii iiei iiii5iin i ii id iiiy i.iiiiiiioiiii6i7iiiiK i;iiiiQ ii(i iiiitiii iii;iiFiHi/iiiiiiiiviiiSi8iTi9iiiiiii/i]i:ii"iuiii i0i9i#i i i i<ii i ii;iiiiiiiiUi$ii iiii<i1iiQi%i[ iii=i[ii ii7iiii>ii2iiiYiii+iipi?iii:i i ii@i^iiiqiiAi iiiVi5iii ii iLi2ii3ii iii iriii iii3i iiiiiiii4iwi iiiiii4i6iBiiii|iSiiiiP i&ii i ixivii iiii'iii?i0iiii iiiiCi i5i iiiwii=ii6iii7ii i>i0iiiii iii!i8isiip iiiiiiiii(i iiii"ii#ii)iii$iiiDiii*iii%iii+iiiiifiiEiixiiiiiii_iik iiiiFi iili7i`iMiGiyi&iiHi'ii9iii:i;iAixii;iiIigii<iJiii(iiiKii^iLiMii,i8iiiiiyizii5i<iizii}ii_i)iNi?i=iiai<iOii ii*iiiFiWi<iii>iiiiiiiPii ii+ii{iii ii ii,iii iiIii!iei"i-i ii iiQi9i#iRiii|iiSii.imii$i/iiiiii i%iiiTiiiiiUiiViii,i?iimi@iii6i-iWiiXi.i&i`i:i/i0iAiHi1i0i\ i2izi7iii}iiBi@ii i1i iiiiCi'ibi3ii(i iAii)i2i4i;iti~i3i iiBiiiNiuiiYiii*iZiiaii{iXii[i+icii ii\ii; i,i-iTiUiiiviii5i i6iiDi i]i{iii7ii iyiii8iibi.iii9i:i|i<i/i~ii;iiihii0ii1i2i iii3i4iimi<i^i i{ii_iiiiEiFii`i5iiiaiiiZi|iYiiii i iwi=ibiGiii4ii iiiIiiiiiZi=i>i>iici iiidiiiiixi5iii?i6iHiiIi@i1i_i iiJiiAi7iiKiiieifigii=i ii0 iihi@iBii8i[i9iCini:iDiiiii i;ijiiiyi}i<iziEikiliii{i ii=i>iii|iLii2i?iJiiiimiii|iMini}i}i@iiFiiii~iBi>iiidi- iiioipiiiiiciGiidiiiqiii\ieiGiOiAiHiBi6ii i=i iiNiiIiOiii7i~iJiKiiiCi~iriLiiiiMioi8i?iiiiiNiiisii=iiitiiCiii@iuiiK i iii9iiiOiiPiiiQii iiiiii iriY iiiivii?iiRiwiSiTii`iUiDiVixiiEiiPiWiiXii!iYiiii$ ii\ii1iiiiiii"iQiZiii7iiiiAiyiii iiid ii[iiiBiziii\i i iiiiiiVii{iifi]i|i^i}iiiBiiiii:i_iii;iiii`i<ipiiFiiPiiai ibiGi i-ici]iidi iiigiHiiIii ieiiiuiiiiiqiJifiigijiKi~ihiii^iii#iiiiiiiiiHiLiiijiiRiiSiiiiMii i!iTiiiiikiwiiiiniiiili#i>iiiZ iiHiii#iiiiNimiiiiiiiniio(t!GB2312_TYPICAL_DISTRIBUTION_RATIOtGB2312_TABLE_SIZEtGB2312CharToFreqOrder(((s6/usr/lib/python2.7/site-packages/chardet/gb2312freq.pyt*sPPK[?2#site-packages/chardet/euctwfreq.pyonu[ ۝Rc@sdZdZdZdS(g?iiiiiiii iRiiiiiii inii!i iiLi,iAiis iiiiiiL iS iii iiii.iNiiiiii:iiii?iii=iNiKiiiil iii i ii i ii iiii ioi$ iiiii ici8iiiiiiiiizi|iit i"i ie i@i\ii iiiiiiiFiiM iQiHiiiPiviif iiiiDiT iiiFiN iiEi iOii/iisii3i<i2i ii&iLiiiO iiiGiiiM iii?ii i`iiF i*iigi iZi i:ii iiKi ii iiiiii`iiiig ii i iqii~iiiP i ii iii!iiuiii*iii i ii~iiiiieiiGi^iiii iUiCiiBiiiiiii ijioi/iiiOi2 i[iii i& iiiiiSi(ii iipi]ii6iii i' iiiiii8ii+i% i[iii\iiiiiiX i( iii i0ii iHi i i"i!ii+i i1i"iii iOiG iiifi1iiiiiiii2i9iili,ii iiiiii}ih i#iq iQiMi&i iXiii#iii iiiijiiiMiii i%ii ii$iii'i iiN ii ii7iiJii!iiiiiiMii) iPiU iiii ii%i i ii ii i iIii3 ii iir ii i iiiimiii$iiixii iii ii ii%i&ii iiiiiiii&ii'iii'iii.ii iiiH iiiii$i#iiDi&iAi iiiiiiUiGiiii iQ iPiSi'iiidi i0iFiii* iiiiiiiJii iUiiiiI iR iii<iiS i:i7 i ii i i9ii}ii iiiViPiT ii)iCiiii& i i i)iiim iiiiiii4 iiiin i*iiiiiiiO iiiii i+ i(i i iiiU i(ii5iYiji iliiuii)i i*i+iV i i=i iiiiiii4ii!iiiTi, ixiiieii iiJ iPiis i5iAiV i/iki i iili!i iiAii`ii i iiAii iiii ii i iiiiiiMi iiiiiiW iii it iii+i}iij i8 iiiiiiiii- i)imi iiW ii ii iiaii iP iK i i,ii ii7i' iu ii{ik iiiii i9 iiiiiiiiiii1iibii i iiio iiX i,iQ iiiiii i i iX iiii5iDiiiliii[i iiiY ii%ii. iY ii*iii iiR iii ipiiinicigi+iii'i2iiii{iil iim iii: iifi ii|i5 iiiiiZ i i i i ii i,ii iii;iiIiYiii[ iXi"ii iiii~iii,iikiii-iiiiiiDiiii>i]ii,iiiiviLiBiii&iii iiiiGiiiiBii i! iiiu iiiii i iaiiiiv iS ii}i; iiDii=ii0i ii\ i( iiiivi iiiiii.iii9iHiiiii] iEiiiiii!ii/ iii i i-iiiQi*ii.i/iiiii0 i3ii" ii*iRiiiiWiii/iibi.ii iiiiiiiRii ii) ii2ii iiiiiiiZ iiT iiw iiii iiiiiii[ iOii i i`i7ix i^ iiiiiii\ iiiiiiigiiin ii i_ii~iiii0ii iaiiy i] iiiii iii i;ii i-i iiL iiii/iiiii`ii#i"iiiii0i isiiiidisi iiY ii ikiwio ii iiii1ii2iigip iQiiUi iv iiiiiCiSii^ iii5iiiBii_i ibiNiiiXiiii iiLici i i iKiw i* iaiGi3ii i iii1i6i i2i6 iNiii i i3ii:ii\iqiiii-iii i3i iiiix i ii irii4i i_ iiU iiii@ii5i ii ii ii/i+ i6i iiiiiii i7 iZ iiii8i4iiCiii iilii` iiiiiiYiiiii5i i{iiiii$i7iiMiV i0irii iigiiVii8ii9i, iZiii{i#iW i0iii$i i i ii4ii[iiviiiciiViM i$i- iiiiX iii idiiiWi[ iii iiiq i ii1 iiiiitiiii ii i i2 ii2i:i3 i i.iii2ii iiiiii%i iii i i iiiiiii i i6i i4 ii|iiiSiiii_ i iiiii`iiiii i3iii;ir iiii7iYiLi;ii i iiiiiTi\iiii<iiVi5 iii iii ii"ixi%ii;i8 i iii2iEi=i!iiii^iiwi i"iiiis ii#i<iQiiiri$ii]ii%ii. i&i i3i5iBiiy i'iii ii i i>iY ia ib i(i i i)i*i iiiii:ii6ii^ii iii(i i+i+i i ixi,i i.ihi/ i-iiii iVi ii ihiiz i.iiiii<iii;i/i?iii i i0i8i i ii5i6i i_i)i1i2i i3iyi iii i i^i4i i i?i$i+i\ i i5i_iWii iz i6i0 ii i] i iip i7i ii8i^ i< iiVi9i i6 iiIiwi}ic i^ii i9i@ii iAi iii i:iei1iiiBiiiiii i i ii7 i;i<ii=i{ ii(i`iRi1 iYiiIi ii i i6i id i>iiie i?iioiiqiYiniiiliiCiDi{ ii i_ iEiPiUii i iiiiEimii@ii:i ii iAiiiiii# i iNi i iBiiCiWiTiTiii iif i;iDii&i i| iiiiii iii<i= i iii iVii iioii iEi iFiii iiii iiiDi-i8 iiGidi i i iHit iiiIizi iiJi i iKii i| iiiii> iiiiiiiLi:i i=iiMii? i iiiHiiiiiNiii iOiPiiFikiQi9 i iii i iu iiv iiiiiiRiSiii} i i>iiiii i: iTi iiN iiCiiiiUi~ii iWiiGiiii,iiiiiOii|iiiiOi?iVi` ii ii~ i iw iiii@i!iii; iiiiiWii"i iXiiYiiRig iuii ih i ix i=i iiZii< iii[i i#ii= i i\i$ii]iHiIi^i7iO i$ i i_i%iviJii i!iwitii`iaibi9 i&ii"i{ii i i'iciidi8iiiii[i9iiidiZ i ieiii i@ i!i(i"ifiiii i#i$iTigiKii i%iiWiMihiiiiiiii%iiiiii i` iiyi7imiLijiki i: i> i!iiii iBi)ili|i ii iziiii iiMi ii iiimiiniuiq ivii i i*iNioipiiiqi7i.iriiy i iii iifii i isi! iyi iOi i iii+iPij i i>iiii iiYi iAitiiui% i i ivi iiz i2 iwi,i i iii3iQiii ixi i6i9ik iii&i6i ii-i iiRiyiiQi9ici i'i.i ioi(iBiFi? il i i)iei i izi iSiTi iii{i/iii" i ibi/ii`iii0iuiiviii1ii i iiUii*i i/iEiiSii8iZi|i}iFi+i ii!i~i2i,iFiP iim ii iieisiiCi ir iiii iiai3iZi%i-iiii i4iiiiAiii i iii iiiiDi.iiii inii iii iii ii3 i5iJi0i is i ii ii@ iiiVii/i i i6iWiA i7ioi iiPi0ii1iin iiiaiQi2iipi:iiiPiibiiiii i{ i3i7iEiii iii| iFiGiXiiiiii]i i4iii} iii i5ii&ii8i i ii iiiii iLiiiii i iYi iiiii4 i iB i9i8iiiii iHi i/i3iZi[ii io iii:i0i ini\ii]ii^iiii i iiiIiiii;ii4ii<ii=i;i ii iiiXi iiii5 i_ii i iiiii}i0i>ip iJiiiKii ii& iFiiii i i#ii[iiiifi i>iq ii?ir ii6iiii i iiiiijiiiii@i-ipi9i; i6iyiAiii i i' iiiiiiiiViii`ii4iii iKi iai i6 i iiiiii"iiiKi i iiii iYiGioiibifici7i is ipiri i8iiiii i iA iQ i iC i,i ii iiii\iLiiuii~ i iii9iiiBiiZiii iCiiiijidii0ihigiiei iMi} i7 i ii iiDi iiiiifi:iiiNi;i iEiFii( iii<iiiGiMi=iwigii~ it i?iiii itimi# i ii+iiihiiiiii[ i iOi i iii iiB iii$ it ii iiia ii iiHiiiiiQi"i< i i ii-i1ii#iu i'iiD i i ii i iIii>iJi% iiiPi i iii i i=ia iiKiiv iiii i ii ii_iijii?iE i1i i iikii8iQii iliii i imi@i iibiiii iRi iii5ii iiiLi iw iiniiii4iHi iiMii iiiiiii\ iioiiNi] i ii ii\ix igiiEi iiiiiiipii iiqi iiiiiiOiii iri iZi isitiiii iPieiii iiioi ii^ ii}iiiiziAi& iii i iiini-ii iQiiii iiiiRiiui iiiiBiii iy ii iviwiBihiqiiii<ii*iiiSi"iTiCi>i)i ixiUiiii~iiiiziiViiiiiC i)iqiiiWi i iiiDiiEiTiFipiii#i#iyii iiiGiiz iiiii ii iiSiiXi iiiiiu i i=iHiii_ iiRiiiiiiwiiiYizi{iqiii3ii5ii i i{ ii i|i}iSi~ii i i iZi[iiiiii` iiF ii]i i iniiiIii i iiiii iG iTiJiiKiziSiri\i) ii iv ii5iiii ib iiijiiiii iii]i^ii iiciiii i ii iai:i1i iiiiAihi ia i i6iiii ib i-ii iH i_ii ii i iii iiii| ii* ifii ii i iD ii iLiWiiiiUii i ii$ii i i iNiiiR ikiiE iiiiiMiiS i' ii`iisiiF ii iai} i i i( ijii i~ iViBi[ib iWi iibi iI iic i i ii{ii i ii ici i i idi i i]iiii= ieiiiiii iii iNi iiifigi i i iihiiiii i=iiXiiiiiiiiid iiHiCi iiiiTiWi i ii9ii iNi iKiEiji4iJ i iYi iiG i ikiiihiOii i i i]iPiZiiliiQi[ikiiminiRioic iiiiiiSiXiiii\i+iiiiiIiTiUiUiii iili iDiiiipiiqi iki imii iK iiiiiiiVi8 i i iiri@iWiri iCiGiiii ii^i ii i8iti i:i i i!iinisi i"i i#i$i]iti i%i i&iriui'i+ i(i)iie i i}i iiii*i4i1i+ii i i ii ii,ii i> iXitiri? ii i-i iviui{iiw iwii.ixiT i, iii i/i0ii ii1i ii2i iGiRi i i^iiYi iZi i i[i3i^iiii ii i) i\i i4i@ivii5ii6i7iid i]i ii^i8ii&i i ii i9 iyiuii i iiziRii{ii ii(i_ii<i9iili iii_i iSi`iki i[i iii ixi:i i;i<i! i$i=ii|iii>idi i i?iei iiii ii iii i}i@iAiBii.i~iaiOi i ii`ibii i%i iii i;i iiiiCiiDi iiiif i" iL i i i ii iEi;iiFi&iGi i iix iHi)iiiciiIidiTii i ieiiiii iiJi igi~iiUiie i iiiifiai8igi i ibihiKiy iii iLii: i iii ii*iM iiii icitiiMiNiii ii ii iiif iiiYidieii*i iiOiH ii# ii#i; i i iiiiI i\i@ iii isi$ i iPiQi i i iRijiSiTii+iiUiiVi iiLi i!i iJ i\i4iWi iiXiYiZii[i>iwikifiii+iii% iii$ii\iiiili i]iili^i_ig i%ii`iaigiiii iiN iK ibicidii ic iwi iei ibiyi ifihigihihii'iii imiiz ijid iii i i i<iii|iiiiii iiiO iki iliii iaiiimiii ini iiui iniiiie i& i ioiii i i< iipiqiP iQ iiji ii iii(ii_irisi i iii<iEiR ifiiiii]iiiIiti=iiuiivii iioi i iki,iliwi' ii imiiiiFi`ii if i ii iSiJixiiyiziniiL iipiOii ii i{i i iiA iyiiiU ii|i}i~iFi iqii i iiiiii iiiipiiiB iioi iiiipii- iiriiiqiqii( iiriiiisi iii iii i(i. isi) iiti i ii* iiuiiiTiviM i{ iiitii'iiii iiiiiiiig iZiwi i iciiji+ ipiiiixiii ih iiii iiii i, i= i ii i iuiiiii/ iyii i iyivi i iiwiiiiii ii iziiiii>iiCi'iiii{iiZiiii iii iiaiii iiqi?ii ii|ii i"ii ii i}iiiii=iiAi i1ii)iiii?i i iiiixi ii ii i i iihiiS iiii(ii iii'ixiyii ii i i iiiii_i iii> ii}iPiii iiii~ii iN iicii iiiiHii ii iiiiiiiiiiiiij iii i* iiii i i iiih iii_iii/i i<ii~i7ik iT iii]i iU ibi itiiig iizii ii| iiiiiiiii{iii ii0 ii ii+ i i, iiiiIiiiii i iiiBi ii4isi iiiii i iii?iCiii iiGi iiiiiiiiiiiiiii|i1 iiimiC iiil iiii i} ii? iiii iiih iiiIiiiiV iiiiiiii^iiii i- i. iii)iii iiii2 iiiiii ii iiAii ii- iiiii i ii ii iiiiii ii iii iiiQi i iO iiiiiiiiziKii ii[i iJiii@ ii. iiiiiD ii}i/ i@ii iii i i@iiRiii ij i~iiiJiii iiiii i0 iimiiiim i~ ii i ii1 iii iiiiii idiiiiXiii9iii iiiUiiiiiiLii3 ii ii i i iii i iii iii$i(iviii&iibii iii i iiiiii{iiiiiiiiiii2 ii iiii iii iiiiiiii^iiiV i iiiiiiiiiiiiii2iW ii iW ioii iik iX iii iA i4 ii ii3 iii iii ii iii iiiiiii i iiHiiiiiiiiiiiDiiiIisi iii ii iiiiiwii{iiiiiii/ in i,iiiii i iii ii ii i ii4 iB iiiiP i5 i ii i ii ii iii|iiziiiii i'ii5 iiii! ii iyiiiViii i i iiiiiiiiii i iii-iiiiii ii i i iiii ii" i%iiiiJiC iiixiiii i i iil i6 iiiii ii iiiXii ii7 ii i iNi im iiii iWi i i!i ii i i>i8 ii"i#i9 ij iD i i ii$i i%ii iiiXi&ii'iE i i(iF ii)iixi ikiiiii*i+ii iiDiii,iiiiiiiKi-i.i/i: ii0iJiii1i|i iii iii iEi*i2i iiiiiiHixi iii3ii iii3iiii; ipii< i iii ii4i5i i i6iiOii i7i8ii9ii:i ii;iiiii<i iiY i=i>i i i?ii@iAiBi i ii= i iiio i ifiiii i i i iCi iDii# ii i> iiEii iFiZ iE iii i[ i$ i iiGi? ii iiiG iiii@ iHiiA i\ iLiiiii iIi i iiiiiiiJi i i i iKiLi] iMiNi iijiiQ i iB iOiPiiiQi iiiRi iSiTii(iiiiC iiUiiVi iWiXiiiYiiiiZiiidi[iciH ii_ii#i0 i\ii]iini i iiii^iii_ik iD ii`iaii ibii i iciiiiidiii iiiidi^ iE ieiiii iiiifii_ i7iiii i iiF iiigi-iii! iiihi iqi;i iiiiXii i iiiiijiiii ikiliii~imiG i` iniyip iiioi>iipiiqi iiiriia iiiisiti" iui|ii?iiiiviiiiiieiiiwixiyiiiiizi{i@i|ii i}i i iii% isiiR ii.iiMi?i ii~iiib iii@ii iiiii iiiiiiii ii6 iI iiii iiiiic iiiiii i i2iiiimii@iiii iiiNii iifiiiiZi iiiiii i\iH iid iiiJ ii ii i iiii iiK iiii# iiii ii iiiiKiiiiigiiiihii>ii.iiiiiiiii)in itiiii io i iI i i iiiq iiir i iiiiiip ii ii iziiiiUiiJ iii1 iK itiiiiiii iiiJiiiL i iiiiiii iMiii ii iiiieii iiii i iiiiiiiriiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"N(iiiiiii iRiiiiiii inii!i iiLi,iAiis iiiiiiL iS iii iiii.iNiiiiii:iiii?iii=iNiKiiiil iii i ii i ii iiii ioi$ iiiii ici8iiiiiiiiizi|iit i"i ie i@i\ii iiiiiiiFiiM iQiHiiiPiviif iiiiDiT iiiFiN iiEi iOii/iisii3i<i2i ii&iLiiiO iiiGiiiM iii?ii i`iiF i*iigi iZi i:ii iiKi ii iiiiii`iiiig ii i iqii~iiiP i ii iii!iiuiii*iii i ii~iiiiieiiGi^iiii iUiCiiBiiiiiii ijioi/iiiOi2 i[iii i& iiiiiSi(ii iipi]ii6iii i' iiiiii8ii+i% i[iii\iiiiiiX i( iii i0ii iHi i i"i!ii+i i1i"iii iOiG iiifi1iiiiiiii2i9iili,ii iiiiii}ih i#iq iQiMi&i iXiii#iii iiiijiiiMiii i%ii ii$iii'i iiN ii ii7iiJii!iiiiiiMii) iPiU iiii ii%i i ii ii i iIii3 ii iir ii i iiiimiii$iiixii iii ii ii%i&ii iiiiiiii&ii'iii'iii.ii iiiH iiiii$i#iiDi&iAi iiiiiiUiGiiii iQ iPiSi'iiidi i0iFiii* iiiiiiiJii iUiiiiI iR iii<iiS i:i7 i ii i i9ii}ii iiiViPiT ii)iCiiii& i i i)iiim iiiiiii4 iiiin i*iiiiiiiO iiiii i+ i(i i iiiU i(ii5iYiji iliiuii)i i*i+iV i i=i iiiiiii4ii!iiiTi, ixiiieii iiJ iPiis i5iAiV i/iki i iili!i iiAii`ii i iiAii iiii ii i iiiiiiMi iiiiiiW iii it iii+i}iij i8 iiiiiiiii- i)imi iiW ii ii iiaii iP iK i i,ii ii7i' iu ii{ik iiiii i9 iiiiiiiiiii1iibii i iiio iiX i,iQ iiiiii i i iX iiii5iDiiiliii[i iiiY ii%ii. iY ii*iii iiR iii ipiiinicigi+iii'i2iiii{iil iim iii: iifi ii|i5 iiiiiZ i i i i ii i,ii iii;iiIiYiii[ iXi"ii iiii~iii,iikiii-iiiiiiDiiii>i]ii,iiiiviLiBiii&iii iiiiGiiiiBii i! iiiu iiiii i iaiiiiv iS ii}i; iiDii=ii0i ii\ i( iiiivi iiiiii.iii9iHiiiii] iEiiiiii!ii/ iii i i-iiiQi*ii.i/iiiii0 i3ii" ii*iRiiiiWiii/iibi.ii iiiiiiiRii ii) ii2ii iiiiiiiZ iiT iiw iiii iiiiiii[ iOii i i`i7ix i^ iiiiiii\ iiiiiiigiiin ii i_ii~iiii0ii iaiiy i] iiiii iii i;ii i-i iiL iiii/iiiii`ii#i"iiiii0i isiiiidisi iiY ii ikiwio ii iiii1ii2iigip iQiiUi iv iiiiiCiSii^ iii5iiiBii_i ibiNiiiXiiii iiLici i i iKiw i* iaiGi3ii i iii1i6i i2i6 iNiii i i3ii:ii\iqiiii-iii i3i iiiix i ii irii4i i_ iiU iiii@ii5i ii ii ii/i+ i6i iiiiiii i7 iZ iiii8i4iiCiii iilii` iiiiiiYiiiii5i i{iiiii$i7iiMiV i0irii iigiiVii8ii9i, iZiii{i#iW i0iii$i i i ii4ii[iiviiiciiViM i$i- iiiiX iii idiiiWi[ iii iiiq i ii1 iiiiitiiii ii i i2 ii2i:i3 i i.iii2ii iiiiii%i iii i i iiiiiii i i6i i4 ii|iiiSiiii_ i iiiii`iiiii i3iii;ir iiii7iYiLi;ii i iiiiiTi\iiii<iiVi5 iii iii ii"ixi%ii;i8 i iii2iEi=i!iiii^iiwi i"iiiis ii#i<iQiiiri$ii]ii%ii. i&i i3i5iBiiy i'iii ii i i>iY ia ib i(i i i)i*i iiiii:ii6ii^ii iii(i i+i+i i ixi,i i.ihi/ i-iiii iVi ii ihiiz i.iiiii<iii;i/i?iii i i0i8i i ii5i6i i_i)i1i2i i3iyi iii i i^i4i i i?i$i+i\ i i5i_iWii iz i6i0 ii i] i iip i7i ii8i^ i< iiVi9i i6 iiIiwi}ic i^ii i9i@ii iAi iii i:iei1iiiBiiiiii i i ii7 i;i<ii=i{ ii(i`iRi1 iYiiIi ii i i6i id i>iiie i?iioiiqiYiniiiliiCiDi{ ii i_ iEiPiUii i iiiiEimii@ii:i ii iAiiiiii# i iNi i iBiiCiWiTiTiii iif i;iDii&i i| iiiiii iii<i= i iii iVii iioii iEi iFiii iiii iiiDi-i8 iiGidi i i iHit iiiIizi iiJi i iKii i| iiiii> iiiiiiiLi:i i=iiMii? i iiiHiiiiiNiii iOiPiiFikiQi9 i iii i iu iiv iiiiiiRiSiii} i i>iiiii i: iTi iiN iiCiiiiUi~ii iWiiGiiii,iiiiiOii|iiiiOi?iVi` ii ii~ i iw iiii@i!iii; iiiiiWii"i iXiiYiiRig iuii ih i ix i=i iiZii< iii[i i#ii= i i\i$ii]iHiIi^i7iO i$ i i_i%iviJii i!iwitii`iaibi9 i&ii"i{ii i i'iciidi8iiiii[i9iiidiZ i ieiii i@ i!i(i"ifiiii i#i$iTigiKii i%iiWiMihiiiiiiii%iiiiii i` iiyi7imiLijiki i: i> i!iiii iBi)ili|i ii iziiii iiMi ii iiimiiniuiq ivii i i*iNioipiiiqi7i.iriiy i iii iifii i isi! iyi iOi i iii+iPij i i>iiii iiYi iAitiiui% i i ivi iiz i2 iwi,i i iii3iQiii ixi i6i9ik iii&i6i ii-i iiRiyiiQi9ici i'i.i ioi(iBiFi? il i i)iei i izi iSiTi iii{i/iii" i ibi/ii`iii0iuiiviii1ii i iiUii*i i/iEiiSii8iZi|i}iFi+i ii!i~i2i,iFiP iim ii iieisiiCi ir iiii iiai3iZi%i-iiii i4iiiiAiii i iii iiiiDi.iiii inii iii iii ii3 i5iJi0i is i ii ii@ iiiVii/i i i6iWiA i7ioi iiPi0ii1iin iiiaiQi2iipi:iiiPiibiiiii i{ i3i7iEiii iii| iFiGiXiiiiii]i i4iii} iii i5ii&ii8i i ii iiiii iLiiiii i iYi iiiii4 i iB i9i8iiiii iHi i/i3iZi[ii io iii:i0i ini\ii]ii^iiii i iiiIiiii;ii4ii<ii=i;i ii iiiXi iiii5 i_ii i iiiii}i0i>ip iJiiiKii ii& iFiiii i i#ii[iiiifi i>iq ii?ir ii6iiii i iiiiijiiiii@i-ipi9i; i6iyiAiii i i' iiiiiiiiViii`ii4iii iKi iai i6 i iiiiii"iiiKi i iiii iYiGioiibifici7i is ipiri i8iiiii i iA iQ i iC i,i ii iiii\iLiiuii~ i iii9iiiBiiZiii iCiiiijidii0ihigiiei iMi} i7 i ii iiDi iiiiifi:iiiNi;i iEiFii( iii<iiiGiMi=iwigii~ it i?iiii itimi# i ii+iiihiiiiii[ i iOi i iii iiB iii$ it ii iiia ii iiHiiiiiQi"i< i i ii-i1ii#iu i'iiD i i ii i iIii>iJi% iiiPi i iii i i=ia iiKiiv iiii i ii ii_iijii?iE i1i i iikii8iQii iliii i imi@i iibiiii iRi iii5ii iiiLi iw iiniiii4iHi iiMii iiiiiii\ iioiiNi] i ii ii\ix igiiEi iiiiiiipii iiqi iiiiiiOiii iri iZi isitiiii iPieiii iiioi ii^ ii}iiiiziAi& iii i iiini-ii iQiiii iiiiRiiui iiiiBiii iy ii iviwiBihiqiiii<ii*iiiSi"iTiCi>i)i ixiUiiii~iiiiziiViiiiiC i)iqiiiWi i iiiDiiEiTiFipiii#i#iyii iiiGiiz iiiii ii iiSiiXi iiiiiu i i=iHiii_ iiRiiiiiiwiiiYizi{iqiii3ii5ii i i{ ii i|i}iSi~ii i i iZi[iiiiii` iiF ii]i i iniiiIii i iiiii iG iTiJiiKiziSiri\i) ii iv ii5iiii ib iiijiiiii iii]i^ii iiciiii i ii iai:i1i iiiiAihi ia i i6iiii ib i-ii iH i_ii ii i iii iiii| ii* ifii ii i iD ii iLiWiiiiUii i ii$ii i i iNiiiR ikiiE iiiiiMiiS i' ii`iisiiF ii iai} i i i( ijii i~ iViBi[ib iWi iibi iI iic i i ii{ii i ii ici i i idi i i]iiii= ieiiiiii iii iNi iiifigi i i iihiiiii i=iiXiiiiiiiiid iiHiCi iiiiTiWi i ii9ii iNi iKiEiji4iJ i iYi iiG i ikiiihiOii i i i]iPiZiiliiQi[ikiiminiRioic iiiiiiSiXiiii\i+iiiiiIiTiUiUiii iili iDiiiipiiqi iki imii iK iiiiiiiVi8 i i iiri@iWiri iCiGiiii ii^i ii i8iti i:i i i!iinisi i"i i#i$i]iti i%i i&iriui'i+ i(i)iie i i}i iiii*i4i1i+ii i i ii ii,ii i> iXitiri? ii i-i iviui{iiw iwii.ixiT i, iii i/i0ii ii1i ii2i iGiRi i i^iiYi iZi i i[i3i^iiii ii i) i\i i4i@ivii5ii6i7iid i]i ii^i8ii&i i ii i9 iyiuii i iiziRii{ii ii(i_ii<i9iili iii_i iSi`iki i[i iii ixi:i i;i<i! i$i=ii|iii>idi i i?iei iiii ii iii i}i@iAiBii.i~iaiOi i ii`ibii i%i iii i;i iiiiCiiDi iiiif i" iL i i i ii iEi;iiFi&iGi i iix iHi)iiiciiIidiTii i ieiiiii iiJi igi~iiUiie i iiiifiai8igi i ibihiKiy iii iLii: i iii ii*iM iiii icitiiMiNiii ii ii iiif iiiYidieii*i iiOiH ii# ii#i; i i iiiiI i\i@ iii isi$ i iPiQi i i iRijiSiTii+iiUiiVi iiLi i!i iJ i\i4iWi iiXiYiZii[i>iwikifiii+iii% iii$ii\iiiili i]iili^i_ig i%ii`iaigiiii iiN iK ibicidii ic iwi iei ibiyi ifihigihihii'iii imiiz ijid iii i i i<iii|iiiiii iiiO iki iliii iaiiimiii ini iiui iniiiie i& i ioiii i i< iipiqiP iQ iiji ii iii(ii_irisi i iii<iEiR ifiiiii]iiiIiti=iiuiivii iioi i iki,iliwi' ii imiiiiFi`ii if i ii iSiJixiiyiziniiL iipiOii ii i{i i iiA iyiiiU ii|i}i~iFi iqii i iiiiii iiiipiiiB iioi iiiipii- iiriiiqiqii( iiriiiisi iii iii i(i. isi) iiti i ii* iiuiiiTiviM i{ iiitii'iiii iiiiiiiig iZiwi i iciiji+ ipiiiixiii ih iiii iiii i, i= i ii i iuiiiii/ iyii i iyivi i iiwiiiiii ii iziiiii>iiCi'iiii{iiZiiii iii iiaiii iiqi?ii ii|ii i"ii ii i}iiiii=iiAi i1ii)iiii?i i iiiixi ii ii i i iihiiS iiii(ii iii'ixiyii ii i i iiiii_i iii> ii}iPiii iiii~ii iN iicii iiiiHii ii iiiiiiiiiiiiij iii i* iiii i i iiih iii_iii/i i<ii~i7ik iT iii]i iU ibi itiiig iizii ii| iiiiiiiii{iii ii0 ii ii+ i i, iiiiIiiiii i iiiBi ii4isi iiiii i iii?iCiii iiGi iiiiiiiiiiiiiii|i1 iiimiC iiil iiii i} ii? iiii iiih iiiIiiiiV iiiiiiii^iiii i- i. iii)iii iiii2 iiiiii ii iiAii ii- iiiii i ii ii iiiiii ii iii iiiQi i iO iiiiiiiiziKii ii[i iJiii@ ii. iiiiiD ii}i/ i@ii iii i i@iiRiii ij i~iiiJiii iiiii i0 iimiiiim i~ ii i ii1 iii iiiiii idiiiiXiii9iii iiiUiiiiiiLii3 ii ii i i iii i iii iii$i(iviii&iibii iii i iiiiii{iiiiiiiiiii2 ii iiii iii iiiiiiii^iiiV i iiiiiiiiiiiiii2iW ii iW ioii iik iX iii iA i4 ii ii3 iii iii ii iii iiiiiii i iiHiiiiiiiiiiiDiiiIisi iii ii iiiiiwii{iiiiiii/ in i,iiiii i iii ii ii i ii4 iB iiiiP i5 i ii i ii ii iii|iiziiiii i'ii5 iiii! ii iyiiiViii i i iiiiiiiiii i iii-iiiiii ii i i iiii ii" i%iiiiJiC iiixiiii i i iil i6 iiiii ii iiiXii ii7 ii i iNi im iiii iWi i i!i ii i i>i8 ii"i#i9 ij iD i i ii$i i%ii iiiXi&ii'iE i i(iF ii)iixi ikiiiii*i+ii iiDiii,iiiiiiiKi-i.i/i: ii0iJiii1i|i iii iii iEi*i2i iiiiiiHixi iii3ii iii3iiii; ipii< i iii ii4i5i i i6iiOii i7i8ii9ii:i ii;iiiii<i iiY i=i>i i i?ii@iAiBi i ii= i iiio i ifiiii i i i iCi iDii# ii i> iiEii iFiZ iE iii i[ i$ i iiGi? ii iiiG iiii@ iHiiA i\ iLiiiii iIi i iiiiiiiJi i i i iKiLi] iMiNi iijiiQ i iB iOiPiiiQi iiiRi iSiTii(iiiiC iiUiiVi iWiXiiiYiiiiZiiidi[iciH ii_ii#i0 i\ii]iini i iiii^iii_ik iD ii`iaii ibii i iciiiiidiii iiiidi^ iE ieiiii iiiifii_ i7iiii i iiF iiigi-iii! iiihi iqi;i iiiiXii i iiiiijiiii ikiliii~imiG i` iniyip iiioi>iipiiqi iiiriia iiiisiti" iui|ii?iiiiviiiiiieiiiwixiyiiiiizi{i@i|ii i}i i iii% isiiR ii.iiMi?i ii~iiib iii@ii iiiii iiiiiiii ii6 iI iiii iiiiic iiiiii i i2iiiimii@iiii iiiNii iifiiiiZi iiiiii i\iH iid iiiJ ii ii i iiii iiK iiii# iiii ii iiiiKiiiiigiiiihii>ii.iiiiiiiii)in itiiiii io i iI i i iiiq iiir i iiiiiip ii ii iziiiiUiiJ iii1 iK itiiiiiii iiiJiiiL i iiiiiii iMiii ii iiiieii iiii i iiiiiiiriiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"(t EUCTW_TYPICAL_DISTRIBUTION_RATIOtEUCTW_TABLE_SIZEtEUCTWCharToFreqOrder(((s5/usr/lib/python2.7/site-packages/chardet/euctwfreq.pyt,sPK[L!site-packages/chardet/__init__.pynu[######################## BEGIN LICENSE BLOCK ######################## # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### __version__ = "2.2.1" from sys import version_info def detect(aBuf): if ((version_info < (3, 0) and isinstance(aBuf, unicode)) or (version_info >= (3, 0) and not isinstance(aBuf, bytes))): raise ValueError('Expected a bytes object, not a unicode object') from . import universaldetector u = universaldetector.UniversalDetector() u.reset() u.feed(aBuf) u.close() return u.result PK[vgDD$site-packages/chardet/big5prober.pycnu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tBig5DistributionAnalysis(t Big5SMModelt Big5ProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pyR#s  cCsdS(NtBig5((R ((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pytget_charset_name)s(t__name__t __module__RR (((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pyR"s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pytsPK[nn&site-packages/chardet/charsetprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from . import constants import re class CharSetProber: def __init__(self): pass def reset(self): self._mState = constants.eDetecting def get_charset_name(self): return None def feed(self, aBuf): pass def get_state(self): return self._mState def get_confidence(self): return 0.0 def filter_high_bit_only(self, aBuf): aBuf = re.sub(b'([\x00-\x7F])+', b' ', aBuf) return aBuf def filter_without_english_letters(self, aBuf): aBuf = re.sub(b'([A-Za-z])+', b' ', aBuf) return aBuf def filter_with_english_letters(self, aBuf): # TODO return aBuf PK[K=] , ,&site-packages/chardet/langthaimodel.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # 255: Control characters that usually does not exist in any text # 254: Carriage/Return # 253: symbol (punctuation) that does not belong to word # 252: 0 - 9 # The following result for thai was collected from a limited sample (1M). # Character Mapping Table: TIS620CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253,182,106,107,100,183,184,185,101, 94,186,187,108,109,110,111, # 40 188,189,190, 89, 95,112,113,191,192,193,194,253,253,253,253,253, # 50 253, 64, 72, 73,114, 74,115,116,102, 81,201,117, 90,103, 78, 82, # 60 96,202, 91, 79, 84,104,105, 97, 98, 92,203,253,253,253,253,253, # 70 209,210,211,212,213, 88,214,215,216,217,218,219,220,118,221,222, 223,224, 99, 85, 83,225,226,227,228,229,230,231,232,233,234,235, 236, 5, 30,237, 24,238, 75, 8, 26, 52, 34, 51,119, 47, 58, 57, 49, 53, 55, 43, 20, 19, 44, 14, 48, 3, 17, 25, 39, 62, 31, 54, 45, 9, 16, 2, 61, 15,239, 12, 42, 46, 18, 21, 76, 4, 66, 63, 22, 10, 1, 36, 23, 13, 40, 27, 32, 35, 86,240,241,242,243,244, 11, 28, 41, 29, 33,245, 50, 37, 6, 7, 67, 77, 38, 93,246,247, 68, 56, 59, 65, 69, 60, 70, 80, 71, 87,248,249,250,251,252,253, ) # Model Table: # total sequences: 100% # first 512 sequences: 92.6386% # first 1024 sequences:7.3177% # rest sequences: 1.0230% # negative sequences: 0.0436% ThaiLangModel = ( 0,1,3,3,3,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,0,0,3,3,3,0,3,3,3,3, 0,3,3,0,0,0,1,3,0,3,3,2,3,3,0,1,2,3,3,3,3,0,2,0,2,0,0,3,2,1,2,2, 3,0,3,3,2,3,0,0,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,0,3,2,3,0,2,2,2,3, 0,2,3,0,0,0,0,1,0,1,2,3,1,1,3,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1, 3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,3,3,2,3,2,3,3,2,2,2, 3,1,2,3,0,3,3,2,2,1,2,3,3,1,2,0,1,3,0,1,0,0,1,0,0,0,0,0,0,0,1,1, 3,3,2,2,3,3,3,3,1,2,3,3,3,3,3,2,2,2,2,3,3,2,2,3,3,2,2,3,2,3,2,2, 3,3,1,2,3,1,2,2,3,3,1,0,2,1,0,0,3,1,2,1,0,0,1,0,0,0,0,0,0,1,0,1, 3,3,3,3,3,3,2,2,3,3,3,3,2,3,2,2,3,3,2,2,3,2,2,2,2,1,1,3,1,2,1,1, 3,2,1,0,2,1,0,1,0,1,1,0,1,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0, 3,3,3,2,3,2,3,3,2,2,3,2,3,3,2,3,1,1,2,3,2,2,2,3,2,2,2,2,2,1,2,1, 2,2,1,1,3,3,2,1,0,1,2,2,0,1,3,0,0,0,1,1,0,0,0,0,0,2,3,0,0,2,1,1, 3,3,2,3,3,2,0,0,3,3,0,3,3,0,2,2,3,1,2,2,1,1,1,0,2,2,2,0,2,2,1,1, 0,2,1,0,2,0,0,2,0,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,2,3,3,2,0,0,3,3,0,2,3,0,2,1,2,2,2,2,1,2,0,0,2,2,2,0,2,2,1,1, 0,2,1,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0, 3,3,2,3,2,3,2,0,2,2,1,3,2,1,3,2,1,2,3,2,2,3,0,2,3,2,2,1,2,2,2,2, 1,2,2,0,0,0,0,2,0,1,2,0,1,1,1,0,1,0,3,1,1,0,0,0,0,0,0,0,0,0,1,0, 3,3,2,3,3,2,3,2,2,2,3,2,2,3,2,2,1,2,3,2,2,3,1,3,2,2,2,3,2,2,2,3, 3,2,1,3,0,1,1,1,0,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,2,0,0, 1,0,0,3,0,3,3,3,3,3,0,0,3,0,2,2,3,3,3,3,3,0,0,0,1,1,3,0,0,0,0,2, 0,0,1,0,0,0,0,0,0,0,2,3,0,0,0,3,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0, 2,0,3,3,3,3,0,0,2,3,0,0,3,0,3,3,2,3,3,3,3,3,0,0,3,3,3,0,0,0,3,3, 0,0,3,0,0,0,0,2,0,0,2,1,1,3,0,0,1,0,0,2,3,0,1,0,0,0,0,0,0,0,1,0, 3,3,3,3,2,3,3,3,3,3,3,3,1,2,1,3,3,2,2,1,2,2,2,3,1,1,2,0,2,1,2,1, 2,2,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0, 3,0,2,1,2,3,3,3,0,2,0,2,2,0,2,1,3,2,2,1,2,1,0,0,2,2,1,0,2,1,2,2, 0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,2,1,3,3,1,1,3,0,2,3,1,1,3,2,1,1,2,0,2,2,3,2,1,1,1,1,1,2, 3,0,0,1,3,1,2,1,2,0,3,0,0,0,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, 3,3,1,1,3,2,3,3,3,1,3,2,1,3,2,1,3,2,2,2,2,1,3,3,1,2,1,3,1,2,3,0, 2,1,1,3,2,2,2,1,2,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2, 3,3,2,3,2,3,3,2,3,2,3,2,3,3,2,1,0,3,2,2,2,1,2,2,2,1,2,2,1,2,1,1, 2,2,2,3,0,1,3,1,1,1,1,0,1,1,0,2,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,2,3,2,2,1,1,3,2,3,2,3,2,0,3,2,2,1,2,0,2,2,2,1,2,2,2,2,1, 3,2,1,2,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,2,3,1,2,3,3,2,2,3,0,1,1,2,0,3,3,2,2,3,0,1,1,3,0,0,0,0, 3,1,0,3,3,0,2,0,2,1,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,2,3,2,3,3,0,1,3,1,1,2,1,2,1,1,3,1,1,0,2,3,1,1,1,1,1,1,1,1, 3,1,1,2,2,2,2,1,1,1,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,2,2,1,1,2,1,3,3,2,3,2,2,3,2,2,3,1,2,2,1,2,0,3,2,1,2,2,2,2,2,1, 3,2,1,2,2,2,1,1,1,1,0,0,1,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,1,3,3,0,2,1,0,3,2,0,0,3,1,0,1,1,0,1,0,0,0,0,0,1, 1,0,0,1,0,3,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,2,2,2,3,0,0,1,3,0,3,2,0,3,2,2,3,3,3,3,3,1,0,2,2,2,0,2,2,1,2, 0,2,3,0,0,0,0,1,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,0,2,3,1,3,3,2,3,3,0,3,3,0,3,2,2,3,2,3,3,3,0,0,2,2,3,0,1,1,1,3, 0,0,3,0,0,0,2,2,0,1,3,0,1,2,2,2,3,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1, 3,2,3,3,2,0,3,3,2,2,3,1,3,2,1,3,2,0,1,2,2,0,2,3,2,1,0,3,0,0,0,0, 3,0,0,2,3,1,3,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,3,2,2,2,1,2,0,1,3,1,1,3,1,3,0,0,2,1,1,1,1,2,1,1,1,0,2,1,0,1, 1,2,0,0,0,3,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0, 3,3,3,3,2,2,2,2,2,1,3,1,1,1,2,0,1,1,2,1,2,1,3,2,0,0,3,1,1,1,1,1, 3,1,0,2,3,0,0,0,3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,2,3,0,3,3,0,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,2,3,1,3,0,0,1,2,0,0,2,0,3,3,2,3,3,3,2,3,0,0,2,2,2,0,0,0,2,2, 0,0,1,0,0,0,0,3,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,1,2,3,1,3,3,0,0,1,0,3,0,0,0,0,0, 0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,1,2,3,1,2,3,1,0,3,0,2,2,1,0,2,1,1,2,0,1,0,0,1,1,1,1,0,1,0,0, 1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,2,1,0,1,1,1,3,1,2,2,2,2,2,2,1,1,1,1,0,3,1,0,1,3,1,1,1,1, 1,1,0,2,0,1,3,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1, 3,0,2,2,1,3,3,2,3,3,0,1,1,0,2,2,1,2,1,3,3,1,0,0,3,2,0,0,0,0,2,1, 0,1,0,0,0,0,1,2,0,1,1,3,1,1,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,3,0,0,1,0,0,0,3,0,0,3,0,3,1,0,1,1,1,3,2,0,0,0,3,0,0,0,0,2,0, 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,1,3,2,1,3,3,1,2,2,0,1,2,1,0,1,2,0,0,0,0,0,3,0,0,0,3,0,0,0,0, 3,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,1,2,0,3,3,3,2,2,0,1,1,0,1,3,0,0,0,2,2,0,0,0,0,3,1,0,1,0,0,0, 0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,2,3,1,2,0,0,2,1,0,3,1,0,1,2,0,1,1,1,1,3,0,0,3,1,1,0,2,2,1,1, 0,2,0,0,0,0,0,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,3,1,2,0,0,2,2,0,1,2,0,1,0,1,3,1,2,1,0,0,0,2,0,3,0,0,0,1,0, 0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,1,1,2,2,0,0,0,2,0,2,1,0,1,1,0,1,1,1,2,1,0,0,1,1,1,0,2,1,1,1, 0,1,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1, 0,0,0,2,0,1,3,1,1,1,1,0,0,0,0,3,2,0,1,0,0,0,1,2,0,0,0,1,0,0,0,0, 0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,2,3,2,2,0,0,0,1,0,0,0,0,2,3,2,1,2,2,3,0,0,0,2,3,1,0,0,0,1,1, 0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0, 3,3,2,2,0,1,0,0,0,0,2,0,2,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,1,1,0,0, 0,1,0,2,0,0,1,0,3,0,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,1,0,0,1,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,0,0,0,0,1,1,0,0, 0,1,0,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0, 3,3,1,1,1,1,2,3,0,0,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,0,1,2,1,1,0,1, 2,1,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,3,1,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1, 0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,2,0,0,0,0,0,0,1,2,1,0,1,1,0,2,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,2,0,0,0,1,3,0,1,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,0, 3,3,0,0,1,1,2,0,0,1,2,1,0,1,1,1,0,1,1,0,0,2,1,1,0,1,0,0,1,1,1,0, 0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,1,0,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0, 1,0,0,1,0,1,1,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,3,0,0,0,0,1,1,0,0,0,0,0,0,0,3, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,1,0,1,0,0,2,0,0,2,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,0,1,1,0,0,0, 1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 1,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,3,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0, 1,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,1,0,0,2,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ) TIS620ThaiModel = { 'charToOrderMap': TIS620CharToOrderMap, 'precedenceMatrix': ThaiLangModel, 'mTypicalPositiveRatio': 0.926386, 'keepEnglishLetter': False, 'charsetName': "TIS-620" } # flake8: noqa PK[*."site-packages/chardet/euckrfreq.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # Sampling from about 20M text materials include literature and computer technology # 128 --> 0.79 # 256 --> 0.92 # 512 --> 0.986 # 1024 --> 0.99944 # 2048 --> 0.99999 # # Idea Distribution Ratio = 0.98653 / (1-0.98653) = 73.24 # Random Distribution Ration = 512 / (2350-512) = 0.279. # # Typical Distribution Ratio EUCKR_TYPICAL_DISTRIBUTION_RATIO = 6.0 EUCKR_TABLE_SIZE = 2352 # Char to FreqOrder table , EUCKRCharToFreqOrder = ( \ 13, 130, 120,1396, 481,1719,1720, 328, 609, 212,1721, 707, 400, 299,1722, 87, 1397,1723, 104, 536,1117,1203,1724,1267, 685,1268, 508,1725,1726,1727,1728,1398, 1399,1729,1730,1731, 141, 621, 326,1057, 368,1732, 267, 488, 20,1733,1269,1734, 945,1400,1735, 47, 904,1270,1736,1737, 773, 248,1738, 409, 313, 786, 429,1739, 116, 987, 813,1401, 683, 75,1204, 145,1740,1741,1742,1743, 16, 847, 667, 622, 708,1744,1745,1746, 966, 787, 304, 129,1747, 60, 820, 123, 676,1748,1749,1750, 1751, 617,1752, 626,1753,1754,1755,1756, 653,1757,1758,1759,1760,1761,1762, 856, 344,1763,1764,1765,1766, 89, 401, 418, 806, 905, 848,1767,1768,1769, 946,1205, 709,1770,1118,1771, 241,1772,1773,1774,1271,1775, 569,1776, 999,1777,1778,1779, 1780, 337, 751,1058, 28, 628, 254,1781, 177, 906, 270, 349, 891,1079,1782, 19, 1783, 379,1784, 315,1785, 629, 754,1402, 559,1786, 636, 203,1206,1787, 710, 567, 1788, 935, 814,1789,1790,1207, 766, 528,1791,1792,1208,1793,1794,1795,1796,1797, 1403,1798,1799, 533,1059,1404,1405,1156,1406, 936, 884,1080,1800, 351,1801,1802, 1803,1804,1805, 801,1806,1807,1808,1119,1809,1157, 714, 474,1407,1810, 298, 899, 885,1811,1120, 802,1158,1812, 892,1813,1814,1408, 659,1815,1816,1121,1817,1818, 1819,1820,1821,1822, 319,1823, 594, 545,1824, 815, 937,1209,1825,1826, 573,1409, 1022,1827,1210,1828,1829,1830,1831,1832,1833, 556, 722, 807,1122,1060,1834, 697, 1835, 900, 557, 715,1836,1410, 540,1411, 752,1159, 294, 597,1211, 976, 803, 770, 1412,1837,1838, 39, 794,1413, 358,1839, 371, 925,1840, 453, 661, 788, 531, 723, 544,1023,1081, 869, 91,1841, 392, 430, 790, 602,1414, 677,1082, 457,1415,1416, 1842,1843, 475, 327,1024,1417, 795, 121,1844, 733, 403,1418,1845,1846,1847, 300, 119, 711,1212, 627,1848,1272, 207,1849,1850, 796,1213, 382,1851, 519,1852,1083, 893,1853,1854,1855, 367, 809, 487, 671,1856, 663,1857,1858, 956, 471, 306, 857, 1859,1860,1160,1084,1861,1862,1863,1864,1865,1061,1866,1867,1868,1869,1870,1871, 282, 96, 574,1872, 502,1085,1873,1214,1874, 907,1875,1876, 827, 977,1419,1420, 1421, 268,1877,1422,1878,1879,1880, 308,1881, 2, 537,1882,1883,1215,1884,1885, 127, 791,1886,1273,1423,1887, 34, 336, 404, 643,1888, 571, 654, 894, 840,1889, 0, 886,1274, 122, 575, 260, 908, 938,1890,1275, 410, 316,1891,1892, 100,1893, 1894,1123, 48,1161,1124,1025,1895, 633, 901,1276,1896,1897, 115, 816,1898, 317, 1899, 694,1900, 909, 734,1424, 572, 866,1425, 691, 85, 524,1010, 543, 394, 841, 1901,1902,1903,1026,1904,1905,1906,1907,1908,1909, 30, 451, 651, 988, 310,1910, 1911,1426, 810,1216, 93,1912,1913,1277,1217,1914, 858, 759, 45, 58, 181, 610, 269,1915,1916, 131,1062, 551, 443,1000, 821,1427, 957, 895,1086,1917,1918, 375, 1919, 359,1920, 687,1921, 822,1922, 293,1923,1924, 40, 662, 118, 692, 29, 939, 887, 640, 482, 174,1925, 69,1162, 728,1428, 910,1926,1278,1218,1279, 386, 870, 217, 854,1163, 823,1927,1928,1929,1930, 834,1931, 78,1932, 859,1933,1063,1934, 1935,1936,1937, 438,1164, 208, 595,1938,1939,1940,1941,1219,1125,1942, 280, 888, 1429,1430,1220,1431,1943,1944,1945,1946,1947,1280, 150, 510,1432,1948,1949,1950, 1951,1952,1953,1954,1011,1087,1955,1433,1043,1956, 881,1957, 614, 958,1064,1065, 1221,1958, 638,1001, 860, 967, 896,1434, 989, 492, 553,1281,1165,1959,1282,1002, 1283,1222,1960,1961,1962,1963, 36, 383, 228, 753, 247, 454,1964, 876, 678,1965, 1966,1284, 126, 464, 490, 835, 136, 672, 529, 940,1088,1435, 473,1967,1968, 467, 50, 390, 227, 587, 279, 378, 598, 792, 968, 240, 151, 160, 849, 882,1126,1285, 639,1044, 133, 140, 288, 360, 811, 563,1027, 561, 142, 523,1969,1970,1971, 7, 103, 296, 439, 407, 506, 634, 990,1972,1973,1974,1975, 645,1976,1977,1978,1979, 1980,1981, 236,1982,1436,1983,1984,1089, 192, 828, 618, 518,1166, 333,1127,1985, 818,1223,1986,1987,1988,1989,1990,1991,1992,1993, 342,1128,1286, 746, 842,1994, 1995, 560, 223,1287, 98, 8, 189, 650, 978,1288,1996,1437,1997, 17, 345, 250, 423, 277, 234, 512, 226, 97, 289, 42, 167,1998, 201,1999,2000, 843, 836, 824, 532, 338, 783,1090, 182, 576, 436,1438,1439, 527, 500,2001, 947, 889,2002,2003, 2004,2005, 262, 600, 314, 447,2006, 547,2007, 693, 738,1129,2008, 71,1440, 745, 619, 688,2009, 829,2010,2011, 147,2012, 33, 948,2013,2014, 74, 224,2015, 61, 191, 918, 399, 637,2016,1028,1130, 257, 902,2017,2018,2019,2020,2021,2022,2023, 2024,2025,2026, 837,2027,2028,2029,2030, 179, 874, 591, 52, 724, 246,2031,2032, 2033,2034,1167, 969,2035,1289, 630, 605, 911,1091,1168,2036,2037,2038,1441, 912, 2039, 623,2040,2041, 253,1169,1290,2042,1442, 146, 620, 611, 577, 433,2043,1224, 719,1170, 959, 440, 437, 534, 84, 388, 480,1131, 159, 220, 198, 679,2044,1012, 819,1066,1443, 113,1225, 194, 318,1003,1029,2045,2046,2047,2048,1067,2049,2050, 2051,2052,2053, 59, 913, 112,2054, 632,2055, 455, 144, 739,1291,2056, 273, 681, 499,2057, 448,2058,2059, 760,2060,2061, 970, 384, 169, 245,1132,2062,2063, 414, 1444,2064,2065, 41, 235,2066, 157, 252, 877, 568, 919, 789, 580,2067, 725,2068, 2069,1292,2070,2071,1445,2072,1446,2073,2074, 55, 588, 66,1447, 271,1092,2075, 1226,2076, 960,1013, 372,2077,2078,2079,2080,2081,1293,2082,2083,2084,2085, 850, 2086,2087,2088,2089,2090, 186,2091,1068, 180,2092,2093,2094, 109,1227, 522, 606, 2095, 867,1448,1093, 991,1171, 926, 353,1133,2096, 581,2097,2098,2099,1294,1449, 1450,2100, 596,1172,1014,1228,2101,1451,1295,1173,1229,2102,2103,1296,1134,1452, 949,1135,2104,2105,1094,1453,1454,1455,2106,1095,2107,2108,2109,2110,2111,2112, 2113,2114,2115,2116,2117, 804,2118,2119,1230,1231, 805,1456, 405,1136,2120,2121, 2122,2123,2124, 720, 701,1297, 992,1457, 927,1004,2125,2126,2127,2128,2129,2130, 22, 417,2131, 303,2132, 385,2133, 971, 520, 513,2134,1174, 73,1096, 231, 274, 962,1458, 673,2135,1459,2136, 152,1137,2137,2138,2139,2140,1005,1138,1460,1139, 2141,2142,2143,2144, 11, 374, 844,2145, 154,1232, 46,1461,2146, 838, 830, 721, 1233, 106,2147, 90, 428, 462, 578, 566,1175, 352,2148,2149, 538,1234, 124,1298, 2150,1462, 761, 565,2151, 686,2152, 649,2153, 72, 173,2154, 460, 415,2155,1463, 2156,1235, 305,2157,2158,2159,2160,2161,2162, 579,2163,2164,2165,2166,2167, 747, 2168,2169,2170,2171,1464, 669,2172,2173,2174,2175,2176,1465,2177, 23, 530, 285, 2178, 335, 729,2179, 397,2180,2181,2182,1030,2183,2184, 698,2185,2186, 325,2187, 2188, 369,2189, 799,1097,1015, 348,2190,1069, 680,2191, 851,1466,2192,2193, 10, 2194, 613, 424,2195, 979, 108, 449, 589, 27, 172, 81,1031, 80, 774, 281, 350, 1032, 525, 301, 582,1176,2196, 674,1045,2197,2198,1467, 730, 762,2199,2200,2201, 2202,1468,2203, 993,2204,2205, 266,1070, 963,1140,2206,2207,2208, 664,1098, 972, 2209,2210,2211,1177,1469,1470, 871,2212,2213,2214,2215,2216,1471,2217,2218,2219, 2220,2221,2222,2223,2224,2225,2226,2227,1472,1236,2228,2229,2230,2231,2232,2233, 2234,2235,1299,2236,2237, 200,2238, 477, 373,2239,2240, 731, 825, 777,2241,2242, 2243, 521, 486, 548,2244,2245,2246,1473,1300, 53, 549, 137, 875, 76, 158,2247, 1301,1474, 469, 396,1016, 278, 712,2248, 321, 442, 503, 767, 744, 941,1237,1178, 1475,2249, 82, 178,1141,1179, 973,2250,1302,2251, 297,2252,2253, 570,2254,2255, 2256, 18, 450, 206,2257, 290, 292,1142,2258, 511, 162, 99, 346, 164, 735,2259, 1476,1477, 4, 554, 343, 798,1099,2260,1100,2261, 43, 171,1303, 139, 215,2262, 2263, 717, 775,2264,1033, 322, 216,2265, 831,2266, 149,2267,1304,2268,2269, 702, 1238, 135, 845, 347, 309,2270, 484,2271, 878, 655, 238,1006,1478,2272, 67,2273, 295,2274,2275, 461,2276, 478, 942, 412,2277,1034,2278,2279,2280, 265,2281, 541, 2282,2283,2284,2285,2286, 70, 852,1071,2287,2288,2289,2290, 21, 56, 509, 117, 432,2291,2292, 331, 980, 552,1101, 148, 284, 105, 393,1180,1239, 755,2293, 187, 2294,1046,1479,2295, 340,2296, 63,1047, 230,2297,2298,1305, 763,1306, 101, 800, 808, 494,2299,2300,2301, 903,2302, 37,1072, 14, 5,2303, 79, 675,2304, 312, 2305,2306,2307,2308,2309,1480, 6,1307,2310,2311,2312, 1, 470, 35, 24, 229, 2313, 695, 210, 86, 778, 15, 784, 592, 779, 32, 77, 855, 964,2314, 259,2315, 501, 380,2316,2317, 83, 981, 153, 689,1308,1481,1482,1483,2318,2319, 716,1484, 2320,2321,2322,2323,2324,2325,1485,2326,2327, 128, 57, 68, 261,1048, 211, 170, 1240, 31,2328, 51, 435, 742,2329,2330,2331, 635,2332, 264, 456,2333,2334,2335, 425,2336,1486, 143, 507, 263, 943,2337, 363, 920,1487, 256,1488,1102, 243, 601, 1489,2338,2339,2340,2341,2342,2343,2344, 861,2345,2346,2347,2348,2349,2350, 395, 2351,1490,1491, 62, 535, 166, 225,2352,2353, 668, 419,1241, 138, 604, 928,2354, 1181,2355,1492,1493,2356,2357,2358,1143,2359, 696,2360, 387, 307,1309, 682, 476, 2361,2362, 332, 12, 222, 156,2363, 232,2364, 641, 276, 656, 517,1494,1495,1035, 416, 736,1496,2365,1017, 586,2366,2367,2368,1497,2369, 242,2370,2371,2372,1498, 2373, 965, 713,2374,2375,2376,2377, 740, 982,1499, 944,1500,1007,2378,2379,1310, 1501,2380,2381,2382, 785, 329,2383,2384,1502,2385,2386,2387, 932,2388,1503,2389, 2390,2391,2392,1242,2393,2394,2395,2396,2397, 994, 950,2398,2399,2400,2401,1504, 1311,2402,2403,2404,2405,1049, 749,2406,2407, 853, 718,1144,1312,2408,1182,1505, 2409,2410, 255, 516, 479, 564, 550, 214,1506,1507,1313, 413, 239, 444, 339,1145, 1036,1508,1509,1314,1037,1510,1315,2411,1511,2412,2413,2414, 176, 703, 497, 624, 593, 921, 302,2415, 341, 165,1103,1512,2416,1513,2417,2418,2419, 376,2420, 700, 2421,2422,2423, 258, 768,1316,2424,1183,2425, 995, 608,2426,2427,2428,2429, 221, 2430,2431,2432,2433,2434,2435,2436,2437, 195, 323, 726, 188, 897, 983,1317, 377, 644,1050, 879,2438, 452,2439,2440,2441,2442,2443,2444, 914,2445,2446,2447,2448, 915, 489,2449,1514,1184,2450,2451, 515, 64, 427, 495,2452, 583,2453, 483, 485, 1038, 562, 213,1515, 748, 666,2454,2455,2456,2457, 334,2458, 780, 996,1008, 705, 1243,2459,2460,2461,2462,2463, 114,2464, 493,1146, 366, 163,1516, 961,1104,2465, 291,2466,1318,1105,2467,1517, 365,2468, 355, 951,1244,2469,1319,2470, 631,2471, 2472, 218,1320, 364, 320, 756,1518,1519,1321,1520,1322,2473,2474,2475,2476, 997, 2477,2478,2479,2480, 665,1185,2481, 916,1521,2482,2483,2484, 584, 684,2485,2486, 797,2487,1051,1186,2488,2489,2490,1522,2491,2492, 370,2493,1039,1187, 65,2494, 434, 205, 463,1188,2495, 125, 812, 391, 402, 826, 699, 286, 398, 155, 781, 771, 585,2496, 590, 505,1073,2497, 599, 244, 219, 917,1018, 952, 646,1523,2498,1323, 2499,2500, 49, 984, 354, 741,2501, 625,2502,1324,2503,1019, 190, 357, 757, 491, 95, 782, 868,2504,2505,2506,2507,2508,2509, 134,1524,1074, 422,1525, 898,2510, 161,2511,2512,2513,2514, 769,2515,1526,2516,2517, 411,1325,2518, 472,1527,2519, 2520,2521,2522,2523,2524, 985,2525,2526,2527,2528,2529,2530, 764,2531,1245,2532, 2533, 25, 204, 311,2534, 496,2535,1052,2536,2537,2538,2539,2540,2541,2542, 199, 704, 504, 468, 758, 657,1528, 196, 44, 839,1246, 272, 750,2543, 765, 862,2544, 2545,1326,2546, 132, 615, 933,2547, 732,2548,2549,2550,1189,1529,2551, 283,1247, 1053, 607, 929,2552,2553,2554, 930, 183, 872, 616,1040,1147,2555,1148,1020, 441, 249,1075,2556,2557,2558, 466, 743,2559,2560,2561, 92, 514, 426, 420, 526,2562, 2563,2564,2565,2566,2567,2568, 185,2569,2570,2571,2572, 776,1530, 658,2573, 362, 2574, 361, 922,1076, 793,2575,2576,2577,2578,2579,2580,1531, 251,2581,2582,2583, 2584,1532, 54, 612, 237,1327,2585,2586, 275, 408, 647, 111,2587,1533,1106, 465, 3, 458, 9, 38,2588, 107, 110, 890, 209, 26, 737, 498,2589,1534,2590, 431, 202, 88,1535, 356, 287,1107, 660,1149,2591, 381,1536, 986,1150, 445,1248,1151, 974,2592,2593, 846,2594, 446, 953, 184,1249,1250, 727,2595, 923, 193, 883,2596, 2597,2598, 102, 324, 539, 817,2599, 421,1041,2600, 832,2601, 94, 175, 197, 406, 2602, 459,2603,2604,2605,2606,2607, 330, 555,2608,2609,2610, 706,1108, 389,2611, 2612,2613,2614, 233,2615, 833, 558, 931, 954,1251,2616,2617,1537, 546,2618,2619, 1009,2620,2621,2622,1538, 690,1328,2623, 955,2624,1539,2625,2626, 772,2627,2628, 2629,2630,2631, 924, 648, 863, 603,2632,2633, 934,1540, 864, 865,2634, 642,1042, 670,1190,2635,2636,2637,2638, 168,2639, 652, 873, 542,1054,1541,2640,2641,2642, # 512, 256 #Everything below is of no interest for detection purpose 2643,2644,2645,2646,2647,2648,2649,2650,2651,2652,2653,2654,2655,2656,2657,2658, 2659,2660,2661,2662,2663,2664,2665,2666,2667,2668,2669,2670,2671,2672,2673,2674, 2675,2676,2677,2678,2679,2680,2681,2682,2683,2684,2685,2686,2687,2688,2689,2690, 2691,2692,2693,2694,2695,2696,2697,2698,2699,1542, 880,2700,2701,2702,2703,2704, 2705,2706,2707,2708,2709,2710,2711,2712,2713,2714,2715,2716,2717,2718,2719,2720, 2721,2722,2723,2724,2725,1543,2726,2727,2728,2729,2730,2731,2732,1544,2733,2734, 2735,2736,2737,2738,2739,2740,2741,2742,2743,2744,2745,2746,2747,2748,2749,2750, 2751,2752,2753,2754,1545,2755,2756,2757,2758,2759,2760,2761,2762,2763,2764,2765, 2766,1546,2767,1547,2768,2769,2770,2771,2772,2773,2774,2775,2776,2777,2778,2779, 2780,2781,2782,2783,2784,2785,2786,1548,2787,2788,2789,1109,2790,2791,2792,2793, 2794,2795,2796,2797,2798,2799,2800,2801,2802,2803,2804,2805,2806,2807,2808,2809, 2810,2811,2812,1329,2813,2814,2815,2816,2817,2818,2819,2820,2821,2822,2823,2824, 2825,2826,2827,2828,2829,2830,2831,2832,2833,2834,2835,2836,2837,2838,2839,2840, 2841,2842,2843,2844,2845,2846,2847,2848,2849,2850,2851,2852,2853,2854,2855,2856, 1549,2857,2858,2859,2860,1550,2861,2862,1551,2863,2864,2865,2866,2867,2868,2869, 2870,2871,2872,2873,2874,1110,1330,2875,2876,2877,2878,2879,2880,2881,2882,2883, 2884,2885,2886,2887,2888,2889,2890,2891,2892,2893,2894,2895,2896,2897,2898,2899, 2900,2901,2902,2903,2904,2905,2906,2907,2908,2909,2910,2911,2912,2913,2914,2915, 2916,2917,2918,2919,2920,2921,2922,2923,2924,2925,2926,2927,2928,2929,2930,1331, 2931,2932,2933,2934,2935,2936,2937,2938,2939,2940,2941,2942,2943,1552,2944,2945, 2946,2947,2948,2949,2950,2951,2952,2953,2954,2955,2956,2957,2958,2959,2960,2961, 2962,2963,2964,1252,2965,2966,2967,2968,2969,2970,2971,2972,2973,2974,2975,2976, 2977,2978,2979,2980,2981,2982,2983,2984,2985,2986,2987,2988,2989,2990,2991,2992, 2993,2994,2995,2996,2997,2998,2999,3000,3001,3002,3003,3004,3005,3006,3007,3008, 3009,3010,3011,3012,1553,3013,3014,3015,3016,3017,1554,3018,1332,3019,3020,3021, 3022,3023,3024,3025,3026,3027,3028,3029,3030,3031,3032,3033,3034,3035,3036,3037, 3038,3039,3040,3041,3042,3043,3044,3045,3046,3047,3048,3049,3050,1555,3051,3052, 3053,1556,1557,3054,3055,3056,3057,3058,3059,3060,3061,3062,3063,3064,3065,3066, 3067,1558,3068,3069,3070,3071,3072,3073,3074,3075,3076,1559,3077,3078,3079,3080, 3081,3082,3083,1253,3084,3085,3086,3087,3088,3089,3090,3091,3092,3093,3094,3095, 3096,3097,3098,3099,3100,3101,3102,3103,3104,3105,3106,3107,3108,1152,3109,3110, 3111,3112,3113,1560,3114,3115,3116,3117,1111,3118,3119,3120,3121,3122,3123,3124, 3125,3126,3127,3128,3129,3130,3131,3132,3133,3134,3135,3136,3137,3138,3139,3140, 3141,3142,3143,3144,3145,3146,3147,3148,3149,3150,3151,3152,3153,3154,3155,3156, 3157,3158,3159,3160,3161,3162,3163,3164,3165,3166,3167,3168,3169,3170,3171,3172, 3173,3174,3175,3176,1333,3177,3178,3179,3180,3181,3182,3183,3184,3185,3186,3187, 3188,3189,1561,3190,3191,1334,3192,3193,3194,3195,3196,3197,3198,3199,3200,3201, 3202,3203,3204,3205,3206,3207,3208,3209,3210,3211,3212,3213,3214,3215,3216,3217, 3218,3219,3220,3221,3222,3223,3224,3225,3226,3227,3228,3229,3230,3231,3232,3233, 3234,1562,3235,3236,3237,3238,3239,3240,3241,3242,3243,3244,3245,3246,3247,3248, 3249,3250,3251,3252,3253,3254,3255,3256,3257,3258,3259,3260,3261,3262,3263,3264, 3265,3266,3267,3268,3269,3270,3271,3272,3273,3274,3275,3276,3277,1563,3278,3279, 3280,3281,3282,3283,3284,3285,3286,3287,3288,3289,3290,3291,3292,3293,3294,3295, 3296,3297,3298,3299,3300,3301,3302,3303,3304,3305,3306,3307,3308,3309,3310,3311, 3312,3313,3314,3315,3316,3317,3318,3319,3320,3321,3322,3323,3324,3325,3326,3327, 3328,3329,3330,3331,3332,3333,3334,3335,3336,3337,3338,3339,3340,3341,3342,3343, 3344,3345,3346,3347,3348,3349,3350,3351,3352,3353,3354,3355,3356,3357,3358,3359, 3360,3361,3362,3363,3364,1335,3365,3366,3367,3368,3369,3370,3371,3372,3373,3374, 3375,3376,3377,3378,3379,3380,3381,3382,3383,3384,3385,3386,3387,1336,3388,3389, 3390,3391,3392,3393,3394,3395,3396,3397,3398,3399,3400,3401,3402,3403,3404,3405, 3406,3407,3408,3409,3410,3411,3412,3413,3414,1337,3415,3416,3417,3418,3419,1338, 3420,3421,3422,1564,1565,3423,3424,3425,3426,3427,3428,3429,3430,3431,1254,3432, 3433,3434,1339,3435,3436,3437,3438,3439,1566,3440,3441,3442,3443,3444,3445,3446, 3447,3448,3449,3450,3451,3452,3453,3454,1255,3455,3456,3457,3458,3459,1567,1191, 3460,1568,1569,3461,3462,3463,1570,3464,3465,3466,3467,3468,1571,3469,3470,3471, 3472,3473,1572,3474,3475,3476,3477,3478,3479,3480,3481,3482,3483,3484,3485,3486, 1340,3487,3488,3489,3490,3491,3492,1021,3493,3494,3495,3496,3497,3498,1573,3499, 1341,3500,3501,3502,3503,3504,3505,3506,3507,3508,3509,3510,3511,1342,3512,3513, 3514,3515,3516,1574,1343,3517,3518,3519,1575,3520,1576,3521,3522,3523,3524,3525, 3526,3527,3528,3529,3530,3531,3532,3533,3534,3535,3536,3537,3538,3539,3540,3541, 3542,3543,3544,3545,3546,3547,3548,3549,3550,3551,3552,3553,3554,3555,3556,3557, 3558,3559,3560,3561,3562,3563,3564,3565,3566,3567,3568,3569,3570,3571,3572,3573, 3574,3575,3576,3577,3578,3579,3580,1577,3581,3582,1578,3583,3584,3585,3586,3587, 3588,3589,3590,3591,3592,3593,3594,3595,3596,3597,3598,3599,3600,3601,3602,3603, 3604,1579,3605,3606,3607,3608,3609,3610,3611,3612,3613,3614,3615,3616,3617,3618, 3619,3620,3621,3622,3623,3624,3625,3626,3627,3628,3629,1580,3630,3631,1581,3632, 3633,3634,3635,3636,3637,3638,3639,3640,3641,3642,3643,3644,3645,3646,3647,3648, 3649,3650,3651,3652,3653,3654,3655,3656,1582,3657,3658,3659,3660,3661,3662,3663, 3664,3665,3666,3667,3668,3669,3670,3671,3672,3673,3674,3675,3676,3677,3678,3679, 3680,3681,3682,3683,3684,3685,3686,3687,3688,3689,3690,3691,3692,3693,3694,3695, 3696,3697,3698,3699,3700,1192,3701,3702,3703,3704,1256,3705,3706,3707,3708,1583, 1257,3709,3710,3711,3712,3713,3714,3715,3716,1584,3717,3718,3719,3720,3721,3722, 3723,3724,3725,3726,3727,3728,3729,3730,3731,3732,3733,3734,3735,3736,3737,3738, 3739,3740,3741,3742,3743,3744,3745,1344,3746,3747,3748,3749,3750,3751,3752,3753, 3754,3755,3756,1585,3757,3758,3759,3760,3761,3762,3763,3764,3765,3766,1586,3767, 3768,3769,3770,3771,3772,3773,3774,3775,3776,3777,3778,1345,3779,3780,3781,3782, 3783,3784,3785,3786,3787,3788,3789,3790,3791,3792,3793,3794,3795,1346,1587,3796, 3797,1588,3798,3799,3800,3801,3802,3803,3804,3805,3806,1347,3807,3808,3809,3810, 3811,1589,3812,3813,3814,3815,3816,3817,3818,3819,3820,3821,1590,3822,3823,1591, 1348,3824,3825,3826,3827,3828,3829,3830,1592,3831,3832,1593,3833,3834,3835,3836, 3837,3838,3839,3840,3841,3842,3843,3844,1349,3845,3846,3847,3848,3849,3850,3851, 3852,3853,3854,3855,3856,3857,3858,1594,3859,3860,3861,3862,3863,3864,3865,3866, 3867,3868,3869,1595,3870,3871,3872,3873,1596,3874,3875,3876,3877,3878,3879,3880, 3881,3882,3883,3884,3885,3886,1597,3887,3888,3889,3890,3891,3892,3893,3894,3895, 1598,3896,3897,3898,1599,1600,3899,1350,3900,1351,3901,3902,1352,3903,3904,3905, 3906,3907,3908,3909,3910,3911,3912,3913,3914,3915,3916,3917,3918,3919,3920,3921, 3922,3923,3924,1258,3925,3926,3927,3928,3929,3930,3931,1193,3932,1601,3933,3934, 3935,3936,3937,3938,3939,3940,3941,3942,3943,1602,3944,3945,3946,3947,3948,1603, 3949,3950,3951,3952,3953,3954,3955,3956,3957,3958,3959,3960,3961,3962,3963,3964, 3965,1604,3966,3967,3968,3969,3970,3971,3972,3973,3974,3975,3976,3977,1353,3978, 3979,3980,3981,3982,3983,3984,3985,3986,3987,3988,3989,3990,3991,1354,3992,3993, 3994,3995,3996,3997,3998,3999,4000,4001,4002,4003,4004,4005,4006,4007,4008,4009, 4010,4011,4012,4013,4014,4015,4016,4017,4018,4019,4020,4021,4022,4023,1355,4024, 4025,4026,4027,4028,4029,4030,4031,4032,4033,4034,4035,4036,4037,4038,4039,4040, 1605,4041,4042,4043,4044,4045,4046,4047,4048,4049,4050,4051,4052,4053,4054,4055, 4056,4057,4058,4059,4060,1606,4061,4062,4063,4064,1607,4065,4066,4067,4068,4069, 4070,4071,4072,4073,4074,4075,4076,1194,4077,4078,1608,4079,4080,4081,4082,4083, 4084,4085,4086,4087,1609,4088,4089,4090,4091,4092,4093,4094,4095,4096,4097,4098, 4099,4100,4101,4102,4103,4104,4105,4106,4107,4108,1259,4109,4110,4111,4112,4113, 4114,4115,4116,4117,4118,4119,4120,4121,4122,4123,4124,1195,4125,4126,4127,1610, 4128,4129,4130,4131,4132,4133,4134,4135,4136,4137,1356,4138,4139,4140,4141,4142, 4143,4144,1611,4145,4146,4147,4148,4149,4150,4151,4152,4153,4154,4155,4156,4157, 4158,4159,4160,4161,4162,4163,4164,4165,4166,4167,4168,4169,4170,4171,4172,4173, 4174,4175,4176,4177,4178,4179,4180,4181,4182,4183,4184,4185,4186,4187,4188,4189, 4190,4191,4192,4193,4194,4195,4196,4197,4198,4199,4200,4201,4202,4203,4204,4205, 4206,4207,4208,4209,4210,4211,4212,4213,4214,4215,4216,4217,4218,4219,1612,4220, 4221,4222,4223,4224,4225,4226,4227,1357,4228,1613,4229,4230,4231,4232,4233,4234, 4235,4236,4237,4238,4239,4240,4241,4242,4243,1614,4244,4245,4246,4247,4248,4249, 4250,4251,4252,4253,4254,4255,4256,4257,4258,4259,4260,4261,4262,4263,4264,4265, 4266,4267,4268,4269,4270,1196,1358,4271,4272,4273,4274,4275,4276,4277,4278,4279, 4280,4281,4282,4283,4284,4285,4286,4287,1615,4288,4289,4290,4291,4292,4293,4294, 4295,4296,4297,4298,4299,4300,4301,4302,4303,4304,4305,4306,4307,4308,4309,4310, 4311,4312,4313,4314,4315,4316,4317,4318,4319,4320,4321,4322,4323,4324,4325,4326, 4327,4328,4329,4330,4331,4332,4333,4334,1616,4335,4336,4337,4338,4339,4340,4341, 4342,4343,4344,4345,4346,4347,4348,4349,4350,4351,4352,4353,4354,4355,4356,4357, 4358,4359,4360,1617,4361,4362,4363,4364,4365,1618,4366,4367,4368,4369,4370,4371, 4372,4373,4374,4375,4376,4377,4378,4379,4380,4381,4382,4383,4384,4385,4386,4387, 4388,4389,4390,4391,4392,4393,4394,4395,4396,4397,4398,4399,4400,4401,4402,4403, 4404,4405,4406,4407,4408,4409,4410,4411,4412,4413,4414,4415,4416,1619,4417,4418, 4419,4420,4421,4422,4423,4424,4425,1112,4426,4427,4428,4429,4430,1620,4431,4432, 4433,4434,4435,4436,4437,4438,4439,4440,4441,4442,1260,1261,4443,4444,4445,4446, 4447,4448,4449,4450,4451,4452,4453,4454,4455,1359,4456,4457,4458,4459,4460,4461, 4462,4463,4464,4465,1621,4466,4467,4468,4469,4470,4471,4472,4473,4474,4475,4476, 4477,4478,4479,4480,4481,4482,4483,4484,4485,4486,4487,4488,4489,1055,4490,4491, 4492,4493,4494,4495,4496,4497,4498,4499,4500,4501,4502,4503,4504,4505,4506,4507, 4508,4509,4510,4511,4512,4513,4514,4515,4516,4517,4518,1622,4519,4520,4521,1623, 4522,4523,4524,4525,4526,4527,4528,4529,4530,4531,4532,4533,4534,4535,1360,4536, 4537,4538,4539,4540,4541,4542,4543, 975,4544,4545,4546,4547,4548,4549,4550,4551, 4552,4553,4554,4555,4556,4557,4558,4559,4560,4561,4562,4563,4564,4565,4566,4567, 4568,4569,4570,4571,1624,4572,4573,4574,4575,4576,1625,4577,4578,4579,4580,4581, 4582,4583,4584,1626,4585,4586,4587,4588,4589,4590,4591,4592,4593,4594,4595,1627, 4596,4597,4598,4599,4600,4601,4602,4603,4604,4605,4606,4607,4608,4609,4610,4611, 4612,4613,4614,4615,1628,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4626, 4627,4628,4629,4630,4631,4632,4633,4634,4635,4636,4637,4638,4639,4640,4641,4642, 4643,4644,4645,4646,4647,4648,4649,1361,4650,4651,4652,4653,4654,4655,4656,4657, 4658,4659,4660,4661,1362,4662,4663,4664,4665,4666,4667,4668,4669,4670,4671,4672, 4673,4674,4675,4676,4677,4678,4679,4680,4681,4682,1629,4683,4684,4685,4686,4687, 1630,4688,4689,4690,4691,1153,4692,4693,4694,1113,4695,4696,4697,4698,4699,4700, 4701,4702,4703,4704,4705,4706,4707,4708,4709,4710,4711,1197,4712,4713,4714,4715, 4716,4717,4718,4719,4720,4721,4722,4723,4724,4725,4726,4727,4728,4729,4730,4731, 4732,4733,4734,4735,1631,4736,1632,4737,4738,4739,4740,4741,4742,4743,4744,1633, 4745,4746,4747,4748,4749,1262,4750,4751,4752,4753,4754,1363,4755,4756,4757,4758, 4759,4760,4761,4762,4763,4764,4765,4766,4767,4768,1634,4769,4770,4771,4772,4773, 4774,4775,4776,4777,4778,1635,4779,4780,4781,4782,4783,4784,4785,4786,4787,4788, 4789,1636,4790,4791,4792,4793,4794,4795,4796,4797,4798,4799,4800,4801,4802,4803, 4804,4805,4806,1637,4807,4808,4809,1638,4810,4811,4812,4813,4814,4815,4816,4817, 4818,1639,4819,4820,4821,4822,4823,4824,4825,4826,4827,4828,4829,4830,4831,4832, 4833,1077,4834,4835,4836,4837,4838,4839,4840,4841,4842,4843,4844,4845,4846,4847, 4848,4849,4850,4851,4852,4853,4854,4855,4856,4857,4858,4859,4860,4861,4862,4863, 4864,4865,4866,4867,4868,4869,4870,4871,4872,4873,4874,4875,4876,4877,4878,4879, 4880,4881,4882,4883,1640,4884,4885,1641,4886,4887,4888,4889,4890,4891,4892,4893, 4894,4895,4896,4897,4898,4899,4900,4901,4902,4903,4904,4905,4906,4907,4908,4909, 4910,4911,1642,4912,4913,4914,1364,4915,4916,4917,4918,4919,4920,4921,4922,4923, 4924,4925,4926,4927,4928,4929,4930,4931,1643,4932,4933,4934,4935,4936,4937,4938, 4939,4940,4941,4942,4943,4944,4945,4946,4947,4948,4949,4950,4951,4952,4953,4954, 4955,4956,4957,4958,4959,4960,4961,4962,4963,4964,4965,4966,4967,4968,4969,4970, 4971,4972,4973,4974,4975,4976,4977,4978,4979,4980,1644,4981,4982,4983,4984,1645, 4985,4986,1646,4987,4988,4989,4990,4991,4992,4993,4994,4995,4996,4997,4998,4999, 5000,5001,5002,5003,5004,5005,1647,5006,1648,5007,5008,5009,5010,5011,5012,1078, 5013,5014,5015,5016,5017,5018,5019,5020,5021,5022,5023,5024,5025,5026,5027,5028, 1365,5029,5030,5031,5032,5033,5034,5035,5036,5037,5038,5039,1649,5040,5041,5042, 5043,5044,5045,1366,5046,5047,5048,5049,5050,5051,5052,5053,5054,5055,1650,5056, 5057,5058,5059,5060,5061,5062,5063,5064,5065,5066,5067,5068,5069,5070,5071,5072, 5073,5074,5075,5076,5077,1651,5078,5079,5080,5081,5082,5083,5084,5085,5086,5087, 5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102,5103, 5104,5105,5106,5107,5108,5109,5110,1652,5111,5112,5113,5114,5115,5116,5117,5118, 1367,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,1653,5130,5131,5132, 5133,5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148, 5149,1368,5150,1654,5151,1369,5152,5153,5154,5155,5156,5157,5158,5159,5160,5161, 5162,5163,5164,5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,5176,5177, 5178,1370,5179,5180,5181,5182,5183,5184,5185,5186,5187,5188,5189,5190,5191,5192, 5193,5194,5195,5196,5197,5198,1655,5199,5200,5201,5202,1656,5203,5204,5205,5206, 1371,5207,1372,5208,5209,5210,5211,1373,5212,5213,1374,5214,5215,5216,5217,5218, 5219,5220,5221,5222,5223,5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234, 5235,5236,5237,5238,5239,5240,5241,5242,5243,5244,5245,5246,5247,1657,5248,5249, 5250,5251,1658,1263,5252,5253,5254,5255,5256,1375,5257,5258,5259,5260,5261,5262, 5263,5264,5265,5266,5267,5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278, 5279,5280,5281,5282,5283,1659,5284,5285,5286,5287,5288,5289,5290,5291,5292,5293, 5294,5295,5296,5297,5298,5299,5300,1660,5301,5302,5303,5304,5305,5306,5307,5308, 5309,5310,5311,5312,5313,5314,5315,5316,5317,5318,5319,5320,5321,1376,5322,5323, 5324,5325,5326,5327,5328,5329,5330,5331,5332,5333,1198,5334,5335,5336,5337,5338, 5339,5340,5341,5342,5343,1661,5344,5345,5346,5347,5348,5349,5350,5351,5352,5353, 5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369, 5370,5371,5372,5373,5374,5375,5376,5377,5378,5379,5380,5381,5382,5383,5384,5385, 5386,5387,5388,5389,5390,5391,5392,5393,5394,5395,5396,5397,5398,1264,5399,5400, 5401,5402,5403,5404,5405,5406,5407,5408,5409,5410,5411,5412,1662,5413,5414,5415, 5416,1663,5417,5418,5419,5420,5421,5422,5423,5424,5425,5426,5427,5428,5429,5430, 5431,5432,5433,5434,5435,5436,5437,5438,1664,5439,5440,5441,5442,5443,5444,5445, 5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456,5457,5458,5459,5460,5461, 5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472,5473,5474,5475,5476,5477, 5478,1154,5479,5480,5481,5482,5483,5484,5485,1665,5486,5487,5488,5489,5490,5491, 5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504,5505,5506,5507, 5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520,5521,5522,5523, 5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536,5537,5538,5539, 5540,5541,5542,5543,5544,5545,5546,5547,5548,1377,5549,5550,5551,5552,5553,5554, 5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568,5569,5570, 1114,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584,5585, 5586,5587,5588,5589,5590,5591,5592,1378,5593,5594,5595,5596,5597,5598,5599,5600, 5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,1379,5615, 5616,5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631, 5632,5633,5634,1380,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646, 5647,5648,5649,1381,1056,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660, 1666,5661,5662,5663,5664,5665,5666,5667,5668,1667,5669,1668,5670,5671,5672,5673, 5674,5675,5676,5677,5678,1155,5679,5680,5681,5682,5683,5684,5685,5686,5687,5688, 5689,5690,5691,5692,5693,5694,5695,5696,5697,5698,1669,5699,5700,5701,5702,5703, 5704,5705,1670,5706,5707,5708,5709,5710,1671,5711,5712,5713,5714,1382,5715,5716, 5717,5718,5719,5720,5721,5722,5723,5724,5725,1672,5726,5727,1673,1674,5728,5729, 5730,5731,5732,5733,5734,5735,5736,1675,5737,5738,5739,5740,5741,5742,5743,5744, 1676,5745,5746,5747,5748,5749,5750,5751,1383,5752,5753,5754,5755,5756,5757,5758, 5759,5760,5761,5762,5763,5764,5765,5766,5767,5768,1677,5769,5770,5771,5772,5773, 1678,5774,5775,5776, 998,5777,5778,5779,5780,5781,5782,5783,5784,5785,1384,5786, 5787,5788,5789,5790,5791,5792,5793,5794,5795,5796,5797,5798,5799,5800,1679,5801, 5802,5803,1115,1116,5804,5805,5806,5807,5808,5809,5810,5811,5812,5813,5814,5815, 5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828,5829,5830,5831, 5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844,5845,5846,5847, 5848,5849,5850,5851,5852,5853,5854,5855,1680,5856,5857,5858,5859,5860,5861,5862, 5863,5864,1681,5865,5866,5867,1682,5868,5869,5870,5871,5872,5873,5874,5875,5876, 5877,5878,5879,1683,5880,1684,5881,5882,5883,5884,1685,5885,5886,5887,5888,5889, 5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905, 5906,5907,1686,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, 5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,1687, 5936,5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951, 5952,1688,1689,5953,1199,5954,5955,5956,5957,5958,5959,5960,5961,1690,5962,5963, 5964,5965,5966,5967,5968,5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979, 5980,5981,1385,5982,1386,5983,5984,5985,5986,5987,5988,5989,5990,5991,5992,5993, 5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004,6005,6006,6007,6008,6009, 6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020,6021,6022,6023,6024,6025, 6026,6027,1265,6028,6029,1691,6030,6031,6032,6033,6034,6035,6036,6037,6038,6039, 6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052,6053,6054,6055, 6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068,6069,6070,6071, 6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084,1692,6085,6086, 6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100,6101,6102, 6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116,6117,6118, 6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,1693,6132,6133, 6134,6135,6136,1694,6137,6138,6139,6140,6141,1695,6142,6143,6144,6145,6146,6147, 6148,6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163, 6164,6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179, 6180,6181,6182,6183,6184,6185,1696,6186,6187,6188,6189,6190,6191,6192,6193,6194, 6195,6196,6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210, 6211,6212,6213,6214,6215,6216,6217,6218,6219,1697,6220,6221,6222,6223,6224,6225, 6226,6227,6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241, 6242,6243,6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,1698,6254,6255,6256, 6257,6258,6259,6260,6261,6262,6263,1200,6264,6265,6266,6267,6268,6269,6270,6271, #1024 6272,6273,6274,6275,6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,6286,6287, 6288,6289,6290,6291,6292,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,1699, 6303,6304,1700,6305,6306,6307,6308,6309,6310,6311,6312,6313,6314,6315,6316,6317, 6318,6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333, 6334,6335,6336,6337,6338,6339,1701,6340,6341,6342,6343,6344,1387,6345,6346,6347, 6348,6349,6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363, 6364,6365,6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379, 6380,6381,6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395, 6396,6397,6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,6411, 6412,6413,1702,6414,6415,6416,6417,6418,6419,6420,6421,6422,1703,6423,6424,6425, 6426,6427,6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,1704,6439,6440, 6441,6442,6443,6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,6455,6456, 6457,6458,6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472, 6473,6474,6475,6476,6477,6478,6479,6480,6481,6482,6483,6484,6485,6486,6487,6488, 6489,6490,6491,6492,6493,6494,6495,6496,6497,6498,6499,6500,6501,6502,6503,1266, 6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516,6517,6518,6519, 6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532,6533,6534,6535, 6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548,6549,6550,6551, 1705,1706,6552,6553,6554,6555,6556,6557,6558,6559,6560,6561,6562,6563,6564,6565, 6566,6567,6568,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,6579,6580,6581, 6582,6583,6584,6585,6586,6587,6588,6589,6590,6591,6592,6593,6594,6595,6596,6597, 6598,6599,6600,6601,6602,6603,6604,6605,6606,6607,6608,6609,6610,6611,6612,6613, 6614,6615,6616,6617,6618,6619,6620,6621,6622,6623,6624,6625,6626,6627,6628,6629, 6630,6631,6632,6633,6634,6635,6636,6637,1388,6638,6639,6640,6641,6642,6643,6644, 1707,6645,6646,6647,6648,6649,6650,6651,6652,6653,6654,6655,6656,6657,6658,6659, 6660,6661,6662,6663,1708,6664,6665,6666,6667,6668,6669,6670,6671,6672,6673,6674, 1201,6675,6676,6677,6678,6679,6680,6681,6682,6683,6684,6685,6686,6687,6688,6689, 6690,6691,6692,6693,6694,6695,6696,6697,6698,6699,6700,6701,6702,6703,6704,6705, 6706,6707,6708,6709,6710,6711,6712,6713,6714,6715,6716,6717,6718,6719,6720,6721, 6722,6723,6724,6725,1389,6726,6727,6728,6729,6730,6731,6732,6733,6734,6735,6736, 1390,1709,6737,6738,6739,6740,6741,6742,1710,6743,6744,6745,6746,1391,6747,6748, 6749,6750,6751,6752,6753,6754,6755,6756,6757,1392,6758,6759,6760,6761,6762,6763, 6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777,6778,6779, 6780,1202,6781,6782,6783,6784,6785,6786,6787,6788,6789,6790,6791,6792,6793,6794, 6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806,6807,6808,6809,1711, 6810,6811,6812,6813,6814,6815,6816,6817,6818,6819,6820,6821,6822,6823,6824,6825, 6826,6827,6828,6829,6830,6831,6832,6833,6834,6835,6836,1393,6837,6838,6839,6840, 6841,6842,6843,6844,6845,6846,6847,6848,6849,6850,6851,6852,6853,6854,6855,6856, 6857,6858,6859,6860,6861,6862,6863,6864,6865,6866,6867,6868,6869,6870,6871,6872, 6873,6874,6875,6876,6877,6878,6879,6880,6881,6882,6883,6884,6885,6886,6887,6888, 6889,6890,6891,6892,6893,6894,6895,6896,6897,6898,6899,6900,6901,6902,1712,6903, 6904,6905,6906,6907,6908,6909,6910,1713,6911,6912,6913,6914,6915,6916,6917,6918, 6919,6920,6921,6922,6923,6924,6925,6926,6927,6928,6929,6930,6931,6932,6933,6934, 6935,6936,6937,6938,6939,6940,6941,6942,6943,6944,6945,6946,6947,6948,6949,6950, 6951,6952,6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966, 6967,6968,6969,6970,6971,6972,6973,6974,1714,6975,6976,6977,6978,6979,6980,6981, 6982,6983,6984,6985,6986,6987,6988,1394,6989,6990,6991,6992,6993,6994,6995,6996, 6997,6998,6999,7000,1715,7001,7002,7003,7004,7005,7006,7007,7008,7009,7010,7011, 7012,7013,7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027, 7028,1716,7029,7030,7031,7032,7033,7034,7035,7036,7037,7038,7039,7040,7041,7042, 7043,7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058, 7059,7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,7071,7072,7073,7074, 7075,7076,7077,7078,7079,7080,7081,7082,7083,7084,7085,7086,7087,7088,7089,7090, 7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105,7106, 7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,7119,7120,7121,7122, 7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136,7137,7138, 7139,7140,7141,7142,7143,7144,7145,7146,7147,7148,7149,7150,7151,7152,7153,7154, 7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167,7168,7169,7170, 7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183,7184,7185,7186, 7187,7188,7189,7190,7191,7192,7193,7194,7195,7196,7197,7198,7199,7200,7201,7202, 7203,7204,7205,7206,7207,1395,7208,7209,7210,7211,7212,7213,1717,7214,7215,7216, 7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229,7230,7231,7232, 7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245,7246,7247,7248, 7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261,7262,7263,7264, 7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277,7278,7279,7280, 7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293,7294,7295,7296, 7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308,7309,7310,7311,7312, 7313,1718,7314,7315,7316,7317,7318,7319,7320,7321,7322,7323,7324,7325,7326,7327, 7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339,7340,7341,7342,7343, 7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,7354,7355,7356,7357,7358,7359, 7360,7361,7362,7363,7364,7365,7366,7367,7368,7369,7370,7371,7372,7373,7374,7375, 7376,7377,7378,7379,7380,7381,7382,7383,7384,7385,7386,7387,7388,7389,7390,7391, 7392,7393,7394,7395,7396,7397,7398,7399,7400,7401,7402,7403,7404,7405,7406,7407, 7408,7409,7410,7411,7412,7413,7414,7415,7416,7417,7418,7419,7420,7421,7422,7423, 7424,7425,7426,7427,7428,7429,7430,7431,7432,7433,7434,7435,7436,7437,7438,7439, 7440,7441,7442,7443,7444,7445,7446,7447,7448,7449,7450,7451,7452,7453,7454,7455, 7456,7457,7458,7459,7460,7461,7462,7463,7464,7465,7466,7467,7468,7469,7470,7471, 7472,7473,7474,7475,7476,7477,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487, 7488,7489,7490,7491,7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503, 7504,7505,7506,7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519, 7520,7521,7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535, 7536,7537,7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,7550,7551, 7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, 7568,7569,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582,7583, 7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598,7599, 7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614,7615, 7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628,7629,7630,7631, 7632,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643,7644,7645,7646,7647, 7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659,7660,7661,7662,7663, 7664,7665,7666,7667,7668,7669,7670,7671,7672,7673,7674,7675,7676,7677,7678,7679, 7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690,7691,7692,7693,7694,7695, 7696,7697,7698,7699,7700,7701,7702,7703,7704,7705,7706,7707,7708,7709,7710,7711, 7712,7713,7714,7715,7716,7717,7718,7719,7720,7721,7722,7723,7724,7725,7726,7727, 7728,7729,7730,7731,7732,7733,7734,7735,7736,7737,7738,7739,7740,7741,7742,7743, 7744,7745,7746,7747,7748,7749,7750,7751,7752,7753,7754,7755,7756,7757,7758,7759, 7760,7761,7762,7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775, 7776,7777,7778,7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791, 7792,7793,7794,7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,7806,7807, 7808,7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823, 7824,7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839, 7840,7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855, 7856,7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871, 7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887, 7888,7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903, 7904,7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919, 7920,7921,7922,7923,7924,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, 7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, 7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, 7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, 7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, 8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, 8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, 8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, 8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, 8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, 8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, 8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, 8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, 8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, 8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, 8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, 8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, 8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, 8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, 8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, 8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, 8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271, 8272,8273,8274,8275,8276,8277,8278,8279,8280,8281,8282,8283,8284,8285,8286,8287, 8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303, 8304,8305,8306,8307,8308,8309,8310,8311,8312,8313,8314,8315,8316,8317,8318,8319, 8320,8321,8322,8323,8324,8325,8326,8327,8328,8329,8330,8331,8332,8333,8334,8335, 8336,8337,8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351, 8352,8353,8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,8364,8365,8366,8367, 8368,8369,8370,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382,8383, 8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398,8399, 8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,8411,8412,8413,8414,8415, 8416,8417,8418,8419,8420,8421,8422,8423,8424,8425,8426,8427,8428,8429,8430,8431, 8432,8433,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443,8444,8445,8446,8447, 8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459,8460,8461,8462,8463, 8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475,8476,8477,8478,8479, 8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490,8491,8492,8493,8494,8495, 8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,8510,8511, 8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522,8523,8524,8525,8526,8527, 8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8540,8541,8542,8543, 8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,8555,8556,8557,8558,8559, 8560,8561,8562,8563,8564,8565,8566,8567,8568,8569,8570,8571,8572,8573,8574,8575, 8576,8577,8578,8579,8580,8581,8582,8583,8584,8585,8586,8587,8588,8589,8590,8591, 8592,8593,8594,8595,8596,8597,8598,8599,8600,8601,8602,8603,8604,8605,8606,8607, 8608,8609,8610,8611,8612,8613,8614,8615,8616,8617,8618,8619,8620,8621,8622,8623, 8624,8625,8626,8627,8628,8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,8639, 8640,8641,8642,8643,8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655, 8656,8657,8658,8659,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671, 8672,8673,8674,8675,8676,8677,8678,8679,8680,8681,8682,8683,8684,8685,8686,8687, 8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, 8704,8705,8706,8707,8708,8709,8710,8711,8712,8713,8714,8715,8716,8717,8718,8719, 8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,8734,8735, 8736,8737,8738,8739,8740,8741) # flake8: noqa PK[ $ $)site-packages/chardet/chardistribution.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .euctwfreq import (EUCTWCharToFreqOrder, EUCTW_TABLE_SIZE, EUCTW_TYPICAL_DISTRIBUTION_RATIO) from .euckrfreq import (EUCKRCharToFreqOrder, EUCKR_TABLE_SIZE, EUCKR_TYPICAL_DISTRIBUTION_RATIO) from .gb2312freq import (GB2312CharToFreqOrder, GB2312_TABLE_SIZE, GB2312_TYPICAL_DISTRIBUTION_RATIO) from .big5freq import (Big5CharToFreqOrder, BIG5_TABLE_SIZE, BIG5_TYPICAL_DISTRIBUTION_RATIO) from .jisfreq import (JISCharToFreqOrder, JIS_TABLE_SIZE, JIS_TYPICAL_DISTRIBUTION_RATIO) from .compat import wrap_ord ENOUGH_DATA_THRESHOLD = 1024 SURE_YES = 0.99 SURE_NO = 0.01 MINIMUM_DATA_THRESHOLD = 3 class CharDistributionAnalysis: def __init__(self): # Mapping table to get frequency order from char order (get from # GetOrder()) self._mCharToFreqOrder = None self._mTableSize = None # Size of above table # This is a constant value which varies from language to language, # used in calculating confidence. See # http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html # for further detail. self._mTypicalDistributionRatio = None self.reset() def reset(self): """reset analyser, clear any state""" # If this flag is set to True, detection is done and conclusion has # been made self._mDone = False self._mTotalChars = 0 # Total characters encountered # The number of characters whose frequency order is less than 512 self._mFreqChars = 0 def feed(self, aBuf, aCharLen): """feed a character with known length""" if aCharLen == 2: # we only care about 2-bytes character in our distribution analysis order = self.get_order(aBuf) else: order = -1 if order >= 0: self._mTotalChars += 1 # order is valid if order < self._mTableSize: if 512 > self._mCharToFreqOrder[order]: self._mFreqChars += 1 def get_confidence(self): """return confidence based on existing data""" # if we didn't receive any character in our consideration range, # return negative answer if self._mTotalChars <= 0 or self._mFreqChars <= MINIMUM_DATA_THRESHOLD: return SURE_NO if self._mTotalChars != self._mFreqChars: r = (self._mFreqChars / ((self._mTotalChars - self._mFreqChars) * self._mTypicalDistributionRatio)) if r < SURE_YES: return r # normalize confidence (we don't want to be 100% sure) return SURE_YES def got_enough_data(self): # It is not necessary to receive all data to draw conclusion. # For charset detection, certain amount of data is enough return self._mTotalChars > ENOUGH_DATA_THRESHOLD def get_order(self, aBuf): # We do not handle characters based on the original encoding string, # but convert this encoding string to a number, here called order. # This allows multiple encodings of a language to share one frequency # table. return -1 class EUCTWDistributionAnalysis(CharDistributionAnalysis): def __init__(self): CharDistributionAnalysis.__init__(self) self._mCharToFreqOrder = EUCTWCharToFreqOrder self._mTableSize = EUCTW_TABLE_SIZE self._mTypicalDistributionRatio = EUCTW_TYPICAL_DISTRIBUTION_RATIO def get_order(self, aBuf): # for euc-TW encoding, we are interested # first byte range: 0xc4 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char = wrap_ord(aBuf[0]) if first_char >= 0xC4: return 94 * (first_char - 0xC4) + wrap_ord(aBuf[1]) - 0xA1 else: return -1 class EUCKRDistributionAnalysis(CharDistributionAnalysis): def __init__(self): CharDistributionAnalysis.__init__(self) self._mCharToFreqOrder = EUCKRCharToFreqOrder self._mTableSize = EUCKR_TABLE_SIZE self._mTypicalDistributionRatio = EUCKR_TYPICAL_DISTRIBUTION_RATIO def get_order(self, aBuf): # for euc-KR encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char = wrap_ord(aBuf[0]) if first_char >= 0xB0: return 94 * (first_char - 0xB0) + wrap_ord(aBuf[1]) - 0xA1 else: return -1 class GB2312DistributionAnalysis(CharDistributionAnalysis): def __init__(self): CharDistributionAnalysis.__init__(self) self._mCharToFreqOrder = GB2312CharToFreqOrder self._mTableSize = GB2312_TABLE_SIZE self._mTypicalDistributionRatio = GB2312_TYPICAL_DISTRIBUTION_RATIO def get_order(self, aBuf): # for GB2312 encoding, we are interested # first byte range: 0xb0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) if (first_char >= 0xB0) and (second_char >= 0xA1): return 94 * (first_char - 0xB0) + second_char - 0xA1 else: return -1 class Big5DistributionAnalysis(CharDistributionAnalysis): def __init__(self): CharDistributionAnalysis.__init__(self) self._mCharToFreqOrder = Big5CharToFreqOrder self._mTableSize = BIG5_TABLE_SIZE self._mTypicalDistributionRatio = BIG5_TYPICAL_DISTRIBUTION_RATIO def get_order(self, aBuf): # for big5 encoding, we are interested # first byte range: 0xa4 -- 0xfe # second byte range: 0x40 -- 0x7e , 0xa1 -- 0xfe # no validation needed here. State machine has done that first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) if first_char >= 0xA4: if second_char >= 0xA1: return 157 * (first_char - 0xA4) + second_char - 0xA1 + 63 else: return 157 * (first_char - 0xA4) + second_char - 0x40 else: return -1 class SJISDistributionAnalysis(CharDistributionAnalysis): def __init__(self): CharDistributionAnalysis.__init__(self) self._mCharToFreqOrder = JISCharToFreqOrder self._mTableSize = JIS_TABLE_SIZE self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO def get_order(self, aBuf): # for sjis encoding, we are interested # first byte range: 0x81 -- 0x9f , 0xe0 -- 0xfe # second byte range: 0x40 -- 0x7e, 0x81 -- oxfe # no validation needed here. State machine has done that first_char, second_char = wrap_ord(aBuf[0]), wrap_ord(aBuf[1]) if (first_char >= 0x81) and (first_char <= 0x9F): order = 188 * (first_char - 0x81) elif (first_char >= 0xE0) and (first_char <= 0xEF): order = 188 * (first_char - 0xE0 + 31) else: return -1 order = order + second_char - 0x40 if second_char > 0x7F: order = -1 return order class EUCJPDistributionAnalysis(CharDistributionAnalysis): def __init__(self): CharDistributionAnalysis.__init__(self) self._mCharToFreqOrder = JISCharToFreqOrder self._mTableSize = JIS_TABLE_SIZE self._mTypicalDistributionRatio = JIS_TYPICAL_DISTRIBUTION_RATIO def get_order(self, aBuf): # for euc-JP encoding, we are interested # first byte range: 0xa0 -- 0xfe # second byte range: 0xa1 -- 0xfe # no validation needed here. State machine has done that char = wrap_ord(aBuf[0]) if char >= 0xA0: return 94 * (char - 0xA1) + wrap_ord(aBuf[1]) - 0xa1 else: return -1 PK[b $site-packages/chardet/sjisprober.pyonu[ jRc@sddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z d efd YZ dS( iNi(tMultiByteCharSetProber(tCodingStateMachine(tSJISDistributionAnalysis(tSJISContextAnalysis(t SJISSMModel(t constantst SJISProbercBs5eZdZdZdZdZdZRS(cCsBtj|tt|_t|_t|_|j dS(N( Rt__init__RRt _mCodingSMRt_mDistributionAnalyzerRt_mContextAnalyzertreset(tself((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR&s    cCstj||jjdS(N(RR R (R ((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR -s cCsdS(Nt SHIFT_JIS((R ((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pytget_charset_name1scCst|}x`td|D]O}|jj||}|tjkrtjr{tjj |j dt |dntj |_ Pq|tjkrtj|_ Pq|tjkr|jj}|dkr|d|jd<|jj|jd|||jj|j|qk|jj||d||d|!||jj||d|d!|qqW||d|jd<|jtjkr|jjr|jtjkrtj|_ qn|jS(Nis prober hit error at byte s iii(tlentrangeRt next_stateRteErrort_debugtsyststderrtwriteRtstrteNotMet_mStateteItsMeteFoundItteStarttget_current_charlent _mLastCharR tfeedR t get_statet eDetectingtgot_enough_datatget_confidencetSHORTCUT_THRESHOLD(R taBuftaLentit codingStatetcharLen((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR4s:   "   cCs+|jj}|jj}t||S(N(R R#R tmax(R tcontxtCft distribCf((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR#Xs(t__name__t __module__RR RRR#(((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyR%s     $(RtmbcharsetproberRtcodingstatemachineRtchardistributionRtjpcntxRtmbcssmRtRR(((s6/usr/lib/python2.7/site-packages/chardet/sjisprober.pyts PK[:L L &site-packages/chardet/hebrewprober.pyonu[ ۝Rc@sddlmZddlmZmZddlmZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdefdYZdS(i(t CharSetProber(teNotMet eDetecting(twrap_ordiiiiiiiiiiig{Gz?s ISO-8859-8s windows-1255t HebrewProbercBsPeZdZdZdZdZdZdZdZdZ RS(cCs-tj|d|_d|_|jdS(N(Rt__init__tNonet_mLogicalProbert_mVisualProbertreset(tself((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyRs   cCs(d|_d|_d|_d|_dS(Nit (t_mFinalCharLogicalScoret_mFinalCharVisualScoret_mPrevt _mBeforePrev(R ((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyR s   cCs||_||_dS(N(RR(R t logicalProbert visualProber((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytset_model_proberss cCst|tttttgkS(N(Rt FINAL_KAFt FINAL_MEMt FINAL_NUNtFINAL_PEt FINAL_TSADI(R tc((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytis_finalscCst|ttttgkS(N(Rt NORMAL_KAFt NORMAL_MEMt NORMAL_NUNt NORMAL_PE(R R((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyt is_non_finals cCs|jtkrtS|j|}x|D]}|dkr|jdkr|j|jrq|jd7_q|j|jr|jd7_qqn?|jdkr|j|jr|dkr|jd7_n|j|_||_q,Wt S(NR i( t get_stateRtfilter_high_bit_onlyRRRR RR R(R taBuftcur((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytfeeds     cCs|j|j}|tkr tS|t kr1tS|jj|jj}|tkr]tS|t krntS|dkr~tStS(Ng( R R tMIN_FINAL_CHAR_DISTANCEtLOGICAL_HEBREW_NAMEtVISUAL_HEBREW_NAMERtget_confidenceRtMIN_MODEL_DISTANCE(R tfinalsubtmodelsub((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pytget_charset_names      cCs2|jjtkr.|jjtkr.tStS(N(RRRRR(R ((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyRs( t__name__t __module__RR RRRR#R+R(((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyRs    ; N(t charsetproberRt constantsRRtcompatRRRRRRRRRRt NORMAL_TSADIR$R(R&R%R(((s8/usr/lib/python2.7/site-packages/chardet/hebrewprober.pyts"dPK[-8T$site-packages/chardet/euctwprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCTWDistributionAnalysis from .mbcssm import EUCTWSMModel class EUCTWProber(MultiByteCharSetProber): def __init__(self): MultiByteCharSetProber.__init__(self) self._mCodingSM = CodingStateMachine(EUCTWSMModel) self._mDistributionAnalyzer = EUCTWDistributionAnalysis() self.reset() def get_charset_name(self): return "EUC-TW" PK[j.`.` site-packages/chardet/jpcntx.pycnu[ jRc@s+RddlmZdZdZdZdZdZdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddddd dddd dddddd d dd dd d ddd d d ddddd d dd dd dd dd d d dd d dddd ddd d dd d dddddd dd d dddddd d d d d dddddd dfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd dd ddddd ddd d d d dd d dd ddd dd d dd d ddd d d d d d d d d d d dd d d dd ddd ddddddddd d dd d dddddd ddd dd ddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd dddd dd ddd dd d d d dd d ddd d ddd dd ddddd d ddd dd d dd d ddd dd dd d dd d ddddd d dd d d d d dddd dddd dd d ddddd dfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdddd dd dddd ddd dddddd dd d d d d dd dd d d d d ddd dd dd d d ddd ddd dddddddddddddd dddddd dddddd d dd dddddd fSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd dd dddddddddddddddd d d dd d d d dddd d d dddddddd d ddddd ddd d dd dddddd d ddddd ddddd dddd d dddd ddddfSdddddddddd d ddd dd d dd d dd d ddddd dddd d dd dd ddd dd d ddd dddd ddd d ddd dd dddd d dd dd ddddd d dd dddddd dfSdd dd dddd dddd dd d d dddddd dd dd d ddddd ddd dddd ddd d ddd dd dddd d d dd dddd d dd d d ddddd ddd dddd dddddd fSdd dddd dddd ddd dddd d dd dd dd ddd dd dd dddddd d ddd d d dd ddd ddd ddddd ddd ddd d d d dd d d d ddddd dddd d ddd fSdddd ddddddd dddddddddd d d ddd ddddddddd d ddd d ddd d dd d ddddddddddddddddddd ddddd d d ddd ddd ddd d fSdddddd dd ddddd d d d d d dd dddd dd d ddd dd dddd d d dd d d ddd d d d dd d ddd dd ddd d ddd d d ddddd ddd ddd d ddddd dfSdddd dd ddddddddddddd dd dd ddd ddd dd d d dd d d ddd dd dddd dddd ddddddd ddddd d ddd dddddd dd dd d dd dddd fSdd dd dddddd d dd dd dddd ddd dd d d ddd dd dd ddd dd d ddddd d dddddddd ddddddddddd d d dd ddddddd d d ddddddfSdddddd dd ddd d d dd dddd dd dd dd ddddddddddd ddd ddddd dd dd dddddddddddddddddddd dddd dddd dddddd d fSdddddd dddddddd d dd d d d d d dd ddd ddd d d dddd ddd d d dd dd d dddd d ddd dddddd ddd d d d dd dddd dddd d dd dddd fSdddd dd ddddd dd dddddd dd dd dd ddd d dd dd ddd dddddddddd d ddddddddddddddd ddd d ddddddd d ddddd dddd fSdddd dddddddddd dd d d dddd dd ddd dd d d d dddd ddd ddddd d ddd ddd dddddddd d ddd d d ddddddd d d dd ddd dddd fSdd ddddddddd dddd dd dddddd dddddddddddd ddddddd ddddd ddddddd ddddddddddd ddd dddddddd dddddddfSdddd dd dd ddd ddd d d d ddd ddd d d d ddddd dd dddd d ddd d dd d ddddd d ddd dd ddd d dd ddddddd d d ddd d d ddd ddddfSdddd ddddddd d d dddd dd dd ddddddddddd dddd ddddddd ddd d ddddddd ddddddddd ddd d dd d d dd d dd d ddddd d fSdddddd ddddd d d ddddddd d ddd dd dd d ddd dd dd dd dddddddd d d ddddddddd dd d ddd d d ddd dddddd d d ddd ddd d fSdd dddd dddd dd d dd d d dd dd ddd d dddd dd d ddddddd dd d d dd d dd ddddddddd ddddd d dd d dd ddddd d ddddddddd fSdddddddd ddd d d dd dddd dd d dd dddddddd dddd dd d d ddddd d d dddd ddddddddddddd d d dd ddddddd d ddd d dd d fSdddd dddd ddd dddddddd ddd d ddd ddd ddd ddd ddd d dddddddddddddddddddddddddddddddddd ddddddddddfSdd dd dd dddddd dd d dddd dddd dddddd d ddd ddd ddd d dd d ddd d ddd d dddddddd ddddd d d dddddd dddd ddd ddd d fSdd dd dd dddd d d d dd dddddddddddddddddddd dddd d ddd ddd d dddddddddddddddd ddd dd dddd ddddd ddddd d fSdddd dd dd ddd d dd d d dd d d d dd d dddd dd dd d d ddd ddd dddd dd d ddd ddd ddd d ddd ddd d d d dd dd dd d d d ddddddddfSdddddd dd dd d dddd dd dd dd dddd dd d dd d d d dd ddd d d d dddddd ddd dddd ddd dd dddd dd ddd ddddddd dd ddddd dfSdd dd dd dddd ddd d d ddddd d dd d d dddd ddd dd ddddddd ddd dddd dd d dd d ddddddddd dd d d dd d d ddd d dddd ddddfSddddddddddddd dddddddddddddddddd ddddddd ddddddddddddddddddddddddddddd ddddddddddddddddfSddddddddddddddddd dddd dddd dd dddd ddddd dd dd dddddddddddd ddd ddd dddddddddddddddddddddddddfSdddd dd dddd d ddd dd d d dd d ddd d d d d d dddd dd ddd ddd dddd d dd d d dddd d dd dd d d d d d dd dd dd dd dd ddd dd dddd fSddddddddddddddddddd dddddddddddd ddddd ddddddddddddddddddddd ddddd ddddddddddd dd d dddddddfSdd dd dd dd dd ddd dd d d ddd dd d d dd d ddd dd d dd d dddd dddd dd d d dd ddd d dd ddd d ddd d d d dddd dddd d d d dd dddd fSdd dd dd dddddd d ddd d d dddd d d d d d ddddd d dd d dddddd dd d d d d dd ddd dddddd ddddd dd dddd ddd dd dddd d dd d fSdddd dd ddddd d d d dd d dd ddd d d d d dddd ddd dddd dd ddd d dd d d ddd d dd d dd dddd dddd dd ddddddd ddd d ddddd d fSdddddd dddd d ddd ddd dd dd dd dd dddd dd d dddd ddddd dddd d dddd dddd dd ddd ddd ddd d dd dddd dd d ddddddddfSdddd dddd ddd d dd d d d d d d d dd d dd d dd dd d ddd dd dd dd d dddd dd dd d dd dddd ddddd dd d d dd ddddd d d dd ddddd d fSdd dddddddd dd dd dd d d dd ddd d d d dddd ddddd d dddddd d dd dd d d d d d d d ddddd d ddd d d d d ddd d d d ddddddd dd d fSdddd dd ddddd d d dd d d dd dddd dd ddddddd ddd ddddddd d ddd d d ddddddddd dd ddd dddd dddddd d dd d dddddd d fSdddd dddddddd ddd dddddd ddd dd dddddd dd d d dddd d d d ddd dddddddddddddddd dd ddddddddd d d dddddddd fSdd dddd ddddd d d d dd d dd ddddddd dddd d d dd d dd d d d dd d dd dd d ddd dd d dd d ddd ddd d d d dddd dd d d ddd ddddd d fSdd dd dddddddd dd d d d d d ddddddd d d d ddddd ddd d ddd d d d dd dd d dd d d d dddddd d d ddd ddddd dddddddddddddfSdddddd dddd d dd dd dddddd d dddd d dddd d d dd d ddd d d d d d d d d ddddddddddddddd dddd dd dddddd d dddd ddddfSddddddddddddddddddddddddddddddd dd dd ddddddd ddddddddddddddddddddddddddddddd ddddddddddfSdddd dddddd d d d dd dd d d d d d dddddddddd dd d d ddd d dd d d d d d d ddd ddddddddddddddd dd d dd d ddd dddddddd fSdd dd dddd ddd d d dd dddd d dd d dd dd dd ddd ddd d ddd d dd dd dd d ddddddddddddddddddd dd dddd d d d d dddddd d fSddddddddddd dddd dddddddd dddddddd dd dd dddddddddddddddddddddddddddddddddd ddddd ddddddddd fSdddd dd dd ddd d d dd dd dd dd d d dd ddd dddd d dd d dddddd d ddddd ddd dd dddd ddddd d ddd dd dddd dddd ddd ddd d fSddddddddddd dddd dddd dd dd dddddddd d d dd d dddd dd d ddd ddddddddddd ddddddddd dd dddd dddd dddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd ddddddddd fSdd dd dddd dd d d dd ddddd dd d d dd d ddd dd ddddd ddd dd d dd dd dddd dddd dd dddddd dd dd dd dddd d ddddddddddfSdddd ddddddddd dddddddd dddddddddddddd d dd dd dd d ddd dd dddddddddddddddddd dddddd d d dd d dddddd fSddddddddddddddddddddddddddddddd dddddddddddddddddddddddddddddddddddddddddddddddddddd fSdddd dddd dddd ddd dddd dddd dddddd dddddd ddd dd d ddddd dddd ddddddddd dddddd dddddddd d ddd ddddddfSdddddd dd ddddddddd dd dd dd dd dddd dd dd dd d dddddddddddddddddddddddddddddddddddddd d d d ddddddfSdddd dd ddddd dddd dddddddddddddddd ddddd ddddd ddddddddddddddddddddddddddddddddd ddddddddd fSdddd dd dddd dd d d dd d d dd ddd dd d d dd dd d ddd dd dd dd ddd d dd d dd dddd dd ddd d dd d dd d dd dd dd dd dd d ddd dd dfSdd dd dd dd dd d dd dd dd ddd d d d d d d d dd ddd d dd dd dddd ddd ddddddddddddddd ddd d ddd dd ddddd ddd d dd ddddfSdd dd dddddddd d dd dd dddd dddd dd dddd d d dd d d dd ddd d dd dd d ddddddddddd ddd dddd ddddddd d dd d ddddd d fSdd dddddd dd dd d dd d d dd dd d dd d d ddd dd d d dd d dd dd d dd d dd d ddddddddddddddddddd dd dddddd d d dddddd dfSdd dddd dddddd d dd d d ddd ddd d dd dddddd ddd ddddddd ddd d ddddddd ddd ddd dddd d d ddddd ddddd d d ddddd dfSdddddd dddd d d ddd d ddd d ddd dddddd dddddd ddddd d dd dd d dddddd ddddd ddddd ddd d dd ddddd d dd d ddddddfSdddddddddd ddd dddd dd d d ddd ddd dddd d ddd dddd dd dd dd d ddddddd d ddddd ddddd dd ddddddddddddd ddd d fSddddddddddddddddddddddddddddddddddd ddddddddddddddddddddddddddddddddddddddddddddddddfSdddd ddddddd d d dddddddddddd dddddd dddd d ddddddddddddddddd dddddddddddd dddddddd d dd ddddd ddfSdddd dd ddddddddd dddd ddddddddddddddddddddd dddddddddddddddddddd ddddddddddddddddd dddddd fSdddd dd dddddd d dd dd dd d d dddddd dddddddd d dddddd ddd d d dddddddddddd dddd ddd ddddddd d ddddd dddd fSdddd ddddddd dd d dd d d dd ddd d dd ddddd dd ddddd d ddd d ddd d d dd d ddd dd d dd d ddd ddddd dddd d ddd dddd ddd fSdddddd dd dd dddd d ddd dd dd d d dd ddddddd dd dddd d d dd ddd dd dd ddd ddd ddd d d d d d d d dddd d dd d d dddd dddd fSdddd dddd dd d d d ddd ddd ddddddd d d dd d d dd d dddd d d d d dd d d ddd ddd d ddd dddddd dd d dddd dd dd dd dddddddfSdd ddddddddd d d d d d d dddd dddd dddd dd dd d d d dd d dd d d dd d d d dd dddddd dddddd dd dddd dd ddd dd dd ddddd dfSdd dddd dd dd ddd dd dd d d d d ddd d dddd d d d d dd d d dddd ddddddddd dddddddddd dd d dd ddd dddd dd dddddddddfSdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfSdd dd dddd ddd dd d d dddddd dddddd dd ddd dddd d d dd dd d dd ddd ddd dddddddddddddd ddddddd dddd ddddddd fSdddddddddddddddddddddddddddddddddddddd dddd dddddddddddddddddddd dddddddddddddddddddddfSddddddddddddddddddddddddddddddd ddddddddddddddddddd ddddddddddddd ddddddddddddddddddddfSdddddddd dddd dddd dddddd d d d d d ddddd dd ddddd dddd d d dddd ddd dd ddddd d d ddd d d dddd ddd d d dddd ddd d fSdddd dd dd dd d d d d d d dd dd d d dddd d d d dd d d d dd ddd d d d dd dd d d ddd d d d dd d ddd ddd d d dddddddd dddddd ddddfSfSZd fd YZd efdYZ defdYZ dS(i(twrap_ordiiidiiiiiitJapaneseContextAnalysiscBs>eZdZdZdZdZdZdZRS(cCs|jdS(N(treset(tself((s2/usr/lib/python2.7/site-packages/chardet/jpcntx.pyt__init__|scCs8d|_dgt|_d|_d|_t|_dS(Nii(t _mTotalReltNUM_OF_CATEGORYt _mRelSamplet_mNeedToSkipCharNumt_mLastCharOrdertFalset_mDone(R((s2/usr/lib/python2.7/site-packages/chardet/jpcntx.pyRs    cCs|jr dS|j}x||kr|j|||d!\}}||7}||krt|||_d|_q|dkr|jdkr|jd7_|jtkrt|_Pn|jt|j|cd7s8PK[:r__(site-packages/chardet/langgreekmodel.pyonu[ ۝Rc@shdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6ZdS(iiiiiRidihi^ibieitifioiiui\iXiqiUiOiviiiSiCiriwi_icimiiHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipiiZiJiii=i$i.iGiIi6ili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0ii%i!i-i8i2iTi9iyiiiii|iiiiii i iii ii iiii iiiii iii*ii@iKiiiitcharToOrderMaptprecedenceMatrixgs?tmTypicalPositiveRatiotkeepEnglishLetters ISO-8859-7t charsetNames windows-1253N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiRidihi^ibieitifioiiui\iXiqiUiOiviiiSiCiriwi_icimiiiiiiiiHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiZiiiiiiiiiiiJiiiiiiiii=i$i.iGiIii6iili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0ii%i!i-i8i2iTi9ixiyiiiii|iiiiii i iii ii iiii iiiii iii*ii@iKiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiRidihi^ibieitifioiiui\iXiqiUiOiviiiSiCiriwi_icimiiiiiiiiHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii=iiiiiiiiiiiJiiiiiiiiii$i.iGiIii6iili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0ii%i!i-i8i2iTi9ixiyiiiii|iiiiii i iii ii iiii iiiii iii*ii@iKiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tLatin7_CharToOrderMaptwin1253_CharToOrderMaptGreekLangModeltFalsetLatin7GreekModeltWin1253GreekModel(((s:/usr/lib/python2.7/site-packages/chardet/langgreekmodel.pyt#sV  PK[*Z0%a%a,site-packages/chardet/langhungarianmodel.pyonu[ ۝Rc@shdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6ZdS(iiiiii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iGi+i!i%i9i0i@iDi7i4iiiiiii ii iiii iiiiCi iiiiiAi>ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiOiiiiiiiiiiiiiiiii3iQiiNiiiii,iiii=iiiiii:iiBi;iiii<iEi?iiiiRiiJiiFiPiiHiiiSiMiTiiLiUiiiiiIi*iiiiii8iiiViWitcharToOrderMaptprecedenceMatrixg(P?tmTypicalPositiveRatiotkeepEnglishLetters ISO-8859-2t charsetNames windows-1250N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iGi+i!i%i9i0i@iDi7i4iiiiiiiiiiiii ii iiii iiiiCi iiiiiAi>ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiOiiiiiiiiiiiiiiiii3iQiiNiiiii,iiii=iiiiii:iiBi;iiii<iEi?iiiiRiiJiiFiPiiHiiiSiMiTiiLiUiiiiiIi*iiiiii8iiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iHi+i!i%i9i0i@iDi7i4iiiiiiiiiiiii ii iiii iiiiCi iiiiiAi>ii iiiiiiiiiiiiiiiiiiiiiiiiiiNiiEiiiiiiiiiiiiiiiiiLiiiiiiiiiQiiiiiiiiiiiiiiiii3iSiiPiiiii,iiii=iiiiii:iiBi;iiii<iFi?iiiiTiiKiiGiRiiIiiiUiOiViiMiWiiiiiJi*iiiiii8iiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tLatin2_HungarianCharToOrderMaptwin1250HungarianCharToOrderMaptHungarianLangModeltTruetLatin2HungarianModeltWin1250HungarianModel(((s>/usr/lib/python2.7/site-packages/chardet/langhungarianmodel.pyt#sV  PK[PTT&site-packages/chardet/gb2312prober.pyonu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tGB2312DistributionAnalysis(t GB2312SMModelt GB2312ProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pyR"s  cCsdS(NtGB2312((R ((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pytget_charset_name(s(t__name__t __module__RR (((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pyR!s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pytsPK[&'MM%site-packages/chardet/euckrprober.pycnu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tEUCKRDistributionAnalysis(t EUCKRSMModelt EUCKRProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pyR#s  cCsdS(NsEUC-KR((R ((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pytget_charset_name)s(t__name__t __module__RR (((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pyR"s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pytsPK[^lu,site-packages/chardet/codingstatemachine.pyonu[ ۝Rc@s7ddlmZddlmZdddYZdS(i(teStart(twrap_ordtCodingStateMachinecBs5eZdZdZdZdZdZRS(cCs)||_d|_d|_|jdS(Ni(t_mModelt_mCurrentBytePost_mCurrentCharLentreset(tselftsm((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyt__init__!s   cCs t|_dS(N(Rt_mCurrentState(R((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyR'scCs|jdt|}|jtkrFd|_|jd||_n|j|jd|}|jd||_|jd7_|jS(Nt classTableit charLenTablet classFactort stateTablei(RRR RRR(RtctbyteClst curr_state((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyt next_state*s cCs|jS(N(R(R((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pytget_current_charlen9scCs |jdS(Ntname(R(R((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pytget_coding_state_machine<s(t__name__t __module__R RRRR(((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pyR s     N((t constantsRtcompatRR(((s>/usr/lib/python2.7/site-packages/chardet/codingstatemachine.pytsPK[PTT&site-packages/chardet/gb2312prober.pycnu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tGB2312DistributionAnalysis(t GB2312SMModelt GB2312ProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pyR"s  cCsdS(NtGB2312((R ((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pytget_charset_name(s(t__name__t __module__RR (((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pyR!s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s8/usr/lib/python2.7/site-packages/chardet/gb2312prober.pytsPK[[ +site-packages/chardet/universaldetector.pyonu[ jRc@sddlmZddlZddlZddlmZddlmZddlm Z ddl m Z ddl Z dZ d ZdZd Zd d d YZdS(i(t constantsiN(t Latin1Prober(tMBCSGroupProber(tSBCSGroupProber(tEscCharSetProberg?iitUniversalDetectorcBs,eZdZdZdZdZRS(cCsDtjd|_tjd|_d|_g|_|jdS(Ns[-]s(|~{)(tretcompilet_highBitDetectort _escDetectortNonet_mEscCharSetProbert_mCharSetProberstreset(tself((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyt__init__-s   cCsidd6dd6|_t|_t|_t|_t|_d|_ |j r]|j j nx|j D]}|j qgWdS(Ntencodinggt confidencet( R tresulttFalsetdonetTruet_mStartt _mGotDatat ePureAsciit _mInputStatet _mLastCharR R R (Rtprober((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyR 4s      cCs|jr dSt|}|s#dS|jsd|d tjkrYidd6dd6|_qd|d tjkridd6dd6|_qd|d tjkridd6dd6|_qd|d d krid d6dd6|_qd|d d krid d6dd6|_qd|d tjkr4idd6dd6|_qd|d tj krdidd6dd6|_qdnt |_|jdr|jddkrt |_dS|j t kr|j j|rt|_ q|j t kr|jj|j|rt|_ qn|d|_|j tkr|js2t|_n|jj|tjkri|jjd6|jjd6|_t |_qn|j tkr|jstttg|_nx\|jD]N}|j|tjkri|jd6|jd6|_t |_PqqWndS(NisUTF-8Rg?RisUTF-32LEsUTF-32BEssX-ISO-10646-UCS-4-3412tsX-ISO-10646-UCS-4-2143isUTF-16LEsUTF-16BEgi(RtlenRtcodecstBOMRt BOM_UTF32_LEt BOM_UTF32_BEtBOM_LEtBOM_BERRRRtsearcht eHighbyteR Rt eEscAsciiR RtfeedRteFoundIttget_charset_nametget_confidenceR RRR(RtaBuftaLenR((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyR(@sh            cCs|jr dS|js6tjr2tjjdndSt|_|jt krlidd6dd6|_ |j S|jt krd}d}d}xD|j D]9}|sqn|j}||kr|}|}qqW|r|tkri|jd6|jd6|_ |j Sntjr|tjjdxM|j djD]8}|sOq=ntjjd |j|jfq=WndS( Nsno data received! tasciiRg?Rgs"no probers hit minimum threshhold is%s confidence = %s (RRRt_debugtsyststderrtwriteRRRRR&R R R+tMINIMUM_THRESHOLDR*tmProbers(RtproberConfidencetmaxProberConfidencet maxProberR((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pytclosesB           (t__name__t __module__RR R(R8(((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyR,s  F((RRR0Rt latin1proberRtmbcsgroupproberRtsbcsgroupproberRt escproberRRR3RR'R&R(((s=/usr/lib/python2.7/site-packages/chardet/universaldetector.pyts   PK[ݘ$site-packages/chardet/chardetect.pyonu[ L]c@skdZddlmZddlmZmZddlmZddZdZ e dkrge nd S( s Script which takes one or more file paths and reports on their detected encodings Example:: % chardetect somefile someotherfile somefile: windows-1252 with confidence 0.5 someotherfile: ascii with confidence 1.0 If no paths are provided, it takes its input from stdin. i(topen(targvtstdin(tUniversalDetectorRcCsit}x|D]}|j|qW|j|j}|dr]d||d|dfSd|SdS(s;Return a string describing the probable encoding of a file.tencodings%s: %s with confidence %st confidences %s: no resultN(Rtfeedtclosetresult(tfiletnametutlineR((s6/usr/lib/python2.7/site-packages/chardet/chardetect.pytdescription_ofs      cCs_ttdkr ttGHn;x8tdD],}t|d}t||GHWdQXq+WdS(Nitrb(tlenRR RR(tpathtf((s6/usr/lib/python2.7/site-packages/chardet/chardetect.pytmain#s t__main__N( t__doc__tioRtsysRRtchardet.universaldetectorRR Rt__name__(((s6/usr/lib/python2.7/site-packages/chardet/chardetect.pyt s  PK[͠ 'DD site-packages/chardet/mbcssm.pycnu[ jRc@sX ddlmZmZmZd"ZeeedeeeeeeeeeeeeeeeeeeeefZd#Zied6dd6ed 6ed 6d d 6Zd$Zeedeeedded eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefFZ d%Z ied6dd6e d 6e d 6dd 6Z d&Z ddddeeeeeeeeeeeeeeeeeeeeeeeeeededeeeeeeef(Z d'Zie d6d d6e d 6ed 6dd 6Zd(ZeedeeeeeeeeeeeeefZd)Zied6dd6ed 6ed 6dd 6Zd*Zeeeddddeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeeeeeeeeeef0Zd+Zied6dd6ed 6ed 6dd 6Zd,Zeeeeeedeeeeeeeeeeeeeeeeedeeeeeeeeedeeeeeeeeeeeeef0Zd-Zied6dd6ed 6ed 6dd 6Zd.ZeeedeeeeeeeeeeeeeeeeeeeefZd/Zied6d d6ed 6ed 6dd 6Zd0Z dddeddeeeeeeeeeeeed d d d eed d d d d ed d d d d d dddeddd d ed d d d d d d eeeef8Z!d1Z"ie d6d d6e!d 6e"d 6dd 6Z#d2Z$d d dd ddeeeeeeeeeeeedddeeedddeded d dd dddddedddeeedddddedeeef8Z%d3Z&ie$d6d d6e%d 6e&d 6dd 6Z'd4Z(eeeeeeddddddd dddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddddeeeeeeeeeeeeedddeeeeeeeeeeeeddddeeeeeeeeeeeeeeddeeeeeeeeeeeeddddeeeeeeeeeeeeeeedeeeeeeeeeeeeddddeeeeeeeeeeeeeeedeeeeeeeeeeeedddeeeeeeeeeeeeeeeeeeeeeeeeeeefZ)d5Z*ie(d6dd6e)d 6e*d 6d d 6Z+d!S(6i(teStartteErrorteItsMeiiiit classTableit classFactort stateTablet charLenTabletBig5tnameiiii i tCP949sEUC-JPsEUC-KRsx-euc-twtGB2312t Shift_JISsUTF-16BEsUTF-16LEi i i iiisUTF-8N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii( iiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iii i i i i i i i i i i i iiii(iiiiiiiiiiiiiiii(,t constantsRRRtBIG5_clstBIG5_sttBig5CharLenTablet Big5SMModelt CP949_clstCP949_sttCP949CharLenTablet CP949SMModelt EUCJP_clstEUCJP_sttEUCJPCharLenTablet EUCJPSMModelt EUCKR_clstEUCKR_sttEUCKRCharLenTablet EUCKRSMModelt EUCTW_clstEUCTW_sttEUCTWCharLenTablet EUCTWSMModelt GB2312_clst GB2312_sttGB2312CharLenTablet GB2312SMModeltSJIS_clstSJIS_sttSJISCharLenTablet SJISSMModelt UCS2BE_clst UCS2BE_sttUCS2BECharLenTablet UCS2BESMModelt UCS2LE_clst UCS2LE_sttUCS2LECharLenTablet UCS2LESMModeltUTF8_clstUTF8_sttUTF8CharLenTablet UTF8SMModel(((s2/usr/lib/python2.7/site-packages/chardet/mbcssm.pytsh  $                 PK[y %site-packages/chardet/eucjpprober.pycnu[ ۝Rc@sddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z d efd YZ dS( iNi(t constants(tMultiByteCharSetProber(tCodingStateMachine(tEUCJPDistributionAnalysis(tEUCJPContextAnalysis(t EUCJPSMModelt EUCJPProbercBs5eZdZdZdZdZdZRS(cCsBtj|tt|_t|_t|_|j dS(N( Rt__init__RRt _mCodingSMRt_mDistributionAnalyzerRt_mContextAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR&s    cCstj||jjdS(N(RR R (R ((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR -s cCsdS(NsEUC-JP((R ((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pytget_charset_name1scCst|}xPtd|D]?}|jj||}|tjkrtjr{tjj |j dt |dntj |_ Pq|tjkrtj|_ Pq|tjkr|jj}|dkr|d|jd<|jj|j||jj|j|q[|jj||d|d!||jj||d|d!|qqW||d|jd<|jtjkr|jjr|jtjkrtj|_ qn|jS(Nis prober hit error at byte s i(tlentrangeRt next_stateRteErrort_debugtsyststderrtwriteR tstrteNotMet_mStateteItsMeteFoundItteStarttget_current_charlent _mLastCharR tfeedR t get_statet eDetectingtgot_enough_datatget_confidencetSHORTCUT_THRESHOLD(R taBuftaLentit codingStatetcharLen((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR4s6   "   "cCs+|jj}|jj}t||S(N(R R"R tmax(R tcontxtCft distribCf((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR"Ws(t__name__t __module__RR R RR"(((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyR%s     #(RtRtmbcharsetproberRtcodingstatemachineRtchardistributionRtjpcntxRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/eucjpprober.pyts PK[ MM%site-packages/chardet/euctwprober.pyonu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tEUCTWDistributionAnalysis(t EUCTWSMModelt EUCTWProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pyR"s  cCsdS(NsEUC-TW((R ((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pytget_charset_name(s(t__name__t __module__RR (((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pyR!s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pytsPK[jzA A #site-packages/chardet/escprober.pyonu[ ۝Rc@s|ddlmZddlmZmZmZmZddlmZddl m Z ddl m Z defdYZ dS( i(t constants(t HZSMModeltISO2022CNSMModeltISO2022JPSMModeltISO2022KRSMModel(t CharSetProber(tCodingStateMachine(twrap_ordtEscCharSetProbercBs5eZdZdZdZdZdZRS(cCsHtj|ttttttttg|_|jdS(N( Rt__init__RRRRRt _mCodingSMtreset(tself((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyR %s     cCs_tj|x0|jD]%}|s)qnt|_|jqWt|j|_d|_dS(N( RR R tTruetactivetlent _mActiveSMtNonet_mDetectedCharset(R tcodingSM((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyR /s  cCs|jS(N(R(R ((s5/usr/lib/python2.7/site-packages/chardet/escprober.pytget_charset_name9scCs|jr dSdSdS(NgGz?g(R(R ((s5/usr/lib/python2.7/site-packages/chardet/escprober.pytget_confidence<s cCsx|D]}x|jD]}|s)qn|js8qn|jt|}|tjkrt|_|jd8_|jdkrtj|_ |j Sq|tj krtj |_ |j |_|j SqWqW|j S(Nii(R Rt next_stateRRteErrortFalseRteNotMet_mStatet get_stateteItsMeteFoundIttget_coding_state_machineR(R taBuftcRt codingState((s5/usr/lib/python2.7/site-packages/chardet/escprober.pytfeedBs$      (t__name__t __module__R R RRR"(((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyR$s   N(tRtescsmRRRRt charsetproberRtcodingstatemachineRtcompatRR(((s5/usr/lib/python2.7/site-packages/chardet/escprober.pyts "PK[ښV)site-packages/chardet/sbcsgroupprober.pyonu[ ۝Rc@sddlmZddlmZddlmZmZmZmZm Z m Z ddl m Z m Z ddlmZmZddlmZmZddlmZddlmZdd lmZd efd YZd S( i(tCharSetGroupProber(tSingleByteCharSetProber(tWin1251CyrillicModelt Koi8rModeltLatin5CyrillicModeltMacCyrillicModelt Ibm866Modelt Ibm855Model(tLatin7GreekModeltWin1253GreekModel(tLatin5BulgarianModeltWin1251BulgarianModel(tLatin2HungarianModeltWin1250HungarianModel(tTIS620ThaiModel(tWin1255HebrewModel(t HebrewProbertSBCSGroupProbercBseZdZRS(cCstj|tttttttttttttt tt tt tt tt ttttg |_t}ttt|}ttt|}|j|||jj|||g|jdS(N(Rt__init__RRRRRRRRR R R R R Rt _mProbersRRtFalsetTruetset_model_proberstextendtreset(tselft hebrewProbertlogicalHebrewProbertvisualHebrewProber((s;/usr/lib/python2.7/site-packages/chardet/sbcsgroupprober.pyR+s.                  (t__name__t __module__R(((s;/usr/lib/python2.7/site-packages/chardet/sbcsgroupprober.pyR*sN(tcharsetgroupproberRtsbcharsetproberRtlangcyrillicmodelRRRRRRtlanggreekmodelRR tlangbulgarianmodelR R tlanghungarianmodelR R t langthaimodelRtlanghebrewmodelRt hebrewproberRR(((s;/usr/lib/python2.7/site-packages/chardet/sbcsgroupprober.pyts.PK[U77"site-packages/chardet/constants.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### _debug = 0 eDetecting = 0 eFoundIt = 1 eNotMe = 2 eStart = 0 eError = 1 eItsMe = 2 SHORTCUT_THRESHOLD = 0.95 PK[(site-packages/chardet/sbcharsetprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### import sys from . import constants from .charsetprober import CharSetProber from .compat import wrap_ord SAMPLE_SIZE = 64 SB_ENOUGH_REL_THRESHOLD = 1024 POSITIVE_SHORTCUT_THRESHOLD = 0.95 NEGATIVE_SHORTCUT_THRESHOLD = 0.05 SYMBOL_CAT_ORDER = 250 NUMBER_OF_SEQ_CAT = 4 POSITIVE_CAT = NUMBER_OF_SEQ_CAT - 1 #NEGATIVE_CAT = 0 class SingleByteCharSetProber(CharSetProber): def __init__(self, model, reversed=False, nameProber=None): CharSetProber.__init__(self) self._mModel = model # TRUE if we need to reverse every pair in the model lookup self._mReversed = reversed # Optional auxiliary prober for name decision self._mNameProber = nameProber self.reset() def reset(self): CharSetProber.reset(self) # char order of last character self._mLastOrder = 255 self._mSeqCounters = [0] * NUMBER_OF_SEQ_CAT self._mTotalSeqs = 0 self._mTotalChar = 0 # characters that fall in our sampling range self._mFreqChar = 0 def get_charset_name(self): if self._mNameProber: return self._mNameProber.get_charset_name() else: return self._mModel['charsetName'] def feed(self, aBuf): if not self._mModel['keepEnglishLetter']: aBuf = self.filter_without_english_letters(aBuf) aLen = len(aBuf) if not aLen: return self.get_state() for c in aBuf: order = self._mModel['charToOrderMap'][wrap_ord(c)] if order < SYMBOL_CAT_ORDER: self._mTotalChar += 1 if order < SAMPLE_SIZE: self._mFreqChar += 1 if self._mLastOrder < SAMPLE_SIZE: self._mTotalSeqs += 1 if not self._mReversed: i = (self._mLastOrder * SAMPLE_SIZE) + order model = self._mModel['precedenceMatrix'][i] else: # reverse the order of the letters in the lookup i = (order * SAMPLE_SIZE) + self._mLastOrder model = self._mModel['precedenceMatrix'][i] self._mSeqCounters[model] += 1 self._mLastOrder = order if self.get_state() == constants.eDetecting: if self._mTotalSeqs > SB_ENOUGH_REL_THRESHOLD: cf = self.get_confidence() if cf > POSITIVE_SHORTCUT_THRESHOLD: if constants._debug: sys.stderr.write('%s confidence = %s, we have a' 'winner\n' % (self._mModel['charsetName'], cf)) self._mState = constants.eFoundIt elif cf < NEGATIVE_SHORTCUT_THRESHOLD: if constants._debug: sys.stderr.write('%s confidence = %s, below negative' 'shortcut threshhold %s\n' % (self._mModel['charsetName'], cf, NEGATIVE_SHORTCUT_THRESHOLD)) self._mState = constants.eNotMe return self.get_state() def get_confidence(self): r = 0.01 if self._mTotalSeqs > 0: r = ((1.0 * self._mSeqCounters[POSITIVE_CAT]) / self._mTotalSeqs / self._mModel['mTypicalPositiveRatio']) r = r * self._mFreqChar / self._mTotalChar if r >= 1.0: r = 0.99 return r PK[Utt"site-packages/chardet/big5freq.pycnu[ ۝Rc6@sգdZdZdddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd 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# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 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) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 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) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 dd 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$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 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) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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 dddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd 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# d$ d% d& d' d( d) d* d+ d, d- d. d/ d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d: d; d< d= d> d? d@ dA dB dC dD dE dF dG dH dI dJ dK dL dM dN dO dP dQ dR dS dT dU dV dW dX dY dZ d[ d\ d] d^ d_ d` da db dc dd de df dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz 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 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 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 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!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)!d*!d+!d,!d-!d.!d/!d0!d1!d2!d3!d4!d5!d6!d7!d8!d9!d:!d;!d!d?!d@!dA!dB!dC!dD!dE!dF!dG!dH!dI!dJ!dK!dL!dM!dN!dO!dP!dQ!dR!dS!dT!dU!dV!dW!dX!dY!dZ!d[!d\!d]!d^!d_!d`!da!db!dc!dd!de!df!dg!dh!di!dj!dk!dl!dm!dn!do!dp!dq!dr!ds!dt!du!dv!dw!dx!dy!dz!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!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!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!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"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)"d*"d+"d,"d-"d."d/"d0"d1"d2"d3"d4"d5"d6"d7"d8"d9"d:"d;"d<"d="d>"d?"d@"dA"dB"dC"dD"dE"dF"dG"dH"dI"dJ"dK"dL"dM"dN"dO"dP"dQ"dR"dS"dT"dU"dV"dW"dX"dY"dZ"d["d\"d]"d^"d_"d`"da"db"dc"dd"de"df"dg"dh"di"dj"dk"dl"dm"dn"do"dp"dq"dr"ds"dt"du"dv"dw"dx"dy"dz"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"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"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"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#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)#d*#d+#d,#d-#d.#d/#d0#d1#d2#d3#d4#d5#d6#d7#d8#d9#d:#d;#d<#d=#d>#d?#d@#dA#dB#dC#dD#dE#dF#dG#dH#dI#dJ#dK#dL#dM#dN#dO#dP#dQ#dR#dS#dT#dU#dV#dW#dX#dY#dZ#d[#d\#d]#d^#d_#d`#da#db#dc#dd#de#df#dg#dh#di#dj#dk#dl#dm#dn#do#dp#dq#dr#ds#dt#du#dv#dw#dx#dy#dz#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#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#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#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$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)$d*$d+$d,$d-$d.$d/$d0$d1$d2$d3$d4$d5$d6$d7$d8$d9$d:$d;$d<$d=$d>$d?$d@$dA$dB$dC$dD$dE$dF$dG$dH$dI$dJ$dK$dL$dM$dN$dO$dP$dQ$dR$dS$dT$dU$dV$dW$dX$dY$dZ$d[$d\$d]$d^$d_$d`$da$db$dc$dd$de$df$dg$dh$di$dj$dk$dl$dm$dn$do$dp$dq$dr$ds$dt$du$dv$dw$dx$dy$dz$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$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$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$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%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)%d*%d+%d,%d-%d.%d/%d0%d1%d2%d3%d4%d5%d6%d7%d8%d9%d:%d;%d<%d=%d>%d?%d@%dA%dB%dC%dD%dE%dF%dG%dH%dI%dJ%dK%dL%dM%dN%dO%dP%dQ%dR%dS%dT%dU%dV%dW%dX%dY%dZ%d[%d\%d]%d^%d_%d`%da%db%dc%dd%de%df%dg%dh%di%dj%dk%dl%dm%dn%do%dp%dq%dr%ds%dt%du%dv%dw%dx%dy%dz%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%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%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%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&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)&d*&d+&d,&d-&d.&d/&d0&d1&d2&d3&d4&d5&d6&d7&d8&d9&d:&d;&d<&d=&d>&d?&d@&dA&dB&dC&dD&dE&dF&dG&dH&dI&dJ&dK&dL&dM&dN&dO&dP&dQ&dR&dS&dT&dU&dV&dW&dX&dY&dZ&d[&d\&d]&d^&d_&d`&da&db&dc&dd&de&df&dg&dh&di&dj&dk&dl&dm&dn&do&dp&dq&dr&ds&dt&du&dv&dw&dx&dy&dz&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&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&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&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'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)'d*'d+'d,'d-'d.'d/'d0'd1'd2'd3'd4'd5'd6'd7'd8'd9'd:'d;'d<'d='d>'d?'d@'dA'dB'dC'dD'dE'dF'dG'dH'dI'dJ'dK'dL'dM'dN'dO'dP'dQ'dR'dS'dT'dU'dV'dW'dX'dY'dZ'd['d\'d]'d^'d_'d`'da'db'dc'dd'de'df'dg'dh'di'dj'dk'dl'dm'dn'do'dp'dq'dr'ds'dt'du'dv'dw'dx'dy'dz'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'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'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'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(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)(d*(d+(d,(d-(d.(d/(d0(d1(d2(d3(d4(d5(d6(d7(d8(d9(d:(d;(d<(d=(d>(d?(d@(dA(dB(dC(dD(dE(dF(dG(dH(dI(dJ(dK(dL(dM(dN(dO(dP(dQ(dR(dS(dT(dU(dV(dW(dX(dY(dZ(d[(d\(d](d^(d_(d`(da(db(dc(dd(de(df(dg(dh(di(dj(dk(dl(dm(dn(do(dp(dq(dr(ds(dt(du(dv(dw(dx(dy(dz(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(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(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(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)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))d*)d+)d,)d-)d.)d/)d0)d1)d2)d3)d4)d5)d6)d7)d8)d9)d:)d;)d<)d=)d>)d?)d@)dA)dB)dC)dD)dE)dF)dG)dH)dI)dJ)dK)dL)dM)dN)dO)dP)dQ)dR)dS)dT)dU)dV)dW)dX)dY)dZ)d[)d\)d])d^)d_)d`)da)db)dc)dd)de)df)dg)dh)di)dj)dk)dl)dm)dn)do)dp)dq)dr)ds)dt)du)dv)dw)dx)dy)dz)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)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)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)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*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)*d**d+*d,*d-*d.*d/*d0*d1*d2*d3*d4*d5*d6*d7*d8*d9*d:*d;*d<*d=*d>*d?*d@*dA*dB*dC*dD*dE*dF*dG*dH*dI*dJ*dK*dL*dM*dN*dO*dP*dQ*dR*dS*dT*dU*dV*dW*dX*dY*dZ*d[*d\*d]*d^*d_*d`*da*db*dc*dd*de*df*dg*dh*di*dj*dk*dl*dm*dn*do*dp*dq*dr*ds*dt*du*dv*dw*dx*dy*dz*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*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*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*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+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)+d*+d++d,+d-+d.+d/+d0+d1+d2+d3+d4+d5+d6+d7+d8+d9+d:+d;+d<+d=+d>+d?+d@+dA+dB+dC+dD+dE+dF+dG+dH+dI+dJ+dK+dL+dM+dN+dO+dP+dQ+dR+dS+dT+dU+dV+dW+dX+dY+dZ+d[+d\+d]+d^+d_+d`+da+db+dc+dd+de+df+dg+dh+di+dj+dk+dl+dm+dn+do+dp+dq+dr+ds+dt+du+dv+dw+dx+dy+dz+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+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+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+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,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),d*,d+,d,,d-,d.,d/,d0,d1,d2,d3,d4,d5,d6,d7,d8,d9,d:,d;,d<,d=,d>,d?,d@,dA,dB,dC,dD,dE,dF,dG,dH,dI,dJ,dK,dL,dM,dN,dO,dP,dQ,dR,dS,dT,dU,dV,dW,dX,dY,dZ,d[,d\,d],d^,d_,d`,da,db,dc,dd,de,df,dg,dh,di,dj,dk,dl,dm,dn,do,dp,dq,dr,ds,dt,du,dv,dw,dx,dy,dz,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,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,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,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-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)-d*-d+-d,-d--d.-d/-d0-d1-d2-d3-d4-d5-d6-d7-d8-d9-d:-d;-d<-d=-d>-d?-d@-dA-dB-dC-dD-dE-dF-dG-dH-dI-dJ-dK-dL-dM-dN-dO-dP-dQ-dR-dS-dT-dU-dV-dW-dX-dY-dZ-d[-d\-d]-d^-d_-d`-da-db-dc-dd-de-df-dg-dh-di-dj-dk-dl-dm-dn-do-dp-dq-dr-ds-dt-du-dv-dw-dx-dy-dz-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-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-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-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.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).d*.d+.d,.d-.d..d/.d0.d1.d2.d3.d4.d5.d6.d7.d8.d9.d:.d;.d<.d=.d>.d?.d@.dA.dB.dC.dD.dE.dF.dG.dH.dI.dJ.dK.dL.dM.dN.dO.dP.dQ.dR.dS.dT.dU.dV.dW.dX.dY.dZ.d[.d\.d].d^.d_.d`.da.db.dc.dd.de.df.dg.dh.di.dj.dk.dl.dm.dn.do.dp.dq.dr.ds.dt.du.dv.dw.dx.dy.dz.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.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.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.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/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)/d*/d+/d,/d-/d./d//d0/d1/d2/d3/d4/d5/d6/d7/d8/d9/d:/d;/d/d?/d@/dA/dB/dC/dD/dE/dF/dG/dH/dI/dJ/dK/dL/dM/dN/dO/dP/dQ/dR/dS/dT/dU/dV/dW/dX/dY/dZ/d[/d\/d]/d^/d_/d`/da/db/dc/dd/de/df/dg/dh/di/dj/dk/dl/dm/dn/do/dp/dq/dr/ds/dt/du/dv/dw/dx/dy/dz/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/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/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/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/d0d0d0d0d0d0d0d0d0d 0d 0d 0d 0d 0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d 0d!0d"0d#0d$0d%0d&0d'0d(0d)0d*0d+0d,0d-0d.0d/0d00d10d20d30d40d50d60d70d80d90d:0d;0d<0d=0d>0d?0d@0dA0dB0dC0dD0dE0dF0dG0dH0dI0dJ0dK0dL0dM0dN0dO0dP0dQ0dR0dS0dT0dU0dV0dW0dX0dY0dZ0d[0d\0d]0d^0d_0d`0da0db0dc0dd0de0df0dg0dh0di0dj0dk0dl0dm0dn0do0dp0dq0dr0ds0dt0du0dv0dw0dx0dy0dz0d{0d|0d}0d~0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d1d1d1d1d1d1d1d1d1d 1d 1d 1d 1d 1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d 1d!1d"1d#1d$1d%1d&1d'1d(1d)1d*1d+1d,1d-1d.1d/1d01d11d21d31d41d51d61d71d81d91d:1d;1d<1d=1d>1d?1d@1dA1dB1dC1dD1dE1dF1dG1dH1dI1dJ1dK1dL1dM1dN1dO1dP1dQ1dR1dS1dT1dU1dV1dW1dX1dY1dZ1d[1d\1d]1d^1d_1d`1da1db1dc1dd1de1df1dg1dh1di1dj1dk1dl1dm1dn1do1dp1dq1dr1ds1dt1du1dv1dw1dx1dy1dz1d{1d|1d}1d~1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d2d2d2d2d2d2d2d2d2d 2d 2d 2d 2d 2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d 2d!2d"2d#2d$2d%2d&2d'2d(2d)2d*2d+2d,2d-2d.2d/2d02d12d22d32d42d52d62d72d82d92d:2d;2d<2d=2d>2d?2d@2dA2dB2dC2dD2dE2dF2dG2dH2dI2dJ2dK2dL2dM2dN2dO2dP2dQ2dR2dS2dT2dU2dV2dW2dX2dY2dZ2d[2d\2d]2d^2d_2d`2da2db2dc2dd2de2df2dg2dh2di2dj2dk2dl2dm2dn2do2dp2dq2dr2ds2dt2du2dv2dw2dx2dy2dz2d{2d|2d}2d~2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d3d3d3d3d3d3d3d3d3d 3d 3d 3d 3d 3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d 3d!3d"3d#3d$3d%3d&3d'3d(3d)3d*3d+3d,3d-3d.3d/3d03d13d23d33d43d53d63d73d83d93d:3d;3d<3d=3d>3d?3d@3dA3dB3dC3dD3dE3dF3dG3dH3dI3dJ3dK3dL3dM3dN3dO3dP3dQ3dR3dS3dT3dU3dV3dW3dX3dY3dZ3d[3d\3d]3d^3d_3d`3da3db3dc3dd3de3df3dg3dh3di3dj3dk3dl3dm3dn3do3dp3dq3dr3ds3dt3du3dv3dw3dx3dy3dz3d{3d|3d}3d~3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4d4d4d4d4d4d4d4d4d 4d 4d 4d 4d 4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d 4d!4d"4d#4d$4d%4d&4d'4d(4d)4d*4d+4d,4d-4d.4d/4d04d14d24d34d44d54d64d74d84d94d:4d;4d<4d=4d>4d?4d@4dA4dB4dC4dD4dE4dF4dG4dH4dI4dJ4dK4dL4dM4dN4dO4dP4dQ4dR4dS4dT4dU4dV4dW4dX4dY4dZ4d[4d\4d]4d^4d_4d`4da4db4dc4dd4de4df4dg4dh4di4dj4dk4dl4dm4dn4do4dp4dq4dr4ds4dt4du4dv4dw4dx4dy4dz4d{4d|4d}4d~4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d4d5d5d5d5d5d5d5d5d5d 5d 5d 5d 5d 5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d 5d!5d"5d#5d$5d%5d&5d'5d(5d)5d*5d+5d,5d-5d.5d/5d05d15d25d35d45d55d65d75d85d95d:5d;5d<5d=5d>5d?5d@5dA5dB5dC5dD5dE5dF5dG5dH5dI5dJ5dK5dL5dM5dN5dO5dP5dQ5dR5dS5dT5dU5dV5dW5dX5dY5dZ5d[5d\5d]5d^5d_5d`5da5db5dc5dd5de5df5dg5dh5di5dj5dk5dl5dm5dn5do5dp5dq5dr5ds5dt5du5dv5dw5dx5dy5dz5d{5d|5d}5d~5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d5d6d6d6d6d6d6d6d6d6d 6d 6d 6d 6d 6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d 6d!6d"6d#6d$6d%6d&6d'6d(6d)6d*6d+6d,6d-6d.6d/6d06d16d26d36d46d56d66d76d86d96d:6d;6d<6d=6d>6d?6d@6dA6dB6dC6dD6dE6dF6dG6dH6dI6dJ6dK6dL6dM6dN6dO6dP6dQ6dR6dS6dT6dU6dV6dW6dX6dY6dZ6d[6d\6d]6d^6d_6d`6da6db6dc6dd6de6df6dg6dh6di6dj6dk6dl6dm6dn6do6dp6dq6dr6ds6dt6du6dv6dw6dx6dy6dz6d{6d|6d}6d~6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6d6f6Zd6S(6g?iii iiiii iRiiiiiaii inii!i iiLi,iBii iiiiii{ i] iii ijiii.iNiiiiii:iiii?iii=iNiKiiikiq iii i ii ibii iiii ioi2 iiiii ici8iiiiiiiii{i|ii i"i i i@i\ii iiiiiiiFii| iQiHiiiPivii iiiiDi^ iiiFi} iiEi iOii0iisii4i<i2i ii&iMiii~ iiiGiii[ iii?ii iaiiK i*iigi iZi i:ii iiKi ii iiiiii`iliii ii i iqii~iii i ii iiiciiuiii*iii i ii~imiiiieiiGi^iinii iUiCiiCiiiiiii ijioi/iiiPi7 i[iii i? iiiioiSi(ii iipi]ii6iji i@ iiiiii8ii+i3 i[iii\iiiiii] iA iii i1iiiHi i idiii+i i2iiii iOiL iiifi1iiiiiiii3i9iili,ii iiiiiii ieiz iQiMi&i iXiiiiii iiiikipiiMiii i%ii iiiii'i ii\ i ii7iiJii!iiiiiiNiiB iPi_ iqiii iii i ii ii i iIii8 ii ii{ ii i iiiimiiifiiixii iii ii iigiii iiiiiiii&ii'iiiiii.ii iiiM iiiii$i#iiDihiAi iiiriiiUiGiiii i iQiSiiiiidi i0iFiiiC iiiii iiJii iUiiiiN i iii<ii i:iA i ii i i9ii}ii iiiWiPi ii)iDiiii4 i i i)iiir iisiiitii9 iiiis i*iiiiiii] iiiii iD iji( i iii iiui5iYiji iliiuiii iii` i i=i iiiiiii5ii!iiiTiE ixiiieii iiO iPii| i6iAi i/iki i iili!i iiBii`ii i iiAii iiii ivi i iiwiiiiMi iiiiiia iii i} iixi,i}ii iB iiiiiiiiiF ikimi ii ii ii iibii) i^ iP i i,ii ii7i5 i~ iyi|i iziiii iC i{iiiiiiiiii1iibii i iiit ii ii_ iiiiii i i ib iiii5iDiiilii|i[i* iii ii%iiG i^ iiliii ii` iii ipiiinicigimiii'i2iiii{ii ii iiiD iifi ii|i: iiiii i i i i ii inii iii;iiIiYi}ii iXi"ii iiiiiii-iiliiiiiiiiiEii~ii>i]ii,iiiiviLiBiii&iii iiiiGiiiiBii i+ iii iiiii i iaiiii ia ii}iE iiDii=ii0i ii i6 iiiivi!iiiiiiiii9iHiiiii iFiiiiii"iiH iii i ioiiiRi*ii.iiiiiiI i3ii, ii*iSiiiiXiii/iibipii iiiiiiiRii ii7 ii2ii iiiiiii_ iib ii iiii iiiiiii` iOii i i`i7i i iiiiiiia iiiiiiigiii ii i_ii~iiiiii iaii ib iiiii iii i;ii i-i iiQ iiiiqiiiii`ii#i#iiiiiri isiiiiditi iic ii ikiwi ii iiiiiiiigi iQiiUi i iiiiiCiSiic iii5iiiBii_i iciNiiiYiiii iiLidi i i iKi i8 iaiGiii i iiisi6i iti; iNiii i i4ii:ii\iqiiii.iii iui iiii i ii iriii i iic iiii@iii ii ii ii/i9 ii iiiiiii i< id iiii8iviiCiii iimii iiiiiiZiiiiiwi i{iiiii$iiiMid i0irii iigiiViiiii: iZiii{i$ie i0iii$i i i ii5ii[iiviiiciiViR i$i; iiiif iii idiiiWie iii iii i iiJ iiiiiuii ii ii i iK ii2iiL i i.iii2ii iiiiii%i iii i iiiiiiii i ixi iM ii}iiiTiiiid i iiiii`iiiii i3iii;i iiiiyiYiLiii i iiiiiUi\iiiiiiViN iii iii ii"ixi%ii;i= i iii2iEii!iiii^ii"iwi i#iiii ii$i<iQiiiri%ii]ii&ii< i'i i3i6iBii i(iii ii i iig i i i)i i i*i+i! iiiii:ii7ii^ii iii(i i,i+i i ixi-ii/ihi= i.iiiiiVi ii ihii i/iiiii<iii;i0iiii i i1izi i ii5i6i i_i)i2i3ii4iyi" iii ii^i5i i i?i%i+if i i6i_iWiii i7i> ii ig i# iiu i8i ii9ih iF iiVi{i iO iiIiwi~i i^iii:iiiiiiii i;iei1iiiiiiiii i i iiP i<i=ii>i ii(i`iRi? iYiiIi iii i7i i i?iii i@iioiiqiYiniiiliiii ii ii iEiPiVii! i iiiiiniiAii|i ii iBiiiiii- i iOi i iCiiDiWiTiTiiiii i}iEii&i i iiiiii iii~iG i iii$ iWiiiioii iFiiGiii" iiii# iiiDi-iQ iiHiei i iiIi iiiJizi iiKiiiLii$ i iiiiiH iiiiiiiMi:i iiiNiiI i iiiHiiiiiOiii iPiQiiikiRiR i iii i i ii iiiiiiSiTiii i% iiiiii& iS iUi iiS iiCiiiiVi~ii!iXiiiiii,iiiiiOii|iiiiPiie iiii i i iiiiiiiiT iiiiiWiiiiXiiYiiRi iviii ii i=i iiZiiU iii[i iiiV i% i\iii]iii^i8iT i. i' i_iiviiiiiwitii`iaibi> iii"i{ii i iiciidi9iiiii[i9iiidih i ieiii iJ i!iiifiiii iiiTigiii i%iiWiMihiiiiiiiiiiiiii( ij iiyi7imiijiki i? iW i"iiii iBiili|i ii) iziii iii iiiiimiiniuiv iwii i* iiioipiiiqi7i.irii i iii iifii i isi& iyi ii i iiiii i i>iiii iiYi iitiiui/ i+ i ivi ii i@ iwii i iii3iiii, ixi i6i9i i iii6i iii! iiiyiiQi:ici iii- ioiiiFiX i i iifi iizi iii iii{i/iii' i ibiii`iiiiui iviiiii i i iiii i0iEiiSii8i[i|i}iGii ii!i~iiiFiU ii ii iieisiii iw iiii" i iai iZi&iiiii i iiiiAiii iiii iiiiiiiii ioii ii i i ii iiA i iJi0i ix i ii iiY iiiiii i i iiZ i8ioiiiQiiiii iiiaiQiiipi;iiiPiibiiiii i ii iiii iii iiiiiiiii]iiiii iiiiii'iii. i ii iiiii iLiiiiii ii/ iiiiiB i0 i[ ii8iiiii iii/i3iiiii iiii0i iniiiiiiiii i iiiiiiiii4iiiii<i ii iiiYi iiiiC iiii iiiii}i1ii iiiiKii ii0 iFiiii ii#ii\iiiifi i>i iii iiiiii i iiiiijiiiiii-ipi9i@ i6iyiiii i i1 iiiiiiiiViiiii4iii iKi1 ii iD i iiiiii#iiii i2 iiii iZiHipiiigiii i iqiri iiiiii i iK iV i i\ i,i ii iiii]iiiuii iiiiiiiiiZiii iiiiijiii0ihihiii ii iE iii iii iiiiiiiiiii iiii2 iiiiiiiMiiwiii iy i?iiii itimi( i ii+iiiiiiiiii i ii i iii iiL iii) i ii iiif ii iiiiiiiRi"iA i3 i ii-i1ii$i i(ii] i i# ii$ i iiii i* iiii i ii i i=ik ii!ii iiii i ii ii_iiiii^ i2ii iiii9iii iiii4 i iii iibiiii ii iii5ii iii"i i iiiiii4iIi ii#ii iiiiiiij iiii$ik i ii ii\i igiiEi5 iiiiiiiii iii6 iiii ii%iii ii i[i iiiiii i&ieiii iiioi iil i i}iiiizii+ iii iiiini-ii i'iiii iiii(iii iiiiiiii ii iiiBiiiqiiii<ii*iji)i"i*ii>i)i7 ii+iiiiiiiizii,iiiiiM i)iriii-i i iiiiiiTiipiii#i#iiiiiiii iiii i ii iiSii.i8 iiiiiz i9 i=iiiim iiSiiiiiixiii/iiiqiii3ii5ii: i i ii iiiiii i; i i0i1iiiiiin ii_ ii]i i iniiiii i% iiiii i` iiiiiziTisi2i3 ii i{ ii5iiii ig iiikiiiii iii3i4ii iici iii i iiiai:i1i iii!iAihi io i i6i"iii il i-ii ia i5ii ii i ii#i! ii$ii ii4 ifii i%i& i iN i iiWiiiiii i' ii$iii< i iNiiiW ikiiO iiiiiiiX i, ii6i&itiiP ii i7i i i i- ijii i iiCi[ip ii i'i8i ib iim i i ii{i(i i ii i9i i i i:i i i^iiiiB i;iiiiii iii ii ii)i<i=i ii ii>iiiii i=iiiiiiiiiiin iiHiDi i?iiUiWi i= ii:ii iNi iKiEi@i4ic i ii> iiQ i iAiiihiii i i( i]iiiiBi*iiiliiCiDiiEih iiiiiiiXiiiii+iiii+iJiiiUiii iimi iEiiiiFiiGi iki inii id iiiiiiiiF i!i iiri@iiHi"iCiGiiii ii^i ii i8iti) i;i i? i!iioiIi i"i#i#i$iiJi i%i i&iriKi'i5 i(i)iio i@ i}iA ii,ii*i4i1i+ii i i ii" ii,ii iC iiuiriD i-i i-i iLivi{ii| iMi.i.iNiY i6 iii i/i0i/i ii1i$ii2i%iGiRiB i i_iiiC ii iD ii3iiiii ii i. ii i4i@iwii5ii6i7iii ii&i0ii8i i&i i* ii+ iG iOiuii# i i1iPiRiiQii ii)iii=i9iili iiiiE iSiiki i\i iii iyi:i i;i<iF i%i=iiRiii>idi'i, i?iei$ ii2i3i- ii i4ii(iSi@iAiBii.iTiiOi i iiiii i&i iii i<i iiiiCiiDi iiUiip iG ie i i i ii iEi;iViFi'iGi)i ii} iHi*iiWiiiIiiTii i iiiiii iiJi. igi~iiUiij i iiiXiii8ii*i iiiKi~ iii iLiiH i iii% ii+if iii iitiiMiNiii ii ii iiik iYiiYiiii*i/ iiOiR iZiH ii#iI i i iii5iS i]iE i[i\i isiI i+iPiQi,i i iRiiSiTii,iiUi]iVi iiLi-i!i iT i\i4iWi iiXiYiZii[i>iwiiiii+i^iiJ ii_i$ii\iiiili.i]i`ii^i_iq i%ii`iaiiii i6ig iU ibicidiai iq ixi iei ibiyi ifihigihiii'iii iii ijir ii i0 i i=iibi|iiiiii i iih iki iliii iaiicimiii ini iiui iidieiis iK i/ioi7ii& i iJ i8ipiqii ij ifii igi iii(ii`irisi i iii<iFik ifiiiii]iiiIiti>iiuiivii iii i0ii-iiwiL ii iiiiiGiaii it i ii iSiKixiiyiziiiV iiiOii1 ii i{i i iiF iyii9iZ ii|i}i~iFi iii i i:iiiii2 iiiipii;iG iii ihiiiii7 iiiiiqiiiM iiiiiii iii iii i(i8 iiN i ii3 i iiO i<iiiiTiiW i iiiii(iiii1iiiiiiiiu iZii i iciijiP ipiii iiii iv iiijii iiii iQ iK i ii i' iiiiii9 iii i izii i iiikiiiii ii2i iiliii>i=iCi'iii>i iiZiiii imini iibiii i iqi?ii ii ii i"ii i?i i}iiioi@i>iiAi i1ii)iiii?i i iiiixi ii ii i3i i ihii il iiii)ii ipii'iiii4ii i i iiiiAi_i iBiiL ii iPiqii iiriiiiiX iicisi! iiiiHii iw iiiiCiDitiiiiiiix i ii i/ iiii5i i4 iuiir iii_iii/i i<ii~i7iy im iii^i5 in ibi itiiil iiii6ii i7iiiiiiiviiii i8i: ii ii0 i i1 iiwiiIiiiii i( iiiBi ii4isi iiiii i iii?iCiixi iEiHi iiFiyiziGiiiii{iiii|ii; i}i9imiH i~iiz iiis i iiM iiii iiim iiiIiiiio iiiiiiii_iiii i2 i3 iHii*iii iiii< iiii:ii ii iiAii iiR iiiii i ii" ii iiiiii ii iii iiiQi i iY iiiiiiii{iKii ii[i iJiiiN iiS iiiiiI iiiT i@ii iii i i@iiRiii it iiiiJiIii iiiii iU iimiiii{ i ii i i;iV iii iii<iii idiiiiXiii9iii6 iiiUiiii iiLi!i= ii) ii i i iii i iii ii=i$i(iviii&iicii iii i ii>iiii{i"iiiii#iiiiiW ii iiii ii$i i%iiiiii&i^iii[ i ii'iiiiiiii(i iii2i\ iJi ip ipin iiu iq i)ii iO i> ii i*iX iii i+ii i,i iii iiiiiKii i iiIi-iii!iiiiii.iDiiiJisi# iii ii7 iiii/iwii|iiiiii"i4 i| i,iiiii iiiiiiiii?iY iP i0ii1iZ iZ i ii i ii i#i@i2ii|iiziiiiiAi'ii? ii ii8 ii iyiiLiVi i3i i i i$iiiiMii%ii i i i i i.ii4iNiii ii i i iiii i5i9 i%iiiiKiQ iiixi6i7iiBi i iOiv i[ iii&ii ii iiiXii* ii\ iPi i iNi+ iw iiiiiWiCi ii iQiDi i?i] iiii^ io iR i i iEii iiFi i'iiXiiGiiS i iiT iRii8ixi ikiSiiTiii ii iiDii9i!iiiii(iiLi"i#i$i%i_ ii&iJi:iUii}i i)ii i;i<i iEi+i'i iiHi=iVi*iHiyi, i+iWi3i>i ii?i(iIi,i-i` iqiia i iii ii)i*iXi i+iiOiiYi,i-ii.ii/i ii0i.iiii1i iJir i2i3i$ i i4ii5i6i7i iib i iii} i ifiiKii i i i i8iZi9ii: ii ic ii:ii i;is iJ i@ii it i; i i/i<id ii iiiU ii0iie i=iif iu iMiiiii i>i i[iiAiLiiii?i i i i i@iAiv iBiCi\iijii[ i ig iDiEiiiFi iBiiGi iiHii(iiMiCih iiIiNiJi iKiLiiiMii1i2iNiiidiOidiV iDi`ii#i5 iPi]iQiEini i iii^iRi_iFiSip ii iiTiUii i iVii i iiGiiiieiHiOi iiPi`iWiw ij iXi ii3i iaiiIiYiJix i7iiii- i i4ik iibiZi-iii. icii[i iri;i iKi5iLiXii i iii\i]iii6i% i^i_iii~i`il iy iaizi~ iiibi?iici7idi iiieiiz iiiMifigi/ ihi|ii@idiiiiiNiiii8ifiiijikiiOiPiiilimi@ini9i ioi i iii< isii\ iQi.iRiNi@i iipiiSi{ iqiiAii iiiiTi iiii:iiiri isi@ iW i;itiui iviwixiyi| iiiiizi i i3iQiiimiiAi{i|ii ii}iOiRi iigiii~iZi iiiiii i\im ii} ii<iX ii ii i iiii iiY iiii0 iiii i=i iiiiLiiiiihiiiiii>i>ii/i?iUiiiiiiei)ix itiifiSii iy i in i i iiTi i@ii i iiiiiiii ii iziUigiiViio iii6 ip itiiiiiii iAiiJiVihiZ i iiWiiiii iMiii iii iiBiieiCi iijii i iiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiViPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i iq i i i iiiiiiiiiiiiiXiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6ii7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMikiliNiOiPiQi iYiRiSiTiUiZiViWiXiYiZi[i\i]i^i_i`iiaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiimiiiiiiiiiiiiiiiiiiiini iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiiiii iiiiiiiiiioi iiiiiiiiEiiiiiiiiiiiiiiiiiii i i i i iiiFiiipiiiiiiiiiGiiii~ iiiiii i!i"i#i$i%i&i'i(i)ii*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNi[iOiPiQiRiSiTiUiViWiXiYi\iZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}iHi~iir iiiiiiiiiIiiiiiiiiiiiiiiiiiiiiiiiii]iii^iiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiqiiiiiiiiiiiiiiiiiiiiiiii iiiiii_iiiiiiiiiiiiiiiiiiiiiiiJiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiii iiiiiii`iii i!i"iai#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiWiSiTiUiViiWiXiYiZi i[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviiwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiibiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiKiLiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiXiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiidii ii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2ii3i4i5i= i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNi iOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaiibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}iii~iiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiieiiiiiiiiiiiiiiiiiii i i i i iiiiis iiiiiifiiiiiiiiii i!i i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3iri4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFi> iGiHiiIiJiKiiLiMiNiOiPiNiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}ii~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiit iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiOiiiiiiiiiiii& iiiiiiiiigiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-ii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<ii=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiPiQiRiSiTiUiViWiiXiYiZi[i\i]i^i_i`iaibicidiihieifigihiiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiQiiiiiiiiiiiiiiiiiiiiiiRiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiSiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iu iA iB iC iD iE iF ijiG iH iI iJ iK iL iM iN iO iP ikiQ iR iS iT i iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ilib ic id ie if ig ih ii ij ik il im in io ip iq ir is iit iu iv iw ix i iy iz i{ i| i} i~ i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i iimi i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i ini i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!iTi!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iiu!iv!iw!ix!iy!iz!i{!i|!i}!i i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!ii!i!i!i!i!i!i!i!i ii!i!i!i!i!i!i!i!iti!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i1 i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!ioi!i!i!i i i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!ipi!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"ii"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"iUi"i"i "i!"i""i#"i$"i%"i&"i'"i("i)"i*"i+"i,"i-"i."i/"i0"i1"i2"i3"i4"i5"i6"i7"i8"i9"i:"i;"i i<"i="i>"i?"i@"iA"iB"iC"iD"iE"iF"iG"iH"iI"iJ"iK"iL"iM"iN"iO"iP"iQ"iR"iS"iT"iiU"iiV"iW"iX"iiY"iZ"i["i\"i]"i^"i_"i`"ia"iib"ic"id"ie"if"ig"ih"ii"ij"ik"il"im"in"io"iuip"iq"ir"is"it"iu"iv"iw"ix"iy"iz"i{"i|"i}"i~"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"ii"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"iqi"i"i"i"i"i"i"i"ii"i"i"i"i"i"i"i"i"i"i"ii"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i#i#i#i#i#i#ii#i#i#i #i #i #i #i #i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i #ii!#i"#i##i$#i%#i&#i'#i(#i)#i*#i+#i,#i-#i.#i/#i0#i1#i2#i3#i4#i5#i6#i7#i8#i9#i:#i;#i<#i=#iVi>#i?#i@#iA#iB#iC#iD#iE#iF#iG#iH#iI#iJ#iK#iL#iM#iN#iO#iP#iQ#iR#iS#iT#iU#iV#iW#iX#iY#iZ#i[#i\#i]#i^#i_#i`#ia#ib#ic#id#ie#if#ig#iih#ii#ij#ik#il#im#iin#io#ip#iq#ir#is#it#iu#iv#iw#ix#iy#iz#i{#i|#i}#i~#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#ivi#i#i#i#i#i#i#i#i#i#ii#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#ii#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#i#ii#i#i#i#i#i#i#i#i#i#i#i#i$i$i$i$i$i$i$iri$i$i $i $i $i $i $i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$ii$i$i $i!$i"$i#$i$$i%$i&$i'$i($i)$ii*$i+$i,$i-$iii.$i/$i0$i1$i2$i3$i4$i5$i6$i7$i8$i9$isi:$i;$i<$i=$i>$i?$i@$iA$iB$iC$iD$iE$iYiF$iG$iH$iI$iJ$iK$iL$iM$iN$iO$iP$iQ$iR$iS$iT$iU$iV$iW$iX$iY$iZ$i[$i\$i]$i^$i_$i`$ia$ib$ic$id$ie$if$ig$ih$ii$ij$iik$il$im$in$io$ip$iq$ir$is$it$iu$iv$iw$ix$iy$iz$i{$i|$i}$i~$i$i$i$i$i$iti$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i i$iui$i$i$i$i$i!i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$ivi$i i$i$iZi i$i$i$i$i$i$i$i$i$i$i$i$i"i$i$i$i$i$i$i$i$iwi$i$i$i$i$i$i$iwi$i$i$i$i$i$i$i$i$i$i$i$i$i$i i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i$i%i#i%i%i%i%i%i$i%i%i%i %i %i %i %i %i%i%i%i i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i %i!%i"%i#%i$%i%%i&%i'%i(%i)%i*%i+%i,%i-%i.%i/%i0%i%i1%i2%i3%i4%i5%i6%i&i7%i8%i9%i:%i;%i<%i=%i>%i?%i@%iA%iB%iC%iD%iE%iF%iG%iH%iI%iJ%iK%iL%iM%iN%iO%iP%iQ%iR%iS%iT%iU%iV%iW%iX%iY%iZ%i[%i\%i]%i^%i_%i`%ia%ib%ic%id%ie%if%ig%ih%ii%ij%ik%il%im%in%io%ip%iiq%ir%is%it%iu%iv%iw%ix%iy%iz%i{%i|%i}%i~%i%i%i%i%i'i%i%i%i%i%i(i%i%i%i%i%i%i%i)i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i*i%i%i%i%i%i%i%i%i%i%i%i+i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%iWi%i%i%i%i%i,i%i%i%i%i-i%i%i%i%i%i%i%i%i%i.i%i%i%i[i%i%i%i i%i%i%i%i%i%i%i%i%i/i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i%i&i&i&i&i&i&i&i&i0i&i &i &i &i &i1i &i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i2i&i &i!&i"&i#&i$&i%&i&&i'&i(&i)&i*&i+&i,&i-&i.&i/&i0&i1&i2&i3&i4&i5&i6&i3i7&i8&i9&i:&i;&i<&i=&i>&i?&i@&iA&i4iB&iC&iD&iE&iF&iG&iH&iI&iJ&iK&iL&iM&iN&iO&iP&iQ&iR&iS&iT&iU&iV&iW&iX&iY&iZ&i[&i\&i]&i^&i_&i`&ia&ib&ic&id&ie&if&ig&ih&ii&ij&ik&il&im&in&io&ip&iq&ir&is&it&iu&iv&iw&ix&iy&iz&i{&i|&i}&i~&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i5i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&ixi&i&i&i&i&ii&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i6i&i&i&i7i&i&i&i&iXi&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i&i8i&i&i&i&i&i&i&i&i&iYi&i&i&i&i&i&i&i&i&i&i9i&i&i&iyi&i&i&i&i&i&i&i&i&izi&i&i&i&i&i&i'i'i'i'i'i'i'i'i'i 'i 'i 'i 'i 'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i 'i!'i"'i#'i$'i%'i:i&'i;i''i('i)'i*'i+'i,'i-'i.'i/'i0'i1'i2'i3'i4'i5'i6'i7'i8'i9'i:'i;'i<'i='i>'i?'i@'i<iA'iB'iC'iD'iE'iF'iG'iH'iI'iJ'iK'iL'iM'iN'iO'iP'iQ'iR'iS'iT'iU'iV'iW'iX'iY'iZ'i['i\'i]'i^'i_'i`'ia'ib'ic'id'ie'if'ig'i{ih'ii'ij'ik'il'im'in'io'ip'iq'i|ir'is'it'iu'iv'iw'ix'iy'iz'i{'i|'i}'i~'i'i~i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'iiZi=i'i'i'i'i'i'i'i}i[i'i'i'i'i'i'i\i'i'i'i'i'i'i'i'i>i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i i'i'i'i'i'i'i'i'i~i'i'i'i'ii'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i'i?i'i'i'i'i'i(i(i(i(i(i(i(i(i(i (i (i (i (i (i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i (i!(ii@iAi"(i#(i$(i%(i&(i'(i((i)(i*(i+(i,(i-(i.(i/(i0(i1(i2(i3(i4(i5(i6(i7(i8(i9(i:(i;(i<(i=(i>(i?(i@(iA(iB(iC(iD(iE(iF(iG(iH(iI(iJ(iK(iL(iM(iN(iO(iP(iQ(iR(iS(iT(iU(iV(iW(iX(iY(iZ(i[(i\(i](i^(iBi_(i`(ia(ib(ic(id(ie(if(iCig(ih(ii(ij(ik(il(im(in(io(ip(iq(ir(is(i it(i iu(iv(iw(ix(i]iy(iz(i{(i|(i}(i~(i(i(i(i(i(i(i(i(i(iDi(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(iEi(i(i(iFi(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(iv i(i(i(i(i(i(i(i(i(i(i(iGi(i(i(i(i(i(i(iHi(i(i(i(i(i(i(i(i(i(i(i(i(iIi(i(i(i(ii(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i(i)i)i)i)i)i)i)i)i)i )iJi )i )i )i )i)i i)i)i)i)i)i)iw i)i)i)i)i)i)i)i)i)i)i)i )i!)i")i#)i$)i%)i&)i')i()i))i*)i+)i,)i-)i.)i/)ii0)iKi1)i2)i3)i4)i5)i6)i7)i8)i9)i:)i;)i<)i=)i>)i?)i@)iA)iB)iC)iD)iE)iF)iG)i\iiH)iI)iJ)iK)iL)ix iM)iN)iO)iP)iQ)iR)iS)iT)iU)iV)iW)iX)iY)iZ)i[)i\)i])i^)i_)i`)ia)ib)ic)id)ie)if)ig)ih)ii)ij)ik)il)im)in)io)ip)iq)ir)is)it)iu)iv)iw)ix)iy)iz)i{)i|)i})i~)i)i)i)i)i)ii)i)i)i)i)iLi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)iMi)i)i)i' i)i)i)i)i)i)i)i i)i)i)i)i)i)i)i)i)i)i)i)i)i)iNi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)ii)i)i)i)i)i)i)iOi)i]i)i)i)i)i)i)i)iPi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)iQi)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i)i*i*i*i*i*i*i*i*i*i *iRi *i *i *i *i*i*iSiTi*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i *i!*i"*i#*i$*i%*i&*i'*i(*i)*i**i+*i,*i-*i.*i/*i0*i1*i2*i3*i4*i5*i6*i7*i8*i9*i:*i;*i<*i=*i>*i?*i@*iA*iB*iC*iD*iE*iF*iG*iH*iI*iJ*iK*iL*iM*iN*iO*iP*iQ*iR*iS*iT*iU*iV*iW*iX*iY*iZ*i[*i\*i]*i^*i_*i`*ia*ib*ic*id*ie*if*ig*ih*ii*ij*ik*il*im*in*io*ip*iq*ir*is*it*iu*iv*iw*ix*iy*iz*i{*i|*i}*i~*ii*i*i*i*i*i*i*iUi*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*ii*i*i*i*i*i*i*i*i*i*i*i*i*iVi*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*ii*i*i*i*i*i*i*i*i*i*i^i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*i*ixi*i+i+i+i+i+i+i+i+i+i +i +i +i +i +i+i+i+i+i+i+i+i+i+i+i+iWi+i+i+i+i+i+i+i +i!+i"+i#+i$+i%+i&+i'+ii(+i)+i*+i++iXi,+i-+i.+i/+i0+i1+i2+iYi3+i4+i5+i6+i7+i8+i9+i:+i;+i<+i=+i>+i?+iZi@+iA+iB+iC+iD+iE+iF+iG+iH+iI+iJ+iK+iL+iM+iN+iO+iP+iQ+iR+iS+iT+iU+iV+iW+iX+iY+iZ+i[+i\+i]+i^+i_+i`+ia+ib+ic+id+ie+if+ig+ih+ii+ij+ik+iil+im+in+io+ip+iq+ir+is+it+iu+iv+iw+ix+iy+iz+i{+i|+i}+i~+i[i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i\i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i]i+i+i+i+i+i+i^i+i+i+i+i+i+i+i+i+i+i+i+i+i+i^i+i+i+i+i+i+i_i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i+i_i+i+i+i+i+i+i+i+i+i+i+i+i,i,i,i,i,i,i,i,i,i ,i ,i ,i ,i ,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i ,i!,i",i#,i$,i%,i&,i',i(,i),i*,i+,i,,i-,i.,i/,i0,i1,i2,i_i3,i4,i5,i6,ii7,i8,i9,i:,i;,i<,i=,i>,i?,i@,iA,iB,iC,iD,iE,iF,iG,iH,iI,iJ,iK,iL,iM,iN,iO,iP,iQ,iR,iS,i`iT,iU,iV,iW,iX,iY,iZ,i[,i\,i],i^,i_,i`,ia,ib,ic,id,ie,if,ig,ih,ii,ij,ik,il,im,in,io,ip,iq,iyiair,is,it,iu,iv,iw,ix,iy,iz,i{,i|,i},i~,i,i,i,i,i,i,i,i`i,i,i,i,i,i,i,i,i,i,i,i,i,i,ibi,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,ici,i,ii,i,i,i,idi,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,iei,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i,i-i-i-i-i-i-i-i-i-i -izi -i -i -i -i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i -i!-i"-i#-i$-i%-i&-i'-i(-i)-i*-i+-i,-iaibi--i.-i/-i0-i1-i2-i3-i4-i5-i6-i7-i8-i9-i:-i;-i<-i=-i>-i?-i@-iA-iB-iC-iD-iE-iF-iG-ificiH-iI-iJ-iK-iL-iM-iN-iO-iP-iQ-iR-iS-iT-i iU-iV-iW-iX-iY-iZ-igi[-i\-i]-i^-i_-i`-ia-ib-ic-id-ie-if-ig-ih-ii-ij-ik-il-im-in-io-ip-iq-ir-is-it-iu-iv-iw-ix-iy-iz-i{-i|-i}-i~-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-ihi-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-ii-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i i-i-i-i-i-i-i-i-i-i-i-i-iii-i-i-i-i-i-i-i-i-i-ii-i-i-i-i-i-i-i-i-i-i-i-iji-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i-i.i.i.i.i.i.i.i.i.i .i .i .i .i .i.iki.i.i.i.i.i.i.ili.i.i.i.i.i.i.i.i.i.i .i!.i".imi#.i$.i%.i&.i'.i(.i).i*.i+.i,.i-.i..i/.i0.i1.i2.i3.i4.i5.i6.i7.i8.i9.i:.i`ii;.i<.ini=.i>.i?.i@.iA.iB.iC.iD.iE.iF.iG.iH.iI.iJ.iK.iL.iM.iN.iO.iP.iQ.iR.iS.iT.iU.iV.iW.iX.iY.iZ.i[.i\.i].i^.i_.i`.ia.ib.ic.id.ie.if.ig.ih.ii.ij.ik.il.iim.in.io.ip.iq.ir.is.it.iu.iv.iw.ix.iy.iz.i{.i|.i}.i~.i.i.i.i.i.i.i.i.i.i.i.i.i.ioi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.ipi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.idi.i.i.i.i.iqi.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i.i/i/i/i/i/i/i/i/i/i /i /i /i /i /i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/iri/i/i /i!/i"/i#/i$/i%/i&/i'/i(/i)/i*/i+/i,/i-/i./i//i0/i1/i2/i3/i4/i5/i6/i7/i8/i9/i:/i;/i/i?/i@/iA/iB/iC/iD/iE/iF/iG/iH/iI/iJ/iK/iL/iM/iN/iO/iP/iQ/iR/iS/iT/iU/iV/iW/iX/iY/iZ/i[/isi\/i]/i^/i_/i`/ieia/ib/ic/id/ie/if/ig/ih/ii/ij/ik/il/im/in/io/ip/iq/ir/is/it/iu/iv/iw/ix/iy/iz/iti{/i|/i}/i~/i/i/ii/i/i/i/ii/i/i/i/i/ii/i/ii/i/i/i/i/ii/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/iui/i/i/i/i/i/i/i/i/i/i/i/i/i/ivi/i/i/i/i/i/i/i/i/i/iwi/i/i/i/ixi/i/i/i/i/i/i/i/i/i/i/i/i/i/i/iyi/ii/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/i/izi0i0i0i0i0i0i0i0i0i i 0i 0i 0i 0i 0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i{i 0i!0i"0i#0i$0i%0i&0i'0i(0i)0i*0i+0i,0i{i-0i.0i/0i00i10i20i30i40i50i60i70i80i90i:0i;0i<0i=0i>0i?0i@0iA0iB0iC0iD0iE0iF0iG0i|iH0iI0iJ0iK0iL0iM0iN0iO0iP0iQ0iR0i}iS0iT0iU0iV0iW0iX0iY0iZ0i[0i\0i]0i^0i_0i`0ia0ib0ic0id0ie0if0ig0ih0ii0ij0ik0il0im0in0io0ip0iq0ir0is0it0iu0iv0iw0ix0i|iy0iz0i{0i|0i}0i~0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i}i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i~i0i0i0i0i0i0i0i0i0ii0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i0i1i1i1i1i1i1i1i1ii1i 1i 1i 1i 1i 1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i 1i!1i"1i i#1i$1i%1i&1i'1i~i(1i)1i*1i+1i,1i-1i.1i/1i01i11i21i31i41i51i61i71i81i91i:1i;1i<1i=1i>1i?1i@1iA1iB1iC1iD1iE1iF1iG1iH1iI1iJ1iK1iL1iM1iN1iO1iP1iQ1iR1iS1iT1iU1iV1iW1iX1iY1iZ1i[1i\1i]1i^1i_1i`1ia1ib1ic1id1ie1if1iig1ih1ii1ij1ik1il1im1in1io1ip1iq1ir1is1it1iu1iv1iw1ix1iy1iz1i{1i|1i}1i~1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1ii1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1i1iii1i1i1i1i1i1i1i1ii1i1i1i1i1i1i1i1i1i1i1i1i1i2i2i2i2i2i2i2i2i2i 2i 2i 2i 2i 2i2i2i2i2i2i2i2i2i2i2i2i2i2ifii2i2i2i2i2i 2i!2i"2i#2i$2i%2i&2i'2i(2i)2i*2i+2i,2i-2i.2i/2i02i12i22i32i42i52i62i72i82i92i:2i;2i<2i=2igi>2i?2i@2iA2iB2iC2iD2iE2iF2iG2iH2iI2iJ2iK2iL2iM2iN2iO2iP2iQ2iR2iS2iT2iU2iV2iW2iiX2iY2iZ2i[2i\2i]2i^2i_2i`2ia2ib2ic2id2ie2if2ig2ih2ii2ij2ik2il2im2in2io2ip2iiq2ir2is2it2iu2iv2iw2ix2iy2iz2i{2i|2i}2i~2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2ii2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2ii2ii2i2i2i2i2ii2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2iy i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i2i3i3i3i3i3i3i3i3i3i 3i 3i 3i 3i 3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i 3i!3i"3i#3i$3i%3i&3i'3i(3i)3i*3i+3i,3i-3i.3i/3i03i13i23i33i43i53i63i73i83i93i:3i;3i<3i=3i>3ii?3ii@3iA3iB3iC3iD3iE3iF3iG3iiH3iI3iJ3iK3iL3iM3iN3iiiO3iP3iQ3iR3iS3iiT3iU3iV3iW3iX3iY3iZ3i[3i\3i]3i^3i_3i`3ia3ib3ic3id3ie3if3ig3iih3ii3ij3ik3il3im3in3io3ip3iq3ir3is3it3iu3iv3iw3ix3iiy3iz3i{3i|3i}3i~3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3ii3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3ihii3i3i3i3i3i3i3i3i3i3i3i3i3ii3i3i3i3ii3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3iz i3i3i3i3i3i3i3i3ii3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3i3ii3i3i3i3i3i3i3i3i3i4i4i4i4i4i4i4i4i4i 4i 4i 4i 4i 4i4i4i4ii4i4i4i4i4i4i4i4i4i4i4i4i4ii4i4i 4i!4i"4i#4i$4i%4i&4i'4i(4i)4i*4i+4i,4i-4i.4i/4i04i14i24i34i44i54i64i74ii84i94i:4i;4i<4i=4i>4i?4i@4iA4iB4iC4iD4iE4iF4iG4iH4iI4iJ4iK4iL4iM4iN4iO4iP4iQ4iR4iS4iT4iU4iV4iW4iX4iY4iZ4i[4i\4i]4i^4i_4i`4ia4ib4ic4id4ie4if4ig4ih4ii4ij4ik4il4im4in4io4ip4iq4ir4is4it4iu4iv4iw4ix4iiy4iz4i{4iii|4i}4i~4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4ii4i4i4i4i4i4i4i4i4i4i4i4i4ii4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i4i5i5i5i5i5i5i5i5i5i 5i 5i 5i 5i 5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i 5i!5i"5i#5i$5i%5i&5i'5i(5i)5i*5i+5i,5i-5i.5i/5i05i15i25i35i45i55i65i75i85i95i:5i;5i<5i=5i>5i?5i@5iA5iB5iC5iD5iE5iF5iG5iH5iI5iJ5iiK5iL5iM5iN5iO5iP5iQ5iR5iS5iiT5iU5iV5iW5iX5iY5iZ5i[5i\5i]5i^5i_5i`5ia5ib5ic5id5ie5if5ig5ih5ii5ij5ik5il5im5in5io5ip5iq5ir5is5it5iu5iv5iw5ix5iy5iz5i{5i|5i}5i~5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i5i6i6i6i6i6i6i6i6i6i 6i 6i 6i 6i 6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i 6i!6i"6i#6i$6i%6i&6i'6i(6i)6i*6i+6i,6i-6i.6i/6i06i16i26i36i46i56i66i76i86i96i:6i;6i<6i=6i>6i?6i@6iA6iB6iC6iD6iE6iF6iG6iH6iI6iJ6iK6iL6iM6iN6iO6iP6iQ6iR6iS6iT6iU6iV6iW6iX6iY6iZ6i[6i\6i]6i^6i_6i`6ia6ib6ic6id6ie6if6ig6ih6ii6ij6ik6il6im6in6io6ip6iq6ir6is6it6iu6iv6iw6ix6iy6iz6i{6i|6i}6i~6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6i6N(tBIG5_TYPICAL_DISTRIBUTION_RATIOtBIG5_TABLE_SIZEtBig5CharToFreqOrder(((s4/usr/lib/python2.7/site-packages/chardet/big5freq.pyt+s000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000PK[&'MM%site-packages/chardet/euckrprober.pyonu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tEUCKRDistributionAnalysis(t EUCKRSMModelt EUCKRProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pyR#s  cCsdS(NsEUC-KR((R ((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pytget_charset_name)s(t__name__t __module__RR (((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pyR"s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/euckrprober.pytsPK[:r__(site-packages/chardet/langgreekmodel.pycnu[ ۝Rc@shdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6ZdS(iiiiiRidihi^ibieitifioiiui\iXiqiUiOiviiiSiCiriwi_icimiiHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipiiZiJiii=i$i.iGiIi6ili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0ii%i!i-i8i2iTi9iyiiiii|iiiiii i iii ii iiii iiiii iii*ii@iKiiiitcharToOrderMaptprecedenceMatrixgs?tmTypicalPositiveRatiotkeepEnglishLetters ISO-8859-7t charsetNames windows-1253N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiRidihi^ibieitifioiiui\iXiqiUiOiviiiSiCiriwi_icimiiiiiiiiHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiZiiiiiiiiiiiJiiiiiiiii=i$i.iGiIii6iili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0ii%i!i-i8i2iTi9ixiyiiiii|iiiiii i iii ii iiii iiiii iii*ii@iKiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiRidihi^ibieitifioiiui\iXiqiUiOiviiiSiCiriwi_icimiiiiiiiiHiFiPiQi<i`i]iYiDixiaiMiViEi7iNisiAiBi:iLijigiWikipiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii=iiiiiiiiiiiJiiiiiiiiii$i.iGiIii6iili{inii3i+i)i"i[i(i4i/i,i5i&i1i;i'i#i0ii%i!i-i8i2iTi9ixiyiiiii|iiiiii i iii ii iiii iiiii iii*ii@iKiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tLatin7_CharToOrderMaptwin1253_CharToOrderMaptGreekLangModeltFalsetLatin7GreekModeltWin1253GreekModel(((s:/usr/lib/python2.7/site-packages/chardet/langgreekmodel.pyt#sV  PK[i ,site-packages/chardet/charsetgroupprober.pycnu[ ۝Rc@sFddlmZddlZddlmZdefdYZdS(i(t constantsiN(t CharSetProbertCharSetGroupProbercBs5eZdZdZdZdZdZRS(cCs,tj|d|_g|_d|_dS(Ni(Rt__init__t _mActiveNumt _mProberstNonet_mBestGuessProber(tself((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR"s   cCsbtj|d|_x<|jD]1}|r |jt|_|jd7_q q Wd|_dS(Nii(RtresetRRtTruetactiveRR(Rtprober((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR (s    cCs0|js#|j|js#dSn|jjS(N(Rtget_confidenceRtget_charset_name(R((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR2s    cCsx|jD]}|sq n|js+q n|j|}|sFq n|tjkrh||_|jS|tjkr t|_|j d8_ |j dkrtj|_ |jSq q W|jS(Nii( RR tfeedRteFoundItRt get_stateteNotMetFalseRt_mState(RtaBufR tst((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR:s$     cCs|j}|tjkrdS|tjkr2dSd}d|_x|jD]}|s]qKn|jstjrKt j j |j dqKqKn|j }tjrt j j d|j |fn||krK|}||_qKqKW|jsdS|S(NgGz?g{Gz?gs not active s%s confidence = %s (RRRRRRRR t_debugtsyststderrtwriteRR (RRtbestConfR tcf((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR Ns2          (t__name__t __module__RR RRR (((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR!s    (tRRt charsetproberRR(((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyts PK[US"site-packages/chardet/__init__.pyonu[ %Rc@s#dZddlmZdZdS(s2.2.1i(t version_infocCstdkrt|ts7tdkrFt|t rFtdnddlm}|j}|j|j ||j |j S(Niis-Expected a bytes object, not a unicode objecti(tuniversaldetector(ii(ii( Rt isinstancetunicodetbytest ValueErrortRtUniversalDetectortresettfeedtclosetresult(taBufRtu((s4/usr/lib/python2.7/site-packages/chardet/__init__.pytdetects    N(t __version__tsysRR(((s4/usr/lib/python2.7/site-packages/chardet/__init__.pytsPK[|E^^$site-packages/chardet/eucjpprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### import sys from . import constants from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCJPDistributionAnalysis from .jpcntx import EUCJPContextAnalysis from .mbcssm import EUCJPSMModel class EUCJPProber(MultiByteCharSetProber): def __init__(self): MultiByteCharSetProber.__init__(self) self._mCodingSM = CodingStateMachine(EUCJPSMModel) self._mDistributionAnalyzer = EUCJPDistributionAnalysis() self._mContextAnalyzer = EUCJPContextAnalysis() self.reset() def reset(self): MultiByteCharSetProber.reset(self) self._mContextAnalyzer.reset() def get_charset_name(self): return "EUC-JP" def feed(self, aBuf): aLen = len(aBuf) for i in range(0, aLen): # PY3K: aBuf is a byte array, so aBuf[i] is an int, not a byte codingState = self._mCodingSM.next_state(aBuf[i]) if codingState == constants.eError: if constants._debug: sys.stderr.write(self.get_charset_name() + ' prober hit error at byte ' + str(i) + '\n') self._mState = constants.eNotMe break elif codingState == constants.eItsMe: self._mState = constants.eFoundIt break elif codingState == constants.eStart: charLen = self._mCodingSM.get_current_charlen() if i == 0: self._mLastChar[1] = aBuf[0] self._mContextAnalyzer.feed(self._mLastChar, charLen) self._mDistributionAnalyzer.feed(self._mLastChar, charLen) else: self._mContextAnalyzer.feed(aBuf[i - 1:i + 1], charLen) self._mDistributionAnalyzer.feed(aBuf[i - 1:i + 1], charLen) self._mLastChar[0] = aBuf[aLen - 1] if self.get_state() == constants.eDetecting: if (self._mContextAnalyzer.got_enough_data() and (self.get_confidence() > constants.SHORTCUT_THRESHOLD)): self._mState = constants.eFoundIt return self.get_state() def get_confidence(self): contxtCf = self._mContextAnalyzer.get_confidence() distribCf = self._mDistributionAnalyzer.get_confidence() return max(contxtCf, distribCf) PK[!CT1T1'site-packages/chardet/langgreekmodel.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # 255: Control characters that usually does not exist in any text # 254: Carriage/Return # 253: symbol (punctuation) that does not belong to word # 252: 0 - 9 # Character Mapping Table: Latin7_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 253,233, 90,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 253,253,253,253,247,248, 61, 36, 46, 71, 73,253, 54,253,108,123, # b0 110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 ) win1253_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253, 82,100,104, 94, 98,101,116,102,111,187,117, 92, 88,113, 85, # 40 79,118,105, 83, 67,114,119, 95, 99,109,188,253,253,253,253,253, # 50 253, 72, 70, 80, 81, 60, 96, 93, 89, 68,120, 97, 77, 86, 69, 55, # 60 78,115, 65, 66, 58, 76,106,103, 87,107,112,253,253,253,253,253, # 70 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 80 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 90 253,233, 61,253,253,253,253,253,253,253,253,253,253, 74,253,253, # a0 253,253,253,253,247,253,253, 36, 46, 71, 73,253, 54,253,108,123, # b0 110, 31, 51, 43, 41, 34, 91, 40, 52, 47, 44, 53, 38, 49, 59, 39, # c0 35, 48,250, 37, 33, 45, 56, 50, 84, 57,120,121, 17, 18, 22, 15, # d0 124, 1, 29, 20, 21, 3, 32, 13, 25, 5, 11, 16, 10, 6, 30, 4, # e0 9, 8, 14, 7, 2, 12, 28, 23, 42, 24, 64, 75, 19, 26, 27,253, # f0 ) # Model Table: # total sequences: 100% # first 512 sequences: 98.2851% # first 1024 sequences:1.7001% # rest sequences: 0.0359% # negative sequences: 0.0148% GreekLangModel = ( 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,2,2,3,3,3,3,3,3,3,3,1,3,3,3,0,2,2,3,3,0,3,0,3,2,0,3,3,3,0, 3,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,0,3,3,0,3,2,3,3,0,3,2,3,3,3,0,0,3,0,3,0,3,3,2,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, 0,2,3,2,2,3,3,3,3,3,3,3,3,0,3,3,3,3,0,2,3,3,0,3,3,3,3,2,3,3,3,0, 2,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,2,1,3,3,3,3,2,3,3,2,3,3,2,0, 0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,2,3,3,0, 2,0,1,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,3,0,0,0,0,3,3,0,3,1,3,3,3,0,3,3,0,3,3,3,3,0,0,0,0, 2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,0,3,0,3,3,3,3,3,0,3,2,2,2,3,0,2,3,3,3,3,3,2,3,3,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,3,2,2,2,3,3,3,3,0,3,1,3,3,3,3,2,3,3,3,3,3,3,3,2,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,0,3,0,0,0,3,3,2,3,3,3,3,3,0,0,3,2,3,0,2,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,3,0,0,3,3,0,2,3,0,3,0,3,3,3,0,0,3,0,3,0,2,2,3,3,0,0, 0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,0,3,2,3,3,3,3,0,3,3,3,3,3,0,3,3,2,3,2,3,3,2,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,2,3,2,3,3,3,3,3,3,0,2,3,2,3,2,2,2,3,2,3,3,2,3,0,2,2,2,3,0, 2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,3,3,3,2,3,3,0,0,3,0,3,0,0,0,3,2,0,3,0,3,0,0,2,0,2,0, 0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,0,3,3,3,3,3,3,0,3,3,0,3,0,0,0,3,3,0,3,3,3,0,0,1,2,3,0, 3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,2,0,0,3,2,2,3,3,0,3,3,3,3,3,2,1,3,0,3,2,3,3,2,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,3,0,2,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,3,0,3,2,3,0,0,3,3,3,0, 3,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,0,3,3,3,3,3,3,0,0,3,0,3,0,0,0,3,2,0,3,2,3,0,0,3,2,3,0, 2,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,1,2,2,3,3,3,3,3,3,0,2,3,0,3,0,0,0,3,3,0,3,0,2,0,0,2,3,1,0, 2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,3,0,3,0,3,3,2,3,0,3,3,3,3,3,3,0,3,3,3,0,2,3,0,0,3,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,0,0,3,0,0,0,3,3,0,3,0,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,0,3,3,3,3,3,3,0,0,3,0,2,0,0,0,3,3,0,3,0,3,0,0,2,0,2,0, 0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,3,0,3,0,2,0,3,2,0,3,2,3,2,3,0,0,3,2,3,2,3,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,2,3,3,3,3,3,0,0,0,3,0,2,1,0,0,3,2,2,2,0,3,0,0,2,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,2,0,3,0,3,0,3,3,0,2,1,2,3,3,0,0,3,0,3,0,3,3,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,3,3,3,0,3,3,3,3,3,3,0,2,3,0,3,0,0,0,2,1,0,2,2,3,0,0,2,2,2,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,3,0,0,2,3,3,3,2,3,0,0,1,3,0,2,0,0,0,0,3,0,1,0,2,0,0,1,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,3,1,0,3,0,0,0,3,2,0,3,2,3,3,3,0,0,3,0,3,2,2,2,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,3,3,3,0,0,3,0,0,0,0,2,0,2,3,3,2,2,2,2,3,0,2,0,2,2,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,3,3,3,2,0,0,0,0,0,0,2,3,0,2,0,2,3,2,0,0,3,0,3,0,3,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,3,2,3,3,2,2,3,0,2,0,3,0,0,0,2,0,0,0,0,1,2,0,2,0,2,0, 0,2,0,2,0,2,2,0,0,1,0,2,2,2,0,2,2,2,0,2,2,2,0,0,2,0,0,1,0,0,0,0, 0,2,0,3,3,2,0,0,0,0,0,0,1,3,0,2,0,2,2,2,0,0,2,0,3,0,0,2,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,0,2,3,2,0,2,2,0,2,0,2,2,0,2,0,2,2,2,0,0,0,0,0,0,2,3,0,0,0,2, 0,1,2,0,0,0,0,2,2,0,0,0,2,1,0,2,2,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0, 0,0,2,1,0,2,3,2,2,3,2,3,2,0,0,3,3,3,0,0,3,2,0,0,0,1,1,0,2,0,2,2, 0,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2,2,2,0,0,2,0,0,0,2,0,1,0,0,0,0, 0,3,0,3,3,2,2,0,3,0,0,0,2,2,0,2,2,2,1,2,0,0,1,2,2,0,0,3,0,0,0,2, 0,1,2,0,0,0,1,2,0,0,0,0,0,0,0,2,2,0,1,0,0,2,0,0,0,2,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,3,3,2,2,0,0,0,2,0,2,3,3,0,2,0,0,0,0,0,0,2,2,2,0,2,2,0,2,0,2, 0,2,2,0,0,2,2,2,2,1,0,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0, 0,2,0,3,2,3,0,0,0,3,0,0,2,2,0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,0,2, 0,0,2,2,0,0,2,2,2,0,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,3,2,0,2,2,2,2,2,0,0,0,2,0,0,0,0,2,0,1,0,0,2,0,1,0,0,0, 0,2,2,2,0,2,2,0,1,2,0,2,2,2,0,2,2,2,2,1,2,2,0,0,2,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,2,0,2,0,2,2,0,0,0,0,1,2,1,0,0,2,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,3,2,3,0,0,2,0,0,0,2,2,0,2,0,0,0,1,0,0,2,0,2,0,2,2,0,0,0,0, 0,0,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0, 0,2,2,3,2,2,0,0,0,0,0,0,1,3,0,2,0,2,2,0,0,0,1,0,2,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,0,2,0,3,2,0,2,0,0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,2,0,0,0,0,1,1,0,0,2,1,2,0,2,2,0,1,0,0,1,0,0,0,2,0,0,0,0,0,0, 0,3,0,2,2,2,0,0,2,0,0,0,2,0,0,0,2,3,0,2,0,0,0,0,0,0,2,2,0,0,0,2, 0,1,2,0,0,0,1,2,2,1,0,0,0,2,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,1,2,0,2,2,0,2,0,0,2,0,0,0,0,1,2,1,0,2,1,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,3,1,2,2,0,2,0,0,0,0,2,0,0,0,2,0,0,3,0,0,0,0,2,2,2,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,1,0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,2, 0,2,2,0,0,2,2,2,2,2,0,1,2,0,0,0,2,2,0,1,0,2,0,0,2,2,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,2, 0,1,2,0,0,0,0,2,2,1,0,1,0,1,0,2,2,2,1,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,2,0,1,2,0,0,0,0,0,0,0,0,0,0,2,0,0,2,2,0,0,0,0,1,0,0,0,0,0,0,2, 0,2,2,0,0,0,0,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0, 0,2,2,2,2,0,0,0,3,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,1, 0,0,2,0,0,0,0,1,2,0,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0, 0,2,0,2,2,2,0,0,2,0,0,0,0,0,0,0,2,2,2,0,0,0,2,0,0,0,0,0,0,0,0,2, 0,0,1,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,3,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,0,2, 0,0,2,0,0,0,0,2,2,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,2,0,2,2,1,0,0,0,0,0,0,2,0,0,2,0,2,2,2,0,0,0,0,0,0,2,0,0,0,0,2, 0,0,2,0,0,2,0,2,2,0,0,0,0,2,0,2,0,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0, 0,0,3,0,0,0,2,2,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0, 0,2,2,2,2,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1, 0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,2,0,0,0,2,0,0,0,0,0,1,0,0,0,0,2,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0, 0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,2,0,0,0, 0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, ) Latin7GreekModel = { 'charToOrderMap': Latin7_CharToOrderMap, 'precedenceMatrix': GreekLangModel, 'mTypicalPositiveRatio': 0.982851, 'keepEnglishLetter': False, 'charsetName': "ISO-8859-7" } Win1253GreekModel = { 'charToOrderMap': win1253_CharToOrderMap, 'precedenceMatrix': GreekLangModel, 'mTypicalPositiveRatio': 0.982851, 'keepEnglishLetter': False, 'charsetName': "windows-1253" } # flake8: noqa PK[lXL)site-packages/chardet/mbcsgroupprober.pycnu[ ۝Rc@sddlmZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZd efd YZd S( i(tCharSetGroupProber(t UTF8Prober(t SJISProber(t EUCJPProber(t GB2312Prober(t EUCKRProber(t CP949Prober(t Big5Prober(t EUCTWProbertMBCSGroupProbercBseZdZRS(cCsTtj|tttttttt g|_ |j dS(N( Rt__init__RRRRRRRRt _mProberstreset(tself((s;/usr/lib/python2.7/site-packages/chardet/mbcsgroupprober.pyR *s (t__name__t __module__R (((s;/usr/lib/python2.7/site-packages/chardet/mbcsgroupprober.pyR )sN(tcharsetgroupproberRt utf8proberRt sjisproberRt eucjpproberRt gb2312proberRt euckrproberRt cp949proberRt big5proberRt euctwproberRR (((s;/usr/lib/python2.7/site-packages/chardet/mbcsgroupprober.pytsPK[³  $site-packages/chardet/gb2312freq.pycnu[ ۝Rcp@sdZdZdrZdqS(sg?iiiii< iTii iQii i iii<iw ii9 ii iiiiZ iiiqi i i iW iyiiieioiiv ii i iiii iLiBi iQ iiiiQiiiEiifiiiiiiiidi( iyiii,i i i iE ieii iWiRiii| iR ii i i iX i ijiEii i+iPiiiiiii;iim iiliiii iiieiHiiiii^ iki6ii" iFi i i i i^ i i iiii?i`iui$i1i ii i iUi i1 iiigiliii iiGii2iiq i i iPiiL iiiiiy iii i iMiikii4 iiiiii i i@ i`ii5iiiN ii7i3iiniiuiGi&ibihi0i iM iNii i iY i ii i iii i&i iQi i7i^ihiiiJ iiPiiiiriiiiiiiT i-iGi,iui i ii$iii<iBii$i>iiix iLiWiiini iiTiiZii i i{ iii i iii i?i i0ibi;iDiiiiiCiSiiUi> i|igi ii i iKii iiii% i5 iiiiil iihi iii?ii i iUiiii ii*i< i i ii ii iii ii i! iX iii iiQ igiiii iiri ii iqii iiz ii i3ii iii i i]iciziii7 ii_ii iCii&iaiHi| ili ii=iiiIiPi ii~ i8i`i iw i i iTii i iiii iiiiii[iq iii igii|iCi ii iN iIiii5 i i(ii/iHiK i iiiii9iiIiii|iiii ii iWii iii^i~iiii i i= iXii3i iIiii iiiii3iriiiioi ii i{iiiiCii!iHi iiiifii= ii1i[i i| iDii%iitii i ii ii.iiiiyiiTiii9 i i i#iiiJiiniiii ii>iBi"iiiai iiMiKii iW i i i i! ir iFi+ i i i iix iHiJiiiii2iKiiR i$ii9i it ii ii iiiiiiiiii%i~i i` iiiii'iviii ii|ii'i iin i*ii iiFii%ii)i~ii iiiJi&ii i!iD iiwii[i ii i i i' i iikiii i i iiiiiiiih iBi_i i?iigihii'iiiiiiiiiiiii5i] ii iiiiiiii1 ii)ia iiiii; iii_iiiQi/iu i i iji[ii}ii iii iiiiQi^ i iGiizi iiiViOii ii ii imiui i6ii i-i$i iiRii} i ipir i] i iDi iiiiiiiiiiii1iniiiitiYiG i i i/ i|iti0i iiiii\i i iivii iiciiii i~iAi"ii" i!i8iCi8 ii iji i1iili>i ii] i i i~iiLi(iiiKidiiviDiiii%i iii i, ii2ii iiij i-i.i imiKi iiioi i;i ii idi@iai iM i1 iLi@i2 iiwiitiQi i/ii ii~iiiii i/ii i_ i#i iOiiOiGiiiki[iOioiii- i iii i!i i iIiiii{iri i.ihi i iT iiii'iL iaii i@iii iii iT i/ iiiii iiMiii il iii i{i8i#i iii9iiSiRi iwiiZii0 iEigig ii i iiLiiipiiiSi iiiii i@iiI iLi; iOiqiii) i i:iFii5iJidiA ii i) iEiLiYiiii im i ii i iiic iiRii!iiii ii(iii]iIii i iieiiii iiii`ii iii ii[iiC i(iPi,i i}iO i' iLi\ i i i iiiiZiiisi'i iUiiiiiN iiii i iiMiiiiii iiiiiigi'iii ii iiPi0 is iiiip i iniiii i\i iii i!ihiiimi(i& i iCiiBi)i5 iiiiiii iii>iiiii i ii{iNiiiiEi3iiJi#iicii ii$ ii5iixi i]iiikii iiiiP ii iiiriiL i izidiii#i iii[ iSiihiiGiiiii iUi+i iyiiwi"iiVi2 i&izi i iiJ iP i iiiii% iZi$ io iT iKi1 i ii`iVi ii id ii iii+i iiAii iiii$ii i_i3i\ iiiiiibi ifiiiii iAiniiixiiFi iOi[iii(i ii i#i7i2 ixiif i i i!i6i{ iiiYiiii+iiiii iiii i iKiei i i iTi$iiiih ii iRiii"i iiZi i_ ii@iiai iii3 i iki)ijiii ieii iA i^ii iW iiihi: iz i) ii| iii ii i8 ijii iii3i i iziipiyi i i2 ioiD i=ii.ii9 iaifii*i_ii i*ii i i ii i- ii i}ii i ii* i itiiti6 iqiiiiiii iSi iii!i)iiyi iii ij ii iiViIiiig iiiLii iipiDii i ii%ii iM iiii$i i iiE i"iU iie i i|i iQiii ii ii i1 iiiii$i i]i4i&iiiziii`iiwi iiii i)i% i&iiii*iii8i2i> iSi iii1i#i ii ii#i i iiii iF iii, i> i+i i iiZ i3iqii i$ii iVi i;iiiNiimiKiWiiii5i i iRi4i iIiiDiiii i i i iiii%iKi|iii iiiii9iin iii i-i3 i2 ipiii? ii~iiiiiiCii[ii iii i3 i> iili i`ix iiii i# iiii0iiii iL i iiQiiRii?i(imii` ii3iiii& i ii isiDii0 ib ifi@ i iii ii=i i i<iiii ii6iiis iii iSiii i8iZ iii ii iii i ii iiiiNi i i iLi iJ iii ibiig iii[ iiiiii~ ii i iiifiiiii i i` i4i= iiiili? iici ii iiii iiiiiiiiwiii i%ii id i^i+iii iZiiF iI iit ii i/i iiiyi* isi&i+iii) iii iii i i ie iiiQi] ii i_i7 ii0iciuiiiLiki iiiii#iiiiiiii?iiii ini i iii iii iHiiYiiu ii i iiJii_ i_i&iiii iiiZi%ii isiiSii i iViiiiii1i'iiiFi\i i|i iWiii|iiSiWi i* i iRiliPi#i i i-iq iii i ii4iiiiiia iiiii@ i iXiii%iii8 i3i,ii} iiiidixi ii# ii6i i i.iiiAi iir i i iR idiii+ iiii i{i{iHi i iiiiiici i i iii,iiI iici ii iii=i iJi. i,i>iiiiLiei]ii iC iiii*i; i ii iipi iiiRii9 i i ii iii?i:i i i iQi'isiiwi[i ii-i i)iiiMiiiii]i}i6i@i iiUiiii/iiis i iiik i? ii, i= i1iMi iii/iS id iiio i6 ikiui iiiWi{iixiWii iiiix i^ iii[ i+ i7i:iiU iii!iii i.iHiTiiYiii ii@i"iCisi i i iG ibii7i~i. iUi iqi iiii{iiiiYi/i iiiAi ii*i:i8i'i i ii iiA i_i0iiiiiiiiKi i iit i* iii iiii i i iiiDiiii>iiivii i i'iiViii iiikii i\iiiii!i ii*iU iiiiiizii\if iii i iiii iiii i iiB iii iii{ii=i ii&i iiV i ii"i! i i iii i( i=ii i ii9i ii4iaiii-iQ ii ii imiiiiiCiii7i}iqiDi4iiuii iiiv iiiF iiu ia iiH ioi i iliKiA iii izi4 i i! iH ii ii5 iijii`ii iB i:iOiai i#iiiidiii(i i& ii^imig iE iio ii(iG i$i@i iIiiiAi ii`iXii7ii/ii$ii iihiiii iUi"iTiiiiimiii!iiiiii iiMi iiii i2iqiii9iii iiiii/iiii ipi@iX iijiii i^ ibi i iniiviiiioioiiiviii0ii9ii$ iifiS izi iiDi{iiXiii iVi3 iYi ii iAiiiiiiqiU i i: ii2iji ii i{ ii iFi i i ii iiiiciiiR i;ik ihii i iiY iOixiiziZi<iv ii i i iiIiii4 iMiiiiib iiii ii iiCii iiiO ii8iii i.i]i iVic i iii iH iiTiii ii> i ii i3iiii,iiifiiiiliTiWiHi.i'i>ipiiii"ii iJii i ivi2iii ixi i2iigi i4iii i iii{ iz i i i iii iiiiii?iiii iJiiii i i8iiiE ij i\ii8i8 ii iiii`ii>ibiSiiii i iii0i iiiEi iidiiii1iiiini@ii iiTii iiiQiiCii iK i;ikiiiiii_i\ ieiiwiiiiiMii. iriaiii i ii iiiigii i' i iii i iTiii4ioii iXiyiixii i i iU i^i: iiii ii"i#iii ii iiiiNiUiiip ii" i-i i iii:ii ii iiii iiiW i iG iLii iGiw ioiii iMir iii iiQ iiI iNi%i iXiii i7 i iaii iii i' iiihi i}iNiyi?itii iD iiiii iliiii iiie iJisi2i*iyiiiiii iiqi ii5i}is i$iiii5 iBiiii# idisi} ii~iiib iiO i/ i]iii i]i2iiifi7iiiOi iRii# i i[iiEii if iS i idiFiiiiC iV i>ii iiBii i i1i6imiii iiiiip i ii i i<izi i| iXiiiisie i]iiii i iiOi i+i iiiiii:i iAii ii ii( i imii4iP ii inii ioioiiimiiyiii8i ii<iii<ic iC iii&iwi i i$i i9i&ii i)i`iiiiiiGibiEii:iQio iF i iii i iFi|i;i iii3i4 i%ii:i iciipi6 i\iCii0i9 ii iiii~ iii"ih iiii i)ii i iii* ii i i i%ii iiii i.iii9i iii iii ii"i! ii, i ig iJ igiF iiii ii;ii iZiEi^iA iiili5ii ii4i' iiiki ii i2ii ii iXi7iii i{iiBixi=iei(ii iii'iiiiiiiiiii iD iiikii iii-i, i iei7 i iii iiiini} ip i7ijii ii9ii iiiii0iPi iiiiiiO i i i iiUi iii< iii iJiitiNii)i i.iii*i iAiir i] i)iiiiiGii_ ipik iii i% i ii ii>ibi_i^i?ii:iYiDi%iii iiiiiiYii i iiiiil iAii i i iDiBi i ii i@ i(iv iiiigi i i}iviiii iiiii iiiiiiii i-i~iiy i%i i i_i iiiiiijiMi iiGi+i iiii iiii3 i;i iGi)ii iii i ii ii i ii,iIi iii iXiAi\iiiiP ivii iVii=i i i6 i<iiX i i i ii8 i- iY iiiii iiiciiii9i i- iuii ii iR i i ii6ii iih i}i i? iw i ii ia i( i ii1ii ii>iii i ii]i iXiriPi0 i,ii+ ijii`iiiii. iii ii& iWiB iii|i7 iUii iiWiiYii iiw i iii iiiiiuiibiiq iiibiii ii=i$ iiNiJiiiUiiii iiiiiKi,iii4iri{i iiHiipi5iii=i i iEi9ii;i i<ii5i iii ii\iiiipiiiiiriiNiii^iiiiiK ii i*ii{ i+ i ii*i8iiii iiii ij ii@il i6ii2i8ii iiii'iiiiB iiii\iiiS iV ii~iiiii i iiVi iz i i^i i iii_ i} iG iqiiI i iii8itihiS ii}iRi i9iiSin iPiiB iiiisiiXi}ifiiii iiiiiiin iIi^iiTiixiiriii_iibiiOiPiQiRiSiiTi<iV iiYii iiii1iUiL iVi4ii iiUiEiiMi3if iiiiiiFiiiiiBiGiiiiii iiiiii i i?i iiVi&iHiWiWiXiiii@iisi:iiXiYiZiitii. iKi[iiiriiYiiii'ii(i4iiiiiii iii5iiiii iiZiBiIi i&iii i?ii0ii[i iiai iY iiiii\iiiLi@iiiiWi iiii}iiiMi]ii1iiiiJi^i;iiKitii iiiiu iiii_ii`iTiisii iaiiiii iNi\ibiiAicitiiiiiiii iiiaiUi ii iiiriiBiOiiiiiziiiiDiiiiiidiCii iiiiiiiiiiiDi4 i i]iiiijiiiiieiLiiiiifii^igiuiCi~ ihiiibii2iii iiiii(iiiNiiiMiXiiZijiiiii5i_iiiiuiiii iiiiii<i=iMii ikiiiei:i`iEiviiliiiii` iiii)iminiNiFiii i;iioi)i iV iaiici iGiiioi iisiipiOiiiiqiwi~iriiibii*iiiViiPiiiiiHiciifiiii(iiIisiitiuiidiQieiWi iiiiiii ikii+iii iiN iiviiiiJi i i9iiiiRiSiifii igiipiiiiwiiiAiKiihiZ iiiiiibixii iiiiijiyii<iiii!ii+is iiiiiijiliiii,iiRiizi{iiTiCiDici iii ikiiiim i: i iDi ii+iLi|ii-iEiiiiiitiliiMiNii iiiiii iUiiiOii}i*i~iiBiiPii[ iuiQiiiiiiii ii5iOiliRii=iiiVi5iiiiiiiSiiTiiXiiYiiiimiiiPiiinii iiiEiiUiiiqiiiv iWiimioiiiiiipigi" i.iiiiqi i ii&iiPiriiie iiiiiiii'i,isitiiidiiiiiiiYiiii i+iiiQiiiiiuii iiiiXiieiii3iiiiFii iiiiriiiii i iui iVi i(ii iiiYiwiiiiiiiZio ini6ii iviii.iiiiiifiiiiiiiiiiiiiJi=iiwiixiiiiiiiiciiiifiiiGiiiiiiiiiioiZii[ipiii iiiiiPiii[idi4iiiii5iiii6iiiiii7iii i!iiiiHi8iii-iiiiiiigihiiii\iiiiiqiiii,iihiii i]iii ixiiyiii[iii i iii iWiii iN ii6iii)i|iRiit iii>ii iiZiiiijiif i^iiiiiiii>i/iii*i ii iiiiivii i-iiyiCi]i i iEiDiiXiki iiii< iZii iiFii iii ii iii iiiiiiiii i iiziiiiYii!i{iiiiiAiZiiiSiiiii% i_iii iii|i[ii\i}iiiX iiIiiii0iii?iRii1iii@ii]i~izikiiTiC i2ii6ii^iiii iiieiiiii iirixiiiii_i!iiii`i`i iii iiiFi ii ii iiiiiiii[iiiiiii^iiii iii ifiiih i_ik iii+i"ii#ihiii~ iiiiiiiiJi$iiii%iii&i'iQiiiii'iiiici i\iidi}i\ii.iiiKi ii i i iiiiiiit i iib iiisiiiiiniiiiiii iiiiii"iii iGiNiUi iiiJ iivi i ii#i]iViiiii iiiiiiiiii/ ivij i/iiiii+i iiiii ii3iiEii iiiiii i iiai,ii.iii iwii i\iAiiiBiiii( iivii iti/iii$iHiiiSiiiiiiii)ii iiiiii iii# iiiiiiiibiiiiiiiii]iOi iiaii%iiiii i(ii iiiiiiiiiiii^iiiD iiiiu iiiicidi iiiLiii4i:ii iiiiiiiiii iic iW iRiiii? iiiii iH i?iii= iiiiiii iiii iViiiiiii iiiiiiii/i)iiEibiixi iliiiieiiiWiiii*iciiH i9iiiiiii iiiiiiyidi,imiieiiiiiji iiiii`ii+iifiiiiii iiiigiiiiniii!i6 iIiii i ii: i"iiiiifiiiiiaiiiigiiiqi iiiNiiCii0iii0ii-i i ii ii iM i~ii$iiiaiii iiiT ihiib i ii i#ic i i i& ii"i iiiii/ iiiM iii:i-i$iFiiiuiiiFiviiKii iiii:iii%il iiiiiiiioiiiiXiii) iii&i'ii i{iiiiii iiiipi iiiii,iiiii5iiiiO iYiiji i ii iiki6i-iMi< ii iiiii@iihi@ iix ii(iiiiy iii iiiiiii" i.ii/i0i.iiiiiiliim i7iiigiNiiiOii1iii i)i iiiiiii!i iqiii*iPiiii iPii\ iiriiiiiiiiiQiiiwiz iiGii"iiiiiii iiii iiiiii+isitii%iziiiiE iy i#iiiijiiiiiJia iiiii ikii.i$i` iii%iiiDiiiiiiiliiGiiiKiiiZiii,i1iii6iiiiimiiii&iii'iisiniiiEiiii(i[ii/iiiiiiiiilioii8iii ii iiiitii>iipiiwiiOiiii7iiii)iii-ii.i ii i iiii iiiiWiii2iii!i/ikim iiiiq i3ii*i+i i0iiiiiqiiSii&iiirixii i1i iimi,i4iXiisiii ii-iiii"ii; iiii*i\ii2i8iRiyiii3iiiniii iiiiii4ii iiiuiiii;ii iiei iiii5iin i ii id iiiy i.iiiiiiioiiii6i7iiiiK i;iiiiQ ii(i iiiitiii iii;iiFiHi/iiiiiiiiviiiSi8iTi9iiiiiii/i]i:ii"iuiii i0i9i#i i i i<ii i ii;iiiiiiiiUi$ii iiii<i1iiQi%i[ iii=i[ii ii7iiii>ii2iiiYiii+iipi?iii:i i ii@i^iiiqiiAi iiiVi5iii ii iLi2ii3ii iii iriii iii3i iiiiiiii4iwi iiiiii4i6iBiiii|iSiiiiP i&ii i ixivii iiii'iii?i0iiii iiiiCi i5i iiiwii=ii6iii7ii i>i0iiiii iii!i8isiip iiiiiiiii(i iiii"ii#ii)iii$iiiDiii*iii%iii+iiiiifiiEiixiiiiiii_iik iiiiFi iili7i`iMiGiyi&iiHi'ii9iii:i;iAixii;iiIigii<iJiii(iiiKii^iLiMii,i8iiiiiyizii5i<iizii}ii_i)iNi?i=iiai<iOii ii*iiiFiWi<iii>iiiiiiiPii ii+ii{iii ii ii,iii iiIii!iei"i-i ii iiQi9i#iRiii|iiSii.imii$i/iiiiii i%iiiTiiiiiUiiViii,i?iimi@iii6i-iWiiXi.i&i`i:i/i0iAiHi1i0i\ i2izi7iii}iiBi@ii i1i iiiiCi'ibi3ii(i iAii)i2i4i;iti~i3i iiBiiiNiuiiYiii*iZiiaii{iXii[i+icii ii\ii; i,i-iTiUiiiviii5i i6iiDi i]i{iii7ii iyiii8iibi.iii9i:i|i<i/i~ii;iiihii0ii1i2i iii3i4iimi<i^i i{ii_iiiiEiFii`i5iiiaiiiZi|iYiiii i iwi=ibiGiii4ii iiiIiiiiiZi=i>i>iici iiidiiiiixi5iii?i6iHiiIi@i1i_i iiJiiAi7iiKiiieifigii=i ii0 iihi@iBii8i[i9iCini:iDiiiii i;ijiiiyi}i<iziEikiliii{i ii=i>iii|iLii2i?iJiiiimiii|iMini}i}i@iiFiiii~iBi>iiidi- iiioipiiiiiciGiidiiiqiii\ieiGiOiAiHiBi6ii i=i iiNiiIiOiii7i~iJiKiiiCi~iriLiiiiMioi8i?iiiiiNiiisii=iiitiiCiii@iuiiK i iii9iiiOiiPiiiQii iiiiii iriY iiiivii?iiRiwiSiTii`iUiDiVixiiEiiPiWiiXii!iYiiii$ ii\ii1iiiiiii"iQiZiii7iiiiAiyiii iiid ii[iiiBiziii\i i iiiiiiVii{iifi]i|i^i}iiiBiiiii:i_iii;iiii`i<ipiiFiiPiiai ibiGi i-ici]iidi iiigiHiiIii ieiiiuiiiiiqiJifiigijiKi~ihiii^iii#iiiiiiiiiHiLiiijiiRiiSiiiiMii i!iTiiiiikiwiiiiniiiili#i>iiiZ iiHiii#iiiiNimiiiiiiiniioN(piiii< iTii iQii i iii<iw ii9 ii iiiiZ iiiqi i i iW iyiiieioiiv ii i iiii iLiBi iQ iiiiQiiiEiifiiiiiiiidi( iyiii,i i i iE ieii iWiRiii| iR ii i i iX i ijiEii i+iPiiiiiii;iim iiliiii iiieiHiiiii^ iki6ii" iFi i i i i^ i i iiii?i`iui$i1i ii i iUi i1 iiigiliii iiGii2iiq i i iPiiL iiiiiy iii i iMiikii4 iiiiii i i@ i`ii5iiiN ii7i3iiniiuiGi&ibihi0i iM iNii i iY i ii i iii i&i iQi i7i^ihiiiJ iiPiiiiriiiiiiiT i-iGi,iui i ii$iii<iBii$i>iiix iLiWiiini iiTiiZii i i{ iii i iii i?i i0ibi;iDiiiiiCiSiiUi> i|igi ii i iKii iiii% i5 iiiiil iihi iii?ii i iUiiii ii*i< i i ii ii iii ii i! iX iii iiQ igiiii iiri ii iqii iiz ii i3ii iii i i]iciziii7 ii_ii iCii&iaiHi| ili ii=iiiIiPi ii~ i8i`i iw i i iTii i iiii iiiiii[iq iii igii|iCi ii iN iIiii5 i i(ii/iHiK i iiiii9iiIiii|iiii ii iWii iii^i~iiii i i= iXii3i iIiii iiiii3iriiiioi ii i{iiiiCii!iHi iiiifii= ii1i[i i| iDii%iitii i ii ii.iiiiyiiTiii9 i i i#iiiJiiniiii ii>iBi"iiiai iiMiKii iW i i i i! ir iFi+ i i i iix iHiJiiiii2iKiiR i$ii9i it ii ii iiiiiiiiii%i~i i` iiiii'iviii ii|ii'i iin i*ii iiFii%ii)i~ii iiiJi&ii i!iD iiwii[i ii i i i' i iikiii i i iiiiiiiih iBi_i i?iigihii'iiiiiiiiiiiii5i] ii iiiiiiii1 ii)ia iiiii; iii_iiiQi/iu i i iji[ii}ii iii iiiiQi^ i iGiizi iiiViOii ii ii imiui i6ii i-i$i iiRii} i ipir i] i iDi iiiiiiiiiiii1iniiiitiYiG i i i/ i|iti0i iiiii\i i iivii iiciiii i~iAi"ii" i!i8iCi8 ii iji i1iili>i ii] i i i~iiLi(iiiKidiiviDiiii%i iii i, ii2ii iiij i-i.i imiKi iiioi i;i ii idi@iai iM i1 iLi@i2 iiwiitiQi i/ii ii~iiiii i/ii i_ i#i iOiiOiGiiiki[iOioiii- i iii i!i i iIiiii{iri i.ihi i iT iiii'iL iaii i@iii iii iT i/ iiiii iiMiii il iii i{i8i#i iii9iiSiRi iwiiZii0 iEigig ii i iiLiiipiiiSi iiiii i@iiI iLi; iOiqiii) i i:iFii5iJidiA ii i) iEiLiYiiii im i ii i iiic iiRii!iiii ii(iii]iIii i iieiiii iiii`ii iii ii[iiC i(iPi,i i}iO i' iLi\ i i i iiiiZiiisi'i iUiiiiiN iiii i iiMiiiiii iiiiiigi'iii ii iiPi0 is iiiip i iniiii i\i iii i!ihiiimi(i& i iCiiBi)i5 iiiiiii iii>iiiii i ii{iNiiiiEi3iiJi#iicii ii$ ii5iixi i]iiikii iiiiP ii iiiriiL i izidiii#i iii[ iSiihiiGiiiii iUi+i iyiiwi"iiVi2 i&izi i iiJ iP i iiiii% iZi$ io iT iKi1 i ii`iVi ii id ii iii+i iiAii iiii$ii i_i3i\ iiiiiibi ifiiiii iAiniiixiiFi iOi[iii(i ii i#i7i2 ixiif i i i!i6i{ iiiYiiii+iiiii iiii i iKiei i i iTi$iiiih ii iRiii"i iiZi i_ ii@iiai iii3 i iki)ijiii ieii iA i^ii iW iiihi: iz i) ii| iii ii i8 ijii iii3i i iziipiyi i i2 ioiD i=ii.ii9 iaifii*i_ii i*ii i i ii i- ii i}ii i ii* i itiiti6 iqiiiiiii iSi iii!i)iiyi iii ij ii iiViIiiig iiiLii iipiDii i ii%ii iM iiii$i i iiE i"iU iie i i|i iQiii ii ii i1 iiiii$i i]i4i&iiiziii`iiwi iiii i)i% i&iiii*iii8i2i> iSi iii1i#i ii ii#i i iiii iF iii, i> i+i i iiZ i3iqii i$ii iVi i;iiiNiimiKiWiiii5i i iRi4i iIiiDiiii i i i iiii%iKi|iii iiiii9iin iii i-i3 i2 ipiii? ii~iiiiiiCii[ii iii i3 i> iili i`ix iiii i# iiii0iiii iL i iiQiiRii?i(imii` ii3iiii& i ii isiDii0 ib ifi@ i iii ii=i i i<iiii ii6iiis iii iSiii i8iZ iii ii iii i ii iiiiNi i i iLi iJ iii ibiig iii[ iiiiii~ ii i iiifiiiii i i` i4i= iiiili? iici ii iiii iiiiiiiiwiii i%ii id i^i+iii iZiiF iI iit ii i/i iiiyi* isi&i+iii) iii iii i i ie iiiQi] ii i_i7 ii0iciuiiiLiki iiiii#iiiiiiii?iiii ini i iii iii iHiiYiiu ii i iiJii_ i_i&iiii iiiZi%ii isiiSii i iViiiiii1i'iiiFi\i i|i iWiii|iiSiWi i* i iRiliPi#i i i-iq iii i ii4iiiiiia iiiii@ i iXiii%iii8 i3i,ii} iiiidixi ii# ii6i i i.iiiAi iir i i iR idiii+ iiii i{i{iHi i iiiiiici i i iii,iiI iici ii iii=i iJi. i,i>iiiiLiei]ii iC iiii*i; i ii iipi iiiRii9 i i ii iii?i:i i i iQi'isiiwi[i ii-i i)iiiMiiiii]i}i6i@i iiUiiii/iiis i iiik i? ii, i= i1iMi iii/iS id iiio i6 ikiui iiiWi{iixiWii iiiix i^ iii[ i+ i7i:iiU iii!iii i.iHiTiiYiii ii@i"iCisi i i iG ibii7i~i. iUi iqi iiii{iiiiYi/i iiiAi ii*i:i8i'i i ii iiA i_i0iiiiiiiiKi i iit i* iii iiii i i iiiDiiii>iiivii i i'iiViii iiikii i\iiiii!i ii*iU iiiiiizii\if iii i iiii iiii i iiB iii iii{ii=i ii&i iiV i ii"i! i i iii i( i=ii i ii9i ii4iaiii-iQ ii ii imiiiiiCiii7i}iqiDi4iiuii iiiv iiiF iiu ia iiH ioi i iliKiA iii izi4 i i! iH ii ii5 iijii`ii iB i:iOiai i#iiiidiii(i i& ii^imig iE iio ii(iG i$i@i iIiiiAi ii`iXii7ii/ii$ii iihiiii iUi"iTiiiiimiii!iiiiii iiMi iiii i2iqiii9iii iiiii/iiii ipi@iX iijiii i^ ibi i iniiviiiioioiiiviii0ii9ii$ iifiS izi iiDi{iiXiii iVi3 iYi ii iAiiiiiiqiU i i: ii2iji ii i{ ii iFi i i ii iiiiciiiR i;ik ihii i iiY iOixiiziZi<iv ii i i iiIiii4 iMiiiiib iiii ii iiCii iiiO ii8iii i.i]i iVic i iii iH iiTiii ii> i ii i3iiii,iiifiiiiliTiWiHi.i'i>ipiiii"ii iJii i ivi2iii ixi i2iigi i4iii i iii{ iz i i i iii iiiiii?iiii iJiiii i i8iiiE ij i\ii8i8 ii iiii`ii>ibiSiiii i iii0i iiiEi iidiiii1iiiini@ii iiTii iiiQiiCii iK i;ikiiiiii_i\ ieiiwiiiiiMii. iriaiii i ii iiiigii i' i iii i iTiii4ioii iXiyiixii i i iU i^i: iiii ii"i#iii ii iiiiNiUiiip ii" i-i i iii:ii ii iiii iiiW i iG iLii iGiw ioiii iMir iii iiQ iiI iNi%i iXiii i7 i iaii iii i' iiihi i}iNiyi?itii iD iiiii iliiii iiie iJisi2i*iyiiiiii iiqi ii5i}is i$iiii5 iBiiii# idisi} ii~iiib iiO i/ i]iii i]i2iiifi7iiiOi iRii# i i[iiEii if iS i idiFiiiiC iV i>ii iiBii i i1i6imiii iiiiip i ii i i<izi i| iXiiiisie i]iiii i iiOi i+i iiiiii:i iAii ii ii( i imii4iP ii inii ioioiiimiiyiii8i ii<iii<ic iC iii&iwi i i$i i9i&ii i)i`iiiiiiGibiEii:iQio iF i iii i iFi|i;i iii3i4 i%ii:i iciipi6 i\iCii0i9 ii iiii~ iii"ih iiii i)ii i iii* ii i i i%ii iiii i.iii9i iii iii ii"i! ii, i ig iJ igiF iiii ii;ii iZiEi^iA iiili5ii ii4i' iiiki ii i2ii ii iXi7iii i{iiBixi=iei(ii iii'iiiiiiiiiii iD iiikii iii-i, i iei7 i iii iiiini} ip i7ijii ii9ii iiiii0iPi iiiiiiO i i i iiUi iii< iii iJiitiNii)i i.iii*i iAiir i] i)iiiiiGii_ ipik iii i% i ii ii>ibi_i^i?ii:iYiDi%iii iiiiiiYii i iiiiil iAii i i iDiBi i ii i@ i(iv iiiigi i i}iviiii iiiii iiiiiiii i-i~iiy i%i i i_i iiiiiijiMi iiGi+i iiii iiii3 i;i iGi)ii iii i ii ii i ii,iIi iii iXiAi\iiiiP ivii iVii=i i i6 i<iiX i i i ii8 i- iY iiiii iiiciiii9i i- iuii ii iR i i ii6ii iih i}i i? iw i ii ia i( i ii1ii ii>iii i ii]i iXiriPi0 i,ii+ ijii`iiiii. iii ii& iWiB iii|i7 iUii iiWiiYii iiw i iii iiiiiuiibiiq iiibiii ii=i$ iiNiJiiiUiiii iiiiiKi,iii4iri{i iiHiipi5iii=i i iEi9ii;i i<ii5i iii ii\iiiipiiiiiriiNiii^iiiiiK ii i*ii{ i+ i ii*i8iiii iiii ij ii@il i6ii2i8ii iiii'iiiiB iiii\iiiS iV ii~iiiii i iiVi iz i i^i i iii_ i} iG iqiiI i iii8itihiS ii}iRi i9iiSin iPiiB iiiisiiXi}ifiiii iiiiiiin iIi^iiTiixiiriii_iibiiOiPiQiRiSiiTi<iV iiYii iiii1iUiL iVi4ii iiUiEiiMi3if iiiiiiFiiiiiBiGiiiiii iiiiii i i?i iiVi&iHiWiWiXiiii@iisi:iiXiYiZiitii. iKi[iiiriiYiiii'ii(i4iiiiiii iii5iiiii iiZiBiIi i&iii i?ii0ii[i iiai iY iiiii\iiiLi@iiiiWi iiii}iiiMi]ii1iiiiJi^i;iiKitii iiiiu iiii_ii`iTiisii iaiiiii iNi\ibiiAicitiiiiiiii iiiaiUi ii iiiriiBiOiiiiiziiiiDiiiiiidiCii iiiiiiiiiiiDi4 i i]iiiijiiiiieiLiiiiifii^igiuiCi~ ihiiibii2iii iiiii(iiiNiiiMiXiiZijiiiii5i_iiiiuiiii iiiiii<i=iMii ikiiiei:i`iEiviiliiiii` iiii)iminiNiFiii i;iioi)i iV iaiici iGiiioi iisiipiOiiiiqiwi~iriiibii*iiiViiPiiiiiHiciifiiii(iiIisiitiuiidiQieiWi iiiiiii ikii+iii iiN iiviiiiJi i i9iiiiRiSiifii igiipiiiiwiiiAiKiihiZ iiiiiibixii iiiiijiyii<iiii!ii+is iiiiiijiliiii,iiRiizi{iiTiCiDici iii ikiiiim i: i iDi ii+iLi|ii-iEiiiiiitiliiMiNii iiiiii iUiiiOii}i*i~iiBiiPii[ iuiQiiiiiiii ii5iOiliRii=iiiVi5iiiiiiiSiiTiiXiiYiiiimiiiPiiinii iiiEiiUiiiqiiiv iWiimioiiiiiipigi" i.iiiiqi i ii&iiPiriiie iiiiiiii'i,isitiiidiiiiiiiYiiii i+iiiQiiiiiuii iiiiXiieiii3iiiiFii iiiiriiiii i iui iVi i(ii iiiYiwiiiiiiiZio ini6ii iviii.iiiiiifiiiiiiiiiiiiiJi=iiwiixiiiiiiiiciiiifiiiGiiiiiiiiiioiZii[ipiii iiiiiPiii[idi4iiiii5iiii6iiiiii7iii i!iiiiHi8iii-iiiiiiigihiiii\iiiiiqiiii,iihiii i]iii ixiiyiii[iii i iii iWiii iN ii6iii)i|iRiit iii>ii iiZiiiijiif i^iiiiiiii>i/iii*i ii iiiiivii i-iiyiCi]i i iEiDiiXiki iiii< iZii iiFii iii ii iii iiiiiiiii i iiziiiiYii!i{iiiiiAiZiiiSiiiii% i_iii iii|i[ii\i}iiiX iiIiiii0iii?iRii1iii@ii]i~izikiiTiC i2ii6ii^iiii iiieiiiii iirixiiiii_i!iiii`i`i iii iiiFi ii ii iiiiiiii[iiiiiii^iiii iii ifiiih i_ik iii+i"ii#ihiii~ iiiiiiiiJi$iiii%iii&i'iQiiiii'iiiici i\iidi}i\ii.iiiKi ii i i iiiiiiit i iib iiisiiiiiniiiiiii iiiiii"iii iGiNiUi iiiJ iivi i ii#i]iViiiii iiiiiiiiii/ ivij i/iiiii+i iiiii ii3iiEii iiiiii i iiai,ii.iii iwii i\iAiiiBiiii( iivii iti/iii$iHiiiSiiiiiiii)ii iiiiii iii# iiiiiiiibiiiiiiiii]iOi iiiaii%iiiii i(ii iiiiiiiiiiii^iiiD iiiiu iiiicidi iiiLiii4i:ii iiiiiiiiii iic iW iRiiii? iiiii iH i?iii= iiiiiii iiii iViiiiiii iiiiiiii/i)iiEibiixi iliiiieiiiWiiii*iciiH i9iiiiiii iiiiiiyidi,imiieiiiiiji iiiii`ii+iifiiiiii iiiigiiiiniii!i6 iIiii i ii: i"iiiiifiiiiiaiiiigiiiqi iiiNiiCii0iii0ii-i i ii ii iM i~ii$iiiaiii iiiT ihiib i ii i#ic i i i& ii"i iiiii/ iiiM iii:i-i$iFiiiuiiiFiviiKii iiii:iii%il iiiiiiiioiiiiXiii) iii&i'ii i{iiiiii iiiipi iiiii,iiiii5iiiiO iYiiji i ii iiki6i-iMi< ii iiiii@iihi@ iix ii(iiiiy iii iiiiiii" i.ii/i0i.iiiiiiliim i7iiigiNiiiOii1iii i)i iiiiiii!i iqiii*iPiiii iPii\ iiriiiiiiiiiQiiiwiz iiGii"iiiiiii iiii iiiiii+isitii%iziiiiE iy i#iiiijiiiiiJia iiiii ikii.i$i` iii%iiiDiiiiiiiliiGiiiKiiiZiii,i1iii6iiiiimiiii&iii'iisiniiiEiiii(i[ii/iiiiiiiiilioii8iii ii iiiitii>iipiiwiiOiiii7iiii)iii-ii.i ii i iiii iiiiWiii2iii!i/ikim iiiiq i3ii*i+i i0iiiiiqiiSii&iiirixii i1i iimi,i4iXiisiii ii-iiii"ii; iiii*i\ii2i8iRiyiii3iiiniii iiiiii4ii iiiuiiii;ii iiei iiii5iin i ii id iiiy i.iiiiiiioiiii6i7iiiiK i;iiiiQ ii(i iiiitiii iii;iiFiHi/iiiiiiiiviiiSi8iTi9iiiiiii/i]i:ii"iuiii i0i9i#i i i i<ii i ii;iiiiiiiiUi$ii iiii<i1iiQi%i[ iii=i[ii ii7iiii>ii2iiiYiii+iipi?iii:i i ii@i^iiiqiiAi iiiVi5iii ii iLi2ii3ii iii iriii iii3i iiiiiiii4iwi iiiiii4i6iBiiii|iSiiiiP i&ii i ixivii iiii'iii?i0iiii iiiiCi i5i iiiwii=ii6iii7ii i>i0iiiii iii!i8isiip iiiiiiiii(i iiii"ii#ii)iii$iiiDiii*iii%iii+iiiiifiiEiixiiiiiii_iik iiiiFi iili7i`iMiGiyi&iiHi'ii9iii:i;iAixii;iiIigii<iJiii(iiiKii^iLiMii,i8iiiiiyizii5i<iizii}ii_i)iNi?i=iiai<iOii ii*iiiFiWi<iii>iiiiiiiPii ii+ii{iii ii ii,iii iiIii!iei"i-i ii iiQi9i#iRiii|iiSii.imii$i/iiiiii i%iiiTiiiiiUiiViii,i?iimi@iii6i-iWiiXi.i&i`i:i/i0iAiHi1i0i\ i2izi7iii}iiBi@ii i1i iiiiCi'ibi3ii(i iAii)i2i4i;iti~i3i iiBiiiNiuiiYiii*iZiiaii{iXii[i+icii ii\ii; i,i-iTiUiiiviii5i i6iiDi i]i{iii7ii iyiii8iibi.iii9i:i|i<i/i~ii;iiihii0ii1i2i iii3i4iimi<i^i i{ii_iiiiEiFii`i5iiiaiiiZi|iYiiii i iwi=ibiGiii4ii iiiIiiiiiZi=i>i>iici iiidiiiiixi5iii?i6iHiiIi@i1i_i iiJiiAi7iiKiiieifigii=i ii0 iihi@iBii8i[i9iCini:iDiiiii i;ijiiiyi}i<iziEikiliii{i ii=i>iii|iLii2i?iJiiiimiii|iMini}i}i@iiFiiii~iBi>iiidi- iiioipiiiiiciGiidiiiqiii\ieiGiOiAiHiBi6ii i=i iiNiiIiOiii7i~iJiKiiiCi~iriLiiiiMioi8i?iiiiiNiiisii=iiitiiCiii@iuiiK i iii9iiiOiiPiiiQii iiiiii iriY iiiivii?iiRiwiSiTii`iUiDiVixiiEiiPiWiiXii!iYiiii$ ii\ii1iiiiiii"iQiZiii7iiiiAiyiii iiid ii[iiiBiziii\i i iiiiiiVii{iifi]i|i^i}iiiBiiiii:i_iii;iiii`i<ipiiFiiPiiai ibiGi i-ici]iidi iiigiHiiIii ieiiiuiiiiiqiJifiigijiKi~ihiii^iii#iiiiiiiiiHiLiiijiiRiiSiiiiMii i!iTiiiiikiwiiiiniiiili#i>iiiZ iiHiii#iiiiNimiiiiiiiniio(t!GB2312_TYPICAL_DISTRIBUTION_RATIOtGB2312_TABLE_SIZEtGB2312CharToFreqOrder(((s6/usr/lib/python2.7/site-packages/chardet/gb2312freq.pyt*sPPK[9+site-packages/chardet/charsetgroupprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from . import constants import sys from .charsetprober import CharSetProber class CharSetGroupProber(CharSetProber): def __init__(self): CharSetProber.__init__(self) self._mActiveNum = 0 self._mProbers = [] self._mBestGuessProber = None def reset(self): CharSetProber.reset(self) self._mActiveNum = 0 for prober in self._mProbers: if prober: prober.reset() prober.active = True self._mActiveNum += 1 self._mBestGuessProber = None def get_charset_name(self): if not self._mBestGuessProber: self.get_confidence() if not self._mBestGuessProber: return None # self._mBestGuessProber = self._mProbers[0] return self._mBestGuessProber.get_charset_name() def feed(self, aBuf): for prober in self._mProbers: if not prober: continue if not prober.active: continue st = prober.feed(aBuf) if not st: continue if st == constants.eFoundIt: self._mBestGuessProber = prober return self.get_state() elif st == constants.eNotMe: prober.active = False self._mActiveNum -= 1 if self._mActiveNum <= 0: self._mState = constants.eNotMe return self.get_state() return self.get_state() def get_confidence(self): st = self.get_state() if st == constants.eFoundIt: return 0.99 elif st == constants.eNotMe: return 0.01 bestConf = 0.0 self._mBestGuessProber = None for prober in self._mProbers: if not prober: continue if not prober.active: if constants._debug: sys.stderr.write(prober.get_charset_name() + ' not active\n') continue cf = prober.get_confidence() if constants._debug: sys.stderr.write('%s confidence = %s\n' % (prober.get_charset_name(), cf)) if bestConf < cf: bestConf = cf self._mBestGuessProber = prober if not self._mBestGuessProber: return 0.0 return bestConf # else: # self._mBestGuessProber = self._mProbers[0] # return self._mBestGuessProber.get_confidence() PK[] mgwgw+site-packages/chardet/langcyrillicmodel.pyonu[ ۝Rc@s$dZdZdZdZdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z dS(iiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii'iiiii ii iiiii iiiii iiiiiiii6i;i%i,i:i)i0i5i.i7i*i<i$i1i&ii"i#i+i-i i(i4i8i!i=i>i3i9i/i?i2iFitcharToOrderMaptprecedenceMatrixglP@?tmTypicalPositiveRatiotkeepEnglishLettersKOI8-Rt charsetNames windows-1251s ISO-8859-5t MacCyrillictIBM866tIBM855N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii'iiiii ii iiiii iiiii iiiiiiii6i;i%i,i:i)i0i5i.i7i*i<i$i1i&ii"i#i+i-i i(i4i8i!i=i>i3i9i/i?i2iF(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii ii iiiiii ii iiii iiii'iiiiii6iiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii ii iiiiii ii iiii iiii'iiiiii6iiiiiiiDiiiiiiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiii ii iiiiii ii iiii iiii'iiiiii6iiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiDiiiiiiiiiiiiiiiiiiiiiiiii;i6iFii%ii,ii:i i)ii0i'i5ii.iiiiiiiii7ii*iiiiii<iiiiiiii i$iiiiiiiiii1i i&iiii"iiiiii#iii+i i-ii ii(ii4ii8i i!ii=iiii>ii3ii9ii/ii?ii2iii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii ii iiiiii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiii'iiiiii6iiiiiiiDiiiiiiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tKOI8R_CharToOrderMaptwin1251_CharToOrderMaptlatin5_CharToOrderMaptmacCyrillic_CharToOrderMaptIBM855_CharToOrderMaptIBM866_CharToOrderMaptRussianLangModeltFalset Koi8rModeltWin1251CyrillicModeltLatin5CyrillicModeltMacCyrillicModelt Ibm866Modelt Ibm855Model(((s=/usr/lib/python2.7/site-packages/chardet/langcyrillicmodel.pyts      PK[[*// site-packages/chardet/compat.pyonu[ ۝Rc@sCddlZejdkr*eefZn eefZdZdS(iNiicCs0tjdkr(t|tr(t|S|SdS(Nii(ii(tsyst version_infot isinstancetbase_strtord(ta((s2/usr/lib/python2.7/site-packages/chardet/compat.pytwrap_ords (ii(RRtstrtunicodeRtbytesR(((s2/usr/lib/python2.7/site-packages/chardet/compat.pyts  PK[*Z0%a%a,site-packages/chardet/langhungarianmodel.pycnu[ ۝Rc@shdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6ZdS(iiiiii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iGi+i!i%i9i0i@iDi7i4iiiiiii ii iiii iiiiCi iiiiiAi>ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiOiiiiiiiiiiiiiiiii3iQiiNiiiii,iiii=iiiiii:iiBi;iiii<iEi?iiiiRiiJiiFiPiiHiiiSiMiTiiLiUiiiiiIi*iiiiii8iiiViWitcharToOrderMaptprecedenceMatrixg(P?tmTypicalPositiveRatiotkeepEnglishLetters ISO-8859-2t charsetNames windows-1250N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iGi+i!i%i9i0i@iDi7i4iiiiiiiiiiiii ii iiii iiiiCi iiiiiAi>ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiOiiiiiiiiiiiiiiiii3iQiiNiiiii,iiii=iiiiii:iiBi;iiii<iEi?iiiiRiiJiiFiPiiHiiiSiMiTiiLiUiiiiiIi*iiiiii8iiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(i6i-i i2i1i&i'i5i$i)i"i#i/i.iHi+i!i%i9i0i@iDi7i4iiiiiiiiiiiii ii iiii iiiiCi iiiiiAi>ii iiiiiiiiiiiiiiiiiiiiiiiiiiNiiEiiiiiiiiiiiiiiiiiLiiiiiiiiiQiiiiiiiiiiiiiiiii3iSiiPiiiii,iiii=iiiiii:iiBi;iiii<iFi?iiiiTiiKiiGiRiiIiiiUiOiViiMiWiiiiiJi*iiiiii8iiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tLatin2_HungarianCharToOrderMaptwin1250HungarianCharToOrderMaptHungarianLangModeltTruetLatin2HungarianModeltWin1250HungarianModel(((s>/usr/lib/python2.7/site-packages/chardet/langhungarianmodel.pyt#sV  PK[*site-packages/chardet/universaldetector.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from . import constants import sys import codecs from .latin1prober import Latin1Prober # windows-1252 from .mbcsgroupprober import MBCSGroupProber # multi-byte character sets from .sbcsgroupprober import SBCSGroupProber # single-byte character sets from .escprober import EscCharSetProber # ISO-2122, etc. import re MINIMUM_THRESHOLD = 0.20 ePureAscii = 0 eEscAscii = 1 eHighbyte = 2 class UniversalDetector: def __init__(self): self._highBitDetector = re.compile(b'[\x80-\xFF]') self._escDetector = re.compile(b'(\033|~{)') self._mEscCharSetProber = None self._mCharSetProbers = [] self.reset() def reset(self): self.result = {'encoding': None, 'confidence': 0.0} self.done = False self._mStart = True self._mGotData = False self._mInputState = ePureAscii self._mLastChar = b'' if self._mEscCharSetProber: self._mEscCharSetProber.reset() for prober in self._mCharSetProbers: prober.reset() def feed(self, aBuf): if self.done: return aLen = len(aBuf) if not aLen: return if not self._mGotData: # If the data starts with BOM, we know it is UTF if aBuf[:3] == codecs.BOM: # EF BB BF UTF-8 with BOM self.result = {'encoding': "UTF-8", 'confidence': 1.0} elif aBuf[:4] == codecs.BOM_UTF32_LE: # FF FE 00 00 UTF-32, little-endian BOM self.result = {'encoding': "UTF-32LE", 'confidence': 1.0} elif aBuf[:4] == codecs.BOM_UTF32_BE: # 00 00 FE FF UTF-32, big-endian BOM self.result = {'encoding': "UTF-32BE", 'confidence': 1.0} elif aBuf[:4] == b'\xFE\xFF\x00\x00': # FE FF 00 00 UCS-4, unusual octet order BOM (3412) self.result = { 'encoding': "X-ISO-10646-UCS-4-3412", 'confidence': 1.0 } elif aBuf[:4] == b'\x00\x00\xFF\xFE': # 00 00 FF FE UCS-4, unusual octet order BOM (2143) self.result = { 'encoding': "X-ISO-10646-UCS-4-2143", 'confidence': 1.0 } elif aBuf[:2] == codecs.BOM_LE: # FF FE UTF-16, little endian BOM self.result = {'encoding': "UTF-16LE", 'confidence': 1.0} elif aBuf[:2] == codecs.BOM_BE: # FE FF UTF-16, big endian BOM self.result = {'encoding': "UTF-16BE", 'confidence': 1.0} self._mGotData = True if self.result['encoding'] and (self.result['confidence'] > 0.0): self.done = True return if self._mInputState == ePureAscii: if self._highBitDetector.search(aBuf): self._mInputState = eHighbyte elif ((self._mInputState == ePureAscii) and self._escDetector.search(self._mLastChar + aBuf)): self._mInputState = eEscAscii self._mLastChar = aBuf[-1:] if self._mInputState == eEscAscii: if not self._mEscCharSetProber: self._mEscCharSetProber = EscCharSetProber() if self._mEscCharSetProber.feed(aBuf) == constants.eFoundIt: self.result = {'encoding': self._mEscCharSetProber.get_charset_name(), 'confidence': self._mEscCharSetProber.get_confidence()} self.done = True elif self._mInputState == eHighbyte: if not self._mCharSetProbers: self._mCharSetProbers = [MBCSGroupProber(), SBCSGroupProber(), Latin1Prober()] for prober in self._mCharSetProbers: if prober.feed(aBuf) == constants.eFoundIt: self.result = {'encoding': prober.get_charset_name(), 'confidence': prober.get_confidence()} self.done = True break def close(self): if self.done: return if not self._mGotData: if constants._debug: sys.stderr.write('no data received!\n') return self.done = True if self._mInputState == ePureAscii: self.result = {'encoding': 'ascii', 'confidence': 1.0} return self.result if self._mInputState == eHighbyte: proberConfidence = None maxProberConfidence = 0.0 maxProber = None for prober in self._mCharSetProbers: if not prober: continue proberConfidence = prober.get_confidence() if proberConfidence > maxProberConfidence: maxProberConfidence = proberConfidence maxProber = prober if maxProber and (maxProberConfidence > MINIMUM_THRESHOLD): self.result = {'encoding': maxProber.get_charset_name(), 'confidence': maxProber.get_confidence()} return self.result if constants._debug: sys.stderr.write('no probers hit minimum threshhold\n') for prober in self._mCharSetProbers[0].mProbers: if not prober: continue sys.stderr.write('%s confidence = %s\n' % (prober.get_charset_name(), prober.get_confidence())) PK[㒭&/4/4%site-packages/chardet/hebrewprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Shy Shalom # Portions created by the Initial Developer are Copyright (C) 2005 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .charsetprober import CharSetProber from .constants import eNotMe, eDetecting from .compat import wrap_ord # This prober doesn't actually recognize a language or a charset. # It is a helper prober for the use of the Hebrew model probers ### General ideas of the Hebrew charset recognition ### # # Four main charsets exist in Hebrew: # "ISO-8859-8" - Visual Hebrew # "windows-1255" - Logical Hebrew # "ISO-8859-8-I" - Logical Hebrew # "x-mac-hebrew" - ?? Logical Hebrew ?? # # Both "ISO" charsets use a completely identical set of code points, whereas # "windows-1255" and "x-mac-hebrew" are two different proper supersets of # these code points. windows-1255 defines additional characters in the range # 0x80-0x9F as some misc punctuation marks as well as some Hebrew-specific # diacritics and additional 'Yiddish' ligature letters in the range 0xc0-0xd6. # x-mac-hebrew defines similar additional code points but with a different # mapping. # # As far as an average Hebrew text with no diacritics is concerned, all four # charsets are identical with respect to code points. Meaning that for the # main Hebrew alphabet, all four map the same values to all 27 Hebrew letters # (including final letters). # # The dominant difference between these charsets is their directionality. # "Visual" directionality means that the text is ordered as if the renderer is # not aware of a BIDI rendering algorithm. The renderer sees the text and # draws it from left to right. The text itself when ordered naturally is read # backwards. A buffer of Visual Hebrew generally looks like so: # "[last word of first line spelled backwards] [whole line ordered backwards # and spelled backwards] [first word of first line spelled backwards] # [end of line] [last word of second line] ... etc' " # adding punctuation marks, numbers and English text to visual text is # naturally also "visual" and from left to right. # # "Logical" directionality means the text is ordered "naturally" according to # the order it is read. It is the responsibility of the renderer to display # the text from right to left. A BIDI algorithm is used to place general # punctuation marks, numbers and English text in the text. # # Texts in x-mac-hebrew are almost impossible to find on the Internet. From # what little evidence I could find, it seems that its general directionality # is Logical. # # To sum up all of the above, the Hebrew probing mechanism knows about two # charsets: # Visual Hebrew - "ISO-8859-8" - backwards text - Words and sentences are # backwards while line order is natural. For charset recognition purposes # the line order is unimportant (In fact, for this implementation, even # word order is unimportant). # Logical Hebrew - "windows-1255" - normal, naturally ordered text. # # "ISO-8859-8-I" is a subset of windows-1255 and doesn't need to be # specifically identified. # "x-mac-hebrew" is also identified as windows-1255. A text in x-mac-hebrew # that contain special punctuation marks or diacritics is displayed with # some unconverted characters showing as question marks. This problem might # be corrected using another model prober for x-mac-hebrew. Due to the fact # that x-mac-hebrew texts are so rare, writing another model prober isn't # worth the effort and performance hit. # #### The Prober #### # # The prober is divided between two SBCharSetProbers and a HebrewProber, # all of which are managed, created, fed data, inquired and deleted by the # SBCSGroupProber. The two SBCharSetProbers identify that the text is in # fact some kind of Hebrew, Logical or Visual. The final decision about which # one is it is made by the HebrewProber by combining final-letter scores # with the scores of the two SBCharSetProbers to produce a final answer. # # The SBCSGroupProber is responsible for stripping the original text of HTML # tags, English characters, numbers, low-ASCII punctuation characters, spaces # and new lines. It reduces any sequence of such characters to a single space. # The buffer fed to each prober in the SBCS group prober is pure text in # high-ASCII. # The two SBCharSetProbers (model probers) share the same language model: # Win1255Model. # The first SBCharSetProber uses the model normally as any other # SBCharSetProber does, to recognize windows-1255, upon which this model was # built. The second SBCharSetProber is told to make the pair-of-letter # lookup in the language model backwards. This in practice exactly simulates # a visual Hebrew model using the windows-1255 logical Hebrew model. # # The HebrewProber is not using any language model. All it does is look for # final-letter evidence suggesting the text is either logical Hebrew or visual # Hebrew. Disjointed from the model probers, the results of the HebrewProber # alone are meaningless. HebrewProber always returns 0.00 as confidence # since it never identifies a charset by itself. Instead, the pointer to the # HebrewProber is passed to the model probers as a helper "Name Prober". # When the Group prober receives a positive identification from any prober, # it asks for the name of the charset identified. If the prober queried is a # Hebrew model prober, the model prober forwards the call to the # HebrewProber to make the final decision. In the HebrewProber, the # decision is made according to the final-letters scores maintained and Both # model probers scores. The answer is returned in the form of the name of the # charset identified, either "windows-1255" or "ISO-8859-8". # windows-1255 / ISO-8859-8 code points of interest FINAL_KAF = 0xea NORMAL_KAF = 0xeb FINAL_MEM = 0xed NORMAL_MEM = 0xee FINAL_NUN = 0xef NORMAL_NUN = 0xf0 FINAL_PE = 0xf3 NORMAL_PE = 0xf4 FINAL_TSADI = 0xf5 NORMAL_TSADI = 0xf6 # Minimum Visual vs Logical final letter score difference. # If the difference is below this, don't rely solely on the final letter score # distance. MIN_FINAL_CHAR_DISTANCE = 5 # Minimum Visual vs Logical model score difference. # If the difference is below this, don't rely at all on the model score # distance. MIN_MODEL_DISTANCE = 0.01 VISUAL_HEBREW_NAME = "ISO-8859-8" LOGICAL_HEBREW_NAME = "windows-1255" class HebrewProber(CharSetProber): def __init__(self): CharSetProber.__init__(self) self._mLogicalProber = None self._mVisualProber = None self.reset() def reset(self): self._mFinalCharLogicalScore = 0 self._mFinalCharVisualScore = 0 # The two last characters seen in the previous buffer, # mPrev and mBeforePrev are initialized to space in order to simulate # a word delimiter at the beginning of the data self._mPrev = ' ' self._mBeforePrev = ' ' # These probers are owned by the group prober. def set_model_probers(self, logicalProber, visualProber): self._mLogicalProber = logicalProber self._mVisualProber = visualProber def is_final(self, c): return wrap_ord(c) in [FINAL_KAF, FINAL_MEM, FINAL_NUN, FINAL_PE, FINAL_TSADI] def is_non_final(self, c): # The normal Tsadi is not a good Non-Final letter due to words like # 'lechotet' (to chat) containing an apostrophe after the tsadi. This # apostrophe is converted to a space in FilterWithoutEnglishLetters # causing the Non-Final tsadi to appear at an end of a word even # though this is not the case in the original text. # The letters Pe and Kaf rarely display a related behavior of not being # a good Non-Final letter. Words like 'Pop', 'Winamp' and 'Mubarak' # for example legally end with a Non-Final Pe or Kaf. However, the # benefit of these letters as Non-Final letters outweighs the damage # since these words are quite rare. return wrap_ord(c) in [NORMAL_KAF, NORMAL_MEM, NORMAL_NUN, NORMAL_PE] def feed(self, aBuf): # Final letter analysis for logical-visual decision. # Look for evidence that the received buffer is either logical Hebrew # or visual Hebrew. # The following cases are checked: # 1) A word longer than 1 letter, ending with a final letter. This is # an indication that the text is laid out "naturally" since the # final letter really appears at the end. +1 for logical score. # 2) A word longer than 1 letter, ending with a Non-Final letter. In # normal Hebrew, words ending with Kaf, Mem, Nun, Pe or Tsadi, # should not end with the Non-Final form of that letter. Exceptions # to this rule are mentioned above in isNonFinal(). This is an # indication that the text is laid out backwards. +1 for visual # score # 3) A word longer than 1 letter, starting with a final letter. Final # letters should not appear at the beginning of a word. This is an # indication that the text is laid out backwards. +1 for visual # score. # # The visual score and logical score are accumulated throughout the # text and are finally checked against each other in GetCharSetName(). # No checking for final letters in the middle of words is done since # that case is not an indication for either Logical or Visual text. # # We automatically filter out all 7-bit characters (replace them with # spaces) so the word boundary detection works properly. [MAP] if self.get_state() == eNotMe: # Both model probers say it's not them. No reason to continue. return eNotMe aBuf = self.filter_high_bit_only(aBuf) for cur in aBuf: if cur == ' ': # We stand on a space - a word just ended if self._mBeforePrev != ' ': # next-to-last char was not a space so self._mPrev is not a # 1 letter word if self.is_final(self._mPrev): # case (1) [-2:not space][-1:final letter][cur:space] self._mFinalCharLogicalScore += 1 elif self.is_non_final(self._mPrev): # case (2) [-2:not space][-1:Non-Final letter][ # cur:space] self._mFinalCharVisualScore += 1 else: # Not standing on a space if ((self._mBeforePrev == ' ') and (self.is_final(self._mPrev)) and (cur != ' ')): # case (3) [-2:space][-1:final letter][cur:not space] self._mFinalCharVisualScore += 1 self._mBeforePrev = self._mPrev self._mPrev = cur # Forever detecting, till the end or until both model probers return # eNotMe (handled above) return eDetecting def get_charset_name(self): # Make the decision: is it Logical or Visual? # If the final letter score distance is dominant enough, rely on it. finalsub = self._mFinalCharLogicalScore - self._mFinalCharVisualScore if finalsub >= MIN_FINAL_CHAR_DISTANCE: return LOGICAL_HEBREW_NAME if finalsub <= -MIN_FINAL_CHAR_DISTANCE: return VISUAL_HEBREW_NAME # It's not dominant enough, try to rely on the model scores instead. modelsub = (self._mLogicalProber.get_confidence() - self._mVisualProber.get_confidence()) if modelsub > MIN_MODEL_DISTANCE: return LOGICAL_HEBREW_NAME if modelsub < -MIN_MODEL_DISTANCE: return VISUAL_HEBREW_NAME # Still no good, back to final letter distance, maybe it'll save the # day. if finalsub < 0.0: return VISUAL_HEBREW_NAME # (finalsub > 0 - Logical) or (don't know what to do) default to # Logical. return LOGICAL_HEBREW_NAME def get_state(self): # Remain active as long as any of the model probers are active. if (self._mLogicalProber.get_state() == eNotMe) and \ (self._mVisualProber.get_state() == eNotMe): return eNotMe return eDetecting PK[LԊLL#site-packages/chardet/constants.pycnu[ ۝Rc@s4dZdZdZdZdZdZdZdZdS(iiigffffff?N(t_debugt eDetectingteFoundItteNotMeteStartteErrorteItsMetSHORTCUT_THRESHOLD(((s5/usr/lib/python2.7/site-packages/chardet/constants.pytsPK[_ k\ \ #site-packages/chardet/utf8prober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from . import constants from .charsetprober import CharSetProber from .codingstatemachine import CodingStateMachine from .mbcssm import UTF8SMModel ONE_CHAR_PROB = 0.5 class UTF8Prober(CharSetProber): def __init__(self): CharSetProber.__init__(self) self._mCodingSM = CodingStateMachine(UTF8SMModel) self.reset() def reset(self): CharSetProber.reset(self) self._mCodingSM.reset() self._mNumOfMBChar = 0 def get_charset_name(self): return "utf-8" def feed(self, aBuf): for c in aBuf: codingState = self._mCodingSM.next_state(c) if codingState == constants.eError: self._mState = constants.eNotMe break elif codingState == constants.eItsMe: self._mState = constants.eFoundIt break elif codingState == constants.eStart: if self._mCodingSM.get_current_charlen() >= 2: self._mNumOfMBChar += 1 if self.get_state() == constants.eDetecting: if self.get_confidence() > constants.SHORTCUT_THRESHOLD: self._mState = constants.eFoundIt return self.get_state() def get_confidence(self): unlike = 0.99 if self._mNumOfMBChar < 6: for i in range(0, self._mNumOfMBChar): unlike = unlike * ONE_CHAR_PROB return 1.0 - unlike else: return unlike PK[] mgwgw+site-packages/chardet/langcyrillicmodel.pycnu[ ۝Rc@s$dZdZdZdZdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z ied6ed6dd6ed6dd6Z dS(iiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii'iiiii ii iiiii iiiii iiiiiiii6i;i%i,i:i)i0i5i.i7i*i<i$i1i&ii"i#i+i-i i(i4i8i!i=i>i3i9i/i?i2iFitcharToOrderMaptprecedenceMatrixglP@?tmTypicalPositiveRatiotkeepEnglishLettersKOI8-Rt charsetNames windows-1251s ISO-8859-5t MacCyrillictIBM866tIBM855N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ii'iiiii ii iiiii iiiii iiiiiiii6i;i%i,i:i)i0i5i.i7i*i<i$i1i&ii"i#i+i-i i(i4i8i!i=i>i3i9i/i?i2iF(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii ii iiiiii ii iiii iiii'iiiiii6iiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii ii iiiiii ii iiii iiii'iiiiii6iiiiiiiDiiiiiiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiDiiii ii iiiiii ii iiii iiii'iiiiii6iiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiiiiiiiDiiiiiiiiiiiiiiiiiiiiiiiii;i6iFii%ii,ii:i i)ii0i'i5ii.iiiiiiiii7ii*iiiiii<iiiiiiii i$iiiiiiiiii1i i&iiii"iiiiii#iii+i i-ii ii(ii4ii8i i!ii=iiii>ii3ii9ii/ii?ii2iii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiJiiKiiiiiiiiiiiiiiiiiiiGiiBiiAiiLii@iiiMiHiiEiCiiNiIiiiOiiiiiiiiii%i,i!i.i)i0i8i3i*i<i$i1i&ii"i#i-i i(i4i5i7i:i2i9i?iFi>i=i/i;i+iii ii iiiiii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiii'iiiiii6iiiiiiiDiiiiiiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tKOI8R_CharToOrderMaptwin1251_CharToOrderMaptlatin5_CharToOrderMaptmacCyrillic_CharToOrderMaptIBM855_CharToOrderMaptIBM866_CharToOrderMaptRussianLangModeltFalset Koi8rModeltWin1251CyrillicModeltLatin5CyrillicModeltMacCyrillicModelt Ibm866Modelt Ibm855Model(((s=/usr/lib/python2.7/site-packages/chardet/langcyrillicmodel.pyts      PK[{ 6,6,(site-packages/chardet/langhebrewmodel.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Simon Montagu # Portions created by the Initial Developer are Copyright (C) 2005 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # Shoshannah Forbes - original C code (?) # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # 255: Control characters that usually does not exist in any text # 254: Carriage/Return # 253: symbol (punctuation) that does not belong to word # 252: 0 - 9 # Windows-1255 language model # Character Mapping Table: win1255_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253, 69, 91, 79, 80, 92, 89, 97, 90, 68,111,112, 82, 73, 95, 85, # 40 78,121, 86, 71, 67,102,107, 84,114,103,115,253,253,253,253,253, # 50 253, 50, 74, 60, 61, 42, 76, 70, 64, 53,105, 93, 56, 65, 54, 49, # 60 66,110, 51, 43, 44, 63, 81, 77, 98, 75,108,253,253,253,253,253, # 70 124,202,203,204,205, 40, 58,206,207,208,209,210,211,212,213,214, 215, 83, 52, 47, 46, 72, 32, 94,216,113,217,109,218,219,220,221, 34,116,222,118,100,223,224,117,119,104,125,225,226, 87, 99,227, 106,122,123,228, 55,229,230,101,231,232,120,233, 48, 39, 57,234, 30, 59, 41, 88, 33, 37, 36, 31, 29, 35,235, 62, 28,236,126,237, 238, 38, 45,239,240,241,242,243,127,244,245,246,247,248,249,250, 9, 8, 20, 16, 3, 2, 24, 14, 22, 1, 25, 15, 4, 11, 6, 23, 12, 19, 13, 26, 18, 27, 21, 17, 7, 10, 5,251,252,128, 96,253, ) # Model Table: # total sequences: 100% # first 512 sequences: 98.4004% # first 1024 sequences: 1.5981% # rest sequences: 0.087% # negative sequences: 0.0015% HebrewLangModel = ( 0,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,2,3,2,1,2,0,1,0,0, 3,0,3,1,0,0,1,3,2,0,1,1,2,0,2,2,2,1,1,1,1,2,1,1,1,2,0,0,2,2,0,1, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2, 1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2, 1,2,1,3,1,1,0,0,2,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,1,2,2,1,3, 1,2,1,1,2,2,0,0,2,2,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,2,2,2,3,2, 1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,2,3,2,2,3,2,2,2,1,2,2,2,2, 1,2,1,1,2,2,0,1,2,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,0,2,2,2,2,2, 0,2,0,2,2,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,0,2,2,2, 0,2,1,2,2,2,0,0,2,1,0,0,0,0,1,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,2,1,2,3,2,2,2, 1,2,1,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,0,2,0,2, 0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,2,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,2,2,3,2,1,2,1,1,1, 0,1,1,1,1,1,3,0,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0, 0,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2, 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,2,1,2,3,3,2,3,3,3,3,2,3,2,1,2,0,2,1,2, 0,2,0,2,2,2,0,0,1,2,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,1,2,2,3,3,2,3,2,3,2,2,3,1,2,2,0,2,2,2, 0,2,1,2,2,2,0,0,1,2,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,2,2,3,3,3,3,1,3,2,2,2, 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,2,3,2,2,2,1,2,2,0,2,2,2,2, 0,2,0,2,2,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,1,3,2,3,3,2,3,3,2,2,1,2,2,2,2,2,2, 0,2,1,2,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,2,3,2,3,3,2,3,3,3,3,2,3,2,3,3,3,3,3,2,2,2,2,2,2,2,1, 0,2,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,2,1,2,3,3,3,3,3,3,3,2,3,2,3,2,1,2,3,0,2,1,2,2, 0,2,1,1,2,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0, 3,3,3,3,3,3,3,3,3,2,3,3,3,3,2,1,3,1,2,2,2,1,2,3,3,1,2,1,2,2,2,2, 0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,0,2,3,3,3,1,3,3,3,1,2,2,2,2,1,1,2,2,2,2,2,2, 0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,2,3,3,3,2,2,3,3,3,2,1,2,3,2,3,2,2,2,2,1,2,1,1,1,2,2, 0,2,1,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,1,0,0,0,0,0, 1,0,1,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,2,3,3,2,3,1,2,2,2,2,3,2,3,1,1,2,2,1,2,2,1,1,0,2,2,2,2, 0,1,0,1,2,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0, 3,0,0,1,1,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 3,2,2,1,2,2,2,2,2,2,2,1,2,2,1,2,2,1,1,1,1,1,1,1,1,2,1,1,0,3,3,3, 0,3,0,2,2,2,2,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 2,2,2,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,2,1,2,2,2,1,1,1,2,0,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,2,2,2,2,2,2,0,2,2,0,0,0,0,0,0, 0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,1,0,2,1,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,3,1,1,2,2,2,2,2,1,2,2,2,1,1,2,2,2,2,2,2,2,1,2,2,1,0,1,1,1,1,0, 0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,1,1,1,1,2,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, 0,0,2,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,0,0, 2,1,1,2,2,2,2,2,2,2,2,2,2,2,1,2,2,2,2,2,1,2,1,2,1,1,1,1,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,1,2,2,2,2,2,2,2,2,2,2,1,2,1,2,1,1,2,1,1,1,2,1,2,1,2,0,1,0,1, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,3,1,2,2,2,1,2,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,2,1,2,1,1,0,1,0,1, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2, 0,2,0,1,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,1,1,1,1,1,1,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,0,1,1,0,0, 0,1,1,1,2,1,2,2,2,0,2,0,2,0,1,1,2,1,1,1,1,2,1,0,1,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,1,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,1,2,2,1,2,0,2,0,0,0,1,2,0,1, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,2,0,2,1,2,0,2,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,0,1, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,2,2,0,0,1,0,0,0,1,0,0,1, 1,1,2,1,0,1,1,1,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,2,1, 0,2,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,0,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,0,1,1,0,1, 2,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,0,1, 1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,2,1,1,2,0,2,0,0,0,1,1,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1, 2,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,1, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,2,2,0,0,0,0,2,1,1,1,0,2,1,1,0,0,0,2,1,0,1, 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,0,2,1,1,0,1,0,0,0,1,1,0,1, 2,2,1,1,1,0,1,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,1,1,0,1,2,1,0,2,0,0,0,1,1,0,1, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, 0,1,0,0,2,0,2,1,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,1,0,0,1,0,0,0,1,0,0,1, 1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,1,0,0,0,0,1,0,1, 0,1,1,1,2,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,2,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0, ) Win1255HebrewModel = { 'charToOrderMap': win1255_CharToOrderMap, 'precedenceMatrix': HebrewLangModel, 'mTypicalPositiveRatio': 0.984004, 'keepEnglishLetter': False, 'charsetName': "windows-1255" } # flake8: noqa PK[; )site-packages/chardet/sbcharsetprober.pycnu[ ۝Rc@sddlZddlmZddlmZddlmZdZdZdZ d Z d Z d Z e dZ d efd YZdS(iNi(t constants(t CharSetProber(twrap_ordi@igffffff?g?iitSingleByteCharSetProbercBs;eZeddZdZdZdZdZRS(cCs6tj|||_||_||_|jdS(N(Rt__init__t_mModelt _mReversedt _mNameProbertreset(tselftmodeltreversedt nameProber((s;/usr/lib/python2.7/site-packages/chardet/sbcharsetprober.pyR-s     cCsEtj|d|_dgt|_d|_d|_d|_dS(Nii(RRt _mLastOrdertNUMBER_OF_SEQ_CATt _mSeqCounterst _mTotalSeqst _mTotalChart _mFreqChar(R ((s;/usr/lib/python2.7/site-packages/chardet/sbcharsetprober.pyR6s     cCs%|jr|jjS|jdSdS(Nt charsetName(Rtget_charset_nameR(R ((s;/usr/lib/python2.7/site-packages/chardet/sbcharsetprober.pyR@s  cCs|jds|j|}nt|}|s;|jSx|D]}|jdt|}|tkr}|jd7_n|tkr|jd7_|j tkr|j d7_ |j s|j t|}|jd|}n"|t|j }|jd|}|j |cd7s  PK[ site-packages/chardet/escsm.pyonu[ ۝Rc@sddlmZmZmZdZeedeeeeeeeeeeeeeeeeeeededededddededddededeeeeeeef0ZdZied6dd 6ed 6ed 6d d 6ZdZedeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeeeeddeeeeeeeeeeeeeeeeeeeeeef@Z dZ ied6dd 6e d 6e d 6dd 6Z dZ edeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeedeeeeedeeeeeeeeeeeeeeeeeeeeeeeeeeeefHZ dZie d6dd 6e d 6ed 6dd 6ZdZedeeeeeeeeeeeeeeeeeeedeeeeeedeeeeeeeeeeef(ZdZied6dd 6ed 6ed 6dd 6ZdS(i(teStartteErrorteItsMeiiiiiit classTablet classFactort stateTablet charLenTables HZ-GB-2312tnamei s ISO-2022-CNiii s ISO-2022-JPs ISO-2022-KRN(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii( iiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii( iiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(t constantsRRRtHZ_clstHZ_sttHZCharLenTablet HZSMModelt ISO2022CN_clst ISO2022CN_sttISO2022CNCharLenTabletISO2022CNSMModelt ISO2022JP_clst ISO2022JP_sttISO2022JPCharLenTabletISO2022JPSMModelt ISO2022KR_clst ISO2022KR_sttISO2022KRCharLenTabletISO2022KRSMModel(((s1/usr/lib/python2.7/site-packages/chardet/escsm.pytsh       PK[P~00+site-packages/chardet/langhungarianmodel.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # 255: Control characters that usually does not exist in any text # 254: Carriage/Return # 253: symbol (punctuation) that does not belong to word # 252: 0 - 9 # Character Mapping Table: Latin2_HungarianCharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, 46, 71, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, 253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, 159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174, 175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190, 191,192,193,194,195,196,197, 75,198,199,200,201,202,203,204,205, 79,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, 221, 51, 81,222, 78,223,224,225,226, 44,227,228,229, 61,230,231, 232,233,234, 58,235, 66, 59,236,237,238, 60, 69, 63,239,240,241, 82, 14, 74,242, 70, 80,243, 72,244, 15, 83, 77, 84, 30, 76, 85, 245,246,247, 25, 73, 42, 24,248,249,250, 31, 56, 29,251,252,253, ) win1250HungarianCharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253, 28, 40, 54, 45, 32, 50, 49, 38, 39, 53, 36, 41, 34, 35, 47, 46, 72, 43, 33, 37, 57, 48, 64, 68, 55, 52,253,253,253,253,253, 253, 2, 18, 26, 17, 1, 27, 12, 20, 9, 22, 7, 6, 13, 4, 8, 23, 67, 10, 5, 3, 21, 19, 65, 62, 16, 11,253,253,253,253,253, 161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176, 177,178,179,180, 78,181, 69,182,183,184,185,186,187,188,189,190, 191,192,193,194,195,196,197, 76,198,199,200,201,202,203,204,205, 81,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220, 221, 51, 83,222, 80,223,224,225,226, 44,227,228,229, 61,230,231, 232,233,234, 58,235, 66, 59,236,237,238, 60, 70, 63,239,240,241, 84, 14, 75,242, 71, 82,243, 73,244, 15, 85, 79, 86, 30, 77, 87, 245,246,247, 25, 74, 42, 24,248,249,250, 31, 56, 29,251,252,253, ) # Model Table: # total sequences: 100% # first 512 sequences: 94.7368% # first 1024 sequences:5.2623% # rest sequences: 0.8894% # negative sequences: 0.0009% HungarianLangModel = ( 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,2,3,3,1,1,2,2,2,2,2,1,2, 3,2,2,3,3,3,3,3,2,3,3,3,3,3,3,1,2,3,3,3,3,2,3,3,1,1,3,3,0,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0, 3,2,1,3,3,3,3,3,2,3,3,3,3,3,1,1,2,3,3,3,3,3,3,3,1,1,3,2,0,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,1,1,2,3,3,3,1,3,3,3,3,3,1,3,3,2,2,0,3,2,3, 0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,3,3,2,3,3,2,2,3,2,3,2,0,3,2,2, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, 3,3,3,3,3,3,2,3,3,3,3,3,2,3,3,3,1,2,3,2,2,3,1,2,3,3,2,2,0,3,3,3, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,3,2,3,3,3,3,2,3,3,3,3,0,2,3,2, 0,0,0,1,1,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,1,1,1,3,3,2,1,3,2,2,3,2,1,3,2,2,1,0,3,3,1, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,2,2,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,3,2,2,3,1,1,3,2,0,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,1,3,3,3,3,3,2,2,1,3,3,3,0,1,1,2, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,2,3,3,2,3,3,3,2,0,3,2,3, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0, 3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,1,3,2,2,2,3,1,1,3,3,1,1,0,3,3,2, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,2,3,3,3,2,3,2,3,3,3,2,3,3,3,3,3,1,2,3,2,2,0,2,2,2, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,2,2,2,3,1,3,3,2,2,1,3,3,3,1,1,3,1,2,3,2,3,2,2,2,1,0,2,2,2, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, 3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,2,1,3,3,3,2,2,3,2,1,0,3,2,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,1,3,3,3,3,3,1,2,3,3,3,3,1,1,0,3,3,3,3,0,2,3,0,0,2,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,2,3,3,2,2,2,2,3,3,0,1,2,3,2,3,2,2,3,2,1,2,0,2,2,2, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0, 3,3,3,3,3,3,1,2,3,3,3,2,1,2,3,3,2,2,2,3,2,3,3,1,3,3,1,1,0,2,3,2, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,1,2,2,2,2,3,3,3,1,1,1,3,3,1,1,3,1,1,3,2,1,2,3,1,1,0,2,2,2, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,2,1,2,1,1,3,3,1,1,1,1,3,3,1,1,2,2,1,2,1,1,2,2,1,1,0,2,2,1, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,1,1,2,1,1,3,3,1,0,1,1,3,3,2,0,1,1,2,3,1,0,2,2,1,0,0,1,3,2, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,2,1,3,3,3,3,3,1,2,3,2,3,3,2,1,1,3,2,3,2,1,2,2,0,1,2,1,0,0,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, 3,3,3,3,2,2,2,2,3,1,2,2,1,1,3,3,0,3,2,1,2,3,2,1,3,3,1,1,0,2,1,3, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,3,3,2,2,2,3,2,3,3,3,2,1,1,3,3,1,1,1,2,2,3,2,3,2,2,2,1,0,2,2,1, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 1,0,0,3,3,3,3,3,0,0,3,3,2,3,0,0,0,2,3,3,1,0,1,2,0,0,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,2,3,3,3,3,3,1,2,3,3,2,2,1,1,0,3,3,2,2,1,2,2,1,0,2,2,0,1,1,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,2,2,1,3,1,2,3,3,2,2,1,1,2,2,1,1,1,1,3,2,1,1,1,1,2,1,0,1,2,1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 2,3,3,1,1,1,1,1,3,3,3,0,1,1,3,3,1,1,1,1,1,2,2,0,3,1,1,2,0,2,1,1, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0, 3,1,0,1,2,1,2,2,0,1,2,3,1,2,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,0,0,0, 1,2,1,2,2,2,1,2,1,2,0,2,0,2,2,1,1,2,1,1,2,1,1,1,0,1,0,0,0,1,1,0, 1,1,1,2,3,2,3,3,0,1,2,2,3,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,3,3,2,2,1,0,0,3,2,3,2,0,0,0,1,1,3,0,0,1,1,0,0,2,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,1,2,2,3,3,1,0,1,3,2,3,1,1,1,0,1,1,1,1,1,3,1,0,0,2,2,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,1,1,2,2,2,1,0,1,2,3,3,2,0,0,0,2,1,1,1,2,1,1,1,0,1,1,1,0,0,0, 1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,1,0,0,1,1, 3,2,2,1,0,0,1,1,2,2,0,3,0,1,2,1,1,0,0,1,1,1,0,1,1,1,1,0,2,1,1,1, 2,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,1,1,1,2,3,1,1,1,1,1,1,1,1,1,0,1, 2,3,3,0,1,0,0,0,3,3,1,0,0,1,2,2,1,0,0,0,0,2,0,0,1,1,1,0,2,1,1,1, 2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,1,1,1,1,1,0,1, 2,3,3,0,1,0,0,0,2,2,0,0,0,0,1,2,2,0,0,0,0,1,0,0,1,1,0,0,2,0,1,0, 2,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, 3,2,2,0,1,0,1,0,2,3,2,0,0,1,2,2,1,0,0,1,1,1,0,0,2,1,0,1,2,2,1,1, 2,1,1,1,1,1,1,2,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,1,0,1,1,2,1,1,0,1, 2,2,2,0,0,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,1,2,0,0,2,1,0,0,2,1,1,1, 2,1,1,1,1,2,1,2,1,1,1,2,2,1,1,2,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1, 1,2,3,0,0,0,1,0,3,2,1,0,0,1,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,2,1, 1,1,0,0,0,1,0,1,1,1,1,1,2,0,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,1,0,1, 3,0,0,2,1,2,2,1,0,0,2,1,2,2,0,0,0,2,1,1,1,0,1,1,0,0,1,1,2,0,0,0, 1,2,1,2,2,1,1,2,1,2,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1, 1,3,2,0,0,0,1,0,2,2,2,0,0,0,2,2,1,0,0,0,0,3,1,1,1,1,0,0,2,1,1,1, 2,1,0,1,1,1,0,1,1,1,1,1,1,1,0,2,1,0,0,1,0,1,1,0,1,1,1,1,1,1,0,1, 2,3,2,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,1,0,0,2,1,1,0, 2,1,1,1,1,2,1,2,1,2,0,1,1,1,0,2,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1, 3,1,1,2,2,2,3,2,1,1,2,2,1,1,0,1,0,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,0,0,0,0,0,2,2,0,0,0,0,2,2,1,0,0,0,1,1,0,0,1,2,0,0,2,1,1,1, 2,2,1,1,1,2,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,1,1,0,1,2,1,1,1,0,1, 1,0,0,1,2,3,2,1,0,0,2,0,1,1,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,0,0, 1,2,1,2,1,2,1,1,1,2,0,2,1,1,1,0,1,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0, 2,3,2,0,0,0,0,0,1,1,2,1,0,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,2,1,1,1, 2,1,1,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,1, 1,2,2,0,1,1,1,0,2,2,2,0,0,0,3,2,1,0,0,0,1,1,0,0,1,1,0,1,1,1,0,0, 1,1,0,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,0,1,1,1,0,1,0,1, 2,1,0,2,1,1,2,2,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,1,1,0,0,0, 1,2,2,2,2,2,1,1,1,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0, 1,2,3,0,0,0,1,0,2,2,0,0,0,0,2,2,0,0,0,0,0,1,0,0,1,0,0,0,2,0,1,0, 2,1,1,1,1,1,0,2,0,0,0,1,2,1,1,1,1,0,1,2,0,1,0,1,0,1,1,1,0,1,0,1, 2,2,2,0,0,0,1,0,2,1,2,0,0,0,1,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,0,1, 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,1,1,1,0,1, 1,2,2,0,0,0,1,0,2,2,2,0,0,0,1,1,0,0,0,0,0,1,1,0,2,0,0,1,1,1,0,1, 1,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,1, 1,0,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,0,0, 0,2,1,2,1,1,1,1,1,2,0,2,0,1,1,0,1,2,1,0,1,1,1,0,0,0,0,0,0,1,0,0, 2,1,1,0,1,2,0,0,1,1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,2,1,0,1, 2,2,1,1,1,1,1,2,1,1,0,1,1,1,1,2,1,1,1,2,1,1,0,1,0,1,1,1,1,1,0,1, 1,2,2,0,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,2,0,0,2,2,0,0,2,0,0,1, 2,1,1,1,1,1,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1, 1,1,2,0,0,3,1,0,2,1,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,0,1,0,1,0, 1,2,1,0,1,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,1,0,1,0,0,0,1,0,0, 2,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,2,0,0,0, 2,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,0,1, 2,1,1,1,2,1,1,1,0,1,1,2,1,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,0,1,1,1,1,1,0,0,1,1,2,1,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,0,0,0, 1,2,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,0,0, 2,0,0,0,1,1,1,1,0,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0, 0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, 1,0,0,1,1,1,1,1,0,0,2,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0, 0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0, 1,0,0,1,1,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,0,1,0,0,1,1,0,1,0,1,1,0,1,1,1,0,1,1,1,0,0,0,0,0,0,0,0,0, 2,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0, 0,1,1,1,1,1,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, ) Latin2HungarianModel = { 'charToOrderMap': Latin2_HungarianCharToOrderMap, 'precedenceMatrix': HungarianLangModel, 'mTypicalPositiveRatio': 0.947368, 'keepEnglishLetter': True, 'charsetName': "ISO-8859-2" } Win1250HungarianModel = { 'charToOrderMap': win1250HungarianCharToOrderMap, 'precedenceMatrix': HungarianLangModel, 'mTypicalPositiveRatio': 0.947368, 'keepEnglishLetter': True, 'charsetName': "windows-1250" } # flake8: noqa PK[͠ 'DD site-packages/chardet/mbcssm.pyonu[ jRc@sX ddlmZmZmZd"ZeeedeeeeeeeeeeeeeeeeeeeefZd#Zied6dd6ed 6ed 6d d 6Zd$Zeedeeedded eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeefFZ d%Z ied6dd6e d 6e d 6dd 6Z d&Z ddddeeeeeeeeeeeeeeeeeeeeeeeeeededeeeeeeef(Z d'Zie d6d d6e d 6ed 6dd 6Zd(ZeedeeeeeeeeeeeeefZd)Zied6dd6ed 6ed 6dd 6Zd*Zeeeddddeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeeeeeeeeeef0Zd+Zied6dd6ed 6ed 6dd 6Zd,Zeeeeeedeeeeeeeeeeeeeeeeedeeeeeeeeedeeeeeeeeeeeeef0Zd-Zied6dd6ed 6ed 6dd 6Zd.ZeeedeeeeeeeeeeeeeeeeeeeefZd/Zied6d d6ed 6ed 6dd 6Zd0Z dddeddeeeeeeeeeeeed d d d eed d d d d ed d d d d d dddeddd d ed d d d d d d eeeef8Z!d1Z"ie d6d d6e!d 6e"d 6dd 6Z#d2Z$d d dd ddeeeeeeeeeeeedddeeedddeded d dd dddddedddeeedddddedeeef8Z%d3Z&ie$d6d d6e%d 6e&d 6dd 6Z'd4Z(eeeeeeddddddd dddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddddeeeeeeeeeeeeedddeeeeeeeeeeeeddddeeeeeeeeeeeeeeddeeeeeeeeeeeeddddeeeeeeeeeeeeeeedeeeeeeeeeeeeddddeeeeeeeeeeeeeeedeeeeeeeeeeeedddeeeeeeeeeeeeeeeeeeeeeeeeeeefZ)d5Z*ie(d6dd6e)d 6e*d 6d d 6Z+d!S(6i(teStartteErrorteItsMeiiiit classTableit classFactort stateTablet charLenTabletBig5tnameiiii i tCP949sEUC-JPsEUC-KRsx-euc-twtGB2312t Shift_JISsUTF-16BEsUTF-16LEi i i iiisUTF-8N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii( iiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iii i i i i i i i i i i i iiii(iiiiiiiiiiiiiiii(,t constantsRRRtBIG5_clstBIG5_sttBig5CharLenTablet Big5SMModelt CP949_clstCP949_sttCP949CharLenTablet CP949SMModelt EUCJP_clstEUCJP_sttEUCJPCharLenTablet EUCJPSMModelt EUCKR_clstEUCKR_sttEUCKRCharLenTablet EUCKRSMModelt EUCTW_clstEUCTW_sttEUCTWCharLenTablet EUCTWSMModelt GB2312_clst GB2312_sttGB2312CharLenTablet GB2312SMModeltSJIS_clstSJIS_sttSJISCharLenTablet SJISSMModelt UCS2BE_clst UCS2BE_sttUCS2BECharLenTablet UCS2BESMModelt UCS2LE_clst UCS2LE_sttUCS2LECharLenTablet UCS2LESMModeltUTF8_clstUTF8_sttUTF8CharLenTablet UTF8SMModel(((s2/usr/lib/python2.7/site-packages/chardet/mbcssm.pytsh  $                 PK[e~R[R['site-packages/chardet/langthaimodel.pycnu[ ۝Rc@s9dZdZied6ed6dd6ed6dd6ZdS(iiiiiijikidiiiiei^iiiliminioiiiiYi_ipiqiiiii@iHiIiriJisitifiQiiuiZigiNiRi`ii[iOiTihiiiaibi\iiiiiiiXiiiiiiiiviiiiiciUiSiiiiiiiiiiiiiiiiiiKiii4i"i3iwi/i:i9i1i5i7i+iii,ii0iiii'i>ii6i-i iii=iii i*i.iiiLiiBi?ii ii$ii i(ii i#iViiiiii ii)ii!ii2i%iiiCiMi&i]iiiDi8i;iAiEi<iFiPiGiWiiiiitcharToOrderMaptprecedenceMatrixg@?tmTypicalPositiveRatiotkeepEnglishLettersTIS-620t charsetNameN(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijikidiiiiei^iiiliminioiiiiYi_ipiqiiiiiiiiiii@iHiIiriJisitifiQiiuiZigiNiRi`ii[iOiTihiiiaibi\iiiiiiiiiiiiXiiiiiiiiviiiiiciUiSiiiiiiiiiiiiiiiiiiKiii4i"i3iwi/i:i9i1i5i7i+iii,ii0iiii'i>ii6i-i iii=iii i*i.iiiLiiBi?ii ii$ii i(ii i#iViiiiii ii)ii!ii2i%iiiCiMi&i]iiiDi8i;iAiEi<iFiPiGiWiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tTIS620CharToOrderMapt ThaiLangModeltFalsetTIS620ThaiModel(((s9/usr/lib/python2.7/site-packages/chardet/langthaimodel.pyt%s* PK[A`[`[)site-packages/chardet/langhebrewmodel.pycnu[ ۝Rc@s9dZdZied6ed6dd6ed6dd6ZdS(iiiiiEi[iOiPi\iYiaiZiDioipiRiIi_iUiNiyiViGiCifikiTirigisi2iJi<i=i*iLiFi@i5iii]i8iAi6i1iBini3i+i,i?iQiMibiKili|iiiii(i:iiiiiiiiiiiSi4i/i.iHi i^iiqiimiiiii"itiividiiiuiwihi}iiiWiciijizi{ii7iiieiiixii0i'i9iii;i)iXi!i%i$iii#ii>iii~iii&i-iiiiiiiiiiiiii iiiiiiiiiiiii iii ii iiiiiii iiii`itcharToOrderMaptprecedenceMatrixg C|?tmTypicalPositiveRatiotkeepEnglishLetters windows-1255t charsetNameN(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiEi[iOiPi\iYiaiZiDioipiRiIi_iUiNiyiViGiCifikiTirigisiiiiiii2iJi<i=i*iLiFi@i5iii]i8iAi6i1iBini3i+i,i?iQiMibiKiliiiiii|iiiii(i:iiiiiiiiiiiSi4i/i.iHi i^iiqiimiiiii"itiividiiiuiwihi}iiiWiciijizi{ii7iiieiiixii0i'i9iii;i)iXi!i%i$iii#ii>iii~iii&i-iiiiiiiiiiiiii iiiiiiiiiiiii iii ii iiiiiii iiiii`i(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(twin1255_CharToOrderMaptHebrewLangModeltFalsetWin1255HebrewModel(((s;/usr/lib/python2.7/site-packages/chardet/langhebrewmodel.pyt&s* PK[;t#H#H!site-packages/chardet/jisfreq.pycnu[ ۝RcP @sdZdZdR ZdQ S(S g@ii(iiiiii'iOii}i ii ii] i i ii iiiiiii iiiiiXi}iiikiig i i ikiiiiiiiiii%i&i0i1i,i-iiiiiii iii<iiipiiiiiiigiiiiWiXii ih i"iiiii i ii\iii i/ ii iiiii0 ii ihi iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii ii!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7iiViji4iiiiBiii8i9i:i;i<i=i>iviiiiSiieiifi iid i+iiiaiw iiiiIii~ii ii?i@iAiBiCiDi ii- i iiiii iiEi^ i. i i3iii iFi/ iYi i iiiji iiGiHiIiJiqii1 iiYiiki/ii2iii#i iii*iiiiiii[ii\i5ii!i!i i%i@ilii'iAii i i4i iiiiii<iiii-iii7iSiii~iKi=iiEii;iii7i7i8imi&iii iiOiKi=i~idiiiLiMiNiOiPiQiRiSiTiUiViYi>iJi"ip ipiiiiiTi_iii.iXiiiLijieii9iPi iliyiii iDiii i)ihi iFi?ii+iiigiciiiBi]iNiii8iji:i5iii7iiiRi4iGidiiiiniihiti6i3i$iWiCi ii: ix iii*iV i iWiXiYiZi[i\i]i^i_i`iiaibicidieifigihiiijikiliminioipiqirisiti iuiviwixiyizi{i|iiiiili}i i~iii i i iiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikii i> i i i i i ij iiiiZi[i\i]ii ii ii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i iiiiiii2 iii{iTiia i i^iii|i i=iimik i i ii iViy i ii iq iiii i iiiii!ii ii ii iiCiOi3iiiiiir iiinii+iiii ipiqi i; iAi iiiCi0 iini iiiTiCioi ii i# iii~iiPiiiiii ii i i$ iz ii i&iiiii iiiii_iiiUii is i ii iIiiiiiiii3 iii$iWi1 i5iPi iiiiiiiX iiiil iiiHii iiiiii i iWii~ipii$iiii@iLi i iiiiuii iJiI iW iii_ii i<iiii]iDiiiiihiiiiiiifi-ii}it ii iiiii,ii ibiiiXiiiFii{ i`iii+i3iqiimii4 iiiiiiBiliX i ii% iii% i2 iuii i iiJii|irii@i iii iii ii iL iiiiiiib iJ i icii iiiiii4 iRiim iTiii iiiiiie iii? i iiiii-i ii*iEi ii+i ii& i iii/iii.isi[ii+ii ii iBic iiiiii i) ii,i iu ii ii9i& iiiiiiv iiY i i3 ii iiiiDiiiiidiii| i(iyiiiii<i8i iiii i id i5 iBiini iiiii|i i!ii)i@ in imi i i0iaiii izi'iii iWii[iviii iii io i i ii iii' ii i"iii9iii iiJiiihiiie iii\iiiip i@iiQi9iiii iiiiw iiiEiiJiIi iiiiiifii ii i i1i ii iii' iri iiii iiici iqiixiii i2iiiii i*iiibiFiiviidi iii!iRiiiQiiiiPiiiiiiii( iii_ ii` iiif ii6 iiAiiia iiiuiTi i2iiiiii i^iCii ii[ii ivi%iiiini!iFiiZi^iiiidiiiix iii]i iBiici i iiiPiqi i iHiY iii( ii iigi}iKi iii4 iiWii iiCig i-idiikii4i} iiq i~ i+i iiihi@ i i i@iA iDi:iiiei iiqiwiiiiiiiidiiZii* iM i[iiisiZ i i ii>ii'i-i i ii ii) iiiiitiFi7 iiti#iiiiiiYiiifikib i1ii ii6ioic iiqi iiii iuii:iiiN iiUi=i iviiliNiiii]ii;iii iiiliLi i}iiiiiB ii8 iQii#i`iTii ixiiri iiiiii ii3iniiiiiii{iii@i iiii9 iiii5 ih id iZ iiiiiiiiiisi-ir iiiii[ ii0iiiii.iSi iRiO iii ii;i i4iy i i;iiz iipii i i ii: i(i|i ii"iiiiii iOiieiiii iC iti) ii6iKiii8iiP iihii ii ii3i$iii* i=ibie ii i4iii i.i7ii\ iiiiji iiiiiiii/iiii i=ii^ii5 i ii i\iiiii9i#i+ i is i,ii7iiiYiii iMii+ ii iQiii6 iiiiiiyi iisi#i{ i iUifi<iiiviii)i iiiiiimi<iii iiigii ilii iD ibiui i iDiBiii i[ i ii8iii>i iii iiii i] iiDiiii6iZii i5ii i i<imi i, i iiui^ i iiigiiiIiiigi ii\i:i iMiti iiEiioiiiiiEiRii iiEij iigiWiiiKi iCii=ii]i$i!ii iiii`iKiviii0iiii^ii i3ii"iiiiiiaik ii; iwiiiiiii iyiiiiiPiii iwiiiit i iii iiiJiaiii]iiii iiiiiLihiiii iu ijiii#iCiii iaii!isi| ii iYii iiiihiOi5iiiziii iSiiLii.ii&ii i< i7iisiA iiiMi iisii*i, i%i i iikii&ifiiOiji"ii(i-ii[iii ii- i=ii} iiiMiSiii iiiii ii i i ii ii~ iiJitikivieiyiiii< i if iiMiki iiioiiiiwiv ilii]iii.i iiii/if iqi$ig iiGiiinii>i6 i= ii iii iNi ixiiei* iih iiii$iiiioibi,ii iiitiii i ii iVii iiiiiiiw iiipiHi iViiii<iZi i8iriwii&ii ii/iiiii>ii> iE ixii&ieiiwi iii5iii ii\iiiiSii iiiii2iiiii+i'ii%iiix iOii iQ iiiiiii_iHiiii igiiiy ii i0i&i+ i iiii il i'ii'izii i ii_ iiii i ii? i ii iiz iim i|i ii ig i0iii ii*ii i i`iwiii i#iici)iiiR i iiiTiiiriiViiii_iiiiiriii i` ixiii iiifiiin i= i*iAii i(iixiiS ii{iT ii9iiiMi iriii;ii(ii%ii[ia ib iiiDiiii- i\ iii iio iEimi)ii!iiic ii, i1ii] iiii>iIiii iTiiii iiiyiikizixiiNi iiii i5i i i"iiHi<id ii iiih i ii ip iii:iLi1iii iii> iiq i?iZiMiIi iiB iK iDii#i i iYi>iiiii`iiiiiiiiiiiii iiiciiiiiiiTiiaii2iyi/ii"iU iiibii ii/ii ii i i{i iij ii ii5i*iiiiiaixiii iiFiiii7 iii i?iiwiiiiii+ii8 ii iNi iii,iinii i i ioisi_i?ii iii i iii?i0i i iiyi3ifi i=iiilii iivi]ii i iiizi iiyijiiui iipiijiii iiiziiir iiiiiiiiiFii'i i{ ini ixiui$iiiiMiiiik iipi i^ iqi i`i|ii ii i| i i i ii i iiii iGi ii-iiZi1iYii- i ieiii[iC iiiie i i.i-iiii iii i i7 ibil i iiii{ii.i i iizii i ii? iii9 ii iiii}ii iaii i iQi idi;iV ii/i^iD ii?im i i i9iIi iii iii i{i}i iiiiii&ii~iiXii i} i ii9i ii:ii"i\iii i_ ii8iWi~ i^i%iPisi iwii ii8 i iLiii. iii iiiNiiiPiiSiiii:iRi'i0ibiii iiiiizii iiiiiKiii i iriiqi iiin iL iiiiiiiiiiXi@ iigiiiii4ii: iiiiri iiQi ii i;i'i i>iibimiiwiiiis iiiiA iit i9 iiiii io i^iii2iiciiii i iriii i!iitii1i{i iiiiiisiiiii iixiiviaip iii iiLiOiiiUi i.iii)i. iiEi i"iiyii iiiii(i iiiq iE i6i i i2iui6i iiii. iii iiiViiisi iiiGiGijitiiWii iii`iiiiui ii ii{iQii iOiCi ii iiJi i i i$iiii/ iii_iiiij iRii7iii/ ii3iDiu i6iXi4iii iiii>iiii0 i`i` i iiiiUii i irii i)ii5iiHii iii~ir ii iiiii iii]iiiiiii i@ iii iaiiviiii/i!i6iiii7iwi i i3ici8ixii iiB iiiM iiiF iigiiii(ii i: iiiHii if iii"i i~iii i iyii i ii i!iNi i4iA iidieiiiziiii iiii0 ii iiiiiii{iii i iifi(iliiGi iii^iB imiF i|iiUiii2iRiii#ii iiiFii iUiiii1i icikiiN iSi iii iii$iO ii iYiiii iiGi iiiW i iC i?i iii~iiiUiFiiiiiiii iC i iiiiei iiiii/ iQi_iv i; i i iPi)iiGimi iiiG i,iIizi_i ii i9inii iAi i iX ii#iVi)i< i%ii}iiiHiw i5iipi.iiiimiiii i#ihi|ibii ii@i(i^izi iiAi i i i"i ig ii|iiiiii6iiXiii,iii iii$i#iIik iiiii:i iiQi ioih iVi$i iitiiiiY i,iii i iD ii i~i i iii%iii iiii ii i i7i/i iiii iEiVii iE iuii&iiii i iioiiiZiiiii i iiiii!iini8ii'iiiiiiii iiGi iRi2iii:ii,iiiZ ilii(iXiP i?ii i ioiiiii iiWi*iii;i8ii&i)ii i ioiiiiiHi_iii0iix ii0 ii; ii iiiXii iii1iiZi*i%i iii|idi`iiiSiji}i\iiiiG i ii ifiqi%iBii1 ipii"iiiii i|iiii iil i2 ii i iii@ihii;iiii ii iii&iiii}ii%i iii i?ii iia iy ii iii ii= i1 ii<ii{i#iiiii iAii iitiii ii> i iKi3 iii=iii\i i i'iAi+igiib iKiiiii ii ii4 ii*iim i ii ioiNii0i(ii ii$i4i i{i iiiQ iiiUiiii,i`ii iii ij i)i ii-i6ii iF i2i)ii i*i iYiZiJiiH iiii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]is i^i_ii`iaibicidi?ieifi@igihi%iiiji ikik i i5 iAi iiliminioiBipiqiri i1 iiCiDit ii isi&iEiFitiiuii i iviwixi iii'iGiyizi i i{iHii|i}ii~i i(iIii)iii iii! iiiJiiiKiiiLiii*iiMiii iiiiiiNi iiii iii+iOi,ii-ii.iii iiiiiiG iiiiiiiiiiiiiiPiiii iiii i/iiQiiii iiiRiiiiii iiiiiiSiiH iTiiUii iiiiiiii iiVi iiWiXiiiiiiiiYii0iiiZiiiiii[i\i]iii^iii_iii`iiaibi? iiciidiiiieii1ii ifiu ii igiii i i2iii[ ii i@ iiiiI iihi" i+iA i iiiii,ijikiz i-ilii.ii/iiiiiiiii3iimiiii iiniD ii iiR iiiiioi ipiJ iil i i4i2 ii i ii ii iB i i ii iiqiriK iii iii i ii5iE i iI ii i6i i iiiv i iii7isi8i i iL iw iii9iitiiiiiii:iiuiiii;iiiiii ii iiiiiii<iiiiiKi i i ix ivi i i ii!i=iii>ii iiiiii iiii?iii@iiiiiiiiiwi ii!i"i"ii#i$i0i%i&i i'i(i)i*i1i+i i,i-i i.i< i#i i/i$i i i0i i1ixi2i3i iyi4iy i5i%i&i i izi6iC i7iz i8i iLi iBi'iAi iiiBii(ii{i|i)iiCi*i i9i i ii:i;i<ii i}i~i=iD i i>ii?i@iAiBiiiiiCiDiDic iiEiFi i iGiiHiIiJiKiLiMiNi{ iOii+iPi3 iQii iRi iEiSiTiUiViiiWiXiYi2iZi[i\i]i^i_i`i iiaibiicidim iE iFieifiigihiiiijikiJ iliminioipiqirisitiuiviwi iGixiyizii,ii-ii.i iMii{iiii i|i iHi}ii~ii/in iIiiii0iJiiKiii# iiiii3iiiiiiiiiiiiiii1iiiii2iM ii3iiiiLiiiiii4iii i ii iMi i4iiii5i i i i6iiiiiiiiiiii iiii7iiiNiiOi iPi| iiiQiii iK i iii ii8ii i} ii i iiii iN i9iiL iRii:i i;iiiF i i{ iiSiiii<iii=ii ii i ii i iiiTiiiii i>iiO i5iiii~ ii?iii ii ii i@i@i i i iii iAii io iiG iiiiii i iii6i iiiii i iiUi ii i iiiiiiiiii iiBiCii7i iiiViiNiiiiDiii iii iiWiiiiXi iiEiFi iiYi iii4 iiiGiiiHin i ip iiZiS iiii[iiciIi i iiiii iii8ii i i9iiiH ii i i\i:i iii iiiiJiiiii ii]iiiii ii i iiiii iiiiiiii i i i i iiiii i ii iiiiiiI iiiiiiiiP iiiii i iiiiKiiiiii i!i^i"i#i i$i i%iLi&i'i(i)i*i+ii,i-i i i.iJ i/i0iQ ii1iMi2i3i4i ii5i6i7i i8i9i:ii;i;iNiOi<i i=iPiQi>i?i@iAiiBiiiCiDi<iiRiEiFii iGiHiIiJiKi ii iSiLiMiii iNiOiPiQiTi iRiR iiSiTiiUiViiS i_iWiXiYiZi[ii\ii]i^i_i`iaibiciidiieiiifi i igihiiiUijikilimi=inioi i`ipiiqiri~isiiitiuiviaiiVi iiWiwiixiyiizii ii{i|i}i i~iM iiibiiiiiXiiiiiiiiiiiiiiiiii ii iiiciiiiidiiiii i i ii iiiiYiiZiei[i iiiT ii+iiiiiii iiiiii>iiiiiiii iiii\iifiii]iiigiiiiii i iiiU i iiiii i^iii_iiii i`iiaiiii iiiiiiihiiijiiiiibi i!iiiiiicii[ii iii iii ii iV ikidiiliii"i#iiiiiiiiei?iiiiiiiifii5 iiiiiiiimiiii@inigiiiii$ii ioiiW iiiipiqiiri ii i i i i\ ii ii iiiihiiiiiiisiiiiiiitiiii i iiiiiiiAiBii! i ii i iiiiiiiii ii iiiiiCiiuiDi6 iijii i i ii ii i iii iikiEi i ii iii iiK ii iiiilii%imi iFiiiiiiiF iviiniiwiiL ixioiiiyiii" iiipiiiii izi iqi!i"i i#iiri$i%iN i&i'ii(i{i i7 i)i*i+i,isi-i i.i/i0i i ii1i i i2ii3i4itii i5i iii6ii&iiii7iq i'iii8i9ii:i|i;i<i=i>i?i@iiAiBiCiDiEiFiiGiHiIi i iJi iX iKiLiMiNiOiPiQiRiSiTiUiiViWiiXiYi iZi[i}i\i]i ii^i i_i6 ii i`iai iGiHii i i(i~ii)ii*iIi i iibiM iciuii i iiidieifi= iivigihiiiijii}ikilimiwini ixioipiqiriisi iiiiitiuii+iiviyi iwi ii,ixiiyi iO iizi iiY i ii9izi{ii$ iiii{iiii7 i i iiJiZ iiii i|i}i~i i8 i i|iii}iiiiiiiiii iiiiiiii~iiiiKii iiiiiiiLii ii-ii iiiiiiiiiiiiiiiiiiii i i] iiii.iiiiiiiiii iiiiiN iiiiP i iir ii ii ii iiMiiiiiiiiii iiiiiO iiiiiNiiiiOiii iiii i ii iiiii iiii ii i i iii[ ii iiiiiiiiiii iPiiiiiiiii iiiiii i/iii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i0iiQiiiiiiiiis iiiiiG i1ii iiiii iiiiiii iiiiRii iiiiii i i\ iii| iiiiii iii i ii iP i2iQ ii i iii iiiii ii iiiiiiiii ii!i ii"ii iii#iii! i ii$ii i!ii"i! i#i$ii%i&i%ii&i'i i'i(i(i)i)i# i*i+i i,i i*i-iiSi+i.ii2 i3iH i ii/i0i1i2i3ii4i,i i} i5i i-iH iR i.i6i! i7i/i8i9i:i0i1i iii;i i<i=i>i?i@iAiBi2iiiCiDiEi~ iFi3iGiQ iiHiiIi iJii" i iKiLiMi4iNiOii# iPiQiRiSiiiTiUi5iViWi i i6i7i i4i8i" i i9iXiYiZi:i[i;i$ iiii\ii i]i^i<i_i i5ii i`iaibicidieiiifi igii=iiihiii iiiji ikilimiii>ini# i6ioipi?iqiirisiTitiuiiiivi ii@iAiiwi iixiiyizi{iUi|i}iBiCiDi3 iEi~iI iiiiiiiiiiiFiiiiiii iiiGiiHiiiiiiiiiiii iiiiii ii ii iiIiiiiiiiJiKiiiiiiiiiLiiiMiiii i iiNiiiii iiT iiiiiiiOiiiiPiiii iiQiiiii7ii8ii9iiiiiii:iiiii iiiiiRiiii;iiSi i iiTiiiiiUi iViiWiii iXiiYiS iiZi[ii iiii iiiiiVi\iWiiU i iii" iiiii ii]iiiii^iiii ii ii_iiii`i$ iaiiiibi] iiiciidiAiieiiiiifiii^ ii<iiiii$ iiiiii^ i_ igiiiii% iiii=ii>iiii% i i?iii iit iiii@iXi` iiiiiihiiiiiiiiiiiYi% iii& i iZiiiT iii i ia ii i i9 i i iiiiiR iii iiiiu iiijikii ili iiiiiiiimiAii: iiiii iiiBiiniiii[ii iiiii ii\i!ioi"ipiii iJ iqi]iii#i$i%i&iCiiri'i(i)i*isiti+i,iii-i.i/i^iui0i i1ii i i2iDio ivi3ii4iwi_ i5i6i ii& i; i7i8ii9iixi:i;ii<i_i& i`i i i i' iii i=iiS i>i?iU i iiiiyizi' ii i( iiiii@iEi iAi` iiV ii{iiW iX iBi( i|i}i i~iii' iCiDi iiEiFiiGiHiIiJiiKib iiiLiaiiiiFiMiiiiNiOiiPiiQi iiii i iRiSi iiTiiUi) iiVii iWiXii) i i8 iYiZi[i\i]i^i iGii i_i`iiiaibicidiiieiibiiiifigihiiiijikiiiilimini iiiY ioipiiqiZ irisiitiuiviwixiyiizii{i|i}i~iiiiiiiiiiiiiiiiiii iiiiii< iiiiiT iiiHiiiiiiiiiiiiiiiv iiiiiiiiiiiiiIiii iiiiiiiiiiiiiiiiiiiiii[ iiiiJiii iiiiiiiii iiiiii iU i ici ii iiii iiiiiiiiii i iiiiiiiiiiiKii iiiiiiiiiic iiiiiiiiiiLiiiiiiiid iiii9 iiiiiiV iii iiiiiiiiiiiiiiiiiiiiii iiiiiiiiidii iii iii i1ii i* iiMiipiii iiiiii iiiiiiiiiiiiiii> iii i iiii iNiiiiiOi* iii( ii iiiiiiii ii i i i+ i i i= iiiiPiiiiiiiiiiiiiiiiii iiiii ii:iiii ii;i, iiiiiiiii iiiiii- iiiiii iiii!i"i#ii$i%i&i'iii(i)i*ii+iie i,i-i.i/iQi0i iii1i2i3i4i5i6i7iii8i9i:i;iRiei<i=i>i?iK ii@iiiAiBi iCiDiEiFiSiGiHiIiJiKiiW iLiMiNiOiPiTiQiiiRiSiiiTiiUiViiUiWiXiYiZi[i\i]i^i_i`i iaiiiibi iicidiieifiigi ihiiif i? iji\ iiiikiliiiimi. i+ inioipiqirisiti iiuivifi, iiiwixiiyiziiiiii{i|i i}i~iii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiViiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO N(P i(iiiiii'iOii}i ii ii] i i ii iiiiiii iiiiiXi}iiikiig i i ikiiiiiiiiii%i&i0i1i,i-iiiiiii iii<iiipiiiiiiigiiiiWiXii ih i"iiiii i ii\iii i/ ii iiiii0 ii ihi iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii ii!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7iiViji4iiiiBiii8i9i:i;i<i=i>iviiiiSiieiifi iid i+iiiaiw iiiiIii~ii ii?i@iAiBiCiDi ii- i iiiii iiEi^ i. i i3iii iFi/ iYi i iiiji iiGiHiIiJiqii1 iiYiiki/ii2iii#i iii*iiiiiii[ii\i5ii!i!i i%i@ilii'iAii i i4i iiiiii<iiii-iii7iSiii~iKi=iiEii;iii7i7i8imi&iii iiOiKi=i~idiiiLiMiNiOiPiQiRiSiTiUiViYi>iJi"ip ipiiiiiTi_iii.iXiiiLijieii9iPi iliyiii iDiii i)ihi iFi?ii+iiigiciiiBi]iNiii8iji:i5iii7iiiRi4iGidiiiiniihiti6i3i$iWiCi ii: ix iii*iV i iWiXiYiZi[i\i]i^i_i`iiaibicidieifigihiiijikiliminioipiqirisiti iuiviwixiyizi{i|iiiiili}i i~iii i i iiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikii i> i i i i i ij iiiiZi[i\i]ii ii ii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i iiiiiii2 iii{iTiia i i^iii|i i=iimik i i ii iViy i ii iq iiii i iiiii!ii ii ii iiCiOi3iiiiiir iiinii+iiii ipiqi i; iAi iiiCi0 iini iiiTiCioi ii i# iii~iiPiiiiii ii i i$ iz ii i&iiiii iiiii_iiiUii is i ii iIiiiiiiii3 iii$iWi1 i5iPi iiiiiiiX iiiil iiiHii iiiiii i iWii~ipii$iiii@iLi i iiiiuii iJiI iW iii_ii i<iiii]iDiiiiihiiiiiiifi-ii}it ii iiiii,ii ibiiiXiiiFii{ i`iii+i3iqiimii4 iiiiiiBiliX i ii% iii% i2 iuii i iiJii|irii@i iii iii ii iL iiiiiiib iJ i icii iiiiii4 iRiim iTiii iiiiiie iii? i iiiii-i ii*iEi ii+i ii& i iii/iii.isi[ii+ii ii iBic iiiiii i) ii,i iu ii ii9i& iiiiiiv iiY i i3 ii iiiiDiiiiidiii| i(iyiiiii<i8i iiii i id i5 iBiini iiiii|i i!ii)i@ in imi i i0iaiii izi'iii iWii[iviii iii io i i ii iii' ii i"iii9iii iiJiiihiiie iii\iiiip i@iiQi9iiii iiiiw iiiEiiJiIi iiiiiifii ii i i1i ii iii' iri iiii iiici iqiixiii i2iiiii i*iiibiFiiviidi iii!iRiiiQiiiiPiiiiiiii( iii_ ii` iiif ii6 iiAiiia iiiuiTi i2iiiiii i^iCii ii[ii ivi%iiiini!iFiiZi^iiiidiiiix iii]i iBiici i iiiPiqi i iHiY iii( ii iigi}iKi iii4 iiWii iiCig i-idiikii4i} iiq i~ i+i iiihi@ i i i@iA iDi:iiiei iiqiwiiiiiiiidiiZii* iM i[iiisiZ i i ii>ii'i-i i ii ii) iiiiitiFi7 iiti#iiiiiiYiiifikib i1ii ii6ioic iiqi iiii iuii:iiiN iiUi=i iviiliNiiii]ii;iii iiiliLi i}iiiiiB ii8 iQii#i`iTii ixiiri iiiiii ii3iniiiiiii{iii@i iiii9 iiii5 ih id iZ iiiiiiiiiisi-ir iiiii[ ii0iiiii.iSi iRiO iii ii;i i4iy i i;iiz iipii i i ii: i(i|i ii"iiiiii iOiieiiii iC iti) ii6iKiii8iiP iihii ii ii3i$iii* i=ibie ii i4iii i.i7ii\ iiiiji iiiiiiii/iiii i=ii^ii5 i ii i\iiiii9i#i+ i is i,ii7iiiYiii iMii+ ii iQiii6 iiiiiiyi iisi#i{ i iUifi<iiiviii)i iiiiiimi<iii iiigii ilii iD ibiui i iDiBiii i[ i ii8iii>i iii iiii i] iiDiiii6iZii i5ii i i<imi i, i iiui^ i iiigiiiIiiigi ii\i:i iMiti iiEiioiiiiiEiRii iiEij iigiWiiiKi iCii=ii]i$i!ii iiii`iKiviii0iiii^ii i3ii"iiiiiiaik ii; iwiiiiiii iyiiiiiPiii iwiiiit i iii iiiJiaiii]iiii iiiiiLihiiii iu ijiii#iCiii iaii!isi| ii iYii iiiihiOi5iiiziii iSiiLii.ii&ii i< i7iisiA iiiMi iisii*i, i%i i iikii&ifiiOiji"ii(i-ii[iii ii- i=ii} iiiMiSiii iiiii ii i i ii ii~ iiJitikivieiyiiii< i if iiMiki iiioiiiiwiv ilii]iii.i iiii/if iqi$ig iiGiiinii>i6 i= ii iii iNi ixiiei* iih iiii$iiiioibi,ii iiitiii i ii iVii iiiiiiiw iiipiHi iViiii<iZi i8iriwii&ii ii/iiiii>ii> iE ixii&ieiiwi iii5iii ii\iiiiSii iiiii2iiiii+i'ii%iiix iOii iQ iiiiiii_iHiiii igiiiy ii i0i&i+ i iiii il i'ii'izii i ii_ iiii i ii? i ii iiz iim i|i ii ig i0iii ii*ii i i`iwiii i#iici)iiiR i iiiTiiiriiViiii_iiiiiriii i` ixiii iiifiiin i= i*iAii i(iixiiS ii{iT ii9iiiMi iriii;ii(ii%ii[ia ib iiiDiiii- i\ iii iio iEimi)ii!iiic ii, i1ii] iiii>iIiii iTiiii iiiyiikizixiiNi iiii i5i i i"iiHi<id ii iiih i ii ip iii:iLi1iii iii> iiq i?iZiMiIi iiB iK iDii#i i iYi>iiiii`iiiiiiiiiiiii iiiciiiiiiiTiiaii2iyi/ii"iU iiibii ii/ii ii i i{i iij ii ii5i*iiiiiaixiii iiFiiii7 iii i?iiwiiiiii+ii8 ii iNi iii,iinii i i ioisi_i?ii iii i iii?i0i i iiyi3ifi i=iiilii iivi]ii i iiizi iiyijiiui iipiijiii iiiziiir iiiiiiiiiFii'i i{ ini ixiui$iiiiMiiiik iipi i^ iqi i`i|ii ii i| i i i ii i iiii iGi ii-iiZi1iYii- i ieiii[iC iiiie i i.i-iiii iii i i7 ibil i iiii{ii.i i iizii i ii? iii9 ii iiii}ii iaii i iQi idi;iV ii/i^iD ii?im i i i9iIi iii iii i{i}i iiiiii&ii~iiXii i} i ii9i ii:ii"i\iii i_ ii8iWi~ i^i%iPisi iwii ii8 i iLiii. iii iiiNiiiPiiSiiii:iRi'i0ibiii iiiiizii iiiiiKiii i iriiqi iiin iL iiiiiiiiiiXi@ iigiiiii4ii: iiiiri iiQi ii i;i'i i>iibimiiwiiiis iiiiA iit i9 iiiii io i^iii2iiciiii i iriii i!iitii1i{i iiiiiisiiiii iixiiviaip iii iiLiOiiiUi i.iii)i. iiEi i"iiyii iiiii(i iiiq iE i6i i i2iui6i iiii. iii iiiViiisi iiiGiGijitiiWii iii`iiiiui ii ii{iQii iOiCi ii iiJi i i i$iiii/ iii_iiiij iRii7iii/ ii3iDiu i6iXi4iii iiii>iiii0 i`i` i iiiiUii i irii i)ii5iiHii iii~ir ii iiiii iii]iiiiiii i@ iii iaiiviiii/i!i6iiii7iwi i i3ici8ixii iiB iiiM iiiF iigiiii(ii i: iiiHii if iii"i i~iii i iyii i ii i!iNi i4iA iidieiiiziiii iiii0 ii iiiiiii{iii i iifi(iliiGi iii^iB imiF i|iiUiii2iRiii#ii iiiFii iUiiii1i icikiiN iSi iii iii$iO ii iYiiii iiGi iiiW i iC i?i iii~iiiUiFiiiiiiii iC i iiiiei iiiii/ iQi_iv i; i i iPi)iiGimi iiiG i,iIizi_i ii i9inii iAi i iX ii#iVi)i< i%ii}iiiHiw i5iipi.iiiimiiii i#ihi|ibii ii@i(i^izi iiAi i i i"i ig ii|iiiiii6iiXiii,iii iii$i#iIik iiiii:i iiQi ioih iVi$i iitiiiiY i,iii i iD ii i~i i iii%iii iiii ii i i7i/i iiii iEiVii iE iuii&iiii i iioiiiZiiiii i iiiii!iini8ii'iiiiiiii iiGi iRi2iii:ii,iiiZ ilii(iXiP i?ii i ioiiiii iiWi*iii;i8ii&i)ii i ioiiiiiHi_iii0iix ii0 ii; ii iiiXii iii1iiZi*i%i iii|idi`iiiSiji}i\iiiiG i ii ifiqi%iBii1 ipii"iiiii i|iiii iil i2 ii i iii@ihii;iiii ii iii&iiii}ii%i iii i?ii iia iy ii iii ii= i1 ii<ii{i#iiiii iAii iitiii ii> i iKi3 iii=iii\i i i'iAi+igiib iKiiiii ii ii4 ii*iim i ii ioiNii0i(ii ii$i4i i{i iiiQ iiiUiiii,i`ii iii ij i)i ii-i6ii iF i2i)ii i*i iYiZiJiiH iiii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]is i^i_ii`iaibicidi?ieifi@igihi%iiiji ikik i i5 iAi iiliminioiBipiqiri i1 iiCiDit ii isi&iEiFitiiuii ii iviwixi iii'iGiyizi i i{iHii|i}ii~i i(iIii)iii iii! iiiJiiiKiiiLiii*iiMiii iiiiiiNi iiii iii+iOi,ii-ii.iii iiiiiiG iiiiiiiiiiiiiiPiiii iiii i/iiQiiii iiiRiiiiii iiiiiiSiiH iTiiUii iiiiiiii iiVi iiWiXiiiiiiiiYii0iiiZiiiiii[i\i]iii^iii_iii`iiaibi? iiciidiiiieii1ii ifiu ii igiii i i2iii[ ii i@ iiiiI iihi" i+iA i iiiii,ijikiz i-ilii.ii/iiiiiiiii3iimiiii iiniD ii iiR iiiiioi ipiJ iil i i4i2 ii i ii ii iB i i ii iiqiriK iii iii i ii5iE i iI ii i6i i iiiv i iii7isi8i i iL iw iii9iitiiiiiii:iiuiiii;iiiiii ii iiiiiii<iiiiiKi i i ix ivi i i ii!i=iii>ii iiiiii iiii?iii@iiiiiiiiiwi ii!i"i"ii#i$i0i%i&i i'i(i)i*i1i+i i,i-i i.i< i#i i/i$i i i0i i1ixi2i3i iyi4iy i5i%i&i i izi6iC i7iz i8i iLi iBi'iAi iiiBii(ii{i|i)iiCi*i i9i i ii:i;i<ii i}i~i=iD i i>ii?i@iAiBiiiiiCiDiDic iiEiFi i iGiiHiIiJiKiLiMiNi{ iOii+iPi3 iQii iRi iEiSiTiUiViiiWiXiYi2iZi[i\i]i^i_i`i iiaibiicidim iE iFieifiigihiiiijikiJ iliminioipiqirisitiuiviwi iGixiyizii,ii-ii.i iMii{iiii i|i iHi}ii~ii/in iIiiii0iJiiKiii# iiiii3iiiiiiiiiiiiiii1iiiii2iM ii3iiiiLiiiiii4iii i ii iMi i4iiii5i i i i6iiiiiiiiiiii iiii7iiiNiiOi iPi| iiiQiii iK i iii ii8ii i} ii i iiii iN i9iiL iRii:i i;iiiF i i{ iiSiiii<iii=ii ii i ii i iiiTiiiii i>iiO i5iiii~ ii?iii ii ii i@i@i i i iii iAii io iiG iiiiii i iii6i iiiii i iiUi ii i iiiiiiiiii iiBiCii7i iiiViiNiiiiDiii iii iiWiiiiXi iiEiFi iiYi iii4 iiiGiiiHin i ip iiZiS iiii[iiciIi i iiiii iii8ii i i9iiiH ii i i\i:i iii iiiiJiiiii ii]iiiii ii i iiiii iiiiiiii i i i i iiiii i ii iiiiiiI iiiiiiiiP iiiii i iiiiKiiiiii i!i^i"i#i i$i i%iLi&i'i(i)i*i+ii,i-i i i.iJ i/i0iQ ii1iMi2i3i4i ii5i6i7i i8i9i:ii;i;iNiOi<i i=iPiQi>i?i@iAiiBiiiCiDi<iiRiEiFii iGiHiIiJiKi ii iSiLiMiii iNiOiPiQiTi iRiR iiSiTiiUiViiS i_iWiXiYiZi[ii\ii]i^i_i`iaibiciidiieiiifi i igihiiiUijikilimi=inioi i`ipiiqiri~isiiitiuiviaiiVi iiWiwiixiyiizii ii{i|i}i i~iM iiibiiiiiXiiiiiiiiiiiiiiiiii ii iiiciiiiidiiiii i i ii iiiiYiiZiei[i iiiT ii+iiiiiii iiiiii>iiiiiiii iiii\iifiii]iiigiiiiii i iiiU i iiiii i^iii_iiii i`iiaiiii iiiiiiihiiijiiiiibi i!iiiiiicii[ii iii iii ii iV ikidiiliii"i#iiiiiiiiei?iiiiiiiifii5 iiiiiiiimiiii@inigiiiii$ii ioiiW iiiipiqiiri ii i i i i\ ii ii iiiihiiiiiiisiiiiiiitiiii i iiiiiiiAiBii! i ii i iiiiiiiii ii iiiiiCiiuiDi6 iijii i i ii ii i iii iikiEi i ii iii iiK ii iiiilii%imi iFiiiiiiiF iviiniiwiiL ixioiiiyiii" iiipiiiii izi iqi!i"i i#iiri$i%iN i&i'ii(i{i i7 i)i*i+i,isi-i i.i/i0i i ii1i i i2ii3i4itii i5i iii6ii&iiii7iq i'iii8i9ii:i|i;i<i=i>i?i@iiAiBiCiDiEiFiiGiHiIi i iJi iX iKiLiMiNiOiPiQiRiSiTiUiiViWiiXiYi iZi[i}i\i]i ii^i i_i6 ii i`iai iGiHii i i(i~ii)ii*iIi i iibiM iciuii i iiidieifi= iivigihiiiijii}ikilimiwini ixioipiqiriisi iiiiitiuii+iiviyi iwi ii,ixiiyi iO iizi iiY i ii9izi{ii$ iiii{iiii7 i i iiJiZ iiii i|i}i~i i8 i i|iii}iiiiiiiiii iiiiiiii~iiiiKii iiiiiiiLii ii-ii iiiiiiiiiiiiiiiiiiii i i] iiii.iiiiiiiiii iiiiiN iiiiP i iir ii ii ii iiMiiiiiiiiii iiiiiO iiiiiNiiiiOiii iiii i ii iiiii iiii ii i i iii[ ii iiiiiiiiiii iPiiiiiiiii iiiiii i/iii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i0iiQiiiiiiiiis iiiiiG i1ii iiiii iiiiiii iiiiRii iiiiii i i\ iii| iiiiii iii i ii iP i2iQ ii i iii iiiii ii iiiiiiiii ii!i ii"ii iii#iii! i ii$ii i!ii"i! i#i$ii%i&i%ii&i'i i'i(i(i)i)i# i*i+i i,i i*i-iiSi+i.ii2 i3iH i ii/i0i1i2i3ii4i,i i} i5i i-iH iR i.i6i! i7i/i8i9i:i0i1i iii;i i<i=i>i?i@iAiBi2iiiCiDiEi~ iFi3iGiQ iiHiiIi iJii" i iKiLiMi4iNiOii# iPiQiRiSiiiTiUi5iViWi i i6i7i i4i8i" i i9iXiYiZi:i[i;i$ iiii\ii i]i^i<i_i i5ii i`iaibicidieiiifi igii=iiihiii iiiji ikilimiii>ini# i6ioipi?iqiirisiTitiuiiiivi ii@iAiiwi iixiiyizi{iUi|i}iBiCiDi3 iEi~iI iiiiiiiiiiiFiiiiiii iiiGiiHiiiiiiiiiiii iiiiii ii ii iiIiiiiiiiJiKiiiiiiiiiLiiiMiiii i iiNiiiii iiT iiiiiiiOiiiiPiiii iiQiiiii7ii8ii9iiiiiii:iiiii iiiiiRiiii;iiSi i iiTiiiiiUi iViiWiii iXiiYiS iiZi[ii iiii iiiiiVi\iWiiU i iii" iiiii ii]iiiii^iiii ii ii_iiii`i$ iaiiiibi] iiiciidiAiieiiiiifiii^ ii<iiiii$ iiiiii^ i_ igiiiii% iiii=ii>iiii% i i?iii iit iiii@iXi` iiiiiihiiiiiiiiiiiYi% iii& i iZiiiT iii i ia ii i i9 i i iiiiiR iii iiiiu iiijikii ili iiiiiiiimiAii: iiiii iiiBiiniiii[ii iiiii ii\i!ioi"ipiii iJ iqi]iii#i$i%i&iCiiri'i(i)i*isiti+i,iii-i.i/i^iui0i i1ii i i2iDio ivi3ii4iwi_ i5i6i ii& i; i7i8ii9iixi:i;ii<i_i& i`i i i i' iii i=iiS i>i?iU i iiiiyizi' ii i( iiiii@iEi iAi` iiV ii{iiW iX iBi( i|i}i i~iii' iCiDi iiEiFiiGiHiIiJiiKib iiiLiaiiiiFiMiiiiNiOiiPiiQi iiii i iRiSi iiTiiUi) iiVii iWiXii) i i8 iYiZi[i\i]i^i iGii i_i`iiiaibicidiiieiibiiiifigihiiiijikiiiilimini iiiY ioipiiqiZ irisiitiuiviwixiyiizii{i|i}i~iiiiiiiiiiiiiiiiiii iiiiii< iiiiiT iiiHiiiiiiiiiiiiiiiv iiiiiiiiiiiiiIiii iiiiiiiiiiiiiiiiiiiiii[ iiiiJiii iiiiiiiii iiiiii iU i ici ii iiii iiiiiiiiii i iiiiiiiiiiiKii iiiiiiiiiic iiiiiiiiiiLiiiiiiiid iiii9 iiiiiiV iii iiiiiiiiiiiiiiiiiiiiii iiiiiiiiidii iii iii i1ii i* iiMiipiii iiiiii iiiiiiiiiiiiiii> iii i iiii iNiiiiiOi* iii( ii iiiiiiii ii i i i+ i i i= iiiiPiiiiiiiiiiiiiiiiii iiiii ii:iiii ii;i, iiiiiiiii iiiiii- iiiiii iiii!i"i#ii$i%i&i'iii(i)i*ii+iie i,i-i.i/iQi0i iii1i2i3i4i5i6i7iii8i9i:i;iRiei<i=i>i?iK ii@iiiAiBi iCiDiEiFiSiGiHiIiJiKiiW iLiMiNiOiPiTiQiiiRiSiiiTiiUiViiUiWiXiYiZi[i\i]i^i_i`i iaiiiibi iicidiieifiigi ihiiif i? iji\ iiiikiliiiimi. i+ inioipiqirisiti iiuivifi, iiiwixiiyiziiiiii{i|i i}i~iii ii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiViiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO (tJIS_TYPICAL_DISTRIBUTION_RATIOtJIS_TABLE_SIZEtJISCharToFreqOrder(((s3/usr/lib/python2.7/site-packages/chardet/jisfreq.pyt,s PK['5a5a,site-packages/chardet/langbulgarianmodel.pyonu[ ۝Rc@shdZdZdZied6ed6dd6ed6dd6Zied6ed6dd6ed6dd6ZdS(iiiiiMiZicidiHimikieiOiiQifiLi^iRiniili[iJiwiTi`ioiisiAiEiFiBi?iDipigi\iihi_iViWiGitiiUi]iaiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii-iiii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=iiCii<i8iii ii iiiiii i iiii iiiiiiiiiiiiKi4ii*ii>iiii:iibiiiiiiixiNi@iSiyiuiXiziYijiIiPiviritcharToOrderMaptprecedenceMatrixg! _B?tmTypicalPositiveRatiotkeepEnglishLetters ISO-8859-5t charsetNames windows-1251N(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMiZicidiHimikieiOiiQifiLi^iRiniili[iJiwiTi`ioiisiiiiiiiAiEiFiBi?iDipigi\iihi_iViWiGitiiUi]iaiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiQiiiiiiiiiiiiii-iiii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=iiCii<i8iii ii iiiiii i iiii iiiiiiiiiiiiKi4ii*ii>iiii:iibiiiiiii[ii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiMiZicidiHimikieiOiiQifiLi^iRiniili[iJiwiTi`ioiisiiiiiiiAiEiFiBi?iDipigi\iihi_iViWiGitiiUi]iaiqiiiiiiiiiiiiiiiiiiixiiiiiiiiiNi@iSiyibiuiiiiiiiiiiiXiiiiiziYijiiiiii-iiiIiPiviriiiiii>i:iiiiiii i#i+i%i,i7i/i(i;i!i.i&i$i)ii'ii"i3i0i1i5i2i6i9i=iiCii<i8iii ii iiiiii i iiii iiiiiiiiiiiiKi4ii*i(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(tLatin5_BulgarianCharToOrderMaptwin1251BulgarianCharToOrderMaptBulgarianLangModeltFalsetLatin5BulgarianModeltWin1251BulgarianModel(((s>/usr/lib/python2.7/site-packages/chardet/langbulgarianmodel.pyt&sV  PK[ MM%site-packages/chardet/euctwprober.pycnu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tEUCTWDistributionAnalysis(t EUCTWSMModelt EUCTWProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pyR"s  cCsdS(NsEUC-TW((R ((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pytget_charset_name(s(t__name__t __module__RR (((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pyR!s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s7/usr/lib/python2.7/site-packages/chardet/euctwprober.pytsPK[ (site-packages/chardet/sbcsgroupprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .charsetgroupprober import CharSetGroupProber from .sbcharsetprober import SingleByteCharSetProber from .langcyrillicmodel import (Win1251CyrillicModel, Koi8rModel, Latin5CyrillicModel, MacCyrillicModel, Ibm866Model, Ibm855Model) from .langgreekmodel import Latin7GreekModel, Win1253GreekModel from .langbulgarianmodel import Latin5BulgarianModel, Win1251BulgarianModel from .langhungarianmodel import Latin2HungarianModel, Win1250HungarianModel from .langthaimodel import TIS620ThaiModel from .langhebrewmodel import Win1255HebrewModel from .hebrewprober import HebrewProber class SBCSGroupProber(CharSetGroupProber): def __init__(self): CharSetGroupProber.__init__(self) self._mProbers = [ SingleByteCharSetProber(Win1251CyrillicModel), SingleByteCharSetProber(Koi8rModel), SingleByteCharSetProber(Latin5CyrillicModel), SingleByteCharSetProber(MacCyrillicModel), SingleByteCharSetProber(Ibm866Model), SingleByteCharSetProber(Ibm855Model), SingleByteCharSetProber(Latin7GreekModel), SingleByteCharSetProber(Win1253GreekModel), SingleByteCharSetProber(Latin5BulgarianModel), SingleByteCharSetProber(Win1251BulgarianModel), SingleByteCharSetProber(Latin2HungarianModel), SingleByteCharSetProber(Win1250HungarianModel), SingleByteCharSetProber(TIS620ThaiModel), ] hebrewProber = HebrewProber() logicalHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, False, hebrewProber) visualHebrewProber = SingleByteCharSetProber(Win1255HebrewModel, True, hebrewProber) hebrewProber.set_model_probers(logicalHebrewProber, visualHebrewProber) self._mProbers.extend([hebrewProber, logicalHebrewProber, visualHebrewProber]) self.reset() PK[Qee*site-packages/chardet/chardistribution.pyonu[ ۝Rc@sOddlmZmZmZddlmZmZmZddlm Z m Z m Z ddl m Z mZmZddlmZmZmZddlmZdZdZd Zd Zd dd YZd efdYZdefdYZdefdYZdefdYZdefdYZdefdYZ dS(i(tEUCTWCharToFreqOrdertEUCTW_TABLE_SIZEt EUCTW_TYPICAL_DISTRIBUTION_RATIO(tEUCKRCharToFreqOrdertEUCKR_TABLE_SIZEt EUCKR_TYPICAL_DISTRIBUTION_RATIO(tGB2312CharToFreqOrdertGB2312_TABLE_SIZEt!GB2312_TYPICAL_DISTRIBUTION_RATIO(tBig5CharToFreqOrdertBIG5_TABLE_SIZEtBIG5_TYPICAL_DISTRIBUTION_RATIO(tJISCharToFreqOrdertJIS_TABLE_SIZEtJIS_TYPICAL_DISTRIBUTION_RATIO(twrap_ordigGz?g{Gz?itCharDistributionAnalysiscBs>eZdZdZdZdZdZdZRS(cCs)d|_d|_d|_|jdS(N(tNonet_mCharToFreqOrdert _mTableSizet_mTypicalDistributionRatiotreset(tself((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyt__init__/s   cCst|_d|_d|_dS(sreset analyser, clear any stateiN(tFalset_mDonet _mTotalCharst _mFreqChars(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR;s  cCs}|dkr|j|}nd}|dkry|jd7_||jkryd|j|krv|jd7_qvqyndS(s"feed a character with known lengthiiiiiN(t get_orderRRRR(RtaBuftaCharLentorder((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pytfeedDs  cCsi|jdks|jtkr"tS|j|jkre|j|j|j|j}|tkre|SntS(s(return confidence based on existing datai(RRtMINIMUM_DATA_THRESHOLDtSURE_NORtSURE_YES(Rtr((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pytget_confidenceRs  cCs |jtkS(N(RtENOUGH_DATA_THRESHOLD(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pytgot_enough_databscCsdS(Ni((RR((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRgs(t__name__t __module__RRR R%R'R(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR.s    tEUCTWDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRRRRRRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRps   cCsBt|d}|dkr:d|dt|ddSdSdS(Niii^iii(R(RRt first_char((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRvs (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR*os tEUCKRDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRRRRRRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCsBt|d}|dkr:d|dt|ddSdSdS(Niii^iii(R(RRR+((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR,s tGB2312DistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRRRRRRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCsUt|dt|d}}|dkrM|dkrMd|d|dSdSdS(Niiiii^i(R(RRR+t second_char((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs!(R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR-s tBig5DistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRR RR RR R(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCspt|dt|d}}|dkrh|dkrQd|d|ddSd|d|dSndSdS( Niiiiii?i@i(R(RRR+R.((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs !  (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR/s tSJISDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRR RR RRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCst|dt|d}}|dkrJ|dkrJd|d}n1|dkrw|dkrwd|dd}nd S||d }|d krd }n|S( Niiiiiiiiii@i(R(RRR+R.R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs!  (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR0s tEUCJPDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRR RR RRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCsBt|d}|dkr:d|dt|ddSdSdS(Niii^iii(R(RRtchar((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR1s N((!t euctwfreqRRRt euckrfreqRRRt gb2312freqRRRtbig5freqR R R tjisfreqR R RtcompatRR&R#R"R!RR*R,R-R/R0R1(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyts APK[ݘ$site-packages/chardet/chardetect.pycnu[ L]c@skdZddlmZddlmZmZddlmZddZdZ e dkrge nd S( s Script which takes one or more file paths and reports on their detected encodings Example:: % chardetect somefile someotherfile somefile: windows-1252 with confidence 0.5 someotherfile: ascii with confidence 1.0 If no paths are provided, it takes its input from stdin. i(topen(targvtstdin(tUniversalDetectorRcCsit}x|D]}|j|qW|j|j}|dr]d||d|dfSd|SdS(s;Return a string describing the probable encoding of a file.tencodings%s: %s with confidence %st confidences %s: no resultN(Rtfeedtclosetresult(tfiletnametutlineR((s6/usr/lib/python2.7/site-packages/chardet/chardetect.pytdescription_ofs      cCs_ttdkr ttGHn;x8tdD],}t|d}t||GHWdQXq+WdS(Nitrb(tlenRR RR(tpathtf((s6/usr/lib/python2.7/site-packages/chardet/chardetect.pytmain#s t__main__N( t__doc__tioRtsysRRtchardet.universaldetectorRR Rt__name__(((s6/usr/lib/python2.7/site-packages/chardet/chardetect.pyt s  PK[Qee*site-packages/chardet/chardistribution.pycnu[ ۝Rc@sOddlmZmZmZddlmZmZmZddlm Z m Z m Z ddl m Z mZmZddlmZmZmZddlmZdZdZd Zd Zd dd YZd efdYZdefdYZdefdYZdefdYZdefdYZdefdYZ dS(i(tEUCTWCharToFreqOrdertEUCTW_TABLE_SIZEt EUCTW_TYPICAL_DISTRIBUTION_RATIO(tEUCKRCharToFreqOrdertEUCKR_TABLE_SIZEt EUCKR_TYPICAL_DISTRIBUTION_RATIO(tGB2312CharToFreqOrdertGB2312_TABLE_SIZEt!GB2312_TYPICAL_DISTRIBUTION_RATIO(tBig5CharToFreqOrdertBIG5_TABLE_SIZEtBIG5_TYPICAL_DISTRIBUTION_RATIO(tJISCharToFreqOrdertJIS_TABLE_SIZEtJIS_TYPICAL_DISTRIBUTION_RATIO(twrap_ordigGz?g{Gz?itCharDistributionAnalysiscBs>eZdZdZdZdZdZdZRS(cCs)d|_d|_d|_|jdS(N(tNonet_mCharToFreqOrdert _mTableSizet_mTypicalDistributionRatiotreset(tself((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyt__init__/s   cCst|_d|_d|_dS(sreset analyser, clear any stateiN(tFalset_mDonet _mTotalCharst _mFreqChars(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR;s  cCs}|dkr|j|}nd}|dkry|jd7_||jkryd|j|krv|jd7_qvqyndS(s"feed a character with known lengthiiiiiN(t get_orderRRRR(RtaBuftaCharLentorder((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pytfeedDs  cCsi|jdks|jtkr"tS|j|jkre|j|j|j|j}|tkre|SntS(s(return confidence based on existing datai(RRtMINIMUM_DATA_THRESHOLDtSURE_NORtSURE_YES(Rtr((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pytget_confidenceRs  cCs |jtkS(N(RtENOUGH_DATA_THRESHOLD(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pytgot_enough_databscCsdS(Ni((RR((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRgs(t__name__t __module__RRR R%R'R(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR.s    tEUCTWDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRRRRRRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRps   cCsBt|d}|dkr:d|dt|ddSdSdS(Niii^iii(R(RRt first_char((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRvs (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR*os tEUCKRDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRRRRRRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCsBt|d}|dkr:d|dt|ddSdSdS(Niii^iii(R(RRR+((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR,s tGB2312DistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRRRRRRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCsUt|dt|d}}|dkrM|dkrMd|d|dSdSdS(Niiiii^i(R(RRR+t second_char((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs!(R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR-s tBig5DistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRR RR RR R(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCspt|dt|d}}|dkrh|dkrQd|d|ddSd|d|dSndSdS( Niiiiii?i@i(R(RRR+R.((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs !  (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR/s tSJISDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRR RR RRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCst|dt|d}}|dkrJ|dkrJd|d}n1|dkrw|dkrwd|dd}nd S||d }|d krd }n|S( Niiiiiiiiii@i(R(RRR+R.R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs!  (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR0s tEUCJPDistributionAnalysiscBseZdZdZRS(cCs,tj|t|_t|_t|_dS(N(RRR RR RRR(R((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs   cCsBt|d}|dkr:d|dt|ddSdSdS(Niii^iii(R(RRtchar((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyRs (R(R)RR(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyR1s N((!t euctwfreqRRRt euckrfreqRRRt gb2312freqRRRtbig5freqR R R tjisfreqR R RtcompatRR&R#R"R!RR*R,R-R/R0R1(((s</usr/lib/python2.7/site-packages/chardet/chardistribution.pyts APK[ 9site-packages/chardet/compat.pynu[######################## BEGIN LICENSE BLOCK ######################## # Contributor(s): # Ian Cordasco - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### import sys if sys.version_info < (3, 0): base_str = (str, unicode) else: base_str = (bytes, str) def wrap_ord(a): if sys.version_info < (3, 0) and isinstance(a, base_str): return ord(a) else: return a PK[ӸӸ site-packages/chardet/jisfreq.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # Sampling from about 20M text materials include literature and computer technology # # Japanese frequency table, applied to both S-JIS and EUC-JP # They are sorted in order. # 128 --> 0.77094 # 256 --> 0.85710 # 512 --> 0.92635 # 1024 --> 0.97130 # 2048 --> 0.99431 # # Ideal Distribution Ratio = 0.92635 / (1-0.92635) = 12.58 # Random Distribution Ration = 512 / (2965+62+83+86-512) = 0.191 # # Typical Distribution Ratio, 25% of IDR JIS_TYPICAL_DISTRIBUTION_RATIO = 3.0 # Char to FreqOrder table , JIS_TABLE_SIZE = 4368 JISCharToFreqOrder = ( 40, 1, 6, 182, 152, 180, 295,2127, 285, 381,3295,4304,3068,4606,3165,3510, # 16 3511,1822,2785,4607,1193,2226,5070,4608, 171,2996,1247, 18, 179,5071, 856,1661, # 32 1262,5072, 619, 127,3431,3512,3230,1899,1700, 232, 228,1294,1298, 284, 283,2041, # 48 2042,1061,1062, 48, 49, 44, 45, 433, 434,1040,1041, 996, 787,2997,1255,4305, # 64 2108,4609,1684,1648,5073,5074,5075,5076,5077,5078,3687,5079,4610,5080,3927,3928, # 80 5081,3296,3432, 290,2285,1471,2187,5082,2580,2825,1303,2140,1739,1445,2691,3375, # 96 1691,3297,4306,4307,4611, 452,3376,1182,2713,3688,3069,4308,5083,5084,5085,5086, # 112 5087,5088,5089,5090,5091,5092,5093,5094,5095,5096,5097,5098,5099,5100,5101,5102, # 128 5103,5104,5105,5106,5107,5108,5109,5110,5111,5112,4097,5113,5114,5115,5116,5117, # 144 5118,5119,5120,5121,5122,5123,5124,5125,5126,5127,5128,5129,5130,5131,5132,5133, # 160 5134,5135,5136,5137,5138,5139,5140,5141,5142,5143,5144,5145,5146,5147,5148,5149, # 176 5150,5151,5152,4612,5153,5154,5155,5156,5157,5158,5159,5160,5161,5162,5163,5164, # 192 5165,5166,5167,5168,5169,5170,5171,5172,5173,5174,5175,1472, 598, 618, 820,1205, # 208 1309,1412,1858,1307,1692,5176,5177,5178,5179,5180,5181,5182,1142,1452,1234,1172, # 224 1875,2043,2149,1793,1382,2973, 925,2404,1067,1241, 960,1377,2935,1491, 919,1217, # 240 1865,2030,1406,1499,2749,4098,5183,5184,5185,5186,5187,5188,2561,4099,3117,1804, # 256 2049,3689,4309,3513,1663,5189,3166,3118,3298,1587,1561,3433,5190,3119,1625,2998, # 272 3299,4613,1766,3690,2786,4614,5191,5192,5193,5194,2161, 26,3377, 2,3929, 20, # 288 3691, 47,4100, 50, 17, 16, 35, 268, 27, 243, 42, 155, 24, 154, 29, 184, # 304 4, 91, 14, 92, 53, 396, 33, 289, 9, 37, 64, 620, 21, 39, 321, 5, # 320 12, 11, 52, 13, 3, 208, 138, 0, 7, 60, 526, 141, 151,1069, 181, 275, # 336 1591, 83, 132,1475, 126, 331, 829, 15, 69, 160, 59, 22, 157, 55,1079, 312, # 352 109, 38, 23, 25, 10, 19, 79,5195, 61, 382,1124, 8, 30,5196,5197,5198, # 368 5199,5200,5201,5202,5203,5204,5205,5206, 89, 62, 74, 34,2416, 112, 139, 196, # 384 271, 149, 84, 607, 131, 765, 46, 88, 153, 683, 76, 874, 101, 258, 57, 80, # 400 32, 364, 121,1508, 169,1547, 68, 235, 145,2999, 41, 360,3027, 70, 63, 31, # 416 43, 259, 262,1383, 99, 533, 194, 66, 93, 846, 217, 192, 56, 106, 58, 565, # 432 280, 272, 311, 256, 146, 82, 308, 71, 100, 128, 214, 655, 110, 261, 104,1140, # 448 54, 51, 36, 87, 67,3070, 185,2618,2936,2020, 28,1066,2390,2059,5207,5208, # 464 5209,5210,5211,5212,5213,5214,5215,5216,4615,5217,5218,5219,5220,5221,5222,5223, # 480 5224,5225,5226,5227,5228,5229,5230,5231,5232,5233,5234,5235,5236,3514,5237,5238, # 496 5239,5240,5241,5242,5243,5244,2297,2031,4616,4310,3692,5245,3071,5246,3598,5247, # 512 4617,3231,3515,5248,4101,4311,4618,3808,4312,4102,5249,4103,4104,3599,5250,5251, # 528 5252,5253,5254,5255,5256,5257,5258,5259,5260,5261,5262,5263,5264,5265,5266,5267, # 544 5268,5269,5270,5271,5272,5273,5274,5275,5276,5277,5278,5279,5280,5281,5282,5283, # 560 5284,5285,5286,5287,5288,5289,5290,5291,5292,5293,5294,5295,5296,5297,5298,5299, # 576 5300,5301,5302,5303,5304,5305,5306,5307,5308,5309,5310,5311,5312,5313,5314,5315, # 592 5316,5317,5318,5319,5320,5321,5322,5323,5324,5325,5326,5327,5328,5329,5330,5331, # 608 5332,5333,5334,5335,5336,5337,5338,5339,5340,5341,5342,5343,5344,5345,5346,5347, # 624 5348,5349,5350,5351,5352,5353,5354,5355,5356,5357,5358,5359,5360,5361,5362,5363, # 640 5364,5365,5366,5367,5368,5369,5370,5371,5372,5373,5374,5375,5376,5377,5378,5379, # 656 5380,5381, 363, 642,2787,2878,2788,2789,2316,3232,2317,3434,2011, 165,1942,3930, # 672 3931,3932,3933,5382,4619,5383,4620,5384,5385,5386,5387,5388,5389,5390,5391,5392, # 688 5393,5394,5395,5396,5397,5398,5399,5400,5401,5402,5403,5404,5405,5406,5407,5408, # 704 5409,5410,5411,5412,5413,5414,5415,5416,5417,5418,5419,5420,5421,5422,5423,5424, # 720 5425,5426,5427,5428,5429,5430,5431,5432,5433,5434,5435,5436,5437,5438,5439,5440, # 736 5441,5442,5443,5444,5445,5446,5447,5448,5449,5450,5451,5452,5453,5454,5455,5456, # 752 5457,5458,5459,5460,5461,5462,5463,5464,5465,5466,5467,5468,5469,5470,5471,5472, # 768 5473,5474,5475,5476,5477,5478,5479,5480,5481,5482,5483,5484,5485,5486,5487,5488, # 784 5489,5490,5491,5492,5493,5494,5495,5496,5497,5498,5499,5500,5501,5502,5503,5504, # 800 5505,5506,5507,5508,5509,5510,5511,5512,5513,5514,5515,5516,5517,5518,5519,5520, # 816 5521,5522,5523,5524,5525,5526,5527,5528,5529,5530,5531,5532,5533,5534,5535,5536, # 832 5537,5538,5539,5540,5541,5542,5543,5544,5545,5546,5547,5548,5549,5550,5551,5552, # 848 5553,5554,5555,5556,5557,5558,5559,5560,5561,5562,5563,5564,5565,5566,5567,5568, # 864 5569,5570,5571,5572,5573,5574,5575,5576,5577,5578,5579,5580,5581,5582,5583,5584, # 880 5585,5586,5587,5588,5589,5590,5591,5592,5593,5594,5595,5596,5597,5598,5599,5600, # 896 5601,5602,5603,5604,5605,5606,5607,5608,5609,5610,5611,5612,5613,5614,5615,5616, # 912 5617,5618,5619,5620,5621,5622,5623,5624,5625,5626,5627,5628,5629,5630,5631,5632, # 928 5633,5634,5635,5636,5637,5638,5639,5640,5641,5642,5643,5644,5645,5646,5647,5648, # 944 5649,5650,5651,5652,5653,5654,5655,5656,5657,5658,5659,5660,5661,5662,5663,5664, # 960 5665,5666,5667,5668,5669,5670,5671,5672,5673,5674,5675,5676,5677,5678,5679,5680, # 976 5681,5682,5683,5684,5685,5686,5687,5688,5689,5690,5691,5692,5693,5694,5695,5696, # 992 5697,5698,5699,5700,5701,5702,5703,5704,5705,5706,5707,5708,5709,5710,5711,5712, # 1008 5713,5714,5715,5716,5717,5718,5719,5720,5721,5722,5723,5724,5725,5726,5727,5728, # 1024 5729,5730,5731,5732,5733,5734,5735,5736,5737,5738,5739,5740,5741,5742,5743,5744, # 1040 5745,5746,5747,5748,5749,5750,5751,5752,5753,5754,5755,5756,5757,5758,5759,5760, # 1056 5761,5762,5763,5764,5765,5766,5767,5768,5769,5770,5771,5772,5773,5774,5775,5776, # 1072 5777,5778,5779,5780,5781,5782,5783,5784,5785,5786,5787,5788,5789,5790,5791,5792, # 1088 5793,5794,5795,5796,5797,5798,5799,5800,5801,5802,5803,5804,5805,5806,5807,5808, # 1104 5809,5810,5811,5812,5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824, # 1120 5825,5826,5827,5828,5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840, # 1136 5841,5842,5843,5844,5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856, # 1152 5857,5858,5859,5860,5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872, # 1168 5873,5874,5875,5876,5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888, # 1184 5889,5890,5891,5892,5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904, # 1200 5905,5906,5907,5908,5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920, # 1216 5921,5922,5923,5924,5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936, # 1232 5937,5938,5939,5940,5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952, # 1248 5953,5954,5955,5956,5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968, # 1264 5969,5970,5971,5972,5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984, # 1280 5985,5986,5987,5988,5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000, # 1296 6001,6002,6003,6004,6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016, # 1312 6017,6018,6019,6020,6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032, # 1328 6033,6034,6035,6036,6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048, # 1344 6049,6050,6051,6052,6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064, # 1360 6065,6066,6067,6068,6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080, # 1376 6081,6082,6083,6084,6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096, # 1392 6097,6098,6099,6100,6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112, # 1408 6113,6114,2044,2060,4621, 997,1235, 473,1186,4622, 920,3378,6115,6116, 379,1108, # 1424 4313,2657,2735,3934,6117,3809, 636,3233, 573,1026,3693,3435,2974,3300,2298,4105, # 1440 854,2937,2463, 393,2581,2417, 539, 752,1280,2750,2480, 140,1161, 440, 708,1569, # 1456 665,2497,1746,1291,1523,3000, 164,1603, 847,1331, 537,1997, 486, 508,1693,2418, # 1472 1970,2227, 878,1220, 299,1030, 969, 652,2751, 624,1137,3301,2619, 65,3302,2045, # 1488 1761,1859,3120,1930,3694,3516, 663,1767, 852, 835,3695, 269, 767,2826,2339,1305, # 1504 896,1150, 770,1616,6118, 506,1502,2075,1012,2519, 775,2520,2975,2340,2938,4314, # 1520 3028,2086,1224,1943,2286,6119,3072,4315,2240,1273,1987,3935,1557, 175, 597, 985, # 1536 3517,2419,2521,1416,3029, 585, 938,1931,1007,1052,1932,1685,6120,3379,4316,4623, # 1552 804, 599,3121,1333,2128,2539,1159,1554,2032,3810, 687,2033,2904, 952, 675,1467, # 1568 3436,6121,2241,1096,1786,2440,1543,1924, 980,1813,2228, 781,2692,1879, 728,1918, # 1584 3696,4624, 548,1950,4625,1809,1088,1356,3303,2522,1944, 502, 972, 373, 513,2827, # 1600 586,2377,2391,1003,1976,1631,6122,2464,1084, 648,1776,4626,2141, 324, 962,2012, # 1616 2177,2076,1384, 742,2178,1448,1173,1810, 222, 102, 301, 445, 125,2420, 662,2498, # 1632 277, 200,1476,1165,1068, 224,2562,1378,1446, 450,1880, 659, 791, 582,4627,2939, # 1648 3936,1516,1274, 555,2099,3697,1020,1389,1526,3380,1762,1723,1787,2229, 412,2114, # 1664 1900,2392,3518, 512,2597, 427,1925,2341,3122,1653,1686,2465,2499, 697, 330, 273, # 1680 380,2162, 951, 832, 780, 991,1301,3073, 965,2270,3519, 668,2523,2636,1286, 535, # 1696 1407, 518, 671, 957,2658,2378, 267, 611,2197,3030,6123, 248,2299, 967,1799,2356, # 1712 850,1418,3437,1876,1256,1480,2828,1718,6124,6125,1755,1664,2405,6126,4628,2879, # 1728 2829, 499,2179, 676,4629, 557,2329,2214,2090, 325,3234, 464, 811,3001, 992,2342, # 1744 2481,1232,1469, 303,2242, 466,1070,2163, 603,1777,2091,4630,2752,4631,2714, 322, # 1760 2659,1964,1768, 481,2188,1463,2330,2857,3600,2092,3031,2421,4632,2318,2070,1849, # 1776 2598,4633,1302,2254,1668,1701,2422,3811,2905,3032,3123,2046,4106,1763,1694,4634, # 1792 1604, 943,1724,1454, 917, 868,2215,1169,2940, 552,1145,1800,1228,1823,1955, 316, # 1808 1080,2510, 361,1807,2830,4107,2660,3381,1346,1423,1134,4108,6127, 541,1263,1229, # 1824 1148,2540, 545, 465,1833,2880,3438,1901,3074,2482, 816,3937, 713,1788,2500, 122, # 1840 1575, 195,1451,2501,1111,6128, 859, 374,1225,2243,2483,4317, 390,1033,3439,3075, # 1856 2524,1687, 266, 793,1440,2599, 946, 779, 802, 507, 897,1081, 528,2189,1292, 711, # 1872 1866,1725,1167,1640, 753, 398,2661,1053, 246, 348,4318, 137,1024,3440,1600,2077, # 1888 2129, 825,4319, 698, 238, 521, 187,2300,1157,2423,1641,1605,1464,1610,1097,2541, # 1904 1260,1436, 759,2255,1814,2150, 705,3235, 409,2563,3304, 561,3033,2005,2564, 726, # 1920 1956,2343,3698,4109, 949,3812,3813,3520,1669, 653,1379,2525, 881,2198, 632,2256, # 1936 1027, 778,1074, 733,1957, 514,1481,2466, 554,2180, 702,3938,1606,1017,1398,6129, # 1952 1380,3521, 921, 993,1313, 594, 449,1489,1617,1166, 768,1426,1360, 495,1794,3601, # 1968 1177,3602,1170,4320,2344, 476, 425,3167,4635,3168,1424, 401,2662,1171,3382,1998, # 1984 1089,4110, 477,3169, 474,6130,1909, 596,2831,1842, 494, 693,1051,1028,1207,3076, # 2000 606,2115, 727,2790,1473,1115, 743,3522, 630, 805,1532,4321,2021, 366,1057, 838, # 2016 684,1114,2142,4322,2050,1492,1892,1808,2271,3814,2424,1971,1447,1373,3305,1090, # 2032 1536,3939,3523,3306,1455,2199, 336, 369,2331,1035, 584,2393, 902, 718,2600,6131, # 2048 2753, 463,2151,1149,1611,2467, 715,1308,3124,1268, 343,1413,3236,1517,1347,2663, # 2064 2093,3940,2022,1131,1553,2100,2941,1427,3441,2942,1323,2484,6132,1980, 872,2368, # 2080 2441,2943, 320,2369,2116,1082, 679,1933,3941,2791,3815, 625,1143,2023, 422,2200, # 2096 3816,6133, 730,1695, 356,2257,1626,2301,2858,2637,1627,1778, 937, 883,2906,2693, # 2112 3002,1769,1086, 400,1063,1325,3307,2792,4111,3077, 456,2345,1046, 747,6134,1524, # 2128 884,1094,3383,1474,2164,1059, 974,1688,2181,2258,1047, 345,1665,1187, 358, 875, # 2144 3170, 305, 660,3524,2190,1334,1135,3171,1540,1649,2542,1527, 927, 968,2793, 885, # 2160 1972,1850, 482, 500,2638,1218,1109,1085,2543,1654,2034, 876, 78,2287,1482,1277, # 2176 861,1675,1083,1779, 724,2754, 454, 397,1132,1612,2332, 893, 672,1237, 257,2259, # 2192 2370, 135,3384, 337,2244, 547, 352, 340, 709,2485,1400, 788,1138,2511, 540, 772, # 2208 1682,2260,2272,2544,2013,1843,1902,4636,1999,1562,2288,4637,2201,1403,1533, 407, # 2224 576,3308,1254,2071, 978,3385, 170, 136,1201,3125,2664,3172,2394, 213, 912, 873, # 2240 3603,1713,2202, 699,3604,3699, 813,3442, 493, 531,1054, 468,2907,1483, 304, 281, # 2256 4112,1726,1252,2094, 339,2319,2130,2639, 756,1563,2944, 748, 571,2976,1588,2425, # 2272 2715,1851,1460,2426,1528,1392,1973,3237, 288,3309, 685,3386, 296, 892,2716,2216, # 2288 1570,2245, 722,1747,2217, 905,3238,1103,6135,1893,1441,1965, 251,1805,2371,3700, # 2304 2601,1919,1078, 75,2182,1509,1592,1270,2640,4638,2152,6136,3310,3817, 524, 706, # 2320 1075, 292,3818,1756,2602, 317, 98,3173,3605,3525,1844,2218,3819,2502, 814, 567, # 2336 385,2908,1534,6137, 534,1642,3239, 797,6138,1670,1529, 953,4323, 188,1071, 538, # 2352 178, 729,3240,2109,1226,1374,2000,2357,2977, 731,2468,1116,2014,2051,6139,1261, # 2368 1593, 803,2859,2736,3443, 556, 682, 823,1541,6140,1369,2289,1706,2794, 845, 462, # 2384 2603,2665,1361, 387, 162,2358,1740, 739,1770,1720,1304,1401,3241,1049, 627,1571, # 2400 2427,3526,1877,3942,1852,1500, 431,1910,1503, 677, 297,2795, 286,1433,1038,1198, # 2416 2290,1133,1596,4113,4639,2469,1510,1484,3943,6141,2442, 108, 712,4640,2372, 866, # 2432 3701,2755,3242,1348, 834,1945,1408,3527,2395,3243,1811, 824, 994,1179,2110,1548, # 2448 1453, 790,3003, 690,4324,4325,2832,2909,3820,1860,3821, 225,1748, 310, 346,1780, # 2464 2470, 821,1993,2717,2796, 828, 877,3528,2860,2471,1702,2165,2910,2486,1789, 453, # 2480 359,2291,1676, 73,1164,1461,1127,3311, 421, 604, 314,1037, 589, 116,2487, 737, # 2496 837,1180, 111, 244, 735,6142,2261,1861,1362, 986, 523, 418, 581,2666,3822, 103, # 2512 855, 503,1414,1867,2488,1091, 657,1597, 979, 605,1316,4641,1021,2443,2078,2001, # 2528 1209, 96, 587,2166,1032, 260,1072,2153, 173, 94, 226,3244, 819,2006,4642,4114, # 2544 2203, 231,1744, 782, 97,2667, 786,3387, 887, 391, 442,2219,4326,1425,6143,2694, # 2560 633,1544,1202, 483,2015, 592,2052,1958,2472,1655, 419, 129,4327,3444,3312,1714, # 2576 1257,3078,4328,1518,1098, 865,1310,1019,1885,1512,1734, 469,2444, 148, 773, 436, # 2592 1815,1868,1128,1055,4329,1245,2756,3445,2154,1934,1039,4643, 579,1238, 932,2320, # 2608 353, 205, 801, 115,2428, 944,2321,1881, 399,2565,1211, 678, 766,3944, 335,2101, # 2624 1459,1781,1402,3945,2737,2131,1010, 844, 981,1326,1013, 550,1816,1545,2620,1335, # 2640 1008, 371,2881, 936,1419,1613,3529,1456,1395,2273,1834,2604,1317,2738,2503, 416, # 2656 1643,4330, 806,1126, 229, 591,3946,1314,1981,1576,1837,1666, 347,1790, 977,3313, # 2672 764,2861,1853, 688,2429,1920,1462, 77, 595, 415,2002,3034, 798,1192,4115,6144, # 2688 2978,4331,3035,2695,2582,2072,2566, 430,2430,1727, 842,1396,3947,3702, 613, 377, # 2704 278, 236,1417,3388,3314,3174, 757,1869, 107,3530,6145,1194, 623,2262, 207,1253, # 2720 2167,3446,3948, 492,1117,1935, 536,1838,2757,1246,4332, 696,2095,2406,1393,1572, # 2736 3175,1782, 583, 190, 253,1390,2230, 830,3126,3389, 934,3245,1703,1749,2979,1870, # 2752 2545,1656,2204, 869,2346,4116,3176,1817, 496,1764,4644, 942,1504, 404,1903,1122, # 2768 1580,3606,2945,1022, 515, 372,1735, 955,2431,3036,6146,2797,1110,2302,2798, 617, # 2784 6147, 441, 762,1771,3447,3607,3608,1904, 840,3037, 86, 939,1385, 572,1370,2445, # 2800 1336, 114,3703, 898, 294, 203,3315, 703,1583,2274, 429, 961,4333,1854,1951,3390, # 2816 2373,3704,4334,1318,1381, 966,1911,2322,1006,1155, 309, 989, 458,2718,1795,1372, # 2832 1203, 252,1689,1363,3177, 517,1936, 168,1490, 562, 193,3823,1042,4117,1835, 551, # 2848 470,4645, 395, 489,3448,1871,1465,2583,2641, 417,1493, 279,1295, 511,1236,1119, # 2864 72,1231,1982,1812,3004, 871,1564, 984,3449,1667,2696,2096,4646,2347,2833,1673, # 2880 3609, 695,3246,2668, 807,1183,4647, 890, 388,2333,1801,1457,2911,1765,1477,1031, # 2896 3316,3317,1278,3391,2799,2292,2526, 163,3450,4335,2669,1404,1802,6148,2323,2407, # 2912 1584,1728,1494,1824,1269, 298, 909,3318,1034,1632, 375, 776,1683,2061, 291, 210, # 2928 1123, 809,1249,1002,2642,3038, 206,1011,2132, 144, 975, 882,1565, 342, 667, 754, # 2944 1442,2143,1299,2303,2062, 447, 626,2205,1221,2739,2912,1144,1214,2206,2584, 760, # 2960 1715, 614, 950,1281,2670,2621, 810, 577,1287,2546,4648, 242,2168, 250,2643, 691, # 2976 123,2644, 647, 313,1029, 689,1357,2946,1650, 216, 771,1339,1306, 808,2063, 549, # 2992 913,1371,2913,2914,6149,1466,1092,1174,1196,1311,2605,2396,1783,1796,3079, 406, # 3008 2671,2117,3949,4649, 487,1825,2220,6150,2915, 448,2348,1073,6151,2397,1707, 130, # 3024 900,1598, 329, 176,1959,2527,1620,6152,2275,4336,3319,1983,2191,3705,3610,2155, # 3040 3706,1912,1513,1614,6153,1988, 646, 392,2304,1589,3320,3039,1826,1239,1352,1340, # 3056 2916, 505,2567,1709,1437,2408,2547, 906,6154,2672, 384,1458,1594,1100,1329, 710, # 3072 423,3531,2064,2231,2622,1989,2673,1087,1882, 333, 841,3005,1296,2882,2379, 580, # 3088 1937,1827,1293,2585, 601, 574, 249,1772,4118,2079,1120, 645, 901,1176,1690, 795, # 3104 2207, 478,1434, 516,1190,1530, 761,2080, 930,1264, 355, 435,1552, 644,1791, 987, # 3120 220,1364,1163,1121,1538, 306,2169,1327,1222, 546,2645, 218, 241, 610,1704,3321, # 3136 1984,1839,1966,2528, 451,6155,2586,3707,2568, 907,3178, 254,2947, 186,1845,4650, # 3152 745, 432,1757, 428,1633, 888,2246,2221,2489,3611,2118,1258,1265, 956,3127,1784, # 3168 4337,2490, 319, 510, 119, 457,3612, 274,2035,2007,4651,1409,3128, 970,2758, 590, # 3184 2800, 661,2247,4652,2008,3950,1420,1549,3080,3322,3951,1651,1375,2111, 485,2491, # 3200 1429,1156,6156,2548,2183,1495, 831,1840,2529,2446, 501,1657, 307,1894,3247,1341, # 3216 666, 899,2156,1539,2549,1559, 886, 349,2208,3081,2305,1736,3824,2170,2759,1014, # 3232 1913,1386, 542,1397,2948, 490, 368, 716, 362, 159, 282,2569,1129,1658,1288,1750, # 3248 2674, 276, 649,2016, 751,1496, 658,1818,1284,1862,2209,2087,2512,3451, 622,2834, # 3264 376, 117,1060,2053,1208,1721,1101,1443, 247,1250,3179,1792,3952,2760,2398,3953, # 3280 6157,2144,3708, 446,2432,1151,2570,3452,2447,2761,2835,1210,2448,3082, 424,2222, # 3296 1251,2449,2119,2836, 504,1581,4338, 602, 817, 857,3825,2349,2306, 357,3826,1470, # 3312 1883,2883, 255, 958, 929,2917,3248, 302,4653,1050,1271,1751,2307,1952,1430,2697, # 3328 2719,2359, 354,3180, 777, 158,2036,4339,1659,4340,4654,2308,2949,2248,1146,2232, # 3344 3532,2720,1696,2623,3827,6158,3129,1550,2698,1485,1297,1428, 637, 931,2721,2145, # 3360 914,2550,2587, 81,2450, 612, 827,2646,1242,4655,1118,2884, 472,1855,3181,3533, # 3376 3534, 569,1353,2699,1244,1758,2588,4119,2009,2762,2171,3709,1312,1531,6159,1152, # 3392 1938, 134,1830, 471,3710,2276,1112,1535,3323,3453,3535, 982,1337,2950, 488, 826, # 3408 674,1058,1628,4120,2017, 522,2399, 211, 568,1367,3454, 350, 293,1872,1139,3249, # 3424 1399,1946,3006,1300,2360,3324, 588, 736,6160,2606, 744, 669,3536,3828,6161,1358, # 3440 199, 723, 848, 933, 851,1939,1505,1514,1338,1618,1831,4656,1634,3613, 443,2740, # 3456 3829, 717,1947, 491,1914,6162,2551,1542,4121,1025,6163,1099,1223, 198,3040,2722, # 3472 370, 410,1905,2589, 998,1248,3182,2380, 519,1449,4122,1710, 947, 928,1153,4341, # 3488 2277, 344,2624,1511, 615, 105, 161,1212,1076,1960,3130,2054,1926,1175,1906,2473, # 3504 414,1873,2801,6164,2309, 315,1319,3325, 318,2018,2146,2157, 963, 631, 223,4342, # 3520 4343,2675, 479,3711,1197,2625,3712,2676,2361,6165,4344,4123,6166,2451,3183,1886, # 3536 2184,1674,1330,1711,1635,1506, 799, 219,3250,3083,3954,1677,3713,3326,2081,3614, # 3552 1652,2073,4657,1147,3041,1752, 643,1961, 147,1974,3955,6167,1716,2037, 918,3007, # 3568 1994, 120,1537, 118, 609,3184,4345, 740,3455,1219, 332,1615,3830,6168,1621,2980, # 3584 1582, 783, 212, 553,2350,3714,1349,2433,2082,4124, 889,6169,2310,1275,1410, 973, # 3600 166,1320,3456,1797,1215,3185,2885,1846,2590,2763,4658, 629, 822,3008, 763, 940, # 3616 1990,2862, 439,2409,1566,1240,1622, 926,1282,1907,2764, 654,2210,1607, 327,1130, # 3632 3956,1678,1623,6170,2434,2192, 686, 608,3831,3715, 903,3957,3042,6171,2741,1522, # 3648 1915,1105,1555,2552,1359, 323,3251,4346,3457, 738,1354,2553,2311,2334,1828,2003, # 3664 3832,1753,2351,1227,6172,1887,4125,1478,6173,2410,1874,1712,1847, 520,1204,2607, # 3680 264,4659, 836,2677,2102, 600,4660,3833,2278,3084,6174,4347,3615,1342, 640, 532, # 3696 543,2608,1888,2400,2591,1009,4348,1497, 341,1737,3616,2723,1394, 529,3252,1321, # 3712 983,4661,1515,2120, 971,2592, 924, 287,1662,3186,4349,2700,4350,1519, 908,1948, # 3728 2452, 156, 796,1629,1486,2223,2055, 694,4126,1259,1036,3392,1213,2249,2742,1889, # 3744 1230,3958,1015, 910, 408, 559,3617,4662, 746, 725, 935,4663,3959,3009,1289, 563, # 3760 867,4664,3960,1567,2981,2038,2626, 988,2263,2381,4351, 143,2374, 704,1895,6175, # 3776 1188,3716,2088, 673,3085,2362,4352, 484,1608,1921,2765,2918, 215, 904,3618,3537, # 3792 894, 509, 976,3043,2701,3961,4353,2837,2982, 498,6176,6177,1102,3538,1332,3393, # 3808 1487,1636,1637, 233, 245,3962, 383, 650, 995,3044, 460,1520,1206,2352, 749,3327, # 3824 530, 700, 389,1438,1560,1773,3963,2264, 719,2951,2724,3834, 870,1832,1644,1000, # 3840 839,2474,3717, 197,1630,3394, 365,2886,3964,1285,2133, 734, 922, 818,1106, 732, # 3856 480,2083,1774,3458, 923,2279,1350, 221,3086, 85,2233,2234,3835,1585,3010,2147, # 3872 1387,1705,2382,1619,2475, 133, 239,2802,1991,1016,2084,2383, 411,2838,1113, 651, # 3888 1985,1160,3328, 990,1863,3087,1048,1276,2647, 265,2627,1599,3253,2056, 150, 638, # 3904 2019, 656, 853, 326,1479, 680,1439,4354,1001,1759, 413,3459,3395,2492,1431, 459, # 3920 4355,1125,3329,2265,1953,1450,2065,2863, 849, 351,2678,3131,3254,3255,1104,1577, # 3936 227,1351,1645,2453,2193,1421,2887, 812,2121, 634, 95,2435, 201,2312,4665,1646, # 3952 1671,2743,1601,2554,2702,2648,2280,1315,1366,2089,3132,1573,3718,3965,1729,1189, # 3968 328,2679,1077,1940,1136, 558,1283, 964,1195, 621,2074,1199,1743,3460,3619,1896, # 3984 1916,1890,3836,2952,1154,2112,1064, 862, 378,3011,2066,2113,2803,1568,2839,6178, # 4000 3088,2919,1941,1660,2004,1992,2194, 142, 707,1590,1708,1624,1922,1023,1836,1233, # 4016 1004,2313, 789, 741,3620,6179,1609,2411,1200,4127,3719,3720,4666,2057,3721, 593, # 4032 2840, 367,2920,1878,6180,3461,1521, 628,1168, 692,2211,2649, 300, 720,2067,2571, # 4048 2953,3396, 959,2504,3966,3539,3462,1977, 701,6181, 954,1043, 800, 681, 183,3722, # 4064 1803,1730,3540,4128,2103, 815,2314, 174, 467, 230,2454,1093,2134, 755,3541,3397, # 4080 1141,1162,6182,1738,2039, 270,3256,2513,1005,1647,2185,3837, 858,1679,1897,1719, # 4096 2954,2324,1806, 402, 670, 167,4129,1498,2158,2104, 750,6183, 915, 189,1680,1551, # 4112 455,4356,1501,2455, 405,1095,2955, 338,1586,1266,1819, 570, 641,1324, 237,1556, # 4128 2650,1388,3723,6184,1368,2384,1343,1978,3089,2436, 879,3724, 792,1191, 758,3012, # 4144 1411,2135,1322,4357, 240,4667,1848,3725,1574,6185, 420,3045,1546,1391, 714,4358, # 4160 1967, 941,1864, 863, 664, 426, 560,1731,2680,1785,2864,1949,2363, 403,3330,1415, # 4176 1279,2136,1697,2335, 204, 721,2097,3838, 90,6186,2085,2505, 191,3967, 124,2148, # 4192 1376,1798,1178,1107,1898,1405, 860,4359,1243,1272,2375,2983,1558,2456,1638, 113, # 4208 3621, 578,1923,2609, 880, 386,4130, 784,2186,2266,1422,2956,2172,1722, 497, 263, # 4224 2514,1267,2412,2610, 177,2703,3542, 774,1927,1344, 616,1432,1595,1018, 172,4360, # 4240 2325, 911,4361, 438,1468,3622, 794,3968,2024,2173,1681,1829,2957, 945, 895,3090, # 4256 575,2212,2476, 475,2401,2681, 785,2744,1745,2293,2555,1975,3133,2865, 394,4668, # 4272 3839, 635,4131, 639, 202,1507,2195,2766,1345,1435,2572,3726,1908,1184,1181,2457, # 4288 3727,3134,4362, 843,2611, 437, 916,4669, 234, 769,1884,3046,3047,3623, 833,6187, # 4304 1639,2250,2402,1355,1185,2010,2047, 999, 525,1732,1290,1488,2612, 948,1578,3728, # 4320 2413,2477,1216,2725,2159, 334,3840,1328,3624,2921,1525,4132, 564,1056, 891,4363, # 4336 1444,1698,2385,2251,3729,1365,2281,2235,1717,6188, 864,3841,2515, 444, 527,2767, # 4352 2922,3625, 544, 461,6189, 566, 209,2437,3398,2098,1065,2068,3331,3626,3257,2137, # 4368 #last 512 #Everything below is of no interest for detection purpose 2138,2122,3730,2888,1995,1820,1044,6190,6191,6192,6193,6194,6195,6196,6197,6198, # 4384 6199,6200,6201,6202,6203,6204,6205,4670,6206,6207,6208,6209,6210,6211,6212,6213, # 4400 6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,6224,6225,6226,6227,6228,6229, # 4416 6230,6231,6232,6233,6234,6235,6236,6237,3187,6238,6239,3969,6240,6241,6242,6243, # 4432 6244,4671,6245,6246,4672,6247,6248,4133,6249,6250,4364,6251,2923,2556,2613,4673, # 4448 4365,3970,6252,6253,6254,6255,4674,6256,6257,6258,2768,2353,4366,4675,4676,3188, # 4464 4367,3463,6259,4134,4677,4678,6260,2267,6261,3842,3332,4368,3543,6262,6263,6264, # 4480 3013,1954,1928,4135,4679,6265,6266,2478,3091,6267,4680,4369,6268,6269,1699,6270, # 4496 3544,4136,4681,6271,4137,6272,4370,2804,6273,6274,2593,3971,3972,4682,6275,2236, # 4512 4683,6276,6277,4684,6278,6279,4138,3973,4685,6280,6281,3258,6282,6283,6284,6285, # 4528 3974,4686,2841,3975,6286,6287,3545,6288,6289,4139,4687,4140,6290,4141,6291,4142, # 4544 6292,6293,3333,6294,6295,6296,4371,6297,3399,6298,6299,4372,3976,6300,6301,6302, # 4560 4373,6303,6304,3843,3731,6305,4688,4374,6306,6307,3259,2294,6308,3732,2530,4143, # 4576 6309,4689,6310,6311,6312,3048,6313,6314,4690,3733,2237,6315,6316,2282,3334,6317, # 4592 6318,3844,6319,6320,4691,6321,3400,4692,6322,4693,6323,3049,6324,4375,6325,3977, # 4608 6326,6327,6328,3546,6329,4694,3335,6330,4695,4696,6331,6332,6333,6334,4376,3978, # 4624 6335,4697,3979,4144,6336,3980,4698,6337,6338,6339,6340,6341,4699,4700,4701,6342, # 4640 6343,4702,6344,6345,4703,6346,6347,4704,6348,4705,4706,3135,6349,4707,6350,4708, # 4656 6351,4377,6352,4709,3734,4145,6353,2506,4710,3189,6354,3050,4711,3981,6355,3547, # 4672 3014,4146,4378,3735,2651,3845,3260,3136,2224,1986,6356,3401,6357,4712,2594,3627, # 4688 3137,2573,3736,3982,4713,3628,4714,4715,2682,3629,4716,6358,3630,4379,3631,6359, # 4704 6360,6361,3983,6362,6363,6364,6365,4147,3846,4717,6366,6367,3737,2842,6368,4718, # 4720 2628,6369,3261,6370,2386,6371,6372,3738,3984,4719,3464,4720,3402,6373,2924,3336, # 4736 4148,2866,6374,2805,3262,4380,2704,2069,2531,3138,2806,2984,6375,2769,6376,4721, # 4752 4722,3403,6377,6378,3548,6379,6380,2705,3092,1979,4149,2629,3337,2889,6381,3338, # 4768 4150,2557,3339,4381,6382,3190,3263,3739,6383,4151,4723,4152,2558,2574,3404,3191, # 4784 6384,6385,4153,6386,4724,4382,6387,6388,4383,6389,6390,4154,6391,4725,3985,6392, # 4800 3847,4155,6393,6394,6395,6396,6397,3465,6398,4384,6399,6400,6401,6402,6403,6404, # 4816 4156,6405,6406,6407,6408,2123,6409,6410,2326,3192,4726,6411,6412,6413,6414,4385, # 4832 4157,6415,6416,4158,6417,3093,3848,6418,3986,6419,6420,3849,6421,6422,6423,4159, # 4848 6424,6425,4160,6426,3740,6427,6428,6429,6430,3987,6431,4727,6432,2238,6433,6434, # 4864 4386,3988,6435,6436,3632,6437,6438,2843,6439,6440,6441,6442,3633,6443,2958,6444, # 4880 6445,3466,6446,2364,4387,3850,6447,4388,2959,3340,6448,3851,6449,4728,6450,6451, # 4896 3264,4729,6452,3193,6453,4389,4390,2706,3341,4730,6454,3139,6455,3194,6456,3051, # 4912 2124,3852,1602,4391,4161,3853,1158,3854,4162,3989,4392,3990,4731,4732,4393,2040, # 4928 4163,4394,3265,6457,2807,3467,3855,6458,6459,6460,3991,3468,4733,4734,6461,3140, # 4944 2960,6462,4735,6463,6464,6465,6466,4736,4737,4738,4739,6467,6468,4164,2403,3856, # 4960 6469,6470,2770,2844,6471,4740,6472,6473,6474,6475,6476,6477,6478,3195,6479,4741, # 4976 4395,6480,2867,6481,4742,2808,6482,2493,4165,6483,6484,6485,6486,2295,4743,6487, # 4992 6488,6489,3634,6490,6491,6492,6493,6494,6495,6496,2985,4744,6497,6498,4745,6499, # 5008 6500,2925,3141,4166,6501,6502,4746,6503,6504,4747,6505,6506,6507,2890,6508,6509, # 5024 6510,6511,6512,6513,6514,6515,6516,6517,6518,6519,3469,4167,6520,6521,6522,4748, # 5040 4396,3741,4397,4749,4398,3342,2125,4750,6523,4751,4752,4753,3052,6524,2961,4168, # 5056 6525,4754,6526,4755,4399,2926,4169,6527,3857,6528,4400,4170,6529,4171,6530,6531, # 5072 2595,6532,6533,6534,6535,3635,6536,6537,6538,6539,6540,6541,6542,4756,6543,6544, # 5088 6545,6546,6547,6548,4401,6549,6550,6551,6552,4402,3405,4757,4403,6553,6554,6555, # 5104 4172,3742,6556,6557,6558,3992,3636,6559,6560,3053,2726,6561,3549,4173,3054,4404, # 5120 6562,6563,3993,4405,3266,3550,2809,4406,6564,6565,6566,4758,4759,6567,3743,6568, # 5136 4760,3744,4761,3470,6569,6570,6571,4407,6572,3745,4174,6573,4175,2810,4176,3196, # 5152 4762,6574,4177,6575,6576,2494,2891,3551,6577,6578,3471,6579,4408,6580,3015,3197, # 5168 6581,3343,2532,3994,3858,6582,3094,3406,4409,6583,2892,4178,4763,4410,3016,4411, # 5184 6584,3995,3142,3017,2683,6585,4179,6586,6587,4764,4412,6588,6589,4413,6590,2986, # 5200 6591,2962,3552,6592,2963,3472,6593,6594,4180,4765,6595,6596,2225,3267,4414,6597, # 5216 3407,3637,4766,6598,6599,3198,6600,4415,6601,3859,3199,6602,3473,4767,2811,4416, # 5232 1856,3268,3200,2575,3996,3997,3201,4417,6603,3095,2927,6604,3143,6605,2268,6606, # 5248 3998,3860,3096,2771,6607,6608,3638,2495,4768,6609,3861,6610,3269,2745,4769,4181, # 5264 3553,6611,2845,3270,6612,6613,6614,3862,6615,6616,4770,4771,6617,3474,3999,4418, # 5280 4419,6618,3639,3344,6619,4772,4182,6620,2126,6621,6622,6623,4420,4773,6624,3018, # 5296 6625,4774,3554,6626,4183,2025,3746,6627,4184,2707,6628,4421,4422,3097,1775,4185, # 5312 3555,6629,6630,2868,6631,6632,4423,6633,6634,4424,2414,2533,2928,6635,4186,2387, # 5328 6636,4775,6637,4187,6638,1891,4425,3202,3203,6639,6640,4776,6641,3345,6642,6643, # 5344 3640,6644,3475,3346,3641,4000,6645,3144,6646,3098,2812,4188,3642,3204,6647,3863, # 5360 3476,6648,3864,6649,4426,4001,6650,6651,6652,2576,6653,4189,4777,6654,6655,6656, # 5376 2846,6657,3477,3205,4002,6658,4003,6659,3347,2252,6660,6661,6662,4778,6663,6664, # 5392 6665,6666,6667,6668,6669,4779,4780,2048,6670,3478,3099,6671,3556,3747,4004,6672, # 5408 6673,6674,3145,4005,3748,6675,6676,6677,6678,6679,3408,6680,6681,6682,6683,3206, # 5424 3207,6684,6685,4781,4427,6686,4782,4783,4784,6687,6688,6689,4190,6690,6691,3479, # 5440 6692,2746,6693,4428,6694,6695,6696,6697,6698,6699,4785,6700,6701,3208,2727,6702, # 5456 3146,6703,6704,3409,2196,6705,4429,6706,6707,6708,2534,1996,6709,6710,6711,2747, # 5472 6712,6713,6714,4786,3643,6715,4430,4431,6716,3557,6717,4432,4433,6718,6719,6720, # 5488 6721,3749,6722,4006,4787,6723,6724,3644,4788,4434,6725,6726,4789,2772,6727,6728, # 5504 6729,6730,6731,2708,3865,2813,4435,6732,6733,4790,4791,3480,6734,6735,6736,6737, # 5520 4436,3348,6738,3410,4007,6739,6740,4008,6741,6742,4792,3411,4191,6743,6744,6745, # 5536 6746,6747,3866,6748,3750,6749,6750,6751,6752,6753,6754,6755,3867,6756,4009,6757, # 5552 4793,4794,6758,2814,2987,6759,6760,6761,4437,6762,6763,6764,6765,3645,6766,6767, # 5568 3481,4192,6768,3751,6769,6770,2174,6771,3868,3752,6772,6773,6774,4193,4795,4438, # 5584 3558,4796,4439,6775,4797,6776,6777,4798,6778,4799,3559,4800,6779,6780,6781,3482, # 5600 6782,2893,6783,6784,4194,4801,4010,6785,6786,4440,6787,4011,6788,6789,6790,6791, # 5616 6792,6793,4802,6794,6795,6796,4012,6797,6798,6799,6800,3349,4803,3483,6801,4804, # 5632 4195,6802,4013,6803,6804,4196,6805,4014,4015,6806,2847,3271,2848,6807,3484,6808, # 5648 6809,6810,4441,6811,4442,4197,4443,3272,4805,6812,3412,4016,1579,6813,6814,4017, # 5664 6815,3869,6816,2964,6817,4806,6818,6819,4018,3646,6820,6821,4807,4019,4020,6822, # 5680 6823,3560,6824,6825,4021,4444,6826,4198,6827,6828,4445,6829,6830,4199,4808,6831, # 5696 6832,6833,3870,3019,2458,6834,3753,3413,3350,6835,4809,3871,4810,3561,4446,6836, # 5712 6837,4447,4811,4812,6838,2459,4448,6839,4449,6840,6841,4022,3872,6842,4813,4814, # 5728 6843,6844,4815,4200,4201,4202,6845,4023,6846,6847,4450,3562,3873,6848,6849,4816, # 5744 4817,6850,4451,4818,2139,6851,3563,6852,6853,3351,6854,6855,3352,4024,2709,3414, # 5760 4203,4452,6856,4204,6857,6858,3874,3875,6859,6860,4819,6861,6862,6863,6864,4453, # 5776 3647,6865,6866,4820,6867,6868,6869,6870,4454,6871,2869,6872,6873,4821,6874,3754, # 5792 6875,4822,4205,6876,6877,6878,3648,4206,4455,6879,4823,6880,4824,3876,6881,3055, # 5808 4207,6882,3415,6883,6884,6885,4208,4209,6886,4210,3353,6887,3354,3564,3209,3485, # 5824 2652,6888,2728,6889,3210,3755,6890,4025,4456,6891,4825,6892,6893,6894,6895,4211, # 5840 6896,6897,6898,4826,6899,6900,4212,6901,4827,6902,2773,3565,6903,4828,6904,6905, # 5856 6906,6907,3649,3650,6908,2849,3566,6909,3567,3100,6910,6911,6912,6913,6914,6915, # 5872 4026,6916,3355,4829,3056,4457,3756,6917,3651,6918,4213,3652,2870,6919,4458,6920, # 5888 2438,6921,6922,3757,2774,4830,6923,3356,4831,4832,6924,4833,4459,3653,2507,6925, # 5904 4834,2535,6926,6927,3273,4027,3147,6928,3568,6929,6930,6931,4460,6932,3877,4461, # 5920 2729,3654,6933,6934,6935,6936,2175,4835,2630,4214,4028,4462,4836,4215,6937,3148, # 5936 4216,4463,4837,4838,4217,6938,6939,2850,4839,6940,4464,6941,6942,6943,4840,6944, # 5952 4218,3274,4465,6945,6946,2710,6947,4841,4466,6948,6949,2894,6950,6951,4842,6952, # 5968 4219,3057,2871,6953,6954,6955,6956,4467,6957,2711,6958,6959,6960,3275,3101,4843, # 5984 6961,3357,3569,6962,4844,6963,6964,4468,4845,3570,6965,3102,4846,3758,6966,4847, # 6000 3878,4848,4849,4029,6967,2929,3879,4850,4851,6968,6969,1733,6970,4220,6971,6972, # 6016 6973,6974,6975,6976,4852,6977,6978,6979,6980,6981,6982,3759,6983,6984,6985,3486, # 6032 3487,6986,3488,3416,6987,6988,6989,6990,6991,6992,6993,6994,6995,6996,6997,4853, # 6048 6998,6999,4030,7000,7001,3211,7002,7003,4221,7004,7005,3571,4031,7006,3572,7007, # 6064 2614,4854,2577,7008,7009,2965,3655,3656,4855,2775,3489,3880,4222,4856,3881,4032, # 6080 3882,3657,2730,3490,4857,7010,3149,7011,4469,4858,2496,3491,4859,2283,7012,7013, # 6096 7014,2365,4860,4470,7015,7016,3760,7017,7018,4223,1917,7019,7020,7021,4471,7022, # 6112 2776,4472,7023,7024,7025,7026,4033,7027,3573,4224,4861,4034,4862,7028,7029,1929, # 6128 3883,4035,7030,4473,3058,7031,2536,3761,3884,7032,4036,7033,2966,2895,1968,4474, # 6144 3276,4225,3417,3492,4226,2105,7034,7035,1754,2596,3762,4227,4863,4475,3763,4864, # 6160 3764,2615,2777,3103,3765,3658,3418,4865,2296,3766,2815,7036,7037,7038,3574,2872, # 6176 3277,4476,7039,4037,4477,7040,7041,4038,7042,7043,7044,7045,7046,7047,2537,7048, # 6192 7049,7050,7051,7052,7053,7054,4478,7055,7056,3767,3659,4228,3575,7057,7058,4229, # 6208 7059,7060,7061,3660,7062,3212,7063,3885,4039,2460,7064,7065,7066,7067,7068,7069, # 6224 7070,7071,7072,7073,7074,4866,3768,4867,7075,7076,7077,7078,4868,3358,3278,2653, # 6240 7079,7080,4479,3886,7081,7082,4869,7083,7084,7085,7086,7087,7088,2538,7089,7090, # 6256 7091,4040,3150,3769,4870,4041,2896,3359,4230,2930,7092,3279,7093,2967,4480,3213, # 6272 4481,3661,7094,7095,7096,7097,7098,7099,7100,7101,7102,2461,3770,7103,7104,4231, # 6288 3151,7105,7106,7107,4042,3662,7108,7109,4871,3663,4872,4043,3059,7110,7111,7112, # 6304 3493,2988,7113,4873,7114,7115,7116,3771,4874,7117,7118,4232,4875,7119,3576,2336, # 6320 4876,7120,4233,3419,4044,4877,4878,4482,4483,4879,4484,4234,7121,3772,4880,1045, # 6336 3280,3664,4881,4882,7122,7123,7124,7125,4883,7126,2778,7127,4485,4486,7128,4884, # 6352 3214,3887,7129,7130,3215,7131,4885,4045,7132,7133,4046,7134,7135,7136,7137,7138, # 6368 7139,7140,7141,7142,7143,4235,7144,4886,7145,7146,7147,4887,7148,7149,7150,4487, # 6384 4047,4488,7151,7152,4888,4048,2989,3888,7153,3665,7154,4049,7155,7156,7157,7158, # 6400 7159,7160,2931,4889,4890,4489,7161,2631,3889,4236,2779,7162,7163,4891,7164,3060, # 6416 7165,1672,4892,7166,4893,4237,3281,4894,7167,7168,3666,7169,3494,7170,7171,4050, # 6432 7172,7173,3104,3360,3420,4490,4051,2684,4052,7174,4053,7175,7176,7177,2253,4054, # 6448 7178,7179,4895,7180,3152,3890,3153,4491,3216,7181,7182,7183,2968,4238,4492,4055, # 6464 7184,2990,7185,2479,7186,7187,4493,7188,7189,7190,7191,7192,4896,7193,4897,2969, # 6480 4494,4898,7194,3495,7195,7196,4899,4495,7197,3105,2731,7198,4900,7199,7200,7201, # 6496 4056,7202,3361,7203,7204,4496,4901,4902,7205,4497,7206,7207,2315,4903,7208,4904, # 6512 7209,4905,2851,7210,7211,3577,7212,3578,4906,7213,4057,3667,4907,7214,4058,2354, # 6528 3891,2376,3217,3773,7215,7216,7217,7218,7219,4498,7220,4908,3282,2685,7221,3496, # 6544 4909,2632,3154,4910,7222,2337,7223,4911,7224,7225,7226,4912,4913,3283,4239,4499, # 6560 7227,2816,7228,7229,7230,7231,7232,7233,7234,4914,4500,4501,7235,7236,7237,2686, # 6576 7238,4915,7239,2897,4502,7240,4503,7241,2516,7242,4504,3362,3218,7243,7244,7245, # 6592 4916,7246,7247,4505,3363,7248,7249,7250,7251,3774,4506,7252,7253,4917,7254,7255, # 6608 3284,2991,4918,4919,3219,3892,4920,3106,3497,4921,7256,7257,7258,4922,7259,4923, # 6624 3364,4507,4508,4059,7260,4240,3498,7261,7262,4924,7263,2992,3893,4060,3220,7264, # 6640 7265,7266,7267,7268,7269,4509,3775,7270,2817,7271,4061,4925,4510,3776,7272,4241, # 6656 4511,3285,7273,7274,3499,7275,7276,7277,4062,4512,4926,7278,3107,3894,7279,7280, # 6672 4927,7281,4513,7282,7283,3668,7284,7285,4242,4514,4243,7286,2058,4515,4928,4929, # 6688 4516,7287,3286,4244,7288,4517,7289,7290,7291,3669,7292,7293,4930,4931,4932,2355, # 6704 4933,7294,2633,4518,7295,4245,7296,7297,4519,7298,7299,4520,4521,4934,7300,4246, # 6720 4522,7301,7302,7303,3579,7304,4247,4935,7305,4936,7306,7307,7308,7309,3777,7310, # 6736 4523,7311,7312,7313,4248,3580,7314,4524,3778,4249,7315,3581,7316,3287,7317,3221, # 6752 7318,4937,7319,7320,7321,7322,7323,7324,4938,4939,7325,4525,7326,7327,7328,4063, # 6768 7329,7330,4940,7331,7332,4941,7333,4526,7334,3500,2780,1741,4942,2026,1742,7335, # 6784 7336,3582,4527,2388,7337,7338,7339,4528,7340,4250,4943,7341,7342,7343,4944,7344, # 6800 7345,7346,3020,7347,4945,7348,7349,7350,7351,3895,7352,3896,4064,3897,7353,7354, # 6816 7355,4251,7356,7357,3898,7358,3779,7359,3780,3288,7360,7361,4529,7362,4946,4530, # 6832 2027,7363,3899,4531,4947,3222,3583,7364,4948,7365,7366,7367,7368,4949,3501,4950, # 6848 3781,4951,4532,7369,2517,4952,4252,4953,3155,7370,4954,4955,4253,2518,4533,7371, # 6864 7372,2712,4254,7373,7374,7375,3670,4956,3671,7376,2389,3502,4065,7377,2338,7378, # 6880 7379,7380,7381,3061,7382,4957,7383,7384,7385,7386,4958,4534,7387,7388,2993,7389, # 6896 3062,7390,4959,7391,7392,7393,4960,3108,4961,7394,4535,7395,4962,3421,4536,7396, # 6912 4963,7397,4964,1857,7398,4965,7399,7400,2176,3584,4966,7401,7402,3422,4537,3900, # 6928 3585,7403,3782,7404,2852,7405,7406,7407,4538,3783,2654,3423,4967,4539,7408,3784, # 6944 3586,2853,4540,4541,7409,3901,7410,3902,7411,7412,3785,3109,2327,3903,7413,7414, # 6960 2970,4066,2932,7415,7416,7417,3904,3672,3424,7418,4542,4543,4544,7419,4968,7420, # 6976 7421,4255,7422,7423,7424,7425,7426,4067,7427,3673,3365,4545,7428,3110,2559,3674, # 6992 7429,7430,3156,7431,7432,3503,7433,3425,4546,7434,3063,2873,7435,3223,4969,4547, # 7008 4548,2898,4256,4068,7436,4069,3587,3786,2933,3787,4257,4970,4971,3788,7437,4972, # 7024 3064,7438,4549,7439,7440,7441,7442,7443,4973,3905,7444,2874,7445,7446,7447,7448, # 7040 3021,7449,4550,3906,3588,4974,7450,7451,3789,3675,7452,2578,7453,4070,7454,7455, # 7056 7456,4258,3676,7457,4975,7458,4976,4259,3790,3504,2634,4977,3677,4551,4260,7459, # 7072 7460,7461,7462,3907,4261,4978,7463,7464,7465,7466,4979,4980,7467,7468,2213,4262, # 7088 7469,7470,7471,3678,4981,7472,2439,7473,4263,3224,3289,7474,3908,2415,4982,7475, # 7104 4264,7476,4983,2655,7477,7478,2732,4552,2854,2875,7479,7480,4265,7481,4553,4984, # 7120 7482,7483,4266,7484,3679,3366,3680,2818,2781,2782,3367,3589,4554,3065,7485,4071, # 7136 2899,7486,7487,3157,2462,4072,4555,4073,4985,4986,3111,4267,2687,3368,4556,4074, # 7152 3791,4268,7488,3909,2783,7489,2656,1962,3158,4557,4987,1963,3159,3160,7490,3112, # 7168 4988,4989,3022,4990,4991,3792,2855,7491,7492,2971,4558,7493,7494,4992,7495,7496, # 7184 7497,7498,4993,7499,3426,4559,4994,7500,3681,4560,4269,4270,3910,7501,4075,4995, # 7200 4271,7502,7503,4076,7504,4996,7505,3225,4997,4272,4077,2819,3023,7506,7507,2733, # 7216 4561,7508,4562,7509,3369,3793,7510,3590,2508,7511,7512,4273,3113,2994,2616,7513, # 7232 7514,7515,7516,7517,7518,2820,3911,4078,2748,7519,7520,4563,4998,7521,7522,7523, # 7248 7524,4999,4274,7525,4564,3682,2239,4079,4565,7526,7527,7528,7529,5000,7530,7531, # 7264 5001,4275,3794,7532,7533,7534,3066,5002,4566,3161,7535,7536,4080,7537,3162,7538, # 7280 7539,4567,7540,7541,7542,7543,7544,7545,5003,7546,4568,7547,7548,7549,7550,7551, # 7296 7552,7553,7554,7555,7556,5004,7557,7558,7559,5005,7560,3795,7561,4569,7562,7563, # 7312 7564,2821,3796,4276,4277,4081,7565,2876,7566,5006,7567,7568,2900,7569,3797,3912, # 7328 7570,7571,7572,4278,7573,7574,7575,5007,7576,7577,5008,7578,7579,4279,2934,7580, # 7344 7581,5009,7582,4570,7583,4280,7584,7585,7586,4571,4572,3913,7587,4573,3505,7588, # 7360 5010,7589,7590,7591,7592,3798,4574,7593,7594,5011,7595,4281,7596,7597,7598,4282, # 7376 5012,7599,7600,5013,3163,7601,5014,7602,3914,7603,7604,2734,4575,4576,4577,7605, # 7392 7606,7607,7608,7609,3506,5015,4578,7610,4082,7611,2822,2901,2579,3683,3024,4579, # 7408 3507,7612,4580,7613,3226,3799,5016,7614,7615,7616,7617,7618,7619,7620,2995,3290, # 7424 7621,4083,7622,5017,7623,7624,7625,7626,7627,4581,3915,7628,3291,7629,5018,7630, # 7440 7631,7632,7633,4084,7634,7635,3427,3800,7636,7637,4582,7638,5019,4583,5020,7639, # 7456 3916,7640,3801,5021,4584,4283,7641,7642,3428,3591,2269,7643,2617,7644,4585,3592, # 7472 7645,4586,2902,7646,7647,3227,5022,7648,4587,7649,4284,7650,7651,7652,4588,2284, # 7488 7653,5023,7654,7655,7656,4589,5024,3802,7657,7658,5025,3508,4590,7659,7660,7661, # 7504 1969,5026,7662,7663,3684,1821,2688,7664,2028,2509,4285,7665,2823,1841,7666,2689, # 7520 3114,7667,3917,4085,2160,5027,5028,2972,7668,5029,7669,7670,7671,3593,4086,7672, # 7536 4591,4087,5030,3803,7673,7674,7675,7676,7677,7678,7679,4286,2366,4592,4593,3067, # 7552 2328,7680,7681,4594,3594,3918,2029,4287,7682,5031,3919,3370,4288,4595,2856,7683, # 7568 3509,7684,7685,5032,5033,7686,7687,3804,2784,7688,7689,7690,7691,3371,7692,7693, # 7584 2877,5034,7694,7695,3920,4289,4088,7696,7697,7698,5035,7699,5036,4290,5037,5038, # 7600 5039,7700,7701,7702,5040,5041,3228,7703,1760,7704,5042,3229,4596,2106,4089,7705, # 7616 4597,2824,5043,2107,3372,7706,4291,4090,5044,7707,4091,7708,5045,3025,3805,4598, # 7632 4292,4293,4294,3373,7709,4599,7710,5046,7711,7712,5047,5048,3806,7713,7714,7715, # 7648 5049,7716,7717,7718,7719,4600,5050,7720,7721,7722,5051,7723,4295,3429,7724,7725, # 7664 7726,7727,3921,7728,3292,5052,4092,7729,7730,7731,7732,7733,7734,7735,5053,5054, # 7680 7736,7737,7738,7739,3922,3685,7740,7741,7742,7743,2635,5055,7744,5056,4601,7745, # 7696 7746,2560,7747,7748,7749,7750,3923,7751,7752,7753,7754,7755,4296,2903,7756,7757, # 7712 7758,7759,7760,3924,7761,5057,4297,7762,7763,5058,4298,7764,4093,7765,7766,5059, # 7728 3925,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,3595,7777,4299,5060,4094, # 7744 7778,3293,5061,7779,7780,4300,7781,7782,4602,7783,3596,7784,7785,3430,2367,7786, # 7760 3164,5062,5063,4301,7787,7788,4095,5064,5065,7789,3374,3115,7790,7791,7792,7793, # 7776 7794,7795,7796,3597,4603,7797,7798,3686,3116,3807,5066,7799,7800,5067,7801,7802, # 7792 4604,4302,5068,4303,4096,7803,7804,3294,7805,7806,5069,4605,2690,7807,3026,7808, # 7808 7809,7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824, # 7824 7825,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7840 7841,7842,7843,7844,7845,7846,7847,7848,7849,7850,7851,7852,7853,7854,7855,7856, # 7856 7857,7858,7859,7860,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870,7871,7872, # 7872 7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886,7887,7888, # 7888 7889,7890,7891,7892,7893,7894,7895,7896,7897,7898,7899,7900,7901,7902,7903,7904, # 7904 7905,7906,7907,7908,7909,7910,7911,7912,7913,7914,7915,7916,7917,7918,7919,7920, # 7920 7921,7922,7923,7924,3926,7925,7926,7927,7928,7929,7930,7931,7932,7933,7934,7935, # 7936 7936,7937,7938,7939,7940,7941,7942,7943,7944,7945,7946,7947,7948,7949,7950,7951, # 7952 7952,7953,7954,7955,7956,7957,7958,7959,7960,7961,7962,7963,7964,7965,7966,7967, # 7968 7968,7969,7970,7971,7972,7973,7974,7975,7976,7977,7978,7979,7980,7981,7982,7983, # 7984 7984,7985,7986,7987,7988,7989,7990,7991,7992,7993,7994,7995,7996,7997,7998,7999, # 8000 8000,8001,8002,8003,8004,8005,8006,8007,8008,8009,8010,8011,8012,8013,8014,8015, # 8016 8016,8017,8018,8019,8020,8021,8022,8023,8024,8025,8026,8027,8028,8029,8030,8031, # 8032 8032,8033,8034,8035,8036,8037,8038,8039,8040,8041,8042,8043,8044,8045,8046,8047, # 8048 8048,8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063, # 8064 8064,8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079, # 8080 8080,8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095, # 8096 8096,8097,8098,8099,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110,8111, # 8112 8112,8113,8114,8115,8116,8117,8118,8119,8120,8121,8122,8123,8124,8125,8126,8127, # 8128 8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141,8142,8143, # 8144 8144,8145,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155,8156,8157,8158,8159, # 8160 8160,8161,8162,8163,8164,8165,8166,8167,8168,8169,8170,8171,8172,8173,8174,8175, # 8176 8176,8177,8178,8179,8180,8181,8182,8183,8184,8185,8186,8187,8188,8189,8190,8191, # 8192 8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207, # 8208 8208,8209,8210,8211,8212,8213,8214,8215,8216,8217,8218,8219,8220,8221,8222,8223, # 8224 8224,8225,8226,8227,8228,8229,8230,8231,8232,8233,8234,8235,8236,8237,8238,8239, # 8240 8240,8241,8242,8243,8244,8245,8246,8247,8248,8249,8250,8251,8252,8253,8254,8255, # 8256 8256,8257,8258,8259,8260,8261,8262,8263,8264,8265,8266,8267,8268,8269,8270,8271) # 8272 # flake8: noqa PK[q1BB!site-packages/chardet/big5freq.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # Big5 frequency table # by Taiwan's Mandarin Promotion Council # # # 128 --> 0.42261 # 256 --> 0.57851 # 512 --> 0.74851 # 1024 --> 0.89384 # 2048 --> 0.97583 # # Ideal Distribution Ratio = 0.74851/(1-0.74851) =2.98 # Random Distribution Ration = 512/(5401-512)=0.105 # # Typical Distribution Ratio about 25% of Ideal one, still much higher than RDR BIG5_TYPICAL_DISTRIBUTION_RATIO = 0.75 #Char to FreqOrder table BIG5_TABLE_SIZE = 5376 Big5CharToFreqOrder = ( 1,1801,1506, 255,1431, 198, 9, 82, 6,5008, 177, 202,3681,1256,2821, 110, # 16 3814, 33,3274, 261, 76, 44,2114, 16,2946,2187,1176, 659,3971, 26,3451,2653, # 32 1198,3972,3350,4202, 410,2215, 302, 590, 361,1964, 8, 204, 58,4510,5009,1932, # 48 63,5010,5011, 317,1614, 75, 222, 159,4203,2417,1480,5012,3555,3091, 224,2822, # 64 3682, 3, 10,3973,1471, 29,2787,1135,2866,1940, 873, 130,3275,1123, 312,5013, # 80 4511,2052, 507, 252, 682,5014, 142,1915, 124, 206,2947, 34,3556,3204, 64, 604, # 96 5015,2501,1977,1978, 155,1991, 645, 641,1606,5016,3452, 337, 72, 406,5017, 80, # 112 630, 238,3205,1509, 263, 939,1092,2654, 756,1440,1094,3453, 449, 69,2987, 591, # 128 179,2096, 471, 115,2035,1844, 60, 50,2988, 134, 806,1869, 734,2036,3454, 180, # 144 995,1607, 156, 537,2907, 688,5018, 319,1305, 779,2145, 514,2379, 298,4512, 359, # 160 2502, 90,2716,1338, 663, 11, 906,1099,2553, 20,2441, 182, 532,1716,5019, 732, # 176 1376,4204,1311,1420,3206, 25,2317,1056, 113, 399, 382,1950, 242,3455,2474, 529, # 192 3276, 475,1447,3683,5020, 117, 21, 656, 810,1297,2300,2334,3557,5021, 126,4205, # 208 706, 456, 150, 613,4513, 71,1118,2037,4206, 145,3092, 85, 835, 486,2115,1246, # 224 1426, 428, 727,1285,1015, 800, 106, 623, 303,1281,5022,2128,2359, 347,3815, 221, # 240 3558,3135,5023,1956,1153,4207, 83, 296,1199,3093, 192, 624, 93,5024, 822,1898, # 256 2823,3136, 795,2065, 991,1554,1542,1592, 27, 43,2867, 859, 139,1456, 860,4514, # 272 437, 712,3974, 164,2397,3137, 695, 211,3037,2097, 195,3975,1608,3559,3560,3684, # 288 3976, 234, 811,2989,2098,3977,2233,1441,3561,1615,2380, 668,2077,1638, 305, 228, # 304 1664,4515, 467, 415,5025, 262,2099,1593, 239, 108, 300, 200,1033, 512,1247,2078, # 320 5026,5027,2176,3207,3685,2682, 593, 845,1062,3277, 88,1723,2038,3978,1951, 212, # 336 266, 152, 149, 468,1899,4208,4516, 77, 187,5028,3038, 37, 5,2990,5029,3979, # 352 5030,5031, 39,2524,4517,2908,3208,2079, 55, 148, 74,4518, 545, 483,1474,1029, # 368 1665, 217,1870,1531,3138,1104,2655,4209, 24, 172,3562, 900,3980,3563,3564,4519, # 384 32,1408,2824,1312, 329, 487,2360,2251,2717, 784,2683, 4,3039,3351,1427,1789, # 400 188, 109, 499,5032,3686,1717,1790, 888,1217,3040,4520,5033,3565,5034,3352,1520, # 416 3687,3981, 196,1034, 775,5035,5036, 929,1816, 249, 439, 38,5037,1063,5038, 794, # 432 3982,1435,2301, 46, 178,3278,2066,5039,2381,5040, 214,1709,4521, 804, 35, 707, # 448 324,3688,1601,2554, 140, 459,4210,5041,5042,1365, 839, 272, 978,2262,2580,3456, # 464 2129,1363,3689,1423, 697, 100,3094, 48, 70,1231, 495,3139,2196,5043,1294,5044, # 480 2080, 462, 586,1042,3279, 853, 256, 988, 185,2382,3457,1698, 434,1084,5045,3458, # 496 314,2625,2788,4522,2335,2336, 569,2285, 637,1817,2525, 757,1162,1879,1616,3459, # 512 287,1577,2116, 768,4523,1671,2868,3566,2526,1321,3816, 909,2418,5046,4211, 933, # 528 3817,4212,2053,2361,1222,4524, 765,2419,1322, 786,4525,5047,1920,1462,1677,2909, # 544 1699,5048,4526,1424,2442,3140,3690,2600,3353,1775,1941,3460,3983,4213, 309,1369, # 560 1130,2825, 364,2234,1653,1299,3984,3567,3985,3986,2656, 525,1085,3041, 902,2001, # 576 1475, 964,4527, 421,1845,1415,1057,2286, 940,1364,3141, 376,4528,4529,1381, 7, # 592 2527, 983,2383, 336,1710,2684,1846, 321,3461, 559,1131,3042,2752,1809,1132,1313, # 608 265,1481,1858,5049, 352,1203,2826,3280, 167,1089, 420,2827, 776, 792,1724,3568, # 624 4214,2443,3281,5050,4215,5051, 446, 229, 333,2753, 901,3818,1200,1557,4530,2657, # 640 1921, 395,2754,2685,3819,4216,1836, 125, 916,3209,2626,4531,5052,5053,3820,5054, # 656 5055,5056,4532,3142,3691,1133,2555,1757,3462,1510,2318,1409,3569,5057,2146, 438, # 672 2601,2910,2384,3354,1068, 958,3043, 461, 311,2869,2686,4217,1916,3210,4218,1979, # 688 383, 750,2755,2627,4219, 274, 539, 385,1278,1442,5058,1154,1965, 384, 561, 210, # 704 98,1295,2556,3570,5059,1711,2420,1482,3463,3987,2911,1257, 129,5060,3821, 642, # 720 523,2789,2790,2658,5061, 141,2235,1333, 68, 176, 441, 876, 907,4220, 603,2602, # 736 710, 171,3464, 404, 549, 18,3143,2398,1410,3692,1666,5062,3571,4533,2912,4534, # 752 5063,2991, 368,5064, 146, 366, 99, 871,3693,1543, 748, 807,1586,1185, 22,2263, # 768 379,3822,3211,5065,3212, 505,1942,2628,1992,1382,2319,5066, 380,2362, 218, 702, # 784 1818,1248,3465,3044,3572,3355,3282,5067,2992,3694, 930,3283,3823,5068, 59,5069, # 800 585, 601,4221, 497,3466,1112,1314,4535,1802,5070,1223,1472,2177,5071, 749,1837, # 816 690,1900,3824,1773,3988,1476, 429,1043,1791,2236,2117, 917,4222, 447,1086,1629, # 832 5072, 556,5073,5074,2021,1654, 844,1090, 105, 550, 966,1758,2828,1008,1783, 686, # 848 1095,5075,2287, 793,1602,5076,3573,2603,4536,4223,2948,2302,4537,3825, 980,2503, # 864 544, 353, 527,4538, 908,2687,2913,5077, 381,2629,1943,1348,5078,1341,1252, 560, # 880 3095,5079,3467,2870,5080,2054, 973, 886,2081, 143,4539,5081,5082, 157,3989, 496, # 896 4224, 57, 840, 540,2039,4540,4541,3468,2118,1445, 970,2264,1748,1966,2082,4225, # 912 3144,1234,1776,3284,2829,3695, 773,1206,2130,1066,2040,1326,3990,1738,1725,4226, # 928 279,3145, 51,1544,2604, 423,1578,2131,2067, 173,4542,1880,5083,5084,1583, 264, # 944 610,3696,4543,2444, 280, 154,5085,5086,5087,1739, 338,1282,3096, 693,2871,1411, # 960 1074,3826,2445,5088,4544,5089,5090,1240, 952,2399,5091,2914,1538,2688, 685,1483, # 976 4227,2475,1436, 953,4228,2055,4545, 671,2400, 79,4229,2446,3285, 608, 567,2689, # 992 3469,4230,4231,1691, 393,1261,1792,2401,5092,4546,5093,5094,5095,5096,1383,1672, # 1008 3827,3213,1464, 522,1119, 661,1150, 216, 675,4547,3991,1432,3574, 609,4548,2690, # 1024 2402,5097,5098,5099,4232,3045, 0,5100,2476, 315, 231,2447, 301,3356,4549,2385, # 1040 5101, 233,4233,3697,1819,4550,4551,5102, 96,1777,1315,2083,5103, 257,5104,1810, # 1056 3698,2718,1139,1820,4234,2022,1124,2164,2791,1778,2659,5105,3097, 363,1655,3214, # 1072 5106,2993,5107,5108,5109,3992,1567,3993, 718, 103,3215, 849,1443, 341,3357,2949, # 1088 1484,5110,1712, 127, 67, 339,4235,2403, 679,1412, 821,5111,5112, 834, 738, 351, # 1104 2994,2147, 846, 235,1497,1881, 418,1993,3828,2719, 186,1100,2148,2756,3575,1545, # 1120 1355,2950,2872,1377, 583,3994,4236,2581,2995,5113,1298,3699,1078,2557,3700,2363, # 1136 78,3829,3830, 267,1289,2100,2002,1594,4237, 348, 369,1274,2197,2178,1838,4552, # 1152 1821,2830,3701,2757,2288,2003,4553,2951,2758, 144,3358, 882,4554,3995,2759,3470, # 1168 4555,2915,5114,4238,1726, 320,5115,3996,3046, 788,2996,5116,2831,1774,1327,2873, # 1184 3997,2832,5117,1306,4556,2004,1700,3831,3576,2364,2660, 787,2023, 506, 824,3702, # 1200 534, 323,4557,1044,3359,2024,1901, 946,3471,5118,1779,1500,1678,5119,1882,4558, # 1216 165, 243,4559,3703,2528, 123, 683,4239, 764,4560, 36,3998,1793, 589,2916, 816, # 1232 626,1667,3047,2237,1639,1555,1622,3832,3999,5120,4000,2874,1370,1228,1933, 891, # 1248 2084,2917, 304,4240,5121, 292,2997,2720,3577, 691,2101,4241,1115,4561, 118, 662, # 1264 5122, 611,1156, 854,2386,1316,2875, 2, 386, 515,2918,5123,5124,3286, 868,2238, # 1280 1486, 855,2661, 785,2216,3048,5125,1040,3216,3578,5126,3146, 448,5127,1525,5128, # 1296 2165,4562,5129,3833,5130,4242,2833,3579,3147, 503, 818,4001,3148,1568, 814, 676, # 1312 1444, 306,1749,5131,3834,1416,1030, 197,1428, 805,2834,1501,4563,5132,5133,5134, # 1328 1994,5135,4564,5136,5137,2198, 13,2792,3704,2998,3149,1229,1917,5138,3835,2132, # 1344 5139,4243,4565,2404,3580,5140,2217,1511,1727,1120,5141,5142, 646,3836,2448, 307, # 1360 5143,5144,1595,3217,5145,5146,5147,3705,1113,1356,4002,1465,2529,2530,5148, 519, # 1376 5149, 128,2133, 92,2289,1980,5150,4003,1512, 342,3150,2199,5151,2793,2218,1981, # 1392 3360,4244, 290,1656,1317, 789, 827,2365,5152,3837,4566, 562, 581,4004,5153, 401, # 1408 4567,2252, 94,4568,5154,1399,2794,5155,1463,2025,4569,3218,1944,5156, 828,1105, # 1424 4245,1262,1394,5157,4246, 605,4570,5158,1784,2876,5159,2835, 819,2102, 578,2200, # 1440 2952,5160,1502, 436,3287,4247,3288,2836,4005,2919,3472,3473,5161,2721,2320,5162, # 1456 5163,2337,2068, 23,4571, 193, 826,3838,2103, 699,1630,4248,3098, 390,1794,1064, # 1472 3581,5164,1579,3099,3100,1400,5165,4249,1839,1640,2877,5166,4572,4573, 137,4250, # 1488 598,3101,1967, 780, 104, 974,2953,5167, 278, 899, 253, 402, 572, 504, 493,1339, # 1504 5168,4006,1275,4574,2582,2558,5169,3706,3049,3102,2253, 565,1334,2722, 863, 41, # 1520 5170,5171,4575,5172,1657,2338, 19, 463,2760,4251, 606,5173,2999,3289,1087,2085, # 1536 1323,2662,3000,5174,1631,1623,1750,4252,2691,5175,2878, 791,2723,2663,2339, 232, # 1552 2421,5176,3001,1498,5177,2664,2630, 755,1366,3707,3290,3151,2026,1609, 119,1918, # 1568 3474, 862,1026,4253,5178,4007,3839,4576,4008,4577,2265,1952,2477,5179,1125, 817, # 1584 4254,4255,4009,1513,1766,2041,1487,4256,3050,3291,2837,3840,3152,5180,5181,1507, # 1600 5182,2692, 733, 40,1632,1106,2879, 345,4257, 841,2531, 230,4578,3002,1847,3292, # 1616 3475,5183,1263, 986,3476,5184, 735, 879, 254,1137, 857, 622,1300,1180,1388,1562, # 1632 4010,4011,2954, 967,2761,2665,1349, 592,2134,1692,3361,3003,1995,4258,1679,4012, # 1648 1902,2188,5185, 739,3708,2724,1296,1290,5186,4259,2201,2202,1922,1563,2605,2559, # 1664 1871,2762,3004,5187, 435,5188, 343,1108, 596, 17,1751,4579,2239,3477,3709,5189, # 1680 4580, 294,3582,2955,1693, 477, 979, 281,2042,3583, 643,2043,3710,2631,2795,2266, # 1696 1031,2340,2135,2303,3584,4581, 367,1249,2560,5190,3585,5191,4582,1283,3362,2005, # 1712 240,1762,3363,4583,4584, 836,1069,3153, 474,5192,2149,2532, 268,3586,5193,3219, # 1728 1521,1284,5194,1658,1546,4260,5195,3587,3588,5196,4261,3364,2693,1685,4262, 961, # 1744 1673,2632, 190,2006,2203,3841,4585,4586,5197, 570,2504,3711,1490,5198,4587,2633, # 1760 3293,1957,4588, 584,1514, 396,1045,1945,5199,4589,1968,2449,5200,5201,4590,4013, # 1776 619,5202,3154,3294, 215,2007,2796,2561,3220,4591,3221,4592, 763,4263,3842,4593, # 1792 5203,5204,1958,1767,2956,3365,3712,1174, 452,1477,4594,3366,3155,5205,2838,1253, # 1808 2387,2189,1091,2290,4264, 492,5206, 638,1169,1825,2136,1752,4014, 648, 926,1021, # 1824 1324,4595, 520,4596, 997, 847,1007, 892,4597,3843,2267,1872,3713,2405,1785,4598, # 1840 1953,2957,3103,3222,1728,4265,2044,3714,4599,2008,1701,3156,1551, 30,2268,4266, # 1856 5207,2027,4600,3589,5208, 501,5209,4267, 594,3478,2166,1822,3590,3479,3591,3223, # 1872 829,2839,4268,5210,1680,3157,1225,4269,5211,3295,4601,4270,3158,2341,5212,4602, # 1888 4271,5213,4015,4016,5214,1848,2388,2606,3367,5215,4603, 374,4017, 652,4272,4273, # 1904 375,1140, 798,5216,5217,5218,2366,4604,2269, 546,1659, 138,3051,2450,4605,5219, # 1920 2254, 612,1849, 910, 796,3844,1740,1371, 825,3845,3846,5220,2920,2562,5221, 692, # 1936 444,3052,2634, 801,4606,4274,5222,1491, 244,1053,3053,4275,4276, 340,5223,4018, # 1952 1041,3005, 293,1168, 87,1357,5224,1539, 959,5225,2240, 721, 694,4277,3847, 219, # 1968 1478, 644,1417,3368,2666,1413,1401,1335,1389,4019,5226,5227,3006,2367,3159,1826, # 1984 730,1515, 184,2840, 66,4607,5228,1660,2958, 246,3369, 378,1457, 226,3480, 975, # 2000 4020,2959,1264,3592, 674, 696,5229, 163,5230,1141,2422,2167, 713,3593,3370,4608, # 2016 4021,5231,5232,1186, 15,5233,1079,1070,5234,1522,3224,3594, 276,1050,2725, 758, # 2032 1126, 653,2960,3296,5235,2342, 889,3595,4022,3104,3007, 903,1250,4609,4023,3481, # 2048 3596,1342,1681,1718, 766,3297, 286, 89,2961,3715,5236,1713,5237,2607,3371,3008, # 2064 5238,2962,2219,3225,2880,5239,4610,2505,2533, 181, 387,1075,4024, 731,2190,3372, # 2080 5240,3298, 310, 313,3482,2304, 770,4278, 54,3054, 189,4611,3105,3848,4025,5241, # 2096 1230,1617,1850, 355,3597,4279,4612,3373, 111,4280,3716,1350,3160,3483,3055,4281, # 2112 2150,3299,3598,5242,2797,4026,4027,3009, 722,2009,5243,1071, 247,1207,2343,2478, # 2128 1378,4613,2010, 864,1437,1214,4614, 373,3849,1142,2220, 667,4615, 442,2763,2563, # 2144 3850,4028,1969,4282,3300,1840, 837, 170,1107, 934,1336,1883,5244,5245,2119,4283, # 2160 2841, 743,1569,5246,4616,4284, 582,2389,1418,3484,5247,1803,5248, 357,1395,1729, # 2176 3717,3301,2423,1564,2241,5249,3106,3851,1633,4617,1114,2086,4285,1532,5250, 482, # 2192 2451,4618,5251,5252,1492, 833,1466,5253,2726,3599,1641,2842,5254,1526,1272,3718, # 2208 4286,1686,1795, 416,2564,1903,1954,1804,5255,3852,2798,3853,1159,2321,5256,2881, # 2224 4619,1610,1584,3056,2424,2764, 443,3302,1163,3161,5257,5258,4029,5259,4287,2506, # 2240 3057,4620,4030,3162,2104,1647,3600,2011,1873,4288,5260,4289, 431,3485,5261, 250, # 2256 97, 81,4290,5262,1648,1851,1558, 160, 848,5263, 866, 740,1694,5264,2204,2843, # 2272 3226,4291,4621,3719,1687, 950,2479, 426, 469,3227,3720,3721,4031,5265,5266,1188, # 2288 424,1996, 861,3601,4292,3854,2205,2694, 168,1235,3602,4293,5267,2087,1674,4622, # 2304 3374,3303, 220,2565,1009,5268,3855, 670,3010, 332,1208, 717,5269,5270,3603,2452, # 2320 4032,3375,5271, 513,5272,1209,2882,3376,3163,4623,1080,5273,5274,5275,5276,2534, # 2336 3722,3604, 815,1587,4033,4034,5277,3605,3486,3856,1254,4624,1328,3058,1390,4035, # 2352 1741,4036,3857,4037,5278, 236,3858,2453,3304,5279,5280,3723,3859,1273,3860,4625, # 2368 5281, 308,5282,4626, 245,4627,1852,2480,1307,2583, 430, 715,2137,2454,5283, 270, # 2384 199,2883,4038,5284,3606,2727,1753, 761,1754, 725,1661,1841,4628,3487,3724,5285, # 2400 5286, 587, 14,3305, 227,2608, 326, 480,2270, 943,2765,3607, 291, 650,1884,5287, # 2416 1702,1226, 102,1547, 62,3488, 904,4629,3489,1164,4294,5288,5289,1224,1548,2766, # 2432 391, 498,1493,5290,1386,1419,5291,2056,1177,4630, 813, 880,1081,2368, 566,1145, # 2448 4631,2291,1001,1035,2566,2609,2242, 394,1286,5292,5293,2069,5294, 86,1494,1730, # 2464 4039, 491,1588, 745, 897,2963, 843,3377,4040,2767,2884,3306,1768, 998,2221,2070, # 2480 397,1827,1195,1970,3725,3011,3378, 284,5295,3861,2507,2138,2120,1904,5296,4041, # 2496 2151,4042,4295,1036,3490,1905, 114,2567,4296, 209,1527,5297,5298,2964,2844,2635, # 2512 2390,2728,3164, 812,2568,5299,3307,5300,1559, 737,1885,3726,1210, 885, 28,2695, # 2528 3608,3862,5301,4297,1004,1780,4632,5302, 346,1982,2222,2696,4633,3863,1742, 797, # 2544 1642,4043,1934,1072,1384,2152, 896,4044,3308,3727,3228,2885,3609,5303,2569,1959, # 2560 4634,2455,1786,5304,5305,5306,4045,4298,1005,1308,3728,4299,2729,4635,4636,1528, # 2576 2610, 161,1178,4300,1983, 987,4637,1101,4301, 631,4046,1157,3229,2425,1343,1241, # 2592 1016,2243,2570, 372, 877,2344,2508,1160, 555,1935, 911,4047,5307, 466,1170, 169, # 2608 1051,2921,2697,3729,2481,3012,1182,2012,2571,1251,2636,5308, 992,2345,3491,1540, # 2624 2730,1201,2071,2406,1997,2482,5309,4638, 528,1923,2191,1503,1874,1570,2369,3379, # 2640 3309,5310, 557,1073,5311,1828,3492,2088,2271,3165,3059,3107, 767,3108,2799,4639, # 2656 1006,4302,4640,2346,1267,2179,3730,3230, 778,4048,3231,2731,1597,2667,5312,4641, # 2672 5313,3493,5314,5315,5316,3310,2698,1433,3311, 131, 95,1504,4049, 723,4303,3166, # 2688 1842,3610,2768,2192,4050,2028,2105,3731,5317,3013,4051,1218,5318,3380,3232,4052, # 2704 4304,2584, 248,1634,3864, 912,5319,2845,3732,3060,3865, 654, 53,5320,3014,5321, # 2720 1688,4642, 777,3494,1032,4053,1425,5322, 191, 820,2121,2846, 971,4643, 931,3233, # 2736 135, 664, 783,3866,1998, 772,2922,1936,4054,3867,4644,2923,3234, 282,2732, 640, # 2752 1372,3495,1127, 922, 325,3381,5323,5324, 711,2045,5325,5326,4055,2223,2800,1937, # 2768 4056,3382,2224,2255,3868,2305,5327,4645,3869,1258,3312,4057,3235,2139,2965,4058, # 2784 4059,5328,2225, 258,3236,4646, 101,1227,5329,3313,1755,5330,1391,3314,5331,2924, # 2800 2057, 893,5332,5333,5334,1402,4305,2347,5335,5336,3237,3611,5337,5338, 878,1325, # 2816 1781,2801,4647, 259,1385,2585, 744,1183,2272,4648,5339,4060,2509,5340, 684,1024, # 2832 4306,5341, 472,3612,3496,1165,3315,4061,4062, 322,2153, 881, 455,1695,1152,1340, # 2848 660, 554,2154,4649,1058,4650,4307, 830,1065,3383,4063,4651,1924,5342,1703,1919, # 2864 5343, 932,2273, 122,5344,4652, 947, 677,5345,3870,2637, 297,1906,1925,2274,4653, # 2880 2322,3316,5346,5347,4308,5348,4309, 84,4310, 112, 989,5349, 547,1059,4064, 701, # 2896 3613,1019,5350,4311,5351,3497, 942, 639, 457,2306,2456, 993,2966, 407, 851, 494, # 2912 4654,3384, 927,5352,1237,5353,2426,3385, 573,4312, 680, 921,2925,1279,1875, 285, # 2928 790,1448,1984, 719,2168,5354,5355,4655,4065,4066,1649,5356,1541, 563,5357,1077, # 2944 5358,3386,3061,3498, 511,3015,4067,4068,3733,4069,1268,2572,3387,3238,4656,4657, # 2960 5359, 535,1048,1276,1189,2926,2029,3167,1438,1373,2847,2967,1134,2013,5360,4313, # 2976 1238,2586,3109,1259,5361, 700,5362,2968,3168,3734,4314,5363,4315,1146,1876,1907, # 2992 4658,2611,4070, 781,2427, 132,1589, 203, 147, 273,2802,2407, 898,1787,2155,4071, # 3008 4072,5364,3871,2803,5365,5366,4659,4660,5367,3239,5368,1635,3872, 965,5369,1805, # 3024 2699,1516,3614,1121,1082,1329,3317,4073,1449,3873, 65,1128,2848,2927,2769,1590, # 3040 3874,5370,5371, 12,2668, 45, 976,2587,3169,4661, 517,2535,1013,1037,3240,5372, # 3056 3875,2849,5373,3876,5374,3499,5375,2612, 614,1999,2323,3877,3110,2733,2638,5376, # 3072 2588,4316, 599,1269,5377,1811,3735,5378,2700,3111, 759,1060, 489,1806,3388,3318, # 3088 1358,5379,5380,2391,1387,1215,2639,2256, 490,5381,5382,4317,1759,2392,2348,5383, # 3104 4662,3878,1908,4074,2640,1807,3241,4663,3500,3319,2770,2349, 874,5384,5385,3501, # 3120 3736,1859, 91,2928,3737,3062,3879,4664,5386,3170,4075,2669,5387,3502,1202,1403, # 3136 3880,2969,2536,1517,2510,4665,3503,2511,5388,4666,5389,2701,1886,1495,1731,4076, # 3152 2370,4667,5390,2030,5391,5392,4077,2702,1216, 237,2589,4318,2324,4078,3881,4668, # 3168 4669,2703,3615,3504, 445,4670,5393,5394,5395,5396,2771, 61,4079,3738,1823,4080, # 3184 5397, 687,2046, 935, 925, 405,2670, 703,1096,1860,2734,4671,4081,1877,1367,2704, # 3200 3389, 918,2106,1782,2483, 334,3320,1611,1093,4672, 564,3171,3505,3739,3390, 945, # 3216 2641,2058,4673,5398,1926, 872,4319,5399,3506,2705,3112, 349,4320,3740,4082,4674, # 3232 3882,4321,3741,2156,4083,4675,4676,4322,4677,2408,2047, 782,4084, 400, 251,4323, # 3248 1624,5400,5401, 277,3742, 299,1265, 476,1191,3883,2122,4324,4325,1109, 205,5402, # 3264 2590,1000,2157,3616,1861,5403,5404,5405,4678,5406,4679,2573, 107,2484,2158,4085, # 3280 3507,3172,5407,1533, 541,1301, 158, 753,4326,2886,3617,5408,1696, 370,1088,4327, # 3296 4680,3618, 579, 327, 440, 162,2244, 269,1938,1374,3508, 968,3063, 56,1396,3113, # 3312 2107,3321,3391,5409,1927,2159,4681,3016,5410,3619,5411,5412,3743,4682,2485,5413, # 3328 2804,5414,1650,4683,5415,2613,5416,5417,4086,2671,3392,1149,3393,4087,3884,4088, # 3344 5418,1076, 49,5419, 951,3242,3322,3323, 450,2850, 920,5420,1812,2805,2371,4328, # 3360 1909,1138,2372,3885,3509,5421,3243,4684,1910,1147,1518,2428,4685,3886,5422,4686, # 3376 2393,2614, 260,1796,3244,5423,5424,3887,3324, 708,5425,3620,1704,5426,3621,1351, # 3392 1618,3394,3017,1887, 944,4329,3395,4330,3064,3396,4331,5427,3744, 422, 413,1714, # 3408 3325, 500,2059,2350,4332,2486,5428,1344,1911, 954,5429,1668,5430,5431,4089,2409, # 3424 4333,3622,3888,4334,5432,2307,1318,2512,3114, 133,3115,2887,4687, 629, 31,2851, # 3440 2706,3889,4688, 850, 949,4689,4090,2970,1732,2089,4335,1496,1853,5433,4091, 620, # 3456 3245, 981,1242,3745,3397,1619,3746,1643,3326,2140,2457,1971,1719,3510,2169,5434, # 3472 3246,5435,5436,3398,1829,5437,1277,4690,1565,2048,5438,1636,3623,3116,5439, 869, # 3488 2852, 655,3890,3891,3117,4092,3018,3892,1310,3624,4691,5440,5441,5442,1733, 558, # 3504 4692,3747, 335,1549,3065,1756,4336,3748,1946,3511,1830,1291,1192, 470,2735,2108, # 3520 2806, 913,1054,4093,5443,1027,5444,3066,4094,4693, 982,2672,3399,3173,3512,3247, # 3536 3248,1947,2807,5445, 571,4694,5446,1831,5447,3625,2591,1523,2429,5448,2090, 984, # 3552 4695,3749,1960,5449,3750, 852, 923,2808,3513,3751, 969,1519, 999,2049,2325,1705, # 3568 5450,3118, 615,1662, 151, 597,4095,2410,2326,1049, 275,4696,3752,4337, 568,3753, # 3584 3626,2487,4338,3754,5451,2430,2275, 409,3249,5452,1566,2888,3514,1002, 769,2853, # 3600 194,2091,3174,3755,2226,3327,4339, 628,1505,5453,5454,1763,2180,3019,4096, 521, # 3616 1161,2592,1788,2206,2411,4697,4097,1625,4340,4341, 412, 42,3119, 464,5455,2642, # 3632 4698,3400,1760,1571,2889,3515,2537,1219,2207,3893,2643,2141,2373,4699,4700,3328, # 3648 1651,3401,3627,5456,5457,3628,2488,3516,5458,3756,5459,5460,2276,2092, 460,5461, # 3664 4701,5462,3020, 962, 588,3629, 289,3250,2644,1116, 52,5463,3067,1797,5464,5465, # 3680 5466,1467,5467,1598,1143,3757,4342,1985,1734,1067,4702,1280,3402, 465,4703,1572, # 3696 510,5468,1928,2245,1813,1644,3630,5469,4704,3758,5470,5471,2673,1573,1534,5472, # 3712 5473, 536,1808,1761,3517,3894,3175,2645,5474,5475,5476,4705,3518,2929,1912,2809, # 3728 5477,3329,1122, 377,3251,5478, 360,5479,5480,4343,1529, 551,5481,2060,3759,1769, # 3744 2431,5482,2930,4344,3330,3120,2327,2109,2031,4706,1404, 136,1468,1479, 672,1171, # 3760 3252,2308, 271,3176,5483,2772,5484,2050, 678,2736, 865,1948,4707,5485,2014,4098, # 3776 2971,5486,2737,2227,1397,3068,3760,4708,4709,1735,2931,3403,3631,5487,3895, 509, # 3792 2854,2458,2890,3896,5488,5489,3177,3178,4710,4345,2538,4711,2309,1166,1010, 552, # 3808 681,1888,5490,5491,2972,2973,4099,1287,1596,1862,3179, 358, 453, 736, 175, 478, # 3824 1117, 905,1167,1097,5492,1854,1530,5493,1706,5494,2181,3519,2292,3761,3520,3632, # 3840 4346,2093,4347,5495,3404,1193,2489,4348,1458,2193,2208,1863,1889,1421,3331,2932, # 3856 3069,2182,3521, 595,2123,5496,4100,5497,5498,4349,1707,2646, 223,3762,1359, 751, # 3872 3121, 183,3522,5499,2810,3021, 419,2374, 633, 704,3897,2394, 241,5500,5501,5502, # 3888 838,3022,3763,2277,2773,2459,3898,1939,2051,4101,1309,3122,2246,1181,5503,1136, # 3904 2209,3899,2375,1446,4350,2310,4712,5504,5505,4351,1055,2615, 484,3764,5506,4102, # 3920 625,4352,2278,3405,1499,4353,4103,5507,4104,4354,3253,2279,2280,3523,5508,5509, # 3936 2774, 808,2616,3765,3406,4105,4355,3123,2539, 526,3407,3900,4356, 955,5510,1620, # 3952 4357,2647,2432,5511,1429,3766,1669,1832, 994, 928,5512,3633,1260,5513,5514,5515, # 3968 1949,2293, 741,2933,1626,4358,2738,2460, 867,1184, 362,3408,1392,5516,5517,4106, # 3984 4359,1770,1736,3254,2934,4713,4714,1929,2707,1459,1158,5518,3070,3409,2891,1292, # 4000 1930,2513,2855,3767,1986,1187,2072,2015,2617,4360,5519,2574,2514,2170,3768,2490, # 4016 3332,5520,3769,4715,5521,5522, 666,1003,3023,1022,3634,4361,5523,4716,1814,2257, # 4032 574,3901,1603, 295,1535, 705,3902,4362, 283, 858, 417,5524,5525,3255,4717,4718, # 4048 3071,1220,1890,1046,2281,2461,4107,1393,1599, 689,2575, 388,4363,5526,2491, 802, # 4064 5527,2811,3903,2061,1405,2258,5528,4719,3904,2110,1052,1345,3256,1585,5529, 809, # 4080 5530,5531,5532, 575,2739,3524, 956,1552,1469,1144,2328,5533,2329,1560,2462,3635, # 4096 3257,4108, 616,2210,4364,3180,2183,2294,5534,1833,5535,3525,4720,5536,1319,3770, # 4112 3771,1211,3636,1023,3258,1293,2812,5537,5538,5539,3905, 607,2311,3906, 762,2892, # 4128 1439,4365,1360,4721,1485,3072,5540,4722,1038,4366,1450,2062,2648,4367,1379,4723, # 4144 2593,5541,5542,4368,1352,1414,2330,2935,1172,5543,5544,3907,3908,4724,1798,1451, # 4160 5545,5546,5547,5548,2936,4109,4110,2492,2351, 411,4111,4112,3637,3333,3124,4725, # 4176 1561,2674,1452,4113,1375,5549,5550, 47,2974, 316,5551,1406,1591,2937,3181,5552, # 4192 1025,2142,3125,3182, 354,2740, 884,2228,4369,2412, 508,3772, 726,3638, 996,2433, # 4208 3639, 729,5553, 392,2194,1453,4114,4726,3773,5554,5555,2463,3640,2618,1675,2813, # 4224 919,2352,2975,2353,1270,4727,4115, 73,5556,5557, 647,5558,3259,2856,2259,1550, # 4240 1346,3024,5559,1332, 883,3526,5560,5561,5562,5563,3334,2775,5564,1212, 831,1347, # 4256 4370,4728,2331,3909,1864,3073, 720,3910,4729,4730,3911,5565,4371,5566,5567,4731, # 4272 5568,5569,1799,4732,3774,2619,4733,3641,1645,2376,4734,5570,2938, 669,2211,2675, # 4288 2434,5571,2893,5572,5573,1028,3260,5574,4372,2413,5575,2260,1353,5576,5577,4735, # 4304 3183, 518,5578,4116,5579,4373,1961,5580,2143,4374,5581,5582,3025,2354,2355,3912, # 4320 516,1834,1454,4117,2708,4375,4736,2229,2620,1972,1129,3642,5583,2776,5584,2976, # 4336 1422, 577,1470,3026,1524,3410,5585,5586, 432,4376,3074,3527,5587,2594,1455,2515, # 4352 2230,1973,1175,5588,1020,2741,4118,3528,4737,5589,2742,5590,1743,1361,3075,3529, # 4368 2649,4119,4377,4738,2295, 895, 924,4378,2171, 331,2247,3076, 166,1627,3077,1098, # 4384 5591,1232,2894,2231,3411,4739, 657, 403,1196,2377, 542,3775,3412,1600,4379,3530, # 4400 5592,4740,2777,3261, 576, 530,1362,4741,4742,2540,2676,3776,4120,5593, 842,3913, # 4416 5594,2814,2032,1014,4121, 213,2709,3413, 665, 621,4380,5595,3777,2939,2435,5596, # 4432 2436,3335,3643,3414,4743,4381,2541,4382,4744,3644,1682,4383,3531,1380,5597, 724, # 4448 2282, 600,1670,5598,1337,1233,4745,3126,2248,5599,1621,4746,5600, 651,4384,5601, # 4464 1612,4385,2621,5602,2857,5603,2743,2312,3078,5604, 716,2464,3079, 174,1255,2710, # 4480 4122,3645, 548,1320,1398, 728,4123,1574,5605,1891,1197,3080,4124,5606,3081,3082, # 4496 3778,3646,3779, 747,5607, 635,4386,4747,5608,5609,5610,4387,5611,5612,4748,5613, # 4512 3415,4749,2437, 451,5614,3780,2542,2073,4388,2744,4389,4125,5615,1764,4750,5616, # 4528 4390, 350,4751,2283,2395,2493,5617,4391,4126,2249,1434,4127, 488,4752, 458,4392, # 4544 4128,3781, 771,1330,2396,3914,2576,3184,2160,2414,1553,2677,3185,4393,5618,2494, # 4560 2895,2622,1720,2711,4394,3416,4753,5619,2543,4395,5620,3262,4396,2778,5621,2016, # 4576 2745,5622,1155,1017,3782,3915,5623,3336,2313, 201,1865,4397,1430,5624,4129,5625, # 4592 5626,5627,5628,5629,4398,1604,5630, 414,1866, 371,2595,4754,4755,3532,2017,3127, # 4608 4756,1708, 960,4399, 887, 389,2172,1536,1663,1721,5631,2232,4130,2356,2940,1580, # 4624 5632,5633,1744,4757,2544,4758,4759,5634,4760,5635,2074,5636,4761,3647,3417,2896, # 4640 4400,5637,4401,2650,3418,2815, 673,2712,2465, 709,3533,4131,3648,4402,5638,1148, # 4656 502, 634,5639,5640,1204,4762,3649,1575,4763,2623,3783,5641,3784,3128, 948,3263, # 4672 121,1745,3916,1110,5642,4403,3083,2516,3027,4132,3785,1151,1771,3917,1488,4133, # 4688 1987,5643,2438,3534,5644,5645,2094,5646,4404,3918,1213,1407,2816, 531,2746,2545, # 4704 3264,1011,1537,4764,2779,4405,3129,1061,5647,3786,3787,1867,2897,5648,2018, 120, # 4720 4406,4407,2063,3650,3265,2314,3919,2678,3419,1955,4765,4134,5649,3535,1047,2713, # 4736 1266,5650,1368,4766,2858, 649,3420,3920,2546,2747,1102,2859,2679,5651,5652,2000, # 4752 5653,1111,3651,2977,5654,2495,3921,3652,2817,1855,3421,3788,5655,5656,3422,2415, # 4768 2898,3337,3266,3653,5657,2577,5658,3654,2818,4135,1460, 856,5659,3655,5660,2899, # 4784 2978,5661,2900,3922,5662,4408, 632,2517, 875,3923,1697,3924,2296,5663,5664,4767, # 4800 3028,1239, 580,4768,4409,5665, 914, 936,2075,1190,4136,1039,2124,5666,5667,5668, # 4816 5669,3423,1473,5670,1354,4410,3925,4769,2173,3084,4137, 915,3338,4411,4412,3339, # 4832 1605,1835,5671,2748, 398,3656,4413,3926,4138, 328,1913,2860,4139,3927,1331,4414, # 4848 3029, 937,4415,5672,3657,4140,4141,3424,2161,4770,3425, 524, 742, 538,3085,1012, # 4864 5673,5674,3928,2466,5675, 658,1103, 225,3929,5676,5677,4771,5678,4772,5679,3267, # 4880 1243,5680,4142, 963,2250,4773,5681,2714,3658,3186,5682,5683,2596,2332,5684,4774, # 4896 5685,5686,5687,3536, 957,3426,2547,2033,1931,2941,2467, 870,2019,3659,1746,2780, # 4912 2781,2439,2468,5688,3930,5689,3789,3130,3790,3537,3427,3791,5690,1179,3086,5691, # 4928 3187,2378,4416,3792,2548,3188,3131,2749,4143,5692,3428,1556,2549,2297, 977,2901, # 4944 2034,4144,1205,3429,5693,1765,3430,3189,2125,1271, 714,1689,4775,3538,5694,2333, # 4960 3931, 533,4417,3660,2184, 617,5695,2469,3340,3539,2315,5696,5697,3190,5698,5699, # 4976 3932,1988, 618, 427,2651,3540,3431,5700,5701,1244,1690,5702,2819,4418,4776,5703, # 4992 3541,4777,5704,2284,1576, 473,3661,4419,3432, 972,5705,3662,5706,3087,5707,5708, # 5008 4778,4779,5709,3793,4145,4146,5710, 153,4780, 356,5711,1892,2902,4420,2144, 408, # 5024 803,2357,5712,3933,5713,4421,1646,2578,2518,4781,4782,3934,5714,3935,4422,5715, # 5040 2416,3433, 752,5716,5717,1962,3341,2979,5718, 746,3030,2470,4783,4423,3794, 698, # 5056 4784,1893,4424,3663,2550,4785,3664,3936,5719,3191,3434,5720,1824,1302,4147,2715, # 5072 3937,1974,4425,5721,4426,3192, 823,1303,1288,1236,2861,3542,4148,3435, 774,3938, # 5088 5722,1581,4786,1304,2862,3939,4787,5723,2440,2162,1083,3268,4427,4149,4428, 344, # 5104 1173, 288,2316, 454,1683,5724,5725,1461,4788,4150,2597,5726,5727,4789, 985, 894, # 5120 5728,3436,3193,5729,1914,2942,3795,1989,5730,2111,1975,5731,4151,5732,2579,1194, # 5136 425,5733,4790,3194,1245,3796,4429,5734,5735,2863,5736, 636,4791,1856,3940, 760, # 5152 1800,5737,4430,2212,1508,4792,4152,1894,1684,2298,5738,5739,4793,4431,4432,2213, # 5168 479,5740,5741, 832,5742,4153,2496,5743,2980,2497,3797, 990,3132, 627,1815,2652, # 5184 4433,1582,4434,2126,2112,3543,4794,5744, 799,4435,3195,5745,4795,2113,1737,3031, # 5200 1018, 543, 754,4436,3342,1676,4796,4797,4154,4798,1489,5746,3544,5747,2624,2903, # 5216 4155,5748,5749,2981,5750,5751,5752,5753,3196,4799,4800,2185,1722,5754,3269,3270, # 5232 1843,3665,1715, 481, 365,1976,1857,5755,5756,1963,2498,4801,5757,2127,3666,3271, # 5248 433,1895,2064,2076,5758, 602,2750,5759,5760,5761,5762,5763,3032,1628,3437,5764, # 5264 3197,4802,4156,2904,4803,2519,5765,2551,2782,5766,5767,5768,3343,4804,2905,5769, # 5280 4805,5770,2864,4806,4807,1221,2982,4157,2520,5771,5772,5773,1868,1990,5774,5775, # 5296 5776,1896,5777,5778,4808,1897,4158, 318,5779,2095,4159,4437,5780,5781, 485,5782, # 5312 938,3941, 553,2680, 116,5783,3942,3667,5784,3545,2681,2783,3438,3344,2820,5785, # 5328 3668,2943,4160,1747,2944,2983,5786,5787, 207,5788,4809,5789,4810,2521,5790,3033, # 5344 890,3669,3943,5791,1878,3798,3439,5792,2186,2358,3440,1652,5793,5794,5795, 941, # 5360 2299, 208,3546,4161,2020, 330,4438,3944,2906,2499,3799,4439,4811,5796,5797,5798, # 5376 #last 512 #Everything below is of no interest for detection purpose 2522,1613,4812,5799,3345,3945,2523,5800,4162,5801,1637,4163,2471,4813,3946,5802, # 5392 2500,3034,3800,5803,5804,2195,4814,5805,2163,5806,5807,5808,5809,5810,5811,5812, # 5408 5813,5814,5815,5816,5817,5818,5819,5820,5821,5822,5823,5824,5825,5826,5827,5828, # 5424 5829,5830,5831,5832,5833,5834,5835,5836,5837,5838,5839,5840,5841,5842,5843,5844, # 5440 5845,5846,5847,5848,5849,5850,5851,5852,5853,5854,5855,5856,5857,5858,5859,5860, # 5456 5861,5862,5863,5864,5865,5866,5867,5868,5869,5870,5871,5872,5873,5874,5875,5876, # 5472 5877,5878,5879,5880,5881,5882,5883,5884,5885,5886,5887,5888,5889,5890,5891,5892, # 5488 5893,5894,5895,5896,5897,5898,5899,5900,5901,5902,5903,5904,5905,5906,5907,5908, # 5504 5909,5910,5911,5912,5913,5914,5915,5916,5917,5918,5919,5920,5921,5922,5923,5924, # 5520 5925,5926,5927,5928,5929,5930,5931,5932,5933,5934,5935,5936,5937,5938,5939,5940, # 5536 5941,5942,5943,5944,5945,5946,5947,5948,5949,5950,5951,5952,5953,5954,5955,5956, # 5552 5957,5958,5959,5960,5961,5962,5963,5964,5965,5966,5967,5968,5969,5970,5971,5972, # 5568 5973,5974,5975,5976,5977,5978,5979,5980,5981,5982,5983,5984,5985,5986,5987,5988, # 5584 5989,5990,5991,5992,5993,5994,5995,5996,5997,5998,5999,6000,6001,6002,6003,6004, # 5600 6005,6006,6007,6008,6009,6010,6011,6012,6013,6014,6015,6016,6017,6018,6019,6020, # 5616 6021,6022,6023,6024,6025,6026,6027,6028,6029,6030,6031,6032,6033,6034,6035,6036, # 5632 6037,6038,6039,6040,6041,6042,6043,6044,6045,6046,6047,6048,6049,6050,6051,6052, # 5648 6053,6054,6055,6056,6057,6058,6059,6060,6061,6062,6063,6064,6065,6066,6067,6068, # 5664 6069,6070,6071,6072,6073,6074,6075,6076,6077,6078,6079,6080,6081,6082,6083,6084, # 5680 6085,6086,6087,6088,6089,6090,6091,6092,6093,6094,6095,6096,6097,6098,6099,6100, # 5696 6101,6102,6103,6104,6105,6106,6107,6108,6109,6110,6111,6112,6113,6114,6115,6116, # 5712 6117,6118,6119,6120,6121,6122,6123,6124,6125,6126,6127,6128,6129,6130,6131,6132, # 5728 6133,6134,6135,6136,6137,6138,6139,6140,6141,6142,6143,6144,6145,6146,6147,6148, # 5744 6149,6150,6151,6152,6153,6154,6155,6156,6157,6158,6159,6160,6161,6162,6163,6164, # 5760 6165,6166,6167,6168,6169,6170,6171,6172,6173,6174,6175,6176,6177,6178,6179,6180, # 5776 6181,6182,6183,6184,6185,6186,6187,6188,6189,6190,6191,6192,6193,6194,6195,6196, # 5792 6197,6198,6199,6200,6201,6202,6203,6204,6205,6206,6207,6208,6209,6210,6211,6212, # 5808 6213,6214,6215,6216,6217,6218,6219,6220,6221,6222,6223,3670,6224,6225,6226,6227, # 5824 6228,6229,6230,6231,6232,6233,6234,6235,6236,6237,6238,6239,6240,6241,6242,6243, # 5840 6244,6245,6246,6247,6248,6249,6250,6251,6252,6253,6254,6255,6256,6257,6258,6259, # 5856 6260,6261,6262,6263,6264,6265,6266,6267,6268,6269,6270,6271,6272,6273,6274,6275, # 5872 6276,6277,6278,6279,6280,6281,6282,6283,6284,6285,4815,6286,6287,6288,6289,6290, # 5888 6291,6292,4816,6293,6294,6295,6296,6297,6298,6299,6300,6301,6302,6303,6304,6305, # 5904 6306,6307,6308,6309,6310,6311,4817,4818,6312,6313,6314,6315,6316,6317,6318,4819, # 5920 6319,6320,6321,6322,6323,6324,6325,6326,6327,6328,6329,6330,6331,6332,6333,6334, # 5936 6335,6336,6337,4820,6338,6339,6340,6341,6342,6343,6344,6345,6346,6347,6348,6349, # 5952 6350,6351,6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363,6364,6365, # 5968 6366,6367,6368,6369,6370,6371,6372,6373,6374,6375,6376,6377,6378,6379,6380,6381, # 5984 6382,6383,6384,6385,6386,6387,6388,6389,6390,6391,6392,6393,6394,6395,6396,6397, # 6000 6398,6399,6400,6401,6402,6403,6404,6405,6406,6407,6408,6409,6410,3441,6411,6412, # 6016 6413,6414,6415,6416,6417,6418,6419,6420,6421,6422,6423,6424,6425,4440,6426,6427, # 6032 6428,6429,6430,6431,6432,6433,6434,6435,6436,6437,6438,6439,6440,6441,6442,6443, # 6048 6444,6445,6446,6447,6448,6449,6450,6451,6452,6453,6454,4821,6455,6456,6457,6458, # 6064 6459,6460,6461,6462,6463,6464,6465,6466,6467,6468,6469,6470,6471,6472,6473,6474, # 6080 6475,6476,6477,3947,3948,6478,6479,6480,6481,3272,4441,6482,6483,6484,6485,4442, # 6096 6486,6487,6488,6489,6490,6491,6492,6493,6494,6495,6496,4822,6497,6498,6499,6500, # 6112 6501,6502,6503,6504,6505,6506,6507,6508,6509,6510,6511,6512,6513,6514,6515,6516, # 6128 6517,6518,6519,6520,6521,6522,6523,6524,6525,6526,6527,6528,6529,6530,6531,6532, # 6144 6533,6534,6535,6536,6537,6538,6539,6540,6541,6542,6543,6544,6545,6546,6547,6548, # 6160 6549,6550,6551,6552,6553,6554,6555,6556,2784,6557,4823,6558,6559,6560,6561,6562, # 6176 6563,6564,6565,6566,6567,6568,6569,3949,6570,6571,6572,4824,6573,6574,6575,6576, # 6192 6577,6578,6579,6580,6581,6582,6583,4825,6584,6585,6586,3950,2785,6587,6588,6589, # 6208 6590,6591,6592,6593,6594,6595,6596,6597,6598,6599,6600,6601,6602,6603,6604,6605, # 6224 6606,6607,6608,6609,6610,6611,6612,4826,6613,6614,6615,4827,6616,6617,6618,6619, # 6240 6620,6621,6622,6623,6624,6625,4164,6626,6627,6628,6629,6630,6631,6632,6633,6634, # 6256 3547,6635,4828,6636,6637,6638,6639,6640,6641,6642,3951,2984,6643,6644,6645,6646, # 6272 6647,6648,6649,4165,6650,4829,6651,6652,4830,6653,6654,6655,6656,6657,6658,6659, # 6288 6660,6661,6662,4831,6663,6664,6665,6666,6667,6668,6669,6670,6671,4166,6672,4832, # 6304 3952,6673,6674,6675,6676,4833,6677,6678,6679,4167,6680,6681,6682,3198,6683,6684, # 6320 6685,6686,6687,6688,6689,6690,6691,6692,6693,6694,6695,6696,6697,4834,6698,6699, # 6336 6700,6701,6702,6703,6704,6705,6706,6707,6708,6709,6710,6711,6712,6713,6714,6715, # 6352 6716,6717,6718,6719,6720,6721,6722,6723,6724,6725,6726,6727,6728,6729,6730,6731, # 6368 6732,6733,6734,4443,6735,6736,6737,6738,6739,6740,6741,6742,6743,6744,6745,4444, # 6384 6746,6747,6748,6749,6750,6751,6752,6753,6754,6755,6756,6757,6758,6759,6760,6761, # 6400 6762,6763,6764,6765,6766,6767,6768,6769,6770,6771,6772,6773,6774,6775,6776,6777, # 6416 6778,6779,6780,6781,4168,6782,6783,3442,6784,6785,6786,6787,6788,6789,6790,6791, # 6432 4169,6792,6793,6794,6795,6796,6797,6798,6799,6800,6801,6802,6803,6804,6805,6806, # 6448 6807,6808,6809,6810,6811,4835,6812,6813,6814,4445,6815,6816,4446,6817,6818,6819, # 6464 6820,6821,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6834,6835, # 6480 3548,6836,6837,6838,6839,6840,6841,6842,6843,6844,6845,6846,4836,6847,6848,6849, # 6496 6850,6851,6852,6853,6854,3953,6855,6856,6857,6858,6859,6860,6861,6862,6863,6864, # 6512 6865,6866,6867,6868,6869,6870,6871,6872,6873,6874,6875,6876,6877,3199,6878,6879, # 6528 6880,6881,6882,4447,6883,6884,6885,6886,6887,6888,6889,6890,6891,6892,6893,6894, # 6544 6895,6896,6897,6898,6899,6900,6901,6902,6903,6904,4170,6905,6906,6907,6908,6909, # 6560 6910,6911,6912,6913,6914,6915,6916,6917,6918,6919,6920,6921,6922,6923,6924,6925, # 6576 6926,6927,4837,6928,6929,6930,6931,6932,6933,6934,6935,6936,3346,6937,6938,4838, # 6592 6939,6940,6941,4448,6942,6943,6944,6945,6946,4449,6947,6948,6949,6950,6951,6952, # 6608 6953,6954,6955,6956,6957,6958,6959,6960,6961,6962,6963,6964,6965,6966,6967,6968, # 6624 6969,6970,6971,6972,6973,6974,6975,6976,6977,6978,6979,6980,6981,6982,6983,6984, # 6640 6985,6986,6987,6988,6989,6990,6991,6992,6993,6994,3671,6995,6996,6997,6998,4839, # 6656 6999,7000,7001,7002,3549,7003,7004,7005,7006,7007,7008,7009,7010,7011,7012,7013, # 6672 7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025,7026,7027,7028,7029, # 6688 7030,4840,7031,7032,7033,7034,7035,7036,7037,7038,4841,7039,7040,7041,7042,7043, # 6704 7044,7045,7046,7047,7048,7049,7050,7051,7052,7053,7054,7055,7056,7057,7058,7059, # 6720 7060,7061,7062,7063,7064,7065,7066,7067,7068,7069,7070,2985,7071,7072,7073,7074, # 6736 7075,7076,7077,7078,7079,7080,4842,7081,7082,7083,7084,7085,7086,7087,7088,7089, # 6752 7090,7091,7092,7093,7094,7095,7096,7097,7098,7099,7100,7101,7102,7103,7104,7105, # 6768 7106,7107,7108,7109,7110,7111,7112,7113,7114,7115,7116,7117,7118,4450,7119,7120, # 6784 7121,7122,7123,7124,7125,7126,7127,7128,7129,7130,7131,7132,7133,7134,7135,7136, # 6800 7137,7138,7139,7140,7141,7142,7143,4843,7144,7145,7146,7147,7148,7149,7150,7151, # 6816 7152,7153,7154,7155,7156,7157,7158,7159,7160,7161,7162,7163,7164,7165,7166,7167, # 6832 7168,7169,7170,7171,7172,7173,7174,7175,7176,7177,7178,7179,7180,7181,7182,7183, # 6848 7184,7185,7186,7187,7188,4171,4172,7189,7190,7191,7192,7193,7194,7195,7196,7197, # 6864 7198,7199,7200,7201,7202,7203,7204,7205,7206,7207,7208,7209,7210,7211,7212,7213, # 6880 7214,7215,7216,7217,7218,7219,7220,7221,7222,7223,7224,7225,7226,7227,7228,7229, # 6896 7230,7231,7232,7233,7234,7235,7236,7237,7238,7239,7240,7241,7242,7243,7244,7245, # 6912 7246,7247,7248,7249,7250,7251,7252,7253,7254,7255,7256,7257,7258,7259,7260,7261, # 6928 7262,7263,7264,7265,7266,7267,7268,7269,7270,7271,7272,7273,7274,7275,7276,7277, # 6944 7278,7279,7280,7281,7282,7283,7284,7285,7286,7287,7288,7289,7290,7291,7292,7293, # 6960 7294,7295,7296,4844,7297,7298,7299,7300,7301,7302,7303,7304,7305,7306,7307,7308, # 6976 7309,7310,7311,7312,7313,7314,7315,7316,4451,7317,7318,7319,7320,7321,7322,7323, # 6992 7324,7325,7326,7327,7328,7329,7330,7331,7332,7333,7334,7335,7336,7337,7338,7339, # 7008 7340,7341,7342,7343,7344,7345,7346,7347,7348,7349,7350,7351,7352,7353,4173,7354, # 7024 7355,4845,7356,7357,7358,7359,7360,7361,7362,7363,7364,7365,7366,7367,7368,7369, # 7040 7370,7371,7372,7373,7374,7375,7376,7377,7378,7379,7380,7381,7382,7383,7384,7385, # 7056 7386,7387,7388,4846,7389,7390,7391,7392,7393,7394,7395,7396,7397,7398,7399,7400, # 7072 7401,7402,7403,7404,7405,3672,7406,7407,7408,7409,7410,7411,7412,7413,7414,7415, # 7088 7416,7417,7418,7419,7420,7421,7422,7423,7424,7425,7426,7427,7428,7429,7430,7431, # 7104 7432,7433,7434,7435,7436,7437,7438,7439,7440,7441,7442,7443,7444,7445,7446,7447, # 7120 7448,7449,7450,7451,7452,7453,4452,7454,3200,7455,7456,7457,7458,7459,7460,7461, # 7136 7462,7463,7464,7465,7466,7467,7468,7469,7470,7471,7472,7473,7474,4847,7475,7476, # 7152 7477,3133,7478,7479,7480,7481,7482,7483,7484,7485,7486,7487,7488,7489,7490,7491, # 7168 7492,7493,7494,7495,7496,7497,7498,7499,7500,7501,7502,3347,7503,7504,7505,7506, # 7184 7507,7508,7509,7510,7511,7512,7513,7514,7515,7516,7517,7518,7519,7520,7521,4848, # 7200 7522,7523,7524,7525,7526,7527,7528,7529,7530,7531,7532,7533,7534,7535,7536,7537, # 7216 7538,7539,7540,7541,7542,7543,7544,7545,7546,7547,7548,7549,3801,4849,7550,7551, # 7232 7552,7553,7554,7555,7556,7557,7558,7559,7560,7561,7562,7563,7564,7565,7566,7567, # 7248 7568,7569,3035,7570,7571,7572,7573,7574,7575,7576,7577,7578,7579,7580,7581,7582, # 7264 7583,7584,7585,7586,7587,7588,7589,7590,7591,7592,7593,7594,7595,7596,7597,7598, # 7280 7599,7600,7601,7602,7603,7604,7605,7606,7607,7608,7609,7610,7611,7612,7613,7614, # 7296 7615,7616,4850,7617,7618,3802,7619,7620,7621,7622,7623,7624,7625,7626,7627,7628, # 7312 7629,7630,7631,7632,4851,7633,7634,7635,7636,7637,7638,7639,7640,7641,7642,7643, # 7328 7644,7645,7646,7647,7648,7649,7650,7651,7652,7653,7654,7655,7656,7657,7658,7659, # 7344 7660,7661,7662,7663,7664,7665,7666,7667,7668,7669,7670,4453,7671,7672,7673,7674, # 7360 7675,7676,7677,7678,7679,7680,7681,7682,7683,7684,7685,7686,7687,7688,7689,7690, # 7376 7691,7692,7693,7694,7695,7696,7697,3443,7698,7699,7700,7701,7702,4454,7703,7704, # 7392 7705,7706,7707,7708,7709,7710,7711,7712,7713,2472,7714,7715,7716,7717,7718,7719, # 7408 7720,7721,7722,7723,7724,7725,7726,7727,7728,7729,7730,7731,3954,7732,7733,7734, # 7424 7735,7736,7737,7738,7739,7740,7741,7742,7743,7744,7745,7746,7747,7748,7749,7750, # 7440 3134,7751,7752,4852,7753,7754,7755,4853,7756,7757,7758,7759,7760,4174,7761,7762, # 7456 7763,7764,7765,7766,7767,7768,7769,7770,7771,7772,7773,7774,7775,7776,7777,7778, # 7472 7779,7780,7781,7782,7783,7784,7785,7786,7787,7788,7789,7790,7791,7792,7793,7794, # 7488 7795,7796,7797,7798,7799,7800,7801,7802,7803,7804,7805,4854,7806,7807,7808,7809, # 7504 7810,7811,7812,7813,7814,7815,7816,7817,7818,7819,7820,7821,7822,7823,7824,7825, # 7520 4855,7826,7827,7828,7829,7830,7831,7832,7833,7834,7835,7836,7837,7838,7839,7840, # 7536 7841,7842,7843,7844,7845,7846,7847,3955,7848,7849,7850,7851,7852,7853,7854,7855, # 7552 7856,7857,7858,7859,7860,3444,7861,7862,7863,7864,7865,7866,7867,7868,7869,7870, # 7568 7871,7872,7873,7874,7875,7876,7877,7878,7879,7880,7881,7882,7883,7884,7885,7886, # 7584 7887,7888,7889,7890,7891,4175,7892,7893,7894,7895,7896,4856,4857,7897,7898,7899, # 7600 7900,2598,7901,7902,7903,7904,7905,7906,7907,7908,4455,7909,7910,7911,7912,7913, # 7616 7914,3201,7915,7916,7917,7918,7919,7920,7921,4858,7922,7923,7924,7925,7926,7927, # 7632 7928,7929,7930,7931,7932,7933,7934,7935,7936,7937,7938,7939,7940,7941,7942,7943, # 7648 7944,7945,7946,7947,7948,7949,7950,7951,7952,7953,7954,7955,7956,7957,7958,7959, # 7664 7960,7961,7962,7963,7964,7965,7966,7967,7968,7969,7970,7971,7972,7973,7974,7975, # 7680 7976,7977,7978,7979,7980,7981,4859,7982,7983,7984,7985,7986,7987,7988,7989,7990, # 7696 7991,7992,7993,7994,7995,7996,4860,7997,7998,7999,8000,8001,8002,8003,8004,8005, # 7712 8006,8007,8008,8009,8010,8011,8012,8013,8014,8015,8016,4176,8017,8018,8019,8020, # 7728 8021,8022,8023,4861,8024,8025,8026,8027,8028,8029,8030,8031,8032,8033,8034,8035, # 7744 8036,4862,4456,8037,8038,8039,8040,4863,8041,8042,8043,8044,8045,8046,8047,8048, # 7760 8049,8050,8051,8052,8053,8054,8055,8056,8057,8058,8059,8060,8061,8062,8063,8064, # 7776 8065,8066,8067,8068,8069,8070,8071,8072,8073,8074,8075,8076,8077,8078,8079,8080, # 7792 8081,8082,8083,8084,8085,8086,8087,8088,8089,8090,8091,8092,8093,8094,8095,8096, # 7808 8097,8098,8099,4864,4177,8100,8101,8102,8103,8104,8105,8106,8107,8108,8109,8110, # 7824 8111,8112,8113,8114,8115,8116,8117,8118,8119,8120,4178,8121,8122,8123,8124,8125, # 7840 8126,8127,8128,8129,8130,8131,8132,8133,8134,8135,8136,8137,8138,8139,8140,8141, # 7856 8142,8143,8144,8145,4865,4866,8146,8147,8148,8149,8150,8151,8152,8153,8154,8155, # 7872 8156,8157,8158,8159,8160,8161,8162,8163,8164,8165,4179,8166,8167,8168,8169,8170, # 7888 8171,8172,8173,8174,8175,8176,8177,8178,8179,8180,8181,4457,8182,8183,8184,8185, # 7904 8186,8187,8188,8189,8190,8191,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201, # 7920 8202,8203,8204,8205,8206,8207,8208,8209,8210,8211,8212,8213,8214,8215,8216,8217, # 7936 8218,8219,8220,8221,8222,8223,8224,8225,8226,8227,8228,8229,8230,8231,8232,8233, # 7952 8234,8235,8236,8237,8238,8239,8240,8241,8242,8243,8244,8245,8246,8247,8248,8249, # 7968 8250,8251,8252,8253,8254,8255,8256,3445,8257,8258,8259,8260,8261,8262,4458,8263, # 7984 8264,8265,8266,8267,8268,8269,8270,8271,8272,4459,8273,8274,8275,8276,3550,8277, # 8000 8278,8279,8280,8281,8282,8283,8284,8285,8286,8287,8288,8289,4460,8290,8291,8292, # 8016 8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,8304,8305,8306,8307,4867, # 8032 8308,8309,8310,8311,8312,3551,8313,8314,8315,8316,8317,8318,8319,8320,8321,8322, # 8048 8323,8324,8325,8326,4868,8327,8328,8329,8330,8331,8332,8333,8334,8335,8336,8337, # 8064 8338,8339,8340,8341,8342,8343,8344,8345,8346,8347,8348,8349,8350,8351,8352,8353, # 8080 8354,8355,8356,8357,8358,8359,8360,8361,8362,8363,4869,4461,8364,8365,8366,8367, # 8096 8368,8369,8370,4870,8371,8372,8373,8374,8375,8376,8377,8378,8379,8380,8381,8382, # 8112 8383,8384,8385,8386,8387,8388,8389,8390,8391,8392,8393,8394,8395,8396,8397,8398, # 8128 8399,8400,8401,8402,8403,8404,8405,8406,8407,8408,8409,8410,4871,8411,8412,8413, # 8144 8414,8415,8416,8417,8418,8419,8420,8421,8422,4462,8423,8424,8425,8426,8427,8428, # 8160 8429,8430,8431,8432,8433,2986,8434,8435,8436,8437,8438,8439,8440,8441,8442,8443, # 8176 8444,8445,8446,8447,8448,8449,8450,8451,8452,8453,8454,8455,8456,8457,8458,8459, # 8192 8460,8461,8462,8463,8464,8465,8466,8467,8468,8469,8470,8471,8472,8473,8474,8475, # 8208 8476,8477,8478,4180,8479,8480,8481,8482,8483,8484,8485,8486,8487,8488,8489,8490, # 8224 8491,8492,8493,8494,8495,8496,8497,8498,8499,8500,8501,8502,8503,8504,8505,8506, # 8240 8507,8508,8509,8510,8511,8512,8513,8514,8515,8516,8517,8518,8519,8520,8521,8522, # 8256 8523,8524,8525,8526,8527,8528,8529,8530,8531,8532,8533,8534,8535,8536,8537,8538, # 8272 8539,8540,8541,8542,8543,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,8554, # 8288 8555,8556,8557,8558,8559,8560,8561,8562,8563,8564,4872,8565,8566,8567,8568,8569, # 8304 8570,8571,8572,8573,4873,8574,8575,8576,8577,8578,8579,8580,8581,8582,8583,8584, # 8320 8585,8586,8587,8588,8589,8590,8591,8592,8593,8594,8595,8596,8597,8598,8599,8600, # 8336 8601,8602,8603,8604,8605,3803,8606,8607,8608,8609,8610,8611,8612,8613,4874,3804, # 8352 8614,8615,8616,8617,8618,8619,8620,8621,3956,8622,8623,8624,8625,8626,8627,8628, # 8368 8629,8630,8631,8632,8633,8634,8635,8636,8637,8638,2865,8639,8640,8641,8642,8643, # 8384 8644,8645,8646,8647,8648,8649,8650,8651,8652,8653,8654,8655,8656,4463,8657,8658, # 8400 8659,4875,4876,8660,8661,8662,8663,8664,8665,8666,8667,8668,8669,8670,8671,8672, # 8416 8673,8674,8675,8676,8677,8678,8679,8680,8681,4464,8682,8683,8684,8685,8686,8687, # 8432 8688,8689,8690,8691,8692,8693,8694,8695,8696,8697,8698,8699,8700,8701,8702,8703, # 8448 8704,8705,8706,8707,8708,8709,2261,8710,8711,8712,8713,8714,8715,8716,8717,8718, # 8464 8719,8720,8721,8722,8723,8724,8725,8726,8727,8728,8729,8730,8731,8732,8733,4181, # 8480 8734,8735,8736,8737,8738,8739,8740,8741,8742,8743,8744,8745,8746,8747,8748,8749, # 8496 8750,8751,8752,8753,8754,8755,8756,8757,8758,8759,8760,8761,8762,8763,4877,8764, # 8512 8765,8766,8767,8768,8769,8770,8771,8772,8773,8774,8775,8776,8777,8778,8779,8780, # 8528 8781,8782,8783,8784,8785,8786,8787,8788,4878,8789,4879,8790,8791,8792,4880,8793, # 8544 8794,8795,8796,8797,8798,8799,8800,8801,4881,8802,8803,8804,8805,8806,8807,8808, # 8560 8809,8810,8811,8812,8813,8814,8815,3957,8816,8817,8818,8819,8820,8821,8822,8823, # 8576 8824,8825,8826,8827,8828,8829,8830,8831,8832,8833,8834,8835,8836,8837,8838,8839, # 8592 8840,8841,8842,8843,8844,8845,8846,8847,4882,8848,8849,8850,8851,8852,8853,8854, # 8608 8855,8856,8857,8858,8859,8860,8861,8862,8863,8864,8865,8866,8867,8868,8869,8870, # 8624 8871,8872,8873,8874,8875,8876,8877,8878,8879,8880,8881,8882,8883,8884,3202,8885, # 8640 8886,8887,8888,8889,8890,8891,8892,8893,8894,8895,8896,8897,8898,8899,8900,8901, # 8656 8902,8903,8904,8905,8906,8907,8908,8909,8910,8911,8912,8913,8914,8915,8916,8917, # 8672 8918,8919,8920,8921,8922,8923,8924,4465,8925,8926,8927,8928,8929,8930,8931,8932, # 8688 4883,8933,8934,8935,8936,8937,8938,8939,8940,8941,8942,8943,2214,8944,8945,8946, # 8704 8947,8948,8949,8950,8951,8952,8953,8954,8955,8956,8957,8958,8959,8960,8961,8962, # 8720 8963,8964,8965,4884,8966,8967,8968,8969,8970,8971,8972,8973,8974,8975,8976,8977, # 8736 8978,8979,8980,8981,8982,8983,8984,8985,8986,8987,8988,8989,8990,8991,8992,4885, # 8752 8993,8994,8995,8996,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,9008, # 8768 9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,4182,9022,9023, # 8784 9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,9038,9039, # 8800 9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,9053,9054,9055, # 8816 9056,9057,9058,9059,9060,9061,9062,9063,4886,9064,9065,9066,9067,9068,9069,4887, # 8832 9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,9083,9084,9085, # 8848 9086,9087,9088,9089,9090,9091,9092,9093,9094,9095,9096,9097,9098,9099,9100,9101, # 8864 9102,9103,9104,9105,9106,9107,9108,9109,9110,9111,9112,9113,9114,9115,9116,9117, # 8880 9118,9119,9120,9121,9122,9123,9124,9125,9126,9127,9128,9129,9130,9131,9132,9133, # 8896 9134,9135,9136,9137,9138,9139,9140,9141,3958,9142,9143,9144,9145,9146,9147,9148, # 8912 9149,9150,9151,4888,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,9163, # 8928 9164,9165,9166,9167,9168,9169,9170,9171,9172,9173,9174,9175,4889,9176,9177,9178, # 8944 9179,9180,9181,9182,9183,9184,9185,9186,9187,9188,9189,9190,9191,9192,9193,9194, # 8960 9195,9196,9197,9198,9199,9200,9201,9202,9203,4890,9204,9205,9206,9207,9208,9209, # 8976 9210,9211,9212,9213,9214,9215,9216,9217,9218,9219,9220,9221,9222,4466,9223,9224, # 8992 9225,9226,9227,9228,9229,9230,9231,9232,9233,9234,9235,9236,9237,9238,9239,9240, # 9008 9241,9242,9243,9244,9245,4891,9246,9247,9248,9249,9250,9251,9252,9253,9254,9255, # 9024 9256,9257,4892,9258,9259,9260,9261,4893,4894,9262,9263,9264,9265,9266,9267,9268, # 9040 9269,9270,9271,9272,9273,4467,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283, # 9056 9284,9285,3673,9286,9287,9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298, # 9072 9299,9300,9301,9302,9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314, # 9088 9315,9316,9317,9318,9319,9320,9321,9322,4895,9323,9324,9325,9326,9327,9328,9329, # 9104 9330,9331,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345, # 9120 9346,9347,4468,9348,9349,9350,9351,9352,9353,9354,9355,9356,9357,9358,9359,9360, # 9136 9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9372,9373,4896,9374,4469, # 9152 9375,9376,9377,9378,9379,4897,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389, # 9168 9390,9391,9392,9393,9394,9395,9396,9397,9398,9399,9400,9401,9402,9403,9404,9405, # 9184 9406,4470,9407,2751,9408,9409,3674,3552,9410,9411,9412,9413,9414,9415,9416,9417, # 9200 9418,9419,9420,9421,4898,9422,9423,9424,9425,9426,9427,9428,9429,3959,9430,9431, # 9216 9432,9433,9434,9435,9436,4471,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446, # 9232 9447,9448,9449,9450,3348,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,9461, # 9248 9462,9463,9464,9465,9466,9467,9468,9469,9470,9471,9472,4899,9473,9474,9475,9476, # 9264 9477,4900,9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,3349,9489,9490, # 9280 9491,9492,9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506, # 9296 9507,9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,4901,9521, # 9312 9522,9523,9524,9525,9526,4902,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536, # 9328 9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,9551,9552, # 9344 9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,9568, # 9360 9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584, # 9376 3805,9585,9586,9587,9588,9589,9590,9591,9592,9593,9594,9595,9596,9597,9598,9599, # 9392 9600,9601,9602,4903,9603,9604,9605,9606,9607,4904,9608,9609,9610,9611,9612,9613, # 9408 9614,4905,9615,9616,9617,9618,9619,9620,9621,9622,9623,9624,9625,9626,9627,9628, # 9424 9629,9630,9631,9632,4906,9633,9634,9635,9636,9637,9638,9639,9640,9641,9642,9643, # 9440 4907,9644,9645,9646,9647,9648,9649,9650,9651,9652,9653,9654,9655,9656,9657,9658, # 9456 9659,9660,9661,9662,9663,9664,9665,9666,9667,9668,9669,9670,9671,9672,4183,9673, # 9472 9674,9675,9676,9677,4908,9678,9679,9680,9681,4909,9682,9683,9684,9685,9686,9687, # 9488 9688,9689,9690,4910,9691,9692,9693,3675,9694,9695,9696,2945,9697,9698,9699,9700, # 9504 9701,9702,9703,9704,9705,4911,9706,9707,9708,9709,9710,9711,9712,9713,9714,9715, # 9520 9716,9717,9718,9719,9720,9721,9722,9723,9724,9725,9726,9727,9728,9729,9730,9731, # 9536 9732,9733,9734,9735,4912,9736,9737,9738,9739,9740,4913,9741,9742,9743,9744,9745, # 9552 9746,9747,9748,9749,9750,9751,9752,9753,9754,9755,9756,9757,9758,4914,9759,9760, # 9568 9761,9762,9763,9764,9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776, # 9584 9777,9778,9779,9780,9781,9782,4915,9783,9784,9785,9786,9787,9788,9789,9790,9791, # 9600 9792,9793,4916,9794,9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806, # 9616 9807,9808,9809,9810,9811,9812,9813,9814,9815,9816,9817,9818,9819,9820,9821,9822, # 9632 9823,9824,9825,9826,9827,9828,9829,9830,9831,9832,9833,9834,9835,9836,9837,9838, # 9648 9839,9840,9841,9842,9843,9844,9845,9846,9847,9848,9849,9850,9851,9852,9853,9854, # 9664 9855,9856,9857,9858,9859,9860,9861,9862,9863,9864,9865,9866,9867,9868,4917,9869, # 9680 9870,9871,9872,9873,9874,9875,9876,9877,9878,9879,9880,9881,9882,9883,9884,9885, # 9696 9886,9887,9888,9889,9890,9891,9892,4472,9893,9894,9895,9896,9897,3806,9898,9899, # 9712 9900,9901,9902,9903,9904,9905,9906,9907,9908,9909,9910,9911,9912,9913,9914,4918, # 9728 9915,9916,9917,4919,9918,9919,9920,9921,4184,9922,9923,9924,9925,9926,9927,9928, # 9744 9929,9930,9931,9932,9933,9934,9935,9936,9937,9938,9939,9940,9941,9942,9943,9944, # 9760 9945,9946,4920,9947,9948,9949,9950,9951,9952,9953,9954,9955,4185,9956,9957,9958, # 9776 9959,9960,9961,9962,9963,9964,9965,4921,9966,9967,9968,4473,9969,9970,9971,9972, # 9792 9973,9974,9975,9976,9977,4474,9978,9979,9980,9981,9982,9983,9984,9985,9986,9987, # 9808 9988,9989,9990,9991,9992,9993,9994,9995,9996,9997,9998,9999,10000,10001,10002,10003, # 9824 10004,10005,10006,10007,10008,10009,10010,10011,10012,10013,10014,10015,10016,10017,10018,10019, # 9840 10020,10021,4922,10022,4923,10023,10024,10025,10026,10027,10028,10029,10030,10031,10032,10033, # 9856 10034,10035,10036,10037,10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,4924, # 9872 10049,10050,10051,10052,10053,10054,10055,10056,10057,10058,10059,10060,10061,10062,10063,10064, # 9888 10065,10066,10067,10068,10069,10070,10071,10072,10073,10074,10075,10076,10077,10078,10079,10080, # 9904 10081,10082,10083,10084,10085,10086,10087,4475,10088,10089,10090,10091,10092,10093,10094,10095, # 9920 10096,10097,4476,10098,10099,10100,10101,10102,10103,10104,10105,10106,10107,10108,10109,10110, # 9936 10111,2174,10112,10113,10114,10115,10116,10117,10118,10119,10120,10121,10122,10123,10124,10125, # 9952 10126,10127,10128,10129,10130,10131,10132,10133,10134,10135,10136,10137,10138,10139,10140,3807, # 9968 4186,4925,10141,10142,10143,10144,10145,10146,10147,4477,4187,10148,10149,10150,10151,10152, # 9984 10153,4188,10154,10155,10156,10157,10158,10159,10160,10161,4926,10162,10163,10164,10165,10166, #10000 10167,10168,10169,10170,10171,10172,10173,10174,10175,10176,10177,10178,10179,10180,10181,10182, #10016 10183,10184,10185,10186,10187,10188,10189,10190,10191,10192,3203,10193,10194,10195,10196,10197, #10032 10198,10199,10200,4478,10201,10202,10203,10204,4479,10205,10206,10207,10208,10209,10210,10211, #10048 10212,10213,10214,10215,10216,10217,10218,10219,10220,10221,10222,10223,10224,10225,10226,10227, #10064 10228,10229,10230,10231,10232,10233,10234,4927,10235,10236,10237,10238,10239,10240,10241,10242, #10080 10243,10244,10245,10246,10247,10248,10249,10250,10251,10252,10253,10254,10255,10256,10257,10258, #10096 10259,10260,10261,10262,10263,10264,10265,10266,10267,10268,10269,10270,10271,10272,10273,4480, #10112 4928,4929,10274,10275,10276,10277,10278,10279,10280,10281,10282,10283,10284,10285,10286,10287, #10128 10288,10289,10290,10291,10292,10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303, #10144 10304,10305,10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,10317,10318,10319, #10160 10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,10334,4930, #10176 10335,10336,10337,10338,10339,10340,10341,10342,4931,10343,10344,10345,10346,10347,10348,10349, #10192 10350,10351,10352,10353,10354,10355,3088,10356,2786,10357,10358,10359,10360,4189,10361,10362, #10208 10363,10364,10365,10366,10367,10368,10369,10370,10371,10372,10373,10374,10375,4932,10376,10377, #10224 10378,10379,10380,10381,10382,10383,10384,10385,10386,10387,10388,10389,10390,10391,10392,4933, #10240 10393,10394,10395,4934,10396,10397,10398,10399,10400,10401,10402,10403,10404,10405,10406,10407, #10256 10408,10409,10410,10411,10412,3446,10413,10414,10415,10416,10417,10418,10419,10420,10421,10422, #10272 10423,4935,10424,10425,10426,10427,10428,10429,10430,4936,10431,10432,10433,10434,10435,10436, #10288 10437,10438,10439,10440,10441,10442,10443,4937,10444,10445,10446,10447,4481,10448,10449,10450, #10304 10451,10452,10453,10454,10455,10456,10457,10458,10459,10460,10461,10462,10463,10464,10465,10466, #10320 10467,10468,10469,10470,10471,10472,10473,10474,10475,10476,10477,10478,10479,10480,10481,10482, #10336 10483,10484,10485,10486,10487,10488,10489,10490,10491,10492,10493,10494,10495,10496,10497,10498, #10352 10499,10500,10501,10502,10503,10504,10505,4938,10506,10507,10508,10509,10510,2552,10511,10512, #10368 10513,10514,10515,10516,3447,10517,10518,10519,10520,10521,10522,10523,10524,10525,10526,10527, #10384 10528,10529,10530,10531,10532,10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543, #10400 4482,10544,4939,10545,10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557, #10416 10558,10559,10560,10561,10562,10563,10564,10565,10566,10567,3676,4483,10568,10569,10570,10571, #10432 10572,3448,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,10585,10586, #10448 10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602, #10464 10603,10604,10605,10606,10607,10608,10609,10610,10611,10612,10613,10614,10615,10616,10617,10618, #10480 10619,10620,10621,10622,10623,10624,10625,10626,10627,4484,10628,10629,10630,10631,10632,4940, #10496 10633,10634,10635,10636,10637,10638,10639,10640,10641,10642,10643,10644,10645,10646,10647,10648, #10512 10649,10650,10651,10652,10653,10654,10655,10656,4941,10657,10658,10659,2599,10660,10661,10662, #10528 10663,10664,10665,10666,3089,10667,10668,10669,10670,10671,10672,10673,10674,10675,10676,10677, #10544 10678,10679,10680,4942,10681,10682,10683,10684,10685,10686,10687,10688,10689,10690,10691,10692, #10560 10693,10694,10695,10696,10697,4485,10698,10699,10700,10701,10702,10703,10704,4943,10705,3677, #10576 10706,10707,10708,10709,10710,10711,10712,4944,10713,10714,10715,10716,10717,10718,10719,10720, #10592 10721,10722,10723,10724,10725,10726,10727,10728,4945,10729,10730,10731,10732,10733,10734,10735, #10608 10736,10737,10738,10739,10740,10741,10742,10743,10744,10745,10746,10747,10748,10749,10750,10751, #10624 10752,10753,10754,10755,10756,10757,10758,10759,10760,10761,4946,10762,10763,10764,10765,10766, #10640 10767,4947,4948,10768,10769,10770,10771,10772,10773,10774,10775,10776,10777,10778,10779,10780, #10656 10781,10782,10783,10784,10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796, #10672 10797,10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,10811,10812, #10688 10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,10824,10825,10826,10827,10828, #10704 10829,10830,10831,10832,10833,10834,10835,10836,10837,10838,10839,10840,10841,10842,10843,10844, #10720 10845,10846,10847,10848,10849,10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860, #10736 10861,10862,10863,10864,10865,10866,10867,10868,10869,10870,10871,10872,10873,10874,10875,10876, #10752 10877,10878,4486,10879,10880,10881,10882,10883,10884,10885,4949,10886,10887,10888,10889,10890, #10768 10891,10892,10893,10894,10895,10896,10897,10898,10899,10900,10901,10902,10903,10904,10905,10906, #10784 10907,10908,10909,10910,10911,10912,10913,10914,10915,10916,10917,10918,10919,4487,10920,10921, #10800 10922,10923,10924,10925,10926,10927,10928,10929,10930,10931,10932,4950,10933,10934,10935,10936, #10816 10937,10938,10939,10940,10941,10942,10943,10944,10945,10946,10947,10948,10949,4488,10950,10951, #10832 10952,10953,10954,10955,10956,10957,10958,10959,4190,10960,10961,10962,10963,10964,10965,10966, #10848 10967,10968,10969,10970,10971,10972,10973,10974,10975,10976,10977,10978,10979,10980,10981,10982, #10864 10983,10984,10985,10986,10987,10988,10989,10990,10991,10992,10993,10994,10995,10996,10997,10998, #10880 10999,11000,11001,11002,11003,11004,11005,11006,3960,11007,11008,11009,11010,11011,11012,11013, #10896 11014,11015,11016,11017,11018,11019,11020,11021,11022,11023,11024,11025,11026,11027,11028,11029, #10912 11030,11031,11032,4951,11033,11034,11035,11036,11037,11038,11039,11040,11041,11042,11043,11044, #10928 11045,11046,11047,4489,11048,11049,11050,11051,4952,11052,11053,11054,11055,11056,11057,11058, #10944 4953,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,11070,11071,4954,11072, #10960 11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,11083,11084,11085,11086,11087,11088, #10976 11089,11090,11091,11092,11093,11094,11095,11096,11097,11098,11099,11100,11101,11102,11103,11104, #10992 11105,11106,11107,11108,11109,11110,11111,11112,11113,11114,11115,3808,11116,11117,11118,11119, #11008 11120,11121,11122,11123,11124,11125,11126,11127,11128,11129,11130,11131,11132,11133,11134,4955, #11024 11135,11136,11137,11138,11139,11140,11141,11142,11143,11144,11145,11146,11147,11148,11149,11150, #11040 11151,11152,11153,11154,11155,11156,11157,11158,11159,11160,11161,4956,11162,11163,11164,11165, #11056 11166,11167,11168,11169,11170,11171,11172,11173,11174,11175,11176,11177,11178,11179,11180,4957, #11072 11181,11182,11183,11184,11185,11186,4958,11187,11188,11189,11190,11191,11192,11193,11194,11195, #11088 11196,11197,11198,11199,11200,3678,11201,11202,11203,11204,11205,11206,4191,11207,11208,11209, #11104 11210,11211,11212,11213,11214,11215,11216,11217,11218,11219,11220,11221,11222,11223,11224,11225, #11120 11226,11227,11228,11229,11230,11231,11232,11233,11234,11235,11236,11237,11238,11239,11240,11241, #11136 11242,11243,11244,11245,11246,11247,11248,11249,11250,11251,4959,11252,11253,11254,11255,11256, #11152 11257,11258,11259,11260,11261,11262,11263,11264,11265,11266,11267,11268,11269,11270,11271,11272, #11168 11273,11274,11275,11276,11277,11278,11279,11280,11281,11282,11283,11284,11285,11286,11287,11288, #11184 11289,11290,11291,11292,11293,11294,11295,11296,11297,11298,11299,11300,11301,11302,11303,11304, #11200 11305,11306,11307,11308,11309,11310,11311,11312,11313,11314,3679,11315,11316,11317,11318,4490, #11216 11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,11329,11330,11331,11332,11333,11334, #11232 11335,11336,11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,4960,11348,11349, #11248 11350,11351,11352,11353,11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365, #11264 11366,11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,3961,4961,11378,11379, #11280 11380,11381,11382,11383,11384,11385,11386,11387,11388,11389,11390,11391,11392,11393,11394,11395, #11296 11396,11397,4192,11398,11399,11400,11401,11402,11403,11404,11405,11406,11407,11408,11409,11410, #11312 11411,4962,11412,11413,11414,11415,11416,11417,11418,11419,11420,11421,11422,11423,11424,11425, #11328 11426,11427,11428,11429,11430,11431,11432,11433,11434,11435,11436,11437,11438,11439,11440,11441, #11344 11442,11443,11444,11445,11446,11447,11448,11449,11450,11451,11452,11453,11454,11455,11456,11457, #11360 11458,11459,11460,11461,11462,11463,11464,11465,11466,11467,11468,11469,4963,11470,11471,4491, #11376 11472,11473,11474,11475,4964,11476,11477,11478,11479,11480,11481,11482,11483,11484,11485,11486, #11392 11487,11488,11489,11490,11491,11492,4965,11493,11494,11495,11496,11497,11498,11499,11500,11501, #11408 11502,11503,11504,11505,11506,11507,11508,11509,11510,11511,11512,11513,11514,11515,11516,11517, #11424 11518,11519,11520,11521,11522,11523,11524,11525,11526,11527,11528,11529,3962,11530,11531,11532, #11440 11533,11534,11535,11536,11537,11538,11539,11540,11541,11542,11543,11544,11545,11546,11547,11548, #11456 11549,11550,11551,11552,11553,11554,11555,11556,11557,11558,11559,11560,11561,11562,11563,11564, #11472 4193,4194,11565,11566,11567,11568,11569,11570,11571,11572,11573,11574,11575,11576,11577,11578, #11488 11579,11580,11581,11582,11583,11584,11585,11586,11587,11588,11589,11590,11591,4966,4195,11592, #11504 11593,11594,11595,11596,11597,11598,11599,11600,11601,11602,11603,11604,3090,11605,11606,11607, #11520 11608,11609,11610,4967,11611,11612,11613,11614,11615,11616,11617,11618,11619,11620,11621,11622, #11536 11623,11624,11625,11626,11627,11628,11629,11630,11631,11632,11633,11634,11635,11636,11637,11638, #11552 11639,11640,11641,11642,11643,11644,11645,11646,11647,11648,11649,11650,11651,11652,11653,11654, #11568 11655,11656,11657,11658,11659,11660,11661,11662,11663,11664,11665,11666,11667,11668,11669,11670, #11584 11671,11672,11673,11674,4968,11675,11676,11677,11678,11679,11680,11681,11682,11683,11684,11685, #11600 11686,11687,11688,11689,11690,11691,11692,11693,3809,11694,11695,11696,11697,11698,11699,11700, #11616 11701,11702,11703,11704,11705,11706,11707,11708,11709,11710,11711,11712,11713,11714,11715,11716, #11632 11717,11718,3553,11719,11720,11721,11722,11723,11724,11725,11726,11727,11728,11729,11730,4969, #11648 11731,11732,11733,11734,11735,11736,11737,11738,11739,11740,4492,11741,11742,11743,11744,11745, #11664 11746,11747,11748,11749,11750,11751,11752,4970,11753,11754,11755,11756,11757,11758,11759,11760, #11680 11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776, #11696 11777,11778,11779,11780,11781,11782,11783,11784,11785,11786,11787,11788,11789,11790,4971,11791, #11712 11792,11793,11794,11795,11796,11797,4972,11798,11799,11800,11801,11802,11803,11804,11805,11806, #11728 11807,11808,11809,11810,4973,11811,11812,11813,11814,11815,11816,11817,11818,11819,11820,11821, #11744 11822,11823,11824,11825,11826,11827,11828,11829,11830,11831,11832,11833,11834,3680,3810,11835, #11760 11836,4974,11837,11838,11839,11840,11841,11842,11843,11844,11845,11846,11847,11848,11849,11850, #11776 11851,11852,11853,11854,11855,11856,11857,11858,11859,11860,11861,11862,11863,11864,11865,11866, #11792 11867,11868,11869,11870,11871,11872,11873,11874,11875,11876,11877,11878,11879,11880,11881,11882, #11808 11883,11884,4493,11885,11886,11887,11888,11889,11890,11891,11892,11893,11894,11895,11896,11897, #11824 11898,11899,11900,11901,11902,11903,11904,11905,11906,11907,11908,11909,11910,11911,11912,11913, #11840 11914,11915,4975,11916,11917,11918,11919,11920,11921,11922,11923,11924,11925,11926,11927,11928, #11856 11929,11930,11931,11932,11933,11934,11935,11936,11937,11938,11939,11940,11941,11942,11943,11944, #11872 11945,11946,11947,11948,11949,4976,11950,11951,11952,11953,11954,11955,11956,11957,11958,11959, #11888 11960,11961,11962,11963,11964,11965,11966,11967,11968,11969,11970,11971,11972,11973,11974,11975, #11904 11976,11977,11978,11979,11980,11981,11982,11983,11984,11985,11986,11987,4196,11988,11989,11990, #11920 11991,11992,4977,11993,11994,11995,11996,11997,11998,11999,12000,12001,12002,12003,12004,12005, #11936 12006,12007,12008,12009,12010,12011,12012,12013,12014,12015,12016,12017,12018,12019,12020,12021, #11952 12022,12023,12024,12025,12026,12027,12028,12029,12030,12031,12032,12033,12034,12035,12036,12037, #11968 12038,12039,12040,12041,12042,12043,12044,12045,12046,12047,12048,12049,12050,12051,12052,12053, #11984 12054,12055,12056,12057,12058,12059,12060,12061,4978,12062,12063,12064,12065,12066,12067,12068, #12000 12069,12070,12071,12072,12073,12074,12075,12076,12077,12078,12079,12080,12081,12082,12083,12084, #12016 12085,12086,12087,12088,12089,12090,12091,12092,12093,12094,12095,12096,12097,12098,12099,12100, #12032 12101,12102,12103,12104,12105,12106,12107,12108,12109,12110,12111,12112,12113,12114,12115,12116, #12048 12117,12118,12119,12120,12121,12122,12123,4979,12124,12125,12126,12127,12128,4197,12129,12130, #12064 12131,12132,12133,12134,12135,12136,12137,12138,12139,12140,12141,12142,12143,12144,12145,12146, #12080 12147,12148,12149,12150,12151,12152,12153,12154,4980,12155,12156,12157,12158,12159,12160,4494, #12096 12161,12162,12163,12164,3811,12165,12166,12167,12168,12169,4495,12170,12171,4496,12172,12173, #12112 12174,12175,12176,3812,12177,12178,12179,12180,12181,12182,12183,12184,12185,12186,12187,12188, #12128 12189,12190,12191,12192,12193,12194,12195,12196,12197,12198,12199,12200,12201,12202,12203,12204, #12144 12205,12206,12207,12208,12209,12210,12211,12212,12213,12214,12215,12216,12217,12218,12219,12220, #12160 12221,4981,12222,12223,12224,12225,12226,12227,12228,12229,12230,12231,12232,12233,12234,12235, #12176 4982,12236,12237,12238,12239,12240,12241,12242,12243,12244,12245,4983,12246,12247,12248,12249, #12192 4984,12250,12251,12252,12253,12254,12255,12256,12257,12258,12259,12260,12261,12262,12263,12264, #12208 4985,12265,4497,12266,12267,12268,12269,12270,12271,12272,12273,12274,12275,12276,12277,12278, #12224 12279,12280,12281,12282,12283,12284,12285,12286,12287,4986,12288,12289,12290,12291,12292,12293, #12240 12294,12295,12296,2473,12297,12298,12299,12300,12301,12302,12303,12304,12305,12306,12307,12308, #12256 12309,12310,12311,12312,12313,12314,12315,12316,12317,12318,12319,3963,12320,12321,12322,12323, #12272 12324,12325,12326,12327,12328,12329,12330,12331,12332,4987,12333,12334,12335,12336,12337,12338, #12288 12339,12340,12341,12342,12343,12344,12345,12346,12347,12348,12349,12350,12351,12352,12353,12354, #12304 12355,12356,12357,12358,12359,3964,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369, #12320 12370,3965,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384, #12336 12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400, #12352 12401,12402,12403,12404,12405,12406,12407,12408,4988,12409,12410,12411,12412,12413,12414,12415, #12368 12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431, #12384 12432,12433,12434,12435,12436,12437,12438,3554,12439,12440,12441,12442,12443,12444,12445,12446, #12400 12447,12448,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462, #12416 12463,12464,4989,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,12476,12477, #12432 12478,12479,12480,4990,12481,12482,12483,12484,12485,12486,12487,12488,12489,4498,12490,12491, #12448 12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507, #12464 12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523, #12480 12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,12535,12536,12537,12538,12539, #12496 12540,12541,12542,12543,12544,12545,12546,12547,12548,12549,12550,12551,4991,12552,12553,12554, #12512 12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,12565,12566,12567,12568,12569,12570, #12528 12571,12572,12573,12574,12575,12576,12577,12578,3036,12579,12580,12581,12582,12583,3966,12584, #12544 12585,12586,12587,12588,12589,12590,12591,12592,12593,12594,12595,12596,12597,12598,12599,12600, #12560 12601,12602,12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,12616, #12576 12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,12629,12630,12631,12632, #12592 12633,12634,12635,12636,12637,12638,12639,12640,12641,12642,12643,12644,12645,12646,4499,12647, #12608 12648,12649,12650,12651,12652,12653,12654,12655,12656,12657,12658,12659,12660,12661,12662,12663, #12624 12664,12665,12666,12667,12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679, #12640 12680,12681,12682,12683,12684,12685,12686,12687,12688,12689,12690,12691,12692,12693,12694,12695, #12656 12696,12697,12698,4992,12699,12700,12701,12702,12703,12704,12705,12706,12707,12708,12709,12710, #12672 12711,12712,12713,12714,12715,12716,12717,12718,12719,12720,12721,12722,12723,12724,12725,12726, #12688 12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742, #12704 12743,12744,12745,12746,12747,12748,12749,12750,12751,12752,12753,12754,12755,12756,12757,12758, #12720 12759,12760,12761,12762,12763,12764,12765,12766,12767,12768,12769,12770,12771,12772,12773,12774, #12736 12775,12776,12777,12778,4993,2175,12779,12780,12781,12782,12783,12784,12785,12786,4500,12787, #12752 12788,12789,12790,12791,12792,12793,12794,12795,12796,12797,12798,12799,12800,12801,12802,12803, #12768 12804,12805,12806,12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819, #12784 12820,12821,12822,12823,12824,12825,12826,4198,3967,12827,12828,12829,12830,12831,12832,12833, #12800 12834,12835,12836,12837,12838,12839,12840,12841,12842,12843,12844,12845,12846,12847,12848,12849, #12816 12850,12851,12852,12853,12854,12855,12856,12857,12858,12859,12860,12861,4199,12862,12863,12864, #12832 12865,12866,12867,12868,12869,12870,12871,12872,12873,12874,12875,12876,12877,12878,12879,12880, #12848 12881,12882,12883,12884,12885,12886,12887,4501,12888,12889,12890,12891,12892,12893,12894,12895, #12864 12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,12907,12908,12909,12910,12911, #12880 12912,4994,12913,12914,12915,12916,12917,12918,12919,12920,12921,12922,12923,12924,12925,12926, #12896 12927,12928,12929,12930,12931,12932,12933,12934,12935,12936,12937,12938,12939,12940,12941,12942, #12912 12943,12944,12945,12946,12947,12948,12949,12950,12951,12952,12953,12954,12955,12956,1772,12957, #12928 12958,12959,12960,12961,12962,12963,12964,12965,12966,12967,12968,12969,12970,12971,12972,12973, #12944 12974,12975,12976,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,12989, #12960 12990,12991,12992,12993,12994,12995,12996,12997,4502,12998,4503,12999,13000,13001,13002,13003, #12976 4504,13004,13005,13006,13007,13008,13009,13010,13011,13012,13013,13014,13015,13016,13017,13018, #12992 13019,13020,13021,13022,13023,13024,13025,13026,13027,13028,13029,3449,13030,13031,13032,13033, #13008 13034,13035,13036,13037,13038,13039,13040,13041,13042,13043,13044,13045,13046,13047,13048,13049, #13024 13050,13051,13052,13053,13054,13055,13056,13057,13058,13059,13060,13061,13062,13063,13064,13065, #13040 13066,13067,13068,13069,13070,13071,13072,13073,13074,13075,13076,13077,13078,13079,13080,13081, #13056 13082,13083,13084,13085,13086,13087,13088,13089,13090,13091,13092,13093,13094,13095,13096,13097, #13072 13098,13099,13100,13101,13102,13103,13104,13105,13106,13107,13108,13109,13110,13111,13112,13113, #13088 13114,13115,13116,13117,13118,3968,13119,4995,13120,13121,13122,13123,13124,13125,13126,13127, #13104 4505,13128,13129,13130,13131,13132,13133,13134,4996,4506,13135,13136,13137,13138,13139,4997, #13120 13140,13141,13142,13143,13144,13145,13146,13147,13148,13149,13150,13151,13152,13153,13154,13155, #13136 13156,13157,13158,13159,4998,13160,13161,13162,13163,13164,13165,13166,13167,13168,13169,13170, #13152 13171,13172,13173,13174,13175,13176,4999,13177,13178,13179,13180,13181,13182,13183,13184,13185, #13168 13186,13187,13188,13189,13190,13191,13192,13193,13194,13195,13196,13197,13198,13199,13200,13201, #13184 13202,13203,13204,13205,13206,5000,13207,13208,13209,13210,13211,13212,13213,13214,13215,13216, #13200 13217,13218,13219,13220,13221,13222,13223,13224,13225,13226,13227,4200,5001,13228,13229,13230, #13216 13231,13232,13233,13234,13235,13236,13237,13238,13239,13240,3969,13241,13242,13243,13244,3970, #13232 13245,13246,13247,13248,13249,13250,13251,13252,13253,13254,13255,13256,13257,13258,13259,13260, #13248 13261,13262,13263,13264,13265,13266,13267,13268,3450,13269,13270,13271,13272,13273,13274,13275, #13264 13276,5002,13277,13278,13279,13280,13281,13282,13283,13284,13285,13286,13287,13288,13289,13290, #13280 13291,13292,13293,13294,13295,13296,13297,13298,13299,13300,13301,13302,3813,13303,13304,13305, #13296 13306,13307,13308,13309,13310,13311,13312,13313,13314,13315,13316,13317,13318,13319,13320,13321, #13312 13322,13323,13324,13325,13326,13327,13328,4507,13329,13330,13331,13332,13333,13334,13335,13336, #13328 13337,13338,13339,13340,13341,5003,13342,13343,13344,13345,13346,13347,13348,13349,13350,13351, #13344 13352,13353,13354,13355,13356,13357,13358,13359,13360,13361,13362,13363,13364,13365,13366,13367, #13360 5004,13368,13369,13370,13371,13372,13373,13374,13375,13376,13377,13378,13379,13380,13381,13382, #13376 13383,13384,13385,13386,13387,13388,13389,13390,13391,13392,13393,13394,13395,13396,13397,13398, #13392 13399,13400,13401,13402,13403,13404,13405,13406,13407,13408,13409,13410,13411,13412,13413,13414, #13408 13415,13416,13417,13418,13419,13420,13421,13422,13423,13424,13425,13426,13427,13428,13429,13430, #13424 13431,13432,4508,13433,13434,13435,4201,13436,13437,13438,13439,13440,13441,13442,13443,13444, #13440 13445,13446,13447,13448,13449,13450,13451,13452,13453,13454,13455,13456,13457,5005,13458,13459, #13456 13460,13461,13462,13463,13464,13465,13466,13467,13468,13469,13470,4509,13471,13472,13473,13474, #13472 13475,13476,13477,13478,13479,13480,13481,13482,13483,13484,13485,13486,13487,13488,13489,13490, #13488 13491,13492,13493,13494,13495,13496,13497,13498,13499,13500,13501,13502,13503,13504,13505,13506, #13504 13507,13508,13509,13510,13511,13512,13513,13514,13515,13516,13517,13518,13519,13520,13521,13522, #13520 13523,13524,13525,13526,13527,13528,13529,13530,13531,13532,13533,13534,13535,13536,13537,13538, #13536 13539,13540,13541,13542,13543,13544,13545,13546,13547,13548,13549,13550,13551,13552,13553,13554, #13552 13555,13556,13557,13558,13559,13560,13561,13562,13563,13564,13565,13566,13567,13568,13569,13570, #13568 13571,13572,13573,13574,13575,13576,13577,13578,13579,13580,13581,13582,13583,13584,13585,13586, #13584 13587,13588,13589,13590,13591,13592,13593,13594,13595,13596,13597,13598,13599,13600,13601,13602, #13600 13603,13604,13605,13606,13607,13608,13609,13610,13611,13612,13613,13614,13615,13616,13617,13618, #13616 13619,13620,13621,13622,13623,13624,13625,13626,13627,13628,13629,13630,13631,13632,13633,13634, #13632 13635,13636,13637,13638,13639,13640,13641,13642,5006,13643,13644,13645,13646,13647,13648,13649, #13648 13650,13651,5007,13652,13653,13654,13655,13656,13657,13658,13659,13660,13661,13662,13663,13664, #13664 13665,13666,13667,13668,13669,13670,13671,13672,13673,13674,13675,13676,13677,13678,13679,13680, #13680 13681,13682,13683,13684,13685,13686,13687,13688,13689,13690,13691,13692,13693,13694,13695,13696, #13696 13697,13698,13699,13700,13701,13702,13703,13704,13705,13706,13707,13708,13709,13710,13711,13712, #13712 13713,13714,13715,13716,13717,13718,13719,13720,13721,13722,13723,13724,13725,13726,13727,13728, #13728 13729,13730,13731,13732,13733,13734,13735,13736,13737,13738,13739,13740,13741,13742,13743,13744, #13744 13745,13746,13747,13748,13749,13750,13751,13752,13753,13754,13755,13756,13757,13758,13759,13760, #13760 13761,13762,13763,13764,13765,13766,13767,13768,13769,13770,13771,13772,13773,13774,3273,13775, #13776 13776,13777,13778,13779,13780,13781,13782,13783,13784,13785,13786,13787,13788,13789,13790,13791, #13792 13792,13793,13794,13795,13796,13797,13798,13799,13800,13801,13802,13803,13804,13805,13806,13807, #13808 13808,13809,13810,13811,13812,13813,13814,13815,13816,13817,13818,13819,13820,13821,13822,13823, #13824 13824,13825,13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839, #13840 13840,13841,13842,13843,13844,13845,13846,13847,13848,13849,13850,13851,13852,13853,13854,13855, #13856 13856,13857,13858,13859,13860,13861,13862,13863,13864,13865,13866,13867,13868,13869,13870,13871, #13872 13872,13873,13874,13875,13876,13877,13878,13879,13880,13881,13882,13883,13884,13885,13886,13887, #13888 13888,13889,13890,13891,13892,13893,13894,13895,13896,13897,13898,13899,13900,13901,13902,13903, #13904 13904,13905,13906,13907,13908,13909,13910,13911,13912,13913,13914,13915,13916,13917,13918,13919, #13920 13920,13921,13922,13923,13924,13925,13926,13927,13928,13929,13930,13931,13932,13933,13934,13935, #13936 13936,13937,13938,13939,13940,13941,13942,13943,13944,13945,13946,13947,13948,13949,13950,13951, #13952 13952,13953,13954,13955,13956,13957,13958,13959,13960,13961,13962,13963,13964,13965,13966,13967, #13968 13968,13969,13970,13971,13972) #13973 # flake8: noqa PK[LԊLL#site-packages/chardet/constants.pyonu[ ۝Rc@s4dZdZdZdZdZdZdZdZdS(iiigffffff?N(t_debugt eDetectingteFoundItteNotMeteStartteErrorteItsMetSHORTCUT_THRESHOLD(((s5/usr/lib/python2.7/site-packages/chardet/constants.pytsPK[Ό;(site-packages/chardet/mbcsgroupprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Universal charset detector code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 2001 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # Shy Shalom - original C code # Proofpoint, Inc. # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .charsetgroupprober import CharSetGroupProber from .utf8prober import UTF8Prober from .sjisprober import SJISProber from .eucjpprober import EUCJPProber from .gb2312prober import GB2312Prober from .euckrprober import EUCKRProber from .cp949prober import CP949Prober from .big5prober import Big5Prober from .euctwprober import EUCTWProber class MBCSGroupProber(CharSetGroupProber): def __init__(self): CharSetGroupProber.__init__(self) self._mProbers = [ UTF8Prober(), SJISProber(), EUCJPProber(), GB2312Prober(), EUCKRProber(), CP949Prober(), Big5Prober(), EUCTWProber() ] self.reset() PK[vgDD$site-packages/chardet/big5prober.pyonu[ ۝Rc@sZddlmZddlmZddlmZddlmZdefdYZdS(i(tMultiByteCharSetProber(tCodingStateMachine(tBig5DistributionAnalysis(t Big5SMModelt Big5ProbercBseZdZdZRS(cCs6tj|tt|_t|_|jdS(N(Rt__init__RRt _mCodingSMRt_mDistributionAnalyzertreset(tself((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pyR#s  cCsdS(NtBig5((R ((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pytget_charset_name)s(t__name__t __module__RR (((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pyR"s N( tmbcharsetproberRtcodingstatemachineRtchardistributionRtmbcssmRR(((s6/usr/lib/python2.7/site-packages/chardet/big5prober.pytsPK[[*// site-packages/chardet/compat.pycnu[ ۝Rc@sCddlZejdkr*eefZn eefZdZdS(iNiicCs0tjdkr(t|tr(t|S|SdS(Nii(ii(tsyst version_infot isinstancetbase_strtord(ta((s2/usr/lib/python2.7/site-packages/chardet/compat.pytwrap_ords (ii(RRtstrtunicodeRtbytesR(((s2/usr/lib/python2.7/site-packages/chardet/compat.pyts  PK[A`[`[)site-packages/chardet/langhebrewmodel.pyonu[ ۝Rc@s9dZdZied6ed6dd6ed6dd6ZdS(iiiiiEi[iOiPi\iYiaiZiDioipiRiIi_iUiNiyiViGiCifikiTirigisi2iJi<i=i*iLiFi@i5iii]i8iAi6i1iBini3i+i,i?iQiMibiKili|iiiii(i:iiiiiiiiiiiSi4i/i.iHi i^iiqiimiiiii"itiividiiiuiwihi}iiiWiciijizi{ii7iiieiiixii0i'i9iii;i)iXi!i%i$iii#ii>iii~iii&i-iiiiiiiiiiiiii iiiiiiiiiiiii iii ii iiiiiii iiii`itcharToOrderMaptprecedenceMatrixg C|?tmTypicalPositiveRatiotkeepEnglishLetters windows-1255t charsetNameN(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiEi[iOiPi\iYiaiZiDioipiRiIi_iUiNiyiViGiCifikiTirigisiiiiiii2iJi<i=i*iLiFi@i5iii]i8iAi6i1iBini3i+i,i?iQiMibiKiliiiiii|iiiii(i:iiiiiiiiiiiSi4i/i.iHi i^iiqiimiiiii"itiividiiiuiwihi}iiiWiciijizi{ii7iiieiiixii0i'i9iii;i)iXi!i%i$iii#ii>iii~iii&i-iiiiiiiiiiiiii iiiiiiiiiiiii iii ii iiiiiii iiiii`i(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(twin1255_CharToOrderMaptHebrewLangModeltFalsetWin1255HebrewModel(((s;/usr/lib/python2.7/site-packages/chardet/langhebrewmodel.pyt&s* PK[i l l )site-packages/chardet/mbcharsetprober.pycnu[ ۝Rc@sFddlZddlmZddlmZdefdYZdS(iNi(t constants(t CharSetProbertMultiByteCharSetProbercBs5eZdZdZdZdZdZRS(cCs2tj|d|_d|_ddg|_dS(Ni(Rt__init__tNonet_mDistributionAnalyzert _mCodingSMt _mLastChar(tself((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR$s   cCsRtj||jr&|jjn|jr?|jjnddg|_dS(Ni(RtresetRRR(R((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR *s    cCsdS(N((R((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pytget_charset_name2scCst|}xtd|D]}|jj||}|tjkrtjr{tjj |j dt |dntj |_ Pq|tjkrtj|_ Pq|tjkr|jj}|dkr|d|jd<|jj|j|q#|jj||d|d!|qqW||d|jd<|jtjkr|jjr|jtjkrtj|_ qn|jS(Nis prober hit error at byte s i(tlentrangeRt next_stateRteErrort_debugtsyststderrtwriteR tstrteNotMet_mStateteItsMeteFoundItteStarttget_current_charlenRRtfeedt get_statet eDetectingtgot_enough_datatget_confidencetSHORTCUT_THRESHOLD(RtaBuftaLentit codingStatetcharLen((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR5s2   "   cCs |jjS(N(RR(R((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyRUs(t__name__t __module__RR R RR(((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyR#s     (RtRt charsetproberRR(((s;/usr/lib/python2.7/site-packages/chardet/mbcharsetprober.pyts PK[,ZZ#site-packages/chardet/euckrfreq.pyonu[ ۝Rc&"@sdZdZd("Zd'"S()"g@i0 i iixitiiiiHiaiiiii+iiWiuiihii]iiiiiiiiiiiviwiiiiimiFi!ipii iiiiiiixii/iiiiiiiii9iiiitii-iyiiKiiiiiiiiOiiniiiiiii0iii<i4i{iiiiiiiiiriiiiiiiiiiiiXiXiiiiiYiii&iiPiiiiiiii^iiiiiiii9iiiiiiiQii"iitiiiiii]i{i7iiii{ii;iiuiizi/ii|iiiii7iii.iiiiiiiiiiiiii{iiii#i|i}ii~iiti8ii_i i i i i i!iiii_iiiiiii*iiuii`i"iii|iiiiiiiaiiiiiii?iiRi!i i/iii!i"i=iii#ii$i%i&i'i(i)i,ii'ibi$i*ii+ii-ii,iiiiii&iUiii#iii-i.i'iiifi/isii0iiiiii ii9iei[i1iiiiZiii:iiii2i3iiGiiiiyi4iiii5i6i7i,iwiiisi8iii9i:iii~i;ii<i;i}i=i>i?ioi)iii@iiAiBiii2iYiCiDii<iEiFiGiHiIi%iJiKiLiMiNiOii`i>iPii=iQiiRiiSiTi;iiiii iUiiViWiXi4iYiiiZi[ii\i]iii^iii_i"iPiii`i;ii~iHiaiiviizi?iiiibiii<icididieifici0iidiigiyiiihiiisi0iji=ikiiliiii<ibiiiUi iiiiIiminioiipiqirisitiuiiiii6iviwii*ii]ixiyiiiziZii-i:iibi i{i|ii&i'iii5iiii>i}i~iwiigiiii6ii%iii(iiviiiiwiiiiiEiiiiiiiiiifiiVii7iiiiiBiiNii[ii'iiiiiiiiSiiiiiieiiixiiiiiiiiiiiiiiiiiiiiii?iiiiiqiifii(i)iii~ii\iiiiii)iiiiiiiiiiii$iiiiiiiliiiii~iiiCiiiii@iiiiii2iiiKiiziViiiiiiQirifiiiiii ihi+i3ii1ii iiiiigi(iiiiziiiiiiiiiiiiiiiiiiAii<ijiiiMigii2iiiiiiiiiiVihiiiJiii0iiibiiiiiiiiiiYiiiiiiiai!i*iiiiiiKiDi8iiRiiBii@iiiiiiiiyiiiiiiXi:iii#iiiiiiiGiiikiii=iiiii!iiiiJiii=iiii}iiijiiiiiiiiiiiiiEiiiiiijiOi4iiiiiiiiii ivi]iiCiiiiiiiioiiiii iiiiliciAiiiiiiiiiiTiiikiiiiiii3i*iiqiii>iiiiiii+iiiiii;iipiixiiiii iiiii ii i ii i iiiiiliiiiiii)iiiiimi8iiiDiiiii iiiiiiii7iLiBiiiDiiiiiitiiii i!i i"i#i$i%iRi&i'i(i)i*ii+i,ii,i-i.imii i^i/iciiEiiiiaimi0iEi1i2i3iiii4iTiiii5iiiii6i7iiniiioi8i9iFiiii:iGi;i<i=i>i?i@iAiBiCiDiEi$iFiGiii%iiipiHiIiJiKiLiiiiiiiiMiNiOiPiQiRiiiSi/iTiiUiiiiViiIiHiiiiiiWiiXiiqiYiZi[i\iiriisi]i^i_i`i iviLiaiii.iibiFi>iiijiciZiiiBi6ii`idieiii|iifiii5igiihiiiiHiijiiikiilii1iminioipiqiriCisitiuiviwiixiyizi{iii|i}i~iiiiiiiiiOiiiiiiiiiiiiiEiiiqiiiIii\ii-iiiSiiii iieiiiiliiMiiiQiiPiii^ii i-iFiiiiiiiiiiiiiiiiiii i.iitiiiiiJiiiiiiiigiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuiiii9i iiii ii$iiiiii5i%iikiLiiiiiiiiiiiAiiiiiiiiiiRiiuiiiiii)iii:iiiiiiii"i$iviiiiciZiiiiiii*iWiiKiiLii+iiiiiiiiii iBiii?iiiiiiiiiiMi[i5iiiiniiiiiiCii'iiiiiiiii iiii iiiiiiiiFiTi/iiiiii8iiuiiiiKii(iMiiiiiiiiiiiiiiiTii?iiiiiiiiei i(iiiiiii%i0iiiiOii i8i i i i i iiii i i iii#iii iiiVi iiiPi i iMiWii ii ii|i i iSiiiiiiii i iii i i i i i ii i ii9iDiiiiiii i3iii i i i{i iii i i ii iiiiii! ikiiiiiNiiYii" i# i$ i% i& i' i( i]i) i* i+ i, i- i. ii/ iii>iiii1 iiiii\ii2 ii3 iii4 i5 i6 iwi7 ii8 ii3iiii9 i: iLi iii; ii< iiiiiii iiii= iiJi> i? i@ iiA iiB iC iD iiE iiiF iG iH iI iiiiiiiJ iK iiiL iM iN iiIiO iP iiQ iR iS iiT iiU iV iW iX iiY iZ i[ i\ i] iii^ i_ i` ia iiib ic id ie iiif ig iUiixi ih iiii ij iiii4i&iiii!iiiiSiyi iii"i ii#ik iil im in iiiipiQii.io iUiiOiip iiq ir is ixit iiu iv iw iii$ix iiy ii`iz i{ i| i} ii~ i i i i i i i iiCiiiii%iyiiioi ii i i i i i ii i i i iii iii i ii@iii iGi iiii2iiiii i i i iNi i iiiii i i i i iri iiziniiiiPi i#i i&iQi iimi iciii i'i iwi i ii(ili@iiii)ii*i i i i ii i i i iii iii i i iHii i ii iii i i ii i iri iiiAi iiiii i}i,iii:iiiii iiIi iNii1i iWiiiiiiii i+i i i1iibii iqi i,i iiieiii_iidi i i i i i iii2iiii ii i i i ii ii i ii-i iii i i i i i ii i i i i i ii ii i iii7i ii ii i i i i i i iiiiiiiii,iGiiii ii^i i i.i iigii ii i i iii iiii_ii i i iiihihii{i i|iiii3i i i iii i i i\iiiii i i i i i i ii i i i iiii iji iiii4ii i i i i i iii i i i ii6idii/i i iiiioi iiRiiii i&i ikiniziiiii ii iiiXiidiiSii}i i}iii~iiiii i! iNi" iiiiiii# iiisi$ i% i& ifiDii1i' iii( i@i) i^iiii* ii+ i, i- i. i/ iJi+i0 i1 i2 iiTii3 i4 i5 i6 ii7 iAi.iiii8 i9 ii"i: i; ii< i= i> iii0i? ii@ iiA iB iiC iD iE iF iG iii_i[iH iI iii`iaiJ iiiiiK iL iM iN iiO iiiiiiiP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i iipi i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i iUi i i i i i i i i i i i i i i i i i i i i i i i1i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i i) i* i+ i, ii- i. ii/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: iVi2i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir i3is it iu iv iw ix iy iz i{ i| i} i~ i ii i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i ii i4i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i iii i i i i i i i i i i i i i ii i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i! i" i# i$ ii% i& i' i( i) ii* i+ i, i- iWi. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih i5ii ij ik il im in io ip iq ir is it iu iiv iw i6ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i7i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i8i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV i9iW iX iY iZ i[ i:i\ i] i^ iii_ i` ia ib ic id ie if ig iih ii ij i;ik il im in io iip iq ir is it iu iv iw ix iy iz i{ i| i} i~ ii i i i i iii i i!i i i i"i i i i i i#i i i i i i$i i i i i i i i i i i i i i<i i i i i i ii i i i i i i%i i=i i i i i i i i i i i i i>i i i i i i&i?i i i i'i i(i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i)i i i*i iiiiiiiiii i i i i iiiiiiii+iiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i,i.i/i-i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHi.iIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiiyizi{i|i/ii}i~iiiiiii0iiiiiiiiiiiiiiiiiiiiiiiiiiiiii@iiiiiiiiiiii1iiiiiiiiiii2iiiiiiiiiiiiiAiiiiiiiiiiiiiiiiiiBi3iii4iiiiiiiiiiCiiiiii5iiiiiiiiiii6iii7iDiiiiiiii8iii9iiiiiiiiiiiiiEiiiii i i i i iiiiii:iiiiiiiiiiii;iii i!i<i"i#i$i%i&i'i(i)i*i+i,i-i.i=i/i0i1i2i3i4i5i6i7i>i8i9i:i?i@i;iFi<iGi=i>iHi?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiiUiViWiXiYiZi[ii\iAi]i^i_i`iaibicidieifigiBihiiijikiliCiminioipiqirisitiuiviwixiyizi{i|i}iDi~iiiiiiiiiiiiIiiiiiiiiiiiiiiiJiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiiiiiiiiiiEiiiiiiiiiiiiiiiiiiiiiFiiiiiGiiiiiiiiiiiiiiiiHiiiiiiiiiiIiiiiiiiiiiiiiiiiii i i i ii iiiiiiiiiiiiiiiiiiiiJi i!i"i#i$i%i&i'i(i)iLi*i+i,i-i.i/i0iKi1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{iLi|i}i~iiiiiiMiiMiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiQi i i i i iRiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iSiAiBiCiDiEiFiGiHiIiXiJiKiLiMiNiTiOiPiQiRiSiTiUiViWiXiYiZiii[i\i]i^i_i`iaibicidieifigiOihiiijikiliminioipiqiUirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiViiiiWiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiXiiiiiiYiiiiiiiiiZiiiiiiiiiiii[iiiiiiiiiiiiiiiiiiiii\ii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)iQi*i+i,i-i.i/i0i1i2i3i4i5iRi6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJi]iKiLiMiNiOi^iPiQiRiSiiTiUiViYiWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii_ii`iiiiiiiiiaiiiiiiiiiiiiSiiiiiiiiiiiiiiibiiiiiiiiiiiciiiiiiiiiiiidiiiiiiiiiiiiiiiiiieiiiifiiiiiiiiiigiiiiiiiiiiiiiiii5iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiihiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/iji0i1i2iTi3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCikiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiliuiviwiximiyizini{i|i}i~iiiiiiiiiiiiiiiioiipiiiiiii6iiiiiiiiiiiiiiiiiUiiiiiiiiiiiiqiiiiiiiViiiiiiiiiiiriiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiitiiiiiiiiiWiiiiiiiiiii iui i i i iiiiiiiiiiiiiiiiiXiiviiYi i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:iZi;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiwiOiPiQiRixiSiTiUiVi[iWi\iXiYiZi[i]i\i]i^i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiyiiiiiziiiiiii_iiiiiiiiiiiiiiiiiiiiiiiiiiii{iiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiii`iiiiiiiiiiiiiiiiiiiiiiii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i~i%i&i'i(ii)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifiigihiiijikilimiinioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaiiiiiiiiiiiiiiiiiiiiiiiZiiiiiiiiiiiiiiiiiiiiiiibiiiiiiiiiiiiiiiiiiiiiiiciiiiiiiiiiiiiiiiiiiiidiiiiiii i i i i iiiiiei iiiiiiiiiiiiiiii i!i"i#i$ii%ii&i'i(i)i*i+i,i-i.ii/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiiCiDiEiFiGiHiIiiJiKiLiMiNiiOiPiQiRifiSiTiUiViWiXiYiZi[i\i]ii^i_iii`iaibicidieifigihiiiijikiliminioipiiqirisitiuiviwigixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihiiiiiiiiiiiiiiiiiiii[i\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/ii0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iiiAiiBiCiDiEiFiGiHiIiiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]iii^iji_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)ii*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikilimiinioipiqirisitiuiviwiixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&ii'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiliiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEimiFiGiHiIiJiKiLiMiNiOiPiniiQiRiSiTiUiViiWiXiYiZioi[i\i]i^i_i`iaibicidieipifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|ii}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiriMiNiOiPiQiRiSiTiUiViWiXiiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'isi(i)i*i+i,i-ii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"N(&"i iixitiiiiHiaiiiii+iiWiuiihii]iiiiiiiiiiiviwiiiiimiFi!ipii iiiiiiixii/iiiiiiiii9iiiitii-iyiiKiiiiiiiiOiiniiiiiii0iii<i4i{iiiiiiiiiriiiiiiiiiiiiXiXiiiiiYiii&iiPiiiiiiii^iiiiiiii9iiiiiiiQii"iitiiiiii]i{i7iiii{ii;iiuiizi/ii|iiiii7iii.iiiiiiiiiiiiii{iiii#i|i}ii~iiti8ii_i i i i i i!iiii_iiiiiii*iiuii`i"iii|iiiiiiiaiiiiiii?iiRi!i i/iii!i"i=iii#ii$i%i&i'i(i)i,ii'ibi$i*ii+ii-ii,iiiiii&iUiii#iii-i.i'iiifi/isii0iiiiii ii9iei[i1iiiiZiii:iiii2i3iiGiiiiyi4iiii5i6i7i,iwiiisi8iii9i:iii~i;ii<i;i}i=i>i?ioi)iii@iiAiBiii2iYiCiDii<iEiFiGiHiIi%iJiKiLiMiNiOii`i>iPii=iQiiRiiSiTi;iiiii iUiiViWiXi4iYiiiZi[ii\i]iii^iii_i"iPiii`i;ii~iHiaiiviizi?iiiibiii<icididieifici0iidiigiyiiihiiisi0iji=ikiiliiii<ibiiiUi iiiiIiminioiipiqirisitiuiiiii6iviwii*ii]ixiyiiiziZii-i:iibi i{i|ii&i'iii5iiii>i}i~iwiigiiii6ii%iii(iiviiiiwiiiiiEiiiiiiiiiifiiVii7iiiiiBiiNii[ii'iiiiiiiiSiiiiiieiiixiiiiiiiiiiiiiiiiiiiiii?iiiiiqiifii(i)iii~ii\iiiiii)iiiiiiiiiiii$iiiiiiiliiiii~iiiCiiiii@iiiiii2iiiKiiziViiiiiiQirifiiiiii ihi+i3ii1ii iiiiigi(iiiiziiiiiiiiiiiiiiiiiiAii<ijiiiMigii2iiiiiiiiiiVihiiiJiii0iiibiiiiiiiiiiYiiiiiiiai!i*iiiiiiKiDi8iiRiiBii@iiiiiiiiyiiiiiiXi:iii#iiiiiiiGiiikiii=iiiii!iiiiJiii=iiii}iiijiiiiiiiiiiiiiEiiiiiijiOi4iiiiiiiiii ivi]iiCiiiiiiiioiiiii iiiiliciAiiiiiiiiiiTiiikiiiiiii3i*iiqiii>iiiiiii+iiiiii;iipiixiiiii iiiii ii i ii i iiiiiliiiiiii)iiiiimi8iiiDiiiii iiiiiiii7iLiBiiiDiiiiiitiiii i!i i"i#i$i%iRi&i'i(i)i*ii+i,ii,i-i.imii i^i/iciiEiiiiaimi0iEi1i2i3iiii4iTiiii5iiiii6i7iiniiioi8i9iFiiii:iGi;i<i=i>i?i@iAiBiCiDiEi$iFiGiii%iiipiHiIiJiKiLiiiiiiiiMiNiOiPiQiRiiiSi/iTiiUiiiiViiIiHiiiiiiWiiXiiqiYiZi[i\iiriisi]i^i_i`i iviLiaiii.iibiFi>iiijiciZiiiBi6ii`idieiii|iifiii5igiihiiiiHiijiiikiilii1iminioipiqiriCisitiuiviwiixiyizi{iii|i}i~iiiiiiiiiOiiiiiiiiiiiiiEiiiqiiiIii\ii-iiiSiiii iieiiiiliiMiiiQiiPiii^ii i-iFiiiiiiiiiiiiiiiiiii i.iitiiiiiJiiiiiiiigiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiuiiii9i iiii ii$iiiiii5i%iikiLiiiiiiiiiiiAiiiiiiiiiiRiiuiiiiii)iii:iiiiiiii"i$iviiiiciZiiiiiii*iWiiKiiLii+iiiiiiiiii iBiii?iiiiiiiiiiMi[i5iiiiniiiiiiCii'iiiiiiiii iiii iiiiiiiiFiTi/iiiiii8iiuiiiiKii(iMiiiiiiiiiiiiiiiTii?iiiiiiiiei i(iiiiiii%i0iiiiOii i8i i i i i iiii i i iii#iii iiiVi iiiPi i iMiWii ii ii|i i iSiiiiiiii i iii i i i i i ii i ii9iDiiiiiii i3iii i i i{i iii i i ii iiiiii! ikiiiiiNiiYii" i# i$ i% i& i' i( i]i) i* i+ i, i- i. ii/ iii>iiii0 i1 iiiii\ii2 ii3 iii4 i5 i6 iwi7 ii8 ii3iiii9 i: iLi iii; ii< iiiiiii iiii= iiJi> i? i@ iiA iiB iC iD iiE iiiF iG iH iI iiiiiiiJ iK iiiL iM iN iiIiO iP iiQ iR iS iiT iiU iV iW iX iiY iZ i[ i\ i] iii^ i_ i` ia iiib ic id ie iiif ig iUiixi ih iiii ij iiii4i&iiii!iiiiSiyi iii"i ii#ik iil im in iiiipiQii.io iUiiOiip iiq ir is ixit iiu iv iw iii$ix iiy ii`iz i{ i| i} ii~ i i i i i i i iiCiiiii%iyiiioi ii i i i i i ii i i i iii iii i ii@iii iGi iiii2iiiii i i i iNi i iiiii i i i i iri iiziniiiiPi i#i i&iQi iimi iciii i'i iwi i ii(ili@iiii)ii*i i i i ii i i i iii iii i i iHii i ii iii i i ii i iri iiiAi iiiii i}i,iii:iiiii iiIi iNii1i iWiiiiiiii i+i i i1iibii iqi i,i iiieiii_iidi i i i i i iii2iiii ii i i i ii ii i ii-i iii i i i i i ii i i i i i ii ii i iii7i ii ii i i i i i i iiiiiiiii,iGiiii ii^i i i.i iigii ii i i iii iiii_ii i i iiihihii{i i|iiii3i i i iii i i i\iiiii i i i i i i ii i i i iiii iji iiii4ii i i i i i iii i i i ii6idii/i i iiiioi iiRiiii i&i ikiniziiiii ii iiiXiidiiSii}i i}iii~iiiii i! iNi" iiiiiii# iiisi$ i% i& ifiDii1i' iii( i@i) i^iiii* ii+ i, i- i. i/ iJi+i0 i1 i2 iiTii3 i4 i5 i6 ii7 iAi.iiii8 i9 ii"i: i; ii< i= i> iii0i? ii@ iiA iB iiC iD iE iF iG iii_i[iH iI iii`iaiJ iiiiiK iL iM iN iiO iiiiiiiP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i iipi i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i iUi i i i i i i i i i i i i i i i i i i i i i i i1i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i i) i* i+ i, ii- i. ii/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: iVi2i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir i3is it iu iv iw ix iy iz i{ i| i} i~ i ii i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i ii i4i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i iii i i i i i i i i i i i i i ii i i i i i i i i ii i i i i i i ii i i i i i i i i i i i i i i i i i i i i i! i" i# i$ ii% i& i' i( i) ii* i+ i, i- iWi. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih i5ii ij ik il im in io ip iq ir is it iu iiv iw i6ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i ii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i7i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i8i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV i9iW iX iY iZ i[ i:i\ i] i^ iii_ i` ia ib ic id ie if ig iih ii ij i;ik il im in io iip iq ir is it iu iv iw ix iy iz i{ i| i} i~ ii i i i i iii i i!i i i i"i i i i i i#i i i i i i$i i i i i i i i i i i i i i<i i i i i i ii i i i i i i%i i=i i i i i i i i i i i i i>i i i i i i&i?i i i i'i i(i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i)i i i*i iiiiiiiiii i i i i iiiiiiii+iiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i,i.i/i-i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHi.iIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiiyizi{i|i/ii}i~iiiiiii0iiiiiiiiiiiiiiiiiiiiiiiiiiiiii@iiiiiiiiiiii1iiiiiiiiiii2iiiiiiiiiiiiiAiiiiiiiiiiiiiiiiiiBi3iii4iiiiiiiiiiCiiiiii5iiiiiiiiiii6iii7iDiiiiiiii8iii9iiiiiiiiiiiiiEiiiii i i i i iiiiii:iiiiiiiiiiii;iii i!i<i"i#i$i%i&i'i(i)i*i+i,i-i.i=i/i0i1i2i3i4i5i6i7i>i8i9i:i?i@i;iFi<iGi=i>iHi?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiiUiViWiXiYiZi[ii\iAi]i^i_i`iaibicidieifigiBihiiijikiliCiminioipiqirisitiuiviwixiyizi{i|i}iDi~iiiiiiiiiiiiIiiiiiiiiiiiiiiiJiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiKiiiiiiiiiiiiiiiiiiEiiiiiiiiiiiiiiiiiiiiiFiiiiiGiiiiiiiiiiiiiiiiHiiiiiiiiiiIiiiiiiiiiiiiiiiiii i i i ii iiiiiiiiiiiiiiiiiiiiJi i!i"i#i$i%i&i'i(i)iLi*i+i,i-i.i/i0iKi1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{iLi|i}i~iiiiiiMiiMiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiiiiiiiiiiiiNiiiiiiiiiiiiiiiiiiOiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiQi i i i i iRiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iSiAiBiCiDiEiFiGiHiIiXiJiKiLiMiNiTiOiPiQiRiSiTiUiViWiXiYiZiii[i\i]i^i_i`iaibicidieifigiOihiiijikiliminioipiqiUirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiViiiiWiiiiiiiiiiiiiiiPiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiXiiiiiiYiiiiiiiiiZiiiiiiiiiiii[iiiiiiiiiiiiiiiiiiiii\ii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)iQi*i+i,i-i.i/i0i1i2i3i4i5iRi6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJi]iKiLiMiNiOi^iPiQiRiSiiTiUiViYiWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~ii_ii`iiiiiiiiiaiiiiiiiiiiiiSiiiiiiiiiiiiiiibiiiiiiiiiiiciiiiiiiiiiiidiiiiiiiiiiiiiiiiiieiiiifiiiiiiiiiigiiiiiiiiiiiiiiii5iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiihiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/iji0i1i2iTi3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCikiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiliuiviwiximiyizini{i|i}i~iiiiiiiiiiiiiiiioiipiiiiiii6iiiiiiiiiiiiiiiiiUiiiiiiiiiiiiqiiiiiiiViiiiiiiiiiiriiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiitiiiiiiiiiWiiiiiiiiiii iui i i i iiiiiiiiiiiiiiiiiXiiviiYi i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:iZi;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiwiOiPiQiRixiSiTiUiVi[iWi\iXiYiZi[i]i\i]i^i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiyiiiiiziiiiiii_iiiiiiiiiiiiiiiiiiiiiiiiiiii{iiiiiiiiiiiiiiiiii|iiiiiiiiiiiiiiiiiiiiii`iiiiiiiiiiiiiiiiiiiiiiii}iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i~i%i&i'i(ii)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifiigihiiijikilimiinioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiaiiiiiiiiiiiiiiiiiiiiiiiZiiiiiiiiiiiiiiiiiiiiiiibiiiiiiiiiiiiiiiiiiiiiiiciiiiiiiiiiiiiiiiiiiiidiiiiiii i i i i iiiiiei iiiiiiiiiiiiiiii i!i"i#i$ii%ii&i'i(i)i*i+i,i-i.ii/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiiCiDiEiFiGiHiIiiJiKiLiMiNiiOiPiQiRifiSiTiUiViWiXiYiZi[i\i]ii^i_iii`iaibicidieifigihiiiijikiliminioipiiqirisitiuiviwigixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihiiiiiiiiiiiiiiiiiiii[i\iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/ii0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iiiAiiBiCiDiEiFiGiHiIiiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]iii^iji_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)ii*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikilimiinioipiqirisitiuiviwiixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiikiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&ii'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigiihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiliiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEimiFiGiHiIiJiKiLiMiNiOiPiniiQiRiSiTiUiViiWiXiYiZioi[i\i]i^i_i`iaibicidieipifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|ii}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiqiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>ii?i@iAiBiCiDiEiFiGiHiIiJiKiLiriMiNiOiPiQiRiSiTiUiViWiXiiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'isi(i)i*i+i,i-ii.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&i'i(i)i*i+i,i-i.i/i0i1i2i3i4i5i6i7i8i9i:i;i<i=i>i?i@iAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi[i\i]i^i_i`iaibicidieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i! i" i# i$ i% i& i' i( i) i* i+ i, i- i. i/ i0 i1 i2 i3 i4 i5 i6 i7 i8 i9 i: i; i< i= i> i? i@ iA iB iC iD iE iF iG iH iI iJ iK iL iM iN iO iP iQ iR iS iT iU iV iW iX iY iZ i[ i\ i] i^ i_ i` ia ib ic id ie if ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz i{ i| i} i~ i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i i!i!i!i!i!i!i!i!i!i !i !i !i !i !i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i !i!!i"!i#!i$!i%!i&!i'!i(!i)!i*!i+!i,!i-!i.!i/!i0!i1!i2!i3!i4!i5!i6!i7!i8!i9!i:!i;!i!i?!i@!iA!iB!iC!iD!iE!iF!iG!iH!iI!iJ!iK!iL!iM!iN!iO!iP!iQ!iR!iS!iT!iU!iV!iW!iX!iY!iZ!i[!i\!i]!i^!i_!i`!ia!ib!ic!id!ie!if!ig!ih!ii!ij!ik!il!im!in!io!ip!iq!ir!is!it!iu!iv!iw!ix!iy!iz!i{!i|!i}!i~!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i!i"i"i"i"i"i"i"i"i"i "i "i "i "i "i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i"i "i!"i""i#"i$"i%"(t EUCKR_TYPICAL_DISTRIBUTION_RATIOtEUCKR_TABLE_SIZEtEUCKRCharToFreqOrder(((s5/usr/lib/python2.7/site-packages/chardet/euckrfreq.pyt)sHPK[ site-packages/chardet/escsm.pycnu[ ۝Rc@sddlmZmZmZdZeedeeeeeeeeeeeeeeeeeeededededddededddededeeeeeeef0ZdZied6dd 6ed 6ed 6d d 6ZdZedeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeeeeddeeeeeeeeeeeeeeeeeeeeeef@Z dZ ied6dd 6e d 6e d 6dd 6Z dZ edeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeedeeeeedeeeeeeeeeeeeeeeeeeeeeeeeeeeefHZ dZie d6dd 6e d 6ed 6dd 6ZdZedeeeeeeeeeeeeeeeeeeedeeeeeedeeeeeeeeeeef(ZdZied6dd 6ed 6ed 6dd 6ZdS(i(teStartteErrorteItsMeiiiiiit classTablet classFactort stateTablet charLenTables HZ-GB-2312tnamei s ISO-2022-CNiii s ISO-2022-JPs ISO-2022-KRN(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii( iiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii( iiiiiiiiii(iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii(iiiiii(t constantsRRRtHZ_clstHZ_sttHZCharLenTablet HZSMModelt ISO2022CN_clst ISO2022CN_sttISO2022CNCharLenTabletISO2022CNSMModelt ISO2022JP_clst ISO2022JP_sttISO2022JPCharLenTabletISO2022JPSMModelt ISO2022KR_clst ISO2022KR_sttISO2022KRCharLenTabletISO2022KRSMModel(((s1/usr/lib/python2.7/site-packages/chardet/escsm.pytsh       PK[i ,site-packages/chardet/charsetgroupprober.pyonu[ ۝Rc@sFddlmZddlZddlmZdefdYZdS(i(t constantsiN(t CharSetProbertCharSetGroupProbercBs5eZdZdZdZdZdZRS(cCs,tj|d|_g|_d|_dS(Ni(Rt__init__t _mActiveNumt _mProberstNonet_mBestGuessProber(tself((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR"s   cCsbtj|d|_x<|jD]1}|r |jt|_|jd7_q q Wd|_dS(Nii(RtresetRRtTruetactiveRR(Rtprober((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR (s    cCs0|js#|j|js#dSn|jjS(N(Rtget_confidenceRtget_charset_name(R((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR2s    cCsx|jD]}|sq n|js+q n|j|}|sFq n|tjkrh||_|jS|tjkr t|_|j d8_ |j dkrtj|_ |jSq q W|jS(Nii( RR tfeedRteFoundItRt get_stateteNotMetFalseRt_mState(RtaBufR tst((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR:s$     cCs|j}|tjkrdS|tjkr2dSd}d|_x|jD]}|s]qKn|jstjrKt j j |j dqKqKn|j }tjrt j j d|j |fn||krK|}||_qKqKW|jsdS|S(NgGz?g{Gz?gs not active s%s confidence = %s (RRRRRRRR t_debugtsyststderrtwriteRR (RRtbestConfR tcf((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR Ns2          (t__name__t __module__RR RRR (((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyR!s    (tRRt charsetproberRR(((s>/usr/lib/python2.7/site-packages/chardet/charsetgroupprober.pyts PK[HR 11+site-packages/chardet/langbulgarianmodel.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # 255: Control characters that usually does not exist in any text # 254: Carriage/Return # 253: symbol (punctuation) that does not belong to word # 252: 0 - 9 # Character Mapping Table: # this table is modified base on win1251BulgarianCharToOrderMap, so # only number <64 is sure valid Latin5_BulgarianCharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209, # 80 210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225, # 90 81,226,227,228,229,230,105,231,232,233,234,235,236, 45,237,238, # a0 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # b0 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,239, 67,240, 60, 56, # c0 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # d0 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,241, 42, 16, # e0 62,242,243,244, 58,245, 98,246,247,248,249,250,251, 91,252,253, # f0 ) win1251BulgarianCharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253, 77, 90, 99,100, 72,109,107,101, 79,185, 81,102, 76, 94, 82, # 40 110,186,108, 91, 74,119, 84, 96,111,187,115,253,253,253,253,253, # 50 253, 65, 69, 70, 66, 63, 68,112,103, 92,194,104, 95, 86, 87, 71, # 60 116,195, 85, 93, 97,113,196,197,198,199,200,253,253,253,253,253, # 70 206,207,208,209,210,211,212,213,120,214,215,216,217,218,219,220, # 80 221, 78, 64, 83,121, 98,117,105,222,223,224,225,226,227,228,229, # 90 88,230,231,232,233,122, 89,106,234,235,236,237,238, 45,239,240, # a0 73, 80,118,114,241,242,243,244,245, 62, 58,246,247,248,249,250, # b0 31, 32, 35, 43, 37, 44, 55, 47, 40, 59, 33, 46, 38, 36, 41, 30, # c0 39, 28, 34, 51, 48, 49, 53, 50, 54, 57, 61,251, 67,252, 60, 56, # d0 1, 18, 9, 20, 11, 3, 23, 15, 2, 26, 12, 10, 14, 6, 4, 13, # e0 7, 8, 5, 19, 29, 25, 22, 21, 27, 24, 17, 75, 52,253, 42, 16, # f0 ) # Model Table: # total sequences: 100% # first 512 sequences: 96.9392% # first 1024 sequences:3.0618% # rest sequences: 0.2992% # negative sequences: 0.0020% BulgarianLangModel = ( 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,3,3,3,3,3,3,2,3,3,3,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,2,2,1,2,2, 3,1,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3,3,3,0,3,0,1, 0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,3,3,0,3,1,0, 0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,1,3,2,3,3,3,3,3,3,3,3,0,3,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,2,3,2,2,1,3,3,3,3,2,2,2,1,1,2,0,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,2,3,2,2,3,3,1,1,2,3,3,2,3,3,3,3,2,1,2,0,2,0,3,0,0, 0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,1,3,3,3,3,3,2,3,2,3,3,3,3,3,2,3,3,1,3,0,3,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,1,3,3,2,3,3,3,1,3,3,2,3,2,2,2,0,0,2,0,2,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,0,3,3,3,2,2,3,3,3,1,2,2,3,2,1,1,2,0,2,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,2,3,3,1,2,3,2,2,2,3,3,3,3,3,2,2,3,1,2,0,2,1,2,0,0, 0,0,0,0,0,0,0,0,0,0,3,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,1,3,3,3,3,3,2,3,3,3,2,3,3,2,3,2,2,2,3,1,2,0,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,3,3,1,1,1,2,2,1,3,1,3,2,2,3,0,0,1,0,1,0,1,0,0, 0,0,0,1,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,2,2,3,2,2,3,1,2,1,1,1,2,3,1,3,1,2,2,0,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,1,3,2,2,3,3,1,2,3,1,1,3,3,3,3,1,2,2,1,1,1,0,2,0,2,0,1, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,2,2,3,3,3,2,2,1,1,2,0,2,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,0,1,2,1,3,3,2,3,3,3,3,3,2,3,2,1,0,3,1,2,1,2,1,2,3,2,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,1,1,2,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,1,3,3,2,3,3,2,2,2,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,0,3,3,3,3,3,2,1,1,2,1,3,3,0,3,1,1,1,1,3,2,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,2,2,2,3,3,3,3,3,3,3,3,3,3,3,1,1,3,1,3,3,2,3,2,2,2,3,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,2,3,3,2,2,3,2,1,1,1,1,1,3,1,3,1,1,0,0,0,1,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,2,3,2,0,3,2,0,3,0,2,0,0,2,1,3,1,0,0,1,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,2,1,1,1,1,2,1,1,2,1,1,1,2,2,1,2,1,1,1,0,1,1,0,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,2,1,3,1,1,2,1,3,2,1,1,0,1,2,3,2,1,1,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,2,2,1,0,1,0,0,1,0,0,0,2,1,0,3,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,2,3,2,3,3,1,3,2,1,1,1,2,1,1,2,1,3,0,1,0,0,0,1,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,1,2,2,3,3,2,3,2,2,2,3,1,2,2,1,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,2,1,3,1,0,2,2,1,3,2,1,0,0,2,0,2,0,1,0,0,0,0,0,0,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1, 3,3,3,3,3,3,1,2,0,2,3,1,2,3,2,0,1,3,1,2,1,1,1,0,0,1,0,0,2,2,2,3, 2,2,2,2,1,2,1,1,2,2,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,1, 3,3,3,3,3,2,1,2,2,1,2,0,2,0,1,0,1,2,1,2,1,1,0,0,0,1,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1, 3,3,2,3,3,1,1,3,1,0,3,2,1,0,0,0,1,2,0,2,0,1,0,0,0,1,0,1,2,1,2,2, 1,1,1,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,1,1,0,0, 3,1,0,1,0,2,3,2,2,2,3,2,2,2,2,2,1,0,2,1,2,1,1,1,0,1,2,1,2,2,2,1, 1,1,2,2,2,2,1,2,1,1,0,1,2,1,2,2,2,1,1,1,0,1,1,1,1,2,0,1,0,0,0,0, 2,3,2,3,3,0,0,2,1,0,2,1,0,0,0,0,2,3,0,2,0,0,0,0,0,1,0,0,2,0,1,2, 2,1,2,1,2,2,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,1,0,1,1,1,0,0,1,2,0,0, 3,3,2,2,3,0,2,3,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,1,0,1,2,0,2,2, 1,1,1,1,2,1,0,1,2,2,2,1,1,1,1,1,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,0, 2,3,2,3,3,0,0,3,0,1,1,0,1,0,0,0,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2, 2,2,1,1,1,1,1,2,2,2,1,0,2,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0, 3,3,3,3,2,2,2,2,2,0,2,1,1,1,1,2,1,2,1,1,0,2,0,1,0,1,0,0,2,0,1,2, 1,1,1,1,1,1,1,2,2,1,1,0,2,0,1,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,0,0, 2,3,3,3,3,1,0,0,0,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,0,1,2, 2,2,2,1,1,2,1,1,2,2,2,1,2,0,1,1,1,1,1,1,0,1,1,1,1,0,0,1,1,1,0,0, 2,3,3,3,3,0,2,2,0,2,1,0,0,0,1,1,1,2,0,2,0,0,0,3,0,0,0,0,2,0,2,2, 1,1,1,2,1,2,1,1,2,2,2,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0, 2,3,3,3,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,2,0,0,0,0,0,0,0,0,2,0,1,2, 1,1,1,2,1,1,1,1,2,2,2,0,1,0,1,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0, 3,3,2,2,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,3,0,0,0,0,0,0,0,0,1,0,2,2, 1,1,1,1,1,2,1,1,2,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,0, 3,1,0,1,0,2,2,2,2,3,2,1,1,1,2,3,0,0,1,0,2,1,1,0,1,1,1,1,2,1,1,1, 1,2,2,1,2,1,2,2,1,1,0,1,2,1,2,2,1,1,1,0,0,1,1,1,2,1,0,1,0,0,0,0, 2,1,0,1,0,3,1,2,2,2,2,1,2,2,1,1,1,0,2,1,2,2,1,1,2,1,1,0,2,1,1,1, 1,2,2,2,2,2,2,2,1,2,0,1,1,0,2,1,1,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0, 2,1,1,1,1,2,2,2,2,1,2,2,2,1,2,2,1,1,2,1,2,3,2,2,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,3,2,0,1,2,0,1,2,1,1,0,1,0,1,2,1,2,0,0,0,1,1,0,0,0,1,0,0,2, 1,1,0,0,1,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,0, 2,0,0,0,0,1,2,2,2,2,2,2,2,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1, 1,2,2,2,2,1,1,2,1,2,1,1,1,0,2,1,2,1,1,1,0,2,1,1,1,1,0,1,0,0,0,0, 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, 1,1,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,3,2,0,0,0,0,1,0,0,0,0,0,0,1,1,0,2,0,0,0,0,0,0,0,0,1,0,1,2, 1,1,1,1,1,1,0,0,2,2,2,2,2,0,1,1,0,1,1,1,1,1,0,0,1,0,0,0,1,1,0,1, 2,3,1,2,1,0,1,1,0,2,2,2,0,0,1,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,1,2, 1,1,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0, 2,2,2,2,2,0,0,2,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,2,2, 1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,0,2,0,1,1,0,0,0,1,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,1,1, 0,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,2, 1,1,0,0,1,0,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 2,1,2,2,2,1,2,1,2,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,1,1,1,0,1,1, 1,1,2,1,1,1,1,1,1,0,0,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,0,0,0, 1,0,0,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,1,0,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,0,2,0,0,1, 0,2,0,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,1,1,0,2,1,0,1,1,1,0,0,1,0,2,0,1,0,0,0,0,0,0,0,0,0,1, 0,1,0,0,1,0,0,0,1,1,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 2,2,2,2,2,0,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, 0,1,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 2,0,1,0,0,1,2,1,1,1,1,1,1,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0, 1,1,2,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,2,1,2,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 0,1,1,0,1,1,1,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0, 1,0,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,0,1, 1,1,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, 1,1,1,1,1,1,1,2,0,0,0,0,0,0,2,1,0,1,1,0,0,1,1,1,0,1,0,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,1,1,0,1,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, ) Latin5BulgarianModel = { 'charToOrderMap': Latin5_BulgarianCharToOrderMap, 'precedenceMatrix': BulgarianLangModel, 'mTypicalPositiveRatio': 0.969392, 'keepEnglishLetter': False, 'charsetName': "ISO-8859-5" } Win1251BulgarianModel = { 'charToOrderMap': win1251BulgarianCharToOrderMap, 'precedenceMatrix': BulgarianLangModel, 'mTypicalPositiveRatio': 0.969392, 'keepEnglishLetter': False, 'charsetName': "windows-1251" } # flake8: noqa PK[$site-packages/chardet/euckrprober.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .mbcharsetprober import MultiByteCharSetProber from .codingstatemachine import CodingStateMachine from .chardistribution import EUCKRDistributionAnalysis from .mbcssm import EUCKRSMModel class EUCKRProber(MultiByteCharSetProber): def __init__(self): MultiByteCharSetProber.__init__(self) self._mCodingSM = CodingStateMachine(EUCKRSMModel) self._mDistributionAnalyzer = EUCKRDistributionAnalysis() self.reset() def get_charset_name(self): return "EUC-KR" PK[H̟site-packages/chardet/escsm.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .constants import eStart, eError, eItsMe HZ_cls = ( 1,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 0,0,0,1,0,0,0,0, # 18 - 1f 0,0,0,0,0,0,0,0, # 20 - 27 0,0,0,0,0,0,0,0, # 28 - 2f 0,0,0,0,0,0,0,0, # 30 - 37 0,0,0,0,0,0,0,0, # 38 - 3f 0,0,0,0,0,0,0,0, # 40 - 47 0,0,0,0,0,0,0,0, # 48 - 4f 0,0,0,0,0,0,0,0, # 50 - 57 0,0,0,0,0,0,0,0, # 58 - 5f 0,0,0,0,0,0,0,0, # 60 - 67 0,0,0,0,0,0,0,0, # 68 - 6f 0,0,0,0,0,0,0,0, # 70 - 77 0,0,0,4,0,5,2,0, # 78 - 7f 1,1,1,1,1,1,1,1, # 80 - 87 1,1,1,1,1,1,1,1, # 88 - 8f 1,1,1,1,1,1,1,1, # 90 - 97 1,1,1,1,1,1,1,1, # 98 - 9f 1,1,1,1,1,1,1,1, # a0 - a7 1,1,1,1,1,1,1,1, # a8 - af 1,1,1,1,1,1,1,1, # b0 - b7 1,1,1,1,1,1,1,1, # b8 - bf 1,1,1,1,1,1,1,1, # c0 - c7 1,1,1,1,1,1,1,1, # c8 - cf 1,1,1,1,1,1,1,1, # d0 - d7 1,1,1,1,1,1,1,1, # d8 - df 1,1,1,1,1,1,1,1, # e0 - e7 1,1,1,1,1,1,1,1, # e8 - ef 1,1,1,1,1,1,1,1, # f0 - f7 1,1,1,1,1,1,1,1, # f8 - ff ) HZ_st = ( eStart,eError, 3,eStart,eStart,eStart,eError,eError,# 00-07 eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f eItsMe,eItsMe,eError,eError,eStart,eStart, 4,eError,# 10-17 5,eError, 6,eError, 5, 5, 4,eError,# 18-1f 4,eError, 4, 4, 4,eError, 4,eError,# 20-27 4,eItsMe,eStart,eStart,eStart,eStart,eStart,eStart,# 28-2f ) HZCharLenTable = (0, 0, 0, 0, 0, 0) HZSMModel = {'classTable': HZ_cls, 'classFactor': 6, 'stateTable': HZ_st, 'charLenTable': HZCharLenTable, 'name': "HZ-GB-2312"} ISO2022CN_cls = ( 2,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 0,0,0,1,0,0,0,0, # 18 - 1f 0,0,0,0,0,0,0,0, # 20 - 27 0,3,0,0,0,0,0,0, # 28 - 2f 0,0,0,0,0,0,0,0, # 30 - 37 0,0,0,0,0,0,0,0, # 38 - 3f 0,0,0,4,0,0,0,0, # 40 - 47 0,0,0,0,0,0,0,0, # 48 - 4f 0,0,0,0,0,0,0,0, # 50 - 57 0,0,0,0,0,0,0,0, # 58 - 5f 0,0,0,0,0,0,0,0, # 60 - 67 0,0,0,0,0,0,0,0, # 68 - 6f 0,0,0,0,0,0,0,0, # 70 - 77 0,0,0,0,0,0,0,0, # 78 - 7f 2,2,2,2,2,2,2,2, # 80 - 87 2,2,2,2,2,2,2,2, # 88 - 8f 2,2,2,2,2,2,2,2, # 90 - 97 2,2,2,2,2,2,2,2, # 98 - 9f 2,2,2,2,2,2,2,2, # a0 - a7 2,2,2,2,2,2,2,2, # a8 - af 2,2,2,2,2,2,2,2, # b0 - b7 2,2,2,2,2,2,2,2, # b8 - bf 2,2,2,2,2,2,2,2, # c0 - c7 2,2,2,2,2,2,2,2, # c8 - cf 2,2,2,2,2,2,2,2, # d0 - d7 2,2,2,2,2,2,2,2, # d8 - df 2,2,2,2,2,2,2,2, # e0 - e7 2,2,2,2,2,2,2,2, # e8 - ef 2,2,2,2,2,2,2,2, # f0 - f7 2,2,2,2,2,2,2,2, # f8 - ff ) ISO2022CN_st = ( eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 eStart,eError,eError,eError,eError,eError,eError,eError,# 08-0f eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 eItsMe,eItsMe,eItsMe,eError,eError,eError, 4,eError,# 18-1f eError,eError,eError,eItsMe,eError,eError,eError,eError,# 20-27 5, 6,eError,eError,eError,eError,eError,eError,# 28-2f eError,eError,eError,eItsMe,eError,eError,eError,eError,# 30-37 eError,eError,eError,eError,eError,eItsMe,eError,eStart,# 38-3f ) ISO2022CNCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0) ISO2022CNSMModel = {'classTable': ISO2022CN_cls, 'classFactor': 9, 'stateTable': ISO2022CN_st, 'charLenTable': ISO2022CNCharLenTable, 'name': "ISO-2022-CN"} ISO2022JP_cls = ( 2,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,2,2, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 0,0,0,1,0,0,0,0, # 18 - 1f 0,0,0,0,7,0,0,0, # 20 - 27 3,0,0,0,0,0,0,0, # 28 - 2f 0,0,0,0,0,0,0,0, # 30 - 37 0,0,0,0,0,0,0,0, # 38 - 3f 6,0,4,0,8,0,0,0, # 40 - 47 0,9,5,0,0,0,0,0, # 48 - 4f 0,0,0,0,0,0,0,0, # 50 - 57 0,0,0,0,0,0,0,0, # 58 - 5f 0,0,0,0,0,0,0,0, # 60 - 67 0,0,0,0,0,0,0,0, # 68 - 6f 0,0,0,0,0,0,0,0, # 70 - 77 0,0,0,0,0,0,0,0, # 78 - 7f 2,2,2,2,2,2,2,2, # 80 - 87 2,2,2,2,2,2,2,2, # 88 - 8f 2,2,2,2,2,2,2,2, # 90 - 97 2,2,2,2,2,2,2,2, # 98 - 9f 2,2,2,2,2,2,2,2, # a0 - a7 2,2,2,2,2,2,2,2, # a8 - af 2,2,2,2,2,2,2,2, # b0 - b7 2,2,2,2,2,2,2,2, # b8 - bf 2,2,2,2,2,2,2,2, # c0 - c7 2,2,2,2,2,2,2,2, # c8 - cf 2,2,2,2,2,2,2,2, # d0 - d7 2,2,2,2,2,2,2,2, # d8 - df 2,2,2,2,2,2,2,2, # e0 - e7 2,2,2,2,2,2,2,2, # e8 - ef 2,2,2,2,2,2,2,2, # f0 - f7 2,2,2,2,2,2,2,2, # f8 - ff ) ISO2022JP_st = ( eStart, 3,eError,eStart,eStart,eStart,eStart,eStart,# 00-07 eStart,eStart,eError,eError,eError,eError,eError,eError,# 08-0f eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 10-17 eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eItsMe,eError,eError,# 18-1f eError, 5,eError,eError,eError, 4,eError,eError,# 20-27 eError,eError,eError, 6,eItsMe,eError,eItsMe,eError,# 28-2f eError,eError,eError,eError,eError,eError,eItsMe,eItsMe,# 30-37 eError,eError,eError,eItsMe,eError,eError,eError,eError,# 38-3f eError,eError,eError,eError,eItsMe,eError,eStart,eStart,# 40-47 ) ISO2022JPCharLenTable = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0) ISO2022JPSMModel = {'classTable': ISO2022JP_cls, 'classFactor': 10, 'stateTable': ISO2022JP_st, 'charLenTable': ISO2022JPCharLenTable, 'name': "ISO-2022-JP"} ISO2022KR_cls = ( 2,0,0,0,0,0,0,0, # 00 - 07 0,0,0,0,0,0,0,0, # 08 - 0f 0,0,0,0,0,0,0,0, # 10 - 17 0,0,0,1,0,0,0,0, # 18 - 1f 0,0,0,0,3,0,0,0, # 20 - 27 0,4,0,0,0,0,0,0, # 28 - 2f 0,0,0,0,0,0,0,0, # 30 - 37 0,0,0,0,0,0,0,0, # 38 - 3f 0,0,0,5,0,0,0,0, # 40 - 47 0,0,0,0,0,0,0,0, # 48 - 4f 0,0,0,0,0,0,0,0, # 50 - 57 0,0,0,0,0,0,0,0, # 58 - 5f 0,0,0,0,0,0,0,0, # 60 - 67 0,0,0,0,0,0,0,0, # 68 - 6f 0,0,0,0,0,0,0,0, # 70 - 77 0,0,0,0,0,0,0,0, # 78 - 7f 2,2,2,2,2,2,2,2, # 80 - 87 2,2,2,2,2,2,2,2, # 88 - 8f 2,2,2,2,2,2,2,2, # 90 - 97 2,2,2,2,2,2,2,2, # 98 - 9f 2,2,2,2,2,2,2,2, # a0 - a7 2,2,2,2,2,2,2,2, # a8 - af 2,2,2,2,2,2,2,2, # b0 - b7 2,2,2,2,2,2,2,2, # b8 - bf 2,2,2,2,2,2,2,2, # c0 - c7 2,2,2,2,2,2,2,2, # c8 - cf 2,2,2,2,2,2,2,2, # d0 - d7 2,2,2,2,2,2,2,2, # d8 - df 2,2,2,2,2,2,2,2, # e0 - e7 2,2,2,2,2,2,2,2, # e8 - ef 2,2,2,2,2,2,2,2, # f0 - f7 2,2,2,2,2,2,2,2, # f8 - ff ) ISO2022KR_st = ( eStart, 3,eError,eStart,eStart,eStart,eError,eError,# 00-07 eError,eError,eError,eError,eItsMe,eItsMe,eItsMe,eItsMe,# 08-0f eItsMe,eItsMe,eError,eError,eError, 4,eError,eError,# 10-17 eError,eError,eError,eError, 5,eError,eError,eError,# 18-1f eError,eError,eError,eItsMe,eStart,eStart,eStart,eStart,# 20-27 ) ISO2022KRCharLenTable = (0, 0, 0, 0, 0, 0) ISO2022KRSMModel = {'classTable': ISO2022KR_cls, 'classFactor': 6, 'stateTable': ISO2022KR_st, 'charLenTable': ISO2022KRCharLenTable, 'name': "ISO-2022-KR"} # flake8: noqa PK[3q__#site-packages/chardet/chardetect.pynu[""" Script which takes one or more file paths and reports on their detected encodings Example:: % chardetect somefile someotherfile somefile: windows-1252 with confidence 0.5 someotherfile: ascii with confidence 1.0 If no paths are provided, it takes its input from stdin. """ from io import open from sys import argv, stdin from chardet.universaldetector import UniversalDetector def description_of(file, name='stdin'): """Return a string describing the probable encoding of a file.""" u = UniversalDetector() for line in file: u.feed(line) u.close() result = u.result if result['encoding']: return '%s: %s with confidence %s' % (name, result['encoding'], result['confidence']) else: return '%s: no result' % name def main(): if len(argv) <= 1: print(description_of(stdin)) else: for path in argv[1:]: with open(path, 'rb') as f: print(description_of(f, path)) if __name__ == '__main__': main() PK[c=E=E*site-packages/chardet/langcyrillicmodel.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is Mozilla Communicator client code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### # KOI8-R language model # Character Mapping Table: KOI8R_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, # 80 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, # 90 223,224,225, 68,226,227,228,229,230,231,232,233,234,235,236,237, # a0 238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253, # b0 27, 3, 21, 28, 13, 2, 39, 19, 26, 4, 23, 11, 8, 12, 5, 1, # c0 15, 16, 9, 7, 6, 14, 24, 10, 17, 18, 20, 25, 30, 29, 22, 54, # d0 59, 37, 44, 58, 41, 48, 53, 46, 55, 42, 60, 36, 49, 38, 31, 34, # e0 35, 43, 45, 32, 40, 52, 56, 33, 61, 62, 51, 57, 47, 63, 50, 70, # f0 ) win1251_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246, 68,247,248,249,250,251,252,253, 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, ) latin5_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, ) macCyrillic_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 239,240,241,242,243,244,245,246,247,248,249,250,251,252, 68, 16, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27,255, ) IBM855_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 191,192,193,194, 68,195,196,197,198,199,200,201,202,203,204,205, 206,207,208,209,210,211,212,213,214,215,216,217, 27, 59, 54, 70, 3, 37, 21, 44, 28, 58, 13, 41, 2, 48, 39, 53, 19, 46,218,219, 220,221,222,223,224, 26, 55, 4, 42,225,226,227,228, 23, 60,229, 230,231,232,233,234,235, 11, 36,236,237,238,239,240,241,242,243, 8, 49, 12, 38, 5, 31, 1, 34, 15,244,245,246,247, 35, 16,248, 43, 9, 45, 7, 32, 6, 40, 14, 52, 24, 56, 10, 33, 17, 61,249, 250, 18, 62, 20, 51, 25, 57, 30, 47, 29, 63, 22, 50,251,252,255, ) IBM866_CharToOrderMap = ( 255,255,255,255,255,255,255,255,255,255,254,255,255,254,255,255, # 00 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, # 10 253,253,253,253,253,253,253,253,253,253,253,253,253,253,253,253, # 20 252,252,252,252,252,252,252,252,252,252,253,253,253,253,253,253, # 30 253,142,143,144,145,146,147,148,149,150,151,152, 74,153, 75,154, # 40 155,156,157,158,159,160,161,162,163,164,165,253,253,253,253,253, # 50 253, 71,172, 66,173, 65,174, 76,175, 64,176,177, 77, 72,178, 69, # 60 67,179, 78, 73,180,181, 79,182,183,184,185,253,253,253,253,253, # 70 37, 44, 33, 46, 41, 48, 56, 51, 42, 60, 36, 49, 38, 31, 34, 35, 45, 32, 40, 52, 53, 55, 58, 50, 57, 63, 70, 62, 61, 47, 59, 43, 3, 21, 10, 19, 13, 2, 24, 20, 4, 23, 11, 8, 12, 5, 1, 15, 191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206, 207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222, 223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238, 9, 7, 6, 14, 39, 26, 28, 22, 25, 29, 54, 18, 17, 30, 27, 16, 239, 68,240,241,242,243,244,245,246,247,248,249,250,251,252,255, ) # Model Table: # total sequences: 100% # first 512 sequences: 97.6601% # first 1024 sequences: 2.3389% # rest sequences: 0.1237% # negative sequences: 0.0009% RussianLangModel = ( 0,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,1,3,3,3,2,3,2,3,3, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,0,3,2,2,2,2,2,0,0,2, 3,3,3,2,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,2,3,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,2,2,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,2,3,3,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, 0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,3,3,0,0,3,3,3,3,3,3,3,3,3,3,3,2,1, 0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,2,2,2,3,1,3,3,1,3,3,3,3,2,2,3,0,2,2,2,3,3,2,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,3,3,3,2,2,3,2,3,3,3,2,1,2,2,0,1,2,2,2,2,2,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,3,0,2,2,3,3,2,1,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,1,2,3,2,2,3,2,3,3,3,3,2,2,3,0,3,2,2,3,1,1,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,2,2,3,3,3,3,3,2,3,3,3,3,2,2,2,0,3,3,3,2,2,2,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,2,3,2,3,3,3,3,3,3,2,3,2,2,0,1,3,2,1,2,2,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,2,1,1,3,0,1,1,1,1,2,1,1,0,2,2,2,1,2,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,2,2,2,2,1,3,2,3,2,3,2,1,2,2,0,1,1,2,1,2,1,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,3,3,3,3,3,3,2,2,3,2,3,3,3,2,2,2,2,0,2,2,2,2,3,1,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,2,3,2,2,3,3,3,3,3,3,3,3,3,1,3,2,0,0,3,3,3,3,2,3,3,3,3,2,3,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,3,2,2,3,3,0,2,1,0,3,2,3,2,3,0,0,1,2,0,0,1,0,1,2,1,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,0,3,0,2,3,3,3,3,2,3,3,3,3,1,2,2,0,0,2,3,2,2,2,3,2,3,2,2,3,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,0,2,3,2,3,0,1,2,3,3,2,0,2,3,0,0,2,3,2,2,0,1,3,1,3,2,2,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,1,3,0,2,3,3,3,3,3,3,3,3,2,1,3,2,0,0,2,2,3,3,3,2,3,3,0,2,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,2,3,3,2,2,2,3,3,0,0,1,1,1,1,1,2,0,0,1,1,1,1,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,2,3,3,3,3,3,3,3,0,3,2,3,3,2,3,2,0,2,1,0,1,1,0,1,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,3,2,3,3,3,2,2,2,2,3,1,3,2,3,1,1,2,1,0,2,2,2,2,1,3,1,0, 0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0, 2,2,3,3,3,3,3,1,2,2,1,3,1,0,3,0,0,3,0,0,0,1,1,0,1,2,1,0,0,0,0,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,2,1,1,3,3,3,2,2,1,2,2,3,1,1,2,0,0,2,2,1,3,0,0,2,1,1,2,1,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,2,3,3,3,3,1,2,2,2,1,2,1,3,3,1,1,2,1,2,1,2,2,0,2,0,0,1,1,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,3,2,1,3,2,2,3,2,0,3,2,0,3,0,1,0,1,1,0,0,1,1,1,1,0,1,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,2,3,3,3,2,2,2,3,3,1,2,1,2,1,0,1,0,1,1,0,1,0,0,2,1,1,1,0,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0, 3,1,1,2,1,2,3,3,2,2,1,2,2,3,0,2,1,0,0,2,2,3,2,1,2,2,2,2,2,3,1,0, 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 3,3,3,3,3,1,1,0,1,1,2,2,1,1,3,0,0,1,3,1,1,1,0,0,0,1,0,1,1,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,1,3,3,3,2,0,0,0,2,1,0,1,0,2,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,0,1,0,0,2,3,2,2,2,1,2,2,2,1,2,1,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1, 1,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,3,0,0,0,0,1,0,0,0,0,3,0,1,2,1,0,0,0,0,0,0,0,1,1,0,0,1,1, 1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0, 2,2,3,2,2,2,3,1,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,0,1,0,1,1,1,0,2,1, 1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,1,0, 3,3,3,2,2,2,2,3,2,2,1,1,2,2,2,2,1,1,3,1,2,1,2,0,0,1,1,0,1,0,2,1, 1,1,1,1,1,2,1,0,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,1,1,0, 2,0,0,1,0,3,2,2,2,2,1,2,1,2,1,2,0,0,0,2,1,2,2,1,1,2,2,0,1,1,0,2, 1,1,1,1,1,0,1,1,1,2,1,1,1,2,1,0,1,2,1,1,1,1,0,1,1,1,0,0,1,0,0,1, 1,3,2,2,2,1,1,1,2,3,0,0,0,0,2,0,2,2,1,0,0,0,0,0,0,1,0,0,0,0,1,1, 1,0,1,1,0,1,0,1,1,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, 2,3,2,3,2,1,2,2,2,2,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,2,1, 1,1,2,1,0,2,0,0,1,0,1,0,0,1,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0, 3,0,0,1,0,2,2,2,3,2,2,2,2,2,2,2,0,0,0,2,1,2,1,1,1,2,2,0,0,0,1,2, 1,1,1,1,1,0,1,2,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1, 2,3,2,3,3,2,0,1,1,1,0,0,1,0,2,0,1,1,3,1,0,0,0,0,0,0,0,1,0,0,2,1, 1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,0,0,0,1,0, 2,3,3,3,3,1,2,2,2,2,0,1,1,0,2,1,1,1,2,1,0,1,1,0,0,1,0,1,0,0,2,0, 0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 2,3,3,3,2,0,0,1,1,2,2,1,0,0,2,0,1,1,3,0,0,1,0,0,0,0,0,1,0,1,2,1, 1,1,2,0,1,1,1,0,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0, 1,3,2,3,2,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,0,0,0,3,0,1,1,0,0,2,1, 1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0, 3,1,2,1,1,2,2,2,2,2,2,1,2,2,1,1,0,0,0,2,2,2,0,0,0,1,2,1,0,1,0,1, 2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,1,1,0,0,1, 3,0,0,0,0,2,0,1,1,1,1,1,1,1,0,1,0,0,0,1,1,1,0,1,0,1,1,0,0,1,0,1, 1,1,0,0,1,0,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1, 1,3,3,2,2,0,0,0,2,2,0,0,0,1,2,0,1,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1, 0,1,1,0,0,1,1,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0, 2,3,2,3,2,0,0,0,0,1,1,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1, 1,1,2,0,1,2,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,0,0,1,1,1,1,1,0,1,1,0, 1,3,2,2,2,1,0,0,2,2,1,0,1,2,2,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1, 0,0,1,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,1,0,2,3,1,2,2,2,2,2,2,1,1,0,0,0,1,0,1,0,2,1,1,1,0,0,0,0,1, 1,1,0,1,1,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0, 2,0,2,0,0,1,0,3,2,1,2,1,2,2,0,1,0,0,0,2,1,0,0,2,1,1,1,1,0,2,0,2, 2,1,1,1,1,1,1,1,1,1,1,1,1,2,1,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,0,1, 1,2,2,2,2,1,0,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,0,0,1,0,1,2,0,0,2,0, 1,0,1,1,1,2,1,0,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,0,1,0,1,1,0, 2,1,2,2,2,0,3,0,1,1,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0, 1,2,2,3,2,2,0,0,1,1,2,0,1,2,1,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1, 0,1,1,0,0,1,1,0,0,1,1,0,0,1,1,0,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,0, 2,2,1,1,2,1,2,2,2,2,2,1,2,2,0,1,0,0,0,1,2,2,2,1,2,1,1,1,1,1,2,1, 1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,0,1, 1,2,2,2,2,0,1,0,2,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0, 0,0,1,0,0,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,0,0,2,2,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1, 0,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,2,0,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,0,0,1,0,0,2,0,0,0,1, 0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0, 1,2,2,2,1,1,2,0,2,1,1,1,1,0,2,2,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1, 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0, 1,0,2,1,2,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0, 0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0, 1,0,0,0,0,2,0,1,2,1,0,1,1,1,0,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1, 0,0,0,0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1, 2,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0, 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0, 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, 1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0, 0,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0, ) Koi8rModel = { 'charToOrderMap': KOI8R_CharToOrderMap, 'precedenceMatrix': RussianLangModel, 'mTypicalPositiveRatio': 0.976601, 'keepEnglishLetter': False, 'charsetName': "KOI8-R" } Win1251CyrillicModel = { 'charToOrderMap': win1251_CharToOrderMap, 'precedenceMatrix': RussianLangModel, 'mTypicalPositiveRatio': 0.976601, 'keepEnglishLetter': False, 'charsetName': "windows-1251" } Latin5CyrillicModel = { 'charToOrderMap': latin5_CharToOrderMap, 'precedenceMatrix': RussianLangModel, 'mTypicalPositiveRatio': 0.976601, 'keepEnglishLetter': False, 'charsetName': "ISO-8859-5" } MacCyrillicModel = { 'charToOrderMap': macCyrillic_CharToOrderMap, 'precedenceMatrix': RussianLangModel, 'mTypicalPositiveRatio': 0.976601, 'keepEnglishLetter': False, 'charsetName': "MacCyrillic" }; Ibm866Model = { 'charToOrderMap': IBM866_CharToOrderMap, 'precedenceMatrix': RussianLangModel, 'mTypicalPositiveRatio': 0.976601, 'keepEnglishLetter': False, 'charsetName': "IBM866" } Ibm855Model = { 'charToOrderMap': IBM855_CharToOrderMap, 'precedenceMatrix': RussianLangModel, 'mTypicalPositiveRatio': 0.976601, 'keepEnglishLetter': False, 'charsetName': "IBM855" } # flake8: noqa PK[4  +site-packages/chardet/codingstatemachine.pynu[######################## BEGIN LICENSE BLOCK ######################## # The Original Code is mozilla.org code. # # The Initial Developer of the Original Code is # Netscape Communications Corporation. # Portions created by the Initial Developer are Copyright (C) 1998 # the Initial Developer. All Rights Reserved. # # Contributor(s): # Mark Pilgrim - port to Python # # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA ######################### END LICENSE BLOCK ######################### from .constants import eStart from .compat import wrap_ord class CodingStateMachine: def __init__(self, sm): self._mModel = sm self._mCurrentBytePos = 0 self._mCurrentCharLen = 0 self.reset() def reset(self): self._mCurrentState = eStart def next_state(self, c): # for each byte we get its class # if it is first byte, we also get byte length # PY3K: aBuf is a byte stream, so c is an int, not a byte byteCls = self._mModel['classTable'][wrap_ord(c)] if self._mCurrentState == eStart: self._mCurrentBytePos = 0 self._mCurrentCharLen = self._mModel['charLenTable'][byteCls] # from byte's class and stateTable, we get its next state curr_state = (self._mCurrentState * self._mModel['classFactor'] + byteCls) self._mCurrentState = self._mModel['stateTable'][curr_state] self._mCurrentBytePos += 1 return self._mCurrentState def get_current_charlen(self): return self._mCurrentCharLen def get_coding_state_machine(self): return self._mModel['name'] PK[_;;site-packages/easy_install.pycnu[ b-Qc@s0dZedkr,ddlmZendS(sRun the EasyInstall commandt__main__i(tmainN(t__doc__t__name__tsetuptools.command.easy_installR(((s0/usr/lib/python2.7/site-packages/easy_install.pyts PK[}ʞ-site-packages/ipaddress-1.0.16-py2.7.egg-infonu[Metadata-Version: 1.1 Name: ipaddress Version: 1.0.16 Summary: IPv4/IPv6 manipulation library Home-page: https://github.com/phihag/ipaddress Author: Philipp Hagemeister Author-email: phihag@phihag.de License: Python Software Foundation License Description: Port of the 3.3+ ipaddress module to 2.6, 2.7, 3.2 Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Natural Language :: English Classifier: License :: OSI Approved :: Python Software Foundation License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 PK[̑. <site-packages/prettytable-0.7.2-py2.7.egg-info/top_level.txtnu[prettytable PK[2Csite-packages/prettytable-0.7.2-py2.7.egg-info/dependency_links.txtnu[ PK[ ٔ:site-packages/prettytable-0.7.2-py2.7.egg-info/SOURCES.txtnu[CHANGELOG COPYING MANIFEST.in README prettytable.py prettytable_test.py setup.cfg setup.py prettytable.egg-info/PKG-INFO prettytable.egg-info/SOURCES.txt prettytable.egg-info/dependency_links.txt prettytable.egg-info/top_level.txtPK[RY7site-packages/prettytable-0.7.2-py2.7.egg-info/PKG-INFOnu[Metadata-Version: 1.1 Name: prettytable Version: 0.7.2 Summary: A simple Python library for easily displaying tabular data in a visually appealing ASCII table format Home-page: http://code.google.com/p/prettytable Author: Luke Maurits Author-email: luke@maurits.id.au License: BSD (3 clause) Description: UNKNOWN Platform: UNKNOWN Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: License :: OSI Approved :: BSD License Classifier: Topic :: Text Processing PK[){ { site-packages/pyudev/pyqt4.pyonu[ :Oc@`sdZddlmZmZmZmZddlmZmZm Z ddl m Z ddl m Z dee fdYZdS( u pyudev.pyqt4 ============ Provide :class:`~pyudev.pyqt4.QUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into the Qt event loop in applications using the PyQt4_ binding to Qt. To use this module, :mod:`PyQt4.QtCore` from PyQt4_ must be available. .. _PyQt4: http://riverbankcomputing.co.uk/software/pyqt/intro .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_import(tQSocketNotifiertQObjectt pyqtSignal(tQUDevMonitorObserverMixin(tDevicetQUDevMonitorObservercB`sYeZdZeeeZeeZeeZeeZ eeZ ddZ RS(u Observe a :class:`~pyudev.Monitor` and emit Qt signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pyqt4.QUDevMonitorObserver(monitor) >>> def device_connected(device): ... print('{0!r} added'.format(device)) >>> observer.deviceAdded.connect(device_connected) >>> monitor.start() This class is a child of :class:`~PyQt4.QtCore.QObject`. cC`s$tj|||j|tdS(u Observe the given ``monitor`` (a :class:`~pyudev.Monitor`): ``parent`` is the parent :class:`~PyQt4.QtCore.QObject` of this object. It is passed unchanged to the inherited constructor of :class:`~PyQt4.QtCore.QObject`. N(Rt__init__t_setup_notifierR(tselftmonitortparent((s0/usr/lib/python2.7/site-packages/pyudev/pyqt4.pyR GsN( t__name__t __module__t__doc__RtunicodeRt deviceEventt deviceAddedt deviceRemovedt deviceChangedt deviceMovedtNoneR (((s0/usr/lib/python2.7/site-packages/pyudev/pyqt4.pyR +s    N(Rt __future__RRRRt PyQt4.QtCoreRRRtpyudev._qt_baseRt pyudev.coreRR (((s0/usr/lib/python2.7/site-packages/pyudev/pyqt4.pyts "PK[z{e e site-packages/pyudev/pyqt4.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev.pyqt4 ============ Provide :class:`~pyudev.pyqt4.QUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into the Qt event loop in applications using the PyQt4_ binding to Qt. To use this module, :mod:`PyQt4.QtCore` from PyQt4_ must be available. .. _PyQt4: http://riverbankcomputing.co.uk/software/pyqt/intro .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) from PyQt4.QtCore import QSocketNotifier, QObject, pyqtSignal from pyudev._qt_base import QUDevMonitorObserverMixin from pyudev.core import Device class QUDevMonitorObserver(QObject, QUDevMonitorObserverMixin): """ Observe a :class:`~pyudev.Monitor` and emit Qt signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pyqt4.QUDevMonitorObserver(monitor) >>> def device_connected(device): ... print('{0!r} added'.format(device)) >>> observer.deviceAdded.connect(device_connected) >>> monitor.start() This class is a child of :class:`~PyQt4.QtCore.QObject`. """ #: emitted upon arbitrary device events deviceEvent = pyqtSignal(unicode, Device) #: emitted, if a device was added deviceAdded = pyqtSignal(Device) #: emitted, if a device was removed deviceRemoved = pyqtSignal(Device) #: emitted, if a device was changed deviceChanged = pyqtSignal(Device) #: emitted, if a device was moved deviceMoved = pyqtSignal(Device) def __init__(self, monitor, parent=None): """ Observe the given ``monitor`` (a :class:`~pyudev.Monitor`): ``parent`` is the parent :class:`~PyQt4.QtCore.QObject` of this object. It is passed unchanged to the inherited constructor of :class:`~PyQt4.QtCore.QObject`. """ QObject.__init__(self, parent) self._setup_notifier(monitor, QSocketNotifier) PK[;Hm//site-packages/pyudev/_util.pycnu[ ݹYc@`sdZddlmZmZmZmZddlZddlZddlZddl Z ej ddkrxddl Tn ddl TdZ dZdZd Zd ZejZejZd Zd ZdS( u pyudev._util ============ Internal utilities .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importNi(t*cC`s+t|ts'|jtj}n|S(u Return the given ``value`` as bytestring. If the given ``value`` is not a byte string, but a real unicode string, it is encoded with the filesystem encoding (as in :func:`sys.getfilesystemencoding()`). (t isinstancetbytestencodetsystgetfilesystemencoding(tvalue((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytensure_byte_string,scC`s+t|ts'|jtj}n|S(u Return the given ``value`` as unicode string. If the given ``value`` is not a unicode string, but a byte string, it is decoded with the filesystem encoding (as in :func:`sys.getfilesystemencoding()`). (RtunicodetdecodeRR (R ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytensure_unicode_string9scC`sEt|trt|}nt|tr1|Stt|SdS(u Return a byte string, which represents the given ``value`` in a way suitable as raw value of an udev property. If ``value`` is a boolean object, it is converted to ``'1'`` or ``'0'``, depending on whether ``value`` is ``True`` or ``False``. If ``value`` is a byte string already, it is returned unchanged. Anything else is simply converted to a unicode string, and then passed to :func:`ensure_byte_string`. N(RtbooltintRR R (R ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytproperty_value_to_bytesFs cC`s.|dkr$tdj|n|dkS(u Convert the given unicode string ``value`` to a boolean object. If ``value`` is ``'1'``, ``True`` is returned. If ``value`` is ``'0'``, ``False`` is returned. Any other value raises a :exc:`~exceptions.ValueError`. u1u0uNot a boolean value: {0!r}(u1u0(t ValueErrortformat(R ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytstring_to_bool[s cc`sIxB|rD|j|}|j|}||fV|j|}qWdS(u Iteration helper for udev list entry objects. Yield a tuple ``(name, value)``. ``name`` and ``value`` are bytestrings containing the name and the value of the list entry. The exact contents depend on the list iterated over. N(tudev_list_entry_get_nametudev_list_entry_get_valuetudev_list_entry_get_next(tlibudevtentrytnameR ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytudev_list_iteratehs   cC`sKtj|j}t|r"dSt|r2dStdj|dS(u Get the device type of a device file. ``filename`` is a string containing the path of a device file. Return ``'char'`` if ``filename`` is a character device, or ``'block'`` if ``filename`` is a block device. Raise :exc:`~exceptions.ValueError` if ``filename`` is no device file at all. Raise :exc:`~exceptions.EnvironmentError` if ``filename`` does not exist or if its metadata was inaccessible. .. versionadded:: 0.15 ucharublockunot a device file: {0!r}N(toststattst_modet_is_char_devicet_is_block_deviceRR(tfilenametmode((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytget_device_type|s   cO`sddl}xtry|||SWqtt|jfk r}t|ttfre|j}n |jd}|tjkrqnqXqWdS(u= Handle interruptions to an interruptible system call. Run an interruptible system call in a loop and retry if it raises EINTR. The signal calls that may raise EINTR prior to Python 3.5 are listed in PEP 0475. Any calls to these functions must be wrapped in eintr_retry_call in order to handle EINTR returns in older versions of Python. This function is safe to use under Python 3.5 and newer since the wrapped function will simply return without raising EINTR. This function is based on _eintr_retry_call in python's subprocess.py. iN( tselecttTruetOSErrortIOErrorterrorRterrnotargstEINTR(tfuncR*tkwargsR$tet error_code((s0/usr/lib/python2.7/site-packages/pyudev/_util.pyteintr_retry_calls    (t__doc__t __future__RRRRRRRR)t version_infotpyudev._py2utiltpyudev._py3utilR RRRRtS_ISCHRRtS_ISBLKR R#R0(((s0/usr/lib/python2.7/site-packages/pyudev/_util.pyts""           PK[1M!site-packages/pyudev/__init__.pycnu[ OOc@`szdZddlmZmZmZmZdZeee ej dZ ddgZ ddl TddlTddlTdS( u pyudev ====== A binding to libudev_. A :class:`Context` object is required for almost any functionality in pyudev. The context provides :class:`Device` enumeration with :meth:`Context.list_devices()`. Device monitoring is provided by :class:`Monitor` and :class:`MonitorObserver`. With :mod:`pyudev.pyqt4`, :mod:`pyudev.pyside`, :mod:`pyudev.glib` and :mod:`pyudev.wx` device monitoring can be integrated into the event loop of various GUI toolkits. .. _libudev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/ .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importu0.15u.uContextuDevice(t*N(t__doc__t __future__RRRRt __version__ttupletmaptinttsplitt__version_info__t__all__t pyudev.devicet pyudev.coretpyudev.monitor(((s3/usr/lib/python2.7/site-packages/pyudev/__init__.pyt%s"   PK[jP site-packages/pyudev/pyside.pycnu[ :Oc@`sdZddlmZmZmZmZddlmZmZm Z ddl m Z ddl m Z dee fdYZdS( u pyudev.pyside ============= Provide :class:`~pyudev.pyside.QUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into the Qt event loop in applications using the PySide_ binding to Qt. To use this module, :mod:`PySide.QtCore` from PySide_ must be available. .. _PySide: http://www.pyside.org .. moduleauthor:: Sebastian Wiesner .. versionadded:: 0.6 i(tprint_functiontdivisiontunicode_literalstabsolute_import(tQSocketNotifiertQObjecttSignal(tQUDevMonitorObserverMixin(tDevicetQUDevMonitorObservercB`sYeZdZeeeZeeZeeZeeZ eeZ ddZ RS(u Observe a :class:`~pyudev.Monitor` and emit Qt signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pyqt4.QUDevMonitorObserver(monitor) >>> def device_connected(device): ... print('{0!r} added'.format(device)) >>> observer.deviceAdded.connect(device_connected) >>> monitor.start() This class is a child of :class:`~PySide.QtCore.QObject`. cC`s$tj|||j|tdS(u Observe the given ``monitor`` (a :class:`~pyudev.Monitor`): ``parent`` is the parent :class:`~PySide.QtCore.QObject` of this object. It is passed unchanged to the inherited constructor of :class:`~PySide.QtCore.QObject`. N(Rt__init__t_setup_notifierR(tselftmonitortparent((s1/usr/lib/python2.7/site-packages/pyudev/pyside.pyR HsN( t__name__t __module__t__doc__RtunicodeRt deviceEventt deviceAddedt deviceRemovedt deviceChangedt deviceMovedtNoneR (((s1/usr/lib/python2.7/site-packages/pyudev/pyside.pyR ,s    N(Rt __future__RRRRt PySide.QtCoreRRRtpyudev._qt_baseRt pyudev.coreRR (((s1/usr/lib/python2.7/site-packages/pyudev/pyside.pyt s "PK[@Sff!site-packages/pyudev/_py2util.pycnu[ :Oc@`s>dZddlmZmZmZmZdgZdZdS(u pyudev._py2util =============== Internal utilities for Python 2. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importureraisecC`st|||dS(u Re-raise the given exception with ``traceback``. ``exc`` is an exception derived from :class:`~exceptions.Exception`, ``traceback`` a traceback object. N(ttype(texct traceback((s3/usr/lib/python2.7/site-packages/pyudev/_py2util.pytreraise"sN(t__doc__t __future__RRRRt__all__R(((s3/usr/lib/python2.7/site-packages/pyudev/_py2util.pyts" PK[~bWsite-packages/pyudev/device.pyonu[ ݹYc@`sfdZddlmZmZmZmZddlZddlmZm Z m Z ddl m Z ddl mZmZmZmZmZddd d d d d dgZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZde e fdYZdZdefdYZdS( u pyudev.device ============= Device class implementation of :mod:`pyudev`. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importN(tMappingt ContainertIterable(t timedelta(tensure_byte_stringtensure_unicode_stringtudev_list_iteratetstring_to_booltget_device_typeuDeviceu AttributesuTagsuDeviceNotFoundErroruDeviceNotFoundAtPathErroruDeviceNotFoundByNameErroruDeviceNotFoundByNumberErroru DeviceNotFoundInEnvironmentErrortDeviceNotFoundErrorcB`seZdZRS(u An error indicating that no :class:`Device` was found. .. versionchanged:: 0.5 Renamed from ``NoSuchDeviceError`` to its current name. (t__name__t __module__t__doc__(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR .stDeviceNotFoundAtPathErrorcB`s/eZdZdZedZdZRS(uh A :exc:`DeviceNotFoundError` indicating that no :class:`Device` was found at a given path. cC`stj||dS(N(R t__init__(tselftsys_path((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR=scC`s |jdS(u< The path that caused this error as string. i(targs(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR@scC`sdj|jS(NuNo device at {0!r}(tformatR(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__str__Gs(RRRRtpropertyRR(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR7s tDeviceNotFoundByNameErrorcB`s>eZdZdZedZedZdZRS(uj A :exc:`DeviceNotFoundError` indicating that no :class:`Device` was found with a given name. cC`stj|||dS(N(R R(Rt subsystemtsys_name((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRQscC`s |jdS(uA The subsystem that caused this error as string. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRTscC`s |jdS(u@ The sys name that caused this error as string. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRcC`s dj|S(Nu+No device {0.sys_name!r} in {0.subsystem!r}(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRbs(RRRRRRRR(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRKs  tDeviceNotFoundByNumberErrorcB`s>eZdZdZedZedZdZRS(us A :exc:`DeviceNotFoundError` indicating, that no :class:`Device` was found for a given device number. cC`stj|||dS(N(R R(Rttypetnumber((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRlscC`s |jdS(uj The device type causing this error as string. Either ``'char'`` or ``'block'``. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_typeoscC`s |jdS(uB The device number causing this error as integer. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_numberwscC`s dj|S(Nu7No {0.device_type} device with number {0.device_number}(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR~s(RRRRRRR R(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRfs  t DeviceNotFoundInEnvironmentErrorcB`seZdZdZRS(u A :exc:`DeviceNotFoundError` indicating, that no :class:`Device` could be constructed from the process environment. cC`sdS(NuNo device found in environment((R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRs(RRRR(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR!stDevicecB`seZdZedZedZedZedZedZedZ dZ dZ d Z e d Ze d Zd(d Zd Ze dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*d&Z+d'Z,RS()u A single device with attached attributes and properties. This class subclasses the ``Mapping`` ABC, providing a read-only dictionary mapping property names to the corresponding values. Therefore all well-known dicitionary methods and operators (e.g. ``.keys()``, ``.items()``, ``in``) are available to access device properties. Aside of the properties, a device also has a set of udev-specific attributes like the path inside ``sysfs``. :class:`Device` objects compare equal and unequal to other devices and to strings (based on :attr:`device_path`). However, there is no ordering on :class:`Device` objects, and the corresponding operators ``>``, ``<``, ``<=`` and ``>=`` raise :exc:`~exceptions.TypeError`. .. warning:: Do **never** use object identity (``is`` operator) to compare :class:`Device` objects. :mod:`pyudev` may create multiple :class:`Device` objects for the same device. Instead simply compare devices by value using ``==`` or ``!=``. :class:`Device` objects are hashable and can therefore be used as keys in dictionaries and sets. They can also be given directly as ``udev_device *`` to functions wrapped through :mod:`ctypes`. cC`sI|j|js9tjj|j|jtj}n|j||S(u Create a device from a device ``path``. The ``path`` may or may not start with the ``sysfs`` mount point: >>> context = pyudev.Context() >>> Device.from_path(context, '/devices/platform') Device(u'/sys/devices/platform') >>> Device.from_path(context, '/sys/devices/platform') Device(u'/sys/devices/platform') ``context`` is the :class:`Context` in which to search the device. ``path`` is a device path as unicode or byte string. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundAtPathError`, if no device was found for ``path``. .. versionadded:: 0.4 (t startswithRtostpathtjointlstriptsept from_sys_path(tclstcontextR%((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt from_paths'cC`s=|jj|t|}|s0t|n|||S(u` Create a new device from a given ``sys_path``: >>> context = pyudev.Context() >>> Device.from_path(context, '/sys/devices/platform') Device(u'/sys/devices/platform') ``context`` is the :class:`Context` in which to search the device. ``sys_path`` is a unicode or byte string containing the path of the device inside ``sysfs`` with the mount point included. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundAtPathError`, if no device was found for ``sys_path``. .. versionchanged:: 0.4 Raise :exc:`NoSuchDeviceError` instead of returning ``None``, if no device was found for ``sys_path`` .. versionchanged:: 0.5 Raise :exc:`DeviceNotFoundAtPathError` instead of :exc:`NoSuchDeviceError` (t_libudevtudev_device_new_from_syspathRR(R*R+Rtdevice((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR)s  cC`sI|jj|t|t|}|s<t||n|||S(u Create a new device from a given ``subsystem`` and a given ``sys_name``: >>> context = pyudev.Context() >>> sda = pyudev.Device.from_name(context, 'block', 'sda') >>> sda Device(u'/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda') >>> sda == pyudev.Device.from_path(context, '/block/sda') ``context`` is the :class:`Context` in which to search the device. ``subsystem`` and ``sys_name`` are byte or unicode strings, which denote the subsystem and the name of the device to create. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundByNameError`, if no device was found with the given name. .. versionadded:: 0.5 (R-t&udev_device_new_from_subsystem_sysnameRR(R*R+RRR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt from_names   cC`sk|dkr$tdj|n|jj|t|d|}|s^t||n|||S(u Create a new device from a device ``number`` with the given device ``type``: >>> import os >>> ctx = Context() >>> major, minor = 8, 0 >>> device = Device.from_device_number(context, 'block', ... os.makedev(major, minor)) >>> device Device(u'/sys/devices/pci0000:00/0000:00:11.0/host0/target0:0:0/0:0:0:0/block/sda') >>> os.major(device.device_number), os.minor(device.device_number) (8, 0) Use :func:`os.makedev` to construct a device number from a major and a minor device number, as shown in the example above. .. note:: Device numbers are not unique across different device types. Passing a correct number with a wrong type may silently yield a wrong device object, so make sure to pass the correct device type. ``context`` is the :class:`Context`, in which to search the device. ``type`` is either ``'char'`` or ``'block'``, according to whether the device is a character or block device. ``number`` is the device number as integer. Return a :class:`Device` object for the device with the given device ``number``. Raise :exc:`DeviceNotFoundByNumberError`, if no device was found with the given device type and number. Raise :exc:`~exceptions.ValueError`, if ``type`` is any other string than ``'char'`` or ``'block'``. .. versionadded:: 0.11 ucharublocku6Invalid type: {0!r}. Must be one of "char" or "block".i(ucharublock(t ValueErrorRR-tudev_device_new_from_devnumRR(R*R+RRR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pytfrom_device_numbers&   cC`s1t|}tj|j}|j|||S(u Create a new device from the given device file: >>> context = Context() >>> device = Device.from_device_file(context, '/dev/sda') >>> device Device(u'/sys/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0/2:0:0:0/block/sda') >>> device.device_node u'/dev/sda' .. warning:: Though the example seems to suggest that ``device.device_node == filename`` holds with ``device = Device.from_device_file(context, filename)``, this is only true in a majority of cases. There *can* be devices, for which this relation is actually false! Thus, do *not* expect :attr:`~Device.device_node` to be equal to the given ``filename`` for the returned :class:`Device`. Especially, use :attr:`~Device.device_node` if you need the device file of a :class:`Device` created with this method afterwards. ``context`` is the :class:`Context` in which to search the device. ``filename`` is a string containing the path of a device file. Return a :class:`Device` representing the given device file. Raise :exc:`~exceptions.ValueError` if ``filename`` is no device file at all. Raise :exc:`~exceptions.EnvironmentError` if ``filename`` does not exist or if its metadata was inaccessible. .. versionadded:: 0.15 (R R$tstattst_rdevR4(R*R+tfilenameRR ((s1/usr/lib/python2.7/site-packages/pyudev/device.pytfrom_device_file/s! cC`s1|jj|}|s$tn|||S(u Create a new device from the process environment (as in :data:`os.environ`). This only works reliable, if the current process is called from an udev rule, and is usually used for tools executed from ``IMPORT=`` rules. Use this method to create device objects in Python scripts called from udev rules. ``context`` is the library :class:`Context`. Return a :class:`Device` object constructed from the environment. Raise :exc:`DeviceNotFoundInEnvironmentError`, if no device could be created from the environment. .. udevversion:: 152 .. versionadded:: 0.6 (R-t udev_device_new_from_environmentR!(R*R+R/((s1/usr/lib/python2.7/site-packages/pyudev/device.pytfrom_environmentUs cC`s"||_||_|j|_dS(N(R+t_as_parameter_R-(RR+t_device((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRos  cC`s|jj|dS(N(R-tudev_device_unref(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__del__tscC`s dj|S(NuDevice({0.sys_path!r})(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__repr__wscC`s8|jj|}|sdSt|j|jj|S(u_ The parent :class:`Device` or ``None``, if there is no parent device. N(R-tudev_device_get_parenttNoneR"R+tudev_device_ref(Rtparent((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRCzscc`s;x4|jjj|D]}||kr|VqqWdS(u Yield all direct children of this device. .. note:: As the underlying library does not provide any means to directly query the children of a device, this property performs a linear search through all devices. Return an iterable yielding a :class:`Device` object for each direct child of this device. .. udevversion:: 172 .. versionchanged:: 0.13 Requires udev version 172 now. N(R+t list_devicest match_parent(RR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pytchildrens cC`set|}|dk r't|}n|jj|||}|sIdSt|j|jj|S(u Find the parent device with the given ``subsystem`` and ``device_type``. ``subsystem`` is a byte or unicode string containing the name of the subsystem, in which to search for the parent. ``device_type`` is a byte or unicode string holding the expected device type of the parent. It can be ``None`` (the default), which means, that no specific device type is expected. Return a parent :class:`Device` within the given ``subsystem`` and – if ``device_type`` is not ``None`` – with the given ``device_type``, or ``None``, if this device has no parent device matching these constraints. .. versionadded:: 0.9 N(RRAR-t-udev_device_get_parent_with_subsystem_devtypeR"R+RB(RRRRC((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt find_parents   cc`s(|j}x|r#|V|j}q WdS(u Traverse all parent devices of this device from bottom to top. Return an iterable yielding all parent devices as :class:`Device` objects, *not* including the current device. The last yielded :class:`Device` is the top of the device hierarchy. N(RC(RRC((s1/usr/lib/python2.7/site-packages/pyudev/device.pyttraverses  cC`st|jj|S(uz Absolute path of this device in ``sysfs`` including the ``sysfs`` mount point as unicode string. (R R-tudev_device_get_syspath(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRscC`st|jj|S(u Kernel device path as unicode string. This path uniquely identifies a single device. Unlike :attr:`sys_path`, this path does not contain the ``sysfs`` mount point. However, the path is absolute and starts with a slash ``'/'``. (R R-tudev_device_get_devpath(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_paths cC`st|jj|S(uQ Name of the subsystem this device is part of as unicode string. (R R-tudev_device_get_subsystem(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRscC`st|jj|S(uF Device file name inside ``sysfs`` as unicode string. (R R-tudev_device_get_sysname(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRscC`s,|jj|}|dk r(t|SdS(uO The trailing number of the :attr:`sys_name` as unicode string, or ``None``, if the device has no trailing number in its name. .. note:: The number is returned as unicode string to preserve the exact format of the number, especially any leading zeros: >>> device = pyudev.Device.from_path(ctx, '/sys/devices/LNXSYSTM:00') >>> device.sys_number u'00' To work with numbers, explicitly convert them to ints: >>> int(device.sys_number) 0 .. versionadded:: 0.11 N(R-tudev_device_get_sysnumRAR (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt sys_numbers cC`s,|jj|}|dk r(t|SdS(u Device type as unicode string, or ``None``, if the device type is unknown. >>> context = Context() >>> for device in context.list_devices(subsystem='net'): ... '{0} - {1}'.format(device.sys_name, device.device_type or 'ethernet') ... u'eth0 - ethernet' u'wlan0 - wlan' u'lo - ethernet' u'vboxnet0 - ethernet' .. versionadded:: 0.10 N(R-tudev_device_get_devtypeRAR (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRs cC`s&|jj|}|r"t|SdS(u The driver name as unicode string, or ``None``, if there is no driver for this device. .. versionadded:: 0.5 N(R-tudev_device_get_driverR (Rtdriver((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRSscC`s&|jj|}|r"t|SdS(u Absolute path to the device node of this device as unicode string or ``None``, if this device doesn't have a device node. The path includes the device directory (see :attr:`Context.device_path`). This path always points to the actual device node associated with this device, and never to any symbolic links to this device node. See :attr:`device_links` to get a list of symbolic links to this device node. .. warning:: For devices created with :meth:`from_device_file()`, the value of this property is not necessary equal to the ``filename`` given to :meth:`from_device_file()`. N(R-tudev_device_get_devnodeR (Rtnode((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_node(scC`s|jj|S(u The device number of the associated device as integer, or ``0``, if no device number is associated. Use :func:`os.major` and :func:`os.minor` to decompose the device number into its major and minor number: >>> context = Context() >>> sda = Device.from_name(context, 'block', 'sda') >>> sda.device_number 2048L >>> (os.major(sda.device_number), os.minor(sda.device_number)) (8, 0) For devices with an associated :attr:`device_node`, this is the same as the ``st_rdev`` field of the stat result of the :attr:`device_node`: >>> os.stat(sda.device_node).st_rdev 2048 .. versionadded:: 0.11 (R-tudev_device_get_devnum(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR >scC`st|jj|S(ui ``True``, if the device is initialized, ``False`` otherwise. A device is initialized, if udev has already handled this device and has set up device node permissions and context, or renamed a network device. Consequently, this property is only implemented for devices with a device node or for network devices. On all other devices this property is always ``True``. It is *not* recommended, that you use uninitialized devices. .. seealso:: :attr:`time_since_initialized` .. udevversion:: 165 .. versionadded:: 0.8 (tboolR-tudev_device_get_is_initialized(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pytis_initializedXscC`s|jj|}td|S(u The time elapsed since initialization as :class:`~datetime.timedelta`. This property is only implemented on devices, which need to store properties in the udev database. On all other devices this property is simply zero :class:`~datetime.timedelta`. .. seealso:: :attr:`is_initialized` .. udevversion:: 165 .. versionadded:: 0.8 t microseconds(R-t&udev_device_get_usec_since_initializedR(RR[((s1/usr/lib/python2.7/site-packages/pyudev/device.pyttime_since_initializedos  cc`sD|jj|}x+t|j|D]\}}t|Vq%WdS(u An iterator, which yields the absolute paths (including the device directory, see :attr:`Context.device_path`) of all symbolic links pointing to the :attr:`device_node` of this device. The paths are unicode strings. UDev can create symlinks to the original device node (see :attr:`device_node`) inside the device directory. This is often used to assign a constant, fixed device node to devices like removeable media, which technically do not have a constant device node, or to map a single device into multiple device hierarchies. The property provides access to all such symbolic links, which were created by UDev for this device. N(R-t#udev_device_get_devlinks_list_entryR R (Rtdevlinkstnamet_((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_linksscC`s t|S(uT The system attributes of this device as read-only :class:`Attributes` mapping. System attributes are basically normal files inside the the device directory. These files contain all sorts of information about the device, which may not be reflected by properties. These attributes are commonly used for matching in udev rules, and can be printed using ``udevadm info --attribute-walk``. The values of these attributes are not always proper strings, and can contain arbitrary bytes. .. versionadded:: 0.5 (t Attributes(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt attributesscC`s t|S(u A :class:`Tags` object representing the tags attached to this device. The :class:`Tags` object supports a test for a single tag as well as iteration over all tags: >>> 'systemd' in device.tags True >>> list(device.tags) [u'systemd', u'seat'] Tags are arbitrary classifiers that can be attached to devices by udev scripts and daemons. For instance, systemd_ uses tags for multi-seat_ support. .. _systemd: http://freedesktop.org/wiki/Software/systemd .. _multi-seat: http://www.freedesktop.org/wiki/Software/systemd/multiseat .. udevversion:: 154 .. versionadded:: 0.6 .. versionchanged:: 0.13 Return a :class:`Tags` object now. (tTags(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyttagsscc`sD|jj|}x+t|j|D]\}}t|Vq%WdS(u Iterate over the names of all properties defined for this device. Return a generator yielding the names of all properties of this device as unicode strings. N(R-t%udev_device_get_properties_list_entryR R (Rt propertiesR`Ra((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__iter__scC`s2|jj|}tdt|j|DS(uU Return the amount of properties defined for this device as integer. cs`s|] }dVqdS(iN((t.0Ra((s1/usr/lib/python2.7/site-packages/pyudev/device.pys s(R-RgtsumR (RRh((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__len__scC`s@|jj|t|}|dkr6t|nt|S(uA Get the given ``property`` from this device. ``property`` is a unicode or byte string containing the name of the property. Return the property value as unicode string, or raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device. N(R-tudev_device_get_property_valueRRAtKeyErrorR (RRtvalue((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt __getitem__s  cC`st||S(u Get the given ``property`` from this device as integer. ``property`` is a unicode or byte string containing the name of the property. Return the property value as integer. Raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device, or a :exc:`~exceptions.ValueError`, if the property value cannot be converted to an integer. (tint(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pytasints cC`st||S(u Get the given ``property`` from this device as boolean. A boolean property has either a value of ``'1'`` or of ``'0'``, where ``'1'`` stands for ``True``, and ``'0'`` for ``False``. Any other value causes a :exc:`~exceptions.ValueError` to be raised. ``property`` is a unicode or byte string containing the name of the property. Return ``True``, if the property value is ``'1'`` and ``False``, if the property value is ``'0'``. Any other value raises a :exc:`~exceptions.ValueError`. Raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device. (R (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pytasboolscC`s t|jS(N(thashRL(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__hash__ scC`s0t|tr|j|jkS|j|kSdS(N(t isinstanceR"RL(Rtother((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__eq__scC`s0t|tr|j|jkS|j|kSdS(N(RvR"RL(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__ne__scC`stddS(NuDevice not orderable(t TypeError(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__gt__scC`stddS(NuDevice not orderable(Rz(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__lt__scC`stddS(NuDevice not orderable(Rz(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__le__"scC`stddS(NuDevice not orderable(Rz(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__ge__%sN(-RRRt classmethodR,R)R1R4R8R:RR>R?RRCRFRARHRIRRLRRRPRRSRVR RZR]RbRdRfRiRlRpRrRsRuRxRyR{R|R}R~(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR"sP/&                   RecB`sAeZdZdZdZedZdZdZRS(uk A iterable over :class:`Device` tags. Subclasses the ``Container`` and the ``Iterable`` ABC. cC`s ||_dS(N(R/(RR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR0sc`sRt|jdr4t|jj|jtStfd|DSdS(Nuudev_device_has_tagc3`s|]}|kVqdS(N((Rjtt(ttag(s1/usr/lib/python2.7/site-packages/pyudev/device.pys 8s(thasattrR-RXtudev_device_has_tagR/Rtany(RR((Rs1/usr/lib/python2.7/site-packages/pyudev/device.pyt_has_tag3s cC`s |jjS(N(R/R-(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR-:scC`s |j|S(u Check for existence of ``tag``. ``tag`` is a tag as unicode string. Return ``True``, if ``tag`` is attached to the device, ``False`` otherwise. (R(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt __contains__>s cc`sG|jj|j}x+t|j|D]\}}t|Vq(WdS(uS Iterate over all tags. Yield each tag as unicode string. N(R-tudev_device_get_tags_list_entryR/R R (RRfRRa((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRiIs( RRRRRRR-RRi(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRe)s    cC`s>tjj|}|jdp<|dkp<tjj| S(uy Check, if ``filepath`` points to a valid udev attribute filename. Implementation is stolen from udev source code, ``print_all_attributes`` in ``udev/udevadm-info.c``. It excludes hidden files (starting with a dot), the special files ``dev`` and ``uevent`` and links. Return ``True``, if ``filepath`` refers to an attribute, ``False`` otherwise. u.udevuuevent(udevuuevent(R$R%tbasenameR#tislink(tfilepathR7((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt_is_attribute_fileTs  RccB`s_eZdZdZdZdZdZdZdZdZ dZ d Z RS( u A mapping which holds udev attributes for :class:`Device` objects. This class subclasses the ``Mapping`` ABC, providing a read-only dictionary mapping attribute names to the corresponding values. Therefore all well-known dicitionary methods and operators (e.g. ``.keys()``, ``.items()``, ``in``) are available to access device attributes. .. versionadded:: 0.5 cC`s||_|j|_dS(N(R/R-(RR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRrs cc`st|jdrX|jj|j}x}t|j|D]\}}t|Vq:WnO|jj}x@tj|D]/}tj j ||}t |rt|VqtqtWdS(Nu"udev_device_get_sysattr_list_entry( RR-t"udev_device_get_sysattr_list_entryR/R R RR$tlistdirR%R&R(Rtattrst attributeRaRR7R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt_get_attributesvs    cC`std|jDS(u: Return the amount of attributes defined. cs`s|] }dVqdS(iN((RjRa((s1/usr/lib/python2.7/site-packages/pyudev/device.pys s(RkR(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRlscC`s |jS(ul Iterate over all attributes defined. Yield each attribute name as unicode string. (R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRiscC`s(|jj|jt|}|dk S(N(R-tudev_device_get_sysattr_valueR/RRA(RRRo((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRs cC`s=|jj|jt|}|dkr9t|n|S(uO Get the given system ``attribute`` for the device. ``attribute`` is a unicode or byte string containing the name of the system attribute. Return the attribute value as byte string, or raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device. N(R-RR/RRARn(RRRo((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRps  cC`st||S(u] Get the given ``atribute`` for the device as unicode string. Depending on the content of the attribute, this may or may not work. Be prepared to catch :exc:`~exceptions.UnicodeDecodeError`. ``attribute`` is a unicode or byte string containing the name of the attribute. Return the attribute value as byte string. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device, or :exc:`~exceptions.UnicodeDecodeError`, if the content of the attribute cannot be decoded into a unicode string. (R (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pytasstringscC`st|j|S(u Get the given ``attribute`` as integer. ``attribute`` is a unicode or byte string containing the name of the attribute. Return the attribute value as integer. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device, or a :exc:`~exceptions.ValueError`, if the attribute value cannot be converted to an integer. (RqR(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRrs cC`st|j|S(u Get the given ``attribute`` from this device as boolean. A boolean attribute has either a value of ``'1'`` or of ``'0'``, where ``'1'`` stands for ``True``, and ``'0'`` for ``False``. Any other value causes a :exc:`~exceptions.ValueError` to be raised. ``attribute`` is a unicode or byte string containing the name of the attribute. Return ``True``, if the attribute value is ``'1'`` and ``False``, if the attribute value is ``'0'``. Any other value raises a :exc:`~exceptions.ValueError`. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device. (R R(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRss( RRRRRRlRiRRpRRrRs(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRces        (Rt __future__RRRRR$t collectionsRRRtdatetimeRt pyudev._utilRR R R R t__all__t LookupErrorR RRRR!R"ReRRc(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyts(" (    + PK[E!site-packages/pyudev/_py3util.pyonu[ :Oc@sdZdZdS(s pyudev._py3util =============== Internal utilities for Python 3. .. moduleauthor:: Sebastian Wiesner cCs|j|dS(s Re-raise the given exception with ``traceback``. ``exc`` is an exception derived from :class:`~exceptions.Exception`, ``traceback`` a traceback object. N(twith_traceback(texct traceback((s3/usr/lib/python2.7/site-packages/pyudev/_py3util.pytreraisesN(t__doc__R(((s3/usr/lib/python2.7/site-packages/pyudev/_py3util.pytsPK[){ { site-packages/pyudev/pyqt4.pycnu[ :Oc@`sdZddlmZmZmZmZddlmZmZm Z ddl m Z ddl m Z dee fdYZdS( u pyudev.pyqt4 ============ Provide :class:`~pyudev.pyqt4.QUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into the Qt event loop in applications using the PyQt4_ binding to Qt. To use this module, :mod:`PyQt4.QtCore` from PyQt4_ must be available. .. _PyQt4: http://riverbankcomputing.co.uk/software/pyqt/intro .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_import(tQSocketNotifiertQObjectt pyqtSignal(tQUDevMonitorObserverMixin(tDevicetQUDevMonitorObservercB`sYeZdZeeeZeeZeeZeeZ eeZ ddZ RS(u Observe a :class:`~pyudev.Monitor` and emit Qt signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pyqt4.QUDevMonitorObserver(monitor) >>> def device_connected(device): ... print('{0!r} added'.format(device)) >>> observer.deviceAdded.connect(device_connected) >>> monitor.start() This class is a child of :class:`~PyQt4.QtCore.QObject`. cC`s$tj|||j|tdS(u Observe the given ``monitor`` (a :class:`~pyudev.Monitor`): ``parent`` is the parent :class:`~PyQt4.QtCore.QObject` of this object. It is passed unchanged to the inherited constructor of :class:`~PyQt4.QtCore.QObject`. N(Rt__init__t_setup_notifierR(tselftmonitortparent((s0/usr/lib/python2.7/site-packages/pyudev/pyqt4.pyR GsN( t__name__t __module__t__doc__RtunicodeRt deviceEventt deviceAddedt deviceRemovedt deviceChangedt deviceMovedtNoneR (((s0/usr/lib/python2.7/site-packages/pyudev/pyqt4.pyR +s    N(Rt __future__RRRRt PyQt4.QtCoreRRRtpyudev._qt_baseRt pyudev.coreRR (((s0/usr/lib/python2.7/site-packages/pyudev/pyqt4.pyts "PK[qFF site-packages/pyudev/_py2util.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2011 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev._py2util =============== Internal utilities for Python 2. .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) __all__ = ['reraise'] def reraise(exc, traceback): """ Re-raise the given exception with ``traceback``. ``exc`` is an exception derived from :class:`~exceptions.Exception`, ``traceback`` a traceback object. """ raise type(exc), exc, traceback PK[ea~~site-packages/pyudev/_util.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011, 2012 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev._util ============ Internal utilities .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) import os import sys import stat import errno if sys.version_info[0] == 2: from pyudev._py2util import * else: from pyudev._py3util import * def ensure_byte_string(value): """ Return the given ``value`` as bytestring. If the given ``value`` is not a byte string, but a real unicode string, it is encoded with the filesystem encoding (as in :func:`sys.getfilesystemencoding()`). """ if not isinstance(value, bytes): value = value.encode(sys.getfilesystemencoding()) return value def ensure_unicode_string(value): """ Return the given ``value`` as unicode string. If the given ``value`` is not a unicode string, but a byte string, it is decoded with the filesystem encoding (as in :func:`sys.getfilesystemencoding()`). """ if not isinstance(value, unicode): value = value.decode(sys.getfilesystemencoding()) return value def property_value_to_bytes(value): """ Return a byte string, which represents the given ``value`` in a way suitable as raw value of an udev property. If ``value`` is a boolean object, it is converted to ``'1'`` or ``'0'``, depending on whether ``value`` is ``True`` or ``False``. If ``value`` is a byte string already, it is returned unchanged. Anything else is simply converted to a unicode string, and then passed to :func:`ensure_byte_string`. """ # udev represents boolean values as 1 or 0, therefore an explicit # conversion to int is required for boolean values if isinstance(value, bool): value = int(value) if isinstance(value, bytes): return value else: return ensure_byte_string(unicode(value)) def string_to_bool(value): """ Convert the given unicode string ``value`` to a boolean object. If ``value`` is ``'1'``, ``True`` is returned. If ``value`` is ``'0'``, ``False`` is returned. Any other value raises a :exc:`~exceptions.ValueError`. """ if value not in ('1', '0'): raise ValueError('Not a boolean value: {0!r}'.format(value)) return value == '1' def udev_list_iterate(libudev, entry): """ Iteration helper for udev list entry objects. Yield a tuple ``(name, value)``. ``name`` and ``value`` are bytestrings containing the name and the value of the list entry. The exact contents depend on the list iterated over. """ while entry: name = libudev.udev_list_entry_get_name(entry) value = libudev.udev_list_entry_get_value(entry) yield (name, value) entry = libudev.udev_list_entry_get_next(entry) # for the sake of readability _is_char_device = stat.S_ISCHR _is_block_device = stat.S_ISBLK def get_device_type(filename): """ Get the device type of a device file. ``filename`` is a string containing the path of a device file. Return ``'char'`` if ``filename`` is a character device, or ``'block'`` if ``filename`` is a block device. Raise :exc:`~exceptions.ValueError` if ``filename`` is no device file at all. Raise :exc:`~exceptions.EnvironmentError` if ``filename`` does not exist or if its metadata was inaccessible. .. versionadded:: 0.15 """ mode = os.stat(filename).st_mode if _is_char_device(mode): return 'char' elif _is_block_device(mode): return 'block' else: raise ValueError('not a device file: {0!r}'.format(filename)) def eintr_retry_call(func, *args, **kwargs): """ Handle interruptions to an interruptible system call. Run an interruptible system call in a loop and retry if it raises EINTR. The signal calls that may raise EINTR prior to Python 3.5 are listed in PEP 0475. Any calls to these functions must be wrapped in eintr_retry_call in order to handle EINTR returns in older versions of Python. This function is safe to use under Python 3.5 and newer since the wrapped function will simply return without raising EINTR. This function is based on _eintr_retry_call in python's subprocess.py. """ # select.error inherits from Exception instead of OSError in Python 2 import select while True: try: return func(*args, **kwargs) except (OSError, IOError, select.error) as e: # If this is not an IOError or OSError, it's the old select.error # type, which means that the errno is only accessible via subscript if isinstance(e, (OSError, IOError)): error_code = e.errno else: error_code = e.args[0] if error_code == errno.EINTR: continue raise PK[mשׂ;;site-packages/pyudev/core.pycnu[ ݹYc@`sdZddlmZmZmZmZyddlmZWn!ek r_ddl mZnXddl m Z ddl m Z ddlmZmZmZmZddd gZd Zd efd YZd efdYZdS(u pyudev.core =========== Core types and functions of :mod:`pyudev`. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_import(t check_output(tDevice(tload_udev_library(tensure_unicode_stringtensure_byte_stringtudev_list_iteratetproperty_value_to_bytesu udev_versionuContextu EnumeratorcC`s(ttddg}t|jS(ul Get the version of the underlying udev library. udev doesn't use a standard major-minor versioning scheme, but instead labels releases with a single consecutive number. Consequently, the version number returned by this function is a single integer, and not a tuple (like for instance the interpreter version in :data:`sys.version_info`). As libudev itself does not provide a function to query the version number, this function calls the ``udevadm`` utilitiy, so be prepared to catch :exc:`~exceptions.EnvironmentError` and :exc:`~subprocess.CalledProcessError` if you call this function. Return the version number as single integer. Raise :exc:`~exceptions.ValueError`, if the version number retrieved from udev could not be converted to an integer. Raise :exc:`~exceptions.EnvironmentError`, if ``udevadm`` was not found, or could not be executed. Raise :exc:`subprocess.CalledProcessError`, if ``udevadm`` returned a non-zero exit code. On Python 2.7 or newer, the ``output`` attribute of this exception is correctly set. .. versionadded:: 0.8 uudevadmu --version(RRtinttstrip(toutput((s//usr/lib/python2.7/site-packages/pyudev/core.pyt udev_version.stContextcB`sweZdZdZdZedZedZedZedZ e j dZ dZ RS( u The udev context. This is *the* central object to access udev. An instance of this class must be created before anything else can be done. It holds the udev configuration and provides the interface to list devices (see :meth:`list_devices`). Instances of this class can directly be given as ``udev *`` to functions wrapped through :mod:`ctypes`. cC`s"t|_|jj|_dS(u' Create a new context. N(Rt_libudevtudev_newt_as_parameter_(tself((s//usr/lib/python2.7/site-packages/pyudev/core.pyt__init__Xs cC`s|jj|dS(N(Rt udev_unref(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyt__del___scC`st|jj|S(u The ``sysfs`` mount point defaulting to ``/sys'`` as unicode string. The mount point can be overwritten using the environment variable :envvar:`SYSFS_PATH`. Use this for testing purposes. (RRtudev_get_sys_path(R((s//usr/lib/python2.7/site-packages/pyudev/core.pytsys_pathbscC`st|jj|S(u The device directory path defaulting to ``/dev`` as unicode string. This can be overridden in the udev configuration. (RRtudev_get_dev_path(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyt device_pathlscC`st|jj|S(u The run runtime directory path defaulting to ``/run`` as unicode string. .. udevversion:: 167 .. versionadded:: 0.10 (RRtudev_get_run_path(R((s//usr/lib/python2.7/site-packages/pyudev/core.pytrun_pathus cC`s|jj|S(u  The logging priority of the interal logging facitility of udev as integer with a standard :mod:`syslog` priority. Assign to this property to change the logging priority. UDev uses the standard :mod:`syslog` priorities. Constants for these priorities are defined in the :mod:`syslog` module in the standard library: >>> import syslog >>> context = pyudev.Context() >>> context.log_priority = syslog.LOG_DEBUG .. versionadded:: 0.9 (Rtudev_get_log_priority(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyt log_priorityscC`s|jj||dS(N(Rtudev_set_log_priority(Rtvalue((s//usr/lib/python2.7/site-packages/pyudev/core.pyRscK`st|j|S(u! List all available devices. The arguments of this method are the same as for :meth:`Enumerator.match()`. In fact, the arguments are simply passed straight to method :meth:`~Enumerator.match()`. This function creates and returns an :class:`Enumerator` object, that can be used to filter the list of devices, and eventually retrieve :class:`Device` objects representing matching devices. .. versionchanged:: 0.8 Accept keyword arguments now for easy matching (t Enumeratortmatch(Rtkwargs((s//usr/lib/python2.7/site-packages/pyudev/core.pyt list_devicess( t__name__t __module__t__doc__RRtpropertyRRRRtsetterR$(((s//usr/lib/python2.7/site-packages/pyudev/core.pyRKs      R!cB`sweZdZdZdZdZedZdZdZ edZ dZ d Z d Z d ZRS( u Enumerate all available devices. To retrieve devices, simply iterate over an instance of this class. This operation yields :class:`Device` objects representing the available devices. Before iteration the device list can be filtered by subsystem or by property values using :meth:`match_subsystem` and :meth:`match_property`. Multiple subsystem (property) filters are combined using a logical OR, filters of different types are combined using a logical AND. The following filter for instance:: devices.match_subsystem('block').match_property( 'ID_TYPE', 'disk').match_property('DEVTYPE', 'disk') means the following:: subsystem == 'block' and (ID_TYPE == 'disk' or DEVTYPE == 'disk') Once added, a filter cannot be removed anymore. Create a new object instead. Instances of this class can directly be given as given ``udev_enumerate *`` to functions wrapped through :mod:`ctypes`. cC`sLt|tstdn||_|jj||_|j|_dS(u Create a new enumerator with the given ``context`` (a :class:`Context` instance). While you can create objects of this class directly, this is not recommended. Call :method:`Context.list_devices()` instead. uInvalid context objectN(t isinstanceRt TypeErrortcontextRtudev_enumerate_newR(RR,((s//usr/lib/python2.7/site-packages/pyudev/core.pyRs  cC`s|jj|dS(N(Rtudev_enumerate_unref(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyRscK`s|jdd}|dk r.|j|n|jdd}|dk r\|j|n|jdd}|dk r|j|n|jdd}|dk r|j|nx*|jD]\}}|j||qW|S(u3 Include devices according to the rules defined by the keyword arguments. These keyword arguments are interpreted as follows: - The value for the keyword argument ``subsystem`` is forwarded to :meth:`match_subsystem()`. - The value for the keyword argument ``sys_name`` is forwared to :meth:`match_sys_name()`. - The value for the keyword argument ``tag`` is forwared to :meth:`match_tag()`. - The value for the keyword argument ``parent`` is forwared to :meth:`match_parent()`. - All other keyword arguments are forwareded one by one to :meth:`match_property()`. The keyword argument itself is interpreted as property name, the value of the keyword argument as the property value. All keyword arguments are optional, calling this method without no arguments at all is simply a noop. Return the instance again. .. versionadded:: 0.8 .. versionchanged:: 0.13 Added ``parent`` keyword u subsystemusys_nameutaguparentN(tpoptNonetmatch_subsystemtmatch_sys_namet match_tagt match_parentt iteritemstmatch_property(RR#t subsystemtsys_namettagtparentR(R ((s//usr/lib/python2.7/site-packages/pyudev/core.pyR"s    cC`s5|s|jjn |jj}||t||S(u Include all devices, which are part of the given ``subsystem``. ``subsystem`` is either a unicode string or a byte string, containing the name of the subsystem. If ``nomatch`` is ``True`` (default is ``False``), the match is inverted: A device is only included if it is *not* part of the given ``subsystem``. Return the instance again. (Rt"udev_enumerate_add_match_subsystemt$udev_enumerate_add_nomatch_subsystemR(RR7tnomatchR"((s//usr/lib/python2.7/site-packages/pyudev/core.pyR1s  cC`s|jj|t||S(u Include all devices with the given name. ``sys_name`` is a byte or unicode string containing the device name. Return the instance again. .. versionadded:: 0.8 (Rt udev_enumerate_add_match_sysnameR(RR8((s//usr/lib/python2.7/site-packages/pyudev/core.pyR2s cC`s&|jj|t|t||S(u Include all devices, whose ``property`` has the given ``value``. ``property`` is either a unicode string or a byte string, containing the name of the property to match. ``value`` is a property value, being one of the following types: - :func:`int` - :func:`bool` - A byte string - Anything convertable to a unicode string (including a unicode string itself) Return the instance again. (Rt!udev_enumerate_add_match_propertyRR (RR(R ((s//usr/lib/python2.7/site-packages/pyudev/core.pyR6"s cC`s>|s|jjn |jj}||t|t||S(u Include all devices, whose ``attribute`` has the given ``value``. ``attribute`` is either a unicode string or a byte string, containing the name of a sys attribute to match. ``value`` is an attribute value, being one of the following types: - :func:`int`, - :func:`bool` - A byte string - Anything convertable to a unicode string (including a unicode string itself) If ``nomatch`` is ``True`` (default is ``False``), the match is inverted: A device is include if the ``attribute`` does *not* match the given ``value``. .. note:: If ``nomatch`` is ``True``, devices which do not have the given ``attribute`` at all are also included. In other words, with ``nomatch=True`` the given ``attribute`` is *not* guaranteed to exist on all returned devices. Return the instance again. (Rt udev_enumerate_add_match_sysattrt"udev_enumerate_add_nomatch_sysattrRR (Rt attributeR R=R"((s//usr/lib/python2.7/site-packages/pyudev/core.pytmatch_attribute6s   cC`s|jj|t||S(u Include all devices, which have the given ``tag`` attached. ``tag`` is a byte or unicode string containing the tag name. Return the instance again. .. udevversion:: 154 .. versionadded:: 0.6 (Rtudev_enumerate_add_match_tagR(RR9((s//usr/lib/python2.7/site-packages/pyudev/core.pyR3Xs cC`s|jj||S(u Include only devices, which are initialized. Initialized devices have properly set device node permissions and context, and are (in case of network devices) fully renamed. Currently this will not affect devices which do not have device nodes and are not network interfaces. Return the instance again. .. seealso:: :attr:`Device.is_initialized` .. udevversion:: 165 .. versionadded:: 0.8 (Rt'udev_enumerate_add_match_is_initialized(R((s//usr/lib/python2.7/site-packages/pyudev/core.pytmatch_is_initializedgscC`s|jj|||S(u  Include all devices on the subtree of the given ``parent`` device. The ``parent`` device itself is also included. ``parent`` is a :class:`~pyudev.Device`. Return the instance again. .. udevversion:: 172 .. versionadded:: 0.13 (Rtudev_enumerate_add_match_parent(RR:((s//usr/lib/python2.7/site-packages/pyudev/core.pyR4|scc`s]|jj||jj|}x4t|j|D] \}}tj|j|Vq5WdS(u\ Iterate over all matching devices. Yield :class:`Device` objects. N(Rtudev_enumerate_scan_devicestudev_enumerate_get_list_entryR Rt from_sys_pathR,(Rtentrytnamet_((s//usr/lib/python2.7/site-packages/pyudev/core.pyt__iter__s(R%R&R'RRR"tFalseR1R2R6RCR3RFR4RN(((s//usr/lib/python2.7/site-packages/pyudev/core.pyR!s   ,    "   N(R't __future__RRRRt subprocessRt ImportErrortpyudev._compatt pyudev.deviceRtpyudev._libudevRt pyudev._utilRRR R t__all__RtobjectRR!(((s//usr/lib/python2.7/site-packages/pyudev/core.pyts" " _PK[E!site-packages/pyudev/_py3util.pycnu[ :Oc@sdZdZdS(s pyudev._py3util =============== Internal utilities for Python 3. .. moduleauthor:: Sebastian Wiesner cCs|j|dS(s Re-raise the given exception with ``traceback``. ``exc`` is an exception derived from :class:`~exceptions.Exception`, ``traceback`` a traceback object. N(twith_traceback(texct traceback((s3/usr/lib/python2.7/site-packages/pyudev/_py3util.pytreraisesN(t__doc__R(((s3/usr/lib/python2.7/site-packages/pyudev/_py3util.pytsPK[q !site-packages/pyudev/_qt_base.pyonu[ :Oc@`sBdZddlmZmZmZmZdefdYZdS(u pyudev._qt_base =============== Base mixin class for Qt4 support. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importtQUDevMonitorObserverMixincB`s;eZdZedZejdZdZRS(cC`sv||_||j|j||_|jjtj|ji|jd6|j d6|j d6|j d6|_ dS(Nuadduremoveuchangeumove( tmonitortfilenotReadtnotifiert activatedtinttconnectt_process_udev_eventt deviceAddedt deviceRemovedt deviceChangedt deviceMovedt_action_signal_map(tselfRtnotifier_class((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyt_setup_notifier#s cC`s |jjS(uY Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. This merely reflects the state of the ``enabled`` property of the underlying :attr:`notifier`. .. versionadded:: 0.14 (Rt isEnabled(R((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pytenabled-s cC`s|jj|dS(N(Rt setEnabled(Rtvalue((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyR;scC`sO|jj}|rK|\}}|jj|||j|j|ndS(u Attempt to receive a single device event from the monitor, process the event and emit corresponding signals. Called by ``QSocketNotifier``, if data is available on the udev monitoring socket. N(Rtreceive_devicet deviceEventtemitR(Rteventtactiontdevice((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyR ?s  (t__name__t __module__RtpropertyRtsetterR (((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyR!s N(t__doc__t __future__RRRRtobjectR(((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyts"PK[h'' site-packages/pyudev/_libudev.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011, 2012 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ _libudev ======== Wrapper types for libudev. Use ``libudev`` attribute to access libudev functions. .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) import os import errno from ctypes import (CDLL, Structure, POINTER, get_errno, c_char, c_char_p, c_int, c_ulonglong) from ctypes.util import find_library class udev(Structure): """ Dummy for ``udev`` structure. """ pass udev_p = POINTER(udev) class udev_enumerate(Structure): """ Dummy for ``udev_enumerate`` structure. """ udev_enumerate_p = POINTER(udev_enumerate) class udev_list_entry(Structure): """ Dummy for ``udev_list_entry`` structure. """ udev_list_entry_p = POINTER(udev_list_entry) class udev_device(Structure): """ Dummy for ``udev_device`` structure. """ udev_device_p = POINTER(udev_device) class udev_monitor(Structure): """ Dummy for ``udev_device`` structure. """ udev_monitor_p = POINTER(udev_monitor) dev_t = c_ulonglong SIGNATURES = { # context 'udev': dict( new=(None, udev_p), unref=([udev_p], None), ref=([udev_p], udev_p), get_sys_path=([udev_p], c_char_p), get_dev_path=([udev_p], c_char_p), get_run_path=([udev_p], c_char_p), get_log_priority=([udev_p], c_int), set_log_priority=([udev_p, c_int], None)), # enumeration 'udev_enumerate': dict( new=([udev_p], udev_enumerate_p), ref=([udev_enumerate_p], udev_enumerate_p), unref=([udev_enumerate_p], None), add_match_subsystem=([udev_enumerate_p, c_char_p], c_int), add_nomatch_subsystem=([udev_enumerate_p, c_char_p], c_int), add_match_property=([udev_enumerate_p, c_char_p, c_char_p], c_int), add_match_sysattr=([udev_enumerate_p, c_char_p, c_char_p], c_int), add_nomatch_sysattr=([udev_enumerate_p, c_char_p, c_char_p], c_int), add_match_tag=([udev_enumerate_p, c_char_p], c_int), add_match_sysname=([udev_enumerate_p, c_char_p], c_int), add_match_parent=([udev_enumerate_p, udev_device_p], c_int), add_match_is_initialized=([udev_enumerate_p], c_int), scan_devices=([udev_enumerate_p], c_int), get_list_entry=([udev_enumerate_p], udev_list_entry_p)), # list entries 'udev_list_entry': dict( get_next=([udev_list_entry_p], udev_list_entry_p), get_name=([udev_list_entry_p], c_char_p), get_value=([udev_list_entry_p], c_char_p)), # devices 'udev_device': dict( ref=([udev_device_p], udev_device_p), unref=([udev_device_p], None), new_from_syspath=([udev_p, c_char_p], udev_device_p), new_from_subsystem_sysname=([udev_p, c_char_p, c_char_p], udev_device_p), new_from_devnum=([udev_p, c_char, dev_t], udev_device_p), new_from_environment=([udev_p], udev_device_p), get_parent=([udev_device_p], udev_device_p), get_parent_with_subsystem_devtype=([udev_device_p, c_char_p, c_char_p], udev_device_p), get_devpath=([udev_device_p], c_char_p), get_subsystem=([udev_device_p], c_char_p), get_syspath=([udev_device_p], c_char_p), get_sysnum=([udev_device_p], c_char_p), get_sysname=([udev_device_p], c_char_p), get_driver=([udev_device_p], c_char_p), get_devtype=([udev_device_p], c_char_p), get_devnode=([udev_device_p], c_char_p), get_property_value=([udev_device_p, c_char_p], c_char_p), get_sysattr_value=([udev_device_p, c_char_p], c_char_p), get_devnum=([udev_device_p], dev_t), get_action=([udev_device_p], c_char_p), get_is_initialized=([udev_device_p], c_int), get_usec_since_initialized=([udev_device_p], c_ulonglong), get_devlinks_list_entry=([udev_device_p], udev_list_entry_p), get_tags_list_entry=([udev_device_p], udev_list_entry_p), get_properties_list_entry=([udev_device_p], udev_list_entry_p), get_sysattr_list_entry=([udev_device_p], udev_list_entry_p), has_tag=([udev_device_p, c_char_p], c_int)), # monitoring 'udev_monitor': dict( ref=([udev_monitor_p], udev_monitor_p), unref=([udev_monitor_p], None), new_from_netlink=([udev_p, c_char_p], udev_monitor_p), new_from_socket=([udev_p, c_char_p], udev_monitor_p), enable_receiving=([udev_monitor_p], c_int), set_receive_buffer_size=([udev_monitor_p], c_int), get_fd=([udev_monitor_p], c_int), receive_device=([udev_monitor_p], udev_device_p), filter_add_match_subsystem_devtype=( [udev_monitor_p, c_char_p, c_char_p], c_int), filter_add_match_tag=([udev_monitor_p, c_char_p], c_int), filter_update=([udev_monitor_p], c_int), filter_remove=([udev_monitor_p], c_int)) } ERRNO_EXCEPTIONS = { errno.ENOMEM: MemoryError, errno.EOVERFLOW: OverflowError, errno.EINVAL: ValueError } def exception_from_errno(errno): """ Create an exception from ``errno``. ``errno`` is an integral error number. Return an exception object appropriate to ``errno``. """ exception = ERRNO_EXCEPTIONS.get(errno) if exception is not None: return exception() else: return EnvironmentError(errno, os.strerror(errno)) def check_negative_errorcode(result, func, *args): """ Error checker for udev funtions, which return negative error codes. If ``result`` is smaller than ``0``, it is interpreted as negative error code, and an appropriate exception is raised: - ``-ENOMEM`` raises a :exc:`~exceptions.MemoryError` - ``-EOVERFLOW`` raises a :exc:`~exceptions.OverflowError` - all other error codes raise :exc:`~exceptions.EnvironmentError` If result is greater or equal to ``0``, it is returned unchanged. """ if result < 0: # udev returns the *negative* errno code at this point errno = -result raise exception_from_errno(errno) else: return result def check_errno(result, func, *args): """ Error checker to check the system ``errno`` as returned by :func:`ctypes.get_errno()`. If ``result`` is not ``0``, an exception according to this errno is raised. Otherwise nothing happens. """ if result != 0: errno = get_errno() if errno != 0: raise exception_from_errno(errno) return result def check_errno_on_null_pointer(result, func, *args): """ Error checker to check the system ``errno`` as returned by :func:`ctypes.get_errno()`. If ``result`` is a null pointer, an exception according to this errno is raised. Otherwise nothing happens. """ if not result: errno = get_errno() if errno != 0: raise exception_from_errno(errno) return result ERROR_CHECKERS = dict( udev_enumerate_add_match_parent=check_negative_errorcode, udev_enumerate_add_match_subsystem=check_negative_errorcode, udev_enumerate_add_nomatch_subsystem=check_negative_errorcode, udev_enumerate_add_match_property=check_negative_errorcode, udev_enumerate_add_match_sysattr=check_negative_errorcode, udev_enumerate_add_nomatch_sysattr=check_negative_errorcode, udev_enumerate_add_match_tag=check_negative_errorcode, udev_enumerate_add_match_sysname=check_negative_errorcode, udev_enumerate_add_match_is_initialized=check_negative_errorcode, udev_monitor_set_receive_buffer_size=check_errno, # libudev doc says, enable_receiving returns a negative errno, but tests # show that this is not reliable, so query the real error code udev_monitor_enable_receiving=check_errno, udev_monitor_receive_device=check_errno_on_null_pointer, udev_monitor_filter_add_match_subsystem_devtype=check_negative_errorcode, udev_monitor_filter_add_match_tag=check_negative_errorcode, udev_monitor_filter_update=check_errno, udev_monitor_filter_remove=check_errno, ) def load_udev_library(): """ Load the ``udev`` library and return a :class:`ctypes.CDLL` object for it. The library has errno handling enabled. Important functions are given proper signatures and return types to support type checking and argument conversion. Raise :exc:`~exceptions.ImportError`, if the udev library was not found. """ udev_library_name = find_library('udev') if not udev_library_name: raise ImportError('No library named udev') libudev = CDLL(udev_library_name, use_errno=True) # context function signature for namespace, members in SIGNATURES.items(): for funcname in members: fullname = '{0}_{1}'.format(namespace, funcname) func = getattr(libudev, fullname, None) if func: argtypes, restype = members[funcname] func.argtypes = argtypes func.restype = restype errorchecker = ERROR_CHECKERS.get(fullname) if errorchecker: func.errcheck = errorchecker return libudev PK[jr&site-packages/pyudev/_compat.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2011 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev._compat ============== Compatibility for Python versions, that lack certain functions. .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) from subprocess import Popen, CalledProcessError, PIPE def check_output(command): """ Compatibility with :func:`subprocess.check_output` from Python 2.7 and upwards. """ proc = Popen(command, stdout=PIPE) output = proc.communicate()[0] if proc.returncode != 0: raise CalledProcessError(proc.returncode, command) return output PK[v!U site-packages/pyudev/_compat.pyonu[ :Oc@`sQdZddlmZmZmZmZddlmZmZm Z dZ dS(u pyudev._compat ============== Compatibility for Python versions, that lack certain functions. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_import(tPopentCalledProcessErrortPIPEcC`sJt|dt}|jd}|jdkrFt|j|n|S(u] Compatibility with :func:`subprocess.check_output` from Python 2.7 and upwards. tstdouti(RRt communicatet returncodeR(tcommandtproctoutput((s2/usr/lib/python2.7/site-packages/pyudev/_compat.pyt check_output#s N( t__doc__t __future__RRRRt subprocessRRRR (((s2/usr/lib/python2.7/site-packages/pyudev/_compat.pyts"PK[Jj"j"!site-packages/pyudev/_libudev.pyonu[ ݹYc9@`s>dZddlmZmZmZmZddlZddlZddlm Z m Z m Z m Z m Z mZmZmZddlmZde fdYZe eZde fd YZe eZd e fd YZe eZd e fd YZe eZde fdYZe eZeZieddefdegdfdegefdegefdegefdegefdegefdeegdfd6edegefdegefdegdfdeegefdeegefdeeegefdeeegefdeeegefdeegefdeegefd eegefd!egefd"egefd#egefd$6ed%egefd&egefd'egefd(6edegefdegdfd)eegefd*eeegefd+ee egefd,egefd-egefd.eeegefd/egefd0egefd1egefd2egefd3egefd4egefd5egefd6egefd7eegefd8eegefd9egefd:egefd;egefd<egefd=egefd>egefd?egefd@egefdAeegefdB6edegefdegdfdCeegefdDeegefdEegefdFegefdGegefdHegefdIeeegefdJeegefdKegefdLegef dM6Z ie!ej"6e#ej$6e%ej&6Z'dNZ(dOZ)dPZ*dQZ+edRe)dSe)dTe)dUe)dVe)dWe)dXe)dYe)dZe)d[e*d\e*d]e+d^e)d_e)d`e*dae*Z,dbZ-dS(cu _libudev ======== Wrapper types for libudev. Use ``libudev`` attribute to access libudev functions. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importN(tCDLLt StructuretPOINTERt get_errnotc_chartc_char_ptc_intt c_ulonglong(t find_librarytudevcB`seZdZRS(u' Dummy for ``udev`` structure. (t__name__t __module__t__doc__(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyR (studev_enumeratecB`seZdZRS(u1 Dummy for ``udev_enumerate`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyR1studev_list_entrycB`seZdZRS(u2 Dummy for ``udev_list_entry`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyR9st udev_devicecB`seZdZRS(u. Dummy for ``udev_device`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyRAst udev_monitorcB`seZdZRS(u. Dummy for ``udev_device`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyRIstnewtunreftreft get_sys_patht get_dev_patht get_run_pathtget_log_prioritytset_log_priorityuudevtadd_match_subsystemtadd_nomatch_subsystemtadd_match_propertytadd_match_sysattrtadd_nomatch_sysattrt add_match_tagtadd_match_sysnametadd_match_parenttadd_match_is_initializedt scan_devicestget_list_entryuudev_enumeratetget_nexttget_namet get_valueuudev_list_entrytnew_from_syspathtnew_from_subsystem_sysnametnew_from_devnumtnew_from_environmentt get_parentt!get_parent_with_subsystem_devtypet get_devpatht get_subsystemt get_syspatht get_sysnumt get_sysnamet get_drivert get_devtypet get_devnodetget_property_valuetget_sysattr_valuet get_devnumt get_actiontget_is_initializedtget_usec_since_initializedtget_devlinks_list_entrytget_tags_list_entrytget_properties_list_entrytget_sysattr_list_entrythas_tagu udev_devicetnew_from_netlinktnew_from_sockettenable_receivingtset_receive_buffer_sizetget_fdtreceive_devicet"filter_add_match_subsystem_devtypetfilter_add_match_tagt filter_updatet filter_removeu udev_monitorcC`s<tj|}|dk r"|St|tj|SdS(u Create an exception from ``errno``. ``errno`` is an integral error number. Return an exception object appropriate to ``errno``. N(tERRNO_EXCEPTIONStgettNonetEnvironmentErrortoststrerror(terrnot exception((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytexception_from_errnos cG`s*|dkr"| }t|n|SdS(u Error checker for udev funtions, which return negative error codes. If ``result`` is smaller than ``0``, it is interpreted as negative error code, and an appropriate exception is raised: - ``-ENOMEM`` raises a :exc:`~exceptions.MemoryError` - ``-EOVERFLOW`` raises a :exc:`~exceptions.OverflowError` - all other error codes raise :exc:`~exceptions.EnvironmentError` If result is greater or equal to ``0``, it is returned unchanged. iN(RV(tresulttfunctargsRT((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytcheck_negative_errorcodes cG`s7|dkr3t}|dkr3t|q3n|S(u Error checker to check the system ``errno`` as returned by :func:`ctypes.get_errno()`. If ``result`` is not ``0``, an exception according to this errno is raised. Otherwise nothing happens. i(RRV(RWRXRYRT((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyt check_errnos    cG`s1|s-t}|dkr-t|q-n|S(u Error checker to check the system ``errno`` as returned by :func:`ctypes.get_errno()`. If ``result`` is a null pointer, an exception according to this errno is raised. Otherwise nothing happens. i(RRV(RWRXRYRT((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytcheck_errno_on_null_pointers   tudev_enumerate_add_match_parentt"udev_enumerate_add_match_subsystemt$udev_enumerate_add_nomatch_subsystemt!udev_enumerate_add_match_propertyt udev_enumerate_add_match_sysattrt"udev_enumerate_add_nomatch_sysattrtudev_enumerate_add_match_tagt udev_enumerate_add_match_sysnamet'udev_enumerate_add_match_is_initializedt$udev_monitor_set_receive_buffer_sizetudev_monitor_enable_receivingtudev_monitor_receive_devicet/udev_monitor_filter_add_match_subsystem_devtypet!udev_monitor_filter_add_match_tagtudev_monitor_filter_updatetudev_monitor_filter_removec C`std}|s!tdnt|dt}xtjD]\}}x~|D]v}dj||}t||d}|rS||\}}||_ ||_ t j |} | r| |_ qqSqSWq@W|S(uK Load the ``udev`` library and return a :class:`ctypes.CDLL` object for it. The library has errno handling enabled. Important functions are given proper signatures and return types to support type checking and argument conversion. Raise :exc:`~exceptions.ImportError`, if the udev library was not found. uudevuNo library named udevt use_errnou{0}_{1}N(R t ImportErrorRtTruet SIGNATUREStitemstformattgetattrRPtargtypestrestypetERROR_CHECKERSROterrcheck( tudev_library_nametlibudevt namespacetmemberstfuncnametfullnameRXRtRut errorchecker((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytload_udev_librarys    (.Rt __future__RRRRRRRTtctypesRRRRRR R R t ctypes.utilR R tudev_pRtudev_enumerate_pRtudev_list_entry_pRt udev_device_pRtudev_monitor_ptdev_ttdictRPRpt MemoryErrortENOMEMt OverflowErrort EOVERFLOWt ValueErrortEINVALRNRVRZR[R\RvR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyts"  :                  PK[_ site-packages/pyudev/__init__.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011, 2012 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev ====== A binding to libudev_. A :class:`Context` object is required for almost any functionality in pyudev. The context provides :class:`Device` enumeration with :meth:`Context.list_devices()`. Device monitoring is provided by :class:`Monitor` and :class:`MonitorObserver`. With :mod:`pyudev.pyqt4`, :mod:`pyudev.pyside`, :mod:`pyudev.glib` and :mod:`pyudev.wx` device monitoring can be integrated into the event loop of various GUI toolkits. .. _libudev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/ .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) __version__ = '0.15' __version_info__ = tuple(map(int, __version__.split('.'))) __all__ = ['Context', 'Device'] from pyudev.device import * from pyudev.core import * from pyudev.monitor import * PK[Jj"j"!site-packages/pyudev/_libudev.pycnu[ ݹYc9@`s>dZddlmZmZmZmZddlZddlZddlm Z m Z m Z m Z m Z mZmZmZddlmZde fdYZe eZde fd YZe eZd e fd YZe eZd e fd YZe eZde fdYZe eZeZieddefdegdfdegefdegefdegefdegefdegefdeegdfd6edegefdegefdegdfdeegefdeegefdeeegefdeeegefdeeegefdeegefdeegefd eegefd!egefd"egefd#egefd$6ed%egefd&egefd'egefd(6edegefdegdfd)eegefd*eeegefd+ee egefd,egefd-egefd.eeegefd/egefd0egefd1egefd2egefd3egefd4egefd5egefd6egefd7eegefd8eegefd9egefd:egefd;egefd<egefd=egefd>egefd?egefd@egefdAeegefdB6edegefdegdfdCeegefdDeegefdEegefdFegefdGegefdHegefdIeeegefdJeegefdKegefdLegef dM6Z ie!ej"6e#ej$6e%ej&6Z'dNZ(dOZ)dPZ*dQZ+edRe)dSe)dTe)dUe)dVe)dWe)dXe)dYe)dZe)d[e*d\e*d]e+d^e)d_e)d`e*dae*Z,dbZ-dS(cu _libudev ======== Wrapper types for libudev. Use ``libudev`` attribute to access libudev functions. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importN(tCDLLt StructuretPOINTERt get_errnotc_chartc_char_ptc_intt c_ulonglong(t find_librarytudevcB`seZdZRS(u' Dummy for ``udev`` structure. (t__name__t __module__t__doc__(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyR (studev_enumeratecB`seZdZRS(u1 Dummy for ``udev_enumerate`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyR1studev_list_entrycB`seZdZRS(u2 Dummy for ``udev_list_entry`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyR9st udev_devicecB`seZdZRS(u. Dummy for ``udev_device`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyRAst udev_monitorcB`seZdZRS(u. Dummy for ``udev_device`` structure. (RRR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyRIstnewtunreftreft get_sys_patht get_dev_patht get_run_pathtget_log_prioritytset_log_priorityuudevtadd_match_subsystemtadd_nomatch_subsystemtadd_match_propertytadd_match_sysattrtadd_nomatch_sysattrt add_match_tagtadd_match_sysnametadd_match_parenttadd_match_is_initializedt scan_devicestget_list_entryuudev_enumeratetget_nexttget_namet get_valueuudev_list_entrytnew_from_syspathtnew_from_subsystem_sysnametnew_from_devnumtnew_from_environmentt get_parentt!get_parent_with_subsystem_devtypet get_devpatht get_subsystemt get_syspatht get_sysnumt get_sysnamet get_drivert get_devtypet get_devnodetget_property_valuetget_sysattr_valuet get_devnumt get_actiontget_is_initializedtget_usec_since_initializedtget_devlinks_list_entrytget_tags_list_entrytget_properties_list_entrytget_sysattr_list_entrythas_tagu udev_devicetnew_from_netlinktnew_from_sockettenable_receivingtset_receive_buffer_sizetget_fdtreceive_devicet"filter_add_match_subsystem_devtypetfilter_add_match_tagt filter_updatet filter_removeu udev_monitorcC`s<tj|}|dk r"|St|tj|SdS(u Create an exception from ``errno``. ``errno`` is an integral error number. Return an exception object appropriate to ``errno``. N(tERRNO_EXCEPTIONStgettNonetEnvironmentErrortoststrerror(terrnot exception((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytexception_from_errnos cG`s*|dkr"| }t|n|SdS(u Error checker for udev funtions, which return negative error codes. If ``result`` is smaller than ``0``, it is interpreted as negative error code, and an appropriate exception is raised: - ``-ENOMEM`` raises a :exc:`~exceptions.MemoryError` - ``-EOVERFLOW`` raises a :exc:`~exceptions.OverflowError` - all other error codes raise :exc:`~exceptions.EnvironmentError` If result is greater or equal to ``0``, it is returned unchanged. iN(RV(tresulttfunctargsRT((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytcheck_negative_errorcodes cG`s7|dkr3t}|dkr3t|q3n|S(u Error checker to check the system ``errno`` as returned by :func:`ctypes.get_errno()`. If ``result`` is not ``0``, an exception according to this errno is raised. Otherwise nothing happens. i(RRV(RWRXRYRT((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyt check_errnos    cG`s1|s-t}|dkr-t|q-n|S(u Error checker to check the system ``errno`` as returned by :func:`ctypes.get_errno()`. If ``result`` is a null pointer, an exception according to this errno is raised. Otherwise nothing happens. i(RRV(RWRXRYRT((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytcheck_errno_on_null_pointers   tudev_enumerate_add_match_parentt"udev_enumerate_add_match_subsystemt$udev_enumerate_add_nomatch_subsystemt!udev_enumerate_add_match_propertyt udev_enumerate_add_match_sysattrt"udev_enumerate_add_nomatch_sysattrtudev_enumerate_add_match_tagt udev_enumerate_add_match_sysnamet'udev_enumerate_add_match_is_initializedt$udev_monitor_set_receive_buffer_sizetudev_monitor_enable_receivingtudev_monitor_receive_devicet/udev_monitor_filter_add_match_subsystem_devtypet!udev_monitor_filter_add_match_tagtudev_monitor_filter_updatetudev_monitor_filter_removec C`std}|s!tdnt|dt}xtjD]\}}x~|D]v}dj||}t||d}|rS||\}}||_ ||_ t j |} | r| |_ qqSqSWq@W|S(uK Load the ``udev`` library and return a :class:`ctypes.CDLL` object for it. The library has errno handling enabled. Important functions are given proper signatures and return types to support type checking and argument conversion. Raise :exc:`~exceptions.ImportError`, if the udev library was not found. uudevuNo library named udevt use_errnou{0}_{1}N(R t ImportErrorRtTruet SIGNATUREStitemstformattgetattrRPtargtypestrestypetERROR_CHECKERSROterrcheck( tudev_library_nametlibudevt namespacetmemberstfuncnametfullnameRXRtRut errorchecker((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pytload_udev_librarys    (.Rt __future__RRRRRRRTtctypesRRRRRR R R t ctypes.utilR R tudev_pRtudev_enumerate_pRtudev_list_entry_pRt udev_device_pRtudev_monitor_ptdev_ttdictRPRpt MemoryErrortENOMEMt OverflowErrort EOVERFLOWt ValueErrortEINVALRNRVRZR[R\RvR(((s3/usr/lib/python2.7/site-packages/pyudev/_libudev.pyts"  :                  PK[@ site-packages/pyudev/glib.pycnu[ :Oc@`sjdZddlmZmZmZmZddlZddlZdejfdYZ ej e dS(u pyudev.pygtk ============ Provide :class:`~pyudev.glib.GUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into a :class:`glib.MainLoop`. To use this module, :mod:`glib` and :mod:`gobject` from PyGObject_ must be available. PyGtk is not required. .. _PyGObject: http://www.pygtk.org/ .. moduleauthor:: Sebastian Wiesner .. versionadded:: 0.7 i(tprint_functiontdivisiontunicode_literalstabsolute_importNtGUDevMonitorObservercB`seZdZidd6dd6dd6dd6Ziejejejejffe d 6ejejejffe d6ejejejffe d6ejejejffe d6ejejejffe d6Z d Z e d Z e jd Z d ZRS(u  Observe a :class:`~pyudev.Monitor` and emit Glib signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pygtk.GUDevMonitorObserver(monitor) >>> def device_connected(observer, device): ... print('{0!r} added'.format(device)) >>> observer.connect('device-added', device_connected) >>> monitor.start() This class is a child of :class:`gobject.GObject`. u device-addeduaddudevice-removeduremoveudevice-changeduchangeu device-movedumoveu device-eventcC`s/tjj|||_d|_t|_dS(N(tgobjecttGObjectt__init__tmonitortNonet event_sourcetTruetenabled(tselfR((s//usr/lib/python2.7/site-packages/pyudev/glib.pyRTs  cC`s |jdk S(u Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. .. versionadded:: 0.14 N(R R (R ((s//usr/lib/python2.7/site-packages/pyudev/glib.pyR Zs cC`sf|r9|jdkr9tj|jtj|j|_n)| rb|jdk rbtj|jndS(N(R R tglibt io_add_watchRtIO_INt_process_udev_eventt source_remove(R tvalue((s//usr/lib/python2.7/site-packages/pyudev/glib.pyR fs cC`sd|tjkr`|jj}|r`|\}}|jd|||j|j||q`ntS(Nu device-event(RRRtreceive_devicetemitt_action_signal_mapR (R tsourcet conditionteventtactiontdevice((s//usr/lib/python2.7/site-packages/pyudev/glib.pyRns (t__name__t __module__t__doc__RRtSIGNAL_RUN_LASTt TYPE_NONEt TYPE_STRINGt TYPE_PYOBJECTtstrt __gsignals__RtpropertyR tsetterR(((s//usr/lib/python2.7/site-packages/pyudev/glib.pyR,s&       ( Rt __future__RRRRRRRRt type_register(((s//usr/lib/python2.7/site-packages/pyudev/glib.pyt s "  LPK[2зsite-packages/pyudev/device.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2011, 2012 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev.device ============= Device class implementation of :mod:`pyudev`. .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) import os from collections import Mapping, Container, Iterable from datetime import timedelta from pyudev._util import (ensure_byte_string, ensure_unicode_string, udev_list_iterate, string_to_bool, get_device_type) __all__ = ['Device', 'Attributes', 'Tags', 'DeviceNotFoundError', 'DeviceNotFoundAtPathError', 'DeviceNotFoundByNameError', 'DeviceNotFoundByNumberError', 'DeviceNotFoundInEnvironmentError'] class DeviceNotFoundError(LookupError): """ An error indicating that no :class:`Device` was found. .. versionchanged:: 0.5 Renamed from ``NoSuchDeviceError`` to its current name. """ class DeviceNotFoundAtPathError(DeviceNotFoundError): """ A :exc:`DeviceNotFoundError` indicating that no :class:`Device` was found at a given path. """ def __init__(self, sys_path): DeviceNotFoundError.__init__(self, sys_path) @property def sys_path(self): """ The path that caused this error as string. """ return self.args[0] def __str__(self): return 'No device at {0!r}'.format(self.sys_path) class DeviceNotFoundByNameError(DeviceNotFoundError): """ A :exc:`DeviceNotFoundError` indicating that no :class:`Device` was found with a given name. """ def __init__(self, subsystem, sys_name): DeviceNotFoundError.__init__(self, subsystem, sys_name) @property def subsystem(self): """ The subsystem that caused this error as string. """ return self.args[0] @property def sys_name(self): """ The sys name that caused this error as string. """ return self.args[1] def __str__(self): return 'No device {0.sys_name!r} in {0.subsystem!r}'.format(self) class DeviceNotFoundByNumberError(DeviceNotFoundError): """ A :exc:`DeviceNotFoundError` indicating, that no :class:`Device` was found for a given device number. """ def __init__(self, type, number): DeviceNotFoundError.__init__(self, type, number) @property def device_type(self): """ The device type causing this error as string. Either ``'char'`` or ``'block'``. """ return self.args[0] @property def device_number(self): """ The device number causing this error as integer. """ return self.args[1] def __str__(self): return ('No {0.device_type} device with number ' '{0.device_number}'.format(self)) class DeviceNotFoundInEnvironmentError(DeviceNotFoundError): """ A :exc:`DeviceNotFoundError` indicating, that no :class:`Device` could be constructed from the process environment. """ def __str__(self): return 'No device found in environment' class Device(Mapping): """ A single device with attached attributes and properties. This class subclasses the ``Mapping`` ABC, providing a read-only dictionary mapping property names to the corresponding values. Therefore all well-known dicitionary methods and operators (e.g. ``.keys()``, ``.items()``, ``in``) are available to access device properties. Aside of the properties, a device also has a set of udev-specific attributes like the path inside ``sysfs``. :class:`Device` objects compare equal and unequal to other devices and to strings (based on :attr:`device_path`). However, there is no ordering on :class:`Device` objects, and the corresponding operators ``>``, ``<``, ``<=`` and ``>=`` raise :exc:`~exceptions.TypeError`. .. warning:: Do **never** use object identity (``is`` operator) to compare :class:`Device` objects. :mod:`pyudev` may create multiple :class:`Device` objects for the same device. Instead simply compare devices by value using ``==`` or ``!=``. :class:`Device` objects are hashable and can therefore be used as keys in dictionaries and sets. They can also be given directly as ``udev_device *`` to functions wrapped through :mod:`ctypes`. """ @classmethod def from_path(cls, context, path): """ Create a device from a device ``path``. The ``path`` may or may not start with the ``sysfs`` mount point: >>> context = pyudev.Context() >>> Device.from_path(context, '/devices/platform') Device(u'/sys/devices/platform') >>> Device.from_path(context, '/sys/devices/platform') Device(u'/sys/devices/platform') ``context`` is the :class:`Context` in which to search the device. ``path`` is a device path as unicode or byte string. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundAtPathError`, if no device was found for ``path``. .. versionadded:: 0.4 """ if not path.startswith(context.sys_path): path = os.path.join(context.sys_path, path.lstrip(os.sep)) return cls.from_sys_path(context, path) @classmethod def from_sys_path(cls, context, sys_path): """ Create a new device from a given ``sys_path``: >>> context = pyudev.Context() >>> Device.from_path(context, '/sys/devices/platform') Device(u'/sys/devices/platform') ``context`` is the :class:`Context` in which to search the device. ``sys_path`` is a unicode or byte string containing the path of the device inside ``sysfs`` with the mount point included. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundAtPathError`, if no device was found for ``sys_path``. .. versionchanged:: 0.4 Raise :exc:`NoSuchDeviceError` instead of returning ``None``, if no device was found for ``sys_path`` .. versionchanged:: 0.5 Raise :exc:`DeviceNotFoundAtPathError` instead of :exc:`NoSuchDeviceError` """ device = context._libudev.udev_device_new_from_syspath( context, ensure_byte_string(sys_path)) if not device: raise DeviceNotFoundAtPathError(sys_path) return cls(context, device) @classmethod def from_name(cls, context, subsystem, sys_name): """ Create a new device from a given ``subsystem`` and a given ``sys_name``: >>> context = pyudev.Context() >>> sda = pyudev.Device.from_name(context, 'block', 'sda') >>> sda Device(u'/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda') >>> sda == pyudev.Device.from_path(context, '/block/sda') ``context`` is the :class:`Context` in which to search the device. ``subsystem`` and ``sys_name`` are byte or unicode strings, which denote the subsystem and the name of the device to create. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundByNameError`, if no device was found with the given name. .. versionadded:: 0.5 """ device = context._libudev.udev_device_new_from_subsystem_sysname( context, ensure_byte_string(subsystem), ensure_byte_string(sys_name)) if not device: raise DeviceNotFoundByNameError(subsystem, sys_name) return cls(context, device) @classmethod def from_device_number(cls, context, type, number): """ Create a new device from a device ``number`` with the given device ``type``: >>> import os >>> ctx = Context() >>> major, minor = 8, 0 >>> device = Device.from_device_number(context, 'block', ... os.makedev(major, minor)) >>> device Device(u'/sys/devices/pci0000:00/0000:00:11.0/host0/target0:0:0/0:0:0:0/block/sda') >>> os.major(device.device_number), os.minor(device.device_number) (8, 0) Use :func:`os.makedev` to construct a device number from a major and a minor device number, as shown in the example above. .. note:: Device numbers are not unique across different device types. Passing a correct number with a wrong type may silently yield a wrong device object, so make sure to pass the correct device type. ``context`` is the :class:`Context`, in which to search the device. ``type`` is either ``'char'`` or ``'block'``, according to whether the device is a character or block device. ``number`` is the device number as integer. Return a :class:`Device` object for the device with the given device ``number``. Raise :exc:`DeviceNotFoundByNumberError`, if no device was found with the given device type and number. Raise :exc:`~exceptions.ValueError`, if ``type`` is any other string than ``'char'`` or ``'block'``. .. versionadded:: 0.11 """ if type not in ('char', 'block'): raise ValueError('Invalid type: {0!r}. Must be one of "char" ' 'or "block".'.format(type)) device = context._libudev.udev_device_new_from_devnum( context, ensure_byte_string(type[0]), number) if not device: raise DeviceNotFoundByNumberError(type, number) return cls(context, device) @classmethod def from_device_file(cls, context, filename): """ Create a new device from the given device file: >>> context = Context() >>> device = Device.from_device_file(context, '/dev/sda') >>> device Device(u'/sys/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0/2:0:0:0/block/sda') >>> device.device_node u'/dev/sda' .. warning:: Though the example seems to suggest that ``device.device_node == filename`` holds with ``device = Device.from_device_file(context, filename)``, this is only true in a majority of cases. There *can* be devices, for which this relation is actually false! Thus, do *not* expect :attr:`~Device.device_node` to be equal to the given ``filename`` for the returned :class:`Device`. Especially, use :attr:`~Device.device_node` if you need the device file of a :class:`Device` created with this method afterwards. ``context`` is the :class:`Context` in which to search the device. ``filename`` is a string containing the path of a device file. Return a :class:`Device` representing the given device file. Raise :exc:`~exceptions.ValueError` if ``filename`` is no device file at all. Raise :exc:`~exceptions.EnvironmentError` if ``filename`` does not exist or if its metadata was inaccessible. .. versionadded:: 0.15 """ device_type = get_device_type(filename) device_number = os.stat(filename).st_rdev return cls.from_device_number(context, device_type, device_number) @classmethod def from_environment(cls, context): """ Create a new device from the process environment (as in :data:`os.environ`). This only works reliable, if the current process is called from an udev rule, and is usually used for tools executed from ``IMPORT=`` rules. Use this method to create device objects in Python scripts called from udev rules. ``context`` is the library :class:`Context`. Return a :class:`Device` object constructed from the environment. Raise :exc:`DeviceNotFoundInEnvironmentError`, if no device could be created from the environment. .. udevversion:: 152 .. versionadded:: 0.6 """ device = context._libudev.udev_device_new_from_environment(context) if not device: raise DeviceNotFoundInEnvironmentError() return cls(context, device) def __init__(self, context, _device): self.context = context self._as_parameter_ = _device self._libudev = context._libudev def __del__(self): self._libudev.udev_device_unref(self) def __repr__(self): return 'Device({0.sys_path!r})'.format(self) @property def parent(self): """ The parent :class:`Device` or ``None``, if there is no parent device. """ parent = self._libudev.udev_device_get_parent(self) if not parent: return None # the parent device is not referenced, thus forcibly acquire a # reference return Device(self.context, self._libudev.udev_device_ref(parent)) @property def children(self): """ Yield all direct children of this device. .. note:: As the underlying library does not provide any means to directly query the children of a device, this property performs a linear search through all devices. Return an iterable yielding a :class:`Device` object for each direct child of this device. .. udevversion:: 172 .. versionchanged:: 0.13 Requires udev version 172 now. """ for device in self.context.list_devices().match_parent(self): if device != self: yield device def find_parent(self, subsystem, device_type=None): """ Find the parent device with the given ``subsystem`` and ``device_type``. ``subsystem`` is a byte or unicode string containing the name of the subsystem, in which to search for the parent. ``device_type`` is a byte or unicode string holding the expected device type of the parent. It can be ``None`` (the default), which means, that no specific device type is expected. Return a parent :class:`Device` within the given ``subsystem`` and – if ``device_type`` is not ``None`` – with the given ``device_type``, or ``None``, if this device has no parent device matching these constraints. .. versionadded:: 0.9 """ subsystem = ensure_byte_string(subsystem) if device_type is not None: device_type = ensure_byte_string(device_type) parent = self._libudev.udev_device_get_parent_with_subsystem_devtype( self, subsystem, device_type) if not parent: return None # parent device is not referenced, thus forcibly acquire a reference return Device(self.context, self._libudev.udev_device_ref(parent)) def traverse(self): """ Traverse all parent devices of this device from bottom to top. Return an iterable yielding all parent devices as :class:`Device` objects, *not* including the current device. The last yielded :class:`Device` is the top of the device hierarchy. """ parent = self.parent while parent: yield parent parent = parent.parent @property def sys_path(self): """ Absolute path of this device in ``sysfs`` including the ``sysfs`` mount point as unicode string. """ return ensure_unicode_string( self._libudev.udev_device_get_syspath(self)) @property def device_path(self): """ Kernel device path as unicode string. This path uniquely identifies a single device. Unlike :attr:`sys_path`, this path does not contain the ``sysfs`` mount point. However, the path is absolute and starts with a slash ``'/'``. """ return ensure_unicode_string( self._libudev.udev_device_get_devpath(self)) @property def subsystem(self): """ Name of the subsystem this device is part of as unicode string. """ return ensure_unicode_string( self._libudev.udev_device_get_subsystem(self)) @property def sys_name(self): """ Device file name inside ``sysfs`` as unicode string. """ return ensure_unicode_string( self._libudev.udev_device_get_sysname(self)) @property def sys_number(self): """ The trailing number of the :attr:`sys_name` as unicode string, or ``None``, if the device has no trailing number in its name. .. note:: The number is returned as unicode string to preserve the exact format of the number, especially any leading zeros: >>> device = pyudev.Device.from_path(ctx, '/sys/devices/LNXSYSTM:00') >>> device.sys_number u'00' To work with numbers, explicitly convert them to ints: >>> int(device.sys_number) 0 .. versionadded:: 0.11 """ number = self._libudev.udev_device_get_sysnum(self) if number is not None: return ensure_unicode_string(number) @property def device_type(self): """ Device type as unicode string, or ``None``, if the device type is unknown. >>> context = Context() >>> for device in context.list_devices(subsystem='net'): ... '{0} - {1}'.format(device.sys_name, device.device_type or 'ethernet') ... u'eth0 - ethernet' u'wlan0 - wlan' u'lo - ethernet' u'vboxnet0 - ethernet' .. versionadded:: 0.10 """ device_type = self._libudev.udev_device_get_devtype(self) if device_type is not None: return ensure_unicode_string(device_type) @property def driver(self): """ The driver name as unicode string, or ``None``, if there is no driver for this device. .. versionadded:: 0.5 """ driver = self._libudev.udev_device_get_driver(self) if driver: return ensure_unicode_string(driver) @property def device_node(self): """ Absolute path to the device node of this device as unicode string or ``None``, if this device doesn't have a device node. The path includes the device directory (see :attr:`Context.device_path`). This path always points to the actual device node associated with this device, and never to any symbolic links to this device node. See :attr:`device_links` to get a list of symbolic links to this device node. .. warning:: For devices created with :meth:`from_device_file()`, the value of this property is not necessary equal to the ``filename`` given to :meth:`from_device_file()`. """ node = self._libudev.udev_device_get_devnode(self) if node: return ensure_unicode_string(node) @property def device_number(self): """ The device number of the associated device as integer, or ``0``, if no device number is associated. Use :func:`os.major` and :func:`os.minor` to decompose the device number into its major and minor number: >>> context = Context() >>> sda = Device.from_name(context, 'block', 'sda') >>> sda.device_number 2048L >>> (os.major(sda.device_number), os.minor(sda.device_number)) (8, 0) For devices with an associated :attr:`device_node`, this is the same as the ``st_rdev`` field of the stat result of the :attr:`device_node`: >>> os.stat(sda.device_node).st_rdev 2048 .. versionadded:: 0.11 """ return self._libudev.udev_device_get_devnum(self) @property def is_initialized(self): """ ``True``, if the device is initialized, ``False`` otherwise. A device is initialized, if udev has already handled this device and has set up device node permissions and context, or renamed a network device. Consequently, this property is only implemented for devices with a device node or for network devices. On all other devices this property is always ``True``. It is *not* recommended, that you use uninitialized devices. .. seealso:: :attr:`time_since_initialized` .. udevversion:: 165 .. versionadded:: 0.8 """ return bool(self._libudev.udev_device_get_is_initialized(self)) @property def time_since_initialized(self): """ The time elapsed since initialization as :class:`~datetime.timedelta`. This property is only implemented on devices, which need to store properties in the udev database. On all other devices this property is simply zero :class:`~datetime.timedelta`. .. seealso:: :attr:`is_initialized` .. udevversion:: 165 .. versionadded:: 0.8 """ microseconds = self._libudev.udev_device_get_usec_since_initialized( self) return timedelta(microseconds=microseconds) @property def device_links(self): """ An iterator, which yields the absolute paths (including the device directory, see :attr:`Context.device_path`) of all symbolic links pointing to the :attr:`device_node` of this device. The paths are unicode strings. UDev can create symlinks to the original device node (see :attr:`device_node`) inside the device directory. This is often used to assign a constant, fixed device node to devices like removeable media, which technically do not have a constant device node, or to map a single device into multiple device hierarchies. The property provides access to all such symbolic links, which were created by UDev for this device. """ devlinks = self._libudev.udev_device_get_devlinks_list_entry(self) for name, _ in udev_list_iterate(self._libudev, devlinks): yield ensure_unicode_string(name) @property def attributes(self): """ The system attributes of this device as read-only :class:`Attributes` mapping. System attributes are basically normal files inside the the device directory. These files contain all sorts of information about the device, which may not be reflected by properties. These attributes are commonly used for matching in udev rules, and can be printed using ``udevadm info --attribute-walk``. The values of these attributes are not always proper strings, and can contain arbitrary bytes. .. versionadded:: 0.5 """ # do *not* cache the created object in an attribute of this class. # Doing so creates an uncollectable reference cycle between Device and # Attributes, because Attributes refers to this object through # Attributes.device. return Attributes(self) @property def tags(self): """ A :class:`Tags` object representing the tags attached to this device. The :class:`Tags` object supports a test for a single tag as well as iteration over all tags: >>> 'systemd' in device.tags True >>> list(device.tags) [u'systemd', u'seat'] Tags are arbitrary classifiers that can be attached to devices by udev scripts and daemons. For instance, systemd_ uses tags for multi-seat_ support. .. _systemd: http://freedesktop.org/wiki/Software/systemd .. _multi-seat: http://www.freedesktop.org/wiki/Software/systemd/multiseat .. udevversion:: 154 .. versionadded:: 0.6 .. versionchanged:: 0.13 Return a :class:`Tags` object now. """ return Tags(self) def __iter__(self): """ Iterate over the names of all properties defined for this device. Return a generator yielding the names of all properties of this device as unicode strings. """ properties = self._libudev.udev_device_get_properties_list_entry(self) for name, _ in udev_list_iterate(self._libudev, properties): yield ensure_unicode_string(name) def __len__(self): """ Return the amount of properties defined for this device as integer. """ properties = self._libudev.udev_device_get_properties_list_entry(self) return sum(1 for _ in udev_list_iterate(self._libudev, properties)) def __getitem__(self, property): """ Get the given ``property`` from this device. ``property`` is a unicode or byte string containing the name of the property. Return the property value as unicode string, or raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device. """ value = self._libudev.udev_device_get_property_value( self, ensure_byte_string(property)) if value is None: raise KeyError(property) return ensure_unicode_string(value) def asint(self, property): """ Get the given ``property`` from this device as integer. ``property`` is a unicode or byte string containing the name of the property. Return the property value as integer. Raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device, or a :exc:`~exceptions.ValueError`, if the property value cannot be converted to an integer. """ return int(self[property]) def asbool(self, property): """ Get the given ``property`` from this device as boolean. A boolean property has either a value of ``'1'`` or of ``'0'``, where ``'1'`` stands for ``True``, and ``'0'`` for ``False``. Any other value causes a :exc:`~exceptions.ValueError` to be raised. ``property`` is a unicode or byte string containing the name of the property. Return ``True``, if the property value is ``'1'`` and ``False``, if the property value is ``'0'``. Any other value raises a :exc:`~exceptions.ValueError`. Raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device. """ return string_to_bool(self[property]) def __hash__(self): return hash(self.device_path) def __eq__(self, other): if isinstance(other, Device): return self.device_path == other.device_path else: return self.device_path == other def __ne__(self, other): if isinstance(other, Device): return self.device_path != other.device_path else: return self.device_path != other def __gt__(self, other): raise TypeError('Device not orderable') def __lt__(self, other): raise TypeError('Device not orderable') def __le__(self, other): raise TypeError('Device not orderable') def __ge__(self, other): raise TypeError('Device not orderable') class Tags(Iterable, Container): """ A iterable over :class:`Device` tags. Subclasses the ``Container`` and the ``Iterable`` ABC. """ def __init__(self, device): self.device = device def _has_tag(self, tag): if hasattr(self._libudev, 'udev_device_has_tag'): return bool(self._libudev.udev_device_has_tag( self.device, ensure_byte_string(tag))) else: return any(t == tag for t in self) @property def _libudev(self): return self.device._libudev def __contains__(self, tag): """ Check for existence of ``tag``. ``tag`` is a tag as unicode string. Return ``True``, if ``tag`` is attached to the device, ``False`` otherwise. """ return self._has_tag(tag) def __iter__(self): """ Iterate over all tags. Yield each tag as unicode string. """ tags = self._libudev.udev_device_get_tags_list_entry(self.device) for tag, _ in udev_list_iterate(self._libudev, tags): yield ensure_unicode_string(tag) def _is_attribute_file(filepath): """ Check, if ``filepath`` points to a valid udev attribute filename. Implementation is stolen from udev source code, ``print_all_attributes`` in ``udev/udevadm-info.c``. It excludes hidden files (starting with a dot), the special files ``dev`` and ``uevent`` and links. Return ``True``, if ``filepath`` refers to an attribute, ``False`` otherwise. """ filename = os.path.basename(filepath) return not (filename.startswith('.') or filename in ('dev', 'uevent') or os.path.islink(filepath)) class Attributes(Mapping): """ A mapping which holds udev attributes for :class:`Device` objects. This class subclasses the ``Mapping`` ABC, providing a read-only dictionary mapping attribute names to the corresponding values. Therefore all well-known dicitionary methods and operators (e.g. ``.keys()``, ``.items()``, ``in``) are available to access device attributes. .. versionadded:: 0.5 """ def __init__(self, device): self.device = device self._libudev = device._libudev def _get_attributes(self): if hasattr(self._libudev, 'udev_device_get_sysattr_list_entry'): attrs = self._libudev.udev_device_get_sysattr_list_entry( self.device) for attribute, _ in udev_list_iterate(self._libudev, attrs): yield ensure_unicode_string(attribute) else: sys_path = self.device.sys_path for filename in os.listdir(sys_path): filepath = os.path.join(sys_path, filename) if _is_attribute_file(filepath): yield filename def __len__(self): """ Return the amount of attributes defined. """ return sum(1 for _ in self._get_attributes()) def __iter__(self): """ Iterate over all attributes defined. Yield each attribute name as unicode string. """ return self._get_attributes() def __contains__(self, attribute): value = self._libudev.udev_device_get_sysattr_value( self.device, ensure_byte_string(attribute)) return value is not None def __getitem__(self, attribute): """ Get the given system ``attribute`` for the device. ``attribute`` is a unicode or byte string containing the name of the system attribute. Return the attribute value as byte string, or raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device. """ value = self._libudev.udev_device_get_sysattr_value( self.device, ensure_byte_string(attribute)) if value is None: raise KeyError(attribute) return value def asstring(self, attribute): """ Get the given ``atribute`` for the device as unicode string. Depending on the content of the attribute, this may or may not work. Be prepared to catch :exc:`~exceptions.UnicodeDecodeError`. ``attribute`` is a unicode or byte string containing the name of the attribute. Return the attribute value as byte string. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device, or :exc:`~exceptions.UnicodeDecodeError`, if the content of the attribute cannot be decoded into a unicode string. """ return ensure_unicode_string(self[attribute]) def asint(self, attribute): """ Get the given ``attribute`` as integer. ``attribute`` is a unicode or byte string containing the name of the attribute. Return the attribute value as integer. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device, or a :exc:`~exceptions.ValueError`, if the attribute value cannot be converted to an integer. """ return int(self.asstring(attribute)) def asbool(self, attribute): """ Get the given ``attribute`` from this device as boolean. A boolean attribute has either a value of ``'1'`` or of ``'0'``, where ``'1'`` stands for ``True``, and ``'0'`` for ``False``. Any other value causes a :exc:`~exceptions.ValueError` to be raised. ``attribute`` is a unicode or byte string containing the name of the attribute. Return ``True``, if the attribute value is ``'1'`` and ``False``, if the attribute value is ``'0'``. Any other value raises a :exc:`~exceptions.ValueError`. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device. """ return string_to_bool(self.asstring(attribute)) PK[mשׂ;;site-packages/pyudev/core.pyonu[ ݹYc@`sdZddlmZmZmZmZyddlmZWn!ek r_ddl mZnXddl m Z ddl m Z ddlmZmZmZmZddd gZd Zd efd YZd efdYZdS(u pyudev.core =========== Core types and functions of :mod:`pyudev`. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_import(t check_output(tDevice(tload_udev_library(tensure_unicode_stringtensure_byte_stringtudev_list_iteratetproperty_value_to_bytesu udev_versionuContextu EnumeratorcC`s(ttddg}t|jS(ul Get the version of the underlying udev library. udev doesn't use a standard major-minor versioning scheme, but instead labels releases with a single consecutive number. Consequently, the version number returned by this function is a single integer, and not a tuple (like for instance the interpreter version in :data:`sys.version_info`). As libudev itself does not provide a function to query the version number, this function calls the ``udevadm`` utilitiy, so be prepared to catch :exc:`~exceptions.EnvironmentError` and :exc:`~subprocess.CalledProcessError` if you call this function. Return the version number as single integer. Raise :exc:`~exceptions.ValueError`, if the version number retrieved from udev could not be converted to an integer. Raise :exc:`~exceptions.EnvironmentError`, if ``udevadm`` was not found, or could not be executed. Raise :exc:`subprocess.CalledProcessError`, if ``udevadm`` returned a non-zero exit code. On Python 2.7 or newer, the ``output`` attribute of this exception is correctly set. .. versionadded:: 0.8 uudevadmu --version(RRtinttstrip(toutput((s//usr/lib/python2.7/site-packages/pyudev/core.pyt udev_version.stContextcB`sweZdZdZdZedZedZedZedZ e j dZ dZ RS( u The udev context. This is *the* central object to access udev. An instance of this class must be created before anything else can be done. It holds the udev configuration and provides the interface to list devices (see :meth:`list_devices`). Instances of this class can directly be given as ``udev *`` to functions wrapped through :mod:`ctypes`. cC`s"t|_|jj|_dS(u' Create a new context. N(Rt_libudevtudev_newt_as_parameter_(tself((s//usr/lib/python2.7/site-packages/pyudev/core.pyt__init__Xs cC`s|jj|dS(N(Rt udev_unref(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyt__del___scC`st|jj|S(u The ``sysfs`` mount point defaulting to ``/sys'`` as unicode string. The mount point can be overwritten using the environment variable :envvar:`SYSFS_PATH`. Use this for testing purposes. (RRtudev_get_sys_path(R((s//usr/lib/python2.7/site-packages/pyudev/core.pytsys_pathbscC`st|jj|S(u The device directory path defaulting to ``/dev`` as unicode string. This can be overridden in the udev configuration. (RRtudev_get_dev_path(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyt device_pathlscC`st|jj|S(u The run runtime directory path defaulting to ``/run`` as unicode string. .. udevversion:: 167 .. versionadded:: 0.10 (RRtudev_get_run_path(R((s//usr/lib/python2.7/site-packages/pyudev/core.pytrun_pathus cC`s|jj|S(u  The logging priority of the interal logging facitility of udev as integer with a standard :mod:`syslog` priority. Assign to this property to change the logging priority. UDev uses the standard :mod:`syslog` priorities. Constants for these priorities are defined in the :mod:`syslog` module in the standard library: >>> import syslog >>> context = pyudev.Context() >>> context.log_priority = syslog.LOG_DEBUG .. versionadded:: 0.9 (Rtudev_get_log_priority(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyt log_priorityscC`s|jj||dS(N(Rtudev_set_log_priority(Rtvalue((s//usr/lib/python2.7/site-packages/pyudev/core.pyRscK`st|j|S(u! List all available devices. The arguments of this method are the same as for :meth:`Enumerator.match()`. In fact, the arguments are simply passed straight to method :meth:`~Enumerator.match()`. This function creates and returns an :class:`Enumerator` object, that can be used to filter the list of devices, and eventually retrieve :class:`Device` objects representing matching devices. .. versionchanged:: 0.8 Accept keyword arguments now for easy matching (t Enumeratortmatch(Rtkwargs((s//usr/lib/python2.7/site-packages/pyudev/core.pyt list_devicess( t__name__t __module__t__doc__RRtpropertyRRRRtsetterR$(((s//usr/lib/python2.7/site-packages/pyudev/core.pyRKs      R!cB`sweZdZdZdZdZedZdZdZ edZ dZ d Z d Z d ZRS( u Enumerate all available devices. To retrieve devices, simply iterate over an instance of this class. This operation yields :class:`Device` objects representing the available devices. Before iteration the device list can be filtered by subsystem or by property values using :meth:`match_subsystem` and :meth:`match_property`. Multiple subsystem (property) filters are combined using a logical OR, filters of different types are combined using a logical AND. The following filter for instance:: devices.match_subsystem('block').match_property( 'ID_TYPE', 'disk').match_property('DEVTYPE', 'disk') means the following:: subsystem == 'block' and (ID_TYPE == 'disk' or DEVTYPE == 'disk') Once added, a filter cannot be removed anymore. Create a new object instead. Instances of this class can directly be given as given ``udev_enumerate *`` to functions wrapped through :mod:`ctypes`. cC`sLt|tstdn||_|jj||_|j|_dS(u Create a new enumerator with the given ``context`` (a :class:`Context` instance). While you can create objects of this class directly, this is not recommended. Call :method:`Context.list_devices()` instead. uInvalid context objectN(t isinstanceRt TypeErrortcontextRtudev_enumerate_newR(RR,((s//usr/lib/python2.7/site-packages/pyudev/core.pyRs  cC`s|jj|dS(N(Rtudev_enumerate_unref(R((s//usr/lib/python2.7/site-packages/pyudev/core.pyRscK`s|jdd}|dk r.|j|n|jdd}|dk r\|j|n|jdd}|dk r|j|n|jdd}|dk r|j|nx*|jD]\}}|j||qW|S(u3 Include devices according to the rules defined by the keyword arguments. These keyword arguments are interpreted as follows: - The value for the keyword argument ``subsystem`` is forwarded to :meth:`match_subsystem()`. - The value for the keyword argument ``sys_name`` is forwared to :meth:`match_sys_name()`. - The value for the keyword argument ``tag`` is forwared to :meth:`match_tag()`. - The value for the keyword argument ``parent`` is forwared to :meth:`match_parent()`. - All other keyword arguments are forwareded one by one to :meth:`match_property()`. The keyword argument itself is interpreted as property name, the value of the keyword argument as the property value. All keyword arguments are optional, calling this method without no arguments at all is simply a noop. Return the instance again. .. versionadded:: 0.8 .. versionchanged:: 0.13 Added ``parent`` keyword u subsystemusys_nameutaguparentN(tpoptNonetmatch_subsystemtmatch_sys_namet match_tagt match_parentt iteritemstmatch_property(RR#t subsystemtsys_namettagtparentR(R ((s//usr/lib/python2.7/site-packages/pyudev/core.pyR"s    cC`s5|s|jjn |jj}||t||S(u Include all devices, which are part of the given ``subsystem``. ``subsystem`` is either a unicode string or a byte string, containing the name of the subsystem. If ``nomatch`` is ``True`` (default is ``False``), the match is inverted: A device is only included if it is *not* part of the given ``subsystem``. Return the instance again. (Rt"udev_enumerate_add_match_subsystemt$udev_enumerate_add_nomatch_subsystemR(RR7tnomatchR"((s//usr/lib/python2.7/site-packages/pyudev/core.pyR1s  cC`s|jj|t||S(u Include all devices with the given name. ``sys_name`` is a byte or unicode string containing the device name. Return the instance again. .. versionadded:: 0.8 (Rt udev_enumerate_add_match_sysnameR(RR8((s//usr/lib/python2.7/site-packages/pyudev/core.pyR2s cC`s&|jj|t|t||S(u Include all devices, whose ``property`` has the given ``value``. ``property`` is either a unicode string or a byte string, containing the name of the property to match. ``value`` is a property value, being one of the following types: - :func:`int` - :func:`bool` - A byte string - Anything convertable to a unicode string (including a unicode string itself) Return the instance again. (Rt!udev_enumerate_add_match_propertyRR (RR(R ((s//usr/lib/python2.7/site-packages/pyudev/core.pyR6"s cC`s>|s|jjn |jj}||t|t||S(u Include all devices, whose ``attribute`` has the given ``value``. ``attribute`` is either a unicode string or a byte string, containing the name of a sys attribute to match. ``value`` is an attribute value, being one of the following types: - :func:`int`, - :func:`bool` - A byte string - Anything convertable to a unicode string (including a unicode string itself) If ``nomatch`` is ``True`` (default is ``False``), the match is inverted: A device is include if the ``attribute`` does *not* match the given ``value``. .. note:: If ``nomatch`` is ``True``, devices which do not have the given ``attribute`` at all are also included. In other words, with ``nomatch=True`` the given ``attribute`` is *not* guaranteed to exist on all returned devices. Return the instance again. (Rt udev_enumerate_add_match_sysattrt"udev_enumerate_add_nomatch_sysattrRR (Rt attributeR R=R"((s//usr/lib/python2.7/site-packages/pyudev/core.pytmatch_attribute6s   cC`s|jj|t||S(u Include all devices, which have the given ``tag`` attached. ``tag`` is a byte or unicode string containing the tag name. Return the instance again. .. udevversion:: 154 .. versionadded:: 0.6 (Rtudev_enumerate_add_match_tagR(RR9((s//usr/lib/python2.7/site-packages/pyudev/core.pyR3Xs cC`s|jj||S(u Include only devices, which are initialized. Initialized devices have properly set device node permissions and context, and are (in case of network devices) fully renamed. Currently this will not affect devices which do not have device nodes and are not network interfaces. Return the instance again. .. seealso:: :attr:`Device.is_initialized` .. udevversion:: 165 .. versionadded:: 0.8 (Rt'udev_enumerate_add_match_is_initialized(R((s//usr/lib/python2.7/site-packages/pyudev/core.pytmatch_is_initializedgscC`s|jj|||S(u  Include all devices on the subtree of the given ``parent`` device. The ``parent`` device itself is also included. ``parent`` is a :class:`~pyudev.Device`. Return the instance again. .. udevversion:: 172 .. versionadded:: 0.13 (Rtudev_enumerate_add_match_parent(RR:((s//usr/lib/python2.7/site-packages/pyudev/core.pyR4|scc`s]|jj||jj|}x4t|j|D] \}}tj|j|Vq5WdS(u\ Iterate over all matching devices. Yield :class:`Device` objects. N(Rtudev_enumerate_scan_devicestudev_enumerate_get_list_entryR Rt from_sys_pathR,(Rtentrytnamet_((s//usr/lib/python2.7/site-packages/pyudev/core.pyt__iter__s(R%R&R'RRR"tFalseR1R2R6RCR3RFR4RN(((s//usr/lib/python2.7/site-packages/pyudev/core.pyR!s   ,    "   N(R't __future__RRRRt subprocessRt ImportErrortpyudev._compatt pyudev.deviceRtpyudev._libudevRt pyudev._utilRRR R t__all__RtobjectRR!(((s//usr/lib/python2.7/site-packages/pyudev/core.pyts" " _PK[~bWsite-packages/pyudev/device.pycnu[ ݹYc@`sfdZddlmZmZmZmZddlZddlmZm Z m Z ddl m Z ddl mZmZmZmZmZddd d d d d dgZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZde e fdYZdZdefdYZdS( u pyudev.device ============= Device class implementation of :mod:`pyudev`. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importN(tMappingt ContainertIterable(t timedelta(tensure_byte_stringtensure_unicode_stringtudev_list_iteratetstring_to_booltget_device_typeuDeviceu AttributesuTagsuDeviceNotFoundErroruDeviceNotFoundAtPathErroruDeviceNotFoundByNameErroruDeviceNotFoundByNumberErroru DeviceNotFoundInEnvironmentErrortDeviceNotFoundErrorcB`seZdZRS(u An error indicating that no :class:`Device` was found. .. versionchanged:: 0.5 Renamed from ``NoSuchDeviceError`` to its current name. (t__name__t __module__t__doc__(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR .stDeviceNotFoundAtPathErrorcB`s/eZdZdZedZdZRS(uh A :exc:`DeviceNotFoundError` indicating that no :class:`Device` was found at a given path. cC`stj||dS(N(R t__init__(tselftsys_path((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR=scC`s |jdS(u< The path that caused this error as string. i(targs(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR@scC`sdj|jS(NuNo device at {0!r}(tformatR(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__str__Gs(RRRRtpropertyRR(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR7s tDeviceNotFoundByNameErrorcB`s>eZdZdZedZedZdZRS(uj A :exc:`DeviceNotFoundError` indicating that no :class:`Device` was found with a given name. cC`stj|||dS(N(R R(Rt subsystemtsys_name((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRQscC`s |jdS(uA The subsystem that caused this error as string. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRTscC`s |jdS(u@ The sys name that caused this error as string. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRcC`s dj|S(Nu+No device {0.sys_name!r} in {0.subsystem!r}(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRbs(RRRRRRRR(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRKs  tDeviceNotFoundByNumberErrorcB`s>eZdZdZedZedZdZRS(us A :exc:`DeviceNotFoundError` indicating, that no :class:`Device` was found for a given device number. cC`stj|||dS(N(R R(Rttypetnumber((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRlscC`s |jdS(uj The device type causing this error as string. Either ``'char'`` or ``'block'``. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_typeoscC`s |jdS(uB The device number causing this error as integer. i(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_numberwscC`s dj|S(Nu7No {0.device_type} device with number {0.device_number}(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR~s(RRRRRRR R(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRfs  t DeviceNotFoundInEnvironmentErrorcB`seZdZdZRS(u A :exc:`DeviceNotFoundError` indicating, that no :class:`Device` could be constructed from the process environment. cC`sdS(NuNo device found in environment((R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRs(RRRR(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR!stDevicecB`seZdZedZedZedZedZedZedZ dZ dZ d Z e d Ze d Zd(d Zd Ze dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZe dZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d$Z)d%Z*d&Z+d'Z,RS()u A single device with attached attributes and properties. This class subclasses the ``Mapping`` ABC, providing a read-only dictionary mapping property names to the corresponding values. Therefore all well-known dicitionary methods and operators (e.g. ``.keys()``, ``.items()``, ``in``) are available to access device properties. Aside of the properties, a device also has a set of udev-specific attributes like the path inside ``sysfs``. :class:`Device` objects compare equal and unequal to other devices and to strings (based on :attr:`device_path`). However, there is no ordering on :class:`Device` objects, and the corresponding operators ``>``, ``<``, ``<=`` and ``>=`` raise :exc:`~exceptions.TypeError`. .. warning:: Do **never** use object identity (``is`` operator) to compare :class:`Device` objects. :mod:`pyudev` may create multiple :class:`Device` objects for the same device. Instead simply compare devices by value using ``==`` or ``!=``. :class:`Device` objects are hashable and can therefore be used as keys in dictionaries and sets. They can also be given directly as ``udev_device *`` to functions wrapped through :mod:`ctypes`. cC`sI|j|js9tjj|j|jtj}n|j||S(u Create a device from a device ``path``. The ``path`` may or may not start with the ``sysfs`` mount point: >>> context = pyudev.Context() >>> Device.from_path(context, '/devices/platform') Device(u'/sys/devices/platform') >>> Device.from_path(context, '/sys/devices/platform') Device(u'/sys/devices/platform') ``context`` is the :class:`Context` in which to search the device. ``path`` is a device path as unicode or byte string. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundAtPathError`, if no device was found for ``path``. .. versionadded:: 0.4 (t startswithRtostpathtjointlstriptsept from_sys_path(tclstcontextR%((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt from_paths'cC`s=|jj|t|}|s0t|n|||S(u` Create a new device from a given ``sys_path``: >>> context = pyudev.Context() >>> Device.from_path(context, '/sys/devices/platform') Device(u'/sys/devices/platform') ``context`` is the :class:`Context` in which to search the device. ``sys_path`` is a unicode or byte string containing the path of the device inside ``sysfs`` with the mount point included. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundAtPathError`, if no device was found for ``sys_path``. .. versionchanged:: 0.4 Raise :exc:`NoSuchDeviceError` instead of returning ``None``, if no device was found for ``sys_path`` .. versionchanged:: 0.5 Raise :exc:`DeviceNotFoundAtPathError` instead of :exc:`NoSuchDeviceError` (t_libudevtudev_device_new_from_syspathRR(R*R+Rtdevice((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR)s  cC`sI|jj|t|t|}|s<t||n|||S(u Create a new device from a given ``subsystem`` and a given ``sys_name``: >>> context = pyudev.Context() >>> sda = pyudev.Device.from_name(context, 'block', 'sda') >>> sda Device(u'/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda') >>> sda == pyudev.Device.from_path(context, '/block/sda') ``context`` is the :class:`Context` in which to search the device. ``subsystem`` and ``sys_name`` are byte or unicode strings, which denote the subsystem and the name of the device to create. Return a :class:`Device` object for the device. Raise :exc:`DeviceNotFoundByNameError`, if no device was found with the given name. .. versionadded:: 0.5 (R-t&udev_device_new_from_subsystem_sysnameRR(R*R+RRR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt from_names   cC`sk|dkr$tdj|n|jj|t|d|}|s^t||n|||S(u Create a new device from a device ``number`` with the given device ``type``: >>> import os >>> ctx = Context() >>> major, minor = 8, 0 >>> device = Device.from_device_number(context, 'block', ... os.makedev(major, minor)) >>> device Device(u'/sys/devices/pci0000:00/0000:00:11.0/host0/target0:0:0/0:0:0:0/block/sda') >>> os.major(device.device_number), os.minor(device.device_number) (8, 0) Use :func:`os.makedev` to construct a device number from a major and a minor device number, as shown in the example above. .. note:: Device numbers are not unique across different device types. Passing a correct number with a wrong type may silently yield a wrong device object, so make sure to pass the correct device type. ``context`` is the :class:`Context`, in which to search the device. ``type`` is either ``'char'`` or ``'block'``, according to whether the device is a character or block device. ``number`` is the device number as integer. Return a :class:`Device` object for the device with the given device ``number``. Raise :exc:`DeviceNotFoundByNumberError`, if no device was found with the given device type and number. Raise :exc:`~exceptions.ValueError`, if ``type`` is any other string than ``'char'`` or ``'block'``. .. versionadded:: 0.11 ucharublocku6Invalid type: {0!r}. Must be one of "char" or "block".i(ucharublock(t ValueErrorRR-tudev_device_new_from_devnumRR(R*R+RRR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pytfrom_device_numbers&   cC`s1t|}tj|j}|j|||S(u Create a new device from the given device file: >>> context = Context() >>> device = Device.from_device_file(context, '/dev/sda') >>> device Device(u'/sys/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0/2:0:0:0/block/sda') >>> device.device_node u'/dev/sda' .. warning:: Though the example seems to suggest that ``device.device_node == filename`` holds with ``device = Device.from_device_file(context, filename)``, this is only true in a majority of cases. There *can* be devices, for which this relation is actually false! Thus, do *not* expect :attr:`~Device.device_node` to be equal to the given ``filename`` for the returned :class:`Device`. Especially, use :attr:`~Device.device_node` if you need the device file of a :class:`Device` created with this method afterwards. ``context`` is the :class:`Context` in which to search the device. ``filename`` is a string containing the path of a device file. Return a :class:`Device` representing the given device file. Raise :exc:`~exceptions.ValueError` if ``filename`` is no device file at all. Raise :exc:`~exceptions.EnvironmentError` if ``filename`` does not exist or if its metadata was inaccessible. .. versionadded:: 0.15 (R R$tstattst_rdevR4(R*R+tfilenameRR ((s1/usr/lib/python2.7/site-packages/pyudev/device.pytfrom_device_file/s! cC`s1|jj|}|s$tn|||S(u Create a new device from the process environment (as in :data:`os.environ`). This only works reliable, if the current process is called from an udev rule, and is usually used for tools executed from ``IMPORT=`` rules. Use this method to create device objects in Python scripts called from udev rules. ``context`` is the library :class:`Context`. Return a :class:`Device` object constructed from the environment. Raise :exc:`DeviceNotFoundInEnvironmentError`, if no device could be created from the environment. .. udevversion:: 152 .. versionadded:: 0.6 (R-t udev_device_new_from_environmentR!(R*R+R/((s1/usr/lib/python2.7/site-packages/pyudev/device.pytfrom_environmentUs cC`s"||_||_|j|_dS(N(R+t_as_parameter_R-(RR+t_device((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRos  cC`s|jj|dS(N(R-tudev_device_unref(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__del__tscC`s dj|S(NuDevice({0.sys_path!r})(R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__repr__wscC`s8|jj|}|sdSt|j|jj|S(u_ The parent :class:`Device` or ``None``, if there is no parent device. N(R-tudev_device_get_parenttNoneR"R+tudev_device_ref(Rtparent((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRCzscc`s;x4|jjj|D]}||kr|VqqWdS(u Yield all direct children of this device. .. note:: As the underlying library does not provide any means to directly query the children of a device, this property performs a linear search through all devices. Return an iterable yielding a :class:`Device` object for each direct child of this device. .. udevversion:: 172 .. versionchanged:: 0.13 Requires udev version 172 now. N(R+t list_devicest match_parent(RR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pytchildrens cC`set|}|dk r't|}n|jj|||}|sIdSt|j|jj|S(u Find the parent device with the given ``subsystem`` and ``device_type``. ``subsystem`` is a byte or unicode string containing the name of the subsystem, in which to search for the parent. ``device_type`` is a byte or unicode string holding the expected device type of the parent. It can be ``None`` (the default), which means, that no specific device type is expected. Return a parent :class:`Device` within the given ``subsystem`` and – if ``device_type`` is not ``None`` – with the given ``device_type``, or ``None``, if this device has no parent device matching these constraints. .. versionadded:: 0.9 N(RRAR-t-udev_device_get_parent_with_subsystem_devtypeR"R+RB(RRRRC((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt find_parents   cc`s(|j}x|r#|V|j}q WdS(u Traverse all parent devices of this device from bottom to top. Return an iterable yielding all parent devices as :class:`Device` objects, *not* including the current device. The last yielded :class:`Device` is the top of the device hierarchy. N(RC(RRC((s1/usr/lib/python2.7/site-packages/pyudev/device.pyttraverses  cC`st|jj|S(uz Absolute path of this device in ``sysfs`` including the ``sysfs`` mount point as unicode string. (R R-tudev_device_get_syspath(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRscC`st|jj|S(u Kernel device path as unicode string. This path uniquely identifies a single device. Unlike :attr:`sys_path`, this path does not contain the ``sysfs`` mount point. However, the path is absolute and starts with a slash ``'/'``. (R R-tudev_device_get_devpath(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_paths cC`st|jj|S(uQ Name of the subsystem this device is part of as unicode string. (R R-tudev_device_get_subsystem(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRscC`st|jj|S(uF Device file name inside ``sysfs`` as unicode string. (R R-tudev_device_get_sysname(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRscC`s,|jj|}|dk r(t|SdS(uO The trailing number of the :attr:`sys_name` as unicode string, or ``None``, if the device has no trailing number in its name. .. note:: The number is returned as unicode string to preserve the exact format of the number, especially any leading zeros: >>> device = pyudev.Device.from_path(ctx, '/sys/devices/LNXSYSTM:00') >>> device.sys_number u'00' To work with numbers, explicitly convert them to ints: >>> int(device.sys_number) 0 .. versionadded:: 0.11 N(R-tudev_device_get_sysnumRAR (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt sys_numbers cC`s,|jj|}|dk r(t|SdS(u Device type as unicode string, or ``None``, if the device type is unknown. >>> context = Context() >>> for device in context.list_devices(subsystem='net'): ... '{0} - {1}'.format(device.sys_name, device.device_type or 'ethernet') ... u'eth0 - ethernet' u'wlan0 - wlan' u'lo - ethernet' u'vboxnet0 - ethernet' .. versionadded:: 0.10 N(R-tudev_device_get_devtypeRAR (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRs cC`s&|jj|}|r"t|SdS(u The driver name as unicode string, or ``None``, if there is no driver for this device. .. versionadded:: 0.5 N(R-tudev_device_get_driverR (Rtdriver((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRSscC`s&|jj|}|r"t|SdS(u Absolute path to the device node of this device as unicode string or ``None``, if this device doesn't have a device node. The path includes the device directory (see :attr:`Context.device_path`). This path always points to the actual device node associated with this device, and never to any symbolic links to this device node. See :attr:`device_links` to get a list of symbolic links to this device node. .. warning:: For devices created with :meth:`from_device_file()`, the value of this property is not necessary equal to the ``filename`` given to :meth:`from_device_file()`. N(R-tudev_device_get_devnodeR (Rtnode((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_node(scC`s|jj|S(u The device number of the associated device as integer, or ``0``, if no device number is associated. Use :func:`os.major` and :func:`os.minor` to decompose the device number into its major and minor number: >>> context = Context() >>> sda = Device.from_name(context, 'block', 'sda') >>> sda.device_number 2048L >>> (os.major(sda.device_number), os.minor(sda.device_number)) (8, 0) For devices with an associated :attr:`device_node`, this is the same as the ``st_rdev`` field of the stat result of the :attr:`device_node`: >>> os.stat(sda.device_node).st_rdev 2048 .. versionadded:: 0.11 (R-tudev_device_get_devnum(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR >scC`st|jj|S(ui ``True``, if the device is initialized, ``False`` otherwise. A device is initialized, if udev has already handled this device and has set up device node permissions and context, or renamed a network device. Consequently, this property is only implemented for devices with a device node or for network devices. On all other devices this property is always ``True``. It is *not* recommended, that you use uninitialized devices. .. seealso:: :attr:`time_since_initialized` .. udevversion:: 165 .. versionadded:: 0.8 (tboolR-tudev_device_get_is_initialized(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pytis_initializedXscC`s|jj|}td|S(u The time elapsed since initialization as :class:`~datetime.timedelta`. This property is only implemented on devices, which need to store properties in the udev database. On all other devices this property is simply zero :class:`~datetime.timedelta`. .. seealso:: :attr:`is_initialized` .. udevversion:: 165 .. versionadded:: 0.8 t microseconds(R-t&udev_device_get_usec_since_initializedR(RR[((s1/usr/lib/python2.7/site-packages/pyudev/device.pyttime_since_initializedos  cc`sD|jj|}x+t|j|D]\}}t|Vq%WdS(u An iterator, which yields the absolute paths (including the device directory, see :attr:`Context.device_path`) of all symbolic links pointing to the :attr:`device_node` of this device. The paths are unicode strings. UDev can create symlinks to the original device node (see :attr:`device_node`) inside the device directory. This is often used to assign a constant, fixed device node to devices like removeable media, which technically do not have a constant device node, or to map a single device into multiple device hierarchies. The property provides access to all such symbolic links, which were created by UDev for this device. N(R-t#udev_device_get_devlinks_list_entryR R (Rtdevlinkstnamet_((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt device_linksscC`s t|S(uT The system attributes of this device as read-only :class:`Attributes` mapping. System attributes are basically normal files inside the the device directory. These files contain all sorts of information about the device, which may not be reflected by properties. These attributes are commonly used for matching in udev rules, and can be printed using ``udevadm info --attribute-walk``. The values of these attributes are not always proper strings, and can contain arbitrary bytes. .. versionadded:: 0.5 (t Attributes(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt attributesscC`s t|S(u A :class:`Tags` object representing the tags attached to this device. The :class:`Tags` object supports a test for a single tag as well as iteration over all tags: >>> 'systemd' in device.tags True >>> list(device.tags) [u'systemd', u'seat'] Tags are arbitrary classifiers that can be attached to devices by udev scripts and daemons. For instance, systemd_ uses tags for multi-seat_ support. .. _systemd: http://freedesktop.org/wiki/Software/systemd .. _multi-seat: http://www.freedesktop.org/wiki/Software/systemd/multiseat .. udevversion:: 154 .. versionadded:: 0.6 .. versionchanged:: 0.13 Return a :class:`Tags` object now. (tTags(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyttagsscc`sD|jj|}x+t|j|D]\}}t|Vq%WdS(u Iterate over the names of all properties defined for this device. Return a generator yielding the names of all properties of this device as unicode strings. N(R-t%udev_device_get_properties_list_entryR R (Rt propertiesR`Ra((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__iter__scC`s2|jj|}tdt|j|DS(uU Return the amount of properties defined for this device as integer. cs`s|] }dVqdS(iN((t.0Ra((s1/usr/lib/python2.7/site-packages/pyudev/device.pys s(R-RgtsumR (RRh((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__len__scC`s@|jj|t|}|dkr6t|nt|S(uA Get the given ``property`` from this device. ``property`` is a unicode or byte string containing the name of the property. Return the property value as unicode string, or raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device. N(R-tudev_device_get_property_valueRRAtKeyErrorR (RRtvalue((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt __getitem__s  cC`st||S(u Get the given ``property`` from this device as integer. ``property`` is a unicode or byte string containing the name of the property. Return the property value as integer. Raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device, or a :exc:`~exceptions.ValueError`, if the property value cannot be converted to an integer. (tint(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pytasints cC`st||S(u Get the given ``property`` from this device as boolean. A boolean property has either a value of ``'1'`` or of ``'0'``, where ``'1'`` stands for ``True``, and ``'0'`` for ``False``. Any other value causes a :exc:`~exceptions.ValueError` to be raised. ``property`` is a unicode or byte string containing the name of the property. Return ``True``, if the property value is ``'1'`` and ``False``, if the property value is ``'0'``. Any other value raises a :exc:`~exceptions.ValueError`. Raise a :exc:`~exceptions.KeyError`, if the given property is not defined for this device. (R (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pytasboolscC`s t|jS(N(thashRL(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__hash__ scC`s0t|tr|j|jkS|j|kSdS(N(t isinstanceR"RL(Rtother((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__eq__scC`s0t|tr|j|jkS|j|kSdS(N(RvR"RL(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__ne__scC`stddS(NuDevice not orderable(t TypeError(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__gt__scC`stddS(NuDevice not orderable(Rz(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__lt__scC`stddS(NuDevice not orderable(Rz(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__le__"scC`stddS(NuDevice not orderable(Rz(RRw((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt__ge__%sN(-RRRt classmethodR,R)R1R4R8R:RR>R?RRCRFRARHRIRRLRRRPRRSRVR RZR]RbRdRfRiRlRpRrRsRuRxRyR{R|R}R~(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR"sP/&                   RecB`sAeZdZdZdZedZdZdZRS(uk A iterable over :class:`Device` tags. Subclasses the ``Container`` and the ``Iterable`` ABC. cC`s ||_dS(N(R/(RR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR0sc`sRt|jdr4t|jj|jtStfd|DSdS(Nuudev_device_has_tagc3`s|]}|kVqdS(N((Rjtt(ttag(s1/usr/lib/python2.7/site-packages/pyudev/device.pys 8s(thasattrR-RXtudev_device_has_tagR/Rtany(RR((Rs1/usr/lib/python2.7/site-packages/pyudev/device.pyt_has_tag3s cC`s |jjS(N(R/R-(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyR-:scC`s |j|S(u Check for existence of ``tag``. ``tag`` is a tag as unicode string. Return ``True``, if ``tag`` is attached to the device, ``False`` otherwise. (R(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt __contains__>s cc`sG|jj|j}x+t|j|D]\}}t|Vq(WdS(uS Iterate over all tags. Yield each tag as unicode string. N(R-tudev_device_get_tags_list_entryR/R R (RRfRRa((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRiIs( RRRRRRR-RRi(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRe)s    cC`s>tjj|}|jdp<|dkp<tjj| S(uy Check, if ``filepath`` points to a valid udev attribute filename. Implementation is stolen from udev source code, ``print_all_attributes`` in ``udev/udevadm-info.c``. It excludes hidden files (starting with a dot), the special files ``dev`` and ``uevent`` and links. Return ``True``, if ``filepath`` refers to an attribute, ``False`` otherwise. u.udevuuevent(udevuuevent(R$R%tbasenameR#tislink(tfilepathR7((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt_is_attribute_fileTs  RccB`s_eZdZdZdZdZdZdZdZdZ dZ d Z RS( u A mapping which holds udev attributes for :class:`Device` objects. This class subclasses the ``Mapping`` ABC, providing a read-only dictionary mapping attribute names to the corresponding values. Therefore all well-known dicitionary methods and operators (e.g. ``.keys()``, ``.items()``, ``in``) are available to access device attributes. .. versionadded:: 0.5 cC`s||_|j|_dS(N(R/R-(RR/((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRrs cc`st|jdrX|jj|j}x}t|j|D]\}}t|Vq:WnO|jj}x@tj|D]/}tj j ||}t |rt|VqtqtWdS(Nu"udev_device_get_sysattr_list_entry( RR-t"udev_device_get_sysattr_list_entryR/R R RR$tlistdirR%R&R(Rtattrst attributeRaRR7R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyt_get_attributesvs    cC`std|jDS(u: Return the amount of attributes defined. cs`s|] }dVqdS(iN((RjRa((s1/usr/lib/python2.7/site-packages/pyudev/device.pys s(RkR(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRlscC`s |jS(ul Iterate over all attributes defined. Yield each attribute name as unicode string. (R(R((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRiscC`s(|jj|jt|}|dk S(N(R-tudev_device_get_sysattr_valueR/RRA(RRRo((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRs cC`s=|jj|jt|}|dkr9t|n|S(uO Get the given system ``attribute`` for the device. ``attribute`` is a unicode or byte string containing the name of the system attribute. Return the attribute value as byte string, or raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device. N(R-RR/RRARn(RRRo((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRps  cC`st||S(u] Get the given ``atribute`` for the device as unicode string. Depending on the content of the attribute, this may or may not work. Be prepared to catch :exc:`~exceptions.UnicodeDecodeError`. ``attribute`` is a unicode or byte string containing the name of the attribute. Return the attribute value as byte string. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device, or :exc:`~exceptions.UnicodeDecodeError`, if the content of the attribute cannot be decoded into a unicode string. (R (RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pytasstringscC`st|j|S(u Get the given ``attribute`` as integer. ``attribute`` is a unicode or byte string containing the name of the attribute. Return the attribute value as integer. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device, or a :exc:`~exceptions.ValueError`, if the attribute value cannot be converted to an integer. (RqR(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRrs cC`st|j|S(u Get the given ``attribute`` from this device as boolean. A boolean attribute has either a value of ``'1'`` or of ``'0'``, where ``'1'`` stands for ``True``, and ``'0'`` for ``False``. Any other value causes a :exc:`~exceptions.ValueError` to be raised. ``attribute`` is a unicode or byte string containing the name of the attribute. Return ``True``, if the attribute value is ``'1'`` and ``False``, if the attribute value is ``'0'``. Any other value raises a :exc:`~exceptions.ValueError`. Raise a :exc:`~exceptions.KeyError`, if the given attribute is not defined for this device. (R R(RR((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRss( RRRRRRlRiRRpRRrRs(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyRces        (Rt __future__RRRRR$t collectionsRRRtdatetimeRt pyudev._utilRR R R R t__all__t LookupErrorR RRRR!R"ReRRc(((s1/usr/lib/python2.7/site-packages/pyudev/device.pyts(" (    + PK[: T T site-packages/pyudev/pyside.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev.pyside ============= Provide :class:`~pyudev.pyside.QUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into the Qt event loop in applications using the PySide_ binding to Qt. To use this module, :mod:`PySide.QtCore` from PySide_ must be available. .. _PySide: http://www.pyside.org .. moduleauthor:: Sebastian Wiesner .. versionadded:: 0.6 """ from __future__ import (print_function, division, unicode_literals, absolute_import) from PySide.QtCore import QSocketNotifier, QObject, Signal from pyudev._qt_base import QUDevMonitorObserverMixin from pyudev.core import Device class QUDevMonitorObserver(QObject, QUDevMonitorObserverMixin): """ Observe a :class:`~pyudev.Monitor` and emit Qt signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pyqt4.QUDevMonitorObserver(monitor) >>> def device_connected(device): ... print('{0!r} added'.format(device)) >>> observer.deviceAdded.connect(device_connected) >>> monitor.start() This class is a child of :class:`~PySide.QtCore.QObject`. """ #: emitted upon arbitrary device events deviceEvent = Signal(unicode, Device) #: emitted, if a device was added deviceAdded = Signal(Device) #: emitted, if a device was removed deviceRemoved = Signal(Device) #: emitted, if a device was changed deviceChanged = Signal(Device) #: emitted, if a device was moved deviceMoved = Signal(Device) def __init__(self, monitor, parent=None): """ Observe the given ``monitor`` (a :class:`~pyudev.Monitor`): ``parent`` is the parent :class:`~PySide.QtCore.QObject` of this object. It is passed unchanged to the inherited constructor of :class:`~PySide.QtCore.QObject`. """ QObject.__init__(self, parent) self._setup_notifier(monitor, QSocketNotifier) PK[8DD site-packages/pyudev/monitor.pyonu[ ݹYc@`sdZddlmZmZmZmZddlZddlZddlZddl m Z ddl m Z ddl mZmZmZmZddlmZdd gZd efd YZd e fd YZdS(u pyudev.monitor ============== Monitor implementation. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importN(tThread(tclosing(tensure_byte_stringtensure_unicode_stringtreraiseteintr_retry_call(tDeviceuMonitoruMonitorObservertMonitorcB`seZdZddZdZdZeddZedZ dZ ddZ d Z d Z d ZeZd Zd ZdZRS(u Monitor udev events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> for action, device in monitor: ... print('{0}: {1}'.format(action, device)) ... A :class:`Monitor` objects connects to the udev daemon and listens for changes to the device list. A monitor is created by connecting to the kernel daemon through netlink (see :meth:`from_netlink`). Alternatively, connections to arbitrary daemons can be made using :meth:`from_socket`, which is however only seldom of use. Once the monitor is created, you can add a filter using :meth:`filter_by()` or :meth:`filter_by_tag()` to drop incoming events in subsystems, which are not of interest to the application. If the monitor is eventually set up, you can either iterate over the :class:`Monitor` object to synchronously receive events (see :meth:`__iter__()`) or use a :class:`MonitorObserver` to asynchronously react on events. Moreover the monitor provides a real file descriptor (see :meth:`fileno()`), which is :func:`selectable `, so you can also plug the monitor into custom notification mechanisms. Do *not* read or write on this file descriptor. Instances of this class can directly be given as ``udev_monitor *`` to functions wrapped through :mod:`ctypes`. cC`s+||_||_||_|j|_dS(N(tcontextt_as_parameter_t _socket_patht_libudev(tselfR t monitor_pt socket_path((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt__init__Ps   cC`s2tj\}}}|j|_t||dS(N(tsystexc_infoRtfilenameR(Rt_t exc_valuet traceback((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt_reraise_with_socket_pathVs cC`s|jj|dS(N(Rtudev_monitor_unref(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt__del__[suudevcC`sa|dkr$tdj|n|jj|t|}|sTtdn|||S(u Create a monitor by connecting to the kernel daemon through netlink. ``context`` is the :class:`Context` to use. ``source`` is a string, describing the event source. Two sources are available: ``'udev'`` (the default) Events emitted after udev as registered and configured the device. This is the absolutely recommended source for applications. ``'kernel'`` Events emitted directly after the kernel has seen the device. The device has not yet been configured by udev and might not be usable at all. **Never** use this, unless you know what you are doing. Return a new :class:`Monitor` object, which is connected to the given source. Raise :exc:`~exceptions.ValueError`, if an invalid source has been specified. Raise :exc:`~exceptions.EnvironmentError`, if the creation of the monitor failed. ukerneluudevu8Invalid source: {0!r}. Must be one of "udev" or "kernel"uCould not create udev monitor(ukerneluudev(t ValueErrortformatRtudev_monitor_new_from_netlinkRtEnvironmentError(tclsR tsourcetmonitor((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt from_netlink^s   cC`sL|jj|t|}|s9tdj|n|||d|S(u Connect to an arbitrary udev daemon using the given ``socket_path``. ``context`` is the :class:`Context` to use. ``socket_path`` is a byte or unicode string, pointing to an existing socket. If the path starts with a ``@``, use an abstract namespace socket. If ``socket_path`` does not exist, fall back to an abstract namespace socket. The caller is responsible for permissions and cleanup of the socket file. Return a new :class:`Monitor` object, which is connected to the given socket. Raise :exc:`~exceptions.EnvironmentError`, if the creation of the monitor failed. u*Could not create monitor for socket: {0!r}R(Rtudev_monitor_new_from_socketRR R(R!R RR#((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt from_socket~s   cC`s|jj|S(u Return the file description associated with this monitor as integer. This is really a real file descriptor ;), which can be watched and :func:`select.select`\ ed. (Rtudev_monitor_get_fd(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytfilenoscC`sKt|}|r!t|}n|jj||||jj|dS(u' Filter incoming events. ``subsystem`` is a byte or unicode string with the name of a subsystem (e.g. ``'input'``). Only events originating from the given subsystem pass the filter and are handed to the caller. If given, ``device_type`` is a byte or unicode string specifying the device type. Only devices with the given device type are propagated to the caller. If ``device_type`` is not given, no additional filter for a specific device type is installed. These filters are executed inside the kernel, and client processes will usually not be woken up for device, that do not match these filters. .. versionchanged:: 0.15 This method can also be after :meth:`enable_receiving()` now N(RRt/udev_monitor_filter_add_match_subsystem_devtypetudev_monitor_filter_update(Rt subsystemt device_type((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt filter_bys    cC`s-|jj|t||jj|dS(u\ Filter incoming events by the given ``tag``. ``tag`` is a byte or unicode string with the name of a tag. Only events for devices which have this tag attached pass the filter and are handed to the caller. Like with :meth:`filter_by` this filter is also executed inside the kernel, so that client processes are usually not woken up for devices without the given ``tag``. .. udevversion:: 154 .. versionadded:: 0.9 .. versionchanged:: 0.15 This method can also be after :meth:`enable_receiving()` now N(Rt!udev_monitor_filter_add_match_tagRR*(Rttag((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt filter_by_tags cC`s$|jj||jj|dS(u Remove any filters installed with :meth:`filter_by()` or :meth:`filter_by_tag()` from this monitor. .. warning:: Up to udev 181 (and possibly even later versions) the underlying ``udev_monitor_filter_remove()`` seems to be broken. If used with affected versions this method always raises :exc:`~exceptions.ValueError`. Raise :exc:`~exceptions.EnvironmentError` if removal of installed filters failed. .. versionadded:: 0.15 N(Rtudev_monitor_filter_removeR*(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt remove_filterscC`s6y|jj|Wntk r1|jnXdS(u Switch the monitor into listing mode. Connect to the event source and receive incoming events. Only after calling this method, the monitor listens for incoming events. .. note:: This method is implicitly called by :meth:`__iter__`. You don't need to call it explicitly, if you are iterating over the monitor. N(Rtudev_monitor_enable_receivingR R(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytenable_receivings  cC`s9y|jj||Wntk r4|jnXdS(uN Set the receive buffer ``size``. ``size`` is the requested buffer size in bytes, as integer. .. note:: The CAP_NET_ADMIN capability must be contained in the effective capability set of the caller for this method to succeed. Otherwise :exc:`~exceptions.EnvironmentError` will be raised, with ``errno`` set to :data:`~errno.EPERM`. Unprivileged processes typically lack this capability. You can check the capabilities of the current process with the python-prctl_ module: >>> import prctl >>> prctl.cap_effective.net_admin Raise :exc:`~exceptions.EnvironmentError`, if the buffer size could not bet set. .. versionadded:: 0.13 .. _python-prctl: http://packages.python.org/python-prctl N(Rt$udev_monitor_set_receive_buffer_sizeR R(Rtsize((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytset_receive_buffer_sizes cC`swy|jj|}Wntk r3|jnX|sItdnt|jj|}|t|j|fS(uo Receive a single device from the monitor. The caller must make sure, that there are events available in the event queue. The call blocks, until a device is available. If a device was available, return ``(action, device)``. ``device`` is the :class:`Device` object describing the device. ``action`` is a string describing the action. udev informs about the following actions: ``'add'`` A device has been added (e.g. a USB device was plugged in) ``'remove'`` A device has been removed (e.g. a USB device was unplugged) ``'change'`` Something about the device changed (e.g. a device property) ``'move'`` The device was renamed, moved, or re-parented Raise :exc:`~exceptions.EnvironmentError`, if no device could be read. uCould not receive device(Rtudev_monitor_receive_deviceR RRtudev_device_get_actionR R (Rtdevice_ptaction((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytreceive_devices cc`st|jttjR}|j|tjx5trit|j}x|D]}|j VqQWq5WWdQXdS(u Wait for incoming events and receive them upon arrival. This methods implicitly calls :meth:`enable_receiving`, and starts polling the :meth:`fileno` of this monitor. If a event comes in, it receives the corresponding device and yields it to the caller. The returned iterator is endless, and continues receiving devices without ever stopping. Yields ``(action, device)`` (see :meth:`receive_device` for a description). N( R4RtselecttepolltregistertEPOLLINtTrueR tpollR<(Rtnotifierteventstevent((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt__iter__9s   N(t__name__t __module__t__doc__tNoneRRRt classmethodR$R&R(R-R0R2R4tstartR7R<RF(((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyR /s          "tMonitorObservercB`s2eZdZdZdZdZdZRS(u$ A :class:`~threading.Thread` class to observe a :class:`Monitor` in background: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> def print_device_event(action, device): ... print('background event {0}: {1}'.format(action, device)) >>> observer = MonitorObserver(monitor, print_device_event, name='monitor-observer') >>> observer.daemon True >>> observer.start() In the above example, input device events will be printed in background, until :meth:`stop()` is called on ``observer``. .. note:: Instances of this class are always created as daemon thread. If you do not want to use daemon threads for monitoring, you need explicitly set :attr:`~threading.Thread.daemon` to ``False`` before invoking :meth:`~threading.Thread.start()`. .. versionadded:: 0.14 .. versionchanged:: 0.15 :meth:`Monitor.enable_receiving()` is implicitly called when the thread is started. cO`sJtj|||||_t|_tj\|_|_||_ dS(u Create a new observer for the given ``monitor``. ``monitor`` is the :class:`Monitor` to observe. ``event_handler`` is a callable with the signature ``event_handler(action, device)``, where ``action`` is a string describing the event (see :meth:`Monitor.receive_device`), and ``device`` is the :class:`Device` object that caused this event. This callable is invoked for every device event received through ``monitor``. .. warning:: ``event_handler`` is always invoked in this background thread, and *not* in the calling thread. ``args`` and ``kwargs`` are passed unchanged to the parent constructor of :class:`~threading.Thread`. N( RRR#RAtdaemontostpipet_stop_event_sourcet_stop_event_sinkt _handle_event(RR#t event_handlertargstkwargs((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyRos   cC`s|jjttj}|j|jtj|j|jtjxtrxtt |j D]c\}}||jkrt j |jdS|jj }|rg|\}}|j||qgqgWqQWWdQXdS(N(R#R4RR=R>R?RQR@RAR RBROtcloseR<RS(RRCtfdRRER;tdevice((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytruns   cC`sK|jdkrdSztj|jdWdtj|jd|_XdS(uT Send a stop signal to the background thread. The background thread will eventually exit, but it may still be running when this method returns. This method is essentially the asynchronous equivalent to :meth:`stop()`. .. note:: The underlying :attr:`monitor` is *not* stopped. Ns(RRRJROtwriteRW(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt send_stops cC`s|j|jdS(u Stop the background thread. .. warning:: Calling this method from the ``event_handler`` results in a dead lock. If you need to stop the observer from ``event_handler``, use :meth:`send_stop`, and be prepared to get some more events before the observer actually exits. Send a stop signal to the backgroud (see :meth:`send_stop`) and waits for the background thread to exit (see :meth:`~threading.Thread.join`). After this method returns, it is guaranteed that the ``event_handler`` passed to :meth:`MonitorObserver.__init__()` is not longer called for any event from :attr:`monitor`. .. note:: The underlying :attr:`monitor` is *not* stopped. N(R\tjoin(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytstops (RGRHRIRRZR\R^(((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyRMPs    (RIt __future__RRRRRORR=t threadingRt contextlibRt pyudev._utilRRRR t pyudev.coreR t__all__tobjectR RM(((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyts"   " "PK[͟CCsite-packages/pyudev/monitor.pynu[ # -*- coding: utf-8 -*- # Copyright (C) 2010, 2011, 2012 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev.monitor ============== Monitor implementation. .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) import os import sys import select from threading import Thread from contextlib import closing from pyudev._util import ensure_byte_string, ensure_unicode_string, reraise, eintr_retry_call from pyudev.core import Device __all__ = ['Monitor', 'MonitorObserver'] class Monitor(object): """ Monitor udev events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> for action, device in monitor: ... print('{0}: {1}'.format(action, device)) ... A :class:`Monitor` objects connects to the udev daemon and listens for changes to the device list. A monitor is created by connecting to the kernel daemon through netlink (see :meth:`from_netlink`). Alternatively, connections to arbitrary daemons can be made using :meth:`from_socket`, which is however only seldom of use. Once the monitor is created, you can add a filter using :meth:`filter_by()` or :meth:`filter_by_tag()` to drop incoming events in subsystems, which are not of interest to the application. If the monitor is eventually set up, you can either iterate over the :class:`Monitor` object to synchronously receive events (see :meth:`__iter__()`) or use a :class:`MonitorObserver` to asynchronously react on events. Moreover the monitor provides a real file descriptor (see :meth:`fileno()`), which is :func:`selectable `, so you can also plug the monitor into custom notification mechanisms. Do *not* read or write on this file descriptor. Instances of this class can directly be given as ``udev_monitor *`` to functions wrapped through :mod:`ctypes`. """ def __init__(self, context, monitor_p, socket_path=None): self.context = context self._as_parameter_ = monitor_p self._socket_path = socket_path self._libudev = context._libudev def _reraise_with_socket_path(self): _, exc_value, traceback = sys.exc_info() exc_value.filename = self._socket_path reraise(exc_value, traceback) def __del__(self): self._libudev.udev_monitor_unref(self) @classmethod def from_netlink(cls, context, source='udev'): """ Create a monitor by connecting to the kernel daemon through netlink. ``context`` is the :class:`Context` to use. ``source`` is a string, describing the event source. Two sources are available: ``'udev'`` (the default) Events emitted after udev as registered and configured the device. This is the absolutely recommended source for applications. ``'kernel'`` Events emitted directly after the kernel has seen the device. The device has not yet been configured by udev and might not be usable at all. **Never** use this, unless you know what you are doing. Return a new :class:`Monitor` object, which is connected to the given source. Raise :exc:`~exceptions.ValueError`, if an invalid source has been specified. Raise :exc:`~exceptions.EnvironmentError`, if the creation of the monitor failed. """ if source not in ('kernel', 'udev'): raise ValueError('Invalid source: {0!r}. Must be one of "udev" ' 'or "kernel"'.format(source)) monitor = context._libudev.udev_monitor_new_from_netlink( context, ensure_byte_string(source)) if not monitor: raise EnvironmentError('Could not create udev monitor') return cls(context, monitor) @classmethod def from_socket(cls, context, socket_path): """ Connect to an arbitrary udev daemon using the given ``socket_path``. ``context`` is the :class:`Context` to use. ``socket_path`` is a byte or unicode string, pointing to an existing socket. If the path starts with a ``@``, use an abstract namespace socket. If ``socket_path`` does not exist, fall back to an abstract namespace socket. The caller is responsible for permissions and cleanup of the socket file. Return a new :class:`Monitor` object, which is connected to the given socket. Raise :exc:`~exceptions.EnvironmentError`, if the creation of the monitor failed. """ monitor = context._libudev.udev_monitor_new_from_socket( context, ensure_byte_string(socket_path)) if not monitor: raise EnvironmentError('Could not create monitor for socket: ' '{0!r}'.format(socket_path)) return cls(context, monitor, socket_path=socket_path) def fileno(self): """ Return the file description associated with this monitor as integer. This is really a real file descriptor ;), which can be watched and :func:`select.select`\ ed. """ return self._libudev.udev_monitor_get_fd(self) def filter_by(self, subsystem, device_type=None): """ Filter incoming events. ``subsystem`` is a byte or unicode string with the name of a subsystem (e.g. ``'input'``). Only events originating from the given subsystem pass the filter and are handed to the caller. If given, ``device_type`` is a byte or unicode string specifying the device type. Only devices with the given device type are propagated to the caller. If ``device_type`` is not given, no additional filter for a specific device type is installed. These filters are executed inside the kernel, and client processes will usually not be woken up for device, that do not match these filters. .. versionchanged:: 0.15 This method can also be after :meth:`enable_receiving()` now """ subsystem = ensure_byte_string(subsystem) if device_type: device_type = ensure_byte_string(device_type) self._libudev.udev_monitor_filter_add_match_subsystem_devtype( self, subsystem, device_type) self._libudev.udev_monitor_filter_update(self) def filter_by_tag(self, tag): """ Filter incoming events by the given ``tag``. ``tag`` is a byte or unicode string with the name of a tag. Only events for devices which have this tag attached pass the filter and are handed to the caller. Like with :meth:`filter_by` this filter is also executed inside the kernel, so that client processes are usually not woken up for devices without the given ``tag``. .. udevversion:: 154 .. versionadded:: 0.9 .. versionchanged:: 0.15 This method can also be after :meth:`enable_receiving()` now """ self._libudev.udev_monitor_filter_add_match_tag( self, ensure_byte_string(tag)) self._libudev.udev_monitor_filter_update(self) def remove_filter(self): """ Remove any filters installed with :meth:`filter_by()` or :meth:`filter_by_tag()` from this monitor. .. warning:: Up to udev 181 (and possibly even later versions) the underlying ``udev_monitor_filter_remove()`` seems to be broken. If used with affected versions this method always raises :exc:`~exceptions.ValueError`. Raise :exc:`~exceptions.EnvironmentError` if removal of installed filters failed. .. versionadded:: 0.15 """ self._libudev.udev_monitor_filter_remove(self) self._libudev.udev_monitor_filter_update(self) def enable_receiving(self): """ Switch the monitor into listing mode. Connect to the event source and receive incoming events. Only after calling this method, the monitor listens for incoming events. .. note:: This method is implicitly called by :meth:`__iter__`. You don't need to call it explicitly, if you are iterating over the monitor. """ try: self._libudev.udev_monitor_enable_receiving(self) except EnvironmentError: self._reraise_with_socket_path() start = enable_receiving def set_receive_buffer_size(self, size): """ Set the receive buffer ``size``. ``size`` is the requested buffer size in bytes, as integer. .. note:: The CAP_NET_ADMIN capability must be contained in the effective capability set of the caller for this method to succeed. Otherwise :exc:`~exceptions.EnvironmentError` will be raised, with ``errno`` set to :data:`~errno.EPERM`. Unprivileged processes typically lack this capability. You can check the capabilities of the current process with the python-prctl_ module: >>> import prctl >>> prctl.cap_effective.net_admin Raise :exc:`~exceptions.EnvironmentError`, if the buffer size could not bet set. .. versionadded:: 0.13 .. _python-prctl: http://packages.python.org/python-prctl """ try: self._libudev.udev_monitor_set_receive_buffer_size(self, size) except EnvironmentError: self._reraise_with_socket_path() def receive_device(self): """ Receive a single device from the monitor. The caller must make sure, that there are events available in the event queue. The call blocks, until a device is available. If a device was available, return ``(action, device)``. ``device`` is the :class:`Device` object describing the device. ``action`` is a string describing the action. udev informs about the following actions: ``'add'`` A device has been added (e.g. a USB device was plugged in) ``'remove'`` A device has been removed (e.g. a USB device was unplugged) ``'change'`` Something about the device changed (e.g. a device property) ``'move'`` The device was renamed, moved, or re-parented Raise :exc:`~exceptions.EnvironmentError`, if no device could be read. """ try: device_p = self._libudev.udev_monitor_receive_device(self) except EnvironmentError: self._reraise_with_socket_path() if not device_p: raise EnvironmentError('Could not receive device') action = ensure_unicode_string( self._libudev.udev_device_get_action(device_p)) return action, Device(self.context, device_p) def __iter__(self): """ Wait for incoming events and receive them upon arrival. This methods implicitly calls :meth:`enable_receiving`, and starts polling the :meth:`fileno` of this monitor. If a event comes in, it receives the corresponding device and yields it to the caller. The returned iterator is endless, and continues receiving devices without ever stopping. Yields ``(action, device)`` (see :meth:`receive_device` for a description). """ self.enable_receiving() with closing(select.epoll()) as notifier: notifier.register(self, select.EPOLLIN) while True: events = eintr_retry_call(notifier.poll) for event in events: yield self.receive_device() class MonitorObserver(Thread): """ A :class:`~threading.Thread` class to observe a :class:`Monitor` in background: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> def print_device_event(action, device): ... print('background event {0}: {1}'.format(action, device)) >>> observer = MonitorObserver(monitor, print_device_event, name='monitor-observer') >>> observer.daemon True >>> observer.start() In the above example, input device events will be printed in background, until :meth:`stop()` is called on ``observer``. .. note:: Instances of this class are always created as daemon thread. If you do not want to use daemon threads for monitoring, you need explicitly set :attr:`~threading.Thread.daemon` to ``False`` before invoking :meth:`~threading.Thread.start()`. .. versionadded:: 0.14 .. versionchanged:: 0.15 :meth:`Monitor.enable_receiving()` is implicitly called when the thread is started. """ def __init__(self, monitor, event_handler, *args, **kwargs): """ Create a new observer for the given ``monitor``. ``monitor`` is the :class:`Monitor` to observe. ``event_handler`` is a callable with the signature ``event_handler(action, device)``, where ``action`` is a string describing the event (see :meth:`Monitor.receive_device`), and ``device`` is the :class:`Device` object that caused this event. This callable is invoked for every device event received through ``monitor``. .. warning:: ``event_handler`` is always invoked in this background thread, and *not* in the calling thread. ``args`` and ``kwargs`` are passed unchanged to the parent constructor of :class:`~threading.Thread`. """ Thread.__init__(self, *args, **kwargs) self.monitor = monitor # observer threads should not keep the interpreter alive self.daemon = True self._stop_event_source, self._stop_event_sink = os.pipe() self._handle_event = event_handler def run(self): self.monitor.enable_receiving() with closing(select.epoll()) as notifier: # poll on the stop event fd notifier.register(self._stop_event_source, select.EPOLLIN) # and on the monitor notifier.register(self.monitor, select.EPOLLIN) while True: for fd, _ in eintr_retry_call(notifier.poll): if fd == self._stop_event_source: # in case of a stop event, close our pipe side, and # return from the thread os.close(self._stop_event_source) return else: event = self.monitor.receive_device() if event: action, device = event self._handle_event(action, device) def send_stop(self): """ Send a stop signal to the background thread. The background thread will eventually exit, but it may still be running when this method returns. This method is essentially the asynchronous equivalent to :meth:`stop()`. .. note:: The underlying :attr:`monitor` is *not* stopped. """ if self._stop_event_sink is None: return try: # emit a stop event to the thread os.write(self._stop_event_sink, b'\x01') finally: # close the out-of-thread side of the pipe os.close(self._stop_event_sink) self._stop_event_sink = None def stop(self): """ Stop the background thread. .. warning:: Calling this method from the ``event_handler`` results in a dead lock. If you need to stop the observer from ``event_handler``, use :meth:`send_stop`, and be prepared to get some more events before the observer actually exits. Send a stop signal to the backgroud (see :meth:`send_stop`) and waits for the background thread to exit (see :meth:`~threading.Thread.join`). After this method returns, it is guaranteed that the ``event_handler`` passed to :meth:`MonitorObserver.__init__()` is not longer called for any event from :attr:`monitor`. .. note:: The underlying :attr:`monitor` is *not* stopped. """ self.send_stop() self.join() PK[jP site-packages/pyudev/pyside.pyonu[ :Oc@`sdZddlmZmZmZmZddlmZmZm Z ddl m Z ddl m Z dee fdYZdS( u pyudev.pyside ============= Provide :class:`~pyudev.pyside.QUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into the Qt event loop in applications using the PySide_ binding to Qt. To use this module, :mod:`PySide.QtCore` from PySide_ must be available. .. _PySide: http://www.pyside.org .. moduleauthor:: Sebastian Wiesner .. versionadded:: 0.6 i(tprint_functiontdivisiontunicode_literalstabsolute_import(tQSocketNotifiertQObjecttSignal(tQUDevMonitorObserverMixin(tDevicetQUDevMonitorObservercB`sYeZdZeeeZeeZeeZeeZ eeZ ddZ RS(u Observe a :class:`~pyudev.Monitor` and emit Qt signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pyqt4.QUDevMonitorObserver(monitor) >>> def device_connected(device): ... print('{0!r} added'.format(device)) >>> observer.deviceAdded.connect(device_connected) >>> monitor.start() This class is a child of :class:`~PySide.QtCore.QObject`. cC`s$tj|||j|tdS(u Observe the given ``monitor`` (a :class:`~pyudev.Monitor`): ``parent`` is the parent :class:`~PySide.QtCore.QObject` of this object. It is passed unchanged to the inherited constructor of :class:`~PySide.QtCore.QObject`. N(Rt__init__t_setup_notifierR(tselftmonitortparent((s1/usr/lib/python2.7/site-packages/pyudev/pyside.pyR HsN( t__name__t __module__t__doc__RtunicodeRt deviceEventt deviceAddedt deviceRemovedt deviceChangedt deviceMovedtNoneR (((s1/usr/lib/python2.7/site-packages/pyudev/pyside.pyR ,s    N(Rt __future__RRRRt PySide.QtCoreRRRtpyudev._qt_baseRt pyudev.coreRR (((s1/usr/lib/python2.7/site-packages/pyudev/pyside.pyt s "PK[;Hm//site-packages/pyudev/_util.pyonu[ ݹYc@`sdZddlmZmZmZmZddlZddlZddlZddl Z ej ddkrxddl Tn ddl TdZ dZdZd Zd ZejZejZd Zd ZdS( u pyudev._util ============ Internal utilities .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importNi(t*cC`s+t|ts'|jtj}n|S(u Return the given ``value`` as bytestring. If the given ``value`` is not a byte string, but a real unicode string, it is encoded with the filesystem encoding (as in :func:`sys.getfilesystemencoding()`). (t isinstancetbytestencodetsystgetfilesystemencoding(tvalue((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytensure_byte_string,scC`s+t|ts'|jtj}n|S(u Return the given ``value`` as unicode string. If the given ``value`` is not a unicode string, but a byte string, it is decoded with the filesystem encoding (as in :func:`sys.getfilesystemencoding()`). (RtunicodetdecodeRR (R ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytensure_unicode_string9scC`sEt|trt|}nt|tr1|Stt|SdS(u Return a byte string, which represents the given ``value`` in a way suitable as raw value of an udev property. If ``value`` is a boolean object, it is converted to ``'1'`` or ``'0'``, depending on whether ``value`` is ``True`` or ``False``. If ``value`` is a byte string already, it is returned unchanged. Anything else is simply converted to a unicode string, and then passed to :func:`ensure_byte_string`. N(RtbooltintRR R (R ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytproperty_value_to_bytesFs cC`s.|dkr$tdj|n|dkS(u Convert the given unicode string ``value`` to a boolean object. If ``value`` is ``'1'``, ``True`` is returned. If ``value`` is ``'0'``, ``False`` is returned. Any other value raises a :exc:`~exceptions.ValueError`. u1u0uNot a boolean value: {0!r}(u1u0(t ValueErrortformat(R ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytstring_to_bool[s cc`sIxB|rD|j|}|j|}||fV|j|}qWdS(u Iteration helper for udev list entry objects. Yield a tuple ``(name, value)``. ``name`` and ``value`` are bytestrings containing the name and the value of the list entry. The exact contents depend on the list iterated over. N(tudev_list_entry_get_nametudev_list_entry_get_valuetudev_list_entry_get_next(tlibudevtentrytnameR ((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytudev_list_iteratehs   cC`sKtj|j}t|r"dSt|r2dStdj|dS(u Get the device type of a device file. ``filename`` is a string containing the path of a device file. Return ``'char'`` if ``filename`` is a character device, or ``'block'`` if ``filename`` is a block device. Raise :exc:`~exceptions.ValueError` if ``filename`` is no device file at all. Raise :exc:`~exceptions.EnvironmentError` if ``filename`` does not exist or if its metadata was inaccessible. .. versionadded:: 0.15 ucharublockunot a device file: {0!r}N(toststattst_modet_is_char_devicet_is_block_deviceRR(tfilenametmode((s0/usr/lib/python2.7/site-packages/pyudev/_util.pytget_device_type|s   cO`sddl}xtry|||SWqtt|jfk r}t|ttfre|j}n |jd}|tjkrqnqXqWdS(u= Handle interruptions to an interruptible system call. Run an interruptible system call in a loop and retry if it raises EINTR. The signal calls that may raise EINTR prior to Python 3.5 are listed in PEP 0475. Any calls to these functions must be wrapped in eintr_retry_call in order to handle EINTR returns in older versions of Python. This function is safe to use under Python 3.5 and newer since the wrapped function will simply return without raising EINTR. This function is based on _eintr_retry_call in python's subprocess.py. iN( tselecttTruetOSErrortIOErrorterrorRterrnotargstEINTR(tfuncR*tkwargsR$tet error_code((s0/usr/lib/python2.7/site-packages/pyudev/_util.pyteintr_retry_calls    (t__doc__t __future__RRRRRRRR)t version_infotpyudev._py2utiltpyudev._py3utilR RRRRtS_ISCHRRtS_ISBLKR R#R0(((s0/usr/lib/python2.7/site-packages/pyudev/_util.pyts""           PK[q !site-packages/pyudev/_qt_base.pycnu[ :Oc@`sBdZddlmZmZmZmZdefdYZdS(u pyudev._qt_base =============== Base mixin class for Qt4 support. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importtQUDevMonitorObserverMixincB`s;eZdZedZejdZdZRS(cC`sv||_||j|j||_|jjtj|ji|jd6|j d6|j d6|j d6|_ dS(Nuadduremoveuchangeumove( tmonitortfilenotReadtnotifiert activatedtinttconnectt_process_udev_eventt deviceAddedt deviceRemovedt deviceChangedt deviceMovedt_action_signal_map(tselfRtnotifier_class((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyt_setup_notifier#s cC`s |jjS(uY Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. This merely reflects the state of the ``enabled`` property of the underlying :attr:`notifier`. .. versionadded:: 0.14 (Rt isEnabled(R((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pytenabled-s cC`s|jj|dS(N(Rt setEnabled(Rtvalue((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyR;scC`sO|jj}|rK|\}}|jj|||j|j|ndS(u Attempt to receive a single device event from the monitor, process the event and emit corresponding signals. Called by ``QSocketNotifier``, if data is available on the udev monitoring socket. N(Rtreceive_devicet deviceEventtemitR(Rteventtactiontdevice((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyR ?s  (t__name__t __module__RtpropertyRtsetterR (((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyR!s N(t__doc__t __future__RRRRtobjectR(((s3/usr/lib/python2.7/site-packages/pyudev/_qt_base.pyts"PK[1M!site-packages/pyudev/__init__.pyonu[ OOc@`szdZddlmZmZmZmZdZeee ej dZ ddgZ ddl TddlTddlTdS( u pyudev ====== A binding to libudev_. A :class:`Context` object is required for almost any functionality in pyudev. The context provides :class:`Device` enumeration with :meth:`Context.list_devices()`. Device monitoring is provided by :class:`Monitor` and :class:`MonitorObserver`. With :mod:`pyudev.pyqt4`, :mod:`pyudev.pyside`, :mod:`pyudev.glib` and :mod:`pyudev.wx` device monitoring can be integrated into the event loop of various GUI toolkits. .. _libudev: http://www.kernel.org/pub/linux/utils/kernel/hotplug/libudev/ .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importu0.15u.uContextuDevice(t*N(t__doc__t __future__RRRRt __version__ttupletmaptinttsplitt__version_info__t__all__t pyudev.devicet pyudev.coretpyudev.monitor(((s3/usr/lib/python2.7/site-packages/pyudev/__init__.pyt%s"   PK[4m" " site-packages/pyudev/_qt_base.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011, 2012 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev._qt_base =============== Base mixin class for Qt4 support. .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) class QUDevMonitorObserverMixin(object): def _setup_notifier(self, monitor, notifier_class): self.monitor = monitor self.notifier = notifier_class( monitor.fileno(), notifier_class.Read, self) self.notifier.activated[int].connect(self._process_udev_event) self._action_signal_map = { 'add': self.deviceAdded, 'remove': self.deviceRemoved, 'change': self.deviceChanged, 'move': self.deviceMoved, } @property def enabled(self): """ Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. This merely reflects the state of the ``enabled`` property of the underlying :attr:`notifier`. .. versionadded:: 0.14 """ return self.notifier.isEnabled() @enabled.setter def enabled(self, value): self.notifier.setEnabled(value) def _process_udev_event(self): """ Attempt to receive a single device event from the monitor, process the event and emit corresponding signals. Called by ``QSocketNotifier``, if data is available on the udev monitoring socket. """ event = self.monitor.receive_device() if event: action, device = event self.deviceEvent.emit(action, device) self._action_signal_map[action].emit(device) PK[Aasite-packages/pyudev/wx.pyonu[ :Oc@`sdZddlmZmZmZmZddlmZmZddl m Z ddl m Z e \Z Ze \ZZe \ZZe \ZZe \ZZdefdYZdS( u> pyudev.wx ========= Provides :class:`~pyudev.wx.WXUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into a :meth:`wx.App.MainLoop`. To use this module, :mod:`wx` from wxPython must be available. .. moduleauthor:: Tobias Eberle .. versionadded:: 0.14 i(tprint_functiontdivisiontunicode_literalstabsolute_import(t EvtHandlert PostEvent(tNewEvent(tMonitorObservertWxUDevMonitorObservercB`sueZdZied6ed6ed6ed6ZdZe dZ e j dZ dZ d Z d ZRS( u Observe a :class:`~pyudev.Monitor` and post wx events upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.wx.WxUDevMonitorObserver(monitor) >>> def device_connected(event): ... print('{0!r} added'.format(event.device)) >>> observer.Bind(EVT_DEVICE_ADDED, device_connected) >>> monitor.start() This class is a child of :class:`wx.EvtHandler`. uadduremoveuchangeumovecC`s-tj|||_d|_|jdS(N(Rt__init__tmonitortNonet_observer_threadtstart(tselfR ((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyR Cs   cC`s |jdk S(u Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. N(R R (R((s-/usr/lib/python2.7/site-packages/pyudev/wx.pytenabledIscC`s!|r|jn |jdS(N(R tstop(Rtvalue((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyRSs cC`sB|jdk rdSt|j|jdd|_|jjdS(u` Enable this observer. Do nothing, if the observer is already enabled. Ntnameuwx-observer-thread(R R RR t _emit_eventsR (R((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyR Zs cC`s$|jdkrdS|jjdS(ub Disable this observer. Do nothing, if the observer is already disabled. N(R R R(R((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyRfscC`sCt|td|d||j|}t||d|dS(Ntactiontdevice(Rt DeviceEventt_action_event_map(RRRt event_class((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyRps (t__name__t __module__t__doc__tDeviceAddedEventtDeviceRemovedEventtDeviceChangedEventtDeviceMovedEventRR tpropertyRtsetterR RR(((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyR,s    N(Rt __future__RRRRtwxRRtwx.lib.neweventRtpyudev.monitorRRtEVT_DEVICE_EVENTRtEVT_DEVICE_ADDEDRtEVT_DEVICE_REMOVEDRtEVT_DEVICE_CHANGEDRtEVT_DEVICE_MOVEDR(((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyts"PK[v!U site-packages/pyudev/_compat.pycnu[ :Oc@`sQdZddlmZmZmZmZddlmZmZm Z dZ dS(u pyudev._compat ============== Compatibility for Python versions, that lack certain functions. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_import(tPopentCalledProcessErrortPIPEcC`sJt|dt}|jd}|jdkrFt|j|n|S(u] Compatibility with :func:`subprocess.check_output` from Python 2.7 and upwards. tstdouti(RRt communicatet returncodeR(tcommandtproctoutput((s2/usr/lib/python2.7/site-packages/pyudev/_compat.pyt check_output#s N( t__doc__t __future__RRRRt subprocessRRRR (((s2/usr/lib/python2.7/site-packages/pyudev/_compat.pyts"PK[8DD site-packages/pyudev/monitor.pycnu[ ݹYc@`sdZddlmZmZmZmZddlZddlZddlZddl m Z ddl m Z ddl mZmZmZmZddlmZdd gZd efd YZd e fd YZdS(u pyudev.monitor ============== Monitor implementation. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importN(tThread(tclosing(tensure_byte_stringtensure_unicode_stringtreraiseteintr_retry_call(tDeviceuMonitoruMonitorObservertMonitorcB`seZdZddZdZdZeddZedZ dZ ddZ d Z d Z d ZeZd Zd ZdZRS(u Monitor udev events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> for action, device in monitor: ... print('{0}: {1}'.format(action, device)) ... A :class:`Monitor` objects connects to the udev daemon and listens for changes to the device list. A monitor is created by connecting to the kernel daemon through netlink (see :meth:`from_netlink`). Alternatively, connections to arbitrary daemons can be made using :meth:`from_socket`, which is however only seldom of use. Once the monitor is created, you can add a filter using :meth:`filter_by()` or :meth:`filter_by_tag()` to drop incoming events in subsystems, which are not of interest to the application. If the monitor is eventually set up, you can either iterate over the :class:`Monitor` object to synchronously receive events (see :meth:`__iter__()`) or use a :class:`MonitorObserver` to asynchronously react on events. Moreover the monitor provides a real file descriptor (see :meth:`fileno()`), which is :func:`selectable `, so you can also plug the monitor into custom notification mechanisms. Do *not* read or write on this file descriptor. Instances of this class can directly be given as ``udev_monitor *`` to functions wrapped through :mod:`ctypes`. cC`s+||_||_||_|j|_dS(N(tcontextt_as_parameter_t _socket_patht_libudev(tselfR t monitor_pt socket_path((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt__init__Ps   cC`s2tj\}}}|j|_t||dS(N(tsystexc_infoRtfilenameR(Rt_t exc_valuet traceback((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt_reraise_with_socket_pathVs cC`s|jj|dS(N(Rtudev_monitor_unref(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt__del__[suudevcC`sa|dkr$tdj|n|jj|t|}|sTtdn|||S(u Create a monitor by connecting to the kernel daemon through netlink. ``context`` is the :class:`Context` to use. ``source`` is a string, describing the event source. Two sources are available: ``'udev'`` (the default) Events emitted after udev as registered and configured the device. This is the absolutely recommended source for applications. ``'kernel'`` Events emitted directly after the kernel has seen the device. The device has not yet been configured by udev and might not be usable at all. **Never** use this, unless you know what you are doing. Return a new :class:`Monitor` object, which is connected to the given source. Raise :exc:`~exceptions.ValueError`, if an invalid source has been specified. Raise :exc:`~exceptions.EnvironmentError`, if the creation of the monitor failed. ukerneluudevu8Invalid source: {0!r}. Must be one of "udev" or "kernel"uCould not create udev monitor(ukerneluudev(t ValueErrortformatRtudev_monitor_new_from_netlinkRtEnvironmentError(tclsR tsourcetmonitor((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt from_netlink^s   cC`sL|jj|t|}|s9tdj|n|||d|S(u Connect to an arbitrary udev daemon using the given ``socket_path``. ``context`` is the :class:`Context` to use. ``socket_path`` is a byte or unicode string, pointing to an existing socket. If the path starts with a ``@``, use an abstract namespace socket. If ``socket_path`` does not exist, fall back to an abstract namespace socket. The caller is responsible for permissions and cleanup of the socket file. Return a new :class:`Monitor` object, which is connected to the given socket. Raise :exc:`~exceptions.EnvironmentError`, if the creation of the monitor failed. u*Could not create monitor for socket: {0!r}R(Rtudev_monitor_new_from_socketRR R(R!R RR#((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt from_socket~s   cC`s|jj|S(u Return the file description associated with this monitor as integer. This is really a real file descriptor ;), which can be watched and :func:`select.select`\ ed. (Rtudev_monitor_get_fd(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytfilenoscC`sKt|}|r!t|}n|jj||||jj|dS(u' Filter incoming events. ``subsystem`` is a byte or unicode string with the name of a subsystem (e.g. ``'input'``). Only events originating from the given subsystem pass the filter and are handed to the caller. If given, ``device_type`` is a byte or unicode string specifying the device type. Only devices with the given device type are propagated to the caller. If ``device_type`` is not given, no additional filter for a specific device type is installed. These filters are executed inside the kernel, and client processes will usually not be woken up for device, that do not match these filters. .. versionchanged:: 0.15 This method can also be after :meth:`enable_receiving()` now N(RRt/udev_monitor_filter_add_match_subsystem_devtypetudev_monitor_filter_update(Rt subsystemt device_type((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt filter_bys    cC`s-|jj|t||jj|dS(u\ Filter incoming events by the given ``tag``. ``tag`` is a byte or unicode string with the name of a tag. Only events for devices which have this tag attached pass the filter and are handed to the caller. Like with :meth:`filter_by` this filter is also executed inside the kernel, so that client processes are usually not woken up for devices without the given ``tag``. .. udevversion:: 154 .. versionadded:: 0.9 .. versionchanged:: 0.15 This method can also be after :meth:`enable_receiving()` now N(Rt!udev_monitor_filter_add_match_tagRR*(Rttag((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt filter_by_tags cC`s$|jj||jj|dS(u Remove any filters installed with :meth:`filter_by()` or :meth:`filter_by_tag()` from this monitor. .. warning:: Up to udev 181 (and possibly even later versions) the underlying ``udev_monitor_filter_remove()`` seems to be broken. If used with affected versions this method always raises :exc:`~exceptions.ValueError`. Raise :exc:`~exceptions.EnvironmentError` if removal of installed filters failed. .. versionadded:: 0.15 N(Rtudev_monitor_filter_removeR*(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt remove_filterscC`s6y|jj|Wntk r1|jnXdS(u Switch the monitor into listing mode. Connect to the event source and receive incoming events. Only after calling this method, the monitor listens for incoming events. .. note:: This method is implicitly called by :meth:`__iter__`. You don't need to call it explicitly, if you are iterating over the monitor. N(Rtudev_monitor_enable_receivingR R(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytenable_receivings  cC`s9y|jj||Wntk r4|jnXdS(uN Set the receive buffer ``size``. ``size`` is the requested buffer size in bytes, as integer. .. note:: The CAP_NET_ADMIN capability must be contained in the effective capability set of the caller for this method to succeed. Otherwise :exc:`~exceptions.EnvironmentError` will be raised, with ``errno`` set to :data:`~errno.EPERM`. Unprivileged processes typically lack this capability. You can check the capabilities of the current process with the python-prctl_ module: >>> import prctl >>> prctl.cap_effective.net_admin Raise :exc:`~exceptions.EnvironmentError`, if the buffer size could not bet set. .. versionadded:: 0.13 .. _python-prctl: http://packages.python.org/python-prctl N(Rt$udev_monitor_set_receive_buffer_sizeR R(Rtsize((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytset_receive_buffer_sizes cC`swy|jj|}Wntk r3|jnX|sItdnt|jj|}|t|j|fS(uo Receive a single device from the monitor. The caller must make sure, that there are events available in the event queue. The call blocks, until a device is available. If a device was available, return ``(action, device)``. ``device`` is the :class:`Device` object describing the device. ``action`` is a string describing the action. udev informs about the following actions: ``'add'`` A device has been added (e.g. a USB device was plugged in) ``'remove'`` A device has been removed (e.g. a USB device was unplugged) ``'change'`` Something about the device changed (e.g. a device property) ``'move'`` The device was renamed, moved, or re-parented Raise :exc:`~exceptions.EnvironmentError`, if no device could be read. uCould not receive device(Rtudev_monitor_receive_deviceR RRtudev_device_get_actionR R (Rtdevice_ptaction((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytreceive_devices cc`st|jttjR}|j|tjx5trit|j}x|D]}|j VqQWq5WWdQXdS(u Wait for incoming events and receive them upon arrival. This methods implicitly calls :meth:`enable_receiving`, and starts polling the :meth:`fileno` of this monitor. If a event comes in, it receives the corresponding device and yields it to the caller. The returned iterator is endless, and continues receiving devices without ever stopping. Yields ``(action, device)`` (see :meth:`receive_device` for a description). N( R4RtselecttepolltregistertEPOLLINtTrueR tpollR<(Rtnotifierteventstevent((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt__iter__9s   N(t__name__t __module__t__doc__tNoneRRRt classmethodR$R&R(R-R0R2R4tstartR7R<RF(((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyR /s          "tMonitorObservercB`s2eZdZdZdZdZdZRS(u$ A :class:`~threading.Thread` class to observe a :class:`Monitor` in background: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> def print_device_event(action, device): ... print('background event {0}: {1}'.format(action, device)) >>> observer = MonitorObserver(monitor, print_device_event, name='monitor-observer') >>> observer.daemon True >>> observer.start() In the above example, input device events will be printed in background, until :meth:`stop()` is called on ``observer``. .. note:: Instances of this class are always created as daemon thread. If you do not want to use daemon threads for monitoring, you need explicitly set :attr:`~threading.Thread.daemon` to ``False`` before invoking :meth:`~threading.Thread.start()`. .. versionadded:: 0.14 .. versionchanged:: 0.15 :meth:`Monitor.enable_receiving()` is implicitly called when the thread is started. cO`sJtj|||||_t|_tj\|_|_||_ dS(u Create a new observer for the given ``monitor``. ``monitor`` is the :class:`Monitor` to observe. ``event_handler`` is a callable with the signature ``event_handler(action, device)``, where ``action`` is a string describing the event (see :meth:`Monitor.receive_device`), and ``device`` is the :class:`Device` object that caused this event. This callable is invoked for every device event received through ``monitor``. .. warning:: ``event_handler`` is always invoked in this background thread, and *not* in the calling thread. ``args`` and ``kwargs`` are passed unchanged to the parent constructor of :class:`~threading.Thread`. N( RRR#RAtdaemontostpipet_stop_event_sourcet_stop_event_sinkt _handle_event(RR#t event_handlertargstkwargs((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyRos   cC`s|jjttj}|j|jtj|j|jtjxtrxtt |j D]c\}}||jkrt j |jdS|jj }|rg|\}}|j||qgqgWqQWWdQXdS(N(R#R4RR=R>R?RQR@RAR RBROtcloseR<RS(RRCtfdRRER;tdevice((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytruns   cC`sK|jdkrdSztj|jdWdtj|jd|_XdS(uT Send a stop signal to the background thread. The background thread will eventually exit, but it may still be running when this method returns. This method is essentially the asynchronous equivalent to :meth:`stop()`. .. note:: The underlying :attr:`monitor` is *not* stopped. Ns(RRRJROtwriteRW(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyt send_stops cC`s|j|jdS(u Stop the background thread. .. warning:: Calling this method from the ``event_handler`` results in a dead lock. If you need to stop the observer from ``event_handler``, use :meth:`send_stop`, and be prepared to get some more events before the observer actually exits. Send a stop signal to the backgroud (see :meth:`send_stop`) and waits for the background thread to exit (see :meth:`~threading.Thread.join`). After this method returns, it is guaranteed that the ``event_handler`` passed to :meth:`MonitorObserver.__init__()` is not longer called for any event from :attr:`monitor`. .. note:: The underlying :attr:`monitor` is *not* stopped. N(R\tjoin(R((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pytstops (RGRHRIRRZR\R^(((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyRMPs    (RIt __future__RRRRRORR=t threadingRt contextlibRt pyudev._utilRRRR t pyudev.coreR t__all__tobjectR RM(((s2/usr/lib/python2.7/site-packages/pyudev/monitor.pyts"   " "PK[4 site-packages/pyudev/_py3util.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2011 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev._py3util =============== Internal utilities for Python 3. .. moduleauthor:: Sebastian Wiesner """ def reraise(exc, traceback): """ Re-raise the given exception with ``traceback``. ``exc`` is an exception derived from :class:`~exceptions.Exception`, ``traceback`` a traceback object. """ raise exc.with_traceback(traceback) PK[ site-packages/pyudev/wx.pynu[# -*- coding: utf-8 -*- # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev.wx ========= Provides :class:`~pyudev.wx.WXUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into a :meth:`wx.App.MainLoop`. To use this module, :mod:`wx` from wxPython must be available. .. moduleauthor:: Tobias Eberle .. versionadded:: 0.14 """ from __future__ import (print_function, division, unicode_literals, absolute_import) from wx import EvtHandler, PostEvent from wx.lib.newevent import NewEvent from pyudev.monitor import MonitorObserver DeviceEvent, EVT_DEVICE_EVENT = NewEvent() DeviceAddedEvent, EVT_DEVICE_ADDED = NewEvent() DeviceRemovedEvent, EVT_DEVICE_REMOVED = NewEvent() DeviceChangedEvent, EVT_DEVICE_CHANGED = NewEvent() DeviceMovedEvent, EVT_DEVICE_MOVED = NewEvent() class WxUDevMonitorObserver(EvtHandler): """ Observe a :class:`~pyudev.Monitor` and post wx events upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.wx.WxUDevMonitorObserver(monitor) >>> def device_connected(event): ... print('{0!r} added'.format(event.device)) >>> observer.Bind(EVT_DEVICE_ADDED, device_connected) >>> monitor.start() This class is a child of :class:`wx.EvtHandler`. """ _action_event_map = { 'add': DeviceAddedEvent, 'remove': DeviceRemovedEvent, 'change': DeviceChangedEvent, 'move': DeviceMovedEvent } def __init__(self, monitor): EvtHandler.__init__(self) self.monitor = monitor self._observer_thread = None self.start() @property def enabled(self): """ Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. """ return self._observer_thread is not None @enabled.setter def enabled(self, value): if value: self.start() else: self.stop() def start(self): """ Enable this observer. Do nothing, if the observer is already enabled. """ if self._observer_thread is not None: return self._observer_thread = MonitorObserver( self.monitor, self._emit_events, name='wx-observer-thread') self._observer_thread.start() def stop(self): """ Disable this observer. Do nothing, if the observer is already disabled. """ if self._observer_thread is None: return self._observer_thread.stop() def _emit_events(self, action, device): PostEvent(self, DeviceEvent(action=action, device=device)) event_class = self._action_event_map[action] PostEvent(self, event_class(device=device)) PK[@Sff!site-packages/pyudev/_py2util.pyonu[ :Oc@`s>dZddlmZmZmZmZdgZdZdS(u pyudev._py2util =============== Internal utilities for Python 2. .. moduleauthor:: Sebastian Wiesner i(tprint_functiontdivisiontunicode_literalstabsolute_importureraisecC`st|||dS(u Re-raise the given exception with ``traceback``. ``exc`` is an exception derived from :class:`~exceptions.Exception`, ``traceback`` a traceback object. N(ttype(texct traceback((s3/usr/lib/python2.7/site-packages/pyudev/_py2util.pytreraise"sN(t__doc__t __future__RRRRt__all__R(((s3/usr/lib/python2.7/site-packages/pyudev/_py2util.pyts" PK[e66site-packages/pyudev/core.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev.core =========== Core types and functions of :mod:`pyudev`. .. moduleauthor:: Sebastian Wiesner """ from __future__ import (print_function, division, unicode_literals, absolute_import) try: from subprocess import check_output except ImportError: from pyudev._compat import check_output from pyudev.device import Device from pyudev._libudev import load_udev_library from pyudev._util import (ensure_unicode_string, ensure_byte_string, udev_list_iterate, property_value_to_bytes) __all__ = ['udev_version', 'Context', 'Enumerator'] def udev_version(): """ Get the version of the underlying udev library. udev doesn't use a standard major-minor versioning scheme, but instead labels releases with a single consecutive number. Consequently, the version number returned by this function is a single integer, and not a tuple (like for instance the interpreter version in :data:`sys.version_info`). As libudev itself does not provide a function to query the version number, this function calls the ``udevadm`` utilitiy, so be prepared to catch :exc:`~exceptions.EnvironmentError` and :exc:`~subprocess.CalledProcessError` if you call this function. Return the version number as single integer. Raise :exc:`~exceptions.ValueError`, if the version number retrieved from udev could not be converted to an integer. Raise :exc:`~exceptions.EnvironmentError`, if ``udevadm`` was not found, or could not be executed. Raise :exc:`subprocess.CalledProcessError`, if ``udevadm`` returned a non-zero exit code. On Python 2.7 or newer, the ``output`` attribute of this exception is correctly set. .. versionadded:: 0.8 """ output = ensure_unicode_string(check_output(['udevadm', '--version'])) return int(output.strip()) class Context(object): """ The udev context. This is *the* central object to access udev. An instance of this class must be created before anything else can be done. It holds the udev configuration and provides the interface to list devices (see :meth:`list_devices`). Instances of this class can directly be given as ``udev *`` to functions wrapped through :mod:`ctypes`. """ def __init__(self): """ Create a new context. """ self._libudev = load_udev_library() self._as_parameter_ = self._libudev.udev_new() def __del__(self): self._libudev.udev_unref(self) @property def sys_path(self): """ The ``sysfs`` mount point defaulting to ``/sys'`` as unicode string. The mount point can be overwritten using the environment variable :envvar:`SYSFS_PATH`. Use this for testing purposes. """ return ensure_unicode_string(self._libudev.udev_get_sys_path(self)) @property def device_path(self): """ The device directory path defaulting to ``/dev`` as unicode string. This can be overridden in the udev configuration. """ return ensure_unicode_string(self._libudev.udev_get_dev_path(self)) @property def run_path(self): """ The run runtime directory path defaulting to ``/run`` as unicode string. .. udevversion:: 167 .. versionadded:: 0.10 """ return ensure_unicode_string(self._libudev.udev_get_run_path(self)) @property def log_priority(self): """ The logging priority of the interal logging facitility of udev as integer with a standard :mod:`syslog` priority. Assign to this property to change the logging priority. UDev uses the standard :mod:`syslog` priorities. Constants for these priorities are defined in the :mod:`syslog` module in the standard library: >>> import syslog >>> context = pyudev.Context() >>> context.log_priority = syslog.LOG_DEBUG .. versionadded:: 0.9 """ return self._libudev.udev_get_log_priority(self) @log_priority.setter def log_priority(self, value): self._libudev.udev_set_log_priority(self, value) def list_devices(self, **kwargs): """ List all available devices. The arguments of this method are the same as for :meth:`Enumerator.match()`. In fact, the arguments are simply passed straight to method :meth:`~Enumerator.match()`. This function creates and returns an :class:`Enumerator` object, that can be used to filter the list of devices, and eventually retrieve :class:`Device` objects representing matching devices. .. versionchanged:: 0.8 Accept keyword arguments now for easy matching """ return Enumerator(self).match(**kwargs) class Enumerator(object): """ Enumerate all available devices. To retrieve devices, simply iterate over an instance of this class. This operation yields :class:`Device` objects representing the available devices. Before iteration the device list can be filtered by subsystem or by property values using :meth:`match_subsystem` and :meth:`match_property`. Multiple subsystem (property) filters are combined using a logical OR, filters of different types are combined using a logical AND. The following filter for instance:: devices.match_subsystem('block').match_property( 'ID_TYPE', 'disk').match_property('DEVTYPE', 'disk') means the following:: subsystem == 'block' and (ID_TYPE == 'disk' or DEVTYPE == 'disk') Once added, a filter cannot be removed anymore. Create a new object instead. Instances of this class can directly be given as given ``udev_enumerate *`` to functions wrapped through :mod:`ctypes`. """ def __init__(self, context): """ Create a new enumerator with the given ``context`` (a :class:`Context` instance). While you can create objects of this class directly, this is not recommended. Call :method:`Context.list_devices()` instead. """ if not isinstance(context, Context): raise TypeError('Invalid context object') self.context = context self._as_parameter_ = context._libudev.udev_enumerate_new(context) self._libudev = context._libudev def __del__(self): self._libudev.udev_enumerate_unref(self) def match(self, **kwargs): """ Include devices according to the rules defined by the keyword arguments. These keyword arguments are interpreted as follows: - The value for the keyword argument ``subsystem`` is forwarded to :meth:`match_subsystem()`. - The value for the keyword argument ``sys_name`` is forwared to :meth:`match_sys_name()`. - The value for the keyword argument ``tag`` is forwared to :meth:`match_tag()`. - The value for the keyword argument ``parent`` is forwared to :meth:`match_parent()`. - All other keyword arguments are forwareded one by one to :meth:`match_property()`. The keyword argument itself is interpreted as property name, the value of the keyword argument as the property value. All keyword arguments are optional, calling this method without no arguments at all is simply a noop. Return the instance again. .. versionadded:: 0.8 .. versionchanged:: 0.13 Added ``parent`` keyword """ subsystem = kwargs.pop('subsystem', None) if subsystem is not None: self.match_subsystem(subsystem) sys_name = kwargs.pop('sys_name', None) if sys_name is not None: self.match_sys_name(sys_name) tag = kwargs.pop('tag', None) if tag is not None: self.match_tag(tag) parent = kwargs.pop('parent', None) if parent is not None: self.match_parent(parent) for property, value in kwargs.iteritems(): self.match_property(property, value) return self def match_subsystem(self, subsystem, nomatch=False): """ Include all devices, which are part of the given ``subsystem``. ``subsystem`` is either a unicode string or a byte string, containing the name of the subsystem. If ``nomatch`` is ``True`` (default is ``False``), the match is inverted: A device is only included if it is *not* part of the given ``subsystem``. Return the instance again. """ match = (self._libudev.udev_enumerate_add_match_subsystem if not nomatch else self._libudev.udev_enumerate_add_nomatch_subsystem) match(self, ensure_byte_string(subsystem)) return self def match_sys_name(self, sys_name): """ Include all devices with the given name. ``sys_name`` is a byte or unicode string containing the device name. Return the instance again. .. versionadded:: 0.8 """ self._libudev.udev_enumerate_add_match_sysname( self, ensure_byte_string(sys_name)) return self def match_property(self, property, value): """ Include all devices, whose ``property`` has the given ``value``. ``property`` is either a unicode string or a byte string, containing the name of the property to match. ``value`` is a property value, being one of the following types: - :func:`int` - :func:`bool` - A byte string - Anything convertable to a unicode string (including a unicode string itself) Return the instance again. """ self._libudev.udev_enumerate_add_match_property( self, ensure_byte_string(property), property_value_to_bytes(value)) return self def match_attribute(self, attribute, value, nomatch=False): """ Include all devices, whose ``attribute`` has the given ``value``. ``attribute`` is either a unicode string or a byte string, containing the name of a sys attribute to match. ``value`` is an attribute value, being one of the following types: - :func:`int`, - :func:`bool` - A byte string - Anything convertable to a unicode string (including a unicode string itself) If ``nomatch`` is ``True`` (default is ``False``), the match is inverted: A device is include if the ``attribute`` does *not* match the given ``value``. .. note:: If ``nomatch`` is ``True``, devices which do not have the given ``attribute`` at all are also included. In other words, with ``nomatch=True`` the given ``attribute`` is *not* guaranteed to exist on all returned devices. Return the instance again. """ match = (self._libudev.udev_enumerate_add_match_sysattr if not nomatch else self._libudev.udev_enumerate_add_nomatch_sysattr) match(self, ensure_byte_string(attribute), property_value_to_bytes(value)) return self def match_tag(self, tag): """ Include all devices, which have the given ``tag`` attached. ``tag`` is a byte or unicode string containing the tag name. Return the instance again. .. udevversion:: 154 .. versionadded:: 0.6 """ self._libudev.udev_enumerate_add_match_tag(self, ensure_byte_string(tag)) return self def match_is_initialized(self): """ Include only devices, which are initialized. Initialized devices have properly set device node permissions and context, and are (in case of network devices) fully renamed. Currently this will not affect devices which do not have device nodes and are not network interfaces. Return the instance again. .. seealso:: :attr:`Device.is_initialized` .. udevversion:: 165 .. versionadded:: 0.8 """ self._libudev.udev_enumerate_add_match_is_initialized(self) return self def match_parent(self, parent): """ Include all devices on the subtree of the given ``parent`` device. The ``parent`` device itself is also included. ``parent`` is a :class:`~pyudev.Device`. Return the instance again. .. udevversion:: 172 .. versionadded:: 0.13 """ self._libudev.udev_enumerate_add_match_parent(self, parent) return self def __iter__(self): """ Iterate over all matching devices. Yield :class:`Device` objects. """ self._libudev.udev_enumerate_scan_devices(self) entry = self._libudev.udev_enumerate_get_list_entry(self) for name, _ in udev_list_iterate(self._libudev, entry): yield Device.from_sys_path(self.context, name) PK[Aasite-packages/pyudev/wx.pycnu[ :Oc@`sdZddlmZmZmZmZddlmZmZddl m Z ddl m Z e \Z Ze \ZZe \ZZe \ZZe \ZZdefdYZdS( u> pyudev.wx ========= Provides :class:`~pyudev.wx.WXUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into a :meth:`wx.App.MainLoop`. To use this module, :mod:`wx` from wxPython must be available. .. moduleauthor:: Tobias Eberle .. versionadded:: 0.14 i(tprint_functiontdivisiontunicode_literalstabsolute_import(t EvtHandlert PostEvent(tNewEvent(tMonitorObservertWxUDevMonitorObservercB`sueZdZied6ed6ed6ed6ZdZe dZ e j dZ dZ d Z d ZRS( u Observe a :class:`~pyudev.Monitor` and post wx events upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.wx.WxUDevMonitorObserver(monitor) >>> def device_connected(event): ... print('{0!r} added'.format(event.device)) >>> observer.Bind(EVT_DEVICE_ADDED, device_connected) >>> monitor.start() This class is a child of :class:`wx.EvtHandler`. uadduremoveuchangeumovecC`s-tj|||_d|_|jdS(N(Rt__init__tmonitortNonet_observer_threadtstart(tselfR ((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyR Cs   cC`s |jdk S(u Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. N(R R (R((s-/usr/lib/python2.7/site-packages/pyudev/wx.pytenabledIscC`s!|r|jn |jdS(N(R tstop(Rtvalue((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyRSs cC`sB|jdk rdSt|j|jdd|_|jjdS(u` Enable this observer. Do nothing, if the observer is already enabled. Ntnameuwx-observer-thread(R R RR t _emit_eventsR (R((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyR Zs cC`s$|jdkrdS|jjdS(ub Disable this observer. Do nothing, if the observer is already disabled. N(R R R(R((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyRfscC`sCt|td|d||j|}t||d|dS(Ntactiontdevice(Rt DeviceEventt_action_event_map(RRRt event_class((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyRps (t__name__t __module__t__doc__tDeviceAddedEventtDeviceRemovedEventtDeviceChangedEventtDeviceMovedEventRR tpropertyRtsetterR RR(((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyR,s    N(Rt __future__RRRRtwxRRtwx.lib.neweventRtpyudev.monitorRRtEVT_DEVICE_EVENTRtEVT_DEVICE_ADDEDRtEVT_DEVICE_REMOVEDRtEVT_DEVICE_CHANGEDRtEVT_DEVICE_MOVEDR(((s-/usr/lib/python2.7/site-packages/pyudev/wx.pyts"PK[ֽsite-packages/pyudev/glib.pynu[# -*- coding: utf-8 -*- # Copyright (C) 2010, 2011, 2012 Sebastian Wiesner # This library is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser General Public License as published by the # Free Software Foundation; either version 2.1 of the License, or (at your # option) any later version. # This library is distributed in the hope that it will be useful, but WITHOUT # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License # for more details. # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA """ pyudev.pygtk ============ Provide :class:`~pyudev.glib.GUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into a :class:`glib.MainLoop`. To use this module, :mod:`glib` and :mod:`gobject` from PyGObject_ must be available. PyGtk is not required. .. _PyGObject: http://www.pygtk.org/ .. moduleauthor:: Sebastian Wiesner .. versionadded:: 0.7 """ from __future__ import (print_function, division, unicode_literals, absolute_import) # thanks to absolute imports, this really imports the glib binding and not this # module again import glib import gobject class GUDevMonitorObserver(gobject.GObject): """ Observe a :class:`~pyudev.Monitor` and emit Glib signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pygtk.GUDevMonitorObserver(monitor) >>> def device_connected(observer, device): ... print('{0!r} added'.format(device)) >>> observer.connect('device-added', device_connected) >>> monitor.start() This class is a child of :class:`gobject.GObject`. """ _action_signal_map = { 'add': 'device-added', 'remove': 'device-removed', 'change': 'device-changed', 'move': 'device-moved'} __gsignals__ = { # explicitly convert the signal to str, because glib expects the # *native* string type of the corresponding python version as type of # signal name, and str() is the name of the native string type of both # python versions. We could also remove the "unicode_literals" import, # but I don't want to make exceptions to the standard set of future # imports used throughout pyudev for the sake of consistency. str('device-event'): (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING, gobject.TYPE_PYOBJECT)), str('device-added'): (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), str('device-removed'): (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), str('device-changed'): (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), str('device-moved'): (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_PYOBJECT,)), } def __init__(self, monitor): gobject.GObject.__init__(self) self.monitor = monitor self.event_source = None self.enabled = True @property def enabled(self): """ Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. .. versionadded:: 0.14 """ return self.event_source is not None @enabled.setter def enabled(self, value): if value and self.event_source is None: self.event_source = glib.io_add_watch( self.monitor, glib.IO_IN, self._process_udev_event) elif not value and self.event_source is not None: glib.source_remove(self.event_source) def _process_udev_event(self, source, condition): if condition == glib.IO_IN: event = self.monitor.receive_device() if event: action, device = event self.emit('device-event', action, device) self.emit(self._action_signal_map[action], device) return True gobject.type_register(GUDevMonitorObserver) PK[@ site-packages/pyudev/glib.pyonu[ :Oc@`sjdZddlmZmZmZmZddlZddlZdejfdYZ ej e dS(u pyudev.pygtk ============ Provide :class:`~pyudev.glib.GUDevMonitorObserver` to integrate a :class:`~pyudev.Monitor` into a :class:`glib.MainLoop`. To use this module, :mod:`glib` and :mod:`gobject` from PyGObject_ must be available. PyGtk is not required. .. _PyGObject: http://www.pygtk.org/ .. moduleauthor:: Sebastian Wiesner .. versionadded:: 0.7 i(tprint_functiontdivisiontunicode_literalstabsolute_importNtGUDevMonitorObservercB`seZdZidd6dd6dd6dd6Ziejejejejffe d 6ejejejffe d6ejejejffe d6ejejejffe d6ejejejffe d6Z d Z e d Z e jd Z d ZRS(u  Observe a :class:`~pyudev.Monitor` and emit Glib signals upon device events: >>> context = pyudev.Context() >>> monitor = pyudev.Monitor.from_netlink(context) >>> monitor.filter_by(subsystem='input') >>> observer = pyudev.pygtk.GUDevMonitorObserver(monitor) >>> def device_connected(observer, device): ... print('{0!r} added'.format(device)) >>> observer.connect('device-added', device_connected) >>> monitor.start() This class is a child of :class:`gobject.GObject`. u device-addeduaddudevice-removeduremoveudevice-changeduchangeu device-movedumoveu device-eventcC`s/tjj|||_d|_t|_dS(N(tgobjecttGObjectt__init__tmonitortNonet event_sourcetTruetenabled(tselfR((s//usr/lib/python2.7/site-packages/pyudev/glib.pyRTs  cC`s |jdk S(u Whether this observer is enabled or not. If ``True`` (the default), this observer is enabled, and emits events. Otherwise it is disabled and does not emit any events. .. versionadded:: 0.14 N(R R (R ((s//usr/lib/python2.7/site-packages/pyudev/glib.pyR Zs cC`sf|r9|jdkr9tj|jtj|j|_n)| rb|jdk rbtj|jndS(N(R R tglibt io_add_watchRtIO_INt_process_udev_eventt source_remove(R tvalue((s//usr/lib/python2.7/site-packages/pyudev/glib.pyR fs cC`sd|tjkr`|jj}|r`|\}}|jd|||j|j||q`ntS(Nu device-event(RRRtreceive_devicetemitt_action_signal_mapR (R tsourcet conditionteventtactiontdevice((s//usr/lib/python2.7/site-packages/pyudev/glib.pyRns (t__name__t __module__t__doc__RRtSIGNAL_RUN_LASTt TYPE_NONEt TYPE_STRINGt TYPE_PYOBJECTtstrt __gsignals__RtpropertyR tsetterR(((s//usr/lib/python2.7/site-packages/pyudev/glib.pyR,s&       ( Rt __future__RRRRRRRRt type_register(((s//usr/lib/python2.7/site-packages/pyudev/glib.pyt s "  LPK[ѩ##site-packages/ply/lex.pynu[# ----------------------------------------------------------------------------- # ply: lex.py # # Copyright (C) 2001-2011, # David M. Beazley (Dabeaz LLC) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of the David Beazley or Dabeaz LLC may be used to # endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- __version__ = "3.4" __tabversion__ = "3.2" # Version of table file used import re, sys, types, copy, os # This tuple contains known string types try: # Python 2.6 StringTypes = (types.StringType, types.UnicodeType) except AttributeError: # Python 3.0 StringTypes = (str, bytes) # Extract the code attribute of a function. Different implementations # are for Python 2/3 compatibility. if sys.version_info[0] < 3: def func_code(f): return f.func_code else: def func_code(f): return f.__code__ # This regular expression is used to match valid token names _is_identifier = re.compile(r'^[a-zA-Z0-9_]+$') # Exception thrown when invalid token encountered and no default error # handler is defined. class LexError(Exception): def __init__(self,message,s): self.args = (message,) self.text = s # Token class. This class is used to represent the tokens produced. class LexToken(object): def __str__(self): return "LexToken(%s,%r,%d,%d)" % (self.type,self.value,self.lineno,self.lexpos) def __repr__(self): return str(self) # This object is a stand-in for a logging object created by the # logging module. class PlyLogger(object): def __init__(self,f): self.f = f def critical(self,msg,*args,**kwargs): self.f.write((msg % args) + "\n") def warning(self,msg,*args,**kwargs): self.f.write("WARNING: "+ (msg % args) + "\n") def error(self,msg,*args,**kwargs): self.f.write("ERROR: " + (msg % args) + "\n") info = critical debug = critical # Null logger is used when no output is generated. Does nothing. class NullLogger(object): def __getattribute__(self,name): return self def __call__(self,*args,**kwargs): return self # ----------------------------------------------------------------------------- # === Lexing Engine === # # The following Lexer class implements the lexer runtime. There are only # a few public methods and attributes: # # input() - Store a new string in the lexer # token() - Get the next token # clone() - Clone the lexer # # lineno - Current line number # lexpos - Current position in the input string # ----------------------------------------------------------------------------- class Lexer: def __init__(self): self.lexre = None # Master regular expression. This is a list of # tuples (re,findex) where re is a compiled # regular expression and findex is a list # mapping regex group numbers to rules self.lexretext = None # Current regular expression strings self.lexstatere = {} # Dictionary mapping lexer states to master regexs self.lexstateretext = {} # Dictionary mapping lexer states to regex strings self.lexstaterenames = {} # Dictionary mapping lexer states to symbol names self.lexstate = "INITIAL" # Current lexer state self.lexstatestack = [] # Stack of lexer states self.lexstateinfo = None # State information self.lexstateignore = {} # Dictionary of ignored characters for each state self.lexstateerrorf = {} # Dictionary of error functions for each state self.lexreflags = 0 # Optional re compile flags self.lexdata = None # Actual input data (as a string) self.lexpos = 0 # Current position in input text self.lexlen = 0 # Length of the input text self.lexerrorf = None # Error rule (if any) self.lextokens = None # List of valid tokens self.lexignore = "" # Ignored characters self.lexliterals = "" # Literal characters that can be passed through self.lexmodule = None # Module self.lineno = 1 # Current line number self.lexoptimize = 0 # Optimized mode def clone(self,object=None): c = copy.copy(self) # If the object parameter has been supplied, it means we are attaching the # lexer to a new object. In this case, we have to rebind all methods in # the lexstatere and lexstateerrorf tables. if object: newtab = { } for key, ritem in self.lexstatere.items(): newre = [] for cre, findex in ritem: newfindex = [] for f in findex: if not f or not f[0]: newfindex.append(f) continue newfindex.append((getattr(object,f[0].__name__),f[1])) newre.append((cre,newfindex)) newtab[key] = newre c.lexstatere = newtab c.lexstateerrorf = { } for key, ef in self.lexstateerrorf.items(): c.lexstateerrorf[key] = getattr(object,ef.__name__) c.lexmodule = object return c # ------------------------------------------------------------ # writetab() - Write lexer information to a table file # ------------------------------------------------------------ def writetab(self,tabfile,outputdir=""): if isinstance(tabfile,types.ModuleType): return basetabfilename = tabfile.split(".")[-1] filename = os.path.join(outputdir,basetabfilename)+".py" tf = open(filename,"w") tf.write("# %s.py. This file automatically created by PLY (version %s). Don't edit!\n" % (tabfile,__version__)) tf.write("_tabversion = %s\n" % repr(__version__)) tf.write("_lextokens = %s\n" % repr(self.lextokens)) tf.write("_lexreflags = %s\n" % repr(self.lexreflags)) tf.write("_lexliterals = %s\n" % repr(self.lexliterals)) tf.write("_lexstateinfo = %s\n" % repr(self.lexstateinfo)) tabre = { } # Collect all functions in the initial state initial = self.lexstatere["INITIAL"] initialfuncs = [] for part in initial: for f in part[1]: if f and f[0]: initialfuncs.append(f) for key, lre in self.lexstatere.items(): titem = [] for i in range(len(lre)): titem.append((self.lexstateretext[key][i],_funcs_to_names(lre[i][1],self.lexstaterenames[key][i]))) tabre[key] = titem tf.write("_lexstatere = %s\n" % repr(tabre)) tf.write("_lexstateignore = %s\n" % repr(self.lexstateignore)) taberr = { } for key, ef in self.lexstateerrorf.items(): if ef: taberr[key] = ef.__name__ else: taberr[key] = None tf.write("_lexstateerrorf = %s\n" % repr(taberr)) tf.close() # ------------------------------------------------------------ # readtab() - Read lexer information from a tab file # ------------------------------------------------------------ def readtab(self,tabfile,fdict): if isinstance(tabfile,types.ModuleType): lextab = tabfile else: if sys.version_info[0] < 3: exec("import %s as lextab" % tabfile) else: env = { } exec("import %s as lextab" % tabfile, env,env) lextab = env['lextab'] if getattr(lextab,"_tabversion","0.0") != __version__: raise ImportError("Inconsistent PLY version") self.lextokens = lextab._lextokens self.lexreflags = lextab._lexreflags self.lexliterals = lextab._lexliterals self.lexstateinfo = lextab._lexstateinfo self.lexstateignore = lextab._lexstateignore self.lexstatere = { } self.lexstateretext = { } for key,lre in lextab._lexstatere.items(): titem = [] txtitem = [] for i in range(len(lre)): titem.append((re.compile(lre[i][0],lextab._lexreflags | re.VERBOSE),_names_to_funcs(lre[i][1],fdict))) txtitem.append(lre[i][0]) self.lexstatere[key] = titem self.lexstateretext[key] = txtitem self.lexstateerrorf = { } for key,ef in lextab._lexstateerrorf.items(): self.lexstateerrorf[key] = fdict[ef] self.begin('INITIAL') # ------------------------------------------------------------ # input() - Push a new string into the lexer # ------------------------------------------------------------ def input(self,s): # Pull off the first character to see if s looks like a string c = s[:1] if not isinstance(c,StringTypes): raise ValueError("Expected a string") self.lexdata = s self.lexpos = 0 self.lexlen = len(s) # ------------------------------------------------------------ # begin() - Changes the lexing state # ------------------------------------------------------------ def begin(self,state): if not state in self.lexstatere: raise ValueError("Undefined state") self.lexre = self.lexstatere[state] self.lexretext = self.lexstateretext[state] self.lexignore = self.lexstateignore.get(state,"") self.lexerrorf = self.lexstateerrorf.get(state,None) self.lexstate = state # ------------------------------------------------------------ # push_state() - Changes the lexing state and saves old on stack # ------------------------------------------------------------ def push_state(self,state): self.lexstatestack.append(self.lexstate) self.begin(state) # ------------------------------------------------------------ # pop_state() - Restores the previous state # ------------------------------------------------------------ def pop_state(self): self.begin(self.lexstatestack.pop()) # ------------------------------------------------------------ # current_state() - Returns the current lexing state # ------------------------------------------------------------ def current_state(self): return self.lexstate # ------------------------------------------------------------ # skip() - Skip ahead n characters # ------------------------------------------------------------ def skip(self,n): self.lexpos += n # ------------------------------------------------------------ # opttoken() - Return the next token from the Lexer # # Note: This function has been carefully implemented to be as fast # as possible. Don't make changes unless you really know what # you are doing # ------------------------------------------------------------ def token(self): # Make local copies of frequently referenced attributes lexpos = self.lexpos lexlen = self.lexlen lexignore = self.lexignore lexdata = self.lexdata while lexpos < lexlen: # This code provides some short-circuit code for whitespace, tabs, and other ignored characters if lexdata[lexpos] in lexignore: lexpos += 1 continue # Look for a regular expression match for lexre,lexindexfunc in self.lexre: m = lexre.match(lexdata,lexpos) if not m: continue # Create a token for return tok = LexToken() tok.value = m.group() tok.lineno = self.lineno tok.lexpos = lexpos i = m.lastindex func,tok.type = lexindexfunc[i] if not func: # If no token type was set, it's an ignored token if tok.type: self.lexpos = m.end() return tok else: lexpos = m.end() break lexpos = m.end() # If token is processed by a function, call it tok.lexer = self # Set additional attributes useful in token rules self.lexmatch = m self.lexpos = lexpos newtok = func(tok) # Every function must return a token, if nothing, we just move to next token if not newtok: lexpos = self.lexpos # This is here in case user has updated lexpos. lexignore = self.lexignore # This is here in case there was a state change break # Verify type of the token. If not in the token map, raise an error if not self.lexoptimize: if not newtok.type in self.lextokens: raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % ( func_code(func).co_filename, func_code(func).co_firstlineno, func.__name__, newtok.type),lexdata[lexpos:]) return newtok else: # No match, see if in literals if lexdata[lexpos] in self.lexliterals: tok = LexToken() tok.value = lexdata[lexpos] tok.lineno = self.lineno tok.type = tok.value tok.lexpos = lexpos self.lexpos = lexpos + 1 return tok # No match. Call t_error() if defined. if self.lexerrorf: tok = LexToken() tok.value = self.lexdata[lexpos:] tok.lineno = self.lineno tok.type = "error" tok.lexer = self tok.lexpos = lexpos self.lexpos = lexpos newtok = self.lexerrorf(tok) if lexpos == self.lexpos: # Error method didn't change text position at all. This is an error. raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:]) lexpos = self.lexpos if not newtok: continue return newtok self.lexpos = lexpos raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos],lexpos), lexdata[lexpos:]) self.lexpos = lexpos + 1 if self.lexdata is None: raise RuntimeError("No input string given with input()") return None # Iterator interface def __iter__(self): return self def next(self): t = self.token() if t is None: raise StopIteration return t __next__ = next # ----------------------------------------------------------------------------- # ==== Lex Builder === # # The functions and classes below are used to collect lexing information # and build a Lexer object from it. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # get_caller_module_dict() # # This function returns a dictionary containing all of the symbols defined within # a caller further down the call stack. This is used to get the environment # associated with the yacc() call if none was provided. # ----------------------------------------------------------------------------- def get_caller_module_dict(levels): try: raise RuntimeError except RuntimeError: e,b,t = sys.exc_info() f = t.tb_frame while levels > 0: f = f.f_back levels -= 1 ldict = f.f_globals.copy() if f.f_globals != f.f_locals: ldict.update(f.f_locals) return ldict # ----------------------------------------------------------------------------- # _funcs_to_names() # # Given a list of regular expression functions, this converts it to a list # suitable for output to a table file # ----------------------------------------------------------------------------- def _funcs_to_names(funclist,namelist): result = [] for f,name in zip(funclist,namelist): if f and f[0]: result.append((name, f[1])) else: result.append(f) return result # ----------------------------------------------------------------------------- # _names_to_funcs() # # Given a list of regular expression function names, this converts it back to # functions. # ----------------------------------------------------------------------------- def _names_to_funcs(namelist,fdict): result = [] for n in namelist: if n and n[0]: result.append((fdict[n[0]],n[1])) else: result.append(n) return result # ----------------------------------------------------------------------------- # _form_master_re() # # This function takes a list of all of the regex components and attempts to # form the master regular expression. Given limitations in the Python re # module, it may be necessary to break the master regex into separate expressions. # ----------------------------------------------------------------------------- def _form_master_re(relist,reflags,ldict,toknames): if not relist: return [] regex = "|".join(relist) try: lexre = re.compile(regex,re.VERBOSE | reflags) # Build the index to function map for the matching engine lexindexfunc = [ None ] * (max(lexre.groupindex.values())+1) lexindexnames = lexindexfunc[:] for f,i in lexre.groupindex.items(): handle = ldict.get(f,None) if type(handle) in (types.FunctionType, types.MethodType): lexindexfunc[i] = (handle,toknames[f]) lexindexnames[i] = f elif handle is not None: lexindexnames[i] = f if f.find("ignore_") > 0: lexindexfunc[i] = (None,None) else: lexindexfunc[i] = (None, toknames[f]) return [(lexre,lexindexfunc)],[regex],[lexindexnames] except Exception: m = int(len(relist)/2) if m == 0: m = 1 llist, lre, lnames = _form_master_re(relist[:m],reflags,ldict,toknames) rlist, rre, rnames = _form_master_re(relist[m:],reflags,ldict,toknames) return llist+rlist, lre+rre, lnames+rnames # ----------------------------------------------------------------------------- # def _statetoken(s,names) # # Given a declaration name s of the form "t_" and a dictionary whose keys are # state names, this function returns a tuple (states,tokenname) where states # is a tuple of state names and tokenname is the name of the token. For example, # calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM') # ----------------------------------------------------------------------------- def _statetoken(s,names): nonstate = 1 parts = s.split("_") for i in range(1,len(parts)): if not parts[i] in names and parts[i] != 'ANY': break if i > 1: states = tuple(parts[1:i]) else: states = ('INITIAL',) if 'ANY' in states: states = tuple(names) tokenname = "_".join(parts[i:]) return (states,tokenname) # ----------------------------------------------------------------------------- # LexerReflect() # # This class represents information needed to build a lexer as extracted from a # user's input file. # ----------------------------------------------------------------------------- class LexerReflect(object): def __init__(self,ldict,log=None,reflags=0): self.ldict = ldict self.error_func = None self.tokens = [] self.reflags = reflags self.stateinfo = { 'INITIAL' : 'inclusive'} self.files = {} self.error = 0 if log is None: self.log = PlyLogger(sys.stderr) else: self.log = log # Get all of the basic information def get_all(self): self.get_tokens() self.get_literals() self.get_states() self.get_rules() # Validate all of the information def validate_all(self): self.validate_tokens() self.validate_literals() self.validate_rules() return self.error # Get the tokens map def get_tokens(self): tokens = self.ldict.get("tokens",None) if not tokens: self.log.error("No token list is defined") self.error = 1 return if not isinstance(tokens,(list, tuple)): self.log.error("tokens must be a list or tuple") self.error = 1 return if not tokens: self.log.error("tokens is empty") self.error = 1 return self.tokens = tokens # Validate the tokens def validate_tokens(self): terminals = {} for n in self.tokens: if not _is_identifier.match(n): self.log.error("Bad token name '%s'",n) self.error = 1 if n in terminals: self.log.warning("Token '%s' multiply defined", n) terminals[n] = 1 # Get the literals specifier def get_literals(self): self.literals = self.ldict.get("literals","") # Validate literals def validate_literals(self): try: for c in self.literals: if not isinstance(c,StringTypes) or len(c) > 1: self.log.error("Invalid literal %s. Must be a single character", repr(c)) self.error = 1 continue except TypeError: self.log.error("Invalid literals specification. literals must be a sequence of characters") self.error = 1 def get_states(self): self.states = self.ldict.get("states",None) # Build statemap if self.states: if not isinstance(self.states,(tuple,list)): self.log.error("states must be defined as a tuple or list") self.error = 1 else: for s in self.states: if not isinstance(s,tuple) or len(s) != 2: self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')",repr(s)) self.error = 1 continue name, statetype = s if not isinstance(name,StringTypes): self.log.error("State name %s must be a string", repr(name)) self.error = 1 continue if not (statetype == 'inclusive' or statetype == 'exclusive'): self.log.error("State type for state %s must be 'inclusive' or 'exclusive'",name) self.error = 1 continue if name in self.stateinfo: self.log.error("State '%s' already defined",name) self.error = 1 continue self.stateinfo[name] = statetype # Get all of the symbols with a t_ prefix and sort them into various # categories (functions, strings, error functions, and ignore characters) def get_rules(self): tsymbols = [f for f in self.ldict if f[:2] == 't_' ] # Now build up a list of functions and a list of strings self.toknames = { } # Mapping of symbols to token names self.funcsym = { } # Symbols defined as functions self.strsym = { } # Symbols defined as strings self.ignore = { } # Ignore strings by state self.errorf = { } # Error functions by state for s in self.stateinfo: self.funcsym[s] = [] self.strsym[s] = [] if len(tsymbols) == 0: self.log.error("No rules of the form t_rulename are defined") self.error = 1 return for f in tsymbols: t = self.ldict[f] states, tokname = _statetoken(f,self.stateinfo) self.toknames[f] = tokname if hasattr(t,"__call__"): if tokname == 'error': for s in states: self.errorf[s] = t elif tokname == 'ignore': line = func_code(t).co_firstlineno file = func_code(t).co_filename self.log.error("%s:%d: Rule '%s' must be defined as a string",file,line,t.__name__) self.error = 1 else: for s in states: self.funcsym[s].append((f,t)) elif isinstance(t, StringTypes): if tokname == 'ignore': for s in states: self.ignore[s] = t if "\\" in t: self.log.warning("%s contains a literal backslash '\\'",f) elif tokname == 'error': self.log.error("Rule '%s' must be defined as a function", f) self.error = 1 else: for s in states: self.strsym[s].append((f,t)) else: self.log.error("%s not defined as a function or string", f) self.error = 1 # Sort the functions by line number for f in self.funcsym.values(): if sys.version_info[0] < 3: f.sort(lambda x,y: cmp(func_code(x[1]).co_firstlineno,func_code(y[1]).co_firstlineno)) else: # Python 3.0 f.sort(key=lambda x: func_code(x[1]).co_firstlineno) # Sort the strings by regular expression length for s in self.strsym.values(): if sys.version_info[0] < 3: s.sort(lambda x,y: (len(x[1]) < len(y[1])) - (len(x[1]) > len(y[1]))) else: # Python 3.0 s.sort(key=lambda x: len(x[1]),reverse=True) # Validate all of the t_rules collected def validate_rules(self): for state in self.stateinfo: # Validate all rules defined by functions for fname, f in self.funcsym[state]: line = func_code(f).co_firstlineno file = func_code(f).co_filename self.files[file] = 1 tokname = self.toknames[fname] if isinstance(f, types.MethodType): reqargs = 2 else: reqargs = 1 nargs = func_code(f).co_argcount if nargs > reqargs: self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) self.error = 1 continue if nargs < reqargs: self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) self.error = 1 continue if not f.__doc__: self.log.error("%s:%d: No regular expression defined for rule '%s'",file,line,f.__name__) self.error = 1 continue try: c = re.compile("(?P<%s>%s)" % (fname,f.__doc__), re.VERBOSE | self.reflags) if c.match(""): self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file,line,f.__name__) self.error = 1 except re.error: _etype, e, _etrace = sys.exc_info() self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file,line,f.__name__,e) if '#' in f.__doc__: self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'",file,line, f.__name__) self.error = 1 # Validate all rules defined by strings for name,r in self.strsym[state]: tokname = self.toknames[name] if tokname == 'error': self.log.error("Rule '%s' must be defined as a function", name) self.error = 1 continue if not tokname in self.tokens and tokname.find("ignore_") < 0: self.log.error("Rule '%s' defined for an unspecified token %s",name,tokname) self.error = 1 continue try: c = re.compile("(?P<%s>%s)" % (name,r),re.VERBOSE | self.reflags) if (c.match("")): self.log.error("Regular expression for rule '%s' matches empty string",name) self.error = 1 except re.error: _etype, e, _etrace = sys.exc_info() self.log.error("Invalid regular expression for rule '%s'. %s",name,e) if '#' in r: self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'",name) self.error = 1 if not self.funcsym[state] and not self.strsym[state]: self.log.error("No rules defined for state '%s'",state) self.error = 1 # Validate the error function efunc = self.errorf.get(state,None) if efunc: f = efunc line = func_code(f).co_firstlineno file = func_code(f).co_filename self.files[file] = 1 if isinstance(f, types.MethodType): reqargs = 2 else: reqargs = 1 nargs = func_code(f).co_argcount if nargs > reqargs: self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,f.__name__) self.error = 1 if nargs < reqargs: self.log.error("%s:%d: Rule '%s' requires an argument", file,line,f.__name__) self.error = 1 for f in self.files: self.validate_file(f) # ----------------------------------------------------------------------------- # validate_file() # # This checks to see if there are duplicated t_rulename() functions or strings # in the parser input file. This is done using a simple regular expression # match on each line in the given file. # ----------------------------------------------------------------------------- def validate_file(self,filename): import os.path base,ext = os.path.splitext(filename) if ext != '.py': return # No idea what the file is. Return OK try: f = open(filename) lines = f.readlines() f.close() except IOError: return # Couldn't find the file. Don't worry about it fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(') sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=') counthash = { } linen = 1 for l in lines: m = fre.match(l) if not m: m = sre.match(l) if m: name = m.group(1) prev = counthash.get(name) if not prev: counthash[name] = linen else: self.log.error("%s:%d: Rule %s redefined. Previously defined on line %d",filename,linen,name,prev) self.error = 1 linen += 1 # ----------------------------------------------------------------------------- # lex(module) # # Build all of the regular expression rules from definitions in the supplied module # ----------------------------------------------------------------------------- def lex(module=None,object=None,debug=0,optimize=0,lextab="lextab",reflags=0,nowarn=0,outputdir="", debuglog=None, errorlog=None): global lexer ldict = None stateinfo = { 'INITIAL' : 'inclusive'} lexobj = Lexer() lexobj.lexoptimize = optimize global token,input if errorlog is None: errorlog = PlyLogger(sys.stderr) if debug: if debuglog is None: debuglog = PlyLogger(sys.stderr) # Get the module dictionary used for the lexer if object: module = object if module: _items = [(k,getattr(module,k)) for k in dir(module)] ldict = dict(_items) else: ldict = get_caller_module_dict(2) # Collect parser information from the dictionary linfo = LexerReflect(ldict,log=errorlog,reflags=reflags) linfo.get_all() if not optimize: if linfo.validate_all(): raise SyntaxError("Can't build lexer") if optimize and lextab: try: lexobj.readtab(lextab,ldict) token = lexobj.token input = lexobj.input lexer = lexobj return lexobj except ImportError: pass # Dump some basic debugging information if debug: debuglog.info("lex: tokens = %r", linfo.tokens) debuglog.info("lex: literals = %r", linfo.literals) debuglog.info("lex: states = %r", linfo.stateinfo) # Build a dictionary of valid token names lexobj.lextokens = { } for n in linfo.tokens: lexobj.lextokens[n] = 1 # Get literals specification if isinstance(linfo.literals,(list,tuple)): lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals) else: lexobj.lexliterals = linfo.literals # Get the stateinfo dictionary stateinfo = linfo.stateinfo regexs = { } # Build the master regular expressions for state in stateinfo: regex_list = [] # Add rules defined by functions first for fname, f in linfo.funcsym[state]: line = func_code(f).co_firstlineno file = func_code(f).co_filename regex_list.append("(?P<%s>%s)" % (fname,f.__doc__)) if debug: debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",fname,f.__doc__, state) # Now add all of the simple rules for name,r in linfo.strsym[state]: regex_list.append("(?P<%s>%s)" % (name,r)) if debug: debuglog.info("lex: Adding rule %s -> '%s' (state '%s')",name,r, state) regexs[state] = regex_list # Build the master regular expressions if debug: debuglog.info("lex: ==== MASTER REGEXS FOLLOW ====") for state in regexs: lexre, re_text, re_names = _form_master_re(regexs[state],reflags,ldict,linfo.toknames) lexobj.lexstatere[state] = lexre lexobj.lexstateretext[state] = re_text lexobj.lexstaterenames[state] = re_names if debug: for i in range(len(re_text)): debuglog.info("lex: state '%s' : regex[%d] = '%s'",state, i, re_text[i]) # For inclusive states, we need to add the regular expressions from the INITIAL state for state,stype in stateinfo.items(): if state != "INITIAL" and stype == 'inclusive': lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL']) lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL']) lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL']) lexobj.lexstateinfo = stateinfo lexobj.lexre = lexobj.lexstatere["INITIAL"] lexobj.lexretext = lexobj.lexstateretext["INITIAL"] lexobj.lexreflags = reflags # Set up ignore variables lexobj.lexstateignore = linfo.ignore lexobj.lexignore = lexobj.lexstateignore.get("INITIAL","") # Set up error functions lexobj.lexstateerrorf = linfo.errorf lexobj.lexerrorf = linfo.errorf.get("INITIAL",None) if not lexobj.lexerrorf: errorlog.warning("No t_error rule is defined") # Check state information for ignore and error rules for s,stype in stateinfo.items(): if stype == 'exclusive': if not s in linfo.errorf: errorlog.warning("No error rule is defined for exclusive state '%s'", s) if not s in linfo.ignore and lexobj.lexignore: errorlog.warning("No ignore rule is defined for exclusive state '%s'", s) elif stype == 'inclusive': if not s in linfo.errorf: linfo.errorf[s] = linfo.errorf.get("INITIAL",None) if not s in linfo.ignore: linfo.ignore[s] = linfo.ignore.get("INITIAL","") # Create global versions of the token() and input() functions token = lexobj.token input = lexobj.input lexer = lexobj # If in optimize mode, we write the lextab if lextab and optimize: lexobj.writetab(lextab,outputdir) return lexobj # ----------------------------------------------------------------------------- # runmain() # # This runs the lexer as a main program # ----------------------------------------------------------------------------- def runmain(lexer=None,data=None): if not data: try: filename = sys.argv[1] f = open(filename) data = f.read() f.close() except IndexError: sys.stdout.write("Reading from standard input (type EOF to end):\n") data = sys.stdin.read() if lexer: _input = lexer.input else: _input = input _input(data) if lexer: _token = lexer.token else: _token = token while 1: tok = _token() if not tok: break sys.stdout.write("(%s,%r,%d,%d)\n" % (tok.type, tok.value, tok.lineno,tok.lexpos)) # ----------------------------------------------------------------------------- # @TOKEN(regex) # # This decorator function can be used to set the regex expression on a function # when its docstring might need to be set in an alternative way # ----------------------------------------------------------------------------- def TOKEN(r): def set_doc(f): if hasattr(r,"__call__"): f.__doc__ = r.__doc__ else: f.__doc__ = r return f return set_doc # Alternative spelling of the TOKEN decorator Token = TOKEN PK[ ]site-packages/ply/__init__.pycnu[ ]Mc@sddgZdS(tlextyaccN(t__all__(((s0/usr/lib/python2.7/site-packages/ply/__init__.pytsPK[H_*b b site-packages/ply/ctokens.pynu[# ---------------------------------------------------------------------- # ctokens.py # # Token specifications for symbols in ANSI C and C++. This file is # meant to be used as a library in other tokenizers. # ---------------------------------------------------------------------- # Reserved words tokens = [ # Literals (identifier, integer constant, float constant, string constant, char const) 'ID', 'TYPEID', 'ICONST', 'FCONST', 'SCONST', 'CCONST', # Operators (+,-,*,/,%,|,&,~,^,<<,>>, ||, &&, !, <, <=, >, >=, ==, !=) 'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD', 'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT', 'LOR', 'LAND', 'LNOT', 'LT', 'LE', 'GT', 'GE', 'EQ', 'NE', # Assignment (=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=) 'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL', 'PLUSEQUAL', 'MINUSEQUAL', 'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL', # Increment/decrement (++,--) 'PLUSPLUS', 'MINUSMINUS', # Structure dereference (->) 'ARROW', # Ternary operator (?) 'TERNARY', # Delimeters ( ) [ ] { } , . ; : 'LPAREN', 'RPAREN', 'LBRACKET', 'RBRACKET', 'LBRACE', 'RBRACE', 'COMMA', 'PERIOD', 'SEMI', 'COLON', # Ellipsis (...) 'ELLIPSIS', ] # Operators t_PLUS = r'\+' t_MINUS = r'-' t_TIMES = r'\*' t_DIVIDE = r'/' t_MODULO = r'%' t_OR = r'\|' t_AND = r'&' t_NOT = r'~' t_XOR = r'\^' t_LSHIFT = r'<<' t_RSHIFT = r'>>' t_LOR = r'\|\|' t_LAND = r'&&' t_LNOT = r'!' t_LT = r'<' t_GT = r'>' t_LE = r'<=' t_GE = r'>=' t_EQ = r'==' t_NE = r'!=' # Assignment operators t_EQUALS = r'=' t_TIMESEQUAL = r'\*=' t_DIVEQUAL = r'/=' t_MODEQUAL = r'%=' t_PLUSEQUAL = r'\+=' t_MINUSEQUAL = r'-=' t_LSHIFTEQUAL = r'<<=' t_RSHIFTEQUAL = r'>>=' t_ANDEQUAL = r'&=' t_OREQUAL = r'\|=' t_XOREQUAL = r'^=' # Increment/decrement t_INCREMENT = r'\+\+' t_DECREMENT = r'--' # -> t_ARROW = r'->' # ? t_TERNARY = r'\?' # Delimeters t_LPAREN = r'\(' t_RPAREN = r'\)' t_LBRACKET = r'\[' t_RBRACKET = r'\]' t_LBRACE = r'\{' t_RBRACE = r'\}' t_COMMA = r',' t_PERIOD = r'\.' t_SEMI = r';' t_COLON = r':' t_ELLIPSIS = r'\.\.\.' # Identifiers t_ID = r'[A-Za-z_][A-Za-z0-9_]*' # Integer literal t_INTEGER = r'\d+([uU]|[lL]|[uU][lL]|[lL][uU])?' # Floating literal t_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?' # String literal t_STRING = r'\"([^\\\n]|(\\.))*?\"' # Character constant 'c' or L'c' t_CHARACTER = r'(L)?\'([^\\\n]|(\\.))*?\'' # Comment (C-Style) def t_COMMENT(t): r'/\*(.|\n)*?\*/' t.lexer.lineno += t.value.count('\n') return t # Comment (C++-Style) def t_CPPCOMMENT(t): r'//.*\n' t.lexer.lineno += 1 return t PK[yffsite-packages/ply/lex.pyonu[ ]Mc @sdZdZddlZddlZddlZddlZddlZyejejfZ Wne k r}e e fZ nXej ddkrdZn dZejdZd efd YZd efd YZd efdYZdefdYZdfdYZdZdZdZdZdZdefdYZeeddddddeed ZeedZ dZ!e!Z"dS(s3.4s3.2iNiicCs|jS(N(t func_code(tf((s+/usr/lib/python2.7/site-packages/ply/lex.pyR3scCs|jS(N(t__code__(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyR6ss^[a-zA-Z0-9_]+$tLexErrorcBseZdZRS(cCs|f|_||_dS(N(targsttext(tselftmessagets((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__init__@s (t__name__t __module__R (((s+/usr/lib/python2.7/site-packages/ply/lex.pyR?stLexTokencBseZdZdZRS(cCs d|j|j|j|jfS(NsLexToken(%s,%r,%d,%d)(ttypetvaluetlinenotlexpos(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__str__FscCs t|S(N(tstr(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__repr__Hs(R R RR(((s+/usr/lib/python2.7/site-packages/ply/lex.pyR Es t PlyLoggercBs8eZdZdZdZdZeZeZRS(cCs ||_dS(N(R(RR((s+/usr/lib/python2.7/site-packages/ply/lex.pyR OscOs|jj||ddS(Ns (Rtwrite(RtmsgRtkwargs((s+/usr/lib/python2.7/site-packages/ply/lex.pytcriticalQscOs |jjd||ddS(Ns WARNING: s (RR(RRRR((s+/usr/lib/python2.7/site-packages/ply/lex.pytwarningTscOs |jjd||ddS(NsERROR: s (RR(RRRR((s+/usr/lib/python2.7/site-packages/ply/lex.pyterrorWs(R R R RRRtinfotdebug(((s+/usr/lib/python2.7/site-packages/ply/lex.pyRNs     t NullLoggercBseZdZdZRS(cCs|S(N((Rtname((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__getattribute___scOs|S(N((RRR((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__call__as(R R RR (((s+/usr/lib/python2.7/site-packages/ply/lex.pyR^s tLexercBseZdZddZddZdZdZdZdZ dZ d Z d Z d Z d Zd ZeZRS(cCsd|_d|_i|_i|_i|_d|_g|_d|_i|_ i|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_dS(NtINITIALiti(tNonetlexret lexretextt lexstateretlexstateretexttlexstaterenamestlexstatet lexstatestackt lexstateinfotlexstateignoretlexstateerrorft lexreflagstlexdataRtlexlent lexerrorft lextokenst lexignoret lexliteralst lexmoduleRt lexoptimize(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyR ss*                    c Cs3tj|}|r/i}x|jjD]\}}g}xw|D]o\}}g} xZ|D]R} | su| d r| j| q]n| jt|| dj| dfq]WqDW|j|| f|||c Bse|ejr|}nGejddkr=d|dUn%i}d|||fdU|d}e|ddekredn|j|_ |j |_ |j |_ |j|_|j|_i|_i|_x|jjD]\}}g}g}xqee|D]]} |jej|| d|j ejBe|| d|f|j|| dqW||j|<||j|s   cCsxi}xk|jD]`}tj|sD|jjd|d|_n||krf|jjd|nd||sR?cSst|djS(Ni(RR(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyRscSs<t|dt|dkt|dt|dkS(Ni(RT(RR((s+/usr/lib/python2.7/site-packages/ply/lex.pyRscSst|dS(Ni(RT(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyRstreverse(RRtfuncsymtstrsymRterrorfRRTRRRthasattrRRRR R:RIRzRRRgRhtsorttTrue( RRttsymbolsRRRttoknametlinetfile((s+/usr/lib/python2.7/site-packages/ply/lex.pyRsb,               !      ! cCsx|jD]}x |j|D]\}}t|j}t|j}d|j|<|j|}t|tj r}d}nd}t|j }||kr|j j d|||j d|_ qn||kr|j j d|||j d|_ qn|js4|j j d|||j d|_ qnydtjd||jftj|jB} | jdr|j j d|||j d|_ nWqtj k rtj\} } } |j j d |||j | d |jkr |j j d |||j nd|_ qXqWxd|j|D]U\} }|j| }|d krs|j j d | d|_ q,n||jkr|jddkr|j j d| |d|_ q,nyXtjd| |ftj|jB} | jdr|j j d| d|_ nWq,tj k rtj\} } } |j j d| | d |krt|j j d| nd|_ q,Xq,W|j| r|j| r|j j d|d|_ n|jj|d}|r |}t|j}t|j}d|j|%s)R#s<%s:%d: Regular expression for rule '%s' matches empty strings3%s:%d: Invalid regular expression for rule '%s'. %st#s6%s:%d. Make sure '#' in rule '%s' is escaped with '\#'Rs'Rule '%s' must be defined as a functionRis-Rule '%s' defined for an unspecified token %ss5Regular expression for rule '%s' matches empty strings,Invalid regular expression for rule '%s'. %ss/Make sure '#' in rule '%s' is escaped with '\#'sNo rules defined for state '%s'(RRRRRRRRIRJRt co_argcountRRR t__doc__RpRqRrRRRgRRRRRR}R$t validate_file(RR~tfnameRRRRtreqargstnargsR=t_etypeRt_etraceRtrtefunc((s+/usr/lib/python2.7/site-packages/ply/lex.pyRs         )   $ &       cCs>ddl}|jj|\}}|dkr4dSy&t|}|j}|jWntk rndSXtjd}tjd}i} d} x|D]} |j | } | s|j | } n| r,| j d} | j | }|s| | | %s)s(lex: Adding rule %s -> '%s' (state '%s')s#lex: ==== MASTER REGEXS FOLLOW ====s"lex: state '%s' : regex[%d] = '%s'R#sNo t_error rule is definedRs1No error rule is defined for exclusive state '%s's2No ignore rule is defined for exclusive state '%s'(;R$R!R7RRgRtdirR;tdictRRRRt SyntaxErrorRyRR|RRiRRRRR3RIRRR ROR5RRRRR:RRRRR'R(R)RSRTR9textendR,R%R&R/RR-R}R4RR.R2RRd( tmoduleR<RtoptimizeReRtnowarnRXtdebuglogterrorlogRRtlexobjtkt_itemstlinfoRtregexsR~t regex_listRRRRRRR%tre_texttre_namesRbtstypeR((s+/usr/lib/python2.7/site-packages/ply/lex.pytlexas      .        (     %   %"       &   cCs|soy3tjd}t|}|j}|jWqotk rktjjdtjj}qoXn|r|j }nt }|||r|j }nt }xB|}|sPntjjd|j |j |j |jfqdS(Nis/Reading from standard input (type EOF to end): s(%s,%r,%d,%d) (RgtargvRPtreadRVt IndexErrortstdoutRtstdinR|RR RRR(RtdataRZRt_inputt_tokenR((s+/usr/lib/python2.7/site-packages/ply/lex.pytrunmains*        csfd}|S(Ncs+tdrj|_n |_|S(NR (RR(R(R(s+/usr/lib/python2.7/site-packages/ply/lex.pytset_docs ((RR$((Rs+/usr/lib/python2.7/site-packages/ply/lex.pytTOKENs(#RQt__tabversion__RpRgRJR8RMt StringTypet UnicodeTypeRztAttributeErrorRtbytesRhRRqRRRR<R RRR!RRURsRRRR$RR#R%tToken(((s+/usr/lib/python2.7/site-packages/ply/lex.pyt"s6<    :    ' B'! PK[4uusite-packages/ply/yacc.pyonu[ arYc@sdZdZdZdZdZdZdZdZdZdZ d d l Z d d l Z d d l Z d d l Ze jddkrd Zn d Zy e jZWnek re jZnXd ZdefdYZdefdYZdefdYZdZdZdfdYZdfdYZdfdYZd d l Z e j dZ!defdYZ"defd YZ#d!efd"YZ$d#Z%d$efd%YZ&d&efd'YZ'd(efd)YZ(d*efd+YZ)d,Z*d-Z+d.efd/YZ,d0e)fd1YZ-d2Z.d3Z/d4efd5YZ0dee1ee1ddded6e1e1e1d7 Z2d S(8s3.4s3.2is parser.outtparsetabtLALRiii(iNcCs|jS(N(t func_code(tf((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR[scCs|jS(N(t__code__(R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR^scCs5tjddkr"ddl}nddlj}|S(Niii(tsyst version_infotlextply.lex(R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt load_ply_lexhst PlyLoggercBs8eZdZdZeZdZdZeZRS(cCs ||_dS(N(R(tselfR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__init__vscOs|jj||ddS(Ns (Rtwrite(R tmsgtargstkwargs((s,/usr/lib/python2.7/site-packages/ply/yacc.pytdebugxscOs |jjd||ddS(Ns WARNING: s (RR (R RRR((s,/usr/lib/python2.7/site-packages/ply/yacc.pytwarning|scOs |jjd||ddS(NsERROR: s (RR (R RRR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyterrors(t__name__t __module__R RtinfoRRtcritical(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR us     t NullLoggercBseZdZdZRS(cCs|S(N((R tname((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__getattribute__scOs|S(N((R RR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__call__s(RRRR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs t YaccErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRscCspt|}d|kr't|}nt|tkrJ|t d}ndt|jt||f}|S(Ns s ...s<%s @ 0x%x> (%s)(treprtlent resultlimitttypeRtid(trtrepr_strtresult((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt format_results  "cCs^t|}d|kr't|}nt|dkr=|Sdt|jt|fSdS(Ns is <%s @ 0x%x>(RRR RR!(R"R#((s,/usr/lib/python2.7/site-packages/ply/yacc.pytformat_stack_entrys   t YaccSymbolcBseZdZdZRS(cCs|jS(N(R (R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__str__scCs t|S(N(tstr(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__repr__s(RRR(R*(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR's tYaccProductioncBsneZd dZdZdZdZdZdZdZ dZ dZ d Z d Z RS( cCs(||_||_d|_d|_dS(N(tslicetstacktNonetlexertparser(R tsR-((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s   cCs,|dkr|j|jS|j|jSdS(Ni(R,tvalueR-(R tn((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __getitem__s cCs||j|_dS(N(R,R2(R R3tv((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __setitem__scCs$g|j||!D]}|j^qS(N(R,R2(R titjR1((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __getslice__scCs t|jS(N(RR,(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__len__scCst|j|ddS(Ntlinenoi(tgetattrR,(R R3((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR;scCs||j|_dS(N(R,R;(R R3R;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt set_linenoscCs<t|j|dd}t|j|d|}||fS(NR;it endlineno(R<R,(R R3t startlinetendline((s,/usr/lib/python2.7/site-packages/ply/yacc.pytlinespanscCst|j|ddS(Ntlexposi(R<R,(R R3((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRBscCs<t|j|dd}t|j|d|}||fS(NRBit endlexpos(R<R,(R R3tstartpostendpos((s,/usr/lib/python2.7/site-packages/ply/yacc.pytlexspanscCs tdS(N(t SyntaxError(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRsN(RRR.R R4R6R9R:R;R=RARBRFR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR+s          tLRParsercBseZdZdZdZeeddedZeeededZeeddedZeeddedZ RS(cCs1|j|_|j|_|j|_||_dS(N(tlr_productionst productionst lr_actiontactiontlr_gototgotot errorfunc(R tlrtabterrorf((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s   cCs d|_dS(Ni(terrorok(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyterrokscCsD|j2|j2t}d|_|jj||jjddS(Ns$endi(t statestacktsymstackR'R tappend(R tsym((s,/usr/lib/python2.7/site-packages/ply/yacc.pytrestarts   icCs|s trFt|tr-ttj}n|j|||||S|re|j|||||S|j|||||SdS(N( t yaccdevelt isinstancetintR Rtstderrt parsedebugtparseopttparseopt_notrack(R tinputR/Rttrackingt tokenfunc((s,/usr/lib/python2.7/site-packages/ply/yacc.pytparses c! Cs!d}g}|j}|j} |j} td} d} |jd|sat} | j}n|| _|| _|dk r|j |n|dkr|j }n|}g}||_ g}||_ || _ d}|jdt}d|_|j|d}x|jd|jd||sn|sD|}n |j}|snt}d|_qnn|jdddjg|D]}|j^qd t|fj|j}||j|}|dk r|dkr:|j||}|jd ||j|d}| r| d 8} qqn|dkr1| | }|j}|j}t}||_d|_|r|jd |jd d jg|| D]}t|j^qd| n|jd |jg| |rD|| d }||d<|rq|d }|j|_|j|_|d}t|d|j|_t|d|j|_n|| _ yg|| 3|| 3|j!| |jdt"| d|j|| |d|}|j|Wqt#k r=|j||j|j|d}d|_|}t$} d|_%qXqq1|re|j|_|j|_n|g}|| _ yW|j!| |jdt"| d|j|| |d|}|j|Wqt#k r*|j||j|j|d}d|_|}t$} d|_%qXqn|dkr|d}t|dd}|jdt"||jd|Sn|dkr|j&dddjg|D]}|j^qd t|fj| dks|j%rt$} d|_%|}|jdkrd}n|j'r|j(a(|a |j)a)|r]t*|d r]||_n|j'|}b(b b)|j%r|}d}qqq|rt*|dr|j} nd} | rt+j,j-d| |jfqt+j,j-d|jqt+j,j-ddSnt$} t|d krT|jdkrTd}d}d}|2qn|jdkrgdS|jdkr|d}|jdkrd}qnt}d|_t*|dr|j|_n||_|j||}q|j|j|d}qnt.dqdS(NisPLY: PARSE DEBUG STARTs$endts State : %ss Stack : %ss%s . %st is Action : Shift and goto state %ss3Action : Reduce rule [%s] with %s and goto state %dt[t,t]iR>RCs Result : %sRR2sDone : Returning %ssPLY: PARSE DEBUG ENDs Error : %sR/R;s(yacc: Syntax error at line %d, token=%s syacc: Syntax error, token=%ss yacc: Parse error in input. EOF syacc: internal parser error!!! (/R.RLRNRJR+RR R/R0R`ttokenRTRUR-RVR'R RtpoptjoinR)tlstriptgetRRR2R&R;RBR<R>RCR,tcallableR%RGt error_countRRRRORSRXthasattrRR\R t RuntimeError(!R R`R/RRaRbt lookaheadtlookaheadstacktactionsRNtprodtpslicet errorcountRt get_tokenRTRUterrtokenRWtstatetxxtltypetttptpnametplent_vttargtt1R3R$ttokR;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR]s^                        @             O                                @            !         cCsd}g}|j}|j} |j} td} d} |sTt} | j}n|| _|| _|dk r|j|n|dkr|j }n|}g}||_ g}||_ || _ d}|j dt}d|_|j |d}x|sD|s|}n |j}|sDt}d|_qDn|j}||j|}|dk r4|dkr|j ||}|j |d}| r| d8} qqn|dkr | | }|j}|j}t}||_d|_|r8|| d}||d<|r|d}|j|_|j|_|d}t|d|j|_t|d|j|_n|| _yM|| 3|| 3|j| |j || |d|}|j |Wqtk r1|j ||j|j|d}d|_|}t} d|_qXqq |rY|j|_|j|_n|g}|| _y=|j| |j || |d|}|j |Wqtk r|j ||j|j|d}d|_|}t} d|_qXqn|dkr4|d}t|ddSn|dkrv| dksU|jryt} d|_|}|jdkrd}n|jr|j a |a |j!a!|rt"|d  r||_n|j|}b b b!|jrv|}d}qqvq|rbt"|d r|j}nd}|rHt#j$j%d ||jfqvt#j$j%d |jqt#j$j%d dSnt} t|dkr|jdkrd}d}d}|2qn|jdkrdS|jdkrR|d}|jdkrd}qnt}d|_t"|d r3|j|_n||_|j ||}q|j|j|d}qnt&dqdS(Nis$endiiR>RCRR2R/R;s(yacc: Syntax error at line %d, token=%s syacc: Syntax error, token=%ss yacc: Parse error in input. EOF syacc: internal parser error!!! ('R.RLRNRJR+R R/R0R`RiRTRUR-RVR'R RjRmRRR2R;RBR<R>RCR,RnRGRoRRRORSRXRpRR\R Rq(R R`R/RRaRbRrRsRtRNRuRvRwRRxRTRURyRWRzR|R}R~RRRRR3RR;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR^Us>                                                                           !         cCsd}g}|j}|j} |j} td} d} |sTt} | j}n|| _|| _|dk r|j|n|dkr|j }n|}g}||_ g}||_ || _ d}|j dt}d|_|j |d}x|sD|s|}n |j}|sDt}d|_qDn|j}||j|}|dk r|dkr|j ||}|j |d}| r| d8} qqn|dkr| | }|j}|j}t}||_d|_|r|| d}||d<|| _yM|| 3|| 3|j| |j || |d|}|j |Wqtk r|j ||j|j|d}d|_|}t} d|_qXqq|g}|| _y=|j| |j || |d|}|j |Wqtk r~|j ||j|j|d}d|_|}t} d|_qXqn|dkr|d}t|ddSn|dkr| dks|jrt} d|_|}|jdkrd}n|jru|ja|a |ja|r?t|d r?||_n|j|}bb b|jr|}d}qqq|rt|dr|j}nd}|rt j!j"d ||jfqt j!j"d |jqt j!j"d dSnt} t|dkr6|jdkr6d}d}d}|2qn|jdkrIdS|jdkr|d}|jdkr}d}qnt}d|_t|dr|j|_n||_|j ||}q|j|j|d}qnt#d qdS( Nis$endiiRR2R/R;s(yacc: Syntax error at line %d, token=%s syacc: Syntax error, token=%ss yacc: Parse error in input. EOF syacc: internal parser error!!! ($R.RLRNRJR+R R/R0R`RiRTRUR-RVR'R RjRmRRR2R,RnRGRoRRR<RORSRXRpR;RR\R Rq(R R`R/RRaRbRrRsRtRNRuRvRwRRxRTRURyRWRzR|R}R~RRRR3RR;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR_es*                                                                      !         ( RRR RSRXR.RcR]R^R_(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRHs   <s^[a-zA-Z0-9_-]+$t ProductioncBsbeZdZd d dddZdZdZdZdZdZ d Z d Z RS( itrightRdc Cs||_t||_||_||_d|_||_||_||_ t |j|_ g|_ x3|jD](}||j krs|j j |qsqsWg|_ d|_|jrd|jdj|jf|_nd|j|_dS(Ns%s -> %sRes %s -> (RttupleRutnumbertfuncR.RntfiletlinetprecRtusymsRVtlr_itemstlr_nextRkR)( R RRRut precedenceRRRR1((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s$           %cCs|jS(N(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR(scCsdt|dS(Ns Production(t)(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR*scCs t|jS(N(RRu(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR:scCsdS(Ni((R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __nonzero__scCs |j|S(N(Ru(R tindex((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR4scCs|t|jkrdSt||}yt|j|d|_Wn ttfk rfg|_nXy|j|d|_Wntk rd|_nX|S(Ni( RRuR.tLRItemt Prodnamestlr_aftert IndexErrortKeyErrort lr_before(R R3R~((s,/usr/lib/python2.7/site-packages/ply/yacc.pytlr_items   cCs |jr||j|_ndS(N(RRn(R tpdict((s,/usr/lib/python2.7/site-packages/ply/yacc.pytbinds (RiN( RRtreducedR.R R(R*R:RR4RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs      tMiniProductioncBs,eZdZdZdZdZRS(cCsC||_||_||_d|_||_||_||_dS(N(RRRR.RnRRR)(R R)RRRRR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s      cCs|jS(N(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR(scCs d|jS(NsMiniProduction(%s)(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR*scCs |jr||j|_ndS(N(RRn(R R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs (RRR R(R*R(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs   RcBs#eZdZdZdZRS(cCs|j|_t|j|_|j|_||_i|_|jj|dt|j|_t|j|_|j |_ dS(Nt.( RtlistRuRtlr_indext lookaheadstinsertRRR(R R~R3((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s    cCs<|jr+d|jdj|jf}n d|j}|S(Ns%s -> %sRes %s -> (RuRRk(R R1((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR(s " cCsdt|dS(NsLRItem(R(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR*s(RRR R(R*(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs cCsIt|d}x2|dkrD|||kr7||S|d8}qWdS(Nii(RR.(tsymbolst terminalsR7((s,/usr/lib/python2.7/site-packages/ply/yacc.pytrightmost_terminals t GrammarErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR stGrammarcBseZdZdZdZdZddddZddZdZ d Z d Z d Z d Z d ZdZdZddZdZRS(cCsdg|_i|_i|_i|_x|D]}g|j| %ss%s:%d: Duplicate rule %s. sPrevious definition at %s:%d(srighti(RRt_is_identifiertmatcht enumeratetevalRRGRRmR.RRRRRRRRVRRR(R tprodnametsymsRRRR3R1tctprecnametprodprectmaptmtpnumberR}R~((s,/usr/lib/python2.7/site-packages/ply/yacc.pytadd_productionnsn    #        cCsx|s|jdj}n||jkr;td|ntdd|g|jd<|j|jd||_dS(Nisstart symbol %s undefinedisS'(RRRRRRVR(R tstart((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt set_startscsfdix.tjtjD]}d|Wq.WdS(Ni(RRmRu(R1R~R"(tmark_reachable_fromt reachableR (s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs   i(RRRRRu(R R1((RRR s,/usr/lib/python2.7/site-packages/ply/yacc.pytfind_unreachables #c CsRi}x|jD]}d||i(RRV(R tbetaR$txtx_produces_emptyR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt_firstos     cCs|jr|jSx!|jD]}|g|j|( RRRRRRtrangeRRuRRV( R RtktdidaddR~R7tBtfstthasemptyR((s,/usr/lib/python2.7/site-packages/ply/yacc.pytcompute_follows>        cCs x|jD]}|}d}g}x|t|kr@d}nt||}y|j|j|d|_Wn ttfk rg|_nXy|j|d|_ Wntk rd|_ nX||_ |sPn|j ||}|d7}q%||_ q WdS(Nii( RRR.RRRuRRRRRRVR(R R~tlastlriR7Rtlri((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt build_lritemss.       N(RRR R:R4RR.RRRRRRRRRRRR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR"s  $  S   A     " % ;t VersionErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRstLRTablecBs,eZdZdZdZdZRS(cCs(d|_d|_d|_d|_dS(N(R.RKRMRIt lr_method(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s   cBse|ejr|}nGejddkr=d|dUn%i}d|||fdU|d}|jekredn|j|_ |j |_ g|_ x'|j D]}|j je|qW|j|_|jS(Niisimport %s as parsetabRs&yacc table file version is out of date(RZttypest ModuleTypeRRt _tabversiont__tabversion__Rt _lr_actionRKt_lr_gotoRMRIt_lr_productionsRVRt _lr_methodRt _lr_signature(R tmoduleRtenvR~((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt read_tables       cCsyddl}Wntk r/ddl}nXt|d}|j|}|tkritdn|j||_|j|}|j||_|j||_ |j|}g|_ x$|D]}|j j t |qW|j |S(Nitrbs&yacc table file version is out of date(tcPicklet ImportErrortpickletopentloadRRRRKRMRIRVRtclose(R tfilenameRtin_ft tabversiont signatureRJR~((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt read_pickle5s$     cCs%x|jD]}|j|q WdS(N(RIR(R RR~((s,/usr/lib/python2.7/site-packages/ply/yacc.pytbind_callablesNs(RRR RRR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs   c Csqi}x|D]}d|||j| gD]*} | ||kr||j| qqWqFW|||krYt||d<||||d<|j} x?| |krUt||d<||||d<|j} qWndS(Nii(RVRRtminRmtMAXINTRj( RRR-R RRRtdtreltytatelement((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRts(      t LALRErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRstLRGeneratedTablecBseZdddZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdddZddZRS(RcCs|dkrtd|n||_||_|sCt}n||_i|_i|_|j|_i|_ i|_ d|_ d|_ d|_ g|_g|_g|_|jj|jj|jj|jdS(NtSLRRsUnsupported method %si(RR(RtgrammarRRtlogRKRMRRIt lr_goto_cachet lr0_cidhasht _add_countt sr_conflictt rr_conflictt conflictst sr_conflictst rr_conflictsRRRtlr_parse_table(R RtmethodR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s,                   cCs|jd7_|}d}xx|rd}xe|D]]}xT|jD]I}t|dd|jkriqBn|j|j|j|_d}qBWq2WqW|S(Niit lr0_added(RRR<RVRR!(R tItJRR8R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt lr0_closures   c CsB|jjt||fd}|r+|S|jj|d}|s\i}||j|| D]6}||kr3g||scsj|S(N(R6(R(R)R-R (s,/usr/lib/python2.7/site-packages/ply/yacc.pyR>s(R (R R)tntransR-RRR ((R)R-R s,/usr/lib/python2.7/site-packages/ply/yacc.pytcompute_read_setsscs4fd}fd}t|||}|S(Ncs|S(N((R(treadsets(s,/usr/lib/python2.7/site-packages/ply/yacc.pyR> scsj|gS(N(Rm(R(tinclsets(s,/usr/lib/python2.7/site-packages/ply/yacc.pyR> s(R (R R?RARBRRR ((RBRAs,/usr/lib/python2.7/site-packages/ply/yacc.pytcompute_follow_setssc Csx|jD]\}}x|D]x\}}||jkrKg|j|t|d}|jd|t|j|fd}|ri}x|jj D]y\} } xj| j D]\\} } |j | } | sggf} | || |7t>|8f|6kr qn| jd%|3|7| jd&|8|3| jd%|3|7| jd&|8|3d|6|3t>|7t>|8f>sj0        0w I, T    (PK[KRRsite-packages/ply/__init__.pynu[# PLY package # Author: David Beazley (dave@dabeaz.com) __all__ = ['lex','yacc'] PK[|Isite-packages/ply/yacc.pycnu[ arYc@sdZdZdZdZdZdZdZdZdZdZ d d l Z d d l Z d d l Z d d l Ze jddkrd Zn d Zy e jZWnek re jZnXd ZdefdYZdefdYZdefdYZdZdZdfdYZdfdYZdfdYZd d l Z e j dZ!defdYZ"defd YZ#d!efd"YZ$d#Z%d$efd%YZ&d&efd'YZ'd(efd)YZ(d*efd+YZ)d,Z*d-Z+d.efd/YZ,d0e)fd1YZ-d2Z.d3Z/d4efd5YZ0dee1ee1ddded6e1e1e1d7 Z2d S(8s3.4s3.2is parser.outtparsetabtLALRiii(iNcCs|jS(N(t func_code(tf((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR[scCs|jS(N(t__code__(R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR^scCs5tjddkr"ddl}nddlj}|S(Niii(tsyst version_infotlextply.lex(R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt load_ply_lexhst PlyLoggercBs8eZdZdZeZdZdZeZRS(cCs ||_dS(N(R(tselfR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__init__vscOs|jj||ddS(Ns (Rtwrite(R tmsgtargstkwargs((s,/usr/lib/python2.7/site-packages/ply/yacc.pytdebugxscOs |jjd||ddS(Ns WARNING: s (RR (R RRR((s,/usr/lib/python2.7/site-packages/ply/yacc.pytwarning|scOs |jjd||ddS(NsERROR: s (RR (R RRR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyterrors(t__name__t __module__R RtinfoRRtcritical(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR us     t NullLoggercBseZdZdZRS(cCs|S(N((R tname((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__getattribute__scOs|S(N((R RR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__call__s(RRRR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs t YaccErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRscCspt|}d|kr't|}nt|tkrJ|t d}ndt|jt||f}|S(Ns s ...s<%s @ 0x%x> (%s)(treprtlent resultlimitttypeRtid(trtrepr_strtresult((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt format_results  "cCs^t|}d|kr't|}nt|dkr=|Sdt|jt|fSdS(Ns is <%s @ 0x%x>(RRR RR!(R"R#((s,/usr/lib/python2.7/site-packages/ply/yacc.pytformat_stack_entrys   t YaccSymbolcBseZdZdZRS(cCs|jS(N(R (R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__str__scCs t|S(N(tstr(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__repr__s(RRR(R*(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR's tYaccProductioncBsneZd dZdZdZdZdZdZdZ dZ dZ d Z d Z RS( cCs(||_||_d|_d|_dS(N(tslicetstacktNonetlexertparser(R tsR-((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s   cCs,|dkr|j|jS|j|jSdS(Ni(R,tvalueR-(R tn((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __getitem__s cCs||j|_dS(N(R,R2(R R3tv((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __setitem__scCs$g|j||!D]}|j^qS(N(R,R2(R titjR1((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __getslice__scCs t|jS(N(RR,(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt__len__scCst|j|ddS(Ntlinenoi(tgetattrR,(R R3((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR;scCs||j|_dS(N(R,R;(R R3R;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt set_linenoscCs<t|j|dd}t|j|d|}||fS(NR;it endlineno(R<R,(R R3t startlinetendline((s,/usr/lib/python2.7/site-packages/ply/yacc.pytlinespanscCst|j|ddS(Ntlexposi(R<R,(R R3((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRBscCs<t|j|dd}t|j|d|}||fS(NRBit endlexpos(R<R,(R R3tstartpostendpos((s,/usr/lib/python2.7/site-packages/ply/yacc.pytlexspanscCs tdS(N(t SyntaxError(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRsN(RRR.R R4R6R9R:R;R=RARBRFR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR+s          tLRParsercBseZdZdZdZeeddedZeeededZeeddedZeeddedZ RS(cCs1|j|_|j|_|j|_||_dS(N(tlr_productionst productionst lr_actiontactiontlr_gototgotot errorfunc(R tlrtabterrorf((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s   cCs d|_dS(Ni(terrorok(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyterrokscCsD|j2|j2t}d|_|jj||jjddS(Ns$endi(t statestacktsymstackR'R tappend(R tsym((s,/usr/lib/python2.7/site-packages/ply/yacc.pytrestarts   icCs|s trFt|tr-ttj}n|j|||||S|re|j|||||S|j|||||SdS(N( t yaccdevelt isinstancetintR Rtstderrt parsedebugtparseopttparseopt_notrack(R tinputR/Rttrackingt tokenfunc((s,/usr/lib/python2.7/site-packages/ply/yacc.pytparses c! Cs!d}g}|j}|j} |j} td} d} |jd|sat} | j}n|| _|| _|dk r|j |n|dkr|j }n|}g}||_ g}||_ || _ d}|jdt}d|_|j|d}x|jd|jd||sn|sD|}n |j}|snt}d|_qnn|jdddjg|D]}|j^qd t|fj|j}||j|}|dk r|dkr:|j||}|jd ||j|d}| r| d 8} qqn|dkr1| | }|j}|j}t}||_d|_|r|jd |jd d jg|| D]}t|j^qd| n|jd |jg| |rD|| d }||d<|rq|d }|j|_|j|_|d}t|d|j|_t|d|j|_n|| _ yg|| 3|| 3|j!| |jdt"| d|j|| |d|}|j|Wqt#k r=|j||j|j|d}d|_|}t$} d|_%qXqq1|re|j|_|j|_n|g}|| _ yW|j!| |jdt"| d|j|| |d|}|j|Wqt#k r*|j||j|j|d}d|_|}t$} d|_%qXqn|dkr|d}t|dd}|jdt"||jd|Sn|dkr|j&dddjg|D]}|j^qd t|fj| dks|j%rt$} d|_%|}|jdkrd}n|j'r|j(a(|a |j)a)|r]t*|d r]||_n|j'|}b(b b)|j%r|}d}qqq|rt*|dr|j} nd} | rt+j,j-d| |jfqt+j,j-d|jqt+j,j-ddSnt$} t|d krT|jdkrTd}d}d}|2qn|jdkrgdS|jdkr|d}|jdkrd}qnt}d|_t*|dr|j|_n||_|j||}q|j|j|d}qnt.dqdS(NisPLY: PARSE DEBUG STARTs$endts State : %ss Stack : %ss%s . %st is Action : Shift and goto state %ss3Action : Reduce rule [%s] with %s and goto state %dt[t,t]iR>RCs Result : %sRR2sDone : Returning %ssPLY: PARSE DEBUG ENDs Error : %sR/R;s(yacc: Syntax error at line %d, token=%s syacc: Syntax error, token=%ss yacc: Parse error in input. EOF syacc: internal parser error!!! (/R.RLRNRJR+RR R/R0R`ttokenRTRUR-RVR'R RtpoptjoinR)tlstriptgetRRR2R&R;RBR<R>RCR,tcallableR%RGt error_countRRRRORSRXthasattrRR\R t RuntimeError(!R R`R/RRaRbt lookaheadtlookaheadstacktactionsRNtprodtpslicet errorcountRt get_tokenRTRUterrtokenRWtstatetxxtltypetttptpnametplent_vttargtt1R3R$ttokR;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR]s^                        @             O                                @            !         cCsd}g}|j}|j} |j} td} d} |sTt} | j}n|| _|| _|dk r|j|n|dkr|j }n|}g}||_ g}||_ || _ d}|j dt}d|_|j |d}x|sD|s|}n |j}|sDt}d|_qDn|j}||j|}|dk r4|dkr|j ||}|j |d}| r| d8} qqn|dkr | | }|j}|j}t}||_d|_|r8|| d}||d<|r|d}|j|_|j|_|d}t|d|j|_t|d|j|_n|| _yM|| 3|| 3|j| |j || |d|}|j |Wqtk r1|j ||j|j|d}d|_|}t} d|_qXqq |rY|j|_|j|_n|g}|| _y=|j| |j || |d|}|j |Wqtk r|j ||j|j|d}d|_|}t} d|_qXqn|dkr4|d}t|ddSn|dkrv| dksU|jryt} d|_|}|jdkrd}n|jr|j a |a |j!a!|rt"|d  r||_n|j|}b b b!|jrv|}d}qqvq|rbt"|d r|j}nd}|rHt#j$j%d ||jfqvt#j$j%d |jqt#j$j%d dSnt} t|dkr|jdkrd}d}d}|2qn|jdkrdS|jdkrR|d}|jdkrd}qnt}d|_t"|d r3|j|_n||_|j ||}q|j|j|d}qnt&dqdS(Nis$endiiR>RCRR2R/R;s(yacc: Syntax error at line %d, token=%s syacc: Syntax error, token=%ss yacc: Parse error in input. EOF syacc: internal parser error!!! ('R.RLRNRJR+R R/R0R`RiRTRUR-RVR'R RjRmRRR2R;RBR<R>RCR,RnRGRoRRRORSRXRpRR\R Rq(R R`R/RRaRbRrRsRtRNRuRvRwRRxRTRURyRWRzR|R}R~RRRRR3RR;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR^Us>                                                                           !         cCsd}g}|j}|j} |j} td} d} |sTt} | j}n|| _|| _|dk r|j|n|dkr|j }n|}g}||_ g}||_ || _ d}|j dt}d|_|j |d}x|sD|s|}n |j}|sDt}d|_qDn|j}||j|}|dk r|dkr|j ||}|j |d}| r| d8} qqn|dkr| | }|j}|j}t}||_d|_|r|| d}||d<|| _yM|| 3|| 3|j| |j || |d|}|j |Wqtk r|j ||j|j|d}d|_|}t} d|_qXqq|g}|| _y=|j| |j || |d|}|j |Wqtk r~|j ||j|j|d}d|_|}t} d|_qXqn|dkr|d}t|ddSn|dkr| dks|jrt} d|_|}|jdkrd}n|jru|ja|a |ja|r?t|d r?||_n|j|}bb b|jr|}d}qqq|rt|dr|j}nd}|rt j!j"d ||jfqt j!j"d |jqt j!j"d dSnt} t|dkr6|jdkr6d}d}d}|2qn|jdkrIdS|jdkr|d}|jdkr}d}qnt}d|_t|dr|j|_n||_|j ||}q|j|j|d}qnt#d qdS( Nis$endiiRR2R/R;s(yacc: Syntax error at line %d, token=%s syacc: Syntax error, token=%ss yacc: Parse error in input. EOF syacc: internal parser error!!! ($R.RLRNRJR+R R/R0R`RiRTRUR-RVR'R RjRmRRR2R,RnRGRoRRR<RORSRXRpR;RR\R Rq(R R`R/RRaRbRrRsRtRNRuRvRwRRxRTRURyRWRzR|R}R~RRRR3RR;((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR_es*                                                                      !         ( RRR RSRXR.RcR]R^R_(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRHs   <s^[a-zA-Z0-9_-]+$t ProductioncBsbeZdZd d dddZdZdZdZdZdZ d Z d Z RS( itrightRdc Cs||_t||_||_||_d|_||_||_||_ t |j|_ g|_ x3|jD](}||j krs|j j |qsqsWg|_ d|_|jrd|jdj|jf|_nd|j|_dS(Ns%s -> %sRes %s -> (RttupleRutnumbertfuncR.RntfiletlinetprecRtusymsRVtlr_itemstlr_nextRkR)( R RRRut precedenceRRRR1((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s$           %cCs|jS(N(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR(scCsdt|dS(Ns Production(t)(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR*scCs t|jS(N(RRu(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR:scCsdS(Ni((R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt __nonzero__scCs |j|S(N(Ru(R tindex((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR4scCs|t|jkrdSt||}yt|j|d|_Wn ttfk rfg|_nXy|j|d|_Wntk rd|_nX|S(Ni( RRuR.tLRItemt Prodnamestlr_aftert IndexErrortKeyErrort lr_before(R R3R~((s,/usr/lib/python2.7/site-packages/ply/yacc.pytlr_items   cCs |jr||j|_ndS(N(RRn(R tpdict((s,/usr/lib/python2.7/site-packages/ply/yacc.pytbinds (RiN( RRtreducedR.R R(R*R:RR4RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs      tMiniProductioncBs,eZdZdZdZdZRS(cCsC||_||_||_d|_||_||_||_dS(N(RRRR.RnRRR)(R R)RRRRR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s      cCs|jS(N(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR(scCs d|jS(NsMiniProduction(%s)(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR*scCs |jr||j|_ndS(N(RRn(R R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs (RRR R(R*R(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs   RcBs#eZdZdZdZRS(cCs|j|_t|j|_|j|_||_i|_|jj|dt|j|_t|j|_|j |_ dS(Nt.( RtlistRuRtlr_indext lookaheadstinsertRRR(R R~R3((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s    cCs<|jr+d|jdj|jf}n d|j}|S(Ns%s -> %sRes %s -> (RuRRk(R R1((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR(s " cCsdt|dS(NsLRItem(R(R)(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR*s(RRR R(R*(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs cCsIt|d}x2|dkrD|||kr7||S|d8}qWdS(Nii(RR.(tsymbolst terminalsR7((s,/usr/lib/python2.7/site-packages/ply/yacc.pytrightmost_terminals t GrammarErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR stGrammarcBseZdZdZdZdZddddZddZdZ d Z d Z d Z d Z d ZdZdZddZdZRS(cCsdg|_i|_i|_i|_x|D]}g|j| %ss%s:%d: Duplicate rule %s. sPrevious definition at %s:%d(srighti(RRt_is_identifiertmatcht enumeratetevalRRGRRmR.RRRRRRRRVRRR(R tprodnametsymsRRRR3R1tctprecnametprodprectmaptmtpnumberR}R~((s,/usr/lib/python2.7/site-packages/ply/yacc.pytadd_productionnsn    #        cCsx|s|jdj}n||jkr;td|ntdd|g|jd<|j|jd||_dS(Nisstart symbol %s undefinedisS'(RRRRRRVR(R tstart((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt set_startscsfdix.tjtjD]}d|Wq.WdS(Ni(RRmRu(R1R~R"(tmark_reachable_fromt reachableR (s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs   i(RRRRRu(R R1((RRR s,/usr/lib/python2.7/site-packages/ply/yacc.pytfind_unreachables #c CsRi}x|jD]}d||i(RRV(R tbetaR$txtx_produces_emptyR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt_firstos     cCs|jr|jSx!|jD]}|g|j|( RRRRRRtrangeRRuRRV( R RtktdidaddR~R7tBtfstthasemptyR((s,/usr/lib/python2.7/site-packages/ply/yacc.pytcompute_follows>        cCs x|jD]}|}d}g}x|t|kr@d}nt||}y|j|j|d|_Wn ttfk rg|_nXy|j|d|_ Wntk rd|_ nX||_ |sPn|j ||}|d7}q%||_ q WdS(Nii( RRR.RRRuRRRRRRVR(R R~tlastlriR7Rtlri((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt build_lritemss.       N(RRR R:R4RR.RRRRRRRRRRRR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR"s  $  S   A     " % ;t VersionErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRstLRTablecBs,eZdZdZdZdZRS(cCs(d|_d|_d|_d|_dS(N(R.RKRMRIt lr_method(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s   cBse|ejr|}nGejddkr=d|dUn%i}d|||fdU|d}|jekredn|j|_ |j |_ g|_ x'|j D]}|j je|qW|j|_|jS(Niisimport %s as parsetabRs&yacc table file version is out of date(RZttypest ModuleTypeRRt _tabversiont__tabversion__Rt _lr_actionRKt_lr_gotoRMRIt_lr_productionsRVRt _lr_methodRt _lr_signature(R tmoduleRtenvR~((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt read_tables       cCsyddl}Wntk r/ddl}nXt|d}|j|}|tkritdn|j||_|j|}|j||_|j||_ |j|}g|_ x$|D]}|j j t |qW|j |S(Nitrbs&yacc table file version is out of date(tcPicklet ImportErrortpickletopentloadRRRRKRMRIRVRtclose(R tfilenameRtin_ft tabversiont signatureRJR~((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt read_pickle5s$     cCs%x|jD]}|j|q WdS(N(RIR(R RR~((s,/usr/lib/python2.7/site-packages/ply/yacc.pytbind_callablesNs(RRR RRR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs   c Csqi}x|D]}d|||j| gD]*} | ||kr||j| qqWqFW|||krYt||d<||||d<|j} x?| |krUt||d<||||d<|j} qWndS(Nii(RVRRtminRmtMAXINTRj( RR R-R RRRtdtreltytatelement((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRts(      t LALRErrorcBseZRS((RR(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRstLRGeneratedTablecBseZdddZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdddZddZRS(RcCs|dkrtd|n||_||_|sCt}n||_i|_i|_|j|_i|_ i|_ d|_ d|_ d|_ g|_g|_g|_|jj|jj|jj|jdS(NtSLRRsUnsupported method %si(RR(RtgrammarRRtlogRKRMRRIt lr_goto_cachet lr0_cidhasht _add_countt sr_conflictt rr_conflictt conflictst sr_conflictst rr_conflictsRRRtlr_parse_table(R RtmethodR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s,                   cCs|jd7_|}d}xx|rd}xe|D]]}xT|jD]I}t|dd|jkriqBn|j|j|j|_d}qBWq2WqW|S(Niit lr0_added(RRR<RVRR"(R tItJRR8R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt lr0_closures   c CsB|jjt||fd}|r+|S|jj|d}|s\i}||j|| D]6}||kr3g||scsj|S(N(R7(R(R*R.R (s,/usr/lib/python2.7/site-packages/ply/yacc.pyR?s(R (R R*tntransR.RRR ((R*R.R s,/usr/lib/python2.7/site-packages/ply/yacc.pytcompute_read_setsscs4fd}fd}t|||}|S(Ncs|S(N((R(treadsets(s,/usr/lib/python2.7/site-packages/ply/yacc.pyR? scsj|gS(N(Rm(R(tinclsets(s,/usr/lib/python2.7/site-packages/ply/yacc.pyR? s(R (R R@RBRCRRR ((RCRBs,/usr/lib/python2.7/site-packages/ply/yacc.pytcompute_follow_setssc Csx|jD]\}}x|D]x\}}||jkrKg|j|RDRH(R R*R.R1RBtlookdtincludedt followsets((s,/usr/lib/python2.7/site-packages/ply/yacc.pytadd_lalr_lookaheads" s  c$ Cs!|jj}|jj}|j}|j}|j}i}|jd|j|j}|jdkrw|j |nd}x|D]} g} i} i} i} |jd|jd||jdx*| D]"}|jd|j t |qW|jdx,| D]$}|j |j dkr|jdkrOd| d <|| d t|d}|jd|t|j|fd}|ri}x|jj D]y\} } xj| j D]\\} } |j | } | sggf} | || RARDRHRLR RmRs(((s,/usr/lib/python2.7/site-packages/ply/yacc.pyRs %  " 9    + J     ycCsy tWntk rtj\}}}|j}x#|dkr]|j}|d8}q;W|jj}|j|jkr|j|jn|SXdS(Nii( RqRRfttb_frametf_backt f_globalstcopytf_localstupdate(tlevelsRltbR}Rtldict((s,/usr/lib/python2.7/site-packages/ply/yacc.pytget_caller_module_dict s    c CsOg}|j}d}|}x*|D]"}|d7}|j}|sMq%ny|ddkr|std||fn|} |d} nU|d} | }|d} |d} | dkr| dkrtd||fn|j||| | fWq%tk rq%tk rFtd |||jfq%Xq%W|S( Niit|s%s:%d: Misplaced '|'it:s::=s!%s:%d: Syntax error. Expected ':'s %s:%d: Syntax error in rule '%s'(t splitlinesR.RbRGRVt Exceptiontstrip( tdocRRRtpstringstlastptdlinetpsR~RRtassign((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt parse_grammar s6          't ParserReflectcBseZddZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZRS(cCsm||_d|_d|_d|_i|_g|_d|_|dkr`tt j |_ n ||_ dS(Ni( RR.Rt error_functtokenstfilesRRR RR\R(R RR((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s        cCs6|j|j|j|j|jdS(N(t get_starttget_error_funct get_tokenstget_precedencetget_pfunctions(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pytget_all s     cCsC|j|j|j|j|j|j|jS(N(tvalidate_starttvalidate_error_functvalidate_tokenstvalidate_precedencetvalidate_pfunctionstvalidate_filesR(R ((s,/usr/lib/python2.7/site-packages/ply/yacc.pyt validate_all s      cCsg}y|jr%|j|jn|jrf|jdjg|jD]}dj|^qDn|jr|jdj|jnx/|jD]$}|dr|j|dqqWWnttfk rnXdj|S(NRdRei(RRVRRkRtpfuncst TypeErrort ValueError(R tpartsR~R((s,/usr/lib/python2.7/site-packages/ply/yacc.pyR s  8  c Cs$tjd}x|jjD]}tjj|\}}|dkrMdSy&t|}|j}|j Wnt k rqnXi}xt |D]{\}} |d7}|j | } | r| j d} |j| } | s||| |7t>|8f|6kr qn| jd%|3|7| jd&|8|3| jd%|3|7| jd&|8|3d|6|3t>|7t>|8f>sj0        0w I, T    (PK[yffsite-packages/ply/lex.pycnu[ ]Mc @sdZdZddlZddlZddlZddlZddlZyejejfZ Wne k r}e e fZ nXej ddkrdZn dZejdZd efd YZd efd YZd efdYZdefdYZdfdYZdZdZdZdZdZdefdYZeeddddddeed ZeedZ dZ!e!Z"dS(s3.4s3.2iNiicCs|jS(N(t func_code(tf((s+/usr/lib/python2.7/site-packages/ply/lex.pyR3scCs|jS(N(t__code__(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyR6ss^[a-zA-Z0-9_]+$tLexErrorcBseZdZRS(cCs|f|_||_dS(N(targsttext(tselftmessagets((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__init__@s (t__name__t __module__R (((s+/usr/lib/python2.7/site-packages/ply/lex.pyR?stLexTokencBseZdZdZRS(cCs d|j|j|j|jfS(NsLexToken(%s,%r,%d,%d)(ttypetvaluetlinenotlexpos(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__str__FscCs t|S(N(tstr(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__repr__Hs(R R RR(((s+/usr/lib/python2.7/site-packages/ply/lex.pyR Es t PlyLoggercBs8eZdZdZdZdZeZeZRS(cCs ||_dS(N(R(RR((s+/usr/lib/python2.7/site-packages/ply/lex.pyR OscOs|jj||ddS(Ns (Rtwrite(RtmsgRtkwargs((s+/usr/lib/python2.7/site-packages/ply/lex.pytcriticalQscOs |jjd||ddS(Ns WARNING: s (RR(RRRR((s+/usr/lib/python2.7/site-packages/ply/lex.pytwarningTscOs |jjd||ddS(NsERROR: s (RR(RRRR((s+/usr/lib/python2.7/site-packages/ply/lex.pyterrorWs(R R R RRRtinfotdebug(((s+/usr/lib/python2.7/site-packages/ply/lex.pyRNs     t NullLoggercBseZdZdZRS(cCs|S(N((Rtname((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__getattribute___scOs|S(N((RRR((s+/usr/lib/python2.7/site-packages/ply/lex.pyt__call__as(R R RR (((s+/usr/lib/python2.7/site-packages/ply/lex.pyR^s tLexercBseZdZddZddZdZdZdZdZ dZ d Z d Z d Z d Zd ZeZRS(cCsd|_d|_i|_i|_i|_d|_g|_d|_i|_ i|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_dS(NtINITIALiti(tNonetlexret lexretextt lexstateretlexstateretexttlexstaterenamestlexstatet lexstatestackt lexstateinfotlexstateignoretlexstateerrorft lexreflagstlexdataRtlexlent lexerrorft lextokenst lexignoret lexliteralst lexmoduleRt lexoptimize(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyR ss*                    c Cs3tj|}|r/i}x|jjD]\}}g}xw|D]o\}}g} xZ|D]R} | su| d r| j| q]n| jt|| dj| dfq]WqDW|j|| f|||c Bse|ejr|}nGejddkr=d|dUn%i}d|||fdU|d}e|ddekredn|j|_ |j |_ |j |_ |j|_|j|_i|_i|_x|jjD]\}}g}g}xqee|D]]} |jej|| d|j ejBe|| d|f|j|| dqW||j|<||j|s   cCsxi}xk|jD]`}tj|sD|jjd|d|_n||krf|jjd|nd||sR?cSst|djS(Ni(RR(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyRscSs<t|dt|dkt|dt|dkS(Ni(RT(RR((s+/usr/lib/python2.7/site-packages/ply/lex.pyRscSst|dS(Ni(RT(R((s+/usr/lib/python2.7/site-packages/ply/lex.pyRstreverse(RRtfuncsymtstrsymRterrorfRRTRRRthasattrRRRR R:RIRzRRRgRhtsorttTrue( RRttsymbolsRRRttoknametlinetfile((s+/usr/lib/python2.7/site-packages/ply/lex.pyRsb,               !      ! cCsx|jD]}x |j|D]\}}t|j}t|j}d|j|<|j|}t|tj r}d}nd}t|j }||kr|j j d|||j d|_ qn||kr|j j d|||j d|_ qn|js4|j j d|||j d|_ qnydtjd||jftj|jB} | jdr|j j d|||j d|_ nWqtj k rtj\} } } |j j d |||j | d |jkr |j j d |||j nd|_ qXqWxd|j|D]U\} }|j| }|d krs|j j d | d|_ q,n||jkr|jddkr|j j d| |d|_ q,nyXtjd| |ftj|jB} | jdr|j j d| d|_ nWq,tj k rtj\} } } |j j d| | d |krt|j j d| nd|_ q,Xq,W|j| r|j| r|j j d|d|_ n|jj|d}|r |}t|j}t|j}d|j|%s)R#s<%s:%d: Regular expression for rule '%s' matches empty strings3%s:%d: Invalid regular expression for rule '%s'. %st#s6%s:%d. Make sure '#' in rule '%s' is escaped with '\#'Rs'Rule '%s' must be defined as a functionRis-Rule '%s' defined for an unspecified token %ss5Regular expression for rule '%s' matches empty strings,Invalid regular expression for rule '%s'. %ss/Make sure '#' in rule '%s' is escaped with '\#'sNo rules defined for state '%s'(RRRRRRRRIRJRt co_argcountRRR t__doc__RpRqRrRRRgRRRRRR}R$t validate_file(RR~tfnameRRRRtreqargstnargsR=t_etypeRt_etraceRtrtefunc((s+/usr/lib/python2.7/site-packages/ply/lex.pyRs         )   $ &       cCs>ddl}|jj|\}}|dkr4dSy&t|}|j}|jWntk rndSXtjd}tjd}i} d} x|D]} |j | } | s|j | } n| r,| j d} | j | }|s| | | %s)s(lex: Adding rule %s -> '%s' (state '%s')s#lex: ==== MASTER REGEXS FOLLOW ====s"lex: state '%s' : regex[%d] = '%s'R#sNo t_error rule is definedRs1No error rule is defined for exclusive state '%s's2No ignore rule is defined for exclusive state '%s'(;R$R!R7RRgRtdirR;tdictRRRRt SyntaxErrorRyRR|RRiRRRRR3RIRRR ROR5RRRRR:RRRRR'R(R)RSRTR9textendR,R%R&R/RR-R}R4RR.R2RRd( tmoduleR<RtoptimizeReRtnowarnRXtdebuglogterrorlogRRtlexobjtkt_itemstlinfoRtregexsR~t regex_listRRRRRRR%tre_texttre_namesRbtstypeR((s+/usr/lib/python2.7/site-packages/ply/lex.pytlexas      .        (     %   %"       &   cCs|soy3tjd}t|}|j}|jWqotk rktjjdtjj}qoXn|r|j }nt }|||r|j }nt }xB|}|sPntjjd|j |j |j |jfqdS(Nis/Reading from standard input (type EOF to end): s(%s,%r,%d,%d) (RgtargvRPtreadRVt IndexErrortstdoutRtstdinR|RR RRR(RtdataRZRt_inputt_tokenR((s+/usr/lib/python2.7/site-packages/ply/lex.pytrunmains*        csfd}|S(Ncs+tdrj|_n |_|S(NR (RR(R(R(s+/usr/lib/python2.7/site-packages/ply/lex.pytset_docs ((RR$((Rs+/usr/lib/python2.7/site-packages/ply/lex.pytTOKENs(#RQt__tabversion__RpRgRJR8RMt StringTypet UnicodeTypeRztAttributeErrorRtbytesRhRRqRRRR<R RRR!RRURsRRRR$RR#R%tToken(((s+/usr/lib/python2.7/site-packages/ply/lex.pyt"s6<    :    ' B'! PK[P-%\ \ site-packages/ply/ctokens.pyonu[ ]Mc4@sdddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3g4Zd4Zd5Zd6Zd7Zd8Zd9Zd:Zd;Zd<Z d=Z d>Z d?Z d@Z dAZdBZdCZdDZdEZdFZdGZdHZdIZdJZdKZdLZdMZdNZdOZdPZdQZdRZdSZ dTZ!dUZ"dVZ#dWZ$dXZ%dYZ&dZZ'd[Z(d\Z)d]Z*d^Z+d_Z,d`Z-daZ.dbZ/dcZ0ddZ1deZ2dfZ3dgZ4dhZ5diS(jtIDtTYPEIDtICONSTtFCONSTtSCONSTtCCONSTtPLUStMINUStTIMEStDIVIDEtMODtORtANDtNOTtXORtLSHIFTtRSHIFTtLORtLANDtLNOTtLTtLEtGTtGEtEQtNEtEQUALSt TIMESEQUALtDIVEQUALtMODEQUALt PLUSEQUALt MINUSEQUALt LSHIFTEQUALt RSHIFTEQUALtANDEQUALtXOREQUALtOREQUALtPLUSPLUSt MINUSMINUStARROWtTERNARYtLPARENtRPARENtLBRACKETtRBRACKETtLBRACEtRBRACEtCOMMAtPERIODtSEMItCOLONtELLIPSISs\+t-s\*t/t%s\|t&t~s\^s<>s\|\|s&&t!ts<=s>=s==s!=t=s\*=s/=s%=s\+=s-=s<<=s>>=s&=s\|=s^=s\+\+s--s->s\?s\(s\)s\[s\]s\{s\}t,s\.t;t:s\.\.\.s[A-Za-z_][A-Za-z0-9_]*s!\d+([uU]|[lL]|[uU][lL]|[lL][uU])?s?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?s\"([^\\\n]|(\\.))*?\"s(L)?\'([^\\\n]|(\\.))*?\'cCs"|jj|jjd7_|S(s/\*(.|\n)*?\*/s (tlexertlinenotvaluetcount(tt((s//usr/lib/python2.7/site-packages/ply/ctokens.pyt t_COMMENTvscCs|jjd7_|S(s//.*\ni(R@RA(RD((s//usr/lib/python2.7/site-packages/ply/ctokens.pyt t_CPPCOMMENT|sN(6ttokenstt_PLUStt_MINUStt_TIMEStt_DIVIDEtt_MODULOtt_ORtt_ANDtt_NOTtt_XORtt_LSHIFTtt_RSHIFTtt_LORtt_LANDtt_LNOTtt_LTtt_GTtt_LEtt_GEtt_EQtt_NEtt_EQUALSt t_TIMESEQUALt t_DIVEQUALt t_MODEQUALt t_PLUSEQUALt t_MINUSEQUALt t_LSHIFTEQUALt t_RSHIFTEQUALt t_ANDEQUALt t_OREQUALt t_XOREQUALt t_INCREMENTt t_DECREMENTtt_ARROWt t_TERNARYtt_LPARENtt_RPARENt t_LBRACKETt t_RBRACKETtt_LBRACEtt_RBRACEtt_COMMAtt_PERIODtt_SEMItt_COLONt t_ELLIPSIStt_IDt t_INTEGERtt_FLOATtt_STRINGt t_CHARACTERRERF(((s//usr/lib/python2.7/site-packages/ply/ctokens.pyt s    PK[Kh$==site-packages/ply/yacc.pynu[# ----------------------------------------------------------------------------- # ply: yacc.py # # Copyright (C) 2001-2011, # David M. Beazley (Dabeaz LLC) # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * Neither the name of the David Beazley or Dabeaz LLC may be used to # endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # ----------------------------------------------------------------------------- # # This implements an LR parser that is constructed from grammar rules defined # as Python functions. The grammer is specified by supplying the BNF inside # Python documentation strings. The inspiration for this technique was borrowed # from John Aycock's Spark parsing system. PLY might be viewed as cross between # Spark and the GNU bison utility. # # The current implementation is only somewhat object-oriented. The # LR parser itself is defined in terms of an object (which allows multiple # parsers to co-exist). However, most of the variables used during table # construction are defined in terms of global variables. Users shouldn't # notice unless they are trying to define multiple parsers at the same # time using threads (in which case they should have their head examined). # # This implementation supports both SLR and LALR(1) parsing. LALR(1) # support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu), # using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles, # Techniques, and Tools" (The Dragon Book). LALR(1) has since been replaced # by the more efficient DeRemer and Pennello algorithm. # # :::::::: WARNING ::::::: # # Construction of LR parsing tables is fairly complicated and expensive. # To make this module run fast, a *LOT* of work has been put into # optimization---often at the expensive of readability and what might # consider to be good Python "coding style." Modify the code at your # own risk! # ---------------------------------------------------------------------------- __version__ = "3.4" __tabversion__ = "3.2" # Table version #----------------------------------------------------------------------------- # === User configurable parameters === # # Change these to modify the default behavior of yacc (if you wish) #----------------------------------------------------------------------------- yaccdebug = 1 # Debugging mode. If set, yacc generates a # a 'parser.out' file in the current directory debug_file = 'parser.out' # Default name of the debugging file tab_module = 'parsetab' # Default name of the table module default_lr = 'LALR' # Default LR table generation method error_count = 3 # Number of symbols that must be shifted to leave recovery mode yaccdevel = 0 # Set to True if developing yacc. This turns off optimized # implementations of certain functions. resultlimit = 40 # Size limit of results when running in debug mode. pickle_protocol = 0 # Protocol to use when writing pickle files import re, types, sys, os.path # Compatibility function for python 2.6/3.0 if sys.version_info[0] < 3: def func_code(f): return f.func_code else: def func_code(f): return f.__code__ # Compatibility try: MAXINT = sys.maxint except AttributeError: MAXINT = sys.maxsize # Python 2.x/3.0 compatibility. def load_ply_lex(): if sys.version_info[0] < 3: import lex else: import ply.lex as lex return lex # This object is a stand-in for a logging object created by the # logging module. PLY will use this by default to create things # such as the parser.out file. If a user wants more detailed # information, they can create their own logging object and pass # it into PLY. class PlyLogger(object): def __init__(self,f): self.f = f def debug(self,msg,*args,**kwargs): self.f.write((msg % args) + "\n") info = debug def warning(self,msg,*args,**kwargs): self.f.write("WARNING: "+ (msg % args) + "\n") def error(self,msg,*args,**kwargs): self.f.write("ERROR: " + (msg % args) + "\n") critical = debug # Null logger is used when no output is generated. Does nothing. class NullLogger(object): def __getattribute__(self,name): return self def __call__(self,*args,**kwargs): return self # Exception raised for yacc-related errors class YaccError(Exception): pass # Format the result message that the parser produces when running in debug mode. def format_result(r): repr_str = repr(r) if '\n' in repr_str: repr_str = repr(repr_str) if len(repr_str) > resultlimit: repr_str = repr_str[:resultlimit]+" ..." result = "<%s @ 0x%x> (%s)" % (type(r).__name__,id(r),repr_str) return result # Format stack entries when the parser is running in debug mode def format_stack_entry(r): repr_str = repr(r) if '\n' in repr_str: repr_str = repr(repr_str) if len(repr_str) < 16: return repr_str else: return "<%s @ 0x%x>" % (type(r).__name__,id(r)) #----------------------------------------------------------------------------- # === LR Parsing Engine === # # The following classes are used for the LR parser itself. These are not # used during table construction and are independent of the actual LR # table generation algorithm #----------------------------------------------------------------------------- # This class is used to hold non-terminal grammar symbols during parsing. # It normally has the following attributes set: # .type = Grammar symbol type # .value = Symbol value # .lineno = Starting line number # .endlineno = Ending line number (optional, set automatically) # .lexpos = Starting lex position # .endlexpos = Ending lex position (optional, set automatically) class YaccSymbol: def __str__(self): return self.type def __repr__(self): return str(self) # This class is a wrapper around the objects actually passed to each # grammar rule. Index lookup and assignment actually assign the # .value attribute of the underlying YaccSymbol object. # The lineno() method returns the line number of a given # item (or 0 if not defined). The linespan() method returns # a tuple of (startline,endline) representing the range of lines # for a symbol. The lexspan() method returns a tuple (lexpos,endlexpos) # representing the range of positional information for a symbol. class YaccProduction: def __init__(self,s,stack=None): self.slice = s self.stack = stack self.lexer = None self.parser= None def __getitem__(self,n): if n >= 0: return self.slice[n].value else: return self.stack[n].value def __setitem__(self,n,v): self.slice[n].value = v def __getslice__(self,i,j): return [s.value for s in self.slice[i:j]] def __len__(self): return len(self.slice) def lineno(self,n): return getattr(self.slice[n],"lineno",0) def set_lineno(self,n,lineno): self.slice[n].lineno = lineno def linespan(self,n): startline = getattr(self.slice[n],"lineno",0) endline = getattr(self.slice[n],"endlineno",startline) return startline,endline def lexpos(self,n): return getattr(self.slice[n],"lexpos",0) def lexspan(self,n): startpos = getattr(self.slice[n],"lexpos",0) endpos = getattr(self.slice[n],"endlexpos",startpos) return startpos,endpos def error(self): raise SyntaxError # ----------------------------------------------------------------------------- # == LRParser == # # The LR Parsing engine. # ----------------------------------------------------------------------------- class LRParser: def __init__(self,lrtab,errorf): self.productions = lrtab.lr_productions self.action = lrtab.lr_action self.goto = lrtab.lr_goto self.errorfunc = errorf def errok(self): self.errorok = 1 def restart(self): del self.statestack[:] del self.symstack[:] sym = YaccSymbol() sym.type = '$end' self.symstack.append(sym) self.statestack.append(0) def parse(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): if debug or yaccdevel: if isinstance(debug,int): debug = PlyLogger(sys.stderr) return self.parsedebug(input,lexer,debug,tracking,tokenfunc) elif tracking: return self.parseopt(input,lexer,debug,tracking,tokenfunc) else: return self.parseopt_notrack(input,lexer,debug,tracking,tokenfunc) # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parsedebug(). # # This is the debugging enabled version of parse(). All changes made to the # parsing engine should be made here. For the non-debugging version, # copy this code to a method parseopt() and delete all of the sections # enclosed in: # # #--! DEBUG # statements # #--! DEBUG # # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! def parsedebug(self,input=None,lexer=None,debug=None,tracking=0,tokenfunc=None): lookahead = None # Current lookahead symbol lookaheadstack = [ ] # Stack of lookahead symbols actions = self.action # Local reference to action table (to avoid lookup on self.) goto = self.goto # Local reference to goto table (to avoid lookup on self.) prod = self.productions # Local reference to production list (to avoid lookup on self.) pslice = YaccProduction(None) # Production object passed to grammar rules errorcount = 0 # Used during error recovery # --! DEBUG debug.info("PLY: PARSE DEBUG START") # --! DEBUG # If no lexer was given, we will try to use the lex module if not lexer: lex = load_ply_lex() lexer = lex.lexer # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self # If input was supplied, pass to lexer if input is not None: lexer.input(input) if tokenfunc is None: # Tokenize function get_token = lexer.token else: get_token = tokenfunc # Set up the state and symbol stacks statestack = [ ] # Stack of parsing states self.statestack = statestack symstack = [ ] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production errtoken = None # Err token # The start state is assumed to be (0,$end) statestack.append(0) sym = YaccSymbol() sym.type = "$end" symstack.append(sym) state = 0 while 1: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer # --! DEBUG debug.debug('') debug.debug('State : %s', state) # --! DEBUG if not lookahead: if not lookaheadstack: lookahead = get_token() # Get the next token else: lookahead = lookaheadstack.pop() if not lookahead: lookahead = YaccSymbol() lookahead.type = "$end" # --! DEBUG debug.debug('Stack : %s', ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) # --! DEBUG # Check the action table ltype = lookahead.type t = actions[state].get(ltype) if t is not None: if t > 0: # shift a symbol on the stack statestack.append(t) state = t # --! DEBUG debug.debug("Action : Shift and goto state %s", t) # --! DEBUG symstack.append(lookahead) lookahead = None # Decrease error count on successful shift if errorcount: errorcount -=1 continue if t < 0: # reduce a symbol on the stack, emit a production p = prod[-t] pname = p.name plen = p.len # Get production function sym = YaccSymbol() sym.type = pname # Production name sym.value = None # --! DEBUG if plen: debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, "["+",".join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+"]",-t) else: debug.info("Action : Reduce rule [%s] with %s and goto state %d", p.str, [],-t) # --! DEBUG if plen: targ = symstack[-plen-1:] targ[0] = sym # --! TRACKING if tracking: t1 = targ[1] sym.lineno = t1.lineno sym.lexpos = t1.lexpos t1 = targ[-1] sym.endlineno = getattr(t1,"endlineno",t1.lineno) sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) # --! TRACKING # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object del symstack[-plen:] del statestack[-plen:] p.callable(pslice) # --! DEBUG debug.info("Result : %s", format_result(pslice[0])) # --! DEBUG symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else: # --! TRACKING if tracking: sym.lineno = lexer.lineno sym.lexpos = lexer.lexpos # --! TRACKING targ = [ sym ] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object p.callable(pslice) # --! DEBUG debug.info("Result : %s", format_result(pslice[0])) # --! DEBUG symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] result = getattr(n,"value",None) # --! DEBUG debug.info("Done : Returning %s", format_result(result)) debug.info("PLY: PARSE DEBUG END") # --! DEBUG return result if t == None: # --! DEBUG debug.error('Error : %s', ("%s . %s" % (" ".join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip()) # --! DEBUG # We have some kind of parsing error here. To handle # this, we are going to push the current token onto # the tokenstack and replace it with an 'error' token. # If there are any synchronization rules, they may # catch it. # # In addition to pushing the error token, we call call # the user defined p_error() function if this is the # first syntax error. This function is only called if # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count self.errorok = 0 errtoken = lookahead if errtoken.type == "$end": errtoken = None # End of file! if self.errorfunc: global errok,token,restart errok = self.errok # Set some special functions available in error recovery token = get_token restart = self.restart if errtoken and not hasattr(errtoken,'lexer'): errtoken.lexer = lexer tok = self.errorfunc(errtoken) del errok, token, restart # Delete special functions if self.errorok: # User must have done some kind of panic # mode recovery on their own. The # returned token is the next lookahead lookahead = tok errtoken = None continue else: if errtoken: if hasattr(errtoken,"lineno"): lineno = lookahead.lineno else: lineno = 0 if lineno: sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) else: sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) else: sys.stderr.write("yacc: Parse error in input. EOF\n") return else: errorcount = error_count # case 1: the statestack only has 1 entry on it. If we're in this state, the # entire parse has been rolled back and we're completely hosed. The token is # discarded and we just keep going. if len(statestack) <= 1 and lookahead.type != "$end": lookahead = None errtoken = None state = 0 # Nuke the pushback stack del lookaheadstack[:] continue # case 2: the statestack has a couple of entries on it, but we're # at the end of the file. nuke the top entry and generate an error token # Start nuking entries on the stack if lookahead.type == "$end": # Whoa. We're really hosed here. Bail out return if lookahead.type != 'error': sym = symstack[-1] if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue lookahead = None continue t = YaccSymbol() t.type = 'error' if hasattr(lookahead,"lineno"): t.lineno = lookahead.lineno t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: symstack.pop() statestack.pop() state = statestack[-1] # Potential bug fix continue # Call an error function here raise RuntimeError("yacc: internal parser error!!!\n") # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parseopt(). # # Optimized version of parse() method. DO NOT EDIT THIS CODE DIRECTLY. # Edit the debug version above, then copy any modifications to the method # below while removing #--! DEBUG sections. # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! def parseopt(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): lookahead = None # Current lookahead symbol lookaheadstack = [ ] # Stack of lookahead symbols actions = self.action # Local reference to action table (to avoid lookup on self.) goto = self.goto # Local reference to goto table (to avoid lookup on self.) prod = self.productions # Local reference to production list (to avoid lookup on self.) pslice = YaccProduction(None) # Production object passed to grammar rules errorcount = 0 # Used during error recovery # If no lexer was given, we will try to use the lex module if not lexer: lex = load_ply_lex() lexer = lex.lexer # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self # If input was supplied, pass to lexer if input is not None: lexer.input(input) if tokenfunc is None: # Tokenize function get_token = lexer.token else: get_token = tokenfunc # Set up the state and symbol stacks statestack = [ ] # Stack of parsing states self.statestack = statestack symstack = [ ] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production errtoken = None # Err token # The start state is assumed to be (0,$end) statestack.append(0) sym = YaccSymbol() sym.type = '$end' symstack.append(sym) state = 0 while 1: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer if not lookahead: if not lookaheadstack: lookahead = get_token() # Get the next token else: lookahead = lookaheadstack.pop() if not lookahead: lookahead = YaccSymbol() lookahead.type = '$end' # Check the action table ltype = lookahead.type t = actions[state].get(ltype) if t is not None: if t > 0: # shift a symbol on the stack statestack.append(t) state = t symstack.append(lookahead) lookahead = None # Decrease error count on successful shift if errorcount: errorcount -=1 continue if t < 0: # reduce a symbol on the stack, emit a production p = prod[-t] pname = p.name plen = p.len # Get production function sym = YaccSymbol() sym.type = pname # Production name sym.value = None if plen: targ = symstack[-plen-1:] targ[0] = sym # --! TRACKING if tracking: t1 = targ[1] sym.lineno = t1.lineno sym.lexpos = t1.lexpos t1 = targ[-1] sym.endlineno = getattr(t1,"endlineno",t1.lineno) sym.endlexpos = getattr(t1,"endlexpos",t1.lexpos) # --! TRACKING # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object del symstack[-plen:] del statestack[-plen:] p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else: # --! TRACKING if tracking: sym.lineno = lexer.lineno sym.lexpos = lexer.lexpos # --! TRACKING targ = [ sym ] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] return getattr(n,"value",None) if t == None: # We have some kind of parsing error here. To handle # this, we are going to push the current token onto # the tokenstack and replace it with an 'error' token. # If there are any synchronization rules, they may # catch it. # # In addition to pushing the error token, we call call # the user defined p_error() function if this is the # first syntax error. This function is only called if # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count self.errorok = 0 errtoken = lookahead if errtoken.type == '$end': errtoken = None # End of file! if self.errorfunc: global errok,token,restart errok = self.errok # Set some special functions available in error recovery token = get_token restart = self.restart if errtoken and not hasattr(errtoken,'lexer'): errtoken.lexer = lexer tok = self.errorfunc(errtoken) del errok, token, restart # Delete special functions if self.errorok: # User must have done some kind of panic # mode recovery on their own. The # returned token is the next lookahead lookahead = tok errtoken = None continue else: if errtoken: if hasattr(errtoken,"lineno"): lineno = lookahead.lineno else: lineno = 0 if lineno: sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) else: sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) else: sys.stderr.write("yacc: Parse error in input. EOF\n") return else: errorcount = error_count # case 1: the statestack only has 1 entry on it. If we're in this state, the # entire parse has been rolled back and we're completely hosed. The token is # discarded and we just keep going. if len(statestack) <= 1 and lookahead.type != '$end': lookahead = None errtoken = None state = 0 # Nuke the pushback stack del lookaheadstack[:] continue # case 2: the statestack has a couple of entries on it, but we're # at the end of the file. nuke the top entry and generate an error token # Start nuking entries on the stack if lookahead.type == '$end': # Whoa. We're really hosed here. Bail out return if lookahead.type != 'error': sym = symstack[-1] if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue lookahead = None continue t = YaccSymbol() t.type = 'error' if hasattr(lookahead,"lineno"): t.lineno = lookahead.lineno t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: symstack.pop() statestack.pop() state = statestack[-1] # Potential bug fix continue # Call an error function here raise RuntimeError("yacc: internal parser error!!!\n") # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # parseopt_notrack(). # # Optimized version of parseopt() with line number tracking removed. # DO NOT EDIT THIS CODE DIRECTLY. Copy the optimized version and remove # code in the #--! TRACKING sections # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! def parseopt_notrack(self,input=None,lexer=None,debug=0,tracking=0,tokenfunc=None): lookahead = None # Current lookahead symbol lookaheadstack = [ ] # Stack of lookahead symbols actions = self.action # Local reference to action table (to avoid lookup on self.) goto = self.goto # Local reference to goto table (to avoid lookup on self.) prod = self.productions # Local reference to production list (to avoid lookup on self.) pslice = YaccProduction(None) # Production object passed to grammar rules errorcount = 0 # Used during error recovery # If no lexer was given, we will try to use the lex module if not lexer: lex = load_ply_lex() lexer = lex.lexer # Set up the lexer and parser objects on pslice pslice.lexer = lexer pslice.parser = self # If input was supplied, pass to lexer if input is not None: lexer.input(input) if tokenfunc is None: # Tokenize function get_token = lexer.token else: get_token = tokenfunc # Set up the state and symbol stacks statestack = [ ] # Stack of parsing states self.statestack = statestack symstack = [ ] # Stack of grammar symbols self.symstack = symstack pslice.stack = symstack # Put in the production errtoken = None # Err token # The start state is assumed to be (0,$end) statestack.append(0) sym = YaccSymbol() sym.type = '$end' symstack.append(sym) state = 0 while 1: # Get the next symbol on the input. If a lookahead symbol # is already set, we just use that. Otherwise, we'll pull # the next token off of the lookaheadstack or from the lexer if not lookahead: if not lookaheadstack: lookahead = get_token() # Get the next token else: lookahead = lookaheadstack.pop() if not lookahead: lookahead = YaccSymbol() lookahead.type = '$end' # Check the action table ltype = lookahead.type t = actions[state].get(ltype) if t is not None: if t > 0: # shift a symbol on the stack statestack.append(t) state = t symstack.append(lookahead) lookahead = None # Decrease error count on successful shift if errorcount: errorcount -=1 continue if t < 0: # reduce a symbol on the stack, emit a production p = prod[-t] pname = p.name plen = p.len # Get production function sym = YaccSymbol() sym.type = pname # Production name sym.value = None if plen: targ = symstack[-plen-1:] targ[0] = sym # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # below as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object del symstack[-plen:] del statestack[-plen:] p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! else: targ = [ sym ] # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # The code enclosed in this section is duplicated # above as a performance optimization. Make sure # changes get made in both locations. pslice.slice = targ try: # Call the grammar rule with our special slice object p.callable(pslice) symstack.append(sym) state = goto[statestack[-1]][pname] statestack.append(state) except SyntaxError: # If an error was set. Enter error recovery state lookaheadstack.append(lookahead) symstack.pop() statestack.pop() state = statestack[-1] sym.type = 'error' lookahead = sym errorcount = error_count self.errorok = 0 continue # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! if t == 0: n = symstack[-1] return getattr(n,"value",None) if t == None: # We have some kind of parsing error here. To handle # this, we are going to push the current token onto # the tokenstack and replace it with an 'error' token. # If there are any synchronization rules, they may # catch it. # # In addition to pushing the error token, we call call # the user defined p_error() function if this is the # first syntax error. This function is only called if # errorcount == 0. if errorcount == 0 or self.errorok: errorcount = error_count self.errorok = 0 errtoken = lookahead if errtoken.type == '$end': errtoken = None # End of file! if self.errorfunc: global errok,token,restart errok = self.errok # Set some special functions available in error recovery token = get_token restart = self.restart if errtoken and not hasattr(errtoken,'lexer'): errtoken.lexer = lexer tok = self.errorfunc(errtoken) del errok, token, restart # Delete special functions if self.errorok: # User must have done some kind of panic # mode recovery on their own. The # returned token is the next lookahead lookahead = tok errtoken = None continue else: if errtoken: if hasattr(errtoken,"lineno"): lineno = lookahead.lineno else: lineno = 0 if lineno: sys.stderr.write("yacc: Syntax error at line %d, token=%s\n" % (lineno, errtoken.type)) else: sys.stderr.write("yacc: Syntax error, token=%s" % errtoken.type) else: sys.stderr.write("yacc: Parse error in input. EOF\n") return else: errorcount = error_count # case 1: the statestack only has 1 entry on it. If we're in this state, the # entire parse has been rolled back and we're completely hosed. The token is # discarded and we just keep going. if len(statestack) <= 1 and lookahead.type != '$end': lookahead = None errtoken = None state = 0 # Nuke the pushback stack del lookaheadstack[:] continue # case 2: the statestack has a couple of entries on it, but we're # at the end of the file. nuke the top entry and generate an error token # Start nuking entries on the stack if lookahead.type == '$end': # Whoa. We're really hosed here. Bail out return if lookahead.type != 'error': sym = symstack[-1] if sym.type == 'error': # Hmmm. Error is on top of stack, we'll just nuke input # symbol and continue lookahead = None continue t = YaccSymbol() t.type = 'error' if hasattr(lookahead,"lineno"): t.lineno = lookahead.lineno t.value = lookahead lookaheadstack.append(lookahead) lookahead = t else: symstack.pop() statestack.pop() state = statestack[-1] # Potential bug fix continue # Call an error function here raise RuntimeError("yacc: internal parser error!!!\n") # ----------------------------------------------------------------------------- # === Grammar Representation === # # The following functions, classes, and variables are used to represent and # manipulate the rules that make up a grammar. # ----------------------------------------------------------------------------- import re # regex matching identifiers _is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$') # ----------------------------------------------------------------------------- # class Production: # # This class stores the raw information about a single production or grammar rule. # A grammar rule refers to a specification such as this: # # expr : expr PLUS term # # Here are the basic attributes defined on all productions # # name - Name of the production. For example 'expr' # prod - A list of symbols on the right side ['expr','PLUS','term'] # prec - Production precedence level # number - Production number. # func - Function that executes on reduce # file - File where production function is defined # lineno - Line number where production function is defined # # The following attributes are defined or optional. # # len - Length of the production (number of symbols on right hand side) # usyms - Set of unique symbols found in the production # ----------------------------------------------------------------------------- class Production(object): reduced = 0 def __init__(self,number,name,prod,precedence=('right',0),func=None,file='',line=0): self.name = name self.prod = tuple(prod) self.number = number self.func = func self.callable = None self.file = file self.line = line self.prec = precedence # Internal settings used during table construction self.len = len(self.prod) # Length of the production # Create a list of unique production symbols used in the production self.usyms = [ ] for s in self.prod: if s not in self.usyms: self.usyms.append(s) # List of all LR items for the production self.lr_items = [] self.lr_next = None # Create a string representation if self.prod: self.str = "%s -> %s" % (self.name," ".join(self.prod)) else: self.str = "%s -> " % self.name def __str__(self): return self.str def __repr__(self): return "Production("+str(self)+")" def __len__(self): return len(self.prod) def __nonzero__(self): return 1 def __getitem__(self,index): return self.prod[index] # Return the nth lr_item from the production (or None if at the end) def lr_item(self,n): if n > len(self.prod): return None p = LRItem(self,n) # Precompute the list of productions immediately following. Hack. Remove later try: p.lr_after = Prodnames[p.prod[n+1]] except (IndexError,KeyError): p.lr_after = [] try: p.lr_before = p.prod[n-1] except IndexError: p.lr_before = None return p # Bind the production function name to a callable def bind(self,pdict): if self.func: self.callable = pdict[self.func] # This class serves as a minimal standin for Production objects when # reading table data from files. It only contains information # actually used by the LR parsing engine, plus some additional # debugging information. class MiniProduction(object): def __init__(self,str,name,len,func,file,line): self.name = name self.len = len self.func = func self.callable = None self.file = file self.line = line self.str = str def __str__(self): return self.str def __repr__(self): return "MiniProduction(%s)" % self.str # Bind the production function name to a callable def bind(self,pdict): if self.func: self.callable = pdict[self.func] # ----------------------------------------------------------------------------- # class LRItem # # This class represents a specific stage of parsing a production rule. For # example: # # expr : expr . PLUS term # # In the above, the "." represents the current location of the parse. Here # basic attributes: # # name - Name of the production. For example 'expr' # prod - A list of symbols on the right side ['expr','.', 'PLUS','term'] # number - Production number. # # lr_next Next LR item. Example, if we are ' expr -> expr . PLUS term' # then lr_next refers to 'expr -> expr PLUS . term' # lr_index - LR item index (location of the ".") in the prod list. # lookaheads - LALR lookahead symbols for this item # len - Length of the production (number of symbols on right hand side) # lr_after - List of all productions that immediately follow # lr_before - Grammar symbol immediately before # ----------------------------------------------------------------------------- class LRItem(object): def __init__(self,p,n): self.name = p.name self.prod = list(p.prod) self.number = p.number self.lr_index = n self.lookaheads = { } self.prod.insert(n,".") self.prod = tuple(self.prod) self.len = len(self.prod) self.usyms = p.usyms def __str__(self): if self.prod: s = "%s -> %s" % (self.name," ".join(self.prod)) else: s = "%s -> " % self.name return s def __repr__(self): return "LRItem("+str(self)+")" # ----------------------------------------------------------------------------- # rightmost_terminal() # # Return the rightmost terminal from a list of symbols. Used in add_production() # ----------------------------------------------------------------------------- def rightmost_terminal(symbols, terminals): i = len(symbols) - 1 while i >= 0: if symbols[i] in terminals: return symbols[i] i -= 1 return None # ----------------------------------------------------------------------------- # === GRAMMAR CLASS === # # The following class represents the contents of the specified grammar along # with various computed properties such as first sets, follow sets, LR items, etc. # This data is used for critical parts of the table generation process later. # ----------------------------------------------------------------------------- class GrammarError(YaccError): pass class Grammar(object): def __init__(self,terminals): self.Productions = [None] # A list of all of the productions. The first # entry is always reserved for the purpose of # building an augmented grammar self.Prodnames = { } # A dictionary mapping the names of nonterminals to a list of all # productions of that nonterminal. self.Prodmap = { } # A dictionary that is only used to detect duplicate # productions. self.Terminals = { } # A dictionary mapping the names of terminal symbols to a # list of the rules where they are used. for term in terminals: self.Terminals[term] = [] self.Terminals['error'] = [] self.Nonterminals = { } # A dictionary mapping names of nonterminals to a list # of rule numbers where they are used. self.First = { } # A dictionary of precomputed FIRST(x) symbols self.Follow = { } # A dictionary of precomputed FOLLOW(x) symbols self.Precedence = { } # Precedence rules for each terminal. Contains tuples of the # form ('right',level) or ('nonassoc', level) or ('left',level) self.UsedPrecedence = { } # Precedence rules that were actually used by the grammer. # This is only used to provide error checking and to generate # a warning about unused precedence rules. self.Start = None # Starting symbol for the grammar def __len__(self): return len(self.Productions) def __getitem__(self,index): return self.Productions[index] # ----------------------------------------------------------------------------- # set_precedence() # # Sets the precedence for a given terminal. assoc is the associativity such as # 'left','right', or 'nonassoc'. level is a numeric level. # # ----------------------------------------------------------------------------- def set_precedence(self,term,assoc,level): assert self.Productions == [None],"Must call set_precedence() before add_production()" if term in self.Precedence: raise GrammarError("Precedence already specified for terminal '%s'" % term) if assoc not in ['left','right','nonassoc']: raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'") self.Precedence[term] = (assoc,level) # ----------------------------------------------------------------------------- # add_production() # # Given an action function, this function assembles a production rule and # computes its precedence level. # # The production rule is supplied as a list of symbols. For example, # a rule such as 'expr : expr PLUS term' has a production name of 'expr' and # symbols ['expr','PLUS','term']. # # Precedence is determined by the precedence of the right-most non-terminal # or the precedence of a terminal specified by %prec. # # A variety of error checks are performed to make sure production symbols # are valid and that %prec is used correctly. # ----------------------------------------------------------------------------- def add_production(self,prodname,syms,func=None,file='',line=0): if prodname in self.Terminals: raise GrammarError("%s:%d: Illegal rule name '%s'. Already defined as a token" % (file,line,prodname)) if prodname == 'error': raise GrammarError("%s:%d: Illegal rule name '%s'. error is a reserved word" % (file,line,prodname)) if not _is_identifier.match(prodname): raise GrammarError("%s:%d: Illegal rule name '%s'" % (file,line,prodname)) # Look for literal tokens for n,s in enumerate(syms): if s[0] in "'\"": try: c = eval(s) if (len(c) > 1): raise GrammarError("%s:%d: Literal token %s in rule '%s' may only be a single character" % (file,line,s, prodname)) if not c in self.Terminals: self.Terminals[c] = [] syms[n] = c continue except SyntaxError: pass if not _is_identifier.match(s) and s != '%prec': raise GrammarError("%s:%d: Illegal name '%s' in rule '%s'" % (file,line,s, prodname)) # Determine the precedence level if '%prec' in syms: if syms[-1] == '%prec': raise GrammarError("%s:%d: Syntax error. Nothing follows %%prec" % (file,line)) if syms[-2] != '%prec': raise GrammarError("%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule" % (file,line)) precname = syms[-1] prodprec = self.Precedence.get(precname,None) if not prodprec: raise GrammarError("%s:%d: Nothing known about the precedence of '%s'" % (file,line,precname)) else: self.UsedPrecedence[precname] = 1 del syms[-2:] # Drop %prec from the rule else: # If no %prec, precedence is determined by the rightmost terminal symbol precname = rightmost_terminal(syms,self.Terminals) prodprec = self.Precedence.get(precname,('right',0)) # See if the rule is already in the rulemap map = "%s -> %s" % (prodname,syms) if map in self.Prodmap: m = self.Prodmap[map] raise GrammarError("%s:%d: Duplicate rule %s. " % (file,line, m) + "Previous definition at %s:%d" % (m.file, m.line)) # From this point on, everything is valid. Create a new Production instance pnumber = len(self.Productions) if not prodname in self.Nonterminals: self.Nonterminals[prodname] = [ ] # Add the production number to Terminals and Nonterminals for t in syms: if t in self.Terminals: self.Terminals[t].append(pnumber) else: if not t in self.Nonterminals: self.Nonterminals[t] = [ ] self.Nonterminals[t].append(pnumber) # Create a production and add it to the list of productions p = Production(pnumber,prodname,syms,prodprec,func,file,line) self.Productions.append(p) self.Prodmap[map] = p # Add to the global productions list try: self.Prodnames[prodname].append(p) except KeyError: self.Prodnames[prodname] = [ p ] return 0 # ----------------------------------------------------------------------------- # set_start() # # Sets the starting symbol and creates the augmented grammar. Production # rule 0 is S' -> start where start is the start symbol. # ----------------------------------------------------------------------------- def set_start(self,start=None): if not start: start = self.Productions[1].name if start not in self.Nonterminals: raise GrammarError("start symbol %s undefined" % start) self.Productions[0] = Production(0,"S'",[start]) self.Nonterminals[start].append(0) self.Start = start # ----------------------------------------------------------------------------- # find_unreachable() # # Find all of the nonterminal symbols that can't be reached from the starting # symbol. Returns a list of nonterminals that can't be reached. # ----------------------------------------------------------------------------- def find_unreachable(self): # Mark all symbols that are reachable from a symbol s def mark_reachable_from(s): if reachable[s]: # We've already reached symbol s. return reachable[s] = 1 for p in self.Prodnames.get(s,[]): for r in p.prod: mark_reachable_from(r) reachable = { } for s in list(self.Terminals) + list(self.Nonterminals): reachable[s] = 0 mark_reachable_from( self.Productions[0].prod[0] ) return [s for s in list(self.Nonterminals) if not reachable[s]] # ----------------------------------------------------------------------------- # infinite_cycles() # # This function looks at the various parsing rules and tries to detect # infinite recursion cycles (grammar rules where there is no possible way # to derive a string of only terminals). # ----------------------------------------------------------------------------- def infinite_cycles(self): terminates = {} # Terminals: for t in self.Terminals: terminates[t] = 1 terminates['$end'] = 1 # Nonterminals: # Initialize to false: for n in self.Nonterminals: terminates[n] = 0 # Then propagate termination until no change: while 1: some_change = 0 for (n,pl) in self.Prodnames.items(): # Nonterminal n terminates iff any of its productions terminates. for p in pl: # Production p terminates iff all of its rhs symbols terminate. for s in p.prod: if not terminates[s]: # The symbol s does not terminate, # so production p does not terminate. p_terminates = 0 break else: # didn't break from the loop, # so every symbol s terminates # so production p terminates. p_terminates = 1 if p_terminates: # symbol n terminates! if not terminates[n]: terminates[n] = 1 some_change = 1 # Don't need to consider any more productions for this n. break if not some_change: break infinite = [] for (s,term) in terminates.items(): if not term: if not s in self.Prodnames and not s in self.Terminals and s != 'error': # s is used-but-not-defined, and we've already warned of that, # so it would be overkill to say that it's also non-terminating. pass else: infinite.append(s) return infinite # ----------------------------------------------------------------------------- # undefined_symbols() # # Find all symbols that were used the grammar, but not defined as tokens or # grammar rules. Returns a list of tuples (sym, prod) where sym in the symbol # and prod is the production where the symbol was used. # ----------------------------------------------------------------------------- def undefined_symbols(self): result = [] for p in self.Productions: if not p: continue for s in p.prod: if not s in self.Prodnames and not s in self.Terminals and s != 'error': result.append((s,p)) return result # ----------------------------------------------------------------------------- # unused_terminals() # # Find all terminals that were defined, but not used by the grammar. Returns # a list of all symbols. # ----------------------------------------------------------------------------- def unused_terminals(self): unused_tok = [] for s,v in self.Terminals.items(): if s != 'error' and not v: unused_tok.append(s) return unused_tok # ------------------------------------------------------------------------------ # unused_rules() # # Find all grammar rules that were defined, but not used (maybe not reachable) # Returns a list of productions. # ------------------------------------------------------------------------------ def unused_rules(self): unused_prod = [] for s,v in self.Nonterminals.items(): if not v: p = self.Prodnames[s][0] unused_prod.append(p) return unused_prod # ----------------------------------------------------------------------------- # unused_precedence() # # Returns a list of tuples (term,precedence) corresponding to precedence # rules that were never used by the grammar. term is the name of the terminal # on which precedence was applied and precedence is a string such as 'left' or # 'right' corresponding to the type of precedence. # ----------------------------------------------------------------------------- def unused_precedence(self): unused = [] for termname in self.Precedence: if not (termname in self.Terminals or termname in self.UsedPrecedence): unused.append((termname,self.Precedence[termname][0])) return unused # ------------------------------------------------------------------------- # _first() # # Compute the value of FIRST1(beta) where beta is a tuple of symbols. # # During execution of compute_first1, the result may be incomplete. # Afterward (e.g., when called from compute_follow()), it will be complete. # ------------------------------------------------------------------------- def _first(self,beta): # We are computing First(x1,x2,x3,...,xn) result = [ ] for x in beta: x_produces_empty = 0 # Add all the non- symbols of First[x] to the result. for f in self.First[x]: if f == '': x_produces_empty = 1 else: if f not in result: result.append(f) if x_produces_empty: # We have to consider the next x in beta, # i.e. stay in the loop. pass else: # We don't have to consider any further symbols in beta. break else: # There was no 'break' from the loop, # so x_produces_empty was true for all x in beta, # so beta produces empty as well. result.append('') return result # ------------------------------------------------------------------------- # compute_first() # # Compute the value of FIRST1(X) for all symbols # ------------------------------------------------------------------------- def compute_first(self): if self.First: return self.First # Terminals: for t in self.Terminals: self.First[t] = [t] self.First['$end'] = ['$end'] # Nonterminals: # Initialize to the empty set: for n in self.Nonterminals: self.First[n] = [] # Then propagate symbols until no change: while 1: some_change = 0 for n in self.Nonterminals: for p in self.Prodnames[n]: for f in self._first(p.prod): if f not in self.First[n]: self.First[n].append( f ) some_change = 1 if not some_change: break return self.First # --------------------------------------------------------------------- # compute_follow() # # Computes all of the follow sets for every non-terminal symbol. The # follow set is the set of all symbols that might follow a given # non-terminal. See the Dragon book, 2nd Ed. p. 189. # --------------------------------------------------------------------- def compute_follow(self,start=None): # If already computed, return the result if self.Follow: return self.Follow # If first sets not computed yet, do that first. if not self.First: self.compute_first() # Add '$end' to the follow list of the start symbol for k in self.Nonterminals: self.Follow[k] = [ ] if not start: start = self.Productions[1].name self.Follow[start] = [ '$end' ] while 1: didadd = 0 for p in self.Productions[1:]: # Here is the production set for i in range(len(p.prod)): B = p.prod[i] if B in self.Nonterminals: # Okay. We got a non-terminal in a production fst = self._first(p.prod[i+1:]) hasempty = 0 for f in fst: if f != '' and f not in self.Follow[B]: self.Follow[B].append(f) didadd = 1 if f == '': hasempty = 1 if hasempty or i == (len(p.prod)-1): # Add elements of follow(a) to follow(b) for f in self.Follow[p.name]: if f not in self.Follow[B]: self.Follow[B].append(f) didadd = 1 if not didadd: break return self.Follow # ----------------------------------------------------------------------------- # build_lritems() # # This function walks the list of productions and builds a complete set of the # LR items. The LR items are stored in two ways: First, they are uniquely # numbered and placed in the list _lritems. Second, a linked list of LR items # is built for each production. For example: # # E -> E PLUS E # # Creates the list # # [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ] # ----------------------------------------------------------------------------- def build_lritems(self): for p in self.Productions: lastlri = p i = 0 lr_items = [] while 1: if i > len(p): lri = None else: lri = LRItem(p,i) # Precompute the list of productions immediately following try: lri.lr_after = self.Prodnames[lri.prod[i+1]] except (IndexError,KeyError): lri.lr_after = [] try: lri.lr_before = lri.prod[i-1] except IndexError: lri.lr_before = None lastlri.lr_next = lri if not lri: break lr_items.append(lri) lastlri = lri i += 1 p.lr_items = lr_items # ----------------------------------------------------------------------------- # == Class LRTable == # # This basic class represents a basic table of LR parsing information. # Methods for generating the tables are not defined here. They are defined # in the derived class LRGeneratedTable. # ----------------------------------------------------------------------------- class VersionError(YaccError): pass class LRTable(object): def __init__(self): self.lr_action = None self.lr_goto = None self.lr_productions = None self.lr_method = None def read_table(self,module): if isinstance(module,types.ModuleType): parsetab = module else: if sys.version_info[0] < 3: exec("import %s as parsetab" % module) else: env = { } exec("import %s as parsetab" % module, env, env) parsetab = env['parsetab'] if parsetab._tabversion != __tabversion__: raise VersionError("yacc table file version is out of date") self.lr_action = parsetab._lr_action self.lr_goto = parsetab._lr_goto self.lr_productions = [] for p in parsetab._lr_productions: self.lr_productions.append(MiniProduction(*p)) self.lr_method = parsetab._lr_method return parsetab._lr_signature def read_pickle(self,filename): try: import cPickle as pickle except ImportError: import pickle in_f = open(filename,"rb") tabversion = pickle.load(in_f) if tabversion != __tabversion__: raise VersionError("yacc table file version is out of date") self.lr_method = pickle.load(in_f) signature = pickle.load(in_f) self.lr_action = pickle.load(in_f) self.lr_goto = pickle.load(in_f) productions = pickle.load(in_f) self.lr_productions = [] for p in productions: self.lr_productions.append(MiniProduction(*p)) in_f.close() return signature # Bind all production function names to callable objects in pdict def bind_callables(self,pdict): for p in self.lr_productions: p.bind(pdict) # ----------------------------------------------------------------------------- # === LR Generator === # # The following classes and functions are used to generate LR parsing tables on # a grammar. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # digraph() # traverse() # # The following two functions are used to compute set valued functions # of the form: # # F(x) = F'(x) U U{F(y) | x R y} # # This is used to compute the values of Read() sets as well as FOLLOW sets # in LALR(1) generation. # # Inputs: X - An input set # R - A relation # FP - Set-valued function # ------------------------------------------------------------------------------ def digraph(X,R,FP): N = { } for x in X: N[x] = 0 stack = [] F = { } for x in X: if N[x] == 0: traverse(x,N,stack,F,X,R,FP) return F def traverse(x,N,stack,F,X,R,FP): stack.append(x) d = len(stack) N[x] = d F[x] = FP(x) # F(X) <- F'(x) rel = R(x) # Get y's related to x for y in rel: if N[y] == 0: traverse(y,N,stack,F,X,R,FP) N[x] = min(N[x],N[y]) for a in F.get(y,[]): if a not in F[x]: F[x].append(a) if N[x] == d: N[stack[-1]] = MAXINT F[stack[-1]] = F[x] element = stack.pop() while element != x: N[stack[-1]] = MAXINT F[stack[-1]] = F[x] element = stack.pop() class LALRError(YaccError): pass # ----------------------------------------------------------------------------- # == LRGeneratedTable == # # This class implements the LR table generation algorithm. There are no # public methods except for write() # ----------------------------------------------------------------------------- class LRGeneratedTable(LRTable): def __init__(self,grammar,method='LALR',log=None): if method not in ['SLR','LALR']: raise LALRError("Unsupported method %s" % method) self.grammar = grammar self.lr_method = method # Set up the logger if not log: log = NullLogger() self.log = log # Internal attributes self.lr_action = {} # Action table self.lr_goto = {} # Goto table self.lr_productions = grammar.Productions # Copy of grammar Production array self.lr_goto_cache = {} # Cache of computed gotos self.lr0_cidhash = {} # Cache of closures self._add_count = 0 # Internal counter used to detect cycles # Diagonistic information filled in by the table generator self.sr_conflict = 0 self.rr_conflict = 0 self.conflicts = [] # List of conflicts self.sr_conflicts = [] self.rr_conflicts = [] # Build the tables self.grammar.build_lritems() self.grammar.compute_first() self.grammar.compute_follow() self.lr_parse_table() # Compute the LR(0) closure operation on I, where I is a set of LR(0) items. def lr0_closure(self,I): self._add_count += 1 # Add everything in I to J J = I[:] didadd = 1 while didadd: didadd = 0 for j in J: for x in j.lr_after: if getattr(x,"lr0_added",0) == self._add_count: continue # Add B --> .G to J J.append(x.lr_next) x.lr0_added = self._add_count didadd = 1 return J # Compute the LR(0) goto function goto(I,X) where I is a set # of LR(0) items and X is a grammar symbol. This function is written # in a way that guarantees uniqueness of the generated goto sets # (i.e. the same goto set will never be returned as two different Python # objects). With uniqueness, we can later do fast set comparisons using # id(obj) instead of element-wise comparison. def lr0_goto(self,I,x): # First we look for a previously cached entry g = self.lr_goto_cache.get((id(I),x),None) if g: return g # Now we generate the goto set in a way that guarantees uniqueness # of the result s = self.lr_goto_cache.get(x,None) if not s: s = { } self.lr_goto_cache[x] = s gs = [ ] for p in I: n = p.lr_next if n and n.lr_before == x: s1 = s.get(id(n),None) if not s1: s1 = { } s[id(n)] = s1 gs.append(n) s = s1 g = s.get('$end',None) if not g: if gs: g = self.lr0_closure(gs) s['$end'] = g else: s['$end'] = gs self.lr_goto_cache[(id(I),x)] = g return g # Compute the LR(0) sets of item function def lr0_items(self): C = [ self.lr0_closure([self.grammar.Productions[0].lr_next]) ] i = 0 for I in C: self.lr0_cidhash[id(I)] = i i += 1 # Loop over the items in C and each grammar symbols i = 0 while i < len(C): I = C[i] i += 1 # Collect all of the symbols that could possibly be in the goto(I,X) sets asyms = { } for ii in I: for s in ii.usyms: asyms[s] = None for x in asyms: g = self.lr0_goto(I,x) if not g: continue if id(g) in self.lr0_cidhash: continue self.lr0_cidhash[id(g)] = len(C) C.append(g) return C # ----------------------------------------------------------------------------- # ==== LALR(1) Parsing ==== # # LALR(1) parsing is almost exactly the same as SLR except that instead of # relying upon Follow() sets when performing reductions, a more selective # lookahead set that incorporates the state of the LR(0) machine is utilized. # Thus, we mainly just have to focus on calculating the lookahead sets. # # The method used here is due to DeRemer and Pennelo (1982). # # DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1) # Lookahead Sets", ACM Transactions on Programming Languages and Systems, # Vol. 4, No. 4, Oct. 1982, pp. 615-649 # # Further details can also be found in: # # J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing", # McGraw-Hill Book Company, (1985). # # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # compute_nullable_nonterminals() # # Creates a dictionary containing all of the non-terminals that might produce # an empty production. # ----------------------------------------------------------------------------- def compute_nullable_nonterminals(self): nullable = {} num_nullable = 0 while 1: for p in self.grammar.Productions[1:]: if p.len == 0: nullable[p.name] = 1 continue for t in p.prod: if not t in nullable: break else: nullable[p.name] = 1 if len(nullable) == num_nullable: break num_nullable = len(nullable) return nullable # ----------------------------------------------------------------------------- # find_nonterminal_trans(C) # # Given a set of LR(0) items, this functions finds all of the non-terminal # transitions. These are transitions in which a dot appears immediately before # a non-terminal. Returns a list of tuples of the form (state,N) where state # is the state number and N is the nonterminal symbol. # # The input C is the set of LR(0) items. # ----------------------------------------------------------------------------- def find_nonterminal_transitions(self,C): trans = [] for state in range(len(C)): for p in C[state]: if p.lr_index < p.len - 1: t = (state,p.prod[p.lr_index+1]) if t[1] in self.grammar.Nonterminals: if t not in trans: trans.append(t) state = state + 1 return trans # ----------------------------------------------------------------------------- # dr_relation() # # Computes the DR(p,A) relationships for non-terminal transitions. The input # is a tuple (state,N) where state is a number and N is a nonterminal symbol. # # Returns a list of terminals. # ----------------------------------------------------------------------------- def dr_relation(self,C,trans,nullable): dr_set = { } state,N = trans terms = [] g = self.lr0_goto(C[state],N) for p in g: if p.lr_index < p.len - 1: a = p.prod[p.lr_index+1] if a in self.grammar.Terminals: if a not in terms: terms.append(a) # This extra bit is to handle the start state if state == 0 and N == self.grammar.Productions[0].prod[0]: terms.append('$end') return terms # ----------------------------------------------------------------------------- # reads_relation() # # Computes the READS() relation (p,A) READS (t,C). # ----------------------------------------------------------------------------- def reads_relation(self,C, trans, empty): # Look for empty transitions rel = [] state, N = trans g = self.lr0_goto(C[state],N) j = self.lr0_cidhash.get(id(g),-1) for p in g: if p.lr_index < p.len - 1: a = p.prod[p.lr_index + 1] if a in empty: rel.append((j,a)) return rel # ----------------------------------------------------------------------------- # compute_lookback_includes() # # Determines the lookback and includes relations # # LOOKBACK: # # This relation is determined by running the LR(0) state machine forward. # For example, starting with a production "N : . A B C", we run it forward # to obtain "N : A B C ." We then build a relationship between this final # state and the starting state. These relationships are stored in a dictionary # lookdict. # # INCLUDES: # # Computes the INCLUDE() relation (p,A) INCLUDES (p',B). # # This relation is used to determine non-terminal transitions that occur # inside of other non-terminal transition states. (p,A) INCLUDES (p', B) # if the following holds: # # B -> LAT, where T -> epsilon and p' -L-> p # # L is essentially a prefix (which may be empty), T is a suffix that must be # able to derive an empty string. State p' must lead to state p with the string L. # # ----------------------------------------------------------------------------- def compute_lookback_includes(self,C,trans,nullable): lookdict = {} # Dictionary of lookback relations includedict = {} # Dictionary of include relations # Make a dictionary of non-terminal transitions dtrans = {} for t in trans: dtrans[t] = 1 # Loop over all transitions and compute lookbacks and includes for state,N in trans: lookb = [] includes = [] for p in C[state]: if p.name != N: continue # Okay, we have a name match. We now follow the production all the way # through the state machine until we get the . on the right hand side lr_index = p.lr_index j = state while lr_index < p.len - 1: lr_index = lr_index + 1 t = p.prod[lr_index] # Check to see if this symbol and state are a non-terminal transition if (j,t) in dtrans: # Yes. Okay, there is some chance that this is an includes relation # the only way to know for certain is whether the rest of the # production derives empty li = lr_index + 1 while li < p.len: if p.prod[li] in self.grammar.Terminals: break # No forget it if not p.prod[li] in nullable: break li = li + 1 else: # Appears to be a relation between (j,t) and (state,N) includes.append((j,t)) g = self.lr0_goto(C[j],t) # Go to next set j = self.lr0_cidhash.get(id(g),-1) # Go to next state # When we get here, j is the final state, now we have to locate the production for r in C[j]: if r.name != p.name: continue if r.len != p.len: continue i = 0 # This look is comparing a production ". A B C" with "A B C ." while i < r.lr_index: if r.prod[i] != p.prod[i+1]: break i = i + 1 else: lookb.append((j,r)) for i in includes: if not i in includedict: includedict[i] = [] includedict[i].append((state,N)) lookdict[(state,N)] = lookb return lookdict,includedict # ----------------------------------------------------------------------------- # compute_read_sets() # # Given a set of LR(0) items, this function computes the read sets. # # Inputs: C = Set of LR(0) items # ntrans = Set of nonterminal transitions # nullable = Set of empty transitions # # Returns a set containing the read sets # ----------------------------------------------------------------------------- def compute_read_sets(self,C, ntrans, nullable): FP = lambda x: self.dr_relation(C,x,nullable) R = lambda x: self.reads_relation(C,x,nullable) F = digraph(ntrans,R,FP) return F # ----------------------------------------------------------------------------- # compute_follow_sets() # # Given a set of LR(0) items, a set of non-terminal transitions, a readset, # and an include set, this function computes the follow sets # # Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)} # # Inputs: # ntrans = Set of nonterminal transitions # readsets = Readset (previously computed) # inclsets = Include sets (previously computed) # # Returns a set containing the follow sets # ----------------------------------------------------------------------------- def compute_follow_sets(self,ntrans,readsets,inclsets): FP = lambda x: readsets[x] R = lambda x: inclsets.get(x,[]) F = digraph(ntrans,R,FP) return F # ----------------------------------------------------------------------------- # add_lookaheads() # # Attaches the lookahead symbols to grammar rules. # # Inputs: lookbacks - Set of lookback relations # followset - Computed follow set # # This function directly attaches the lookaheads to productions contained # in the lookbacks set # ----------------------------------------------------------------------------- def add_lookaheads(self,lookbacks,followset): for trans,lb in lookbacks.items(): # Loop over productions in lookback for state,p in lb: if not state in p.lookaheads: p.lookaheads[state] = [] f = followset.get(trans,[]) for a in f: if a not in p.lookaheads[state]: p.lookaheads[state].append(a) # ----------------------------------------------------------------------------- # add_lalr_lookaheads() # # This function does all of the work of adding lookahead information for use # with LALR parsing # ----------------------------------------------------------------------------- def add_lalr_lookaheads(self,C): # Determine all of the nullable nonterminals nullable = self.compute_nullable_nonterminals() # Find all non-terminal transitions trans = self.find_nonterminal_transitions(C) # Compute read sets readsets = self.compute_read_sets(C,trans,nullable) # Compute lookback/includes relations lookd, included = self.compute_lookback_includes(C,trans,nullable) # Compute LALR FOLLOW sets followsets = self.compute_follow_sets(trans,readsets,included) # Add all of the lookaheads self.add_lookaheads(lookd,followsets) # ----------------------------------------------------------------------------- # lr_parse_table() # # This function constructs the parse tables for SLR or LALR # ----------------------------------------------------------------------------- def lr_parse_table(self): Productions = self.grammar.Productions Precedence = self.grammar.Precedence goto = self.lr_goto # Goto array action = self.lr_action # Action array log = self.log # Logger for output actionp = { } # Action production array (temporary) log.info("Parsing method: %s", self.lr_method) # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items # This determines the number of states C = self.lr0_items() if self.lr_method == 'LALR': self.add_lalr_lookaheads(C) # Build the parser table, state by state st = 0 for I in C: # Loop over each production in I actlist = [ ] # List of actions st_action = { } st_actionp = { } st_goto = { } log.info("") log.info("state %d", st) log.info("") for p in I: log.info(" (%d) %s", p.number, str(p)) log.info("") for p in I: if p.len == p.lr_index + 1: if p.name == "S'": # Start symbol. Accept! st_action["$end"] = 0 st_actionp["$end"] = p else: # We are at the end of a production. Reduce! if self.lr_method == 'LALR': laheads = p.lookaheads[st] else: laheads = self.grammar.Follow[p.name] for a in laheads: actlist.append((a,p,"reduce using rule %d (%s)" % (p.number,p))) r = st_action.get(a,None) if r is not None: # Whoa. Have a shift/reduce or reduce/reduce conflict if r > 0: # Need to decide on shift or reduce here # By default we favor shifting. Need to add # some precedence rules here. sprec,slevel = Productions[st_actionp[a].number].prec rprec,rlevel = Precedence.get(a,('right',0)) if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')): # We really need to reduce here. st_action[a] = -p.number st_actionp[a] = p if not slevel and not rlevel: log.info(" ! shift/reduce conflict for %s resolved as reduce",a) self.sr_conflicts.append((st,a,'reduce')) Productions[p.number].reduced += 1 elif (slevel == rlevel) and (rprec == 'nonassoc'): st_action[a] = None else: # Hmmm. Guess we'll keep the shift if not rlevel: log.info(" ! shift/reduce conflict for %s resolved as shift",a) self.sr_conflicts.append((st,a,'shift')) elif r < 0: # Reduce/reduce conflict. In this case, we favor the rule # that was defined first in the grammar file oldp = Productions[-r] pp = Productions[p.number] if oldp.line > pp.line: st_action[a] = -p.number st_actionp[a] = p chosenp,rejectp = pp,oldp Productions[p.number].reduced += 1 Productions[oldp.number].reduced -= 1 else: chosenp,rejectp = oldp,pp self.rr_conflicts.append((st,chosenp,rejectp)) log.info(" ! reduce/reduce conflict for %s resolved using rule %d (%s)", a,st_actionp[a].number, st_actionp[a]) else: raise LALRError("Unknown conflict in state %d" % st) else: st_action[a] = -p.number st_actionp[a] = p Productions[p.number].reduced += 1 else: i = p.lr_index a = p.prod[i+1] # Get symbol right after the "." if a in self.grammar.Terminals: g = self.lr0_goto(I,a) j = self.lr0_cidhash.get(id(g),-1) if j >= 0: # We are in a shift state actlist.append((a,p,"shift and go to state %d" % j)) r = st_action.get(a,None) if r is not None: # Whoa have a shift/reduce or shift/shift conflict if r > 0: if r != j: raise LALRError("Shift/shift conflict in state %d" % st) elif r < 0: # Do a precedence check. # - if precedence of reduce rule is higher, we reduce. # - if precedence of reduce is same and left assoc, we reduce. # - otherwise we shift rprec,rlevel = Productions[st_actionp[a].number].prec sprec,slevel = Precedence.get(a,('right',0)) if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')): # We decide to shift here... highest precedence to shift Productions[st_actionp[a].number].reduced -= 1 st_action[a] = j st_actionp[a] = p if not rlevel: log.info(" ! shift/reduce conflict for %s resolved as shift",a) self.sr_conflicts.append((st,a,'shift')) elif (slevel == rlevel) and (rprec == 'nonassoc'): st_action[a] = None else: # Hmmm. Guess we'll keep the reduce if not slevel and not rlevel: log.info(" ! shift/reduce conflict for %s resolved as reduce",a) self.sr_conflicts.append((st,a,'reduce')) else: raise LALRError("Unknown conflict in state %d" % st) else: st_action[a] = j st_actionp[a] = p # Print the actions associated with each terminal _actprint = { } for a,p,m in actlist: if a in st_action: if p is st_actionp[a]: log.info(" %-15s %s",a,m) _actprint[(a,m)] = 1 log.info("") # Print the actions that were not used. (debugging) not_used = 0 for a,p,m in actlist: if a in st_action: if p is not st_actionp[a]: if not (a,m) in _actprint: log.debug(" ! %-15s [ %s ]",a,m) not_used = 1 _actprint[(a,m)] = 1 if not_used: log.debug("") # Construct the goto table for this state nkeys = { } for ii in I: for s in ii.usyms: if s in self.grammar.Nonterminals: nkeys[s] = None for n in nkeys: g = self.lr0_goto(I,n) j = self.lr0_cidhash.get(id(g),-1) if j >= 0: st_goto[n] = j log.info(" %-30s shift and go to state %d",n,j) action[st] = st_action actionp[st] = st_actionp goto[st] = st_goto st += 1 # ----------------------------------------------------------------------------- # write() # # This function writes the LR parsing tables to a file # ----------------------------------------------------------------------------- def write_table(self,modulename,outputdir='',signature=""): basemodulename = modulename.split(".")[-1] filename = os.path.join(outputdir,basemodulename) + ".py" try: f = open(filename,"w") f.write(""" # %s # This file is automatically generated. Do not edit. _tabversion = %r _lr_method = %r _lr_signature = %r """ % (filename, __tabversion__, self.lr_method, signature)) # Change smaller to 0 to go back to original tables smaller = 1 # Factor out names to try and make smaller if smaller: items = { } for s,nd in self.lr_action.items(): for name,v in nd.items(): i = items.get(name) if not i: i = ([],[]) items[name] = i i[0].append(s) i[1].append(v) f.write("\n_lr_action_items = {") for k,v in items.items(): f.write("%r:([" % k) for i in v[0]: f.write("%r," % i) f.write("],[") for i in v[1]: f.write("%r," % i) f.write("]),") f.write("}\n") f.write(""" _lr_action = { } for _k, _v in _lr_action_items.items(): for _x,_y in zip(_v[0],_v[1]): if not _x in _lr_action: _lr_action[_x] = { } _lr_action[_x][_k] = _y del _lr_action_items """) else: f.write("\n_lr_action = { "); for k,v in self.lr_action.items(): f.write("(%r,%r):%r," % (k[0],k[1],v)) f.write("}\n"); if smaller: # Factor out names to try and make smaller items = { } for s,nd in self.lr_goto.items(): for name,v in nd.items(): i = items.get(name) if not i: i = ([],[]) items[name] = i i[0].append(s) i[1].append(v) f.write("\n_lr_goto_items = {") for k,v in items.items(): f.write("%r:([" % k) for i in v[0]: f.write("%r," % i) f.write("],[") for i in v[1]: f.write("%r," % i) f.write("]),") f.write("}\n") f.write(""" _lr_goto = { } for _k, _v in _lr_goto_items.items(): for _x,_y in zip(_v[0],_v[1]): if not _x in _lr_goto: _lr_goto[_x] = { } _lr_goto[_x][_k] = _y del _lr_goto_items """) else: f.write("\n_lr_goto = { "); for k,v in self.lr_goto.items(): f.write("(%r,%r):%r," % (k[0],k[1],v)) f.write("}\n"); # Write production table f.write("_lr_productions = [\n") for p in self.lr_productions: if p.func: f.write(" (%r,%r,%d,%r,%r,%d),\n" % (p.str,p.name, p.len, p.func,p.file,p.line)) else: f.write(" (%r,%r,%d,None,None,None),\n" % (str(p),p.name, p.len)) f.write("]\n") f.close() except IOError: e = sys.exc_info()[1] sys.stderr.write("Unable to create '%s'\n" % filename) sys.stderr.write(str(e)+"\n") return # ----------------------------------------------------------------------------- # pickle_table() # # This function pickles the LR parsing tables to a supplied file object # ----------------------------------------------------------------------------- def pickle_table(self,filename,signature=""): try: import cPickle as pickle except ImportError: import pickle outf = open(filename,"wb") pickle.dump(__tabversion__,outf,pickle_protocol) pickle.dump(self.lr_method,outf,pickle_protocol) pickle.dump(signature,outf,pickle_protocol) pickle.dump(self.lr_action,outf,pickle_protocol) pickle.dump(self.lr_goto,outf,pickle_protocol) outp = [] for p in self.lr_productions: if p.func: outp.append((p.str,p.name, p.len, p.func,p.file,p.line)) else: outp.append((str(p),p.name,p.len,None,None,None)) pickle.dump(outp,outf,pickle_protocol) outf.close() # ----------------------------------------------------------------------------- # === INTROSPECTION === # # The following functions and classes are used to implement the PLY # introspection features followed by the yacc() function itself. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # get_caller_module_dict() # # This function returns a dictionary containing all of the symbols defined within # a caller further down the call stack. This is used to get the environment # associated with the yacc() call if none was provided. # ----------------------------------------------------------------------------- def get_caller_module_dict(levels): try: raise RuntimeError except RuntimeError: e,b,t = sys.exc_info() f = t.tb_frame while levels > 0: f = f.f_back levels -= 1 ldict = f.f_globals.copy() if f.f_globals != f.f_locals: ldict.update(f.f_locals) return ldict # ----------------------------------------------------------------------------- # parse_grammar() # # This takes a raw grammar rule string and parses it into production data # ----------------------------------------------------------------------------- def parse_grammar(doc,file,line): grammar = [] # Split the doc string into lines pstrings = doc.splitlines() lastp = None dline = line for ps in pstrings: dline += 1 p = ps.split() if not p: continue try: if p[0] == '|': # This is a continuation of a previous rule if not lastp: raise SyntaxError("%s:%d: Misplaced '|'" % (file,dline)) prodname = lastp syms = p[1:] else: prodname = p[0] lastp = prodname syms = p[2:] assign = p[1] if assign != ':' and assign != '::=': raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file,dline)) grammar.append((file,dline,prodname,syms)) except SyntaxError: raise except Exception: raise SyntaxError("%s:%d: Syntax error in rule '%s'" % (file,dline,ps.strip())) return grammar # ----------------------------------------------------------------------------- # ParserReflect() # # This class represents information extracted for building a parser including # start symbol, error function, tokens, precedence list, action functions, # etc. # ----------------------------------------------------------------------------- class ParserReflect(object): def __init__(self,pdict,log=None): self.pdict = pdict self.start = None self.error_func = None self.tokens = None self.files = {} self.grammar = [] self.error = 0 if log is None: self.log = PlyLogger(sys.stderr) else: self.log = log # Get all of the basic information def get_all(self): self.get_start() self.get_error_func() self.get_tokens() self.get_precedence() self.get_pfunctions() # Validate all of the information def validate_all(self): self.validate_start() self.validate_error_func() self.validate_tokens() self.validate_precedence() self.validate_pfunctions() self.validate_files() return self.error # Compute a signature over the grammar def signature(self): parts = [] try: if self.start: parts.append(self.start) if self.prec: parts.append(''.join([''.join(p) for p in self.prec])) if self.tokens: parts.append(' '.join(self.tokens)) for f in self.pfuncs: if f[3]: parts.append(f[3]) except (TypeError, ValueError): pass return ''.join(parts) # ----------------------------------------------------------------------------- # validate_file() # # This method checks to see if there are duplicated p_rulename() functions # in the parser module file. Without this function, it is really easy for # users to make mistakes by cutting and pasting code fragments (and it's a real # bugger to try and figure out why the resulting parser doesn't work). Therefore, # we just do a little regular expression pattern matching of def statements # to try and detect duplicates. # ----------------------------------------------------------------------------- def validate_files(self): # Match def p_funcname( fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(') for filename in self.files.keys(): base,ext = os.path.splitext(filename) if ext != '.py': return 1 # No idea. Assume it's okay. try: f = open(filename) lines = f.readlines() f.close() except IOError: continue counthash = { } for linen,l in enumerate(lines): linen += 1 m = fre.match(l) if m: name = m.group(1) prev = counthash.get(name) if not prev: counthash[name] = linen else: self.log.warning("%s:%d: Function %s redefined. Previously defined on line %d", filename,linen,name,prev) # Get the start symbol def get_start(self): self.start = self.pdict.get('start') # Validate the start symbol def validate_start(self): if self.start is not None: if not isinstance(self.start,str): self.log.error("'start' must be a string") # Look for error handler def get_error_func(self): self.error_func = self.pdict.get('p_error') # Validate the error function def validate_error_func(self): if self.error_func: if isinstance(self.error_func,types.FunctionType): ismethod = 0 elif isinstance(self.error_func, types.MethodType): ismethod = 1 else: self.log.error("'p_error' defined, but is not a function or method") self.error = 1 return eline = func_code(self.error_func).co_firstlineno efile = func_code(self.error_func).co_filename self.files[efile] = 1 if (func_code(self.error_func).co_argcount != 1+ismethod): self.log.error("%s:%d: p_error() requires 1 argument",efile,eline) self.error = 1 # Get the tokens map def get_tokens(self): tokens = self.pdict.get("tokens",None) if not tokens: self.log.error("No token list is defined") self.error = 1 return if not isinstance(tokens,(list, tuple)): self.log.error("tokens must be a list or tuple") self.error = 1 return if not tokens: self.log.error("tokens is empty") self.error = 1 return self.tokens = tokens # Validate the tokens def validate_tokens(self): # Validate the tokens. if 'error' in self.tokens: self.log.error("Illegal token name 'error'. Is a reserved word") self.error = 1 return terminals = {} for n in self.tokens: if n in terminals: self.log.warning("Token '%s' multiply defined", n) terminals[n] = 1 # Get the precedence map (if any) def get_precedence(self): self.prec = self.pdict.get("precedence",None) # Validate and parse the precedence map def validate_precedence(self): preclist = [] if self.prec: if not isinstance(self.prec,(list,tuple)): self.log.error("precedence must be a list or tuple") self.error = 1 return for level,p in enumerate(self.prec): if not isinstance(p,(list,tuple)): self.log.error("Bad precedence table") self.error = 1 return if len(p) < 2: self.log.error("Malformed precedence entry %s. Must be (assoc, term, ..., term)",p) self.error = 1 return assoc = p[0] if not isinstance(assoc,str): self.log.error("precedence associativity must be a string") self.error = 1 return for term in p[1:]: if not isinstance(term,str): self.log.error("precedence items must be strings") self.error = 1 return preclist.append((term,assoc,level+1)) self.preclist = preclist # Get all p_functions from the grammar def get_pfunctions(self): p_functions = [] for name, item in self.pdict.items(): if name[:2] != 'p_': continue if name == 'p_error': continue if isinstance(item,(types.FunctionType,types.MethodType)): line = func_code(item).co_firstlineno file = func_code(item).co_filename p_functions.append((line,file,name,item.__doc__)) # Sort all of the actions by line number p_functions.sort() self.pfuncs = p_functions # Validate all of the p_functions def validate_pfunctions(self): grammar = [] # Check for non-empty symbols if len(self.pfuncs) == 0: self.log.error("no rules of the form p_rulename are defined") self.error = 1 return for line, file, name, doc in self.pfuncs: func = self.pdict[name] if isinstance(func, types.MethodType): reqargs = 2 else: reqargs = 1 if func_code(func).co_argcount > reqargs: self.log.error("%s:%d: Rule '%s' has too many arguments",file,line,func.__name__) self.error = 1 elif func_code(func).co_argcount < reqargs: self.log.error("%s:%d: Rule '%s' requires an argument",file,line,func.__name__) self.error = 1 elif not func.__doc__: self.log.warning("%s:%d: No documentation string specified in function '%s' (ignored)",file,line,func.__name__) else: try: parsed_g = parse_grammar(doc,file,line) for g in parsed_g: grammar.append((name, g)) except SyntaxError: e = sys.exc_info()[1] self.log.error(str(e)) self.error = 1 # Looks like a valid grammar rule # Mark the file in which defined. self.files[file] = 1 # Secondary validation step that looks for p_ definitions that are not functions # or functions that look like they might be grammar rules. for n,v in self.pdict.items(): if n[0:2] == 'p_' and isinstance(v, (types.FunctionType, types.MethodType)): continue if n[0:2] == 't_': continue if n[0:2] == 'p_' and n != 'p_error': self.log.warning("'%s' not defined as a function", n) if ((isinstance(v,types.FunctionType) and func_code(v).co_argcount == 1) or (isinstance(v,types.MethodType) and func_code(v).co_argcount == 2)): try: doc = v.__doc__.split(" ") if doc[1] == ':': self.log.warning("%s:%d: Possible grammar rule '%s' defined without p_ prefix", func_code(v).co_filename, func_code(v).co_firstlineno,n) except Exception: pass self.grammar = grammar # ----------------------------------------------------------------------------- # yacc(module) # # Build a parser # ----------------------------------------------------------------------------- def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None, check_recursion=1, optimize=0, write_tables=1, debugfile=debug_file,outputdir='', debuglog=None, errorlog = None, picklefile=None): global parse # Reference to the parsing method of the last built parser # If pickling is enabled, table files are not created if picklefile: write_tables = 0 if errorlog is None: errorlog = PlyLogger(sys.stderr) # Get the module dictionary used for the parser if module: _items = [(k,getattr(module,k)) for k in dir(module)] pdict = dict(_items) else: pdict = get_caller_module_dict(2) # Collect parser information from the dictionary pinfo = ParserReflect(pdict,log=errorlog) pinfo.get_all() if pinfo.error: raise YaccError("Unable to build parser") # Check signature against table files (if any) signature = pinfo.signature() # Read the tables try: lr = LRTable() if picklefile: read_signature = lr.read_pickle(picklefile) else: read_signature = lr.read_table(tabmodule) if optimize or (read_signature == signature): try: lr.bind_callables(pinfo.pdict) parser = LRParser(lr,pinfo.error_func) parse = parser.parse return parser except Exception: e = sys.exc_info()[1] errorlog.warning("There was a problem loading the table file: %s", repr(e)) except VersionError: e = sys.exc_info() errorlog.warning(str(e)) except Exception: pass if debuglog is None: if debug: debuglog = PlyLogger(open(debugfile,"w")) else: debuglog = NullLogger() debuglog.info("Created by PLY version %s (http://www.dabeaz.com/ply)", __version__) errors = 0 # Validate the parser information if pinfo.validate_all(): raise YaccError("Unable to build parser") if not pinfo.error_func: errorlog.warning("no p_error() function is defined") # Create a grammar object grammar = Grammar(pinfo.tokens) # Set precedence level for terminals for term, assoc, level in pinfo.preclist: try: grammar.set_precedence(term,assoc,level) except GrammarError: e = sys.exc_info()[1] errorlog.warning("%s",str(e)) # Add productions to the grammar for funcname, gram in pinfo.grammar: file, line, prodname, syms = gram try: grammar.add_production(prodname,syms,funcname,file,line) except GrammarError: e = sys.exc_info()[1] errorlog.error("%s",str(e)) errors = 1 # Set the grammar start symbols try: if start is None: grammar.set_start(pinfo.start) else: grammar.set_start(start) except GrammarError: e = sys.exc_info()[1] errorlog.error(str(e)) errors = 1 if errors: raise YaccError("Unable to build parser") # Verify the grammar structure undefined_symbols = grammar.undefined_symbols() for sym, prod in undefined_symbols: errorlog.error("%s:%d: Symbol '%s' used, but not defined as a token or a rule",prod.file,prod.line,sym) errors = 1 unused_terminals = grammar.unused_terminals() if unused_terminals: debuglog.info("") debuglog.info("Unused terminals:") debuglog.info("") for term in unused_terminals: errorlog.warning("Token '%s' defined, but not used", term) debuglog.info(" %s", term) # Print out all productions to the debug log if debug: debuglog.info("") debuglog.info("Grammar") debuglog.info("") for n,p in enumerate(grammar.Productions): debuglog.info("Rule %-5d %s", n, p) # Find unused non-terminals unused_rules = grammar.unused_rules() for prod in unused_rules: errorlog.warning("%s:%d: Rule '%s' defined, but not used", prod.file, prod.line, prod.name) if len(unused_terminals) == 1: errorlog.warning("There is 1 unused token") if len(unused_terminals) > 1: errorlog.warning("There are %d unused tokens", len(unused_terminals)) if len(unused_rules) == 1: errorlog.warning("There is 1 unused rule") if len(unused_rules) > 1: errorlog.warning("There are %d unused rules", len(unused_rules)) if debug: debuglog.info("") debuglog.info("Terminals, with rules where they appear") debuglog.info("") terms = list(grammar.Terminals) terms.sort() for term in terms: debuglog.info("%-20s : %s", term, " ".join([str(s) for s in grammar.Terminals[term]])) debuglog.info("") debuglog.info("Nonterminals, with rules where they appear") debuglog.info("") nonterms = list(grammar.Nonterminals) nonterms.sort() for nonterm in nonterms: debuglog.info("%-20s : %s", nonterm, " ".join([str(s) for s in grammar.Nonterminals[nonterm]])) debuglog.info("") if check_recursion: unreachable = grammar.find_unreachable() for u in unreachable: errorlog.warning("Symbol '%s' is unreachable",u) infinite = grammar.infinite_cycles() for inf in infinite: errorlog.error("Infinite recursion detected for symbol '%s'", inf) errors = 1 unused_prec = grammar.unused_precedence() for term, assoc in unused_prec: errorlog.error("Precedence rule '%s' defined for unknown symbol '%s'", assoc, term) errors = 1 if errors: raise YaccError("Unable to build parser") # Run the LRGeneratedTable on the grammar if debug: errorlog.debug("Generating %s tables", method) lr = LRGeneratedTable(grammar,method,debuglog) if debug: num_sr = len(lr.sr_conflicts) # Report shift/reduce and reduce/reduce conflicts if num_sr == 1: errorlog.warning("1 shift/reduce conflict") elif num_sr > 1: errorlog.warning("%d shift/reduce conflicts", num_sr) num_rr = len(lr.rr_conflicts) if num_rr == 1: errorlog.warning("1 reduce/reduce conflict") elif num_rr > 1: errorlog.warning("%d reduce/reduce conflicts", num_rr) # Write out conflicts to the output file if debug and (lr.sr_conflicts or lr.rr_conflicts): debuglog.warning("") debuglog.warning("Conflicts:") debuglog.warning("") for state, tok, resolution in lr.sr_conflicts: debuglog.warning("shift/reduce conflict for %s in state %d resolved as %s", tok, state, resolution) already_reported = {} for state, rule, rejected in lr.rr_conflicts: if (state,id(rule),id(rejected)) in already_reported: continue debuglog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) debuglog.warning("rejected rule (%s) in state %d", rejected,state) errorlog.warning("reduce/reduce conflict in state %d resolved using rule (%s)", state, rule) errorlog.warning("rejected rule (%s) in state %d", rejected, state) already_reported[state,id(rule),id(rejected)] = 1 warned_never = [] for state, rule, rejected in lr.rr_conflicts: if not rejected.reduced and (rejected not in warned_never): debuglog.warning("Rule (%s) is never reduced", rejected) errorlog.warning("Rule (%s) is never reduced", rejected) warned_never.append(rejected) # Write the table file if requested if write_tables: lr.write_table(tabmodule,outputdir,signature) # Write a pickled version of the tables if picklefile: lr.pickle_table(picklefile,signature) # Build the parser lr.bind_callables(pinfo.pdict) parser = LRParser(lr,pinfo.error_func) parse = parser.parse return parser PK[ ]site-packages/ply/__init__.pyonu[ ]Mc@sddgZdS(tlextyaccN(t__all__(((s0/usr/lib/python2.7/site-packages/ply/__init__.pytsPK[޺:H:Hsite-packages/ply/cpp.pyonu[ ]Mc @sddlmZdddddddd d f Zd Zd Zd ZdZdZdZeZ dZ dZ dZ dZ dZddlZddlZddlZddlZejdZi dd6dd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6Zd*Zd+efd,YZd-efd.YZed/krddljZejZddlZe ej!d0Z"e"j#Z$eeZ%e%j&e$ej!d0x/e're%j(Z)e) rPne%j*e)fGHqWndS(1i(t generatorstCPP_IDt CPP_INTEGERt CPP_FLOATt CPP_STRINGtCPP_CHARtCPP_WSt CPP_COMMENTt CPP_POUNDt CPP_DPOUNDs+-*/%|&~^<>=!?()[]{}.,;:\'"cCs"|jj|jjd7_|S(s\s+s (tlexertlinenotvaluetcount(tt((s+/usr/lib/python2.7/site-packages/ply/cpp.pytt_CPP_WSss\#s\#\#s[A-Za-z_][\w_]*cCs|S(sA(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU]|[lL]|[uU][lL]|[lL][uU])?)((R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR$ss?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?cCs"|jj|jjd7_|S(s\"([^\\\n]|(\\(.|\n)))*?\"s (R R R R (R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt t_CPP_STRING.scCs"|jj|jjd7_|S(s(L)?\'([^\\\n]|(\\(.|\n)))*?\'s (R R R R (R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt t_CPP_CHAR4scCs"|jj|jjd7_|S(s(/\*(.|\n)*?\*/)|(//.*?\n)s (R R R R (R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt t_CPP_COMMENT:scCs4|jd|_|jd|_|jjd|S(Nii(R ttypeR tskip(R((s+/usr/lib/python2.7/site-packages/ply/cpp.pytt_error?sNs\?\?[=/\'\(\)\!<>\-]t#t=s\t/t^t't[t(t]t)t|t!t{tt~t-cCstjd|S(NcSst|jdS(Ni(t _trigraph_reptgroup(tg((s+/usr/lib/python2.7/site-packages/ply/cpp.pytis(t _trigraph_pattsub(tinput((s+/usr/lib/python2.7/site-packages/ply/cpp.pyttrigraphhstMacrocBseZdedZRS(cCsG||_||_||_||_|r:|d|_nd|_dS(Ni(tnameR targlisttvariadictvarargtNonetsource(tselfR0R R1R2((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt__init__|s    N(t__name__t __module__R4tFalseR7(((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR/{st PreprocessorcBseZddZdZdZdZdZdZdZ dZ dZ d Z dd Z d Zdd Zd ZdZdZdidZdZRS(cCs|dkrtj}n||_i|_g|_g|_|jtj}|j dtj d||j dtj d|d|_ dS(Ns __DATE__ "%s"s%b %d %Ys __TIME__ "%s"s%H:%M:%S( R4tlexR tmacrostpatht temp_pathtlexprobettimet localtimetdefinetstrftimetparser(R6R ttm((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR7s        cCsMg}|jj|x0trH|jj}|s8Pn|j|qW|S(N(R R-tTruettokentappend(R6ttextttokensttok((s+/usr/lib/python2.7/site-packages/ply/cpp.pyttokenizes cCsd|||fGHdS(Ns%s:%d %s((R6tfiletlinetmsg((s+/usr/lib/python2.7/site-packages/ply/cpp.pyterrorscCs|jjd|jj}| s5|jdkr=dGHn |j|_|jjd|jj}| st|jdkrdGHn|j|_t|j|_|jjd|jj}| s|jdkrdGHn |j|_ |jjd|jj}| s(|jdkr4d|_ n |j|_ |jjd |jj}| su|jd krd|_ d GHn |j|_ |j |j f|_ d d d ddddddg }xO|D]G}|jj||jj}| s |j|krd|GHqqWdS(Nt identifiers"Couldn't determine identifier typet12345i90sCouldn't determine integer types "filename"sCouldn't determine string types s s%Couldn't determine token for newlinesR"R$Rs##s\RRt,t.s,Unable to lex '%s' required for preprocessor(R R-RHR Rtt_IDtintt t_INTEGERtt_INTEGER_TYPEtt_STRINGR4tt_SPACEt t_NEWLINEtt_WS(R6RLtcharstc((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR@sD       ! cCs|jj|dS(N(R>RI(R6R>((s+/usr/lib/python2.7/site-packages/ply/cpp.pytadd_pathsc csQ|jj}g|jD]}|j^q}x~tt|D]j}|d}xW||jdr|t|kr||d |||||j }|sPn|j ||j |jkrd|jkr|Vg}qqW|rM|VndS(Nis\its (R tclonet splitlinestrstriptxrangetlentendswithtjoinR-R RGRHRIRR]R ( R6R-R<txtlinestitjt current_lineRL((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt group_liness,% (      ! cCsd}x6|t|kr>||j|jkr>|d7}q W||4t|d}x0|dkr||j|jkr|d8}qYW||d3|S(Nii(RfRR](R6RKRk((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt tokenstrip's+% c Csg}g}g}d}t|}d}x0||kr\||j|jkr\|d7}q-W||kr||jdkr|j|dn*|j|j|djddggfS|d7}x||kr||}|jdkr|j||d7}n|jdkrx|d8}|dkrh|rW|j|j||j|n|d||fS|j|nX|jdkr|dkr|j|j||j|dg}n |j||d7}qW|j|j|djddggfS( NiiRsMissing '(' in macro argumentsRRTisMissing ')' in macro arguments( RfRR]R RIRQR5R Ro( R6t tokenlisttargst positionst current_argtnestingttokenlenRkR((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt collect_argsCsD %         c Csg|_g|_g|_d}xv|t|jkr|j|j|jkr|j|j|jkr|jj|j|j}|dkr |j|djdkr t j |j||j|<|j |j|_|j|d=|jj ||dfq$q|dkrb|j|djdkrb|jj d||df|j|d=q$q|dt|jkr|j|djdkr|jj d||f|d7}q$q|jj d||fn|j|jdkr|j r|dkr|j|djdkr|dt|jkr|j|dj|jkr|j|dj|j kr|jj |dqn|d7}q$W|jjdd d tdS( NiiRs##R_teRTtkeycSs|dS(Ni((Ri((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR*streverse(tpatcht str_patchtvar_comma_patchRfR RRVR1tindextcopyRZRIR2R3tsortRG(R6tmacroRktargnum((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt macro_prescanxs:   2&&3 /6c Csg|jD]}tj|^q }i}x|jD]\}}||krddjg||D]}|j^qajdd||t}t}qGt}q}q| dkr|r|ddr|ryt}q|s|j|}|rt}t}qqqq}|j|j| djdq| dkr6|r|ddr3|rt}q|st}t}qq3q}|j|j| djdq| dkr|r]|j\}}q}|j|j| djdqqc|rc|j| qcqcWx|j |D] } | VqWg}dS(NRas __FILE__ "%s"Rs iiRCtincludet__FILE__tundeftifdeftifndeftiftelifisMisplaced #eliftelsesMisplaced #elsetendifsMisplaced #endif(R.RnRCR5RGR:RRR]R RIRoRR=RRRRQR tpoptextend(R6R-R5RRjtchunktenablet iftriggertifstackRiRkRLt dirtokensR0RqtoldfileR((s+/usr/lib/python2.7/site-packages/ply/cpp.pytparsegenRs                                 c cs|s dS|r=|djdkrK|dj|jkrK|j|}n|djdkrd}x@|t|kr||jdkrPn|d7}qgWdGHdSdjg|d|!D]}|j^q}|jdg|j}q=|dj|jkr1|djdd!}|jdg|j}q=dGHdSnx|D]}tjj||}y}t |d j }tjj |} | r|jj d| nx|j ||D] } | VqW| r|jd=nPWqDtk rqDXqDWd |GHdS( NiR"iR$sMalformed #include <...>RaisMalformed #include statementRsCouldn't find '%s'(R RRZRRfRhR>R?tostopentreadtdirnametinsertRtIOError( R6RKRkRitfilenameR>tptinametdatatdnameRL((s+/usr/lib/python2.7/site-packages/ply/cpp.pyRsF),    cCskt|ttfr'|j|}n|}y!|d}t|dkrY|d}nd}|st|jg}||j|j s\!                   PK[P-%\ \ site-packages/ply/ctokens.pycnu[ ]Mc4@sdddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3g4Zd4Zd5Zd6Zd7Zd8Zd9Zd:Zd;Zd<Z d=Z d>Z d?Z d@Z dAZdBZdCZdDZdEZdFZdGZdHZdIZdJZdKZdLZdMZdNZdOZdPZdQZdRZdSZ dTZ!dUZ"dVZ#dWZ$dXZ%dYZ&dZZ'd[Z(d\Z)d]Z*d^Z+d_Z,d`Z-daZ.dbZ/dcZ0ddZ1deZ2dfZ3dgZ4dhZ5diS(jtIDtTYPEIDtICONSTtFCONSTtSCONSTtCCONSTtPLUStMINUStTIMEStDIVIDEtMODtORtANDtNOTtXORtLSHIFTtRSHIFTtLORtLANDtLNOTtLTtLEtGTtGEtEQtNEtEQUALSt TIMESEQUALtDIVEQUALtMODEQUALt PLUSEQUALt MINUSEQUALt LSHIFTEQUALt RSHIFTEQUALtANDEQUALtXOREQUALtOREQUALtPLUSPLUSt MINUSMINUStARROWtTERNARYtLPARENtRPARENtLBRACKETtRBRACKETtLBRACEtRBRACEtCOMMAtPERIODtSEMItCOLONtELLIPSISs\+t-s\*t/t%s\|t&t~s\^s<>s\|\|s&&t!ts<=s>=s==s!=t=s\*=s/=s%=s\+=s-=s<<=s>>=s&=s\|=s^=s\+\+s--s->s\?s\(s\)s\[s\]s\{s\}t,s\.t;t:s\.\.\.s[A-Za-z_][A-Za-z0-9_]*s!\d+([uU]|[lL]|[uU][lL]|[lL][uU])?s?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?s\"([^\\\n]|(\\.))*?\"s(L)?\'([^\\\n]|(\\.))*?\'cCs"|jj|jjd7_|S(s/\*(.|\n)*?\*/s (tlexertlinenotvaluetcount(tt((s//usr/lib/python2.7/site-packages/ply/ctokens.pyt t_COMMENTvscCs|jjd7_|S(s//.*\ni(R@RA(RD((s//usr/lib/python2.7/site-packages/ply/ctokens.pyt t_CPPCOMMENT|sN(6ttokenstt_PLUStt_MINUStt_TIMEStt_DIVIDEtt_MODULOtt_ORtt_ANDtt_NOTtt_XORtt_LSHIFTtt_RSHIFTtt_LORtt_LANDtt_LNOTtt_LTtt_GTtt_LEtt_GEtt_EQtt_NEtt_EQUALSt t_TIMESEQUALt t_DIVEQUALt t_MODEQUALt t_PLUSEQUALt t_MINUSEQUALt t_LSHIFTEQUALt t_RSHIFTEQUALt t_ANDEQUALt t_OREQUALt t_XOREQUALt t_INCREMENTt t_DECREMENTtt_ARROWt t_TERNARYtt_LPARENtt_RPARENt t_LBRACKETt t_RBRACKETtt_LBRACEtt_RBRACEtt_COMMAtt_PERIODtt_SEMItt_COLONt t_ELLIPSIStt_IDt t_INTEGERtt_FLOATtt_STRINGt t_CHARACTERRERF(((s//usr/lib/python2.7/site-packages/ply/ctokens.pyt s    PK[޺:H:Hsite-packages/ply/cpp.pycnu[ ]Mc @sddlmZdddddddd d f Zd Zd Zd ZdZdZdZeZ dZ dZ dZ dZ dZddlZddlZddlZddlZejdZi dd6dd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6Zd*Zd+efd,YZd-efd.YZed/krddljZejZddlZe ej!d0Z"e"j#Z$eeZ%e%j&e$ej!d0x/e're%j(Z)e) rPne%j*e)fGHqWndS(1i(t generatorstCPP_IDt CPP_INTEGERt CPP_FLOATt CPP_STRINGtCPP_CHARtCPP_WSt CPP_COMMENTt CPP_POUNDt CPP_DPOUNDs+-*/%|&~^<>=!?()[]{}.,;:\'"cCs"|jj|jjd7_|S(s\s+s (tlexertlinenotvaluetcount(tt((s+/usr/lib/python2.7/site-packages/ply/cpp.pytt_CPP_WSss\#s\#\#s[A-Za-z_][\w_]*cCs|S(sA(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU]|[lL]|[uU][lL]|[lL][uU])?)((R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR$ss?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?cCs"|jj|jjd7_|S(s\"([^\\\n]|(\\(.|\n)))*?\"s (R R R R (R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt t_CPP_STRING.scCs"|jj|jjd7_|S(s(L)?\'([^\\\n]|(\\(.|\n)))*?\'s (R R R R (R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt t_CPP_CHAR4scCs"|jj|jjd7_|S(s(/\*(.|\n)*?\*/)|(//.*?\n)s (R R R R (R((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt t_CPP_COMMENT:scCs4|jd|_|jd|_|jjd|S(Nii(R ttypeR tskip(R((s+/usr/lib/python2.7/site-packages/ply/cpp.pytt_error?sNs\?\?[=/\'\(\)\!<>\-]t#t=s\t/t^t't[t(t]t)t|t!t{tt~t-cCstjd|S(NcSst|jdS(Ni(t _trigraph_reptgroup(tg((s+/usr/lib/python2.7/site-packages/ply/cpp.pytis(t _trigraph_pattsub(tinput((s+/usr/lib/python2.7/site-packages/ply/cpp.pyttrigraphhstMacrocBseZdedZRS(cCsG||_||_||_||_|r:|d|_nd|_dS(Ni(tnameR targlisttvariadictvarargtNonetsource(tselfR0R R1R2((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt__init__|s    N(t__name__t __module__R4tFalseR7(((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR/{st PreprocessorcBseZddZdZdZdZdZdZdZ dZ dZ d Z dd Z d Zdd Zd ZdZdZdidZdZRS(cCs|dkrtj}n||_i|_g|_g|_|jtj}|j dtj d||j dtj d|d|_ dS(Ns __DATE__ "%s"s%b %d %Ys __TIME__ "%s"s%H:%M:%S( R4tlexR tmacrostpatht temp_pathtlexprobettimet localtimetdefinetstrftimetparser(R6R ttm((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR7s        cCsMg}|jj|x0trH|jj}|s8Pn|j|qW|S(N(R R-tTruettokentappend(R6ttextttokensttok((s+/usr/lib/python2.7/site-packages/ply/cpp.pyttokenizes cCsd|||fGHdS(Ns%s:%d %s((R6tfiletlinetmsg((s+/usr/lib/python2.7/site-packages/ply/cpp.pyterrorscCs|jjd|jj}| s5|jdkr=dGHn |j|_|jjd|jj}| st|jdkrdGHn|j|_t|j|_|jjd|jj}| s|jdkrdGHn |j|_ |jjd|jj}| s(|jdkr4d|_ n |j|_ |jjd |jj}| su|jd krd|_ d GHn |j|_ |j |j f|_ d d d ddddddg }xO|D]G}|jj||jj}| s |j|krd|GHqqWdS(Nt identifiers"Couldn't determine identifier typet12345i90sCouldn't determine integer types "filename"sCouldn't determine string types s s%Couldn't determine token for newlinesR"R$Rs##s\RRt,t.s,Unable to lex '%s' required for preprocessor(R R-RHR Rtt_IDtintt t_INTEGERtt_INTEGER_TYPEtt_STRINGR4tt_SPACEt t_NEWLINEtt_WS(R6RLtcharstc((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR@sD       ! cCs|jj|dS(N(R>RI(R6R>((s+/usr/lib/python2.7/site-packages/ply/cpp.pytadd_pathsc csQ|jj}g|jD]}|j^q}x~tt|D]j}|d}xW||jdr|t|kr||d |||||j }|sPn|j ||j |jkrd|jkr|Vg}qqW|rM|VndS(Nis\its (R tclonet splitlinestrstriptxrangetlentendswithtjoinR-R RGRHRIRR]R ( R6R-R<txtlinestitjt current_lineRL((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt group_liness,% (      ! cCsd}x6|t|kr>||j|jkr>|d7}q W||4t|d}x0|dkr||j|jkr|d8}qYW||d3|S(Nii(RfRR](R6RKRk((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt tokenstrip's+% c Csg}g}g}d}t|}d}x0||kr\||j|jkr\|d7}q-W||kr||jdkr|j|dn*|j|j|djddggfS|d7}x||kr||}|jdkr|j||d7}n|jdkrx|d8}|dkrh|rW|j|j||j|n|d||fS|j|nX|jdkr|dkr|j|j||j|dg}n |j||d7}qW|j|j|djddggfS( NiiRsMissing '(' in macro argumentsRRTisMissing ')' in macro arguments( RfRR]R RIRQR5R Ro( R6t tokenlisttargst positionst current_argtnestingttokenlenRkR((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt collect_argsCsD %         c Csg|_g|_g|_d}xv|t|jkr|j|j|jkr|j|j|jkr|jj|j|j}|dkr |j|djdkr t j |j||j|<|j |j|_|j|d=|jj ||dfq$q|dkrb|j|djdkrb|jj d||df|j|d=q$q|dt|jkr|j|djdkr|jj d||f|d7}q$q|jj d||fn|j|jdkr|j r|dkr|j|djdkr|dt|jkr|j|dj|jkr|j|dj|j kr|jj |dqn|d7}q$W|jjdd d tdS( NiiRs##R_teRTtkeycSs|dS(Ni((Ri((s+/usr/lib/python2.7/site-packages/ply/cpp.pyR*streverse(tpatcht str_patchtvar_comma_patchRfR RRVR1tindextcopyRZRIR2R3tsortRG(R6tmacroRktargnum((s+/usr/lib/python2.7/site-packages/ply/cpp.pyt macro_prescanxs:   2&&3 /6c Csg|jD]}tj|^q }i}x|jD]\}}||krddjg||D]}|j^qajdd||t}t}qGt}q}q| dkr|r|ddr|ryt}q|s|j|}|rt}t}qqqq}|j|j| djdq| dkr6|r|ddr3|rt}q|st}t}qq3q}|j|j| djdq| dkr|r]|j\}}q}|j|j| djdqqc|rc|j| qcqcWx|j |D] } | VqWg}dS(NRas __FILE__ "%s"Rs iiRCtincludet__FILE__tundeftifdeftifndeftiftelifisMisplaced #eliftelsesMisplaced #elsetendifsMisplaced #endif(R.RnRCR5RGR:RRR]R RIRoRR=RRRRQR tpoptextend(R6R-R5RRjtchunktenablet iftriggertifstackRiRkRLt dirtokensR0RqtoldfileR((s+/usr/lib/python2.7/site-packages/ply/cpp.pytparsegenRs                                 c cs|s dS|r=|djdkrK|dj|jkrK|j|}n|djdkrd}x@|t|kr||jdkrPn|d7}qgWdGHdSdjg|d|!D]}|j^q}|jdg|j}q=|dj|jkr1|djdd!}|jdg|j}q=dGHdSnx|D]}tjj||}y}t |d j }tjj |} | r|jj d| nx|j ||D] } | VqW| r|jd=nPWqDtk rqDXqDWd |GHdS( NiR"iR$sMalformed #include <...>RaisMalformed #include statementRsCouldn't find '%s'(R RRZRRfRhR>R?tostopentreadtdirnametinsertRtIOError( R6RKRkRitfilenameR>tptinametdatatdnameRL((s+/usr/lib/python2.7/site-packages/ply/cpp.pyRsF),    cCskt|ttfr'|j|}n|}y!|d}t|dkrY|d}nd}|st|jg}||j|j s\!                   PK[|site-packages/ply/cpp.pynu[# ----------------------------------------------------------------------------- # cpp.py # # Author: David Beazley (http://www.dabeaz.com) # Copyright (C) 2007 # All rights reserved # # This module implements an ANSI-C style lexical preprocessor for PLY. # ----------------------------------------------------------------------------- from __future__ import generators # ----------------------------------------------------------------------------- # Default preprocessor lexer definitions. These tokens are enough to get # a basic preprocessor working. Other modules may import these if they want # ----------------------------------------------------------------------------- tokens = ( 'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT', 'CPP_POUND','CPP_DPOUND' ) literals = "+-*/%|&~^<>=!?()[]{}.,;:\\\'\"" # Whitespace def t_CPP_WS(t): r'\s+' t.lexer.lineno += t.value.count("\n") return t t_CPP_POUND = r'\#' t_CPP_DPOUND = r'\#\#' # Identifier t_CPP_ID = r'[A-Za-z_][\w_]*' # Integer literal def CPP_INTEGER(t): r'(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU]|[lL]|[uU][lL]|[lL][uU])?)' return t t_CPP_INTEGER = CPP_INTEGER # Floating literal t_CPP_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?' # String literal def t_CPP_STRING(t): r'\"([^\\\n]|(\\(.|\n)))*?\"' t.lexer.lineno += t.value.count("\n") return t # Character constant 'c' or L'c' def t_CPP_CHAR(t): r'(L)?\'([^\\\n]|(\\(.|\n)))*?\'' t.lexer.lineno += t.value.count("\n") return t # Comment def t_CPP_COMMENT(t): r'(/\*(.|\n)*?\*/)|(//.*?\n)' t.lexer.lineno += t.value.count("\n") return t def t_error(t): t.type = t.value[0] t.value = t.value[0] t.lexer.skip(1) return t import re import copy import time import os.path # ----------------------------------------------------------------------------- # trigraph() # # Given an input string, this function replaces all trigraph sequences. # The following mapping is used: # # ??= # # ??/ \ # ??' ^ # ??( [ # ??) ] # ??! | # ??< { # ??> } # ??- ~ # ----------------------------------------------------------------------------- _trigraph_pat = re.compile(r'''\?\?[=/\'\(\)\!<>\-]''') _trigraph_rep = { '=':'#', '/':'\\', "'":'^', '(':'[', ')':']', '!':'|', '<':'{', '>':'}', '-':'~' } def trigraph(input): return _trigraph_pat.sub(lambda g: _trigraph_rep[g.group()[-1]],input) # ------------------------------------------------------------------ # Macro object # # This object holds information about preprocessor macros # # .name - Macro name (string) # .value - Macro value (a list of tokens) # .arglist - List of argument names # .variadic - Boolean indicating whether or not variadic macro # .vararg - Name of the variadic parameter # # When a macro is created, the macro replacement token sequence is # pre-scanned and used to create patch lists that are later used # during macro expansion # ------------------------------------------------------------------ class Macro(object): def __init__(self,name,value,arglist=None,variadic=False): self.name = name self.value = value self.arglist = arglist self.variadic = variadic if variadic: self.vararg = arglist[-1] self.source = None # ------------------------------------------------------------------ # Preprocessor object # # Object representing a preprocessor. Contains macro definitions, # include directories, and other information # ------------------------------------------------------------------ class Preprocessor(object): def __init__(self,lexer=None): if lexer is None: lexer = lex.lexer self.lexer = lexer self.macros = { } self.path = [] self.temp_path = [] # Probe the lexer for selected tokens self.lexprobe() tm = time.localtime() self.define("__DATE__ \"%s\"" % time.strftime("%b %d %Y",tm)) self.define("__TIME__ \"%s\"" % time.strftime("%H:%M:%S",tm)) self.parser = None # ----------------------------------------------------------------------------- # tokenize() # # Utility function. Given a string of text, tokenize into a list of tokens # ----------------------------------------------------------------------------- def tokenize(self,text): tokens = [] self.lexer.input(text) while True: tok = self.lexer.token() if not tok: break tokens.append(tok) return tokens # --------------------------------------------------------------------- # error() # # Report a preprocessor error/warning of some kind # ---------------------------------------------------------------------- def error(self,file,line,msg): print("%s:%d %s" % (file,line,msg)) # ---------------------------------------------------------------------- # lexprobe() # # This method probes the preprocessor lexer object to discover # the token types of symbols that are important to the preprocessor. # If this works right, the preprocessor will simply "work" # with any suitable lexer regardless of how tokens have been named. # ---------------------------------------------------------------------- def lexprobe(self): # Determine the token type for identifiers self.lexer.input("identifier") tok = self.lexer.token() if not tok or tok.value != "identifier": print("Couldn't determine identifier type") else: self.t_ID = tok.type # Determine the token type for integers self.lexer.input("12345") tok = self.lexer.token() if not tok or int(tok.value) != 12345: print("Couldn't determine integer type") else: self.t_INTEGER = tok.type self.t_INTEGER_TYPE = type(tok.value) # Determine the token type for strings enclosed in double quotes self.lexer.input("\"filename\"") tok = self.lexer.token() if not tok or tok.value != "\"filename\"": print("Couldn't determine string type") else: self.t_STRING = tok.type # Determine the token type for whitespace--if any self.lexer.input(" ") tok = self.lexer.token() if not tok or tok.value != " ": self.t_SPACE = None else: self.t_SPACE = tok.type # Determine the token type for newlines self.lexer.input("\n") tok = self.lexer.token() if not tok or tok.value != "\n": self.t_NEWLINE = None print("Couldn't determine token for newlines") else: self.t_NEWLINE = tok.type self.t_WS = (self.t_SPACE, self.t_NEWLINE) # Check for other characters used by the preprocessor chars = [ '<','>','#','##','\\','(',')',',','.'] for c in chars: self.lexer.input(c) tok = self.lexer.token() if not tok or tok.value != c: print("Unable to lex '%s' required for preprocessor" % c) # ---------------------------------------------------------------------- # add_path() # # Adds a search path to the preprocessor. # ---------------------------------------------------------------------- def add_path(self,path): self.path.append(path) # ---------------------------------------------------------------------- # group_lines() # # Given an input string, this function splits it into lines. Trailing whitespace # is removed. Any line ending with \ is grouped with the next line. This # function forms the lowest level of the preprocessor---grouping into text into # a line-by-line format. # ---------------------------------------------------------------------- def group_lines(self,input): lex = self.lexer.clone() lines = [x.rstrip() for x in input.splitlines()] for i in xrange(len(lines)): j = i+1 while lines[i].endswith('\\') and (j < len(lines)): lines[i] = lines[i][:-1]+lines[j] lines[j] = "" j += 1 input = "\n".join(lines) lex.input(input) lex.lineno = 1 current_line = [] while True: tok = lex.token() if not tok: break current_line.append(tok) if tok.type in self.t_WS and '\n' in tok.value: yield current_line current_line = [] if current_line: yield current_line # ---------------------------------------------------------------------- # tokenstrip() # # Remove leading/trailing whitespace tokens from a token list # ---------------------------------------------------------------------- def tokenstrip(self,tokens): i = 0 while i < len(tokens) and tokens[i].type in self.t_WS: i += 1 del tokens[:i] i = len(tokens)-1 while i >= 0 and tokens[i].type in self.t_WS: i -= 1 del tokens[i+1:] return tokens # ---------------------------------------------------------------------- # collect_args() # # Collects comma separated arguments from a list of tokens. The arguments # must be enclosed in parenthesis. Returns a tuple (tokencount,args,positions) # where tokencount is the number of tokens consumed, args is a list of arguments, # and positions is a list of integers containing the starting index of each # argument. Each argument is represented by a list of tokens. # # When collecting arguments, leading and trailing whitespace is removed # from each argument. # # This function properly handles nested parenthesis and commas---these do not # define new arguments. # ---------------------------------------------------------------------- def collect_args(self,tokenlist): args = [] positions = [] current_arg = [] nesting = 1 tokenlen = len(tokenlist) # Search for the opening '('. i = 0 while (i < tokenlen) and (tokenlist[i].type in self.t_WS): i += 1 if (i < tokenlen) and (tokenlist[i].value == '('): positions.append(i+1) else: self.error(self.source,tokenlist[0].lineno,"Missing '(' in macro arguments") return 0, [], [] i += 1 while i < tokenlen: t = tokenlist[i] if t.value == '(': current_arg.append(t) nesting += 1 elif t.value == ')': nesting -= 1 if nesting == 0: if current_arg: args.append(self.tokenstrip(current_arg)) positions.append(i) return i+1,args,positions current_arg.append(t) elif t.value == ',' and nesting == 1: args.append(self.tokenstrip(current_arg)) positions.append(i+1) current_arg = [] else: current_arg.append(t) i += 1 # Missing end argument self.error(self.source,tokenlist[-1].lineno,"Missing ')' in macro arguments") return 0, [],[] # ---------------------------------------------------------------------- # macro_prescan() # # Examine the macro value (token sequence) and identify patch points # This is used to speed up macro expansion later on---we'll know # right away where to apply patches to the value to form the expansion # ---------------------------------------------------------------------- def macro_prescan(self,macro): macro.patch = [] # Standard macro arguments macro.str_patch = [] # String conversion expansion macro.var_comma_patch = [] # Variadic macro comma patch i = 0 while i < len(macro.value): if macro.value[i].type == self.t_ID and macro.value[i].value in macro.arglist: argnum = macro.arglist.index(macro.value[i].value) # Conversion of argument to a string if i > 0 and macro.value[i-1].value == '#': macro.value[i] = copy.copy(macro.value[i]) macro.value[i].type = self.t_STRING del macro.value[i-1] macro.str_patch.append((argnum,i-1)) continue # Concatenation elif (i > 0 and macro.value[i-1].value == '##'): macro.patch.append(('c',argnum,i-1)) del macro.value[i-1] continue elif ((i+1) < len(macro.value) and macro.value[i+1].value == '##'): macro.patch.append(('c',argnum,i)) i += 1 continue # Standard expansion else: macro.patch.append(('e',argnum,i)) elif macro.value[i].value == '##': if macro.variadic and (i > 0) and (macro.value[i-1].value == ',') and \ ((i+1) < len(macro.value)) and (macro.value[i+1].type == self.t_ID) and \ (macro.value[i+1].value == macro.vararg): macro.var_comma_patch.append(i-1) i += 1 macro.patch.sort(key=lambda x: x[2],reverse=True) # ---------------------------------------------------------------------- # macro_expand_args() # # Given a Macro and list of arguments (each a token list), this method # returns an expanded version of a macro. The return value is a token sequence # representing the replacement macro tokens # ---------------------------------------------------------------------- def macro_expand_args(self,macro,args): # Make a copy of the macro token sequence rep = [copy.copy(_x) for _x in macro.value] # Make string expansion patches. These do not alter the length of the replacement sequence str_expansion = {} for argnum, i in macro.str_patch: if argnum not in str_expansion: str_expansion[argnum] = ('"%s"' % "".join([x.value for x in args[argnum]])).replace("\\","\\\\") rep[i] = copy.copy(rep[i]) rep[i].value = str_expansion[argnum] # Make the variadic macro comma patch. If the variadic macro argument is empty, we get rid comma_patch = False if macro.variadic and not args[-1]: for i in macro.var_comma_patch: rep[i] = None comma_patch = True # Make all other patches. The order of these matters. It is assumed that the patch list # has been sorted in reverse order of patch location since replacements will cause the # size of the replacement sequence to expand from the patch point. expanded = { } for ptype, argnum, i in macro.patch: # Concatenation. Argument is left unexpanded if ptype == 'c': rep[i:i+1] = args[argnum] # Normal expansion. Argument is macro expanded first elif ptype == 'e': if argnum not in expanded: expanded[argnum] = self.expand_macros(args[argnum]) rep[i:i+1] = expanded[argnum] # Get rid of removed comma if necessary if comma_patch: rep = [_i for _i in rep if _i] return rep # ---------------------------------------------------------------------- # expand_macros() # # Given a list of tokens, this function performs macro expansion. # The expanded argument is a dictionary that contains macros already # expanded. This is used to prevent infinite recursion. # ---------------------------------------------------------------------- def expand_macros(self,tokens,expanded=None): if expanded is None: expanded = {} i = 0 while i < len(tokens): t = tokens[i] if t.type == self.t_ID: if t.value in self.macros and t.value not in expanded: # Yes, we found a macro match expanded[t.value] = True m = self.macros[t.value] if not m.arglist: # A simple macro ex = self.expand_macros([copy.copy(_x) for _x in m.value],expanded) for e in ex: e.lineno = t.lineno tokens[i:i+1] = ex i += len(ex) else: # A macro with arguments j = i + 1 while j < len(tokens) and tokens[j].type in self.t_WS: j += 1 if tokens[j].value == '(': tokcount,args,positions = self.collect_args(tokens[j:]) if not m.variadic and len(args) != len(m.arglist): self.error(self.source,t.lineno,"Macro %s requires %d arguments" % (t.value,len(m.arglist))) i = j + tokcount elif m.variadic and len(args) < len(m.arglist)-1: if len(m.arglist) > 2: self.error(self.source,t.lineno,"Macro %s must have at least %d arguments" % (t.value, len(m.arglist)-1)) else: self.error(self.source,t.lineno,"Macro %s must have at least %d argument" % (t.value, len(m.arglist)-1)) i = j + tokcount else: if m.variadic: if len(args) == len(m.arglist)-1: args.append([]) else: args[len(m.arglist)-1] = tokens[j+positions[len(m.arglist)-1]:j+tokcount-1] del args[len(m.arglist):] # Get macro replacement text rep = self.macro_expand_args(m,args) rep = self.expand_macros(rep,expanded) for r in rep: r.lineno = t.lineno tokens[i:j+tokcount] = rep i += len(rep) del expanded[t.value] continue elif t.value == '__LINE__': t.type = self.t_INTEGER t.value = self.t_INTEGER_TYPE(t.lineno) i += 1 return tokens # ---------------------------------------------------------------------- # evalexpr() # # Evaluate an expression token sequence for the purposes of evaluating # integral expressions. # ---------------------------------------------------------------------- def evalexpr(self,tokens): # tokens = tokenize(line) # Search for defined macros i = 0 while i < len(tokens): if tokens[i].type == self.t_ID and tokens[i].value == 'defined': j = i + 1 needparen = False result = "0L" while j < len(tokens): if tokens[j].type in self.t_WS: j += 1 continue elif tokens[j].type == self.t_ID: if tokens[j].value in self.macros: result = "1L" else: result = "0L" if not needparen: break elif tokens[j].value == '(': needparen = True elif tokens[j].value == ')': break else: self.error(self.source,tokens[i].lineno,"Malformed defined()") j += 1 tokens[i].type = self.t_INTEGER tokens[i].value = self.t_INTEGER_TYPE(result) del tokens[i+1:j+1] i += 1 tokens = self.expand_macros(tokens) for i,t in enumerate(tokens): if t.type == self.t_ID: tokens[i] = copy.copy(t) tokens[i].type = self.t_INTEGER tokens[i].value = self.t_INTEGER_TYPE("0L") elif t.type == self.t_INTEGER: tokens[i] = copy.copy(t) # Strip off any trailing suffixes tokens[i].value = str(tokens[i].value) while tokens[i].value[-1] not in "0123456789abcdefABCDEF": tokens[i].value = tokens[i].value[:-1] expr = "".join([str(x.value) for x in tokens]) expr = expr.replace("&&"," and ") expr = expr.replace("||"," or ") expr = expr.replace("!"," not ") try: result = eval(expr) except StandardError: self.error(self.source,tokens[0].lineno,"Couldn't evaluate expression") result = 0 return result # ---------------------------------------------------------------------- # parsegen() # # Parse an input string/ # ---------------------------------------------------------------------- def parsegen(self,input,source=None): # Replace trigraph sequences t = trigraph(input) lines = self.group_lines(t) if not source: source = "" self.define("__FILE__ \"%s\"" % source) self.source = source chunk = [] enable = True iftrigger = False ifstack = [] for x in lines: for i,tok in enumerate(x): if tok.type not in self.t_WS: break if tok.value == '#': # Preprocessor directive for tok in x: if tok in self.t_WS and '\n' in tok.value: chunk.append(tok) dirtokens = self.tokenstrip(x[i+1:]) if dirtokens: name = dirtokens[0].value args = self.tokenstrip(dirtokens[1:]) else: name = "" args = [] if name == 'define': if enable: for tok in self.expand_macros(chunk): yield tok chunk = [] self.define(args) elif name == 'include': if enable: for tok in self.expand_macros(chunk): yield tok chunk = [] oldfile = self.macros['__FILE__'] for tok in self.include(args): yield tok self.macros['__FILE__'] = oldfile self.source = source elif name == 'undef': if enable: for tok in self.expand_macros(chunk): yield tok chunk = [] self.undef(args) elif name == 'ifdef': ifstack.append((enable,iftrigger)) if enable: if not args[0].value in self.macros: enable = False iftrigger = False else: iftrigger = True elif name == 'ifndef': ifstack.append((enable,iftrigger)) if enable: if args[0].value in self.macros: enable = False iftrigger = False else: iftrigger = True elif name == 'if': ifstack.append((enable,iftrigger)) if enable: result = self.evalexpr(args) if not result: enable = False iftrigger = False else: iftrigger = True elif name == 'elif': if ifstack: if ifstack[-1][0]: # We only pay attention if outer "if" allows this if enable: # If already true, we flip enable False enable = False elif not iftrigger: # If False, but not triggered yet, we'll check expression result = self.evalexpr(args) if result: enable = True iftrigger = True else: self.error(self.source,dirtokens[0].lineno,"Misplaced #elif") elif name == 'else': if ifstack: if ifstack[-1][0]: if enable: enable = False elif not iftrigger: enable = True iftrigger = True else: self.error(self.source,dirtokens[0].lineno,"Misplaced #else") elif name == 'endif': if ifstack: enable,iftrigger = ifstack.pop() else: self.error(self.source,dirtokens[0].lineno,"Misplaced #endif") else: # Unknown preprocessor directive pass else: # Normal text if enable: chunk.extend(x) for tok in self.expand_macros(chunk): yield tok chunk = [] # ---------------------------------------------------------------------- # include() # # Implementation of file-inclusion # ---------------------------------------------------------------------- def include(self,tokens): # Try to extract the filename and then process an include file if not tokens: return if tokens: if tokens[0].value != '<' and tokens[0].type != self.t_STRING: tokens = self.expand_macros(tokens) if tokens[0].value == '<': # Include <...> i = 1 while i < len(tokens): if tokens[i].value == '>': break i += 1 else: print("Malformed #include <...>") return filename = "".join([x.value for x in tokens[1:i]]) path = self.path + [""] + self.temp_path elif tokens[0].type == self.t_STRING: filename = tokens[0].value[1:-1] path = self.temp_path + [""] + self.path else: print("Malformed #include statement") return for p in path: iname = os.path.join(p,filename) try: data = open(iname,"r").read() dname = os.path.dirname(iname) if dname: self.temp_path.insert(0,dname) for tok in self.parsegen(data,filename): yield tok if dname: del self.temp_path[0] break except IOError: pass else: print("Couldn't find '%s'" % filename) # ---------------------------------------------------------------------- # define() # # Define a new macro # ---------------------------------------------------------------------- def define(self,tokens): if isinstance(tokens,(str,unicode)): tokens = self.tokenize(tokens) linetok = tokens try: name = linetok[0] if len(linetok) > 1: mtype = linetok[1] else: mtype = None if not mtype: m = Macro(name.value,[]) self.macros[name.value] = m elif mtype.type in self.t_WS: # A normal macro m = Macro(name.value,self.tokenstrip(linetok[2:])) self.macros[name.value] = m elif mtype.value == '(': # A macro with arguments tokcount, args, positions = self.collect_args(linetok[1:]) variadic = False for a in args: if variadic: print("No more arguments may follow a variadic argument") break astr = "".join([str(_i.value) for _i in a]) if astr == "...": variadic = True a[0].type = self.t_ID a[0].value = '__VA_ARGS__' variadic = True del a[1:] continue elif astr[-3:] == "..." and a[0].type == self.t_ID: variadic = True del a[1:] # If, for some reason, "." is part of the identifier, strip off the name for the purposes # of macro expansion if a[0].value[-3:] == '...': a[0].value = a[0].value[:-3] continue if len(a) > 1 or a[0].type != self.t_ID: print("Invalid macro argument") break else: mvalue = self.tokenstrip(linetok[1+tokcount:]) i = 0 while i < len(mvalue): if i+1 < len(mvalue): if mvalue[i].type in self.t_WS and mvalue[i+1].value == '##': del mvalue[i] continue elif mvalue[i].value == '##' and mvalue[i+1].type in self.t_WS: del mvalue[i+1] i += 1 m = Macro(name.value,mvalue,[x[0].value for x in args],variadic) self.macro_prescan(m) self.macros[name.value] = m else: print("Bad macro definition") except LookupError: print("Bad macro definition") # ---------------------------------------------------------------------- # undef() # # Undefine a macro # ---------------------------------------------------------------------- def undef(self,tokens): id = tokens[0].value try: del self.macros[id] except LookupError: pass # ---------------------------------------------------------------------- # parse() # # Parse input text. # ---------------------------------------------------------------------- def parse(self,input,source=None,ignore={}): self.ignore = ignore self.parser = self.parsegen(input,source) # ---------------------------------------------------------------------- # token() # # Method to return individual tokens # ---------------------------------------------------------------------- def token(self): try: while True: tok = next(self.parser) if tok.type not in self.ignore: return tok except StopIteration: self.parser = None return None if __name__ == '__main__': import ply.lex as lex lexer = lex.lex() # Run a preprocessor import sys f = open(sys.argv[1]) input = f.read() p = Preprocessor(lexer) p.parse(input,sys.argv[1]) while True: tok = p.token() if not tok: break print(p.source, tok) PK[biNsssite-packages/six.pynu["""Utilities for writing code that runs on Python 2 and 3""" # Copyright (c) 2010-2015 Benjamin Peterson # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. from __future__ import absolute_import import functools import itertools import operator import sys import types __author__ = "Benjamin Peterson " __version__ = "1.9.0" # Useful for very coarse version differentiation. PY2 = sys.version_info[0] == 2 PY3 = sys.version_info[0] == 3 if PY3: string_types = str, integer_types = int, class_types = type, text_type = str binary_type = bytes MAXSIZE = sys.maxsize else: string_types = basestring, integer_types = (int, long) class_types = (type, types.ClassType) text_type = unicode binary_type = str if sys.platform.startswith("java"): # Jython always uses 32 bits. MAXSIZE = int((1 << 31) - 1) else: # It's possible to have sizeof(long) != sizeof(Py_ssize_t). class X(object): def __len__(self): return 1 << 31 try: len(X()) except OverflowError: # 32-bit MAXSIZE = int((1 << 31) - 1) else: # 64-bit MAXSIZE = int((1 << 63) - 1) del X def _add_doc(func, doc): """Add documentation to a function.""" func.__doc__ = doc def _import_module(name): """Import module, returning the module after the last dot.""" __import__(name) return sys.modules[name] class _LazyDescr(object): def __init__(self, name): self.name = name def __get__(self, obj, tp): result = self._resolve() setattr(obj, self.name, result) # Invokes __set__. try: # This is a bit ugly, but it avoids running this again by # removing this descriptor. delattr(obj.__class__, self.name) except AttributeError: pass return result class MovedModule(_LazyDescr): def __init__(self, name, old, new=None): super(MovedModule, self).__init__(name) if PY3: if new is None: new = name self.mod = new else: self.mod = old def _resolve(self): return _import_module(self.mod) def __getattr__(self, attr): _module = self._resolve() value = getattr(_module, attr) setattr(self, attr, value) return value class _LazyModule(types.ModuleType): def __init__(self, name): super(_LazyModule, self).__init__(name) self.__doc__ = self.__class__.__doc__ def __dir__(self): attrs = ["__doc__", "__name__"] attrs += [attr.name for attr in self._moved_attributes] return attrs # Subclasses should override this _moved_attributes = [] class MovedAttribute(_LazyDescr): def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None): super(MovedAttribute, self).__init__(name) if PY3: if new_mod is None: new_mod = name self.mod = new_mod if new_attr is None: if old_attr is None: new_attr = name else: new_attr = old_attr self.attr = new_attr else: self.mod = old_mod if old_attr is None: old_attr = name self.attr = old_attr def _resolve(self): module = _import_module(self.mod) return getattr(module, self.attr) class _SixMetaPathImporter(object): """ A meta path importer to import six.moves and its submodules. This class implements a PEP302 finder and loader. It should be compatible with Python 2.5 and all existing versions of Python3 """ def __init__(self, six_module_name): self.name = six_module_name self.known_modules = {} def _add_module(self, mod, *fullnames): for fullname in fullnames: self.known_modules[self.name + "." + fullname] = mod def _get_module(self, fullname): return self.known_modules[self.name + "." + fullname] def find_module(self, fullname, path=None): if fullname in self.known_modules: return self return None def __get_module(self, fullname): try: return self.known_modules[fullname] except KeyError: raise ImportError("This loader does not know module " + fullname) def load_module(self, fullname): try: # in case of a reload return sys.modules[fullname] except KeyError: pass mod = self.__get_module(fullname) if isinstance(mod, MovedModule): mod = mod._resolve() else: mod.__loader__ = self sys.modules[fullname] = mod return mod def is_package(self, fullname): """ Return true, if the named module is a package. We need this method to get correct spec objects with Python 3.4 (see PEP451) """ return hasattr(self.__get_module(fullname), "__path__") def get_code(self, fullname): """Return None Required, if is_package is implemented""" self.__get_module(fullname) # eventually raises ImportError return None get_source = get_code # same as get_code _importer = _SixMetaPathImporter(__name__) class _MovedItems(_LazyModule): """Lazy loading of moved objects""" __path__ = [] # mark as package _moved_attributes = [ MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"), MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"), MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"), MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"), MovedAttribute("intern", "__builtin__", "sys"), MovedAttribute("map", "itertools", "builtins", "imap", "map"), MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("reload_module", "__builtin__", "imp", "reload"), MovedAttribute("reduce", "__builtin__", "functools"), MovedAttribute("shlex_quote", "pipes", "shlex", "quote"), MovedAttribute("StringIO", "StringIO", "io"), MovedAttribute("UserDict", "UserDict", "collections"), MovedAttribute("UserList", "UserList", "collections"), MovedAttribute("UserString", "UserString", "collections"), MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"), MovedAttribute("zip", "itertools", "builtins", "izip", "zip"), MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"), MovedModule("builtins", "__builtin__"), MovedModule("configparser", "ConfigParser"), MovedModule("copyreg", "copy_reg"), MovedModule("dbm_gnu", "gdbm", "dbm.gnu"), MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"), MovedModule("http_cookiejar", "cookielib", "http.cookiejar"), MovedModule("http_cookies", "Cookie", "http.cookies"), MovedModule("html_entities", "htmlentitydefs", "html.entities"), MovedModule("html_parser", "HTMLParser", "html.parser"), MovedModule("http_client", "httplib", "http.client"), MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"), MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"), MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"), MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"), MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"), MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"), MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"), MovedModule("cPickle", "cPickle", "pickle"), MovedModule("queue", "Queue"), MovedModule("reprlib", "repr"), MovedModule("socketserver", "SocketServer"), MovedModule("_thread", "thread", "_thread"), MovedModule("tkinter", "Tkinter"), MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"), MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"), MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"), MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"), MovedModule("tkinter_tix", "Tix", "tkinter.tix"), MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"), MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"), MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"), MovedModule("tkinter_colorchooser", "tkColorChooser", "tkinter.colorchooser"), MovedModule("tkinter_commondialog", "tkCommonDialog", "tkinter.commondialog"), MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"), MovedModule("tkinter_font", "tkFont", "tkinter.font"), MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"), MovedModule("tkinter_tksimpledialog", "tkSimpleDialog", "tkinter.simpledialog"), MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"), MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"), MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"), MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"), MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"), MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"), MovedModule("winreg", "_winreg"), ] for attr in _moved_attributes: setattr(_MovedItems, attr.name, attr) if isinstance(attr, MovedModule): _importer._add_module(attr, "moves." + attr.name) del attr _MovedItems._moved_attributes = _moved_attributes moves = _MovedItems(__name__ + ".moves") _importer._add_module(moves, "moves") class Module_six_moves_urllib_parse(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_parse""" _urllib_parse_moved_attributes = [ MovedAttribute("ParseResult", "urlparse", "urllib.parse"), MovedAttribute("SplitResult", "urlparse", "urllib.parse"), MovedAttribute("parse_qs", "urlparse", "urllib.parse"), MovedAttribute("parse_qsl", "urlparse", "urllib.parse"), MovedAttribute("urldefrag", "urlparse", "urllib.parse"), MovedAttribute("urljoin", "urlparse", "urllib.parse"), MovedAttribute("urlparse", "urlparse", "urllib.parse"), MovedAttribute("urlsplit", "urlparse", "urllib.parse"), MovedAttribute("urlunparse", "urlparse", "urllib.parse"), MovedAttribute("urlunsplit", "urlparse", "urllib.parse"), MovedAttribute("quote", "urllib", "urllib.parse"), MovedAttribute("quote_plus", "urllib", "urllib.parse"), MovedAttribute("unquote", "urllib", "urllib.parse"), MovedAttribute("unquote_plus", "urllib", "urllib.parse"), MovedAttribute("urlencode", "urllib", "urllib.parse"), MovedAttribute("splitquery", "urllib", "urllib.parse"), MovedAttribute("splittag", "urllib", "urllib.parse"), MovedAttribute("splituser", "urllib", "urllib.parse"), MovedAttribute("uses_fragment", "urlparse", "urllib.parse"), MovedAttribute("uses_netloc", "urlparse", "urllib.parse"), MovedAttribute("uses_params", "urlparse", "urllib.parse"), MovedAttribute("uses_query", "urlparse", "urllib.parse"), MovedAttribute("uses_relative", "urlparse", "urllib.parse"), ] for attr in _urllib_parse_moved_attributes: setattr(Module_six_moves_urllib_parse, attr.name, attr) del attr Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes _importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"), "moves.urllib_parse", "moves.urllib.parse") class Module_six_moves_urllib_error(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_error""" _urllib_error_moved_attributes = [ MovedAttribute("URLError", "urllib2", "urllib.error"), MovedAttribute("HTTPError", "urllib2", "urllib.error"), MovedAttribute("ContentTooShortError", "urllib", "urllib.error"), ] for attr in _urllib_error_moved_attributes: setattr(Module_six_moves_urllib_error, attr.name, attr) del attr Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes _importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"), "moves.urllib_error", "moves.urllib.error") class Module_six_moves_urllib_request(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_request""" _urllib_request_moved_attributes = [ MovedAttribute("urlopen", "urllib2", "urllib.request"), MovedAttribute("install_opener", "urllib2", "urllib.request"), MovedAttribute("build_opener", "urllib2", "urllib.request"), MovedAttribute("pathname2url", "urllib", "urllib.request"), MovedAttribute("url2pathname", "urllib", "urllib.request"), MovedAttribute("getproxies", "urllib", "urllib.request"), MovedAttribute("Request", "urllib2", "urllib.request"), MovedAttribute("OpenerDirector", "urllib2", "urllib.request"), MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"), MovedAttribute("ProxyHandler", "urllib2", "urllib.request"), MovedAttribute("BaseHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"), MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"), MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"), MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"), MovedAttribute("FileHandler", "urllib2", "urllib.request"), MovedAttribute("FTPHandler", "urllib2", "urllib.request"), MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"), MovedAttribute("UnknownHandler", "urllib2", "urllib.request"), MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"), MovedAttribute("urlretrieve", "urllib", "urllib.request"), MovedAttribute("urlcleanup", "urllib", "urllib.request"), MovedAttribute("URLopener", "urllib", "urllib.request"), MovedAttribute("FancyURLopener", "urllib", "urllib.request"), MovedAttribute("proxy_bypass", "urllib", "urllib.request"), ] for attr in _urllib_request_moved_attributes: setattr(Module_six_moves_urllib_request, attr.name, attr) del attr Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes _importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"), "moves.urllib_request", "moves.urllib.request") class Module_six_moves_urllib_response(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_response""" _urllib_response_moved_attributes = [ MovedAttribute("addbase", "urllib", "urllib.response"), MovedAttribute("addclosehook", "urllib", "urllib.response"), MovedAttribute("addinfo", "urllib", "urllib.response"), MovedAttribute("addinfourl", "urllib", "urllib.response"), ] for attr in _urllib_response_moved_attributes: setattr(Module_six_moves_urllib_response, attr.name, attr) del attr Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes _importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"), "moves.urllib_response", "moves.urllib.response") class Module_six_moves_urllib_robotparser(_LazyModule): """Lazy loading of moved objects in six.moves.urllib_robotparser""" _urllib_robotparser_moved_attributes = [ MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"), ] for attr in _urllib_robotparser_moved_attributes: setattr(Module_six_moves_urllib_robotparser, attr.name, attr) del attr Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes _importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"), "moves.urllib_robotparser", "moves.urllib.robotparser") class Module_six_moves_urllib(types.ModuleType): """Create a six.moves.urllib namespace that resembles the Python 3 namespace""" __path__ = [] # mark as package parse = _importer._get_module("moves.urllib_parse") error = _importer._get_module("moves.urllib_error") request = _importer._get_module("moves.urllib_request") response = _importer._get_module("moves.urllib_response") robotparser = _importer._get_module("moves.urllib_robotparser") def __dir__(self): return ['parse', 'error', 'request', 'response', 'robotparser'] _importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"), "moves.urllib") def add_move(move): """Add an item to six.moves.""" setattr(_MovedItems, move.name, move) def remove_move(name): """Remove item from six.moves.""" try: delattr(_MovedItems, name) except AttributeError: try: del moves.__dict__[name] except KeyError: raise AttributeError("no such move, %r" % (name,)) if PY3: _meth_func = "__func__" _meth_self = "__self__" _func_closure = "__closure__" _func_code = "__code__" _func_defaults = "__defaults__" _func_globals = "__globals__" else: _meth_func = "im_func" _meth_self = "im_self" _func_closure = "func_closure" _func_code = "func_code" _func_defaults = "func_defaults" _func_globals = "func_globals" try: advance_iterator = next except NameError: def advance_iterator(it): return it.next() next = advance_iterator try: callable = callable except NameError: def callable(obj): return any("__call__" in klass.__dict__ for klass in type(obj).__mro__) if PY3: def get_unbound_function(unbound): return unbound create_bound_method = types.MethodType Iterator = object else: def get_unbound_function(unbound): return unbound.im_func def create_bound_method(func, obj): return types.MethodType(func, obj, obj.__class__) class Iterator(object): def next(self): return type(self).__next__(self) callable = callable _add_doc(get_unbound_function, """Get the function out of a possibly unbound function""") get_method_function = operator.attrgetter(_meth_func) get_method_self = operator.attrgetter(_meth_self) get_function_closure = operator.attrgetter(_func_closure) get_function_code = operator.attrgetter(_func_code) get_function_defaults = operator.attrgetter(_func_defaults) get_function_globals = operator.attrgetter(_func_globals) if PY3: def iterkeys(d, **kw): return iter(d.keys(**kw)) def itervalues(d, **kw): return iter(d.values(**kw)) def iteritems(d, **kw): return iter(d.items(**kw)) def iterlists(d, **kw): return iter(d.lists(**kw)) viewkeys = operator.methodcaller("keys") viewvalues = operator.methodcaller("values") viewitems = operator.methodcaller("items") else: def iterkeys(d, **kw): return iter(d.iterkeys(**kw)) def itervalues(d, **kw): return iter(d.itervalues(**kw)) def iteritems(d, **kw): return iter(d.iteritems(**kw)) def iterlists(d, **kw): return iter(d.iterlists(**kw)) viewkeys = operator.methodcaller("viewkeys") viewvalues = operator.methodcaller("viewvalues") viewitems = operator.methodcaller("viewitems") _add_doc(iterkeys, "Return an iterator over the keys of a dictionary.") _add_doc(itervalues, "Return an iterator over the values of a dictionary.") _add_doc(iteritems, "Return an iterator over the (key, value) pairs of a dictionary.") _add_doc(iterlists, "Return an iterator over the (key, [values]) pairs of a dictionary.") if PY3: def b(s): return s.encode("latin-1") def u(s): return s unichr = chr if sys.version_info[1] <= 1: def int2byte(i): return bytes((i,)) else: # This is about 2x faster than the implementation above on 3.2+ int2byte = operator.methodcaller("to_bytes", 1, "big") byte2int = operator.itemgetter(0) indexbytes = operator.getitem iterbytes = iter import io StringIO = io.StringIO BytesIO = io.BytesIO _assertCountEqual = "assertCountEqual" _assertRaisesRegex = "assertRaisesRegex" _assertRegex = "assertRegex" else: def b(s): return s # Workaround for standalone backslash def u(s): return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape") unichr = unichr int2byte = chr def byte2int(bs): return ord(bs[0]) def indexbytes(buf, i): return ord(buf[i]) iterbytes = functools.partial(itertools.imap, ord) import StringIO StringIO = BytesIO = StringIO.StringIO _assertCountEqual = "assertItemsEqual" _assertRaisesRegex = "assertRaisesRegexp" _assertRegex = "assertRegexpMatches" _add_doc(b, """Byte literal""") _add_doc(u, """Text literal""") def assertCountEqual(self, *args, **kwargs): return getattr(self, _assertCountEqual)(*args, **kwargs) def assertRaisesRegex(self, *args, **kwargs): return getattr(self, _assertRaisesRegex)(*args, **kwargs) def assertRegex(self, *args, **kwargs): return getattr(self, _assertRegex)(*args, **kwargs) if PY3: exec_ = getattr(moves.builtins, "exec") def reraise(tp, value, tb=None): if value is None: value = tp() if value.__traceback__ is not tb: raise value.with_traceback(tb) raise value else: def exec_(_code_, _globs_=None, _locs_=None): """Execute code in a namespace.""" if _globs_ is None: frame = sys._getframe(1) _globs_ = frame.f_globals if _locs_ is None: _locs_ = frame.f_locals del frame elif _locs_ is None: _locs_ = _globs_ exec("""exec _code_ in _globs_, _locs_""") exec_("""def reraise(tp, value, tb=None): raise tp, value, tb """) if sys.version_info[:2] == (3, 2): exec_("""def raise_from(value, from_value): if from_value is None: raise value raise value from from_value """) elif sys.version_info[:2] > (3, 2): exec_("""def raise_from(value, from_value): raise value from from_value """) else: def raise_from(value, from_value): raise value print_ = getattr(moves.builtins, "print", None) if print_ is None: def print_(*args, **kwargs): """The new-style print function for Python 2.4 and 2.5.""" fp = kwargs.pop("file", sys.stdout) if fp is None: return def write(data): if not isinstance(data, basestring): data = str(data) # If the file has an encoding, encode unicode with it. if (isinstance(fp, file) and isinstance(data, unicode) and fp.encoding is not None): errors = getattr(fp, "errors", None) if errors is None: errors = "strict" data = data.encode(fp.encoding, errors) fp.write(data) want_unicode = False sep = kwargs.pop("sep", None) if sep is not None: if isinstance(sep, unicode): want_unicode = True elif not isinstance(sep, str): raise TypeError("sep must be None or a string") end = kwargs.pop("end", None) if end is not None: if isinstance(end, unicode): want_unicode = True elif not isinstance(end, str): raise TypeError("end must be None or a string") if kwargs: raise TypeError("invalid keyword arguments to print()") if not want_unicode: for arg in args: if isinstance(arg, unicode): want_unicode = True break if want_unicode: newline = unicode("\n") space = unicode(" ") else: newline = "\n" space = " " if sep is None: sep = space if end is None: end = newline for i, arg in enumerate(args): if i: write(sep) write(arg) write(end) if sys.version_info[:2] < (3, 3): _print = print_ def print_(*args, **kwargs): fp = kwargs.get("file", sys.stdout) flush = kwargs.pop("flush", False) _print(*args, **kwargs) if flush and fp is not None: fp.flush() _add_doc(reraise, """Reraise an exception.""") if sys.version_info[0:2] < (3, 4): def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS, updated=functools.WRAPPER_UPDATES): def wrapper(f): f = functools.wraps(wrapped, assigned, updated)(f) f.__wrapped__ = wrapped return f return wrapper else: wraps = functools.wraps def with_metaclass(meta, *bases): """Create a base class with a metaclass.""" # This requires a bit of explanation: the basic idea is to make a dummy # metaclass for one level of class instantiation that replaces itself with # the actual metaclass. class metaclass(meta): def __new__(cls, name, this_bases, d): return meta(name, bases, d) return type.__new__(metaclass, 'temporary_class', (), {}) def add_metaclass(metaclass): """Class decorator for creating a class with a metaclass.""" def wrapper(cls): orig_vars = cls.__dict__.copy() slots = orig_vars.get('__slots__') if slots is not None: if isinstance(slots, str): slots = [slots] for slots_var in slots: orig_vars.pop(slots_var) orig_vars.pop('__dict__', None) orig_vars.pop('__weakref__', None) return metaclass(cls.__name__, cls.__bases__, orig_vars) return wrapper def python_2_unicode_compatible(klass): """ A decorator that defines __unicode__ and __str__ methods under Python 2. Under Python 3 it does nothing. To support Python 2 and 3 with a single code base, define a __str__ method returning text and apply this decorator to the class. """ if PY2: if '__str__' not in klass.__dict__: raise ValueError("@python_2_unicode_compatible cannot be applied " "to %s because it doesn't define __str__()." % klass.__name__) klass.__unicode__ = klass.__str__ klass.__str__ = lambda self: self.__unicode__().encode('utf-8') return klass # Complete the moves implementation. # This code is at the end of this module to speed up module loading. # Turn this module into a package. __path__ = [] # required for PEP 302 and PEP 451 __package__ = __name__ # see PEP 366 @ReservedAssignment if globals().get("__spec__") is not None: __spec__.submodule_search_locations = [] # PEP 451 @UndefinedVariable # Remove other six meta path importers, since they cause problems. This can # happen if six is removed from sys.modules and then reloaded. (Setuptools does # this for some reason.) if sys.meta_path: for i, importer in enumerate(sys.meta_path): # Here's some real nastiness: Another "instance" of the six module might # be floating around. Therefore, we can't use isinstance() to check for # the six meta path importer, since the other six instance will have # inserted an importer with different class. if (type(importer).__name__ == "_SixMetaPathImporter" and importer.name == __name__): del sys.meta_path[i] break del i, importer # Finally, add the importer to the meta path import hook. sys.meta_path.append(_importer) PK[嗢$,site-packages/urlgrabber-3.10-py2.7.egg-infonu[Metadata-Version: 1.1 Name: urlgrabber Version: 3.10 Summary: A high-level cross-protocol url-grabber Home-page: http://urlgrabber.baseurl.org/ Author: Michael D. Stenner, Ryan Tomayko Author-email: mstenner@linux.duke.edu, zpavlas@redhat.com License: LGPL Description: A high-level cross-protocol url-grabber. Using urlgrabber, data can be fetched in three basic ways: urlgrab(url) copy the file to the local filesystem urlopen(url) open the remote file and return a file object (like urllib2.urlopen) urlread(url) return the contents of the file as a string When using these functions (or methods), urlgrabber supports the following features: * identical behavior for http://, ftp://, and file:// urls * http keepalive - faster downloads of many files by using only a single connection * byte ranges - fetch only a portion of the file * reget - for a urlgrab, resume a partial download * progress meters - the ability to report download progress automatically, even when using urlopen! * throttling - restrict bandwidth usage * retries - automatically retry a download if it fails. The number of retries and failure types are configurable. * authenticated server access for http and ftp * proxy support - support for authenticated http and ftp proxies * mirror groups - treat a list of mirrors as a single source, automatically switching mirrors if there is a failure. Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Console Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) Classifier: Operating System :: POSIX Classifier: Operating System :: POSIX :: Linux Classifier: Programming Language :: Python Classifier: Topic :: Internet :: File Transfer Protocol (FTP) Classifier: Topic :: Internet :: WWW/HTTP Classifier: Topic :: Software Development :: Libraries :: Python Modules PK[qfߴߴsite-packages/validate.pynu[# validate.py # A Validator object # Copyright (C) 2005-2010 Michael Foord, Mark Andrews, Nicola Larosa # E-mail: fuzzyman AT voidspace DOT org DOT uk # mark AT la-la DOT com # nico AT tekNico DOT net # This software is licensed under the terms of the BSD license. # http://www.voidspace.org.uk/python/license.shtml # Basically you're free to copy, modify, distribute and relicense it, # So long as you keep a copy of the license with it. # Scripts maintained at http://www.voidspace.org.uk/python/index.shtml # For information about bugfixes, updates and support, please join the # ConfigObj mailing list: # http://lists.sourceforge.net/lists/listinfo/configobj-develop # Comments, suggestions and bug reports welcome. """ The Validator object is used to check that supplied values conform to a specification. The value can be supplied as a string - e.g. from a config file. In this case the check will also *convert* the value to the required type. This allows you to add validation as a transparent layer to access data stored as strings. The validation checks that the data is correct *and* converts it to the expected type. Some standard checks are provided for basic data types. Additional checks are easy to write. They can be provided when the ``Validator`` is instantiated or added afterwards. The standard functions work with the following basic data types : * integers * floats * booleans * strings * ip_addr plus lists of these datatypes Adding additional checks is done through coding simple functions. The full set of standard checks are : * 'integer': matches integer values (including negative) Takes optional 'min' and 'max' arguments : :: integer() integer(3, 9) # any value from 3 to 9 integer(min=0) # any positive value integer(max=9) * 'float': matches float values Has the same parameters as the integer check. * 'boolean': matches boolean values - ``True`` or ``False`` Acceptable string values for True are : true, on, yes, 1 Acceptable string values for False are : false, off, no, 0 Any other value raises an error. * 'ip_addr': matches an Internet Protocol address, v.4, represented by a dotted-quad string, i.e. '1.2.3.4'. * 'string': matches any string. Takes optional keyword args 'min' and 'max' to specify min and max lengths of the string. * 'list': matches any list. Takes optional keyword args 'min', and 'max' to specify min and max sizes of the list. (Always returns a list.) * 'tuple': matches any tuple. Takes optional keyword args 'min', and 'max' to specify min and max sizes of the tuple. (Always returns a tuple.) * 'int_list': Matches a list of integers. Takes the same arguments as list. * 'float_list': Matches a list of floats. Takes the same arguments as list. * 'bool_list': Matches a list of boolean values. Takes the same arguments as list. * 'ip_addr_list': Matches a list of IP addresses. Takes the same arguments as list. * 'string_list': Matches a list of strings. Takes the same arguments as list. * 'mixed_list': Matches a list with different types in specific positions. List size must match the number of arguments. Each position can be one of : 'integer', 'float', 'ip_addr', 'string', 'boolean' So to specify a list with two strings followed by two integers, you write the check as : :: mixed_list('string', 'string', 'integer', 'integer') * 'pass': This check matches everything ! It never fails and the value is unchanged. It is also the default if no check is specified. * 'option': This check matches any from a list of options. You specify this check with : :: option('option 1', 'option 2', 'option 3') You can supply a default value (returned if no value is supplied) using the default keyword argument. You specify a list argument for default using a list constructor syntax in the check : :: checkname(arg1, arg2, default=list('val 1', 'val 2', 'val 3')) A badly formatted set of arguments will raise a ``VdtParamError``. """ __version__ = '1.0.1' __all__ = ( '__version__', 'dottedQuadToNum', 'numToDottedQuad', 'ValidateError', 'VdtUnknownCheckError', 'VdtParamError', 'VdtTypeError', 'VdtValueError', 'VdtValueTooSmallError', 'VdtValueTooBigError', 'VdtValueTooShortError', 'VdtValueTooLongError', 'VdtMissingValue', 'Validator', 'is_integer', 'is_float', 'is_boolean', 'is_list', 'is_tuple', 'is_ip_addr', 'is_string', 'is_int_list', 'is_bool_list', 'is_float_list', 'is_string_list', 'is_ip_addr_list', 'is_mixed_list', 'is_option', ) import re _list_arg = re.compile(r''' (?: ([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*list\( ( (?: \s* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted ) \s*,\s* )* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted )? # last one ) \) ) ''', re.VERBOSE | re.DOTALL) # two groups _list_members = re.compile(r''' ( (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s=][^,=]*?) # unquoted ) (?: (?:\s*,\s*)|(?:\s*$) # comma ) ''', re.VERBOSE | re.DOTALL) # one group _paramstring = r''' (?: ( (?: [a-zA-Z_][a-zA-Z0-9_]*\s*=\s*list\( (?: \s* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted ) \s*,\s* )* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted )? # last one \) )| (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s=][^,=]*?)| # unquoted (?: # keyword argument [a-zA-Z_][a-zA-Z0-9_]*\s*=\s* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s=][^,=]*?) # unquoted ) ) ) ) (?: (?:\s*,\s*)|(?:\s*$) # comma ) ) ''' _matchstring = '^%s*' % _paramstring # Python pre 2.2.1 doesn't have bool try: bool except NameError: def bool(val): """Simple boolean equivalent function. """ if val: return 1 else: return 0 def dottedQuadToNum(ip): """ Convert decimal dotted quad string to long integer >>> int(dottedQuadToNum('1 ')) 1 >>> int(dottedQuadToNum(' 1.2')) 16777218 >>> int(dottedQuadToNum(' 1.2.3 ')) 16908291 >>> int(dottedQuadToNum('1.2.3.4')) 16909060 >>> dottedQuadToNum('255.255.255.255') 4294967295L >>> dottedQuadToNum('255.255.255.256') Traceback (most recent call last): ValueError: Not a good dotted-quad IP: 255.255.255.256 """ # import here to avoid it when ip_addr values are not used import socket, struct try: return struct.unpack('!L', socket.inet_aton(ip.strip()))[0] except socket.error: # bug in inet_aton, corrected in Python 2.4 if ip.strip() == '255.255.255.255': return 0xFFFFFFFFL else: raise ValueError('Not a good dotted-quad IP: %s' % ip) return def numToDottedQuad(num): """ Convert long int to dotted quad string >>> numToDottedQuad(-1L) Traceback (most recent call last): ValueError: Not a good numeric IP: -1 >>> numToDottedQuad(1L) '0.0.0.1' >>> numToDottedQuad(16777218L) '1.0.0.2' >>> numToDottedQuad(16908291L) '1.2.0.3' >>> numToDottedQuad(16909060L) '1.2.3.4' >>> numToDottedQuad(4294967295L) '255.255.255.255' >>> numToDottedQuad(4294967296L) Traceback (most recent call last): ValueError: Not a good numeric IP: 4294967296 """ # import here to avoid it when ip_addr values are not used import socket, struct # no need to intercept here, 4294967295L is fine if num > 4294967295L or num < 0: raise ValueError('Not a good numeric IP: %s' % num) try: return socket.inet_ntoa( struct.pack('!L', long(num))) except (socket.error, struct.error, OverflowError): raise ValueError('Not a good numeric IP: %s' % num) class ValidateError(Exception): """ This error indicates that the check failed. It can be the base class for more specific errors. Any check function that fails ought to raise this error. (or a subclass) >>> raise ValidateError Traceback (most recent call last): ValidateError """ class VdtMissingValue(ValidateError): """No value was supplied to a check that needed one.""" class VdtUnknownCheckError(ValidateError): """An unknown check function was requested""" def __init__(self, value): """ >>> raise VdtUnknownCheckError('yoda') Traceback (most recent call last): VdtUnknownCheckError: the check "yoda" is unknown. """ ValidateError.__init__(self, 'the check "%s" is unknown.' % (value,)) class VdtParamError(SyntaxError): """An incorrect parameter was passed""" def __init__(self, name, value): """ >>> raise VdtParamError('yoda', 'jedi') Traceback (most recent call last): VdtParamError: passed an incorrect value "jedi" for parameter "yoda". """ SyntaxError.__init__(self, 'passed an incorrect value "%s" for parameter "%s".' % (value, name)) class VdtTypeError(ValidateError): """The value supplied was of the wrong type""" def __init__(self, value): """ >>> raise VdtTypeError('jedi') Traceback (most recent call last): VdtTypeError: the value "jedi" is of the wrong type. """ ValidateError.__init__(self, 'the value "%s" is of the wrong type.' % (value,)) class VdtValueError(ValidateError): """The value supplied was of the correct type, but was not an allowed value.""" def __init__(self, value): """ >>> raise VdtValueError('jedi') Traceback (most recent call last): VdtValueError: the value "jedi" is unacceptable. """ ValidateError.__init__(self, 'the value "%s" is unacceptable.' % (value,)) class VdtValueTooSmallError(VdtValueError): """The value supplied was of the correct type, but was too small.""" def __init__(self, value): """ >>> raise VdtValueTooSmallError('0') Traceback (most recent call last): VdtValueTooSmallError: the value "0" is too small. """ ValidateError.__init__(self, 'the value "%s" is too small.' % (value,)) class VdtValueTooBigError(VdtValueError): """The value supplied was of the correct type, but was too big.""" def __init__(self, value): """ >>> raise VdtValueTooBigError('1') Traceback (most recent call last): VdtValueTooBigError: the value "1" is too big. """ ValidateError.__init__(self, 'the value "%s" is too big.' % (value,)) class VdtValueTooShortError(VdtValueError): """The value supplied was of the correct type, but was too short.""" def __init__(self, value): """ >>> raise VdtValueTooShortError('jed') Traceback (most recent call last): VdtValueTooShortError: the value "jed" is too short. """ ValidateError.__init__( self, 'the value "%s" is too short.' % (value,)) class VdtValueTooLongError(VdtValueError): """The value supplied was of the correct type, but was too long.""" def __init__(self, value): """ >>> raise VdtValueTooLongError('jedie') Traceback (most recent call last): VdtValueTooLongError: the value "jedie" is too long. """ ValidateError.__init__(self, 'the value "%s" is too long.' % (value,)) class Validator(object): """ Validator is an object that allows you to register a set of 'checks'. These checks take input and test that it conforms to the check. This can also involve converting the value from a string into the correct datatype. The ``check`` method takes an input string which configures which check is to be used and applies that check to a supplied value. An example input string would be: 'int_range(param1, param2)' You would then provide something like: >>> def int_range_check(value, min, max): ... # turn min and max from strings to integers ... min = int(min) ... max = int(max) ... # check that value is of the correct type. ... # possible valid inputs are integers or strings ... # that represent integers ... if not isinstance(value, (int, long, basestring)): ... raise VdtTypeError(value) ... elif isinstance(value, basestring): ... # if we are given a string ... # attempt to convert to an integer ... try: ... value = int(value) ... except ValueError: ... raise VdtValueError(value) ... # check the value is between our constraints ... if not min <= value: ... raise VdtValueTooSmallError(value) ... if not value <= max: ... raise VdtValueTooBigError(value) ... return value >>> fdict = {'int_range': int_range_check} >>> vtr1 = Validator(fdict) >>> vtr1.check('int_range(20, 40)', '30') 30 >>> vtr1.check('int_range(20, 40)', '60') Traceback (most recent call last): VdtValueTooBigError: the value "60" is too big. New functions can be added with : :: >>> vtr2 = Validator() >>> vtr2.functions['int_range'] = int_range_check Or by passing in a dictionary of functions when Validator is instantiated. Your functions *can* use keyword arguments, but the first argument should always be 'value'. If the function doesn't take additional arguments, the parentheses are optional in the check. It can be written with either of : :: keyword = function_name keyword = function_name() The first program to utilise Validator() was Michael Foord's ConfigObj, an alternative to ConfigParser which supports lists and can validate a config file using a config schema. For more details on using Validator with ConfigObj see: http://www.voidspace.org.uk/python/configobj.html """ # this regex does the initial parsing of the checks _func_re = re.compile(r'(.+?)\((.*)\)', re.DOTALL) # this regex takes apart keyword arguments _key_arg = re.compile(r'^([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*(.*)$', re.DOTALL) # this regex finds keyword=list(....) type values _list_arg = _list_arg # this regex takes individual values out of lists - in one pass _list_members = _list_members # These regexes check a set of arguments for validity # and then pull the members out _paramfinder = re.compile(_paramstring, re.VERBOSE | re.DOTALL) _matchfinder = re.compile(_matchstring, re.VERBOSE | re.DOTALL) def __init__(self, functions=None): """ >>> vtri = Validator() """ self.functions = { '': self._pass, 'integer': is_integer, 'float': is_float, 'boolean': is_boolean, 'ip_addr': is_ip_addr, 'string': is_string, 'list': is_list, 'tuple': is_tuple, 'int_list': is_int_list, 'float_list': is_float_list, 'bool_list': is_bool_list, 'ip_addr_list': is_ip_addr_list, 'string_list': is_string_list, 'mixed_list': is_mixed_list, 'pass': self._pass, 'option': is_option, 'force_list': force_list, } if functions is not None: self.functions.update(functions) # tekNico: for use by ConfigObj self.baseErrorClass = ValidateError self._cache = {} def check(self, check, value, missing=False): """ Usage: check(check, value) Arguments: check: string representing check to apply (including arguments) value: object to be checked Returns value, converted to correct type if necessary If the check fails, raises a ``ValidateError`` subclass. >>> vtor.check('yoda', '') Traceback (most recent call last): VdtUnknownCheckError: the check "yoda" is unknown. >>> vtor.check('yoda()', '') Traceback (most recent call last): VdtUnknownCheckError: the check "yoda" is unknown. >>> vtor.check('string(default="")', '', missing=True) '' """ fun_name, fun_args, fun_kwargs, default = self._parse_with_caching(check) if missing: if default is None: # no information needed here - to be handled by caller raise VdtMissingValue() value = self._handle_none(default) if value is None: return None return self._check_value(value, fun_name, fun_args, fun_kwargs) def _handle_none(self, value): if value == 'None': return None elif value in ("'None'", '"None"'): # Special case a quoted None value = self._unquote(value) return value def _parse_with_caching(self, check): if check in self._cache: fun_name, fun_args, fun_kwargs, default = self._cache[check] # We call list and dict below to work with *copies* of the data # rather than the original (which are mutable of course) fun_args = list(fun_args) fun_kwargs = dict(fun_kwargs) else: fun_name, fun_args, fun_kwargs, default = self._parse_check(check) fun_kwargs = dict([(str(key), value) for (key, value) in fun_kwargs.items()]) self._cache[check] = fun_name, list(fun_args), dict(fun_kwargs), default return fun_name, fun_args, fun_kwargs, default def _check_value(self, value, fun_name, fun_args, fun_kwargs): try: fun = self.functions[fun_name] except KeyError: raise VdtUnknownCheckError(fun_name) else: return fun(value, *fun_args, **fun_kwargs) def _parse_check(self, check): fun_match = self._func_re.match(check) if fun_match: fun_name = fun_match.group(1) arg_string = fun_match.group(2) arg_match = self._matchfinder.match(arg_string) if arg_match is None: # Bad syntax raise VdtParamError('Bad syntax in check "%s".' % check) fun_args = [] fun_kwargs = {} # pull out args of group 2 for arg in self._paramfinder.findall(arg_string): # args may need whitespace removing (before removing quotes) arg = arg.strip() listmatch = self._list_arg.match(arg) if listmatch: key, val = self._list_handle(listmatch) fun_kwargs[key] = val continue keymatch = self._key_arg.match(arg) if keymatch: val = keymatch.group(2) if not val in ("'None'", '"None"'): # Special case a quoted None val = self._unquote(val) fun_kwargs[keymatch.group(1)] = val continue fun_args.append(self._unquote(arg)) else: # allows for function names without (args) return check, (), {}, None # Default must be deleted if the value is specified too, # otherwise the check function will get a spurious "default" keyword arg default = fun_kwargs.pop('default', None) return fun_name, fun_args, fun_kwargs, default def _unquote(self, val): """Unquote a value if necessary.""" if (len(val) >= 2) and (val[0] in ("'", '"')) and (val[0] == val[-1]): val = val[1:-1] return val def _list_handle(self, listmatch): """Take apart a ``keyword=list('val, 'val')`` type string.""" out = [] name = listmatch.group(1) args = listmatch.group(2) for arg in self._list_members.findall(args): out.append(self._unquote(arg)) return name, out def _pass(self, value): """ Dummy check that always passes >>> vtor.check('', 0) 0 >>> vtor.check('', '0') '0' """ return value def get_default_value(self, check): """ Given a check, return the default value for the check (converted to the right type). If the check doesn't specify a default value then a ``KeyError`` will be raised. """ fun_name, fun_args, fun_kwargs, default = self._parse_with_caching(check) if default is None: raise KeyError('Check "%s" has no default value.' % check) value = self._handle_none(default) if value is None: return value return self._check_value(value, fun_name, fun_args, fun_kwargs) def _is_num_param(names, values, to_float=False): """ Return numbers from inputs or raise VdtParamError. Lets ``None`` pass through. Pass in keyword argument ``to_float=True`` to use float for the conversion rather than int. >>> _is_num_param(('', ''), (0, 1.0)) [0, 1] >>> _is_num_param(('', ''), (0, 1.0), to_float=True) [0.0, 1.0] >>> _is_num_param(('a'), ('a')) Traceback (most recent call last): VdtParamError: passed an incorrect value "a" for parameter "a". """ fun = to_float and float or int out_params = [] for (name, val) in zip(names, values): if val is None: out_params.append(val) elif isinstance(val, (int, long, float, basestring)): try: out_params.append(fun(val)) except ValueError, e: raise VdtParamError(name, val) else: raise VdtParamError(name, val) return out_params # built in checks # you can override these by setting the appropriate name # in Validator.functions # note: if the params are specified wrongly in your input string, # you will also raise errors. def is_integer(value, min=None, max=None): """ A check that tests that a given value is an integer (int, or long) and optionally, between bounds. A negative value is accepted, while a float will fail. If the value is a string, then the conversion is done - if possible. Otherwise a VdtError is raised. >>> vtor.check('integer', '-1') -1 >>> vtor.check('integer', '0') 0 >>> vtor.check('integer', 9) 9 >>> vtor.check('integer', 'a') Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. >>> vtor.check('integer', '2.2') Traceback (most recent call last): VdtTypeError: the value "2.2" is of the wrong type. >>> vtor.check('integer(10)', '20') 20 >>> vtor.check('integer(max=20)', '15') 15 >>> vtor.check('integer(10)', '9') Traceback (most recent call last): VdtValueTooSmallError: the value "9" is too small. >>> vtor.check('integer(10)', 9) Traceback (most recent call last): VdtValueTooSmallError: the value "9" is too small. >>> vtor.check('integer(max=20)', '35') Traceback (most recent call last): VdtValueTooBigError: the value "35" is too big. >>> vtor.check('integer(max=20)', 35) Traceback (most recent call last): VdtValueTooBigError: the value "35" is too big. >>> vtor.check('integer(0, 9)', False) 0 """ (min_val, max_val) = _is_num_param(('min', 'max'), (min, max)) if not isinstance(value, (int, long, basestring)): raise VdtTypeError(value) if isinstance(value, basestring): # if it's a string - does it represent an integer ? try: value = int(value) except ValueError: raise VdtTypeError(value) if (min_val is not None) and (value < min_val): raise VdtValueTooSmallError(value) if (max_val is not None) and (value > max_val): raise VdtValueTooBigError(value) return value def is_float(value, min=None, max=None): """ A check that tests that a given value is a float (an integer will be accepted), and optionally - that it is between bounds. If the value is a string, then the conversion is done - if possible. Otherwise a VdtError is raised. This can accept negative values. >>> vtor.check('float', '2') 2.0 From now on we multiply the value to avoid comparing decimals >>> vtor.check('float', '-6.8') * 10 -68.0 >>> vtor.check('float', '12.2') * 10 122.0 >>> vtor.check('float', 8.4) * 10 84.0 >>> vtor.check('float', 'a') Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. >>> vtor.check('float(10.1)', '10.2') * 10 102.0 >>> vtor.check('float(max=20.2)', '15.1') * 10 151.0 >>> vtor.check('float(10.0)', '9.0') Traceback (most recent call last): VdtValueTooSmallError: the value "9.0" is too small. >>> vtor.check('float(max=20.0)', '35.0') Traceback (most recent call last): VdtValueTooBigError: the value "35.0" is too big. """ (min_val, max_val) = _is_num_param( ('min', 'max'), (min, max), to_float=True) if not isinstance(value, (int, long, float, basestring)): raise VdtTypeError(value) if not isinstance(value, float): # if it's a string - does it represent a float ? try: value = float(value) except ValueError: raise VdtTypeError(value) if (min_val is not None) and (value < min_val): raise VdtValueTooSmallError(value) if (max_val is not None) and (value > max_val): raise VdtValueTooBigError(value) return value bool_dict = { True: True, 'on': True, '1': True, 'true': True, 'yes': True, False: False, 'off': False, '0': False, 'false': False, 'no': False, } def is_boolean(value): """ Check if the value represents a boolean. >>> vtor.check('boolean', 0) 0 >>> vtor.check('boolean', False) 0 >>> vtor.check('boolean', '0') 0 >>> vtor.check('boolean', 'off') 0 >>> vtor.check('boolean', 'false') 0 >>> vtor.check('boolean', 'no') 0 >>> vtor.check('boolean', 'nO') 0 >>> vtor.check('boolean', 'NO') 0 >>> vtor.check('boolean', 1) 1 >>> vtor.check('boolean', True) 1 >>> vtor.check('boolean', '1') 1 >>> vtor.check('boolean', 'on') 1 >>> vtor.check('boolean', 'true') 1 >>> vtor.check('boolean', 'yes') 1 >>> vtor.check('boolean', 'Yes') 1 >>> vtor.check('boolean', 'YES') 1 >>> vtor.check('boolean', '') Traceback (most recent call last): VdtTypeError: the value "" is of the wrong type. >>> vtor.check('boolean', 'up') Traceback (most recent call last): VdtTypeError: the value "up" is of the wrong type. """ if isinstance(value, basestring): try: return bool_dict[value.lower()] except KeyError: raise VdtTypeError(value) # we do an equality test rather than an identity test # this ensures Python 2.2 compatibilty # and allows 0 and 1 to represent True and False if value == False: return False elif value == True: return True else: raise VdtTypeError(value) def is_ip_addr(value): """ Check that the supplied value is an Internet Protocol address, v.4, represented by a dotted-quad string, i.e. '1.2.3.4'. >>> vtor.check('ip_addr', '1 ') '1' >>> vtor.check('ip_addr', ' 1.2') '1.2' >>> vtor.check('ip_addr', ' 1.2.3 ') '1.2.3' >>> vtor.check('ip_addr', '1.2.3.4') '1.2.3.4' >>> vtor.check('ip_addr', '0.0.0.0') '0.0.0.0' >>> vtor.check('ip_addr', '255.255.255.255') '255.255.255.255' >>> vtor.check('ip_addr', '255.255.255.256') Traceback (most recent call last): VdtValueError: the value "255.255.255.256" is unacceptable. >>> vtor.check('ip_addr', '1.2.3.4.5') Traceback (most recent call last): VdtValueError: the value "1.2.3.4.5" is unacceptable. >>> vtor.check('ip_addr', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. """ if not isinstance(value, basestring): raise VdtTypeError(value) value = value.strip() try: dottedQuadToNum(value) except ValueError: raise VdtValueError(value) return value def is_list(value, min=None, max=None): """ Check that the value is a list of values. You can optionally specify the minimum and maximum number of members. It does no check on list members. >>> vtor.check('list', ()) [] >>> vtor.check('list', []) [] >>> vtor.check('list', (1, 2)) [1, 2] >>> vtor.check('list', [1, 2]) [1, 2] >>> vtor.check('list(3)', (1, 2)) Traceback (most recent call last): VdtValueTooShortError: the value "(1, 2)" is too short. >>> vtor.check('list(max=5)', (1, 2, 3, 4, 5, 6)) Traceback (most recent call last): VdtValueTooLongError: the value "(1, 2, 3, 4, 5, 6)" is too long. >>> vtor.check('list(min=3, max=5)', (1, 2, 3, 4)) [1, 2, 3, 4] >>> vtor.check('list', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. >>> vtor.check('list', '12') Traceback (most recent call last): VdtTypeError: the value "12" is of the wrong type. """ (min_len, max_len) = _is_num_param(('min', 'max'), (min, max)) if isinstance(value, basestring): raise VdtTypeError(value) try: num_members = len(value) except TypeError: raise VdtTypeError(value) if min_len is not None and num_members < min_len: raise VdtValueTooShortError(value) if max_len is not None and num_members > max_len: raise VdtValueTooLongError(value) return list(value) def is_tuple(value, min=None, max=None): """ Check that the value is a tuple of values. You can optionally specify the minimum and maximum number of members. It does no check on members. >>> vtor.check('tuple', ()) () >>> vtor.check('tuple', []) () >>> vtor.check('tuple', (1, 2)) (1, 2) >>> vtor.check('tuple', [1, 2]) (1, 2) >>> vtor.check('tuple(3)', (1, 2)) Traceback (most recent call last): VdtValueTooShortError: the value "(1, 2)" is too short. >>> vtor.check('tuple(max=5)', (1, 2, 3, 4, 5, 6)) Traceback (most recent call last): VdtValueTooLongError: the value "(1, 2, 3, 4, 5, 6)" is too long. >>> vtor.check('tuple(min=3, max=5)', (1, 2, 3, 4)) (1, 2, 3, 4) >>> vtor.check('tuple', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. >>> vtor.check('tuple', '12') Traceback (most recent call last): VdtTypeError: the value "12" is of the wrong type. """ return tuple(is_list(value, min, max)) def is_string(value, min=None, max=None): """ Check that the supplied value is a string. You can optionally specify the minimum and maximum number of members. >>> vtor.check('string', '0') '0' >>> vtor.check('string', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. >>> vtor.check('string(2)', '12') '12' >>> vtor.check('string(2)', '1') Traceback (most recent call last): VdtValueTooShortError: the value "1" is too short. >>> vtor.check('string(min=2, max=3)', '123') '123' >>> vtor.check('string(min=2, max=3)', '1234') Traceback (most recent call last): VdtValueTooLongError: the value "1234" is too long. """ if not isinstance(value, basestring): raise VdtTypeError(value) (min_len, max_len) = _is_num_param(('min', 'max'), (min, max)) try: num_members = len(value) except TypeError: raise VdtTypeError(value) if min_len is not None and num_members < min_len: raise VdtValueTooShortError(value) if max_len is not None and num_members > max_len: raise VdtValueTooLongError(value) return value def is_int_list(value, min=None, max=None): """ Check that the value is a list of integers. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is an integer. >>> vtor.check('int_list', ()) [] >>> vtor.check('int_list', []) [] >>> vtor.check('int_list', (1, 2)) [1, 2] >>> vtor.check('int_list', [1, 2]) [1, 2] >>> vtor.check('int_list', [1, 'a']) Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. """ return [is_integer(mem) for mem in is_list(value, min, max)] def is_bool_list(value, min=None, max=None): """ Check that the value is a list of booleans. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is a boolean. >>> vtor.check('bool_list', ()) [] >>> vtor.check('bool_list', []) [] >>> check_res = vtor.check('bool_list', (True, False)) >>> check_res == [True, False] 1 >>> check_res = vtor.check('bool_list', [True, False]) >>> check_res == [True, False] 1 >>> vtor.check('bool_list', [True, 'a']) Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. """ return [is_boolean(mem) for mem in is_list(value, min, max)] def is_float_list(value, min=None, max=None): """ Check that the value is a list of floats. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is a float. >>> vtor.check('float_list', ()) [] >>> vtor.check('float_list', []) [] >>> vtor.check('float_list', (1, 2.0)) [1.0, 2.0] >>> vtor.check('float_list', [1, 2.0]) [1.0, 2.0] >>> vtor.check('float_list', [1, 'a']) Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. """ return [is_float(mem) for mem in is_list(value, min, max)] def is_string_list(value, min=None, max=None): """ Check that the value is a list of strings. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is a string. >>> vtor.check('string_list', ()) [] >>> vtor.check('string_list', []) [] >>> vtor.check('string_list', ('a', 'b')) ['a', 'b'] >>> vtor.check('string_list', ['a', 1]) Traceback (most recent call last): VdtTypeError: the value "1" is of the wrong type. >>> vtor.check('string_list', 'hello') Traceback (most recent call last): VdtTypeError: the value "hello" is of the wrong type. """ if isinstance(value, basestring): raise VdtTypeError(value) return [is_string(mem) for mem in is_list(value, min, max)] def is_ip_addr_list(value, min=None, max=None): """ Check that the value is a list of IP addresses. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is an IP address. >>> vtor.check('ip_addr_list', ()) [] >>> vtor.check('ip_addr_list', []) [] >>> vtor.check('ip_addr_list', ('1.2.3.4', '5.6.7.8')) ['1.2.3.4', '5.6.7.8'] >>> vtor.check('ip_addr_list', ['a']) Traceback (most recent call last): VdtValueError: the value "a" is unacceptable. """ return [is_ip_addr(mem) for mem in is_list(value, min, max)] def force_list(value, min=None, max=None): """ Check that a value is a list, coercing strings into a list with one member. Useful where users forget the trailing comma that turns a single value into a list. You can optionally specify the minimum and maximum number of members. A minumum of greater than one will fail if the user only supplies a string. >>> vtor.check('force_list', ()) [] >>> vtor.check('force_list', []) [] >>> vtor.check('force_list', 'hello') ['hello'] """ if not isinstance(value, (list, tuple)): value = [value] return is_list(value, min, max) fun_dict = { 'integer': is_integer, 'float': is_float, 'ip_addr': is_ip_addr, 'string': is_string, 'boolean': is_boolean, } def is_mixed_list(value, *args): """ Check that the value is a list. Allow specifying the type of each member. Work on lists of specific lengths. You specify each member as a positional argument specifying type Each type should be one of the following strings : 'integer', 'float', 'ip_addr', 'string', 'boolean' So you can specify a list of two strings, followed by two integers as : mixed_list('string', 'string', 'integer', 'integer') The length of the list must match the number of positional arguments you supply. >>> mix_str = "mixed_list('integer', 'float', 'ip_addr', 'string', 'boolean')" >>> check_res = vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', True)) >>> check_res == [1, 2.0, '1.2.3.4', 'a', True] 1 >>> check_res = vtor.check(mix_str, ('1', '2.0', '1.2.3.4', 'a', 'True')) >>> check_res == [1, 2.0, '1.2.3.4', 'a', True] 1 >>> vtor.check(mix_str, ('b', 2.0, '1.2.3.4', 'a', True)) Traceback (most recent call last): VdtTypeError: the value "b" is of the wrong type. >>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a')) Traceback (most recent call last): VdtValueTooShortError: the value "(1, 2.0, '1.2.3.4', 'a')" is too short. >>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', 1, 'b')) Traceback (most recent call last): VdtValueTooLongError: the value "(1, 2.0, '1.2.3.4', 'a', 1, 'b')" is too long. >>> vtor.check(mix_str, 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. This test requires an elaborate setup, because of a change in error string output from the interpreter between Python 2.2 and 2.3 . >>> res_seq = ( ... 'passed an incorrect value "', ... 'yoda', ... '" for parameter "mixed_list".', ... ) >>> res_str = "'".join(res_seq) >>> try: ... vtor.check('mixed_list("yoda")', ('a')) ... except VdtParamError, err: ... str(err) == res_str 1 """ try: length = len(value) except TypeError: raise VdtTypeError(value) if length < len(args): raise VdtValueTooShortError(value) elif length > len(args): raise VdtValueTooLongError(value) try: return [fun_dict[arg](val) for arg, val in zip(args, value)] except KeyError, e: raise VdtParamError('mixed_list', e) def is_option(value, *options): """ This check matches the value to any of a set of options. >>> vtor.check('option("yoda", "jedi")', 'yoda') 'yoda' >>> vtor.check('option("yoda", "jedi")', 'jed') Traceback (most recent call last): VdtValueError: the value "jed" is unacceptable. >>> vtor.check('option("yoda", "jedi")', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. """ if not isinstance(value, basestring): raise VdtTypeError(value) if not value in options: raise VdtValueError(value) return value def _test(value, *args, **keywargs): """ A function that exists for test purposes. >>> checks = [ ... '3, 6, min=1, max=3, test=list(a, b, c)', ... '3', ... '3, 6', ... '3,', ... 'min=1, test="a b c"', ... 'min=5, test="a, b, c"', ... 'min=1, max=3, test="a, b, c"', ... 'min=-100, test=-99', ... 'min=1, max=3', ... '3, 6, test="36"', ... '3, 6, test="a, b, c"', ... '3, max=3, test=list("a", "b", "c")', ... '''3, max=3, test=list("'a'", 'b', "x=(c)")''', ... "test='x=fish(3)'", ... ] >>> v = Validator({'test': _test}) >>> for entry in checks: ... print v.check(('test(%s)' % entry), 3) (3, ('3', '6'), {'test': ['a', 'b', 'c'], 'max': '3', 'min': '1'}) (3, ('3',), {}) (3, ('3', '6'), {}) (3, ('3',), {}) (3, (), {'test': 'a b c', 'min': '1'}) (3, (), {'test': 'a, b, c', 'min': '5'}) (3, (), {'test': 'a, b, c', 'max': '3', 'min': '1'}) (3, (), {'test': '-99', 'min': '-100'}) (3, (), {'max': '3', 'min': '1'}) (3, ('3', '6'), {'test': '36'}) (3, ('3', '6'), {'test': 'a, b, c'}) (3, ('3',), {'test': ['a', 'b', 'c'], 'max': '3'}) (3, ('3',), {'test': ["'a'", 'b', 'x=(c)'], 'max': '3'}) (3, (), {'test': 'x=fish(3)'}) >>> v = Validator() >>> v.check('integer(default=6)', '3') 3 >>> v.check('integer(default=6)', None, True) 6 >>> v.get_default_value('integer(default=6)') 6 >>> v.get_default_value('float(default=6)') 6.0 >>> v.get_default_value('pass(default=None)') >>> v.get_default_value("string(default='None')") 'None' >>> v.get_default_value('pass') Traceback (most recent call last): KeyError: 'Check "pass" has no default value.' >>> v.get_default_value('pass(default=list(1, 2, 3, 4))') ['1', '2', '3', '4'] >>> v = Validator() >>> v.check("pass(default=None)", None, True) >>> v.check("pass(default='None')", None, True) 'None' >>> v.check('pass(default="None")', None, True) 'None' >>> v.check('pass(default=list(1, 2, 3, 4))', None, True) ['1', '2', '3', '4'] Bug test for unicode arguments >>> v = Validator() >>> v.check(u'string(min=4)', u'test') u'test' >>> v = Validator() >>> v.get_default_value(u'string(min=4, default="1234")') u'1234' >>> v.check(u'string(min=4, default="1234")', u'test') u'test' >>> v = Validator() >>> default = v.get_default_value('string(default=None)') >>> default == None 1 """ return (value, args, keywargs) def _test2(): """ >>> >>> v = Validator() >>> v.get_default_value('string(default="#ff00dd")') '#ff00dd' >>> v.get_default_value('integer(default=3) # comment') 3 """ def _test3(): r""" >>> vtor.check('string(default="")', '', missing=True) '' >>> vtor.check('string(default="\n")', '', missing=True) '\n' >>> print vtor.check('string(default="\n")', '', missing=True), >>> vtor.check('string()', '\n') '\n' >>> vtor.check('string(default="\n\n\n")', '', missing=True) '\n\n\n' >>> vtor.check('string()', 'random \n text goes here\n\n') 'random \n text goes here\n\n' >>> vtor.check('string(default=" \nrandom text\ngoes \n here\n\n ")', ... '', missing=True) ' \nrandom text\ngoes \n here\n\n ' >>> vtor.check("string(default='\n\n\n')", '', missing=True) '\n\n\n' >>> vtor.check("option('\n','a','b',default='\n')", '', missing=True) '\n' >>> vtor.check("string_list()", ['foo', '\n', 'bar']) ['foo', '\n', 'bar'] >>> vtor.check("string_list(default=list('\n'))", '', missing=True) ['\n'] """ if __name__ == '__main__': # run the code tests in doctest format import sys import doctest m = sys.modules.get('__main__') globs = m.__dict__.copy() globs.update({ 'vtor': Validator(), }) doctest.testmod(m, globs=globs) PK[tHsite-packages/easy-install.pthnu[import sys; sys.__plen = len(sys.path) ./pyzor-1.0.0-py2.7.egg import sys; new=sys.path[sys.__plen:]; del sys.path[sys.__plen:]; p=getattr(sys,'__egginsert',0); sys.path[p:p]=new; sys.__egginsert = p+len(new) PK[29site-packages/decorator-3.4.0-py2.7.egg-info/not-zip-safenu[ PK[H(Z :site-packages/decorator-3.4.0-py2.7.egg-info/top_level.txtnu[decorator PK[2Asite-packages/decorator-3.4.0-py2.7.egg-info/dependency_links.txtnu[ PK[:(8site-packages/decorator-3.4.0-py2.7.egg-info/SOURCES.txtnu[MANIFEST.in README.txt documentation.py documentation3.py setup.cfg setup.py src/decorator.py src/decorator.egg-info/PKG-INFO src/decorator.egg-info/SOURCES.txt src/decorator.egg-info/dependency_links.txt src/decorator.egg-info/not-zip-safe src/decorator.egg-info/top_level.txtPK[$5site-packages/decorator-3.4.0-py2.7.egg-info/PKG-INFOnu[Metadata-Version: 1.1 Name: decorator Version: 3.4.0 Summary: Better living through Python with decorators Home-page: http://pypi.python.org/pypi/decorator Author: Michele Simionato Author-email: michele.simionato@gmail.com License: BSD License Description: Decorator module ================= :Author: Michele Simionato :E-mail: michele.simionato@gmail.com :Requires: Python 2.4+ :Download page: http://pypi.python.org/pypi/decorator :Installation: ``easy_install decorator`` :License: BSD license Installation ------------- If you are lazy, just perform $ easy_install decorator which will install just the module on your system. Notice that Python 3 requires the easy_install version of the distribute_ project. If you prefer to install the full distribution from source, including the documentation, download the tarball_, unpack it and run $ python setup.py install in the main directory, possibly as superuser. .. _tarball: http://pypi.python.org/pypi/decorator .. _distribute: http://packages.python.org/distribute/ Testing -------- For Python 2.5, 2.6, 2.7 run $ python documentation.py for Python 3.X run $ python documentation3.py You will see a few innocuous errors with Python 2.5, because some inner details such as the introduction of the ArgSpec namedtuple and Thread.__repr__ changed. You may safely ignore them. You cannot run the tests in Python 2.4, since there is a test using the with statement, but the decorator module is expected to work anyway (it has been used in production with Python 2.4 for years). My plan is to keep supporting all Python versions >= 2.4 in the core module, but I will keep the documentation and the tests updated only for the latest Python versions in both the 2.X and 3.X branches. Finally, notice that you may run into trouble if in your system there is an older version of the decorator module; in such a case remove the old version. Documentation -------------- There are various versions of the documentation: - `HTML version (Python 2)`_ - `PDF version (Python 2)`_ - `HTML version (Python 3)`_ - `PDF version (Python 3)`_ .. _HTML version (Python 2): http://micheles.googlecode.com/hg/decorator/documentation.html .. _PDF version (Python 2): http://micheles.googlecode.com/hg/decorator/documentation.pdf .. _HTML version (Python 3): http://micheles.googlecode.com/hg/decorator/documentation3.html .. _PDF version (Python 3): http://micheles.googlecode.com/hg/decorator/documentation3.pdf Repository --------------- The project is hosted on GoogleCode as a Mercurial repository. You can look at the source here: http://code.google.com/p/micheles/source/browse/#hg%2Fdecorator Keywords: decorators generic utility Platform: All Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Natural Language :: English Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Utilities PK[\!site-packages/procfs/__init__.pycnuȯ Yc@s4dZdZdZddlTddlTddlTdS(sp Copyright (c) 2008, 2009 Red Hat Inc. Abstractions to extract information from the Linux kernel /proc files. s*Arnaldo Carvalho de Melo s GPLv2 Licensei(t*N(t__doc__t __author__t __license__tprocfstsysctltutilist(((s3/usr/lib/python2.7/site-packages/procfs/__init__.pyts   PK[QQsite-packages/procfs/sysctl.pyonuȯ Yc@sdddYZdS(tsysctlcBsGeZdZdZdZdZdZdZdZRS(cCs i|_dS(N(tcache(tself((s1/usr/lib/python2.7/site-packages/procfs/sysctl.pyt__init__scCsL|jj|sA|j|}|dkr1dS||j|sPK[ rrsite-packages/procfs/procfs.pynuȯ#! /usr/bin/python # -*- python -*- # -*- coding: utf-8 -*- # # Copyright (C) 2007-2015 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # import os, time, utilist VERSION="0.3" def process_cmdline(pid_info): """ Returns the process command line, if available in the given `process' class, if not available, falls back to using the comm (short process name) in its pidstat key. """ if pid_info["cmdline"]: return reduce(lambda a, b: a + " %s" % b, pid_info["cmdline"]).strip() return pid_info["stat"]["comm"] class pidstat: """Provides a dictionary to access the fields in the per process /proc/PID/stat files. One can obtain the available fields asking for the keys of the dictionary, e.g.: >>> p = procfs.pidstat(1) >>> print p.keys() ['majflt', 'rss', 'cnswap', 'cstime', 'pid', 'session', 'startstack', 'startcode', 'cmajflt', 'blocked', 'exit_signal', 'minflt', 'nswap', 'environ', 'priority', 'state', 'delayacct_blkio_ticks', 'policy', 'rt_priority', 'ppid', 'nice', 'cutime', 'endcode', 'wchan', 'num_threads', 'sigcatch', 'comm', 'stime', 'sigignore', 'tty_nr', 'kstkeip', 'utime', 'tpgid', 'itrealvalue', 'kstkesp', 'rlim', 'signal', 'pgrp', 'flags', 'starttime', 'cminflt', 'vsize', 'processor'] And then access the various process properties using it as a dictionary: >>> print p['comm'] systemd >>> print p['priority'] 20 >>> print p['state'] S Please refer to the 'procfs(5)' man page, by using: $ man 5 procfs To see information for each of the above fields, it is part of the 'man-pages' RPM package. """ # Entries with the same value, the one with a comment after it is the # more recent, having replaced the other name in v4.1-rc kernel times. PF_ALIGNWARN = 0x00000001 PF_STARTING = 0x00000002 PF_EXITING = 0x00000004 PF_EXITPIDONE = 0x00000008 PF_VCPU = 0x00000010 PF_WQ_WORKER = 0x00000020 # /* I'm a workqueue worker */ PF_FORKNOEXEC = 0x00000040 PF_MCE_PROCESS = 0x00000080 # /* process policy on mce errors */ PF_SUPERPRIV = 0x00000100 PF_DUMPCORE = 0x00000200 PF_SIGNALED = 0x00000400 PF_MEMALLOC = 0x00000800 PF_NPROC_EXCEEDED= 0x00001000 # /* set_user noticed that RLIMIT_NPROC was exceeded */ PF_FLUSHER = 0x00001000 PF_USED_MATH = 0x00002000 PF_USED_ASYNC = 0x00004000 # /* used async_schedule*(), used by module init */ PF_NOFREEZE = 0x00008000 PF_FROZEN = 0x00010000 PF_FSTRANS = 0x00020000 PF_KSWAPD = 0x00040000 PF_MEMALLOC_NOIO = 0x00080000 # /* Allocating memory without IO involved */ PF_SWAPOFF = 0x00080000 PF_LESS_THROTTLE = 0x00100000 PF_KTHREAD = 0x00200000 PF_RANDOMIZE = 0x00400000 PF_SWAPWRITE = 0x00800000 PF_SPREAD_PAGE = 0x01000000 PF_SPREAD_SLAB = 0x02000000 PF_THREAD_BOUND = 0x04000000 PF_NO_SETAFFINITY = 0x04000000 # /* Userland is not allowed to meddle with cpus_allowed */ PF_MCE_EARLY = 0x08000000 # /* Early kill for mce process policy */ PF_MEMPOLICY = 0x10000000 PF_MUTEX_TESTER = 0x20000000 PF_FREEZER_SKIP = 0x40000000 PF_FREEZER_NOSIG = 0x80000000 PF_SUSPEND_TASK = 0x80000000 # /* this thread called freeze_processes and should not be frozen */ proc_stat_fields = [ "pid", "comm", "state", "ppid", "pgrp", "session", "tty_nr", "tpgid", "flags", "minflt", "cminflt", "majflt", "cmajflt", "utime", "stime", "cutime", "cstime", "priority", "nice", "num_threads", "itrealvalue", "starttime", "vsize", "rss", "rlim", "startcode", "endcode", "startstack", "kstkesp", "kstkeip", "signal", "blocked", "sigignore", "sigcatch", "wchan", "nswap", "cnswap", "exit_signal", "processor", "rt_priority", "policy", "delayacct_blkio_ticks", "environ" ] def __init__(self, pid, basedir = "/proc"): self.pid = pid self.load(basedir) def __getitem__(self, fieldname): return self.fields[fieldname] def keys(self): return self.fields.keys() def values(self): return self.fields.values() def has_key(self, fieldname): return self.fields.has_key(fieldname) def items(self): return self.fields def __contains__(self, fieldname): return fieldname in self.fields def load(self, basedir = "/proc"): f = open("%s/%d/stat" % (basedir, self.pid)) fields = f.readline().strip().split(') ') f.close() fields = fields[0].split(' (') + fields[1].split() self.fields = {} nr_fields = min(len(fields), len(self.proc_stat_fields)) for i in range(nr_fields): attrname = self.proc_stat_fields[i] value = fields[i] if attrname == "comm": self.fields["comm"] = value.strip('()') else: try: self.fields[attrname] = int(value) except: self.fields[attrname] = value def is_bound_to_cpu(self): """ Returns true if this process has a fixed smp affinity mask, not allowing it to be moved to a different set of CPUs. """ return self.fields["flags"] & self.PF_THREAD_BOUND and \ True or False def process_flags(self): """ Returns a list with all the process flags known, details depend on kernel version, declared in the file include/linux/sched.h in the kernel sources. As of v4.2-rc7 these include (from include/linux/sched.h comments): PF_EXITING Getting shut down PF_EXITPIDONE Pi exit done on shut down PF_VCPU I'm a virtual CPU PF_WQ_WORKER I'm a workqueue worker PF_FORKNOEXEC Forked but didn't exec PF_MCE_PROCESS Process policy on mce errors PF_SUPERPRIV Used super-user privileges PF_DUMPCORE Dumped core PF_SIGNALED Killed by a signal PF_MEMALLOC Allocating memory PF_NPROC_EXCEEDED Set_user noticed that RLIMIT_NPROC was exceeded PF_USED_MATH If unset the fpu must be initialized before use PF_USED_ASYNC Used async_schedule*(), used by module init PF_NOFREEZE This thread should not be frozen PF_FROZEN Frozen for system suspend PF_FSTRANS Inside a filesystem transaction PF_KSWAPD I am kswapd PF_MEMALLOC_NOIO Allocating memory without IO involved PF_LESS_THROTTLE Throttle me less: I clean memory PF_KTHREAD I am a kernel thread PF_RANDOMIZE Randomize virtual address space PF_SWAPWRITE Allowed to write to swap PF_NO_SETAFFINITY Userland is not allowed to meddle with cpus_allowed PF_MCE_EARLY Early kill for mce process policy PF_MUTEX_TESTER Thread belongs to the rt mutex tester PF_FREEZER_SKIP Freezer should not count it as freezable PF_SUSPEND_TASK This thread called freeze_processes and should not be frozen """ sflags = [] for attr in dir(self): if attr[:3] != "PF_": continue value = getattr(self, attr) if value & self.fields["flags"]: sflags.append(attr) return sflags class pidstatus: """ Provides a dictionary to access the fields in the per process /proc/PID/status files. This provides additional information about processes and threads to what can be obtained with the procfs.pidstat() class. One can obtain the available fields asking for the keys of the dictionary, e.g.: >>> import procfs >>> p = procfs.pidstatus(1) >>> print p.keys() ['VmExe', 'CapBnd', 'NSpgid', 'Tgid', 'NSpid', 'VmSize', 'VmPMD', 'ShdPnd', 'State', 'Gid', 'nonvoluntary_ctxt_switches', 'SigIgn', 'VmStk', 'VmData', 'SigCgt', 'CapEff', 'VmPTE', 'Groups', 'NStgid', 'Threads', 'PPid', 'VmHWM', 'NSsid', 'VmSwap', 'Name', 'SigBlk', 'Mems_allowed_list', 'VmPeak', 'Ngid', 'VmLck', 'SigQ', 'VmPin', 'Mems_allowed', 'CapPrm', 'Seccomp', 'VmLib', 'Cpus_allowed', 'Uid', 'SigPnd', 'Pid', 'Cpus_allowed_list', 'TracerPid', 'CapInh', 'voluntary_ctxt_switches', 'VmRSS', 'FDSize'] >>> print p["Pid"] 1 >>> print p["Threads"] 1 >>> print p["VmExe"] 1248 kB >>> print p["Cpus_allowed"] f >>> print p["SigQ"] 0/30698 >>> print p["VmPeak"] 320300 kB >>> Please refer to the 'procfs(5)' man page, by using: $ man 5 procfs To see information for each of the above fields, it is part of the 'man-pages' RPM package. In the man page there will be references to further documentation, like referring to the "getrlimit(2)" man page when explaining the "SigQ" line/field. """ def __init__(self, pid, basedir = "/proc"): self.pid = pid self.load(basedir) def __getitem__(self, fieldname): return self.fields[fieldname] def keys(self): return self.fields.keys() def values(self): return self.fields.values() def has_key(self, fieldname): return self.fields.has_key(fieldname) def items(self): return self.fields def __contains__(self, fieldname): return fieldname in self.fields def load(self, basedir = "/proc"): f = open("%s/%d/status" % (basedir, self.pid)) self.fields = {} for line in f.readlines(): fields = line.split(":") if len(fields) != 2: continue name = fields[0] value = fields[1].strip() try: self.fields[name] = int(value) except: self.fields[name] = value f.close() class process: """ Information about a process with a given pid, provides a dictionary with two entries, instances of different wrappers for /proc/ process related meta files: "stat" and "status", see the documentation for procfs.pidstat and procfs.pidstatus for further info about those classes. """ def __init__(self, pid, basedir = "/proc"): self.pid = pid self.basedir = basedir def __getitem__(self, attr): if not hasattr(self, attr): if attr in ("stat", "status"): if attr == "stat": sclass = pidstat else: sclass = pidstatus setattr(self, attr, sclass(self.pid, self.basedir)) elif attr == "cmdline": self.load_cmdline() elif attr == "threads": self.load_threads() elif attr == "cgroups": self.load_cgroups() elif attr == "environ": self.load_environ() return getattr(self, attr) def has_key(self, attr): return hasattr(self, attr) def __contains__(self, attr): return hasattr(self, attr) def load_cmdline(self): f = file("/proc/%d/cmdline" % self.pid) self.cmdline = f.readline().strip().split('\0')[:-1] f.close() def load_threads(self): self.threads = pidstats("/proc/%d/task/" % self.pid) # remove thread leader del self.threads[self.pid] def load_cgroups(self): f = file("/proc/%d/cgroup" % self.pid) self.cgroups = "" for line in reversed(f.readlines()): if len(self.cgroups): self.cgroups = self.cgroups + "," + line[:-1] else: self.cgroups = line[:-1] f.close() def load_environ(self): """ Loads the environment variables for this process. The entries then become available via the 'environ' member, or via the 'environ' dict key when accessing as p["environ"]. E.g.: >>> all_processes = procfs.pidstats() >>> firefox_pid = all_processes.find_by_name("firefox") >>> firefox_process = all_processes[firefox_pid[0]] >>> print firefox_process["environ"]["PWD"] /home/acme >>> print len(firefox_process.environ.keys()) 66 >>> print firefox_process["environ"]["SHELL"] /bin/bash >>> print firefox_process["environ"]["USERNAME"] acme >>> print firefox_process["environ"]["HOME"] /home/acme >>> print firefox_process["environ"]["MAIL"] /var/spool/mail/acme >>> """ self.environ = {} f = file("/proc/%d/environ" % self.pid) for x in f.readline().split('\0'): if len(x) > 0: y = x.split('=') self.environ[y[0]] = y[1] f.close() class pidstats: """ Provides access to all the processes in the system, to get a picture of how many processes there are at any given moment. The entries can be accessed as a dictionary, keyed by pid. Also there are methods to find processes that match a given COMM or regular expression. """ def __init__(self, basedir = "/proc"): self.basedir = basedir self.processes = {} self.reload() def __getitem__(self, key): return self.processes[key] def __delitem__(self, key): # not clear on why this can fail, but it can try: del self.processes[key] except: pass def keys(self): return self.processes.keys() def values(self): return self.processes.values() def has_key(self, key): return self.processes.has_key(key) def items(self): return self.processes def __contains__(self, key): return key in self.processes def reload(self): """ This operation will throw away the current dictionary contents, if any, and read all the pid files from /proc/, instantiating a 'process' instance for each of them. This is a high overhead operation, and should be avoided if the perf python binding can be used to detect when new threads appear and existing ones terminate. In RHEL it is found in the python-perf rpm package. More information about the perf facilities can be found in the 'perf_event_open' man page. """ del self.processes self.processes = {} pids = os.listdir(self.basedir) for spid in pids: try: pid = int(spid) except: continue self.processes[pid] = process(pid, self.basedir) def reload_threads(self): for pid in self.processes.keys(): try: self.processes[pid].load_threads() except OSError: # process vanished, remove it del self.processes[pid] def find_by_name(self, name): name = name[:15] pids = [] for pid in self.processes.keys(): try: if name == self.processes[pid]["stat"]["comm"]: pids.append(pid) except IOError: # We're doing lazy loading of /proc files # So if we get this exception is because the # process vanished, remove it del self.processes[pid] return pids def find_by_regex(self, regex): pids = [] for pid in self.processes.keys(): try: if regex.match(self.processes[pid]["stat"]["comm"]): pids.append(pid) except IOError: # We're doing lazy loading of /proc files # So if we get this exception is because the # process vanished, remove it del self.processes[pid] return pids def find_by_cmdline_regex(self, regex): pids = [] for pid in self.processes.keys(): try: if regex.match(process_cmdline(self.processes[pid])): pids.append(pid) except IOError: # We're doing lazy loading of /proc files # So if we get this exception is because the # process vanished, remove it del self.processes[pid] return pids def get_per_cpu_rtprios(self, basename): cpu = 0 priorities="" processed_pids = [] while True: name = "%s/%d" % (basename, cpu) pids = self.find_by_name(name) if not pids or len([n for n in pids if n not in processed_pids]) == 0: break for pid in pids: try: priorities += "%s," % self.processes[pid]["stat"]["rt_priority"] except IOError: # We're doing lazy loading of /proc files # So if we get this exception is because the # process vanished, remove it del self.processes[pid] processed_pids += pids cpu += 1 priorities = priorities.strip(',') return priorities def get_rtprios(self, name): cpu = 0 priorities="" processed_pids = [] while True: pids = self.find_by_name(name) if not pids or len([n for n in pids if n not in processed_pids]) == 0: break for pid in pids: try: priorities += "%s," % self.processes[pid]["stat"]["rt_priority"] except IOError: # We're doing lazy loading of /proc files # So if we get this exception is because the # process vanished, remove it del self.processes[pid] processed_pids += pids cpu += 1 priorities = priorities.strip(',') return priorities def is_bound_to_cpu(self, pid): """ Checks if a given pid can't have its SMP affinity mask changed. """ return self.processes[pid]["stat"].is_bound_to_cpu() class interrupts: """ Information about IRQs in the system. A dictionary keyed by IRQ number will have as its value another dictionary with "cpu", "type" and "users" keys, with the SMP affinity mask, type of IRQ and the drivers associated with each interrupt. The information comes from the /proc/interrupts file, documented in 'man procfs(5)', for instance, the 'cpu' dict is an array with one entry per CPU present in the sistem, each value being the number of interrupts that took place per CPU. E.g.: >>> import procfs >>> interrupts = procfs.interrupts() >>> thunderbolt_irq = interrupts.find_by_user("thunderbolt") >>> print thunderbolt_irq 34 >>> thunderbolt = interrupts[thunderbolt_irq] >>> print thunderbolt {'affinity': [0, 1, 2, 3], 'type': 'PCI-MSI', 'cpu': [3495, 0, 81, 0], 'users': ['thunderbolt']} >>> """ def __init__(self): self.interrupts = {} self.reload() def __getitem__(self, key): return self.interrupts[str(key)] def keys(self): return self.interrupts.keys() def values(self): return self.interrupts.values() def has_key(self, key): return self.interrupts.has_key(str(key)) def items(self): return self.interrupts def __contains__(self, key): return str(key) in self.interrupts def reload(self): del self.interrupts self.interrupts = {} f = open("/proc/interrupts") for line in f.readlines(): line = line.strip() fields = line.split() if fields[0][:3] == "CPU": self.nr_cpus = len(fields) continue irq = fields[0].strip(":") self.interrupts[irq] = {} self.interrupts[irq] = self.parse_entry(fields[1:], line) try: nirq = int(irq) except: continue self.interrupts[irq]["affinity"] = self.parse_affinity(nirq) f.close() def parse_entry(self, fields, line): dict = {} dict["cpu"] = [] dict["cpu"].append(int(fields[0])) nr_fields = len(fields) if nr_fields >= self.nr_cpus: dict["cpu"] += [int(i) for i in fields[1:self.nr_cpus]] if nr_fields > self.nr_cpus: dict["type"] = fields[self.nr_cpus] # look if there are users (interrupts 3 and 4 haven't) if nr_fields > self.nr_cpus + 1: dict["users"] = [a.strip() for a in fields[nr_fields - 1].split(',')] else: dict["users"] = [] return dict def parse_affinity(self, irq): try: f = file("/proc/irq/%s/smp_affinity" % irq) line = f.readline() f.close() return utilist.bitmasklist(line, self.nr_cpus) except IOError: return [ 0, ] def find_by_user(self, user): """ Looks up a interrupt number by the name of one of its users" E.g.: >>> import procfs >>> interrupts = procfs.interrupts() >>> thunderbolt_irq = interrupts.find_by_user("thunderbolt") >>> print thunderbolt_irq 34 >>> thunderbolt = interrupts[thunderbolt_irq] >>> print thunderbolt {'affinity': [0, 1, 2, 3], 'type': 'PCI-MSI', 'cpu': [3495, 0, 81, 0], 'users': ['thunderbolt']} >>> """ for i in self.interrupts.keys(): if self.interrupts[i].has_key("users") and \ user in self.interrupts[i]["users"]: return i return None def find_by_user_regex(self, regex): """ Looks up a interrupt number by a regex that matches names of its users" E.g.: >>> import procfs >>> import re >>> interrupts = procfs.interrupts() >>> usb_controllers = interrupts.find_by_user_regex(re.compile(".*hcd")) >>> print usb_controllers ['22', '23', '31'] >>> print [ interrupts[irq]["users"] for irq in usb_controllers ] [['ehci_hcd:usb4'], ['ehci_hcd:usb3'], ['xhci_hcd']] >>> """ irqs = [] for i in self.interrupts.keys(): if not self.interrupts[i].has_key("users"): continue for user in self.interrupts[i]["users"]: if regex.match(user): irqs.append(i) break return irqs class cmdline: """ Parses the kernel command line (/proc/cmdline), turning it into a dictionary." Useful to figure out if some kernel boolean knob has been turned on, as well as to find the value associated to other kernel knobs. It can also be used to find out about parameters passed to the init process, such as 'BOOT_IMAGE', etc. E.g.: >>> import procfs >>> kcmd = procfs.cmdline() >>> print kcmd.keys() ['LANG', 'BOOT_IMAGE', 'quiet', 'rhgb', 'rd.lvm.lv', 'ro', 'root'] >>> print kcmd["BOOT_IMAGE"] /vmlinuz-4.3.0-rc1+ >>> """ def __init__(self): self.options = {} self.parse() def parse(self): f = file("/proc/cmdline") for option in f.readline().strip().split(): fields = option.split("=") if len(fields) == 1: self.options[fields[0]] = True else: self.options[fields[0]] = fields[1] f.close() def __getitem__(self, key): return self.options[key] def keys(self): return self.options.keys() def values(self): return self.options.values() def items(self): return self.options class cpuinfo: """ Dictionary with information about CPUs in the system. Please refer to 'man procfs(5)' for further information about the '/proc/cpuinfo' file, that is the source of the information provided by this class. The 'man lscpu(1)' also has information about a program that uses the '/proc/cpuinfo' file. Using this class one can obtain the number of CPUs in a system: >>> cpus = procfs.cpuinfo() >>> print cpus.nr_cpus 4 It is also possible to figure out aspects of the CPU topology, such as how many CPU physical sockets exists, i.e. groups of CPUs sharing components such as CPU memory caches: >>> print len(cpus.sockets) 1 Additionally dictionary with information common to all CPUs in the system is available: >>> print cpus["model name"] Intel(R) Core(TM) i7-3667U CPU @ 2.00GHz >>> print cpus["cache size"] 4096 KB >>> """ def __init__(self, filename="/proc/cpuinfo"): self.tags = {} self.nr_cpus = 0 self.sockets = [] self.parse(filename) def __getitem__(self, key): return self.tags[key.lower()] def keys(self): return self.tags.keys() def values(self): return self.tags.values() def items(self): return self.tags def parse(self, filename): f = file(filename) for line in f.readlines(): line = line.strip() if len(line) == 0: continue fields = line.split(":") tagname = fields[0].strip().lower() if tagname == "processor": self.nr_cpus += 1 continue elif tagname == "core id": continue self.tags[tagname] = fields[1].strip() if tagname == "physical id": socket_id = self.tags[tagname] if socket_id not in self.sockets: self.sockets.append(socket_id) f.close() self.nr_sockets = self.sockets and len(self.sockets) or \ (self.nr_cpus / ("siblings" in self.tags and int(self.tags["siblings"]) or 1)) self.nr_cores = ("cpu cores" in self.tags and int(self.tags["cpu cores"]) or 1) * self.nr_sockets class smaps_lib: """ Representation of an mmap in place for a process. Can be used to figure out which processes have an library mapped, etc. The 'perm' member can be used to figure out executable mmaps, i.e. libraries. The 'vm_start' and 'vm_end' in turn can be used when trying to resolve processor instruction pointer addresses to a symbol name in a library. """ def __init__(self, lines): fields = lines[0].split() self.vm_start, self.vm_end = map(lambda a: int(a, 16), fields[0].split("-")) self.perms = fields[1] self.offset = int(fields[2], 16) self.major, self.minor = fields[3].split(":") self.inode = int(fields[4]) if len(fields) > 5: self.name = fields[5] else: self.name = None self.tags = {} for line in lines[1:]: fields = line.split() tag = fields[0][:-1].lower() try: self.tags[tag] = int(fields[1]) except: # VmFlags are strings self.tags[tag] = fields def __getitem__(self, key): return self.tags[key.lower()] def keys(self): return self.tags.keys() def values(self): return self.tags.values() def items(self): return self.tags class smaps: """ List of libraries mapped by a process. Parses the lines in the /proc/PID/smaps file, that is further documented in the procfs(5) man page. Example: Listing the executable maps for the 'sshd' process: >>> import procfs >>> processes = procfs.pidstats() >>> sshd = processes.find_by_name("sshd") >>> sshd_maps = procfs.smaps(sshd[0]) >>> for i in range(len(sshd_maps)): ... if 'x' in sshd_maps[i].perms: ... print "%s: %s" % (sshd_maps[i].name, sshd_maps[i].perms) ... /usr/sbin/sshd: r-xp /usr/lib64/libnss_files-2.20.so: r-xp /usr/lib64/librt-2.20.so: r-xp /usr/lib64/libkeyutils.so.1.5: r-xp /usr/lib64/libkrb5support.so.0.1: r-xp /usr/lib64/libfreebl3.so: r-xp /usr/lib64/libpthread-2.20.so: r-xp ... """ def __init__(self, pid): self.pid = pid self.entries = [] self.reload() def parse_entry(self, f, line): lines = [] if not line: line = f.readline().strip() if not line: return lines.append(line) while True: line = f.readline() if not line: break line = line.strip() if line.split()[0][-1] == ':': lines.append(line) else: break self.entries.append(smaps_lib(lines)) return line def __len__(self): return len(self.entries) def __getitem__(self, index): return self.entries[index] def reload(self): f = file("/proc/%d/smaps" % self.pid) line = None while True: line = self.parse_entry(f, line) if not line: break f.close() self.nr_entries = len(self.entries) def find_by_name_fragment(self, fragment): result = [] for i in range(self.nr_entries): if self.entries[i].name and \ self.entries[i].name.find(fragment) >= 0: result.append(self.entries[i]) return result class cpustat: """ CPU statistics, obtained from a line in the '/proc/stat' file, Please refer to 'man procfs(5)' for further information about the '/proc/stat' file, that is the source of the information provided by this class. """ def __init__(self, fields): self.name = fields[0] (self.user, self.nice, self.system, self.idle, self.iowait, self.irq, self.softirq) = [int(i) for i in fields[1:8]] if len(fields) > 7: self.steal = int(fields[7]) if len(fields) > 8: self.guest = int(fields[8]) def __repr__(self): s = "< user: %s, nice: %s, system: %s, idle: %s, iowait: %s, irq: %s, softirq: %s" % \ (self.user, self.nice, self.system, self.idle, self.iowait, self.irq, self.softirq) if hasattr(self, 'steal'): s += ", steal: %d" % self.steal if hasattr(self, 'guest'): s += ", guest: %d" % self.guest return s + ">" class cpusstats: """ Dictionary with information about CPUs in the system. First entry in the dictionary gives an aggregate view of all CPUs, each other entry is about separate CPUs. Please refer to 'man procfs(5)' for further information about the '/proc/stat' file, that is the source of the information provided by this class. """ def __init__(self, filename = "/proc/stat"): self.entries = {} self.time = None self.hertz = os.sysconf(2) self.filename = filename self.reload() def __iter__(self): return iter(self.entries) def __getitem__(self, key): return self.entries[key] def __len__(self): return len(self.entries.keys()) def keys(self): return self.entries.keys() def values(self): return self.entries.values() def items(self): return self.entries def reload(self): last_entries = self.entries self.entries = {} f = file(self.filename) for line in f.readlines(): fields = line.strip().split() if fields[0][:3].lower() != "cpu": continue c = cpustat(fields) if c.name == "cpu": idx = 0 else: idx = int(c.name[3:]) + 1 self.entries[idx] = c f.close() last_time = self.time self.time = time.time() if last_entries: delta_sec = self.time - last_time interval_hz = delta_sec * self.hertz for cpu in self.entries.keys(): if cpu not in last_entries: curr.usage = 0 continue curr = self.entries[cpu] prev = last_entries[cpu] delta = (curr.user - prev.user) + \ (curr.nice - prev.nice) + \ (curr.system - prev.system) curr.usage = (delta / interval_hz) * 100 if curr.usage > 100: curr.usage = 100 if __name__ == '__main__': import sys ints = interrupts() for i in ints.interrupts.keys(): print "%s: %s" % (i, ints.interrupts[i]) options = cmdline() for o in options.options.keys(): print "%s: %s" % (o, options.options[o]) cpu = cpuinfo() print "\ncpuinfo data: %d processors" % cpu.nr_cpus for tag in cpu.keys(): print "%s=%s" % (tag, cpu[tag]) print "smaps:\n" + ("-" * 40) s = smaps(int(sys.argv[1])) for i in range(s.nr_entries): print "%#x %s" % (s.entries[i].vm_start, s.entries[i].name) print "-" * 40 for a in s.find_by_name_fragment(sys.argv[2]): print a["Size"] ps = pidstats() print ps[1] cs = cpusstats() while True: time.sleep(1) cs.reload() for cpu in cs: print "%s: %d" % (cpu.name, cpu.usage) print "-" * 10 PK[C6!site-packages/procfs/procfs.pyonuȯ Yc@sddlZddlZddlZdZdZdd'dYZdd(dYZdd)d YZd d*d YZd d+d YZ dd,dYZ dd-dYZ dd.dYZ dd/dYZ dd0dYZdd1dYZedkrddlZe Zx-ej jD]Zdeej efGHq5We Zx-ejjD]ZdeejefGHqnWe ZdejGHx'ejD]ZdeeefGHqWddd GHe eejd!Zx:eejD])Zd"ejej ejej!fGHqWdd GHx'ej"ejd#D]Z#e#d$GHqPWeZ$e$d!GHeZ%xOe&rej'd!e%j(x#e%D]Zd%ej!ej)fGHqWd2GHqWndS(3iNs0.3cCs0|dr$td|djS|ddS(s Returns the process command line, if available in the given `process' class, if not available, falls back to using the comm (short process name) in its pidstat key. tcmdlinecSs |d|S(Ns %s((tatb((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytststattcomm(treducetstrip(tpid_info((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytprocess_cmdlines tpidstatc+BseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$d Z%d Z&d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKg+Z'dLdMZ(dNZ)dOZ*dPZ+dQZ,dRZ-dSZ.dLdTZ/dUZ0dVZ1RS(WsProvides a dictionary to access the fields in the per process /proc/PID/stat files. One can obtain the available fields asking for the keys of the dictionary, e.g.: >>> p = procfs.pidstat(1) >>> print p.keys() ['majflt', 'rss', 'cnswap', 'cstime', 'pid', 'session', 'startstack', 'startcode', 'cmajflt', 'blocked', 'exit_signal', 'minflt', 'nswap', 'environ', 'priority', 'state', 'delayacct_blkio_ticks', 'policy', 'rt_priority', 'ppid', 'nice', 'cutime', 'endcode', 'wchan', 'num_threads', 'sigcatch', 'comm', 'stime', 'sigignore', 'tty_nr', 'kstkeip', 'utime', 'tpgid', 'itrealvalue', 'kstkesp', 'rlim', 'signal', 'pgrp', 'flags', 'starttime', 'cminflt', 'vsize', 'processor'] And then access the various process properties using it as a dictionary: >>> print p['comm'] systemd >>> print p['priority'] 20 >>> print p['state'] S Please refer to the 'procfs(5)' man page, by using: $ man 5 procfs To see information for each of the above fields, it is part of the 'man-pages' RPM package. iiiiii i@iiiiiii i@iiiiiii i@iiiiiii i@ItpidRtstatetppidtpgrptsessionttty_nrttpgidtflagstminflttcminflttmajflttcmajflttutimetstimetcutimetcstimetprioritytnicet num_threadst itrealvaluet starttimetvsizetrsstrlimt startcodetendcodet startstacktkstkesptkstkeiptsignaltblockedt sigignoretsigcatchtwchantnswaptcnswapt exit_signalt processort rt_prioritytpolicytdelayacct_blkio_tickstenvirons/proccCs||_|j|dS(N(R tload(tselfR tbasedir((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__init__rs cCs |j|S(N(tfields(R6t fieldname((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt __getitem__vscCs |jjS(N(R9tkeys(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<yscCs |jjS(N(R9tvalues(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=|scCs|jj|S(N(R9thas_key(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>scCs|jS(N(R9(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytitemsscCs ||jkS(N(R9(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt __contains__scCs td||jf}|jjjd}|j|djd|dj}i|_tt|t|j }x~t |D]p}|j |}||}|dkr|jd|jdR?R@R5RRRY(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR #st                t pidstatuscBs\eZdZddZdZdZdZdZdZdZ dd Z RS( s Provides a dictionary to access the fields in the per process /proc/PID/status files. This provides additional information about processes and threads to what can be obtained with the procfs.pidstat() class. One can obtain the available fields asking for the keys of the dictionary, e.g.: >>> import procfs >>> p = procfs.pidstatus(1) >>> print p.keys() ['VmExe', 'CapBnd', 'NSpgid', 'Tgid', 'NSpid', 'VmSize', 'VmPMD', 'ShdPnd', 'State', 'Gid', 'nonvoluntary_ctxt_switches', 'SigIgn', 'VmStk', 'VmData', 'SigCgt', 'CapEff', 'VmPTE', 'Groups', 'NStgid', 'Threads', 'PPid', 'VmHWM', 'NSsid', 'VmSwap', 'Name', 'SigBlk', 'Mems_allowed_list', 'VmPeak', 'Ngid', 'VmLck', 'SigQ', 'VmPin', 'Mems_allowed', 'CapPrm', 'Seccomp', 'VmLib', 'Cpus_allowed', 'Uid', 'SigPnd', 'Pid', 'Cpus_allowed_list', 'TracerPid', 'CapInh', 'voluntary_ctxt_switches', 'VmRSS', 'FDSize'] >>> print p["Pid"] 1 >>> print p["Threads"] 1 >>> print p["VmExe"] 1248 kB >>> print p["Cpus_allowed"] f >>> print p["SigQ"] 0/30698 >>> print p["VmPeak"] 320300 kB >>> Please refer to the 'procfs(5)' man page, by using: $ man 5 procfs To see information for each of the above fields, it is part of the 'man-pages' RPM package. In the man page there will be references to further documentation, like referring to the "getrlimit(2)" man page when explaining the "SigQ" line/field. s/proccCs||_|j|dS(N(R R5(R6R R7((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s cCs |j|S(N(R9(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCs |jjS(N(R9R<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(R9R=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jj|S(N(R9R>(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>scCs|jS(N(R9(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs ||jkS(N(R9(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@ scCstd||jf}i|_x|jD]u}|jd}t|dkr\q/n|d}|dj}yt||j|R?R@R5(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs$       tprocesscBsYeZdZddZdZdZdZdZdZdZ d Z RS( s Information about a process with a given pid, provides a dictionary with two entries, instances of different wrappers for /proc/ process related meta files: "stat" and "status", see the documentation for procfs.pidstat and procfs.pidstatus for further info about those classes. s/proccCs||_||_dS(N(R R7(R6R R7((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8$s cCst||s|dkrX|dkr0t}nt}t||||j|jq|dkrq|jq|dkr|jq|dkr|jq|dkr|j qnt ||S(NRtstatusRtthreadstcgroupsR4(sstatR( thasattrR RtsetattrR R7t load_cmdlinet load_threadst load_cgroupst load_environRU(R6RXtsclass((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;(s   "       cCs t||S(N(R(R6RX((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR><scCs t||S(N(R(R6RX((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@?scCsCtd|j}|jjjdd |_|jdS(Ns/proc/%d/cmdlineti(tfileR RBRRCRRD(R6RJ((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRBs"cCs'td|j|_|j|j=dS(Ns/proc/%d/task/(tpidstatsR R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRGscCs~td|j}d|_xQt|jD]=}t|jr_|jd|d |_q/|d |_q/W|jdS(Ns/proc/%d/cgrouptt,i(RR RtreversedRRFRD(R6RJR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRLs cCsi|_td|j}xV|jjdD]?}t|dkr2|jd}|d|j|d>> all_processes = procfs.pidstats() >>> firefox_pid = all_processes.find_by_name("firefox") >>> firefox_process = all_processes[firefox_pid[0]] >>> print firefox_process["environ"]["PWD"] /home/acme >>> print len(firefox_process.environ.keys()) 66 >>> print firefox_process["environ"]["SHELL"] /bin/bash >>> print firefox_process["environ"]["USERNAME"] acme >>> print firefox_process["environ"]["HOME"] /home/acme >>> print firefox_process["environ"]["MAIL"] /var/spool/mail/acme >>> s/proc/%d/environRit=iN(R4RR RBRCRFRD(R6RJtxty((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRVs ( RZR[R\R8R;R>R@RRRR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs       RcBseZdZddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZRS(s Provides access to all the processes in the system, to get a picture of how many processes there are at any given moment. The entries can be accessed as a dictionary, keyed by pid. Also there are methods to find processes that match a given COMM or regular expression. s/proccCs ||_i|_|jdS(N(R7t processestreload(R6R7((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s  cCs |j|S(N(R(R6tkey((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCsy|j|=WnnXdS(N(R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt __delitem__scCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jj|S(N(RR>(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>scCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs ||jkS(N(R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@scCsl|`i|_tj|j}xD|D]<}yt|}Wn q(nXt||j|j|R?R@RRRRRRRRR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRxs"             t interruptscBszeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d ZRS( s4 Information about IRQs in the system. A dictionary keyed by IRQ number will have as its value another dictionary with "cpu", "type" and "users" keys, with the SMP affinity mask, type of IRQ and the drivers associated with each interrupt. The information comes from the /proc/interrupts file, documented in 'man procfs(5)', for instance, the 'cpu' dict is an array with one entry per CPU present in the sistem, each value being the number of interrupts that took place per CPU. E.g.: >>> import procfs >>> interrupts = procfs.interrupts() >>> thunderbolt_irq = interrupts.find_by_user("thunderbolt") >>> print thunderbolt_irq 34 >>> thunderbolt = interrupts[thunderbolt_irq] >>> print thunderbolt {'affinity': [0, 1, 2, 3], 'type': 'PCI-MSI', 'cpu': [3495, 0, 81, 0], 'users': ['thunderbolt']} >>> cCsi|_|jdS(N(RR(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR84s cCs|jt|S(N(Rtstr(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;8scCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<;scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=>scCs|jjt|S(N(RR>R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>AscCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?DscCst||jkS(N(RR(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@GscCs|`i|_td}x|jD]}|j}|j}|dd dkrot||_q(n|djd}i|j|<|j|d||j|>> import procfs >>> interrupts = procfs.interrupts() >>> thunderbolt_irq = interrupts.find_by_user("thunderbolt") >>> print thunderbolt_irq 34 >>> thunderbolt = interrupts[thunderbolt_irq] >>> print thunderbolt {'affinity': [0, 1, 2, 3], 'type': 'PCI-MSI', 'cpu': [3495, 0, 81, 0], 'users': ['thunderbolt']} >>> RN(RR<R>tNone(R6tuserRL((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt find_by_userys cCs|g}xo|jjD]^}|j|jds8qnx9|j|dD]&}|j|rJ|j|PqJqJWqW|S(s Looks up a interrupt number by a regex that matches names of its users" E.g.: >>> import procfs >>> import re >>> interrupts = procfs.interrupts() >>> usb_controllers = interrupts.find_by_user_regex(re.compile(".*hcd")) >>> print usb_controllers ['22', '23', '31'] >>> print [ interrupts[irq]["users"] for irq in usb_controllers ] [['ehci_hcd:usb4'], ['ehci_hcd:usb3'], ['xhci_hcd']] >>> R(RR<R>RRV(R6RtirqsRLR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytfind_by_user_regexs  (RZR[R\R8R;R<R=R>R?R@RRRRR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs          RcBsDeZdZdZdZdZdZdZdZRS(s Parses the kernel command line (/proc/cmdline), turning it into a dictionary." Useful to figure out if some kernel boolean knob has been turned on, as well as to find the value associated to other kernel knobs. It can also be used to find out about parameters passed to the init process, such as 'BOOT_IMAGE', etc. E.g.: >>> import procfs >>> kcmd = procfs.cmdline() >>> print kcmd.keys() ['LANG', 'BOOT_IMAGE', 'quiet', 'rhgb', 'rd.lvm.lv', 'ro', 'root'] >>> print kcmd["BOOT_IMAGE"] /vmlinuz-4.3.0-rc1+ >>> cCsi|_|jdS(N(toptionstparse(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s cCstd}xj|jjjD]P}|jd}t|dkr`t|j|d>> cpus = procfs.cpuinfo() >>> print cpus.nr_cpus 4 It is also possible to figure out aspects of the CPU topology, such as how many CPU physical sockets exists, i.e. groups of CPUs sharing components such as CPU memory caches: >>> print len(cpus.sockets) 1 Additionally dictionary with information common to all CPUs in the system is available: >>> print cpus["model name"] Intel(R) Core(TM) i7-3667U CPU @ 2.00GHz >>> print cpus["cache size"] 4096 KB >>> s /proc/cpuinfocCs,i|_d|_g|_|j|dS(Ni(ttagsRtsocketsR(R6tfilename((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s   cCs|j|jS(N(Rtlower(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs~t|}x|jD]}|j}t|dkrCqn|jd}|djj}|dkr|jd7_qn|dkrqn|dj|j|<|dkr|j|}||jkr|jj |qqqW|j |jrt|jpB|jd|jkr>t |jdpAd|_ d|jkrjt |jdpmd|j |_ dS( NiRR0iscore ids physical idtsiblingss cpu cores(RRRRFRCRRRRRVRDRIt nr_socketstnr_cores(R6RRJRR9ttagnamet socket_id((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR s*       2( RZR[R\R8R;R<R=R?R(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs     t smaps_libcBs;eZdZdZdZdZdZdZRS(s^ Representation of an mmap in place for a process. Can be used to figure out which processes have an library mapped, etc. The 'perm' member can be used to figure out executable mmaps, i.e. libraries. The 'vm_start' and 'vm_end' in turn can be used when trying to resolve processor instruction pointer addresses to a symbol name in a library. cCs/|dj}td|djd\|_|_|d|_t|dd|_|djd\|_|_t|d |_ t |d kr|d |_ n d|_ i|_ xd|dD]X}|j}|dd j}yt|d|j |>> import procfs >>> processes = procfs.pidstats() >>> sshd = processes.find_by_name("sshd") >>> sshd_maps = procfs.smaps(sshd[0]) >>> for i in range(len(sshd_maps)): ... if 'x' in sshd_maps[i].perms: ... print "%s: %s" % (sshd_maps[i].name, sshd_maps[i].perms) ... /usr/sbin/sshd: r-xp /usr/lib64/libnss_files-2.20.so: r-xp /usr/lib64/librt-2.20.so: r-xp /usr/lib64/libkeyutils.so.1.5: r-xp /usr/lib64/libkrb5support.so.0.1: r-xp /usr/lib64/libfreebl3.so: r-xp /usr/lib64/libpthread-2.20.so: r-xp ... cCs ||_g|_|jdS(N(R tentriesR(R6R ((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8fs  cCsg}|s!|jj}n|s+dS|j|xWtr|j}|sWPn|j}|jdddkr|j|q;Pq;W|jjt||S(NiiR(RBRRVRPRCRR(R6RJRR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRks     cCs t|jS(N(RFR(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__len__~scCs |j|S(N(R(R6tindex((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCsbtd|j}d}x&trA|j||}|sPqqW|jt|j|_dS(Ns/proc/%d/smaps( RR RRPRRDRFRt nr_entries(R6RJR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs  cCsjg}x]t|jD]L}|j|jr|j|jj|dkr|j|j|qqW|S(Ni(RHRRRtfindRV(R6tfragmenttresultRL((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytfind_by_name_fragments ( RZR[R\R8RRR;RR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRMs     tcpustatcBs eZdZdZdZRS(s CPU statistics, obtained from a line in the '/proc/stat' file, Please refer to 'man procfs(5)' for further information about the '/proc/stat' file, that is the source of the information provided by this class. cCs|d|_g|dd!D]}t|^q\|_|_|_|_|_|_|_t |dkrt|d|_ t |dkrt|d|_ qndS(Niiii( RRIRRtsystemtidletiowaitRtsoftirqRFtstealtguest(R6R9RL((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s  PcCsd|j|j|j|j|j|j|jf}t|drW|d|j7}nt|drz|d|j 7}n|dS(NsL< user: %s, nice: %s, system: %s, idle: %s, iowait: %s, irq: %s, softirq: %sRs , steal: %dRs , guest: %dt>( RRRRRRRRRR(R6ts((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__repr__s1(RZR[R\R8R(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs t cpusstatscBsYeZdZddZdZdZdZdZdZdZ d Z RS( s< Dictionary with information about CPUs in the system. First entry in the dictionary gives an aggregate view of all CPUs, each other entry is about separate CPUs. Please refer to 'man procfs(5)' for further information about the '/proc/stat' file, that is the source of the information provided by this class. s /proc/statcCs;i|_d|_tjd|_||_|jdS(Ni(RRttimeRtsysconfthertzRR(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s    cCs t|jS(N(titerR(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__iter__scCs |j|S(N(R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCst|jjS(N(RFRR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRscCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs|j}i|_t|j}x|jD]}|jj}|dd jdkrfq.nt|}|jdkrd}nt |jdd}||j|sR$ K\/I,JB       '         PK[] site-packages/procfs/__init__.pynuȯ#! /usr/bin/python # -*- python -*- # -*- coding: utf-8 -*- # # Copyright (C) 2008, 2009 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # """ Copyright (c) 2008, 2009 Red Hat Inc. Abstractions to extract information from the Linux kernel /proc files. """ __author__ = "Arnaldo Carvalho de Melo " __license__ = "GPLv2 License" from procfs import * from sysctl import * from utilist import * PK[Tsssite-packages/procfs/sysctl.pynuȯ#! /usr/bin/python # -*- python -*- # -*- coding: utf-8 -*- # # Copyright (C) 2007 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # class sysctl: def __init__(self): self.cache = {} def __getitem__(self, key): if not self.cache.has_key(key): value = self.read(key) if value == None: return None self.cache[key] = value return self.cache[key] def __setitem__(self, key, value): oldvalue = self[key] if oldvalue == None: raise IOError elif oldvalue != value: self.write(key, value) self.cache[key] = value def keys(self): return self.cache.keys() def read(self, key): try: f = file("/proc/sys/%s" % key.replace(".", "/")) except: return None value = f.readline().strip() f.close() return value def write(self, key, value): try: f = file("/proc/sys/%s" % key.replace(".", "/"), "w") except: return f.write(value) f.close() def refresh(self): for key in self.cache(): del self.cache[key] value = self.read(key) if value != None: self.cache[key] = value PK[d site-packages/procfs/utilist.pyonuȯ Yc@sdZdZdS(cCsg}d}d}xft|D]X}||krB|d|>O}n|d7}|dkrd}|jd|d}qqW|dkr|dkr|jd|n|S(Niii (trangetinsert(tlt nr_entriest hexbitmasktbittmasktentry((s2/usr/lib/python2.7/site-packages/procfs/utilist.pyRs    cCs|jjdd}g}d}tt|dddd}xNt|D]@}t|d@ry|j|n|d7}||krSPqSqSW|S(Nt,tiiii(tstriptreplacetbintinttNonetreversedtappend(tlineRthexmaskt bitmasklistRtbitmaskti((s2/usr/lib/python2.7/site-packages/procfs/utilist.pyR's"  N(RR(((s2/usr/lib/python2.7/site-packages/procfs/utilist.pyts PK[QQsite-packages/procfs/sysctl.pycnuȯ Yc@sdddYZdS(tsysctlcBsGeZdZdZdZdZdZdZdZRS(cCs i|_dS(N(tcache(tself((s1/usr/lib/python2.7/site-packages/procfs/sysctl.pyt__init__scCsL|jj|sA|j|}|dkr1dS||j|sPK[C6!site-packages/procfs/procfs.pycnuȯ Yc@sddlZddlZddlZdZdZdd'dYZdd(dYZdd)d YZd d*d YZd d+d YZ dd,dYZ dd-dYZ dd.dYZ dd/dYZ dd0dYZdd1dYZedkrddlZe Zx-ej jD]Zdeej efGHq5We Zx-ejjD]ZdeejefGHqnWe ZdejGHx'ejD]ZdeeefGHqWddd GHe eejd!Zx:eejD])Zd"ejej ejej!fGHqWdd GHx'ej"ejd#D]Z#e#d$GHqPWeZ$e$d!GHeZ%xOe&rej'd!e%j(x#e%D]Zd%ej!ej)fGHqWd2GHqWndS(3iNs0.3cCs0|dr$td|djS|ddS(s Returns the process command line, if available in the given `process' class, if not available, falls back to using the comm (short process name) in its pidstat key. tcmdlinecSs |d|S(Ns %s((tatb((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytststattcomm(treducetstrip(tpid_info((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytprocess_cmdlines tpidstatc+BseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$d Z%d Z&d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKg+Z'dLdMZ(dNZ)dOZ*dPZ+dQZ,dRZ-dSZ.dLdTZ/dUZ0dVZ1RS(WsProvides a dictionary to access the fields in the per process /proc/PID/stat files. One can obtain the available fields asking for the keys of the dictionary, e.g.: >>> p = procfs.pidstat(1) >>> print p.keys() ['majflt', 'rss', 'cnswap', 'cstime', 'pid', 'session', 'startstack', 'startcode', 'cmajflt', 'blocked', 'exit_signal', 'minflt', 'nswap', 'environ', 'priority', 'state', 'delayacct_blkio_ticks', 'policy', 'rt_priority', 'ppid', 'nice', 'cutime', 'endcode', 'wchan', 'num_threads', 'sigcatch', 'comm', 'stime', 'sigignore', 'tty_nr', 'kstkeip', 'utime', 'tpgid', 'itrealvalue', 'kstkesp', 'rlim', 'signal', 'pgrp', 'flags', 'starttime', 'cminflt', 'vsize', 'processor'] And then access the various process properties using it as a dictionary: >>> print p['comm'] systemd >>> print p['priority'] 20 >>> print p['state'] S Please refer to the 'procfs(5)' man page, by using: $ man 5 procfs To see information for each of the above fields, it is part of the 'man-pages' RPM package. iiiiii i@iiiiiii i@iiiiiii i@iiiiiii i@ItpidRtstatetppidtpgrptsessionttty_nrttpgidtflagstminflttcminflttmajflttcmajflttutimetstimetcutimetcstimetprioritytnicet num_threadst itrealvaluet starttimetvsizetrsstrlimt startcodetendcodet startstacktkstkesptkstkeiptsignaltblockedt sigignoretsigcatchtwchantnswaptcnswapt exit_signalt processort rt_prioritytpolicytdelayacct_blkio_tickstenvirons/proccCs||_|j|dS(N(R tload(tselfR tbasedir((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__init__rs cCs |j|S(N(tfields(R6t fieldname((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt __getitem__vscCs |jjS(N(R9tkeys(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<yscCs |jjS(N(R9tvalues(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=|scCs|jj|S(N(R9thas_key(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>scCs|jS(N(R9(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytitemsscCs ||jkS(N(R9(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt __contains__scCs td||jf}|jjjd}|j|djd|dj}i|_tt|t|j }x~t |D]p}|j |}||}|dkr|jd|jdR?R@R5RRRY(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR #st                t pidstatuscBs\eZdZddZdZdZdZdZdZdZ dd Z RS( s Provides a dictionary to access the fields in the per process /proc/PID/status files. This provides additional information about processes and threads to what can be obtained with the procfs.pidstat() class. One can obtain the available fields asking for the keys of the dictionary, e.g.: >>> import procfs >>> p = procfs.pidstatus(1) >>> print p.keys() ['VmExe', 'CapBnd', 'NSpgid', 'Tgid', 'NSpid', 'VmSize', 'VmPMD', 'ShdPnd', 'State', 'Gid', 'nonvoluntary_ctxt_switches', 'SigIgn', 'VmStk', 'VmData', 'SigCgt', 'CapEff', 'VmPTE', 'Groups', 'NStgid', 'Threads', 'PPid', 'VmHWM', 'NSsid', 'VmSwap', 'Name', 'SigBlk', 'Mems_allowed_list', 'VmPeak', 'Ngid', 'VmLck', 'SigQ', 'VmPin', 'Mems_allowed', 'CapPrm', 'Seccomp', 'VmLib', 'Cpus_allowed', 'Uid', 'SigPnd', 'Pid', 'Cpus_allowed_list', 'TracerPid', 'CapInh', 'voluntary_ctxt_switches', 'VmRSS', 'FDSize'] >>> print p["Pid"] 1 >>> print p["Threads"] 1 >>> print p["VmExe"] 1248 kB >>> print p["Cpus_allowed"] f >>> print p["SigQ"] 0/30698 >>> print p["VmPeak"] 320300 kB >>> Please refer to the 'procfs(5)' man page, by using: $ man 5 procfs To see information for each of the above fields, it is part of the 'man-pages' RPM package. In the man page there will be references to further documentation, like referring to the "getrlimit(2)" man page when explaining the "SigQ" line/field. s/proccCs||_|j|dS(N(R R5(R6R R7((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s cCs |j|S(N(R9(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCs |jjS(N(R9R<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(R9R=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jj|S(N(R9R>(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>scCs|jS(N(R9(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs ||jkS(N(R9(R6R:((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@ scCstd||jf}i|_x|jD]u}|jd}t|dkr\q/n|d}|dj}yt||j|R?R@R5(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs$       tprocesscBsYeZdZddZdZdZdZdZdZdZ d Z RS( s Information about a process with a given pid, provides a dictionary with two entries, instances of different wrappers for /proc/ process related meta files: "stat" and "status", see the documentation for procfs.pidstat and procfs.pidstatus for further info about those classes. s/proccCs||_||_dS(N(R R7(R6R R7((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8$s cCst||s|dkrX|dkr0t}nt}t||||j|jq|dkrq|jq|dkr|jq|dkr|jq|dkr|j qnt ||S(NRtstatusRtthreadstcgroupsR4(sstatR( thasattrR RtsetattrR R7t load_cmdlinet load_threadst load_cgroupst load_environRU(R6RXtsclass((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;(s   "       cCs t||S(N(R(R6RX((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR><scCs t||S(N(R(R6RX((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@?scCsCtd|j}|jjjdd |_|jdS(Ns/proc/%d/cmdlineti(tfileR RBRRCRRD(R6RJ((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRBs"cCs'td|j|_|j|j=dS(Ns/proc/%d/task/(tpidstatsR R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRGscCs~td|j}d|_xQt|jD]=}t|jr_|jd|d |_q/|d |_q/W|jdS(Ns/proc/%d/cgrouptt,i(RR RtreversedRRFRD(R6RJR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRLs cCsi|_td|j}xV|jjdD]?}t|dkr2|jd}|d|j|d>> all_processes = procfs.pidstats() >>> firefox_pid = all_processes.find_by_name("firefox") >>> firefox_process = all_processes[firefox_pid[0]] >>> print firefox_process["environ"]["PWD"] /home/acme >>> print len(firefox_process.environ.keys()) 66 >>> print firefox_process["environ"]["SHELL"] /bin/bash >>> print firefox_process["environ"]["USERNAME"] acme >>> print firefox_process["environ"]["HOME"] /home/acme >>> print firefox_process["environ"]["MAIL"] /var/spool/mail/acme >>> s/proc/%d/environRit=iN(R4RR RBRCRFRD(R6RJtxty((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRVs ( RZR[R\R8R;R>R@RRRR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs       RcBseZdZddZdZdZdZdZdZdZ d Z d Z d Z d Z d ZdZdZdZdZRS(s Provides access to all the processes in the system, to get a picture of how many processes there are at any given moment. The entries can be accessed as a dictionary, keyed by pid. Also there are methods to find processes that match a given COMM or regular expression. s/proccCs ||_i|_|jdS(N(R7t processestreload(R6R7((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s  cCs |j|S(N(R(R6tkey((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCsy|j|=WnnXdS(N(R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt __delitem__scCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jj|S(N(RR>(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>scCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs ||jkS(N(R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@scCsl|`i|_tj|j}xD|D]<}yt|}Wn q(nXt||j|j|R?R@RRRRRRRRR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRxs"             t interruptscBszeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d ZRS( s4 Information about IRQs in the system. A dictionary keyed by IRQ number will have as its value another dictionary with "cpu", "type" and "users" keys, with the SMP affinity mask, type of IRQ and the drivers associated with each interrupt. The information comes from the /proc/interrupts file, documented in 'man procfs(5)', for instance, the 'cpu' dict is an array with one entry per CPU present in the sistem, each value being the number of interrupts that took place per CPU. E.g.: >>> import procfs >>> interrupts = procfs.interrupts() >>> thunderbolt_irq = interrupts.find_by_user("thunderbolt") >>> print thunderbolt_irq 34 >>> thunderbolt = interrupts[thunderbolt_irq] >>> print thunderbolt {'affinity': [0, 1, 2, 3], 'type': 'PCI-MSI', 'cpu': [3495, 0, 81, 0], 'users': ['thunderbolt']} >>> cCsi|_|jdS(N(RR(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR84s cCs|jt|S(N(Rtstr(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;8scCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<;scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=>scCs|jjt|S(N(RR>R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR>AscCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?DscCst||jkS(N(RR(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR@GscCs|`i|_td}x|jD]}|j}|j}|dd dkrot||_q(n|djd}i|j|<|j|d||j|>> import procfs >>> interrupts = procfs.interrupts() >>> thunderbolt_irq = interrupts.find_by_user("thunderbolt") >>> print thunderbolt_irq 34 >>> thunderbolt = interrupts[thunderbolt_irq] >>> print thunderbolt {'affinity': [0, 1, 2, 3], 'type': 'PCI-MSI', 'cpu': [3495, 0, 81, 0], 'users': ['thunderbolt']} >>> RN(RR<R>tNone(R6tuserRL((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt find_by_userys cCs|g}xo|jjD]^}|j|jds8qnx9|j|dD]&}|j|rJ|j|PqJqJWqW|S(s Looks up a interrupt number by a regex that matches names of its users" E.g.: >>> import procfs >>> import re >>> interrupts = procfs.interrupts() >>> usb_controllers = interrupts.find_by_user_regex(re.compile(".*hcd")) >>> print usb_controllers ['22', '23', '31'] >>> print [ interrupts[irq]["users"] for irq in usb_controllers ] [['ehci_hcd:usb4'], ['ehci_hcd:usb3'], ['xhci_hcd']] >>> R(RR<R>RRV(R6RtirqsRLR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytfind_by_user_regexs  (RZR[R\R8R;R<R=R>R?R@RRRRR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs          RcBsDeZdZdZdZdZdZdZdZRS(s Parses the kernel command line (/proc/cmdline), turning it into a dictionary." Useful to figure out if some kernel boolean knob has been turned on, as well as to find the value associated to other kernel knobs. It can also be used to find out about parameters passed to the init process, such as 'BOOT_IMAGE', etc. E.g.: >>> import procfs >>> kcmd = procfs.cmdline() >>> print kcmd.keys() ['LANG', 'BOOT_IMAGE', 'quiet', 'rhgb', 'rd.lvm.lv', 'ro', 'root'] >>> print kcmd["BOOT_IMAGE"] /vmlinuz-4.3.0-rc1+ >>> cCsi|_|jdS(N(toptionstparse(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s cCstd}xj|jjjD]P}|jd}t|dkr`t|j|d>> cpus = procfs.cpuinfo() >>> print cpus.nr_cpus 4 It is also possible to figure out aspects of the CPU topology, such as how many CPU physical sockets exists, i.e. groups of CPUs sharing components such as CPU memory caches: >>> print len(cpus.sockets) 1 Additionally dictionary with information common to all CPUs in the system is available: >>> print cpus["model name"] Intel(R) Core(TM) i7-3667U CPU @ 2.00GHz >>> print cpus["cache size"] 4096 KB >>> s /proc/cpuinfocCs,i|_d|_g|_|j|dS(Ni(ttagsRtsocketsR(R6tfilename((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s   cCs|j|jS(N(Rtlower(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs~t|}x|jD]}|j}t|dkrCqn|jd}|djj}|dkr|jd7_qn|dkrqn|dj|j|<|dkr|j|}||jkr|jj |qqqW|j |jrt|jpB|jd|jkr>t |jdpAd|_ d|jkrjt |jdpmd|j |_ dS( NiRR0iscore ids physical idtsiblingss cpu cores(RRRRFRCRRRRRVRDRIt nr_socketstnr_cores(R6RRJRR9ttagnamet socket_id((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR s*       2( RZR[R\R8R;R<R=R?R(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs     t smaps_libcBs;eZdZdZdZdZdZdZRS(s^ Representation of an mmap in place for a process. Can be used to figure out which processes have an library mapped, etc. The 'perm' member can be used to figure out executable mmaps, i.e. libraries. The 'vm_start' and 'vm_end' in turn can be used when trying to resolve processor instruction pointer addresses to a symbol name in a library. cCs/|dj}td|djd\|_|_|d|_t|dd|_|djd\|_|_t|d |_ t |d kr|d |_ n d|_ i|_ xd|dD]X}|j}|dd j}yt|d|j |>> import procfs >>> processes = procfs.pidstats() >>> sshd = processes.find_by_name("sshd") >>> sshd_maps = procfs.smaps(sshd[0]) >>> for i in range(len(sshd_maps)): ... if 'x' in sshd_maps[i].perms: ... print "%s: %s" % (sshd_maps[i].name, sshd_maps[i].perms) ... /usr/sbin/sshd: r-xp /usr/lib64/libnss_files-2.20.so: r-xp /usr/lib64/librt-2.20.so: r-xp /usr/lib64/libkeyutils.so.1.5: r-xp /usr/lib64/libkrb5support.so.0.1: r-xp /usr/lib64/libfreebl3.so: r-xp /usr/lib64/libpthread-2.20.so: r-xp ... cCs ||_g|_|jdS(N(R tentriesR(R6R ((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8fs  cCsg}|s!|jj}n|s+dS|j|xWtr|j}|sWPn|j}|jdddkr|j|q;Pq;W|jjt||S(NiiR(RBRRVRPRCRR(R6RJRR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRks     cCs t|jS(N(RFR(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__len__~scCs |j|S(N(R(R6tindex((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCsbtd|j}d}x&trA|j||}|sPqqW|jt|j|_dS(Ns/proc/%d/smaps( RR RRPRRDRFRt nr_entries(R6RJR((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs  cCsjg}x]t|jD]L}|j|jr|j|jj|dkr|j|j|qqW|S(Ni(RHRRRtfindRV(R6tfragmenttresultRL((s1/usr/lib/python2.7/site-packages/procfs/procfs.pytfind_by_name_fragments ( RZR[R\R8RRR;RR(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRMs     tcpustatcBs eZdZdZdZRS(s CPU statistics, obtained from a line in the '/proc/stat' file, Please refer to 'man procfs(5)' for further information about the '/proc/stat' file, that is the source of the information provided by this class. cCs|d|_g|dd!D]}t|^q\|_|_|_|_|_|_|_t |dkrt|d|_ t |dkrt|d|_ qndS(Niiii( RRIRRtsystemtidletiowaitRtsoftirqRFtstealtguest(R6R9RL((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s  PcCsd|j|j|j|j|j|j|jf}t|drW|d|j7}nt|drz|d|j 7}n|dS(NsL< user: %s, nice: %s, system: %s, idle: %s, iowait: %s, irq: %s, softirq: %sRs , steal: %dRs , guest: %dt>( RRRRRRRRRR(R6ts((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__repr__s1(RZR[R\R8R(((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRs t cpusstatscBsYeZdZddZdZdZdZdZdZdZ d Z RS( s< Dictionary with information about CPUs in the system. First entry in the dictionary gives an aggregate view of all CPUs, each other entry is about separate CPUs. Please refer to 'man procfs(5)' for further information about the '/proc/stat' file, that is the source of the information provided by this class. s /proc/statcCs;i|_d|_tjd|_||_|jdS(Ni(RRttimeRtsysconfthertzRR(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR8s    cCs t|jS(N(titerR(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyt__iter__scCs |j|S(N(R(R6R((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR;scCst|jjS(N(RFRR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyRscCs |jjS(N(RR<(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR<scCs |jjS(N(RR=(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR=scCs|jS(N(R(R6((s1/usr/lib/python2.7/site-packages/procfs/procfs.pyR?scCs|j}i|_t|j}x|jD]}|jj}|dd jdkrfq.nt|}|jdkrd}nt |jdd}||j|sR$ K\/I,JB       '         PK[ ))site-packages/procfs/utilist.pynuȯ#! /usr/bin/python # -*- python -*- # -*- coding: utf-8 -*- # # Copyright (C) 2007 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # def hexbitmask(l, nr_entries): hexbitmask = [] bit = 0 mask = 0 for entry in range(nr_entries): if entry in l: mask |= (1 << bit) bit += 1 if bit == 32: bit = 0 hexbitmask.insert(0, mask) mask = 0 if bit < 32 and mask != 0: hexbitmask.insert(0, mask) return hexbitmask def bitmasklist(line, nr_entries): hexmask = line.strip().replace(",", "") bitmasklist = [] entry = 0 bitmask = bin(int(hexmask, 16))[2::] for i in reversed(bitmask): if int(i) & 1: bitmasklist.append(entry) entry +=1 if entry == nr_entries: break return bitmasklist PK[\!site-packages/procfs/__init__.pyonuȯ Yc@s4dZdZdZddlTddlTddlTdS(sp Copyright (c) 2008, 2009 Red Hat Inc. Abstractions to extract information from the Linux kernel /proc files. s*Arnaldo Carvalho de Melo s GPLv2 Licensei(t*N(t__doc__t __author__t __license__tprocfstsysctltutilist(((s3/usr/lib/python2.7/site-packages/procfs/__init__.pyts   PK[d site-packages/procfs/utilist.pycnuȯ Yc@sdZdZdS(cCsg}d}d}xft|D]X}||krB|d|>O}n|d7}|dkrd}|jd|d}qqW|dkr|dkr|jd|n|S(Niii (trangetinsert(tlt nr_entriest hexbitmasktbittmasktentry((s2/usr/lib/python2.7/site-packages/procfs/utilist.pyRs    cCs|jjdd}g}d}tt|dddd}xNt|D]@}t|d@ry|j|n|d7}||krSPqSqSW|S(Nt,tiiii(tstriptreplacetbintinttNonetreversedtappend(tlineRthexmaskt bitmasklistRtbitmaskti((s2/usr/lib/python2.7/site-packages/procfs/utilist.pyR's"  N(RR(((s2/usr/lib/python2.7/site-packages/procfs/utilist.pyts PK[site-packages/prettytable.pynu[#!/usr/bin/env python # # Copyright (c) 2009-2013, Luke Maurits # All rights reserved. # With contributions from: # * Chris Clark # * Klein Stephane # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright notice, # this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # * The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. __version__ = "0.7.2" import copy import csv import random import re import sys import textwrap import itertools import unicodedata py3k = sys.version_info[0] >= 3 if py3k: unicode = str basestring = str itermap = map iterzip = zip uni_chr = chr from html.parser import HTMLParser else: itermap = itertools.imap iterzip = itertools.izip uni_chr = unichr from HTMLParser import HTMLParser if py3k and sys.version_info[1] >= 2: from html import escape else: from cgi import escape # hrule styles FRAME = 0 ALL = 1 NONE = 2 HEADER = 3 # Table styles DEFAULT = 10 MSWORD_FRIENDLY = 11 PLAIN_COLUMNS = 12 RANDOM = 20 _re = re.compile("\033\[[0-9;]*m") def _get_size(text): lines = text.split("\n") height = len(lines) width = max([_str_block_width(line) for line in lines]) return (width, height) class PrettyTable(object): def __init__(self, field_names=None, **kwargs): """Return a new PrettyTable instance Arguments: encoding - Unicode encoding scheme used to decode any encoded input field_names - list or tuple of field names fields - list or tuple of field names to include in displays start - index of first data row to include in output end - index of last data row to include in output PLUS ONE (list slice style) header - print a header showing field names (True or False) header_style - stylisation to apply to field names in header ("cap", "title", "upper", "lower" or None) border - print a border around the table (True or False) hrules - controls printing of horizontal rules after rows. Allowed values: FRAME, HEADER, ALL, NONE vrules - controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE int_format - controls formatting of integer data float_format - controls formatting of floating point data padding_width - number of spaces on either side of column data (only used if left and right paddings are None) left_padding_width - number of spaces on left hand side of column data right_padding_width - number of spaces on right hand side of column data vertical_char - single character string used to draw vertical lines horizontal_char - single character string used to draw horizontal lines junction_char - single character string used to draw line junctions sortby - name of field to sort rows by sort_key - sorting key function, applied to data points before sorting valign - default valign for each row (None, "t", "m" or "b") reversesort - True or False to sort in descending or ascending order""" self.encoding = kwargs.get("encoding", "UTF-8") # Data self._field_names = [] self._align = {} self._valign = {} self._max_width = {} self._rows = [] if field_names: self.field_names = field_names else: self._widths = [] # Options self._options = "start end fields header border sortby reversesort sort_key attributes format hrules vrules".split() self._options.extend("int_format float_format padding_width left_padding_width right_padding_width".split()) self._options.extend("vertical_char horizontal_char junction_char header_style valign xhtml print_empty".split()) for option in self._options: if option in kwargs: self._validate_option(option, kwargs[option]) else: kwargs[option] = None self._start = kwargs["start"] or 0 self._end = kwargs["end"] or None self._fields = kwargs["fields"] or None if kwargs["header"] in (True, False): self._header = kwargs["header"] else: self._header = True self._header_style = kwargs["header_style"] or None if kwargs["border"] in (True, False): self._border = kwargs["border"] else: self._border = True self._hrules = kwargs["hrules"] or FRAME self._vrules = kwargs["vrules"] or ALL self._sortby = kwargs["sortby"] or None if kwargs["reversesort"] in (True, False): self._reversesort = kwargs["reversesort"] else: self._reversesort = False self._sort_key = kwargs["sort_key"] or (lambda x: x) self._int_format = kwargs["int_format"] or {} self._float_format = kwargs["float_format"] or {} self._padding_width = kwargs["padding_width"] or 1 self._left_padding_width = kwargs["left_padding_width"] or None self._right_padding_width = kwargs["right_padding_width"] or None self._vertical_char = kwargs["vertical_char"] or self._unicode("|") self._horizontal_char = kwargs["horizontal_char"] or self._unicode("-") self._junction_char = kwargs["junction_char"] or self._unicode("+") if kwargs["print_empty"] in (True, False): self._print_empty = kwargs["print_empty"] else: self._print_empty = True self._format = kwargs["format"] or False self._xhtml = kwargs["xhtml"] or False self._attributes = kwargs["attributes"] or {} def _unicode(self, value): if not isinstance(value, basestring): value = str(value) if not isinstance(value, unicode): value = unicode(value, self.encoding, "strict") return value def _justify(self, text, width, align): excess = width - _str_block_width(text) if align == "l": return text + excess * " " elif align == "r": return excess * " " + text else: if excess % 2: # Uneven padding # Put more space on right if text is of odd length... if _str_block_width(text) % 2: return (excess//2)*" " + text + (excess//2 + 1)*" " # and more space on left if text is of even length else: return (excess//2 + 1)*" " + text + (excess//2)*" " # Why distribute extra space this way? To match the behaviour of # the inbuilt str.center() method. else: # Equal padding on either side return (excess//2)*" " + text + (excess//2)*" " def __getattr__(self, name): if name == "rowcount": return len(self._rows) elif name == "colcount": if self._field_names: return len(self._field_names) elif self._rows: return len(self._rows[0]) else: return 0 else: raise AttributeError(name) def __getitem__(self, index): new = PrettyTable() new.field_names = self.field_names for attr in self._options: setattr(new, "_"+attr, getattr(self, "_"+attr)) setattr(new, "_align", getattr(self, "_align")) if isinstance(index, slice): for row in self._rows[index]: new.add_row(row) elif isinstance(index, int): new.add_row(self._rows[index]) else: raise Exception("Index %s is invalid, must be an integer or slice" % str(index)) return new if py3k: def __str__(self): return self.__unicode__() else: def __str__(self): return self.__unicode__().encode(self.encoding) def __unicode__(self): return self.get_string() ############################## # ATTRIBUTE VALIDATORS # ############################## # The method _validate_option is all that should be used elsewhere in the code base to validate options. # It will call the appropriate validation method for that option. The individual validation methods should # never need to be called directly (although nothing bad will happen if they *are*). # Validation happens in TWO places. # Firstly, in the property setters defined in the ATTRIBUTE MANAGMENT section. # Secondly, in the _get_options method, where keyword arguments are mixed with persistent settings def _validate_option(self, option, val): if option in ("field_names"): self._validate_field_names(val) elif option in ("start", "end", "max_width", "padding_width", "left_padding_width", "right_padding_width", "format"): self._validate_nonnegative_int(option, val) elif option in ("sortby"): self._validate_field_name(option, val) elif option in ("sort_key"): self._validate_function(option, val) elif option in ("hrules"): self._validate_hrules(option, val) elif option in ("vrules"): self._validate_vrules(option, val) elif option in ("fields"): self._validate_all_field_names(option, val) elif option in ("header", "border", "reversesort", "xhtml", "print_empty"): self._validate_true_or_false(option, val) elif option in ("header_style"): self._validate_header_style(val) elif option in ("int_format"): self._validate_int_format(option, val) elif option in ("float_format"): self._validate_float_format(option, val) elif option in ("vertical_char", "horizontal_char", "junction_char"): self._validate_single_char(option, val) elif option in ("attributes"): self._validate_attributes(option, val) else: raise Exception("Unrecognised option: %s!" % option) def _validate_field_names(self, val): # Check for appropriate length if self._field_names: try: assert len(val) == len(self._field_names) except AssertionError: raise Exception("Field name list has incorrect number of values, (actual) %d!=%d (expected)" % (len(val), len(self._field_names))) if self._rows: try: assert len(val) == len(self._rows[0]) except AssertionError: raise Exception("Field name list has incorrect number of values, (actual) %d!=%d (expected)" % (len(val), len(self._rows[0]))) # Check for uniqueness try: assert len(val) == len(set(val)) except AssertionError: raise Exception("Field names must be unique!") def _validate_header_style(self, val): try: assert val in ("cap", "title", "upper", "lower", None) except AssertionError: raise Exception("Invalid header style, use cap, title, upper, lower or None!") def _validate_align(self, val): try: assert val in ["l","c","r"] except AssertionError: raise Exception("Alignment %s is invalid, use l, c or r!" % val) def _validate_valign(self, val): try: assert val in ["t","m","b",None] except AssertionError: raise Exception("Alignment %s is invalid, use t, m, b or None!" % val) def _validate_nonnegative_int(self, name, val): try: assert int(val) >= 0 except AssertionError: raise Exception("Invalid value for %s: %s!" % (name, self._unicode(val))) def _validate_true_or_false(self, name, val): try: assert val in (True, False) except AssertionError: raise Exception("Invalid value for %s! Must be True or False." % name) def _validate_int_format(self, name, val): if val == "": return try: assert type(val) in (str, unicode) assert val.isdigit() except AssertionError: raise Exception("Invalid value for %s! Must be an integer format string." % name) def _validate_float_format(self, name, val): if val == "": return try: assert type(val) in (str, unicode) assert "." in val bits = val.split(".") assert len(bits) <= 2 assert bits[0] == "" or bits[0].isdigit() assert bits[1] == "" or bits[1].isdigit() except AssertionError: raise Exception("Invalid value for %s! Must be a float format string." % name) def _validate_function(self, name, val): try: assert hasattr(val, "__call__") except AssertionError: raise Exception("Invalid value for %s! Must be a function." % name) def _validate_hrules(self, name, val): try: assert val in (ALL, FRAME, HEADER, NONE) except AssertionError: raise Exception("Invalid value for %s! Must be ALL, FRAME, HEADER or NONE." % name) def _validate_vrules(self, name, val): try: assert val in (ALL, FRAME, NONE) except AssertionError: raise Exception("Invalid value for %s! Must be ALL, FRAME, or NONE." % name) def _validate_field_name(self, name, val): try: assert (val in self._field_names) or (val is None) except AssertionError: raise Exception("Invalid field name: %s!" % val) def _validate_all_field_names(self, name, val): try: for x in val: self._validate_field_name(name, x) except AssertionError: raise Exception("fields must be a sequence of field names!") def _validate_single_char(self, name, val): try: assert _str_block_width(val) == 1 except AssertionError: raise Exception("Invalid value for %s! Must be a string of length 1." % name) def _validate_attributes(self, name, val): try: assert isinstance(val, dict) except AssertionError: raise Exception("attributes must be a dictionary of name/value pairs!") ############################## # ATTRIBUTE MANAGEMENT # ############################## def _get_field_names(self): return self._field_names """The names of the fields Arguments: fields - list or tuple of field names""" def _set_field_names(self, val): val = [self._unicode(x) for x in val] self._validate_option("field_names", val) if self._field_names: old_names = self._field_names[:] self._field_names = val if self._align and old_names: for old_name, new_name in zip(old_names, val): self._align[new_name] = self._align[old_name] for old_name in old_names: if old_name not in self._align: self._align.pop(old_name) else: for field in self._field_names: self._align[field] = "c" if self._valign and old_names: for old_name, new_name in zip(old_names, val): self._valign[new_name] = self._valign[old_name] for old_name in old_names: if old_name not in self._valign: self._valign.pop(old_name) else: for field in self._field_names: self._valign[field] = "t" field_names = property(_get_field_names, _set_field_names) def _get_align(self): return self._align def _set_align(self, val): self._validate_align(val) for field in self._field_names: self._align[field] = val align = property(_get_align, _set_align) def _get_valign(self): return self._valign def _set_valign(self, val): self._validate_valign(val) for field in self._field_names: self._valign[field] = val valign = property(_get_valign, _set_valign) def _get_max_width(self): return self._max_width def _set_max_width(self, val): self._validate_option("max_width", val) for field in self._field_names: self._max_width[field] = val max_width = property(_get_max_width, _set_max_width) def _get_fields(self): """List or tuple of field names to include in displays Arguments: fields - list or tuple of field names to include in displays""" return self._fields def _set_fields(self, val): self._validate_option("fields", val) self._fields = val fields = property(_get_fields, _set_fields) def _get_start(self): """Start index of the range of rows to print Arguments: start - index of first data row to include in output""" return self._start def _set_start(self, val): self._validate_option("start", val) self._start = val start = property(_get_start, _set_start) def _get_end(self): """End index of the range of rows to print Arguments: end - index of last data row to include in output PLUS ONE (list slice style)""" return self._end def _set_end(self, val): self._validate_option("end", val) self._end = val end = property(_get_end, _set_end) def _get_sortby(self): """Name of field by which to sort rows Arguments: sortby - field name to sort by""" return self._sortby def _set_sortby(self, val): self._validate_option("sortby", val) self._sortby = val sortby = property(_get_sortby, _set_sortby) def _get_reversesort(self): """Controls direction of sorting (ascending vs descending) Arguments: reveresort - set to True to sort by descending order, or False to sort by ascending order""" return self._reversesort def _set_reversesort(self, val): self._validate_option("reversesort", val) self._reversesort = val reversesort = property(_get_reversesort, _set_reversesort) def _get_sort_key(self): """Sorting key function, applied to data points before sorting Arguments: sort_key - a function which takes one argument and returns something to be sorted""" return self._sort_key def _set_sort_key(self, val): self._validate_option("sort_key", val) self._sort_key = val sort_key = property(_get_sort_key, _set_sort_key) def _get_header(self): """Controls printing of table header with field names Arguments: header - print a header showing field names (True or False)""" return self._header def _set_header(self, val): self._validate_option("header", val) self._header = val header = property(_get_header, _set_header) def _get_header_style(self): """Controls stylisation applied to field names in header Arguments: header_style - stylisation to apply to field names in header ("cap", "title", "upper", "lower" or None)""" return self._header_style def _set_header_style(self, val): self._validate_header_style(val) self._header_style = val header_style = property(_get_header_style, _set_header_style) def _get_border(self): """Controls printing of border around table Arguments: border - print a border around the table (True or False)""" return self._border def _set_border(self, val): self._validate_option("border", val) self._border = val border = property(_get_border, _set_border) def _get_hrules(self): """Controls printing of horizontal rules after rows Arguments: hrules - horizontal rules style. Allowed values: FRAME, ALL, HEADER, NONE""" return self._hrules def _set_hrules(self, val): self._validate_option("hrules", val) self._hrules = val hrules = property(_get_hrules, _set_hrules) def _get_vrules(self): """Controls printing of vertical rules between columns Arguments: vrules - vertical rules style. Allowed values: FRAME, ALL, NONE""" return self._vrules def _set_vrules(self, val): self._validate_option("vrules", val) self._vrules = val vrules = property(_get_vrules, _set_vrules) def _get_int_format(self): """Controls formatting of integer data Arguments: int_format - integer format string""" return self._int_format def _set_int_format(self, val): # self._validate_option("int_format", val) for field in self._field_names: self._int_format[field] = val int_format = property(_get_int_format, _set_int_format) def _get_float_format(self): """Controls formatting of floating point data Arguments: float_format - floating point format string""" return self._float_format def _set_float_format(self, val): # self._validate_option("float_format", val) for field in self._field_names: self._float_format[field] = val float_format = property(_get_float_format, _set_float_format) def _get_padding_width(self): """The number of empty spaces between a column's edge and its content Arguments: padding_width - number of spaces, must be a positive integer""" return self._padding_width def _set_padding_width(self, val): self._validate_option("padding_width", val) self._padding_width = val padding_width = property(_get_padding_width, _set_padding_width) def _get_left_padding_width(self): """The number of empty spaces between a column's left edge and its content Arguments: left_padding - number of spaces, must be a positive integer""" return self._left_padding_width def _set_left_padding_width(self, val): self._validate_option("left_padding_width", val) self._left_padding_width = val left_padding_width = property(_get_left_padding_width, _set_left_padding_width) def _get_right_padding_width(self): """The number of empty spaces between a column's right edge and its content Arguments: right_padding - number of spaces, must be a positive integer""" return self._right_padding_width def _set_right_padding_width(self, val): self._validate_option("right_padding_width", val) self._right_padding_width = val right_padding_width = property(_get_right_padding_width, _set_right_padding_width) def _get_vertical_char(self): """The charcter used when printing table borders to draw vertical lines Arguments: vertical_char - single character string used to draw vertical lines""" return self._vertical_char def _set_vertical_char(self, val): val = self._unicode(val) self._validate_option("vertical_char", val) self._vertical_char = val vertical_char = property(_get_vertical_char, _set_vertical_char) def _get_horizontal_char(self): """The charcter used when printing table borders to draw horizontal lines Arguments: horizontal_char - single character string used to draw horizontal lines""" return self._horizontal_char def _set_horizontal_char(self, val): val = self._unicode(val) self._validate_option("horizontal_char", val) self._horizontal_char = val horizontal_char = property(_get_horizontal_char, _set_horizontal_char) def _get_junction_char(self): """The charcter used when printing table borders to draw line junctions Arguments: junction_char - single character string used to draw line junctions""" return self._junction_char def _set_junction_char(self, val): val = self._unicode(val) self._validate_option("vertical_char", val) self._junction_char = val junction_char = property(_get_junction_char, _set_junction_char) def _get_format(self): """Controls whether or not HTML tables are formatted to match styling options Arguments: format - True or False""" return self._format def _set_format(self, val): self._validate_option("format", val) self._format = val format = property(_get_format, _set_format) def _get_print_empty(self): """Controls whether or not empty tables produce a header and frame or just an empty string Arguments: print_empty - True or False""" return self._print_empty def _set_print_empty(self, val): self._validate_option("print_empty", val) self._print_empty = val print_empty = property(_get_print_empty, _set_print_empty) def _get_attributes(self): """A dictionary of HTML attribute name/value pairs to be included in the tag when printing HTML Arguments: attributes - dictionary of attributes""" return self._attributes def _set_attributes(self, val): self._validate_option("attributes", val) self._attributes = val attributes = property(_get_attributes, _set_attributes) ############################## # OPTION MIXER # ############################## def _get_options(self, kwargs): options = {} for option in self._options: if option in kwargs: self._validate_option(option, kwargs[option]) options[option] = kwargs[option] else: options[option] = getattr(self, "_"+option) return options ############################## # PRESET STYLE LOGIC # ############################## def set_style(self, style): if style == DEFAULT: self._set_default_style() elif style == MSWORD_FRIENDLY: self._set_msword_style() elif style == PLAIN_COLUMNS: self._set_columns_style() elif style == RANDOM: self._set_random_style() else: raise Exception("Invalid pre-set style!") def _set_default_style(self): self.header = True self.border = True self._hrules = FRAME self._vrules = ALL self.padding_width = 1 self.left_padding_width = 1 self.right_padding_width = 1 self.vertical_char = "|" self.horizontal_char = "-" self.junction_char = "+" def _set_msword_style(self): self.header = True self.border = True self._hrules = NONE self.padding_width = 1 self.left_padding_width = 1 self.right_padding_width = 1 self.vertical_char = "|" def _set_columns_style(self): self.header = True self.border = False self.padding_width = 1 self.left_padding_width = 0 self.right_padding_width = 8 def _set_random_style(self): # Just for fun! self.header = random.choice((True, False)) self.border = random.choice((True, False)) self._hrules = random.choice((ALL, FRAME, HEADER, NONE)) self._vrules = random.choice((ALL, FRAME, NONE)) self.left_padding_width = random.randint(0,5) self.right_padding_width = random.randint(0,5) self.vertical_char = random.choice("~!@#$%^&*()_+|-=\{}[];':\",./;<>?") self.horizontal_char = random.choice("~!@#$%^&*()_+|-=\{}[];':\",./;<>?") self.junction_char = random.choice("~!@#$%^&*()_+|-=\{}[];':\",./;<>?") ############################## # DATA INPUT METHODS # ############################## def add_row(self, row): """Add a row to the table Arguments: row - row of data, should be a list with as many elements as the table has fields""" if self._field_names and len(row) != len(self._field_names): raise Exception("Row has incorrect number of values, (actual) %d!=%d (expected)" %(len(row),len(self._field_names))) if not self._field_names: self.field_names = [("Field %d" % (n+1)) for n in range(0,len(row))] self._rows.append(list(row)) def del_row(self, row_index): """Delete a row to the table Arguments: row_index - The index of the row you want to delete. Indexing starts at 0.""" if row_index > len(self._rows)-1: raise Exception("Cant delete row at index %d, table only has %d rows!" % (row_index, len(self._rows))) del self._rows[row_index] def add_column(self, fieldname, column, align="c", valign="t"): """Add a column to the table. Arguments: fieldname - name of the field to contain the new column of data column - column of data, should be a list with as many elements as the table has rows align - desired alignment for this column - "l" for left, "c" for centre and "r" for right valign - desired vertical alignment for new columns - "t" for top, "m" for middle and "b" for bottom""" if len(self._rows) in (0, len(column)): self._validate_align(align) self._validate_valign(valign) self._field_names.append(fieldname) self._align[fieldname] = align self._valign[fieldname] = valign for i in range(0, len(column)): if len(self._rows) < i+1: self._rows.append([]) self._rows[i].append(column[i]) else: raise Exception("Column length %d does not match number of rows %d!" % (len(column), len(self._rows))) def clear_rows(self): """Delete all rows from the table but keep the current field names""" self._rows = [] def clear(self): """Delete all rows and field names from the table, maintaining nothing but styling options""" self._rows = [] self._field_names = [] self._widths = [] ############################## # MISC PUBLIC METHODS # ############################## def copy(self): return copy.deepcopy(self) ############################## # MISC PRIVATE METHODS # ############################## def _format_value(self, field, value): if isinstance(value, int) and field in self._int_format: value = self._unicode(("%%%sd" % self._int_format[field]) % value) elif isinstance(value, float) and field in self._float_format: value = self._unicode(("%%%sf" % self._float_format[field]) % value) return self._unicode(value) def _compute_widths(self, rows, options): if options["header"]: widths = [_get_size(field)[0] for field in self._field_names] else: widths = len(self.field_names) * [0] for row in rows: for index, value in enumerate(row): fieldname = self.field_names[index] if fieldname in self.max_width: widths[index] = max(widths[index], min(_get_size(value)[0], self.max_width[fieldname])) else: widths[index] = max(widths[index], _get_size(value)[0]) self._widths = widths def _get_padding_widths(self, options): if options["left_padding_width"] is not None: lpad = options["left_padding_width"] else: lpad = options["padding_width"] if options["right_padding_width"] is not None: rpad = options["right_padding_width"] else: rpad = options["padding_width"] return lpad, rpad def _get_rows(self, options): """Return only those data rows that should be printed, based on slicing and sorting. Arguments: options - dictionary of option settings.""" # Make a copy of only those rows in the slice range rows = copy.deepcopy(self._rows[options["start"]:options["end"]]) # Sort if necessary if options["sortby"]: sortindex = self._field_names.index(options["sortby"]) # Decorate rows = [[row[sortindex]]+row for row in rows] # Sort rows.sort(reverse=options["reversesort"], key=options["sort_key"]) # Undecorate rows = [row[1:] for row in rows] return rows def _format_row(self, row, options): return [self._format_value(field, value) for (field, value) in zip(self._field_names, row)] def _format_rows(self, rows, options): return [self._format_row(row, options) for row in rows] ############################## # PLAIN TEXT STRING METHODS # ############################## def get_string(self, **kwargs): """Return string representation of table in current state. Arguments: start - index of first data row to include in output end - index of last data row to include in output PLUS ONE (list slice style) fields - names of fields (columns) to include header - print a header showing field names (True or False) border - print a border around the table (True or False) hrules - controls printing of horizontal rules after rows. Allowed values: ALL, FRAME, HEADER, NONE vrules - controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE int_format - controls formatting of integer data float_format - controls formatting of floating point data padding_width - number of spaces on either side of column data (only used if left and right paddings are None) left_padding_width - number of spaces on left hand side of column data right_padding_width - number of spaces on right hand side of column data vertical_char - single character string used to draw vertical lines horizontal_char - single character string used to draw horizontal lines junction_char - single character string used to draw line junctions sortby - name of field to sort rows by sort_key - sorting key function, applied to data points before sorting reversesort - True or False to sort in descending or ascending order print empty - if True, stringify just the header for an empty table, if False return an empty string """ options = self._get_options(kwargs) lines = [] # Don't think too hard about an empty table # Is this the desired behaviour? Maybe we should still print the header? if self.rowcount == 0 and (not options["print_empty"] or not options["border"]): return "" # Get the rows we need to print, taking into account slicing, sorting, etc. rows = self._get_rows(options) # Turn all data in all rows into Unicode, formatted as desired formatted_rows = self._format_rows(rows, options) # Compute column widths self._compute_widths(formatted_rows, options) # Add header or top of border self._hrule = self._stringify_hrule(options) if options["header"]: lines.append(self._stringify_header(options)) elif options["border"] and options["hrules"] in (ALL, FRAME): lines.append(self._hrule) # Add rows for row in formatted_rows: lines.append(self._stringify_row(row, options)) # Add bottom of border if options["border"] and options["hrules"] == FRAME: lines.append(self._hrule) return self._unicode("\n").join(lines) def _stringify_hrule(self, options): if not options["border"]: return "" lpad, rpad = self._get_padding_widths(options) if options['vrules'] in (ALL, FRAME): bits = [options["junction_char"]] else: bits = [options["horizontal_char"]] # For tables with no data or fieldnames if not self._field_names: bits.append(options["junction_char"]) return "".join(bits) for field, width in zip(self._field_names, self._widths): if options["fields"] and field not in options["fields"]: continue bits.append((width+lpad+rpad)*options["horizontal_char"]) if options['vrules'] == ALL: bits.append(options["junction_char"]) else: bits.append(options["horizontal_char"]) if options["vrules"] == FRAME: bits.pop() bits.append(options["junction_char"]) return "".join(bits) def _stringify_header(self, options): bits = [] lpad, rpad = self._get_padding_widths(options) if options["border"]: if options["hrules"] in (ALL, FRAME): bits.append(self._hrule) bits.append("\n") if options["vrules"] in (ALL, FRAME): bits.append(options["vertical_char"]) else: bits.append(" ") # For tables with no data or field names if not self._field_names: if options["vrules"] in (ALL, FRAME): bits.append(options["vertical_char"]) else: bits.append(" ") for field, width, in zip(self._field_names, self._widths): if options["fields"] and field not in options["fields"]: continue if self._header_style == "cap": fieldname = field.capitalize() elif self._header_style == "title": fieldname = field.title() elif self._header_style == "upper": fieldname = field.upper() elif self._header_style == "lower": fieldname = field.lower() else: fieldname = field bits.append(" " * lpad + self._justify(fieldname, width, self._align[field]) + " " * rpad) if options["border"]: if options["vrules"] == ALL: bits.append(options["vertical_char"]) else: bits.append(" ") # If vrules is FRAME, then we just appended a space at the end # of the last field, when we really want a vertical character if options["border"] and options["vrules"] == FRAME: bits.pop() bits.append(options["vertical_char"]) if options["border"] and options["hrules"] != NONE: bits.append("\n") bits.append(self._hrule) return "".join(bits) def _stringify_row(self, row, options): for index, field, value, width, in zip(range(0,len(row)), self._field_names, row, self._widths): # Enforce max widths lines = value.split("\n") new_lines = [] for line in lines: if _str_block_width(line) > width: line = textwrap.fill(line, width) new_lines.append(line) lines = new_lines value = "\n".join(lines) row[index] = value row_height = 0 for c in row: h = _get_size(c)[1] if h > row_height: row_height = h bits = [] lpad, rpad = self._get_padding_widths(options) for y in range(0, row_height): bits.append([]) if options["border"]: if options["vrules"] in (ALL, FRAME): bits[y].append(self.vertical_char) else: bits[y].append(" ") for field, value, width, in zip(self._field_names, row, self._widths): valign = self._valign[field] lines = value.split("\n") dHeight = row_height - len(lines) if dHeight: if valign == "m": lines = [""] * int(dHeight / 2) + lines + [""] * (dHeight - int(dHeight / 2)) elif valign == "b": lines = [""] * dHeight + lines else: lines = lines + [""] * dHeight y = 0 for l in lines: if options["fields"] and field not in options["fields"]: continue bits[y].append(" " * lpad + self._justify(l, width, self._align[field]) + " " * rpad) if options["border"]: if options["vrules"] == ALL: bits[y].append(self.vertical_char) else: bits[y].append(" ") y += 1 # If vrules is FRAME, then we just appended a space at the end # of the last field, when we really want a vertical character for y in range(0, row_height): if options["border"] and options["vrules"] == FRAME: bits[y].pop() bits[y].append(options["vertical_char"]) if options["border"] and options["hrules"]== ALL: bits[row_height-1].append("\n") bits[row_height-1].append(self._hrule) for y in range(0, row_height): bits[y] = "".join(bits[y]) return "\n".join(bits) ############################## # HTML STRING METHODS # ############################## def get_html_string(self, **kwargs): """Return string representation of HTML formatted version of table in current state. Arguments: start - index of first data row to include in output end - index of last data row to include in output PLUS ONE (list slice style) fields - names of fields (columns) to include header - print a header showing field names (True or False) border - print a border around the table (True or False) hrules - controls printing of horizontal rules after rows. Allowed values: ALL, FRAME, HEADER, NONE vrules - controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE int_format - controls formatting of integer data float_format - controls formatting of floating point data padding_width - number of spaces on either side of column data (only used if left and right paddings are None) left_padding_width - number of spaces on left hand side of column data right_padding_width - number of spaces on right hand side of column data sortby - name of field to sort rows by sort_key - sorting key function, applied to data points before sorting attributes - dictionary of name/value pairs to include as HTML attributes in the
tag xhtml - print
tags if True,
tags if false""" options = self._get_options(kwargs) if options["format"]: string = self._get_formatted_html_string(options) else: string = self._get_simple_html_string(options) return string def _get_simple_html_string(self, options): lines = [] if options["xhtml"]: linebreak = "
" else: linebreak = "
" open_tag = [] open_tag.append("") lines.append("".join(open_tag)) # Headers if options["header"]: lines.append(" ") for field in self._field_names: if options["fields"] and field not in options["fields"]: continue lines.append(" " % escape(field).replace("\n", linebreak)) lines.append(" ") # Data rows = self._get_rows(options) formatted_rows = self._format_rows(rows, options) for row in formatted_rows: lines.append(" ") for field, datum in zip(self._field_names, row): if options["fields"] and field not in options["fields"]: continue lines.append(" " % escape(datum).replace("\n", linebreak)) lines.append(" ") lines.append("
%s
%s
") return self._unicode("\n").join(lines) def _get_formatted_html_string(self, options): lines = [] lpad, rpad = self._get_padding_widths(options) if options["xhtml"]: linebreak = "
" else: linebreak = "
" open_tag = [] open_tag.append("") lines.append("".join(open_tag)) # Headers if options["header"]: lines.append(" ") for field in self._field_names: if options["fields"] and field not in options["fields"]: continue lines.append(" %s" % (lpad, rpad, escape(field).replace("\n", linebreak))) lines.append(" ") # Data rows = self._get_rows(options) formatted_rows = self._format_rows(rows, options) aligns = [] valigns = [] for field in self._field_names: aligns.append({ "l" : "left", "r" : "right", "c" : "center" }[self._align[field]]) valigns.append({"t" : "top", "m" : "middle", "b" : "bottom"}[self._valign[field]]) for row in formatted_rows: lines.append(" ") for field, datum, align, valign in zip(self._field_names, row, aligns, valigns): if options["fields"] and field not in options["fields"]: continue lines.append(" %s" % (lpad, rpad, align, valign, escape(datum).replace("\n", linebreak))) lines.append(" ") lines.append("") return self._unicode("\n").join(lines) ############################## # UNICODE WIDTH FUNCTIONS # ############################## def _char_block_width(char): # Basic Latin, which is probably the most common case #if char in xrange(0x0021, 0x007e): #if char >= 0x0021 and char <= 0x007e: if 0x0021 <= char <= 0x007e: return 1 # Chinese, Japanese, Korean (common) if 0x4e00 <= char <= 0x9fff: return 2 # Hangul if 0xac00 <= char <= 0xd7af: return 2 # Combining? if unicodedata.combining(uni_chr(char)): return 0 # Hiragana and Katakana if 0x3040 <= char <= 0x309f or 0x30a0 <= char <= 0x30ff: return 2 # Full-width Latin characters if 0xff01 <= char <= 0xff60: return 2 # CJK punctuation if 0x3000 <= char <= 0x303e: return 2 # Backspace and delete if char in (0x0008, 0x007f): return -1 # Other control characters elif char in (0x0000, 0x001f): return 0 # Take a guess return 1 def _str_block_width(val): return sum(itermap(_char_block_width, itermap(ord, _re.sub("", val)))) ############################## # TABLE FACTORIES # ############################## def from_csv(fp, field_names = None, **kwargs): dialect = csv.Sniffer().sniff(fp.read(1024)) fp.seek(0) reader = csv.reader(fp, dialect) table = PrettyTable(**kwargs) if field_names: table.field_names = field_names else: if py3k: table.field_names = [x.strip() for x in next(reader)] else: table.field_names = [x.strip() for x in reader.next()] for row in reader: table.add_row([x.strip() for x in row]) return table def from_db_cursor(cursor, **kwargs): if cursor.description: table = PrettyTable(**kwargs) table.field_names = [col[0] for col in cursor.description] for row in cursor.fetchall(): table.add_row(row) return table class TableHandler(HTMLParser): def __init__(self, **kwargs): HTMLParser.__init__(self) self.kwargs = kwargs self.tables = [] self.last_row = [] self.rows = [] self.max_row_width = 0 self.active = None self.last_content = "" self.is_last_row_header = False def handle_starttag(self,tag, attrs): self.active = tag if tag == "th": self.is_last_row_header = True def handle_endtag(self,tag): if tag in ["th", "td"]: stripped_content = self.last_content.strip() self.last_row.append(stripped_content) if tag == "tr": self.rows.append( (self.last_row, self.is_last_row_header)) self.max_row_width = max(self.max_row_width, len(self.last_row)) self.last_row = [] self.is_last_row_header = False if tag == "table": table = self.generate_table(self.rows) self.tables.append(table) self.rows = [] self.last_content = " " self.active = None def handle_data(self, data): self.last_content += data def generate_table(self, rows): """ Generates from a list of rows a PrettyTable object. """ table = PrettyTable(**self.kwargs) for row in self.rows: if len(row[0]) < self.max_row_width: appends = self.max_row_width - len(row[0]) for i in range(1,appends): row[0].append("-") if row[1] == True: self.make_fields_unique(row[0]) table.field_names = row[0] else: table.add_row(row[0]) return table def make_fields_unique(self, fields): """ iterates over the row and make each field unique """ for i in range(0, len(fields)): for j in range(i+1, len(fields)): if fields[i] == fields[j]: fields[j] += "'" def from_html(html_code, **kwargs): """ Generates a list of PrettyTables from a string of HTML code. Each in the HTML becomes one PrettyTable object. """ parser = TableHandler(**kwargs) parser.feed(html_code) return parser.tables def from_html_one(html_code, **kwargs): """ Generates a PrettyTables from a string of HTML code which contains only a single
""" tables = from_html(html_code, **kwargs) try: assert len(tables) == 1 except AssertionError: raise Exception("More than one
in provided HTML code! Use from_html instead.") return tables[0] ############################## # MAIN (TEST FUNCTION) # ############################## def main(): x = PrettyTable(["City name", "Area", "Population", "Annual Rainfall"]) x.sortby = "Population" x.reversesort = True x.int_format["Area"] = "04d" x.float_format = "6.1f" x.align["City name"] = "l" # Left align city names x.add_row(["Adelaide", 1295, 1158259, 600.5]) x.add_row(["Brisbane", 5905, 1857594, 1146.4]) x.add_row(["Darwin", 112, 120900, 1714.7]) x.add_row(["Hobart", 1357, 205556, 619.5]) x.add_row(["Sydney", 2058, 4336374, 1214.8]) x.add_row(["Melbourne", 1566, 3806092, 646.9]) x.add_row(["Perth", 5386, 1554769, 869.4]) print(x) if __name__ == "__main__": main() PK['M'M'%site-packages/IPy-0.75-py2.7.egg-infonu[Metadata-Version: 1.1 Name: IPy Version: 0.75 Summary: Class and tools for handling of IPv4 and IPv6 addresses and networks Home-page: https://github.com/haypo/python-ipy Author: Victor Stinner Author-email: victor.stinner AT haypocalc.com License: BSD License Download-URL: https://github.com/haypo/python-ipy Description: IPy - class and tools for handling of IPv4 and IPv6 addresses and networks. Website: https://github.com/haypo/python-ipy/ Presentation of the API ======================= The IP class allows a comfortable parsing and handling for most notations in use for IPv4 and IPv6 addresses and networks. It was greatly inspired by RIPE's Perl module NET::IP's interface but doesn't share the implementation. It doesn't share non-CIDR netmasks, so funky stuff like a netmask of 0xffffff0f can't be done here. >>> from IPy import IP >>> ip = IP('127.0.0.0/30') >>> for x in ip: ... print(x) ... 127.0.0.0 127.0.0.1 127.0.0.2 127.0.0.3 >>> ip2 = IP('0x7f000000/30') >>> ip == ip2 1 >>> ip.reverseNames() ['0.0.0.127.in-addr.arpa.', '1.0.0.127.in-addr.arpa.', '2.0.0.127.in-addr.arpa.', '3.0.0.127.in-addr.arpa.'] >>> ip.reverseName() '0-3.0.0.127.in-addr.arpa.' >>> ip.iptype() 'PRIVATE' Supports most IP address formats ================================ It can detect about a dozen different ways of expressing IP addresses and networks, parse them and distinguish between IPv4 and IPv6 addresses: >>> IP('10.0.0.0/8').version() 4 >>> IP('::1').version() 6 IPv4 addresses -------------- >>> print(IP(0x7f000001)) 127.0.0.1 >>> print(IP('0x7f000001')) 127.0.0.1 >>> print(IP('127.0.0.1')) 127.0.0.1 >>> print(IP('10')) 10.0.0.0 IPv6 addresses -------------- >>> print(IP('1080:0:0:0:8:800:200C:417A')) 1080::8:800:200c:417a >>> print(IP('1080::8:800:200C:417A')) 1080::8:800:200c:417a >>> print(IP('::1')) ::1 >>> print(IP('::13.1.68.3')) ::d01:4403 Network mask and prefixes ------------------------- >>> print(IP('127.0.0.0/8')) 127.0.0.0/8 >>> print(IP('127.0.0.0/255.0.0.0')) 127.0.0.0/8 >>> print(IP('127.0.0.0-127.255.255.255')) 127.0.0.0/8 Derive network address =========================== IPy can transform an IP address into a network address by applying the given netmask: >>> print(IP('127.0.0.1/255.0.0.0', make_net=True)) 127.0.0.0/8 This can also be done for existing IP instances: >>> print(IP('127.0.0.1').make_net('255.0.0.0')) 127.0.0.0/8 Convert address to string ========================= Nearly all class methods which return a string have an optional parameter 'wantprefixlen' which controls if the prefixlen or netmask is printed. Per default the prefilen is always shown if the network contains more than one address:: wantprefixlen == 0 / None don't return anything 1.2.3.0 wantprefixlen == 1 /prefix 1.2.3.0/24 wantprefixlen == 2 /netmask 1.2.3.0/255.255.255.0 wantprefixlen == 3 -lastip 1.2.3.0-1.2.3.255 You can also change the defaults on an per-object basis by fiddling with the class members: * NoPrefixForSingleIp * WantPrefixLen Examples of string conversions: >>> IP('10.0.0.0/32').strNormal() '10.0.0.0' >>> IP('10.0.0.0/24').strNormal() '10.0.0.0/24' >>> IP('10.0.0.0/24').strNormal(0) '10.0.0.0' >>> IP('10.0.0.0/24').strNormal(1) '10.0.0.0/24' >>> IP('10.0.0.0/24').strNormal(2) '10.0.0.0/255.255.255.0' >>> IP('10.0.0.0/24').strNormal(3) '10.0.0.0-10.0.0.255' >>> ip = IP('10.0.0.0') >>> print(ip) 10.0.0.0 >>> ip.NoPrefixForSingleIp = None >>> print(ip) 10.0.0.0/32 >>> ip.WantPrefixLen = 3 >>> print(ip) 10.0.0.0-10.0.0.0 Compatibility and links ======================= IPy 0.73 works on Python version 2.5-2.7. This Python module is under BSD license: see COPYING file. Further Information might be available at: https://github.com/haypo/python-ipy TODO ==== * better comparison (__cmp__ and friends) * tests for __cmp__ * always write hex values lowercase * interpret 2001:1234:5678:1234/64 as 2001:1234:5678:1234::/64 * move size in bits into class variables to get rid of some "if self._ipversion ..." * support for base85 encoding * support for output of IPv6 encoded IPv4 Addresses * update address type tables * first-last notation should be allowed for IPv6 * add IPv6 docstring examples * check better for negative parameters * add addition / aggregation * move reverse name stuff out of the classes and refactor it * support for aggregation of more than two nets at once * support for aggregation with "holes" * support for finding common prefix * '>>' and '<<' for prefix manipulation * add our own exceptions instead ValueError all the time * rename checkPrefix to checkPrefixOk * add more documentation and doctests * refactor What's new ========== Version 0.75 (2011-04-12) ------------------------- * IP('::/0').netmask() gives IP('::') instead of IP('0.0.0.0') Version 0.74 (2011-02-16) ------------------------- * Fix tests for Python 3.1 and 3.2 * ip.__nonzero__() and (ipa in ipb) return a bool instead of 0 or 1 * IP('0.0.0.0/0') + IP('0.0.0.0/0') raises an error, fix written by Arfrever Version 0.73 (2011-02-15) ------------------------- * Support Python 3: setup.py runs 2to3 * Update the ranges for IPv6 IPs * Fix reverseName() and reverseNames() for IPv4 in IPv6 addresses * Drop support of Python < 2.5 Version 0.72 (2010-11-23) ------------------------- * Include examples and MANIFEST.in in source build (add them to MANIFEST.in) * Remove __rcsid__ constant from IPy module Version 0.71 (2010-10-01) ------------------------- * Use xrange() instead of range() * Use isinstance(x, int) instead of type(x) == types.IntType * Prepare support of Python3 (use integer division: x // y) * Fix IP(long) constructor: ensure that the address is not too large * Constructor raise a TypeError if the type is not int, long, str or unicode * 223.0.0.0/8 is now public (belongs to APNIC) Version 0.70 (2009-10-29) ------------------------- * New "major" version because it may break compatibility * Fix __cmp__(): IP('0.0.0.0/0') and IP('0.0.0.0') are not equal * Fix IP.net() of the network "::/0": "::" instead of "0.0.0.0". IPy 0.63 should fix this bug, but it wasn't. Version 0.64 (2009-08-19) ------------------------- * Create MANIFEST.in to fix setup.py bdist_rpm, fix by Robert Nickel Version 0.63 (2009-06-23) ------------------------- * Fix formatting of "IPv4 in IPv6" network, eg. IP('::ffff:192.168.10.0/120'), the netmask ("/120" in the example) was missing! Version 0.62 (2008-07-15) ------------------------- * Fix reverse DNS of IPv6 address: use ".ip6.arpa." suffix instead of deprecated ".ip6.int." suffix Version 0.61 (2008-06-12) ------------------------- * Patch from Aras Vaichas allowing the [-1] operator to work with an IP object of size 1. Version 0.60 (2008-05-16) ------------------------- * strCompressed() formats '::ffff:a.b.c.d' correctly * Use strCompressed() instead of strFullsize() to format IP addresses, ouput is smarter with IPv6 address * Remove check_addr_prefixlen because it generates invalid IP address Keywords: ipv4 ipv6 netmask Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: System Administrators Classifier: Environment :: Plugins Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Communications Classifier: Topic :: Internet Classifier: Topic :: System :: Networking Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Natural Language :: English Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 PK[/,site-packages/pyparsing-1.5.6-py2.7.egg-infonu[Metadata-Version: 1.1 Name: pyparsing Version: 1.5.6 Summary: Python parsing module Home-page: http://pyparsing.wikispaces.com/ Author: Paul McGuire Author-email: ptmcg@users.sourceforge.net License: MIT License Download-URL: http://sourceforge.net/project/showfiles.php?group_id=97203 Description: UNKNOWN Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Information Technology Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 PK[q$site-packages/backports/__init__.pycnu[ iTc@s#ddlmZeeeZdS(i(t extend_pathN(tpkgutilRt__path__t__name__(((s6/usr/lib/python2.7/site-packages/backports/__init__.pytsPK[G,""7site-packages/backports/ssl_match_hostname/__init__.pycnu[ uVc@sdZddlZddlZyddlZWnek rGdZnXdZdefdYZddZ dZ d Z d Z dS( sJThe match_hostname() function from Python 3.3.3, essential when using SSL.iNs3.5.0.1tCertificateErrorcBseZRS((t__name__t __module__(((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyRsic CsRg}|stS|jd}|d}|d}|jd}||krgtdt|n|s|j|jkS|dkr|jdnY|jds|jdr|jtj |n"|jtj |j dd x$|D]}|jtj |qWtj d d j |d tj } | j|S( shMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 t.iit*s,too many wildcards in certificate DNS name: s[^.]+sxn--s\*s[^.]*s\As\.s\Z(tFalsetsplittcountRtreprtlowertappendt startswithtretescapetreplacetcompiletjoint IGNORECASEtmatch( tdnthostnamet max_wildcardstpatstpartstleftmostt remaindert wildcardstfragtpat((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyt_dnsname_matchs*    " &cCs=t|tr9tjdkr9t|dddd}n|S(Nitencodingtasciiterrorststrict(i(t isinstancetstrtsyst version_infotunicode(tobj((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyt _to_unicodeLscCs%tjt|j}||kS(sExact matching of IP addresses. RFC 6125 explicitly doesn't define an algorithm for this (section 1.7.2 - "Out of Scope"). (t ipaddresst ip_addressR(trstrip(tipnamethost_iptip((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyt_ipaddress_matchQscCs|stdnytjt|}WnUtk rGd}n?tk r]d}n)tk rtdkrd}qnXg}|jdd}x|D]\}}|dkr|dkrt||rdS|j |q|dkr|dk rt ||rdS|j |qqW|sxc|jddD]L}xC|D];\}}|dkrQt||r|dS|j |qQqQWqDWnt |dkrt d |d j tt|fn;t |dkrt d ||d fn t d dS(s)Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. stempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDtsubjectAltNametDNSNs IP Addresstsubjectt commonNameis&hostname %r doesn't match either of %ss, shostname %r doesn't match %ris=no appropriate commonName or subjectAltName fields were found(((t ValueErrorR)R*R(tNonet UnicodeErrortAttributeErrortgetRR R/tlenRRtmapR(tcertRR-tdnsnamestsantkeytvaluetsub((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pytmatch_hostname]sJ          %( t__doc__R R$R)t ImportErrorR5t __version__R4RRR(R/RA(((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyts     5  PK[6site-packages/backports/ssl_match_hostname/__init__.pynu["""The match_hostname() function from Python 3.3.3, essential when using SSL.""" import re import sys # ipaddress has been backported to 2.6+ in pypi. If it is installed on the # system, use it to handle IPAddress ServerAltnames (this was added in # python-3.5) otherwise only do DNS matching. This allows # backports.ssl_match_hostname to continue to be used all the way back to # python-2.4. try: import ipaddress except ImportError: ipaddress = None __version__ = '3.5.0.1' class CertificateError(ValueError): pass def _dnsname_match(dn, hostname, max_wildcards=1): """Matching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 """ pats = [] if not dn: return False # Ported from python3-syntax: # leftmost, *remainder = dn.split(r'.') parts = dn.split(r'.') leftmost = parts[0] remainder = parts[1:] wildcards = leftmost.count('*') if wildcards > max_wildcards: # Issue #17980: avoid denials of service by refusing more # than one wildcard per fragment. A survey of established # policy among SSL implementations showed it to be a # reasonable choice. raise CertificateError( "too many wildcards in certificate DNS name: " + repr(dn)) # speed up common case w/o wildcards if not wildcards: return dn.lower() == hostname.lower() # RFC 6125, section 6.4.3, subitem 1. # The client SHOULD NOT attempt to match a presented identifier in which # the wildcard character comprises a label other than the left-most label. if leftmost == '*': # When '*' is a fragment by itself, it matches a non-empty dotless # fragment. pats.append('[^.]+') elif leftmost.startswith('xn--') or hostname.startswith('xn--'): # RFC 6125, section 6.4.3, subitem 3. # The client SHOULD NOT attempt to match a presented identifier # where the wildcard character is embedded within an A-label or # U-label of an internationalized domain name. pats.append(re.escape(leftmost)) else: # Otherwise, '*' matches any dotless string, e.g. www* pats.append(re.escape(leftmost).replace(r'\*', '[^.]*')) # add the remaining fragments, ignore any wildcards for frag in remainder: pats.append(re.escape(frag)) pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) return pat.match(hostname) def _to_unicode(obj): if isinstance(obj, str) and sys.version_info < (3,): obj = unicode(obj, encoding='ascii', errors='strict') return obj def _ipaddress_match(ipname, host_ip): """Exact matching of IP addresses. RFC 6125 explicitly doesn't define an algorithm for this (section 1.7.2 - "Out of Scope"). """ # OpenSSL may add a trailing newline to a subjectAltName's IP address # Divergence from upstream: ipaddress can't handle byte str ip = ipaddress.ip_address(_to_unicode(ipname).rstrip()) return ip == host_ip def match_hostname(cert, hostname): """Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. """ if not cert: raise ValueError("empty or no certificate, match_hostname needs a " "SSL socket or SSL context with either " "CERT_OPTIONAL or CERT_REQUIRED") try: # Divergence from upstream: ipaddress can't handle byte str host_ip = ipaddress.ip_address(_to_unicode(hostname)) except ValueError: # Not an IP address (common case) host_ip = None except UnicodeError: # Divergence from upstream: Have to deal with ipaddress not taking # byte strings. addresses should be all ascii, so we consider it not # an ipaddress in this case host_ip = None except AttributeError: # Divergence from upstream: Make ipaddress library optional if ipaddress is None: host_ip = None else: raise dnsnames = [] san = cert.get('subjectAltName', ()) for key, value in san: if key == 'DNS': if host_ip is None and _dnsname_match(value, hostname): return dnsnames.append(value) elif key == 'IP Address': if host_ip is not None and _ipaddress_match(value, host_ip): return dnsnames.append(value) if not dnsnames: # The subject is only checked when there is no dNSName entry # in subjectAltName for sub in cert.get('subject', ()): for key, value in sub: # XXX according to RFC 2818, the most specific Common Name # must be used. if key == 'commonName': if _dnsname_match(value, hostname): return dnsnames.append(value) if len(dnsnames) > 1: raise CertificateError("hostname %r " "doesn't match either of %s" % (hostname, ', '.join(map(repr, dnsnames)))) elif len(dnsnames) == 1: raise CertificateError("hostname %r " "doesn't match %r" % (hostname, dnsnames[0])) else: raise CertificateError("no appropriate commonName or " "subjectAltName fields were found") PK[G,""7site-packages/backports/ssl_match_hostname/__init__.pyonu[ uVc@sdZddlZddlZyddlZWnek rGdZnXdZdefdYZddZ dZ d Z d Z dS( sJThe match_hostname() function from Python 3.3.3, essential when using SSL.iNs3.5.0.1tCertificateErrorcBseZRS((t__name__t __module__(((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyRsic CsRg}|stS|jd}|d}|d}|jd}||krgtdt|n|s|j|jkS|dkr|jdnY|jds|jdr|jtj |n"|jtj |j dd x$|D]}|jtj |qWtj d d j |d tj } | j|S( shMatching according to RFC 6125, section 6.4.3 http://tools.ietf.org/html/rfc6125#section-6.4.3 t.iit*s,too many wildcards in certificate DNS name: s[^.]+sxn--s\*s[^.]*s\As\.s\Z(tFalsetsplittcountRtreprtlowertappendt startswithtretescapetreplacetcompiletjoint IGNORECASEtmatch( tdnthostnamet max_wildcardstpatstpartstleftmostt remaindert wildcardstfragtpat((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyt_dnsname_matchs*    " &cCs=t|tr9tjdkr9t|dddd}n|S(Nitencodingtasciiterrorststrict(i(t isinstancetstrtsyst version_infotunicode(tobj((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyt _to_unicodeLscCs%tjt|j}||kS(sExact matching of IP addresses. RFC 6125 explicitly doesn't define an algorithm for this (section 1.7.2 - "Out of Scope"). (t ipaddresst ip_addressR(trstrip(tipnamethost_iptip((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyt_ipaddress_matchQscCs|stdnytjt|}WnUtk rGd}n?tk r]d}n)tk rtdkrd}qnXg}|jdd}x|D]\}}|dkr|dkrt||rdS|j |q|dkr|dk rt ||rdS|j |qqW|sxc|jddD]L}xC|D];\}}|dkrQt||r|dS|j |qQqQWqDWnt |dkrt d |d j tt|fn;t |dkrt d ||d fn t d dS(s)Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 rules are followed, but IP addresses are not accepted for *hostname*. CertificateError is raised on failure. On success, the function returns nothing. stempty or no certificate, match_hostname needs a SSL socket or SSL context with either CERT_OPTIONAL or CERT_REQUIREDtsubjectAltNametDNSNs IP Addresstsubjectt commonNameis&hostname %r doesn't match either of %ss, shostname %r doesn't match %ris=no appropriate commonName or subjectAltName fields were found(((t ValueErrorR)R*R(tNonet UnicodeErrortAttributeErrortgetRR R/tlenRRtmapR(tcertRR-tdnsnamestsantkeytvaluetsub((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pytmatch_hostname]sJ          %( t__doc__R R$R)t ImportErrorR5t __version__R4RRR(R/RA(((sI/usr/lib/python2.7/site-packages/backports/ssl_match_hostname/__init__.pyts     5  PK[5~KK#site-packages/backports/__init__.pynu[from pkgutil import extend_path __path__ = extend_path(__path__, __name__) PK[q$site-packages/backports/__init__.pyonu[ iTc@s#ddlmZeeeZdS(i(t extend_pathN(tpkgutilRt__path__t__name__(((s6/usr/lib/python2.7/site-packages/backports/__init__.pytsPK[9site-packages/tuned/consts.pyonu[ \c@shddlZdZdZdZdZdZdZdZeZd Z d Z d Z d Z d dgZ dZdZddgZdZdZdZddgZdZdZedeZdedZdedZdZdZd ZdZd!Zd"Zd#Z d$Z!d%Z"d&Z#d'Z$d(Z%d)Z&d*Z'd+Z(dYZ)d.Z*d/Z+d0Z,d1Z-d2Z.d3Z/d4Z0d5Z1d6Z2d7Z3d8Z4d9Z5d:Z6d;Z7d<Z8e9Z:e9Z;d=Z<d>Z=e9Z>e9Z?d?Z@dZZAdAZBdBZCdCZDdDZEdEZFdFZGdGZHdHZIdIZJdJZKdKZLdLZMdMZNdNZOdOZPdPZQdQZRdRZSdSZTiejUdT6ejVdU6ejWdV6ejXdW6eRdS6ddX6ZZdS([iNs/etc/tuned/tuned-main.confs/etc/tuned/active_profiles/etc/tuned/profile_modes tuned.confs/etc/tuned/recommend.confiscom.redhat.tunedscom.redhat.tuned.controls/Tunedtbalanceds/run/tuned/save.pickles/usr/lib/tuneds /etc/tuneds/var/lib/tunedtmains/usr/lib/tuned/recommend.ds/etc/tuned/recommend.ds.tmpis/boots/etc/grub2.cfgs/etc/grub2-efi.cfgs /etc/grub.dt00_tunedt/s### BEGIN /etc/grub.d/s ###s### END /etc/grub.d/t tuned_paramst tuned_initrds/etc/default/grubtTUNED_BOOT_CMDLINEtTUNED_BOOT_INITRD_ADDs/etc/tuned/bootcmdlines/sys/firmware/opals/etc/machine-ids*/usr/lib/kernel/install.d/92-tuned.installs/boot/loader/entriess/etc/modprobe.d/tuned.confs/etc/systemd/system.conft CPUAffinityiidis/var/log/tuned/tuned.logs/run/tuned/tuned.pids/etc/system-release-cpet function_tTUNED_tSystemtUsertdaemontdynamic_tuningtsleep_intervaltupdate_intervaltrecommend_commandtreapply_sysctltdefault_instance_prioritytudev_buffer_sizeii iis/dev/cpu_dma_latencytsummaryt descriptiontprofile_changeds-you need to reboot for changes to take effects&verify: passed: device %s: '%s' = '%s'sverify: passed: '%s' = '%s'sverify: passed: '%s's)verify: skipped, missing: device %s: '%s'sverify: skipped, missing: '%s's5verify: failed: device %s: '%s' = '%s', expected '%s's*verify: failed: '%s' = '%s', expected '%s'sverify: failed: '%s'iXtautotmanuali<tCONSOLEtconsoletdebugtinfotwarnterrortnoneii([tloggingtGLOBAL_CONFIG_FILEtACTIVE_PROFILE_FILEtPROFILE_MODE_FILEt PROFILE_FILEtRECOMMEND_CONF_FILEtDAEMONIZE_PARENT_TIMEOUTt NAMESPACEtDBUS_BUStDBUS_INTERFACEt DBUS_OBJECTtDEFAULT_PROFILEtDEFAULT_STORAGE_FILEtLOAD_DIRECTORIEStPERSISTENT_STORAGE_DIRtPLUGIN_MAIN_UNIT_NAMEtRECOMMEND_DIRECTORIEStTMP_FILE_SUFFIXtERROR_THRESHOLDtBOOT_DIRtGRUB2_CFG_FILESt GRUB2_CFG_DIRtGRUB2_TUNED_TEMPLATE_NAMEtGRUB2_TUNED_TEMPLATE_PATHtGRUB2_TEMPLATE_HEADER_BEGINtGRUB2_TEMPLATE_HEADER_ENDtGRUB2_TUNED_VARtGRUB2_TUNED_INITRD_VARtGRUB2_DEFAULT_ENV_FILEtINITRD_IMAGE_DIRtBOOT_CMDLINE_TUNED_VARtBOOT_CMDLINE_INITRD_ADD_VARtBOOT_CMDLINE_FILEtPETITBOOT_DETECT_DIRtMACHINE_ID_FILEtKERNEL_UPDATE_HOOK_FILEtBLS_ENTRIES_PATHt MODULES_FILEtSYSTEMD_SYSTEM_CONF_FILEtSYSTEMD_CPUAFFINITY_VARtLOG_FILE_COUNTtLOG_FILE_MAXBYTEStLOG_FILEtPID_FILEtSYSTEM_RELEASE_FILEtFUNCTION_PREFIXt ENV_PREFIXtPREFIX_PROFILE_FACTORYtPREFIX_PROFILE_USERt CFG_DAEMONtCFG_DYNAMIC_TUNINGtCFG_SLEEP_INTERVALtCFG_UPDATE_INTERVALtCFG_RECOMMEND_COMMANDtCFG_REAPPLY_SYSCTLtCFG_DEFAULT_INSTANCE_PRIORITYtCFG_UDEV_BUFFER_SIZEtTruetCFG_DEF_DAEMONtCFG_DEF_DYNAMIC_TUNINGtCFG_DEF_SLEEP_INTERVALtCFG_DEF_UPDATE_INTERVALtCFG_DEF_RECOMMEND_COMMANDtCFG_DEF_REAPPLY_SYSCTLt!CFG_DEF_DEFAULT_INSTANCE_PRIORITYtCFG_DEF_UDEV_BUFFER_SIZEtPATH_CPU_DMA_LATENCYtPROFILE_ATTR_SUMMARYtPROFILE_ATTR_DESCRIPTIONtDBUS_SIGNAL_PROFILE_CHANGEDtSTR_HINT_REBOOTt"STR_VERIFY_PROFILE_DEVICE_VALUE_OKtSTR_VERIFY_PROFILE_VALUE_OKtSTR_VERIFY_PROFILE_OKt'STR_VERIFY_PROFILE_DEVICE_VALUE_MISSINGt STR_VERIFY_PROFILE_VALUE_MISSINGt$STR_VERIFY_PROFILE_DEVICE_VALUE_FAILtSTR_VERIFY_PROFILE_VALUE_FAILtSTR_VERIFY_PROFILE_FAILt ADMIN_TIMEOUTtACTIVE_PROFILE_AUTOtACTIVE_PROFILE_MANUALtLOG_LEVEL_CONSOLEtLOG_LEVEL_CONSOLE_NAMEtCAPTURE_LOG_LEVELtDEBUGtINFOtWARNtERRORtNonetCAPTURE_LOG_LEVELS(((s0/usr/lib/python2.7/site-packages/tuned/consts.pyts        PK[ۜvr@r@&site-packages/tuned/utils/commands.pycnu[ \c@sddlZddlZddlZddlZddlZddljZddlZddl Tddl m Z ej j ZdddYZdS(iN(t*(tTunedExceptiontcommandscBseZedZdZdZdZdZdZdddZ ddZ d Z d Z d Z d(d d Zd(dZeedZdedZedZedZedZedZdZdZedZedZed(igedZedZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)RS()cCs ||_dS(N(t_logging(tselftlogging((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt__init__scCs|jrtj|ndS(N(Rtlogterror(Rtmsg((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt_errors cCs|jrtj|ndS(N(RRtdebug(RR ((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt_debugs cCs`t|jj}idd6dd6dd6dd6dd6dd6dd 6dd 6j||S( Nt1tYtYEStTtTRUEt0tNtNOtFtFALSE(tstrtuppertstriptget(Rtvaluetv((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_boolscCstjddt|jS(Ns\s+t (tretsubRR(Rts((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt remove_wsscCstjdd|S(Ns^"(.*)"$s\1(RR (RR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytunquote!ss\cCs|j|d||fS(Ns%s%s(treplace(RR!t what_escapet escape_by((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytescape%scCs|j|dS(Nt(R$(RR!t escape_char((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytunescape)scCs|d|t||S(NR(tlen(Rts1tposts2((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt align_str-scCsFg}|dk rBx-t|jD]}|t|7}q%Wn|S(N(tNonetsortedtitemstlist(Rtdtlti((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt dict2list3s  cCs6|dkrdStjddjt|jS(Ns(%s)s)|((R0RtcompiletjoinR3tkeys(RR4((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytre_lookup_compile;s ics{dkr|dkrA|Sn"tdks=|dkrA|S|dkr_|j}n|jfd||S(Nicstj|jdS(Ni(R3tvaluest lastindex(tmo(R4(s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytLs(R0R+R;R (RR4R!trtflags((R4s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytmultiple_re_replaceCs   cCstt|dks|dkr"dS|dkr@|j|}n|j|}|rpt|j|jdSdS(Nii(R+R0R;tsearchR3R<R=(RR4R!R@R>((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt re_lookupRs c Cs|jd||f|rMtjj|}tjj|rMt}qMnyL|rftj|nt|d}|jt ||j t }Wn?t t fk r}t}|s|jd||fqnX|S(NsWriting to file: '%s' < '%s'tws Writing to file '%s' error: '%s'(R tostpathtdirnametisdirtFalsetmakedirstopentwriteRtclosetTruetOSErrortIOErrorR ( Rtftdatatmakedirtno_errorR4tfdtrcte((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt write_to_file\s"   R(cCs|}y)t|d}|j}|jWn9ttfk rj}|sk|jd||fqknX|jd||f|S(NR@s"Error when reading file '%s': '%s's Read data from file: '%s' > '%s'(RLtreadRNRPRQR R (RRRterr_retRUt old_valueRX((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt read_fileos cCs{|jd|tjj|rwytj||Wqwtk rs}|sotjd|t |fnt SXnt S(NsRemoving tree: '%s'scannot remove tree '%s': '%s'( R RFRGtexiststshutiltrmtreeRPRRRRJRO(RRRRUR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyR`{s cCsx|jd|tjj|rtytj|Wqttk rp}|sltjd|t|fnt SXnt S(NsRemoving file: '%s'scannot remove file '%s': '%s'( R RFRGR^tunlinkRPRRRRJRO(RRRRUR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRas cCso|jd||fytj||Wn=tk rj}|sftjd||t|fntSXtS(NsRenaming file '%s' to '%s's%cannot rename file '%s' to '%s': '%s'( R RFtrenameRPRRRRJRO(RtsrctdstRUR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRbs#cCsmy/tjd||ftj||tSWn7tk rh}|sdtjd|||fntSXdS(Nscopying file '%s' to '%s's!cannot copy file '%s' to '%s': %s(RR R_tcopyRORQRRJ(RRcRdRURX((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRescCsM|j|}t|dkr%tS|j|tj|||dtjS(NiRA(R]R+RJRYRR t MULTILINE(RRRtpatterntreplRS((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytreplace_in_filescCsJ|j|}t|dkr%tS|j||j||dtjS(NiRA(R]R+RJRYRBRRf(RRRR4RS((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytmultiple_replace_in_filescCs|j|}x|D]}t|}t||}tjd|d|dtjdkr|rt|dkr|ddkr|d7}n|d||f7}qqtjd|d d |d |dtj}qW|j||S( Ns\bs\s*=.*$RAiis s%s="%s" s\b(s\s*=).*$s\1s"s\1"( R]RRRCRfR0R+R RY(RRRR4taddRStopttoR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytadd_modify_option_in_files  )" 2cCs|jtj|jS(N(R]tconststMACHINE_ID_FILER(RRU((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_machine_idscCsd}tjj}d|d<|j||jdt|d} d} yt|dtdtd|d |d |d t d t } | j \} } | j }|r||krd|kr| d } t | dkr| d } nd|d| f} |s|j | qnWnttfk r}|jdk rI|j nd }t||krd|krd|d|f} |s|j | qqnX|r|| | fS|| fSdS(NitCtLC_ALLs Executing %s.R(tstdouttstderrtenvtshelltcwdt close_fdstuniversal_newlinesisExecuting %s error: %s(RFtenvironRetupdateR RR0tPopentPIPEROt communicatet returncodeR+R RPRQterrnotabs(RtargsRwRxRvt no_errorst return_errtretcodet _environmenttoutterr_msgtprocterrterr_outRX((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytexecutes>        cCs=tjd|}|r%|jdS|r9|jdS|S(Ns.*\[([^\]]+)\].*ii(Rtmatchtgrouptsplit(Rtoptionstdosplittm((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_active_options  cCs;t|}|dkp:|jd|dtjdkS(NRs$/sys/devices/system/cpu/cpu%s/onlineRUR (RR]ROR(Rtcputscpu((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt is_cpu_onlines cCst|dkrdSt|jdd}yt|d}Wn)tk rftjdt|gSX|j|S(Nt,R(isinvalid hexadecimal mask '%s'(R0RR$tintt ValueErrorRRtbitmask2cpulist(RtmaskR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt hex2cpulists  cCsQd}g}x>|dkrL|d@r5|j|n|dL}|d7}qW|S(Nii(tappend(RRRtcpus((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRs  c Csg}|dkr|St|tkr1|}nt|jd}g}g}t}d}xW|D]O}t|} |rt| dkrt}|j|d}q|| 7}qe| dd!jdkrt }| }qe| r| ddks| ddkr| djd } yat| dkrb|tt t | dt | dd7}n|jt | dWqt k rgSXqet| dkre|j| qeqeWt|dkr|j|nx|D]}|jd } |dd!jdkr%||j |7}qyat| dkrn|tt t | dt | dd7}n|jt | dWqt k rgSXqWttt|} x*|D]"} | | kr| j| qqW| S( NRR(iit0xt^t!it-(R0ttypeR3RRRJR+RtlowerROtrangeRRRR1tsettremove(RR5trltlltll2t negation_listthexmaskthvRtsvtnltvltcpu_listR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytcpulist_unpacksd        &    4    cCs?|j|}|dks-t|dkr1|Sd}|}g}x|dt|kr||d||dkr||kr|jt||dt||n|jt|||d}n|d7}qFW|dt|kr$|jt||dt|dn|jt|d|S(NiiRi(RR0R+RR(RR5R6tjR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt cpulist_packbs" , ,cCsA|j|}|j|jd}tt|t|S(Ns/sys/devices/system/cpu/online(RR]R3R(RR5Rtonline((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytcpulist_invertxscs|dkrdS|j|}|dkr/dS|j|}d|t}|ddkry|d|d7}nj|djfdtdtdDS(Ns%xiiRc3s |]}||d!VqdS(iN((t.0R6(R!(s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pys s(R0Rtcpulist2bitmaskR+tzfillR9R(RR5tulRtls((R!s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt cpulist2hex~s    cCs.d}x!|D]}|td|O}q W|S(Nii(tpow(RR5RR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRs cCs,y|j|tSWn|j|SXdS(N(twaitRJ(Rt terminatettime((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRscCst|jj}xddddgD]}|j|}|dkrRq+nyt|| }||}|dkr|d9}nG|dkr|d9}n.|dkr|d 9}n|dkrd}n|SWq+tk rdSXq+WdS( NtKBtMBtGBR(iiiii@(RRRtrfindRR0R(RR!tunittunit_ixtvaltu((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_sizes&           c Csd}d}y1ttjd}|jj}WdQXWn`tk rw}|jtjkrtd|qn)t t fk r}td|nXybttj dJ}|jj}|dtj tj gkrtdtj nWdQXWn`tk r<}|jtjkretd|qen)t t fk rd}td|nX|dkrzd}n|tj k}|dkrd}n||fS(NR(R@s!Failed to read active profile: %ssInvalid value in file %s.sFailed to read profile mode: %s(RLRotACTIVE_PROFILE_FILERZRRQRtENOENTRRPtEOFErrortPROFILE_MODE_FILEtACTIVE_PROFILE_AUTOtACTIVE_PROFILE_MANUALR0(Rt profile_nametmodeRRRXtmanual((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_active_profiles4     cCsy?ttjd'}|dk r8|j|dnWdQXWn,ttfk rm}td|jnXyHttj d0}|rtj ntj }|j|dWdQXWn,ttfk r}td|jnXdS(NREs s!Failed to save active profile: %ssFailed to save profile mode: %s( RLRoRR0RMRPRQRtstrerrorRRR(RRRRRRXR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytsave_active_profiles N(*t__name__t __module__RORR R RR"R#R'R*R/R7R;R0RBRDRJRYR]R`RaRbReRiRjRnRqRRRRRRRRRRRRRR(((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyR sJ              '   C      ((Rt tuned.logsttunedReRFR_t tuned.constsRoRt subprocessttuned.exceptionsRtlogsRRR(((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyts       PK[rz$site-packages/tuned/utils/polkit.pyonu[ \c@s>ddlZddlZejjZdddYZdS(iNtpolkitcBseZdZdZRS(cCsLtj|_|jjdddt|_tj|jdd|_dS(Nsorg.freedesktop.PolicyKit1s%/org/freedesktop/PolicyKit1/Authoritytfollow_name_owner_changestdbus_interfaces$org.freedesktop.PolicyKit1.Authority(tdbust SystemBust_bust get_objecttTruet_proxyt Interfacet _authority(tself((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pyt__init__sc Cs|d ks|d krtSi}d}d}di|d6f}y&|jj|||||d}Wntjjtfk r}tj d|y|j j |} Wn+tjjk r}tj d|dSX| dkrd Sd SnX|rdSdS( sCheck authorization, return codes: 1 - authorized 2 - polkit error, but authorized with fallback method 0 - unauthorized -1 - polkit error and unauthorized by the fallback method -2 - polkit error and unable to use the fallback method itssystem-bus-nametnameiserror querying polkit: %ss,error using falback authorization method: %siiiN( tNonetFalseR tCheckAuthorizationRt exceptionst DBusExceptiont ValueErrortlogterrorRt get_unix_user( R tsendert action_idtdetailstflagstcancellation_idtsubjecttrettetuid((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pytcheck_authorization s& & (t__name__t __module__R R!(((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pyRs ((Rt tuned.logsttunedtlogstgetRR(((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pyts  PK[aDd&site-packages/tuned/utils/__init__.pycnu[ \c@sdS(N((((s8/usr/lib/python2.7/site-packages/tuned/utils/__init__.pytsPK[W_ +site-packages/tuned/utils/global_config.pyonu[ \c@sddlZddlmZmZddlmZddlmZddl j Z ddl m Z dgZ ejjZdddYZdS( iN(t ConfigObjtConfigObjError(t Validator(tTunedException(tcommandst GlobalConfigcBseZdejdejdejdejgZejdZ ejdZ d dZ d dZ dZd d ZRS( s$dynamic_tuning = boolean(default=%s)s$sleep_interval = integer(default=%s)s%update_interval = integer(default=%s)s'recommend_command = boolean(default=%s)cCs)i|_|jd|t|_dS(Nt file_name(t_cfgt load_configRt_cmd(tselft config_file((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyt__init__s c Cstjd|y4t|d|jdtdtdtdt|_WnEtk rj}td|n#t k r}td|nXt }|jj |d tstd |nd S( s& Loads global configuration file. s2reading and parsing global configuration file '%s't configspect raise_errorst file_errort list_valuest interpolations/Global tuned configuration file '%s' not found.s3Error parsing global tuned configuration file '%s'.tcopys2Global tuned configuration file '%s' is not valid.N( tlogtdebugRtglobal_config_spectTruetFalseRtIOErrorRRRtvalidate(R Rtetvdt((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyRs cCs|jj||S(N(Rtget(R tkeytdefault((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyR(scCs,|jj|j||dkr(tStS(Nt1(R tget_boolRRR(R RR((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyR +s$cCs||j|s  PK[W_ +site-packages/tuned/utils/global_config.pycnu[ \c@sddlZddlmZmZddlmZddlmZddl j Z ddl m Z dgZ ejjZdddYZdS( iN(t ConfigObjtConfigObjError(t Validator(tTunedException(tcommandst GlobalConfigcBseZdejdejdejdejgZejdZ ejdZ d dZ d dZ dZd d ZRS( s$dynamic_tuning = boolean(default=%s)s$sleep_interval = integer(default=%s)s%update_interval = integer(default=%s)s'recommend_command = boolean(default=%s)cCs)i|_|jd|t|_dS(Nt file_name(t_cfgt load_configRt_cmd(tselft config_file((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyt__init__s c Cstjd|y4t|d|jdtdtdtdt|_WnEtk rj}td|n#t k r}td|nXt }|jj |d tstd |nd S( s& Loads global configuration file. s2reading and parsing global configuration file '%s't configspect raise_errorst file_errort list_valuest interpolations/Global tuned configuration file '%s' not found.s3Error parsing global tuned configuration file '%s'.tcopys2Global tuned configuration file '%s' is not valid.N( tlogtdebugRtglobal_config_spectTruetFalseRtIOErrorRRRtvalidate(R Rtetvdt((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyRs cCs|jj||S(N(Rtget(R tkeytdefault((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyR(scCs,|jj|j||dkr(tStS(Nt1(R tget_boolRRR(R RR((s=/usr/lib/python2.7/site-packages/tuned/utils/global_config.pyR +s$cCs||j|s  PK[A"J J +site-packages/tuned/utils/plugin_loader.pyonu[ \c@sJddlZddlZdgZejjZdefdYZdS(iNt PluginLoadercBsDeZdddgZdZdZdZdZdZRS(t _namespacet_prefixt _interfacecCs tdS(s~ This method has to be implemented in child class and should set _namespace, _prefix, and _interface member attributes. N(tNotImplementedError(tself((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyt_set_loader_parameters scCs<tt|jd|_d|_d|_|jdS(N(tsuperRt__init__tNoneRRRR(R((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyRs     cCs&d|j|j|f}|j|S(Ns%s.%s%s(RRt _get_class(Rt plugin_namet module_name((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyt load_pluginscCstjd|t|}|jd}|jdx.t|dkrit||jd}q<WxH|jD]=}t||}t|tkrtt ||j rt|SqtWt ddS(Nsloading module %st.isCannot find the plugin class.( tlogtdebugt __import__tsplittpoptlentgetattrt__dict__ttypet issubclassRt ImportError(RR tmoduletpathtnametcls((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyR "s  $cCst|j}g}xtj|jjdD]}ygtjj|d}|jdscw/n|j d|j|f}||kr|j |nWq/t k rq/Xq/W|S(Nitplugin_s%s.%s( RRtostlistdirtpluginst__path__Rtsplitextt startswithR tappendR(Rtplugins_packaget plugin_clssR t plugin_class((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pytload_all_plugins2s   (t__name__t __module__t __slots__RRR R R)(((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyRs    ( t tuned.logsttunedRt__all__tlogstgetRtobjectR(((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyts   PK[i44%site-packages/tuned/utils/commands.pynu[import errno import tuned.logs import copy import os import shutil import tuned.consts as consts import re from subprocess import * from tuned.exceptions import TunedException log = tuned.logs.get() class commands: def __init__(self, logging = True): self._logging = logging def _error(self, msg): if self._logging: log.error(msg) def _debug(self, msg): if self._logging: log.debug(msg) def get_bool(self, value): v = str(value).upper().strip() return {"Y":"1", "YES":"1", "T":"1", "TRUE":"1", "N":"0", "NO":"0", "F":"0", "FALSE":"0"}.get(v, value) def remove_ws(self, s): return re.sub('\s+', ' ', str(s)).strip() def unquote(self, v): return re.sub("^\"(.*)\"$", r"\1", v) # escape escape character (by default '\') def escape(self, s, what_escape = "\\", escape_by = "\\"): return s.replace(what_escape, "%s%s" % (escape_by, what_escape)) # clear escape characters (by default '\') def unescape(self, s, escape_char = "\\"): return s.replace(escape_char, "") # add spaces to align s2 to pos, returns resulting string: s1 + spaces + s2 def align_str(self, s1, pos, s2): return s1 + " " * (pos - len(s1)) + s2 # convert dictionary 'd' to flat list and return it # it uses sort on the dictionary items to return consistent results # for directories with different inserte/delete history def dict2list(self, d): l = [] if d is not None: for i in sorted(d.items()): l += list(i) return l # Compile regex to speedup multiple_re_replace or re_lookup def re_lookup_compile(self, d): if d is None: return None return re.compile("(%s)" % ")|(".join(list(d.keys()))) # Do multiple regex replaces in 's' according to lookup table described by # dictionary 'd', e.g.: d = {"re1": "replace1", "re2": "replace2", ...} # r can be regex precompiled by re_lookup_compile for speedup def multiple_re_replace(self, d, s, r = None, flags = 0): if d is None: if r is None: return s else: if len(d) == 0 or s is None: return s if r is None: r = self.re_lookup_compile(d) return r.sub(lambda mo: list(d.values())[mo.lastindex - 1], s, flags) # Do regex lookup on 's' according to lookup table described by # dictionary 'd' and return corresponding value from the dictionary, # e.g.: d = {"re1": val1, "re2": val2, ...} # r can be regex precompiled by re_lookup_compile for speedup def re_lookup(self, d, s, r = None): if len(d) == 0 or s is None: return None if r is None: r = self.re_lookup_compile(d) mo = r.search(s) if mo: return list(d.values())[mo.lastindex - 1] return None def write_to_file(self, f, data, makedir = False, no_error = False): self._debug("Writing to file: '%s' < '%s'" % (f, data)) if makedir: d = os.path.dirname(f) if os.path.isdir(d): makedir = False try: if makedir: os.makedirs(d) fd = open(f, "w") fd.write(str(data)) fd.close() rc = True except (OSError,IOError) as e: rc = False if not no_error: self._error("Writing to file '%s' error: '%s'" % (f, e)) return rc def read_file(self, f, err_ret = "", no_error = False): old_value = err_ret try: f = open(f, "r") old_value = f.read() f.close() except (OSError,IOError) as e: if not no_error: self._error("Error when reading file '%s': '%s'" % (f, e)) self._debug("Read data from file: '%s' > '%s'" % (f, old_value)) return old_value def rmtree(self, f, no_error = False): self._debug("Removing tree: '%s'" % f) if os.path.exists(f): try: shutil.rmtree(f, no_error) except OSError as error: if not no_error: log.error("cannot remove tree '%s': '%s'" % (f, str(error))) return False return True def unlink(self, f, no_error = False): self._debug("Removing file: '%s'" % f) if os.path.exists(f): try: os.unlink(f) except OSError as error: if not no_error: log.error("cannot remove file '%s': '%s'" % (f, str(error))) return False return True def rename(self, src, dst, no_error = False): self._debug("Renaming file '%s' to '%s'" % (src, dst)) try: os.rename(src, dst) except OSError as error: if not no_error: log.error("cannot rename file '%s' to '%s': '%s'" % (src, dst, str(error))) return False return True def copy(self, src, dst, no_error = False): try: log.debug("copying file '%s' to '%s'" % (src, dst)) shutil.copy(src, dst) return True except IOError as e: if not no_error: log.error("cannot copy file '%s' to '%s': %s" % (src, dst, e)) return False def replace_in_file(self, f, pattern, repl): data = self.read_file(f) if len(data) <= 0: return False; return self.write_to_file(f, re.sub(pattern, repl, data, flags = re.MULTILINE)) # do multiple replaces in file 'f' by using dictionary 'd', # e.g.: d = {"re1": val1, "re2": val2, ...} def multiple_replace_in_file(self, f, d): data = self.read_file(f) if len(data) <= 0: return False; return self.write_to_file(f, self.multiple_re_replace(d, data, flags = re.MULTILINE)) # makes sure that options from 'd' are set to values from 'd' in file 'f', # when needed it edits options or add new options if they don't # exist and 'add' is set to True, 'd' has the following form: # d = {"option_1": value_1, "option_2": value_2, ...} def add_modify_option_in_file(self, f, d, add = True): data = self.read_file(f) for opt in d: o = str(opt) v = str(d[opt]) if re.search(r"\b" + o + r"\s*=.*$", data, flags = re.MULTILINE) is None: if add: if len(data) > 0 and data[-1] != "\n": data += "\n" data += "%s=\"%s\"\n" % (o, v) else: data = re.sub(r"\b(" + o + r"\s*=).*$", r"\1" + "\"" + v + "\"", data, flags = re.MULTILINE) return self.write_to_file(f, data) # returns machine ID or empty string "" in case of error def get_machine_id(self, no_error = True): return self.read_file(consts.MACHINE_ID_FILE, no_error).strip() # "no_errors" can be list of return codes not treated as errors, if 0 is in no_errors, it means any error # returns (retcode, out), where retcode is exit code of the executed process or -errno if # OSError or IOError exception happened def execute(self, args, shell = False, cwd = None, env = {}, no_errors = [], return_err = False): retcode = 0 _environment = os.environ.copy() _environment["LC_ALL"] = "C" _environment.update(env) self._debug("Executing %s." % str(args)) out = "" err_msg = None try: proc = Popen(args, stdout = PIPE, stderr = PIPE, \ env = _environment, \ shell = shell, cwd = cwd, \ close_fds = True, \ universal_newlines = True) out, err = proc.communicate() retcode = proc.returncode if retcode and not retcode in no_errors and not 0 in no_errors: err_out = err[:-1] if len(err_out) == 0: err_out = out[:-1] err_msg = "Executing %s error: %s" % (args[0], err_out) if not return_err: self._error(err_msg) except (OSError, IOError) as e: retcode = -e.errno if e.errno is not None else -1 if not abs(retcode) in no_errors and not 0 in no_errors: err_msg = "Executing %s error: %s" % (args[0], e) if not return_err: self._error(err_msg) if return_err: return retcode, out, err_msg else: return retcode, out # Helper for parsing kernel options like: # [always] never # It will return 'always' def get_active_option(self, options, dosplit = True): m = re.match(r'.*\[([^\]]+)\].*', options) if m: return m.group(1) if dosplit: return options.split()[0] return options # Checks whether CPU is online def is_cpu_online(self, cpu): scpu = str(cpu) # CPU0 is always online return cpu == "0" or self.read_file("/sys/devices/system/cpu/cpu%s/online" % scpu, no_error = True).strip() == "1" # Converts hexadecimal CPU mask to CPU list def hex2cpulist(self, mask): if mask is None: return None mask = str(mask).replace(",", "") try: m = int(mask, 16) except ValueError: log.error("invalid hexadecimal mask '%s'" % str(mask)) return [] return self.bitmask2cpulist(m) # Converts an integer bitmask to a list of cpus (e.g. [0,3,4]) def bitmask2cpulist(self, mask): cpu = 0 cpus = [] while mask > 0: if mask & 1: cpus.append(cpu) mask >>= 1 cpu += 1 return cpus # Unpacks CPU list, i.e. 1-3 will be converted to 1, 2, 3, supports # hexmasks that needs to be prefixed by "0x". Hexmasks can have commas, # which will be removed. If combining hexmasks with CPU list they need # to be separated by ",,", e.g.: 0-3, 0xf,, 6. It also supports negation # cpus by specifying "^" or "!", e.g.: 0-5, ^3, will output the list as # "0,1,2,4,5" (excluding 3). Note: negation supports only cpu numbers. def cpulist_unpack(self, l): rl = [] if l is None: return l if type(l) is list: ll = l else: ll = str(l).split(",") ll2 = [] negation_list = [] hexmask = False hv = "" # Remove commas from hexmasks for v in ll: sv = str(v) if hexmask: if len(sv) == 0: hexmask = False ll2.append(hv) hv = "" else: hv += sv else: if sv[0:2].lower() == "0x": hexmask = True hv = sv elif sv and (sv[0] == "^" or sv[0] == "!"): nl = sv[1:].split("-") try: if (len(nl) > 1): negation_list += list(range( int(nl[0]), int(nl[1]) + 1 ) ) else: negation_list.append(int(sv[1:])) except ValueError: return [] else: if len(sv) > 0: ll2.append(sv) if len(hv) > 0: ll2.append(hv) for v in ll2: vl = v.split("-") if v[0:2].lower() == "0x": rl += self.hex2cpulist(v) else: try: if len(vl) > 1: rl += list(range(int(vl[0]), int(vl[1]) + 1)) else: rl.append(int(vl[0])) except ValueError: return [] cpu_list = sorted(list(set(rl))) # Remove negated cpus after expanding for cpu in negation_list: if cpu in cpu_list: cpu_list.remove(cpu) return cpu_list # Packs CPU list, i.e. 1, 2, 3 will be converted to 1-3. It unpacks the # CPU list through cpulist_unpack first, so see its description about the # details of the input syntax def cpulist_pack(self, l): l = self.cpulist_unpack(l) if l is None or len(l) == 0: return l i = 0 j = i rl = [] while i + 1 < len(l): if l[i + 1] - l[i] != 1: if j != i: rl.append(str(l[j]) + "-" + str(l[i])) else: rl.append(str(l[i])) j = i + 1 i += 1 if j + 1 < len(l): rl.append(str(l[j]) + "-" + str(l[-1])) else: rl.append(str(l[-1])) return rl # Inverts CPU list (i.e. makes its complement) def cpulist_invert(self, l): cpus = self.cpulist_unpack(l) online = self.cpulist_unpack(self.read_file("/sys/devices/system/cpu/online")) return list(set(online) - set(cpus)) # Converts CPU list to hexadecimal CPU mask def cpulist2hex(self, l): if l is None: return None ul = self.cpulist_unpack(l) if ul is None: return None m = self.cpulist2bitmask(ul) s = "%x" % m ls = len(s) if ls % 8 != 0: ls += 8 - ls % 8 s = s.zfill(ls) return ",".join(s[i:i + 8] for i in range(0, len(s), 8)) def cpulist2bitmask(self, l): m = 0 for v in l: m |= pow(2, v) return m # Do not make balancing on patched Python 2 interpreter (rhbz#1028122). # It means less CPU usage on patchet interpreter. On non-patched interpreter # it is not allowed to sleep longer than 50 ms. def wait(self, terminate, time): try: return terminate.wait(time, False) except: return terminate.wait(time) def get_size(self, s): s = str(s).strip().upper() for unit in ["KB", "MB", "GB", ""]: unit_ix = s.rfind(unit) if unit_ix == -1: continue try: val = int(s[:unit_ix]) u = s[unit_ix:] if u == "KB": val *= 1024 elif u == "MB": val *= 1024 * 1024 elif u == "GB": val *= 1024 * 1024 * 1024 elif u != "": val = None return val except ValueError: return None def get_active_profile(self): profile_name = "" mode = "" try: with open(consts.ACTIVE_PROFILE_FILE, "r") as f: profile_name = f.read().strip() except IOError as e: if e.errno != errno.ENOENT: raise TunedException("Failed to read active profile: %s" % e) except (OSError, EOFError) as e: raise TunedException("Failed to read active profile: %s" % e) try: with open(consts.PROFILE_MODE_FILE, "r") as f: mode = f.read().strip() if mode not in ["", consts.ACTIVE_PROFILE_AUTO, consts.ACTIVE_PROFILE_MANUAL]: raise TunedException("Invalid value in file %s." % consts.PROFILE_MODE_FILE) except IOError as e: if e.errno != errno.ENOENT: raise TunedException("Failed to read profile mode: %s" % e) except (OSError, EOFError) as e: raise TunedException("Failed to read profile mode: %s" % e) if mode == "": manual = None else: manual = mode == consts.ACTIVE_PROFILE_MANUAL if profile_name == "": profile_name = None return (profile_name, manual) def save_active_profile(self, profile_name, manual): try: with open(consts.ACTIVE_PROFILE_FILE, "w") as f: if profile_name is not None: f.write(profile_name + "\n") except (OSError,IOError) as e: raise TunedException("Failed to save active profile: %s" % e.strerror) try: with open(consts.PROFILE_MODE_FILE, "w") as f: mode = consts.ACTIVE_PROFILE_MANUAL if manual else consts.ACTIVE_PROFILE_AUTO f.write(mode + "\n") except (OSError,IOError) as e: raise TunedException("Failed to save profile mode: %s" % e.strerror) PK[iR1site-packages/tuned/utils/profile_recommender.pycnu[ \c@sddlZddlZddlZddlZddlZddlmZmZeZ y=ej dkrej d krddl Z e Z nWnnXyddlZe ZWn eZnXddljZddlZdd lmZejjZd d d YZdS(iN(t ConfigObjtConfigObjErroriti386ti486ti586ti686tx86_64(tcommandstProfileRecommendercBs)eZdZedZedZRS(cCst|_dS(N(Rt _commands(tself((sC/usr/lib/python2.7/site-packages/tuned/utils/profile_recommender.pyt__init__sc CsXtj}|r|Stjdk}|s;tjdn|jtjd|}|dk rc|Si}xtj D]}g}ytj |}Wn?t k r}|j t j krtjd||fqnXx-|D]%} tjj|| } | || s,     $      PK[%site-packages/tuned/utils/__init__.pynu[PK[-EE0site-packages/tuned/utils/profile_recommender.pynu[import os import re import errno import procfs import platform from configobj import ConfigObj, ConfigObjError have_dmidecode = False try: if (os.geteuid() == 0 and platform.machine() in ["i386", "i486", "i586", "i686", "x86_64"]): import dmidecode have_dmidecode = True except: pass try: import syspurpose.files have_syspurpose = True except: have_syspurpose = False import tuned.consts as consts import tuned.logs from tuned.utils.commands import commands log = tuned.logs.get() class ProfileRecommender: def __init__(self): self._commands = commands() def recommend(self, hardcoded = False): profile = consts.DEFAULT_PROFILE if hardcoded: return profile has_root = os.geteuid() == 0 if not has_root: log.warning("Profile recommender is running without root privileges. Profiles with virt recommendation condition will be omitted.") matching = self.process_config(consts.RECOMMEND_CONF_FILE, has_root=has_root) if matching is not None: return matching files = {} for directory in consts.RECOMMEND_DIRECTORIES: contents = [] try: contents = os.listdir(directory) except OSError as e: if e.errno != errno.ENOENT: log.error("error accessing %s: %s" % (directory, e)) for name in contents: path = os.path.join(directory, name) files[name] = path for name in sorted(files.keys()): path = files[name] matching = self.process_config(path, has_root=has_root) if matching is not None: return matching return profile def process_config(self, fname, has_root=True): matching_profile = None try: if not os.path.isfile(fname): return None config = ConfigObj(fname, list_values = False, interpolation = False) for section in list(config.keys()): match = True for option in list(config[section].keys()): value = config[section][option] if value == "": value = r"^$" if option == "virt": if not has_root: match = False break if not re.match(value, self._commands.execute(["virt-what"])[1], re.S): match = False elif option == "system": if not re.match(value, self._commands.read_file( consts.SYSTEM_RELEASE_FILE), re.S): match = False elif option[0] == "/": if not os.path.exists(option) or not re.match(value, self._commands.read_file(option), re.S): match = False elif option[0:7] == "process": ps = procfs.pidstats() ps.reload_threads() if len(ps.find_by_regex(re.compile(value))) == 0: match = False elif option == "chassis_type": if have_dmidecode: for chassis in dmidecode.chassis().values(): chassis_type = chassis["data"]["Type"].decode( "ascii") if re.match(value, chassis_type, re.IGNORECASE): break else: match = False else: log.debug("Ignoring 'chassis_type' in '%s',\ dmidecode is not available." % fname) elif option == "syspurpose_role": if have_syspurpose: s = syspurpose.files.SyspurposeStore( syspurpose.files.USER_SYSPURPOSE, raise_on_error = True) role = "" try: s.read_file() role = s.contents["role"] except (IOError, OSError, KeyError) as e: if hasattr(e, "errno") and e.errno != errno.ENOENT: log.error("Failed to load the syspurpose\ file: %s" % e) if re.match(value, role, re.IGNORECASE) is None: match = False else: log.error("Failed to process 'syspurpose_role' in '%s'\ , the syspurpose module is not available" % fname) if match: # remove the ",.*" suffix r = re.compile(r",[^,]*$") matching_profile = r.sub("", section) break except (IOError, OSError, ConfigObjError) as e: log.error("error processing '%s', %s" % (fname, e)) return matching_profile PK[ۜvr@r@&site-packages/tuned/utils/commands.pyonu[ \c@sddlZddlZddlZddlZddlZddljZddlZddl Tddl m Z ej j ZdddYZdS(iN(t*(tTunedExceptiontcommandscBseZedZdZdZdZdZdZdddZ ddZ d Z d Z d Z d(d d Zd(dZeedZdedZedZedZedZedZdZdZedZedZed(igedZedZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)RS()cCs ||_dS(N(t_logging(tselftlogging((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt__init__scCs|jrtj|ndS(N(Rtlogterror(Rtmsg((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt_errors cCs|jrtj|ndS(N(RRtdebug(RR ((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt_debugs cCs`t|jj}idd6dd6dd6dd6dd6dd6dd 6dd 6j||S( Nt1tYtYEStTtTRUEt0tNtNOtFtFALSE(tstrtuppertstriptget(Rtvaluetv((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_boolscCstjddt|jS(Ns\s+t (tretsubRR(Rts((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt remove_wsscCstjdd|S(Ns^"(.*)"$s\1(RR (RR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytunquote!ss\cCs|j|d||fS(Ns%s%s(treplace(RR!t what_escapet escape_by((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytescape%scCs|j|dS(Nt(R$(RR!t escape_char((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytunescape)scCs|d|t||S(NR(tlen(Rts1tposts2((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt align_str-scCsFg}|dk rBx-t|jD]}|t|7}q%Wn|S(N(tNonetsortedtitemstlist(Rtdtlti((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt dict2list3s  cCs6|dkrdStjddjt|jS(Ns(%s)s)|((R0RtcompiletjoinR3tkeys(RR4((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytre_lookup_compile;s ics{dkr|dkrA|Sn"tdks=|dkrA|S|dkr_|j}n|jfd||S(Nicstj|jdS(Ni(R3tvaluest lastindex(tmo(R4(s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytLs(R0R+R;R (RR4R!trtflags((R4s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytmultiple_re_replaceCs   cCstt|dks|dkr"dS|dkr@|j|}n|j|}|rpt|j|jdSdS(Nii(R+R0R;tsearchR3R<R=(RR4R!R@R>((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt re_lookupRs c Cs|jd||f|rMtjj|}tjj|rMt}qMnyL|rftj|nt|d}|jt ||j t }Wn?t t fk r}t}|s|jd||fqnX|S(NsWriting to file: '%s' < '%s'tws Writing to file '%s' error: '%s'(R tostpathtdirnametisdirtFalsetmakedirstopentwriteRtclosetTruetOSErrortIOErrorR ( Rtftdatatmakedirtno_errorR4tfdtrcte((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt write_to_file\s"   R(cCs|}y)t|d}|j}|jWn9ttfk rj}|sk|jd||fqknX|jd||f|S(NR@s"Error when reading file '%s': '%s's Read data from file: '%s' > '%s'(RLtreadRNRPRQR R (RRRterr_retRUt old_valueRX((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt read_fileos cCs{|jd|tjj|rwytj||Wqwtk rs}|sotjd|t |fnt SXnt S(NsRemoving tree: '%s'scannot remove tree '%s': '%s'( R RFRGtexiststshutiltrmtreeRPRRRRJRO(RRRRUR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyR`{s cCsx|jd|tjj|rtytj|Wqttk rp}|sltjd|t|fnt SXnt S(NsRemoving file: '%s'scannot remove file '%s': '%s'( R RFRGR^tunlinkRPRRRRJRO(RRRRUR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRas cCso|jd||fytj||Wn=tk rj}|sftjd||t|fntSXtS(NsRenaming file '%s' to '%s's%cannot rename file '%s' to '%s': '%s'( R RFtrenameRPRRRRJRO(RtsrctdstRUR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRbs#cCsmy/tjd||ftj||tSWn7tk rh}|sdtjd|||fntSXdS(Nscopying file '%s' to '%s's!cannot copy file '%s' to '%s': %s(RR R_tcopyRORQRRJ(RRcRdRURX((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRescCsM|j|}t|dkr%tS|j|tj|||dtjS(NiRA(R]R+RJRYRR t MULTILINE(RRRtpatterntreplRS((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytreplace_in_filescCsJ|j|}t|dkr%tS|j||j||dtjS(NiRA(R]R+RJRYRBRRf(RRRR4RS((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytmultiple_replace_in_filescCs|j|}x|D]}t|}t||}tjd|d|dtjdkr|rt|dkr|ddkr|d7}n|d||f7}qqtjd|d d |d |dtj}qW|j||S( Ns\bs\s*=.*$RAiis s%s="%s" s\b(s\s*=).*$s\1s"s\1"( R]RRRCRfR0R+R RY(RRRR4taddRStopttoR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytadd_modify_option_in_files  )" 2cCs|jtj|jS(N(R]tconststMACHINE_ID_FILER(RRU((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_machine_idscCsd}tjj}d|d<|j||jdt|d} d} yt|dtdtd|d |d |d t d t } | j \} } | j }|r||krd|kr| d } t | dkr| d } nd|d| f} |s|j | qnWnttfk r}|jdk rI|j nd }t||krd|krd|d|f} |s|j | qqnX|r|| | fS|| fSdS(NitCtLC_ALLs Executing %s.R(tstdouttstderrtenvtshelltcwdt close_fdstuniversal_newlinesisExecuting %s error: %s(RFtenvironRetupdateR RR0tPopentPIPEROt communicatet returncodeR+R RPRQterrnotabs(RtargsRwRxRvt no_errorst return_errtretcodet _environmenttoutterr_msgtprocterrterr_outRX((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytexecutes>        cCs=tjd|}|r%|jdS|r9|jdS|S(Ns.*\[([^\]]+)\].*ii(Rtmatchtgrouptsplit(Rtoptionstdosplittm((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_active_options  cCs;t|}|dkp:|jd|dtjdkS(NRs$/sys/devices/system/cpu/cpu%s/onlineRUR (RR]ROR(Rtcputscpu((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt is_cpu_onlines cCst|dkrdSt|jdd}yt|d}Wn)tk rftjdt|gSX|j|S(Nt,R(isinvalid hexadecimal mask '%s'(R0RR$tintt ValueErrorRRtbitmask2cpulist(RtmaskR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt hex2cpulists  cCsQd}g}x>|dkrL|d@r5|j|n|dL}|d7}qW|S(Nii(tappend(RRRtcpus((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRs  c Csg}|dkr|St|tkr1|}nt|jd}g}g}t}d}xW|D]O}t|} |rt| dkrt}|j|d}q|| 7}qe| dd!jdkrt }| }qe| r| ddks| ddkr| djd } yat| dkrb|tt t | dt | dd7}n|jt | dWqt k rgSXqet| dkre|j| qeqeWt|dkr|j|nx|D]}|jd } |dd!jdkr%||j |7}qyat| dkrn|tt t | dt | dd7}n|jt | dWqt k rgSXqWttt|} x*|D]"} | | kr| j| qqW| S( NRR(iit0xt^t!it-(R0ttypeR3RRRJR+RtlowerROtrangeRRRR1tsettremove(RR5trltlltll2t negation_listthexmaskthvRtsvtnltvltcpu_listR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytcpulist_unpacksd        &    4    cCs?|j|}|dks-t|dkr1|Sd}|}g}x|dt|kr||d||dkr||kr|jt||dt||n|jt|||d}n|d7}qFW|dt|kr$|jt||dt|dn|jt|d|S(NiiRi(RR0R+RR(RR5R6tjR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt cpulist_packbs" , ,cCsA|j|}|j|jd}tt|t|S(Ns/sys/devices/system/cpu/online(RR]R3R(RR5Rtonline((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytcpulist_invertxscs|dkrdS|j|}|dkr/dS|j|}d|t}|ddkry|d|d7}nj|djfdtdtdDS(Ns%xiiRc3s |]}||d!VqdS(iN((t.0R6(R!(s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pys s(R0Rtcpulist2bitmaskR+tzfillR9R(RR5tulRtls((R!s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyt cpulist2hex~s    cCs.d}x!|D]}|td|O}q W|S(Nii(tpow(RR5RR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRs cCs,y|j|tSWn|j|SXdS(N(twaitRJ(Rt terminatettime((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyRscCst|jj}xddddgD]}|j|}|dkrRq+nyt|| }||}|dkr|d9}nG|dkr|d9}n.|dkr|d 9}n|dkrd}n|SWq+tk rdSXq+WdS( NtKBtMBtGBR(iiiii@(RRRtrfindRR0R(RR!tunittunit_ixtvaltu((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_sizes&           c Csd}d}y1ttjd}|jj}WdQXWn`tk rw}|jtjkrtd|qn)t t fk r}td|nXybttj dJ}|jj}|dtj tj gkrtdtj nWdQXWn`tk r<}|jtjkretd|qen)t t fk rd}td|nX|dkrzd}n|tj k}|dkrd}n||fS(NR(R@s!Failed to read active profile: %ssInvalid value in file %s.sFailed to read profile mode: %s(RLRotACTIVE_PROFILE_FILERZRRQRtENOENTRRPtEOFErrortPROFILE_MODE_FILEtACTIVE_PROFILE_AUTOtACTIVE_PROFILE_MANUALR0(Rt profile_nametmodeRRRXtmanual((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytget_active_profiles4     cCsy?ttjd'}|dk r8|j|dnWdQXWn,ttfk rm}td|jnXyHttj d0}|rtj ntj }|j|dWdQXWn,ttfk r}td|jnXdS(NREs s!Failed to save active profile: %ssFailed to save profile mode: %s( RLRoRR0RMRPRQRtstrerrorRRR(RRRRRRXR((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pytsave_active_profiles N(*t__name__t __module__RORR R RR"R#R'R*R/R7R;R0RBRDRJRYR]R`RaRbReRiRjRnRqRRRRRRRRRRRRRR(((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyR sJ              '   C      ((Rt tuned.logsttunedReRFR_t tuned.constsRoRt subprocessttuned.exceptionsRtlogsRRR(((s8/usr/lib/python2.7/site-packages/tuned/utils/commands.pyts       PK[`..%site-packages/tuned/utils/nettool.pyonu[ \c@scdgZddlZddlTddlZejjZdddYZdZ ie _ dS(tethcardiN(t*tNettoolcBseZiddgd6ddgd6ddgd6d d gd 6d d gd 6dd6ZeZdZdZdZdZdZ dZ dZ dZ dZ RS(iii iiidii iiii ii'i?tautocCs||_|jtjd||j|j|j|jftjd||j|j ftjd||j |j fdS(Ns1%s: speed %s, full duplex %s, autoneg %s, link %ss"%s: supports: autoneg %s, modes %ss$%s: advertises: autoneg %s, modes %s( t _interfacetupdatetlogtdebugtspeedt full_duplextautonegtlinktsupported_autonegtsupported_modestadvertised_autonegtadvertised_modes(tselft interface((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt__init__s   , cCsLd|_t|_t|_t|_g|_t|_g|_t|_dS(Ni( RtFalseR R R R R RR(R((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt _clean_status"s       cCsDd}x7|D]/}||j|d|dr4dnd7}q W|S(Nii(t_advertise_values(Rtmodestmodetm((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt_calculate_mode.s -cCsT|j|krtS|js tSdtdd|jd|rAdndgdtkS(Nitethtools-sR tontofft close_fds(R tTrueR RtcallR(Rtenable((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt_set_autonegotiation5s  cCs?|jtstSdtdd|jdd|gdtkS(NiRs-st advertises0x%03xR(R!RRRR(Rtvalue((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt_set_advertise>scCsOd}x.|jD]#}|d|kr|d}qqW|dkrG|SdSdS(Nii(R (RtmaxR((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt get_max_speedDs cCsC|js|j rtS|j|jdr;|jtStSdS(NR(t _disabledR RR$RRR(R((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt set_max_speedNs  cCs|js|j rtSd}x\|jD]Q}|dkr?q'n||kr'||j|d7}||j|d7}q'q'W||j|j@}tjd|j||f|j |r|j t StSdS(NiRis)%s: set_speed(%d) - effective_mode 0x%03x( R'R RRRR RRRR$RR(RRRtamteffective_mode((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt set_speedYs   c Cs?|jr dStd|jgdtdtdtdt}tddgd|jdtdtdt}|jd }|jd }|d krtjd |jtj d |j|j ddf|j t|_dS|j t j d}t j d}d}x&|jdD]}|jdr|d } | dkrVd}n| dkrkd}n| dkrd}no| dkrd}nZ| dkrd}nE| dkrd }n0| d!krd"}n| d#krd$}nd}~ q"|dkr<y|j|jd |_Wnd%|_nXd}q"|dkr`|d&k|_d}q"|dkr|d'kp|d(k|_d}q"|dkr|d'k|_d}q"|dkrJygxW|jD]I} |j| jd d)\} } |jjt| | d&kfqW~ ~ ~ Wq7|jjd%tfq7Xq"|d krn|d*k|_d}q"|d"kryv|d+krxW|jD]I} |j| jd d)\} } |jjt| | d&kfqW~ ~ ~ nWq7|jjd%tfq7Xq"|d$kr"|d*k|_d}q"q"WdS(,NRtstdouttstderrRtuniversal_newlinestsedss/^\s*//;s/:\s*/:\n/gtstdiniits*%s: some errors were reported by 'ethtool's%s: %ss s\ns(\d+)s(\d+)baseT/(Half|Full)twaitt:itSpeedRtDuplextduplexsAuto-negotiationR s Link detectedR sSupported link modesR sSupports auto-negotiationR sAdvertised link modesRsAdvertised auto-negotiationRitFulltyesRitYess Not reported(R'tPopenRtPIPERR,t communicateRtwarningRtreplaceRtretcompiletsplittendswithtmatchtgroupRR R R R tappendtintR RR( Rt p_ethtooltp_filtertoutputterrorstre_speedtre_modetstatetlinetsectionRtstd((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyRns    &                      !&     !& (t__name__t __module__RRR'RRRR!R$R&R(R+R(((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyR s"         cCs0|tjkr%t|tj|s     PK[e{  +site-packages/tuned/utils/plugin_loader.pycnu[ \c@sJddlZddlZdgZejjZdefdYZdS(iNt PluginLoadercBsDeZdddgZdZdZdZdZdZRS(t _namespacet_prefixt _interfacecCs tdS(s~ This method has to be implemented in child class and should set _namespace, _prefix, and _interface member attributes. N(tNotImplementedError(tself((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyt_set_loader_parameters scCstt|jd|_d|_d|_|jt|jt ksSt t|jt ksnt t|jtkrt |jt st dS(N( tsuperRt__init__tNoneRRRRttypetstrtAssertionErrort issubclasstobject(R((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyRs    cCs>t|tkstd|j|j|f}|j|S(Ns%s.%s%s(R R R RRt _get_class(Rt plugin_namet module_name((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyt load_pluginscCstjd|t|}|jd}|jdx.t|dkrit||jd}q<WxH|jD]=}t||}t|tkrtt ||j rt|SqtWt ddS(Nsloading module %st.isCannot find the plugin class.( tlogtdebugt __import__tsplittpoptlentgetattrt__dict__R R Rt ImportError(RRtmoduletpathtnametcls((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyR"s  $cCst|j}g}xtj|jjdD]}ygtjj|d}|jdscw/n|j d|j|f}||kr|j |nWq/t k rq/Xq/W|S(Nitplugin_s%s.%s( RRtostlistdirtpluginst__path__Rtsplitextt startswithRtappendR(Rtplugins_packaget plugin_clssRt plugin_class((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pytload_all_plugins2s   (t__name__t __module__t __slots__RRRRR,(((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyRs    ( t tuned.logsttunedR"t__all__tlogstgetRRR(((s=/usr/lib/python2.7/site-packages/tuned/utils/plugin_loader.pyts   PK[$ FF$site-packages/tuned/utils/nettool.pynu[__all__ = ["ethcard"] import tuned.logs from subprocess import * import re log = tuned.logs.get() class Nettool: _advertise_values = { # [ half, full ] 10 : [ 0x001, 0x002 ], 100 : [ 0x004, 0x008 ], 1000 : [ 0x010, 0x020 ], 2500 : [ 0, 0x8000 ], 10000 : [ 0, 0x1000 ], "auto" : 0x03F } _disabled = False def __init__(self, interface): self._interface = interface; self.update() log.debug("%s: speed %s, full duplex %s, autoneg %s, link %s" % (interface, self.speed, self.full_duplex, self.autoneg, self.link)) log.debug("%s: supports: autoneg %s, modes %s" % (interface, self.supported_autoneg, self.supported_modes)) log.debug("%s: advertises: autoneg %s, modes %s" % (interface, self.advertised_autoneg, self.advertised_modes)) # def __del__(self): # if self.supported_autoneg: # self._set_advertise(self._advertise_values["auto"]) def _clean_status(self): self.speed = 0 self.full_duplex = False self.autoneg = False self.link = False self.supported_modes = [] self.supported_autoneg = False self.advertised_modes = [] self.advertised_autoneg = False def _calculate_mode(self, modes): mode = 0; for m in modes: mode += self._advertise_values[m[0]][ 1 if m[1] else 0 ] return mode def _set_autonegotiation(self, enable): if self.autoneg == enable: return True if not self.supported_autoneg: return False return 0 == call(["ethtool", "-s", self._interface, "autoneg", "on" if enable else "off"], close_fds=True) def _set_advertise(self, value): if not self._set_autonegotiation(True): return False return 0 == call(["ethtool", "-s", self._interface, "advertise", "0x%03x" % value], close_fds=True) def get_max_speed(self): max = 0 for mode in self.supported_modes: if mode[0] > max: max = mode[0] if max > 0: return max else: return 1000 def set_max_speed(self): if self._disabled or not self.supported_autoneg: return False #if self._set_advertise(self._calculateMode(self.supported_modes)): if self._set_advertise(self._advertise_values["auto"]): self.update() return True else: return False def set_speed(self, speed): if self._disabled or not self.supported_autoneg: return False mode = 0 for am in self._advertise_values: if am == "auto": continue if am <= speed: mode += self._advertise_values[am][0]; mode += self._advertise_values[am][1]; effective_mode = mode & self._calculate_mode(self.supported_modes) log.debug("%s: set_speed(%d) - effective_mode 0x%03x" % (self._interface, speed, effective_mode)) if self._set_advertise(effective_mode): self.update() return True else: return False def update(self): if self._disabled: return # run ethtool and preprocess output p_ethtool = Popen(["ethtool", self._interface], \ stdout=PIPE, stderr=PIPE, close_fds=True, \ universal_newlines = True) p_filter = Popen(["sed", "s/^\s*//;s/:\s*/:\\n/g"], \ stdin=p_ethtool.stdout, stdout=PIPE, \ universal_newlines = True, \ close_fds=True) output = p_filter.communicate()[0] errors = p_ethtool.communicate()[1] if errors != "": log.warning("%s: some errors were reported by 'ethtool'" % self._interface) log.debug("%s: %s" % (self._interface, errors.replace("\n", r"\n"))) self._clean_status() self._disabled = True return # parses output - kind of FSM self._clean_status() re_speed = re.compile(r"(\d+)") re_mode = re.compile(r"(\d+)baseT/(Half|Full)") state = "wait" for line in output.split("\n"): if line.endswith(":"): section = line[:-1] if section == "Speed": state = "speed" elif section == "Duplex": state = "duplex" elif section == "Auto-negotiation": state = "autoneg" elif section == "Link detected": state = "link" elif section == "Supported link modes": state = "supported_modes" elif section == "Supports auto-negotiation": state = "supported_autoneg" elif section == "Advertised link modes": state = "advertised_modes" elif section == "Advertised auto-negotiation": state = "advertised_autoneg" else: state = "wait" del section elif state == "speed": # Try to determine speed. If it fails, assume 1gbit ethernet try: self.speed = re_speed.match(line).group(1) except: self.speed = 1000 state = "wait" elif state == "duplex": self.full_duplex = line == "Full" state = "wait" elif state == "autoneg": self.autoneg = (line == "yes" or line == "on") state = "wait" elif state == "link": self.link = line == "yes" state = "wait" elif state == "supported_modes": # Try to determine supported modes. If it fails, assume 1gibt ethernet fullduplex works try: for m in line.split(): (s, d) = re_mode.match(m).group(1,2) self.supported_modes.append( (int(s), d == "Full") ) del m,s,d except: self.supported_modes.append((1000, True)) elif state == "supported_autoneg": self.supported_autoneg = line == "Yes" state = "wait" elif state == "advertised_modes": # Try to determine advertised modes. If it fails, assume 1gibt ethernet fullduplex works try: if line != "Not reported": for m in line.split(): (s, d) = re_mode.match(m).group(1,2) self.advertised_modes.append( (int(s), d == "Full") ) del m,s,d except: self.advertised_modes.append((1000, True)) elif state == "advertised_autoneg": self.advertised_autoneg = line == "Yes" state = "wait" def ethcard(interface): if not interface in ethcard.list: ethcard.list[interface] = Nettool(interface) return ethcard.list[interface] ethcard.list = {} PK[aDd&site-packages/tuned/utils/__init__.pyonu[ \c@sdS(N((((s8/usr/lib/python2.7/site-packages/tuned/utils/__init__.pytsPK[`..%site-packages/tuned/utils/nettool.pycnu[ \c@scdgZddlZddlTddlZejjZdddYZdZ ie _ dS(tethcardiN(t*tNettoolcBseZiddgd6ddgd6ddgd6d d gd 6d d gd 6dd6ZeZdZdZdZdZdZ dZ dZ dZ dZ RS(iii iiidii iiii ii'i?tautocCs||_|jtjd||j|j|j|jftjd||j|j ftjd||j |j fdS(Ns1%s: speed %s, full duplex %s, autoneg %s, link %ss"%s: supports: autoneg %s, modes %ss$%s: advertises: autoneg %s, modes %s( t _interfacetupdatetlogtdebugtspeedt full_duplextautonegtlinktsupported_autonegtsupported_modestadvertised_autonegtadvertised_modes(tselft interface((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt__init__s   , cCsLd|_t|_t|_t|_g|_t|_g|_t|_dS(Ni( RtFalseR R R R R RR(R((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt _clean_status"s       cCsDd}x7|D]/}||j|d|dr4dnd7}q W|S(Nii(t_advertise_values(Rtmodestmodetm((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt_calculate_mode.s -cCsT|j|krtS|js tSdtdd|jd|rAdndgdtkS(Nitethtools-sR tontofft close_fds(R tTrueR RtcallR(Rtenable((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt_set_autonegotiation5s  cCs?|jtstSdtdd|jdd|gdtkS(NiRs-st advertises0x%03xR(R!RRRR(Rtvalue((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt_set_advertise>scCsOd}x.|jD]#}|d|kr|d}qqW|dkrG|SdSdS(Nii(R (RtmaxR((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt get_max_speedDs cCsC|js|j rtS|j|jdr;|jtStSdS(NR(t _disabledR RR$RRR(R((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt set_max_speedNs  cCs|js|j rtSd}x\|jD]Q}|dkr?q'n||kr'||j|d7}||j|d7}q'q'W||j|j@}tjd|j||f|j |r|j t StSdS(NiRis)%s: set_speed(%d) - effective_mode 0x%03x( R'R RRRR RRRR$RR(RRRtamteffective_mode((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyt set_speedYs   c Cs?|jr dStd|jgdtdtdtdt}tddgd|jdtdtdt}|jd }|jd }|d krtjd |jtj d |j|j ddf|j t|_dS|j t j d}t j d}d}x&|jdD]}|jdr|d } | dkrVd}n| dkrkd}n| dkrd}no| dkrd}nZ| dkrd}nE| dkrd }n0| d!krd"}n| d#krd$}nd}~ q"|dkr<y|j|jd |_Wnd%|_nXd}q"|dkr`|d&k|_d}q"|dkr|d'kp|d(k|_d}q"|dkr|d'k|_d}q"|dkrJygxW|jD]I} |j| jd d)\} } |jjt| | d&kfqW~ ~ ~ Wq7|jjd%tfq7Xq"|d krn|d*k|_d}q"|d"kryv|d+krxW|jD]I} |j| jd d)\} } |jjt| | d&kfqW~ ~ ~ nWq7|jjd%tfq7Xq"|d$kr"|d*k|_d}q"q"WdS(,NRtstdouttstderrRtuniversal_newlinestsedss/^\s*//;s/:\s*/:\n/gtstdiniits*%s: some errors were reported by 'ethtool's%s: %ss s\ns(\d+)s(\d+)baseT/(Half|Full)twaitt:itSpeedRtDuplextduplexsAuto-negotiationR s Link detectedR sSupported link modesR sSupports auto-negotiationR sAdvertised link modesRsAdvertised auto-negotiationRitFulltyesRitYess Not reported(R'tPopenRtPIPERR,t communicateRtwarningRtreplaceRtretcompiletsplittendswithtmatchtgroupRR R R R tappendtintR RR( Rt p_ethtooltp_filtertoutputterrorstre_speedtre_modetstatetlinetsectionRtstd((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyRns    &                      !&     !& (t__name__t __module__RRR'RRRR!R$R&R(R+R(((s7/usr/lib/python2.7/site-packages/tuned/utils/nettool.pyR s"         cCs0|tjkr%t|tj|s     PK[rz$site-packages/tuned/utils/polkit.pycnu[ \c@s>ddlZddlZejjZdddYZdS(iNtpolkitcBseZdZdZRS(cCsLtj|_|jjdddt|_tj|jdd|_dS(Nsorg.freedesktop.PolicyKit1s%/org/freedesktop/PolicyKit1/Authoritytfollow_name_owner_changestdbus_interfaces$org.freedesktop.PolicyKit1.Authority(tdbust SystemBust_bust get_objecttTruet_proxyt Interfacet _authority(tself((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pyt__init__sc Cs|d ks|d krtSi}d}d}di|d6f}y&|jj|||||d}Wntjjtfk r}tj d|y|j j |} Wn+tjjk r}tj d|dSX| dkrd Sd SnX|rdSdS( sCheck authorization, return codes: 1 - authorized 2 - polkit error, but authorized with fallback method 0 - unauthorized -1 - polkit error and unauthorized by the fallback method -2 - polkit error and unable to use the fallback method itssystem-bus-nametnameiserror querying polkit: %ss,error using falback authorization method: %siiiN( tNonetFalseR tCheckAuthorizationRt exceptionst DBusExceptiont ValueErrortlogterrorRt get_unix_user( R tsendert action_idtdetailstflagstcancellation_idtsubjecttrettetuid((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pytcheck_authorization s& & (t__name__t __module__R R!(((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pyRs ((Rt tuned.logsttunedtlogstgetRR(((s6/usr/lib/python2.7/site-packages/tuned/utils/polkit.pyts  PK[iR1site-packages/tuned/utils/profile_recommender.pyonu[ \c@sddlZddlZddlZddlZddlZddlmZmZeZ y=ej dkrej d krddl Z e Z nWnnXyddlZe ZWn eZnXddljZddlZdd lmZejjZd d d YZdS(iN(t ConfigObjtConfigObjErroriti386ti486ti586ti686tx86_64(tcommandstProfileRecommendercBs)eZdZedZedZRS(cCst|_dS(N(Rt _commands(tself((sC/usr/lib/python2.7/site-packages/tuned/utils/profile_recommender.pyt__init__sc CsXtj}|r|Stjdk}|s;tjdn|jtjd|}|dk rc|Si}xtj D]}g}ytj |}Wn?t k r}|j t j krtjd||fqnXx-|D]%} tjj|| } | || s,     $      PK[ *site-packages/tuned/utils/plugin_loader.pynu[import tuned.logs import os __all__ = ["PluginLoader"] log = tuned.logs.get() class PluginLoader(object): __slots__ = ["_namespace", "_prefix", "_interface"] def _set_loader_parameters(self): """ This method has to be implemented in child class and should set _namespace, _prefix, and _interface member attributes. """ raise NotImplementedError() def __init__(self): super(PluginLoader, self).__init__() self._namespace = None self._prefix = None self._interface = None self._set_loader_parameters() assert type(self._namespace) is str assert type(self._prefix) is str assert type(self._interface) is type and issubclass(self._interface, object) def load_plugin(self, plugin_name): assert type(plugin_name) is str module_name = "%s.%s%s" % (self._namespace, self._prefix, plugin_name) return self._get_class(module_name) def _get_class(self, module_name): log.debug("loading module %s" % module_name) module = __import__(module_name) path = module_name.split(".") path.pop(0) while len(path) > 0: module = getattr(module, path.pop(0)) for name in module.__dict__: cls = getattr(module, name) if type(cls) is type and issubclass(cls, self._interface): return cls raise ImportError("Cannot find the plugin class.") def load_all_plugins(self): plugins_package = __import__(self._namespace) plugin_clss = [] for module_name in os.listdir(plugins_package.plugins.__path__[0]): try: module_name = os.path.splitext(module_name)[0] if not module_name.startswith("plugin_"): continue plugin_class = self._get_class( "%s.%s" % (self._namespace, module_name) ) if plugin_class not in plugin_clss: plugin_clss.append(plugin_class) except ImportError: pass return plugin_clss PK[$d#site-packages/tuned/utils/polkit.pynu[import dbus import tuned.logs log = tuned.logs.get() class polkit(): def __init__(self): self._bus = dbus.SystemBus() self._proxy = self._bus.get_object('org.freedesktop.PolicyKit1', '/org/freedesktop/PolicyKit1/Authority', follow_name_owner_changes = True) self._authority = dbus.Interface(self._proxy, dbus_interface='org.freedesktop.PolicyKit1.Authority') def check_authorization(self, sender, action_id): """Check authorization, return codes: 1 - authorized 2 - polkit error, but authorized with fallback method 0 - unauthorized -1 - polkit error and unauthorized by the fallback method -2 - polkit error and unable to use the fallback method """ if sender is None or action_id is None: return False details = {} flags = 1 # AllowUserInteraction flag cancellation_id = "" # No cancellation id subject = ("system-bus-name", {"name" : sender}) try: ret = self._authority.CheckAuthorization(subject, action_id, details, flags, cancellation_id)[0] except (dbus.exceptions.DBusException, ValueError) as e: log.error("error querying polkit: %s" % e) # No polkit or polkit error, fallback to always allow root try: uid = self._bus.get_unix_user(sender) except dbus.exceptions.DBusException as e: log.error("error using falback authorization method: %s" % e) return -2 if uid == 0: return 2 else: return -1 return 1 if ret else 0 PK[JR*site-packages/tuned/utils/global_config.pynu[import tuned.logs from configobj import ConfigObj, ConfigObjError from validate import Validator from tuned.exceptions import TunedException import tuned.consts as consts from tuned.utils.commands import commands __all__ = ["GlobalConfig"] log = tuned.logs.get() class GlobalConfig(): global_config_spec = ["dynamic_tuning = boolean(default=%s)" % consts.CFG_DEF_DYNAMIC_TUNING, "sleep_interval = integer(default=%s)" % consts.CFG_DEF_SLEEP_INTERVAL, "update_interval = integer(default=%s)" % consts.CFG_DEF_UPDATE_INTERVAL, "recommend_command = boolean(default=%s)" % consts.CFG_DEF_RECOMMEND_COMMAND] def __init__(self,config_file = consts.GLOBAL_CONFIG_FILE): self._cfg = {} self.load_config(file_name=config_file) self._cmd = commands() def load_config(self, file_name = consts.GLOBAL_CONFIG_FILE): """ Loads global configuration file. """ log.debug("reading and parsing global configuration file '%s'" % file_name) try: self._cfg = ConfigObj(file_name, configspec = self.global_config_spec, raise_errors = True, \ file_error = True, list_values = False, interpolation = False) except IOError as e: raise TunedException("Global tuned configuration file '%s' not found." % file_name) except ConfigObjError as e: raise TunedException("Error parsing global tuned configuration file '%s'." % file_name) vdt = Validator() if (not self._cfg.validate(vdt, copy=True)): raise TunedException("Global tuned configuration file '%s' is not valid." % file_name) def get(self, key, default = None): return self._cfg.get(key, default) def get_bool(self, key, default = None): if self._cmd.get_bool(self.get(key, default)) == "1": return True return False def set(self, key, value): self._cfg[key] = value def get_size(self, key, default = None): val = self.get(key) if val is None: return default ret = self._cmd.get_size(val) if ret is None: log.error("Error parsing value '%s', using '%s'." %(val, default)) return default else: return ret PK[W5 -- site-packages/tuned/__init__.pycnu[ \c@sdZdZdZdS(s!Copyright 2008-2013 Red Hat, Inc.sGPLv2+s(power-management@lists.fedoraproject.orgN(t __copyright__t __license__t __email__(((s2/usr/lib/python2.7/site-packages/tuned/__init__.pytsPK[%site-packages/tuned/logs.pynu[import atexit import logging import logging.handlers import os import os.path import inspect import tuned.consts as consts import random import string import threading try: from StringIO import StringIO except: from io import StringIO __all__ = ["get"] root_logger = None log_handlers = {} log_handlers_lock = threading.Lock() class LogHandler(object): def __init__(self, handler, stream): self.handler = handler self.stream = stream def _random_string(length): r = random.SystemRandom() chars = string.ascii_letters + string.digits res = "" for i in range(length): res += r.choice(chars) return res def log_capture_start(log_level): with log_handlers_lock: for i in range(10): token = _random_string(16) if token not in log_handlers: break else: return None stream = StringIO() handler = logging.StreamHandler(stream) handler.setLevel(log_level) formatter = logging.Formatter( "%(levelname)-8s %(name)s: %(message)s") handler.setFormatter(formatter) root_logger.addHandler(handler) log_handler = LogHandler(handler, stream) log_handlers[token] = log_handler root_logger.debug("Added log handler %s." % token) return token def log_capture_finish(token): with log_handlers_lock: try: log_handler = log_handlers[token] except KeyError: return None content = log_handler.stream.getvalue() log_handler.stream.close() root_logger.removeHandler(log_handler.handler) del log_handlers[token] root_logger.debug("Removed log handler %s." % token) return content def get(): global root_logger if root_logger is None: root_logger = logging.getLogger("tuned") calling_module = inspect.currentframe().f_back name = calling_module.f_locals["__name__"] if name == "__main__": name = "tuned" return root_logger elif name.startswith("tuned."): (root, child) = name.split(".", 1) child_logger = root_logger.getChild(child) child_logger.remove_all_handlers() child_logger.setLevel("NOTSET") return child_logger else: assert False class TunedLogger(logging.getLoggerClass()): """Custom tuned daemon logger class.""" _formatter = logging.Formatter("%(asctime)s %(levelname)-8s %(name)s: %(message)s") _console_handler = None _file_handler = None def __init__(self, *args, **kwargs): super(TunedLogger, self).__init__(*args, **kwargs) self.setLevel(logging.INFO) self.switch_to_console() def console(self, msg, *args, **kwargs): self.log(consts.LOG_LEVEL_CONSOLE, msg, *args, **kwargs) def switch_to_console(self): self._setup_console_handler() self.remove_all_handlers() self.addHandler(self._console_handler) def switch_to_file(self, filename = consts.LOG_FILE, maxBytes = consts.LOG_FILE_MAXBYTES, backupCount = consts.LOG_FILE_COUNT): self._setup_file_handler(filename, maxBytes, backupCount) self.remove_all_handlers() self.addHandler(self._file_handler) def remove_all_handlers(self): _handlers = self.handlers for handler in _handlers: self.removeHandler(handler) @classmethod def _setup_console_handler(cls): if cls._console_handler is not None: return cls._console_handler = logging.StreamHandler() cls._console_handler.setFormatter(cls._formatter) @classmethod def _setup_file_handler(cls, filename, maxBytes, backupCount): if cls._file_handler is not None: return log_directory = os.path.dirname(filename) if log_directory == '': log_directory = '.' if not os.path.exists(log_directory): os.makedirs(log_directory) cls._file_handler = logging.handlers.RotatingFileHandler( filename, maxBytes = int(maxBytes), backupCount = int(backupCount)) cls._file_handler.setFormatter(cls._formatter) logging.addLevelName(consts.LOG_LEVEL_CONSOLE, consts.LOG_LEVEL_CONSOLE_NAME) logging.setLoggerClass(TunedLogger) atexit.register(logging.shutdown) PK[F9&site-packages/tuned/admin/__init__.pycnu[ \c@s"ddlTddlTddlTdS(i(t*N(tadmint exceptionstdbus_controller(((s8/usr/lib/python2.7/site-packages/tuned/admin/__init__.pyts  PK[U+G G -site-packages/tuned/admin/dbus_controller.pyonu[ \c@s}ddlZddlZddlZddlmZddlmZmZddlm Z dgZ de fdYZ dS(iN(t DBusGMainLoop(tGLibtGObjecti(tTunedAdminDBusExceptiontDBusControllercBseZedZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZRS(cCsp||_||_||_d|_d|_||_d|_d|_d|_ t |_ t |_ d|_dS(N(t _bus_namet_interface_namet _object_nametNonet_proxyt _interfacet_debugt _main_loopt_actiont_on_exit_actiontTruet_rettFalset_exitt _exception(tselftbus_nametinterface_namet object_nametdebug((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt__init__ s           cCsyw|jdkrvtdttj|_tj}|j |j |j |_tj |jd|j |_nWn#tjjk rtdnXdS(Ntset_as_defaulttdbus_interfaces>Cannot talk to Tuned daemon via DBus. Is Tuned daemon running?(R RRRRtMainLoopR tdbust SystemBust get_objectRRt InterfaceRR t exceptionst DBusExceptionR(Rtbus((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt _init_proxys  %cCs|jdk rYy|j|j|j|_WqYtk rU}||_t|_qYXn|jr|j dk r|j |j |j n|j j tStjdtS(Ni(R Rt _action_argst_action_kwargst_action_exit_codeRRRRRt_on_exit_action_argst_on_exit_action_kwargsR tquitRttimetsleep(Rte((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt_idle$s      cOs||_||_||_dS(N(RR(R)(Rtactiontargstkwargs((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytset_on_exit_action7s  cOs||_||_||_dS(N(R R%R&(RR/R0R1((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt set_action<s  cCsHd|_tj|j|jj|jdk rA|jn|jS(N(RRRtidle_addR.R trunR(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyR5As    cOs|jy&|jj|}|dd|SWnKtjjk r}}d}|jrn|dt|7}nt|nXdS(Nttimeouti(s DBus call to Tuned daemon faileds (%s)( R$R tget_dbus_methodRR!R"R tstrR(Rt method_nameR0R1tmethodtdbus_exceptionterr_str((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt_callJs  cCs!|j|jj||dS(N(R$R tconnect_to_signal(Rtsignaltcb((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytset_signal_handlerVs cCs |jdS(Nt is_running(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRBZscCs |jdS(Ntstart(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRC]scCs |jdS(Ntstop(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRD`scCs |jdS(Ntprofiles(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyREcscCs |jdS(Nt profiles2(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRFfscCs|jd|S(Nt profile_info(R=(Rt profile_name((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRGiscCs|jd||S(Ntlog_capture_start(R=(Rt log_levelR6((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRIlscCs|jd|S(Ntlog_capture_finish(R=(Rttoken((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRKoscCs |jdS(Ntactive_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRMrscCs |jdS(Nt profile_mode(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRNuscCs&|dkrtdfS|jd|S(NtsNo profile specifiedtswitch_profile(RR=(Rt new_profile((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRPxs  cCs |jdS(Nt auto_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRR}scCs |jdS(Ntrecommend_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRSscCs |jdS(Ntverify_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRTscCs |jdS(Ntverify_profile_ignore_missing(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRUscCs |jdS(Ntdisable(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytoffscCs |jdS(szReturn dict with plugin names and their hints Return: dictionary -- {plugin_name: {parameter_name: default_value}} tget_all_plugins(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt get_pluginsscCs|jd|S(s"Return docstring of plugin's classtget_plugin_documentation(R=(Rt plugin_name((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRZscCs|jd|S(sReturn dictionary with parameters of plugin and their hints Parameters: plugin_name -- name of plugin Return: dictionary -- {parameter_name: hint} tget_plugin_hints(R=(RR[((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyR\s cCs#|jd||_t|_|S(N(R3RRRR(Rtret((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytexits   (t__name__t __module__RRR$R.R2R3R5R=RARBRCRDRERFRGRIRKRMRNRPRRRSRTRURWRYRZR\R^(((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyR s8                        ( Rtdbus.exceptionsR+tdbus.mainloop.glibRt gi.repositoryRRR!Rt__all__tobjectR(((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyts    PK[lClC#site-packages/tuned/admin/admin.pyonu[ \c@sddlmZddlZddlmZddlmZddl m Z ddl m Z ddl jZddlmZddlZddlZddlZddlZddlZddlZd efd YZdS( i(tprint_functionN(tcommands(tLocatori(tTunedAdminDBusException(tTunedException(tProfileRecommendertAdmincBseZeeeejejdZdZ dZ dZ dZ dZ dZdZdZd Zd Zd Zd d Zd dZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&d Z'd!Z(d"Z)d#Z*d$ed%Z+d$ed&Z,ed'Z-ed(Z.RS()cCs||_||_||_||_t||_ttj|_ t j |_ d|_ t|_d|_d|_d|_||_t|_|jrtjjtjtjtj||_y|jjtj|jWqt k r}|j!|t"|_qXndS(Nt(#t_dbust_debugt_asynct_timeoutRt_cmdtprofiles_locatortconststLOAD_DIRECTORIESt_profiles_locatort threadingtEventt_daemon_action_finishedt_daemon_action_profiletTruet_daemon_action_resultt_daemon_action_errstrtNonet _controllert _log_tokent _log_levelRt_profile_recommenderttunedtadmintDBusControllertDBUS_BUStDBUS_INTERFACEt DBUS_OBJECTtset_signal_handlertDBUS_SIGNAL_PROFILE_CHANGEDt_signal_profile_changed_cbRt_errortFalse(tselftdbustdebugtasyncottimeoutt log_levelte((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt__init__s*            ' cCst|dtjdS(Ntfile(tprinttsyststderr(R(tmessage((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyR&+scCs>|jjs:||_||_||_|jjndS(N(Rtis_setRRRtset(R(t profile_nametresultterrstr((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyR%.s    cCsiy)tjt|jjtjdWn9tk rK}|jtj kSt t fk rd}t SXt S(Ni(tostkilltintR t read_fileRtPID_FILEtOSErrorterrnotEPERMt ValueErrortIOErrorR'R(R(R.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_tuned_is_running6s)cOsL|dks|dkrtSd}d}t}yt|d|}Wntk rc}t|_nXyt|d|}Wn;tk r}|js|jt|d|tSnX|jr-y<|jj|j |jj ||||jj }Wq-t k r)}|j|t|_q-Xn|jsH|||}n|S(NRt _action_dbus_t_action_s , action '%s' is not implemented( RR'tgetattrtAttributeErrorRR&tstrRtset_on_exit_actiont_log_capture_finisht set_actiontrunR(R(t action_nametargstkwargstactiont action_dbustresR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRQ@s6       c Cstdxo|D]g}|ddk rf|ddkrft|jjd|ddd|dqtd|dqWdS(NsAvailable profiles:iRs- %sii(R1RR t align_str(R(t profile_namestprofile((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profiles^s    /cCsxy|jj}Wn;tk rP}g|jjD]}|df^q5}nX|j||j|jjtS(NR(Rt profiles2RtprofilesRWt_action_dbus_activetexitR(R(RUR.RV((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_list_profilesfs,  cCs$|j|jj|jtS(N(RWRtget_known_names_summaryt_action_activeR(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_list_profilesps cCs8|jj}|dkr$d}n|jjt|S(NR(Rtactive_profileRR[R(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_dbus_get_active_profileus   cCs|jj\}}|S(N(R tget_active_profile(R(R7tmanual((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_get_active_profile|scCsD|jj\}}|dkr0|dk }n|r=tjStjS(N(R RbRRtACTIVE_PROFILE_MANUALtACTIVE_PROFILE_AUTO(R(RVRc((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_get_profile_modes cCs|dtkrjtdt|dttdt|dttdt|dtStd|tSdS( Nis Profile name:isProfile summary:isProfile description:is,Unable to get information about profile '%s'(RR1R'(R(RVt profile_info((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profile_infos   RcCsC|dkr|j}n|jj|j||jj|S(NR(RaRR[RiRh(R(RV((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_profile_infos cCs|dkrcy*|j}|dkr5tdtSWqctk r_}|jt|tSXn|j||jj |t j t j gddgS(NRsNo current active profile.( RdRR1R'RR&RIRiRtget_profile_attrsRtPROFILE_ATTR_SUMMARYtPROFILE_ATTR_DESCRIPTION(R(RVR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_profile_infos    cCs,|dkrtdtStd|tS(NsNo current active profile.sCurrent active profile: %s(RR1R'R(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profile_names   cCs|jj|j|jS(N(RR[RoRa(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRZscCs|y|j}Wn'tk r9}|jt|tSX|dk ro|j rotdtd|tS|j |S(NsKIt seems that tuned daemon is not running, preset profile is not activated.sPreset profile: %s( RdRR&RIR'RRDR1RRo(R(R7R.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyR^s cCstd|dS(NsProfile selection mode: (R1(R(tmode((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profile_modescCs[|jj\}}|j||dkrK|j||jjtS|jjtS(NR(Rt profile_modeRqR&R[R'R(R(Rpterror((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_profile_modes    cCsOy!|j}|j|tSWn'tk rJ}|jt|tSXdS(N(RgRqRRR&RIR'(R(RpR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_profile_modes  cCsP|r?|jj rL|jj rL|jdt}qLn |j||S(NsCannot enable the tuning.(Rt is_runningtstartR&R'(R(trettmsg((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_profile_print_statuss     cCstj|j|jkr=td|j|jjtS|jjr|j |kr|j std|j |jjtS|jjt SntS(NsOperation timed out after waiting %d seconds(s), you may try to increase timeout by using --timeout command line option or using --async.sError changing profile: %s( ttimet _timestampR R1RR[R'RtisSetRRRR(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_wait_profiles cCs|jdks|jdkr"dSyH|jj|j}d|_t|dddtjtjjWn tk r}|j dnXdS(NRtendR0sUError: Failed to stop log capture. Restart the Tuned daemon to prevent a memory leak.( RRRtlog_capture_finishR1R2R3tflushRR&(R(tlog_msgsR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRKs   cCst|dkr|jSdj|}|dkrG|jjtS|jj|j r|j dk r|j dd}|jj |j ||_ n|jj|\}}|js| r|jj|j||Stj|_|jj|j||j||S(Nit Rii(tlent_action_dbus_listtjoinRR[R'RtclearR RRR tlog_capture_startRtswitch_profileRzR{R|RLR~(R(RYR7R,RxRy((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_profiles     cCsRtd|jjdddg\}}|dkrDtdn tddS(NsTrying to (re)start tuned...tserviceRtrestartis#Tuned (re)started, changes applied.sQTuned (re)start failed, you need to (re)start tuned by hand for changes to apply.(R1R texecute(R(RxRy((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_restart_tuneds  !  cCs||jjkrty%|jj|||jtSWqtk rp}|jt||jdt SXn|jd|t SdS(NsUnable to switch profile.s%Requested profile '%s' doesn't exist.( Rtget_known_namesR tsave_active_profileRRRR&RIR'(R(R7RcR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt _set_profiles  cCsKt|dkr|jSdj|}|dkr;tS|j|tS(NiRR(RR_RR'RR(R(RYR7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_profiles   cCs|jj}|jj|j rd|jdk rd|jdd}|jj|j||_ n|jj \}}|js| r|jj |j ||St j |_|jj|j||j ||S(Nii(Rtrecommend_profileRRR RRR RRt auto_profileR[RzR{R|RLR~(R(R7R,RxRy((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_auto_profile$s  cCs|jj}|j|tS(N(Rt recommendRR'(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_auto_profile4scCs#t|jj|jjtS(N(R1RRR[R(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_recommend_profile8scCst|jjtS(N(R1RRR(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_recommend_profile<scCs|r|jj}n|jj}|r:tdn<tdtdtdtdtdtdtdtj|jj|S( NsHVerfication succeeded, current system settings match the preset profile.sLVerification failed, current system settings differ from the preset profile.s=You can mostly fix this by restarting the Tuned daemon, e.g.:s systemctl restart tunedtors service tuned restartsNSometimes (if some plugins like bootloader are used) a reboot may be required.s&See tuned log file ('%s') for details.(Rtverify_profile_ignore_missingtverify_profileR1RtLOG_FILER[(R(tignore_missingRx((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_verify_profile@s       cCstdtS(Ns Not supported in no_daemon mode.(R1R'(R(R((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_verify_profileQs cCsVd}|jj|j||_|jj}|sF|jdn|jj|S(NiisCannot disable active profile.i(RRRRtoffR&R[(R(R,Rx((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_offUs cCstdtS(Ns Not supported in no_daemon mode.(R1R'(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt _action_off_s RYcCs6|dkr|jS|dkr2|jd|SdS(sDPrint accessible profiles or plugins got from tuned dbus api Keyword arguments: list_choice -- argument from command line deciding what will be listed verbose -- if True then list plugin's config options and their hints if possible. Functional only with plugin listing, with profiles this argument is omitted RYtpluginstverboseN(R\t_action_dbus_list_plugins(R(t list_choiceR((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRcs   cCs6|dkr|jS|dkr2|jd|SdS(saPrint accessible profiles or plugins with no daemon mode Keyword arguments: list_choice -- argument from command line deciding what will be listed verbose -- Plugins cannot be listed in this mode, so verbose argument is here only because argparse module always supplies verbose option and if verbose was not here it would result in error RYRRN(R_t_action_list_plugins(R(RR((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt _action_listqs   cCs|jj}x|jD]}t|| st||dkrOqn|jj|}xI||D]=}td||j|d}|rltd|qlqlWqW|jjt S(svPrint accessible plugins Keyword arguments: verbose -- if is set to True then parameters and hints are printed is %ss %sN( Rt get_pluginstkeysR1Rtget_plugin_hintstgetRR[R(R(RRtpluginthintst parameterthint((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRs cCstdtS(Ns Not supported in no_daemon mode.(R1R'(R(R((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRs (/t__name__t __module__RR'Rt ADMIN_TIMEOUTtloggingtERRORR/R&R%RDRQRWR\R_RaRdRgRiRjRnRoRZR^RqRtRuRzR~RKRRRRRRRRRRRRRRRR(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRsR                           (t __future__Rt tuned.adminRttuned.utils.commandsRttuned.profilesRR t exceptionsRttuned.exceptionsRt tuned.constsRttuned.utils.profile_recommenderRR:R2R@R{RRtobjectR(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyts       PK[ϐ__'site-packages/tuned/admin/exceptions.pynu[import tuned.exceptions class TunedAdminDBusException(tuned.exceptions.TunedException): pass PK[L|NN%site-packages/tuned/admin/__init__.pynu[from .admin import * from .exceptions import * from .dbus_controller import * PK[lClC#site-packages/tuned/admin/admin.pycnu[ \c@sddlmZddlZddlmZddlmZddl m Z ddl m Z ddl jZddlmZddlZddlZddlZddlZddlZddlZd efd YZdS( i(tprint_functionN(tcommands(tLocatori(tTunedAdminDBusException(tTunedException(tProfileRecommendertAdmincBseZeeeejejdZdZ dZ dZ dZ dZ dZdZdZd Zd Zd Zd d Zd dZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&d Z'd!Z(d"Z)d#Z*d$ed%Z+d$ed&Z,ed'Z-ed(Z.RS()cCs||_||_||_||_t||_ttj|_ t j |_ d|_ t|_d|_d|_d|_||_t|_|jrtjjtjtjtj||_y|jjtj|jWqt k r}|j!|t"|_qXndS(Nt(#t_dbust_debugt_asynct_timeoutRt_cmdtprofiles_locatortconststLOAD_DIRECTORIESt_profiles_locatort threadingtEventt_daemon_action_finishedt_daemon_action_profiletTruet_daemon_action_resultt_daemon_action_errstrtNonet _controllert _log_tokent _log_levelRt_profile_recommenderttunedtadmintDBusControllertDBUS_BUStDBUS_INTERFACEt DBUS_OBJECTtset_signal_handlertDBUS_SIGNAL_PROFILE_CHANGEDt_signal_profile_changed_cbRt_errortFalse(tselftdbustdebugtasyncottimeoutt log_levelte((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt__init__s*            ' cCst|dtjdS(Ntfile(tprinttsyststderr(R(tmessage((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyR&+scCs>|jjs:||_||_||_|jjndS(N(Rtis_setRRRtset(R(t profile_nametresultterrstr((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyR%.s    cCsiy)tjt|jjtjdWn9tk rK}|jtj kSt t fk rd}t SXt S(Ni(tostkilltintR t read_fileRtPID_FILEtOSErrorterrnotEPERMt ValueErrortIOErrorR'R(R(R.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_tuned_is_running6s)cOsL|dks|dkrtSd}d}t}yt|d|}Wntk rc}t|_nXyt|d|}Wn;tk r}|js|jt|d|tSnX|jr-y<|jj|j |jj ||||jj }Wq-t k r)}|j|t|_q-Xn|jsH|||}n|S(NRt _action_dbus_t_action_s , action '%s' is not implemented( RR'tgetattrtAttributeErrorRR&tstrRtset_on_exit_actiont_log_capture_finisht set_actiontrunR(R(t action_nametargstkwargstactiont action_dbustresR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRQ@s6       c Cstdxo|D]g}|ddk rf|ddkrft|jjd|ddd|dqtd|dqWdS(NsAvailable profiles:iRs- %sii(R1RR t align_str(R(t profile_namestprofile((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profiles^s    /cCsxy|jj}Wn;tk rP}g|jjD]}|df^q5}nX|j||j|jjtS(NR(Rt profiles2RtprofilesRWt_action_dbus_activetexitR(R(RUR.RV((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_list_profilesfs,  cCs$|j|jj|jtS(N(RWRtget_known_names_summaryt_action_activeR(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_list_profilesps cCs8|jj}|dkr$d}n|jjt|S(NR(Rtactive_profileRR[R(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_dbus_get_active_profileus   cCs|jj\}}|S(N(R tget_active_profile(R(R7tmanual((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_get_active_profile|scCsD|jj\}}|dkr0|dk }n|r=tjStjS(N(R RbRRtACTIVE_PROFILE_MANUALtACTIVE_PROFILE_AUTO(R(RVRc((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_get_profile_modes cCs|dtkrjtdt|dttdt|dttdt|dtStd|tSdS( Nis Profile name:isProfile summary:isProfile description:is,Unable to get information about profile '%s'(RR1R'(R(RVt profile_info((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profile_infos   RcCsC|dkr|j}n|jj|j||jj|S(NR(RaRR[RiRh(R(RV((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_profile_infos cCs|dkrcy*|j}|dkr5tdtSWqctk r_}|jt|tSXn|j||jj |t j t j gddgS(NRsNo current active profile.( RdRR1R'RR&RIRiRtget_profile_attrsRtPROFILE_ATTR_SUMMARYtPROFILE_ATTR_DESCRIPTION(R(RVR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_profile_infos    cCs,|dkrtdtStd|tS(NsNo current active profile.sCurrent active profile: %s(RR1R'R(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profile_names   cCs|jj|j|jS(N(RR[RoRa(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRZscCs|y|j}Wn'tk r9}|jt|tSX|dk ro|j rotdtd|tS|j |S(NsKIt seems that tuned daemon is not running, preset profile is not activated.sPreset profile: %s( RdRR&RIR'RRDR1RRo(R(R7R.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyR^s cCstd|dS(NsProfile selection mode: (R1(R(tmode((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_print_profile_modescCs[|jj\}}|j||dkrK|j||jjtS|jjtS(NR(Rt profile_modeRqR&R[R'R(R(Rpterror((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_profile_modes    cCsOy!|j}|j|tSWn'tk rJ}|jt|tSXdS(N(RgRqRRR&RIR'(R(RpR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_profile_modes  cCsP|r?|jj rL|jj rL|jdt}qLn |j||S(NsCannot enable the tuning.(Rt is_runningtstartR&R'(R(trettmsg((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_profile_print_statuss     cCstj|j|jkr=td|j|jjtS|jjr|j |kr|j std|j |jjtS|jjt SntS(NsOperation timed out after waiting %d seconds(s), you may try to increase timeout by using --timeout command line option or using --async.sError changing profile: %s( ttimet _timestampR R1RR[R'RtisSetRRRR(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_wait_profiles cCs|jdks|jdkr"dSyH|jj|j}d|_t|dddtjtjjWn tk r}|j dnXdS(NRtendR0sUError: Failed to stop log capture. Restart the Tuned daemon to prevent a memory leak.( RRRtlog_capture_finishR1R2R3tflushRR&(R(tlog_msgsR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRKs   cCst|dkr|jSdj|}|dkrG|jjtS|jj|j r|j dk r|j dd}|jj |j ||_ n|jj|\}}|js| r|jj|j||Stj|_|jj|j||j||S(Nit Rii(tlent_action_dbus_listtjoinRR[R'RtclearR RRR tlog_capture_startRtswitch_profileRzR{R|RLR~(R(RYR7R,RxRy((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_profiles     cCsRtd|jjdddg\}}|dkrDtdn tddS(NsTrying to (re)start tuned...tserviceRtrestartis#Tuned (re)started, changes applied.sQTuned (re)start failed, you need to (re)start tuned by hand for changes to apply.(R1R texecute(R(RxRy((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_restart_tuneds  !  cCs||jjkrty%|jj|||jtSWqtk rp}|jt||jdt SXn|jd|t SdS(NsUnable to switch profile.s%Requested profile '%s' doesn't exist.( Rtget_known_namesR tsave_active_profileRRRR&RIR'(R(R7RcR.((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt _set_profiles  cCsKt|dkr|jSdj|}|dkr;tS|j|tS(NiRR(RR_RR'RR(R(RYR7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_profiles   cCs|jj}|jj|j rd|jdk rd|jdd}|jj|j||_ n|jj \}}|js| r|jj |j ||St j |_|jj|j||j ||S(Nii(Rtrecommend_profileRRR RRR RRt auto_profileR[RzR{R|RLR~(R(R7R,RxRy((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_auto_profile$s  cCs|jj}|j|tS(N(Rt recommendRR'(R(R7((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_auto_profile4scCs#t|jj|jjtS(N(R1RRR[R(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_recommend_profile8scCst|jjtS(N(R1RRR(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_recommend_profile<scCs|r|jj}n|jj}|r:tdn<tdtdtdtdtdtdtdtj|jj|S( NsHVerfication succeeded, current system settings match the preset profile.sLVerification failed, current system settings differ from the preset profile.s=You can mostly fix this by restarting the Tuned daemon, e.g.:s systemctl restart tunedtors service tuned restartsNSometimes (if some plugins like bootloader are used) a reboot may be required.s&See tuned log file ('%s') for details.(Rtverify_profile_ignore_missingtverify_profileR1RtLOG_FILER[(R(tignore_missingRx((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_verify_profile@s       cCstdtS(Ns Not supported in no_daemon mode.(R1R'(R(R((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_verify_profileQs cCsVd}|jj|j||_|jj}|sF|jdn|jj|S(NiisCannot disable active profile.i(RRRRtoffR&R[(R(R,Rx((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt_action_dbus_offUs cCstdtS(Ns Not supported in no_daemon mode.(R1R'(R(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt _action_off_s RYcCs6|dkr|jS|dkr2|jd|SdS(sDPrint accessible profiles or plugins got from tuned dbus api Keyword arguments: list_choice -- argument from command line deciding what will be listed verbose -- if True then list plugin's config options and their hints if possible. Functional only with plugin listing, with profiles this argument is omitted RYtpluginstverboseN(R\t_action_dbus_list_plugins(R(t list_choiceR((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRcs   cCs6|dkr|jS|dkr2|jd|SdS(saPrint accessible profiles or plugins with no daemon mode Keyword arguments: list_choice -- argument from command line deciding what will be listed verbose -- Plugins cannot be listed in this mode, so verbose argument is here only because argparse module always supplies verbose option and if verbose was not here it would result in error RYRRN(R_t_action_list_plugins(R(RR((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyt _action_listqs   cCs|jj}x|jD]}t|| st||dkrOqn|jj|}xI||D]=}td||j|d}|rltd|qlqlWqW|jjt S(svPrint accessible plugins Keyword arguments: verbose -- if is set to True then parameters and hints are printed is %ss %sN( Rt get_pluginstkeysR1Rtget_plugin_hintstgetRR[R(R(RRtpluginthintst parameterthint((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRs cCstdtS(Ns Not supported in no_daemon mode.(R1R'(R(R((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRs (/t__name__t __module__RR'Rt ADMIN_TIMEOUTtloggingtERRORR/R&R%RDRQRWR\R_RaRdRgRiRjRnRoRZR^RqRtRuRzR~RKRRRRRRRRRRRRRRRR(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyRsR                           (t __future__Rt tuned.adminRttuned.utils.commandsRttuned.profilesRR t exceptionsRttuned.exceptionsRt tuned.constsRttuned.utils.profile_recommenderRR:R2R@R{RRtobjectR(((s5/usr/lib/python2.7/site-packages/tuned/admin/admin.pyts       PK[jT (site-packages/tuned/admin/exceptions.pycnu[ \c@s,ddlZdejjfdYZdS(iNtTunedAdminDBusExceptioncBseZRS((t__name__t __module__(((s:/usr/lib/python2.7/site-packages/tuned/admin/exceptions.pyRs(ttuned.exceptionsttunedt exceptionstTunedExceptionR(((s:/usr/lib/python2.7/site-packages/tuned/admin/exceptions.pyts PK[F9&site-packages/tuned/admin/__init__.pyonu[ \c@s"ddlTddlTddlTdS(i(t*N(tadmint exceptionstdbus_controller(((s8/usr/lib/python2.7/site-packages/tuned/admin/__init__.pyts  PK[4545"site-packages/tuned/admin/admin.pynu[ from __future__ import print_function import tuned.admin from tuned.utils.commands import commands from tuned.profiles import Locator as profiles_locator from .exceptions import TunedAdminDBusException from tuned.exceptions import TunedException import tuned.consts as consts from tuned.utils.profile_recommender import ProfileRecommender import os import sys import errno import time import threading import logging class Admin(object): def __init__(self, dbus = True, debug = False, asynco = False, timeout = consts.ADMIN_TIMEOUT, log_level = logging.ERROR): self._dbus = dbus self._debug = debug self._async = asynco self._timeout = timeout self._cmd = commands(debug) self._profiles_locator = profiles_locator(consts.LOAD_DIRECTORIES) self._daemon_action_finished = threading.Event() self._daemon_action_profile = "" self._daemon_action_result = True self._daemon_action_errstr = "" self._controller = None self._log_token = None self._log_level = log_level self._profile_recommender = ProfileRecommender() if self._dbus: self._controller = tuned.admin.DBusController(consts.DBUS_BUS, consts.DBUS_INTERFACE, consts.DBUS_OBJECT, debug) try: self._controller.set_signal_handler(consts.DBUS_SIGNAL_PROFILE_CHANGED, self._signal_profile_changed_cb) except TunedAdminDBusException as e: self._error(e) self._dbus = False def _error(self, message): print(message, file=sys.stderr) def _signal_profile_changed_cb(self, profile_name, result, errstr): # ignore successive signals if the signal is not yet processed if not self._daemon_action_finished.is_set(): self._daemon_action_profile = profile_name self._daemon_action_result = result self._daemon_action_errstr = errstr self._daemon_action_finished.set() def _tuned_is_running(self): try: os.kill(int(self._cmd.read_file(consts.PID_FILE)), 0) except OSError as e: return e.errno == errno.EPERM except (ValueError, IOError) as e: return False return True # run the action specified by the action_name with args def action(self, action_name, *args, **kwargs): if action_name is None or action_name == "": return False action = None action_dbus = None res = False try: action_dbus = getattr(self, "_action_dbus_" + action_name) except AttributeError as e: self._dbus = False try: action = getattr(self, "_action_" + action_name) except AttributeError as e: if not self._dbus: self._error(str(e) + ", action '%s' is not implemented" % action_name) return False if self._dbus: try: self._controller.set_on_exit_action( self._log_capture_finish) self._controller.set_action(action_dbus, *args, **kwargs) res = self._controller.run() except TunedAdminDBusException as e: self._error(e) self._dbus = False if not self._dbus: res = action(*args, **kwargs) return res def _print_profiles(self, profile_names): print("Available profiles:") for profile in profile_names: if profile[1] is not None and profile[1] != "": print(self._cmd.align_str("- %s" % profile[0], 30, "- %s" % profile[1])) else: print("- %s" % profile[0]) def _action_dbus_list_profiles(self): try: profile_names = self._controller.profiles2() except TunedAdminDBusException as e: # fallback to older API profile_names = [(profile, "") for profile in self._controller.profiles()] self._print_profiles(profile_names) self._action_dbus_active() return self._controller.exit(True) def _action_list_profiles(self): self._print_profiles(self._profiles_locator.get_known_names_summary()) self._action_active() return True def _dbus_get_active_profile(self): profile_name = self._controller.active_profile() if profile_name == "": profile_name = None self._controller.exit(True) return profile_name def _get_active_profile(self): profile_name, manual = self._cmd.get_active_profile() return profile_name def _get_profile_mode(self): (profile, manual) = self._cmd.get_active_profile() if manual is None: manual = profile is not None return consts.ACTIVE_PROFILE_MANUAL if manual else consts.ACTIVE_PROFILE_AUTO def _print_profile_info(self, profile, profile_info): if profile_info[0] == True: print("Profile name:") print(profile_info[1]) print() print("Profile summary:") print(profile_info[2]) print() print("Profile description:") print(profile_info[3]) return True else: print("Unable to get information about profile '%s'" % profile) return False def _action_dbus_profile_info(self, profile = ""): if profile == "": profile = self._dbus_get_active_profile() return self._controller.exit(self._print_profile_info(profile, self._controller.profile_info(profile))) def _action_profile_info(self, profile = ""): if profile == "": try: profile = self._get_active_profile() if profile is None: print("No current active profile.") return False except TunedException as e: self._error(str(e)) return False return self._print_profile_info(profile, self._profiles_locator.get_profile_attrs(profile, [consts.PROFILE_ATTR_SUMMARY, consts.PROFILE_ATTR_DESCRIPTION], ["", ""])) def _print_profile_name(self, profile_name): if profile_name is None: print("No current active profile.") return False else: print("Current active profile: %s" % profile_name) return True def _action_dbus_active(self): return self._controller.exit(self._print_profile_name(self._dbus_get_active_profile())) def _action_active(self): try: profile_name = self._get_active_profile() except TunedException as e: self._error(str(e)) return False if profile_name is not None and not self._tuned_is_running(): print("It seems that tuned daemon is not running, preset profile is not activated.") print("Preset profile: %s" % profile_name) return True return self._print_profile_name(profile_name) def _print_profile_mode(self, mode): print("Profile selection mode: " + mode) def _action_dbus_profile_mode(self): mode, error = self._controller.profile_mode() self._print_profile_mode(mode) if error != "": self._error(error) return self._controller.exit(False) return self._controller.exit(True) def _action_profile_mode(self): try: mode = self._get_profile_mode() self._print_profile_mode(mode) return True except TunedException as e: self._error(str(e)) return False def _profile_print_status(self, ret, msg): if ret: if not self._controller.is_running() and not self._controller.start(): self._error("Cannot enable the tuning.") ret = False else: self._error(msg) return ret def _action_dbus_wait_profile(self, profile_name): if time.time() >= self._timestamp + self._timeout: print("Operation timed out after waiting %d seconds(s), you may try to increase timeout by using --timeout command line option or using --async." % self._timeout) return self._controller.exit(False) if self._daemon_action_finished.isSet(): if self._daemon_action_profile == profile_name: if not self._daemon_action_result: print("Error changing profile: %s" % self._daemon_action_errstr) return self._controller.exit(False) return self._controller.exit(True) return False def _log_capture_finish(self): if self._log_token is None or self._log_token == "": return try: log_msgs = self._controller.log_capture_finish( self._log_token) self._log_token = None print(log_msgs, end = "", file = sys.stderr) sys.stderr.flush() except TunedAdminDBusException as e: self._error("Error: Failed to stop log capture. Restart the Tuned daemon to prevent a memory leak.") def _action_dbus_profile(self, profiles): if len(profiles) == 0: return self._action_dbus_list() profile_name = " ".join(profiles) if profile_name == "": return self._controller.exit(False) self._daemon_action_finished.clear() if not self._async and self._log_level is not None: # 25 seconds default DBus timeout + 5 secs safety margin timeout = self._timeout + 25 + 5 self._log_token = self._controller.log_capture_start( self._log_level, timeout) (ret, msg) = self._controller.switch_profile(profile_name) if self._async or not ret: return self._controller.exit(self._profile_print_status(ret, msg)) else: self._timestamp = time.time() self._controller.set_action(self._action_dbus_wait_profile, profile_name) return self._profile_print_status(ret, msg) def _restart_tuned(self): print("Trying to (re)start tuned...") (ret, msg) = self._cmd.execute(["service", "tuned", "restart"]) if ret == 0: print("Tuned (re)started, changes applied.") else: print("Tuned (re)start failed, you need to (re)start tuned by hand for changes to apply.") def _set_profile(self, profile_name, manual): if profile_name in self._profiles_locator.get_known_names(): try: self._cmd.save_active_profile(profile_name, manual) self._restart_tuned() return True except TunedException as e: self._error(str(e)) self._error("Unable to switch profile.") return False else: self._error("Requested profile '%s' doesn't exist." % profile_name) return False def _action_profile(self, profiles): if len(profiles) == 0: return self._action_list_profiles() profile_name = " ".join(profiles) if profile_name == "": return False return self._set_profile(profile_name, True) def _action_dbus_auto_profile(self): profile_name = self._controller.recommend_profile() self._daemon_action_finished.clear() if not self._async and self._log_level is not None: # 25 seconds default DBus timeout + 5 secs safety margin timeout = self._timeout + 25 + 5 self._log_token = self._controller.log_capture_start( self._log_level, timeout) (ret, msg) = self._controller.auto_profile() if self._async or not ret: return self._controller.exit(self._profile_print_status(ret, msg)) else: self._timestamp = time.time() self._controller.set_action(self._action_dbus_wait_profile, profile_name) return self._profile_print_status(ret, msg) def _action_auto_profile(self): profile_name = self._profile_recommender.recommend() return self._set_profile(profile_name, False) def _action_dbus_recommend_profile(self): print(self._controller.recommend_profile()) return self._controller.exit(True) def _action_recommend_profile(self): print(self._profile_recommender.recommend()) return True def _action_dbus_verify_profile(self, ignore_missing): if ignore_missing: ret = self._controller.verify_profile_ignore_missing() else: ret = self._controller.verify_profile() if ret: print("Verfication succeeded, current system settings match the preset profile.") else: print("Verification failed, current system settings differ from the preset profile.") print("You can mostly fix this by restarting the Tuned daemon, e.g.:") print(" systemctl restart tuned") print("or") print(" service tuned restart") print("Sometimes (if some plugins like bootloader are used) a reboot may be required.") print("See tuned log file ('%s') for details." % consts.LOG_FILE) return self._controller.exit(ret) def _action_verify_profile(self, ignore_missing): print("Not supported in no_daemon mode.") return False def _action_dbus_off(self): # 25 seconds default DBus timeout + 5 secs safety margin timeout = 25 + 5 self._log_token = self._controller.log_capture_start( self._log_level, timeout) ret = self._controller.off() if not ret: self._error("Cannot disable active profile.") return self._controller.exit(ret) def _action_off(self): print("Not supported in no_daemon mode.") return False def _action_dbus_list(self, list_choice="profiles", verbose=False): """Print accessible profiles or plugins got from tuned dbus api Keyword arguments: list_choice -- argument from command line deciding what will be listed verbose -- if True then list plugin's config options and their hints if possible. Functional only with plugin listing, with profiles this argument is omitted """ if list_choice == "profiles": return self._action_dbus_list_profiles() elif list_choice == "plugins": return self._action_dbus_list_plugins(verbose=verbose) def _action_list(self, list_choice="profiles", verbose=False): """Print accessible profiles or plugins with no daemon mode Keyword arguments: list_choice -- argument from command line deciding what will be listed verbose -- Plugins cannot be listed in this mode, so verbose argument is here only because argparse module always supplies verbose option and if verbose was not here it would result in error """ if list_choice == "profiles": return self._action_list_profiles() elif list_choice == "plugins": return self._action_list_plugins(verbose=verbose) def _action_dbus_list_plugins(self, verbose=False): """Print accessible plugins Keyword arguments: verbose -- if is set to True then parameters and hints are printed """ plugins = self._controller.get_plugins() for plugin in plugins.keys(): print(plugin) if not verbose or len(plugins[plugin]) == 0: continue hints = self._controller.get_plugin_hints(plugin) for parameter in plugins[plugin]: print("\t%s" %(parameter)) hint = hints.get(parameter, None) if hint: print("\t\t%s" %(hint)) return self._controller.exit(True) def _action_list_plugins(self, verbose=False): print("Not supported in no_daemon mode.") return False PK[{F,site-packages/tuned/admin/dbus_controller.pynu[import dbus import dbus.exceptions import time from dbus.mainloop.glib import DBusGMainLoop from gi.repository import GLib, GObject from .exceptions import TunedAdminDBusException __all__ = ["DBusController"] class DBusController(object): def __init__(self, bus_name, interface_name, object_name, debug = False): self._bus_name = bus_name self._interface_name = interface_name self._object_name = object_name self._proxy = None self._interface = None self._debug = debug self._main_loop = None self._action = None self._on_exit_action = None self._ret = True self._exit = False self._exception = None def _init_proxy(self): try: if self._proxy is None: DBusGMainLoop(set_as_default=True) self._main_loop = GLib.MainLoop() bus = dbus.SystemBus() self._proxy = bus.get_object(self._bus_name, self._object_name) self._interface = dbus.Interface(self._proxy, dbus_interface = self._interface_name) except dbus.exceptions.DBusException: raise TunedAdminDBusException("Cannot talk to Tuned daemon via DBus. Is Tuned daemon running?") def _idle(self): if self._action is not None: # This may (and very probably will) run in child thread, so catch and pass exceptions to the main thread try: self._action_exit_code = self._action(*self._action_args, **self._action_kwargs) except TunedAdminDBusException as e: self._exception = e self._exit = True if self._exit: if self._on_exit_action is not None: self._on_exit_action(*self._on_exit_action_args, **self._on_exit_action_kwargs) self._main_loop.quit() return False else: time.sleep(1) return True def set_on_exit_action(self, action, *args, **kwargs): self._on_exit_action = action self._on_exit_action_args = args self._on_exit_action_kwargs = kwargs def set_action(self, action, *args, **kwargs): self._action = action self._action_args = args self._action_kwargs = kwargs def run(self): self._exception = None GLib.idle_add(self._idle) self._main_loop.run() # Pass exception happened in child thread to the caller if self._exception is not None: raise self._exception return self._ret def _call(self, method_name, *args, **kwargs): self._init_proxy() try: method = self._interface.get_dbus_method(method_name) return method(*args, timeout=40) except dbus.exceptions.DBusException as dbus_exception: err_str = "DBus call to Tuned daemon failed" if self._debug: err_str += " (%s)" % str(dbus_exception) raise TunedAdminDBusException(err_str) def set_signal_handler(self, signal, cb): self._init_proxy() self._proxy.connect_to_signal(signal, cb) def is_running(self): return self._call("is_running") def start(self): return self._call("start") def stop(self): return self._call("stop") def profiles(self): return self._call("profiles") def profiles2(self): return self._call("profiles2") def profile_info(self, profile_name): return self._call("profile_info", profile_name) def log_capture_start(self, log_level, timeout): return self._call("log_capture_start", log_level, timeout) def log_capture_finish(self, token): return self._call("log_capture_finish", token) def active_profile(self): return self._call("active_profile") def profile_mode(self): return self._call("profile_mode") def switch_profile(self, new_profile): if new_profile == "": return (False, "No profile specified") return self._call("switch_profile", new_profile) def auto_profile(self): return self._call("auto_profile") def recommend_profile(self): return self._call("recommend_profile") def verify_profile(self): return self._call("verify_profile") def verify_profile_ignore_missing(self): return self._call("verify_profile_ignore_missing") def off(self): return self._call("disable") def get_plugins(self): """Return dict with plugin names and their hints Return: dictionary -- {plugin_name: {parameter_name: default_value}} """ return self._call("get_all_plugins") def get_plugin_documentation(self, plugin_name): """Return docstring of plugin's class""" return self._call("get_plugin_documentation", plugin_name) def get_plugin_hints(self, plugin_name): """Return dictionary with parameters of plugin and their hints Parameters: plugin_name -- name of plugin Return: dictionary -- {parameter_name: hint} """ return self._call("get_plugin_hints", plugin_name) def exit(self, ret): self.set_action(None) self._ret = ret self._exit = True return ret PK[jT (site-packages/tuned/admin/exceptions.pyonu[ \c@s,ddlZdejjfdYZdS(iNtTunedAdminDBusExceptioncBseZRS((t__name__t __module__(((s:/usr/lib/python2.7/site-packages/tuned/admin/exceptions.pyRs(ttuned.exceptionsttunedt exceptionstTunedExceptionR(((s:/usr/lib/python2.7/site-packages/tuned/admin/exceptions.pyts PK[U+G G -site-packages/tuned/admin/dbus_controller.pycnu[ \c@s}ddlZddlZddlZddlmZddlmZmZddlm Z dgZ de fdYZ dS(iN(t DBusGMainLoop(tGLibtGObjecti(tTunedAdminDBusExceptiontDBusControllercBseZedZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZRS(cCsp||_||_||_d|_d|_||_d|_d|_d|_ t |_ t |_ d|_dS(N(t _bus_namet_interface_namet _object_nametNonet_proxyt _interfacet_debugt _main_loopt_actiont_on_exit_actiontTruet_rettFalset_exitt _exception(tselftbus_nametinterface_namet object_nametdebug((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt__init__ s           cCsyw|jdkrvtdttj|_tj}|j |j |j |_tj |jd|j |_nWn#tjjk rtdnXdS(Ntset_as_defaulttdbus_interfaces>Cannot talk to Tuned daemon via DBus. Is Tuned daemon running?(R RRRRtMainLoopR tdbust SystemBust get_objectRRt InterfaceRR t exceptionst DBusExceptionR(Rtbus((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt _init_proxys  %cCs|jdk rYy|j|j|j|_WqYtk rU}||_t|_qYXn|jr|j dk r|j |j |j n|j j tStjdtS(Ni(R Rt _action_argst_action_kwargst_action_exit_codeRRRRRt_on_exit_action_argst_on_exit_action_kwargsR tquitRttimetsleep(Rte((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt_idle$s      cOs||_||_||_dS(N(RR(R)(Rtactiontargstkwargs((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytset_on_exit_action7s  cOs||_||_||_dS(N(R R%R&(RR/R0R1((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt set_action<s  cCsHd|_tj|j|jj|jdk rA|jn|jS(N(RRRtidle_addR.R trunR(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyR5As    cOs|jy&|jj|}|dd|SWnKtjjk r}}d}|jrn|dt|7}nt|nXdS(Nttimeouti(s DBus call to Tuned daemon faileds (%s)( R$R tget_dbus_methodRR!R"R tstrR(Rt method_nameR0R1tmethodtdbus_exceptionterr_str((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt_callJs  cCs!|j|jj||dS(N(R$R tconnect_to_signal(Rtsignaltcb((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytset_signal_handlerVs cCs |jdS(Nt is_running(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRBZscCs |jdS(Ntstart(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRC]scCs |jdS(Ntstop(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRD`scCs |jdS(Ntprofiles(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyREcscCs |jdS(Nt profiles2(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRFfscCs|jd|S(Nt profile_info(R=(Rt profile_name((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRGiscCs|jd||S(Ntlog_capture_start(R=(Rt log_levelR6((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRIlscCs|jd|S(Ntlog_capture_finish(R=(Rttoken((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRKoscCs |jdS(Ntactive_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRMrscCs |jdS(Nt profile_mode(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRNuscCs&|dkrtdfS|jd|S(NtsNo profile specifiedtswitch_profile(RR=(Rt new_profile((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRPxs  cCs |jdS(Nt auto_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRR}scCs |jdS(Ntrecommend_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRSscCs |jdS(Ntverify_profile(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRTscCs |jdS(Ntverify_profile_ignore_missing(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRUscCs |jdS(Ntdisable(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytoffscCs |jdS(szReturn dict with plugin names and their hints Return: dictionary -- {plugin_name: {parameter_name: default_value}} tget_all_plugins(R=(R((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyt get_pluginsscCs|jd|S(s"Return docstring of plugin's classtget_plugin_documentation(R=(Rt plugin_name((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyRZscCs|jd|S(sReturn dictionary with parameters of plugin and their hints Parameters: plugin_name -- name of plugin Return: dictionary -- {parameter_name: hint} tget_plugin_hints(R=(RR[((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyR\s cCs#|jd||_t|_|S(N(R3RRRR(Rtret((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pytexits   (t__name__t __module__RRR$R.R2R3R5R=RARBRCRDRERFRGRIRKRMRNRPRRRSRTRURWRYRZR\R^(((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyR s8                        ( Rtdbus.exceptionsR+tdbus.mainloop.glibRt gi.repositoryRRR!Rt__all__tobjectR(((s?/usr/lib/python2.7/site-packages/tuned/admin/dbus_controller.pyts    PK[8;;site-packages/tuned/logs.pyonu[ \c@sWddlZddlZddlZddlZddlZddlZddljZddlZddl Z ddl Z yddl m Z Wnddl m Z nXdgZ daiZe jZdefdYZdZdZdZd Zd ejfd YZejejejejeejej dS( iN(tStringIOtgett LogHandlercBseZdZRS(cCs||_||_dS(N(thandlertstream(tselfRR((s./usr/lib/python2.7/site-packages/tuned/logs.pyt__init__s (t__name__t __module__R(((s./usr/lib/python2.7/site-packages/tuned/logs.pyRscCsPtj}tjtj}d}x't|D]}||j|7}q/W|S(Nt(trandomt SystemRandomtstringt ascii_letterstdigitstrangetchoice(tlengthtrtcharstresti((s./usr/lib/python2.7/site-packages/tuned/logs.pyt_random_strings  cCstx4tdD]"}td}|tkrPqqWdSt}tj|}|j|tj d}|j |t j |t ||}|t|s4              6 PK[mڵIIsite-packages/tuned/version.pynu[TUNED_VERSION_MAJOR = 2 TUNED_VERSION_MINOR = 11 TUNED_VERSION_PATCH = 0 PK[site-packages/tuned/version.pyonu[ \c@sdZdZdZdS(ii iN(tTUNED_VERSION_MAJORtTUNED_VERSION_MINORtTUNED_VERSION_PATCH(((s1/usr/lib/python2.7/site-packages/tuned/version.pytsPK[i%OOsite-packages/tuned/patterns.pynu[class Singleton(object): """ Singleton design pattern. """ _instance = None def __init__(self): if self.__class__ is Singleton: raise TypeError("Cannot instantiate directly.") @classmethod def get_instance(cls): """Get the class instance.""" if cls._instance is None: cls._instance = cls() return cls._instance PK[o)site-packages/tuned/monitors/__init__.pycnu[ \c@sddlTddlTdS(i(t*N(tbaset repository(((s;/usr/lib/python2.7/site-packages/tuned/monitors/__init__.pyts PK[m+site-packages/tuned/monitors/repository.pycnu[ \c@sZddlZddlZddlmZejjZdgZdefdYZ dS(iN(t PluginLoadert RepositorycBs;eZdZedZdZdZdZRS(cCs#tt|jt|_dS(N(tsuperRt__init__tsett _monitors(tself((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyR scCs|jS(N(R(R((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pytmonitorsscCs%d|_d|_tjj|_dS(Nstuned.monitorstmonitor_(t _namespacet_prefixttunedRtMonitort _interface(R((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyt_set_loader_parameterss  cCs@tjd||j|}||}|jj||S(Nscreating monitor %s(tlogtdebugt load_pluginRtadd(Rt plugin_nametdevicest monitor_clstmonitor_instance((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pytcreates  cCs6t||jst|j|jj|dS(N(t isinstanceR tAssertionErrortcleanupRtremove(Rtmonitor((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pytdeletes (t__name__t __module__RtpropertyRRRR(((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyR s    ( t tuned.logsR ttuned.monitorsttuned.utils.plugin_loaderRtlogstgetRt__all__R(((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyts   PK[",site-packages/tuned/monitors/monitor_net.pyonu[ \c@sTddlZddlZddlZddlmZdejjfdYZdS(iN(tethcardt NetMonitorcBsDeZedZedZedZedZRS(cCsg}xLtjdD];\}}}|jdr|jd r||7}qqWt||_x'|D]}ddddg|j|/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyt_init_available_devicess cCstd|dS(Ng333333?iig333333@g333333#A(tint(R tspeed((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyt _calcspeedscCsqddddg}xXt|D]J\}}td|d|$}|jj|j||/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyt _updateStatscCs%x|jD]}|j|q WdS(N(t_updating_devicesR(R tdevice((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pytupdate$s(t__name__t __module__t classmethodRRRR!(((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyRs ( ttuned.monitorsttunedRtrettuned.utils.nettoolRtmonitorstMonitorR(((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyts   PK[s-site-packages/tuned/monitors/monitor_disk.pyonu[ \c@s8ddlZddlZdejjfdYZdS(iNt DiskMonitorcBsPeZddgZedZedZedZedZRS(tATAtSCSIc Csstjd}tt|j|}||_x<|D]4}dddddddddddg |j|s  PK[I>22,site-packages/tuned/monitors/monitor_load.pynu[import tuned.monitors class LoadMonitor(tuned.monitors.Monitor): @classmethod def _init_available_devices(cls): cls._available_devices = set(["system"]) @classmethod def update(cls): with open("/proc/loadavg") as statfile: data = statfile.read().split() cls._load["system"] = float(data[0]) PK[k(  -site-packages/tuned/monitors/monitor_load.pycnu[ \c@s,ddlZdejjfdYZdS(iNt LoadMonitorcBs&eZedZedZRS(cCstdg|_dS(Ntsystem(tsett_available_devices(tcls((s?/usr/lib/python2.7/site-packages/tuned/monitors/monitor_load.pyt_init_available_devicesscCsBtd}|jj}WdQXt|d|jds PK[4j j $site-packages/tuned/monitors/base.pynu[import tuned.logs log = tuned.logs.get() __all__ = ["Monitor"] class Monitor(object): """ Base class for all monitors. Monitors provide data about the running system to Plugin objects, which use the data to tune system parameters. Following methods require reimplementation: - _init_available_devices(cls) - update(cls) """ # class properties @classmethod def _init_class(cls): cls._class_initialized = False cls._instances = set() cls._available_devices = set() cls._updating_devices = set() cls._load = {} cls._init_available_devices() assert isinstance(cls._available_devices, set) cls._class_initialized = True log.debug("available devices: %s" % ", ".join(cls._available_devices)) @classmethod def _init_available_devices(cls): raise NotImplementedError() @classmethod def _update_available_devices(cls): cls._init_available_devices() log.debug("available devices updated to: %s" % ", ".join(cls._available_devices)) @classmethod def get_available_devices(cls): return cls._available_devices @classmethod def update(cls): raise NotImplementedError() @classmethod def _register_instance(cls, instance): cls._instances.add(instance) @classmethod def _deregister_instance(cls, instance): cls._instances.remove(instance) @classmethod def _refresh_updating_devices(cls): new_updating = set() for instance in cls._instances: new_updating |= instance.devices cls._updating_devices.clear() cls._updating_devices.update(new_updating) @classmethod def instances(cls): return cls._instances # instance properties def __init__(self, devices = None): if not hasattr(self, "_class_initialized"): self._init_class() assert hasattr(self, "_class_initialized") self._register_instance(self) if devices is not None: self.devices = devices else: self.devices = self.get_available_devices() self.update() def __del__(self): try: self.cleanup() except: pass def cleanup(self): self._deregister_instance(self) self._refresh_updating_devices() @property def devices(self): return self._devices @devices.setter def devices(self, value): new_devices = self._available_devices & set(value) self._devices = new_devices self._refresh_updating_devices() def add_device(self, device): assert (isinstance(device,str) or isinstance(device,unicode)) self._update_available_devices() if device in self._available_devices: self._devices.add(device) self._updating_devices.add(device) def remove_device(self, device): assert (isinstance(device,str) or isinstance(device,unicode)) if device in self._devices: self._devices.remove(device) self._updating_devices.remove(device) def get_load(self): return dict([dev_load for dev_load in list(self._load.items()) if dev_load[0] in self._devices]) def get_device_load(self, device): return self._load.get(device, None) PK[s-site-packages/tuned/monitors/monitor_disk.pycnu[ \c@s8ddlZddlZdejjfdYZdS(iNt DiskMonitorcBsPeZddgZedZedZedZedZRS(tATAtSCSIc Csstjd}tt|j|}||_x<|D]4}dddddddddddg |j|s  PK[9oo+site-packages/tuned/monitors/repository.pyonu[ \c@sZddlZddlZddlmZejjZdgZdefdYZ dS(iN(t PluginLoadert RepositorycBs;eZdZedZdZdZdZRS(cCs#tt|jt|_dS(N(tsuperRt__init__tsett _monitors(tself((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyR scCs|jS(N(R(R((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pytmonitorsscCs%d|_d|_tjj|_dS(Nstuned.monitorstmonitor_(t _namespacet_prefixttunedRtMonitort _interface(R((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyt_set_loader_parameterss  cCs@tjd||j|}||}|jj||S(Nscreating monitor %s(tlogtdebugt load_pluginRtadd(Rt plugin_nametdevicest monitor_clstmonitor_instance((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pytcreates  cCs|j|jj|dS(N(tcleanupRtremove(Rtmonitor((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pytdeletes (t__name__t __module__RtpropertyRRRR(((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyR s    ( t tuned.logsR ttuned.monitorsttuned.utils.plugin_loaderRtlogstgetRt__all__R(((s=/usr/lib/python2.7/site-packages/tuned/monitors/repository.pyts   PK[k(  -site-packages/tuned/monitors/monitor_load.pyonu[ \c@s,ddlZdejjfdYZdS(iNt LoadMonitorcBs&eZedZedZRS(cCstdg|_dS(Ntsystem(tsett_available_devices(tcls((s?/usr/lib/python2.7/site-packages/tuned/monitors/monitor_load.pyt_init_available_devicesscCsBtd}|jj}WdQXt|d|jds PK[.eI..(site-packages/tuned/monitors/__init__.pynu[from .base import * from .repository import * PK[evv,site-packages/tuned/monitors/monitor_disk.pynu[import tuned.monitors import os class DiskMonitor(tuned.monitors.Monitor): _supported_vendors = ["ATA", "SCSI"] @classmethod def _init_available_devices(cls): block_devices = os.listdir("/sys/block") available = set(filter(cls._is_device_supported, block_devices)) cls._available_devices = available for d in available: cls._load[d] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] @classmethod def _is_device_supported(cls, device): vendor_file = "/sys/block/%s/device/vendor" % device try: vendor = open(vendor_file).read().strip() except IOError: return False return vendor in cls._supported_vendors @classmethod def update(cls): for device in cls._updating_devices: cls._update_disk(device) @classmethod def _update_disk(cls, dev): with open("/sys/block/" + dev + "/stat") as statfile: cls._load[dev] = list(map(int, statfile.read().split())) PK[s+site-packages/tuned/monitors/monitor_net.pynu[import tuned.monitors import os import re from tuned.utils.nettool import ethcard class NetMonitor(tuned.monitors.Monitor): @classmethod def _init_available_devices(cls): available = [] for root, dirs, files in os.walk("/sys/devices"): if root.endswith("/net") and not root.endswith("/virtual/net"): available += dirs cls._available_devices = set(available) for dev in available: #max_speed = cls._calcspeed(ethcard(dev).get_max_speed()) cls._load[dev] = ['0', '0', '0', '0'] @classmethod def _calcspeed(cls, speed): # 0.6 is just a magical constant (empirical value): Typical workload on netcard won't exceed # that and if it does, then the code is smart enough to adapt it. # 1024 * 1024 as for MB -> B # speed / 8 Mb -> MB return (int) (0.6 * 1024 * 1024 * speed / 8) @classmethod def _updateStat(cls, dev): files = ["rx_bytes", "rx_packets", "tx_bytes", "tx_packets"] for i,f in enumerate(files): with open("/sys/class/net/" + dev + "/statistics/" + f) as statfile: cls._load[dev][i] = statfile.read().strip() @classmethod def update(cls): for device in cls._updating_devices: cls._updateStat(device) PK[o)site-packages/tuned/monitors/__init__.pyonu[ \c@sddlTddlTdS(i(t*N(tbaset repository(((s;/usr/lib/python2.7/site-packages/tuned/monitors/__init__.pyts PK[",site-packages/tuned/monitors/monitor_net.pycnu[ \c@sTddlZddlZddlZddlmZdejjfdYZdS(iN(tethcardt NetMonitorcBsDeZedZedZedZedZRS(cCsg}xLtjdD];\}}}|jdr|jd r||7}qqWt||_x'|D]}ddddg|j|/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyt_init_available_devicess cCstd|dS(Ng333333?iig333333@g333333#A(tint(R tspeed((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyt _calcspeedscCsqddddg}xXt|D]J\}}td|d|$}|jj|j||/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyt _updateStatscCs%x|jD]}|j|q WdS(N(t_updating_devicesR(R tdevice((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pytupdate$s(t__name__t __module__t classmethodRRRR!(((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyRs ( ttuned.monitorsttunedRtrettuned.utils.nettoolRtmonitorstMonitorR(((s>/usr/lib/python2.7/site-packages/tuned/monitors/monitor_net.pyts   PK[_%site-packages/tuned/monitors/base.pyonu[ \c@s>ddlZejjZdgZdefdYZdS(iNtMonitorcBseZdZedZedZedZedZedZedZ edZ edZ ed Z dd Zd Zd Zed ZejdZdZdZdZdZRS(s Base class for all monitors. Monitors provide data about the running system to Plugin objects, which use the data to tune system parameters. Following methods require reimplementation: - _init_available_devices(cls) - update(cls) cCsjt|_t|_t|_t|_i|_|jt|_t j ddj |jdS(Nsavailable devices: %ss, ( tFalset_class_initializedtsett _instancest_available_devicest_updating_devicest_loadt_init_available_devicestTruetlogtdebugtjoin(tcls((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt _init_classs       cCs tdS(N(tNotImplementedError(R ((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyR!scCs+|jtjddj|jdS(Ns available devices updated to: %ss, (RR R R R(R ((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_update_available_devices%s  cCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytget_available_devices+scCs tdS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytupdate/scCs|jj|dS(N(Rtadd(R tinstance((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_register_instance3scCs|jj|dS(N(Rtremove(R R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_deregister_instance7scCsKt}x|jD]}||jO}qW|jj|jj|dS(N(RRtdevicesRtclearR(R t new_updatingR((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_refresh_updating_devices;s   cCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt instancesCscCs^t|ds|jn|j||dk rA||_n|j|_|jdS(NR(thasattrRRtNoneRRR(tselfR((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt__init__Is    cCsy|jWnnXdS(N(tcleanup(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt__del__WscCs|j||jdS(N(RR(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyR!]s cCs|jS(N(t_devices(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyRascCs*|jt|@}||_|jdS(N(RRR#R(Rtvaluet new_devices((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyRes cCs@|j||jkr<|jj||jj|ndS(N(RRR#RR(Rtdevice((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt add_deviceks cCs6||jkr2|jj||jj|ndS(N(R#RR(RR&((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt remove_devicerscCs?tgt|jjD]}|d|jkr|^qS(Ni(tdicttlistRtitemsR#(Rtdev_load((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytget_loadxscCs|jj|dS(N(RtgetR(RR&((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytget_device_load{sN(t__name__t __module__t__doc__t classmethodRRRRRRRRRRR R"R!tpropertyRtsetterR'R(R-R/(((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyRs&        (t tuned.logsttunedtlogsR.R t__all__tobjectR(((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyts  PK[g ??*site-packages/tuned/monitors/repository.pynu[import tuned.logs import tuned.monitors from tuned.utils.plugin_loader import PluginLoader log = tuned.logs.get() __all__ = ["Repository"] class Repository(PluginLoader): def __init__(self): super(Repository, self).__init__() self._monitors = set() @property def monitors(self): return self._monitors def _set_loader_parameters(self): self._namespace = "tuned.monitors" self._prefix = "monitor_" self._interface = tuned.monitors.Monitor def create(self, plugin_name, devices): log.debug("creating monitor %s" % plugin_name) monitor_cls = self.load_plugin(plugin_name) monitor_instance = monitor_cls(devices) self._monitors.add(monitor_instance) return monitor_instance def delete(self, monitor): assert isinstance(monitor, self._interface) monitor.cleanup() self._monitors.remove(monitor) PK[5%site-packages/tuned/monitors/base.pycnu[ \c@s>ddlZejjZdgZdefdYZdS(iNtMonitorcBseZdZedZedZedZedZedZedZ edZ edZ ed Z dd Zd Zd Zed ZejdZdZdZdZdZRS(s Base class for all monitors. Monitors provide data about the running system to Plugin objects, which use the data to tune system parameters. Following methods require reimplementation: - _init_available_devices(cls) - update(cls) cCst|_t|_t|_t|_i|_|jt|jtsXt t |_t j ddj |jdS(Nsavailable devices: %ss, (tFalset_class_initializedtsett _instancest_available_devicest_updating_devicest_loadt_init_available_devicest isinstancetAssertionErrortTruetlogtdebugtjoin(tcls((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt _init_classs       cCs tdS(N(tNotImplementedError(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyR!scCs+|jtjddj|jdS(Ns available devices updated to: %ss, (RR R RR(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_update_available_devices%s  cCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytget_available_devices+scCs tdS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytupdate/scCs|jj|dS(N(Rtadd(Rtinstance((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_register_instance3scCs|jj|dS(N(Rtremove(RR((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_deregister_instance7scCsKt}x|jD]}||jO}qW|jj|jj|dS(N(RRtdevicesRtclearR(Rt new_updatingR((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt_refresh_updating_devices;s   cCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt instancesCscCsst|ds1|jt|ds1tn|j||dk rV||_n|j|_|jdS(NR(thasattrRR RtNoneRRR(tselfR((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt__init__Is    cCsy|jWnnXdS(N(tcleanup(R!((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt__del__WscCs|j||jdS(N(RR(R!((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyR#]s cCs|jS(N(t_devices(R!((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyRascCs*|jt|@}||_|jdS(N(RRR%R(R!tvaluet new_devices((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyRes cCsdt|ts$t|ts$t|j||jkr`|jj||jj|ndS(N( R tstrtunicodeR RRR%RR(R!tdevice((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt add_deviceks $ cCsZt|ts$t|ts$t||jkrV|jj||jj|ndS(N(R R(R)R R%RR(R!R*((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyt remove_devicers$cCs?tgt|jjD]}|d|jkr|^qS(Ni(tdicttlistRtitemsR%(R!tdev_load((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytget_loadxscCs|jj|dS(N(RtgetR (R!R*((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pytget_device_load{sN(t__name__t __module__t__doc__t classmethodRRRRRRRRRR R"R$R#tpropertyRtsetterR+R,R1R3(((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyRs&        (t tuned.logsttunedtlogsR2R t__all__tobjectR(((s7/usr/lib/python2.7/site-packages/tuned/monitors/base.pyts  PK[ȝwddsite-packages/tuned/logs.pycnu[ \c@sWddlZddlZddlZddlZddlZddlZddljZddlZddl Z ddl Z yddl m Z Wnddl m Z nXdgZ daiZe jZdefdYZdZdZdZd Zd ejfd YZejejejejeejej dS( iN(tStringIOtgett LogHandlercBseZdZRS(cCs||_||_dS(N(thandlertstream(tselfRR((s./usr/lib/python2.7/site-packages/tuned/logs.pyt__init__s (t__name__t __module__R(((s./usr/lib/python2.7/site-packages/tuned/logs.pyRscCsPtj}tjtj}d}x't|D]}||j|7}q/W|S(Nt(trandomt SystemRandomtstringt ascii_letterstdigitstrangetchoice(tlengthtrtcharstresti((s./usr/lib/python2.7/site-packages/tuned/logs.pyt_random_strings  cCstx4tdD]"}td}|tkrPqqWdSt}tj|}|j|tj d}|j |t j |t ||}|t|s4              6 PK[v? site-packages/tuned/patterns.pyonu[ \c@sdefdYZdS(t SingletoncBs,eZdZdZdZedZRS(s Singleton design pattern. cCs"|jtkrtdndS(NsCannot instantiate directly.(t __class__Rt TypeError(tself((s2/usr/lib/python2.7/site-packages/tuned/patterns.pyt__init__scCs%|jdkr||_n|jS(sGet the class instance.N(t _instancetNone(tcls((s2/usr/lib/python2.7/site-packages/tuned/patterns.pyt get_instance sN(t__name__t __module__t__doc__RRRt classmethodR(((s2/usr/lib/python2.7/site-packages/tuned/patterns.pyRs N(tobjectR(((s2/usr/lib/python2.7/site-packages/tuned/patterns.pytsPK[v? site-packages/tuned/patterns.pycnu[ \c@sdefdYZdS(t SingletoncBs,eZdZdZdZedZRS(s Singleton design pattern. cCs"|jtkrtdndS(NsCannot instantiate directly.(t __class__Rt TypeError(tself((s2/usr/lib/python2.7/site-packages/tuned/patterns.pyt__init__scCs%|jdkr||_n|jS(sGet the class instance.N(t _instancetNone(tcls((s2/usr/lib/python2.7/site-packages/tuned/patterns.pyt get_instance sN(t__name__t __module__t__doc__RRRt classmethodR(((s2/usr/lib/python2.7/site-packages/tuned/patterns.pyRs N(tobjectR(((s2/usr/lib/python2.7/site-packages/tuned/patterns.pytsPK[P88!site-packages/tuned/exceptions.pynu[import tuned.logs import sys import traceback exception_logger = tuned.logs.get() class TunedException(Exception): """ """ def log(self, logger = None): if logger is None: logger = exception_logger logger.error(str(self)) self._log_trace(logger) def _log_trace(self, logger): (exc_type, exc_value, exc_traceback) = sys.exc_info() if exc_value != self: logger.debug("stack trace is no longer available") else: exception_info = "".join(traceback.format_exception(exc_type, exc_value, exc_traceback)).rstrip() logger.debug(exception_info) PK[A&site-packages/tuned/units/__init__.pycnu[ \c@sddlTdS(i(t*N(tmanager(((s8/usr/lib/python2.7/site-packages/tuned/units/__init__.pytsPK[044%site-packages/tuned/units/manager.pycnu[ \c@s}ddlZddlZddlZddlZddlZddljZejj Z dgZ de fdYZ dS(iNtManagercBseZdZdZedZedZedZdZdZ dZ dZ d Z d Z d Zed ZRS( s? Manager creates plugin instances and keeps a track of them. cCsMtt|j||_||_||_||_g|_g|_dS(N( tsuperRt__init__t_plugins_repositoryt_monitors_repositoryt_def_instance_priorityt_hardware_inventoryt _instancest_plugins(tselftplugins_repositorytmonitors_repositorytdef_instance_prioritythardware_inventory((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRs     cCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pytpluginsscCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyt instancesscCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR #sc Csyg}x}t|jD]i\}}|jsEtjd|qn|jjd|jt|jd|jd<|j |qW|j ddt j }x+|D]#}|jj dd||j1ss2skipping plugin '%s', not supported on your systemsfailed to initialize plugin %sscreating '%s' (%s)()tlisttitemstenabledtlogtdebugRt setdefaultRtinttappendtsortt collectionst OrderedDicttpoptNonettypeRtcreateRttunedRt exceptionstNotSupportedPluginExceptiontinfot Exceptionterrort exceptiontnametcreate_instancetdevicestdevices_udev_regext script_pret script_posttplugint init_devicestassign_free_devicestinitialize_instanceRtstart_processing_eventsRtextend( R tinstances_configtinstance_info_listt instance_namet instance_infotplugins_by_namet plugin_nametnoneR1teRt new_instancetinstance((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR#'sP            cOsby|||SWnJtk r]}tj}tjd|t|ftj||SXdS(Ns"BUG: Unhandled exception in %s: %s(R(t tracebackt format_excRR)tstr(R tcallertexc_rettftargstkwargsR>ttrace((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyt _try_callVs   cCsxA|jD]6}tjd|j|jdd|jj|q Wx;|jD]0}tjd|j|jdd|j qNW|j2|j2dS(Nsdestroying instance %st destroy_allscleaning plugin '%s'( RRRR+RJR!R1tdestroy_instanceRtcleanup(R R@R1((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRK`s   cCsBx;|jjD]-}tjd||jdd|jq WdS(Nsupdating monitor %stupdate_monitors(RtmonitorsRRRJR!tupdate(R tmonitor((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRNmscCs.x'|jD]}|jdd|jq WdS(Nt start_tuning(RRJR!t apply_tuning(R R@((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRRrs cCsNt}xA|jD]6}|jdt|j|}|tkrt}qqW|S(Nt verify_tuning(tTrueRRJtFalseRT(R tignore_missingtretR@tres((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRTws   cCs.x'|jD]}|jdd|jq WdS(Nt update_tuning(RRJR!RZ(R R@((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRZs cCsD|jjx0t|jD]}|jdd|j|qWdS(Nt stop_tuning(Rtstop_processing_eventstreversedRRJR!tunapply_tuning(R t full_rollbackR@((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR[s  (t__name__t __module__t__doc__RtpropertyRRR R#RJRKRNRRRTRZRVR[(((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR s  /   (RRAttuned.exceptionsR$t tuned.logsttuned.plugins.exceptionst tuned.conststconststlogstgetRt__all__tobjectR(((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyts      PK[@b%site-packages/tuned/units/__init__.pynu[from .manager import * PK[A&site-packages/tuned/units/__init__.pyonu[ \c@sddlTdS(i(t*N(tmanager(((s8/usr/lib/python2.7/site-packages/tuned/units/__init__.pytsPK[8II$site-packages/tuned/units/manager.pynu[import collections import traceback import tuned.exceptions import tuned.logs import tuned.plugins.exceptions import tuned.consts as consts log = tuned.logs.get() __all__ = ["Manager"] class Manager(object): """ Manager creates plugin instances and keeps a track of them. """ def __init__(self, plugins_repository, monitors_repository, def_instance_priority, hardware_inventory): super(Manager, self).__init__() self._plugins_repository = plugins_repository self._monitors_repository = monitors_repository self._def_instance_priority = def_instance_priority self._hardware_inventory = hardware_inventory self._instances = [] self._plugins = [] @property def plugins(self): return self._plugins @property def instances(self): return self._instances @property def plugins_repository(self): return self._plugins_repository def create(self, instances_config): instance_info_list = [] for instance_name, instance_info in list(instances_config.items()): if not instance_info.enabled: log.debug("skipping disabled instance '%s'" % instance_name) continue instance_info.options.setdefault("priority", self._def_instance_priority) instance_info.options["priority"] = int(instance_info.options["priority"]) instance_info_list.append(instance_info) instance_info_list.sort(key=lambda x: x.options["priority"]) plugins_by_name = collections.OrderedDict() for instance_info in instance_info_list: instance_info.options.pop("priority") plugins_by_name[instance_info.type] = None for plugin_name, none in list(plugins_by_name.items()): try: plugin = self._plugins_repository.create(plugin_name) plugins_by_name[plugin_name] = plugin self._plugins.append(plugin) except tuned.plugins.exceptions.NotSupportedPluginException: log.info("skipping plugin '%s', not supported on your system" % plugin_name) continue except Exception as e: log.error("failed to initialize plugin %s" % plugin_name) log.exception(e) continue instances = [] for instance_info in instance_info_list: plugin = plugins_by_name[instance_info.type] if plugin is None: continue log.debug("creating '%s' (%s)" % (instance_info.name, instance_info.type)) new_instance = plugin.create_instance(instance_info.name, instance_info.devices, instance_info.devices_udev_regex, \ instance_info.script_pre, instance_info.script_post, instance_info.options) instances.append(new_instance) for instance in instances: instance.plugin.init_devices() instance.plugin.assign_free_devices(instance) instance.plugin.initialize_instance(instance) # At this point we should be able to start the HW events # monitoring/processing thread, without risking race conditions self._hardware_inventory.start_processing_events() self._instances.extend(instances) def _try_call(self, caller, exc_ret, f, *args, **kwargs): try: return f(*args, **kwargs) except Exception as e: trace = traceback.format_exc() log.error("BUG: Unhandled exception in %s: %s" % (caller, str(e))) log.error(trace) return exc_ret def destroy_all(self): for instance in self._instances: log.debug("destroying instance %s" % instance.name) self._try_call("destroy_all", None, instance.plugin.destroy_instance, instance) for plugin in self._plugins: log.debug("cleaning plugin '%s'" % plugin.name) self._try_call("destroy_all", None, plugin.cleanup) del self._plugins[:] del self._instances[:] def update_monitors(self): for monitor in self._monitors_repository.monitors: log.debug("updating monitor %s" % monitor) self._try_call("update_monitors", None, monitor.update) def start_tuning(self): for instance in self._instances: self._try_call("start_tuning", None, instance.apply_tuning) def verify_tuning(self, ignore_missing): ret = True for instance in self._instances: res = self._try_call("verify_tuning", False, instance.verify_tuning, ignore_missing) if res == False: ret = False return ret def update_tuning(self): for instance in self._instances: self._try_call("update_tuning", None, instance.update_tuning) # full_rollback is a helper telling plugins whether soft or full roll # back is needed, e.g. for bootloader plugin we need e.g grub.cfg # tuning to persist across reboots and restarts of the daemon, so in # this case the full_rollback is usually set to False, but we also # need to clean it all up when Tuned is disabled or the profile is # changed. In this case the full_rollback is set to True. In practice # it means to remove all temporal or helper files, unpatch third # party config files, etc. def stop_tuning(self, full_rollback = False): self._hardware_inventory.stop_processing_events() for instance in reversed(self._instances): self._try_call("stop_tuning", None, instance.unapply_tuning, full_rollback) PK[044%site-packages/tuned/units/manager.pyonu[ \c@s}ddlZddlZddlZddlZddlZddljZejj Z dgZ de fdYZ dS(iNtManagercBseZdZdZedZedZedZdZdZ dZ dZ d Z d Z d Zed ZRS( s? Manager creates plugin instances and keeps a track of them. cCsMtt|j||_||_||_||_g|_g|_dS(N( tsuperRt__init__t_plugins_repositoryt_monitors_repositoryt_def_instance_priorityt_hardware_inventoryt _instancest_plugins(tselftplugins_repositorytmonitors_repositorytdef_instance_prioritythardware_inventory((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRs     cCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pytpluginsscCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyt instancesscCs|jS(N(R(R ((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR #sc Csyg}x}t|jD]i\}}|jsEtjd|qn|jjd|jt|jd|jd<|j |qW|j ddt j }x+|D]#}|jj dd||j1ss2skipping plugin '%s', not supported on your systemsfailed to initialize plugin %sscreating '%s' (%s)()tlisttitemstenabledtlogtdebugRt setdefaultRtinttappendtsortt collectionst OrderedDicttpoptNonettypeRtcreateRttunedRt exceptionstNotSupportedPluginExceptiontinfot Exceptionterrort exceptiontnametcreate_instancetdevicestdevices_udev_regext script_pret script_posttplugint init_devicestassign_free_devicestinitialize_instanceRtstart_processing_eventsRtextend( R tinstances_configtinstance_info_listt instance_namet instance_infotplugins_by_namet plugin_nametnoneR1teRt new_instancetinstance((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR#'sP            cOsby|||SWnJtk r]}tj}tjd|t|ftj||SXdS(Ns"BUG: Unhandled exception in %s: %s(R(t tracebackt format_excRR)tstr(R tcallertexc_rettftargstkwargsR>ttrace((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyt _try_callVs   cCsxA|jD]6}tjd|j|jdd|jj|q Wx;|jD]0}tjd|j|jdd|j qNW|j2|j2dS(Nsdestroying instance %st destroy_allscleaning plugin '%s'( RRRR+RJR!R1tdestroy_instanceRtcleanup(R R@R1((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRK`s   cCsBx;|jjD]-}tjd||jdd|jq WdS(Nsupdating monitor %stupdate_monitors(RtmonitorsRRRJR!tupdate(R tmonitor((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRNmscCs.x'|jD]}|jdd|jq WdS(Nt start_tuning(RRJR!t apply_tuning(R R@((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRRrs cCsNt}xA|jD]6}|jdt|j|}|tkrt}qqW|S(Nt verify_tuning(tTrueRRJtFalseRT(R tignore_missingtretR@tres((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRTws   cCs.x'|jD]}|jdd|jq WdS(Nt update_tuning(RRJR!RZ(R R@((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyRZs cCsD|jjx0t|jD]}|jdd|j|qWdS(Nt stop_tuning(Rtstop_processing_eventstreversedRRJR!tunapply_tuning(R t full_rollbackR@((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR[s  (t__name__t __module__t__doc__RtpropertyRRR R#RJRKRNRRRTRZRVR[(((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyR s  /   (RRAttuned.exceptionsR$t tuned.logsttuned.plugins.exceptionst tuned.conststconststlogstgetRt__all__tobjectR(((s7/usr/lib/python2.7/site-packages/tuned/units/manager.pyts      PK[Xƹsite-packages/tuned/__init__.pynu[# # tuned: daemon for monitoring and adaptive tuning of system devices # # Copyright (C) 2008-2013 Red Hat, Inc. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # __copyright__ = "Copyright 2008-2013 Red Hat, Inc." __license__ = "GPLv2+" __email__ = "power-management@lists.fedoraproject.org" PK[<\&site-packages/tuned/profiles/loader.pynu[import tuned.profiles.profile import tuned.profiles.variables from configobj import ConfigObj, ConfigObjError import tuned.consts as consts import os.path import collections import tuned.logs import re from tuned.profiles.exceptions import InvalidProfileException log = tuned.logs.get() class Loader(object): """ Profiles loader. """ __slots__ = ["_profile_locator", "_profile_merger", "_profile_factory", "_global_config", "_variables"] def __init__(self, profile_locator, profile_factory, profile_merger, global_config, variables): self._profile_locator = profile_locator self._profile_factory = profile_factory self._profile_merger = profile_merger self._global_config = global_config self._variables = variables def _create_profile(self, profile_name, config): return tuned.profiles.profile.Profile(profile_name, config) @classmethod def safe_name(cls, profile_name): return re.match(r'^[a-zA-Z0-9_.-]+$', profile_name) @property def profile_locator(self): return self._profile_locator def load(self, profile_names): if type(profile_names) is not list: profile_names = profile_names.split() profile_names = list(filter(self.safe_name, profile_names)) if len(profile_names) == 0: raise InvalidProfileException("No profile or invalid profiles were specified.") if len(profile_names) > 1: log.info("loading profiles: %s" % ", ".join(profile_names)) else: log.info("loading profile: %s" % profile_names[0]) profiles = [] processed_files = [] self._load_profile(profile_names, profiles, processed_files) if len(profiles) > 1: final_profile = self._profile_merger.merge(profiles) else: final_profile = profiles[0] final_profile.name = " ".join(profile_names) if "variables" in final_profile.units: self._variables.add_from_cfg(final_profile.units["variables"].options) del(final_profile.units["variables"]) # FIXME hack, do all variable expansions in one place self._expand_vars_in_devices(final_profile) return final_profile def _expand_vars_in_devices(self, profile): for unit in profile.units: profile.units[unit].devices = self._variables.expand(profile.units[unit].devices) def _load_profile(self, profile_names, profiles, processed_files): for name in profile_names: filename = self._profile_locator.get_config(name, processed_files) if filename is None: raise InvalidProfileException("Cannot find profile '%s' in '%s'." % (name, list(reversed(self._profile_locator._load_directories)))) processed_files.append(filename) config = self._load_config_data(filename) profile = self._profile_factory.create(name, config) if "include" in profile.options: include_name = self._variables.expand(profile.options.pop("include")) self._load_profile([include_name], profiles, processed_files) profiles.append(profile) def _expand_profile_dir(self, profile_dir, string): return re.sub(r'(?s  PK[G83site-packages/tuned/profiles/functions/__init__.pycnu[ \c@sddlmZdS(i(t RepositoryN(t repositoryR(((sE/usr/lib/python2.7/site-packages/tuned/profiles/functions/__init__.pytsPK[Ht 5site-packages/tuned/profiles/functions/repository.pycnu[ \c@stddlmZddlmZddlZddljZddlm Z ej j Z defdYZ dS(i(t PluginLoaderi(tbaseN(tcommandst RepositorycBsDeZdZedZdZdZdZdZRS(cCs tt|ji|_dS(N(tsuperRt__init__t _functions(tself((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyR scCs|jS(N(R(R((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyt functionsscCs.d|_tj|_tjjjj|_ dS(Nstuned.profiles.functions( t _namespacetconststFUNCTION_PREFIXt_prefixttunedtprofilesRRtFunctiont _interface(R((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyt_set_loader_parameterss  cCs:tjd||j|}|}||j|<|S(Nscreating function %s(tlogtdebugt load_pluginR(Rt function_namet function_clstfunction_instance((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pytcreates   cCs'||jkr|j|S|j|S(N(RR(RR((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyt load_func!s cCslt||jsttjd|x<t|jjD]%\}}||kr?|j|=q?q?WdS(Nsremoving function %s(t isinstanceRtAssertionErrorRRtlistRtitems(Rtfunctiontktv((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pytdelete&s " ( t__name__t __module__RtpropertyRRRRR!(((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyR s    (ttuned.utils.plugin_loaderRtRt tuned.logsR t tuned.constsR ttuned.utils.commandsRtlogstgetRR(((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyts  PK["A<site-packages/tuned/profiles/functions/function_assertion.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands from tuned.profiles.exceptions import InvalidProfileException log = tuned.logs.get() class assertion(base.Function): """ Assertion: compares argument 2 with argument 3. If they don't match it logs text from argument 1 and throws InvalidProfileException. This exception will abort profile loading. """ def __init__(self): # 2 arguments super(assertion, self).__init__("assertion", 3) def execute(self, args): if not super(assertion, self).execute(args): return None if args[1] != args[2]: log.error("assertion '%s' failed: '%s' != '%s'" % (args[0], args[1], args[2])) raise InvalidProfileException("Assertion '%s' failed." % args[0]) return None PK[Csite-packages/tuned/profiles/functions/function_cpulist_present.pyonu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist_presentcBs eZdZdZdZRS(sY Checks whether CPUs from list are present, returns list containing only present CPUs cCstt|jdddS(NRi(tsuperRt__init__(tself((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyR scCstt|j|sdS|jjdj|}|jj|jjd}djdtt t |j t |DS(Ns,,s/sys/devices/system/cpu/presentt,css|]}t|VqdS(N(tstr(t.0tv((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pys s( RRtexecutetNonet_cmdtcpulist_unpacktjoint read_filetsortedtlisttsett intersection(Rtargstcpustpresent((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyR s (t__name__t __module__t__doc__RR (((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyts  PK[Csite-packages/tuned/profiles/functions/function_cpulist_present.pycnu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist_presentcBs eZdZdZdZRS(sY Checks whether CPUs from list are present, returns list containing only present CPUs cCstt|jdddS(NRi(tsuperRt__init__(tself((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyR scCstt|j|sdS|jjdj|}|jj|jjd}djdtt t |j t |DS(Ns,,s/sys/devices/system/cpu/presentt,css|]}t|VqdS(N(tstr(t.0tv((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pys s( RRtexecutetNonet_cmdtcpulist_unpacktjoint read_filetsortedtlisttsett intersection(Rtargstcpustpresent((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyR s (t__name__t __module__t__doc__RR (((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sU/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_present.pyts  PK[s  PK[ CPP=site-packages/tuned/profiles/functions/function_virt_check.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands class virt_check(base.Function): """ Checks whether running inside virtual machine (VM) or on bare metal. If running inside VM expands to argument 1, otherwise expands to argument 2 (even on error). """ def __init__(self): # 2 arguments super(virt_check, self).__init__("virt_check", 2) def execute(self, args): if not super(virt_check, self).execute(args): return None (ret, out) = self._cmd.execute(["virt-what"]) if ret == 0 and len(out) > 0: return args[0] return args[1] PK[GN77=site-packages/tuned/profiles/functions/function_assertion.pycnu[ \c@stddlZddlZddlmZddlmZddlmZej j Z dej fdYZ dS(iNi(tbase(tcommands(tInvalidProfileExceptiont assertioncBs eZdZdZdZRS(s Assertion: compares argument 2 with argument 3. If they don't match it logs text from argument 1 and throws InvalidProfileException. This exception will abort profile loading. cCstt|jdddS(NRi(tsuperRt__init__(tself((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyRscCsqtt|j|sdS|d|dkrmtjd|d|d|dftd|dndS(Niis#assertion '%s' failed: '%s' != '%s'isAssertion '%s' failed.(RRtexecutetNonetlogterrorR(Rtargs((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyRs &(t__name__t __module__t__doc__RR(((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyR s (tost tuned.logsttunedtRttuned.utils.commandsRttuned.profiles.exceptionsRtlogstgetR tFunctionR(((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyts  PK[k>^^@site-packages/tuned/profiles/functions/function_cpulist_pack.pycnu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandst cpulist_packcBs eZdZdZdZRS(s Conversion function: packs CPU list in form 1,2,3,5 to 1-3,5. The cpulist_unpack is used as a preprocessor, so it always returns optimal results. For details about input syntax see cpulist_unpack. cCstt|jdddS(NRi(tsuperRt__init__(tself((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyRscCsHtt|j|sdSdjd|jjdj|DS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pys ss,,(RRtexecutetNonetjoint_cmd(Rtargs((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyR s(t__name__t __module__t__doc__RR (((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyts  PK[]:wtt>site-packages/tuned/profiles/functions/function_virt_check.pyonu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandst virt_checkcBs eZdZdZdZRS(s Checks whether running inside virtual machine (VM) or on bare metal. If running inside VM expands to argument 1, otherwise expands to argument 2 (even on error). cCstt|jdddS(NRi(tsuperRt__init__(tself((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyR scCsett|j|sdS|jjdg\}}|dkr]t|dkr]|dS|dS(Ns virt-whatii(RRtexecutetNonet_cmdtlen(Rtargstrettout((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyRs (t__name__t __module__t__doc__RR(((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtFunctionR(((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyts  PK[!Jj>site-packages/tuned/profiles/functions/function_hex2cpulist.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands log = tuned.logs.get() class hex2cpulist(base.Function): """ Conversion function: converts hexadecimal CPU mask to CPU list """ def __init__(self): # one argument super(hex2cpulist, self).__init__("hex2cpulist", 1) def execute(self, args): if not super(hex2cpulist, self).execute(args): return None return ",".join(str(v) for v in self._cmd.hex2cpulist(args[0])) PK[Ԗ#Bsite-packages/tuned/profiles/functions/function_cpulist_online.pyonu[ +cc@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist_onlinecBs eZdZdZdZRS(sW Checks whether CPUs from list are online, returns list containing only online CPUs cCstt|jdddS(NRi(tsuperRt__init__(tself((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyR scsrtt|j|sdS|jjdj|}|jj|jjddjfd|DS(Nt,s/sys/devices/system/cpu/onlinec3s'|]}|krt|VqdS(N(tstr(t.0tv(tonline(sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pys s(RRtexecutetNonet_cmdtcpulist_unpacktjoint read_file(Rtargstcpus((R sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyR s (t__name__t __module__t__doc__RR (((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyts  PK[ ȕ.site-packages/tuned/profiles/functions/base.pynu[import os import tuned.logs from tuned.utils.commands import commands log = tuned.logs.get() class Function(object): """ Built-in function """ def __init__(self, name, nargs_max, nargs_min = None): self._name = name self._nargs_max = nargs_max self._nargs_min = nargs_min self._cmd = commands() # checks arguments # nargs_max - maximal number of arguments, there mustn't be more arguments, # if nargs_max is 0, number of arguments is unlimited # nargs_min - minimal number of arguments, if not None there must # be the same number of arguments or more @classmethod def _check_args(cls, args, nargs_max, nargs_min = None): if args is None or nargs_max is None: return False la = len(args) return (nargs_max == 0 or nargs_max == la) and (nargs_min is None or nargs_min <= la) def execute(self, args): if self._check_args(args, self._nargs_max, self._nargs_min): return True else: log.error("invalid number of arguments for builtin function '%s'" % self._name) return False PK[ 6vvBsite-packages/tuned/profiles/functions/function_cpulist_invert.pycnu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist_invertcBs eZdZdZdZRS(s Inverts list of CPUs (makes its complement). For the complement it gets number of online CPUs from the /sys/devices/system/cpu/online, e.g. system with 4 CPUs (0-3), the inversion of list "0,2,3" will be "1" cCstt|jdddS(NRi(tsuperRt__init__(tself((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pyRscCsHtt|j|sdSdjd|jjdj|DS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pys ss,,(RRtexecutetNonetjoint_cmd(Rtargs((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pyR s(t__name__t __module__t__doc__RR (((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pyts  PK[}@y y 5site-packages/tuned/profiles/functions/repository.pyonu[ \c@stddlmZddlmZddlZddljZddlm Z ej j Z defdYZ dS(i(t PluginLoaderi(tbaseN(tcommandst RepositorycBsDeZdZedZdZdZdZdZRS(cCs tt|ji|_dS(N(tsuperRt__init__t _functions(tself((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyR scCs|jS(N(R(R((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyt functionsscCs.d|_tj|_tjjjj|_ dS(Nstuned.profiles.functions( t _namespacetconststFUNCTION_PREFIXt_prefixttunedtprofilesRRtFunctiont _interface(R((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyt_set_loader_parameterss  cCs:tjd||j|}|}||j|<|S(Nscreating function %s(tlogtdebugt load_pluginR(Rt function_namet function_clstfunction_instance((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pytcreates   cCs'||jkr|j|S|j|S(N(RR(RR((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyt load_func!s cCsTtjd|x<t|jjD]%\}}||kr'|j|=q'q'WdS(Nsremoving function %s(RRtlistRtitems(Rtfunctiontktv((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pytdelete&s" ( t__name__t __module__RtpropertyRRRRR(((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyR s    (ttuned.utils.plugin_loaderRtRt tuned.logsR t tuned.constsR ttuned.utils.commandsRtlogstgetRR(((sG/usr/lib/python2.7/site-packages/tuned/profiles/functions/repository.pyts  PK[RUBsite-packages/tuned/profiles/functions/function_cpulist_present.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands log = tuned.logs.get() class cpulist_present(base.Function): """ Checks whether CPUs from list are present, returns list containing only present CPUs """ def __init__(self): # arbitrary number of arguments super(cpulist_present, self).__init__("cpulist_present", 0) def execute(self, args): if not super(cpulist_present, self).execute(args): return None cpus = self._cmd.cpulist_unpack(",,".join(args)) present = self._cmd.cpulist_unpack(self._cmd.read_file("/sys/devices/system/cpu/present")) return ",".join(str(v) for v in sorted(list(set(cpus).intersection(set(present))))) PK[x8site-packages/tuned/profiles/functions/function_kb2s.pyonu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandstkb2scBs eZdZdZdZRS(s* Conversion function: kbytes to sectors cCstt|jdddS(NRi(tsuperRt__init__(tself((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyR scCsQtt|j|sdSytt|ddSWntk rLdSXdS(Nii(RRtexecutetNonetstrtintt ValueError(Rtargs((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyRs  (t__name__t __module__t__doc__RR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtFunctionR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyts  PK[QW##2site-packages/tuned/profiles/functions/__init__.pynu[from .repository import Repository PK[*8site-packages/tuned/profiles/functions/function_s2kb.pycnu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandsts2kbcBs eZdZdZdZRS(s* Conversion function: sectors to kbytes cCstt|jdddS(NRi(tsuperRt__init__(tself((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyR scCs]tt|j|sdSy(tttt|ddSWntk rXdSXdS(Nii(RRtexecutetNonetstrtinttroundt ValueError(Rtargs((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyRs ( (t__name__t __module__t__doc__RR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtFunctionR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyts  PK[3 T8site-packages/tuned/profiles/functions/function_exec.pyonu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandstexecutecBs eZdZdZdZRS(s0 Executes process and substitutes its output. cCs tt|jddddS(Ntexecii(tsuperRt__init__(tself((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_exec.pyR scCsHtt|j|sdS|jj|\}}|dkrD|SdS(Ni(RRtNonet_cmd(Rtargstrettout((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_exec.pyRs  (t__name__t __module__t__doc__RR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_exec.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtFunctionR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_exec.pyts  PK[L?site-packages/tuned/profiles/functions/function_hex2cpulist.pyonu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandst hex2cpulistcBs eZdZdZdZRS(sB Conversion function: converts hexadecimal CPU mask to CPU list cCstt|jdddS(NRi(tsuperRt__init__(tself((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyR scCsCtt|j|sdSdjd|jj|dDS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pys si(RRtexecutetNonetjoint_cmd(Rtargs((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyR s(t__name__t __module__t__doc__RR (((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyts  PK[Asite-packages/tuned/profiles/functions/function_cpulist_unpack.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands log = tuned.logs.get() class cpulist_unpack(base.Function): """ Conversion function: unpacks CPU list in form 1-3,4 to 1,2,3,4 """ def __init__(self): # arbitrary number of arguments super(cpulist_unpack, self).__init__("cpulist_unpack", 0) def execute(self, args): if not super(cpulist_unpack, self).execute(args): return None return ",".join(str(v) for v in self._cmd.cpulist_unpack(",,".join(args))) PK[@zAsite-packages/tuned/profiles/functions/function_cpulist_invert.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands log = tuned.logs.get() class cpulist_invert(base.Function): """ Inverts list of CPUs (makes its complement). For the complement it gets number of online CPUs from the /sys/devices/system/cpu/online, e.g. system with 4 CPUs (0-3), the inversion of list "0,2,3" will be "1" """ def __init__(self): # arbitrary number of arguments super(cpulist_invert, self).__init__("cpulist_invert", 0) def execute(self, args): if not super(cpulist_invert, self).execute(args): return None return ",".join(str(v) for v in self._cmd.cpulist_invert(",,".join(args))) PK[`##Fsite-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyonu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist2hex_invertcBs eZdZdZdZRS(s< Converts CPU list to hexadecimal CPU mask and inverts it cCstt|jdddS(NRi(tsuperRt__init__(tself((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyR scCsTtt|j|sdS|jjdjd|jjdj|DS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pys ss,,(RRtexecutetNonet_cmdt cpulist2hextjointcpulist_invert(Rtargs((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyR s(t__name__t __module__t__doc__RR (((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyts  PK[mmGsite-packages/tuned/profiles/functions/function_assertion_non_equal.pycnu[ \c@stddlZddlZddlmZddlmZddlmZej j Z dej fdYZ dS(iNi(tbase(tcommands(tInvalidProfileExceptiontassertion_non_equalcBs eZdZdZdZRS(s Assertion non equal: compares argument 2 with argument 3. If they match it logs text from argument 1 and throws InvalidProfileException. This exception will abort profile loading. cCstt|jdddS(NRi(tsuperRt__init__(tself((sY/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion_non_equal.pyRscCsqtt|j|sdS|d|dkrmtjd|d|d|dftd|dndS(Niis#assertion '%s' failed: '%s' == '%s'isAssertion '%s' failed.(RRtexecutetNonetlogterrorR(Rtargs((sY/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion_non_equal.pyRs &(t__name__t __module__t__doc__RR(((sY/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion_non_equal.pyR s (tost tuned.logsttunedtRttuned.utils.commandsRttuned.profiles.exceptionsRtlogstgetR tFunctionR(((sY/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion_non_equal.pyts  PK[pOBsite-packages/tuned/profiles/functions/function_cpulist_unpack.pycnu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist_unpackcBs eZdZdZdZRS(sB Conversion function: unpacks CPU list in form 1-3,4 to 1,2,3,4 cCstt|jdddS(NRi(tsuperRt__init__(tself((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyR scCsHtt|j|sdSdjd|jjdj|DS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pys ss,,(RRtexecutetNonetjoint_cmd(Rtargs((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyR s(t__name__t __module__t__doc__RR (((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyts  PK[]:wtt>site-packages/tuned/profiles/functions/function_virt_check.pycnu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandst virt_checkcBs eZdZdZdZRS(s Checks whether running inside virtual machine (VM) or on bare metal. If running inside VM expands to argument 1, otherwise expands to argument 2 (even on error). cCstt|jdddS(NRi(tsuperRt__init__(tself((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyR scCsett|j|sdS|jjdg\}}|dkr]t|dkr]|dS|dS(Ns virt-whatii(RRtexecutetNonet_cmdtlen(Rtargstrettout((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyRs (t__name__t __module__t__doc__RR(((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtFunctionR(((sP/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_virt_check.pyts  PK[ޤaa3site-packages/tuned/profiles/functions/functions.pynu[import os import re import glob from . import repository import tuned.logs import tuned.consts as consts from tuned.utils.commands import commands log = tuned.logs.get() cmd = commands() class Functions(): """ Built-in functions """ def __init__(self): self._repository = repository.Repository() self._parse_init() def _parse_init(self, s = ""): self._cnt = 0 self._str = s self._len = len(s) self._stack = [] self._esc = False def _curr_char(self): return self._str[self._cnt] if self._cnt < self._len else "" def _curr_substr(self, _len): return self._str[self._cnt:self._cnt + _len] def _push_pos(self, esc): self._stack.append((esc, self._cnt)) def _sub(self, a, b, s): self._str = self._str[:a] + s + self._str[b + 1:] self._len = len(self._str) self._cnt += len(s) - (b - a + 1) if self._cnt < 0: self._cnt = 0 def _process_func(self, _from): sl = re.split(r'(?ss,,(RRtexecutetNonetjoint_cmd(Rtargs((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pyR s(t__name__t __module__t__doc__RR (((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_invert.pyts  PK[GN77=site-packages/tuned/profiles/functions/function_assertion.pyonu[ \c@stddlZddlZddlmZddlmZddlmZej j Z dej fdYZ dS(iNi(tbase(tcommands(tInvalidProfileExceptiont assertioncBs eZdZdZdZRS(s Assertion: compares argument 2 with argument 3. If they don't match it logs text from argument 1 and throws InvalidProfileException. This exception will abort profile loading. cCstt|jdddS(NRi(tsuperRt__init__(tself((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyRscCsqtt|j|sdS|d|dkrmtjd|d|d|dftd|dndS(Niis#assertion '%s' failed: '%s' != '%s'isAssertion '%s' failed.(RRtexecutetNonetlogterrorR(Rtargs((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyRs &(t__name__t __module__t__doc__RR(((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyR s (tost tuned.logsttunedtRttuned.utils.commandsRttuned.profiles.exceptionsRtlogstgetR tFunctionR(((sO/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_assertion.pyts  PK[x8site-packages/tuned/profiles/functions/function_kb2s.pycnu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandstkb2scBs eZdZdZdZRS(s* Conversion function: kbytes to sectors cCstt|jdddS(NRi(tsuperRt__init__(tself((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyR scCsQtt|j|sdSytt|ddSWntk rLdSXdS(Nii(RRtexecutetNonetstrtintt ValueError(Rtargs((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyRs  (t__name__t __module__t__doc__RR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtFunctionR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_kb2s.pyts  PK[>x[?site-packages/tuned/profiles/functions/function_cpulist2hex.pycnu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandst cpulist2hexcBs eZdZdZdZRS(sB Conversion function: converts CPU list to hexadecimal CPU mask cCstt|jdddS(NRi(tsuperRt__init__(tself((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyR scCs5tt|j|sdS|jjdj|S(Ns,,(RRtexecutetNonet_cmdtjoin(Rtargs((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyRs(t__name__t __module__t__doc__RR(((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyts  PK[G83site-packages/tuned/profiles/functions/__init__.pyonu[ \c@sddlmZdS(i(t RepositoryN(t repositoryR(((sE/usr/lib/python2.7/site-packages/tuned/profiles/functions/__init__.pytsPK[j\ ((Fsite-packages/tuned/profiles/functions/function_assertion_non_equal.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands from tuned.profiles.exceptions import InvalidProfileException log = tuned.logs.get() class assertion_non_equal(base.Function): """ Assertion non equal: compares argument 2 with argument 3. If they match it logs text from argument 1 and throws InvalidProfileException. This exception will abort profile loading. """ def __init__(self): # 2 arguments super(assertion_non_equal, self).__init__("assertion_non_equal", 3) def execute(self, args): if not super(assertion_non_equal, self).execute(args): return None if args[1] == args[2]: log.error("assertion '%s' failed: '%s' == '%s'" % (args[0], args[1], args[2])) raise InvalidProfileException("Assertion '%s' failed." % args[0]) return None PK[L?site-packages/tuned/profiles/functions/function_hex2cpulist.pycnu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandst hex2cpulistcBs eZdZdZdZRS(sB Conversion function: converts hexadecimal CPU mask to CPU list cCstt|jdddS(NRi(tsuperRt__init__(tself((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyR scCsCtt|j|sdSdjd|jj|dDS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pys si(RRtexecutetNonetjoint_cmd(Rtargs((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyR s(t__name__t __module__t__doc__RR (((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_hex2cpulist.pyts  PK[Ud>site-packages/tuned/profiles/functions/function_cpulist2hex.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands log = tuned.logs.get() class cpulist2hex(base.Function): """ Conversion function: converts CPU list to hexadecimal CPU mask """ def __init__(self): # arbitrary number of arguments super(cpulist2hex, self).__init__("cpulist2hex", 0) def execute(self, args): if not super(cpulist2hex, self).execute(args): return None return self._cmd.cpulist2hex(",,".join(args)) PK[`##Fsite-packages/tuned/profiles/functions/function_cpulist2hex_invert.pycnu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist2hex_invertcBs eZdZdZdZRS(s< Converts CPU list to hexadecimal CPU mask and inverts it cCstt|jdddS(NRi(tsuperRt__init__(tself((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyR scCsTtt|j|sdS|jjdjd|jjdj|DS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pys ss,,(RRtexecutetNonet_cmdt cpulist2hextjointcpulist_invert(Rtargs((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyR s(t__name__t __module__t__doc__RR (((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sX/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex_invert.pyts  PK[~M4site-packages/tuned/profiles/functions/functions.pycnu[ \c@sddlZddlZddlZddlmZddlZddljZddl m Z ej j Z e ZdddYZdS(iNi(t repository(tcommandst FunctionscBsbeZdZdZddZdZdZdZdZdZ d Z d Z RS( s Built-in functions cCstj|_|jdS(N(Rt Repositoryt _repositoryt _parse_init(tself((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt__init__stcCs7d|_||_t||_g|_t|_dS(Ni(t_cntt_strtlent_lent_stacktFalset_esc(Rts((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyRs    cCs$|j|jkr |j|jSdS(NR(R R R (R((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt _curr_charscCs|j|j|j|!S(N(R R (RR ((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt _curr_substr scCs|jj||jfdS(N(R tappendR (Rtesc((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt _push_pos#scCsu|j| ||j|d|_t|j|_|jt|||d7_|jdkrqd|_ndS(Nii(R R R R (RtatbR((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt_sub&s #!cCstjd|j||j!}|ddkr3dSg|D]}t|jdd^q:}tjd|dstjd|ddSy|j j |d}Wn't k rtjd |ddSX|j |d }|dkrdS|j||j|dS( Ns(?s     PK[`)22/site-packages/tuned/profiles/functions/base.pyonu[ \c@sQddlZddlZddlmZejjZdefdYZ dS(iN(tcommandstFunctioncBs5eZdZddZeddZdZRS(s Built-in function cCs+||_||_||_t|_dS(N(t_namet _nargs_maxt _nargs_minRt_cmd(tselftnamet nargs_maxt nargs_min((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyt__init__ s   cCsV|dks|dkrtSt|}|dks@||koU|dkpU||kS(Ni(tNonetFalsetlen(tclstargsRR tla((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyt _check_argss cCs7|j||j|jrtStjd|jtS(Ns5invalid number of arguments for builtin function '%s'(RRRtTruetlogterrorRR (RR((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pytexecutesN(t__name__t __module__t__doc__R R t classmethodRR(((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyRs  ( tost tuned.logsttunedttuned.utils.commandsRtlogstgetRtobjectR(((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyts  PK[F>\9site-packages/tuned/profiles/functions/function_strip.pyonu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandststripcBs eZdZdZdZRS(s0 Makes string from all arguments and strip it cCs tt|jddddS(NRii(tsuperRt__init__(tself((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyR scCs/tt|j|sdSdj|jS(Nt(RRtexecutetNonetjoin(Rtargs((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyRs(t__name__t __module__t__doc__RR(((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyRs ( tost tuned.logsttunedRRttuned.utils.commandsRtFunctionR(((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyts  PK[~M4site-packages/tuned/profiles/functions/functions.pyonu[ \c@sddlZddlZddlZddlmZddlZddljZddl m Z ej j Z e ZdddYZdS(iNi(t repository(tcommandst FunctionscBsbeZdZdZddZdZdZdZdZdZ d Z d Z RS( s Built-in functions cCstj|_|jdS(N(Rt Repositoryt _repositoryt _parse_init(tself((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt__init__stcCs7d|_||_t||_g|_t|_dS(Ni(t_cntt_strtlent_lent_stacktFalset_esc(Rts((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyRs    cCs$|j|jkr |j|jSdS(NR(R R R (R((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt _curr_charscCs|j|j|j|!S(N(R R (RR ((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt _curr_substr scCs|jj||jfdS(N(R tappendR (Rtesc((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt _push_pos#scCsu|j| ||j|d|_t|j|_|jt|||d7_|jdkrqd|_ndS(Nii(R R R R (RtatbR((sF/usr/lib/python2.7/site-packages/tuned/profiles/functions/functions.pyt_sub&s #!cCstjd|j||j!}|ddkr3dSg|D]}t|jdd^q:}tjd|dstjd|ddSy|j j |d}Wn't k rtjd |ddSX|j |d }|dkrdS|j||j|dS( Ns(?s     PK[f_7site-packages/tuned/profiles/functions/function_s2kb.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands class s2kb(base.Function): """ Conversion function: sectors to kbytes """ def __init__(self): # one argument super(s2kb, self).__init__("s2kb", 1) def execute(self, args): if not super(s2kb, self).execute(args): return None try: return str(int(round(int(args[0]) / 2))) except ValueError: return None PK[7site-packages/tuned/profiles/functions/function_exec.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands class execute(base.Function): """ Executes process and substitutes its output. """ def __init__(self): # unlimited number of arguments, min 1 argument (the name of executable) super(execute, self).__init__("exec", 0, 1) def execute(self, args): if not super(execute, self).execute(args): return None (ret, out) = self._cmd.execute(args) if ret == 0: return out return None PK[mg8site-packages/tuned/profiles/functions/function_strip.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands class strip(base.Function): """ Makes string from all arguments and strip it """ def __init__(self): # unlimited number of arguments, min 1 argument super(strip, self).__init__("strip", 0, 1) def execute(self, args): if not super(strip, self).execute(args): return None return "".join(args).strip() PK[$X4site-packages/tuned/profiles/functions/repository.pynu[from tuned.utils.plugin_loader import PluginLoader from . import base import tuned.logs import tuned.consts as consts from tuned.utils.commands import commands log = tuned.logs.get() class Repository(PluginLoader): def __init__(self): super(Repository, self).__init__() self._functions = {} @property def functions(self): return self._functions def _set_loader_parameters(self): self._namespace = "tuned.profiles.functions" self._prefix = consts.FUNCTION_PREFIX self._interface = tuned.profiles.functions.base.Function def create(self, function_name): log.debug("creating function %s" % function_name) function_cls = self.load_plugin(function_name) function_instance = function_cls() self._functions[function_name] = function_instance return function_instance # loads function from plugin file and return it # if it is already loaded, just return it, it is not loaded again def load_func(self, function_name): if not function_name in self._functions: return self.create(function_name) return self._functions[function_name] def delete(self, function): assert isinstance(function, self._interface) log.debug("removing function %s" % function) for k, v in list(self._functions.items()): if v == function: del self._functions[k] PK[*8site-packages/tuned/profiles/functions/function_s2kb.pyonu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandsts2kbcBs eZdZdZdZRS(s* Conversion function: sectors to kbytes cCstt|jdddS(NRi(tsuperRt__init__(tself((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyR scCs]tt|j|sdSy(tttt|ddSWntk rXdSXdS(Nii(RRtexecutetNonetstrtinttroundt ValueError(Rtargs((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyRs ( (t__name__t __module__t__doc__RR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtFunctionR(((sJ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_s2kb.pyts  PK[k>^^@site-packages/tuned/profiles/functions/function_cpulist_pack.pyonu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandst cpulist_packcBs eZdZdZdZRS(s Conversion function: packs CPU list in form 1,2,3,5 to 1-3,5. The cpulist_unpack is used as a preprocessor, so it always returns optimal results. For details about input syntax see cpulist_unpack. cCstt|jdddS(NRi(tsuperRt__init__(tself((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyRscCsHtt|j|sdSdjd|jjdj|DS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pys ss,,(RRtexecutetNonetjoint_cmd(Rtargs((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyR s(t__name__t __module__t__doc__RR (((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sR/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_pack.pyts  PK[pOBsite-packages/tuned/profiles/functions/function_cpulist_unpack.pyonu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist_unpackcBs eZdZdZdZRS(sB Conversion function: unpacks CPU list in form 1-3,4 to 1,2,3,4 cCstt|jdddS(NRi(tsuperRt__init__(tself((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyR scCsHtt|j|sdSdjd|jjdj|DS(Nt,css|]}t|VqdS(N(tstr(t.0tv((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pys ss,,(RRtexecutetNonetjoint_cmd(Rtargs((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyR s(t__name__t __module__t__doc__RR (((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_unpack.pyts  PK[f}}?site-packages/tuned/profiles/functions/function_cpulist_pack.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands log = tuned.logs.get() class cpulist_pack(base.Function): """ Conversion function: packs CPU list in form 1,2,3,5 to 1-3,5. The cpulist_unpack is used as a preprocessor, so it always returns optimal results. For details about input syntax see cpulist_unpack. """ def __init__(self): # arbitrary number of arguments super(cpulist_pack, self).__init__("cpulist_pack", 0) def execute(self, args): if not super(cpulist_pack, self).execute(args): return None return ",".join(str(v) for v in self._cmd.cpulist_pack(",,".join(args))) PK[Ԗ#Bsite-packages/tuned/profiles/functions/function_cpulist_online.pycnu[ +cc@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandstcpulist_onlinecBs eZdZdZdZRS(sW Checks whether CPUs from list are online, returns list containing only online CPUs cCstt|jdddS(NRi(tsuperRt__init__(tself((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyR scsrtt|j|sdS|jjdj|}|jj|jjddjfd|DS(Nt,s/sys/devices/system/cpu/onlinec3s'|]}|krt|VqdS(N(tstr(t.0tv(tonline(sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pys s(RRtexecutetNonet_cmdtcpulist_unpacktjoint read_file(Rtargstcpus((R sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyR s (t__name__t __module__t__doc__RR (((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sT/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist_online.pyts  PK[>x[?site-packages/tuned/profiles/functions/function_cpulist2hex.pyonu[ \c@sdddlZddlZddlmZddlmZejjZ dej fdYZ dS(iNi(tbase(tcommandst cpulist2hexcBs eZdZdZdZRS(sB Conversion function: converts CPU list to hexadecimal CPU mask cCstt|jdddS(NRi(tsuperRt__init__(tself((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyR scCs5tt|j|sdS|jjdj|S(Ns,,(RRtexecutetNonet_cmdtjoin(Rtargs((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyRs(t__name__t __module__t__doc__RR(((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyRs ( tost tuned.logsttunedtRttuned.utils.commandsRtlogstgettlogtFunctionR(((sQ/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_cpulist2hex.pyts  PK[jAsite-packages/tuned/profiles/functions/function_cpulist_online.pynu[import os import tuned.logs from . import base from tuned.utils.commands import commands log = tuned.logs.get() class cpulist_online(base.Function): """ Checks whether CPUs from list are online, returns list containing only online CPUs """ def __init__(self): # arbitrary number of arguments super(cpulist_online, self).__init__("cpulist_online", 0) def execute(self, args): if not super(cpulist_online, self).execute(args): return None cpus = self._cmd.cpulist_unpack(",".join(args)) online = self._cmd.cpulist_unpack(self._cmd.read_file("/sys/devices/system/cpu/online")) return ",".join(str(v) for v in cpus if v in online) PK[`)22/site-packages/tuned/profiles/functions/base.pycnu[ \c@sQddlZddlZddlmZejjZdefdYZ dS(iN(tcommandstFunctioncBs5eZdZddZeddZdZRS(s Built-in function cCs+||_||_||_t|_dS(N(t_namet _nargs_maxt _nargs_minRt_cmd(tselftnamet nargs_maxt nargs_min((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyt__init__ s   cCsV|dks|dkrtSt|}|dks@||koU|dkpU||kS(Ni(tNonetFalsetlen(tclstargsRR tla((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyt _check_argss cCs7|j||j|jrtStjd|jtS(Ns5invalid number of arguments for builtin function '%s'(RRRtTruetlogterrorRR (RR((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pytexecutesN(t__name__t __module__t__doc__R R t classmethodRR(((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyRs  ( tost tuned.logsttunedttuned.utils.commandsRtlogstgetRtobjectR(((sA/usr/lib/python2.7/site-packages/tuned/profiles/functions/base.pyts  PK[F>\9site-packages/tuned/profiles/functions/function_strip.pycnu[ \c@sUddlZddlZddlmZddlmZdejfdYZdS(iNi(tbase(tcommandststripcBs eZdZdZdZRS(s0 Makes string from all arguments and strip it cCs tt|jddddS(NRii(tsuperRt__init__(tself((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyR scCs/tt|j|sdSdj|jS(Nt(RRtexecutetNonetjoin(Rtargs((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyRs(t__name__t __module__t__doc__RR(((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyRs ( tost tuned.logsttunedRRttuned.utils.commandsRtFunctionR(((sK/usr/lib/python2.7/site-packages/tuned/profiles/functions/function_strip.pyts  PK[= 55(site-packages/tuned/profiles/locator.pycnu[ \c@sKddlZddljZddlmZmZdefdYZdS(iN(t ConfigObjtConfigObjErrortLocatorcBs}eZdZdgZdZedZdZd dZ dZ dZ d dZ d Z d Zd ZRS( s$ Profiles locator and enumerator. t_load_directoriescCs.t|tk r!tdn||_dS(Ns(load_directories parameter is not a list(ttypetlistt TypeErrorR(tselftload_directories((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt__init__ scCs|jS(N(R(R((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyRscGs5t|dg}tjj|}tjj|S(Ns tuned.conf(Rtostpathtjointnormpath(Rt path_partst config_name((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt_get_config_filenamescCspxit|jD]X}|j|tjj|}|dk rR||krRqntjj|r|SqWdS(N(treversedRRR R tbasenametNonetisfile(Rt profile_namet skip_filestdir_namet config_file((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt get_configscCs"|dk o!|dko!d|kS(Ntt/(R(RR((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytcheck_profile_name_format'scCsp|j|sdS|j|}|dkr2dSyt|dtdtSWntttfk rk}dSXdS(Nt list_valuest interpolation(RRRRtFalsetIOErrortOSErrorR(RRRte((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt parse_config*s c Cs\yt|}Wn tk r2|g}d}nXyt|}Wn tk re|g}d}nX||kr||dg||}n|j|}|dkrtdddgStj|kr|tj}n t}t|g}xht ||D]W\} } | dks!| dkr;t|d<|dg}q||j | | g}qW|S(NiiRi( tlenRR#RRtconststPLUGIN_MAIN_UNIT_NAMEtdicttTruetziptget( RRtattrstdefvalst attrs_lent defvals_lentconfigtdtvalstattrtdefval((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytget_profile_attrs:s2           cCst}xw|jD]l}yRxKtj|D]:}|j||}tjj|r,|j|q,q,WWqtk r~qXqW|S(N( tsetRR tlistdirRR RtaddR!(RtprofilesRRR((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt list_profilesYs  cCst|jS(N(tsortedR9(R((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytget_known_namesescCsEgt|jD].}||j|tjgdgdf^qS(NRi(R:R9R4R%tPROFILE_ATTR_SUMMARY(Rtprofile((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytget_known_names_summaryhsN(t__name__t __module__t__doc__t __slots__R tpropertyRRRRRR#R4R9R;R>(((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyRs       (R t tuned.constsR%t configobjRRtobjectR(((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyts PK[֨)site-packages/tuned/profiles/__init__.pycnu[ \c@sZddlTddlTddlTddlTddlTddlTddlTddlmZdS(i(t*i(t functionsN( ttuned.profiles.locatorttuned.profiles.loaderttuned.profiles.profilettuned.profiles.unitttuned.profiles.exceptionsttuned.profiles.factoryttuned.profiles.mergertR(((s;/usr/lib/python2.7/site-packages/tuned/profiles/__init__.pyts       PK[= 55(site-packages/tuned/profiles/locator.pyonu[ \c@sKddlZddljZddlmZmZdefdYZdS(iN(t ConfigObjtConfigObjErrortLocatorcBs}eZdZdgZdZedZdZd dZ dZ dZ d dZ d Z d Zd ZRS( s$ Profiles locator and enumerator. t_load_directoriescCs.t|tk r!tdn||_dS(Ns(load_directories parameter is not a list(ttypetlistt TypeErrorR(tselftload_directories((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt__init__ scCs|jS(N(R(R((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyRscGs5t|dg}tjj|}tjj|S(Ns tuned.conf(Rtostpathtjointnormpath(Rt path_partst config_name((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt_get_config_filenamescCspxit|jD]X}|j|tjj|}|dk rR||krRqntjj|r|SqWdS(N(treversedRRR R tbasenametNonetisfile(Rt profile_namet skip_filestdir_namet config_file((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt get_configscCs"|dk o!|dko!d|kS(Ntt/(R(RR((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytcheck_profile_name_format'scCsp|j|sdS|j|}|dkr2dSyt|dtdtSWntttfk rk}dSXdS(Nt list_valuest interpolation(RRRRtFalsetIOErrortOSErrorR(RRRte((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt parse_config*s c Cs\yt|}Wn tk r2|g}d}nXyt|}Wn tk re|g}d}nX||kr||dg||}n|j|}|dkrtdddgStj|kr|tj}n t}t|g}xht ||D]W\} } | dks!| dkr;t|d<|dg}q||j | | g}qW|S(NiiRi( tlenRR#RRtconststPLUGIN_MAIN_UNIT_NAMEtdicttTruetziptget( RRtattrstdefvalst attrs_lent defvals_lentconfigtdtvalstattrtdefval((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytget_profile_attrs:s2           cCst}xw|jD]l}yRxKtj|D]:}|j||}tjj|r,|j|q,q,WWqtk r~qXqW|S(N( tsetRR tlistdirRR RtaddR!(RtprofilesRRR((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyt list_profilesYs  cCst|jS(N(tsortedR9(R((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytget_known_namesescCsEgt|jD].}||j|tjgdgdf^qS(NRi(R:R9R4R%tPROFILE_ATTR_SUMMARY(Rtprofile((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pytget_known_names_summaryhsN(t__name__t __module__t__doc__t __slots__R tpropertyRRRRRR#R4R9R;R>(((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyRs       (R t tuned.constsR%t configobjRRtobjectR(((s:/usr/lib/python2.7/site-packages/tuned/profiles/locator.pyts PK[__*site-packages/tuned/profiles/exceptions.pynu[import tuned.exceptions class InvalidProfileException(tuned.exceptions.TunedException): pass PK[X<{{'site-packages/tuned/profiles/merger.pyonu[ \c@s6ddlZddlmZdefdYZdS(iN(treducetMergercBs)eZdZdZdZdZRS(s0 Tool for merging multiple profiles into one. cCsdS(N((tself((s9/usr/lib/python2.7/site-packages/tuned/profiles/merger.pyt__init__ scCst|j|}|S(s Merge multiple configurations into one. If there are multiple units of the same type, option 'devices' is set for each unit with respect to eliminating any duplicate devices. (Rt _merge_two(Rtconfigst merged_config((s9/usr/lib/python2.7/site-packages/tuned/profiles/merger.pytmerge scCs|jj|jxt|jjD]\}}|jsM||jkr]||j|s PK[o(site-packages/tuned/profiles/__init__.pynu[from tuned.profiles.locator import * from tuned.profiles.loader import * from tuned.profiles.profile import * from tuned.profiles.unit import * from tuned.profiles.exceptions import * from tuned.profiles.factory import * from tuned.profiles.merger import * from . import functions PK[KT'site-packages/tuned/profiles/loader.pyonu[ \c@sddlZddlZddlmZmZddljZddlZ ddl Z ddl Zddl Z ddl mZejjZdefdYZdS(iN(t ConfigObjtConfigObjError(tInvalidProfileExceptiontLoadercBseZdZdddddgZdZdZedZed Z d Z d Z d Z d Z dZRS(s Profiles loader. t_profile_locatort_profile_mergert_profile_factoryt_global_configt _variablescCs1||_||_||_||_||_dS(N(RRRRR(tselftprofile_locatortprofile_factorytprofile_mergert global_configt variables((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyt__init__s     cCstjjj||S(N(ttunedtprofilestprofiletProfile(R t profile_nametconfig((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyt_create_profilescCstjd|S(Ns^[a-zA-Z0-9_.-]+$(tretmatch(tclsR((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyt safe_namescCs|jS(N(R(R ((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyR "scCsGt|tk r!|j}ntt|j|}t|dkrZtdnt|dkrtjddj |ntjd|dg}g}|j |||t|dkr|j j |}n |d}dj ||_ d|jkr6|jj|jdj|jd=n|j||S( Nis.No profile or invalid profiles were specified.isloading profiles: %ss, sloading profile: %st R(ttypetlisttsplittfilterRtlenRtlogtinfotjoint _load_profileRtmergetnametunitsRt add_from_cfgtoptionst_expand_vars_in_devices(R t profile_namesRtprocessed_filest final_profile((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pytload&s(   cCs>x7|jD],}|jj|j|j|j|_q WdS(N(R'Rtexpandtdevices(R Rtunit((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyR*Csc Csx|D]}|jj||}|dkrYtd|tt|jjfn|j||j|}|j j ||}d|j kr|j j |j jd}|j|g||n|j|qWdS(Ns!Cannot find profile '%s' in '%s'.tinclude(Rt get_configtNoneRRtreversedt_load_directoriestappendt_load_config_dataRtcreateR)RR/tpopR$( R R+RR,R&tfilenameRRt include_name((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyR$Gs  + cCstjd||S(Ns(?s      PK[Snn'site-packages/tuned/profiles/profile.pynu[import tuned.profiles.unit import tuned.consts as consts import collections class Profile(object): """ Representation of a tuning profile. """ __slots__ = ["_name", "_options", "_units"] def __init__(self, name, config): self._name = name self._init_options(config) self._init_units(config) def _init_options(self, config): self._options = {} if consts.PLUGIN_MAIN_UNIT_NAME in config: self._options = dict(config[consts.PLUGIN_MAIN_UNIT_NAME]) def _init_units(self, config): self._units = collections.OrderedDict() for unit_name in config: if unit_name != consts.PLUGIN_MAIN_UNIT_NAME: new_unit = self._create_unit(unit_name, config[unit_name]) self._units[unit_name] = new_unit def _create_unit(self, name, config): return tuned.profiles.unit.Unit(name, config) @property def name(self): """ Profile name. """ return self._name @name.setter def name(self, value): self._name = value @property def units(self): """ Units included in the profile. """ return self._units @property def options(self): """ Profile global options. """ return self._options PK[ t;tt*site-packages/tuned/profiles/variables.pyonu[ \c@sddlZddlZddlZddlmZddljZddlmZddl m Z m Z ej j ZdddYZdS( iNi(t functions(tcommands(t ConfigObjtConfigObjErrort VariablescBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s8 Storage and processing of variables used in profiles cCs1t|_i|_i|_tj|_dS(N(Rt_cmdt _lookup_ret _lookup_envRt Functionst _functions(tself((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt__init__s   cCs!|j|dkr|S||S(Ni(tfind(R tstprefix((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt_add_env_prefixscCstjd|S(Ns\w+$(tretmatch(R tvariable((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt _check_varscCs|dkrdSt|}|j|s@tjd|dS|j|}||jdtj|d<||j |j |t j s  cCs%tjdd|jj|j|S(Ns \\(\${\w+})s\1(RtsubRtmultiple_re_replaceR(R R((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt expand_staticFscCs5|dkrdS|jt|}|jj|S(N(RR7RR R(R RR ((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyRIs cCs|jS(N(R(R ((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pytget_envQs( t__name__t __module__t__doc__R RRRR"R0R4R7RR8(((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyR s        ((R'Rt tuned.logsttunedRt tuned.constsRttuned.utils.commandsRt configobjRRtlogstgetRR(((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyts   PK[ Uso 'site-packages/tuned/profiles/locator.pynu[import os import tuned.consts as consts from configobj import ConfigObj, ConfigObjError class Locator(object): """ Profiles locator and enumerator. """ __slots__ = ["_load_directories"] def __init__(self, load_directories): if type(load_directories) is not list: raise TypeError("load_directories parameter is not a list") self._load_directories = load_directories @property def load_directories(self): return self._load_directories def _get_config_filename(self, *path_parts): path_parts = list(path_parts) + ["tuned.conf"] config_name = os.path.join(*path_parts) return os.path.normpath(config_name) def get_config(self, profile_name, skip_files=None): for dir_name in reversed(self._load_directories): # basename is protection not to get out of the path config_file = self._get_config_filename(dir_name, os.path.basename(profile_name)) if skip_files is not None and config_file in skip_files: continue if os.path.isfile(config_file): return config_file return None def check_profile_name_format(self, profile_name): return profile_name is not None and profile_name != "" and "/" not in profile_name def parse_config(self, profile_name): if not self.check_profile_name_format(profile_name): return None config_file = self.get_config(profile_name) if config_file is None: return None try: return ConfigObj(config_file, list_values = False, interpolation = False) except (IOError, OSError, ConfigObjError) as e: return None # Get profile attributes (e.g. summary, description), attrs is list of requested attributes, # if it is not list it is converted to list, defvals is list of default values to return if # attribute is not found, it is also converted to list if it is not list. # Returns list of the following format [status, profile_name, attr1_val, attr2_val, ...], # status is boolean. def get_profile_attrs(self, profile_name, attrs, defvals = None): # check types try: attrs_len = len(attrs) except TypeError: attrs = [attrs] attrs_len = 1 try: defvals_len = len(defvals) except TypeError: defvals = [defvals] defvals_len = 1 # Extend defvals if needed, last value is used for extension if defvals_len < attrs_len: defvals = defvals + ([defvals[-1]] * (attrs_len - defvals_len)) config = self.parse_config(profile_name) if config is None: return [False, "", "", ""] if consts.PLUGIN_MAIN_UNIT_NAME in config: d = config[consts.PLUGIN_MAIN_UNIT_NAME] else: d = dict() vals = [True, profile_name] for (attr, defval) in zip(attrs, defvals): if attr == "" or attr is None: vals[0] = False vals = vals + [""] else: vals = vals + [d.get(attr, defval)] return vals def list_profiles(self): profiles = set() for dir_name in self._load_directories: try: for profile_name in os.listdir(dir_name): config_file = self._get_config_filename(dir_name, profile_name) if os.path.isfile(config_file): profiles.add(profile_name) except OSError: pass return profiles def get_known_names(self): return sorted(self.list_profiles()) def get_known_names_summary(self): return [(profile, self.get_profile_attrs(profile, [consts.PROFILE_ATTR_SUMMARY], [""])[2]) for profile in sorted(self.list_profiles())] PK[KT'site-packages/tuned/profiles/loader.pycnu[ \c@sddlZddlZddlmZmZddljZddlZ ddl Z ddl Zddl Z ddl mZejjZdefdYZdS(iN(t ConfigObjtConfigObjError(tInvalidProfileExceptiontLoadercBseZdZdddddgZdZdZedZed Z d Z d Z d Z d Z dZRS(s Profiles loader. t_profile_locatort_profile_mergert_profile_factoryt_global_configt _variablescCs1||_||_||_||_||_dS(N(RRRRR(tselftprofile_locatortprofile_factorytprofile_mergert global_configt variables((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyt__init__s     cCstjjj||S(N(ttunedtprofilestprofiletProfile(R t profile_nametconfig((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyt_create_profilescCstjd|S(Ns^[a-zA-Z0-9_.-]+$(tretmatch(tclsR((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyt safe_namescCs|jS(N(R(R ((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyR "scCsGt|tk r!|j}ntt|j|}t|dkrZtdnt|dkrtjddj |ntjd|dg}g}|j |||t|dkr|j j |}n |d}dj ||_ d|jkr6|jj|jdj|jd=n|j||S( Nis.No profile or invalid profiles were specified.isloading profiles: %ss, sloading profile: %st R(ttypetlisttsplittfilterRtlenRtlogtinfotjoint _load_profileRtmergetnametunitsRt add_from_cfgtoptionst_expand_vars_in_devices(R t profile_namesRtprocessed_filest final_profile((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pytload&s(   cCs>x7|jD],}|jj|j|j|j|_q WdS(N(R'Rtexpandtdevices(R Rtunit((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyR*Csc Csx|D]}|jj||}|dkrYtd|tt|jjfn|j||j|}|j j ||}d|j kr|j j |j jd}|j|g||n|j|qWdS(Ns!Cannot find profile '%s' in '%s'.tinclude(Rt get_configtNoneRRtreversedt_load_directoriestappendt_load_config_dataRtcreateR)RR/tpopR$( R R+RR,R&tfilenameRRt include_name((s9/usr/lib/python2.7/site-packages/tuned/profiles/loader.pyR$Gs  + cCstjd||S(Ns(?s      PK[X<{{'site-packages/tuned/profiles/merger.pycnu[ \c@s6ddlZddlmZdefdYZdS(iN(treducetMergercBs)eZdZdZdZdZRS(s0 Tool for merging multiple profiles into one. cCsdS(N((tself((s9/usr/lib/python2.7/site-packages/tuned/profiles/merger.pyt__init__ scCst|j|}|S(s Merge multiple configurations into one. If there are multiple units of the same type, option 'devices' is set for each unit with respect to eliminating any duplicate devices. (Rt _merge_two(Rtconfigst merged_config((s9/usr/lib/python2.7/site-packages/tuned/profiles/merger.pytmerge scCs|jj|jxt|jjD]\}}|jsM||jkr]||j|s PK[#(site-packages/tuned/profiles/factory.pyonu[ \c@s&ddlZdefdYZdS(iNtFactorycBseZdZRS(cCstjjj||S(N(ttunedtprofilestprofiletProfile(tselftnametconfig((s:/usr/lib/python2.7/site-packages/tuned/profiles/factory.pytcreates(t__name__t __module__R(((s:/usr/lib/python2.7/site-packages/tuned/profiles/factory.pyRs(ttuned.profiles.profileRtobjectR(((s:/usr/lib/python2.7/site-packages/tuned/profiles/factory.pyts PK[^+site-packages/tuned/profiles/exceptions.pycnu[ \c@s,ddlZdejjfdYZdS(iNtInvalidProfileExceptioncBseZRS((t__name__t __module__(((s=/usr/lib/python2.7/site-packages/tuned/profiles/exceptions.pyRs(ttuned.exceptionsttunedt exceptionstTunedExceptionR(((s=/usr/lib/python2.7/site-packages/tuned/profiles/exceptions.pyts PK[֨)site-packages/tuned/profiles/__init__.pyonu[ \c@sZddlTddlTddlTddlTddlTddlTddlTddlmZdS(i(t*i(t functionsN( ttuned.profiles.locatorttuned.profiles.loaderttuned.profiles.profilettuned.profiles.unitttuned.profiles.exceptionsttuned.profiles.factoryttuned.profiles.mergertR(((s;/usr/lib/python2.7/site-packages/tuned/profiles/__init__.pyts       PK[Joo%site-packages/tuned/profiles/unit.pyonu[ \c@s&ddlZdefdYZdS(iNtUnitc Bs=eZdZddddddddd g Zd Zed Zed Zejd ZedZ e jdZ edZ edZ e jdZ edZ e jdZ edZ e jdZ edZejdZedZejdZRS(s Unit description. t_namet_typet_enabledt_replacet_devicest_devices_udev_regext _script_pret _script_postt_optionscCs||_|jd|j|_|jdttdddgk|_|jdttdddgk|_|jdd|_|jd d|_ |jd d|_ |jd d|_ t j ||_dS( Nttypetenabledttrueit1treplacetdevicest*tdevices_udev_regext script_pret script_post(RtpopRtTrueRtFalseRRtNoneRRRt collectionst OrderedDictR (tselftnametconfig((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyt__init__ s ''cCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRscCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR scCs ||_dS(N(R(Rtvalue((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR "scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR &scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR*scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR.scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR2scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR6scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR:scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR>scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRBscCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRFscCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRJscCs|jS(N(R (R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pytoptionsNscCs ||_dS(N(R (RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRRs(t__name__t __module__t__doc__t __slots__RtpropertyRR tsetterR RRRRRR(((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRs( (RtobjectR(((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyts PK[Joo%site-packages/tuned/profiles/unit.pycnu[ \c@s&ddlZdefdYZdS(iNtUnitc Bs=eZdZddddddddd g Zd Zed Zed Zejd ZedZ e jdZ edZ edZ e jdZ edZ e jdZ edZ e jdZ edZejdZedZejdZRS(s Unit description. t_namet_typet_enabledt_replacet_devicest_devices_udev_regext _script_pret _script_postt_optionscCs||_|jd|j|_|jdttdddgk|_|jdttdddgk|_|jdd|_|jd d|_ |jd d|_ |jd d|_ t j ||_dS( Nttypetenabledttrueit1treplacetdevicest*tdevices_udev_regext script_pret script_post(RtpopRtTrueRtFalseRRtNoneRRRt collectionst OrderedDictR (tselftnametconfig((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyt__init__ s ''cCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRscCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR scCs ||_dS(N(R(Rtvalue((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR "scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR &scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR*scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR.scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR2scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR6scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR:scCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyR>scCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRBscCs|jS(N(R(R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRFscCs ||_dS(N(R(RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRJscCs|jS(N(R (R((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pytoptionsNscCs ||_dS(N(R (RR((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRRs(t__name__t __module__t__doc__t __slots__RtpropertyRR tsetterR RRRRRR(((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyRs( (RtobjectR(((s7/usr/lib/python2.7/site-packages/tuned/profiles/unit.pyts PK[jb--&site-packages/tuned/profiles/merger.pynu[import collections from functools import reduce class Merger(object): """ Tool for merging multiple profiles into one. """ def __init__(self): pass def merge(self, configs): """ Merge multiple configurations into one. If there are multiple units of the same type, option 'devices' is set for each unit with respect to eliminating any duplicate devices. """ merged_config = reduce(self._merge_two, configs) return merged_config def _merge_two(self, profile_a, profile_b): """ Merge two profiles. The configuration of units with matching names are updated with options from the newer profile. If the 'replace' options of the newer unit is 'True', all options from the older unit are dropped. """ profile_a.options.update(profile_b.options) for unit_name, unit in list(profile_b.units.items()): if unit.replace or unit_name not in profile_a.units: profile_a.units[unit_name] = unit else: profile_a.units[unit_name].type = unit.type profile_a.units[unit_name].enabled = unit.enabled profile_a.units[unit_name].devices = unit.devices if unit.devices_udev_regex is not None: profile_a.units[unit_name].devices_udev_regex = unit.devices_udev_regex if unit.script_pre is not None: profile_a.units[unit_name].script_pre = unit.script_pre if unit.script_post is not None: profile_a.units[unit_name].script_post = unit.script_post if unit_name == "script" and profile_a.units[unit_name].options.get("script", None) is not None: script = profile_a.units[unit_name].options.get("script", None) profile_a.units[unit_name].options.update(unit.options) profile_a.units[unit_name].options["script"] = script + profile_a.units[unit_name].options["script"] else: profile_a.units[unit_name].options.update(unit.options) return profile_a PK[0t&'site-packages/tuned/profiles/factory.pynu[import tuned.profiles.profile class Factory(object): def create(self, name, config): return tuned.profiles.profile.Profile(name, config) PK[ (site-packages/tuned/profiles/profile.pycnu[ \c@sAddlZddljZddlZdefdYZdS(iNtProfilecBseZdZdddgZdZdZdZdZedZ e j d Z ed Z ed Z RS( s' Representation of a tuning profile. t_namet_optionst_unitscCs'||_|j||j|dS(N(Rt _init_optionst _init_units(tselftnametconfig((s:/usr/lib/python2.7/site-packages/tuned/profiles/profile.pyt__init__ s  cCs5i|_tj|kr1t|tj|_ndS(N(RtconststPLUGIN_MAIN_UNIT_NAMEtdict(RR((s:/usr/lib/python2.7/site-packages/tuned/profiles/profile.pyRs cCsYtj|_xC|D];}|tjkr|j|||}||j|s  PK[ t;tt*site-packages/tuned/profiles/variables.pycnu[ \c@sddlZddlZddlZddlmZddljZddlmZddl m Z m Z ej j ZdddYZdS( iNi(t functions(tcommands(t ConfigObjtConfigObjErrort VariablescBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s8 Storage and processing of variables used in profiles cCs1t|_i|_i|_tj|_dS(N(Rt_cmdt _lookup_ret _lookup_envRt Functionst _functions(tself((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt__init__s   cCs!|j|dkr|S||S(Ni(tfind(R tstprefix((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt_add_env_prefixscCstjd|S(Ns\w+$(tretmatch(R tvariable((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt _check_varscCs|dkrdSt|}|j|s@tjd|dS|j|}||jdtj|d<||j |j |t j s  cCs%tjdd|jj|j|S(Ns \\(\${\w+})s\1(RtsubRtmultiple_re_replaceR(R R((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyt expand_staticFscCs5|dkrdS|jt|}|jj|S(N(RR7RR R(R RR ((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyRIs cCs|jS(N(R(R ((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pytget_envQs( t__name__t __module__t__doc__R RRRR"R0R4R7RR8(((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyR s        ((R'Rt tuned.logsttunedRt tuned.constsRttuned.utils.commandsRt configobjRRtlogstgetRR(((s</usr/lib/python2.7/site-packages/tuned/profiles/variables.pyts   PK[#(site-packages/tuned/profiles/factory.pycnu[ \c@s&ddlZdefdYZdS(iNtFactorycBseZdZRS(cCstjjj||S(N(ttunedtprofilestprofiletProfile(tselftnametconfig((s:/usr/lib/python2.7/site-packages/tuned/profiles/factory.pytcreates(t__name__t __module__R(((s:/usr/lib/python2.7/site-packages/tuned/profiles/factory.pyRs(ttuned.profiles.profileRtobjectR(((s:/usr/lib/python2.7/site-packages/tuned/profiles/factory.pyts PK[^+site-packages/tuned/profiles/exceptions.pyonu[ \c@s,ddlZdejjfdYZdS(iNtInvalidProfileExceptioncBseZRS((t__name__t __module__(((s=/usr/lib/python2.7/site-packages/tuned/profiles/exceptions.pyRs(ttuned.exceptionsttunedt exceptionstTunedExceptionR(((s=/usr/lib/python2.7/site-packages/tuned/profiles/exceptions.pyts PK[õW  )site-packages/tuned/profiles/variables.pynu[import os import re import tuned.logs from .functions import functions as functions import tuned.consts as consts from tuned.utils.commands import commands from configobj import ConfigObj, ConfigObjError log = tuned.logs.get() class Variables(): """ Storage and processing of variables used in profiles """ def __init__(self): self._cmd = commands() self._lookup_re = {} self._lookup_env = {} self._functions = functions.Functions() def _add_env_prefix(self, s, prefix): if s.find(prefix) == 0: return s return prefix + s def _check_var(self, variable): return re.match(r'\w+$',variable) def add_variable(self, variable, value): if value is None: return s = str(variable) if not self._check_var(variable): log.error("variable definition '%s' contains unallowed characters" % variable) return v = self.expand(value) # variables referenced by ${VAR}, $ can be escaped by two $, # i.e. the following will not expand: $${VAR} self._lookup_re[r'(?s  PK[$b 'site-packages/tuned/daemon/__init__.pycnu[ \c@s"ddlTddlTddlTdS(i(t*N(t applicationt controllertdaemon(((s9/usr/lib/python2.7/site-packages/tuned/daemon/__init__.pyts  PK[{ؿH(H($site-packages/tuned/daemon/daemon.pynu[import os import errno import threading import tuned.logs from tuned.exceptions import TunedException from tuned.profiles.exceptions import InvalidProfileException import tuned.consts as consts from tuned.utils.commands import commands from tuned import exports from tuned.utils.profile_recommender import ProfileRecommender import re log = tuned.logs.get() class Daemon(object): def __init__(self, unit_manager, profile_loader, profile_names=None, config=None, application=None): log.debug("initializing daemon") self._daemon = consts.CFG_DEF_DAEMON self._sleep_interval = int(consts.CFG_DEF_SLEEP_INTERVAL) self._update_interval = int(consts.CFG_DEF_UPDATE_INTERVAL) self._dynamic_tuning = consts.CFG_DEF_DYNAMIC_TUNING self._recommend_command = True if config is not None: self._daemon = config.get_bool(consts.CFG_DAEMON, consts.CFG_DEF_DAEMON) self._sleep_interval = int(config.get(consts.CFG_SLEEP_INTERVAL, consts.CFG_DEF_SLEEP_INTERVAL)) self._update_interval = int(config.get(consts.CFG_UPDATE_INTERVAL, consts.CFG_DEF_UPDATE_INTERVAL)) self._dynamic_tuning = config.get_bool(consts.CFG_DYNAMIC_TUNING, consts.CFG_DEF_DYNAMIC_TUNING) self._recommend_command = config.get_bool(consts.CFG_RECOMMEND_COMMAND, consts.CFG_DEF_RECOMMEND_COMMAND) self._application = application if self._sleep_interval <= 0: self._sleep_interval = int(consts.CFG_DEF_SLEEP_INTERVAL) if self._update_interval == 0: self._dynamic_tuning = False elif self._update_interval < self._sleep_interval: self._update_interval = self._sleep_interval self._sleep_cycles = self._update_interval // self._sleep_interval log.info("using sleep interval of %d second(s)" % self._sleep_interval) if self._dynamic_tuning: log.info("dynamic tuning is enabled (can be overridden by plugins)") log.info("using update interval of %d second(s) (%d times of the sleep interval)" % (self._sleep_cycles * self._sleep_interval, self._sleep_cycles)) self._unit_manager = unit_manager self._profile_loader = profile_loader self._init_threads() self._cmd = commands() try: self._init_profile(profile_names) except TunedException as e: log.error("Cannot set initial profile. No tunings will be enabled: %s" % e) def _init_threads(self): self._thread = None self._terminate = threading.Event() # Flag which is set if terminating due to profile_switch self._terminate_profile_switch = threading.Event() # Flag which is set if there is no operation in progress self._not_used = threading.Event() self._not_used.set() self._profile_applied = threading.Event() def reload_profile_config(self): """Read configuration files again and load profile according to them""" self._init_profile(None) def _init_profile(self, profile_names): manual = True if profile_names is None: (profile_names, manual) = self._get_startup_profile() if profile_names is None: log.info("No profile is preset, running in manual mode. No profile will be enabled.") # Passed through '-p' cmdline option elif profile_names == "": log.info("No profile will be enabled.") self._profile = None self._manual = None self.set_profile(profile_names, manual) def set_profile(self, profile_names, manual, save_instantly=False): if self.is_running(): raise TunedException(self._notify_profile_changed(profile_names, False, "Cannot set profile while the daemon is running.")) if profile_names == "" or profile_names is None: self._profile = None self._manual = manual else: profile_list = profile_names.split() for profile in profile_list: if profile not in self.profile_loader.profile_locator.get_known_names(): raise TunedException(self._notify_profile_changed(\ profile_names, False,\ "Requested profile '%s' doesn't exist." % profile)) try: self._profile = self._profile_loader.load(profile_names) self._manual = manual except InvalidProfileException as e: raise TunedException(self._notify_profile_changed(profile_names, False, "Cannot load profile(s) '%s': %s" % (profile_names, e))) if save_instantly: if profile_names is None: profile_names = "" self._save_active_profile(profile_names, manual) @property def profile(self): return self._profile @property def manual(self): return self._manual @property def profile_loader(self): return self._profile_loader # send notification when profile is changed (everything is setup) or if error occured # result: True - OK, False - error occured def _notify_profile_changed(self, profile_names, result, errstr): if self._application is not None and self._application._dbus_exporter is not None: self._application._dbus_exporter.send_signal(consts.DBUS_SIGNAL_PROFILE_CHANGED, profile_names, result, errstr) return errstr def _full_rollback_required(self): retcode, out = self._cmd.execute(["systemctl", "is-system-running"], no_errors = [0]) if retcode < 0: return False if out[:8] == "stopping": return False retcode, out = self._cmd.execute(["systemctl", "list-jobs"], no_errors = [0]) return re.search(r"\b(shutdown|reboot|halt|poweroff)\.target.*start", out) is None def _thread_code(self): if self._profile is None: raise TunedException("Cannot start the daemon without setting a profile.") self._unit_manager.create(self._profile.units) self._save_active_profile(self._profile.name, self._manual) self._unit_manager.start_tuning() self._profile_applied.set() log.info("static tuning from profile '%s' applied" % self._profile.name) if self._daemon: exports.start() self._notify_profile_changed(self._profile.name, True, "OK") if self._daemon: # In python 2 interpreter with applied patch for rhbz#917709 we need to periodically # poll, otherwise the python will not have chance to update events / locks (due to GIL) # and e.g. DBus control will not work. The polling interval of 1 seconds (which is # the default) is still much better than 50 ms polling with unpatched interpreter. # For more details see tuned rhbz#917587. _sleep_cnt = self._sleep_cycles while not self._cmd.wait(self._terminate, self._sleep_interval): if self._dynamic_tuning: _sleep_cnt -= 1 if _sleep_cnt <= 0: _sleep_cnt = self._sleep_cycles log.debug("updating monitors") self._unit_manager.update_monitors() log.debug("performing tunings") self._unit_manager.update_tuning() self._profile_applied.clear() # wait for others to complete their tasks, use timeout 3 x sleep_interval to prevent # deadlocks i = 0 while not self._cmd.wait(self._not_used, self._sleep_interval) and i < 3: i += 1 # if terminating due to profile switch if self._terminate_profile_switch.is_set(): full_rollback = True else: # with systemd it detects system shutdown and in such case it doesn't perform # full cleanup, if not shutting down it means that Tuned was explicitly # stopped by user and in such case do full cleanup, without systemd never # do full cleanup full_rollback = False if self._full_rollback_required(): if self._daemon: log.info("terminating Tuned, rolling back all changes") full_rollback = True else: log.info("terminating Tuned in one-shot mode") else: log.info("terminating Tuned due to system shutdown / reboot") if self._daemon: self._unit_manager.stop_tuning(full_rollback) self._unit_manager.destroy_all() def _save_active_profile(self, profile_names, manual): try: self._cmd.save_active_profile(profile_names, manual) except TunedException as e: log.error(str(e)) def _get_recommended_profile(self): log.info("Running in automatic mode, checking what profile is recommended for your configuration.") profile = ProfileRecommender().recommend(hardcoded = not self._recommend_command) log.info("Using '%s' profile" % profile) return profile def _get_startup_profile(self): profile, manual = self._cmd.get_active_profile() if manual is None: manual = profile is not None if not manual: profile = self._get_recommended_profile() return profile, manual def get_all_plugins(self): """Return all accessible plugin classes""" return self._unit_manager.plugins_repository.load_all_plugins() def get_plugin_documentation(self, plugin_name): """Return plugin class docstring""" try: plugin_class = self._unit_manager.plugins_repository.load_plugin( plugin_name ) except ImportError: return "" return plugin_class.__doc__ def get_plugin_hints(self, plugin_name): """Return plugin's parameters and their hints Parameters: plugin_name -- plugins name Return: dictionary -- {parameter_name: hint} """ try: plugin_class = self._unit_manager.plugins_repository.load_plugin( plugin_name ) except ImportError: return {} return plugin_class.get_config_options_hints() def is_enabled(self): return self._profile is not None def is_running(self): return self._thread is not None and self._thread.is_alive() def start(self): if self.is_running(): return False if self._profile is None: return False log.info("starting tuning") self._not_used.set() self._thread = threading.Thread(target=self._thread_code) self._terminate_profile_switch.clear() self._terminate.clear() self._thread.start() return True def verify_profile(self, ignore_missing): if not self.is_running(): log.error("tuned is not running") return False if self._profile is None: log.error("no profile is set") return False if not self._profile_applied.is_set(): log.error("profile is not applied") return False # using deamon, the main loop mustn't exit before our completion self._not_used.clear() log.info("verifying profile(s): %s" % self._profile.name) ret = self._unit_manager.verify_tuning(ignore_missing) # main loop is allowed to exit self._not_used.set() return ret # profile_switch is helper telling plugins whether the stop is due to profile switch def stop(self, profile_switch = False): if not self.is_running(): return False log.info("stopping tuning") if profile_switch: self._terminate_profile_switch.set() self._terminate.set() self._thread.join() self._thread = None return True PK[fi+i+%site-packages/tuned/daemon/daemon.pyonu[ \c@sddlZddlZddlZddlZddlmZddlmZddl j Z ddl m Z ddlm Z ddlmZddlZejjZdefdYZdS( iN(tTunedException(tInvalidProfileException(tcommands(texports(tProfileRecommendertDaemoncBseZddddZdZdZdZedZe dZ e dZ e dZ dZ d Zd Zd Zd Zd ZdZdZdZdZdZdZdZedZRS(cCs%tjdtj|_ttj|_ttj|_ tj |_ t |_ |dk r|jtjtj|_t|jtjtj|_t|jtjtj|_ |jtjtj |_ |jtjtj|_ n||_|jdkr!ttj|_n|j dkr<t|_ n!|j |jkr]|j|_ n|j |j|_tjd|j|j rtjdtjd|j|j|jfn||_||_|jt|_y|j |Wn$t!k r }tj"d|nXdS(Nsinitializing daemonis$using sleep interval of %d second(s)s8dynamic tuning is enabled (can be overridden by plugins)sFusing update interval of %d second(s) (%d times of the sleep interval)s:Cannot set initial profile. No tunings will be enabled: %s(#tlogtdebugtconststCFG_DEF_DAEMONt_daemontinttCFG_DEF_SLEEP_INTERVALt_sleep_intervaltCFG_DEF_UPDATE_INTERVALt_update_intervaltCFG_DEF_DYNAMIC_TUNINGt_dynamic_tuningtTruet_recommend_commandtNonetget_boolt CFG_DAEMONtgettCFG_SLEEP_INTERVALtCFG_UPDATE_INTERVALtCFG_DYNAMIC_TUNINGtCFG_RECOMMEND_COMMANDtCFG_DEF_RECOMMEND_COMMANDt _applicationtFalset _sleep_cyclestinfot _unit_managert_profile_loadert _init_threadsRt_cmdt _init_profileRterror(tselft unit_managertprofile_loadert profile_namestconfigt applicationte((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt__init__s@     !!    '    cCsVd|_tj|_tj|_tj|_|jjtj|_dS(N( Rt_threadt threadingtEventt _terminatet_terminate_profile_switcht _not_usedtsett_profile_applied(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR#4s   cCs|jddS(sARead configuration files again and load profile according to themN(R%R(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytreload_profile_config>scCst}|dkrC|j\}}|dkr_tjdq_n|dkr_tjdnd|_d|_|j||dS(NsINo profile is preset, running in manual mode. No profile will be enabled.tsNo profile will be enabled.(RRt_get_startup_profileRR t_profilet_manualt set_profile(R'R*tmanual((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR%Bs     cCs=|jr*t|j|tdn|dksB|dkrWd|_||_n|j}xH|D]@}||jj j krjt|j|td|qjqjWy"|j j ||_||_Wn8t k r }t|j|td||fnX|r9|dkr&d}n|j||ndS(Ns/Cannot set profile while the daemon is running.R8s%Requested profile '%s' doesn't exist.sCannot load profile(s) '%s': %s(t is_runningRt_notify_profile_changedRRR:R;tsplitR)tprofile_locatortget_known_namesR"tloadRt_save_active_profile(R'R*R=tsave_instantlyt profile_listtprofileR-((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR<Ps(       )  cCs|jS(N(R:(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyRGiscCs|jS(N(R;(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR=mscCs|jS(N(R"(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR)qscCsG|jdk rC|jjdk rC|jjjtj|||n|S(N(RRt_dbus_exportert send_signalRtDBUS_SIGNAL_PROFILE_CHANGED(R'R*tresultterrstr((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR?ws!"cCs|jjddgddg\}}|dkr7tS|d dkrKtS|jjddgddg\}}tjd|dkS( Nt systemctlsis-system-runningt no_errorsiitstoppings list-jobss0\b(shutdown|reboot|halt|poweroff)\.target.*start(R$texecuteRtretsearchR(R'tretcodetout((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt_full_rollback_required|s' 'cCs%|jdkrtdn|jj|jj|j|jj|j|jj |j j t j d|jj|jrtjn|j|jjtd|jrF|j}x|jj|j|jsB|jr|d8}|dkr?|j}t jd|jjt jd|jjq?qqWn|j jd}x6|jj|j|j r|dkr|d7}q\W|jjrt}nNt }|j!r|jrt j d t}qt j d n t j d |jr|jj"|n|jj#dS( Ns2Cannot start the daemon without setting a profile.s'static tuning from profile '%s' appliedtOKiisupdating monitorssperforming tuningsis+terminating Tuned, rolling back all changess"terminating Tuned in one-shot modes1terminating Tuned due to system shutdown / reboot($R:RRR!tcreatetunitsRDtnameR;t start_tuningR6R5RR R RtstartR?RRR$twaitR2R RRtupdate_monitorst update_tuningtclearR4R3tis_setRRUt stop_tuningt destroy_all(R't _sleep_cnttit full_rollback((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt _thread_codesJ              +       cCsDy|jj||Wn&tk r?}tjt|nXdS(N(R$tsave_active_profileRRR&tstr(R'R*R=R-((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyRDscCs;tjdtjd|j }tjd||S(NsWRunning in automatic mode, checking what profile is recommended for your configuration.t hardcodedsUsing '%s' profile(RR Rt recommendR(R'RG((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt_get_recommended_profiles cCsO|jj\}}|dkr0|dk }n|sE|j}n||fS(N(R$tget_active_profileRRk(R'RGR=((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR9s  cCs|jjjS(s$Return all accessible plugin classes(R!tplugins_repositorytload_all_plugins(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytget_all_pluginsscCs5y|jjj|}Wntk r-dSX|jS(sReturn plugin class docstringR8(R!Rmt load_plugint ImportErrort__doc__(R't plugin_namet plugin_class((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytget_plugin_documentations    cCs8y|jjj|}Wntk r-iSX|jS(sReturn plugin's parameters and their hints Parameters: plugin_name -- plugins name Return: dictionary -- {parameter_name: hint} (R!RmRpRqtget_config_options_hints(R'RsRt((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytget_plugin_hintss    cCs |jdk S(N(R:R(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt is_enabledscCs|jdk o|jjS(N(R/Rtis_alive(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR>scCs|jrtS|jdkr#tStjd|jjtj d|j |_ |j j |jj |j jtS(Nsstarting tuningttarget(R>RR:RRR R4R5R0tThreadRfR/R3R_R2R[R(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR[s      cCs|jstjdtS|jdkr=tjdtS|jjs]tjdtS|jj tj d|jj |j j |}|jj|S(Nstuned is not runningsno profile is setsprofile is not appliedsverifying profile(s): %s(R>RR&RR:RR6R`R4R_R RYR!t verify_tuningR5(R'tignore_missingtret((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytverify_profiles      cCsZ|jstStjd|r3|jjn|jj|jjd|_t S(Nsstopping tuning( R>RRR R3R5R2R/tjoinRR(R'tprofile_switch((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytstops     N(t__name__t __module__RR.R#R7R%RR<tpropertyRGR=R)R?RURfRDRkR9RoRuRwRxR>R[RR(((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyRs,#     ;         (tosterrnoR0t tuned.logsttunedttuned.exceptionsRttuned.profiles.exceptionsRt tuned.constsRttuned.utils.commandsRRttuned.utils.profile_recommenderRRQtlogsRRtobjectR(((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyts     PK[JKK&site-packages/tuned/daemon/__init__.pynu[from .application import * from .controller import * from .daemon import * PK[o$""*site-packages/tuned/daemon/application.pyonu[ \c@sddlmZmZmZmZmZmZmZddlm Z ddl Zddl m Z ddl m Z ddlZddlZddlZddlZddlZddljZddlmZejjZdgZdefd YZdS( i(tstoragetunitstmonitorstpluginstprofilestexportsthardware(tTunedExceptionNi(t controller(tdaemon(t GlobalConfigt ApplicationcBseZd d dZdZdZdZdZej dZ dZ dZ ej dZ ed Zed Zd ZRS( c Csd|_tj}tj|}|dkr9tn||_|jjtj rgt j dn t j dt j }|jjdtj}tjd|}tj}tj} tjj} tjj|_tj ||||| | |j|j} t|jjtjtj} tj| || |} tj}tj}tj tj!}tj"||||j|j}t#j$| |||j||_%t&j'|j%|j|_(|j)d|_*dS(Ns8dynamic tuning is enabled (can be overridden in plugins)s#dynamic tuning is globally disabledtudev_buffer_sizet buffer_size(+tNonet_dbus_exporterRtPickleProvidertFactoryR tconfigtget_booltconststCFG_DYNAMIC_TUNINGtlogtinfoRt Repositorytget_sizetCFG_DEF_UDEV_BUFFER_SIZERt Inventoryt DeviceMatchertDeviceMatcherUdevRtinstanceRt variablest VariablestinttgettCFG_DEFAULT_INSTANCE_PRIORITYt!CFG_DEF_DEFAULT_INSTANCE_PRIORITYRtManagertMergertLocatortLOAD_DIRECTORIEStLoaderR tDaemont_daemonRt Controllert _controllert _init_signalst _pid_file(tselft profile_nameRtstorage_providertstorage_factorytmonitors_repositoryR thardware_inventorytdevice_matchertdevice_matcher_udevtplugin_instance_factorytplugins_repositorytdef_instance_priorityt unit_managertprofile_factorytprofile_mergertprofile_locatortprofile_loader((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt__init__s8      !   !! cs&fd}tj|dS(Ncs|krndS(N((t_signal_numbert_frame(thandlert signal_number(s</usr/lib/python2.7/site-packages/tuned/daemon/application.pythandler_wrapper;s (tsignal(R0RDRCRE((RCRDs</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt_handle_signal:scCsO|jtj|jj|jtj|jj|jtj|jjdS(N(RGRFtSIGHUPR-treloadtSIGINTt terminatetSIGTERM(R0((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyR.@scCs]|jdk rtdntjj||||_tj|jtj|jdS(Ns&DBus interface is already initialized.( RRRRtdbust DBusExportertregister_exportertregister_objectR-(R0tbus_namet object_nametinterface_name((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pytattach_to_dbusEs cCstj|tj|gggtj\}}}t|dkrbtj|tdntj|d}tj|t|dkrtdnytj d|d}Wn tj k rtdnX|t krtdnd S( s| Wait till the child signalizes that the initialization is complete by writing some uninteresting data into the pipe. is=Cannot daemonize, timeout when waiting for the child process.iis:Cannot daemonize, no response from child process received.t?s?Cannot daemonize, invalid response from child process received.s0Cannot daemonize, child process reports failure.N( tostclosetselectRtDAEMONIZE_PARENT_TIMEOUTtlenRtreadtstructtunpackterrortTrue(R0t parent_in_fdt child_out_fdt read_readytdroptresponsetval((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt_daemonize_parentMs '   cCs||_|jytjj|j}tjj|sMtj|ntjtj|jtj tj Btj Bdd}|j dtj WdQXWn9ttfk r}tjd|jt|fnXdS(Nitws%dscannot write the PID to %s: %s(R/t_delete_pid_fileRVtpathtdirnametexiststmakedirstfdopentopentO_CREATtO_TRUNCtO_WRONLYtwritetgetpidtOSErrortIOErrorRtcriticaltstr(R0tpid_filetdir_nametfR^((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pytwrite_pid_filefs  8!cCsftjj|jrbytj|jWqbtk r^}tjd|jt|fqbXndS(Ns&cannot remove existing PID file %s, %s( RVRiRkR/tunlinkRtRtwarningRw(R0R^((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyRhss cCs~tj|tjdtjtjdy,tj}|dkr\tjdnWnetk r}t j dt |t j dt}tj||tj|tdnXtdd}tj|jtjjtj|jtjjtj|jtjj|j|t jdt j dt}tj||tj|d S( sy Finishes daemonizing process, writes a PID file and signalizes to the parent that the initialization is complete. t/is"cannot daemonize, fork() error: %sRUs'Cannot daemonize, second fork() failed.s /dev/nullsw+ssuccessfully daemonizedN(RVRWtchdirtsetsidtumasktforktsystexitRtRRvRwR\tpacktFalseRrRRntdup2tfilenotstdintstdouttstderrR{tdebugR_(R0RxR`RatpidR^Retfd((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt_daemonize_childzs.         cCstj}ytj}WnAtk r_}tj|dtj|dtdnXy=|dkr|j|tjdn|j ||Wn&|dkrqtjdnXdS(s Daemonizes the application. In case of failure, TunedException is raised in the parent process. If the operation is successfull, the main process is terminated and only child process returns from this method. iis Cannot daemonize, fork() failed.N( RVtpipeRRtRWRRfRRR(R0Rxtparent_child_fdst child_pidR^((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt daemonizes     cCs|jS(N(R+(R0((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyR scCs|jS(N(R-(R0((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyRscCs|r|jjtjtn|jjtjtjsJtjdn|j j }|jjtjtjrt j n|j dk r|jn|S(NsrUsing one shot no deamon mode, most of the functionality will be not available, it can be changed in global config(RtsetRt CFG_DAEMONR_RtCFG_DEF_DAEMONRtwarnR-trunRtstopR/RRh(R0R tresult((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyRs  N(t__name__t __module__RR@RGR.RTRfRtPID_FILER{RhRRtpropertyR RR(((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyR s'      "(ttunedRRRRRRRttuned.exceptionsRt tuned.logstRR RFRVRRXR\t tuned.constsRttuned.utils.global_configR tlogsR"Rt__all__tobjectR (((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyts4       PK[@/"/"(site-packages/tuned/daemon/controller.pynu[from tuned import exports import tuned.logs import tuned.exceptions from tuned.exceptions import TunedException import threading import tuned.consts as consts from tuned.utils.commands import commands from tuned.utils.profile_recommender import ProfileRecommender __all__ = ["Controller"] log = tuned.logs.get() class TimerStore(object): def __init__(self): self._timers = dict() self._timers_lock = threading.Lock() def store_timer(self, token, timer): with self._timers_lock: self._timers[token] = timer def drop_timer(self, token): with self._timers_lock: try: timer = self._timers[token] timer.cancel() del self._timers[token] except: pass def cancel_all(self): with self._timers_lock: for timer in self._timers.values(): timer.cancel() self._timers.clear() class Controller(tuned.exports.interfaces.ExportableInterface): """ Controller's purpose is to keep the program running, start/stop the tuning, and export the controller interface (currently only over D-Bus). """ def __init__(self, daemon, global_config): super(Controller, self).__init__() self._daemon = daemon self._global_config = global_config self._terminate = threading.Event() self._cmd = commands() self._timer_store = TimerStore() def run(self): """ Controller main loop. The call is blocking. """ log.info("starting controller") res = self.start() daemon = self._global_config.get_bool(consts.CFG_DAEMON, consts.CFG_DEF_DAEMON) if not res and daemon: exports.start() if daemon: self._terminate.clear() # we have to pass some timeout, otherwise signals will not work while not self._cmd.wait(self._terminate, 3600): pass log.info("terminating controller") self.stop() def terminate(self): self._terminate.set() @exports.signal("sbs") def profile_changed(self, profile_name, result, errstr): pass # exports decorator checks the authorization (currently through polkit), caller is None if # no authorization was performed (i.e. the call should process as authorized), string # identifying caller (with DBus it's the caller bus name) if authorized and empty # string if not authorized, caller must be the last argument def _log_capture_abort(self, token): tuned.logs.log_capture_finish(token) self._timer_store.drop_timer(token) @exports.export("ii", "s") def log_capture_start(self, log_level, timeout, caller = None): if caller == "": return "" token = tuned.logs.log_capture_start(log_level) if token is None: return "" if timeout > 0: timer = threading.Timer(timeout, self._log_capture_abort, args = [token]) self._timer_store.store_timer(token, timer) timer.start() return "" if token is None else token @exports.export("s", "s") def log_capture_finish(self, token, caller = None): if caller == "": return "" res = tuned.logs.log_capture_finish(token) self._timer_store.drop_timer(token) return "" if res is None else res @exports.export("", "b") def start(self, caller = None): if caller == "": return False if self._global_config.get_bool(consts.CFG_DAEMON, consts.CFG_DEF_DAEMON): if self._daemon.is_running(): return True elif not self._daemon.is_enabled(): return False return self._daemon.start() @exports.export("", "b") def stop(self, caller = None): if caller == "": return False if not self._daemon.is_running(): res = True else: res = self._daemon.stop() self._timer_store.cancel_all() return res @exports.export("", "b") def reload(self, caller = None): if caller == "": return False if self._daemon.is_running(): stop_ok = self.stop() if not stop_ok: return False try: self._daemon.reload_profile_config() except TunedException as e: log.error("Failed to reload Tuned: %s" % e) return False return self.start() def _switch_profile(self, profile_name, manual): was_running = self._daemon.is_running() msg = "OK" success = True reapply = False try: if was_running: self._daemon.stop(profile_switch = True) self._daemon.set_profile(profile_name, manual) except tuned.exceptions.TunedException as e: success = False msg = str(e) if was_running and self._daemon.profile.name == profile_name: log.error("Failed to reapply profile '%s'. Did it change on disk and break?" % profile_name) reapply = True else: log.error("Failed to apply profile '%s'" % profile_name) finally: if was_running: if reapply: log.warn("Applying previously applied (possibly out-dated) profile '%s'." % profile_name) elif not success: log.info("Applying previously applied profile.") self._daemon.start() return (success, msg) @exports.export("s", "(bs)") def switch_profile(self, profile_name, caller = None): if caller == "": return (False, "Unauthorized") return self._switch_profile(profile_name, True) @exports.export("", "(bs)") def auto_profile(self, caller = None): if caller == "": return (False, "Unauthorized") profile_name = self.recommend_profile() return self._switch_profile(profile_name, False) @exports.export("", "s") def active_profile(self, caller = None): if caller == "": return "" if self._daemon.profile is not None: return self._daemon.profile.name else: return "" @exports.export("", "(ss)") def profile_mode(self, caller = None): if caller == "": return "unknown", "Unauthorized" manual = self._daemon.manual if manual is None: # This means no profile is applied. Check the preset value. try: profile, manual = self._cmd.get_active_profile() if manual is None: manual = profile is not None except TunedException as e: mode = "unknown" error = str(e) return mode, error mode = consts.ACTIVE_PROFILE_MANUAL if manual else consts.ACTIVE_PROFILE_AUTO return mode, "" @exports.export("", "b") def disable(self, caller = None): if caller == "": return False if self._daemon.is_running(): self._daemon.stop() if self._daemon.is_enabled(): self._daemon.set_profile(None, True, save_instantly=True) return True @exports.export("", "b") def is_running(self, caller = None): if caller == "": return False return self._daemon.is_running() @exports.export("", "as") def profiles(self, caller = None): if caller == "": return [] return self._daemon.profile_loader.profile_locator.get_known_names() @exports.export("", "a(ss)") def profiles2(self, caller = None): if caller == "": return [] return self._daemon.profile_loader.profile_locator.get_known_names_summary() @exports.export("s", "(bsss)") def profile_info(self, profile_name, caller = None): if caller == "": return tuple(False, "", "", "") if profile_name is None or profile_name == "": profile_name = self.active_profile() return tuple(self._daemon.profile_loader.profile_locator.get_profile_attrs(profile_name, [consts.PROFILE_ATTR_SUMMARY, consts.PROFILE_ATTR_DESCRIPTION], [""])) @exports.export("", "s") def recommend_profile(self, caller = None): if caller == "": return "" return ProfileRecommender().recommend(hardcoded = not self._global_config.get_bool(consts.CFG_RECOMMEND_COMMAND, consts.CFG_DEF_RECOMMEND_COMMAND)) @exports.export("", "b") def verify_profile(self, caller = None): if caller == "": return False return self._daemon.verify_profile(ignore_missing = False) @exports.export("", "b") def verify_profile_ignore_missing(self, caller = None): if caller == "": return False return self._daemon.verify_profile(ignore_missing = True) @exports.export("", "a{sa{ss}}") def get_all_plugins(self, caller = None): """Return dictionary with accesible plugins Return: dictionary -- {plugin_name: {parameter_name: default_value}} """ if caller == "": return False plugins = {} for plugin_class in self._daemon.get_all_plugins(): plugin_name = plugin_class.__module__.split(".")[-1].split("_", 1)[1] conf_options = plugin_class._get_config_options() plugins[plugin_name] = {} for key, val in conf_options.items(): plugins[plugin_name][key] = str(val) return plugins @exports.export("s","s") def get_plugin_documentation(self, plugin_name, caller = None): """Return docstring of plugin's class""" if caller == "": return False return self._daemon.get_plugin_documentation(str(plugin_name)) @exports.export("s","a{ss}") def get_plugin_hints(self, plugin_name, caller = None): """Return dictionary with plugin's parameters and their hints Parameters: plugin_name -- name of plugin Return: dictionary -- {parameter_name: hint} """ if caller == "": return False return self._daemon.get_plugin_hints(str(plugin_name)) PK[$b 'site-packages/tuned/daemon/__init__.pyonu[ \c@s"ddlTddlTddlTdS(i(t*N(t applicationt controllertdaemon(((s9/usr/lib/python2.7/site-packages/tuned/daemon/__init__.pyts  PK[V)site-packages/tuned/daemon/application.pynu[from tuned import storage, units, monitors, plugins, profiles, exports, hardware from tuned.exceptions import TunedException import tuned.logs from . import controller from . import daemon import signal import os import sys import select import struct import tuned.consts as consts from tuned.utils.global_config import GlobalConfig log = tuned.logs.get() __all__ = ["Application"] class Application(object): def __init__(self, profile_name = None, config = None): self._dbus_exporter = None storage_provider = storage.PickleProvider() storage_factory = storage.Factory(storage_provider) self.config = GlobalConfig() if config is None else config if self.config.get_bool(consts.CFG_DYNAMIC_TUNING): log.info("dynamic tuning is enabled (can be overridden in plugins)") else: log.info("dynamic tuning is globally disabled") monitors_repository = monitors.Repository() udev_buffer_size = self.config.get_size("udev_buffer_size", consts.CFG_DEF_UDEV_BUFFER_SIZE) hardware_inventory = hardware.Inventory(buffer_size=udev_buffer_size) device_matcher = hardware.DeviceMatcher() device_matcher_udev = hardware.DeviceMatcherUdev() plugin_instance_factory = plugins.instance.Factory() self.variables = profiles.variables.Variables() plugins_repository = plugins.Repository(monitors_repository, storage_factory, hardware_inventory,\ device_matcher, device_matcher_udev, plugin_instance_factory, self.config, self.variables) def_instance_priority = int(self.config.get(consts.CFG_DEFAULT_INSTANCE_PRIORITY, consts.CFG_DEF_DEFAULT_INSTANCE_PRIORITY)) unit_manager = units.Manager( plugins_repository, monitors_repository, def_instance_priority, hardware_inventory) profile_factory = profiles.Factory() profile_merger = profiles.Merger() profile_locator = profiles.Locator(consts.LOAD_DIRECTORIES) profile_loader = profiles.Loader(profile_locator, profile_factory, profile_merger, self.config, self.variables) self._daemon = daemon.Daemon(unit_manager, profile_loader, profile_name, self.config, self) self._controller = controller.Controller(self._daemon, self.config) self._init_signals() self._pid_file = None def _handle_signal(self, signal_number, handler): def handler_wrapper(_signal_number, _frame): if signal_number == _signal_number: handler() signal.signal(signal_number, handler_wrapper) def _init_signals(self): self._handle_signal(signal.SIGHUP, self._controller.reload) self._handle_signal(signal.SIGINT, self._controller.terminate) self._handle_signal(signal.SIGTERM, self._controller.terminate) def attach_to_dbus(self, bus_name, object_name, interface_name): if self._dbus_exporter is not None: raise TunedException("DBus interface is already initialized.") self._dbus_exporter = exports.dbus.DBusExporter(bus_name, interface_name, object_name) exports.register_exporter(self._dbus_exporter) exports.register_object(self._controller) def _daemonize_parent(self, parent_in_fd, child_out_fd): """ Wait till the child signalizes that the initialization is complete by writing some uninteresting data into the pipe. """ os.close(child_out_fd) (read_ready, drop, drop) = select.select([parent_in_fd], [], [], consts.DAEMONIZE_PARENT_TIMEOUT) if len(read_ready) != 1: os.close(parent_in_fd) raise TunedException("Cannot daemonize, timeout when waiting for the child process.") response = os.read(parent_in_fd, 8) os.close(parent_in_fd) if len(response) == 0: raise TunedException("Cannot daemonize, no response from child process received.") try: val = struct.unpack("?", response)[0] except struct.error: raise TunedException("Cannot daemonize, invalid response from child process received.") if val != True: raise TunedException("Cannot daemonize, child process reports failure.") def write_pid_file(self, pid_file = consts.PID_FILE): self._pid_file = pid_file self._delete_pid_file() try: dir_name = os.path.dirname(self._pid_file) if not os.path.exists(dir_name): os.makedirs(dir_name) with os.fdopen(os.open(self._pid_file, os.O_CREAT|os.O_TRUNC|os.O_WRONLY , 0o644), "w") as f: f.write("%d" % os.getpid()) except (OSError,IOError) as error: log.critical("cannot write the PID to %s: %s" % (self._pid_file, str(error))) def _delete_pid_file(self): if os.path.exists(self._pid_file): try: os.unlink(self._pid_file) except OSError as error: log.warning("cannot remove existing PID file %s, %s" % (self._pid_file, str(error))) def _daemonize_child(self, pid_file, parent_in_fd, child_out_fd): """ Finishes daemonizing process, writes a PID file and signalizes to the parent that the initialization is complete. """ os.close(parent_in_fd) os.chdir("/") os.setsid() os.umask(0) try: pid = os.fork() if pid > 0: sys.exit(0) except OSError as error: log.critical("cannot daemonize, fork() error: %s" % str(error)) val = struct.pack("?", False) os.write(child_out_fd, val) os.close(child_out_fd) raise TunedException("Cannot daemonize, second fork() failed.") fd = open("/dev/null", "w+") os.dup2(fd.fileno(), sys.stdin.fileno()) os.dup2(fd.fileno(), sys.stdout.fileno()) os.dup2(fd.fileno(), sys.stderr.fileno()) self.write_pid_file(pid_file) log.debug("successfully daemonized") val = struct.pack("?", True) os.write(child_out_fd, val) os.close(child_out_fd) def daemonize(self, pid_file = consts.PID_FILE): """ Daemonizes the application. In case of failure, TunedException is raised in the parent process. If the operation is successfull, the main process is terminated and only child process returns from this method. """ parent_child_fds = os.pipe() try: child_pid = os.fork() except OSError as error: os.close(parent_child_fds[0]) os.close(parent_child_fds[1]) raise TunedException("Cannot daemonize, fork() failed.") try: if child_pid > 0: self._daemonize_parent(*parent_child_fds) sys.exit(0) else: self._daemonize_child(pid_file, *parent_child_fds) except: # pass exceptions only into parent process if child_pid > 0: raise else: sys.exit(1) @property def daemon(self): return self._daemon @property def controller(self): return self._controller def run(self, daemon): # override global config if ran from command line with daemon option (-d) if daemon: self.config.set(consts.CFG_DAEMON, True) if not self.config.get_bool(consts.CFG_DAEMON, consts.CFG_DEF_DAEMON): log.warn("Using one shot no deamon mode, most of the functionality will be not available, it can be changed in global config") result = self._controller.run() if self.config.get_bool(consts.CFG_DAEMON, consts.CFG_DEF_DAEMON): exports.stop() if self._pid_file is not None: self._delete_pid_file() return result PK[fi+i+%site-packages/tuned/daemon/daemon.pycnu[ \c@sddlZddlZddlZddlZddlmZddlmZddl j Z ddl m Z ddlm Z ddlmZddlZejjZdefdYZdS( iN(tTunedException(tInvalidProfileException(tcommands(texports(tProfileRecommendertDaemoncBseZddddZdZdZdZedZe dZ e dZ e dZ dZ d Zd Zd Zd Zd ZdZdZdZdZdZdZdZedZRS(cCs%tjdtj|_ttj|_ttj|_ tj |_ t |_ |dk r|jtjtj|_t|jtjtj|_t|jtjtj|_ |jtjtj |_ |jtjtj|_ n||_|jdkr!ttj|_n|j dkr<t|_ n!|j |jkr]|j|_ n|j |j|_tjd|j|j rtjdtjd|j|j|jfn||_||_|jt|_y|j |Wn$t!k r }tj"d|nXdS(Nsinitializing daemonis$using sleep interval of %d second(s)s8dynamic tuning is enabled (can be overridden by plugins)sFusing update interval of %d second(s) (%d times of the sleep interval)s:Cannot set initial profile. No tunings will be enabled: %s(#tlogtdebugtconststCFG_DEF_DAEMONt_daemontinttCFG_DEF_SLEEP_INTERVALt_sleep_intervaltCFG_DEF_UPDATE_INTERVALt_update_intervaltCFG_DEF_DYNAMIC_TUNINGt_dynamic_tuningtTruet_recommend_commandtNonetget_boolt CFG_DAEMONtgettCFG_SLEEP_INTERVALtCFG_UPDATE_INTERVALtCFG_DYNAMIC_TUNINGtCFG_RECOMMEND_COMMANDtCFG_DEF_RECOMMEND_COMMANDt _applicationtFalset _sleep_cyclestinfot _unit_managert_profile_loadert _init_threadsRt_cmdt _init_profileRterror(tselft unit_managertprofile_loadert profile_namestconfigt applicationte((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt__init__s@     !!    '    cCsVd|_tj|_tj|_tj|_|jjtj|_dS(N( Rt_threadt threadingtEventt _terminatet_terminate_profile_switcht _not_usedtsett_profile_applied(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR#4s   cCs|jddS(sARead configuration files again and load profile according to themN(R%R(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytreload_profile_config>scCst}|dkrC|j\}}|dkr_tjdq_n|dkr_tjdnd|_d|_|j||dS(NsINo profile is preset, running in manual mode. No profile will be enabled.tsNo profile will be enabled.(RRt_get_startup_profileRR t_profilet_manualt set_profile(R'R*tmanual((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR%Bs     cCs=|jr*t|j|tdn|dksB|dkrWd|_||_n|j}xH|D]@}||jj j krjt|j|td|qjqjWy"|j j ||_||_Wn8t k r }t|j|td||fnX|r9|dkr&d}n|j||ndS(Ns/Cannot set profile while the daemon is running.R8s%Requested profile '%s' doesn't exist.sCannot load profile(s) '%s': %s(t is_runningRt_notify_profile_changedRRR:R;tsplitR)tprofile_locatortget_known_namesR"tloadRt_save_active_profile(R'R*R=tsave_instantlyt profile_listtprofileR-((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR<Ps(       )  cCs|jS(N(R:(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyRGiscCs|jS(N(R;(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR=mscCs|jS(N(R"(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR)qscCsG|jdk rC|jjdk rC|jjjtj|||n|S(N(RRt_dbus_exportert send_signalRtDBUS_SIGNAL_PROFILE_CHANGED(R'R*tresultterrstr((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR?ws!"cCs|jjddgddg\}}|dkr7tS|d dkrKtS|jjddgddg\}}tjd|dkS( Nt systemctlsis-system-runningt no_errorsiitstoppings list-jobss0\b(shutdown|reboot|halt|poweroff)\.target.*start(R$texecuteRtretsearchR(R'tretcodetout((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt_full_rollback_required|s' 'cCs%|jdkrtdn|jj|jj|j|jj|j|jj |j j t j d|jj|jrtjn|j|jjtd|jrF|j}x|jj|j|jsB|jr|d8}|dkr?|j}t jd|jjt jd|jjq?qqWn|j jd}x6|jj|j|j r|dkr|d7}q\W|jjrt}nNt }|j!r|jrt j d t}qt j d n t j d |jr|jj"|n|jj#dS( Ns2Cannot start the daemon without setting a profile.s'static tuning from profile '%s' appliedtOKiisupdating monitorssperforming tuningsis+terminating Tuned, rolling back all changess"terminating Tuned in one-shot modes1terminating Tuned due to system shutdown / reboot($R:RRR!tcreatetunitsRDtnameR;t start_tuningR6R5RR R RtstartR?RRR$twaitR2R RRtupdate_monitorst update_tuningtclearR4R3tis_setRRUt stop_tuningt destroy_all(R't _sleep_cnttit full_rollback((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt _thread_codesJ              +       cCsDy|jj||Wn&tk r?}tjt|nXdS(N(R$tsave_active_profileRRR&tstr(R'R*R=R-((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyRDscCs;tjdtjd|j }tjd||S(NsWRunning in automatic mode, checking what profile is recommended for your configuration.t hardcodedsUsing '%s' profile(RR Rt recommendR(R'RG((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt_get_recommended_profiles cCsO|jj\}}|dkr0|dk }n|sE|j}n||fS(N(R$tget_active_profileRRk(R'RGR=((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR9s  cCs|jjjS(s$Return all accessible plugin classes(R!tplugins_repositorytload_all_plugins(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytget_all_pluginsscCs5y|jjj|}Wntk r-dSX|jS(sReturn plugin class docstringR8(R!Rmt load_plugint ImportErrort__doc__(R't plugin_namet plugin_class((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytget_plugin_documentations    cCs8y|jjj|}Wntk r-iSX|jS(sReturn plugin's parameters and their hints Parameters: plugin_name -- plugins name Return: dictionary -- {parameter_name: hint} (R!RmRpRqtget_config_options_hints(R'RsRt((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytget_plugin_hintss    cCs |jdk S(N(R:R(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyt is_enabledscCs|jdk o|jjS(N(R/Rtis_alive(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR>scCs|jrtS|jdkr#tStjd|jjtj d|j |_ |j j |jj |j jtS(Nsstarting tuningttarget(R>RR:RRR R4R5R0tThreadRfR/R3R_R2R[R(R'((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyR[s      cCs|jstjdtS|jdkr=tjdtS|jjs]tjdtS|jj tj d|jj |j j |}|jj|S(Nstuned is not runningsno profile is setsprofile is not appliedsverifying profile(s): %s(R>RR&RR:RR6R`R4R_R RYR!t verify_tuningR5(R'tignore_missingtret((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytverify_profiles      cCsZ|jstStjd|r3|jjn|jj|jjd|_t S(Nsstopping tuning( R>RRR R3R5R2R/tjoinRR(R'tprofile_switch((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pytstops     N(t__name__t __module__RR.R#R7R%RR<tpropertyRGR=R)R?RURfRDRkR9RoRuRwRxR>R[RR(((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyRs,#     ;         (tosterrnoR0t tuned.logsttunedttuned.exceptionsRttuned.profiles.exceptionsRt tuned.constsRttuned.utils.commandsRRttuned.utils.profile_recommenderRRQtlogsRRtobjectR(((s7/usr/lib/python2.7/site-packages/tuned/daemon/daemon.pyts     PK[o$""*site-packages/tuned/daemon/application.pycnu[ \c@sddlmZmZmZmZmZmZmZddlm Z ddl Zddl m Z ddl m Z ddlZddlZddlZddlZddlZddljZddlmZejjZdgZdefd YZdS( i(tstoragetunitstmonitorstpluginstprofilestexportsthardware(tTunedExceptionNi(t controller(tdaemon(t GlobalConfigt ApplicationcBseZd d dZdZdZdZdZej dZ dZ dZ ej dZ ed Zed Zd ZRS( c Csd|_tj}tj|}|dkr9tn||_|jjtj rgt j dn t j dt j }|jjdtj}tjd|}tj}tj} tjj} tjj|_tj ||||| | |j|j} t|jjtjtj} tj| || |} tj}tj}tj tj!}tj"||||j|j}t#j$| |||j||_%t&j'|j%|j|_(|j)d|_*dS(Ns8dynamic tuning is enabled (can be overridden in plugins)s#dynamic tuning is globally disabledtudev_buffer_sizet buffer_size(+tNonet_dbus_exporterRtPickleProvidertFactoryR tconfigtget_booltconststCFG_DYNAMIC_TUNINGtlogtinfoRt Repositorytget_sizetCFG_DEF_UDEV_BUFFER_SIZERt Inventoryt DeviceMatchertDeviceMatcherUdevRtinstanceRt variablest VariablestinttgettCFG_DEFAULT_INSTANCE_PRIORITYt!CFG_DEF_DEFAULT_INSTANCE_PRIORITYRtManagertMergertLocatortLOAD_DIRECTORIEStLoaderR tDaemont_daemonRt Controllert _controllert _init_signalst _pid_file(tselft profile_nameRtstorage_providertstorage_factorytmonitors_repositoryR thardware_inventorytdevice_matchertdevice_matcher_udevtplugin_instance_factorytplugins_repositorytdef_instance_priorityt unit_managertprofile_factorytprofile_mergertprofile_locatortprofile_loader((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt__init__s8      !   !! cs&fd}tj|dS(Ncs|krndS(N((t_signal_numbert_frame(thandlert signal_number(s</usr/lib/python2.7/site-packages/tuned/daemon/application.pythandler_wrapper;s (tsignal(R0RDRCRE((RCRDs</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt_handle_signal:scCsO|jtj|jj|jtj|jj|jtj|jjdS(N(RGRFtSIGHUPR-treloadtSIGINTt terminatetSIGTERM(R0((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyR.@scCs]|jdk rtdntjj||||_tj|jtj|jdS(Ns&DBus interface is already initialized.( RRRRtdbust DBusExportertregister_exportertregister_objectR-(R0tbus_namet object_nametinterface_name((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pytattach_to_dbusEs cCstj|tj|gggtj\}}}t|dkrbtj|tdntj|d}tj|t|dkrtdnytj d|d}Wn tj k rtdnX|t krtdnd S( s| Wait till the child signalizes that the initialization is complete by writing some uninteresting data into the pipe. is=Cannot daemonize, timeout when waiting for the child process.iis:Cannot daemonize, no response from child process received.t?s?Cannot daemonize, invalid response from child process received.s0Cannot daemonize, child process reports failure.N( tostclosetselectRtDAEMONIZE_PARENT_TIMEOUTtlenRtreadtstructtunpackterrortTrue(R0t parent_in_fdt child_out_fdt read_readytdroptresponsetval((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt_daemonize_parentMs '   cCs||_|jytjj|j}tjj|sMtj|ntjtj|jtj tj Btj Bdd}|j dtj WdQXWn9ttfk r}tjd|jt|fnXdS(Nitws%dscannot write the PID to %s: %s(R/t_delete_pid_fileRVtpathtdirnametexiststmakedirstfdopentopentO_CREATtO_TRUNCtO_WRONLYtwritetgetpidtOSErrortIOErrorRtcriticaltstr(R0tpid_filetdir_nametfR^((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pytwrite_pid_filefs  8!cCsftjj|jrbytj|jWqbtk r^}tjd|jt|fqbXndS(Ns&cannot remove existing PID file %s, %s( RVRiRkR/tunlinkRtRtwarningRw(R0R^((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyRhss cCs~tj|tjdtjtjdy,tj}|dkr\tjdnWnetk r}t j dt |t j dt}tj||tj|tdnXtdd}tj|jtjjtj|jtjjtj|jtjj|j|t jdt j dt}tj||tj|d S( sy Finishes daemonizing process, writes a PID file and signalizes to the parent that the initialization is complete. t/is"cannot daemonize, fork() error: %sRUs'Cannot daemonize, second fork() failed.s /dev/nullsw+ssuccessfully daemonizedN(RVRWtchdirtsetsidtumasktforktsystexitRtRRvRwR\tpacktFalseRrRRntdup2tfilenotstdintstdouttstderrR{tdebugR_(R0RxR`RatpidR^Retfd((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt_daemonize_childzs.         cCstj}ytj}WnAtk r_}tj|dtj|dtdnXy=|dkr|j|tjdn|j ||Wn&|dkrqtjdnXdS(s Daemonizes the application. In case of failure, TunedException is raised in the parent process. If the operation is successfull, the main process is terminated and only child process returns from this method. iis Cannot daemonize, fork() failed.N( RVtpipeRRtRWRRfRRR(R0Rxtparent_child_fdst child_pidR^((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyt daemonizes     cCs|jS(N(R+(R0((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyR scCs|jS(N(R-(R0((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyRscCs|r|jjtjtn|jjtjtjsJtjdn|j j }|jjtjtjrt j n|j dk r|jn|S(NsrUsing one shot no deamon mode, most of the functionality will be not available, it can be changed in global config(RtsetRt CFG_DAEMONR_RtCFG_DEF_DAEMONRtwarnR-trunRtstopR/RRh(R0R tresult((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyRs  N(t__name__t __module__RR@RGR.RTRfRtPID_FILER{RhRRtpropertyR RR(((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyR s'      "(ttunedRRRRRRRttuned.exceptionsRt tuned.logstRR RFRVRRXR\t tuned.constsRttuned.utils.global_configR tlogsR"Rt__all__tobjectR (((s</usr/lib/python2.7/site-packages/tuned/daemon/application.pyts4       PK[,l y/y/)site-packages/tuned/daemon/controller.pyonu[ +cc@sddlmZddlZddlZddlmZddlZddljZddlm Z ddl m Z dgZ ej jZdefdYZdejjjfd YZdS( i(texportsN(tTunedException(tcommands(tProfileRecommendert Controllert TimerStorecBs,eZdZdZdZdZRS(cCst|_tj|_dS(N(tdictt_timerst threadingtLockt _timers_lock(tself((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt__init__s cCs!|j||j|tS|jj sTtSn|jj S(NR8( tFalseRR#R$R%R&Rt is_runningtTruet is_enabledR"(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyR"ms cCsH|dkrtS|jjs(t}n|jj}|jj|S(NR8(RARRBRCR(RR(R R?R)((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyR(xs   cCs{|dkrtS|jjr8|j}|s8tSny|jjWn%tk rp}tjd|tSX|jS(NR8sFailed to reload Tuned: %s( RARRBR(treload_profile_configRR terrorR"(R R?tstop_okte((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytreloads  cCs |jj}d}t}t}zy3|rC|jjdtn|jj||Wnqtjjk r}t}t |}|r|jj j |krt j d|t}qt j d|nXWd|r|rt jd|n|st jdn|jjnX||fS(NtOKtprofile_switchs@Failed to reapply profile '%s'. Did it change on disk and break?sFailed to apply profile '%s's>Applying previously applied (possibly out-dated) profile '%s'.s$Applying previously applied profile.(RRBRCRAR(t set_profileR2t exceptionsRtstrtprofiletnameR RFtwarnR!R"(R R.tmanualt was_runningtmsgtsuccesstreapplyRH((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt_switch_profiles.  s(bs)cCs&|dkrtdfS|j|tS(NR8t Unauthorized(RARWRC(R R.R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytswitch_profiles  cCs2|dkrtdfS|j}|j|tS(NR8RX(RAtrecommend_profileRW(R R?R.((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt auto_profiles   cCs7|dkrdS|jjdk r/|jjjSdSdS(NR8(RROR;RP(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytactive_profiles   s(ss)cCs|dkrdS|jj}|dkry4|jj\}}|dkr[|dk }nWqtk r}d}t|}||fSXn|rtjntj }|dfS(NR8tunknownRX(sunknowns Unauthorized( RRRR;Rtget_active_profileRRNR$tACTIVE_PROFILE_MANUALtACTIVE_PROFILE_AUTO(R R?RRRORHtmodeRF((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt profile_modes     cCs^|dkrtS|jjr/|jjn|jjrZ|jjdtdtntS(NR8tsave_instantly(RARRBR(RDRLR;RC(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytdisables cCs|dkrtS|jjS(NR8(RARRB(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyRBs tascCs#|dkrgS|jjjjS(NR8(Rtprofile_loadertprofile_locatortget_known_names(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytprofiless sa(ss)cCs#|dkrgS|jjjjS(NR8(RRfRgtget_known_names_summary(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt profiles2s s(bsss)cCsw|dkrttdddS|dks7|dkrF|j}nt|jjjj|tj tj gdgS(NR8( ttupleRAR;R\RRfRgtget_profile_attrsR$tPROFILE_ATTR_SUMMARYtPROFILE_ATTR_DESCRIPTION(R R.R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt profile_infos  cCs9|dkrdStjd|jjtjtj S(NR8t hardcoded(Rt recommendRR#R$tCFG_RECOMMEND_COMMANDtCFG_DEF_RECOMMEND_COMMAND(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyRZs cCs#|dkrtS|jjdtS(NR8tignore_missing(RARtverify_profile(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyRvs cCs#|dkrtS|jjdtS(NR8Ru(RARRvRC(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytverify_profile_ignore_missings s a{sa{ss}}cCs|dkrtSi}x|jjD]s}|jjddjddd}|j}i||s    PK[,l y/y/)site-packages/tuned/daemon/controller.pycnu[ +cc@sddlmZddlZddlZddlmZddlZddljZddlm Z ddl m Z dgZ ej jZdefdYZdejjjfd YZdS( i(texportsN(tTunedException(tcommands(tProfileRecommendert Controllert TimerStorecBs,eZdZdZdZdZRS(cCst|_tj|_dS(N(tdictt_timerst threadingtLockt _timers_lock(tself((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt__init__s cCs!|j||j|tS|jj sTtSn|jj S(NR8( tFalseRR#R$R%R&Rt is_runningtTruet is_enabledR"(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyR"ms cCsH|dkrtS|jjs(t}n|jj}|jj|S(NR8(RARRBRCR(RR(R R?R)((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyR(xs   cCs{|dkrtS|jjr8|j}|s8tSny|jjWn%tk rp}tjd|tSX|jS(NR8sFailed to reload Tuned: %s( RARRBR(treload_profile_configRR terrorR"(R R?tstop_okte((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytreloads  cCs |jj}d}t}t}zy3|rC|jjdtn|jj||Wnqtjjk r}t}t |}|r|jj j |krt j d|t}qt j d|nXWd|r|rt jd|n|st jdn|jjnX||fS(NtOKtprofile_switchs@Failed to reapply profile '%s'. Did it change on disk and break?sFailed to apply profile '%s's>Applying previously applied (possibly out-dated) profile '%s'.s$Applying previously applied profile.(RRBRCRAR(t set_profileR2t exceptionsRtstrtprofiletnameR RFtwarnR!R"(R R.tmanualt was_runningtmsgtsuccesstreapplyRH((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt_switch_profiles.  s(bs)cCs&|dkrtdfS|j|tS(NR8t Unauthorized(RARWRC(R R.R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytswitch_profiles  cCs2|dkrtdfS|j}|j|tS(NR8RX(RAtrecommend_profileRW(R R?R.((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt auto_profiles   cCs7|dkrdS|jjdk r/|jjjSdSdS(NR8(RROR;RP(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytactive_profiles   s(ss)cCs|dkrdS|jj}|dkry4|jj\}}|dkr[|dk }nWqtk r}d}t|}||fSXn|rtjntj }|dfS(NR8tunknownRX(sunknowns Unauthorized( RRRR;Rtget_active_profileRRNR$tACTIVE_PROFILE_MANUALtACTIVE_PROFILE_AUTO(R R?RRRORHtmodeRF((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt profile_modes     cCs^|dkrtS|jjr/|jjn|jjrZ|jjdtdtntS(NR8tsave_instantly(RARRBR(RDRLR;RC(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytdisables cCs|dkrtS|jjS(NR8(RARRB(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyRBs tascCs#|dkrgS|jjjjS(NR8(Rtprofile_loadertprofile_locatortget_known_names(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytprofiless sa(ss)cCs#|dkrgS|jjjjS(NR8(RRfRgtget_known_names_summary(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt profiles2s s(bsss)cCsw|dkrttdddS|dks7|dkrF|j}nt|jjjj|tj tj gdgS(NR8( ttupleRAR;R\RRfRgtget_profile_attrsR$tPROFILE_ATTR_SUMMARYtPROFILE_ATTR_DESCRIPTION(R R.R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyt profile_infos  cCs9|dkrdStjd|jjtjtj S(NR8t hardcoded(Rt recommendRR#R$tCFG_RECOMMEND_COMMANDtCFG_DEF_RECOMMEND_COMMAND(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyRZs cCs#|dkrtS|jjdtS(NR8tignore_missing(RARtverify_profile(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pyRvs cCs#|dkrtS|jjdtS(NR8Ru(RARRvRC(R R?((s;/usr/lib/python2.7/site-packages/tuned/daemon/controller.pytverify_profile_ignore_missings s a{sa{ss}}cCs|dkrtSi}x|jjD]s}|jjddjddd}|j}i||s    PK[}"site-packages/tuned/exceptions.pycnu[ \c@sMddlZddlZddlZejjZdefdYZdS(iNtTunedExceptioncBs#eZdZddZdZRS(s cCs9|dkrt}n|jt||j|dS(N(tNonetexception_loggerterrortstrt _log_trace(tselftlogger((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pytlog s  cCsftj\}}}||kr1|jdn1djtj|||j}|j|dS(Ns"stack trace is no longer availablet(tsystexc_infotdebugtjoint tracebacktformat_exceptiontrstrip(RRtexc_typet exc_valuet exc_tracebacktexception_info((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pyRs  $N(t__name__t __module__t__doc__RRR(((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pyRs ( t tuned.logsttunedR RtlogstgetRt ExceptionR(((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pyts   PK[W5 -- site-packages/tuned/__init__.pyonu[ \c@sdZdZdZdS(s!Copyright 2008-2013 Red Hat, Inc.sGPLv2+s(power-management@lists.fedoraproject.orgN(t __copyright__t __license__t __email__(((s2/usr/lib/python2.7/site-packages/tuned/__init__.pytsPK[uћsite-packages/tuned/consts.pynu[import logging GLOBAL_CONFIG_FILE = "/etc/tuned/tuned-main.conf" ACTIVE_PROFILE_FILE = "/etc/tuned/active_profile" PROFILE_MODE_FILE = "/etc/tuned/profile_mode" PROFILE_FILE = "tuned.conf" RECOMMEND_CONF_FILE = "/etc/tuned/recommend.conf" DAEMONIZE_PARENT_TIMEOUT = 5 NAMESPACE = "com.redhat.tuned" DBUS_BUS = NAMESPACE DBUS_INTERFACE = "com.redhat.tuned.control" DBUS_OBJECT = "/Tuned" DEFAULT_PROFILE = "balanced" DEFAULT_STORAGE_FILE = "/run/tuned/save.pickle" LOAD_DIRECTORIES = ["/usr/lib/tuned", "/etc/tuned"] PERSISTENT_STORAGE_DIR = "/var/lib/tuned" PLUGIN_MAIN_UNIT_NAME = "main" RECOMMEND_DIRECTORIES = ["/usr/lib/tuned/recommend.d", "/etc/tuned/recommend.d"] TMP_FILE_SUFFIX = ".tmp" # max. number of consecutive errors to give up ERROR_THRESHOLD = 3 # bootloader plugin configuration BOOT_DIR = "/boot" GRUB2_CFG_FILES = ["/etc/grub2.cfg", "/etc/grub2-efi.cfg"] GRUB2_CFG_DIR = "/etc/grub.d" GRUB2_TUNED_TEMPLATE_NAME = "00_tuned" GRUB2_TUNED_TEMPLATE_PATH = GRUB2_CFG_DIR + "/" + GRUB2_TUNED_TEMPLATE_NAME GRUB2_TEMPLATE_HEADER_BEGIN = "### BEGIN /etc/grub.d/" + GRUB2_TUNED_TEMPLATE_NAME + " ###" GRUB2_TEMPLATE_HEADER_END = "### END /etc/grub.d/" + GRUB2_TUNED_TEMPLATE_NAME + " ###" GRUB2_TUNED_VAR = "tuned_params" GRUB2_TUNED_INITRD_VAR = "tuned_initrd" GRUB2_DEFAULT_ENV_FILE = "/etc/default/grub" INITRD_IMAGE_DIR = "/boot" BOOT_CMDLINE_TUNED_VAR = "TUNED_BOOT_CMDLINE" BOOT_CMDLINE_INITRD_ADD_VAR = "TUNED_BOOT_INITRD_ADD" BOOT_CMDLINE_FILE = "/etc/tuned/bootcmdline" PETITBOOT_DETECT_DIR = "/sys/firmware/opal" MACHINE_ID_FILE = "/etc/machine-id" KERNEL_UPDATE_HOOK_FILE = "/usr/lib/kernel/install.d/92-tuned.install" BLS_ENTRIES_PATH = "/boot/loader/entries" # modules plugin configuration MODULES_FILE = "/etc/modprobe.d/tuned.conf" # systemd plugin configuration SYSTEMD_SYSTEM_CONF_FILE = "/etc/systemd/system.conf" SYSTEMD_CPUAFFINITY_VAR = "CPUAffinity" # number of backups LOG_FILE_COUNT = 2 LOG_FILE_MAXBYTES = 100*1000 LOG_FILE = "/var/log/tuned/tuned.log" PID_FILE = "/run/tuned/tuned.pid" SYSTEM_RELEASE_FILE = "/etc/system-release-cpe" # prefix for functions plugins FUNCTION_PREFIX = "function_" # prefix for exported environment variables when calling scripts ENV_PREFIX = "TUNED_" # tuned-gui PREFIX_PROFILE_FACTORY = "System" PREFIX_PROFILE_USER = "User" CFG_DAEMON = "daemon" CFG_DYNAMIC_TUNING = "dynamic_tuning" CFG_SLEEP_INTERVAL = "sleep_interval" CFG_UPDATE_INTERVAL = "update_interval" CFG_RECOMMEND_COMMAND = "recommend_command" CFG_REAPPLY_SYSCTL = "reapply_sysctl" CFG_DEFAULT_INSTANCE_PRIORITY = "default_instance_priority" CFG_UDEV_BUFFER_SIZE = "udev_buffer_size" # no_daemon mode CFG_DEF_DAEMON = True # default configuration CFG_DEF_DYNAMIC_TUNING = True # how long to sleep before checking for events (in seconds) CFG_DEF_SLEEP_INTERVAL = 1 # update interval for dynamic tuning (in seconds) CFG_DEF_UPDATE_INTERVAL = 10 # recommend command availability CFG_DEF_RECOMMEND_COMMAND = True # reapply system sysctl CFG_DEF_REAPPLY_SYSCTL = True # default instance priority CFG_DEF_DEFAULT_INSTANCE_PRIORITY = 0 # default pyudev.Monitor buffer size CFG_DEF_UDEV_BUFFER_SIZE = 1024 * 1024 PATH_CPU_DMA_LATENCY = "/dev/cpu_dma_latency" # profile attributes which can be specified in the main section PROFILE_ATTR_SUMMARY = "summary" PROFILE_ATTR_DESCRIPTION = "description" DBUS_SIGNAL_PROFILE_CHANGED = "profile_changed" STR_HINT_REBOOT = "you need to reboot for changes to take effect" STR_VERIFY_PROFILE_DEVICE_VALUE_OK = "verify: passed: device %s: '%s' = '%s'" STR_VERIFY_PROFILE_VALUE_OK = "verify: passed: '%s' = '%s'" STR_VERIFY_PROFILE_OK = "verify: passed: '%s'" STR_VERIFY_PROFILE_DEVICE_VALUE_MISSING = "verify: skipped, missing: device %s: '%s'" STR_VERIFY_PROFILE_VALUE_MISSING = "verify: skipped, missing: '%s'" STR_VERIFY_PROFILE_DEVICE_VALUE_FAIL = "verify: failed: device %s: '%s' = '%s', expected '%s'" STR_VERIFY_PROFILE_VALUE_FAIL = "verify: failed: '%s' = '%s', expected '%s'" STR_VERIFY_PROFILE_FAIL = "verify: failed: '%s'" # timout for tuned-adm operations in seconds ADMIN_TIMEOUT = 600 # Strings for /etc/tuned/profile_mode specifying if the active profile # was set automatically or manually ACTIVE_PROFILE_AUTO = "auto" ACTIVE_PROFILE_MANUAL = "manual" LOG_LEVEL_CONSOLE = 60 LOG_LEVEL_CONSOLE_NAME = "CONSOLE" CAPTURE_LOG_LEVEL = "console" CAPTURE_LOG_LEVELS = { "debug": logging.DEBUG, "info": logging.INFO, "warn": logging.WARN, "error": logging.ERROR, "console": LOG_LEVEL_CONSOLE, "none": None, } PK[HQii(site-packages/tuned/storage/__init__.pycnu[ \c@s4ddlmZddlmZddlmZdS(i(tStorage(tFactory(tPickleProviderN(ttuned.storage.storageRttuned.storage.factoryRttuned.storage.pickle_providerR(((s:/usr/lib/python2.7/site-packages/tuned/storage/__init__.pytsPK[f-t t /site-packages/tuned/storage/pickle_provider.pyonu[ \c@soddlmZddlZddlZddlZddljZejj Z dej fdYZ dS(i(t interfacesiNtPickleProvidercBsYeZddgZd dZdZd dZdZdZdZ dZ RS( t_patht_datacCs.|dkrtj}n||_i|_dS(N(tNonetconststDEFAULT_STORAGE_FILERR(tselftpath((sA/usr/lib/python2.7/site-packages/tuned/storage/pickle_provider.pyt__init__ s   cCs(|jj|i||j||s    PK[_Yn'site-packages/tuned/storage/storage.pyonu[ \c@sdefdYZdS(tStoragecBs;eZddgZdZdZddZdZRS(t_storage_providert _namespacecCs||_||_dS(N(RR(tselftstorage_providert namespace((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyt__init__s cCs|jj|j||dS(N(RtsetR(Rtoptiontvalue((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyRscCs|jj|j||S(N(RtgetR(RRtdefault((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyR scCs|jj|j|dS(N(RtunsetR(RR((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyR sN(t__name__t __module__t __slots__RRtNoneR R (((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyRs     N(tobjectR(((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pytsPK[jz&site-packages/tuned/storage/storage.pynu[class Storage(object): __slots__ = ["_storage_provider", "_namespace"] def __init__(self, storage_provider, namespace): self._storage_provider = storage_provider self._namespace = namespace def set(self, option, value): self._storage_provider.set(self._namespace, option, value) def get(self, option, default=None): return self._storage_provider.get(self._namespace, option, default) def unset(self, option): self._storage_provider.unset(self._namespace, option) PK[YNsPK[ż'site-packages/tuned/storage/__init__.pynu[from tuned.storage.storage import Storage from tuned.storage.factory import Factory from tuned.storage.pickle_provider import PickleProvider PK[_Yn'site-packages/tuned/storage/storage.pycnu[ \c@sdefdYZdS(tStoragecBs;eZddgZdZdZddZdZRS(t_storage_providert _namespacecCs||_||_dS(N(RR(tselftstorage_providert namespace((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyt__init__s cCs|jj|j||dS(N(RtsetR(Rtoptiontvalue((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyRscCs|jj|j||S(N(RtgetR(RRtdefault((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyR scCs|jj|j|dS(N(RtunsetR(RR((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyR sN(t__name__t __module__t __slots__RRtNoneR R (((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pyRs     N(tobjectR(((s9/usr/lib/python2.7/site-packages/tuned/storage/storage.pytsPK[tE 55'site-packages/tuned/storage/factory.pyonu[ \c@s=ddlmZddlmZdejfdYZdS(i(t interfaces(tstoragetFactorycBs2eZdgZdZedZdZRS(t_storage_providercCs ||_dS(N(R(tselftstorage_provider((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pyt__init__scCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pytprovider scCstj|j|S(N(RtStorageR(Rt namespace((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pytcreates(t__name__t __module__t __slots__RtpropertyRR (((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pyRs  N(tRRR(((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pytsPK[HQii(site-packages/tuned/storage/__init__.pyonu[ \c@s4ddlmZddlmZddlmZdS(i(tStorage(tFactory(tPickleProviderN(ttuned.storage.storageRttuned.storage.factoryRttuned.storage.pickle_providerR(((s:/usr/lib/python2.7/site-packages/tuned/storage/__init__.pytsPK[f-t t /site-packages/tuned/storage/pickle_provider.pycnu[ \c@soddlmZddlZddlZddlZddljZejj Z dej fdYZ dS(i(t interfacesiNtPickleProvidercBsYeZddgZd dZdZd dZdZdZdZ dZ RS( t_patht_datacCs.|dkrtj}n||_i|_dS(N(tNonetconststDEFAULT_STORAGE_FILERR(tselftpath((sA/usr/lib/python2.7/site-packages/tuned/storage/pickle_provider.pyt__init__ s   cCs(|jj|i||j||s    PK[.)site-packages/tuned/storage/interfaces.pynu[class Factory(object): def create(self, namespace): raise NotImplementedError() class Provider(object): def set(self, namespace, option, value): raise NotImplementedError() def get(self, namespace, option, default=None): raise NotImplementedError() def unset(self, namespace, option): raise NotImplementedError() def clear(self): raise NotImplementedError() def load(self): raise NotImplementedError() def save(self): raise NotImplementedError() PK[y.site-packages/tuned/storage/pickle_provider.pynu[from . import interfaces import tuned.logs import pickle import os import tuned.consts as consts log = tuned.logs.get() class PickleProvider(interfaces.Provider): __slots__ = ["_path", "_data"] def __init__(self, path=None): if path is None: path = consts.DEFAULT_STORAGE_FILE self._path = path self._data = {} def set(self, namespace, option, value): self._data.setdefault(namespace, {}) self._data[namespace][option] = value def get(self, namespace, option, default=None): self._data.setdefault(namespace, {}) return self._data[namespace].get(option, default) def unset(self, namespace, option): self._data.setdefault(namespace, {}) if option in self._data[namespace]: del self._data[namespace][option] def save(self): try: log.debug("Saving %s" % str(self._data)) with open(self._path, "wb") as f: pickle.dump(self._data, f) except (OSError, IOError) as e: log.error("Error saving storage file '%s': %s" % (self._path, e)) def load(self): try: with open(self._path, "rb") as f: self._data = pickle.load(f) except (OSError, IOError) as e: log.debug("Error loading storage file '%s': %s" % (self._path, e)) self._data = {} except EOFError: self._data = {} def clear(self): self._data.clear() try: os.unlink(self._path) except (OSError, IOError) as e: log.debug("Error removing storage file '%s': %s" % (self._path, e)) PK[Yff&site-packages/tuned/storage/factory.pynu[from . import interfaces from . import storage class Factory(interfaces.Factory): __slots__ = ["_storage_provider"] def __init__(self, storage_provider): self._storage_provider = storage_provider @property def provider(self): return self._storage_provider def create(self, namespace): return storage.Storage(self._storage_provider, namespace) PK[tE 55'site-packages/tuned/storage/factory.pycnu[ \c@s=ddlmZddlmZdejfdYZdS(i(t interfaces(tstoragetFactorycBs2eZdgZdZedZdZRS(t_storage_providercCs ||_dS(N(R(tselftstorage_provider((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pyt__init__scCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pytprovider scCstj|j|S(N(RtStorageR(Rt namespace((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pytcreates(t__name__t __module__t __slots__RtpropertyRR (((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pyRs  N(tRRR(((s9/usr/lib/python2.7/site-packages/tuned/storage/factory.pytsPK[YNsPK[ Q]])site-packages/tuned/hardware/inventory.pynu[import pyudev import tuned.logs from tuned import consts __all__ = ["Inventory"] log = tuned.logs.get() class Inventory(object): """ Inventory object can handle information about available hardware devices. It also informs the plugins about related hardware events. """ def __init__(self, udev_context=None, udev_monitor_cls=None, monitor_observer_factory=None, buffer_size=None, set_receive_buffer_size=True): if udev_context is not None: self._udev_context = udev_context else: self._udev_context = pyudev.Context() if udev_monitor_cls is None: udev_monitor_cls = pyudev.Monitor self._udev_monitor = udev_monitor_cls.from_netlink(self._udev_context) if buffer_size is None: buffer_size = consts.CFG_DEF_UDEV_BUFFER_SIZE if (set_receive_buffer_size): self._udev_monitor.set_receive_buffer_size(buffer_size) if monitor_observer_factory is None: monitor_observer_factory = _MonitorObserverFactory() self._monitor_observer_factory = monitor_observer_factory self._monitor_observer = None self._subscriptions = {} def get_device(self, subsystem, sys_name): """Get a pyudev.Device object for the sys_name (e.g. 'sda').""" try: return pyudev.Devices.from_name(self._udev_context, subsystem, sys_name) # workaround for pyudev < 0.18 except AttributeError: return pyudev.Device.from_name(self._udev_context, subsystem, sys_name) def get_devices(self, subsystem): """Get list of devices on a given subsystem.""" return self._udev_context.list_devices(subsystem=subsystem) def _handle_udev_event(self, event, device): if not device.subsystem in self._subscriptions: return for (plugin, callback) in self._subscriptions[device.subsystem]: try: callback(event, device) except Exception as e: log.error("Exception occured in event handler of '%s'." % plugin) log.exception(e) def subscribe(self, plugin, subsystem, callback): """Register handler of device events on a given subsystem.""" log.debug("adding handler: %s (%s)" % (subsystem, plugin)) callback_data = (plugin, callback) if subsystem in self._subscriptions: self._subscriptions[subsystem].append(callback_data) else: self._subscriptions[subsystem] = [callback_data, ] self._udev_monitor.filter_by(subsystem) # After start(), HW events begin to get queued up self._udev_monitor.start() def start_processing_events(self): if self._monitor_observer is None: log.debug("starting monitor observer") self._monitor_observer = self._monitor_observer_factory.create(self._udev_monitor, self._handle_udev_event) self._monitor_observer.start() def stop_processing_events(self): if self._monitor_observer is not None: log.debug("stopping monitor observer") self._monitor_observer.stop() self._monitor_observer = None def _unsubscribe_subsystem(self, plugin, subsystem): for callback_data in self._subscriptions[subsystem]: (_plugin, callback) = callback_data if plugin == _plugin: log.debug("removing handler: %s (%s)" % (subsystem, plugin)) self._subscriptions[subsystem].remove(callback_data) def unsubscribe(self, plugin, subsystem=None): """Unregister handler registered with subscribe method.""" empty_subsystems = [] for _subsystem in self._subscriptions: if subsystem is None or _subsystem == subsystem: self._unsubscribe_subsystem(plugin, _subsystem) if len(self._subscriptions[_subsystem]) == 0: empty_subsystems.append(_subsystem) for _subsystem in empty_subsystems: del self._subscriptions[_subsystem] class _MonitorObserverFactory(object): def create(self, *args, **kwargs): return pyudev.MonitorObserver(*args, **kwargs) PK[$%͙)site-packages/tuned/hardware/__init__.pycnu[ \c@s"ddlTddlTddlTdS(i(t*N(t inventorytdevice_matchertdevice_matcher_udev(((s;/usr/lib/python2.7/site-packages/tuned/hardware/__init__.pyts  PK[rŋ<<4site-packages/tuned/hardware/device_matcher_udev.pycnu[ \c@sBddlmZddlZdgZdejfdYZdS(i(tdevice_matcheriNtDeviceMatcherUdevcBseZdZRS(cCsd}y|jj}Wntk r8|j}nXx0t|D]"\}}||d|d7}qFWtj||tjdk S(sc Match a device against the udev regex in tuning profiles. device is a pyudev.Device object tt=s N(t propertiestitemstAttributeErrortlisttretsearcht MULTILINEtNone(tselftregextdeviceRRtkeytval((sF/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher_udev.pytmatchs (t__name__t __module__R(((sF/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher_udev.pyRs(RRRt__all__t DeviceMatcherR(((sF/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher_udev.pyts  PK[(9qq/site-packages/tuned/hardware/device_matcher.pyonu[ \c@s;ddlZddlZdgZdefdYZdS(iNt DeviceMatchercBs eZdZdZdZRS(s, Device name matching against the devices specification in tuning profiles. The devices specification consists of multiple rules separated by spaces. The rules have a syntax of shell-style wildcards and are either positive or negative. The negative rules are prefixed with an exclamation mark. cCst|tr$tjd|}ng|D]/}|jd r+|jdk r+|^q+}g|D]}||krg|d^qg}t|dkr|jdnt}x*|D]"}t j ||rt }PqqWx*|D]"}t j ||rt}PqqW|S(s Match a device against the specification in the profile. If there is no positive rule in the specification, implicit rule which matches all devices is added. The device matches if and only if it matches some positive rule, but no negative rule. s\s|,\s*t!tiit*( t isinstancetstrtretsplitt startswithtstriptlentappendtFalsetfnmatchtTrue(tselftrulest device_nametruletpositive_rulestnegative_rulestmatches((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pytmatchs <)  cCs=g}x0|D](}|j||r |j|q q W|S(s Match a device list against the specification in the profile. Returns the list, which is a subset of devices which match. (RR (RRt device_listtmatching_devicestdevice((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pyt match_list,s  (t__name__t __module__t__doc__RR(((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pyRs (R Rt__all__tobjectR(((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pyts   PK[qZZ(site-packages/tuned/hardware/__init__.pynu[from .inventory import * from .device_matcher import * from .device_matcher_udev import * PK[rŋ<<4site-packages/tuned/hardware/device_matcher_udev.pyonu[ \c@sBddlmZddlZdgZdejfdYZdS(i(tdevice_matcheriNtDeviceMatcherUdevcBseZdZRS(cCsd}y|jj}Wntk r8|j}nXx0t|D]"\}}||d|d7}qFWtj||tjdk S(sc Match a device against the udev regex in tuning profiles. device is a pyudev.Device object tt=s N(t propertiestitemstAttributeErrortlisttretsearcht MULTILINEtNone(tselftregextdeviceRRtkeytval((sF/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher_udev.pytmatchs (t__name__t __module__R(((sF/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher_udev.pyRs(RRRt__all__t DeviceMatcherR(((sF/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher_udev.pyts  PK[A  *site-packages/tuned/hardware/inventory.pyonu[ \c@spddlZddlZddlmZdgZejjZdefdYZ defdYZ dS(iN(tconstst InventorycBsqeZdZd d d d edZdZdZdZdZ dZ dZ dZ d d Z RS( s Inventory object can handle information about available hardware devices. It also informs the plugins about related hardware events. cCs|dk r||_ntj|_|dkr?tj}n|j|j|_|dkrltj}n|r|jj |n|dkrt }n||_ d|_ i|_ dS(N(tNonet _udev_contexttpyudevtContexttMonitort from_netlinkt _udev_monitorRtCFG_DEF_UDEV_BUFFER_SIZEtset_receive_buffer_sizet_MonitorObserverFactoryt_monitor_observer_factoryt_monitor_observert_subscriptions(tselft udev_contexttudev_monitor_clstmonitor_observer_factoryt buffer_sizeR ((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt__init__s          cCsKytjj|j||SWn'tk rFtjj|j||SXdS(s9Get a pyudev.Device object for the sys_name (e.g. 'sda').N(RtDevicest from_nameRtAttributeErrortDevice(Rt subsystemtsys_name((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt get_device%s cCs|jjd|S(s)Get list of devices on a given subsystem.R(Rt list_devices(RR((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt get_devices-scCs|j|jkrdSxc|j|jD]Q\}}y|||Wq'tk rw}tjd|tj|q'Xq'WdS(Ns+Exception occured in event handler of '%s'.(RRt Exceptiontlogterrort exception(Rteventtdevicetplugintcallbackte((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt_handle_udev_event1scCsztjd||f||f}||jkrI|j|j|n-|g|j|<|jj||jjdS(s7Register handler of device events on a given subsystem.sadding handler: %s (%s)N(RtdebugRtappendRt filter_bytstart(RR$RR%t callback_data((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt subscribe<s cCsN|jdkrJtjd|jj|j|j|_|jjndS(Nsstarting monitor observer( R RRR(R tcreateRR'R+(R((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pytstart_processing_eventsHs cCs9|jdk r5tjd|jjd|_ndS(Nsstopping monitor observer(R RRR(tstop(R((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pytstop_processing_eventsNs  cCsbx[|j|D]L}|\}}||krtjd||f|j|j|qqWdS(Nsremoving handler: %s (%s)(RRR(tremove(RR$RR,t_pluginR%((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt_unsubscribe_subsystemTs   cCsg}xe|jD]Z}|dks.||kr|j||t|j|dkrj|j|qjqqWx|D]}|j|=quWdS(s4Unregister handler registered with subscribe method.iN(RRR4tlenR)(RR$Rtempty_subsystemst _subsystem((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt unsubscribe[s N(t__name__t __module__t__doc__RtTrueRRRR'R-R/R1R4R8(((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyR s     R cBseZdZRS(cOstj||S(N(RtMonitorObserver(Rtargstkwargs((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyR.hs(R9R:R.(((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyR gs( Rt tuned.logsttunedRt__all__tlogstgetRtobjectRR (((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyts   ^PK[A  *site-packages/tuned/hardware/inventory.pycnu[ \c@spddlZddlZddlmZdgZejjZdefdYZ defdYZ dS(iN(tconstst InventorycBsqeZdZd d d d edZdZdZdZdZ dZ dZ dZ d d Z RS( s Inventory object can handle information about available hardware devices. It also informs the plugins about related hardware events. cCs|dk r||_ntj|_|dkr?tj}n|j|j|_|dkrltj}n|r|jj |n|dkrt }n||_ d|_ i|_ dS(N(tNonet _udev_contexttpyudevtContexttMonitort from_netlinkt _udev_monitorRtCFG_DEF_UDEV_BUFFER_SIZEtset_receive_buffer_sizet_MonitorObserverFactoryt_monitor_observer_factoryt_monitor_observert_subscriptions(tselft udev_contexttudev_monitor_clstmonitor_observer_factoryt buffer_sizeR ((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt__init__s          cCsKytjj|j||SWn'tk rFtjj|j||SXdS(s9Get a pyudev.Device object for the sys_name (e.g. 'sda').N(RtDevicest from_nameRtAttributeErrortDevice(Rt subsystemtsys_name((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt get_device%s cCs|jjd|S(s)Get list of devices on a given subsystem.R(Rt list_devices(RR((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt get_devices-scCs|j|jkrdSxc|j|jD]Q\}}y|||Wq'tk rw}tjd|tj|q'Xq'WdS(Ns+Exception occured in event handler of '%s'.(RRt Exceptiontlogterrort exception(Rteventtdevicetplugintcallbackte((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt_handle_udev_event1scCsztjd||f||f}||jkrI|j|j|n-|g|j|<|jj||jjdS(s7Register handler of device events on a given subsystem.sadding handler: %s (%s)N(RtdebugRtappendRt filter_bytstart(RR$RR%t callback_data((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt subscribe<s cCsN|jdkrJtjd|jj|j|j|_|jjndS(Nsstarting monitor observer( R RRR(R tcreateRR'R+(R((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pytstart_processing_eventsHs cCs9|jdk r5tjd|jjd|_ndS(Nsstopping monitor observer(R RRR(tstop(R((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pytstop_processing_eventsNs  cCsbx[|j|D]L}|\}}||krtjd||f|j|j|qqWdS(Nsremoving handler: %s (%s)(RRR(tremove(RR$RR,t_pluginR%((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt_unsubscribe_subsystemTs   cCsg}xe|jD]Z}|dks.||kr|j||t|j|dkrj|j|qjqqWx|D]}|j|=quWdS(s4Unregister handler registered with subscribe method.iN(RRR4tlenR)(RR$Rtempty_subsystemst _subsystem((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyt unsubscribe[s N(t__name__t __module__t__doc__RtTrueRRRR'R-R/R1R4R8(((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyR s     R cBseZdZRS(cOstj||S(N(RtMonitorObserver(Rtargstkwargs((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyR.hs(R9R:R.(((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyR gs( Rt tuned.logsttunedRt__all__tlogstgetRtobjectRR (((s</usr/lib/python2.7/site-packages/tuned/hardware/inventory.pyts   ^PK[$%͙)site-packages/tuned/hardware/__init__.pyonu[ \c@s"ddlTddlTddlTdS(i(t*N(t inventorytdevice_matchertdevice_matcher_udev(((s;/usr/lib/python2.7/site-packages/tuned/hardware/__init__.pyts  PK[(9qq/site-packages/tuned/hardware/device_matcher.pycnu[ \c@s;ddlZddlZdgZdefdYZdS(iNt DeviceMatchercBs eZdZdZdZRS(s, Device name matching against the devices specification in tuning profiles. The devices specification consists of multiple rules separated by spaces. The rules have a syntax of shell-style wildcards and are either positive or negative. The negative rules are prefixed with an exclamation mark. cCst|tr$tjd|}ng|D]/}|jd r+|jdk r+|^q+}g|D]}||krg|d^qg}t|dkr|jdnt}x*|D]"}t j ||rt }PqqWx*|D]"}t j ||rt}PqqW|S(s Match a device against the specification in the profile. If there is no positive rule in the specification, implicit rule which matches all devices is added. The device matches if and only if it matches some positive rule, but no negative rule. s\s|,\s*t!tiit*( t isinstancetstrtretsplitt startswithtstriptlentappendtFalsetfnmatchtTrue(tselftrulest device_nametruletpositive_rulestnegative_rulestmatches((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pytmatchs <)  cCs=g}x0|D](}|j||r |j|q q W|S(s Match a device list against the specification in the profile. Returns the list, which is a subset of devices which match. (RR (RRt device_listtmatching_devicestdevice((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pyt match_list,s  (t__name__t __module__t__doc__RR(((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pyRs (R Rt__all__tobjectR(((sA/usr/lib/python2.7/site-packages/tuned/hardware/device_matcher.pyts   PK[ϫ((.site-packages/tuned/hardware/device_matcher.pynu[import fnmatch import re __all__ = ["DeviceMatcher"] class DeviceMatcher(object): """ Device name matching against the devices specification in tuning profiles. The devices specification consists of multiple rules separated by spaces. The rules have a syntax of shell-style wildcards and are either positive or negative. The negative rules are prefixed with an exclamation mark. """ def match(self, rules, device_name): """ Match a device against the specification in the profile. If there is no positive rule in the specification, implicit rule which matches all devices is added. The device matches if and only if it matches some positive rule, but no negative rule. """ if isinstance(rules, str): rules = re.split(r"\s|,\s*", rules) positive_rules = [rule for rule in rules if not rule.startswith("!") and not rule.strip() == ''] negative_rules = [rule[1:] for rule in rules if rule not in positive_rules] if len(positive_rules) == 0: positive_rules.append("*") matches = False for rule in positive_rules: if fnmatch.fnmatch(device_name, rule): matches = True break for rule in negative_rules: if fnmatch.fnmatch(device_name, rule): matches = False break return matches def match_list(self, rules, device_list): """ Match a device list against the specification in the profile. Returns the list, which is a subset of devices which match. """ matching_devices = [] for device in device_list: if self.match(rules, device): matching_devices.append(device) return matching_devices PK[$  3site-packages/tuned/hardware/device_matcher_udev.pynu[from . import device_matcher import re __all__ = ["DeviceMatcherUdev"] class DeviceMatcherUdev(device_matcher.DeviceMatcher): def match(self, regex, device): """ Match a device against the udev regex in tuning profiles. device is a pyudev.Device object """ properties = '' try: items = device.properties.items() except AttributeError: items = device.items() for key, val in list(items): properties += key + '=' + val + '\n' return re.search(regex, properties, re.MULTILINE) is not None PK[}"site-packages/tuned/exceptions.pyonu[ \c@sMddlZddlZddlZejjZdefdYZdS(iNtTunedExceptioncBs#eZdZddZdZRS(s cCs9|dkrt}n|jt||j|dS(N(tNonetexception_loggerterrortstrt _log_trace(tselftlogger((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pytlog s  cCsftj\}}}||kr1|jdn1djtj|||j}|j|dS(Ns"stack trace is no longer availablet(tsystexc_infotdebugtjoint tracebacktformat_exceptiontrstrip(RRtexc_typet exc_valuet exc_tracebacktexception_info((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pyRs  $N(t__name__t __module__t__doc__RRR(((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pyRs ( t tuned.logsttunedR RtlogstgetRt ExceptionR(((s4/usr/lib/python2.7/site-packages/tuned/exceptions.pyts   PK[Q*==*site-packages/tuned/plugins/plugin_cpu.pyonu[ \c@sddlmZddlTddlZddlmZddljZddl Z ddl Z ddl Z ddl Z ddl Z ejjZdejfdYZdS(i(tbase(t*iN(tcommandstCPULatencyPlugincBseZdZdZdZdZedZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZedZdZdZdZdZdZeddedZededZddZ eddeddd Z!eded!Z"d"Z#ed#ded$Z$d%Z%d&Z&d'Z'ed#ed(Z(RS()sP Plugin for tuning CPU options. Powersaving, governor, required latency, etc. cOstt|j||t|_d|_t|_t|_t|_ t|_ t|_ d|_ d|_d|_i|_t|_dS(Ntx86_64(tsuperRt__init__tTruet _has_pm_qost_archtFalset_is_x86t _is_intelt_is_amdt_has_energy_perf_biast_has_intel_pstatetNonet_min_perf_pct_savet_max_perf_pct_savet_no_turbo_savet_governors_mapRt_cmd(tselftargstkwargs((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs           cCsUt|_t|_x-|jjdD]}|jj|jq(Wt|_dS(Ntcpu( Rt_devices_supportedtsett _free_devicest_hardware_inventoryt get_devicestaddtsys_namet_assigned_devices(Rtdevice((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _init_devices(s   cCs&g|D]}|jjd|^qS(NR(Rt get_device(Rtdevicestx((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_device_objects1scCsJi dd6dd6dd6dd6dd6dd 6dd 6dd 6dd 6dd 6S(Ng?tload_thresholdidt latency_lowit latency_hight force_latencytgovernortsampling_down_factortenergy_perf_biast min_perf_pctt max_perf_pcttno_turbo(R(R((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_config_options4scCsdddddg}tj|_|j|krtj}|jjd}|dkrit|_n-|dks|d krt|_ n t|_t j d |nt j d |j|jtkr|j |j ndS( NRti686ti585ti486ti386t vendor_idt GenuineIntelt AuthenticAMDt HygonGenuines$We are running on an x86 %s platformsWe are running on %s (non x86)(tplatformtmachineR tprocfstcpuinfottagstgetRR R tlogtinfot_check_energy_perf_biast_check_intel_pstate(Rt intel_archsRtvendor((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _check_archCs      cCst|_d}|jjddgdtj|gd}|dkrRt|_n)|dkrntjdn tjddS(Nitx86_energy_perf_policys-rt no_errorsisgunable to run x86_energy_perf_policy tool, ignoring CPU energy performance bias, is the tool installed?sXyour CPU doesn't support MSR_IA32_ENERGY_PERF_BIAS, ignoring CPU energy performance bias( R RRtexecuteterrnotENOENTRRAtwarning(Rtretcode_unsupportedtretcode((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRC^s +   cCs2tjjd|_|jr.tjdndS(Ns$/sys/devices/system/cpu/intel_pstatesintel_pstate detected(tostpathtexistsRRARB(R((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRDis cCs.t|}|jjt|jddS(NRt(tstrRt is_cpu_onlinetreplace(RR"tsd((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_is_cpu_onlinens cCstjjd|S(Ns3/sys/devices/system/cpu/%s/cpufreq/scaling_governor(RPRQRR(RR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_cpu_has_scaling_governorrscCsL|j|s$tjd|tS|j|sHtjd|tStS(Ns'%s' is not online, skippings.there is no scaling governor fo '%s', skipping(RXRAtdebugR RYR(RR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_check_cpu_can_change_governoruscCst|_t|_t|jjd|krt|_ytj t j tj |_ Wn.tk rtjdt j t|_nXd|_|jddkr|jjdd|_t|_n d|_|jnt|_tjd|jt|jd|_dS(Nis-Unable to open '%s', disabling PM_QoS controlR+tloadsILatency settings from non-first CPU plugin instance '%s' will be ignored.(Rt_has_static_tuningR t_has_dynamic_tuningtlistt _instancestvaluest_first_instanceRPtopentconststPATH_CPU_DMA_LATENCYtO_WRONLYt_cpu_latency_fdtOSErrorRAterrorRRt_latencytoptionst_monitors_repositorytcreatet _load_monitorRGRBtnametassigned_devicest _first_device(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_init~s$          cCsQ|jrM|jr%tj|jn|jdk rM|jj|jqMndS(N( RbRRPtcloseRgRnRRltdelete(RRr((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_cleanups   cCs|jjd|djS(Ns'/sys/devices/system/cpu/intel_pstate/%s(Rt read_fileRtstrip(Rtattr((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_intel_pstate_attrscCs*|dk r&|jjd||ndS(Ns'/sys/devices/system/cpu/intel_pstate/%s(RRt write_to_file(RRytval((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_set_intel_pstate_attrs cCs3|dkrdS|j|}|j|||S(N(RRzR}(RRytvaluetv((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_getset_intel_pstate_attrs  cCstt|j||js#dS|jd}|dk rL|j|n|jr|jd|jd|_ |jd|jd|_ |jd|jd|_ ndS(NR+R/R0R1( RRt_instance_apply_staticRbRkRt _set_latencyRRRRR(RRrtforce_latency_value((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs    cCsktt|j|||jrg|jrg|jd|j|jd|j|jd|jndS(NR/R0R1( RRt_instance_unapply_staticRbRR}RRR(RRrt full_rollback((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs cCs|j||dS(N(t_instance_update_dynamic(RRrR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_apply_dynamicscCsh||jkrdS|jjd}||jdkrP|j|jdn|j|jddS(NtsystemR(R*R)(RqRntget_loadRkR(RRrR"R\((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs cCsdS(N((RRrR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_unapply_dynamicscCsjt|}|jrf|j|krftjd|tjd|}tj|j |||_ndS(Nssetting new cpu latency %dti( tintRRjRARBtstructtpackRPtwriteRg(Rtlatencyt latency_bin((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs  cCs |jjd|jjS(Ns>/sys/devices/system/cpu/%s/cpufreq/scaling_available_governors(RRwRxtsplit(RR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_available_governorssR,t per_devicecCs,|j|sdSt|}|jd}g|D]}|j^q5}x1|D])}t|dkrTtjddSqTW|j|}x|D]m}||kr|stj d||f|j j d||nPq|stj d||fqqWtj ddj|d}|S( Nt|is.The 'governor' option contains an empty value.s!setting governor '%s' on cpu '%s's3/sys/devices/system/cpu/%s/cpufreq/scaling_governors7Ignoring governor '%s' on cpu '%s', it is not supporteds.None of the scaling governors is supported: %ss, (R[RRTRRxtlenRARiRRBRR{RZtwarntjoin(Rt governorsR"tsimR,tavailable_governors((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _set_governors2         cCszd}|j|sdS|jjd|d|j}t|dkrV|}n|dkrvtjd|n|S(Ns3/sys/devices/system/cpu/%s/cpufreq/scaling_governortno_erroris*could not get current governor on cpu '%s'(RR[RRwRxRRARi(RR"tignore_missingR,tdata((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _get_governors"  tondemandcCsd|S(Ns7/sys/devices/system/cpu/cpufreq/%s/sampling_down_factor((RR,((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_sampling_down_factor_path sR-tpriorityi cCs d}||jkr%|jjnd|j|<|j|}|dkrbtjd|dS|t|jjkr||j|<|j|}t j j |stjd||fdSt |}|stj d||f|jj||qn|S(NsIignoring sampling_down_factor setting for CPU '%s', cannot match governorsTignoring sampling_down_factor setting for CPU '%s', governor '%s' doesn't support its6setting sampling_down_factor to '%s' for governor '%s'(RRtclearRRARZR_RaRRPRQRRRTRBRR{(RR-R"RR|R,RQ((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_set_sampling_down_factors&    cCs`|j|d|}|dkr%dS|j|}tjj|sJdS|jj|jS(NR( RRRRPRQRRRRwRx(RR"RR,RQ((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_sampling_down_factor)s cCs=|jjdd|t|gdt\}}}||fS(NRHs-ct return_err(RRJRTR(Rtcpu_idR~ROtoutterr_msg((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_try_set_energy_perf_bias3s  R.c Cs"|j|s$tjd|dS|jr|s|jd}|jd}x|D]}|j}tjd||f|j||\}}|dkrtj d||fPqX|dkrtj d|PqXtjd||fqXWtj d |nt |SdSdS( Ns%s is not online, skippingRRs2Trying to set energy_perf_bias to '%s' on cpu '%s'is5energy_perf_bias successfully set to '%s' on cpu '%s's"Failed to set energy_perf_bias: %ssHCould not set energy_perf_bias to '%s' on cpu '%s', trying another valuesPFailed to set energy_perf_bias on cpu '%s'. Is the value in the profile correct?( RXRARZRRtlstripRRxRRBRiRT( RR.R"RRtvalsR|ROR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_set_energy_perf_bias<s6            cCsYyt|}WnBtk rT}yt|d}WqUtk rP}|}qUXnX|S(Ni(Rt ValueError(RtsRte((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_try_parse_num]scCs.idd6dd6dd6j|j||S(Nt performanceitnormalit powersavei(R@R(RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_energy_perf_policy_to_humanhscCs<idd6dd6dd6dd6d d 6j|j||S( NRisbalance-performanceiRis balance-poweritpoweri(R@R(RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_energy_perf_policy_to_human_v2ls   c Csd}|j|s*tjd|dS|jr|jd}|jjdd|dg\}}|dkrxu|jD]d}|j }t |dkr|j |d}Pqt |d kr|j |d}PqqWqn|S( Ns%s is not online, skippingRRHs-cs-riiii( RRXRARZRRRRJt splitlinesRRRR( RR"RR.RROtlinestlinetl((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_energy_perf_biasts" $  ()t__name__t __module__t__doc__RR#R't classmethodR2RGRCRDRXRYR[RsRvRzR}RRR RRRRRRt command_setRRt command_getRRRRRRRRRR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRsJ                   !  !   (RSRt decoratorst tuned.logsttunedttuned.utils.commandsRt tuned.constsRdRPRRKR;R=tlogsR@RAtPluginR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyts       PK[ɥ77*site-packages/tuned/plugins/plugin_disk.pynu[import errno from . import hotplug from .decorators import * import tuned.logs import tuned.consts as consts from tuned.utils.commands import commands import os import re log = tuned.logs.get() class DiskPlugin(hotplug.Plugin): """ Plugin for tuning options of disks. """ def __init__(self, *args, **kwargs): super(DiskPlugin, self).__init__(*args, **kwargs) self._power_levels = [254, 225, 195, 165, 145, 125, 105, 85, 70, 55, 30, 20] self._spindown_levels = [0, 250, 230, 210, 190, 170, 150, 130, 110, 90, 70, 60] self._levels = len(self._power_levels) self._level_steps = 6 self._load_smallest = 0.01 self._cmd = commands() def _init_devices(self): super(DiskPlugin, self)._init_devices() self._devices_supported = True self._use_hdparm = True self._free_devices = set() self._hdparm_apm_devices = set() for device in self._hardware_inventory.get_devices("block"): if self._device_is_supported(device): self._free_devices.add(device.sys_name) if self._use_hdparm and self._is_hdparm_apm_supported(device.sys_name): self._hdparm_apm_devices.add(device.sys_name) self._assigned_devices = set() def _get_device_objects(self, devices): return [self._hardware_inventory.get_device("block", x) for x in devices] def _is_hdparm_apm_supported(self, device): (rc, out, err_msg) = self._cmd.execute(["hdparm", "-C", "/dev/%s" % device], \ no_errors = [errno.ENOENT], return_err=True) if rc == -errno.ENOENT: log.warn("hdparm command not found, ignoring for other devices") self._use_hdparm = False return False elif rc: log.info("Device '%s' not supported by hdparm" % device) log.debug("(rc: %s, msg: '%s')" % (rc, err_msg)) return False elif "unknown" in out: log.info("Driver for device '%s' does not support apm command" % device) return False return True @classmethod def _device_is_supported(cls, device): return device.device_type == "disk" and \ device.attributes.get("removable", None) == b"0" and \ (device.parent is None or \ device.parent.subsystem in ["scsi", "virtio", "xen", "nvme"]) def _hardware_events_init(self): self._hardware_inventory.subscribe(self, "block", self._hardware_events_callback) def _hardware_events_cleanup(self): self._hardware_inventory.unsubscribe(self) def _hardware_events_callback(self, event, device): if self._device_is_supported(device) or event == "remove": super(DiskPlugin, self)._hardware_events_callback(event, device) def _added_device_apply_tuning(self, instance, device_name): if instance._load_monitor is not None: instance._load_monitor.add_device(device_name) super(DiskPlugin, self)._added_device_apply_tuning(instance, device_name) def _removed_device_unapply_tuning(self, instance, device_name): if instance._load_monitor is not None: instance._load_monitor.remove_device(device_name) super(DiskPlugin, self)._removed_device_unapply_tuning(instance, device_name) @classmethod def _get_config_options(cls): return { "dynamic" : True, # FIXME: do we want this default? "elevator" : None, "apm" : None, "spindown" : None, "readahead" : None, "readahead_multiply" : None, "scheduler_quantum" : None, } @classmethod def _get_config_options_used_by_dynamic(cls): return [ "apm", "spindown", ] def _instance_init(self, instance): instance._has_static_tuning = True self._apm_errcnt = 0 self._spindown_errcnt = 0 if self._option_bool(instance.options["dynamic"]): instance._has_dynamic_tuning = True instance._load_monitor = \ self._monitors_repository.create( "disk", instance.assigned_devices) instance._device_idle = {} instance._stats = {} instance._idle = {} instance._spindown_change_delayed = {} else: instance._has_dynamic_tuning = False instance._load_monitor = None def _instance_cleanup(self, instance): if instance._load_monitor is not None: self._monitors_repository.delete(instance._load_monitor) instance._load_monitor = None def _update_errcnt(self, rc, spindown): if spindown: s = "spindown" cnt = self._spindown_errcnt else: s = "apm" cnt = self._apm_errcnt if cnt >= consts.ERROR_THRESHOLD: return if rc == 0: cnt = 0 elif rc == -errno.ENOENT: self._spindown_errcnt = self._apm_errcnt = consts.ERROR_THRESHOLD + 1 log.warn("hdparm command not found, ignoring future set_apm / set_spindown commands") return else: cnt += 1 if cnt == consts.ERROR_THRESHOLD: log.info("disabling set_%s command: too many consecutive errors" % s) if spindown: self._spindown_errcnt = cnt else: self._apm_errcnt = cnt def _change_spindown(self, instance, device, new_spindown_level): log.debug("changing spindown to %d" % new_spindown_level) (rc, out) = self._cmd.execute(["hdparm", "-S%d" % new_spindown_level, "/dev/%s" % device], no_errors = [errno.ENOENT]) self._update_errcnt(rc, True) instance._spindown_change_delayed[device] = False def _drive_spinning(self, device): (rc, out) = self._cmd.execute(["hdparm", "-C", "/dev/%s" % device], no_errors = [errno.ENOENT]) return not "standby" in out and not "sleeping" in out def _instance_update_dynamic(self, instance, device): if not device in self._hdparm_apm_devices: return load = instance._load_monitor.get_device_load(device) if load is None: return if not device in instance._stats: self._init_stats_and_idle(instance, device) self._update_stats(instance, device, load) self._update_idle(instance, device) stats = instance._stats[device] idle = instance._idle[device] # level change decision if idle["level"] + 1 < self._levels and idle["read"] >= self._level_steps and idle["write"] >= self._level_steps: level_change = 1 elif idle["level"] > 0 and (idle["read"] == 0 or idle["write"] == 0): level_change = -1 else: level_change = 0 # change level if decided if level_change != 0: idle["level"] += level_change new_power_level = self._power_levels[idle["level"]] new_spindown_level = self._spindown_levels[idle["level"]] log.debug("tuning level changed to %d" % idle["level"]) if self._spindown_errcnt < consts.ERROR_THRESHOLD: if not self._drive_spinning(device) and level_change > 0: log.debug("delaying spindown change to %d, drive has already spun down" % new_spindown_level) instance._spindown_change_delayed[device] = True else: self._change_spindown(instance, device, new_spindown_level) if self._apm_errcnt < consts.ERROR_THRESHOLD: log.debug("changing APM_level to %d" % new_power_level) (rc, out) = self._cmd.execute(["hdparm", "-B%d" % new_power_level, "/dev/%s" % device], no_errors = [errno.ENOENT]) self._update_errcnt(rc, False) elif instance._spindown_change_delayed[device] and self._drive_spinning(device): new_spindown_level = self._spindown_levels[idle["level"]] self._change_spindown(instance, device, new_spindown_level) log.debug("%s load: read %0.2f, write %0.2f" % (device, stats["read"], stats["write"])) log.debug("%s idle: read %d, write %d, level %d" % (device, idle["read"], idle["write"], idle["level"])) def _init_stats_and_idle(self, instance, device): instance._stats[device] = { "new": 11 * [0], "old": 11 * [0], "max": 11 * [1] } instance._idle[device] = { "level": 0, "read": 0, "write": 0 } instance._spindown_change_delayed[device] = False def _update_stats(self, instance, device, new_load): instance._stats[device]["old"] = old_load = instance._stats[device]["new"] instance._stats[device]["new"] = new_load # load difference diff = [new_old[0] - new_old[1] for new_old in zip(new_load, old_load)] instance._stats[device]["diff"] = diff # adapt maximum expected load if the difference is higher old_max_load = instance._stats[device]["max"] max_load = [max(pair) for pair in zip(old_max_load, diff)] instance._stats[device]["max"] = max_load # read/write ratio instance._stats[device]["read"] = float(diff[1]) / float(max_load[1]) instance._stats[device]["write"] = float(diff[5]) / float(max_load[5]) def _update_idle(self, instance, device): # increase counter if there is no load, otherwise reset the counter for operation in ["read", "write"]: if instance._stats[device][operation] < self._load_smallest: instance._idle[device][operation] += 1 else: instance._idle[device][operation] = 0 def _instance_apply_dynamic(self, instance, device): # At the moment we support dynamic tuning just for devices compatible with hdparm apm commands # If in future will be added new functionality not connected to this command, # it is needed to change it here if device not in self._hdparm_apm_devices: log.info("There is no dynamic tuning available for device '%s' at time" % device) else: super(DiskPlugin, self)._instance_apply_dynamic(*args, **kwargs) def _instance_unapply_dynamic(self, instance, device): pass def _sysfs_path(self, device, suffix, prefix = "/sys/block/"): if "/" in device: dev = os.path.join(prefix, device.replace("/", "!"), suffix) if os.path.exists(dev): return dev return os.path.join(prefix, device, suffix) def _elevator_file(self, device): return self._sysfs_path(device, "queue/scheduler") @command_set("elevator", per_device=True) def _set_elevator(self, value, device, sim): sys_file = self._elevator_file(device) if not sim: self._cmd.write_to_file(sys_file, value) return value @command_get("elevator") def _get_elevator(self, device, ignore_missing=False): sys_file = self._elevator_file(device) # example of scheduler file content: # noop deadline [cfq] return self._cmd.get_active_option(self._cmd.read_file(sys_file, no_error=ignore_missing)) @command_set("apm", per_device=True) def _set_apm(self, value, device, sim): if device not in self._hdparm_apm_devices: if not sim: log.info("apm option is not supported for device '%s'" % device) return None else: return str(value) if self._apm_errcnt < consts.ERROR_THRESHOLD: if not sim: (rc, out) = self._cmd.execute(["hdparm", "-B", str(value), "/dev/" + device], no_errors = [errno.ENOENT]) self._update_errcnt(rc, False) return str(value) else: return None @command_get("apm") def _get_apm(self, device, ignore_missing=False): if device not in self._hdparm_apm_devices: if not ignore_missing: log.info("apm option is not supported for device '%s'" % device) return None value = None err = False (rc, out) = self._cmd.execute(["hdparm", "-B", "/dev/" + device], no_errors = [errno.ENOENT]) if rc == -errno.ENOENT: return None elif rc != 0: err = True else: m = re.match(r".*=\s*(\d+).*", out, re.S) if m: try: value = int(m.group(1)) except ValueError: err = True if err: log.error("could not get current APM settings for device '%s'" % device) return value @command_set("spindown", per_device=True) def _set_spindown(self, value, device, sim): if device not in self._hdparm_apm_devices: if not sim: log.info("spindown option is not supported for device '%s'" % device) return None else: return str(value) if self._spindown_errcnt < consts.ERROR_THRESHOLD: if not sim: (rc, out) = self._cmd.execute(["hdparm", "-S", str(value), "/dev/" + device], no_errors = [errno.ENOENT]) self._update_errcnt(rc, True) return str(value) else: return None @command_get("spindown") def _get_spindown(self, device, ignore_missing=False): if device not in self._hdparm_apm_devices: if not ignore_missing: log.info("spindown option is not supported for device '%s'" % device) return None # There's no way how to get current/old spindown value, hardcoding vendor specific 253 return 253 def _readahead_file(self, device): return self._sysfs_path(device, "queue/read_ahead_kb") def _parse_ra(self, value): val = str(value).split(None, 1) v = int(val[0]) if len(val) > 1 and val[1][0] == "s": # v *= 512 / 1024 v /= 2 return v @command_set("readahead", per_device=True) def _set_readahead(self, value, device, sim): sys_file = self._readahead_file(device) val = self._parse_ra(value) if not sim: self._cmd.write_to_file(sys_file, "%d" % val) return val @command_get("readahead") def _get_readahead(self, device, ignore_missing=False): sys_file = self._readahead_file(device) value = self._cmd.read_file(sys_file, no_error=ignore_missing).strip() if len(value) == 0: return None return int(value) @command_custom("readahead_multiply", per_device=True) def _multiply_readahead(self, enabling, multiplier, device, verify, ignore_missing): if verify: return None storage_key = self._storage_key( command_name = "readahead_multiply", device_name = device) if enabling: old_readahead = self._get_readahead(device) if old_readahead is None: return new_readahead = int(float(multiplier) * old_readahead) self._storage.set(storage_key, old_readahead) self._set_readahead(new_readahead, device, False) else: old_readahead = self._storage.get(storage_key) if old_readahead is None: return self._set_readahead(old_readahead, device, False) self._storage.unset(storage_key) def _scheduler_quantum_file(self, device): return self._sysfs_path(device, "queue/iosched/quantum") @command_set("scheduler_quantum", per_device=True) def _set_scheduler_quantum(self, value, device, sim): sys_file = self._scheduler_quantum_file(device) if not sim: self._cmd.write_to_file(sys_file, "%d" % int(value)) return value @command_get("scheduler_quantum") def _get_scheduler_quantum(self, device, ignore_missing=False): sys_file = self._scheduler_quantum_file(device) value = self._cmd.read_file(sys_file, no_error=ignore_missing).strip() if len(value) == 0: if not ignore_missing: log.info("disk_scheduler_quantum option is not supported for device '%s'" % device) return None return int(value) PK[44+site-packages/tuned/plugins/plugin_sysfs.pynu[from . import base import glob import re import os.path from .decorators import * import tuned.logs from subprocess import * from tuned.utils.commands import commands log = tuned.logs.get() class SysfsPlugin(base.Plugin): """ Plugin for applying custom sysfs options, using specific plugins is preferred. """ # TODO: resolve possible conflicts with sysctl settings from other plugins def __init__(self, *args, **kwargs): super(SysfsPlugin, self).__init__(*args, **kwargs) self._has_dynamic_options = True self._cmd = commands() def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True instance._sysfs = dict([(os.path.normpath(key_value[0]), key_value[1]) for key_value in list(instance.options.items())]) instance._sysfs_original = {} def _instance_cleanup(self, instance): pass def _instance_apply_static(self, instance): for key, value in list(instance._sysfs.items()): v = self._variables.expand(value) for f in glob.iglob(key): if self._check_sysfs(f): instance._sysfs_original[f] = self._read_sysfs(f) self._write_sysfs(f, v) else: log.error("rejecting write to '%s' (not inside /sys)" % f) def _instance_verify_static(self, instance, ignore_missing, devices): ret = True for key, value in list(instance._sysfs.items()): v = self._variables.expand(value) for f in glob.iglob(key): if self._check_sysfs(f): curr_val = self._read_sysfs(f) if self._verify_value(f, v, curr_val, ignore_missing) == False: ret = False return ret def _instance_unapply_static(self, instance, full_rollback = False): for key, value in list(instance._sysfs_original.items()): self._write_sysfs(key, value) def _check_sysfs(self, sysfs_file): return re.match(r"^/sys/.*", sysfs_file) def _read_sysfs(self, sysfs_file): data = self._cmd.read_file(sysfs_file).strip() if len(data) > 0: return self._cmd.get_active_option(data, False) else: return None def _write_sysfs(self, sysfs_file, value): return self._cmd.write_to_file(sysfs_file, value) PK[M0site-packages/tuned/plugins/plugin_scsi_host.pycnu[ \c@sddlZddlmZddlTddlZddljZddlm Z ddl Z ddl Z ej j ZdejfdYZdS(iNi(thotplug(t*(tcommandstSCSIHostPlugincBseZdZdZdZdZedZdZdZ dZ dZ d Z ed Z d Zd Zd ZeddedZededZRS(s, Plugin for tuning options of SCSI hosts. cOs)tt|j||t|_dS(N(tsuperRt__init__Rt_cmd(tselftargstkwargs((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyRscCsztt|jt|_t|_x?|jjdD]+}|j |r;|jj |j q;q;Wt|_ dS(Ntscsi( RRt _init_devicestTruet_devices_supportedtsett _free_devicest_hardware_inventoryt get_devicest_device_is_supportedtaddtsys_namet_assigned_devices(Rtdevice((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR s  cCs&g|D]}|jjd|^qS(NR (Rt get_device(Rtdevicestx((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_get_device_objects scCs |jdkS(Nt scsi_host(t device_type(tclsR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR#scCs|jj|d|jdS(NR (Rt subscribet_hardware_events_callback(R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_hardware_events_init'scCs|jj|dS(N(Rt unsubscribe(R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_hardware_events_cleanup*scCs/|j|r+tt|j||ndS(N(RRRR(RteventR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR-scCstt|j||dS(N(RRt_added_device_apply_tuning(Rtinstancet device_name((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR$1scCstt|j||dS(N(RRt_removed_device_unapply_tuning(RR%R&((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR'4scCs idd6S(Ntalpm(tNone(R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_get_config_options7scCst|_t|_dS(N(R t_has_static_tuningtFalset_has_dynamic_tuning(RR%((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_instance_init=s cCsdS(N((RR%((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_instance_cleanupAscCstjjdt|dS(Ns/sys/class/scsi_host/tlink_power_management_policy(tostpathtjointstr(RR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_get_alpm_policy_fileDsR(t per_devicecCsu|dkrdS|j|}|sqtjj|rM|jj||qqtjd|t |fdSn|S(NsBALPM control file ('%s') not found, skipping ALPM setting for '%s'( R)R5R1R2texistsRt write_to_filetlogtinfoR4(RtpolicyRtsimt policy_file((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt _set_alpmGs cCsA|j|}|jj|dtj}|dkr=|SdS(Ntno_errort(R5Rt read_fileR tstripR)(RRtignore_missingR=R;((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt _get_alpmTs(t__name__t __module__t__doc__RR Rt classmethodRR R"RR$R'R*R.R/R5t command_setR R>t command_getR,RD(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR s"           (terrnoR@Rt decoratorst tuned.logsttunedt tuned.conststconststtuned.utils.commandsRR1tretlogstgetR9tPluginR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyts     PK[:(site-packages/tuned/plugins/__init__.pycnu[ \c@sddlTddlmZdS(i(t*(tinstanceN(t repositorytR(((s:/usr/lib/python2.7/site-packages/tuned/plugins/__init__.pyts PK[In &site-packages/tuned/plugins/hotplug.pynu[from . import base import tuned.consts as consts import tuned.logs log = tuned.logs.get() class Plugin(base.Plugin): """ Base class for plugins with device hotpluging support. """ def __init__(self, *args, **kwargs): super(Plugin, self).__init__(*args, **kwargs) def cleanup(self): super(Plugin, self).cleanup() self._hardware_events_cleanup() def _hardware_events_init(self): raise NotImplementedError() def _hardware_events_cleanup(self): raise NotImplementedError() def _init_devices(self): self._hardware_events_init() def _hardware_events_callback(self, event, device): if event == "add": log.info("device '%s' added" % device.sys_name) self._add_device(device) elif event == "remove": log.info("device '%s' removed" % device.sys_name) self._remove_device(device) def _add_device(self, device): device_name = device.sys_name if device_name in (self._assigned_devices | self._free_devices): return for instance_name, instance in list(self._instances.items()): if len(self._get_matching_devices(instance, [device_name])) == 1: log.info("instance %s: adding new device %s" % (instance_name, device_name)) self._assigned_devices.add(device_name) self._call_device_script(instance, instance.script_pre, "apply", [device_name]) self._added_device_apply_tuning(instance, device_name) self._call_device_script(instance, instance.script_post, "apply", [device_name]) instance.processed_devices.add(device_name) break else: log.debug("no instance wants %s" % device_name) self._free_devices.add(device_name) def _remove_device(self, device): device_name = device.sys_name if device_name not in (self._assigned_devices | self._free_devices): return for instance in list(self._instances.values()): if device_name in instance.processed_devices: self._call_device_script(instance, instance.script_post, "unapply", [device_name]) self._removed_device_unapply_tuning(instance, device_name) self._call_device_script(instance, instance.script_pre, "unapply", [device_name]) instance.processed_devices.remove(device_name) # This can be a bit racy (we can overcount), # but it shouldn't affect the boolean result instance.active = len(instance.processed_devices) \ + len(instance.assigned_devices) > 0 self._assigned_devices.remove(device_name) break else: self._free_devices.remove(device_name) def _added_device_apply_tuning(self, instance, device_name): self._execute_all_device_commands(instance, [device_name]) if instance.has_dynamic_tuning and self._global_cfg.get(consts.CFG_DYNAMIC_TUNING, consts.CFG_DEF_DYNAMIC_TUNING): self._instance_apply_dynamic(instance, device_name) def _removed_device_unapply_tuning(self, instance, device_name): if instance.has_dynamic_tuning and self._global_cfg.get(consts.CFG_DYNAMIC_TUNING, consts.CFG_DEF_DYNAMIC_TUNING): self._instance_unapply_dynamic(instance, device_name) self._cleanup_all_device_commands(instance, [device_name]) PK[GUs *site-packages/tuned/plugins/repository.pycnu[ \c@sZddlmZddlZddlZejjZdgZdefdYZ dS(i(t PluginLoaderNt RepositorycBs;eZdZedZdZdZdZRS(c Csktt|jt|_||_||_||_||_||_ ||_ ||_ ||_ dS(N( tsuperRt__init__tsett_pluginst_monitor_repositoryt_storage_factoryt_hardware_inventoryt_device_matchert_device_matcher_udevt_plugin_instance_factoryt _global_cfgt _variables( tselftmonitor_repositorytstorage_factorythardware_inventorytdevice_matchertdevice_matcher_udevtplugin_instance_factoryt global_cfgt variables((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyR s        cCs|jS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pytpluginsscCs(d|_d|_tjjj|_dS(Ns tuned.pluginstplugin_(t _namespacet_prefixttunedRtbasetPlugint _interface(R((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyt_set_loader_parameterss  c Csmtjd||j|}||j|j|j|j|j|j|j |j }|j j ||S(Nscreating plugin %s( tlogtdebugt load_pluginRRRR R R R R Rtadd(Rt plugin_namet plugin_clstplugin_instance((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pytcreate s cCsGt||jsttjd||j|jj|dS(Nsremoving plugin %s(t isinstanceRtAssertionErrorR R!tcleanupRtremove(Rtplugin((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pytdelete(s (t__name__t __module__RtpropertyRRR'R-(((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyR s    ( ttuned.utils.plugin_loaderRttuned.plugins.baseRt tuned.logstlogstgetR t__all__R(((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyts    PK[Hr*site-packages/tuned/plugins/decorators.pycnu[ \c@s:dddgZeddZdZeddZdS(t command_sett command_gettcommand_customicsfd}|S(Ncs)itd6d6d6d6|_|S(Ntsettnamet per_devicetpriority(tTruet_command(tmethod(RRR(s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pytwrappers  ((RRRR ((RRRs</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyRs csfd}|S(Ncsitd6d6|_|S(NtgetR(RR(R (R(s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR !s ((RR ((Rs</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR scsfd}|S(Ncs)itd6d6d6d6|_|S(NtcustomRRR(RR(R (RRR(s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR *s  ((RRRR ((RRRs</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR)sN(t__all__tFalseRRR(((s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyts PK[R}>-site-packages/tuned/plugins/plugin_script.pyonu[ +cc@syddljZddlmZddlZddlZddlmZm Z ej j Z dej fdYZdS(iNi(tbase(tPopentPIPEt ScriptPlugincBsVeZdZedZdZdZdZdZdZ e dZ RS(sO Plugin for running custom scripts with profile activation and deactivation. cCs idd6S(Ntscript(tNone(tself((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt_get_config_optionsscCsEt|_t|_|jddk r8|jd|_n g|_dS(NR(tTruet_has_static_tuningtFalset_has_dynamic_tuningtoptionsRt_scripts(Rtinstance((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt_instance_inits   cCsdS(N((RR((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt_instance_cleanupsc Csbt}xU|D]M}tj}|j|jjtjd|t|ftj dtt |j yt |g|dt dt dtd|dtdtjj|}|j\}}t|rtjd ||d fn|jr tjd ||jft}nWq ttfk rY} tjd || ft}q Xq W|S( Ns'calling script '%s' with arguments '%s'susing environment '%s'tstdouttstderrt close_fdstenvtuniversal_newlinestcwdsscript '%s' error output: '%s'is#script '%s' returned error code: %dsscript '%s' error: %s(Rtostenvirontupdatet _variablestget_envtlogtinfotstrtdebugtlisttitemsRRtpathtdirnamet communicatetlenterrort returncodeR tOSErrortIOError( Rtscriptst argumentstretRRtproctoutterrte((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt _call_scripts!s,  #     cCs0tt|j||j|jdgdS(Ntstart(tsuperRt_instance_apply_staticR1R (RR((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyR49scCst}tt|j|||tkr3t}ndg}|rR|dg7}n|j|j|tkrtjt j |jntj t j |jt}|S(Ntverifytignore_missing( RR3Rt_instance_verify_staticR R1R RRtconststSTR_VERIFY_PROFILE_OKR&tSTR_VERIFY_PROFILE_FAIL(RRR6tdevicesR,targs((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyR7=s  cCsUdg}|r|dg}n|jt|j|tt|j||dS(Ntstopt full_rollback(R1treversedR R3Rt_instance_unapply_static(RRR>R<((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyR@Ls  ( t__name__t __module__t__doc__t classmethodRRRR1R4R7R R@(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyR s    (t tuned.constsR8tRt tuned.logsttunedRt subprocessRRtlogstgetRtPluginR(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyts   PK[VpOO-site-packages/tuned/plugins/plugin_sysctl.pyonu[ +cc@sddlZddlmZddlTddlZddlTddlmZddl j Z ddl Z ddl Z ej jZddgZdd gZd ejfd YZd Zd ZdZdZdZedZdS(iNi(tbase(t*(tcommandstbase_reachable_timet retrans_times /run/sysctl.ds /etc/sysctl.dt SysctlPlugincBsGeZdZdZdZdZdZdZedZ RS(s. Plugin for applying custom sysctl options. cOs2tt|j||t|_t|_dS(N(tsuperRt__init__tTruet_has_dynamic_optionsRt_cmd(tselftargstkwargs((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyRs cCst|_t|_|j|j}|jj|i|_t |jdkrt j d|j |i|_|jj |n|j|_dS(Nis0recovering old sysctl settings from previous run(tFalset_has_dynamic_tuningRt_has_static_tuningt _storage_keytnamet_storagetgett_sysctl_originaltlentlogtinfot_instance_unapply_statictunsettoptionst_sysctl(R tinstancet storage_key((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyt_instance_inits     cCs&|j|j}|jj|dS(N(RRRR(R RR((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyt_instance_cleanup+scCs xt|jjD]\}}t|}|dkrNtjd|q|jj|j j |}|j ||}|dk r||j |t|jD]*}||}d||f}t|qWtddS(Ns.confs%s/%ss/etc/sysctl.conf(tSYSCTL_CONFIG_DIRStostlistdirtendswithtsortedtkeyst_apply_sysctl_config_file(tfilestdtflisttfnametpath((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyR1Vs     c Cstjd|y]t|d7}x-t|dD]\}}t|||q6WWdQXtjd|WnKttfk r}|jtjkrtj d|t |fqnXdS(Ns%Applying sysctl settings from file %stris.Finished applying sysctl settings from file %ss.Error reading sysctl settings from file %s: %s( Rtdebugtopent enumeratet_apply_sysctl_config_linetOSErrortIOErrorterrnotENOENTR%tstr(RMtftlinenotlinete((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyRHis   cCs|j}t|dks>|ddks>|ddkrBdS|jdd}t|dkrtjd||fdS|\}}|j}t|dkrtjd||fdS|j}t||dtdS( Nit#t;t=iis Syntax error in file %s, line %dR9(tstripRtsplitRR%R*R(RMRYRZttmpR2R3((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyRRvs  2     cCsd|jddS(Ns /proc/sys/%st.t/(treplace(R2((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyt_get_sysctl_pathscCst|}yt|dW}d}x;t|D]-\}}|dkr4tjd|dSq4W|j}WdQXtjd||f|SWn]tt fk r}|j t j krtjd|ntjd|t |fdSXdS(NRNtisGFailed to read sysctl parameter '%s', multi-line values are unsupporteds&Value of sysctl parameter '%s' is '%s'sBFailed to read sysctl parameter '%s', the parameter does not exists(Failed to read sysctl parameter '%s': %s( ReRPRQRR%R$R_RORSRTRURVRW(R2RMRXRZtiR3R[((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyR#s(       cCst|}tjj|tkr9tjd|tSyDtjd||ft |d}|j |WdQXt SWn{t t fk r}|jtjkr|rtjntj}|d||fn tjd||t|ftSXdS(Ns+Refusing to set deprecated sysctl option %ss%Setting sysctl parameter '%s' to '%s'twsIFailed to set sysctl parameter '%s' to '%s', the parameter does not exists/Failed to set sysctl parameter '%s' to '%s': %s(ReRCRMtbasenametDEPRECATED_SYSCTL_OPTIONSRR%RRORPtwriteRRSRTRURVRW(R2R3R9RMRXR[tlog_func((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyR*s&    (treRfRt decoratorst tuned.logsttunedt subprocessttuned.utils.commandsRt tuned.constsR.RURCtlogsRRRjRBtPluginRR1RHRRReR#RR*(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyts&        E    PK[zTsCC+site-packages/tuned/plugins/plugin_disk.pycnu[ +cc@sddlZddlmZddlTddlZddljZddlm Z ddl Z ddl Z ej j ZdejfdYZdS(iNi(thotplug(t*(tcommandst DiskPlugincBs9eZdZdZdZdZdZedZdZ dZ dZ d Z d Z ed Zed Zd ZdZdZdZdZdZdZdZdZdZdZddZdZeddedZe de!dZ"edded Z#e de!d!Z$ed"ded#Z%e d"e!d$Z&d%Z'd&Z(ed'ded(Z)e d'e!d)Z*e+d*ded+Z,d,Z-ed-ded.Z.e d-e!d/Z/RS(0s' Plugin for tuning options of disks. c Ostt|j||ddddddddd d d d g |_d dddddddddd dg |_t|j|_d|_d|_t |_ dS(Niiiiii}iiiUiFi7iiiiiiiiiiiniZi<ig{Gz?( tsuperRt__init__t _power_levelst_spindown_levelstlent_levelst _level_stepst_load_smallestRt_cmd(tselftargstkwargs((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRs--  cCstt|jt|_t|_t|_t|_xp|j j dD]\}|j |rP|jj |j |jr|j|j r|jj |j qqPqPWt|_dS(Ntblock(RRt _init_devicestTruet_devices_supportedt _use_hdparmtsett _free_devicest_hdparm_apm_devicest_hardware_inventoryt get_devicest_device_is_supportedtaddtsys_namet_is_hdparm_apm_supportedt_assigned_devices(R tdevice((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRs    cCs&g|D]}|jjd|^qS(NR(Rt get_device(R tdevicestx((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_device_objects)scCs|jjddd|gdtjgdt\}}}|tj krdtjdt|_tS|rtj d|tj d||ftSd |krtj d |tStS( Nthdparms-Cs/dev/%st no_errorst return_errs4hdparm command not found, ignoring for other devicess#Device '%s' not supported by hdparms(rc: %s, msg: '%s')tunknowns3Driver for device '%s' does not support apm command( R texecuteterrnotENOENTRtlogtwarntFalseRtinfotdebug(R Rtrctoutterr_msg((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR,s   cCsI|jdkoH|jjdddkoH|jdkpH|jjdkS( Ntdiskt removablet0tscsitvirtiotxentnvme(R6R7R8R9(t device_typet attributestgettNonetparentt subsystem(tclsR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR<scCs|jj|d|jdS(NR(Rt subscribet_hardware_events_callback(R ((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_hardware_events_initCscCs|jj|dS(N(Rt unsubscribe(R ((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_hardware_events_cleanupFscCs;|j|s|dkr7tt|j||ndS(Ntremove(RRRRB(R teventR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRBIscCs?|jdk r"|jj|ntt|j||dS(N(t _load_monitorR=t add_deviceRRt_added_device_apply_tuning(R tinstancet device_name((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRJMscCs?|jdk r"|jj|ntt|j||dS(N(RHR=t remove_deviceRRt_removed_device_unapply_tuning(R RKRL((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRNRscCs5itd6dd6dd6dd6dd6dd6dd6S(Ntdynamictelevatortapmtspindownt readaheadtreadahead_multiplytscheduler_quantum(RR=(R@((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_config_optionsWscCs ddgS(NRQRR((R@((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt#_get_config_options_used_by_dynamiccscCst|_d|_d|_|j|jdr|t|_|jjd|j |_ i|_ i|_ i|_ i|_nt|_d|_ dS(NiROR3(Rt_has_static_tuningt _apm_errcntt_spindown_errcntt _option_booltoptionst_has_dynamic_tuningt_monitors_repositorytcreatetassigned_devicesRHt _device_idlet_statst_idlet_spindown_change_delayedR-R=(R RK((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_initjs          cCs2|jdk r.|jj|jd|_ndS(N(RHR=R^tdelete(R RK((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_cleanup}scCs|rd}|j}nd}|j}|tjkr:dS|dkrOd}ne|tj krtjd|_|_tjddS|d7}|tjkrtjd|n|r||_n ||_dS(NRRRQiisIhdparm command not found, ignoring future set_apm / set_spindown commandss5disabling set_%s command: too many consecutive errors( RZRYtconststERROR_THRESHOLDR)R*R+R,R.(R R0RRtstcnt((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_update_errcnts&       cCsgtjd||jjdd|d|gdtjg\}}|j|tt|j ||jj|d|n|S(Ns%d(RRR R(R RRRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_set_readaheadds cCsM|j|}|jj|d|j}t|dkrCdSt|S(NRi(RR RtstripRR=R(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_readaheadls RTc Cs|r dS|jddd|}|r|j|}|dkrGdStt||}|jj|||j||tnE|jj |}|dkrdS|j||t|jj |dS(Nt command_nameRTRL( R=t _storage_keyRRRt_storageRRR-R<tunset( R tenablingt multiplierRtverifyRt storage_keyt old_readaheadt new_readahead((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_multiply_readaheadts"    cCs|j|dS(Nsqueue/iosched/quantum(R(R R((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_scheduler_quantum_filesRUcCs9|j|}|s5|jj|dt|n|S(Ns%d(RR RR(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_set_scheduler_quantums cCsg|j|}|jj|d|j}t|dkr]|sYtjd|ndSt|S(NRis>disk_scheduler_quantum option is not supported for device '%s'( RR RRRR+R.R=R(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_scheduler_quantums(0t__name__t __module__t__doc__RRR#Rt classmethodRRCRERBRJRNRVRWReRgRlRnRqR~RvRwRxRRRRt command_setRRt command_getR-RRRRRRRRRtcommand_customRRRR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR sZ               2              (R)tRt decoratorst tuned.logsttunedt tuned.constsRhttuned.utils.commandsRRRtlogsR<R+tPluginR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyts     PK[XX'site-packages/tuned/plugins/hotplug.pyonu[ \c@sWddlmZddljZddlZejjZdej fdYZ dS(i(tbaseiNtPlugincBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s: Base class for plugins with device hotpluging support. cOstt|j||dS(N(tsuperRt__init__(tselftargstkwargs((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR scCs!tt|j|jdS(N(RRtcleanupt_hardware_events_cleanup(R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyRscCs tdS(N(tNotImplementedError(R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyt_hardware_events_initscCs tdS(N(R (R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyRscCs|jdS(N(R (R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyt _init_devicesscCsd|dkr0tjd|j|j|n0|dkr`tjd|j|j|ndS(Ntaddsdevice '%s' addedtremovesdevice '%s' removed(tlogtinfotsys_namet _add_devicet_remove_device(Rteventtdevice((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyt_hardware_events_callbacks   cCs|j}||j|jBkr#dSxt|jjD]\}}t|j||gdkr9tj d||f|jj ||j ||j d|g|j |||j ||jd|g|jj |Pq9q9Wtjd||jj |dS(Nis!instance %s: adding new device %stapplysno instance wants %s(Rt_assigned_devicest _free_devicestlistt _instancestitemstlent_get_matching_devicesRRR t_call_device_scriptt script_pret_added_device_apply_tuningt script_posttprocessed_devicestdebug(RRt device_namet instance_nametinstance((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR$s "!cCs|j}||j|jBkr#dSxt|jjD]}||jkr9|j||jd|g|j |||j||j d|g|jj |t |jt |j dk|_|jj |Pq9q9W|jj |dS(Ntunapplyi(RRRRRtvaluesR"RR!t_removed_device_unapply_tuningRR Rtassigned_devicestactive(RRR$R&((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR6s  cCsN|j||g|jrJ|jjtjtjrJ|j||ndS(N(t_execute_all_device_commandsthas_dynamic_tuningt _global_cfgtgettconststCFG_DYNAMIC_TUNINGtCFG_DEF_DYNAMIC_TUNINGt_instance_apply_dynamic(RR&R$((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR Js$cCsN|jr7|jjtjtjr7|j||n|j||gdS(N(R-R.R/R0R1R2t_instance_unapply_dynamict_cleanup_all_device_commands(RR&R$((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR)Os$( t__name__t __module__t__doc__RRR RR RRRR R)(((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyRs         ( tRt tuned.constsR0t tuned.logsttunedtlogsR/RR(((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyts PK[Hr*site-packages/tuned/plugins/decorators.pyonu[ \c@s:dddgZeddZdZeddZdS(t command_sett command_gettcommand_customicsfd}|S(Ncs)itd6d6d6d6|_|S(Ntsettnamet per_devicetpriority(tTruet_command(tmethod(RRR(s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pytwrappers  ((RRRR ((RRRs</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyRs csfd}|S(Ncsitd6d6|_|S(NtgetR(RR(R (R(s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR !s ((RR ((Rs</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR scsfd}|S(Ncs)itd6d6d6d6|_|S(NtcustomRRR(RR(R (RRR(s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR *s  ((RRRR ((RRRs</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyR)sN(t__all__tFalseRRR(((s</usr/lib/python2.7/site-packages/tuned/plugins/decorators.pyts PK[Av{5 5 0site-packages/tuned/plugins/plugin_eeepc_she.pycnu[ \c@stddlmZddlmZddlZddlmZddlZejj Z dej fdYZ dS(i(tbase(t exceptionsiN(tcommandstEeePCSHEPlugincBsSeZdZdZedZdZdZdZdZ dZ RS(sh Plugin for tuning FSB (front side bus) speed on Asus EEE PCs with SHE (Super Hybrid Engine) support. cOszt|_d|_tjj|js6d|_ntjj|js]tjdntt |j ||dS(Ns!/sys/devices/platform/eeepc/cpufvs%/sys/devices/platform/eeepc-wmi/cpufvs)Plugin is not supported on your hardware.( Rt_cmdt _control_filetostpathtisfileRtNotSupportedPluginExceptiontsuperRt__init__(tselftargstkwargs((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyR s   cCs idd6dd6dd6dd6S( Ng333333?tload_threshold_normalg?tload_threshold_powersaveit she_powersaveit she_normal((R ((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_get_config_optionss cCs7t|_t|_d|_|jjdd|_dS(Ntload( tFalset_has_static_tuningtTruet_has_dynamic_tuningtNonet _she_modet_monitors_repositorytcreatet _load_monitor(R tinstance((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_init s   cCs2|jdk r.|jj|jd|_ndS(N(RRRtdelete(R R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_cleanup&scCsc|jjd}||jdkr9|j|dn&||jdkr_|j|dndS(NtsystemRt powersaveRtnormal(Rtget_loadtoptionst _set_she_mode(R RtdeviceR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_update_dynamic+s cCs|j|ddS(NR$(R'(R RR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_unapply_dynamic2scCsgt|jd|}|j|krctjd||f|jj|jd|||_ndS(Nsshe_%ssnew eeepc_she mode %s (%d) s%s(tintR&RtlogtinfoRt write_to_fileR(R Rtnew_modetnew_mode_numeric((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyR'6s ( t__name__t __module__t__doc__R t classmethodRRR!R)R*R'(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyR s     ( tRRt tuned.logsttunedttuned.utils.commandsRRtlogstgetR,tPluginR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyts   PK[ ,site-packages/tuned/plugins/plugin_video.pycnu[ \c@szddlmZddlTddlZddlmZddlZddlZej j Z dej fdYZ dS(i(tbase(t*iN(tcommandst VideoPlugincBs}eZdZdZdZedZdZdZdZ e dde d Z e ded ZRS( s? Plugin for tuning powersave options for some graphic cards. cCsvt|_t|_t|_xB|jjdjdjddD]}|jj |j qIWt |_ dS(Ntdrmscard*tDEVTYPEt drm_minor( tTruet_devices_supportedtsett _free_devicest_assigned_devicest_hardware_inventoryt get_devicestmatch_sys_nametmatch_propertytaddtsys_nameRt_cmd(tselftdevice((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt _init_devicess    .cCs&g|D]}|jjd|^qS(NR(R t get_device(Rtdevicestx((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_get_device_objectsscCs idd6S(Ntradeon_powersave(tNone(R((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_get_config_optionsscCst|_t|_dS(N(tFalset_has_dynamic_tuningRt_has_static_tuning(Rtinstance((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_instance_init#s cCsdS(N((RR ((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_instance_cleanup'scCs%id|d6d|d6d|d6S(Ns%/sys/class/drm/%s/device/power_methodtmethods&/sys/class/drm/%s/device/power_profiletprofiles(/sys/class/drm/%s/device/power_dpm_statet dpm_state((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_radeon_powersave_files*s  Rt per_devicecCst|j|}ttjdd|j}tjj|dsd|sdtj d|dSnx |D]}|dkr|sl|j j |dd r|j j |d |r|Sqlqk|d kr|sl|j j |dd rd Sqlqk|dkrR|sl|t d}|j j |ddrO|j j |d|rO|Sqlqk|shtj dndSqkWdS(Ns#(\s*:\s*)|(\s+)|(\s*;\s*)|(\s*,\s*)t R#s)radeon_powersave is not supported on '%s'tdefaulttautotlowtmidthighR$tdynpms dpm-batterys dpm-balancedsdpm-performancesdpm-tdpmR%s$Invalid option for radeon_powersave.(sdefaultR*R+R,R-(s dpm-batterys dpm-balancedsdpm-performance(R&tstrtretsubtsplittostpathtexiststlogtwarnRRt write_to_filetlen(RtvalueRtsimt sys_filestvatvtstate((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_set_radeon_powersave1s4!       cCs|j|}|jj|dd|j}|dkrW|jj|djS|dkrg|S|dkrd|jj|djSdSdS(NR#tno_errorR$R.R/sdpm-R%(R&Rt read_filetstripR(RRtignore_missingR=R#((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_get_radeon_powersavePs"   (t__name__t __module__t__doc__RRt classmethodRR!R"R&t command_setRRAt command_getRRF(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyR s     (tRt decoratorst tuned.logsttunedttuned.utils.commandsRR4R1tlogstgetR7tPluginR(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyts    PK[55-site-packages/tuned/plugins/plugin_modules.pynu[import re import os.path from . import base from .decorators import * import tuned.logs from subprocess import * from tuned.utils.commands import commands import tuned.consts as consts log = tuned.logs.get() class ModulesPlugin(base.Plugin): """ Plugin for applying custom kernel modules options. """ def __init__(self, *args, **kwargs): super(ModulesPlugin, self).__init__(*args, **kwargs) self._has_dynamic_options = True self._cmd = commands() def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True instance._modules = instance.options def _instance_cleanup(self, instance): pass def _reload_modules(self, modules): for module in modules: retcode, out = self._cmd.execute(["modprobe", "-r", module]) if retcode < 0: log.warn("'modprobe' command not found, cannot reload kernel modules, reboot is required") return elif retcode > 0: log.debug("cannot remove kernel module '%s': %s" % (module, out.strip())) retcode, out = self._cmd.execute(["modprobe", module]) if retcode != 0: log.warn("cannot insert/reinsert module '%s', reboot is required: %s" % (module, out.strip())) def _instance_apply_static(self, instance): self._clear_modprobe_file() s = "" retcode = 0 skip_check = False reload_list = [] for option, value in list(instance._modules.items()): module = self._variables.expand(option) v = self._variables.expand(value) if not skip_check: retcode, out = self._cmd.execute(["modinfo", module]) if retcode < 0: skip_check = True log.warn("'modinfo' command not found, not checking kernel modules") elif retcode > 0: log.error("kernel module '%s' not found, skipping it" % module) if skip_check or retcode == 0: if len(v) > 1 and v[0:2] == "+r": v = re.sub(r"^\s*\+r\s*,?\s*", "", v) reload_list.append(module) if len(v) > 0: s += "options " + module + " " + v + "\n" else: log.debug("module '%s' doesn't have any option specified, not writing it to modprobe.d" % module) self._cmd.write_to_file(consts.MODULES_FILE, s) l = len(reload_list) if l > 0: self._reload_modules(reload_list) if len(instance._modules) != l: log.info(consts.STR_HINT_REBOOT) def _unquote_path(self, path): return str(path).replace("/", "") def _instance_verify_static(self, instance, ignore_missing, devices): ret = True # not all modules exports all their parameteters through sysfs, so hardcode check with ignore_missing ignore_missing = True r = re.compile(r"\s+") for option, value in list(instance._modules.items()): module = self._variables.expand(option) v = self._variables.expand(value) v = re.sub(r"^\s*\+r\s*,?\s*", "", v) mpath = "/sys/module/%s" % module if not os.path.exists(mpath): ret = False log.error(consts.STR_VERIFY_PROFILE_FAIL % "module '%s' is not loaded" % module) else: log.info(consts.STR_VERIFY_PROFILE_OK % "module '%s' is loaded" % module) l = r.split(v) for item in l: arg = item.split("=") if len(arg) != 2: log.warn("unrecognized module option for module '%s': %s" % (module, item)) else: if self._verify_value(arg[0], arg[1], self._cmd.read_file(mpath + "/parameters/" + self._unquote_path(arg[0]), err_ret = None, no_error = True), ignore_missing) == False: ret = False return ret def _instance_unapply_static(self, instance, full_rollback = False): if full_rollback: self._clear_modprobe_file() def _clear_modprobe_file(self): s = self._cmd.read_file(consts.MODULES_FILE, no_error = True) l = s.split("\n") i = j = 0 ll = len(l) r = re.compile(r"^\s*#") while i < ll: if r.search(l[i]) is None: j = i i = ll i += 1 s = "\n".join(l[0:j]) if len(s) > 0: s += "\n" self._cmd.write_to_file(consts.MODULES_FILE, s) PK[$}}.site-packages/tuned/plugins/plugin_systemd.pycnu[ \c@sddlmZddlTddlZddlmZddlmZddlj Z ddl Z ddl Z ej j ZdejfdYZdS( i(tbase(t*iN(t exceptions(tcommandst SystemdPlugincBseZdZdZdZdZedZdZdZ dZ dZ d Z d Z d Zed Zd ZeddedZRS(sn Plugin for tuning systemd options. These tunings are unloaded only on profile change followed by reboot. cOsWtjjtjs.tjdtjntt|j ||t |_ dS(NsERequired systemd '%s' configuration file not found, disabling plugin.( tostpathtisfiletconststSYSTEMD_SYSTEM_CONF_FILERtNotSupportedPluginExceptiontsuperRt__init__Rt_cmd(tselftargstkwargs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyR scCst|_t|_dS(N(tFalset_has_dynamic_tuningtTruet_has_static_tuning(Rtinstance((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_instance_inits cCsdS(N((RR((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_instance_cleanupscCs idd6S(Nt cpu_affinity(tNone(tcls((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_get_config_options!scCs^|dk rZtjd|d|dtj}|dk rZ|jdkrZ|jdSndS(Ns^\s*s \s*=\s*(.*)$tflagsi(Rtretsearcht MULTILINEt lastindextgroup(Rtconftkeytmo((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt _get_keyval's  #cCstjd|ddt||dtj\}}|dkry!|ddkrb|d7}nWntk rvnX||dt|d7}|S|S( Ns^(\s*s\s*=).*$s\g<1>Riis t=(RtsubntstrRt IndexError(RR"R#tvaltconf_newtnsubs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt _add_keyval/s6  cCs$tjd|dd|dtjS(Ns^\s*s\s*=.*\ntR(RtsubR(RR"R#((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_del_key;scCs<|jjtjdd}|dkr8tjddS|S(Nterr_rets(error reading systemd configuration file(R t read_fileRR Rtlogterror(Rtsystemd_system_conf((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_read_systemd_system_conf>s   cCstjtj}|jj||sLtjd|jj|dtt S|jj |tjstjdtj|jj|dtt StS(Ns(error writing systemd configuration filetno_errors/error replacing systemd configuration file '%s'( RR tTMP_FILE_SUFFIXR t write_to_fileR3R4tunlinkRRtrename(RR"ttmpfile((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_write_systemd_system_confEs cCstjjtj|jS(N(RRtjoinRtPERSISTENT_STORAGE_DIRtname(R((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_get_storage_filenameSscCs|j}|dk r|j}|jj|dddt}|jj||dkrv|j|tj }n|j |tj |}|j |ndS(NR1R7( R6RRAR R2RR:R0RtSYSTEMD_CPUAFFINITY_VARR-R=(RR"tfnametcpu_affinity_saved((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_remove_systemd_tuningVs    cCs8|r4tjdtj|jtjdndS(Ns6removing '%s' systemd tuning previously added by Tuneds[you may need to manualy run 'dracut -f' to update the systemd configuration in initrd image(R3tinfoRRBREtconsole(RRt full_rollback((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_instance_unapply_staticbs c CsQ|dkrdSdjd|jjtjddtjdd|DS(NR.t css|]}t|VqdS(N(R((t.0tv((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pys lss\s+t,s,\s+(RR>R tcpulist_unpackRR/(Rtcpulist((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_cpulist_convert_unpackis Rt per_devicec Csld}d}|jj|jj|jj|}djd|jj|D}|j} | dk r|j | t j }|j |}n|r|j d|||S|rh|j} |jj| dddt} |dk r&| dkr&||kr&|jj| |dtntjdt j |t jf|j|j| t j |ndS(NRJcss|]}t|VqdS(N(R((RKRL((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pys ssRR1R7tmakedirs setting '%s' to '%s' in the '%s'(RR tunescapet _variablestexpandtunquoteR>RNR6R%RRBRPt _verify_valueRAR2RR9R3RFR R=R-( Rtenablingtvaluetverifytignore_missingt conf_affinitytconf_affinity_unpackedRLt v_unpackedR"RCRD((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_cmdlinens"*%   $ (t__name__t __module__t__doc__R RRt classmethodRR%R-R0R6R=RARERRIRPtcommand_customR_(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyR s          (R.Rt decoratorst tuned.logsttunedRttuned.utils.commandsRt tuned.constsRRRtlogstgetR3tPluginR(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyts    PK[,site-packages/tuned/plugins/plugin_sysfs.pycnu[ \c@sddlmZddlZddlZddlZddlTddlZddl Tddl m Z ej j ZdejfdYZdS(i(tbaseiN(t*(tcommandst SysfsPlugincBsbeZdZdZdZdZdZdZedZ dZ dZ d Z RS( sR Plugin for applying custom sysfs options, using specific plugins is preferred. cOs2tt|j||t|_t|_dS(N(tsuperRt__init__tTruet_has_dynamic_optionsRt_cmd(tselftargstkwargs((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyRs cCsjt|_t|_tgt|jjD]&}tj j |d|df^q+|_ i|_ dS(Nii( tFalset_has_dynamic_tuningRt_has_static_tuningtdicttlisttoptionstitemstostpathtnormpatht_sysfst_sysfs_original(R tinstancet key_value((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_inits  KcCsdS(N((R R((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_cleanupscCsxt|jjD]\}}|jj|}x`tj|D]O}|j|r|j||j |<|j ||qDt j d|qDWqWdS(Ns)rejecting write to '%s' (not inside /sys)( RRRt _variablestexpandtglobtiglobt _check_sysfst _read_sysfsRt _write_sysfstlogterror(R Rtkeytvaluetvtf((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_apply_static"s"c Cst}xt|jjD]\}}|jj|}x_tj|D]N}|j|rJ|j |} |j ||| |t krt }qqJqJWqW|S(N( RRRRRRRRR R!t _verify_valueR ( R Rtignore_missingtdevicestretR%R&R'R(tcurr_val((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_verify_static,s"cCs:x3t|jjD]\}}|j||qWdS(N(RRRR"(R Rt full_rollbackR%R&((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_unapply_static7s"cCstjd|S(Ns^/sys/.*(tretmatch(R t sysfs_file((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR ;scCsE|jj|j}t|dkr=|jj|tSdSdS(Ni(Rt read_filetstriptlentget_active_optionR tNone(R R4tdata((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR!>scCs|jj||S(N(Rt write_to_file(R R4R&((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR"Es( t__name__t __module__t__doc__RRRR)R/R R1R R!R"(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR s      (tRRR2tos.pathRt decoratorst tuned.logsttunedt subprocessttuned.utils.commandsRtlogstgetR#tPluginR(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyts      PK[--site-packages/tuned/plugins/plugin_script.pycnu[ +cc@syddljZddlmZddlZddlZddlmZm Z ej j Z dej fdYZdS(iNi(tbase(tPopentPIPEt ScriptPlugincBsVeZdZedZdZdZdZdZdZ e dZ RS(sO Plugin for running custom scripts with profile activation and deactivation. cCs idd6S(Ntscript(tNone(tself((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt_get_config_optionsscCsat|_t|_|jddk rTt|jdtsAt|jd|_ n g|_ dS(NR( tTruet_has_static_tuningtFalset_has_dynamic_tuningtoptionsRt isinstancetlisttAssertionErrort_scripts(Rtinstance((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt_instance_inits   cCsdS(N((RR((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt_instance_cleanupsc Csbt}xU|D]M}tj}|j|jjtjd|t|ftj dtt |j yt |g|dt dt dtd|dtdtjj|}|j\}}t|rtjd ||d fn|jr tjd ||jft}nWq ttfk rY} tjd || ft}q Xq W|S( Ns'calling script '%s' with arguments '%s'susing environment '%s'tstdouttstderrt close_fdstenvtuniversal_newlinestcwdsscript '%s' error output: '%s'is#script '%s' returned error code: %dsscript '%s' error: %s(Rtostenvirontupdatet _variablestget_envtlogtinfotstrtdebugRtitemsRRtpathtdirnamet communicatetlenterrort returncodeR tOSErrortIOError( Rtscriptst argumentstretRRtproctoutterrte((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyt _call_scripts!s,  #     cCs0tt|j||j|jdgdS(Ntstart(tsuperRt_instance_apply_staticR3R(RR((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyR69scCst}tt|j|||tkr3t}ndg}|rR|dg7}n|j|j|tkrtjt j |jntj t j |jt}|S(Ntverifytignore_missing( RR5Rt_instance_verify_staticR R3RRR tconststSTR_VERIFY_PROFILE_OKR(tSTR_VERIFY_PROFILE_FAIL(RRR8tdevicesR.targs((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyR9=s  cCsUdg}|r|dg}n|jt|j|tt|j||dS(Ntstopt full_rollback(R3treversedRR5Rt_instance_unapply_static(RRR@R>((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyRBLs  ( t__name__t __module__t__doc__t classmethodRRRR3R6R9R RB(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyR s    (t tuned.constsR:tRt tuned.logsttunedRt subprocessRRtlogstgetRtPluginR(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_script.pyts   PK[-^<==1site-packages/tuned/plugins/plugin_bootloader.pyonu[ \c@sddlmZddlTddlZddlmZddlmZddlj Z ddl Z ddl Z ddl Z ej jZdejfdYZdS( i(tbase(t*iN(t exceptions(tcommandstBootloaderPlugincBseZdZdZdZdZedZdZdZ dZ dZ e d Z d Zd Zd Zd ZdZdZdZdZdZdZdZdZeddZeddZeddZedde ddd Zed!de ddd"Zed#de ddd$Z d%Z!RS(&s Plugin for tuning bootloader options. Currently only grub2 is supported and reboot is required to apply the tunings. These tunings are unloaded only on profile change followed by reboot. cOsPtjjtjs'tjdntt|j ||t |_ dS(Ns4Required GRUB2 template not found, disabling plugin.( tostpathtisfiletconststGRUB2_TUNED_TEMPLATE_PATHRtNotSupportedPluginExceptiontsuperRt__init__Rt_cmd(tselftargstkwargs((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyR scCsRt|_t|_t|_t|_d|_d|_d|_ |j |_ dS(Nt( tFalset_has_dynamic_tuningtTruet_has_static_tuningtupdate_grub2_cfgt_initrd_remove_dirtNonet_initrd_dst_img_valt _cmdline_valt _initrd_valt_get_grub2_cfg_filest_grub2_cfg_file_names(Rtinstance((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_inits       cCsdS(N((RR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_cleanup'scCs.idd6dd6dd6dd6dd6dd6S(Ntgrub2_cfg_filetinitrd_dst_imgtinitrd_add_imgtinitrd_add_dirtinitrd_remove_dirtcmdline(R(tcls((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_get_config_options*sc Cs|jj}g}xm|D]e}t|jdrJ|j|q||krg||||tS|jddkrutjjtj|j|_qundS(NRiR( RR-RRRRRRR(RRRRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_dst_imgsR%cCs>|r dS|r:|dk r:|jj|dk|_ndS(Nt1(RR tget_boolR(RRRRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyR sR#t per_devicetpriorityi cCs_|r dS|r[|dk r[t|}|j||dkrEtS|j|s[tSndS(NR(RR-RRR(RRRRRtsrc_img((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_add_imgs   R$c Csv|r dS|rr|dk rrt|}|j||dkrEtStjj|sltjd|tStj d|t j dddd\}}tj d|tj ||jjd |d |d t\}} tj d | |d kr%tjd|jj|dttS|j||jj||jrrtj d||jj|qrndS(NRsFerror: cannot create initrd image, source directory '%s' doesn't exists+generating initrd image from directory '%s'tprefixstuned-bootloader-tsuffixs.tmps+writing initrd image to temporary file '%s'sfind . | cpio -co > %stcwdtshells cpio log: %siserror generating initrd imagetno_errorsremoving directory '%s'(RR-RRRRRR0terrorRMttempfiletmkstempRZtcloseR R}RRRRRtrmtree( RRRRRtsrc_dirtfdttmpfileRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_add_dir s2    (    R&c Cs|jj|jj|}|r|jjd}t|dkrLdSt|j}t|j}|j |} | |krt j t j dt|ftSt jt jdt| t|ftSn|r|dk rt j dt|_||_ndS(Ns /proc/cmdlineiR&s;installing additional boot command line parameters to grub2(t _variablestexpandR tunquoteRjRlRR{R6t intersectionR0RMRtSTR_VERIFY_PROFILE_VALUE_OKR-RRtSTR_VERIFY_PROFILE_VALUE_FAILRRR( RRRRRtvR&t cmdline_sett value_settcmdline_intersect((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_cmdline>s"  )  cCs3|r/|jr/|j|jt|_ndS(N(RRxRR(RRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_post_staticSs  ("R3t __module__t__doc__R RR t classmethodR(RCRRKRSRRXR`RgRqRwRxRzRVRRRRRtcommand_customRRRRRRR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyRs:               ! !!(RRt decoratorst tuned.logsttunedRttuned.utils.commandsRt tuned.constsRRR7RtlogstgetR0tPluginR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyts     PK[/8==*site-packages/tuned/plugins/plugin_cpu.pycnu[ \c@sddlmZddlTddlZddlmZddljZddl Z ddl Z ddl Z ddl Z ddl Z ejjZdejfdYZdS(i(tbase(t*iN(tcommandstCPULatencyPlugincBseZdZdZdZdZedZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZedZdZdZdZdZdZeddedZededZddZ eddeddd Z!eded!Z"d"Z#ed#ded$Z$d%Z%d&Z&d'Z'ed#ed(Z(RS()sP Plugin for tuning CPU options. Powersaving, governor, required latency, etc. cOstt|j||t|_d|_t|_t|_t|_ t|_ t|_ d|_ d|_d|_i|_t|_dS(Ntx86_64(tsuperRt__init__tTruet _has_pm_qost_archtFalset_is_x86t _is_intelt_is_amdt_has_energy_perf_biast_has_intel_pstatetNonet_min_perf_pct_savet_max_perf_pct_savet_no_turbo_savet_governors_mapRt_cmd(tselftargstkwargs((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs           cCsUt|_t|_x-|jjdD]}|jj|jq(Wt|_dS(Ntcpu( Rt_devices_supportedtsett _free_devicest_hardware_inventoryt get_devicestaddtsys_namet_assigned_devices(Rtdevice((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _init_devices(s   cCs&g|D]}|jjd|^qS(NR(Rt get_device(Rtdevicestx((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_device_objects1scCsJi dd6dd6dd6dd6dd6dd 6dd 6dd 6dd 6dd 6S(Ng?tload_thresholdidt latency_lowit latency_hight force_latencytgovernortsampling_down_factortenergy_perf_biast min_perf_pctt max_perf_pcttno_turbo(R(R((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_config_options4scCsdddddg}tj|_|j|krtj}|jjd}|dkrit|_n-|dks|d krt|_ n t|_t j d |nt j d |j|jtkr|j |j ndS( NRti686ti585ti486ti386t vendor_idt GenuineIntelt AuthenticAMDt HygonGenuines$We are running on an x86 %s platformsWe are running on %s (non x86)(tplatformtmachineR tprocfstcpuinfottagstgetRR R tlogtinfot_check_energy_perf_biast_check_intel_pstate(Rt intel_archsRtvendor((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _check_archCs      cCst|_d}|jjddgdtj|gd}|dkrRt|_n)|dkrntjdn tjddS(Nitx86_energy_perf_policys-rt no_errorsisgunable to run x86_energy_perf_policy tool, ignoring CPU energy performance bias, is the tool installed?sXyour CPU doesn't support MSR_IA32_ENERGY_PERF_BIAS, ignoring CPU energy performance bias( R RRtexecuteterrnotENOENTRRAtwarning(Rtretcode_unsupportedtretcode((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRC^s +   cCs2tjjd|_|jr.tjdndS(Ns$/sys/devices/system/cpu/intel_pstatesintel_pstate detected(tostpathtexistsRRARB(R((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRDis cCs.t|}|jjt|jddS(NRt(tstrRt is_cpu_onlinetreplace(RR"tsd((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_is_cpu_onlinens cCstjjd|S(Ns3/sys/devices/system/cpu/%s/cpufreq/scaling_governor(RPRQRR(RR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_cpu_has_scaling_governorrscCsL|j|s$tjd|tS|j|sHtjd|tStS(Ns'%s' is not online, skippings.there is no scaling governor fo '%s', skipping(RXRAtdebugR RYR(RR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_check_cpu_can_change_governoruscCst|_t|_t|jjd|krt|_ytj t j tj |_ Wn.tk rtjdt j t|_nXd|_|jddkr|jjdd|_t|_n d|_|jnt|_tjd|jt|jd|_dS(Nis-Unable to open '%s', disabling PM_QoS controlR+tloadsILatency settings from non-first CPU plugin instance '%s' will be ignored.(Rt_has_static_tuningR t_has_dynamic_tuningtlistt _instancestvaluest_first_instanceRPtopentconststPATH_CPU_DMA_LATENCYtO_WRONLYt_cpu_latency_fdtOSErrorRAterrorRRt_latencytoptionst_monitors_repositorytcreatet _load_monitorRGRBtnametassigned_devicest _first_device(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_init~s$          cCsQ|jrM|jr%tj|jn|jdk rM|jj|jqMndS(N( RbRRPtcloseRgRnRRltdelete(RRr((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_cleanups   cCs|jjd|djS(Ns'/sys/devices/system/cpu/intel_pstate/%s(Rt read_fileRtstrip(Rtattr((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_intel_pstate_attrscCs*|dk r&|jjd||ndS(Ns'/sys/devices/system/cpu/intel_pstate/%s(RRt write_to_file(RRytval((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_set_intel_pstate_attrs cCs3|dkrdS|j|}|j|||S(N(RRzR}(RRytvaluetv((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_getset_intel_pstate_attrs  cCstt|j||js#dS|jd}|dk rL|j|n|jr|jd|jd|_ |jd|jd|_ |jd|jd|_ ndS(NR+R/R0R1( RRt_instance_apply_staticRbRkRt _set_latencyRRRRR(RRrtforce_latency_value((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs    cCsktt|j|||jrg|jrg|jd|j|jd|j|jd|jndS(NR/R0R1( RRt_instance_unapply_staticRbRR}RRR(RRrt full_rollback((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs cCs|j||dS(N(t_instance_update_dynamic(RRrR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_apply_dynamicscCsw|jst||jkr"dS|jjd}||jdkr_|j|jdn|j|jddS(NtsystemR(R*R)(RbtAssertionErrorRqRntget_loadRkR(RRrR"R\((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRscCsdS(N((RRrR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_instance_unapply_dynamicscCsjt|}|jrf|j|krftjd|tjd|}tj|j |||_ndS(Nssetting new cpu latency %dti( tintRRjRARBtstructtpackRPtwriteRg(Rtlatencyt latency_bin((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRs  cCs |jjd|jjS(Ns>/sys/devices/system/cpu/%s/cpufreq/scaling_available_governors(RRwRxtsplit(RR"((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_available_governorssR,t per_devicecCs,|j|sdSt|}|jd}g|D]}|j^q5}x1|D])}t|dkrTtjddSqTW|j|}x|D]m}||kr|stj d||f|j j d||nPq|stj d||fqqWtj ddj|d}|S( Nt|is.The 'governor' option contains an empty value.s!setting governor '%s' on cpu '%s's3/sys/devices/system/cpu/%s/cpufreq/scaling_governors7Ignoring governor '%s' on cpu '%s', it is not supporteds.None of the scaling governors is supported: %ss, (R[RRTRRxtlenRARiRRBRR{RZtwarntjoin(Rt governorsR"tsimR,tavailable_governors((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _set_governors2         cCszd}|j|sdS|jjd|d|j}t|dkrV|}n|dkrvtjd|n|S(Ns3/sys/devices/system/cpu/%s/cpufreq/scaling_governortno_erroris*could not get current governor on cpu '%s'(RR[RRwRxRRARi(RR"tignore_missingR,tdata((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt _get_governors"  tondemandcCsd|S(Ns7/sys/devices/system/cpu/cpufreq/%s/sampling_down_factor((RR,((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_sampling_down_factor_path sR-tpriorityi cCs d}||jkr%|jjnd|j|<|j|}|dkrbtjd|dS|t|jjkr||j|<|j|}t j j |stjd||fdSt |}|stj d||f|jj||qn|S(NsIignoring sampling_down_factor setting for CPU '%s', cannot match governorsTignoring sampling_down_factor setting for CPU '%s', governor '%s' doesn't support its6setting sampling_down_factor to '%s' for governor '%s'(RRtclearRRARZR_RaRRPRQRRRTRBRR{(RR-R"RR|R,RQ((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_set_sampling_down_factors&    cCs`|j|d|}|dkr%dS|j|}tjj|sJdS|jj|jS(NR( RRRRPRQRRRRwRx(RR"RR,RQ((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_sampling_down_factor)s cCs=|jjdd|t|gdt\}}}||fS(NRHs-ct return_err(RRJRTR(Rtcpu_idR~ROtoutterr_msg((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_try_set_energy_perf_bias3s  R.c Cs"|j|s$tjd|dS|jr|s|jd}|jd}x|D]}|j}tjd||f|j||\}}|dkrtj d||fPqX|dkrtj d|PqXtjd||fqXWtj d |nt |SdSdS( Ns%s is not online, skippingRRs2Trying to set energy_perf_bias to '%s' on cpu '%s'is5energy_perf_bias successfully set to '%s' on cpu '%s's"Failed to set energy_perf_bias: %ssHCould not set energy_perf_bias to '%s' on cpu '%s', trying another valuesPFailed to set energy_perf_bias on cpu '%s'. Is the value in the profile correct?( RXRARZRRtlstripRRxRRBRiRT( RR.R"RRtvalsR|ROR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_set_energy_perf_bias<s6            cCsYyt|}WnBtk rT}yt|d}WqUtk rP}|}qUXnX|S(Ni(Rt ValueError(RtsRte((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_try_parse_num]scCs.idd6dd6dd6j|j||S(Nt performanceitnormalit powersavei(R@R(RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_energy_perf_policy_to_humanhscCs<idd6dd6dd6dd6d d 6j|j||S( NRisbalance-performanceiRis balance-poweritpoweri(R@R(RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_energy_perf_policy_to_human_v2ls   c Csd}|j|s*tjd|dS|jr|jd}|jjdd|dg\}}|dkrxu|jD]d}|j }t |dkr|j |d}Pqt |d kr|j |d}PqqWqn|S( Ns%s is not online, skippingRRHs-cs-riiii( RRXRARZRRRRJt splitlinesRRRR( RR"RR.RROtlinestlinetl((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyt_get_energy_perf_biasts" $  ()t__name__t __module__t__doc__RR#R't classmethodR2RGRCRDRXRYR[RsRvRzR}RRR RRRRRRt command_setRRt command_getRRRRRRRRRR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyRsJ                   !  !   (RSRt decoratorst tuned.logsttunedttuned.utils.commandsRt tuned.constsRdRPRRKR;R=tlogsR@RAtPluginR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_cpu.pyts       PK[B*VV#site-packages/tuned/plugins/base.pynu[import re import tuned.consts as consts import tuned.profiles.variables import tuned.logs import collections from tuned.utils.commands import commands import os from subprocess import Popen, PIPE log = tuned.logs.get() class Plugin(object): """ Base class for all plugins. Plugins change various system settings in order to get desired performance or power saving. Plugins use Monitor objects to get information from the running system. Intentionally a lot of logic is included in the plugin to increase plugin flexibility. """ def __init__(self, monitors_repository, storage_factory, hardware_inventory, device_matcher, device_matcher_udev, instance_factory, global_cfg, variables): """Plugin constructor.""" self._storage = storage_factory.create(self.__class__.__name__) self._monitors_repository = monitors_repository self._hardware_inventory = hardware_inventory self._device_matcher = device_matcher self._device_matcher_udev = device_matcher_udev self._instance_factory = instance_factory self._instances = collections.OrderedDict() self._init_commands() self._global_cfg = global_cfg self._variables = variables self._has_dynamic_options = False self._devices_inited = False self._options_used_by_dynamic = self._get_config_options_used_by_dynamic() self._cmd = commands() def cleanup(self): self.destroy_instances() def init_devices(self): if not self._devices_inited: self._init_devices() self._devices_inited = True @property def name(self): return self.__class__.__module__.split(".")[-1].split("_", 1)[1] # # Plugin configuration manipulation and helpers. # @classmethod def _get_config_options(self): """Default configuration options for the plugin.""" return {} @classmethod def get_config_options_hints(cls): """Explanation of each config option function""" return {} @classmethod def _get_config_options_used_by_dynamic(self): """List of config options used by dynamic tuning. Their previous values will be automatically saved and restored.""" return [] def _get_effective_options(self, options): """Merge provided options with plugin default options.""" # TODO: _has_dynamic_options is a hack effective = self._get_config_options().copy() for key in options: if key in effective or self._has_dynamic_options: effective[key] = options[key] else: log.warn("Unknown option '%s' for plugin '%s'." % (key, self.__class__.__name__)) return effective def _option_bool(self, value): if type(value) is bool: return value value = str(value).lower() return value == "true" or value == "1" # # Interface for manipulation with instances of the plugin. # def create_instance(self, name, devices_expression, devices_udev_regex, script_pre, script_post, options): """Create new instance of the plugin and seize the devices.""" if name in self._instances: raise Exception("Plugin instance with name '%s' already exists." % name) effective_options = self._get_effective_options(options) instance = self._instance_factory.create(self, name, devices_expression, devices_udev_regex, \ script_pre, script_post, effective_options) self._instances[name] = instance return instance def destroy_instance(self, instance): """Destroy existing instance.""" if instance._plugin != self: raise Exception("Plugin instance '%s' does not belong to this plugin '%s'." % (instance, self)) if instance.name not in self._instances: raise Exception("Plugin instance '%s' was already destroyed." % instance) instance = self._instances[instance.name] self._destroy_instance(instance) del self._instances[instance.name] def initialize_instance(self, instance): """Initialize an instance.""" log.debug("initializing instance %s (%s)" % (instance.name, self.name)) self._instance_init(instance) def destroy_instances(self): """Destroy all instances.""" for instance in list(self._instances.values()): log.debug("destroying instance %s (%s)" % (instance.name, self.name)) self._destroy_instance(instance) self._instances.clear() def _destroy_instance(self, instance): self.release_devices(instance) self._instance_cleanup(instance) def _instance_init(self, instance): raise NotImplementedError() def _instance_cleanup(self, instance): raise NotImplementedError() # # Devices handling # def _init_devices(self): self._devices_supported = False self._assigned_devices = set() self._free_devices = set() def _get_device_objects(self, devices): """Override this in a subclass to transform a list of device names (e.g. ['sda']) to a list of pyudev.Device objects, if your plugin supports it""" return None def _get_matching_devices(self, instance, devices): if instance.devices_udev_regex is None: return set(self._device_matcher.match_list(instance.devices_expression, devices)) else: udev_devices = self._get_device_objects(devices) if udev_devices is None: log.error("Plugin '%s' does not support the 'devices_udev_regex' option", self.name) return set() udev_devices = self._device_matcher_udev.match_list(instance.devices_udev_regex, udev_devices) return set([x.sys_name for x in udev_devices]) def assign_free_devices(self, instance): if not self._devices_supported: return log.debug("assigning devices to instance %s" % instance.name) to_assign = self._get_matching_devices(instance, self._free_devices) instance.active = len(to_assign) > 0 if not instance.active: log.warn("instance %s: no matching devices available" % instance.name) else: name = instance.name if instance.name != self.name: name += " (%s)" % self.name log.info("instance %s: assigning devices %s" % (name, ", ".join(to_assign))) instance.assigned_devices.update(to_assign) # cannot use |= self._assigned_devices |= to_assign self._free_devices -= to_assign def release_devices(self, instance): if not self._devices_supported: return to_release = (instance.processed_devices \ | instance.assigned_devices) \ & self._assigned_devices instance.active = False instance.processed_devices.clear() instance.assigned_devices.clear() self._assigned_devices -= to_release self._free_devices |= to_release # # Tuning activation and deactivation. # def _run_for_each_device(self, instance, callback, devices): if not self._devices_supported: devices = [None, ] for device in devices: callback(instance, device) def _instance_pre_static(self, instance, enabling): pass def _instance_post_static(self, instance, enabling): pass def _call_device_script(self, instance, script, op, devices, full_rollback = False): if script is None: return None if len(devices) == 0: log.warn("Instance '%s': no device to call script '%s' for." % (instance.name, script)) return None if not script.startswith("/"): log.error("Relative paths cannot be used in script_pre or script_post. " \ + "Use ${i:PROFILE_DIR}.") return False dir_name = os.path.dirname(script) ret = True for dev in devices: environ = os.environ environ.update(self._variables.get_env()) arguments = [op] if full_rollback: arguments.append("full_rollback") arguments.append(dev) log.info("calling script '%s' with arguments '%s'" % (script, str(arguments))) log.debug("using environment '%s'" % str(list(environ.items()))) try: proc = Popen([script] + arguments, \ stdout=PIPE, stderr=PIPE, \ close_fds=True, env=environ, \ cwd = dir_name, universal_newlines = True) out, err = proc.communicate() if proc.returncode: log.error("script '%s' error: %d, '%s'" % (script, proc.returncode, err[:-1])) ret = False except (OSError,IOError) as e: log.error("script '%s' error: %s" % (script, e)) ret = False return ret def instance_apply_tuning(self, instance): """ Apply static and dynamic tuning if the plugin instance is active. """ if not instance.active: return if instance.has_static_tuning: self._call_device_script(instance, instance.script_pre, "apply", instance.assigned_devices) self._instance_pre_static(instance, True) self._instance_apply_static(instance) self._instance_post_static(instance, True) self._call_device_script(instance, instance.script_post, "apply", instance.assigned_devices) if instance.has_dynamic_tuning and self._global_cfg.get(consts.CFG_DYNAMIC_TUNING, consts.CFG_DEF_DYNAMIC_TUNING): self._run_for_each_device(instance, self._instance_apply_dynamic, instance.assigned_devices) instance.processed_devices.update(instance.assigned_devices) instance.assigned_devices.clear() def instance_verify_tuning(self, instance, ignore_missing): """ Verify static tuning if the plugin instance is active. """ if not instance.active: return None if len(instance.assigned_devices) != 0: log.error("BUG: Some devices have not been tuned: %s" % ", ".join(instance.assigned_devices)) devices = instance.processed_devices.copy() if instance.has_static_tuning: if self._call_device_script(instance, instance.script_pre, "verify", devices) == False: return False if self._instance_verify_static(instance, ignore_missing, devices) == False: return False if self._call_device_script(instance, instance.script_post, "verify", devices) == False: return False return True else: return None def instance_update_tuning(self, instance): """ Apply dynamic tuning if the plugin instance is active. """ if not instance.active: return if instance.has_dynamic_tuning and self._global_cfg.get(consts.CFG_DYNAMIC_TUNING, consts.CFG_DEF_DYNAMIC_TUNING): self._run_for_each_device(instance, self._instance_update_dynamic, instance.processed_devices.copy()) def instance_unapply_tuning(self, instance, full_rollback = False): """ Remove all tunings applied by the plugin instance. """ if instance.has_dynamic_tuning and self._global_cfg.get(consts.CFG_DYNAMIC_TUNING, consts.CFG_DEF_DYNAMIC_TUNING): self._run_for_each_device(instance, self._instance_unapply_dynamic, instance.processed_devices) if instance.has_static_tuning: self._call_device_script(instance, instance.script_post, "unapply", instance.processed_devices, full_rollback = full_rollback) self._instance_pre_static(instance, False) self._instance_unapply_static(instance, full_rollback) self._instance_post_static(instance, False) self._call_device_script(instance, instance.script_pre, "unapply", instance.processed_devices, full_rollback = full_rollback) def _instance_apply_static(self, instance): self._execute_all_non_device_commands(instance) self._execute_all_device_commands(instance, instance.assigned_devices) def _instance_verify_static(self, instance, ignore_missing, devices): ret = True if self._verify_all_non_device_commands(instance, ignore_missing) == False: ret = False if self._verify_all_device_commands(instance, devices, ignore_missing) == False: ret = False return ret def _instance_unapply_static(self, instance, full_rollback = False): self._cleanup_all_device_commands(instance, instance.processed_devices) self._cleanup_all_non_device_commands(instance) def _instance_apply_dynamic(self, instance, device): for option in [opt for opt in self._options_used_by_dynamic if self._storage_get(instance, self._commands[opt], device) is None]: self._check_and_save_value(instance, self._commands[option], device) self._instance_update_dynamic(instance, device) def _instance_unapply_dynamic(self, instance, device): raise NotImplementedError() def _instance_update_dynamic(self, instance, device): raise NotImplementedError() # # Registration of commands for static plugins. # def _init_commands(self): """ Initialize commands. """ self._commands = collections.OrderedDict() self._autoregister_commands() self._check_commands() def _autoregister_commands(self): """ Register all commands marked using @command_set, @command_get, and @command_custom decorators. """ for member_name in self.__class__.__dict__: if member_name.startswith("__"): continue member = getattr(self, member_name) if not hasattr(member, "_command"): continue command_name = member._command["name"] info = self._commands.get(command_name, {"name": command_name}) if "set" in member._command: info["custom"] = None info["set"] = member info["per_device"] = member._command["per_device"] info["priority"] = member._command["priority"] elif "get" in member._command: info["get"] = member elif "custom" in member._command: info["custom"] = member info["per_device"] = member._command["per_device"] info["priority"] = member._command["priority"] self._commands[command_name] = info # sort commands by priority self._commands = collections.OrderedDict(sorted(iter(self._commands.items()), key=lambda name_info: name_info[1]["priority"])) def _check_commands(self): """ Check if all commands are defined correctly. """ for command_name, command in list(self._commands.items()): # do not check custom commands if command.get("custom", False): continue # automatic commands should have 'get' and 'set' functions if "get" not in command or "set" not in command: raise TypeError("Plugin command '%s' is not defined correctly" % command_name) # # Operations with persistent storage for status data. # def _storage_key(self, instance_name = None, command_name = None, device_name = None): class_name = type(self).__name__ instance_name = "" if instance_name is None else instance_name command_name = "" if command_name is None else command_name device_name = "" if device_name is None else device_name return "%s/%s/%s/%s" % (class_name, instance_name, command_name, device_name) def _storage_set(self, instance, command, value, device_name=None): key = self._storage_key(instance.name, command["name"], device_name) self._storage.set(key, value) def _storage_get(self, instance, command, device_name=None): key = self._storage_key(instance.name, command["name"], device_name) return self._storage.get(key) def _storage_unset(self, instance, command, device_name=None): key = self._storage_key(instance.name, command["name"], device_name) return self._storage.unset(key) # # Command execution, verification, and cleanup. # def _execute_all_non_device_commands(self, instance): for command in [command for command in list(self._commands.values()) if not command["per_device"]]: new_value = self._variables.expand(instance.options.get(command["name"], None)) if new_value is not None: self._execute_non_device_command(instance, command, new_value) def _execute_all_device_commands(self, instance, devices): for command in [command for command in list(self._commands.values()) if command["per_device"]]: new_value = self._variables.expand(instance.options.get(command["name"], None)) if new_value is None: continue for device in devices: self._execute_device_command(instance, command, device, new_value) def _verify_all_non_device_commands(self, instance, ignore_missing): ret = True for command in [command for command in list(self._commands.values()) if not command["per_device"]]: new_value = self._variables.expand(instance.options.get(command["name"], None)) if new_value is not None: if self._verify_non_device_command(instance, command, new_value, ignore_missing) == False: ret = False return ret def _verify_all_device_commands(self, instance, devices, ignore_missing): ret = True for command in [command for command in list(self._commands.values()) if command["per_device"]]: new_value = instance.options.get(command["name"], None) if new_value is None: continue for device in devices: if self._verify_device_command(instance, command, device, new_value, ignore_missing) == False: ret = False return ret def _process_assignment_modifiers(self, new_value, current_value): if new_value is not None: nws = str(new_value) if len(nws) <= 1: return new_value op = nws[:1] val = nws[1:] if current_value is None: return val if op in ["<", ">"] else new_value try: if op == ">": if int(val) > int(current_value): return val else: return None elif op == "<": if int(val) < int(current_value): return val else: return None except ValueError: log.warn("cannot compare new value '%s' with current value '%s' by operator '%s', using '%s' directly as new value" % (val, current_value, op, new_value)) return new_value def _get_current_value(self, command, device = None, ignore_missing=False): if device is not None: return command["get"](device, ignore_missing=ignore_missing) else: return command["get"]() def _check_and_save_value(self, instance, command, device = None, new_value = None): current_value = self._get_current_value(command, device) new_value = self._process_assignment_modifiers(new_value, current_value) if new_value is not None and current_value is not None: self._storage_set(instance, command, current_value, device) return new_value def _execute_device_command(self, instance, command, device, new_value): if command["custom"] is not None: command["custom"](True, new_value, device, False, False) else: new_value = self._check_and_save_value(instance, command, device, new_value) if new_value is not None: command["set"](new_value, device, sim = False) def _execute_non_device_command(self, instance, command, new_value): if command["custom"] is not None: command["custom"](True, new_value, False, False) else: new_value = self._check_and_save_value(instance, command, None, new_value) if new_value is not None: command["set"](new_value, sim = False) def _norm_value(self, value): v = self._cmd.unquote(str(value)) if re.match(r'\s*(0+,?)+([\da-fA-F]*,?)*\s*$', v): return re.sub(r'^\s*(0+,?)+', "", v) return v def _verify_value(self, name, new_value, current_value, ignore_missing, device = None): if new_value is None: return None ret = False if current_value is None and ignore_missing: if device is None: log.info(consts.STR_VERIFY_PROFILE_VALUE_MISSING % name) else: log.info(consts.STR_VERIFY_PROFILE_DEVICE_VALUE_MISSING % (device, name)) return True if current_value is not None: current_value = self._norm_value(current_value) new_value = self._norm_value(new_value) try: ret = int(new_value) == int(current_value) except ValueError: try: ret = int(new_value, 16) == int(current_value, 16) except ValueError: ret = str(new_value) == str(current_value) if not ret: vals = str(new_value).split('|') for val in vals: val = val.strip() ret = val == current_value if ret: break self._log_verification_result(name, ret, new_value, current_value, device = device) return ret def _log_verification_result(self, name, success, new_value, current_value, device = None): if success: if device is None: log.info(consts.STR_VERIFY_PROFILE_VALUE_OK % (name, str(current_value).strip())) else: log.info(consts.STR_VERIFY_PROFILE_DEVICE_VALUE_OK % (device, name, str(current_value).strip())) return True else: if device is None: log.error(consts.STR_VERIFY_PROFILE_VALUE_FAIL % (name, str(current_value).strip(), str(new_value).strip())) else: log.error(consts.STR_VERIFY_PROFILE_DEVICE_VALUE_FAIL % (device, name, str(current_value).strip(), str(new_value).strip())) return False def _verify_device_command(self, instance, command, device, new_value, ignore_missing): if command["custom"] is not None: return command["custom"](True, new_value, device, True, ignore_missing) current_value = self._get_current_value(command, device, ignore_missing=ignore_missing) new_value = self._process_assignment_modifiers(new_value, current_value) if new_value is None: return None new_value = command["set"](new_value, device, True) return self._verify_value(command["name"], new_value, current_value, ignore_missing, device) def _verify_non_device_command(self, instance, command, new_value, ignore_missing): if command["custom"] is not None: return command["custom"](True, new_value, True, ignore_missing) current_value = self._get_current_value(command) new_value = self._process_assignment_modifiers(new_value, current_value) if new_value is None: return None new_value = command["set"](new_value, True) return self._verify_value(command["name"], new_value, current_value, ignore_missing) def _cleanup_all_non_device_commands(self, instance): for command in reversed([command for command in list(self._commands.values()) if not command["per_device"]]): if (instance.options.get(command["name"], None) is not None) or (command["name"] in self._options_used_by_dynamic): self._cleanup_non_device_command(instance, command) def _cleanup_all_device_commands(self, instance, devices): for command in reversed([command for command in list(self._commands.values()) if command["per_device"]]): if (instance.options.get(command["name"], None) is not None) or (command["name"] in self._options_used_by_dynamic): for device in devices: self._cleanup_device_command(instance, command, device) def _cleanup_device_command(self, instance, command, device): if command["custom"] is not None: command["custom"](False, None, device, False, False) else: old_value = self._storage_get(instance, command, device) if old_value is not None: command["set"](old_value, device, sim = False) self._storage_unset(instance, command, device) def _cleanup_non_device_command(self, instance, command): if command["custom"] is not None: command["custom"](False, None, False, False) else: old_value = self._storage_get(instance, command) if old_value is not None: command["set"](old_value, sim = False) self._storage_unset(instance, command) PK[ؽX> > *site-packages/tuned/plugins/plugin_usb.pyonu[ \c@snddlmZddlTddlZddlmZddlZejj Z dej fdYZ dS(i(tbase(t*iN(tcommandst USBPlugincBs}eZdZdZdZedZdZdZdZ e dde d Z e ded ZRS( s7 Plugin for tuning various options of USB subsystem. cCsmt|_t|_t|_x9|jjdjddD]}|jj|j q@Wt |_ dS(NtusbtDEVTYPEt usb_device( tTruet_devices_supportedtsett _free_devicest_assigned_devicest_hardware_inventoryt get_devicestmatch_propertytaddtsys_nameRt_cmd(tselftdevice((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt _init_devicess    %cCs&g|D]}|jjd|^qS(NR(R t get_device(Rtdevicestx((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_get_device_objectsscCs idd6S(Nt autosuspend(tNone(R((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_get_config_optionsscCst|_t|_dS(N(Rt_has_static_tuningtFalset_has_dynamic_tuning(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_instance_init!s cCsdS(N((RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_instance_cleanup%scCsd|S(Ns)/sys/bus/usb/devices/%s/power/autosuspend((RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_autosuspend_sysfile(sRt per_devicecCs`|j|}|dkrdS|r+dnd}|s\|j|}|jj||n|S(Nt1t0(t _option_boolRR"Rt write_to_file(RtvalueRtsimtenabletvaltsys_file((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_set_autosuspend+s cCs+|j|}|jj|d|jS(Ntno_error(R"Rt read_filetstrip(RRtignore_missingR,((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_get_autosuspend7s(t__name__t __module__t__doc__RRt classmethodRR R!R"t command_setRR-t command_getRR2(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyR s     ( tRt decoratorst tuned.logsttunedttuned.utils.commandsRtglobtlogstgettlogtPluginR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyts    PK[-^<==1site-packages/tuned/plugins/plugin_bootloader.pycnu[ \c@sddlmZddlTddlZddlmZddlmZddlj Z ddl Z ddl Z ddl Z ej jZdejfdYZdS( i(tbase(t*iN(t exceptions(tcommandstBootloaderPlugincBseZdZdZdZdZedZdZdZ dZ dZ e d Z d Zd Zd Zd ZdZdZdZdZdZdZdZdZeddZeddZeddZedde ddd Zed!de ddd"Zed#de ddd$Z d%Z!RS(&s Plugin for tuning bootloader options. Currently only grub2 is supported and reboot is required to apply the tunings. These tunings are unloaded only on profile change followed by reboot. cOsPtjjtjs'tjdntt|j ||t |_ dS(Ns4Required GRUB2 template not found, disabling plugin.( tostpathtisfiletconststGRUB2_TUNED_TEMPLATE_PATHRtNotSupportedPluginExceptiontsuperRt__init__Rt_cmd(tselftargstkwargs((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyR scCsRt|_t|_t|_t|_d|_d|_d|_ |j |_ dS(Nt( tFalset_has_dynamic_tuningtTruet_has_static_tuningtupdate_grub2_cfgt_initrd_remove_dirtNonet_initrd_dst_img_valt _cmdline_valt _initrd_valt_get_grub2_cfg_filest_grub2_cfg_file_names(Rtinstance((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_inits       cCsdS(N((RR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_cleanup'scCs.idd6dd6dd6dd6dd6dd6S(Ntgrub2_cfg_filetinitrd_dst_imgtinitrd_add_imgtinitrd_add_dirtinitrd_remove_dirtcmdline(R(tcls((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_get_config_options*sc Cs|jj}g}xm|D]e}t|jdrJ|j|q||krg||||tS|jddkrutjjtj|j|_qundS(NRiR( RR-RRRRRRR(RRRRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_dst_imgsR%cCs>|r dS|r:|dk r:|jj|dk|_ndS(Nt1(RR tget_boolR(RRRRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyR sR#t per_devicetpriorityi cCs_|r dS|r[|dk r[t|}|j||dkrEtS|j|s[tSndS(NR(RR-RRR(RRRRRtsrc_img((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_add_imgs   R$c Csv|r dS|rr|dk rrt|}|j||dkrEtStjj|sltjd|tStj d|t j dddd\}}tj d|tj ||jjd |d |d t\}} tj d | |d kr%tjd|jj|dttS|j||jj||jrrtj d||jj|qrndS(NRsFerror: cannot create initrd image, source directory '%s' doesn't exists+generating initrd image from directory '%s'tprefixstuned-bootloader-tsuffixs.tmps+writing initrd image to temporary file '%s'sfind . | cpio -co > %stcwdtshells cpio log: %siserror generating initrd imagetno_errorsremoving directory '%s'(RR-RRRRRR0terrorRMttempfiletmkstempRZtcloseR R}RRRRRtrmtree( RRRRRtsrc_dirtfdttmpfileRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_initrd_add_dir s2    (    R&c Cs|jj|jj|}|r|jjd}t|dkrLdSt|j}t|j}|j |} | |krt j t j dt|ftSt jt jdt| t|ftSn|r|dk rt j dt|_||_ndS(Ns /proc/cmdlineiR&s;installing additional boot command line parameters to grub2(t _variablestexpandR tunquoteRjRlRR{R6t intersectionR0RMRtSTR_VERIFY_PROFILE_VALUE_OKR-RRtSTR_VERIFY_PROFILE_VALUE_FAILRRR( RRRRRtvR&t cmdline_sett value_settcmdline_intersect((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_cmdline>s"  )  cCs3|r/|jr/|j|jt|_ndS(N(RRxRR(RRR((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyt_instance_post_staticSs  ("R3t __module__t__doc__R RR t classmethodR(RCRRKRSRRXR`RgRqRwRxRzRVRRRRRtcommand_customRRRRRRR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyRs:               ! !!(RRt decoratorst tuned.logsttunedRttuned.utils.commandsRt tuned.constsRRR7RtlogstgetR0tPluginR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/plugin_bootloader.pyts     PK[&.site-packages/tuned/plugins/plugin_modules.pycnu[ \c@sddlZddlZddlmZddlTddlZddlTddl m Z ddl j Z ej jZdejfdYZdS(iNi(tbase(t*(tcommandst ModulesPlugincBsbeZdZdZdZdZdZdZdZdZ e dZ d Z RS( s6 Plugin for applying custom kernel modules options. cOs2tt|j||t|_t|_dS(N(tsuperRt__init__tTruet_has_dynamic_optionsRt_cmd(tselftargstkwargs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyRs cCs"t|_t|_|j|_dS(N(tFalset_has_dynamic_tuningRt_has_static_tuningtoptionst_modules(R tinstance((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_inits  cCsdS(N((R R((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_cleanupscCsx|D]}|jjdd|g\}}|dkrKtjddS|dkrwtjd||jfn|jjd|g\}}|dkrtjd||jfqqWdS(Ntmodprobes-risN'modprobe' command not found, cannot reload kernel modules, reboot is requireds$cannot remove kernel module '%s': %ss:cannot insert/reinsert module '%s', reboot is required: %s(Rtexecutetlogtwarntdebugtstrip(R tmodulestmoduletretcodetout((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_reload_moduless !     c Cs|jd}d}t}g}xOt|jjD]8\}}|jj|}|jj|} |s|jjd|g\}} |dkrt }t j dq|dkrt j d|qn|s|dkr8t | dkr-| dd!dkr-tjd d| } |j|nt | dkr\|d |d | d 7}qpt jd |q8q8W|jjtj|t |} | dkr|j|t |j| krt jtjqndS(Ntitmodinfos8'modinfo' command not found, not checking kernel moduless)kernel module '%s' not found, skipping itiis+rs^\s*\+r\s*,?\s*soptions t s sKmodule '%s' doesn't have any option specified, not writing it to modprobe.d(t_clear_modprobe_fileR tlistRtitemst _variablestexpandRRRRRterrortlentretsubtappendRt write_to_filetconstst MODULES_FILERtinfotSTR_HINT_REBOOT( R RtsRt skip_checkt reload_listtoptiontvalueRtvRtl((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_apply_static*s8 "  %   cCst|jddS(Nt/R(tstrtreplace(R tpath((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt _unquote_pathIsc Cst}t}tjd}xht|jjD]Q\}}|jj|}|jj|} tjdd| } d|} t j j | st }t jtjd|q1t jtjd||j| } x| D]} | jd} t| dkr"t jd || fq|j| d | d |jj| d |j| d d ddt|t krt }qqWq1W|S(Ns\s+s^\s*\+r\s*,?\s*Rs/sys/module/%ssmodule '%s' is not loadedsmodule '%s' is loadedt=is.unrecognized module option for module '%s': %siis /parameters/terr_rettno_error(RR)tcompileR#RR$R%R&R*tosR<texistsR RR'R-tSTR_VERIFY_PROFILE_FAILR/tSTR_VERIFY_PROFILE_OKtsplitR(Rt _verify_valueRt read_fileR=tNone(R Rtignore_missingtdevicestrettrR4R5RR6tmpathR7titemtarg((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_verify_staticLs,"  0cCs|r|jndS(N(R"(R Rt full_rollback((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_unapply_staticgscCs|jjtjdt}|jd}d}}t|}tjd}xB||kr|j ||dkr|}|}n|d7}qRWdj |d|!}t|dkr|d7}n|jj tj|dS(NR@s is^\s*#i( RRHR-R.RRFR(R)RAtsearchRItjoinR,(R R1R7titjtllRM((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyR"ks    ( t__name__t __module__t__doc__RRRRR8R=RQR RSR"(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyR s       (R)tos.pathRBRRt decoratorst tuned.logsttunedt subprocessttuned.utils.commandsRt tuned.constsR-tlogstgetRtPluginR(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyts     PK[[ztt,site-packages/tuned/plugins/plugin_audio.pycnu[ \c@sddlmZddlTddlZddlmZddlZddlZddl Z ej j Z eZ dejfdYZdS(i(tbase(t*iN(tcommandst AudioPlugincBseZdZdZdZdZdZedZdZ dZ e dd e d Z eded Ze d d e d Zed edZRS(s Plugin for tuning audio cards powersaving options. Power management is supported per module, not device. From this reason, we take kernel module names as device names. cCsyt|_t|_t|_xQ|jjdjdD]4}|j|}|dkr=|jj |q=q=WdS(Ntsoundscard*t snd_hda_inteltsnd_ac97_codec(RR( tTruet_devices_supportedtsett_assigned_devicest _free_devicest_hardware_inventoryt get_devicestmatch_sys_namet_device_module_nametadd(tselftdevicet module_name((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _init_devicess   " cCst|_t|_dS(N(Rt_has_static_tuningtFalset_has_dynamic_tuning(Rtinstance((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_instance_inits cCsdS(N((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_instance_cleanup#scCsy|jjSWndSXdS(N(tparenttdrivertNone(RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyR&scCsidd6td6S(Nittimeouttreset_controller(R(tcls((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_get_config_options,scCsd|S(Ns$/sys/module/%s/parameters/power_save((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _timeout_path3scCsd|S(Ns//sys/module/%s/parameters/power_save_controller((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_reset_controller_path6sRt per_devicecCszyt|}Wn#tk r5tjd|dSX|dkrr|j|}|sntj|d|n|SdSdS(Ns!timeout value '%s' is not integeris%d(tintt ValueErrortlogterrorRR"tcmdt write_to_file(RtvalueRtsimRtsys_file((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _set_timeout9s  cCs>|j|}tj|d|}t|dkr:|SdS(Ntno_errori(R"R)t read_filetlenR(RRtignore_missingR-R+((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _get_timeoutHs RcCsQtj|}|j|}tjj|rM|sItj||n|SdS(N(R)tget_boolR#tostpathtexistsR*R(RR+RR,tvR-((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_set_reset_controllerPscCsV|j|}tjj|rRtj|}t|dkrRtj|SndS(Ni( R#R5R6R7R)R0R1R4R(RRR2R-R+((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_get_reset_controllerZs (t__name__t __module__t__doc__RRRRt classmethodR!R"R#t command_setRR.t command_getRR3R9R:(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyR s       (tRt decoratorst tuned.logsttunedttuned.utils.commandsRR5tstructtglobtlogstgetR'R)tPluginR(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyts      PK[| ,site-packages/tuned/plugins/plugin_script.pynu[import tuned.consts as consts from . import base import tuned.logs import os from subprocess import Popen, PIPE log = tuned.logs.get() class ScriptPlugin(base.Plugin): """ Plugin for running custom scripts with profile activation and deactivation. """ @classmethod def _get_config_options(self): return { "script" : None, } def _instance_init(self, instance): instance._has_static_tuning = True instance._has_dynamic_tuning = False if instance.options["script"] is not None: # FIXME: this hack originated from profiles merger assert isinstance(instance.options["script"], list) instance._scripts = instance.options["script"] else: instance._scripts = [] def _instance_cleanup(self, instance): pass def _call_scripts(self, scripts, arguments): ret = True for script in scripts: environ = os.environ environ.update(self._variables.get_env()) log.info("calling script '%s' with arguments '%s'" % (script, str(arguments))) log.debug("using environment '%s'" % str(list(environ.items()))) try: proc = Popen([script] + arguments, \ stdout=PIPE, stderr=PIPE, \ close_fds=True, env=environ, \ universal_newlines = True, \ cwd = os.path.dirname(script)) out, err = proc.communicate() if len(err): log.error("script '%s' error output: '%s'" % (script, err[:-1])) if proc.returncode: log.error("script '%s' returned error code: %d" % (script, proc.returncode)) ret = False except (OSError,IOError) as e: log.error("script '%s' error: %s" % (script, e)) ret = False return ret def _instance_apply_static(self, instance): super(ScriptPlugin, self)._instance_apply_static(instance) self._call_scripts(instance._scripts, ["start"]) def _instance_verify_static(self, instance, ignore_missing, devices): ret = True if super(ScriptPlugin, self)._instance_verify_static(instance, ignore_missing, devices) == False: ret = False args = ["verify"] if ignore_missing: args += ["ignore_missing"] if self._call_scripts(instance._scripts, args) == True: log.info(consts.STR_VERIFY_PROFILE_OK % instance._scripts) else: log.error(consts.STR_VERIFY_PROFILE_FAIL % instance._scripts) ret = False return ret def _instance_unapply_static(self, instance, full_rollback = False): args = ["stop"] if full_rollback: args = args + ["full_rollback"] self._call_scripts(reversed(instance._scripts), args) super(ScriptPlugin, self)._instance_unapply_static(instance, full_rollback) PK[$}}.site-packages/tuned/plugins/plugin_systemd.pyonu[ \c@sddlmZddlTddlZddlmZddlmZddlj Z ddl Z ddl Z ej j ZdejfdYZdS( i(tbase(t*iN(t exceptions(tcommandst SystemdPlugincBseZdZdZdZdZedZdZdZ dZ dZ d Z d Z d Zed Zd ZeddedZRS(sn Plugin for tuning systemd options. These tunings are unloaded only on profile change followed by reboot. cOsWtjjtjs.tjdtjntt|j ||t |_ dS(NsERequired systemd '%s' configuration file not found, disabling plugin.( tostpathtisfiletconststSYSTEMD_SYSTEM_CONF_FILERtNotSupportedPluginExceptiontsuperRt__init__Rt_cmd(tselftargstkwargs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyR scCst|_t|_dS(N(tFalset_has_dynamic_tuningtTruet_has_static_tuning(Rtinstance((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_instance_inits cCsdS(N((RR((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_instance_cleanupscCs idd6S(Nt cpu_affinity(tNone(tcls((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_get_config_options!scCs^|dk rZtjd|d|dtj}|dk rZ|jdkrZ|jdSndS(Ns^\s*s \s*=\s*(.*)$tflagsi(Rtretsearcht MULTILINEt lastindextgroup(Rtconftkeytmo((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt _get_keyval's  #cCstjd|ddt||dtj\}}|dkry!|ddkrb|d7}nWntk rvnX||dt|d7}|S|S( Ns^(\s*s\s*=).*$s\g<1>Riis t=(RtsubntstrRt IndexError(RR"R#tvaltconf_newtnsubs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt _add_keyval/s6  cCs$tjd|dd|dtjS(Ns^\s*s\s*=.*\ntR(RtsubR(RR"R#((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_del_key;scCs<|jjtjdd}|dkr8tjddS|S(Nterr_rets(error reading systemd configuration file(R t read_fileRR Rtlogterror(Rtsystemd_system_conf((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_read_systemd_system_conf>s   cCstjtj}|jj||sLtjd|jj|dtt S|jj |tjstjdtj|jj|dtt StS(Ns(error writing systemd configuration filetno_errors/error replacing systemd configuration file '%s'( RR tTMP_FILE_SUFFIXR t write_to_fileR3R4tunlinkRRtrename(RR"ttmpfile((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_write_systemd_system_confEs cCstjjtj|jS(N(RRtjoinRtPERSISTENT_STORAGE_DIRtname(R((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_get_storage_filenameSscCs|j}|dk r|j}|jj|dddt}|jj||dkrv|j|tj }n|j |tj |}|j |ndS(NR1R7( R6RRAR R2RR:R0RtSYSTEMD_CPUAFFINITY_VARR-R=(RR"tfnametcpu_affinity_saved((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_remove_systemd_tuningVs    cCs8|r4tjdtj|jtjdndS(Ns6removing '%s' systemd tuning previously added by Tuneds[you may need to manualy run 'dracut -f' to update the systemd configuration in initrd image(R3tinfoRRBREtconsole(RRt full_rollback((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_instance_unapply_staticbs c CsQ|dkrdSdjd|jjtjddtjdd|DS(NR.t css|]}t|VqdS(N(R((t.0tv((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pys lss\s+t,s,\s+(RR>R tcpulist_unpackRR/(Rtcpulist((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_cpulist_convert_unpackis Rt per_devicec Csld}d}|jj|jj|jj|}djd|jj|D}|j} | dk r|j | t j }|j |}n|r|j d|||S|rh|j} |jj| dddt} |dk r&| dkr&||kr&|jj| |dtntjdt j |t jf|j|j| t j |ndS(NRJcss|]}t|VqdS(N(R((RKRL((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pys ssRR1R7tmakedirs setting '%s' to '%s' in the '%s'(RR tunescapet _variablestexpandtunquoteR>RNR6R%RRBRPt _verify_valueRAR2RR9R3RFR R=R-( Rtenablingtvaluetverifytignore_missingt conf_affinitytconf_affinity_unpackedRLt v_unpackedR"RCRD((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyt_cmdlinens"*%   $ (t__name__t __module__t__doc__R RRt classmethodRR%R-R0R6R=RARERRIRPtcommand_customR_(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyR s          (R.Rt decoratorst tuned.logsttunedRttuned.utils.commandsRt tuned.constsRRRtlogstgetR3tPluginR(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_systemd.pyts    PK[?nOcc)site-packages/tuned/plugins/exceptions.pynu[import tuned.exceptions class NotSupportedPluginException(tuned.exceptions.TunedException): pass PK[g *site-packages/tuned/plugins/repository.pyonu[ \c@sZddlmZddlZddlZejjZdgZdefdYZ dS(i(t PluginLoaderNt RepositorycBs;eZdZedZdZdZdZRS(c Csktt|jt|_||_||_||_||_||_ ||_ ||_ ||_ dS(N( tsuperRt__init__tsett_pluginst_monitor_repositoryt_storage_factoryt_hardware_inventoryt_device_matchert_device_matcher_udevt_plugin_instance_factoryt _global_cfgt _variables( tselftmonitor_repositorytstorage_factorythardware_inventorytdevice_matchertdevice_matcher_udevtplugin_instance_factoryt global_cfgt variables((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyR s        cCs|jS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pytpluginsscCs(d|_d|_tjjj|_dS(Ns tuned.pluginstplugin_(t _namespacet_prefixttunedRtbasetPlugint _interface(R((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyt_set_loader_parameterss  c Csmtjd||j|}||j|j|j|j|j|j|j |j }|j j ||S(Nscreating plugin %s( tlogtdebugt load_pluginRRRR R R R R Rtadd(Rt plugin_namet plugin_clstplugin_instance((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pytcreate s cCs/tjd||j|jj|dS(Nsremoving plugin %s(R R!tcleanupRtremove(Rtplugin((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pytdelete(s (t__name__t __module__RtpropertyRRR'R+(((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyR s    ( ttuned.utils.plugin_loaderRttuned.plugins.baseRt tuned.logstlogstgetR t__all__R(((s</usr/lib/python2.7/site-packages/tuned/plugins/repository.pyts    PK[eNmm-site-packages/tuned/plugins/plugin_mounts.pyonu[ \c@sddljZddlmZddlTddlmZmZddlZ ddl m Z ddl Z e j jZe ZdejfdYZdS( iNi(tbase(t*(tPopentPIPE(tcommandst MountsPlugincBseZdZedZdZedZdZdZdZ dZ dZ d Z e d d ed ZRS( s. Plugin for tuning options of mount-points. c Csi}d}tdddgdtdtdtdtj\}}x-g|jD]}|j^qUD]}t|dkrqkn|d \}}} t|dkr|dnd} t|d kr|d nd} |d kr| }qkn|d ksk|dkrqkn| dksk| dkr4qkn|j| it d6| d6| d6|| dj |qkW||_ dS(s Gets the information about disks, partitions and mountpoints. Stores information about used filesystem and creates a list of all underlying devices (in case of LVM) for each mountpoint. tlsblks-rnosTYPE,RM,KNAME,FSTYPE,MOUNTPOINTtstdouttstderrt close_fdstuniversal_newlinesiitdiskt1tparttlvms[SWAP]tdiskst device_namet filesystemN(R R( tNoneRRtTruet communicatet splitlinestsplittlent setdefaulttsettaddt_mountpoint_topology( tclstmountpoint_topologyt current_diskRRtlinetcolumnst device_typetdevice_removableRRt mountpoint((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_generate_mountpoint_topologys,  ,"" (cCs;|jt|_t|jj|_t|_dS(N(R$Rt_devices_supportedRRtkeyst _free_devicest_assigned_devices(tself((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt _init_devices5s  cCs idd6S(Ntdisable_barriers(R(R)((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_get_config_options;scCst|_t|_dS(N(tFalset_has_dynamic_tuningRt_has_static_tuning(R)tinstance((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_instance_initAs cCsdS(N((R)R0((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_instance_cleanupEscCs8tjd|}x|D]}tj|jSWdS(sV Get device cache type. This will work only for devices on SCSI kernel subsystem. s+/sys/block/%s/device/scsi_disk/*/cache_typeN(tglobtcmdt read_filetstripR(R)tdevicetsource_filenamestsource_filename((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_get_device_cache_typeHs cCs9x2|j|dD]}|j|dkrtSqWtS(sr Checks if the device has 'write back' cache. If the cache type cannot be determined, asume some other cache. Rs write back(RR:RR-(R)R#R7((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_mountpoint_has_writeback_cacheQsc Cstd`}xV|D]J}|j}|dddkrBqn|d|kr|d}PqqWdSWdQX|jd}xb|D]V}|jd\}} } |d ks|d kr| d krtS|d krtSqWtSdS( sP Checks if a given mountpoint is mounted with barriers enabled or disabled. s /proc/mountsit/iiNt,t=t nobarriertbarriert0(topenRRt partitionR-R( R)R#t mounts_fileRR t option_listtoptionstoptiontnametseptvalue((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_mountpoint_has_barriersZs"     $ cCs'd|dd|g}tj|dS(s Remounts partition. s/usr/bin/mounts-os remount,%sN(R4texecute(R)RCRFtremount_command((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_remount_partitionwsR+t per_devicec Cs|jddd|}t|jdk}|pB|j|}|rp|sUdSd}|j|djds~d}n| r|j|rd}nu|j|} | dkrd }nQ| t kr|rt j t j |tSd }n|rt jt j|t S|dk r9t j d ||fdS|jj|| t j d ||j|d n]|rzdS|jj|} | dkrdSt j d||j|d|jj|dS(Nt command_nameR+RtforceRtextsfilesystem not supportedsdevice uses write back cachesunknown current settingsbarriers already disableds#not disabling barriers on '%s' (%s)sdisabling barriers on '%s's barrier=0senabling barriers on '%s's barrier=1(t _storage_keytstrtlowert _option_boolRRt startswithR;RKR-tlogtinfotconststSTR_VERIFY_PROFILE_OKRterrortSTR_VERIFY_PROFILE_FAILt_storageRRNtgettunset( R)tstartRJR#tverifytignore_missingt storage_keyRQt reject_reasontoriginal_value((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_disable_barriers~sN          (t__name__t __module__t__doc__t classmethodR$R*R,R1R2R:R;RKRNtcommand_customRRg(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyR s$     (t tuned.constsRZtRt decoratorst subprocessRRt tuned.logsttunedttuned.utils.commandsRR3tlogsR_RXR4tPluginR(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyts    PK[(_y]11'site-packages/tuned/plugins/__init__.pynu[from .repository import * from . import instance PK[II-site-packages/tuned/plugins/plugin_systemd.pynu[from . import base from .decorators import * import tuned.logs from . import exceptions from tuned.utils.commands import commands import tuned.consts as consts import os import re log = tuned.logs.get() class SystemdPlugin(base.Plugin): """ Plugin for tuning systemd options. These tunings are unloaded only on profile change followed by reboot. """ def __init__(self, *args, **kwargs): if not os.path.isfile(consts.SYSTEMD_SYSTEM_CONF_FILE): raise exceptions.NotSupportedPluginException("Required systemd '%s' configuration file not found, disabling plugin." % consts.SYSTEMD_SYSTEM_CONF_FILE) super(SystemdPlugin, self).__init__(*args, **kwargs) self._cmd = commands() def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True def _instance_cleanup(self, instance): pass @classmethod def _get_config_options(cls): return { "cpu_affinity": None, } def _get_keyval(self, conf, key): if conf is not None: mo = re.search(r"^\s*" + key + r"\s*=\s*(.*)$", conf, flags = re.MULTILINE) if mo is not None and mo.lastindex == 1: return mo.group(1) return None # add/replace key with the value def _add_keyval(self, conf, key, val): (conf_new, nsubs) = re.subn(r"^(\s*" + key + r"\s*=).*$", r"\g<1>" + str(val), conf, flags = re.MULTILINE) if nsubs < 1: try: if conf[-1] != "\n": conf += "\n" except IndexError: pass conf += key + "=" + str(val) + "\n" return conf return conf_new def _del_key(self, conf, key): return re.sub(r"^\s*" + key + r"\s*=.*\n", "", conf, flags = re.MULTILINE) def _read_systemd_system_conf(self): systemd_system_conf = self._cmd.read_file(consts.SYSTEMD_SYSTEM_CONF_FILE, err_ret = None) if systemd_system_conf is None: log.error("error reading systemd configuration file") return None return systemd_system_conf def _write_systemd_system_conf(self, conf): tmpfile = consts.SYSTEMD_SYSTEM_CONF_FILE + consts.TMP_FILE_SUFFIX if not self._cmd.write_to_file(tmpfile, conf): log.error("error writing systemd configuration file") self._cmd.unlink(tmpfile, no_error = True) return False # Atomic replace, this doesn't work on Windows (AFAIK there is no way on Windows how to do this # atomically), but it's unlikely this code will run there if not self._cmd.rename(tmpfile, consts.SYSTEMD_SYSTEM_CONF_FILE): log.error("error replacing systemd configuration file '%s'" % consts.SYSTEMD_SYSTEM_CONF_FILE) self._cmd.unlink(tmpfile, no_error = True) return False return True def _get_storage_filename(self): return os.path.join(consts.PERSISTENT_STORAGE_DIR, self.name) def _remove_systemd_tuning(self): conf = self._read_systemd_system_conf() if (conf is not None): fname = self._get_storage_filename() cpu_affinity_saved = self._cmd.read_file(fname, err_ret = None, no_error = True) self._cmd.unlink(fname) if cpu_affinity_saved is None: conf = self._del_key(conf, consts.SYSTEMD_CPUAFFINITY_VAR) else: conf = self._add_keyval(conf, consts.SYSTEMD_CPUAFFINITY_VAR, cpu_affinity_saved) self._write_systemd_system_conf(conf) def _instance_unapply_static(self, instance, full_rollback = False): if full_rollback: log.info("removing '%s' systemd tuning previously added by Tuned" % consts.SYSTEMD_CPUAFFINITY_VAR) self._remove_systemd_tuning() log.console("you may need to manualy run 'dracut -f' to update the systemd configuration in initrd image") # convert cpulist from systemd syntax to Tuned syntax and unpack it def _cpulist_convert_unpack(self, cpulist): if cpulist is None: return "" return " ".join(str(v) for v in self._cmd.cpulist_unpack(re.sub(r"\s+", r",", re.sub(r",\s+", r",", cpulist)))) @command_custom("cpu_affinity", per_device = False) def _cmdline(self, enabling, value, verify, ignore_missing): conf_affinity = None conf_affinity_unpacked = None v = self._cmd.unescape(self._variables.expand(self._cmd.unquote(value))) v_unpacked = " ".join(str(v) for v in self._cmd.cpulist_unpack(v)) conf = self._read_systemd_system_conf() if conf is not None: conf_affinity = self._get_keyval(conf, consts.SYSTEMD_CPUAFFINITY_VAR) conf_affinity_unpacked = self._cpulist_convert_unpack(conf_affinity) if verify: return self._verify_value("cpu_affinity", v_unpacked, conf_affinity_unpacked, ignore_missing) if enabling: fname = self._get_storage_filename() cpu_affinity_saved = self._cmd.read_file(fname, err_ret = None, no_error = True) if conf_affinity is not None and cpu_affinity_saved is None and v_unpacked != conf_affinity_unpacked: self._cmd.write_to_file(fname, conf_affinity, makedir = True) log.info("setting '%s' to '%s' in the '%s'" % (consts.SYSTEMD_CPUAFFINITY_VAR, v_unpacked, consts.SYSTEMD_SYSTEM_CONF_FILE)) self._write_systemd_system_conf(self._add_keyval(conf, consts.SYSTEMD_CPUAFFINITY_VAR, v_unpacked)) PK[&.site-packages/tuned/plugins/plugin_modules.pyonu[ \c@sddlZddlZddlmZddlTddlZddlTddl m Z ddl j Z ej jZdejfdYZdS(iNi(tbase(t*(tcommandst ModulesPlugincBsbeZdZdZdZdZdZdZdZdZ e dZ d Z RS( s6 Plugin for applying custom kernel modules options. cOs2tt|j||t|_t|_dS(N(tsuperRt__init__tTruet_has_dynamic_optionsRt_cmd(tselftargstkwargs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyRs cCs"t|_t|_|j|_dS(N(tFalset_has_dynamic_tuningRt_has_static_tuningtoptionst_modules(R tinstance((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_inits  cCsdS(N((R R((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_cleanupscCsx|D]}|jjdd|g\}}|dkrKtjddS|dkrwtjd||jfn|jjd|g\}}|dkrtjd||jfqqWdS(Ntmodprobes-risN'modprobe' command not found, cannot reload kernel modules, reboot is requireds$cannot remove kernel module '%s': %ss:cannot insert/reinsert module '%s', reboot is required: %s(Rtexecutetlogtwarntdebugtstrip(R tmodulestmoduletretcodetout((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_reload_moduless !     c Cs|jd}d}t}g}xOt|jjD]8\}}|jj|}|jj|} |s|jjd|g\}} |dkrt }t j dq|dkrt j d|qn|s|dkr8t | dkr-| dd!dkr-tjd d| } |j|nt | dkr\|d |d | d 7}qpt jd |q8q8W|jjtj|t |} | dkr|j|t |j| krt jtjqndS(Ntitmodinfos8'modinfo' command not found, not checking kernel moduless)kernel module '%s' not found, skipping itiis+rs^\s*\+r\s*,?\s*soptions t s sKmodule '%s' doesn't have any option specified, not writing it to modprobe.d(t_clear_modprobe_fileR tlistRtitemst _variablestexpandRRRRRterrortlentretsubtappendRt write_to_filetconstst MODULES_FILERtinfotSTR_HINT_REBOOT( R RtsRt skip_checkt reload_listtoptiontvalueRtvRtl((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_apply_static*s8 "  %   cCst|jddS(Nt/R(tstrtreplace(R tpath((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt _unquote_pathIsc Cst}t}tjd}xht|jjD]Q\}}|jj|}|jj|} tjdd| } d|} t j j | st }t jtjd|q1t jtjd||j| } x| D]} | jd} t| dkr"t jd || fq|j| d | d |jj| d |j| d d ddt|t krt }qqWq1W|S(Ns\s+s^\s*\+r\s*,?\s*Rs/sys/module/%ssmodule '%s' is not loadedsmodule '%s' is loadedt=is.unrecognized module option for module '%s': %siis /parameters/terr_rettno_error(RR)tcompileR#RR$R%R&R*tosR<texistsR RR'R-tSTR_VERIFY_PROFILE_FAILR/tSTR_VERIFY_PROFILE_OKtsplitR(Rt _verify_valueRt read_fileR=tNone(R Rtignore_missingtdevicestrettrR4R5RR6tmpathR7titemtarg((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_verify_staticLs,"  0cCs|r|jndS(N(R"(R Rt full_rollback((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyt_instance_unapply_staticgscCs|jjtjdt}|jd}d}}t|}tjd}xB||kr|j ||dkr|}|}n|d7}qRWdj |d|!}t|dkr|d7}n|jj tj|dS(NR@s is^\s*#i( RRHR-R.RRFR(R)RAtsearchRItjoinR,(R R1R7titjtllRM((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyR"ks    ( t__name__t __module__t__doc__RRRRR8R=RQR RSR"(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyR s       (R)tos.pathRBRRt decoratorst tuned.logsttunedt subprocessttuned.utils.commandsRt tuned.constsR-tlogstgetRtPluginR(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_modules.pyts     PK[_JZ Z /site-packages/tuned/plugins/plugin_scsi_host.pynu[import errno from . import hotplug from .decorators import * import tuned.logs import tuned.consts as consts from tuned.utils.commands import commands import os import re log = tuned.logs.get() class SCSIHostPlugin(hotplug.Plugin): """ Plugin for tuning options of SCSI hosts. """ def __init__(self, *args, **kwargs): super(SCSIHostPlugin, self).__init__(*args, **kwargs) self._cmd = commands() def _init_devices(self): super(SCSIHostPlugin, self)._init_devices() self._devices_supported = True self._free_devices = set() for device in self._hardware_inventory.get_devices("scsi"): if self._device_is_supported(device): self._free_devices.add(device.sys_name) self._assigned_devices = set() def _get_device_objects(self, devices): return [self._hardware_inventory.get_device("scsi", x) for x in devices] @classmethod def _device_is_supported(cls, device): return device.device_type == "scsi_host" def _hardware_events_init(self): self._hardware_inventory.subscribe(self, "scsi", self._hardware_events_callback) def _hardware_events_cleanup(self): self._hardware_inventory.unsubscribe(self) def _hardware_events_callback(self, event, device): if self._device_is_supported(device): super(SCSIHostPlugin, self)._hardware_events_callback(event, device) def _added_device_apply_tuning(self, instance, device_name): super(SCSIHostPlugin, self)._added_device_apply_tuning(instance, device_name) def _removed_device_unapply_tuning(self, instance, device_name): super(SCSIHostPlugin, self)._removed_device_unapply_tuning(instance, device_name) @classmethod def _get_config_options(cls): return { "alpm" : None, } def _instance_init(self, instance): instance._has_static_tuning = True instance._has_dynamic_tuning = False def _instance_cleanup(self, instance): pass def _get_alpm_policy_file(self, device): return os.path.join("/sys/class/scsi_host/", str(device), "link_power_management_policy") @command_set("alpm", per_device = True) def _set_alpm(self, policy, device, sim): if policy is None: return None policy_file = self._get_alpm_policy_file(device) if not sim: if os.path.exists(policy_file): self._cmd.write_to_file(policy_file, policy) else: log.info("ALPM control file ('%s') not found, skipping ALPM setting for '%s'" % (policy_file, str(device))) return None return policy @command_get("alpm") def _get_alpm(self, device, ignore_missing=False): policy_file = self._get_alpm_policy_file(device) policy = self._cmd.read_file(policy_file, no_error = True).strip() return policy if policy != "" else None PK[,site-packages/tuned/plugins/plugin_sysfs.pyonu[ \c@sddlmZddlZddlZddlZddlTddlZddl Tddl m Z ej j ZdejfdYZdS(i(tbaseiN(t*(tcommandst SysfsPlugincBsbeZdZdZdZdZdZdZedZ dZ dZ d Z RS( sR Plugin for applying custom sysfs options, using specific plugins is preferred. cOs2tt|j||t|_t|_dS(N(tsuperRt__init__tTruet_has_dynamic_optionsRt_cmd(tselftargstkwargs((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyRs cCsjt|_t|_tgt|jjD]&}tj j |d|df^q+|_ i|_ dS(Nii( tFalset_has_dynamic_tuningRt_has_static_tuningtdicttlisttoptionstitemstostpathtnormpatht_sysfst_sysfs_original(R tinstancet key_value((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_inits  KcCsdS(N((R R((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_cleanupscCsxt|jjD]\}}|jj|}x`tj|D]O}|j|r|j||j |<|j ||qDt j d|qDWqWdS(Ns)rejecting write to '%s' (not inside /sys)( RRRt _variablestexpandtglobtiglobt _check_sysfst _read_sysfsRt _write_sysfstlogterror(R Rtkeytvaluetvtf((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_apply_static"s"c Cst}xt|jjD]\}}|jj|}x_tj|D]N}|j|rJ|j |} |j ||| |t krt }qqJqJWqW|S(N( RRRRRRRRR R!t _verify_valueR ( R Rtignore_missingtdevicestretR%R&R'R(tcurr_val((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_verify_static,s"cCs:x3t|jjD]\}}|j||qWdS(N(RRRR"(R Rt full_rollbackR%R&((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyt_instance_unapply_static7s"cCstjd|S(Ns^/sys/.*(tretmatch(R t sysfs_file((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR ;scCsE|jj|j}t|dkr=|jj|tSdSdS(Ni(Rt read_filetstriptlentget_active_optionR tNone(R R4tdata((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR!>scCs|jj||S(N(Rt write_to_file(R R4R&((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR"Es( t__name__t __module__t__doc__RRRR)R/R R1R R!R"(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyR s      (tRRR2tos.pathRt decoratorst tuned.logsttunedt subprocessttuned.utils.commandsRtlogstgetR#tPluginR(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysfs.pyts      PK[S: : +site-packages/tuned/plugins/plugin_video.pynu[from . import base from .decorators import * import tuned.logs from tuned.utils.commands import commands import os import re log = tuned.logs.get() class VideoPlugin(base.Plugin): """ Plugin for tuning powersave options for some graphic cards. """ def _init_devices(self): self._devices_supported = True self._free_devices = set() self._assigned_devices = set() # FIXME: this is a blind shot, needs testing for device in self._hardware_inventory.get_devices("drm").match_sys_name("card*").match_property("DEVTYPE", "drm_minor"): self._free_devices.add(device.sys_name) self._cmd = commands() def _get_device_objects(self, devices): return [self._hardware_inventory.get_device("drm", x) for x in devices] @classmethod def _get_config_options(self): return { "radeon_powersave" : None, } def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True def _instance_cleanup(self, instance): pass def _radeon_powersave_files(self, device): return { "method" : "/sys/class/drm/%s/device/power_method" % device, "profile": "/sys/class/drm/%s/device/power_profile" % device, "dpm_state": "/sys/class/drm/%s/device/power_dpm_state" % device } @command_set("radeon_powersave", per_device=True) def _set_radeon_powersave(self, value, device, sim): sys_files = self._radeon_powersave_files(device) va = str(re.sub(r"(\s*:\s*)|(\s+)|(\s*;\s*)|(\s*,\s*)", " ", value)).split() if not os.path.exists(sys_files["method"]): if not sim: log.warn("radeon_powersave is not supported on '%s'" % device) return None for v in va: if v in ["default", "auto", "low", "mid", "high"]: if not sim: if (self._cmd.write_to_file(sys_files["method"], "profile") and self._cmd.write_to_file(sys_files["profile"], v)): return v elif v == "dynpm": if not sim: if (self._cmd.write_to_file(sys_files["method"], "dynpm")): return "dynpm" # new DPM profiles, recommended to use if supported elif v in ["dpm-battery", "dpm-balanced", "dpm-performance"]: if not sim: state = v[len("dpm-"):] if (self._cmd.write_to_file(sys_files["method"], "dpm") and self._cmd.write_to_file(sys_files["dpm_state"], state)): return v else: if not sim: log.warn("Invalid option for radeon_powersave.") return None return None @command_get("radeon_powersave") def _get_radeon_powersave(self, device, ignore_missing = False): sys_files = self._radeon_powersave_files(device) method = self._cmd.read_file(sys_files["method"], no_error=ignore_missing).strip() if method == "profile": return self._cmd.read_file(sys_files["profile"]).strip() elif method == "dynpm": return method elif method == "dpm": return "dpm-" + self._cmd.read_file(sys_files["dpm_state"]).strip() else: return None PK[AIh .site-packages/tuned/plugins/plugin_selinux.pyonu[ \c@s~ddlZddlmZddlTddlZddlmZddlm Z ej j Z dej fdYZdS( iNi(tbase(t*(t exceptions(tcommandst SelinuxPlugincBsqeZdZedZdZedZdZdZe ddZ e ddZ RS( s& Plugin for tuning SELinux options. cCs@d}tjj|s<d}tjj|s<d}q<n|S(Ns/sys/fs/selinuxs/selinux(tostpathtexiststNone(tselfR((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_get_selinux_paths  cOswt|_|j|_|jdkr<tjdntjj |jdd|_ t t |j ||dS(NsFSELinux is not enabled on your system or incompatible version is used.tavctcache_threshold(Rt_cmdR t _selinux_pathRRtNotSupportedPluginExceptionRRtjoint_cache_threshold_pathtsuperRt__init__(R targstkwargs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyRs  cCs idd6S(Ntavc_cache_threshold(R(R ((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_get_config_options scCst|_t|_dS(N(tTruet_has_static_tuningtFalset_has_dynamic_tuning(R tinstance((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_instance_init&s cCsdS(N((R R((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_instance_cleanup*sRcCsS|dkrdSt|}|dkrK|sG|jj|j|n|SdSdS(Ni(RtintR t write_to_fileR(R tvaluetsimt threshold((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_set_avc_cache_threshold-s   cCs5|jj|j}t|dkr1t|SdS(Ni(R t read_fileRtlenRR(R R!((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_get_avc_cache_threshold9s ( t__name__t __module__t__doc__t classmethodR RRRRt command_setR$t command_getR'(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyR s    (RtRt decoratorst tuned.logsttunedt tuned.pluginsRttuned.utils.commandsRtlogstgettlogtPluginR(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyts   PK[[fBB*site-packages/tuned/plugins/plugin_net.pycnu[ \c@sddlmZddlTddlZddlmZddlmZddl Z ddl Z ej j Z dZdejfd YZdS( i(tbase(t*iN(tethcard(tcommandstpumbagsdtNetTuningPlugincBseZdZdZdZdZdZdZdZdZ e dZ e d Z e d Z e d Zd Zd ZdZdZdZdZdZe dZeddedZededZeddZeddZdZdZ dZ!dZ"dZ#d*d Z%d!Z&e'd"ded#Z(e'd$ded%Z)e'd&ded'Z*e'd(ded)Z+RS(+s, Plugin for ethernet card options tuning. cOs;tt|j||d|_d|_t|_dS(Ng?i(tsuperRt__init__t_load_smallestt _level_stepsRt_cmd(tselftargstkwargs((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyRs  cCst|_t|_t|_tjd}xB|jjdD].}|j |j rC|jj |j qCqCWt jdt|jdS(Ns(?!.*/virtual/.*)tnets devices: %s(tTruet_devices_supportedtsett _free_devicest_assigned_devicestretcompilet_hardware_inventoryt get_devicestmatcht device_pathtaddtsys_nametlogtdebugtstr(R tre_not_virtualtdevice((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt _init_devicess   cCs&g|D]}|jjd|^qS(NR(Rt get_device(R tdevicestx((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_get_device_objects$scCst|_|j|jdrXt|_|jjd|j|_i|_ i|_ n$t |_d|_d|_ d|_ dS(NtdynamicR( Rt_has_static_tuningt _option_booltoptionst_has_dynamic_tuningt_monitors_repositorytcreatetassigned_devicest _load_monitort_idlet_statstFalsetNone(R tinstance((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_instance_init's       cCs2|jdk r.|jj|jd|_ndS(N(R.R2R+tdelete(R R3((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_instance_cleanup4scCs|j||dS(N(t_instance_update_dynamic(R R3R ((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_instance_apply_dynamic9sc Csg|jj|D]}t|^q}|dkr;dS||jkr]|j||n|j||||j|||j|}|j|}|ddkr|d|j kr|d|j krd|ds,c Cs|j|d|j|d<}||j|dR?R@RfRXRrRwRxt command_setRRt command_getR1RRRRRRRRR2RRtcommand_customRRRR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR sH                  $(RRt decoratorst tuned.logsttunedttuned.utils.nettoolRttuned.utils.commandsRtosRtlogsRRR~tPluginR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyts    PK[6I2::)site-packages/tuned/plugins/plugin_vm.pycnu[ \c@sddlmZddlTddlZddlZddlZddlZddlm Z ej j Z e Z dejfdYZdS(i(tbase(t*iN(tcommandstVMPlugincBseZdZedZdZdZedZeddZ eddZ e dd Z e dd Z ed d Ze d d ZRS(s( Plugin for tuning memory management. cCsidd6dd6dd6S(Nttransparent_hugepagesttransparent_hugepagestransparent_hugepage.defrag(tNone(tself((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_get_config_optionsscCst|_t|_dS(N(tTruet_has_static_tuningtFalset_has_dynamic_tuning(Rtinstance((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_instance_inits cCsdS(N((RR ((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_instance_cleanupscCs%d}tjj|s!d}n|S(Ns#/sys/kernel/mm/transparent_hugepages*/sys/kernel/mm/redhat_transparent_hugepage(tostpathtexists(RR((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt _thp_path!s RcCs|d kr0|s,tjdt|ndStjddt}|jddkrt|sptjd ndSt j j |j d }t j j |r|stj||n|S|stjd ndSdS( Ntalwaystnevertmadvises-Incorrect 'transparent_hugepages' value '%s'.s /proc/cmdlinetno_errorstransparent_hugepage=isWtransparent_hugepage is already set in kernel boot cmdline, ingoring value from profiletenabledsDOption 'transparent_hugepages' is not supported on current hardware.(salwaysRR(tlogtwarntstrRtcmdt read_fileR tfindtinfoRRtjoinRRt write_to_file(Rtvaluetsimtcmdlinetsys_file((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_set_transparent_hugepages)s" RcCs|j||dS(N(R&(RR"R#((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_set_transparent_hugepageAscCsKtjj|jd}tjj|rCtjtj|SdSdS(NR( RRR RRRtget_active_optionRR(RR%((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_get_transparent_hugepagesEscCs |jS(N(R)(R((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_get_transparent_hugepageNsstransparent_hugepage.defragcCshtjj|jd}tjj|rJ|sFtj||n|S|s`tjdndSdS(NtdefragsJOption 'transparent_hugepage.defrag' is not supported on current hardware.( RRR RRRR!RRR(RR"R#R%((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt _set_transparent_hugepage_defragRscCsKtjj|jd}tjj|rCtjtj|SdSdS(NR+( RRR RRRR(RR(RR%((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt _get_transparent_hugepage_defrag^s(t__name__t __module__t__doc__t classmethodRRRRt command_setR&R't command_getR)R*R,R-(((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyR s    (tRt decoratorst tuned.logsttunedRtstructtglobttuned.utils.commandsRtlogstgetRRtPluginR(((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyts      PK[XX'site-packages/tuned/plugins/hotplug.pycnu[ \c@sWddlmZddljZddlZejjZdej fdYZ dS(i(tbaseiNtPlugincBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s: Base class for plugins with device hotpluging support. cOstt|j||dS(N(tsuperRt__init__(tselftargstkwargs((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR scCs!tt|j|jdS(N(RRtcleanupt_hardware_events_cleanup(R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyRscCs tdS(N(tNotImplementedError(R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyt_hardware_events_initscCs tdS(N(R (R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyRscCs|jdS(N(R (R((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyt _init_devicesscCsd|dkr0tjd|j|j|n0|dkr`tjd|j|j|ndS(Ntaddsdevice '%s' addedtremovesdevice '%s' removed(tlogtinfotsys_namet _add_devicet_remove_device(Rteventtdevice((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyt_hardware_events_callbacks   cCs|j}||j|jBkr#dSxt|jjD]\}}t|j||gdkr9tj d||f|jj ||j ||j d|g|j |||j ||jd|g|jj |Pq9q9Wtjd||jj |dS(Nis!instance %s: adding new device %stapplysno instance wants %s(Rt_assigned_devicest _free_devicestlistt _instancestitemstlent_get_matching_devicesRRR t_call_device_scriptt script_pret_added_device_apply_tuningt script_posttprocessed_devicestdebug(RRt device_namet instance_nametinstance((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR$s "!cCs|j}||j|jBkr#dSxt|jjD]}||jkr9|j||jd|g|j |||j||j d|g|jj |t |jt |j dk|_|jj |Pq9q9W|jj |dS(Ntunapplyi(RRRRRtvaluesR"RR!t_removed_device_unapply_tuningRR Rtassigned_devicestactive(RRR$R&((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR6s  cCsN|j||g|jrJ|jjtjtjrJ|j||ndS(N(t_execute_all_device_commandsthas_dynamic_tuningt _global_cfgtgettconststCFG_DYNAMIC_TUNINGtCFG_DEF_DYNAMIC_TUNINGt_instance_apply_dynamic(RR&R$((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR Js$cCsN|jr7|jjtjtjr7|j||n|j||gdS(N(R-R.R/R0R1R2t_instance_unapply_dynamict_cleanup_all_device_commands(RR&R$((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyR)Os$( t__name__t __module__t__doc__RRR RR RRRR R)(((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyRs         ( tRt tuned.constsR0t tuned.logsttunedtlogsR/RR(((s9/usr/lib/python2.7/site-packages/tuned/plugins/hotplug.pyts PK[ ,site-packages/tuned/plugins/plugin_video.pyonu[ \c@szddlmZddlTddlZddlmZddlZddlZej j Z dej fdYZ dS(i(tbase(t*iN(tcommandst VideoPlugincBs}eZdZdZdZedZdZdZdZ e dde d Z e ded ZRS( s? Plugin for tuning powersave options for some graphic cards. cCsvt|_t|_t|_xB|jjdjdjddD]}|jj |j qIWt |_ dS(Ntdrmscard*tDEVTYPEt drm_minor( tTruet_devices_supportedtsett _free_devicest_assigned_devicest_hardware_inventoryt get_devicestmatch_sys_nametmatch_propertytaddtsys_nameRt_cmd(tselftdevice((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt _init_devicess    .cCs&g|D]}|jjd|^qS(NR(R t get_device(Rtdevicestx((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_get_device_objectsscCs idd6S(Ntradeon_powersave(tNone(R((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_get_config_optionsscCst|_t|_dS(N(tFalset_has_dynamic_tuningRt_has_static_tuning(Rtinstance((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_instance_init#s cCsdS(N((RR ((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_instance_cleanup'scCs%id|d6d|d6d|d6S(Ns%/sys/class/drm/%s/device/power_methodtmethods&/sys/class/drm/%s/device/power_profiletprofiles(/sys/class/drm/%s/device/power_dpm_statet dpm_state((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_radeon_powersave_files*s  Rt per_devicecCst|j|}ttjdd|j}tjj|dsd|sdtj d|dSnx |D]}|dkr|sl|j j |dd r|j j |d |r|Sqlqk|d kr|sl|j j |dd rd Sqlqk|dkrR|sl|t d}|j j |ddrO|j j |d|rO|Sqlqk|shtj dndSqkWdS(Ns#(\s*:\s*)|(\s+)|(\s*;\s*)|(\s*,\s*)t R#s)radeon_powersave is not supported on '%s'tdefaulttautotlowtmidthighR$tdynpms dpm-batterys dpm-balancedsdpm-performancesdpm-tdpmR%s$Invalid option for radeon_powersave.(sdefaultR*R+R,R-(s dpm-batterys dpm-balancedsdpm-performance(R&tstrtretsubtsplittostpathtexiststlogtwarnRRt write_to_filetlen(RtvalueRtsimt sys_filestvatvtstate((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_set_radeon_powersave1s4!       cCs|j|}|jj|dd|j}|dkrW|jj|djS|dkrg|S|dkrd|jj|djSdSdS(NR#tno_errorR$R.R/sdpm-R%(R&Rt read_filetstripR(RRtignore_missingR=R#((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyt_get_radeon_powersavePs"   (t__name__t __module__t__doc__RRt classmethodRR!R"R&t command_setRRAt command_getRRF(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyR s     (tRt decoratorst tuned.logsttunedttuned.utils.commandsRR4R1tlogstgetR7tPluginR(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_video.pyts    PK[::-site-packages/tuned/plugins/plugin_selinux.pynu[import os from . import base from .decorators import * import tuned.logs from tuned.plugins import exceptions from tuned.utils.commands import commands log = tuned.logs.get() class SelinuxPlugin(base.Plugin): """ Plugin for tuning SELinux options. """ @classmethod def _get_selinux_path(self): path = "/sys/fs/selinux" if not os.path.exists(path): path = "/selinux" if not os.path.exists(path): path = None return path def __init__(self, *args, **kwargs): self._cmd = commands() self._selinux_path = self._get_selinux_path() if self._selinux_path is None: raise exceptions.NotSupportedPluginException("SELinux is not enabled on your system or incompatible version is used.") self._cache_threshold_path = os.path.join(self._selinux_path, "avc", "cache_threshold") super(SelinuxPlugin, self).__init__(*args, **kwargs) @classmethod def _get_config_options(self): return { "avc_cache_threshold" : None, } def _instance_init(self, instance): instance._has_static_tuning = True instance._has_dynamic_tuning = False def _instance_cleanup(self, instance): pass @command_set("avc_cache_threshold") def _set_avc_cache_threshold(self, value, sim): if value is None: return None threshold = int(value) if threshold >= 0: if not sim: self._cmd.write_to_file(self._cache_threshold_path, threshold) return threshold else: return None @command_get("avc_cache_threshold") def _get_avc_cache_threshold(self): value = self._cmd.read_file(self._cache_threshold_path) if len(value) > 0: return int(value) return None PK[U%33)site-packages/tuned/plugins/plugin_cpu.pynu[from . import base from .decorators import * import tuned.logs from tuned.utils.commands import commands import tuned.consts as consts import os import struct import errno import platform import procfs log = tuned.logs.get() # TODO: force_latency -> command # intel_pstate class CPULatencyPlugin(base.Plugin): """ Plugin for tuning CPU options. Powersaving, governor, required latency, etc. """ def __init__(self, *args, **kwargs): super(CPULatencyPlugin, self).__init__(*args, **kwargs) self._has_pm_qos = True self._arch = "x86_64" self._is_x86 = False self._is_intel = False self._is_amd = False self._has_energy_perf_bias = False self._has_intel_pstate = False self._min_perf_pct_save = None self._max_perf_pct_save = None self._no_turbo_save = None self._governors_map = {} self._cmd = commands() def _init_devices(self): self._devices_supported = True self._free_devices = set() # current list of devices for device in self._hardware_inventory.get_devices("cpu"): self._free_devices.add(device.sys_name) self._assigned_devices = set() def _get_device_objects(self, devices): return [self._hardware_inventory.get_device("cpu", x) for x in devices] @classmethod def _get_config_options(self): return { "load_threshold" : 0.2, "latency_low" : 100, "latency_high" : 1000, "force_latency" : None, "governor" : None, "sampling_down_factor" : None, "energy_perf_bias" : None, "min_perf_pct" : None, "max_perf_pct" : None, "no_turbo" : None, } def _check_arch(self): intel_archs = [ "x86_64", "i686", "i585", "i486", "i386" ] self._arch = platform.machine() if self._arch in intel_archs: # Possible other x86 vendors (from arch/x86/kernel/cpu/*): # "CentaurHauls", "CyrixInstead", "Geode by NSC", "HygonGenuine", "GenuineTMx86", # "TransmetaCPU", "UMC UMC UMC" cpu = procfs.cpuinfo() vendor = cpu.tags.get("vendor_id") if vendor is "GenuineIntel": self._is_intel = True elif vendor is "AuthenticAMD" or vendor is "HygonGenuine": self._is_amd = True else: # We always assign Intel, unless we know better self._is_intel = True log.info("We are running on an x86 %s platform" % vendor) else: log.info("We are running on %s (non x86)" % self._arch) if self._is_intel is True: # Check for x86_energy_perf_policy, ignore if not available / supported self._check_energy_perf_bias() # Check for intel_pstate self._check_intel_pstate() def _check_energy_perf_bias(self): self._has_energy_perf_bias = False retcode_unsupported = 1 retcode = self._cmd.execute(["x86_energy_perf_policy", "-r"], no_errors = [errno.ENOENT, retcode_unsupported])[0] if retcode == 0: self._has_energy_perf_bias = True elif retcode < 0: log.warning("unable to run x86_energy_perf_policy tool, ignoring CPU energy performance bias, is the tool installed?") else: log.warning("your CPU doesn't support MSR_IA32_ENERGY_PERF_BIAS, ignoring CPU energy performance bias") def _check_intel_pstate(self): self._has_intel_pstate = os.path.exists("/sys/devices/system/cpu/intel_pstate") if self._has_intel_pstate: log.info("intel_pstate detected") def _is_cpu_online(self, device): sd = str(device) return self._cmd.is_cpu_online(str(device).replace("cpu", "")) def _cpu_has_scaling_governor(self, device): return os.path.exists("/sys/devices/system/cpu/%s/cpufreq/scaling_governor" % device) def _check_cpu_can_change_governor(self, device): if not self._is_cpu_online(device): log.debug("'%s' is not online, skipping" % device) return False if not self._cpu_has_scaling_governor(device): log.debug("there is no scaling governor fo '%s', skipping" % device) return False return True def _instance_init(self, instance): instance._has_static_tuning = True instance._has_dynamic_tuning = False # only the first instance of the plugin can control the latency if list(self._instances.values())[0] == instance: instance._first_instance = True try: self._cpu_latency_fd = os.open(consts.PATH_CPU_DMA_LATENCY, os.O_WRONLY) except OSError: log.error("Unable to open '%s', disabling PM_QoS control" % consts.PATH_CPU_DMA_LATENCY) self._has_pm_qos = False self._latency = None if instance.options["force_latency"] is None: instance._load_monitor = self._monitors_repository.create("load", None) instance._has_dynamic_tuning = True else: instance._load_monitor = None self._check_arch() else: instance._first_instance = False log.info("Latency settings from non-first CPU plugin instance '%s' will be ignored." % instance.name) instance._first_device = list(instance.assigned_devices)[0] def _instance_cleanup(self, instance): if instance._first_instance: if self._has_pm_qos: os.close(self._cpu_latency_fd) if instance._load_monitor is not None: self._monitors_repository.delete(instance._load_monitor) def _get_intel_pstate_attr(self, attr): return self._cmd.read_file("/sys/devices/system/cpu/intel_pstate/%s" % attr, None).strip() def _set_intel_pstate_attr(self, attr, val): if val is not None: self._cmd.write_to_file("/sys/devices/system/cpu/intel_pstate/%s" % attr, val) def _getset_intel_pstate_attr(self, attr, value): if value is None: return None v = self._get_intel_pstate_attr(attr) self._set_intel_pstate_attr(attr, value) return v def _instance_apply_static(self, instance): super(CPULatencyPlugin, self)._instance_apply_static(instance) if not instance._first_instance: return force_latency_value = instance.options["force_latency"] if force_latency_value is not None: self._set_latency(force_latency_value) if self._has_intel_pstate: self._min_perf_pct_save = self._getset_intel_pstate_attr("min_perf_pct", instance.options["min_perf_pct"]) self._max_perf_pct_save = self._getset_intel_pstate_attr("max_perf_pct", instance.options["max_perf_pct"]) self._no_turbo_save = self._getset_intel_pstate_attr("no_turbo", instance.options["no_turbo"]) def _instance_unapply_static(self, instance, full_rollback = False): super(CPULatencyPlugin, self)._instance_unapply_static(instance, full_rollback) if instance._first_instance and self._has_intel_pstate: self._set_intel_pstate_attr("min_perf_pct", self._min_perf_pct_save) self._set_intel_pstate_attr("max_perf_pct", self._max_perf_pct_save) self._set_intel_pstate_attr("no_turbo", self._no_turbo_save) def _instance_apply_dynamic(self, instance, device): self._instance_update_dynamic(instance, device) def _instance_update_dynamic(self, instance, device): assert(instance._first_instance) if device != instance._first_device: return load = instance._load_monitor.get_load()["system"] if load < instance.options["load_threshold"]: self._set_latency(instance.options["latency_high"]) else: self._set_latency(instance.options["latency_low"]) def _instance_unapply_dynamic(self, instance, device): pass def _set_latency(self, latency): latency = int(latency) if self._has_pm_qos and self._latency != latency: log.info("setting new cpu latency %d" % latency) latency_bin = struct.pack("i", latency) os.write(self._cpu_latency_fd, latency_bin) self._latency = latency def _get_available_governors(self, device): return self._cmd.read_file("/sys/devices/system/cpu/%s/cpufreq/scaling_available_governors" % device).strip().split() @command_set("governor", per_device=True) def _set_governor(self, governors, device, sim): if not self._check_cpu_can_change_governor(device): return None governors = str(governors) governors = governors.split("|") governors = [governor.strip() for governor in governors] for governor in governors: if len(governor) == 0: log.error("The 'governor' option contains an empty value.") return None available_governors = self._get_available_governors(device) for governor in governors: if governor in available_governors: if not sim: log.info("setting governor '%s' on cpu '%s'" % (governor, device)) self._cmd.write_to_file("/sys/devices/system/cpu/%s/cpufreq/scaling_governor" % device, governor) break elif not sim: log.debug("Ignoring governor '%s' on cpu '%s', it is not supported" % (governor, device)) else: log.warn("None of the scaling governors is supported: %s" % ", ".join(governors)) governor = None return governor @command_get("governor") def _get_governor(self, device, ignore_missing=False): governor = None if not self._check_cpu_can_change_governor(device): return None data = self._cmd.read_file("/sys/devices/system/cpu/%s/cpufreq/scaling_governor" % device, no_error=ignore_missing).strip() if len(data) > 0: governor = data if governor is None: log.error("could not get current governor on cpu '%s'" % device) return governor def _sampling_down_factor_path(self, governor = "ondemand"): return "/sys/devices/system/cpu/cpufreq/%s/sampling_down_factor" % governor @command_set("sampling_down_factor", per_device = True, priority = 10) def _set_sampling_down_factor(self, sampling_down_factor, device, sim): val = None # hack to clear governors map when the profile starts unloading # TODO: this should be handled better way, by e.g. currently non-implemented # Plugin.profile_load_finished() method if device in self._governors_map: self._governors_map.clear() self._governors_map[device] = None governor = self._get_governor(device) if governor is None: log.debug("ignoring sampling_down_factor setting for CPU '%s', cannot match governor" % device) return None if governor not in list(self._governors_map.values()): self._governors_map[device] = governor path = self._sampling_down_factor_path(governor) if not os.path.exists(path): log.debug("ignoring sampling_down_factor setting for CPU '%s', governor '%s' doesn't support it" % (device, governor)) return None val = str(sampling_down_factor) if not sim: log.info("setting sampling_down_factor to '%s' for governor '%s'" % (val, governor)) self._cmd.write_to_file(path, val) return val @command_get("sampling_down_factor") def _get_sampling_down_factor(self, device, ignore_missing=False): governor = self._get_governor(device, ignore_missing=ignore_missing) if governor is None: return None path = self._sampling_down_factor_path(governor) if not os.path.exists(path): return None return self._cmd.read_file(path).strip() def _try_set_energy_perf_bias(self, cpu_id, value): (retcode, out, err_msg) = self._cmd.execute( ["x86_energy_perf_policy", "-c", cpu_id, str(value) ], return_err = True) return (retcode, err_msg) @command_set("energy_perf_bias", per_device=True) def _set_energy_perf_bias(self, energy_perf_bias, device, sim): if not self._is_cpu_online(device): log.debug("%s is not online, skipping" % device) return None if self._has_energy_perf_bias: if not sim: cpu_id = device.lstrip("cpu") vals = energy_perf_bias.split('|') for val in vals: val = val.strip() log.debug("Trying to set energy_perf_bias to '%s' on cpu '%s'" % (val, device)) (retcode, err_msg) = self._try_set_energy_perf_bias( cpu_id, val) if retcode == 0: log.info("energy_perf_bias successfully set to '%s' on cpu '%s'" % (val, device)) break elif retcode < 0: log.error("Failed to set energy_perf_bias: %s" % err_msg) break else: log.debug("Could not set energy_perf_bias to '%s' on cpu '%s', trying another value" % (val, device)) else: log.error("Failed to set energy_perf_bias on cpu '%s'. Is the value in the profile correct?" % device) return str(energy_perf_bias) else: return None def _try_parse_num(self, s): try: v = int(s) except ValueError as e: try: v = int(s, 16) except ValueError as e: v = s return v # Before Linux 4.13 def _energy_perf_policy_to_human(self, s): return {0:"performance", 6:"normal", 15:"powersave"}.get(self._try_parse_num(s), s) # Since Linux 4.13 def _energy_perf_policy_to_human_v2(self, s): return {0:"performance", 4:"balance-performance", 6:"normal", 8:"balance-power", 15:"power", }.get(self._try_parse_num(s), s) @command_get("energy_perf_bias") def _get_energy_perf_bias(self, device, ignore_missing=False): energy_perf_bias = None if not self._is_cpu_online(device): log.debug("%s is not online, skipping" % device) return None if self._has_energy_perf_bias: cpu_id = device.lstrip("cpu") retcode, lines = self._cmd.execute(["x86_energy_perf_policy", "-c", cpu_id, "-r"]) if retcode == 0: for line in lines.splitlines(): l = line.split() if len(l) == 2: energy_perf_bias = self._energy_perf_policy_to_human(l[1]) break elif len(l) == 3: energy_perf_bias = self._energy_perf_policy_to_human_v2(l[2]) break return energy_perf_bias PK[[fBB*site-packages/tuned/plugins/plugin_net.pyonu[ \c@sddlmZddlTddlZddlmZddlmZddl Z ddl Z ej j Z dZdejfd YZdS( i(tbase(t*iN(tethcard(tcommandstpumbagsdtNetTuningPlugincBseZdZdZdZdZdZdZdZdZ e dZ e d Z e d Z e d Zd Zd ZdZdZdZdZdZe dZeddedZededZeddZeddZdZdZ dZ!dZ"dZ#d*d Z%d!Z&e'd"ded#Z(e'd$ded%Z)e'd&ded'Z*e'd(ded)Z+RS(+s, Plugin for ethernet card options tuning. cOs;tt|j||d|_d|_t|_dS(Ng?i(tsuperRt__init__t_load_smallestt _level_stepsRt_cmd(tselftargstkwargs((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyRs  cCst|_t|_t|_tjd}xB|jjdD].}|j |j rC|jj |j qCqCWt jdt|jdS(Ns(?!.*/virtual/.*)tnets devices: %s(tTruet_devices_supportedtsett _free_devicest_assigned_devicestretcompilet_hardware_inventoryt get_devicestmatcht device_pathtaddtsys_nametlogtdebugtstr(R tre_not_virtualtdevice((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt _init_devicess   cCs&g|D]}|jjd|^qS(NR(Rt get_device(R tdevicestx((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_get_device_objects$scCst|_|j|jdrXt|_|jjd|j|_i|_ i|_ n$t |_d|_d|_ d|_ dS(NtdynamicR( Rt_has_static_tuningt _option_booltoptionst_has_dynamic_tuningt_monitors_repositorytcreatetassigned_devicest _load_monitort_idlet_statstFalsetNone(R tinstance((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_instance_init's       cCs2|jdk r.|jj|jd|_ndS(N(R.R2R+tdelete(R R3((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_instance_cleanup4scCs|j||dS(N(t_instance_update_dynamic(R R3R ((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyt_instance_apply_dynamic9sc Csg|jj|D]}t|^q}|dkr;dS||jkr]|j||n|j||||j|||j|}|j|}|ddkr|d|j kr|d|j krd|ds,c Cs|j|d|j|d<}||j|dR?R@RfRXRrRwRxt command_setRRt command_getR1RRRRRRRRR2RRtcommand_customRRRR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyR sH                  $(RRt decoratorst tuned.logsttunedttuned.utils.nettoolRttuned.utils.commandsRtosRtlogsRRR~tPluginR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_net.pyts    PK[B",site-packages/tuned/plugins/plugin_sysctl.pynu[import re from . import base from .decorators import * import tuned.logs from subprocess import * from tuned.utils.commands import commands import tuned.consts as consts import errno import os log = tuned.logs.get() DEPRECATED_SYSCTL_OPTIONS = [ "base_reachable_time", "retrans_time" ] SYSCTL_CONFIG_DIRS = [ "/run/sysctl.d", "/etc/sysctl.d" ] class SysctlPlugin(base.Plugin): """ Plugin for applying custom sysctl options. """ def __init__(self, *args, **kwargs): super(SysctlPlugin, self).__init__(*args, **kwargs) self._has_dynamic_options = True self._cmd = commands() def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True # FIXME: do we want to do this here? # recover original values in case of crash storage_key = self._storage_key(instance.name) instance._sysctl_original = self._storage.get(storage_key, {}) if len(instance._sysctl_original) > 0: log.info("recovering old sysctl settings from previous run") self._instance_unapply_static(instance) instance._sysctl_original = {} self._storage.unset(storage_key) instance._sysctl = instance.options def _instance_cleanup(self, instance): storage_key = self._storage_key(instance.name) self._storage.unset(storage_key) def _instance_apply_static(self, instance): for option, value in list(instance._sysctl.items()): original_value = _read_sysctl(option) if original_value is None: log.error("sysctl option %s will not be set, failed to read the original value." % option) else: new_value = self._variables.expand( self._cmd.unquote(value)) new_value = self._process_assignment_modifiers( new_value, original_value) if new_value is not None: instance._sysctl_original[option] = original_value _write_sysctl(option, new_value) storage_key = self._storage_key(instance.name) self._storage.set(storage_key, instance._sysctl_original) if self._global_cfg.get_bool(consts.CFG_REAPPLY_SYSCTL, consts.CFG_DEF_REAPPLY_SYSCTL): log.info("reapplying system sysctl") _apply_system_sysctl() def _instance_verify_static(self, instance, ignore_missing, devices): ret = True # override, so always skip missing ignore_missing = True for option, value in list(instance._sysctl.items()): curr_val = _read_sysctl(option) value = self._process_assignment_modifiers(self._variables.expand(value), curr_val) if value is not None: if self._verify_value(option, self._cmd.remove_ws(value), self._cmd.remove_ws(curr_val), ignore_missing) == False: ret = False return ret def _instance_unapply_static(self, instance, full_rollback = False): for option, value in list(instance._sysctl_original.items()): _write_sysctl(option, value) def _apply_system_sysctl(): files = {} for d in SYSCTL_CONFIG_DIRS: try: flist = os.listdir(d) except: continue for fname in flist: if not fname.endswith(".conf"): continue if fname not in files: files[fname] = d for fname in sorted(files.keys()): d = files[fname] path = "%s/%s" % (d, fname) _apply_sysctl_config_file(path) _apply_sysctl_config_file("/etc/sysctl.conf") def _apply_sysctl_config_file(path): log.debug("Applying sysctl settings from file %s" % path) try: with open(path, "r") as f: for lineno, line in enumerate(f, 1): _apply_sysctl_config_line(path, lineno, line) log.debug("Finished applying sysctl settings from file %s" % path) except (OSError, IOError) as e: if e.errno != errno.ENOENT: log.error("Error reading sysctl settings from file %s: %s" % (path, str(e))) def _apply_sysctl_config_line(path, lineno, line): line = line.strip() if len(line) == 0 or line[0] == "#" or line[0] == ";": return tmp = line.split("=", 1) if len(tmp) != 2: log.error("Syntax error in file %s, line %d" % (path, lineno)) return option, value = tmp option = option.strip() if len(option) == 0: log.error("Syntax error in file %s, line %d" % (path, lineno)) return value = value.strip() _write_sysctl(option, value, ignore_missing = True) def _get_sysctl_path(option): return "/proc/sys/%s" % option.replace(".", "/") def _read_sysctl(option): path = _get_sysctl_path(option) try: with open(path, "r") as f: line = "" for i, line in enumerate(f): if i > 0: log.error("Failed to read sysctl parameter '%s', multi-line values are unsupported" % option) return None value = line.strip() log.debug("Value of sysctl parameter '%s' is '%s'" % (option, value)) return value except (OSError, IOError) as e: if e.errno == errno.ENOENT: log.error("Failed to read sysctl parameter '%s', the parameter does not exist" % option) else: log.error("Failed to read sysctl parameter '%s': %s" % (option, str(e))) return None def _write_sysctl(option, value, ignore_missing = False): path = _get_sysctl_path(option) if os.path.basename(path) in DEPRECATED_SYSCTL_OPTIONS: log.error("Refusing to set deprecated sysctl option %s" % option) return False try: log.debug("Setting sysctl parameter '%s' to '%s'" % (option, value)) with open(path, "w") as f: f.write(value) return True except (OSError, IOError) as e: if e.errno == errno.ENOENT: log_func = log.debug if ignore_missing else log.error log_func("Failed to set sysctl parameter '%s' to '%s', the parameter does not exist" % (option, value)) else: log.error("Failed to set sysctl parameter '%s' to '%s': %s" % (option, value, str(e))) return False PK[ժ,site-packages/tuned/plugins/plugin_mounts.pynu[import tuned.consts as consts from . import base from .decorators import * from subprocess import Popen,PIPE import tuned.logs from tuned.utils.commands import commands import glob log = tuned.logs.get() cmd = commands() class MountsPlugin(base.Plugin): """ Plugin for tuning options of mount-points. """ @classmethod def _generate_mountpoint_topology(cls): """ Gets the information about disks, partitions and mountpoints. Stores information about used filesystem and creates a list of all underlying devices (in case of LVM) for each mountpoint. """ mountpoint_topology = {} current_disk = None stdout, stderr = Popen(["lsblk", "-rno", \ "TYPE,RM,KNAME,FSTYPE,MOUNTPOINT"], \ stdout=PIPE, stderr=PIPE, close_fds=True, \ universal_newlines = True).communicate() for columns in [line.split() for line in stdout.splitlines()]: if len(columns) < 3: continue device_type, device_removable, device_name = columns[:3] filesystem = columns[3] if len(columns) > 3 else None mountpoint = columns[4] if len(columns) > 4 else None if device_type == "disk": current_disk = device_name continue # skip removable, skip nonpartitions if device_removable == "1" or device_type not in ["part", "lvm"]: continue if mountpoint is None or mountpoint == "[SWAP]": continue mountpoint_topology.setdefault(mountpoint, {"disks": set(), "device_name": device_name, "filesystem": filesystem}) mountpoint_topology[mountpoint]["disks"].add(current_disk) cls._mountpoint_topology = mountpoint_topology def _init_devices(self): self._generate_mountpoint_topology() self._devices_supported = True self._free_devices = set(self._mountpoint_topology.keys()) self._assigned_devices = set() @classmethod def _get_config_options(self): return { "disable_barriers": None, } def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True def _instance_cleanup(self, instance): pass def _get_device_cache_type(self, device): """ Get device cache type. This will work only for devices on SCSI kernel subsystem. """ source_filenames = glob.glob("/sys/block/%s/device/scsi_disk/*/cache_type" % device) for source_filename in source_filenames: return cmd.read_file(source_filename).strip() return None def _mountpoint_has_writeback_cache(self, mountpoint): """ Checks if the device has 'write back' cache. If the cache type cannot be determined, asume some other cache. """ for device in self._mountpoint_topology[mountpoint]["disks"]: if self._get_device_cache_type(device) == "write back": return True return False def _mountpoint_has_barriers(self, mountpoint): """ Checks if a given mountpoint is mounted with barriers enabled or disabled. """ with open("/proc/mounts") as mounts_file: for line in mounts_file: # device mountpoint filesystem options dump check columns = line.split() if columns[0][0] != "/": continue if columns[1] == mountpoint: option_list = columns[3] break else: return None options = option_list.split(",") for option in options: (name, sep, value) = option.partition("=") # nobarrier barrier=0 if name == "nobarrier" or (name == "barrier" and value == "0"): return False # barrier barrier=1 elif name == "barrier": return True else: # default return True def _remount_partition(self, partition, options): """ Remounts partition. """ remount_command = ["/usr/bin/mount", partition, "-o", "remount,%s" % options] cmd.execute(remount_command) @command_custom("disable_barriers", per_device=True) def _disable_barriers(self, start, value, mountpoint, verify, ignore_missing): storage_key = self._storage_key( command_name = "disable_barriers", device_name = mountpoint) force = str(value).lower() == "force" value = force or self._option_bool(value) if start: if not value: return None reject_reason = None if not self._mountpoint_topology[mountpoint]["filesystem"].startswith("ext"): reject_reason = "filesystem not supported" elif not force and self._mountpoint_has_writeback_cache(mountpoint): reject_reason = "device uses write back cache" else: original_value = self._mountpoint_has_barriers(mountpoint) if original_value is None: reject_reason = "unknown current setting" elif original_value == False: if verify: log.info(consts.STR_VERIFY_PROFILE_OK % mountpoint) return True else: reject_reason = "barriers already disabled" elif verify: log.error(consts.STR_VERIFY_PROFILE_FAIL % mountpoint) return False if reject_reason is not None: log.info("not disabling barriers on '%s' (%s)" % (mountpoint, reject_reason)) return None self._storage.set(storage_key, original_value) log.info("disabling barriers on '%s'" % mountpoint) self._remount_partition(mountpoint, "barrier=0") else: if verify: return None original_value = self._storage.get(storage_key) if original_value is None: return None log.info("enabling barriers on '%s'" % mountpoint) self._remount_partition(mountpoint, "barrier=1") self._storage.unset(storage_key) return None PK[f<*site-packages/tuned/plugins/exceptions.pycnu[ \c@s,ddlZdejjfdYZdS(iNtNotSupportedPluginExceptioncBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/tuned/plugins/exceptions.pyRs(ttuned.exceptionsttunedt exceptionstTunedExceptionR(((s</usr/lib/python2.7/site-packages/tuned/plugins/exceptions.pyts PK[:(site-packages/tuned/plugins/__init__.pyonu[ \c@sddlTddlmZdS(i(t*(tinstanceN(t repositorytR(((s:/usr/lib/python2.7/site-packages/tuned/plugins/__init__.pyts PK[eNmm-site-packages/tuned/plugins/plugin_mounts.pycnu[ \c@sddljZddlmZddlTddlmZmZddlZ ddl m Z ddl Z e j jZe ZdejfdYZdS( iNi(tbase(t*(tPopentPIPE(tcommandst MountsPlugincBseZdZedZdZedZdZdZdZ dZ dZ d Z e d d ed ZRS( s. Plugin for tuning options of mount-points. c Csi}d}tdddgdtdtdtdtj\}}x-g|jD]}|j^qUD]}t|dkrqkn|d \}}} t|dkr|dnd} t|d kr|d nd} |d kr| }qkn|d ksk|dkrqkn| dksk| dkr4qkn|j| it d6| d6| d6|| dj |qkW||_ dS(s Gets the information about disks, partitions and mountpoints. Stores information about used filesystem and creates a list of all underlying devices (in case of LVM) for each mountpoint. tlsblks-rnosTYPE,RM,KNAME,FSTYPE,MOUNTPOINTtstdouttstderrt close_fdstuniversal_newlinesiitdiskt1tparttlvms[SWAP]tdiskst device_namet filesystemN(R R( tNoneRRtTruet communicatet splitlinestsplittlent setdefaulttsettaddt_mountpoint_topology( tclstmountpoint_topologyt current_diskRRtlinetcolumnst device_typetdevice_removableRRt mountpoint((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_generate_mountpoint_topologys,  ,"" (cCs;|jt|_t|jj|_t|_dS(N(R$Rt_devices_supportedRRtkeyst _free_devicest_assigned_devices(tself((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt _init_devices5s  cCs idd6S(Ntdisable_barriers(R(R)((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_get_config_options;scCst|_t|_dS(N(tFalset_has_dynamic_tuningRt_has_static_tuning(R)tinstance((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_instance_initAs cCsdS(N((R)R0((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_instance_cleanupEscCs8tjd|}x|D]}tj|jSWdS(sV Get device cache type. This will work only for devices on SCSI kernel subsystem. s+/sys/block/%s/device/scsi_disk/*/cache_typeN(tglobtcmdt read_filetstripR(R)tdevicetsource_filenamestsource_filename((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_get_device_cache_typeHs cCs9x2|j|dD]}|j|dkrtSqWtS(sr Checks if the device has 'write back' cache. If the cache type cannot be determined, asume some other cache. Rs write back(RR:RR-(R)R#R7((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_mountpoint_has_writeback_cacheQsc Cstd`}xV|D]J}|j}|dddkrBqn|d|kr|d}PqqWdSWdQX|jd}xb|D]V}|jd\}} } |d ks|d kr| d krtS|d krtSqWtSdS( sP Checks if a given mountpoint is mounted with barriers enabled or disabled. s /proc/mountsit/iiNt,t=t nobarriertbarriert0(topenRRt partitionR-R( R)R#t mounts_fileRR t option_listtoptionstoptiontnametseptvalue((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_mountpoint_has_barriersZs"     $ cCs'd|dd|g}tj|dS(s Remounts partition. s/usr/bin/mounts-os remount,%sN(R4texecute(R)RCRFtremount_command((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_remount_partitionwsR+t per_devicec Cs|jddd|}t|jdk}|pB|j|}|rp|sUdSd}|j|djds~d}n| r|j|rd}nu|j|} | dkrd }nQ| t kr|rt j t j |tSd }n|rt jt j|t S|dk r9t j d ||fdS|jj|| t j d ||j|d n]|rzdS|jj|} | dkrdSt j d||j|d|jj|dS(Nt command_nameR+RtforceRtextsfilesystem not supportedsdevice uses write back cachesunknown current settingsbarriers already disableds#not disabling barriers on '%s' (%s)sdisabling barriers on '%s's barrier=0senabling barriers on '%s's barrier=1(t _storage_keytstrtlowert _option_boolRRt startswithR;RKR-tlogtinfotconststSTR_VERIFY_PROFILE_OKRterrortSTR_VERIFY_PROFILE_FAILt_storageRRNtgettunset( R)tstartRJR#tverifytignore_missingt storage_keyRQt reject_reasontoriginal_value((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyt_disable_barriers~sN          (t__name__t __module__t__doc__t classmethodR$R*R,R1R2R:R;RKRNtcommand_customRRg(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyR s$     (t tuned.constsRZtRt decoratorst subprocessRRt tuned.logsttunedttuned.utils.commandsRR3tlogsR_RXR4tPluginR(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_mounts.pyts    PK[d9Z?d:Z@d;ZAd<ZBRS(>s Base class for all plugins. Plugins change various system settings in order to get desired performance or power saving. Plugins use Monitor objects to get information from the running system. Intentionally a lot of logic is included in the plugin to increase plugin flexibility. c Cs|j|jj|_||_||_||_||_||_t j |_ |j ||_ ||_t|_t|_|j|_t|_dS(sPlugin constructor.N(tcreatet __class__t__name__t_storaget_monitors_repositoryt_hardware_inventoryt_device_matchert_device_matcher_udevt_instance_factoryt collectionst OrderedDictt _instancest_init_commandst _global_cfgt _variablestFalset_has_dynamic_optionst_devices_initedt#_get_config_options_used_by_dynamict_options_used_by_dynamicRt_cmd( tselftmonitors_repositorytstorage_factorythardware_inventorytdevice_matchertdevice_matcher_udevtinstance_factoryt global_cfgt variables((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt__init__s          cCs|jdS(N(tdestroy_instances(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytcleanup,scCs#|js|jt|_ndS(N(Rt _init_devicestTrue(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt init_devices/s  cCs'|jjjddjdddS(Nt.it_i(Rt __module__tsplit(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytname4scCsiS(s-Default configuration options for the plugin.((R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_config_options<scCsiS(s*Explanation of each config option function((tcls((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytget_config_options_hintsAscCsgS(snList of config options used by dynamic tuning. Their previous values will be automatically saved and restored.((R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRFscCsj|jj}xQ|D]I}||ks4|jrE||||t|tkr|St|j}|dkp=|dkS(Nttruet1(ttypetbooltstrtlower(Rtvalue((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _option_boolVsc Csf||jkr"td|n|j|}|jj|||||||}||j|<|S(s8Create new instance of the plugin and seize the devices.s.Plugin instance with name '%s' already exists.(Rt ExceptionR6R R( RR,tdevices_expressiontdevices_udev_regext script_pret script_postR3teffective_optionstinstance((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytcreate_instance`s cCs{|j|kr(td||fn|j|jkrMtd|n|j|j}|j||j|j=dS(sDestroy existing instance.s9Plugin instance '%s' does not belong to this plugin '%s'.s+Plugin instance '%s' was already destroyed.N(t_pluginR?R,Rt_destroy_instance(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytdestroy_instancels cCs.tjd|j|jf|j|dS(sInitialize an instance.sinitializing instance %s (%s)N(R1tdebugR,t_instance_init(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinitialize_instancewscCs[xGt|jjD]0}tjd|j|jf|j|qW|jjdS(sDestroy all instances.sdestroying instance %s (%s)N(tlistRtvaluesR1RJR,RHtclear(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR#|scCs|j||j|dS(N(trelease_devicest_instance_cleanup(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRHs cCs tdS(N(tNotImplementedError(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRKscCs tdS(N(RR(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRQscCs%t|_t|_t|_dS(N(Rt_devices_supportedtsett_assigned_devicest _free_devices(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR%s  cCsdS(sOverride this in a subclass to transform a list of device names (e.g. ['sda']) to a list of pyudev.Device objects, if your plugin supports itN(tNone(Rtdevices((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_device_objectsscCs|jdkr+t|jj|j|S|j|}|dkr`tjd|j tS|j j|j|}tg|D]}|j ^qSdS(Ns<Plugin '%s' does not support the 'devices_udev_regex' option( RARWRTR t match_listR@RYR1terrorR,R tsys_name(RRERXt udev_devicestx((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_matching_devicess cCs|js dStjd|j|j||j}t|dk|_|jsktjd|jn}|j}|j|jkr|d|j7}ntj d|dj |f|j j ||j |O_ |j|8_dS(Ns assigning devices to instance %sis*instance %s: no matching devices availables (%s)s!instance %s: assigning devices %ss, (RSR1RJR,R_RVtlentactiveR2tinfotjointassigned_devicestupdateRU(RREt to_assignR,((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytassign_free_devicess    cCsi|js dS|j|jB|j@}t|_|jj|jj|j|8_|j|O_dS(N(RStprocessed_devicesRdRURRaRORV(RREt to_release((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRPs     cCs7|jsdg}nx|D]}|||qWdS(N(RSRW(RREtcallbackRXtdevice((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_run_for_each_devices   cCsdS(N((RREtenabling((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_instance_pre_staticscCsdS(N((RRERm((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_instance_post_staticscCs|dkrdSt|dkr@tjd|j|fdS|jdsdtjddtStj j |}t }xR|D]J}tj } | j |jj|g} |r| jdn| j|tjd|t| ftjdtt| jyt|g| d td td t d | d |dt } | j\} } | jrtjd|| j| d ft}nWqttfk r}tjd||ft}qXqW|S(Nis1Instance '%s': no device to call script '%s' for.t/s<Relative paths cannot be used in script_pre or script_post. sUse ${i:PROFILE_DIR}.t full_rollbacks'calling script '%s' with arguments '%s'susing environment '%s'tstdouttstderrt close_fdstenvtcwdtuniversal_newlinessscript '%s' error: %d, '%s'isscript '%s' error: %s(RWR`R1R2R,t startswithR[RtostpathtdirnameR&tenvironReRtget_envtappendRbR;RJRMtitemsRRt communicatet returncodetOSErrortIOError(RREtscripttopRXRqtdir_nametrettdevR|t argumentstproctoutterrte((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_call_device_scriptsB      #   ! cCs|js dS|jr~|j||jd|j|j|t|j||j|t|j||j d|jn|j r|j j t jt jr|j||j|jn|jj|j|jjdS(sG Apply static and dynamic tuning if the plugin instance is active. Ntapply(Rathas_static_tuningRRBRdRnR&t_instance_apply_staticRoRCthas_dynamic_tuningRtgettconststCFG_DYNAMIC_TUNINGtCFG_DEF_DYNAMIC_TUNINGRlt_instance_apply_dynamicRhReRO(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_apply_tunings    $cCs|js dSt|jdkrBtjddj|jn|jj}|j r|j ||j d|t krt S|j |||t krt S|j ||jd|t krt StSdSdS(s< Verify static tuning if the plugin instance is active. is)BUG: Some devices have not been tuned: %ss, tverifyN(RaRWR`RdR1R[RcRhR0RRRBRt_instance_verify_staticRCR&(RREtignore_missingRX((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_verify_tunings   !!cCsW|js dS|jrS|jjtjtjrS|j||j|j j ndS(s< Apply dynamic tuning if the plugin instance is active. N( RaRRRRRRRlt_instance_update_dynamicRhR0(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_update_tuning$s $cCs|jr@|jjtjtjr@|j||j|jn|j r|j ||j d|jd||j |t |j|||j|t |j ||jd|jd|ndS(s8 Remove all tunings applied by the plugin instance. tunapplyRqN(RRRRRRRlt_instance_unapply_dynamicRhRRRCRnRt_instance_unapply_staticRoRB(RRERq((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_unapply_tuning-s$  cCs$|j||j||jdS(N(t _execute_all_non_device_commandst_execute_all_device_commandsRd(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR<s cCsOt}|j||tkr't}n|j|||tkrKt}n|S(N(R&t_verify_all_non_device_commandsRt_verify_all_device_commands(RRERRXR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR@s   cCs$|j||j|j|dS(N(t_cleanup_all_device_commandsRht _cleanup_all_non_device_commands(RRERq((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRHs  cCswx`g|jD].}|j||j||dkr |^q D] }|j||j||q?W|j||dS(N(Rt _storage_gett _commandsRWt_check_and_save_valueR(RRERktopttoption((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRMsEcCs tdS(N(RR(RRERk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRSscCs tdS(N(RR(RRERk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRVscCs'tj|_|j|jdS(s Initialize commands. N(R RRt_autoregister_commandst_check_commands(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR]s cCs\x%|jjD]}|jdr(q nt||}t|dsLq n|jd}|jj|i|d6}d|jkrd |d<||d<|jd|d<|jd|dd|jkr||d<|jd|d<|jd|dsN(Rt__dict__RxtgetattrthasattrRRRRWR RtsortedtiterR(Rt member_nametmembert command_nameRb((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRes*     cCsmxft|jjD]O\}}|jdtr:qnd|ksRd|krtd|qqWdS(s2 Check if all commands are defined correctly. RRRTs,Plugin command '%s' is not defined correctlyN(RMRRRRt TypeError(RRtcommand((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs "cCskt|j}|dkr!dn|}|dkr9dn|}|dkrQdn|}d||||fS(Nts %s/%s/%s/%s(R9RRW(Rt instance_nameRt device_namet class_name((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _storage_keys  cCs3|j|j|d|}|jj||dS(NR,(RR,RRT(RRERR=RR5((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _storage_setscCs,|j|j|d|}|jj|S(NR,(RR,RR(RRERRR5((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRscCs,|j|j|d|}|jj|S(NR,(RR,Rtunset(RRERRR5((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_storage_unsetscCsxgt|jjD]}|ds|^qD]M}|jj|jj|dd}|dk r3|j|||q3q3WdS(NRR,( RMRRNRtexpandR3RRWt_execute_non_device_command(RRERt new_value((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs9% cCsxgt|jjD]}|dr|^qD]d}|jj|jj|dd}|dkrpq3nx$|D]}|j||||qwWq3WdS(NRR,( RMRRNRRR3RRWt_execute_device_command(RRERXRRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs 9%  cCst}xgt|jjD]}|ds|^qD]a}|jj|jj|dd}|dk r9|j ||||t krt }qq9q9W|S(NRR,( R&RMRRNRRR3RRWt_verify_non_device_commandR(RRERRRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs9% cCst}xgt|jjD]}|dr|^qD]l}|jj|dd}|dkrjq9nx8|D]0}|j|||||tkrqt}qqqqWq9W|S(NRR,( R&RMRRNR3RRWt_verify_device_commandR(RRERXRRRRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs9  !cCs|dk rt|}t|dkr.|S|d }|d}|dkrb|dkr^|S|Syb|dkrt|t|kr|SdSn/|dkrt|t|kr|SdSnWqtk rtjd||||fqXn|S(Nitshcannot compare new value '%s' with current value '%s' by operator '%s', using '%s' directly as new value(RR(RWR;R`tintt ValueErrorR1R2(RRt current_valuetnwsRtval((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_process_assignment_modifierss(         $cCs/|dk r |d|d|S|dSdS(NRR(RW(RRRkR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_current_values cCsY|j||}|j||}|dk rU|dk rU|j||||n|S(N(RRRWR(RRERRkRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs cCso|ddk r-|dt||ttn>|j||||}|dk rk|d||dtndS(NRRTtsim(RWR&RR(RRERRkR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs  cCsi|ddk r*|dt|ttn;|j||d|}|dk re|d|dtndS(NRRTR(RWR&RR(RRERR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs  cCsA|jjt|}tjd|r=tjdd|S|S(Ns\s*(0+,?)+([\da-fA-F]*,?)*\s*$s ^\s*(0+,?)+R(RtunquoteR;tretmatchtsub(RR=tv((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _norm_valuesc Cs|dkrdSt}|dkri|ri|dkrKtjtj|ntjtj||ftS|dk re|j|}|j|}yt |t |k}Wqet k ray"t |dt |dk}Wqbt k r]t |t |k}|s^t |j d}x3|D](}|j }||k}|r+Pq+q+Wq^qbXqeXn|j||||d||S(Nit|Rk(RWRR1RbRt STR_VERIFY_PROFILE_VALUE_MISSINGt'STR_VERIFY_PROFILE_DEVICE_VALUE_MISSINGR&RRRR;R+tstript_log_verification_result( RR,RRRRkRtvalsR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _verify_value s8    "     cCs|rh|dkr;tjtj|t|jfn)tjtj||t|jftS|dkrtj tj |t|jt|jfn8tj tj ||t|jt|jft SdS(N( RWR1RbRtSTR_VERIFY_PROFILE_VALUE_OKR;Rt"STR_VERIFY_PROFILE_DEVICE_VALUE_OKR&R[tSTR_VERIFY_PROFILE_VALUE_FAILt$STR_VERIFY_PROFILE_DEVICE_VALUE_FAILR(RR,tsuccessRRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR*s )) 88cCs|ddk r*|dt||t|S|j||d|}|j||}|dkrddS|d||t}|j|d||||S(NRRRTR,(RWR&RRR(RRERRkRRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR9s cCs|ddk r'|dt|t|S|j|}|j||}|dkrXdS|d|t}|j|d|||S(NRRTR,(RWR&RRR(RRERRRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRCs cCsxtgt|jjD]}|ds|^qD]K}|jj|dddk sq|d|jkr9|j||q9q9WdS(NRR,( treversedRMRRNR3RRWRt_cleanup_non_device_command(RRER((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRMs?2cCsxtgt|jjD]}|dr|^qD]_}|jj|dddk sq|d|jkr9x$|D]}|j|||qxWq9q9WdS(NRR,( RRMRRNR3RRWRt_cleanup_device_command(RRERXRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRRs?2 cCs|ddk r-|dtd|ttnN|j|||}|dk rh|d||dtn|j|||dS(NRRTR(RWRRR(RRERRkt old_value((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRXs  cCss|ddk r*|dtdttnE|j||}|dk r_|d|dtn|j||dS(NRRTR(RWRRR(RRERR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRas  N(CRR*t__doc__R"R$R'tpropertyR,t classmethodR-R/RR6R>RFRIRLR#RHRKRQR%RYR_RgRPRlRnRoRRRRRRRRRRRRRRRRWRRRRRRRRRRRRRRRRRRRRRR(((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR s|                #                       !    (Rt tuned.constsRttuned.profiles.variablesttunedt tuned.logsR ttuned.utils.commandsRRyt subprocessRRtlogsRR1tobjectR(((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyts     PK[6É +site-packages/tuned/plugins/plugin_audio.pynu[from . import base from .decorators import * import tuned.logs from tuned.utils.commands import commands import os import struct import glob log = tuned.logs.get() cmd = commands() class AudioPlugin(base.Plugin): """ Plugin for tuning audio cards powersaving options. Power management is supported per module, not device. From this reason, we take kernel module names as device names. """ def _init_devices(self): self._devices_supported = True self._assigned_devices = set() self._free_devices = set() for device in self._hardware_inventory.get_devices("sound").match_sys_name("card*"): module_name = self._device_module_name(device) if module_name in ["snd_hda_intel", "snd_ac97_codec"]: self._free_devices.add(module_name) def _instance_init(self, instance): instance._has_static_tuning = True instance._has_dynamic_tuning = False def _instance_cleanup(self, instance): pass def _device_module_name(self, device): try: return device.parent.driver except: return None @classmethod def _get_config_options(cls): return { "timeout": 0, "reset_controller": False, } def _timeout_path(self, device): return "/sys/module/%s/parameters/power_save" % device def _reset_controller_path(self, device): return "/sys/module/%s/parameters/power_save_controller" % device @command_set("timeout", per_device = True) def _set_timeout(self, value, device, sim): try: timeout = int(value) except ValueError: log.error("timeout value '%s' is not integer" % value) return None if timeout >= 0: sys_file = self._timeout_path(device) if not sim: cmd.write_to_file(sys_file, "%d" % timeout) return timeout else: return None @command_get("timeout") def _get_timeout(self, device, ignore_missing=False): sys_file = self._timeout_path(device) value = cmd.read_file(sys_file, no_error=ignore_missing) if len(value) > 0: return value return None @command_set("reset_controller", per_device = True) def _set_reset_controller(self, value, device, sim): v = cmd.get_bool(value) sys_file = self._reset_controller_path(device) if os.path.exists(sys_file): if not sim: cmd.write_to_file(sys_file, v) return v return None @command_get("reset_controller") def _get_reset_controller(self, device, ignore_missing=False): sys_file = self._reset_controller_path(device) if os.path.exists(sys_file): value = cmd.read_file(sys_file) if len(value) > 0: return cmd.get_bool(value) return None PK[M0site-packages/tuned/plugins/plugin_scsi_host.pyonu[ \c@sddlZddlmZddlTddlZddljZddlm Z ddl Z ddl Z ej j ZdejfdYZdS(iNi(thotplug(t*(tcommandstSCSIHostPlugincBseZdZdZdZdZedZdZdZ dZ dZ d Z ed Z d Zd Zd ZeddedZededZRS(s, Plugin for tuning options of SCSI hosts. cOs)tt|j||t|_dS(N(tsuperRt__init__Rt_cmd(tselftargstkwargs((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyRscCsztt|jt|_t|_x?|jjdD]+}|j |r;|jj |j q;q;Wt|_ dS(Ntscsi( RRt _init_devicestTruet_devices_supportedtsett _free_devicest_hardware_inventoryt get_devicest_device_is_supportedtaddtsys_namet_assigned_devices(Rtdevice((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR s  cCs&g|D]}|jjd|^qS(NR (Rt get_device(Rtdevicestx((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_get_device_objects scCs |jdkS(Nt scsi_host(t device_type(tclsR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR#scCs|jj|d|jdS(NR (Rt subscribet_hardware_events_callback(R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_hardware_events_init'scCs|jj|dS(N(Rt unsubscribe(R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_hardware_events_cleanup*scCs/|j|r+tt|j||ndS(N(RRRR(RteventR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR-scCstt|j||dS(N(RRt_added_device_apply_tuning(Rtinstancet device_name((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR$1scCstt|j||dS(N(RRt_removed_device_unapply_tuning(RR%R&((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR'4scCs idd6S(Ntalpm(tNone(R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_get_config_options7scCst|_t|_dS(N(R t_has_static_tuningtFalset_has_dynamic_tuning(RR%((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_instance_init=s cCsdS(N((RR%((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_instance_cleanupAscCstjjdt|dS(Ns/sys/class/scsi_host/tlink_power_management_policy(tostpathtjointstr(RR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt_get_alpm_policy_fileDsR(t per_devicecCsu|dkrdS|j|}|sqtjj|rM|jj||qqtjd|t |fdSn|S(NsBALPM control file ('%s') not found, skipping ALPM setting for '%s'( R)R5R1R2texistsRt write_to_filetlogtinfoR4(RtpolicyRtsimt policy_file((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt _set_alpmGs cCsA|j|}|jj|dtj}|dkr=|SdS(Ntno_errort(R5Rt read_fileR tstripR)(RRtignore_missingR=R;((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyt _get_alpmTs(t__name__t __module__t__doc__RR Rt classmethodRR R"RR$R'R*R.R/R5t command_setR R>t command_getR,RD(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyR s"           (terrnoR@Rt decoratorst tuned.logsttunedt tuned.conststconststtuned.utils.commandsRR1tretlogstgetR9tPluginR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scsi_host.pyts     PK[Av{5 5 0site-packages/tuned/plugins/plugin_eeepc_she.pyonu[ \c@stddlmZddlmZddlZddlmZddlZejj Z dej fdYZ dS(i(tbase(t exceptionsiN(tcommandstEeePCSHEPlugincBsSeZdZdZedZdZdZdZdZ dZ RS(sh Plugin for tuning FSB (front side bus) speed on Asus EEE PCs with SHE (Super Hybrid Engine) support. cOszt|_d|_tjj|js6d|_ntjj|js]tjdntt |j ||dS(Ns!/sys/devices/platform/eeepc/cpufvs%/sys/devices/platform/eeepc-wmi/cpufvs)Plugin is not supported on your hardware.( Rt_cmdt _control_filetostpathtisfileRtNotSupportedPluginExceptiontsuperRt__init__(tselftargstkwargs((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyR s   cCs idd6dd6dd6dd6S( Ng333333?tload_threshold_normalg?tload_threshold_powersaveit she_powersaveit she_normal((R ((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_get_config_optionss cCs7t|_t|_d|_|jjdd|_dS(Ntload( tFalset_has_static_tuningtTruet_has_dynamic_tuningtNonet _she_modet_monitors_repositorytcreatet _load_monitor(R tinstance((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_init s   cCs2|jdk r.|jj|jd|_ndS(N(RRRtdelete(R R((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_cleanup&scCsc|jjd}||jdkr9|j|dn&||jdkr_|j|dndS(NtsystemRt powersaveRtnormal(Rtget_loadtoptionst _set_she_mode(R RtdeviceR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_update_dynamic+s cCs|j|ddS(NR$(R'(R RR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyt_instance_unapply_dynamic2scCsgt|jd|}|j|krctjd||f|jj|jd|||_ndS(Nsshe_%ssnew eeepc_she mode %s (%d) s%s(tintR&RtlogtinfoRt write_to_fileR(R Rtnew_modetnew_mode_numeric((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyR'6s ( t__name__t __module__t__doc__R t classmethodRRR!R)R*R'(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyR s     ( tRRt tuned.logsttunedttuned.utils.commandsRRtlogstgetR,tPluginR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_eeepc_she.pyts   PK[ؽX> > *site-packages/tuned/plugins/plugin_usb.pycnu[ \c@snddlmZddlTddlZddlmZddlZejj Z dej fdYZ dS(i(tbase(t*iN(tcommandst USBPlugincBs}eZdZdZdZedZdZdZdZ e dde d Z e ded ZRS( s7 Plugin for tuning various options of USB subsystem. cCsmt|_t|_t|_x9|jjdjddD]}|jj|j q@Wt |_ dS(NtusbtDEVTYPEt usb_device( tTruet_devices_supportedtsett _free_devicest_assigned_devicest_hardware_inventoryt get_devicestmatch_propertytaddtsys_nameRt_cmd(tselftdevice((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt _init_devicess    %cCs&g|D]}|jjd|^qS(NR(R t get_device(Rtdevicestx((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_get_device_objectsscCs idd6S(Nt autosuspend(tNone(R((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_get_config_optionsscCst|_t|_dS(N(Rt_has_static_tuningtFalset_has_dynamic_tuning(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_instance_init!s cCsdS(N((RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_instance_cleanup%scCsd|S(Ns)/sys/bus/usb/devices/%s/power/autosuspend((RR((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_autosuspend_sysfile(sRt per_devicecCs`|j|}|dkrdS|r+dnd}|s\|j|}|jj||n|S(Nt1t0(t _option_boolRR"Rt write_to_file(RtvalueRtsimtenabletvaltsys_file((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_set_autosuspend+s cCs+|j|}|jj|d|jS(Ntno_error(R"Rt read_filetstrip(RRtignore_missingR,((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyt_get_autosuspend7s(t__name__t __module__t__doc__RRt classmethodRR R!R"t command_setRR-t command_getRR2(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyR s     ( tRt decoratorst tuned.logsttunedttuned.utils.commandsRtglobtlogstgettlogtPluginR(((s</usr/lib/python2.7/site-packages/tuned/plugins/plugin_usb.pyts    PK[zTsCC+site-packages/tuned/plugins/plugin_disk.pyonu[ +cc@sddlZddlmZddlTddlZddljZddlm Z ddl Z ddl Z ej j ZdejfdYZdS(iNi(thotplug(t*(tcommandst DiskPlugincBs9eZdZdZdZdZdZedZdZ dZ dZ d Z d Z ed Zed Zd ZdZdZdZdZdZdZdZdZdZdZddZdZeddedZe de!dZ"edded Z#e de!d!Z$ed"ded#Z%e d"e!d$Z&d%Z'd&Z(ed'ded(Z)e d'e!d)Z*e+d*ded+Z,d,Z-ed-ded.Z.e d-e!d/Z/RS(0s' Plugin for tuning options of disks. c Ostt|j||ddddddddd d d d g |_d dddddddddd dg |_t|j|_d|_d|_t |_ dS(Niiiiii}iiiUiFi7iiiiiiiiiiiniZi<ig{Gz?( tsuperRt__init__t _power_levelst_spindown_levelstlent_levelst _level_stepst_load_smallestRt_cmd(tselftargstkwargs((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRs--  cCstt|jt|_t|_t|_t|_xp|j j dD]\}|j |rP|jj |j |jr|j|j r|jj |j qqPqPWt|_dS(Ntblock(RRt _init_devicestTruet_devices_supportedt _use_hdparmtsett _free_devicest_hdparm_apm_devicest_hardware_inventoryt get_devicest_device_is_supportedtaddtsys_namet_is_hdparm_apm_supportedt_assigned_devices(R tdevice((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRs    cCs&g|D]}|jjd|^qS(NR(Rt get_device(R tdevicestx((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_device_objects)scCs|jjddd|gdtjgdt\}}}|tj krdtjdt|_tS|rtj d|tj d||ftSd |krtj d |tStS( Nthdparms-Cs/dev/%st no_errorst return_errs4hdparm command not found, ignoring for other devicess#Device '%s' not supported by hdparms(rc: %s, msg: '%s')tunknowns3Driver for device '%s' does not support apm command( R texecuteterrnotENOENTRtlogtwarntFalseRtinfotdebug(R Rtrctoutterr_msg((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR,s   cCsI|jdkoH|jjdddkoH|jdkpH|jjdkS( Ntdiskt removablet0tscsitvirtiotxentnvme(R6R7R8R9(t device_typet attributestgettNonetparentt subsystem(tclsR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR<scCs|jj|d|jdS(NR(Rt subscribet_hardware_events_callback(R ((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_hardware_events_initCscCs|jj|dS(N(Rt unsubscribe(R ((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_hardware_events_cleanupFscCs;|j|s|dkr7tt|j||ndS(Ntremove(RRRRB(R teventR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRBIscCs?|jdk r"|jj|ntt|j||dS(N(t _load_monitorR=t add_deviceRRt_added_device_apply_tuning(R tinstancet device_name((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRJMscCs?|jdk r"|jj|ntt|j||dS(N(RHR=t remove_deviceRRt_removed_device_unapply_tuning(R RKRL((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyRNRscCs5itd6dd6dd6dd6dd6dd6dd6S(Ntdynamictelevatortapmtspindownt readaheadtreadahead_multiplytscheduler_quantum(RR=(R@((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_config_optionsWscCs ddgS(NRQRR((R@((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt#_get_config_options_used_by_dynamiccscCst|_d|_d|_|j|jdr|t|_|jjd|j |_ i|_ i|_ i|_ i|_nt|_d|_ dS(NiROR3(Rt_has_static_tuningt _apm_errcntt_spindown_errcntt _option_booltoptionst_has_dynamic_tuningt_monitors_repositorytcreatetassigned_devicesRHt _device_idlet_statst_idlet_spindown_change_delayedR-R=(R RK((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_initjs          cCs2|jdk r.|jj|jd|_ndS(N(RHR=R^tdelete(R RK((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_instance_cleanup}scCs|rd}|j}nd}|j}|tjkr:dS|dkrOd}ne|tj krtjd|_|_tjddS|d7}|tjkrtjd|n|r||_n ||_dS(NRRRQiisIhdparm command not found, ignoring future set_apm / set_spindown commandss5disabling set_%s command: too many consecutive errors( RZRYtconststERROR_THRESHOLDR)R*R+R,R.(R R0RRtstcnt((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_update_errcnts&       cCsgtjd||jjdd|d|gdtjg\}}|j|tt|j ||jj|d|n|S(Ns%d(RRR R(R RRRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_set_readaheadds cCsM|j|}|jj|d|j}t|dkrCdSt|S(NRi(RR RtstripRR=R(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_readaheadls RTc Cs|r dS|jddd|}|r|j|}|dkrGdStt||}|jj|||j||tnE|jj |}|dkrdS|j||t|jj |dS(Nt command_nameRTRL( R=t _storage_keyRRRt_storageRRR-R<tunset( R tenablingt multiplierRtverifyRt storage_keyt old_readaheadt new_readahead((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_multiply_readaheadts"    cCs|j|dS(Nsqueue/iosched/quantum(R(R R((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_scheduler_quantum_filesRUcCs9|j|}|s5|jj|dt|n|S(Ns%d(RR RR(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_set_scheduler_quantums cCsg|j|}|jj|d|j}t|dkr]|sYtjd|ndSt|S(NRis>disk_scheduler_quantum option is not supported for device '%s'( RR RRRR+R.R=R(R RRRR((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyt_get_scheduler_quantums(0t__name__t __module__t__doc__RRR#Rt classmethodRRCRERBRJRNRVRWReRgRlRnRqR~RvRwRxRRRRt command_setRRt command_getR-RRRRRRRRRtcommand_customRRRR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyR sZ               2              (R)tRt decoratorst tuned.logsttunedt tuned.constsRhttuned.utils.commandsRRRtlogsR<R+tPluginR(((s=/usr/lib/python2.7/site-packages/tuned/plugins/plugin_disk.pyts     PK[nʄ)site-packages/tuned/plugins/repository.pynu[from tuned.utils.plugin_loader import PluginLoader import tuned.plugins.base import tuned.logs log = tuned.logs.get() __all__ = ["Repository"] class Repository(PluginLoader): def __init__(self, monitor_repository, storage_factory, hardware_inventory, device_matcher, device_matcher_udev, plugin_instance_factory, global_cfg, variables): super(Repository, self).__init__() self._plugins = set() self._monitor_repository = monitor_repository self._storage_factory = storage_factory self._hardware_inventory = hardware_inventory self._device_matcher = device_matcher self._device_matcher_udev = device_matcher_udev self._plugin_instance_factory = plugin_instance_factory self._global_cfg = global_cfg self._variables = variables @property def plugins(self): return self._plugins def _set_loader_parameters(self): self._namespace = "tuned.plugins" self._prefix = "plugin_" self._interface = tuned.plugins.base.Plugin def create(self, plugin_name): log.debug("creating plugin %s" % plugin_name) plugin_cls = self.load_plugin(plugin_name) plugin_instance = plugin_cls(self._monitor_repository, self._storage_factory, self._hardware_inventory, self._device_matcher,\ self._device_matcher_udev, self._plugin_instance_factory, self._global_cfg, self._variables) self._plugins.add(plugin_instance) return plugin_instance def delete(self, plugin): assert isinstance(plugin, self._interface) log.debug("removing plugin %s" % plugin) plugin.cleanup() self._plugins.remove(plugin) PK[ e e0site-packages/tuned/plugins/plugin_scheduler.pyonu[ \c@sddlmZddlTddlZddlZddlTddlZddlZddl Z ddl j Z ddl Z ddl Z ddlmZddlZejjZdefdYZdefd YZd ejfd YZdS( i(tbase(t*iN(tcommandstSchedulerParamscBs>eZdddddZedZejdZRS(cCs1||_||_||_||_||_dS(N(t_cmdtcmdlinet schedulertprioritytaffinity(tselftcmdRRRR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt__init__s     cCs*|jdkrdS|jj|jSdS(N(t _affinitytNoneRtbitmask2cpulist(R ((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRscCs1|dkrd|_n|jj||_dS(N(R R Rtcpulist2bitmask(R tvalue((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR%s  N(t__name__t __module__R R tpropertyRtsetter(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRst IRQAffinitiescBseZdZRS(cCsi|_d|_dS(N(tirqsR tdefault(R ((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR -s (RRR (((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR,stSchedulerPlugincBseZdZiejd6ejd6ejd6ejd6ejd6Z dZ dZ dZ e d Zd Zd Zd Zd ZdZdZdZdZdZedZdZdZdZdZdZdZedZ dZ!dZ"dZ#e$dded Z%e$d!ded"Z&d#Z'd$Z(d%Z)ed&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2e$d/ded0d1d2Z3RS(3s Plugin for tuning of scheduler. Currently it can control scheduling priorities of system threads (it is substitution for the rtctl tool). tftbtrtotic Cstt|j||||||||t|_tj|_ttj |_ |dk r|j tj tj|_t|jtjtj |_ nt|_d|_d|_tj|_|jdd|_|jdd|_dS(Ns.*tt command_nameRtirq(tsuperRR tTruet_has_dynamic_optionstconststCFG_DEF_DAEMONt_daemontinttCFG_DEF_SLEEP_INTERVALt_sleep_intervalR tget_boolt CFG_DAEMONtgettCFG_SLEEP_INTERVALRRt _ps_whitelistt _ps_blacklisttperftcpu_mapt_cpust _storage_keyt_scheduler_storage_keyt_irq_storage_key( R tmonitor_repositorytstorage_factorythardware_inventorytdevice_matchertdevice_matcher_udevtplugin_instance_factoryt global_cfgt variables((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR ?s+   $      cCst|_t|_t|_|jj|ji|_t |jdkrt j d|j i|_|jj |jn|j|_x1|jD]&}|jj|j||j|Invalid scheduler: %s. Scheduler and priority will be ignored.s=Invalid priority: %s. Scheduler and priority will be ignored.(NN(NN(t_dict_schedcfg2numR,R RRRR't ValueError(R t str_schedulert str_priorityRR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_convert_sched_params>s   cCsK|dkrd}n2|jj|}|sGtjd|d}n|S(NRs)Invalid affinity: %s. It will be ignored.(R Rt hex2cpulistRRR(R t str_affinityR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_convert_affinityMs    cCsO|\}}}}}|j||\}}|j|}|||||fS(N(RR(R tvalst rule_prioRRRtregex((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_convert_sched_cfgXs c Cstt|j|y|j}Wn+ttfk rS}tjd|dSXg|jj D]*\}}|t |j ddf^qd}g|D]E\}}t j d|rt|dkr||j|f^q}t|dd}t} i|_x6|D].\}\} } } } }yt j|}Wn0t jk rt}tjdt |qnXg|j D]0\}}t j||dk r||f^q}tg|D]*\}}|||| | | |ff^q}| j|t |jd d }|jd d }| | | g|j|lss(error compiling regular expression: '%s't(s\(t)s\)ttargettargs($R!Rt_instance_apply_staticRR~RRRRRWtitemststrtsplittretmatchRQRtsortedtdictt _sched_lookuptcompiletsearchR tupdatetreplaceRROtsetR4RPR&RNRZtThreadt _thread_codet_threadtstart(R RhRRtoptionRt sched_cfgRtbuft sched_allRRRRRRRxR RR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR_sL @-  C7 ( !cCsy|j}Wn+ttfk r=}tjd|dSXx|jjD]\}}||ksN|||jkrqNn|jdk r|j dk r|j ||j|j n|j dk rN|j ||j qNqNWi|_|jj|jdS(NsKerror unapplying tuning, cannot get information about running processes: %s(RR~RRRRRPRRRR RRRRRORUR4(R RRRxt orig_params((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRTs"   cCsVtt|j|||jrH|jrH|jj|jjn|j dS(N( R!Rt_instance_unapply_staticR&RNR\RRtjoinRT(R Rht full_rollback((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRs  c Csy|j|}Wnittfk r~}|jtjksO|jtjkrctjd|ntjd||fdSX|j j |j ||}|dk r||j krtjd||t|f|\}}} |j||||| |jj|j|j ndS(Ns3Failed to get cmdline of PID %d, the task vanished.s#Failed to get cmdline of PID %d: %ss-tuning new process '%s' with PID '%d' by '%s'(RyR~RRRRRRRRRt re_lookupRR RPRRRORR4( R RhRxRR RtvRRR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_add_pids$    cCsJ||jkrF|j|=tjd||jj|j|jndS(Ns)removed PID %d from the rollback database(RPRRRRORR4(R RhRx((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt _remove_pids  c CsJ|jj|j}tj}|jj}x|D]}|j|q7Wx|jj sEt |j|j ddkrQ|jj rQt }x|r>t }x|jD]}|jj|}|rt }|jtjkr|j|t|j|q7|jtjkr7|j|t|jq7qqWqWqQqQWdS(Nii(Rtre_lookup_compileRtselecttpollRft get_pollfdtregisterR\tis_setRQR)R"RKR2t read_on_cpuR@R0t RECORD_COMMRR'ttidt RECORD_EXITR( R RhRRtfdstfdt read_eventstcputevent((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRs$  2 Rmt per_devicecCs^|r dS|rZ|dk rZdjgtjdt|D]}d|^q;|_ndS(Nt|s(?tjtj||fntjtj|||f|S(N(RtissubsetRRRSR$tSTR_VERIFY_PROFILE_VALUE_OKRtSTR_VERIFY_PROFILE_VALUE_FAIL(R tirq_descriptiontcorrect_affinitytcurrent_affinityR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_verify_irq_affinity|s   cCstj}t}x||jD]n}yQ||d}tjd||fd|}|j|||sut}nWqtk rqqXqW|j j d}|j j |}|jd||st}n|S(NRs#Read SMP affinity of IRQ '%s': '%s'sSMP affinity of IRQ %ss/proc/irq/default_smp_affinitysdefault IRQ SMP affinity( RtRR"R}RRRRRKRRRR(R RRRR RRtcurrent_affinity_hex((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_verify_all_irq_affinitys,            RlRi c Csd}|dk rt|jj|}t|j}|j|r[t||}qdjg|jD]}t|^qk} t j d|| fn|s|r|dkrdS|r|j |S|r|j ||j |n |jdS(Nt,sJInvalid isolated_cores specified, '%s' does not match available cores '%s'(R RRtcpulist_unpackR2RRRRRRRRRRR( R RRRRRtisolatedtpresenttxtstr_cpus((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_isolated_coress" +   (4RRt__doc__Rt SCHED_FIFOt SCHED_BATCHtSCHED_RRt SCHED_OTHERt SCHED_IDLERR RjRkt classmethodRpRyRRRRwRRRRRKRRRRRRRTRRRRtcommand_customR.R/RRRRRRRRRRRRR&(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR1s\       (           *             (RRt decoratorst tuned.logsttunedRt subprocessRZR0Rt tuned.constsR$RtRttuned.utils.commandsRRtlogsR,RRtobjectRRtPluginR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyts           PK[[ztt,site-packages/tuned/plugins/plugin_audio.pyonu[ \c@sddlmZddlTddlZddlmZddlZddlZddl Z ej j Z eZ dejfdYZdS(i(tbase(t*iN(tcommandst AudioPlugincBseZdZdZdZdZdZedZdZ dZ e dd e d Z eded Ze d d e d Zed edZRS(s Plugin for tuning audio cards powersaving options. Power management is supported per module, not device. From this reason, we take kernel module names as device names. cCsyt|_t|_t|_xQ|jjdjdD]4}|j|}|dkr=|jj |q=q=WdS(Ntsoundscard*t snd_hda_inteltsnd_ac97_codec(RR( tTruet_devices_supportedtsett_assigned_devicest _free_devicest_hardware_inventoryt get_devicestmatch_sys_namet_device_module_nametadd(tselftdevicet module_name((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _init_devicess   " cCst|_t|_dS(N(Rt_has_static_tuningtFalset_has_dynamic_tuning(Rtinstance((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_instance_inits cCsdS(N((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_instance_cleanup#scCsy|jjSWndSXdS(N(tparenttdrivertNone(RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyR&scCsidd6td6S(Nittimeouttreset_controller(R(tcls((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_get_config_options,scCsd|S(Ns$/sys/module/%s/parameters/power_save((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _timeout_path3scCsd|S(Ns//sys/module/%s/parameters/power_save_controller((RR((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_reset_controller_path6sRt per_devicecCszyt|}Wn#tk r5tjd|dSX|dkrr|j|}|sntj|d|n|SdSdS(Ns!timeout value '%s' is not integeris%d(tintt ValueErrortlogterrorRR"tcmdt write_to_file(RtvalueRtsimRtsys_file((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _set_timeout9s  cCs>|j|}tj|d|}t|dkr:|SdS(Ntno_errori(R"R)t read_filetlenR(RRtignore_missingR-R+((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt _get_timeoutHs RcCsQtj|}|j|}tjj|rM|sItj||n|SdS(N(R)tget_boolR#tostpathtexistsR*R(RR+RR,tvR-((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_set_reset_controllerPscCsV|j|}tjj|rRtj|}t|dkrRtj|SndS(Ni( R#R5R6R7R)R0R1R4R(RRR2R-R+((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyt_get_reset_controllerZs (t__name__t __module__t__doc__RRRRt classmethodR!R"R#t command_setRR.t command_getRR3R9R:(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyR s       (tRt decoratorst tuned.logsttunedttuned.utils.commandsRR5tstructtglobtlogstgetR'R)tPluginR(((s>/usr/lib/python2.7/site-packages/tuned/plugins/plugin_audio.pyts      PK[f<*site-packages/tuned/plugins/exceptions.pyonu[ \c@s,ddlZdejjfdYZdS(iNtNotSupportedPluginExceptioncBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/tuned/plugins/exceptions.pyRs(ttuned.exceptionsttunedt exceptionstTunedExceptionR(((s</usr/lib/python2.7/site-packages/tuned/plugins/exceptions.pyts PK[6I2::)site-packages/tuned/plugins/plugin_vm.pyonu[ \c@sddlmZddlTddlZddlZddlZddlZddlm Z ej j Z e Z dejfdYZdS(i(tbase(t*iN(tcommandstVMPlugincBseZdZedZdZdZedZeddZ eddZ e dd Z e dd Z ed d Ze d d ZRS(s( Plugin for tuning memory management. cCsidd6dd6dd6S(Nttransparent_hugepagesttransparent_hugepagestransparent_hugepage.defrag(tNone(tself((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_get_config_optionsscCst|_t|_dS(N(tTruet_has_static_tuningtFalset_has_dynamic_tuning(Rtinstance((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_instance_inits cCsdS(N((RR ((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_instance_cleanupscCs%d}tjj|s!d}n|S(Ns#/sys/kernel/mm/transparent_hugepages*/sys/kernel/mm/redhat_transparent_hugepage(tostpathtexists(RR((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt _thp_path!s RcCs|d kr0|s,tjdt|ndStjddt}|jddkrt|sptjd ndSt j j |j d }t j j |r|stj||n|S|stjd ndSdS( Ntalwaystnevertmadvises-Incorrect 'transparent_hugepages' value '%s'.s /proc/cmdlinetno_errorstransparent_hugepage=isWtransparent_hugepage is already set in kernel boot cmdline, ingoring value from profiletenabledsDOption 'transparent_hugepages' is not supported on current hardware.(salwaysRR(tlogtwarntstrRtcmdt read_fileR tfindtinfoRRtjoinRRt write_to_file(Rtvaluetsimtcmdlinetsys_file((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_set_transparent_hugepages)s" RcCs|j||dS(N(R&(RR"R#((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_set_transparent_hugepageAscCsKtjj|jd}tjj|rCtjtj|SdSdS(NR( RRR RRRtget_active_optionRR(RR%((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_get_transparent_hugepagesEscCs |jS(N(R)(R((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt_get_transparent_hugepageNsstransparent_hugepage.defragcCshtjj|jd}tjj|rJ|sFtj||n|S|s`tjdndSdS(NtdefragsJOption 'transparent_hugepage.defrag' is not supported on current hardware.( RRR RRRR!RRR(RR"R#R%((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt _set_transparent_hugepage_defragRscCsKtjj|jd}tjj|rCtjtj|SdSdS(NR+( RRR RRRR(RR(RR%((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyt _get_transparent_hugepage_defrag^s(t__name__t __module__t__doc__t classmethodRRRRt command_setR&R't command_getR)R*R,R-(((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyR s    (tRt decoratorst tuned.logsttunedRtstructtglobttuned.utils.commandsRtlogstgetRRtPluginR(((s;/usr/lib/python2.7/site-packages/tuned/plugins/plugin_vm.pyts      PK[YΦ\\/site-packages/tuned/plugins/plugin_scheduler.pynu[# code for cores isolation was inspired by Tuna implementation # perf code was borrowed from kernel/tools/perf/python/twatch.py # thanks to Arnaldo Carvalho de Melo from . import base from .decorators import * import tuned.logs import re from subprocess import * import threading import perf import select import tuned.consts as consts import procfs import schedutils from tuned.utils.commands import commands import errno log = tuned.logs.get() class SchedulerParams(object): def __init__(self, cmd, cmdline = None, scheduler = None, priority = None, affinity = None): self._cmd = cmd self.cmdline = cmdline self.scheduler = scheduler self.priority = priority self.affinity = affinity @property def affinity(self): if self._affinity is None: return None else: return self._cmd.bitmask2cpulist(self._affinity) @affinity.setter def affinity(self, value): if value is None: self._affinity = None else: self._affinity = self._cmd.cpulist2bitmask(value) class IRQAffinities(object): def __init__(self): self.irqs = {} self.default = None class SchedulerPlugin(base.Plugin): """ Plugin for tuning of scheduler. Currently it can control scheduling priorities of system threads (it is substitution for the rtctl tool). """ _dict_schedcfg2num = { "f": schedutils.SCHED_FIFO, "b": schedutils.SCHED_BATCH, "r": schedutils.SCHED_RR, "o": schedutils.SCHED_OTHER, "i": schedutils.SCHED_IDLE, } def __init__(self, monitor_repository, storage_factory, hardware_inventory, device_matcher, device_matcher_udev, plugin_instance_factory, global_cfg, variables): super(SchedulerPlugin, self).__init__(monitor_repository, storage_factory, hardware_inventory, device_matcher, device_matcher_udev, plugin_instance_factory, global_cfg, variables) self._has_dynamic_options = True self._daemon = consts.CFG_DEF_DAEMON self._sleep_interval = int(consts.CFG_DEF_SLEEP_INTERVAL) if global_cfg is not None: self._daemon = global_cfg.get_bool(consts.CFG_DAEMON, consts.CFG_DEF_DAEMON) self._sleep_interval = int(global_cfg.get(consts.CFG_SLEEP_INTERVAL, consts.CFG_DEF_SLEEP_INTERVAL)) self._cmd = commands() # default is to whitelist all and blacklist none self._ps_whitelist = ".*" self._ps_blacklist = "" self._cpus = perf.cpu_map() self._scheduler_storage_key = self._storage_key( command_name = "scheduler") self._irq_storage_key = self._storage_key( command_name = "irq") def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True # this is hack, runtime_tuning should be covered by dynamic_tuning configuration # TODO: add per plugin dynamic tuning configuration and use dynamic_tuning configuration # instead of runtime_tuning instance._runtime_tuning = True # FIXME: do we want to do this here? # recover original values in case of crash self._scheduler_original = self._storage.get( self._scheduler_storage_key, {}) if len(self._scheduler_original) > 0: log.info("recovering scheduling settings from previous run") self._restore_ps_affinity() self._scheduler_original = {} self._storage.unset(self._scheduler_storage_key) instance._scheduler = instance.options for k in instance._scheduler: instance._scheduler[k] = self._variables.expand(instance._scheduler[k]) if self._cmd.get_bool(instance._scheduler.get("runtime", 1)) == "0": instance._runtime_tuning = False instance._terminate = threading.Event() if self._daemon and instance._runtime_tuning: try: instance._threads = perf.thread_map() evsel = perf.evsel(type = perf.TYPE_SOFTWARE, config = perf.COUNT_SW_DUMMY, task = 1, comm = 1, mmap = 0, freq = 0, wakeup_events = 1, watermark = 1, sample_type = perf.SAMPLE_TID | perf.SAMPLE_CPU) evsel.open(cpus = self._cpus, threads = instance._threads) instance._evlist = perf.evlist(self._cpus, instance._threads) instance._evlist.add(evsel) instance._evlist.mmap() # no perf except: instance._runtime_tuning = False def _instance_cleanup(self, instance): pass @classmethod def _get_config_options(cls): return { "isolated_cores": None, "ps_whitelist": None, "ps_blacklist": None, } # Raises OSError, IOError def _get_cmdline(self, process): if not isinstance(process, procfs.process): pid = process process = procfs.process(pid) cmdline = procfs.process_cmdline(process) if self._is_kthread(process): cmdline = "[" + cmdline + "]" return cmdline # Raises OSError, IOError def get_processes(self): ps = procfs.pidstats() ps.reload_threads() processes = {} for proc in ps.values(): try: cmd = self._get_cmdline(proc) pid = proc["pid"] processes[pid] = cmd if "threads" in proc: for pid in proc["threads"].keys(): cmd = self._get_cmdline(proc) processes[pid] = cmd except (OSError, IOError) as e: if e.errno == errno.ENOENT \ or e.errno == errno.ESRCH: continue else: raise return processes # Raises OSError # Raises SystemError with old (pre-0.4) python-schedutils # instead of OSError # If PID doesn't exist, errno == ESRCH def _get_rt(self, pid): scheduler = schedutils.get_scheduler(pid) sched_str = schedutils.schedstr(scheduler) priority = schedutils.get_priority(pid) log.debug("Read scheduler policy '%s' and priority '%d' of PID '%d'" % (sched_str, priority, pid)) return (scheduler, priority) def _set_rt(self, pid, sched, prio): sched_str = schedutils.schedstr(sched) log.debug("Setting scheduler policy to '%s' and priority to '%d' of PID '%d'." % (sched_str, prio, pid)) try: prio_min = schedutils.get_priority_min(sched) prio_max = schedutils.get_priority_max(sched) if prio < prio_min or prio > prio_max: log.error("Priority for %s must be in range %d - %d. '%d' was given." % (sched_str, prio_min, prio_max, prio)) # Workaround for old (pre-0.4) python-schedutils which raised # SystemError instead of OSError except (SystemError, OSError) as e: log.error("Failed to get allowed priority range: %s" % e) try: schedutils.set_scheduler(pid, sched, prio) except (SystemError, OSError) as e: if hasattr(e, "errno") and e.errno == errno.ESRCH: log.debug("Failed to set scheduling parameters of PID %d, the task vanished." % pid) else: log.error("Failed to set scheduling parameters of PID %d: %s" % (pid, e)) # process is a procfs.process object # Raises OSError, IOError def _is_kthread(self, process): return process["stat"]["flags"] & procfs.pidstat.PF_KTHREAD != 0 # Return codes: # 0 - Affinity is fixed # 1 - Affinity is changeable # -1 - Task vanished # -2 - Error def _affinity_changeable(self, pid): try: process = procfs.process(pid) if process["stat"].is_bound_to_cpu(): if process["stat"]["state"] == "Z": log.debug("Affinity of zombie task with PID %d cannot be changed, the task's affinity mask is fixed." % pid) elif self._is_kthread(process): log.debug("Affinity of kernel thread with PID %d cannot be changed, the task's affinity mask is fixed." % pid) else: log.warn("Affinity of task with PID %d cannot be changed, the task's affinity mask is fixed." % pid) return 0 else: return 1 except (OSError, IOError) as e: if e.errno == errno.ENOENT or e.errno == errno.ESRCH: log.debug("Failed to get task info for PID %d, the task vanished." % pid) return -1 else: log.error("Failed to get task info for PID %d: %s" % (pid, e)) return -2 except (AttributeError, KeyError) as e: log.error("Failed to get task info for PID %d: %s" % (pid, e)) return -2 def _store_orig_process_rt(self, pid, scheduler, priority): try: params = self._scheduler_original[pid] except KeyError: params = SchedulerParams(self._cmd) self._scheduler_original[pid] = params if params.scheduler is None and params.priority is None: params.scheduler = scheduler params.priority = priority def _tune_process_rt(self, pid, sched, prio): cont = True if sched is None and prio is None: return cont try: (prev_sched, prev_prio) = self._get_rt(pid) if sched is None: sched = prev_sched self._set_rt(pid, sched, prio) self._store_orig_process_rt(pid, prev_sched, prev_prio) except (SystemError, OSError) as e: if hasattr(e, "errno") and e.errno == errno.ESRCH: log.debug("Failed to read scheduler policy of PID %d, the task vanished." % pid) if pid in self._scheduler_original: del self._scheduler_original[pid] cont = False else: log.error("Refusing to set scheduler and priority of PID %d, reading original scheduling parameters failed: %s" % (pid, e)) return cont def _store_orig_process_affinity(self, pid, affinity): try: params = self._scheduler_original[pid] except KeyError: params = SchedulerParams(self._cmd) self._scheduler_original[pid] = params if params.affinity is None: params.affinity = affinity def _tune_process_affinity(self, pid, affinity, intersect = False): cont = True if affinity is None: return cont try: prev_affinity = self._get_affinity(pid) if intersect: affinity = self._get_intersect_affinity( prev_affinity, affinity, affinity) self._set_affinity(pid, affinity) self._store_orig_process_affinity(pid, prev_affinity) except (SystemError, OSError) as e: if hasattr(e, "errno") and e.errno == errno.ESRCH: log.debug("Failed to read affinity of PID %d, the task vanished." % pid) if pid in self._scheduler_original: del self._scheduler_original[pid] cont = False else: log.error("Refusing to set CPU affinity of PID %d, reading original affinity failed: %s" % (pid, e)) return cont #tune process and store previous values def _tune_process(self, pid, cmd, sched, prio, affinity): cont = self._tune_process_rt(pid, sched, prio) if not cont: return cont = self._tune_process_affinity(pid, affinity) if not cont or pid not in self._scheduler_original: return self._scheduler_original[pid].cmdline = cmd def _convert_sched_params(self, str_scheduler, str_priority): scheduler = self._dict_schedcfg2num.get(str_scheduler) if scheduler is None and str_scheduler != "*": log.error("Invalid scheduler: %s. Scheduler and priority will be ignored." % str_scheduler) return (None, None) else: try: priority = int(str_priority) except ValueError: log.error("Invalid priority: %s. Scheduler and priority will be ignored." % str_priority) return (None, None) return (scheduler, priority) def _convert_affinity(self, str_affinity): if str_affinity == "*": affinity = None else: affinity = self._cmd.hex2cpulist(str_affinity) if not affinity: log.error("Invalid affinity: %s. It will be ignored." % str_affinity) affinity = None return affinity def _convert_sched_cfg(self, vals): (rule_prio, scheduler, priority, affinity, regex) = vals (scheduler, priority) = self._convert_sched_params( scheduler, priority) affinity = self._convert_affinity(affinity) return (rule_prio, scheduler, priority, affinity, regex) def _instance_apply_static(self, instance): super(SchedulerPlugin, self)._instance_apply_static(instance) try: ps = self.get_processes() except (OSError, IOError) as e: log.error("error applying tuning, cannot get information about running processes: %s" % e) return sched_cfg = [(option, str(value).split(":", 4)) for option, value in instance._scheduler.items()] buf = [(option, self._convert_sched_cfg(vals)) for option, vals in sched_cfg if re.match(r"group\.", option) and len(vals) == 5] sched_cfg = sorted(buf, key=lambda option_vals: option_vals[1][0]) sched_all = dict() # for runtime tunning instance._sched_lookup = {} for option, (rule_prio, scheduler, priority, affinity, regex) \ in sched_cfg: try: r = re.compile(regex) except re.error as e: log.error("error compiling regular expression: '%s'" % str(regex)) continue processes = [(pid, cmd) for pid, cmd in ps.items() if re.search(r, cmd) is not None] #cmd - process name, option - group name sched = dict([(pid, (cmd, option, scheduler, priority, affinity, regex)) for pid, cmd in processes]) sched_all.update(sched) regex = str(regex).replace("(", r"\(") regex = regex.replace(")", r"\)") instance._sched_lookup[regex] = [scheduler, priority, affinity] for pid, (cmd, option, scheduler, priority, affinity, regex) \ in sched_all.items(): self._tune_process(pid, cmd, scheduler, priority, affinity) self._storage.set(self._scheduler_storage_key, self._scheduler_original) if self._daemon and instance._runtime_tuning: instance._thread = threading.Thread(target = self._thread_code, args = [instance]) instance._thread.start() def _restore_ps_affinity(self): try: ps = self.get_processes() except (OSError, IOError) as e: log.error("error unapplying tuning, cannot get information about running processes: %s" % e) return for pid, orig_params in self._scheduler_original.items(): # if command line for the pid didn't change, it's very probably the same process if pid not in ps or ps[pid] != orig_params.cmdline: continue if orig_params.scheduler is not None \ and orig_params.priority is not None: self._set_rt(pid, orig_params.scheduler, orig_params.priority) if orig_params.affinity is not None: self._set_affinity(pid, orig_params.affinity) self._scheduler_original = {} self._storage.unset(self._scheduler_storage_key) def _instance_unapply_static(self, instance, full_rollback = False): super(SchedulerPlugin, self)._instance_unapply_static(instance, full_rollback) if self._daemon and instance._runtime_tuning: instance._terminate.set() instance._thread.join() self._restore_ps_affinity() def _add_pid(self, instance, pid, r): try: cmd = self._get_cmdline(pid) except (OSError, IOError) as e: if e.errno == errno.ENOENT \ or e.errno == errno.ESRCH: log.debug("Failed to get cmdline of PID %d, the task vanished." % pid) else: log.error("Failed to get cmdline of PID %d: %s" % (pid, e)) return v = self._cmd.re_lookup(instance._sched_lookup, cmd, r) if v is not None and not pid in self._scheduler_original: log.debug("tuning new process '%s' with PID '%d' by '%s'" % (cmd, pid, str(v))) (sched, prio, affinity) = v self._tune_process(pid, cmd, sched, prio, affinity) self._storage.set(self._scheduler_storage_key, self._scheduler_original) def _remove_pid(self, instance, pid): if pid in self._scheduler_original: del self._scheduler_original[pid] log.debug("removed PID %d from the rollback database" % pid) self._storage.set(self._scheduler_storage_key, self._scheduler_original) def _thread_code(self, instance): r = self._cmd.re_lookup_compile(instance._sched_lookup) poll = select.poll() # Store the file objects in a local variable so that they don't # go out of scope too soon. This is a workaround for # python3-perf bug rhbz#1659445. fds = instance._evlist.get_pollfd() for fd in fds: poll.register(fd) while not instance._terminate.is_set(): # timeout to poll in milliseconds if len(poll.poll(self._sleep_interval * 1000)) > 0 and not instance._terminate.is_set(): read_events = True while read_events: read_events = False for cpu in self._cpus: event = instance._evlist.read_on_cpu(cpu) if event: read_events = True if event.type == perf.RECORD_COMM: self._add_pid(instance, int(event.tid), r) elif event.type == perf.RECORD_EXIT: self._remove_pid(instance, int(event.tid)) @command_custom("ps_whitelist", per_device = False) def _ps_whitelist(self, enabling, value, verify, ignore_missing): # currently unsupported if verify: return None if enabling and value is not None: self._ps_whitelist = "|".join(["(%s)" % v for v in re.split(r"(?eZdddddZedZejdZRS(cCs1||_||_||_||_||_dS(N(t_cmdtcmdlinet schedulertprioritytaffinity(tselftcmdRRRR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt__init__s     cCs*|jdkrdS|jj|jSdS(N(t _affinitytNoneRtbitmask2cpulist(R ((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRscCs1|dkrd|_n|jj||_dS(N(R R Rtcpulist2bitmask(R tvalue((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR%s  N(t__name__t __module__R R tpropertyRtsetter(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRst IRQAffinitiescBseZdZRS(cCsi|_d|_dS(N(tirqsR tdefault(R ((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR -s (RRR (((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR,stSchedulerPlugincBseZdZiejd6ejd6ejd6ejd6ejd6Z dZ dZ dZ e d Zd Zd Zd Zd ZdZdZdZdZdZedZdZdZdZdZdZdZedZ dZ!dZ"dZ#e$dded Z%e$d!ded"Z&d#Z'd$Z(d%Z)ed&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2e$d/ded0d1d2Z3RS(3s Plugin for tuning of scheduler. Currently it can control scheduling priorities of system threads (it is substitution for the rtctl tool). tftbtrtotic Cstt|j||||||||t|_tj|_ttj |_ |dk r|j tj tj|_t|jtjtj |_ nt|_d|_d|_tj|_|jdd|_|jdd|_dS(Ns.*tt command_nameRtirq(tsuperRR tTruet_has_dynamic_optionstconststCFG_DEF_DAEMONt_daemontinttCFG_DEF_SLEEP_INTERVALt_sleep_intervalR tget_boolt CFG_DAEMONtgettCFG_SLEEP_INTERVALRRt _ps_whitelistt _ps_blacklisttperftcpu_mapt_cpust _storage_keyt_scheduler_storage_keyt_irq_storage_key( R tmonitor_repositorytstorage_factorythardware_inventorytdevice_matchertdevice_matcher_udevtplugin_instance_factoryt global_cfgt variables((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR ?s+   $      cCst|_t|_t|_|jj|ji|_t |jdkrt j d|j i|_|jj |jn|j|_x1|jD]&}|jj|j||j|Invalid scheduler: %s. Scheduler and priority will be ignored.s=Invalid priority: %s. Scheduler and priority will be ignored.(NN(NN(t_dict_schedcfg2numR,R RRRR't ValueError(R t str_schedulert str_priorityRR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_convert_sched_params>s   cCsK|dkrd}n2|jj|}|sGtjd|d}n|S(NRs)Invalid affinity: %s. It will be ignored.(R Rt hex2cpulistRRR(R t str_affinityR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_convert_affinityMs    cCsO|\}}}}}|j||\}}|j|}|||||fS(N(RR(R tvalst rule_prioRRRtregex((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_convert_sched_cfgXs c Cstt|j|y|j}Wn+ttfk rS}tjd|dSXg|jj D]*\}}|t |j ddf^qd}g|D]E\}}t j d|rt|dkr||j|f^q}t|dd}t} i|_x6|D].\}\} } } } }yt j|}Wn0t jk rt}tjdt |qnXg|j D]0\}}t j||dk r||f^q}tg|D]*\}}|||| | | |ff^q}| j|t |jd d }|jd d }| | | g|j|lss(error compiling regular expression: '%s't(s\(t)s\)ttargettargs($R!Rt_instance_apply_staticRR~RRRRRWtitemststrtsplittretmatchRQRtsortedtdictt _sched_lookuptcompiletsearchR tupdatetreplaceRROtsetR4RPR&RNRZtThreadt _thread_codet_threadtstart(R RhRRtoptionRt sched_cfgRtbuft sched_allRRRRRRRxR RR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR_sL @-  C7 ( !cCsy|j}Wn+ttfk r=}tjd|dSXx|jjD]\}}||ksN|||jkrqNn|jdk r|j dk r|j ||j|j n|j dk rN|j ||j qNqNWi|_|jj|jdS(NsKerror unapplying tuning, cannot get information about running processes: %s(RR~RRRRRPRRRR RRRRRORUR4(R RRRxt orig_params((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRTs"   cCsVtt|j|||jrH|jrH|jj|jjn|j dS(N( R!Rt_instance_unapply_staticR&RNR\RRtjoinRT(R Rht full_rollback((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRs  c Csy|j|}Wnittfk r~}|jtjksO|jtjkrctjd|ntjd||fdSX|j j |j ||}|dk r||j krtjd||t|f|\}}} |j||||| |jj|j|j ndS(Ns3Failed to get cmdline of PID %d, the task vanished.s#Failed to get cmdline of PID %d: %ss-tuning new process '%s' with PID '%d' by '%s'(RyR~RRRRRRRRRt re_lookupRR RPRRRORR4( R RhRxRR RtvRRR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_add_pids$    cCsJ||jkrF|j|=tjd||jj|j|jndS(Ns)removed PID %d from the rollback database(RPRRRRORR4(R RhRx((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt _remove_pids  c CsJ|jj|j}tj}|jj}x|D]}|j|q7Wx|jj sEt |j|j ddkrQ|jj rQt }x|r>t }x|jD]}|jj|}|rt }|jtjkr|j|t|j|q7|jtjkr7|j|t|jq7qqWqWqQqQWdS(Nii(Rtre_lookup_compileRtselecttpollRft get_pollfdtregisterR\tis_setRQR)R"RKR2t read_on_cpuR@R0t RECORD_COMMRR'ttidt RECORD_EXITR( R RhRRtfdstfdt read_eventstcputevent((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyRs$  2 Rmt per_devicecCs^|r dS|rZ|dk rZdjgtjdt|D]}d|^q;|_ndS(Nt|s(?tjtj||fntjtj|||f|S(N(RtissubsetRRRSR$tSTR_VERIFY_PROFILE_VALUE_OKRtSTR_VERIFY_PROFILE_VALUE_FAIL(R tirq_descriptiontcorrect_affinitytcurrent_affinityR((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_verify_irq_affinity|s   cCstj}t}x||jD]n}yQ||d}tjd||fd|}|j|||sut}nWqtk rqqXqW|j j d}|j j |}|jd||st}n|S(NRs#Read SMP affinity of IRQ '%s': '%s'sSMP affinity of IRQ %ss/proc/irq/default_smp_affinitysdefault IRQ SMP affinity( RtRR"R}RRRRRKRRRR(R RRRR RRtcurrent_affinity_hex((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_verify_all_irq_affinitys,            RlRi c Csd}|dk rt|jj|}t|j}|j|r[t||}qdjg|jD]}t|^qk} t j d|| fn|s|r|dkrdS|r|j |S|r|j ||j |n |jdS(Nt,sJInvalid isolated_cores specified, '%s' does not match available cores '%s'(R RRtcpulist_unpackR2RRRRRRRRRRR( R RRRRRtisolatedtpresenttxtstr_cpus((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyt_isolated_coress" +   (4RRt__doc__Rt SCHED_FIFOt SCHED_BATCHtSCHED_RRt SCHED_OTHERt SCHED_IDLERR RjRkt classmethodRpRyRRRRwRRRRRKRRRRRRRTRRRRtcommand_customR.R/RRRRRRRRRRRRR&(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyR1s\       (           *             (RRt decoratorst tuned.logsttunedRt subprocessRZR0Rt tuned.constsR$RtRttuned.utils.commandsRRtlogsR,RRtobjectRRtPluginR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/plugin_scheduler.pyts           PK[+ )site-packages/tuned/plugins/plugin_usb.pynu[from . import base from .decorators import * import tuned.logs from tuned.utils.commands import commands import glob log = tuned.logs.get() class USBPlugin(base.Plugin): """ Plugin for tuning various options of USB subsystem. """ def _init_devices(self): self._devices_supported = True self._free_devices = set() self._assigned_devices = set() for device in self._hardware_inventory.get_devices("usb").match_property("DEVTYPE", "usb_device"): self._free_devices.add(device.sys_name) self._cmd = commands() def _get_device_objects(self, devices): return [self._hardware_inventory.get_device("usb", x) for x in devices] @classmethod def _get_config_options(self): return { "autosuspend" : None, } def _instance_init(self, instance): instance._has_static_tuning = True instance._has_dynamic_tuning = False def _instance_cleanup(self, instance): pass def _autosuspend_sysfile(self, device): return "/sys/bus/usb/devices/%s/power/autosuspend" % device @command_set("autosuspend", per_device=True) def _set_autosuspend(self, value, device, sim): enable = self._option_bool(value) if enable is None: return None val = "1" if enable else "0" if not sim: sys_file = self._autosuspend_sysfile(device) self._cmd.write_to_file(sys_file, val) return val @command_get("autosuspend") def _get_autosuspend(self, device, ignore_missing=False): sys_file = self._autosuspend_sysfile(device) return self._cmd.read_file(sys_file, no_error=ignore_missing).strip() PK[d9Z?d:Z@d;ZAd<ZBRS(>s Base class for all plugins. Plugins change various system settings in order to get desired performance or power saving. Plugins use Monitor objects to get information from the running system. Intentionally a lot of logic is included in the plugin to increase plugin flexibility. c Cs|j|jj|_||_||_||_||_||_t j |_ |j ||_ ||_t|_t|_|j|_t|_dS(sPlugin constructor.N(tcreatet __class__t__name__t_storaget_monitors_repositoryt_hardware_inventoryt_device_matchert_device_matcher_udevt_instance_factoryt collectionst OrderedDictt _instancest_init_commandst _global_cfgt _variablestFalset_has_dynamic_optionst_devices_initedt#_get_config_options_used_by_dynamict_options_used_by_dynamicRt_cmd( tselftmonitors_repositorytstorage_factorythardware_inventorytdevice_matchertdevice_matcher_udevtinstance_factoryt global_cfgt variables((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt__init__s          cCs|jdS(N(tdestroy_instances(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytcleanup,scCs#|js|jt|_ndS(N(Rt _init_devicestTrue(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt init_devices/s  cCs'|jjjddjdddS(Nt.it_i(Rt __module__tsplit(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytname4scCsiS(s-Default configuration options for the plugin.((R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_config_options<scCsiS(s*Explanation of each config option function((tcls((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytget_config_options_hintsAscCsgS(snList of config options used by dynamic tuning. Their previous values will be automatically saved and restored.((R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRFscCsj|jj}xQ|D]I}||ks4|jrE||||t|tkr|St|j}|dkp=|dkS(Nttruet1(ttypetbooltstrtlower(Rtvalue((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _option_boolVsc Csf||jkr"td|n|j|}|jj|||||||}||j|<|S(s8Create new instance of the plugin and seize the devices.s.Plugin instance with name '%s' already exists.(Rt ExceptionR6R R( RR,tdevices_expressiontdevices_udev_regext script_pret script_postR3teffective_optionstinstance((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytcreate_instance`s cCs{|j|kr(td||fn|j|jkrMtd|n|j|j}|j||j|j=dS(sDestroy existing instance.s9Plugin instance '%s' does not belong to this plugin '%s'.s+Plugin instance '%s' was already destroyed.N(t_pluginR?R,Rt_destroy_instance(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytdestroy_instancels cCs.tjd|j|jf|j|dS(sInitialize an instance.sinitializing instance %s (%s)N(R1tdebugR,t_instance_init(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinitialize_instancewscCs[xGt|jjD]0}tjd|j|jf|j|qW|jjdS(sDestroy all instances.sdestroying instance %s (%s)N(tlistRtvaluesR1RJR,RHtclear(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR#|scCs|j||j|dS(N(trelease_devicest_instance_cleanup(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRHs cCs tdS(N(tNotImplementedError(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRKscCs tdS(N(RR(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRQscCs%t|_t|_t|_dS(N(Rt_devices_supportedtsett_assigned_devicest _free_devices(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR%s  cCsdS(sOverride this in a subclass to transform a list of device names (e.g. ['sda']) to a list of pyudev.Device objects, if your plugin supports itN(tNone(Rtdevices((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_device_objectsscCs|jdkr+t|jj|j|S|j|}|dkr`tjd|j tS|j j|j|}tg|D]}|j ^qSdS(Ns<Plugin '%s' does not support the 'devices_udev_regex' option( RARWRTR t match_listR@RYR1terrorR,R tsys_name(RRERXt udev_devicestx((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_matching_devicess cCs|js dStjd|j|j||j}t|dk|_|jsktjd|jn}|j}|j|jkr|d|j7}ntj d|dj |f|j j ||j |O_ |j|8_dS(Ns assigning devices to instance %sis*instance %s: no matching devices availables (%s)s!instance %s: assigning devices %ss, (RSR1RJR,R_RVtlentactiveR2tinfotjointassigned_devicestupdateRU(RREt to_assignR,((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytassign_free_devicess    cCsi|js dS|j|jB|j@}t|_|jj|jj|j|8_|j|O_dS(N(RStprocessed_devicesRdRURRaRORV(RREt to_release((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRPs     cCs7|jsdg}nx|D]}|||qWdS(N(RSRW(RREtcallbackRXtdevice((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_run_for_each_devices   cCsdS(N((RREtenabling((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_instance_pre_staticscCsdS(N((RRERm((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_instance_post_staticscCs|dkrdSt|dkr@tjd|j|fdS|jdsdtjddtStj j |}t }xR|D]J}tj } | j |jj|g} |r| jdn| j|tjd|t| ftjdtt| jyt|g| d td td t d | d |dt } | j\} } | jrtjd|| j| d ft}nWqttfk r}tjd||ft}qXqW|S(Nis1Instance '%s': no device to call script '%s' for.t/s<Relative paths cannot be used in script_pre or script_post. sUse ${i:PROFILE_DIR}.t full_rollbacks'calling script '%s' with arguments '%s'susing environment '%s'tstdouttstderrt close_fdstenvtcwdtuniversal_newlinessscript '%s' error: %d, '%s'isscript '%s' error: %s(RWR`R1R2R,t startswithR[RtostpathtdirnameR&tenvironReRtget_envtappendRbR;RJRMtitemsRRt communicatet returncodetOSErrortIOError(RREtscripttopRXRqtdir_nametrettdevR|t argumentstproctoutterrte((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_call_device_scriptsB      #   ! cCs|js dS|jr~|j||jd|j|j|t|j||j|t|j||j d|jn|j r|j j t jt jr|j||j|jn|jj|j|jjdS(sG Apply static and dynamic tuning if the plugin instance is active. Ntapply(Rathas_static_tuningRRBRdRnR&t_instance_apply_staticRoRCthas_dynamic_tuningRtgettconststCFG_DYNAMIC_TUNINGtCFG_DEF_DYNAMIC_TUNINGRlt_instance_apply_dynamicRhReRO(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_apply_tunings    $cCs|js dSt|jdkrBtjddj|jn|jj}|j r|j ||j d|t krt S|j |||t krt S|j ||jd|t krt StSdSdS(s< Verify static tuning if the plugin instance is active. is)BUG: Some devices have not been tuned: %ss, tverifyN(RaRWR`RdR1R[RcRhR0RRRBRt_instance_verify_staticRCR&(RREtignore_missingRX((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_verify_tunings   !!cCsW|js dS|jrS|jjtjtjrS|j||j|j j ndS(s< Apply dynamic tuning if the plugin instance is active. N( RaRRRRRRRlt_instance_update_dynamicRhR0(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_update_tuning$s $cCs|jr@|jjtjtjr@|j||j|jn|j r|j ||j d|jd||j |t |j|||j|t |j ||jd|jd|ndS(s8 Remove all tunings applied by the plugin instance. tunapplyRqN(RRRRRRRlt_instance_unapply_dynamicRhRRRCRnRt_instance_unapply_staticRoRB(RRERq((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pytinstance_unapply_tuning-s$  cCs$|j||j||jdS(N(t _execute_all_non_device_commandst_execute_all_device_commandsRd(RRE((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR<s cCsOt}|j||tkr't}n|j|||tkrKt}n|S(N(R&t_verify_all_non_device_commandsRt_verify_all_device_commands(RRERRXR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR@s   cCs$|j||j|j|dS(N(t_cleanup_all_device_commandsRht _cleanup_all_non_device_commands(RRERq((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRHs  cCswx`g|jD].}|j||j||dkr |^q D] }|j||j||q?W|j||dS(N(Rt _storage_gett _commandsRWt_check_and_save_valueR(RRERktopttoption((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRMsEcCs tdS(N(RR(RRERk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRSscCs tdS(N(RR(RRERk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRVscCs'tj|_|j|jdS(s Initialize commands. N(R RRt_autoregister_commandst_check_commands(R((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR]s cCs\x%|jjD]}|jdr(q nt||}t|dsLq n|jd}|jj|i|d6}d|jkrd |d<||d<|jd|d<|jd|dd|jkr||d<|jd|d<|jd|dsN(Rt__dict__RxtgetattrthasattrRRRRWR RtsortedtiterR(Rt member_nametmembert command_nameRb((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRes*     cCsmxft|jjD]O\}}|jdtr:qnd|ksRd|krtd|qqWdS(s2 Check if all commands are defined correctly. RRRTs,Plugin command '%s' is not defined correctlyN(RMRRRRt TypeError(RRtcommand((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs "cCskt|j}|dkr!dn|}|dkr9dn|}|dkrQdn|}d||||fS(Nts %s/%s/%s/%s(R9RRW(Rt instance_nameRt device_namet class_name((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _storage_keys  cCs3|j|j|d|}|jj||dS(NR,(RR,RRT(RRERR=RR5((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _storage_setscCs,|j|j|d|}|jj|S(NR,(RR,RR(RRERRR5((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRscCs,|j|j|d|}|jj|S(NR,(RR,Rtunset(RRERRR5((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_storage_unsetscCsxgt|jjD]}|ds|^qD]M}|jj|jj|dd}|dk r3|j|||q3q3WdS(NRR,( RMRRNRtexpandR3RRWt_execute_non_device_command(RRERt new_value((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs9% cCsxgt|jjD]}|dr|^qD]d}|jj|jj|dd}|dkrpq3nx$|D]}|j||||qwWq3WdS(NRR,( RMRRNRRR3RRWt_execute_device_command(RRERXRRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs 9%  cCst}xgt|jjD]}|ds|^qD]a}|jj|jj|dd}|dk r9|j ||||t krt }qq9q9W|S(NRR,( R&RMRRNRRR3RRWt_verify_non_device_commandR(RRERRRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs9% cCst}xgt|jjD]}|dr|^qD]l}|jj|dd}|dkrjq9nx8|D]0}|j|||||tkrqt}qqqqWq9W|S(NRR,( R&RMRRNR3RRWt_verify_device_commandR(RRERXRRRRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs9  !cCs|dk rt|}t|dkr.|S|d }|d}|dkrb|dkr^|S|Syb|dkrt|t|kr|SdSn/|dkrt|t|kr|SdSnWqtk rtjd||||fqXn|S(Nitshcannot compare new value '%s' with current value '%s' by operator '%s', using '%s' directly as new value(RR(RWR;R`tintt ValueErrorR1R2(RRt current_valuetnwsRtval((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_process_assignment_modifierss(         $cCs/|dk r |d|d|S|dSdS(NRR(RW(RRRkR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt_get_current_values cCsY|j||}|j||}|dk rU|dk rU|j||||n|S(N(RRRWR(RRERRkRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs cCso|ddk r-|dt||ttn>|j||||}|dk rk|d||dtndS(NRRTtsim(RWR&RR(RRERRkR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs  cCsi|ddk r*|dt|ttn;|j||d|}|dk re|d|dtndS(NRRTR(RWR&RR(RRERR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRs  cCsA|jjt|}tjd|r=tjdd|S|S(Ns\s*(0+,?)+([\da-fA-F]*,?)*\s*$s ^\s*(0+,?)+R(RtunquoteR;tretmatchtsub(RR=tv((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _norm_valuesc Cs|dkrdSt}|dkri|ri|dkrKtjtj|ntjtj||ftS|dk re|j|}|j|}yt |t |k}Wqet k ray"t |dt |dk}Wqbt k r]t |t |k}|s^t |j d}x3|D](}|j }||k}|r+Pq+q+Wq^qbXqeXn|j||||d||S(Nit|Rk(RWRR1RbRt STR_VERIFY_PROFILE_VALUE_MISSINGt'STR_VERIFY_PROFILE_DEVICE_VALUE_MISSINGR&RRRR;R+tstript_log_verification_result( RR,RRRRkRtvalsR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyt _verify_value s8    "     cCs|rh|dkr;tjtj|t|jfn)tjtj||t|jftS|dkrtj tj |t|jt|jfn8tj tj ||t|jt|jft SdS(N( RWR1RbRtSTR_VERIFY_PROFILE_VALUE_OKR;Rt"STR_VERIFY_PROFILE_DEVICE_VALUE_OKR&R[tSTR_VERIFY_PROFILE_VALUE_FAILt$STR_VERIFY_PROFILE_DEVICE_VALUE_FAILR(RR,tsuccessRRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR*s )) 88cCs|ddk r*|dt||t|S|j||d|}|j||}|dkrddS|d||t}|j|d||||S(NRRRTR,(RWR&RRR(RRERRkRRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR9s cCs|ddk r'|dt|t|S|j|}|j||}|dkrXdS|d|t}|j|d|||S(NRRTR,(RWR&RRR(RRERRRR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRCs cCsxtgt|jjD]}|ds|^qD]K}|jj|dddk sq|d|jkr9|j||q9q9WdS(NRR,( treversedRMRRNR3RRWRt_cleanup_non_device_command(RRER((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRMs?2cCsxtgt|jjD]}|dr|^qD]_}|jj|dddk sq|d|jkr9x$|D]}|j|||qxWq9q9WdS(NRR,( RRMRRNR3RRWRt_cleanup_device_command(RRERXRRk((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRRs?2 cCs|ddk r-|dtd|ttnN|j|||}|dk rh|d||dtn|j|||dS(NRRTR(RWRRR(RRERRkt old_value((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRXs  cCss|ddk r*|dtdttnE|j||}|dk r_|d|dtn|j||dS(NRRTR(RWRRR(RRERR((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyRas  N(CRR*t__doc__R"R$R'tpropertyR,t classmethodR-R/RR6R>RFRIRLR#RHRKRQR%RYR_RgRPRlRnRoRRRRRRRRRRRRRRRRWRRRRRRRRRRRRRRRRRRRRRR(((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyR s|                #                       !    (Rt tuned.constsRttuned.profiles.variablesttunedt tuned.logsR ttuned.utils.commandsRRyt subprocessRRtlogsRR1tobjectR(((s6/usr/lib/python2.7/site-packages/tuned/plugins/base.pyts     PK[0yII1site-packages/tuned/plugins/instance/instance.pyonu[ \c@sdefdYZdS(tInstancecBs eZdZdZedZedZedZejdZedZ edZ edZ ed Z ed Z ed Zed Zed ZedZdZdZdZedZdZRS(s cCsv||_||_||_||_||_||_||_t|_t |_ t |_ t |_ t |_dS(N(t_plugint_namet_devices_expressiont_devices_udev_regext _script_pret _script_postt_optionstTruet_activetFalset_has_static_tuningt_has_dynamic_tuningtsett_assigned_devicest_processed_devices(tselftplugintnametdevices_expressiontdevices_udev_regext script_pret script_posttoptions((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt__init__s           cCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyRscCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyRscCs|jS(s>The instance performs some tuning (otherwise it is suspended).(R (R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytactivescCs ||_dS(N(R (Rtvalue((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR#scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR'scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytassigned_devices+scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytprocessed_devices/scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR3scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR7scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR;scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR?scCs|jS(N(R (R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pythas_static_tuningCscCs|jS(N(R (R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pythas_dynamic_tuningGscCs|jj|dS(N(Rtinstance_apply_tuning(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt apply_tuningMscCs|jj||S(N(Rtinstance_verify_tuning(Rtignore_missing((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt verify_tuningPscCs|jj|dS(N(Rtinstance_update_tuning(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt update_tuningSscCs|jj||dS(N(Rtinstance_unapply_tuning(Rt full_rollback((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytunapply_tuningVscCs|j|jj|dS(N(R(Rtdestroy_instance(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytdestroyYs (t__name__t __module__t__doc__RtpropertyRRRtsetterRRRRRRRRRR R#R%R R(R*(((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyRs(     N(tobjectR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytsPK[hQ1site-packages/tuned/plugins/instance/__init__.pycnu[ \c@s$ddlmZddlmZdS(i(tInstance(tFactoryN(tinstanceRtfactoryR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/__init__.pytsPK[`Ύ0site-packages/tuned/plugins/instance/instance.pynu[class Instance(object): """ """ def __init__(self, plugin, name, devices_expression, devices_udev_regex, script_pre, script_post, options): self._plugin = plugin self._name = name self._devices_expression = devices_expression self._devices_udev_regex = devices_udev_regex self._script_pre = script_pre self._script_post = script_post self._options = options self._active = True self._has_static_tuning = False self._has_dynamic_tuning = False self._assigned_devices = set() self._processed_devices = set() # properties @property def plugin(self): return self._plugin @property def name(self): return self._name @property def active(self): """The instance performs some tuning (otherwise it is suspended).""" return self._active @active.setter def active(self, value): self._active = value @property def devices_expression(self): return self._devices_expression @property def assigned_devices(self): return self._assigned_devices @property def processed_devices(self): return self._processed_devices @property def devices_udev_regex(self): return self._devices_udev_regex @property def script_pre(self): return self._script_pre @property def script_post(self): return self._script_post @property def options(self): return self._options @property def has_static_tuning(self): return self._has_static_tuning @property def has_dynamic_tuning(self): return self._has_dynamic_tuning # methods def apply_tuning(self): self._plugin.instance_apply_tuning(self) def verify_tuning(self, ignore_missing): return self._plugin.instance_verify_tuning(self, ignore_missing) def update_tuning(self): self._plugin.instance_update_tuning(self) def unapply_tuning(self, full_rollback = False): self._plugin.instance_unapply_tuning(self, full_rollback) def destroy(self): self.unapply_tuning() self._plugin.destroy_instance(self) PK[Lb"<<0site-packages/tuned/plugins/instance/__init__.pynu[from .instance import Instance from .factory import Factory PK[0yII1site-packages/tuned/plugins/instance/instance.pycnu[ \c@sdefdYZdS(tInstancecBs eZdZdZedZedZedZejdZedZ edZ edZ ed Z ed Z ed Zed Zed ZedZdZdZdZedZdZRS(s cCsv||_||_||_||_||_||_||_t|_t |_ t |_ t |_ t |_dS(N(t_plugint_namet_devices_expressiont_devices_udev_regext _script_pret _script_postt_optionstTruet_activetFalset_has_static_tuningt_has_dynamic_tuningtsett_assigned_devicest_processed_devices(tselftplugintnametdevices_expressiontdevices_udev_regext script_pret script_posttoptions((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt__init__s           cCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyRscCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyRscCs|jS(s>The instance performs some tuning (otherwise it is suspended).(R (R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytactivescCs ||_dS(N(R (Rtvalue((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR#scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR'scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytassigned_devices+scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytprocessed_devices/scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR3scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR7scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR;scCs|jS(N(R(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyR?scCs|jS(N(R (R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pythas_static_tuningCscCs|jS(N(R (R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pythas_dynamic_tuningGscCs|jj|dS(N(Rtinstance_apply_tuning(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt apply_tuningMscCs|jj||S(N(Rtinstance_verify_tuning(Rtignore_missing((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt verify_tuningPscCs|jj|dS(N(Rtinstance_update_tuning(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyt update_tuningSscCs|jj||dS(N(Rtinstance_unapply_tuning(Rt full_rollback((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytunapply_tuningVscCs|j|jj|dS(N(R(Rtdestroy_instance(R((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytdestroyYs (t__name__t __module__t__doc__RtpropertyRRRtsetterRRRRRRRRRR R#R%R R(R*(((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pyRs(     N(tobjectR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/instance.pytsPK[)0site-packages/tuned/plugins/instance/factory.pyonu[ \c@s*ddlmZdefdYZdS(i(tInstancetFactorycBseZdZRS(cOst||}|S(N(R(tselftargstkwargstinstance((sB/usr/lib/python2.7/site-packages/tuned/plugins/instance/factory.pytcreates(t__name__t __module__R(((sB/usr/lib/python2.7/site-packages/tuned/plugins/instance/factory.pyRsN(RRtobjectR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/instance/factory.pytsPK[hQ1site-packages/tuned/plugins/instance/__init__.pyonu[ \c@s$ddlmZddlmZdS(i(tInstance(tFactoryN(tinstanceRtfactoryR(((sC/usr/lib/python2.7/site-packages/tuned/plugins/instance/__init__.pytsPK[r/site-packages/tuned/plugins/instance/factory.pynu[from .instance import Instance class Factory(object): def create(self, *args, **kwargs): instance = Instance(*args, **kwargs) return instance PK[)0site-packages/tuned/plugins/instance/factory.pycnu[ \c@s*ddlmZdefdYZdS(i(tInstancetFactorycBseZdZRS(cOst||}|S(N(R(tselftargstkwargstinstance((sB/usr/lib/python2.7/site-packages/tuned/plugins/instance/factory.pytcreates(t__name__t __module__R(((sB/usr/lib/python2.7/site-packages/tuned/plugins/instance/factory.pyRsN(RRtobjectR(((sB/usr/lib/python2.7/site-packages/tuned/plugins/instance/factory.pytsPK[]88)site-packages/tuned/plugins/plugin_net.pynu[from . import base from .decorators import * import tuned.logs from tuned.utils.nettool import ethcard from tuned.utils.commands import commands import os import re log = tuned.logs.get() WOL_VALUES = "pumbagsd" class NetTuningPlugin(base.Plugin): """ Plugin for ethernet card options tuning. """ def __init__(self, *args, **kwargs): super(NetTuningPlugin, self).__init__(*args, **kwargs) self._load_smallest = 0.05 self._level_steps = 6 self._cmd = commands() def _init_devices(self): self._devices_supported = True self._free_devices = set() self._assigned_devices = set() re_not_virtual = re.compile('(?!.*/virtual/.*)') for device in self._hardware_inventory.get_devices("net"): if re_not_virtual.match(device.device_path): self._free_devices.add(device.sys_name) log.debug("devices: %s" % str(self._free_devices)); def _get_device_objects(self, devices): return [self._hardware_inventory.get_device("net", x) for x in devices] def _instance_init(self, instance): instance._has_static_tuning = True if self._option_bool(instance.options["dynamic"]): instance._has_dynamic_tuning = True instance._load_monitor = self._monitors_repository.create("net", instance.assigned_devices) instance._idle = {} instance._stats = {} else: instance._has_dynamic_tuning = False instance._load_monitor = None instance._idle = None instance._stats = None def _instance_cleanup(self, instance): if instance._load_monitor is not None: self._monitors_repository.delete(instance._load_monitor) instance._load_monitor = None def _instance_apply_dynamic(self, instance, device): self._instance_update_dynamic(instance, device) def _instance_update_dynamic(self, instance, device): load = [int(value) for value in instance._load_monitor.get_device_load(device)] if load is None: return if not device in instance._stats: self._init_stats_and_idle(instance, device) self._update_stats(instance, device, load) self._update_idle(instance, device) stats = instance._stats[device] idle = instance._idle[device] if idle["level"] == 0 and idle["read"] >= self._level_steps and idle["write"] >= self._level_steps: idle["level"] = 1 log.info("%s: setting 100Mbps" % device) ethcard(device).set_speed(100) elif idle["level"] == 1 and (idle["read"] == 0 or idle["write"] == 0): idle["level"] = 0 log.info("%s: setting max speed" % device) ethcard(device).set_max_speed() log.debug("%s load: read %0.2f, write %0.2f" % (device, stats["read"], stats["write"])) log.debug("%s idle: read %d, write %d, level %d" % (device, idle["read"], idle["write"], idle["level"])) @classmethod def _get_config_options_coalesce(cls): return { "adaptive-rx": None, "adaptive-tx": None, "rx-usecs": None, "rx-frames": None, "rx-usecs-irq": None, "rx-frames-irq": None, "tx-usecs": None, "tx-frames": None, "tx-usecs-irq": None, "tx-frames-irq": None, "stats-block-usecs": None, "pkt-rate-low": None, "rx-usecs-low": None, "rx-frames-low": None, "tx-usecs-low": None, "tx-frames-low": None, "pkt-rate-high": None, "rx-usecs-high": None, "rx-frames-high": None, "tx-usecs-high": None, "tx-frames-high": None, "sample-interval": None } @classmethod def _get_config_options_pause(cls): return { "autoneg": None, "rx": None, "tx": None } @classmethod def _get_config_options_ring(cls): return { "rx": None, "rx-mini": None, "rx-jumbo": None, "tx": None } @classmethod def _get_config_options(cls): return { "dynamic": True, "wake_on_lan": None, "nf_conntrack_hashsize": None, "features": None, "coalesce": None, "pause": None, "ring": None, } def _init_stats_and_idle(self, instance, device): max_speed = self._calc_speed(ethcard(device).get_max_speed()) instance._stats[device] = { "new": 4 * [0], "max": 2 * [max_speed, 1] } instance._idle[device] = { "level": 0, "read": 0, "write": 0 } def _update_stats(self, instance, device, new_load): # put new to old instance._stats[device]["old"] = old_load = instance._stats[device]["new"] instance._stats[device]["new"] = new_load # load difference diff = [new_old[0] - new_old[1] for new_old in zip(new_load, old_load)] instance._stats[device]["diff"] = diff # adapt maximum expected load if the difference is higer old_max_load = instance._stats[device]["max"] max_load = [max(pair) for pair in zip(old_max_load, diff)] instance._stats[device]["max"] = max_load # read/write ratio instance._stats[device]["read"] = float(diff[0]) / float(max_load[0]) instance._stats[device]["write"] = float(diff[2]) / float(max_load[2]) def _update_idle(self, instance, device): # increase counter if there is no load, otherwise reset the counter for operation in ["read", "write"]: if instance._stats[device][operation] < self._load_smallest: instance._idle[device][operation] += 1 else: instance._idle[device][operation] = 0 def _instance_unapply_dynamic(self, instance, device): if device in instance._idle and instance._idle[device]["level"] > 0: instance._idle[device]["level"] = 0 log.info("%s: setting max speed" % device) ethcard(device).set_max_speed() def _calc_speed(self, speed): # 0.6 is just a magical constant (empirical value): Typical workload on netcard won't exceed # that and if it does, then the code is smart enough to adapt it. # 1024 * 1024 as for MB -> B # speed / 7 Mb -> MB return (int) (0.6 * 1024 * 1024 * speed / 8) # parse features/coalesce config parameters (those defined in profile configuration) # context is for error message def _parse_config_parameters(self, value, context): # split supporting various dellimeters v = str(re.sub(r"(:\s*)|(\s+)|(\s*;\s*)|(\s*,\s*)", " ", value)).split() lv = len(v) if lv % 2 != 0: log.error("invalid %s parameter: '%s'" % (context, str(value))) return None if lv == 0: return dict() # convert flat list to dict return dict(list(zip(v[::2], v[1::2]))) # parse features/coalesce device parameters (those returned by ethtool) def _parse_device_parameters(self, value): # substitute "Adaptive RX: val1 TX: val2" to 'adaptive-rx: val1' and # 'adaptive-tx: val2' and workaround for ethtool inconsistencies # (rhbz#1225375) value = self._cmd.multiple_re_replace({ "Adaptive RX:": "adaptive-rx:", "\s+TX:": "\nadaptive-tx:", "rx-frame-low:": "rx-frames-low:", "rx-frame-high:": "rx-frames-high:", "tx-frame-low:": "tx-frames-low:", "tx-frame-high:": "tx-frames-high:", "large-receive-offload:": "lro:", "rx-checksumming:": "rx:", "tx-checksumming:": "tx:", "scatter-gather:": "sg:", "tcp-segmentation-offload:": "tso:", "udp-fragmentation-offload:": "ufo:", "generic-segmentation-offload:": "gso:", "generic-receive-offload:": "gro:", "rx-vlan-offload:": "rxvlan:", "tx-vlan-offload:": "txvlan:", "ntuple-filters:": "ntuple:", "receive-hashing:": "rxhash:", }, value) # remove empty lines, remove fixed parameters (those with "[fixed]") vl = [v for v in value.split('\n') if len(str(v)) > 0 and not re.search("\[fixed\]$", str(v))] if len(vl) < 2: return None # skip first line (device name), split to key/value, # remove pairs which are not key/value return dict([u for u in [re.split(r":\s*", str(v)) for v in vl[1:]] if len(u) == 2]) @classmethod def _nf_conntrack_hashsize_path(self): return "/sys/module/nf_conntrack/parameters/hashsize" @command_set("wake_on_lan", per_device=True) def _set_wake_on_lan(self, value, device, sim): if value is None: return None # see man ethtool for possible wol values, 0 added as an alias for 'd' value = re.sub(r"0", "d", str(value)); if not re.match(r"^[" + WOL_VALUES + r"]+$", value): log.warn("Incorrect 'wake_on_lan' value.") return None if not sim: self._cmd.execute(["ethtool", "-s", device, "wol", value]) return value @command_get("wake_on_lan") def _get_wake_on_lan(self, device, ignore_missing=False): value = None try: m = re.match(r".*Wake-on:\s*([" + WOL_VALUES + "]+).*", self._cmd.execute(["ethtool", device])[1], re.S) if m: value = m.group(1) except IOError: pass return value @command_set("nf_conntrack_hashsize") def _set_nf_conntrack_hashsize(self, value, sim): if value is None: return None hashsize = int(value) if hashsize >= 0: if not sim: self._cmd.write_to_file(self._nf_conntrack_hashsize_path(), hashsize) return hashsize else: return None @command_get("nf_conntrack_hashsize") def _get_nf_conntrack_hashsize(self): value = self._cmd.read_file(self._nf_conntrack_hashsize_path()) if len(value) > 0: return int(value) return None # d is dict: {parameter: value} def _check_parameters(self, context, d): if context == "features": return True params = set(d.keys()) supported_getter = { "coalesce": self._get_config_options_coalesce, \ "pause": self._get_config_options_pause, \ "ring": self._get_config_options_ring } supported = set(supported_getter[context]().keys()) if not params.issubset(supported): log.error("unknown %s parameter(s): %s" % (context, str(params - supported))) return False return True # parse output of ethtool -a def _parse_pause_parameters(self, s): s = self._cmd.multiple_re_replace(\ {"Autonegotiate": "autoneg", "RX": "rx", "TX": "tx"}, s) l = s.split("\n")[1:] l = [x for x in l if x != '' and not re.search(r"\[fixed\]", x)] return dict([x for x in [re.split(r":\s*", x) for x in l] if len(x) == 2]) # parse output of ethtool -g def _parse_ring_parameters(self, s): a = re.split(r"^Current hardware settings:$", s, flags=re.MULTILINE) s = a[1] s = self._cmd.multiple_re_replace(\ {"RX": "rx", "RX Mini": "rx-mini", "RX Jumbo": "rx-jumbo", "TX": "tx"}, s) l = s.split("\n") l = [x for x in l if x != ''] l = [x for x in [re.split(r":\s*", x) for x in l] if len(x) == 2] return dict(l) def _check_device_support(self, context, parameters, device, dev_params): """Filter unsupported parameters and log warnings about it Positional parameters: context -- context of change parameters -- parameters to change device -- name of device on which should be parameters set dev_params -- dictionary of currently known parameters of device """ supported_parameters = set(dev_params.keys()) parameters_to_change = set(parameters.keys()) # if parameters_to_change contains unsupported parameter(s) then remove # it/them unsupported_parameters = (parameters_to_change - supported_parameters) for param in unsupported_parameters: log.warning("%s parameter %s is not supported by device %s" % ( context, param, device, )) parameters.pop(param, None) def _get_device_parameters(self, context, device): context2opt = { "coalesce": "-c", "features": "-k", "pause": "-a", "ring": "-g" } opt = context2opt[context] ret, value = self._cmd.execute(["ethtool", opt, device]) if ret != 0 or len(value) == 0: return None context2parser = { "coalesce": self._parse_device_parameters, \ "features": self._parse_device_parameters, \ "pause": self._parse_pause_parameters, \ "ring": self._parse_ring_parameters } parser = context2parser[context] d = parser(value) if context == "coalesce" and not self._check_parameters(context, d): return None return d def _set_device_parameters(self, context, value, device, sim, dev_params = None): if value is None or len(value) == 0: return None d = self._parse_config_parameters(value, context) if d is None or not self._check_parameters(context, d): return {} # check if device supports parameters and filter out unsupported ones if dev_params: self._check_device_support(context, d, device, dev_params) if not sim and len(d) != 0: log.debug("setting %s: %s" % (context, str(d))) context2opt = { "coalesce": "-C", "features": "-K", "pause": "-A", "ring": "-G" } opt = context2opt[context] # ignore ethtool return code 80, it means parameter is already set self._cmd.execute(["ethtool", opt, device] + self._cmd.dict2list(d), no_errors = [80]) return d def _custom_parameters(self, context, start, value, device, verify): storage_key = self._storage_key( command_name = context, device_name = device) if start: params_current = self._get_device_parameters(context, device) params_set = self._set_device_parameters(context, value, device, verify, dev_params = params_current) # if none of parameters passed checks then the command completely # failed if len(params_set) == 0: return False relevant_params_current = [(param, value) for param, value in params_current.items() if param in params_set] relevant_params_current = dict(relevant_params_current) if verify: res = (self._cmd.dict2list(params_set) == self._cmd.dict2list(relevant_params_current)) self._log_verification_result(context, res, params_set, relevant_params_current, device = device) return res # saved are only those parameters which passed checks self._storage.set(storage_key, " ".join( self._cmd.dict2list(relevant_params_current))) else: original_value = self._storage.get(storage_key) # in storage are only those parameters which were already tested # so skip check for supported parameters self._set_device_parameters(context, original_value, device, False) return None @command_custom("features", per_device = True) def _features(self, start, value, device, verify, ignore_missing): return self._custom_parameters("features", start, value, device, verify) @command_custom("coalesce", per_device = True) def _coalesce(self, start, value, device, verify, ignore_missing): return self._custom_parameters("coalesce", start, value, device, verify) @command_custom("pause", per_device = True) def _pause(self, start, value, device, verify, ignore_missing): return self._custom_parameters("pause", start, value, device, verify) @command_custom("ring", per_device = True) def _ring(self, start, value, device, verify, ignore_missing): return self._custom_parameters("ring", start, value, device, verify) PK[DW--/site-packages/tuned/plugins/plugin_eeepc_she.pynu[from . import base from . import exceptions import tuned.logs from tuned.utils.commands import commands import os log = tuned.logs.get() class EeePCSHEPlugin(base.Plugin): """ Plugin for tuning FSB (front side bus) speed on Asus EEE PCs with SHE (Super Hybrid Engine) support. """ def __init__(self, *args, **kwargs): self._cmd = commands() self._control_file = "/sys/devices/platform/eeepc/cpufv" if not os.path.isfile(self._control_file): self._control_file = "/sys/devices/platform/eeepc-wmi/cpufv" if not os.path.isfile(self._control_file): raise exceptions.NotSupportedPluginException("Plugin is not supported on your hardware.") super(EeePCSHEPlugin, self).__init__(*args, **kwargs) @classmethod def _get_config_options(self): return { "load_threshold_normal" : 0.6, "load_threshold_powersave" : 0.4, "she_powersave" : 2, "she_normal" : 1, } def _instance_init(self, instance): instance._has_static_tuning = False instance._has_dynamic_tuning = True instance._she_mode = None instance._load_monitor = self._monitors_repository.create("load", None) def _instance_cleanup(self, instance): if instance._load_monitor is not None: self._monitors_repository.delete(instance._load_monitor) instance._load_monitor = None def _instance_update_dynamic(self, instance, device): load = instance._load_monitor.get_load()["system"] if load <= instance.options["load_threshold_powersave"]: self._set_she_mode(instance, "powersave") elif load >= instance.options["load_threshold_normal"]: self._set_she_mode(instance, "normal") def _instance_unapply_dynamic(self, instance, device): # FIXME: restore previous value self._set_she_mode(instance, "normal") def _set_she_mode(self, instance, new_mode): new_mode_numeric = int(instance.options["she_%s" % new_mode]) if instance._she_mode != new_mode_numeric: log.info("new eeepc_she mode %s (%d) " % (new_mode, new_mode_numeric)) self._cmd.write_to_file(self._control_file, "%s" % new_mode_numeric) self._she_mode = new_mode_numeric PK[#j2j20site-packages/tuned/plugins/plugin_bootloader.pynu[from . import base from .decorators import * import tuned.logs from . import exceptions from tuned.utils.commands import commands import tuned.consts as consts import os import re import tempfile log = tuned.logs.get() class BootloaderPlugin(base.Plugin): """ Plugin for tuning bootloader options. Currently only grub2 is supported and reboot is required to apply the tunings. These tunings are unloaded only on profile change followed by reboot. """ def __init__(self, *args, **kwargs): if not os.path.isfile(consts.GRUB2_TUNED_TEMPLATE_PATH): raise exceptions.NotSupportedPluginException("Required GRUB2 template not found, disabling plugin.") super(BootloaderPlugin, self).__init__(*args, **kwargs) self._cmd = commands() def _instance_init(self, instance): instance._has_dynamic_tuning = False instance._has_static_tuning = True # controls grub2_cfg rewrites in _instance_post_static self.update_grub2_cfg = False self._initrd_remove_dir = False self._initrd_dst_img_val = None self._cmdline_val = "" self._initrd_val = "" self._grub2_cfg_file_names = self._get_grub2_cfg_files() def _instance_cleanup(self, instance): pass @classmethod def _get_config_options(cls): return { "grub2_cfg_file": None, "initrd_dst_img": None, "initrd_add_img": None, "initrd_add_dir": None, "initrd_remove_dir": None, "cmdline": None, } def _get_effective_options(self, options): """Merge provided options with plugin default options and merge all cmdline.* options.""" effective = self._get_config_options().copy() cmdline_keys = [] for key in options: if str(key).startswith("cmdline"): cmdline_keys.append(key) elif key in effective: effective[key] = options[key] else: log.warn("Unknown option '%s' for plugin '%s'." % (key, self.__class__.__name__)) cmdline_keys.sort() cmdline = "" for key in cmdline_keys: val = options[key] if val is None or val == "": continue op = val[0] vals = val[1:].strip() if op == "+" and vals != "": cmdline += " " + vals elif op == "-" and vals != "": for p in vals.split(): regex = re.escape(p) cmdline = re.sub(r"(\A|\s)" + regex + r"(?=\Z|\s)", r"", cmdline) else: cmdline += " " + val cmdline = cmdline.strip() if cmdline != "": effective["cmdline"] = cmdline return effective def _get_grub2_cfg_files(self): cfg_files = [] for f in consts.GRUB2_CFG_FILES: if os.path.exists(f): cfg_files.append(f) return cfg_files def _patch_bootcmdline(self, d): return self._cmd.add_modify_option_in_file(consts.BOOT_CMDLINE_FILE, d) def _remove_grub2_tuning(self): if not self._grub2_cfg_file_names: log.info("cannot find grub.cfg to patch") return self._patch_bootcmdline({consts.BOOT_CMDLINE_TUNED_VAR : "", consts.BOOT_CMDLINE_INITRD_ADD_VAR : ""}) for f in self._grub2_cfg_file_names: self._cmd.add_modify_option_in_file(f, {"set\s+" + consts.GRUB2_TUNED_VAR : "", "set\s+" + consts.GRUB2_TUNED_INITRD_VAR : ""}, add = False) if self._initrd_dst_img_val is not None: log.info("removing initrd image '%s'" % self._initrd_dst_img_val) self._cmd.unlink(self._initrd_dst_img_val) def _instance_unapply_static(self, instance, full_rollback = False): if full_rollback: log.info("removing grub2 tuning previously added by Tuned") self._remove_grub2_tuning() self._update_grubenv({"tuned_params" : "", "tuned_initrd" : ""}) def _grub2_cfg_unpatch(self, grub2_cfg): log.debug("unpatching grub.cfg") cfg = re.sub(r"^\s*set\s+" + consts.GRUB2_TUNED_VAR + "\s*=.*\n", "", grub2_cfg, flags = re.MULTILINE) grub2_cfg = re.sub(r" *\$" + consts.GRUB2_TUNED_VAR, "", cfg, flags = re.MULTILINE) cfg = re.sub(r"^\s*set\s+" + consts.GRUB2_TUNED_INITRD_VAR + "\s*=.*\n", "", grub2_cfg, flags = re.MULTILINE) grub2_cfg = re.sub(r" *\$" + consts.GRUB2_TUNED_INITRD_VAR, "", cfg, flags = re.MULTILINE) cfg = re.sub(consts.GRUB2_TEMPLATE_HEADER_BEGIN + r"\n", "", grub2_cfg, flags = re.MULTILINE) return re.sub(consts.GRUB2_TEMPLATE_HEADER_END + r"\n+", "", cfg, flags = re.MULTILINE) def _grub2_cfg_patch_initial(self, grub2_cfg, d): log.debug("initial patching of grub.cfg") s = r"\1\n\n" + consts.GRUB2_TEMPLATE_HEADER_BEGIN + "\n" for opt in d: s += r"set " + self._cmd.escape(opt) + "=\"" + self._cmd.escape(d[opt]) + "\"\n" s += consts.GRUB2_TEMPLATE_HEADER_END + r"\n" grub2_cfg = re.sub(r"^(\s*###\s+END\s+[^#]+/00_header\s+### *)\n", s, grub2_cfg, flags = re.MULTILINE) d2 = {"linux" : consts.GRUB2_TUNED_VAR, "initrd" : consts.GRUB2_TUNED_INITRD_VAR} for i in d2: # add tuned parameters to all kernels grub2_cfg = re.sub(r"^(\s*" + i + r"(16|efi)?\s+.*)$", r"\1 $" + d2[i], grub2_cfg, flags = re.MULTILINE) # remove tuned parameters from rescue kernels grub2_cfg = re.sub(r"^(\s*" + i + r"(?:16|efi)?\s+\S+rescue.*)\$" + d2[i] + r" *(.*)$", r"\1\2", grub2_cfg, flags = re.MULTILINE) # fix whitespaces in rescue kernels grub2_cfg = re.sub(r"^(\s*" + i + r"(?:16|efi)?\s+\S+rescue.*) +$", r"\1", grub2_cfg, flags = re.MULTILINE) return grub2_cfg def _grub2_default_env_patch(self): grub2_default_env = self._cmd.read_file(consts.GRUB2_DEFAULT_ENV_FILE) if len(grub2_default_env) <= 0: log.info("cannot read '%s'" % consts.GRUB2_DEFAULT_ENV_FILE) return False d = {"GRUB_CMDLINE_LINUX_DEFAULT" : consts.GRUB2_TUNED_VAR, "GRUB_INITRD_OVERLAY" : consts.GRUB2_TUNED_INITRD_VAR} write = False for i in d: if re.search(r"^[^#]*\b" + i + r"\s*=.*\\\$" + d[i] + r"\b.*$", grub2_default_env, flags = re.MULTILINE) is None: write = True if grub2_default_env[-1] != "\n": grub2_default_env += "\n" grub2_default_env += i + "=\"${" + i + ":+$" + i + r" }\$" + d[i] + "\"\n" if write: log.debug("patching '%s'" % consts.GRUB2_DEFAULT_ENV_FILE) self._cmd.write_to_file(consts.GRUB2_DEFAULT_ENV_FILE, grub2_default_env) return True def _grub2_cfg_patch(self, d): log.debug("patching grub.cfg") if not self._grub2_cfg_file_names: log.info("cannot find grub.cfg to patch") return False for f in self._grub2_cfg_file_names: grub2_cfg = self._cmd.read_file(f) if len(grub2_cfg) <= 0: log.info("cannot patch %s" % f) return False log.debug("adding boot command line parameters to '%s'" % f) grub2_cfg_new = grub2_cfg patch_initial = False for opt in d: (grub2_cfg_new, nsubs) = re.subn(r"\b(set\s+" + opt + "\s*=).*$", r"\1" + "\"" + d[opt] + "\"", grub2_cfg_new, flags = re.MULTILINE) if nsubs < 1 or re.search(r"\$" + opt, grub2_cfg, flags = re.MULTILINE) is None: patch_initial = True # workaround for rhbz#1442117 if len(re.findall(r"\$" + consts.GRUB2_TUNED_VAR, grub2_cfg, flags = re.MULTILINE)) != \ len(re.findall(r"\$" + consts.GRUB2_TUNED_INITRD_VAR, grub2_cfg, flags = re.MULTILINE)): patch_initial = True if patch_initial: grub2_cfg_new = self._grub2_cfg_patch_initial(self._grub2_cfg_unpatch(grub2_cfg), d) self._cmd.write_to_file(f, grub2_cfg_new) self._grub2_default_env_patch() return True def _grub2_update(self): self._grub2_cfg_patch({consts.GRUB2_TUNED_VAR : self._cmdline_val, consts.GRUB2_TUNED_INITRD_VAR : self._initrd_val}) self._patch_bootcmdline({consts.BOOT_CMDLINE_TUNED_VAR : self._cmdline_val, consts.BOOT_CMDLINE_INITRD_ADD_VAR : self._initrd_val}) def _has_bls(self): return os.path.exists(consts.BLS_ENTRIES_PATH) def _update_grubenv(self, d): log.debug("updating grubenv, setting %s" % str(d)); l = ["%s=%s" % (str(option), str(value)) for option, value in d.items()] (rc, out) = self._cmd.execute(["grub2-editenv", "-", "set"] + l) if rc != 0: log.warn("cannot update grubenv: '%s'" % out) return False; return True def _bls_entries_patch_initial(self): machine_id = self._cmd.get_machine_id() if machine_id == "": return False log.debug("running kernel update hook '%s' to patch BLS entries" % consts.KERNEL_UPDATE_HOOK_FILE) (rc, out) = self._cmd.execute([consts.KERNEL_UPDATE_HOOK_FILE, "add"], env = {"KERNEL_INSTALL_MACHINE_ID" : machine_id}) if rc != 0: log.warn("cannot patch BLS entries: '%s'" % out) return False return True def _bls_update(self): log.debug("updating BLS") if self._has_bls() and \ self._update_grubenv({"tuned_params" : self._cmdline_val, "tuned_initrd" : self._initrd_val}) and \ self._bls_entries_patch_initial(): return True return False def _init_initrd_dst_img(self, name): if self._initrd_dst_img_val is None: self._initrd_dst_img_val = os.path.join(consts.BOOT_DIR, os.path.basename(name)) def _check_petitboot(self): return os.path.isdir(consts.PETITBOOT_DETECT_DIR) def _install_initrd(self, img): if self._check_petitboot(): log.warn("Detected Petitboot which doesn't support initrd overlays. The initrd overlay will be ignored by bootloader.") log.info("installing initrd image as '%s'" % self._initrd_dst_img_val) img_name = os.path.basename(self._initrd_dst_img_val) if not self._cmd.copy(img, self._initrd_dst_img_val): return False self.update_grub2_cfg = True curr_cmdline = self._cmd.read_file("/proc/cmdline").rstrip() initrd_grubpath = "/" lc = len(curr_cmdline) if lc: path = re.sub(r"^\s*BOOT_IMAGE=\s*(\S*/).*$", "\\1", curr_cmdline) if len(path) < lc: initrd_grubpath = path self._initrd_val = os.path.join(initrd_grubpath, img_name) return True @command_custom("grub2_cfg_file") def _grub2_cfg_file(self, enabling, value, verify, ignore_missing): # nothing to verify if verify: return None if enabling and value is not None: self._grub2_cfg_file_names = [str(value)] @command_custom("initrd_dst_img") def _initrd_dst_img(self, enabling, value, verify, ignore_missing): # nothing to verify if verify: return None if enabling and value is not None: self._initrd_dst_img_val = str(value) if self._initrd_dst_img_val == "": return False if self._initrd_dst_img_val[0] != "/": self._initrd_dst_img_val = os.path.join(consts.BOOT_DIR, self._initrd_dst_img_val) @command_custom("initrd_remove_dir") def _initrd_remove_dir(self, enabling, value, verify, ignore_missing): # nothing to verify if verify: return None if enabling and value is not None: self._initrd_remove_dir = self._cmd.get_bool(value) == "1" @command_custom("initrd_add_img", per_device = False, priority = 10) def _initrd_add_img(self, enabling, value, verify, ignore_missing): # nothing to verify if verify: return None if enabling and value is not None: src_img = str(value) self._init_initrd_dst_img(src_img) if src_img == "": return False if not self._install_initrd(src_img): return False @command_custom("initrd_add_dir", per_device = False, priority = 10) def _initrd_add_dir(self, enabling, value, verify, ignore_missing): # nothing to verify if verify: return None if enabling and value is not None: src_dir = str(value) self._init_initrd_dst_img(src_dir) if src_dir == "": return False if not os.path.isdir(src_dir): log.error("error: cannot create initrd image, source directory '%s' doesn't exist" % src_dir) return False log.info("generating initrd image from directory '%s'" % src_dir) (fd, tmpfile) = tempfile.mkstemp(prefix = "tuned-bootloader-", suffix = ".tmp") log.debug("writing initrd image to temporary file '%s'" % tmpfile) os.close(fd) (rc, out) = self._cmd.execute("find . | cpio -co > %s" % tmpfile, cwd = src_dir, shell = True) log.debug("cpio log: %s" % out) if rc != 0: log.error("error generating initrd image") self._cmd.unlink(tmpfile, no_error = True) return False self._install_initrd(tmpfile) self._cmd.unlink(tmpfile) if self._initrd_remove_dir: log.info("removing directory '%s'" % src_dir) self._cmd.rmtree(src_dir) @command_custom("cmdline", per_device = False, priority = 10) def _cmdline(self, enabling, value, verify, ignore_missing): v = self._variables.expand(self._cmd.unquote(value)) if verify: cmdline = self._cmd.read_file("/proc/cmdline") if len(cmdline) == 0: return None cmdline_set = set(cmdline.split()) value_set = set(v.split()) cmdline_intersect = cmdline_set.intersection(value_set) if cmdline_intersect == value_set: log.info(consts.STR_VERIFY_PROFILE_VALUE_OK % ("cmdline", str(value_set))) return True else: log.error(consts.STR_VERIFY_PROFILE_VALUE_FAIL % ("cmdline", str(cmdline_intersect), str(value_set))) return False if enabling and value is not None: log.info("installing additional boot command line parameters to grub2") self.update_grub2_cfg = True self._cmdline_val = v def _instance_post_static(self, instance, enabling): if enabling and self.update_grub2_cfg: self._grub2_update() self._bls_update() self.update_grub2_cfg = False PK[lw (site-packages/tuned/plugins/plugin_vm.pynu[from . import base from .decorators import * import tuned.logs import os import struct import glob from tuned.utils.commands import commands log = tuned.logs.get() cmd = commands() class VMPlugin(base.Plugin): """ Plugin for tuning memory management. """ @classmethod def _get_config_options(self): return { "transparent_hugepages" : None, "transparent_hugepage" : None, "transparent_hugepage.defrag" : None, } def _instance_init(self, instance): instance._has_static_tuning = True instance._has_dynamic_tuning = False def _instance_cleanup(self, instance): pass @classmethod def _thp_path(self): path = "/sys/kernel/mm/transparent_hugepage" if not os.path.exists(path): # RHEL-6 support path = "/sys/kernel/mm/redhat_transparent_hugepage" return path @command_set("transparent_hugepages") def _set_transparent_hugepages(self, value, sim): if value not in ["always", "never", "madvise"]: if not sim: log.warn("Incorrect 'transparent_hugepages' value '%s'." % str(value)) return None cmdline = cmd.read_file("/proc/cmdline", no_error = True) if cmdline.find("transparent_hugepage=") > 0: if not sim: log.info("transparent_hugepage is already set in kernel boot cmdline, ingoring value from profile") return None sys_file = os.path.join(self._thp_path(), "enabled") if os.path.exists(sys_file): if not sim: cmd.write_to_file(sys_file, value) return value else: if not sim: log.warn("Option 'transparent_hugepages' is not supported on current hardware.") return None # just an alias to transparent_hugepages @command_set("transparent_hugepage") def _set_transparent_hugepage(self, value, sim): self._set_transparent_hugepages(value, sim) @command_get("transparent_hugepages") def _get_transparent_hugepages(self): sys_file = os.path.join(self._thp_path(), "enabled") if os.path.exists(sys_file): return cmd.get_active_option(cmd.read_file(sys_file)) else: return None # just an alias to transparent_hugepages @command_get("transparent_hugepage") def _get_transparent_hugepage(self): return self._get_transparent_hugepages() @command_set("transparent_hugepage.defrag") def _set_transparent_hugepage_defrag(self, value, sim): sys_file = os.path.join(self._thp_path(), "defrag") if os.path.exists(sys_file): if not sim: cmd.write_to_file(sys_file, value) return value else: if not sim: log.warn("Option 'transparent_hugepage.defrag' is not supported on current hardware.") return None @command_get("transparent_hugepage.defrag") def _get_transparent_hugepage_defrag(self): sys_file = os.path.join(self._thp_path(), "defrag") if os.path.exists(sys_file): return cmd.get_active_option(cmd.read_file(sys_file)) else: return None PK[;)site-packages/tuned/plugins/decorators.pynu[__all__ = ["command_set", "command_get", "command_custom"] # @command_set("scheduler", per_device=True) # def set_scheduler(self, value, device): # set_new_scheduler # # @command_get("scheduler") # def get_scheduler(self, device): # return current_scheduler # # @command_set("foo") # def set_foo(self, value): # set_new_foo # # @command_get("foo") # def get_foo(self): # return current_foo # def command_set(name, per_device=False, priority=0): def wrapper(method): method._command = { "set": True, "name": name, "per_device": per_device, "priority": priority, } return method return wrapper def command_get(name): def wrapper(method): method._command = { "get": True, "name": name, } return method return wrapper def command_custom(name, per_device=False, priority=0): def wrapper(method): method._command = { "custom": True, "name": name, "per_device": per_device, "priority": priority, } return method return wrapper PK[AIh .site-packages/tuned/plugins/plugin_selinux.pycnu[ \c@s~ddlZddlmZddlTddlZddlmZddlm Z ej j Z dej fdYZdS( iNi(tbase(t*(t exceptions(tcommandst SelinuxPlugincBsqeZdZedZdZedZdZdZe ddZ e ddZ RS( s& Plugin for tuning SELinux options. cCs@d}tjj|s<d}tjj|s<d}q<n|S(Ns/sys/fs/selinuxs/selinux(tostpathtexiststNone(tselfR((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_get_selinux_paths  cOswt|_|j|_|jdkr<tjdntjj |jdd|_ t t |j ||dS(NsFSELinux is not enabled on your system or incompatible version is used.tavctcache_threshold(Rt_cmdR t _selinux_pathRRtNotSupportedPluginExceptionRRtjoint_cache_threshold_pathtsuperRt__init__(R targstkwargs((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyRs  cCs idd6S(Ntavc_cache_threshold(R(R ((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_get_config_options scCst|_t|_dS(N(tTruet_has_static_tuningtFalset_has_dynamic_tuning(R tinstance((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_instance_init&s cCsdS(N((R R((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_instance_cleanup*sRcCsS|dkrdSt|}|dkrK|sG|jj|j|n|SdSdS(Ni(RtintR t write_to_fileR(R tvaluetsimt threshold((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_set_avc_cache_threshold-s   cCs5|jj|j}t|dkr1t|SdS(Ni(R t read_fileRtlenRR(R R!((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyt_get_avc_cache_threshold9s ( t__name__t __module__t__doc__t classmethodR RRRRt command_setR$t command_getR'(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyR s    (RtRt decoratorst tuned.logsttunedt tuned.pluginsRttuned.utils.commandsRtlogstgettlogtPluginR(((s@/usr/lib/python2.7/site-packages/tuned/plugins/plugin_selinux.pyts   PK[VpOO-site-packages/tuned/plugins/plugin_sysctl.pycnu[ +cc@sddlZddlmZddlTddlZddlTddlmZddl j Z ddl Z ddl Z ej jZddgZdd gZd ejfd YZd Zd ZdZdZdZedZdS(iNi(tbase(t*(tcommandstbase_reachable_timet retrans_times /run/sysctl.ds /etc/sysctl.dt SysctlPlugincBsGeZdZdZdZdZdZdZedZ RS(s. Plugin for applying custom sysctl options. cOs2tt|j||t|_t|_dS(N(tsuperRt__init__tTruet_has_dynamic_optionsRt_cmd(tselftargstkwargs((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyRs cCst|_t|_|j|j}|jj|i|_t |jdkrt j d|j |i|_|jj |n|j|_dS(Nis0recovering old sysctl settings from previous run(tFalset_has_dynamic_tuningRt_has_static_tuningt _storage_keytnamet_storagetgett_sysctl_originaltlentlogtinfot_instance_unapply_statictunsettoptionst_sysctl(R tinstancet storage_key((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyt_instance_inits     cCs&|j|j}|jj|dS(N(RRRR(R RR((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyt_instance_cleanup+scCs xt|jjD]\}}t|}|dkrNtjd|q|jj|j j |}|j ||}|dk r||j |t|jD]*}||}d||f}t|qWtddS(Ns.confs%s/%ss/etc/sysctl.conf(tSYSCTL_CONFIG_DIRStostlistdirtendswithtsortedtkeyst_apply_sysctl_config_file(tfilestdtflisttfnametpath((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyR1Vs     c Cstjd|y]t|d7}x-t|dD]\}}t|||q6WWdQXtjd|WnKttfk r}|jtjkrtj d|t |fqnXdS(Ns%Applying sysctl settings from file %stris.Finished applying sysctl settings from file %ss.Error reading sysctl settings from file %s: %s( Rtdebugtopent enumeratet_apply_sysctl_config_linetOSErrortIOErrorterrnotENOENTR%tstr(RMtftlinenotlinete((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyRHis   cCs|j}t|dks>|ddks>|ddkrBdS|jdd}t|dkrtjd||fdS|\}}|j}t|dkrtjd||fdS|j}t||dtdS( Nit#t;t=iis Syntax error in file %s, line %dR9(tstripRtsplitRR%R*R(RMRYRZttmpR2R3((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyRRvs  2     cCsd|jddS(Ns /proc/sys/%st.t/(treplace(R2((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyt_get_sysctl_pathscCst|}yt|dW}d}x;t|D]-\}}|dkr4tjd|dSq4W|j}WdQXtjd||f|SWn]tt fk r}|j t j krtjd|ntjd|t |fdSXdS(NRNtisGFailed to read sysctl parameter '%s', multi-line values are unsupporteds&Value of sysctl parameter '%s' is '%s'sBFailed to read sysctl parameter '%s', the parameter does not exists(Failed to read sysctl parameter '%s': %s( ReRPRQRR%R$R_RORSRTRURVRW(R2RMRXRZtiR3R[((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyR#s(       cCst|}tjj|tkr9tjd|tSyDtjd||ft |d}|j |WdQXt SWn{t t fk r}|jtjkr|rtjntj}|d||fn tjd||t|ftSXdS(Ns+Refusing to set deprecated sysctl option %ss%Setting sysctl parameter '%s' to '%s'twsIFailed to set sysctl parameter '%s' to '%s', the parameter does not exists/Failed to set sysctl parameter '%s' to '%s': %s(ReRCRMtbasenametDEPRECATED_SYSCTL_OPTIONSRR%RRORPtwriteRRSRTRURVRW(R2R3R9RMRXR[tlog_func((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyR*s&    (treRfRt decoratorst tuned.logsttunedt subprocessttuned.utils.commandsRt tuned.constsR.RURCtlogsRRRjRBtPluginRR1RHRRReR#RR*(((s?/usr/lib/python2.7/site-packages/tuned/plugins/plugin_sysctl.pyts&        E    PK[site-packages/tuned/version.pycnu[ \c@sdZdZdZdS(ii iN(tTUNED_VERSION_MAJORtTUNED_VERSION_MINORtTUNED_VERSION_PATCH(((s1/usr/lib/python2.7/site-packages/tuned/version.pytsPK[(site-packages/tuned/exports/__init__.pycnu[ \c@sjddlmZddlmZddlmZdZdZdZdZdZ d Z d S( i(t interfaces(t controller(t dbus_exportercsfd}|S(s*Decorator, use to mark exportable methods.csg|_|S(N(t export_params(tmethod(targstkwargs(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytwrappers((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytexportscsfd}|S(s*Decorator, use to mark exportable signals.csg|_|S(N(t signal_params(R(RR(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytsignal scCs:t|tjstntjj}|j|S(N(t isinstanceRtExporterInterfacet ExceptionRtExportsControllert get_instancetregister_exporter(tinstancetctl((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCs:t|tjstntjj}|j|S(N(R RtExportableInterfaceR RRRtregister_object(RR((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCstjj}|jS(N(RRRtstart(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRscCstjj}|jS(N(RRRtstop(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyR#sN( tRRRtdbusRR RRRR(((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyts     PK[ij-site-packages/tuned/exports/dbus_exporter.pycnu[ \c@sddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl j Z ddlmZddlmZe jjZdejfdYZdS(i(t interfacesiN(tpolkit(tGLibt DBusExportercBseZdZdZedZedZedZdZdZ dZ dZ d Z d Z d Zd ZRS( s+ Export method calls through DBus Interface. We take a method to be exported and create a simple wrapper function to call it. This is required as we need the original function to be bound to the original object instance. While the wrapper will be bound to an object we dynamically construct. cCstjjjdtd|_d|_i|_t |_ ||_ ||_ ||_ d|_d|_t|_tjtj}tj|_tjtj|dS(Ntset_as_default(tdbustmainlooptglibt DBusGMainLooptTruetNonet_dbus_object_clst _dbus_objectt _dbus_methodstsett_signalst _bus_namet_interface_namet _object_namet_threadt _bus_objectRt_polkittsignalt getsignaltSIGINTRtMainLoopt _main_loop(tselftbus_nametinterface_namet object_nametsignal_handler((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt__init__s          cCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR/scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR3scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR7scCs |jdk S(N(RR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pytrunning;scstjstdnj}|jkrEtdnfd}tj|j}tjj j ||dd|}|j|s 'cstjstdnj}||jkrEtdnfd}tj|j}tjj |j ||}||j|<|j j |dS(Ns#Only bound methods can be exported.s*Method with this name is already exported.cs ||S(N((R-R.R/R0(R4(s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR5gs( R7R8R9R&R R:R;RR<RRRtadd(RR4R>R?R5((R4s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR_s  cOst}||jks$|jdkr-t}nyt|j|}Wntk r\t}nX|rvtd|n |||dS(NsSignal '%s' doesn't exist.(tFalseRRR R tgetattrtAttributeErrorR9(RRR/R0terrR4((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt send_signalps   cCsY|jdk rtdndt|}t|tjjf|j}||_dS(Ns%The exporter class was already build.sDBusExporter_%d( R R R9tidttypeRR<tObjectR (Rt unique_nametcls((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt_construct_dbus_object_class}s cCs|jrdS|jdkr,|jn|jtj}tjj|j |}|j||j ||_ t j d|j|_|jjdS(Nttarget(R!R R RLtstopRt SystemBusR<tBusNameRRRt threadingtThreadt _thread_codeRtstart(RtbusR((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRTs    cCsH|jdk rD|jjrD|jj|jjd|_ndS(N(RR tis_aliveRtquittjoin(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRNs  cCs |jj|`d|_dS(N(RtrunRR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRSs (R&t __module__t__doc__R tpropertyRRRR!R@RRFRLRTRNRS(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRs   !  (R#RR:t dbus.serviceRtdbus.mainloop.glibtdbus.exceptionsR7RQRt tuned.logsttunedt tuned.constsR$ttuned.utils.polkitRt gi.repositoryRtlogstgetR'tExporterInterfaceR(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyts        PK[Cې*site-packages/tuned/exports/interfaces.pycnu[ \c@s0defdYZdefdYZdS(tExportableInterfacecBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRstExporterInterfacecBs5eZdZdZdZdZdZRS(cCs tdS(N(tNotImplementedError(tselftmethodt in_signaturet out_signature((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytexportscCs tdS(N(R(RRR((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytsignal scOs tdS(N(R(RR targstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyt send_signal scCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstartscCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstops(RRR R R RR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRs     N(tobjectRR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytsPK[lW'site-packages/tuned/exports/__init__.pynu[from . import interfaces from . import controller from . import dbus_exporter as dbus def export(*args, **kwargs): """Decorator, use to mark exportable methods.""" def wrapper(method): method.export_params = [ args, kwargs ] return method return wrapper def signal(*args, **kwargs): """Decorator, use to mark exportable signals.""" def wrapper(method): method.signal_params = [ args, kwargs ] return method return wrapper def register_exporter(instance): if not isinstance(instance, interfaces.ExporterInterface): raise Exception() ctl = controller.ExportsController.get_instance() return ctl.register_exporter(instance) def register_object(instance): if not isinstance(instance, interfaces.ExportableInterface): raise Exception() ctl = controller.ExportsController.get_instance() return ctl.register_object(instance) def start(): ctl = controller.ExportsController.get_instance() return ctl.start() def stop(): ctl = controller.ExportsController.get_instance() return ctl.stop() PK[,site-packages/tuned/exports/dbus_exporter.pynu[from . import interfaces import decorator import dbus.service import dbus.mainloop.glib import dbus.exceptions import inspect import threading import signal import tuned.logs import tuned.consts as consts from tuned.utils.polkit import polkit from gi.repository import GLib log = tuned.logs.get() class DBusExporter(interfaces.ExporterInterface): """ Export method calls through DBus Interface. We take a method to be exported and create a simple wrapper function to call it. This is required as we need the original function to be bound to the original object instance. While the wrapper will be bound to an object we dynamically construct. """ def __init__(self, bus_name, interface_name, object_name): dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) self._dbus_object_cls = None self._dbus_object = None self._dbus_methods = {} self._signals = set() self._bus_name = bus_name self._interface_name = interface_name self._object_name = object_name self._thread = None self._bus_object = None self._polkit = polkit() # dirty hack that fixes KeyboardInterrupt handling # the hack is needed because PyGObject / GTK+-3 developers are morons signal_handler = signal.getsignal(signal.SIGINT) self._main_loop = GLib.MainLoop() signal.signal(signal.SIGINT, signal_handler) @property def bus_name(self): return self._bus_name @property def interface_name(self): return self._interface_name @property def object_name(self): return self._object_name def running(self): return self._thread is not None def export(self, method, in_signature, out_signature): if not inspect.ismethod(method): raise Exception("Only bound methods can be exported.") method_name = method.__name__ if method_name in self._dbus_methods: raise Exception("Method with this name is already exported.") def wrapper(wrapped, owner, *args, **kwargs): action_id = consts.NAMESPACE + "." + method.__name__ caller = args[-1] log.debug("checking authorization for for action '%s' requested by caller '%s'" % (action_id, caller)) ret = self._polkit.check_authorization(caller, action_id) if ret == 1: log.debug("action '%s' requested by caller '%s' was successfully authorized by polkit" % (action_id, caller)) elif ret == 2: log.warn("polkit error, but action '%s' requested by caller '%s' was successfully authorized by fallback method" % (action_id, caller)) elif ret == 0: log.info("action '%s' requested by caller '%s' wasn't authorized, ignoring the request" % (action_id, caller)) args[-1] = "" elif ret == -1: log.warn("polkit error and action '%s' requested by caller '%s' wasn't authorized by fallback method, ignoring the request" % (action_id, caller)) args[-1] = "" else: log.error("polkit error and unable to use fallback method to authorize action '%s' requested by caller '%s', ignoring the request" % (action_id, caller)) args[-1] = "" return method(*args, **kwargs) wrapper = decorator.decorator(wrapper, method.__func__) wrapper = dbus.service.method(self._interface_name, in_signature, out_signature, sender_keyword = "caller")(wrapper) self._dbus_methods[method_name] = wrapper def signal(self, method, out_signature): if not inspect.ismethod(method): raise Exception("Only bound methods can be exported.") method_name = method.__name__ if method_name in self._dbus_methods: raise Exception("Method with this name is already exported.") def wrapper(wrapped, owner, *args, **kwargs): return method(*args, **kwargs) wrapper = decorator.decorator(wrapper, method.__func__) wrapper = dbus.service.signal(self._interface_name, out_signature)(wrapper) self._dbus_methods[method_name] = wrapper self._signals.add(method_name) def send_signal(self, signal, *args, **kwargs): err = False if not signal in self._signals or self._bus_object is None: err = True try: method = getattr(self._bus_object, signal) except AttributeError: err = True if err: raise Exception("Signal '%s' doesn't exist." % signal) else: method(*args, **kwargs) def _construct_dbus_object_class(self): if self._dbus_object_cls is not None: raise Exception("The exporter class was already build.") unique_name = "DBusExporter_%d" % id(self) cls = type(unique_name, (dbus.service.Object,), self._dbus_methods) self._dbus_object_cls = cls def start(self): if self.running(): return if self._dbus_object_cls is None: self._construct_dbus_object_class() self.stop() bus = dbus.SystemBus() bus_name = dbus.service.BusName(self._bus_name, bus) self._bus_object = self._dbus_object_cls(bus, self._object_name, bus_name) self._thread = threading.Thread(target=self._thread_code) self._thread.start() def stop(self): if self._thread is not None and self._thread.is_alive(): self._main_loop.quit() self._thread.join() self._thread = None def _thread_code(self): self._main_loop.run() del self._bus_object self._bus_object = None PK[)site-packages/tuned/exports/controller.pynu[from . import interfaces import inspect import tuned.patterns class ExportsController(tuned.patterns.Singleton): """ Controls and manages object interface exporting. """ def __init__(self): super(ExportsController, self).__init__() self._exporters = [] self._objects = [] self._exports_initialized = False def register_exporter(self, instance): """Register objects exporter.""" self._exporters.append(instance) def register_object(self, instance): """Register object to be exported.""" self._objects.append(instance) def _is_exportable_method(self, method): """Check if method was marked with @exports.export wrapper.""" return inspect.ismethod(method) and hasattr(method, "export_params") def _is_exportable_signal(self, method): """Check if method was marked with @exports.signal wrapper.""" return inspect.ismethod(method) and hasattr(method, "signal_params") def _export_method(self, method): """Register method to all exporters.""" for exporter in self._exporters: args = method.export_params[0] kwargs = method.export_params[1] exporter.export(method, *args, **kwargs) def _export_signal(self, method): """Register signal to all exporters.""" for exporter in self._exporters: args = method.signal_params[0] kwargs = method.signal_params[1] exporter.signal(method, *args, **kwargs) def _initialize_exports(self): if self._exports_initialized: return for instance in self._objects: for name, method in inspect.getmembers(instance, self._is_exportable_method): self._export_method(method) for name, method in inspect.getmembers(instance, self._is_exportable_signal): self._export_signal(method) self._exports_initialized = True def start(self): """Start the exports.""" self._initialize_exports() for exporter in self._exporters: exporter.start() def stop(self): """Stop the exports.""" for exporter in self._exporters: exporter.stop() PK[ij-site-packages/tuned/exports/dbus_exporter.pyonu[ \c@sddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl j Z ddlmZddlmZe jjZdejfdYZdS(i(t interfacesiN(tpolkit(tGLibt DBusExportercBseZdZdZedZedZedZdZdZ dZ dZ d Z d Z d Zd ZRS( s+ Export method calls through DBus Interface. We take a method to be exported and create a simple wrapper function to call it. This is required as we need the original function to be bound to the original object instance. While the wrapper will be bound to an object we dynamically construct. cCstjjjdtd|_d|_i|_t |_ ||_ ||_ ||_ d|_d|_t|_tjtj}tj|_tjtj|dS(Ntset_as_default(tdbustmainlooptglibt DBusGMainLooptTruetNonet_dbus_object_clst _dbus_objectt _dbus_methodstsett_signalst _bus_namet_interface_namet _object_namet_threadt _bus_objectRt_polkittsignalt getsignaltSIGINTRtMainLoopt _main_loop(tselftbus_nametinterface_namet object_nametsignal_handler((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt__init__s          cCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR/scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR3scCs|jS(N(R(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR7scCs |jdk S(N(RR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pytrunning;scstjstdnj}|jkrEtdnfd}tj|j}tjj j ||dd|}|j|s 'cstjstdnj}||jkrEtdnfd}tj|j}tjj |j ||}||j|<|j j |dS(Ns#Only bound methods can be exported.s*Method with this name is already exported.cs ||S(N((R-R.R/R0(R4(s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR5gs( R7R8R9R&R R:R;RR<RRRtadd(RR4R>R?R5((R4s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyR_s  cOst}||jks$|jdkr-t}nyt|j|}Wntk r\t}nX|rvtd|n |||dS(NsSignal '%s' doesn't exist.(tFalseRRR R tgetattrtAttributeErrorR9(RRR/R0terrR4((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt send_signalps   cCsY|jdk rtdndt|}t|tjjf|j}||_dS(Ns%The exporter class was already build.sDBusExporter_%d( R R R9tidttypeRR<tObjectR (Rt unique_nametcls((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyt_construct_dbus_object_class}s cCs|jrdS|jdkr,|jn|jtj}tjj|j |}|j||j ||_ t j d|j|_|jjdS(Nttarget(R!R R RLtstopRt SystemBusR<tBusNameRRRt threadingtThreadt _thread_codeRtstart(RtbusR((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRTs    cCsH|jdk rD|jjrD|jj|jjd|_ndS(N(RR tis_aliveRtquittjoin(R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRNs  cCs |jj|`d|_dS(N(RtrunRR (R((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRSs (R&t __module__t__doc__R tpropertyRRRR!R@RRFRLRTRNRS(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyRs   !  (R#RR:t dbus.serviceRtdbus.mainloop.glibtdbus.exceptionsR7RQRt tuned.logsttunedt tuned.constsR$ttuned.utils.polkitRt gi.repositoryRtlogstgetR'tExporterInterfaceR(((s?/usr/lib/python2.7/site-packages/tuned/exports/dbus_exporter.pyts        PK[(site-packages/tuned/exports/__init__.pyonu[ \c@sjddlmZddlmZddlmZdZdZdZdZdZ d Z d S( i(t interfaces(t controller(t dbus_exportercsfd}|S(s*Decorator, use to mark exportable methods.csg|_|S(N(t export_params(tmethod(targstkwargs(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytwrappers((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytexportscsfd}|S(s*Decorator, use to mark exportable signals.csg|_|S(N(t signal_params(R(RR(s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs((RRR((RRs:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pytsignal scCs:t|tjstntjj}|j|S(N(t isinstanceRtExporterInterfacet ExceptionRtExportsControllert get_instancetregister_exporter(tinstancetctl((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCs:t|tjstntjj}|j|S(N(R RtExportableInterfaceR RRRtregister_object(RR((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRs cCstjj}|jS(N(RRRtstart(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyRscCstjj}|jS(N(RRRtstop(R((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyR#sN( tRRRtdbusRR RRRR(((s:/usr/lib/python2.7/site-packages/tuned/exports/__init__.pyts     PK[c(++)site-packages/tuned/exports/interfaces.pynu[class ExportableInterface(object): pass class ExporterInterface(object): def export(self, method, in_signature, out_signature): # to be overridden by concrete implementation raise NotImplementedError() def signal(self, method, out_signature): # to be overridden by concrete implementation raise NotImplementedError() def send_signal(self, signal, *args, **kwargs): # to be overridden by concrete implementation raise NotImplementedError() def start(self): raise NotImplementedError() def stop(self): raise NotImplementedError() PK[̿ *site-packages/tuned/exports/controller.pyonu[ \c@sHddlmZddlZddlZdejjfdYZdS(i(t interfacesiNtExportsControllercBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s4 Controls and manages object interface exporting. cCs2tt|jg|_g|_t|_dS(N(tsuperRt__init__t _exporterst_objectstFalset_exports_initialized(tself((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR s  cCs|jj|dS(sRegister objects exporter.N(Rtappend(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_exporterscCs|jj|dS(sRegister object to be exported.N(RR (RR ((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_objectscCstj|ot|dS(s8Check if method was marked with @exports.export wrapper.t export_params(tinspecttismethodthasattr(Rtmethod((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_methodscCstj|ot|dS(s8Check if method was marked with @exports.signal wrapper.t signal_params(RRR(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_signalscCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register method to all exporters.iiN(RR texport(RRtexportertargstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_method s  cCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register signal to all exporters.iiN(RRtsignal(RRRRR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_signal's  cCs|jr dSxw|jD]l}x0tj||jD]\}}|j|q3Wx0tj||jD]\}}|j|qfWqWt|_dS(N( RRRt getmembersRRRRtTrue(RR tnameR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_initialize_exports.s ""cCs,|jx|jD]}|jqWdS(sStart the exports.N(RRtstart(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR :s cCs"x|jD]}|jq WdS(sStop the exports.N(Rtstop(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR!@s( t__name__t __module__t__doc__RR R RRRRRR R!(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyRs        (tRRttuned.patternsttunedtpatternst SingletonR(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyts  PK[̿ *site-packages/tuned/exports/controller.pycnu[ \c@sHddlmZddlZddlZdejjfdYZdS(i(t interfacesiNtExportsControllercBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s4 Controls and manages object interface exporting. cCs2tt|jg|_g|_t|_dS(N(tsuperRt__init__t _exporterst_objectstFalset_exports_initialized(tself((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR s  cCs|jj|dS(sRegister objects exporter.N(Rtappend(Rtinstance((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_exporterscCs|jj|dS(sRegister object to be exported.N(RR (RR ((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pytregister_objectscCstj|ot|dS(s8Check if method was marked with @exports.export wrapper.t export_params(tinspecttismethodthasattr(Rtmethod((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_methodscCstj|ot|dS(s8Check if method was marked with @exports.signal wrapper.t signal_params(RRR(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_is_exportable_signalscCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register method to all exporters.iiN(RR texport(RRtexportertargstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_method s  cCsEx>|jD]3}|jd}|jd}|j|||q WdS(s!Register signal to all exporters.iiN(RRtsignal(RRRRR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_export_signal's  cCs|jr dSxw|jD]l}x0tj||jD]\}}|j|q3Wx0tj||jD]\}}|j|qfWqWt|_dS(N( RRRt getmembersRRRRtTrue(RR tnameR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyt_initialize_exports.s ""cCs,|jx|jD]}|jqWdS(sStart the exports.N(RRtstart(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR :s cCs"x|jD]}|jq WdS(sStop the exports.N(Rtstop(RR((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyR!@s( t__name__t __module__t__doc__RR R RRRRRR R!(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyRs        (tRRttuned.patternsttunedtpatternst SingletonR(((s</usr/lib/python2.7/site-packages/tuned/exports/controller.pyts  PK[Cې*site-packages/tuned/exports/interfaces.pyonu[ \c@s0defdYZdefdYZdS(tExportableInterfacecBseZRS((t__name__t __module__(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRstExporterInterfacecBs5eZdZdZdZdZdZRS(cCs tdS(N(tNotImplementedError(tselftmethodt in_signaturet out_signature((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytexportscCs tdS(N(R(RRR((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytsignal scOs tdS(N(R(RR targstkwargs((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyt send_signal scCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstartscCs tdS(N(R(R((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytstops(RRR R R RR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pyRs     N(tobjectRR(((s</usr/lib/python2.7/site-packages/tuned/exports/interfaces.pytsPK[9site-packages/tuned/consts.pycnu[ \c@shddlZdZdZdZdZdZdZdZeZd Z d Z d Z d Z d dgZ dZdZddgZdZdZdZddgZdZdZedeZdedZdedZdZdZd ZdZd!Zd"Zd#Z d$Z!d%Z"d&Z#d'Z$d(Z%d)Z&d*Z'd+Z(dYZ)d.Z*d/Z+d0Z,d1Z-d2Z.d3Z/d4Z0d5Z1d6Z2d7Z3d8Z4d9Z5d:Z6d;Z7d<Z8e9Z:e9Z;d=Z<d>Z=e9Z>e9Z?d?Z@dZZAdAZBdBZCdCZDdDZEdEZFdFZGdGZHdHZIdIZJdJZKdKZLdLZMdMZNdNZOdOZPdPZQdQZRdRZSdSZTiejUdT6ejVdU6ejWdV6ejXdW6eRdS6ddX6ZZdS([iNs/etc/tuned/tuned-main.confs/etc/tuned/active_profiles/etc/tuned/profile_modes tuned.confs/etc/tuned/recommend.confiscom.redhat.tunedscom.redhat.tuned.controls/Tunedtbalanceds/run/tuned/save.pickles/usr/lib/tuneds /etc/tuneds/var/lib/tunedtmains/usr/lib/tuned/recommend.ds/etc/tuned/recommend.ds.tmpis/boots/etc/grub2.cfgs/etc/grub2-efi.cfgs /etc/grub.dt00_tunedt/s### BEGIN /etc/grub.d/s ###s### END /etc/grub.d/t tuned_paramst tuned_initrds/etc/default/grubtTUNED_BOOT_CMDLINEtTUNED_BOOT_INITRD_ADDs/etc/tuned/bootcmdlines/sys/firmware/opals/etc/machine-ids*/usr/lib/kernel/install.d/92-tuned.installs/boot/loader/entriess/etc/modprobe.d/tuned.confs/etc/systemd/system.conft CPUAffinityiidis/var/log/tuned/tuned.logs/run/tuned/tuned.pids/etc/system-release-cpet function_tTUNED_tSystemtUsertdaemontdynamic_tuningtsleep_intervaltupdate_intervaltrecommend_commandtreapply_sysctltdefault_instance_prioritytudev_buffer_sizeii iis/dev/cpu_dma_latencytsummaryt descriptiontprofile_changeds-you need to reboot for changes to take effects&verify: passed: device %s: '%s' = '%s'sverify: passed: '%s' = '%s'sverify: passed: '%s's)verify: skipped, missing: device %s: '%s'sverify: skipped, missing: '%s's5verify: failed: device %s: '%s' = '%s', expected '%s's*verify: failed: '%s' = '%s', expected '%s'sverify: failed: '%s'iXtautotmanuali<tCONSOLEtconsoletdebugtinfotwarnterrortnoneii([tloggingtGLOBAL_CONFIG_FILEtACTIVE_PROFILE_FILEtPROFILE_MODE_FILEt PROFILE_FILEtRECOMMEND_CONF_FILEtDAEMONIZE_PARENT_TIMEOUTt NAMESPACEtDBUS_BUStDBUS_INTERFACEt DBUS_OBJECTtDEFAULT_PROFILEtDEFAULT_STORAGE_FILEtLOAD_DIRECTORIEStPERSISTENT_STORAGE_DIRtPLUGIN_MAIN_UNIT_NAMEtRECOMMEND_DIRECTORIEStTMP_FILE_SUFFIXtERROR_THRESHOLDtBOOT_DIRtGRUB2_CFG_FILESt GRUB2_CFG_DIRtGRUB2_TUNED_TEMPLATE_NAMEtGRUB2_TUNED_TEMPLATE_PATHtGRUB2_TEMPLATE_HEADER_BEGINtGRUB2_TEMPLATE_HEADER_ENDtGRUB2_TUNED_VARtGRUB2_TUNED_INITRD_VARtGRUB2_DEFAULT_ENV_FILEtINITRD_IMAGE_DIRtBOOT_CMDLINE_TUNED_VARtBOOT_CMDLINE_INITRD_ADD_VARtBOOT_CMDLINE_FILEtPETITBOOT_DETECT_DIRtMACHINE_ID_FILEtKERNEL_UPDATE_HOOK_FILEtBLS_ENTRIES_PATHt MODULES_FILEtSYSTEMD_SYSTEM_CONF_FILEtSYSTEMD_CPUAFFINITY_VARtLOG_FILE_COUNTtLOG_FILE_MAXBYTEStLOG_FILEtPID_FILEtSYSTEM_RELEASE_FILEtFUNCTION_PREFIXt ENV_PREFIXtPREFIX_PROFILE_FACTORYtPREFIX_PROFILE_USERt CFG_DAEMONtCFG_DYNAMIC_TUNINGtCFG_SLEEP_INTERVALtCFG_UPDATE_INTERVALtCFG_RECOMMEND_COMMANDtCFG_REAPPLY_SYSCTLtCFG_DEFAULT_INSTANCE_PRIORITYtCFG_UDEV_BUFFER_SIZEtTruetCFG_DEF_DAEMONtCFG_DEF_DYNAMIC_TUNINGtCFG_DEF_SLEEP_INTERVALtCFG_DEF_UPDATE_INTERVALtCFG_DEF_RECOMMEND_COMMANDtCFG_DEF_REAPPLY_SYSCTLt!CFG_DEF_DEFAULT_INSTANCE_PRIORITYtCFG_DEF_UDEV_BUFFER_SIZEtPATH_CPU_DMA_LATENCYtPROFILE_ATTR_SUMMARYtPROFILE_ATTR_DESCRIPTIONtDBUS_SIGNAL_PROFILE_CHANGEDtSTR_HINT_REBOOTt"STR_VERIFY_PROFILE_DEVICE_VALUE_OKtSTR_VERIFY_PROFILE_VALUE_OKtSTR_VERIFY_PROFILE_OKt'STR_VERIFY_PROFILE_DEVICE_VALUE_MISSINGt STR_VERIFY_PROFILE_VALUE_MISSINGt$STR_VERIFY_PROFILE_DEVICE_VALUE_FAILtSTR_VERIFY_PROFILE_VALUE_FAILtSTR_VERIFY_PROFILE_FAILt ADMIN_TIMEOUTtACTIVE_PROFILE_AUTOtACTIVE_PROFILE_MANUALtLOG_LEVEL_CONSOLEtLOG_LEVEL_CONSOLE_NAMEtCAPTURE_LOG_LEVELtDEBUGtINFOtWARNtERRORtNonetCAPTURE_LOG_LEVELS(((s0/usr/lib/python2.7/site-packages/tuned/consts.pyts        PK[2site-packages/pkg_resources.pycnu[ b-QcF@sP dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z yddl m Z m Z Wn'e k rddlm Z m Z nXyeWn!ek rddlmZnXy0edZddlmZeedZWnWek rweZddlmZed Zeed ZddlZejZnXdd lm Z y&dd lm!Z!m"Z"m#Z#e$Z%Wne k re&Z%nXdd lm'Z(ddl)m*Z*m+Z+ej,ddfkoej-j.dkr'ddl/j0Z1neZ1yddl2Z2Wne k rPnXddZ3iZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<Z=dZ>ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gEZ?d7e@fdaYZAd8eAfdbYZBd9eAfdcYZCd:eAfddYZDiZEejFd ZGdZHdeZIdfZJdgZKdZLdhZMdiZNgdjZOdkZPdlZQejRdmZSejRdnZTeQZUdoZVdpZWeWZXdqZYdrZZedsZ[dtZ\dOfduYZ]dPe]fdvYZ^d2e_fdwYZ`d1e_fdxYZaeaZbd;ecfdyYZdd3fdzYZed{Zfd|Zgd}Zhd~ZidZjidgd6dgd6dddgd6gd6gd6gd6Zkidd6dd6dd6dd6dd6dd6dd6ZldZmdZndZoeidZpdZqderkr0eqZpndVfdYZseMe_esdWesfdYZtdXetfdYZueMeveeue1ek reMe1jweundTesfdYZxexZydZzdYetfdYZ{eMej|e{dQexfdYZ}dReufdYZ~dSe{fdYZdfdYZdfdYZdZyddlmZmZWne k rn XeZ[[e5ddidZe&dZe&dZeej|ee&dZee_ee&dZeeee1ek r9ee1jene5ddie5ddidZdZdZedZdZeeeeej|ee1ek ree1jendZee_edZidZdZdZejRdjZejRdjZejRdjZejRdjZejRdjZejRdjZejRdjZejRdjZejRdejejBjZejRdejZidd6dd6dd6dd6dd6jZdZdZd6e_fdYZdZd4e_fdYZdefdYZied6ed6ed6ZdZdZdZd5fdYZidd6dd6dd6dd6dd6dd6ZdZdZdZdZdZeeZdZeere5dd+e`yddlmZWne k rN nXyejeWneBk r e`gZx0ejeeeaD]Zejeq Wx0ejD]%Zeejkr ejenq Wejej(nXejZejZejZejWZWeWZXedge_eeejejdS(sYPackage resource API -------------------- A resource is a logical file contained within a package, or a logical subdirectory thereof. The package resource API expects resource names to have their path parts separated with ``/``, *not* whatever the local path separator is. Do not use os.path operations to manipulate resource names being passed into the API. The package resource API is designed to work with normal filesystem packages, .egg files, and unpacked .egg files. It can also work in a limited way with .zip files and with custom PEP 302 loaders that support the ``get_data()`` method. iN(turlparset urlunparse(t ImmutableSetcCs |jS(N(tnext(to((s1/usr/lib/python2.7/site-packages/pkg_resources.pyts(tStringIOcBsc|dkrBejd}|j}|dkr<|j}n~n|dkrW|}nddUdS(Nisexec code in globs, locs(tNonetsyst _getframet f_globalstf_locals(tcodetglobstlocstframe((s1/usr/lib/python2.7/site-packages/pkg_resources.pytexec_ s      (tBytesIOtexeccCsY|dkrt}n|dkr-|}nttt|j|d||dS(NR(RtglobalsRtcompiletopentread(tfnR R((s1/usr/lib/python2.7/site-packages/pkg_resources.pytexecfile.s     (tutime(tmkdirtrenametunlink(R(tisdirtsplititcpythonicCs^tstdnt|\}}|rZ|rZt| rZt|t||ndS(Ns*"os.mkdir" not supported on this platform.(t WRITE_SUPPORTtIOErrorRRt_bypass_ensure_directoryR(tnametmodetdirnametfilename((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR"Ns  cKs>t}x.|jD] \}}|||<|t|(tself((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__repr__s(Rt __module__t__doc__R(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRgscBseZdZRS(sAAn already-installed version conflicts with the requested version(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRhscBseZdZRS(s&A requested distribution was not found(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRiscBseZdZRS(s>Distribution doesn't have an "extra feature" of the given name(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRjsiiicCs|t|eZdZdZdZdZdZdZRS(cCsdS(s;Does the package's distribution contain the named metadata?N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt has_metadatascCsdS(s'The named metadata resource as a stringN((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt get_metadatascCsdS(sYield named metadata resource as list of non-blank non-comment lines Leading and trailing whitespace is stripped from each line, and lines with ``#`` as the first non-blank character are omitted.N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_metadata_linesscCsdS(s>Is the named metadata a directory? (like ``os.path.isdir()``)N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pytmetadata_isdirscCsdS(s?List of metadata names in the directory (like ``os.listdir()``)N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pytmetadata_listdirscCsdS(s=Execute the named script in the supplied namespace dictionaryN((Rt namespace((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRMs(RRRRRRRRM(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs      cBsDeZdZdZdZdZdZdZdZRS(s3An object that provides access to package resourcescCsdS(sdReturn a true filesystem path for `resource_name` `manager` must be an ``IResourceManager``N((tmanagert resource_name((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_resource_filenamescCsdS(siReturn a readable file-like object for `resource_name` `manager` must be an ``IResourceManager``N((RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_resource_streamscCsdS(smReturn a string containing the contents of `resource_name` `manager` must be an ``IResourceManager``N((RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_resource_stringscCsdS(s,Does the package contain the named resource?N((R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt has_resourcescCsdS(s>Is the named resource a directory? (like ``os.path.isdir()``)N((R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRYscCsdS(s?List of resource names in the directory (like ``os.listdir()``)N((R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRWs( RRRRRRRRYRW(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs     cBseZdZddZdZdZdZddZdZ dZ de dZ ddd Z dde d Zd Zd Zd ZdZdZRS(sDA collection of active distributions on sys.path (or a similar list)cCs^g|_i|_i|_g|_|dkr<tj}nx|D]}|j|qCWdS(s?Create working set from list of path entries (default=sys.path)N(tentriest entry_keystby_keyt callbacksRRRt add_entry(RRtentry((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__init__s       cCsT|jj|g|jj|x*t|tD]}|j||tq3WdS(sAdd a path item to ``.entries``, finding any distributions on it ``find_distributions(entry, True)`` is used to find distributions corresponding to the path entry, and they are added. `entry` is always appended to ``.entries``, even if it is already present. (This is because ``sys.path`` can contain the same value more than once, and the ``.entries`` of the ``sys.path`` WorkingSet should always equal ``sys.path``.) N(Rt setdefaultRRR]RtaddR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCs|jj|j|kS(s9True if `dist` is the active distribution for its project(RRR9(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt __contains__scCsG|jj|j}|dk r?||kr?t||n|SdS(sFind a distribution matching requirement `req` If there is an active distribution for the requested project, this returns it as long as it meets the version requirement specified by `req`. But, if there is an active distribution for the project and it does *not* meet the `req` requirement, ``VersionConflict`` is raised. If there is no active distribution for the requested project, ``None`` is returned. N(RRR9RRh(RtreqR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs ccsgx`|D]X}|j|}|dkrGx4|jD] }|Vq5Wq||kr||VqqWdS(sYield entry point objects from `group` matching `name` If `name` is None, yields all entry points in `group` from all distributions in the working set, otherwise only ones matching both `group` and `name` are yielded (in distribution order). N(RQRtvalues(RRGR#RRtep((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRSs    cCsQtjdj}|d}|j||d<|j|dj||dS(s?Locate distribution for `requires` and run `script_name` scriptiRiN(RR R R7RLRM(RtrequiresRRR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRMs    ccspi}xc|jD]X}||jkr+qnx:|j|D]+}||kr9d||<|j|Vq9q9WqWdS(sYield distributions for non-duplicate projects in the working set The yield order is the order in which the items' path entries were added to the working set. iN(RRR(RtseentitemR9((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__iter__ s  cCs|r|j|j|n|dkr4|j}n|jj|g}|jj|jg}|j|jkrwdS||j|j<|j|kr|j|jn|j|kr|j|jn|j |dS(sAdd `dist` to working set, associated with `entry` If `entry` is unspecified, it defaults to the ``.location`` of `dist`. On exit from this routine, `entry` is added to the end of the working set's ``.entries`` (if it wasn't already present). `dist` is only added to the working set if it's for a project that doesn't already have a distribution in the set. If it's added, any callbacks registered with the ``subscribe()`` method will be called. N( t insert_onRRtlocationRRR9RRt _added_new(RRRtinserttkeystkeys2((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR1s   c CsVt|ddd}i}i}g}x$|rQ|jd}||krUq.n|j|j}|dkr|jj|j}|dkr|dkrt|j}n|j|||}||j<|dkrt |qn|j |n||krt ||n|j |j |jdddt||tchmod(RttempnameR&R$((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt postprocess1scCs%|jrtdn||_dS(sSet the base path where resources will be extracted to, if needed. If you do not call this routine before any extractions take place, the path defaults to the return value of ``get_default_cache()``. (Which is based on the ``PYTHON_EGG_CACHE`` environment variable, with various platform-specific fallbacks. See that routine's documentation for more details.) Resources are extracted to subdirectories of this path based upon information given by the ``IResourceProvider``. You may set this to a temporary directory, but then you must call ``cleanup_resources()`` to delete the extracted files when done. There is no guarantee that ``cleanup_resources()`` will be able to remove all extracted files. (Note: you may not change the extraction path for a given resource manager once resources have been extracted, unless you first call ``cleanup_resources()``.) s5Can't change extraction path, files already extractedN(R,RHR.(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR^Zs  cCsdS(sB Delete all extracted resource files and directories, returning a list of the file and directory names that could not be successfully removed. This function does not have any concurrency protection, so it should generally only be called when the extraction path is a temporary directory exclusive to a single process. This method is not automatically called; you must call it explicitly or register it as an ``atexit`` function if you wish to ensure cleanup of a temporary directory used for extractions. N((Rtforce((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR_tsN((RRRRR.RRXRYRVRURTRWR3R9t staticmethodR4RHR^RR_(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRcs        ) ) ) cCsytjdSWntk r"nXtjdkrBtjjdSd}dd|fd|fd|fdd|fg}x|D]\}}d }xn|D]5}|tjkrtjj|tj|}qPqW|rtjj||}ntjj|d SqWtd dS(s Determine the default cache location This returns the ``PYTHON_EGG_CACHE`` environment variable, if set. Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the "Application Data" directory. On all other systems, it's "~/.python-eggs". tPYTHON_EGG_CACHER:s~/.python-eggssApplication DatatAPPDATAt USERPROFILEt HOMEDRIVEtHOMEPATHtHOMEtWINDIRRs Python-Eggss3Please set the PYTHON_EGG_CACHE enviroment variableN(sAPPDATA((sAPPDATAN(RM(RNRO(RO(sHOME((sHOMEN(RQ( RR<RR#Rt expanduserRREt RuntimeError(tapp_datat app_homesRtsubdirR%R9((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR`s0     cCstjdd|S(sConvert an arbitrary string to a standard distribution name Any runs of non-alphanumeric/. characters are replaced with a single '-'. s[^A-Za-z0-9.]+t-(tretsub(R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRnscCs%|jdd}tjdd|S(sConvert an arbitrary string to a standard version string Spaces become dots, and all other non-alphanumeric characters become dashes, with runs of multiple dashes condensed to a single dash. RR@s[^A-Za-z0-9.]+RW(RRXRY(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRoscCstjdd|jS(sConvert an arbitrary string to a standard 'extra' name Any runs of non-alphanumeric characters are replaced with a single '_', and the result is always lowercased. s[^A-Za-z0-9.]+R(RXRYR(textra((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRtscCs|jddS(s|Convert a project or version name to its filename-escaped form Any '-' characters are currently replaced with '_'. RWR(R(R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRusR#RRDRRRtpython_implementationtpython_versiontpython_full_versionRZcCstjS(N(RR#(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRstos_namecCstjS(N(RRD(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRst sys_platformcCstjjdS(Ni(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCsdtjdtjdfS(Ns%s.%sii(Rt version_info(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs tdS(NR(t _platinfo(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRstplatform_versioncCs tdS(NR(Ra(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRstplatform_machinecCstdptS(NR[(Rat_pyimp(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs;yddl}Wntk r$dSXt||dS(NiRcSsdS(NR((((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs(RDRR(tattrRD((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRas  cCsDtjdkrdStjjdr)dSdtjkr<dSdSdS(Ntclit IronPythontjavatJythont__pypy__tPyPytCPython(RRDRtbuiltin_module_names(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRdscCs1yt|Wntk r,tjdSXtS(sHValidate text as a PEP 426 environment marker; return exception or Falsei(Rwt SyntaxErrorRRR(ttext((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRvs  csNs ddlmmddlddlddlfd}fd}fd}fd}ji|j6|j6|j6|j 6dd 6d d 6j d 6j d 6t dr |j (RoRRR9tnew_keytresultte((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_markerlib_evaluateVs   RcBseZdZdZdZdZdZdZdZ dZ dZ dZ e jdkrodZn d Zd Zd Zd Zd ZdZdZdZdZdZdZdZRS(sETry to implement resources and metadata for arbitrary PEP 302 loaderscCs:t|dd|_tjjt|dd|_dS(NRt__file__R(RRRRRR%t module_path(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRvscCs|j|j|S(N(t_fnR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRzscCst|j||S(N(RR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR}scCs|j|j|j|S(N(t_getRR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|j|j|j|S(N(t_hasRR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs%|jo$|j|j|j|S(N(tegg_infoRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRsicCs)|js dS|j|j|j|S(NR(RRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCs2|js dS|j|j|j|jdS(NRsutf-8(RRRtdecode(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCst|j|S(N(RrR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|j|j|j|S(N(t_isdirRR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRYscCs%|jo$|j|j|j|S(N(RRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|j|j|j|S(N(t_listdirRR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRWscCs)|jr%|j|j|j|SgS(N(RRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCsd|}|j|s,td|n|j|jdd}|jdd}|j|j|}||d os.sep on pypy it is the same (one reason why distribute did work in some cases on pypy and win32). * [1] - zipinfo.compress_type * [2] - zipinfo.compress_size * [3] - zipinfo.file_size * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800 len(ascii encoding of filename) otherwise * [5] - (zipinfo.date_time[0] - 1980) << 9 | zipinfo.date_time[1] << 5 | zipinfo.date_time[2] * [6] - (zipinfo.date_time[3] - 1980) << 11 | zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2) * [7] - zipinfo.CRC RN( RtzipfiletZipFiletnamelistRRtseptgetinfoRtAssertionErrorR(Rtzipinfotzfiletzitemtzpath((s1/usr/lib/python2.7/site-packages/pkg_resources.pytbuild_zipmanifests  cBseZdZdZdZdZdZdZe dZ dZ dZ dZ d Zd Zd Zd Zd ZdZRS(s"Resource support for zips and eggscCs?tj||t|jj|_|jjtj|_dS(N( RRRRtarchiveRRRtzip_pre(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR@scCs@|j|jr#|t|jStd||jfdS(Ns%s is not a subpath of %s(RRRuR(Rtfspath((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt _zipinfo_nameEscCsd|j|}|j|jtjrG|t|jdjtjStd||jfdS(Nis%s is not a subpath of %s(RRRRRRuRR(Rtzip_pathR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_partsNs  !cCs|jstdn|j|}|j}dj|j||kr~x*|D]}|j||j|qXWn|j||S(Ns5resource_filename() only supported for .egg, not .zipR(RRt_resource_to_zipt_get_eager_resourcesRERt_extract_resourcet _eager_to_zip(RRRRteagersR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRWs     cCs/|j}|jd}tj|}||fS(Nii(iii(t file_sizet date_timettimetmktime(tzip_stattsizeRt timestamp((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_get_date_and_sizeds  c Cs||jkr^x9|j|D]'}|j|tjj||}q#Wtjj|S|j|j|\}}tst dny(|j |j |j |}|j ||r|Stddtjj|\}} tj||jj|tj|t| ||f|j| |yt| |Wnltjk rtjj|r|j ||r|Stjdkrt|t| ||SnnXWntjk r|jnX|S(Ns>"os.rename" and "os.unlink" are not supported on this platforms .$extracttdirR:(t_indexRRRRER%RRR R!R9RRt _is_currentt_mkstemptwriteRRRRRHRterrortisfileR#RR3( RRRR#tlastRRt real_pathtoutfttmpnam((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRls@$    c Cs|j|j|\}}tjj|s2tStj|}|j|ks_|j|krctS|j j |}t |d}|j }|j ||kS(sK Return True if the file_path is current for this zip_path R(RRRRRRR=tst_sizetst_mtimeRRRRR( Rt file_pathRRRR=t zip_contentstft file_contents((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs  cCsa|jdkrZg}x6dD].}|j|r|j|j|qqW||_n|jS(Nsnative_libs.txtseager_resources.txt(snative_libs.txtseager_resources.txt(RRRRR(RRR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs  cCsy |jSWntk ri}x~|jD]s}|jtj}xX|rtjj|d }||kr||j|dPqF|jg||PEP 302 Importer that wraps Python's "normal" import algorithmcCs ||_dS(N(R(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRIscCs|jdd}||kr2|jdkr2dS|jdkrJd}n |jg}ytj||\}}}Wntk rdSXt|||S(NR@i(RRRtimpt find_moduleRt ImpLoader(RtfullnameRtsubnametfileR&tetc((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRLs   N(RRRRRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRFs RcBs eZdZdZdZRS(s<PEP 302 Loader that wraps Python's "normal" import algorithmcCs||_||_||_dS(N(RR&R(RRR&R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR^s  cCsFz%tj||j|j|j}Wd|jrA|jjnX|S(N(Rt load_moduleRR&RR(RRtmod((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRcs % (RRRRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR[s cCsytj|}WnPtk rcx@tjD]+}y||}Wntk rTq+XPq+Wd}nXtjj|||dkryt|}Wqtk rqXn|S(sRetrieve a PEP 302 "importer" for the given path item If there is no importer, this returns a wrapper around the builtin import machinery. The returned importer is only cached if it was created by a path hook. N(Rtpath_importer_cacheRt path_hooksRRRR(t path_itemRthook((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRos"     (Rt ImpImporterRt_distribution_finderscCs|t|=?|==|!=)\s*((\w|[-.])+)s\s*,s\s*\[s\s*\]s \w+(\.\w+)*$sL(?P[^-]+)( -(?P[^-]+) (-py(?P[^-]+) (-(?P.+))? )? )?s(\d+ | [a-z]+ | \.| -)tctpretpreviewsfinal-RWtrct@tdevccsuxitj|D]X}t||}| s|dkr>qn|d dkr_|jdVqd|VqWdVdS(NR@it 0123456789it*s*final(t component_reRRtzfill(Rtpart((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_parse_version_partss cCsg}xt|jD]}|jdr|dkrdx'|r`|ddkr`|jq=Wnx'|r|ddkr|jqgWn|j|qWt|S(sConvert a version string to a chronologically-sortable key This is a rough cross between distutils' StrictVersion and LooseVersion; if you give it versions that would work with StrictVersion, then it behaves the same; otherwise it acts like a slightly-smarter LooseVersion. It is *possible* to create pathological version coding schemes that will fool this parser, but they should be very rare in practice. The returned value will be a tuple of strings. Numeric portions of the version are padded to 8 digits so they will compare numerically, but without relying on how numbers compare relative to strings. Dots are dropped, but dashes are retained. Trailing zeros between alpha segments or dashes are suppressed, so that e.g. "2.4.0" is considered the same as "2.4". Alphanumeric parts are lower-cased. The algorithm assumes that strings like "-" and any alpha string that alphabetically follows "final" represents a "patch level". So, "2.4-1" is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is considered newer than "2.4-1", which in turn is newer than "2.4". Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that come before "final" alphabetically) are assumed to be pre-release versions, so that the version "2.4" is considered newer than "2.4a1". Finally, to handle miscellaneous cases, the strings "pre", "preview", and "rc" are treated as if they were "c", i.e. as though they were release candidates, and therefore are not as new as a version string that does not contain them, and "dev" is replaced with an '@' so that it sorts lower than than any other pre-release tag. R8s*finalis*final-t00000000(R<RRRRttuple(RRR;((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRms cBseZdZd d d dZdZdZed d dZd d dZ d dZ e e Z d dZ e e Z d dZ e e Z RS( s3Object representing an advertised importable objectcCsnt|std|n||_||_t||_tjddj|j |_ ||_ dS(NsInvalid module namesx[%s]t,( tMODULERHR#t module_nameR>tattrsReRRERR(RR#RARBRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs   "cCsfd|j|jf}|jr<|ddj|j7}n|jrb|ddj|j7}n|S(Ns%s = %st:R@s [%s]R?(R#RARBRER(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__str__s   cCsdt|S(NsEntryPoint.parse(%r)(R(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|r|j||nt|jttdg}xN|jD]C}yt||}WqDtk rtd||fqDXqDW|S(NRs%r has no %r attribute(RLRRARRBRRR(RRLRRRRe((s1/usr/lib/python2.7/site-packages/pkg_resources.pytloads! cCs]|jr%|j r%td|ntttjtj|jj|j||dS(Ns&Can't require() without a distribution( RRRjRRR[RRR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRLs cCsyd }}|jdd\}}d|krz|jdd\}}tjd|}|jrntn|j}nd|kr|jdd\}}t|jstn|jjd}nWn tk rtd|n#X||j|j|||SdS( sParse a single entry point from string `src` Entry point syntax follows the form:: name = some.module:some.attr [extra1,extra2] The entry name and module name are required, but the ``:attrs`` and ``[extras]`` parts are optional t=it[sx[RCR@s9EntryPoint must be in 'name=module:attrs [extras]' formatN(( RReRtspecsRHRR@RR(tclstsrcRRBRR#tvalueR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs&         cCst|std|ni}xZt|D]L}|j||}|j|krptd||jn|||jEnsure distribution is importable on `path` (default=sys.path)snamespace_packages.txtN( RRRRRRRRRZRk(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pytactivate s    cCsOdt|jt|j|jp'tf}|jrK|d|j7}n|S(s@Return what this distribution's standard .egg filename should bes %s-%s-py%sRW(RuRRRR+RD(RR&((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s  cCs(|jrd||jfSt|SdS(Ns%s (%s)(RR(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s cCsMyt|dd}Wntk r/d}nX|p9d}d|j|fS(NRs[unknown version]s%s %s(RRRHR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRD s   cCs.|jdrt|nt|j|S(sADelegate all unrecognized public attributes to .metadata providerR(RRRRW(RRe((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt __getattr__ scKs(|jt|tjj|||S(N(RRRRR(RIR&RR*((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR scCstjd|j|jfS(s?Return a ``Requirement`` that matches this distribution exactlys%s==%s(ReRRR(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR scCsD|j||}|dkr:td||ffn|jS(s=Return the `name` entry point of `group` or raise ImportErrorsEntry point %r not foundN(RRRRRE(RRGR#R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRP s cCscy |j}Wn3tk rBtj|jd|}|_nX|dk r_|j|iS|S(s=Return the entry point map for `group`, or the full entry mapsentry_points.txtN(t_ep_mapRRfRQRkRR(RRGtep_map((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRQ s    cCs|j|j|S(s<Return the EntryPoint object for `group`+`name`, or ``None``(RQR(RRGR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRR sc Csj|p |j}|sdSt|}tjj|}g|D]}|rVt|pY|^q>}d}xt|D]w\}}||krPqu||kru|jtkru|t jkr|j n|j |||j ||PququW|t jkr |j n|j |dSxFy|j ||d} Wntk rNPq X|| =|| =| }q dS(s@Insert self.location in path before its nearest parent directoryNi(RRRRR%Rt enumerateRRzRtcheck_version_conflictRRtindexRH( RRtloctnloctbdirtptnpathtbpRtnp((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s8 +      c Cs|jdkrdStj|jd}t|j}x|jdD]}|tjksJ||ksJ|tkr}qJn|dkrqJnt tj|dd}|rt|j |sJ|j |jrqJnt d|||jfqJWdS( Nt setuptoolssnamespace_packages.txts top_level.txtt pkg_resourcestsiteRsIModule %s was already imported from %s, but %s is being added to sys.path(RRssite( R9RR RkRyRRRRRRRt issue_warning(RtnspRztmodnameR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRxG s"  cCs8y |jWn&tk r3tdt|tSXtS(NsUnbuilt egg for (RRHRRRR(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR#] s   cKsMx*dD]"}|j|t||d qW|jd|j|j|S( s@Copy this distribution, substituting in any changed keyword argsRRRRDRRR(s project_namesversions py_versionsplatformslocations precedenceN(RRRRWR(RR*Re((s1/usr/lib/python2.7/site-packages/pkg_resources.pytclonee s   cCs g|jD]}|r |^q S(N(Rq(Rtdep((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs sN(((RRRRlRR+RzRRRRtpropertyR`RaRbRcRdReRfRgR9R^RRqRRkRsRRRDRtRRRPRQRRRRxR#RR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRd; sT                          )    tDistInfoDistributioncBsSeZdZdZejdZedZedZ dZ dZ RS(sGWrap an actual or potential sys.path entry w/metadata, .dist-info styletMETADATAs([\(,])\s*(\d.*?)\s*([,\)])cCsXy |jSWnFtk rSddlm}|j|j|j|_|jSXdS(sParse and cache metadatai(tParserN(t _pkg_infoRt email.parserRtparsestrRRl(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_parsed_pkg_info} s   !cCs6y |jSWn$tk r1|j|_|jSXdS(N(t_DistInfoDistribution__dep_mapRt_compute_dependencies(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRq s   cCsy|jdddg}|dj}|dj}tj|jd|}|jddjdd}||fS(sConvert 'Foobar (1); baz' to ('Foobar ==1', 'baz') Split environment marker, add == prefix to version specifiers as necessary, and remove parenthesis. t;iRis\1==\2\3t(t)(RRRXRYtEQEQR(Rt requires_distRtdistverstmark((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_preparse_requirement s c sddlm}igd6}|_gxc|jjdpBgD]I}|j|\}}tt|}|||_ j |qCWfd}t |d}|dj |xR|jjdpgD]8} t | j} tt || ||| R*tlevelR+RB((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s  c #s#tt|fd}xD]}t|}|sRtd|n|jd}|j}g}t||}|r|j}|tt||dd\}}}n|tt ||d d\}}}g|D]\}} |t | f^q}t |||Vq(WdS( sYield ``Requirement`` objects for each specification in `strs` `strs` must be an instance of ``basestring``, or a (possibly-nested) iterable thereof. cs?g}x|||s t||r`yt}d}Wq`tk r\tdq`Xn|||}|std|d|d||n|j|j||j}t||}|r|j}q |||s td|d||q q W|||}|r2|j}n|||fS(Nis+\ must not appear on the last nonblank lines Expected s intatsExpected ',' or end-of-list in(tCONTINUERt StopIterationRHRRGtendtCOMMA(tITEMt TERMINATORRR}tgroupst item_nameR'RC(RL(s1/usr/lib/python2.7/site-packages/pkg_resources.pyt scan_list s0  $ sMissing distribution specis 'extra' nameis version specN(i(ii( titerRrtDISTRORHRGRtOBRACKETtCBRACKETtVERSIONtLINE_ENDRoRe( R/RRRCRR}RRHRR,((RLs1/usr/lib/python2.7/site-packages/pkg_resources.pyRl s"    $$+cCs\g|D]}|j|f^q}|jg|D]\}}|^q3|dddDO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!N(Rnt unsafe_nameRRR9Rmt state_machineRRHR>RRtRyRRthashCmpR_t_Requirement__hash( RRRHRRR1RyRSttransRX((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR2 s5 ."4cCsgdjg|jD]}dj|^q}dj|j}|rSd|}nd|j||fS(NR?Rs[%s]s%s%s%s(RERHRR(RRRHR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRD@ s . cCst|to|j|jkS(N(RReR(RR&((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRfF sc Cs t|tr=|j|jkr%tS|jr[|j}q[nt|tr[t|}nd}d}x|jD]{\}}}}||||}|dkrtS|dkrt S|dkrt }qt|dks|dkrtt}qtqtW|dkrt }n|S(NcSs||k||kS(N((tatb((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRP stFtTt+RW( RRdR9RRyR^RRmRR( RRRtcompareRSRRRXtaction((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRI s,       cCs|jS(N(R(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRa[ scCsdt|S(NsRequirement.parse(%r)(R(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR^ scCsWtt|}|rDt|dkr2|dStd|ntd|dS(NiisExpected only one requirementsNo requirements found(RRlRuRH(RRo((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRa s ( RRRRDRfRRaRRRJ(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRe1 s       s--TtsT+Fs>=sT..s==sF++s!=cCs:t|ts3d|tfdY}|jdS|jS(s&Get an mro for a type or classic classRIcBseZRS((RR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRIy si(Rttypetobjectt__mro__(RI((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_get_mrov s cCsAx:tt|dt|D]}||kr||SqWdS(s2Return an adapter factory for `ob` from `registry`RN(RRR(tregistryR:R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR} s% cCs8tjj|}tjj|s4tj|ndS(s1Ensure that the parent directory of `path` existsN(RRR%Rtmakedirs(RR%((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRx sccsd}g}xt|D]y}|jdr|jdrs|sI|rW||fVn|dd!j}g}qtd|q|j|qW||fVdS(srSplit a string or iterable thereof into (section,content) pairs Each ``section`` is a stripped version of the section header ("[section]") and each ``content`` is a list of stripped lines excluding blank lines and comment-only lines. If there are any such lines before the first section header, they're returned in a first ``section`` of ``None``. RGt]iisInvalid section headingN(RRrRRRRHR(RtsectiontcontentR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs s  cOsDddlm}tj}ztt_|||SWd|t_XdS(Ni(tmkstemp(ttempfileRRRtos_open(R>R*Rtold_open((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s   cCs@x9ttD]+}|jds tt|||s`            '           +                      3      ), )           X  d    !,       (            , )w >?   # = :                  PK[lt$$site-packages/jsonpointer.pynu[# -*- coding: utf-8 -*- # # python-json-pointer - An implementation of the JSON Pointer syntax # https://github.com/stefankoegl/python-json-pointer # # Copyright (c) 2011 Stefan Kögl # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # from __future__ import unicode_literals """ Identify specific nodes in a JSON document (RFC 6901) """ try: from collections.abc import Mapping, Sequence except ImportError: from collections import Mapping, Sequence # Will be parsed by setup.py to determine package metadata __author__ = 'Stefan Kögl ' __version__ = '1.9' __website__ = 'https://github.com/stefankoegl/python-json-pointer' __license__ = 'Modified BSD License' try: from urllib import unquote from itertools import izip str = unicode except ImportError: # Python 3 from urllib.parse import unquote izip = zip from itertools import tee import re import copy # array indices must not contain leading zeros, signs, spaces, decimals, etc RE_ARRAY_INDEX=re.compile('0|[1-9][0-9]*$') class JsonPointerException(Exception): pass class EndOfList(object): """ Result of accessing element "-" of a list """ def __init__(self, list_): self.list_ = list_ def __repr__(self): return '{cls}({lst})'.format(cls=self.__class__.__name__, lst=repr(self.list_)) _nothing = object() def resolve_pointer(doc, pointer, default=_nothing): """ Resolves pointer against doc and returns the referenced object >>> obj = {"foo": {"anArray": [ {"prop": 44}], "another prop": {"baz": "A string" }}} >>> resolve_pointer(obj, '') == obj True >>> resolve_pointer(obj, '/foo') == obj['foo'] True >>> resolve_pointer(obj, '/foo/another%20prop') == obj['foo']['another prop'] True >>> resolve_pointer(obj, '/foo/another%20prop/baz') == obj['foo']['another prop']['baz'] True >>> resolve_pointer(obj, '/foo/anArray/0') == obj['foo']['anArray'][0] True >>> resolve_pointer(obj, '/some/path', None) == None True """ pointer = JsonPointer(pointer) return pointer.resolve(doc, default) def set_pointer(doc, pointer, value, inplace=True): """ Resolves pointer against doc and sets the value of the target within doc. With inplace set to true, doc is modified as long as pointer is not the root. >>> obj = {"foo": {"anArray": [ {"prop": 44}], "another prop": {"baz": "A string" }}} >>> set_pointer(obj, '/foo/anArray/0/prop', 55) == \ {'foo': {'another prop': {'baz': 'A string'}, 'anArray': [{'prop': 55}]}} True >>> set_pointer(obj, '/foo/yet%20another%20prop', 'added prop') == \ {'foo': {'another prop': {'baz': 'A string'}, 'yet another prop': 'added prop', 'anArray': [{'prop': 55}]}} True """ pointer = JsonPointer(pointer) return pointer.set(doc, value, inplace) class JsonPointer(object): """ A JSON Pointer that can reference parts of an JSON document """ def __init__(self, pointer): parts = pointer.split('/') if parts.pop(0) != '': raise JsonPointerException('location must starts with /') parts = map(unquote, parts) parts = [part.replace('~1', '/') for part in parts] parts = [part.replace('~0', '~') for part in parts] self.parts = parts def to_last(self, doc): """ Resolves ptr until the last step, returns (sub-doc, last-step) """ if not self.parts: return doc, None for part in self.parts[:-1]: doc = self.walk(doc, part) return doc, self.get_part(doc, self.parts[-1]) def resolve(self, doc, default=_nothing): """Resolves the pointer against doc and returns the referenced object""" for part in self.parts: try: doc = self.walk(doc, part) except JsonPointerException: if default is _nothing: raise else: return default return doc get = resolve def set(self, doc, value, inplace=True): """ Resolve the pointer against the doc and replace the target with value. """ if len(self.parts) == 0: if inplace: raise JsonPointerException('cannot set root in place') return value if not inplace: doc = copy.deepcopy(doc) (parent, part) = self.to_last(doc) parent[part] = value return doc def get_part(self, doc, part): """ Returns the next step in the correct type """ if isinstance(doc, Mapping): return part elif isinstance(doc, Sequence): if part == '-': return part if not RE_ARRAY_INDEX.match(str(part)): raise JsonPointerException("'%s' is not a valid list index" % (part, )) return int(part) elif hasattr(doc, '__getitem__'): # Allow indexing via ducktyping if the target has defined __getitem__ return part else: raise JsonPointerException("Document '%s' does not support indexing, " "must be dict/list or support __getitem__" % type(doc)) def walk(self, doc, part): """ Walks one step in doc and returns the referenced part """ part = self.get_part(doc, part) assert (type(doc) in (dict, list) or hasattr(doc, '__getitem__')), "invalid document type %s" % (type(doc),) if isinstance(doc, Mapping): try: return doc[part] except KeyError: raise JsonPointerException("member '%s' not found in %s" % (part, doc)) elif isinstance(doc, Sequence): if part == '-': return EndOfList(doc) try: return doc[part] except IndexError: raise JsonPointerException("index '%s' is out of bounds" % (part, )) else: # Object supports __getitem__, assume custom indexing return doc[part] def contains(self, ptr): """Returns True if self contains the given ptr""" return self.parts[:len(ptr.parts)] == ptr.parts def __contains__(self, item): """Returns True if self contains the given ptr""" return self.contains(item) @property def path(self): """ Returns the string representation of the pointer >>> ptr = JsonPointer('/~0/0/~1').path == '/~0/0/~1' """ parts = [part.replace('~', '~0') for part in self.parts] parts = [part.replace('/', '~1') for part in parts] return ''.join('/' + part for part in parts) def __eq__(self, other): """ compares a pointer to another object Pointers can be compared by comparing their strings (or splitted strings), because no two different parts can point to the same structure in an object (eg no different number representations) """ if not isinstance(other, JsonPointer): return False return self.parts == other.parts def __hash__(self): return hash(tuple(self.parts)) @classmethod def from_parts(cls, parts): """ Constructs a JsonPointer from a list of (unescaped) paths >>> JsonPointer.from_parts(['a', '~', '/', 0]).path == '/a/~0/~1/0' True """ parts = [str(part) for part in parts] parts = [part.replace('~', '~0') for part in parts] parts = [part.replace('/', '~1') for part in parts] ptr = cls(''.join('/' + part for part in parts)) return ptr def pairwise(iterable): """ s -> (s0,s1), (s1,s2), (s2, s3), ... >>> list(pairwise([])) [] >>> list(pairwise([1])) [] >>> list(pairwise([1, 2, 3, 4])) [(1, 2), (2, 3), (3, 4)] """ a, b = tee(iterable) for _ in b: break return izip(a, b) PK[  ,site-packages/slip.dbus-0.4.0-py2.7.egg-infonu[Metadata-Version: 1.1 Name: slip.dbus Version: 0.4.0 Summary: UNKNOWN Home-page: UNKNOWN Author: UNKNOWN Author-email: UNKNOWN License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN Requires: dbus Requires: decorator Requires: StringIO Requires: xml.etree.ElementTree PK[0/site-packages/IPy.pyonu[ -=Mc@s2dZdZddlZddlZi dd6dd6dd6dd 6dd 6dd 6dd 6dd 6dd6ZiPdd6ddd6ddd6dddd 6dddd d6dddd6dd6dd6dd6dd6dd 6dd!6d"d#6d$d%6d&d'6d(d)dd6d*d+6d,d-6d.d/6d0d16d0d26d0d36d,d46d5d66d,d76d8d96d0d:6d0d;6d.d<6d0d=6d0d>6d0d?6d0d@6d0dA6ddB6d0dC6dDdE6d,dF6d0dG6d.dH6d0dI6d0dJ6d0dK6d,dL6d,dM6d,dN6dOdP6d0dQ6d,dR6d.dS6d.dT6d.dU6d8dV6d0dW6dDdX6ddY6ddZ6dd[6dd\6dd]6dd^6dd_6dd`6dda6ddb6ddc6ddde6ddf6dgdh6ddi6djdk6dldm6dndo6dpdq6drds6dtdu6dvdw6dxdy6dzd{6d|d}6Zd~fdYZdefdYZdZdZ dZ dZ dZ idd6d!d 6dd6d[d6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dad6dd6Z dZdZdZdZdZdZdZdZedkr.ddlZej\ZZer+ddlZejdnndS(s IPy - class and tools for handling of IPv4 and IPv6 addresses and networks. See README file for learn how to use IPy. Further Information might be available at: https://github.com/haypo/python-ipy s0.75iNtPUBLICt0tPRIVATEt00000000t00001010t01111111t1t1010100111111110t 101011000001t1100000010101000tRESERVEDt111i`t UNSPECIFIEDitLOOPBACKitIPV4MAPiPit WKP46TRANSt 00000000011001001111111110011011i@t UNASSIGNEDt00000001t0000001t0000010t0000011t00001t0001sGLOBAL-UNICASTt001tSPECIALPURPOSEt00100000000000010000000tTEREDOt 00100000000000010000000000000000tBMWGt 00100000000000010000000000000010tORCHIDt0010000000000001000000000001sALLOCATED APNICt00100000000000010000001sALLOCATED ARINt00100000000000010000010sALLOCATED RIPE NCCt00100000000000010000011t00100000000000010000100t00100000000000010000101t00100000000000010000110t DOCUMENTATIONt 00100000000000010000110110111000t00100000000000010000111sALLOCATED LACNICt00100000000000010001001t00100000000000010001010t00100000000000010001011t00100000000000010001100t00100000000000010001101t0010000000000001000111t00100000000000010010t001000000000000100110t0010000000000001001110t0010000000000001001111t00100000000000010100000sALLOCATED AFRINICt00100000000000010100001t00100000000000010100010t00100000000000010100011t00100000000000010100100t00100000000000010100101t00100000000000010100110t00100000000000010101t0010000000000001100t00100000000000011010t00100000000000011011t6TO4t0010000000000010t001000000000001100t 001001000000t 001001100000t00100110000100000000000t00100110001000000000000t 001010000000t 001010100000t 001011000000t00101101t0010111t0011t010t011t100t101t110t1110t11110t111110tULAt1111110t 111111100t LINKLOCALt 1111111010t 1111111011t MULTICASTt11111111sNODE-LOCAL MULTICASTt1111111100000001sLINK-LOCAL MULTICASTt1111111100000010sADMIN-LOCAL MULTICASTt1111111100000100sSITE-LOCAL MULTICASTt1111111100000101sORG-LOCAL MULTICASTt1111111100001000sGLOBAL MULTICASTt1111111100001110sRESERVED MULTICASTt1111111100001111sPREFIX-BASED MULTICASTt 111111110011sRP-EMBEDDED MULTICASTt 111111110111tIPintcBs"eZdZdddZdZdZdZdZdZdZ dd Z dd Z dd Z dd Zdd ZddZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZRS(sHandling of IP addresses returning integers. Use class IP instead because some features are not implemented for IPint.icCsWd|_d|_d}d}t|ttfrt||_|dkro|jdkrfd}qod}n|dkr|jdkrtd|jnd }nF|dkr|jd krtd |jnd }n td ||_||_ nOt|t r:|j|_|j |_ |j|_nt|t t fr=|j d}t|dkrR|\}}t|\|_} | dkrtdnt|\}} | dkrtdn||jkrtdn||j} t| }td|d |fjj|krFtd|qFnt|dkr|j d}t|dkr|d}d}qFt|dkrtdqF|\}}|jddkrFt|\} } | dkrtdnt| }qFn-t|dkr:tdn tdt|\|_} |dkrp| }n|dkr|dkrd |}q|dkrd |}qtd n||_t||_ |r|jt|j |j@|_nt|j|j |jsStdt||j fqSntdt|dS(s-Create an instance of an IP object. Data can be a network specification or a single IP. IP addresses can be specified in all forms understood by parseAddress(). The size of a network can be specified as /prefixlen a.b.c.0/24 2001:658:22a:cafe::/64 -lastIP a.b.c.0-a.b.c.255 2001:658:22a:cafe::-2001:658:22a:cafe:ffff:ffff:ffff:ffff /decimal netmask a.b.c.d/255.255.255.0 not supported for IPv6 If no size specification is given a size of 1 address (/32 for IPv4 and /128 for IPv6) is assumed. If make_net is True, an IP address will be transformed into the network address by applying the specified netmask. >>> print(IP('127.0.0.0/8')) 127.0.0.0/8 >>> print(IP('127.0.0.0/255.0.0.0')) 127.0.0.0/8 >>> print(IP('127.0.0.0-127.255.255.255')) 127.0.0.0/8 >>> print(IP('127.0.0.1/255.0.0.0', make_net=True)) 127.0.0.0/8 See module documentation for more examples. iiiIiiIsJIPv4 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %xi l sJIPv6 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %xisonly IPv4 and IPv6 supportedt-is)first-last notation only allowed for IPv4s last address should be IPv4, toos(last address should be larger than firsts%s/%ss*the range %s is not on a network boundary.t/s"only one '/' allowed in IP Addresst.snetmask must be IPv4s"only one '-' allowed in IP Addresss can't parses!%s has invalid prefix length (%s)sUnsupported data type: %sN(tNoPrefixForSingleIptNonet WantPrefixLent isinstancetinttlongtipt ValueErrort _ipversiont _prefixlenRetstrtunicodetsplittlent parseAddresst _count1BitstIPt broadcasttfindt_netmaskToPrefixlent_prefixlenToNetmaskt_checkNetaddrWorksWithPrefixlentreprt TypeErrorttype(tselftdatat ipversiontmake_nettnetbitst prefixlentxRotlastt parsedVersiont lastversiontsizetnetmasktvers((s'/usr/lib/python2.7/site-packages/IPy.pyt__init__{s                   ,             " %cCs|jS(sReturn the first / base / network addess as an (long) integer. The same as IP[0]. >>> "%X" % IP('10.0.0.0/8').int() 'A000000' (Ro(R((s'/usr/lib/python2.7/site-packages/IPy.pyRmscCs|jS(sReturn the IP version of this Object. >>> IP('10.0.0.0/8').version() 4 >>> IP('::1').version() 6 (Rq(R((s'/usr/lib/python2.7/site-packages/IPy.pytversionscCs|jS(sWReturns Network Prefixlen. >>> IP('10.0.0.0/8').prefixlen() 8 (Rr(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCs |jS(sT Return the base (first) address of a network as an (long) integer. (Rm(R((s'/usr/lib/python2.7/site-packages/IPy.pytnetscCs|j|jdS(sl Return the broadcast (last) address of a network as an (long) integer. The same as IP[-1].i(RmRv(R((s'/usr/lib/python2.7/site-packages/IPy.pyRzscCs|jdkr|jdks<|jdkrQ|jdkrQ|jrQd}qQn|d kr~|j}|d kr~d}q~n|r|dkr|j}t|ttfs|j}ndt ||jS|d krd t |j |j d|jSd |jSnd Sd S(sPrints Prefixlen/Netmask. Not really. In fact it is our universal Netmask/Prefixlen printer. This is considered an internal function. want == 0 / None don't return anything 1.2.3.0 want == 1 /prefix 1.2.3.0/24 want == 2 /netmask 1.2.3.0/255.255.255.0 want == 3 -lastip 1.2.3.0-1.2.3.255 ii iiiiis/%sis-%ss/%dtN( RqRrRiRjRkRRlRmRntintToIpRoRv(RtwantR((s'/usr/lib/python2.7/site-packages/IPy.pyt _printPrefix%s$          %cCs|jdkrd}n$|jdkr0d}n td|jdkr`|dkr`d}nt|j}d|t|||j|S( sReturn a string representation as a binary value. >>> print(IP('127.0.0.1').strBin()) 01111111000000000000000000000001 ii iisonly IPv4 and IPv6 supportediRN(RqRpRkRjt _intToBinRoRvR(Rt wantprefixlentbitstret((s'/usr/lib/python2.7/site-packages/IPy.pytstrBinOs    c Cs|jd kr$|d kr$d}n|jdkr@|j|S|jd?dkrt|jd@d}d||j|}|Sg|jdjdD]}t|d ^q}dgd }x.t t |D]}t ||||>> IP('127.0.0.1').strCompressed() '127.0.0.1' >>> IP('2001:0658:022a:cafe:0200::1').strCompressed() '2001:658:22a:cafe:200::1' >>> IP('ffff:ffff:ffff:ffff:ffff:f:f:fffc/127').strCompressed() 'ffff:ffff:ffff:ffff:ffff:f:f:fffc/127' iii iIs::ffff:it:iiRRN(RkRjRqt strFullsizeRoRRRuRmtxrangeRvt_countFollowingZerostindextmaxt strNormaltinserttappendtjoin( RRtipv4ttextRthextetstfollowingzerostitcompressionpos((s'/usr/lib/python2.7/site-packages/IPy.pyt strCompressedcs0   4 +%  cCs|jd kr$|d kr$d}n|jdkrE|jd}nx|jdkrdjgg|jdjdD]}t|d^qvD]}t|d^q}n td||j |S( sReturn a string representation in the usual format. >>> print(IP('127.0.0.1').strNormal()) 127.0.0.1 >>> print(IP('2001:0658:022a:cafe:0200::1').strNormal()) 2001:658:22a:cafe:200:0:0:1 iiiiRiisonly IPv4 and IPv6 supportedN( RkRjRqRRRuRmthexRpR(RRRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  ] cCsJ|jdkr$|dkr$d}nt|j|jj|j|S(sReturn a string representation in the non-mangled format. >>> print(IP('127.0.0.1').strFullsize()) 127.0.0.1 >>> print(IP('2001:0658:022a:cafe:0200::1').strFullsize()) 2001:0658:022a:cafe:0200:0000:0000:0001 iN(RkRjRRoRqtlowerR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  cCsg|jdkr$|dkr$d}nt|j}|ddkrP|d }n|j|j|S(sReturn a string representation in hex format in lower case. >>> IP('127.0.0.1').strHex() '0x7f000001' >>> IP('2001:0658:022a:cafe:0200::1').strHex() '0x20010658022acafe0200000000000001' iitLN(RkRjRRoRR(RRR((s'/usr/lib/python2.7/site-packages/IPy.pytstrHexs   cCsa|jdkr$|dkr$d}nt|j}|ddkrP|d }n||j|S(sReturn a string representation in decimal format. >>> print(IP('127.0.0.1').strDec()) 2130706433 >>> print(IP('2001:0658:022a:cafe:0200::1').strDec()) 42540616829182469433547762482097946625 iiRN(RkRjRsRoR(RRR((s'/usr/lib/python2.7/site-packages/IPy.pytstrDecs   cCs|jdkrt}n$|jdkr0t}n td|j}x<tt|ddD]"}|| |kra||| SqaWdS(sReturn a description of the IP type ('PRIVATE', 'RESERVERD', etc). >>> print(IP('127.0.0.1').iptype()) PRIVATE >>> print(IP('192.168.1.1').iptype()) PRIVATE >>> print(IP('195.185.1.2').iptype()) PUBLIC >>> print(IP('::1').iptype()) LOOPBACK >>> print(IP('2001:0658:022a:cafe:0200::1').iptype()) ALLOCATED RIPE NCC The type information for IPv6 is out of sync with reality. iisonly IPv4 and IPv6 supportediitunknown(Rqt IPv4rangest IPv6rangesRpRRRv(RtiprangeRR((s'/usr/lib/python2.7/site-packages/IPy.pytiptypes    cCs]|jdkrd|j}n+|jdkr>d|j}n tdd|jd|>S(srReturn netmask as an integer. >>> "%X" % IP('195.185.0.0/16').netmask().int() 'FFFF0000' ii iisonly IPv4 and IPv6 supportedii(RqRrRp(Rtlocallen((s'/usr/lib/python2.7/site-packages/IPy.pyRs  cCso|jdkr8d|j}td|jd|>dS|jdkr_d|j}d|jStdd S( sReturn netmask as an string. Mostly useful for IPv6. >>> print(IP('195.185.0.0/16').strNetmask()) 255.255.0.0 >>> print(IP('2001:0658:022a:cafe::0/64').strNetmask()) /64 ii iiiis/%dsonly IPv4 and IPv6 supportedN(RqRrRRp(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt strNetmask s    cCsR|jdkrd|j}n+|jdkr>d|j}n tdd|S(sReturn the length of a subnet. >>> print(IP('195.185.1.0/28').len()) 16 >>> print(IP('195.185.1.0/24').len()) 256 ii iisonly IPv4 and IPv6 supportedi(RqRrRp(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRvs  cCstS(sAll IPy objects should evaluate to true in boolean context. Ordinarily they do, but if handling a default route expressed as 0.0.0.0/0, the __len__() of the object becomes 0, which is used as the boolean value of the object. (tTrue(R((s'/usr/lib/python2.7/site-packages/IPy.pyt __nonzero__0scCst|jS(sReturn the length of a subnet. Called to implement the built-in function len(). It breaks with IPv6 Networks. Anybody knows how to fix this.(RmRv(R((s'/usr/lib/python2.7/site-packages/IPy.pyt__len__9s cCst|ttfstn|dkrdt||jkr[|jt|}qtn||jkrtn|jt|S(sNCalled to implement evaluation of self[key]. >>> ip=IP('127.0.0.0/30') >>> for x in ip: ... print(repr(x)) ... IP('127.0.0.0') IP('127.0.0.1') IP('127.0.0.2') IP('127.0.0.3') >>> ip[2] IP('127.0.0.2') >>> ip[-1] IP('127.0.0.3') i(RlRmRnRtabsRvt IndexErrorRo(Rtkey((s'/usr/lib/python2.7/site-packages/IPy.pyt __getitem__Es    cCsTt|}|j|jkrL|j|j|j|jdkrLtStSdS(sCalled to implement membership test operators. Should return true if item is in self, false otherwise. Item can be other IP-objects, strings or ints. >>> IP('195.185.1.1').strHex() '0xc3b90101' >>> 0xC3B90101 in IP('195.185.1.0/24') True >>> '127.0.0.1' in IP('127.0.0.0/24') True >>> IP('127.0.0.0/24') in IP('127.0.0.0/25') False iN(RyRoRvRtFalse(Rtitem((s'/usr/lib/python2.7/site-packages/IPy.pyt __contains__es <cCsxt|}|j|jkr>|j|j|jkr>dS|j|jkrp|j|j|jkrpdSdSdS(sCheck if two IP address ranges overlap. Returns 0 if the two ranges don't overlap, 1 if the given range overlaps at the end and -1 if it does at the beginning. >>> IP('192.168.0.0/23').overlaps('192.168.1.0/24') 1 >>> IP('192.168.0.0/23').overlaps('192.168.1.255') 1 >>> IP('192.168.0.0/23').overlaps('192.168.2.0') 0 >>> IP('192.168.1.0/24').overlaps('192.168.0.0/23') -1 iiiN(RyRoRv(RR((s'/usr/lib/python2.7/site-packages/IPy.pytoverlaps|s  ..cCs |jS(sSDispatch to the prefered String Representation. Used to implement str(IP).(R(R((s'/usr/lib/python2.7/site-packages/IPy.pyt__str__scCsd|jdS(sPrint a representation of the Object. Used to implement repr(IP). Returns a string which evaluates to an identical Object (without the wantprefixlen stuff - see module docstring. >>> print(repr(IP('10.0.0.0/24'))) IP('10.0.0.0/24') s IPint('%s')i(R(R((s'/usr/lib/python2.7/site-packages/IPy.pyt__repr__s cCs|j|jkr&|j|jS|j|jkrL|j|jS|j|jkrbdS|j|jkrxdS|j|jkr|j|jkrdS|j|jkrdSdSndSdS(sCalled by comparison operations. Should return a negative integer if self < other, zero if self == other, a positive integer if self > other. Networks with different prefixlen are considered non-equal. Networks with the same prefixlen and differing addresses are considered non equal but are compared by their base address integer value to aid sorting of IP objects. The version of Objects is not put into consideration. >>> IP('10.0.0.0/24') > IP('10.0.0.0') 1 >>> IP('10.0.0.0/24') < IP('10.0.0.0') 0 >>> IP('10.0.0.0/24') < IP('12.0.0.0/24') 1 >>> IP('10.0.0.0/24') > IP('12.0.0.0/24') 0 iiiN(RrRRoRq(Rtother((s'/usr/lib/python2.7/site-packages/IPy.pyt__cmp__scCs|j|dkS(Ni(R(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt__eq__scCs|j|dkS(Ni(R(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt__lt__scCsWtd}|j}x(|dkr?||d@A}|d?}qW||jA}t|S(shCalled for the key object for dictionary operations, and by the built-in function hash(). Should return a 32-bit integer usable as a hash value for dictionary operations. The only required property is that objects which compare equal have the same hash value >>> IP('10.0.0.0/24').__hash__() -167772185 iiii (RmRoRr(RtthehashRo((s'/usr/lib/python2.7/site-packages/IPy.pyt__hash__s   N( t__name__t __module__t__doc__RRmRRRRzRRjRRRRRRRRRRvRRRRRRRRRRR(((s'/usr/lib/python2.7/site-packages/IPy.pyReus:    *  -     !        =  RycBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s-Class for handling IP addresses and networks.cCsttj|d|jS(sReturn the base (first) address of a network as an IP object. The same as IP[0]. >>> IP('10.0.0.0/8').net() IP('10.0.0.0') R(RyReRRq(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCsttj|S(sReturn the broadcast (last) address of a network as an IP object. The same as IP[-1]. >>> IP('10.0.0.0/8').broadcast() IP('10.255.255.255') (RyReRz(R((s'/usr/lib/python2.7/site-packages/IPy.pyRzscCsttj|d|jS(siReturn netmask as an IP object. >>> IP('10.0.0.0/8').netmask() IP('255.0.0.0') R(RyReRRq(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCst|jdkrdS|jd?dkr*dS|jd@}|jdkrdd|dd|jf}nt|ddS( Nii iIis%s/%sRi(RqRjRoRrRy(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt _getIPv4Map!s cCs|jdkr6g}|jdkrNx|D]}|j|jq.Wn|jdkrxtd|jdD]!}|j||jdqyWn|jdkrx|td|jdD]!}|j||jdqWn>x;td|jdD]!}|j||jdq W|S|jdkr|j}|dk rg|jSt|j dj }|dd kr|d }n|j ddkrt d nt |}|jd j|}td |j dd}d ||gStddS(sReturn a list with values forming the reverse lookup. >>> IP('213.221.113.87/32').reverseNames() ['87.113.221.213.in-addr.arpa.'] >>> IP('213.221.112.224/30').reverseNames() ['224.112.221.213.in-addr.arpa.', '225.112.221.213.in-addr.arpa.', '226.112.221.213.in-addr.arpa.', '227.112.221.213.in-addr.arpa.'] >>> IP('127.0.0.0/24').reverseNames() ['0.0.127.in-addr.arpa.'] >>> IP('127.0.0.0/23').reverseNames() ['0.0.127.in-addr.arpa.', '1.0.127.in-addr.arpa.'] >>> IP('127.0.0.0/16').reverseNames() ['0.127.in-addr.arpa.'] >>> IP('127.0.0.0/15').reverseNames() ['0.127.in-addr.arpa.', '1.127.in-addr.arpa.'] >>> IP('128.0.0.0/8').reverseNames() ['128.in-addr.arpa.'] >>> IP('128.0.0.0/7').reverseNames() ['128.in-addr.arpa.', '129.in-addr.arpa.'] >>> IP('::1:2').reverseNames() ['2.0.0.0.1.ip6.arpa.'] iiiiiiiitls3can't create IPv6 reverse names at sub nibble levelRhi s %s.ip6.arpa.sonly IPv4 and IPv6 supportedNiiiiii(RqRvRt reverseNameRRRjt reverseNamesRRoRRrtNotImplementedErrortlisttreverseRRmRp(RRRRRtstfirst_nibble_index((s'/usr/lib/python2.7/site-packages/IPy.pyR+s: ""      cCs<|jdkr|jd}|jd}|jtd|jd}|jddkrd|d|jdt|j|jddjddf}|dd kr|d }n|d7}nd }dj ||}d ||fS|jd kr,|j }|dk r)|j St |jd j}|dd kr_|d }n|jddkrd||jt |j|jdd jf}|dd kr|d }n|d7}nd }t|}|jdj |}td|jdd }d|||fStddS(sReturn the value for reverse lookup/PTR records as RFC 2317 look alike. RFC 2317 is an ugly hack which only works for sub-/24 e.g. not for /23. Do not use it. Better set up a zone for every address. See reverseName for a way to achieve that. >>> print(IP('195.185.1.1').reverseName()) 1.1.185.195.in-addr.arpa. >>> print(IP('195.185.1.0/28').reverseName()) 0-15.1.185.195.in-addr.arpa. >>> IP('::1:2').reverseName() '2.0.0.0.1.ip6.arpa.' iiRhis%s-%siiiRRs%s%s.in-addr.arpa.iii s%s%s.ip6.arpa.sonly IPv4 and IPv6 supportedN(RqRRuRRmRrRRoRvRRRjRRRRRp(RRtfirst_byte_indext nibblepartRR((s'/usr/lib/python2.7/site-packages/IPy.pyRcs@ F      8    cCs?dt|kr%td|ntd||fdtS(sTransform a single IP address into a network specification by applying the given netmask. Returns a new IP instance. >>> print(IP('127.0.0.1').make_net('255.0.0.0')) 127.0.0.0/8 Rgsinvalid netmask (%s)s%s/%sR(RsRpRyR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRs cCsttj||S(sACalled to implement evaluation of self[key]. >>> ip=IP('127.0.0.0/30') >>> for x in ip: ... print(str(x)) ... 127.0.0.0 127.0.0.1 127.0.0.2 127.0.0.3 >>> print(str(ip[2])) 127.0.0.2 >>> print(str(ip[-1])) 127.0.0.3 (RyReR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRscCsd|jdS(sePrint a representation of the Object. >>> IP('10.0.0.0/8') IP('10.0.0.0/8') sIP('%s')i(R(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCs|j|jkr'tdn|jdkrHtdn|j|jkrotdn||kr|j|St|j}|jd|_|SdS(s3Emulate numeric objects through network aggregations3Only networks with the same prefixlen can be added.is8Networks with a prefixlen longer than /1 can't be added.s4Only networks with the same IP version can be added.N(RRpRt__add__RyRmRr(RRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  ( RRRRRzRRRRRRRR(((s'/usr/lib/python2.7/site-packages/IPy.pyRys  8 5  c Csg}d}d}x|t|kr1||}|jdr{|dk r_td|nt|}|d7}qn|jd}|dkrtd|n|dkr |j|| |||d!dkr||7}n||d7}|t|kr.td|q.q|j|PqW|rd |dkr|dk r~|t|dk r~td |nt|dd}|d d |d ?d |d @g}n|dk rdt|}|dkrtd|n|| dg|||}nt|dkr9td|nd}d}x|D]}y0t|d }d|ko{d kn } Wntk rt} nX| rtd||fn|d >|}|d7}qLW|S(st Internal function used by parseAddress() to parse IPv6 address with ':'. >>> print(_parseAddressIPv6('::')) 0 >>> print(_parseAddressIPv6('::1')) 1 >>> print(_parseAddressIPv6('0:0:0:0:0:0:0:1')) 1 >>> print(_parseAddressIPv6('0:0:0::0:0:1')) 1 >>> print(_parseAddressIPv6('0:0:0:0:0:0:0:0')) 0 >>> print(_parseAddressIPv6('0:0:0::0:0:0')) 0 >>> print(_parseAddressIPv6('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210')) 338770000845734292534325025077361652240 >>> print(_parseAddressIPv6('1080:0000:0000:0000:0008:0800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080:0:0:0:8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080:0::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('FF01:0:0:0:0:0:0:43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('FF01:0:0::0:0:43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('FF01::43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('0:0:0:0:0:0:13.1.68.3')) 218186755 >>> print(_parseAddressIPv6('::13.1.68.3')) 218186755 >>> print(_parseAddressIPv6('0:0:0:0:0:FFFF:129.144.52.38')) 281472855454758 >>> print(_parseAddressIPv6('::FFFF:129.144.52.38')) 281472855454758 >>> print(_parseAddressIPv6('1080:0:0:0:8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('::1:2:3:4:5:6')) 1208962713947218704138246 >>> print(_parseAddressIPv6('1:2:3:4:5:6::')) 5192455318486707404433266432802816 is::s,%r: Invalid IPv6 address: more than one '::'iRs%r: Invalid IPv6 addressiiRhs)%r: Invalid IPv6 address: '::' after IPv4s%04xiiis,%r: Invalid IPv6 address: '::' is not neededRs/%r: Invalid IPv6 address: should have 8 hextetss+%r: Invalid IPv6 address: invalid hexlet %rN( RjRvt startswithRpR{RRwRmR( tipstrtitemsRtfill_posRtpostvaluetdiffRterror((s'/usr/lib/python2.7/site-packages/IPy.pyt_parseAddressIPv6s`6        #'    !  cCs |jdrdt|dd}|dkrAtd|n|dkrW|dfS|dfSn|jd d krt|dfSt|d krt|ddfS|jd d kst|dkrt|d kr|jd }t|dkrtdn|dgdt|7}g|D]}t|^q9}x9|D]1}|dksv|dkrXtd|qXqXW|dd>|dd>|dd>|ddfSt|d}|dkrtdn|dkr|dfS|dfSdS(s Parse a string and return the corresponding IP address (as integer) and a guess of the IP version. Following address formats are recognized: >>> def testParseAddress(address): ... ip, version = parseAddress(address) ... print(("%s (IPv%s)" % (ip, version))) ... >>> testParseAddress('0x0123456789abcdef') # IPv4 if <= 0xffffffff else IPv6 81985529216486895 (IPv6) >>> testParseAddress('123.123.123.123') # IPv4 2071690107 (IPv4) >>> testParseAddress('123.123') # 0-padded IPv4 2071658496 (IPv4) >>> testParseAddress('1080:0000:0000:0000:0008:0800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('1080:0:0:0:8:800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('1080:0::8:800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('::1') 1 (IPv6) >>> testParseAddress('::') 0 (IPv6) >>> testParseAddress('0:0:0:0:0:FFFF:129.144.52.38') 281472855454758 (IPv6) >>> testParseAddress('::13.1.68.3') 218186755 (IPv6) >>> testParseAddress('::FFFF:129.144.52.38') 281472855454758 (IPv6) t0xiil s)%r: IP Address can't be bigger than 2^128IiiRii Rhis#IPv4 Address with more than 4 bytesRiis'%r: single byte must be 0 <= byte < 256iiiii s%IP Address can't be bigger than 2^128IN(RRnRpR{RRvRmRu(RRtbytesR((s'/usr/lib/python2.7/site-packages/IPy.pyRwIs6#    9 2   cCst|}|dkr+td|nd}|dkr|dkrbtdt|nx6tdD](}t|d@d|}|d ?}qoW|d }n|d krp|d krtd t|ntjdkrt|d}nt|dd !}|jd}xCtddD]2}|| |}|ddkr-d|}q-q-W|d}n td|S(s/Transform an integer string into an IP address.isIPs can't be negative: %dRiIs2IPv4 Addresses can't be larger than 0xffffffff: %siRhiiil sJIPv6 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %siii ii!Rsonly IPv4 and IPv6 supported(RnRpRRRstsyst hexversiontzfill(RoRRRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs2         cCs0|dkrdS|dkr dStddS(sReturn number of bits in address for a certain IP version. >>> _ipVersionToLen(4) 32 >>> _ipVersionToLen(6) 128 >>> _ipVersionToLen(5) Traceback (most recent call last): File "", line 1, in ? File "IPy.py", line 1076, in _ipVersionToLen raise ValueError("only IPv4 and IPv6 supported") ValueError: only IPv4 and IPv6 supported ii iisonly IPv4 and IPv6 supportedN(Rp(R((s'/usr/lib/python2.7/site-packages/IPy.pyt_ipVersionToLens   cCs@t|dkrdS|ddkr*dSdt|dSdS(sDReturn number of elements containing 0 at the beginning of the list.iiN(RvR(R((s'/usr/lib/python2.7/site-packages/IPy.pyRs t0000t0010t2t3t0100t4t0101t5t0110t6t0111t7t1000t8t1001t9t1010tat1011tbt1100tct1101tdtet1111tfcCs|dkrtdnt|j}d}|ddkrP|d }nx |dD]}|t|7}q[Wx0|ddkrt|dkr|d}qvW|S( s9Return the binary representation of an integer as string.isOnly positive values allowedRiRiRi(RpRRt _BitTableRv(tvalRRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  %cCs1d}x$|dkr,|d?}|d7}q W|S(s,Find the highest bit set to 1 in an integer.ii((tnumR((s'/usr/lib/python2.7/site-packages/IPy.pyRxs  cCspt|}|dkr+td|nd}x8|dkrk|d@dkrTPn|d?}|d7}q4W|S(s,Find the highest bit set to 0 in an integer.is Only positive Numbers please: %si(RnRp(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt _count0Bitss   cCsit|}|dks$||kr(dS|dkrA|d}n t|}|||kradSdSdS(sJCheck the validity of a prefix Checks if the variant part of a prefix only has 0s, and the length is correct. >>> _checkPrefix(0x7f000000, 24, 4) 1 >>> _checkPrefix(0x7f000001, 24, 4) 0 >>> repr(_checkPrefix(0x7f000001, -1, 4)) 'None' >>> repr(_checkPrefix(0x7f000001, 33, 4)) 'None' iiN(RRjR(RoRRRtzbits((s'/usr/lib/python2.7/site-packages/IPy.pyt _checkPrefixs    cCst|}|}xD|d@dkrX|dkrX|d?}|d8}|dkrPqqWxM|dkr|d@dkrtdt|n|d?}|d8}q\WdS(s2Checks if a netmask is expressable as a prefixlen.iis+Netmask %s can't be expressed as an prefix.N(RnRpR(RtmasklenRR((s'/usr/lib/python2.7/site-packages/IPy.pyt _checkNetmask(s     cCs|t||@|kS(sBCheck if a base addess of a network is compatible with a prefixlen(R}(RRR((s'/usr/lib/python2.7/site-packages/IPy.pyR~<scCs-t|}t|}t||||S(snConvert an Integer representing a netmask to a prefixlen. E.g. 0xffffff00 (255.255.255.0) returns 24 (RRxR (RtnetlenR ((s'/usr/lib/python2.7/site-packages/IPy.pyR|As   cCsI|dkrdS|dkr+tdnd|d>dt||>S(sReturn a mask of n bits as a long integer. From 'IP address conversion functions with the builtin socket module' by Alex Martelli http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66517 isPrefixlen must be > 0ii(RpR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyR}Ms   t__main__i(Rt __version__RttypesRRReRyRRwRRRRRRxRR R R~R|R}Rtdoctestttestmodtfailuretnbtesttexit(((s'/usr/lib/python2.7/site-packages/IPy.pyts       x L %           PK[ݘusite-packages/pkg_resources.pyonu[ b-QcF@sP dZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z yddl m Z m Z Wn'e k rddlm Z m Z nXyeWn!ek rddlmZnXy0edZddlmZeedZWnWek rweZddlmZed Zeed ZddlZejZnXdd lm Z y&dd lm!Z!m"Z"m#Z#e$Z%Wne k re&Z%nXdd lm'Z(ddl)m*Z*m+Z+ej,ddfkoej-j.dkr'ddl/j0Z1neZ1yddl2Z2Wne k rPnXddZ3iZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<Z=dZ>ddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`gEZ?d7e@fdaYZAd8eAfdbYZBd9eAfdcYZCd:eAfddYZDiZEejFd ZGdZHdeZIdfZJdgZKdZLdhZMdiZNgdjZOdkZPdlZQejRdmZSejRdnZTeQZUdoZVdpZWeWZXdqZYdrZZedsZ[dtZ\dOfduYZ]dPe]fdvYZ^d2e_fdwYZ`d1e_fdxYZaeaZbd;ecfdyYZdd3fdzYZed{Zfd|Zgd}Zhd~ZidZjidgd6dgd6dddgd6gd6gd6gd6Zkidd6dd6dd6dd6dd6dd6dd6ZldZmdZndZoeidZpdZqderkr0eqZpndVfdYZseMe_esdWesfdYZtdXetfdYZueMeveeue1ek reMe1jweundTesfdYZxexZydZzdYetfdYZ{eMej|e{dQexfdYZ}dReufdYZ~dSe{fdYZdfdYZdfdYZdZyddlmZmZWne k rn XeZ[[e5ddidZe&dZe&dZeej|ee&dZee_ee&dZeeee1ek r9ee1jene5ddie5ddidZdZdZedZdZeeeeej|ee1ek ree1jendZee_edZidZdZdZejRdjZejRdjZejRdjZejRdjZejRdjZejRdjZejRdjZejRdjZejRdejejBjZejRdejZidd6dd6dd6dd6dd6jZdZdZd6e_fdYZdZd4e_fdYZdefdYZied6ed6ed6ZdZdZdZd5fdYZidd6dd6dd6dd6dd6dd6ZdZdZdZdZdZeeZdZeere5dd+e`yddlmZWne k rN nXyejeWneBk r e`gZx0ejeeeaD]Zejeq Wx0ejD]%Zeejkr ejenq Wejej(nXejZejZejZejWZWeWZXedge_eeejejdS(sYPackage resource API -------------------- A resource is a logical file contained within a package, or a logical subdirectory thereof. The package resource API expects resource names to have their path parts separated with ``/``, *not* whatever the local path separator is. Do not use os.path operations to manipulate resource names being passed into the API. The package resource API is designed to work with normal filesystem packages, .egg files, and unpacked .egg files. It can also work in a limited way with .zip files and with custom PEP 302 loaders that support the ``get_data()`` method. iN(turlparset urlunparse(t ImmutableSetcCs |jS(N(tnext(to((s1/usr/lib/python2.7/site-packages/pkg_resources.pyts(tStringIOcBsc|dkrBejd}|j}|dkr<|j}n~n|dkrW|}nddUdS(Nisexec code in globs, locs(tNonetsyst _getframet f_globalstf_locals(tcodetglobstlocstframe((s1/usr/lib/python2.7/site-packages/pkg_resources.pytexec_ s      (tBytesIOtexeccCsY|dkrt}n|dkr-|}nttt|j|d||dS(NR(RtglobalsRtcompiletopentread(tfnR R((s1/usr/lib/python2.7/site-packages/pkg_resources.pytexecfile.s     (tutime(tmkdirtrenametunlink(R(tisdirtsplititcpythonicCs^tstdnt|\}}|rZ|rZt| rZt|t||ndS(Ns*"os.mkdir" not supported on this platform.(t WRITE_SUPPORTtIOErrorRRt_bypass_ensure_directoryR(tnametmodetdirnametfilename((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR"Ns  cKs>t}x.|jD] \}}|||<|t|(tself((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__repr__s(Rt __module__t__doc__R(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRgscBseZdZRS(sAAn already-installed version conflicts with the requested version(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRhscBseZdZRS(s&A requested distribution was not found(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRiscBseZdZRS(s>Distribution doesn't have an "extra feature" of the given name(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRjsiiicCs|t|eZdZdZdZdZdZdZRS(cCsdS(s;Does the package's distribution contain the named metadata?N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt has_metadatascCsdS(s'The named metadata resource as a stringN((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt get_metadatascCsdS(sYield named metadata resource as list of non-blank non-comment lines Leading and trailing whitespace is stripped from each line, and lines with ``#`` as the first non-blank character are omitted.N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_metadata_linesscCsdS(s>Is the named metadata a directory? (like ``os.path.isdir()``)N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pytmetadata_isdirscCsdS(s?List of metadata names in the directory (like ``os.listdir()``)N((R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pytmetadata_listdirscCsdS(s=Execute the named script in the supplied namespace dictionaryN((Rt namespace((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRMs(RRRRRRRRM(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs      cBsDeZdZdZdZdZdZdZdZRS(s3An object that provides access to package resourcescCsdS(sdReturn a true filesystem path for `resource_name` `manager` must be an ``IResourceManager``N((tmanagert resource_name((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_resource_filenamescCsdS(siReturn a readable file-like object for `resource_name` `manager` must be an ``IResourceManager``N((RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_resource_streamscCsdS(smReturn a string containing the contents of `resource_name` `manager` must be an ``IResourceManager``N((RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pytget_resource_stringscCsdS(s,Does the package contain the named resource?N((R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt has_resourcescCsdS(s>Is the named resource a directory? (like ``os.path.isdir()``)N((R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRYscCsdS(s?List of resource names in the directory (like ``os.listdir()``)N((R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRWs( RRRRRRRRYRW(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs     cBseZdZddZdZdZdZddZdZ dZ de dZ ddd Z dde d Zd Zd Zd ZdZdZRS(sDA collection of active distributions on sys.path (or a similar list)cCs^g|_i|_i|_g|_|dkr<tj}nx|D]}|j|qCWdS(s?Create working set from list of path entries (default=sys.path)N(tentriest entry_keystby_keyt callbacksRRRt add_entry(RRtentry((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__init__s       cCsT|jj|g|jj|x*t|tD]}|j||tq3WdS(sAdd a path item to ``.entries``, finding any distributions on it ``find_distributions(entry, True)`` is used to find distributions corresponding to the path entry, and they are added. `entry` is always appended to ``.entries``, even if it is already present. (This is because ``sys.path`` can contain the same value more than once, and the ``.entries`` of the ``sys.path`` WorkingSet should always equal ``sys.path``.) N(Rt setdefaultRRR]RtaddR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCs|jj|j|kS(s9True if `dist` is the active distribution for its project(RRR9(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt __contains__scCsG|jj|j}|dk r?||kr?t||n|SdS(sFind a distribution matching requirement `req` If there is an active distribution for the requested project, this returns it as long as it meets the version requirement specified by `req`. But, if there is an active distribution for the project and it does *not* meet the `req` requirement, ``VersionConflict`` is raised. If there is no active distribution for the requested project, ``None`` is returned. N(RRR9RRh(RtreqR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs ccsgx`|D]X}|j|}|dkrGx4|jD] }|Vq5Wq||kr||VqqWdS(sYield entry point objects from `group` matching `name` If `name` is None, yields all entry points in `group` from all distributions in the working set, otherwise only ones matching both `group` and `name` are yielded (in distribution order). N(RQRtvalues(RRGR#RRtep((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRSs    cCsQtjdj}|d}|j||d<|j|dj||dS(s?Locate distribution for `requires` and run `script_name` scriptiRiN(RR R R7RLRM(RtrequiresRRR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRMs    ccspi}xc|jD]X}||jkr+qnx:|j|D]+}||kr9d||<|j|Vq9q9WqWdS(sYield distributions for non-duplicate projects in the working set The yield order is the order in which the items' path entries were added to the working set. iN(RRR(RtseentitemR9((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__iter__ s  cCs|r|j|j|n|dkr4|j}n|jj|g}|jj|jg}|j|jkrwdS||j|j<|j|kr|j|jn|j|kr|j|jn|j |dS(sAdd `dist` to working set, associated with `entry` If `entry` is unspecified, it defaults to the ``.location`` of `dist`. On exit from this routine, `entry` is added to the end of the working set's ``.entries`` (if it wasn't already present). `dist` is only added to the working set if it's for a project that doesn't already have a distribution in the set. If it's added, any callbacks registered with the ``subscribe()`` method will be called. N( t insert_onRRtlocationRRR9RRt _added_new(RRRtinserttkeystkeys2((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR1s   c CsVt|ddd}i}i}g}x$|rQ|jd}||krUq.n|j|j}|dkr|jj|j}|dkr|dkrt|j}n|j|||}||j<|dkrt |qn|j |n||krt ||n|j |j |jdddt||tchmod(RttempnameR&R$((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt postprocess1scCs%|jrtdn||_dS(sSet the base path where resources will be extracted to, if needed. If you do not call this routine before any extractions take place, the path defaults to the return value of ``get_default_cache()``. (Which is based on the ``PYTHON_EGG_CACHE`` environment variable, with various platform-specific fallbacks. See that routine's documentation for more details.) Resources are extracted to subdirectories of this path based upon information given by the ``IResourceProvider``. You may set this to a temporary directory, but then you must call ``cleanup_resources()`` to delete the extracted files when done. There is no guarantee that ``cleanup_resources()`` will be able to remove all extracted files. (Note: you may not change the extraction path for a given resource manager once resources have been extracted, unless you first call ``cleanup_resources()``.) s5Can't change extraction path, files already extractedN(R,RHR.(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR^Zs  cCsdS(sB Delete all extracted resource files and directories, returning a list of the file and directory names that could not be successfully removed. This function does not have any concurrency protection, so it should generally only be called when the extraction path is a temporary directory exclusive to a single process. This method is not automatically called; you must call it explicitly or register it as an ``atexit`` function if you wish to ensure cleanup of a temporary directory used for extractions. N((Rtforce((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR_tsN((RRRRR.RRXRYRVRURTRWR3R9t staticmethodR4RHR^RR_(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRcs        ) ) ) cCsytjdSWntk r"nXtjdkrBtjjdSd}dd|fd|fd|fdd|fg}x|D]\}}d }xn|D]5}|tjkrtjj|tj|}qPqW|rtjj||}ntjj|d SqWtd dS(s Determine the default cache location This returns the ``PYTHON_EGG_CACHE`` environment variable, if set. Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the "Application Data" directory. On all other systems, it's "~/.python-eggs". tPYTHON_EGG_CACHER:s~/.python-eggssApplication DatatAPPDATAt USERPROFILEt HOMEDRIVEtHOMEPATHtHOMEtWINDIRRs Python-Eggss3Please set the PYTHON_EGG_CACHE enviroment variableN(sAPPDATA((sAPPDATAN(RM(RNRO(RO(sHOME((sHOMEN(RQ( RR<RR#Rt expanduserRREt RuntimeError(tapp_datat app_homesRtsubdirR%R9((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR`s0     cCstjdd|S(sConvert an arbitrary string to a standard distribution name Any runs of non-alphanumeric/. characters are replaced with a single '-'. s[^A-Za-z0-9.]+t-(tretsub(R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRnscCs%|jdd}tjdd|S(sConvert an arbitrary string to a standard version string Spaces become dots, and all other non-alphanumeric characters become dashes, with runs of multiple dashes condensed to a single dash. RR@s[^A-Za-z0-9.]+RW(RRXRY(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRoscCstjdd|jS(sConvert an arbitrary string to a standard 'extra' name Any runs of non-alphanumeric characters are replaced with a single '_', and the result is always lowercased. s[^A-Za-z0-9.]+R(RXRYR(textra((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRtscCs|jddS(s|Convert a project or version name to its filename-escaped form Any '-' characters are currently replaced with '_'. RWR(R(R#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRusR#RRDRRRtpython_implementationtpython_versiontpython_full_versionRZcCstjS(N(RR#(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRstos_namecCstjS(N(RRD(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRst sys_platformcCstjjdS(Ni(RRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCsdtjdtjdfS(Ns%s.%sii(Rt version_info(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs tdS(NR(t _platinfo(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRstplatform_versioncCs tdS(NR(Ra(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRstplatform_machinecCstdptS(NR[(Rat_pyimp(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs;yddl}Wntk r$dSXt||dS(NiRcSsdS(NR((((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs(RDRR(tattrRD((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRas  cCsDtjdkrdStjjdr)dSdtjkr<dSdSdS(Ntclit IronPythontjavatJythont__pypy__tPyPytCPython(RRDRtbuiltin_module_names(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRdscCs1yt|Wntk r,tjdSXtS(sHValidate text as a PEP 426 environment marker; return exception or Falsei(Rwt SyntaxErrorRRR(ttext((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRvs  csNs ddlmmddlddlddlfd}fd}fd}fd}ji|j6|j6|j6|j 6dd 6d d 6j d 6j d 6t dr |j (RoRRR9tnew_keytresultte((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_markerlib_evaluateVs   RcBseZdZdZdZdZdZdZdZ dZ dZ dZ e jdkrodZn d Zd Zd Zd Zd ZdZdZdZdZdZdZdZRS(sETry to implement resources and metadata for arbitrary PEP 302 loaderscCs:t|dd|_tjjt|dd|_dS(NRt__file__R(RRRRRR%t module_path(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRvscCs|j|j|S(N(t_fnR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRzscCst|j||S(N(RR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR}scCs|j|j|j|S(N(t_getRR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|j|j|j|S(N(t_hasRR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs%|jo$|j|j|j|S(N(tegg_infoRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRsicCs)|js dS|j|j|j|S(NR(RRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCs2|js dS|j|j|j|jdS(NRsutf-8(RRRtdecode(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCst|j|S(N(RrR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|j|j|j|S(N(t_isdirRR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRYscCs%|jo$|j|j|j|S(N(RRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|j|j|j|S(N(t_listdirRR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRWscCs)|jr%|j|j|j|SgS(N(RRR(RR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs cCsd|}|j|s,td|n|j|jdd}|jdd}|j|j|}||d os.sep on pypy it is the same (one reason why distribute did work in some cases on pypy and win32). * [1] - zipinfo.compress_type * [2] - zipinfo.compress_size * [3] - zipinfo.file_size * [4] - len(utf-8 encoding of filename) if zipinfo & 0x800 len(ascii encoding of filename) otherwise * [5] - (zipinfo.date_time[0] - 1980) << 9 | zipinfo.date_time[1] << 5 | zipinfo.date_time[2] * [6] - (zipinfo.date_time[3] - 1980) << 11 | zipinfo.date_time[4] << 5 | (zipinfo.date_time[5] // 2) * [7] - zipinfo.CRC RN( RtzipfiletZipFiletnamelistRRtseptgetinfoR(Rtzipinfotzfiletzitemtzpath((s1/usr/lib/python2.7/site-packages/pkg_resources.pytbuild_zipmanifests  cBseZdZdZdZdZdZdZe dZ dZ dZ dZ d Zd Zd Zd Zd ZdZRS(s"Resource support for zips and eggscCs?tj||t|jj|_|jjtj|_dS(N( RRRRtarchiveRRRtzip_pre(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR@scCs@|j|jr#|t|jStd||jfdS(Ns%s is not a subpath of %s(RRRutAssertionError(Rtfspath((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt _zipinfo_nameEscCsd|j|}|j|jtjrG|t|jdjtjStd||jfdS(Nis%s is not a subpath of %s(RRRRRRuRR(Rtzip_pathR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_partsNs  !cCs|jstdn|j|}|j}dj|j||kr~x*|D]}|j||j|qXWn|j||S(Ns5resource_filename() only supported for .egg, not .zipR(RRt_resource_to_zipt_get_eager_resourcesRERt_extract_resourcet _eager_to_zip(RRRRteagersR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRWs     cCs/|j}|jd}tj|}||fS(Nii(iii(t file_sizet date_timettimetmktime(tzip_stattsizeRt timestamp((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_get_date_and_sizeds  c Cs||jkr^x9|j|D]'}|j|tjj||}q#Wtjj|S|j|j|\}}tst dny(|j |j |j |}|j ||r|Stddtjj|\}} tj||jj|tj|t| ||f|j| |yt| |Wnltjk rtjj|r|j ||r|Stjdkrt|t| ||SnnXWntjk r|jnX|S(Ns>"os.rename" and "os.unlink" are not supported on this platforms .$extracttdirR:(t_indexRRRRER%RRR R!R9RRt _is_currentt_mkstemptwriteRRRRRHRterrortisfileR#RR3( RRRR#tlastRRt real_pathtoutfttmpnam((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRls@$    c Cs|j|j|\}}tjj|s2tStj|}|j|ks_|j|krctS|j j |}t |d}|j }|j ||kS(sK Return True if the file_path is current for this zip_path R(RRRRRRR=tst_sizetst_mtimeRRRRR( Rt file_pathRRRR=t zip_contentstft file_contents((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs  cCsa|jdkrZg}x6dD].}|j|r|j|j|qqW||_n|jS(Nsnative_libs.txtseager_resources.txt(snative_libs.txtseager_resources.txt(RRRRR(RRR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs  cCsy |jSWntk ri}x~|jD]s}|jtj}xX|rtjj|d }||kr||j|dPqF|jg||PEP 302 Importer that wraps Python's "normal" import algorithmcCs ||_dS(N(R(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRIscCs|jdd}||kr2|jdkr2dS|jdkrJd}n |jg}ytj||\}}}Wntk rdSXt|||S(NR@i(RRRtimpt find_moduleRt ImpLoader(RtfullnameRtsubnametfileR&tetc((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRLs   N(RRRRRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRFs RcBs eZdZdZdZRS(s<PEP 302 Loader that wraps Python's "normal" import algorithmcCs||_||_||_dS(N(RR&R(RRR&R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR^s  cCsFz%tj||j|j|j}Wd|jrA|jjnX|S(N(Rt load_moduleRR&RR(RRtmod((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRcs % (RRRRR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR[s cCsytj|}WnPtk rcx@tjD]+}y||}Wntk rTq+XPq+Wd}nXtjj|||dkryt|}Wqtk rqXn|S(sRetrieve a PEP 302 "importer" for the given path item If there is no importer, this returns a wrapper around the builtin import machinery. The returned importer is only cached if it was created by a path hook. N(Rtpath_importer_cacheRt path_hooksRRRR(t path_itemRthook((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRos"     (Rt ImpImporterRt_distribution_finderscCs|t|=?|==|!=)\s*((\w|[-.])+)s\s*,s\s*\[s\s*\]s \w+(\.\w+)*$sL(?P[^-]+)( -(?P[^-]+) (-py(?P[^-]+) (-(?P.+))? )? )?s(\d+ | [a-z]+ | \.| -)tctpretpreviewsfinal-RWtrct@tdevccsuxitj|D]X}t||}| s|dkr>qn|d dkr_|jdVqd|VqWdVdS(NR@it 0123456789it*s*final(t component_reRRtzfill(Rtpart((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_parse_version_partss cCsg}xt|jD]}|jdr|dkrdx'|r`|ddkr`|jq=Wnx'|r|ddkr|jqgWn|j|qWt|S(sConvert a version string to a chronologically-sortable key This is a rough cross between distutils' StrictVersion and LooseVersion; if you give it versions that would work with StrictVersion, then it behaves the same; otherwise it acts like a slightly-smarter LooseVersion. It is *possible* to create pathological version coding schemes that will fool this parser, but they should be very rare in practice. The returned value will be a tuple of strings. Numeric portions of the version are padded to 8 digits so they will compare numerically, but without relying on how numbers compare relative to strings. Dots are dropped, but dashes are retained. Trailing zeros between alpha segments or dashes are suppressed, so that e.g. "2.4.0" is considered the same as "2.4". Alphanumeric parts are lower-cased. The algorithm assumes that strings like "-" and any alpha string that alphabetically follows "final" represents a "patch level". So, "2.4-1" is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is considered newer than "2.4-1", which in turn is newer than "2.4". Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that come before "final" alphabetically) are assumed to be pre-release versions, so that the version "2.4" is considered newer than "2.4a1". Finally, to handle miscellaneous cases, the strings "pre", "preview", and "rc" are treated as if they were "c", i.e. as though they were release candidates, and therefore are not as new as a version string that does not contain them, and "dev" is replaced with an '@' so that it sorts lower than than any other pre-release tag. R8s*finalis*final-t00000000(R<RRRRttuple(RRR;((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRms cBseZdZd d d dZdZdZed d dZd d dZ d dZ e e Z d dZ e e Z d dZ e e Z RS( s3Object representing an advertised importable objectcCsnt|std|n||_||_t||_tjddj|j |_ ||_ dS(NsInvalid module namesx[%s]t,( tMODULERHR#t module_nameR>tattrsReRRERR(RR#RARBRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs   "cCsfd|j|jf}|jr<|ddj|j7}n|jrb|ddj|j7}n|S(Ns%s = %st:R@s [%s]R?(R#RARBRER(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt__str__s   cCsdt|S(NsEntryPoint.parse(%r)(R(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRscCs|r|j||nt|jttdg}xN|jD]C}yt||}WqDtk rtd||fqDXqDW|S(NRs%r has no %r attribute(RLRRARRBRRR(RRLRRRRe((s1/usr/lib/python2.7/site-packages/pkg_resources.pytloads! cCs]|jr%|j r%td|ntttjtj|jj|j||dS(Ns&Can't require() without a distribution( RRRjRRR[RRR(RRR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRLs cCsyd }}|jdd\}}d|krz|jdd\}}tjd|}|jrntn|j}nd|kr|jdd\}}t|jstn|jjd}nWn tk rtd|n#X||j|j|||SdS( sParse a single entry point from string `src` Entry point syntax follows the form:: name = some.module:some.attr [extra1,extra2] The entry name and module name are required, but the ``:attrs`` and ``[extras]`` parts are optional t=it[sx[RCR@s9EntryPoint must be in 'name=module:attrs [extras]' formatN(( RReRtspecsRHRR@RR(tclstsrcRRBRR#tvalueR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs&         cCst|std|ni}xZt|D]L}|j||}|j|krptd||jn|||jEnsure distribution is importable on `path` (default=sys.path)snamespace_packages.txtN( RRRRRRRRRZRk(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pytactivate s    cCsOdt|jt|j|jp'tf}|jrK|d|j7}n|S(s@Return what this distribution's standard .egg filename should bes %s-%s-py%sRW(RuRRRR+RD(RR&((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s  cCs(|jrd||jfSt|SdS(Ns%s (%s)(RR(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s cCsMyt|dd}Wntk r/d}nX|p9d}d|j|fS(NRs[unknown version]s%s %s(RRRHR(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRD s   cCs.|jdrt|nt|j|S(sADelegate all unrecognized public attributes to .metadata providerR(RRRRW(RRe((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt __getattr__ scKs(|jt|tjj|||S(N(RRRRR(RIR&RR*((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR scCstjd|j|jfS(s?Return a ``Requirement`` that matches this distribution exactlys%s==%s(ReRRR(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR scCsD|j||}|dkr:td||ffn|jS(s=Return the `name` entry point of `group` or raise ImportErrorsEntry point %r not foundN(RRRRRE(RRGR#R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRP s cCscy |j}Wn3tk rBtj|jd|}|_nX|dk r_|j|iS|S(s=Return the entry point map for `group`, or the full entry mapsentry_points.txtN(t_ep_mapRRfRQRkRR(RRGtep_map((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRQ s    cCs|j|j|S(s<Return the EntryPoint object for `group`+`name`, or ``None``(RQR(RRGR#((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRR sc Csj|p |j}|sdSt|}tjj|}g|D]}|rVt|pY|^q>}d}xt|D]w\}}||krPqu||kru|jtkru|t jkr|j n|j |||j ||PququW|t jkr |j n|j |dSxFy|j ||d} Wntk rNPq X|| =|| =| }q dS(s@Insert self.location in path before its nearest parent directoryNi(RRRRR%Rt enumerateRRzRtcheck_version_conflictRRtindexRH( RRtloctnloctbdirtptnpathtbpRtnp((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s8 +      c Cs|jdkrdStj|jd}t|j}x|jdD]}|tjksJ||ksJ|tkr}qJn|dkrqJnt tj|dd}|rt|j |sJ|j |jrqJnt d|||jfqJWdS( Nt setuptoolssnamespace_packages.txts top_level.txtt pkg_resourcestsiteRsIModule %s was already imported from %s, but %s is being added to sys.path(RRssite( R9RR RkRyRRRRRRRt issue_warning(RtnspRztmodnameR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRxG s"  cCs8y |jWn&tk r3tdt|tSXtS(NsUnbuilt egg for (RRHRRRR(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR#] s   cKsMx*dD]"}|j|t||d qW|jd|j|j|S( s@Copy this distribution, substituting in any changed keyword argsRRRRDRRR(s project_namesversions py_versionsplatformslocations precedenceN(RRRRWR(RR*Re((s1/usr/lib/python2.7/site-packages/pkg_resources.pytclonee s   cCs g|jD]}|r |^q S(N(Rq(Rtdep((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs sN(((RRRRlRR+RzRRRRtpropertyR`RaRbRcRdReRfRgR9R^RRqRRkRsRRRDRtRRRPRQRRRRxR#RR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRd; sT                          )    tDistInfoDistributioncBsSeZdZdZejdZedZedZ dZ dZ RS(sGWrap an actual or potential sys.path entry w/metadata, .dist-info styletMETADATAs([\(,])\s*(\d.*?)\s*([,\)])cCsXy |jSWnFtk rSddlm}|j|j|j|_|jSXdS(sParse and cache metadatai(tParserN(t _pkg_infoRt email.parserRtparsestrRRl(RR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_parsed_pkg_info} s   !cCs6y |jSWn$tk r1|j|_|jSXdS(N(t_DistInfoDistribution__dep_mapRt_compute_dependencies(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRq s   cCsy|jdddg}|dj}|dj}tj|jd|}|jddjdd}||fS(sConvert 'Foobar (1); baz' to ('Foobar ==1', 'baz') Split environment marker, add == prefix to version specifiers as necessary, and remove parenthesis. t;iRis\1==\2\3t(t)(RRRXRYtEQEQR(Rt requires_distRtdistverstmark((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_preparse_requirement s c sddlm}igd6}|_gxc|jjdpBgD]I}|j|\}}tt|}|||_ j |qCWfd}t |d}|dj |xR|jjdpgD]8} t | j} tt || ||| R*tlevelR+RB((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s  c #s#tt|fd}xD]}t|}|sRtd|n|jd}|j}g}t||}|r|j}|tt||dd\}}}n|tt ||d d\}}}g|D]\}} |t | f^q}t |||Vq(WdS( sYield ``Requirement`` objects for each specification in `strs` `strs` must be an instance of ``basestring``, or a (possibly-nested) iterable thereof. cs?g}x|||s t||r`yt}d}Wq`tk r\tdq`Xn|||}|std|d|d||n|j|j||j}t||}|r|j}q |||s td|d||q q W|||}|r2|j}n|||fS(Nis+\ must not appear on the last nonblank lines Expected s intatsExpected ',' or end-of-list in(tCONTINUERt StopIterationRHRRGtendtCOMMA(tITEMt TERMINATORRR}tgroupst item_nameR'RC(RL(s1/usr/lib/python2.7/site-packages/pkg_resources.pyt scan_list s0  $ sMissing distribution specis 'extra' nameis version specN(i(ii( titerRrtDISTRORHRGRtOBRACKETtCBRACKETtVERSIONtLINE_ENDRoRe( R/RRRCRR}RRHRR,((RLs1/usr/lib/python2.7/site-packages/pkg_resources.pyRl s"    $$+cCs\g|D]}|j|f^q}|jg|D]\}}|^q3|dddDO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!N(Rnt unsafe_nameRRR9Rmt state_machineRRHR>RRtRyRRthashCmpR_t_Requirement__hash( RRRHRRR1RyRSttransRX((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR2 s5 ."4cCsgdjg|jD]}dj|^q}dj|j}|rSd|}nd|j||fS(NR?Rs[%s]s%s%s%s(RERHRR(RRRHR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRD@ s . cCst|to|j|jkS(N(RReR(RR&((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRfF sc Cs t|tr=|j|jkr%tS|jr[|j}q[nt|tr[t|}nd}d}x|jD]{\}}}}||||}|dkrtS|dkrt S|dkrt }qt|dks|dkrtt}qtqtW|dkrt }n|S(NcSs||k||kS(N((tatb((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRP stFtTt+RW( RRdR9RRyR^RRmRR( RRRtcompareRSRRRXtaction((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRI s,       cCs|jS(N(R(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRa[ scCsdt|S(NsRequirement.parse(%r)(R(R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR^ scCsWtt|}|rDt|dkr2|dStd|ntd|dS(NiisExpected only one requirementsNo requirements found(RRlRuRH(RRo((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRa s ( RRRRDRfRRaRRRJ(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRe1 s       s--TtsT+Fs>=sT..s==sF++s!=cCs:t|ts3d|tfdY}|jdS|jS(s&Get an mro for a type or classic classRIcBseZRS((RR(((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRIy si(Rttypetobjectt__mro__(RI((s1/usr/lib/python2.7/site-packages/pkg_resources.pyt_get_mrov s cCsAx:tt|dt|D]}||kr||SqWdS(s2Return an adapter factory for `ob` from `registry`RN(RRR(tregistryR:R((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR} s% cCs8tjj|}tjj|s4tj|ndS(s1Ensure that the parent directory of `path` existsN(RRR%Rtmakedirs(RR%((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRx sccsd}g}xt|D]y}|jdr|jdrs|sI|rW||fVn|dd!j}g}qtd|q|j|qW||fVdS(srSplit a string or iterable thereof into (section,content) pairs Each ``section`` is a stripped version of the section header ("[section]") and each ``content`` is a list of stripped lines excluding blank lines and comment-only lines. If there are any such lines before the first section header, they're returned in a first ``section`` of ``None``. RGt]iisInvalid section headingN(RRrRRRRHR(RtsectiontcontentR((s1/usr/lib/python2.7/site-packages/pkg_resources.pyRs s  cOsDddlm}tj}ztt_|||SWd|t_XdS(Ni(tmkstemp(ttempfileRRRtos_open(R>R*Rtold_open((s1/usr/lib/python2.7/site-packages/pkg_resources.pyR s   cCs@x9ttD]+}|jds tt|||s`            '           +                      3      ), )           X  d    !,       (            , )w >?   # = :                  PK[fj%_%_site-packages/pyparsing.pynu[# module pyparsing.py # # Copyright (c) 2003-2011 Paul T. McGuire # # Permission is hereby granted, free of charge, to any person obtaining # a copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # #from __future__ import generators __doc__ = \ """ pyparsing module - Classes and methods to define and execute parsing grammars The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}):: from pyparsing import Word, alphas # define grammar of a greeting greet = Word( alphas ) + "," + Word( alphas ) + "!" hello = "Hello, World!" print hello, "->", greet.parseString( hello ) The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. The parsed results returned from C{parseString()} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments """ __version__ = "1.5.6" __versionTime__ = "26 June 2011 10:53" __author__ = "Paul McGuire " import string from weakref import ref as wkref import copy import sys import warnings import re import sre_constants #~ sys.stderr.write( "testing pyparsing module, version %s, %s\n" % (__version__,__versionTime__ ) ) __all__ = [ 'And', 'CaselessKeyword', 'CaselessLiteral', 'CharsNotIn', 'Combine', 'Dict', 'Each', 'Empty', 'FollowedBy', 'Forward', 'GoToColumn', 'Group', 'Keyword', 'LineEnd', 'LineStart', 'Literal', 'MatchFirst', 'NoMatch', 'NotAny', 'OneOrMore', 'OnlyOnce', 'Optional', 'Or', 'ParseBaseException', 'ParseElementEnhance', 'ParseException', 'ParseExpression', 'ParseFatalException', 'ParseResults', 'ParseSyntaxException', 'ParserElement', 'QuotedString', 'RecursiveGrammarException', 'Regex', 'SkipTo', 'StringEnd', 'StringStart', 'Suppress', 'Token', 'TokenConverter', 'Upcase', 'White', 'Word', 'WordEnd', 'WordStart', 'ZeroOrMore', 'alphanums', 'alphas', 'alphas8bit', 'anyCloseTag', 'anyOpenTag', 'cStyleComment', 'col', 'commaSeparatedList', 'commonHTMLEntity', 'countedArray', 'cppStyleComment', 'dblQuotedString', 'dblSlashComment', 'delimitedList', 'dictOf', 'downcaseTokens', 'empty', 'getTokensEndLoc', 'hexnums', 'htmlComment', 'javaStyleComment', 'keepOriginalText', 'line', 'lineEnd', 'lineStart', 'lineno', 'makeHTMLTags', 'makeXMLTags', 'matchOnlyAtCol', 'matchPreviousExpr', 'matchPreviousLiteral', 'nestedExpr', 'nullDebugAction', 'nums', 'oneOf', 'opAssoc', 'operatorPrecedence', 'printables', 'punc8bit', 'pythonStyleComment', 'quotedString', 'removeQuotes', 'replaceHTMLEntity', 'replaceWith', 'restOfLine', 'sglQuotedString', 'srange', 'stringEnd', 'stringStart', 'traceParseAction', 'unicodeString', 'upcaseTokens', 'withAttribute', 'indentedBlock', 'originalTextFor', ] """ Detect if we are running version 3.X and make appropriate changes Robert A. Clark """ _PY3K = sys.version_info[0] > 2 if _PY3K: _MAX_INT = sys.maxsize basestring = str unichr = chr _ustr = str alphas = string.ascii_lowercase + string.ascii_uppercase else: _MAX_INT = sys.maxint range = xrange set = lambda s : dict( [(c,0) for c in s] ) alphas = string.lowercase + string.uppercase def _ustr(obj): """Drop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. """ if isinstance(obj,unicode): return obj try: # If this works, then _ustr(obj) has the same behaviour as str(obj), so # it won't break any existing code. return str(obj) except UnicodeEncodeError: # The Python docs (http://docs.python.org/ref/customization.html#l2h-182) # state that "The return value must be a string object". However, does a # unicode object (being a subclass of basestring) count as a "string # object"? # If so, then return a unicode object: return unicode(obj) # Else encode it... but how? There are many choices... :) # Replace unprintables with escape codes? #return unicode(obj).encode(sys.getdefaultencoding(), 'backslashreplace_errors') # Replace unprintables with question marks? #return unicode(obj).encode(sys.getdefaultencoding(), 'replace') # ... alphas = string.lowercase + string.uppercase # build list of single arg builtins, tolerant of Python version, that can be used as parse actions singleArgBuiltins = [] import __builtin__ for fname in "sum len enumerate sorted reversed list tuple set any all".split(): try: singleArgBuiltins.append(getattr(__builtin__,fname)) except AttributeError: continue def _xml_escape(data): """Escape &, <, >, ", ', etc. in a string of data.""" # ampersand must be replaced first from_symbols = '&><"\'' to_symbols = ['&'+s+';' for s in "amp gt lt quot apos".split()] for from_,to_ in zip(from_symbols, to_symbols): data = data.replace(from_, to_) return data class _Constants(object): pass nums = string.digits hexnums = nums + "ABCDEFabcdef" alphanums = alphas + nums _bslash = chr(92) printables = "".join( [ c for c in string.printable if c not in string.whitespace ] ) class ParseBaseException(Exception): """base exception class for all parsing runtime exceptions""" # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible def __init__( self, pstr, loc=0, msg=None, elem=None ): self.loc = loc if msg is None: self.msg = pstr self.pstr = "" else: self.msg = msg self.pstr = pstr self.parserElement = elem def __getattr__( self, aname ): """supported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text """ if( aname == "lineno" ): return lineno( self.loc, self.pstr ) elif( aname in ("col", "column") ): return col( self.loc, self.pstr ) elif( aname == "line" ): return line( self.loc, self.pstr ) else: raise AttributeError(aname) def __str__( self ): return "%s (at char %d), (line:%d, col:%d)" % \ ( self.msg, self.loc, self.lineno, self.column ) def __repr__( self ): return _ustr(self) def markInputline( self, markerString = ">!<" ): """Extracts the exception line from the input string, and marks the location of the exception with a special symbol. """ line_str = self.line line_column = self.column - 1 if markerString: line_str = "".join( [line_str[:line_column], markerString, line_str[line_column:]]) return line_str.strip() def __dir__(self): return "loc msg pstr parserElement lineno col line " \ "markInputLine __str__ __repr__".split() class ParseException(ParseBaseException): """exception thrown when parse expressions don't match class; supported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text """ pass class ParseFatalException(ParseBaseException): """user-throwable exception thrown when inconsistent parse content is found; stops all parsing immediately""" pass class ParseSyntaxException(ParseFatalException): """just like C{ParseFatalException}, but thrown internally when an C{ErrorStop} ('-' operator) indicates that parsing is to stop immediately because an unbacktrackable syntax error has been found""" def __init__(self, pe): super(ParseSyntaxException, self).__init__( pe.pstr, pe.loc, pe.msg, pe.parserElement) #~ class ReparseException(ParseBaseException): #~ """Experimental class - parse actions can raise this exception to cause #~ pyparsing to reparse the input string: #~ - with a modified input string, and/or #~ - with a modified start location #~ Set the values of the ReparseException in the constructor, and raise the #~ exception in a parse action to cause pyparsing to use the new string/location. #~ Setting the values as None causes no change to be made. #~ """ #~ def __init_( self, newstring, restartLoc ): #~ self.newParseText = newstring #~ self.reparseLoc = restartLoc class RecursiveGrammarException(Exception): """exception thrown by C{validate()} if the grammar could be improperly recursive""" def __init__( self, parseElementList ): self.parseElementTrace = parseElementList def __str__( self ): return "RecursiveGrammarException: %s" % self.parseElementTrace class _ParseResultsWithOffset(object): def __init__(self,p1,p2): self.tup = (p1,p2) def __getitem__(self,i): return self.tup[i] def __repr__(self): return repr(self.tup) def setOffset(self,i): self.tup = (self.tup[0],i) class ParseResults(object): """Structured parse results, to provide multiple means of access to the parsed data: - as a list (C{len(results)}) - by list index (C{results[0], results[1]}, etc.) - by attribute (C{results.}) """ #~ __slots__ = ( "__toklist", "__tokdict", "__doinit", "__name", "__parent", "__accumNames", "__weakref__" ) def __new__(cls, toklist, name=None, asList=True, modal=True ): if isinstance(toklist, cls): return toklist retobj = object.__new__(cls) retobj.__doinit = True return retobj # Performance tuning: we construct a *lot* of these, so keep this # constructor as small and fast as possible def __init__( self, toklist, name=None, asList=True, modal=True, isinstance=isinstance ): if self.__doinit: self.__doinit = False self.__name = None self.__parent = None self.__accumNames = {} if isinstance(toklist, list): self.__toklist = toklist[:] else: self.__toklist = [toklist] self.__tokdict = dict() if name is not None and name: if not modal: self.__accumNames[name] = 0 if isinstance(name,int): name = _ustr(name) # will always return a str, but use _ustr for consistency self.__name = name if not toklist in (None,'',[]): if isinstance(toklist,basestring): toklist = [ toklist ] if asList: if isinstance(toklist,ParseResults): self[name] = _ParseResultsWithOffset(toklist.copy(),0) else: self[name] = _ParseResultsWithOffset(ParseResults(toklist[0]),0) self[name].__name = name else: try: self[name] = toklist[0] except (KeyError,TypeError,IndexError): self[name] = toklist def __getitem__( self, i ): if isinstance( i, (int,slice) ): return self.__toklist[i] else: if i not in self.__accumNames: return self.__tokdict[i][-1][0] else: return ParseResults([ v[0] for v in self.__tokdict[i] ]) def __setitem__( self, k, v, isinstance=isinstance ): if isinstance(v,_ParseResultsWithOffset): self.__tokdict[k] = self.__tokdict.get(k,list()) + [v] sub = v[0] elif isinstance(k,int): self.__toklist[k] = v sub = v else: self.__tokdict[k] = self.__tokdict.get(k,list()) + [_ParseResultsWithOffset(v,0)] sub = v if isinstance(sub,ParseResults): sub.__parent = wkref(self) def __delitem__( self, i ): if isinstance(i,(int,slice)): mylen = len( self.__toklist ) del self.__toklist[i] # convert int to slice if isinstance(i, int): if i < 0: i += mylen i = slice(i, i+1) # get removed indices removed = list(range(*i.indices(mylen))) removed.reverse() # fixup indices in token dictionary for name in self.__tokdict: occurrences = self.__tokdict[name] for j in removed: for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset(value, position - (position > j)) else: del self.__tokdict[i] def __contains__( self, k ): return k in self.__tokdict def __len__( self ): return len( self.__toklist ) def __bool__(self): return len( self.__toklist ) > 0 __nonzero__ = __bool__ def __iter__( self ): return iter( self.__toklist ) def __reversed__( self ): return iter( self.__toklist[::-1] ) def keys( self ): """Returns all named result keys.""" return self.__tokdict.keys() def pop( self, index=-1 ): """Removes and returns item at specified index (default=last). Will work with either numeric indices or dict-key indicies.""" ret = self[index] del self[index] return ret def get(self, key, defaultValue=None): """Returns named result matching the given key, or if there is no such name, then returns the given C{defaultValue} or C{None} if no C{defaultValue} is specified.""" if key in self: return self[key] else: return defaultValue def insert( self, index, insStr ): """Inserts new element at location index in the list of parsed tokens.""" self.__toklist.insert(index, insStr) # fixup indices in token dictionary for name in self.__tokdict: occurrences = self.__tokdict[name] for k, (value, position) in enumerate(occurrences): occurrences[k] = _ParseResultsWithOffset(value, position + (position > index)) def items( self ): """Returns all named result keys and values as a list of tuples.""" return [(k,self[k]) for k in self.__tokdict] def values( self ): """Returns all named result values.""" return [ v[-1][0] for v in self.__tokdict.values() ] def __getattr__( self, name ): if True: #name not in self.__slots__: if name in self.__tokdict: if name not in self.__accumNames: return self.__tokdict[name][-1][0] else: return ParseResults([ v[0] for v in self.__tokdict[name] ]) else: return "" return None def __add__( self, other ): ret = self.copy() ret += other return ret def __iadd__( self, other ): if other.__tokdict: offset = len(self.__toklist) addoffset = ( lambda a: (a<0 and offset) or (a+offset) ) otheritems = other.__tokdict.items() otherdictitems = [(k, _ParseResultsWithOffset(v[0],addoffset(v[1])) ) for (k,vlist) in otheritems for v in vlist] for k,v in otherdictitems: self[k] = v if isinstance(v[0],ParseResults): v[0].__parent = wkref(self) self.__toklist += other.__toklist self.__accumNames.update( other.__accumNames ) return self def __radd__(self, other): if isinstance(other,int) and other == 0: return self.copy() def __repr__( self ): return "(%s, %s)" % ( repr( self.__toklist ), repr( self.__tokdict ) ) def __str__( self ): out = "[" sep = "" for i in self.__toklist: if isinstance(i, ParseResults): out += sep + _ustr(i) else: out += sep + repr(i) sep = ", " out += "]" return out def _asStringList( self, sep='' ): out = [] for item in self.__toklist: if out and sep: out.append(sep) if isinstance( item, ParseResults ): out += item._asStringList() else: out.append( _ustr(item) ) return out def asList( self ): """Returns the parse results as a nested list of matching tokens, all converted to strings.""" out = [] for res in self.__toklist: if isinstance(res,ParseResults): out.append( res.asList() ) else: out.append( res ) return out def asDict( self ): """Returns the named parse results as dictionary.""" return dict( self.items() ) def copy( self ): """Returns a new copy of a C{ParseResults} object.""" ret = ParseResults( self.__toklist ) ret.__tokdict = self.__tokdict.copy() ret.__parent = self.__parent ret.__accumNames.update( self.__accumNames ) ret.__name = self.__name return ret def asXML( self, doctag=None, namedItemsOnly=False, indent="", formatted=True ): """Returns the parse results as XML. Tags are created for tokens and lists that have defined results names.""" nl = "\n" out = [] namedItems = dict( [ (v[1],k) for (k,vlist) in self.__tokdict.items() for v in vlist ] ) nextLevelIndent = indent + " " # collapse out indents if formatting is not desired if not formatted: indent = "" nextLevelIndent = "" nl = "" selfTag = None if doctag is not None: selfTag = doctag else: if self.__name: selfTag = self.__name if not selfTag: if namedItemsOnly: return "" else: selfTag = "ITEM" out += [ nl, indent, "<", selfTag, ">" ] worklist = self.__toklist for i,res in enumerate(worklist): if isinstance(res,ParseResults): if i in namedItems: out += [ res.asXML(namedItems[i], namedItemsOnly and doctag is None, nextLevelIndent, formatted)] else: out += [ res.asXML(None, namedItemsOnly and doctag is None, nextLevelIndent, formatted)] else: # individual token, see if there is a name for it resTag = None if i in namedItems: resTag = namedItems[i] if not resTag: if namedItemsOnly: continue else: resTag = "ITEM" xmlBodyText = _xml_escape(_ustr(res)) out += [ nl, nextLevelIndent, "<", resTag, ">", xmlBodyText, "" ] out += [ nl, indent, "" ] return "".join(out) def __lookup(self,sub): for k,vlist in self.__tokdict.items(): for v,loc in vlist: if sub is v: return k return None def getName(self): """Returns the results name for this token expression.""" if self.__name: return self.__name elif self.__parent: par = self.__parent() if par: return par.__lookup(self) else: return None elif (len(self) == 1 and len(self.__tokdict) == 1 and self.__tokdict.values()[0][0][1] in (0,-1)): return self.__tokdict.keys()[0] else: return None def dump(self,indent='',depth=0): """Diagnostic method for listing out the contents of a C{ParseResults}. Accepts an optional C{indent} argument so that this string can be embedded in a nested display of other data.""" out = [] out.append( indent+_ustr(self.asList()) ) keys = self.items() keys.sort() for k,v in keys: if out: out.append('\n') out.append( "%s%s- %s: " % (indent,(' '*depth), k) ) if isinstance(v,ParseResults): if v.keys(): out.append( v.dump(indent,depth+1) ) else: out.append(_ustr(v)) else: out.append(_ustr(v)) return "".join(out) # add support for pickle protocol def __getstate__(self): return ( self.__toklist, ( self.__tokdict.copy(), self.__parent is not None and self.__parent() or None, self.__accumNames, self.__name ) ) def __setstate__(self,state): self.__toklist = state[0] (self.__tokdict, par, inAccumNames, self.__name) = state[1] self.__accumNames = {} self.__accumNames.update(inAccumNames) if par is not None: self.__parent = wkref(par) else: self.__parent = None def __dir__(self): return dir(super(ParseResults,self)) + self.keys() def col (loc,strg): """Returns current column within a string, counting newlines as line separators. The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ return (loc} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ return strg.count("\n",0,loc) + 1 def line( loc, strg ): """Returns the line of text containing loc within a string, counting newlines as line separators. """ lastCR = strg.rfind("\n", 0, loc) nextCR = strg.find("\n", loc) if nextCR >= 0: return strg[lastCR+1:nextCR] else: return strg[lastCR+1:] def _defaultStartDebugAction( instring, loc, expr ): print ("Match " + _ustr(expr) + " at loc " + _ustr(loc) + "(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) def _defaultSuccessDebugAction( instring, startloc, endloc, expr, toks ): print ("Matched " + _ustr(expr) + " -> " + str(toks.asList())) def _defaultExceptionDebugAction( instring, loc, expr, exc ): print ("Exception raised:" + _ustr(exc)) def nullDebugAction(*args): """'Do-nothing' debug action, to suppress debugging output during parsing.""" pass 'decorator to trim function calls to match the arity of the target' if not _PY3K: def _trim_arity(func, maxargs=2): limit = [0] def wrapper(*args): while 1: try: return func(*args[limit[0]:]) except TypeError: if limit[0] <= maxargs: limit[0] += 1 continue raise return wrapper else: def _trim_arity(func, maxargs=2): limit = maxargs def wrapper(*args): #~ nonlocal limit while 1: try: return func(*args[limit:]) except TypeError: if limit: limit -= 1 continue raise return wrapper class ParserElement(object): """Abstract base level parser element class.""" DEFAULT_WHITE_CHARS = " \n\t\r" verbose_stacktrace = False def setDefaultWhitespaceChars( chars ): """Overrides the default whitespace chars """ ParserElement.DEFAULT_WHITE_CHARS = chars setDefaultWhitespaceChars = staticmethod(setDefaultWhitespaceChars) def __init__( self, savelist=False ): self.parseAction = list() self.failAction = None #~ self.name = "" # don't define self.name, let subclasses try/except upcall self.strRepr = None self.resultsName = None self.saveAsList = savelist self.skipWhitespace = True self.whiteChars = ParserElement.DEFAULT_WHITE_CHARS self.copyDefaultWhiteChars = True self.mayReturnEmpty = False # used when checking for left-recursion self.keepTabs = False self.ignoreExprs = list() self.debug = False self.streamlined = False self.mayIndexError = True # used to optimize exception handling for subclasses that don't advance parse index self.errmsg = "" self.modalResults = True # used to mark results names as modal (report only last) or cumulative (list all) self.debugActions = ( None, None, None ) #custom debug actions self.re = None self.callPreparse = True # used to avoid redundant calls to preParse self.callDuringTry = False def copy( self ): """Make a copy of this C{ParserElement}. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.""" cpy = copy.copy( self ) cpy.parseAction = self.parseAction[:] cpy.ignoreExprs = self.ignoreExprs[:] if self.copyDefaultWhiteChars: cpy.whiteChars = ParserElement.DEFAULT_WHITE_CHARS return cpy def setName( self, name ): """Define name for this expression, for use in debugging.""" self.name = name self.errmsg = "Expected " + self.name if hasattr(self,"exception"): self.exception.msg = self.errmsg return self def setResultsName( self, name, listAllMatches=False ): """Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original C{ParserElement} object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. You can also set results names using the abbreviated syntax, C{expr("name")} in place of C{expr.setResultsName("name")} - see L{I{__call__}<__call__>}. """ newself = self.copy() if name.endswith("*"): name = name[:-1] listAllMatches=True newself.resultsName = name newself.modalResults = not listAllMatches return newself def setBreak(self,breakFlag = True): """Method to invoke the Python pdb debugger when this element is about to be parsed. Set C{breakFlag} to True to enable, False to disable. """ if breakFlag: _parseMethod = self._parse def breaker(instring, loc, doActions=True, callPreParse=True): import pdb pdb.set_trace() return _parseMethod( instring, loc, doActions, callPreParse ) breaker._originalParseMethod = _parseMethod self._parse = breaker else: if hasattr(self._parse,"_originalParseMethod"): self._parse = self._parse._originalParseMethod return self def setParseAction( self, *fns, **kwargs ): """Define action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a ParseResults object If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{parseString}} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. """ self.parseAction = list(map(_trim_arity, list(fns))) self.callDuringTry = ("callDuringTry" in kwargs and kwargs["callDuringTry"]) return self def addParseAction( self, *fns, **kwargs ): """Add parse action to expression's list of parse actions. See L{I{setParseAction}}.""" self.parseAction += list(map(_trim_arity, list(fns))) self.callDuringTry = self.callDuringTry or ("callDuringTry" in kwargs and kwargs["callDuringTry"]) return self def setFailAction( self, fn ): """Define action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments C{fn(s,loc,expr,err)} where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown The function returns no value. It may throw C{ParseFatalException} if it is desired to stop parsing immediately.""" self.failAction = fn return self def _skipIgnorables( self, instring, loc ): exprsFound = True while exprsFound: exprsFound = False for e in self.ignoreExprs: try: while 1: loc,dummy = e._parse( instring, loc ) exprsFound = True except ParseException: pass return loc def preParse( self, instring, loc ): if self.ignoreExprs: loc = self._skipIgnorables( instring, loc ) if self.skipWhitespace: wt = self.whiteChars instrlen = len(instring) while loc < instrlen and instring[loc] in wt: loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): return loc, [] def postParse( self, instring, loc, tokenlist ): return tokenlist #~ @profile def _parseNoCache( self, instring, loc, doActions=True, callPreParse=True ): debugging = ( self.debug ) #and doActions ) if debugging or self.failAction: #~ print ("Match",self,"at loc",loc,"(%d,%d)" % ( lineno(loc,instring), col(loc,instring) )) if (self.debugActions[0] ): self.debugActions[0]( instring, loc, self ) if callPreParse and self.callPreparse: preloc = self.preParse( instring, loc ) else: preloc = loc tokensStart = preloc try: try: loc,tokens = self.parseImpl( instring, preloc, doActions ) except IndexError: raise ParseException( instring, len(instring), self.errmsg, self ) except ParseBaseException: #~ print ("Exception raised:", err) err = None if self.debugActions[2]: err = sys.exc_info()[1] self.debugActions[2]( instring, tokensStart, self, err ) if self.failAction: if err is None: err = sys.exc_info()[1] self.failAction( instring, tokensStart, self, err ) raise else: if callPreParse and self.callPreparse: preloc = self.preParse( instring, loc ) else: preloc = loc tokensStart = preloc if self.mayIndexError or loc >= len(instring): try: loc,tokens = self.parseImpl( instring, preloc, doActions ) except IndexError: raise ParseException( instring, len(instring), self.errmsg, self ) else: loc,tokens = self.parseImpl( instring, preloc, doActions ) tokens = self.postParse( instring, loc, tokens ) retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList, modal=self.modalResults ) if self.parseAction and (doActions or self.callDuringTry): if debugging: try: for fn in self.parseAction: tokens = fn( instring, tokensStart, retTokens ) if tokens is not None: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), modal=self.modalResults ) except ParseBaseException: #~ print "Exception raised in user parse action:", err if (self.debugActions[2] ): err = sys.exc_info()[1] self.debugActions[2]( instring, tokensStart, self, err ) raise else: for fn in self.parseAction: tokens = fn( instring, tokensStart, retTokens ) if tokens is not None: retTokens = ParseResults( tokens, self.resultsName, asList=self.saveAsList and isinstance(tokens,(ParseResults,list)), modal=self.modalResults ) if debugging: #~ print ("Matched",self,"->",retTokens.asList()) if (self.debugActions[1] ): self.debugActions[1]( instring, tokensStart, loc, self, retTokens ) return loc, retTokens def tryParse( self, instring, loc ): try: return self._parse( instring, loc, doActions=False )[0] except ParseFatalException: raise ParseException( instring, loc, self.errmsg, self) # this method gets repeatedly called during backtracking with the same arguments - # we can cache these arguments and save ourselves the trouble of re-parsing the contained expression def _parseCache( self, instring, loc, doActions=True, callPreParse=True ): lookup = (self,instring,loc,callPreParse,doActions) if lookup in ParserElement._exprArgCache: value = ParserElement._exprArgCache[ lookup ] if isinstance(value, Exception): raise value return (value[0],value[1].copy()) else: try: value = self._parseNoCache( instring, loc, doActions, callPreParse ) ParserElement._exprArgCache[ lookup ] = (value[0],value[1].copy()) return value except ParseBaseException: pe = sys.exc_info()[1] ParserElement._exprArgCache[ lookup ] = pe raise _parse = _parseNoCache # argument cache for optimizing repeated calls when backtracking through recursive expressions _exprArgCache = {} def resetCache(): ParserElement._exprArgCache.clear() resetCache = staticmethod(resetCache) _packratEnabled = False def enablePackrat(): """Enables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions. This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method C{ParserElement.enablePackrat()}. If your program uses C{psyco} to "compile as you go", you must call C{enablePackrat} before calling C{psyco.full()}. If you do not do this, Python will crash. For best results, call C{enablePackrat()} immediately after importing pyparsing. """ if not ParserElement._packratEnabled: ParserElement._packratEnabled = True ParserElement._parse = ParserElement._parseCache enablePackrat = staticmethod(enablePackrat) def parseString( self, instring, parseAll=False ): """Execute the parse expression with the given string. This is the main interface to the client code, once the complete expression has been built. If you want the grammar to require that the entire input string be successfully parsed, then set C{parseAll} to True (equivalent to ending the grammar with C{StringEnd()}). Note: C{parseString} implicitly calls C{expandtabs()} on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and the grammar uses parse actions that use the C{loc} argument to index into the string being parsed, you can ensure you have a consistent view of the input string by: - calling C{parseWithTabs} on your grammar before calling C{parseString} (see L{I{parseWithTabs}}) - define your parse action using the full C{(s,loc,toks)} signature, and reference the input string using the parse action's C{s} argument - explictly expand the tabs in your input string before calling C{parseString} """ ParserElement.resetCache() if not self.streamlined: self.streamline() #~ self.saveAsList = True for e in self.ignoreExprs: e.streamline() if not self.keepTabs: instring = instring.expandtabs() try: loc, tokens = self._parse( instring, 0 ) if parseAll: loc = self.preParse( instring, loc ) se = Empty() + StringEnd() se._parse( instring, loc ) except ParseBaseException: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace exc = sys.exc_info()[1] raise exc else: return tokens def scanString( self, instring, maxMatches=_MAX_INT, overlap=False ): """Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional C{maxMatches} argument, to clip scanning after 'n' matches are found. If C{overlap} is specified, then overlapping matches will be reported. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing strings with embedded tabs.""" if not self.streamlined: self.streamline() for e in self.ignoreExprs: e.streamline() if not self.keepTabs: instring = _ustr(instring).expandtabs() instrlen = len(instring) loc = 0 preparseFn = self.preParse parseFn = self._parse ParserElement.resetCache() matches = 0 try: while loc <= instrlen and matches < maxMatches: try: preloc = preparseFn( instring, loc ) nextLoc,tokens = parseFn( instring, preloc, callPreParse=False ) except ParseException: loc = preloc+1 else: if nextLoc > loc: matches += 1 yield tokens, preloc, nextLoc if overlap: nextloc = preparseFn( instring, loc ) if nextloc > loc: loc = nextLoc else: loc += 1 else: loc = nextLoc else: loc = preloc+1 except ParseBaseException: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace exc = sys.exc_info()[1] raise exc def transformString( self, instring ): """Extension to C{scanString}, to modify matching text with modified tokens that may be returned from a parse action. To use C{transformString}, define a grammar and attach a parse action to it that modifies the returned token list. Invoking C{transformString()} on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. C{transformString()} returns the resulting transformed string.""" out = [] lastE = 0 # force preservation of s, to minimize unwanted transformation of string, and to # keep string locs straight between transformString and scanString self.keepTabs = True try: for t,s,e in self.scanString( instring ): out.append( instring[lastE:s] ) if t: if isinstance(t,ParseResults): out += t.asList() elif isinstance(t,list): out += t else: out.append(t) lastE = e out.append(instring[lastE:]) out = [o for o in out if o] return "".join(map(_ustr,_flatten(out))) except ParseBaseException: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace exc = sys.exc_info()[1] raise exc def searchString( self, instring, maxMatches=_MAX_INT ): """Another extension to C{scanString}, simplifying the access to the tokens found to match the given parse expression. May be called with optional C{maxMatches} argument, to clip searching after 'n' matches are found. """ try: return ParseResults([ t for t,s,e in self.scanString( instring, maxMatches ) ]) except ParseBaseException: if ParserElement.verbose_stacktrace: raise else: # catch and re-raise exception from here, clears out pyparsing internal stack trace exc = sys.exc_info()[1] raise exc def __add__(self, other ): """Implementation of + operator - returns And""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return And( [ self, other ] ) def __radd__(self, other ): """Implementation of + operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other + self def __sub__(self, other): """Implementation of - operator, returns C{And} with error stop""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return And( [ self, And._ErrorStop(), other ] ) def __rsub__(self, other ): """Implementation of - operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other - self def __mul__(self,other): """Implementation of * operator, allows use of C{expr * 3} in place of C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples may also include C{None} as in: - C{expr*(n,None)} or C{expr*(n,)} is equivalent to C{expr*n + ZeroOrMore(expr)} (read as "at least n instances of C{expr}") - C{expr*(None,n)} is equivalent to C{expr*(0,n)} (read as "0 to n instances of C{expr}") - C{expr*(None,None)} is equivalent to C{ZeroOrMore(expr)} - C{expr*(1,None)} is equivalent to C{OneOrMore(expr)} Note that C{expr*(None,n)} does not raise an exception if more than n exprs exist in the input stream; that is, C{expr*(None,n)} does not enforce a maximum number of expr occurrences. If this behavior is desired, then write C{expr*(None,n) + ~expr} """ if isinstance(other,int): minElements, optElements = other,0 elif isinstance(other,tuple): other = (other + (None, None))[:2] if other[0] is None: other = (0, other[1]) if isinstance(other[0],int) and other[1] is None: if other[0] == 0: return ZeroOrMore(self) if other[0] == 1: return OneOrMore(self) else: return self*other[0] + ZeroOrMore(self) elif isinstance(other[0],int) and isinstance(other[1],int): minElements, optElements = other optElements -= minElements else: raise TypeError("cannot multiply 'ParserElement' and ('%s','%s') objects", type(other[0]),type(other[1])) else: raise TypeError("cannot multiply 'ParserElement' and '%s' objects", type(other)) if minElements < 0: raise ValueError("cannot multiply ParserElement by negative value") if optElements < 0: raise ValueError("second tuple value must be greater or equal to first tuple value") if minElements == optElements == 0: raise ValueError("cannot multiply ParserElement by 0 or (0,0)") if (optElements): def makeOptionalList(n): if n>1: return Optional(self + makeOptionalList(n-1)) else: return Optional(self) if minElements: if minElements == 1: ret = self + makeOptionalList(optElements) else: ret = And([self]*minElements) + makeOptionalList(optElements) else: ret = makeOptionalList(optElements) else: if minElements == 1: ret = self else: ret = And([self]*minElements) return ret def __rmul__(self, other): return self.__mul__(other) def __or__(self, other ): """Implementation of | operator - returns C{MatchFirst}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return MatchFirst( [ self, other ] ) def __ror__(self, other ): """Implementation of | operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other | self def __xor__(self, other ): """Implementation of ^ operator - returns C{Or}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return Or( [ self, other ] ) def __rxor__(self, other ): """Implementation of ^ operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other ^ self def __and__(self, other ): """Implementation of & operator - returns C{Each}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return Each( [ self, other ] ) def __rand__(self, other ): """Implementation of & operator when left operand is not a C{ParserElement}""" if isinstance( other, basestring ): other = Literal( other ) if not isinstance( other, ParserElement ): warnings.warn("Cannot combine element of type %s with ParserElement" % type(other), SyntaxWarning, stacklevel=2) return None return other & self def __invert__( self ): """Implementation of ~ operator - returns C{NotAny}""" return NotAny( self ) def __call__(self, name): """Shortcut for C{setResultsName}, with C{listAllMatches=default}:: userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") could be written as:: userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be passed as C{True}. """ return self.setResultsName(name) def suppress( self ): """Suppresses the output of this C{ParserElement}; useful to keep punctuation from cluttering up returned output. """ return Suppress( self ) def leaveWhitespace( self ): """Disables the skipping of whitespace before matching the characters in the C{ParserElement}'s defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. """ self.skipWhitespace = False return self def setWhitespaceChars( self, chars ): """Overrides the default whitespace chars """ self.skipWhitespace = True self.whiteChars = chars self.copyDefaultWhiteChars = False return self def parseWithTabs( self ): """Overrides default behavior to expand C{}s to spaces before parsing the input string. Must be called before C{parseString} when the input grammar contains elements that match C{} characters.""" self.keepTabs = True return self def ignore( self, other ): """Define expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns. """ if isinstance( other, Suppress ): if other not in self.ignoreExprs: self.ignoreExprs.append( other.copy() ) else: self.ignoreExprs.append( Suppress( other.copy() ) ) return self def setDebugActions( self, startAction, successAction, exceptionAction ): """Enable display of debugging messages while doing pattern matching.""" self.debugActions = (startAction or _defaultStartDebugAction, successAction or _defaultSuccessDebugAction, exceptionAction or _defaultExceptionDebugAction) self.debug = True return self def setDebug( self, flag=True ): """Enable display of debugging messages while doing pattern matching. Set C{flag} to True to enable, False to disable.""" if flag: self.setDebugActions( _defaultStartDebugAction, _defaultSuccessDebugAction, _defaultExceptionDebugAction ) else: self.debug = False return self def __str__( self ): return self.name def __repr__( self ): return _ustr(self) def streamline( self ): self.streamlined = True self.strRepr = None return self def checkRecursion( self, parseElementList ): pass def validate( self, validateTrace=[] ): """Check defined expressions for valid structure, check for infinite recursive definitions.""" self.checkRecursion( [] ) def parseFile( self, file_or_filename, parseAll=False ): """Execute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing. """ try: file_contents = file_or_filename.read() except AttributeError: f = open(file_or_filename, "rb") file_contents = f.read() f.close() try: return self.parseString(file_contents, parseAll) except ParseBaseException: # catch and re-raise exception from here, clears out pyparsing internal stack trace exc = sys.exc_info()[1] raise exc def getException(self): return ParseException("",0,self.errmsg,self) def __getattr__(self,aname): if aname == "myException": self.myException = ret = self.getException(); return ret; else: raise AttributeError("no such attribute " + aname) def __eq__(self,other): if isinstance(other, ParserElement): return self is other or self.__dict__ == other.__dict__ elif isinstance(other, basestring): try: self.parseString(_ustr(other), parseAll=True) return True except ParseBaseException: return False else: return super(ParserElement,self)==other def __ne__(self,other): return not (self == other) def __hash__(self): return hash(id(self)) def __req__(self,other): return self == other def __rne__(self,other): return not (self == other) class Token(ParserElement): """Abstract C{ParserElement} subclass, for defining atomic matching patterns.""" def __init__( self ): super(Token,self).__init__( savelist=False ) def setName(self, name): s = super(Token,self).setName(name) self.errmsg = "Expected " + self.name return s class Empty(Token): """An empty token, will always match.""" def __init__( self ): super(Empty,self).__init__() self.name = "Empty" self.mayReturnEmpty = True self.mayIndexError = False class NoMatch(Token): """A token that will never match.""" def __init__( self ): super(NoMatch,self).__init__() self.name = "NoMatch" self.mayReturnEmpty = True self.mayIndexError = False self.errmsg = "Unmatchable token" def parseImpl( self, instring, loc, doActions=True ): exc = self.myException exc.loc = loc exc.pstr = instring raise exc class Literal(Token): """Token to exactly match a specified string.""" def __init__( self, matchString ): super(Literal,self).__init__() self.match = matchString self.matchLen = len(matchString) try: self.firstMatchChar = matchString[0] except IndexError: warnings.warn("null string passed to Literal; use Empty() instead", SyntaxWarning, stacklevel=2) self.__class__ = Empty self.name = '"%s"' % _ustr(self.match) self.errmsg = "Expected " + self.name self.mayReturnEmpty = False self.mayIndexError = False # Performance tuning: this routine gets called a *lot* # if this is a single character match string and the first character matches, # short-circuit as quickly as possible, and avoid calling startswith #~ @profile def parseImpl( self, instring, loc, doActions=True ): if (instring[loc] == self.firstMatchChar and (self.matchLen==1 or instring.startswith(self.match,loc)) ): return loc+self.matchLen, self.match #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc _L = Literal class Keyword(Token): """Token to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with C{Literal}:: Literal("if") will match the leading C{'if'} in C{'ifAndOnlyIf'}. Keyword("if") will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} Accepts two optional constructor arguments in addition to the keyword string: C{identChars} is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$"; C{caseless} allows case-insensitive matching, default is C{False}. """ DEFAULT_KEYWORD_CHARS = alphanums+"_$" def __init__( self, matchString, identChars=DEFAULT_KEYWORD_CHARS, caseless=False ): super(Keyword,self).__init__() self.match = matchString self.matchLen = len(matchString) try: self.firstMatchChar = matchString[0] except IndexError: warnings.warn("null string passed to Keyword; use Empty() instead", SyntaxWarning, stacklevel=2) self.name = '"%s"' % self.match self.errmsg = "Expected " + self.name self.mayReturnEmpty = False self.mayIndexError = False self.caseless = caseless if caseless: self.caselessmatch = matchString.upper() identChars = identChars.upper() self.identChars = set(identChars) def parseImpl( self, instring, loc, doActions=True ): if self.caseless: if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) and (loc == 0 or instring[loc-1].upper() not in self.identChars) ): return loc+self.matchLen, self.match else: if (instring[loc] == self.firstMatchChar and (self.matchLen==1 or instring.startswith(self.match,loc)) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen] not in self.identChars) and (loc == 0 or instring[loc-1] not in self.identChars) ): return loc+self.matchLen, self.match #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc def copy(self): c = super(Keyword,self).copy() c.identChars = Keyword.DEFAULT_KEYWORD_CHARS return c def setDefaultKeywordChars( chars ): """Overrides the default Keyword chars """ Keyword.DEFAULT_KEYWORD_CHARS = chars setDefaultKeywordChars = staticmethod(setDefaultKeywordChars) class CaselessLiteral(Literal): """Token to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text. """ def __init__( self, matchString ): super(CaselessLiteral,self).__init__( matchString.upper() ) # Preserve the defining literal. self.returnString = matchString self.name = "'%s'" % self.returnString self.errmsg = "Expected " + self.name def parseImpl( self, instring, loc, doActions=True ): if instring[ loc:loc+self.matchLen ].upper() == self.match: return loc+self.matchLen, self.returnString #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc class CaselessKeyword(Keyword): def __init__( self, matchString, identChars=Keyword.DEFAULT_KEYWORD_CHARS ): super(CaselessKeyword,self).__init__( matchString, identChars, caseless=True ) def parseImpl( self, instring, loc, doActions=True ): if ( (instring[ loc:loc+self.matchLen ].upper() == self.caselessmatch) and (loc >= len(instring)-self.matchLen or instring[loc+self.matchLen].upper() not in self.identChars) ): return loc+self.matchLen, self.match #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc class Word(Token): """Token for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. An optional C{exclude} parameter can list characters that might be found in the input C{bodyChars} string; useful to define a word of all printables except for one or two characters, for instance. """ def __init__( self, initChars, bodyChars=None, min=1, max=0, exact=0, asKeyword=False, excludeChars=None ): super(Word,self).__init__() if excludeChars: initChars = ''.join([c for c in initChars if c not in excludeChars]) if bodyChars: bodyChars = ''.join([c for c in bodyChars if c not in excludeChars]) self.initCharsOrig = initChars self.initChars = set(initChars) if bodyChars : self.bodyCharsOrig = bodyChars self.bodyChars = set(bodyChars) else: self.bodyCharsOrig = initChars self.bodyChars = set(initChars) self.maxSpecified = max > 0 if min < 1: raise ValueError("cannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitted") self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False self.asKeyword = asKeyword if ' ' not in self.initCharsOrig+self.bodyCharsOrig and (min==1 and max==0 and exact==0): if self.bodyCharsOrig == self.initCharsOrig: self.reString = "[%s]+" % _escapeRegexRangeChars(self.initCharsOrig) elif len(self.bodyCharsOrig) == 1: self.reString = "%s[%s]*" % \ (re.escape(self.initCharsOrig), _escapeRegexRangeChars(self.bodyCharsOrig),) else: self.reString = "[%s][%s]*" % \ (_escapeRegexRangeChars(self.initCharsOrig), _escapeRegexRangeChars(self.bodyCharsOrig),) if self.asKeyword: self.reString = r"\b"+self.reString+r"\b" try: self.re = re.compile( self.reString ) except: self.re = None def parseImpl( self, instring, loc, doActions=True ): if self.re: result = self.re.match(instring,loc) if not result: exc = self.myException exc.loc = loc exc.pstr = instring raise exc loc = result.end() return loc, result.group() if not(instring[ loc ] in self.initChars): #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc start = loc loc += 1 instrlen = len(instring) bodychars = self.bodyChars maxloc = start + self.maxLen maxloc = min( maxloc, instrlen ) while loc < maxloc and instring[loc] in bodychars: loc += 1 throwException = False if loc - start < self.minLen: throwException = True if self.maxSpecified and loc < instrlen and instring[loc] in bodychars: throwException = True if self.asKeyword: if (start>0 and instring[start-1] in bodychars) or (loc4: return s[:4]+"..." else: return s if ( self.initCharsOrig != self.bodyCharsOrig ): self.strRepr = "W:(%s,%s)" % ( charsAsStr(self.initCharsOrig), charsAsStr(self.bodyCharsOrig) ) else: self.strRepr = "W:(%s)" % charsAsStr(self.initCharsOrig) return self.strRepr class Regex(Token): """Token for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. """ compiledREtype = type(re.compile("[A-Z]")) def __init__( self, pattern, flags=0): """The parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.""" super(Regex,self).__init__() if isinstance(pattern, basestring): if len(pattern) == 0: warnings.warn("null string passed to Regex; use Empty() instead", SyntaxWarning, stacklevel=2) self.pattern = pattern self.flags = flags try: self.re = re.compile(self.pattern, self.flags) self.reString = self.pattern except sre_constants.error: warnings.warn("invalid pattern (%s) passed to Regex" % pattern, SyntaxWarning, stacklevel=2) raise elif isinstance(pattern, Regex.compiledREtype): self.re = pattern self.pattern = \ self.reString = str(pattern) self.flags = flags else: raise ValueError("Regex may only be constructed with a string or a compiled RE object") self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): result = self.re.match(instring,loc) if not result: exc = self.myException exc.loc = loc exc.pstr = instring raise exc loc = result.end() d = result.groupdict() ret = ParseResults(result.group()) if d: for k in d: ret[k] = d[k] return loc,ret def __str__( self ): try: return super(Regex,self).__str__() except: pass if self.strRepr is None: self.strRepr = "Re:(%s)" % repr(self.pattern) return self.strRepr class QuotedString(Token): """Token for matching strings that are delimited by quoting characters. """ def __init__( self, quoteChar, escChar=None, escQuote=None, multiline=False, unquoteResults=True, endQuoteChar=None): """ Defined with the following parameters: - quoteChar - string of one or more characters defining the quote delimiting string - escChar - character to escape quotes, typically backslash (default=None) - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None) - multiline - boolean indicating whether quotes can span multiple lines (default=False) - unquoteResults - boolean indicating whether the matched text should be unquoted (default=True) - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=None => same as quoteChar) """ super(QuotedString,self).__init__() # remove white space from quote chars - wont work anyway quoteChar = quoteChar.strip() if len(quoteChar) == 0: warnings.warn("quoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() if endQuoteChar is None: endQuoteChar = quoteChar else: endQuoteChar = endQuoteChar.strip() if len(endQuoteChar) == 0: warnings.warn("endQuoteChar cannot be the empty string",SyntaxWarning,stacklevel=2) raise SyntaxError() self.quoteChar = quoteChar self.quoteCharLen = len(quoteChar) self.firstQuoteChar = quoteChar[0] self.endQuoteChar = endQuoteChar self.endQuoteCharLen = len(endQuoteChar) self.escChar = escChar self.escQuote = escQuote self.unquoteResults = unquoteResults if multiline: self.flags = re.MULTILINE | re.DOTALL self.pattern = r'%s(?:[^%s%s]' % \ ( re.escape(self.quoteChar), _escapeRegexRangeChars(self.endQuoteChar[0]), (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) else: self.flags = 0 self.pattern = r'%s(?:[^%s\n\r%s]' % \ ( re.escape(self.quoteChar), _escapeRegexRangeChars(self.endQuoteChar[0]), (escChar is not None and _escapeRegexRangeChars(escChar) or '') ) if len(self.endQuoteChar) > 1: self.pattern += ( '|(?:' + ')|(?:'.join(["%s[^%s]" % (re.escape(self.endQuoteChar[:i]), _escapeRegexRangeChars(self.endQuoteChar[i])) for i in range(len(self.endQuoteChar)-1,0,-1)]) + ')' ) if escQuote: self.pattern += (r'|(?:%s)' % re.escape(escQuote)) if escChar: self.pattern += (r'|(?:%s.)' % re.escape(escChar)) charset = ''.join(set(self.quoteChar[0]+self.endQuoteChar[0])).replace('^',r'\^').replace('-',r'\-') self.escCharReplacePattern = re.escape(self.escChar)+("([%s])" % charset) self.pattern += (r')*%s' % re.escape(self.endQuoteChar)) try: self.re = re.compile(self.pattern, self.flags) self.reString = self.pattern except sre_constants.error: warnings.warn("invalid pattern (%s) passed to Regex" % self.pattern, SyntaxWarning, stacklevel=2) raise self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayIndexError = False self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): result = instring[loc] == self.firstQuoteChar and self.re.match(instring,loc) or None if not result: exc = self.myException exc.loc = loc exc.pstr = instring raise exc loc = result.end() ret = result.group() if self.unquoteResults: # strip off quotes ret = ret[self.quoteCharLen:-self.endQuoteCharLen] if isinstance(ret,basestring): # replace escaped characters if self.escChar: ret = re.sub(self.escCharReplacePattern,"\g<1>",ret) # replace escaped quotes if self.escQuote: ret = ret.replace(self.escQuote, self.endQuoteChar) return loc, ret def __str__( self ): try: return super(QuotedString,self).__str__() except: pass if self.strRepr is None: self.strRepr = "quoted string, starting with %s ending with %s" % (self.quoteChar, self.endQuoteChar) return self.strRepr class CharsNotIn(Token): """Token for matching words composed of characters *not* in a given set. Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. """ def __init__( self, notChars, min=1, max=0, exact=0 ): super(CharsNotIn,self).__init__() self.skipWhitespace = False self.notChars = notChars if min < 1: raise ValueError("cannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permitted") self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact self.name = _ustr(self) self.errmsg = "Expected " + self.name self.mayReturnEmpty = ( self.minLen == 0 ) self.mayIndexError = False def parseImpl( self, instring, loc, doActions=True ): if instring[loc] in self.notChars: #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc start = loc loc += 1 notchars = self.notChars maxlen = min( start+self.maxLen, len(instring) ) while loc < maxlen and \ (instring[loc] not in notchars): loc += 1 if loc - start < self.minLen: #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, instring[start:loc] def __str__( self ): try: return super(CharsNotIn, self).__str__() except: pass if self.strRepr is None: if len(self.notChars) > 4: self.strRepr = "!W:(%s...)" % self.notChars[:4] else: self.strRepr = "!W:(%s)" % self.notChars return self.strRepr class White(Token): """Special matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is C{" \\t\\r\\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, as defined for the C{Word} class.""" whiteStrs = { " " : "", "\t": "", "\n": "", "\r": "", "\f": "", } def __init__(self, ws=" \t\r\n", min=1, max=0, exact=0): super(White,self).__init__() self.matchWhite = ws self.setWhitespaceChars( "".join([c for c in self.whiteChars if c not in self.matchWhite]) ) #~ self.leaveWhitespace() self.name = ("".join([White.whiteStrs[c] for c in self.matchWhite])) self.mayReturnEmpty = True self.errmsg = "Expected " + self.name self.minLen = min if max > 0: self.maxLen = max else: self.maxLen = _MAX_INT if exact > 0: self.maxLen = exact self.minLen = exact def parseImpl( self, instring, loc, doActions=True ): if not(instring[ loc ] in self.matchWhite): #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc start = loc loc += 1 maxloc = start + self.maxLen maxloc = min( maxloc, len(instring) ) while loc < maxloc and instring[loc] in self.matchWhite: loc += 1 if loc - start < self.minLen: #~ raise ParseException( instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, instring[start:loc] class _PositionToken(Token): def __init__( self ): super(_PositionToken,self).__init__() self.name=self.__class__.__name__ self.mayReturnEmpty = True self.mayIndexError = False class GoToColumn(_PositionToken): """Token to advance to a specific column of input text; useful for tabular report scraping.""" def __init__( self, colno ): super(GoToColumn,self).__init__() self.col = colno def preParse( self, instring, loc ): if col(loc,instring) != self.col: instrlen = len(instring) if self.ignoreExprs: loc = self._skipIgnorables( instring, loc ) while loc < instrlen and instring[loc].isspace() and col( loc, instring ) != self.col : loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): thiscol = col( loc, instring ) if thiscol > self.col: raise ParseException( instring, loc, "Text not in expected column", self ) newloc = loc + self.col - thiscol ret = instring[ loc: newloc ] return newloc, ret class LineStart(_PositionToken): """Matches if current position is at the beginning of a line within the parse string""" def __init__( self ): super(LineStart,self).__init__() self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) self.errmsg = "Expected start of line" def preParse( self, instring, loc ): preloc = super(LineStart,self).preParse(instring,loc) if instring[preloc] == "\n": loc += 1 return loc def parseImpl( self, instring, loc, doActions=True ): if not( loc==0 or (loc == self.preParse( instring, 0 )) or (instring[loc-1] == "\n") ): #col(loc, instring) != 1: #~ raise ParseException( instring, loc, "Expected start of line" ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, [] class LineEnd(_PositionToken): """Matches if current position is at the end of a line within the parse string""" def __init__( self ): super(LineEnd,self).__init__() self.setWhitespaceChars( ParserElement.DEFAULT_WHITE_CHARS.replace("\n","") ) self.errmsg = "Expected end of line" def parseImpl( self, instring, loc, doActions=True ): if loc len(instring): return loc, [] else: exc = self.myException exc.loc = loc exc.pstr = instring raise exc class WordStart(_PositionToken): """Matches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{\b} behavior of regular expressions, use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of the string being parsed, or at the beginning of a line. """ def __init__(self, wordChars = printables): super(WordStart,self).__init__() self.wordChars = set(wordChars) self.errmsg = "Not at the start of a word" def parseImpl(self, instring, loc, doActions=True ): if loc != 0: if (instring[loc-1] in self.wordChars or instring[loc] not in self.wordChars): exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, [] class WordEnd(_PositionToken): """Matches if the current position is at the end of a Word, and is not followed by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{\b} behavior of regular expressions, use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of the string being parsed, or at the end of a line. """ def __init__(self, wordChars = printables): super(WordEnd,self).__init__() self.wordChars = set(wordChars) self.skipWhitespace = False self.errmsg = "Not at the end of a word" def parseImpl(self, instring, loc, doActions=True ): instrlen = len(instring) if instrlen>0 and loc maxExcLoc: maxException = err maxExcLoc = err.loc except IndexError: if len(instring) > maxExcLoc: maxException = ParseException(instring,len(instring),e.errmsg,self) maxExcLoc = len(instring) else: if loc2 > maxMatchLoc: maxMatchLoc = loc2 maxMatchExp = e if maxMatchLoc < 0: if maxException is not None: raise maxException else: raise ParseException(instring, loc, "no defined alternatives to match", self) return maxMatchExp._parse( instring, loc, doActions ) def __ixor__(self, other ): if isinstance( other, basestring ): other = Literal( other ) return self.append( other ) #Or( [ self, other ] ) def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " ^ ".join( [ _ustr(e) for e in self.exprs ] ) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class MatchFirst(ParseExpression): """Requires that at least one C{ParseExpression} is found. If two expressions match, the first one listed is the one that will match. May be constructed using the C{'|'} operator. """ def __init__( self, exprs, savelist = False ): super(MatchFirst,self).__init__(exprs, savelist) if exprs: self.mayReturnEmpty = False for e in self.exprs: if e.mayReturnEmpty: self.mayReturnEmpty = True break else: self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): maxExcLoc = -1 maxException = None for e in self.exprs: try: ret = e._parse( instring, loc, doActions ) return ret except ParseException, err: if err.loc > maxExcLoc: maxException = err maxExcLoc = err.loc except IndexError: if len(instring) > maxExcLoc: maxException = ParseException(instring,len(instring),e.errmsg,self) maxExcLoc = len(instring) # only got here if no expression matched, raise exception for match that made it the furthest else: if maxException is not None: raise maxException else: raise ParseException(instring, loc, "no defined alternatives to match", self) def __ior__(self, other ): if isinstance( other, basestring ): other = Literal( other ) return self.append( other ) #MatchFirst( [ self, other ] ) def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " | ".join( [ _ustr(e) for e in self.exprs ] ) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class Each(ParseExpression): """Requires all given C{ParseExpression}s to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the C{'&'} operator. """ def __init__( self, exprs, savelist = True ): super(Each,self).__init__(exprs, savelist) self.mayReturnEmpty = True for e in self.exprs: if not e.mayReturnEmpty: self.mayReturnEmpty = False break self.skipWhitespace = True self.initExprGroups = True def parseImpl( self, instring, loc, doActions=True ): if self.initExprGroups: opt1 = [ e.expr for e in self.exprs if isinstance(e,Optional) ] opt2 = [ e for e in self.exprs if e.mayReturnEmpty and e not in opt1 ] self.optionals = opt1 + opt2 self.multioptionals = [ e.expr for e in self.exprs if isinstance(e,ZeroOrMore) ] self.multirequired = [ e.expr for e in self.exprs if isinstance(e,OneOrMore) ] self.required = [ e for e in self.exprs if not isinstance(e,(Optional,ZeroOrMore,OneOrMore)) ] self.required += self.multirequired self.initExprGroups = False tmpLoc = loc tmpReqd = self.required[:] tmpOpt = self.optionals[:] matchOrder = [] keepMatching = True while keepMatching: tmpExprs = tmpReqd + tmpOpt + self.multioptionals + self.multirequired failed = [] for e in tmpExprs: try: tmpLoc = e.tryParse( instring, tmpLoc ) except ParseException: failed.append(e) else: matchOrder.append(e) if e in tmpReqd: tmpReqd.remove(e) elif e in tmpOpt: tmpOpt.remove(e) if len(failed) == len(tmpExprs): keepMatching = False if tmpReqd: missing = ", ".join( [ _ustr(e) for e in tmpReqd ] ) raise ParseException(instring,loc,"Missing one or more required elements (%s)" % missing ) # add any unmatched Optionals, in case they have default values defined matchOrder += [e for e in self.exprs if isinstance(e,Optional) and e.expr in tmpOpt] resultlist = [] for e in matchOrder: loc,results = e._parse(instring,loc,doActions) resultlist.append(results) finalResults = ParseResults([]) for r in resultlist: dups = {} for k in r.keys(): if k in finalResults.keys(): tmp = ParseResults(finalResults[k]) tmp += ParseResults(r[k]) dups[k] = tmp finalResults += ParseResults(r) for k,v in dups.items(): finalResults[k] = v return loc, finalResults def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + " & ".join( [ _ustr(e) for e in self.exprs ] ) + "}" return self.strRepr def checkRecursion( self, parseElementList ): subRecCheckList = parseElementList[:] + [ self ] for e in self.exprs: e.checkRecursion( subRecCheckList ) class ParseElementEnhance(ParserElement): """Abstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.""" def __init__( self, expr, savelist=False ): super(ParseElementEnhance,self).__init__(savelist) if isinstance( expr, basestring ): expr = Literal(expr) self.expr = expr self.strRepr = None if expr is not None: self.mayIndexError = expr.mayIndexError self.mayReturnEmpty = expr.mayReturnEmpty self.setWhitespaceChars( expr.whiteChars ) self.skipWhitespace = expr.skipWhitespace self.saveAsList = expr.saveAsList self.callPreparse = expr.callPreparse self.ignoreExprs.extend(expr.ignoreExprs) def parseImpl( self, instring, loc, doActions=True ): if self.expr is not None: return self.expr._parse( instring, loc, doActions, callPreParse=False ) else: raise ParseException("",loc,self.errmsg,self) def leaveWhitespace( self ): self.skipWhitespace = False self.expr = self.expr.copy() if self.expr is not None: self.expr.leaveWhitespace() return self def ignore( self, other ): if isinstance( other, Suppress ): if other not in self.ignoreExprs: super( ParseElementEnhance, self).ignore( other ) if self.expr is not None: self.expr.ignore( self.ignoreExprs[-1] ) else: super( ParseElementEnhance, self).ignore( other ) if self.expr is not None: self.expr.ignore( self.ignoreExprs[-1] ) return self def streamline( self ): super(ParseElementEnhance,self).streamline() if self.expr is not None: self.expr.streamline() return self def checkRecursion( self, parseElementList ): if self in parseElementList: raise RecursiveGrammarException( parseElementList+[self] ) subRecCheckList = parseElementList[:] + [ self ] if self.expr is not None: self.expr.checkRecursion( subRecCheckList ) def validate( self, validateTrace=[] ): tmp = validateTrace[:]+[self] if self.expr is not None: self.expr.validate(tmp) self.checkRecursion( [] ) def __str__( self ): try: return super(ParseElementEnhance,self).__str__() except: pass if self.strRepr is None and self.expr is not None: self.strRepr = "%s:(%s)" % ( self.__class__.__name__, _ustr(self.expr) ) return self.strRepr class FollowedBy(ParseElementEnhance): """Lookahead matching of the given parse expression. C{FollowedBy} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. C{FollowedBy} always returns a null token list.""" def __init__( self, expr ): super(FollowedBy,self).__init__(expr) self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): self.expr.tryParse( instring, loc ) return loc, [] class NotAny(ParseElementEnhance): """Lookahead to disallow matching with the given parse expression. C{NotAny} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression does *not* match at the current position. Also, C{NotAny} does *not* skip over leading whitespace. C{NotAny} always returns a null token list. May be constructed using the '~' operator.""" def __init__( self, expr ): super(NotAny,self).__init__(expr) #~ self.leaveWhitespace() self.skipWhitespace = False # do NOT use self.leaveWhitespace(), don't want to propagate to exprs self.mayReturnEmpty = True self.errmsg = "Found unwanted token, "+_ustr(self.expr) def parseImpl( self, instring, loc, doActions=True ): try: self.expr.tryParse( instring, loc ) except (ParseException,IndexError): pass else: #~ raise ParseException(instring, loc, self.errmsg ) exc = self.myException exc.loc = loc exc.pstr = instring raise exc return loc, [] def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "~{" + _ustr(self.expr) + "}" return self.strRepr class ZeroOrMore(ParseElementEnhance): """Optional repetition of zero or more of the given expression.""" def __init__( self, expr ): super(ZeroOrMore,self).__init__(expr) self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): tokens = [] try: loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) while 1: if hasIgnoreExprs: preloc = self._skipIgnorables( instring, loc ) else: preloc = loc loc, tmptokens = self.expr._parse( instring, preloc, doActions ) if tmptokens or tmptokens.keys(): tokens += tmptokens except (ParseException,IndexError): pass return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "[" + _ustr(self.expr) + "]..." return self.strRepr def setResultsName( self, name, listAllMatches=False ): ret = super(ZeroOrMore,self).setResultsName(name,listAllMatches) ret.saveAsList = True return ret class OneOrMore(ParseElementEnhance): """Repetition of one or more of the given expression.""" def parseImpl( self, instring, loc, doActions=True ): # must be at least one loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) try: hasIgnoreExprs = ( len(self.ignoreExprs) > 0 ) while 1: if hasIgnoreExprs: preloc = self._skipIgnorables( instring, loc ) else: preloc = loc loc, tmptokens = self.expr._parse( instring, preloc, doActions ) if tmptokens or tmptokens.keys(): tokens += tmptokens except (ParseException,IndexError): pass return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "{" + _ustr(self.expr) + "}..." return self.strRepr def setResultsName( self, name, listAllMatches=False ): ret = super(OneOrMore,self).setResultsName(name,listAllMatches) ret.saveAsList = True return ret class _NullToken(object): def __bool__(self): return False __nonzero__ = __bool__ def __str__(self): return "" _optionalNotMatched = _NullToken() class Optional(ParseElementEnhance): """Optional matching of the given expression. A default return string can also be specified, if the optional expression is not found. """ def __init__( self, exprs, default=_optionalNotMatched ): super(Optional,self).__init__( exprs, savelist=False ) self.defaultValue = default self.mayReturnEmpty = True def parseImpl( self, instring, loc, doActions=True ): try: loc, tokens = self.expr._parse( instring, loc, doActions, callPreParse=False ) except (ParseException,IndexError): if self.defaultValue is not _optionalNotMatched: if self.expr.resultsName: tokens = ParseResults([ self.defaultValue ]) tokens[self.expr.resultsName] = self.defaultValue else: tokens = [ self.defaultValue ] else: tokens = [] return loc, tokens def __str__( self ): if hasattr(self,"name"): return self.name if self.strRepr is None: self.strRepr = "[" + _ustr(self.expr) + "]" return self.strRepr class SkipTo(ParseElementEnhance): """Token for skipping over all undefined text until the matched expression is found. If C{include} is set to true, the matched expression is also parsed (the skipped text and matched expression are returned as a 2-element list). The C{ignore} argument is used to define grammars (typically quoted strings and comments) that might contain false matches. """ def __init__( self, other, include=False, ignore=None, failOn=None ): super( SkipTo, self ).__init__( other ) self.ignoreExpr = ignore self.mayReturnEmpty = True self.mayIndexError = False self.includeMatch = include self.asList = False if failOn is not None and isinstance(failOn, basestring): self.failOn = Literal(failOn) else: self.failOn = failOn self.errmsg = "No match found for "+_ustr(self.expr) def parseImpl( self, instring, loc, doActions=True ): startLoc = loc instrlen = len(instring) expr = self.expr failParse = False while loc <= instrlen: try: if self.failOn: try: self.failOn.tryParse(instring, loc) except ParseBaseException: pass else: failParse = True raise ParseException(instring, loc, "Found expression " + str(self.failOn)) failParse = False if self.ignoreExpr is not None: while 1: try: loc = self.ignoreExpr.tryParse(instring,loc) # print "found ignoreExpr, advance to", loc except ParseBaseException: break expr._parse( instring, loc, doActions=False, callPreParse=False ) skipText = instring[startLoc:loc] if self.includeMatch: loc,mat = expr._parse(instring,loc,doActions,callPreParse=False) if mat: skipRes = ParseResults( skipText ) skipRes += mat return loc, [ skipRes ] else: return loc, [ skipText ] else: return loc, [ skipText ] except (ParseException,IndexError): if failParse: raise else: loc += 1 exc = self.myException exc.loc = loc exc.pstr = instring raise exc class Forward(ParseElementEnhance): """Forward declaration of an expression to be defined later - used for recursive grammars, such as algebraic infix notation. When the expression is known, it is assigned to the C{Forward} variable using the '<<' operator. Note: take care when assigning to C{Forward} not to overlook precedence of operators. Specifically, '|' has a lower precedence than '<<', so that:: fwdExpr << a | b | c will actually be evaluated as:: (fwdExpr << a) | b | c thereby leaving b and c out as parseable alternatives. It is recommended that you explicitly group the values inserted into the C{Forward}:: fwdExpr << (a | b | c) """ def __init__( self, other=None ): super(Forward,self).__init__( other, savelist=False ) def __lshift__( self, other ): if isinstance( other, basestring ): other = Literal(other) self.expr = other self.mayReturnEmpty = other.mayReturnEmpty self.strRepr = None self.mayIndexError = self.expr.mayIndexError self.mayReturnEmpty = self.expr.mayReturnEmpty self.setWhitespaceChars( self.expr.whiteChars ) self.skipWhitespace = self.expr.skipWhitespace self.saveAsList = self.expr.saveAsList self.ignoreExprs.extend(self.expr.ignoreExprs) return None def leaveWhitespace( self ): self.skipWhitespace = False return self def streamline( self ): if not self.streamlined: self.streamlined = True if self.expr is not None: self.expr.streamline() return self def validate( self, validateTrace=[] ): if self not in validateTrace: tmp = validateTrace[:]+[self] if self.expr is not None: self.expr.validate(tmp) self.checkRecursion([]) def __str__( self ): if hasattr(self,"name"): return self.name self._revertClass = self.__class__ self.__class__ = _ForwardNoRecurse try: if self.expr is not None: retString = _ustr(self.expr) else: retString = "None" finally: self.__class__ = self._revertClass return self.__class__.__name__ + ": " + retString def copy(self): if self.expr is not None: return super(Forward,self).copy() else: ret = Forward() ret << self return ret class _ForwardNoRecurse(Forward): def __str__( self ): return "..." class TokenConverter(ParseElementEnhance): """Abstract subclass of C{ParseExpression}, for converting parsed results.""" def __init__( self, expr, savelist=False ): super(TokenConverter,self).__init__( expr )#, savelist ) self.saveAsList = False class Upcase(TokenConverter): """Converter to upper case all matching tokens.""" def __init__(self, *args): super(Upcase,self).__init__(*args) warnings.warn("Upcase class is deprecated, use upcaseTokens parse action instead", DeprecationWarning,stacklevel=2) def postParse( self, instring, loc, tokenlist ): return list(map( string.upper, tokenlist )) class Combine(TokenConverter): """Converter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; this can be disabled by specifying C{'adjacent=False'} in the constructor. """ def __init__( self, expr, joinString="", adjacent=True ): super(Combine,self).__init__( expr ) # suppress whitespace-stripping in contained parse expressions, but re-enable it on the Combine itself if adjacent: self.leaveWhitespace() self.adjacent = adjacent self.skipWhitespace = True self.joinString = joinString self.callPreparse = True def ignore( self, other ): if self.adjacent: ParserElement.ignore(self, other) else: super( Combine, self).ignore( other ) return self def postParse( self, instring, loc, tokenlist ): retToks = tokenlist.copy() del retToks[:] retToks += ParseResults([ "".join(tokenlist._asStringList(self.joinString)) ], modal=self.modalResults) if self.resultsName and len(retToks.keys())>0: return [ retToks ] else: return retToks class Group(TokenConverter): """Converter to return the matched tokens as a list - useful for returning tokens of C{ZeroOrMore} and C{OneOrMore} expressions.""" def __init__( self, expr ): super(Group,self).__init__( expr ) self.saveAsList = True def postParse( self, instring, loc, tokenlist ): return [ tokenlist ] class Dict(TokenConverter): """Converter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key. """ def __init__( self, exprs ): super(Dict,self).__init__( exprs ) self.saveAsList = True def postParse( self, instring, loc, tokenlist ): for i,tok in enumerate(tokenlist): if len(tok) == 0: continue ikey = tok[0] if isinstance(ikey,int): ikey = _ustr(tok[0]).strip() if len(tok)==1: tokenlist[ikey] = _ParseResultsWithOffset("",i) elif len(tok)==2 and not isinstance(tok[1],ParseResults): tokenlist[ikey] = _ParseResultsWithOffset(tok[1],i) else: dictvalue = tok.copy() #ParseResults(i) del dictvalue[0] if len(dictvalue)!= 1 or (isinstance(dictvalue,ParseResults) and dictvalue.keys()): tokenlist[ikey] = _ParseResultsWithOffset(dictvalue,i) else: tokenlist[ikey] = _ParseResultsWithOffset(dictvalue[0],i) if self.resultsName: return [ tokenlist ] else: return tokenlist class Suppress(TokenConverter): """Converter for ignoring the results of a parsed expression.""" def postParse( self, instring, loc, tokenlist ): return [] def suppress( self ): return self class OnlyOnce(object): """Wrapper for parse actions, to ensure they are only called once.""" def __init__(self, methodCall): self.callable = _trim_arity(methodCall) self.called = False def __call__(self,s,l,t): if not self.called: results = self.callable(s,l,t) self.called = True return results raise ParseException(s,l,"") def reset(self): self.called = False def traceParseAction(f): """Decorator for debugging parse actions.""" f = _trim_arity(f) def z(*paArgs): thisFunc = f.func_name s,l,t = paArgs[-3:] if len(paArgs)>3: thisFunc = paArgs[0].__class__.__name__ + '.' + thisFunc sys.stderr.write( ">>entering %s(line: '%s', %d, %s)\n" % (thisFunc,line(l,s),l,t) ) try: ret = f(*paArgs) except Exception: exc = sys.exc_info()[1] sys.stderr.write( "<", "|".join( [ _escapeRegexChars(sym) for sym in symbols] )) try: if len(symbols)==len("".join(symbols)): return Regex( "[%s]" % "".join( [ _escapeRegexRangeChars(sym) for sym in symbols] ) ) else: return Regex( "|".join( [ re.escape(sym) for sym in symbols] ) ) except: warnings.warn("Exception creating Regex for oneOf, building MatchFirst", SyntaxWarning, stacklevel=2) # last resort, just use MatchFirst return MatchFirst( [ parseElementClass(sym) for sym in symbols ] ) def dictOf( key, value ): """Helper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the C{Dict}, C{ZeroOrMore}, and C{Group} tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the C{Dict} results can include named token fields. """ return Dict( ZeroOrMore( Group ( key + value ) ) ) def originalTextFor(expr, asString=True): """Helper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. Simpler to use than the parse action C{L{keepOriginalText}}, and does not require the inspect module to chase up the call stack. By default, returns a string containing the original parsed text. If the optional C{asString} argument is passed as C{False}, then the return value is a C{ParseResults} containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to C{L{originalTextFor}} contains expressions with defined results names, you must set C{asString} to C{False} if you want to preserve those results name values.""" locMarker = Empty().setParseAction(lambda s,loc,t: loc) endlocMarker = locMarker.copy() endlocMarker.callPreparse = False matchExpr = locMarker("_original_start") + expr + endlocMarker("_original_end") if asString: extractText = lambda s,l,t: s[t._original_start:t._original_end] else: def extractText(s,l,t): del t[:] t.insert(0, s[t._original_start:t._original_end]) del t["_original_start"] del t["_original_end"] matchExpr.setParseAction(extractText) return matchExpr def ungroup(expr): """Helper to undo pyparsing's default grouping of And expressions, even if all but one are non-empty.""" return TokenConverter(expr).setParseAction(lambda t:t[0]) # convenience constants for positional expressions empty = Empty().setName("empty") lineStart = LineStart().setName("lineStart") lineEnd = LineEnd().setName("lineEnd") stringStart = StringStart().setName("stringStart") stringEnd = StringEnd().setName("stringEnd") _escapedPunc = Word( _bslash, r"\[]-*.$+^?()~ ", exact=2 ).setParseAction(lambda s,l,t:t[0][1]) _printables_less_backslash = "".join([ c for c in printables if c not in r"\]" ]) _escapedHexChar = Regex(r"\\0?[xX][0-9a-fA-F]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],16))) _escapedOctChar = Regex(r"\\0[0-7]+").setParseAction(lambda s,l,t:unichr(int(t[0][1:],8))) _singleChar = _escapedPunc | _escapedHexChar | _escapedOctChar | Word(_printables_less_backslash,exact=1) _charRange = Group(_singleChar + Suppress("-") + _singleChar) _reBracketExpr = Literal("[") + Optional("^").setResultsName("negate") + Group( OneOrMore( _charRange | _singleChar ) ).setResultsName("body") + "]" _expanded = lambda p: (isinstance(p,ParseResults) and ''.join([ unichr(c) for c in range(ord(p[0]),ord(p[1])+1) ]) or p) def srange(s): r"""Helper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:: srange("[0-9]") -> "0123456789" srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be:: a single character an escaped character with a leading backslash (such as \- or \]) an escaped hex character with a leading '\x' (\x21, which is a '!' character) (\0x## is also supported for backwards compatibility) an escaped octal character with a leading '\0' (\041, which is a '!' character) a range of any of the above, separated by a dash ('a-z', etc.) any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.) """ try: return "".join([_expanded(part) for part in _reBracketExpr.parseString(s).body]) except: return "" def matchOnlyAtCol(n): """Helper method for defining parse actions that require matching at a specific column in the input text. """ def verifyCol(strg,locn,toks): if col(locn,strg) != n: raise ParseException(strg,locn,"matched token not at column %d" % n) return verifyCol def replaceWith(replStr): """Helper method for common parse actions that simply return a literal value. Especially useful when used with C{transformString()}. """ def _replFunc(*args): return [replStr] return _replFunc def removeQuotes(s,l,t): """Helper parse action for removing quotation marks from parsed quoted strings. To use, add this parse action to quoted string using:: quotedString.setParseAction( removeQuotes ) """ return t[0][1:-1] def upcaseTokens(s,l,t): """Helper parse action to convert tokens to upper case.""" return [ tt.upper() for tt in map(_ustr,t) ] def downcaseTokens(s,l,t): """Helper parse action to convert tokens to lower case.""" return [ tt.lower() for tt in map(_ustr,t) ] def keepOriginalText(s,startLoc,t): """DEPRECATED - use new helper method C{originalTextFor}. Helper parse action to preserve original parsed text, overriding any nested parse actions.""" try: endloc = getTokensEndLoc() except ParseException: raise ParseFatalException("incorrect usage of keepOriginalText - may only be called as a parse action") del t[:] t += ParseResults(s[startLoc:endloc]) return t def getTokensEndLoc(): """Method to be called from within a parse action to determine the end location of the parsed tokens.""" import inspect fstack = inspect.stack() try: # search up the stack (through intervening argument normalizers) for correct calling routine for f in fstack[2:]: if f[3] == "_parseNoCache": endloc = f[0].f_locals["loc"] return endloc else: raise ParseFatalException("incorrect usage of getTokensEndLoc - may only be called from within a parse action") finally: del fstack def _makeTags(tagStr, xml): """Internal helper to construct opening and closing tag expressions, given a tag name""" if isinstance(tagStr,basestring): resname = tagStr tagStr = Keyword(tagStr, caseless=not xml) else: resname = tagStr.name tagAttrName = Word(alphas,alphanums+"_-:") if (xml): tagAttrValue = dblQuotedString.copy().setParseAction( removeQuotes ) openTag = Suppress("<") + tagStr("tag") + \ Dict(ZeroOrMore(Group( tagAttrName + Suppress("=") + tagAttrValue ))) + \ Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") else: printablesLessRAbrack = "".join( [ c for c in printables if c not in ">" ] ) tagAttrValue = quotedString.copy().setParseAction( removeQuotes ) | Word(printablesLessRAbrack) openTag = Suppress("<") + tagStr("tag") + \ Dict(ZeroOrMore(Group( tagAttrName.setParseAction(downcaseTokens) + \ Optional( Suppress("=") + tagAttrValue ) ))) + \ Optional("/",default=[False]).setResultsName("empty").setParseAction(lambda s,l,t:t[0]=='/') + Suppress(">") closeTag = Combine(_L("") openTag = openTag.setResultsName("start"+"".join(resname.replace(":"," ").title().split())).setName("<%s>" % tagStr) closeTag = closeTag.setResultsName("end"+"".join(resname.replace(":"," ").title().split())).setName("" % tagStr) openTag.tag = resname closeTag.tag = resname return openTag, closeTag def makeHTMLTags(tagStr): """Helper to construct opening and closing tag expressions for HTML, given a tag name""" return _makeTags( tagStr, False ) def makeXMLTags(tagStr): """Helper to construct opening and closing tag expressions for XML, given a tag name""" return _makeTags( tagStr, True ) def withAttribute(*args,**attrDict): """Helper to create a validating parse action to be used with start tags created with C{makeXMLTags} or C{makeHTMLTags}. Use C{withAttribute} to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as C{s s tleftR\trightR^tcenterRttopRtmiddleRtbottomRsg s
} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. """ if args: attrs = args[:] else: attrs = attrDict.items() attrs = [(k,v) for k,v in attrs] def pa(s,l,tokens): for attrName,attrValue in attrs: if attrName not in tokens: raise ParseException(s,l,"no matching attribute " + attrName) if attrValue != withAttribute.ANY_VALUE and tokens[attrName] != attrValue: raise ParseException(s,l,"attribute '%s' has value '%s', must be '%s'" % (attrName, tokens[attrName], attrValue)) return pa withAttribute.ANY_VALUE = object() opAssoc = _Constants() opAssoc.LEFT = object() opAssoc.RIGHT = object() def operatorPrecedence( baseExpr, opList ): """Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants opAssoc.RIGHT and opAssoc.LEFT. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) """ ret = Forward() lastExpr = baseExpr | ( Suppress('(') + ret + Suppress(')') ) for i,operDef in enumerate(opList): opExpr,arity,rightLeftAssoc,pa = (operDef + (None,))[:4] if arity == 3: if opExpr is None or len(opExpr) != 2: raise ValueError("if numterms=3, opExpr must be a tuple or list of two expressions") opExpr1, opExpr2 = opExpr thisExpr = Forward()#.setName("expr%d" % i) if rightLeftAssoc == opAssoc.LEFT: if arity == 1: matchExpr = FollowedBy(lastExpr + opExpr) + Group( lastExpr + OneOrMore( opExpr ) ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + lastExpr) + Group( lastExpr + OneOrMore( opExpr + lastExpr ) ) else: matchExpr = FollowedBy(lastExpr+lastExpr) + Group( lastExpr + OneOrMore(lastExpr) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr) + \ Group( lastExpr + opExpr1 + lastExpr + opExpr2 + lastExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") elif rightLeftAssoc == opAssoc.RIGHT: if arity == 1: # try to avoid LR with this extra test if not isinstance(opExpr, Optional): opExpr = Optional(opExpr) matchExpr = FollowedBy(opExpr.expr + thisExpr) + Group( opExpr + thisExpr ) elif arity == 2: if opExpr is not None: matchExpr = FollowedBy(lastExpr + opExpr + thisExpr) + Group( lastExpr + OneOrMore( opExpr + thisExpr ) ) else: matchExpr = FollowedBy(lastExpr + thisExpr) + Group( lastExpr + OneOrMore( thisExpr ) ) elif arity == 3: matchExpr = FollowedBy(lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr) + \ Group( lastExpr + opExpr1 + thisExpr + opExpr2 + thisExpr ) else: raise ValueError("operator must be unary (1), binary (2), or ternary (3)") else: raise ValueError("operator must indicate right or left associativity") if pa: matchExpr.setParseAction( pa ) thisExpr << ( matchExpr | lastExpr ) lastExpr = thisExpr ret << lastExpr return ret dblQuotedString = Regex(r'"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*"').setName("string enclosed in double quotes") sglQuotedString = Regex(r"'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'").setName("string enclosed in single quotes") quotedString = Regex(r'''(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')''').setName("quotedString using single or double quotes") unicodeString = Combine(_L('u') + quotedString.copy()) def nestedExpr(opener="(", closer=")", content=None, ignoreExpr=quotedString.copy()): """Helper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default="("); can also be a pyparsing expression - closer - closing character for a nested list (default=")"); can also be a pyparsing expression - content - expression for items within the nested lists (default=None) - ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. """ if opener == closer: raise ValueError("opening and closing strings cannot be the same") if content is None: if isinstance(opener,basestring) and isinstance(closer,basestring): if len(opener) == 1 and len(closer)==1: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (empty.copy()+CharsNotIn(opener+closer+ParserElement.DEFAULT_WHITE_CHARS ).setParseAction(lambda t:t[0].strip())) else: if ignoreExpr is not None: content = (Combine(OneOrMore(~ignoreExpr + ~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: content = (Combine(OneOrMore(~Literal(opener) + ~Literal(closer) + CharsNotIn(ParserElement.DEFAULT_WHITE_CHARS,exact=1)) ).setParseAction(lambda t:t[0].strip())) else: raise ValueError("opening and closing arguments must be strings if no content expression is given") ret = Forward() if ignoreExpr is not None: ret << Group( Suppress(opener) + ZeroOrMore( ignoreExpr | ret | content ) + Suppress(closer) ) else: ret << Group( Suppress(opener) + ZeroOrMore( ret | content ) + Suppress(closer) ) return ret def indentedBlock(blockStatementExpr, indentStack, indent=True): """Helper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=True) A valid block must contain at least one C{blockStatement}. """ def checkPeerIndent(s,l,t): if l >= len(s): return curCol = col(l,s) if curCol != indentStack[-1]: if curCol > indentStack[-1]: raise ParseFatalException(s,l,"illegal nesting") raise ParseException(s,l,"not a peer entry") def checkSubIndent(s,l,t): curCol = col(l,s) if curCol > indentStack[-1]: indentStack.append( curCol ) else: raise ParseException(s,l,"not a subentry") def checkUnindent(s,l,t): if l >= len(s): return curCol = col(l,s) if not(indentStack and curCol < indentStack[-1] and curCol <= indentStack[-2]): raise ParseException(s,l,"not an unindent") indentStack.pop() NL = OneOrMore(LineEnd().setWhitespaceChars("\t ").suppress()) INDENT = Empty() + Empty().setParseAction(checkSubIndent) PEER = Empty().setParseAction(checkPeerIndent) UNDENT = Empty().setParseAction(checkUnindent) if indent: smExpr = Group( Optional(NL) + #~ FollowedBy(blockStatementExpr) + INDENT + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) + UNDENT) else: smExpr = Group( Optional(NL) + (OneOrMore( PEER + Group(blockStatementExpr) + Optional(NL) )) ) blockStatementExpr.ignore(_bslash + LineEnd()) return smExpr alphas8bit = srange(r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]") punc8bit = srange(r"[\0xa1-\0xbf\0xd7\0xf7]") anyOpenTag,anyCloseTag = makeHTMLTags(Word(alphas,alphanums+"_:")) commonHTMLEntity = Combine(_L("&") + oneOf("gt lt amp nbsp quot").setResultsName("entity") +";").streamline() _htmlEntityMap = dict(zip("gt lt amp nbsp quot".split(),'><& "')) replaceHTMLEntity = lambda t : t.entity in _htmlEntityMap and _htmlEntityMap[t.entity] or None # it's easy to get these comment structures wrong - they're very common, so may as well make them available cStyleComment = Regex(r"/\*(?:[^*]*\*+)+?/").setName("C style comment") htmlComment = Regex(r"") restOfLine = Regex(r".*").leaveWhitespace() dblSlashComment = Regex(r"\/\/(\\\n|.)*").setName("// comment") cppStyleComment = Regex(r"/(?:\*(?:[^*]*\*+)+?/|/[^\n]*(?:\n[^\n]*)*?(?:(?" + str(tokenlist)) print ("tokens = " + str(tokens)) print ("tokens.columns = " + str(tokens.columns)) print ("tokens.tables = " + str(tokens.tables)) print (tokens.asXML("SQL",True)) except ParseBaseException: err = sys.exc_info()[1] print (teststring + "->") print (err.line) print (" "*(err.column-1) + "^") print (err) print() selectToken = CaselessLiteral( "select" ) fromToken = CaselessLiteral( "from" ) ident = Word( alphas, alphanums + "_$" ) columnName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) columnNameList = Group( delimitedList( columnName ) )#.setName("columns") tableName = delimitedList( ident, ".", combine=True ).setParseAction( upcaseTokens ) tableNameList = Group( delimitedList( tableName ) )#.setName("tables") simpleSQL = ( selectToken + \ ( '*' | columnNameList ).setResultsName( "columns" ) + \ fromToken + \ tableNameList.setResultsName( "tables" ) ) test( "SELECT * from XYZZY, ABC" ) test( "select * from SYS.XYZZY" ) test( "Select A from Sys.dual" ) test( "Select AA,BB,CC from Sys.dual" ) test( "Select A, B, C from Sys.dual" ) test( "Select A, B, C from Sys.dual" ) test( "Xelect A, B, C from Sys.dual" ) test( "Select A, B, C frox Sys.dual" ) test( "Select" ) test( "Select ^^^ frox Sys.dual" ) test( "Select A, B, C from Sys.dual, Table2 " ) PK[BncXcXsite-packages/configobj.pynu[# configobj.py # A config file reader/writer that supports nested sections in config files. # Copyright (C) 2005-2010 Michael Foord, Nicola Larosa # E-mail: fuzzyman AT voidspace DOT org DOT uk # nico AT tekNico DOT net # ConfigObj 4 # http://www.voidspace.org.uk/python/configobj.html # Released subject to the BSD License # Please see http://www.voidspace.org.uk/python/license.shtml # Scripts maintained at http://www.voidspace.org.uk/python/index.shtml # For information about bugfixes, updates and support, please join the # ConfigObj mailing list: # http://lists.sourceforge.net/lists/listinfo/configobj-develop # Comments, suggestions and bug reports welcome. from __future__ import generators import os import re import sys from codecs import BOM_UTF8, BOM_UTF16, BOM_UTF16_BE, BOM_UTF16_LE # imported lazily to avoid startup performance hit if it isn't used compiler = None # A dictionary mapping BOM to # the encoding to decode with, and what to set the # encoding attribute to. BOMS = { BOM_UTF8: ('utf_8', None), BOM_UTF16_BE: ('utf16_be', 'utf_16'), BOM_UTF16_LE: ('utf16_le', 'utf_16'), BOM_UTF16: ('utf_16', 'utf_16'), } # All legal variants of the BOM codecs. # TODO: the list of aliases is not meant to be exhaustive, is there a # better way ? BOM_LIST = { 'utf_16': 'utf_16', 'u16': 'utf_16', 'utf16': 'utf_16', 'utf-16': 'utf_16', 'utf16_be': 'utf16_be', 'utf_16_be': 'utf16_be', 'utf-16be': 'utf16_be', 'utf16_le': 'utf16_le', 'utf_16_le': 'utf16_le', 'utf-16le': 'utf16_le', 'utf_8': 'utf_8', 'u8': 'utf_8', 'utf': 'utf_8', 'utf8': 'utf_8', 'utf-8': 'utf_8', } # Map of encodings to the BOM to write. BOM_SET = { 'utf_8': BOM_UTF8, 'utf_16': BOM_UTF16, 'utf16_be': BOM_UTF16_BE, 'utf16_le': BOM_UTF16_LE, None: BOM_UTF8 } def match_utf8(encoding): return BOM_LIST.get(encoding.lower()) == 'utf_8' # Quote strings used for writing values squot = "'%s'" dquot = '"%s"' noquot = "%s" wspace_plus = ' \r\n\v\t\'"' tsquot = '"""%s"""' tdquot = "'''%s'''" # Sentinel for use in getattr calls to replace hasattr MISSING = object() __version__ = '4.7.2' try: any except NameError: def any(iterable): for entry in iterable: if entry: return True return False __all__ = ( '__version__', 'DEFAULT_INDENT_TYPE', 'DEFAULT_INTERPOLATION', 'ConfigObjError', 'NestingError', 'ParseError', 'DuplicateError', 'ConfigspecError', 'ConfigObj', 'SimpleVal', 'InterpolationError', 'InterpolationLoopError', 'MissingInterpolationOption', 'RepeatSectionError', 'ReloadError', 'UnreprError', 'UnknownType', 'flatten_errors', 'get_extra_values' ) DEFAULT_INTERPOLATION = 'configparser' DEFAULT_INDENT_TYPE = ' ' MAX_INTERPOL_DEPTH = 10 OPTION_DEFAULTS = { 'interpolation': True, 'raise_errors': False, 'list_values': True, 'create_empty': False, 'file_error': False, 'configspec': None, 'stringify': True, # option may be set to one of ('', ' ', '\t') 'indent_type': None, 'encoding': None, 'default_encoding': None, 'unrepr': False, 'write_empty_values': False, } def getObj(s): global compiler if compiler is None: import compiler s = "a=" + s p = compiler.parse(s) return p.getChildren()[1].getChildren()[0].getChildren()[1] class UnknownType(Exception): pass class Builder(object): def build(self, o): m = getattr(self, 'build_' + o.__class__.__name__, None) if m is None: raise UnknownType(o.__class__.__name__) return m(o) def build_List(self, o): return map(self.build, o.getChildren()) def build_Const(self, o): return o.value def build_Dict(self, o): d = {} i = iter(map(self.build, o.getChildren())) for el in i: d[el] = i.next() return d def build_Tuple(self, o): return tuple(self.build_List(o)) def build_Name(self, o): if o.name == 'None': return None if o.name == 'True': return True if o.name == 'False': return False # An undefined Name raise UnknownType('Undefined Name') def build_Add(self, o): real, imag = map(self.build_Const, o.getChildren()) try: real = float(real) except TypeError: raise UnknownType('Add') if not isinstance(imag, complex) or imag.real != 0.0: raise UnknownType('Add') return real+imag def build_Getattr(self, o): parent = self.build(o.expr) return getattr(parent, o.attrname) def build_UnarySub(self, o): return -self.build_Const(o.getChildren()[0]) def build_UnaryAdd(self, o): return self.build_Const(o.getChildren()[0]) _builder = Builder() def unrepr(s): if not s: return s return _builder.build(getObj(s)) class ConfigObjError(SyntaxError): """ This is the base class for all errors that ConfigObj raises. It is a subclass of SyntaxError. """ def __init__(self, message='', line_number=None, line=''): self.line = line self.line_number = line_number SyntaxError.__init__(self, message) class NestingError(ConfigObjError): """ This error indicates a level of nesting that doesn't match. """ class ParseError(ConfigObjError): """ This error indicates that a line is badly written. It is neither a valid ``key = value`` line, nor a valid section marker line. """ class ReloadError(IOError): """ A 'reload' operation failed. This exception is a subclass of ``IOError``. """ def __init__(self): IOError.__init__(self, 'reload failed, filename is not set.') class DuplicateError(ConfigObjError): """ The keyword or section specified already exists. """ class ConfigspecError(ConfigObjError): """ An error occured whilst parsing a configspec. """ class InterpolationError(ConfigObjError): """Base class for the two interpolation errors.""" class InterpolationLoopError(InterpolationError): """Maximum interpolation depth exceeded in string interpolation.""" def __init__(self, option): InterpolationError.__init__( self, 'interpolation loop detected in value "%s".' % option) class RepeatSectionError(ConfigObjError): """ This error indicates additional sections in a section with a ``__many__`` (repeated) section. """ class MissingInterpolationOption(InterpolationError): """A value specified for interpolation was missing.""" def __init__(self, option): msg = 'missing option "%s" in interpolation.' % option InterpolationError.__init__(self, msg) class UnreprError(ConfigObjError): """An error parsing in unrepr mode.""" class InterpolationEngine(object): """ A helper class to help perform string interpolation. This class is an abstract base class; its descendants perform the actual work. """ # compiled regexp to use in self.interpolate() _KEYCRE = re.compile(r"%\(([^)]*)\)s") _cookie = '%' def __init__(self, section): # the Section instance that "owns" this engine self.section = section def interpolate(self, key, value): # short-cut if not self._cookie in value: return value def recursive_interpolate(key, value, section, backtrail): """The function that does the actual work. ``value``: the string we're trying to interpolate. ``section``: the section in which that string was found ``backtrail``: a dict to keep track of where we've been, to detect and prevent infinite recursion loops This is similar to a depth-first-search algorithm. """ # Have we been here already? if (key, section.name) in backtrail: # Yes - infinite loop detected raise InterpolationLoopError(key) # Place a marker on our backtrail so we won't come back here again backtrail[(key, section.name)] = 1 # Now start the actual work match = self._KEYCRE.search(value) while match: # The actual parsing of the match is implementation-dependent, # so delegate to our helper function k, v, s = self._parse_match(match) if k is None: # That's the signal that no further interpolation is needed replacement = v else: # Further interpolation may be needed to obtain final value replacement = recursive_interpolate(k, v, s, backtrail) # Replace the matched string with its final value start, end = match.span() value = ''.join((value[:start], replacement, value[end:])) new_search_start = start + len(replacement) # Pick up the next interpolation key, if any, for next time # through the while loop match = self._KEYCRE.search(value, new_search_start) # Now safe to come back here again; remove marker from backtrail del backtrail[(key, section.name)] return value # Back in interpolate(), all we have to do is kick off the recursive # function with appropriate starting values value = recursive_interpolate(key, value, self.section, {}) return value def _fetch(self, key): """Helper function to fetch values from owning section. Returns a 2-tuple: the value, and the section where it was found. """ # switch off interpolation before we try and fetch anything ! save_interp = self.section.main.interpolation self.section.main.interpolation = False # Start at section that "owns" this InterpolationEngine current_section = self.section while True: # try the current section first val = current_section.get(key) if val is not None and not isinstance(val, Section): break # try "DEFAULT" next val = current_section.get('DEFAULT', {}).get(key) if val is not None and not isinstance(val, Section): break # move up to parent and try again # top-level's parent is itself if current_section.parent is current_section: # reached top level, time to give up break current_section = current_section.parent # restore interpolation to previous value before returning self.section.main.interpolation = save_interp if val is None: raise MissingInterpolationOption(key) return val, current_section def _parse_match(self, match): """Implementation-dependent helper function. Will be passed a match object corresponding to the interpolation key we just found (e.g., "%(foo)s" or "$foo"). Should look up that key in the appropriate config file section (using the ``_fetch()`` helper function) and return a 3-tuple: (key, value, section) ``key`` is the name of the key we're looking for ``value`` is the value found for that key ``section`` is a reference to the section where it was found ``key`` and ``section`` should be None if no further interpolation should be performed on the resulting value (e.g., if we interpolated "$$" and returned "$"). """ raise NotImplementedError() class ConfigParserInterpolation(InterpolationEngine): """Behaves like ConfigParser.""" _cookie = '%' _KEYCRE = re.compile(r"%\(([^)]*)\)s") def _parse_match(self, match): key = match.group(1) value, section = self._fetch(key) return key, value, section class TemplateInterpolation(InterpolationEngine): """Behaves like string.Template.""" _cookie = '$' _delimiter = '$' _KEYCRE = re.compile(r""" \$(?: (?P\$) | # Two $ signs (?P[_a-z][_a-z0-9]*) | # $name format {(?P[^}]*)} # ${name} format ) """, re.IGNORECASE | re.VERBOSE) def _parse_match(self, match): # Valid name (in or out of braces): fetch value from section key = match.group('named') or match.group('braced') if key is not None: value, section = self._fetch(key) return key, value, section # Escaped delimiter (e.g., $$): return single delimiter if match.group('escaped') is not None: # Return None for key and section to indicate it's time to stop return None, self._delimiter, None # Anything else: ignore completely, just return it unchanged return None, match.group(), None interpolation_engines = { 'configparser': ConfigParserInterpolation, 'template': TemplateInterpolation, } def __newobj__(cls, *args): # Hack for pickle return cls.__new__(cls, *args) class Section(dict): """ A dictionary-like object that represents a section in a config file. It does string interpolation if the 'interpolation' attribute of the 'main' object is set to True. Interpolation is tried first from this object, then from the 'DEFAULT' section of this object, next from the parent and its 'DEFAULT' section, and so on until the main object is reached. A Section will behave like an ordered dictionary - following the order of the ``scalars`` and ``sections`` attributes. You can use this to change the order of members. Iteration follows the order: scalars, then sections. """ def __setstate__(self, state): dict.update(self, state[0]) self.__dict__.update(state[1]) def __reduce__(self): state = (dict(self), self.__dict__) return (__newobj__, (self.__class__,), state) def __init__(self, parent, depth, main, indict=None, name=None): """ * parent is the section above * depth is the depth level of this section * main is the main ConfigObj * indict is a dictionary to initialise the section with """ if indict is None: indict = {} dict.__init__(self) # used for nesting level *and* interpolation self.parent = parent # used for the interpolation attribute self.main = main # level of nesting depth of this Section self.depth = depth # purely for information self.name = name # self._initialise() # we do this explicitly so that __setitem__ is used properly # (rather than just passing to ``dict.__init__``) for entry, value in indict.iteritems(): self[entry] = value def _initialise(self): # the sequence of scalar values in this Section self.scalars = [] # the sequence of sections in this Section self.sections = [] # for comments :-) self.comments = {} self.inline_comments = {} # the configspec self.configspec = None # for defaults self.defaults = [] self.default_values = {} self.extra_values = [] self._created = False def _interpolate(self, key, value): try: # do we already have an interpolation engine? engine = self._interpolation_engine except AttributeError: # not yet: first time running _interpolate(), so pick the engine name = self.main.interpolation if name == True: # note that "if name:" would be incorrect here # backwards-compatibility: interpolation=True means use default name = DEFAULT_INTERPOLATION name = name.lower() # so that "Template", "template", etc. all work class_ = interpolation_engines.get(name, None) if class_ is None: # invalid value for self.main.interpolation self.main.interpolation = False return value else: # save reference to engine so we don't have to do this again engine = self._interpolation_engine = class_(self) # let the engine do the actual work return engine.interpolate(key, value) def __getitem__(self, key): """Fetch the item and do string interpolation.""" val = dict.__getitem__(self, key) if self.main.interpolation: if isinstance(val, basestring): return self._interpolate(key, val) if isinstance(val, list): def _check(entry): if isinstance(entry, basestring): return self._interpolate(key, entry) return entry new = [_check(entry) for entry in val] if new != val: return new return val def __setitem__(self, key, value, unrepr=False): """ Correctly set a value. Making dictionary values Section instances. (We have to special case 'Section' instances - which are also dicts) Keys must be strings. Values need only be strings (or lists of strings) if ``main.stringify`` is set. ``unrepr`` must be set when setting a value to a dictionary, without creating a new sub-section. """ if not isinstance(key, basestring): raise ValueError('The key "%s" is not a string.' % key) # add the comment if key not in self.comments: self.comments[key] = [] self.inline_comments[key] = '' # remove the entry from defaults if key in self.defaults: self.defaults.remove(key) # if isinstance(value, Section): if key not in self: self.sections.append(key) dict.__setitem__(self, key, value) elif isinstance(value, dict) and not unrepr: # First create the new depth level, # then create the section if key not in self: self.sections.append(key) new_depth = self.depth + 1 dict.__setitem__( self, key, Section( self, new_depth, self.main, indict=value, name=key)) else: if key not in self: self.scalars.append(key) if not self.main.stringify: if isinstance(value, basestring): pass elif isinstance(value, (list, tuple)): for entry in value: if not isinstance(entry, basestring): raise TypeError('Value is not a string "%s".' % entry) else: raise TypeError('Value is not a string "%s".' % value) dict.__setitem__(self, key, value) def __delitem__(self, key): """Remove items from the sequence when deleting.""" dict. __delitem__(self, key) if key in self.scalars: self.scalars.remove(key) else: self.sections.remove(key) del self.comments[key] del self.inline_comments[key] def get(self, key, default=None): """A version of ``get`` that doesn't bypass string interpolation.""" try: return self[key] except KeyError: return default def update(self, indict): """ A version of update that uses our ``__setitem__``. """ for entry in indict: self[entry] = indict[entry] def pop(self, key, default=MISSING): """ 'D.pop(k[,d]) -> v, remove specified key and return the corresponding value. If key is not found, d is returned if given, otherwise KeyError is raised' """ try: val = self[key] except KeyError: if default is MISSING: raise val = default else: del self[key] return val def popitem(self): """Pops the first (key,val)""" sequence = (self.scalars + self.sections) if not sequence: raise KeyError(": 'popitem(): dictionary is empty'") key = sequence[0] val = self[key] del self[key] return key, val def clear(self): """ A version of clear that also affects scalars/sections Also clears comments and configspec. Leaves other attributes alone : depth/main/parent are not affected """ dict.clear(self) self.scalars = [] self.sections = [] self.comments = {} self.inline_comments = {} self.configspec = None self.defaults = [] self.extra_values = [] def setdefault(self, key, default=None): """A version of setdefault that sets sequence if appropriate.""" try: return self[key] except KeyError: self[key] = default return self[key] def items(self): """D.items() -> list of D's (key, value) pairs, as 2-tuples""" return zip((self.scalars + self.sections), self.values()) def keys(self): """D.keys() -> list of D's keys""" return (self.scalars + self.sections) def values(self): """D.values() -> list of D's values""" return [self[key] for key in (self.scalars + self.sections)] def iteritems(self): """D.iteritems() -> an iterator over the (key, value) items of D""" return iter(self.items()) def iterkeys(self): """D.iterkeys() -> an iterator over the keys of D""" return iter((self.scalars + self.sections)) __iter__ = iterkeys def itervalues(self): """D.itervalues() -> an iterator over the values of D""" return iter(self.values()) def __repr__(self): """x.__repr__() <==> repr(x)""" def _getval(key): try: return self[key] except MissingInterpolationOption: return dict.__getitem__(self, key) return '{%s}' % ', '.join([('%s: %s' % (repr(key), repr(_getval(key)))) for key in (self.scalars + self.sections)]) __str__ = __repr__ __str__.__doc__ = "x.__str__() <==> str(x)" # Extra methods - not in a normal dictionary def dict(self): """ Return a deepcopy of self as a dictionary. All members that are ``Section`` instances are recursively turned to ordinary dictionaries - by calling their ``dict`` method. >>> n = a.dict() >>> n == a 1 >>> n is a 0 """ newdict = {} for entry in self: this_entry = self[entry] if isinstance(this_entry, Section): this_entry = this_entry.dict() elif isinstance(this_entry, list): # create a copy rather than a reference this_entry = list(this_entry) elif isinstance(this_entry, tuple): # create a copy rather than a reference this_entry = tuple(this_entry) newdict[entry] = this_entry return newdict def merge(self, indict): """ A recursive update - useful for merging config files. >>> a = '''[section1] ... option1 = True ... [[subsection]] ... more_options = False ... # end of file'''.splitlines() >>> b = '''# File is user.ini ... [section1] ... option1 = False ... # end of file'''.splitlines() >>> c1 = ConfigObj(b) >>> c2 = ConfigObj(a) >>> c2.merge(c1) >>> c2 ConfigObj({'section1': {'option1': 'False', 'subsection': {'more_options': 'False'}}}) """ for key, val in indict.items(): if (key in self and isinstance(self[key], dict) and isinstance(val, dict)): self[key].merge(val) else: self[key] = val def rename(self, oldkey, newkey): """ Change a keyname to another, without changing position in sequence. Implemented so that transformations can be made on keys, as well as on values. (used by encode and decode) Also renames comments. """ if oldkey in self.scalars: the_list = self.scalars elif oldkey in self.sections: the_list = self.sections else: raise KeyError('Key "%s" not found.' % oldkey) pos = the_list.index(oldkey) # val = self[oldkey] dict.__delitem__(self, oldkey) dict.__setitem__(self, newkey, val) the_list.remove(oldkey) the_list.insert(pos, newkey) comm = self.comments[oldkey] inline_comment = self.inline_comments[oldkey] del self.comments[oldkey] del self.inline_comments[oldkey] self.comments[newkey] = comm self.inline_comments[newkey] = inline_comment def walk(self, function, raise_errors=True, call_on_sections=False, **keywargs): """ Walk every member and call a function on the keyword and value. Return a dictionary of the return values If the function raises an exception, raise the errror unless ``raise_errors=False``, in which case set the return value to ``False``. Any unrecognised keyword arguments you pass to walk, will be pased on to the function you pass in. Note: if ``call_on_sections`` is ``True`` then - on encountering a subsection, *first* the function is called for the *whole* subsection, and then recurses into it's members. This means your function must be able to handle strings, dictionaries and lists. This allows you to change the key of subsections as well as for ordinary members. The return value when called on the whole subsection has to be discarded. See the encode and decode methods for examples, including functions. .. admonition:: caution You can use ``walk`` to transform the names of members of a section but you mustn't add or delete members. >>> config = '''[XXXXsection] ... XXXXkey = XXXXvalue'''.splitlines() >>> cfg = ConfigObj(config) >>> cfg ConfigObj({'XXXXsection': {'XXXXkey': 'XXXXvalue'}}) >>> def transform(section, key): ... val = section[key] ... newkey = key.replace('XXXX', 'CLIENT1') ... section.rename(key, newkey) ... if isinstance(val, (tuple, list, dict)): ... pass ... else: ... val = val.replace('XXXX', 'CLIENT1') ... section[newkey] = val >>> cfg.walk(transform, call_on_sections=True) {'CLIENT1section': {'CLIENT1key': None}} >>> cfg ConfigObj({'CLIENT1section': {'CLIENT1key': 'CLIENT1value'}}) """ out = {} # scalars first for i in range(len(self.scalars)): entry = self.scalars[i] try: val = function(self, entry, **keywargs) # bound again in case name has changed entry = self.scalars[i] out[entry] = val except Exception: if raise_errors: raise else: entry = self.scalars[i] out[entry] = False # then sections for i in range(len(self.sections)): entry = self.sections[i] if call_on_sections: try: function(self, entry, **keywargs) except Exception: if raise_errors: raise else: entry = self.sections[i] out[entry] = False # bound again in case name has changed entry = self.sections[i] # previous result is discarded out[entry] = self[entry].walk( function, raise_errors=raise_errors, call_on_sections=call_on_sections, **keywargs) return out def as_bool(self, key): """ Accepts a key as input. The corresponding value must be a string or the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to retain compatibility with Python 2.2. If the string is one of ``True``, ``On``, ``Yes``, or ``1`` it returns ``True``. If the string is one of ``False``, ``Off``, ``No``, or ``0`` it returns ``False``. ``as_bool`` is not case sensitive. Any other input will raise a ``ValueError``. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_bool('a') Traceback (most recent call last): ValueError: Value "fish" is neither True nor False >>> a['b'] = 'True' >>> a.as_bool('b') 1 >>> a['b'] = 'off' >>> a.as_bool('b') 0 """ val = self[key] if val == True: return True elif val == False: return False else: try: if not isinstance(val, basestring): # TODO: Why do we raise a KeyError here? raise KeyError() else: return self.main._bools[val.lower()] except KeyError: raise ValueError('Value "%s" is neither True nor False' % val) def as_int(self, key): """ A convenience method which coerces the specified value to an integer. If the value is an invalid literal for ``int``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_int('a') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: 'fish' >>> a['b'] = '1' >>> a.as_int('b') 1 >>> a['b'] = '3.2' >>> a.as_int('b') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: '3.2' """ return int(self[key]) def as_float(self, key): """ A convenience method which coerces the specified value to a float. If the value is an invalid literal for ``float``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_float('a') Traceback (most recent call last): ValueError: invalid literal for float(): fish >>> a['b'] = '1' >>> a.as_float('b') 1.0 >>> a['b'] = '3.2' >>> a.as_float('b') 3.2000000000000002 """ return float(self[key]) def as_list(self, key): """ A convenience method which fetches the specified value, guaranteeing that it is a list. >>> a = ConfigObj() >>> a['a'] = 1 >>> a.as_list('a') [1] >>> a['a'] = (1,) >>> a.as_list('a') [1] >>> a['a'] = [1] >>> a.as_list('a') [1] """ result = self[key] if isinstance(result, (tuple, list)): return list(result) return [result] def restore_default(self, key): """ Restore (and return) default value for the specified key. This method will only work for a ConfigObj that was created with a configspec and has been validated. If there is no default value for this key, ``KeyError`` is raised. """ default = self.default_values[key] dict.__setitem__(self, key, default) if key not in self.defaults: self.defaults.append(key) return default def restore_defaults(self): """ Recursively restore default values to all members that have them. This method will only work for a ConfigObj that was created with a configspec and has been validated. It doesn't delete or modify entries without default values. """ for key in self.default_values: self.restore_default(key) for section in self.sections: self[section].restore_defaults() class ConfigObj(Section): """An object to read, create, and write config files.""" _keyword = re.compile(r'''^ # line start (\s*) # indentation ( # keyword (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'"=].*?) # no quotes ) \s*=\s* # divider (.*) # value (including list values and comments) $ # line end ''', re.VERBOSE) _sectionmarker = re.compile(r'''^ (\s*) # 1: indentation ((?:\[\s*)+) # 2: section marker open ( # 3: section name open (?:"\s*\S.*?\s*")| # at least one non-space with double quotes (?:'\s*\S.*?\s*')| # at least one non-space with single quotes (?:[^'"\s].*?) # at least one non-space unquoted ) # section name close ((?:\s*\])+) # 4: section marker close \s*(\#.*)? # 5: optional comment $''', re.VERBOSE) # this regexp pulls list values out as a single string # or single values and comments # FIXME: this regex adds a '' to the end of comma terminated lists # workaround in ``_handle_value`` _valueexp = re.compile(r'''^ (?: (?: ( (?: (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#][^,\#]*?) # unquoted ) \s*,\s* # comma )* # match all list items ending in a comma (if any) ) ( (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#\s][^,]*?)| # unquoted (?:(? 1: msg = "Parsing failed with several errors.\nFirst error %s" % info error = ConfigObjError(msg) else: error = self._errors[0] # set the errors attribute; it's a list of tuples: # (error_type, message, line_number) error.errors = self._errors # set the config attribute error.config = self raise error # delete private attributes del self._errors if configspec is None: self.configspec = None else: self._handle_configspec(configspec) def _initialise(self, options=None): if options is None: options = OPTION_DEFAULTS # initialise a few variables self.filename = None self._errors = [] self.raise_errors = options['raise_errors'] self.interpolation = options['interpolation'] self.list_values = options['list_values'] self.create_empty = options['create_empty'] self.file_error = options['file_error'] self.stringify = options['stringify'] self.indent_type = options['indent_type'] self.encoding = options['encoding'] self.default_encoding = options['default_encoding'] self.BOM = False self.newlines = None self.write_empty_values = options['write_empty_values'] self.unrepr = options['unrepr'] self.initial_comment = [] self.final_comment = [] self.configspec = None if self._inspec: self.list_values = False # Clear section attributes as well Section._initialise(self) def __repr__(self): def _getval(key): try: return self[key] except MissingInterpolationOption: return dict.__getitem__(self, key) return ('ConfigObj({%s})' % ', '.join([('%s: %s' % (repr(key), repr(_getval(key)))) for key in (self.scalars + self.sections)])) def _handle_bom(self, infile): """ Handle any BOM, and decode if necessary. If an encoding is specified, that *must* be used - but the BOM should still be removed (and the BOM attribute set). (If the encoding is wrongly specified, then a BOM for an alternative encoding won't be discovered or removed.) If an encoding is not specified, UTF8 or UTF16 BOM will be detected and removed. The BOM attribute will be set. UTF16 will be decoded to unicode. NOTE: This method must not be called with an empty ``infile``. Specifying the *wrong* encoding is likely to cause a ``UnicodeDecodeError``. ``infile`` must always be returned as a list of lines, but may be passed in as a single string. """ if ((self.encoding is not None) and (self.encoding.lower() not in BOM_LIST)): # No need to check for a BOM # the encoding specified doesn't have one # just decode return self._decode(infile, self.encoding) if isinstance(infile, (list, tuple)): line = infile[0] else: line = infile if self.encoding is not None: # encoding explicitly supplied # And it could have an associated BOM # TODO: if encoding is just UTF16 - we ought to check for both # TODO: big endian and little endian versions. enc = BOM_LIST[self.encoding.lower()] if enc == 'utf_16': # For UTF16 we try big endian and little endian for BOM, (encoding, final_encoding) in BOMS.items(): if not final_encoding: # skip UTF8 continue if infile.startswith(BOM): ### BOM discovered ##self.BOM = True # Don't need to remove BOM return self._decode(infile, encoding) # If we get this far, will *probably* raise a DecodeError # As it doesn't appear to start with a BOM return self._decode(infile, self.encoding) # Must be UTF8 BOM = BOM_SET[enc] if not line.startswith(BOM): return self._decode(infile, self.encoding) newline = line[len(BOM):] # BOM removed if isinstance(infile, (list, tuple)): infile[0] = newline else: infile = newline self.BOM = True return self._decode(infile, self.encoding) # No encoding specified - so we need to check for UTF8/UTF16 for BOM, (encoding, final_encoding) in BOMS.items(): if not line.startswith(BOM): continue else: # BOM discovered self.encoding = final_encoding if not final_encoding: self.BOM = True # UTF8 # remove BOM newline = line[len(BOM):] if isinstance(infile, (list, tuple)): infile[0] = newline else: infile = newline # UTF8 - don't decode if isinstance(infile, basestring): return infile.splitlines(True) else: return infile # UTF16 - have to decode return self._decode(infile, encoding) # No BOM discovered and no encoding specified, just return if isinstance(infile, basestring): # infile read from a file will be a single string return infile.splitlines(True) return infile def _a_to_u(self, aString): """Decode ASCII strings to unicode if a self.encoding is specified.""" if self.encoding: return aString.decode('ascii') else: return aString def _decode(self, infile, encoding): """ Decode infile to unicode. Using the specified encoding. if is a string, it also needs converting to a list. """ if isinstance(infile, basestring): # can't be unicode # NOTE: Could raise a ``UnicodeDecodeError`` return infile.decode(encoding).splitlines(True) for i, line in enumerate(infile): if not isinstance(line, unicode): # NOTE: The isinstance test here handles mixed lists of unicode/string # NOTE: But the decode will break on any non-string values # NOTE: Or could raise a ``UnicodeDecodeError`` infile[i] = line.decode(encoding) return infile def _decode_element(self, line): """Decode element to unicode if necessary.""" if not self.encoding: return line if isinstance(line, str) and self.default_encoding: return line.decode(self.default_encoding) return line def _str(self, value): """ Used by ``stringify`` within validate, to turn non-string values into strings. """ if not isinstance(value, basestring): return str(value) else: return value def _parse(self, infile): """Actually parse the config file.""" temp_list_values = self.list_values if self.unrepr: self.list_values = False comment_list = [] done_start = False this_section = self maxline = len(infile) - 1 cur_index = -1 reset_comment = False while cur_index < maxline: if reset_comment: comment_list = [] cur_index += 1 line = infile[cur_index] sline = line.strip() # do we have anything on the line ? if not sline or sline.startswith('#'): reset_comment = False comment_list.append(line) continue if not done_start: # preserve initial comment self.initial_comment = comment_list comment_list = [] done_start = True reset_comment = True # first we check if it's a section marker mat = self._sectionmarker.match(line) if mat is not None: # is a section line (indent, sect_open, sect_name, sect_close, comment) = mat.groups() if indent and (self.indent_type is None): self.indent_type = indent cur_depth = sect_open.count('[') if cur_depth != sect_close.count(']'): self._handle_error("Cannot compute the section depth at line %s.", NestingError, infile, cur_index) continue if cur_depth < this_section.depth: # the new section is dropping back to a previous level try: parent = self._match_depth(this_section, cur_depth).parent except SyntaxError: self._handle_error("Cannot compute nesting level at line %s.", NestingError, infile, cur_index) continue elif cur_depth == this_section.depth: # the new section is a sibling of the current section parent = this_section.parent elif cur_depth == this_section.depth + 1: # the new section is a child the current section parent = this_section else: self._handle_error("Section too nested at line %s.", NestingError, infile, cur_index) sect_name = self._unquote(sect_name) if sect_name in parent: self._handle_error('Duplicate section name at line %s.', DuplicateError, infile, cur_index) continue # create the new section this_section = Section( parent, cur_depth, self, name=sect_name) parent[sect_name] = this_section parent.inline_comments[sect_name] = comment parent.comments[sect_name] = comment_list continue # # it's not a section marker, # so it should be a valid ``key = value`` line mat = self._keyword.match(line) if mat is None: # it neither matched as a keyword # or a section marker self._handle_error( 'Invalid line at line "%s".', ParseError, infile, cur_index) else: # is a keyword value # value will include any inline comment (indent, key, value) = mat.groups() if indent and (self.indent_type is None): self.indent_type = indent # check for a multiline value if value[:3] in ['"""', "'''"]: try: value, comment, cur_index = self._multiline( value, infile, cur_index, maxline) except SyntaxError: self._handle_error( 'Parse error in value at line %s.', ParseError, infile, cur_index) continue else: if self.unrepr: comment = '' try: value = unrepr(value) except Exception, e: if type(e) == UnknownType: msg = 'Unknown name or type in value at line %s.' else: msg = 'Parse error in value at line %s.' self._handle_error(msg, UnreprError, infile, cur_index) continue else: if self.unrepr: comment = '' try: value = unrepr(value) except Exception, e: if isinstance(e, UnknownType): msg = 'Unknown name or type in value at line %s.' else: msg = 'Parse error in value at line %s.' self._handle_error(msg, UnreprError, infile, cur_index) continue else: # extract comment and lists try: (value, comment) = self._handle_value(value) except SyntaxError: self._handle_error( 'Parse error in value at line %s.', ParseError, infile, cur_index) continue # key = self._unquote(key) if key in this_section: self._handle_error( 'Duplicate keyword name at line %s.', DuplicateError, infile, cur_index) continue # add the key. # we set unrepr because if we have got this far we will never # be creating a new section this_section.__setitem__(key, value, unrepr=True) this_section.inline_comments[key] = comment this_section.comments[key] = comment_list continue # if self.indent_type is None: # no indentation used, set the type accordingly self.indent_type = '' # preserve the final comment if not self and not self.initial_comment: self.initial_comment = comment_list elif not reset_comment: self.final_comment = comment_list self.list_values = temp_list_values def _match_depth(self, sect, depth): """ Given a section and a depth level, walk back through the sections parents to see if the depth level matches a previous section. Return a reference to the right section, or raise a SyntaxError. """ while depth < sect.depth: if sect is sect.parent: # we've reached the top level already raise SyntaxError() sect = sect.parent if sect.depth == depth: return sect # shouldn't get here raise SyntaxError() def _handle_error(self, text, ErrorClass, infile, cur_index): """ Handle an error according to the error settings. Either raise the error or store it. The error will have occured at ``cur_index`` """ line = infile[cur_index] cur_index += 1 message = text % cur_index error = ErrorClass(message, cur_index, line) if self.raise_errors: # raise the error - parsing stops here raise error # store the error # reraise when parsing has finished self._errors.append(error) def _unquote(self, value): """Return an unquoted version of a value""" if not value: # should only happen during parsing of lists raise SyntaxError if (value[0] == value[-1]) and (value[0] in ('"', "'")): value = value[1:-1] return value def _quote(self, value, multiline=True): """ Return a safely quoted version of a value. Raise a ConfigObjError if the value cannot be safely quoted. If multiline is ``True`` (default) then use triple quotes if necessary. * Don't quote values that don't need it. * Recursively quote members of a list and return a comma joined list. * Multiline is ``False`` for lists. * Obey list syntax for empty and single member lists. If ``list_values=False`` then the value is only quoted if it contains a ``\\n`` (is multiline) or '#'. If ``write_empty_values`` is set, and the value is an empty string, it won't be quoted. """ if multiline and self.write_empty_values and value == '': # Only if multiline is set, so that it is used for values not # keys, and not values that are part of a list return '' if multiline and isinstance(value, (list, tuple)): if not value: return ',' elif len(value) == 1: return self._quote(value[0], multiline=False) + ',' return ', '.join([self._quote(val, multiline=False) for val in value]) if not isinstance(value, basestring): if self.stringify: value = str(value) else: raise TypeError('Value "%s" is not a string.' % value) if not value: return '""' no_lists_no_quotes = not self.list_values and '\n' not in value and '#' not in value need_triple = multiline and ((("'" in value) and ('"' in value)) or ('\n' in value )) hash_triple_quote = multiline and not need_triple and ("'" in value) and ('"' in value) and ('#' in value) check_for_single = (no_lists_no_quotes or not need_triple) and not hash_triple_quote if check_for_single: if not self.list_values: # we don't quote if ``list_values=False`` quot = noquot # for normal values either single or double quotes will do elif '\n' in value: # will only happen if multiline is off - e.g. '\n' in key raise ConfigObjError('Value "%s" cannot be safely quoted.' % value) elif ((value[0] not in wspace_plus) and (value[-1] not in wspace_plus) and (',' not in value)): quot = noquot else: quot = self._get_single_quote(value) else: # if value has '\n' or "'" *and* '"', it will need triple quotes quot = self._get_triple_quote(value) if quot == noquot and '#' in value and self.list_values: quot = self._get_single_quote(value) return quot % value def _get_single_quote(self, value): if ("'" in value) and ('"' in value): raise ConfigObjError('Value "%s" cannot be safely quoted.' % value) elif '"' in value: quot = squot else: quot = dquot return quot def _get_triple_quote(self, value): if (value.find('"""') != -1) and (value.find("'''") != -1): raise ConfigObjError('Value "%s" cannot be safely quoted.' % value) if value.find('"""') == -1: quot = tdquot else: quot = tsquot return quot def _handle_value(self, value): """ Given a value string, unquote, remove comment, handle lists. (including empty and single member lists) """ if self._inspec: # Parsing a configspec so don't handle comments return (value, '') # do we look for lists in values ? if not self.list_values: mat = self._nolistvalue.match(value) if mat is None: raise SyntaxError() # NOTE: we don't unquote here return mat.groups() # mat = self._valueexp.match(value) if mat is None: # the value is badly constructed, probably badly quoted, # or an invalid list raise SyntaxError() (list_values, single, empty_list, comment) = mat.groups() if (list_values == '') and (single is None): # change this if you want to accept empty values raise SyntaxError() # NOTE: note there is no error handling from here if the regex # is wrong: then incorrect values will slip through if empty_list is not None: # the single comma - meaning an empty list return ([], comment) if single is not None: # handle empty values if list_values and not single: # FIXME: the '' is a workaround because our regex now matches # '' at the end of a list if it has a trailing comma single = None else: single = single or '""' single = self._unquote(single) if list_values == '': # not a list value return (single, comment) the_list = self._listvalueexp.findall(list_values) the_list = [self._unquote(val) for val in the_list] if single is not None: the_list += [single] return (the_list, comment) def _multiline(self, value, infile, cur_index, maxline): """Extract the value, where we are in a multiline situation.""" quot = value[:3] newvalue = value[3:] single_line = self._triple_quote[quot][0] multi_line = self._triple_quote[quot][1] mat = single_line.match(value) if mat is not None: retval = list(mat.groups()) retval.append(cur_index) return retval elif newvalue.find(quot) != -1: # somehow the triple quote is missing raise SyntaxError() # while cur_index < maxline: cur_index += 1 newvalue += '\n' line = infile[cur_index] if line.find(quot) == -1: newvalue += line else: # end of multiline, process it break else: # we've got to the end of the config, oops... raise SyntaxError() mat = multi_line.match(line) if mat is None: # a badly formed line raise SyntaxError() (value, comment) = mat.groups() return (newvalue + value, comment, cur_index) def _handle_configspec(self, configspec): """Parse the configspec.""" # FIXME: Should we check that the configspec was created with the # correct settings ? (i.e. ``list_values=False``) if not isinstance(configspec, ConfigObj): try: configspec = ConfigObj(configspec, raise_errors=True, file_error=True, _inspec=True) except ConfigObjError, e: # FIXME: Should these errors have a reference # to the already parsed ConfigObj ? raise ConfigspecError('Parsing configspec failed: %s' % e) except IOError, e: raise IOError('Reading configspec failed: %s' % e) self.configspec = configspec def _set_configspec(self, section, copy): """ Called by validate. Handles setting the configspec on subsections including sections to be validated by __many__ """ configspec = section.configspec many = configspec.get('__many__') if isinstance(many, dict): for entry in section.sections: if entry not in configspec: section[entry].configspec = many for entry in configspec.sections: if entry == '__many__': continue if entry not in section: section[entry] = {} section[entry]._created = True if copy: # copy comments section.comments[entry] = configspec.comments.get(entry, []) section.inline_comments[entry] = configspec.inline_comments.get(entry, '') # Could be a scalar when we expect a section if isinstance(section[entry], Section): section[entry].configspec = configspec[entry] def _write_line(self, indent_string, entry, this_entry, comment): """Write an individual line, for the write method""" # NOTE: the calls to self._quote here handles non-StringType values. if not self.unrepr: val = self._decode_element(self._quote(this_entry)) else: val = repr(this_entry) return '%s%s%s%s%s' % (indent_string, self._decode_element(self._quote(entry, multiline=False)), self._a_to_u(' = '), val, self._decode_element(comment)) def _write_marker(self, indent_string, depth, entry, comment): """Write a section marker line""" return '%s%s%s%s%s' % (indent_string, self._a_to_u('[' * depth), self._quote(self._decode_element(entry), multiline=False), self._a_to_u(']' * depth), self._decode_element(comment)) def _handle_comment(self, comment): """Deal with a comment.""" if not comment: return '' start = self.indent_type if not comment.startswith('#'): start += self._a_to_u(' # ') return (start + comment) # Public methods def write(self, outfile=None, section=None): """ Write the current ConfigObj as a file tekNico: FIXME: use StringIO instead of real files >>> filename = a.filename >>> a.filename = 'test.ini' >>> a.write() >>> a.filename = filename >>> a == ConfigObj('test.ini', raise_errors=True) 1 >>> import os >>> os.remove('test.ini') """ if self.indent_type is None: # this can be true if initialised from a dictionary self.indent_type = DEFAULT_INDENT_TYPE out = [] cs = self._a_to_u('#') csp = self._a_to_u('# ') if section is None: int_val = self.interpolation self.interpolation = False section = self for line in self.initial_comment: line = self._decode_element(line) stripped_line = line.strip() if stripped_line and not stripped_line.startswith(cs): line = csp + line out.append(line) indent_string = self.indent_type * section.depth for entry in (section.scalars + section.sections): if entry in section.defaults: # don't write out default values continue for comment_line in section.comments[entry]: comment_line = self._decode_element(comment_line.lstrip()) if comment_line and not comment_line.startswith(cs): comment_line = csp + comment_line out.append(indent_string + comment_line) this_entry = section[entry] comment = self._handle_comment(section.inline_comments[entry]) if isinstance(this_entry, dict): # a section out.append(self._write_marker( indent_string, this_entry.depth, entry, comment)) out.extend(self.write(section=this_entry)) else: out.append(self._write_line( indent_string, entry, this_entry, comment)) if section is self: for line in self.final_comment: line = self._decode_element(line) stripped_line = line.strip() if stripped_line and not stripped_line.startswith(cs): line = csp + line out.append(line) self.interpolation = int_val if section is not self: return out if (self.filename is None) and (outfile is None): # output a list of lines # might need to encode # NOTE: This will *screw* UTF16, each line will start with the BOM if self.encoding: out = [l.encode(self.encoding) for l in out] if (self.BOM and ((self.encoding is None) or (BOM_LIST.get(self.encoding.lower()) == 'utf_8'))): # Add the UTF8 BOM if not out: out.append('') out[0] = BOM_UTF8 + out[0] return out # Turn the list to a string, joined with correct newlines newline = self.newlines or os.linesep if (getattr(outfile, 'mode', None) is not None and outfile.mode == 'w' and sys.platform == 'win32' and newline == '\r\n'): # Windows specific hack to avoid writing '\r\r\n' newline = '\n' output = self._a_to_u(newline).join(out) if self.encoding: output = output.encode(self.encoding) if self.BOM and ((self.encoding is None) or match_utf8(self.encoding)): # Add the UTF8 BOM output = BOM_UTF8 + output if not output.endswith(newline): output += newline if outfile is not None: outfile.write(output) else: h = open(self.filename, 'wb') h.write(output) h.close() def validate(self, validator, preserve_errors=False, copy=False, section=None): """ Test the ConfigObj against a configspec. It uses the ``validator`` object from *validate.py*. To run ``validate`` on the current ConfigObj, call: :: test = config.validate(validator) (Normally having previously passed in the configspec when the ConfigObj was created - you can dynamically assign a dictionary of checks to the ``configspec`` attribute of a section though). It returns ``True`` if everything passes, or a dictionary of pass/fails (True/False). If every member of a subsection passes, it will just have the value ``True``. (It also returns ``False`` if all members fail). In addition, it converts the values from strings to their native types if their checks pass (and ``stringify`` is set). If ``preserve_errors`` is ``True`` (``False`` is default) then instead of a marking a fail with a ``False``, it will preserve the actual exception object. This can contain info about the reason for failure. For example the ``VdtValueTooSmallError`` indicates that the value supplied was too small. If a value (or section) is missing it will still be marked as ``False``. You must have the validate module to use ``preserve_errors=True``. You can then use the ``flatten_errors`` function to turn your nested results dictionary into a flattened list of failures - useful for displaying meaningful error messages. """ if section is None: if self.configspec is None: raise ValueError('No configspec supplied.') if preserve_errors: # We do this once to remove a top level dependency on the validate module # Which makes importing configobj faster from validate import VdtMissingValue self._vdtMissingValue = VdtMissingValue section = self if copy: section.initial_comment = section.configspec.initial_comment section.final_comment = section.configspec.final_comment section.encoding = section.configspec.encoding section.BOM = section.configspec.BOM section.newlines = section.configspec.newlines section.indent_type = section.configspec.indent_type # # section.default_values.clear() #?? configspec = section.configspec self._set_configspec(section, copy) def validate_entry(entry, spec, val, missing, ret_true, ret_false): section.default_values.pop(entry, None) try: section.default_values[entry] = validator.get_default_value(configspec[entry]) except (KeyError, AttributeError, validator.baseErrorClass): # No default, bad default or validator has no 'get_default_value' # (e.g. SimpleVal) pass try: check = validator.check(spec, val, missing=missing ) except validator.baseErrorClass, e: if not preserve_errors or isinstance(e, self._vdtMissingValue): out[entry] = False else: # preserve the error out[entry] = e ret_false = False ret_true = False else: ret_false = False out[entry] = True if self.stringify or missing: # if we are doing type conversion # or the value is a supplied default if not self.stringify: if isinstance(check, (list, tuple)): # preserve lists check = [self._str(item) for item in check] elif missing and check is None: # convert the None from a default to a '' check = '' else: check = self._str(check) if (check != val) or missing: section[entry] = check if not copy and missing and entry not in section.defaults: section.defaults.append(entry) return ret_true, ret_false # out = {} ret_true = True ret_false = True unvalidated = [k for k in section.scalars if k not in configspec] incorrect_sections = [k for k in configspec.sections if k in section.scalars] incorrect_scalars = [k for k in configspec.scalars if k in section.sections] for entry in configspec.scalars: if entry in ('__many__', '___many___'): # reserved names continue if (not entry in section.scalars) or (entry in section.defaults): # missing entries # or entries from defaults missing = True val = None if copy and entry not in section.scalars: # copy comments section.comments[entry] = ( configspec.comments.get(entry, [])) section.inline_comments[entry] = ( configspec.inline_comments.get(entry, '')) # else: missing = False val = section[entry] ret_true, ret_false = validate_entry(entry, configspec[entry], val, missing, ret_true, ret_false) many = None if '__many__' in configspec.scalars: many = configspec['__many__'] elif '___many___' in configspec.scalars: many = configspec['___many___'] if many is not None: for entry in unvalidated: val = section[entry] ret_true, ret_false = validate_entry(entry, many, val, False, ret_true, ret_false) unvalidated = [] for entry in incorrect_scalars: ret_true = False if not preserve_errors: out[entry] = False else: ret_false = False msg = 'Value %r was provided as a section' % entry out[entry] = validator.baseErrorClass(msg) for entry in incorrect_sections: ret_true = False if not preserve_errors: out[entry] = False else: ret_false = False msg = 'Section %r was provided as a single value' % entry out[entry] = validator.baseErrorClass(msg) # Missing sections will have been created as empty ones when the # configspec was read. for entry in section.sections: # FIXME: this means DEFAULT is not copied in copy mode if section is self and entry == 'DEFAULT': continue if section[entry].configspec is None: unvalidated.append(entry) continue if copy: section.comments[entry] = configspec.comments.get(entry, []) section.inline_comments[entry] = configspec.inline_comments.get(entry, '') check = self.validate(validator, preserve_errors=preserve_errors, copy=copy, section=section[entry]) out[entry] = check if check == False: ret_true = False elif check == True: ret_false = False else: ret_true = False section.extra_values = unvalidated if preserve_errors and not section._created: # If the section wasn't created (i.e. it wasn't missing) # then we can't return False, we need to preserve errors ret_false = False # if ret_false and preserve_errors and out: # If we are preserving errors, but all # the failures are from missing sections / values # then we can return False. Otherwise there is a # real failure that we need to preserve. ret_false = not any(out.values()) if ret_true: return True elif ret_false: return False return out def reset(self): """Clear ConfigObj instance and restore to 'freshly created' state.""" self.clear() self._initialise() # FIXME: Should be done by '_initialise', but ConfigObj constructor (and reload) # requires an empty dictionary self.configspec = None # Just to be sure ;-) self._original_configspec = None def reload(self): """ Reload a ConfigObj from file. This method raises a ``ReloadError`` if the ConfigObj doesn't have a filename attribute pointing to a file. """ if not isinstance(self.filename, basestring): raise ReloadError() filename = self.filename current_options = {} for entry in OPTION_DEFAULTS: if entry == 'configspec': continue current_options[entry] = getattr(self, entry) configspec = self._original_configspec current_options['configspec'] = configspec self.clear() self._initialise(current_options) self._load(filename, configspec) class SimpleVal(object): """ A simple validator. Can be used to check that all members expected are present. To use it, provide a configspec with all your members in (the value given will be ignored). Pass an instance of ``SimpleVal`` to the ``validate`` method of your ``ConfigObj``. ``validate`` will return ``True`` if all members are present, or a dictionary with True/False meaning present/missing. (Whole missing sections will be replaced with ``False``) """ def __init__(self): self.baseErrorClass = ConfigObjError def check(self, check, member, missing=False): """A dummy check method, always returns the value unchanged.""" if missing: raise self.baseErrorClass() return member def flatten_errors(cfg, res, levels=None, results=None): """ An example function that will turn a nested dictionary of results (as returned by ``ConfigObj.validate``) into a flat list. ``cfg`` is the ConfigObj instance being checked, ``res`` is the results dictionary returned by ``validate``. (This is a recursive function, so you shouldn't use the ``levels`` or ``results`` arguments - they are used by the function.) Returns a list of keys that failed. Each member of the list is a tuple:: ([list of sections...], key, result) If ``validate`` was called with ``preserve_errors=False`` (the default) then ``result`` will always be ``False``. *list of sections* is a flattened list of sections that the key was found in. If the section was missing (or a section was expected and a scalar provided - or vice-versa) then key will be ``None``. If the value (or section) was missing then ``result`` will be ``False``. If ``validate`` was called with ``preserve_errors=True`` and a value was present, but failed the check, then ``result`` will be the exception object returned. You can use this as a string that describes the failure. For example *The value "3" is of the wrong type*. """ if levels is None: # first time called levels = [] results = [] if res == True: return results if res == False or isinstance(res, Exception): results.append((levels[:], None, res)) if levels: levels.pop() return results for (key, val) in res.items(): if val == True: continue if isinstance(cfg.get(key), dict): # Go down one level levels.append(key) flatten_errors(cfg[key], val, levels, results) continue results.append((levels[:], key, val)) # # Go up one level if levels: levels.pop() # return results def get_extra_values(conf, _prepend=()): """ Find all the values and sections not in the configspec from a validated ConfigObj. ``get_extra_values`` returns a list of tuples where each tuple represents either an extra section, or an extra value. The tuples contain two values, a tuple representing the section the value is in and the name of the extra values. For extra values in the top level section the first member will be an empty tuple. For values in the 'foo' section the first member will be ``('foo',)``. For members in the 'bar' subsection of the 'foo' section the first member will be ``('foo', 'bar')``. NOTE: If you call ``get_extra_values`` on a ConfigObj instance that hasn't been validated it will return an empty list. """ out = [] out.extend([(_prepend, name) for name in conf.extra_values]) for name in conf.sections: if name not in conf.extra_values: out.extend(get_extra_values(conf[name], _prepend + (name,))) return out """*A programming language is a medium of expression.* - Paul Graham""" PK[a{{{#site-packages/rpmUtils/__init__.pycnu[ v_c@sdefdYZdS(t RpmUtilsErrorcBseZdZddZRS(s1 Exception thrown for anything rpmUtils related. cCstj||dS(N(t Exceptiont__init__(tselftargs((s5/usr/lib/python2.7/site-packages/rpmUtils/__init__.pyRsN(t__name__t __module__t__doc__tNoneR(((s5/usr/lib/python2.7/site-packages/rpmUtils/__init__.pyRsN(RR(((s5/usr/lib/python2.7/site-packages/rpmUtils/__init__.pytsPK[RO;O;#site-packages/rpmUtils/miscutils.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2003 Duke University import rpm import types import gzip import os import sys import locale import signal import rpmUtils.transaction def rpmOutToStr(arg): if type(arg) != types.StringType: # and arg is not None: arg = str(arg) return arg def compareEVR((e1, v1, r1), (e2, v2, r2)): # return 1: a is newer than b # 0: a and b are the same version # -1: b is newer than a if e1 is None: e1 = '0' else: e1 = str(e1) v1 = str(v1) r1 = str(r1) if e2 is None: e2 = '0' else: e2 = str(e2) v2 = str(v2) r2 = str(r2) #print '%s, %s, %s vs %s, %s, %s' % (e1, v1, r1, e2, v2, r2) rc = rpm.labelCompare((e1, v1, r1), (e2, v2, r2)) #print '%s, %s, %s vs %s, %s, %s = %s' % (e1, v1, r1, e2, v2, r2, rc) return rc def compareVerOnly(v1, v2): """compare version strings only using rpm vercmp""" return compareEVR(('', v1, ''), ('', v2, '')) def checkSig(ts, package, payload=False): """Takes a transaction set and a package, check it's sigs. By default, only v4 sigs (header-only) will be verified (faster). By setting payload to True, v3 sigs (header+payload) will also be verified (slower). return 0 if they are all fine return 1 if the gpg key can't be found return 2 if the header or payload is in someway damaged return 3 if the key is not trusted return 4 if the pkg is not gpg or pgp signed""" value = 0 currentflags = ts.setVSFlags(0) fdno = os.open(package, os.O_RDONLY) try: hdr = ts.hdrFromFdno(fdno) except rpm.error, e: if str(e) == "public key not availaiable": value = 1 if str(e) == "public key not available": value = 1 if str(e) == "public key not trusted": value = 3 if str(e) == "error reading package header": value = 2 else: error, siginfo = getSigInfo(hdr) if error == 101: os.close(fdno) del hdr value = 4 else: del hdr # Don't perform the payload check if the header check failed, otherwise we # could mask the reason stored in "value" (we only return one integer from # this function and shouldn't change that). if payload and value == 0: os.lseek(fdno, 0, 0) # We don't want the OK message to pollute the output but we do want the # BAD message (verbose version) in case of a failure, which is only # possible by running _verifySigs() twice (temporary hack until we have # the proper API for payload verification in RPM). rpm.setVerbosity(rpm.RPMLOG_WARNING) valid = ts._verifySigs(fdno, package) if not valid: value = 2 os.lseek(fdno, 0, 0) rpm.setVerbosity(rpm.RPMLOG_INFO) ts._verifySigs(fdno, package) rpm.setVerbosity(rpm.RPMLOG_NOTICE) try: os.close(fdno) except OSError, e: # if we're not opened, don't scream about it pass ts.setVSFlags(currentflags) # put things back like they were before return value def getSigInfo(hdr): """checks signature from an hdr hand back signature information and/or an error code""" locale.setlocale(locale.LC_ALL, 'C') string = '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|' siginfo = hdr.sprintf(string) if siginfo != '(none)': error = 0 sigtype, sigdate, sigid = siginfo.split(',') else: error = 101 sigtype = 'MD5' sigdate = 'None' sigid = 'None' infotuple = (sigtype, sigdate, sigid) return error, infotuple def pkgTupleFromHeader(hdr): """return a pkgtuple (n, a, e, v, r) from a hdr object, converts None epoch to 0, as well.""" name = hdr['name'] # RPMTAG_SOURCEPACKAGE: RPMTAG_SOURCERPM is not necessarily there for # e.g. gpg-pubkeys imported with older rpm versions # http://lists.baseurl.org/pipermail/yum/2009-January/022275.html if hdr[rpm.RPMTAG_SOURCERPM] or hdr[rpm.RPMTAG_SOURCEPACKAGE] != 1: arch = hdr['arch'] else: arch = 'src' ver = hdr['version'] rel = hdr['release'] epoch = hdr['epoch'] if epoch is None: epoch = '0' pkgtuple = (name, arch, epoch, ver, rel) return pkgtuple def rangeCheck(reqtuple, pkgtuple): """returns true if the package epoch-ver-rel satisfy the range requested in the reqtuple: ex: foo >= 2.1-1""" # we only ever get here if we have a versioned prco # nameonly shouldn't ever raise it #(reqn, reqf, (reqe, reqv, reqr)) = reqtuple (n, a, e, v, r) = pkgtuple return rangeCompare(reqtuple, (n, 'EQ', (e, v, r))) def rangeCompare(reqtuple, provtuple): """returns true if provtuple satisfies reqtuple""" (reqn, reqf, (reqe, reqv, reqr)) = reqtuple (n, f, (e, v, r)) = provtuple if reqn != n: return 0 # unversioned satisfies everything if not f or not reqf: return 1 # and you thought we were done having fun # if the requested release is left out then we have # to remove release from the package prco to make sure the match # is a success - ie: if the request is EQ foo 1:3.0.0 and we have # foo 1:3.0.0-15 then we have to drop the 15 so we can match if reqr is None: r = None if reqe is None: e = None if reqv is None: # just for the record if ver is None then we're going to segfault v = None # if we just require foo-version, then foo-version-* will match if r is None: reqr = None rc = compareEVR((e, v, r), (reqe, reqv, reqr)) # does not match unless if rc >= 1: if reqf in ['GT', 'GE', 4, 12, '>', '>=']: return 1 if reqf in ['EQ', 8, '=']: if f in ['LE', 10, 'LT', 2,'<=', '<']: return 1 if reqf in ['LE', 'LT', 'EQ', 10, 2, 8, '<=', '<', '=']: if f in ['LE', 'LT', 10, 2, '<=', '<']: return 1 if rc == 0: if reqf in ['GT', 4, '>']: if f in ['GT', 'GE', 4, 12, '>', '>=']: return 1 if reqf in ['GE', 12, '>=']: if f in ['GT', 'GE', 'EQ', 'LE', 4, 12, 8, 10, '>', '>=', '=', '<=']: return 1 if reqf in ['EQ', 8, '=']: if f in ['EQ', 'GE', 'LE', 8, 12, 10, '=', '>=', '<=']: return 1 if reqf in ['LE', 10, '<=']: if f in ['EQ', 'LE', 'LT', 'GE', 8, 10, 2, 12, '=', '<=', '<' , '>=']: return 1 if reqf in ['LT', 2, '<']: if f in ['LE', 'LT', 10, 2, '<=', '<']: return 1 if rc <= -1: if reqf in ['GT', 'GE', 'EQ', 4, 12, 8, '>', '>=', '=']: if f in ['GT', 'GE', 4, 12, '>', '>=']: return 1 if reqf in ['LE', 'LT', 10, 2, '<=', '<']: return 1 # if rc >= 1: # if reqf in ['GT', 'GE', 4, 12, '>', '>=']: # return 1 # if rc == 0: # if reqf in ['GE', 'LE', 'EQ', 8, 10, 12, '>=', '<=', '=']: # return 1 # if rc <= -1: # if reqf in ['LT', 'LE', 2, 10, '<', '<=']: # return 1 return 0 ########### # Title: Remove duplicates from a sequence # Submitter: Tim Peters # From: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560 def unique(s): """Return a list of the elements in s, but without duplicates. For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3], unique("abcabc") some permutation of ["a", "b", "c"], and unique(([1, 2], [2, 3], [1, 2])) some permutation of [[2, 3], [1, 2]]. For best speed, all sequence elements should be hashable. Then unique() will usually work in linear time. If not possible, the sequence elements should enjoy a total ordering, and if list(s).sort() doesn't raise TypeError it's assumed that they do enjoy a total ordering. Then unique() will usually work in O(N*log2(N)) time. If that's not possible either, the sequence elements must support equality-testing. Then unique() will usually work in quadratic time. """ n = len(s) if n == 0: return [] # Try using a dict first, as that's the fastest and will usually # work. If it doesn't work, it will usually fail quickly, so it # usually doesn't cost much to *try* it. It requires that all the # sequence elements be hashable, and support equality comparison. u = {} try: for x in s: u[x] = 1 except TypeError: del u # move on to the next method else: return u.keys() # We can't hash all the elements. Second fastest is to sort, # which brings the equal elements together; then duplicates are # easy to weed out in a single pass. # NOTE: Python's list.sort() was designed to be efficient in the # presence of many duplicate elements. This isn't true of all # sort functions in all languages or libraries, so this approach # is more effective in Python than it may be elsewhere. try: t = list(s) t.sort() except TypeError: del t # move on to the next method else: assert n > 0 last = t[0] lasti = i = 1 while i < n: if t[i] != last: t[lasti] = last = t[i] lasti += 1 i += 1 return t[:lasti] # Brute force is all that's left. u = [] for x in s: if x not in u: u.append(x) return u def splitFilename(filename): """ Pass in a standard style rpm fullname Return a name, version, release, epoch, arch, e.g.:: foo-1.0-1.i386.rpm returns foo, 1.0, 1, i386 1:bar-9-123a.ia64.rpm returns bar, 9, 123a, 1, ia64 """ if filename[-4:] == '.rpm': filename = filename[:-4] archIndex = filename.rfind('.') arch = filename[archIndex+1:] relIndex = filename[:archIndex].rfind('-') rel = filename[relIndex+1:archIndex] verIndex = filename[:relIndex].rfind('-') ver = filename[verIndex+1:relIndex] epochIndex = filename.find(':') if epochIndex == -1: epoch = '' else: epoch = filename[:epochIndex] name = filename[epochIndex + 1:verIndex] return name, ver, rel, epoch, arch def rpm2cpio(fdno, out=sys.stdout, bufsize=2048): """Performs roughly the equivalent of rpm2cpio(8). Reads the package from fdno, and dumps the cpio payload to out, using bufsize as the buffer size.""" ts = rpmUtils.transaction.initReadOnlyTransaction() hdr = ts.hdrFromFdno(fdno) del ts compr = hdr[rpm.RPMTAG_PAYLOADCOMPRESSOR] or 'gzip' #XXX FIXME #if compr == 'bzip2': # TODO: someone implement me! #el if compr != 'gzip': raise rpmUtils.RpmUtilsError, \ 'Unsupported payload compressor: "%s"' % compr f = gzip.GzipFile(None, 'rb', None, os.fdopen(fdno, 'rb', bufsize)) while 1: tmp = f.read(bufsize) if tmp == "": break out.write(tmp) f.close() def formatRequire (name, version, flags): ''' Return a human readable requirement string (ex. foobar >= 2.0) @param name: requirement name (ex. foobar) @param version: requirent version (ex. 2.0) @param flags: binary flags ( 0010 = equal, 0100 = greater than, 1000 = less than ) ''' s = name if flags and (type(flags) == type(0) or type(flags) == type(0L)): # Flag must be set and a int (or a long, now) if flags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER | rpm.RPMSENSE_EQUAL): s = s + " " if flags & rpm.RPMSENSE_LESS: s = s + "<" if flags & rpm.RPMSENSE_GREATER: s = s + ">" if flags & rpm.RPMSENSE_EQUAL: s = s + "=" if version: s = "%s %s" %(s, version) return s def flagToString(flags): flags = flags & 0xf if flags == 0: return None elif flags == 2: return 'LT' elif flags == 4: return 'GT' elif flags == 8: return 'EQ' elif flags == 10: return 'LE' elif flags == 12: return 'GE' return flags def stringToVersion(verstring): if verstring in [None, '']: return (None, None, None) i = verstring.find(':') if i != -1: try: epoch = str(long(verstring[:i])) except ValueError: # look, garbage in the epoch field, how fun, kill it epoch = '0' # this is our fallback, deal else: epoch = '0' j = verstring.find('-') if j != -1: if verstring[i + 1:j] == '': version = None else: version = verstring[i + 1:j] release = verstring[j + 1:] else: if verstring[i + 1:] == '': version = None else: version = verstring[i + 1:] release = None return (epoch, version, release) def hdrFromPackage(ts, package): """hand back the rpm header or raise an Error if the pkg is fubar""" try: fdno = os.open(package, os.O_RDONLY) except OSError, e: raise rpmUtils.RpmUtilsError, 'Unable to open file' # XXX: We should start a readonly ts here, so we don't get the options # from the other one (sig checking, etc) try: hdr = ts.hdrFromFdno(fdno) except rpm.error, e: os.close(fdno) raise rpmUtils.RpmUtilsError, "RPM Error opening Package" if type(hdr) != rpm.hdr: os.close(fdno) raise rpmUtils.RpmUtilsError, "RPM Error opening Package (type)" os.close(fdno) return hdr def checkSignals(): if hasattr(rpm, "checkSignals") and hasattr(rpm, 'signalsCaught'): if rpm.signalsCaught([signal.SIGINT, signal.SIGTERM, signal.SIGPIPE, signal.SIGQUIT, signal.SIGHUP]): sys.exit(1) PK[88site-packages/rpmUtils/arch.pynuȯ#!/usr/bin/python # import os import rpm import ctypes import struct _ppc64_native_is_best = True # dict mapping arch -> ( multicompat, best personality, biarch personality ) multilibArches = { "x86_64": ( "athlon", "x86_64", "athlon" ), "sparc64v": ( "sparcv9v", "sparcv9v", "sparc64v" ), "sparc64": ( "sparcv9", "sparcv9", "sparc64" ), "ppc64": ( "ppc", "ppc", "ppc64" ), "s390x": ( "s390", "s390x", "s390" ), } if _ppc64_native_is_best: multilibArches["ppc64"] = ( "ppc", "ppc64", "ppc64" ) arches = { # ia32 "athlon": "i686", "i686": "i586", "geode": "i686", "i586": "i486", "i486": "i386", "i386": "noarch", # amd64 "x86_64": "athlon", "amd64": "x86_64", "ia32e": "x86_64", #ppc64le "ppc64le": "noarch", # ppc "ppc64p7": "ppc64", "ppc64pseries": "ppc64", "ppc64iseries": "ppc64", "ppc64": "ppc", "ppc": "noarch", # s390{,x} "s390x": "s390", "s390": "noarch", # sparc "sparc64v": "sparcv9v", "sparc64": "sparcv9", "sparcv9v": "sparcv9", "sparcv9": "sparcv8", "sparcv8": "sparc", "sparc": "noarch", # alpha "alphaev7": "alphaev68", "alphaev68": "alphaev67", "alphaev67": "alphaev6", "alphaev6": "alphapca56", "alphapca56": "alphaev56", "alphaev56": "alphaev5", "alphaev5": "alphaev45", "alphaev45": "alphaev4", "alphaev4": "alpha", "alpha": "noarch", # arm "armv7l": "armv6l", "armv6l": "armv5tejl", "armv5tejl": "armv5tel", "armv5tel": "noarch", #arm hardware floating point "armv7hnl": "armv7hl", "armv7hl": "noarch", # arm64 "arm64": "noarch", # aarch64 "aarch64": "noarch", # super-h "sh4a": "sh4", "sh4": "noarch", "sh3": "noarch", #itanium "ia64": "noarch", } # Will contain information parsed from /proc/self/auxv via _parse_auxv(). # Should move into rpm really. _aux_vector = { "platform": "", "hwcap": 0, } def legitMultiArchesInSameLib(arch=None): # this is completely crackrock - if anyone has a better way I # am all ears arch = getBestArch(arch) if isMultiLibArch(arch): arch = getBaseArch(myarch=arch) results = [arch] if arch in ('x86_64', 'ppc64') or arch.startswith('sparcv9'): for (k, v) in arches.items(): if v == arch: results.append(k) return results def canCoinstall(arch1, arch2): """Take two arches and return True if it is possible that they can be installed together with the same nevr. Ex: arch1=i386 and arch2=i686 then it will return False. arch1=i386 and arch2=x86_64 will return True. It does not determine whether or not the arches make any sense. Just whether they could possibly install w/o conflict""" # if both are a multlibarch then we can't coinstall (x86_64, ia32e) # if both are not multilibarches then we can't coinstall (i386, i686) if 'noarch' in [arch1, arch2]: # noarch can never coinstall return False if isMultiLibArch(arch=arch1) == isMultiLibArch(arch=arch2): return False # this section keeps arch1=x86_64 arch2=ppc from returning True if arch1 in getArchList(arch2) or arch2 in getArchList(arch1): return True return False # this computes the difference between myarch and targetarch def archDifference(myarch, targetarch): if myarch == targetarch: return 1 if myarch in arches: ret = archDifference(arches[myarch], targetarch) if ret != 0: return ret + 1 return 0 return 0 def score(arch): return archDifference(canonArch, arch) def isMultiLibArch(arch=None): """returns true if arch is a multilib arch, false if not""" if arch is None: arch = canonArch if arch not in arches: # or we could check if it is noarch return 0 if arch in multilibArches: return 1 if arches[arch] in multilibArches: return 1 return 0 def getBestArchFromList(archlist, myarch=None): """ return the best arch from the list for myarch if - myarch is not given, then return the best arch from the list for the canonArch. """ if len(archlist) == 0: return None if myarch is None: myarch = canonArch mybestarch = getBestArch(myarch) bestarch = getBestArch(myarch) if bestarch != myarch: bestarchchoice = getBestArchFromList(archlist, bestarch) if bestarchchoice != None and bestarchchoice != "noarch": return bestarchchoice thisarch = archlist[0] for arch in archlist[1:]: val1 = archDifference(myarch, thisarch) val2 = archDifference(myarch, arch) if val1 == 0 and val2 == 0: continue if val1 < val2: if val1 == 0: thisarch = arch if val2 < val1: if val2 != 0: thisarch = arch if val1 == val2: pass # thisarch should now be our bestarch # one final check to make sure we're not returning a bad arch val = archDifference(myarch, thisarch) if val == 0: return None return thisarch def getArchList(thisarch=None): # this returns a list of archs that are compatible with arch given if not thisarch: thisarch = canonArch archlist = [thisarch] while thisarch in arches: thisarch = arches[thisarch] archlist.append(thisarch) # hack hack hack # sparc64v is also sparc64 compat if archlist[0] == "sparc64v": archlist.insert(1,"sparc64") # if we're a weirdo arch - add noarch on there. if len(archlist) == 1 and archlist[0] == thisarch: archlist.append('noarch') return archlist def _try_read_cpuinfo(): """ Try to read /proc/cpuinfo ... if we can't ignore errors (ie. proc not mounted). """ try: return open("/proc/cpuinfo", "r") except: return [] def _parse_auxv(): """ Read /proc/self/auxv and parse it into global dict for easier access later on, very similar to what rpm does. """ # In case we can't open and read /proc/self/auxv, just return try: data = open("/proc/self/auxv", "rb").read() except: return # Define values from /usr/include/elf.h AT_PLATFORM = 15 AT_HWCAP = 16 fmtlen = struct.calcsize("LL") offset = 0 platform = ctypes.c_char_p() # Parse the data and fill in _aux_vector dict while offset <= len(data) - fmtlen: at_type, at_val = struct.unpack_from("LL", data, offset) if at_type == AT_PLATFORM: platform.value = at_val _aux_vector["platform"] = platform.value if at_type == AT_HWCAP: _aux_vector["hwcap"] = at_val offset = offset + fmtlen def getCanonX86Arch(arch): # if arch == "i586": for line in _try_read_cpuinfo(): if line.startswith("model name"): if line.find("Geode(TM)") != -1: return "geode" break return arch # only athlon vs i686 isn't handled with uname currently if arch != "i686": return arch # if we're i686 and AuthenticAMD, then we should be an athlon for line in _try_read_cpuinfo(): if line.startswith("vendor") and line.find("AuthenticAMD") != -1: return "athlon" # i686 doesn't guarantee cmov, but we depend on it elif line.startswith("flags"): if line.find("cmov") == -1: return "i586" break return arch def getCanonARMArch(arch): # the %{_target_arch} macro in rpm will let us know the abi we are using target = rpm.expandMacro('%{_target_cpu}') if target.startswith('armv7h'): return target return arch def getCanonPPCArch(arch): # FIXME: should I do better handling for mac, etc? if arch != "ppc64": return arch machine = None for line in _try_read_cpuinfo(): if line.find("machine") != -1: machine = line.split(':')[1] break platform = _aux_vector["platform"] if machine is None and not platform: return arch try: if platform.startswith("power") and int(platform[5:].rstrip('+')) >= 7: return "ppc64p7" except: pass if machine is None: return arch if machine.find("CHRP IBM") != -1: return "ppc64pseries" if machine.find("iSeries") != -1: return "ppc64iseries" return arch def getCanonSPARCArch(arch): # Deal with sun4v, sun4u, sun4m cases SPARCtype = None for line in _try_read_cpuinfo(): if line.startswith("type"): SPARCtype = line.split(':')[1] break if SPARCtype is None: return arch if SPARCtype.find("sun4v") != -1: if arch.startswith("sparc64"): return "sparc64v" else: return "sparcv9v" if SPARCtype.find("sun4u") != -1: if arch.startswith("sparc64"): return "sparc64" else: return "sparcv9" if SPARCtype.find("sun4m") != -1: return "sparcv8" return arch def getCanonX86_64Arch(arch): if arch != "x86_64": return arch vendor = None for line in _try_read_cpuinfo(): if line.startswith("vendor_id"): vendor = line.split(':')[1] break if vendor is None: return arch if vendor.find("Authentic AMD") != -1 or vendor.find("AuthenticAMD") != -1: return "amd64" if vendor.find("GenuineIntel") != -1: return "ia32e" return arch def getCanonArch(skipRpmPlatform = 0): if not skipRpmPlatform and os.access("/etc/rpm/platform", os.R_OK): try: f = open("/etc/rpm/platform", "r") line = f.readline() f.close() (arch, vendor, opersys) = line.split("-", 2) return arch except: pass arch = os.uname()[4] _parse_auxv() if (len(arch) == 4 and arch[0] == "i" and arch[2:4] == "86"): return getCanonX86Arch(arch) if arch.startswith("arm"): return getCanonARMArch(arch) if arch.startswith("ppc"): return getCanonPPCArch(arch) if arch.startswith("sparc"): return getCanonSPARCArch(arch) if arch == "x86_64": return getCanonX86_64Arch(arch) return arch canonArch = getCanonArch() # this gets you the "compat" arch of a biarch pair def getMultiArchInfo(arch = canonArch): if arch in multilibArches: return multilibArches[arch] if arch in arches and arches[arch] != "noarch": return getMultiArchInfo(arch = arches[arch]) return None # get the best usual userspace arch for the arch we're on. this is # our arch unless we're on an arch that uses the secondary as its # userspace (eg ppc64, sparc64) def getBestArch(myarch=None): if myarch: arch = myarch else: arch = canonArch if arch.startswith("sparc64"): arch = multilibArches[arch][1] if arch.startswith("ppc64") and not _ppc64_native_is_best and arch != "ppc64le": arch = 'ppc' return arch def getBaseArch(myarch=None): """returns 'base' arch for myarch, if specified, or canonArch if not. base arch is the arch before noarch in the arches dict if myarch is not a key in the multilibArches.""" if not myarch: myarch = canonArch if myarch not in arches: # this is dumb, but return myarch if myarch.startswith("sparc64"): return "sparc" elif myarch == "ppc64le": return "ppc64le" elif myarch.startswith("ppc64") and not _ppc64_native_is_best: return "ppc" elif myarch.startswith("arm64"): return "arm64" elif myarch.startswith("armv7h"): return "armhfp" elif myarch.startswith("arm"): return "arm" if isMultiLibArch(arch=myarch): if myarch in multilibArches: return myarch else: return arches[myarch] if myarch in arches: basearch = myarch value = arches[basearch] while value != 'noarch': basearch = value value = arches[basearch] return basearch class ArchStorage(object): """class for keeping track of what arch we have set and doing various permutations based on it""" def __init__(self): self.canonarch = None self.basearch = None self.bestarch = None self.compatarches = [] self.archlist = [] self.multilib = False self.setup_arch() def setup_arch(self, arch=None, archlist_includes_compat_arch=True): if arch: self.canonarch = arch else: self.canonarch = canonArch self.basearch = getBaseArch(myarch=self.canonarch) self.archlist = getArchList(thisarch=self.canonarch) if not archlist_includes_compat_arch: # - do we bother including i686 and below on x86_64 limit_archlist = [] for a in self.archlist: if isMultiLibArch(a) or a == 'noarch': limit_archlist.append(a) self.archlist = limit_archlist self.bestarch = getBestArch(myarch=self.canonarch) self.compatarches = getMultiArchInfo(arch=self.canonarch) self.multilib = isMultiLibArch(arch=self.canonarch) self.legit_multi_arches = legitMultiArchesInSameLib(arch = self.canonarch) def get_best_arch_from_list(self, archlist, fromarch=None): if not fromarch: fromarch = self.canonarch return getBestArchFromList(archlist, myarch=fromarch) def score(self, arch): return archDifference(self.canonarch, arch) def get_arch_list(self, arch): if not arch: return self.archlist return getArchList(thisarch=arch) PK[Y:s"site-packages/rpmUtils/__init__.pynuȯ#!/usr/bin/python -tt class RpmUtilsError(Exception): """ Exception thrown for anything rpmUtils related. """ def __init__(self, args=None): Exception.__init__(self, args) PK[o'%site-packages/rpmUtils/transaction.pynuȯ#!/usr/bin/python # # Client code for Update Agent # Copyright (c) 1999-2002 Red Hat, Inc. Distributed under GPL. # # Adrian Likins # Some Edits by Seth Vidal # # a couple of classes wrapping up transactions so that we # can share transactions instead of creating new ones all over # import rpm import miscutils read_ts = None ts = None # wrapper/proxy class for rpm.Transaction so we can # instrument it, etc easily class TransactionWrapper: def __init__(self, root='/'): self.ts = rpm.TransactionSet(root) self._methods = ['check', 'order', 'addErase', 'addInstall', 'run', 'pgpImportPubkey', 'pgpPrtPkts', 'problems', 'setFlags', 'setVSFlags', 'setProbFilter', 'hdrFromFdno', 'next', 'clean', '_verifySigs'] self.tsflags = [] self.open = True def __del__(self): # Automatically close the rpm transaction when the reference is lost self.close() def close(self): if self.open: self.ts.closeDB() self.ts = None self.open = False def dbMatch(self, *args, **kwds): if 'patterns' in kwds: patterns = kwds.pop('patterns') else: patterns = [] mi = self.ts.dbMatch(*args, **kwds) for (tag, tp, pat) in patterns: mi.pattern(tag, tp, pat) return mi def __getattr__(self, attr): if attr in self._methods: return self.getMethod(attr) else: raise AttributeError, attr def __iter__(self): return self.ts def getMethod(self, method): # in theory, we can override this with # profile/etc info return getattr(self.ts, method) # push/pop methods so we dont lose the previous # set value, and we can potentiall debug a bit # easier def pushVSFlags(self, flags): self.tsflags.append(flags) self.ts.setVSFlags(self.tsflags[-1]) def popVSFlags(self): del self.tsflags[-1] self.ts.setVSFlags(self.tsflags[-1]) def addTsFlag(self, flag): curflags = self.ts.setFlags(0) self.ts.setFlags(curflags | flag) def getTsFlags(self): curflags = self.ts.setFlags(0) self.ts.setFlags(curflags) return curflags def isTsFlagSet(self, flag): val = self.getTsFlags() return bool(flag & val) def setScriptFd(self, fd): self.ts.scriptFd = fd.fileno() # def addProblemFilter(self, filt): # curfilter = self.ts.setProbFilter(0) # self.ts.setProbFilter(cutfilter | filt) def test(self, cb, conf={}): """tests the ts we've setup, takes a callback function and a conf dict for flags and what not""" origflags = self.getTsFlags() self.addTsFlag(rpm.RPMTRANS_FLAG_TEST) # FIXME GARBAGE - remove once this is reimplemented elsehwere # KEEPING FOR API COMPLIANCE ONLY if conf.get('diskspacecheck') == 0: self.ts.setProbFilter(rpm.RPMPROB_FILTER_DISKSPACE| rpm.RPMPROB_FILTER_DISKNODES) tserrors = self.ts.run(cb.callback, '') self.ts.setFlags(origflags) if tserrors is None: return [] if not tserrors: return ['Unknown error during transaction test in RPM'] reserrors = [] for (descr, (etype, mount, need)) in tserrors: reserrors.append(descr) return reserrors def returnLeafNodes(self, headers=False): """returns a list of package tuples (n,a,e,v,r) that are not required by any other package on the system If headers is True then it will return a list of (header, index) tuples """ req = {} orphan = [] mi = self.dbMatch() if mi is None: # this is REALLY unlikely but let's just say it for the moment return orphan # prebuild the req dict for h in mi: if h['name'] == 'gpg-pubkey': continue if not h[rpm.RPMTAG_REQUIRENAME]: continue tup = miscutils.pkgTupleFromHeader(h) for r in h[rpm.RPMTAG_REQUIRENAME]: if r not in req: req[r] = set() req[r].add(tup) mi = self.dbMatch() if mi is None: return orphan def _return_all_provides(hdr): """ Return all the provides, via yield. """ # These are done one by one, so that we get lazy loading for prov in hdr[rpm.RPMTAG_PROVIDES]: yield prov for prov in hdr[rpm.RPMTAG_FILENAMES]: yield prov for h in mi: if h['name'] == 'gpg-pubkey': continue preq = 0 tup = miscutils.pkgTupleFromHeader(h) for p in _return_all_provides(h): if p in req: # Don't count a package that provides its require s = req[p] if len(s) > 1 or tup not in s: preq = preq + 1 break if preq == 0: if headers: orphan.append((h, mi.instance())) else: orphan.append(tup) return orphan def initReadOnlyTransaction(root='/'): read_ts = TransactionWrapper(root=root) read_ts.pushVSFlags((rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) return read_ts PK[lbm44#site-packages/rpmUtils/oldUtils.pycnu[ v_c@s_ddlZddlZddlZddlZddlZddlmZmZddlmZddl m Z dZ e Z dZdZdd Zd Zd Zd Zd ZdZdZddgZdejfdYZdddZdddYZdefdYZdefdYZdddYZdS( iN(twrite32utFNAME(t URLGrabError(terrorcCstj|IJdS(N(tsyststderr(tnumtmsg((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pytlog scCs|S(N((R((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt_scCst|}d}|jdkr*d}n-||jksN||jkrWd}n|rtdtd||fndS(scheck a header by opening it and comparing the results to the name and arch we believe it to be for. if it fails raise URLGrabError(-1)iiis1Header cannot be opened or does not match %s, %s.N(t Header_WorkthdrtNonetnametarchRR (t headerfileR Rthtfail((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt checkheaders  $ "icCstjdtj|tj}ytj|Wntjk rQ}d}nXd}tj|tjd|r|st dt d|qdSn|SdS(sdtake a package, check it out by trying to open it, return 1 if it's good return 0 if it's nottmd5iitdefaultisRPM %s fails md5 checkN( ttst sigCheckingtostopentO_RDONLYt hdrFromFdnotrpmRtcloseRR (tpackaget urlgraberrortfdnotetgood((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt checkRpmMD5%s    cCstjdtj|tj}ytj|}Wnntjk r}t|dkr`dSt|dkrvdSt|dkrdSt|dkrdSn6Xt |\}}|d krtj |~d S~tj |d S( s take a package, check it's sigs, return 0 if they are all fine, return 1 if the gpg key can't be found, 2 if the header is in someway damaged, 3 if the key is not trusted, 4 if the pkg is not gpg or pgp signedRspublic key not availaiableispublic key not availablespublic key not trustediserror reading package headeriieii( RRRRRRRRtstrt getSigInfoR(RRR R Rtsiginfo((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pytcheckSig;s*    cCssd}|j|}|dkrBd}|jd\}}}nd}d}d}d}|||f}||fS(sEchecks if a computerhand back signature information and an error codes%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|s(none)it,ietMD5R (tsprintftsplit(R tstringR%Rtsigtypetsigdatetsigidt infotuple((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyR$Ws cCsXg}|tj}|dkr"n2t|tjkrG|j|n |j||S(N(RtRPMTAG_PROVIDENAMER ttypettypestListTypetextendtappend(theadert provnamestprovides((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt getProvidesgs   c Cs|\}}}|\}}}d}||}||}||}||}||}||}tj|||f|||f} tdd||||||| f| S(NcSs4t|tjkr0|dkr0t|}n|S(N(R1R2t StringTypeR R#(targ((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt rpmOutToStrvs!is%s, %s, %s vs %s, %s, %s = %s(Rt labelCompareR( t.0t.1te1tv1tr1te2tv2tr2R<trc((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt compareEVRrs       $&cCs|r|tjtjBtjB@r.|d}n|tj@rH|d}n|tj@rb|d}n|tj@r|d}|d|}qn|S(Nt tt=s %s(Rt RPMSENSE_LESStRPMSENSE_GREATERtRPMSENSE_EQUAL(R tversiontflags((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt formatRequires       cCsFytjtj}Wn)tjk rA}tdtdnX|S(NisFCould not open RPM database for reading. Perhaps it is already in use?(RtTransactionSettconft installrootRterrorlogR (tdbR ((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt openrpmdbs tGzipFileRcBseZdZRS(cCs|jjd|jjd|jd }d}|rBt}n|jjt|t|jtd|jjd|jjd|r|jj|dndS(Nssiisst(tfileobjtwritetfilenameRtchrRtlong(tselftfnameRP((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt_write_gzip_headers  (t__name__t __module__Ra(((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRXstrbi cCst|||S(N(RX(R\tmodet compresslevel((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt _gzipOpenst RPM_Base_WorkcBskeZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( cCs d|_dS(N(R R (R_((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt__init__scCs=|jdkr2tdtdtjdn|j|S(Nis-Got an empty Header, something has gone wrongi(R R RUR Rtexit(R_ttag((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt_getTagscCs!|jddkrdSdSdS(Nt sourcepackageii(Rl(R_((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pytisSourcescCs |jdS(NR (Rl(R_((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyR scCs |jdS(NR(Rl(R_((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRscCs |jdS(Ntepoch(Rl(R_((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRoscCs |jdS(NRO(Rl(R_((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyROscCs |jdS(Ntrelease(Rl(R_((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRpscCs:|jd}|jd}|jd}|||fS(NRoRORp(Rl(R_R tvtr((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pytevrscCs^|jd}|jd}|jd}|jd}|jd}|||||fS(NR RoRORpR(Rl(R_tnR RqRrta((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pytnevras c Cs|j\}}}}}|dkr0d}n|jrXd|||||f}nd||||||f}|rt|d} nt|d} | j|jjd| j|S(Nt0s%s/%s-%s-%s-%s.src.hdrs%s/%s-%s-%s-%s.%s.hdrtwi( RvR RnRgRR[R tunloadR( R_t headerdirtcompressR RotvertrelRtheaderfnt headerout((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt writeHeaders    ( RbRcRiRlRnR RRoRORpRsRvR(((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRhs          R cBseZdZdZRS(sfor operating on hdrs in and out of the rpmdb if the first arg is a string then it's a filename otherwise it's an rpm hdrcCslt|tjkrYyetj|d}ytj|j}Wn3tjk rx}t dt d|d}nXWnt k r}t|d}ytj|j}WqLtjk r}t dt d|d}qLXn_t k r}t dt d|d}n0tk rK}t dt d|d}nX|jn|}||_dS(NRrisDamaged Header %s(R1R2R:tgzipRRt headerLoadtreadRRUR R tIOErrort ValueErrort zlibErrorRR (R_R6tfdRR ((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRis0    (RbRct__doc__Ri(((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyR stRPM_WorkcBseZdZRS(cCstjtjtj|tj}ytj||_Wn<tj k rz}t dt d||fd|_nXtj |dS(NisError opening rpm %s - error %s(Rt setVSFlagsRt_RPMVSF_NOSIGNATURESRRRRR RRUR R R(R_trpmfnRR ((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRis (RbRcRi(((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRst Rpm_Ts_WorkcBs>eZdZddZdZddddZdZRS(sThis should operate on groups of headers/matches/etc in the rpmdb - ideally it will operate with a list of the Base objects above, so I can refer to any one object there not sure the best way to do this yet, more thinking involvedt/c Csy+tjr*tjdkr*tj}q*nWntk r@}nXtj||_dddddddd d d d g |_dS( NRt addInstalltaddErasetruntchecktorderRtcloseDBtdbMatchtsetFlagsRt setProbFilter(RSRTt NameErrorRRRRtmethods(R_tdbPathR ((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRi!s cCs,||jkrt|j|St|dS(N(RtgetattrRtAttributeError(R_t attribute((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyt __getattr__.scCsOg}|dkr<|dkr<|dkr<|jj}n|dkr`|jj||}n|dkr|jj}|j|tj|n|dkr|jj}|j|tj|nY|dkr|jj}|j|tj|n%|jj}|j|tj|x'|D]}t |}|j |q(W|S(s(hands back a list of Header_Work objectstglobtregextstrcmpN( R RRtpatternRt RPMMIRE_GLOBt RPMMIRE_REGEXtRPMMIRE_STRCMPtRPMMIRE_DEFAULTR R5(R_RktsearchtmirethwlistthdrlistR thdrobj((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pytmatch4s($      cCs||dkr*|jjtjtjBnN|dkrM|jjtjn+|dkro|jjtjn t|dS(sApass type of check you want to occur, default is to have them offRtnoneRN(RRRt RPMVSF_NOMD5tRPMVSF_NEEDPAYLOADRtRPMVSF_DEFAULTR(R_tsig((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRSs   N(RbRcRRiRR RR(((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyRs  (((RR2RRRRRturlgrabber.grabberRtzlibRRRRUR RR"R&R$R9RGRQRWt__all__RXRgRhR RR(((s5/usr/lib/python2.7/site-packages/rpmUtils/oldUtils.pyts2              A  PK[p//site-packages/rpmUtils/arch.pycnu[ v_c@sddlZddlZddlZddlZeZidHd6dId6dJd6dKd 6dLd 6ZerrdMed Zd?Zd@ZdAZd2dBZeZedCZddDZddEZdFefdGYZdS(NiNtathlontx86_64tsparcv9vtsparc64vtsparcv9tsparc64tppctppc64ts390ts390xti686ti586tgeodeti486ti386tnoarchtamd64tia32etppc64letppc64p7t ppc64pseriest ppc64iseriestsparcv8tsparct alphaev68talphaev7t alphaev67talphaev6t alphapca56t alphaev56talphaev5t alphaev45talphaev4talphatarmv6ltarmv7lt armv5tejltarmv5teltarmv7hltarmv7hnltarm64taarch64tsh4tsh4atsh3tia64ttplatformithwcapcCst|}t|r*td|}n|g}|dksN|jdrx9tjD](\}}||kr[|j|q[q[Wn|S(NtmyarchRRR(RR(t getBestArchtisMultiLibArcht getBaseArcht startswithtarchestitemstappend(tarchtresultstktv((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pytlegitMultiArchesInSameLibes    cCsdd||gkrtStd|td|kr8tS|t|ks\|t|kr`tStS(sbTake two arches and return True if it is possible that they can be installed together with the same nevr. Ex: arch1=i386 and arch2=i686 then it will return False. arch1=i386 and arch2=x86_64 will return True. It does not determine whether or not the arches make any sense. Just whether they could possibly install w/o conflictRR9(tFalseR3t getArchListtTrue(tarch1tarch2((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyt canCoinstallvs $cCsK||krdS|tkrGtt||}|dkrC|dSdSdS(Nii(R6tarchDifference(R1t targetarchtret((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyRDs   cCs tt|S(N(RDt canonArch(R9((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pytscorescCsM|dkrt}n|tkr%dS|tkr5dSt|tkrIdSdS(s5returns true if arch is a multilib arch, false if notiiN(tNoneRGR6tmultilibArches(R9((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyR3s    c CsRt|dkrdS|dkr+t}nt|}t|}||kr}t||}|dkr}|dkr}|Sn|d}x|dD]}t||}t||}|dkr|dkrqn||kr|dkr|}qn||kr|dkr|}qn||krqqWt||} | dkrNdS|S(s return the best arch from the list for myarch if - myarch is not given, then return the best arch from the list for the canonArch. iRiN(tlenRIRGR2tgetBestArchFromListRD( tarchlistR1t mybestarchtbestarchtbestarchchoicetthisarchR9tval1tval2tval((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyRLs8              cCs|st}n|g}x'|tkrAt|}|j|qW|ddkre|jddnt|dkr|d|kr|jdn|S(NiRiRR(RGR6R8tinsertRK(RQRM((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyR?s   "cCs ytddSWngSXdS(sY Try to read /proc/cpuinfo ... if we can't ignore errors (ie. proc not mounted). s /proc/cpuinfotrN(topen(((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyt_try_read_cpuinfoscCsytddj}WndSXd}d}tjd}d}tj}x}|t||krtjd||\}}||kr||_|jt dtmultilibt setup_arch(tself((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyt__init__s      cCs|r||_n t|_td|j|_td|j|_|sg}x9|jD].}t|sy|dkr[|j|q[q[W||_ntd|j|_ t d|j|_ td|j|_ t d|j|_dS(NR1RQRR9(RRGR4RR?RMR3R8R2RORRRR=tlegit_multi_arches(RR9tarchlist_includes_compat_archtlimit_archlistta((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyRs   cCs"|s|j}nt|d|S(NR1(RRL(RRMtfromarch((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pytget_best_arch_from_lists cCst|j|S(N(RDR(RR9((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyRHscCs|s |jStd|S(NRQ(RMR?(RR9((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyt get_arch_listsN( t__name__t __module__t__doc__RRIR@RRRHR(((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyRs    (sathlonsx86_64sathlon(ssparcv9vssparcv9vssparc64v(ssparcv9ssparcv9ssparc64(sppcsppcsppc64(RR R(sppcsppc64sppc64(RRsR^R\R@RRJR6RbRIR=RCRDRHR3RLR?RXRjRqRvRRRRRGRR2R4tobjectR(((s1/usr/lib/python2.7/site-packages/rpmUtils/arch.pyts              ,            (PK[a*N.6x6x!site-packages/rpmUtils/updates.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2004 Duke University import rpmUtils import rpmUtils.miscutils import rpmUtils.arch def _vertup_cmp(tup1, tup2): return rpmUtils.miscutils.compareEVR(tup1, tup2) class Updates: """ This class computes and keeps track of updates and obsoletes. initialize, add installed packages, add available packages (both as unique lists of name, arch, ver, rel, epoch tuples), add an optional dict of obsoleting packages with obsoletes and what they obsolete ie:: foo, i386, 0, 1.1, 1: bar >= 1.1. """ def __init__(self, instlist, availlist): self.installed = instlist # list of installed pkgs (n, a, e, v, r) self.available = availlist # list of available pkgs (n, a, e, v, r) self.rawobsoletes = {} # dict of obsoleting package->[what it obsoletes] self._obsoletes_by_name = None self.obsoleted_dict = {} # obsoleted pkgtup -> [ obsoleting pkgtups ] self.obsoleting_dict = {} # obsoleting pkgtup -> [ obsoleted pkgtups ] self.exactarch = 1 # don't change archs by default self.exactarchlist = set(['kernel', 'kernel-smp', 'glibc', 'kernel-hugemem', 'kernel-enterprise', 'kernel-bigmem', 'kernel-BOOT']) self.myarch = rpmUtils.arch.canonArch # set this if you want to # test on some other arch # otherwise leave it alone self._is_multilib = rpmUtils.arch.isMultiLibArch(self.myarch) self._archlist = rpmUtils.arch.getArchList(self.myarch) self._multilib_compat_arches = rpmUtils.arch.getMultiArchInfo(self.myarch) # make some dicts from installed and available self.installdict = self.makeNADict(self.installed, 1) self.availdict = self.makeNADict(self.available, 0, # Done in doUpdate filter=self.installdict) # holder for our updates dict self.updatesdict = {} self.updating_dict = {} #debug, ignore me self.debug = 0 self.obsoletes = {} def _delFromDict(self, dict_, keys, value): for key in keys: if key not in dict_: continue dict_[key] = filter(value.__ne__, dict_[key]) if not dict_[key]: del dict_[key] def _delFromNADict(self, dict_, pkgtup): (n, a, e, v, r) = pkgtup for aa in (a, None): if (n, aa) in dict_: dict_[(n, aa)] = filter((e,v,r).__ne__, dict_[(n, aa)]) if not dict_[(n, aa)]: del dict_[(n, aa)] def delPackage(self, pkgtup): """remove available pkgtup that is no longer available""" if pkgtup not in self.available: return self.available.remove(pkgtup) self._delFromNADict(self.availdict, pkgtup) self._delFromDict(self.updating_dict, self.updatesdict.get(pkgtup, []), pkgtup) self._delFromDict(self.updatesdict, self.updating_dict.get(pkgtup, []), pkgtup) if pkgtup in self.rawobsoletes: if self._obsoletes_by_name: for name, flag, version in self.rawobsoletes[pkgtup]: self._delFromDict(self._obsoletes_by_name, [name], (flag, version, pkgtup)) del self.rawobsoletes[pkgtup] self._delFromDict(self.obsoleted_dict, self.obsoleting_dict.get(pkgtup, []), pkgtup) self._delFromDict(self.obsoleting_dict, self.obsoleted_dict.get(pkgtup, []), pkgtup) def debugprint(self, msg): if self.debug: print msg def makeNADict(self, pkglist, Nonelists, filter=None): """return lists of (e,v,r) tuples as value of a dict keyed on (n, a) optionally will return a (n, None) entry with all the a for that n in tuples of (a,e,v,r)""" returndict = {} for (n, a, e, v, r) in pkglist: if filter and (n, None) not in filter: continue if (n, a) not in returndict: returndict[(n, a)] = [] if (e,v,r) in returndict[(n, a)]: continue returndict[(n, a)].append((e,v,r)) if Nonelists: if (n, None) not in returndict: returndict[(n, None)] = [] if (a,e,v,r) in returndict[(n, None)]: continue returndict[(n, None)].append((a, e, v, r)) return returndict def returnNewest(self, evrlist): """takes a list of (e, v, r) tuples and returns the newest one""" if len(evrlist)==0: raise rpmUtils.RpmUtilsError, "Zero Length List in returnNewest call" if len(evrlist)==1: return evrlist[0] (new_e, new_v, new_r) = evrlist[0] # we'll call the first ones 'newest' for (e, v, r) in evrlist[1:]: rc = rpmUtils.miscutils.compareEVR((e, v, r), (new_e, new_v, new_r)) if rc > 0: new_e = e new_v = v new_r = r return (new_e, new_v, new_r) def returnHighestVerFromAllArchsByName(self, name, archlist, pkglist): """returns a list of package tuples in a list (n, a, e, v, r) takes a package name, a list of archs, and a list of pkgs in (n, a, e, v, r) form.""" returnlist = [] high_vertup = None for pkgtup in pkglist: (n, a, e, v, r) = pkgtup # FIXME: returnlist used to _possibly_ contain things not in # archlist ... was that desired? if name == n and a in archlist: vertup = (e, v, r) if (high_vertup is None or (_vertup_cmp(high_vertup, vertup) < 0)): high_vertup = vertup returnlist = [] if vertup == high_vertup: returnlist.append(pkgtup) return returnlist def condenseUpdates(self): """remove any accidental duplicates in updates""" for tup in self.updatesdict: if len(self.updatesdict[tup]) > 1: mylist = self.updatesdict[tup] self.updatesdict[tup] = rpmUtils.miscutils.unique(mylist) def checkForObsolete(self, pkglist, newest=1): """accept a list of packages to check to see if anything obsoletes them return an obsoleted_dict in the format of makeObsoletedDict""" if self._obsoletes_by_name is None: self._obsoletes_by_name = {} for pkgtup, obsoletes in self.rawobsoletes.iteritems(): for name, flag, version in obsoletes: self._obsoletes_by_name.setdefault(name, []).append( (flag, version, pkgtup) ) obsdict = {} # obseleting package -> [obsoleted package] for pkgtup in pkglist: name = pkgtup[0] for obs_flag, obs_version, obsoleting in self._obsoletes_by_name.get(name, []): if obs_flag in [None, 0] and name == obsoleting[0]: continue if rpmUtils.miscutils.rangeCheck( (name, obs_flag, obs_version), pkgtup): obsdict.setdefault(obsoleting, []).append(pkgtup) if not obsdict: return {} obslist = obsdict.keys() if newest: obslist = self._reduceListNewestByNameArch(obslist) returndict = {} for new in obslist: for old in obsdict[new]: if old not in returndict: returndict[old] = [] returndict[old].append(new) return returndict def doObsoletes(self): """figures out what things available obsolete things installed, returns them in a dict attribute of the class.""" obsdict = {} # obseleting package -> [obsoleted package] # this needs to keep arch in mind # if foo.i386 obsoletes bar # it needs to obsoletes bar.i386 preferentially, not bar.x86_64 # if there is only one bar and only one foo then obsolete it, but try to # match the arch. # look through all the obsoleting packages look for multiple archs per name # if you find it look for the packages they obsolete # obs_arches = {} for (n, a, e, v, r) in self.rawobsoletes: if n not in obs_arches: obs_arches[n] = [] obs_arches[n].append(a) for pkgtup in self.rawobsoletes: (name, arch, epoch, ver, rel) = pkgtup for (obs_n, flag, (obs_e, obs_v, obs_r)) in self.rawobsoletes[(pkgtup)]: if (obs_n, None) in self.installdict: for (rpm_a, rpm_e, rpm_v, rpm_r) in self.installdict[(obs_n, None)]: if flag in [None, 0] or \ rpmUtils.miscutils.rangeCheck((obs_n, flag, (obs_e, obs_v, obs_r)), (obs_n, rpm_a, rpm_e, rpm_v, rpm_r)): # make sure the obsoleting pkg is not already installed willInstall = 1 if (name, None) in self.installdict: for (ins_a, ins_e, ins_v, ins_r) in self.installdict[(name, None)]: pkgver = (epoch, ver, rel) installedver = (ins_e, ins_v, ins_r) if self.returnNewest((pkgver, installedver)) == installedver: willInstall = 0 break if rpm_a != arch and rpm_a in obs_arches[name]: willInstall = 0 if willInstall: if pkgtup not in obsdict: obsdict[pkgtup] = [] obsdict[pkgtup].append((obs_n, rpm_a, rpm_e, rpm_v, rpm_r)) self.obsoletes = obsdict self.makeObsoletedDict() def makeObsoletedDict(self): """creates a dict of obsoleted packages -> [obsoleting package], this is to make it easier to look up what package obsoletes what item in the rpmdb""" self.obsoleted_dict = {} for new in self.obsoletes: for old in self.obsoletes[new]: if old not in self.obsoleted_dict: self.obsoleted_dict[old] = [] self.obsoleted_dict[old].append(new) self.obsoleting_dict = {} for obsoleted, obsoletings in self.obsoleted_dict.iteritems(): for obsoleting in obsoletings: self.obsoleting_dict.setdefault(obsoleting, []).append(obsoleted) def doUpdates(self): """check for key lists as populated then commit acts of evil to determine what is updated and/or obsoleted, populate self.updatesdict """ # best bet is to chew through the pkgs and throw out the new ones early # then deal with the ones where there are a single pkg installed and a # single pkg available # then deal with the multiples # we should take the whole list as a 'newlist' and remove those entries # which are clearly: # 1. updates # 2. identical to the ones in ourdb # 3. not in our archdict at all simpleupdate = [] complexupdate = [] updatedict = {} # (old n, a, e, v, r) : [(new n, a, e, v, r)] # make the new ones a list b/c while we _shouldn't_ # have multiple updaters, we might and well, it needs # to be solved one way or the other newpkgs = self.availdict archlist = self._archlist for (n, a) in newpkgs.keys(): if a not in archlist: # high log here del newpkgs[(n, a)] continue # remove the older stuff - if we're doing an update we only want the # newest evrs for (n, a) in newpkgs: (new_e,new_v,new_r) = self.returnNewest(newpkgs[(n, a)]) for (e, v, r) in newpkgs[(n, a)][:]: if (new_e, new_v, new_r) != (e, v, r): newpkgs[(n, a)].remove((e, v, r)) for (n, a) in newpkgs: # simple ones - look for exact matches or older stuff if (n, a) in self.installdict: for (rpm_e, rpm_v, rpm_r) in self.installdict[(n, a)]: try: (e, v, r) = self.returnNewest(newpkgs[(n,a)]) except rpmUtils.RpmUtilsError: continue else: rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) if rc <= 0: try: newpkgs[(n, a)].remove((e, v, r)) except ValueError: pass # Now we add the (n, None) entries back... for na in newpkgs.keys(): all_arches = map(lambda x: (na[1], x[0], x[1], x[2]), newpkgs[na]) newpkgs.setdefault((na[0], None), []).extend(all_arches) # get rid of all the empty dict entries: for nakey in newpkgs.keys(): if len(newpkgs[nakey]) == 0: del newpkgs[nakey] # ok at this point our newpkgs list should be thinned, we should have only # the newest e,v,r's and only archs we can actually use for (n, a) in newpkgs: if a is None: # the None archs are only for lookups continue if (n, None) in self.installdict: installarchs = [] availarchs = [] for (a, e, v ,r) in newpkgs[(n, None)]: availarchs.append(a) for (a, e, v, r) in self.installdict[(n, None)]: installarchs.append(a) if len(availarchs) > 1 or len(installarchs) > 1: self.debugprint('putting %s in complex update' % n) complexupdate.append(n) else: #log(4, 'putting %s in simple update list' % name) self.debugprint('putting %s in simple update' % n) simpleupdate.append((n, a)) # we have our lists to work with now # simple cases for (n, a) in simpleupdate: # try to be as precise as possible if n in self.exactarchlist: if (n, a) in self.installdict: (rpm_e, rpm_v, rpm_r) = self.returnNewest(self.installdict[(n, a)]) if (n, a) in newpkgs: (e, v, r) = self.returnNewest(newpkgs[(n, a)]) rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) if rc > 0: # this is definitely an update - put it in the dict if (n, a, rpm_e, rpm_v, rpm_r) not in updatedict: updatedict[(n, a, rpm_e, rpm_v, rpm_r)] = [] updatedict[(n, a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) else: # we could only have 1 arch in our rpmdb and 1 arch of pkg # available - so we shouldn't have to worry about the lists, here # we just need to find the arch of the installed pkg so we can # check it's (e, v, r) (rpm_a, rpm_e, rpm_v, rpm_r) = self.installdict[(n, None)][0] if (n, None) in newpkgs: for (a, e, v, r) in newpkgs[(n, None)]: rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) if rc > 0: # this is definitely an update - put it in the dict if (n, rpm_a, rpm_e, rpm_v, rpm_r) not in updatedict: updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = [] updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) # complex cases # we're multilib/biarch # we need to check the name.arch in two different trees # one for the multiarch itself and one for the compat arch # ie: x86_64 and athlon(i686-i386) - we don't want to descend # x86_64->i686 # however, we do want to descend x86_64->noarch, sadly. archlists = [] if self._is_multilib: if self.myarch in rpmUtils.arch.multilibArches: biarches = [self.myarch] else: biarches = [self.myarch, rpmUtils.arch.arches[self.myarch]] biarches.append('noarch') multicompat = self._multilib_compat_arches[0] multiarchlist = rpmUtils.arch.getArchList(multicompat) archlists = [ set(biarches), set(multiarchlist) ] # archlists = [ biarches, multiarchlist ] else: archlists = [ set(archlist) ] # archlists = [ archlist ] for n in complexupdate: for thisarchlist in archlists: # we need to get the highest version and the archs that have it # of the installed pkgs tmplist = [] for (a, e, v, r) in self.installdict[(n, None)]: tmplist.append((n, a, e, v, r)) highestinstalledpkgs = self.returnHighestVerFromAllArchsByName(n, thisarchlist, tmplist) hipdict = self.makeNADict(highestinstalledpkgs, 0) if n in self.exactarchlist: tmplist = [] for (a, e, v, r) in newpkgs[(n, None)]: tmplist.append((n, a, e, v, r)) highestavailablepkgs = self.returnHighestVerFromAllArchsByName(n, thisarchlist, tmplist) hapdict = self.makeNADict(highestavailablepkgs, 0) for (n, a) in hipdict: if (n, a) in hapdict: self.debugprint('processing %s.%s' % (n, a)) # we've got a match - get our versions and compare (rpm_e, rpm_v, rpm_r) = hipdict[(n, a)][0] # only ever going to be first one (e, v, r) = hapdict[(n, a)][0] # there can be only one rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) if rc > 0: # this is definitely an update - put it in the dict if (n, a, rpm_e, rpm_v, rpm_r) not in updatedict: updatedict[(n, a, rpm_e, rpm_v, rpm_r)] = [] updatedict[(n, a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) else: self.debugprint('processing %s' % n) # this is where we have to have an arch contest if there # is more than one arch updating with the highest ver instarchs = [] for (n,a) in hipdict: instarchs.append(a) rpm_a = rpmUtils.arch.getBestArchFromList(instarchs, myarch=self.myarch) if rpm_a is None: continue tmplist = [] for (a, e, v, r) in newpkgs[(n, None)]: tmplist.append((n, a, e, v, r)) highestavailablepkgs = self.returnHighestVerFromAllArchsByName(n, thisarchlist, tmplist) hapdict = self.makeNADict(highestavailablepkgs, 0) availarchs = [] for (n,a) in hapdict: availarchs.append(a) a = rpmUtils.arch.getBestArchFromList(availarchs, myarch=self.myarch) if a is None: continue (rpm_e, rpm_v, rpm_r) = hipdict[(n, rpm_a)][0] # there can be just one (e, v, r) = hapdict[(n, a)][0] # just one, I'm sure, I swear! rc = rpmUtils.miscutils.compareEVR((e, v, r), (rpm_e, rpm_v, rpm_r)) if rc > 0: # this is definitely an update - put it in the dict if (n, rpm_a, rpm_e, rpm_v, rpm_r) not in updatedict: updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)] = [] updatedict[(n, rpm_a, rpm_e, rpm_v, rpm_r)].append((n, a, e, v, r)) self.updatesdict = updatedict self.makeUpdatingDict() def makeUpdatingDict(self): """creates a dict of available packages -> [installed package], this is to make it easier to look up what package will be updating what in the rpmdb""" self.updating_dict = {} for old in self.updatesdict: for new in self.updatesdict[old]: if new not in self.updating_dict: self.updating_dict[new] = [] self.updating_dict[new].append(old) def reduceListByNameArch(self, pkglist, name=None, arch=None): """returns a set of pkg naevr tuples reduced based on name or arch""" returnlist = [] if name or arch: for (n, a, e, v, r) in pkglist: if name: if name == n: returnlist.append((n, a, e, v, r)) continue if arch: if arch == a: returnlist.append((n, a, e, v, r)) continue else: returnlist = pkglist return returnlist def getUpdatesTuples(self, name=None, arch=None): """returns updates for packages in a list of tuples of: (updating naevr, installed naevr)""" returnlist = [] for oldtup in self.updatesdict: for newtup in self.updatesdict[oldtup]: returnlist.append((newtup, oldtup)) # self.reduceListByNameArch() for double tuples tmplist = [] if name: for ((n, a, e, v, r), oldtup) in returnlist: if name != n: tmplist.append(((n, a, e, v, r), oldtup)) if arch: for ((n, a, e, v, r), oldtup) in returnlist: if arch != a: tmplist.append(((n, a, e, v, r), oldtup)) for item in tmplist: try: returnlist.remove(item) except ValueError: pass return returnlist def getUpdatesList(self, name=None, arch=None): """returns updating packages in a list of (naevr) tuples""" returnlist = [] for oldtup in self.updatesdict: for newtup in self.updatesdict[oldtup]: returnlist.append(newtup) returnlist = self.reduceListByNameArch(returnlist, name, arch) return returnlist # NOTE: This returns obsoleters and obsoletees, but narrows based on # _obsoletees_ (unlike getObsoletesList). Look at getObsoletersTuples def getObsoletesTuples(self, newest=0, name=None, arch=None): """returns obsoletes for packages in a list of tuples of: (obsoleting naevr, installed naevr). You can specify name and/or arch of the installed package to narrow the results. You can also specify newest=1 to get the set of newest pkgs (name, arch) sorted, that obsolete something""" tmplist = [] obslist = self.obsoletes.keys() if newest: obslist = self._reduceListNewestByNameArch(obslist) for obstup in obslist: for rpmtup in self.obsoletes[obstup]: tmplist.append((obstup, rpmtup)) # self.reduceListByNameArch() for double tuples returnlist = [] if name or arch: for (obstup, (n, a, e, v, r)) in tmplist: if name: if name == n: returnlist.append((obstup, (n, a, e, v, r))) continue if arch: if arch == a: returnlist.append((obstup, (n, a, e, v, r))) continue else: returnlist = tmplist return returnlist # NOTE: This returns obsoleters and obsoletees, but narrows based on # _obsoleters_ (like getObsoletesList). def getObsoletersTuples(self, newest=0, name=None, arch=None): """returns obsoletes for packages in a list of tuples of: (obsoleting naevr, installed naevr). You can specify name and/or arch of the obsoleting package to narrow the results. You can also specify newest=1 to get the set of newest pkgs (name, arch) sorted, that obsolete something""" tmplist = [] obslist = self.obsoletes.keys() if newest: obslist = self._reduceListNewestByNameArch(obslist) for obstup in obslist: for rpmtup in self.obsoletes[obstup]: tmplist.append((obstup, rpmtup)) # self.reduceListByNameArch() for double tuples returnlist = [] if name or arch: for ((n, a, e, v, r), insttup) in tmplist: if name: if name == n: returnlist.append(((n, a, e, v, r), insttup)) continue if arch: if arch == a: returnlist.append(((n, a, e, v, r), insttup)) continue else: returnlist = tmplist return returnlist # NOTE: This returns _obsoleters_, and narrows based on that (unlike # getObsoletesTuples, but like getObsoletersTuples) def getObsoletesList(self, newest=0, name=None, arch=None): """returns obsoleting packages in a list of naevr tuples of just the packages that obsolete something that is installed. You can specify name and/or arch of the obsoleting packaging to narrow the results. You can also specify newest=1 to get the set of newest pkgs (name, arch) sorted, that obsolete something""" tmplist = self.obsoletes.keys() if newest: tmplist = self._reduceListNewestByNameArch(tmplist) returnlist = self.reduceListByNameArch(tmplist, name, arch) return returnlist def getObsoletedList(self, newest=0, name=None): """returns a list of pkgtuples obsoleting the package in name""" returnlist = [] for new in self.obsoletes: for obstup in self.obsoletes[new]: (n, a, e, v, r) = obstup if n == name: returnlist.append(new) continue return returnlist def getOthersList(self, name=None, arch=None): """returns a naevr tuple of the packages that are neither installed nor an update - this may include something that obsoletes an installed package""" updates = {} inst = {} tmplist = [] for pkgtup in self.getUpdatesList(): updates[pkgtup] = 1 for pkgtup in self.installed: inst[pkgtup] = 1 for pkgtup in self.available: if pkgtup not in updates and pkgtup not in inst: tmplist.append(pkgtup) returnlist = self.reduceListByNameArch(tmplist, name, arch) return returnlist def _reduceListNewestByNameArch(self, tuplelist): """return list of newest packages based on name, arch matching this means(in name.arch form): foo.i386 and foo.noarch are not compared to each other for highest version only foo.i386 and foo.i386 will be compared""" highdict = {} done = False for pkgtup in tuplelist: (n, a, e, v, r) = pkgtup if (n, a) not in highdict: highdict[(n, a)] = pkgtup else: pkgtup2 = highdict[(n, a)] done = True (n2, a2, e2, v2, r2) = pkgtup2 rc = rpmUtils.miscutils.compareEVR((e,v,r), (e2, v2, r2)) if rc > 0: highdict[(n, a)] = pkgtup if not done: return tuplelist return highdict.values() # def getProblems(self): # """return list of problems: # - Packages that are both obsoleted and updated. # - Packages that have multiple obsoletes. # - Packages that _still_ have multiple updates # """ PK[ M&site-packages/rpmUtils/transaction.pycnu[ v_c@sGddlZddlZdZdZdddYZddZdS(iNtTransactionWrappercBseZddZdZdZdZdZdZdZdZ d Z d Z d Z d Z d ZidZedZRS(t/cCs^tj||_ddddddddd d d d d ddg|_g|_t|_dS(NtchecktordertaddEraset addInstalltruntpgpImportPubkeyt pgpPrtPktstproblemstsetFlagst setVSFlagst setProbFiltert hdrFromFdnotnexttcleant _verifySigs(trpmtTransactionSetttst_methodsttsflagstTruetopen(tselftroot((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt__init__s$  cCs|jdS(N(tclose(R((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt__del__+scCs/|jr+|jjd|_t|_ndS(N(RRtcloseDBtNonetFalse(R((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyR/s   cOsjd|kr|jd}ng}|jj||}x*|D]"\}}}|j|||q@W|S(Ntpatterns(tpopRtdbMatchtpattern(RtargstkwdsR tmittagttptpat((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyR"5s cCs)||jkr|j|St|dS(N(Rt getMethodtAttributeError(Rtattr((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt __getattr__@s cCs|jS(N(R(R((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt__iter__FscCst|j|S(N(tgetattrR(Rtmethod((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyR*IscCs+|jj||jj|jddS(Ni(RtappendRR (Rtflags((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt pushVSFlagsQscCs%|jd=|jj|jddS(Ni(RRR (R((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt popVSFlagsUs cCs*|jjd}|jj||BdS(Ni(RR (Rtflagtcurflags((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt addTsFlagYscCs&|jjd}|jj||S(Ni(RR (RR6((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt getTsFlags]scCs|j}t||@S(N(R8tbool(RR5tval((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt isTsFlagSetbs cCs|j|j_dS(N(tfilenoRtscriptFd(Rtfd((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt setScriptFdfsc Cs|j}|jtj|jddkrN|jjtjtjBn|jj |j d}|jj ||dkrgS|sdgSg}x*|D]"\}\}}} |j |qW|S(sftests the ts we've setup, takes a callback function and a conf dict for flags and what nottdiskspacecheckits,Unknown error during transaction test in RPMN(R8R7RtRPMTRANS_FLAG_TESTtgetRR tRPMPROB_FILTER_DISKSPACEtRPMPROB_FILTER_DISKNODESRtcallbackR RR1( Rtcbtconft origflagsttserrorst reserrorstdescrtetypetmounttneed((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyttestms  c Csi}g}|j}|dkr(|Sx|D]}|ddkrKq/n|tjs^q/ntj|}xB|tjD]3}||krt||x|tjD] }|VqWx|tjD] }|Vq+WdS(s% Return all the provides, via yield. N(RtRPMTAG_PROVIDEStRPMTAG_FILENAMES(thdrtprov((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyt_return_all_providess iiN( R"RRtRPMTAG_REQUIRENAMEt miscutilstpkgTupleFromHeadertsettaddtlenR1tinstance( RtheaderstreqtorphanR&thttuptrRVtpreqtpts((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pytreturnLeafNodessF              (t__name__t __module__RRRR"R-R.R*R3R4R7R8R;R?RPRRg(((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyRs             RcCs*td|}|jtjtjB|S(NR(RR3Rt_RPMVSF_NOSIGNATURESt_RPMVSF_NODIGESTS(Rtread_ts((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pytinitReadOnlyTransactions((RRXRRlRRRm(((s8/usr/lib/python2.7/site-packages/rpmUtils/transaction.pyts  PK[ K/K/$site-packages/rpmUtils/miscutils.pycnu[ v_c@sddlZddlZddlZddlZddlZddlZddlZddlZdZ dZ dZ e dZ dZdZdZd Zd Zd Zejd d ZdZdZdZdZdZdS(iNcCs(t|tjkr$t|}n|S(N(ttypettypest StringTypetstr(targ((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt rpmOutToStrsc Cs|\}}}|\}}}|dkr3d}n t|}t|}t|}|dkrld}n t|}t|}t|}tj|||f|||f}|S(Nt0(tNoneRtrpmt labelCompare( t.0t.1te1tv1tr1te2tv2tr2trc((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt compareEVR$s          $cCstd|dfd|dfS(s-compare version strings only using rpm vercmpt(R(R R((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pytcompareVerOnly9sc Csd}|jd}tj|tj}y|j|}Wntjk r}t|dkrmd}nt|dkrd}nt|dkrd}nt|dkrd}qn;Xt|\}} |d krtj |~d }n~|r|dkrtj |ddtj tj |j ||} | sd}tj |ddtj tj|j ||ntj tjnytj |Wntk r}nX|j||S( sTakes a transaction set and a package, check it's sigs. By default, only v4 sigs (header-only) will be verified (faster). By setting payload to True, v3 sigs (header+payload) will also be verified (slower). return 0 if they are all fine return 1 if the gpg key can't be found return 2 if the header or payload is in someway damaged return 3 if the key is not trusted return 4 if the pkg is not gpg or pgp signedispublic key not availaiableispublic key not availablespublic key not trustediserror reading package headeriiei(t setVSFlagstostopentO_RDONLYt hdrFromFdnoRterrorRt getSigInfotclosetlseekt setVerbositytRPMLOG_WARNINGt _verifySigst RPMLOG_INFOt RPMLOG_NOTICEtOSError( ttstpackagetpayloadtvaluet currentflagstfdnothdrteRtsiginfotvalid((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pytcheckSig=sH         cCstjtjdd}|j|}|dkrUd}|jd\}}}nd}d}d}d}|||f}||fS( sXchecks signature from an hdr hand back signature information and/or an error codetCs%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|s(none)it,ietMD5R(tlocalet setlocaletLC_ALLtsprintftsplit(R+tstringR-Rtsigtypetsigdatetsigidt infotuple((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyR{s cCs|d}|tjs*|tjdkr7|d}nd}|d}|d}|d}|d krpd}n|||||f}|S( s^return a pkgtuple (n, a, e, v, r) from a hdr object, converts None epoch to 0, as well.tnameitarchtsrctversiontreleasetepochRN(RtRPMTAG_SOURCERPMtRPMTAG_SOURCEPACKAGER(R+R=R>tvertrelRBtpkgtuple((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pytpkgTupleFromHeaders        cCs4|\}}}}}t||d|||ffS(sureturns true if the package epoch-ver-rel satisfy the range requested in the reqtuple: ex: foo >= 2.1-1tEQ(t rangeCompare(treqtupleRGtntaR,tvtr((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt rangeChecksc Cs|\}}\}}}|\}}\} } } ||kr@dS| sN| rRdS|dkrgd} n|dkr|d} n|dkrd} n| dkrd}nt| | | f|||f} | dkr$|dkrdS|dkr|dkrdSn|dkr$|dkr!dSq$n| dkr|dkrO|dkrOdSn|dkrn|dkrndSn|dkr|dkrdSn|dkr|d krdSn|d!kr|d"krdSqn| dkr |d#kr|d$krdSn|d%kr dSndS(&s,returns true if provtuple satisfies reqtupleiitGTtGEii t>s>=RIit=tLEi tLTis<=t=(sEQiRT(RUi RVis<=RW( RURVsEQi iis<=RWRT(RURVi is<=RW(RQiRS(RQRRii RSs>=(RRi s>=( RQRRsEQRUii ii RSs>=RTs<=(sEQiRT( sEQRRRUii i RTs>=s<=(RUi s<=( sEQRURVRRii ii RTs<=RWs>=(RViRW(RURVi is<=RW( RQRRsEQii iRSs>=RT(RQRRii RSs>=(RURVi is<=RW(RR( RKt provtupletreqntreqftreqetreqvtreqrRLtfR,RNROR((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyRJs^         !                        cCsDt|}|dkrgSi}yx|D]}d||trelIndexRFtverIndexREt epochIndexRBR=((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt splitFilenameDs     ic Cstjj}|j|}~|tjp1d}|dkrStjd|ntjdddt j |d|}x/|j |}|dkrPn|j |q}|jdS(sPerforms roughly the equivalent of rpm2cpio(8). Reads the package from fdno, and dumps the cpio payload to out, using bufsize as the buffer size.tgzips$Unsupported payload compressor: "%s"trbRN(trpmUtilst transactiontinitReadOnlyTransactionRRtRPMTAG_PAYLOADCOMPRESSORt RpmUtilsErrorRytGzipFileRRtfdopentreadtwriteR(R*touttbufsizeR%R+tcomprR^ttmp((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pytrpm2cpiocs  ' cCs|}|rt|tdks<t|tdkr|tjtjBtjB@r|d}|tj@r{|d}n|tj@r|d}n|tj@r|d}n|rd||f}qqn|S(s Return a human readable requirement string (ex. foobar >= 2.0) @param name: requirement name (ex. foobar) @param version: requirent version (ex. 2.0) @param flags: binary flags ( 0010 = equal, 0100 = greater than, 1000 = less than ) ilt RWRSRTs%s %s(RRt RPMSENSE_LESStRPMSENSE_GREATERtRPMSENSE_EQUAL(R=R@tflagsRf((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt formatRequirezs6        cCsn|d@}|dkrdS|dkr*dS|dkr:dS|dkrJdS|d krZd S|d krjd S|S( NiiiRViRQiRIi RUi RR(R(R((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyt flagToStrings       cCs|dkrdS|jd}|dkrbytt|| }Wqhtk r^d}qhXnd}|jd}|dkr||d|!dkrd}n||d|!}||d}n1||ddkrd}n||d}d}|||fS( NRRpiRRoi(NR(NNN(RRrRtlongt ValueError(t verstringRlRBtjR@RA((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pytstringToVersions(       cCsytj|tj}Wntk r:}tjdnXy|j|}Wn/tjk r}tj |tjdnXt |tj krtj |tjdntj ||S(s>hand back the rpm header or raise an Error if the pkg is fubarsUnable to open filesRPM Error opening Packages RPM Error opening Package (type)( RRRR$R{RRRRRRR+(R%R&R*R,R+((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pythdrFromPackages   cCsbttdr^ttdr^tjtjtjtjtjtjgr^t j dq^ndS(Nt checkSignalst signalsCaughti( thasattrRRtsignaltSIGINTtSIGTERMtSIGPIPEtSIGQUITtSIGHUPtsystexit(((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyRs (RRRyRRR3RtrpmUtils.transactionR{RRRtFalseR/RRHRPRJRmRxtstdoutRRRRRR(((s6/usr/lib/python2.7/site-packages/rpmUtils/miscutils.pyts.            >   P E    PK[1++"site-packages/rpmUtils/oldUtils.pynuȯ#!/usr/bin/python -tt import rpm import types import os import gzip import sys from gzip import write32u, FNAME from urlgrabber.grabber import URLGrabError from zlib import error as zlibError def log(num, msg): print >>sys.stderr, msg errorlog = log def _(msg): return msg # pylint: disable-msg=E0602 def checkheader(headerfile, name, arch): """check a header by opening it and comparing the results to the name and arch we believe it to be for. if it fails raise URLGrabError(-1)""" h = Header_Work(headerfile) fail = 0 if h.hdr is None: fail = 1 else: if name != h.name() or arch != h.arch(): fail = 1 if fail: raise URLGrabError(-1, _('Header cannot be opened or does not match %s, %s.') % (name, arch)) return def checkRpmMD5(package, urlgraberror=0): """take a package, check it out by trying to open it, return 1 if it's good return 0 if it's not""" ts.sigChecking('md5') fdno = os.open(package, os.O_RDONLY) try: ts.hdrFromFdno(fdno) except rpm.error, e: good = 0 else: good = 1 os.close(fdno) ts.sigChecking('default') if urlgraberror: if not good: raise URLGrabError(-1, _('RPM %s fails md5 check') % (package)) else: return else: return good def checkSig(package): """ take a package, check it's sigs, return 0 if they are all fine, return 1 if the gpg key can't be found, 2 if the header is in someway damaged, 3 if the key is not trusted, 4 if the pkg is not gpg or pgp signed""" ts.sigChecking('default') fdno = os.open(package, os.O_RDONLY) try: hdr = ts.hdrFromFdno(fdno) except rpm.error, e: if str(e) == "public key not availaiable": return 1 if str(e) == "public key not available": return 1 if str(e) == "public key not trusted": return 3 if str(e) == "error reading package header": return 2 else: error, siginfo = getSigInfo(hdr) if error == 101: os.close(fdno) del hdr return 4 else: del hdr os.close(fdno) return 0 def getSigInfo(hdr): """checks if a computerhand back signature information and an error code""" string = '%|DSAHEADER?{%{DSAHEADER:pgpsig}}:{%|RSAHEADER?{%{RSAHEADER:pgpsig}}:{%|SIGGPG?{%{SIGGPG:pgpsig}}:{%|SIGPGP?{%{SIGPGP:pgpsig}}:{(none)}|}|}|}|' siginfo = hdr.sprintf(string) if siginfo != '(none)': error = 0 sigtype, sigdate, sigid = siginfo.split(',') else: error = 101 sigtype = 'MD5' sigdate = 'None' sigid = 'None' infotuple = (sigtype, sigdate, sigid) return error, infotuple def getProvides(header): provnames = [] provides = header[rpm.RPMTAG_PROVIDENAME] if provides is None: pass elif type(provides) is types.ListType: provnames.extend(provides) else: provnames.append(provides) return provnames def compareEVR((e1, v1, r1), (e2, v2, r2)): # return 1: a is newer than b # 0: a and b are the same version # -1: b is newer than a def rpmOutToStr(arg): if type(arg) != types.StringType and arg != None: arg = str(arg) return arg e1 = rpmOutToStr(e1) v1 = rpmOutToStr(v1) r1 = rpmOutToStr(r1) e2 = rpmOutToStr(e2) v2 = rpmOutToStr(v2) r2 = rpmOutToStr(r2) rc = rpm.labelCompare((e1, v1, r1), (e2, v2, r2)) log(6, '%s, %s, %s vs %s, %s, %s = %s' % (e1, v1, r1, e2, v2, r2, rc)) return rc def formatRequire (name, version, flags): if flags: if flags & (rpm.RPMSENSE_LESS | rpm.RPMSENSE_GREATER | rpm.RPMSENSE_EQUAL): name = name + ' ' if flags & rpm.RPMSENSE_LESS: name = name + '<' if flags & rpm.RPMSENSE_GREATER: name = name + '>' if flags & rpm.RPMSENSE_EQUAL: name = name + '=' name = name + ' %s' % version return name def openrpmdb(): try: db = rpm.TransactionSet(conf.installroot) except rpm.error, e: errorlog(0, _("Could not open RPM database for reading. Perhaps it is already in use?")) return db # this is done to make the hdr writing _more_ sane for rsync users especially __all__ = ["GzipFile","open"] class GzipFile(gzip.GzipFile): def _write_gzip_header(self): self.fileobj.write('\037\213') # magic header self.fileobj.write('\010') # compression method fname = self.filename[:-3] flags = 0 if fname: flags = FNAME self.fileobj.write(chr(flags)) write32u(self.fileobj, long(0)) self.fileobj.write('\002') self.fileobj.write('\377') if fname: self.fileobj.write(fname + '\000') def _gzipOpen(filename, mode="rb", compresslevel=9): return GzipFile(filename, mode, compresslevel) class RPM_Base_Work: def __init__(self): self.hdr = None def _getTag(self, tag): if self.hdr is None: errorlog(0, _('Got an empty Header, something has gone wrong')) #FIXME should raise a yum error here sys.exit(1) return self.hdr[tag] def isSource(self): if self._getTag('sourcepackage') == 1: return 1 else: return 0 def name(self): return self._getTag('name') def arch(self): return self._getTag('arch') def epoch(self): return self._getTag('epoch') def version(self): return self._getTag('version') def release(self): return self._getTag('release') def evr(self): e = self._getTag('epoch') v = self._getTag('version') r = self._getTag('release') return (e, v, r) def nevra(self): n = self._getTag('name') e = self._getTag('epoch') v = self._getTag('version') r = self._getTag('release') a = self._getTag('arch') return (n, e, v, r, a) def writeHeader(self, headerdir, compress): # write the header out to a file with the format: name-epoch-ver-rel.arch.hdr # return the name of the file it just made - no real reason :) (name, epoch, ver, rel, arch) = self.nevra() if epoch is None: epoch = '0' if self.isSource(): headerfn = "%s/%s-%s-%s-%s.src.hdr" % (headerdir, name, epoch, ver, rel) else: headerfn = "%s/%s-%s-%s-%s.%s.hdr" % (headerdir, name, epoch, ver, rel, arch) if compress: headerout = _gzipOpen(headerfn, "w") else: headerout = open(headerfn, "w") headerout.write(self.hdr.unload(1)) headerout.close() return(headerfn) class Header_Work(RPM_Base_Work): """for operating on hdrs in and out of the rpmdb if the first arg is a string then it's a filename otherwise it's an rpm hdr""" def __init__(self, header): if type(header) is types.StringType: try: fd = gzip.open(header, 'r') try: h = rpm.headerLoad(fd.read()) except rpm.error, e: errorlog(0,_('Damaged Header %s') % header) h = None except IOError,e: fd = open(header, 'r') try: h = rpm.headerLoad(fd.read()) except rpm.error, e: errorlog(0,_('Damaged Header %s') % header) h = None except ValueError, e: errorlog(0,_('Damaged Header %s') % header) h = None except zlibError, e: errorlog(0,_('Damaged Header %s') % header) h = None fd.close() else: h = header self.hdr = h class RPM_Work(RPM_Base_Work): def __init__(self, rpmfn): ts.setVSFlags(~(rpm._RPMVSF_NOSIGNATURES)) fd = os.open(rpmfn, os.O_RDONLY) try: self.hdr = ts.hdrFromFdno(fd) except rpm.error, e: errorlog(0, _('Error opening rpm %s - error %s') % (rpmfn, e)) self.hdr = None os.close(fd) class Rpm_Ts_Work: """This should operate on groups of headers/matches/etc in the rpmdb - ideally it will operate with a list of the Base objects above, so I can refer to any one object there not sure the best way to do this yet, more thinking involved""" def __init__(self, dbPath='/'): try: if conf.installroot: if conf.installroot != '/': dbPath = conf.installroot except NameError, e: pass self.ts = rpm.TransactionSet(dbPath) self.methods = ['addInstall', 'addErase', 'run', 'check', 'order', 'hdrFromFdno', 'closeDB', 'dbMatch', 'setFlags', 'setVSFlags', 'setProbFilter'] def __getattr__(self, attribute): if attribute in self.methods: return getattr(self.ts, attribute) else: raise AttributeError, attribute def match(self, tag = None, search = None, mire = None): """hands back a list of Header_Work objects""" hwlist = [] # hand back the whole list of hdrs if mire is None and tag is None and search is None: hdrlist = self.ts.dbMatch() else: #just do a non-mire'd search if mire == None: hdrlist = self.ts.dbMatch(tag, search) else: # mire search if mire == 'glob': hdrlist = self.ts.dbMatch() hdrlist.pattern(tag, rpm.RPMMIRE_GLOB, search) elif mire == 'regex': hdrlist = self.ts.dbMatch() hdrlist.pattern(tag, rpm.RPMMIRE_REGEX, search) elif mire == 'strcmp': hdrlist = self.ts.dbMatch() hdrlist.pattern(tag, rpm.RPMMIRE_STRCMP, search) else: hdrlist = self.ts.dbMatch() hdrlist.pattern(tag, rpm.RPMMIRE_DEFAULT, search) for hdr in hdrlist: hdrobj = Header_Work(hdr) hwlist.append(hdrobj) return hwlist def sigChecking(self, sig): """pass type of check you want to occur, default is to have them off""" if sig == 'md5': #turn off everything but md5 - and we need to the check the payload self.ts.setVSFlags(~(rpm.RPMVSF_NOMD5|rpm.RPMVSF_NEEDPAYLOAD)) elif sig == 'none': # turn off everything - period self.ts.setVSFlags(~(rpm._RPMVSF_NOSIGNATURES)) elif sig == 'default': # set it back to the default self.ts.setVSFlags(rpm.RPMVSF_DEFAULT) else: raise AttributeError, sig PK[+KK"site-packages/rpmUtils/updates.pycnu[ v_c@sDddlZddlZddlZdZdddYZdS(iNcCstjj||S(N(trpmUtilst miscutilst compareEVR(ttup1ttup2((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt _vertup_cmpstUpdatescBseZdZdZdZdZdZdZddZ dZ dZ d Z d d Z d Zd ZdZdZdddZdddZdddZddddZddddZddddZdddZdddZdZRS(sM This class computes and keeps track of updates and obsoletes. initialize, add installed packages, add available packages (both as unique lists of name, arch, ver, rel, epoch tuples), add an optional dict of obsoleting packages with obsoletes and what they obsolete ie:: foo, i386, 0, 1.1, 1: bar >= 1.1. cCs||_||_i|_d|_i|_i|_d|_tdddddddg|_ t j j |_ t j j|j |_t j j|j |_t j j|j |_|j|jd|_|j|jd d |j|_i|_i|_d |_i|_dS( Nitkernels kernel-smptglibcskernel-hugememskernel-enterprises kernel-bigmems kernel-BOOTitfilter(t installedt availablet rawobsoletestNonet_obsoletes_by_nametobsoleted_dicttobsoleting_dictt exactarchtsett exactarchlistRtarcht canonArchtmyarchtisMultiLibArcht _is_multilibt getArchListt _archlisttgetMultiArchInfot_multilib_compat_archest makeNADictt installdictt availdictt updatesdictt updating_dicttdebugt obsoletes(tselftinstlistt availlist((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt__init__ s,           cCsUxN|D]F}||krqnt|j||||<||s||=qqWdS(N(R t__ne__(R$tdict_tkeystvaluetkey((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt _delFromDictEs    c Cs|\}}}}}xx|dfD]j}||f|kr"t|||fj|||f|||f<|||fs|||f=qq"q"WdS(N(R R R(( R$R)tpkgtuptntatetvtrtaa((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt_delFromNADictMs /cCs9||jkrdS|jj||j|j||j|j|jj|g||j|j|jj|g|||jkr|j rx@|j|D]1\}}}|j|j |g|||fqW|j|=qn|j|j |j j|g||j|j |j j|g|dS(s3remove available pkgtup that is no longer availableN( R tremoveR5RR-R!R tgetR RRR(R$R.tnametflagtversion((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt delPackageUs%% &%cCs|jr|GHndS(N(R"(R$tmsg((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt debugprinths c Cs+i}x|D]\}}}}} |r@|df|kr@q n||f|kreg|||f( R$R8tarchlistR?t returnlistt high_vertupR.R/R0R1R2R3tvertup((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt"returnHighestVerFromAllArchsByNames    cCsZxS|jD]H}t|j|dkr |j|}tjj||j|R7RRt rangeCheckR*t_reduceListNewestByNameArch(R$R?tnewestR.R#R8R9R:tobsdicttobs_flagt obs_versiont obsoletingtobslistRAtnewtold((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytcheckForObsoletes4   %$    c Cs<i}i}xJ|jD]?\}}}}}||krDg||R RRRRURIR#tmakeObsoletedDict(R$RXt obs_archesR/R0R1R2R3R.R8Rtepochtvertreltobs_nR9tobs_etobs_vtobs_rtrpm_atrpm_etrpm_vtrpm_rt willInstalltins_atins_etins_vtins_rtpkgvert installedver((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt doObsoletess<   && &    5 cCsi|_x\|jD]Q}xH|j|D]9}||jkrLg|j| [obsoleting package], this is to make it easier to look up what package obsoletes what item in the rpmdbN(RR#R>RRSRT(R$R]R^t obsoletedt obsoletingsR[((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyR`s   c" s g}g}i}|j}|j}x9|jD]+\}}||kr1|||f=q1q1q1Wx|D]\}}|j|||f\}} } xc|||fD]P\} } } || | f| | | fkr|||fj| | | fqqWqgWx|D]\}}||f|jkrx|j||fD]\}}}y&|j|||f\} } } Wntjk rq;q;Xtjj | | | f|||f}|dkr;y$|||fj| | | fWqt k rqXq;q;WqqWxS|jD]Et fd|}|j dd fgj|qWx4|jD]&}t||dkrf||=qfqfWx|D]\}}|d krqn|d f|jkrg}g}x1||d fD]\}} } } |j|qWx4|j|d fD]\}} } } |j|qWt|dkset|dkr|jd||j|q|jd||j||fqqWx1|D])\}}||jkr||f|jkr|j|j||f\}}}||f|kr|j|||f\} } } tjj | | | f|||f}|dkr|||||f|krg||||||fQsisputting %s in complex updatesputting %s in simple updatetnoarchsprocessing %s.%ss processing %sRN( RRR*RIR6RRRCRRt ValueErrortmapRTR textendRBR>R=RRRRtmultilibArchestarchesRRRRNRtgetBestArchFromListR tmakeUpdatingDict("R$t simpleupdatet complexupdatet updatedicttnewpkgsRJR/R0RERFRGR1R2R3RjRkRlRHt all_archestnakeyt installarchst availarchsRit archliststbiarchest multicompatt multiarchlistt thisarchlistttmplistthighestinstalledpkgsthipdictthighestavailablepkgsthapdictt instarchs((Rxs4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt doUpdatess     "!+#&' $ ' #&$%"' ;##' =      &   #   ' < #    ' : cCsli|_x\|jD]Q}xH|j|D]9}||jkrLg|j| [installed package], this is to make it easier to look up what package will be updating what in the rpmdbN(R!R R>(R$R^R]((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyRs  c Csg}|s|rx|D]\}}}}} |re||kre|j||||| fqqen|r||kr|j||||| fqqqqWn|}|S(s?returns a set of pkg naevr tuples reduced based on name or arch(R>( R$R?R8RRKR/R0R1R2R3((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytreduceListByNameArchs    c CsEg}x<|jD]1}x(|j|D]}|j||fq$WqWg}|rxW|D]L\\}}} } } }||krX|j||| | | f|fqXqXWn|r xW|D]L\\}}} } } }||kr|j||| | | f|fqqWnx3|D]+} y|j| Wqtk r<qXqW|S(s`returns updates for packages in a list of tuples of: (updating naevr, installed naevr)(R R>R6R{( R$R8RRKtoldtuptnewtupRR/R0R1R2R3titem((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytgetUpdatesTupless&" ," ,  cCsXg}x6|jD]+}x"|j|D]}|j|q$WqW|j|||}|S(s5returns updating packages in a list of (naevr) tuples(R R>R(R$R8RRKRR((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytgetUpdatesList,s ic Cs(g}|jj}|r-|j|}nx9|D]1}x(|j|D]}|j||fqHWq4Wg}|s{|rx|D]\}\} } } } } |r|| kr|j|| | | | | ffqqn|r|| kr|j|| | | | | ffqqqqWn|}|S(sAreturns obsoletes for packages in a list of tuples of: (obsoleting naevr, installed naevr). You can specify name and/or arch of the installed package to narrow the results. You can also specify newest=1 to get the set of newest pkgs (name, arch) sorted, that obsolete something(R#R*RVR>(R$RWR8RRR\tobstuptrpmtupRKR/R0R1R2R3((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytgetObsoletesTuples:s(  " "  "cCs(g}|jj}|r-|j|}nx9|D]1}x(|j|D]}|j||fqHWq4Wg}|s{|rx|D]\\} } } } } }|r|| kr|j| | | | | f|fqqn|r|| kr|j| | | | | f|fqqqqWn|}|S(sBreturns obsoletes for packages in a list of tuples of: (obsoleting naevr, installed naevr). You can specify name and/or arch of the obsoleting package to narrow the results. You can also specify newest=1 to get the set of newest pkgs (name, arch) sorted, that obsolete something(R#R*RVR>(R$RWR8RRR\RRRKR/R0R1R2R3tinsttup((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytgetObsoletersTuples]s(  " "  "cCs@|jj}|r'|j|}n|j|||}|S(s^returns obsoleting packages in a list of naevr tuples of just the packages that obsolete something that is installed. You can specify name and/or arch of the obsoleting packaging to narrow the results. You can also specify newest=1 to get the set of newest pkgs (name, arch) sorted, that obsolete something(R#R*RVR(R$RWR8RRRK((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytgetObsoletesLists c Csjg}x]|jD]R}xI|j|D]:}|\}}}} } ||kr$|j|q$q$q$WqW|S(s:returns a list of pkgtuples obsoleting the package in name(R#R>( R$RWR8RKR]RR/R0R1R2R3((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pytgetObsoletedLists  cCsi}i}g}x|jD]}d||R(R$R8RtupdatestinstRR.RK((s4/usr/lib/python2.7/site-packages/rpmUtils/updates.pyt getOthersListscCsi}t}x|D]}|\}}}}} ||f|krS||||fs    PK[  EEsite-packages/pyparsing.pyonu[ 2Sce@s dZdZdZdZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z ddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkgeZ e jdldmkZere jZeZeZeZejejZnAe jZeZdnZejejZdoZejejZgZ ddl!Z!xEdpj"D]7Z#ye j$e%e!e#Wne&k rqLnXqLWdqZ'dre(fdsYZ)ej*Z+e+dtZ,ee+Z-eduZ.dvj/gej0D]Z1e1ej2kre1^qZ3de4fdwYZ5d e5fdxYZ6d"e5fdyYZ7d$e7fdzYZ8d'e4fd{YZ9d|e(fd}YZ:d#e(fd~YZ;dZ<dZ=dZ>dZ?dZ@dZAdZBe rdmdZCn dmdZCd%e(fdYZDd-eDfdYZEdeEfdYZFdeEfdYZGdeEfdYZHeHZIdeEfdYZJd eHfdYZKdeJfdYZLd1eEfdYZMd(eEfdYZNd&eEfdYZOd eEfdYZPd0eEfdYZQdeEfdYZRdeRfdYZSdeRfdYZTdeRfdYZUd+eRfdYZVd*eRfdYZWd3eRfdYZXd2eRfdYZYd!eDfdYZZdeZfdYZ[deZfdYZ\deZfdYZ]d eZfdYZ^deDfdYZ_de_fdYZ`de_fdYZad4e_fdYZbde_fdYZcde(fdYZdedZede_fdYZfd)e_fdYZgde_fdYZhdehfdYZid.e_fdYZjd/ejfdYZkd ejfdYZldejfdYZmd ejfdYZnd,ejfdYZode(fdYZpdZqderdZsetdZudZvdZwdZxdZyerezdZ{dZ|ezdZ}dZ~eFjdEZeTjdMZeUjdLZeVjdeZeWjddZeMe.dddmjdZdvj/ge3D]Z1e1dkre1^qZeNdjdZeNdjdZeeBeBeMeddBZemeeodeZeHdefdjdemeceeBjddZdZdZdZdZdZdZdZdZdZdZdZdZdZe(e_e)Ze(e_e(e_dZeNdjdZeNdjdZeNdjdZeleIdejZddetejdZezdZedZedZeeMee-d\ZZeleIde{djddjZeedj"dZdZeNdjdZeNdZeNdjZeNdjdZeNdjdZeZeNdjdZdvj/ge3D]Z1e1dkr e1^q ZeleceMeefeMdeHdeUjjdZesefejeBddvjd<Zedkr dZeKdZeKdZeMee-dZeseddezjeZemeseZeseddezjeZemeseZedeBjdeejd Zed ed ed ed edededededededndS(su pyparsing module - Classes and methods to define and execute parsing grammars The pyparsing module is an alternative approach to creating and executing simple grammars, vs. the traditional lex/yacc approach, or the use of regular expressions. With pyparsing, you don't need to learn a new syntax for defining grammars or matching expressions - the parsing module provides a library of classes that you use to construct the grammar directly in Python. Here is a program to parse "Hello, World!" (or any greeting of the form C{", !"}):: from pyparsing import Word, alphas # define grammar of a greeting greet = Word( alphas ) + "," + Word( alphas ) + "!" hello = "Hello, World!" print hello, "->", greet.parseString( hello ) The program outputs the following:: Hello, World! -> ['Hello', ',', 'World', '!'] The Python representation of the grammar is quite readable, owing to the self-explanatory class names, and the use of '+', '|' and '^' operators. The parsed results returned from C{parseString()} can be accessed as a nested list, a dictionary, or an object with named attributes. The pyparsing module handles some of the problems that are typically vexing when writing text parsers: - extra or missing whitespace (the above program will also handle "Hello,World!", "Hello , World !", etc.) - quoted strings - embedded comments s1.5.6s26 June 2011 10:53s*Paul McGuire iN(treftAndtCaselessKeywordtCaselessLiteralt CharsNotIntCombinetDicttEachtEmptyt FollowedBytForwardt GoToColumntGrouptKeywordtLineEndt LineStarttLiteralt MatchFirsttNoMatchtNotAnyt OneOrMoretOnlyOncetOptionaltOrtParseBaseExceptiontParseElementEnhancetParseExceptiontParseExpressiontParseFatalExceptiont ParseResultstParseSyntaxExceptiont ParserElementt QuotedStringtRecursiveGrammarExceptiontRegextSkipTot StringEndt StringStarttSuppresstTokentTokenConvertertUpcasetWhitetWordtWordEndt WordStartt ZeroOrMoret alphanumstalphast alphas8bitt anyCloseTagt anyOpenTagt cStyleCommenttcoltcommaSeparatedListtcommonHTMLEntityt countedArraytcppStyleCommenttdblQuotedStringtdblSlashCommentt delimitedListtdictOftdowncaseTokenstemptytgetTokensEndLocthexnumst htmlCommenttjavaStyleCommenttkeepOriginalTexttlinetlineEndt lineStarttlinenot makeHTMLTagst makeXMLTagstmatchOnlyAtColtmatchPreviousExprtmatchPreviousLiteralt nestedExprtnullDebugActiontnumstoneOftopAssoctoperatorPrecedencet printablestpunc8bittpythonStyleCommentt quotedStringt removeQuotestreplaceHTMLEntityt replaceWitht restOfLinetsglQuotedStringtsranget stringEndt stringStartttraceParseActiont unicodeStringt upcaseTokenst withAttributet indentedBlocktoriginalTextForiicCs#tg|D]}|df^q S(Ni(tdict(tstc((s-/usr/lib/python2.7/site-packages/pyparsing.pytlscCs@t|tr|Syt|SWntk r;t|SXdS(sDrop-in replacement for str(obj) that tries to be Unicode friendly. It first tries str(obj). If that fails with a UnicodeEncodeError, then it tries unicode(obj). It then < returns the unicode object | encodes it with the default encoding | ... >. N(t isinstancetunicodetstrtUnicodeEncodeError(tobj((s-/usr/lib/python2.7/site-packages/pyparsing.pyt_ustros  s8sum len enumerate sorted reversed list tuple set any allcCscd}gdjD]}d|d^q}x/t||D]\}}|j||}q=W|S(s/Escape &, <, >, ", ', etc. in a string of data.s&><"'samp gt lt quot apost&t;(tsplittziptreplace(tdatat from_symbolsRgt to_symbolstfrom_tto_((s-/usr/lib/python2.7/site-packages/pyparsing.pyt _xml_escapes 't _ConstantscBseZRS((t__name__t __module__(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR{st ABCDEFabcdefi\tcBsPeZdZdd d dZdZdZdZddZdZ RS( s7base exception class for all parsing runtime exceptionsicCsI||_|dkr*||_d|_n||_||_||_dS(NR(tloctNonetmsgtpstrt parserElement(tselfRRRtelem((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__init__s      cCsm|dkrt|j|jS|dkr>t|j|jS|dkr]t|j|jSt|dS(ssupported attributes by name are: - lineno - returns the line number of the exception text - col - returns the column number of the exception text - line - returns the line containing the exception text RHR5tcolumnREN(scolscolumn(RHRRR5REtAttributeError(Rtaname((s-/usr/lib/python2.7/site-packages/pyparsing.pyt __getattr__s   cCs d|j|j|j|jfS(Ns"%s (at char %d), (line:%d, col:%d)(RRRHR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__str__scCs t|S(N(Ro(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__repr__ss>!}) cCs/t||r|Stj|}t|_|S(N(Rjtobjectt__new__tTruet_ParseResults__doinit(tclsttoklisttnametasListtmodaltretobj((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs  cCs|jrdt|_d|_d|_i|_||trI||_n |g|_t|_ n|dk r|r|sd|j|s  cCs||trB|jj|t|g|j|<|d}nZ||trg||j|<|}n5|jj|tt|dg|j|<|}||trt||_ndS(Ni( RRtgetRRRRtwkrefR(RtkRRjtsub((s-/usr/lib/python2.7/site-packages/pyparsing.pyt __setitem__Gs&   /c Cst|ttfrt|j}|j|=t|trl|dkrV||7}nt||d}ntt|j|}|jx||j D]d}|j |}xN|D]F}x=t |D]/\}\}} t || | |k||s||jdd|S(sReturns current column within a string, counting newlines as line separators. The first column is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. s ii(Rtrfind(Rtstrg((s-/usr/lib/python2.7/site-packages/pyparsing.pyR5ms cCs|jdd|dS(sReturns current line number within a string, counting newlines as line separators. The first line is number 1. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{ParserElement.parseString}} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. s ii(tcount(RR ((s-/usr/lib/python2.7/site-packages/pyparsing.pyRHys cCsR|jdd|}|jd|}|dkrB||d|!S||dSdS(sfReturns the line of text containing loc within a string, counting newlines as line separators. s iiN(R tfind(RR tlastCRtnextCR((s-/usr/lib/python2.7/site-packages/pyparsing.pyREs  cCsAdt|dt|dt||t||fGHdS(NsMatch s at loc s(%d,%d)(RoRHR5(tinstringRtexpr((s-/usr/lib/python2.7/site-packages/pyparsing.pyt_defaultStartDebugActionscCs'dt|dt|jGHdS(NsMatched s -> (RoRlR(RtstartloctendlocRttoks((s-/usr/lib/python2.7/site-packages/pyparsing.pyt_defaultSuccessDebugActionscCsdt|GHdS(NsException raised:(Ro(RRRtexc((s-/usr/lib/python2.7/site-packages/pyparsing.pyt_defaultExceptionDebugActionscGsdS(sG'Do-nothing' debug action, to suppress debugging output during parsing.N((targs((s-/usr/lib/python2.7/site-packages/pyparsing.pyROscs"dgfd}|S(Nics]xVy|dSWqtk rUdkrOdcd7d5Z?d6Z@d7ZAd8ZBd9ZCRS(:s)Abstract base level parser element class.s cCs |t_dS(s/Overrides the default whitespace chars N(RtDEFAULT_WHITE_CHARS(tchars((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetDefaultWhitespaceCharsscCst|_d|_d|_d|_||_t|_t j |_ t|_ t |_t |_t|_t |_t |_t|_d|_t|_d|_d|_t|_t |_dS(NR(NNN(Rt parseActionRt failActiontstrReprt resultsNamet saveAsListRtskipWhitespaceRR!t whiteCharstcopyDefaultWhiteCharsRtmayReturnEmptytkeepTabst ignoreExprstdebugt streamlinedt mayIndexErrorterrmsgt modalResultst debugActionstret callPreparset callDuringTry(Rtsavelist((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs(                   cCsEtj|}|j|_|j|_|jrAtj|_n|S(sMake a copy of this C{ParserElement}. Useful for defining different parse actions for the same parsing pattern, using copies of the original parse element.(RR$R.R+RR!R*(Rtcpy((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs    cCs>||_d|j|_t|dr:|j|j_n|S(s6Define name for this expression, for use in debugging.s Expected t exception(RR2thasattrR:R(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetNames  cCsE|j}|jdr.|d }t}n||_| |_|S(s%Define name for referencing matching tokens as a nested attribute of the returned parse results. NOTE: this returns a *copy* of the original C{ParserElement} object; this is so that the client can define a basic element, such as an integer, and reference it in multiple places with different names. You can also set results names using the abbreviated syntax, C{expr("name")} in place of C{expr.setResultsName("name")} - see L{I{__call__}<__call__>}. t*i(RtendswithRR'R3(RRtlistAllMatchestnewself((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetResultsNames     csa|r9|jttfd}|_||_n$t|jdr]|jj|_n|S(sMethod to invoke the Python pdb debugger when this element is about to be parsed. Set C{breakFlag} to True to enable, False to disable. cs)ddl}|j||||S(Ni(tpdbt set_trace(RRt doActionst callPreParseRB(t _parseMethod(s-/usr/lib/python2.7/site-packages/pyparsing.pytbreakers  t_originalParseMethod(t_parseRRHR;(Rt breakFlagRG((RFs-/usr/lib/python2.7/site-packages/pyparsing.pytsetBreaks   cOs;tttt||_d|ko1|d|_|S(sVDefine action to perform when successfully matching parse element definition. Parse action fn is a callable method with 0-3 arguments, called as C{fn(s,loc,toks)}, C{fn(loc,toks)}, C{fn(toks)}, or just C{fn()}, where: - s = the original string being parsed (see note below) - loc = the location of the matching substring - toks = a list of the matched tokens, packaged as a ParseResults object If the functions in fns modify the tokens, they can return them as the return value from fn, and the modified list of tokens will replace the original. Otherwise, fn does not need to return any value. Note: the default parsing behavior is to expand tabs in the input string before starting the parsing process. See L{I{parseString}} for more information on parsing strings containing s, and suggested methods to maintain a consistent view of the parsed string, the parse location, and line and column positions within the parsed string. R7(RtmapR R$R7(Rtfnstkwargs((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetParseActionscOsJ|jtttt|7_|jp@d|ko@|d|_|S(saAdd parse action to expression's list of parse actions. See L{I{setParseAction}}.R7(R$RRLR R7(RRMRN((s-/usr/lib/python2.7/site-packages/pyparsing.pytaddParseAction's$"cCs ||_|S(sDefine action to perform if parsing fails at this expression. Fail acton fn is a callable function that takes the arguments C{fn(s,loc,expr,err)} where: - s = string being parsed - loc = location where expression match was attempted and failed - expr = the parse expression that failed - err = the exception thrown The function returns no value. It may throw C{ParseFatalException} if it is desired to stop parsing immediately.(R%(Rtfn((s-/usr/lib/python2.7/site-packages/pyparsing.pyt setFailAction-s cCsmt}x`|rht}xM|jD]B}y(x!|j||\}}t}q+Wqtk r`qXqWq W|S(N(RRR.RIR(RRRt exprsFoundtetdummy((s-/usr/lib/python2.7/site-packages/pyparsing.pyt_skipIgnorables:s    cCsp|jr|j||}n|jrl|j}t|}x-||krh|||krh|d7}q?Wn|S(Ni(R.RVR)R*R(RRRtwttinstrlen((s-/usr/lib/python2.7/site-packages/pyparsing.pytpreParseGs    cCs |gfS(N((RRRRD((s-/usr/lib/python2.7/site-packages/pyparsing.pyt parseImplSscCs|S(N((RRRt tokenlist((s-/usr/lib/python2.7/site-packages/pyparsing.pyt postParseVsc Cs|j}|s|jr_|jdr?|jd|||n|rc|jrc|j||}n|}|}yUy|j|||\}}Wn/tk rt|t||j |nXWqt k r[d} |jdrt j d} |jd|||| n|jrU| dkr<t j d} n|j|||| nqXn|r|jr|j||}n|}|}|js|t|kry|j|||\}}Wqtk rt|t||j |qXn|j|||\}}|j|||}t||jd|jd|j} |jr|sj|jr|r6yrxk|jD]`} | ||| }|dk r}t||jd|jot|ttfd|j} q}q}WWqt k r2|jdr,t j d} |jd|||| nqXqxn|jD]`} | ||| }|dk r@t||jd|jot|ttfd|j} q@q@Wn|r|jdr|jd||||| qn|| fS(NiiiRR(R/R%R4R6RYRZRRRR2RRtsystexc_infoR1R\RR'R(R3R$R7RjR( RRRRDREt debuggingtpreloct tokensStartttokensterrt retTokensRQ((s-/usr/lib/python2.7/site-packages/pyparsing.pyt _parseNoCacheZsz   &      %$        #cCsNy|j||dtdSWn)tk rIt|||j|nXdS(NRDi(RIRRRR2(RRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyttryParses cCs|||||f}|tjkratj|}t|trI|n|d|djfSyA|j||||}|d|djftj|<|SWn1tk rtjd}|tj|<nXdS(Nii( Rt _exprArgCacheRjt ExceptionRReRR]R^(RRRRDREtlookupRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt _parseCaches  !  cCstjjdS(N(RRgtclear(((s-/usr/lib/python2.7/site-packages/pyparsing.pyt resetCachescCs%tjs!tt_tjt_ndS(sEnables "packrat" parsing, which adds memoizing to the parsing logic. Repeated parse attempts at the same string location (which happens often in many complex grammars) can immediately return a cached value, instead of re-executing parsing/validating code. Memoizing is done of both valid results and parsing exceptions. This speedup may break existing programs that use parse actions that have side-effects. For this reason, packrat parsing is disabled when you first import pyparsing. To activate the packrat feature, your program must call the class method C{ParserElement.enablePackrat()}. If your program uses C{psyco} to "compile as you go", you must call C{enablePackrat} before calling C{psyco.full()}. If you do not do this, Python will crash. For best results, call C{enablePackrat()} immediately after importing pyparsing. N(Rt_packratEnabledRRjRI(((s-/usr/lib/python2.7/site-packages/pyparsing.pyt enablePackrats  cCstj|js |jnx|jD]}|jq*W|jsV|j}nyW|j|d\}}|r|j||}t t }|j||nWn6t k rtj rqt jd}|nX|SdS(sExecute the parse expression with the given string. This is the main interface to the client code, once the complete expression has been built. If you want the grammar to require that the entire input string be successfully parsed, then set C{parseAll} to True (equivalent to ending the grammar with C{StringEnd()}). Note: C{parseString} implicitly calls C{expandtabs()} on the input string, in order to report proper column numbers in parse actions. If the input string contains tabs and the grammar uses parse actions that use the C{loc} argument to index into the string being parsed, you can ensure you have a consistent view of the input string by: - calling C{parseWithTabs} on your grammar before calling C{parseString} (see L{I{parseWithTabs}}) - define your parse action using the full C{(s,loc,toks)} signature, and reference the input string using the parse action's C{s} argument - explictly expand the tabs in your input string before calling C{parseString} iiN(RRlR0t streamlineR.R-t expandtabsRIRYRR$Rtverbose_stacktraceR]R^(RRtparseAllRTRRbtseR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt parseStrings&       ccs|js|jnx|jD]}|jq W|jsRt|j}nt|}d}|j}|j}t j d} yx||kra| |kray.|||} ||| dt \} } Wnt k r| d}qX| |krT| d7} | | | fV|rK|||} | |kr>| }qQ|d7}q^| }q| d}qWWn6t k rt jrqtjd}|nXdS(s"Scan the input string for expression matches. Each match will return the matching tokens, start location, and end location. May be called with optional C{maxMatches} argument, to clip scanning after 'n' matches are found. If C{overlap} is specified, then overlapping matches will be reported. Note that the start and end locations are reported relative to the string being parsed. See L{I{parseString}} for more information on parsing strings with embedded tabs.iREiN(R0RoR.R-RoRpRRYRIRRlRRRRqR]R^(RRt maxMatchestoverlapRTRXRt preparseFntparseFntmatchesR`tnextLocRbtnextlocR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt scanString sD                c Cs3g}d}t|_yx|j|D]}\}}}|j|||!|rt|trs||j7}qt|tr||7}q|j|n|}q(W|j||g|D]}|r|^q}djt t t |SWn6t k r.t jrq/tjd}|nXdS(sExtension to C{scanString}, to modify matching text with modified tokens that may be returned from a parse action. To use C{transformString}, define a grammar and attach a parse action to it that modifies the returned token list. Invoking C{transformString()} on a target string will then scan for matches, and replace the matched text patterns according to the logic in the parse action. C{transformString()} returns the resulting transformed string.iRiN(RR-R|RRjRRRRRLRot_flattenRRRqR]R^( RRRtlastEttRgRTtoR((s-/usr/lib/python2.7/site-packages/pyparsing.pyttransformString?s*      cCssy6tg|j||D]\}}}|^qSWn6tk rntjrUqotjd}|nXdS(sAnother extension to C{scanString}, simplifying the access to the tokens found to match the given parse expression. May be called with optional C{maxMatches} argument, to clip searching after 'n' matches are found. iN(RR|RRRqR]R^(RRRuRRgRTR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt searchStringas6  cCsat|trt|}nt|tsQtjdt|tdddSt ||gS(s*Implementation of + operator - returns Ands4Cannot combine element of type %s with ParserElementt stackleveliN( RjRRRtwarningstwarnttypet SyntaxWarningRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRps cCsYt|trt|}nt|tsQtjdt|tdddS||S(sHImplementation of + operator when left operand is not a C{ParserElement}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRzs cCsjt|trt|}nt|tsQtjdt|tdddSt |t j |gS(s<Implementation of - operator, returns C{And} with error stops4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRRRt _ErrorStop(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__sub__s cCsYt|trt|}nt|tsQtjdt|tdddS||S(sHImplementation of - operator when left operand is not a C{ParserElement}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__rsub__s csEt|tr|d}}n-t|tr7|d d }|dd kr_d|df}nt|dtr|dd kr|ddkrtS|ddkrtS|dtSqLt|dtrt|dtr|\}}||8}qLtdt|dt|dntdt||dkrgtdn|dkrtdn||kodknrtdn|rfd |r |dkr|}qt g||}qA|}n(|dkr.}nt g|}|S( sImplementation of * operator, allows use of C{expr * 3} in place of C{expr + expr + expr}. Expressions may also me multiplied by a 2-integer tuple, similar to C{{min,max}} multipliers in regular expressions. Tuples may also include C{None} as in: - C{expr*(n,None)} or C{expr*(n,)} is equivalent to C{expr*n + ZeroOrMore(expr)} (read as "at least n instances of C{expr}") - C{expr*(None,n)} is equivalent to C{expr*(0,n)} (read as "0 to n instances of C{expr}") - C{expr*(None,None)} is equivalent to C{ZeroOrMore(expr)} - C{expr*(1,None)} is equivalent to C{OneOrMore(expr)} Note that C{expr*(None,n)} does not raise an exception if more than n exprs exist in the input stream; that is, C{expr*(None,n)} does not enforce a maximum number of expr occurrences. If this behavior is desired, then write C{expr*(None,n) + ~expr} iiis7cannot multiply 'ParserElement' and ('%s','%s') objectss0cannot multiply 'ParserElement' and '%s' objectss/cannot multiply ParserElement by negative values@second tuple value must be greater or equal to first tuple values+cannot multiply ParserElement by 0 or (0,0)cs2|dkr$t|dStSdS(Ni(R(tn(tmakeOptionalListR(s-/usr/lib/python2.7/site-packages/pyparsing.pyRs N(NN( RjRttupleRR.RRRt ValueErrorR(RRt minElementst optElementsR((RRs-/usr/lib/python2.7/site-packages/pyparsing.pyt__mul__sD#  &  )      cCs |j|S(N(R(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__rmul__scCsat|trt|}nt|tsQtjdt|tdddSt ||gS(s4Implementation of | operator - returns C{MatchFirst}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__or__s cCsYt|trt|}nt|tsQtjdt|tdddS||BS(sHImplementation of | operator when left operand is not a C{ParserElement}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__ror__s cCsat|trt|}nt|tsQtjdt|tdddSt ||gS(s,Implementation of ^ operator - returns C{Or}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__xor__s cCsYt|trt|}nt|tsQtjdt|tdddS||AS(sHImplementation of ^ operator when left operand is not a C{ParserElement}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__rxor__s cCsat|trt|}nt|tsQtjdt|tdddSt ||gS(s.Implementation of & operator - returns C{Each}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__and__s cCsYt|trt|}nt|tsQtjdt|tdddS||@S(sHImplementation of & operator when left operand is not a C{ParserElement}s4Cannot combine element of type %s with ParserElementRiN( RjRRRRRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__rand__s cCs t|S(s0Implementation of ~ operator - returns C{NotAny}(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyt __invert__scCs |j|S(sShortcut for C{setResultsName}, with C{listAllMatches=default}:: userdata = Word(alphas).setResultsName("name") + Word(nums+"-").setResultsName("socsecno") could be written as:: userdata = Word(alphas)("name") + Word(nums+"-")("socsecno") If C{name} is given with a trailing C{'*'} character, then C{listAllMatches} will be passed as C{True}. (RA(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__call__s cCs t|S(sSuppresses the output of this C{ParserElement}; useful to keep punctuation from cluttering up returned output. (R&(R((s-/usr/lib/python2.7/site-packages/pyparsing.pytsuppress*scCs t|_|S(sDisables the skipping of whitespace before matching the characters in the C{ParserElement}'s defined pattern. This is normally only used internally by the pyparsing module, but may be needed in some whitespace-sensitive grammars. (RR)(R((s-/usr/lib/python2.7/site-packages/pyparsing.pytleaveWhitespace0s cCst|_||_t|_|S(s/Overrides the default whitespace chars (RR)R*RR+(RR"((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetWhitespaceChars8s   cCs t|_|S(sOverrides default behavior to expand C{}s to spaces before parsing the input string. Must be called before C{parseString} when the input grammar contains elements that match C{} characters.(RR-(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyt parseWithTabs@s cCsZt|tr:||jkrV|jj|jqVn|jjt|j|S(sDefine expression to be ignored (e.g., comments) while doing pattern matching; may be called repeatedly, to define multiple comment or other ignorable patterns. (RjR&R.RR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pytignoreGs cCs1|p t|pt|ptf|_t|_|S(sBEnable display of debugging messages while doing pattern matching.(RRRR4RR/(Rt startActiont successActiontexceptionAction((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetDebugActionsSs    cCs)|r|jtttn t|_|S(s~Enable display of debugging messages while doing pattern matching. Set C{flag} to True to enable, False to disable.(RRRRRR/(Rtflag((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetDebug[s cCs|jS(N(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRdscCs t|S(N(Ro(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRgscCst|_d|_|S(N(RR0RR&(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRojs  cCsdS(N((RR((s-/usr/lib/python2.7/site-packages/pyparsing.pytcheckRecursionoscCs|jgdS(sXCheck defined expressions for valid structure, check for infinite recursive definitions.N(R(Rt validateTrace((s-/usr/lib/python2.7/site-packages/pyparsing.pytvalidaterscCsy|j}Wn6tk rHt|d}|j}|jnXy|j||SWn'tk rtjd}|nXdS(sExecute the parse expression on the given file or filename. If a filename is specified (instead of a file object), the entire file is opened, read, and closed before parsing. trbiN(treadRtopentcloseRtRR]R^(Rtfile_or_filenameRrt file_contentstfR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt parseFilevs   cCstdd|j|S(NRi(RR2(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyt getExceptionscCs7|dkr#|j|_}|Std|dS(Nt myExceptionsno such attribute (RRR(RRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs cCst|tr+||kp*|j|jkSt|trsy!|jt|dttSWqtk rotSXnt t||kSdS(NRr( RjRt__dict__RRtRoRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__eq__s cCs ||k S(N((RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__ne__scCstt|S(N(thashtid(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__hash__scCs ||kS(N((RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__req__scCs ||k S(N((RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__rne__s(DR|R}RR!RRqR#t staticmethodRRR<RARRKRORPRRRVRYRZR\ReRfRjRIRgRlRmRnRtt_MAX_INTR|RRRRRRRRRRRRRRRRRRRRRRRRRRoRRRRRRRRRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs          M      .3 "  D                  cBs eZdZdZdZRS(sJAbstract C{ParserElement} subclass, for defining atomic matching patterns.cCstt|jdtdS(NR8(RR'RR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRscCs,tt|j|}d|j|_|S(Ns Expected (RR'R<RR2(RRRg((s-/usr/lib/python2.7/site-packages/pyparsing.pyR<s(R|R}RRR<(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR's cBseZdZdZRS(s"An empty token, will always match.cCs2tt|jd|_t|_t|_dS(NR(RRRRRR,RR1(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs  (R|R}RR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyRscBs#eZdZdZedZRS(sA token that will never match.cCs;tt|jd|_t|_t|_d|_dS(NRsUnmatchable token( RRRRRR,RR1R2(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs    cCs%|j}||_||_|dS(N(RRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZs   (R|R}RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs cBs#eZdZdZedZRS(s*Token to exactly match a specified string.cCstt|j||_t||_y|d|_Wn0tk rntj dt ddt |_ nXdt |j|_d|j|_t|_t|_dS(Nis2null string passed to Literal; use Empty() insteadRis"%s"s Expected (RRRtmatchRtmatchLentfirstMatchCharRRRRRt __class__RoRR2RR,R1(Rt matchString((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs      cCsp|||jkrK|jdks7|j|j|rK||j|jfS|j}||_||_|dS(Ni(RRt startswithRRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZs$   (R|R}RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs cBsQeZdZedZeedZedZdZ dZ e e Z RS(sToken to exactly match a specified string as a keyword, that is, it must be immediately followed by a non-keyword character. Compare with C{Literal}:: Literal("if") will match the leading C{'if'} in C{'ifAndOnlyIf'}. Keyword("if") will not; it will only match the leading C{'if'} in C{'if x=1'}, or C{'if(y==2)'} Accepts two optional constructor arguments in addition to the keyword string: C{identChars} is a string of characters that would be valid identifier characters, defaulting to all alphanumerics + "_" and "$"; C{caseless} allows case-insensitive matching, default is C{False}. s_$cCstt|j||_t||_y|d|_Wn'tk retj dt ddnXd|j|_ d|j |_ t |_t |_||_|r|j|_|j}nt||_dS(Nis2null string passed to Keyword; use Empty() insteadRis"%s"s Expected (RR RRRRRRRRRRR2RR,R1tcaselesstuppert caselessmatchtsett identChars(RRRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs"      c Csk|jr||||j!j|jkrF|t||jkse|||jj|jkrF|dks||dj|jkrF||j|jfSn|||jkrF|jdks|j|j|rF|t||jks|||j|jkrF|dks2||d|jkrF||j|jfS|j }||_ ||_ |dS(Nii( RRRRRRRRRRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZs #9)$3#   cCs%tt|j}tj|_|S(N(RR RtDEFAULT_KEYWORD_CHARSR(RRh((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cCs |t_dS(s,Overrides the default Keyword chars N(R R(R"((s-/usr/lib/python2.7/site-packages/pyparsing.pytsetDefaultKeywordChars%s( R|R}RR/RRRRRZRRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s     cBs#eZdZdZedZRS(sToken to match a specified string, ignoring case of letters. Note: the matched results will always be in the case of the given match string, NOT the case of the input text. cCsItt|j|j||_d|j|_d|j|_dS(Ns'%s's Expected (RRRRt returnStringRR2(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR0s cCs\||||j!j|jkr7||j|jfS|j}||_||_|dS(N(RRRRRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ7s #   (R|R}RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR+s cBs#eZejdZedZRS(cCs#tt|j||dtdS(NR(RRRR(RRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRAscCs||||j!j|jkrp|t||jks\|||jj|jkrp||j|jfS|j}||_||_|dS(N( RRRRRRRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZDs#9   (R|R}R RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR@scBs>eZdZddddeddZedZdZRS(sToken for matching words composed of allowed character sets. Defined with string containing all allowed initial characters, an optional string containing allowed body characters (if omitted, defaults to the initial character set), and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. An optional C{exclude} parameter can list characters that might be found in the input C{bodyChars} string; useful to define a word of all printables except for one or two characters, for instance. iic Cstt|j|rdjg|D]}||kr&|^q&}|rdjg|D]}||krZ|^qZ}qn||_t||_|r||_t||_n||_t||_|dk|_ |dkrt dn||_ |dkr||_ n t |_ |dkrG||_ ||_ nt||_d|j|_t|_||_d|j|jkr|dkr|dkr|dkr|j|jkrdt|j|_net|jdkrdtj|jt|jf|_n%d t|jt|jf|_|jrbd |jd |_nytj|j|_Wqd|_qXndS( NRiisZcannot specify a minimum length < 1; use Optional(Word()) if zero-length word is permitteds Expected t s[%s]+s%s[%s]*s [%s][%s]*s\b(RR+RRt initCharsOrigRt initCharst bodyCharsOrigt bodyCharst maxSpecifiedRtminLentmaxLenRRoRR2RR1t asKeywordt_escapeRegexRangeCharstreStringRR5tescapetcompileR( RRRtmintmaxtexactRt excludeCharsRh((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZsT.4             :  c Cs|jrd|jj||}|sH|j}||_||_|n|j}||jfS|||jkr|j}||_||_|n|}|d7}t|}|j }||j } t | |} x*|| kr|||kr|d7}qWt } |||j kr+t} n|jrY||krY|||krYt} n|jr|dkr||d|ks||kr|||krt} qn| r|j}||_||_|n||||!fS(Nii(R5RRRRtendtgroupRRRRRRRRRR( RRRRDtresultRtstartRXt bodycharstmaxloctthrowException((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZsH               %  <     cCsytt|jSWnnX|jdkrd}|j|jkrsd||j||jf|_qd||j|_n|jS(NcSs&t|dkr|d dS|SdS(Nis...(R(Rg((s-/usr/lib/python2.7/site-packages/pyparsing.pyt charsAsStrs s W:(%s,%s)sW:(%s)(RR+RR&RRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs (N( R|R}RRRRRRZR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR+Ns 6 -cBsDeZdZeejdZddZedZ dZ RS(sToken for matching strings that match a given regular expression. Defined with string specifying the regular expression in a form recognized by the inbuilt Python re module. s[A-Z]icCs?tt|jt|trt|dkrMtjdtddn||_ ||_ y+t j |j |j |_ |j |_ Wq tjk rtjd|tddq XnIt|tjr||_ t||_ |_ ||_ n tdt||_d|j|_t|_t|_dS( sThe parameters C{pattern} and C{flags} are passed to the C{re.compile()} function as-is. See the Python C{re} module for an explanation of the acceptable patterns and flags.is0null string passed to Regex; use Empty() insteadRis$invalid pattern (%s) passed to RegexsCRegex may only be constructed with a string or a compiled RE objects Expected N(RR"RRjRRRRRtpatterntflagsR5RRt sre_constantsterrortcompiledREtypeRlRRoRR2RR1RR,(RRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs.          c Cs|jj||}|s?|j}||_||_|n|j}|j}t|j}|rx|D]}|||||jd d jgtt|j d dd D]3}d tj|j | t|j |f^qd7_n|rc|jdtj|7_n|r|jdtj|7_djt|j d|j djddjdd}tj|jd||_n|jdtj|j 7_y+tj|j|j|_|j|_Wn4t j!k rdtjd|jtddnXt"||_#d|j#|_$t%|_&t'|_(dS(s Defined with the following parameters: - quoteChar - string of one or more characters defining the quote delimiting string - escChar - character to escape quotes, typically backslash (default=None) - escQuote - special quote sequence to escape an embedded quote string (such as SQL's "" to escape an embedded ") (default=None) - multiline - boolean indicating whether quotes can span multiple lines (default=False) - unquoteResults - boolean indicating whether the matched text should be unquoted (default=True) - endQuoteChar - string of one or more characters defining the end of the quote delimited string (default=None => same as quoteChar) is$quoteChar cannot be the empty stringRis'endQuoteChar cannot be the empty strings %s(?:[^%s%s]Rs%s(?:[^%s\n\r%s]is|(?:s)|(?:is%s[^%s]t)s|(?:%s)s|(?:%s.)t^s\^t-s\-s([%s])s)*%ss$invalid pattern (%s) passed to Regexs Expected N()RR RRRRRRt SyntaxErrorRt quoteChart quoteCharLentfirstQuoteChart endQuoteChartendQuoteCharLentescChartescQuotetunquoteResultsR5t MULTILINEtDOTALLRRRRRRRRttescCharReplacePatternRRRRRoRR2RR1RR,( RRRRt multilineRRRtcharset((s-/usr/lib/python2.7/site-packages/pyparsing.pyRsf             ( %o?   cCs|||jkr(|jj||p+d}|sX|j}||_||_|n|j}|j}|j r||j |j !}t |t r|jrtj|jd|}n|jr|j|j|j}qqn||fS(Ns\g<1>(RR5RRRRRRRRRRRjRRRRRRtR(RRRRDRRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZds .         !cCsSytt|jSWnnX|jdkrLd|j|jf|_n|jS(Ns.quoted string, starting with %s ending with %s(RR RR&RRR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRsN( R|R}RRRRRRZR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR sJ cBs5eZdZddddZedZdZRS(sToken for matching words composed of characters *not* in a given set. Defined with string containing all disallowed characters, and an optional minimum, maximum, and/or exact length. The default value for C{min} is 1 (a minimum value < 1 is not valid); the default values for C{max} and C{exact} are 0, meaning no maximum or exact length restriction. iicCstt|jt|_||_|dkr@tdn||_|dkra||_n t |_|dkr||_||_nt ||_ d|j |_ |jdk|_ t|_dS(Nisfcannot specify a minimum length < 1; use Optional(CharsNotIn()) if zero-length char group is permittedis Expected (RRRRR)tnotCharsRRRRRoRR2R,R1(RRRRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs           cCs|||jkr7|j}||_||_|n|}|d7}|j}t||jt|}x*||kr|||kr|d7}qoW|||jkr|j}||_||_|n||||!fS(Ni(RRRRRRRR(RRRRDRRtnotcharstmaxlen((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZs$          cCsvytt|jSWnnX|jdkrot|jdkr\d|jd |_qod|j|_n|jS(Nis !W:(%s...)s!W:(%s)(RRRR&RRR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs(R|R}RRRRZR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs cBsXeZdZidd6dd6dd6dd6d d 6Zd d d d dZedZRS(sSpecial matching class for matching whitespace. Normally, whitespace is ignored by pyparsing grammars. This class is included when some whitespace structures are significant. Define with a string containing the whitespace characters to be matched; default is C{" \t\r\n"}. Also takes optional C{min}, C{max}, and C{exact} arguments, as defined for the C{Word} class.sRss ss ss ss s iicCstt|j||_|jdjg|jD]}||jkr2|^q2djg|jD]}tj|^qg|_t |_ d|j|_ ||_ |dkr||_ n t|_ |dkr||_ ||_ ndS(NRs Expected i(RR*Rt matchWhiteRRR*t whiteStrsRRR,R2RRR(RtwsRRRRh((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs ;/       cCs|||jkr7|j}||_||_|n|}|d7}||j}t|t|}x-||kr|||jkr|d7}qlW|||jkr|j}||_||_|n||||!fS(Ni(RRRRRRRR(RRRRDRRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZs"      "    (R|R}RRRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR*s t_PositionTokencBseZdZRS(cCs8tt|j|jj|_t|_t|_ dS(N( RRRRR|RRR,RR1(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s (R|R}R(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR scBs,eZdZdZdZedZRS(sXToken to advance to a specific column of input text; useful for tabular report scraping.cCs tt|j||_dS(N(RR RR5(Rtcolno((s-/usr/lib/python2.7/site-packages/pyparsing.pyRscCst|||jkrt|}|jrB|j||}nxE||kr||jrt|||jkr|d7}qEWn|S(Ni(R5RR.RVtisspace(RRRRX((s-/usr/lib/python2.7/site-packages/pyparsing.pyRYs  7cCs^t||}||jkr6t||d|n||j|}|||!}||fS(NsText not in expected column(R5R(RRRRDtthiscoltnewlocR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ s  (R|R}RRRYRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s  cBs,eZdZdZdZedZRS(sQMatches if current position is at the beginning of a line within the parse stringcCs<tt|j|jtjjddd|_dS(Ns RsExpected start of line(RRRRRR!RtR2(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR*scCs<tt|j||}||dkr8|d7}n|S(Ns i(RRRY(RRRR`((s-/usr/lib/python2.7/site-packages/pyparsing.pyRY/s cCsf|dkp5||j|dkp5||ddks\|j}||_||_|n|gfS(Niis (RYRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ5s     (R|R}RRRYRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR(s  cBs#eZdZdZedZRS(sKMatches if current position is at the end of a line within the parse stringcCs<tt|j|jtjjddd|_dS(Ns RsExpected end of line(RRRRRR!RtR2(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRBscCs|t|krT||dkr0|ddfS|j}||_||_|nA|t|krt|dgfS|j}||_||_|dS(Ns i(RRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZGs       (R|R}RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR@s cBs#eZdZdZedZRS(sCMatches if current position is at the beginning of the parse stringcCs tt|jd|_dS(NsExpected start of text(RR%RR2(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR[scCsU|dkrK||j|dkrK|j}||_||_|qKn|gfS(Ni(RYRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ_s     (R|R}RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR%Ys cBs#eZdZdZedZRS(s=Matches if current position is at the end of the parse stringcCs tt|jd|_dS(NsExpected end of text(RR$RR2(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRlscCs|t|kr6|j}||_||_|n]|t|krV|dgfS|t|krr|gfS|j}||_||_|dS(Ni(RRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZps        (R|R}RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR$js cBs&eZdZedZedZRS(swMatches if the current position is at the beginning of a Word, and is not preceded by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordStart(alphanums)}. C{WordStart} will also match at the beginning of the string being parsed, or at the beginning of a line. cCs/tt|jt||_d|_dS(NsNot at the start of a word(RR-RRt wordCharsR2(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRscCsg|dkr]||d|jks6|||jkr]|j}||_||_|q]n|gfS(Nii(RRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZs     (R|R}RRTRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR-s cBs&eZdZedZedZRS(saMatches if the current position is at the end of a Word, and is not followed by any character in a given set of C{wordChars} (default=C{printables}). To emulate the C{} behavior of regular expressions, use C{WordEnd(alphanums)}. C{WordEnd} will also match at the end of the string being parsed, or at the end of a line. cCs8tt|jt||_t|_d|_dS(NsNot at the end of a word(RR,RRRRR)R2(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs cCst|}|dkru||kru|||jksN||d|jkru|j}||_||_|qun|gfS(Nii(RRRRR(RRRRDRXR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZs     (R|R}RRTRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR,s cBsqeZdZedZdZdZdZdZdZ dZ edZ gd Z d Z RS( sTAbstract subclass of ParserElement, for combining and post-processing parsed tokens.cCstt|j|t|tr1||_nWt|trUt|g|_n3yt||_Wntk r|g|_nXt |_ dS(N( RRRRjRtexprsRRRRR6(RRR8((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs  cCs |j|S(N(R(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRscCs|jj|d|_|S(N(RRRR&(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs cCsPt|_g|jD]}|j^q|_x|jD]}|jq8W|S(s~Extends C{leaveWhitespace} defined in base class, and also invokes C{leaveWhitespace} on all contained expressions.(RR)RRR(RRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs  %cCst|trb||jkrtt|j|x(|jD]}|j|jdq>Wqn>tt|j|x%|jD]}|j|jdqW|S(Ni(RjR&R.RRRR(RRRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyRscCs\ytt|jSWnnX|jdkrUd|jjt|jf|_n|jS(Ns%s:(%s)( RRRR&RRR|RoR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs%c Csdtt|jx|jD]}|jqWt|jdkr`|jd}t||jr|j r|jdkr|j r|j|jdg|_d|_ |j |j O_ |j |j O_ n|jd}t||jr`|j r`|jdkr`|j r`|jd |j|_d|_ |j |j O_ |j |j O_ q`n|S(Niiii(RRRoRRRjRR$R'RR/R&R,R1(RRTR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRos.        cCstt|j||}|S(N(RRRA(RRR?R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRA scCs@||g}x|jD]}|j|qW|jgdS(N(RRR(RRttmpRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR scCs>tt|j}g|jD]}|j^q|_|S(N(RRRR(RRRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s%(R|R}RRRRRRRRRoRARR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyRs    cBsWeZdZdefdYZedZedZdZdZ dZ RS(sRequires all given C{ParseExpression}s to be found in the given order. Expressions may be separated by whitespace. May be constructed using the C{'+'} operator. RcBseZdZRS(cOs'tt|j|||jdS(N(RRRR(RRRN((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s(R|R}R(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR scCs}tt|j||t|_x'|jD]}|js,t|_Pq,q,W|j|dj|dj |_ t|_ dS(Ni( RRRRR,RRRR*R)R6(RRR8RT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR! s   c CsG|jdj|||dt\}}t}x |jdD]}t|tjr`t}q<n|ry|j|||\}}Wqtk rqtk rt j d}t|qt k rtt |t ||j|qXn|j|||\}}|s,|jr<||7}q<q<W||fS(NiREi(RRIRRjRRRRRR]R^RRRR2R( RRRRDt resultlistt errorStopRTt exprtokensR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ, s((   +cCs+t|trt|}n|j|S(N(RjRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRE scCs@||g}x+|jD] }|j||jsPqqWdS(N(RRR,(RRtsubRecCheckListRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyRJ s   cCset|dr|jS|jdkr^ddjg|jD]}t|^q8d|_n|jS(NRt{Rt}(R;RR&RRRRo(RRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyRQ s 9( R|R}RRRRRRZRRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s   cBsAeZdZedZedZdZdZdZ RS(sRequires that at least one C{ParseExpression} is found. If two expressions match, the expression that matches the longest string will be used. May be constructed using the C{'^'} operator. cCsPtt|j||t|_x'|jD]}|jr,t|_Pq,q,WdS(N(RRRRR,RR(RRR8RT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR` s    c Cs7d}d}d}x|jD]}y|j||}Wntk r|tjd} | j|kr| }| j}qqtk rt||krt|t||j |}t|}qqX||kr|}|} qqW|dkr$|dk r |q$t||d|n| j |||S(Niiis no defined alternatives to match( RRRfRR]R^RRRR2RI( RRRRDt maxExcLoct maxMatchLoct maxExceptionRTtloc2Rct maxMatchExp((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZh s.       cCs+t|trt|}n|j|S(N(RjRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__ixor__ scCset|dr|jS|jdkr^ddjg|jD]}t|^q8d|_n|jS(NRRs ^ R(R;RR&RRRRo(RRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s 9cCs3||g}x|jD]}|j|qWdS(N(RR(RRR RT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s( R|R}RRRRRZRRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR[ s     cBsAeZdZedZedZdZdZdZ RS(sRequires that at least one C{ParseExpression} is found. If two expressions match, the first one listed is the one that will match. May be constructed using the C{'|'} operator. cCsbtt|j|||rUt|_x3|jD]}|jr2t|_Pq2q2Wn t|_dS(N(RRRRR,RR(RRR8RT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s    c Csd}d}x|jD]}y|j|||}|SWqtk ro}|j|kr|}|j}qqtk rt||krt|t||j|}t|}qqXqW|dk r|nt||d|dS(Nis no defined alternatives to match(RRRIRRRRR2( RRRRDRRRTRRc((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ s"   cCs+t|trt|}n|j|S(N(RjRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt__ior__ scCset|dr|jS|jdkr^ddjg|jD]}t|^q8d|_n|jS(NRRs | R(R;RR&RRRRo(RRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s 9cCs3||g}x|jD]}|j|qWdS(N(RR(RRR RT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s( R|R}RRRRRZRRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s    cBs8eZdZedZedZdZdZRS(sRequires all given C{ParseExpression}s to be found, but in any order. Expressions may be separated by whitespace. May be constructed using the C{'&'} operator. cCsbtt|j||t|_x'|jD]}|js,t|_Pq,q,Wt|_t|_dS(N( RRRRR,RRR)tinitExprGroups(RRR8RT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s    cCs|jr,g|jD]}t|tr|j^q}g|jD]!}|jrA||krA|^qA}|||_g|jD]}t|tr|j^q|_g|jD]}t|t r|j^q|_ g|jD]$}t|ttt fs|^q|_ |j |j 7_ t |_n|}|j }|j} g} t } x| r*|| |j|j } g} x| D]}y|j||}Wntk r| j|qX| j|||kr|j|q|| kr| j|qqWt| t| krUt } qUqUW|rrdjg|D]}t|^q>}t||d|n| g|jD]*}t|tr|j| kr|^q7} g}x6| D].}|j|||\}}|j|qWtg}x|D]}i}xW|jD]I}||jkrt||}|t||7}|||   cCset|dr|jS|jdkr^ddjg|jD]}t|^q8d|_n|jS(NRRs & R(R;RR&RRRRo(RRT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s 9cCs3||g}x|jD]}|j|qWdS(N(RR(RRR RT((s-/usr/lib/python2.7/site-packages/pyparsing.pyR& s(R|R}RRRRZRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s  : cBs_eZdZedZedZdZdZdZ dZ gdZ dZ RS( sWAbstract subclass of C{ParserElement}, for combining and post-processing parsed tokens.cCstt|j|t|tr4t|}n||_d|_|dk r|j |_ |j |_ |j |j |j |_ |j|_|j|_|jj|jndS(N(RRRRjRRRRR&R1R,RR*R)R(R6R.textend(RRR8((s-/usr/lib/python2.7/site-packages/pyparsing.pyR. s        cCsG|jdk r+|jj|||dtStd||j|dS(NRER(RRRIRRR2(RRRRD((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ= scCs>t|_|jj|_|jdk r:|jjn|S(N(RR)RRRR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRC s  cCst|trc||jkrtt|j||jdk r`|jj|jdq`qn?tt|j||jdk r|jj|jdn|S(Ni(RjR&R.RRRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRJ s cCs6tt|j|jdk r2|jjn|S(N(RRRoRR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRoV scCsV||kr"t||gn||g}|jdk rR|jj|ndS(N(R!RRR(RRR ((s-/usr/lib/python2.7/site-packages/pyparsing.pyR\ s  cCsA||g}|jdk r0|jj|n|jgdS(N(RRRR(RRR ((s-/usr/lib/python2.7/site-packages/pyparsing.pyRc scCskytt|jSWnnX|jdkrd|jdk rdd|jjt|jf|_n|jS(Ns%s:(%s)( RRRR&RRRR|Ro(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi s%( R|R}RRRRRZRRRoRRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR, s      cBs#eZdZdZedZRS(sLookahead matching of the given parse expression. C{FollowedBy} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression matches at the current position. C{FollowedBy} always returns a null token list.cCs#tt|j|t|_dS(N(RR RRR,(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRy scCs|jj|||gfS(N(RRf(RRRRD((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ} s(R|R}RRRRZ(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR t s cBs,eZdZdZedZdZRS(sLookahead to disallow matching with the given parse expression. C{NotAny} does *not* advance the parsing position within the input string, it only verifies that the specified parse expression does *not* match at the current position. Also, C{NotAny} does *not* skip over leading whitespace. C{NotAny} always returns a null token list. May be constructed using the '~' operator.cCsBtt|j|t|_t|_dt|j|_ dS(NsFound unwanted token, ( RRRRR)RR,RoRR2(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s  cCs\y|jj||Wnttfk r0n"X|j}||_||_||gfS(N(RRfRRRRR(RRRRDR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ s   cCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRs~{R(R;RR&RRoR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s (R|R}RRRRZR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s  cBs8eZdZdZedZdZedZRS(s<Optional repetition of zero or more of the given expression.cCs#tt|j|t|_dS(N(RR.RRR,(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR scCsg}y|jj|||dt\}}t|jdk}xa|r`|j||}n|}|jj|||\}}|s|jrE||7}qEqEWnttfk rnX||fS(NREi( RRIRRR.RVRRR(RRRRDRbthasIgnoreExprsR`t tmptokens((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ s$cCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRRs]...(R;RR&RRoR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cCs(tt|j||}t|_|S(N(RR.RARR((RRR?R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRA s ( R|R}RRRRZRRRA(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR. s    cBs/eZdZedZdZedZRS(s2Repetition of one or more of the given expression.cCs|jj|||dt\}}y}t|jdk}xa|rZ|j||}n|}|jj|||\}}|s|jr?||7}q?q?Wnttfk rnX||fS(NREi( RRIRRR.RVRRR(RRRRDRbR,R`R-((s-/usr/lib/python2.7/site-packages/pyparsing.pyRZ s$cCsIt|dr|jS|jdkrBdt|jd|_n|jS(NRRs}...(R;RR&RRoR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cCs(tt|j||}t|_|S(N(RRRARR((RRR?R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRA s (R|R}RRRZRRRA(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s  t _NullTokencBs eZdZeZdZRS(cCstS(N(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR scCsdS(NR((R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s(R|R}RR R(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR. s cBs/eZdZedZedZdZRS(sOptional matching of the given expression. A default return string can also be specified, if the optional expression is not found. cCs2tt|j|dt||_t|_dS(NR8(RRRRRRR,(RRtdefault((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cCsy(|jj|||dt\}}Wnottfk r|jtk r|jjrt|jg}|j||jj|SdS(N(RRRR R(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s  N( R|R}RRRR:RRoRRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR Z s       R<cBseZdZRS(cCsdS(Ns...((R((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s(R|R}R(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR< scBseZdZedZRS(sGAbstract subclass of C{ParseExpression}, for converting parsed results.cCs#tt|j|t|_dS(N(RR(RRR((RRR8((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s(R|R}RRR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR( scBs eZdZdZdZRS(s,Converter to upper case all matching tokens.cGs0tt|j|tjdtdddS(NsAUpcase class is deprecated, use upcaseTokens parse action insteadRi(RR)RRRtDeprecationWarning(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cCstttj|S(N(RRLtstringR(RRRR[((s-/usr/lib/python2.7/site-packages/pyparsing.pyR\ s(R|R}RRR\(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR) s cBs/eZdZdedZdZdZRS(sConverter to concatenate all matching tokens to a single string. By default, the matching patterns must also be contiguous in the input string; this can be disabled by specifying C{'adjacent=False'} in the constructor. RcCsQtt|j||r)|jn||_t|_||_t|_dS(N( RRRRtadjacentRR)t joinStringR6(RRRAR@((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s    cCs6|jrtj||ntt|j||S(N(R@RRRR(RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cCsq|j}|2|tdj|j|jgd|j7}|jrit|jdkri|gS|SdS(NRRi( RRRRRAR3R'RR(RRRR[tretToks((s-/usr/lib/python2.7/site-packages/pyparsing.pyR\ s  1!(R|R}RRRRR\(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cBs eZdZdZdZRS(s}Converter to return the matched tokens as a list - useful for returning tokens of C{ZeroOrMore} and C{OneOrMore} expressions.cCs#tt|j|t|_dS(N(RR RRR((RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR scCs|gS(N((RRRR[((s-/usr/lib/python2.7/site-packages/pyparsing.pyR\ s(R|R}RRR\(((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s cBs eZdZdZdZRS(sConverter to return a repetitive expression as a list, but also as a dictionary. Each element can also be referenced using the first token in the expression as its key. Useful for tabular report scraping when the first column can be used as a item key. cCs#tt|j|t|_dS(N(RRRRR((RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR scCsTx9t|D]+\}}t|dkr1q n|d}t|trct|dj}nt|dkrtd|||nX|S(s&Decorator for debugging parse actions.csj}|d\}}}t|dkrI|djjd|}ntjjd|t||||fy|}Wn>tk rtj d}tjjd||fnXtjjd||f|S( Niiit.s">>entering %s(line: '%s', %d, %s) is<gS(Ni(R RR?(RgRIRR(t arrayExprR(s-/usr/lib/python2.7/site-packages/pyparsing.pytcountFieldParseActionI s -cSst|dS(Ni(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRiN starrayLenR7N( R RR+RPRORR<RPR(RtintExprRW((RVRs-/usr/lib/python2.7/site-packages/pyparsing.pyR8A s    cCsMg}x@|D]8}t|tr8|jt|q |j|q W|S(N(RjRR+R}R(tLRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR}U s  cs/tfd}|j|dtS(s?Helper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousLiteral(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches a previous literal, will also match the leading C{"1:1"} in C{"1:10"}. If this is not desired, use C{matchPreviousExpr}. Do *not* use with packrat parsing enabled. csr|rct|dkr'|d>qnt|j}tg|D]}t|^qF>n t>dS(Nii(RR}RRRR(RgRIRttflatttt(trep(s-/usr/lib/python2.7/site-packages/pyparsing.pytcopyTokenToRepeaterk s *R7(R RPR(RR^((R]s-/usr/lib/python2.7/site-packages/pyparsing.pyRM^ s  csCt|j}|>fd}|j|dtS(sjHelper to define an expression that is indirectly defined from the tokens matched in a previous expression, that is, it looks for a 'repeat' of a previous expression. For example:: first = Word(nums) second = matchPreviousExpr(first) matchExpr = first + ":" + second will match C{"1:1"}, but not C{"1:2"}. Because this matches by expressions, will *not* match the leading C{"1:1"} in C{"1:10"}; the expressions are evaluated first, and then compared, so C{"1"} is compared with C{"10"}. Do *not* use with packrat parsing enabled. cs8t|jfd}j|dtdS(Ncs7t|j}|kr3tdddndS(NRi(R}RR(RgRIRt theseTokens(t matchTokens(s-/usr/lib/python2.7/site-packages/pyparsing.pytmustMatchTheseTokens s R7(R}RROR(RgRIRRa(R](R`s-/usr/lib/python2.7/site-packages/pyparsing.pyR^ sR7(R RRPR(Rte2R^((R]s-/usr/lib/python2.7/site-packages/pyparsing.pyRLx s  cCsUx$dD]}|j|t|}qW|jdd}|jdd}t|S(Ns\^-]s s\ns s\t(Rtt_bslashRo(RgRh((s-/usr/lib/python2.7/site-packages/pyparsing.pyR s  c Cs|r!d}d}t}nd}d}t}t|ttfr^t|}n4t|tr||j}ntjdt ddd}x|t |d krG||}xt ||d D]f\} } || |r||| d =Pq||| r||| d =|j || | }PqqW|d 7}qW| r|ryt |t d j |krtd d j g|D]} t| ^qStd j g|D]} tj| ^qSWqtjd t ddqXntg|D]} || ^qS(soHelper to quickly define a set of alternative Literals, and makes sure to do longest-first testing when there is a conflict, regardless of the input order, but returns a C{MatchFirst} for best performance. Parameters: - strs - a string of space-delimited literals, or a list of string literals - caseless - (default=False) - treat all literals as caseless - useRegex - (default=True) - as an optimization, will generate a Regex object; otherwise, will generate a C{MatchFirst} object (if C{caseless=True}, or if creating a C{Regex} raises an exception) cSs|j|jkS(N(R(Rtb((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi scSs|jj|jS(N(RR(RRd((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi scSs ||kS(N((RRd((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi scSs |j|S(N(R(RRd((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi ss2Invalid argument to oneOf, expected string or listRiiiRs[%s]t|s7Exception creating Regex for oneOf, building MatchFirst(RRRjRRRRrRRRRRRRR"RR5RR( tstrsRtuseRegextisequaltmaskstparseElementClasstsymbolsRtcurRRtsym((s-/usr/lib/python2.7/site-packages/pyparsing.pyRQ sF         ! !03 cCsttt||S(sHelper to easily and clearly define a dictionary by specifying the respective patterns for the key and value. Takes care of defining the C{Dict}, C{ZeroOrMore}, and C{Group} tokens in the proper order. The key pattern can include delimiting markers or punctuation, as long as they are suppressed, thereby leaving the significant key text. The value pattern can include named results, so that the C{Dict} results can include named token fields. (RR.R (RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR= scCsptjd}|j}t|_|d||d}|rVd}n d}|j||S(sHelper to return the original, untokenized text for a given expression. Useful to restore the parsed fields of an HTML start tag into the raw tag text itself, or to revert separate tokens with intervening whitespace back to the original matching input text. Simpler to use than the parse action C{L{keepOriginalText}}, and does not require the inspect module to chase up the call stack. By default, returns a string containing the original parsed text. If the optional C{asString} argument is passed as C{False}, then the return value is a C{ParseResults} containing any results names that were originally matched, and a single token containing the original matched text from the input string. So if the expression passed to C{L{originalTextFor}} contains expressions with defined results names, you must set C{asString} to C{False} if you want to preserve those results name values.cSs|S(N((RgRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi st_original_startt _original_endcSs||j|j!S(N(RnRo(RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi scSs3|2|jd||j|j!|d=|d=dS(NiRnRo(RRnRo(RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyt extractText s(RRORRR6(RtasStringt locMarkert endlocMarkert matchExprRp((s-/usr/lib/python2.7/site-packages/pyparsing.pyRe s     cCst|jdS(siHelper to undo pyparsing's default grouping of And expressions, even if all but one are non-empty.cSs|dS(Ni((R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi s(R(RO(R((s-/usr/lib/python2.7/site-packages/pyparsing.pytungroup ss\[]-*.$+^?()~ RcCs |ddS(Nii((RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi ss\]s\\0?[xX][0-9a-fA-F]+cCstt|dddS(Niii(tunichrR(RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi ss \\0[0-7]+cCstt|dddS(Niii(RvR(RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi siRRRtnegatetbodyRcCs\t|trXdjgtt|dt|ddD]}t|^q=p[|S(NRii(RjRRRtordRv(tpRh((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi scCsEy6djgtj|jD]}t|^qSWndSXdS(sHelper to easily define string ranges for use in Word construction. Borrows syntax from regexp '[]' string range definitions:: srange("[0-9]") -> "0123456789" srange("[a-z]") -> "abcdefghijklmnopqrstuvwxyz" srange("[a-z$_]") -> "abcdefghijklmnopqrstuvwxyz$_" The input string must be enclosed in []'s, and the returned string is the expanded character set joined into a single string. The values enclosed in the []'s may be:: a single character an escaped character with a leading backslash (such as \- or \]) an escaped hex character with a leading '\x' (\x21, which is a '!' character) (\0x## is also supported for backwards compatibility) an escaped octal character with a leading '\0' (\041, which is a '!' character) a range of any of the above, separated by a dash ('a-z', etc.) any combination of the above ('aeiouy', 'a-zA-Z0-9_$', etc.) RN(Rt_reBracketExprRtRxt _expanded(Rgtpart((s-/usr/lib/python2.7/site-packages/pyparsing.pyR] s6csfd}|S(srHelper method for defining parse actions that require matching at a specific column in the input text. cs2t||kr.t||dndS(Nsmatched token not at column %d(R5R(R tlocnR(R(s-/usr/lib/python2.7/site-packages/pyparsing.pyt verifyCol, s((RR((Rs-/usr/lib/python2.7/site-packages/pyparsing.pyRK( scsfd}|S(sHelper method for common parse actions that simply return a literal value. Especially useful when used with C{transformString()}. csgS(N((R(treplStr(s-/usr/lib/python2.7/site-packages/pyparsing.pyt _replFunc5 s((RR((Rs-/usr/lib/python2.7/site-packages/pyparsing.pyRZ1 scCs|ddd!S(sHelper parse action for removing quotation marks from parsed quoted strings. To use, add this parse action to quoted string using:: quotedString.setParseAction( removeQuotes ) iii((RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRX9 scCs&gtt|D]}|j^qS(s4Helper parse action to convert tokens to upper case.(RLRoR(RgRIRR\((s-/usr/lib/python2.7/site-packages/pyparsing.pyRb@ scCs&gtt|D]}|j^qS(s4Helper parse action to convert tokens to lower case.(RLRotlower(RgRIRR\((s-/usr/lib/python2.7/site-packages/pyparsing.pyR>D scCsLy t}Wntk r,tdnX|2|t|||!7}|S(sDEPRECATED - use new helper method C{originalTextFor}. Helper parse action to preserve original parsed text, overriding any nested parse actions.sJincorrect usage of keepOriginalText - may only be called as a parse action(R@RRR(RgR5RR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRDH s  cCsmddl}|j}zJxC|dD]+}|ddkr&|djd}|Sq&WtdWd~XdS( siMethod to be called from within a parse action to determine the end location of the parsed tokens.iNiiReiRsRincorrect usage of getTokensEndLoc - may only be called from within a parse action(tinspecttstacktf_localsR(RtfstackRR((s-/usr/lib/python2.7/site-packages/pyparsing.pyR@T s  c CsQt|tr+|}t|d| }n |j}tttd}|rtjj t }t d|dt t t|t d|tddtgjdj d t d }nd jgtD]}|d kr|^q}tjj t t|B}t d|dt t t|j ttt d|tddtgjdj d t d }ttd |d }|jdd j|jddjjjd|}|jdd j|jddjjjd|}||_||_||fS(sRInternal helper to construct opening and closing tag expressions, given a tag nameRs_-:Rttagt=t/R/R?cSs|ddkS(NiR((RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRiq sRRcSs|ddkS(NiR((RgRIR((s-/usr/lib/python2.7/site-packages/pyparsing.pyRix ssRs(RjRR RR+R0R/R:RRORXR&RR.R RRRARRTRWR>Rt_LRtttitleRrR<R( ttagStrtxmltresnamet tagAttrNamet tagAttrValuetopenTagRhtprintablesLessRAbracktcloseTag((s-/usr/lib/python2.7/site-packages/pyparsing.pyt _makeTagsd s" o.{AA  cCs t|tS(sRHelper to construct opening and closing tag expressions for HTML, given a tag name(RR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRI scCs t|tS(sQHelper to construct opening and closing tag expressions for XML, given a tag name(RR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRJ scsT|r|n |jgD]\}}||f^q#fd}|S(s Helper to create a validating parse action to be used with start tags created with C{makeXMLTags} or C{makeHTMLTags}. Use C{withAttribute} to qualify a starting tag with a required attribute value, to avoid false matches on common tags such as C{
} or C{
}. Call C{withAttribute} with a series of attribute names and values. Specify the list of filter attributes names and values as: - keyword arguments, as in C{(align="right")}, or - as an explicit dict with C{**} operator, when an attribute name is also a Python reserved word, as in C{**{"class":"Customer", "align":"right"}} - a list of name-value tuples, as in ( ("ns1:class", "Customer"), ("ns2:align","right") ) For attribute names with a namespace prefix, you must use the second form. Attribute names are matched insensitive to upper/lower case. To verify that the attribute exists, but without specifying a value, pass C{withAttribute.ANY_VALUE} as the value. c sx~D]v\}}||kr8t||d|n|tjkr|||krt||d||||fqqWdS(Nsno matching attribute s+attribute '%s' has value '%s', must be '%s'(RRct ANY_VALUE(RgRIRbtattrNamet attrValue(tattrs(s-/usr/lib/python2.7/site-packages/pyparsing.pytpa s   (R(RtattrDictRRR((Rs-/usr/lib/python2.7/site-packages/pyparsing.pyRc s   %cCst}|td|tdB}xt|D]\}}|d d \}}}} |dkr|d kst|dkrtdn|\} } nt} |tjkr|dkrt||t |t |} q|dkr[|d k r4t|||t |t ||} qt||t |t |} q|dkrt|| || |t || || |} qtdn+|tj kr|dkr t |t st |}nt|j| t || } q|dkrz|d k rSt||| t |t || } qt|| t |t | } q|dkrt|| | | | t || | | | } qtdn td | r| j| n| | |B>| }q4W||>|S( s#Helper method for constructing grammars of expressions made up of operators working in a precedence hierarchy. Operators may be unary or binary, left- or right-associative. Parse actions can also be attached to operator expressions. Parameters: - baseExpr - expression representing the most basic element for the nested - opList - list of tuples, one for each operator precedence level in the expression grammar; each tuple is of the form (opExpr, numTerms, rightLeftAssoc, parseAction), where: - opExpr is the pyparsing expression for the operator; may also be a string, which will be converted to a Literal; if numTerms is 3, opExpr is a tuple of two expressions, for the two operators separating the 3 terms - numTerms is the number of terms for this operator (must be 1, 2, or 3) - rightLeftAssoc is the indicator whether the operator is right or left associative, using the pyparsing-defined constants opAssoc.RIGHT and opAssoc.LEFT. - parseAction is the parse action to be associated with expressions matching this operator expression (the parse action tuple member may be omitted) t(Riiis@if numterms=3, opExpr must be a tuple or list of two expressionsis6operator must be unary (1), binary (2), or ternary (3)s2operator must indicate right or left associativityN(N(R R&RRRRRRtLEFTR R RtRIGHTRjRRRO(tbaseExprtopListRtlastExprRtoperDeftopExprtaritytrightLeftAssocRtopExpr1topExpr2tthisExprRt((s-/usr/lib/python2.7/site-packages/pyparsing.pyRS sP    '  /'   $  /'     s4"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*"s string enclosed in double quotess4'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*'s string enclosed in single quotessq(?:"(?:[^"\n\r\\]|(?:"")|(?:\\x[0-9a-fA-F]+)|(?:\\.))*")|(?:'(?:[^'\n\r\\]|(?:'')|(?:\\x[0-9a-fA-F]+)|(?:\\.))*')s*quotedString using single or double quotestuRRc Cs||krtdn|d krt|trt|trt|dkrt|dkr|d k rtt|t||tj ddj d}q|t j t||tj j d}q|d k r9tt|t |t |ttj ddj d}qttt |t |ttj ddj d}qtdnt}|d k r|tt|t||B|Bt|>n,|tt|t||Bt|>|S( sHelper method for defining nested lists enclosed in opening and closing delimiters ("(" and ")" are the default). Parameters: - opener - opening character for a nested list (default="("); can also be a pyparsing expression - closer - closing character for a nested list (default=")"); can also be a pyparsing expression - content - expression for items within the nested lists (default=None) - ignoreExpr - expression for ignoring opening and closing delimiters (default=quotedString) If an expression is not provided for the content argument, the nested expression will capture all whitespace-delimited content between delimiters as a list of separate values. Use the C{ignoreExpr} argument to define expressions that may contain opening or closing characters that should not be treated as opening or closing characters for nesting, such as quotedString or a comment expression. Specify multiple expressions using an C{L{Or}} or C{L{MatchFirst}}. The default is L{quotedString}, but if no expressions are to be ignored, then pass C{None} for this argument. s.opening and closing strings cannot be the sameiRcSs|djS(Ni(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRiscSs|djS(Ni(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRiscSs|djS(Ni(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi scSs|djS(Ni(R(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRi$ssOopening and closing arguments must be strings if no content expression is givenN(RRRjRRRRRRR!ROR?RRR R R&R.(topenertclosertcontentR1R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRN s2  $  $    3,c sfd}fd}fd}ttjdj}ttj|}tj|}tj|} |rtt||t|t|t|| } n0tt|t|t|t|} |jt t| S(sHelper method for defining space-delimited indentation blocks, such as those used to define block statements in Python source code. Parameters: - blockStatementExpr - expression defining syntax of statement that is repeated within the indented block - indentStack - list created by caller to manage indentation stack (multiple statementWithIndentedBlock expressions within a single grammar should share a common indentStack) - indent - boolean indicating whether block must be indented beyond the the current level; set to False for block of left-most statements (default=True) A valid block must contain at least one C{blockStatement}. css|t|krdSt||}|dkro|dkrZt||dnt||dndS(Nisillegal nestingsnot a peer entry(RR5RR(RgRIRtcurCol(t indentStack(s-/usr/lib/python2.7/site-packages/pyparsing.pytcheckPeerIndent>scsEt||}|dkr/j|nt||ddS(Nisnot a subentry(R5RR(RgRIRR(R(s-/usr/lib/python2.7/site-packages/pyparsing.pytcheckSubIndentFscsn|t|krdSt||}oH|dkoH|dks`t||dnjdS(Niisnot an unindent(RR5RR(RgRIRR(R(s-/usr/lib/python2.7/site-packages/pyparsing.pyt checkUnindentMs &s ( RRRRRROR RRRc( tblockStatementExprRRRRRtNLtINDENTtPEERtUNDENTtsmExpr((Rs-/usr/lib/python2.7/site-packages/pyparsing.pyRd.s8 $s#[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]s[\0xa1-\0xbf\0xd7\0xf7]s_:Rpsgt lt amp nbsp quottentityRqs><& "cCs |jtkrt|jpdS(N(Rt_htmlEntityMapR(R((s-/usr/lib/python2.7/site-packages/pyparsing.pyRihss/\*(?:[^*]*\*+)+?/sC style commentss.*s \/\/(\\\n|.)*s // comments:/(?:\*(?:[^*]*\*+)+?/|/[^\n]*(?:\n[^\n]*)*?(?:(?s tokens = stokens.columns = stokens.tables = tSQLiRR(( t simpleSQLRtRRltcolumnsttablesRRRR]R^RER(t teststringRbR[Rc((s-/usr/lib/python2.7/site-packages/pyparsing.pyttest}s    tselecttfroms_$RKRTR=RRsSELECT * from XYZZY, ABCsselect * from SYS.XYZZYsSelect A from Sys.dualsSelect AA,BB,CC from Sys.dualsSelect A, B, C from Sys.dualsXelect A, B, C from Sys.dualsSelect A, B, C frox Sys.dualtSelectsSelect ^^^ frox Sys.duals'Select A, B, C from Sys.dual, Table2 (Rt __version__t__versionTime__t __author__R?tweakrefRRRR]RR5Rt__all__t version_infot_PY3KtmaxsizeRRlRtchrRvRotascii_lowercasetascii_uppercaseR0tmaxinttxrangeRRt lowercaset uppercasetsingleArgBuiltinst __builtin__RrtfnameRtgetattrRRzRR{tdigitsRPRAR/RcRt printableRht whitespaceRTRhRRRRR!RRR5RHRERRRROR RR'RRRRR RRR+R"R RR*RR RRR%R$R-R,RRRRRRR RR.RR.R0RR#R R<R(R)RR RR&RR`RR<RR8R}RMRLRRRQR=ReRuR<R?RGRFR_R^ROt _escapedPunct_printables_less_backslasht_escapedHexChart_escapedOctChart _singleChart _charRangeRAR{R|R]RKRZRXRbR>RDR@RRIRJRcRRRRRRSR:R\RWRaRNRdR1RUR3R2RoR7RfRsRRYR4RBRR[R;R9RCRVt _noncommat _commasepitemR6R|Rt selectTokent fromTokentidentt columnNametcolumnNameListt tableNamet tableNameListR(((s-/usr/lib/python2.7/site-packages/pyparsing.pyt;s                   40  a       <CtF9eE>;XH$'" "AH   "      ;  !.@                G4 4  /  .8+              PK[HCCsite-packages/jsonpatch.pycnu[ URc@sddlmZdZdZdZdZddlZddlZddlZddl Z ddl Z ddl Z ej d#kre efZne jZd efd YZd efd YZd eefdYZdZdZee _edZdZdefdYZdefdYZdefdYZdefdYZ defdYZ!defdYZ"defd YZ#d!efd"YZ$dS($i(tunicode_literalsu Stefan Kögl u1.2u0https://github.com/stefankoegl/python-json-patchuModified BSD LicenseNiitJsonPatchExceptioncBseZdZRS(uBase Json Patch exception(t__name__t __module__t__doc__(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR:stJsonPatchConflictcBseZdZRS(u Raised if patch could not be applied due to conflict situation such as: - attempt to add object key then it already exists; - attempt to operate with nonexistence object key; - attempt to insert value to array at position beyond of it size; - etc. (RRR(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR>stJsonPatchTestFailedcBseZdZRS(u A Test operation failed (RRR(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyRFscCstjt}x%|D]\}}||j|qWx=|jD]/\}}t|dkrD|d||>> doc = {'foo': 'bar'} >>> other = apply_patch(doc, [{'op': 'add', 'path': '/baz', 'value': 'qux'}]) >>> doc is not other True >>> other == {'foo': 'bar', 'baz': 'qux'} True >>> apply_patch(doc, [{'op': 'add', 'path': '/baz', 'value': 'qux'}], in_place=True) == {'foo': 'bar', 'baz': 'qux'} True >>> doc == other True (t isinstancet basestringt JsonPatcht from_stringtapply(tdoctpatchtin_place((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt apply_patchms cCstj||S(uGenerates patch by comparing of two document objects. Actually is a proxy to :meth:`JsonPatch.from_diff` method. :param src: Data source document object. :type src: dict :param dst: Data source document object. :type dst: dict >>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]} >>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]} >>> patch = make_patch(src, dst) >>> new = patch.apply(src) >>> new == dst True (Rt from_diff(tsrctdst((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt make_patchsRcBseZdZdZdZdZeZdZdZdZ e dZ e dZ d Z ed Zed Zd ZRS( ugA JSON Patch is a list of Patch Operations. >>> patch = JsonPatch([ ... {'op': 'add', 'path': '/foo', 'value': 'bar'}, ... {'op': 'add', 'path': '/baz', 'value': [1, 2, 3]}, ... {'op': 'remove', 'path': '/baz/1'}, ... {'op': 'test', 'path': '/baz', 'value': [1, 3]}, ... {'op': 'replace', 'path': '/baz/0', 'value': 42}, ... {'op': 'remove', 'path': '/baz/1'}, ... ]) >>> doc = {} >>> result = patch.apply(doc) >>> expected = {'foo': 'bar', 'baz': [42]} >>> result == expected True JsonPatch object is iterable, so you could easily access to each patch statement in loop: >>> lpatch = list(patch) >>> expected = {'op': 'add', 'path': '/foo', 'value': 'bar'} >>> lpatch[0] == expected True >>> lpatch == patch.patch True Also JsonPatch could be converted directly to :class:`bool` if it contains any operation statements: >>> bool(patch) True >>> bool(JsonPatch([])) False This behavior is very handy with :func:`make_patch` to write more readable code: >>> old = {'foo': 'bar', 'numbers': [1, 3, 4, 8]} >>> new = {'baz': 'qux', 'numbers': [1, 4, 7]} >>> patch = make_patch(old, new) >>> if patch: ... # document have changed, do something useful ... patch.apply(old) #doctest: +ELLIPSIS {...} cCs@||_itd6td6td6td6td6td6|_dS(Nuremoveuaddureplaceumoveutestucopy(R#tRemoveOperationt AddOperationtReplaceOperationt MoveOperationt TestOperationt CopyOperationt operations(tselfR#((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__init__s cCs |jS(ustr(self) -> self.to_string()(t to_string(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__str__scCs t|jS(N(tboolR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__bool__scCs t|jS(N(titerR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__iter__scCstt|jS(N(thashttuplet_ops(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__hash__scCs\t|tstStt|jtt|jko[tttj |j|jS(N( RRtFalseR R R;talltmaptoperatorteq(R1tother((s-/usr/lib/python2.7/site-packages/jsonpatch.pyt__eq__s*cCstj|}||S(uCreates JsonPatch instance from string source. :param patch_str: JSON patch as raw string. :type patch_str: str :return: :class:`JsonPatch` instance. (Rtloads(tclst patch_strR#((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR s csOfdfdfd|tdg||S(uOCreates JsonPatch instance based on comparing of two document objects. Json patch would be created for `src` argument against `dst` one. :param src: Data source document object. :type src: dict :param dst: Data source document object. :type dst: dict :return: :class:`JsonPatch` instance. >>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]} >>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]} >>> patch = JsonPatch.from_diff(src, dst) >>> new = patch.apply(src) >>> new == dst True c3s||krdSt|trSt|trSx|||D] }|VqAWnft|trt|trxE|||D] }|VqWn#idd6dj|d6|d6VdS(Nureplaceuopu/upathuvalue(RR R tjoin(tpathtvalueRBt operation(t compare_dictt compare_list(s-/usr/lib/python2.7/site-packages/jsonpatch.pytcompare_valuess   c3sxz|D]r}||krBidd6dj||gd6Vqn||g}x'|||||D] }|VqjWqWxK|D]C}||kridd6dj||gd6||d6VqqWdS(Nuremoveuopu/upathuadduvalue(RG(RHR'R(tkeytcurrentRJ(RM(s-/usr/lib/python2.7/site-packages/jsonpatch.pyRK#s  # !   c3s5t|t|}}xZtt||D]C}|t|g}x'|||||D] }|VqcWq/W||krxt||D]@}|t|g}idd6dj|d6||d6VqWnX||kr1xItt||D]/}idd6dj|t|gd6VqWndS(Nuadduopu/upathuvalueuremove(R trangetmintstrRGtreversed(RHR'R(tlsrctldsttidxRORJ(RM(s-/usr/lib/python2.7/site-packages/jsonpatch.pyRL/s!  . u(R (RER'R(((RKRLRMs-/usr/lib/python2.7/site-packages/jsonpatch.pyR&s  cCstj|jS(u!Returns patch set as JSON string.(RtdumpsR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR3?scCst|j|jS(N(R?t_get_operationR#(R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR;CscCs?|stj|}nx |jD]}|j|}q"W|S(u/Applies the patch to given object. :param obj: Document object. :type obj: dict :param in_place: Tweaks way how patch would be applied - directly to specified `obj` or to his copy. :type in_place: bool :return: Modified `obj`. (tcopytdeepcopyR;R!(R1tobjR$RJ((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!Gs cCs|d|krtdn|d}t|tsCtdn||jkretd|n|j|}||S(Nuopu&Operation does not contain 'op' memberuOperation must be a stringuUnknown operation '%s'(RRRR0(R1RJtopRE((s-/usr/lib/python2.7/site-packages/jsonpatch.pyRX\s   (RRRR2R4R6t __nonzero__R8R<RCt classmethodR R&R3tpropertyR;R=R!RX(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyRs-      =  tPatchOperationcBs2eZdZdZdZdZdZRS(u'A single operation inside a JSON Patch.cCs/|d|_tj|j|_||_dS(Nupath(tlocationt jsonpointert JsonPointertpointerRJ(R1RJ((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR2ps cCstddS(uAAbstract method that applies patch operation to specified object.u!should implement patch operation.N(tNotImplementedError(R1R[((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!uscCstt|jjS(N(R9t frozensetRJR (R1((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR<zscCs#t|tstS|j|jkS(N(RR`R=RJ(R1RB((s-/usr/lib/python2.7/site-packages/jsonpatch.pyRC~s(RRRR2R!R<RC(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR`ms    R*cBseZdZdZRS(u/Removes an object property or an array element.cCsO|jj|\}}y ||=Wn%tk rJ}tt|nX|S(N(Rdtto_lastt IndexErrorRRR(R1R[tsubobjtparttex((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR!s  (RRRR!(((s-/usr/lib/python2.7/site-packages/jsonpatch.pyR*sR+cBseZdZdZRS(u,Adds an object property or an array element.cCs|jd}|jj|\}}t|ts[t|ts[tdttt|tr|dkr|j |q|t |ks|dkrt dq|j ||n1t|tr|dkr|}q|||!s:           "  "PK[6site-packages/setuptools-0.9.8-py2.7.egg-info/zip-safenu[ PK['Q Csite-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txt.orignu[[distutils.setup_keywords] use_2to3 = setuptools.dist:assert_bool test_loader = setuptools.dist:check_importable namespace_packages = setuptools.dist:check_nsp use_2to3_exclude_fixers = setuptools.dist:assert_string_list package_data = setuptools.dist:check_package_data packages = setuptools.dist:check_packages use_2to3_fixers = setuptools.dist:assert_string_list dependency_links = setuptools.dist:assert_string_list entry_points = setuptools.dist:check_entry_points install_requires = setuptools.dist:check_requirements tests_require = setuptools.dist:check_requirements convert_2to3_doctests = setuptools.dist:assert_string_list test_suite = setuptools.dist:check_test_suite include_package_data = setuptools.dist:assert_bool eager_resources = setuptools.dist:assert_string_list exclude_package_data = setuptools.dist:check_package_data zip_safe = setuptools.dist:assert_bool extras_require = setuptools.dist:check_extras [distutils.commands] upload_docs = setuptools.command.upload_docs:upload_docs setopt = setuptools.command.setopt:setopt install = setuptools.command.install:install bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst install_egg_info = setuptools.command.install_egg_info:install_egg_info easy_install = setuptools.command.easy_install:easy_install test = setuptools.command.test:test saveopts = setuptools.command.saveopts:saveopts sdist = setuptools.command.sdist:sdist rotate = setuptools.command.rotate:rotate bdist_egg = setuptools.command.bdist_egg:bdist_egg build_py = setuptools.command.build_py:build_py install_scripts = setuptools.command.install_scripts:install_scripts develop = setuptools.command.develop:develop install_lib = setuptools.command.install_lib:install_lib alias = setuptools.command.alias:alias build_ext = setuptools.command.build_ext:build_ext register = setuptools.command.register:register bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm egg_info = setuptools.command.egg_info:egg_info [console_scripts] easy_install = setuptools.command.easy_install:main easy_install-3.3 = setuptools.command.easy_install:main [egg_info.writers] entry_points.txt = setuptools.command.egg_info:write_entries requires.txt = setuptools.command.egg_info:write_requirements namespace_packages.txt = setuptools.command.egg_info:overwrite_arg dependency_links.txt = setuptools.command.egg_info:overwrite_arg PKG-INFO = setuptools.command.egg_info:write_pkg_info depends.txt = setuptools.command.egg_info:warn_depends_obsolete top_level.txt = setuptools.command.egg_info:write_toplevel_names eager_resources.txt = setuptools.command.egg_info:overwrite_arg [setuptools.installation] eggsecutable = setuptools.command.easy_install:bootstrap [setuptools.file_finders] svn_cvs = setuptools.command.sdist:_default_revctrl PK[9(::site-packages/setuptools-0.9.8-py2.7.egg-info/requires.txtnu[ [ssl:sys_platform=='win32'] wincertstore==0.1 [ssl:sys_platform=='win32' and python_version=='2.4'] ctypes==1.0.2 [certs] certifi==0.0.8 [ssl:python_version in '2.4, 2.5'] ssl==1.16PK[c11;site-packages/setuptools-0.9.8-py2.7.egg-info/top_level.txtnu[_markerlib easy_install pkg_resources setuptools PK[IS >site-packages/setuptools-0.9.8-py2.7.egg-info/entry_points.txtnu[[distutils.commands] bdist_rpm = setuptools.command.bdist_rpm:bdist_rpm rotate = setuptools.command.rotate:rotate develop = setuptools.command.develop:develop setopt = setuptools.command.setopt:setopt build_py = setuptools.command.build_py:build_py saveopts = setuptools.command.saveopts:saveopts egg_info = setuptools.command.egg_info:egg_info register = setuptools.command.register:register upload_docs = setuptools.command.upload_docs:upload_docs install_egg_info = setuptools.command.install_egg_info:install_egg_info alias = setuptools.command.alias:alias easy_install = setuptools.command.easy_install:easy_install install_scripts = setuptools.command.install_scripts:install_scripts bdist_wininst = setuptools.command.bdist_wininst:bdist_wininst bdist_egg = setuptools.command.bdist_egg:bdist_egg install = setuptools.command.install:install test = setuptools.command.test:test install_lib = setuptools.command.install_lib:install_lib build_ext = setuptools.command.build_ext:build_ext sdist = setuptools.command.sdist:sdist [egg_info.writers] dependency_links.txt = setuptools.command.egg_info:overwrite_arg requires.txt = setuptools.command.egg_info:write_requirements PKG-INFO = setuptools.command.egg_info:write_pkg_info eager_resources.txt = setuptools.command.egg_info:overwrite_arg top_level.txt = setuptools.command.egg_info:write_toplevel_names namespace_packages.txt = setuptools.command.egg_info:overwrite_arg entry_points.txt = setuptools.command.egg_info:write_entries depends.txt = setuptools.command.egg_info:warn_depends_obsolete [console_scripts] easy_install = setuptools.command.easy_install:main easy_install-2.7 = setuptools.command.easy_install:main [setuptools.file_finders] svn_cvs = setuptools.command.sdist:_default_revctrl [distutils.setup_keywords] dependency_links = setuptools.dist:assert_string_list entry_points = setuptools.dist:check_entry_points extras_require = setuptools.dist:check_extras use_2to3_exclude_fixers = setuptools.dist:assert_string_list package_data = setuptools.dist:check_package_data install_requires = setuptools.dist:check_requirements use_2to3 = setuptools.dist:assert_bool use_2to3_fixers = setuptools.dist:assert_string_list include_package_data = setuptools.dist:assert_bool exclude_package_data = setuptools.dist:check_package_data namespace_packages = setuptools.dist:check_nsp test_suite = setuptools.dist:check_test_suite eager_resources = setuptools.dist:assert_string_list zip_safe = setuptools.dist:assert_bool test_loader = setuptools.dist:check_importable packages = setuptools.dist:check_packages convert_2to3_doctests = setuptools.dist:assert_string_list tests_require = setuptools.dist:check_requirements [setuptools.installation] eggsecutable = setuptools.command.easy_install:bootstrap PK[؎Bsite-packages/setuptools-0.9.8-py2.7.egg-info/dependency_links.txtnu[https://pypi.python.org/packages/source/c/certifi/certifi-0.0.8.tar.gz#md5=dc5f5e7f0b5fc08d27654b17daa6ecec https://pypi.python.org/packages/source/s/ssl/ssl-1.16.tar.gz#md5=fb12d335d56f3c8c7c1fefc1c06c4bfb https://pypi.python.org/packages/source/w/wincertstore/wincertstore-0.1.zip#md5=2f9accbebe8f7b4c06ac7aa83879b81c https://bitbucket.org/pypa/setuptools/downloads/ctypes-1.0.2.win32-py2.4.exe#md5=9092a0ad5a3d79fa2d980f1ddc5e9dbc https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.4-win32.egg#md5=3cfa2c526dc66e318e8520b6f1aadce5 https://bitbucket.org/pypa/setuptools/downloads/ssl-1.16-py2.5-win32.egg#md5=85ad1cda806d639743121c0bbcb5f39b PK[b 9site-packages/setuptools-0.9.8-py2.7.egg-info/SOURCES.txtnu[CHANGES (links).txt CHANGES.txt CONTRIBUTORS.txt DEVGUIDE.txt MANIFEST.in README.txt easy_install.py ez_setup.py launcher.c pkg_resources.py release.py setup.cfg setup.py _markerlib/__init__.py _markerlib/markers.py docs/Makefile docs/conf.py docs/easy_install.txt docs/formats.txt docs/index.txt docs/merge-faq.txt docs/merge.txt docs/pkg_resources.txt docs/python3.txt docs/roadmap.txt docs/setuptools.txt docs/using.txt docs/_templates/indexsidebar.html docs/_theme/nature/theme.conf docs/_theme/nature/static/nature.css_t docs/_theme/nature/static/pygments.css docs/build/html/_sources/easy_install.txt docs/build/html/_sources/formats.txt docs/build/html/_sources/index.txt docs/build/html/_sources/merge-faq.txt docs/build/html/_sources/merge.txt docs/build/html/_sources/pkg_resources.txt docs/build/html/_sources/python3.txt docs/build/html/_sources/roadmap.txt docs/build/html/_sources/setuptools.txt docs/build/html/_sources/using.txt docs/build/html/_static/basic.css docs/build/html/_static/nature.css docs/build/html/_static/pygments.css setuptools/__init__.py setuptools/archive_util.py setuptools/cli-32.exe setuptools/cli-64.exe setuptools/cli-arm-32.exe setuptools/cli.exe setuptools/compat.py setuptools/depends.py setuptools/dist.py setuptools/extension.py setuptools/gui-32.exe setuptools/gui-64.exe setuptools/gui-arm-32.exe setuptools/gui.exe setuptools/package_index.py setuptools/py24compat.py setuptools/py27compat.py setuptools/sandbox.py setuptools/script template (dev).py setuptools/script template.py setuptools/site-patch.py setuptools/ssl_support.py setuptools.egg-info/PKG-INFO setuptools.egg-info/SOURCES.txt setuptools.egg-info/dependency_links.txt setuptools.egg-info/entry_points.txt setuptools.egg-info/entry_points.txt.orig setuptools.egg-info/requires.txt setuptools.egg-info/top_level.txt setuptools.egg-info/zip-safe setuptools/_backport/__init__.py setuptools/_backport/hashlib/__init__.py setuptools/_backport/hashlib/_sha.py setuptools/_backport/hashlib/_sha256.py setuptools/_backport/hashlib/_sha512.py setuptools/command/__init__.py setuptools/command/alias.py setuptools/command/bdist_egg.py setuptools/command/bdist_rpm.py setuptools/command/bdist_wininst.py setuptools/command/build_ext.py setuptools/command/build_py.py setuptools/command/develop.py setuptools/command/easy_install.py setuptools/command/egg_info.py setuptools/command/install.py setuptools/command/install_egg_info.py setuptools/command/install_lib.py setuptools/command/install_scripts.py setuptools/command/launcher manifest.xml setuptools/command/register.py setuptools/command/rotate.py setuptools/command/saveopts.py setuptools/command/sdist.py setuptools/command/setopt.py setuptools/command/test.py setuptools/command/upload.py setuptools/command/upload_docs.py setuptools/tests/__init__.py setuptools/tests/doctest.py setuptools/tests/entries-v10 setuptools/tests/py26compat.py setuptools/tests/server.py setuptools/tests/test_bdist_egg.py setuptools/tests/test_build_ext.py setuptools/tests/test_develop.py setuptools/tests/test_dist_info.py setuptools/tests/test_easy_install.py setuptools/tests/test_egg_info.py setuptools/tests/test_markerlib.py setuptools/tests/test_packageindex.py setuptools/tests/test_resources.py setuptools/tests/test_sandbox.py setuptools/tests/test_sdist.py setuptools/tests/test_test.py setuptools/tests/test_upload_docs.py setuptools/tests/win_script_wrapper.txt setuptools/tests/indexes/test_links_priority/external.html setuptools/tests/indexes/test_links_priority/simple/foobar/index.html tests/api_tests.txt tests/manual_test.py tests/test_ez_setup.py tests/test_pkg_resources.py tests/shlib_test/hello.c tests/shlib_test/hello.pyx tests/shlib_test/hellolib.c tests/shlib_test/setup.py tests/shlib_test/test_hello.pyPK[tƺƺ6site-packages/setuptools-0.9.8-py2.7.egg-info/PKG-INFOnu[Metadata-Version: 1.1 Name: setuptools Version: 0.9.8 Summary: Easily download, build, install, upgrade, and uninstall Python packages Home-page: https://pypi.python.org/pypi/setuptools Author: Python Packaging Authority Author-email: distutils-sig@python.org License: PSF or ZPL Description: =============================== Installing and Using Setuptools =============================== .. contents:: **Table of Contents** ------------------------- Installation Instructions ------------------------- Upgrading from Distribute ========================= Currently, Distribute disallows installing Setuptools 0.7+ over Distribute. You must first uninstall any active version of Distribute first (see `Uninstalling`_). Upgrading from Setuptools 0.6 ============================= Upgrading from prior versions of Setuptools is supported. Initial reports good success in this regard. Windows ======= The recommended way to install setuptools on Windows is to download `ez_setup.py`_ and run it. The script will download the appropriate .egg file and install it for you. .. _ez_setup.py: https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py For best results, uninstall previous versions FIRST (see `Uninstalling`_). Once installation is complete, you will find an ``easy_install.exe`` program in your Python ``Scripts`` subdirectory. For simple invocation and best results, add this directory to your ``PATH`` environment variable, if it is not already present. Unix-based Systems including Mac OS X ===================================== Download `ez_setup.py`_ and run it using the target Python version. The script will download the appropriate version and install it for you:: > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | python Note that you will may need to invoke the command with superuser privileges to install to the system Python. Alternatively, on Python 2.6 and later, Setuptools may be installed to a user-local path:: > wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py > python ez_setup.py --user Advanced Installation ===================== For more advanced installation options, such as installing to custom locations or prefixes, download and extract the source tarball from `Setuptools on PyPI `_ and run setup.py with any supported distutils and Setuptools options. For example:: setuptools-x.x$ python setup.py --prefix=/opt/setuptools Use ``--help`` to get a full options list, but we recommend consulting the `EasyInstall manual`_ for detailed instructions, especially `the section on custom installation locations`_. .. _EasyInstall manual: https://pythonhosted.org/setuptools/EasyInstall .. _the section on custom installation locations: https://pythonhosted.org/setuptools/EasyInstall#custom-installation-locations Downloads ========= All setuptools downloads can be found at `the project's home page in the Python Package Index`_. Scroll to the very bottom of the page to find the links. .. _the project's home page in the Python Package Index: https://pypi.python.org/pypi/setuptools In addition to the PyPI downloads, the development version of ``setuptools`` is available from the `Bitbucket repo`_, and in-development versions of the `0.6 branch`_ are available as well. .. _Bitbucket repo: https://bitbucket.org/pypa/setuptools/get/default.tar.gz#egg=setuptools-dev .. _0.6 branch: http://svn.python.org/projects/sandbox/branches/setuptools-0.6/#egg=setuptools-dev06 Uninstalling ============ On Windows, if Setuptools was installed using an ``.exe`` or ``.msi`` installer, simply use the uninstall feature of "Add/Remove Programs" in the Control Panel. Otherwise, to uninstall Setuptools or Distribute, regardless of the Python version, delete all ``setuptools*`` and ``distribute*`` files and directories from your system's ``site-packages`` directory (and any other ``sys.path`` directories) FIRST. If you are upgrading or otherwise plan to re-install Setuptools or Distribute, nothing further needs to be done. If you want to completely remove Setuptools, you may also want to remove the 'easy_install' and 'easy_install-x.x' scripts and associated executables installed to the Python scripts directory. -------------------------------- Using Setuptools and EasyInstall -------------------------------- Here are some of the available manuals, tutorials, and other resources for learning about Setuptools, Python Eggs, and EasyInstall: * `The EasyInstall user's guide and reference manual`_ * `The setuptools Developer's Guide`_ * `The pkg_resources API reference`_ * `Package Compatibility Notes`_ (user-maintained) * `The Internal Structure of Python Eggs`_ Questions, comments, and bug reports should be directed to the `distutils-sig mailing list`_. If you have written (or know of) any tutorials, documentation, plug-ins, or other resources for setuptools users, please let us know about them there, so this reference list can be updated. If you have working, *tested* patches to correct problems or add features, you may submit them to the `setuptools bug tracker`_. .. _setuptools bug tracker: https://bitbucket.org/pypa/setuptools/issues .. _Package Compatibility Notes: https://pythonhosted.org/setuptools/PackageNotes .. _The Internal Structure of Python Eggs: https://pythonhosted.org/setuptools/formats.html .. _The setuptools Developer's Guide: https://pythonhosted.org/setuptools/setuptools.html .. _The pkg_resources API reference: https://pythonhosted.org/setuptools/pkg_resources.html .. _The EasyInstall user's guide and reference manual: https://pythonhosted.org/setuptools/easy_install.html .. _distutils-sig mailing list: http://mail.python.org/pipermail/distutils-sig/ ------- Credits ------- * The original design for the ``.egg`` format and the ``pkg_resources`` API was co-created by Phillip Eby and Bob Ippolito. Bob also implemented the first version of ``pkg_resources``, and supplied the OS X operating system version compatibility algorithm. * Ian Bicking implemented many early "creature comfort" features of easy_install, including support for downloading via Sourceforge and Subversion repositories. Ian's comments on the Web-SIG about WSGI application deployment also inspired the concept of "entry points" in eggs, and he has given talks at PyCon and elsewhere to inform and educate the community about eggs and setuptools. * Jim Fulton contributed time and effort to build automated tests of various aspects of ``easy_install``, and supplied the doctests for the command-line ``.exe`` wrappers on Windows. * Phillip J. Eby is the seminal author of setuptools, and first proposed the idea of an importable binary distribution format for Python application plug-ins. * Significant parts of the implementation of setuptools were funded by the Open Source Applications Foundation, to provide a plug-in infrastructure for the Chandler PIM application. In addition, many OSAF staffers (such as Mike "Code Bear" Taylor) contributed their time and stress as guinea pigs for the use of eggs and setuptools, even before eggs were "cool". (Thanks, guys!) * Since the merge with Distribute, Jason R. Coombs is the maintainer of setuptools. The project is maintained in coordination with the Python Packaging Authority (PyPA) and the larger Python community. .. _files: ======= CHANGES ======= ----- 0.9.8 ----- * `Issue #53 `_: Fix NameErrors in `_vcs_split_rev_from_url`. ----- 0.9.7 ----- * `Issue #49 `_: Correct AttributeError on PyPy where a hashlib.HASH object does not have a `.name` attribute. * `Issue #34 `_: Documentation now refers to bootstrap script in code repository referenced by bookmark. * Add underscore-separated keys to environment markers (markerlib). ----- 0.9.6 ----- * `Issue #44 `_: Test failure on Python 2.4 when MD5 hash doesn't have a `.name` attribute. ----- 0.9.5 ----- * `Python #17980 `_: Fix security vulnerability in SSL certificate validation. ----- 0.9.4 ----- * `Issue #43 `_: Fix issue (introduced in 0.9.1) with version resolution when upgrading over other releases of Setuptools. ----- 0.9.3 ----- * `Issue #42 `_: Fix new ``AttributeError`` introduced in last fix. ----- 0.9.2 ----- * `Issue #42 `_: Fix regression where blank checksums would trigger an ``AttributeError``. ----- 0.9.1 ----- * `Distribute #386 `_: Allow other positional and keyword arguments to os.open. * Corrected dependency on certifi mis-referenced in 0.9. --- 0.9 --- * `package_index` now validates hashes other than MD5 in download links. --- 0.8 --- * Code base now runs on Python 2.4 - Python 3.3 without Python 2to3 conversion. ----- 0.7.8 ----- * `Distribute #375 `_: Yet another fix for yet another regression. ----- 0.7.7 ----- * `Distribute #375 `_: Repair AttributeError created in last release (redo). * `Issue #30 `_: Added test for get_cache_path. ----- 0.7.6 ----- * `Distribute #375 `_: Repair AttributeError created in last release. ----- 0.7.5 ----- * `Issue #21 `_: Restore Python 2.4 compatibility in ``test_easy_install``. * `Distribute #375 `_: Merged additional warning from Distribute 0.6.46. * Now honor the environment variable ``SETUPTOOLS_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT`` in addition to the now deprecated ``DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT``. ----- 0.7.4 ----- * `Issue #20 `_: Fix comparison of parsed SVN version on Python 3. ----- 0.7.3 ----- * `Issue #1 `_: Disable installation of Windows-specific files on non-Windows systems. * Use new sysconfig module with Python 2.7 or >=3.2. ----- 0.7.2 ----- * `Issue #14 `_: Use markerlib when the `parser` module is not available. * `Issue #10 `_: ``ez_setup.py`` now uses HTTPS to download setuptools from PyPI. ----- 0.7.1 ----- * Fix NameError (`Issue #3 `_) again - broken in bad merge. --- 0.7 --- * Merged Setuptools and Distribute. See docs/merge.txt for details. Added several features that were slated for setuptools 0.6c12: * Index URL now defaults to HTTPS. * Added experimental environment marker support. Now clients may designate a PEP-426 environment marker for "extra" dependencies. Setuptools uses this feature in ``setup.py`` for optional SSL and certificate validation support on older platforms. Based on Distutils-SIG discussions, the syntax is somewhat tentative. There should probably be a PEP with a firmer spec before the feature should be considered suitable for use. * Added support for SSL certificate validation when installing packages from an HTTPS service. ----- 0.7b4 ----- * `Issue #3 `_: Fixed NameError in SSL support. ------ 0.6.49 ------ * Move warning check in ``get_cache_path`` to follow the directory creation to avoid errors when the cache path does not yet exist. Fixes the error reported in `Distribute #375 `_. ------ 0.6.48 ------ * Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in 0.6.46 (redo). ------ 0.6.47 ------ * Correct AttributeError in ``ResourceManager.get_cache_path`` introduced in 0.6.46. ------ 0.6.46 ------ * `Distribute #375 `_: Issue a warning if the PYTHON_EGG_CACHE or otherwise customized egg cache location specifies a directory that's group- or world-writable. ------ 0.6.45 ------ * `Distribute #379 `_: ``distribute_setup.py`` now traps VersionConflict as well, restoring ability to upgrade from an older setuptools version. ------ 0.6.44 ------ * ``distribute_setup.py`` has been updated to allow Setuptools 0.7 to satisfy use_setuptools. ------ 0.6.43 ------ * `Distribute #378 `_: Restore support for Python 2.4 Syntax (regression in 0.6.42). ------ 0.6.42 ------ * External links finder no longer yields duplicate links. * `Distribute #337 `_: Moved site.py to setuptools/site-patch.py (graft of very old patch from setuptools trunk which inspired PR `#31 `_). ------ 0.6.41 ------ * `Distribute #27 `_: Use public api for loading resources from zip files rather than the private method `_zip_directory_cache`. * Added a new function ``easy_install.get_win_launcher`` which may be used by third-party libraries such as buildout to get a suitable script launcher. ------ 0.6.40 ------ * `Distribute #376 `_: brought back cli.exe and gui.exe that were deleted in the previous release. ------ 0.6.39 ------ * Add support for console launchers on ARM platforms. * Fix possible issue in GUI launchers where the subsystem was not supplied to the linker. * Launcher build script now refactored for robustness. * `Distribute #375 `_: Resources extracted from a zip egg to the file system now also check the contents of the file against the zip contents during each invocation of get_resource_filename. ------ 0.6.38 ------ * `Distribute #371 `_: The launcher manifest file is now installed properly. ------ 0.6.37 ------ * `Distribute #143 `_: Launcher scripts, including easy_install itself, are now accompanied by a manifest on 32-bit Windows environments to avoid the Installer Detection Technology and thus undesirable UAC elevation described in `this Microsoft article `_. ------ 0.6.36 ------ * Pull Request `#35 `_: In `Buildout #64 `_, it was reported that under Python 3, installation of distutils scripts could attempt to copy the ``__pycache__`` directory as a file, causing an error, apparently only under Windows. Easy_install now skips all directories when processing metadata scripts. ------ 0.6.35 ------ Note this release is backward-incompatible with distribute 0.6.23-0.6.34 in how it parses version numbers. * `Distribute #278 `_: Restored compatibility with distribute 0.6.22 and setuptools 0.6. Updated the documentation to match more closely with the version parsing as intended in setuptools 0.6. ------ 0.6.34 ------ * `Distribute #341 `_: 0.6.33 fails to build under Python 2.4. ------ 0.6.33 ------ * Fix 2 errors with Jython 2.5. * Fix 1 failure with Jython 2.5 and 2.7. * Disable workaround for Jython scripts on Linux systems. * `Distribute #336 `_: `setup.py` no longer masks failure exit code when tests fail. * Fix issue in pkg_resources where try/except around a platform-dependent import would trigger hook load failures on Mercurial. See pull request 32 for details. * `Distribute #341 `_: Fix a ResourceWarning. ------ 0.6.32 ------ * Fix test suite with Python 2.6. * Fix some DeprecationWarnings and ResourceWarnings. * `Distribute #335 `_: Backed out `setup_requires` superceding installed requirements until regression can be addressed. ------ 0.6.31 ------ * `Distribute #303 `_: Make sure the manifest only ever contains UTF-8 in Python 3. * `Distribute #329 `_: Properly close files created by tests for compatibility with Jython. * Work around `Jython #1980 `_ and `Jython #1981 `_. * `Distribute #334 `_: Provide workaround for packages that reference `sys.__stdout__` such as numpy does. This change should address `virtualenv `#359 `_ `_ as long as the system encoding is UTF-8 or the IO encoding is specified in the environment, i.e.:: PYTHONIOENCODING=utf8 pip install numpy * Fix for encoding issue when installing from Windows executable on Python 3. * `Distribute #323 `_: Allow `setup_requires` requirements to supercede installed requirements. Added some new keyword arguments to existing pkg_resources methods. Also had to updated how __path__ is handled for namespace packages to ensure that when a new egg distribution containing a namespace package is placed on sys.path, the entries in __path__ are found in the same order they would have been in had that egg been on the path when pkg_resources was first imported. ------ 0.6.30 ------ * `Distribute #328 `_: Clean up temporary directories in distribute_setup.py. * Fix fatal bug in distribute_setup.py. ------ 0.6.29 ------ * Pull Request `#14 `_: Honor file permissions in zip files. * `Distribute #327 `_: Merged pull request `#24 `_ to fix a dependency problem with pip. * Merged pull request `#23 `_ to fix https://github.com/pypa/virtualenv/issues/301. * If Sphinx is installed, the `upload_docs` command now runs `build_sphinx` to produce uploadable documentation. * `Distribute #326 `_: `upload_docs` provided mangled auth credentials under Python 3. * `Distribute #320 `_: Fix check for "createable" in distribute_setup.py. * `Distribute #305 `_: Remove a warning that was triggered during normal operations. * `Distribute #311 `_: Print metadata in UTF-8 independent of platform. * `Distribute #303 `_: Read manifest file with UTF-8 encoding under Python 3. * `Distribute #301 `_: Allow to run tests of namespace packages when using 2to3. * `Distribute #304 `_: Prevent import loop in site.py under Python 3.3. * `Distribute #283 `_: Reenable scanning of `*.pyc` / `*.pyo` files on Python 3.3. * `Distribute #299 `_: The develop command didn't work on Python 3, when using 2to3, as the egg link would go to the Python 2 source. Linking to the 2to3'd code in build/lib makes it work, although you will have to rebuild the module before testing it. * `Distribute #306 `_: Even if 2to3 is used, we build in-place under Python 2. * `Distribute #307 `_: Prints the full path when .svn/entries is broken. * `Distribute #313 `_: Support for sdist subcommands (Python 2.7) * `Distribute #314 `_: test_local_index() would fail an OS X. * `Distribute #310 `_: Non-ascii characters in a namespace __init__.py causes errors. * `Distribute #218 `_: Improved documentation on behavior of `package_data` and `include_package_data`. Files indicated by `package_data` are now included in the manifest. * `distribute_setup.py` now allows a `--download-base` argument for retrieving distribute from a specified location. ------ 0.6.28 ------ * `Distribute #294 `_: setup.py can now be invoked from any directory. * Scripts are now installed honoring the umask. * Added support for .dist-info directories. * `Distribute #283 `_: Fix and disable scanning of `*.pyc` / `*.pyo` files on Python 3.3. ------ 0.6.27 ------ * Support current snapshots of CPython 3.3. * Distribute now recognizes README.rst as a standard, default readme file. * Exclude 'encodings' modules when removing modules from sys.modules. Workaround for `#285 `_. * `Distribute #231 `_: Don't fiddle with system python when used with buildout (bootstrap.py) ------ 0.6.26 ------ * `Distribute #183 `_: Symlinked files are now extracted from source distributions. * `Distribute #227 `_: Easy_install fetch parameters are now passed during the installation of a source distribution; now fulfillment of setup_requires dependencies will honor the parameters passed to easy_install. ------ 0.6.25 ------ * `Distribute #258 `_: Workaround a cache issue * `Distribute #260 `_: distribute_setup.py now accepts the --user parameter for Python 2.6 and later. * `Distribute #262 `_: package_index.open_with_auth no longer throws LookupError on Python 3. * `Distribute #269 `_: AttributeError when an exception occurs reading Manifest.in on late releases of Python. * `Distribute #272 `_: Prevent TypeError when namespace package names are unicode and single-install-externally-managed is used. Also fixes PIP issue 449. * `Distribute #273 `_: Legacy script launchers now install with Python2/3 support. ------ 0.6.24 ------ * `Distribute #249 `_: Added options to exclude 2to3 fixers ------ 0.6.23 ------ * `Distribute #244 `_: Fixed a test * `Distribute #243 `_: Fixed a test * `Distribute #239 `_: Fixed a test * `Distribute #240 `_: Fixed a test * `Distribute #241 `_: Fixed a test * `Distribute #237 `_: Fixed a test * `Distribute #238 `_: easy_install now uses 64bit executable wrappers on 64bit Python * `Distribute #208 `_: Fixed parsed_versions, it now honors post-releases as noted in the documentation * `Distribute #207 `_: Windows cli and gui wrappers pass CTRL-C to child python process * `Distribute #227 `_: easy_install now passes its arguments to setup.py bdist_egg * `Distribute #225 `_: Fixed a NameError on Python 2.5, 2.4 ------ 0.6.21 ------ * `Distribute #225 `_: FIxed a regression on py2.4 ------ 0.6.20 ------ * `Distribute #135 `_: Include url in warning when processing URLs in package_index. * `Distribute #212 `_: Fix issue where easy_instal fails on Python 3 on windows installer. * `Distribute #213 `_: Fix typo in documentation. ------ 0.6.19 ------ * `Distribute #206 `_: AttributeError: 'HTTPMessage' object has no attribute 'getheaders' ------ 0.6.18 ------ * `Distribute #210 `_: Fixed a regression introduced by `Distribute #204 `_ fix. ------ 0.6.17 ------ * Support 'DISTRIBUTE_DISABLE_VERSIONED_EASY_INSTALL_SCRIPT' environment variable to allow to disable installation of easy_install-${version} script. * Support Python >=3.1.4 and >=3.2.1. * `Distribute #204 `_: Don't try to import the parent of a namespace package in declare_namespace * `Distribute #196 `_: Tolerate responses with multiple Content-Length headers * `Distribute #205 `_: Sandboxing doesn't preserve working_set. Leads to setup_requires problems. ------ 0.6.16 ------ * Builds sdist gztar even on Windows (avoiding `Distribute #193 `_). * `Distribute #192 `_: Fixed metadata omitted on Windows when package_dir specified with forward-slash. * `Distribute #195 `_: Cython build support. * `Distribute #200 `_: Issues with recognizing 64-bit packages on Windows. ------ 0.6.15 ------ * Fixed typo in bdist_egg * Several issues under Python 3 has been solved. * `Distribute #146 `_: Fixed missing DLL files after easy_install of windows exe package. ------ 0.6.14 ------ * `Distribute #170 `_: Fixed unittest failure. Thanks to Toshio. * `Distribute #171 `_: Fixed race condition in unittests cause deadlocks in test suite. * `Distribute #143 `_: Fixed a lookup issue with easy_install. Thanks to David and Zooko. * `Distribute #174 `_: Fixed the edit mode when its used with setuptools itself ------ 0.6.13 ------ * `Distribute #160 `_: 2.7 gives ValueError("Invalid IPv6 URL") * `Distribute #150 `_: Fixed using ~/.local even in a --no-site-packages virtualenv * `Distribute #163 `_: scan index links before external links, and don't use the md5 when comparing two distributions ------ 0.6.12 ------ * `Distribute #149 `_: Fixed various failures on 2.3/2.4 ------ 0.6.11 ------ * Found another case of SandboxViolation - fixed * `Distribute #15 `_ and `Distribute #48 `_: Introduced a socket timeout of 15 seconds on url openings * Added indexsidebar.html into MANIFEST.in * `Distribute #108 `_: Fixed TypeError with Python3.1 * `Distribute #121 `_: Fixed --help install command trying to actually install. * `Distribute #112 `_: Added an os.makedirs so that Tarek's solution will work. * `Distribute #133 `_: Added --no-find-links to easy_install * Added easy_install --user * `Distribute #100 `_: Fixed develop --user not taking '.' in PYTHONPATH into account * `Distribute #134 `_: removed spurious UserWarnings. Patch by VanLindberg * `Distribute #138 `_: cant_write_to_target error when setup_requires is used. * `Distribute #147 `_: respect the sys.dont_write_bytecode flag ------ 0.6.10 ------ * Reverted change made for the DistributionNotFound exception because zc.buildout uses the exception message to get the name of the distribution. ----- 0.6.9 ----- * `Distribute #90 `_: unknown setuptools version can be added in the working set * `Distribute #87 `_: setupt.py doesn't try to convert distribute_setup.py anymore Initial Patch by arfrever. * `Distribute #89 `_: added a side bar with a download link to the doc. * `Distribute #86 `_: fixed missing sentence in pkg_resources doc. * Added a nicer error message when a DistributionNotFound is raised. * `Distribute #80 `_: test_develop now works with Python 3.1 * `Distribute #93 `_: upload_docs now works if there is an empty sub-directory. * `Distribute #70 `_: exec bit on non-exec files * `Distribute #99 `_: now the standalone easy_install command doesn't uses a "setup.cfg" if any exists in the working directory. It will use it only if triggered by ``install_requires`` from a setup.py call (install, develop, etc). * `Distribute #101 `_: Allowing ``os.devnull`` in Sandbox * `Distribute #92 `_: Fixed the "no eggs" found error with MacPort (platform.mac_ver() fails) * `Distribute #103 `_: test_get_script_header_jython_workaround not run anymore under py3 with C or POSIX local. Contributed by Arfrever. * `Distribute #104 `_: remvoved the assertion when the installation fails, with a nicer message for the end user. * `Distribute #100 `_: making sure there's no SandboxViolation when the setup script patches setuptools. ----- 0.6.8 ----- * Added "check_packages" in dist. (added in Setuptools 0.6c11) * Fixed the DONT_PATCH_SETUPTOOLS state. ----- 0.6.7 ----- * `Distribute #58 `_: Added --user support to the develop command * `Distribute #11 `_: Generated scripts now wrap their call to the script entry point in the standard "if name == 'main'" * Added the 'DONT_PATCH_SETUPTOOLS' environment variable, so virtualenv can drive an installation that doesn't patch a global setuptools. * Reviewed unladen-swallow specific change from http://code.google.com/p/unladen-swallow/source/detail?spec=svn875&r=719 and determined that it no longer applies. Distribute should work fine with Unladen Swallow 2009Q3. * `Distribute #21 `_: Allow PackageIndex.open_url to gracefully handle all cases of a httplib.HTTPException instead of just InvalidURL and BadStatusLine. * Removed virtual-python.py from this distribution and updated documentation to point to the actively maintained virtualenv instead. * `Distribute #64 `_: use_setuptools no longer rebuilds the distribute egg every time it is run * use_setuptools now properly respects the requested version * use_setuptools will no longer try to import a distribute egg for the wrong Python version * `Distribute #74 `_: no_fake should be True by default. * `Distribute #72 `_: avoid a bootstrapping issue with easy_install -U ----- 0.6.6 ----- * Unified the bootstrap file so it works on both py2.x and py3k without 2to3 (patch by Holger Krekel) ----- 0.6.5 ----- * `Distribute #65 `_: cli.exe and gui.exe are now generated at build time, depending on the platform in use. * `Distribute #67 `_: Fixed doc typo (PEP 381/382) * Distribute no longer shadows setuptools if we require a 0.7-series setuptools. And an error is raised when installing a 0.7 setuptools with distribute. * When run from within buildout, no attempt is made to modify an existing setuptools egg, whether in a shared egg directory or a system setuptools. * Fixed a hole in sandboxing allowing builtin file to write outside of the sandbox. ----- 0.6.4 ----- * Added the generation of `distribute_setup_3k.py` during the release. This closes `Distribute #52 `_. * Added an upload_docs command to easily upload project documentation to PyPI's https://pythonhosted.org. This close issue `Distribute #56 `_. * Fixed a bootstrap bug on the use_setuptools() API. ----- 0.6.3 ----- setuptools ========== * Fixed a bunch of calls to file() that caused crashes on Python 3. bootstrapping ============= * Fixed a bug in sorting that caused bootstrap to fail on Python 3. ----- 0.6.2 ----- setuptools ========== * Added Python 3 support; see docs/python3.txt. This closes `Old Setuptools #39 `_. * Added option to run 2to3 automatically when installing on Python 3. This closes issue `Distribute #31 `_. * Fixed invalid usage of requirement.parse, that broke develop -d. This closes `Old Setuptools #44 `_. * Fixed script launcher for 64-bit Windows. This closes `Old Setuptools #2 `_. * KeyError when compiling extensions. This closes `Old Setuptools #41 `_. bootstrapping ============= * Fixed bootstrap not working on Windows. This closes issue `Distribute #49 `_. * Fixed 2.6 dependencies. This closes issue `Distribute #50 `_. * Make sure setuptools is patched when running through easy_install This closes `Old Setuptools #40 `_. ----- 0.6.1 ----- setuptools ========== * package_index.urlopen now catches BadStatusLine and malformed url errors. This closes `Distribute #16 `_ and `Distribute #18 `_. * zip_ok is now False by default. This closes `Old Setuptools #33 `_. * Fixed invalid URL error catching. `Old Setuptools #20 `_. * Fixed invalid bootstraping with easy_install installation (`Distribute #40 `_). Thanks to Florian Schulze for the help. * Removed buildout/bootstrap.py. A new repository will create a specific bootstrap.py script. bootstrapping ============= * The boostrap process leave setuptools alone if detected in the system and --root or --prefix is provided, but is not in the same location. This closes `Distribute #10 `_. --- 0.6 --- setuptools ========== * Packages required at build time where not fully present at install time. This closes `Distribute #12 `_. * Protected against failures in tarfile extraction. This closes `Distribute #10 `_. * Made Jython api_tests.txt doctest compatible. This closes `Distribute #7 `_. * sandbox.py replaced builtin type file with builtin function open. This closes `Distribute #6 `_. * Immediately close all file handles. This closes `Distribute #3 `_. * Added compatibility with Subversion 1.6. This references `Distribute #1 `_. pkg_resources ============= * Avoid a call to /usr/bin/sw_vers on OSX and use the official platform API instead. Based on a patch from ronaldoussoren. This closes issue `#5 `_. * Fixed a SandboxViolation for mkdir that could occur in certain cases. This closes `Distribute #13 `_. * Allow to find_on_path on systems with tight permissions to fail gracefully. This closes `Distribute #9 `_. * Corrected inconsistency between documentation and code of add_entry. This closes `Distribute #8 `_. * Immediately close all file handles. This closes `Distribute #3 `_. easy_install ============ * Immediately close all file handles. This closes `Distribute #3 `_. Keywords: CPAN PyPI distutils eggs package management Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: Python Software Foundation License Classifier: License :: OSI Approved :: Zope Public License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.1 Classifier: Programming Language :: Python :: 3.2 Classifier: Programming Language :: Python :: 3.3 Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: System :: Archiving :: Packaging Classifier: Topic :: System :: Systems Administration Classifier: Topic :: Utilities PK[;"site-packages/kitchen/__init__.pycnu[ i:Oc@sudZddlmZddlmZejd\ZZejdde\ZZ d Z ej e Z d Z d S( sH Kitchen Aggregate of a bunch of unrelated but helpful python modules. i(ti18n(t versionings kitchen.coret use_unicodeit exceptionstreleaseN(iii((iii(s exceptionssrelease(t__doc__tkitchenRRteasy_gettext_setupt_tN_tFalsetb_tbN_t__version_info__tversion_tuple_to_stringt __version__t__all__(((s4/usr/lib/python2.7/site-packages/kitchen/__init__.pytsPK[Q{ss site-packages/kitchen/release.pynu[''' Information about this kitchen release. ''' from kitchen import _, __version__ NAME = 'kitchen' VERSION = __version__ DESCRIPTION = _('Kitchen contains a cornucopia of useful code') LONG_DESCRIPTION = _(''' We've all done it. In the process of writing a brand new application we've discovered that we need a little bit of code that we've invented before. Perhaps it's something to handle unicode text. Perhaps it's something to make a bit of python-2.5 code run on python-2.3. Whatever it is, it ends up being a tiny bit of code that seems too small to worry about pushing into its own module so it sits there, a part of your current project, waiting to be cut and pasted into your next project. And the next. And the next. And since that little bittybit of code proved so useful to you, it's highly likely that it proved useful to someone else as well. Useful enough that they've written it and copy and pasted it over and over into each of their new projects. Well, no longer! Kitchen aims to pull these small snippets of code into a few python modules which you can import and use within your project. No more copy and paste! Now you can let someone else maintain and release these small snippets so that you can get on with your life. ''') AUTHOR = 'Toshio Kuratomi, Seth Vidal, others' EMAIL = 'toshio@fedoraproject.org' COPYRIGHT = '2011 Red Hat, Inc. and others' URL = 'https://fedorahosted.org/kitchen' DOWNLOAD_URL = 'https://fedorahosted.org/releases/k/i/kitchen' LICENSE = 'LGPLv2+' __all__ = ('NAME', 'VERSION', 'DESCRIPTION', 'LONG_DESCRIPTION', 'AUTHOR', 'EMAIL', 'COPYRIGHT', 'URL', 'DOWNLOAD_URL', 'LICENSE') PK[H-&&-site-packages/kitchen/versioning/__init__.pycnu[ i:Oc@s7dZdZddlZdZeeZd ZdS( s ---------------------------- PEP-386 compliant versioning ---------------------------- :pep:`386` defines a standard format for version strings. This module contains a function for creating strings in that format. iiiNc Csg}x|D]}t|dtrK|jdjtjt|q t|dtrt|djd}n |d}|d kr|jd|djtjt|d pd fq |jd |t|d fq Wtd j|dS(s Return a :pep:`386` version string from a :pep:`386` style version tuple :arg version_info: Nested set of tuples that describes the version. See below for an example. :returns: a version string This function implements just enough of :pep:`386` to satisfy our needs. :pep:`386` defines a standard format for version strings and refers to a function that will be merged into the |stdlib|_ that transforms a tuple of version information into a standard version string. This function is an implementation of that function. Once that function becomes available in the |stdlib|_ we will start using it and deprecate this function. :attr:`version_info` takes the form that :pep:`386`'s :func:`NormalizedVersion.from_parts` uses:: ((Major, Minor, [Micros]), [(Alpha/Beta/rc marker, version)], [(post/dev marker, version)]) Ex: ((1, 0, 0), ('a', 2), ('dev', 3456)) It generates a :pep:`386` compliant version string:: N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN] Ex: 1.0.0a2.dev3456 .. warning:: This function does next to no error checking. It's up to the person defining the version tuple to make sure that the values make sense. If the :pep:`386` compliant version parser doesn't get released soon we'll look at making this function check that the version tuple makes sense before transforming it into a string. It's recommended that you use this function to keep a :data:`__version_info__` tuple and :data:`__version__` string in your modules. Why do we need both a tuple and a string? The string is often useful for putting into human readable locations like release announcements, version strings in tarballs, etc. Meanwhile the tuple is very easy for a computer to compare. For example, kitchen sets up its version information like this:: from kitchen.versioning import version_tuple_to_string __version_info__ = ((0, 2, 1),) __version__ = version_tuple_to_string(__version_info__) Other programs that depend on a kitchen version between 0.2.1 and 0.3.0 can find whether the present version is okay with code like this:: from kitchen import __version_info__, __version__ if __version_info__ < ((0, 2, 1),) or __version_info__ >= ((0, 3, 0),): print 'kitchen is present but not at the right version.' print 'We need at least version 0.2.1 and less than 0.3.0' print 'Currently found: kitchen-%s' % __version__ it.tasciitatbtctrcs%s%sit0s.%s%st(RRRsrc( t isinstancetinttappendtjoint itertoolstimaptstrtunicodetencode(t version_infotver_componentstvaluestmodifier((s?/usr/lib/python2.7/site-packages/kitchen/versioning/__init__.pytversion_tuple_to_string s7 %   - R(iii((iii(sversion_tuple_to_string(t__doc__t__version_info__R Rt __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/versioning/__init__.pyts   I PK[D__,site-packages/kitchen/versioning/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2011 Red Hat, Inc # # kitchen is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # kitchen is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with kitchen; if not, see # # Authors: # Toshio Kuratomi ''' ---------------------------- PEP-386 compliant versioning ---------------------------- :pep:`386` defines a standard format for version strings. This module contains a function for creating strings in that format. ''' __version_info__ = ((1, 0, 0),) import itertools def version_tuple_to_string(version_info): '''Return a :pep:`386` version string from a :pep:`386` style version tuple :arg version_info: Nested set of tuples that describes the version. See below for an example. :returns: a version string This function implements just enough of :pep:`386` to satisfy our needs. :pep:`386` defines a standard format for version strings and refers to a function that will be merged into the |stdlib|_ that transforms a tuple of version information into a standard version string. This function is an implementation of that function. Once that function becomes available in the |stdlib|_ we will start using it and deprecate this function. :attr:`version_info` takes the form that :pep:`386`'s :func:`NormalizedVersion.from_parts` uses:: ((Major, Minor, [Micros]), [(Alpha/Beta/rc marker, version)], [(post/dev marker, version)]) Ex: ((1, 0, 0), ('a', 2), ('dev', 3456)) It generates a :pep:`386` compliant version string:: N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN] Ex: 1.0.0a2.dev3456 .. warning:: This function does next to no error checking. It's up to the person defining the version tuple to make sure that the values make sense. If the :pep:`386` compliant version parser doesn't get released soon we'll look at making this function check that the version tuple makes sense before transforming it into a string. It's recommended that you use this function to keep a :data:`__version_info__` tuple and :data:`__version__` string in your modules. Why do we need both a tuple and a string? The string is often useful for putting into human readable locations like release announcements, version strings in tarballs, etc. Meanwhile the tuple is very easy for a computer to compare. For example, kitchen sets up its version information like this:: from kitchen.versioning import version_tuple_to_string __version_info__ = ((0, 2, 1),) __version__ = version_tuple_to_string(__version_info__) Other programs that depend on a kitchen version between 0.2.1 and 0.3.0 can find whether the present version is okay with code like this:: from kitchen import __version_info__, __version__ if __version_info__ < ((0, 2, 1),) or __version_info__ >= ((0, 3, 0),): print 'kitchen is present but not at the right version.' print 'We need at least version 0.2.1 and less than 0.3.0' print 'Currently found: kitchen-%s' % __version__ ''' ver_components = [] for values in version_info: if isinstance(values[0], int): ver_components.append('.'.join(itertools.imap(str, values))) else: if isinstance(values[0], unicode): modifier = values[0].encode('ascii') else: modifier = values[0] if modifier in ('a', 'b', 'c', 'rc'): ver_components.append('%s%s' % (modifier, '.'.join(itertools.imap(str, values[1:])) or '0')) else: ver_components.append('.%s%s' % (modifier, str(values[1]))) return unicode(''.join(ver_components), 'ascii') __version__ = version_tuple_to_string(__version_info__) __all__ = ('version_tuple_to_string',) PK[H-&&-site-packages/kitchen/versioning/__init__.pyonu[ i:Oc@s7dZdZddlZdZeeZd ZdS( s ---------------------------- PEP-386 compliant versioning ---------------------------- :pep:`386` defines a standard format for version strings. This module contains a function for creating strings in that format. iiiNc Csg}x|D]}t|dtrK|jdjtjt|q t|dtrt|djd}n |d}|d kr|jd|djtjt|d pd fq |jd |t|d fq Wtd j|dS(s Return a :pep:`386` version string from a :pep:`386` style version tuple :arg version_info: Nested set of tuples that describes the version. See below for an example. :returns: a version string This function implements just enough of :pep:`386` to satisfy our needs. :pep:`386` defines a standard format for version strings and refers to a function that will be merged into the |stdlib|_ that transforms a tuple of version information into a standard version string. This function is an implementation of that function. Once that function becomes available in the |stdlib|_ we will start using it and deprecate this function. :attr:`version_info` takes the form that :pep:`386`'s :func:`NormalizedVersion.from_parts` uses:: ((Major, Minor, [Micros]), [(Alpha/Beta/rc marker, version)], [(post/dev marker, version)]) Ex: ((1, 0, 0), ('a', 2), ('dev', 3456)) It generates a :pep:`386` compliant version string:: N.N[.N]+[{a|b|c|rc}N[.N]+][.postN][.devN] Ex: 1.0.0a2.dev3456 .. warning:: This function does next to no error checking. It's up to the person defining the version tuple to make sure that the values make sense. If the :pep:`386` compliant version parser doesn't get released soon we'll look at making this function check that the version tuple makes sense before transforming it into a string. It's recommended that you use this function to keep a :data:`__version_info__` tuple and :data:`__version__` string in your modules. Why do we need both a tuple and a string? The string is often useful for putting into human readable locations like release announcements, version strings in tarballs, etc. Meanwhile the tuple is very easy for a computer to compare. For example, kitchen sets up its version information like this:: from kitchen.versioning import version_tuple_to_string __version_info__ = ((0, 2, 1),) __version__ = version_tuple_to_string(__version_info__) Other programs that depend on a kitchen version between 0.2.1 and 0.3.0 can find whether the present version is okay with code like this:: from kitchen import __version_info__, __version__ if __version_info__ < ((0, 2, 1),) or __version_info__ >= ((0, 3, 0),): print 'kitchen is present but not at the right version.' print 'We need at least version 0.2.1 and less than 0.3.0' print 'Currently found: kitchen-%s' % __version__ it.tasciitatbtctrcs%s%sit0s.%s%st(RRRsrc( t isinstancetinttappendtjoint itertoolstimaptstrtunicodetencode(t version_infotver_componentstvaluestmodifier((s?/usr/lib/python2.7/site-packages/kitchen/versioning/__init__.pytversion_tuple_to_string s7 %   - R(iii((iii(sversion_tuple_to_string(t__doc__t__version_info__R Rt __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/versioning/__init__.pyts   I PK[{o6KtKt'site-packages/kitchen/i18n/__init__.pycnu[ i:Oc@svdZddlmZdddffZeeZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z yddlm ZWn,ek re jje jdd ZnXdd lmZmZdd lmZiZd eejfd YZdeejfdYZeeee edZ!ee dZ"d dddfZ#dS(s :term:`I18N` is an important piece of any modern program. Unfortunately, setting up :term:`i18n` in your program is often a confusing process. The functions provided here aim to make the programming side of that a little easier. Most projects will be able to do something like this when they startup:: # myprogram/__init__.py: import os import sys from kitchen.i18n import easy_gettext_setup _, N_ = easy_gettext_setup('myprogram', localedirs=( os.path.join(os.path.realpath(os.path.dirname(__file__)), 'locale'), os.path.join(sys.prefix, 'lib', 'locale') )) Then, in other files that have strings that need translating:: # myprogram/commands.py: from myprogram import _, N_ def print_usage(): print _(u"""available commands are: --help Display help --version Display version of this program --bake-me-a-cake as fast as you can """) def print_invitations(age): print _('Please come to my party.') print N_('I will be turning %(age)s year old', 'I will be turning %(age)s years old', age) % {'age': age} See the documentation of :func:`easy_gettext_setup` and :func:`get_translation_object` for more details. .. seealso:: :mod:`gettext` for details of how the python gettext facilities work `babel `_ The babel module for in depth information on gettext, :term:`message catalogs`, and translating your app. babel provides some nice features for :term:`i18n` on top of :mod:`gettext` i(tversion_tuple_to_stringiiN(tENOENT(t_default_localedirtsharetlocale(tto_bytest to_unicode(tbyte_string_valid_encodingtDummyTranslationscBseZdZddZdZdZeeeZdZ e e j ds`dZ ndZdZ d Zd Zd Zd Zd ZRS(sSafer version of :class:`gettext.NullTranslations` This Translations class doesn't translate the strings and is intended to be used as a fallback when there were errors setting up a real Translations object. It's safer than :class:`gettext.NullTranslations` in its handling of byte :class:`str` vs :class:`unicode` strings. Unlike :class:`~gettext.NullTranslations`, this Translation class will never throw a :exc:`~exceptions.UnicodeError`. The code that you have around a call to :class:`DummyTranslations` might throw a :exc:`~exceptions.UnicodeError` but at least that will be in code you control and can fix. Also, unlike :class:`~gettext.NullTranslations` all of this Translation object's methods guarantee to return byte :class:`str` except for :meth:`ugettext` and :meth:`ungettext` which guarantee to return :class:`unicode` strings. When byte :class:`str` are returned, the strings will be encoded according to this algorithm: 1) If a fallback has been added, the fallback will be called first. You'll need to consult the fallback to see whether it performs any encoding changes. 2) If a byte :class:`str` was given, the same byte :class:`str` will be returned. 3) If a :class:`unicode` string was given and :meth:`set_output_charset` has been called then we encode the string using the :attr:`output_charset` 4) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` and :attr:`_charset` was set output in that charset. 5) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` we encode it using 'utf-8'. 6) If a :class:`unicode` string was given and this is :meth:`lgettext` or :meth:`lngettext` we encode using the value of :func:`locale.getpreferredencoding` For :meth:`ugettext` and :meth:`ungettext`, we go through the same set of steps with the following differences: * We transform byte :class:`str` into :class:`unicode` strings for these methods. * The encoding used to decode the byte :class:`str` is taken from :attr:`input_charset` if it's set, otherwise we decode using :term:`UTF-8`. .. attribute:: input_charset is an extension to the |stdlib|_ :mod:`gettext` that specifies what charset a message is encoded in when decoding a message to :class:`unicode`. This is used for two purposes: 1) If the message string is a byte :class:`str`, this is used to decode the string to a :class:`unicode` string before looking it up in the :term:`message catalog`. 2) In :meth:`~kitchen.i18n.DummyTranslations.ugettext` and :meth:`~kitchen.i18n.DummyTranslations.ungettext` methods, if a byte :class:`str` is given as the message and is untranslated this is used as the encoding when decoding to :class:`unicode`. This is different from :attr:`_charset` which may be set when a :term:`message catalog` is loaded because :attr:`input_charset` is used to describe an encoding used in a python source file while :attr:`_charset` describes the encoding used in the :term:`message catalog` file. Any characters that aren't able to be transformed from a byte :class:`str` to :class:`unicode` string or vice versa will be replaced with a replacement character (ie: ``u'�'`` in unicode based encodings, ``'?'`` in other :term:`ASCII` compatible encodings). .. seealso:: :class:`gettext.NullTranslations` For information about what methods are available and what they do. .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 * Although we had adapted :meth:`gettext`, :meth:`ngettext`, :meth:`lgettext`, and :meth:`lngettext` to always return byte :class:`str`, we hadn't forced those byte :class:`str` to always be in a specified charset. We now make sure that :meth:`gettext` and :meth:`ngettext` return byte :class:`str` encoded using :attr:`output_charset` if set, otherwise :attr:`charset` and if neither of those, :term:`UTF-8`. With :meth:`lgettext` and :meth:`lngettext` :attr:`output_charset` if set, otherwise :func:`locale.getpreferredencoding`. * Make setting :attr:`input_charset` and :attr:`output_charset` also set those attributes on any fallback translation objects. cCs;tjj||t|ds.d|_nd|_dS(Nt_output_charsetsutf-8(tgettexttNullTranslationst__init__thasattrtNoneR t_input_charset(tselftfp((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR s cCs=|jr0y||j_Wq0tk r,q0Xn||_dS(N(t _fallbackt input_charsettAttributeErrorR(Rtcharset((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyt_set_input_charsets   cCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyt_get_input_charsetscCsl|jr4y|jj|Wq4tk r0q4Xnytjj||Wntk rg||_nXdS(sSet the output charset This serves two purposes. The normal :meth:`gettext.NullTranslations.set_output_charset` does not set the output on fallback objects. On python-2.3, :class:`gettext.NullTranslations` objects don't contain this method. N(Rtset_output_charsetRR R R (RR((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyRs   toutput_charsetcCs|jS(s=Compatibility for python2.3 which doesn't have output_charset(R (R((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyRscCst}d}yt||}Wntk r2nX|r=|Syt|d|jdd}Wntk rpdSXt|d|S(sReturn a byte string that's valid in a specific charset. .. warning:: This method may mangle the message if the inpput encoding is not known or the message isn't represntable in the chosen output encoding. tencodingt nonstringtstricttN(tFalseRRt TypeErrorRRR(Rtmessagetoutput_encodingtvalidtmsg((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyt_reencode_if_necessarys   cCsg|jr<y|jj|}Wq<ttfk r8q<Xn|jpT|jpT|j}|j||S(N(RR Rt UnicodeErrorR t_charsetRR$(RR R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR s  cCs|dkr|}n|}|jr]y|jj|||}Wq]ttfk rYq]Xn|jpu|jpu|j}|j||S(Ni(RtngettextRR%R R&RR$(Rtmsgid1tmsgid2tnR R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR''s    cCsa|jr<y|jj|}Wq<ttfk r8q<Xn|jpNtj}|j||S(N(RtlgettextRR%R RtgetpreferredencodingR$(RR R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR+<s   cCs|dkr|}n|}|jr]y|jj|||}Wq]ttfk rYq]Xn|jpotj}|j||S(Ni(Rt lngettextRR%R RR,R$(RR(R)R*R R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR-Ls     cCswt|tsdS|jrdt|d|j}y|jj|}Wqdttfk r`qdXnt|d|jS(NuR(t isinstancet basestringRRRtugettextRR%(RR R#((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR0bs cCs|dkr|}n|}|jrt|d|j}t|d|j}y|jj|||}Wqttfk rqXnt|d|jddS(NiRRtempty(RRRt ungettextRR%(RR(R)R*R ((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR2ps   N(t__name__t __module__t__doc__RR RRtpropertyRRR R R RR$R'R+R-R0R2(((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyRusU          tNewGNUTranslationscBsMeZdZdZdZdZdZdZdZdZ RS(shSafer version of :class:`gettext.GNUTranslations` :class:`gettext.GNUTranslations` suffers from two problems that this class fixes. 1) :class:`gettext.GNUTranslations` can throw a :exc:`~exceptions.UnicodeError` in :meth:`gettext.GNUTranslations.ugettext` if the message being translated has non-:term:`ASCII` characters and there is no translation for it. 2) :class:`gettext.GNUTranslations` can return byte :class:`str` from :meth:`gettext.GNUTranslations.ugettext` and :class:`unicode` strings from the other :meth:`~gettext.GNUTranslations.gettext` methods if the message being translated is the wrong type When byte :class:`str` are returned, the strings will be encoded according to this algorithm: 1) If a fallback has been added, the fallback will be called first. You'll need to consult the fallback to see whether it performs any encoding changes. 2) If a byte :class:`str` was given, the same byte :class:`str` will be returned. 3) If a :class:`unicode` string was given and :meth:`set_output_charset` has been called then we encode the string using the :attr:`output_charset` 4) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` and a charset was detected when parsing the :term:`message catalog`, output in that charset. 5) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` we encode it using :term:`UTF-8`. 6) If a :class:`unicode` string was given and this is :meth:`lgettext` or :meth:`lngettext` we encode using the value of :func:`locale.getpreferredencoding` For :meth:`ugettext` and :meth:`ungettext`, we go through the same set of steps with the following differences: * We transform byte :class:`str` into :class:`unicode` strings for these methods. * The encoding used to decode the byte :class:`str` is taken from :attr:`input_charset` if it's set, otherwise we decode using :term:`UTF-8` .. attribute:: input_charset an extension to the |stdlib|_ :mod:`gettext` that specifies what charset a message is encoded in when decoding a message to :class:`unicode`. This is used for two purposes: 1) If the message string is a byte :class:`str`, this is used to decode the string to a :class:`unicode` string before looking it up in the :term:`message catalog`. 2) In :meth:`~kitchen.i18n.DummyTranslations.ugettext` and :meth:`~kitchen.i18n.DummyTranslations.ungettext` methods, if a byte :class:`str` is given as the message and is untranslated his is used as the encoding when decoding to :class:`unicode`. This is different from the :attr:`_charset` parameter that may be set when a :term:`message catalog` is loaded because :attr:`input_charset` is used to describe an encoding used in a python source file while :attr:`_charset` describes the encoding used in the :term:`message catalog` file. Any characters that aren't able to be transformed from a byte :class:`str` to :class:`unicode` string or vice versa will be replaced with a replacement character (ie: ``u'�'`` in unicode based encodings, ``'?'`` in other :term:`ASCII` compatible encodings). .. seealso:: :class:`gettext.GNUTranslations.gettext` For information about what methods this class has and what they do .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 Although we had adapted :meth:`gettext`, :meth:`ngettext`, :meth:`lgettext`, and :meth:`lngettext` to always return byte :class:`str`, we hadn't forced those byte :class:`str` to always be in a specified charset. We now make sure that :meth:`gettext` and :meth:`ngettext` return byte :class:`str` encoded using :attr:`output_charset` if set, otherwise :attr:`charset` and if neither of those, :term:`UTF-8`. With :meth:`lgettext` and :meth:`lngettext` :attr:`output_charset` if set, otherwise :func:`locale.getpreferredencoding`. cCstjj||dS(N(R tGNUTranslationst_parse(RR((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR9scCst|tsdS|}t|d|j}y|j|}WnMtk r|jry|jj|}Wqtt fk rqXqnX|j p|j p|j}|j ||S(NRR( R.R/RRt_catalogtKeyErrorRR RR%R R&R$(RR ttmsgt u_messageR!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR s    cCs|dkr|}n|}t|ts.dSt|d|j}y |j||j|f}WnStk r|jry|jj|||}Wqt t fk rqXqnX|j p|j p|j}|j ||S(NiRR(R.R/RRR:tpluralR;RR'RR%R R&R$(RR(R)R*R<tu_msgid1R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR's"       cCst|tsdS|}t|d|j}y|j|}WnMtk r|jry|jj|}Wqtt fk rqXqnX|j pt j }|j ||S(NRR(R.R/RRR:R;RR+RR%R RR,R$(RR R<R=R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR+ s     cCs|dkr|}n|}t|ts.dSt|d|j}y |j||j|f}WnStk r|jry|jj|||}Wqt t fk rqXqnX|j pt j }|j||S(NiRR(R.R/RRR:R>R;RR'RR%R RR,R$(RR(R)R*R<R?R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR-!s"        cCst|tsdSt|d|j}y|j|}WnMtk r|jry|jj|}Wqtt fk rqXqnXt|d|jS(NuR( R.R/RRR:R;RR0RR%(RR ((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR0<s   cCs|dkr|}n|}t|ts.dSt|d|j}y |j||j|f}WnStk r|jry|jj|||}Wqt t fk rqXqnXt|d|jddS(NiuRRR1( R.R/RRR:R>R;RR2RR%(RR(R)R*R<R?((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR2Ms       ( R3R4R5R9R R'R+R-R0R2(((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR7sS      c Cs>|st}ng}x?tj|tfD](}|jtj|||ddq+W|s|rjtStt d|nd}x|D]} t j j | } tj| } | st| d} ztj| || } Wd| jXntj| } |r| j|n|s)| }q|j| qW|S(sGet a translation object bound to the :term:`message catalogs` :arg domain: Name of the message domain. This should be a unique name that can be used to lookup the :term:`message catalog` for this app or library. :kwarg localedirs: Iterator of directories to look for :term:`message catalogs` under. The directories are searched in order for :term:`message catalogs`. For each of the directories searched, we check for message catalogs in any language specified in:attr:`languages`. The :term:`message catalogs` are used to create the Translation object that we return. The Translation object will attempt to lookup the msgid in the first catalog that we found. If it's not in there, it will go through each subsequent catalog looking for a match. For this reason, the order in which you specify the :attr:`localedirs` may be important. If no :term:`message catalogs` are found, either return a :class:`DummyTranslations` object or raise an :exc:`IOError` depending on the value of :attr:`fallback`. Rhe default localedir from :mod:`gettext` which is :file:`os.path.join(sys.prefix, 'share', 'locale')` on Unix is implicitly appended to the :attr:`localedirs`, making it the last directory searched. :kwarg languages: Iterator of language codes to check for :term:`message catalogs`. If unspecified, the user's locale settings will be used. .. seealso:: :func:`gettext.find` for information on what environment variables are used. :kwarg class_: The class to use to extract translations from the :term:`message catalogs`. Defaults to :class:`NewGNUTranslations`. :kwarg fallback: If set to data:`False`, raise an :exc:`IOError` if no :term:`message catalogs` are found. If :data:`True`, the default, return a :class:`DummyTranslations` object. :kwarg codeset: Set the character encoding to use when returning byte :class:`str` objects. This is equivalent to calling :meth:`~gettext.GNUTranslations.output_charset` on the Translations object that is returned from this function. :return: Translation object to get :mod:`gettext` methods from If you need more flexibility than :func:`easy_gettext_setup`, use this function. It sets up a :mod:`gettext` Translation object and returns it to you. Then you can access any of the methods of the object that you need directly. For instance, if you specifically need to access :func:`~gettext.GNUTranslations.lgettext`:: translations = get_translation_object('foo') translations.lgettext('My Message') This function is similar to the |stdlib|_ :func:`gettext.translation` but makes it better in two ways 1. It returns :class:`NewGNUTranslations` or :class:`DummyTranslations` objects by default. These are superior to the :class:`gettext.GNUTranslations` and :class:`gettext.NullTranslations` objects because they are consistent in the string type they return and they fix several issues that can causethe |stdlib|_ objects to throw :exc:`UnicodeError`. 2. This function takes multiple directories to search for :term:`message catalogs`. The latter is important when setting up :mod:`gettext` in a portable manner. There is not a common directory for translations across operating systems so one needs to look in multiple directories for the translations. :func:`get_translation_object` is able to handle that if you give it a list of directories to search for catalogs:: translations = get_translation_object('foo', localedirs=( os.path.join(os.path.realpath(os.path.dirname(__file__)), 'locale'), os.path.join(sys.prefix, 'lib', 'locale'))) This will search for several different directories: 1. A directory named :file:`locale` in the same directory as the module that called :func:`get_translation_object`, 2. In :file:`/usr/lib/locale` 3. In :file:`/usr/share/locale` (the fallback directory) This allows :mod:`gettext` to work on Windows and in development (where the :term:`message catalogs` are typically in the toplevel module directory) and also when installed under Linux (where the :term:`message catalogs` are installed in :file:`/usr/share/locale`). You (or the system packager) just need to install the :term:`message catalogs` in :file:`/usr/share/locale` and remove the :file:`locale` directory from the module to make this work. ie:: In development: ~/foo # Toplevel module directory ~/foo/__init__.py ~/foo/locale # With message catalogs below here: ~/foo/locale/es/LC_MESSAGES/foo.mo Installed on Linux: /usr/lib/python2.7/site-packages/foo /usr/lib/python2.7/site-packages/foo/__init__.py /usr/share/locale/ # With message catalogs below here: /usr/share/locale/es/LC_MESSAGES/foo.mo .. note:: This function will setup Translation objects that attempt to lookup msgids in all of the found :term:`message catalogs`. This means if you have several versions of the :term:`message catalogs` installed in different directories that the function searches, you need to make sure that :attr:`localedirs` specifies the directories so that newer :term:`message catalogs` are searched first. It also means that if a newer catalog does not contain a translation for a msgid but an older one that's in :attr:`localedirs` does, the translation from that older catalog will be returned. .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 Add more parameters to :func:`~kitchen.i18n.get_translation_object` so it can more easily be used as a replacement for :func:`gettext.translation`. Also change the way we use localedirs. We cycle through them until we find a suitable locale file rather than simply cycling through until we find a directory that exists. The new code is based heavily on the |stdlib|_ :func:`gettext.translation` function. tallis$No translation file found for domaintrbN(R7t itertoolstchaint_DEFAULT_LOCALEDIRtextendR tfindRtIOErrorRRtostpathtabspatht _translationstgettopent setdefaulttclosetcopyRt add_fallback( tdomaint localedirst languagestclass_tfallbacktcodesettmofilest localedirtstacked_translationstmofilet full_patht translationt mofile_fh((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pytget_translation_objectfs4x &   cCs8t|d|}|r(|j|jfS|j|jfS(s Setup translation functions for an application :arg domain: Name of the message domain. This should be a unique name that can be used to lookup the :term:`message catalog` for this app. :kwarg localedirs: Iterator of directories to look for :term:`message catalogs` under. The first directory to exist is used regardless of whether messages for this domain are present. If none of the directories exist, fallback on ``sys.prefix`` + :file:`/share/locale` Default: No directories to search so we just use the fallback. :kwarg use_unicode: If :data:`True` return the :mod:`gettext` functions for :class:`unicode` strings else return the functions for byte :class:`str` for the translations. Default is :data:`True`. :return: tuple of the :mod:`gettext` function and :mod:`gettext` function for plurals Setting up :mod:`gettext` can be a little tricky because of lack of documentation. This function will setup :mod:`gettext` using the `Class-based API `_ for you. For the simple case, you can use the default arguments and call it like this:: _, N_ = easy_gettext_setup() This will get you two functions, :func:`_` and :func:`N_` that you can use to mark strings in your code for translation. :func:`_` is used to mark strings that don't need to worry about plural forms no matter what the value of the variable is. :func:`N_` is used to mark strings that do need to have a different form if a variable in the string is plural. .. seealso:: :doc:`api-i18n` This module's documentation has examples of using :func:`_` and :func:`N_` :func:`get_translation_object` for information on how to use :attr:`localedirs` to get the proper :term:`message catalogs` both when in development and when installed to FHS compliant directories on Linux. .. note:: The gettext functions returned from this function should be superior to the ones returned from :mod:`gettext`. The traits that make them better are described in the :class:`DummyTranslations` and :class:`NewGNUTranslations` documentation. .. versionchanged:: kitchen-0.2.4 ; API kitchen.i18n 2.0.0 Changed :func:`~kitchen.i18n.easy_gettext_setup` to return the lgettext functions instead of gettext functions when use_unicode=False. RS(R_R0R2R+R-(RRRSt use_unicodet translations((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyteasy_gettext_setups3RbR_($R5tkitchen.versioningRt__version_info__t __version__RPterrnoRR RBRRHtsysRRDt ImportErrorRItjointprefixtkitchen.text.convertersRRtkitchen.text.miscRRKtobjectR RR8R7ttupleRtTrueR_Rbt__all__(((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pytNs2          8 PK[L&site-packages/kitchen/i18n/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010-2011 Red Hat, Inc # Copyright (c) 2009 Milos Komarcevic # Copyright (c) 2008 Tim Lauridsen # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. # # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: James Antill # Milos Komarcevic # Toshio Kuratomi # Tim Lauridsen # Luke Macken # Seth Vidal # # Portions of code taken from yum/i18n.py # Portions of code adapted from |stdlib|_ gettext.py ''' :term:`I18N` is an important piece of any modern program. Unfortunately, setting up :term:`i18n` in your program is often a confusing process. The functions provided here aim to make the programming side of that a little easier. Most projects will be able to do something like this when they startup:: # myprogram/__init__.py: import os import sys from kitchen.i18n import easy_gettext_setup _, N_ = easy_gettext_setup('myprogram', localedirs=( os.path.join(os.path.realpath(os.path.dirname(__file__)), 'locale'), os.path.join(sys.prefix, 'lib', 'locale') )) Then, in other files that have strings that need translating:: # myprogram/commands.py: from myprogram import _, N_ def print_usage(): print _(u"""available commands are: --help Display help --version Display version of this program --bake-me-a-cake as fast as you can """) def print_invitations(age): print _('Please come to my party.') print N_('I will be turning %(age)s year old', 'I will be turning %(age)s years old', age) % {'age': age} See the documentation of :func:`easy_gettext_setup` and :func:`get_translation_object` for more details. .. seealso:: :mod:`gettext` for details of how the python gettext facilities work `babel `_ The babel module for in depth information on gettext, :term:`message catalogs`, and translating your app. babel provides some nice features for :term:`i18n` on top of :mod:`gettext` ''' # Pylint disabled messages: # :E1101: NewGNUTranslations is modeled as a replacement for GNUTranslations. # That module invokes the _parse message to create some of its attributes. # Pylint doesn't see those attributes being defined since it doesn't know # when _parse() is called. We disable E1101 when accessing self._catalog # and self.plural for this reason. # :C0103: We're replicating the gettext API here so we need to use method and # parameter names that mirror gettext. # :C0111: We're replicating the gettext API here so for the gettext # translation object methods we point people at the stdlib docs from kitchen.versioning import version_tuple_to_string __version_info__ = ((2, 1, 1),) __version__ = version_tuple_to_string(__version_info__) import copy from errno import ENOENT import gettext import itertools import locale import os import sys # We use the _default_localedir definition in get_translation_object try: from gettext import _default_localedir as _DEFAULT_LOCALEDIR except ImportError: _DEFAULT_LOCALEDIR = os.path.join(sys.prefix, 'share', 'locale') from kitchen.text.converters import to_bytes, to_unicode from kitchen.text.misc import byte_string_valid_encoding # We cache parts of the translation objects just like stdlib's gettext so that # we don't reparse the message files and keep them in memory separately if the # same catalog is opened twice. _translations = {} class DummyTranslations(object, gettext.NullTranslations): '''Safer version of :class:`gettext.NullTranslations` This Translations class doesn't translate the strings and is intended to be used as a fallback when there were errors setting up a real Translations object. It's safer than :class:`gettext.NullTranslations` in its handling of byte :class:`str` vs :class:`unicode` strings. Unlike :class:`~gettext.NullTranslations`, this Translation class will never throw a :exc:`~exceptions.UnicodeError`. The code that you have around a call to :class:`DummyTranslations` might throw a :exc:`~exceptions.UnicodeError` but at least that will be in code you control and can fix. Also, unlike :class:`~gettext.NullTranslations` all of this Translation object's methods guarantee to return byte :class:`str` except for :meth:`ugettext` and :meth:`ungettext` which guarantee to return :class:`unicode` strings. When byte :class:`str` are returned, the strings will be encoded according to this algorithm: 1) If a fallback has been added, the fallback will be called first. You'll need to consult the fallback to see whether it performs any encoding changes. 2) If a byte :class:`str` was given, the same byte :class:`str` will be returned. 3) If a :class:`unicode` string was given and :meth:`set_output_charset` has been called then we encode the string using the :attr:`output_charset` 4) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` and :attr:`_charset` was set output in that charset. 5) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` we encode it using 'utf-8'. 6) If a :class:`unicode` string was given and this is :meth:`lgettext` or :meth:`lngettext` we encode using the value of :func:`locale.getpreferredencoding` For :meth:`ugettext` and :meth:`ungettext`, we go through the same set of steps with the following differences: * We transform byte :class:`str` into :class:`unicode` strings for these methods. * The encoding used to decode the byte :class:`str` is taken from :attr:`input_charset` if it's set, otherwise we decode using :term:`UTF-8`. .. attribute:: input_charset is an extension to the |stdlib|_ :mod:`gettext` that specifies what charset a message is encoded in when decoding a message to :class:`unicode`. This is used for two purposes: 1) If the message string is a byte :class:`str`, this is used to decode the string to a :class:`unicode` string before looking it up in the :term:`message catalog`. 2) In :meth:`~kitchen.i18n.DummyTranslations.ugettext` and :meth:`~kitchen.i18n.DummyTranslations.ungettext` methods, if a byte :class:`str` is given as the message and is untranslated this is used as the encoding when decoding to :class:`unicode`. This is different from :attr:`_charset` which may be set when a :term:`message catalog` is loaded because :attr:`input_charset` is used to describe an encoding used in a python source file while :attr:`_charset` describes the encoding used in the :term:`message catalog` file. Any characters that aren't able to be transformed from a byte :class:`str` to :class:`unicode` string or vice versa will be replaced with a replacement character (ie: ``u'�'`` in unicode based encodings, ``'?'`` in other :term:`ASCII` compatible encodings). .. seealso:: :class:`gettext.NullTranslations` For information about what methods are available and what they do. .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 * Although we had adapted :meth:`gettext`, :meth:`ngettext`, :meth:`lgettext`, and :meth:`lngettext` to always return byte :class:`str`, we hadn't forced those byte :class:`str` to always be in a specified charset. We now make sure that :meth:`gettext` and :meth:`ngettext` return byte :class:`str` encoded using :attr:`output_charset` if set, otherwise :attr:`charset` and if neither of those, :term:`UTF-8`. With :meth:`lgettext` and :meth:`lngettext` :attr:`output_charset` if set, otherwise :func:`locale.getpreferredencoding`. * Make setting :attr:`input_charset` and :attr:`output_charset` also set those attributes on any fallback translation objects. ''' #pylint: disable-msg=C0103,C0111 def __init__(self, fp=None): gettext.NullTranslations.__init__(self, fp) # Python 2.3 compat if not hasattr(self, '_output_charset'): self._output_charset = None # Extension for making ugettext and ungettext more sane # 'utf-8' is only a default here. Users can override. self._input_charset = 'utf-8' def _set_input_charset(self, charset): if self._fallback: try: self._fallback.input_charset = charset except AttributeError: pass self._input_charset = charset def _get_input_charset(self): return self._input_charset input_charset = property(_get_input_charset, _set_input_charset) def set_output_charset(self, charset): '''Set the output charset This serves two purposes. The normal :meth:`gettext.NullTranslations.set_output_charset` does not set the output on fallback objects. On python-2.3, :class:`gettext.NullTranslations` objects don't contain this method. ''' if self._fallback: try: self._fallback.set_output_charset(charset) except AttributeError: pass try: gettext.NullTranslations.set_output_charset(self, charset) except AttributeError: self._output_charset = charset if not hasattr(gettext.NullTranslations, 'output_charset'): def output_charset(self): '''Compatibility for python2.3 which doesn't have output_charset''' return self._output_charset def _reencode_if_necessary(self, message, output_encoding): '''Return a byte string that's valid in a specific charset. .. warning:: This method may mangle the message if the inpput encoding is not known or the message isn't represntable in the chosen output encoding. ''' valid = False msg = None try: valid = byte_string_valid_encoding(message, output_encoding) except TypeError: # input was unicode, so it needs to be encoded pass if valid: return message try: # Decode to unicode so we can re-encode to desired encoding msg = to_unicode(message, encoding=self.input_charset, nonstring='strict') except TypeError: # Not a string; return an empty byte string return '' # Make sure that we're returning a str of the desired encoding return to_bytes(msg, encoding=output_encoding) def gettext(self, message): # First use any fallback gettext objects. Since DummyTranslations # doesn't do any translation on its own, this is a good first step. if self._fallback: try: message = self._fallback.gettext(message) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or self._charset or self.input_charset) return self._reencode_if_necessary(message, output_encoding) def ngettext(self, msgid1, msgid2, n): # Default if n == 1: message = msgid1 else: message = msgid2 # The fallback method might return something different if self._fallback: try: message = self._fallback.ngettext(msgid1, msgid2, n) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or self._charset or self.input_charset) return self._reencode_if_necessary(message, output_encoding) def lgettext(self, message): if self._fallback: try: message = self._fallback.lgettext(message) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: we'll do our own encoding next # AttributeErrors happen on py2.3 where lgettext is not # implemented pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or locale.getpreferredencoding()) return self._reencode_if_necessary(message, output_encoding) def lngettext(self, msgid1, msgid2, n): # Default if n == 1: message = msgid1 else: message = msgid2 # Fallback method might have something different if self._fallback: try: message = self._fallback.lngettext(msgid1, msgid2, n) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: we'll do our own encoding next # AttributeError happens on py2.3 where lngettext is not # implemented pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or locale.getpreferredencoding()) return self._reencode_if_necessary(message, output_encoding) def ugettext(self, message): if not isinstance(message, basestring): return u'' if self._fallback: msg = to_unicode(message, encoding=self.input_charset) try: message = self._fallback.ugettext(msg) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own decoding later pass # Make sure we're returning unicode return to_unicode(message, encoding=self.input_charset) def ungettext(self, msgid1, msgid2, n): # Default if n == 1: message = msgid1 else: message = msgid2 # Fallback might override this if self._fallback: msgid1 = to_unicode(msgid1, encoding=self.input_charset) msgid2 = to_unicode(msgid2, encoding=self.input_charset) try: message = self._fallback.ungettext(msgid1, msgid2, n) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own decoding later pass # Make sure we're returning unicode return to_unicode(message, encoding=self.input_charset, nonstring='empty') class NewGNUTranslations(DummyTranslations, gettext.GNUTranslations): '''Safer version of :class:`gettext.GNUTranslations` :class:`gettext.GNUTranslations` suffers from two problems that this class fixes. 1) :class:`gettext.GNUTranslations` can throw a :exc:`~exceptions.UnicodeError` in :meth:`gettext.GNUTranslations.ugettext` if the message being translated has non-:term:`ASCII` characters and there is no translation for it. 2) :class:`gettext.GNUTranslations` can return byte :class:`str` from :meth:`gettext.GNUTranslations.ugettext` and :class:`unicode` strings from the other :meth:`~gettext.GNUTranslations.gettext` methods if the message being translated is the wrong type When byte :class:`str` are returned, the strings will be encoded according to this algorithm: 1) If a fallback has been added, the fallback will be called first. You'll need to consult the fallback to see whether it performs any encoding changes. 2) If a byte :class:`str` was given, the same byte :class:`str` will be returned. 3) If a :class:`unicode` string was given and :meth:`set_output_charset` has been called then we encode the string using the :attr:`output_charset` 4) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` and a charset was detected when parsing the :term:`message catalog`, output in that charset. 5) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` we encode it using :term:`UTF-8`. 6) If a :class:`unicode` string was given and this is :meth:`lgettext` or :meth:`lngettext` we encode using the value of :func:`locale.getpreferredencoding` For :meth:`ugettext` and :meth:`ungettext`, we go through the same set of steps with the following differences: * We transform byte :class:`str` into :class:`unicode` strings for these methods. * The encoding used to decode the byte :class:`str` is taken from :attr:`input_charset` if it's set, otherwise we decode using :term:`UTF-8` .. attribute:: input_charset an extension to the |stdlib|_ :mod:`gettext` that specifies what charset a message is encoded in when decoding a message to :class:`unicode`. This is used for two purposes: 1) If the message string is a byte :class:`str`, this is used to decode the string to a :class:`unicode` string before looking it up in the :term:`message catalog`. 2) In :meth:`~kitchen.i18n.DummyTranslations.ugettext` and :meth:`~kitchen.i18n.DummyTranslations.ungettext` methods, if a byte :class:`str` is given as the message and is untranslated his is used as the encoding when decoding to :class:`unicode`. This is different from the :attr:`_charset` parameter that may be set when a :term:`message catalog` is loaded because :attr:`input_charset` is used to describe an encoding used in a python source file while :attr:`_charset` describes the encoding used in the :term:`message catalog` file. Any characters that aren't able to be transformed from a byte :class:`str` to :class:`unicode` string or vice versa will be replaced with a replacement character (ie: ``u'�'`` in unicode based encodings, ``'?'`` in other :term:`ASCII` compatible encodings). .. seealso:: :class:`gettext.GNUTranslations.gettext` For information about what methods this class has and what they do .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 Although we had adapted :meth:`gettext`, :meth:`ngettext`, :meth:`lgettext`, and :meth:`lngettext` to always return byte :class:`str`, we hadn't forced those byte :class:`str` to always be in a specified charset. We now make sure that :meth:`gettext` and :meth:`ngettext` return byte :class:`str` encoded using :attr:`output_charset` if set, otherwise :attr:`charset` and if neither of those, :term:`UTF-8`. With :meth:`lgettext` and :meth:`lngettext` :attr:`output_charset` if set, otherwise :func:`locale.getpreferredencoding`. ''' #pylint: disable-msg=C0103,C0111 def _parse(self, fp): gettext.GNUTranslations._parse(self, fp) def gettext(self, message): if not isinstance(message, basestring): return '' tmsg = message u_message = to_unicode(message, encoding=self.input_charset) try: tmsg = self._catalog[u_message] #pylint:disable-msg=E1101 except KeyError: if self._fallback: try: tmsg = self._fallback.gettext(message) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or self._charset or self.input_charset) return self._reencode_if_necessary(tmsg, output_encoding) def ngettext(self, msgid1, msgid2, n): if n == 1: tmsg = msgid1 else: tmsg = msgid2 if not isinstance(msgid1, basestring): return '' u_msgid1 = to_unicode(msgid1, encoding=self.input_charset) try: #pylint:disable-msg=E1101 tmsg = self._catalog[(u_msgid1, self.plural(n))] except KeyError: if self._fallback: try: tmsg = self._fallback.ngettext(msgid1, msgid2, n) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or self._charset or self.input_charset) return self._reencode_if_necessary(tmsg, output_encoding) def lgettext(self, message): if not isinstance(message, basestring): return '' tmsg = message u_message = to_unicode(message, encoding=self.input_charset) try: tmsg = self._catalog[u_message] #pylint:disable-msg=E1101 except KeyError: if self._fallback: try: tmsg = self._fallback.lgettext(message) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or locale.getpreferredencoding()) return self._reencode_if_necessary(tmsg, output_encoding) def lngettext(self, msgid1, msgid2, n): if n == 1: tmsg = msgid1 else: tmsg = msgid2 if not isinstance(msgid1, basestring): return '' u_msgid1 = to_unicode(msgid1, encoding=self.input_charset) try: #pylint:disable-msg=E1101 tmsg = self._catalog[(u_msgid1, self.plural(n))] except KeyError: if self._fallback: try: tmsg = self._fallback.ngettext(msgid1, msgid2, n) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Next decide what encoding to use for the strings we return output_encoding = (self._output_charset or locale.getpreferredencoding()) return self._reencode_if_necessary(tmsg, output_encoding) def ugettext(self, message): if not isinstance(message, basestring): return u'' message = to_unicode(message, encoding=self.input_charset) try: message = self._catalog[message] #pylint:disable-msg=E1101 except KeyError: if self._fallback: try: message = self._fallback.ugettext(message) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Make sure that we're returning unicode return to_unicode(message, encoding=self.input_charset) def ungettext(self, msgid1, msgid2, n): if n == 1: tmsg = msgid1 else: tmsg = msgid2 if not isinstance(msgid1, basestring): return u'' u_msgid1 = to_unicode(msgid1, encoding=self.input_charset) try: #pylint:disable-msg=E1101 tmsg = self._catalog[(u_msgid1, self.plural(n))] except KeyError: if self._fallback: try: tmsg = self._fallback.ungettext(msgid1, msgid2, n) except (AttributeError, UnicodeError): # Ignore UnicodeErrors: We'll do our own encoding next pass # Make sure that we're returning unicode return to_unicode(tmsg, encoding=self.input_charset, nonstring='empty') def get_translation_object(domain, localedirs=tuple(), languages=None, class_=None, fallback=True, codeset=None): '''Get a translation object bound to the :term:`message catalogs` :arg domain: Name of the message domain. This should be a unique name that can be used to lookup the :term:`message catalog` for this app or library. :kwarg localedirs: Iterator of directories to look for :term:`message catalogs` under. The directories are searched in order for :term:`message catalogs`. For each of the directories searched, we check for message catalogs in any language specified in:attr:`languages`. The :term:`message catalogs` are used to create the Translation object that we return. The Translation object will attempt to lookup the msgid in the first catalog that we found. If it's not in there, it will go through each subsequent catalog looking for a match. For this reason, the order in which you specify the :attr:`localedirs` may be important. If no :term:`message catalogs` are found, either return a :class:`DummyTranslations` object or raise an :exc:`IOError` depending on the value of :attr:`fallback`. Rhe default localedir from :mod:`gettext` which is :file:`os.path.join(sys.prefix, 'share', 'locale')` on Unix is implicitly appended to the :attr:`localedirs`, making it the last directory searched. :kwarg languages: Iterator of language codes to check for :term:`message catalogs`. If unspecified, the user's locale settings will be used. .. seealso:: :func:`gettext.find` for information on what environment variables are used. :kwarg class_: The class to use to extract translations from the :term:`message catalogs`. Defaults to :class:`NewGNUTranslations`. :kwarg fallback: If set to data:`False`, raise an :exc:`IOError` if no :term:`message catalogs` are found. If :data:`True`, the default, return a :class:`DummyTranslations` object. :kwarg codeset: Set the character encoding to use when returning byte :class:`str` objects. This is equivalent to calling :meth:`~gettext.GNUTranslations.output_charset` on the Translations object that is returned from this function. :return: Translation object to get :mod:`gettext` methods from If you need more flexibility than :func:`easy_gettext_setup`, use this function. It sets up a :mod:`gettext` Translation object and returns it to you. Then you can access any of the methods of the object that you need directly. For instance, if you specifically need to access :func:`~gettext.GNUTranslations.lgettext`:: translations = get_translation_object('foo') translations.lgettext('My Message') This function is similar to the |stdlib|_ :func:`gettext.translation` but makes it better in two ways 1. It returns :class:`NewGNUTranslations` or :class:`DummyTranslations` objects by default. These are superior to the :class:`gettext.GNUTranslations` and :class:`gettext.NullTranslations` objects because they are consistent in the string type they return and they fix several issues that can causethe |stdlib|_ objects to throw :exc:`UnicodeError`. 2. This function takes multiple directories to search for :term:`message catalogs`. The latter is important when setting up :mod:`gettext` in a portable manner. There is not a common directory for translations across operating systems so one needs to look in multiple directories for the translations. :func:`get_translation_object` is able to handle that if you give it a list of directories to search for catalogs:: translations = get_translation_object('foo', localedirs=( os.path.join(os.path.realpath(os.path.dirname(__file__)), 'locale'), os.path.join(sys.prefix, 'lib', 'locale'))) This will search for several different directories: 1. A directory named :file:`locale` in the same directory as the module that called :func:`get_translation_object`, 2. In :file:`/usr/lib/locale` 3. In :file:`/usr/share/locale` (the fallback directory) This allows :mod:`gettext` to work on Windows and in development (where the :term:`message catalogs` are typically in the toplevel module directory) and also when installed under Linux (where the :term:`message catalogs` are installed in :file:`/usr/share/locale`). You (or the system packager) just need to install the :term:`message catalogs` in :file:`/usr/share/locale` and remove the :file:`locale` directory from the module to make this work. ie:: In development: ~/foo # Toplevel module directory ~/foo/__init__.py ~/foo/locale # With message catalogs below here: ~/foo/locale/es/LC_MESSAGES/foo.mo Installed on Linux: /usr/lib/python2.7/site-packages/foo /usr/lib/python2.7/site-packages/foo/__init__.py /usr/share/locale/ # With message catalogs below here: /usr/share/locale/es/LC_MESSAGES/foo.mo .. note:: This function will setup Translation objects that attempt to lookup msgids in all of the found :term:`message catalogs`. This means if you have several versions of the :term:`message catalogs` installed in different directories that the function searches, you need to make sure that :attr:`localedirs` specifies the directories so that newer :term:`message catalogs` are searched first. It also means that if a newer catalog does not contain a translation for a msgid but an older one that's in :attr:`localedirs` does, the translation from that older catalog will be returned. .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 Add more parameters to :func:`~kitchen.i18n.get_translation_object` so it can more easily be used as a replacement for :func:`gettext.translation`. Also change the way we use localedirs. We cycle through them until we find a suitable locale file rather than simply cycling through until we find a directory that exists. The new code is based heavily on the |stdlib|_ :func:`gettext.translation` function. ''' if not class_: class_ = NewGNUTranslations mofiles = [] for localedir in itertools.chain(localedirs, (_DEFAULT_LOCALEDIR,)): mofiles.extend(gettext.find(domain, localedir, languages, all=1)) if not mofiles: if fallback: return DummyTranslations() raise IOError(ENOENT, 'No translation file found for domain', domain) # Accumulate a translation with fallbacks to all the other mofiles stacked_translations = None for mofile in mofiles: full_path = os.path.abspath(mofile) translation = _translations.get(full_path) if not translation: mofile_fh = open(full_path, 'rb') try: translation = _translations.setdefault(full_path, class_(mofile_fh)) finally: mofile_fh.close() # Shallow copy the object so that the fallbacks and output charset can # differ but the data we read from the mofile is shared. translation = copy.copy(translation) if codeset: translation.set_output_charset(codeset) if not stacked_translations: stacked_translations = translation else: stacked_translations.add_fallback(translation) return stacked_translations def easy_gettext_setup(domain, localedirs=tuple(), use_unicode=True): ''' Setup translation functions for an application :arg domain: Name of the message domain. This should be a unique name that can be used to lookup the :term:`message catalog` for this app. :kwarg localedirs: Iterator of directories to look for :term:`message catalogs` under. The first directory to exist is used regardless of whether messages for this domain are present. If none of the directories exist, fallback on ``sys.prefix`` + :file:`/share/locale` Default: No directories to search so we just use the fallback. :kwarg use_unicode: If :data:`True` return the :mod:`gettext` functions for :class:`unicode` strings else return the functions for byte :class:`str` for the translations. Default is :data:`True`. :return: tuple of the :mod:`gettext` function and :mod:`gettext` function for plurals Setting up :mod:`gettext` can be a little tricky because of lack of documentation. This function will setup :mod:`gettext` using the `Class-based API `_ for you. For the simple case, you can use the default arguments and call it like this:: _, N_ = easy_gettext_setup() This will get you two functions, :func:`_` and :func:`N_` that you can use to mark strings in your code for translation. :func:`_` is used to mark strings that don't need to worry about plural forms no matter what the value of the variable is. :func:`N_` is used to mark strings that do need to have a different form if a variable in the string is plural. .. seealso:: :doc:`api-i18n` This module's documentation has examples of using :func:`_` and :func:`N_` :func:`get_translation_object` for information on how to use :attr:`localedirs` to get the proper :term:`message catalogs` both when in development and when installed to FHS compliant directories on Linux. .. note:: The gettext functions returned from this function should be superior to the ones returned from :mod:`gettext`. The traits that make them better are described in the :class:`DummyTranslations` and :class:`NewGNUTranslations` documentation. .. versionchanged:: kitchen-0.2.4 ; API kitchen.i18n 2.0.0 Changed :func:`~kitchen.i18n.easy_gettext_setup` to return the lgettext functions instead of gettext functions when use_unicode=False. ''' translations = get_translation_object(domain, localedirs=localedirs) if use_unicode: return(translations.ugettext, translations.ungettext) return(translations.lgettext, translations.lngettext) __all__ = ('DummyTranslations', 'NewGNUTranslations', 'easy_gettext_setup', 'get_translation_object') PK[{o6KtKt'site-packages/kitchen/i18n/__init__.pyonu[ i:Oc@svdZddlmZdddffZeeZddlZddlmZddlZddl Z ddl Z ddl Z ddl Z yddlm ZWn,ek re jje jdd ZnXdd lmZmZdd lmZiZd eejfd YZdeejfdYZeeee edZ!ee dZ"d dddfZ#dS(s :term:`I18N` is an important piece of any modern program. Unfortunately, setting up :term:`i18n` in your program is often a confusing process. The functions provided here aim to make the programming side of that a little easier. Most projects will be able to do something like this when they startup:: # myprogram/__init__.py: import os import sys from kitchen.i18n import easy_gettext_setup _, N_ = easy_gettext_setup('myprogram', localedirs=( os.path.join(os.path.realpath(os.path.dirname(__file__)), 'locale'), os.path.join(sys.prefix, 'lib', 'locale') )) Then, in other files that have strings that need translating:: # myprogram/commands.py: from myprogram import _, N_ def print_usage(): print _(u"""available commands are: --help Display help --version Display version of this program --bake-me-a-cake as fast as you can """) def print_invitations(age): print _('Please come to my party.') print N_('I will be turning %(age)s year old', 'I will be turning %(age)s years old', age) % {'age': age} See the documentation of :func:`easy_gettext_setup` and :func:`get_translation_object` for more details. .. seealso:: :mod:`gettext` for details of how the python gettext facilities work `babel `_ The babel module for in depth information on gettext, :term:`message catalogs`, and translating your app. babel provides some nice features for :term:`i18n` on top of :mod:`gettext` i(tversion_tuple_to_stringiiN(tENOENT(t_default_localedirtsharetlocale(tto_bytest to_unicode(tbyte_string_valid_encodingtDummyTranslationscBseZdZddZdZdZeeeZdZ e e j ds`dZ ndZdZ d Zd Zd Zd Zd ZRS(sSafer version of :class:`gettext.NullTranslations` This Translations class doesn't translate the strings and is intended to be used as a fallback when there were errors setting up a real Translations object. It's safer than :class:`gettext.NullTranslations` in its handling of byte :class:`str` vs :class:`unicode` strings. Unlike :class:`~gettext.NullTranslations`, this Translation class will never throw a :exc:`~exceptions.UnicodeError`. The code that you have around a call to :class:`DummyTranslations` might throw a :exc:`~exceptions.UnicodeError` but at least that will be in code you control and can fix. Also, unlike :class:`~gettext.NullTranslations` all of this Translation object's methods guarantee to return byte :class:`str` except for :meth:`ugettext` and :meth:`ungettext` which guarantee to return :class:`unicode` strings. When byte :class:`str` are returned, the strings will be encoded according to this algorithm: 1) If a fallback has been added, the fallback will be called first. You'll need to consult the fallback to see whether it performs any encoding changes. 2) If a byte :class:`str` was given, the same byte :class:`str` will be returned. 3) If a :class:`unicode` string was given and :meth:`set_output_charset` has been called then we encode the string using the :attr:`output_charset` 4) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` and :attr:`_charset` was set output in that charset. 5) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` we encode it using 'utf-8'. 6) If a :class:`unicode` string was given and this is :meth:`lgettext` or :meth:`lngettext` we encode using the value of :func:`locale.getpreferredencoding` For :meth:`ugettext` and :meth:`ungettext`, we go through the same set of steps with the following differences: * We transform byte :class:`str` into :class:`unicode` strings for these methods. * The encoding used to decode the byte :class:`str` is taken from :attr:`input_charset` if it's set, otherwise we decode using :term:`UTF-8`. .. attribute:: input_charset is an extension to the |stdlib|_ :mod:`gettext` that specifies what charset a message is encoded in when decoding a message to :class:`unicode`. This is used for two purposes: 1) If the message string is a byte :class:`str`, this is used to decode the string to a :class:`unicode` string before looking it up in the :term:`message catalog`. 2) In :meth:`~kitchen.i18n.DummyTranslations.ugettext` and :meth:`~kitchen.i18n.DummyTranslations.ungettext` methods, if a byte :class:`str` is given as the message and is untranslated this is used as the encoding when decoding to :class:`unicode`. This is different from :attr:`_charset` which may be set when a :term:`message catalog` is loaded because :attr:`input_charset` is used to describe an encoding used in a python source file while :attr:`_charset` describes the encoding used in the :term:`message catalog` file. Any characters that aren't able to be transformed from a byte :class:`str` to :class:`unicode` string or vice versa will be replaced with a replacement character (ie: ``u'�'`` in unicode based encodings, ``'?'`` in other :term:`ASCII` compatible encodings). .. seealso:: :class:`gettext.NullTranslations` For information about what methods are available and what they do. .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 * Although we had adapted :meth:`gettext`, :meth:`ngettext`, :meth:`lgettext`, and :meth:`lngettext` to always return byte :class:`str`, we hadn't forced those byte :class:`str` to always be in a specified charset. We now make sure that :meth:`gettext` and :meth:`ngettext` return byte :class:`str` encoded using :attr:`output_charset` if set, otherwise :attr:`charset` and if neither of those, :term:`UTF-8`. With :meth:`lgettext` and :meth:`lngettext` :attr:`output_charset` if set, otherwise :func:`locale.getpreferredencoding`. * Make setting :attr:`input_charset` and :attr:`output_charset` also set those attributes on any fallback translation objects. cCs;tjj||t|ds.d|_nd|_dS(Nt_output_charsetsutf-8(tgettexttNullTranslationst__init__thasattrtNoneR t_input_charset(tselftfp((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR s cCs=|jr0y||j_Wq0tk r,q0Xn||_dS(N(t _fallbackt input_charsettAttributeErrorR(Rtcharset((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyt_set_input_charsets   cCs|jS(N(R(R((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyt_get_input_charsetscCsl|jr4y|jj|Wq4tk r0q4Xnytjj||Wntk rg||_nXdS(sSet the output charset This serves two purposes. The normal :meth:`gettext.NullTranslations.set_output_charset` does not set the output on fallback objects. On python-2.3, :class:`gettext.NullTranslations` objects don't contain this method. N(Rtset_output_charsetRR R R (RR((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyRs   toutput_charsetcCs|jS(s=Compatibility for python2.3 which doesn't have output_charset(R (R((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyRscCst}d}yt||}Wntk r2nX|r=|Syt|d|jdd}Wntk rpdSXt|d|S(sReturn a byte string that's valid in a specific charset. .. warning:: This method may mangle the message if the inpput encoding is not known or the message isn't represntable in the chosen output encoding. tencodingt nonstringtstricttN(tFalseRRt TypeErrorRRR(Rtmessagetoutput_encodingtvalidtmsg((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyt_reencode_if_necessarys   cCsg|jr<y|jj|}Wq<ttfk r8q<Xn|jpT|jpT|j}|j||S(N(RR Rt UnicodeErrorR t_charsetRR$(RR R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR s  cCs|dkr|}n|}|jr]y|jj|||}Wq]ttfk rYq]Xn|jpu|jpu|j}|j||S(Ni(RtngettextRR%R R&RR$(Rtmsgid1tmsgid2tnR R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR''s    cCsa|jr<y|jj|}Wq<ttfk r8q<Xn|jpNtj}|j||S(N(RtlgettextRR%R RtgetpreferredencodingR$(RR R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR+<s   cCs|dkr|}n|}|jr]y|jj|||}Wq]ttfk rYq]Xn|jpotj}|j||S(Ni(Rt lngettextRR%R RR,R$(RR(R)R*R R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR-Ls     cCswt|tsdS|jrdt|d|j}y|jj|}Wqdttfk r`qdXnt|d|jS(NuR(t isinstancet basestringRRRtugettextRR%(RR R#((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR0bs cCs|dkr|}n|}|jrt|d|j}t|d|j}y|jj|||}Wqttfk rqXnt|d|jddS(NiRRtempty(RRRt ungettextRR%(RR(R)R*R ((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR2ps   N(t__name__t __module__t__doc__RR RRtpropertyRRR R R RR$R'R+R-R0R2(((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyRusU          tNewGNUTranslationscBsMeZdZdZdZdZdZdZdZdZ RS(shSafer version of :class:`gettext.GNUTranslations` :class:`gettext.GNUTranslations` suffers from two problems that this class fixes. 1) :class:`gettext.GNUTranslations` can throw a :exc:`~exceptions.UnicodeError` in :meth:`gettext.GNUTranslations.ugettext` if the message being translated has non-:term:`ASCII` characters and there is no translation for it. 2) :class:`gettext.GNUTranslations` can return byte :class:`str` from :meth:`gettext.GNUTranslations.ugettext` and :class:`unicode` strings from the other :meth:`~gettext.GNUTranslations.gettext` methods if the message being translated is the wrong type When byte :class:`str` are returned, the strings will be encoded according to this algorithm: 1) If a fallback has been added, the fallback will be called first. You'll need to consult the fallback to see whether it performs any encoding changes. 2) If a byte :class:`str` was given, the same byte :class:`str` will be returned. 3) If a :class:`unicode` string was given and :meth:`set_output_charset` has been called then we encode the string using the :attr:`output_charset` 4) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` and a charset was detected when parsing the :term:`message catalog`, output in that charset. 5) If a :class:`unicode` string was given and this is :meth:`gettext` or :meth:`ngettext` we encode it using :term:`UTF-8`. 6) If a :class:`unicode` string was given and this is :meth:`lgettext` or :meth:`lngettext` we encode using the value of :func:`locale.getpreferredencoding` For :meth:`ugettext` and :meth:`ungettext`, we go through the same set of steps with the following differences: * We transform byte :class:`str` into :class:`unicode` strings for these methods. * The encoding used to decode the byte :class:`str` is taken from :attr:`input_charset` if it's set, otherwise we decode using :term:`UTF-8` .. attribute:: input_charset an extension to the |stdlib|_ :mod:`gettext` that specifies what charset a message is encoded in when decoding a message to :class:`unicode`. This is used for two purposes: 1) If the message string is a byte :class:`str`, this is used to decode the string to a :class:`unicode` string before looking it up in the :term:`message catalog`. 2) In :meth:`~kitchen.i18n.DummyTranslations.ugettext` and :meth:`~kitchen.i18n.DummyTranslations.ungettext` methods, if a byte :class:`str` is given as the message and is untranslated his is used as the encoding when decoding to :class:`unicode`. This is different from the :attr:`_charset` parameter that may be set when a :term:`message catalog` is loaded because :attr:`input_charset` is used to describe an encoding used in a python source file while :attr:`_charset` describes the encoding used in the :term:`message catalog` file. Any characters that aren't able to be transformed from a byte :class:`str` to :class:`unicode` string or vice versa will be replaced with a replacement character (ie: ``u'�'`` in unicode based encodings, ``'?'`` in other :term:`ASCII` compatible encodings). .. seealso:: :class:`gettext.GNUTranslations.gettext` For information about what methods this class has and what they do .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 Although we had adapted :meth:`gettext`, :meth:`ngettext`, :meth:`lgettext`, and :meth:`lngettext` to always return byte :class:`str`, we hadn't forced those byte :class:`str` to always be in a specified charset. We now make sure that :meth:`gettext` and :meth:`ngettext` return byte :class:`str` encoded using :attr:`output_charset` if set, otherwise :attr:`charset` and if neither of those, :term:`UTF-8`. With :meth:`lgettext` and :meth:`lngettext` :attr:`output_charset` if set, otherwise :func:`locale.getpreferredencoding`. cCstjj||dS(N(R tGNUTranslationst_parse(RR((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR9scCst|tsdS|}t|d|j}y|j|}WnMtk r|jry|jj|}Wqtt fk rqXqnX|j p|j p|j}|j ||S(NRR( R.R/RRt_catalogtKeyErrorRR RR%R R&R$(RR ttmsgt u_messageR!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR s    cCs|dkr|}n|}t|ts.dSt|d|j}y |j||j|f}WnStk r|jry|jj|||}Wqt t fk rqXqnX|j p|j p|j}|j ||S(NiRR(R.R/RRR:tpluralR;RR'RR%R R&R$(RR(R)R*R<tu_msgid1R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR's"       cCst|tsdS|}t|d|j}y|j|}WnMtk r|jry|jj|}Wqtt fk rqXqnX|j pt j }|j ||S(NRR(R.R/RRR:R;RR+RR%R RR,R$(RR R<R=R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR+ s     cCs|dkr|}n|}t|ts.dSt|d|j}y |j||j|f}WnStk r|jry|jj|||}Wqt t fk rqXqnX|j pt j }|j||S(NiRR(R.R/RRR:R>R;RR'RR%R RR,R$(RR(R)R*R<R?R!((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR-!s"        cCst|tsdSt|d|j}y|j|}WnMtk r|jry|jj|}Wqtt fk rqXqnXt|d|jS(NuR( R.R/RRR:R;RR0RR%(RR ((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR0<s   cCs|dkr|}n|}t|ts.dSt|d|j}y |j||j|f}WnStk r|jry|jj|||}Wqt t fk rqXqnXt|d|jddS(NiuRRR1( R.R/RRR:R>R;RR2RR%(RR(R)R*R<R?((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR2Ms       ( R3R4R5R9R R'R+R-R0R2(((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyR7sS      c Cs>|st}ng}x?tj|tfD](}|jtj|||ddq+W|s|rjtStt d|nd}x|D]} t j j | } tj| } | st| d} ztj| || } Wd| jXntj| } |r| j|n|s)| }q|j| qW|S(sGet a translation object bound to the :term:`message catalogs` :arg domain: Name of the message domain. This should be a unique name that can be used to lookup the :term:`message catalog` for this app or library. :kwarg localedirs: Iterator of directories to look for :term:`message catalogs` under. The directories are searched in order for :term:`message catalogs`. For each of the directories searched, we check for message catalogs in any language specified in:attr:`languages`. The :term:`message catalogs` are used to create the Translation object that we return. The Translation object will attempt to lookup the msgid in the first catalog that we found. If it's not in there, it will go through each subsequent catalog looking for a match. For this reason, the order in which you specify the :attr:`localedirs` may be important. If no :term:`message catalogs` are found, either return a :class:`DummyTranslations` object or raise an :exc:`IOError` depending on the value of :attr:`fallback`. Rhe default localedir from :mod:`gettext` which is :file:`os.path.join(sys.prefix, 'share', 'locale')` on Unix is implicitly appended to the :attr:`localedirs`, making it the last directory searched. :kwarg languages: Iterator of language codes to check for :term:`message catalogs`. If unspecified, the user's locale settings will be used. .. seealso:: :func:`gettext.find` for information on what environment variables are used. :kwarg class_: The class to use to extract translations from the :term:`message catalogs`. Defaults to :class:`NewGNUTranslations`. :kwarg fallback: If set to data:`False`, raise an :exc:`IOError` if no :term:`message catalogs` are found. If :data:`True`, the default, return a :class:`DummyTranslations` object. :kwarg codeset: Set the character encoding to use when returning byte :class:`str` objects. This is equivalent to calling :meth:`~gettext.GNUTranslations.output_charset` on the Translations object that is returned from this function. :return: Translation object to get :mod:`gettext` methods from If you need more flexibility than :func:`easy_gettext_setup`, use this function. It sets up a :mod:`gettext` Translation object and returns it to you. Then you can access any of the methods of the object that you need directly. For instance, if you specifically need to access :func:`~gettext.GNUTranslations.lgettext`:: translations = get_translation_object('foo') translations.lgettext('My Message') This function is similar to the |stdlib|_ :func:`gettext.translation` but makes it better in two ways 1. It returns :class:`NewGNUTranslations` or :class:`DummyTranslations` objects by default. These are superior to the :class:`gettext.GNUTranslations` and :class:`gettext.NullTranslations` objects because they are consistent in the string type they return and they fix several issues that can causethe |stdlib|_ objects to throw :exc:`UnicodeError`. 2. This function takes multiple directories to search for :term:`message catalogs`. The latter is important when setting up :mod:`gettext` in a portable manner. There is not a common directory for translations across operating systems so one needs to look in multiple directories for the translations. :func:`get_translation_object` is able to handle that if you give it a list of directories to search for catalogs:: translations = get_translation_object('foo', localedirs=( os.path.join(os.path.realpath(os.path.dirname(__file__)), 'locale'), os.path.join(sys.prefix, 'lib', 'locale'))) This will search for several different directories: 1. A directory named :file:`locale` in the same directory as the module that called :func:`get_translation_object`, 2. In :file:`/usr/lib/locale` 3. In :file:`/usr/share/locale` (the fallback directory) This allows :mod:`gettext` to work on Windows and in development (where the :term:`message catalogs` are typically in the toplevel module directory) and also when installed under Linux (where the :term:`message catalogs` are installed in :file:`/usr/share/locale`). You (or the system packager) just need to install the :term:`message catalogs` in :file:`/usr/share/locale` and remove the :file:`locale` directory from the module to make this work. ie:: In development: ~/foo # Toplevel module directory ~/foo/__init__.py ~/foo/locale # With message catalogs below here: ~/foo/locale/es/LC_MESSAGES/foo.mo Installed on Linux: /usr/lib/python2.7/site-packages/foo /usr/lib/python2.7/site-packages/foo/__init__.py /usr/share/locale/ # With message catalogs below here: /usr/share/locale/es/LC_MESSAGES/foo.mo .. note:: This function will setup Translation objects that attempt to lookup msgids in all of the found :term:`message catalogs`. This means if you have several versions of the :term:`message catalogs` installed in different directories that the function searches, you need to make sure that :attr:`localedirs` specifies the directories so that newer :term:`message catalogs` are searched first. It also means that if a newer catalog does not contain a translation for a msgid but an older one that's in :attr:`localedirs` does, the translation from that older catalog will be returned. .. versionchanged:: kitchen-1.1.0 ; API kitchen.i18n 2.1.0 Add more parameters to :func:`~kitchen.i18n.get_translation_object` so it can more easily be used as a replacement for :func:`gettext.translation`. Also change the way we use localedirs. We cycle through them until we find a suitable locale file rather than simply cycling through until we find a directory that exists. The new code is based heavily on the |stdlib|_ :func:`gettext.translation` function. tallis$No translation file found for domaintrbN(R7t itertoolstchaint_DEFAULT_LOCALEDIRtextendR tfindRtIOErrorRRtostpathtabspatht _translationstgettopent setdefaulttclosetcopyRt add_fallback( tdomaint localedirst languagestclass_tfallbacktcodesettmofilest localedirtstacked_translationstmofilet full_patht translationt mofile_fh((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pytget_translation_objectfs4x &   cCs8t|d|}|r(|j|jfS|j|jfS(s Setup translation functions for an application :arg domain: Name of the message domain. This should be a unique name that can be used to lookup the :term:`message catalog` for this app. :kwarg localedirs: Iterator of directories to look for :term:`message catalogs` under. The first directory to exist is used regardless of whether messages for this domain are present. If none of the directories exist, fallback on ``sys.prefix`` + :file:`/share/locale` Default: No directories to search so we just use the fallback. :kwarg use_unicode: If :data:`True` return the :mod:`gettext` functions for :class:`unicode` strings else return the functions for byte :class:`str` for the translations. Default is :data:`True`. :return: tuple of the :mod:`gettext` function and :mod:`gettext` function for plurals Setting up :mod:`gettext` can be a little tricky because of lack of documentation. This function will setup :mod:`gettext` using the `Class-based API `_ for you. For the simple case, you can use the default arguments and call it like this:: _, N_ = easy_gettext_setup() This will get you two functions, :func:`_` and :func:`N_` that you can use to mark strings in your code for translation. :func:`_` is used to mark strings that don't need to worry about plural forms no matter what the value of the variable is. :func:`N_` is used to mark strings that do need to have a different form if a variable in the string is plural. .. seealso:: :doc:`api-i18n` This module's documentation has examples of using :func:`_` and :func:`N_` :func:`get_translation_object` for information on how to use :attr:`localedirs` to get the proper :term:`message catalogs` both when in development and when installed to FHS compliant directories on Linux. .. note:: The gettext functions returned from this function should be superior to the ones returned from :mod:`gettext`. The traits that make them better are described in the :class:`DummyTranslations` and :class:`NewGNUTranslations` documentation. .. versionchanged:: kitchen-0.2.4 ; API kitchen.i18n 2.0.0 Changed :func:`~kitchen.i18n.easy_gettext_setup` to return the lgettext functions instead of gettext functions when use_unicode=False. RS(R_R0R2R+R-(RRRSt use_unicodet translations((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pyteasy_gettext_setups3RbR_($R5tkitchen.versioningRt__version_info__t __version__RPterrnoRR RBRRHtsysRRDt ImportErrorRItjointprefixtkitchen.text.convertersRRtkitchen.text.miscRRKtobjectR RR8R7ttupleRtTrueR_Rbt__all__(((s9/usr/lib/python2.7/site-packages/kitchen/i18n/__init__.pytNs2          8 PK[  -site-packages/kitchen/pycompat25/__init__.pycnu[ i:Oc@s2dZddlmZdZeeZd ZdS( sj The :mod:`kitchen.pycompat25` module contains implementations of functionality introduced in python-2.5. i(tversion_tuple_to_stringiit collectionsN(iii((iii(R(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/pycompat25/__init__.pyts PK[#OR,site-packages/kitchen/pycompat25/__init__.pynu[''' The :mod:`kitchen.pycompat25` module contains implementations of functionality introduced in python-2.5. ''' from kitchen.versioning import version_tuple_to_string __version_info__ = ((1, 0, 0),) __version__ = version_tuple_to_string(__version_info__) __all__ = ('collections',) PK[  -site-packages/kitchen/pycompat25/__init__.pyonu[ i:Oc@s2dZddlmZdZeeZd ZdS( sj The :mod:`kitchen.pycompat25` module contains implementations of functionality introduced in python-2.5. i(tversion_tuple_to_stringiit collectionsN(iii((iii(R(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/pycompat25/__init__.pyts PK[ =site-packages/kitchen/pycompat25/collections/_defaultdict.pycnu[ i:Oc@sBdZddlZddlmZdefdYZdZdS(s ----------- defaultdict ----------- This is a pure python implementation of defaultdict that is compatible with the defaultdict class provided by python-2.5 and above. .. seealso:: :class:`collections.defaultdict` for documentation on this module iN(tb_t defaultdictcBsSeZddZdZdZdZdZdZdZ dZ RS( cOsQ|dk r1t|d r1ttdntj|||||_dS(Nt__call__sFirst argument must be callable(tNonethasattrt TypeErrorRtdictt__init__tdefault_factory(tselfRtargstkwargs((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyRZs  cCs6ytj||SWntk r1|j|SXdS(N(Rt __getitem__tKeyErrort __missing__(R tkey((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyR as cCs6|jdkrt|n|j||<}|S(N(RRR (R Rtvalue((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyRgscCsF|jdkrt}n |jf}t||dd|jfS(N(RRttuplettypet iteritems(R R ((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyt __reduce__ms  cCs |jS(N(t__copy__(R ((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pytcopytscCst||j|S(N(RR(R ((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyRwscCs1ddl}t||j|j|jS(Ni(RRRtdeepcopytitems(R tmemoR((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyt __deepcopy__zs cCskt|jtjrE|jjdk rEt|jjtrEd}nt |j}d|t j |fS(Ns-Hs 0PK[v}}9site-packages/kitchen/pycompat25/collections/__init__.pycnu[ i:Oc@sByddlmZWn!ek r7ddlmZnXdZdS(i(t defaultdictRN(s defaultdict(t collectionsRt ImportErrort+kitchen.pycompat25.collections._defaultdictt__all__(((sK/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/__init__.pyts PK[#\<site-packages/kitchen/pycompat25/collections/_defaultdict.pynu[## # Transcribed from http://code.activestate.com/recipes/523034/ on May 1, 2009 # by Jef Spaleta This code provides an emulation for the defaultdict # functionality introduced in python 2.5's collection module # # Changes from the original: # * Change the return value from __reduce__ to use iteritems() to prevent # a segfault when pickling. (Jef Spaleta) # * Change how we setup the module to use collections.defaultdict by default # (Toshio Kuratomi) # # Copyright (c) 2007 Justin Kirtland # # PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2 # -------------------------------------------- # # 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), # and the Individual or Organization ("Licensee") accessing and otherwise # using this software ("Python") in source or binary form and its # associated documentation. # # 2. Subject to the terms and conditions of this License Agreement, PSF hereby # grants Licensee a nonexclusive, royalty-free, world-wide license to # reproduce, analyze, test, perform and/or display publicly, prepare # derivative works, distribute, and otherwise use Python alone or in any # derivative version, provided, however, that PSF's License Agreement and # PSF's notice of copyright, i.e., "Copyright (c) 2001, 2002, 2003, 2004, # 2005, 2006 Python Software Foundation; All Rights Reserved" are retained # in Python alone or in any derivative version prepared by Licensee. # # 3. In the event Licensee prepares a derivative work that is based on or # incorporates Python or any part thereof, and wants to make the derivative # work available to others as provided herein, then Licensee hereby agrees # to include in any such work a brief summary of the changes made to # Python. # # 4. PSF is making Python available to Licensee on an "AS IS" basis. PSF # MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF # EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY # REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY # PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT INFRINGE ANY THIRD # PARTY RIGHTS. # # 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON FOR ANY # INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF # MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON, OR ANY DERIVATIVE # THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. # # 6. This License Agreement will automatically terminate upon a material # breach of its terms and conditions. # # 7. Nothing in this License Agreement shall be deemed to create any # relationship of agency, partnership, or joint venture between PSF and # Licensee. This License Agreement does not grant permission to use PSF # trademarks or trade name in a trademark sense to endorse or promote # products or services of Licensee, or any third party. # # 8. By copying, installing or otherwise using Python, Licensee agrees to be # bound by the terms and conditions of this License Agreement. ''' ----------- defaultdict ----------- This is a pure python implementation of defaultdict that is compatible with the defaultdict class provided by python-2.5 and above. .. seealso:: :class:`collections.defaultdict` for documentation on this module ''' # Pylint disabled messages # # :C0103: We're defnining a compatible class name therefore we need to match # the format of that name. import types from kitchen import b_ # :C0103, W0613: We're implementing the python-2.5 defaultdict API so # we have to use the same names as python. # :C0111: We point people at the stdlib API docs for defaultdict rather than # reproduce it here. #pylint:disable-msg=C0103,W0613,C0111 class defaultdict(dict): def __init__(self, default_factory=None, *args, **kwargs): if (default_factory is not None and not hasattr(default_factory, '__call__')): raise TypeError(b_('First argument must be callable')) dict.__init__(self, *args, **kwargs) self.default_factory = default_factory def __getitem__(self, key): try: return dict.__getitem__(self, key) except KeyError: return self.__missing__(key) def __missing__(self, key): if self.default_factory is None: raise KeyError(key) self[key] = value = self.default_factory() return value def __reduce__(self): if self.default_factory is None: args = tuple() else: args = self.default_factory, return type(self), args, None, None, self.iteritems() def copy(self): return self.__copy__() def __copy__(self): return type(self)(self.default_factory, self) def __deepcopy__(self, memo): import copy return type(self)(self.default_factory, copy.deepcopy(self.items())) def __repr__(self): # Note: Have to use "is not None" otherwise we get an infinite # recursion if isinstance(self.default_factory, types.MethodType) \ and self.default_factory.im_self is not None \ and issubclass(self.default_factory.im_class, defaultdict): defrepr = 's PK[ =site-packages/kitchen/pycompat25/collections/_defaultdict.pyonu[ i:Oc@sBdZddlZddlmZdefdYZdZdS(s ----------- defaultdict ----------- This is a pure python implementation of defaultdict that is compatible with the defaultdict class provided by python-2.5 and above. .. seealso:: :class:`collections.defaultdict` for documentation on this module iN(tb_t defaultdictcBsSeZddZdZdZdZdZdZdZ dZ RS( cOsQ|dk r1t|d r1ttdntj|||||_dS(Nt__call__sFirst argument must be callable(tNonethasattrt TypeErrorRtdictt__init__tdefault_factory(tselfRtargstkwargs((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyRZs  cCs6ytj||SWntk r1|j|SXdS(N(Rt __getitem__tKeyErrort __missing__(R tkey((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyR as cCs6|jdkrt|n|j||<}|S(N(RRR (R Rtvalue((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyRgscCsF|jdkrt}n |jf}t||dd|jfS(N(RRttuplettypet iteritems(R R ((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyt __reduce__ms  cCs |jS(N(t__copy__(R ((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pytcopytscCst||j|S(N(RR(R ((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyRwscCs1ddl}t||j|j|jS(Ni(RRRtdeepcopytitems(R tmemoR((sO/usr/lib/python2.7/site-packages/kitchen/pycompat25/collections/_defaultdict.pyt __deepcopy__zs cCskt|jtjrE|jjdk rEt|jjtrEd}nt |j}d|t j |fS(Ns-Hs 0PK[D4r' ' ,site-packages/kitchen/iterutils/__init__.pycnu[ i:Oc@sJdZddlmZd ZeeZedZedZd Zd S( s Functions to manipulate iterables .. versionadded:: Kitchen: 0.2.1a1 .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Luke Macken i(tversion_tuple_to_stringiicCsD|st|t r@yt|Wntk r8tSXtSntS(sCheck whether an object is an iterable :arg obj: Object to test whether it is an iterable :kwarg include_string: If :data:`True` and :attr:`obj` is a byte :class:`str` or :class:`unicode` string this function will return :data:`True`. If set to :data:`False`, byte :class:`str` and :class:`unicode` strings will cause this function to return :data:`False`. Default :data:`False`. :returns: :data:`True` if :attr:`obj` is iterable, otherwise :data:`False`. (t isinstancet basestringtitert TypeErrortFalsetTrue(tobjtinclude_string((s>/usr/lib/python2.7/site-packages/kitchen/iterutils/__init__.pyt isiterable%s  ccs4t|d|r+x|D] }|VqWn|VdS(sgGenerator that can be used to iterate over anything :arg obj: The object to iterate over :kwarg include_string: if :data:`True`, treat strings as iterables. Otherwise treat them as a single scalar value. Default :data:`False` This function will create an iterator out of any scalar or iterable. It is useful for making a value given to you an iterable before operating on it. Iterables have their items returned. scalars are transformed into iterables. A string is treated as a scalar value unless the :attr:`include_string` parameter is set to :data:`True`. Example usage:: >>> list(iterate(None)) [None] >>> list(iterate([None])) [None] >>> list(iterate([1, 2, 3])) [1, 2, 3] >>> list(iterate(set([1, 2, 3]))) [1, 2, 3] >>> list(iterate(dict(a='1', b='2'))) ['a', 'b'] >>> list(iterate(1)) [1] >>> list(iterate(iter([1, 2, 3]))) [1, 2, 3] >>> list(iterate('abc')) ['abc'] >>> list(iterate('abc', include_string=True)) ['a', 'b', 'c'] RN(R (RRtitem((s>/usr/lib/python2.7/site-packages/kitchen/iterutils/__init__.pytiterate:s   R R N(iii((iii(s isiterablesiterate( t__doc__tkitchen.versioningRt__version_info__t __version__RR R t__all__(((s>/usr/lib/python2.7/site-packages/kitchen/iterutils/__init__.pyts    &PK[3 +site-packages/kitchen/iterutils/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010 Red Hat, Inc # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. #. # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. #. # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: # Toshio Kuratomi # Luke Macken # # Portions of code taken from python-fedora fedora/iterutils.py ''' Functions to manipulate iterables .. versionadded:: Kitchen: 0.2.1a1 .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Luke Macken ''' from kitchen.versioning import version_tuple_to_string __version_info__ = ((0, 0, 1),) __version__ = version_tuple_to_string(__version_info__) def isiterable(obj, include_string=False): '''Check whether an object is an iterable :arg obj: Object to test whether it is an iterable :kwarg include_string: If :data:`True` and :attr:`obj` is a byte :class:`str` or :class:`unicode` string this function will return :data:`True`. If set to :data:`False`, byte :class:`str` and :class:`unicode` strings will cause this function to return :data:`False`. Default :data:`False`. :returns: :data:`True` if :attr:`obj` is iterable, otherwise :data:`False`. ''' if include_string or not isinstance(obj, basestring): try: iter(obj) except TypeError: return False else: return True return False def iterate(obj, include_string=False): '''Generator that can be used to iterate over anything :arg obj: The object to iterate over :kwarg include_string: if :data:`True`, treat strings as iterables. Otherwise treat them as a single scalar value. Default :data:`False` This function will create an iterator out of any scalar or iterable. It is useful for making a value given to you an iterable before operating on it. Iterables have their items returned. scalars are transformed into iterables. A string is treated as a scalar value unless the :attr:`include_string` parameter is set to :data:`True`. Example usage:: >>> list(iterate(None)) [None] >>> list(iterate([None])) [None] >>> list(iterate([1, 2, 3])) [1, 2, 3] >>> list(iterate(set([1, 2, 3]))) [1, 2, 3] >>> list(iterate(dict(a='1', b='2'))) ['a', 'b'] >>> list(iterate(1)) [1] >>> list(iterate(iter([1, 2, 3]))) [1, 2, 3] >>> list(iterate('abc')) ['abc'] >>> list(iterate('abc', include_string=True)) ['a', 'b', 'c'] ''' if isiterable(obj, include_string=include_string): for item in obj: yield item else: yield obj __all__ = ('isiterable', 'iterate',) PK[D4r' ' ,site-packages/kitchen/iterutils/__init__.pyonu[ i:Oc@sJdZddlmZd ZeeZedZedZd Zd S( s Functions to manipulate iterables .. versionadded:: Kitchen: 0.2.1a1 .. moduleauthor:: Toshio Kuratomi .. moduleauthor:: Luke Macken i(tversion_tuple_to_stringiicCsD|st|t r@yt|Wntk r8tSXtSntS(sCheck whether an object is an iterable :arg obj: Object to test whether it is an iterable :kwarg include_string: If :data:`True` and :attr:`obj` is a byte :class:`str` or :class:`unicode` string this function will return :data:`True`. If set to :data:`False`, byte :class:`str` and :class:`unicode` strings will cause this function to return :data:`False`. Default :data:`False`. :returns: :data:`True` if :attr:`obj` is iterable, otherwise :data:`False`. (t isinstancet basestringtitert TypeErrortFalsetTrue(tobjtinclude_string((s>/usr/lib/python2.7/site-packages/kitchen/iterutils/__init__.pyt isiterable%s  ccs4t|d|r+x|D] }|VqWn|VdS(sgGenerator that can be used to iterate over anything :arg obj: The object to iterate over :kwarg include_string: if :data:`True`, treat strings as iterables. Otherwise treat them as a single scalar value. Default :data:`False` This function will create an iterator out of any scalar or iterable. It is useful for making a value given to you an iterable before operating on it. Iterables have their items returned. scalars are transformed into iterables. A string is treated as a scalar value unless the :attr:`include_string` parameter is set to :data:`True`. Example usage:: >>> list(iterate(None)) [None] >>> list(iterate([None])) [None] >>> list(iterate([1, 2, 3])) [1, 2, 3] >>> list(iterate(set([1, 2, 3]))) [1, 2, 3] >>> list(iterate(dict(a='1', b='2'))) ['a', 'b'] >>> list(iterate(1)) [1] >>> list(iterate(iter([1, 2, 3]))) [1, 2, 3] >>> list(iterate('abc')) ['abc'] >>> list(iterate('abc', include_string=True)) ['a', 'b', 'c'] RN(R (RRtitem((s>/usr/lib/python2.7/site-packages/kitchen/iterutils/__init__.pytiterate:s   R R N(iii((iii(s isiterablesiterate( t__doc__tkitchen.versioningRt__version_info__t __version__RR R t__all__(((s>/usr/lib/python2.7/site-packages/kitchen/iterutils/__init__.pyts    &PK[~BB#site-packages/kitchen/exceptions.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010 Red Hat, Inc # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. # # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: # Toshio Kuratomi # ''' ----------------------- Base kitchen exceptions ----------------------- Exception classes for kitchen and the root of the exception hierarchy for all kitchen modules. ''' class KitchenError(Exception): '''Base exception class for any error thrown directly by kitchen. ''' pass __all__ = ('KitchenError',) PK[}ʊ!site-packages/kitchen/release.pyonu[ i:Oc @sndZddlmZmZdZeZedZedZdZdZ dZ d Z d Z d Z dZdS(s) Information about this kitchen release. i(t_t __version__tkitchens,Kitchen contains a cornucopia of useful codes We've all done it. In the process of writing a brand new application we've discovered that we need a little bit of code that we've invented before. Perhaps it's something to handle unicode text. Perhaps it's something to make a bit of python-2.5 code run on python-2.3. Whatever it is, it ends up being a tiny bit of code that seems too small to worry about pushing into its own module so it sits there, a part of your current project, waiting to be cut and pasted into your next project. And the next. And the next. And since that little bittybit of code proved so useful to you, it's highly likely that it proved useful to someone else as well. Useful enough that they've written it and copy and pasted it over and over into each of their new projects. Well, no longer! Kitchen aims to pull these small snippets of code into a few python modules which you can import and use within your project. No more copy and paste! Now you can let someone else maintain and release these small snippets so that you can get on with your life. s#Toshio Kuratomi, Seth Vidal, othersstoshio@fedoraproject.orgs2011 Red Hat, Inc. and otherss https://fedorahosted.org/kitchens-https://fedorahosted.org/releases/k/i/kitchensLGPLv2+tNAMEtVERSIONt DESCRIPTIONtLONG_DESCRIPTIONtAUTHORtEMAILt COPYRIGHTtURLt DOWNLOAD_URLtLICENSEN( sNAMEsVERSIONs DESCRIPTIONsLONG_DESCRIPTIONsAUTHORsEMAILs COPYRIGHTsURLs DOWNLOAD_URLsLICENSE(t__doc__RRRRRRRRRR R R R t__all__(((s3/usr/lib/python2.7/site-packages/kitchen/release.pyts  PK[}ʊ!site-packages/kitchen/release.pycnu[ i:Oc @sndZddlmZmZdZeZedZedZdZdZ dZ d Z d Z d Z dZdS(s) Information about this kitchen release. i(t_t __version__tkitchens,Kitchen contains a cornucopia of useful codes We've all done it. In the process of writing a brand new application we've discovered that we need a little bit of code that we've invented before. Perhaps it's something to handle unicode text. Perhaps it's something to make a bit of python-2.5 code run on python-2.3. Whatever it is, it ends up being a tiny bit of code that seems too small to worry about pushing into its own module so it sits there, a part of your current project, waiting to be cut and pasted into your next project. And the next. And the next. And since that little bittybit of code proved so useful to you, it's highly likely that it proved useful to someone else as well. Useful enough that they've written it and copy and pasted it over and over into each of their new projects. Well, no longer! Kitchen aims to pull these small snippets of code into a few python modules which you can import and use within your project. No more copy and paste! Now you can let someone else maintain and release these small snippets so that you can get on with your life. s#Toshio Kuratomi, Seth Vidal, othersstoshio@fedoraproject.orgs2011 Red Hat, Inc. and otherss https://fedorahosted.org/kitchens-https://fedorahosted.org/releases/k/i/kitchensLGPLv2+tNAMEtVERSIONt DESCRIPTIONtLONG_DESCRIPTIONtAUTHORtEMAILt COPYRIGHTtURLt DOWNLOAD_URLtLICENSEN( sNAMEsVERSIONs DESCRIPTIONsLONG_DESCRIPTIONsAUTHORsEMAILs COPYRIGHTsURLs DOWNLOAD_URLsLICENSE(t__doc__RRRRRRRRRR R R R t__all__(((s3/usr/lib/python2.7/site-packages/kitchen/release.pyts  PK[\\!site-packages/kitchen/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2011 Red Hat, Inc # # kitchen is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # kitchen is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with kitchen; if not, see # # Authors: # Toshio Kuratomi # ''' Kitchen Aggregate of a bunch of unrelated but helpful python modules. ''' # Pylint disabled messages: # :C0103: We need gettext aliases for both unicode strings and byte strings. # The byte string one (b_) triggers this warning. from kitchen import i18n from kitchen import versioning (_, N_) = i18n.easy_gettext_setup('kitchen.core') #pylint: disable-msg=C0103 (b_, bN_) = i18n.easy_gettext_setup('kitchen.core', use_unicode=False) #pylint: enable-msg=C0103 __version_info__ = ((1, 1, 1),) __version__ = versioning.version_tuple_to_string(__version_info__) __all__ = ('exceptions', 'release',) PK[xl0l0"site-packages/kitchen/text/misc.pynu[# -*- coding: utf-8 -*- # Copyright (c) 2011 Red Hat, Inc # Copyright (c) 2010 Seth Vidal # # kitchen is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # kitchen is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with kitchen; if not, see # # Authors: # James Antill # Toshio Kuratomi # Seth Vidal # # Portions of this code taken from yum/misc.py and yum/i18n.py ''' --------------------------------------------- Miscellaneous functions for manipulating text --------------------------------------------- Collection of text functions that don't fit in another category. ''' import htmlentitydefs import itertools import re try: import chardet except ImportError: chardet = None # We need to access b_() for localizing our strings but we'll end up with # a circular import if we import it directly. import kitchen as k from kitchen.pycompat24 import sets from kitchen.text.exceptions import ControlCharError sets.add_builtin_set() # Define a threshold for chardet confidence. If we fall below this we decode # byte strings we're guessing about as latin1 _CHARDET_THRESHHOLD = 0.6 # ASCII control codes that are illegal in xml 1.0 _CONTROL_CODES = frozenset(range(0, 8) + [11, 12] + range(14, 32)) _CONTROL_CHARS = frozenset(itertools.imap(unichr, _CONTROL_CODES)) # _ENTITY_RE _ENTITY_RE = re.compile(r'(?s)<[^>]*>|&#?\w+;') def guess_encoding(byte_string, disable_chardet=False): '''Try to guess the encoding of a byte :class:`str` :arg byte_string: byte :class:`str` to guess the encoding of :kwarg disable_chardet: If this is True, we never attempt to use :mod:`chardet` to guess the encoding. This is useful if you need to have reproducibility whether :mod:`chardet` is installed or not. Default: :data:`False`. :raises TypeError: if :attr:`byte_string` is not a byte :class:`str` type :returns: string containing a guess at the encoding of :attr:`byte_string`. This is appropriate to pass as the encoding argument when encoding and decoding unicode strings. We start by attempting to decode the byte :class:`str` as :term:`UTF-8`. If this succeeds we tell the world it's :term:`UTF-8` text. If it doesn't and :mod:`chardet` is installed on the system and :attr:`disable_chardet` is False this function will use it to try detecting the encoding of :attr:`byte_string`. If it is not installed or :mod:`chardet` cannot determine the encoding with a high enough confidence then we rather arbitrarily claim that it is ``latin-1``. Since ``latin-1`` will encode to every byte, decoding from ``latin-1`` to :class:`unicode` will not cause :exc:`UnicodeErrors` although the output might be mangled. ''' if not isinstance(byte_string, str): raise TypeError(k.b_('byte_string must be a byte string (str)')) input_encoding = 'utf-8' try: unicode(byte_string, input_encoding, 'strict') except UnicodeDecodeError: input_encoding = None if not input_encoding and chardet and not disable_chardet: detection_info = chardet.detect(byte_string) if detection_info['confidence'] >= _CHARDET_THRESHHOLD: input_encoding = detection_info['encoding'] if not input_encoding: input_encoding = 'latin-1' return input_encoding def str_eq(str1, str2, encoding='utf-8', errors='replace'): '''Compare two stringsi, converting to byte :class:`str` if one is :class:`unicode` :arg str1: First string to compare :arg str2: Second string to compare :kwarg encoding: If we need to convert one string into a byte :class:`str` to compare, the encoding to use. Default is :term:`utf-8`. :kwarg errors: What to do if we encounter errors when encoding the string. See the :func:`kitchen.text.converters.to_bytes` documentation for possible values. The default is ``replace``. This function prevents :exc:`UnicodeError` (python-2.4 or less) and :exc:`UnicodeWarning` (python 2.5 and higher) when we compare a :class:`unicode` string to a byte :class:`str`. The errors normally arise because the conversion is done to :term:`ASCII`. This function lets you convert to :term:`utf-8` or another encoding instead. .. note:: When we need to convert one of the strings from :class:`unicode` in order to compare them we convert the :class:`unicode` string into a byte :class:`str`. That means that strings can compare differently if you use different encodings for each. Note that ``str1 == str2`` is faster than this function if you can accept the following limitations: * Limited to python-2.5+ (otherwise a :exc:`UnicodeDecodeError` may be thrown) * Will generate a :exc:`UnicodeWarning` if non-:term:`ASCII` byte :class:`str` is compared to :class:`unicode` string. ''' try: return (not str1 < str2) and (not str1 > str2) except UnicodeError: pass if isinstance(str1, unicode): str1 = str1.encode(encoding, errors) else: str2 = str2.encode(encoding, errors) if str1 == str2: return True return False def process_control_chars(string, strategy='replace'): '''Look for and transform :term:`control characters` in a string :arg string: string to search for and transform :term:`control characters` within :kwarg strategy: XML does not allow :term:`ASCII` :term:`control characters`. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the :term:`control characters` with ``"?"`` :ignore: Remove the characters altogether from the output :strict: Raise a :exc:`~kitchen.text.exceptions.ControlCharError` when we encounter a control character :raises TypeError: if :attr:`string` is not a unicode string. :raises ValueError: if the strategy is not one of replace, ignore, or strict. :raises kitchen.text.exceptions.ControlCharError: if the strategy is ``strict`` and a :term:`control character` is present in the :attr:`string` :returns: :class:`unicode` string with no :term:`control characters` in it. ''' if not isinstance(string, unicode): raise TypeError(k.b_('process_control_char must have a unicode type as' ' the first argument.')) if strategy == 'ignore': control_table = dict(zip(_CONTROL_CODES, [None] * len(_CONTROL_CODES))) elif strategy == 'replace': control_table = dict(zip(_CONTROL_CODES, [u'?'] * len(_CONTROL_CODES))) elif strategy == 'strict': control_table = None # Test that there are no control codes present data = frozenset(string) if [c for c in _CONTROL_CHARS if c in data]: raise ControlCharError(k.b_('ASCII control code present in string' ' input')) else: raise ValueError(k.b_('The strategy argument to process_control_chars' ' must be one of ignore, replace, or strict')) if control_table: string = string.translate(control_table) return string # Originally written by Fredrik Lundh (January 15, 2003) and placed in the # public domain:: # # Unless otherwise noted, source code can be be used freely. Examples, test # scripts and other short code fragments can be considered as being in the # public domain. # # http://effbot.org/zone/re-sub.htm#unescape-html # http://effbot.org/zone/copyright.htm # def html_entities_unescape(string): '''Substitute unicode characters for HTML entities :arg string: :class:`unicode` string to substitute out html entities :raises TypeError: if something other than a :class:`unicode` string is given :rtype: :class:`unicode` string :returns: The plain text without html entities ''' def fixup(match): string = match.group(0) if string[:1] == u"<": return "" # ignore tags if string[:2] == u"&#": try: if string[:3] == u"&#x": return unichr(int(string[3:-1], 16)) else: return unichr(int(string[2:-1])) except ValueError: # If the value is outside the unicode codepoint range, leave # it in the output as is pass elif string[:1] == u"&": entity = htmlentitydefs.entitydefs.get(string[1:-1].encode('utf-8')) if entity: if entity[:2] == "&#": try: return unichr(int(entity[2:-1])) except ValueError: # If the value is outside the unicode codepoint range, # leave it in the output as is pass else: return unicode(entity, "iso-8859-1") return string # leave as is if not isinstance(string, unicode): raise TypeError(k.b_('html_entities_unescape must have a unicode type' ' for its first argument')) return re.sub(_ENTITY_RE, fixup, string) def byte_string_valid_xml(byte_string, encoding='utf-8'): '''Check that a byte :class:`str` would be valid in xml :arg byte_string: Byte :class:`str` to check :arg encoding: Encoding of the xml file. Default: :term:`UTF-8` :returns: :data:`True` if the string is valid. :data:`False` if it would be invalid in the xml file In some cases you'll have a whole bunch of byte strings and rather than transforming them to :class:`unicode` and back to byte :class:`str` for output to xml, you will just want to make sure they work with the xml file you're constructing. This function will help you do that. Example:: ARRAY_OF_MOSTLY_UTF8_STRINGS = [...] processed_array = [] for string in ARRAY_OF_MOSTLY_UTF8_STRINGS: if byte_string_valid_xml(string, 'utf-8'): processed_array.append(string) else: processed_array.append(guess_bytes_to_xml(string, encoding='utf-8')) output_xml(processed_array) ''' if not isinstance(byte_string, str): # Not a byte string return False try: u_string = unicode(byte_string, encoding) except UnicodeError: # Not encoded with the xml file's encoding return False data = frozenset(u_string) if data.intersection(_CONTROL_CHARS): # Contains control codes return False # The byte string is compatible with this xml file return True def byte_string_valid_encoding(byte_string, encoding='utf-8'): '''Detect if a byte :class:`str` is valid in a specific encoding :arg byte_string: Byte :class:`str` to test for bytes not valid in this encoding :kwarg encoding: encoding to test against. Defaults to :term:`UTF-8`. :returns: :data:`True` if there are no invalid :term:`UTF-8` characters. :data:`False` if an invalid character is detected. .. note:: This function checks whether the byte :class:`str` is valid in the specified encoding. It **does not** detect whether the byte :class:`str` actually was encoded in that encoding. If you want that sort of functionality, you probably want to use :func:`~kitchen.text.misc.guess_encoding` instead. ''' try: unicode(byte_string, encoding) except UnicodeError: # Not encoded with the xml file's encoding return False # byte string is valid in this encoding return True __all__ = ('byte_string_valid_encoding', 'byte_string_valid_xml', 'guess_encoding', 'html_entities_unescape', 'process_control_chars', 'str_eq') PK[L# %site-packages/kitchen/text/display.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010 Red Hat, Inc. # Copyright (c) 2010 Ville Skyttä # Copyright (c) 2009 Tim Lauridsen # Copyright (c) 2007 Marcus Kuhn # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. # # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: # James Antill # Marcus Kuhn # Toshio Kuratomi # Tim Lauridsen # Ville Skyttä # # Portions of this are from yum/i18n.py ''' ----------------------- Format Text for Display ----------------------- Functions related to displaying unicode text. Unicode characters don't all have the same width so we need helper functions for displaying them. .. versionadded:: 0.2 kitchen.display API 1.0.0 ''' import itertools import unicodedata from kitchen import b_ from kitchen.text.converters import to_unicode, to_bytes from kitchen.text.exceptions import ControlCharError # This is ported from ustr_utf8_* which I got from: # http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c # I've tried to leave it close to the original C (same names etc.) so that # it is easy to read/compare both versions... James Antilles # # Reimplemented quite a bit of this for speed. Use the bzr log or annotate # commands to see what I've changed since importing this file.-Toshio Kuratomi # ----------------------------- BEG utf8 ------------------to----------- # This is an implementation of wcwidth() and wcswidth() (defined in # IEEE Std 1002.1-2001) for Unicode. # # http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html # http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html # # In fixed-width output devices, Latin characters all occupy a single # "cell" position of equal width, whereas ideographic CJK characters # occupy two such cells. Interoperability between terminal-line # applications and (teletype-style) character terminals using the # UTF-8 encoding requires agreement on which character should advance # the cursor by how many cell positions. No established formal # standards exist at present on which Unicode character shall occupy # how many cell positions on character terminals. These routines are # a first attempt of defining such behavior based on simple rules # applied to data provided by the Unicode Consortium. # # [...] # # Markus Kuhn -- 2007-05-26 (Unicode 5.0) # # Permission to use, copy, modify, and distribute this software # for any purpose and without fee is hereby granted. The author # disclaims all warranties with regard to this software. # # Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c # Renamed but still pretty much JA's port of MK's code def _interval_bisearch(value, table): '''Binary search in an interval table. :arg value: numeric value to search for :arg table: Ordered list of intervals. This is a list of two-tuples. The elements of the two-tuple define an interval's start and end points. :returns: If :attr:`value` is found within an interval in the :attr:`table` return :data:`True`. Otherwise, :data:`False` This function checks whether a numeric value is present within a table of intervals. It checks using a binary search algorithm, dividing the list of values in half and checking against the values until it determines whether the value is in the table. ''' minimum = 0 maximum = len(table) - 1 if value < table[minimum][0] or value > table[maximum][1]: return False while maximum >= minimum: mid = (minimum + maximum) / 2 if value > table[mid][1]: minimum = mid + 1 elif value < table[mid][0]: maximum = mid - 1 else: return True return False _COMBINING = ( (0x300, 0x36f), (0x483, 0x489), (0x591, 0x5bd), (0x5bf, 0x5bf), (0x5c1, 0x5c2), (0x5c4, 0x5c5), (0x5c7, 0x5c7), (0x600, 0x603), (0x610, 0x61a), (0x64b, 0x65e), (0x670, 0x670), (0x6d6, 0x6e4), (0x6e7, 0x6e8), (0x6ea, 0x6ed), (0x70f, 0x70f), (0x711, 0x711), (0x730, 0x74a), (0x7a6, 0x7b0), (0x7eb, 0x7f3), (0x816, 0x819), (0x81b, 0x823), (0x825, 0x827), (0x829, 0x82d), (0x901, 0x902), (0x93c, 0x93c), (0x941, 0x948), (0x94d, 0x94d), (0x951, 0x954), (0x962, 0x963), (0x981, 0x981), (0x9bc, 0x9bc), (0x9c1, 0x9c4), (0x9cd, 0x9cd), (0x9e2, 0x9e3), (0xa01, 0xa02), (0xa3c, 0xa3c), (0xa41, 0xa42), (0xa47, 0xa48), (0xa4b, 0xa4d), (0xa70, 0xa71), (0xa81, 0xa82), (0xabc, 0xabc), (0xac1, 0xac5), (0xac7, 0xac8), (0xacd, 0xacd), (0xae2, 0xae3), (0xb01, 0xb01), (0xb3c, 0xb3c), (0xb3f, 0xb3f), (0xb41, 0xb43), (0xb4d, 0xb4d), (0xb56, 0xb56), (0xb82, 0xb82), (0xbc0, 0xbc0), (0xbcd, 0xbcd), (0xc3e, 0xc40), (0xc46, 0xc48), (0xc4a, 0xc4d), (0xc55, 0xc56), (0xcbc, 0xcbc), (0xcbf, 0xcbf), (0xcc6, 0xcc6), (0xccc, 0xccd), (0xce2, 0xce3), (0xd41, 0xd43), (0xd4d, 0xd4d), (0xdca, 0xdca), (0xdd2, 0xdd4), (0xdd6, 0xdd6), (0xe31, 0xe31), (0xe34, 0xe3a), (0xe47, 0xe4e), (0xeb1, 0xeb1), (0xeb4, 0xeb9), (0xebb, 0xebc), (0xec8, 0xecd), (0xf18, 0xf19), (0xf35, 0xf35), (0xf37, 0xf37), (0xf39, 0xf39), (0xf71, 0xf7e), (0xf80, 0xf84), (0xf86, 0xf87), (0xf90, 0xf97), (0xf99, 0xfbc), (0xfc6, 0xfc6), (0x102d, 0x1030), (0x1032, 0x1032), (0x1036, 0x1037), (0x1039, 0x103a), (0x1058, 0x1059), (0x108d, 0x108d), (0x1160, 0x11ff), (0x135f, 0x135f), (0x1712, 0x1714), (0x1732, 0x1734), (0x1752, 0x1753), (0x1772, 0x1773), (0x17b4, 0x17b5), (0x17b7, 0x17bd), (0x17c6, 0x17c6), (0x17c9, 0x17d3), (0x17dd, 0x17dd), (0x180b, 0x180d), (0x18a9, 0x18a9), (0x1920, 0x1922), (0x1927, 0x1928), (0x1932, 0x1932), (0x1939, 0x193b), (0x1a17, 0x1a18), (0x1a60, 0x1a60), (0x1a75, 0x1a7c), (0x1a7f, 0x1a7f), (0x1b00, 0x1b03), (0x1b34, 0x1b34), (0x1b36, 0x1b3a), (0x1b3c, 0x1b3c), (0x1b42, 0x1b42), (0x1b44, 0x1b44), (0x1b6b, 0x1b73), (0x1baa, 0x1baa), (0x1c37, 0x1c37), (0x1cd0, 0x1cd2), (0x1cd4, 0x1ce0), (0x1ce2, 0x1ce8), (0x1ced, 0x1ced), (0x1dc0, 0x1de6), (0x1dfd, 0x1dff), (0x200b, 0x200f), (0x202a, 0x202e), (0x2060, 0x2063), (0x206a, 0x206f), (0x20d0, 0x20f0), (0x2cef, 0x2cf1), (0x2de0, 0x2dff), (0x302a, 0x302f), (0x3099, 0x309a), (0xa66f, 0xa66f), (0xa67c, 0xa67d), (0xa6f0, 0xa6f1), (0xa806, 0xa806), (0xa80b, 0xa80b), (0xa825, 0xa826), (0xa8c4, 0xa8c4), (0xa8e0, 0xa8f1), (0xa92b, 0xa92d), (0xa953, 0xa953), (0xa9b3, 0xa9b3), (0xa9c0, 0xa9c0), (0xaab0, 0xaab0), (0xaab2, 0xaab4), (0xaab7, 0xaab8), (0xaabe, 0xaabf), (0xaac1, 0xaac1), (0xabed, 0xabed), (0xfb1e, 0xfb1e), (0xfe00, 0xfe0f), (0xfe20, 0xfe26), (0xfeff, 0xfeff), (0xfff9, 0xfffb), (0x101fd, 0x101fd), (0x10a01, 0x10a03), (0x10a05, 0x10a06), (0x10a0c, 0x10a0f), (0x10a38, 0x10a3a), (0x10a3f, 0x10a3f), (0x110b9, 0x110ba), (0x1d165, 0x1d169), (0x1d16d, 0x1d182), (0x1d185, 0x1d18b), (0x1d1aa, 0x1d1ad), (0x1d242, 0x1d244), (0xe0001, 0xe0001), (0xe0020, 0xe007f), (0xe0100, 0xe01ef), ) ''' Internal table, provided by this module to list :term:`code points` which combine with other characters and therefore should have no :term:`textual width`. This is a sorted :class:`tuple` of non-overlapping intervals. Each interval is a :class:`tuple` listing a starting :term:`code point` and ending :term:`code point`. Every :term:`code point` between the two end points is a combining character. .. seealso:: :func:`~kitchen.text.display._generate_combining_table` for how this table is generated This table was last regenerated on python-2.7.0 with :data:`unicodedata.unidata_version` 5.1.0 ''' # New function from Toshio Kuratomi (LGPLv2+) def _generate_combining_table(): '''Combine Markus Kuhn's data with :mod:`unicodedata` to make combining char list :rtype: :class:`tuple` of tuples :returns: :class:`tuple` of intervals of :term:`code points` that are combining character. Each interval is a 2-:class:`tuple` of the starting :term:`code point` and the ending :term:`code point` for the combining characters. In normal use, this function serves to tell how we're generating the combining char list. For speed reasons, we use this to generate a static list and just use that later. Markus Kuhn's list of combining characters is more complete than what's in the python :mod:`unicodedata` library but the python :mod:`unicodedata` is synced against later versions of the unicode database This is used to generate the :data:`~kitchen.text.display._COMBINING` table. ''' # Marcus Kuhn's sorted list of non-overlapping intervals of non-spacing # characters generated ifrom Unicode 5.0 data by: # "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" markus_kuhn_combining_5_0 = ( ( 0x0300, 0x036F ), ( 0x0483, 0x0486 ), ( 0x0488, 0x0489 ), ( 0x0591, 0x05BD ), ( 0x05BF, 0x05BF ), ( 0x05C1, 0x05C2 ), ( 0x05C4, 0x05C5 ), ( 0x05C7, 0x05C7 ), ( 0x0600, 0x0603 ), ( 0x0610, 0x0615 ), ( 0x064B, 0x065E ), ( 0x0670, 0x0670 ), ( 0x06D6, 0x06E4 ), ( 0x06E7, 0x06E8 ), ( 0x06EA, 0x06ED ), ( 0x070F, 0x070F ), ( 0x0711, 0x0711 ), ( 0x0730, 0x074A ), ( 0x07A6, 0x07B0 ), ( 0x07EB, 0x07F3 ), ( 0x0901, 0x0902 ), ( 0x093C, 0x093C ), ( 0x0941, 0x0948 ), ( 0x094D, 0x094D ), ( 0x0951, 0x0954 ), ( 0x0962, 0x0963 ), ( 0x0981, 0x0981 ), ( 0x09BC, 0x09BC ), ( 0x09C1, 0x09C4 ), ( 0x09CD, 0x09CD ), ( 0x09E2, 0x09E3 ), ( 0x0A01, 0x0A02 ), ( 0x0A3C, 0x0A3C ), ( 0x0A41, 0x0A42 ), ( 0x0A47, 0x0A48 ), ( 0x0A4B, 0x0A4D ), ( 0x0A70, 0x0A71 ), ( 0x0A81, 0x0A82 ), ( 0x0ABC, 0x0ABC ), ( 0x0AC1, 0x0AC5 ), ( 0x0AC7, 0x0AC8 ), ( 0x0ACD, 0x0ACD ), ( 0x0AE2, 0x0AE3 ), ( 0x0B01, 0x0B01 ), ( 0x0B3C, 0x0B3C ), ( 0x0B3F, 0x0B3F ), ( 0x0B41, 0x0B43 ), ( 0x0B4D, 0x0B4D ), ( 0x0B56, 0x0B56 ), ( 0x0B82, 0x0B82 ), ( 0x0BC0, 0x0BC0 ), ( 0x0BCD, 0x0BCD ), ( 0x0C3E, 0x0C40 ), ( 0x0C46, 0x0C48 ), ( 0x0C4A, 0x0C4D ), ( 0x0C55, 0x0C56 ), ( 0x0CBC, 0x0CBC ), ( 0x0CBF, 0x0CBF ), ( 0x0CC6, 0x0CC6 ), ( 0x0CCC, 0x0CCD ), ( 0x0CE2, 0x0CE3 ), ( 0x0D41, 0x0D43 ), ( 0x0D4D, 0x0D4D ), ( 0x0DCA, 0x0DCA ), ( 0x0DD2, 0x0DD4 ), ( 0x0DD6, 0x0DD6 ), ( 0x0E31, 0x0E31 ), ( 0x0E34, 0x0E3A ), ( 0x0E47, 0x0E4E ), ( 0x0EB1, 0x0EB1 ), ( 0x0EB4, 0x0EB9 ), ( 0x0EBB, 0x0EBC ), ( 0x0EC8, 0x0ECD ), ( 0x0F18, 0x0F19 ), ( 0x0F35, 0x0F35 ), ( 0x0F37, 0x0F37 ), ( 0x0F39, 0x0F39 ), ( 0x0F71, 0x0F7E ), ( 0x0F80, 0x0F84 ), ( 0x0F86, 0x0F87 ), ( 0x0F90, 0x0F97 ), ( 0x0F99, 0x0FBC ), ( 0x0FC6, 0x0FC6 ), ( 0x102D, 0x1030 ), ( 0x1032, 0x1032 ), ( 0x1036, 0x1037 ), ( 0x1039, 0x1039 ), ( 0x1058, 0x1059 ), ( 0x1160, 0x11FF ), ( 0x135F, 0x135F ), ( 0x1712, 0x1714 ), ( 0x1732, 0x1734 ), ( 0x1752, 0x1753 ), ( 0x1772, 0x1773 ), ( 0x17B4, 0x17B5 ), ( 0x17B7, 0x17BD ), ( 0x17C6, 0x17C6 ), ( 0x17C9, 0x17D3 ), ( 0x17DD, 0x17DD ), ( 0x180B, 0x180D ), ( 0x18A9, 0x18A9 ), ( 0x1920, 0x1922 ), ( 0x1927, 0x1928 ), ( 0x1932, 0x1932 ), ( 0x1939, 0x193B ), ( 0x1A17, 0x1A18 ), ( 0x1B00, 0x1B03 ), ( 0x1B34, 0x1B34 ), ( 0x1B36, 0x1B3A ), ( 0x1B3C, 0x1B3C ), ( 0x1B42, 0x1B42 ), ( 0x1B6B, 0x1B73 ), ( 0x1DC0, 0x1DCA ), ( 0x1DFE, 0x1DFF ), ( 0x200B, 0x200F ), ( 0x202A, 0x202E ), ( 0x2060, 0x2063 ), ( 0x206A, 0x206F ), ( 0x20D0, 0x20EF ), ( 0x302A, 0x302F ), ( 0x3099, 0x309A ), ( 0xA806, 0xA806 ), ( 0xA80B, 0xA80B ), ( 0xA825, 0xA826 ), ( 0xFB1E, 0xFB1E ), ( 0xFE00, 0xFE0F ), ( 0xFE20, 0xFE23 ), ( 0xFEFF, 0xFEFF ), ( 0xFFF9, 0xFFFB ), ( 0x10A01, 0x10A03 ), ( 0x10A05, 0x10A06 ), ( 0x10A0C, 0x10A0F ), ( 0x10A38, 0x10A3A ), ( 0x10A3F, 0x10A3F ), ( 0x1D167, 0x1D169 ), ( 0x1D173, 0x1D182 ), ( 0x1D185, 0x1D18B ), ( 0x1D1AA, 0x1D1AD ), ( 0x1D242, 0x1D244 ), ( 0xE0001, 0xE0001 ), ( 0xE0020, 0xE007F ), ( 0xE0100, 0xE01EF )) combining = [] in_interval = False interval = [] for codepoint in xrange (0, 0xFFFFF + 1): if _interval_bisearch(codepoint, markus_kuhn_combining_5_0) or \ unicodedata.combining(unichr(codepoint)): if not in_interval: # Found first part of an interval interval = [codepoint] in_interval = True else: if in_interval: in_interval = False interval.append(codepoint - 1) combining.append(interval) if in_interval: # If we're at the end and the interval is open, close it. # :W0631: We looped through a static range so we know codepoint is # defined here #pylint:disable-msg=W0631 interval.append(codepoint) combining.append(interval) return tuple(itertools.imap(tuple, combining)) # New function from Toshio Kuratomi (LGPLv2+) def _print_combining_table(): '''Print out a new :data:`_COMBINING` table This will print a new :data:`_COMBINING` table in the format used in :file:`kitchen/text/display.py`. It's useful for updating the :data:`_COMBINING` table with updated data from a new python as the format won't change from what's already in the file. ''' table = _generate_combining_table() entries = 0 print '_COMBINING = (' for pair in table: if entries >= 3: entries = 0 print if entries == 0: print ' ', entries += 1 entry = '(0x%x, 0x%x),' % pair print entry, print ')' # Handling of control chars rewritten. Rest is JA's port of MK's C code. # -Toshio Kuratomi def _ucp_width(ucs, control_chars='guess'): '''Get the :term:`textual width` of a ucs character :arg ucs: integer representing a single unicode :term:`code point` :kwarg control_chars: specify how to deal with :term:`control characters`. Possible values are: :guess: (default) will take a guess for :term:`control character` widths. Most codes will return zero width. ``backspace``, ``delete``, and ``clear delete`` return -1. ``escape`` currently returns -1 as well but this is not guaranteed as it's not always correct :strict: will raise :exc:`~kitchen.text.exceptions.ControlCharError` if a :term:`control character` is encountered :raises ControlCharError: if the :term:`code point` is a unicode :term:`control character` and :attr:`control_chars` is set to 'strict' :returns: :term:`textual width` of the character. .. note:: It's important to remember this is :term:`textual width` and not the number of characters or bytes. ''' # test for 8-bit control characters if ucs < 32 or (ucs < 0xa0 and ucs >= 0x7f): # Control character detected if control_chars == 'strict': raise ControlCharError(b_('_ucp_width does not understand how to' ' assign a width value to control characters.')) if ucs in (0x08, 0x07F, 0x94): # Backspace, delete, and clear delete remove a single character return -1 if ucs == 0x1b: # Excape is tricky. It removes some number of characters that # come after it but the amount is dependent on what is # interpreting the code. # So this is going to often be wrong but other values will be # wrong as well. return -1 # All other control characters get 0 width return 0 if _interval_bisearch(ucs, _COMBINING): # Combining characters return 0 width as they will be combined with # the width from other characters return 0 # if we arrive here, ucs is not a combining or C0/C1 control character return (1 + (ucs >= 0x1100 and (ucs <= 0x115f or # Hangul Jamo init. consonants ucs == 0x2329 or ucs == 0x232a or (ucs >= 0x2e80 and ucs <= 0xa4cf and ucs != 0x303f) or # CJK ... Yi (ucs >= 0xac00 and ucs <= 0xd7a3) or # Hangul Syllables (ucs >= 0xf900 and ucs <= 0xfaff) or # CJK Compatibility Ideographs (ucs >= 0xfe10 and ucs <= 0xfe19) or # Vertical forms (ucs >= 0xfe30 and ucs <= 0xfe6f) or # CJK Compatibility Forms (ucs >= 0xff00 and ucs <= 0xff60) or # Fullwidth Forms (ucs >= 0xffe0 and ucs <= 0xffe6) or (ucs >= 0x20000 and ucs <= 0x2fffd) or (ucs >= 0x30000 and ucs <= 0x3fffd)))) # Wholly rewritten by me (LGPLv2+) -Toshio Kuratomi def textual_width(msg, control_chars='guess', encoding='utf-8', errors='replace'): '''Get the :term:`textual width` of a string :arg msg: :class:`unicode` string or byte :class:`str` to get the width of :kwarg control_chars: specify how to deal with :term:`control characters`. Possible values are: :guess: (default) will take a guess for :term:`control character` widths. Most codes will return zero width. ``backspace``, ``delete``, and ``clear delete`` return -1. ``escape`` currently returns -1 as well but this is not guaranteed as it's not always correct :strict: will raise :exc:`kitchen.text.exceptions.ControlCharError` if a :term:`control character` is encountered :kwarg encoding: If we are given a byte :class:`str` this is used to decode it into :class:`unicode` string. Any characters that are not decodable in this encoding will get a value dependent on the :attr:`errors` parameter. :kwarg errors: How to treat errors encoding the byte :class:`str` to :class:`unicode` string. Legal values are the same as for :func:`kitchen.text.converters.to_unicode`. The default value of ``replace`` will cause undecodable byte sequences to have a width of one. ``ignore`` will have a width of zero. :raises ControlCharError: if :attr:`msg` contains a :term:`control character` and :attr:`control_chars` is ``strict``. :returns: :term:`Textual width` of the :attr:`msg`. This is the amount of space that the string will consume on a monospace display. It's measured in the number of cell positions or columns it will take up on a monospace display. This is **not** the number of glyphs that are in the string. .. note:: This function can be wrong sometimes because Unicode does not specify a strict width value for all of the :term:`code points`. In particular, we've found that some Tamil characters take up to four character cells but we return a lesser amount. ''' # On python 2.6.4, x86_64, I've benchmarked a few alternate # implementations:: # # timeit.repeat('display.textual_width(data)', # 'from __main__ import display, data', number=100) # I varied data by size and content (1MB of ascii, a few words, 43K utf8, # unicode type # # :this implementation: fastest across the board # # :list comprehension: 6-16% slower # return sum([_ucp_width(ord(c), control_chars=control_chars) # for c in msg]) # # :generator expression: 9-18% slower # return sum((_ucp_width(ord(c), control_chars=control_chars) for c in # msg)) # # :lambda: 10-19% slower # return sum(itertools.imap(lambda x: _ucp_width(ord(x), control_chars), # msg)) # # :partial application: 13-22% slower # func = functools.partial(_ucp_width, control_chars=control_chars) # return sum(itertools.imap(func, itertools.imap(ord, msg))) # # :the original code: 4-38% slower # The 4% was for the short, ascii only string. All the other pieces of # data yielded over 30% slower times. # Non decodable data is just assigned a single cell width msg = to_unicode(msg, encoding=encoding, errors=errors) # Add the width of each char return sum( # calculate width of each char itertools.starmap(_ucp_width, # Setup the arguments to _ucp_width itertools.izip( # int value of each char itertools.imap(ord, msg), # control_chars arg in a form that izip will deal with itertools.repeat(control_chars)))) # Wholly rewritten by me -Toshio Kuratomi def textual_width_chop(msg, chop, encoding='utf-8', errors='replace'): '''Given a string, return it chopped to a given :term:`textual width` :arg msg: :class:`unicode` string or byte :class:`str` to chop :arg chop: Chop :attr:`msg` if it exceeds this :term:`textual width` :kwarg encoding: If we are given a byte :class:`str`, this is used to decode it into a :class:`unicode` string. Any characters that are not decodable in this encoding will be assigned a width of one. :kwarg errors: How to treat errors encoding the byte :class:`str` to :class:`unicode`. Legal values are the same as for :func:`kitchen.text.converters.to_unicode` :rtype: :class:`unicode` string :returns: :class:`unicode` string of the :attr:`msg` chopped at the given :term:`textual width` This is what you want to use instead of ``%.*s``, as it does the "right" thing with regard to :term:`UTF-8` sequences, :term:`control characters`, and characters that take more than one cell position. Eg:: >>> # Wrong: only displays 8 characters because it is operating on bytes >>> print "%.*s" % (10, 'café ñunru!') café ñun >>> # Properly operates on graphemes >>> '%s' % (textual_width_chop('café ñunru!', 10)) café ñunru >>> # takes too many columns because the kanji need two cell positions >>> print '1234567890\\n%.*s' % (10, u'一二三四五六七八九十') 1234567890 一二三四五六七八九十 >>> # Properly chops at 10 columns >>> print '1234567890\\n%s' % (textual_width_chop(u'一二三四五六七八九十', 10)) 1234567890 一二三四五 ''' msg = to_unicode(msg, encoding=encoding, errors=errors) width = textual_width(msg) if width <= chop: return msg maximum = len(msg) if maximum > chop * 2: # A character can take at most 2 cell positions so this is the actual # maximum maximum = chop * 2 minimum = 0 eos = maximum if eos > chop: eos = chop width = textual_width(msg[:eos]) while True: # if current width is high, if width > chop: # calculate new midpoint mid = minimum + (eos - minimum) / 2 if mid == eos: break if (eos - chop) < (eos - mid): while width > chop: width = width - _ucp_width(ord(msg[eos-1])) eos -= 1 return msg[:eos] # subtract distance between eos and mid from width width = width - textual_width(msg[mid:eos]) maximum = eos eos = mid # if current width is low, elif width < chop: # Note: at present, the if (eos - chop) < (eos - mid): # short-circuit above means that we never use this branch. # calculate new midpoint mid = eos + (maximum - eos) / 2 if mid == eos: break if (chop - eos) < (mid - eos): while width < chop: new_width = _ucp_width(ord(msg[eos])) width = width + new_width eos += 1 return msg[:eos] # add distance between eos and new mid to width width = width + textual_width(msg[eos:mid]) minimum = eos eos = mid if eos > maximum: eos = maximum break # if current is just right else: return msg[:eos] return msg[:eos] # I made some adjustments for using unicode but largely unchanged from JA's # port of MK's code -Toshio def textual_width_fill(msg, fill, chop=None, left=True, prefix='', suffix=''): '''Expand a :class:`unicode` string to a specified :term:`textual width` or chop to same :arg msg: :class:`unicode` string to format :arg fill: pad string until the :term:`textual width` of the string is this length :kwarg chop: before doing anything else, chop the string to this length. Default: Don't chop the string at all :kwarg left: If :data:`True` (default) left justify the string and put the padding on the right. If :data:`False`, pad on the left side. :kwarg prefix: Attach this string before the field we're filling :kwarg suffix: Append this string to the end of the field we're filling :rtype: :class:`unicode` string :returns: :attr:`msg` formatted to fill the specified width. If no :attr:`chop` is specified, the string could exceed the fill length when completed. If :attr:`prefix` or :attr:`suffix` are printable characters, the string could be longer than the fill width. .. note:: :attr:`prefix` and :attr:`suffix` should be used for "invisible" characters like highlighting, color changing escape codes, etc. The fill characters are appended outside of any :attr:`prefix` or :attr:`suffix` elements. This allows you to only highlight :attr:`msg` inside of the field you're filling. .. warning:: :attr:`msg`, :attr:`prefix`, and :attr:`suffix` should all be representable as unicode characters. In particular, any escape sequences in :attr:`prefix` and :attr:`suffix` need to be convertible to :class:`unicode`. If you need to use byte sequences here rather than unicode characters, use :func:`~kitchen.text.display.byte_string_textual_width_fill` instead. This function expands a string to fill a field of a particular :term:`textual width`. Use it instead of ``%*.*s``, as it does the "right" thing with regard to :term:`UTF-8` sequences, :term:`control characters`, and characters that take more than one cell position in a display. Example usage:: >>> msg = u'一二三四五六七八九十' >>> # Wrong: This uses 10 characters instead of 10 cells: >>> u":%-*.*s:" % (10, 10, msg[:9]) :一二三四五六七八九 : >>> # This uses 10 cells like we really want: >>> u":%s:" % (textual_width_fill(msg[:9], 10, 10)) :一二三四五: >>> # Wrong: Right aligned in the field, but too many cells >>> u"%20.10s" % (msg) 一二三四五六七八九十 >>> # Correct: Right aligned with proper number of cells >>> u"%s" % (textual_width_fill(msg, 20, 10, left=False)) 一二三四五 >>> # Wrong: Adding some escape characters to highlight the line but too many cells >>> u"%s%20.10s%s" % (prefix, msg, suffix) u'\x1b[7m 一二三四五六七八九十\x1b[0m' >>> # Correct highlight of the line >>> u"%s%s%s" % (prefix, display.textual_width_fill(msg, 20, 10, left=False), suffix) u'\x1b[7m 一二三四五\x1b[0m' >>> # Correct way to not highlight the fill >>> u"%s" % (display.textual_width_fill(msg, 20, 10, left=False, prefix=prefix, suffix=suffix)) u' \x1b[7m一二三四五\x1b[0m' ''' msg = to_unicode(msg) if chop is not None: msg = textual_width_chop(msg, chop) width = textual_width(msg) if width >= fill: if prefix or suffix: msg = u''.join([prefix, msg, suffix]) else: extra = u' ' * (fill - width) if left: msg = u''.join([prefix, msg, suffix, extra]) else: msg = u''.join([extra, prefix, msg, suffix]) return msg def _textual_width_le(width, *args): '''Optimize the common case when deciding which :term:`textual width` is larger :arg width: :term:`textual width` to compare against. :arg \*args: :class:`unicode` strings to check the total :term:`textual width` of :returns: :data:`True` if the total length of :attr:`args` are less than or equal to :attr:`width`. Otherwise :data:`False`. We often want to know "does X fit in Y". It takes a while to use :func:`textual_width` to calculate this. However, we know that the number of canonically composed :class:`unicode` characters is always going to have 1 or 2 for the :term:`textual width` per character. With this we can take the following shortcuts: 1) If the number of canonically composed characters is more than width, the true :term:`textual width` cannot be less than width. 2) If the number of canonically composed characters * 2 is less than the width then the :term:`textual width` must be ok. :term:`textual width` of a canonically composed :class:`unicode` string will always be greater than or equal to the the number of :class:`unicode` characters. So we can first check if the number of composed :class:`unicode` characters is less than the asked for width. If it is we can return :data:`True` immediately. If not, then we must do a full :term:`textual width` lookup. ''' string = ''.join(args) string = unicodedata.normalize('NFC', string) if len(string) > width: return False elif len(string) * 2 <= width: return True elif len(to_bytes(string)) <= width: # Check against bytes. # utf8 has the property of having the same amount or more bytes per # character than textual width. return True else: true_width = textual_width(string) return true_width <= width def wrap(text, width=70, initial_indent=u'', subsequent_indent=u'', encoding='utf-8', errors='replace'): '''Works like we want :func:`textwrap.wrap` to work, :arg text: :class:`unicode` string or byte :class:`str` to wrap :kwarg width: :term:`textual width` at which to wrap. Default: 70 :kwarg initial_indent: string to use to indent the first line. Default: do not indent. :kwarg subsequent_indent: string to use to wrap subsequent lines. Default: do not indent :kwarg encoding: Encoding to use if :attr:`text` is a byte :class:`str` :kwarg errors: error handler to use if :attr:`text` is a byte :class:`str` and contains some undecodable characters. :rtype: :class:`list` of :class:`unicode` strings :returns: list of lines that have been text wrapped and indented. :func:`textwrap.wrap` from the |stdlib|_ has two drawbacks that this attempts to fix: 1. It does not handle :term:`textual width`. It only operates on bytes or characters which are both inadequate (due to multi-byte and double width characters). 2. It malforms lists and blocks. ''' # Tested with: # yum info robodoc gpicview php-pear-Net-Socket wmctrl ustr moreutils # mediawiki-HNP ocspd insight yum mousepad # ...at 120, 80 and 40 chars. # Also, notable among lots of others, searching for "\n ": # exim-clamav, jpackage-utils, tcldom, synaptics, "quake3", # perl-Class-Container, ez-ipupdate, perl-Net-XMPP, "kipi-plugins", # perl-Apache-DBI, netcdf, python-configobj, "translate-toolkit", alpine, # "udunits", "conntrack-tools" # # Note that, we "fail" on: # alsa-plugins-jack, setools*, dblatex, uisp, "perl-Getopt-GUI-Long", # suitesparse, "synce-serial", writer2latex, xenwatch, ltsp-utils def _indent_at_beg(line): '''Return the indent to use for this and (possibly) subsequent lines :arg line: :class:`unicode` line of text to process :rtype: tuple :returns: tuple of count of whitespace before getting to the start of this line followed by a count to the following indent if this block of text is an entry in a list. ''' # Find the first non-whitespace character try: char = line.strip()[0] except IndexError: # All whitespace return 0, 0 else: count = line.find(char) # if we have a bullet character, check for list if char not in u'-*.o\u2022\u2023\u2218': # No bullet; not a list return count, 0 # List: Keep searching until we hit the innermost list nxt = _indent_at_beg(line[count+1:]) nxt = nxt[1] or nxt[0] if nxt: return count, count + 1 + nxt return count, 0 initial_indent = to_unicode(initial_indent, encoding=encoding, errors=errors) subsequent_indent = to_unicode(subsequent_indent, encoding=encoding, errors=errors) subsequent_indent_width = textual_width(subsequent_indent) text = to_unicode(text, encoding=encoding, errors=errors).rstrip(u'\n') lines = text.expandtabs().split(u'\n') ret = [] indent = initial_indent wrap_last = False cur_sab = 0 cur_spc_indent = 0 for line in lines: line = line.rstrip(u' ') (last_sab, last_spc_indent) = (cur_sab, cur_spc_indent) (cur_sab, cur_spc_indent) = _indent_at_beg(line) force_nl = False # We want to stop wrapping under "certain" conditions: if wrap_last and cur_spc_indent: # if line starts a list or force_nl = True if wrap_last and cur_sab == len(line):# is empty line force_nl = True if wrap_last and not last_spc_indent: # if we don't continue a list if cur_sab >= 4 and cur_sab != last_sab: # and is "block indented" force_nl = True if force_nl: ret.append(indent.rstrip(u' ')) indent = subsequent_indent wrap_last = False if cur_sab == len(line): # empty line, remove spaces to make it easier. line = u'' if wrap_last: line = line.lstrip(u' ') cur_spc_indent = last_spc_indent if _textual_width_le(width, indent, line): wrap_last = False ret.append(indent + line) indent = subsequent_indent continue wrap_last = True words = line.split(u' ') line = indent spcs = cur_spc_indent if not spcs and cur_sab >= 4: spcs = cur_sab for word in words: if (not _textual_width_le(width, line, word) and textual_width(line) > subsequent_indent_width): ret.append(line.rstrip(u' ')) line = subsequent_indent + u' ' * spcs line += word line += u' ' indent = line.rstrip(u' ') + u' ' if wrap_last: ret.append(indent.rstrip(u' ')) return ret def fill(text, *args, **kwargs): '''Works like we want :func:`textwrap.fill` to work :arg text: :class:`unicode` string or byte :class:`str` to process :returns: :class:`unicode` string with each line separated by a newline .. seealso:: :func:`kitchen.text.display.wrap` for other parameters that you can give this command. This function is a light wrapper around :func:`kitchen.text.display.wrap`. Where that function returns a :class:`list` of lines, this function returns one string with each line separated by a newline. ''' return u'\n'.join(wrap(text, *args, **kwargs)) # # Byte strings # def byte_string_textual_width_fill(msg, fill, chop=None, left=True, prefix='', suffix='', encoding='utf-8', errors='replace'): '''Expand a byte :class:`str` to a specified :term:`textual width` or chop to same :arg msg: byte :class:`str` encoded in :term:`UTF-8` that we want formatted :arg fill: pad :attr:`msg` until the :term:`textual width` is this long :kwarg chop: before doing anything else, chop the string to this length. Default: Don't chop the string at all :kwarg left: If :data:`True` (default) left justify the string and put the padding on the right. If :data:`False`, pad on the left side. :kwarg prefix: Attach this byte :class:`str` before the field we're filling :kwarg suffix: Append this byte :class:`str` to the end of the field we're filling :rtype: byte :class:`str` :returns: :attr:`msg` formatted to fill the specified :term:`textual width`. If no :attr:`chop` is specified, the string could exceed the fill length when completed. If :attr:`prefix` or :attr:`suffix` are printable characters, the string could be longer than fill width. .. note:: :attr:`prefix` and :attr:`suffix` should be used for "invisible" characters like highlighting, color changing escape codes, etc. The fill characters are appended outside of any :attr:`prefix` or :attr:`suffix` elements. This allows you to only highlight :attr:`msg` inside of the field you're filling. .. seealso:: :func:`~kitchen.text.display.textual_width_fill` For example usage. This function has only two differences. 1. it takes byte :class:`str` for :attr:`prefix` and :attr:`suffix` so you can pass in arbitrary sequences of bytes, not just unicode characters. 2. it returns a byte :class:`str` instead of a :class:`unicode` string. ''' prefix = to_bytes(prefix, encoding=encoding, errors=errors) suffix = to_bytes(suffix, encoding=encoding, errors=errors) if chop is not None: msg = textual_width_chop(msg, chop, encoding=encoding, errors=errors) width = textual_width(msg) msg = to_bytes(msg) if width >= fill: if prefix or suffix: msg = ''.join([prefix, msg, suffix]) else: extra = ' ' * (fill - width) if left: msg = ''.join([prefix, msg, suffix, extra]) else: msg = ''.join([extra, prefix, msg, suffix]) return msg __all__ = ('byte_string_textual_width_fill', 'fill', 'textual_width', 'textual_width_chop', 'textual_width_fill', 'wrap') PK[R;'site-packages/kitchen/text/__init__.pycnu[ i:Oc@s2dZddlmZd ZeeZd ZdS( s ------------ Kitchen.text ------------ Kitchen.text contains functions for manipulating text in python. This includes things like converting between byte strings and unicode, and displaying text on the screen. i(tversion_tuple_to_stringiit converterst exceptionstmiscN(iii((iii(Rs exceptionsR(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s9/usr/lib/python2.7/site-packages/kitchen/text/__init__.pyt s PK[Ps)site-packages/kitchen/text/converters.pyonu[ i:Oc@sdZyddlmZmZWn'ek rIddlmZmZnXddlZddlZddlZ ddl Z ddl m Z e jddlmZmZddlmZmZmZedFZedGZdd ddd!Zdd ddd"Zd#Zd d$d%Zd&Zd'd(fZd)efZ ed*Z!ed+Z"de#d d,Z$dd d-Z%dd de#d d.Z&dd dd/Z'd0Z(d1Z)de#d d2Z*de#d3d4Z+dHZ,dS(Is! Functions to handle conversion of byte :class:`str` and :class:`unicode` strings. .. versionchanged:: kitchen 0.2a2 ; API kitchen.text 2.0.0 Added :func:`~kitchen.text.converters.getwriter` .. versionchanged:: kitchen 0.2.2 ; API kitchen.text 2.1.0 Added :func:`~kitchen.text.converters.exception_to_unicode`, :func:`~kitchen.text.converters.exception_to_bytes`, :data:`~kitchen.text.converters.EXCEPTION_CONVERTERS`, and :data:`~kitchen.text.converters.BYTE_EXCEPTION_CONVERTERS` .. versionchanged:: kitchen 1.0.1 ; API kitchen.text 2.1.1 Deprecated :data:`~kitchen.text.converters.BYTE_EXCEPTION_CONVERTERS` as we've simplified :func:`~kitchen.text.converters.exception_to_unicode` and :func:`~kitchen.text.converters.exception_to_bytes` to make it unnecessary i(t b64encodet b64decodeN(tsets(tControlCharErrortXmlEncodeError(tguess_encodingthtml_entities_unescapetprocess_control_charssutf-8sUTF-8tutf8tUTF8tutf_8tUTF_8tutftUTFtu8tU8slatin-1sLATIN-1tlatin1tLATIN1tlatintLATINtl1tL1tcp819tCP819t8859s iso8859-1s ISO8859-1s iso-8859-1s ISO-8859-1treplacecCs+t|trjt|tr"|S|tkr>t|d|S|tkrZt|d|S|j||S|rtjtj dt dd|s|}qn|sd}n|dkrdS|d kr|S|dkry|j }Wnt t fk r d}nX|siyt|}Wqit k rey|j}Wqft t fk rad}qfXqiXnt|tst|||S|S|dkrt|}t|tst|||}n|d kr|Sttj d i|j|d d6nttj di|d6dS(s} Convert an object into a :class:`unicode` string :arg obj: Object to convert to a :class:`unicode` string. This should normally be a byte :class:`str` :kwarg encoding: What encoding to try converting the byte :class:`str` as. Defaults to :term:`utf-8` :kwarg errors: If errors are found while decoding, perform this action. Defaults to ``replace`` which replaces the invalid bytes with a character that means the bytes were unable to be decoded. Other values are the same as the error handling schemes in the `codec base classes `_. For instance ``strict`` which raises an exception and ``ignore`` which simply omits the non-decodable characters. :kwarg nonstring: How to treat nonstring values. Possible values are: :simplerepr: Attempt to call the object's "simple representation" method and return that value. Python-2.3+ has two methods that try to return a simple representation: :meth:`object.__unicode__` and :meth:`object.__str__`. We first try to get a usable value from :meth:`object.__unicode__`. If that fails we try the same with :meth:`object.__str__`. :empty: Return an empty :class:`unicode` string :strict: Raise a :exc:`TypeError` :passthru: Return the object unchanged :repr: Attempt to return a :class:`unicode` string of the repr of the object Default is ``simplerepr`` :kwarg non_string: *Deprecated* Use :attr:`nonstring` instead :raises TypeError: if :attr:`nonstring` is ``strict`` and a non-:class:`basestring` object is passed in or if :attr:`nonstring` is set to an unknown value :raises UnicodeDecodeError: if :attr:`errors` is ``strict`` and :attr:`obj` is not decodable using the given encoding :returns: :class:`unicode` string or the original object depending on the value of :attr:`nonstring`. Usually this should be used on a byte :class:`str` but it can take both byte :class:`str` and :class:`unicode` strings intelligently. Nonstring objects are handled in different ways depending on the setting of the :attr:`nonstring` parameter. The default values of this function are set so as to always return a :class:`unicode` string and never raise an error when converting from a byte :class:`str` to a :class:`unicode` string. However, when you do not pass validly encoded text (or a nonstring object), you may end up with output that you don't expect. Be sure you understand the requirements of your data, not just ignore errors by passing it through this function. .. versionchanged:: 0.2.1a2 Deprecated :attr:`non_string` in favor of :attr:`nonstring` parameter and changed default value to ``simplerepr`` sutf-8slatin-1sLnon_string is a deprecated parameter of to_unicode(). Use nonstring insteadt stacklevelit simplereprtemptyutpassthrutreprtstrictsWto_unicode was given "%(obj)s" which is neither a byte string (str) or a unicode stringRtobjs8nonstring value, %(param)s, is not set to a valid actiontparamN(sreprsstrict(t isinstancet basestringtunicodet _UTF8_ALIASESt_LATIN1_ALIASEStdecodetwarningstwarntktb_tDeprecationWarningt __unicode__tAttributeErrort UnicodeErrortNonetstrt__str__Rt TypeErrortencode(R tencodingterrorst nonstringt non_stringtsimpletobj_repr((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt to_unicodeIs\9             cCst|tr2t|tr"|S|j||S|ritjtjdtdd|si|}qin|sxd}n|dkrdS|dkr|S|dkrYyt|}WnAt k ry|j }Wqt t fk rd}qXnX|s1y|j }Wq1t t fk r-d}q1Xnt|trU|j|d}n|S|dkry|j}Wnt t fk rd}nXt|tr|j||}n t|}|d kr|Sttjd i|d 6nttjd i|d6dS(s Convert an object into a byte :class:`str` :arg obj: Object to convert to a byte :class:`str`. This should normally be a :class:`unicode` string. :kwarg encoding: Encoding to use to convert the :class:`unicode` string into a byte :class:`str`. Defaults to :term:`utf-8`. :kwarg errors: If errors are found while encoding, perform this action. Defaults to ``replace`` which replaces the invalid bytes with a character that means the bytes were unable to be encoded. Other values are the same as the error handling schemes in the `codec base classes `_. For instance ``strict`` which raises an exception and ``ignore`` which simply omits the non-encodable characters. :kwarg nonstring: How to treat nonstring values. Possible values are: :simplerepr: Attempt to call the object's "simple representation" method and return that value. Python-2.3+ has two methods that try to return a simple representation: :meth:`object.__unicode__` and :meth:`object.__str__`. We first try to get a usable value from :meth:`object.__str__`. If that fails we try the same with :meth:`object.__unicode__`. :empty: Return an empty byte :class:`str` :strict: Raise a :exc:`TypeError` :passthru: Return the object unchanged :repr: Attempt to return a byte :class:`str` of the :func:`repr` of the object Default is ``simplerepr``. :kwarg non_string: *Deprecated* Use :attr:`nonstring` instead. :raises TypeError: if :attr:`nonstring` is ``strict`` and a non-:class:`basestring` object is passed in or if :attr:`nonstring` is set to an unknown value. :raises UnicodeEncodeError: if :attr:`errors` is ``strict`` and all of the bytes of :attr:`obj` are unable to be encoded using :attr:`encoding`. :returns: byte :class:`str` or the original object depending on the value of :attr:`nonstring`. .. warning:: If you pass a byte :class:`str` into this function the byte :class:`str` is returned unmodified. It is **not** re-encoded with the specified :attr:`encoding`. The easiest way to achieve that is:: to_bytes(to_unicode(text), encoding='utf-8') The initial :func:`to_unicode` call will ensure text is a :class:`unicode` string. Then, :func:`to_bytes` will turn that into a byte :class:`str` with the specified encoding. Usually, this should be used on a :class:`unicode` string but it can take either a byte :class:`str` or a :class:`unicode` string intelligently. Nonstring objects are handled in different ways depending on the setting of the :attr:`nonstring` parameter. The default values of this function are set so as to always return a byte :class:`str` and never raise an error when converting from unicode to bytes. However, when you do not pass an encoding that can validly encode the object (or a non-string object), you may end up with output that you don't expect. Be sure you understand the requirements of your data, not just ignore errors by passing it through this function. .. versionchanged:: 0.2.1a2 Deprecated :attr:`non_string` in favor of :attr:`nonstring` parameter and changed default value to ``simplerepr`` sJnon_string is a deprecated parameter of to_bytes(). Use nonstring insteadRiRRtRRRRsUto_bytes was given "%(obj)s" which is neither a unicode string or a byte string (str)R s8nonstring value, %(param)s, is not set to a valid actionR!N(sreprsstrict(R"R#R1R4R(R)R*R+R,R/R2R.R0R-R$t__repr__R3(R R5R6R7R8R9R:((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_bytess\E           cCs&dtjfdY}||_|S(sReturn a :class:`codecs.StreamWriter` that resists tracing back. :arg encoding: Encoding to use for transforming :class:`unicode` strings into byte :class:`str`. :rtype: :class:`codecs.StreamWriter` :returns: :class:`~codecs.StreamWriter` that you can instantiate to wrap output streams to automatically translate :class:`unicode` strings into :attr:`encoding`. This is a reimplemetation of :func:`codecs.getwriter` that returns a :class:`~codecs.StreamWriter` that resists issuing tracebacks. The :class:`~codecs.StreamWriter` that is returned uses :func:`kitchen.text.converters.to_bytes` to convert :class:`unicode` strings into byte :class:`str`. The departures from :func:`codecs.getwriter` are: 1) The :class:`~codecs.StreamWriter` that is returned will take byte :class:`str` as well as :class:`unicode` strings. Any byte :class:`str` will be passed through unmodified. 2) The default error handler for unknown bytes is to ``replace`` the bytes with the unknown character (``?`` in most ascii-based encodings, ``�`` in the utf encodings) whereas :func:`codecs.getwriter` defaults to ``strict``. Like :class:`codecs.StreamWriter`, the returned :class:`~codecs.StreamWriter` can have its error handler changed in code by setting ``stream.errors = 'new_handler_name'`` Example usage:: $ LC_ALL=C python >>> import sys >>> from kitchen.text.converters import getwriter >>> UTF8Writer = getwriter('utf-8') >>> unwrapped_stdout = sys.stdout >>> sys.stdout = UTF8Writer(unwrapped_stdout) >>> print 'caf\xc3\xa9' café >>> print u'caf\xe9' café >>> ASCIIWriter = getwriter('ascii') >>> sys.stdout = ASCIIWriter(unwrapped_stdout) >>> print 'caf\xc3\xa9' café >>> print u'caf\xe9' caf? .. seealso:: API docs for :class:`codecs.StreamWriter` and :func:`codecs.getwriter` and `Print Fails `_ on the python wiki. .. versionadded:: kitchen 0.2a2, API: kitchen.text 1.1.0 t _StreamWritercBs eZddZddZRS(RcSstjj|||dS(N(tcodecst StreamWritert__init__(tselftstreamR6((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyRBhscSs%t|d|jd|t|fS(NR5R6(R>R5tlen(RCtmsgR6((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyR4ks(t__name__t __module__RBR4(((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyR?as (R@RAR5(R5R?((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt getwriter,s5 RcCs;tjtjdtddt|ddd|d|S(s*Deprecated* Convert :class:`unicode` to an encoded :term:`utf-8` byte :class:`str`. You should be using :func:`to_bytes` instead:: to_bytes(obj, encoding='utf-8', non_string='passthru') skitchen.text.converters.to_utf8 is deprecated. Use kitchen.text.converters.to_bytes(obj, encoding="utf-8", nonstring="passthru" instead.RiR5sutf-8R6R7(R(R)R*R+R,R>(R R6R8((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_utf8rs cCs/tjtjdtddt|ddS(s*Deprecated* This function converts something to a byte :class:`str` if it isn't one. It's used to call :func:`str` or :func:`unicode` on the object to get its simple representation without danger of getting a :exc:`UnicodeError`. You should be using :func:`to_unicode` or :func:`to_bytes` explicitly instead. If you need :class:`unicode` strings:: to_unicode(obj, nonstring='simplerepr') If you need byte :class:`str`:: to_bytes(obj, nonstring='simplerepr') smto_str is deprecated. Use to_unicode or to_bytes instead. See the to_str docstring for porting information.RiR7R(R(R)R*R+R,R>(R ((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_strs cCs |jdS(Ni(targs(te((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytscCs|S(N((RM((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyRNscCst|jdS(Ni(R>RL(RM((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyRNscCs<d}x)|D]!}y||}Wnq XPq Wt|S(sConvert an exception object into a unicode representation :arg exc: Exception object to convert :kwarg converters: List of functions to use to convert the exception into a string. See :data:`EXCEPTION_CONVERTERS` for the default value and an example of adding other converters to the defaults. The functions in the list are tried one at a time to see if they can extract a string from the exception. The first one to do so without raising an exception is used. :returns: :class:`unicode` string representation of the exception. The value extracted by the :attr:`converters` will be converted into :class:`unicode` before being returned using the :term:`utf-8` encoding. If you know you need to use an alternate encoding add a function that does that to the list of functions in :attr:`converters`) .. versionadded:: 0.2.2 u%(R;(texct convertersRFtfunc((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytexception_to_unicodes cCs<d}x)|D]!}y||}Wnq XPq Wt|S(s;Convert an exception object into a str representation :arg exc: Exception object to convert :kwarg converters: List of functions to use to convert the exception into a string. See :data:`EXCEPTION_CONVERTERS` for the default value and an example of adding other converters to the defaults. The functions in the list are tried one at a time to see if they can extract a string from the exception. The first one to do so without raising an exception is used. :returns: byte :class:`str` representation of the exception. The value extracted by the :attr:`converters` will be converted into :class:`str` before being returned using the :term:`utf-8` encoding. If you know you need to use an alternate encoding add a function that does that to the list of functions in :attr:`converters`) .. versionadded:: 0.2.2 .. versionchanged:: 1.0.1 Code simplification allowed us to switch to using :data:`EXCEPTION_CONVERTERS` as the default value of :attr:`converters`. s%(R>(RORPRFRQ((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytexception_to_bytess cCs|s dSyt|d|Wnptk rFttjdnKtk rkttjdn&tk r}t|jdnX|j|d}|rt j j j |didd 6}nt j j j |}|S( sdTake a :class:`unicode` string and turn it into a byte :class:`str` suitable for xml :arg string: :class:`unicode` string to encode into an XML compatible byte :class:`str` :kwarg encoding: encoding to use for the returned byte :class:`str`. Default is to encode to :term:`UTF-8`. If some of the characters in :attr:`string` are not encodable in this encoding, the unknown characters will be entered into the output string using xml character references. :kwarg attrib: If :data:`True`, quote the string for use in an xml attribute. If :data:`False` (default), quote for use in an xml text field. :kwarg control_chars: :term:`control characters` are not allowed in XML documents. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the control characters with ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an :exc:`~kitchen.text.exceptions.XmlEncodeError` when we encounter a :term:`control character` :raises kitchen.text.exceptions.XmlEncodeError: If :attr:`control_chars` is set to ``strict`` and the string to be made suitable for output to xml contains :term:`control characters` or if :attr:`string` is not a :class:`unicode` string then we raise this exception. :raises ValueError: If :attr:`control_chars` is set to something other than ``replace``, ``ignore``, or ``strict``. :rtype: byte :class:`str` :returns: representation of the :class:`unicode` string as a valid XML byte :class:`str` XML files consist mainly of text encoded using a particular charset. XML also denies the use of certain bytes in the encoded text (example: ``ASCII Null``). There are also special characters that must be escaped if they are present in the input (example: ``<``). This function takes care of all of those issues for you. There are a few different ways to use this function depending on your needs. The simplest invocation is like this:: unicode_to_xml(u'String with non-ASCII characters: <"á と">') This will return the following to you, encoded in :term:`utf-8`:: 'String with non-ASCII characters: <"á と">' Pretty straightforward. Now, what if you need to encode your document in something other than :term:`utf-8`? For instance, ``latin-1``? Let's see:: unicode_to_xml(u'String with non-ASCII characters: <"á と">', encoding='latin-1') 'String with non-ASCII characters: <"á と">' Because the ``と`` character is not available in the ``latin-1`` charset, it is replaced with ``と`` in our output. This is an xml character reference which represents the character at unicode codepoint ``12392``, the ``と`` character. When you want to reverse this, use :func:`xml_to_unicode` which will turn a byte :class:`str` into a :class:`unicode` string and replace the xml character references with the unicode characters. XML also has the quirk of not allowing :term:`control characters` in its output. The :attr:`control_chars` parameter allows us to specify what to do with those. For use cases that don't need absolute character by character fidelity (example: holding strings that will just be used for display in a GUI app later), the default value of ``replace`` works well:: unicode_to_xml(u'String with disallowed control chars: \u0000\u0007') 'String with disallowed control chars: ??' If you do need to be able to reproduce all of the characters at a later date (examples: if the string is a key value in a database or a path on a filesystem) you have many choices. Here are a few that rely on ``utf-7``, a verbose encoding that encodes :term:`control characters` (as well as non-:term:`ASCII` unicode values) to characters from within the :term:`ASCII` printable characters. The good thing about doing this is that the code is pretty simple. You just need to use ``utf-7`` both when encoding the field for xml and when decoding it for use in your python program:: unicode_to_xml(u'String with unicode: と and control char: \u0007', encoding='utf7') 'String with unicode: +MGg and control char: +AAc-' # [...] xml_to_unicode('String with unicode: +MGg and control char: +AAc-', encoding='utf7') u'String with unicode: と and control char: \u0007' As you can see, the ``utf-7`` encoding will transform even characters that would be representable in :term:`utf-8`. This can be a drawback if you want unicode characters in the file to be readable without being decoded first. You can work around this with increased complexity in your application code:: encoding = 'utf-8' u_string = u'String with unicode: と and control char: \u0007' try: # First attempt to encode to utf8 data = unicode_to_xml(u_string, encoding=encoding, errors='strict') except XmlEncodeError: # Fallback to utf-7 encoding = 'utf-7' data = unicode_to_xml(u_string, encoding=encoding, errors='strict') write_tag('%s' % (encoding, data)) # [...] encoding = tag.attributes.encoding u_string = xml_to_unicode(u_string, encoding=encoding) Using code similar to that, you can have some fields encoded using your default encoding and fallback to ``utf-7`` if there are :term:`control characters` present. .. note:: If your goal is to preserve the :term:`control characters` you cannot save the entire file as ``utf-7`` and set the xml encoding parameter to ``utf-7`` if your goal is to preserve the :term:`control characters`. Because XML doesn't allow :term:`control characters`, you have to encode those separate from any encoding work that the XML parser itself knows about. .. seealso:: :func:`bytes_to_xml` if you're dealing with bytes that are non-text or of an unknown encoding that you must preserve on a byte for byte level. :func:`guess_encoding_to_xml` if you're dealing with strings in unknown encodings that you don't need to save with char-for-char fidelity. R<tstrategysiunicode_to_xml must have a unicode type as the first argument. Use bytes_string_to_xml for byte strings.sVThe control_chars argument to unicode_to_xml must be one of ignore, replace, or strictitxmlcharrefreplacetentitiess"t"( RR3RR*R+t ValueErrorRRLR4txmltsaxtsaxutilstescape(tstringR5tattribt control_charsRO((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytunicode_to_xml#s  %cCs(t|d|d|}t|}|S(s Transform a byte :class:`str` from an xml file into a :class:`unicode` string :arg byte_string: byte :class:`str` to decode :kwarg encoding: encoding that the byte :class:`str` is in :kwarg errors: What to do if not every character is valid in :attr:`encoding`. See the :func:`to_unicode` documentation for legal values. :rtype: :class:`unicode` string :returns: string decoded from :attr:`byte_string` This function attempts to reverse what :func:`unicode_to_xml` does. It takes a byte :class:`str` (presumably read in from an xml file) and expands all the html entities into unicode characters and decodes the byte :class:`str` into a :class:`unicode` string. One thing it cannot do is restore any :term:`control characters` that were removed prior to inserting into the file. If you need to keep such characters you need to use :func:`xml_to_bytes` and :func:`bytes_to_xml` or use on of the strategies documented in :func:`unicode_to_xml` instead. R5R6(R;R(t byte_stringR5R6R]((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytxml_to_unicodes cCsUt|ts'ttjdnt|||}t|d|d|d|S(s Make sure a byte :class:`str` is validly encoded for xml output :arg byte_string: Byte :class:`str` to turn into valid xml output :kwarg input_encoding: Encoding of :attr:`byte_string`. Default ``utf-8`` :kwarg errors: How to handle errors encountered while decoding the :attr:`byte_string` into :class:`unicode` at the beginning of the process. Values are: :replace: (default) Replace the invalid bytes with a ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an :exc:`UnicodeDecodeError` when we encounter a non-decodable character :kwarg output_encoding: Encoding for the xml file that this string will go into. Default is ``utf-8``. If all the characters in :attr:`byte_string` are not encodable in this encoding, the unknown characters will be entered into the output string using xml character references. :kwarg attrib: If :data:`True`, quote the string for use in an xml attribute. If :data:`False` (default), quote for use in an xml text field. :kwarg control_chars: XML does not allow :term:`control characters`. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the :term:`control characters` with ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an error when we encounter a :term:`control character` :raises XmlEncodeError: If :attr:`control_chars` is set to ``strict`` and the string to be made suitable for output to xml contains :term:`control characters` then we raise this exception. :raises UnicodeDecodeError: If errors is set to ``strict`` and the :attr:`byte_string` contains bytes that are not decodable using :attr:`input_encoding`, this error is raised :rtype: byte :class:`str` :returns: representation of the byte :class:`str` in the output encoding with any bytes that aren't available in xml taken care of. Use this when you have a byte :class:`str` representing text that you need to make suitable for output to xml. There are several cases where this is the case. For instance, if you need to transform some strings encoded in ``latin-1`` to :term:`utf-8` for output:: utf8_string = byte_string_to_xml(latin1_string, input_encoding='latin-1') If you already have strings in the proper encoding you may still want to use this function to remove :term:`control characters`:: cleaned_string = byte_string_to_xml(string, input_encoding='utf-8', output_encoding='utf-8') .. seealso:: :func:`unicode_to_xml` for other ideas on using this function smbyte_string_to_xml can only take a byte string as its first argument. Use unicode_to_xml for unicode stringsR5R^R_(R"R1RR*R+R$R`(Ratinput_encodingR6toutput_encodingR^R_tu_string((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytbyte_string_to_xmls 9cCs"t|||}t|||S(s=Transform a byte :class:`str` from an xml file into :class:`unicode` string :arg byte_string: byte :class:`str` to decode :kwarg input_encoding: encoding that the byte :class:`str` is in :kwarg errors: What to do if not every character is valid in :attr:`encoding`. See the :func:`to_unicode` docstring for legal values. :kwarg output_encoding: Encoding for the output byte :class:`str` :returns: :class:`unicode` string decoded from :attr:`byte_string` This function attempts to reverse what :func:`unicode_to_xml` does. It takes a byte :class:`str` (presumably read in from an xml file) and expands all the html entities into unicode characters and decodes the byte :class:`str` into a :class:`unicode` string. One thing it cannot do is restore any :term:`control characters` that were removed prior to inserting into the file. If you need to keep such characters you need to use :func:`xml_to_bytes` and :func:`bytes_to_xml` or use one of the strategies documented in :func:`unicode_to_xml` instead. (RbR>(RaRcR6RdR]((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytxml_to_byte_stringscOst|||S(s3Return a byte :class:`str` encoded so it is valid inside of any xml file :arg byte_string: byte :class:`str` to transform :arg \*args, \*\*kwargs: extra arguments to this function are passed on to the function actually implementing the encoding. You can use this to tweak the output in some cases but, as a general rule, you shouldn't because the underlying encoding function is not guaranteed to remain the same. :rtype: byte :class:`str` consisting of all :term:`ASCII` characters :returns: byte :class:`str` representation of the input. This will be encoded using base64. This function is made especially to put binary information into xml documents. This function is intended for encoding things that must be preserved byte-for-byte. If you want to encode a byte string that's text and don't mind losing the actual bytes you probably want to try :func:`byte_string_to_xml` or :func:`guess_encoding_to_xml` instead. .. note:: Although the current implementation uses :func:`base64.b64encode` and there's no plans to change it, that isn't guaranteed. If you want to make sure that you can encode and decode these messages it's best to use :func:`xml_to_bytes` if you use this function to encode. (R(RaRLtkwargs((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt bytes_to_xml4scOst|||S(sDecode a string encoded using :func:`bytes_to_xml` :arg byte_string: byte :class:`str` to transform. This should be a base64 encoded sequence of bytes originally generated by :func:`bytes_to_xml`. :arg \*args, \*\*kwargs: extra arguments to this function are passed on to the function actually implementing the encoding. You can use this to tweak the output in some cases but, as a general rule, you shouldn't because the underlying encoding function is not guaranteed to remain the same. :rtype: byte :class:`str` :returns: byte :class:`str` that's the decoded input If you've got fields in an xml document that were encoded with :func:`bytes_to_xml` then you want to use this function to undecode them. It converts a base64 encoded string into a byte :class:`str`. .. note:: Although the current implementation uses :func:`base64.b64decode` and there's no plans to change it, that isn't guaranteed. If you want to make sure that you can encode and decode these messages it's best to use :func:`bytes_to_xml` if you use this function to decode. (R(RaRLRh((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt xml_to_bytesTsc Cs_t|tr+t|d|d|d|St|}t|d|ddd|d|d|S(sReturn a byte :class:`str` suitable for inclusion in xml :arg string: :class:`unicode` or byte :class:`str` to be transformed into a byte :class:`str` suitable for inclusion in xml. If string is a byte :class:`str` we attempt to guess the encoding. If we cannot guess, we fallback to ``latin-1``. :kwarg output_encoding: Output encoding for the byte :class:`str`. This should match the encoding of your xml file. :kwarg attrib: If :data:`True`, escape the item for use in an xml attribute. If :data:`False` (default) escape the item for use in a text node. :returns: :term:`utf-8` encoded byte :class:`str` R5R^R_RcR6RRd(R"R$R`RRf(R]RdR^R_Rc((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytguess_encoding_to_xmlns   tignorecCs;tjtjdtddt|d|d|d|S(s<*Deprecated*: Use :func:`guess_encoding_to_xml` instead sikitchen.text.converters.to_xml is deprecated. Use kitchen.text.converters.guess_encoding_to_xml instead.RiRdR^R_(R(R)R*R+R,Rk(R]R5R^R_((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_xmls tBYTE_EXCEPTION_CONVERTERStEXCEPTION_CONVERTERSRfRiRSRRRIRkR>RKR;RJRmR`RgRjRb( sutf-8sUTF-8sutf8R sutf_8R sutfR su8R(slatin-1sLATIN-1slatin1RslatinRsl1Rscp819Rs8859s iso8859-1s ISO8859-1s iso-8859-1s ISO-8859-1(sBYTE_EXCEPTION_CONVERTERSsEXCEPTION_CONVERTERSsbyte_string_to_xmls bytes_to_xmlsexception_to_bytessexception_to_unicodes getwritersguess_encoding_to_xmlsto_bytessto_strs to_unicodesto_utf8sto_xmlsunicode_to_xmlsxml_to_byte_strings xml_to_bytessxml_to_unicode(-t__doc__tbase64RRt ImportErrortkitchen.pycompat24.base64R@R(txml.sax.saxutilsRYtkitchenR*tkitchen.pycompat24Rtadd_builtin_settkitchen.text.exceptionsRRtkitchen.text.miscRRRt frozensetR%R&R0R;R>RIRJRKRoRnRRRStFalseR`RbRfRgRiRjRkRmt__all__(((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt+s\          k  v F 8  $ B    PK[[\#site-packages/kitchen/text/utf8.pyonu[ i:Oc@sdZddlZddlmZddlmZmZddlmZddl m Z m Z m Z m Z mZmZdZdZdd Zded d d Zd d d d ZdZdZdZdS(s ----- UTF-8 ----- Functions for operating on byte :class:`str` encoded as :term:`UTF-8` .. note:: In many cases, it is better to convert to :class:`unicode`, operate on the strings, then convert back to :term:`UTF-8`. :class:`unicode` type can handle many of these functions itself. For those that it doesn't (removing control characters from length calculations, for instance) the code to do so with a :class:`unicode` type is often simpler. .. warning:: All of the functions in this module are deprecated. Most of them have been replaced with functions that operate on unicode values in :mod:`kitchen.text.display`. :func:`kitchen.text.utf8.utf8_valid` has been replaced with a function in :mod:`kitchen.text.misc`. iN(tb_(t to_unicodetto_bytes(tbyte_string_valid_encoding(t_textual_width_letbyte_string_textual_width_filltfillt textual_widthttextual_width_choptwrapcCs&tjtdtddt|S(s**Deprecated** Detect if a string is valid :term:`utf-8` Use :func:`kitchen.text.misc.byte_string_valid_encoding` instead. sjkitchen.text.utf8.utf8_valid is deprecated. Use kitchen.text.misc.byte_string_valid_encoding(msg) insteadt stackleveli(twarningstwarnRtDeprecationWarningR(tmsg((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt utf8_valid@s cCs&tjtdtddt|S(s**Deprecated** Get the :term:`textual width` of a :term:`utf-8` string Use :func:`kitchen.text.display.textual_width` instead. s`kitchen.text.utf8.utf8_width is deprecated. Use kitchen.text.display.textual_width(msg) insteadR i(R R RR R(R((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt utf8_widthJs cCs|tjtdtdd|dkr8t||fSt|t }t||}|rlt |}nt||fS(sA**Deprecated** Return a string chopped to a given :term:`textual width` Use :func:`~kitchen.text.display.textual_width_chop` and :func:`~kitchen.text.display.textual_width` instead:: >>> msg = 'く ku ら ra と to み mi' >>> # Old way: >>> utf8_width_chop(msg, 5) (5, 'く ku') >>> # New way >>> from kitchen.text.converters import to_bytes >>> from kitchen.text.display import textual_width, textual_width_chop >>> (textual_width(msg), to_bytes(textual_width_chop(msg, 5))) (5, 'く ku') sekitchen.text.utf8.utf8_width_chop is deprecated. Use kitchen.text.display.textual_width_chop insteadR iN( R R RR tNoneRt isinstancetunicodeRR(Rtchoptas_bytest chopped_msg((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_width_chopUs tc CsAtjtdtddt||d|d|d|d|S(s**Deprecated** Pad a :term:`utf-8` string to fill a specified width Use :func:`~kitchen.text.display.byte_string_textual_width_fill` instead sqkitchen.text.utf8.utf8_width_fill is deprecated. Use kitchen.text.display.byte_string_textual_width_fill insteadR iRtlefttprefixtsuffix(R R RR R(RRRRRR((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_width_fillss iFcCstjtdtddt|t }t|}t|d|d|d|}|r~g|D]}t|^qc}n|S(s**Deprecated** Similar to :func:`textwrap.wrap` but understands :term:`utf-8` data and doesn't screw up lists/blocks/etc Use :func:`kitchen.text.display.wrap` instead sVkitchen.text.utf8.utf8_text_wrap is deprecated. Use kitchen.text.display.wrap insteadR itwidthtinitial_indenttsubsequent_indent( R R RR RRRR R(ttextRRRRtlinestm((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_text_wraps   "cOs,tjtdtddt|||S(s**Deprecated** Similar to :func:`textwrap.fill` but understands :term:`utf-8` strings and doesn't screw up lists/blocks/etc. Use :func:`kitchen.text.display.fill` instead. sVkitchen.text.utf8.utf8_text_fill is deprecated. Use kitchen.text.display.fill insteadR i(R R RR R(R targstkwargs((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_text_fills cGs8tjtdtddt|tdj|S(sx**Deprecated** Convert the arguments to unicode and use :func:`kitchen.text.display._textual_width_le` instead. sckitchen.text.utf8._utf8_width_le is deprecated. Use kitchen.text.display._textual_width_le insteadR iR(R R RR RRtjoin(RR$((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt_utf8_width_les R&R#RRRR(sutf8_text_fillsutf8_text_wraps utf8_valids utf8_widthsutf8_width_chopsutf8_width_fill(t__doc__R tkitchenRtkitchen.text.convertersRRtkitchen.text.miscRtkitchen.text.displayRRRRRR RRRRtTrueRR#R&R(t__all__(((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt2s .   PK[o\(site-packages/kitchen/text/exceptions.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010 Red Hat, Inc # # kitchen is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # kitchen is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with kitchen; if not, see # # Authors: # Toshio Kuratomi # ''' ----------------------- Kitchen.text exceptions ----------------------- Exception classes thrown by kitchen's text processing routines. ''' from kitchen import exceptions class XmlEncodeError(exceptions.KitchenError): '''Exception thrown by error conditions when encoding an xml string. ''' pass class ControlCharError(exceptions.KitchenError): '''Exception thrown when an ascii control character is encountered. ''' pass __all__ = ('XmlEncodeError', 'ControlCharError') PK[\&site-packages/kitchen/text/__init__.pynu[''' ------------ Kitchen.text ------------ Kitchen.text contains functions for manipulating text in python. This includes things like converting between byte strings and unicode, and displaying text on the screen. ''' from kitchen.versioning import version_tuple_to_string __version_info__ = ((2, 1, 1),) __version__ = version_tuple_to_string(__version_info__) __all__ = ('converters', 'exceptions', 'misc',) PK[{{&site-packages/kitchen/text/display.pyonu[ i:Oc@sdZddlZddlZddlmZddlmZmZddlm Z dZ d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfZ d%Z d&Z d'd(Zd'd)d*d+Zd)d*d,Zded-d-d.Zd/Zd0d1d1d)d*d2Zd3Zded-d-d)d*d4ZdZdS(s  ----------------------- Format Text for Display ----------------------- Functions related to displaying unicode text. Unicode characters don't all have the same width so we need helper functions for displaying them. .. versionadded:: 0.2 kitchen.display API 1.0.0 iN(tb_(t to_unicodetto_bytes(tControlCharErrorcCsd}t|d}|||dks>|||dkrBtSxd||kr||d}|||dkr|d}qE|||dkr|d}qEtSqEWtS(sBinary search in an interval table. :arg value: numeric value to search for :arg table: Ordered list of intervals. This is a list of two-tuples. The elements of the two-tuple define an interval's start and end points. :returns: If :attr:`value` is found within an interval in the :attr:`table` return :data:`True`. Otherwise, :data:`False` This function checks whether a numeric value is present within a table of intervals. It checks using a binary search algorithm, dividing the list of values in half and checking against the values until it determines whether the value is in the table. iii(tlentFalsetTrue(tvaluettabletminimumtmaximumtmid((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_interval_bisearchTs(  iioiiiiiiiiiiiiiiiKi^ipiiiiiiiii0iJiiiiiiii#i%i'i)i-i i i< iA iH iM iQ iT ib ic i i i i i i i i i i< iA iB iG iH iK iM ip iq i i i i i i i i i i i i< i? iA iC iM iV i i i i> i@ iF iH iJ iM iU iV i i i i i i i iA iC iM i i i i i1i4i:iGiNiiiiiiiiii5i7i9iqi~iiiiiiiiii-i0i2i6i7i9i:iXiYii`ii_iii2i4iRiSirisiiiiiiiii i ii i"i'i(i2i9i;iii`iui|iiii4i6i:i<iBiDikisii7iiiiiiiiiiii i i* i. i` ic ij io i i i,i,i-i-i*0i/0i0i0ioi|i}iiii i%i&iĨiii+i-iSiiiiiiiiiiiiiii i&iiiii i i i i i i8 i: i? iiieiiimiiiiiiBiDii iiicCsddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|f}g}t}g}xtdd}D]r}t||stjt|r|sD|g}t}qDq|rt}|j|d|j|qqW|rk|j||j|ntt j t|S(~seCombine Markus Kuhn's data with :mod:`unicodedata` to make combining char list :rtype: :class:`tuple` of tuples :returns: :class:`tuple` of intervals of :term:`code points` that are combining character. Each interval is a 2-:class:`tuple` of the starting :term:`code point` and the ending :term:`code point` for the combining characters. In normal use, this function serves to tell how we're generating the combining char list. For speed reasons, we use this to generate a static list and just use that later. Markus Kuhn's list of combining characters is more complete than what's in the python :mod:`unicodedata` library but the python :mod:`unicodedata` is synced against later versions of the unicode database This is used to generate the :data:`~kitchen.text.display._COMBINING` table. iioiiiiiiiiiiiiiiiiiKi^ipiiiiiiiii0iJiiiii i i< iA iH iM iQ iT ib ic i i i i i i i i i i< iA iB iG iH iK iM ip iq i i i i i i i i i i i i< i? iA iC iM iV i i i i> i@ iF iH iJ iM iU iV i i i i i i i iA iC iM i i i i i1i4i:iGiNiiiiiiiiii5i7i9iqi~iiiiiiiiii-i0i2i6i7i9iXiYi`ii_iii2i4iRiSirisiiiiiiiii i ii i"i'i(i2i9i;iiiii4i6i:i<iBikisiiiii i i* i. i` ic ij io i i i*0i/0i0i0ii i%i&iiii i#iiii i i i i i i8 i: i? igiiisiiiiiiBiDii iiiiii(iio(ii(ii(ii(ii(ii(ii(ii(ii(ii(iKi^(ipip(ii(ii(ii(ii(ii(i0iJ(ii(ii(i i (i< i< (iA iH (iM iM (iQ iT (ib ic (i i (i i (i i (i i (i i (i i (i< i< (iA iB (iG iH (iK iM (ip iq (i i (i i (i i (i i (i i (i i (i i (i< i< (i? i? (iA iC (iM iM (iV iV (i i (i i (i i (i> i@ (iF iH (iJ iM (iU iV (i i (i i (i i (i i (i i (iA iC (iM iM (i i (i i (i i (i1i1(i4i:(iGiN(ii(ii(ii(ii(ii(i5i5(i7i7(i9i9(iqi~(ii(ii(ii(ii(ii(i-i0(i2i2(i6i7(i9i9(iXiY(i`i(i_i_(ii(i2i4(iRiS(iris(ii(ii(ii(ii(ii(i i (ii(i i"(i'i((i2i2(i9i;(ii(ii(i4i4(i6i:(i<i<(iBiB(ikis(ii(ii(i i (i* i. (i` ic (ij io (i i (i*0i/0(i0i0(ii(i i (i%i&(ii(ii(i i#(ii(ii(i i (i i (i i (i8 i: (i? i? (igii(isi(ii(ii(iBiD(ii(i i(iii( RtxrangeR t unicodedatat combiningtunichrRtappendttuplet itertoolstimap(tmarkus_kuhn_combining_5_0Rt in_intervaltintervalt codepoint((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_generate_combining_tables                                                   cCsot}d}dGHxO|D]G}|dkr7d}Hn|dkrJdGn|d7}d|}|GqWdGHdS( s;Print out a new :data:`_COMBINING` table This will print a new :data:`_COMBINING` table in the format used in :file:`kitchen/text/display.py`. It's useful for updating the :data:`_COMBINING` table with updated data from a new python as the format won't change from what's already in the file. is_COMBINING = (is is (0x%x, 0x%x),t)N(R(Rtentriestpairtentry((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_print_combining_table$s      tguesscCs|dks$|dkri|dkri|dkrEttdn|d#krUdS|d kredSd St|tr|d Sd |d ko|d kp|dkp|dkp|dkr|dkr|dkp|dkr|dkp|dkr|dkp|dkr|dkp|dkr3|dkp|dkrK|dkp|dkrc|dkp|dkr{|d kp|d!ko|d"kS($sGet the :term:`textual width` of a ucs character :arg ucs: integer representing a single unicode :term:`code point` :kwarg control_chars: specify how to deal with :term:`control characters`. Possible values are: :guess: (default) will take a guess for :term:`control character` widths. Most codes will return zero width. ``backspace``, ``delete``, and ``clear delete`` return -1. ``escape`` currently returns -1 as well but this is not guaranteed as it's not always correct :strict: will raise :exc:`~kitchen.text.exceptions.ControlCharError` if a :term:`control character` is encountered :raises ControlCharError: if the :term:`code point` is a unicode :term:`control character` and :attr:`control_chars` is set to 'strict' :returns: :term:`textual width` of the character. .. note:: It's important to remember this is :term:`textual width` and not the number of characters or bytes. i iitstrictsQ_ucp_width does not understand how to assign a width value to control characters.iiiiiiii_i)#i*#i.iϤi?0iiiiiii0ioii`iiiiii(iii(RRR t _COMBINING(tucst control_chars((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt _ucp_width<s0$      sutf-8treplacecCsOt|d|d|}ttjttjtjt|tj|S(sGet the :term:`textual width` of a string :arg msg: :class:`unicode` string or byte :class:`str` to get the width of :kwarg control_chars: specify how to deal with :term:`control characters`. Possible values are: :guess: (default) will take a guess for :term:`control character` widths. Most codes will return zero width. ``backspace``, ``delete``, and ``clear delete`` return -1. ``escape`` currently returns -1 as well but this is not guaranteed as it's not always correct :strict: will raise :exc:`kitchen.text.exceptions.ControlCharError` if a :term:`control character` is encountered :kwarg encoding: If we are given a byte :class:`str` this is used to decode it into :class:`unicode` string. Any characters that are not decodable in this encoding will get a value dependent on the :attr:`errors` parameter. :kwarg errors: How to treat errors encoding the byte :class:`str` to :class:`unicode` string. Legal values are the same as for :func:`kitchen.text.converters.to_unicode`. The default value of ``replace`` will cause undecodable byte sequences to have a width of one. ``ignore`` will have a width of zero. :raises ControlCharError: if :attr:`msg` contains a :term:`control character` and :attr:`control_chars` is ``strict``. :returns: :term:`Textual width` of the :attr:`msg`. This is the amount of space that the string will consume on a monospace display. It's measured in the number of cell positions or columns it will take up on a monospace display. This is **not** the number of glyphs that are in the string. .. note:: This function can be wrong sometimes because Unicode does not specify a strict width value for all of the :term:`code points`. In particular, we've found that some Tamil characters take up to four character cells but we return a lesser amount. tencodingterrors( RtsumRtstarmapR$tizipRtordtrepeat(tmsgR#R&R'((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt textual_width~s G c Cst|d|d|}t|}||kr4|St|}||dkr]|d}nd}|}||kr~|}nt|| }xtr||krB|||d}||krPn||||krx8||kr|tt||d}|d8}qW|| S|t|||!}|}|}q||kr|||d}||krpPn||||krx:||krtt||} || }|d7}qW|| S|t|||!}|}|}||kr |}Pq q|| SqW|| S(syGiven a string, return it chopped to a given :term:`textual width` :arg msg: :class:`unicode` string or byte :class:`str` to chop :arg chop: Chop :attr:`msg` if it exceeds this :term:`textual width` :kwarg encoding: If we are given a byte :class:`str`, this is used to decode it into a :class:`unicode` string. Any characters that are not decodable in this encoding will be assigned a width of one. :kwarg errors: How to treat errors encoding the byte :class:`str` to :class:`unicode`. Legal values are the same as for :func:`kitchen.text.converters.to_unicode` :rtype: :class:`unicode` string :returns: :class:`unicode` string of the :attr:`msg` chopped at the given :term:`textual width` This is what you want to use instead of ``%.*s``, as it does the "right" thing with regard to :term:`UTF-8` sequences, :term:`control characters`, and characters that take more than one cell position. Eg:: >>> # Wrong: only displays 8 characters because it is operating on bytes >>> print "%.*s" % (10, 'café ñunru!') café ñun >>> # Properly operates on graphemes >>> '%s' % (textual_width_chop('café ñunru!', 10)) café ñunru >>> # takes too many columns because the kanji need two cell positions >>> print '1234567890\n%.*s' % (10, u'一二三四五六七八九十') 1234567890 一二三四五六七八九十 >>> # Properly chops at 10 columns >>> print '1234567890\n%s' % (textual_width_chop(u'一二三四五六七八九十', 10)) 1234567890 一二三四五 R&R'iii(RR.RRR$R+( R-tchopR&R'twidthR R teosR t new_width((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyttextual_width_chopsV$               tcCst|}|dk r*t||}nt|}||krl|sN|rdj|||g}qnMd||}|rdj||||g}ndj||||g}|S(s Expand a :class:`unicode` string to a specified :term:`textual width` or chop to same :arg msg: :class:`unicode` string to format :arg fill: pad string until the :term:`textual width` of the string is this length :kwarg chop: before doing anything else, chop the string to this length. Default: Don't chop the string at all :kwarg left: If :data:`True` (default) left justify the string and put the padding on the right. If :data:`False`, pad on the left side. :kwarg prefix: Attach this string before the field we're filling :kwarg suffix: Append this string to the end of the field we're filling :rtype: :class:`unicode` string :returns: :attr:`msg` formatted to fill the specified width. If no :attr:`chop` is specified, the string could exceed the fill length when completed. If :attr:`prefix` or :attr:`suffix` are printable characters, the string could be longer than the fill width. .. note:: :attr:`prefix` and :attr:`suffix` should be used for "invisible" characters like highlighting, color changing escape codes, etc. The fill characters are appended outside of any :attr:`prefix` or :attr:`suffix` elements. This allows you to only highlight :attr:`msg` inside of the field you're filling. .. warning:: :attr:`msg`, :attr:`prefix`, and :attr:`suffix` should all be representable as unicode characters. In particular, any escape sequences in :attr:`prefix` and :attr:`suffix` need to be convertible to :class:`unicode`. If you need to use byte sequences here rather than unicode characters, use :func:`~kitchen.text.display.byte_string_textual_width_fill` instead. This function expands a string to fill a field of a particular :term:`textual width`. Use it instead of ``%*.*s``, as it does the "right" thing with regard to :term:`UTF-8` sequences, :term:`control characters`, and characters that take more than one cell position in a display. Example usage:: >>> msg = u'一二三四五六七八九十' >>> # Wrong: This uses 10 characters instead of 10 cells: >>> u":%-*.*s:" % (10, 10, msg[:9]) :一二三四五六七八九 : >>> # This uses 10 cells like we really want: >>> u":%s:" % (textual_width_fill(msg[:9], 10, 10)) :一二三四五: >>> # Wrong: Right aligned in the field, but too many cells >>> u"%20.10s" % (msg) 一二三四五六七八九十 >>> # Correct: Right aligned with proper number of cells >>> u"%s" % (textual_width_fill(msg, 20, 10, left=False)) 一二三四五 >>> # Wrong: Adding some escape characters to highlight the line but too many cells >>> u"%s%20.10s%s" % (prefix, msg, suffix) u' 一二三四五六七八九十' >>> # Correct highlight of the line >>> u"%s%s%s" % (prefix, display.textual_width_fill(msg, 20, 10, left=False), suffix) u' 一二三四五' >>> # Correct way to not highlight the fill >>> u"%s" % (display.textual_width_fill(msg, 20, 10, left=False, prefix=prefix, suffix=suffix)) u' 一二三四五' uu N(RtNoneR3R.tjoin(R-tfillR/tlefttprefixtsuffixR0textra((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyttextual_width_fill4sD     cGsdj|}tjd|}t||kr7tSt|d|krQtStt||krmtSt|}||kS(stOptimize the common case when deciding which :term:`textual width` is larger :arg width: :term:`textual width` to compare against. :arg \*args: :class:`unicode` strings to check the total :term:`textual width` of :returns: :data:`True` if the total length of :attr:`args` are less than or equal to :attr:`width`. Otherwise :data:`False`. We often want to know "does X fit in Y". It takes a while to use :func:`textual_width` to calculate this. However, we know that the number of canonically composed :class:`unicode` characters is always going to have 1 or 2 for the :term:`textual width` per character. With this we can take the following shortcuts: 1) If the number of canonically composed characters is more than width, the true :term:`textual width` cannot be less than width. 2) If the number of canonically composed characters * 2 is less than the width then the :term:`textual width` must be ok. :term:`textual width` of a canonically composed :class:`unicode` string will always be greater than or equal to the the number of :class:`unicode` characters. So we can first check if the number of composed :class:`unicode` characters is less than the asked for width. If it is we can return :data:`True` immediately. If not, then we must do a full :term:`textual width` lookup. R4tNFCi(R6Rt normalizeRRRRR.(R0targststringt true_width((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_textual_width_les iFuc sfdt|d|d|}t|d|d|}t|}t|d|d|jd}|jjd}g}|} t} d} d} x|D]} | jd} | | }}| \} } t}| r| rt}n| r| t| krt}n| rG| rG| dkrG| |krGt}qGn|rr|j| jd|} t} n| t| krd} n| r| j d} |} nt || | rt} |j| | |} qnt} | jd}| } | }| r| dkr| }nxn|D]f}t || | rvt| |krv|j| jd|d|} n| |7} | d7} q$W| jdd} qW| r|j| jdn|S( s Works like we want :func:`textwrap.wrap` to work, :arg text: :class:`unicode` string or byte :class:`str` to wrap :kwarg width: :term:`textual width` at which to wrap. Default: 70 :kwarg initial_indent: string to use to indent the first line. Default: do not indent. :kwarg subsequent_indent: string to use to wrap subsequent lines. Default: do not indent :kwarg encoding: Encoding to use if :attr:`text` is a byte :class:`str` :kwarg errors: error handler to use if :attr:`text` is a byte :class:`str` and contains some undecodable characters. :rtype: :class:`list` of :class:`unicode` strings :returns: list of lines that have been text wrapped and indented. :func:`textwrap.wrap` from the |stdlib|_ has two drawbacks that this attempts to fix: 1. It does not handle :term:`textual width`. It only operates on bytes or characters which are both inadequate (due to multi-byte and double width characters). 2. It malforms lists and blocks. csy|jd}Wntk r(dSX|j|}|dkrN|dfS||d}|dps|d}|r||d|fS|dfS(sfReturn the indent to use for this and (possibly) subsequent lines :arg line: :class:`unicode` line of text to process :rtype: tuple :returns: tuple of count of whitespace before getting to the start of this line followed by a count to the following indent if this block of text is an entry in a list. iu -*.o•‣∘i(ii(tstript IndexErrortfind(tlinetchartcounttnxt(t_indent_at_beg(s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyRJs    R&R'u iu iu( RR.trstript expandtabstsplitRRRRtlstripRB(ttextR0tinitial_indenttsubsequent_indentR&R'tsubsequent_indent_widthtlinestrettindentt wrap_lasttcur_sabtcur_spc_indentRFtlast_sabtlast_spc_indenttforce_nltwordstspcstword((RJs8/usr/lib/python2.7/site-packages/kitchen/text/display.pytwrapsp&   !             cOsdjt|||S(sWorks like we want :func:`textwrap.fill` to work :arg text: :class:`unicode` string or byte :class:`str` to process :returns: :class:`unicode` string with each line separated by a newline .. seealso:: :func:`kitchen.text.display.wrap` for other parameters that you can give this command. This function is a light wrapper around :func:`kitchen.text.display.wrap`. Where that function returns a :class:`list` of lines, this function returns one string with each line separated by a newline. u (R6R_(ROR?tkwargs((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyR73sc Cst|d|d|}t|d|d|}|dk rZt||d|d|}nt|}t|}||kr|s|rdj|||g}qnMd||} |rdj|||| g}ndj| |||g}|S(s%Expand a byte :class:`str` to a specified :term:`textual width` or chop to same :arg msg: byte :class:`str` encoded in :term:`UTF-8` that we want formatted :arg fill: pad :attr:`msg` until the :term:`textual width` is this long :kwarg chop: before doing anything else, chop the string to this length. Default: Don't chop the string at all :kwarg left: If :data:`True` (default) left justify the string and put the padding on the right. If :data:`False`, pad on the left side. :kwarg prefix: Attach this byte :class:`str` before the field we're filling :kwarg suffix: Append this byte :class:`str` to the end of the field we're filling :rtype: byte :class:`str` :returns: :attr:`msg` formatted to fill the specified :term:`textual width`. If no :attr:`chop` is specified, the string could exceed the fill length when completed. If :attr:`prefix` or :attr:`suffix` are printable characters, the string could be longer than fill width. .. note:: :attr:`prefix` and :attr:`suffix` should be used for "invisible" characters like highlighting, color changing escape codes, etc. The fill characters are appended outside of any :attr:`prefix` or :attr:`suffix` elements. This allows you to only highlight :attr:`msg` inside of the field you're filling. .. seealso:: :func:`~kitchen.text.display.textual_width_fill` For example usage. This function has only two differences. 1. it takes byte :class:`str` for :attr:`prefix` and :attr:`suffix` so you can pass in arbitrary sequences of bytes, not just unicode characters. 2. it returns a byte :class:`str` instead of a :class:`unicode` string. R&R'R4t N(RR5R3R.R6( R-R7R/R8R9R:R&R'R0R;((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pytbyte_string_textual_width_fillHs(     RbR7R.R3R<R_(iio(ii(ii(ii(ii(ii(ii(ii(ii(iKi^(ipip(ii(ii(ii(ii(ii(i0iJ(ii(ii(ii(ii#(i%i'(i)i-(i i (i< i< (iA iH (iM iM (iQ iT (ib ic (i i (i i (i i (i i (i i (i i (i< i< (iA iB (iG iH (iK iM (ip iq (i i (i i (i i (i i (i i (i i (i i (i< i< (i? i? (iA iC (iM iM (iV iV (i i (i i (i i (i> i@ (iF iH (iJ iM (iU iV (i i (i i (i i (i i (i i (iA iC (iM iM (i i (i i (i i (i1i1(i4i:(iGiN(ii(ii(ii(ii(ii(i5i5(i7i7(i9i9(iqi~(ii(ii(ii(ii(ii(i-i0(i2i2(i6i7(i9i:(iXiY(ii(i`i(i_i_(ii(i2i4(iRiS(iris(ii(ii(ii(ii(ii(i i (ii(i i"(i'i((i2i2(i9i;(ii(i`i`(iui|(ii(ii(i4i4(i6i:(i<i<(iBiB(iDiD(ikis(ii(i7i7(ii(ii(ii(ii(ii(ii(i i (i* i. (i` ic (ij io (i i (i,i,(i-i-(i*0i/0(i0i0(ioio(i|i}(ii(ii(i i (i%i&(iĨiĨ(ii(i+i-(iSiS(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(i i&(ii(ii(ii(i i (i i (i i (i8 i: (i? i? (ii(ieii(imi(ii(ii(iBiD(ii(i i(ii(sbyte_string_textual_width_fillsfills textual_widthstextual_width_chopstextual_width_fillswrap(t__doc__RRtkitchenRtkitchen.text.convertersRRtkitchen.text.exceptionsRR R!RRR$R.R3R5RR<RBR_R7Rbt__all__(((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt&s  (                                                             d  B SbS +   ;PK[%~)~)#site-packages/kitchen/text/misc.pyonu[ i:Oc@s5dZddlZddlZddlZyddlZWnek rSdZnXddlZddl m Z ddl m Z e j dZeedddd ged d ZeejeeZejd Zed ZdddZddZdZddZddZdZdS(s --------------------------------------------- Miscellaneous functions for manipulating text --------------------------------------------- Collection of text functions that don't fit in another category. iN(tsets(tControlCharErrorg333333?iii i ii s(?s)<[^>]*>|&#?\w+;cCst|ts'ttjdnd}yt||dWntk rZd}nX| rtr| rtj |}|dt kr|d}qn|sd}n|S(s#Try to guess the encoding of a byte :class:`str` :arg byte_string: byte :class:`str` to guess the encoding of :kwarg disable_chardet: If this is True, we never attempt to use :mod:`chardet` to guess the encoding. This is useful if you need to have reproducibility whether :mod:`chardet` is installed or not. Default: :data:`False`. :raises TypeError: if :attr:`byte_string` is not a byte :class:`str` type :returns: string containing a guess at the encoding of :attr:`byte_string`. This is appropriate to pass as the encoding argument when encoding and decoding unicode strings. We start by attempting to decode the byte :class:`str` as :term:`UTF-8`. If this succeeds we tell the world it's :term:`UTF-8` text. If it doesn't and :mod:`chardet` is installed on the system and :attr:`disable_chardet` is False this function will use it to try detecting the encoding of :attr:`byte_string`. If it is not installed or :mod:`chardet` cannot determine the encoding with a high enough confidence then we rather arbitrarily claim that it is ``latin-1``. Since ``latin-1`` will encode to every byte, decoding from ``latin-1`` to :class:`unicode` will not cause :exc:`UnicodeErrors` although the output might be mangled. s'byte_string must be a byte string (str)sutf-8tstrictt confidencetencodingslatin-1N( t isinstancetstrt TypeErrortktb_tunicodetUnicodeDecodeErrortNonetchardettdetectt_CHARDET_THRESHHOLD(t byte_stringtdisable_chardettinput_encodingtdetection_info((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pytguess_encoding;s   sutf-8treplacecCszy||k o||k SWntk r/nXt|trT|j||}n|j||}||krvtStS(sCompare two stringsi, converting to byte :class:`str` if one is :class:`unicode` :arg str1: First string to compare :arg str2: Second string to compare :kwarg encoding: If we need to convert one string into a byte :class:`str` to compare, the encoding to use. Default is :term:`utf-8`. :kwarg errors: What to do if we encounter errors when encoding the string. See the :func:`kitchen.text.converters.to_bytes` documentation for possible values. The default is ``replace``. This function prevents :exc:`UnicodeError` (python-2.4 or less) and :exc:`UnicodeWarning` (python 2.5 and higher) when we compare a :class:`unicode` string to a byte :class:`str`. The errors normally arise because the conversion is done to :term:`ASCII`. This function lets you convert to :term:`utf-8` or another encoding instead. .. note:: When we need to convert one of the strings from :class:`unicode` in order to compare them we convert the :class:`unicode` string into a byte :class:`str`. That means that strings can compare differently if you use different encodings for each. Note that ``str1 == str2`` is faster than this function if you can accept the following limitations: * Limited to python-2.5+ (otherwise a :exc:`UnicodeDecodeError` may be thrown) * Will generate a :exc:`UnicodeWarning` if non-:term:`ASCII` byte :class:`str` is compared to :class:`unicode` string. (t UnicodeErrorRR tencodetTruetFalse(tstr1tstr2Rterrors((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pytstr_eqds!  cCst|ts'ttjdn|dkrXtttdgt t}n|dkrtttdgt t}ns|dkrd}t |}gt D]}||kr|^qrt tjdqnt tjd|r|j|}n|S( sLook for and transform :term:`control characters` in a string :arg string: string to search for and transform :term:`control characters` within :kwarg strategy: XML does not allow :term:`ASCII` :term:`control characters`. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the :term:`control characters` with ``"?"`` :ignore: Remove the characters altogether from the output :strict: Raise a :exc:`~kitchen.text.exceptions.ControlCharError` when we encounter a control character :raises TypeError: if :attr:`string` is not a unicode string. :raises ValueError: if the strategy is not one of replace, ignore, or strict. :raises kitchen.text.exceptions.ControlCharError: if the strategy is ``strict`` and a :term:`control character` is present in the :attr:`string` :returns: :class:`unicode` string with no :term:`control characters` in it. sDprocess_control_char must have a unicode type as the first argument.tignoreRu?Rs*ASCII control code present in string inputsXThe strategy argument to process_control_chars must be one of ignore, replace, or strictN(RR RRR tdicttzipt_CONTROL_CODESR tlent frozensett_CONTROL_CHARSRt ValueErrort translate(tstringtstrategyt control_tabletdatatc((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pytprocess_control_charss % %  %cCsCd}t|ts0ttjdntjt||S(s/Substitute unicode characters for HTML entities :arg string: :class:`unicode` string to substitute out html entities :raises TypeError: if something other than a :class:`unicode` string is given :rtype: :class:`unicode` string :returns: The plain text without html entities cSs |jd}|d dkr#dS|d dkryE|d dkr`tt|dd !d Stt|dd !SWqtk rqXn|d d krtjj|dd !jd }|r|d d kr ytt|dd !SWqtk rqXqt|dSqn|S(NiiuR=RR:R,R(sbyte_string_valid_encodingsbyte_string_valid_xmlsguess_encodingshtml_entities_unescapesprocess_control_charssstr_eq(t__doc__R1t itertoolsR7R t ImportErrorR tkitchenRtkitchen.pycompat24Rtkitchen.text.exceptionsRtadd_builtin_setRR#trangeR!timapR/R$tcompileR9RRRR,R:R=R>t__all__(((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pyts0       , )/ 8 * ( PK[m?2)site-packages/kitchen/text/exceptions.pycnu[ i:Oc@sRdZddlmZdejfdYZdejfdYZdZdS( s ----------------------- Kitchen.text exceptions ----------------------- Exception classes thrown by kitchen's text processing routines. i(t exceptionstXmlEncodeErrorcBseZdZRS(sFException thrown by error conditions when encoding an xml string. (t__name__t __module__t__doc__(((s;/usr/lib/python2.7/site-packages/kitchen/text/exceptions.pyRstControlCharErrorcBseZdZRS(sEException thrown when an ascii control character is encountered. (RRR(((s;/usr/lib/python2.7/site-packages/kitchen/text/exceptions.pyR#sN(RR(RtkitchenRt KitchenErrorRRt__all__(((s;/usr/lib/python2.7/site-packages/kitchen/text/exceptions.pytsPK[R;'site-packages/kitchen/text/__init__.pyonu[ i:Oc@s2dZddlmZd ZeeZd ZdS( s ------------ Kitchen.text ------------ Kitchen.text contains functions for manipulating text in python. This includes things like converting between byte strings and unicode, and displaying text on the screen. i(tversion_tuple_to_stringiit converterst exceptionstmiscN(iii((iii(Rs exceptionsR(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s9/usr/lib/python2.7/site-packages/kitchen/text/__init__.pyt s PK[gt(site-packages/kitchen/text/converters.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2011 Red Hat, Inc. # # kitchen is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # kitchen is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with kitchen; if not, see # # Authors: # Toshio Kuratomi # Seth Vidal # # Portions of code taken from yum/i18n.py and # python-fedora: fedora/textutils.py ''' Functions to handle conversion of byte :class:`str` and :class:`unicode` strings. .. versionchanged:: kitchen 0.2a2 ; API kitchen.text 2.0.0 Added :func:`~kitchen.text.converters.getwriter` .. versionchanged:: kitchen 0.2.2 ; API kitchen.text 2.1.0 Added :func:`~kitchen.text.converters.exception_to_unicode`, :func:`~kitchen.text.converters.exception_to_bytes`, :data:`~kitchen.text.converters.EXCEPTION_CONVERTERS`, and :data:`~kitchen.text.converters.BYTE_EXCEPTION_CONVERTERS` .. versionchanged:: kitchen 1.0.1 ; API kitchen.text 2.1.1 Deprecated :data:`~kitchen.text.converters.BYTE_EXCEPTION_CONVERTERS` as we've simplified :func:`~kitchen.text.converters.exception_to_unicode` and :func:`~kitchen.text.converters.exception_to_bytes` to make it unnecessary ''' try: from base64 import b64encode, b64decode except ImportError: from kitchen.pycompat24.base64 import b64encode, b64decode import codecs import warnings import xml.sax.saxutils # We need to access b_() for localizing our strings but we'll end up with # a circular import if we import it directly. import kitchen as k from kitchen.pycompat24 import sets sets.add_builtin_set() from kitchen.text.exceptions import ControlCharError, XmlEncodeError from kitchen.text.misc import guess_encoding, html_entities_unescape, \ process_control_chars #: Aliases for the utf-8 codec _UTF8_ALIASES = frozenset(('utf-8', 'UTF-8', 'utf8', 'UTF8', 'utf_8', 'UTF_8', 'utf', 'UTF', 'u8', 'U8')) #: Aliases for the latin-1 codec _LATIN1_ALIASES = frozenset(('latin-1', 'LATIN-1', 'latin1', 'LATIN1', 'latin', 'LATIN', 'l1', 'L1', 'cp819', 'CP819', '8859', 'iso8859-1', 'ISO8859-1', 'iso-8859-1', 'ISO-8859-1')) # EXCEPTION_CONVERTERS is defined below due to using to_unicode def to_unicode(obj, encoding='utf-8', errors='replace', nonstring=None, non_string=None): '''Convert an object into a :class:`unicode` string :arg obj: Object to convert to a :class:`unicode` string. This should normally be a byte :class:`str` :kwarg encoding: What encoding to try converting the byte :class:`str` as. Defaults to :term:`utf-8` :kwarg errors: If errors are found while decoding, perform this action. Defaults to ``replace`` which replaces the invalid bytes with a character that means the bytes were unable to be decoded. Other values are the same as the error handling schemes in the `codec base classes `_. For instance ``strict`` which raises an exception and ``ignore`` which simply omits the non-decodable characters. :kwarg nonstring: How to treat nonstring values. Possible values are: :simplerepr: Attempt to call the object's "simple representation" method and return that value. Python-2.3+ has two methods that try to return a simple representation: :meth:`object.__unicode__` and :meth:`object.__str__`. We first try to get a usable value from :meth:`object.__unicode__`. If that fails we try the same with :meth:`object.__str__`. :empty: Return an empty :class:`unicode` string :strict: Raise a :exc:`TypeError` :passthru: Return the object unchanged :repr: Attempt to return a :class:`unicode` string of the repr of the object Default is ``simplerepr`` :kwarg non_string: *Deprecated* Use :attr:`nonstring` instead :raises TypeError: if :attr:`nonstring` is ``strict`` and a non-:class:`basestring` object is passed in or if :attr:`nonstring` is set to an unknown value :raises UnicodeDecodeError: if :attr:`errors` is ``strict`` and :attr:`obj` is not decodable using the given encoding :returns: :class:`unicode` string or the original object depending on the value of :attr:`nonstring`. Usually this should be used on a byte :class:`str` but it can take both byte :class:`str` and :class:`unicode` strings intelligently. Nonstring objects are handled in different ways depending on the setting of the :attr:`nonstring` parameter. The default values of this function are set so as to always return a :class:`unicode` string and never raise an error when converting from a byte :class:`str` to a :class:`unicode` string. However, when you do not pass validly encoded text (or a nonstring object), you may end up with output that you don't expect. Be sure you understand the requirements of your data, not just ignore errors by passing it through this function. .. versionchanged:: 0.2.1a2 Deprecated :attr:`non_string` in favor of :attr:`nonstring` parameter and changed default value to ``simplerepr`` ''' if isinstance(obj, basestring): if isinstance(obj, unicode): return obj if encoding in _UTF8_ALIASES: return unicode(obj, 'utf-8', errors) if encoding in _LATIN1_ALIASES: return unicode(obj, 'latin-1', errors) return obj.decode(encoding, errors) if non_string: warnings.warn(k.b_('non_string is a deprecated parameter of' ' to_unicode(). Use nonstring instead'), DeprecationWarning, stacklevel=2) if not nonstring: nonstring = non_string if not nonstring: nonstring = 'simplerepr' if nonstring == 'empty': return u'' elif nonstring == 'passthru': return obj elif nonstring == 'simplerepr': try: simple = obj.__unicode__() except (AttributeError, UnicodeError): simple = None if not simple: try: simple = str(obj) except UnicodeError: try: simple = obj.__str__() except (UnicodeError, AttributeError): simple = u'' if not isinstance(simple, unicode): return unicode(simple, encoding, errors) return simple elif nonstring in ('repr', 'strict'): obj_repr = repr(obj) if not isinstance(obj_repr, unicode): obj_repr = unicode(obj_repr, encoding, errors) if nonstring == 'repr': return obj_repr raise TypeError(k.b_('to_unicode was given "%(obj)s" which is neither' ' a byte string (str) or a unicode string') % {'obj': obj_repr.encode(encoding, 'replace')}) raise TypeError(k.b_('nonstring value, %(param)s, is not set to a valid' ' action') % {'param': nonstring}) def to_bytes(obj, encoding='utf-8', errors='replace', nonstring=None, non_string=None): '''Convert an object into a byte :class:`str` :arg obj: Object to convert to a byte :class:`str`. This should normally be a :class:`unicode` string. :kwarg encoding: Encoding to use to convert the :class:`unicode` string into a byte :class:`str`. Defaults to :term:`utf-8`. :kwarg errors: If errors are found while encoding, perform this action. Defaults to ``replace`` which replaces the invalid bytes with a character that means the bytes were unable to be encoded. Other values are the same as the error handling schemes in the `codec base classes `_. For instance ``strict`` which raises an exception and ``ignore`` which simply omits the non-encodable characters. :kwarg nonstring: How to treat nonstring values. Possible values are: :simplerepr: Attempt to call the object's "simple representation" method and return that value. Python-2.3+ has two methods that try to return a simple representation: :meth:`object.__unicode__` and :meth:`object.__str__`. We first try to get a usable value from :meth:`object.__str__`. If that fails we try the same with :meth:`object.__unicode__`. :empty: Return an empty byte :class:`str` :strict: Raise a :exc:`TypeError` :passthru: Return the object unchanged :repr: Attempt to return a byte :class:`str` of the :func:`repr` of the object Default is ``simplerepr``. :kwarg non_string: *Deprecated* Use :attr:`nonstring` instead. :raises TypeError: if :attr:`nonstring` is ``strict`` and a non-:class:`basestring` object is passed in or if :attr:`nonstring` is set to an unknown value. :raises UnicodeEncodeError: if :attr:`errors` is ``strict`` and all of the bytes of :attr:`obj` are unable to be encoded using :attr:`encoding`. :returns: byte :class:`str` or the original object depending on the value of :attr:`nonstring`. .. warning:: If you pass a byte :class:`str` into this function the byte :class:`str` is returned unmodified. It is **not** re-encoded with the specified :attr:`encoding`. The easiest way to achieve that is:: to_bytes(to_unicode(text), encoding='utf-8') The initial :func:`to_unicode` call will ensure text is a :class:`unicode` string. Then, :func:`to_bytes` will turn that into a byte :class:`str` with the specified encoding. Usually, this should be used on a :class:`unicode` string but it can take either a byte :class:`str` or a :class:`unicode` string intelligently. Nonstring objects are handled in different ways depending on the setting of the :attr:`nonstring` parameter. The default values of this function are set so as to always return a byte :class:`str` and never raise an error when converting from unicode to bytes. However, when you do not pass an encoding that can validly encode the object (or a non-string object), you may end up with output that you don't expect. Be sure you understand the requirements of your data, not just ignore errors by passing it through this function. .. versionchanged:: 0.2.1a2 Deprecated :attr:`non_string` in favor of :attr:`nonstring` parameter and changed default value to ``simplerepr`` ''' if isinstance(obj, basestring): if isinstance(obj, str): return obj return obj.encode(encoding, errors) if non_string: warnings.warn(k.b_('non_string is a deprecated parameter of' ' to_bytes(). Use nonstring instead'), DeprecationWarning, stacklevel=2) if not nonstring: nonstring = non_string if not nonstring: nonstring = 'simplerepr' if nonstring == 'empty': return '' elif nonstring == 'passthru': return obj elif nonstring == 'simplerepr': try: simple = str(obj) except UnicodeError: try: simple = obj.__str__() except (AttributeError, UnicodeError): simple = None if not simple: try: simple = obj.__unicode__() except (AttributeError, UnicodeError): simple = '' if isinstance(simple, unicode): simple = simple.encode(encoding, 'replace') return simple elif nonstring in ('repr', 'strict'): try: obj_repr = obj.__repr__() except (AttributeError, UnicodeError): obj_repr = '' if isinstance(obj_repr, unicode): obj_repr = obj_repr.encode(encoding, errors) else: obj_repr = str(obj_repr) if nonstring == 'repr': return obj_repr raise TypeError(k.b_('to_bytes was given "%(obj)s" which is neither' ' a unicode string or a byte string (str)') % {'obj': obj_repr}) raise TypeError(k.b_('nonstring value, %(param)s, is not set to a valid' ' action') % {'param': nonstring}) def getwriter(encoding): '''Return a :class:`codecs.StreamWriter` that resists tracing back. :arg encoding: Encoding to use for transforming :class:`unicode` strings into byte :class:`str`. :rtype: :class:`codecs.StreamWriter` :returns: :class:`~codecs.StreamWriter` that you can instantiate to wrap output streams to automatically translate :class:`unicode` strings into :attr:`encoding`. This is a reimplemetation of :func:`codecs.getwriter` that returns a :class:`~codecs.StreamWriter` that resists issuing tracebacks. The :class:`~codecs.StreamWriter` that is returned uses :func:`kitchen.text.converters.to_bytes` to convert :class:`unicode` strings into byte :class:`str`. The departures from :func:`codecs.getwriter` are: 1) The :class:`~codecs.StreamWriter` that is returned will take byte :class:`str` as well as :class:`unicode` strings. Any byte :class:`str` will be passed through unmodified. 2) The default error handler for unknown bytes is to ``replace`` the bytes with the unknown character (``?`` in most ascii-based encodings, ``�`` in the utf encodings) whereas :func:`codecs.getwriter` defaults to ``strict``. Like :class:`codecs.StreamWriter`, the returned :class:`~codecs.StreamWriter` can have its error handler changed in code by setting ``stream.errors = 'new_handler_name'`` Example usage:: $ LC_ALL=C python >>> import sys >>> from kitchen.text.converters import getwriter >>> UTF8Writer = getwriter('utf-8') >>> unwrapped_stdout = sys.stdout >>> sys.stdout = UTF8Writer(unwrapped_stdout) >>> print 'caf\\xc3\\xa9' café >>> print u'caf\\xe9' café >>> ASCIIWriter = getwriter('ascii') >>> sys.stdout = ASCIIWriter(unwrapped_stdout) >>> print 'caf\\xc3\\xa9' café >>> print u'caf\\xe9' caf? .. seealso:: API docs for :class:`codecs.StreamWriter` and :func:`codecs.getwriter` and `Print Fails `_ on the python wiki. .. versionadded:: kitchen 0.2a2, API: kitchen.text 1.1.0 ''' class _StreamWriter(codecs.StreamWriter): # :W0223: We don't need to implement all methods of StreamWriter. # This is not the actual class that gets used but a replacement for # the actual class. # :C0111: We're implementing an API from the stdlib. Just point # people at that documentation instead of writing docstrings here. #pylint:disable-msg=W0223,C0111 def __init__(self, stream, errors='replace'): codecs.StreamWriter.__init__(self, stream, errors) def encode(self, msg, errors='replace'): return (to_bytes(msg, encoding=self.encoding, errors=errors), len(msg)) _StreamWriter.encoding = encoding return _StreamWriter def to_utf8(obj, errors='replace', non_string='passthru'): '''*Deprecated* Convert :class:`unicode` to an encoded :term:`utf-8` byte :class:`str`. You should be using :func:`to_bytes` instead:: to_bytes(obj, encoding='utf-8', non_string='passthru') ''' warnings.warn(k.b_('kitchen.text.converters.to_utf8 is deprecated. Use' ' kitchen.text.converters.to_bytes(obj, encoding="utf-8",' ' nonstring="passthru" instead.'), DeprecationWarning, stacklevel=2) return to_bytes(obj, encoding='utf-8', errors=errors, nonstring=non_string) ### str is also the type name for byte strings so it's not a good name for ### something that can return unicode strings def to_str(obj): '''*Deprecated* This function converts something to a byte :class:`str` if it isn't one. It's used to call :func:`str` or :func:`unicode` on the object to get its simple representation without danger of getting a :exc:`UnicodeError`. You should be using :func:`to_unicode` or :func:`to_bytes` explicitly instead. If you need :class:`unicode` strings:: to_unicode(obj, nonstring='simplerepr') If you need byte :class:`str`:: to_bytes(obj, nonstring='simplerepr') ''' warnings.warn(k.b_('to_str is deprecated. Use to_unicode or to_bytes' ' instead. See the to_str docstring for' ' porting information.'), DeprecationWarning, stacklevel=2) return to_bytes(obj, nonstring='simplerepr') # Exception message extraction functions EXCEPTION_CONVERTERS = (lambda e: e.args[0], lambda e: e) ''' Tuple of functions to try to use to convert an exception into a string representation. Its main use is to extract a string (:class:`unicode` or :class:`str`) from an exception object in :func:`exception_to_unicode` and :func:`exception_to_bytes`. The functions here will try the exception's ``args[0]`` and the exception itself (roughly equivalent to `str(exception)`) to extract the message. This is only a default and can be easily overridden when calling those functions. There are several reasons you might wish to do that. If you have exceptions where the best string representing the exception is not returned by the default functions, you can add another function to extract from a different field:: from kitchen.text.converters import (EXCEPTION_CONVERTERS, exception_to_unicode) class MyError(Exception): def __init__(self, message): self.value = message c = [lambda e: e.value] c.extend(EXCEPTION_CONVERTERS) try: raise MyError('An Exception message') except MyError, e: print exception_to_unicode(e, converters=c) Another reason would be if you're converting to a byte :class:`str` and you know the :class:`str` needs to be a non-:term:`utf-8` encoding. :func:`exception_to_bytes` defaults to :term:`utf-8` but if you convert into a byte :class:`str` explicitly using a converter then you can choose a different encoding:: from kitchen.text.converters import (EXCEPTION_CONVERTERS, exception_to_bytes, to_bytes) c = [lambda e: to_bytes(e.args[0], encoding='euc_jp'), lambda e: to_bytes(e, encoding='euc_jp')] c.extend(EXCEPTION_CONVERTERS) try: do_something() except Exception, e: log = open('logfile.euc_jp', 'a') log.write('%s\n' % exception_to_bytes(e, converters=c) log.close() Each function in this list should take the exception as its sole argument and return a string containing the message representing the exception. The functions may return the message as a :byte class:`str`, a :class:`unicode` string, or even an object if you trust the object to return a decent string representation. The :func:`exception_to_unicode` and :func:`exception_to_bytes` functions will make sure to convert the string to the proper type before returning. .. versionadded:: 0.2.2 ''' BYTE_EXCEPTION_CONVERTERS = (lambda e: to_bytes(e.args[0]), to_bytes) '''*Deprecated*: Use :data:`EXCEPTION_CONVERTERS` instead. Tuple of functions to try to use to convert an exception into a string representation. This tuple is similar to the one in :data:`EXCEPTION_CONVERTERS` but it's used with :func:`exception_to_bytes` instead. Ideally, these functions should do their best to return the data as a byte :class:`str` but the results will be run through :func:`to_bytes` before being returned. .. versionadded:: 0.2.2 .. versionchanged:: 1.0.1 Deprecated as simplifications allow :data:`EXCEPTION_CONVERTERS` to perform the same function. ''' def exception_to_unicode(exc, converters=EXCEPTION_CONVERTERS): '''Convert an exception object into a unicode representation :arg exc: Exception object to convert :kwarg converters: List of functions to use to convert the exception into a string. See :data:`EXCEPTION_CONVERTERS` for the default value and an example of adding other converters to the defaults. The functions in the list are tried one at a time to see if they can extract a string from the exception. The first one to do so without raising an exception is used. :returns: :class:`unicode` string representation of the exception. The value extracted by the :attr:`converters` will be converted into :class:`unicode` before being returned using the :term:`utf-8` encoding. If you know you need to use an alternate encoding add a function that does that to the list of functions in :attr:`converters`) .. versionadded:: 0.2.2 ''' msg = u'' for func in converters: try: msg = func(exc) except: pass else: break return to_unicode(msg) def exception_to_bytes(exc, converters=EXCEPTION_CONVERTERS): '''Convert an exception object into a str representation :arg exc: Exception object to convert :kwarg converters: List of functions to use to convert the exception into a string. See :data:`EXCEPTION_CONVERTERS` for the default value and an example of adding other converters to the defaults. The functions in the list are tried one at a time to see if they can extract a string from the exception. The first one to do so without raising an exception is used. :returns: byte :class:`str` representation of the exception. The value extracted by the :attr:`converters` will be converted into :class:`str` before being returned using the :term:`utf-8` encoding. If you know you need to use an alternate encoding add a function that does that to the list of functions in :attr:`converters`) .. versionadded:: 0.2.2 .. versionchanged:: 1.0.1 Code simplification allowed us to switch to using :data:`EXCEPTION_CONVERTERS` as the default value of :attr:`converters`. ''' msg = '' for func in converters: try: msg = func(exc) except: pass else: break return to_bytes(msg) # # XML Related Functions # def unicode_to_xml(string, encoding='utf-8', attrib=False, control_chars='replace'): '''Take a :class:`unicode` string and turn it into a byte :class:`str` suitable for xml :arg string: :class:`unicode` string to encode into an XML compatible byte :class:`str` :kwarg encoding: encoding to use for the returned byte :class:`str`. Default is to encode to :term:`UTF-8`. If some of the characters in :attr:`string` are not encodable in this encoding, the unknown characters will be entered into the output string using xml character references. :kwarg attrib: If :data:`True`, quote the string for use in an xml attribute. If :data:`False` (default), quote for use in an xml text field. :kwarg control_chars: :term:`control characters` are not allowed in XML documents. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the control characters with ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an :exc:`~kitchen.text.exceptions.XmlEncodeError` when we encounter a :term:`control character` :raises kitchen.text.exceptions.XmlEncodeError: If :attr:`control_chars` is set to ``strict`` and the string to be made suitable for output to xml contains :term:`control characters` or if :attr:`string` is not a :class:`unicode` string then we raise this exception. :raises ValueError: If :attr:`control_chars` is set to something other than ``replace``, ``ignore``, or ``strict``. :rtype: byte :class:`str` :returns: representation of the :class:`unicode` string as a valid XML byte :class:`str` XML files consist mainly of text encoded using a particular charset. XML also denies the use of certain bytes in the encoded text (example: ``ASCII Null``). There are also special characters that must be escaped if they are present in the input (example: ``<``). This function takes care of all of those issues for you. There are a few different ways to use this function depending on your needs. The simplest invocation is like this:: unicode_to_xml(u'String with non-ASCII characters: <"á と">') This will return the following to you, encoded in :term:`utf-8`:: 'String with non-ASCII characters: <"á と">' Pretty straightforward. Now, what if you need to encode your document in something other than :term:`utf-8`? For instance, ``latin-1``? Let's see:: unicode_to_xml(u'String with non-ASCII characters: <"á と">', encoding='latin-1') 'String with non-ASCII characters: <"á と">' Because the ``と`` character is not available in the ``latin-1`` charset, it is replaced with ``と`` in our output. This is an xml character reference which represents the character at unicode codepoint ``12392``, the ``と`` character. When you want to reverse this, use :func:`xml_to_unicode` which will turn a byte :class:`str` into a :class:`unicode` string and replace the xml character references with the unicode characters. XML also has the quirk of not allowing :term:`control characters` in its output. The :attr:`control_chars` parameter allows us to specify what to do with those. For use cases that don't need absolute character by character fidelity (example: holding strings that will just be used for display in a GUI app later), the default value of ``replace`` works well:: unicode_to_xml(u'String with disallowed control chars: \u0000\u0007') 'String with disallowed control chars: ??' If you do need to be able to reproduce all of the characters at a later date (examples: if the string is a key value in a database or a path on a filesystem) you have many choices. Here are a few that rely on ``utf-7``, a verbose encoding that encodes :term:`control characters` (as well as non-:term:`ASCII` unicode values) to characters from within the :term:`ASCII` printable characters. The good thing about doing this is that the code is pretty simple. You just need to use ``utf-7`` both when encoding the field for xml and when decoding it for use in your python program:: unicode_to_xml(u'String with unicode: と and control char: \u0007', encoding='utf7') 'String with unicode: +MGg and control char: +AAc-' # [...] xml_to_unicode('String with unicode: +MGg and control char: +AAc-', encoding='utf7') u'String with unicode: と and control char: \u0007' As you can see, the ``utf-7`` encoding will transform even characters that would be representable in :term:`utf-8`. This can be a drawback if you want unicode characters in the file to be readable without being decoded first. You can work around this with increased complexity in your application code:: encoding = 'utf-8' u_string = u'String with unicode: と and control char: \u0007' try: # First attempt to encode to utf8 data = unicode_to_xml(u_string, encoding=encoding, errors='strict') except XmlEncodeError: # Fallback to utf-7 encoding = 'utf-7' data = unicode_to_xml(u_string, encoding=encoding, errors='strict') write_tag('%s' % (encoding, data)) # [...] encoding = tag.attributes.encoding u_string = xml_to_unicode(u_string, encoding=encoding) Using code similar to that, you can have some fields encoded using your default encoding and fallback to ``utf-7`` if there are :term:`control characters` present. .. note:: If your goal is to preserve the :term:`control characters` you cannot save the entire file as ``utf-7`` and set the xml encoding parameter to ``utf-7`` if your goal is to preserve the :term:`control characters`. Because XML doesn't allow :term:`control characters`, you have to encode those separate from any encoding work that the XML parser itself knows about. .. seealso:: :func:`bytes_to_xml` if you're dealing with bytes that are non-text or of an unknown encoding that you must preserve on a byte for byte level. :func:`guess_encoding_to_xml` if you're dealing with strings in unknown encodings that you don't need to save with char-for-char fidelity. ''' if not string: # Small optimization return '' try: process_control_chars(string, strategy=control_chars) except TypeError: raise XmlEncodeError(k.b_('unicode_to_xml must have a unicode type as' ' the first argument. Use bytes_string_to_xml for byte' ' strings.')) except ValueError: raise ValueError(k.b_('The control_chars argument to unicode_to_xml' ' must be one of ignore, replace, or strict')) except ControlCharError, exc: raise XmlEncodeError(exc.args[0]) string = string.encode(encoding, 'xmlcharrefreplace') # Escape characters that have special meaning in xml if attrib: string = xml.sax.saxutils.escape(string, entities={'"':"""}) else: string = xml.sax.saxutils.escape(string) return string def xml_to_unicode(byte_string, encoding='utf-8', errors='replace'): '''Transform a byte :class:`str` from an xml file into a :class:`unicode` string :arg byte_string: byte :class:`str` to decode :kwarg encoding: encoding that the byte :class:`str` is in :kwarg errors: What to do if not every character is valid in :attr:`encoding`. See the :func:`to_unicode` documentation for legal values. :rtype: :class:`unicode` string :returns: string decoded from :attr:`byte_string` This function attempts to reverse what :func:`unicode_to_xml` does. It takes a byte :class:`str` (presumably read in from an xml file) and expands all the html entities into unicode characters and decodes the byte :class:`str` into a :class:`unicode` string. One thing it cannot do is restore any :term:`control characters` that were removed prior to inserting into the file. If you need to keep such characters you need to use :func:`xml_to_bytes` and :func:`bytes_to_xml` or use on of the strategies documented in :func:`unicode_to_xml` instead. ''' string = to_unicode(byte_string, encoding=encoding, errors=errors) string = html_entities_unescape(string) return string def byte_string_to_xml(byte_string, input_encoding='utf-8', errors='replace', output_encoding='utf-8', attrib=False, control_chars='replace'): '''Make sure a byte :class:`str` is validly encoded for xml output :arg byte_string: Byte :class:`str` to turn into valid xml output :kwarg input_encoding: Encoding of :attr:`byte_string`. Default ``utf-8`` :kwarg errors: How to handle errors encountered while decoding the :attr:`byte_string` into :class:`unicode` at the beginning of the process. Values are: :replace: (default) Replace the invalid bytes with a ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an :exc:`UnicodeDecodeError` when we encounter a non-decodable character :kwarg output_encoding: Encoding for the xml file that this string will go into. Default is ``utf-8``. If all the characters in :attr:`byte_string` are not encodable in this encoding, the unknown characters will be entered into the output string using xml character references. :kwarg attrib: If :data:`True`, quote the string for use in an xml attribute. If :data:`False` (default), quote for use in an xml text field. :kwarg control_chars: XML does not allow :term:`control characters`. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the :term:`control characters` with ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an error when we encounter a :term:`control character` :raises XmlEncodeError: If :attr:`control_chars` is set to ``strict`` and the string to be made suitable for output to xml contains :term:`control characters` then we raise this exception. :raises UnicodeDecodeError: If errors is set to ``strict`` and the :attr:`byte_string` contains bytes that are not decodable using :attr:`input_encoding`, this error is raised :rtype: byte :class:`str` :returns: representation of the byte :class:`str` in the output encoding with any bytes that aren't available in xml taken care of. Use this when you have a byte :class:`str` representing text that you need to make suitable for output to xml. There are several cases where this is the case. For instance, if you need to transform some strings encoded in ``latin-1`` to :term:`utf-8` for output:: utf8_string = byte_string_to_xml(latin1_string, input_encoding='latin-1') If you already have strings in the proper encoding you may still want to use this function to remove :term:`control characters`:: cleaned_string = byte_string_to_xml(string, input_encoding='utf-8', output_encoding='utf-8') .. seealso:: :func:`unicode_to_xml` for other ideas on using this function ''' if not isinstance(byte_string, str): raise XmlEncodeError(k.b_('byte_string_to_xml can only take a byte' ' string as its first argument. Use unicode_to_xml for' ' unicode strings')) # Decode the string into unicode u_string = unicode(byte_string, input_encoding, errors) return unicode_to_xml(u_string, encoding=output_encoding, attrib=attrib, control_chars=control_chars) def xml_to_byte_string(byte_string, input_encoding='utf-8', errors='replace', output_encoding='utf-8'): '''Transform a byte :class:`str` from an xml file into :class:`unicode` string :arg byte_string: byte :class:`str` to decode :kwarg input_encoding: encoding that the byte :class:`str` is in :kwarg errors: What to do if not every character is valid in :attr:`encoding`. See the :func:`to_unicode` docstring for legal values. :kwarg output_encoding: Encoding for the output byte :class:`str` :returns: :class:`unicode` string decoded from :attr:`byte_string` This function attempts to reverse what :func:`unicode_to_xml` does. It takes a byte :class:`str` (presumably read in from an xml file) and expands all the html entities into unicode characters and decodes the byte :class:`str` into a :class:`unicode` string. One thing it cannot do is restore any :term:`control characters` that were removed prior to inserting into the file. If you need to keep such characters you need to use :func:`xml_to_bytes` and :func:`bytes_to_xml` or use one of the strategies documented in :func:`unicode_to_xml` instead. ''' string = xml_to_unicode(byte_string, input_encoding, errors) return to_bytes(string, output_encoding, errors) def bytes_to_xml(byte_string, *args, **kwargs): '''Return a byte :class:`str` encoded so it is valid inside of any xml file :arg byte_string: byte :class:`str` to transform :arg \*args, \*\*kwargs: extra arguments to this function are passed on to the function actually implementing the encoding. You can use this to tweak the output in some cases but, as a general rule, you shouldn't because the underlying encoding function is not guaranteed to remain the same. :rtype: byte :class:`str` consisting of all :term:`ASCII` characters :returns: byte :class:`str` representation of the input. This will be encoded using base64. This function is made especially to put binary information into xml documents. This function is intended for encoding things that must be preserved byte-for-byte. If you want to encode a byte string that's text and don't mind losing the actual bytes you probably want to try :func:`byte_string_to_xml` or :func:`guess_encoding_to_xml` instead. .. note:: Although the current implementation uses :func:`base64.b64encode` and there's no plans to change it, that isn't guaranteed. If you want to make sure that you can encode and decode these messages it's best to use :func:`xml_to_bytes` if you use this function to encode. ''' # Can you do this yourself? Yes, you can. return b64encode(byte_string, *args, **kwargs) def xml_to_bytes(byte_string, *args, **kwargs): '''Decode a string encoded using :func:`bytes_to_xml` :arg byte_string: byte :class:`str` to transform. This should be a base64 encoded sequence of bytes originally generated by :func:`bytes_to_xml`. :arg \*args, \*\*kwargs: extra arguments to this function are passed on to the function actually implementing the encoding. You can use this to tweak the output in some cases but, as a general rule, you shouldn't because the underlying encoding function is not guaranteed to remain the same. :rtype: byte :class:`str` :returns: byte :class:`str` that's the decoded input If you've got fields in an xml document that were encoded with :func:`bytes_to_xml` then you want to use this function to undecode them. It converts a base64 encoded string into a byte :class:`str`. .. note:: Although the current implementation uses :func:`base64.b64decode` and there's no plans to change it, that isn't guaranteed. If you want to make sure that you can encode and decode these messages it's best to use :func:`bytes_to_xml` if you use this function to decode. ''' return b64decode(byte_string, *args, **kwargs) def guess_encoding_to_xml(string, output_encoding='utf-8', attrib=False, control_chars='replace'): '''Return a byte :class:`str` suitable for inclusion in xml :arg string: :class:`unicode` or byte :class:`str` to be transformed into a byte :class:`str` suitable for inclusion in xml. If string is a byte :class:`str` we attempt to guess the encoding. If we cannot guess, we fallback to ``latin-1``. :kwarg output_encoding: Output encoding for the byte :class:`str`. This should match the encoding of your xml file. :kwarg attrib: If :data:`True`, escape the item for use in an xml attribute. If :data:`False` (default) escape the item for use in a text node. :returns: :term:`utf-8` encoded byte :class:`str` ''' # Unicode strings can just be run through unicode_to_xml() if isinstance(string, unicode): return unicode_to_xml(string, encoding=output_encoding, attrib=attrib, control_chars=control_chars) # Guess the encoding of the byte strings input_encoding = guess_encoding(string) # Return the new byte string return byte_string_to_xml(string, input_encoding=input_encoding, errors='replace', output_encoding=output_encoding, attrib=attrib, control_chars=control_chars) def to_xml(string, encoding='utf-8', attrib=False, control_chars='ignore'): '''*Deprecated*: Use :func:`guess_encoding_to_xml` instead ''' warnings.warn(k.b_('kitchen.text.converters.to_xml is deprecated. Use' ' kitchen.text.converters.guess_encoding_to_xml instead.'), DeprecationWarning, stacklevel=2) return guess_encoding_to_xml(string, output_encoding=encoding, attrib=attrib, control_chars=control_chars) __all__ = ('BYTE_EXCEPTION_CONVERTERS', 'EXCEPTION_CONVERTERS', 'byte_string_to_xml', 'bytes_to_xml', 'exception_to_bytes', 'exception_to_unicode', 'getwriter', 'guess_encoding_to_xml', 'to_bytes', 'to_str', 'to_unicode', 'to_utf8', 'to_xml', 'unicode_to_xml', 'xml_to_byte_string', 'xml_to_bytes', 'xml_to_unicode') PK[m?2)site-packages/kitchen/text/exceptions.pyonu[ i:Oc@sRdZddlmZdejfdYZdejfdYZdZdS( s ----------------------- Kitchen.text exceptions ----------------------- Exception classes thrown by kitchen's text processing routines. i(t exceptionstXmlEncodeErrorcBseZdZRS(sFException thrown by error conditions when encoding an xml string. (t__name__t __module__t__doc__(((s;/usr/lib/python2.7/site-packages/kitchen/text/exceptions.pyRstControlCharErrorcBseZdZRS(sEException thrown when an ascii control character is encountered. (RRR(((s;/usr/lib/python2.7/site-packages/kitchen/text/exceptions.pyR#sN(RR(RtkitchenRt KitchenErrorRRt__all__(((s;/usr/lib/python2.7/site-packages/kitchen/text/exceptions.pytsPK[[\#site-packages/kitchen/text/utf8.pycnu[ i:Oc@sdZddlZddlmZddlmZmZddlmZddl m Z m Z m Z m Z mZmZdZdZdd Zded d d Zd d d d ZdZdZdZdS(s ----- UTF-8 ----- Functions for operating on byte :class:`str` encoded as :term:`UTF-8` .. note:: In many cases, it is better to convert to :class:`unicode`, operate on the strings, then convert back to :term:`UTF-8`. :class:`unicode` type can handle many of these functions itself. For those that it doesn't (removing control characters from length calculations, for instance) the code to do so with a :class:`unicode` type is often simpler. .. warning:: All of the functions in this module are deprecated. Most of them have been replaced with functions that operate on unicode values in :mod:`kitchen.text.display`. :func:`kitchen.text.utf8.utf8_valid` has been replaced with a function in :mod:`kitchen.text.misc`. iN(tb_(t to_unicodetto_bytes(tbyte_string_valid_encoding(t_textual_width_letbyte_string_textual_width_filltfillt textual_widthttextual_width_choptwrapcCs&tjtdtddt|S(s**Deprecated** Detect if a string is valid :term:`utf-8` Use :func:`kitchen.text.misc.byte_string_valid_encoding` instead. sjkitchen.text.utf8.utf8_valid is deprecated. Use kitchen.text.misc.byte_string_valid_encoding(msg) insteadt stackleveli(twarningstwarnRtDeprecationWarningR(tmsg((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt utf8_valid@s cCs&tjtdtddt|S(s**Deprecated** Get the :term:`textual width` of a :term:`utf-8` string Use :func:`kitchen.text.display.textual_width` instead. s`kitchen.text.utf8.utf8_width is deprecated. Use kitchen.text.display.textual_width(msg) insteadR i(R R RR R(R((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt utf8_widthJs cCs|tjtdtdd|dkr8t||fSt|t }t||}|rlt |}nt||fS(sA**Deprecated** Return a string chopped to a given :term:`textual width` Use :func:`~kitchen.text.display.textual_width_chop` and :func:`~kitchen.text.display.textual_width` instead:: >>> msg = 'く ku ら ra と to み mi' >>> # Old way: >>> utf8_width_chop(msg, 5) (5, 'く ku') >>> # New way >>> from kitchen.text.converters import to_bytes >>> from kitchen.text.display import textual_width, textual_width_chop >>> (textual_width(msg), to_bytes(textual_width_chop(msg, 5))) (5, 'く ku') sekitchen.text.utf8.utf8_width_chop is deprecated. Use kitchen.text.display.textual_width_chop insteadR iN( R R RR tNoneRt isinstancetunicodeRR(Rtchoptas_bytest chopped_msg((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_width_chopUs tc CsAtjtdtddt||d|d|d|d|S(s**Deprecated** Pad a :term:`utf-8` string to fill a specified width Use :func:`~kitchen.text.display.byte_string_textual_width_fill` instead sqkitchen.text.utf8.utf8_width_fill is deprecated. Use kitchen.text.display.byte_string_textual_width_fill insteadR iRtlefttprefixtsuffix(R R RR R(RRRRRR((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_width_fillss iFcCstjtdtddt|t }t|}t|d|d|d|}|r~g|D]}t|^qc}n|S(s**Deprecated** Similar to :func:`textwrap.wrap` but understands :term:`utf-8` data and doesn't screw up lists/blocks/etc Use :func:`kitchen.text.display.wrap` instead sVkitchen.text.utf8.utf8_text_wrap is deprecated. Use kitchen.text.display.wrap insteadR itwidthtinitial_indenttsubsequent_indent( R R RR RRRR R(ttextRRRRtlinestm((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_text_wraps   "cOs,tjtdtddt|||S(s**Deprecated** Similar to :func:`textwrap.fill` but understands :term:`utf-8` strings and doesn't screw up lists/blocks/etc. Use :func:`kitchen.text.display.fill` instead. sVkitchen.text.utf8.utf8_text_fill is deprecated. Use kitchen.text.display.fill insteadR i(R R RR R(R targstkwargs((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pytutf8_text_fills cGs8tjtdtddt|tdj|S(sx**Deprecated** Convert the arguments to unicode and use :func:`kitchen.text.display._textual_width_le` instead. sckitchen.text.utf8._utf8_width_le is deprecated. Use kitchen.text.display._textual_width_le insteadR iR(R R RR RRtjoin(RR$((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt_utf8_width_les R&R#RRRR(sutf8_text_fillsutf8_text_wraps utf8_valids utf8_widthsutf8_width_chopsutf8_width_fill(t__doc__R tkitchenRtkitchen.text.convertersRRtkitchen.text.miscRtkitchen.text.displayRRRRRR RRRRtTrueRR#R&R(t__all__(((s5/usr/lib/python2.7/site-packages/kitchen/text/utf8.pyt2s .   PK[{{&site-packages/kitchen/text/display.pycnu[ i:Oc@sdZddlZddlZddlmZddlmZmZddlm Z dZ d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddfZ d%Z d&Z d'd(Zd'd)d*d+Zd)d*d,Zded-d-d.Zd/Zd0d1d1d)d*d2Zd3Zded-d-d)d*d4ZdZdS(s  ----------------------- Format Text for Display ----------------------- Functions related to displaying unicode text. Unicode characters don't all have the same width so we need helper functions for displaying them. .. versionadded:: 0.2 kitchen.display API 1.0.0 iN(tb_(t to_unicodetto_bytes(tControlCharErrorcCsd}t|d}|||dks>|||dkrBtSxd||kr||d}|||dkr|d}qE|||dkr|d}qEtSqEWtS(sBinary search in an interval table. :arg value: numeric value to search for :arg table: Ordered list of intervals. This is a list of two-tuples. The elements of the two-tuple define an interval's start and end points. :returns: If :attr:`value` is found within an interval in the :attr:`table` return :data:`True`. Otherwise, :data:`False` This function checks whether a numeric value is present within a table of intervals. It checks using a binary search algorithm, dividing the list of values in half and checking against the values until it determines whether the value is in the table. iii(tlentFalsetTrue(tvaluettabletminimumtmaximumtmid((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_interval_bisearchTs(  iioiiiiiiiiiiiiiiiKi^ipiiiiiiiii0iJiiiiiiii#i%i'i)i-i i i< iA iH iM iQ iT ib ic i i i i i i i i i i< iA iB iG iH iK iM ip iq i i i i i i i i i i i i< i? iA iC iM iV i i i i> i@ iF iH iJ iM iU iV i i i i i i i iA iC iM i i i i i1i4i:iGiNiiiiiiiiii5i7i9iqi~iiiiiiiiii-i0i2i6i7i9i:iXiYii`ii_iii2i4iRiSirisiiiiiiiii i ii i"i'i(i2i9i;iii`iui|iiii4i6i:i<iBiDikisii7iiiiiiiiiiii i i* i. i` ic ij io i i i,i,i-i-i*0i/0i0i0ioi|i}iiii i%i&iĨiii+i-iSiiiiiiiiiiiiiii i&iiiii i i i i i i8 i: i? iiieiiimiiiiiiBiDii iiicCsddddddddddddddddddddddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|f}g}t}g}xtdd}D]r}t||stjt|r|sD|g}t}qDq|rt}|j|d|j|qqW|rk|j||j|ntt j t|S(~seCombine Markus Kuhn's data with :mod:`unicodedata` to make combining char list :rtype: :class:`tuple` of tuples :returns: :class:`tuple` of intervals of :term:`code points` that are combining character. Each interval is a 2-:class:`tuple` of the starting :term:`code point` and the ending :term:`code point` for the combining characters. In normal use, this function serves to tell how we're generating the combining char list. For speed reasons, we use this to generate a static list and just use that later. Markus Kuhn's list of combining characters is more complete than what's in the python :mod:`unicodedata` library but the python :mod:`unicodedata` is synced against later versions of the unicode database This is used to generate the :data:`~kitchen.text.display._COMBINING` table. iioiiiiiiiiiiiiiiiiiKi^ipiiiiiiiii0iJiiiii i i< iA iH iM iQ iT ib ic i i i i i i i i i i< iA iB iG iH iK iM ip iq i i i i i i i i i i i i< i? iA iC iM iV i i i i> i@ iF iH iJ iM iU iV i i i i i i i iA iC iM i i i i i1i4i:iGiNiiiiiiiiii5i7i9iqi~iiiiiiiiii-i0i2i6i7i9iXiYi`ii_iii2i4iRiSirisiiiiiiiii i ii i"i'i(i2i9i;iiiii4i6i:i<iBikisiiiii i i* i. i` ic ij io i i i*0i/0i0i0ii i%i&iiii i#iiii i i i i i i8 i: i? igiiisiiiiiiBiDii iiiiii(iio(ii(ii(ii(ii(ii(ii(ii(ii(ii(iKi^(ipip(ii(ii(ii(ii(ii(i0iJ(ii(ii(i i (i< i< (iA iH (iM iM (iQ iT (ib ic (i i (i i (i i (i i (i i (i i (i< i< (iA iB (iG iH (iK iM (ip iq (i i (i i (i i (i i (i i (i i (i i (i< i< (i? i? (iA iC (iM iM (iV iV (i i (i i (i i (i> i@ (iF iH (iJ iM (iU iV (i i (i i (i i (i i (i i (iA iC (iM iM (i i (i i (i i (i1i1(i4i:(iGiN(ii(ii(ii(ii(ii(i5i5(i7i7(i9i9(iqi~(ii(ii(ii(ii(ii(i-i0(i2i2(i6i7(i9i9(iXiY(i`i(i_i_(ii(i2i4(iRiS(iris(ii(ii(ii(ii(ii(i i (ii(i i"(i'i((i2i2(i9i;(ii(ii(i4i4(i6i:(i<i<(iBiB(ikis(ii(ii(i i (i* i. (i` ic (ij io (i i (i*0i/0(i0i0(ii(i i (i%i&(ii(ii(i i#(ii(ii(i i (i i (i i (i8 i: (i? i? (igii(isi(ii(ii(iBiD(ii(i i(iii( RtxrangeR t unicodedatat combiningtunichrRtappendttuplet itertoolstimap(tmarkus_kuhn_combining_5_0Rt in_intervaltintervalt codepoint((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_generate_combining_tables                                                   cCsot}d}dGHxO|D]G}|dkr7d}Hn|dkrJdGn|d7}d|}|GqWdGHdS( s;Print out a new :data:`_COMBINING` table This will print a new :data:`_COMBINING` table in the format used in :file:`kitchen/text/display.py`. It's useful for updating the :data:`_COMBINING` table with updated data from a new python as the format won't change from what's already in the file. is_COMBINING = (is is (0x%x, 0x%x),t)N(R(Rtentriestpairtentry((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_print_combining_table$s      tguesscCs|dks$|dkri|dkri|dkrEttdn|d#krUdS|d kredSd St|tr|d Sd |d ko|d kp|dkp|dkp|dkr|dkr|dkp|dkr|dkp|dkr|dkp|dkr|dkp|dkr3|dkp|dkrK|dkp|dkrc|dkp|dkr{|d kp|d!ko|d"kS($sGet the :term:`textual width` of a ucs character :arg ucs: integer representing a single unicode :term:`code point` :kwarg control_chars: specify how to deal with :term:`control characters`. Possible values are: :guess: (default) will take a guess for :term:`control character` widths. Most codes will return zero width. ``backspace``, ``delete``, and ``clear delete`` return -1. ``escape`` currently returns -1 as well but this is not guaranteed as it's not always correct :strict: will raise :exc:`~kitchen.text.exceptions.ControlCharError` if a :term:`control character` is encountered :raises ControlCharError: if the :term:`code point` is a unicode :term:`control character` and :attr:`control_chars` is set to 'strict' :returns: :term:`textual width` of the character. .. note:: It's important to remember this is :term:`textual width` and not the number of characters or bytes. i iitstrictsQ_ucp_width does not understand how to assign a width value to control characters.iiiiiiii_i)#i*#i.iϤi?0iiiiiii0ioii`iiiiii(iii(RRR t _COMBINING(tucst control_chars((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt _ucp_width<s0$      sutf-8treplacecCsOt|d|d|}ttjttjtjt|tj|S(sGet the :term:`textual width` of a string :arg msg: :class:`unicode` string or byte :class:`str` to get the width of :kwarg control_chars: specify how to deal with :term:`control characters`. Possible values are: :guess: (default) will take a guess for :term:`control character` widths. Most codes will return zero width. ``backspace``, ``delete``, and ``clear delete`` return -1. ``escape`` currently returns -1 as well but this is not guaranteed as it's not always correct :strict: will raise :exc:`kitchen.text.exceptions.ControlCharError` if a :term:`control character` is encountered :kwarg encoding: If we are given a byte :class:`str` this is used to decode it into :class:`unicode` string. Any characters that are not decodable in this encoding will get a value dependent on the :attr:`errors` parameter. :kwarg errors: How to treat errors encoding the byte :class:`str` to :class:`unicode` string. Legal values are the same as for :func:`kitchen.text.converters.to_unicode`. The default value of ``replace`` will cause undecodable byte sequences to have a width of one. ``ignore`` will have a width of zero. :raises ControlCharError: if :attr:`msg` contains a :term:`control character` and :attr:`control_chars` is ``strict``. :returns: :term:`Textual width` of the :attr:`msg`. This is the amount of space that the string will consume on a monospace display. It's measured in the number of cell positions or columns it will take up on a monospace display. This is **not** the number of glyphs that are in the string. .. note:: This function can be wrong sometimes because Unicode does not specify a strict width value for all of the :term:`code points`. In particular, we've found that some Tamil characters take up to four character cells but we return a lesser amount. tencodingterrors( RtsumRtstarmapR$tizipRtordtrepeat(tmsgR#R&R'((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt textual_width~s G c Cst|d|d|}t|}||kr4|St|}||dkr]|d}nd}|}||kr~|}nt|| }xtr||krB|||d}||krPn||||krx8||kr|tt||d}|d8}qW|| S|t|||!}|}|}q||kr|||d}||krpPn||||krx:||krtt||} || }|d7}qW|| S|t|||!}|}|}||kr |}Pq q|| SqW|| S(syGiven a string, return it chopped to a given :term:`textual width` :arg msg: :class:`unicode` string or byte :class:`str` to chop :arg chop: Chop :attr:`msg` if it exceeds this :term:`textual width` :kwarg encoding: If we are given a byte :class:`str`, this is used to decode it into a :class:`unicode` string. Any characters that are not decodable in this encoding will be assigned a width of one. :kwarg errors: How to treat errors encoding the byte :class:`str` to :class:`unicode`. Legal values are the same as for :func:`kitchen.text.converters.to_unicode` :rtype: :class:`unicode` string :returns: :class:`unicode` string of the :attr:`msg` chopped at the given :term:`textual width` This is what you want to use instead of ``%.*s``, as it does the "right" thing with regard to :term:`UTF-8` sequences, :term:`control characters`, and characters that take more than one cell position. Eg:: >>> # Wrong: only displays 8 characters because it is operating on bytes >>> print "%.*s" % (10, 'café ñunru!') café ñun >>> # Properly operates on graphemes >>> '%s' % (textual_width_chop('café ñunru!', 10)) café ñunru >>> # takes too many columns because the kanji need two cell positions >>> print '1234567890\n%.*s' % (10, u'一二三四五六七八九十') 1234567890 一二三四五六七八九十 >>> # Properly chops at 10 columns >>> print '1234567890\n%s' % (textual_width_chop(u'一二三四五六七八九十', 10)) 1234567890 一二三四五 R&R'iii(RR.RRR$R+( R-tchopR&R'twidthR R teosR t new_width((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyttextual_width_chopsV$               tcCst|}|dk r*t||}nt|}||krl|sN|rdj|||g}qnMd||}|rdj||||g}ndj||||g}|S(s Expand a :class:`unicode` string to a specified :term:`textual width` or chop to same :arg msg: :class:`unicode` string to format :arg fill: pad string until the :term:`textual width` of the string is this length :kwarg chop: before doing anything else, chop the string to this length. Default: Don't chop the string at all :kwarg left: If :data:`True` (default) left justify the string and put the padding on the right. If :data:`False`, pad on the left side. :kwarg prefix: Attach this string before the field we're filling :kwarg suffix: Append this string to the end of the field we're filling :rtype: :class:`unicode` string :returns: :attr:`msg` formatted to fill the specified width. If no :attr:`chop` is specified, the string could exceed the fill length when completed. If :attr:`prefix` or :attr:`suffix` are printable characters, the string could be longer than the fill width. .. note:: :attr:`prefix` and :attr:`suffix` should be used for "invisible" characters like highlighting, color changing escape codes, etc. The fill characters are appended outside of any :attr:`prefix` or :attr:`suffix` elements. This allows you to only highlight :attr:`msg` inside of the field you're filling. .. warning:: :attr:`msg`, :attr:`prefix`, and :attr:`suffix` should all be representable as unicode characters. In particular, any escape sequences in :attr:`prefix` and :attr:`suffix` need to be convertible to :class:`unicode`. If you need to use byte sequences here rather than unicode characters, use :func:`~kitchen.text.display.byte_string_textual_width_fill` instead. This function expands a string to fill a field of a particular :term:`textual width`. Use it instead of ``%*.*s``, as it does the "right" thing with regard to :term:`UTF-8` sequences, :term:`control characters`, and characters that take more than one cell position in a display. Example usage:: >>> msg = u'一二三四五六七八九十' >>> # Wrong: This uses 10 characters instead of 10 cells: >>> u":%-*.*s:" % (10, 10, msg[:9]) :一二三四五六七八九 : >>> # This uses 10 cells like we really want: >>> u":%s:" % (textual_width_fill(msg[:9], 10, 10)) :一二三四五: >>> # Wrong: Right aligned in the field, but too many cells >>> u"%20.10s" % (msg) 一二三四五六七八九十 >>> # Correct: Right aligned with proper number of cells >>> u"%s" % (textual_width_fill(msg, 20, 10, left=False)) 一二三四五 >>> # Wrong: Adding some escape characters to highlight the line but too many cells >>> u"%s%20.10s%s" % (prefix, msg, suffix) u' 一二三四五六七八九十' >>> # Correct highlight of the line >>> u"%s%s%s" % (prefix, display.textual_width_fill(msg, 20, 10, left=False), suffix) u' 一二三四五' >>> # Correct way to not highlight the fill >>> u"%s" % (display.textual_width_fill(msg, 20, 10, left=False, prefix=prefix, suffix=suffix)) u' 一二三四五' uu N(RtNoneR3R.tjoin(R-tfillR/tlefttprefixtsuffixR0textra((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyttextual_width_fill4sD     cGsdj|}tjd|}t||kr7tSt|d|krQtStt||krmtSt|}||kS(stOptimize the common case when deciding which :term:`textual width` is larger :arg width: :term:`textual width` to compare against. :arg \*args: :class:`unicode` strings to check the total :term:`textual width` of :returns: :data:`True` if the total length of :attr:`args` are less than or equal to :attr:`width`. Otherwise :data:`False`. We often want to know "does X fit in Y". It takes a while to use :func:`textual_width` to calculate this. However, we know that the number of canonically composed :class:`unicode` characters is always going to have 1 or 2 for the :term:`textual width` per character. With this we can take the following shortcuts: 1) If the number of canonically composed characters is more than width, the true :term:`textual width` cannot be less than width. 2) If the number of canonically composed characters * 2 is less than the width then the :term:`textual width` must be ok. :term:`textual width` of a canonically composed :class:`unicode` string will always be greater than or equal to the the number of :class:`unicode` characters. So we can first check if the number of composed :class:`unicode` characters is less than the asked for width. If it is we can return :data:`True` immediately. If not, then we must do a full :term:`textual width` lookup. R4tNFCi(R6Rt normalizeRRRRR.(R0targststringt true_width((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt_textual_width_les iFuc sfdt|d|d|}t|d|d|}t|}t|d|d|jd}|jjd}g}|} t} d} d} x|D]} | jd} | | }}| \} } t}| r| rt}n| r| t| krt}n| rG| rG| dkrG| |krGt}qGn|rr|j| jd|} t} n| t| krd} n| r| j d} |} nt || | rt} |j| | |} qnt} | jd}| } | }| r| dkr| }nxn|D]f}t || | rvt| |krv|j| jd|d|} n| |7} | d7} q$W| jdd} qW| r|j| jdn|S( s Works like we want :func:`textwrap.wrap` to work, :arg text: :class:`unicode` string or byte :class:`str` to wrap :kwarg width: :term:`textual width` at which to wrap. Default: 70 :kwarg initial_indent: string to use to indent the first line. Default: do not indent. :kwarg subsequent_indent: string to use to wrap subsequent lines. Default: do not indent :kwarg encoding: Encoding to use if :attr:`text` is a byte :class:`str` :kwarg errors: error handler to use if :attr:`text` is a byte :class:`str` and contains some undecodable characters. :rtype: :class:`list` of :class:`unicode` strings :returns: list of lines that have been text wrapped and indented. :func:`textwrap.wrap` from the |stdlib|_ has two drawbacks that this attempts to fix: 1. It does not handle :term:`textual width`. It only operates on bytes or characters which are both inadequate (due to multi-byte and double width characters). 2. It malforms lists and blocks. csy|jd}Wntk r(dSX|j|}|dkrN|dfS||d}|dps|d}|r||d|fS|dfS(sfReturn the indent to use for this and (possibly) subsequent lines :arg line: :class:`unicode` line of text to process :rtype: tuple :returns: tuple of count of whitespace before getting to the start of this line followed by a count to the following indent if this block of text is an entry in a list. iu -*.o•‣∘i(ii(tstript IndexErrortfind(tlinetchartcounttnxt(t_indent_at_beg(s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyRJs    R&R'u iu iu( RR.trstript expandtabstsplitRRRRtlstripRB(ttextR0tinitial_indenttsubsequent_indentR&R'tsubsequent_indent_widthtlinestrettindentt wrap_lasttcur_sabtcur_spc_indentRFtlast_sabtlast_spc_indenttforce_nltwordstspcstword((RJs8/usr/lib/python2.7/site-packages/kitchen/text/display.pytwrapsp&   !             cOsdjt|||S(sWorks like we want :func:`textwrap.fill` to work :arg text: :class:`unicode` string or byte :class:`str` to process :returns: :class:`unicode` string with each line separated by a newline .. seealso:: :func:`kitchen.text.display.wrap` for other parameters that you can give this command. This function is a light wrapper around :func:`kitchen.text.display.wrap`. Where that function returns a :class:`list` of lines, this function returns one string with each line separated by a newline. u (R6R_(ROR?tkwargs((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyR73sc Cst|d|d|}t|d|d|}|dk rZt||d|d|}nt|}t|}||kr|s|rdj|||g}qnMd||} |rdj|||| g}ndj| |||g}|S(s%Expand a byte :class:`str` to a specified :term:`textual width` or chop to same :arg msg: byte :class:`str` encoded in :term:`UTF-8` that we want formatted :arg fill: pad :attr:`msg` until the :term:`textual width` is this long :kwarg chop: before doing anything else, chop the string to this length. Default: Don't chop the string at all :kwarg left: If :data:`True` (default) left justify the string and put the padding on the right. If :data:`False`, pad on the left side. :kwarg prefix: Attach this byte :class:`str` before the field we're filling :kwarg suffix: Append this byte :class:`str` to the end of the field we're filling :rtype: byte :class:`str` :returns: :attr:`msg` formatted to fill the specified :term:`textual width`. If no :attr:`chop` is specified, the string could exceed the fill length when completed. If :attr:`prefix` or :attr:`suffix` are printable characters, the string could be longer than fill width. .. note:: :attr:`prefix` and :attr:`suffix` should be used for "invisible" characters like highlighting, color changing escape codes, etc. The fill characters are appended outside of any :attr:`prefix` or :attr:`suffix` elements. This allows you to only highlight :attr:`msg` inside of the field you're filling. .. seealso:: :func:`~kitchen.text.display.textual_width_fill` For example usage. This function has only two differences. 1. it takes byte :class:`str` for :attr:`prefix` and :attr:`suffix` so you can pass in arbitrary sequences of bytes, not just unicode characters. 2. it returns a byte :class:`str` instead of a :class:`unicode` string. R&R'R4t N(RR5R3R.R6( R-R7R/R8R9R:R&R'R0R;((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pytbyte_string_textual_width_fillHs(     RbR7R.R3R<R_(iio(ii(ii(ii(ii(ii(ii(ii(ii(iKi^(ipip(ii(ii(ii(ii(ii(i0iJ(ii(ii(ii(ii#(i%i'(i)i-(i i (i< i< (iA iH (iM iM (iQ iT (ib ic (i i (i i (i i (i i (i i (i i (i< i< (iA iB (iG iH (iK iM (ip iq (i i (i i (i i (i i (i i (i i (i i (i< i< (i? i? (iA iC (iM iM (iV iV (i i (i i (i i (i> i@ (iF iH (iJ iM (iU iV (i i (i i (i i (i i (i i (iA iC (iM iM (i i (i i (i i (i1i1(i4i:(iGiN(ii(ii(ii(ii(ii(i5i5(i7i7(i9i9(iqi~(ii(ii(ii(ii(ii(i-i0(i2i2(i6i7(i9i:(iXiY(ii(i`i(i_i_(ii(i2i4(iRiS(iris(ii(ii(ii(ii(ii(i i (ii(i i"(i'i((i2i2(i9i;(ii(i`i`(iui|(ii(ii(i4i4(i6i:(i<i<(iBiB(iDiD(ikis(ii(i7i7(ii(ii(ii(ii(ii(ii(i i (i* i. (i` ic (ij io (i i (i,i,(i-i-(i*0i/0(i0i0(ioio(i|i}(ii(ii(i i (i%i&(iĨiĨ(ii(i+i-(iSiS(ii(ii(ii(ii(ii(ii(ii(ii(ii(ii(i i&(ii(ii(ii(i i (i i (i i (i8 i: (i? i? (ii(ieii(imi(ii(ii(iBiD(ii(i i(ii(sbyte_string_textual_width_fillsfills textual_widthstextual_width_chopstextual_width_fillswrap(t__doc__RRtkitchenRtkitchen.text.convertersRRtkitchen.text.exceptionsRR R!RRR$R.R3R5RR<RBR_R7Rbt__all__(((s8/usr/lib/python2.7/site-packages/kitchen/text/display.pyt&s  (                                                             d  B SbS +   ;PK[%~)~)#site-packages/kitchen/text/misc.pycnu[ i:Oc@s5dZddlZddlZddlZyddlZWnek rSdZnXddlZddl m Z ddl m Z e j dZeedddd ged d ZeejeeZejd Zed ZdddZddZdZddZddZdZdS(s --------------------------------------------- Miscellaneous functions for manipulating text --------------------------------------------- Collection of text functions that don't fit in another category. iN(tsets(tControlCharErrorg333333?iii i ii s(?s)<[^>]*>|&#?\w+;cCst|ts'ttjdnd}yt||dWntk rZd}nX| rtr| rtj |}|dt kr|d}qn|sd}n|S(s#Try to guess the encoding of a byte :class:`str` :arg byte_string: byte :class:`str` to guess the encoding of :kwarg disable_chardet: If this is True, we never attempt to use :mod:`chardet` to guess the encoding. This is useful if you need to have reproducibility whether :mod:`chardet` is installed or not. Default: :data:`False`. :raises TypeError: if :attr:`byte_string` is not a byte :class:`str` type :returns: string containing a guess at the encoding of :attr:`byte_string`. This is appropriate to pass as the encoding argument when encoding and decoding unicode strings. We start by attempting to decode the byte :class:`str` as :term:`UTF-8`. If this succeeds we tell the world it's :term:`UTF-8` text. If it doesn't and :mod:`chardet` is installed on the system and :attr:`disable_chardet` is False this function will use it to try detecting the encoding of :attr:`byte_string`. If it is not installed or :mod:`chardet` cannot determine the encoding with a high enough confidence then we rather arbitrarily claim that it is ``latin-1``. Since ``latin-1`` will encode to every byte, decoding from ``latin-1`` to :class:`unicode` will not cause :exc:`UnicodeErrors` although the output might be mangled. s'byte_string must be a byte string (str)sutf-8tstrictt confidencetencodingslatin-1N( t isinstancetstrt TypeErrortktb_tunicodetUnicodeDecodeErrortNonetchardettdetectt_CHARDET_THRESHHOLD(t byte_stringtdisable_chardettinput_encodingtdetection_info((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pytguess_encoding;s   sutf-8treplacecCszy||k o||k SWntk r/nXt|trT|j||}n|j||}||krvtStS(sCompare two stringsi, converting to byte :class:`str` if one is :class:`unicode` :arg str1: First string to compare :arg str2: Second string to compare :kwarg encoding: If we need to convert one string into a byte :class:`str` to compare, the encoding to use. Default is :term:`utf-8`. :kwarg errors: What to do if we encounter errors when encoding the string. See the :func:`kitchen.text.converters.to_bytes` documentation for possible values. The default is ``replace``. This function prevents :exc:`UnicodeError` (python-2.4 or less) and :exc:`UnicodeWarning` (python 2.5 and higher) when we compare a :class:`unicode` string to a byte :class:`str`. The errors normally arise because the conversion is done to :term:`ASCII`. This function lets you convert to :term:`utf-8` or another encoding instead. .. note:: When we need to convert one of the strings from :class:`unicode` in order to compare them we convert the :class:`unicode` string into a byte :class:`str`. That means that strings can compare differently if you use different encodings for each. Note that ``str1 == str2`` is faster than this function if you can accept the following limitations: * Limited to python-2.5+ (otherwise a :exc:`UnicodeDecodeError` may be thrown) * Will generate a :exc:`UnicodeWarning` if non-:term:`ASCII` byte :class:`str` is compared to :class:`unicode` string. (t UnicodeErrorRR tencodetTruetFalse(tstr1tstr2Rterrors((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pytstr_eqds!  cCst|ts'ttjdn|dkrXtttdgt t}n|dkrtttdgt t}ns|dkrd}t |}gt D]}||kr|^qrt tjdqnt tjd|r|j|}n|S( sLook for and transform :term:`control characters` in a string :arg string: string to search for and transform :term:`control characters` within :kwarg strategy: XML does not allow :term:`ASCII` :term:`control characters`. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the :term:`control characters` with ``"?"`` :ignore: Remove the characters altogether from the output :strict: Raise a :exc:`~kitchen.text.exceptions.ControlCharError` when we encounter a control character :raises TypeError: if :attr:`string` is not a unicode string. :raises ValueError: if the strategy is not one of replace, ignore, or strict. :raises kitchen.text.exceptions.ControlCharError: if the strategy is ``strict`` and a :term:`control character` is present in the :attr:`string` :returns: :class:`unicode` string with no :term:`control characters` in it. sDprocess_control_char must have a unicode type as the first argument.tignoreRu?Rs*ASCII control code present in string inputsXThe strategy argument to process_control_chars must be one of ignore, replace, or strictN(RR RRR tdicttzipt_CONTROL_CODESR tlent frozensett_CONTROL_CHARSRt ValueErrort translate(tstringtstrategyt control_tabletdatatc((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pytprocess_control_charss % %  %cCsCd}t|ts0ttjdntjt||S(s/Substitute unicode characters for HTML entities :arg string: :class:`unicode` string to substitute out html entities :raises TypeError: if something other than a :class:`unicode` string is given :rtype: :class:`unicode` string :returns: The plain text without html entities cSs |jd}|d dkr#dS|d dkryE|d dkr`tt|dd !d Stt|dd !SWqtk rqXn|d d krtjj|dd !jd }|r|d d kr ytt|dd !SWqtk rqXqt|dSqn|S(NiiuR=RR:R,R(sbyte_string_valid_encodingsbyte_string_valid_xmlsguess_encodingshtml_entities_unescapesprocess_control_charssstr_eq(t__doc__R1t itertoolsR7R t ImportErrorR tkitchenRtkitchen.pycompat24Rtkitchen.text.exceptionsRtadd_builtin_setRR#trangeR!timapR/R$tcompileR9RRRR,R:R=R>t__all__(((s5/usr/lib/python2.7/site-packages/kitchen/text/misc.pyts0       , )/ 8 * ( PK[Ps)site-packages/kitchen/text/converters.pycnu[ i:Oc@sdZyddlmZmZWn'ek rIddlmZmZnXddlZddlZddlZ ddl Z ddl m Z e jddlmZmZddlmZmZmZedFZedGZdd ddd!Zdd ddd"Zd#Zd d$d%Zd&Zd'd(fZd)efZ ed*Z!ed+Z"de#d d,Z$dd d-Z%dd de#d d.Z&dd dd/Z'd0Z(d1Z)de#d d2Z*de#d3d4Z+dHZ,dS(Is! Functions to handle conversion of byte :class:`str` and :class:`unicode` strings. .. versionchanged:: kitchen 0.2a2 ; API kitchen.text 2.0.0 Added :func:`~kitchen.text.converters.getwriter` .. versionchanged:: kitchen 0.2.2 ; API kitchen.text 2.1.0 Added :func:`~kitchen.text.converters.exception_to_unicode`, :func:`~kitchen.text.converters.exception_to_bytes`, :data:`~kitchen.text.converters.EXCEPTION_CONVERTERS`, and :data:`~kitchen.text.converters.BYTE_EXCEPTION_CONVERTERS` .. versionchanged:: kitchen 1.0.1 ; API kitchen.text 2.1.1 Deprecated :data:`~kitchen.text.converters.BYTE_EXCEPTION_CONVERTERS` as we've simplified :func:`~kitchen.text.converters.exception_to_unicode` and :func:`~kitchen.text.converters.exception_to_bytes` to make it unnecessary i(t b64encodet b64decodeN(tsets(tControlCharErrortXmlEncodeError(tguess_encodingthtml_entities_unescapetprocess_control_charssutf-8sUTF-8tutf8tUTF8tutf_8tUTF_8tutftUTFtu8tU8slatin-1sLATIN-1tlatin1tLATIN1tlatintLATINtl1tL1tcp819tCP819t8859s iso8859-1s ISO8859-1s iso-8859-1s ISO-8859-1treplacecCs+t|trjt|tr"|S|tkr>t|d|S|tkrZt|d|S|j||S|rtjtj dt dd|s|}qn|sd}n|dkrdS|d kr|S|dkry|j }Wnt t fk r d}nX|siyt|}Wqit k rey|j}Wqft t fk rad}qfXqiXnt|tst|||S|S|dkrt|}t|tst|||}n|d kr|Sttj d i|j|d d6nttj di|d6dS(s} Convert an object into a :class:`unicode` string :arg obj: Object to convert to a :class:`unicode` string. This should normally be a byte :class:`str` :kwarg encoding: What encoding to try converting the byte :class:`str` as. Defaults to :term:`utf-8` :kwarg errors: If errors are found while decoding, perform this action. Defaults to ``replace`` which replaces the invalid bytes with a character that means the bytes were unable to be decoded. Other values are the same as the error handling schemes in the `codec base classes `_. For instance ``strict`` which raises an exception and ``ignore`` which simply omits the non-decodable characters. :kwarg nonstring: How to treat nonstring values. Possible values are: :simplerepr: Attempt to call the object's "simple representation" method and return that value. Python-2.3+ has two methods that try to return a simple representation: :meth:`object.__unicode__` and :meth:`object.__str__`. We first try to get a usable value from :meth:`object.__unicode__`. If that fails we try the same with :meth:`object.__str__`. :empty: Return an empty :class:`unicode` string :strict: Raise a :exc:`TypeError` :passthru: Return the object unchanged :repr: Attempt to return a :class:`unicode` string of the repr of the object Default is ``simplerepr`` :kwarg non_string: *Deprecated* Use :attr:`nonstring` instead :raises TypeError: if :attr:`nonstring` is ``strict`` and a non-:class:`basestring` object is passed in or if :attr:`nonstring` is set to an unknown value :raises UnicodeDecodeError: if :attr:`errors` is ``strict`` and :attr:`obj` is not decodable using the given encoding :returns: :class:`unicode` string or the original object depending on the value of :attr:`nonstring`. Usually this should be used on a byte :class:`str` but it can take both byte :class:`str` and :class:`unicode` strings intelligently. Nonstring objects are handled in different ways depending on the setting of the :attr:`nonstring` parameter. The default values of this function are set so as to always return a :class:`unicode` string and never raise an error when converting from a byte :class:`str` to a :class:`unicode` string. However, when you do not pass validly encoded text (or a nonstring object), you may end up with output that you don't expect. Be sure you understand the requirements of your data, not just ignore errors by passing it through this function. .. versionchanged:: 0.2.1a2 Deprecated :attr:`non_string` in favor of :attr:`nonstring` parameter and changed default value to ``simplerepr`` sutf-8slatin-1sLnon_string is a deprecated parameter of to_unicode(). Use nonstring insteadt stacklevelit simplereprtemptyutpassthrutreprtstrictsWto_unicode was given "%(obj)s" which is neither a byte string (str) or a unicode stringRtobjs8nonstring value, %(param)s, is not set to a valid actiontparamN(sreprsstrict(t isinstancet basestringtunicodet _UTF8_ALIASESt_LATIN1_ALIASEStdecodetwarningstwarntktb_tDeprecationWarningt __unicode__tAttributeErrort UnicodeErrortNonetstrt__str__Rt TypeErrortencode(R tencodingterrorst nonstringt non_stringtsimpletobj_repr((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt to_unicodeIs\9             cCst|tr2t|tr"|S|j||S|ritjtjdtdd|si|}qin|sxd}n|dkrdS|dkr|S|dkrYyt|}WnAt k ry|j }Wqt t fk rd}qXnX|s1y|j }Wq1t t fk r-d}q1Xnt|trU|j|d}n|S|dkry|j}Wnt t fk rd}nXt|tr|j||}n t|}|d kr|Sttjd i|d 6nttjd i|d6dS(s Convert an object into a byte :class:`str` :arg obj: Object to convert to a byte :class:`str`. This should normally be a :class:`unicode` string. :kwarg encoding: Encoding to use to convert the :class:`unicode` string into a byte :class:`str`. Defaults to :term:`utf-8`. :kwarg errors: If errors are found while encoding, perform this action. Defaults to ``replace`` which replaces the invalid bytes with a character that means the bytes were unable to be encoded. Other values are the same as the error handling schemes in the `codec base classes `_. For instance ``strict`` which raises an exception and ``ignore`` which simply omits the non-encodable characters. :kwarg nonstring: How to treat nonstring values. Possible values are: :simplerepr: Attempt to call the object's "simple representation" method and return that value. Python-2.3+ has two methods that try to return a simple representation: :meth:`object.__unicode__` and :meth:`object.__str__`. We first try to get a usable value from :meth:`object.__str__`. If that fails we try the same with :meth:`object.__unicode__`. :empty: Return an empty byte :class:`str` :strict: Raise a :exc:`TypeError` :passthru: Return the object unchanged :repr: Attempt to return a byte :class:`str` of the :func:`repr` of the object Default is ``simplerepr``. :kwarg non_string: *Deprecated* Use :attr:`nonstring` instead. :raises TypeError: if :attr:`nonstring` is ``strict`` and a non-:class:`basestring` object is passed in or if :attr:`nonstring` is set to an unknown value. :raises UnicodeEncodeError: if :attr:`errors` is ``strict`` and all of the bytes of :attr:`obj` are unable to be encoded using :attr:`encoding`. :returns: byte :class:`str` or the original object depending on the value of :attr:`nonstring`. .. warning:: If you pass a byte :class:`str` into this function the byte :class:`str` is returned unmodified. It is **not** re-encoded with the specified :attr:`encoding`. The easiest way to achieve that is:: to_bytes(to_unicode(text), encoding='utf-8') The initial :func:`to_unicode` call will ensure text is a :class:`unicode` string. Then, :func:`to_bytes` will turn that into a byte :class:`str` with the specified encoding. Usually, this should be used on a :class:`unicode` string but it can take either a byte :class:`str` or a :class:`unicode` string intelligently. Nonstring objects are handled in different ways depending on the setting of the :attr:`nonstring` parameter. The default values of this function are set so as to always return a byte :class:`str` and never raise an error when converting from unicode to bytes. However, when you do not pass an encoding that can validly encode the object (or a non-string object), you may end up with output that you don't expect. Be sure you understand the requirements of your data, not just ignore errors by passing it through this function. .. versionchanged:: 0.2.1a2 Deprecated :attr:`non_string` in favor of :attr:`nonstring` parameter and changed default value to ``simplerepr`` sJnon_string is a deprecated parameter of to_bytes(). Use nonstring insteadRiRRtRRRRsUto_bytes was given "%(obj)s" which is neither a unicode string or a byte string (str)R s8nonstring value, %(param)s, is not set to a valid actionR!N(sreprsstrict(R"R#R1R4R(R)R*R+R,R/R2R.R0R-R$t__repr__R3(R R5R6R7R8R9R:((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_bytess\E           cCs&dtjfdY}||_|S(sReturn a :class:`codecs.StreamWriter` that resists tracing back. :arg encoding: Encoding to use for transforming :class:`unicode` strings into byte :class:`str`. :rtype: :class:`codecs.StreamWriter` :returns: :class:`~codecs.StreamWriter` that you can instantiate to wrap output streams to automatically translate :class:`unicode` strings into :attr:`encoding`. This is a reimplemetation of :func:`codecs.getwriter` that returns a :class:`~codecs.StreamWriter` that resists issuing tracebacks. The :class:`~codecs.StreamWriter` that is returned uses :func:`kitchen.text.converters.to_bytes` to convert :class:`unicode` strings into byte :class:`str`. The departures from :func:`codecs.getwriter` are: 1) The :class:`~codecs.StreamWriter` that is returned will take byte :class:`str` as well as :class:`unicode` strings. Any byte :class:`str` will be passed through unmodified. 2) The default error handler for unknown bytes is to ``replace`` the bytes with the unknown character (``?`` in most ascii-based encodings, ``�`` in the utf encodings) whereas :func:`codecs.getwriter` defaults to ``strict``. Like :class:`codecs.StreamWriter`, the returned :class:`~codecs.StreamWriter` can have its error handler changed in code by setting ``stream.errors = 'new_handler_name'`` Example usage:: $ LC_ALL=C python >>> import sys >>> from kitchen.text.converters import getwriter >>> UTF8Writer = getwriter('utf-8') >>> unwrapped_stdout = sys.stdout >>> sys.stdout = UTF8Writer(unwrapped_stdout) >>> print 'caf\xc3\xa9' café >>> print u'caf\xe9' café >>> ASCIIWriter = getwriter('ascii') >>> sys.stdout = ASCIIWriter(unwrapped_stdout) >>> print 'caf\xc3\xa9' café >>> print u'caf\xe9' caf? .. seealso:: API docs for :class:`codecs.StreamWriter` and :func:`codecs.getwriter` and `Print Fails `_ on the python wiki. .. versionadded:: kitchen 0.2a2, API: kitchen.text 1.1.0 t _StreamWritercBs eZddZddZRS(RcSstjj|||dS(N(tcodecst StreamWritert__init__(tselftstreamR6((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyRBhscSs%t|d|jd|t|fS(NR5R6(R>R5tlen(RCtmsgR6((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyR4ks(t__name__t __module__RBR4(((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyR?as (R@RAR5(R5R?((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt getwriter,s5 RcCs;tjtjdtddt|ddd|d|S(s*Deprecated* Convert :class:`unicode` to an encoded :term:`utf-8` byte :class:`str`. You should be using :func:`to_bytes` instead:: to_bytes(obj, encoding='utf-8', non_string='passthru') skitchen.text.converters.to_utf8 is deprecated. Use kitchen.text.converters.to_bytes(obj, encoding="utf-8", nonstring="passthru" instead.RiR5sutf-8R6R7(R(R)R*R+R,R>(R R6R8((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_utf8rs cCs/tjtjdtddt|ddS(s*Deprecated* This function converts something to a byte :class:`str` if it isn't one. It's used to call :func:`str` or :func:`unicode` on the object to get its simple representation without danger of getting a :exc:`UnicodeError`. You should be using :func:`to_unicode` or :func:`to_bytes` explicitly instead. If you need :class:`unicode` strings:: to_unicode(obj, nonstring='simplerepr') If you need byte :class:`str`:: to_bytes(obj, nonstring='simplerepr') smto_str is deprecated. Use to_unicode or to_bytes instead. See the to_str docstring for porting information.RiR7R(R(R)R*R+R,R>(R ((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_strs cCs |jdS(Ni(targs(te((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytscCs|S(N((RM((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyRNscCst|jdS(Ni(R>RL(RM((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyRNscCs<d}x)|D]!}y||}Wnq XPq Wt|S(sConvert an exception object into a unicode representation :arg exc: Exception object to convert :kwarg converters: List of functions to use to convert the exception into a string. See :data:`EXCEPTION_CONVERTERS` for the default value and an example of adding other converters to the defaults. The functions in the list are tried one at a time to see if they can extract a string from the exception. The first one to do so without raising an exception is used. :returns: :class:`unicode` string representation of the exception. The value extracted by the :attr:`converters` will be converted into :class:`unicode` before being returned using the :term:`utf-8` encoding. If you know you need to use an alternate encoding add a function that does that to the list of functions in :attr:`converters`) .. versionadded:: 0.2.2 u%(R;(texct convertersRFtfunc((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytexception_to_unicodes cCs<d}x)|D]!}y||}Wnq XPq Wt|S(s;Convert an exception object into a str representation :arg exc: Exception object to convert :kwarg converters: List of functions to use to convert the exception into a string. See :data:`EXCEPTION_CONVERTERS` for the default value and an example of adding other converters to the defaults. The functions in the list are tried one at a time to see if they can extract a string from the exception. The first one to do so without raising an exception is used. :returns: byte :class:`str` representation of the exception. The value extracted by the :attr:`converters` will be converted into :class:`str` before being returned using the :term:`utf-8` encoding. If you know you need to use an alternate encoding add a function that does that to the list of functions in :attr:`converters`) .. versionadded:: 0.2.2 .. versionchanged:: 1.0.1 Code simplification allowed us to switch to using :data:`EXCEPTION_CONVERTERS` as the default value of :attr:`converters`. s%(R>(RORPRFRQ((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytexception_to_bytess cCs|s dSyt|d|Wnptk rFttjdnKtk rkttjdn&tk r}t|jdnX|j|d}|rt j j j |didd 6}nt j j j |}|S( sdTake a :class:`unicode` string and turn it into a byte :class:`str` suitable for xml :arg string: :class:`unicode` string to encode into an XML compatible byte :class:`str` :kwarg encoding: encoding to use for the returned byte :class:`str`. Default is to encode to :term:`UTF-8`. If some of the characters in :attr:`string` are not encodable in this encoding, the unknown characters will be entered into the output string using xml character references. :kwarg attrib: If :data:`True`, quote the string for use in an xml attribute. If :data:`False` (default), quote for use in an xml text field. :kwarg control_chars: :term:`control characters` are not allowed in XML documents. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the control characters with ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an :exc:`~kitchen.text.exceptions.XmlEncodeError` when we encounter a :term:`control character` :raises kitchen.text.exceptions.XmlEncodeError: If :attr:`control_chars` is set to ``strict`` and the string to be made suitable for output to xml contains :term:`control characters` or if :attr:`string` is not a :class:`unicode` string then we raise this exception. :raises ValueError: If :attr:`control_chars` is set to something other than ``replace``, ``ignore``, or ``strict``. :rtype: byte :class:`str` :returns: representation of the :class:`unicode` string as a valid XML byte :class:`str` XML files consist mainly of text encoded using a particular charset. XML also denies the use of certain bytes in the encoded text (example: ``ASCII Null``). There are also special characters that must be escaped if they are present in the input (example: ``<``). This function takes care of all of those issues for you. There are a few different ways to use this function depending on your needs. The simplest invocation is like this:: unicode_to_xml(u'String with non-ASCII characters: <"á と">') This will return the following to you, encoded in :term:`utf-8`:: 'String with non-ASCII characters: <"á と">' Pretty straightforward. Now, what if you need to encode your document in something other than :term:`utf-8`? For instance, ``latin-1``? Let's see:: unicode_to_xml(u'String with non-ASCII characters: <"á と">', encoding='latin-1') 'String with non-ASCII characters: <"á と">' Because the ``と`` character is not available in the ``latin-1`` charset, it is replaced with ``と`` in our output. This is an xml character reference which represents the character at unicode codepoint ``12392``, the ``と`` character. When you want to reverse this, use :func:`xml_to_unicode` which will turn a byte :class:`str` into a :class:`unicode` string and replace the xml character references with the unicode characters. XML also has the quirk of not allowing :term:`control characters` in its output. The :attr:`control_chars` parameter allows us to specify what to do with those. For use cases that don't need absolute character by character fidelity (example: holding strings that will just be used for display in a GUI app later), the default value of ``replace`` works well:: unicode_to_xml(u'String with disallowed control chars: \u0000\u0007') 'String with disallowed control chars: ??' If you do need to be able to reproduce all of the characters at a later date (examples: if the string is a key value in a database or a path on a filesystem) you have many choices. Here are a few that rely on ``utf-7``, a verbose encoding that encodes :term:`control characters` (as well as non-:term:`ASCII` unicode values) to characters from within the :term:`ASCII` printable characters. The good thing about doing this is that the code is pretty simple. You just need to use ``utf-7`` both when encoding the field for xml and when decoding it for use in your python program:: unicode_to_xml(u'String with unicode: と and control char: \u0007', encoding='utf7') 'String with unicode: +MGg and control char: +AAc-' # [...] xml_to_unicode('String with unicode: +MGg and control char: +AAc-', encoding='utf7') u'String with unicode: と and control char: \u0007' As you can see, the ``utf-7`` encoding will transform even characters that would be representable in :term:`utf-8`. This can be a drawback if you want unicode characters in the file to be readable without being decoded first. You can work around this with increased complexity in your application code:: encoding = 'utf-8' u_string = u'String with unicode: と and control char: \u0007' try: # First attempt to encode to utf8 data = unicode_to_xml(u_string, encoding=encoding, errors='strict') except XmlEncodeError: # Fallback to utf-7 encoding = 'utf-7' data = unicode_to_xml(u_string, encoding=encoding, errors='strict') write_tag('%s' % (encoding, data)) # [...] encoding = tag.attributes.encoding u_string = xml_to_unicode(u_string, encoding=encoding) Using code similar to that, you can have some fields encoded using your default encoding and fallback to ``utf-7`` if there are :term:`control characters` present. .. note:: If your goal is to preserve the :term:`control characters` you cannot save the entire file as ``utf-7`` and set the xml encoding parameter to ``utf-7`` if your goal is to preserve the :term:`control characters`. Because XML doesn't allow :term:`control characters`, you have to encode those separate from any encoding work that the XML parser itself knows about. .. seealso:: :func:`bytes_to_xml` if you're dealing with bytes that are non-text or of an unknown encoding that you must preserve on a byte for byte level. :func:`guess_encoding_to_xml` if you're dealing with strings in unknown encodings that you don't need to save with char-for-char fidelity. R<tstrategysiunicode_to_xml must have a unicode type as the first argument. Use bytes_string_to_xml for byte strings.sVThe control_chars argument to unicode_to_xml must be one of ignore, replace, or strictitxmlcharrefreplacetentitiess"t"( RR3RR*R+t ValueErrorRRLR4txmltsaxtsaxutilstescape(tstringR5tattribt control_charsRO((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytunicode_to_xml#s  %cCs(t|d|d|}t|}|S(s Transform a byte :class:`str` from an xml file into a :class:`unicode` string :arg byte_string: byte :class:`str` to decode :kwarg encoding: encoding that the byte :class:`str` is in :kwarg errors: What to do if not every character is valid in :attr:`encoding`. See the :func:`to_unicode` documentation for legal values. :rtype: :class:`unicode` string :returns: string decoded from :attr:`byte_string` This function attempts to reverse what :func:`unicode_to_xml` does. It takes a byte :class:`str` (presumably read in from an xml file) and expands all the html entities into unicode characters and decodes the byte :class:`str` into a :class:`unicode` string. One thing it cannot do is restore any :term:`control characters` that were removed prior to inserting into the file. If you need to keep such characters you need to use :func:`xml_to_bytes` and :func:`bytes_to_xml` or use on of the strategies documented in :func:`unicode_to_xml` instead. R5R6(R;R(t byte_stringR5R6R]((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytxml_to_unicodes cCsUt|ts'ttjdnt|||}t|d|d|d|S(s Make sure a byte :class:`str` is validly encoded for xml output :arg byte_string: Byte :class:`str` to turn into valid xml output :kwarg input_encoding: Encoding of :attr:`byte_string`. Default ``utf-8`` :kwarg errors: How to handle errors encountered while decoding the :attr:`byte_string` into :class:`unicode` at the beginning of the process. Values are: :replace: (default) Replace the invalid bytes with a ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an :exc:`UnicodeDecodeError` when we encounter a non-decodable character :kwarg output_encoding: Encoding for the xml file that this string will go into. Default is ``utf-8``. If all the characters in :attr:`byte_string` are not encodable in this encoding, the unknown characters will be entered into the output string using xml character references. :kwarg attrib: If :data:`True`, quote the string for use in an xml attribute. If :data:`False` (default), quote for use in an xml text field. :kwarg control_chars: XML does not allow :term:`control characters`. When we encounter those we need to know what to do. Valid options are: :replace: (default) Replace the :term:`control characters` with ``?`` :ignore: Remove the characters altogether from the output :strict: Raise an error when we encounter a :term:`control character` :raises XmlEncodeError: If :attr:`control_chars` is set to ``strict`` and the string to be made suitable for output to xml contains :term:`control characters` then we raise this exception. :raises UnicodeDecodeError: If errors is set to ``strict`` and the :attr:`byte_string` contains bytes that are not decodable using :attr:`input_encoding`, this error is raised :rtype: byte :class:`str` :returns: representation of the byte :class:`str` in the output encoding with any bytes that aren't available in xml taken care of. Use this when you have a byte :class:`str` representing text that you need to make suitable for output to xml. There are several cases where this is the case. For instance, if you need to transform some strings encoded in ``latin-1`` to :term:`utf-8` for output:: utf8_string = byte_string_to_xml(latin1_string, input_encoding='latin-1') If you already have strings in the proper encoding you may still want to use this function to remove :term:`control characters`:: cleaned_string = byte_string_to_xml(string, input_encoding='utf-8', output_encoding='utf-8') .. seealso:: :func:`unicode_to_xml` for other ideas on using this function smbyte_string_to_xml can only take a byte string as its first argument. Use unicode_to_xml for unicode stringsR5R^R_(R"R1RR*R+R$R`(Ratinput_encodingR6toutput_encodingR^R_tu_string((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytbyte_string_to_xmls 9cCs"t|||}t|||S(s=Transform a byte :class:`str` from an xml file into :class:`unicode` string :arg byte_string: byte :class:`str` to decode :kwarg input_encoding: encoding that the byte :class:`str` is in :kwarg errors: What to do if not every character is valid in :attr:`encoding`. See the :func:`to_unicode` docstring for legal values. :kwarg output_encoding: Encoding for the output byte :class:`str` :returns: :class:`unicode` string decoded from :attr:`byte_string` This function attempts to reverse what :func:`unicode_to_xml` does. It takes a byte :class:`str` (presumably read in from an xml file) and expands all the html entities into unicode characters and decodes the byte :class:`str` into a :class:`unicode` string. One thing it cannot do is restore any :term:`control characters` that were removed prior to inserting into the file. If you need to keep such characters you need to use :func:`xml_to_bytes` and :func:`bytes_to_xml` or use one of the strategies documented in :func:`unicode_to_xml` instead. (RbR>(RaRcR6RdR]((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytxml_to_byte_stringscOst|||S(s3Return a byte :class:`str` encoded so it is valid inside of any xml file :arg byte_string: byte :class:`str` to transform :arg \*args, \*\*kwargs: extra arguments to this function are passed on to the function actually implementing the encoding. You can use this to tweak the output in some cases but, as a general rule, you shouldn't because the underlying encoding function is not guaranteed to remain the same. :rtype: byte :class:`str` consisting of all :term:`ASCII` characters :returns: byte :class:`str` representation of the input. This will be encoded using base64. This function is made especially to put binary information into xml documents. This function is intended for encoding things that must be preserved byte-for-byte. If you want to encode a byte string that's text and don't mind losing the actual bytes you probably want to try :func:`byte_string_to_xml` or :func:`guess_encoding_to_xml` instead. .. note:: Although the current implementation uses :func:`base64.b64encode` and there's no plans to change it, that isn't guaranteed. If you want to make sure that you can encode and decode these messages it's best to use :func:`xml_to_bytes` if you use this function to encode. (R(RaRLtkwargs((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt bytes_to_xml4scOst|||S(sDecode a string encoded using :func:`bytes_to_xml` :arg byte_string: byte :class:`str` to transform. This should be a base64 encoded sequence of bytes originally generated by :func:`bytes_to_xml`. :arg \*args, \*\*kwargs: extra arguments to this function are passed on to the function actually implementing the encoding. You can use this to tweak the output in some cases but, as a general rule, you shouldn't because the underlying encoding function is not guaranteed to remain the same. :rtype: byte :class:`str` :returns: byte :class:`str` that's the decoded input If you've got fields in an xml document that were encoded with :func:`bytes_to_xml` then you want to use this function to undecode them. It converts a base64 encoded string into a byte :class:`str`. .. note:: Although the current implementation uses :func:`base64.b64decode` and there's no plans to change it, that isn't guaranteed. If you want to make sure that you can encode and decode these messages it's best to use :func:`bytes_to_xml` if you use this function to decode. (R(RaRLRh((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt xml_to_bytesTsc Cs_t|tr+t|d|d|d|St|}t|d|ddd|d|d|S(sReturn a byte :class:`str` suitable for inclusion in xml :arg string: :class:`unicode` or byte :class:`str` to be transformed into a byte :class:`str` suitable for inclusion in xml. If string is a byte :class:`str` we attempt to guess the encoding. If we cannot guess, we fallback to ``latin-1``. :kwarg output_encoding: Output encoding for the byte :class:`str`. This should match the encoding of your xml file. :kwarg attrib: If :data:`True`, escape the item for use in an xml attribute. If :data:`False` (default) escape the item for use in a text node. :returns: :term:`utf-8` encoded byte :class:`str` R5R^R_RcR6RRd(R"R$R`RRf(R]RdR^R_Rc((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytguess_encoding_to_xmlns   tignorecCs;tjtjdtddt|d|d|d|S(s<*Deprecated*: Use :func:`guess_encoding_to_xml` instead sikitchen.text.converters.to_xml is deprecated. Use kitchen.text.converters.guess_encoding_to_xml instead.RiRdR^R_(R(R)R*R+R,Rk(R]R5R^R_((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pytto_xmls tBYTE_EXCEPTION_CONVERTERStEXCEPTION_CONVERTERSRfRiRSRRRIRkR>RKR;RJRmR`RgRjRb( sutf-8sUTF-8sutf8R sutf_8R sutfR su8R(slatin-1sLATIN-1slatin1RslatinRsl1Rscp819Rs8859s iso8859-1s ISO8859-1s iso-8859-1s ISO-8859-1(sBYTE_EXCEPTION_CONVERTERSsEXCEPTION_CONVERTERSsbyte_string_to_xmls bytes_to_xmlsexception_to_bytessexception_to_unicodes getwritersguess_encoding_to_xmlsto_bytessto_strs to_unicodesto_utf8sto_xmlsunicode_to_xmlsxml_to_byte_strings xml_to_bytessxml_to_unicode(-t__doc__tbase64RRt ImportErrortkitchen.pycompat24.base64R@R(txml.sax.saxutilsRYtkitchenR*tkitchen.pycompat24Rtadd_builtin_settkitchen.text.exceptionsRRtkitchen.text.miscRRRt frozensetR%R&R0R;R>RIRJRKRoRnRRRStFalseR`RbRfRgRiRjRkRmt__all__(((s;/usr/lib/python2.7/site-packages/kitchen/text/converters.pyt+s\          k  v F 8  $ B    PK[M"site-packages/kitchen/text/utf8.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2011 Red Hat, Inc. # Copyright (c) 2010 Ville Skyttä # Copyright (c) 2009 Tim Lauridsen # Copyright (c) 2007 Marcus Kuhn # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. # # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: # James Antill # Marcus Kuhn # Toshio Kuratomi # Tim Lauridsen # Ville Skyttä # # Portions of this are from yum/i18n.py ''' ----- UTF-8 ----- Functions for operating on byte :class:`str` encoded as :term:`UTF-8` .. note:: In many cases, it is better to convert to :class:`unicode`, operate on the strings, then convert back to :term:`UTF-8`. :class:`unicode` type can handle many of these functions itself. For those that it doesn't (removing control characters from length calculations, for instance) the code to do so with a :class:`unicode` type is often simpler. .. warning:: All of the functions in this module are deprecated. Most of them have been replaced with functions that operate on unicode values in :mod:`kitchen.text.display`. :func:`kitchen.text.utf8.utf8_valid` has been replaced with a function in :mod:`kitchen.text.misc`. ''' import warnings from kitchen import b_ from kitchen.text.converters import to_unicode, to_bytes from kitchen.text.misc import byte_string_valid_encoding from kitchen.text.display import _textual_width_le, \ byte_string_textual_width_fill, fill, textual_width, \ textual_width_chop, wrap # # Deprecated functions # def utf8_valid(msg): '''**Deprecated** Detect if a string is valid :term:`utf-8` Use :func:`kitchen.text.misc.byte_string_valid_encoding` instead. ''' warnings.warn(b_('kitchen.text.utf8.utf8_valid is deprecated. Use' ' kitchen.text.misc.byte_string_valid_encoding(msg) instead'), DeprecationWarning, stacklevel=2) return byte_string_valid_encoding(msg) def utf8_width(msg): '''**Deprecated** Get the :term:`textual width` of a :term:`utf-8` string Use :func:`kitchen.text.display.textual_width` instead. ''' warnings.warn(b_('kitchen.text.utf8.utf8_width is deprecated. Use' ' kitchen.text.display.textual_width(msg) instead'), DeprecationWarning, stacklevel=2) return textual_width(msg) def utf8_width_chop(msg, chop=None): '''**Deprecated** Return a string chopped to a given :term:`textual width` Use :func:`~kitchen.text.display.textual_width_chop` and :func:`~kitchen.text.display.textual_width` instead:: >>> msg = 'く ku ら ra と to み mi' >>> # Old way: >>> utf8_width_chop(msg, 5) (5, 'く ku') >>> # New way >>> from kitchen.text.converters import to_bytes >>> from kitchen.text.display import textual_width, textual_width_chop >>> (textual_width(msg), to_bytes(textual_width_chop(msg, 5))) (5, 'く ku') ''' warnings.warn(b_('kitchen.text.utf8.utf8_width_chop is deprecated. Use' ' kitchen.text.display.textual_width_chop instead'), DeprecationWarning, stacklevel=2) if chop == None: return textual_width(msg), msg as_bytes = not isinstance(msg, unicode) chopped_msg = textual_width_chop(msg, chop) if as_bytes: chopped_msg = to_bytes(chopped_msg) return textual_width(chopped_msg), chopped_msg def utf8_width_fill(msg, fill, chop=None, left=True, prefix='', suffix=''): '''**Deprecated** Pad a :term:`utf-8` string to fill a specified width Use :func:`~kitchen.text.display.byte_string_textual_width_fill` instead ''' warnings.warn(b_('kitchen.text.utf8.utf8_width_fill is deprecated. Use' ' kitchen.text.display.byte_string_textual_width_fill instead'), DeprecationWarning, stacklevel=2) return byte_string_textual_width_fill(msg, fill, chop=chop, left=left, prefix=prefix, suffix=suffix) def utf8_text_wrap(text, width=70, initial_indent='', subsequent_indent=''): '''**Deprecated** Similar to :func:`textwrap.wrap` but understands :term:`utf-8` data and doesn't screw up lists/blocks/etc Use :func:`kitchen.text.display.wrap` instead ''' warnings.warn(b_('kitchen.text.utf8.utf8_text_wrap is deprecated. Use' ' kitchen.text.display.wrap instead'), DeprecationWarning, stacklevel=2) as_bytes = not isinstance(text, unicode) text = to_unicode(text) lines = wrap(text, width=width, initial_indent=initial_indent, subsequent_indent=subsequent_indent) if as_bytes: lines = [to_bytes(m) for m in lines] return lines def utf8_text_fill(text, *args, **kwargs): '''**Deprecated** Similar to :func:`textwrap.fill` but understands :term:`utf-8` strings and doesn't screw up lists/blocks/etc. Use :func:`kitchen.text.display.fill` instead. ''' warnings.warn(b_('kitchen.text.utf8.utf8_text_fill is deprecated. Use' ' kitchen.text.display.fill instead'), DeprecationWarning, stacklevel=2) # This assumes that all args. are utf8. return fill(text, *args, **kwargs) def _utf8_width_le(width, *args): '''**Deprecated** Convert the arguments to unicode and use :func:`kitchen.text.display._textual_width_le` instead. ''' warnings.warn(b_('kitchen.text.utf8._utf8_width_le is deprecated. Use' ' kitchen.text.display._textual_width_le instead'), DeprecationWarning, stacklevel=2) # This assumes that all args. are utf8. return _textual_width_le(width, to_unicode(''.join(args))) __all__ = ('utf8_text_fill', 'utf8_text_wrap', 'utf8_valid', 'utf8_width', 'utf8_width_chop', 'utf8_width_fill') PK[gŽ^^-site-packages/kitchen/pycompat24/__init__.pycnu[ i:Oc@s2dZddlmZd ZeeZd ZdS( s The :mod:`kitchen.pycompat24` module contains implementations of functionality introduced in python-2.4 for use on earlier versions of python. i(tversion_tuple_to_stringiitbase64tsetst subprocessN(iii((iii(sbase64Rs subprocess(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/pycompat24/__init__.pyts PK[1M /site-packages/kitchen/pycompat24/subprocess.pyonu[ i:Oc@sddlTddlmZdS(i(t*(t__all__N(tkitchen.pycompat27.subprocessR(((sA/usr/lib/python2.7/site-packages/kitchen/pycompat24/subprocess.pyts PK[1M /site-packages/kitchen/pycompat24/subprocess.pycnu[ i:Oc@sddlTddlmZdS(i(t*(t__all__N(tkitchen.pycompat27.subprocessR(((sA/usr/lib/python2.7/site-packages/kitchen/pycompat24/subprocess.pyts PK[ĿSS,site-packages/kitchen/pycompat24/__init__.pynu[''' The :mod:`kitchen.pycompat24` module contains implementations of functionality introduced in python-2.4 for use on earlier versions of python. ''' from kitchen.versioning import version_tuple_to_string __version_info__ = ((1, 1, 0),) __version__ = version_tuple_to_string(__version_info__) __all__ = ('base64', 'sets', 'subprocess') PK[qIi 2site-packages/kitchen/pycompat24/sets/__init__.pycnu[ i:Oc@sdZddlZeeds9ddlZejZneZeedsfddlZejZneZdZdZ dS(s8 In python-2.4, a builtin :class:`set` type was added to python. This module provides a function to emulate that on python-2.3 by using the :mod:`sets` module. :func:`set` Create a set. If running on python 2.4+ this is the :class:`set` constructor. If using python-2.3, it's :class:`sets.Set`. :func:`frozenset` Create a frozenset. If running on python2.4+ this is the :class:`frozenset` constructor. If using python-2.3, it's :class:`sets.ImmutableSet`. .. versionchanged:: 0.2.0 API: kitchen.pycompat24 1.0.0 Added set and frozenset iNtsett frozensetcCs:ttdstt_nttds6tt_ndS(shIf there's no set builtin, us the :mod:`sets` module to make one This function makes sure that a :class:`set` and :class:`frozenset` type are available in the :mod:`__builtin__` namespace. Since the function checks whether :class:`set` and :class:`frozenset` are already present in the :mod:`__builtin__` namespace and refuses to overwrite those if found, it's safe to call this in multiple places and in scripts run under python-2.4+, where a more efficient set implementation is already present in the :mod:`__builtin__` namespace. However, since this function modifies :mod:`__builtin__` there's no need to call it more than once so you likely want to do something like this when your program loads:: myprogram/__init__.py: from kitchen.pycompat24 import sets builtinset.add_builtin_set() You can then use :func:`set` and :func:`frozenset` anywhere in your code:: myprogram/compute.py: def math_students(algebra_student_list, geometry_student_list): return set(algebra_student_list) union set(geometry_student_list) RRN(thasattrt __builtin__RR(((sD/usr/lib/python2.7/site-packages/kitchen/pycompat24/sets/__init__.pytadd_builtin_set;s R(sadd_builtin_setssets frozenset( t__doc__RRtsetstSetRt ImmutableSetRRt__all__(((sD/usr/lib/python2.7/site-packages/kitchen/pycompat24/sets/__init__.pyt's      !PK[ z 1site-packages/kitchen/pycompat24/sets/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010 Red Hat, Inc # # This file is part of kitchen # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. # # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: # Toshio Kuratomi ''' In python-2.4, a builtin :class:`set` type was added to python. This module provides a function to emulate that on python-2.3 by using the :mod:`sets` module. :func:`set` Create a set. If running on python 2.4+ this is the :class:`set` constructor. If using python-2.3, it's :class:`sets.Set`. :func:`frozenset` Create a frozenset. If running on python2.4+ this is the :class:`frozenset` constructor. If using python-2.3, it's :class:`sets.ImmutableSet`. .. versionchanged:: 0.2.0 API: kitchen.pycompat24 1.0.0 Added set and frozenset ''' import __builtin__ # Setup set and frozenset on this module # :W0622,C0103: The purpose of this module is to define set and frozenset if # they aren't in builtins already so we disregard these pylint warnings #pylint:disable-msg=W0622,C0103 if not hasattr(__builtin__, 'set'): import sets set = sets.Set else: set = set if not hasattr(__builtin__, 'frozenset'): import sets frozenset = sets.ImmutableSet else: frozenset = frozenset #pylint:enable-msg=W0622,C0103 def add_builtin_set(): '''If there's no set builtin, us the :mod:`sets` module to make one This function makes sure that a :class:`set` and :class:`frozenset` type are available in the :mod:`__builtin__` namespace. Since the function checks whether :class:`set` and :class:`frozenset` are already present in the :mod:`__builtin__` namespace and refuses to overwrite those if found, it's safe to call this in multiple places and in scripts run under python-2.4+, where a more efficient set implementation is already present in the :mod:`__builtin__` namespace. However, since this function modifies :mod:`__builtin__` there's no need to call it more than once so you likely want to do something like this when your program loads:: myprogram/__init__.py: from kitchen.pycompat24 import sets builtinset.add_builtin_set() You can then use :func:`set` and :func:`frozenset` anywhere in your code:: myprogram/compute.py: def math_students(algebra_student_list, geometry_student_list): return set(algebra_student_list) union set(geometry_student_list) ''' if not hasattr(__builtin__, 'set'): __builtin__.set = set if not hasattr(__builtin__, 'frozenset'): __builtin__.frozenset = frozenset __all__ = ('add_builtin_set', 'set', 'frozenset') PK[qIi 2site-packages/kitchen/pycompat24/sets/__init__.pyonu[ i:Oc@sdZddlZeeds9ddlZejZneZeedsfddlZejZneZdZdZ dS(s8 In python-2.4, a builtin :class:`set` type was added to python. This module provides a function to emulate that on python-2.3 by using the :mod:`sets` module. :func:`set` Create a set. If running on python 2.4+ this is the :class:`set` constructor. If using python-2.3, it's :class:`sets.Set`. :func:`frozenset` Create a frozenset. If running on python2.4+ this is the :class:`frozenset` constructor. If using python-2.3, it's :class:`sets.ImmutableSet`. .. versionchanged:: 0.2.0 API: kitchen.pycompat24 1.0.0 Added set and frozenset iNtsett frozensetcCs:ttdstt_nttds6tt_ndS(shIf there's no set builtin, us the :mod:`sets` module to make one This function makes sure that a :class:`set` and :class:`frozenset` type are available in the :mod:`__builtin__` namespace. Since the function checks whether :class:`set` and :class:`frozenset` are already present in the :mod:`__builtin__` namespace and refuses to overwrite those if found, it's safe to call this in multiple places and in scripts run under python-2.4+, where a more efficient set implementation is already present in the :mod:`__builtin__` namespace. However, since this function modifies :mod:`__builtin__` there's no need to call it more than once so you likely want to do something like this when your program loads:: myprogram/__init__.py: from kitchen.pycompat24 import sets builtinset.add_builtin_set() You can then use :func:`set` and :func:`frozenset` anywhere in your code:: myprogram/compute.py: def math_students(algebra_student_list, geometry_student_list): return set(algebra_student_list) union set(geometry_student_list) RRN(thasattrt __builtin__RR(((sD/usr/lib/python2.7/site-packages/kitchen/pycompat24/sets/__init__.pytadd_builtin_set;s R(sadd_builtin_setssets frozenset( t__doc__RRtsetstSetRt ImmutableSetRRt__all__(((sD/usr/lib/python2.7/site-packages/kitchen/pycompat24/sets/__init__.pyt's      !PK[gŽ^^-site-packages/kitchen/pycompat24/__init__.pyonu[ i:Oc@s2dZddlmZd ZeeZd ZdS( s The :mod:`kitchen.pycompat24` module contains implementations of functionality introduced in python-2.4 for use on earlier versions of python. i(tversion_tuple_to_stringiitbase64tsetst subprocessN(iii((iii(sbase64Rs subprocess(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/pycompat24/__init__.pyts PK[1L.site-packages/kitchen/pycompat24/subprocess.pynu[# :W0401, W0611, W0614: Rather than have two versions of subprocess, we import # the python2.7 version here as well #pylint:disable-msg=W0401,W0611,W0614 from kitchen.pycompat27.subprocess import * from kitchen.pycompat27.subprocess import __all__ PK[]i4site-packages/kitchen/pycompat24/base64/__init__.pycnu[ i:Oc@sBdZddlZejdkr.ddlTn ddlTdZdS(s Implement the modern base64 interface. Python-2.4 and above have a new API for the base64 module. This is a backport of that module for use on python-2.3. .. seealso:: :mod:`base64` for information about using the functions provided here. iNii(t*t b16decodet b16encodet b32decodet b32encodet b64decodet b64encodetdecodet decodestringtencodet encodestringtstandard_b64decodetstandard_b64encodeturlsafe_b64decodeturlsafe_b64encode(ii(RRRRRRsdecodeRsencodeR R R R R(t__doc__tsyst version_infotbase64t!kitchen.pycompat24.base64._base64t__all__(((sF/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/__init__.pyt s   PK[333site-packages/kitchen/pycompat24/base64/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010 Red Hat, Inc # # This file is part of kitchen # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. # # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: # Toshio Kuratomi ''' Implement the modern base64 interface. Python-2.4 and above have a new API for the base64 module. This is a backport of that module for use on python-2.3. .. seealso:: :mod:`base64` for information about using the functions provided here. ''' import sys # :W0401,W0614: The purpose of this module is to create a backport of base64 # so we ignore these pylint warnings #pylint:disable-msg=W0401,W0614 if sys.version_info >= (2, 4): from base64 import * else: from kitchen.pycompat24.base64._base64 import * __all__ = ( 'b16decode', 'b16encode', 'b32decode', 'b32encode', 'b64decode', 'b64encode', 'decode', 'decodestring', 'encode', 'encodestring', 'standard_b64decode', 'standard_b64encode', 'urlsafe_b64decode', 'urlsafe_b64encode',) PK[]i4site-packages/kitchen/pycompat24/base64/__init__.pyonu[ i:Oc@sBdZddlZejdkr.ddlTn ddlTdZdS(s Implement the modern base64 interface. Python-2.4 and above have a new API for the base64 module. This is a backport of that module for use on python-2.3. .. seealso:: :mod:`base64` for information about using the functions provided here. iNii(t*t b16decodet b16encodet b32decodet b32encodet b64decodet b64encodetdecodet decodestringtencodet encodestringtstandard_b64decodetstandard_b64encodeturlsafe_b64decodeturlsafe_b64encode(ii(RRRRRRsdecodeRsencodeR R R R R(t__doc__tsyst version_infotbase64t!kitchen.pycompat24.base64._base64t__all__(((sF/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/__init__.pyt s   PK[H@^-^-3site-packages/kitchen/pycompat24/base64/_base64.pycnu[ i:Oc@sdZddlZddlZddlZddddddd d d d d dddgZgedD]Zee^qgZdZ dZ ddZ ddZ dZdZdZdZi dd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6dFdG6dHdI6dJdK6dLdM6dNdO6dPdQ6dRdS6dTdU6dVdW6dXdY6ZejZejgeD]\ZZe^qZegejD]\ZZeeef^qZdZZedd[Zd\Zed]Zd^Z e d;d3Z!d_Z"d`Z#daZ$dbZ%dcZ&ddZ'e(dekre&ndS(fs/RFC 3548: Base16, Base32, Base64 Data EncodingsiNtencodetdecodet encodestringt decodestringt b64encodet b64decodet b32encodet b32decodet b16encodet b16decodetstandard_b64encodetstandard_b64decodeturlsafe_b64encodeturlsafe_b64decodeitcCsJt}x*|jD]\}}||t|7}||d@d>7}|jt|d?t|d ?d @t|d?d @t|d ?t|d ?d @t|d ?d @t|d?t|d @gqSWtj|}|dkrK|d dS|d krc|d dS|dkr{|d dS|dkr|d dS|S(scEncode a string using Base32. s is the string to encode. The encoded string is returned. itis!HHBiiii iii iiis======is====is===iit=( tdivmodtlentrangetstructtunpacktextendt_b32tabt EMPTYSTRINGR( Rtpartstquantatleftovertitc1tc2tc3R((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRs6 .          c Cs tt|d\}}|r0tdn|rVt|idd6|d6}n|rk|j}nd}tjd|}|rt|jd}|dkr|| }qng}d}d } x|D]} tj | } | dkrtd n|t| | >7}| d 8} | dkr|j t j d |d}d } qqWt j d |} |dkrd } np|dkr| d } nW|dkr| d } n>|dkr| d } n%|dkr| d } n td|j | tj|S(sGDecode a Base32 encoded string. s is the string to decode. Optional casefold is a flag specifying whether a lowercase alphabet is acceptable as input. For security purposes, the default is False. RFC 3548 allows for optional mapping of the digit 0 (zero) to the letter O (oh), and for optional mapping of the digit 1 (one) to either the letter I (eye) or letter L (el). The optional argument map01 when not None, specifies which letter the digit 1 should be mapped to (when map01 is not None, the digit 0 is always mapped to the letter O). For security purposes the default is None, so that 0 and 1 are not allowed in the input. The decoded string is returned. A TypeError is raised if s were incorrectly padded or if there are non-alphabet characters present in the string. isIncorrect paddingR9t0t1is(?P[=]*)$tpadi#sNon-base32 digit foundis%010xRiiiiiiiiN(RFRGR"Rtuppertretsearchtgroupt_b32revtgetRtappendRt unhexlifyRMR( Rtcasefoldtmap01RORPtpadcharstmoRNtacctshifttctvaltlast((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRsP                   cCstj|jS(scEncode a string using Base16. s is the string to encode. The encoded string is returned. (RthexlifyRX(R((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRscCsC|r|j}ntjd|r6tdntj|S(swDecode a Base16 encoded string. s is the string to decode. Optional casefold is a flag specifying whether a lowercase alphabet is acceptable as input. For security purposes, the default is False. The decoded string is returned. A TypeError is raised if s were incorrectly padded or if there are non-alphabet characters present in the string. s [^0-9A-F]sNon-base16 digit found(RXRYRZR"RR_(RR`((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR s iLcCsxtr|jt}|s"PnxCt|tkrg|jtt|}|sZPn||7}q%Wtj|}|j|qWdS(sEncode a file.N(tTruetreadt MAXBINSIZERGRRtwrite(tinputtoutputRtnstline((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRs cCsCx<tr>|j}|sPntj|}|j|qWdS(sDecode a file.N(RjtreadlineRR Rm(RnRoRqR((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR,s   cCs]g}xGtdt|tD]-}|||t!}|jtj|qWdj|S(s4Encode a string into multiple lines of base-64 data.iR(RHRGRlR^RRR(RtpiecesRQtchunk((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR6s cCs tj|S(sDecode a string.(RR (R((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR?sc CsZddl}ddl}y#|j|jdd\}}WnD|jk r}|j|_|GHd|jdGH|jdnXt}xj|D]b\}}|dkrt}n|d krt}n|d krt}n|d krt dSqW|rC|dd krCt |dd }z|||jWd|j Xn||j |jdS(sSmall test programiNitdeutsusage: %s [-d|-e|-u|-t] [file|-] -d, -u: decode -e: encode (default) -t: encode and decode string 'Aladdin:open sesame'iis-es-ds-us-tt-trb( tsystgetopttargvterrortstderrtstdouttexitRRttest1topentclosetstdin( RxRytoptstargsR#tfunctotatfh((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyttestFs2#     cCs5d}t|}t|}|Gt|G|GHdS(NsAladdin:open sesame(RRtrepr(ts0ts1ts2((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRcs  t__main__()t__doc__RYRIRt__all__RHt_xtchrRRMRRRRR R R R t _b32alphabetRRLtsortRRtdicttlongR\RtFalseRRR t MAXLINESIZERlRRRRRRt__name__(((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pytsZ      %       7 *J       PK[,,2site-packages/kitchen/pycompat24/base64/_base64.pynu[#! /usr/bin/env python """RFC 3548: Base16, Base32, Base64 Data Encodings""" # Modified 04-Oct-1995 by Jack Jansen to use binascii module # Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support import re import struct import binascii __all__ = [ # Legacy interface exports traditional RFC 1521 Base64 encodings 'encode', 'decode', 'encodestring', 'decodestring', # Generalized interface for other encodings 'b64encode', 'b64decode', 'b32encode', 'b32decode', 'b16encode', 'b16decode', # Standard Base64 encoding 'standard_b64encode', 'standard_b64decode', # Some common Base64 alternatives. As referenced by RFC 3458, see thread # starting at: # # http://zgp.org/pipermail/p2p-hackers/2001-September/000316.html 'urlsafe_b64encode', 'urlsafe_b64decode', ] _translation = [chr(_x) for _x in range(256)] EMPTYSTRING = '' def _translate(s, altchars): translation = _translation[:] for k, v in altchars.items(): translation[ord(k)] = v return s.translate(''.join(translation)) # Base64 encoding/decoding uses binascii def b64encode(s, altchars=None): """Encode a string using Base64. s is the string to encode. Optional altchars must be a string of at least length 2 (additional characters are ignored) which specifies an alternative alphabet for the '+' and '/' characters. This allows an application to e.g. generate url or filesystem safe Base64 strings. The encoded string is returned. """ # Strip off the trailing newline encoded = binascii.b2a_base64(s)[:-1] if altchars is not None: return _translate(encoded, {'+': altchars[0], '/': altchars[1]}) return encoded def b64decode(s, altchars=None): """Decode a Base64 encoded string. s is the string to decode. Optional altchars must be a string of at least length 2 (additional characters are ignored) which specifies the alternative alphabet used instead of the '+' and '/' characters. The decoded string is returned. A TypeError is raised if s were incorrectly padded or if there are non-alphabet characters present in the string. """ if altchars is not None: s = _translate(s, {altchars[0]: '+', altchars[1]: '/'}) try: return binascii.a2b_base64(s) except binascii.Error, msg: # Transform this exception for consistency raise TypeError(msg) def standard_b64encode(s): """Encode a string using the standard Base64 alphabet. s is the string to encode. The encoded string is returned. """ return b64encode(s) def standard_b64decode(s): """Decode a string encoded with the standard Base64 alphabet. s is the string to decode. The decoded string is returned. A TypeError is raised if the string is incorrectly padded or if there are non-alphabet characters present in the string. """ return b64decode(s) def urlsafe_b64encode(s): """Encode a string using a url-safe Base64 alphabet. s is the string to encode. The encoded string is returned. The alphabet uses '-' instead of '+' and '_' instead of '/'. """ return b64encode(s, '-_') def urlsafe_b64decode(s): """Decode a string encoded with the standard Base64 alphabet. s is the string to decode. The decoded string is returned. A TypeError is raised if the string is incorrectly padded or if there are non-alphabet characters present in the string. The alphabet uses '-' instead of '+' and '_' instead of '/'. """ return b64decode(s, '-_') # Base32 encoding/decoding must be done in Python _b32alphabet = { 0: 'A', 9: 'J', 18: 'S', 27: '3', 1: 'B', 10: 'K', 19: 'T', 28: '4', 2: 'C', 11: 'L', 20: 'U', 29: '5', 3: 'D', 12: 'M', 21: 'V', 30: '6', 4: 'E', 13: 'N', 22: 'W', 31: '7', 5: 'F', 14: 'O', 23: 'X', 6: 'G', 15: 'P', 24: 'Y', 7: 'H', 16: 'Q', 25: 'Z', 8: 'I', 17: 'R', 26: '2', } _b32tab = _b32alphabet.items() _b32tab.sort() _b32tab = [v for k, v in _b32tab] _b32rev = dict([(v, long(k)) for k, v in _b32alphabet.items()]) def b32encode(s): """Encode a string using Base32. s is the string to encode. The encoded string is returned. """ parts = [] quanta, leftover = divmod(len(s), 5) # Pad the last quantum with zero bits if necessary if leftover: s += ('\0' * (5 - leftover)) quanta += 1 for i in range(quanta): # c1 and c2 are 16 bits wide, c3 is 8 bits wide. The intent of this # code is to process the 40 bits in units of 5 bits. So we take the 1 # leftover bit of c1 and tack it onto c2. Then we take the 2 leftover # bits of c2 and tack them onto c3. The shifts and masks are intended # to give us values of exactly 5 bits in width. c1, c2, c3 = struct.unpack('!HHB', s[i*5:(i+1)*5]) c2 += (c1 & 1) << 16 # 17 bits wide c3 += (c2 & 3) << 8 # 10 bits wide parts.extend([_b32tab[c1 >> 11], # bits 1 - 5 _b32tab[(c1 >> 6) & 0x1f], # bits 6 - 10 _b32tab[(c1 >> 1) & 0x1f], # bits 11 - 15 _b32tab[c2 >> 12], # bits 16 - 20 (1 - 5) _b32tab[(c2 >> 7) & 0x1f], # bits 21 - 25 (6 - 10) _b32tab[(c2 >> 2) & 0x1f], # bits 26 - 30 (11 - 15) _b32tab[c3 >> 5], # bits 31 - 35 (1 - 5) _b32tab[c3 & 0x1f], # bits 36 - 40 (1 - 5) ]) encoded = EMPTYSTRING.join(parts) # Adjust for any leftover partial quanta if leftover == 1: return encoded[:-6] + '======' elif leftover == 2: return encoded[:-4] + '====' elif leftover == 3: return encoded[:-3] + '===' elif leftover == 4: return encoded[:-1] + '=' return encoded def b32decode(s, casefold=False, map01=None): """Decode a Base32 encoded string. s is the string to decode. Optional casefold is a flag specifying whether a lowercase alphabet is acceptable as input. For security purposes, the default is False. RFC 3548 allows for optional mapping of the digit 0 (zero) to the letter O (oh), and for optional mapping of the digit 1 (one) to either the letter I (eye) or letter L (el). The optional argument map01 when not None, specifies which letter the digit 1 should be mapped to (when map01 is not None, the digit 0 is always mapped to the letter O). For security purposes the default is None, so that 0 and 1 are not allowed in the input. The decoded string is returned. A TypeError is raised if s were incorrectly padded or if there are non-alphabet characters present in the string. """ quanta, leftover = divmod(len(s), 8) if leftover: raise TypeError('Incorrect padding') # Handle section 2.4 zero and one mapping. The flag map01 will be either # False, or the character to map the digit 1 (one) to. It should be # either L (el) or I (eye). if map01: s = _translate(s, {'0': 'O', '1': map01}) if casefold: s = s.upper() # Strip off pad characters from the right. We need to count the pad # characters because this will tell us how many null bytes to remove from # the end of the decoded string. padchars = 0 mo = re.search('(?P[=]*)$', s) if mo: padchars = len(mo.group('pad')) if padchars > 0: s = s[:-padchars] # Now decode the full quanta parts = [] acc = 0 shift = 35 for c in s: val = _b32rev.get(c) if val is None: raise TypeError('Non-base32 digit found') acc += _b32rev[c] << shift shift -= 5 if shift < 0: parts.append(binascii.unhexlify('%010x' % acc)) acc = 0 shift = 35 # Process the last, partial quanta last = binascii.unhexlify('%010x' % acc) if padchars == 0: last = '' # No characters elif padchars == 1: last = last[:-1] elif padchars == 3: last = last[:-2] elif padchars == 4: last = last[:-3] elif padchars == 6: last = last[:-4] else: raise TypeError('Incorrect padding') parts.append(last) return EMPTYSTRING.join(parts) # RFC 3548, Base 16 Alphabet specifies uppercase, but hexlify() returns # lowercase. The RFC also recommends against accepting input case # insensitively. def b16encode(s): """Encode a string using Base16. s is the string to encode. The encoded string is returned. """ return binascii.hexlify(s).upper() def b16decode(s, casefold=False): """Decode a Base16 encoded string. s is the string to decode. Optional casefold is a flag specifying whether a lowercase alphabet is acceptable as input. For security purposes, the default is False. The decoded string is returned. A TypeError is raised if s were incorrectly padded or if there are non-alphabet characters present in the string. """ if casefold: s = s.upper() if re.search('[^0-9A-F]', s): raise TypeError('Non-base16 digit found') return binascii.unhexlify(s) # Legacy interface. This code could be cleaned up since I don't believe # binascii has any line length limitations. It just doesn't seem worth it # though. MAXLINESIZE = 76 # Excluding the CRLF MAXBINSIZE = (MAXLINESIZE//4)*3 def encode(input, output): """Encode a file.""" while True: s = input.read(MAXBINSIZE) if not s: break while len(s) < MAXBINSIZE: ns = input.read(MAXBINSIZE-len(s)) if not ns: break s += ns line = binascii.b2a_base64(s) output.write(line) def decode(input, output): """Decode a file.""" while True: line = input.readline() if not line: break s = binascii.a2b_base64(line) output.write(s) def encodestring(s): """Encode a string into multiple lines of base-64 data.""" pieces = [] for i in range(0, len(s), MAXBINSIZE): chunk = s[i : i + MAXBINSIZE] pieces.append(binascii.b2a_base64(chunk)) return "".join(pieces) def decodestring(s): """Decode a string.""" return binascii.a2b_base64(s) # Useable as a script... def test(): """Small test program""" import sys, getopt try: opts, args = getopt.getopt(sys.argv[1:], 'deut') except getopt.error, msg: sys.stdout = sys.stderr print msg print """usage: %s [-d|-e|-u|-t] [file|-] -d, -u: decode -e: encode (default) -t: encode and decode string 'Aladdin:open sesame'"""%sys.argv[0] sys.exit(2) func = encode for o, a in opts: if o == '-e': func = encode if o == '-d': func = decode if o == '-u': func = decode if o == '-t': test1(); return if args and args[0] != '-': fh = open(args[0], 'rb') try: func(fh, sys.stdout) finally: fh.close() else: func(sys.stdin, sys.stdout) def test1(): s0 = "Aladdin:open sesame" s1 = encodestring(s0) s2 = decodestring(s1) print s0, repr(s1), s2 if __name__ == '__main__': test() PK[H@^-^-3site-packages/kitchen/pycompat24/base64/_base64.pyonu[ i:Oc@sdZddlZddlZddlZddddddd d d d d dddgZgedD]Zee^qgZdZ dZ ddZ ddZ dZdZdZdZi dd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6dFdG6dHdI6dJdK6dLdM6dNdO6dPdQ6dRdS6dTdU6dVdW6dXdY6ZejZejgeD]\ZZe^qZegejD]\ZZeeef^qZdZZedd[Zd\Zed]Zd^Z e d;d3Z!d_Z"d`Z#daZ$dbZ%dcZ&ddZ'e(dekre&ndS(fs/RFC 3548: Base16, Base32, Base64 Data EncodingsiNtencodetdecodet encodestringt decodestringt b64encodet b64decodet b32encodet b32decodet b16encodet b16decodetstandard_b64encodetstandard_b64decodeturlsafe_b64encodeturlsafe_b64decodeitcCsJt}x*|jD]\}}||t|7}||d@d>7}|jt|d?t|d ?d @t|d?d @t|d ?t|d ?d @t|d ?d @t|d?t|d @gqSWtj|}|dkrK|d dS|d krc|d dS|dkr{|d dS|dkr|d dS|S(scEncode a string using Base32. s is the string to encode. The encoded string is returned. itis!HHBiiii iii iiis======is====is===iit=( tdivmodtlentrangetstructtunpacktextendt_b32tabt EMPTYSTRINGR( Rtpartstquantatleftovertitc1tc2tc3R((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRs6 .          c Cs tt|d\}}|r0tdn|rVt|idd6|d6}n|rk|j}nd}tjd|}|rt|jd}|dkr|| }qng}d}d } x|D]} tj | } | dkrtd n|t| | >7}| d 8} | dkr|j t j d |d}d } qqWt j d |} |dkrd } np|dkr| d } nW|dkr| d } n>|dkr| d } n%|dkr| d } n td|j | tj|S(sGDecode a Base32 encoded string. s is the string to decode. Optional casefold is a flag specifying whether a lowercase alphabet is acceptable as input. For security purposes, the default is False. RFC 3548 allows for optional mapping of the digit 0 (zero) to the letter O (oh), and for optional mapping of the digit 1 (one) to either the letter I (eye) or letter L (el). The optional argument map01 when not None, specifies which letter the digit 1 should be mapped to (when map01 is not None, the digit 0 is always mapped to the letter O). For security purposes the default is None, so that 0 and 1 are not allowed in the input. The decoded string is returned. A TypeError is raised if s were incorrectly padded or if there are non-alphabet characters present in the string. isIncorrect paddingR9t0t1is(?P[=]*)$tpadi#sNon-base32 digit foundis%010xRiiiiiiiiN(RFRGR"Rtuppertretsearchtgroupt_b32revtgetRtappendRt unhexlifyRMR( Rtcasefoldtmap01RORPtpadcharstmoRNtacctshifttctvaltlast((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRsP                   cCstj|jS(scEncode a string using Base16. s is the string to encode. The encoded string is returned. (RthexlifyRX(R((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRscCsC|r|j}ntjd|r6tdntj|S(swDecode a Base16 encoded string. s is the string to decode. Optional casefold is a flag specifying whether a lowercase alphabet is acceptable as input. For security purposes, the default is False. The decoded string is returned. A TypeError is raised if s were incorrectly padded or if there are non-alphabet characters present in the string. s [^0-9A-F]sNon-base16 digit found(RXRYRZR"RR_(RR`((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR s iLcCsxtr|jt}|s"PnxCt|tkrg|jtt|}|sZPn||7}q%Wtj|}|j|qWdS(sEncode a file.N(tTruetreadt MAXBINSIZERGRRtwrite(tinputtoutputRtnstline((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRs cCsCx<tr>|j}|sPntj|}|j|qWdS(sDecode a file.N(RjtreadlineRR Rm(RnRoRqR((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR,s   cCs]g}xGtdt|tD]-}|||t!}|jtj|qWdj|S(s4Encode a string into multiple lines of base-64 data.iR(RHRGRlR^RRR(RtpiecesRQtchunk((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR6s cCs tj|S(sDecode a string.(RR (R((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyR?sc CsZddl}ddl}y#|j|jdd\}}WnD|jk r}|j|_|GHd|jdGH|jdnXt}xj|D]b\}}|dkrt}n|d krt}n|d krt}n|d krt dSqW|rC|dd krCt |dd }z|||jWd|j Xn||j |jdS(sSmall test programiNitdeutsusage: %s [-d|-e|-u|-t] [file|-] -d, -u: decode -e: encode (default) -t: encode and decode string 'Aladdin:open sesame'iis-es-ds-us-tt-trb( tsystgetopttargvterrortstderrtstdouttexitRRttest1topentclosetstdin( RxRytoptstargsR#tfunctotatfh((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyttestFs2#     cCs5d}t|}t|}|Gt|G|GHdS(NsAladdin:open sesame(RRtrepr(ts0ts1ts2((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pyRcs  t__main__()t__doc__RYRIRt__all__RHt_xtchrRRMRRRRR R R R t _b32alphabetRRLtsortRRtdicttlongR\RtFalseRRR t MAXLINESIZERlRRRRRRt__name__(((sE/usr/lib/python2.7/site-packages/kitchen/pycompat24/base64/_base64.pytsZ      %       7 *J       PK[$site-packages/kitchen/exceptions.pycnu[ i:Oc@s&dZdefdYZdZdS(s ----------------------- Base kitchen exceptions ----------------------- Exception classes for kitchen and the root of the exception hierarchy for all kitchen modules. t KitchenErrorcBseZdZRS(sCBase exception class for any error thrown directly by kitchen. (t__name__t __module__t__doc__(((s6/usr/lib/python2.7/site-packages/kitchen/exceptions.pyRsN(R(Rt ExceptionRt__all__(((s6/usr/lib/python2.7/site-packages/kitchen/exceptions.pytsPK[;"site-packages/kitchen/__init__.pyonu[ i:Oc@sudZddlmZddlmZejd\ZZejdde\ZZ d Z ej e Z d Z d S( sH Kitchen Aggregate of a bunch of unrelated but helpful python modules. i(ti18n(t versionings kitchen.coret use_unicodeit exceptionstreleaseN(iii((iii(s exceptionssrelease(t__doc__tkitchenRRteasy_gettext_setupt_tN_tFalsetb_tbN_t__version_info__tversion_tuple_to_stringt __version__t__all__(((s4/usr/lib/python2.7/site-packages/kitchen/__init__.pytsPK[@o--.site-packages/kitchen/collections/__init__.pycnu[ i:Oc@sLddlmZd ZeeZddlmZddlmZd ZdS( i(tversion_tuple_to_stringii(t strictdict(t StrictDictRRN(iii((iii(s strictdicts StrictDict( tkitchen.versioningRt__version_info__t __version__tkitchen.collectionsRtkitchen.collections.strictdictRt__all__(((s@/usr/lib/python2.7/site-packages/kitchen/collections/__init__.pyts  PK[=!O-site-packages/kitchen/collections/__init__.pynu[from kitchen.versioning import version_tuple_to_string __version_info__ = ((1, 1, 0),) __version__ = version_tuple_to_string(__version_info__) from kitchen.collections import strictdict from kitchen.collections.strictdict import StrictDict __all__ = ('strictdict', 'StrictDict',) PK[ 0site-packages/kitchen/collections/strictdict.pyonu[ i:Oc@s^dZyddlmZWn!ek r=ddlmZnXdefdYZdZdS(s ---------- StrictDict ---------- :class:`kitchen.collections.StrictDict` provides a dictionary that treats :class:`str` and :class:`unicode` as distinct key values. i(t defaultdictt StrictDictcBsJeZdZdZdZdZdZeZdZdZ RS(sQ Map class that considers :class:`unicode` and :class:`str` different keys Ordinarily when you are dealing with a :class:`dict` keyed on strings you want to have keys that have the same characters end up in the same bucket even if one key is :class:`unicode` and the other is a byte :class:`str`. The normal :class:`dict` type does this for :term:`ASCII` characters (but not for anything outside of the :term:`ASCII` range.) Sometimes, however, you want to keep the two string classes strictly separate, for instance, if you're creating a single table that can map from :class:`unicode` characters to :class:`str` characters and vice versa. This class will help you do that by making all :class:`unicode` keys evaluate to a different key than all :class:`str` keys. .. seealso:: :class:`dict` for documentation on this class's methods. This class implements all the standard :class:`dict` methods. Its treatment of :class:`unicode` and :class:`str` keys as separate is the only difference. cCstj|t||fS(N(Rt __getitem__trepr(tselftkey((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyRBscCs#tj|t||f|dS(N(Rt __setitem__R(RRtvalue((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyREscCs tj|t||fdS(N(Rt __delitem__R(RR((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyRHsccs'x tj|D]}|dVqWdS(Ni(Rt__iter__(Rti((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyR KscCst|jS(N(tlistR (R((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pytkeysQscCstj|t||fS(N(Rt __contains__R(RR((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyR Ts( t__name__t __module__t__doc__RRRR titerkeysR R (((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyR)s     N(R(Rt collectionsRt ImportErrortkitchen.pycompat25.collectionsRt__all__(((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyts  .PK[%[M@ @ /site-packages/kitchen/collections/strictdict.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2010 Red Hat, Inc # # kitchen is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # kitchen is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with kitchen; if not, see # # Authors: # Toshio Kuratomi ''' ---------- StrictDict ---------- :class:`kitchen.collections.StrictDict` provides a dictionary that treats :class:`str` and :class:`unicode` as distinct key values. ''' # Pylint disabled messages: # :C0111: We're implementing the dict interface so just reference the dict # documentation rather than having our own docstrings try: # :E0611: Pylint false positive. We try to import from the stdlib but we # have a fallback so this is okay. #pylint:disable-msg=E0611 from collections import defaultdict except ImportError: from kitchen.pycompat25.collections import defaultdict class StrictDict(defaultdict): ''' Map class that considers :class:`unicode` and :class:`str` different keys Ordinarily when you are dealing with a :class:`dict` keyed on strings you want to have keys that have the same characters end up in the same bucket even if one key is :class:`unicode` and the other is a byte :class:`str`. The normal :class:`dict` type does this for :term:`ASCII` characters (but not for anything outside of the :term:`ASCII` range.) Sometimes, however, you want to keep the two string classes strictly separate, for instance, if you're creating a single table that can map from :class:`unicode` characters to :class:`str` characters and vice versa. This class will help you do that by making all :class:`unicode` keys evaluate to a different key than all :class:`str` keys. .. seealso:: :class:`dict` for documentation on this class's methods. This class implements all the standard :class:`dict` methods. Its treatment of :class:`unicode` and :class:`str` keys as separate is the only difference. ''' #pylint:disable-msg=C0111 def __getitem__(self, key): return defaultdict.__getitem__(self, (repr(key), key)) def __setitem__(self, key, value): defaultdict.__setitem__(self, (repr(key), key), value) def __delitem__(self, key): defaultdict.__delitem__(self, (repr(key), key)) def __iter__(self): for i in defaultdict.__iter__(self): yield i[1] iterkeys = __iter__ def keys(self): return list(self.__iter__()) def __contains__(self, key): return defaultdict.__contains__(self, (repr(key), key)) __all__ = ('StrictDict',) PK[@o--.site-packages/kitchen/collections/__init__.pyonu[ i:Oc@sLddlmZd ZeeZddlmZddlmZd ZdS( i(tversion_tuple_to_stringii(t strictdict(t StrictDictRRN(iii((iii(s strictdicts StrictDict( tkitchen.versioningRt__version_info__t __version__tkitchen.collectionsRtkitchen.collections.strictdictRt__all__(((s@/usr/lib/python2.7/site-packages/kitchen/collections/__init__.pyts  PK[ 0site-packages/kitchen/collections/strictdict.pycnu[ i:Oc@s^dZyddlmZWn!ek r=ddlmZnXdefdYZdZdS(s ---------- StrictDict ---------- :class:`kitchen.collections.StrictDict` provides a dictionary that treats :class:`str` and :class:`unicode` as distinct key values. i(t defaultdictt StrictDictcBsJeZdZdZdZdZdZeZdZdZ RS(sQ Map class that considers :class:`unicode` and :class:`str` different keys Ordinarily when you are dealing with a :class:`dict` keyed on strings you want to have keys that have the same characters end up in the same bucket even if one key is :class:`unicode` and the other is a byte :class:`str`. The normal :class:`dict` type does this for :term:`ASCII` characters (but not for anything outside of the :term:`ASCII` range.) Sometimes, however, you want to keep the two string classes strictly separate, for instance, if you're creating a single table that can map from :class:`unicode` characters to :class:`str` characters and vice versa. This class will help you do that by making all :class:`unicode` keys evaluate to a different key than all :class:`str` keys. .. seealso:: :class:`dict` for documentation on this class's methods. This class implements all the standard :class:`dict` methods. Its treatment of :class:`unicode` and :class:`str` keys as separate is the only difference. cCstj|t||fS(N(Rt __getitem__trepr(tselftkey((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyRBscCs#tj|t||f|dS(N(Rt __setitem__R(RRtvalue((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyREscCs tj|t||fdS(N(Rt __delitem__R(RR((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyRHsccs'x tj|D]}|dVqWdS(Ni(Rt__iter__(Rti((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyR KscCst|jS(N(tlistR (R((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pytkeysQscCstj|t||fS(N(Rt __contains__R(RR((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyR Ts( t__name__t __module__t__doc__RRRR titerkeysR R (((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyR)s     N(R(Rt collectionsRt ImportErrortkitchen.pycompat25.collectionsRt__all__(((sB/usr/lib/python2.7/site-packages/kitchen/collections/strictdict.pyts  .PK[$site-packages/kitchen/exceptions.pyonu[ i:Oc@s&dZdefdYZdZdS(s ----------------------- Base kitchen exceptions ----------------------- Exception classes for kitchen and the root of the exception hierarchy for all kitchen modules. t KitchenErrorcBseZdZRS(sCBase exception class for any error thrown directly by kitchen. (t__name__t __module__t__doc__(((s6/usr/lib/python2.7/site-packages/kitchen/exceptions.pyRsN(R(Rt ExceptionRt__all__(((s6/usr/lib/python2.7/site-packages/kitchen/exceptions.pytsPK[ls-site-packages/kitchen/pycompat27/__init__.pycnu[ i:Oc@s2dZddlmZdZeeZd ZdS( s The :mod:`kitchen.pycompat27` module contains implementations of functionality introduced in python-2.7 for use on earlier versions of python. .. versionchanged:: 0.2.3 Made mswindows, MAXFD, and list2cmdline available from the module i(tversion_tuple_to_stringiit subprocessN(iii((iii(s subprocess(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/pycompat27/__init__.pyts PK[|@@8site-packages/kitchen/pycompat27/subprocess/__init__.pycnu[ i:Oc@sdZddlZejdkrZddlTddlmZmZmZddlmZn6ddlTddlmZmZmZddlmZdS( s Implement the modern subprocess interface Python-2.5 and python-2.7 introduce new API features to subprocess. This is a backport of that module for use on earlier python versions. .. seealso:: :mod:`subprocess` for information about using the functions provided here. iNii(t*(tMAXFDt list2cmdlinet mswindows(t__all__(ii( t__doc__tsyst version_infot subprocessRRRRt)kitchen.pycompat27.subprocess._subprocess(((sJ/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/__init__.pyt s   PK[yaa;site-packages/kitchen/pycompat27/subprocess/_subprocess.pycnu[ i:Oc @s|dZddlZejdkZddlZddlZddlZddlZddlZddl Z y e Wnddl m Z nXde fdYZ erddlZddlZddlZdfdYZd fd YZnEddlZeed ZddlZddlZeed d ZdddddddgZerddlmZmZmZmZmZm Z m!Z!m"Z"ej#ddddddddgnyej$dZ%Wn dZ%nXgZ&dZ'dZ(d Z)d!Z*d"Z+d#Z,d$Z-d%Z.de/fd&YZ0d'Z1d(Z2e3d)krxerne2ne1ndS(*s0subprocess - Subprocesses with accessible I/O streams This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, like: os.system os.spawn* os.popen* popen2.* commands.* Information about how the subprocess module can be used to replace these modules and functions can be found below. Using the subprocess module =========================== This module defines one class called Popen: class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): Arguments are: args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or string, but can be explicitly set by using the executable argument. On UNIX, with shell=False (default): In this case, the Popen class uses os.execvp() to execute the child program. args should normally be a sequence. A string will be treated as a sequence with the string as the only item (the program to execute). On UNIX, with shell=True: If args is a string, it specifies the command string to execute through the shell. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional shell arguments. On Windows: the Popen class uses CreateProcess() to execute the child program, which operates on strings. If args is a sequence, it will be converted to a string using the list2cmdline method. Please note that not all MS Windows applications interpret the command line the same way: The list2cmdline is designed for applications using the same rules as the MS C runtime. bufsize, if given, has the same meaning as the corresponding argument to the built-in open() function: 0 means unbuffered, 1 means line buffered, any other positive value means use a buffer of (approximately) that size. A negative bufsize means to use the system default, which usually means fully buffered. The default value for bufsize is 0 (unbuffered). stdin, stdout and stderr specify the executed programs' standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. With None, no redirection will occur; the child's file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout. If preexec_fn is set to a callable object, this object will be called in the child process just before the child is executed. If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. if shell is true, the specified command will be executed through the shell. If cwd is not None, the current directory will be changed to cwd before the child is executed. If env is not None, it defines the environment variables for the new process. If universal_newlines is true, the file objects stdout and stderr are opened as a text files, but lines may be terminated by any of '\n', the Unix end-of-line convention, '\r', the Macintosh convention or '\r\n', the Windows convention. All of these external representations are seen as '\n' by the Python program. Note: This feature is only available if Python is built with universal newline support (the default). Also, the newlines attribute of the file objects stdout, stdin and stderr are not updated by the communicate() method. The startupinfo and creationflags, if given, will be passed to the underlying CreateProcess() function. They can specify things such as appearance of the main window and priority for the new process. (Windows only) This module also defines some shortcut functions: call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) check_call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) check_output(*popenargs, **kwargs): Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: output = check_output(["ls", "-l", "/dev/null"]) Exceptions ---------- Exceptions raised in the child process, before the new program has started to execute, will be re-raised in the parent. Additionally, the exception object will have one extra attribute called 'child_traceback', which is a string containing traceback information from the childs point of view. The most common exception raised is OSError. This occurs, for example, when trying to execute a non-existent file. Applications should prepare for OSErrors. A ValueError will be raised if Popen is called with invalid arguments. check_call() and check_output() will raise CalledProcessError, if the called process returns a non-zero return code. Security -------- Unlike some other popen functions, this implementation will never call /bin/sh implicitly. This means that all characters, including shell metacharacters, can safely be passed to child processes. Popen objects ============= Instances of the Popen class have the following methods: poll() Check if child process has terminated. Returns returncode attribute. wait() Wait for child process to terminate. Returns returncode attribute. communicate(input=None) Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr). Note: The data read is buffered in memory, so do not use this method if the data size is large or unlimited. The following attributes are also available: stdin If the stdin argument is PIPE, this attribute is a file object that provides input to the child process. Otherwise, it is None. stdout If the stdout argument is PIPE, this attribute is a file object that provides output from the child process. Otherwise, it is None. stderr If the stderr argument is PIPE, this attribute is file object that provides error output from the child process. Otherwise, it is None. pid The process ID of the child process. returncode The child return code. A None value indicates that the process hasn't terminated yet. A negative value -N indicates that the child was terminated by signal N (UNIX only). Replacing older functions with the subprocess module ==================================================== In this section, "a ==> b" means that b can be used as a replacement for a. Note: All functions in this section fail (more or less) silently if the executed program cannot be found; this module raises an OSError exception. In the following examples, we assume that the subprocess module is imported with "from subprocess import *". Replacing /bin/sh shell backquote --------------------------------- output=`mycmd myarg` ==> output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] Replacing shell pipe line ------------------------- output=`dmesg | grep hda` ==> p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0] Replacing os.system() --------------------- sts = os.system("mycmd" + " myarg") ==> p = Popen("mycmd" + " myarg", shell=True) pid, sts = os.waitpid(p.pid, 0) Note: * Calling the program through the shell is usually not required. * It's easier to look at the returncode attribute than the exitstatus. A more real-world example would look like this: try: retcode = call("mycmd" + " myarg", shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e Replacing os.spawn* ------------------- P_NOWAIT example: pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") ==> pid = Popen(["/bin/mycmd", "myarg"]).pid P_WAIT example: retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") ==> retcode = call(["/bin/mycmd", "myarg"]) Vector example: os.spawnvp(os.P_NOWAIT, path, args) ==> Popen([path] + args[1:]) Environment example: os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) ==> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) Replacing os.popen* ------------------- pipe = os.popen("cmd", mode='r', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout pipe = os.popen("cmd", mode='w', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin (child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdin, child_stdout) = (p.stdin, p.stdout) (child_stdin, child_stdout, child_stderr) = os.popen3("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr) (child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, bufsize) ==> p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE) (child_stdin, child_stdout) = (p.stdin, p.stdout) Return code handling translates as follows: pipe = os.popen("cmd", 'w') ... rc = pipe.close() if rc is not None and rc % 256: print "There were some errors" ==> process = Popen("cmd", 'w', shell=True, stdin=PIPE) ... process.stdin.close() if process.wait() != 0: print "There were some errors" Replacing popen2.* ------------------ (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) ==> p = Popen(["somestring"], shell=True, bufsize=bufsize stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) On Unix, popen2 also accepts a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) ==> p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, except that: * subprocess.Popen raises an exception if the execution fails * the capturestderr argument is replaced with the stderr argument. * stdin=PIPE and stdout=PIPE must be specified. * popen2 closes all filedescriptors by default, but you have to specify close_fds=True with subprocess.Popen. iNtwin32(tsettCalledProcessErrorcBs#eZdZddZdZRS(sThis exception is raised when a process run by check_call() or check_output() returns a non-zero exit status. The exit status will be stored in the returncode attribute; check_output() will also store the output in the output attribute. cCs||_||_||_dS(N(t returncodetcmdtoutput(tselfRRR((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt__init__s  cCsd|j|jfS(Ns-Command '%s' returned non-zero exit status %d(RR(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt__str__sN(t__name__t __module__t__doc__tNoneRR(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs t STARTUPINFOcBs&eZdZdZdZdZdZRS(iN(R R tdwFlagsR t hStdInputt hStdOutputt hStdErrort wShowWindow(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR s t pywintypescBseZeZRS((R R tIOErrorterror(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRstpolltPIPE_BUFitPopentPIPEtSTDOUTtcallt check_callt check_output(tCREATE_NEW_CONSOLEtCREATE_NEW_PROCESS_GROUPtSTD_INPUT_HANDLEtSTD_OUTPUT_HANDLEtSTD_ERROR_HANDLEtSW_HIDEtSTARTF_USESTDHANDLEStSTARTF_USESHOWWINDOWRRR R!R"R#R$R%t SC_OPEN_MAXicCs_xXtD]O}|jdtj}|dk rytj|WqWtk rSqWXqqWdS(Nt _deadstate(t_activet_internal_polltsystmaxintR tremovet ValueError(tinsttres((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_cleanups  icGsVxOtrQy||SWqttfk rM}|jtjkrGqnqXqWdS(N(tTruetOSErrorRterrnotEINTR(tfunctargste((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_eintr_retry_calls cOst||jS(sRun command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) (Rtwait(t popenargstkwargs((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRscOsSt||}|rO|jd}|dkr=|d}nt||ndS(sSRun command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) R6iN(RtgetR R(R:R;tretcodeR((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs   cOsd|krtdntdt||}|j\}}|j}|r|jd}|dkr||d}nt||d|n|S(sRun command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: >>> check_output(["ls", "-l", "/dev/null"]) 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' The stdout argument is not allowed as it is used internally. To capture standard error in the result, use stderr=STDOUT. >>> check_output(["/bin/sh", "-c", ... "ls -l non_existent_file ; exit 0"], ... stderr=STDOUT) 'ls: non_existent_file: No such file or directory\n' tstdouts3stdout argument not allowed, it will be overridden.R6iRN(R-RRt communicateRR<R R(R:R;tprocessRt unused_errR=R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs    cCsGg}t}x+|D]#}g}|r5|jdnd|kpQd|kpQ| }|rj|jdnx|D]}|dkr|j|qq|dkr|jdt|dg}|jdqq|r|j|g}n|j|qqW|r|j|n|r|j||jdqqWdj|S(s Translate a sequence of arguments into a command line string, using the same rules as the MS C runtime: 1) Arguments are delimited by white space, which is either a space or a tab. 2) A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument. 3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark. 4) Backslashes are interpreted literally, unless they immediately precede a double quotation mark. 5) If backslashes immediately precede a double quotation mark, every pair of backslashes is interpreted as a literal backslash. If the number of backslashes is odd, the last backslash escapes the next double quotation mark as described in rule 3. t s t"s\is\"t(tFalsetappendtlentextendtjoin(tseqtresultt needquotetargtbs_buftc((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt list2cmdline)s4       cBseZddddddeeddeddd ZdZejedZ ddZ dZ e rdZ dZdZd Zdejejejd Zd Zd Zd ZdZdZeZndZ edZdZdZdZe j!e j"e j#e j$dZ%de j&e j'e j(dZdZdZdZ)dZ*dZdZdZRS(icCstt|_t|ttfs4tdntr|d k rUt dn|r|d k s|d k s|d k rt dqn6| d k rt dn|dkrt dnd |_ d |_ d |_ d |_ d |_| |_|j|||\}}}}}}|j||||| | | | || ||||||tr|d k rtj|jd}n|d k rtj|jd}n|d k rtj|jd}qn|d k rtj|d||_ n|d k rK| r0tj|d||_ qKtj|d ||_ n|d k r| rxtj|d||_ qtj|d ||_ nd S( sCreate new Popen instance.sbufsize must be an integers0preexec_fn is not supported on Windows platformssSclose_fds is not supported on Windows platforms if you redirect stdin/stdout/stderrs2startupinfo is only supported on Windows platformsis4creationflags is only supported on Windows platformstwbtrUtrbN(R0REt_child_createdt isinstancetinttlongt TypeErrort mswindowsR R-tstdinR>tstderrtpidRtuniversal_newlinest _get_handlest_execute_childtmsvcrttopen_osfhandletDetachtostfdopen(RR6tbufsizet executableRZR>R[t preexec_fnt close_fdstshelltcwdtenvR]t startupinfot creationflagstp2creadtp2cwritetc2preadtc2pwriteterrreadterrwrite((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRpsX           '         cCs(|jdd}|jdd}|S(Ns s s (treplace(Rtdata((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_translate_newlinesscCsUt|dtsdS|jd||jdkrQ|dk rQ|j|ndS(NRTR'(tgetattrRER)RR RF(Rt_maxintR(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt__del__s cCs |j|j|jgjddkrd}d}|jr|ry|jj|Wqtk r}|jtjkr|jtj krqqXn|jj nV|jrt |jj }|jj n+|jrt |jj }|jj n|j ||fS|j|S(sfInteract with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr).iN(RZR>R[tcountR twriteRR3tEPIPEtEINVALtcloseR8treadR9t _communicate(RtinputR>R[R7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR?s( ' $     cCs |jS(N(R)(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsc Cs|dkr(|dkr(|dkr(dSd\}}d\}}d\}} |dkrtjtj}|dkrtjdd\}} qn]|tkrtjdd\}}n6t|trtj |}ntj |j }|j |}|dkrHtjtj }|dkrtjdd\} }qn]|tkrotjdd\}}n6t|trtj |}ntj |j }|j |}|dkrtjtj } | dkrntjdd\} } qnnr|tkr#tjdd\}} nK|tkr8|} n6t|trYtj |} ntj |j } |j | } |||||| fS(s|Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite iN(NNNNNN(NN(NN(NN(R t _subprocesst GetStdHandleR t CreatePipeRRURVR`t get_osfhandletfilenot_make_inheritableR!R"R( RRZR>R[RnRoRpRqRrRst_((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR^sP$              cCs+tjtj|tjddtjS(s2Return a duplicate of handle, which is inheritableii(RtDuplicateHandletGetCurrentProcesstDUPLICATE_SAME_ACCESS(Rthandle((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR;scCstjjtjjtjdd}tjj|stjjtjjtjd}tjj|st dqn|S(s,Find and return absolut path to w9xpopen.exeis w9xpopen.exesZCannot locate w9xpopen.exe, which is needed for Popen to work with your shell or platform.( RctpathRItdirnameRtGetModuleFileNametexistsR*t exec_prefixt RuntimeError(Rtw9xpopen((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_find_w9xpopenBs   c Cst|tjs!t|}n|dkr9t}nd| ||fkr~|jtjO_| |_ ||_ ||_ n| r&|jtj O_tj |_tjjdd}d||f}tjdkstjj|jdkr&|j}d||f}| tjO} q&nzjy>tj||ddt| | ||| \}}}}Wn%tjk r}t|jnXWd| dk r| jn|dk r|jn|dk r|jnXt|_ ||_!||_"|jdS(s$Execute program (MS Windows version)tCOMSPECscmd.exes%s /c %sls command.coms"%s" %sN(#RUttypest StringTypesRPR R RRR$RRRR%R#RRctenvironR<t GetVersionRtbasenametlowerRRt CreateProcessRVRRt WindowsErrorR6tCloseR1RTt_handleR\(RR6RfRgRhRjRkR]RlRmRiRnRoRpRqRrRstcomspecRthpthtR\ttidR7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR_SsP                 cCsF|jdkr?||jd|kr?||j|_q?n|jS(sCheck if child process has terminated. Returns returncode attribute. This method is called by __del__, so it can only refer to objects in its local scope. iN(RR R(RR't_WaitForSingleObjectt_WAIT_OBJECT_0t_GetExitCodeProcess((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR)s cCsD|jdkr=tj|jtjtj|j|_n|jS(sOWait for child process to terminate. Returns returncode attribute.N(RR RtWaitForSingleObjectRtINFINITEtGetExitCodeProcess(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR9s   cCs|j|jdS(N(RFR(Rtfhtbuffer((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _readerthreadscCsd}d}|jrYg}tjd|jd|j|f}|jt|jn|jrg}tjd|jd|j|f}|jt|jn|j r|dk ry|j j |Wqt k r}|j t j krqqXn|j jn|jr&|jn|jr<|jn|dk rU|d}n|dk rn|d}n|jrttdr|r|j|}n|r|j|}qn|j||fS(NttargetR6itnewlines(R R>t threadingtThreadRt setDaemonR1tstartR[RZR{RR3R|R~RIR]thasattrtfileRvR9(RRR>R[t stdout_threadt stderr_threadR7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsJ                  cCs|tjkr|jnc|tjkrDtj|jtjn;|tjkrltj|jtjntd|fdS(s)Send a signal to the process sUnsupported signal: %sN( tsignaltSIGTERMt terminatet CTRL_C_EVENTRctkillR\tCTRL_BREAK_EVENTR-(Rtsig((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt send_signals cCstj|jddS(s#Terminates the process iN(RtTerminateProcessR(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsc CsKd\}}d\}}d\}} |dkr3nE|tkrT|j\}}n$t|trl|}n |j}|dkrnE|tkr|j\}}n$t|tr|}n |j}|dkrnZ|tkr|j\}} n9|tkr|} n$t|tr)|} n |j} |||||| fS(s|Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite N(NN(NN(NN(R Rt pipe_cloexecRURVRR( RRZR>R[RnRoRpRqRrRs((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR^ s:                 cCs~y tj}Wntk r&d}nXtj|tj}|r_tj|tj||Bntj|tj||@dS(Ni(tfcntlt FD_CLOEXECtAttributeErrortF_GETFDtF_SETFD(Rtfdtcloexect cloexec_flagtold((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_set_cloexec_flag6s   cCs6tj\}}|j||j|||fS(s#Create a pipe with FDs set CLOEXEC.(RctpipeR(Rtrtw((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRCs  cCsttdr6tjd|tj|dtnGxDtdtD]3}||kr^qFnytj|WqFqFXqFWdS(Nt closerangeii(RRcRtMAXFDtxrangeR~(Rtbutti((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _close_fdsOs csvt|tjr|g}n t|}| rVddg|}|rV||dztj}tjyt j _ Wn|rtj nnXt _j dkr y| d k rt j| n| d k r#t j| n|d k r?t j|nt j||dkrjt j|}n|dks|dkrt j|}nfd}|| d||d||dtd }xL| ||gD];}||kr|dkrt j||j|qqW|r>jd|n|d k rZt j|n|rj|n|d krt j||nt j|||Wn\tj\}}}tj|||}dj||_t j|tj|nXt j d n|rtj nWd t j|X| d k rY| d k rYt j| n|d k r| d k rt j|n|d k r|d k rt j|nt!t j"|d }Wd t j|X|dkrryt!t j#j dWn+t$k r#}|j%t%j&kr$q$nXtj'|}x3| | |fD]"}|d k rCt j|qCqCW|nd S( sExecute program (POSIX version)s/bin/shs-ciicsB||krj|tn|dk r>tj||ndS(N(RRER Rctdup2(tatb(R(sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_dup2s  iRRDiNi(N((RURRtlistR Rtgct isenabledtdisableRctforkR\tenableR1RTR~tdupRtaddRtchdirtexecvptexecvpeR*texc_infot tracebacktformat_exceptionRItchild_tracebackR{tpickletdumpst_exitR8RtwaitpidR2R3tECHILDtloads(RR6RfRgRhRjRkR]RlRmRiRnRoRpRqRrRst errpipe_readt errpipe_writetgc_was_enabledRtclosedRtexc_typet exc_valuettbt exc_linesRuR7tchild_exception((RsM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR_]s                          cCsM||r|| |_n*||r=|||_n tddS(NsUnknown child exit status!(RR(Rtstst _WIFSIGNALEDt _WTERMSIGt _WIFEXITEDt _WEXITSTATUS((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_handle_exitstatuss   cCs|jdkryy;||j|\}}||jkrI|j|nWqy|k ru|dk rv||_qvqyXn|jS(sCheck if child process has terminated. Returns returncode attribute. This method is called by __del__, so it cannot reference anything outside of the local scope (nor can any methods it calls). N(RR R\R(RR't_waitpidt_WNOHANGt _os_errorR\R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR)s   cCs||jdkruy"ttj|jd\}}Wn1tk rd}|jtjkr[nd}nX|j |n|jS(sOWait for child process to terminate. Returns returncode attribute.iN( RR R8RcRR\R2R3RR(RR\RR7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR9 s" cCs|jr/|jj|s/|jjq/ntrM|j|\}}n|j|\}}|dk rdj|}n|dk rdj|}n|jrt t dr|r|j |}n|r|j |}qn|j ||fS(NRDR( RZtflushR~t _has_pollt_communicate_with_pollt_communicate_with_selectR RIR]RRRvR9(RRR>R[((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs$     cs>d}d}ii}tjfd}fd}|jrm|rm||jtjntjtjB}|jr||j|g||jj<}n|j r||j |g||j j<}nd}xHr3yj} Wn5tj k r9} | j dt j kr3qnnXx| D]\} } | tj@r|||t!} y|tj| | 7}Wn5tk r} | j t jkr|| qq,X|t|kr,|| q,qA| |@r"tj| d}|s|| n|| j|qA|| qAWqW||fS(Ncs*j|j|||jRR[RR6R3R4t _PIPE_BUFRcR{R2R|RGRRF(RRR>R[t fd2outputRR tselect_POLLIN_POLLPRIt input_offsettreadyR7RtmodetchunkRu((RRsM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR>sT        cCsg}g}d}d}|jr:|r:|j|jn|jr\|j|jg}n|jr~|j|jg}nd}x|s|ry"tj||g\}}} Wn5tjk r} | jdtj krqnnX|j|kr|||t !} yt j |jj | } WnHtk rv} | jtjkrp|jj|j|jqqX|| 7}|t|kr|jj|j|jqn|j|krt j|jj d} | dkr |jj|j|jn|j| n|j|krt j|jj d} | dkrr|jj|j|jn|j| qqW||fS(NiiRD(R RZRFR>R[R RR6R3R4RRcR{RR2R|R~R,RGR(RRtread_sett write_setR>R[RtrlisttwlisttxlistR7Rt bytes_writtenRu((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR{s\    "       cCstj|j|dS(s)Send a signal to the process N(RcRR\(RR((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRscCs|jtjdS(s/Terminate the process with SIGTERM N(RRR(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRscCs|jtjdS(s*Kill the process with SIGKILL N(RRtSIGKILL(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsN(+R R R RERRvR*R+R(RyR?RRYR^RRR_RRt WAIT_OBJECT_0RR)R9RRRRRR1RRRRct WIFSIGNALEDtWTERMSIGt WIFEXITEDt WEXITSTATUSRRtWNOHANGRRR(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRosR   P  "  9   N  2   -      ! = 9  cCs(tdgdtjd}dGH|GHtjdkr`tdgdd}|jndGHtd gdt}td d gd |jdt}t|jdGHHd GHytdgjGHWnFtk r}|j t j krdGHdGH|j GHq$dG|j GHnXt j dIJdS(NtpsR>is Process list:tidRgcSs tjdS(Nid(Rctsetuid(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pytssLooking for 'hda'...tdmesgtgrepthdaRZsTrying a weird file...s/this/path/does/not/exists'The file didn't exist. I thought so...sChild traceback:tErrorsGosh. No error.(RRR?RctgetuidR9R>treprR2R3tENOENTRR*R[(tplisttptp1tp2R7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _demo_posixs* ! cCsldGHtddtdt}tdd|jdt}t|jdGHdGHtd }|jdS( Ns%Looking for 'PROMPT' in set output...RR>Ris find "PROMPT"RZisExecuting calc...tcalc(RRR1R>R-R?R9(R1R2R0((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _demo_windowss t__main__(4R R*tplatformRYRcRRRRR3Rtkitchen.pycompat24.setst ExceptionRRR`RR RR RRRRRwRt__all__RRR R!R"R#R$R%RHtsysconfRR(R0RRR8RRRRPtobjectRR3R5R (((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pytsn               :     ! FX )   PK[(,-YY7site-packages/kitchen/pycompat27/subprocess/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (c) 2011 Red Hat, Inc # # This file is part of kitchen # # kitchen is free software; you can redistribute it and/or modify it under the # terms of the GNU Lesser General Public License as published by the Free # Software Foundation; either version 2.1 of the License, or (at your option) # any later version. # # kitchen is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for # more details. # # You should have received a copy of the GNU Lesser General Public License # along with kitchen; if not, see # # Authors: # Toshio Kuratomi ''' Implement the modern subprocess interface Python-2.5 and python-2.7 introduce new API features to subprocess. This is a backport of that module for use on earlier python versions. .. seealso:: :mod:`subprocess` for information about using the functions provided here. ''' import sys # :W0401,W0611,W0614: We're importing compatibility to the python-2.7 version # of subprocess. #pylint:disable-msg=W0401,W0611,W0614 if sys.version_info >= (2, 7): from subprocess import * from subprocess import MAXFD, list2cmdline, mswindows from subprocess import __all__ else: from kitchen.pycompat27.subprocess._subprocess import * from kitchen.pycompat27.subprocess._subprocess import MAXFD, \ list2cmdline, mswindows from kitchen.pycompat27.subprocess._subprocess import __all__ PK[yaa;site-packages/kitchen/pycompat27/subprocess/_subprocess.pyonu[ i:Oc @s|dZddlZejdkZddlZddlZddlZddlZddlZddl Z y e Wnddl m Z nXde fdYZ erddlZddlZddlZdfdYZd fd YZnEddlZeed ZddlZddlZeed d ZdddddddgZerddlmZmZmZmZmZm Z m!Z!m"Z"ej#ddddddddgnyej$dZ%Wn dZ%nXgZ&dZ'dZ(d Z)d!Z*d"Z+d#Z,d$Z-d%Z.de/fd&YZ0d'Z1d(Z2e3d)krxerne2ne1ndS(*s0subprocess - Subprocesses with accessible I/O streams This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, like: os.system os.spawn* os.popen* popen2.* commands.* Information about how the subprocess module can be used to replace these modules and functions can be found below. Using the subprocess module =========================== This module defines one class called Popen: class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): Arguments are: args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or string, but can be explicitly set by using the executable argument. On UNIX, with shell=False (default): In this case, the Popen class uses os.execvp() to execute the child program. args should normally be a sequence. A string will be treated as a sequence with the string as the only item (the program to execute). On UNIX, with shell=True: If args is a string, it specifies the command string to execute through the shell. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional shell arguments. On Windows: the Popen class uses CreateProcess() to execute the child program, which operates on strings. If args is a sequence, it will be converted to a string using the list2cmdline method. Please note that not all MS Windows applications interpret the command line the same way: The list2cmdline is designed for applications using the same rules as the MS C runtime. bufsize, if given, has the same meaning as the corresponding argument to the built-in open() function: 0 means unbuffered, 1 means line buffered, any other positive value means use a buffer of (approximately) that size. A negative bufsize means to use the system default, which usually means fully buffered. The default value for bufsize is 0 (unbuffered). stdin, stdout and stderr specify the executed programs' standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. With None, no redirection will occur; the child's file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout. If preexec_fn is set to a callable object, this object will be called in the child process just before the child is executed. If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. if shell is true, the specified command will be executed through the shell. If cwd is not None, the current directory will be changed to cwd before the child is executed. If env is not None, it defines the environment variables for the new process. If universal_newlines is true, the file objects stdout and stderr are opened as a text files, but lines may be terminated by any of '\n', the Unix end-of-line convention, '\r', the Macintosh convention or '\r\n', the Windows convention. All of these external representations are seen as '\n' by the Python program. Note: This feature is only available if Python is built with universal newline support (the default). Also, the newlines attribute of the file objects stdout, stdin and stderr are not updated by the communicate() method. The startupinfo and creationflags, if given, will be passed to the underlying CreateProcess() function. They can specify things such as appearance of the main window and priority for the new process. (Windows only) This module also defines some shortcut functions: call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) check_call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) check_output(*popenargs, **kwargs): Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: output = check_output(["ls", "-l", "/dev/null"]) Exceptions ---------- Exceptions raised in the child process, before the new program has started to execute, will be re-raised in the parent. Additionally, the exception object will have one extra attribute called 'child_traceback', which is a string containing traceback information from the childs point of view. The most common exception raised is OSError. This occurs, for example, when trying to execute a non-existent file. Applications should prepare for OSErrors. A ValueError will be raised if Popen is called with invalid arguments. check_call() and check_output() will raise CalledProcessError, if the called process returns a non-zero return code. Security -------- Unlike some other popen functions, this implementation will never call /bin/sh implicitly. This means that all characters, including shell metacharacters, can safely be passed to child processes. Popen objects ============= Instances of the Popen class have the following methods: poll() Check if child process has terminated. Returns returncode attribute. wait() Wait for child process to terminate. Returns returncode attribute. communicate(input=None) Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr). Note: The data read is buffered in memory, so do not use this method if the data size is large or unlimited. The following attributes are also available: stdin If the stdin argument is PIPE, this attribute is a file object that provides input to the child process. Otherwise, it is None. stdout If the stdout argument is PIPE, this attribute is a file object that provides output from the child process. Otherwise, it is None. stderr If the stderr argument is PIPE, this attribute is file object that provides error output from the child process. Otherwise, it is None. pid The process ID of the child process. returncode The child return code. A None value indicates that the process hasn't terminated yet. A negative value -N indicates that the child was terminated by signal N (UNIX only). Replacing older functions with the subprocess module ==================================================== In this section, "a ==> b" means that b can be used as a replacement for a. Note: All functions in this section fail (more or less) silently if the executed program cannot be found; this module raises an OSError exception. In the following examples, we assume that the subprocess module is imported with "from subprocess import *". Replacing /bin/sh shell backquote --------------------------------- output=`mycmd myarg` ==> output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] Replacing shell pipe line ------------------------- output=`dmesg | grep hda` ==> p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0] Replacing os.system() --------------------- sts = os.system("mycmd" + " myarg") ==> p = Popen("mycmd" + " myarg", shell=True) pid, sts = os.waitpid(p.pid, 0) Note: * Calling the program through the shell is usually not required. * It's easier to look at the returncode attribute than the exitstatus. A more real-world example would look like this: try: retcode = call("mycmd" + " myarg", shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e Replacing os.spawn* ------------------- P_NOWAIT example: pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") ==> pid = Popen(["/bin/mycmd", "myarg"]).pid P_WAIT example: retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") ==> retcode = call(["/bin/mycmd", "myarg"]) Vector example: os.spawnvp(os.P_NOWAIT, path, args) ==> Popen([path] + args[1:]) Environment example: os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) ==> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) Replacing os.popen* ------------------- pipe = os.popen("cmd", mode='r', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout pipe = os.popen("cmd", mode='w', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin (child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdin, child_stdout) = (p.stdin, p.stdout) (child_stdin, child_stdout, child_stderr) = os.popen3("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr) (child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, bufsize) ==> p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE) (child_stdin, child_stdout) = (p.stdin, p.stdout) Return code handling translates as follows: pipe = os.popen("cmd", 'w') ... rc = pipe.close() if rc is not None and rc % 256: print "There were some errors" ==> process = Popen("cmd", 'w', shell=True, stdin=PIPE) ... process.stdin.close() if process.wait() != 0: print "There were some errors" Replacing popen2.* ------------------ (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) ==> p = Popen(["somestring"], shell=True, bufsize=bufsize stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) On Unix, popen2 also accepts a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) ==> p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, except that: * subprocess.Popen raises an exception if the execution fails * the capturestderr argument is replaced with the stderr argument. * stdin=PIPE and stdout=PIPE must be specified. * popen2 closes all filedescriptors by default, but you have to specify close_fds=True with subprocess.Popen. iNtwin32(tsettCalledProcessErrorcBs#eZdZddZdZRS(sThis exception is raised when a process run by check_call() or check_output() returns a non-zero exit status. The exit status will be stored in the returncode attribute; check_output() will also store the output in the output attribute. cCs||_||_||_dS(N(t returncodetcmdtoutput(tselfRRR((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt__init__s  cCsd|j|jfS(Ns-Command '%s' returned non-zero exit status %d(RR(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt__str__sN(t__name__t __module__t__doc__tNoneRR(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs t STARTUPINFOcBs&eZdZdZdZdZdZRS(iN(R R tdwFlagsR t hStdInputt hStdOutputt hStdErrort wShowWindow(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR s t pywintypescBseZeZRS((R R tIOErrorterror(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRstpolltPIPE_BUFitPopentPIPEtSTDOUTtcallt check_callt check_output(tCREATE_NEW_CONSOLEtCREATE_NEW_PROCESS_GROUPtSTD_INPUT_HANDLEtSTD_OUTPUT_HANDLEtSTD_ERROR_HANDLEtSW_HIDEtSTARTF_USESTDHANDLEStSTARTF_USESHOWWINDOWRRR R!R"R#R$R%t SC_OPEN_MAXicCs_xXtD]O}|jdtj}|dk rytj|WqWtk rSqWXqqWdS(Nt _deadstate(t_activet_internal_polltsystmaxintR tremovet ValueError(tinsttres((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_cleanups  icGsVxOtrQy||SWqttfk rM}|jtjkrGqnqXqWdS(N(tTruetOSErrorRterrnotEINTR(tfunctargste((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_eintr_retry_calls cOst||jS(sRun command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) (Rtwait(t popenargstkwargs((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRscOsSt||}|rO|jd}|dkr=|d}nt||ndS(sSRun command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) R6iN(RtgetR R(R:R;tretcodeR((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs   cOsd|krtdntdt||}|j\}}|j}|r|jd}|dkr||d}nt||d|n|S(sRun command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: >>> check_output(["ls", "-l", "/dev/null"]) 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' The stdout argument is not allowed as it is used internally. To capture standard error in the result, use stderr=STDOUT. >>> check_output(["/bin/sh", "-c", ... "ls -l non_existent_file ; exit 0"], ... stderr=STDOUT) 'ls: non_existent_file: No such file or directory\n' tstdouts3stdout argument not allowed, it will be overridden.R6iRN(R-RRt communicateRR<R R(R:R;tprocessRt unused_errR=R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs    cCsGg}t}x+|D]#}g}|r5|jdnd|kpQd|kpQ| }|rj|jdnx|D]}|dkr|j|qq|dkr|jdt|dg}|jdqq|r|j|g}n|j|qqW|r|j|n|r|j||jdqqWdj|S(s Translate a sequence of arguments into a command line string, using the same rules as the MS C runtime: 1) Arguments are delimited by white space, which is either a space or a tab. 2) A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument. 3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark. 4) Backslashes are interpreted literally, unless they immediately precede a double quotation mark. 5) If backslashes immediately precede a double quotation mark, every pair of backslashes is interpreted as a literal backslash. If the number of backslashes is odd, the last backslash escapes the next double quotation mark as described in rule 3. t s t"s\is\"t(tFalsetappendtlentextendtjoin(tseqtresultt needquotetargtbs_buftc((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt list2cmdline)s4       cBseZddddddeeddeddd ZdZejedZ ddZ dZ e rdZ dZdZd Zdejejejd Zd Zd Zd ZdZdZeZndZ edZdZdZdZe j!e j"e j#e j$dZ%de j&e j'e j(dZdZdZdZ)dZ*dZdZdZRS(icCstt|_t|ttfs4tdntr|d k rUt dn|r|d k s|d k s|d k rt dqn6| d k rt dn|dkrt dnd |_ d |_ d |_ d |_ d |_| |_|j|||\}}}}}}|j||||| | | | || ||||||tr|d k rtj|jd}n|d k rtj|jd}n|d k rtj|jd}qn|d k rtj|d||_ n|d k rK| r0tj|d||_ qKtj|d ||_ n|d k r| rxtj|d||_ qtj|d ||_ nd S( sCreate new Popen instance.sbufsize must be an integers0preexec_fn is not supported on Windows platformssSclose_fds is not supported on Windows platforms if you redirect stdin/stdout/stderrs2startupinfo is only supported on Windows platformsis4creationflags is only supported on Windows platformstwbtrUtrbN(R0REt_child_createdt isinstancetinttlongt TypeErrort mswindowsR R-tstdinR>tstderrtpidRtuniversal_newlinest _get_handlest_execute_childtmsvcrttopen_osfhandletDetachtostfdopen(RR6tbufsizet executableRZR>R[t preexec_fnt close_fdstshelltcwdtenvR]t startupinfot creationflagstp2creadtp2cwritetc2preadtc2pwriteterrreadterrwrite((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRpsX           '         cCs(|jdd}|jdd}|S(Ns s s (treplace(Rtdata((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_translate_newlinesscCsUt|dtsdS|jd||jdkrQ|dk rQ|j|ndS(NRTR'(tgetattrRER)RR RF(Rt_maxintR(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt__del__s cCs |j|j|jgjddkrd}d}|jr|ry|jj|Wqtk r}|jtjkr|jtj krqqXn|jj nV|jrt |jj }|jj n+|jrt |jj }|jj n|j ||fS|j|S(sfInteract with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr).iN(RZR>R[tcountR twriteRR3tEPIPEtEINVALtcloseR8treadR9t _communicate(RtinputR>R[R7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR?s( ' $     cCs |jS(N(R)(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsc Cs|dkr(|dkr(|dkr(dSd\}}d\}}d\}} |dkrtjtj}|dkrtjdd\}} qn]|tkrtjdd\}}n6t|trtj |}ntj |j }|j |}|dkrHtjtj }|dkrtjdd\} }qn]|tkrotjdd\}}n6t|trtj |}ntj |j }|j |}|dkrtjtj } | dkrntjdd\} } qnnr|tkr#tjdd\}} nK|tkr8|} n6t|trYtj |} ntj |j } |j | } |||||| fS(s|Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite iN(NNNNNN(NN(NN(NN(R t _subprocesst GetStdHandleR t CreatePipeRRURVR`t get_osfhandletfilenot_make_inheritableR!R"R( RRZR>R[RnRoRpRqRrRst_((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR^sP$              cCs+tjtj|tjddtjS(s2Return a duplicate of handle, which is inheritableii(RtDuplicateHandletGetCurrentProcesstDUPLICATE_SAME_ACCESS(Rthandle((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR;scCstjjtjjtjdd}tjj|stjjtjjtjd}tjj|st dqn|S(s,Find and return absolut path to w9xpopen.exeis w9xpopen.exesZCannot locate w9xpopen.exe, which is needed for Popen to work with your shell or platform.( RctpathRItdirnameRtGetModuleFileNametexistsR*t exec_prefixt RuntimeError(Rtw9xpopen((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_find_w9xpopenBs   c Cst|tjs!t|}n|dkr9t}nd| ||fkr~|jtjO_| |_ ||_ ||_ n| r&|jtj O_tj |_tjjdd}d||f}tjdkstjj|jdkr&|j}d||f}| tjO} q&nzjy>tj||ddt| | ||| \}}}}Wn%tjk r}t|jnXWd| dk r| jn|dk r|jn|dk r|jnXt|_ ||_!||_"|jdS(s$Execute program (MS Windows version)tCOMSPECscmd.exes%s /c %sls command.coms"%s" %sN(#RUttypest StringTypesRPR R RRR$RRRR%R#RRctenvironR<t GetVersionRtbasenametlowerRRt CreateProcessRVRRt WindowsErrorR6tCloseR1RTt_handleR\(RR6RfRgRhRjRkR]RlRmRiRnRoRpRqRrRstcomspecRthpthtR\ttidR7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR_SsP                 cCsF|jdkr?||jd|kr?||j|_q?n|jS(sCheck if child process has terminated. Returns returncode attribute. This method is called by __del__, so it can only refer to objects in its local scope. iN(RR R(RR't_WaitForSingleObjectt_WAIT_OBJECT_0t_GetExitCodeProcess((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR)s cCsD|jdkr=tj|jtjtj|j|_n|jS(sOWait for child process to terminate. Returns returncode attribute.N(RR RtWaitForSingleObjectRtINFINITEtGetExitCodeProcess(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR9s   cCs|j|jdS(N(RFR(Rtfhtbuffer((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _readerthreadscCsd}d}|jrYg}tjd|jd|j|f}|jt|jn|jrg}tjd|jd|j|f}|jt|jn|j r|dk ry|j j |Wqt k r}|j t j krqqXn|j jn|jr&|jn|jr<|jn|dk rU|d}n|dk rn|d}n|jrttdr|r|j|}n|r|j|}qn|j||fS(NttargetR6itnewlines(R R>t threadingtThreadRt setDaemonR1tstartR[RZR{RR3R|R~RIR]thasattrtfileRvR9(RRR>R[t stdout_threadt stderr_threadR7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsJ                  cCs|tjkr|jnc|tjkrDtj|jtjn;|tjkrltj|jtjntd|fdS(s)Send a signal to the process sUnsupported signal: %sN( tsignaltSIGTERMt terminatet CTRL_C_EVENTRctkillR\tCTRL_BREAK_EVENTR-(Rtsig((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt send_signals cCstj|jddS(s#Terminates the process iN(RtTerminateProcessR(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsc CsKd\}}d\}}d\}} |dkr3nE|tkrT|j\}}n$t|trl|}n |j}|dkrnE|tkr|j\}}n$t|tr|}n |j}|dkrnZ|tkr|j\}} n9|tkr|} n$t|tr)|} n |j} |||||| fS(s|Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite N(NN(NN(NN(R Rt pipe_cloexecRURVRR( RRZR>R[RnRoRpRqRrRs((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR^ s:                 cCs~y tj}Wntk r&d}nXtj|tj}|r_tj|tj||Bntj|tj||@dS(Ni(tfcntlt FD_CLOEXECtAttributeErrortF_GETFDtF_SETFD(Rtfdtcloexect cloexec_flagtold((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_set_cloexec_flag6s   cCs6tj\}}|j||j|||fS(s#Create a pipe with FDs set CLOEXEC.(RctpipeR(Rtrtw((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRCs  cCsttdr6tjd|tj|dtnGxDtdtD]3}||kr^qFnytj|WqFqFXqFWdS(Nt closerangeii(RRcRtMAXFDtxrangeR~(Rtbutti((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _close_fdsOs csvt|tjr|g}n t|}| rVddg|}|rV||dztj}tjyt j _ Wn|rtj nnXt _j dkr y| d k rt j| n| d k r#t j| n|d k r?t j|nt j||dkrjt j|}n|dks|dkrt j|}nfd}|| d||d||dtd }xL| ||gD];}||kr|dkrt j||j|qqW|r>jd|n|d k rZt j|n|rj|n|d krt j||nt j|||Wn\tj\}}}tj|||}dj||_t j|tj|nXt j d n|rtj nWd t j|X| d k rY| d k rYt j| n|d k r| d k rt j|n|d k r|d k rt j|nt!t j"|d }Wd t j|X|dkrryt!t j#j dWn+t$k r#}|j%t%j&kr$q$nXtj'|}x3| | |fD]"}|d k rCt j|qCqCW|nd S( sExecute program (POSIX version)s/bin/shs-ciicsB||krj|tn|dk r>tj||ndS(N(RRER Rctdup2(tatb(R(sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_dup2s  iRRDiNi(N((RURRtlistR Rtgct isenabledtdisableRctforkR\tenableR1RTR~tdupRtaddRtchdirtexecvptexecvpeR*texc_infot tracebacktformat_exceptionRItchild_tracebackR{tpickletdumpst_exitR8RtwaitpidR2R3tECHILDtloads(RR6RfRgRhRjRkR]RlRmRiRnRoRpRqRrRst errpipe_readt errpipe_writetgc_was_enabledRtclosedRtexc_typet exc_valuettbt exc_linesRuR7tchild_exception((RsM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR_]s                          cCsM||r|| |_n*||r=|||_n tddS(NsUnknown child exit status!(RR(Rtstst _WIFSIGNALEDt _WTERMSIGt _WIFEXITEDt _WEXITSTATUS((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt_handle_exitstatuss   cCs|jdkryy;||j|\}}||jkrI|j|nWqy|k ru|dk rv||_qvqyXn|jS(sCheck if child process has terminated. Returns returncode attribute. This method is called by __del__, so it cannot reference anything outside of the local scope (nor can any methods it calls). N(RR R\R(RR't_waitpidt_WNOHANGt _os_errorR\R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR)s   cCs||jdkruy"ttj|jd\}}Wn1tk rd}|jtjkr[nd}nX|j |n|jS(sOWait for child process to terminate. Returns returncode attribute.iN( RR R8RcRR\R2R3RR(RR\RR7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR9 s" cCs|jr/|jj|s/|jjq/ntrM|j|\}}n|j|\}}|dk rdj|}n|dk rdj|}n|jrt t dr|r|j |}n|r|j |}qn|j ||fS(NRDR( RZtflushR~t _has_pollt_communicate_with_pollt_communicate_with_selectR RIR]RRRvR9(RRR>R[((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRs$     cs>d}d}ii}tjfd}fd}|jrm|rm||jtjntjtjB}|jr||j|g||jj<}n|j r||j |g||j j<}nd}xHr3yj} Wn5tj k r9} | j dt j kr3qnnXx| D]\} } | tj@r|||t!} y|tj| | 7}Wn5tk r} | j t jkr|| qq,X|t|kr,|| q,qA| |@r"tj| d}|s|| n|| j|qA|| qAWqW||fS(Ncs*j|j|||jRR[RR6R3R4t _PIPE_BUFRcR{R2R|RGRRF(RRR>R[t fd2outputRR tselect_POLLIN_POLLPRIt input_offsettreadyR7RtmodetchunkRu((RRsM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR>sT        cCsg}g}d}d}|jr:|r:|j|jn|jr\|j|jg}n|jr~|j|jg}nd}x|s|ry"tj||g\}}} Wn5tjk r} | jdtj krqnnX|j|kr|||t !} yt j |jj | } WnHtk rv} | jtjkrp|jj|j|jqqX|| 7}|t|kr|jj|j|jqn|j|krt j|jj d} | dkr |jj|j|jn|j| n|j|krt j|jj d} | dkrr|jj|j|jn|j| qqW||fS(NiiRD(R RZRFR>R[R RR6R3R4RRcR{RR2R|R~R,RGR(RRtread_sett write_setR>R[RtrlisttwlisttxlistR7Rt bytes_writtenRu((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyR{s\    "       cCstj|j|dS(s)Send a signal to the process N(RcRR\(RR((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRscCs|jtjdS(s/Terminate the process with SIGTERM N(RRR(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRscCs|jtjdS(s*Kill the process with SIGKILL N(RRtSIGKILL(R((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRsN(+R R R RERRvR*R+R(RyR?RRYR^RRR_RRt WAIT_OBJECT_0RR)R9RRRRRR1RRRRct WIFSIGNALEDtWTERMSIGt WIFEXITEDt WEXITSTATUSRRtWNOHANGRRR(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyRosR   P  "  9   N  2   -      ! = 9  cCs(tdgdtjd}dGH|GHtjdkr`tdgdd}|jndGHtd gdt}td d gd |jdt}t|jdGHHd GHytdgjGHWnFtk r}|j t j krdGHdGH|j GHq$dG|j GHnXt j dIJdS(NtpsR>is Process list:tidRgcSs tjdS(Nid(Rctsetuid(((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pytssLooking for 'hda'...tdmesgtgrepthdaRZsTrying a weird file...s/this/path/does/not/exists'The file didn't exist. I thought so...sChild traceback:tErrorsGosh. No error.(RRR?RctgetuidR9R>treprR2R3tENOENTRR*R[(tplisttptp1tp2R7((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _demo_posixs* ! cCsldGHtddtdt}tdd|jdt}t|jdGHdGHtd }|jdS( Ns%Looking for 'PROMPT' in set output...RR>Ris find "PROMPT"RZisExecuting calc...tcalc(RRR1R>R-R?R9(R1R2R0((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pyt _demo_windowss t__main__(4R R*tplatformRYRcRRRRR3Rtkitchen.pycompat24.setst ExceptionRRR`RR RR RRRRRwRt__all__RRR R!R"R#R$R%RHtsysconfRR(R0RRR8RRRRPtobjectRR3R5R (((sM/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/_subprocess.pytsn               :     ! FX )   PK[|@@8site-packages/kitchen/pycompat27/subprocess/__init__.pyonu[ i:Oc@sdZddlZejdkrZddlTddlmZmZmZddlmZn6ddlTddlmZmZmZddlmZdS( s Implement the modern subprocess interface Python-2.5 and python-2.7 introduce new API features to subprocess. This is a backport of that module for use on earlier python versions. .. seealso:: :mod:`subprocess` for information about using the functions provided here. iNii(t*(tMAXFDt list2cmdlinet mswindows(t__all__(ii( t__doc__tsyst version_infot subprocessRRRRt)kitchen.pycompat27.subprocess._subprocess(((sJ/usr/lib/python2.7/site-packages/kitchen/pycompat27/subprocess/__init__.pyt s   PK[o:site-packages/kitchen/pycompat27/subprocess/_subprocess.pynu[# subprocess - Subprocesses with accessible I/O streams # # For more information about this module, see PEP 324. # # This module should remain compatible with Python 2.2, see PEP 291. # # Copyright (c) 2003-2005 by Peter Astrand # # Licensed to PSF under a Contributor Agreement. # See http://www.python.org/2.4/license for licensing details. r"""subprocess - Subprocesses with accessible I/O streams This module allows you to spawn processes, connect to their input/output/error pipes, and obtain their return codes. This module intends to replace several other, older modules and functions, like: os.system os.spawn* os.popen* popen2.* commands.* Information about how the subprocess module can be used to replace these modules and functions can be found below. Using the subprocess module =========================== This module defines one class called Popen: class Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): Arguments are: args should be a string, or a sequence of program arguments. The program to execute is normally the first item in the args sequence or string, but can be explicitly set by using the executable argument. On UNIX, with shell=False (default): In this case, the Popen class uses os.execvp() to execute the child program. args should normally be a sequence. A string will be treated as a sequence with the string as the only item (the program to execute). On UNIX, with shell=True: If args is a string, it specifies the command string to execute through the shell. If args is a sequence, the first item specifies the command string, and any additional items will be treated as additional shell arguments. On Windows: the Popen class uses CreateProcess() to execute the child program, which operates on strings. If args is a sequence, it will be converted to a string using the list2cmdline method. Please note that not all MS Windows applications interpret the command line the same way: The list2cmdline is designed for applications using the same rules as the MS C runtime. bufsize, if given, has the same meaning as the corresponding argument to the built-in open() function: 0 means unbuffered, 1 means line buffered, any other positive value means use a buffer of (approximately) that size. A negative bufsize means to use the system default, which usually means fully buffered. The default value for bufsize is 0 (unbuffered). stdin, stdout and stderr specify the executed programs' standard input, standard output and standard error file handles, respectively. Valid values are PIPE, an existing file descriptor (a positive integer), an existing file object, and None. PIPE indicates that a new pipe to the child should be created. With None, no redirection will occur; the child's file handles will be inherited from the parent. Additionally, stderr can be STDOUT, which indicates that the stderr data from the applications should be captured into the same file handle as for stdout. If preexec_fn is set to a callable object, this object will be called in the child process just before the child is executed. If close_fds is true, all file descriptors except 0, 1 and 2 will be closed before the child process is executed. if shell is true, the specified command will be executed through the shell. If cwd is not None, the current directory will be changed to cwd before the child is executed. If env is not None, it defines the environment variables for the new process. If universal_newlines is true, the file objects stdout and stderr are opened as a text files, but lines may be terminated by any of '\n', the Unix end-of-line convention, '\r', the Macintosh convention or '\r\n', the Windows convention. All of these external representations are seen as '\n' by the Python program. Note: This feature is only available if Python is built with universal newline support (the default). Also, the newlines attribute of the file objects stdout, stdin and stderr are not updated by the communicate() method. The startupinfo and creationflags, if given, will be passed to the underlying CreateProcess() function. They can specify things such as appearance of the main window and priority for the new process. (Windows only) This module also defines some shortcut functions: call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) check_call(*popenargs, **kwargs): Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) check_output(*popenargs, **kwargs): Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: output = check_output(["ls", "-l", "/dev/null"]) Exceptions ---------- Exceptions raised in the child process, before the new program has started to execute, will be re-raised in the parent. Additionally, the exception object will have one extra attribute called 'child_traceback', which is a string containing traceback information from the childs point of view. The most common exception raised is OSError. This occurs, for example, when trying to execute a non-existent file. Applications should prepare for OSErrors. A ValueError will be raised if Popen is called with invalid arguments. check_call() and check_output() will raise CalledProcessError, if the called process returns a non-zero return code. Security -------- Unlike some other popen functions, this implementation will never call /bin/sh implicitly. This means that all characters, including shell metacharacters, can safely be passed to child processes. Popen objects ============= Instances of the Popen class have the following methods: poll() Check if child process has terminated. Returns returncode attribute. wait() Wait for child process to terminate. Returns returncode attribute. communicate(input=None) Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr). Note: The data read is buffered in memory, so do not use this method if the data size is large or unlimited. The following attributes are also available: stdin If the stdin argument is PIPE, this attribute is a file object that provides input to the child process. Otherwise, it is None. stdout If the stdout argument is PIPE, this attribute is a file object that provides output from the child process. Otherwise, it is None. stderr If the stderr argument is PIPE, this attribute is file object that provides error output from the child process. Otherwise, it is None. pid The process ID of the child process. returncode The child return code. A None value indicates that the process hasn't terminated yet. A negative value -N indicates that the child was terminated by signal N (UNIX only). Replacing older functions with the subprocess module ==================================================== In this section, "a ==> b" means that b can be used as a replacement for a. Note: All functions in this section fail (more or less) silently if the executed program cannot be found; this module raises an OSError exception. In the following examples, we assume that the subprocess module is imported with "from subprocess import *". Replacing /bin/sh shell backquote --------------------------------- output=`mycmd myarg` ==> output = Popen(["mycmd", "myarg"], stdout=PIPE).communicate()[0] Replacing shell pipe line ------------------------- output=`dmesg | grep hda` ==> p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0] Replacing os.system() --------------------- sts = os.system("mycmd" + " myarg") ==> p = Popen("mycmd" + " myarg", shell=True) pid, sts = os.waitpid(p.pid, 0) Note: * Calling the program through the shell is usually not required. * It's easier to look at the returncode attribute than the exitstatus. A more real-world example would look like this: try: retcode = call("mycmd" + " myarg", shell=True) if retcode < 0: print >>sys.stderr, "Child was terminated by signal", -retcode else: print >>sys.stderr, "Child returned", retcode except OSError, e: print >>sys.stderr, "Execution failed:", e Replacing os.spawn* ------------------- P_NOWAIT example: pid = os.spawnlp(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg") ==> pid = Popen(["/bin/mycmd", "myarg"]).pid P_WAIT example: retcode = os.spawnlp(os.P_WAIT, "/bin/mycmd", "mycmd", "myarg") ==> retcode = call(["/bin/mycmd", "myarg"]) Vector example: os.spawnvp(os.P_NOWAIT, path, args) ==> Popen([path] + args[1:]) Environment example: os.spawnlpe(os.P_NOWAIT, "/bin/mycmd", "mycmd", "myarg", env) ==> Popen(["/bin/mycmd", "myarg"], env={"PATH": "/usr/bin"}) Replacing os.popen* ------------------- pipe = os.popen("cmd", mode='r', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdout=PIPE).stdout pipe = os.popen("cmd", mode='w', bufsize) ==> pipe = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE).stdin (child_stdin, child_stdout) = os.popen2("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdin, child_stdout) = (p.stdin, p.stdout) (child_stdin, child_stdout, child_stderr) = os.popen3("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True) (child_stdin, child_stdout, child_stderr) = (p.stdin, p.stdout, p.stderr) (child_stdin, child_stdout_and_stderr) = os.popen4("cmd", mode, bufsize) ==> p = Popen("cmd", shell=True, bufsize=bufsize, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) (child_stdin, child_stdout_and_stderr) = (p.stdin, p.stdout) On Unix, os.popen2, os.popen3 and os.popen4 also accept a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdin, child_stdout) = os.popen2(["/bin/ls", "-l"], mode, bufsize) ==> p = Popen(["/bin/ls", "-l"], bufsize=bufsize, stdin=PIPE, stdout=PIPE) (child_stdin, child_stdout) = (p.stdin, p.stdout) Return code handling translates as follows: pipe = os.popen("cmd", 'w') ... rc = pipe.close() if rc is not None and rc % 256: print "There were some errors" ==> process = Popen("cmd", 'w', shell=True, stdin=PIPE) ... process.stdin.close() if process.wait() != 0: print "There were some errors" Replacing popen2.* ------------------ (child_stdout, child_stdin) = popen2.popen2("somestring", bufsize, mode) ==> p = Popen(["somestring"], shell=True, bufsize=bufsize stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) On Unix, popen2 also accepts a sequence as the command to execute, in which case arguments will be passed directly to the program without shell intervention. This usage can be replaced as follows: (child_stdout, child_stdin) = popen2.popen2(["mycmd", "myarg"], bufsize, mode) ==> p = Popen(["mycmd", "myarg"], bufsize=bufsize, stdin=PIPE, stdout=PIPE, close_fds=True) (child_stdout, child_stdin) = (p.stdout, p.stdin) The popen2.Popen3 and popen2.Popen4 basically works as subprocess.Popen, except that: * subprocess.Popen raises an exception if the execution fails * the capturestderr argument is replaced with the stderr argument. * stdin=PIPE and stdout=PIPE must be specified. * popen2 closes all filedescriptors by default, but you have to specify close_fds=True with subprocess.Popen. """ import sys mswindows = (sys.platform == "win32") import os import types import traceback import gc import signal import errno try: set() except: from kitchen.pycompat24.sets import set # Exception classes used by this module. class CalledProcessError(Exception): """This exception is raised when a process run by check_call() or check_output() returns a non-zero exit status. The exit status will be stored in the returncode attribute; check_output() will also store the output in the output attribute. """ def __init__(self, returncode, cmd, output=None): self.returncode = returncode self.cmd = cmd self.output = output def __str__(self): return "Command '%s' returned non-zero exit status %d" % (self.cmd, self.returncode) if mswindows: import threading import msvcrt import _subprocess class STARTUPINFO: dwFlags = 0 hStdInput = None hStdOutput = None hStdError = None wShowWindow = 0 class pywintypes: error = IOError else: import select _has_poll = hasattr(select, 'poll') import fcntl import pickle # When select or poll has indicated that the file is writable, # we can write up to _PIPE_BUF bytes without risk of blocking. # POSIX defines PIPE_BUF as >= 512. _PIPE_BUF = getattr(select, 'PIPE_BUF', 512) __all__ = ["Popen", "PIPE", "STDOUT", "call", "check_call", "check_output", "CalledProcessError"] if mswindows: from _subprocess import CREATE_NEW_CONSOLE, CREATE_NEW_PROCESS_GROUP, \ STD_INPUT_HANDLE, STD_OUTPUT_HANDLE, \ STD_ERROR_HANDLE, SW_HIDE, \ STARTF_USESTDHANDLES, STARTF_USESHOWWINDOW __all__.extend(["CREATE_NEW_CONSOLE", "CREATE_NEW_PROCESS_GROUP", "STD_INPUT_HANDLE", "STD_OUTPUT_HANDLE", "STD_ERROR_HANDLE", "SW_HIDE", "STARTF_USESTDHANDLES", "STARTF_USESHOWWINDOW"]) try: MAXFD = os.sysconf("SC_OPEN_MAX") except: MAXFD = 256 _active = [] def _cleanup(): for inst in _active[:]: res = inst._internal_poll(_deadstate=sys.maxint) if res is not None: try: _active.remove(inst) except ValueError: # This can happen if two threads create a new Popen instance. # It's harmless that it was already removed, so ignore. pass PIPE = -1 STDOUT = -2 def _eintr_retry_call(func, *args): while True: try: return func(*args) except (OSError, IOError), e: if e.errno == errno.EINTR: continue raise def call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete, then return the returncode attribute. The arguments are the same as for the Popen constructor. Example: retcode = call(["ls", "-l"]) """ return Popen(*popenargs, **kwargs).wait() def check_call(*popenargs, **kwargs): """Run command with arguments. Wait for command to complete. If the exit code was zero then return, otherwise raise CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute. The arguments are the same as for the Popen constructor. Example: check_call(["ls", "-l"]) """ retcode = call(*popenargs, **kwargs) if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd) return 0 def check_output(*popenargs, **kwargs): r"""Run command with arguments and return its output as a byte string. If the exit code was non-zero it raises a CalledProcessError. The CalledProcessError object will have the return code in the returncode attribute and output in the output attribute. The arguments are the same as for the Popen constructor. Example: >>> check_output(["ls", "-l", "/dev/null"]) 'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n' The stdout argument is not allowed as it is used internally. To capture standard error in the result, use stderr=STDOUT. >>> check_output(["/bin/sh", "-c", ... "ls -l non_existent_file ; exit 0"], ... stderr=STDOUT) 'ls: non_existent_file: No such file or directory\n' """ if 'stdout' in kwargs: raise ValueError('stdout argument not allowed, it will be overridden.') process = Popen(stdout=PIPE, *popenargs, **kwargs) output, unused_err = process.communicate() retcode = process.poll() if retcode: cmd = kwargs.get("args") if cmd is None: cmd = popenargs[0] raise CalledProcessError(retcode, cmd, output=output) return output def list2cmdline(seq): """ Translate a sequence of arguments into a command line string, using the same rules as the MS C runtime: 1) Arguments are delimited by white space, which is either a space or a tab. 2) A string surrounded by double quotation marks is interpreted as a single argument, regardless of white space contained within. A quoted string can be embedded in an argument. 3) A double quotation mark preceded by a backslash is interpreted as a literal double quotation mark. 4) Backslashes are interpreted literally, unless they immediately precede a double quotation mark. 5) If backslashes immediately precede a double quotation mark, every pair of backslashes is interpreted as a literal backslash. If the number of backslashes is odd, the last backslash escapes the next double quotation mark as described in rule 3. """ # See # http://msdn.microsoft.com/en-us/library/17w5ykft.aspx # or search http://msdn.microsoft.com for # "Parsing C++ Command-Line Arguments" result = [] needquote = False for arg in seq: bs_buf = [] # Add a space to separate this argument from the others if result: result.append(' ') needquote = (" " in arg) or ("\t" in arg) or not arg if needquote: result.append('"') for c in arg: if c == '\\': # Don't know if we need to double yet. bs_buf.append(c) elif c == '"': # Double backslashes. result.append('\\' * len(bs_buf)*2) bs_buf = [] result.append('\\"') else: # Normal char if bs_buf: result.extend(bs_buf) bs_buf = [] result.append(c) # Add remaining backslashes, if any. if bs_buf: result.extend(bs_buf) if needquote: result.extend(bs_buf) result.append('"') return ''.join(result) class Popen(object): def __init__(self, args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0): """Create new Popen instance.""" _cleanup() self._child_created = False if not isinstance(bufsize, (int, long)): raise TypeError("bufsize must be an integer") if mswindows: if preexec_fn is not None: raise ValueError("preexec_fn is not supported on Windows " "platforms") if close_fds and (stdin is not None or stdout is not None or stderr is not None): raise ValueError("close_fds is not supported on Windows " "platforms if you redirect stdin/stdout/stderr") else: # POSIX if startupinfo is not None: raise ValueError("startupinfo is only supported on Windows " "platforms") if creationflags != 0: raise ValueError("creationflags is only supported on Windows " "platforms") self.stdin = None self.stdout = None self.stderr = None self.pid = None self.returncode = None self.universal_newlines = universal_newlines # Input and output objects. The general principle is like # this: # # Parent Child # ------ ----- # p2cwrite ---stdin---> p2cread # c2pread <--stdout--- c2pwrite # errread <--stderr--- errwrite # # On POSIX, the child objects are file descriptors. On # Windows, these are Windows file handles. The parent objects # are file descriptors on both platforms. The parent objects # are None when not using PIPEs. The child objects are None # when not redirecting. (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) = self._get_handles(stdin, stdout, stderr) self._execute_child(args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) if mswindows: if p2cwrite is not None: p2cwrite = msvcrt.open_osfhandle(p2cwrite.Detach(), 0) if c2pread is not None: c2pread = msvcrt.open_osfhandle(c2pread.Detach(), 0) if errread is not None: errread = msvcrt.open_osfhandle(errread.Detach(), 0) if p2cwrite is not None: self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) if c2pread is not None: if universal_newlines: self.stdout = os.fdopen(c2pread, 'rU', bufsize) else: self.stdout = os.fdopen(c2pread, 'rb', bufsize) if errread is not None: if universal_newlines: self.stderr = os.fdopen(errread, 'rU', bufsize) else: self.stderr = os.fdopen(errread, 'rb', bufsize) def _translate_newlines(self, data): data = data.replace("\r\n", "\n") data = data.replace("\r", "\n") return data def __del__(self, _maxint=sys.maxint, _active=_active): # If __init__ hasn't had a chance to execute (e.g. if it # was passed an undeclared keyword argument), we don't # have a _child_created attribute at all. if not getattr(self, '_child_created', False): # We didn't get to successfully create a child process. return # In case the child hasn't been waited on, check if it's done. self._internal_poll(_deadstate=_maxint) if self.returncode is None and _active is not None: # Child is still running, keep us alive until we can wait on it. _active.append(self) def communicate(self, input=None): """Interact with process: Send data to stdin. Read data from stdout and stderr, until end-of-file is reached. Wait for process to terminate. The optional input argument should be a string to be sent to the child process, or None, if no data should be sent to the child. communicate() returns a tuple (stdout, stderr).""" # Optimization: If we are only using one pipe, or no pipe at # all, using select() or threads is unnecessary. if [self.stdin, self.stdout, self.stderr].count(None) >= 2: stdout = None stderr = None if self.stdin: if input: try: self.stdin.write(input) except IOError, e: if e.errno != errno.EPIPE and e.errno != errno.EINVAL: raise self.stdin.close() elif self.stdout: stdout = _eintr_retry_call(self.stdout.read) self.stdout.close() elif self.stderr: stderr = _eintr_retry_call(self.stderr.read) self.stderr.close() self.wait() return (stdout, stderr) return self._communicate(input) def poll(self): return self._internal_poll() if mswindows: # # Windows methods # def _get_handles(self, stdin, stdout, stderr): """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ if stdin is None and stdout is None and stderr is None: return (None, None, None, None, None, None) p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: p2cread = _subprocess.GetStdHandle(_subprocess.STD_INPUT_HANDLE) if p2cread is None: p2cread, _ = _subprocess.CreatePipe(None, 0) elif stdin == PIPE: p2cread, p2cwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdin, int): p2cread = msvcrt.get_osfhandle(stdin) else: # Assuming file-like object p2cread = msvcrt.get_osfhandle(stdin.fileno()) p2cread = self._make_inheritable(p2cread) if stdout is None: c2pwrite = _subprocess.GetStdHandle(_subprocess.STD_OUTPUT_HANDLE) if c2pwrite is None: _, c2pwrite = _subprocess.CreatePipe(None, 0) elif stdout == PIPE: c2pread, c2pwrite = _subprocess.CreatePipe(None, 0) elif isinstance(stdout, int): c2pwrite = msvcrt.get_osfhandle(stdout) else: # Assuming file-like object c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) c2pwrite = self._make_inheritable(c2pwrite) if stderr is None: errwrite = _subprocess.GetStdHandle(_subprocess.STD_ERROR_HANDLE) if errwrite is None: _, errwrite = _subprocess.CreatePipe(None, 0) elif stderr == PIPE: errread, errwrite = _subprocess.CreatePipe(None, 0) elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): errwrite = msvcrt.get_osfhandle(stderr) else: # Assuming file-like object errwrite = msvcrt.get_osfhandle(stderr.fileno()) errwrite = self._make_inheritable(errwrite) return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) def _make_inheritable(self, handle): """Return a duplicate of handle, which is inheritable""" return _subprocess.DuplicateHandle(_subprocess.GetCurrentProcess(), handle, _subprocess.GetCurrentProcess(), 0, 1, _subprocess.DUPLICATE_SAME_ACCESS) def _find_w9xpopen(self): """Find and return absolut path to w9xpopen.exe""" w9xpopen = os.path.join( os.path.dirname(_subprocess.GetModuleFileName(0)), "w9xpopen.exe") if not os.path.exists(w9xpopen): # Eeek - file-not-found - possibly an embedding # situation - see if we can locate it in sys.exec_prefix w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), "w9xpopen.exe") if not os.path.exists(w9xpopen): raise RuntimeError("Cannot locate w9xpopen.exe, which is " "needed for Popen to work with your " "shell or platform.") return w9xpopen def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): """Execute program (MS Windows version)""" if not isinstance(args, types.StringTypes): args = list2cmdline(args) # Process startup details if startupinfo is None: startupinfo = STARTUPINFO() if None not in (p2cread, c2pwrite, errwrite): startupinfo.dwFlags |= _subprocess.STARTF_USESTDHANDLES startupinfo.hStdInput = p2cread startupinfo.hStdOutput = c2pwrite startupinfo.hStdError = errwrite if shell: startupinfo.dwFlags |= _subprocess.STARTF_USESHOWWINDOW startupinfo.wShowWindow = _subprocess.SW_HIDE comspec = os.environ.get("COMSPEC", "cmd.exe") args = "%s /c %s" % (comspec, args) if (_subprocess.GetVersion() >= 0x80000000L or os.path.basename(comspec).lower() == "command.com"): # Win9x, or using command.com on NT. We need to # use the w9xpopen intermediate program. For more # information, see KB Q150956 # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) w9xpopen = self._find_w9xpopen() args = '"%s" %s' % (w9xpopen, args) # Not passing CREATE_NEW_CONSOLE has been known to # cause random failures on win9x. Specifically a # dialog: "Your program accessed mem currently in # use at xxx" and a hopeful warning about the # stability of your system. Cost is Ctrl+C wont # kill children. creationflags |= _subprocess.CREATE_NEW_CONSOLE # Start the process try: try: hp, ht, pid, tid = _subprocess.CreateProcess(executable, args, # no special security None, None, int(not close_fds), creationflags, env, cwd, startupinfo) except pywintypes.error, e: # Translate pywintypes.error to WindowsError, which is # a subclass of OSError. FIXME: We should really # translate errno using _sys_errlist (or similar), but # how can this be done from Python? raise WindowsError(*e.args) finally: # Child is launched. Close the parent's copy of those pipe # handles that only the child should have open. You need # to make sure that no handles to the write end of the # output pipe are maintained in this process or else the # pipe will not close when the child process exits and the # ReadFile will hang. if p2cread is not None: p2cread.Close() if c2pwrite is not None: c2pwrite.Close() if errwrite is not None: errwrite.Close() # Retain the process handle, but close the thread handle self._child_created = True self._handle = hp self.pid = pid ht.Close() def _internal_poll(self, _deadstate=None, _WaitForSingleObject=_subprocess.WaitForSingleObject, _WAIT_OBJECT_0=_subprocess.WAIT_OBJECT_0, _GetExitCodeProcess=_subprocess.GetExitCodeProcess): """Check if child process has terminated. Returns returncode attribute. This method is called by __del__, so it can only refer to objects in its local scope. """ if self.returncode is None: if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0: self.returncode = _GetExitCodeProcess(self._handle) return self.returncode def wait(self): """Wait for child process to terminate. Returns returncode attribute.""" if self.returncode is None: _subprocess.WaitForSingleObject(self._handle, _subprocess.INFINITE) self.returncode = _subprocess.GetExitCodeProcess(self._handle) return self.returncode def _readerthread(self, fh, buffer): buffer.append(fh.read()) def _communicate(self, input): stdout = None # Return stderr = None # Return if self.stdout: stdout = [] stdout_thread = threading.Thread(target=self._readerthread, args=(self.stdout, stdout)) stdout_thread.setDaemon(True) stdout_thread.start() if self.stderr: stderr = [] stderr_thread = threading.Thread(target=self._readerthread, args=(self.stderr, stderr)) stderr_thread.setDaemon(True) stderr_thread.start() if self.stdin: if input is not None: try: self.stdin.write(input) except IOError, e: if e.errno != errno.EPIPE: raise self.stdin.close() if self.stdout: stdout_thread.join() if self.stderr: stderr_thread.join() # All data exchanged. Translate lists into strings. if stdout is not None: stdout = stdout[0] if stderr is not None: stderr = stderr[0] # Translate newlines, if requested. We cannot let the file # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) def send_signal(self, sig): """Send a signal to the process """ if sig == signal.SIGTERM: self.terminate() elif sig == signal.CTRL_C_EVENT: os.kill(self.pid, signal.CTRL_C_EVENT) elif sig == signal.CTRL_BREAK_EVENT: os.kill(self.pid, signal.CTRL_BREAK_EVENT) else: raise ValueError("Unsupported signal: %s" % (sig,)) def terminate(self): """Terminates the process """ _subprocess.TerminateProcess(self._handle, 1) kill = terminate else: # # POSIX methods # def _get_handles(self, stdin, stdout, stderr): """Construct and return tuple with IO objects: p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite """ p2cread, p2cwrite = None, None c2pread, c2pwrite = None, None errread, errwrite = None, None if stdin is None: pass elif stdin == PIPE: p2cread, p2cwrite = self.pipe_cloexec() elif isinstance(stdin, int): p2cread = stdin else: # Assuming file-like object p2cread = stdin.fileno() if stdout is None: pass elif stdout == PIPE: c2pread, c2pwrite = self.pipe_cloexec() elif isinstance(stdout, int): c2pwrite = stdout else: # Assuming file-like object c2pwrite = stdout.fileno() if stderr is None: pass elif stderr == PIPE: errread, errwrite = self.pipe_cloexec() elif stderr == STDOUT: errwrite = c2pwrite elif isinstance(stderr, int): errwrite = stderr else: # Assuming file-like object errwrite = stderr.fileno() return (p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) def _set_cloexec_flag(self, fd, cloexec=True): try: cloexec_flag = fcntl.FD_CLOEXEC except AttributeError: cloexec_flag = 1 old = fcntl.fcntl(fd, fcntl.F_GETFD) if cloexec: fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) else: fcntl.fcntl(fd, fcntl.F_SETFD, old & ~cloexec_flag) def pipe_cloexec(self): """Create a pipe with FDs set CLOEXEC.""" # Pipes' FDs are set CLOEXEC by default because we don't want them # to be inherited by other subprocesses: the CLOEXEC flag is removed # from the child's FDs by _dup2(), between fork() and exec(). # This is not atomic: we would need the pipe2() syscall for that. r, w = os.pipe() self._set_cloexec_flag(r) self._set_cloexec_flag(w) return r, w def _close_fds(self, but): if hasattr(os, 'closerange'): os.closerange(3, but) os.closerange(but + 1, MAXFD) else: for i in xrange(3, MAXFD): if i == but: continue try: os.close(i) except: pass def _execute_child(self, args, executable, preexec_fn, close_fds, cwd, env, universal_newlines, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite): """Execute program (POSIX version)""" if isinstance(args, types.StringTypes): args = [args] else: args = list(args) if shell: args = ["/bin/sh", "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] # For transferring possible exec failure from child to parent # The first char specifies the exception type: 0 means # OSError, 1 means some other error. errpipe_read, errpipe_write = self.pipe_cloexec() try: try: gc_was_enabled = gc.isenabled() # Disable gc to avoid bug where gc -> file_dealloc -> # write to stderr -> hang. http://bugs.python.org/issue1336 gc.disable() try: self.pid = os.fork() except: if gc_was_enabled: gc.enable() raise self._child_created = True if self.pid == 0: # Child try: # Close parent's pipe ends if p2cwrite is not None: os.close(p2cwrite) if c2pread is not None: os.close(c2pread) if errread is not None: os.close(errread) os.close(errpipe_read) # When duping fds, if there arises a situation # where one of the fds is either 0, 1 or 2, it # is possible that it is overwritten (#12607). if c2pwrite == 0: c2pwrite = os.dup(c2pwrite) if errwrite == 0 or errwrite == 1: errwrite = os.dup(errwrite) # Dup fds for child def _dup2(a, b): # dup2() removes the CLOEXEC flag but # we must do it ourselves if dup2() # would be a no-op (issue #10806). if a == b: self._set_cloexec_flag(a, False) elif a is not None: os.dup2(a, b) _dup2(p2cread, 0) _dup2(c2pwrite, 1) _dup2(errwrite, 2) # Close pipe fds. Make sure we don't close the # same fd more than once, or standard fds. closed = set( (None,) ) for fd in [p2cread, c2pwrite, errwrite]: if fd not in closed and fd > 2: os.close(fd) closed.add(fd) # Close all other fds, if asked for if close_fds: self._close_fds(but=errpipe_write) if cwd is not None: os.chdir(cwd) if preexec_fn: preexec_fn() if env is None: os.execvp(executable, args) else: os.execvpe(executable, args, env) except: exc_type, exc_value, tb = sys.exc_info() # Save the traceback and attach it to the exception object exc_lines = traceback.format_exception(exc_type, exc_value, tb) exc_value.child_traceback = ''.join(exc_lines) os.write(errpipe_write, pickle.dumps(exc_value)) # This exitcode won't be reported to applications, so it # really doesn't matter what we return. os._exit(255) # Parent if gc_was_enabled: gc.enable() finally: # be sure the FD is closed no matter what os.close(errpipe_write) if p2cread is not None and p2cwrite is not None: os.close(p2cread) if c2pwrite is not None and c2pread is not None: os.close(c2pwrite) if errwrite is not None and errread is not None: os.close(errwrite) # Wait for exec to fail or succeed; possibly raising exception # Exception limited to 1M data = _eintr_retry_call(os.read, errpipe_read, 1048576) finally: # be sure the FD is closed no matter what os.close(errpipe_read) if data != "": try: _eintr_retry_call(os.waitpid, self.pid, 0) except OSError, e: if e.errno != errno.ECHILD: raise child_exception = pickle.loads(data) for fd in (p2cwrite, c2pread, errread): if fd is not None: os.close(fd) raise child_exception def _handle_exitstatus(self, sts, _WIFSIGNALED=os.WIFSIGNALED, _WTERMSIG=os.WTERMSIG, _WIFEXITED=os.WIFEXITED, _WEXITSTATUS=os.WEXITSTATUS): # This method is called (indirectly) by __del__, so it cannot # refer to anything outside of its local scope.""" if _WIFSIGNALED(sts): self.returncode = -_WTERMSIG(sts) elif _WIFEXITED(sts): self.returncode = _WEXITSTATUS(sts) else: # Should never happen raise RuntimeError("Unknown child exit status!") def _internal_poll(self, _deadstate=None, _waitpid=os.waitpid, _WNOHANG=os.WNOHANG, _os_error=os.error): """Check if child process has terminated. Returns returncode attribute. This method is called by __del__, so it cannot reference anything outside of the local scope (nor can any methods it calls). """ if self.returncode is None: try: pid, sts = _waitpid(self.pid, _WNOHANG) if pid == self.pid: self._handle_exitstatus(sts) except _os_error: if _deadstate is not None: self.returncode = _deadstate return self.returncode def wait(self): """Wait for child process to terminate. Returns returncode attribute.""" if self.returncode is None: try: pid, sts = _eintr_retry_call(os.waitpid, self.pid, 0) except OSError, e: if e.errno != errno.ECHILD: raise # This happens if SIGCLD is set to be ignored or waiting # for child processes has otherwise been disabled for our # process. This child is dead, we can't get the status. sts = 0 self._handle_exitstatus(sts) return self.returncode def _communicate(self, input): if self.stdin: # Flush stdio buffer. This might block, if the user has # been writing to .stdin in an uncontrolled fashion. self.stdin.flush() if not input: self.stdin.close() if _has_poll: stdout, stderr = self._communicate_with_poll(input) else: stdout, stderr = self._communicate_with_select(input) # All data exchanged. Translate lists into strings. if stdout is not None: stdout = ''.join(stdout) if stderr is not None: stderr = ''.join(stderr) # Translate newlines, if requested. We cannot let the file # object do the translation: It is based on stdio, which is # impossible to combine with select (unless forcing no # buffering). if self.universal_newlines and hasattr(file, 'newlines'): if stdout: stdout = self._translate_newlines(stdout) if stderr: stderr = self._translate_newlines(stderr) self.wait() return (stdout, stderr) def _communicate_with_poll(self, input): stdout = None # Return stderr = None # Return fd2file = {} fd2output = {} poller = select.poll() def register_and_append(file_obj, eventmask): poller.register(file_obj.fileno(), eventmask) fd2file[file_obj.fileno()] = file_obj def close_unregister_and_remove(fd): poller.unregister(fd) fd2file[fd].close() fd2file.pop(fd) if self.stdin and input: register_and_append(self.stdin, select.POLLOUT) select_POLLIN_POLLPRI = select.POLLIN | select.POLLPRI if self.stdout: register_and_append(self.stdout, select_POLLIN_POLLPRI) fd2output[self.stdout.fileno()] = stdout = [] if self.stderr: register_and_append(self.stderr, select_POLLIN_POLLPRI) fd2output[self.stderr.fileno()] = stderr = [] input_offset = 0 while fd2file: try: ready = poller.poll() except select.error, e: if e.args[0] == errno.EINTR: continue raise for fd, mode in ready: if mode & select.POLLOUT: chunk = input[input_offset : input_offset + _PIPE_BUF] try: input_offset += os.write(fd, chunk) except OSError, e: if e.errno == errno.EPIPE: close_unregister_and_remove(fd) else: raise else: if input_offset >= len(input): close_unregister_and_remove(fd) elif mode & select_POLLIN_POLLPRI: data = os.read(fd, 4096) if not data: close_unregister_and_remove(fd) fd2output[fd].append(data) else: # Ignore hang up or errors. close_unregister_and_remove(fd) return (stdout, stderr) def _communicate_with_select(self, input): read_set = [] write_set = [] stdout = None # Return stderr = None # Return if self.stdin and input: write_set.append(self.stdin) if self.stdout: read_set.append(self.stdout) stdout = [] if self.stderr: read_set.append(self.stderr) stderr = [] input_offset = 0 while read_set or write_set: try: rlist, wlist, xlist = select.select(read_set, write_set, []) except select.error, e: if e.args[0] == errno.EINTR: continue raise if self.stdin in wlist: chunk = input[input_offset : input_offset + _PIPE_BUF] try: bytes_written = os.write(self.stdin.fileno(), chunk) except OSError, e: if e.errno == errno.EPIPE: self.stdin.close() write_set.remove(self.stdin) else: raise else: input_offset += bytes_written if input_offset >= len(input): self.stdin.close() write_set.remove(self.stdin) if self.stdout in rlist: data = os.read(self.stdout.fileno(), 1024) if data == "": self.stdout.close() read_set.remove(self.stdout) stdout.append(data) if self.stderr in rlist: data = os.read(self.stderr.fileno(), 1024) if data == "": self.stderr.close() read_set.remove(self.stderr) stderr.append(data) return (stdout, stderr) def send_signal(self, sig): """Send a signal to the process """ os.kill(self.pid, sig) def terminate(self): """Terminate the process with SIGTERM """ self.send_signal(signal.SIGTERM) def kill(self): """Kill the process with SIGKILL """ self.send_signal(signal.SIGKILL) def _demo_posix(): # # Example 1: Simple redirection: Get process list # plist = Popen(["ps"], stdout=PIPE).communicate()[0] print "Process list:" print plist # # Example 2: Change uid before executing child # if os.getuid() == 0: p = Popen(["id"], preexec_fn=lambda: os.setuid(100)) p.wait() # # Example 3: Connecting several subprocesses # print "Looking for 'hda'..." p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) print repr(p2.communicate()[0]) # # Example 4: Catch execution error # print print "Trying a weird file..." try: print Popen(["/this/path/does/not/exist"]).communicate() except OSError, e: if e.errno == errno.ENOENT: print "The file didn't exist. I thought so..." print "Child traceback:" print e.child_traceback else: print "Error", e.errno else: print >>sys.stderr, "Gosh. No error." def _demo_windows(): # # Example 1: Connecting several subprocesses # print "Looking for 'PROMPT' in set output..." p1 = Popen("set", stdout=PIPE, shell=True) p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE) print repr(p2.communicate()[0]) # # Example 2: Simple execution of program # print "Executing calc..." p = Popen("calc") p.wait() if __name__ == "__main__": if mswindows: _demo_windows() else: _demo_posix() PK[}xb,site-packages/kitchen/pycompat27/__init__.pynu[''' The :mod:`kitchen.pycompat27` module contains implementations of functionality introduced in python-2.7 for use on earlier versions of python. .. versionchanged:: 0.2.3 Made mswindows, MAXFD, and list2cmdline available from the module ''' from kitchen.versioning import version_tuple_to_string __version_info__ = ((1, 1, 0),) __version__ = version_tuple_to_string(__version_info__) __all__ = ('subprocess',) PK[ls-site-packages/kitchen/pycompat27/__init__.pyonu[ i:Oc@s2dZddlmZdZeeZd ZdS( s The :mod:`kitchen.pycompat27` module contains implementations of functionality introduced in python-2.7 for use on earlier versions of python. .. versionchanged:: 0.2.3 Made mswindows, MAXFD, and list2cmdline available from the module i(tversion_tuple_to_stringiit subprocessN(iii((iii(s subprocess(t__doc__tkitchen.versioningRt__version_info__t __version__t__all__(((s?/usr/lib/python2.7/site-packages/kitchen/pycompat27/__init__.pyts PK[rP S88#site-packages/pyzor-1.0.0-py2.7.eggnu[PKGYPY$da pyzor/forwarder.pycV[oTc;iMihaTPiҊH,'>I:vsLU}@69ew-ɹ=:W5Bt -tE9kU.mpG:pB5:L< muOuWqHI0IwfA̝fi_*_G7QyX)n|D+ Q 5Pu@X ܬCXMTΓU+$P*$ҝdT}82a\\ ځvyTK'ux#+H&z f{?n($}IJ< dMc_H(U: &rgfWX*b$3YIjqr{fuo\(8z,i4OX2ꑮaCpv1`RKiۜwa|PMHŹQH;7Ҧ`k"J{EWoZ&2Q{Hzy{=GI>h='{r8cK؝5q(oڀƦhMEKdA/ۄ)7\ `h+ Cp7c]J`zyr Ms3W۟Fpecn+'U8J@$[nci\5+X-7)!K>qOIvLL23' tUD|ӋBG:,E"ͷA2i{ IK9ZiR'S=g NH(ҒI>8TGiUB}]F5o\j2CΞ_d_=N)UcremA%Zp뺸m&6DSv@wH(:;[49] 6ׂEO& ူ :;HGʕIPC7`}*b%BUn bE'(o@-=)p̯q|Y:EA0M͠ZdF,~^Q+rvpn,#aߘUƾ0St[-SgDgWDĘj E {0HOE(x1%1gTWe1(=~hro ;1g ~if 8OHi"d A0mtd6ܴjXI1-Wx}nNU,XI-{{7}f=z,Xux&==;m" "R a!gk^~ύ()ju)0-_PKGYP] pyzor/__init__.pycUOoEƱ6-)H!UH6T"Jh)H"TԗzgjٝqgfW8pKqOG 75Cμy3WA S?6`m %eW`X^^ CaX:{0\Qﰳ| 5l67A4UH[7t-/}XHZJ/5|PH^J-oH`?L63;]+*r 'b' S\wb"u@ao #jh3/p@+Wc#"fZcHQ076,9ʜ665T,9Oi_CH!ά)xKc)3}oO,={vf?ǦS&IB %l.csQ:n-? *nw C" ]Rͳk~u}Zk.t،2T=1yP*0^Oh/鬗%ιN:LQrAR"a= z|I}I&S3w+~Ān ;C~ m윪X#+_m b9Gl6!9%3vXOW`g~l6j7y%Eok:bٵlq]!l!]L7\(=G4uEL-YH0E )17asM>``>B[ eDE6]nnWy]%͡b(!0tdj4]8y7S~Ԟ'Ӂ}c#t玙Id'w}{1̗{*\Ha'3WYtUѷI9{5s)㫅Ϧ>>MAw||{_zk3|ſ^Wk[ PKGYPj pyzor/account.pycV]nF,R $FUDn H7#Pv\I]VayhЇ^@/;̐}h Z-Voi;33?* t +ʽNn3V5U~AX(a ,`(gv& _"aP<{&.k2HX6JL2QHi}?g*yȣI* H2mM&GJS%ubV2O':P %tyEȯ-_'z2J2*H?>'FȠ/t ke F/x吞 8uB8 ="3¨"7"9pwT@bkRO4` v&+F#e?˶' Srd26 rb$~HZw퇷vG>[^f-9@2W7 ψa蛡 =4iOF]3di't^R3`jyx+|x˴븵 \|"0,僶cK|JIxCosPOt0vyn.Nu!&ϥ]e/pu/DtHgw1Aw@WgY\p]:iu0^.2Z2L7.򐽌"oUCd!M}EM熸,8uqE K7-|n|x84&oИAQ+mr{Fgu秭I*" -bx^#yIDm(#<獒0ѽiKQzDG)n5bT02Y*O~G{G0= Br.QQג^6O7L/XCl$Ɉ8Hn$/ֵtUv^u69_xbȼ|.Ñq)/*8bŲ :4LՒ@UG{)=.?b%{XBS"鵖˚wwE5|_MnSsĜ3WYX\k\Zo4PKGYPV l2pyzor/client.pycZ[suv BHZ'IŐ,I8@x@,f8] 0;%XNL:Qoo~_KR*?:OT|g H\v{{zz;NeCLXBBlRj$"KlZ&_%/ͲWfbj5Y3 Y7HO"/b)v D+( 9-:T" }9#3\Z+JgE0a֋94R(=)IS,JOa)PAUU% .fa7A*@沝I촣Pm_~ {$͝ILlyvevLy;;a׶o'NoKoAgN'5jQvPe4~O.qT9uNe鴓^ϏlIk];2CgqWM>N^2ȨLkeWԟ"J:ԑ#{~-d]uڗ N:Y #?5+Э2luh2ݧhe%) BW$QWKNtZӊ[0$-5 D/2 jo5 ĆXjeE$x;i+~g 0~_YeTXFߧ8aYғ6e'dw~rw~x# =](fjm!qEgq%⭛LSJ5;q߸|y ;έ(\謥Iȹ#ӌdoo}$OG,1y`ニn CKE~{9ފ%qW߉sBx!-'{}g@!nR<\2ɠ~@"Ky=_R"k%4Ѵ2 VO-A'(?!9 IdMANAQ o4 Oro`姄}\"LRƝjV cGqdEbВߵw,Z-Y^5KY.[Kf\eQ᷇4xKQaAI]$E/ny(e@rZm+$`=#43,K[L6W c ; +7/-+eJgzm23iuwɮצղ똃Zy4y[̎!ǡ46r{.Vj(om-" z##F?X+FUQ!k,됵h9og1i1V uJ*"]涱:'zS7"P4꾊pnLsZ‹% j*l6?ʙdTj_ȗ)Ǐf'ltUذbdܔ߁S5 5wŠFP Z£gyʅx2g\~]̇ȭ2̣0QSa3#z|KhyuƲ `bk~Zà5K*Gz$H7t ~?{aWTǔ&_ztA :- }a\ftΖdA%.dڈ7T/ lb6'ajS8:j:Tk)rMD:og:N'$)H> 2b+x\:Wg-vإ@0f= [7nz+uPPkk۷V֔U0SƐu(%T6zSsMQy#0ub6g?(f#0\0Nk০(,@}@@5krS&)J$a畄J5K9*i[[8{e{# D oXZ[D^l$ouj7XV? kCʜ0sCV$[!U-؍8*+{0ˮڄ8xnYwPO2jS,5Fi5y)7{L7{x,ke8s`9[:FCz lՖC@_:h-p' *Kh5 jq2R4mA2ѡRu5CX9fy}+S|Wϑ kHq6s\p 'lJ2qzH DaqW>&X,秱oCgMsp/ XN9bﳦbPqbWhkbsl6@ma([gY5F mvZm,yn8Y$σy4`ѣ UDrɫH$5$#mBl].V,Bǖ5t0G̱"0U_R QK7ڭrn(Wn#9^Z lApX$:{c>VE>UX/5Z`T"SNd݂s1u`wŲKj;ي$!NRF0& IGJB*nqw}AݠYWDy?IRh،ѣxTaP{_J6LezKBԹeF2ʠq4O:,G$m2a6 s{%X50F6fYnL6&S*tuA˴0f06f`Se)+glWiz̘/7 &hA*~)*b T e)y->$~ˌH#?&-]]0 XOM/w3r>V<(l"ef9j&fQRXEȎ l)q e_N* !+VC*ġNT0'*VGfϰ?48FV3k*rpU4sݼm?7"c zǏRE7qnv1yl8 <G'_\yߏhʜN R񞴛q{qV 1"!H _͑x;k-%ؖ㐈^AQhʴ6:T d _R[gO.>;%NO[saF%l6\|@^j@I9Wp +#Br*AɛC$ː 5/ǭYZs*(XX6B3SuT2!"Agoq2KF"#-j25s+fܙKJE9dm:dv±#w-=*ەx^{܏v$ Q'%&LqUX3-c) [0B.M4o( !`}HS90w+"WG!8Oo?3omn*#uG܀ MQݒH VTll` kFCWCNvb\伾Eyẓ&ӫ'h [#Uyzgυ6>(-y܀$ c_{.ߣ):3bu+NJ)XSqY{LeۺJ'=_V\JBMsijs*yn>L<LV,_V;rVp4櫥ߓB -_4u8de RYRy1u- \3b-Q({Ԁa{=&K?u*Qu٢5>ǻYc=vx5N]3aEneIkFq#ZEOҫhR1xԖ ɑReg uu졄j6efS;F%^ٿqS)ix#$@g<1j6;Kv6RQ8ar|t:St_ vE|qlH˧@N`I_AT6%>m^zGē*[Caܪ,6jP{Ay eqٱh SQJoNFiq,. 4uXroLWt#[ep"7?H'OD~#ɏs8~L ^c $f\KfsZFS)gd5go[tpbKIiPbN E(}p);T虴q;AwWqϊ_QD p+xIϓ!: څ0o@T5Io: el &~YЯuYlCc ]\~?i&⧑r8 +kvH 5*aOֳ݂h@φ uGJ,AyRWuQz?[UD1 $.WmF_nm3̛Ƨ@tPKXqE^_pyzor/digest.pyXm6_A(,]JrWEPMm74dSB%b"Z[ II%g{@$+3Ù<$I#1c[30c(,I,[RvM%ª,-Wr˚o55'l\}{ P֒7nRk(kۈuq\Q]]b*W 6_xs ӲIz+[kr-W`3hpk.aC0t$Y^/4̀wQ j>Ve:̛~tt A,✊*#3Ul ۢH )Qc6\3@A4X;ϒGݱŠd¦AO|TXKQ[g+ :QݺAE*߆tϘS YNRmAcx[j6Qְ $ML dEc%y?Ra*OFM}H\x .2ĩ' #&WVaı PF(k򞊎-Wdsny !t \2Н]sK"fÒ B ʝA|%/`*DC(+)ɾJ 'Q^k /eM-5#RYS*Hi-kUlbau R6SnRvN؜5ujZ%ېJɥuWb$ݏ +%*,[\rveyKEk5XiZ.X~[f״a`3":=/^~%@c7?χ^]_f/ETpЬQ&p`!hRwVW6QIVRCN-dZu?^<_roLzjxt*sh֚y},T[{ ƋslT/@hTC5̴ /\XU[Ir9({|wJD@Eq\;'3w@;!u jg@m ^!}AmR2w!on% ƖE a٤ˆ\$K M+u''H8w*,ElB~E:STEH"t|58nBr&JIg`;X0U~"6߹C"#?əlb8AyQ(`t1q1h-hȘQ ' <E: ;fkU Q Hl氞Oxv;[nMT(oB9/| k`tPJw'z4D -S3q JNw̰ҩzlD {9W80a !x\#JO5 -2LרMC}͆I9TRnbOK}W9Ǐ6Y.ĉ NdNeQ(µ$$? Ƿـi3d9~ ]/vQh P`'Sqw!IcH4в5ݔL LG֣V8Eoƌa+w C9<K1_ǣjJΧR9i<4)\$a0ܩVsLVgFBFxRwQ LڸN0 JL{?WaU>oa"ڐ1ZWv6ӏE%Eo}se8J,3ρ3syf{u{qqkM039Wc؎VC|&c^i  9^j]  'UdJלM.:6Du0L{}c|QPyǩOtL^9L͠?PKGYP++@pyzor/server.pyc[]WV3=qen;l!dgljgPhjLWOwU3+v! E @ }aE xxC{3Kv;T{ιg:Y~Oօ7Fo-K[='s=/ }LX/q>n'y/y/C7m>+b"ւ3 'vYD_eè ,q_O h9+ ayy!m BVDؤc(WrKS›Oq֝^YPZzFx1֝aTZ ֽ0 s^eѶ/V&HڞLd=ePFry!ɺN,2Nl?0jk/~cwK^+G2;~ҠDM,}4Upc-o^Ͼdnb{n~lˠvnMh[zQ z2.ⴘBøSzIZГE{-zRZԘ}wkvvKU-Y֛nlif^ǯN{TnH{;hKo 8E<'w~Dfl' lby QHnmlH,}vaTmA1݄5,pp6@eEn0DߓAoCa"ȏdA81{Z'{E$7ad&K/-?wYnm]>:Bj$ITd.c\[)kJ}R@㷱Oh]-cF*T::c\ h"X/ ge1k N'VxHZOPO clGpǦ 'ˍ*Ł U}a )MToYXmEtӴD*YПĢf}lAj㦤`J&I^J")YCq+bOL$,x2/+1.:E9bz'FS+1ONi%ZpS\xe=*ҔL"SgԚ4ޒI; ݌gԺy.}KIhӗY_#¨^/uG(ZNc2{M 4rK#*>>idT3OجseDOѳ4?Xt ap9"EXd)GBM.ML}`(2JH*츸v[\63 zadQ{]繲MJpZ`X$۩Mc/y xLWd,/ݙ1!s3YEV#o sM03D#谽 h&X"AEa'̨P%'%ÜaÀ;΢2</x@m༂x@.Q`yѷj Q "9qRJ͗dHշglFae(lܭ ]mpx?y[fݟaɵi"Vʠ a VZ^: 0pے`?ڡms?NUmwȄ45ܬA]\&:AqG\`WeE?3Di";F!Sx2l[l+ XEKB1vc[ͤ|N$n~K"QD PLM{|tyqKv$R,Q{>ppy!u4:-Hu}=˧e'7ժqҁލ`K:on1$ d0A1njQ|}td9Knܰ$-KJ"dO"HH #!c X6 -}&,PyDbu~A"5 a02 AryyRnF_3WqE㨏G}\ŕpˣT!Sii,q$i,CHXHX%$d,2r1'!@0ag WmC4TZ GswmW: 9f۱ H]'Yފmb8ۨrw}`: eB 0s/o> 1-Y]Vm kA*p'E7C8{ lS=,ML"_GC%KP}{{\DT{Iq:(*汏c{Z2=sKS[}x@!5g DD9u5d`_Xs9jOns{G)=*,PMob}ig` ƓP8~*cNs(Hp9CpyȝÅ t3iU Up0\!ebAc`;w\EU.dmkܑudԱk3!w1l ÷XB;eڷjXOmH1R\r=uZw, z rb&Zna#{ s֒>u6[8!"ˑ_pzgf$*y I&_fׯ<UZGG1ɸؘ;Qlvn]wE!|/ӡ˘-_+X)NuR7Iݤ "_̇ޱ>KIϒTD`)?ya<ȶ}9RR .+Ci3pwLS،;۾pۆ&5z*q[cbzM:&{2 / `dsmm&'#jdu1NKdT KM4b"Iq0?&=nO;Íqs;W)2Ŀ%u[;eyQe)W=xs(ג)wlp%2&nžZ 1a@hT, tԵg)& gCJAbfaJ05 TW$ ڔ5+NY瘥s-Bð G=ϒcLtd29x0wOuBO_RtjX*flOs/x [CjMe C;phGm۴a uZfUUg\j"9TG0V4vL~a9ßc(EZ\B+\$f.*-̛*WUji'*^+*U]~YVy'}ɩJ~:_*Ͻ1ӕPK,sEI1pyzor/__init__.py}TN@+FRˡpD TLۛ*;:vd4ޛ73-%V^V!H XE6K4IRt!Wpv?3(h CaqT)WU ~,+> ʡ% Wd=j!8( =lpjr>`Y6,geʴ47Zu ghs4'²C/;.&O$z67|~:VJEإvoA}S5(g -K z @BQp7j@dNCx%ž,GE;# @k3VhA80z_zAX#:czdj,nVb+nKV-"P$I*-K2fSmܭ 7 &( 5ZtBIw(!yqX_>."=NWBO;ψ !O8i.xyM7"jz/j_t`X>{?Efyu,T(' &6m|t9ay,t.вM8Y9./„6T`0h[m0 %c2mSq5-.RA;(lsb& (D_yO 9ۅ߄vr.{L9m(Hd?ѩ!B0͌RYlFlXpΑ+R#@+^st5.nuʍs!P^xxxy%X?Ov(WYiW=~ #JɲM?b\ CG ͨ+ڠI8[xТq}N@ l:c\Xށ&zbec=xًSn(,т;]nh{_~Xn@`JwiAgFcޅOC.SwHmt("H ph-!RQ x oNvzE@:色 [Z@80@Kra(^ZvQEn.6bxRk.(w^cеiDF 凋84X6yA̢yYNOmD+huBķ䥌dS8&Xxk)PŒK5EP{aw4OD+oEp9 s [F+ܨHi&^yHgT-m!}EC/ `e3X Ѥ:,k)ՔD͓U?:j}- ]nA'x#N_ 9zJ6+ZhfNkc{Ծ!͵CNyέ5HZ anIeʼn/1Q26嗘װ\OFDB:Q'1`T-;/ %Sm/oߗߟ:>;j*$_$$36ȟjމrEzTI3UQ*1iTKSz>LۗT8&J.8'&=v$ӻg*A~Yq}C.YYV+XlnESRSWWUjWwD1qSYa6:a_%㧟6kt5^$vb rB#FvCueoc]ǶUlrV;q/ Z&{>-I[-۾]dӹIݩd̂†ܕQWcBmz2^@ڵ mW:a/՜^vg^ta"?z$#}, t6B'y8Ohڦə$N:CkA|P^~1vIUM)ao@m?8 {mLT#V#:nȓ]a@+Ay.hԪn]SőڬF N`AA+}DO^%%k Tylyn7~')}nZN$Ӟ:N4r4JE;QP ɊOG r+f퓧z/FJUƞwvQXJ!@9f.؛arD?26'uY V>?00Xc>ArAO:^$uESpʐz!qf?zq-YH b4B,͸<Q]5,k>dtX* .>/8h5᡼M--Nt%4bP3\.cTdcLE.ڳKdh4& %<_Mכ@lqV+fig(|h:w[Ra6`)D N`iTa: a )[)#"#$\Ajd@m>>~ z*\7bA5Ƕ'5ؘgQ(PB&sִUd)+g2էQ2ћQBQ̢8 Q t]v<%hY~%UxOPB^a"(13)*քUhF?P BzrƜ"@ q?ٺ ј'@9=L#D9d9SI "_dx @\KH']$ /d&*\JGibNTTe$I(5VM dn>S(EY$ÛBSHiN` ʄ]W5va 41[YHS|C-"-LFx|9q0 / QHÓm[w"jvlR#wKT=qVן= ck4(8_Y^ 9-!q^x(A? $%d`ʠbt88аjƓjIj[rxb`č&<|3&I7kfbbLN`86ѝ1]EQzp灮b ,nJU%5 [`6S1 ,G'7oV9[Τ ڟ'8a6*0.q}Mg%t&ψ5㖔 >@C<!kk߹G':d&DPPJE[^|}έksgSe,E:r)YH=NvCۤƬQpn5 8Sό-Mi~ uۥDs^Kl70C@Eh4xė?C6RN?Û ei }~pJ_?HIsAvGMe88ƅ+gKsfi>fhkux NajuM)Pv'[`ᤵ~;:mjf5TrhйsXb |-Milik4SE2' 5^֮9uxZ٘M2}8Lg(/q ?ϛʘKGЈJ!(ZLh1(N4`ZĂ&'/,Gde r4jw!P֎A (2 *w~CWm#<Wpg ld=م: 2Wveby{ҖdV:6>|-sB/bJ:F(K7|]wV\v`eu^D!na5q-jN$e#frU-rɀq)c9d]o\QK6OیSն̢S&e=8ydvihti0cgFV374T!ld2["T,X%BY&,ܤ%SZkuX >>"kiCMW`ݛuVl2f|@Q-9ӢIˈy)BtF2GŚg%AqQ{D5qqrr<2el~%N+wSqɀO[aG8v-7èއ.Ϗb\2uG6k.- diZ䤸+/Àk5/j+I;pTq!(HDJ,_/ bM< nAr-x#hH/6z9_^-(3%KW$//fJ\vLap0JPKXqEpګ >*pyzor/client.pyio~Ŕ@ *e;H:"p`HbMͨ3ofx(ڍ)D9޼(zꭐ jCOTn$#Y^*덐5*do"5[Edj`>|Q.'KA*A Ry.^+(+vbnmen1L%5R\הjf%Ҩ/ \h1yhrjgDb@iYk]gK?A. r]VT: y gf{PcӢp Pp jF6! P3  2A2wvU֬*];Q [Ц[R7MUa!'c/HLmWl˪5-yXo/P~_ɀ4$W5..DU-e,]!AW3Q5R.Ze];'d)}5EbRVqY!gGGSR.W8yaJΥE.*I>/W`&t2,]OOi#^q'ghrSc+hkl!AkIҠ~5hx1%u t![t6n$@nNJ7>Vo *PEuÍ%[VJ, Fhx^ Q)7V-s֗N V`+:tg0X@"֩'FA*E/}M?gfw{6k`$J^Y+V-; ޅhf/n/? ޖzKEql` Di_8k0{Lw9bHVlt #W:>dc7 I.fG!lJXa5 #Z4 T +L簫㈣<{̓$T؅eh0H&\':/&mAn6Ns1HB0kP&;"DKD'| 1bG I:=4I?oGMԅL쏤p]<4m$JMBvꙭaG'Mh3CD|auBH>fƤZ'\M'#!&ƭG=7 1` `vgYWA)-Xg75SÙèx21l%s:iWG&kuND gʤ^ĩ`Vȅ+ >lSWLǠZ/lsM \Ea%*K8Z-wR Aq8jAiQBCi&ineYр%U5lـu 2_z%Ն=m@bgxtxN[hӃc%n߻gxv:?x{6{|Q#$h`o0Gm2SiD{q{|{j ; Akw2^,z]430-y%IK(_ڴ-kZXd(77n! >gbbHyH!}VzZ>k7A}|E@ֵS){\6/h@w NY7!|S5f\?.ZE ԑ4e~ixy%Qvdy;b՘t|4pw@'THMܹ/ 4p b5M:(tӸ`#?}u۬R +I0u֌Fr4b/%ᣂbOqkhIyK% *ԞۿF08,`ŅC1%vv̏TE[\5lË܀Gؖfctc T{wT{@t  _ S!w75^M2-nvj*~dwp}IH?xa} ! c8$=Uu ]yAww؞VN]ա,JNjF1RFa`/DL!Ce:^=_t8D uI^5Sz v|2g|M懜ya]41y:1~h8g23y$D2h:v[ Y(\녴V/eӍ LZ_y+' -|1 õ] b`7'X>ֺ&ӗyɁM;EUOFcPzb" a/;|&B @LWwJ79걅?!l68X=`" ;y1E6fe0;Ui<ƪkAKIr`d˦w rI:,]~sRB]7sbn@I#{[p`&$Ϗܸ'plysixA=3<9;Riйda@t1*sº0a t“=m c/,-pb=؁ 4{%4z̹ED`;Wk ܲ{pbp ?+Z5^0  4뎆ù~t `7 SVKfhĜ<9> 77Fh~8yG.H?8xPKGYP;a pyzor/digest.pycXn$G{z9 6l( a7Cqjzkfz=` M.x .@WH Cuz]gP{WHLH=*H1rĞ#$ڮH\犢^{5q)uWiWTC/gBrޜ{*Ń芈ڢO6[%Ԣę%q&P٣BŰ.zPS|-鳽pbջ,"Zf{`gCgx/HDu~ Twc3'[4\bǩ{44qnOP_xC=¢|X^[TQWu2:Tp#RQ+ .i*xn$]ug#>5v Q^G)NX (Dp SJaPqkyj~ Δ+iR-̒D&i-!>'Mq"U( "&q~l&q:98zUWn~,m9>fγr;rA6e%[JeC6D=߄ê∡~(&egkTDqAz(0:g5,AӈWؘ8f& ]},fiɶ BZ)k<k~r_eD*`mE$)D=N׆Ha{ӞS 7<9}P{'Hbxn140&׳8ە~\5~pQ?gEV4eir [7UE,ꌡq&EHQ.pcE9nFY[̊6dC6Sg"wZcH.l,) DTd1_6\i´{ e'g$ۜf 9eoID+'_SO'{T\ByD J^_PWȊk\.0 D Y=A6Ѫ&֛ _ (,Y(1fɾy.V?6zhO?ҋB{t◃)&T ϋ0R:x(Oꊣ3z[sqZG8譇:'l7I|G?-N\z([û5B)5\d8PϢd-7y_u=G✋,KeqM,Sy꧘n( qa(yQG#v]o8f҃I6 y[%8wQ+l累Qxyhx{'.Y.^0H n<0#KO㱥P0"rܜor@ TG ddl}u(b&O8J6˳߻SZRNl5[4ᷘɡӒ|%$<%D$%Hߗyr\w{g3uYuMwW`VCݺj]=EB>Ez}GD_.{f=Ts福[6*T'HɑmDNd,)gC(x_2\ JyEI1H<|vY f1˶F\|>&f+r~le=HGs)[ͱ}mذl zH ( eL CYYU (&37]Z@!DXu[Ľ7n_PKGYP!j p!pyzor/message.pycYms^ʒ%7i-űL'uک6'QqAA m3UgڙfhwE4PC\LO~_4X~lՀȀ-Cݛe lU @X -WOG_lȥV!t\K!PI-` KkZ: 4I^)f@LtVKk\UmtyvAK@ֵtוtQKg!XQcZzkJz]K b7tLXEGSÓv9{IЋD4Xa9-~&=|(LNiFH'^/ xu2/~6e'y>9z>$ ~g Lr2X'ݰfp2:maϦQe!H: 0_B7p u$]ĞFgTtx0qL^; Z+Ԓ/}l(XLFa{yx];;klbKȯQ d1zI<ݺcjދNN#RW'?9`nl[Rۻb4IRJR/q;):ٯ1%'g^&ScDU8յV9{QdZ5uAy3KM] RjqQU۔mLT&,0:S"طs v.0! ru wAZGY6rďpurg\{fٔ^$tFrdh\zH})$%1GiF41}4ݥL<$ w#B uK Q7G&6y4AѴrjMVҪxHD/K?N+Q9 f da Gb07=C]m6΢1g4 -I2ypS5'R%,0h&B=8ɍ_imّ`GZbWlPPQg:CfP=~zdP%n>O4wT1E,eFA߄,6%3+ng$foHMN#̑D7B@Fdi3\-n38qEBxͻ޴YA\## f^ ue0HxDlTH[n:JzјFY>@P}t.^ěqGۣS¸yړ21 fgtcNzQl8COEb1o$-Ǐ~m+J?؁ ܎3&Rugqw [4>7,(z@ }pr;JxɠwNjgR~cJ\k8퉐'ԕōKfj?\ؗMں9Cޚ0Sr^|jLFX%Lπ23,wv Vy>C[H{]ԣS"oܻvxԽM(QW5y*Sc=OX:$oW3~ۏ9 6a%8DYxW T+ -óp8F 5{lJƂuO(n%g/GM*ԤsWtT)wU?SΝ~Fz xemQ^ޗ0m-惲;ϧ TuR1e0@fe'Ԍ'5V& L|VG &iC~BgMm19cpE;Y5 yO MXM0 T^ZyLk:Ф\^?p0妚. _,^Z(|Jŧ(sE20g5fN9E) _fk@ -A'}aR c}@_θD"{M%̽0"m,ݖkޥ cOY_Zm#$}A; r(bol'[l$K17P"fsžF,@l/WՋ_ќRy1MZ^q [2SF~>};9]f֬z>S[)PKXqEH|- #pyzor/config.pyZm_ I/U+׋8@"WcKpɻS̾p)R%`<3K]*msY)y jިڱlX*mlB%AfyY˦eRٻFػBv~MeQ-h6kb6d U7*1NT@^M=WkĖ}ӉxLEݲ[idSNe2,i*7~7e#T56AՏ?p]$h6]G<|N4p& APjbf4Pk j\d$,f-jp2к nnrr8o1{؋F0= ,WN⥠tϋNE%Zb$|ɵh\)J@g-+hc皑Y6̢dFOs-י$Ed-?]@)\R-Cs`F,J]PǻWnt?;(A6r"*m 0}\@ې ƒ JT[ PE܂3Qi'8qy*hRAܺ.Kt#k64,P#ȣͭ?'+w)3"(Dת+YJ)m7K, J =G!@^A@>Ⱞo2K~Li׊# TeކԩEJ5+k6me { L>^@b]-~׆+<XB}WZ0B(ՙ)a>hmӽH?il%T0SCo ';Ѿ[C@y"P[H9`*l %fͰBDYP!rNE`H0:Z$&D'hZ)^Ka$-&F xEgJ=dd韛#;/87}>yi3(^q;ـﵝ"Hq4}(RciJ|D@˙Gs[ofSTB[3;eP$-v̾n , 8[z Ff~uؾݦDׂlv~DVŋ_&drlS)/ĹT$R8x*C^im:楡6 dr]XlR/Q& lTh劳& Q\Y0P~30W`$?יS/ Iq_,]}}b,J5ɾ6$p&فtt{`Sb[Hr 5 k)",e iGSam~v60+ҹI%ЫOw`~"B%'zPI×/W}A ;Ӝo޾~47=lDaCޓn뉏NPB X!?+xlMMM=E=aކiMH!^ ^F{zW !쥞ξ~c.Mmxfpb?$M>r8k~+E` =T+qJ(z@O Ds8. 'Wn}a:8 G7qz\d{<^T8gդPKXqEAli=pyzor/server.pykoF~ŖA'N=McvrwHbE,|of]=(wfv[nZLּ8Uۮ,Hڬ*'DZ> Zx׈wB,+j Vg_cה ՎvX؉\lDk>~d_+M"m3 B%9|!SO=y9Yt7dUm\_Y#HQ2bpD3)z* ~Qe`iZ /~ጆIv16C)V䂎%k yƫFGBgJV<FG}kxŋ ߱gls)>]F`0Cut%7b ̂?C;Xt@K /ay'b0&H޶M-7V_@kSNk8D+0$gE g5Lϣ)W$oá|m^4Vȅ4fHbQ*Uɀ De`5gyF\D̈́,!9 δc-3a䵈:ѓ.I ȵwh?|opa𛆗WP0$W04*Mz7VI cUS|H+l=65,OwHg,$#;GK$G_oibmHwO΅>t953%4uֻaOJ9?1" uw0eyxPNܲ|^CcXc&/[BDs 9tv"I;.!@c?^v(ޞ`PDo{S'lm䨊8pqy|?&mڣlK?W]*M sl]U=Lw 1rv0,FmPP|R&Xn%U#Cuc E4ǝޫ)1D7;ja > 2D]Xwm{oCw*][\|W&`icz)i}vv`(w|/ !N0+[[0 iM ^FR$O:`M{fq˶ M_sM$Jl]}20s1vG&Ʊɘs]t)T^knKB䌝6@WAIxV?W H\8T;LiQrI]#ԾY 'ڈޓ$2숱/X1XssЯp\\!TN^"5`3U=D8s݊]O߹: -lħ2EJS,Tx=T)IɳP7GLZuOBYۢd3V~q<9?^CzUPvw6\s1W'rj?~`ҡ-uYmJbAj ^c 漘Fa`~2s!F@'?—STdjE )?@S&ͤC:0YcRbk8JWf^b12+pW "b3D3]f;‹q睘P D,egW@⾼^h,[ !&-2*C$.jlD@!l/.>O࣫zVdߪrePz#YA-#z3{RA}.".oBp<á#{[ëuϩ/qB#3H3YS)B~PjR1h#d$cq"|W$5*dn̠HA)[漼fR9`Z+ո؃rH]Q3`l^7䃗477f ZFZP\\Ӱqȴ(uLmWҷB,Hu:AcXaW au=Jwƾ=C=te"X5"P }WR7 ~€>2*Rʋ): - @ޕC[\N"&XH%`o] ʭh@7)y՚yԦ\Tcxqi9ۣkxx ¾N݀j itkJd@&ǑV(EM!srC Pڽ V\ "+!]RjTbFLTne6RsT5ӐLPk. ﵩ@I3ybM^<^@HLL [ .AؚgrRQ+NV``^[X`QӬAlE,]PIܽ%QǗX冺/(hm5o *kdU%RUMܡ BM5`F :!(R_kCeP*)&d8TxDў1»(/e]A-XLX/%)Ple@QlO qXjhQvɡN;Ge%{# ' o-%@.\BEǒd!Cv8d"\7Qe0!SM[d!z[M?TڙP}3ꙍoUi6ZaWZ٪h`QW!*WڐةLEV]m,i1ooo 0Δ׸JBo9Dkr쑣=rb;*N~%w,A;K«nsXH8>s3I>%J 7-Q!U=Us]U.Y^`r~V S;KaΉD`Ee'2IĎ%z,qg 6ŋcje{p;ѓ:Q4,L${bWgH'ROW')1'[( 1 4!E{huZ_S{4ꉔc2\oߌxf6s? |ƛaB3,ά9XoiJUh3oi8>#'o T vzmj"q^;I\蘤}MItw&gE_|s{4MeY1GYRa43to4v0w~7PKXqE7)ڬpyzor/hacks/py26.pySn0+. M CoA 0",.]G%)r<1;;3$4Cm Xw}IRmrxNe8Nҥ/ITXÄ^T#n bb-hreykDʏzDw)nְk7Zرi!cQ v~E6,]ȎFB(ThjKAAʒ@rP6,YbŅIDB[rQN\rmȕ]sn7\wnmy@ET-JlR2Xj%'"2g,DnOflShS/p"K8?'5wEɼK1 2Nr T:Vyq7BvJz(/a7: ^xs{>S%[/IכQ;YZ]Dկ#gWkP,=<y/ &nWeJ3ΧJ(PKGYPGR4pyzor/engines/mysql.pycZ[su]`»4EHPbR74Q 5 L; `pfIJ$`UR*UCR~R?$? S~+Nw,$%[+twӥߌ_Ն0t}HWzG  N#ZRK[wĺc%^X/Xa>,"+b-:+jD<䩐RU<}C](p<_0C3Ehհ,Ԅؤ!L!OpXInS"ռuZQ-ՌkAx:(Dy}ND ݇>j }4PCW@T|]fAlrUՌBoy 2of׃(l_%>ƀ'rUfDSNd9L3huC1Cq CЮƕ)i,YqV<Ε" NrrJ\9S),r}p8_ "<Ƀ^ShJ%DQ 7/TvI(SM*Kb_GKòN7a.+\T5; U:<̬y;P`Ker̡J afOTW:J4}m0fRvn[A8T#,S, j>Q~lӘUn4])|= ;6ỳ&t3v*ya]*6:Vxi#lBu.}=?.1k.iH/n7|53_@P'!:t(0cv~@|ǰd6 AWJf0@̖t2D?CNnFKlӌe@O\7/p̾ :Y܈mդ*o>rN$`>/# 紜,MДqr{B5CUw}U!IZW+eūAͥDYK5YH&=֑^wUҌ ԊXIBѵڵ*bez ec[5ŔQ:.rL ! 3M'+dɢN8kE9c}GM"!ӹ3H2B>NuBs#oғ8Hw"`VQ`KkeUgRĉw]6myPͅ3H,obԉ#UYrBVwZN54c S0&$%5HJⰼ;s@4?OK0-'vF]XC,0g cq NSPoeU7ln4sy>%k aĮ)UjO5: eSem8S)p`=KPof*S3Ē&O٪\.?<(=1caOM7V˻8h0Ɖ> 9\VRK}xsb# RZ/{0tM^pl-UD+R!]qTyLu~H OP\ jVjj^UE#zU#zre-N`8!t&MB6eJȁ~7NIбh_ &@ C|.u7fK0,Zz"x i4 se?ʲAG{W L3Gvl}LcJ?-HR; R"J8!Ü 1[Dg<DM!}&kDYn:E\A6DԁfIW=g{X`pCzAbo4=S҄''y0>ڝ'= GJ.}_S5J9[hS?Xe^WVfrW6>VY \j3Mp}3a,Xk!õb(7*o,,y[ݏnYZqϝK/\p߾.Z?ܟew7~~t߽s{U3+wz>~m8 e*9@\n0xBCb\O欉sAe3Ҳ8n:\h'>k{,rR'R-W)ƄmG ĬNμO_/oYXx_aS_N}r/DIp|Otg`Y;W"rp3dR6[8dM:jvn#ьR_Pwd+$e;9V>Q]sq~%lKUgxZ(`ԙt8`rJZO63v#raLQ,|f_ٿƀe[:#slC{vT1dӉ;3]|ޚZ\IA_,0h"g-(w/[W^FXJϗQBY{/[_ ׭؂/߄sv$+LxqL:Rf%n9& OYʷ? }Ӣ[6ҸEƝs{eUG,S_bA1ixk \SIllW?Nxo ̛P':vxwȃx7PDЊbv:1IJ|Lrhz:Dl,$!,oSVDV-UUT[:M_:[D^ePA,O/3QP+|G093bOTqJcsl˜78i%mv:種,2Zԇ,Jmr( C0EY@z:w"K,P2~Eu@*sTzU{Rf4|NK1Il{R,rXʾ$9.hi9"YhʦuL4+Dxֈcȓh?ȥ:'ɓ-q(M"D5F`k<__$1ޑ{#t79 $8$bHK@yc/!BX~(ʃwy0 =NTɧ(9sʏהXw fE??# d ;gڳ(TaȒ:{Im) #E;ʷ{qL ?{U E[ɀۣ. 2,X;G8vrL>Ӻc Yes4*W(ۧ|4Z]撿C]McO~~RCa3w]OOR8F>0]fC<Xmb !<+s<*!IPi|gbg4L=Gw9D{AqafF;?GO:#Am? tz&pv'D5G-Y'cW]e?d7ieY{P3n VsQdRf֤HYpqƊl' xS3V'1=aN蝒7ޜIr.Nzž/^V)cJx{x߹N-j\oFxϛG]iVHwmͅ}~Ԃe  aayCo1 d܉NH;?"> sw`T̰ԏGa%p[6 ia밪^!$zn#"( vVt` " E2F[m;׼,mDQϨpt;DM<:Ev(_z UՔO3cycweID>33~ M))S6|=: ;wHrI)OUu9my@})5tI J@)nDž`5dzZXxhIguyYyvT:Gu$P'R<|NjٜFD#0X{>`cS<|b>Xa%eO3z׸Yh"a抴޾Ec7;2 !`G=g&CdFLa]kM(\{uwn}wRwt';W <2 b䂺۾|n,%G$^=DpZ|D<9N=  4 dNzH~lTؿw"҇ Jkc-G5gۅdCFƱpX3y:2BפֿP1 4@r3& ʫB Tf-y(Og(v/t tFFafǔOPu&MaT7nu_w.fkcRxR_PKGYPd pyzor/engines/redis_.pycYsGYJʶX%īc"fVcQfjҎvvf3=28p#ßFQ^OϮ8xs@Ӛ~>b_nDנ˖;TZ"Eb˼b6q̻+v\qb5S;uq'}NrN "˲M4C̋fY5.Ey!1rFDu~ih_DأMPNsNDBcBE=/d] ,E0S\镲MA}I>TJ+T2U; p7T-8?F(\0ltyG(ޗ8_J9/.PAÁ}Zv0L=Yz(]%8"kxHkQ )o,iz 0(z?0 *vqE'777:y]s`tF'< i/d)/`2.˵*`l+`? Yb`2&جqC;jgWlHGq@a>B1WnY fdeL6WS!d<,q@ 7i<,$,Gy8RP?{DiDO:Ig6&KɲAkݷi;;%YX ,[XaA01Hj#Nh_[)R[]Ysb' zu3,r8}qra'n";ku#$FhB{r*/u4lʬACfE d/aآG 3=@!ÑbL8ֲutdzQd&t˫pO |07o|U7_B HDe8#*̉,4!7_r qP'v x& Ry4%ON[ܧ8^_DE-ړ/cJKy!9VJeOg3i\[ 2VmX-|iY_.pQ|M#6t@b6-5nUu費brjLa2-$^#pbzղ+OwP`1U>׍a=g2KrDً}T /*X"RnXWP.1.CwݝצMѽ>EO- >|ƁXdBߘz3e.1#Yu[Se%`^7K?\7]*M2ī.;j 0aÉ6zM|I@U)gGghd(ApO(h=BbP| nĮOΗ=[ܶ|V I(iud|α1QO`c[ )aQ[L8bX6M/LIJapUY3T!j2D[6hsee'*F3RnRqT6sCC6 5P `M`pl#ӊ : фw?zM0MӊGax,4ZOoݶ vK[9tˮ5ӵޣ#] zI7Tb}D`͜t!x\Ejgnǽ\}LDX } +˱[9kպb5>_YN6tp8)e0St8R.@eϧ4)Qmd+:umYIi!ꙮ.wJn쟥vXI(4$LT\NrI%1X☘3;A Q[e8?\We+[Sv c_Ld!Yyz7ʇ` 7{F,|N7 F X$ %c3M|3fMT f:孒2>iwU$68:c}΁zfmaZ8 ߚ 88W^TY98Чa? +)#?Aq`1z?3~OOO~i8~/^CĕEٱCxWT܍eF/we&xjq\F-l\^#dN'Ni%8Y(VQq3 :cK+YN@۩aZcW~2SiQDC{&11"͑Ue=.#Li*pюp5vHO$eN2K62q_2vmvM{pzQUԢW7k*^ARNfv?^'!#ʓ7+, ((pv#p/~!@x^0Ghzv^8jnpNmSg5Xzv2HF#!|3A}NiMN.9LGkn6NgX:˕8=3N7+z"$.J9EpTFy֓ C׎w 2:KQYC`皂D"tʽtzpMϷ\0+2¸^l:Z{2AnG3sa|73Ed~2d $eaGPY`9b6ж ԷJu)΅`#tJѸ-tJ,EgE{}u"L +䁜:/R)eQ\\ CB jj*L<`$qA 驒Oc?KC2"9%8A S0S3a@PNvcTEu MH:Avߏ| f @5 j[Gc.k |@{3l[_[*gQ>'zn>PKXqEk pyzor/engines/gdbm_.pyX6=bܭc[ k7aXI8ұ}=lKm$} ~[QIT0U^$DoKRTHwl䭆y C hɪyGc?BIJ5Ef 3w[9,y%sc ,*eg1y -%LZN&-I4X†S*$԰+I(*`R?~6[#:3p&w$juhsHՃ'fLϦgӌLNO r};-v/gɢBֆt.b'AseQD K PP.Қʰzbgm=q}M"_CR Y 3.])g1#+%,3/Z)43$5XieHd,.![@:p(\9 }3ZMVL#a3SѢtʥy4 +1Y1ق>~cJWNeFŪKx';cGY64# . [ v'%2m)A0Pd̦8<`w܀"Y\ ;8D`)+EvPG6ޚKdƕEVYV\1+5ȫT=aТ8E]tmIzT!MM )/'Z_t2je QAu LƵy')_0{ p \`;qgLXC.Rr*bQ `9ZAuDڻ-0;!8jP5$ yEKw.0o|'"2&-=B &ml"ڲlbMCx2q˵؜ku͙iӠU=^!<^׷}7dt /}elYI*ߜ;5ETۊHT2/^J.Mb0Mh_%1\1\o bXg{hMD؞r^ mu2N5gfcI0KUˤ޿PKGYP D!pyzor/engines/gdbm_.pycY[sG>3{vڲ%[c ʖr'#$8J22,qv[vg3* R*'HK$caG>.S$ Eɜ&uB2:)3$s)4H,lx_#}ԫ,ow\yڻ''a}h;;(HuH4ƑӆUS-Ӣm T.N(P O:p|'q/o+#S2ҝ)iMJ.f[]-~@J&.6.ram/Gx?yVYKvd6F[ϓibߒi)޼u){A/+G9gSu$o1lX_OڻMv+]E6)XVnNYldEq"@b{HL3Ln 3߿eu-C]}NϊVeV-P}@XҀ2B᰿oLpz;TGuc}Ufc,ѤcH3\+״< BH4H?͙ye)q83 O;K]D+9 ^}Q -;]&6ZE+_@&ت!j~zn%pp1ޛo9mXfP/f4|Rȟ˹x̽3˄N[ (N qb(U%I˖ Nԏ9ohsnl󓄍mPkvCt^Bʴռb_=zPXfƒ"ejadv!sARx吺׍+yrci[E\aa+lO ~`;ЬOݩ#7s_0YiSgԉ9q|fd]ET ~Ky8%"7pЄa Ɂ ;uh&_b13V1(vQtz8C}a y`w'ܛU@bD)a%"팳7 A0gS+,ŀ!ށa˜]?X])(I=t Zd*$I\K9֑ӵ(k@eo( MXTͳZDep oywh" s^ǜsYSNן9$s7H%<7|Io@(JCQ8EíoR&~ۄzndR=Q6).H>Dep⢎6Röwk-B{#{:{ Q9Z~+u>u$Y!uW@`lɗ3'_؅.R⧒µnmRLU B4Zz5m9(iu7P\"e\J>Joq@zR=Jҽ+n Fw9Ih:ǫ{gaً}w|47(poqͥDkn]j}΋^(9 l"2&`F7 apǝ33}Te.^躛ޘ}{UH}<9ײth:NٝtMb,8i}$ԾǎMЍFﯔF8Q(*8!BQvQAHV5B#F+r@Gr҃& 6p0-ln0{!ɽH|᯲tUp0)Un3ێ"%_7]xe&]5/<[Ki=X\,s PKXqET4:pyzor/engines/redis_v0.pyWmo6_q`T ni0vkQ֢Zl!4eTcdɖl;xwϽQJnB-k%X}nF[Q7M(qEzh Y"[aU 4Dջ4FM&wk'݊Hl Ƒjhk8fK#6ͼ-zݨ"޽|{o-v%+0mhJ1-zQr(!#@ X]I@ a.$y#ʼJU\/ J (1@5лִ\ S@X .H#RfY/4;^(Fu+CF% Kvt-ɳa¶Z)zڐN C|܀ ' I5U-PH˙o>s"3 ћ[- |k G7^KQ |p޼zM)"W$ڕT5_FViu!=V9t/PEP9u)FY絪mU*5mΗbN4=iU16m s.bn16('yօ+Tעk &TW ~ c0+Wmgq:6u_̡X6@6Fvȓ SYOI<$G˰~%bcwAҟ>A8NtI0Y꺰n'8{pΞAr j8& 1:q 4_{:YvQN'Sd8}n;oW(`IFzfEЊqGiaȂ]<+gE=T y&,zH N?v'ۃڥBÛ.A 'N$}cj N_ki\ h @߸1ϵy}A=AOT{2|TPKXqEieh<[pyzor/engines/redis_.pyk6w£]\ ݣcuqŖl$m6$YGcX~Kq_.dUYq5f[j\끗ZEJl/#%~Q,,ȍXJ+FC^ :8EEQ- t"7˼6O׫o~~ HE}w/^]ZcVyլT݉ QU] T6H6z;&Z3m : o E*ѐ QCy-4k?4'5-K4UlLD6閿|31QN(YzddFf#a5+JڶI=ITuLK 4X`UkʫBq ݮgt\ER{Vu"Y[g䔊{|J'u 7kpP-F~eA`9ЖH” eyDk,[-ĭa98@ iָdܹifC:9XZZ,t$,$4s0@uOl0_7-#/D^7٧΋ +4B[6.bT4;ڴtBqJ#?ڜ!ʖJI_!’HZWj];(Vn%stX1Y@D~,QzLk[S?#M +7(j *҇s =mrvomw0c!cn Q0%;ǫ|w)'27yv#:=e{&.؅ v MhJGdxT hTKx~;J32vvjЮ4ד``~HVGg;1c@E:1rqF 7\o'|YT c3a}#؜E?q#Ss-D? NK=J|z4˭gi C?#0Z4u-sU7(<Pd'3}bu%l!``[Ȥlrq.|,94 wc #F3p8G} .TCC*Fu&:p+%!RjbM@ _3x2z›7؎πlӬ^j-t#-qU-N$w"5D$w<{Gf 8eIȚ1Ȝichejni͜M]0GZFFap@;5QŪn%XxGFPLy4G)MٳtK|@\8% -+Hs蛡U?EW$(-0F*m`'}a(DPKGYP+Ùw pyzor/engines/redis_v0.pycXmsIٕ֖,GN8B@ C%r# H>1PvdZvGM(~ӳ]Mffgzl}/7S/{RH*H#m;b' Y;bMQQS.@H);>1b S\FDfDTohˆ<̊h+D4-TShB =gBl̉.ΔDOY./qDy&*;"U%h<C=f 5s: sR^NZQLuCk ӟ6!)4Y*'dQ'Tϡ߇&:3j]a2KwwǏ^;S̆RzM:4M6d+ 7-i;23o6YͫܜkMl =z z%v+Ex@A.%9h&ZI*J.#tUk^A9ty(p9L׮1cwb͗ v\:?i ]xF S05 \ӆ0Ϗ"rhT@TA.P;rINj6!Q5m϶L{ڎv~1mrLxmȽ/7 j̣,{dž5j6ϸp5R@F7lt^(~r9W- @[?,"F[Fn;QZ{)?dn2zaq0;IOI@M#c*2YD (օ=m,0XlzsjlsKGȌSfHD iۢAOaG-c"tY9߰pՈxRt!SJYRjqLKǼ99`dzp UW*RShdl|y"2}ߎk84 %cDyq& sHMBɧ ۷c˗p*k z}"oX/aSH]oK\eU)?Sܘ7ɷ{$uf:snK@]Y ӀnLD594UY? r/n>HFZb~w5eP18{bIVS(}ʻW1(~bW}Bj ]9 $mqrqOG AwS$ݓuxNMR,-Zz|C1PKXqE2J 0pyzor/engines/mysql.pyZmo8_A"wU![` \xEӴw h[[YtI IQԛ4^3G3/| 67_&SPET2yh0tϡ}^noNL/fE^`4AJlN|l+JX.jDPi[L:^Eq!$R7MTN9##r+[f $_\DF_2rrȧqF4_:lm7+ُo_:@^?J=bNT2/22`YA֩ZJE IFU B2?B ݚY dRd!_sQcKbɚ!Re.Hב!/6Y1SO8 hocIc,VH"!1 ͙G&vd0#VCo1)0WmBOHCp?M*/C6gttېSWi k*,ǯ&Z//:W3a”K`G\zmhkȃHzELK&XHΔ\G=JX #wy`O\C,TLjhi AA@mË\}.\NH2 K/J5/fCA͚n`po!Bu*pPɰ" ;J4fG`)Xf%L2ASبIP8.HA1EN|*_ KOl#pu C!)\zo½e5 =y Ȏ {_۫%֥ft@i,z\n^W7[5DlI]) xwng˷LOBra!y}7/qw޾G;YGzԎRcn.*rP45l4Gd4M׮ | "rVa'B*7JH ̣P:'\kvqѯ0f62ow_RM9[`ļX(MSPbT*QĊ{鹽K خjFziKuQlR'Jfz6+ B$XǒNW =j[&] dS=1%=RGm_[#lYЧ힖dɤ KUf3Yl.UK:gɽ)ivEzHrg{~kHtOɖj{@uwmxHziNl5r9_D~ ȗz蟣_h6u07:iߺ[ZYS륕w`fT ⛠Ig_v.`u؆"H-cj_?sZ 6Ⓡ-ę`k'rjG1"&5=7x(P5x<QA9YblT"L3犟vwz'YtKܹ}}OZͭK7mj<)"nd~Z;&\\@5yR:VC,o)s&;g5jUa*TPۃn oμrOb~Ϥs;Uw0@ _[A;HQnf !]a:h(-C[u7hT@Z`4ۋp+z lkA=Q V࿃^QjݥZ@MMS՘}>LQy|7ujNTɽ?8J۰9m_qip~ ܊|ՕoCn.b~&D=e>!u[ښ')vg<{׼~_PKGYPh#pyzor/engines/common.pycX[oD{/l4)€Z6AP*VrJ3/3\Ph ?xKѨ2x<>wΜsƍzO8dŧ [3mtpY llåv 4F9D63l C-&a:Lt116Δ3lK ƞ3t7.U=\=U΢yTw$I>7@K\DRY.8RҬDgm]B6v{@ a'00֩H'T 6^E-q,};2)KFC T4xToWf@n㚨dH>+aG}t$ ;R 7E}q}@u@ $dE5|fA\x4eȮX\Z1yvfΨ>s5Hi _T+wh*?PBSƼIf*U": nr\+\r'5*D߃X?1"ę\=b(%XMP1qͼ7J501CϨSMO\5}FRRӄq `}{ G`QWX`ie^x%J^ede`J`yTP.R|O$MY-3Ü4Sn9S~?c=`k5e  ꓊N!?CjL%*;!y40b!-{ 8*%sڀ̪ -7c/IÎ%grz7 y*9Q`]DQg^^a5:sۡm6:^Kk.1e"\{{$zB1#n}T^u!f+Tn "o,5. PKGYP2EGG-INFO/zip-safePKGYPSEGG-INFO/top_level.txt+/PKGYP2EGG-INFO/dependency_links.txtPKGYP^-EGG-INFO/SOURCES.txtmOs0|CE˨=I%f$-UA)yvtJyf.^.U$߅R$~_%C>lt@{ |eCVg]HQLu!U;nq<ZRJ i.?0L#uNH]hOl|&mARp,%%pd+w~X>c\H᧗Svp[]2'jp#t&r,PKGYPpEGG-INFO/PKG-INFOSMs0W19`:2!,Sp(yeJ.~qsߍl4 R4ۊ\20-k%"Т;hdA$ 0LmF[Pb$2{VӬ1^{3*Q߃_T!kKVMr_nG%19Eڦq*#bs8EZ̺ ;e4'tun  7RHBp0KI fUv>1Qa}tUCMU ǿ]n E1=%V9o˥Js ۃ* žk^7K{GçDU%8-D9nLy[]; ʣ0NM=1ev Bq'ׁNbLjԠ]?16 e7jV F[*WCOi%2n.{ :(goSMІl忘hQ ґC9/ k /Rֻiyfc^zһMtJCmZۇp2NܦZ]q* gfC 0\VTB1OBǘ(;/eN=]Wrґ̪wDF O/G%-|׀זQ[w҂A:@Y3! 7F9Wnt ipihYwPn mjb2֭]6Ĺ77cdTL4XZp(=7 i 2BT,n9</Wz=S kh ^`Vɨ$MBhUJDOS1eh'hNT[d%øRqcOcbc7q?oU<O$@ :Sc3yOju\!F7 ?.5v=8sC*rߧkxXA,͡dOeT)Σmc&c\]T=K`ַ tJEW&s+6̺ͭ2ձmJu].(蔭,@PR"(ʣjm(hp9Lq-%7 dG0^+ :_2ǃ̫9|"K8*+|,>S{i3k TWRavT<v7s.ϡz<V# nRA.|<&zd+eZŮt\T7 ©(!D"k7uU9ETv6NUG7_x:=`drVr.֛gW#5#)bFl-ta i< ӕNj_3wDD󰙢?;= I1߹7bt ֫Cل5ù{mtֵ XAӐr_IJg{g3QMpizO;ұ9E5|Z~[O46P1CC 0t5a'wG:0?pchfab m]R<~.lRC:Պq`%ԑ/4,ScW 04;Ow9H&aٲ TtvA9>u)Bs+n(]~s޳: 乣:I3suLιrCw[]<Ɯ" ?/ʔHưV$`1BQ˱1G )ǠJ}7qmH\L吴QvbhV؛`ֆr`k0y3 Џٞi2(Phf 7D}V_e(cjB&Rc( ۛDYA?ꂁ=pY3E+We4q$(4y̤ں7\\߾G`:QGؙ=)3H uQz<⾺{F'x]H|Ӣ{K7o@MydI2\% ~m`s8 M<}-~sz@*!%9 dy8Nx;P#`lqETKH/rY18]K$8DD:8fD6s[1'"l VI ZRT k/? Pି4x1st:rv`yj ".fN|*ޕ&^KS]$pSQU~UZ$ etYC s" 74\twcP98U'nX]?"X湛7u.T_0 4ǑG\I2qnO 3;׹G:$]ز pn --2|?u?P]I㣷qk3cr8$-<L0=N%C$qH֒Y ~m.f] $R3:ű0`Un,6[ cٍMΖ?O!8Z-72hY!Oh'j* }lS2&ֿ (:+yF^/Ra֐{ǪVU`gyMU}&ϗO߽3 (2T< &MUm8@7,WcW3LH7atkX' 7mfTehNՄO.ݛ$-vvIO "*ie*qgJ`ܰ6Ic_9n#fXt@[2$- .UveibQe㖤yQ-u"7 ue+ 7Ԁ;AlvocV7OظYWE+.yG_b^Y͢ir8Yڤ|L>mI?Y1R#ajX&|}W~lkLV;Uya[vKX]

13~qe K4 K< e 7@V3*ZY0U]2t R)Y`G餩[6S>ɴ@]= bB_s>@ȹ8!~Yqw0 =:}+,/h(/A\ ݉ 2oM 'ꡂXeҕأ؏_vܡ0s#d)8s[x}h sDyDe%L7@&f}/?$A0':ϤKX)!tOWI/f AMu]#H~=d;׌Cy゠%d?Gh<;Lf ʄCerG(m;c;@L6#ҁaR2*Eт W#sL9PRO|m&#p}@W!p1lyw~*uKȶ$"")E\eأ E#!W&c- Y8Wniy͹T@DsX*mI 4ϗi8$G=705^^YSou2>Ppl\͠uCJ8P^)^Ƅ;z,5lq7(W3 D1#Ϣ[=.C 3;:| ie,W릭K0ZlܯI IWB_o4vku"RX4RPӲ Vuqȡ\|׃r𢺸1Q>AcށZ'԰ꝗ- 2a1 kúIBZ۳>-aIc߃ zoBGGzXNditI2-1hv"޴ܼ0[ȗyW[F:ܖ|B_Ey0f3(|-б{/*' x(|WO{J ~بb8 /궴d\b<ڧ/;P,!>,|' ޼pj{1)T=KRͺ x-h҈$ޛ!lh*bٗ#[0d U*Sg`R\!zwi>Ua瞖nY^,%-9tR6סΝ)1_%=~ų7oCK_/ڷ:fy9ֽ,ff^P2 ^] n0 h0Lj bT`N:txSٛ &QL#.!a^}PCanPfW{iCeT$ә(t/{u()` HL*=;wI|'0"EQ4;<HUwwrt旗lw`%:9f?^לeGR߱9!'F:YtYlTxV >m0;i24SD)o@£Mp@VB]#հe6=橑 *}T1 )p3:9^1R2bb6Bt?FyG,!mLj=(w"/;r\YoL}PΤ9kAJW_*]AydD{ҕk%ֶ̂ΐFS8;Ӎ,]}/g ޭĴT.MbKdd=cPC F߯lu`4؎c뎟"Q~gC؏iM|l|mc xS#;n? xdDcllt`fW\1a=dhlv+PSNge˼?%VAw82f}~ {H3j+ 8naeȏi0nl_!yi\PGxƷw4f( }B rj?޷3ѨW^c]t9=tSuqъpB:]R25BR6tHJUT@~u^6F#3Oޮu)tUB>LEtg \0uiwҽ>>+Ik^WCFjAqwqcu˥5 нG~c^[qw~5BL`,v(ou2K0߲/`6×#04n2:nZKdMՙ ;Ŧgduh0z&W~V^}^kzdh%p.ӾgQ-{gbG.;;#-nDFles qth>mIKGǣ1fy砐M%C2O3y?6hk{` D/7[R3@t"QceҢA*ڤ+"CoBa4:w.R{wnp1p;vo@,$%a=0">h]E';]&QBUyrһx#ovwqbf3n5$e{A=ĝꋙCjuw|@1*H92KK+V b]ln1~av1U_=zݭسҡ;L<"9{'HLK[$V멺L~ R@kg_(C+d\ q\Vygv_fj_Z0tCM.DP%ݔMeʍ|ad0čH*v/^vXRGBaa2:V`z0[ln76=Dտąrp+"s0#=VM޾Q`+H|c*IEקPKGYP ]8.r EGG-INFO/scripts/pyzor-migrateVM6WLUQ\ Ԥ@Mnz G6Tw_lʲ[h8|[FwB=(ey>֢X۪gkfX+ >#J) (B{є':fƪJ[赐v,ьSz3m3N^ʘ>2 VR +^,7Uuˌ4Rəe;fg4_‡!h-Vqi$!eF .Nɗ[#1"/Ek,jDꩪ -E~ )K?޺+tP3\] >ҝ+L ݼsWxB  G̤R3L>DY9%d*y (l)5 JaY4 -nfՒ} ݇4ϳ7EAe;sV3iyY9c+Ǘ{ V)/{G[91a.OV09#УW2V\5|Zu|k35 m{Ny!G>H*,Td>"}QU`_9DuۃСt+9` {] \M[r%R3.*E) ¤X4d}iM}0X:CMbq,pUxa"ts%J`Qd#q^/x"* HJKlWZc@|*apyzor/client.pyPKGYP;a kpyzor/digest.pycPKGYP!j p!vpyzor/message.pycPKXqEH|- #\pyzor/config.pyPKXqEAli=4pyzor/server.pyPKGYP?Dʛpyzor/hacks/__init__.pycPK1WDfWmHLpyzor/hacks/__init__.pyPKGYP^T8pyzor/hacks/py26.pycPKXqE7)ڬpyzor/hacks/py26.pyPKGYPGR4*pyzor/engines/mysql.pycPKGYP.8Zpyzor/engines/__init__.pycPKXqEbt ʶpyzor/engines/common.pyPKGYPd pyzor/engines/redis_.pycPKXqEƀڙ{pyzor/engines/__init__.pyPKXqEk pyzor/engines/gdbm_.pyPKGYP D!pyzor/engines/gdbm_.pycPKXqET4:pyzor/engines/redis_v0.pyPKXqEieh<[pyzor/engines/redis_.pyPKGYP+Ùw pyzor/engines/redis_v0.pycPKXqE2J 0!pyzor/engines/mysql.pyPKGYPh#pyzor/engines/common.pycPKGYP2XEGG-INFO/zip-safePKGYPSEGG-INFO/top_level.txtPKGYP2EGG-INFO/dependency_links.txtPKGYP^-EGG-INFO/SOURCES.txtPKGYPpcEGG-INFO/PKG-INFOPKGYP0{}y@_ EGG-INFO/scripts/pyzordPKGYPa6?EGG-INFO/scripts/pyzorPKGYP ]8.r *EGG-INFO/scripts/pyzor-migratePK((^ B.PK[R^^6site-packages/python_linux_procfs-0.4.9-py2.7.egg-infonu[Metadata-Version: 1.0 Name: python-linux-procfs Version: 0.4.9 Summary: Linux /proc abstraction classes Home-page: http://userweb.kernel.org/python-linux-procfs Author: Arnaldo Carvalho de Melo Author-email: acme@redhat.com License: GPLv2 Description: Abstractions to extract information from the Linux kernel /proc files. Platform: UNKNOWN PK[_;;site-packages/easy_install.pyonu[ b-Qc@s0dZedkr,ddlmZendS(sRun the EasyInstall commandt__main__i(tmainN(t__doc__t__name__tsetuptools.command.easy_installR(((s0/usr/lib/python2.7/site-packages/easy_install.pyts PK[ p?))site-packages/decorator.pynu[########################## LICENCE ############################### # Copyright (c) 2005-2012, Michele Simionato # All rights reserved. # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # Redistributions in bytecode form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in # the documentation and/or other materials provided with the # distribution. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS # OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR # TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH # DAMAGE. """ Decorator module, see http://pypi.python.org/pypi/decorator for the documentation. """ __version__ = '3.4.0' __all__ = ["decorator", "FunctionMaker", "contextmanager"] import sys, re, inspect if sys.version >= '3': from inspect import getfullargspec def get_init(cls): return cls.__init__ else: class getfullargspec(object): "A quick and dirty replacement for getfullargspec for Python 2.X" def __init__(self, f): self.args, self.varargs, self.varkw, self.defaults = \ inspect.getargspec(f) self.kwonlyargs = [] self.kwonlydefaults = None def __iter__(self): yield self.args yield self.varargs yield self.varkw yield self.defaults def get_init(cls): return cls.__init__.im_func DEF = re.compile('\s*def\s*([_\w][_\w\d]*)\s*\(') # basic functionality class FunctionMaker(object): """ An object with the ability to create functions with a given signature. It has attributes name, doc, module, signature, defaults, dict and methods update and make. """ def __init__(self, func=None, name=None, signature=None, defaults=None, doc=None, module=None, funcdict=None): self.shortsignature = signature if func: # func can be a class or a callable, but not an instance method self.name = func.__name__ if self.name == '': # small hack for lambda functions self.name = '_lambda_' self.doc = func.__doc__ self.module = func.__module__ if inspect.isfunction(func): argspec = getfullargspec(func) self.annotations = getattr(func, '__annotations__', {}) for a in ('args', 'varargs', 'varkw', 'defaults', 'kwonlyargs', 'kwonlydefaults'): setattr(self, a, getattr(argspec, a)) for i, arg in enumerate(self.args): setattr(self, 'arg%d' % i, arg) if sys.version < '3': # easy way self.shortsignature = self.signature = \ inspect.formatargspec( formatvalue=lambda val: "", *argspec)[1:-1] else: # Python 3 way allargs = list(self.args) allshortargs = list(self.args) if self.varargs: allargs.append('*' + self.varargs) allshortargs.append('*' + self.varargs) elif self.kwonlyargs: allargs.append('*') # single star syntax for a in self.kwonlyargs: allargs.append('%s=None' % a) allshortargs.append('%s=%s' % (a, a)) if self.varkw: allargs.append('**' + self.varkw) allshortargs.append('**' + self.varkw) self.signature = ', '.join(allargs) self.shortsignature = ', '.join(allshortargs) self.dict = func.__dict__.copy() # func=None happens when decorating a caller if name: self.name = name if signature is not None: self.signature = signature if defaults: self.defaults = defaults if doc: self.doc = doc if module: self.module = module if funcdict: self.dict = funcdict # check existence required attributes assert hasattr(self, 'name') if not hasattr(self, 'signature'): raise TypeError('You are decorating a non function: %s' % func) def update(self, func, **kw): "Update the signature of func with the data in self" func.__name__ = self.name func.__doc__ = getattr(self, 'doc', None) func.__dict__ = getattr(self, 'dict', {}) func.func_defaults = getattr(self, 'defaults', ()) func.__kwdefaults__ = getattr(self, 'kwonlydefaults', None) func.__annotations__ = getattr(self, 'annotations', None) callermodule = sys._getframe(3).f_globals.get('__name__', '?') func.__module__ = getattr(self, 'module', callermodule) func.__dict__.update(kw) def make(self, src_templ, evaldict=None, addsource=False, **attrs): "Make a new function from a given template and update the signature" src = src_templ % vars(self) # expand name and signature evaldict = evaldict or {} mo = DEF.match(src) if mo is None: raise SyntaxError('not a valid function template\n%s' % src) name = mo.group(1) # extract the function name names = set([name] + [arg.strip(' *') for arg in self.shortsignature.split(',')]) for n in names: if n in ('_func_', '_call_'): raise NameError('%s is overridden in\n%s' % (n, src)) if not src.endswith('\n'): # add a newline just for safety src += '\n' # this is needed in old versions of Python try: code = compile(src, '', 'single') # print >> sys.stderr, 'Compiling %s' % src exec code in evaldict except: print >> sys.stderr, 'Error in generated code:' print >> sys.stderr, src raise func = evaldict[name] if addsource: attrs['__source__'] = src self.update(func, **attrs) return func @classmethod def create(cls, obj, body, evaldict, defaults=None, doc=None, module=None, addsource=True, **attrs): """ Create a function from the strings name, signature and body. evaldict is the evaluation dictionary. If addsource is true an attribute __source__ is added to the result. The attributes attrs are added, if any. """ if isinstance(obj, str): # "name(signature)" name, rest = obj.strip().split('(', 1) signature = rest[:-1] #strip a right parens func = None else: # a function name = None signature = None func = obj self = cls(func, name, signature, defaults, doc, module) ibody = '\n'.join(' ' + line for line in body.splitlines()) return self.make('def %(name)s(%(signature)s):\n' + ibody, evaldict, addsource, **attrs) def decorator(caller, func=None): """ decorator(caller) converts a caller function into a decorator; decorator(caller, func) decorates a function using a caller. """ if func is not None: # returns a decorated function evaldict = func.func_globals.copy() evaldict['_call_'] = caller evaldict['_func_'] = func return FunctionMaker.create( func, "return _call_(_func_, %(shortsignature)s)", evaldict, undecorated=func, __wrapped__=func) else: # returns a decorator if inspect.isclass(caller): name = caller.__name__.lower() callerfunc = get_init(caller) doc = 'decorator(%s) converts functions/generators into ' \ 'factories of %s objects' % (caller.__name__, caller.__name__) fun = getfullargspec(callerfunc).args[1] # second arg elif inspect.isfunction(caller): name = '_lambda_' if caller.__name__ == '' \ else caller.__name__ callerfunc = caller doc = caller.__doc__ fun = getfullargspec(callerfunc).args[0] # first arg else: # assume caller is an object with a __call__ method name = caller.__class__.__name__.lower() callerfunc = caller.__call__.im_func doc = caller.__call__.__doc__ fun = getfullargspec(callerfunc).args[1] # second arg evaldict = callerfunc.func_globals.copy() evaldict['_call_'] = caller evaldict['decorator'] = decorator return FunctionMaker.create( '%s(%s)' % (name, fun), 'return decorator(_call_, %s)' % fun, evaldict, undecorated=caller, __wrapped__=caller, doc=doc, module=caller.__module__) ######################### contextmanager ######################## def __call__(self, func): 'Context manager decorator' return FunctionMaker.create( func, "with _self_: return _func_(%(shortsignature)s)", dict(_self_=self, _func_=func), __wrapped__=func) try: # Python >= 3.2 from contextlib import _GeneratorContextManager ContextManager = type( 'ContextManager', (_GeneratorContextManager,), dict(__call__=__call__)) except ImportError: # Python >= 2.5 from contextlib import GeneratorContextManager def __init__(self, f, *a, **k): return GeneratorContextManager.__init__(self, f(*a, **k)) ContextManager = type( 'ContextManager', (GeneratorContextManager,), dict(__call__=__call__, __init__=__init__)) contextmanager = decorator(ContextManager) PK[#?yJ>J>site-packages/jsonpatch.pynu[# -*- coding: utf-8 -*- # # python-json-patch - An implementation of the JSON Patch format # https://github.com/stefankoegl/python-json-patch # # Copyright (c) 2011 Stefan Kögl # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. The name of the author may not be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # from __future__ import unicode_literals """ Apply JSON-Patches (RFC 6902) """ # Will be parsed by setup.py to determine package metadata __author__ = 'Stefan Kögl ' __version__ = '1.2' __website__ = 'https://github.com/stefankoegl/python-json-patch' __license__ = 'Modified BSD License' import copy import sys import operator import collections import json import jsonpointer if sys.version_info >= (3, 0): basestring = (bytes, str) JsonPointerException = jsonpointer.JsonPointerException class JsonPatchException(Exception): """Base Json Patch exception""" class JsonPatchConflict(JsonPatchException): """Raised if patch could not be applied due to conflict situation such as: - attempt to add object key then it already exists; - attempt to operate with nonexistence object key; - attempt to insert value to array at position beyond of it size; - etc. """ class JsonPatchTestFailed(JsonPatchException, AssertionError): """ A Test operation failed """ def multidict(ordered_pairs): """Convert duplicate keys values to lists.""" # read all values into lists d = collections.defaultdict(list) for k, v in ordered_pairs: d[k].append(v) # unpack lists that have only 1 item for k, v in d.items(): if len(v) == 1: d[k] = v[0] return dict(d) def get_loadjson(): """ adds the object_pairs_hook parameter to json.load when possible The "object_pairs_hook" parameter is used to handle duplicate keys when loading a JSON object. This parameter does not exist in Python 2.6. This methods returns an unmodified json.load for Python 2.6 and a partial function with object_pairs_hook set to multidict for Python versions that support the parameter. """ import inspect import functools argspec = inspect.getargspec(json.load) if 'object_pairs_hook' not in argspec.args: return json.load return functools.partial(json.load, object_pairs_hook=multidict) json.load = get_loadjson() def apply_patch(doc, patch, in_place=False): """Apply list of patches to specified json document. :param doc: Document object. :type doc: dict :param patch: JSON patch as list of dicts or raw JSON-encoded string. :type patch: list or str :param in_place: While :const:`True` patch will modify target document. By default patch will be applied to document copy. :type in_place: bool :return: Patched document object. :rtype: dict >>> doc = {'foo': 'bar'} >>> other = apply_patch(doc, [{'op': 'add', 'path': '/baz', 'value': 'qux'}]) >>> doc is not other True >>> other == {'foo': 'bar', 'baz': 'qux'} True >>> apply_patch(doc, [{'op': 'add', 'path': '/baz', 'value': 'qux'}], in_place=True) == {'foo': 'bar', 'baz': 'qux'} True >>> doc == other True """ if isinstance(patch, basestring): patch = JsonPatch.from_string(patch) else: patch = JsonPatch(patch) return patch.apply(doc, in_place) def make_patch(src, dst): """Generates patch by comparing of two document objects. Actually is a proxy to :meth:`JsonPatch.from_diff` method. :param src: Data source document object. :type src: dict :param dst: Data source document object. :type dst: dict >>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]} >>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]} >>> patch = make_patch(src, dst) >>> new = patch.apply(src) >>> new == dst True """ return JsonPatch.from_diff(src, dst) class JsonPatch(object): """A JSON Patch is a list of Patch Operations. >>> patch = JsonPatch([ ... {'op': 'add', 'path': '/foo', 'value': 'bar'}, ... {'op': 'add', 'path': '/baz', 'value': [1, 2, 3]}, ... {'op': 'remove', 'path': '/baz/1'}, ... {'op': 'test', 'path': '/baz', 'value': [1, 3]}, ... {'op': 'replace', 'path': '/baz/0', 'value': 42}, ... {'op': 'remove', 'path': '/baz/1'}, ... ]) >>> doc = {} >>> result = patch.apply(doc) >>> expected = {'foo': 'bar', 'baz': [42]} >>> result == expected True JsonPatch object is iterable, so you could easily access to each patch statement in loop: >>> lpatch = list(patch) >>> expected = {'op': 'add', 'path': '/foo', 'value': 'bar'} >>> lpatch[0] == expected True >>> lpatch == patch.patch True Also JsonPatch could be converted directly to :class:`bool` if it contains any operation statements: >>> bool(patch) True >>> bool(JsonPatch([])) False This behavior is very handy with :func:`make_patch` to write more readable code: >>> old = {'foo': 'bar', 'numbers': [1, 3, 4, 8]} >>> new = {'baz': 'qux', 'numbers': [1, 4, 7]} >>> patch = make_patch(old, new) >>> if patch: ... # document have changed, do something useful ... patch.apply(old) #doctest: +ELLIPSIS {...} """ def __init__(self, patch): self.patch = patch self.operations = { 'remove': RemoveOperation, 'add': AddOperation, 'replace': ReplaceOperation, 'move': MoveOperation, 'test': TestOperation, 'copy': CopyOperation, } def __str__(self): """str(self) -> self.to_string()""" return self.to_string() def __bool__(self): return bool(self.patch) __nonzero__ = __bool__ def __iter__(self): return iter(self.patch) def __hash__(self): return hash(tuple(self._ops)) def __eq__(self, other): if not isinstance(other, JsonPatch): return False return len(list(self._ops)) == len(list(other._ops)) and \ all(map(operator.eq, self._ops, other._ops)) @classmethod def from_string(cls, patch_str): """Creates JsonPatch instance from string source. :param patch_str: JSON patch as raw string. :type patch_str: str :return: :class:`JsonPatch` instance. """ patch = json.loads(patch_str) return cls(patch) @classmethod def from_diff(cls, src, dst): """Creates JsonPatch instance based on comparing of two document objects. Json patch would be created for `src` argument against `dst` one. :param src: Data source document object. :type src: dict :param dst: Data source document object. :type dst: dict :return: :class:`JsonPatch` instance. >>> src = {'foo': 'bar', 'numbers': [1, 3, 4, 8]} >>> dst = {'baz': 'qux', 'numbers': [1, 4, 7]} >>> patch = JsonPatch.from_diff(src, dst) >>> new = patch.apply(src) >>> new == dst True """ def compare_values(path, value, other): if value == other: return if isinstance(value, dict) and isinstance(other, dict): for operation in compare_dict(path, value, other): yield operation elif isinstance(value, list) and isinstance(other, list): for operation in compare_list(path, value, other): yield operation else: yield {'op': 'replace', 'path': '/'.join(path), 'value': other} def compare_dict(path, src, dst): for key in src: if key not in dst: yield {'op': 'remove', 'path': '/'.join(path + [key])} continue current = path + [key] for operation in compare_values(current, src[key], dst[key]): yield operation for key in dst: if key not in src: yield {'op': 'add', 'path': '/'.join(path + [key]), 'value': dst[key]} def compare_list(path, src, dst): lsrc, ldst = len(src), len(dst) for idx in range(min(lsrc, ldst)): current = path + [str(idx)] for operation in compare_values(current, src[idx], dst[idx]): yield operation if lsrc < ldst: for idx in range(lsrc, ldst): current = path + [str(idx)] yield {'op': 'add', 'path': '/'.join(current), 'value': dst[idx]} elif lsrc > ldst: for idx in reversed(range(ldst, lsrc)): yield {'op': 'remove', 'path': '/'.join(path + [str(idx)])} return cls(list(compare_dict([''], src, dst))) def to_string(self): """Returns patch set as JSON string.""" return json.dumps(self.patch) @property def _ops(self): return map(self._get_operation, self.patch) def apply(self, obj, in_place=False): """Applies the patch to given object. :param obj: Document object. :type obj: dict :param in_place: Tweaks way how patch would be applied - directly to specified `obj` or to his copy. :type in_place: bool :return: Modified `obj`. """ if not in_place: obj = copy.deepcopy(obj) for operation in self._ops: obj = operation.apply(obj) return obj def _get_operation(self, operation): if 'op' not in operation: raise JsonPatchException("Operation does not contain 'op' member") op = operation['op'] if not isinstance(op, basestring): raise JsonPatchException("Operation must be a string") if op not in self.operations: raise JsonPatchException("Unknown operation '%s'" % op) cls = self.operations[op] return cls(operation) class PatchOperation(object): """A single operation inside a JSON Patch.""" def __init__(self, operation): self.location = operation['path'] self.pointer = jsonpointer.JsonPointer(self.location) self.operation = operation def apply(self, obj): """Abstract method that applies patch operation to specified object.""" raise NotImplementedError('should implement patch operation.') def __hash__(self): return hash(frozenset(self.operation.items())) def __eq__(self, other): if not isinstance(other, PatchOperation): return False return self.operation == other.operation class RemoveOperation(PatchOperation): """Removes an object property or an array element.""" def apply(self, obj): subobj, part = self.pointer.to_last(obj) try: del subobj[part] except IndexError as ex: raise JsonPatchConflict(str(ex)) return obj class AddOperation(PatchOperation): """Adds an object property or an array element.""" def apply(self, obj): value = self.operation["value"] subobj, part = self.pointer.to_last(obj) # type is already checked in to_last(), so we assert here # for consistency assert isinstance(subobj, list) or isinstance(subobj, dict), \ "invalid document type %s" (type(doc),) if isinstance(subobj, list): if part == '-': subobj.append(value) elif part > len(subobj) or part < 0: raise JsonPatchConflict("can't insert outside of list") else: subobj.insert(part, value) elif isinstance(subobj, dict): if part is None: # we're replacing the root obj = value else: subobj[part] = value return obj class ReplaceOperation(PatchOperation): """Replaces an object property or an array element by new value.""" def apply(self, obj): value = self.operation["value"] subobj, part = self.pointer.to_last(obj) # type is already checked in to_last(), so we assert here # for consistency assert isinstance(subobj, list) or isinstance(subobj, dict), \ "invalid document type %s" (type(doc),) if part is None: return value if isinstance(subobj, list): if part > len(subobj) or part < 0: raise JsonPatchConflict("can't replace outside of list") elif isinstance(subobj, dict): if not part in subobj: raise JsonPatchConflict("can't replace non-existant object '%s'" "" % part) subobj[part] = value return obj class MoveOperation(PatchOperation): """Moves an object property or an array element to new location.""" def apply(self, obj): from_ptr = jsonpointer.JsonPointer(self.operation['from']) subobj, part = from_ptr.to_last(obj) value = subobj[part] if self.pointer.contains(from_ptr): raise JsonPatchException('Cannot move values into its own children') obj = RemoveOperation({'op': 'remove', 'path': self.operation['from']}).apply(obj) obj = AddOperation({'op': 'add', 'path': self.location, 'value': value}).apply(obj) return obj class TestOperation(PatchOperation): """Test value by specified location.""" def apply(self, obj): try: subobj, part = self.pointer.to_last(obj) if part is None: val = subobj else: val = self.pointer.walk(subobj, part) except JsonPointerException as ex: raise JsonPatchTestFailed(str(ex)) if 'value' in self.operation: value = self.operation['value'] if val != value: raise JsonPatchTestFailed('%s is not equal to tested value %s (types %s and %s)' % (val, value, type(val), type(value))) return obj class CopyOperation(PatchOperation): """ Copies an object property or an array element to a new location """ def apply(self, obj): from_ptr = jsonpointer.JsonPointer(self.operation['from']) subobj, part = from_ptr.to_last(obj) value = copy.deepcopy(subobj[part]) obj = AddOperation({'op': 'add', 'path': self.location, 'value': value}).apply(obj) return obj PK[.SWW,site-packages/configobj-4.7.2-py2.7.egg-infonu[Metadata-Version: 1.1 Name: configobj Version: 4.7.2 Summary: Config file reading, writing and validation. Home-page: http://www.voidspace.org.uk/python/configobj.html Author: Michael Foord & Nicola Larosa Author-email: fuzzyman@voidspace.org.uk License: UNKNOWN Download-URL: http://www.voidspace.org.uk/downloads/configobj-4.7.2.zip Description: **ConfigObj** is a simple but powerful config file reader and writer: an *ini file round tripper*. Its main feature is that it is very easy to use, with a straightforward programmer's interface and a simple syntax for config files. It has lots of other features though : * Nested sections (subsections), to any level * List values * Multiple line values * Full Unicode support * String interpolation (substitution) * Integrated with a powerful validation system - including automatic type checking/conversion - and allowing default values - repeated sections * All comments in the file are preserved * The order of keys/sections is preserved * Powerful ``unrepr`` mode for storing/retrieving Python data-types | Release 4.7.2 fixes several bugs in 4.7.1 | Release 4.7.1 fixes a bug with the deprecated options keyword in | 4.7.0. | Release 4.7.0 improves performance adds features for validation and | fixes some bugs. Keywords: config,ini,dictionary,application,admin,sysadmin,configuration,validation Platform: UNKNOWN Classifier: Development Status :: 6 - Mature Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.3 Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Operating System :: OS Independent Classifier: Topic :: Software Development :: Libraries Classifier: Topic :: Software Development :: Libraries :: Python Modules PK[4kUPUP site-packages/requests/utils.pycnu[ YЅ_c@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddl mZddlmZddlmZmZmZmZmZmZmZmZmZmZmZmZddlmZm Z dd l!m"Z"dd l#m$Z$efZ%d8Z&ej'Z(id d6dd6Z)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1e2dZ3dZ4dZ5dZ6dZ7dZ8dZ9d Z:e;d!d"Z<d#Z=d$Z>d%Z?d&Z@d'ZAd(ZBd)ZCd*ZDd+d,ZEd-ZFd.ZGd/jHd0ZIeId1ZJeId2ZKd3ZLd4ZMd5ZNd0d6ZOd7ZPdS(9s requests.utils ~~~~~~~~~~~~~~ This module provides utility functions that are used within Requests that are also useful for external consumption. iNi(t __version__(tcerts(tparse_http_list( tquoteturlparsetbyteststrt OrderedDicttunquotetis_py2t builtin_strt getproxiest proxy_bypasst urlunparset basestring(tRequestsCookieJartcookiejar_from_dict(tCaseInsensitiveDict(t InvalidURLs.netrct_netrciPthttpithttpscCs"t|dr|j}n|S(s/Returns an internal sequence dictionary update.titems(thasattrR(td((s2/usr/lib/python2.7/site-packages/requests/utils.pytdict_to_sequence+scCst|drt|St|dr/|jSt|drxy|j}Wntjk rdqxXtj|jSnt|drt|jSdS(Nt__len__tlentfilenotgetvalue( RRRtiotUnsupportedOperationtostfstattst_sizeR(toR((s2/usr/lib/python2.7/site-packages/requests/utils.pyt super_len4s c Cs2yddlm}m}d}x^tD]V}ytjjdj|}Wntk r_dSXtjj |r&|}Pq&q&W|dkrdSt |}|j j dd}yG||j |}|r|drdnd} || |dfSWn|tfk rnXWnttfk r-nXdS( s;Returns the Requests tuple auth for a given url from netrc.i(tnetrctNetrcParseErrors~/{0}Nt:iii(R%R&tNonet NETRC_FILESR tpatht expandusertformattKeyErrortexistsRtnetloctsplittauthenticatorstIOErrort ImportErrortAttributeError( turlR%R&t netrc_pathtftloctrithostRtlogin_i((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_netrc_authHs0    cCs[t|dd}|rWt|trW|ddkrW|ddkrWtjj|SdS(s0Tries to guess the filename of the given object.tnameitN(tgetattrR(t isinstanceRR R*tbasename(tobjR=((s2/usr/lib/python2.7/site-packages/requests/utils.pytguess_filenamevs%cCsD|dkrdSt|ttttfr:tdnt|S(sTake an object and test to see if it can be represented as a dictionary. Unless it can not be represented as such, return an OrderedDict, e.g., :: >>> from_key_val_list([('key', 'val')]) OrderedDict([('key', 'val')]) >>> from_key_val_list('string') ValueError: need more than 1 value to unpack >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) s+cannot encode objects that are not 2-tuplesN(R(RARRtbooltintt ValueErrorR(tvalue((s2/usr/lib/python2.7/site-packages/requests/utils.pytfrom_key_val_list~s  cCse|dkrdSt|ttttfr:tdnt|tjr[|j }nt |S(szTake an object and test to see if it can be represented as a dictionary. If it can be, return a list of tuples, e.g., :: >>> to_key_val_list([('key', 'val')]) [('key', 'val')] >>> to_key_val_list({'key': 'val'}) [('key', 'val')] >>> to_key_val_list('string') ValueError: cannot encode objects that are not 2-tuples. s+cannot encode objects that are not 2-tuplesN( R(RARRRERFRGt collectionstMappingRtlist(RH((s2/usr/lib/python2.7/site-packages/requests/utils.pytto_key_val_lists cCshg}x[t|D]M}|d |dko8dknrSt|dd!}n|j|qW|S(sParse lists as described by RFC 2068 Section 2. In particular, parse comma-separated lists where the elements of the list may include quoted-strings. A quoted-string could contain a comma. A non-quoted string could have quotes in the middle. Quotes are removed automatically after parsing. It basically works like :func:`parse_set_header` just that items may appear multiple times and case sensitivity is preserved. The return value is a standard :class:`list`: >>> parse_list_header('token, "quoted value"') ['token', 'quoted value'] To create a header from the :class:`list` again, use the :func:`dump_header` function. :param value: a string with a list header. :return: :class:`list` iit"(t_parse_list_headertunquote_header_valuetappend(RHtresulttitem((s2/usr/lib/python2.7/site-packages/requests/utils.pytparse_list_headers $cCsi}xt|D]~}d|kr5d||>> d = parse_dict_header('foo="is a fish", bar="as well"') >>> type(d) is dict True >>> sorted(d.items()) [('bar', 'as well'), ('foo', 'is a fish')] If there is no value for a key it will be `None`: >>> parse_dict_header('key_without_value') {'key_without_value': None} To create a header from the :class:`dict` again, use the :func:`dump_header` function. :param value: a string with a dict header. :return: :class:`dict` t=iiRNN(ROR(R0RP(RHRRRSR=((s2/usr/lib/python2.7/site-packages/requests/utils.pytparse_dict_headers  $cCsq|rm|d|dko%dknrm|dd!}| sN|d dkrm|jddjddSn|S( sUnquotes a header value. (Reversal of :func:`quote_header_value`). This does not use the real unquoting but what browsers are actually using for quoting. :param value: the header value to unquote. iiRNiis\\s\s\"(treplace(RHt is_filename((s2/usr/lib/python2.7/site-packages/requests/utils.pyRPs * cCs+i}x|D]}|j||j]tflagss+]s$^<\?xml.*?encoding=["\']*(.+?)["\'>](twarningstwarntDeprecationWarningtretcompiletItfindall(tcontentt charset_ret pragma_retxml_re((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_encodings_from_content"scCs_|jd}|sdStj|\}}d|krK|djdSd|kr[dSdS(smReturns encodings from given HTTP Header Dict. :param headers: dictionary to extract encoding from. s content-typetcharsets'"ttexts ISO-8859-1N(tgetR(tcgit parse_headertstrip(theaderst content_typetparams((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_encoding_from_headers6s  ccs|jdkr)x|D] }|VqWdStj|jdd}x+|D]#}|j|}|rK|VqKqKW|jddt}|r|VndS(sStream decodes a iterator.NterrorsRWttfinal(tencodingR(tcodecstgetincrementaldecodertdecodetTrue(titeratortrRStdecodertchunktrv((s2/usr/lib/python2.7/site-packages/requests/utils.pytstream_decode_response_unicodeJs    ccs=d}x0|t|kr8||||!V||7}q WdS(s Iterate over slices of a string.iN(R(tstringt slice_lengthtpos((s2/usr/lib/python2.7/site-packages/requests/utils.pyt iter_slices\scCstjdtg}t|j}|rcyt|j|SWqctk r_|j|qcXnyt|j|ddSWnt k r|jSXdS(sReturns the requested content back in unicode. :param r: Response object to get unicode content from. Tried: 1. charset from content-type 2. fall back and replace all unicode characters sIn requests 3.0, get_unicode_from_response will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)RwRWN( RaRbRcRvRsRRht UnicodeErrorRQt TypeError(Rttried_encodingsRz((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_unicode_from_responseds   t4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzs0123456789-._~cCs|jd}xtdt|D]}||dd!}t|dkr|jrytt|d}Wn!tk rtd|nX|tkr|||d||dA}tjtjd|S(st Converts mask from /xx format to xxx.xxx.xxx.xxx Example: if mask is 24 function returns 255.255.255.0 lii s>I(Rt inet_ntoaRtpack(tmaskR((s2/usr/lib/python2.7/site-packages/requests/utils.pyRscCs-ytj|Wntjk r(tSXtS(N(RRterrortFalseR~(t string_ip((s2/usr/lib/python2.7/site-packages/requests/utils.pytis_ipv4_addresss cCs|jddkryt|jdd}Wntk rFtSX|dks_|dkrctSytj|jddWqtjk rtSXntStS(s9Very simple check of the cidr format in no_proxy variableRii i( tcountRFR0RGRRRRR~(tstring_networkR((s2/usr/lib/python2.7/site-packages/requests/utils.pyt is_valid_cidrs cCsd}|d}t|j}|r|jddjd}|jdd}t|rxs|D](}t|rkt||rtSqkqkWqx@|D]5}|j|s|jddj|rtSqWnyt |}Wn t t j fk rt }nX|rtSt S(s: Returns whether we should bypass proxies or not. cSs(tjj|p'tjj|jS(N(R tenvironRotupper(tk((s2/usr/lib/python2.7/site-packages/requests/utils.pytstno_proxyt Rxt,R'i(RR/RWR0RRRR~tendswithR RRtgaierrorR(R5t get_proxyRR/Rtproxy_ipR:tbypass((s2/usr/lib/python2.7/site-packages/requests/utils.pytshould_bypass_proxiess*      +  cCst|riStSdS(s%Return a dict of environment proxies.N(RR (R5((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_environ_proxiess spython-requestscCs7tj}|dkr'tj}n|dkrdtjjtjjtjjf}tjjdkrdj |tjjg}qn<|dkrtj}n!|dkrtj}nd}ytj }tj }Wnt k rd}d}nXd j d |t fd ||fd ||fgS( s4Return a string representing the default user agent.tCPythontPyPys%s.%s.%sRyRxtJythont IronPythontUnknownRs%s/%s(tplatformtpython_implementationtpython_versiontsystpypy_version_infotmajortminortmicrot releaselevelRtsystemtreleaseR2R(R=t_implementationt_implementation_versiontp_systemt p_release((s2/usr/lib/python2.7/site-packages/requests/utils.pytdefault_user_agents.     !      cCs2titd6djd d6dd6dd 6S( Ns User-Agents, tgziptdeflatesAccept-Encodings*/*tAccepts keep-alivet Connection(RR(RRR(((s2/usr/lib/python2.7/site-packages/requests/utils.pytdefault_headers=s  c Csg}d}xtjd|D]}y|jdd\}}Wntk ra|d}}nXi}|jd|d; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" s '"s, * '"R5RU(RdR0RGRrRQ( RHtlinkst replace_charstvalR5Rutlinktparamtkey((s2/usr/lib/python2.7/site-packages/requests/utils.pytparse_header_linksFs"   ttasciiiicCs|d }|tjtjfkr&dS|d tjkr=dS|d tjtjfkr]dS|jt}|dkr|dS|dkr|dddtkrd S|d ddtkrd Sn|dkr|d t krd S|d t krd SndS(Nisutf-32is utf-8-sigisutf-16isutf-8s utf-16-beis utf-16-les utf-32-bes utf-32-le( R{t BOM_UTF32_LEtBOM32_BEtBOM_UTF8t BOM_UTF16_LEt BOM_UTF16_BERt_nullt_null2t_null3R((tdatatsamplet nullcount((s2/usr/lib/python2.7/site-packages/requests/utils.pytguess_json_utfns*    cCsSt||\}}}}}}|s7||}}nt||||||fS(sGiven a URL that may or may not have a scheme, prepend the given scheme. Does not replace a present scheme with the one provided as an argument.(RR (R5t new_schemetschemeR/R*Rutquerytfragment((s2/usr/lib/python2.7/site-packages/requests/utils.pytprepend_scheme_if_neededs!cCsRt|}y"t|jt|jf}Wnttfk rMd}nX|S(s_Given a url with authentication components, extract them into a tuple of username,password.Rx(RxRx(RRtusernametpasswordR4R(R5tparsedtauth((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_auth_from_urls  " cCsId}t|tr|}n'tr6|j|}n|j|}|S(s Given a string object, regardless of type, returns a representation of that string in the native string type, encoding and decoding where necessary. This assumes ASCII unless told otherwise. N(R(RAR R tencodeR}(RRztout((s2/usr/lib/python2.7/site-packages/requests/utils.pytto_native_strings cCsft|\}}}}}}|s4||}}n|jddd}t|||||dfS(sE Given a url remove the fragment and the authentication part t@iiRx(RtrsplitR (R5RR/R*RuRR((s2/usr/lib/python2.7/site-packages/requests/utils.pyt urldefragauths (s.netrcs_netrc(Qt__doc__RpR{RJRR RRdRRRRaRxRRtcompatRRORRRRRRR R R R R RtcookiesRRt structuresRt exceptionsRt_hush_pyflakesR)twheretDEFAULT_CA_BUNDLE_PATHt DEFAULT_PORTSRR$R<RDRIRMRTRVRRPR\R_RlRvRRRt frozensetRRRRRRRRRRRRRRRRRRRRR(((s2/usr/lib/python2.7/site-packages/requests/utils.pyt sx           R    .     "       $      -   #     PK[f͟Csite-packages/requests/certs.pynu[#!/usr/bin/env python # -*- coding: utf-8 -*- """ certs.py ~~~~~~~~ This module returns the preferred default CA certificate bundle. If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. We return "/etc/pki/tls/certs/ca-bundle.crt" provided by the ca-certificates package. """ try: from certifi import where except ImportError: def where(): """ Don't use the certs bundled with requests, use ca-certificates. """ return "/etc/pki/tls/certs/ca-bundle.crt" if __name__ == '__main__': print(where()) PK[NP=P=#site-packages/requests/adapters.pycnu[ YЅ_c@sdZddlZddlmZddlmZmZddlmZddl m Z ddl m Z dd lmZmZdd lmZmZmZmZmZdd lmZdd lmZdd lmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z#ddlm$Z$ddl%m&Z&ddl'm(Z(m)Z)m*Z*m"Z"mZm+Z+ddl,m-Z-e.Z/dZ0dZ1de2fdYZ3de3fdYZ4dS(s requests.adapters ~~~~~~~~~~~~~~~~~ This module contains the transport adapters that Requests uses to define and maintain connections. iNi(tResponse(t PoolManagertproxy_from_url(t HTTPResponse(tTimeout(tRetry(turlparset basestring(tDEFAULT_CA_BUNDLE_PATHtget_encoding_from_headerstprepend_scheme_if_neededtget_auth_from_urlt urldefragauth(tCaseInsensitiveDict(tConnectTimeoutError(t HTTPError(t MaxRetryError(t ProxyError(t ProtocolError(tReadTimeoutError(tSSLError(t ResponseError(textract_cookies_to_jar(tConnectionErrortConnectTimeoutt ReadTimeoutRRt RetryError(t_basic_auth_stri it BaseAdaptercBs)eZdZdZdZdZRS(sThe Base Transport AdaptercCstt|jdS(N(tsuperRt__init__(tself((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR+scCs tdS(N(tNotImplementedError(R((s5/usr/lib/python2.7/site-packages/requests/adapters.pytsend.scCs tdS(N(R (R((s5/usr/lib/python2.7/site-packages/requests/adapters.pytclose1s(t__name__t __module__t__doc__RR!R"(((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR(s  t HTTPAdaptercBseZdZdddddgZeeeedZdZdZ ed Z d Z d Z d Z dd ZdZdZdZdZededddZRS(sThe built-in HTTP Adapter for urllib3. Provides a general-case interface for Requests sessions to contact HTTP and HTTPS urls by implementing the Transport Adapter interface. This class will usually be created by the :class:`Session ` class under the covers. :param pool_connections: The number of urllib3 connection pools to cache. :param pool_maxsize: The maximum number of connections to save in the pool. :param int max_retries: The maximum number of retries each connection should attempt. Note, this applies only to failed DNS lookups, socket connections and connection timeouts, never to requests where data has made it to the server. By default, Requests does not retry failed connections. If you need granular control over the conditions under which we retry a request, import urllib3's ``Retry`` class and pass that instead. :param pool_block: Whether the connection pool should block for connections. Usage:: >>> import requests >>> s = requests.Session() >>> a = requests.adapters.HTTPAdapter(max_retries=3) >>> s.mount('http://', a) t max_retriestconfigt_pool_connectionst _pool_maxsizet _pool_blockcCs|tkr$tddt|_ntj||_i|_i|_tt|j ||_ ||_ ||_ |j ||d|dS(Nitreadtblock(tDEFAULT_RETRIESRtFalseR'tfrom_intR(t proxy_managerRR&RR)R*R+tinit_poolmanager(Rtpool_connectionst pool_maxsizeR't pool_block((s5/usr/lib/python2.7/site-packages/requests/adapters.pyRRs      cstfdjDS(Nc3s'|]}|t|dfVqdS(N(tgetattrtNone(t.0tattr(R(s5/usr/lib/python2.7/site-packages/requests/adapters.pys es(tdictt __attrs__(R((Rs5/usr/lib/python2.7/site-packages/requests/adapters.pyt __getstate__dscCsbi|_i|_x*|jD]\}}t|||qW|j|j|jd|jdS(NR-(R1R(titemstsetattrR2R)R*R+(RtstateR9tvalue((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt __setstate__hs   c KsF||_||_||_td|d|d|dt||_dS(sInitializes a urllib3 PoolManager. This method should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param connections: The number of urllib3 connection pools to cache. :param maxsize: The maximum number of connections to save in the pool. :param block: Block when no free connections are available. :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. t num_poolstmaxsizeR-tstrictN(R)R*R+RtTruet poolmanager(Rt connectionsRCR-t pool_kwargs((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR2ts   c Ksc||jkrX|j|}t|d|d|jd|jd|j||j|`. :param proxy: The proxy to return a urllib3 ProxyManager for. :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. :returns: ProxyManager t proxy_headersRBRCR-(R1RIRR)R*R+(Rtproxyt proxy_kwargsRI((s5/usr/lib/python2.7/site-packages/requests/adapters.pytproxy_manager_fors   cCs|jjdro|rod}|tk r6|}n|sEt}n|sZtdnd|_||_nd|_d|_|rt|t s|d|_ |d|_ q||_ ndS(sVerify a SSL certificate. This method should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param conn: The urllib3 connection object associated with the cert. :param url: The requested URL. :param verify: Whether we should actually verify the certificate. :param cert: The SSL certificate to verify. thttpss4Could not find a suitable SSL CA certificate bundle.t CERT_REQUIREDt CERT_NONEiiN( tlowert startswithR7RERt Exceptiont cert_reqstca_certst isinstanceRt cert_filetkey_file(Rtconnturltverifytcerttcert_loc((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt cert_verifys"         cCst}t|dd|_tt|di|_t|j|_||_|jj |_ t |j t r|j j d|_ n |j |_ t|j||||_||_|S(sBuilds a :class:`Response ` object from a urllib3 response. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter ` :param req: The :class:`PreparedRequest ` used to generate the response. :param resp: The urllib3 response object. tstatustheaderssutf-8N(RR6R7t status_codeR R_R tencodingtrawtreasonRURYtbytestdecodeRtcookiestrequestt connection(Rtreqtresptresponse((s5/usr/lib/python2.7/site-packages/requests/adapters.pytbuild_responses     cCs|p i}|jt|jj}|r`t|d}|j|}|j|}n*t|}|j}|jj|}|S(seReturns a urllib3 connection for the given URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param url: The URL to connect to. :param proxies: (optional) A Requests-style dictionary of proxies used on this request. thttp( tgetRRPtschemeR RLtconnection_from_urltgeturlRF(RRYtproxiesRJR1RXtparsed((s5/usr/lib/python2.7/site-packages/requests/adapters.pytget_connections   cCs|jjdS(sDisposes of any internal state. Currently, this just closes the PoolManager, which closes pooled connections. N(RFtclear(R((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR"scCs^|p i}t|jj}|j|}|rQ|dkrQt|j}n |j}|S(sObtain the url to use when making the final request. If the message is being sent through a HTTP proxy, the full URL has to be used. Otherwise, we should only use the path portion of the URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param request: The :class:`PreparedRequest ` being sent. :param proxies: A dictionary of schemes to proxy URLs. RM(RRYRoRnR tpath_url(RRgRrRoRJRY((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt request_urls  cKsdS(s"Add any headers needed by the connection. As of v2.0 this does nothing by default, but is left for overriding by users that subclass the :class:`HTTPAdapter `. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param request: The :class:`PreparedRequest ` to add headers to. :param kwargs: The keyword arguments from the call to send(). N((RRgtkwargs((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt add_headerss cCs>i}t|\}}|r:|r:t|||d`. :param proxies: The url of the proxy being used for this request. :param kwargs: Optional additional keyword arguments. sProxy-Authorization(R R(RRJR_tusernametpassword((s5/usr/lib/python2.7/site-packages/requests/adapters.pyRI-s  cCs|j|j|}|j||j|||j||}|j||jdkphd|jk } t|t ry%|\} } t d| d| }Wqt k r} dj |} t | qXnt d|d|}y| sI|j d|jd|d|jd|jd td td td td |jd| }nIt|drd|j}n|jd|}y|j|j|dtx-|jjD]\}}|j||qW|jx^|jD]S}|jtt|djd|jd|j||jdqW|jd|j}tj|d|d|d td t}Wn|j nX|j!|Wn!t"t#j$fk r} t%| d|nt&k r5} t| j't(rt)| d|nt| j't*r t+| d|nt%| d|nt,k rS} t-| ndt.t/fk r} t| t.rt0| d|qt| t1rt2| d|qnX|j3||S(sSends PreparedRequest object. Returns Response object. :param request: The :class:`PreparedRequest ` being sent. :param stream: (optional) Whether to stream the request content. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param verify: (optional) Whether to verify SSL certificates. :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. sContent-LengthtconnectR,ssInvalid timeout {0}. Pass a (connect, read) timeout tuple, or a single float to set both timeouts to the same valuetmethodRYtbodyR_tredirecttassert_same_hosttpreload_contenttdecode_contenttretriesttimeoutt proxy_pooltskip_accept_encodingisutf-8s s0 tpoolRhRgN(4RtRYR]RwRyR~R7R_RUttuplet TimeoutSaucet ValueErrortformatturlopenR}R/R'thasattrRt _get_connt putrequestRER=t putheadert endheadersR!thextlentencodet getresponseRt from_httplibR"t _put_connRtsocketterrorRRRcRRRRt _ProxyErrorRt _SSLErrort _HTTPErrorRRRRl(RRgtstreamRRZR[RrRXRYtchunkedR|R,teterrRjtlow_conntheaderR@titr((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR!Cs            &      N(R#R$R%R;tDEFAULT_POOLSIZER.tDEFAULT_POOLBLOCKRR<RAR2RLR]RlR7RtR"RwRyRIR/RER!(((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR&5s$       % $     (5R%RtmodelsRturllib3.poolmanagerRRturllib3.responseRt urllib3.utilRRturllib3.util.retryRtcompatRRtutilsRR R R R t structuresR turllib3.exceptionsRRRRRRRRRRRRfRt exceptionsRRRRtauthRR/RRR.tobjectRR&(((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt s2 (. PK[} #site-packages/requests/__init__.pycnu[ ZЅ_c@sdZdZdZdZdZdZdZyddlmZej Wne k r[nXd d l m Z d d l mZmZmZd d lmZmZmZmZmZmZmZmZd d lmZmZd dlmZd dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%d dl m&Z&ddl'Z'yddl'm(Z(Wn*e k rrde'j)fdYZ(nXe'j*e+j,e(dS(s requests HTTP library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET usage: >>> import requests >>> r = requests.get('https://www.python.org') >>> r.status_code 200 >>> 'Python is a programming language' in r.content True ... or POST: >>> payload = dict(key1='value1', key2='value2') >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... } The other HTTP methods are supported - see `requests.api`. Full documentation is at . :copyright: (c) 2015 by Kenneth Reitz. :license: Apache 2.0, see LICENSE for more details. trequestss2.6.0is Kenneth Reitzs Apache 2.0sCopyright 2015 Kenneth Reitzi(t pyopenssli(tutils(tRequesttResponsetPreparedRequest(trequesttgettheadtposttpatchtputtdeletetoptions(tsessiontSession(tcodes(tRequestExceptiontTimeoutt URLRequiredtTooManyRedirectst HTTPErrortConnectionError(tpackagesN(t NullHandlerRcBseZdZRS(cCsdS(N((tselftrecord((s5/usr/lib/python2.7/site-packages/requests/__init__.pytemitKs(t__name__t __module__R(((s5/usr/lib/python2.7/site-packages/requests/__init__.pyRJs(-t__doc__t __title__t __version__t __build__t __author__t __license__t __copyright__turllib3.contribRtinject_into_urllib3t ImportErrortRtmodelsRRRtapiRRRR R R R R tsessionsRRt status_codesRt exceptionsRRRRRRRtloggingRtHandlert getLoggerRt addHandler(((s5/usr/lib/python2.7/site-packages/requests/__init__.pyt*s0 :.  PK[߬O d d"site-packages/requests/sessions.pynu[# -*- coding: utf-8 -*- """ requests.session ~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). """ import os from collections import Mapping from datetime import datetime from .auth import _basic_auth_str from .compat import cookielib, OrderedDict, urljoin, urlparse from .cookies import ( cookiejar_from_dict, extract_cookies_to_jar, RequestsCookieJar, merge_cookies) from .models import Request, PreparedRequest, DEFAULT_REDIRECT_LIMIT from .hooks import default_hooks, dispatch_hook from .utils import to_key_val_list, default_headers, to_native_string, DEFAULT_PORTS from .exceptions import ( TooManyRedirects, InvalidSchema, ChunkedEncodingError, ContentDecodingError) from urllib3._collections import RecentlyUsedContainer from .structures import CaseInsensitiveDict from .adapters import HTTPAdapter from .utils import ( requote_uri, get_environ_proxies, get_netrc_auth, should_bypass_proxies, get_auth_from_url ) from .status_codes import codes # formerly defined here, reexposed here for backward compatibility from .models import REDIRECT_STATI REDIRECT_CACHE_SIZE = 1000 def merge_setting(request_setting, session_setting, dict_class=OrderedDict): """ Determines appropriate setting for a given request, taking into account the explicit setting on that request, and the setting in the session. If a setting is a dictionary, they will be merged together using `dict_class` """ if session_setting is None: return request_setting if request_setting is None: return session_setting # Bypass if not a dictionary (e.g. verify) if not ( isinstance(session_setting, Mapping) and isinstance(request_setting, Mapping) ): return request_setting merged_setting = dict_class(to_key_val_list(session_setting)) merged_setting.update(to_key_val_list(request_setting)) # Remove keys that are set to None. for (k, v) in request_setting.items(): if v is None: del merged_setting[k] merged_setting = dict((k, v) for (k, v) in merged_setting.items() if v is not None) return merged_setting def merge_hooks(request_hooks, session_hooks, dict_class=OrderedDict): """ Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. """ if session_hooks is None or session_hooks.get('response') == []: return request_hooks if request_hooks is None or request_hooks.get('response') == []: return session_hooks return merge_setting(request_hooks, session_hooks, dict_class) class SessionRedirectMixin(object): def should_strip_auth(self, old_url, new_url): """Decide whether Authorization header should be removed when redirecting""" old_parsed = urlparse(old_url) new_parsed = urlparse(new_url) if old_parsed.hostname != new_parsed.hostname: return True # Special case: allow http -> https redirect when using the standard # ports. This isn't specified by RFC 7235, but is kept to avoid # breaking backwards compatibility with older versions of requests # that allowed any redirects on the same host. if (old_parsed.scheme == 'http' and old_parsed.port in (80, None) and new_parsed.scheme == 'https' and new_parsed.port in (443, None)): return False # Handle default port usage corresponding to scheme. changed_port = old_parsed.port != new_parsed.port changed_scheme = old_parsed.scheme != new_parsed.scheme default_port = (DEFAULT_PORTS.get(old_parsed.scheme, None), None) if (not changed_scheme and old_parsed.port in default_port and new_parsed.port in default_port): return False # Standard case: root URI must match return changed_port or changed_scheme def resolve_redirects(self, resp, req, stream=False, timeout=None, verify=True, cert=None, proxies=None): """Receives a Response. Returns a generator of Responses.""" i = 0 hist = [] # keep track of history while resp.is_redirect: prepared_request = req.copy() if i > 0: # Update history and keep track of redirects. hist.append(resp) new_hist = list(hist) resp.history = new_hist try: resp.content # Consume socket so it can be released except (ChunkedEncodingError, ContentDecodingError, RuntimeError): resp.raw.read(decode_content=False) if i >= self.max_redirects: raise TooManyRedirects('Exceeded %s redirects.' % self.max_redirects) # Release the connection back into the pool. resp.close() url = resp.headers['location'] method = req.method # Handle redirection without scheme (see: RFC 1808 Section 4) if url.startswith('//'): parsed_rurl = urlparse(resp.url) url = '%s:%s' % (parsed_rurl.scheme, url) # The scheme should be lower case... parsed = urlparse(url) url = parsed.geturl() # Facilitate relative 'location' headers, as allowed by RFC 7231. # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') # Compliant with RFC3986, we percent encode the url. if not parsed.netloc: url = urljoin(resp.url, requote_uri(url)) else: url = requote_uri(url) prepared_request.url = to_native_string(url) # Cache the url, unless it redirects to itself. if resp.is_permanent_redirect and req.url != prepared_request.url: self.redirect_cache[req.url] = prepared_request.url # http://tools.ietf.org/html/rfc7231#section-6.4.4 if (resp.status_code == codes.see_other and method != 'HEAD'): method = 'GET' # Do what the browsers do, despite standards... # First, turn 302s into GETs. if resp.status_code == codes.found and method != 'HEAD': method = 'GET' # Second, if a POST is responded to with a 301, turn it into a GET. # This bizarre behaviour is explained in Issue 1704. if resp.status_code == codes.moved and method == 'POST': method = 'GET' prepared_request.method = method # https://github.com/kennethreitz/requests/issues/1084 if resp.status_code not in (codes.temporary_redirect, codes.permanent_redirect): if 'Content-Length' in prepared_request.headers: del prepared_request.headers['Content-Length'] prepared_request.body = None headers = prepared_request.headers try: del headers['Cookie'] except KeyError: pass # Extract any cookies sent on the response to the cookiejar # in the new request. Because we've mutated our copied prepared # request, use the old one that we haven't yet touched. extract_cookies_to_jar(prepared_request._cookies, req, resp.raw) prepared_request._cookies.update(self.cookies) prepared_request.prepare_cookies(prepared_request._cookies) # Rebuild auth and proxy information. proxies = self.rebuild_proxies(prepared_request, proxies) self.rebuild_auth(prepared_request, resp) # Override the original request. req = prepared_request resp = self.send( req, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies, allow_redirects=False, ) extract_cookies_to_jar(self.cookies, prepared_request, resp.raw) i += 1 yield resp def rebuild_auth(self, prepared_request, response): """ When being redirected we may want to strip authentication from the request to avoid leaking credentials. This method intelligently removes and reapplies authentication where possible to avoid credential loss. """ headers = prepared_request.headers url = prepared_request.url if 'Authorization' in headers and self.should_strip_auth(response.request.url, url): # If we get redirected to a new host, we should strip out any # authentication headers. del headers['Authorization'] # .netrc might have more auth for us on our new host. new_auth = get_netrc_auth(url) if self.trust_env else None if new_auth is not None: prepared_request.prepare_auth(new_auth) return def rebuild_proxies(self, prepared_request, proxies): """ This method re-evaluates the proxy configuration by considering the environment variables. If we are redirected to a URL covered by NO_PROXY, we strip the proxy configuration. Otherwise, we set missing proxy keys for this URL (in case they were stripped by a previous redirect). This method also replaces the Proxy-Authorization header where necessary. """ headers = prepared_request.headers url = prepared_request.url scheme = urlparse(url).scheme new_proxies = proxies.copy() if proxies is not None else {} if self.trust_env and not should_bypass_proxies(url): environ_proxies = get_environ_proxies(url) proxy = environ_proxies.get(scheme) if proxy: new_proxies.setdefault(scheme, environ_proxies[scheme]) if 'Proxy-Authorization' in headers: del headers['Proxy-Authorization'] try: username, password = get_auth_from_url(new_proxies[scheme]) except KeyError: username, password = None, None if username and password: headers['Proxy-Authorization'] = _basic_auth_str(username, password) return new_proxies class Session(SessionRedirectMixin): """A Requests session. Provides cookie persistence, connection-pooling, and configuration. Basic Usage:: >>> import requests >>> s = requests.Session() >>> s.get('http://httpbin.org/get') 200 """ __attrs__ = [ 'headers', 'cookies', 'auth', 'proxies', 'hooks', 'params', 'verify', 'cert', 'prefetch', 'adapters', 'stream', 'trust_env', 'max_redirects', ] def __init__(self): #: A case-insensitive dictionary of headers to be sent on each #: :class:`Request ` sent from this #: :class:`Session `. self.headers = default_headers() #: Default Authentication tuple or object to attach to #: :class:`Request `. self.auth = None #: Dictionary mapping protocol to the URL of the proxy (e.g. #: {'http': 'foo.bar:3128'}) to be used on each #: :class:`Request `. self.proxies = {} #: Event-handling hooks. self.hooks = default_hooks() #: Dictionary of querystring data to attach to each #: :class:`Request `. The dictionary values may be lists for #: representing multivalued query parameters. self.params = {} #: Stream response content default. self.stream = False #: SSL Verification default. self.verify = True #: SSL certificate default. self.cert = None #: Maximum number of redirects allowed. If the request exceeds this #: limit, a :class:`TooManyRedirects` exception is raised. self.max_redirects = DEFAULT_REDIRECT_LIMIT #: Should we trust the environment? self.trust_env = True #: A CookieJar containing all currently outstanding cookies set on this #: session. By default it is a #: :class:`RequestsCookieJar `, but #: may be any other ``cookielib.CookieJar`` compatible object. self.cookies = cookiejar_from_dict({}) # Default connection adapters. self.adapters = OrderedDict() self.mount('https://', HTTPAdapter()) self.mount('http://', HTTPAdapter()) # Only store 1000 redirects to prevent using infinite memory self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) def __enter__(self): return self def __exit__(self, *args): self.close() def prepare_request(self, request): """Constructs a :class:`PreparedRequest ` for transmission and returns it. The :class:`PreparedRequest` has settings merged from the :class:`Request ` instance and those of the :class:`Session`. :param request: :class:`Request` instance to prepare with this session's settings. """ cookies = request.cookies or {} # Bootstrap CookieJar. if not isinstance(cookies, cookielib.CookieJar): cookies = cookiejar_from_dict(cookies) # Merge with session cookies merged_cookies = merge_cookies( merge_cookies(RequestsCookieJar(), self.cookies), cookies) # Set environment's basic authentication if not explicitly set. auth = request.auth if self.trust_env and not auth and not self.auth: auth = get_netrc_auth(request.url) p = PreparedRequest() p.prepare( method=request.method.upper(), url=request.url, files=request.files, data=request.data, json=request.json, headers=merge_setting(request.headers, self.headers, dict_class=CaseInsensitiveDict), params=merge_setting(request.params, self.params), auth=merge_setting(auth, self.auth), cookies=merged_cookies, hooks=merge_hooks(request.hooks, self.hooks), ) return p def request(self, method, url, params=None, data=None, headers=None, cookies=None, files=None, auth=None, timeout=None, allow_redirects=True, proxies=None, hooks=None, stream=None, verify=None, cert=None, json=None): """Constructs a :class:`Request `, prepares it and sends it. Returns :class:`Response ` object. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param allow_redirects: (optional) Set to True by default. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. """ method = to_native_string(method) # Create the Request. req = Request( method = method.upper(), url = url, headers = headers, files = files, data = data or {}, json = json, params = params or {}, auth = auth, cookies = cookies, hooks = hooks, ) prep = self.prepare_request(req) proxies = proxies or {} settings = self.merge_environment_settings( prep.url, proxies, stream, verify, cert ) # Send the request. send_kwargs = { 'timeout': timeout, 'allow_redirects': allow_redirects, } send_kwargs.update(settings) resp = self.send(prep, **send_kwargs) return resp def get(self, url, **kwargs): """Sends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. """ kwargs.setdefault('allow_redirects', True) return self.request('GET', url, **kwargs) def options(self, url, **kwargs): """Sends a OPTIONS request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. """ kwargs.setdefault('allow_redirects', True) return self.request('OPTIONS', url, **kwargs) def head(self, url, **kwargs): """Sends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. """ kwargs.setdefault('allow_redirects', False) return self.request('HEAD', url, **kwargs) def post(self, url, data=None, json=None, **kwargs): """Sends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. """ return self.request('POST', url, data=data, json=json, **kwargs) def put(self, url, data=None, **kwargs): """Sends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. """ return self.request('PUT', url, data=data, **kwargs) def patch(self, url, data=None, **kwargs): """Sends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. """ return self.request('PATCH', url, data=data, **kwargs) def delete(self, url, **kwargs): """Sends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. """ return self.request('DELETE', url, **kwargs) def send(self, request, **kwargs): """Send a given PreparedRequest.""" # Set defaults that the hooks can utilize to ensure they always have # the correct parameters to reproduce the previous request. kwargs.setdefault('stream', self.stream) kwargs.setdefault('verify', self.verify) kwargs.setdefault('cert', self.cert) kwargs.setdefault('proxies', self.proxies) # It's possible that users might accidentally send a Request object. # Guard against that specific failure case. if not isinstance(request, PreparedRequest): raise ValueError('You can only send PreparedRequests.') checked_urls = set() while request.url in self.redirect_cache: checked_urls.add(request.url) new_url = self.redirect_cache.get(request.url) if new_url in checked_urls: break request.url = new_url # Set up variables needed for resolve_redirects and dispatching of hooks allow_redirects = kwargs.pop('allow_redirects', True) stream = kwargs.get('stream') timeout = kwargs.get('timeout') verify = kwargs.get('verify') cert = kwargs.get('cert') proxies = kwargs.get('proxies') hooks = request.hooks # Get the appropriate adapter to use adapter = self.get_adapter(url=request.url) # Start time (approximately) of the request start = datetime.utcnow() # Send the request r = adapter.send(request, **kwargs) # Total elapsed time of the request (approximately) r.elapsed = datetime.utcnow() - start # Response manipulation hooks r = dispatch_hook('response', hooks, r, **kwargs) # Persist cookies if r.history: # If the hooks create history then we want those cookies too for resp in r.history: extract_cookies_to_jar(self.cookies, resp.request, resp.raw) extract_cookies_to_jar(self.cookies, request, r.raw) # Redirect resolving generator. gen = self.resolve_redirects(r, request, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies) # Resolve redirects if allowed. history = [resp for resp in gen] if allow_redirects else [] # Shuffle things around if there's history. if history: # Insert the first (original) request at the start history.insert(0, r) # Get the last request made r = history.pop() r.history = history if not stream: r.content return r def merge_environment_settings(self, url, proxies, stream, verify, cert): """Check the environment and merge it with some settings.""" # Gather clues from the surrounding environment. if self.trust_env: # Set environment's proxies. env_proxies = get_environ_proxies(url) or {} for (k, v) in env_proxies.items(): proxies.setdefault(k, v) # Look for requests environment configuration and be compatible # with cURL. if verify is True or verify is None: verify = (os.environ.get('REQUESTS_CA_BUNDLE') or os.environ.get('CURL_CA_BUNDLE')) # Merge all the kwargs. proxies = merge_setting(proxies, self.proxies) stream = merge_setting(stream, self.stream) verify = merge_setting(verify, self.verify) cert = merge_setting(cert, self.cert) return {'verify': verify, 'proxies': proxies, 'stream': stream, 'cert': cert} def get_adapter(self, url): """Returns the appropriate connnection adapter for the given URL.""" for (prefix, adapter) in self.adapters.items(): if url.lower().startswith(prefix): return adapter # Nothing matches :-/ raise InvalidSchema("No connection adapters were found for '%s'" % url) def close(self): """Closes all adapters and as such the session""" for v in self.adapters.values(): v.close() def mount(self, prefix, adapter): """Registers a connection adapter to a prefix. Adapters are sorted in descending order by key length.""" self.adapters[prefix] = adapter keys_to_move = [k for k in self.adapters if len(k) < len(prefix)] for key in keys_to_move: self.adapters[key] = self.adapters.pop(key) def __getstate__(self): state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) state['redirect_cache'] = dict(self.redirect_cache) return state def __setstate__(self, state): redirect_cache = state.pop('redirect_cache', {}) for attr, value in state.items(): setattr(self, attr, value) self.redirect_cache = RecentlyUsedContainer(REDIRECT_CACHE_SIZE) for redirect, to in redirect_cache.items(): self.redirect_cache[redirect] = to def session(): """Returns a :class:`Session` for context-management.""" return Session() PK[ h5O5O"site-packages/requests/cookies.pyonu[ >uTc@s$dZddlZddlZddlmZmZmZmZyddlZeWne k rsddl ZnXde fdYZ de fdYZ d Zd Zddd Zd efd YZdejejfdYZdZdZdedZdZdS(s Compatibility code to be able to use `cookielib.CookieJar` with requests. requests.utils imports from here, so be careful with imports. iNi(t cookielibturlparset urlunparsetMorselt MockRequestcBseZdZdZdZdZdZdZdZdZ ddZ d Z d Z d Zed Zed ZedZRS(sWraps a `requests.Request` to mimic a `urllib2.Request`. The code in `cookielib.CookieJar` expects this interface in order to correctly manage cookie policies, i.e., determine whether a cookie can be set, given the domains of the request and the cookie. The original request object is read-only. The client is responsible for collecting the new headers via `get_new_headers()` and interpreting them appropriately. You probably want `get_cookie_header`, defined below. cCs.||_i|_t|jjj|_dS(N(t_rt _new_headersRturltschemettype(tselftrequest((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt__init__!s  cCs|jS(N(R (R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytget_type&scCst|jjjS(N(RRRtnetloc(R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytget_host)scCs |jS(N(R(R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytget_origin_req_host,scCsl|jjjds|jjS|jjd}t|jj}t|j||j|j|j |j gS(NtHost( RtheaderstgetRRRRtpathtparamstquerytfragment(R thosttparsed((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt get_full_url/s cCstS(N(tTrue(R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytis_unverifiable=scCs||jjkp||jkS(N(RRR(R tname((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt has_header@scCs%|jjj||jj||S(N(RRRR(R Rtdefault((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt get_headerCscCstddS(sMcookielib has no legitimate use for this method; add it back if you find one.s=Cookie headers should be added with add_unredirected_header()N(tNotImplementedError(R tkeytval((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt add_headerFscCs||j|Requests uses this method internally to get cookie values. Takes as args name and optional domain and path. Returns a cookie.value. If there are conflicting cookies, _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown if there are conflicting cookies.sname=%r, domain=%r, path=%rN(RRRR-R@RR%RJ(R RR@RRE((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt_find5s cCsd}xt|D]|}|j|kr|dksC|j|kr|dks^|j|kr|dk r}td|n|j}qqqqW|r|Std|||fdS(sRBoth ``__get_item__`` and ``get`` call this function: it's never used elsewhere in Requests. Takes as args name and optional domain and path. Returns a cookie.value. Throws KeyError if cookie is not found and CookieConflictError if there are multiple cookies that match name and optionally domain and path.s(There are multiple cookies with name, %rsname=%r, domain=%r, path=%rN(R-RRRR@RRGR%RJ(R RR@RttoReturnRE((s4/usr/lib/python2.7/site-packages/requests/cookies.pyRICs cCs |jj}|jd|S(s4Unlike a normal CookieJar, this class is pickleable.t _cookies_lock(t__dict__tcopytpop(R tstate((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt __getstate__Vs cCs5|jj|d|jkr1tj|_ndS(s4Unlike a normal CookieJar, this class is pickleable.RqN(RrRmt threadingtRLockRq(R Ru((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt __setstate__]scCst}|j||S(s(Return a copy of this RequestsCookieJar.(RHRm(R tnew_cj((s4/usr/lib/python2.7/site-packages/requests/cookies.pyRscs  N(R*R+R,R-RRQRSRURVRWRXRYR[R]R_RaRbRcRdRNRmRoRIRvRyRs(((s4/usr/lib/python2.7/site-packages/requests/cookies.pyRHs.                cKstddd|d|dddddd d td dd td ddddidd6dt }t|t|}|rd}t|t|n|j|t|d|ds&  "  H   # PK[}%site-packages/requests/structures.pyonu[ Tc@sEdZddlZdejfdYZdefdYZdS(sP requests.structures ~~~~~~~~~~~~~~~~~~~ Data structures that power Requests. iNtCaseInsensitiveDictcBskeZdZd dZdZdZdZdZdZ dZ dZ d Z d Z RS( s A case-insensitive ``dict``-like object. Implements all methods and operations of ``collections.MutableMapping`` as well as dict's ``copy``. Also provides ``lower_items``. All keys are expected to be strings. The structure remembers the case of the last key to be set, and ``iter(instance)``, ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` will contain case-sensitive keys. However, querying and contains testing is case insensitive:: cid = CaseInsensitiveDict() cid['Accept'] = 'application/json' cid['aCCEPT'] == 'application/json' # True list(cid) == ['Accept'] # True For example, ``headers['content-encoding']`` will return the value of a ``'Content-Encoding'`` response header, regardless of how the header name was originally stored. If the constructor, ``.update``, or equality comparison operations are given keys that have equal ``.lower()``s, the behavior is undefined. cKs5t|_|dkr!i}n|j||dS(N(tdictt_storetNonetupdate(tselftdatatkwargs((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__init__*s   cCs||f|j|j<s(Rtvalues(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__iter__;scCs t|jS(N(tlenR(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__len__>scCsd|jjDS(s.Like iteritems(), but with all lowercase keys.css%|]\}}||dfVqdS(iN((Rtlowerkeytkeyval((s7/usr/lib/python2.7/site-packages/requests/structures.pys Ds(Rtitems(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt lower_itemsAscCsGt|tjr!t|}ntSt|jt|jkS(N(t isinstancet collectionstMappingRtNotImplementedRR(Rtother((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__eq__IscCst|jjS(N(RRR(R((s7/usr/lib/python2.7/site-packages/requests/structures.pytcopyRscCstt|jS(N(tstrRR(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__repr__UsN(t__name__t __module__t__doc__RRR R RRRRRR R"(((s7/usr/lib/python2.7/site-packages/requests/structures.pyRs        t LookupDictcBs8eZdZddZdZdZddZRS(sDictionary lookup object.cCs ||_tt|jdS(N(tnametsuperR&R(RR'((s7/usr/lib/python2.7/site-packages/requests/structures.pyR[s cCs d|jS(Ns (R'(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyR"_scCs|jj|dS(N(t__dict__tgetR(RR ((s7/usr/lib/python2.7/site-packages/requests/structures.pyR bscCs|jj||S(N(R)R*(RR tdefault((s7/usr/lib/python2.7/site-packages/requests/structures.pyR*gsN(R#R$R%RRR"R R*(((s7/usr/lib/python2.7/site-packages/requests/structures.pyR&Xs    (R%RtMutableMappingRRR&(((s7/usr/lib/python2.7/site-packages/requests/structures.pyt s JPK[}9Yuu'site-packages/requests/status_codes.pycnu[ 6Sc@scddlmZiBdd6dd6dd6dd 6dd 6dd6dd6dd6dd6dd6dd 6dd#6dd(6dd*6dd,6dd.6dd26dd46dd76dd96dd;6dd=6ddA6ddE6ddH6ddJ6ddM6ddO6ddR6ddU6ddW6dd[6dd^6dd`6ddb6ddd6ddg6ddi6ddk6ddo6dds6ddu6ddy6dd|6dd~6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6ZeddZxieejD]U\ZZxFeD]>Ze eeeej dse eej eqqWqWdS(i(t LookupDicttcontinueidtswitching_protocolsiet processingift checkpointigt uri_too_longtrequest_uri_too_longiztoktokaytall_oktall_okaytall_goods\o/s✓itcreateditaccepteditnon_authoritative_infotnon_authoritative_informationit no_contentit reset_contenttresetitpartial_contenttpartialit multi_statustmultiple_statust multi_statitmultiple_statiitalready_reporteditim_useditmultiple_choicesi,tmoved_permanentlytmoveds\o-i-tfoundi.t see_othertotheri/t not_modifiedi0t use_proxyi1t switch_proxyi2ttemporary_redirectttemporary_movedt temporaryi3tpermanent_redirecttresume_incompletetresumei4t bad_requesttbadit unauthorizeditpayment_requiredtpaymentit forbiddenit not_founds-o-itmethod_not_allowedt not_alloweditnot_acceptableitproxy_authentication_requiredt proxy_authtproxy_authenticationitrequest_timeoutttimeoutitconflictitgoneitlength_requireditprecondition_failedt preconditionitrequest_entity_too_largeitrequest_uri_too_largeitunsupported_media_typetunsupported_mediat media_typeitrequested_range_not_satisfiabletrequested_rangetrange_not_satisfiableitexpectation_failedit im_a_teapottteapott i_am_a_teapotitunprocessable_entityt unprocessableitlockeditfailed_dependencyt dependencyitunordered_collectiont unordereditupgrade_requiredtupgradeitprecondition_requiredittoo_many_requeststtoo_manyitheader_fields_too_largetfields_too_largeit no_responsetnoneit retry_withtretryit$blocked_by_windows_parental_controlstparental_controlsitunavailable_for_legal_reasonst legal_reasonsitclient_closed_requestitinternal_server_errort server_errors/o\s✗itnot_implementedit bad_gatewayitservice_unavailablet unavailableitgateway_timeoutithttp_version_not_supportedt http_versionitvariant_also_negotiatesitinsufficient_storageitbandwidth_limit_exceededt bandwidthit not_extendeditnamet status_codess\N(R(R(R(R(RR(sokRR R R s\o/s✓(R (R (RR(R(Rsreset(RR(RRRR(R(R(R(RRs\o-(sfound(Rsother(R!(R"(R#(R$R%R&(R'R(R)(R*R+(R,(R-R.(R/(R0s-o-(R1R2(R3(R4R5R6(R7R8(R9(R:(R;(R<R=(R>(R?(R@RARB(RCRDRE(RF(RGRHRI(RJRK(RL(RMRN(RORP(RQRR(RSR=(RTRU(RVRW(RXRY(RZR[(R\R](R^R_(R`(RaRbs/o\s✗(Rc(Rd(ReRf(Rg(RhRi(Rj(Rk(RlRm(Rn( t structuresRt_codestcodestlisttitemstcodettitlesttitletsetattrt startswithtupper(((s9/usr/lib/python2.7/site-packages/requests/status_codes.pyts  PK[e site-packages/requests/hooks.pycnu[ CFQc@s%dZdgZdZdZdS(s requests.hooks ~~~~~~~~~~~~~~ This module provides the capabilities for the Requests hooks system. Available hooks: ``response``: The response generated from a Request. tresponsecCs%i}xtD]}g||s  PK[E site-packages/requests/certs.pycnu[ YЅ_c@sRdZyddlmZWnek r6dZnXedkrNeGHndS(sY certs.py ~~~~~~~~ This module returns the preferred default CA certificate bundle. If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. We return "/etc/pki/tls/certs/ca-bundle.crt" provided by the ca-certificates package. i(twherecCsdS(sA Don't use the certs bundled with requests, use ca-certificates. s /etc/pki/tls/certs/ca-bundle.crt((((s2/usr/lib/python2.7/site-packages/requests/certs.pyRst__main__N(t__doc__tcertifiRt ImportErrort__name__(((s2/usr/lib/python2.7/site-packages/requests/certs.pyts    PK[]site-packages/requests/api.pycnu[ bUc@sndZddlmZdZdZdZdZd d dZd dZ d d Z d Z d S( s requests.api ~~~~~~~~~~~~ This module implements the Requests API. :copyright: (c) 2012 by Kenneth Reitz. :license: Apache2, see LICENSE for more details. i(tsessionscKs5tj}|jd|d||}|j|S(sPConstructs and sends a :class:`Request `. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': ('filename', fileobj)}``) for multipart encoding upload. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param stream: (optional) if ``False``, the response content will be immediately downloaded. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :return: :class:`Response ` object :rtype: requests.Response Usage:: >>> import requests >>> req = requests.request('GET', 'http://httpbin.org/get') tmethodturl(RtSessiontrequesttclose(RRtkwargstsessiontresponse((s0/usr/lib/python2.7/site-packages/requests/api.pyRs  cKs |jdttd||S(sSends a GET request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tallow_redirectstget(t setdefaulttTrueR(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyR :s cKs |jdttd||S(sSends a OPTIONS request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response R toptions(R R R(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyR Gs cKs |jdttd||S(sSends a HEAD request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response R thead(R tFalseR(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyRTs cKstd|d|d||S(sSends a POST request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tposttdatatjson(R(RRRR((s0/usr/lib/python2.7/site-packages/requests/api.pyRas cKstd|d||S(sTSends a PUT request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tputR(R(RRR((s0/usr/lib/python2.7/site-packages/requests/api.pyRos cKstd|d||S(sVSends a PATCH request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tpatchR(R(RRR((s0/usr/lib/python2.7/site-packages/requests/api.pyR|s cKstd||S(sSends a DELETE request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tdelete(R(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyRs N( t__doc__tRRR R RtNoneRRRR(((s0/usr/lib/python2.7/site-packages/requests/api.pyt s )  PK[E $site-packages/requests/exceptions.pynu[# -*- coding: utf-8 -*- """ requests.exceptions ~~~~~~~~~~~~~~~~~~~ This module contains the set of Requests' exceptions. """ from urllib3.exceptions import HTTPError as BaseHTTPError class RequestException(IOError): """There was an ambiguous exception that occurred while handling your request.""" def __init__(self, *args, **kwargs): """ Initialize RequestException with `request` and `response` objects. """ response = kwargs.pop('response', None) self.response = response self.request = kwargs.pop('request', None) if (response is not None and not self.request and hasattr(response, 'request')): self.request = self.response.request super(RequestException, self).__init__(*args, **kwargs) class HTTPError(RequestException): """An HTTP error occurred.""" class ConnectionError(RequestException): """A Connection error occurred.""" class ProxyError(ConnectionError): """A proxy error occurred.""" class SSLError(ConnectionError): """An SSL error occurred.""" class Timeout(RequestException): """The request timed out. Catching this error will catch both :exc:`~requests.exceptions.ConnectTimeout` and :exc:`~requests.exceptions.ReadTimeout` errors. """ class ConnectTimeout(ConnectionError, Timeout): """The request timed out while trying to connect to the remote server. Requests that produced this error are safe to retry. """ class ReadTimeout(Timeout): """The server did not send any data in the allotted amount of time.""" class URLRequired(RequestException): """A valid URL is required to make a request.""" class TooManyRedirects(RequestException): """Too many redirects.""" class MissingSchema(RequestException, ValueError): """The URL schema (e.g. http or https) is missing.""" class InvalidSchema(RequestException, ValueError): """See defaults.py for valid schemas.""" class InvalidURL(RequestException, ValueError): """ The URL provided was somehow invalid. """ class ChunkedEncodingError(RequestException): """The server declared chunked encoding but sent an invalid chunk.""" class ContentDecodingError(RequestException, BaseHTTPError): """Failed to decode response content""" class StreamConsumedError(RequestException, TypeError): """The content for this response was already consumed""" class RetryError(RequestException): """Custom retries logic failed""" PK[9mm site-packages/requests/models.pynu[# -*- coding: utf-8 -*- """ requests.models ~~~~~~~~~~~~~~~ This module contains the primary objects that power Requests. """ import collections import datetime from io import BytesIO, UnsupportedOperation from .hooks import default_hooks from .structures import CaseInsensitiveDict from .auth import HTTPBasicAuth from .cookies import cookiejar_from_dict, get_cookie_header from urllib3.fields import RequestField from urllib3.filepost import encode_multipart_formdata from urllib3.util import parse_url from urllib3.exceptions import ( DecodeError, ReadTimeoutError, ProtocolError, LocationParseError) from .exceptions import ( HTTPError, MissingSchema, InvalidURL, ChunkedEncodingError, ContentDecodingError, ConnectionError, StreamConsumedError) from .utils import ( guess_filename, get_auth_from_url, requote_uri, stream_decode_response_unicode, to_key_val_list, parse_header_links, iter_slices, guess_json_utf, super_len, to_native_string) from .compat import ( cookielib, urlunparse, urlsplit, urlencode, str, bytes, StringIO, is_py2, chardet, json, builtin_str, basestring) from .status_codes import codes #: The set of HTTP status codes that indicate an automatically #: processable redirect. REDIRECT_STATI = ( codes.moved, # 301 codes.found, # 302 codes.other, # 303 codes.temporary_redirect, # 307 codes.permanent_redirect, # 308 ) DEFAULT_REDIRECT_LIMIT = 30 CONTENT_CHUNK_SIZE = 10 * 1024 ITER_CHUNK_SIZE = 512 json_dumps = json.dumps class RequestEncodingMixin(object): @property def path_url(self): """Build the path URL to use.""" url = [] p = urlsplit(self.url) path = p.path if not path: path = '/' url.append(path) query = p.query if query: url.append('?') url.append(query) return ''.join(url) @staticmethod def _encode_params(data): """Encode parameters in a piece of data. Will successfully encode parameters when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. """ if isinstance(data, (str, bytes)): return data elif hasattr(data, 'read'): return data elif hasattr(data, '__iter__'): result = [] for k, vs in to_key_val_list(data): if isinstance(vs, basestring) or not hasattr(vs, '__iter__'): vs = [vs] for v in vs: if v is not None: result.append( (k.encode('utf-8') if isinstance(k, str) else k, v.encode('utf-8') if isinstance(v, str) else v)) return urlencode(result, doseq=True) else: return data @staticmethod def _encode_files(files, data): """Build the body for a multipart/form-data request. Will successfully encode files when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. """ if (not files): raise ValueError("Files must be provided.") elif isinstance(data, basestring): raise ValueError("Data must not be a string.") new_fields = [] fields = to_key_val_list(data or {}) files = to_key_val_list(files or {}) for field, val in fields: if isinstance(val, basestring) or not hasattr(val, '__iter__'): val = [val] for v in val: if v is not None: # Don't call str() on bytestrings: in Py3 it all goes wrong. if not isinstance(v, bytes): v = str(v) new_fields.append( (field.decode('utf-8') if isinstance(field, bytes) else field, v.encode('utf-8') if isinstance(v, str) else v)) for (k, v) in files: # support for explicit filename ft = None fh = None if isinstance(v, (tuple, list)): if len(v) == 2: fn, fp = v elif len(v) == 3: fn, fp, ft = v else: fn, fp, ft, fh = v else: fn = guess_filename(v) or k fp = v if isinstance(fp, (str, bytes, bytearray)): fdata = fp else: fdata = fp.read() rf = RequestField(name=k, data=fdata, filename=fn, headers=fh) rf.make_multipart(content_type=ft) new_fields.append(rf) body, content_type = encode_multipart_formdata(new_fields) return body, content_type class RequestHooksMixin(object): def register_hook(self, event, hook): """Properly register a hook.""" if event not in self.hooks: raise ValueError('Unsupported event specified, with event name "%s"' % (event)) if isinstance(hook, collections.Callable): self.hooks[event].append(hook) elif hasattr(hook, '__iter__'): self.hooks[event].extend(h for h in hook if isinstance(h, collections.Callable)) def deregister_hook(self, event, hook): """Deregister a previously registered hook. Returns True if the hook existed, False if not. """ try: self.hooks[event].remove(hook) return True except ValueError: return False class Request(RequestHooksMixin): """A user-created :class:`Request ` object. Used to prepare a :class:`PreparedRequest `, which is sent to the server. :param method: HTTP method to use. :param url: URL to send. :param headers: dictionary of headers to send. :param files: dictionary of {filename: fileobject} files to multipart upload. :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. :param json: json for the body to attach to the request (if data is not specified). :param params: dictionary of URL parameters to append to the URL. :param auth: Auth handler or (user, pass) tuple. :param cookies: dictionary or CookieJar of cookies to attach to this request. :param hooks: dictionary of callback hooks, for internal usage. Usage:: >>> import requests >>> req = requests.Request('GET', 'http://httpbin.org/get') >>> req.prepare() """ def __init__(self, method=None, url=None, headers=None, files=None, data=None, params=None, auth=None, cookies=None, hooks=None, json=None): # Default empty dicts for dict params. data = [] if data is None else data files = [] if files is None else files headers = {} if headers is None else headers params = {} if params is None else params hooks = {} if hooks is None else hooks self.hooks = default_hooks() for (k, v) in list(hooks.items()): self.register_hook(event=k, hook=v) self.method = method self.url = url self.headers = headers self.files = files self.data = data self.json = json self.params = params self.auth = auth self.cookies = cookies def __repr__(self): return '' % (self.method) def prepare(self): """Constructs a :class:`PreparedRequest ` for transmission and returns it.""" p = PreparedRequest() p.prepare( method=self.method, url=self.url, headers=self.headers, files=self.files, data=self.data, json=self.json, params=self.params, auth=self.auth, cookies=self.cookies, hooks=self.hooks, ) return p class PreparedRequest(RequestEncodingMixin, RequestHooksMixin): """The fully mutable :class:`PreparedRequest ` object, containing the exact bytes that will be sent to the server. Generated from either a :class:`Request ` object or manually. Usage:: >>> import requests >>> req = requests.Request('GET', 'http://httpbin.org/get') >>> r = req.prepare() >>> s = requests.Session() >>> s.send(r) """ def __init__(self): #: HTTP verb to send to the server. self.method = None #: HTTP URL to send the request to. self.url = None #: dictionary of HTTP headers. self.headers = None # The `CookieJar` used to create the Cookie header will be stored here # after prepare_cookies is called self._cookies = None #: request body to send to the server. self.body = None #: dictionary of callback hooks, for internal usage. self.hooks = default_hooks() def prepare(self, method=None, url=None, headers=None, files=None, data=None, params=None, auth=None, cookies=None, hooks=None, json=None): """Prepares the entire request with the given parameters.""" self.prepare_method(method) self.prepare_url(url, params) self.prepare_headers(headers) self.prepare_cookies(cookies) self.prepare_body(data, files, json) self.prepare_auth(auth, url) # Note that prepare_auth must be last to enable authentication schemes # such as OAuth to work on a fully prepared request. # This MUST go after prepare_auth. Authenticators could add a hook self.prepare_hooks(hooks) def __repr__(self): return '' % (self.method) def copy(self): p = PreparedRequest() p.method = self.method p.url = self.url p.headers = self.headers.copy() if self.headers is not None else None p._cookies = self._cookies.copy() if self._cookies is not None else None p.body = self.body p.hooks = self.hooks return p def prepare_method(self, method): """Prepares the given HTTP method.""" self.method = method if self.method is not None: self.method = self.method.upper() def prepare_url(self, url, params): """Prepares the given HTTP URL.""" #: Accept objects that have string representations. #: We're unable to blindy call unicode/str functions #: as this will include the bytestring indicator (b'') #: on python 3.x. #: https://github.com/kennethreitz/requests/pull/2238 if isinstance(url, bytes): url = url.decode('utf8') else: url = unicode(url) if is_py2 else str(url) # Don't do any URL preparation for non-HTTP schemes like `mailto`, # `data` etc to work around exceptions from `url_parse`, which # handles RFC 3986 only. if ':' in url and not url.lower().startswith('http'): self.url = url return # Support for unicode domain names and paths. try: scheme, auth, host, port, path, query, fragment = parse_url(url) except LocationParseError as e: raise InvalidURL(*e.args) if not scheme: raise MissingSchema("Invalid URL {0!r}: No schema supplied. " "Perhaps you meant http://{0}?".format(url)) if not host: raise InvalidURL("Invalid URL %r: No host supplied" % url) # Only want to apply IDNA to the hostname try: host = host.encode('idna').decode('utf-8') except UnicodeError: raise InvalidURL('URL has an invalid label.') # Carefully reconstruct the network location netloc = auth or '' if netloc: netloc += '@' netloc += host if port: netloc += ':' + str(port) # Bare domains aren't valid URLs. if not path: path = '/' if is_py2: if isinstance(scheme, str): scheme = scheme.encode('utf-8') if isinstance(netloc, str): netloc = netloc.encode('utf-8') if isinstance(path, str): path = path.encode('utf-8') if isinstance(query, str): query = query.encode('utf-8') if isinstance(fragment, str): fragment = fragment.encode('utf-8') enc_params = self._encode_params(params) if enc_params: if query: query = '%s&%s' % (query, enc_params) else: query = enc_params url = requote_uri(urlunparse([scheme, netloc, path, None, query, fragment])) self.url = url def prepare_headers(self, headers): """Prepares the given HTTP headers.""" if headers: self.headers = CaseInsensitiveDict((to_native_string(name), value) for name, value in headers.items()) else: self.headers = CaseInsensitiveDict() def prepare_body(self, data, files, json=None): """Prepares the given HTTP body data.""" # Check if file, fo, generator, iterator. # If not, run through normal process. # Nottin' on you. body = None content_type = None length = None if json is not None: content_type = 'application/json' body = json_dumps(json) is_stream = all([ hasattr(data, '__iter__'), not isinstance(data, (basestring, list, tuple, dict)) ]) try: length = super_len(data) except (TypeError, AttributeError, UnsupportedOperation): length = None if is_stream: body = data if files: raise NotImplementedError('Streamed bodies and files are mutually exclusive.') if length is not None: self.headers['Content-Length'] = builtin_str(length) else: self.headers['Transfer-Encoding'] = 'chunked' else: # Multi-part file uploads. if files: (body, content_type) = self._encode_files(files, data) else: if data and json is None: body = self._encode_params(data) if isinstance(data, basestring) or hasattr(data, 'read'): content_type = None else: content_type = 'application/x-www-form-urlencoded' self.prepare_content_length(body) # Add content-type if it wasn't explicitly provided. if content_type and ('content-type' not in self.headers): self.headers['Content-Type'] = content_type self.body = body def prepare_content_length(self, body): if hasattr(body, 'seek') and hasattr(body, 'tell'): body.seek(0, 2) self.headers['Content-Length'] = builtin_str(body.tell()) body.seek(0, 0) elif body is not None: l = super_len(body) if l: self.headers['Content-Length'] = builtin_str(l) elif (self.method not in ('GET', 'HEAD')) and (self.headers.get('Content-Length') is None): self.headers['Content-Length'] = '0' def prepare_auth(self, auth, url=''): """Prepares the given HTTP auth data.""" # If no Auth is explicitly provided, extract it from the URL first. if auth is None: url_auth = get_auth_from_url(self.url) auth = url_auth if any(url_auth) else None if auth: if isinstance(auth, tuple) and len(auth) == 2: # special-case basic HTTP auth auth = HTTPBasicAuth(*auth) # Allow auth to make its changes. r = auth(self) # Update self to reflect the auth changes. self.__dict__.update(r.__dict__) # Recompute Content-Length self.prepare_content_length(self.body) def prepare_cookies(self, cookies): """Prepares the given HTTP cookie data.""" if isinstance(cookies, cookielib.CookieJar): self._cookies = cookies else: self._cookies = cookiejar_from_dict(cookies) cookie_header = get_cookie_header(self._cookies, self) if cookie_header is not None: self.headers['Cookie'] = cookie_header def prepare_hooks(self, hooks): """Prepares the given hooks.""" for event in hooks: self.register_hook(event, hooks[event]) class Response(object): """The :class:`Response ` object, which contains a server's response to an HTTP request. """ __attrs__ = [ '_content', 'status_code', 'headers', 'url', 'history', 'encoding', 'reason', 'cookies', 'elapsed', 'request', ] def __init__(self): super(Response, self).__init__() self._content = False self._content_consumed = False #: Integer Code of responded HTTP Status, e.g. 404 or 200. self.status_code = None #: Case-insensitive Dictionary of Response Headers. #: For example, ``headers['content-encoding']`` will return the #: value of a ``'Content-Encoding'`` response header. self.headers = CaseInsensitiveDict() #: File-like object representation of response (for advanced usage). #: Use of ``raw`` requires that ``stream=True`` be set on the request. # This requirement does not apply for use internally to Requests. self.raw = None #: Final URL location of Response. self.url = None #: Encoding to decode with when accessing r.text. self.encoding = None #: A list of :class:`Response ` objects from #: the history of the Request. Any redirect responses will end #: up here. The list is sorted from the oldest to the most recent request. self.history = [] #: Textual reason of responded HTTP Status, e.g. "Not Found" or "OK". self.reason = None #: A CookieJar of Cookies the server sent back. self.cookies = cookiejar_from_dict({}) #: The amount of time elapsed between sending the request #: and the arrival of the response (as a timedelta) self.elapsed = datetime.timedelta(0) #: The :class:`PreparedRequest ` object to which this #: is a response. self.request = None def __getstate__(self): # Consume everything; accessing the content attribute makes # sure the content has been fully read. if not self._content_consumed: self.content return dict( (attr, getattr(self, attr, None)) for attr in self.__attrs__ ) def __setstate__(self, state): for name, value in state.items(): setattr(self, name, value) # pickled objects do not have .raw setattr(self, '_content_consumed', True) setattr(self, 'raw', None) def __repr__(self): return '' % (self.status_code) def __bool__(self): """Returns true if :attr:`status_code` is 'OK'.""" return self.ok def __nonzero__(self): """Returns true if :attr:`status_code` is 'OK'.""" return self.ok def __iter__(self): """Allows you to use a response as an iterator.""" return self.iter_content(128) @property def ok(self): try: self.raise_for_status() except HTTPError: return False return True @property def is_redirect(self): """True if this Response is a well-formed HTTP redirect that could have been processed automatically (by :meth:`Session.resolve_redirects`). """ return ('location' in self.headers and self.status_code in REDIRECT_STATI) @property def is_permanent_redirect(self): """True if this Response one of the permanant versions of redirect""" return ('location' in self.headers and self.status_code in (codes.moved_permanently, codes.permanent_redirect)) @property def apparent_encoding(self): """The apparent encoding, provided by the chardet library""" return chardet.detect(self.content)['encoding'] def iter_content(self, chunk_size=1, decode_unicode=False): """Iterates over the response data. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. The chunk size is the number of bytes it should read into memory. This is not necessarily the length of each item returned as decoding can take place. If decode_unicode is True, content will be decoded using the best available encoding based on the response. """ def generate(): try: # Special case for urllib3. try: for chunk in self.raw.stream(chunk_size, decode_content=True): yield chunk except ProtocolError as e: raise ChunkedEncodingError(e) except DecodeError as e: raise ContentDecodingError(e) except ReadTimeoutError as e: raise ConnectionError(e) except AttributeError: # Standard file-like object. while True: chunk = self.raw.read(chunk_size) if not chunk: break yield chunk self._content_consumed = True if self._content_consumed and isinstance(self._content, bool): raise StreamConsumedError() # simulate reading small chunks of the content reused_chunks = iter_slices(self._content, chunk_size) stream_chunks = generate() chunks = reused_chunks if self._content_consumed else stream_chunks if decode_unicode: chunks = stream_decode_response_unicode(chunks, self) return chunks def iter_lines(self, chunk_size=ITER_CHUNK_SIZE, decode_unicode=None, delimiter=None): """Iterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. .. note:: This method is not reentrant safe. """ pending = None for chunk in self.iter_content(chunk_size=chunk_size, decode_unicode=decode_unicode): if pending is not None: chunk = pending + chunk if delimiter: lines = chunk.split(delimiter) else: lines = chunk.splitlines() if lines and lines[-1] and chunk and lines[-1][-1] == chunk[-1]: pending = lines.pop() else: pending = None for line in lines: yield line if pending is not None: yield pending @property def content(self): """Content of the response, in bytes.""" if self._content is False: # Read the contents. try: if self._content_consumed: raise RuntimeError( 'The content for this response was already consumed') if self.status_code == 0: self._content = None else: self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes() except AttributeError: self._content = None self._content_consumed = True # don't need to release the connection; that's been handled by urllib3 # since we exhausted the data. return self._content @property def text(self): """Content of the response, in unicode. If Response.encoding is None, encoding will be guessed using ``chardet``. The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set ``r.encoding`` appropriately before accessing this property. """ # Try charset from content-type content = None encoding = self.encoding if not self.content: return str('') # Fallback to auto-detected encoding. if self.encoding is None: encoding = self.apparent_encoding # Decode unicode from given encoding. try: content = str(self.content, encoding, errors='replace') except (LookupError, TypeError): # A LookupError is raised if the encoding was not found which could # indicate a misspelling or similar mistake. # # A TypeError can be raised if encoding is None # # So we try blindly encoding. content = str(self.content, errors='replace') return content def json(self, **kwargs): """Returns the json-encoded content of a response, if any. :param \*\*kwargs: Optional arguments that ``json.loads`` takes. """ if not self.encoding and len(self.content) > 3: # No encoding set. JSON RFC 4627 section 3 states we should expect # UTF-8, -16 or -32. Detect which one to use; If the detection or # decoding fails, fall back to `self.text` (using chardet to make # a best guess). encoding = guess_json_utf(self.content) if encoding is not None: try: return json.loads(self.content.decode(encoding), **kwargs) except UnicodeDecodeError: # Wrong UTF codec detected; usually because it's not UTF-8 # but some other 8-bit codec. This is an RFC violation, # and the server didn't bother to tell us what codec *was* # used. pass return json.loads(self.text, **kwargs) @property def links(self): """Returns the parsed header links of the response, if any.""" header = self.headers.get('link') # l = MultiDict() l = {} if header: links = parse_header_links(header) for link in links: key = link.get('rel') or link.get('url') l[key] = link return l def raise_for_status(self): """Raises stored :class:`HTTPError`, if one occurred.""" http_error_msg = '' if 400 <= self.status_code < 500: http_error_msg = '%s Client Error: %s' % (self.status_code, self.reason) elif 500 <= self.status_code < 600: http_error_msg = '%s Server Error: %s' % (self.status_code, self.reason) if http_error_msg: raise HTTPError(http_error_msg, response=self) def close(self): """Releases the connection back to the pool. Once this method has been called the underlying ``raw`` object must not be accessed again. *Note: Should not normally need to be called explicitly.* """ return self.raw.release_conn() PK[}9Yuu'site-packages/requests/status_codes.pyonu[ 6Sc@scddlmZiBdd6dd6dd6dd 6dd 6dd6dd6dd6dd6dd6dd 6dd#6dd(6dd*6dd,6dd.6dd26dd46dd76dd96dd;6dd=6ddA6ddE6ddH6ddJ6ddM6ddO6ddR6ddU6ddW6dd[6dd^6dd`6ddb6ddd6ddg6ddi6ddk6ddo6dds6ddu6ddy6dd|6dd~6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6ZeddZxieejD]U\ZZxFeD]>Ze eeeej dse eej eqqWqWdS(i(t LookupDicttcontinueidtswitching_protocolsiet processingift checkpointigt uri_too_longtrequest_uri_too_longiztoktokaytall_oktall_okaytall_goods\o/s✓itcreateditaccepteditnon_authoritative_infotnon_authoritative_informationit no_contentit reset_contenttresetitpartial_contenttpartialit multi_statustmultiple_statust multi_statitmultiple_statiitalready_reporteditim_useditmultiple_choicesi,tmoved_permanentlytmoveds\o-i-tfoundi.t see_othertotheri/t not_modifiedi0t use_proxyi1t switch_proxyi2ttemporary_redirectttemporary_movedt temporaryi3tpermanent_redirecttresume_incompletetresumei4t bad_requesttbadit unauthorizeditpayment_requiredtpaymentit forbiddenit not_founds-o-itmethod_not_allowedt not_alloweditnot_acceptableitproxy_authentication_requiredt proxy_authtproxy_authenticationitrequest_timeoutttimeoutitconflictitgoneitlength_requireditprecondition_failedt preconditionitrequest_entity_too_largeitrequest_uri_too_largeitunsupported_media_typetunsupported_mediat media_typeitrequested_range_not_satisfiabletrequested_rangetrange_not_satisfiableitexpectation_failedit im_a_teapottteapott i_am_a_teapotitunprocessable_entityt unprocessableitlockeditfailed_dependencyt dependencyitunordered_collectiont unordereditupgrade_requiredtupgradeitprecondition_requiredittoo_many_requeststtoo_manyitheader_fields_too_largetfields_too_largeit no_responsetnoneit retry_withtretryit$blocked_by_windows_parental_controlstparental_controlsitunavailable_for_legal_reasonst legal_reasonsitclient_closed_requestitinternal_server_errort server_errors/o\s✗itnot_implementedit bad_gatewayitservice_unavailablet unavailableitgateway_timeoutithttp_version_not_supportedt http_versionitvariant_also_negotiatesitinsufficient_storageitbandwidth_limit_exceededt bandwidthit not_extendeditnamet status_codess\N(R(R(R(R(RR(sokRR R R s\o/s✓(R (R (RR(R(Rsreset(RR(RRRR(R(R(R(RRs\o-(sfound(Rsother(R!(R"(R#(R$R%R&(R'R(R)(R*R+(R,(R-R.(R/(R0s-o-(R1R2(R3(R4R5R6(R7R8(R9(R:(R;(R<R=(R>(R?(R@RARB(RCRDRE(RF(RGRHRI(RJRK(RL(RMRN(RORP(RQRR(RSR=(RTRU(RVRW(RXRY(RZR[(R\R](R^R_(R`(RaRbs/o\s✗(Rc(Rd(ReRf(Rg(RhRi(Rj(Rk(RlRm(Rn( t structuresRt_codestcodestlisttitemstcodettitlesttitletsetattrt startswithtupper(((s9/usr/lib/python2.7/site-packages/requests/status_codes.pyts  PK[uRR"site-packages/requests/__init__.pynu[# -*- coding: utf-8 -*- # __ # /__) _ _ _ _ _/ _ # / ( (- (/ (/ (- _) / _) # / """ requests HTTP library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET usage: >>> import requests >>> r = requests.get('https://www.python.org') >>> r.status_code 200 >>> 'Python is a programming language' in r.content True ... or POST: >>> payload = dict(key1='value1', key2='value2') >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... } The other HTTP methods are supported - see `requests.api`. Full documentation is at . :copyright: (c) 2015 by Kenneth Reitz. :license: Apache 2.0, see LICENSE for more details. """ __title__ = 'requests' __version__ = '2.6.0' __build__ = 0x020503 __author__ = 'Kenneth Reitz' __license__ = 'Apache 2.0' __copyright__ = 'Copyright 2015 Kenneth Reitz' # Attempt to enable urllib3's SNI support, if possible try: from urllib3.contrib import pyopenssl pyopenssl.inject_into_urllib3() except ImportError: pass from . import utils from .models import Request, Response, PreparedRequest from .api import request, get, head, post, patch, put, delete, options from .sessions import session, Session from .status_codes import codes from .exceptions import ( RequestException, Timeout, URLRequired, TooManyRedirects, HTTPError, ConnectionError ) from . import packages # Set default logging handler to avoid "No handler found" warnings. import logging try: # Python 2.7+ from logging import NullHandler except ImportError: class NullHandler(logging.Handler): def emit(self, record): pass logging.getLogger(__name__).addHandler(NullHandler()) PK[ssite-packages/requests/api.pynu[# -*- coding: utf-8 -*- """ requests.api ~~~~~~~~~~~~ This module implements the Requests API. :copyright: (c) 2012 by Kenneth Reitz. :license: Apache2, see LICENSE for more details. """ from . import sessions def request(method, url, **kwargs): """Constructs and sends a :class:`Request `. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': ('filename', fileobj)}``) for multipart encoding upload. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param stream: (optional) if ``False``, the response content will be immediately downloaded. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :return: :class:`Response ` object :rtype: requests.Response Usage:: >>> import requests >>> req = requests.request('GET', 'http://httpbin.org/get') """ session = sessions.Session() response = session.request(method=method, url=url, **kwargs) # By explicitly closing the session, we avoid leaving sockets open which # can trigger a ResourceWarning in some cases, and look like a memory leak # in others. session.close() return response def get(url, **kwargs): """Sends a GET request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) return request('get', url, **kwargs) def options(url, **kwargs): """Sends a OPTIONS request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ kwargs.setdefault('allow_redirects', True) return request('options', url, **kwargs) def head(url, **kwargs): """Sends a HEAD request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ kwargs.setdefault('allow_redirects', False) return request('head', url, **kwargs) def post(url, data=None, json=None, **kwargs): """Sends a POST request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ return request('post', url, data=data, json=json, **kwargs) def put(url, data=None, **kwargs): """Sends a PUT request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ return request('put', url, data=data, **kwargs) def patch(url, data=None, **kwargs): """Sends a PATCH request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ return request('patch', url, data=data, **kwargs) def delete(url, **kwargs): """Sends a DELETE request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response """ return request('delete', url, **kwargs) PK[*ހ &site-packages/requests/status_codes.pynu[# -*- coding: utf-8 -*- from .structures import LookupDict _codes = { # Informational. 100: ('continue',), 101: ('switching_protocols',), 102: ('processing',), 103: ('checkpoint',), 122: ('uri_too_long', 'request_uri_too_long'), 200: ('ok', 'okay', 'all_ok', 'all_okay', 'all_good', '\\o/', '✓'), 201: ('created',), 202: ('accepted',), 203: ('non_authoritative_info', 'non_authoritative_information'), 204: ('no_content',), 205: ('reset_content', 'reset'), 206: ('partial_content', 'partial'), 207: ('multi_status', 'multiple_status', 'multi_stati', 'multiple_stati'), 208: ('already_reported',), 226: ('im_used',), # Redirection. 300: ('multiple_choices',), 301: ('moved_permanently', 'moved', '\\o-'), 302: ('found',), 303: ('see_other', 'other'), 304: ('not_modified',), 305: ('use_proxy',), 306: ('switch_proxy',), 307: ('temporary_redirect', 'temporary_moved', 'temporary'), 308: ('permanent_redirect', 'resume_incomplete', 'resume',), # These 2 to be removed in 3.0 # Client Error. 400: ('bad_request', 'bad'), 401: ('unauthorized',), 402: ('payment_required', 'payment'), 403: ('forbidden',), 404: ('not_found', '-o-'), 405: ('method_not_allowed', 'not_allowed'), 406: ('not_acceptable',), 407: ('proxy_authentication_required', 'proxy_auth', 'proxy_authentication'), 408: ('request_timeout', 'timeout'), 409: ('conflict',), 410: ('gone',), 411: ('length_required',), 412: ('precondition_failed', 'precondition'), 413: ('request_entity_too_large',), 414: ('request_uri_too_large',), 415: ('unsupported_media_type', 'unsupported_media', 'media_type'), 416: ('requested_range_not_satisfiable', 'requested_range', 'range_not_satisfiable'), 417: ('expectation_failed',), 418: ('im_a_teapot', 'teapot', 'i_am_a_teapot'), 422: ('unprocessable_entity', 'unprocessable'), 423: ('locked',), 424: ('failed_dependency', 'dependency'), 425: ('unordered_collection', 'unordered'), 426: ('upgrade_required', 'upgrade'), 428: ('precondition_required', 'precondition'), 429: ('too_many_requests', 'too_many'), 431: ('header_fields_too_large', 'fields_too_large'), 444: ('no_response', 'none'), 449: ('retry_with', 'retry'), 450: ('blocked_by_windows_parental_controls', 'parental_controls'), 451: ('unavailable_for_legal_reasons', 'legal_reasons'), 499: ('client_closed_request',), # Server Error. 500: ('internal_server_error', 'server_error', '/o\\', '✗'), 501: ('not_implemented',), 502: ('bad_gateway',), 503: ('service_unavailable', 'unavailable'), 504: ('gateway_timeout',), 505: ('http_version_not_supported', 'http_version'), 506: ('variant_also_negotiates',), 507: ('insufficient_storage',), 509: ('bandwidth_limit_exceeded', 'bandwidth'), 510: ('not_extended',), } codes = LookupDict(name='status_codes') for (code, titles) in list(_codes.items()): for title in titles: setattr(codes, title, code) if not title.startswith('\\'): setattr(codes, title.upper(), code) PK[v44site-packages/requests/hooks.pynu[# -*- coding: utf-8 -*- """ requests.hooks ~~~~~~~~~~~~~~ This module provides the capabilities for the Requests hooks system. Available hooks: ``response``: The response generated from a Request. """ HOOKS = ['response'] def default_hooks(): hooks = {} for event in HOOKS: hooks[event] = [] return hooks # TODO: response is the only one def dispatch_hook(key, hooks, hook_data, **kwargs): """Dispatches a hook dictionary on a given piece of data.""" hooks = hooks or dict() if key in hooks: hooks = hooks.get(key) if hasattr(hooks, '__call__'): hooks = [hooks] for hook in hooks: _hook_data = hook(hook_data, **kwargs) if _hook_data is not None: hook_data = _hook_data return hook_data PK[MY,site-packages/requests/packages/__init__.pycnu[ ZЅ_c?@s2ddlZdddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@g?Zx\eD]TZyeeWnek rqXejeejdAe/usr/lib/python2.7/site-packages/requests/packages/__init__.pyts4                      PK[^D+site-packages/requests/packages/__init__.pynu[import sys # This code exists for backwards compatibility reasons. modules_list = [ 'urllib3', 'chardet', 'chardet.big5prober', 'chardet.chardetect', 'chardet.chardistribution', 'chardet.charsetgroupprober', 'chardet.charsetprober', 'chardet.codingstatemachine', 'chardet.compat', 'chardet.constants', 'chardet.cp949prober', 'chardet.escprober', 'chardet.escsm', 'chardet.eucjpprober', 'chardet.euckrfreq', 'chardet.euckrprober', 'chardet.euctwfreq', 'chardet.euctwprober', 'chardet.gb2312freq', 'chardet.gb2312prober', 'chardet.hebrewprober', 'chardet.jisfreq', 'chardet.jpcntx', 'chardet.langbulgarianmodel', 'chardet.langcyrillicmodel', 'chardet.langgreekmodel', 'chardet.langhebrewmodel', 'chardet.langhungarianmodel', 'chardet.langthaimodel', 'chardet.latin1prober', 'chardet.mbcharsetprober', 'chardet.mbcsgroupprober', 'chardet.mbcssm', 'chardet.sbcharsetprober', 'chardet.sbcsgroupprober', 'chardet.sjisprober', 'chardet.universaldetector', 'chardet.utf8prober', 'urllib3._collections', 'urllib3.connectionpool', 'urllib3.connection', 'urllib3.contrib', 'urllib3.exceptions', 'urllib3.fields', 'urllib3.filepost', 'urllib3.packages', 'urllib3.poolmanager', 'urllib3.request', 'urllib3.response', 'urllib3.util', 'urllib3.contrib.ntlmpool', 'urllib3.contrib.pyopenssl', 'urllib3.util.connection', 'urllib3.util.request', 'urllib3.util.response', 'urllib3.util.retry', 'urllib3.util.ssl_', 'urllib3.util.timeout', 'urllib3.util.url', 'urllib3.packages.ordered_dict', 'urllib3.packages.six', 'urllib3.packages.ssl_match_hostname', 'urllib3.packages.ssl_match_hostname.implementation' ] for package in modules_list: try: __import__(package) except ImportError: pass else: sys.modules['requests.packages.' + package] = sys.modules[package] globals()[package] = sys.modules[package] PK[MY,site-packages/requests/packages/__init__.pyonu[ ZЅ_c?@s2ddlZdddddddd d d d d ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@g?Zx\eD]TZyeeWnek rqXejeejdAe/usr/lib/python2.7/site-packages/requests/packages/__init__.pyts4                      PK[r\m2A2A"site-packages/requests/adapters.pynu[# -*- coding: utf-8 -*- """ requests.adapters ~~~~~~~~~~~~~~~~~ This module contains the transport adapters that Requests uses to define and maintain connections. """ import socket from .models import Response from urllib3.poolmanager import PoolManager, proxy_from_url from urllib3.response import HTTPResponse from urllib3.util import Timeout as TimeoutSauce from urllib3.util.retry import Retry from .compat import urlparse, basestring from .utils import (DEFAULT_CA_BUNDLE_PATH, get_encoding_from_headers, prepend_scheme_if_needed, get_auth_from_url, urldefragauth) from .structures import CaseInsensitiveDict from urllib3.exceptions import ConnectTimeoutError from urllib3.exceptions import HTTPError as _HTTPError from urllib3.exceptions import MaxRetryError from urllib3.exceptions import ProxyError as _ProxyError from urllib3.exceptions import ProtocolError from urllib3.exceptions import ReadTimeoutError from urllib3.exceptions import SSLError as _SSLError from urllib3.exceptions import ResponseError from .cookies import extract_cookies_to_jar from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError, ProxyError, RetryError) from .auth import _basic_auth_str DEFAULT_POOLBLOCK = False DEFAULT_POOLSIZE = 10 DEFAULT_RETRIES = 0 class BaseAdapter(object): """The Base Transport Adapter""" def __init__(self): super(BaseAdapter, self).__init__() def send(self): raise NotImplementedError def close(self): raise NotImplementedError class HTTPAdapter(BaseAdapter): """The built-in HTTP Adapter for urllib3. Provides a general-case interface for Requests sessions to contact HTTP and HTTPS urls by implementing the Transport Adapter interface. This class will usually be created by the :class:`Session ` class under the covers. :param pool_connections: The number of urllib3 connection pools to cache. :param pool_maxsize: The maximum number of connections to save in the pool. :param int max_retries: The maximum number of retries each connection should attempt. Note, this applies only to failed DNS lookups, socket connections and connection timeouts, never to requests where data has made it to the server. By default, Requests does not retry failed connections. If you need granular control over the conditions under which we retry a request, import urllib3's ``Retry`` class and pass that instead. :param pool_block: Whether the connection pool should block for connections. Usage:: >>> import requests >>> s = requests.Session() >>> a = requests.adapters.HTTPAdapter(max_retries=3) >>> s.mount('http://', a) """ __attrs__ = ['max_retries', 'config', '_pool_connections', '_pool_maxsize', '_pool_block'] def __init__(self, pool_connections=DEFAULT_POOLSIZE, pool_maxsize=DEFAULT_POOLSIZE, max_retries=DEFAULT_RETRIES, pool_block=DEFAULT_POOLBLOCK): if max_retries == DEFAULT_RETRIES: self.max_retries = Retry(0, read=False) else: self.max_retries = Retry.from_int(max_retries) self.config = {} self.proxy_manager = {} super(HTTPAdapter, self).__init__() self._pool_connections = pool_connections self._pool_maxsize = pool_maxsize self._pool_block = pool_block self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) def __getstate__(self): return dict((attr, getattr(self, attr, None)) for attr in self.__attrs__) def __setstate__(self, state): # Can't handle by adding 'proxy_manager' to self.__attrs__ because # because self.poolmanager uses a lambda function, which isn't pickleable. self.proxy_manager = {} self.config = {} for attr, value in state.items(): setattr(self, attr, value) self.init_poolmanager(self._pool_connections, self._pool_maxsize, block=self._pool_block) def init_poolmanager(self, connections, maxsize, block=DEFAULT_POOLBLOCK, **pool_kwargs): """Initializes a urllib3 PoolManager. This method should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param connections: The number of urllib3 connection pools to cache. :param maxsize: The maximum number of connections to save in the pool. :param block: Block when no free connections are available. :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. """ # save these values for pickling self._pool_connections = connections self._pool_maxsize = maxsize self._pool_block = block self.poolmanager = PoolManager(num_pools=connections, maxsize=maxsize, block=block, strict=True, **pool_kwargs) def proxy_manager_for(self, proxy, **proxy_kwargs): """Return urllib3 ProxyManager for the given proxy. This method should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param proxy: The proxy to return a urllib3 ProxyManager for. :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. :returns: ProxyManager """ if not proxy in self.proxy_manager: proxy_headers = self.proxy_headers(proxy) self.proxy_manager[proxy] = proxy_from_url( proxy, proxy_headers=proxy_headers, num_pools=self._pool_connections, maxsize=self._pool_maxsize, block=self._pool_block, **proxy_kwargs) return self.proxy_manager[proxy] def cert_verify(self, conn, url, verify, cert): """Verify a SSL certificate. This method should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param conn: The urllib3 connection object associated with the cert. :param url: The requested URL. :param verify: Whether we should actually verify the certificate. :param cert: The SSL certificate to verify. """ if url.lower().startswith('https') and verify: cert_loc = None # Allow self-specified cert location. if verify is not True: cert_loc = verify if not cert_loc: cert_loc = DEFAULT_CA_BUNDLE_PATH if not cert_loc: raise Exception("Could not find a suitable SSL CA certificate bundle.") conn.cert_reqs = 'CERT_REQUIRED' conn.ca_certs = cert_loc else: conn.cert_reqs = 'CERT_NONE' conn.ca_certs = None if cert: if not isinstance(cert, basestring): conn.cert_file = cert[0] conn.key_file = cert[1] else: conn.cert_file = cert def build_response(self, req, resp): """Builds a :class:`Response ` object from a urllib3 response. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter ` :param req: The :class:`PreparedRequest ` used to generate the response. :param resp: The urllib3 response object. """ response = Response() # Fallback to None if there's no status_code, for whatever reason. response.status_code = getattr(resp, 'status', None) # Make headers case-insensitive. response.headers = CaseInsensitiveDict(getattr(resp, 'headers', {})) # Set encoding. response.encoding = get_encoding_from_headers(response.headers) response.raw = resp response.reason = response.raw.reason if isinstance(req.url, bytes): response.url = req.url.decode('utf-8') else: response.url = req.url # Add new cookies from the server. extract_cookies_to_jar(response.cookies, req, resp) # Give the Response some context. response.request = req response.connection = self return response def get_connection(self, url, proxies=None): """Returns a urllib3 connection for the given URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param url: The URL to connect to. :param proxies: (optional) A Requests-style dictionary of proxies used on this request. """ proxies = proxies or {} proxy = proxies.get(urlparse(url.lower()).scheme) if proxy: proxy = prepend_scheme_if_needed(proxy, 'http') proxy_manager = self.proxy_manager_for(proxy) conn = proxy_manager.connection_from_url(url) else: # Only scheme should be lower case parsed = urlparse(url) url = parsed.geturl() conn = self.poolmanager.connection_from_url(url) return conn def close(self): """Disposes of any internal state. Currently, this just closes the PoolManager, which closes pooled connections. """ self.poolmanager.clear() def request_url(self, request, proxies): """Obtain the url to use when making the final request. If the message is being sent through a HTTP proxy, the full URL has to be used. Otherwise, we should only use the path portion of the URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param request: The :class:`PreparedRequest ` being sent. :param proxies: A dictionary of schemes to proxy URLs. """ proxies = proxies or {} scheme = urlparse(request.url).scheme proxy = proxies.get(scheme) if proxy and scheme != 'https': url = urldefragauth(request.url) else: url = request.path_url return url def add_headers(self, request, **kwargs): """Add any headers needed by the connection. As of v2.0 this does nothing by default, but is left for overriding by users that subclass the :class:`HTTPAdapter `. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param request: The :class:`PreparedRequest ` to add headers to. :param kwargs: The keyword arguments from the call to send(). """ pass def proxy_headers(self, proxy): """Returns a dictionary of the headers to add to any request sent through a proxy. This works with urllib3 magic to ensure that they are correctly sent to the proxy, rather than in a tunnelled request if CONNECT is being used. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param proxies: The url of the proxy being used for this request. :param kwargs: Optional additional keyword arguments. """ headers = {} username, password = get_auth_from_url(proxy) if username and password: headers['Proxy-Authorization'] = _basic_auth_str(username, password) return headers def send(self, request, stream=False, timeout=None, verify=True, cert=None, proxies=None): """Sends PreparedRequest object. Returns Response object. :param request: The :class:`PreparedRequest ` being sent. :param stream: (optional) Whether to stream the request content. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param verify: (optional) Whether to verify SSL certificates. :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. """ conn = self.get_connection(request.url, proxies) self.cert_verify(conn, request.url, verify, cert) url = self.request_url(request, proxies) self.add_headers(request) chunked = not (request.body is None or 'Content-Length' in request.headers) if isinstance(timeout, tuple): try: connect, read = timeout timeout = TimeoutSauce(connect=connect, read=read) except ValueError as e: # this may raise a string formatting error. err = ("Invalid timeout {0}. Pass a (connect, read) " "timeout tuple, or a single float to set " "both timeouts to the same value".format(timeout)) raise ValueError(err) else: timeout = TimeoutSauce(connect=timeout, read=timeout) try: if not chunked: resp = conn.urlopen( method=request.method, url=url, body=request.body, headers=request.headers, redirect=False, assert_same_host=False, preload_content=False, decode_content=False, retries=self.max_retries, timeout=timeout ) # Send the request. else: if hasattr(conn, 'proxy_pool'): conn = conn.proxy_pool low_conn = conn._get_conn(timeout=timeout) try: low_conn.putrequest(request.method, url, skip_accept_encoding=True) for header, value in request.headers.items(): low_conn.putheader(header, value) low_conn.endheaders() for i in request.body: low_conn.send(hex(len(i))[2:].encode('utf-8')) low_conn.send(b'\r\n') low_conn.send(i) low_conn.send(b'\r\n') low_conn.send(b'0\r\n\r\n') r = low_conn.getresponse() resp = HTTPResponse.from_httplib( r, pool=conn, connection=low_conn, preload_content=False, decode_content=False ) except: # If we hit any problems here, clean up the connection. # Then, reraise so that we can handle the actual exception. low_conn.close() raise else: # All is well, return the connection to the pool. conn._put_conn(low_conn) except (ProtocolError, socket.error) as err: raise ConnectionError(err, request=request) except MaxRetryError as e: if isinstance(e.reason, ConnectTimeoutError): raise ConnectTimeout(e, request=request) if isinstance(e.reason, ResponseError): raise RetryError(e, request=request) raise ConnectionError(e, request=request) except _ProxyError as e: raise ProxyError(e) except (_SSLError, _HTTPError) as e: if isinstance(e, _SSLError): raise SSLError(e, request=request) elif isinstance(e, ReadTimeoutError): raise ReadTimeout(e, request=request) else: raise return self.build_response(request, resp) PK[Xaa!site-packages/requests/models.pycnu[ YЅ_c@s`dZddlZddlZddlmZmZddlmZddlm Z ddl m Z ddl m Z mZdd lmZdd lmZdd lmZdd lmZmZmZmZdd lmZmZmZmZmZm Z m!Z!ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9ddl:m;Z;e;j<e;j=e;j>e;j?e;j@fZAdZBddZCdZDe7jEZFdeGfdYZHdeGfdYZIdeIfdYZJdeHeIfdYZKdeGfdYZLdS(s` requests.models ~~~~~~~~~~~~~~~ This module contains the primary objects that power Requests. iN(tBytesIOtUnsupportedOperationi(t default_hooks(tCaseInsensitiveDict(t HTTPBasicAuth(tcookiejar_from_dicttget_cookie_header(t RequestField(tencode_multipart_formdata(t parse_url(t DecodeErrortReadTimeoutErrort ProtocolErrortLocationParseError(t HTTPErrort MissingSchemat InvalidURLtChunkedEncodingErrortContentDecodingErrortConnectionErrortStreamConsumedError( tguess_filenametget_auth_from_urlt requote_uritstream_decode_response_unicodetto_key_val_listtparse_header_linkst iter_slicestguess_json_utft super_lentto_native_string( t cookielibt urlunparseturlsplitt urlencodetstrtbytestStringIOtis_py2tchardettjsont builtin_strt basestring(tcodesii iitRequestEncodingMixincBs5eZedZedZedZRS(cCssg}t|j}|j}|s-d}n|j||j}|rf|jd|j|ndj|S(sBuild the path URL to use.t/t?t(R!turltpathtappendtquerytjoin(tselfR0tpR1R3((s3/usr/lib/python2.7/site-packages/requests/models.pytpath_url5s     cCst|ttfr|St|dr,|St|drg}xt|D]\}}t|tsyt|d r|g}nxl|D]d}|dk r|jt|tr|jdn|t|tr|jdn|fqqWqNWt |dt S|SdS(sEncode parameters in a piece of data. Will successfully encode parameters when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. treadt__iter__sutf-8tdoseqN( t isinstanceR#R$thasattrRR*tNoneR2tencodeR"tTrue(tdatatresulttktvstv((s3/usr/lib/python2.7/site-packages/requests/models.pyt_encode_paramsJs    !3c Cs]|stdnt|tr3tdng}t|pEi}t|pWi}x|D]\}}t|tst|d r|g}nx|D]}|d k rt|tst|}n|jt|tr|j dn|t|tr|j dn|fqqWqdWx|D] \}}d }d } t|t t frt |dkr|\} } qt |dkr|\} } }q|\} } }} nt|p|} |} t| tttfr| } n | j} td|d| d | d | } | jd ||j| q3Wt|\}}||fS( sBuild the body for a multipart/form-data request. Will successfully encode files when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. sFiles must be provided.sData must not be a string.R9sutf-8iitnameR@tfilenametheaderst content_typeN(t ValueErrorR;R*RR<R=R$R#R2tdecodeR>ttupletlisttlenRt bytearrayR8Rtmake_multipartR(tfilesR@t new_fieldstfieldstfieldtvalRDRBtfttfhtfntfptfdatatrftbodyRI((s3/usr/lib/python2.7/site-packages/requests/models.pyt _encode_filesesJ    !3  (t__name__t __module__tpropertyR7t staticmethodRER](((s3/usr/lib/python2.7/site-packages/requests/models.pyR,4stRequestHooksMixincBseZdZdZRS(cCs||jkr"td|nt|tjrK|j|j|n0t|dr{|j|jd|DndS(sProperly register a hook.s1Unsupported event specified, with event name "%s"R9css'|]}t|tjr|VqdS(N(R;t collectionstCallable(t.0th((s3/usr/lib/python2.7/site-packages/requests/models.pys sN(thooksRJR;RcRdR2R<textend(R5teventthook((s3/usr/lib/python2.7/site-packages/requests/models.pyt register_hooks cCs5y|j|j|tSWntk r0tSXdS(siDeregister a previously registered hook. Returns True if the hook existed, False if not. N(RgtremoveR?RJtFalse(R5RiRj((s3/usr/lib/python2.7/site-packages/requests/models.pytderegister_hooks  (R^R_RkRn(((s3/usr/lib/python2.7/site-packages/requests/models.pyRbs tRequestc BsGeZdZddddddddddd ZdZdZRS(sA user-created :class:`Request ` object. Used to prepare a :class:`PreparedRequest `, which is sent to the server. :param method: HTTP method to use. :param url: URL to send. :param headers: dictionary of headers to send. :param files: dictionary of {filename: fileobject} files to multipart upload. :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. :param json: json for the body to attach to the request (if data is not specified). :param params: dictionary of URL parameters to append to the URL. :param auth: Auth handler or (user, pass) tuple. :param cookies: dictionary or CookieJar of cookies to attach to this request. :param hooks: dictionary of callback hooks, for internal usage. Usage:: >>> import requests >>> req = requests.Request('GET', 'http://httpbin.org/get') >>> req.prepare() c Cs|dkrgn|}|dkr*gn|}|dkrBin|}|dkrZin|}| dkrrin| } t|_x6t| jD]"\} } |jd| d| qW||_||_||_||_ ||_ | |_ ||_ ||_ ||_dS(NRiRj(R=RRgRMtitemsRktmethodR0RHRQR@R(tparamstauthtcookies( R5RqR0RHRQR@RrRsRtRgR(RBRD((s3/usr/lib/python2.7/site-packages/requests/models.pyt__init__s"          cCs d|jS(Ns(Rq(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt__repr__scCsqt}|jd|jd|jd|jd|jd|jd|jd|jd|j d |j d |j |S( sXConstructs a :class:`PreparedRequest ` for transmission and returns it.RqR0RHRQR@R(RrRsRtRg( tPreparedRequesttprepareRqR0RHRQR@R(RrRsRtRg(R5R6((s3/usr/lib/python2.7/site-packages/requests/models.pyRxs            N(R^R_t__doc__R=RuRvRx(((s3/usr/lib/python2.7/site-packages/requests/models.pyRos  Rwc BseZdZdZddddddddddd ZdZdZdZdZ dZ ddZ d Z d d Z d Zd ZRS(sThe fully mutable :class:`PreparedRequest ` object, containing the exact bytes that will be sent to the server. Generated from either a :class:`Request ` object or manually. Usage:: >>> import requests >>> req = requests.Request('GET', 'http://httpbin.org/get') >>> r = req.prepare() >>> s = requests.Session() >>> s.send(r) cCs=d|_d|_d|_d|_d|_t|_dS(N(R=RqR0RHt_cookiesR\RRg(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRus      c Csk|j||j|||j||j||j||| |j|||j| dS(s6Prepares the entire request with the given parameters.N(tprepare_methodt prepare_urltprepare_headerstprepare_cookiest prepare_bodyt prepare_autht prepare_hooks( R5RqR0RHRQR@RrRsRtRgR(((s3/usr/lib/python2.7/site-packages/requests/models.pyRx*s   cCs d|jS(Ns(Rq(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRv;scCst}|j|_|j|_|jdk r?|jjnd|_|jdk rf|jjnd|_|j|_|j|_|S(N( RwRqR0RHR=tcopyRzR\Rg(R5R6((s3/usr/lib/python2.7/site-packages/requests/models.pyR>s   ''  cCs1||_|jdk r-|jj|_ndS(sPrepares the given HTTP method.N(RqR=tupper(R5Rq((s3/usr/lib/python2.7/site-packages/requests/models.pyR{Hs c Cst|tr!|jd}ntr3t|n t|}d|krn|jjd rn||_dSy%t |\}}}}}}} Wn"t k r} t | j nX|st dj|n|st d|ny|jdjd}Wntk r*t d nX|p4d } | rJ| d 7} n| |7} |rq| dt|7} n|sd }ntr.t|tr|jd}nt| tr| jd} nt|tr|jd}nt|tr |jd}nt| tr.| jd} q.n|j|} | re|r\d || f}qe| }ntt|| |d|| g}||_dS(sPrepares the given HTTP URL.tutf8t:thttpNsDInvalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?s Invalid URL %r: No host suppliedtidnasutf-8sURL has an invalid label.R/t@R-s%s&%s(R;R$RKR&tunicodeR#tlowert startswithR0R R RtargsRtformatR>t UnicodeErrorRERR R=( R5R0RrtschemeRsthosttportR1R3tfragmenttetnetloct enc_params((s3/usr/lib/python2.7/site-packages/requests/models.pyR|NsZ" %       $cCs8|r(td|jD|_n t|_dS(s Prepares the given HTTP headers.css'|]\}}t||fVqdS(N(R(ReRFtvalue((s3/usr/lib/python2.7/site-packages/requests/models.pys sN(RRpRH(R5RH((s3/usr/lib/python2.7/site-packages/requests/models.pyR}s"cCsd }d }d }|d k r3d}t|}ntt|dt|ttttf g}yt |}Wn t t t fk rd }nX|r|}|rt dn|d k rt||jd  "     cCst|drZt|drZ|jddt|j|jd<|jddnn|dk rt|}|rt||jd` object, which contains a server's response to an HTTP request. t_contentt status_codeRHR0thistorytencodingtreasonRttelapsedtrequestcCstt|jt|_t|_d|_t|_ d|_ d|_ d|_ g|_ d|_ti|_tjd|_d|_dS(Ni(tsuperRRuRmRt_content_consumedR=RRRHtrawR0RRRRRttdatetimet timedeltaRR(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRus         cs0jsjntfdjDS(Nc3s'|]}|t|dfVqdS(N(tgetattrR=(Retattr(R5(s3/usr/lib/python2.7/site-packages/requests/models.pys Ns(RtcontentRt __attrs__(R5((R5s3/usr/lib/python2.7/site-packages/requests/models.pyt __getstate__Gs    cCsQx*|jD]\}}t|||q Wt|dtt|dddS(NRR(RptsetattrR?R=(R5tstateRFR((s3/usr/lib/python2.7/site-packages/requests/models.pyt __setstate__RscCs d|jS(Ns(R(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRvZscCs|jS(s,Returns true if :attr:`status_code` is 'OK'.(tok(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt__bool__]scCs|jS(s,Returns true if :attr:`status_code` is 'OK'.(R(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt __nonzero__ascCs |jdS(s,Allows you to use a response as an iterator.i(t iter_content(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyR9escCs'y|jWntk r"tSXtS(N(traise_for_statusRRmR?(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRis  cCsd|jko|jtkS(sTrue if this Response is a well-formed HTTP redirect that could have been processed automatically (by :meth:`Session.resolve_redirects`). tlocation(RHRtREDIRECT_STATI(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt is_redirectqscCs(d|jko'|jtjtjfkS(s?True if this Response one of the permanant versions of redirectR(RHRR+tmoved_permanentlytpermanent_redirect(R5((s3/usr/lib/python2.7/site-packages/requests/models.pytis_permanent_redirectxscCstj|jdS(s6The apparent encoding, provided by the chardet libraryR(R'tdetectR(R5((s3/usr/lib/python2.7/site-packages/requests/models.pytapparent_encoding}sicsfd}jr9tjtr9tntj}|}jrc|n|}|rt|}n|S(sIterates over the response data. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. The chunk size is the number of bytes it should read into memory. This is not necessarily the length of each item returned as decoding can take place. If decode_unicode is True, content will be decoded using the best available encoding based on the response. c3syy,x%jjdtD] }|VqWWn[tk rP}t|n=tk rn}t|ntk r}t|nXWn?t k rx/trjj }|sPn|VqWnXt_ dS(Ntdecode_content( RtstreamR?R RR RR RRR8R(tchunkR(t chunk_sizeR5(s3/usr/lib/python2.7/site-packages/requests/models.pytgenerates"    (RR;RtboolRRR(R5Rtdecode_unicodeRt reused_chunkst stream_chunkstchunks((RR5s3/usr/lib/python2.7/site-packages/requests/models.pyRs   ccsd}x|jd|d|D]}|dk r>||}n|rV|j|}n |j}|r|dr|r|dd|dkr|j}nd}x|D] }|VqWqW|dk r|VndS(sIterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. .. note:: This method is not reentrant safe. RRiN(R=Rtsplitt splitlinestpop(R5RRt delimitertpendingRtlinestline((s3/usr/lib/python2.7/site-packages/requests/models.pyt iter_liness   .   cCs|jtkry^|jr*tdn|jdkrEd|_n'tj|jt pft|_Wqt k rd|_qXnt |_|jS(s"Content of the response, in bytes.s2The content for this response was already consumediN( RRmRt RuntimeErrorRR=R$R4RtCONTENT_CHUNK_SIZERR?(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRs   +  cCsd}|j}|js"tdS|jdkr=|j}nyt|j|dd}Wn,ttfk rt|jdd}nX|S(sContent of the response, in unicode. If Response.encoding is None, encoding will be guessed using ``chardet``. The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set ``r.encoding`` appropriately before accessing this property. R/terrorstreplaceN(R=RRR#Rt LookupErrorR(R5RR((s3/usr/lib/python2.7/site-packages/requests/models.pyttexts    cKs|j rtt|jdkrtt|j}|dk rty tj|jj||SWqqtk rmqqXqtntj|j |S(sReturns the json-encoded content of a response, if any. :param \*\*kwargs: Optional arguments that ``json.loads`` takes. iN( RRNRRR=R(tloadsRKtUnicodeDecodeErrorR(R5tkwargsR((s3/usr/lib/python2.7/site-packages/requests/models.pyR( s    cCsj|jjd}i}|rft|}x9|D].}|jdpR|jd}|||d|j|jf}n8d|jkoXdknrvd|j|jf}n|rt|d|ndS( s2Raises stored :class:`HTTPError`, if one occurred.R/iis%s Client Error: %siXs%s Server Error: %stresponseN(RRR(R5thttp_error_msg((s3/usr/lib/python2.7/site-packages/requests/models.pyR6scCs |jjS(sReleases the connection back to the pool. Once this method has been called the underlying ``raw`` object must not be accessed again. *Note: Should not normally need to be called explicitly.* (Rt release_conn(R5((s3/usr/lib/python2.7/site-packages/requests/models.pytcloseDsN(R^R_RyRRuRRRvRRR9R`RRRRRmRtITER_CHUNK_SIZER=RRRR(RRR(((s3/usr/lib/python2.7/site-packages/requests/models.pyR s<  ,     .&  (MRyRcRtioRRRgRt structuresRRsRRtRRturllib3.fieldsRturllib3.filepostRt urllib3.utilR turllib3.exceptionsR R R R t exceptionsRRRRRRRtutilsRRRRRRRRRRtcompatRR R!R"R#R$R%R&R'R(R)R*t status_codesR+tmovedtfoundtotherttemporary_redirectRRtDEFAULT_REDIRECT_LIMITRRtdumpsRtobjectR,RbRoRwR(((s3/usr/lib/python2.7/site-packages/requests/models.pyts<  "4FR   nNPK[kwwsite-packages/requests/auth.pyonu[ 4Tc@sdZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z ddl m Z mZddlmZd Zd Zd Zd efd YZdefdYZdefdYZdefdYZdS(s] requests.auth ~~~~~~~~~~~~~ This module contains the authentication handlers for Requests. iN(t b64encodei(turlparsetstr(textract_cookies_to_jar(tparse_dict_headertto_native_string(tcodess!application/x-www-form-urlencodedsmultipart/form-datacCs3dttd||fjdj}|S(sReturns a Basic Auth string.sBasic s%s:%stlatin1(RRtencodetstrip(tusernametpasswordtauthstr((s1/usr/lib/python2.7/site-packages/requests/auth.pyt_basic_auth_strs)tAuthBasecBseZdZdZRS(s4Base class that all auth implementations derive fromcCstddS(NsAuth hooks must be callable.(tNotImplementedError(tselftr((s1/usr/lib/python2.7/site-packages/requests/auth.pyt__call__'s(t__name__t __module__t__doc__R(((s1/usr/lib/python2.7/site-packages/requests/auth.pyR$st HTTPBasicAuthcBs eZdZdZdZRS(s?Attaches HTTP Basic Authentication to the given Request object.cCs||_||_dS(N(R R (RR R ((s1/usr/lib/python2.7/site-packages/requests/auth.pyt__init__-s cCs t|j|j|jd<|S(Nt Authorization(R R R theaders(RR((s1/usr/lib/python2.7/site-packages/requests/auth.pyR1s(RRRRR(((s1/usr/lib/python2.7/site-packages/requests/auth.pyR+s t HTTPProxyAuthcBseZdZdZRS(s=Attaches HTTP Proxy Authentication to a given Request object.cCs t|j|j|jd<|S(NsProxy-Authorization(R R R R(RR((s1/usr/lib/python2.7/site-packages/requests/auth.pyR8s(RRRR(((s1/usr/lib/python2.7/site-packages/requests/auth.pyR6stHTTPDigestAuthcBs;eZdZdZdZdZdZdZRS(s@Attaches HTTP Digest Authentication to the given Request object.cCsC||_||_d|_d|_i|_d|_d|_dS(Ntii(R R t last_noncet nonce_counttchaltNonetpost num_401_calls(RR R ((s1/usr/lib/python2.7/site-packages/requests/auth.pyR?s      cs'|jd}|jd}|jjd}|jjd}|jjd}|dkred}n |j}|dks|dkrd} | n|d krd } | nfd } dkrdSd} t|} | j}| jr|d | j7}nd |j||jf}d||f}|}|}||j krr|j d7_ n d|_ d|j }t |j j d}||j d7}|t jj d7}|tjd7}tj|jd }|dkr d |||f}n|dkrH| |d||f}nP|dksid|jdkrd|||d|f}| ||}ndS||_ d|j||||f}|r|d|7}n|r|d|7}n| r|d| 7}n|r|d||f7}nd|S(Ntrealmtnoncetqopt algorithmtopaquetMD5sMD5-SESScSs4t|tr!|jd}ntj|jS(Nsutf-8(t isinstanceRRthashlibtmd5t hexdigest(tx((s1/usr/lib/python2.7/site-packages/requests/auth.pytmd5_utf8VstSHAcSs4t|tr!|jd}ntj|jS(Nsutf-8(R)RRR*tsha1R,(R-((s1/usr/lib/python2.7/site-packages/requests/auth.pytsha_utf8\scsd||fS(Ns%s:%s((tstd(t hash_utf8(s1/usr/lib/python2.7/site-packages/requests/auth.pytbst?s%s:%s:%ss%s:%sis%08xsutf-8iitautht,s%s:%s:%s:%s:%ss>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"s , opaque="%s"s, algorithm="%s"s , digest="%s"s , qop="auth", nc=%s, cnonce="%s"s Digest %s(RtgetR tupperRtpathtqueryR R RRRRttimetctimetosturandomR*R0R,tsplit(RtmethodturlR#R$R%R&R't _algorithmR.R1tKDtentdigtp_parsedR;tA1tA2tHA1tHA2tncvalueR2tcnoncetrespdigtnoncebittbase((R4s1/usr/lib/python2.7/site-packages/requests/auth.pytbuild_digest_headerHsp                    ! cKs|jrd|_ndS(s)Reset num_401_calls counter on redirects.iN(t is_redirectR"(RRtkwargs((s1/usr/lib/python2.7/site-packages/requests/auth.pythandle_redirects cKs_|jd k r(|jjj|jnt|dd}|jjdd}d|jkrR|dkrR|j d7_ t j ddt j }t |jd|d d|_|j|jj|jj}t|j|j|j|j|j|j|j|j|jd <|jj||}|jj|||_|Sd|_ |S( s:Takes the given response and tries digest-auth, if needed.R"iswww-authenticateRtdigestisdigest tflagstcountRN(R!R trequesttbodytseektgetattrRR9tlowerR"tretcompilet IGNORECASERtsubRtcontenttrawt release_conntcopyRt_cookiestprepare_cookiesRQRBRCt connectiontsendthistorytappend(RRRSR"ts_authtpattprept_r((s1/usr/lib/python2.7/site-packages/requests/auth.pyt handle_401s*!   cCs|jr+|j|j|j|jds       PK[O%P%P#site-packages/requests/sessions.pyonu[ ZЅ_c@sdZddlZddlmZddlmZddlmZddlmZm Z m Z m Z ddl m Z mZmZmZdd lmZmZmZdd lmZmZdd lmZmZmZmZdd lmZmZm Z m!Z!dd l"m#Z#ddl$m%Z%ddl&m'Z'ddlm(Z(m)Z)m*Z*m+Z+m,Z,ddl-m.Z.ddlm/Z/dZ0e dZ1e dZ2de3fdYZ4de4fdYZ5dZ6dS(s requests.session ~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). iN(tMapping(tdatetimei(t_basic_auth_str(t cookielibt OrderedDictturljointurlparse(tcookiejar_from_dicttextract_cookies_to_jartRequestsCookieJart merge_cookies(tRequesttPreparedRequesttDEFAULT_REDIRECT_LIMIT(t default_hookst dispatch_hook(tto_key_val_listtdefault_headerstto_native_stringt DEFAULT_PORTS(tTooManyRedirectst InvalidSchematChunkedEncodingErrortContentDecodingError(tRecentlyUsedContainer(tCaseInsensitiveDict(t HTTPAdapter(t requote_uritget_environ_proxiestget_netrc_authtshould_bypass_proxiestget_auth_from_url(tcodes(tREDIRECT_STATIicCs|dkr|S|dkr |St|to;t|tsB|S|t|}|jt|x0|jD]"\}}|dkrt||=qtqtWtd|jD}|S(s Determines appropriate setting for a given request, taking into account the explicit setting on that request, and the setting in the session. If a setting is a dictionary, they will be merged together using `dict_class` css-|]#\}}|dk r||fVqdS(N(tNone(t.0tktv((s5/usr/lib/python2.7/site-packages/requests/sessions.pys FsN(R"t isinstanceRRtupdatetitemstdict(trequest_settingtsession_settingt dict_classtmerged_settingR$R%((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt merge_setting*s   cCsZ|dks!|jdgkr%|S|dksF|jdgkrJ|St|||S(s Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. tresponseN(R"tgetR.(t request_hookst session_hooksR,((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt merge_hooksKs !!tSessionRedirectMixincBs;eZdZededddZdZdZRS(cCst|}t|}|j|jkr.tS|jdkrn|jdkrn|jdkrn|jdkrntS|j|jk}|j|jk}tj|jddf}| r|j|kr|j|krtS|p|S(sFDecide whether Authorization header should be removed when redirectingthttpiPthttpsiN(iPN(iN( RthostnametTruetschemetportR"tFalseRR0(tselftold_urltnew_urlt old_parsedt new_parsedt changed_porttchanged_schemet default_port((s5/usr/lib/python2.7/site-packages/requests/sessions.pytshould_strip_auth]s  ccs;d}g} x(|jr6|j} |dkrU| j|t| } | |_ny |jWn-tttfk r|j j dt nX||j krt d|j n|j|jd} |j} | jdr t|j}d|j| f} nt| }|j} |jsEt|jt| } n t| } t| | _|jr|j| jkr| j|j|j>> import requests >>> s = requests.Session() >>> s.get('http://httpbin.org/get') 200 R\RmtauthROthookstparamsRMRNtprefetchtadaptersRKR}RZcCst|_d|_i|_t|_i|_t|_ t |_ d|_ t |_t |_ti|_t|_|jdt|jdttt|_dS(Nshttps://shttp://(RR\R"RRORRRR;RKR8RMRNR RZR}RRmRRtmountRRtREDIRECT_CACHE_SIZERc(R<((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt__init__3s           cCs|S(N((R<((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt __enter__iscGs|jdS(N(R[(R<targs((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt__exit__lscCs*|jp i}t|tjs0t|}nttt|j|}|j}|jr| r|j rt |j }nt }|j d|j jd|j d|jd|jd|jdt|j|jdtdt|j|jd t||jd |d t|j|j |S( sbConstructs a :class:`PreparedRequest ` for transmission and returns it. The :class:`PreparedRequest` has settings merged from the :class:`Request ` instance and those of the :class:`Session`. :param request: :class:`Request` instance to prepare with this session's settings. R]R_tfilestdatatjsonR\R,RRRmR(RmR&Rt CookieJarRR R RR}RR_R tprepareR]tupperRRRR.R\RRR3R(R<R|Rmtmerged_cookiesRtp((s5/usr/lib/python2.7/site-packages/requests/sessions.pytprepare_requestos*        cCst|}td|jd|d|d|d|p9id|d|pKid|d |d | }|j|}| p{i} |j|j| | ||}i| d 6| d 6}|j||j||}|S( sCConstructs a :class:`Request `, prepares it and sends it. Returns :class:`Response ` object. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param allow_redirects: (optional) Set to True by default. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. R]R_R\RRRRRRmRRLRP(RR RRtmerge_environment_settingsR_R'Rq(R<R]R_RRR\RmRRRLRPRORRKRMRNRRstpreptsettingst send_kwargsRr((s5/usr/lib/python2.7/site-packages/requests/sessions.pyR|s,2        cKs#|jdt|jd||S(sSends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. RPRH(RR8R|(R<R_tkwargs((s5/usr/lib/python2.7/site-packages/requests/sessions.pyR0scKs#|jdt|jd||S(sSends a OPTIONS request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. RPtOPTIONS(RR8R|(R<R_R((s5/usr/lib/python2.7/site-packages/requests/sessions.pytoptionsscKs#|jdt|jd||S(sSends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. RPRG(RR;R|(R<R_R((s5/usr/lib/python2.7/site-packages/requests/sessions.pytheadscKs|jd|d|d||S(sSends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. RIRR(R|(R<R_RRR((s5/usr/lib/python2.7/site-packages/requests/sessions.pytposts cKs|jd|d||S(s7Sends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. tPUTR(R|(R<R_RR((s5/usr/lib/python2.7/site-packages/requests/sessions.pytputscKs|jd|d||S(s9Sends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. tPATCHR(R|(R<R_RR((s5/usr/lib/python2.7/site-packages/requests/sessions.pytpatchscKs|jd||S(sSends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. tDELETE(R|(R<R_R((s5/usr/lib/python2.7/site-packages/requests/sessions.pytdelete'sc Ksq|jd|j|jd|j|jd|j|jd|jt|tsjtdnt}xT|j |j kr|j |j |j j |j }||krPn||_ qvW|j dt}|j d}|j d}|j d}|j d} |j d} |j} |jd|j } tj} | j||}tj| |_td | ||}|jrx-|jD]}t|j|j|jqWnt|j||j|j||d|d|d|d| d| }|r)g|D]}|^qng}|r]|jd ||j }||_n|sm|jn|S( sSend a given PreparedRequest.RKRMRNROs#You can only send PreparedRequests.RPRLR_R/i(RRKRMRNROR&R t ValueErrortsetR_RctaddR0tpopR8Rt get_adapterRtutcnowRqtelapsedRRURRmR|RXRztinsertRV(R<R|Rt checked_urlsR>RPRKRLRMRNRORtadaptertstarttrRrtgenRU((s5/usr/lib/python2.7/site-packages/requests/sessions.pyRq0sV        %   c Cs|jrt|pi}x*|jD]\}}|j||q(W|tks`|dkrtjjdptjjd}qnt ||j }t ||j }t ||j }t ||j }i|d6|d6|d6|d6S(s6Check the environment and merge it with some settings.tREQUESTS_CA_BUNDLEtCURL_CA_BUNDLERMRORKRNN(R}RR(RR8R"tostenvironR0R.RORKRMRN( R<R_RORKRMRNt env_proxiesR$R%((s5/usr/lib/python2.7/site-packages/requests/sessions.pyRs cCsMx6|jjD]%\}}|jj|r|SqWtd|dS(s>Returns the appropriate connnection adapter for the given URL.s*No connection adapters were found for '%s'N(RR(tlowerR^R(R<R_tprefixR((s5/usr/lib/python2.7/site-packages/requests/sessions.pyRscCs(x!|jjD]}|jqWdS(s+Closes all adapters and as such the sessionN(RtvaluesR[(R<R%((s5/usr/lib/python2.7/site-packages/requests/sessions.pyR[scCso||j|sRc(R)t __attrs__Rc(R<tstate((R<s5/usr/lib/python2.7/site-packages/requests/sessions.pyt __getstate__scCs||jdi}x*|jD]\}}t|||qWtt|_x'|jD]\}}||j| s. """"( ! PK[|ȴ%site-packages/requests/exceptions.pycnu[ YЅ_c@sdZddlmZdefdYZdefdYZdefdYZd efd YZd efd YZd efdYZ dee fdYZ de fdYZ defdYZ defdYZ deefdYZdeefdYZdeefdYZdefdYZdeefd YZd!eefd"YZd#efd$YZd%S(&sa requests.exceptions ~~~~~~~~~~~~~~~~~~~ This module contains the set of Requests' exceptions. i(t HTTPErrortRequestExceptioncBseZdZdZRS(sOThere was an ambiguous exception that occurred while handling your request.cOs|jdd}||_|jdd|_|dk rg|j rgt|drg|jj|_ntt|j||dS(sT Initialize RequestException with `request` and `response` objects. tresponsetrequestN(tpoptNoneRRthasattrtsuperRt__init__(tselftargstkwargsR((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRs (t__name__t __module__t__doc__R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR sRcBseZdZRS(sAn HTTP error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRstConnectionErrorcBseZdZRS(sA Connection error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR"st ProxyErrorcBseZdZRS(sA proxy error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR&stSSLErrorcBseZdZRS(sAn SSL error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR*stTimeoutcBseZdZRS(sThe request timed out. Catching this error will catch both :exc:`~requests.exceptions.ConnectTimeout` and :exc:`~requests.exceptions.ReadTimeout` errors. (R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR.stConnectTimeoutcBseZdZRS(sThe request timed out while trying to connect to the remote server. Requests that produced this error are safe to retry. (R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR7st ReadTimeoutcBseZdZRS(s@The server did not send any data in the allotted amount of time.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR>st URLRequiredcBseZdZRS(s*A valid URL is required to make a request.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRBstTooManyRedirectscBseZdZRS(sToo many redirects.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRFst MissingSchemacBseZdZRS(s/The URL schema (e.g. http or https) is missing.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRJst InvalidSchemacBseZdZRS(s"See defaults.py for valid schemas.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRNst InvalidURLcBseZdZRS(s' The URL provided was somehow invalid. (R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRRstChunkedEncodingErrorcBseZdZRS(s?The server declared chunked encoding but sent an invalid chunk.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRVstContentDecodingErrorcBseZdZRS(s!Failed to decode response content(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRZstStreamConsumedErrorcBseZdZRS(s2The content for this response was already consumed(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR^st RetryErrorcBseZdZRS(sCustom retries logic failed(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRbsN(Rturllib3.exceptionsRt BaseHTTPErrortIOErrorRRRRRRRRRt ValueErrorRRRRRt TypeErrorRR(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyt s$ PK[} #site-packages/requests/__init__.pyonu[ ZЅ_c@sdZdZdZdZdZdZdZyddlmZej Wne k r[nXd d l m Z d d l mZmZmZd d lmZmZmZmZmZmZmZmZd d lmZmZd dlmZd dlm Z m!Z!m"Z"m#Z#m$Z$m%Z%d dl m&Z&ddl'Z'yddl'm(Z(Wn*e k rrde'j)fdYZ(nXe'j*e+j,e(dS(s requests HTTP library ~~~~~~~~~~~~~~~~~~~~~ Requests is an HTTP library, written in Python, for human beings. Basic GET usage: >>> import requests >>> r = requests.get('https://www.python.org') >>> r.status_code 200 >>> 'Python is a programming language' in r.content True ... or POST: >>> payload = dict(key1='value1', key2='value2') >>> r = requests.post('http://httpbin.org/post', data=payload) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... } The other HTTP methods are supported - see `requests.api`. Full documentation is at . :copyright: (c) 2015 by Kenneth Reitz. :license: Apache 2.0, see LICENSE for more details. trequestss2.6.0is Kenneth Reitzs Apache 2.0sCopyright 2015 Kenneth Reitzi(t pyopenssli(tutils(tRequesttResponsetPreparedRequest(trequesttgettheadtposttpatchtputtdeletetoptions(tsessiontSession(tcodes(tRequestExceptiontTimeoutt URLRequiredtTooManyRedirectst HTTPErrortConnectionError(tpackagesN(t NullHandlerRcBseZdZRS(cCsdS(N((tselftrecord((s5/usr/lib/python2.7/site-packages/requests/__init__.pytemitKs(t__name__t __module__R(((s5/usr/lib/python2.7/site-packages/requests/__init__.pyRJs(-t__doc__t __title__t __version__t __build__t __author__t __license__t __copyright__turllib3.contribRtinject_into_urllib3t ImportErrortRtmodelsRRRtapiRRRR R R R R tsessionsRRt status_codesRt exceptionsRRRRRRRtloggingRtHandlert getLoggerRt addHandler(((s5/usr/lib/python2.7/site-packages/requests/__init__.pyt*s0 :.  PK[NP=P=#site-packages/requests/adapters.pyonu[ YЅ_c@sdZddlZddlmZddlmZmZddlmZddl m Z ddl m Z dd lmZmZdd lmZmZmZmZmZdd lmZdd lmZdd lmZddlmZddlmZddlm Z ddlm!Z!ddlm"Z#ddlm$Z$ddl%m&Z&ddl'm(Z(m)Z)m*Z*m"Z"mZm+Z+ddl,m-Z-e.Z/dZ0dZ1de2fdYZ3de3fdYZ4dS(s requests.adapters ~~~~~~~~~~~~~~~~~ This module contains the transport adapters that Requests uses to define and maintain connections. iNi(tResponse(t PoolManagertproxy_from_url(t HTTPResponse(tTimeout(tRetry(turlparset basestring(tDEFAULT_CA_BUNDLE_PATHtget_encoding_from_headerstprepend_scheme_if_neededtget_auth_from_urlt urldefragauth(tCaseInsensitiveDict(tConnectTimeoutError(t HTTPError(t MaxRetryError(t ProxyError(t ProtocolError(tReadTimeoutError(tSSLError(t ResponseError(textract_cookies_to_jar(tConnectionErrortConnectTimeoutt ReadTimeoutRRt RetryError(t_basic_auth_stri it BaseAdaptercBs)eZdZdZdZdZRS(sThe Base Transport AdaptercCstt|jdS(N(tsuperRt__init__(tself((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR+scCs tdS(N(tNotImplementedError(R((s5/usr/lib/python2.7/site-packages/requests/adapters.pytsend.scCs tdS(N(R (R((s5/usr/lib/python2.7/site-packages/requests/adapters.pytclose1s(t__name__t __module__t__doc__RR!R"(((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR(s  t HTTPAdaptercBseZdZdddddgZeeeedZdZdZ ed Z d Z d Z d Z dd ZdZdZdZdZededddZRS(sThe built-in HTTP Adapter for urllib3. Provides a general-case interface for Requests sessions to contact HTTP and HTTPS urls by implementing the Transport Adapter interface. This class will usually be created by the :class:`Session ` class under the covers. :param pool_connections: The number of urllib3 connection pools to cache. :param pool_maxsize: The maximum number of connections to save in the pool. :param int max_retries: The maximum number of retries each connection should attempt. Note, this applies only to failed DNS lookups, socket connections and connection timeouts, never to requests where data has made it to the server. By default, Requests does not retry failed connections. If you need granular control over the conditions under which we retry a request, import urllib3's ``Retry`` class and pass that instead. :param pool_block: Whether the connection pool should block for connections. Usage:: >>> import requests >>> s = requests.Session() >>> a = requests.adapters.HTTPAdapter(max_retries=3) >>> s.mount('http://', a) t max_retriestconfigt_pool_connectionst _pool_maxsizet _pool_blockcCs|tkr$tddt|_ntj||_i|_i|_tt|j ||_ ||_ ||_ |j ||d|dS(Nitreadtblock(tDEFAULT_RETRIESRtFalseR'tfrom_intR(t proxy_managerRR&RR)R*R+tinit_poolmanager(Rtpool_connectionst pool_maxsizeR't pool_block((s5/usr/lib/python2.7/site-packages/requests/adapters.pyRRs      cstfdjDS(Nc3s'|]}|t|dfVqdS(N(tgetattrtNone(t.0tattr(R(s5/usr/lib/python2.7/site-packages/requests/adapters.pys es(tdictt __attrs__(R((Rs5/usr/lib/python2.7/site-packages/requests/adapters.pyt __getstate__dscCsbi|_i|_x*|jD]\}}t|||qW|j|j|jd|jdS(NR-(R1R(titemstsetattrR2R)R*R+(RtstateR9tvalue((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt __setstate__hs   c KsF||_||_||_td|d|d|dt||_dS(sInitializes a urllib3 PoolManager. This method should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param connections: The number of urllib3 connection pools to cache. :param maxsize: The maximum number of connections to save in the pool. :param block: Block when no free connections are available. :param pool_kwargs: Extra keyword arguments used to initialize the Pool Manager. t num_poolstmaxsizeR-tstrictN(R)R*R+RtTruet poolmanager(Rt connectionsRCR-t pool_kwargs((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR2ts   c Ksc||jkrX|j|}t|d|d|jd|jd|j||j|`. :param proxy: The proxy to return a urllib3 ProxyManager for. :param proxy_kwargs: Extra keyword arguments used to configure the Proxy Manager. :returns: ProxyManager t proxy_headersRBRCR-(R1RIRR)R*R+(Rtproxyt proxy_kwargsRI((s5/usr/lib/python2.7/site-packages/requests/adapters.pytproxy_manager_fors   cCs|jjdro|rod}|tk r6|}n|sEt}n|sZtdnd|_||_nd|_d|_|rt|t s|d|_ |d|_ q||_ ndS(sVerify a SSL certificate. This method should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param conn: The urllib3 connection object associated with the cert. :param url: The requested URL. :param verify: Whether we should actually verify the certificate. :param cert: The SSL certificate to verify. thttpss4Could not find a suitable SSL CA certificate bundle.t CERT_REQUIREDt CERT_NONEiiN( tlowert startswithR7RERt Exceptiont cert_reqstca_certst isinstanceRt cert_filetkey_file(Rtconnturltverifytcerttcert_loc((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt cert_verifys"         cCst}t|dd|_tt|di|_t|j|_||_|jj |_ t |j t r|j j d|_ n |j |_ t|j||||_||_|S(sBuilds a :class:`Response ` object from a urllib3 response. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter ` :param req: The :class:`PreparedRequest ` used to generate the response. :param resp: The urllib3 response object. tstatustheaderssutf-8N(RR6R7t status_codeR R_R tencodingtrawtreasonRURYtbytestdecodeRtcookiestrequestt connection(Rtreqtresptresponse((s5/usr/lib/python2.7/site-packages/requests/adapters.pytbuild_responses     cCs|p i}|jt|jj}|r`t|d}|j|}|j|}n*t|}|j}|jj|}|S(seReturns a urllib3 connection for the given URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param url: The URL to connect to. :param proxies: (optional) A Requests-style dictionary of proxies used on this request. thttp( tgetRRPtschemeR RLtconnection_from_urltgeturlRF(RRYtproxiesRJR1RXtparsed((s5/usr/lib/python2.7/site-packages/requests/adapters.pytget_connections   cCs|jjdS(sDisposes of any internal state. Currently, this just closes the PoolManager, which closes pooled connections. N(RFtclear(R((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR"scCs^|p i}t|jj}|j|}|rQ|dkrQt|j}n |j}|S(sObtain the url to use when making the final request. If the message is being sent through a HTTP proxy, the full URL has to be used. Otherwise, we should only use the path portion of the URL. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param request: The :class:`PreparedRequest ` being sent. :param proxies: A dictionary of schemes to proxy URLs. RM(RRYRoRnR tpath_url(RRgRrRoRJRY((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt request_urls  cKsdS(s"Add any headers needed by the connection. As of v2.0 this does nothing by default, but is left for overriding by users that subclass the :class:`HTTPAdapter `. This should not be called from user code, and is only exposed for use when subclassing the :class:`HTTPAdapter `. :param request: The :class:`PreparedRequest ` to add headers to. :param kwargs: The keyword arguments from the call to send(). N((RRgtkwargs((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt add_headerss cCs>i}t|\}}|r:|r:t|||d`. :param proxies: The url of the proxy being used for this request. :param kwargs: Optional additional keyword arguments. sProxy-Authorization(R R(RRJR_tusernametpassword((s5/usr/lib/python2.7/site-packages/requests/adapters.pyRI-s  cCs|j|j|}|j||j|||j||}|j||jdkphd|jk } t|t ry%|\} } t d| d| }Wqt k r} dj |} t | qXnt d|d|}y| sI|j d|jd|d|jd|jd td td td td |jd| }nIt|drd|j}n|jd|}y|j|j|dtx-|jjD]\}}|j||qW|jx^|jD]S}|jtt|djd|jd|j||jdqW|jd|j}tj|d|d|d td t}Wn|j nX|j!|Wn!t"t#j$fk r} t%| d|nt&k r5} t| j't(rt)| d|nt| j't*r t+| d|nt%| d|nt,k rS} t-| ndt.t/fk r} t| t.rt0| d|qt| t1rt2| d|qnX|j3||S(sSends PreparedRequest object. Returns Response object. :param request: The :class:`PreparedRequest ` being sent. :param stream: (optional) Whether to stream the request content. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param verify: (optional) Whether to verify SSL certificates. :param cert: (optional) Any user-provided SSL certificate to be trusted. :param proxies: (optional) The proxies dictionary to apply to the request. sContent-LengthtconnectR,ssInvalid timeout {0}. Pass a (connect, read) timeout tuple, or a single float to set both timeouts to the same valuetmethodRYtbodyR_tredirecttassert_same_hosttpreload_contenttdecode_contenttretriesttimeoutt proxy_pooltskip_accept_encodingisutf-8s s0 tpoolRhRgN(4RtRYR]RwRyR~R7R_RUttuplet TimeoutSaucet ValueErrortformatturlopenR}R/R'thasattrRt _get_connt putrequestRER=t putheadert endheadersR!thextlentencodet getresponseRt from_httplibR"t _put_connRtsocketterrorRRRcRRRRt _ProxyErrorRt _SSLErrort _HTTPErrorRRRRl(RRgtstreamRRZR[RrRXRYtchunkedR|R,teterrRjtlow_conntheaderR@titr((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR!Cs            &      N(R#R$R%R;tDEFAULT_POOLSIZER.tDEFAULT_POOLBLOCKRR<RAR2RLR]RlR7RtR"RwRyRIR/RER!(((s5/usr/lib/python2.7/site-packages/requests/adapters.pyR&5s$       % $     (5R%RtmodelsRturllib3.poolmanagerRRturllib3.responseRt urllib3.utilRRturllib3.util.retryRtcompatRRtutilsRR R R R t structuresR turllib3.exceptionsRRRRRRRRRRRRfRt exceptionsRRRRtauthRR/RRR.tobjectRR&(((s5/usr/lib/python2.7/site-packages/requests/adapters.pyt s2 (. PK[eռ66site-packages/requests/auth.pynu[# -*- coding: utf-8 -*- """ requests.auth ~~~~~~~~~~~~~ This module contains the authentication handlers for Requests. """ import os import re import time import hashlib from base64 import b64encode from .compat import urlparse, str from .cookies import extract_cookies_to_jar from .utils import parse_dict_header, to_native_string from .status_codes import codes CONTENT_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded' CONTENT_TYPE_MULTI_PART = 'multipart/form-data' def _basic_auth_str(username, password): """Returns a Basic Auth string.""" authstr = 'Basic ' + to_native_string( b64encode(('%s:%s' % (username, password)).encode('latin1')).strip() ) return authstr class AuthBase(object): """Base class that all auth implementations derive from""" def __call__(self, r): raise NotImplementedError('Auth hooks must be callable.') class HTTPBasicAuth(AuthBase): """Attaches HTTP Basic Authentication to the given Request object.""" def __init__(self, username, password): self.username = username self.password = password def __call__(self, r): r.headers['Authorization'] = _basic_auth_str(self.username, self.password) return r class HTTPProxyAuth(HTTPBasicAuth): """Attaches HTTP Proxy Authentication to a given Request object.""" def __call__(self, r): r.headers['Proxy-Authorization'] = _basic_auth_str(self.username, self.password) return r class HTTPDigestAuth(AuthBase): """Attaches HTTP Digest Authentication to the given Request object.""" def __init__(self, username, password): self.username = username self.password = password self.last_nonce = '' self.nonce_count = 0 self.chal = {} self.pos = None self.num_401_calls = 1 def build_digest_header(self, method, url): realm = self.chal['realm'] nonce = self.chal['nonce'] qop = self.chal.get('qop') algorithm = self.chal.get('algorithm') opaque = self.chal.get('opaque') if algorithm is None: _algorithm = 'MD5' else: _algorithm = algorithm.upper() # lambdas assume digest modules are imported at the top level if _algorithm == 'MD5' or _algorithm == 'MD5-SESS': def md5_utf8(x): if isinstance(x, str): x = x.encode('utf-8') return hashlib.md5(x).hexdigest() hash_utf8 = md5_utf8 elif _algorithm == 'SHA': def sha_utf8(x): if isinstance(x, str): x = x.encode('utf-8') return hashlib.sha1(x).hexdigest() hash_utf8 = sha_utf8 KD = lambda s, d: hash_utf8("%s:%s" % (s, d)) if hash_utf8 is None: return None # XXX not implemented yet entdig = None p_parsed = urlparse(url) path = p_parsed.path if p_parsed.query: path += '?' + p_parsed.query A1 = '%s:%s:%s' % (self.username, realm, self.password) A2 = '%s:%s' % (method, path) HA1 = hash_utf8(A1) HA2 = hash_utf8(A2) if nonce == self.last_nonce: self.nonce_count += 1 else: self.nonce_count = 1 ncvalue = '%08x' % self.nonce_count s = str(self.nonce_count).encode('utf-8') s += nonce.encode('utf-8') s += time.ctime().encode('utf-8') s += os.urandom(8) cnonce = (hashlib.sha1(s).hexdigest()[:16]) if _algorithm == 'MD5-SESS': HA1 = hash_utf8('%s:%s:%s' % (HA1, nonce, cnonce)) if qop is None: respdig = KD(HA1, "%s:%s" % (nonce, HA2)) elif qop == 'auth' or 'auth' in qop.split(','): noncebit = "%s:%s:%s:%s:%s" % ( nonce, ncvalue, cnonce, 'auth', HA2 ) respdig = KD(HA1, noncebit) else: # XXX handle auth-int. return None self.last_nonce = nonce # XXX should the partial digests be encoded too? base = 'username="%s", realm="%s", nonce="%s", uri="%s", ' \ 'response="%s"' % (self.username, realm, nonce, path, respdig) if opaque: base += ', opaque="%s"' % opaque if algorithm: base += ', algorithm="%s"' % algorithm if entdig: base += ', digest="%s"' % entdig if qop: base += ', qop="auth", nc=%s, cnonce="%s"' % (ncvalue, cnonce) return 'Digest %s' % (base) def handle_redirect(self, r, **kwargs): """Reset num_401_calls counter on redirects.""" if r.is_redirect: self.num_401_calls = 1 def handle_401(self, r, **kwargs): """Takes the given response and tries digest-auth, if needed.""" if self.pos is not None: # Rewind the file position indicator of the body to where # it was to resend the request. r.request.body.seek(self.pos) num_401_calls = getattr(self, 'num_401_calls', 1) s_auth = r.headers.get('www-authenticate', '') if 'digest' in s_auth.lower() and num_401_calls < 2: self.num_401_calls += 1 pat = re.compile(r'digest ', flags=re.IGNORECASE) self.chal = parse_dict_header(pat.sub('', s_auth, count=1)) # Consume content and release the original connection # to allow our new request to reuse the same one. r.content r.raw.release_conn() prep = r.request.copy() extract_cookies_to_jar(prep._cookies, r.request, r.raw) prep.prepare_cookies(prep._cookies) prep.headers['Authorization'] = self.build_digest_header( prep.method, prep.url) _r = r.connection.send(prep, **kwargs) _r.history.append(r) _r.request = prep return _r self.num_401_calls = 1 return r def __call__(self, r): # If we have a saved nonce, skip the 401 if self.last_nonce: r.headers['Authorization'] = self.build_digest_header(r.method, r.url) try: self.pos = r.body.tell() except AttributeError: # In the case of HTTPDigestAuth being reused and the body of # the previous request was a file-like object, pos has the # file position of the previous body. Ensure it's set to # None. self.pos = None r.register_hook('response', self.handle_401) r.register_hook('response', self.handle_redirect) return r PK["L>~~!site-packages/requests/compat.pyonu[ YЅ_c@sLdZddlZddlZejZeddkZeddkZyddlZWn#e e fk r|ddlZnXersddl m Z m Z mZmZmZmZmZddlmZmZmZmZmZddlmZddlZdd lmZdd lmZydd lmZWndd l mZnXe!Z"e!Z#e$Z!e%Z%e&e'e(fZ)nerHdd l*mZmZmZmZmZm Z m Z mZmZmZdd l+mZmZmZddl,m-Zdd l.mZdd l/mZdd lmZe!Z"e!Z!e#Z#e!e#fZ%e&e(fZ)ndS(s pythoncompat iNiii(tquotetunquotet quote_plust unquote_plust urlencodet getproxiest proxy_bypass(turlparset urlunparseturljointurlsplitt urldefrag(tparse_http_list(tMorsel(tStringIO(t OrderedDict( RRR R RRRRRR (R RR(t cookiejar(0t__doc__tchardettsyst version_infot_vertis_py2tis_py3t simplejsontjsont ImportErrort SyntaxErrorturllibRRRRRRRRRR R R turllib2R t cookielibtCookieR Rt collectionsRt ordereddicttstrt builtin_strtbytestunicodet basestringtinttlongtfloatt numeric_typest urllib.parseturllib.requestthttpRt http.cookiestio(((s3/usr/lib/python2.7/site-packages/requests/compat.pytsJ   4( F PK[ h5O5O"site-packages/requests/cookies.pycnu[ >uTc@s$dZddlZddlZddlmZmZmZmZyddlZeWne k rsddl ZnXde fdYZ de fdYZ d Zd Zddd Zd efd YZdejejfdYZdZdZdedZdZdS(s Compatibility code to be able to use `cookielib.CookieJar` with requests. requests.utils imports from here, so be careful with imports. iNi(t cookielibturlparset urlunparsetMorselt MockRequestcBseZdZdZdZdZdZdZdZdZ ddZ d Z d Z d Zed Zed ZedZRS(sWraps a `requests.Request` to mimic a `urllib2.Request`. The code in `cookielib.CookieJar` expects this interface in order to correctly manage cookie policies, i.e., determine whether a cookie can be set, given the domains of the request and the cookie. The original request object is read-only. The client is responsible for collecting the new headers via `get_new_headers()` and interpreting them appropriately. You probably want `get_cookie_header`, defined below. cCs.||_i|_t|jjj|_dS(N(t_rt _new_headersRturltschemettype(tselftrequest((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt__init__!s  cCs|jS(N(R (R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytget_type&scCst|jjjS(N(RRRtnetloc(R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytget_host)scCs |jS(N(R(R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytget_origin_req_host,scCsl|jjjds|jjS|jjd}t|jj}t|j||j|j|j |j gS(NtHost( RtheaderstgetRRRRtpathtparamstquerytfragment(R thosttparsed((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt get_full_url/s cCstS(N(tTrue(R ((s4/usr/lib/python2.7/site-packages/requests/cookies.pytis_unverifiable=scCs||jjkp||jkS(N(RRR(R tname((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt has_header@scCs%|jjj||jj||S(N(RRRR(R Rtdefault((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt get_headerCscCstddS(sMcookielib has no legitimate use for this method; add it back if you find one.s=Cookie headers should be added with add_unredirected_header()N(tNotImplementedError(R tkeytval((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt add_headerFscCs||j|Requests uses this method internally to get cookie values. Takes as args name and optional domain and path. Returns a cookie.value. If there are conflicting cookies, _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown if there are conflicting cookies.sname=%r, domain=%r, path=%rN(RRRR-R@RR%RJ(R RR@RRE((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt_find5s cCsd}xt|D]|}|j|kr|dksC|j|kr|dks^|j|kr|dk r}td|n|j}qqqqW|r|Std|||fdS(sRBoth ``__get_item__`` and ``get`` call this function: it's never used elsewhere in Requests. Takes as args name and optional domain and path. Returns a cookie.value. Throws KeyError if cookie is not found and CookieConflictError if there are multiple cookies that match name and optionally domain and path.s(There are multiple cookies with name, %rsname=%r, domain=%r, path=%rN(R-RRRR@RRGR%RJ(R RR@RttoReturnRE((s4/usr/lib/python2.7/site-packages/requests/cookies.pyRICs cCs |jj}|jd|S(s4Unlike a normal CookieJar, this class is pickleable.t _cookies_lock(t__dict__tcopytpop(R tstate((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt __getstate__Vs cCs5|jj|d|jkr1tj|_ndS(s4Unlike a normal CookieJar, this class is pickleable.RqN(RrRmt threadingtRLockRq(R Ru((s4/usr/lib/python2.7/site-packages/requests/cookies.pyt __setstate__]scCst}|j||S(s(Return a copy of this RequestsCookieJar.(RHRm(R tnew_cj((s4/usr/lib/python2.7/site-packages/requests/cookies.pyRscs  N(R*R+R,R-RRQRSRURVRWRXRYR[R]R_RaRbRcRdRNRmRoRIRvRyRs(((s4/usr/lib/python2.7/site-packages/requests/cookies.pyRHs.                cKstddd|d|dddddd d td dd td ddddidd6dt }t|t|}|rd}t|t|n|j|t|d|ds&  "  H   # PK[kwwsite-packages/requests/auth.pycnu[ 4Tc@sdZddlZddlZddlZddlZddlmZddlmZm Z ddl m Z ddl m Z mZddlmZd Zd Zd Zd efd YZdefdYZdefdYZdefdYZdS(s] requests.auth ~~~~~~~~~~~~~ This module contains the authentication handlers for Requests. iN(t b64encodei(turlparsetstr(textract_cookies_to_jar(tparse_dict_headertto_native_string(tcodess!application/x-www-form-urlencodedsmultipart/form-datacCs3dttd||fjdj}|S(sReturns a Basic Auth string.sBasic s%s:%stlatin1(RRtencodetstrip(tusernametpasswordtauthstr((s1/usr/lib/python2.7/site-packages/requests/auth.pyt_basic_auth_strs)tAuthBasecBseZdZdZRS(s4Base class that all auth implementations derive fromcCstddS(NsAuth hooks must be callable.(tNotImplementedError(tselftr((s1/usr/lib/python2.7/site-packages/requests/auth.pyt__call__'s(t__name__t __module__t__doc__R(((s1/usr/lib/python2.7/site-packages/requests/auth.pyR$st HTTPBasicAuthcBs eZdZdZdZRS(s?Attaches HTTP Basic Authentication to the given Request object.cCs||_||_dS(N(R R (RR R ((s1/usr/lib/python2.7/site-packages/requests/auth.pyt__init__-s cCs t|j|j|jd<|S(Nt Authorization(R R R theaders(RR((s1/usr/lib/python2.7/site-packages/requests/auth.pyR1s(RRRRR(((s1/usr/lib/python2.7/site-packages/requests/auth.pyR+s t HTTPProxyAuthcBseZdZdZRS(s=Attaches HTTP Proxy Authentication to a given Request object.cCs t|j|j|jd<|S(NsProxy-Authorization(R R R R(RR((s1/usr/lib/python2.7/site-packages/requests/auth.pyR8s(RRRR(((s1/usr/lib/python2.7/site-packages/requests/auth.pyR6stHTTPDigestAuthcBs;eZdZdZdZdZdZdZRS(s@Attaches HTTP Digest Authentication to the given Request object.cCsC||_||_d|_d|_i|_d|_d|_dS(Ntii(R R t last_noncet nonce_counttchaltNonetpost num_401_calls(RR R ((s1/usr/lib/python2.7/site-packages/requests/auth.pyR?s      cs'|jd}|jd}|jjd}|jjd}|jjd}|dkred}n |j}|dks|dkrd} | n|d krd } | nfd } dkrdSd} t|} | j}| jr|d | j7}nd |j||jf}d||f}|}|}||j krr|j d7_ n d|_ d|j }t |j j d}||j d7}|t jj d7}|tjd7}tj|jd }|dkr d |||f}n|dkrH| |d||f}nP|dksid|jdkrd|||d|f}| ||}ndS||_ d|j||||f}|r|d|7}n|r|d|7}n| r|d| 7}n|r|d||f7}nd|S(Ntrealmtnoncetqopt algorithmtopaquetMD5sMD5-SESScSs4t|tr!|jd}ntj|jS(Nsutf-8(t isinstanceRRthashlibtmd5t hexdigest(tx((s1/usr/lib/python2.7/site-packages/requests/auth.pytmd5_utf8VstSHAcSs4t|tr!|jd}ntj|jS(Nsutf-8(R)RRR*tsha1R,(R-((s1/usr/lib/python2.7/site-packages/requests/auth.pytsha_utf8\scsd||fS(Ns%s:%s((tstd(t hash_utf8(s1/usr/lib/python2.7/site-packages/requests/auth.pytbst?s%s:%s:%ss%s:%sis%08xsutf-8iitautht,s%s:%s:%s:%s:%ss>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"s , opaque="%s"s, algorithm="%s"s , digest="%s"s , qop="auth", nc=%s, cnonce="%s"s Digest %s(RtgetR tupperRtpathtqueryR R RRRRttimetctimetosturandomR*R0R,tsplit(RtmethodturlR#R$R%R&R't _algorithmR.R1tKDtentdigtp_parsedR;tA1tA2tHA1tHA2tncvalueR2tcnoncetrespdigtnoncebittbase((R4s1/usr/lib/python2.7/site-packages/requests/auth.pytbuild_digest_headerHsp                    ! cKs|jrd|_ndS(s)Reset num_401_calls counter on redirects.iN(t is_redirectR"(RRtkwargs((s1/usr/lib/python2.7/site-packages/requests/auth.pythandle_redirects cKs_|jd k r(|jjj|jnt|dd}|jjdd}d|jkrR|dkrR|j d7_ t j ddt j }t |jd|d d|_|j|jj|jj}t|j|j|j|j|j|j|j|j|jd <|jj||}|jj|||_|Sd|_ |S( s:Takes the given response and tries digest-auth, if needed.R"iswww-authenticateRtdigestisdigest tflagstcountRN(R!R trequesttbodytseektgetattrRR9tlowerR"tretcompilet IGNORECASERtsubRtcontenttrawt release_conntcopyRt_cookiestprepare_cookiesRQRBRCt connectiontsendthistorytappend(RRRSR"ts_authtpattprept_r((s1/usr/lib/python2.7/site-packages/requests/auth.pyt handle_401s*!   cCs|jr+|j|j|j|jds       PK[E site-packages/requests/certs.pyonu[ YЅ_c@sRdZyddlmZWnek r6dZnXedkrNeGHndS(sY certs.py ~~~~~~~~ This module returns the preferred default CA certificate bundle. If you are packaging Requests, e.g., for a Linux distribution or a managed environment, you can change the definition of where() to return a separately packaged CA bundle. We return "/etc/pki/tls/certs/ca-bundle.crt" provided by the ca-certificates package. i(twherecCsdS(sA Don't use the certs bundled with requests, use ca-certificates. s /etc/pki/tls/certs/ca-bundle.crt((((s2/usr/lib/python2.7/site-packages/requests/certs.pyRst__main__N(t__doc__tcertifiRt ImportErrort__name__(((s2/usr/lib/python2.7/site-packages/requests/certs.pyts    PK[֎AA!site-packages/requests/cookies.pynu[# -*- coding: utf-8 -*- """ Compatibility code to be able to use `cookielib.CookieJar` with requests. requests.utils imports from here, so be careful with imports. """ import time import collections from .compat import cookielib, urlparse, urlunparse, Morsel try: import threading # grr, pyflakes: this fixes "redefinition of unused 'threading'" threading except ImportError: import dummy_threading as threading class MockRequest(object): """Wraps a `requests.Request` to mimic a `urllib2.Request`. The code in `cookielib.CookieJar` expects this interface in order to correctly manage cookie policies, i.e., determine whether a cookie can be set, given the domains of the request and the cookie. The original request object is read-only. The client is responsible for collecting the new headers via `get_new_headers()` and interpreting them appropriately. You probably want `get_cookie_header`, defined below. """ def __init__(self, request): self._r = request self._new_headers = {} self.type = urlparse(self._r.url).scheme def get_type(self): return self.type def get_host(self): return urlparse(self._r.url).netloc def get_origin_req_host(self): return self.get_host() def get_full_url(self): # Only return the response's URL if the user hadn't set the Host # header if not self._r.headers.get('Host'): return self._r.url # If they did set it, retrieve it and reconstruct the expected domain host = self._r.headers['Host'] parsed = urlparse(self._r.url) # Reconstruct the URL as we expect it return urlunparse([ parsed.scheme, host, parsed.path, parsed.params, parsed.query, parsed.fragment ]) def is_unverifiable(self): return True def has_header(self, name): return name in self._r.headers or name in self._new_headers def get_header(self, name, default=None): return self._r.headers.get(name, self._new_headers.get(name, default)) def add_header(self, key, val): """cookielib has no legitimate use for this method; add it back if you find one.""" raise NotImplementedError("Cookie headers should be added with add_unredirected_header()") def add_unredirected_header(self, name, value): self._new_headers[name] = value def get_new_headers(self): return self._new_headers @property def unverifiable(self): return self.is_unverifiable() @property def origin_req_host(self): return self.get_origin_req_host() @property def host(self): return self.get_host() class MockResponse(object): """Wraps a `httplib.HTTPMessage` to mimic a `urllib.addinfourl`. ...what? Basically, expose the parsed HTTP headers from the server response the way `cookielib` expects to see them. """ def __init__(self, headers): """Make a MockResponse for `cookielib` to read. :param headers: a httplib.HTTPMessage or analogous carrying the headers """ self._headers = headers def info(self): return self._headers def getheaders(self, name): self._headers.getheaders(name) def extract_cookies_to_jar(jar, request, response): """Extract the cookies from the response into a CookieJar. :param jar: cookielib.CookieJar (not necessarily a RequestsCookieJar) :param request: our own requests.Request object :param response: urllib3.HTTPResponse object """ if not (hasattr(response, '_original_response') and response._original_response): return # the _original_response field is the wrapped httplib.HTTPResponse object, req = MockRequest(request) # pull out the HTTPMessage with the headers and put it in the mock: res = MockResponse(response._original_response.msg) jar.extract_cookies(res, req) def get_cookie_header(jar, request): """Produce an appropriate Cookie header string to be sent with `request`, or None.""" r = MockRequest(request) jar.add_cookie_header(r) return r.get_new_headers().get('Cookie') def remove_cookie_by_name(cookiejar, name, domain=None, path=None): """Unsets a cookie by name, by default over all domains and paths. Wraps CookieJar.clear(), is O(n). """ clearables = [] for cookie in cookiejar: if cookie.name == name: if domain is None or domain == cookie.domain: if path is None or path == cookie.path: clearables.append((cookie.domain, cookie.path, cookie.name)) for domain, path, name in clearables: cookiejar.clear(domain, path, name) class CookieConflictError(RuntimeError): """There are two cookies that meet the criteria specified in the cookie jar. Use .get and .set and include domain and path args in order to be more specific.""" class RequestsCookieJar(cookielib.CookieJar, collections.MutableMapping): """Compatibility class; is a cookielib.CookieJar, but exposes a dict interface. This is the CookieJar we create by default for requests and sessions that don't specify one, since some clients may expect response.cookies and session.cookies to support dict operations. Requests does not use the dict interface internally; it's just for compatibility with external client code. All requests code should work out of the box with externally provided instances of ``CookieJar``, e.g. ``LWPCookieJar`` and ``FileCookieJar``. Unlike a regular CookieJar, this class is pickleable. .. warning:: dictionary operations that are normally O(1) may be O(n). """ def get(self, name, default=None, domain=None, path=None): """Dict-like get() that also supports optional domain and path args in order to resolve naming collisions from using one cookie jar over multiple domains. .. warning:: operation is O(n), not O(1).""" try: return self._find_no_duplicates(name, domain, path) except KeyError: return default def set(self, name, value, **kwargs): """Dict-like set() that also supports optional domain and path args in order to resolve naming collisions from using one cookie jar over multiple domains.""" # support client code that unsets cookies by assignment of a None value: if value is None: remove_cookie_by_name(self, name, domain=kwargs.get('domain'), path=kwargs.get('path')) return if isinstance(value, Morsel): c = morsel_to_cookie(value) else: c = create_cookie(name, value, **kwargs) self.set_cookie(c) return c def iterkeys(self): """Dict-like iterkeys() that returns an iterator of names of cookies from the jar. See itervalues() and iteritems().""" for cookie in iter(self): yield cookie.name def keys(self): """Dict-like keys() that returns a list of names of cookies from the jar. See values() and items().""" return list(self.iterkeys()) def itervalues(self): """Dict-like itervalues() that returns an iterator of values of cookies from the jar. See iterkeys() and iteritems().""" for cookie in iter(self): yield cookie.value def values(self): """Dict-like values() that returns a list of values of cookies from the jar. See keys() and items().""" return list(self.itervalues()) def iteritems(self): """Dict-like iteritems() that returns an iterator of name-value tuples from the jar. See iterkeys() and itervalues().""" for cookie in iter(self): yield cookie.name, cookie.value def items(self): """Dict-like items() that returns a list of name-value tuples from the jar. See keys() and values(). Allows client-code to call ``dict(RequestsCookieJar)`` and get a vanilla python dict of key value pairs.""" return list(self.iteritems()) def list_domains(self): """Utility method to list all the domains in the jar.""" domains = [] for cookie in iter(self): if cookie.domain not in domains: domains.append(cookie.domain) return domains def list_paths(self): """Utility method to list all the paths in the jar.""" paths = [] for cookie in iter(self): if cookie.path not in paths: paths.append(cookie.path) return paths def multiple_domains(self): """Returns True if there are multiple domains in the jar. Returns False otherwise.""" domains = [] for cookie in iter(self): if cookie.domain is not None and cookie.domain in domains: return True domains.append(cookie.domain) return False # there is only one domain in jar def get_dict(self, domain=None, path=None): """Takes as an argument an optional domain and path and returns a plain old Python dict of name-value pairs of cookies that meet the requirements.""" dictionary = {} for cookie in iter(self): if (domain is None or cookie.domain == domain) and (path is None or cookie.path == path): dictionary[cookie.name] = cookie.value return dictionary def __getitem__(self, name): """Dict-like __getitem__() for compatibility with client code. Throws exception if there are more than one cookie with name. In that case, use the more explicit get() method instead. .. warning:: operation is O(n), not O(1).""" return self._find_no_duplicates(name) def __setitem__(self, name, value): """Dict-like __setitem__ for compatibility with client code. Throws exception if there is already a cookie of that name in the jar. In that case, use the more explicit set() method instead.""" self.set(name, value) def __delitem__(self, name): """Deletes a cookie given a name. Wraps ``cookielib.CookieJar``'s ``remove_cookie_by_name()``.""" remove_cookie_by_name(self, name) def set_cookie(self, cookie, *args, **kwargs): if hasattr(cookie.value, 'startswith') and cookie.value.startswith('"') and cookie.value.endswith('"'): cookie.value = cookie.value.replace('\\"', '') return super(RequestsCookieJar, self).set_cookie(cookie, *args, **kwargs) def update(self, other): """Updates this jar with cookies from another CookieJar or dict-like""" if isinstance(other, cookielib.CookieJar): for cookie in other: self.set_cookie(cookie) else: super(RequestsCookieJar, self).update(other) def _find(self, name, domain=None, path=None): """Requests uses this method internally to get cookie values. Takes as args name and optional domain and path. Returns a cookie.value. If there are conflicting cookies, _find arbitrarily chooses one. See _find_no_duplicates if you want an exception thrown if there are conflicting cookies.""" for cookie in iter(self): if cookie.name == name: if domain is None or cookie.domain == domain: if path is None or cookie.path == path: return cookie.value raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) def _find_no_duplicates(self, name, domain=None, path=None): """Both ``__get_item__`` and ``get`` call this function: it's never used elsewhere in Requests. Takes as args name and optional domain and path. Returns a cookie.value. Throws KeyError if cookie is not found and CookieConflictError if there are multiple cookies that match name and optionally domain and path.""" toReturn = None for cookie in iter(self): if cookie.name == name: if domain is None or cookie.domain == domain: if path is None or cookie.path == path: if toReturn is not None: # if there are multiple cookies that meet passed in criteria raise CookieConflictError('There are multiple cookies with name, %r' % (name)) toReturn = cookie.value # we will eventually return this as long as no cookie conflict if toReturn: return toReturn raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path)) def __getstate__(self): """Unlike a normal CookieJar, this class is pickleable.""" state = self.__dict__.copy() # remove the unpickleable RLock object state.pop('_cookies_lock') return state def __setstate__(self, state): """Unlike a normal CookieJar, this class is pickleable.""" self.__dict__.update(state) if '_cookies_lock' not in self.__dict__: self._cookies_lock = threading.RLock() def copy(self): """Return a copy of this RequestsCookieJar.""" new_cj = RequestsCookieJar() new_cj.update(self) return new_cj def create_cookie(name, value, **kwargs): """Make a cookie from underspecified parameters. By default, the pair of `name` and `value` will be set for the domain '' and sent on every request (this is sometimes called a "supercookie"). """ result = dict( version=0, name=name, value=value, port=None, domain='', path='/', secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={'HttpOnly': None}, rfc2109=False,) badargs = set(kwargs) - set(result) if badargs: err = 'create_cookie() got unexpected keyword arguments: %s' raise TypeError(err % list(badargs)) result.update(kwargs) result['port_specified'] = bool(result['port']) result['domain_specified'] = bool(result['domain']) result['domain_initial_dot'] = result['domain'].startswith('.') result['path_specified'] = bool(result['path']) return cookielib.Cookie(**result) def morsel_to_cookie(morsel): """Convert a Morsel object into a Cookie containing the one k/v pair.""" expires = None if morsel['max-age']: expires = time.time() + morsel['max-age'] elif morsel['expires']: time_template = '%a, %d-%b-%Y %H:%M:%S GMT' expires = time.mktime( time.strptime(morsel['expires'], time_template)) - time.timezone return create_cookie( comment=morsel['comment'], comment_url=bool(morsel['comment']), discard=False, domain=morsel['domain'], expires=expires, name=morsel.key, path=morsel['path'], port=None, rest={'HttpOnly': morsel['httponly']}, rfc2109=False, secure=bool(morsel['secure']), value=morsel.value, version=morsel['version'] or 0, ) def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True): """Returns a CookieJar from a key/value dictionary. :param cookie_dict: Dict of key/values to insert into CookieJar. :param cookiejar: (optional) A cookiejar to add the cookies to. :param overwrite: (optional) If False, will not replace cookies already in the jar with new ones. """ if cookiejar is None: cookiejar = RequestsCookieJar() if cookie_dict is not None: names_from_jar = [cookie.name for cookie in cookiejar] for name in cookie_dict: if overwrite or (name not in names_from_jar): cookiejar.set_cookie(create_cookie(name, cookie_dict[name])) return cookiejar def merge_cookies(cookiejar, cookies): """Add cookies to cookiejar and returns a merged CookieJar. :param cookiejar: CookieJar object to add the cookies to. :param cookies: Dictionary or CookieJar object to be added. """ if not isinstance(cookiejar, cookielib.CookieJar): raise ValueError('You can only merge into CookieJar') if isinstance(cookies, dict): cookiejar = cookiejar_from_dict( cookies, cookiejar=cookiejar, overwrite=False) elif isinstance(cookies, cookielib.CookieJar): try: cookiejar.update(cookies) except AttributeError: for cookie_in_jar in cookies: cookiejar.set_cookie(cookie_in_jar) return cookiejar PK[l $site-packages/requests/structures.pynu[# -*- coding: utf-8 -*- """ requests.structures ~~~~~~~~~~~~~~~~~~~ Data structures that power Requests. """ import collections class CaseInsensitiveDict(collections.MutableMapping): """ A case-insensitive ``dict``-like object. Implements all methods and operations of ``collections.MutableMapping`` as well as dict's ``copy``. Also provides ``lower_items``. All keys are expected to be strings. The structure remembers the case of the last key to be set, and ``iter(instance)``, ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` will contain case-sensitive keys. However, querying and contains testing is case insensitive:: cid = CaseInsensitiveDict() cid['Accept'] = 'application/json' cid['aCCEPT'] == 'application/json' # True list(cid) == ['Accept'] # True For example, ``headers['content-encoding']`` will return the value of a ``'Content-Encoding'`` response header, regardless of how the header name was originally stored. If the constructor, ``.update``, or equality comparison operations are given keys that have equal ``.lower()``s, the behavior is undefined. """ def __init__(self, data=None, **kwargs): self._store = dict() if data is None: data = {} self.update(data, **kwargs) def __setitem__(self, key, value): # Use the lowercased key for lookups, but store the actual # key alongside the value. self._store[key.lower()] = (key, value) def __getitem__(self, key): return self._store[key.lower()][1] def __delitem__(self, key): del self._store[key.lower()] def __iter__(self): return (casedkey for casedkey, mappedvalue in self._store.values()) def __len__(self): return len(self._store) def lower_items(self): """Like iteritems(), but with all lowercase keys.""" return ( (lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items() ) def __eq__(self, other): if isinstance(other, collections.Mapping): other = CaseInsensitiveDict(other) else: return NotImplemented # Compare insensitively return dict(self.lower_items()) == dict(other.lower_items()) # Copy is required def copy(self): return CaseInsensitiveDict(self._store.values()) def __repr__(self): return str(dict(self.items())) class LookupDict(dict): """Dictionary lookup object.""" def __init__(self, name=None): self.name = name super(LookupDict, self).__init__() def __repr__(self): return '' % (self.name) def __getitem__(self, key): # We allow fall-through here, so values default to None return self.__dict__.get(key, None) def get(self, key, default=None): return self.__dict__.get(key, default) PK[|ȴ%site-packages/requests/exceptions.pyonu[ YЅ_c@sdZddlmZdefdYZdefdYZdefdYZd efd YZd efd YZd efdYZ dee fdYZ de fdYZ defdYZ defdYZ deefdYZdeefdYZdeefdYZdefdYZdeefd YZd!eefd"YZd#efd$YZd%S(&sa requests.exceptions ~~~~~~~~~~~~~~~~~~~ This module contains the set of Requests' exceptions. i(t HTTPErrortRequestExceptioncBseZdZdZRS(sOThere was an ambiguous exception that occurred while handling your request.cOs|jdd}||_|jdd|_|dk rg|j rgt|drg|jj|_ntt|j||dS(sT Initialize RequestException with `request` and `response` objects. tresponsetrequestN(tpoptNoneRRthasattrtsuperRt__init__(tselftargstkwargsR((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRs (t__name__t __module__t__doc__R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR sRcBseZdZRS(sAn HTTP error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRstConnectionErrorcBseZdZRS(sA Connection error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR"st ProxyErrorcBseZdZRS(sA proxy error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR&stSSLErrorcBseZdZRS(sAn SSL error occurred.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR*stTimeoutcBseZdZRS(sThe request timed out. Catching this error will catch both :exc:`~requests.exceptions.ConnectTimeout` and :exc:`~requests.exceptions.ReadTimeout` errors. (R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR.stConnectTimeoutcBseZdZRS(sThe request timed out while trying to connect to the remote server. Requests that produced this error are safe to retry. (R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR7st ReadTimeoutcBseZdZRS(s@The server did not send any data in the allotted amount of time.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR>st URLRequiredcBseZdZRS(s*A valid URL is required to make a request.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRBstTooManyRedirectscBseZdZRS(sToo many redirects.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRFst MissingSchemacBseZdZRS(s/The URL schema (e.g. http or https) is missing.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRJst InvalidSchemacBseZdZRS(s"See defaults.py for valid schemas.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRNst InvalidURLcBseZdZRS(s' The URL provided was somehow invalid. (R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRRstChunkedEncodingErrorcBseZdZRS(s?The server declared chunked encoding but sent an invalid chunk.(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRVstContentDecodingErrorcBseZdZRS(s!Failed to decode response content(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRZstStreamConsumedErrorcBseZdZRS(s2The content for this response was already consumed(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyR^st RetryErrorcBseZdZRS(sCustom retries logic failed(R R R(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyRbsN(Rturllib3.exceptionsRt BaseHTTPErrortIOErrorRRRRRRRRRt ValueErrorRRRRRt TypeErrorRR(((s7/usr/lib/python2.7/site-packages/requests/exceptions.pyt s$ PK[}%site-packages/requests/structures.pycnu[ Tc@sEdZddlZdejfdYZdefdYZdS(sP requests.structures ~~~~~~~~~~~~~~~~~~~ Data structures that power Requests. iNtCaseInsensitiveDictcBskeZdZd dZdZdZdZdZdZ dZ dZ d Z d Z RS( s A case-insensitive ``dict``-like object. Implements all methods and operations of ``collections.MutableMapping`` as well as dict's ``copy``. Also provides ``lower_items``. All keys are expected to be strings. The structure remembers the case of the last key to be set, and ``iter(instance)``, ``keys()``, ``items()``, ``iterkeys()``, and ``iteritems()`` will contain case-sensitive keys. However, querying and contains testing is case insensitive:: cid = CaseInsensitiveDict() cid['Accept'] = 'application/json' cid['aCCEPT'] == 'application/json' # True list(cid) == ['Accept'] # True For example, ``headers['content-encoding']`` will return the value of a ``'Content-Encoding'`` response header, regardless of how the header name was originally stored. If the constructor, ``.update``, or equality comparison operations are given keys that have equal ``.lower()``s, the behavior is undefined. cKs5t|_|dkr!i}n|j||dS(N(tdictt_storetNonetupdate(tselftdatatkwargs((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__init__*s   cCs||f|j|j<s(Rtvalues(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__iter__;scCs t|jS(N(tlenR(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__len__>scCsd|jjDS(s.Like iteritems(), but with all lowercase keys.css%|]\}}||dfVqdS(iN((Rtlowerkeytkeyval((s7/usr/lib/python2.7/site-packages/requests/structures.pys Ds(Rtitems(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt lower_itemsAscCsGt|tjr!t|}ntSt|jt|jkS(N(t isinstancet collectionstMappingRtNotImplementedRR(Rtother((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__eq__IscCst|jjS(N(RRR(R((s7/usr/lib/python2.7/site-packages/requests/structures.pytcopyRscCstt|jS(N(tstrRR(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyt__repr__UsN(t__name__t __module__t__doc__RRR R RRRRRR R"(((s7/usr/lib/python2.7/site-packages/requests/structures.pyRs        t LookupDictcBs8eZdZddZdZdZddZRS(sDictionary lookup object.cCs ||_tt|jdS(N(tnametsuperR&R(RR'((s7/usr/lib/python2.7/site-packages/requests/structures.pyR[s cCs d|jS(Ns (R'(R((s7/usr/lib/python2.7/site-packages/requests/structures.pyR"_scCs|jj|dS(N(t__dict__tgetR(RR ((s7/usr/lib/python2.7/site-packages/requests/structures.pyR bscCs|jj||S(N(R)R*(RR tdefault((s7/usr/lib/python2.7/site-packages/requests/structures.pyR*gsN(R#R$R%RRR"R R*(((s7/usr/lib/python2.7/site-packages/requests/structures.pyR&Xs    (R%RtMutableMappingRRR&(((s7/usr/lib/python2.7/site-packages/requests/structures.pyt s JPK[gnSSsite-packages/requests/utils.pynu[# -*- coding: utf-8 -*- """ requests.utils ~~~~~~~~~~~~~~ This module provides utility functions that are used within Requests that are also useful for external consumption. """ import cgi import codecs import collections import io import os import platform import re import sys import socket import struct import warnings from . import __version__ from . import certs from .compat import parse_http_list as _parse_list_header from .compat import (quote, urlparse, bytes, str, OrderedDict, unquote, is_py2, builtin_str, getproxies, proxy_bypass, urlunparse, basestring) from .cookies import RequestsCookieJar, cookiejar_from_dict from .structures import CaseInsensitiveDict from .exceptions import InvalidURL _hush_pyflakes = (RequestsCookieJar,) NETRC_FILES = ('.netrc', '_netrc') DEFAULT_CA_BUNDLE_PATH = certs.where() DEFAULT_PORTS = {'http': 80, 'https': 443} def dict_to_sequence(d): """Returns an internal sequence dictionary update.""" if hasattr(d, 'items'): d = d.items() return d def super_len(o): if hasattr(o, '__len__'): return len(o) if hasattr(o, 'len'): return o.len if hasattr(o, 'fileno'): try: fileno = o.fileno() except io.UnsupportedOperation: pass else: return os.fstat(fileno).st_size if hasattr(o, 'getvalue'): # e.g. BytesIO, cStringIO.StringIO return len(o.getvalue()) def get_netrc_auth(url): """Returns the Requests tuple auth for a given url from netrc.""" try: from netrc import netrc, NetrcParseError netrc_path = None for f in NETRC_FILES: try: loc = os.path.expanduser('~/{0}'.format(f)) except KeyError: # os.path.expanduser can fail when $HOME is undefined and # getpwuid fails. See http://bugs.python.org/issue20164 & # https://github.com/kennethreitz/requests/issues/1846 return if os.path.exists(loc): netrc_path = loc break # Abort early if there isn't one. if netrc_path is None: return ri = urlparse(url) # Strip port numbers from netloc host = ri.netloc.split(':')[0] try: _netrc = netrc(netrc_path).authenticators(host) if _netrc: # Return with login / password login_i = (0 if _netrc[0] else 1) return (_netrc[login_i], _netrc[2]) except (NetrcParseError, IOError): # If there was a parsing error or a permissions issue reading the file, # we'll just skip netrc auth pass # AppEngine hackiness. except (ImportError, AttributeError): pass def guess_filename(obj): """Tries to guess the filename of the given object.""" name = getattr(obj, 'name', None) if (name and isinstance(name, basestring) and name[0] != '<' and name[-1] != '>'): return os.path.basename(name) def from_key_val_list(value): """Take an object and test to see if it can be represented as a dictionary. Unless it can not be represented as such, return an OrderedDict, e.g., :: >>> from_key_val_list([('key', 'val')]) OrderedDict([('key', 'val')]) >>> from_key_val_list('string') ValueError: need more than 1 value to unpack >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) """ if value is None: return None if isinstance(value, (str, bytes, bool, int)): raise ValueError('cannot encode objects that are not 2-tuples') return OrderedDict(value) def to_key_val_list(value): """Take an object and test to see if it can be represented as a dictionary. If it can be, return a list of tuples, e.g., :: >>> to_key_val_list([('key', 'val')]) [('key', 'val')] >>> to_key_val_list({'key': 'val'}) [('key', 'val')] >>> to_key_val_list('string') ValueError: cannot encode objects that are not 2-tuples. """ if value is None: return None if isinstance(value, (str, bytes, bool, int)): raise ValueError('cannot encode objects that are not 2-tuples') if isinstance(value, collections.Mapping): value = value.items() return list(value) # From mitsuhiko/werkzeug (used with permission). def parse_list_header(value): """Parse lists as described by RFC 2068 Section 2. In particular, parse comma-separated lists where the elements of the list may include quoted-strings. A quoted-string could contain a comma. A non-quoted string could have quotes in the middle. Quotes are removed automatically after parsing. It basically works like :func:`parse_set_header` just that items may appear multiple times and case sensitivity is preserved. The return value is a standard :class:`list`: >>> parse_list_header('token, "quoted value"') ['token', 'quoted value'] To create a header from the :class:`list` again, use the :func:`dump_header` function. :param value: a string with a list header. :return: :class:`list` """ result = [] for item in _parse_list_header(value): if item[:1] == item[-1:] == '"': item = unquote_header_value(item[1:-1]) result.append(item) return result # From mitsuhiko/werkzeug (used with permission). def parse_dict_header(value): """Parse lists of key, value pairs as described by RFC 2068 Section 2 and convert them into a python dict: >>> d = parse_dict_header('foo="is a fish", bar="as well"') >>> type(d) is dict True >>> sorted(d.items()) [('bar', 'as well'), ('foo', 'is a fish')] If there is no value for a key it will be `None`: >>> parse_dict_header('key_without_value') {'key_without_value': None} To create a header from the :class:`dict` again, use the :func:`dump_header` function. :param value: a string with a dict header. :return: :class:`dict` """ result = {} for item in _parse_list_header(value): if '=' not in item: result[item] = None continue name, value = item.split('=', 1) if value[:1] == value[-1:] == '"': value = unquote_header_value(value[1:-1]) result[name] = value return result # From mitsuhiko/werkzeug (used with permission). def unquote_header_value(value, is_filename=False): r"""Unquotes a header value. (Reversal of :func:`quote_header_value`). This does not use the real unquoting but what browsers are actually using for quoting. :param value: the header value to unquote. """ if value and value[0] == value[-1] == '"': # this is not the real unquoting, but fixing this so that the # RFC is met will result in bugs with internet explorer and # probably some other browsers as well. IE for example is # uploading files with "C:\foo\bar.txt" as filename value = value[1:-1] # if this is a filename and the starting characters look like # a UNC path, then just return the value without quotes. Using the # replace sequence below on a UNC path has the effect of turning # the leading double slash into a single slash and then # _fix_ie_filename() doesn't work correctly. See #458. if not is_filename or value[:2] != '\\\\': return value.replace('\\\\', '\\').replace('\\"', '"') return value def dict_from_cookiejar(cj): """Returns a key/value dictionary from a CookieJar. :param cj: CookieJar object to extract cookies from. """ cookie_dict = {} for cookie in cj: cookie_dict[cookie.name] = cookie.value return cookie_dict def add_dict_to_cookiejar(cj, cookie_dict): """Returns a CookieJar from a key/value dictionary. :param cj: CookieJar to insert cookies into. :param cookie_dict: Dict of key/values to insert into CookieJar. """ cj2 = cookiejar_from_dict(cookie_dict) cj.update(cj2) return cj def get_encodings_from_content(content): """Returns encodings from given content string. :param content: bytestring to extract encodings from. """ warnings.warn(( 'In requests 3.0, get_encodings_from_content will be removed. For ' 'more information, please see the discussion on issue #2266. (This' ' warning should only appear once.)'), DeprecationWarning) charset_re = re.compile(r']', flags=re.I) pragma_re = re.compile(r']', flags=re.I) xml_re = re.compile(r'^<\?xml.*?encoding=["\']*(.+?)["\'>]') return (charset_re.findall(content) + pragma_re.findall(content) + xml_re.findall(content)) def get_encoding_from_headers(headers): """Returns encodings from given HTTP Header Dict. :param headers: dictionary to extract encoding from. """ content_type = headers.get('content-type') if not content_type: return None content_type, params = cgi.parse_header(content_type) if 'charset' in params: return params['charset'].strip("'\"") if 'text' in content_type: return 'ISO-8859-1' def stream_decode_response_unicode(iterator, r): """Stream decodes a iterator.""" if r.encoding is None: for item in iterator: yield item return decoder = codecs.getincrementaldecoder(r.encoding)(errors='replace') for chunk in iterator: rv = decoder.decode(chunk) if rv: yield rv rv = decoder.decode(b'', final=True) if rv: yield rv def iter_slices(string, slice_length): """Iterate over slices of a string.""" pos = 0 while pos < len(string): yield string[pos:pos + slice_length] pos += slice_length def get_unicode_from_response(r): """Returns the requested content back in unicode. :param r: Response object to get unicode content from. Tried: 1. charset from content-type 2. fall back and replace all unicode characters """ warnings.warn(( 'In requests 3.0, get_unicode_from_response will be removed. For ' 'more information, please see the discussion on issue #2266. (This' ' warning should only appear once.)'), DeprecationWarning) tried_encodings = [] # Try charset from content-type encoding = get_encoding_from_headers(r.headers) if encoding: try: return str(r.content, encoding) except UnicodeError: tried_encodings.append(encoding) # Fall back: try: return str(r.content, encoding, errors='replace') except TypeError: return r.content # The unreserved URI characters (RFC 3986) UNRESERVED_SET = frozenset( "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + "0123456789-._~") def unquote_unreserved(uri): """Un-escape any percent-escape sequences in a URI that are unreserved characters. This leaves all reserved, illegal and non-ASCII bytes encoded. """ parts = uri.split('%') for i in range(1, len(parts)): h = parts[i][0:2] if len(h) == 2 and h.isalnum(): try: c = chr(int(h, 16)) except ValueError: raise InvalidURL("Invalid percent-escape sequence: '%s'" % h) if c in UNRESERVED_SET: parts[i] = c + parts[i][2:] else: parts[i] = '%' + parts[i] else: parts[i] = '%' + parts[i] return ''.join(parts) def requote_uri(uri): """Re-quote the given URI. This function passes the given URI through an unquote/quote cycle to ensure that it is fully and consistently quoted. """ safe_with_percent = "!#$%&'()*+,/:;=?@[]~" safe_without_percent = "!#$&'()*+,/:;=?@[]~" try: # Unquote only the unreserved characters # Then quote only illegal characters (do not quote reserved, # unreserved, or '%') return quote(unquote_unreserved(uri), safe=safe_with_percent) except InvalidURL: # We couldn't unquote the given URI, so let's try quoting it, but # there may be unquoted '%'s in the URI. We need to make sure they're # properly quoted so they do not cause issues elsewhere. return quote(uri, safe=safe_without_percent) def address_in_network(ip, net): """ This function allows you to check if on IP belongs to a network subnet Example: returns True if ip = 192.168.1.1 and net = 192.168.1.0/24 returns False if ip = 192.168.1.1 and net = 192.168.100.0/24 """ ipaddr = struct.unpack('=L', socket.inet_aton(ip))[0] netaddr, bits = net.split('/') netmask = struct.unpack('=L', socket.inet_aton(dotted_netmask(int(bits))))[0] network = struct.unpack('=L', socket.inet_aton(netaddr))[0] & netmask return (ipaddr & netmask) == (network & netmask) def dotted_netmask(mask): """ Converts mask from /xx format to xxx.xxx.xxx.xxx Example: if mask is 24 function returns 255.255.255.0 """ bits = 0xffffffff ^ (1 << 32 - mask) - 1 return socket.inet_ntoa(struct.pack('>I', bits)) def is_ipv4_address(string_ip): try: socket.inet_aton(string_ip) except socket.error: return False return True def is_valid_cidr(string_network): """Very simple check of the cidr format in no_proxy variable""" if string_network.count('/') == 1: try: mask = int(string_network.split('/')[1]) except ValueError: return False if mask < 1 or mask > 32: return False try: socket.inet_aton(string_network.split('/')[0]) except socket.error: return False else: return False return True def should_bypass_proxies(url): """ Returns whether we should bypass proxies or not. """ get_proxy = lambda k: os.environ.get(k) or os.environ.get(k.upper()) # First check whether no_proxy is defined. If it is, check that the URL # we're getting isn't in the no_proxy list. no_proxy = get_proxy('no_proxy') netloc = urlparse(url).netloc if no_proxy: # We need to check whether we match here. We need to see if we match # the end of the netloc, both with and without the port. no_proxy = no_proxy.replace(' ', '').split(',') ip = netloc.split(':')[0] if is_ipv4_address(ip): for proxy_ip in no_proxy: if is_valid_cidr(proxy_ip): if address_in_network(ip, proxy_ip): return True else: for host in no_proxy: if netloc.endswith(host) or netloc.split(':')[0].endswith(host): # The URL does match something in no_proxy, so we don't want # to apply the proxies on this URL. return True # If the system proxy settings indicate that this URL should be bypassed, # don't proxy. # The proxy_bypass function is incredibly buggy on OS X in early versions # of Python 2.6, so allow this call to fail. Only catch the specific # exceptions we've seen, though: this call failing in other ways can reveal # legitimate problems. try: bypass = proxy_bypass(netloc) except (TypeError, socket.gaierror): bypass = False if bypass: return True return False def get_environ_proxies(url): """Return a dict of environment proxies.""" if should_bypass_proxies(url): return {} else: return getproxies() def default_user_agent(name="python-requests"): """Return a string representing the default user agent.""" _implementation = platform.python_implementation() if _implementation == 'CPython': _implementation_version = platform.python_version() elif _implementation == 'PyPy': _implementation_version = '%s.%s.%s' % (sys.pypy_version_info.major, sys.pypy_version_info.minor, sys.pypy_version_info.micro) if sys.pypy_version_info.releaselevel != 'final': _implementation_version = ''.join([_implementation_version, sys.pypy_version_info.releaselevel]) elif _implementation == 'Jython': _implementation_version = platform.python_version() # Complete Guess elif _implementation == 'IronPython': _implementation_version = platform.python_version() # Complete Guess else: _implementation_version = 'Unknown' try: p_system = platform.system() p_release = platform.release() except IOError: p_system = 'Unknown' p_release = 'Unknown' return " ".join(['%s/%s' % (name, __version__), '%s/%s' % (_implementation, _implementation_version), '%s/%s' % (p_system, p_release)]) def default_headers(): return CaseInsensitiveDict({ 'User-Agent': default_user_agent(), 'Accept-Encoding': ', '.join(('gzip', 'deflate')), 'Accept': '*/*', 'Connection': 'keep-alive', }) def parse_header_links(value): """Return a dict of parsed link headers proxies. i.e. Link: ; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" """ links = [] replace_chars = " '\"" for val in re.split(", *<", value): try: url, params = val.split(";", 1) except ValueError: url, params = val, '' link = {} link["url"] = url.strip("<> '\"") for param in params.split(";"): try: key, value = param.split("=") except ValueError: break link[key.strip(replace_chars)] = value.strip(replace_chars) links.append(link) return links # Null bytes; no need to recreate these on each call to guess_json_utf _null = '\x00'.encode('ascii') # encoding to ASCII for Python 3 _null2 = _null * 2 _null3 = _null * 3 def guess_json_utf(data): # JSON always starts with two ASCII characters, so detection is as # easy as counting the nulls and from their location and count # determine the encoding. Also detect a BOM, if present. sample = data[:4] if sample in (codecs.BOM_UTF32_LE, codecs.BOM32_BE): return 'utf-32' # BOM included if sample[:3] == codecs.BOM_UTF8: return 'utf-8-sig' # BOM included, MS style (discouraged) if sample[:2] in (codecs.BOM_UTF16_LE, codecs.BOM_UTF16_BE): return 'utf-16' # BOM included nullcount = sample.count(_null) if nullcount == 0: return 'utf-8' if nullcount == 2: if sample[::2] == _null2: # 1st and 3rd are null return 'utf-16-be' if sample[1::2] == _null2: # 2nd and 4th are null return 'utf-16-le' # Did not detect 2 valid UTF-16 ascii-range characters if nullcount == 3: if sample[:3] == _null3: return 'utf-32-be' if sample[1:] == _null3: return 'utf-32-le' # Did not detect a valid UTF-32 ascii-range character return None def prepend_scheme_if_needed(url, new_scheme): '''Given a URL that may or may not have a scheme, prepend the given scheme. Does not replace a present scheme with the one provided as an argument.''' scheme, netloc, path, params, query, fragment = urlparse(url, new_scheme) # urlparse is a finicky beast, and sometimes decides that there isn't a # netloc present. Assume that it's being over-cautious, and switch netloc # and path if urlparse decided there was no netloc. if not netloc: netloc, path = path, netloc return urlunparse((scheme, netloc, path, params, query, fragment)) def get_auth_from_url(url): """Given a url with authentication components, extract them into a tuple of username,password.""" parsed = urlparse(url) try: auth = (unquote(parsed.username), unquote(parsed.password)) except (AttributeError, TypeError): auth = ('', '') return auth def to_native_string(string, encoding='ascii'): """ Given a string object, regardless of type, returns a representation of that string in the native string type, encoding and decoding where necessary. This assumes ASCII unless told otherwise. """ out = None if isinstance(string, builtin_str): out = string else: if is_py2: out = string.encode(encoding) else: out = string.decode(encoding) return out def urldefragauth(url): """ Given a url remove the fragment and the authentication part """ scheme, netloc, path, params, query, fragment = urlparse(url) # see func:`prepend_scheme_if_needed` if not netloc: netloc, path = path, netloc netloc = netloc.rsplit('@', 1)[-1] return urlunparse((scheme, netloc, path, params, query, '')) PK[D site-packages/requests/compat.pynu[# -*- coding: utf-8 -*- """ pythoncompat """ import chardet import sys # ------- # Pythons # ------- # Syntax sugar. _ver = sys.version_info #: Python 2.x? is_py2 = (_ver[0] == 2) #: Python 3.x? is_py3 = (_ver[0] == 3) try: import simplejson as json except (ImportError, SyntaxError): # simplejson does not support Python 3.2, it throws a SyntaxError # because of u'...' Unicode literals. import json # --------- # Specifics # --------- if is_py2: from urllib import quote, unquote, quote_plus, unquote_plus, urlencode, getproxies, proxy_bypass from urlparse import urlparse, urlunparse, urljoin, urlsplit, urldefrag from urllib2 import parse_http_list import cookielib from Cookie import Morsel from StringIO import StringIO try: from collections import OrderedDict # py2.7 except: from ordereddict import OrderedDict # py2.6 and lower (el6, etc.) builtin_str = str bytes = str str = unicode basestring = basestring numeric_types = (int, long, float) elif is_py3: from urllib.parse import urlparse, urlunparse, urljoin, urlsplit, urlencode, quote, unquote, quote_plus, unquote_plus, urldefrag from urllib.request import parse_http_list, getproxies, proxy_bypass from http import cookiejar as cookielib from http.cookies import Morsel from io import StringIO from collections import OrderedDict builtin_str = str str = str bytes = bytes basestring = (str, bytes) numeric_types = (int, float) PK[O%P%P#site-packages/requests/sessions.pycnu[ ZЅ_c@sdZddlZddlmZddlmZddlmZddlmZm Z m Z m Z ddl m Z mZmZmZdd lmZmZmZdd lmZmZdd lmZmZmZmZdd lmZmZm Z m!Z!dd l"m#Z#ddl$m%Z%ddl&m'Z'ddlm(Z(m)Z)m*Z*m+Z+m,Z,ddl-m.Z.ddlm/Z/dZ0e dZ1e dZ2de3fdYZ4de4fdYZ5dZ6dS(s requests.session ~~~~~~~~~~~~~~~~ This module provides a Session object to manage and persist settings across requests (cookies, auth, proxies). iN(tMapping(tdatetimei(t_basic_auth_str(t cookielibt OrderedDictturljointurlparse(tcookiejar_from_dicttextract_cookies_to_jartRequestsCookieJart merge_cookies(tRequesttPreparedRequesttDEFAULT_REDIRECT_LIMIT(t default_hookst dispatch_hook(tto_key_val_listtdefault_headerstto_native_stringt DEFAULT_PORTS(tTooManyRedirectst InvalidSchematChunkedEncodingErrortContentDecodingError(tRecentlyUsedContainer(tCaseInsensitiveDict(t HTTPAdapter(t requote_uritget_environ_proxiestget_netrc_authtshould_bypass_proxiestget_auth_from_url(tcodes(tREDIRECT_STATIicCs|dkr|S|dkr |St|to;t|tsB|S|t|}|jt|x0|jD]"\}}|dkrt||=qtqtWtd|jD}|S(s Determines appropriate setting for a given request, taking into account the explicit setting on that request, and the setting in the session. If a setting is a dictionary, they will be merged together using `dict_class` css-|]#\}}|dk r||fVqdS(N(tNone(t.0tktv((s5/usr/lib/python2.7/site-packages/requests/sessions.pys FsN(R"t isinstanceRRtupdatetitemstdict(trequest_settingtsession_settingt dict_classtmerged_settingR$R%((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt merge_setting*s   cCsZ|dks!|jdgkr%|S|dksF|jdgkrJ|St|||S(s Properly merges both requests and session hooks. This is necessary because when request_hooks == {'response': []}, the merge breaks Session hooks entirely. tresponseN(R"tgetR.(t request_hookst session_hooksR,((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt merge_hooksKs !!tSessionRedirectMixincBs;eZdZededddZdZdZRS(cCst|}t|}|j|jkr.tS|jdkrn|jdkrn|jdkrn|jdkrntS|j|jk}|j|jk}tj|jddf}| r|j|kr|j|krtS|p|S(sFDecide whether Authorization header should be removed when redirectingthttpiPthttpsiN(iPN(iN( RthostnametTruetschemetportR"tFalseRR0(tselftold_urltnew_urlt old_parsedt new_parsedt changed_porttchanged_schemet default_port((s5/usr/lib/python2.7/site-packages/requests/sessions.pytshould_strip_auth]s  ccs;d}g} x(|jr6|j} |dkrU| j|t| } | |_ny |jWn-tttfk r|j j dt nX||j krt d|j n|j|jd} |j} | jdr t|j}d|j| f} nt| }|j} |jsEt|jt| } n t| } t| | _|jr|j| jkr| j|j|j>> import requests >>> s = requests.Session() >>> s.get('http://httpbin.org/get') 200 R\RmtauthROthookstparamsRMRNtprefetchtadaptersRKR}RZcCst|_d|_i|_t|_i|_t|_ t |_ d|_ t |_t |_ti|_t|_|jdt|jdttt|_dS(Nshttps://shttp://(RR\R"RRORRRR;RKR8RMRNR RZR}RRmRRtmountRRtREDIRECT_CACHE_SIZERc(R<((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt__init__3s           cCs|S(N((R<((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt __enter__iscGs|jdS(N(R[(R<targs((s5/usr/lib/python2.7/site-packages/requests/sessions.pyt__exit__lscCs*|jp i}t|tjs0t|}nttt|j|}|j}|jr| r|j rt |j }nt }|j d|j jd|j d|jd|jd|jdt|j|jdtdt|j|jd t||jd |d t|j|j |S( sbConstructs a :class:`PreparedRequest ` for transmission and returns it. The :class:`PreparedRequest` has settings merged from the :class:`Request ` instance and those of the :class:`Session`. :param request: :class:`Request` instance to prepare with this session's settings. R]R_tfilestdatatjsonR\R,RRRmR(RmR&Rt CookieJarRR R RR}RR_R tprepareR]tupperRRRR.R\RRR3R(R<R|Rmtmerged_cookiesRtp((s5/usr/lib/python2.7/site-packages/requests/sessions.pytprepare_requestos*        cCst|}td|jd|d|d|d|p9id|d|pKid|d |d | }|j|}| p{i} |j|j| | ||}i| d 6| d 6}|j||j||}|S( sCConstructs a :class:`Request `, prepares it and sends it. Returns :class:`Response ` object. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary or bytes to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'filename': file-like-objects`` for multipart encoding upload. :param auth: (optional) Auth tuple or callable to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param allow_redirects: (optional) Set to True by default. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param stream: (optional) whether to immediately download the response content. Defaults to ``False``. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. R]R_R\RRRRRRmRRLRP(RR RRtmerge_environment_settingsR_R'Rq(R<R]R_RRR\RmRRRLRPRORRKRMRNRRstpreptsettingst send_kwargsRr((s5/usr/lib/python2.7/site-packages/requests/sessions.pyR|s,2        cKs#|jdt|jd||S(sSends a GET request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. RPRH(RR8R|(R<R_tkwargs((s5/usr/lib/python2.7/site-packages/requests/sessions.pyR0scKs#|jdt|jd||S(sSends a OPTIONS request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. RPtOPTIONS(RR8R|(R<R_R((s5/usr/lib/python2.7/site-packages/requests/sessions.pytoptionsscKs#|jdt|jd||S(sSends a HEAD request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. RPRG(RR;R|(R<R_R((s5/usr/lib/python2.7/site-packages/requests/sessions.pytheadscKs|jd|d|d||S(sSends a POST request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. RIRR(R|(R<R_RRR((s5/usr/lib/python2.7/site-packages/requests/sessions.pytposts cKs|jd|d||S(s7Sends a PUT request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. tPUTR(R|(R<R_RR((s5/usr/lib/python2.7/site-packages/requests/sessions.pytputscKs|jd|d||S(s9Sends a PATCH request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. tPATCHR(R|(R<R_RR((s5/usr/lib/python2.7/site-packages/requests/sessions.pytpatchscKs|jd||S(sSends a DELETE request. Returns :class:`Response` object. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. tDELETE(R|(R<R_R((s5/usr/lib/python2.7/site-packages/requests/sessions.pytdelete'sc Ksq|jd|j|jd|j|jd|j|jd|jt|tsjtdnt}xT|j |j kr|j |j |j j |j }||krPn||_ qvW|j dt}|j d}|j d}|j d}|j d} |j d} |j} |jd|j } tj} | j||}tj| |_td | ||}|jrx-|jD]}t|j|j|jqWnt|j||j|j||d|d|d|d| d| }|r)g|D]}|^qng}|r]|jd ||j }||_n|sm|jn|S( sSend a given PreparedRequest.RKRMRNROs#You can only send PreparedRequests.RPRLR_R/i(RRKRMRNROR&R t ValueErrortsetR_RctaddR0tpopR8Rt get_adapterRtutcnowRqtelapsedRRURRmR|RXRztinsertRV(R<R|Rt checked_urlsR>RPRKRLRMRNRORtadaptertstarttrRrtgenRU((s5/usr/lib/python2.7/site-packages/requests/sessions.pyRq0sV        %   c Cs|jrt|pi}x*|jD]\}}|j||q(W|tks`|dkrtjjdptjjd}qnt ||j }t ||j }t ||j }t ||j }i|d6|d6|d6|d6S(s6Check the environment and merge it with some settings.tREQUESTS_CA_BUNDLEtCURL_CA_BUNDLERMRORKRNN(R}RR(RR8R"tostenvironR0R.RORKRMRN( R<R_RORKRMRNt env_proxiesR$R%((s5/usr/lib/python2.7/site-packages/requests/sessions.pyRs cCsMx6|jjD]%\}}|jj|r|SqWtd|dS(s>Returns the appropriate connnection adapter for the given URL.s*No connection adapters were found for '%s'N(RR(tlowerR^R(R<R_tprefixR((s5/usr/lib/python2.7/site-packages/requests/sessions.pyRscCs(x!|jjD]}|jqWdS(s+Closes all adapters and as such the sessionN(RtvaluesR[(R<R%((s5/usr/lib/python2.7/site-packages/requests/sessions.pyR[scCso||j|sRc(R)t __attrs__Rc(R<tstate((R<s5/usr/lib/python2.7/site-packages/requests/sessions.pyt __getstate__scCs||jdi}x*|jD]\}}t|||qWtt|_x'|jD]\}}||j| s. """"( ! PK[e site-packages/requests/hooks.pyonu[ CFQc@s%dZdgZdZdZdS(s requests.hooks ~~~~~~~~~~~~~~ This module provides the capabilities for the Requests hooks system. Available hooks: ``response``: The response generated from a Request. tresponsecCs%i}xtD]}g||s  PK["L>~~!site-packages/requests/compat.pycnu[ YЅ_c@sLdZddlZddlZejZeddkZeddkZyddlZWn#e e fk r|ddlZnXersddl m Z m Z mZmZmZmZmZddlmZmZmZmZmZddlmZddlZdd lmZdd lmZydd lmZWndd l mZnXe!Z"e!Z#e$Z!e%Z%e&e'e(fZ)nerHdd l*mZmZmZmZmZm Z m Z mZmZmZdd l+mZmZmZddl,m-Zdd l.mZdd l/mZdd lmZe!Z"e!Z!e#Z#e!e#fZ%e&e(fZ)ndS(s pythoncompat iNiii(tquotetunquotet quote_plust unquote_plust urlencodet getproxiest proxy_bypass(turlparset urlunparseturljointurlsplitt urldefrag(tparse_http_list(tMorsel(tStringIO(t OrderedDict( RRR R RRRRRR (R RR(t cookiejar(0t__doc__tchardettsyst version_infot_vertis_py2tis_py3t simplejsontjsont ImportErrort SyntaxErrorturllibRRRRRRRRRR R R turllib2R t cookielibtCookieR Rt collectionsRt ordereddicttstrt builtin_strtbytestunicodet basestringtinttlongtfloatt numeric_typest urllib.parseturllib.requestthttpRt http.cookiestio(((s3/usr/lib/python2.7/site-packages/requests/compat.pytsJ   4( F PK[4kUPUP site-packages/requests/utils.pyonu[ YЅ_c@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z ddl mZddlmZddlmZmZmZmZmZmZmZmZmZmZmZmZddlmZm Z dd l!m"Z"dd l#m$Z$efZ%d8Z&ej'Z(id d6dd6Z)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1e2dZ3dZ4dZ5dZ6dZ7dZ8dZ9d Z:e;d!d"Z<d#Z=d$Z>d%Z?d&Z@d'ZAd(ZBd)ZCd*ZDd+d,ZEd-ZFd.ZGd/jHd0ZIeId1ZJeId2ZKd3ZLd4ZMd5ZNd0d6ZOd7ZPdS(9s requests.utils ~~~~~~~~~~~~~~ This module provides utility functions that are used within Requests that are also useful for external consumption. iNi(t __version__(tcerts(tparse_http_list( tquoteturlparsetbyteststrt OrderedDicttunquotetis_py2t builtin_strt getproxiest proxy_bypasst urlunparset basestring(tRequestsCookieJartcookiejar_from_dict(tCaseInsensitiveDict(t InvalidURLs.netrct_netrciPthttpithttpscCs"t|dr|j}n|S(s/Returns an internal sequence dictionary update.titems(thasattrR(td((s2/usr/lib/python2.7/site-packages/requests/utils.pytdict_to_sequence+scCst|drt|St|dr/|jSt|drxy|j}Wntjk rdqxXtj|jSnt|drt|jSdS(Nt__len__tlentfilenotgetvalue( RRRtiotUnsupportedOperationtostfstattst_sizeR(toR((s2/usr/lib/python2.7/site-packages/requests/utils.pyt super_len4s c Cs2yddlm}m}d}x^tD]V}ytjjdj|}Wntk r_dSXtjj |r&|}Pq&q&W|dkrdSt |}|j j dd}yG||j |}|r|drdnd} || |dfSWn|tfk rnXWnttfk r-nXdS( s;Returns the Requests tuple auth for a given url from netrc.i(tnetrctNetrcParseErrors~/{0}Nt:iii(R%R&tNonet NETRC_FILESR tpatht expandusertformattKeyErrortexistsRtnetloctsplittauthenticatorstIOErrort ImportErrortAttributeError( turlR%R&t netrc_pathtftloctrithostRtlogin_i((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_netrc_authHs0    cCs[t|dd}|rWt|trW|ddkrW|ddkrWtjj|SdS(s0Tries to guess the filename of the given object.tnameitN(tgetattrR(t isinstanceRR R*tbasename(tobjR=((s2/usr/lib/python2.7/site-packages/requests/utils.pytguess_filenamevs%cCsD|dkrdSt|ttttfr:tdnt|S(sTake an object and test to see if it can be represented as a dictionary. Unless it can not be represented as such, return an OrderedDict, e.g., :: >>> from_key_val_list([('key', 'val')]) OrderedDict([('key', 'val')]) >>> from_key_val_list('string') ValueError: need more than 1 value to unpack >>> from_key_val_list({'key': 'val'}) OrderedDict([('key', 'val')]) s+cannot encode objects that are not 2-tuplesN(R(RARRtbooltintt ValueErrorR(tvalue((s2/usr/lib/python2.7/site-packages/requests/utils.pytfrom_key_val_list~s  cCse|dkrdSt|ttttfr:tdnt|tjr[|j }nt |S(szTake an object and test to see if it can be represented as a dictionary. If it can be, return a list of tuples, e.g., :: >>> to_key_val_list([('key', 'val')]) [('key', 'val')] >>> to_key_val_list({'key': 'val'}) [('key', 'val')] >>> to_key_val_list('string') ValueError: cannot encode objects that are not 2-tuples. s+cannot encode objects that are not 2-tuplesN( R(RARRRERFRGt collectionstMappingRtlist(RH((s2/usr/lib/python2.7/site-packages/requests/utils.pytto_key_val_lists cCshg}x[t|D]M}|d |dko8dknrSt|dd!}n|j|qW|S(sParse lists as described by RFC 2068 Section 2. In particular, parse comma-separated lists where the elements of the list may include quoted-strings. A quoted-string could contain a comma. A non-quoted string could have quotes in the middle. Quotes are removed automatically after parsing. It basically works like :func:`parse_set_header` just that items may appear multiple times and case sensitivity is preserved. The return value is a standard :class:`list`: >>> parse_list_header('token, "quoted value"') ['token', 'quoted value'] To create a header from the :class:`list` again, use the :func:`dump_header` function. :param value: a string with a list header. :return: :class:`list` iit"(t_parse_list_headertunquote_header_valuetappend(RHtresulttitem((s2/usr/lib/python2.7/site-packages/requests/utils.pytparse_list_headers $cCsi}xt|D]~}d|kr5d||>> d = parse_dict_header('foo="is a fish", bar="as well"') >>> type(d) is dict True >>> sorted(d.items()) [('bar', 'as well'), ('foo', 'is a fish')] If there is no value for a key it will be `None`: >>> parse_dict_header('key_without_value') {'key_without_value': None} To create a header from the :class:`dict` again, use the :func:`dump_header` function. :param value: a string with a dict header. :return: :class:`dict` t=iiRNN(ROR(R0RP(RHRRRSR=((s2/usr/lib/python2.7/site-packages/requests/utils.pytparse_dict_headers  $cCsq|rm|d|dko%dknrm|dd!}| sN|d dkrm|jddjddSn|S( sUnquotes a header value. (Reversal of :func:`quote_header_value`). This does not use the real unquoting but what browsers are actually using for quoting. :param value: the header value to unquote. iiRNiis\\s\s\"(treplace(RHt is_filename((s2/usr/lib/python2.7/site-packages/requests/utils.pyRPs * cCs+i}x|D]}|j||j]tflagss+]s$^<\?xml.*?encoding=["\']*(.+?)["\'>](twarningstwarntDeprecationWarningtretcompiletItfindall(tcontentt charset_ret pragma_retxml_re((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_encodings_from_content"scCs_|jd}|sdStj|\}}d|krK|djdSd|kr[dSdS(smReturns encodings from given HTTP Header Dict. :param headers: dictionary to extract encoding from. s content-typetcharsets'"ttexts ISO-8859-1N(tgetR(tcgit parse_headertstrip(theaderst content_typetparams((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_encoding_from_headers6s  ccs|jdkr)x|D] }|VqWdStj|jdd}x+|D]#}|j|}|rK|VqKqKW|jddt}|r|VndS(sStream decodes a iterator.NterrorsRWttfinal(tencodingR(tcodecstgetincrementaldecodertdecodetTrue(titeratortrRStdecodertchunktrv((s2/usr/lib/python2.7/site-packages/requests/utils.pytstream_decode_response_unicodeJs    ccs=d}x0|t|kr8||||!V||7}q WdS(s Iterate over slices of a string.iN(R(tstringt slice_lengthtpos((s2/usr/lib/python2.7/site-packages/requests/utils.pyt iter_slices\scCstjdtg}t|j}|rcyt|j|SWqctk r_|j|qcXnyt|j|ddSWnt k r|jSXdS(sReturns the requested content back in unicode. :param r: Response object to get unicode content from. Tried: 1. charset from content-type 2. fall back and replace all unicode characters sIn requests 3.0, get_unicode_from_response will be removed. For more information, please see the discussion on issue #2266. (This warning should only appear once.)RwRWN( RaRbRcRvRsRRht UnicodeErrorRQt TypeError(Rttried_encodingsRz((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_unicode_from_responseds   t4ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzs0123456789-._~cCs|jd}xtdt|D]}||dd!}t|dkr|jrytt|d}Wn!tk rtd|nX|tkr|||d||dA}tjtjd|S(st Converts mask from /xx format to xxx.xxx.xxx.xxx Example: if mask is 24 function returns 255.255.255.0 lii s>I(Rt inet_ntoaRtpack(tmaskR((s2/usr/lib/python2.7/site-packages/requests/utils.pyRscCs-ytj|Wntjk r(tSXtS(N(RRterrortFalseR~(t string_ip((s2/usr/lib/python2.7/site-packages/requests/utils.pytis_ipv4_addresss cCs|jddkryt|jdd}Wntk rFtSX|dks_|dkrctSytj|jddWqtjk rtSXntStS(s9Very simple check of the cidr format in no_proxy variableRii i( tcountRFR0RGRRRRR~(tstring_networkR((s2/usr/lib/python2.7/site-packages/requests/utils.pyt is_valid_cidrs cCsd}|d}t|j}|r|jddjd}|jdd}t|rxs|D](}t|rkt||rtSqkqkWqx@|D]5}|j|s|jddj|rtSqWnyt |}Wn t t j fk rt }nX|rtSt S(s: Returns whether we should bypass proxies or not. cSs(tjj|p'tjj|jS(N(R tenvironRotupper(tk((s2/usr/lib/python2.7/site-packages/requests/utils.pytstno_proxyt Rxt,R'i(RR/RWR0RRRR~tendswithR RRtgaierrorR(R5t get_proxyRR/Rtproxy_ipR:tbypass((s2/usr/lib/python2.7/site-packages/requests/utils.pytshould_bypass_proxiess*      +  cCst|riStSdS(s%Return a dict of environment proxies.N(RR (R5((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_environ_proxiess spython-requestscCs7tj}|dkr'tj}n|dkrdtjjtjjtjjf}tjjdkrdj |tjjg}qn<|dkrtj}n!|dkrtj}nd}ytj }tj }Wnt k rd}d}nXd j d |t fd ||fd ||fgS( s4Return a string representing the default user agent.tCPythontPyPys%s.%s.%sRyRxtJythont IronPythontUnknownRs%s/%s(tplatformtpython_implementationtpython_versiontsystpypy_version_infotmajortminortmicrot releaselevelRtsystemtreleaseR2R(R=t_implementationt_implementation_versiontp_systemt p_release((s2/usr/lib/python2.7/site-packages/requests/utils.pytdefault_user_agents.     !      cCs2titd6djd d6dd6dd 6S( Ns User-Agents, tgziptdeflatesAccept-Encodings*/*tAccepts keep-alivet Connection(RR(RRR(((s2/usr/lib/python2.7/site-packages/requests/utils.pytdefault_headers=s  c Csg}d}xtjd|D]}y|jdd\}}Wntk ra|d}}nXi}|jd|d; rel=front; type="image/jpeg",; rel=back;type="image/jpeg" s '"s, * '"R5RU(RdR0RGRrRQ( RHtlinkst replace_charstvalR5Rutlinktparamtkey((s2/usr/lib/python2.7/site-packages/requests/utils.pytparse_header_linksFs"   ttasciiiicCs|d }|tjtjfkr&dS|d tjkr=dS|d tjtjfkr]dS|jt}|dkr|dS|dkr|dddtkrd S|d ddtkrd Sn|dkr|d t krd S|d t krd SndS(Nisutf-32is utf-8-sigisutf-16isutf-8s utf-16-beis utf-16-les utf-32-bes utf-32-le( R{t BOM_UTF32_LEtBOM32_BEtBOM_UTF8t BOM_UTF16_LEt BOM_UTF16_BERt_nullt_null2t_null3R((tdatatsamplet nullcount((s2/usr/lib/python2.7/site-packages/requests/utils.pytguess_json_utfns*    cCsSt||\}}}}}}|s7||}}nt||||||fS(sGiven a URL that may or may not have a scheme, prepend the given scheme. Does not replace a present scheme with the one provided as an argument.(RR (R5t new_schemetschemeR/R*Rutquerytfragment((s2/usr/lib/python2.7/site-packages/requests/utils.pytprepend_scheme_if_neededs!cCsRt|}y"t|jt|jf}Wnttfk rMd}nX|S(s_Given a url with authentication components, extract them into a tuple of username,password.Rx(RxRx(RRtusernametpasswordR4R(R5tparsedtauth((s2/usr/lib/python2.7/site-packages/requests/utils.pytget_auth_from_urls  " cCsId}t|tr|}n'tr6|j|}n|j|}|S(s Given a string object, regardless of type, returns a representation of that string in the native string type, encoding and decoding where necessary. This assumes ASCII unless told otherwise. N(R(RAR R tencodeR}(RRztout((s2/usr/lib/python2.7/site-packages/requests/utils.pytto_native_strings cCsft|\}}}}}}|s4||}}n|jddd}t|||||dfS(sE Given a url remove the fragment and the authentication part t@iiRx(RtrsplitR (R5RR/R*RuRR((s2/usr/lib/python2.7/site-packages/requests/utils.pyt urldefragauths (s.netrcs_netrc(Qt__doc__RpR{RJRR RRdRRRRaRxRRtcompatRRORRRRRRR R R R R RtcookiesRRt structuresRt exceptionsRt_hush_pyflakesR)twheretDEFAULT_CA_BUNDLE_PATHt DEFAULT_PORTSRR$R<RDRIRMRTRVRRPR\R_RlRvRRRt frozensetRRRRRRRRRRRRRRRRRRRRR(((s2/usr/lib/python2.7/site-packages/requests/utils.pyt sx           R    .     "       $      -   #     PK[]site-packages/requests/api.pyonu[ bUc@sndZddlmZdZdZdZdZd d dZd dZ d d Z d Z d S( s requests.api ~~~~~~~~~~~~ This module implements the Requests API. :copyright: (c) 2012 by Kenneth Reitz. :license: Apache2, see LICENSE for more details. i(tsessionscKs5tj}|jd|d||}|j|S(sPConstructs and sends a :class:`Request `. :param method: method for the new :class:`Request` object. :param url: URL for the new :class:`Request` object. :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`. :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`. :param files: (optional) Dictionary of ``'name': file-like-objects`` (or ``{'name': ('filename', fileobj)}``) for multipart encoding upload. :param auth: (optional) Auth tuple to enable Basic/Digest/Custom HTTP Auth. :param timeout: (optional) How long to wait for the server to send data before giving up, as a float, or a (`connect timeout, read timeout `_) tuple. :type timeout: float or tuple :param allow_redirects: (optional) Boolean. Set to True if POST/PUT/DELETE redirect following is allowed. :type allow_redirects: bool :param proxies: (optional) Dictionary mapping protocol to the URL of the proxy. :param verify: (optional) if ``True``, the SSL cert will be verified. A CA_BUNDLE path can also be provided. :param stream: (optional) if ``False``, the response content will be immediately downloaded. :param cert: (optional) if String, path to ssl client cert file (.pem). If Tuple, ('cert', 'key') pair. :return: :class:`Response ` object :rtype: requests.Response Usage:: >>> import requests >>> req = requests.request('GET', 'http://httpbin.org/get') tmethodturl(RtSessiontrequesttclose(RRtkwargstsessiontresponse((s0/usr/lib/python2.7/site-packages/requests/api.pyRs  cKs |jdttd||S(sSends a GET request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tallow_redirectstget(t setdefaulttTrueR(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyR :s cKs |jdttd||S(sSends a OPTIONS request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response R toptions(R R R(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyR Gs cKs |jdttd||S(sSends a HEAD request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response R thead(R tFalseR(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyRTs cKstd|d|d||S(sSends a POST request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param json: (optional) json data to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tposttdatatjson(R(RRRR((s0/usr/lib/python2.7/site-packages/requests/api.pyRas cKstd|d||S(sTSends a PUT request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tputR(R(RRR((s0/usr/lib/python2.7/site-packages/requests/api.pyRos cKstd|d||S(sVSends a PATCH request. :param url: URL for the new :class:`Request` object. :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tpatchR(R(RRR((s0/usr/lib/python2.7/site-packages/requests/api.pyR|s cKstd||S(sSends a DELETE request. :param url: URL for the new :class:`Request` object. :param \*\*kwargs: Optional arguments that ``request`` takes. :return: :class:`Response ` object :rtype: requests.Response tdelete(R(RR((s0/usr/lib/python2.7/site-packages/requests/api.pyRs N( t__doc__tRRR R RtNoneRRRR(((s0/usr/lib/python2.7/site-packages/requests/api.pyt s )  PK[Xaa!site-packages/requests/models.pyonu[ YЅ_c@s`dZddlZddlZddlmZmZddlmZddlm Z ddl m Z ddl m Z mZdd lmZdd lmZdd lmZdd lmZmZmZmZdd lmZmZmZmZmZm Z m!Z!ddl"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,ddl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9ddl:m;Z;e;j<e;j=e;j>e;j?e;j@fZAdZBddZCdZDe7jEZFdeGfdYZHdeGfdYZIdeIfdYZJdeHeIfdYZKdeGfdYZLdS(s` requests.models ~~~~~~~~~~~~~~~ This module contains the primary objects that power Requests. iN(tBytesIOtUnsupportedOperationi(t default_hooks(tCaseInsensitiveDict(t HTTPBasicAuth(tcookiejar_from_dicttget_cookie_header(t RequestField(tencode_multipart_formdata(t parse_url(t DecodeErrortReadTimeoutErrort ProtocolErrortLocationParseError(t HTTPErrort MissingSchemat InvalidURLtChunkedEncodingErrortContentDecodingErrortConnectionErrortStreamConsumedError( tguess_filenametget_auth_from_urlt requote_uritstream_decode_response_unicodetto_key_val_listtparse_header_linkst iter_slicestguess_json_utft super_lentto_native_string( t cookielibt urlunparseturlsplitt urlencodetstrtbytestStringIOtis_py2tchardettjsont builtin_strt basestring(tcodesii iitRequestEncodingMixincBs5eZedZedZedZRS(cCssg}t|j}|j}|s-d}n|j||j}|rf|jd|j|ndj|S(sBuild the path URL to use.t/t?t(R!turltpathtappendtquerytjoin(tselfR0tpR1R3((s3/usr/lib/python2.7/site-packages/requests/models.pytpath_url5s     cCst|ttfr|St|dr,|St|drg}xt|D]\}}t|tsyt|d r|g}nxl|D]d}|dk r|jt|tr|jdn|t|tr|jdn|fqqWqNWt |dt S|SdS(sEncode parameters in a piece of data. Will successfully encode parameters when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. treadt__iter__sutf-8tdoseqN( t isinstanceR#R$thasattrRR*tNoneR2tencodeR"tTrue(tdatatresulttktvstv((s3/usr/lib/python2.7/site-packages/requests/models.pyt_encode_paramsJs    !3c Cs]|stdnt|tr3tdng}t|pEi}t|pWi}x|D]\}}t|tst|d r|g}nx|D]}|d k rt|tst|}n|jt|tr|j dn|t|tr|j dn|fqqWqdWx|D] \}}d }d } t|t t frt |dkr|\} } qt |dkr|\} } }q|\} } }} nt|p|} |} t| tttfr| } n | j} td|d| d | d | } | jd ||j| q3Wt|\}}||fS( sBuild the body for a multipart/form-data request. Will successfully encode files when passed as a dict or a list of 2-tuples. Order is retained if data is a list of 2-tuples but arbitrary if parameters are supplied as a dict. sFiles must be provided.sData must not be a string.R9sutf-8iitnameR@tfilenametheaderst content_typeN(t ValueErrorR;R*RR<R=R$R#R2tdecodeR>ttupletlisttlenRt bytearrayR8Rtmake_multipartR(tfilesR@t new_fieldstfieldstfieldtvalRDRBtfttfhtfntfptfdatatrftbodyRI((s3/usr/lib/python2.7/site-packages/requests/models.pyt _encode_filesesJ    !3  (t__name__t __module__tpropertyR7t staticmethodRER](((s3/usr/lib/python2.7/site-packages/requests/models.pyR,4stRequestHooksMixincBseZdZdZRS(cCs||jkr"td|nt|tjrK|j|j|n0t|dr{|j|jd|DndS(sProperly register a hook.s1Unsupported event specified, with event name "%s"R9css'|]}t|tjr|VqdS(N(R;t collectionstCallable(t.0th((s3/usr/lib/python2.7/site-packages/requests/models.pys sN(thooksRJR;RcRdR2R<textend(R5teventthook((s3/usr/lib/python2.7/site-packages/requests/models.pyt register_hooks cCs5y|j|j|tSWntk r0tSXdS(siDeregister a previously registered hook. Returns True if the hook existed, False if not. N(RgtremoveR?RJtFalse(R5RiRj((s3/usr/lib/python2.7/site-packages/requests/models.pytderegister_hooks  (R^R_RkRn(((s3/usr/lib/python2.7/site-packages/requests/models.pyRbs tRequestc BsGeZdZddddddddddd ZdZdZRS(sA user-created :class:`Request ` object. Used to prepare a :class:`PreparedRequest `, which is sent to the server. :param method: HTTP method to use. :param url: URL to send. :param headers: dictionary of headers to send. :param files: dictionary of {filename: fileobject} files to multipart upload. :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place. :param json: json for the body to attach to the request (if data is not specified). :param params: dictionary of URL parameters to append to the URL. :param auth: Auth handler or (user, pass) tuple. :param cookies: dictionary or CookieJar of cookies to attach to this request. :param hooks: dictionary of callback hooks, for internal usage. Usage:: >>> import requests >>> req = requests.Request('GET', 'http://httpbin.org/get') >>> req.prepare() c Cs|dkrgn|}|dkr*gn|}|dkrBin|}|dkrZin|}| dkrrin| } t|_x6t| jD]"\} } |jd| d| qW||_||_||_||_ ||_ | |_ ||_ ||_ ||_dS(NRiRj(R=RRgRMtitemsRktmethodR0RHRQR@R(tparamstauthtcookies( R5RqR0RHRQR@RrRsRtRgR(RBRD((s3/usr/lib/python2.7/site-packages/requests/models.pyt__init__s"          cCs d|jS(Ns(Rq(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt__repr__scCsqt}|jd|jd|jd|jd|jd|jd|jd|jd|j d |j d |j |S( sXConstructs a :class:`PreparedRequest ` for transmission and returns it.RqR0RHRQR@R(RrRsRtRg( tPreparedRequesttprepareRqR0RHRQR@R(RrRsRtRg(R5R6((s3/usr/lib/python2.7/site-packages/requests/models.pyRxs            N(R^R_t__doc__R=RuRvRx(((s3/usr/lib/python2.7/site-packages/requests/models.pyRos  Rwc BseZdZdZddddddddddd ZdZdZdZdZ dZ ddZ d Z d d Z d Zd ZRS(sThe fully mutable :class:`PreparedRequest ` object, containing the exact bytes that will be sent to the server. Generated from either a :class:`Request ` object or manually. Usage:: >>> import requests >>> req = requests.Request('GET', 'http://httpbin.org/get') >>> r = req.prepare() >>> s = requests.Session() >>> s.send(r) cCs=d|_d|_d|_d|_d|_t|_dS(N(R=RqR0RHt_cookiesR\RRg(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRus      c Csk|j||j|||j||j||j||| |j|||j| dS(s6Prepares the entire request with the given parameters.N(tprepare_methodt prepare_urltprepare_headerstprepare_cookiest prepare_bodyt prepare_autht prepare_hooks( R5RqR0RHRQR@RrRsRtRgR(((s3/usr/lib/python2.7/site-packages/requests/models.pyRx*s   cCs d|jS(Ns(Rq(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRv;scCst}|j|_|j|_|jdk r?|jjnd|_|jdk rf|jjnd|_|j|_|j|_|S(N( RwRqR0RHR=tcopyRzR\Rg(R5R6((s3/usr/lib/python2.7/site-packages/requests/models.pyR>s   ''  cCs1||_|jdk r-|jj|_ndS(sPrepares the given HTTP method.N(RqR=tupper(R5Rq((s3/usr/lib/python2.7/site-packages/requests/models.pyR{Hs c Cst|tr!|jd}ntr3t|n t|}d|krn|jjd rn||_dSy%t |\}}}}}}} Wn"t k r} t | j nX|st dj|n|st d|ny|jdjd}Wntk r*t d nX|p4d } | rJ| d 7} n| |7} |rq| dt|7} n|sd }ntr.t|tr|jd}nt| tr| jd} nt|tr|jd}nt|tr |jd}nt| tr.| jd} q.n|j|} | re|r\d || f}qe| }ntt|| |d|| g}||_dS(sPrepares the given HTTP URL.tutf8t:thttpNsDInvalid URL {0!r}: No schema supplied. Perhaps you meant http://{0}?s Invalid URL %r: No host suppliedtidnasutf-8sURL has an invalid label.R/t@R-s%s&%s(R;R$RKR&tunicodeR#tlowert startswithR0R R RtargsRtformatR>t UnicodeErrorRERR R=( R5R0RrtschemeRsthosttportR1R3tfragmenttetnetloct enc_params((s3/usr/lib/python2.7/site-packages/requests/models.pyR|NsZ" %       $cCs8|r(td|jD|_n t|_dS(s Prepares the given HTTP headers.css'|]\}}t||fVqdS(N(R(ReRFtvalue((s3/usr/lib/python2.7/site-packages/requests/models.pys sN(RRpRH(R5RH((s3/usr/lib/python2.7/site-packages/requests/models.pyR}s"cCsd }d }d }|d k r3d}t|}ntt|dt|ttttf g}yt |}Wn t t t fk rd }nX|r|}|rt dn|d k rt||jd  "     cCst|drZt|drZ|jddt|j|jd<|jddnn|dk rt|}|rt||jd` object, which contains a server's response to an HTTP request. t_contentt status_codeRHR0thistorytencodingtreasonRttelapsedtrequestcCstt|jt|_t|_d|_t|_ d|_ d|_ d|_ g|_ d|_ti|_tjd|_d|_dS(Ni(tsuperRRuRmRt_content_consumedR=RRRHtrawR0RRRRRttdatetimet timedeltaRR(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRus         cs0jsjntfdjDS(Nc3s'|]}|t|dfVqdS(N(tgetattrR=(Retattr(R5(s3/usr/lib/python2.7/site-packages/requests/models.pys Ns(RtcontentRt __attrs__(R5((R5s3/usr/lib/python2.7/site-packages/requests/models.pyt __getstate__Gs    cCsQx*|jD]\}}t|||q Wt|dtt|dddS(NRR(RptsetattrR?R=(R5tstateRFR((s3/usr/lib/python2.7/site-packages/requests/models.pyt __setstate__RscCs d|jS(Ns(R(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRvZscCs|jS(s,Returns true if :attr:`status_code` is 'OK'.(tok(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt__bool__]scCs|jS(s,Returns true if :attr:`status_code` is 'OK'.(R(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt __nonzero__ascCs |jdS(s,Allows you to use a response as an iterator.i(t iter_content(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyR9escCs'y|jWntk r"tSXtS(N(traise_for_statusRRmR?(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRis  cCsd|jko|jtkS(sTrue if this Response is a well-formed HTTP redirect that could have been processed automatically (by :meth:`Session.resolve_redirects`). tlocation(RHRtREDIRECT_STATI(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyt is_redirectqscCs(d|jko'|jtjtjfkS(s?True if this Response one of the permanant versions of redirectR(RHRR+tmoved_permanentlytpermanent_redirect(R5((s3/usr/lib/python2.7/site-packages/requests/models.pytis_permanent_redirectxscCstj|jdS(s6The apparent encoding, provided by the chardet libraryR(R'tdetectR(R5((s3/usr/lib/python2.7/site-packages/requests/models.pytapparent_encoding}sicsfd}jr9tjtr9tntj}|}jrc|n|}|rt|}n|S(sIterates over the response data. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. The chunk size is the number of bytes it should read into memory. This is not necessarily the length of each item returned as decoding can take place. If decode_unicode is True, content will be decoded using the best available encoding based on the response. c3syy,x%jjdtD] }|VqWWn[tk rP}t|n=tk rn}t|ntk r}t|nXWn?t k rx/trjj }|sPn|VqWnXt_ dS(Ntdecode_content( RtstreamR?R RR RR RRR8R(tchunkR(t chunk_sizeR5(s3/usr/lib/python2.7/site-packages/requests/models.pytgenerates"    (RR;RtboolRRR(R5Rtdecode_unicodeRt reused_chunkst stream_chunkstchunks((RR5s3/usr/lib/python2.7/site-packages/requests/models.pyRs   ccsd}x|jd|d|D]}|dk r>||}n|rV|j|}n |j}|r|dr|r|dd|dkr|j}nd}x|D] }|VqWqW|dk r|VndS(sIterates over the response data, one line at a time. When stream=True is set on the request, this avoids reading the content at once into memory for large responses. .. note:: This method is not reentrant safe. RRiN(R=Rtsplitt splitlinestpop(R5RRt delimitertpendingRtlinestline((s3/usr/lib/python2.7/site-packages/requests/models.pyt iter_liness   .   cCs|jtkry^|jr*tdn|jdkrEd|_n'tj|jt pft|_Wqt k rd|_qXnt |_|jS(s"Content of the response, in bytes.s2The content for this response was already consumediN( RRmRt RuntimeErrorRR=R$R4RtCONTENT_CHUNK_SIZERR?(R5((s3/usr/lib/python2.7/site-packages/requests/models.pyRs   +  cCsd}|j}|js"tdS|jdkr=|j}nyt|j|dd}Wn,ttfk rt|jdd}nX|S(sContent of the response, in unicode. If Response.encoding is None, encoding will be guessed using ``chardet``. The encoding of the response content is determined based solely on HTTP headers, following RFC 2616 to the letter. If you can take advantage of non-HTTP knowledge to make a better guess at the encoding, you should set ``r.encoding`` appropriately before accessing this property. R/terrorstreplaceN(R=RRR#Rt LookupErrorR(R5RR((s3/usr/lib/python2.7/site-packages/requests/models.pyttexts    cKs|j rtt|jdkrtt|j}|dk rty tj|jj||SWqqtk rmqqXqtntj|j |S(sReturns the json-encoded content of a response, if any. :param \*\*kwargs: Optional arguments that ``json.loads`` takes. iN( RRNRRR=R(tloadsRKtUnicodeDecodeErrorR(R5tkwargsR((s3/usr/lib/python2.7/site-packages/requests/models.pyR( s    cCsj|jjd}i}|rft|}x9|D].}|jdpR|jd}|||d|j|jf}n8d|jkoXdknrvd|j|jf}n|rt|d|ndS( s2Raises stored :class:`HTTPError`, if one occurred.R/iis%s Client Error: %siXs%s Server Error: %stresponseN(RRR(R5thttp_error_msg((s3/usr/lib/python2.7/site-packages/requests/models.pyR6scCs |jjS(sReleases the connection back to the pool. Once this method has been called the underlying ``raw`` object must not be accessed again. *Note: Should not normally need to be called explicitly.* (Rt release_conn(R5((s3/usr/lib/python2.7/site-packages/requests/models.pytcloseDsN(R^R_RyRRuRRRvRRR9R`RRRRRmRtITER_CHUNK_SIZER=RRRR(RRR(((s3/usr/lib/python2.7/site-packages/requests/models.pyR s<  ,     .&  (MRyRcRtioRRRgRt structuresRRsRRtRRturllib3.fieldsRturllib3.filepostRt urllib3.utilR turllib3.exceptionsR R R R t exceptionsRRRRRRRtutilsRRRRRRRRRRtcompatRR R!R"R#R$R%R&R'R(R)R*t status_codesR+tmovedtfoundtotherttemporary_redirectRRtDEFAULT_REDIRECT_LIMITRRtdumpsRtobjectR,RbRoRwR(((s3/usr/lib/python2.7/site-packages/requests/models.pyts<  "4FR   nNPK[v6site-packages/Jinja2-2.7.2-py2.7.egg-info/requires.txtnu[markupsafe [i18n] Babel>=0.8PK[26site-packages/Jinja2-2.7.2-py2.7.egg-info/not-zip-safenu[ PK[tPx7site-packages/Jinja2-2.7.2-py2.7.egg-info/top_level.txtnu[jinja2 PK[zHH:site-packages/Jinja2-2.7.2-py2.7.egg-info/entry_points.txtnu[ [babel.extractors] jinja2 = jinja2.ext:babel_extract[i18n] PK[2>site-packages/Jinja2-2.7.2-py2.7.egg-info/dependency_links.txtnu[ PK[8RC!] ] 5site-packages/Jinja2-2.7.2-py2.7.egg-info/SOURCES.txtnu[AUTHORS CHANGES LICENSE MANIFEST.in Makefile README.rst run-tests.py setup.cfg setup.py Jinja2.egg-info/PKG-INFO Jinja2.egg-info/SOURCES.txt Jinja2.egg-info/dependency_links.txt Jinja2.egg-info/entry_points.txt Jinja2.egg-info/not-zip-safe Jinja2.egg-info/requires.txt Jinja2.egg-info/top_level.txt artwork/jinjalogo.svg docs/Makefile docs/api.rst docs/cache_extension.py docs/changelog.rst docs/conf.py docs/contents.rst.inc docs/extensions.rst docs/faq.rst docs/index.rst docs/integration.rst docs/intro.rst docs/jinjaext.py docs/jinjastyle.sty docs/latexindex.rst docs/logo.pdf docs/sandbox.rst docs/switching.rst docs/templates.rst docs/tricks.rst docs/_static/.ignore docs/_static/jinja-small.png docs/_templates/sidebarintro.html docs/_templates/sidebarlogo.html docs/_themes/LICENSE docs/_themes/README docs/_themes/jinja/layout.html docs/_themes/jinja/relations.html docs/_themes/jinja/theme.conf docs/_themes/jinja/static/jinja.css_t examples/bench.py examples/profile.py examples/basic/cycle.py examples/basic/debugger.py examples/basic/inheritance.py examples/basic/test.py examples/basic/test_filter_and_linestatements.py examples/basic/test_loop_filter.py examples/basic/translate.py examples/basic/templates/broken.html examples/basic/templates/subbroken.html examples/rwbench/djangoext.py examples/rwbench/rwbench.py examples/rwbench/django/_form.html examples/rwbench/django/_input_field.html examples/rwbench/django/_textarea.html examples/rwbench/django/index.html examples/rwbench/django/layout.html examples/rwbench/genshi/helpers.html examples/rwbench/genshi/index.html examples/rwbench/genshi/layout.html examples/rwbench/jinja/helpers.html examples/rwbench/jinja/index.html examples/rwbench/jinja/layout.html examples/rwbench/mako/helpers.html examples/rwbench/mako/index.html examples/rwbench/mako/layout.html ext/djangojinja2.py ext/inlinegettext.py ext/jinja.el ext/Vim/jinja.vim ext/django2jinja/django2jinja.py ext/django2jinja/example.py ext/django2jinja/templates/index.html ext/django2jinja/templates/layout.html ext/django2jinja/templates/subtemplate.html jinja2/__init__.py jinja2/_compat.py jinja2/_stringdefs.py jinja2/bccache.py jinja2/compiler.py jinja2/constants.py jinja2/debug.py jinja2/defaults.py jinja2/environment.py jinja2/exceptions.py jinja2/ext.py jinja2/filters.py jinja2/lexer.py jinja2/loaders.py jinja2/meta.py jinja2/nodes.py jinja2/optimizer.py jinja2/parser.py jinja2/runtime.py jinja2/sandbox.py jinja2/tests.py jinja2/utils.py jinja2/visitor.py jinja2/testsuite/__init__.py jinja2/testsuite/api.py jinja2/testsuite/bytecode_cache.py jinja2/testsuite/core_tags.py jinja2/testsuite/debug.py jinja2/testsuite/doctests.py jinja2/testsuite/ext.py jinja2/testsuite/filters.py jinja2/testsuite/imports.py jinja2/testsuite/inheritance.py jinja2/testsuite/lexnparse.py jinja2/testsuite/loader.py jinja2/testsuite/regression.py jinja2/testsuite/security.py jinja2/testsuite/tests.py jinja2/testsuite/utils.py jinja2/testsuite/res/__init__.py jinja2/testsuite/res/templates/broken.html jinja2/testsuite/res/templates/syntaxerror.html jinja2/testsuite/res/templates/test.html jinja2/testsuite/res/templates/foo/test.htmlPK[͔~2site-packages/Jinja2-2.7.2-py2.7.egg-info/PKG-INFOnu[Metadata-Version: 1.1 Name: Jinja2 Version: 2.7.2 Summary: A small but fast and easy to use stand-alone template engine written in pure python. Home-page: http://jinja.pocoo.org/ Author: Armin Ronacher Author-email: armin.ronacher@active-4.com License: BSD Description: Jinja2 ~~~~~~ Jinja2 is a template engine written in pure Python. It provides a `Django`_ inspired non-XML syntax but supports inline expressions and an optional `sandboxed`_ environment. Nutshell -------- Here a small example of a Jinja template:: {% extends 'base.html' %} {% block title %}Memberlist{% endblock %} {% block content %}

{% endblock %} Philosophy ---------- Application logic is for the controller but don't try to make the life for the template designer too hard by giving him too few functionality. For more informations visit the new `Jinja2 webpage`_ and `documentation`_. .. _sandboxed: http://en.wikipedia.org/wiki/Sandbox_(computer_security) .. _Django: http://www.djangoproject.com/ .. _Jinja2 webpage: http://jinja.pocoo.org/ .. _documentation: http://jinja.pocoo.org/2/documentation/ Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing :: Markup :: HTML PK[ ;II%site-packages/_markerlib/__init__.pycnu[ b-Qc@szy,ddlZddlmZmZmZWnGek rudekrQndZdZdddZnXdS(iN(tdefault_environmenttcompilet interprettastcCsiS(N((((s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyRscs"ddfd}|_|S(Ncs j S(N(tstrip(t environmenttoverride(tmarker(s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyt marker_fn s(tNonet__doc__(RR((Rs7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyR s cCs t|S(N(R(RRR((s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyRs(Rt_markerlib.markersRRRt ImportErrortglobalsR (((s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyts     PK[.ܤ#site-packages/_markerlib/markers.pynu[# -*- coding: utf-8 -*- """Interpret PEP 345 environment markers. EXPR [in|==|!=|not in] EXPR [or|and] ... where EXPR belongs to any of those: python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1]) python_full_version = sys.version.split()[0] os.name = os.name sys.platform = sys.platform platform.version = platform.version() platform.machine = platform.machine() platform.python_implementation = platform.python_implementation() a free string, like '2.6', or 'win32' """ __all__ = ['default_environment', 'compile', 'interpret'] import ast import os import platform import sys import weakref _builtin_compile = compile try: from platform import python_implementation except ImportError: if os.name == "java": # Jython 2.5 has ast module, but not platform.python_implementation() function. def python_implementation(): return "Jython" else: raise # restricted set of variables _VARS = {'sys.platform': sys.platform, 'python_version': '%s.%s' % sys.version_info[:2], # FIXME parsing sys.platform is not reliable, but there is no other # way to get e.g. 2.7.2+, and the PEP is defined with sys.version 'python_full_version': sys.version.split(' ', 1)[0], 'os.name': os.name, 'platform.version': platform.version(), 'platform.machine': platform.machine(), 'platform.python_implementation': python_implementation(), 'extra': None # wheel extension } for var in list(_VARS.keys()): if '.' in var: _VARS[var.replace('.', '_')] = _VARS[var] def default_environment(): """Return copy of default PEP 385 globals dictionary.""" return dict(_VARS) class ASTWhitelist(ast.NodeTransformer): def __init__(self, statement): self.statement = statement # for error messages ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str) # Bool operations ALLOWED += (ast.And, ast.Or) # Comparison operations ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn) def visit(self, node): """Ensure statement only contains allowed nodes.""" if not isinstance(node, self.ALLOWED): raise SyntaxError('Not allowed in environment markers.\n%s\n%s' % (self.statement, (' ' * node.col_offset) + '^')) return ast.NodeTransformer.visit(self, node) def visit_Attribute(self, node): """Flatten one level of attribute access.""" new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx) return ast.copy_location(new_node, node) def parse_marker(marker): tree = ast.parse(marker, mode='eval') new_tree = ASTWhitelist(marker).generic_visit(tree) return new_tree def compile_marker(parsed_marker): return _builtin_compile(parsed_marker, '', 'eval', dont_inherit=True) _cache = weakref.WeakValueDictionary() def compile(marker): """Return compiled marker as a function accepting an environment dict.""" try: return _cache[marker] except KeyError: pass if not marker.strip(): def marker_fn(environment=None, override=None): """""" return True else: compiled_marker = compile_marker(parse_marker(marker)) def marker_fn(environment=None, override=None): """override updates environment""" if override is None: override = {} if environment is None: environment = default_environment() environment.update(override) return eval(compiled_marker, environment) marker_fn.__doc__ = marker _cache[marker] = marker_fn return _cache[marker] def interpret(marker, environment=None): return compile(marker)(environment) PK[|(($site-packages/_markerlib/__init__.pynu[try: import ast from _markerlib.markers import default_environment, compile, interpret except ImportError: if 'ast' in globals(): raise def default_environment(): return {} def compile(marker): def marker_fn(environment=None, override=None): # 'empty markers are True' heuristic won't install extra deps. return not marker.strip() marker_fn.__doc__ = marker return marker_fn def interpret(marker, environment=None, override=None): return compile(marker)() PK[ $site-packages/_markerlib/markers.pycnu[ >Qc@sdZdddgZddlZddlZddlZddlZddlZeZyddlm Z Wn/e k rej dkrdZ qnXiejd 6d ej d d 6ej jd ddd6ej d6ej d6ejd6e d6dd6ZxCeejD]/Zdekr!eeeejddR7t dont_inherit(t_builtin_compiletTrue(t parsed_marker((s6/usr/lib/python2.7/site-packages/_markerlib/markers.pytcompile_markerXscsy t|SWntk rnX|js>ddd}n'tt|ddfd}||_|t|s>              !     PK[ $site-packages/_markerlib/markers.pyonu[ >Qc@sdZdddgZddlZddlZddlZddlZddlZeZyddlm Z Wn/e k rej dkrdZ qnXiejd 6d ej d d 6ej jd ddd6ej d6ej d6ejd6e d6dd6ZxCeejD]/Zdekr!eeeejddR7t dont_inherit(t_builtin_compiletTrue(t parsed_marker((s6/usr/lib/python2.7/site-packages/_markerlib/markers.pytcompile_markerXscsy t|SWntk rnX|js>ddd}n'tt|ddfd}||_|t|s>              !     PK[ ;II%site-packages/_markerlib/__init__.pyonu[ b-Qc@szy,ddlZddlmZmZmZWnGek rudekrQndZdZdddZnXdS(iN(tdefault_environmenttcompilet interprettastcCsiS(N((((s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyRscs"ddfd}|_|S(Ncs j S(N(tstrip(t environmenttoverride(tmarker(s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyt marker_fn s(tNonet__doc__(RR((Rs7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyR s cCs t|S(N(R(RRR((s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyRs(Rt_markerlib.markersRRRt ImportErrortglobalsR (((s7/usr/lib/python2.7/site-packages/_markerlib/__init__.pyts     PK[0/site-packages/IPy.pycnu[ -=Mc@s2dZdZddlZddlZi dd6dd6dd6dd 6dd 6dd 6dd 6dd 6dd6ZiPdd6ddd6ddd6dddd 6dddd d6dddd6dd6dd6dd6dd6dd 6dd!6d"d#6d$d%6d&d'6d(d)dd6d*d+6d,d-6d.d/6d0d16d0d26d0d36d,d46d5d66d,d76d8d96d0d:6d0d;6d.d<6d0d=6d0d>6d0d?6d0d@6d0dA6ddB6d0dC6dDdE6d,dF6d0dG6d.dH6d0dI6d0dJ6d0dK6d,dL6d,dM6d,dN6dOdP6d0dQ6d,dR6d.dS6d.dT6d.dU6d8dV6d0dW6dDdX6ddY6ddZ6dd[6dd\6dd]6dd^6dd_6dd`6dda6ddb6ddc6ddde6ddf6dgdh6ddi6djdk6dldm6dndo6dpdq6drds6dtdu6dvdw6dxdy6dzd{6d|d}6Zd~fdYZdefdYZdZdZ dZ dZ dZ idd6d!d 6dd6d[d6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dad6dd6Z dZdZdZdZdZdZdZdZedkr.ddlZej\ZZer+ddlZejdnndS(s IPy - class and tools for handling of IPv4 and IPv6 addresses and networks. See README file for learn how to use IPy. Further Information might be available at: https://github.com/haypo/python-ipy s0.75iNtPUBLICt0tPRIVATEt00000000t00001010t01111111t1t1010100111111110t 101011000001t1100000010101000tRESERVEDt111i`t UNSPECIFIEDitLOOPBACKitIPV4MAPiPit WKP46TRANSt 00000000011001001111111110011011i@t UNASSIGNEDt00000001t0000001t0000010t0000011t00001t0001sGLOBAL-UNICASTt001tSPECIALPURPOSEt00100000000000010000000tTEREDOt 00100000000000010000000000000000tBMWGt 00100000000000010000000000000010tORCHIDt0010000000000001000000000001sALLOCATED APNICt00100000000000010000001sALLOCATED ARINt00100000000000010000010sALLOCATED RIPE NCCt00100000000000010000011t00100000000000010000100t00100000000000010000101t00100000000000010000110t DOCUMENTATIONt 00100000000000010000110110111000t00100000000000010000111sALLOCATED LACNICt00100000000000010001001t00100000000000010001010t00100000000000010001011t00100000000000010001100t00100000000000010001101t0010000000000001000111t00100000000000010010t001000000000000100110t0010000000000001001110t0010000000000001001111t00100000000000010100000sALLOCATED AFRINICt00100000000000010100001t00100000000000010100010t00100000000000010100011t00100000000000010100100t00100000000000010100101t00100000000000010100110t00100000000000010101t0010000000000001100t00100000000000011010t00100000000000011011t6TO4t0010000000000010t001000000000001100t 001001000000t 001001100000t00100110000100000000000t00100110001000000000000t 001010000000t 001010100000t 001011000000t00101101t0010111t0011t010t011t100t101t110t1110t11110t111110tULAt1111110t 111111100t LINKLOCALt 1111111010t 1111111011t MULTICASTt11111111sNODE-LOCAL MULTICASTt1111111100000001sLINK-LOCAL MULTICASTt1111111100000010sADMIN-LOCAL MULTICASTt1111111100000100sSITE-LOCAL MULTICASTt1111111100000101sORG-LOCAL MULTICASTt1111111100001000sGLOBAL MULTICASTt1111111100001110sRESERVED MULTICASTt1111111100001111sPREFIX-BASED MULTICASTt 111111110011sRP-EMBEDDED MULTICASTt 111111110111tIPintcBs"eZdZdddZdZdZdZdZdZdZ dd Z dd Z dd Z dd Zdd ZddZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZRS(sHandling of IP addresses returning integers. Use class IP instead because some features are not implemented for IPint.icCsWd|_d|_d}d}t|ttfrt||_|dkro|jdkrfd}qod}n|dkr|jdkrtd|jnd }nF|dkr|jd krtd |jnd }n td ||_||_ nOt|t r:|j|_|j |_ |j|_nt|t t fr=|j d}t|dkrR|\}}t|\|_} | dkrtdnt|\}} | dkrtdn||jkrtdn||j} t| }td|d |fjj|krFtd|qFnt|dkr|j d}t|dkr|d}d}qFt|dkrtdqF|\}}|jddkrFt|\} } | dkrtdnt| }qFn-t|dkr:tdn tdt|\|_} |dkrp| }n|dkr|dkrd |}q|dkrd |}qtd n||_t||_ |r|jt|j |j@|_nt|j|j |jsStdt||j fqSntdt|dS(s-Create an instance of an IP object. Data can be a network specification or a single IP. IP addresses can be specified in all forms understood by parseAddress(). The size of a network can be specified as /prefixlen a.b.c.0/24 2001:658:22a:cafe::/64 -lastIP a.b.c.0-a.b.c.255 2001:658:22a:cafe::-2001:658:22a:cafe:ffff:ffff:ffff:ffff /decimal netmask a.b.c.d/255.255.255.0 not supported for IPv6 If no size specification is given a size of 1 address (/32 for IPv4 and /128 for IPv6) is assumed. If make_net is True, an IP address will be transformed into the network address by applying the specified netmask. >>> print(IP('127.0.0.0/8')) 127.0.0.0/8 >>> print(IP('127.0.0.0/255.0.0.0')) 127.0.0.0/8 >>> print(IP('127.0.0.0-127.255.255.255')) 127.0.0.0/8 >>> print(IP('127.0.0.1/255.0.0.0', make_net=True)) 127.0.0.0/8 See module documentation for more examples. iiiIiiIsJIPv4 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %xi l sJIPv6 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %xisonly IPv4 and IPv6 supportedt-is)first-last notation only allowed for IPv4s last address should be IPv4, toos(last address should be larger than firsts%s/%ss*the range %s is not on a network boundary.t/s"only one '/' allowed in IP Addresst.snetmask must be IPv4s"only one '-' allowed in IP Addresss can't parses!%s has invalid prefix length (%s)sUnsupported data type: %sN(tNoPrefixForSingleIptNonet WantPrefixLent isinstancetinttlongtipt ValueErrort _ipversiont _prefixlenRetstrtunicodetsplittlent parseAddresst _count1BitstIPt broadcasttfindt_netmaskToPrefixlent_prefixlenToNetmaskt_checkNetaddrWorksWithPrefixlentreprt TypeErrorttype(tselftdatat ipversiontmake_nettnetbitst prefixlentxRotlastt parsedVersiont lastversiontsizetnetmasktvers((s'/usr/lib/python2.7/site-packages/IPy.pyt__init__{s                   ,             " %cCs|jS(sReturn the first / base / network addess as an (long) integer. The same as IP[0]. >>> "%X" % IP('10.0.0.0/8').int() 'A000000' (Ro(R((s'/usr/lib/python2.7/site-packages/IPy.pyRmscCs|jS(sReturn the IP version of this Object. >>> IP('10.0.0.0/8').version() 4 >>> IP('::1').version() 6 (Rq(R((s'/usr/lib/python2.7/site-packages/IPy.pytversionscCs|jS(sWReturns Network Prefixlen. >>> IP('10.0.0.0/8').prefixlen() 8 (Rr(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCs |jS(sT Return the base (first) address of a network as an (long) integer. (Rm(R((s'/usr/lib/python2.7/site-packages/IPy.pytnetscCs|j|jdS(sl Return the broadcast (last) address of a network as an (long) integer. The same as IP[-1].i(RmRv(R((s'/usr/lib/python2.7/site-packages/IPy.pyRzscCs|jdkr|jdks<|jdkrQ|jdkrQ|jrQd}qQn|d kr~|j}|d kr~d}q~n|r|dkr|j}t|ttfs|j}ndt ||jS|d krd t |j |j d|jSd |jSnd Sd S(sPrints Prefixlen/Netmask. Not really. In fact it is our universal Netmask/Prefixlen printer. This is considered an internal function. want == 0 / None don't return anything 1.2.3.0 want == 1 /prefix 1.2.3.0/24 want == 2 /netmask 1.2.3.0/255.255.255.0 want == 3 -lastip 1.2.3.0-1.2.3.255 ii iiiiis/%sis-%ss/%dtN( RqRrRiRjRkRRlRmRntintToIpRoRv(RtwantR((s'/usr/lib/python2.7/site-packages/IPy.pyt _printPrefix%s$          %cCs|jdkrd}n$|jdkr0d}n td|jdkr`|dkr`d}nt|j}d|t|||j|S( sReturn a string representation as a binary value. >>> print(IP('127.0.0.1').strBin()) 01111111000000000000000000000001 ii iisonly IPv4 and IPv6 supportediRN(RqRpRkRjt _intToBinRoRvR(Rt wantprefixlentbitstret((s'/usr/lib/python2.7/site-packages/IPy.pytstrBinOs    c Cs|jd kr$|d kr$d}n|jdkr@|j|S|jd?dkrt|jd@d}d||j|}|Sg|jdjdD]}t|d ^q}dgd }x.t t |D]}t ||||>> IP('127.0.0.1').strCompressed() '127.0.0.1' >>> IP('2001:0658:022a:cafe:0200::1').strCompressed() '2001:658:22a:cafe:200::1' >>> IP('ffff:ffff:ffff:ffff:ffff:f:f:fffc/127').strCompressed() 'ffff:ffff:ffff:ffff:ffff:f:f:fffc/127' iii iIs::ffff:it:iiRRN(RkRjRqt strFullsizeRoRRRuRmtxrangeRvt_countFollowingZerostindextmaxt strNormaltinserttappendtjoin( RRtipv4ttextRthextetstfollowingzerostitcompressionpos((s'/usr/lib/python2.7/site-packages/IPy.pyt strCompressedcs0   4 +%  cCs|jd kr$|d kr$d}n|jdkrE|jd}nx|jdkrdjgg|jdjdD]}t|d^qvD]}t|d^q}n td||j |S( sReturn a string representation in the usual format. >>> print(IP('127.0.0.1').strNormal()) 127.0.0.1 >>> print(IP('2001:0658:022a:cafe:0200::1').strNormal()) 2001:658:22a:cafe:200:0:0:1 iiiiRiisonly IPv4 and IPv6 supportedN( RkRjRqRRRuRmthexRpR(RRRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  ] cCsJ|jdkr$|dkr$d}nt|j|jj|j|S(sReturn a string representation in the non-mangled format. >>> print(IP('127.0.0.1').strFullsize()) 127.0.0.1 >>> print(IP('2001:0658:022a:cafe:0200::1').strFullsize()) 2001:0658:022a:cafe:0200:0000:0000:0001 iN(RkRjRRoRqtlowerR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  cCsg|jdkr$|dkr$d}nt|j}|ddkrP|d }n|j|j|S(sReturn a string representation in hex format in lower case. >>> IP('127.0.0.1').strHex() '0x7f000001' >>> IP('2001:0658:022a:cafe:0200::1').strHex() '0x20010658022acafe0200000000000001' iitLN(RkRjRRoRR(RRR((s'/usr/lib/python2.7/site-packages/IPy.pytstrHexs   cCsa|jdkr$|dkr$d}nt|j}|ddkrP|d }n||j|S(sReturn a string representation in decimal format. >>> print(IP('127.0.0.1').strDec()) 2130706433 >>> print(IP('2001:0658:022a:cafe:0200::1').strDec()) 42540616829182469433547762482097946625 iiRN(RkRjRsRoR(RRR((s'/usr/lib/python2.7/site-packages/IPy.pytstrDecs   cCs|jdkrt}n$|jdkr0t}n td|j}x<tt|ddD]"}|| |kra||| SqaWdS(sReturn a description of the IP type ('PRIVATE', 'RESERVERD', etc). >>> print(IP('127.0.0.1').iptype()) PRIVATE >>> print(IP('192.168.1.1').iptype()) PRIVATE >>> print(IP('195.185.1.2').iptype()) PUBLIC >>> print(IP('::1').iptype()) LOOPBACK >>> print(IP('2001:0658:022a:cafe:0200::1').iptype()) ALLOCATED RIPE NCC The type information for IPv6 is out of sync with reality. iisonly IPv4 and IPv6 supportediitunknown(Rqt IPv4rangest IPv6rangesRpRRRv(RtiprangeRR((s'/usr/lib/python2.7/site-packages/IPy.pytiptypes    cCs]|jdkrd|j}n+|jdkr>d|j}n tdd|jd|>S(srReturn netmask as an integer. >>> "%X" % IP('195.185.0.0/16').netmask().int() 'FFFF0000' ii iisonly IPv4 and IPv6 supportedii(RqRrRp(Rtlocallen((s'/usr/lib/python2.7/site-packages/IPy.pyRs  cCso|jdkr8d|j}td|jd|>dS|jdkr_d|j}d|jStdd S( sReturn netmask as an string. Mostly useful for IPv6. >>> print(IP('195.185.0.0/16').strNetmask()) 255.255.0.0 >>> print(IP('2001:0658:022a:cafe::0/64').strNetmask()) /64 ii iiiis/%dsonly IPv4 and IPv6 supportedN(RqRrRRp(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt strNetmask s    cCsR|jdkrd|j}n+|jdkr>d|j}n tdd|S(sReturn the length of a subnet. >>> print(IP('195.185.1.0/28').len()) 16 >>> print(IP('195.185.1.0/24').len()) 256 ii iisonly IPv4 and IPv6 supportedi(RqRrRp(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRvs  cCstS(sAll IPy objects should evaluate to true in boolean context. Ordinarily they do, but if handling a default route expressed as 0.0.0.0/0, the __len__() of the object becomes 0, which is used as the boolean value of the object. (tTrue(R((s'/usr/lib/python2.7/site-packages/IPy.pyt __nonzero__0scCst|jS(sReturn the length of a subnet. Called to implement the built-in function len(). It breaks with IPv6 Networks. Anybody knows how to fix this.(RmRv(R((s'/usr/lib/python2.7/site-packages/IPy.pyt__len__9s cCst|ttfstn|dkrdt||jkr[|jt|}qtn||jkrtn|jt|S(sNCalled to implement evaluation of self[key]. >>> ip=IP('127.0.0.0/30') >>> for x in ip: ... print(repr(x)) ... IP('127.0.0.0') IP('127.0.0.1') IP('127.0.0.2') IP('127.0.0.3') >>> ip[2] IP('127.0.0.2') >>> ip[-1] IP('127.0.0.3') i(RlRmRnRtabsRvt IndexErrorRo(Rtkey((s'/usr/lib/python2.7/site-packages/IPy.pyt __getitem__Es    cCsTt|}|j|jkrL|j|j|j|jdkrLtStSdS(sCalled to implement membership test operators. Should return true if item is in self, false otherwise. Item can be other IP-objects, strings or ints. >>> IP('195.185.1.1').strHex() '0xc3b90101' >>> 0xC3B90101 in IP('195.185.1.0/24') True >>> '127.0.0.1' in IP('127.0.0.0/24') True >>> IP('127.0.0.0/24') in IP('127.0.0.0/25') False iN(RyRoRvRtFalse(Rtitem((s'/usr/lib/python2.7/site-packages/IPy.pyt __contains__es <cCsxt|}|j|jkr>|j|j|jkr>dS|j|jkrp|j|j|jkrpdSdSdS(sCheck if two IP address ranges overlap. Returns 0 if the two ranges don't overlap, 1 if the given range overlaps at the end and -1 if it does at the beginning. >>> IP('192.168.0.0/23').overlaps('192.168.1.0/24') 1 >>> IP('192.168.0.0/23').overlaps('192.168.1.255') 1 >>> IP('192.168.0.0/23').overlaps('192.168.2.0') 0 >>> IP('192.168.1.0/24').overlaps('192.168.0.0/23') -1 iiiN(RyRoRv(RR((s'/usr/lib/python2.7/site-packages/IPy.pytoverlaps|s  ..cCs |jS(sSDispatch to the prefered String Representation. Used to implement str(IP).(R(R((s'/usr/lib/python2.7/site-packages/IPy.pyt__str__scCsd|jdS(sPrint a representation of the Object. Used to implement repr(IP). Returns a string which evaluates to an identical Object (without the wantprefixlen stuff - see module docstring. >>> print(repr(IP('10.0.0.0/24'))) IP('10.0.0.0/24') s IPint('%s')i(R(R((s'/usr/lib/python2.7/site-packages/IPy.pyt__repr__s cCs|j|jkr&|j|jS|j|jkrL|j|jS|j|jkrbdS|j|jkrxdS|j|jkr|j|jkrdS|j|jkrdSdSndSdS(sCalled by comparison operations. Should return a negative integer if self < other, zero if self == other, a positive integer if self > other. Networks with different prefixlen are considered non-equal. Networks with the same prefixlen and differing addresses are considered non equal but are compared by their base address integer value to aid sorting of IP objects. The version of Objects is not put into consideration. >>> IP('10.0.0.0/24') > IP('10.0.0.0') 1 >>> IP('10.0.0.0/24') < IP('10.0.0.0') 0 >>> IP('10.0.0.0/24') < IP('12.0.0.0/24') 1 >>> IP('10.0.0.0/24') > IP('12.0.0.0/24') 0 iiiN(RrRRoRq(Rtother((s'/usr/lib/python2.7/site-packages/IPy.pyt__cmp__scCs|j|dkS(Ni(R(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt__eq__scCs|j|dkS(Ni(R(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt__lt__scCsWtd}|j}x(|dkr?||d@A}|d?}qW||jA}t|S(shCalled for the key object for dictionary operations, and by the built-in function hash(). Should return a 32-bit integer usable as a hash value for dictionary operations. The only required property is that objects which compare equal have the same hash value >>> IP('10.0.0.0/24').__hash__() -167772185 iiii (RmRoRr(RtthehashRo((s'/usr/lib/python2.7/site-packages/IPy.pyt__hash__s   N( t__name__t __module__t__doc__RRmRRRRzRRjRRRRRRRRRRvRRRRRRRRRRR(((s'/usr/lib/python2.7/site-packages/IPy.pyReus:    *  -     !        =  RycBsheZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( s-Class for handling IP addresses and networks.cCsttj|d|jS(sReturn the base (first) address of a network as an IP object. The same as IP[0]. >>> IP('10.0.0.0/8').net() IP('10.0.0.0') R(RyReRRq(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCsttj|S(sReturn the broadcast (last) address of a network as an IP object. The same as IP[-1]. >>> IP('10.0.0.0/8').broadcast() IP('10.255.255.255') (RyReRz(R((s'/usr/lib/python2.7/site-packages/IPy.pyRzscCsttj|d|jS(siReturn netmask as an IP object. >>> IP('10.0.0.0/8').netmask() IP('255.0.0.0') R(RyReRRq(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCst|jdkrdS|jd?dkr*dS|jd@}|jdkrdd|dd|jf}nt|ddS( Nii iIis%s/%sRi(RqRjRoRrRy(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt _getIPv4Map!s cCs|jdkr6g}|jdkrNx|D]}|j|jq.Wn|jdkrxtd|jdD]!}|j||jdqyWn|jdkrx|td|jdD]!}|j||jdqWn>x;td|jdD]!}|j||jdq W|S|jdkr|j}|dk rg|jSt|j dj }|dd kr|d }n|j ddkrt d nt |}|jd j|}td |j dd}d ||gStddS(sReturn a list with values forming the reverse lookup. >>> IP('213.221.113.87/32').reverseNames() ['87.113.221.213.in-addr.arpa.'] >>> IP('213.221.112.224/30').reverseNames() ['224.112.221.213.in-addr.arpa.', '225.112.221.213.in-addr.arpa.', '226.112.221.213.in-addr.arpa.', '227.112.221.213.in-addr.arpa.'] >>> IP('127.0.0.0/24').reverseNames() ['0.0.127.in-addr.arpa.'] >>> IP('127.0.0.0/23').reverseNames() ['0.0.127.in-addr.arpa.', '1.0.127.in-addr.arpa.'] >>> IP('127.0.0.0/16').reverseNames() ['0.127.in-addr.arpa.'] >>> IP('127.0.0.0/15').reverseNames() ['0.127.in-addr.arpa.', '1.127.in-addr.arpa.'] >>> IP('128.0.0.0/8').reverseNames() ['128.in-addr.arpa.'] >>> IP('128.0.0.0/7').reverseNames() ['128.in-addr.arpa.', '129.in-addr.arpa.'] >>> IP('::1:2').reverseNames() ['2.0.0.0.1.ip6.arpa.'] iiiiiiiitls3can't create IPv6 reverse names at sub nibble levelRhi s %s.ip6.arpa.sonly IPv4 and IPv6 supportedNiiiiii(RqRvRt reverseNameRRRjt reverseNamesRRoRRrtNotImplementedErrortlisttreverseRRmRp(RRRRRtstfirst_nibble_index((s'/usr/lib/python2.7/site-packages/IPy.pyR+s: ""      cCs<|jdkr|jd}|jd}|jtd|jd}|jddkrd|d|jdt|j|jddjddf}|dd kr|d }n|d7}nd }dj ||}d ||fS|jd kr,|j }|dk r)|j St |jd j}|dd kr_|d }n|jddkrd||jt |j|jdd jf}|dd kr|d }n|d7}nd }t|}|jdj |}td|jdd }d|||fStddS(sReturn the value for reverse lookup/PTR records as RFC 2317 look alike. RFC 2317 is an ugly hack which only works for sub-/24 e.g. not for /23. Do not use it. Better set up a zone for every address. See reverseName for a way to achieve that. >>> print(IP('195.185.1.1').reverseName()) 1.1.185.195.in-addr.arpa. >>> print(IP('195.185.1.0/28').reverseName()) 0-15.1.185.195.in-addr.arpa. >>> IP('::1:2').reverseName() '2.0.0.0.1.ip6.arpa.' iiRhis%s-%siiiRRs%s%s.in-addr.arpa.iii s%s%s.ip6.arpa.sonly IPv4 and IPv6 supportedN(RqRRuRRmRrRRoRvRRRjRRRRRp(RRtfirst_byte_indext nibblepartRR((s'/usr/lib/python2.7/site-packages/IPy.pyRcs@ F      8    cCs?dt|kr%td|ntd||fdtS(sTransform a single IP address into a network specification by applying the given netmask. Returns a new IP instance. >>> print(IP('127.0.0.1').make_net('255.0.0.0')) 127.0.0.0/8 Rgsinvalid netmask (%s)s%s/%sR(RsRpRyR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRs cCsttj||S(sACalled to implement evaluation of self[key]. >>> ip=IP('127.0.0.0/30') >>> for x in ip: ... print(str(x)) ... 127.0.0.0 127.0.0.1 127.0.0.2 127.0.0.3 >>> print(str(ip[2])) 127.0.0.2 >>> print(str(ip[-1])) 127.0.0.3 (RyReR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyRscCsd|jdS(sePrint a representation of the Object. >>> IP('10.0.0.0/8') IP('10.0.0.0/8') sIP('%s')i(R(R((s'/usr/lib/python2.7/site-packages/IPy.pyRscCs|j|jkr'tdn|jdkrHtdn|j|jkrotdn||kr|j|St|j}|jd|_|SdS(s3Emulate numeric objects through network aggregations3Only networks with the same prefixlen can be added.is8Networks with a prefixlen longer than /1 can't be added.s4Only networks with the same IP version can be added.N(RRpRt__add__RyRmRr(RRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  ( RRRRRzRRRRRRRR(((s'/usr/lib/python2.7/site-packages/IPy.pyRys  8 5  c Csg}d}d}x|t|kr1||}|jdr{|dk r_td|nt|}|d7}qn|jd}|dkrtd|n|dkr |j|| |||d!dkr||7}n||d7}|t|kr.td|q.q|j|PqW|rd |dkr|dk r~|t|dk r~td |nt|dd}|d d |d ?d |d @g}n|dk rdt|}|dkrtd|n|| dg|||}nt|dkr9td|nd}d}x|D]}y0t|d }d|ko{d kn } Wntk rt} nX| rtd||fn|d >|}|d7}qLW|S(st Internal function used by parseAddress() to parse IPv6 address with ':'. >>> print(_parseAddressIPv6('::')) 0 >>> print(_parseAddressIPv6('::1')) 1 >>> print(_parseAddressIPv6('0:0:0:0:0:0:0:1')) 1 >>> print(_parseAddressIPv6('0:0:0::0:0:1')) 1 >>> print(_parseAddressIPv6('0:0:0:0:0:0:0:0')) 0 >>> print(_parseAddressIPv6('0:0:0::0:0:0')) 0 >>> print(_parseAddressIPv6('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210')) 338770000845734292534325025077361652240 >>> print(_parseAddressIPv6('1080:0000:0000:0000:0008:0800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080:0:0:0:8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080:0::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('FF01:0:0:0:0:0:0:43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('FF01:0:0::0:0:43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('FF01::43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('0:0:0:0:0:0:13.1.68.3')) 218186755 >>> print(_parseAddressIPv6('::13.1.68.3')) 218186755 >>> print(_parseAddressIPv6('0:0:0:0:0:FFFF:129.144.52.38')) 281472855454758 >>> print(_parseAddressIPv6('::FFFF:129.144.52.38')) 281472855454758 >>> print(_parseAddressIPv6('1080:0:0:0:8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('::1:2:3:4:5:6')) 1208962713947218704138246 >>> print(_parseAddressIPv6('1:2:3:4:5:6::')) 5192455318486707404433266432802816 is::s,%r: Invalid IPv6 address: more than one '::'iRs%r: Invalid IPv6 addressiiRhs)%r: Invalid IPv6 address: '::' after IPv4s%04xiiis,%r: Invalid IPv6 address: '::' is not neededRs/%r: Invalid IPv6 address: should have 8 hextetss+%r: Invalid IPv6 address: invalid hexlet %rN( RjRvt startswithRpR{RRwRmR( tipstrtitemsRtfill_posRtpostvaluetdiffRterror((s'/usr/lib/python2.7/site-packages/IPy.pyt_parseAddressIPv6s`6        #'    !  cCs |jdrdt|dd}|dkrAtd|n|dkrW|dfS|dfSn|jd d krt|dfSt|d krt|ddfS|jd d kst|dkrt|d kr|jd }t|dkrtdn|dgdt|7}g|D]}t|^q9}x9|D]1}|dksv|dkrXtd|qXqXW|dd>|dd>|dd>|ddfSt|d}|dkrtdn|dkr|dfS|dfSdS(s Parse a string and return the corresponding IP address (as integer) and a guess of the IP version. Following address formats are recognized: >>> def testParseAddress(address): ... ip, version = parseAddress(address) ... print(("%s (IPv%s)" % (ip, version))) ... >>> testParseAddress('0x0123456789abcdef') # IPv4 if <= 0xffffffff else IPv6 81985529216486895 (IPv6) >>> testParseAddress('123.123.123.123') # IPv4 2071690107 (IPv4) >>> testParseAddress('123.123') # 0-padded IPv4 2071658496 (IPv4) >>> testParseAddress('1080:0000:0000:0000:0008:0800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('1080:0:0:0:8:800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('1080:0::8:800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('::1') 1 (IPv6) >>> testParseAddress('::') 0 (IPv6) >>> testParseAddress('0:0:0:0:0:FFFF:129.144.52.38') 281472855454758 (IPv6) >>> testParseAddress('::13.1.68.3') 218186755 (IPv6) >>> testParseAddress('::FFFF:129.144.52.38') 281472855454758 (IPv6) t0xiil s)%r: IP Address can't be bigger than 2^128IiiRii Rhis#IPv4 Address with more than 4 bytesRiis'%r: single byte must be 0 <= byte < 256iiiii s%IP Address can't be bigger than 2^128IN(RRnRpR{RRvRmRu(RRtbytesR((s'/usr/lib/python2.7/site-packages/IPy.pyRwIs6#    9 2   cCst|}|dkr+td|nd}|dkr|dkrbtdt|nx6tdD](}t|d@d|}|d ?}qoW|d }n|d krp|d krtd t|ntjdkrt|d}nt|dd !}|jd}xCtddD]2}|| |}|ddkr-d|}q-q-W|d}n td|S(s/Transform an integer string into an IP address.isIPs can't be negative: %dRiIs2IPv4 Addresses can't be larger than 0xffffffff: %siRhiiil sJIPv6 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %siii ii!Rsonly IPv4 and IPv6 supported(RnRpRRRstsyst hexversiontzfill(RoRRRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs2         cCs0|dkrdS|dkr dStddS(sReturn number of bits in address for a certain IP version. >>> _ipVersionToLen(4) 32 >>> _ipVersionToLen(6) 128 >>> _ipVersionToLen(5) Traceback (most recent call last): File "", line 1, in ? File "IPy.py", line 1076, in _ipVersionToLen raise ValueError("only IPv4 and IPv6 supported") ValueError: only IPv4 and IPv6 supported ii iisonly IPv4 and IPv6 supportedN(Rp(R((s'/usr/lib/python2.7/site-packages/IPy.pyt_ipVersionToLens   cCs@t|dkrdS|ddkr*dSdt|dSdS(sDReturn number of elements containing 0 at the beginning of the list.iiN(RvR(R((s'/usr/lib/python2.7/site-packages/IPy.pyRs t0000t0010t2t3t0100t4t0101t5t0110t6t0111t7t1000t8t1001t9t1010tat1011tbt1100tct1101tdtet1111tfcCs|dkrtdnt|j}d}|ddkrP|d }nx |dD]}|t|7}q[Wx0|ddkrt|dkr|d}qvW|S( s9Return the binary representation of an integer as string.isOnly positive values allowedRiRiRi(RpRRt _BitTableRv(tvalRRR((s'/usr/lib/python2.7/site-packages/IPy.pyRs  %cCs1d}x$|dkr,|d?}|d7}q W|S(s,Find the highest bit set to 1 in an integer.ii((tnumR((s'/usr/lib/python2.7/site-packages/IPy.pyRxs  cCspt|}|dkr+td|nd}x8|dkrk|d@dkrTPn|d?}|d7}q4W|S(s,Find the highest bit set to 0 in an integer.is Only positive Numbers please: %si(RnRp(RR((s'/usr/lib/python2.7/site-packages/IPy.pyt _count0Bitss   cCsit|}|dks$||kr(dS|dkrA|d}n t|}|||kradSdSdS(sJCheck the validity of a prefix Checks if the variant part of a prefix only has 0s, and the length is correct. >>> _checkPrefix(0x7f000000, 24, 4) 1 >>> _checkPrefix(0x7f000001, 24, 4) 0 >>> repr(_checkPrefix(0x7f000001, -1, 4)) 'None' >>> repr(_checkPrefix(0x7f000001, 33, 4)) 'None' iiN(RRjR(RoRRRtzbits((s'/usr/lib/python2.7/site-packages/IPy.pyt _checkPrefixs    cCst|}|}xD|d@dkrX|dkrX|d?}|d8}|dkrPqqWxM|dkr|d@dkrtdt|n|d?}|d8}q\WdS(s2Checks if a netmask is expressable as a prefixlen.iis+Netmask %s can't be expressed as an prefix.N(RnRpR(RtmasklenRR((s'/usr/lib/python2.7/site-packages/IPy.pyt _checkNetmask(s     cCs|t||@|kS(sBCheck if a base addess of a network is compatible with a prefixlen(R}(RRR((s'/usr/lib/python2.7/site-packages/IPy.pyR~<scCs-t|}t|}t||||S(snConvert an Integer representing a netmask to a prefixlen. E.g. 0xffffff00 (255.255.255.0) returns 24 (RRxR (RtnetlenR ((s'/usr/lib/python2.7/site-packages/IPy.pyR|As   cCsI|dkrdS|dkr+tdnd|d>dt||>S(sReturn a mask of n bits as a long integer. From 'IP address conversion functions with the builtin socket module' by Alex Martelli http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66517 isPrefixlen must be > 0ii(RpR(RR((s'/usr/lib/python2.7/site-packages/IPy.pyR}Ms   t__main__i(Rt __version__RttypesRRReRyRRwRRRRRRxRR R R~R|R}Rtdoctestttestmodtfailuretnbtesttexit(((s'/usr/lib/python2.7/site-packages/IPy.pyts       x L %           PK[uD ;;)site-packages/iniparse-0.4-py2.7.egg-infonu[Metadata-Version: 1.1 Name: iniparse Version: 0.4 Summary: Accessing and Modifying INI files Home-page: http://code.google.com/p/iniparse/ Author: Paramjit Oberoi Author-email: param@cs.wisc.edu License: MIT Description: iniparse is an INI parser for Python which is API compatible with the standard library's ConfigParser, preserves structure of INI files (order of sections & options, indentation, comments, and blank lines are preserved when data is updated), and is more convenient to use. Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: License :: OSI Approved :: Python Software Foundation License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Topic :: Software Development :: Libraries :: Python Modules PK[sST$site-packages/ply-3.4-py2.7.egg-infonu[Metadata-Version: 1.1 Name: ply Version: 3.4 Summary: Python Lex & Yacc Home-page: http://www.dabeaz.com/ply/ Author: David Beazley Author-email: dave@dabeaz.com License: BSD Description: PLY is yet another implementation of lex and yacc for Python. Some notable features include the fact that its implemented entirely in Python and it uses LALR(1) parsing which is efficient and well suited for larger grammars. PLY provides most of the standard lex/yacc features including support for empty productions, precedence rules, error recovery, and support for ambiguous grammars. PLY is extremely easy to use and provides very extensive error checking. It is compatible with both Python 2 and Python 3. Platform: UNKNOWN Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 2 PK[Qsite-packages/slip/__init__.pycnu[ 9Qc@sdS(N((((s1/usr/lib/python2.7/site-packages/slip/__init__.pytsPK[W$site-packages/slip/util/__init__.pycnu[ 9Qc@sddlZddlZdS(iN(thookabletfiles(((s6/usr/lib/python2.7/site-packages/slip/util/__init__.pyts PK[Rii!site-packages/slip/util/files.pycnu[ 9Qc@sdZdddddgZddlZddlZddlZddlZddlZdZd Zgd Z d Z e e d Z e e d Z ee dZe e dZdS(s=This module contains helper functions for dealing with files.t issamefiletlinkfiletcopyfiletlinkorcopyfiletoverwrite_safelyiNicCs1tj|}tj|}tjj||S(N(toststattpathtsamestat(tpath1tpath2ts1ts2((s3/usr/lib/python2.7/site-packages/slip/util/files.pyt _issamefile#scCs?|tkrt}nyt||SWn|k r:tSXdS(sECheck whether two paths point to the same file (i.e. are hardlinked).N(tTruet ExceptionR tFalse(R R tcatch_stat_exceptions((s3/usr/lib/python2.7/site-packages/slip/util/files.pyR*s    cCst||dtrdStjj|}tjj|}tjj|}t}xtt j D]n}t j d|tj d|}ytj ||Wn+tk r}|jtjkrqqeXt}PqeW|rtj||ndS(sUHardlink srcpath to dstpath. Attempt to atomically replace dstpath if it exists.RNtprefixtdir(RtOSErrorRRtabspathtdirnametbasenameRtxrangettempfiletTMP_MAXtmktemptextseptlinkterrnotEEXISTRtrename(tsrcpathtdstpathtdstdnametdstbnamet hardlinkedtattemptt_dsttmpte((s3/usr/lib/python2.7/site-packages/slip/util/files.pyR6s$c Cst||dtrdStjj|}tjj|}tjj|}t|d}tj d|tjj d|dt }t }|ryt j ||jt}Wqt jtfk rqXn|st j ||jnd} xa| dkrT|jt} y|j| Wq|j|jtj|jqXqW|j|jtj|j||rtjdkrtj|ndS( sCopy srcpath to dstpath. Abort operation if e.g. not enough space is available. Attempt to atomically replace dstpath if it exists.RNtrbRRtdeleteti(RRRRRRRtopenRtNamedTemporaryFileRRtshutiltcopymodetnameRtErrortNonetreadt BLOCKSIZEtwritetclosetunlinkR tselinuxtis_selinux_enabledt restorecon( R!R"tcopy_mode_from_dsttrun_restoreconR#R$tsrcfilet dsttmpfilet mode_copiedtdata((s3/usr/lib/python2.7/site-packages/slip/util/files.pyRWs@      cCsiyt||dSWn:tk rQ}|jtjtjtjfkrRqRnXt||||dS(stFirst attempt to hardlink srcpath to dstpath, if hardlinking isn't possible, attempt copying srcpath to dstpath.N(RRRtEMLINKtEPERMtEXDEVR(R!R"R;R<R(((s3/usr/lib/python2.7/site-packages/slip/util/files.pyRs !c Cstjj|}tjj|}t}d}|rQtjdkrQt}nly8tj|\}}|dkrt d|nWn1t k r} | j t j krt }qnX|stj|||rtj|qnd} xttjD]q} tjd|tjd|} ytj|| Wn.t k rk} | j t jkreqnqX| } PqW| dkrtt jdn|r| rtj| |nytj| |Wntj| nX|rtj|ndS(spCreate a symlink, optionally replacing dstpath atomically, optionally setting or preserving SELinux context.isgetfilecon(%r) failedRRs/No suitable temporary symlink could be created.N(RRRRRR2R8R9t lgetfilecont RuntimeErrorRRtENOENTRtsymlinkR:RRRRRRtIOErrort lsetfileconR tremove( R!R"tforcetpreserve_contextR#R$R<tctxtretR(tdsttmpR&R'((s3/usr/lib/python2.7/site-packages/slip/util/files.pytsymlink_atomicallysR        c Cstjj|}tjj|}tjj|}d}d}d}tjj|} |r{tjdkr{t }nzt j d|tjj d|\}}| r|rt j||n| r|rtj|\} } | dkrtd|qntj|d}d}|j||jd}tj|||r|| rltj|| q|tj|nWd|r|jn|rtj|n|rtjj|rytj|WqqXnXdS(sSafely overwrite a file by creating a temporary file in the same directory, writing it, moving it over the original file, eventually preserving file mode and SELinux context.iRRsgetfilecon(%r) failedtwN(RRtrealpathRRR2texistsR8R9RRtmkstempRR.R/t getfileconREtfdopenR5R6R t setfileconR:tisfileR7( Rtcontentt preserve_modeRLtdir_tbasetfdtfttmpnameRSRNRM((s3/usr/lib/python2.7/site-packages/slip/util/files.pyRsJ       (t__doc__t__all__RR8R.RRR4R RRRRRRRPR(((s3/usr/lib/python2.7/site-packages/slip/util/files.pyts          !6 ;PK[Rii!site-packages/slip/util/files.pyonu[ 9Qc@sdZdddddgZddlZddlZddlZddlZddlZdZd Zgd Z d Z e e d Z e e d Z ee dZe e dZdS(s=This module contains helper functions for dealing with files.t issamefiletlinkfiletcopyfiletlinkorcopyfiletoverwrite_safelyiNicCs1tj|}tj|}tjj||S(N(toststattpathtsamestat(tpath1tpath2ts1ts2((s3/usr/lib/python2.7/site-packages/slip/util/files.pyt _issamefile#scCs?|tkrt}nyt||SWn|k r:tSXdS(sECheck whether two paths point to the same file (i.e. are hardlinked).N(tTruet ExceptionR tFalse(R R tcatch_stat_exceptions((s3/usr/lib/python2.7/site-packages/slip/util/files.pyR*s    cCst||dtrdStjj|}tjj|}tjj|}t}xtt j D]n}t j d|tj d|}ytj ||Wn+tk r}|jtjkrqqeXt}PqeW|rtj||ndS(sUHardlink srcpath to dstpath. Attempt to atomically replace dstpath if it exists.RNtprefixtdir(RtOSErrorRRtabspathtdirnametbasenameRtxrangettempfiletTMP_MAXtmktemptextseptlinkterrnotEEXISTRtrename(tsrcpathtdstpathtdstdnametdstbnamet hardlinkedtattemptt_dsttmpte((s3/usr/lib/python2.7/site-packages/slip/util/files.pyR6s$c Cst||dtrdStjj|}tjj|}tjj|}t|d}tj d|tjj d|dt }t }|ryt j ||jt}Wqt jtfk rqXn|st j ||jnd} xa| dkrT|jt} y|j| Wq|j|jtj|jqXqW|j|jtj|j||rtjdkrtj|ndS( sCopy srcpath to dstpath. Abort operation if e.g. not enough space is available. Attempt to atomically replace dstpath if it exists.RNtrbRRtdeleteti(RRRRRRRtopenRtNamedTemporaryFileRRtshutiltcopymodetnameRtErrortNonetreadt BLOCKSIZEtwritetclosetunlinkR tselinuxtis_selinux_enabledt restorecon( R!R"tcopy_mode_from_dsttrun_restoreconR#R$tsrcfilet dsttmpfilet mode_copiedtdata((s3/usr/lib/python2.7/site-packages/slip/util/files.pyRWs@      cCsiyt||dSWn:tk rQ}|jtjtjtjfkrRqRnXt||||dS(stFirst attempt to hardlink srcpath to dstpath, if hardlinking isn't possible, attempt copying srcpath to dstpath.N(RRRtEMLINKtEPERMtEXDEVR(R!R"R;R<R(((s3/usr/lib/python2.7/site-packages/slip/util/files.pyRs !c Cstjj|}tjj|}t}d}|rQtjdkrQt}nly8tj|\}}|dkrt d|nWn1t k r} | j t j krt }qnX|stj|||rtj|qnd} xttjD]q} tjd|tjd|} ytj|| Wn.t k rk} | j t jkreqnqX| } PqW| dkrtt jdn|r| rtj| |nytj| |Wntj| nX|rtj|ndS(spCreate a symlink, optionally replacing dstpath atomically, optionally setting or preserving SELinux context.isgetfilecon(%r) failedRRs/No suitable temporary symlink could be created.N(RRRRRR2R8R9t lgetfilecont RuntimeErrorRRtENOENTRtsymlinkR:RRRRRRtIOErrort lsetfileconR tremove( R!R"tforcetpreserve_contextR#R$R<tctxtretR(tdsttmpR&R'((s3/usr/lib/python2.7/site-packages/slip/util/files.pytsymlink_atomicallysR        c Cstjj|}tjj|}tjj|}d}d}d}tjj|} |r{tjdkr{t }nzt j d|tjj d|\}}| r|rt j||n| r|rtj|\} } | dkrtd|qntj|d}d}|j||jd}tj|||r|| rltj|| q|tj|nWd|r|jn|rtj|n|rtjj|rytj|WqqXnXdS(sSafely overwrite a file by creating a temporary file in the same directory, writing it, moving it over the original file, eventually preserving file mode and SELinux context.iRRsgetfilecon(%r) failedtwN(RRtrealpathRRR2texistsR8R9RRtmkstempRR.R/t getfileconREtfdopenR5R6R t setfileconR:tisfileR7( Rtcontentt preserve_modeRLtdir_tbasetfdtfttmpnameRSRNRM((s3/usr/lib/python2.7/site-packages/slip/util/files.pyRsJ       (t__doc__t__all__RR8R.RRR4R RRRRRRRPR(((s3/usr/lib/python2.7/site-packages/slip/util/files.pyts          !6 ;PK[966#site-packages/slip/util/__init__.pynu[# -*- coding: utf-8 -*- import hookable import files PK[Mە `` site-packages/slip/util/files.pynu[# -*- coding: utf-8 -*- # # Copyright © 2009, 2010, 2012 Red Hat, Inc. # Authors: # Nils Philippsen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """This module contains helper functions for dealing with files.""" __all__ = ["issamefile", "linkfile", "copyfile", "linkorcopyfile", "overwrite_safely"] import os import selinux import shutil import tempfile import errno BLOCKSIZE = 1024 def _issamefile(path1, path2): s1 = os.stat(path1) s2 = os.stat(path2) return os.path.samestat(s1, s2) def issamefile(path1, path2, catch_stat_exceptions=[]): """Check whether two paths point to the same file (i.e. are hardlinked).""" if catch_stat_exceptions == True: catch_stat_exceptions = Exception try: return _issamefile(path1, path2) except catch_stat_exceptions: return False def linkfile(srcpath, dstpath): """Hardlink srcpath to dstpath. Attempt to atomically replace dstpath if it exists.""" if issamefile(srcpath, dstpath, catch_stat_exceptions=OSError): return dstpath = os.path.abspath(dstpath) dstdname = os.path.dirname(dstpath) dstbname = os.path.basename(dstpath) hardlinked = False for attempt in xrange(tempfile.TMP_MAX): _dsttmp = tempfile.mktemp(prefix=dstbname + os.extsep, dir=dstdname) try: os.link(srcpath, _dsttmp) except OSError, e: if e.errno == errno.EEXIST: # try another name pass else: raise else: hardlinked = True break if hardlinked: os.rename(_dsttmp, dstpath) def copyfile(srcpath, dstpath, copy_mode_from_dst=True, run_restorecon=True): """Copy srcpath to dstpath. Abort operation if e.g. not enough space is available. Attempt to atomically replace dstpath if it exists.""" if issamefile(srcpath, dstpath, catch_stat_exceptions=OSError): return dstpath = os.path.abspath(dstpath) dstdname = os.path.dirname(dstpath) dstbname = os.path.basename(dstpath) srcfile = open(srcpath, "rb") dsttmpfile = tempfile.NamedTemporaryFile(prefix=dstbname + os.path.extsep, dir=dstdname, delete=False) mode_copied = False if copy_mode_from_dst: # attempt to copy mode from destination file (if it exists, # otherwise fall back to copying it from the source file below) try: shutil.copymode(dstpath, dsttmpfile.name) mode_copied = True except (shutil.Error, OSError): pass if not mode_copied: shutil.copymode(srcpath, dsttmpfile.name) data = None while data != "": data = srcfile.read(BLOCKSIZE) try: dsttmpfile.write(data) except: srcfile.close() dsttmpfile.close() os.unlink(dsttmpfile.name) raise srcfile.close() dsttmpfile.close() os.rename(dsttmpfile.name, dstpath) if run_restorecon and selinux.is_selinux_enabled() > 0: selinux.restorecon(dstpath) def linkorcopyfile(srcpath, dstpath, copy_mode_from_dst=True, run_restorecon=True): """First attempt to hardlink srcpath to dstpath, if hardlinking isn't possible, attempt copying srcpath to dstpath.""" try: linkfile(srcpath, dstpath) return except OSError, e: if e.errno not in (errno.EMLINK, errno.EPERM, errno.EXDEV): # don't bother copying raise else: # try copying pass copyfile(srcpath, dstpath, copy_mode_from_dst, run_restorecon) def symlink_atomically(srcpath, dstpath, force=False, preserve_context=True): """Create a symlink, optionally replacing dstpath atomically, optionally setting or preserving SELinux context.""" dstdname = os.path.dirname(dstpath) dstbname = os.path.basename(dstpath) run_restorecon = False ctx = None if preserve_context and selinux.is_selinux_enabled() <= 0: preserve_context = False else: try: ret, ctx = selinux.lgetfilecon(dstpath) if ret < 0: raise RuntimeError("getfilecon(%r) failed" % dstpath) except OSError, e: if e.errno == errno.ENOENT: run_restorecon = True else: raise if not force: os.symlink(srcpath, dstpath) if preserve_context: selinux.restorecon(dstpath) else: dsttmp = None for attempt in xrange(tempfile.TMP_MAX): _dsttmp = tempfile.mktemp(prefix=dstbname + os.extsep, dir=dstdname) try: os.symlink(srcpath, _dsttmp) except OSError, e: if e.errno == errno.EEXIST: # try again continue raise else: dsttmp = _dsttmp break if dsttmp is None: raise IOError(errno.EEXIST, "No suitable temporary symlink could be created.") if preserve_context and not run_restorecon: selinux.lsetfilecon(dsttmp, ctx) try: os.rename(dsttmp, dstpath) except: # clean up os.remove(dsttmp) raise if run_restorecon: selinux.restorecon(dstpath) def overwrite_safely(path, content, preserve_mode=True, preserve_context=True): """Safely overwrite a file by creating a temporary file in the same directory, writing it, moving it over the original file, eventually preserving file mode and SELinux context.""" path = os.path.realpath(path) dir_ = os.path.dirname(path) base = os.path.basename(path) fd = None f = None tmpname = None exists = os.path.exists(path) if preserve_context and selinux.is_selinux_enabled() <= 0: preserve_context = False try: fd, tmpname = tempfile.mkstemp(prefix=base + os.path.extsep, dir=dir_) if exists and preserve_mode: shutil.copymode(path, tmpname) if exists and preserve_context: ret, ctx = selinux.getfilecon(path) if ret < 0: raise RuntimeError("getfilecon(%r) failed" % path) f = os.fdopen(fd, "w") fd = None f.write(content) f.close() f = None os.rename(tmpname, path) if preserve_context: if exists: selinux.setfilecon(path, ctx) else: selinux.restorecon(path) finally: if f: f.close() elif fd: os.close(fd) if tmpname and os.path.isfile(tmpname): try: os.unlink(tmpname) except: pass PK[1j`$site-packages/slip/util/hookable.pycnu[ 9Qc@sqdZddgZdefdYZdefdYZdefdYZdeefdYZd S( s[This module contains variants of certain base types which call registered hooks on changes.tHookablet HookableSett HookableTypecBs eZdZedZRS(cCs|jdry|d}WnYtk rxd}xCtd|D]+}|rktdt|qF|}qFWnXx+|dD]}tj||||$sstoo many base classes: %s( thas_keytKeyErrortNonetfiltert TypeErrortstrRt wrap_methodttypet__new__(tclstnametbasestdcttbasetbase_candidatet methodname((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs cs+t||fd}||_|S(Ncs |||}|j|S(N(t _run_hooks(tselftptktretval(tfunc(s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt methodwrapper4s (tgetattrt func_name(RRRR((Rs6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR 0s (t__name__t __module__Rt classmethodR (((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs t _HookEntrycBs,eZdZdZdZdZRS(cCs||_||_||_dS(N(t_HookEntry__hookt_HookEntry__argst_HookEntry__kwargs(Rthooktargstkwargs((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt__init__?s  cCs4|j|jko3|j|jko3|j|jkS(N(R$R%R&(Rtobj((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt__cmp__Es$cCs-|jj|jjA|jjjAS(N(R$t__hash__R%R&t iteritems(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR-IscCs|j|j|jdS(N(R$R%R&(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pytrunMs(R R!R*R,R-R/(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR#=s   cBseZdZeZedZdZdZeeeZ dZ dZ ee e Z dZ dZdZd Zd ZRS( s2An object which calls registered hooks on changes.cOs%t|dst|_n|jS(Nt__real_hooks__(thasattrtsetR0(RRR((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt __hooks__WscCs"t|dst|_n|jS(Nt__hooks_enabled__(R1tTrueR4(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_get_hooks_enabled]s cCs ||_dS(N(R4(Rtenabled((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_set_hooks_enabledbscCs"t|dst|_n|jS(Nt__hooks_frozen__(R1tFalseR9(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_get_hooks_frozengs cCsY||jkrdS||_|r1t|_n$x|jD]}|jq;W|`dS(N(t hooks_frozenR9R2t__hooks_frozen_entries__R/(Rtfreezet hookentry((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_set_hooks_frozenls cCs t|_dS(N(R5R<(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt freeze_hooks{scCs t|_dS(N(R:R<(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt thaw_hooks~scOs8t|stt|||}|jj|dS(N(tcallabletAssertionErrorR#R3tadd(RR'R(R)R?((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pytadd_hookscOs |jjt|||dS(N(R3tremoveR#(RR'R(R)((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt remove_hookscCsM|jrI|js3x1|jD]}|jqWqI|jj|jndS(N(t hooks_enabledR<R3R/R=tupdate(RR?((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs   (R R!t__doc__Rt __metaclass__tpropertyR3R6R8RIR;R@R<RARBRFRHR(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRQs        c BseZdZd Zd ZRS( s5A set object which calls registered hooks on changes.REtcleartdifference_updatetdiscardtintersection_updatetpopRGtsymmetric_difference_updateRJcCstj|}t|_|S(N(R2tcopyR0(RR+((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRTs ( saddsclearsdifference_updatesdiscardsintersection_updatespopsremovessymmetric_difference_updatesupdate(R R!RKRRT(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs N( RKt__all__RRtobjectR#RR2R(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyts  "CPK['Ljqq#site-packages/slip/util/hookable.pynu[# -*- coding: utf-8 -*- # # Copyright © 2008 Red Hat, Inc. # Authors: # Nils Philippsen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """This module contains variants of certain base types which call registered hooks on changes.""" __all__ = ["Hookable", "HookableSet"] class HookableType(type): def __new__(cls, name, bases, dct): if dct.has_key("_hookable_change_methods"): try: base = dct["_hookable_base_class"] except KeyError: base = None for base_candidate in filter(lambda x: x != Hookable, bases): if base: raise TypeError("too many base classes: %s" % str(bases)) else: base = base_candidate for methodname in dct["_hookable_change_methods"]: dct[methodname] = HookableType.wrap_method(base, methodname) return type.__new__(cls, name, bases, dct) @classmethod def wrap_method(cls, base, methodname): func = getattr(base, methodname) def methodwrapper(self, *p, **k): retval = func(self, *p, **k) self._run_hooks() return retval methodwrapper.func_name = methodname return methodwrapper class _HookEntry(object): def __init__(self, hook, args, kwargs): self.__hook = hook self.__args = args self.__kwargs = kwargs def __cmp__(self, obj): return self.__hook == obj.__hook and self.__args == obj.__args and \ self.__kwargs == obj.__kwargs def __hash__(self): return self.__hook.__hash__() ^ self.__args.__hash__() ^ \ self.__kwargs.iteritems().__hash__() def run(self): self.__hook(*self.__args, **self.__kwargs) class Hookable(object): """An object which calls registered hooks on changes.""" __metaclass__ = HookableType @property def __hooks__(self, *p, **k): if not hasattr(self, "__real_hooks__"): self.__real_hooks__ = set() return self.__real_hooks__ def _get_hooks_enabled(self): if not hasattr(self, "__hooks_enabled__"): self.__hooks_enabled__ = True return self.__hooks_enabled__ def _set_hooks_enabled(self, enabled): self.__hooks_enabled__ = enabled hooks_enabled = property(_get_hooks_enabled, _set_hooks_enabled) def _get_hooks_frozen(self): if not hasattr(self, "__hooks_frozen__"): self.__hooks_frozen__ = False return self.__hooks_frozen__ def _set_hooks_frozen(self, freeze): if freeze == self.hooks_frozen: return self.__hooks_frozen__ = freeze if freeze: self.__hooks_frozen_entries__ = set() else: for hookentry in self.__hooks_frozen_entries__: hookentry.run() del self.__hooks_frozen_entries__ hooks_frozen = property(_get_hooks_frozen, _set_hooks_frozen) def freeze_hooks(self): self.hooks_frozen = True def thaw_hooks(self): self.hooks_frozen = False def add_hook(self, hook, *args, **kwargs): assert callable(hook) hookentry = _HookEntry(hook, args, kwargs) self.__hooks__.add(hookentry) def remove_hook(self, hook, *args, **kwargs): self.__hooks__.remove(_HookEntry(hook, args, kwargs)) def _run_hooks(self): if self.hooks_enabled: if not self.hooks_frozen: for hookentry in self.__hooks__: hookentry.run() else: self.__hooks_frozen_entries__.update(self.__hooks__) class HookableSet(set, Hookable): """A set object which calls registered hooks on changes.""" _hookable_change_methods = ("add", "clear", "difference_update", "discard", "intersection_update", "pop", "remove", "symmetric_difference_update", "update") def copy(self): obj = set.copy(self) obj.__real_hooks__ = set() return obj PK[W$site-packages/slip/util/__init__.pyonu[ 9Qc@sddlZddlZdS(iN(thookabletfiles(((s6/usr/lib/python2.7/site-packages/slip/util/__init__.pyts PK[MYl$site-packages/slip/util/hookable.pyonu[ 9Qc@sqdZddgZdefdYZdefdYZdefdYZdeefdYZd S( s[This module contains variants of certain base types which call registered hooks on changes.tHookablet HookableSett HookableTypecBs eZdZedZRS(cCs|jdry|d}WnYtk rxd}xCtd|D]+}|rktdt|qF|}qFWnXx+|dD]}tj||||$sstoo many base classes: %s( thas_keytKeyErrortNonetfiltert TypeErrortstrRt wrap_methodttypet__new__(tclstnametbasestdcttbasetbase_candidatet methodname((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs cs+t||fd}||_|S(Ncs |||}|j|S(N(t _run_hooks(tselftptktretval(tfunc(s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt methodwrapper4s (tgetattrt func_name(RRRR((Rs6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR 0s (t__name__t __module__Rt classmethodR (((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs t _HookEntrycBs,eZdZdZdZdZRS(cCs||_||_||_dS(N(t_HookEntry__hookt_HookEntry__argst_HookEntry__kwargs(Rthooktargstkwargs((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt__init__?s  cCs4|j|jko3|j|jko3|j|jkS(N(R$R%R&(Rtobj((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt__cmp__Es$cCs-|jj|jjA|jjjAS(N(R$t__hash__R%R&t iteritems(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR-IscCs|j|j|jdS(N(R$R%R&(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pytrunMs(R R!R*R,R-R/(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyR#=s   cBseZdZeZedZdZdZeeeZ dZ dZ ee e Z dZ dZdZd Zd ZRS( s2An object which calls registered hooks on changes.cOs%t|dst|_n|jS(Nt__real_hooks__(thasattrtsetR0(RRR((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt __hooks__WscCs"t|dst|_n|jS(Nt__hooks_enabled__(R1tTrueR4(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_get_hooks_enabled]s cCs ||_dS(N(R4(Rtenabled((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_set_hooks_enabledbscCs"t|dst|_n|jS(Nt__hooks_frozen__(R1tFalseR9(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_get_hooks_frozengs cCsY||jkrdS||_|r1t|_n$x|jD]}|jq;W|`dS(N(t hooks_frozenR9R2t__hooks_frozen_entries__R/(Rtfreezet hookentry((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt_set_hooks_frozenls cCs t|_dS(N(R5R<(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt freeze_hooks{scCs t|_dS(N(R:R<(R((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt thaw_hooks~scOs&t|||}|jj|dS(N(R#R3tadd(RR'R(R)R?((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pytadd_hookscOs |jjt|||dS(N(R3tremoveR#(RR'R(R)((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyt remove_hookscCsM|jrI|js3x1|jD]}|jqWqI|jj|jndS(N(t hooks_enabledR<R3R/R=tupdate(RR?((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs   (R R!t__doc__Rt __metaclass__tpropertyR3R6R8RGR;R@R<RARBRDRFR(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRQs        c BseZdZd Zd ZRS( s5A set object which calls registered hooks on changes.RCtcleartdifference_updatetdiscardtintersection_updatetpopREtsymmetric_difference_updateRHcCstj|}t|_|S(N(R2tcopyR0(RR+((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRRs ( saddsclearsdifference_updatesdiscardsintersection_updatespopsremovessymmetric_difference_updatesupdate(R R!RIRRR(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyRs N( RIt__all__RRtobjectR#RR2R(((s6/usr/lib/python2.7/site-packages/slip/util/hookable.pyts  "CPK[site-packages/slip/__init__.pynu[PK[kب)site-packages/slip/_wrappers/__init__.pycnu[ 9Qc@sdS(N((((s;/usr/lib/python2.7/site-packages/slip/_wrappers/__init__.pytsPK[J::)site-packages/slip/_wrappers/_gobject.pyonu[ 9Qc@sdZddlZdddgZejeZdZxedkrdejkrbejdZndejkrejdZnedkr7yddlZWqe k rddl Z qXq7q7Wx<eD]4Z e e ekreee eee qqWdS(spThis module lets some other slip modules cooperate with either the gobject or the gi.repository.GObject modules.iNtMainLoopt source_removet timeout_addtgobjectsgi.repository.GObject(t__doc__tsyst__all__tmodulest__name__t_selftNonet_modRt ImportErrortgi.repository.GObjecttgitwhattdirtsetattrtgetattr(((s;/usr/lib/python2.7/site-packages/slip/_wrappers/_gobject.pyts"     PK[(site-packages/slip/_wrappers/__init__.pynu[PK[+c O(site-packages/slip/_wrappers/_gobject.pynu[# -*- coding: utf-8 -*- # # Copyright © 2012 Red Hat, Inc. # Authors: # Nils Philippsen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """This module lets some other slip modules cooperate with either the gobject or the gi.repository.GObject modules.""" import sys __all__ = ['MainLoop', 'source_remove', 'timeout_add'] _self = sys.modules[__name__] _mod = None while _mod is None: if 'gobject' in sys.modules: _mod = sys.modules['gobject'] elif 'gi.repository.GObject' in sys.modules: _mod = sys.modules['gi.repository.GObject'] # if not yet imported, try to import gobject first, then # gi.repository.GObject ... if _mod is None: try: import gobject except ImportError: import gi.repository.GObject # ... then repeat. for what in __all__: if what not in dir(_self): setattr(_self, what, getattr(_mod, what)) PK[J::)site-packages/slip/_wrappers/_gobject.pycnu[ 9Qc@sdZddlZdddgZejeZdZxedkrdejkrbejdZndejkrejdZnedkr7yddlZWqe k rddl Z qXq7q7Wx<eD]4Z e e ekreee eee qqWdS(spThis module lets some other slip modules cooperate with either the gobject or the gi.repository.GObject modules.iNtMainLoopt source_removet timeout_addtgobjectsgi.repository.GObject(t__doc__tsyst__all__tmodulest__name__t_selftNonet_modRt ImportErrortgi.repository.GObjecttgitwhattdirtsetattrtgetattr(((s;/usr/lib/python2.7/site-packages/slip/_wrappers/_gobject.pyts"     PK[kب)site-packages/slip/_wrappers/__init__.pyonu[ 9Qc@sdS(N((((s;/usr/lib/python2.7/site-packages/slip/_wrappers/__init__.pytsPK[Qsite-packages/slip/__init__.pyonu[ 9Qc@sdS(N((((s1/usr/lib/python2.7/site-packages/slip/__init__.pytsPK[##"site-packages/slip/dbus/polkit.pyonu[ iZc@sdZddlZddlmZddlmZddddd d gZd Zd Zdefd YZ de dddZ dej fdYZ defdYZeZdZeidZdS(smThis module contains convenience decorators and functions for using PolicyKit with dbus services and clients.iN(t decorator(tmethod_call_no_timeoutt require_autht enable_proxytAUTHFAIL_DONTCATCHtNotAuthorizedExceptiontAreAuthorizationsObtainabletIsSystemBusNameAuthorizedAsynccsfd}|S(sDecorator for DBus service methods. Specify that a user needs a specific PolicyKit authorization `polkit_auth´ to execute it.cst|d|S(Nt_slip_polkit_auth_required(tsetattr(tmethod(t polkit_auth(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pytrequire_auth_decorator)s((R R ((R s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR#ssBorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException.cBseZRS((t__name__t __module__(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR4scsEfd|dk r.t|Sfd}|SdS(sDecorator for DBus proxy methods. Let's you (optionally) specify either a result value or an exception type and a callback which is returned, thrown or called respectively if a PolicyKit authorization doesn't exist or can't be obtained in the DBus mechanism, i.e. an appropriate DBus exception is thrown. An exception constructor may and a callback must accept an `action_id´ parameter which will be set to the id of the PolicyKit action for which authorization could not be obtained. Examples: 1) Return `False´ in the event of an authorization problem, and call `error_handler´: def error_handler(action_id=None): print "Authorization problem:", action_id class MyProxy(object): @polkit.enable_proxy(authfail_result=False, authfail_callback=error_handler) def some_method(self, ...): ... 2) Throw a `MyAuthError´ instance in the event of an authorization problem: class MyAuthError(Exception): def __init__(self, *args, **kwargs): action_id = kwargs.pop("action_id") super(MyAuthError, self).__init__(*args, **kwargs) self.action_id = action_id class MyProxy(object): @polkit.enable_proxy(authfail_exception=MyAuthError) def some_method(self, ...): ...csy|||SWntjk r}|j}|jtsGn|tt}dk rsd|ndk ryd|}Wn}nX|ntkrnSXdS(Nt action_id(tdbust DBusExceptiont get_dbus_namet startswithtAUTH_EXC_PREFIXtlentNoneR(tfunctptktetexc_nameRtaf_exc(tauthfail_callbacktauthfail_exceptiontauthfail_result(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt _enable_proxyds$      cs t|S(N(R(R(R (s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pytdecoratesN(RR(RRRRR!((R RRRs4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR7s -  cBseZdZdZdZRS(sqException which a DBus service method throws if an authorization required for executing it can't be obtained.sAorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedExceptioncOs4|jjd||_tt|j||dS(Nt.(t __class__t_dbus_error_nametsuperRt__init__(tselfRRR((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR&s(R Rt__doc__R$R&(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRstPolKitcBseZdZdZdZdZd Zd Zd Z d Z e dZ e dZe dZe dZe dZd Zd Zd Zeid ZRS(s"Convenience wrapper around polkit.sorg.freedesktop.PolicyKit1s%/org/freedesktop/PolicyKit1/Authoritys$org.freedesktop.PolicyKit1.AuthoritycCsM||jkrItjrItjjtjdt_dt_dt_ndS(N(t _dbus_nameR)t _PolKit__bustremove_signal_receivert_PolKit__signal_receiverRt_PolKit__interface(tclstnamet old_ownert new_owner((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt_on_name_owner_changeds   cCsItjsBtjt_tjjd|jddddt_ntjS(Nthandler_functiont signal_nametNameOwnerChangedtdbus_interfacesorg.freedesktop.DBus(R)R+Rt SystemBustadd_signal_receiverR3R-(R'((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt_buss   cCs%tjs|jjt_ntjS(N(R)t_PolKit__bus_nameR:tget_unique_name(R'((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt _bus_names cCs[tjsTy1tj|jj|j|j|jt_WqTtj k rPqTXntjS(N( R)R.Rt InterfaceR:t get_objectR*t _dbus_patht_dbus_interfaceR(R'((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt _interfaces cCs t|jS(N(tboolRB(R'((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt_polkit_presentscCsN|jjdd}tj|d}y|j|}Wn d}nX|S(Nsorg.freedesktop.DBuss/org/freedesktop/DBus(R:R?RR>tGetConnectionUnixUserR(R'tsystem_bus_namet bus_objectt bus_interfacetuid((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt__dbus_system_bus_name_uids   cCsN|js tS|jjdi|jd6f|idd\}}}|pM|S(Nssystem-bus-nameR0it(RDtTrueRBtCheckAuthorizationR=(R't authorizationt is_authorizedt is_challengetdetails((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt__authorization_is_obtainables   csGjs tSt|tr(|g}ntfd|t}|S(Ncs|oj|S(N(t$_PolKit__authorization_is_obtainable(txty(R'(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyts(RDRLt isinstancet basestringtreduce(R'tauthorizationst obtainable((R's4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRs   c s|js.|dkp*|j|dkSd}|rG|dO}nfd}|jjdi|d6f|||dd|d|d tdS( Niics|\}}}|dS(N((targsRORPRQ(t reply_handler(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pytreply_cbsssystem-bus-nameR0RKR]t error_handlerttimeout(RDRt!_PolKit__dbus_system_bus_name_uidRBRMR( R'RFRR]R_t challengeRQtflagsR^((R]s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRs    N(R RR(R*R@RARR.R+R;R-t classmethodR3tpropertyR:R=RBRDRaRSRRLR(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR)s"   cCs tj|S(N(t__polkitR(RZ((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRscCstj||||||S(N(RfR(RFRR]R_RbRQ((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR s (R(RRt constantsRt__all__RRtobjectRRRRRR)RfRRLR(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyts    On  PK[}ll$site-packages/slip/dbus/__init__.pycnu[ 9Qc@s\ddlZddlmZmZmZddlZddlZddlZddlZdS(iN(t SessionBust SystemBust StarterBus(tbusRRRtproxiestservicetpolkittmainloop(((s6/usr/lib/python2.7/site-packages/slip/dbus/__init__.pyts    PK[|ӮNN$site-packages/slip/dbus/mainloop.pycnu[ 9Qc@sEdZdZdefdYZdefdYZdZdS( sVThis module contains mainloop wrappers. Currently only glib main loops are supported.tMainLooptset_typecBsYeZdZdZdZedZdZdZ dZ dZ dZ RS( sAn abstract main loop wrapper class and factory. Use MainLoop() to get a main loop wrapper object for a main loop type previously registered with set_type(). Defaults to glib main loops. Actual main loop wrapper classes are derived from this class.cOs>tjdkrtjdntt|jtj||S(Ntglib(Rt_mainloop_classtNoneRtsupert__new__t_MainLoop__mainloop_class(tclstargstkwargs((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyR)scCsptjdk rtdnitd6}||krG||t_n%td|dj|jfdS(sxSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported)s(The main loop type can only be set once.Rs2'%s' is not one of the valid main loop types (%s).t,N(RRRt RuntimeErrort GlibMainLoopt ValueErrortjointkeys(Rtmltypet ml_type_class((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyR0s  cCs tdS(s$Returns if there are pending events.N(tNotImplementedError(tself((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytpendingAscCs tdS(s Iterates over one pending event.N(R(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytiterateFscCs!x|jr|jqWdS(s!Iterates over all pending events.N(RR(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytiterate_over_pending_eventsKscCs tdS(sRuns the main loop.N(R(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytrunQscCs tdS(sQuits the main loop.N(R(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytquitVsN( t__name__t __module__t__doc__RRRt classmethodRRRRRR(((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyRs     R cBseZdZRS(cCseddlm}|j}|j}||_|j|_|j|_|j|_|j |_ dS(Ni(t_gobject( tslip._wrappersRRt get_contextt _mainloopRt iterationRRR(RRtmltctx((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyt__init__^s      (RRR%(((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyR \scCs.ddlm}|dttj|dS(sSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported) Deprecated, use MainLoop.set_type() instead.i(twarnsuse MainLoop.set_type() insteadN(twarningsR&tDeprecationWarningRR(RR&((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyRjs N(sMainLoopsset_type(Rt__all__tobjectRR R(((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyts=PK[~~"site-packages/slip/dbus/service.pynu[# -*- coding: utf-8 -*- # slip.dbus.service -- convenience functions for using dbus-activated # services # # Copyright © 2008, 2009 Red Hat, Inc. # Authors: Nils Philippsen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """This module contains convenience functions for using dbus-activated services.""" import dbus import dbus.service from slip._wrappers import _gobject as GObject import polkit __all__ = ["Object", "InterfaceType", "set_mainloop"] __mainloop__ = None def __glib_quit_cb__(): global __mainloop__ # assume a Glib mainloop __mainloop__.quit() __quit_cb__ = __glib_quit_cb__ def set_mainloop(mainloop): global __mainloop__ __mainloop__ = mainloop def set_quit_cb(quit_cb): global __quit_cb__ __quit_cb__ = quit_cb def quit_cb(): global __quit_cb__ __quit_cb__() SENDER_KEYWORD = "__slip_dbus_service_sender__" ASYNC_CALLBACKS = ("__slip_dbus_service_reply_cb__", "__slip_dbus_service_error_cb__") def wrap_method(method): global SENDER_KEYWORD global ASYNC_CALLBACKS if method._dbus_sender_keyword is not None: sender_keyword = method._dbus_sender_keyword hide_sender_keyword = False else: sender_keyword = SENDER_KEYWORD hide_sender_keyword = True if method._dbus_async_callbacks is not None: async_callbacks = method._dbus_async_callbacks method_is_async = True else: async_callbacks = ASYNC_CALLBACKS method_is_async = False hide_async_callbacks = not method_is_async def wrapped_method(self, *p, **k): sender = k.get(sender_keyword) if sender is not None: # i.e. called over the bus, not locally reply_cb = k[async_callbacks[0]] error_cb = k[async_callbacks[1]] if hide_sender_keyword: del k[sender_keyword] if hide_async_callbacks: del k[async_callbacks[0]] del k[async_callbacks[1]] self.sender_seen(sender) action_id = getattr(method, "_slip_polkit_auth_required", getattr(self, "default_polkit_auth_required", None)) if sender is not None and action_id: def reply_handler(is_auth): if is_auth: if method_is_async: # k contains async callbacks, simply pass on reply_cb # and error_cb method(self, *p, **k) else: # execute the synchronous method ... error = None try: result = method(self, *p, **k) except Exception, e: error = e # ... and call the reply or error callback if error: error_cb(error) else: # reply_cb((None,)) != reply_cb() if result is None: reply_cb() else: reply_cb(result) else: error_cb(polkit.NotAuthorizedException(action_id)) self.timeout_restart() def error_handler(error): error_cb(error) self.timeout_restart() polkit.IsSystemBusNameAuthorizedAsync(sender, action_id, reply_handler=reply_handler, error_handler=error_handler) else: # no action id, or run locally, no need to do anything fancy retval = method(self, *p, **k) self.timeout_restart() return retval for attr in filter(lambda x: x[:6] == "_dbus_", dir(method)): if attr == "_dbus_sender_keyword": wrapped_method._dbus_sender_keyword = sender_keyword elif attr == "_dbus_async_callbacks": wrapped_method._dbus_async_callbacks = async_callbacks else: setattr(wrapped_method, attr, getattr(method, attr)) # delattr (method, attr) wrapped_method.func_name = method.func_name return wrapped_method class InterfaceType(dbus.service.InterfaceType): def __new__(cls, name, bases, dct): for (attrname, attr) in dct.iteritems(): if getattr(attr, "_dbus_is_method", False): dct[attrname] = wrap_method(attr) return super(InterfaceType, cls).__new__(cls, name, bases, dct) class Object(dbus.service.Object): __metaclass__ = InterfaceType # timeout & persistence persistent = False default_duration = 5 duration = default_duration current_source = None senders = set() connections_senders = {} connections_smobjs = {} # PolicyKit default_polkit_auth_required = None def __init__(self, conn=None, object_path=None, bus_name=None, persistent=None): super(Object, self).__init__(conn, object_path, bus_name) if persistent == None: self.persistent = self.__class__.persistent else: self.persistent = persistent def _timeout_cb(self): if not self.persistent and len(Object.senders) == 0: quit_cb() return False Object.current_source = None Object.duration = self.default_duration return False def _name_owner_changed(self, name, old_owner, new_owner): conn = self.connection if not new_owner and (old_owner, conn) in Object.senders: Object.senders.remove((old_owner, conn)) Object.connections_senders[conn].remove(old_owner) if len(Object.connections_senders[conn]) == 0: Object.connections_smobjs[conn].remove() del Object.connections_senders[conn] del Object.connections_smobjs[conn] if not self.persistent and len(Object.senders) == 0 and \ Object.current_source == None: quit_cb() def timeout_restart(self, duration=None): if not duration: duration = self.__class__.default_duration if not Object.duration or duration > Object.duration: Object.duration = duration if not self.persistent or len(Object.senders) == 0: if Object.current_source: GObject.source_remove(Object.current_source) Object.current_source = \ GObject.timeout_add(Object.duration * 1000, self._timeout_cb) def sender_seen(self, sender): if (sender, self.connection) not in Object.senders: Object.senders.add((sender, self.connection)) if self.connection not in Object.connections_senders.keys(): Object.connections_senders[self.connection] = set() Object.connections_smobjs[self.connection] = \ self.connection.add_signal_receiver( handler_function=self._name_owner_changed, signal_name="NameOwnerChanged", dbus_interface="org.freedesktop.DBus") Object.connections_senders[self.connection].add(sender) PK[+uu"site-packages/slip/dbus/proxies.pynu[# -*- coding: utf-8 -*- # slip.dbus.proxies -- slightly augmented dbus proxy classes # # Copyright © 2005-2007 Collabora Ltd. # Copyright © 2009, 2011 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Authors: # Nils Philippsen """This module contains D-Bus proxy classes which implement the default timeout of the augmented bus classes in slip.dbus.bus.""" import dbus.proxies import constants class _ProxyMethod(dbus.proxies._ProxyMethod): _connections_default_timeouts = {} @property def default_timeout(self): if self._connection not in self._connections_default_timeouts: dt = getattr(self._proxy._bus, "default_timeout", None) if dt is None: dt = constants.method_call_no_timeout self._connections_default_timeouts[self._connection] = dt return self._connections_default_timeouts[self._connection] def __call__(self, *args, **kwargs): if kwargs.get('timeout') is None: kwargs["timeout"] = self.default_timeout return dbus.proxies._ProxyMethod.__call__(self, *args, **kwargs) class ProxyObject(dbus.proxies.ProxyObject): ProxyMethodClass = _ProxyMethod PK[Y@site-packages/slip/dbus/bus.pyonu[ 9Qc@scdZddlZddlZddlZx2d D]*Zdied6ed 6ejd 6dUq1WdS( sQThis module contains functions which create monkey-patched/augmented D-Bus buses.iNtBust SystemBust SessionBust StarterBussdef %(name)s(*args, **kwargs): busobj = dbus.%(name)s(*args, **kwargs) busobj.ProxyObjectClass = proxies.ProxyObject busobj.default_timeout = %(default_timeout)s return busobj tnametmodnametdefault_timeout(RRRR(t__doc__tdbustproxiest constantsRt__name__tmethod_call_no_timeout(((s1/usr/lib/python2.7/site-packages/slip/dbus/bus.pyts     PK[^B#site-packages/slip/dbus/__init__.pynu[# -*- coding: utf-8 -*- import bus from bus import SessionBus, SystemBus, StarterBus import proxies import service import polkit import mainloop PK[-#site-packages/slip/dbus/proxies.pycnu[ 9Qc@sZdZddlZddlZdejjfdYZdejjfdYZdS(s{This module contains D-Bus proxy classes which implement the default timeout of the augmented bus classes in slip.dbus.bus.iNt _ProxyMethodcBs&eZiZedZdZRS(cCsc|j|jkrUt|jjdd}|dkrBtj}n||j|j|jddkr%|j|ds  PK[O $site-packages/slip/dbus/constants.pynu[# -*- coding: utf-8 -*- # slip.dbus.constants -- constant values # # Copyright © 2011 Red Hat, Inc. # Authors: Nils Philippsen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """This module contains some constant values.""" # The maximum value of a 32bit signed integer is the magic value to indicate an # infinite timeout for dbus. Unlike the C interface which deals with # milliseconds as integers, the python interface uses seconds as floats for the # timeout. Therefore we need to use the Python float (C double) value that # gives 0x7FFFFFFF if multiplied by 1000.0 and cast into an integer. # # This calculation should be precise enough to get a value of 0x7FFFFFFF on the # C side. If not, it will still amount to a very long time (not quite 25 days) # which should be enough for all intents and purposes. method_call_no_timeout = 0x7FFFFFFF / 1000.0 PK[8}  (site-packages/slip/dbus/introspection.pynu[#!/usr/bin/python # -*- coding: utf-8 -*- """Classes and functions to easily access DBus introspection data.""" from xml.etree.ElementTree import ElementTree from StringIO import StringIO class IElemMeta(type): """Metaclass for introspection elements. Sets elemname class member automatically from class name if not set explicitly. Registers classes for their element names.""" elemnames_to_classes = {} @classmethod def clsname_to_elemname(cls, clsname): elemname = "" for c in clsname: c_lower = c.lower() if c_lower != c: if len(elemname): elemname += "_" elemname += c_lower return elemname def __new__(cls, name, bases, dct): if name == "IElem": return type.__new__(cls, name, bases, dct) if 'elemname' not in dct: if not name.startswith("IElem"): raise TypeError("Class '%s' needs to set elemname (or be " "called 'IElem...'))" % name) dct['elemname'] = IElemMeta.clsname_to_elemname(name[5:]) elemname = dct['elemname'] if elemname in IElemMeta.elemnames_to_classes: raise TypeError("Class '%s' tries to register duplicate elemname " "'%s'" % (name, elemname)) kls = type.__new__(cls, name, bases, dct) IElemMeta.elemnames_to_classes[elemname] = kls return kls class IElem(object): """Base class for introspection elements.""" __metaclass__ = IElemMeta def __new__(cls, elem, parent=None): kls = IElemMeta.elemnames_to_classes.get(elem.tag, IElemMeta.elemnames_to_classes[None]) return super(IElem, cls).__new__(kls, elem, parent) def __init__(self, elem, parent=None): self.elem = elem self.parent = parent self.child_elements = [ IElem(c, parent=self) for c in elem ] def __str__(self): s = "%s %r" % (self.elemname if self.elemname else "unknown:%s" % self.elem.tag, self.attrib) for c in self.child_elements: for cc in str(c).split("\n"): s+="\n %s" % (cc) return s @property def attrib(self): return self.elem.attrib class IElemUnknown(IElem): """Catch-all for unknown introspection elements.""" elemname = None class IElemNameMixin(object): """Mixin for introspection elements with names.""" @property def name(self): return self.attrib['name'] class IElemNode(IElem, IElemNameMixin): """Introspection node.""" def __init__(self, elem, parent=None): super(IElemNode, self).__init__(elem, parent) self.child_nodes = [ c for c in self.child_elements if isinstance(c, IElemNode) ] class IElemInterface(IElem): """Introspection interface.""" class IElemMethod(IElem): """Introspection interface method.""" class IElemArg(IElem): """Introspection method argument.""" class IElemSignal(IElem, IElemNameMixin): """Introspection interface signal.""" def introspect(string_or_file): tree = ElementTree() # assume string if read() method doesn't exist, works for string, unicode, # dbus.String if not hasattr(string_or_file, "read"): string_or_file = StringIO(string_or_file) xml_root = tree.parse(string_or_file) elem_root = IElem(xml_root) return elem_root PK[}ll$site-packages/slip/dbus/__init__.pyonu[ 9Qc@s\ddlZddlmZmZmZddlZddlZddlZddlZdS(iN(t SessionBust SystemBust StarterBus(tbusRRRtproxiestservicetpolkittmainloop(((s6/usr/lib/python2.7/site-packages/slip/dbus/__init__.pyts    PK[,"%site-packages/slip/dbus/constants.pycnu[ 9Qc@sdZddZdS(s*This module contains some constant values.ig@@N(t__doc__tmethod_call_no_timeout(((s7/usr/lib/python2.7/site-packages/slip/dbus/constants.pyts PK[ɉ$$"site-packages/slip/dbus/polkit.pycnu[ iZc@sdZddlZddlmZddlmZddddd d gZd Zd Zdefd YZ de dddZ dej fdYZ defdYZeZdZeidZdS(smThis module contains convenience decorators and functions for using PolicyKit with dbus services and clients.iN(t decorator(tmethod_call_no_timeoutt require_autht enable_proxytAUTHFAIL_DONTCATCHtNotAuthorizedExceptiontAreAuthorizationsObtainabletIsSystemBusNameAuthorizedAsynccsfd}|S(sDecorator for DBus service methods. Specify that a user needs a specific PolicyKit authorization `polkit_auth´ to execute it.cs)t|dstt|d|S(Nt_dbus_is_methodt_slip_polkit_auth_required(thasattrtAssertionErrortsetattr(tmethod(t polkit_auth(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pytrequire_auth_decorator)s((RR((Rs4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR#ssBorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException.cBseZRS((t__name__t __module__(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR4scs|dkst|stdtfksBdksBtdks`ts`tdksttstfd|dk rt|Sfd}|SdS(sDecorator for DBus proxy methods. Let's you (optionally) specify either a result value or an exception type and a callback which is returned, thrown or called respectively if a PolicyKit authorization doesn't exist or can't be obtained in the DBus mechanism, i.e. an appropriate DBus exception is thrown. An exception constructor may and a callback must accept an `action_id´ parameter which will be set to the id of the PolicyKit action for which authorization could not be obtained. Examples: 1) Return `False´ in the event of an authorization problem, and call `error_handler´: def error_handler(action_id=None): print "Authorization problem:", action_id class MyProxy(object): @polkit.enable_proxy(authfail_result=False, authfail_callback=error_handler) def some_method(self, ...): ... 2) Throw a `MyAuthError´ instance in the event of an authorization problem: class MyAuthError(Exception): def __init__(self, *args, **kwargs): action_id = kwargs.pop("action_id") super(MyAuthError, self).__init__(*args, **kwargs) self.action_id = action_id class MyProxy(object): @polkit.enable_proxy(authfail_exception=MyAuthError) def some_method(self, ...): ...csy|||SWntjk r}|j}|jtsGn|tt}dk rsd|ndk ryd|}Wn}nX|ntkrnSXdS(Nt action_id(tdbust DBusExceptiont get_dbus_namet startswithtAUTH_EXC_PREFIXtlentNoneR(tfunctptktetexc_nameRtaf_exc(tauthfail_callbacktauthfail_exceptiontauthfail_result(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt _enable_proxyds$      cs t|S(N(R(R(R#(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pytdecoratesN(RtcallableR Rt issubclasst ExceptionR(RR"R!R R$((R#R R!R"s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR7s'$!  cBseZdZdZdZRS(sqException which a DBus service method throws if an authorization required for executing it can't be obtained.sAorg.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedExceptioncOs4|jjd||_tt|j||dS(Nt.(t __class__t_dbus_error_nametsuperRt__init__(tselfRRR((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR,s(RRt__doc__R*R,(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRstPolKitcBseZdZdZdZdZd Zd Zd Z d Z e dZ e dZe dZe dZe dZd Zd Zd Zeid ZRS(s"Convenience wrapper around polkit.sorg.freedesktop.PolicyKit1s%/org/freedesktop/PolicyKit1/Authoritys$org.freedesktop.PolicyKit1.AuthoritycCsM||jkrItjrItjjtjdt_dt_dt_ndS(N(t _dbus_nameR/t _PolKit__bustremove_signal_receivert_PolKit__signal_receiverRt_PolKit__interface(tclstnamet old_ownert new_owner((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt_on_name_owner_changeds   cCsItjsBtjt_tjjd|jddddt_ntjS(Nthandler_functiont signal_nametNameOwnerChangedtdbus_interfacesorg.freedesktop.DBus(R/R1Rt SystemBustadd_signal_receiverR9R3(R-((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt_buss   cCs%tjs|jjt_ntjS(N(R/t_PolKit__bus_nameR@tget_unique_name(R-((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt _bus_names cCs[tjsTy1tj|jj|j|j|jt_WqTtj k rPqTXntjS(N( R/R4Rt InterfaceR@t get_objectR0t _dbus_patht_dbus_interfaceR(R-((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt _interfaces cCs t|jS(N(tboolRH(R-((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt_polkit_presentscCsN|jjdd}tj|d}y|j|}Wn d}nX|S(Nsorg.freedesktop.DBuss/org/freedesktop/DBus(R@RERRDtGetConnectionUnixUserR(R-tsystem_bus_namet bus_objectt bus_interfacetuid((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt__dbus_system_bus_name_uids   cCsN|js tS|jjdi|jd6f|idd\}}}|pM|S(Nssystem-bus-nameR6it(RJtTrueRHtCheckAuthorizationRC(R-t authorizationt is_authorizedt is_challengetdetails((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyt__authorization_is_obtainables   csGjs tSt|tr(|g}ntfd|t}|S(Ncs|oj|S(N(t$_PolKit__authorization_is_obtainable(txty(R-(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyts(RJRRt isinstancet basestringtreduce(R-tauthorizationst obtainable((R-s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRs   c s|js.|dkp*|j|dkSd}|rG|dO}nfd}|jjdi|d6f|||dd|d|d tdS( Niics|\}}}|dS(N((targsRURVRW(t reply_handler(s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pytreply_cbsssystem-bus-nameR6RQRct error_handlerttimeout(RJRt!_PolKit__dbus_system_bus_name_uidRHRSR( R-RLRRcRet challengeRWtflagsRd((Rcs4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRs    N(RRR.R0RFRGRR4R1RAR3t classmethodR9tpropertyR@RCRHRJRgRYRRRR(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR/s"   cCs tj|S(N(t__polkitR(R`((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyRscCstj||||||S(N(RlR(RLRRcReRhRW((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyR s (R.RRt constantsRt__all__RRtobjectRRRRRR/RlRRRR(((s4/usr/lib/python2.7/site-packages/slip/dbus/polkit.pyts    On  PK[M M #site-packages/slip/dbus/mainloop.pynu[# -*- coding: utf-8 -*- # slip.dbus.mainloop -- mainloop wrappers # # Copyright © 2009, 2012 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Authors: # Nils Philippsen """This module contains mainloop wrappers. Currently only glib main loops are supported.""" __all__ = ("MainLoop", "set_type") class MainLoop(object): """An abstract main loop wrapper class and factory. Use MainLoop() to get a main loop wrapper object for a main loop type previously registered with set_type(). Defaults to glib main loops. Actual main loop wrapper classes are derived from this class.""" __mainloop_class = None def __new__(cls, *args, **kwargs): global _mainloop_class if MainLoop._mainloop_class is None: MainLoop.set_type("glib") return super(MainLoop, cls).__new__(MainLoop.__mainloop_class, *args, **kwargs) @classmethod def set_type(cls, mltype): """Set a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported)""" if MainLoop.__mainloop_class is not None: raise RuntimeError("The main loop type can only be set once.") ml_type_class = {"glib": GlibMainLoop} if mltype in ml_type_class: MainLoop.__mainloop_class = ml_type_class[mltype] else: raise ValueError("'%s' is not one of the valid main loop types (%s)." % (mltype, ",".join(ml_type_class.keys()))) def pending(self): """Returns if there are pending events.""" raise NotImplementedError() def iterate(self): """Iterates over one pending event.""" raise NotImplementedError() def iterate_over_pending_events(self): """Iterates over all pending events.""" while self.pending(): self.iterate() def run(self): """Runs the main loop.""" raise NotImplementedError() def quit(self): """Quits the main loop.""" raise NotImplementedError() class GlibMainLoop(MainLoop): def __init__(self): from slip._wrappers import _gobject ml = _gobject.MainLoop() ctx = ml.get_context() self._mainloop = ml self.pending = ctx.pending self.iterate = ctx.iteration self.run = ml.run self.quit = ml.quit def set_type(mltype): """Set a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported) Deprecated, use MainLoop.set_type() instead.""" from warnings import warn warn("use MainLoop.set_type() instead", DeprecationWarning) MainLoop.set_type(mltype) PK[-#site-packages/slip/dbus/proxies.pyonu[ 9Qc@sZdZddlZddlZdejjfdYZdejjfdYZdS(s{This module contains D-Bus proxy classes which implement the default timeout of the augmented bus classes in slip.dbus.bus.iNt _ProxyMethodcBs&eZiZedZdZRS(cCsc|j|jkrUt|jjdd}|dkrBtj}n||j|j|jddkr%|j|ds  PK[PPP)site-packages/slip/dbus/introspection.pyonu[ 9Qc@sdZddlmZddlmZdefdYZdefdYZdefd YZd efd YZ d ee fd YZ defdYZ defdYZ defdYZ dee fdYZdZdS(s?Classes and functions to easily access DBus introspection data.i(t ElementTree(tStringIOt IElemMetacBs,eZdZiZedZdZRS(sMetaclass for introspection elements. Sets elemname class member automatically from class name if not set explicitly. Registers classes for their element names.cCsYd}xL|D]D}|j}||krGt|rG|d7}qGn||7}q W|S(Ntt_(tlowertlen(tclstclsnametelemnametctc_lower((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pytclsname_to_elemnames    cCs|dkr"tj||||Sd|krj|jdsPtd|ntj|d|d||_||_g|D]}t|d|^q|_dS(NR (RR R tchild_elements(tselfRR R ((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyt__init__=s  cCsud|jr|jn d|jj|jf}x?|jD]4}x+t|jdD]}|d|7}qUWq9W|S(Ns%s %rs unknown:%ss s %s(R RRtattribR!tstrtsplit(R"tsR tcc((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyt__str__Bs cCs |jjS(N(RR$(R"((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR$JsN( RRRRt __metaclass__RRR#R)tpropertyR$(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR 3s    t IElemUnknowncBseZdZdZRS(s-Catch-all for unknown introspection elements.N(RRRRR (((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR,OstIElemNameMixincBseZdZedZRS(s,Mixin for introspection elements with names.cCs |jdS(NR(R$(R"((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyRXs(RRRR+R(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR-Ust IElemNodecBseZdZddZRS(sIntrospection node.cCsKtt|j||g|jD]}t|tr#|^q#|_dS(N(RR.R#R!t isinstancet child_nodes(R"RR R ((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR#`sN(RRRRR#(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR.]stIElemInterfacecBseZdZRS(sIntrospection interface.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR1fst IElemMethodcBseZdZRS(sIntrospection interface method.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR2jstIElemArgcBseZdZRS(sIntrospection method argument.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR3nst IElemSignalcBseZdZRS(sIntrospection interface signal.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR4rscCsFt}t|ds't|}n|j|}t|}|S(Ntread(RthasattrRtparseR (tstring_or_filettreetxml_roott elem_root((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyt introspectvs   N(Rtxml.etree.ElementTreeRRRRtobjectR R,R-R.R1R2R3R4R<(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyts* PK[[:SSsite-packages/slip/dbus/bus.pynu[# -*- coding: utf-8 -*- # slip.dbus.bus -- augmented dbus buses # # Copyright © 2009, 2011 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Authors: # Nils Philippsen """This module contains functions which create monkey-patched/augmented D-Bus buses.""" import dbus import proxies import constants for name in ("Bus", "SystemBus", "SessionBus", "StarterBus"): exec \ """def %(name)s(*args, **kwargs): busobj = dbus.%(name)s(*args, **kwargs) busobj.ProxyObjectClass = proxies.ProxyObject busobj.default_timeout = %(default_timeout)s return busobj """ % {"name": name, "modname": __name__, "default_timeout": constants.method_call_no_timeout} PK[|ӮNN$site-packages/slip/dbus/mainloop.pyonu[ 9Qc@sEdZdZdefdYZdefdYZdZdS( sVThis module contains mainloop wrappers. Currently only glib main loops are supported.tMainLooptset_typecBsYeZdZdZdZedZdZdZ dZ dZ dZ RS( sAn abstract main loop wrapper class and factory. Use MainLoop() to get a main loop wrapper object for a main loop type previously registered with set_type(). Defaults to glib main loops. Actual main loop wrapper classes are derived from this class.cOs>tjdkrtjdntt|jtj||S(Ntglib(Rt_mainloop_classtNoneRtsupert__new__t_MainLoop__mainloop_class(tclstargstkwargs((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyR)scCsptjdk rtdnitd6}||krG||t_n%td|dj|jfdS(sxSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported)s(The main loop type can only be set once.Rs2'%s' is not one of the valid main loop types (%s).t,N(RRRt RuntimeErrort GlibMainLoopt ValueErrortjointkeys(Rtmltypet ml_type_class((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyR0s  cCs tdS(s$Returns if there are pending events.N(tNotImplementedError(tself((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytpendingAscCs tdS(s Iterates over one pending event.N(R(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytiterateFscCs!x|jr|jqWdS(s!Iterates over all pending events.N(RR(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytiterate_over_pending_eventsKscCs tdS(sRuns the main loop.N(R(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytrunQscCs tdS(sQuits the main loop.N(R(R((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pytquitVsN( t__name__t __module__t__doc__RRRt classmethodRRRRRR(((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyRs     R cBseZdZRS(cCseddlm}|j}|j}||_|j|_|j|_|j|_|j |_ dS(Ni(t_gobject( tslip._wrappersRRt get_contextt _mainloopRt iterationRRR(RRtmltctx((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyt__init__^s      (RRR%(((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyR \scCs.ddlm}|dttj|dS(sSet a main loop type for non-blocking interfaces. mltype: "glib" (currently only glib main loops are supported) Deprecated, use MainLoop.set_type() instead.i(twarnsuse MainLoop.set_type() insteadN(twarningsR&tDeprecationWarningRR(RR&((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyRjs N(sMainLoopsset_type(Rt__all__tobjectRR R(((s6/usr/lib/python2.7/site-packages/slip/dbus/mainloop.pyts=PK[[2V##!site-packages/slip/dbus/polkit.pynu[# -*- coding: utf-8 -*- # slip.dbus.polkit -- convenience decorators and functions for using PolicyKit # with dbus services and clients # # Copyright © 2008, 2009, 2012, 2013 Red Hat, Inc. # Authors: Nils Philippsen # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """This module contains convenience decorators and functions for using PolicyKit with dbus services and clients.""" import dbus from decorator import decorator from constants import method_call_no_timeout __all__ = ["require_auth", "enable_proxy", "AUTHFAIL_DONTCATCH", "NotAuthorizedException", "AreAuthorizationsObtainable", "IsSystemBusNameAuthorizedAsync"] def require_auth(polkit_auth): """Decorator for DBus service methods. Specify that a user needs a specific PolicyKit authorization `polkit_auth´ to execute it.""" def require_auth_decorator(method): assert hasattr(method, "_dbus_is_method") setattr(method, "_slip_polkit_auth_required", polkit_auth) return method return require_auth_decorator AUTH_EXC_PREFIX = "org.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException." class AUTHFAIL_DONTCATCH(object): pass def enable_proxy(func=None, authfail_result=AUTHFAIL_DONTCATCH, authfail_exception=None, authfail_callback=None): """Decorator for DBus proxy methods. Let's you (optionally) specify either a result value or an exception type and a callback which is returned, thrown or called respectively if a PolicyKit authorization doesn't exist or can't be obtained in the DBus mechanism, i.e. an appropriate DBus exception is thrown. An exception constructor may and a callback must accept an `action_id´ parameter which will be set to the id of the PolicyKit action for which authorization could not be obtained. Examples: 1) Return `False´ in the event of an authorization problem, and call `error_handler´: def error_handler(action_id=None): print "Authorization problem:", action_id class MyProxy(object): @polkit.enable_proxy(authfail_result=False, authfail_callback=error_handler) def some_method(self, ...): ... 2) Throw a `MyAuthError´ instance in the event of an authorization problem: class MyAuthError(Exception): def __init__(self, *args, **kwargs): action_id = kwargs.pop("action_id") super(MyAuthError, self).__init__(*args, **kwargs) self.action_id = action_id class MyProxy(object): @polkit.enable_proxy(authfail_exception=MyAuthError) def some_method(self, ...): ...""" assert(func is None or callable(func)) assert(authfail_result in (None, AUTHFAIL_DONTCATCH) or authfail_exception is None) assert(authfail_callback is None or callable(authfail_callback)) assert(authfail_exception is None or issubclass(authfail_exception, Exception)) def _enable_proxy(func, *p, **k): try: return func(*p, **k) except dbus.DBusException, e: exc_name = e.get_dbus_name() if not exc_name.startswith(AUTH_EXC_PREFIX): raise action_id = exc_name[len(AUTH_EXC_PREFIX):] if authfail_callback is not None: authfail_callback(action_id=action_id) if authfail_exception is not None: try: af_exc = authfail_exception(action_id=action_id) except: af_exc = authfail_exception() raise af_exc if authfail_result is AUTHFAIL_DONTCATCH: raise return authfail_result if func is not None: return decorator(_enable_proxy, func) else: def decorate(func): return decorator(_enable_proxy, func) return decorate class NotAuthorizedException(dbus.DBusException): """Exception which a DBus service method throws if an authorization required for executing it can't be obtained.""" _dbus_error_name = \ "org.fedoraproject.slip.dbus.service.PolKit.NotAuthorizedException" def __init__(self, action_id, *p, **k): self._dbus_error_name = self.__class__._dbus_error_name + "."\ + action_id super(NotAuthorizedException, self).__init__(*p, **k) class PolKit(object): """Convenience wrapper around polkit.""" _dbus_name = 'org.freedesktop.PolicyKit1' _dbus_path = '/org/freedesktop/PolicyKit1/Authority' _dbus_interface = 'org.freedesktop.PolicyKit1.Authority' __interface = None __bus = None __bus_name = None __signal_receiver = None @classmethod def _on_name_owner_changed(cls, name, old_owner, new_owner): if name == cls._dbus_name and PolKit.__bus: PolKit.__bus.remove_signal_receiver(PolKit.__signal_receiver) PolKit.__bus = None PolKit.__signal_receiver = None PolKit.__interface = None @property def _bus(self): if not PolKit.__bus: PolKit.__bus = dbus.SystemBus() PolKit.__signal_receiver = PolKit.__bus.add_signal_receiver( handler_function = self._on_name_owner_changed, signal_name='NameOwnerChanged', dbus_interface='org.freedesktop.DBus') return PolKit.__bus @property def _bus_name(self): if not PolKit.__bus_name: PolKit.__bus_name = self._bus.get_unique_name() return PolKit.__bus_name @property def _interface(self): if not PolKit.__interface: try: PolKit.__interface = dbus.Interface(self._bus.get_object( self._dbus_name, self._dbus_path), self._dbus_interface) except dbus.DBusException: pass return PolKit.__interface @property def _polkit_present(self): return bool(self._interface) def __dbus_system_bus_name_uid(self, system_bus_name): bus_object = self._bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') bus_interface = dbus.Interface(bus_object, 'org.freedesktop.DBus') try: uid = bus_interface.GetConnectionUnixUser(system_bus_name) except: uid = None return uid def __authorization_is_obtainable(self, authorization): if not self._polkit_present: return True (is_authorized, is_challenge, details) = \ self._interface.CheckAuthorization( ("system-bus-name", {"name": self._bus_name}), authorization, {}, 0, "") return is_authorized or is_challenge def AreAuthorizationsObtainable(self, authorizations): if not self._polkit_present: return True if isinstance(authorizations, basestring): authorizations = [authorizations] obtainable = \ reduce(lambda x, y: x and self.__authorization_is_obtainable(y), authorizations, True) return obtainable def IsSystemBusNameAuthorizedAsync(self, system_bus_name, action_id, reply_handler, error_handler, challenge=True, details={}): if not self._polkit_present: return reply_handler(action_id is None or self.__dbus_system_bus_name_uid(system_bus_name) == 0) flags = 0 if challenge: flags |= 0x1 def reply_cb(args): (is_authorized, is_challenge, details) = args reply_handler(is_authorized) self._interface.CheckAuthorization(("system-bus-name", {"name": system_bus_name}), action_id, details, flags, "", reply_handler=reply_cb, error_handler=error_handler, timeout=method_call_no_timeout) __polkit = PolKit() def AreAuthorizationsObtainable(authorizations): return __polkit.AreAuthorizationsObtainable(authorizations) def IsSystemBusNameAuthorizedAsync(system_bus_name, action_id, reply_handler, error_handler, challenge=True, details={}): return __polkit.IsSystemBusNameAuthorizedAsync(system_bus_name, action_id, reply_handler, error_handler, challenge, details) PK[PPP)site-packages/slip/dbus/introspection.pycnu[ 9Qc@sdZddlmZddlmZdefdYZdefdYZdefd YZd efd YZ d ee fd YZ defdYZ defdYZ defdYZ dee fdYZdZdS(s?Classes and functions to easily access DBus introspection data.i(t ElementTree(tStringIOt IElemMetacBs,eZdZiZedZdZRS(sMetaclass for introspection elements. Sets elemname class member automatically from class name if not set explicitly. Registers classes for their element names.cCsYd}xL|D]D}|j}||krGt|rG|d7}qGn||7}q W|S(Ntt_(tlowertlen(tclstclsnametelemnametctc_lower((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pytclsname_to_elemnames    cCs|dkr"tj||||Sd|krj|jdsPtd|ntj|d|d||_||_g|D]}t|d|^q|_dS(NR (RR R tchild_elements(tselfRR R ((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyt__init__=s  cCsud|jr|jn d|jj|jf}x?|jD]4}x+t|jdD]}|d|7}qUWq9W|S(Ns%s %rs unknown:%ss s %s(R RRtattribR!tstrtsplit(R"tsR tcc((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyt__str__Bs cCs |jjS(N(RR$(R"((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR$JsN( RRRRt __metaclass__RRR#R)tpropertyR$(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR 3s    t IElemUnknowncBseZdZdZRS(s-Catch-all for unknown introspection elements.N(RRRRR (((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR,OstIElemNameMixincBseZdZedZRS(s,Mixin for introspection elements with names.cCs |jdS(NR(R$(R"((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyRXs(RRRR+R(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR-Ust IElemNodecBseZdZddZRS(sIntrospection node.cCsKtt|j||g|jD]}t|tr#|^q#|_dS(N(RR.R#R!t isinstancet child_nodes(R"RR R ((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR#`sN(RRRRR#(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR.]stIElemInterfacecBseZdZRS(sIntrospection interface.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR1fst IElemMethodcBseZdZRS(sIntrospection interface method.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR2jstIElemArgcBseZdZRS(sIntrospection method argument.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR3nst IElemSignalcBseZdZRS(sIntrospection interface signal.(RRR(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyR4rscCsFt}t|ds't|}n|j|}t|}|S(Ntread(RthasattrRtparseR (tstring_or_filettreetxml_roott elem_root((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyt introspectvs   N(Rtxml.etree.ElementTreeRRRRtobjectR R,R-R.R1R2R3R4R<(((s;/usr/lib/python2.7/site-packages/slip/dbus/introspection.pyts* PK[Y@site-packages/slip/dbus/bus.pycnu[ 9Qc@scdZddlZddlZddlZx2d D]*Zdied6ed 6ejd 6dUq1WdS( sQThis module contains functions which create monkey-patched/augmented D-Bus buses.iNtBust SystemBust SessionBust StarterBussdef %(name)s(*args, **kwargs): busobj = dbus.%(name)s(*args, **kwargs) busobj.ProxyObjectClass = proxies.ProxyObject busobj.default_timeout = %(default_timeout)s return busobj tnametmodnametdefault_timeout(RRRR(t__doc__tdbustproxiest constantsRt__name__tmethod_call_no_timeout(((s1/usr/lib/python2.7/site-packages/slip/dbus/bus.pyts     PK[]]#site-packages/slip/dbus/service.pycnu[ 9Qc@sdZddlZddlZddlmZddlZdddgZda dZ e a dZ d Z d Zd adadZdejjfdYZdejjfdYZdS(sMThis module contains convenience functions for using dbus-activated services.iN(t_gobjecttObjectt InterfaceTypet set_mainloopcCstjdS(N(t __mainloop__tquit(((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt__glib_quit_cb__%scCs |adS(N(R(tmainloop((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyR0scCs |adS(N(t __quit_cb__(tquit_cb((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt set_quit_cb5scCs tdS(N(R(((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyR :st__slip_dbus_service_sender__t__slip_dbus_service_reply_cb__t__slip_dbus_service_error_cb__csjdk r!jtn ttjdk rNjtn tt fd}xitdtD]O}|dkr|_q|dkr|_qt ||t |qWj |_ |S(Nc sj }|dk rvddrG =nrfd=d=nj|nt dtdd|dk rr fd}fd}tj|d|d|n }j|SdS( Niit_slip_polkit_auth_requiredtdefault_polkit_auth_requiredcs|rrqd}y}Wntk rV}|}nX|rj|q|dkrq|ntjjdS(N(tNonet ExceptiontpolkittNotAuthorizedExceptionttimeout_restart(tis_authterrortresultte(t action_idterror_cbtktmethodtmethod_is_asynctptreply_cbtself(s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt reply_handlerms     cs|jdS(N(R(R(RR (s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt error_handlers R!R"(tgetRt sender_seentgetattrRtIsSystemBusNameAuthorizedAsyncR(R RRtsenderR!R"tretval(tasync_callbacksthide_async_callbacksthide_sender_keywordRRtsender_keyword(RRRRRR s5/usr/lib/python2.7/site-packages/slip/dbus/service.pytwrapped_methodWs*      $" cSs|d dkS(Nit_dbus_((tx((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pytst_dbus_sender_keywordt_dbus_async_callbacks( R1RtFalsetSENDER_KEYWORDtTrueR2tASYNC_CALLBACKStfiltertdirtsetattrR%t func_name(RR-tattr((R)R*R+RRR,s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt wrap_methodDs(    D     cBseZdZRS(cCsax?|jD]1\}}t|dtr t|||s"        f PK[]]#site-packages/slip/dbus/service.pyonu[ 9Qc@sdZddlZddlZddlmZddlZdddgZda dZ e a dZ d Z d Zd adadZdejjfdYZdejjfdYZdS(sMThis module contains convenience functions for using dbus-activated services.iN(t_gobjecttObjectt InterfaceTypet set_mainloopcCstjdS(N(t __mainloop__tquit(((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt__glib_quit_cb__%scCs |adS(N(R(tmainloop((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyR0scCs |adS(N(t __quit_cb__(tquit_cb((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt set_quit_cb5scCs tdS(N(R(((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyR :st__slip_dbus_service_sender__t__slip_dbus_service_reply_cb__t__slip_dbus_service_error_cb__csjdk r!jtn ttjdk rNjtn tt fd}xitdtD]O}|dkr|_q|dkr|_qt ||t |qWj |_ |S(Nc sj }|dk rvddrG =nrfd=d=nj|nt dtdd|dk rr fd}fd}tj|d|d|n }j|SdS( Niit_slip_polkit_auth_requiredtdefault_polkit_auth_requiredcs|rrqd}y}Wntk rV}|}nX|rj|q|dkrq|ntjjdS(N(tNonet ExceptiontpolkittNotAuthorizedExceptionttimeout_restart(tis_authterrortresultte(t action_idterror_cbtktmethodtmethod_is_asynctptreply_cbtself(s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt reply_handlerms     cs|jdS(N(R(R(RR (s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt error_handlers R!R"(tgetRt sender_seentgetattrRtIsSystemBusNameAuthorizedAsyncR(R RRtsenderR!R"tretval(tasync_callbacksthide_async_callbacksthide_sender_keywordRRtsender_keyword(RRRRRR s5/usr/lib/python2.7/site-packages/slip/dbus/service.pytwrapped_methodWs*      $" cSs|d dkS(Nit_dbus_((tx((s5/usr/lib/python2.7/site-packages/slip/dbus/service.pytst_dbus_sender_keywordt_dbus_async_callbacks( R1RtFalsetSENDER_KEYWORDtTrueR2tASYNC_CALLBACKStfiltertdirtsetattrR%t func_name(RR-tattr((R)R*R+RRR,s5/usr/lib/python2.7/site-packages/slip/dbus/service.pyt wrap_methodDs(    D     cBseZdZRS(cCsax?|jD]1\}}t|dtr t|||s"        f PK[,"%site-packages/slip/dbus/constants.pyonu[ 9Qc@sdZddZdS(s*This module contains some constant values.ig@@N(t__doc__tmethod_call_no_timeout(((s7/usr/lib/python2.7/site-packages/slip/dbus/constants.pyts PK[ݣdGs!s!site-packages/decorator.pycnu[ Pc@sVdZdZdddgZddlZddlZddlZejdkrjddlmZd Znd e fd YZd Zej d Z de fdYZ ddZdZy2ddlmZedefedeZWnNek rEddlmZdZedefededeZnXeeZdS(sT Decorator module, see http://pypi.python.org/pypi/decorator for the documentation. s3.4.0t decoratort FunctionMakertcontextmanageriNt3(tgetfullargspeccCs|jS(N(t__init__(tcls((s-/usr/lib/python2.7/site-packages/decorator.pytget_init*sRcBs eZdZdZdZRS(s?A quick and dirty replacement for getfullargspec for Python 2.XcCs=tj|\|_|_|_|_g|_d|_dS(N( tinspectt getargspectargstvarargstvarkwtdefaultst kwonlyargstNonetkwonlydefaults(tselftf((s-/usr/lib/python2.7/site-packages/decorator.pyR/s' ccs$|jV|jV|jV|jVdS(N(R R R R (R((s-/usr/lib/python2.7/site-packages/decorator.pyt__iter__4s(t__name__t __module__t__doc__RR(((s-/usr/lib/python2.7/site-packages/decorator.pyR-s cCs |jjS(N(Rtim_func(R((s-/usr/lib/python2.7/site-packages/decorator.pyR9ss\s*def\s*([_\w][_\w\d]*)\s*\(cBs_eZdZddddddddZdZdedZeddde dZ RS(s An object with the ability to create functions with a given signature. It has attributes name, doc, module, signature, defaults, dict and methods update and make. cCs||_|r.|j|_|jdkr6d|_n|j|_|j|_tj|r.t |}t |di|_ x'dD]} t || t || qWx1t |jD] \} } t |d | | qWtjd krtjd d |dd!|_|_nt|j} t|j} |jri| jd|j| jd|jn|jr| jdnx9|jD].} | jd| | jd| | fqW|jr| jd|j| jd|jndj| |_dj| |_|jj|_q.n|r@||_n|dk rX||_n|rj||_n|r|||_n|r||_n|r||_nt|dstt|dst d|ndS(Nst_lambda_t__annotations__R R R R RRsarg%dRt formatvaluecSsdS(Nt((tval((s-/usr/lib/python2.7/site-packages/decorator.pytZsiit*s%s=Nones%s=%ss**s, tnamet signatures%You are decorating a non function: %s(sargssvarargssvarkwsdefaultss kwonlyargsskwonlydefaults(!tshortsignatureRRRtdocRtmoduleRt isfunctionRtgetattrt annotationstsetattrt enumerateR tsystversiont formatargspecR tlistR tappendRR tjoint__dict__tcopytdictRR thasattrtAssertionErrort TypeError(RtfuncRR R R"R#tfuncdicttargspectatitargtallargst allshortargs((s-/usr/lib/python2.7/site-packages/decorator.pyREsb        #          cKs|j|_t|dd |_t|di|_t|dd |_t|dd |_t|dd |_t j dj j dd}t|d ||_ |jj|d S( s2Update the signature of func with the data in selfR"R1R RR&iRt?R#N((RRR%RRR/t func_defaultst__kwdefaults__RR)t _getframet f_globalstgetRtupdate(RR5tkwt callermodule((s-/usr/lib/python2.7/site-packages/decorator.pyRC~s c Js\|e|}|pi}ej|}|d krJed|n|jd}e|gg|jjdD]}|j d^qu} x3| D]+} | dkre d| |fqqW|j ds|d7}nye |d d } | |UWn$e jd IJe j|IJnX||} |rH||d tsinglesError in generated code:t __source__N(s_func_RH(tvarstDEFtmatchRt SyntaxErrortgrouptsetR!tsplittstript NameErrortendswithtcompileR)tstderrRC( Rt src_templtevaldictt addsourcetattrstsrctmoRR:tnamestntcodeR5((s-/usr/lib/python2.7/site-packages/decorator.pytmakes2   /        cKst|tr@|jjdd\} } | d } d} nd} d} |} || | | |||} djd|jD}| jd||||S(s Create a function from the strings name, signature and body. evaldict is the evaluation dictionary. If addsource is true an attribute __source__ is added to the result. The attributes attrs are added, if any. t(iis css|]}d|VqdS(s N((t.0tline((s-/usr/lib/python2.7/site-packages/decorator.pys ssdef %(name)s(%(signature)s): N(t isinstancetstrRRRQRR.t splitlinesR`(RtobjtbodyRXR R"R#RYRZRtrestR R5Rtibody((s-/usr/lib/python2.7/site-packages/decorator.pytcreates    N( RRRRRRCtFalseR`t classmethodtTrueRk(((s-/usr/lib/python2.7/site-packages/decorator.pyR?s 8 c Cs|dk rN|jj}||d<||dRiRs%s(%s)sreturn decorator(_call_, %s)R"R#N(Rt func_globalsR0RRkRtisclassRtlowerRRR R$Rt __class__t__call__RRR(tcallerR5RXRt callerfuncR"tfun((s-/usr/lib/python2.7/site-packages/decorator.pyRs>           cCs(tj|dtd|d|d|S(sContext manager decorators.with _self_: return _func_(%(shortsignature)s)t_self_RGRp(RRkR1(RR5((s-/usr/lib/python2.7/site-packages/decorator.pyRus(t_GeneratorContextManagertContextManagerRu(tGeneratorContextManagercOstj||||S(N(R|R(RRR8tk((s-/usr/lib/python2.7/site-packages/decorator.pyRsR(Rt __version__t__all__R)treRR*RRtobjectRURLRRRRut contextlibRzttypeR1R{t ImportErrorR|RR(((s-/usr/lib/python2.7/site-packages/decorator.pyt!s.$  ~ )    PK[LOyy!site-packages/serial/__init__.pycnu[ -Nc@sdZddlZejdkr.ddlTnvddlZejdkrVddlTnNejdkrrddlTn2ejdkrddlTne dejfd gZ d Z dS( s2.6iNtcli(t*tnttposixtjavas;Sorry: no implementation for your platform ('%s') availablesserial.urlhandlerc Osd|kp|d }d|kr-|d=nt}y|j}Wntk rVnXd|kr|jddd}xotD]K}d||f}yt|} Wntk rqXtj|j}PqWt d|fnt}|d||} || _ |r| j n| S(s Get an instance of the Serial class, depending on port/url. The port is not opened when the keyword parameter 'do_not_open' is true, by default it is. All other parameters are directly passed to the __init__ method when the port is instantiated. The list of package names that is searched for protocol handlers is kept in ``protocol_handler_packages``. e.g. we want to support a URL ``foobar://``. A module ``my_handlers.protocol_foobar`` is provided by the user. Then ``protocol_handler_packages.append("my_handlers")`` would extend the search path so that ``serial_for_url("foobar://"))`` would work. t do_not_opens://iis%s.protocol_%ss"invalid URL, protocol %r not knownN( tSerialtlowertAttributeErrortsplittprotocol_handler_packagest __import__t ImportErrortsystmodulest ValueErrortNonetporttopen( turltargstkwargstdo_opentklasst url_nocasetprotocolt package_namet module_namethandler_moduletinstance((s3/usr/lib/python2.7/site-packages/serial/__init__.pytserial_for_url s2       ( tVERSIONR tplatformtserial.serialclitostnametserial.serialwin32tserial.serialposixtserial.serialjavaR R R(((s3/usr/lib/python2.7/site-packages/serial/__init__.pyt s       PK[Uz!site-packages/serial/sermsdos.pycnu[ {QNc@s'ddlZddlZddlZddlZi dd6dd6dd6dd 6d d 6d d 6dd6dd6dd6Zd)\ZZZZ Z d*\Z Z Z d+\ZZZZd,\ZZZZZed#Zd$Zd%ejfd&YZed'kr#edZejj d(eefndS(-iNt11int15it30i,t60iXt12it24i` t48it96i%t19iKiiiiig?iiiitEtBtPtRtNs port not opencCs d|dS(NsCOM%di((tportnum((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytdevice?stSerialc BseZdZdeeedddedZdZ dZ dZ dZ dZ d d Zd Zd Zd ZdZd dZd dZdZdZdZdZdZRS(s port: number of device; numbering starts at zero. if everything fails, the user can specify a device string, note that this isn't portable any more baudrate: baud rate bytesize: number of databits parity: enable parity checking stopbits: number of stopbits timeout: set a timeout (None for waiting forever) xonxoff: enable software flow control rtscts: enable RTS/CTS flow control retry: DOS retry mode i%ic Cs$t|tdkr$||_nt|d|_t||_t||_|tkrkd|_n`|t krd|_nH|t krd|_n0|t krd|_n|t krd|_nt||_ | |_d|_|j|j|j|j|j|j |j|jdS( NtiR R tOtMtSs sermsdos.tmp(ttypetportstrRt BAUD_RATEStbaudtstrtbytesizet PARITY_NONEtparityt PARITY_EVENt PARITY_ODDt PARITY_MARKt PARITY_SPACEtstoptretrytfilenamet_config( tselftporttbaudrateRRtstopbitsttimeouttxonxofftrtsctsR"((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt__init__Qs(               cCs|jdS(N(tclose(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt__del__yscCsdS(N((R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyR-|sc CsPtjd|dd|d|d|d|d|d|fd }tj|dS( NsMODE t:s BAUD= s PARITY= s DATA= s STOP= s RETRY= s > R(tstringtjointostsystem( R%R&RRtdataR!R"R#t comString((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyR$s  cCs9|j|jt||j|j|j|j|jdS(N(R$RRRRR!R"R#(R%R'((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt setBaudratescCs tdS(s.returns the number of bytes waiting to be readN(tNotImplementedError(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt inWaitingsicCsBtj|jtjtjB}tj||}tj||S(sRead num bytes from serial port(R2topenRtO_RDONLYtO_BINARYtreadR-(R%tnumthandletrv((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyR<s   cCsBtj|jtjtjB}tj||}tj||S(sWrite string to serial port(R2R9RtO_WRONLYR;twriteR-(R%tsR>R?((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyRAs   cCs tdS(N(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt flushInputscCs tdS(N(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt flushOutputscCs tdS(N(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt sendBreakscCs tdS(sSet terminal status lineN(R7(R%tlevel((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytsetRTSscCs tdS(sSet terminal status lineN(R7(R%RF((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytsetDTRscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetCTSscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetDSRscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetRIscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetCDsc Cs=tjd|j|j|j|j|j|j|jfdS(Ns : t ( R0R1RRRRR!R"R#(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt__repr__sN(t__name__t __module__t__doc__t EIGHTBITSRt STOPBITS_ONEtNonet RETURN_RETRYR,R.R-R$R6R8R<RARCRDRERGRHRIRJRKRLRN(((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyRBs4                 t__main__s%s %s (iiiii(ig?i(iiii(R R R R R (!R2tsysR0tserial.serialutiltserialRRRRRR RStSTOPBITS_ONEANDAHALFt STOPBITS_TWOtFIVEBITStSIXBITSt SEVENBITSRRt RETURN_ERRORt RETURN_BUSYRUt RETURN_READYt RETURN_NONEt ValueErrortportNotOpenErrorRt serialutiltFileLikeRRORBtstdioRA(((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt&s.         PK[ 3W&V&V$site-packages/serial/serialposix.pyonu[ {QNc0@sddlZddlZddlZddlZddlZddlZddlZddlZddlTej dkrddl Z neZ ej dkrddl Z neZ ej j Zed dkrdZdZd Zd Zid d 6d d 6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6ZnedGkrdHZdIZiZnedJkrdKZdLZiZned dMkpLed dNkpLed dOkrjdPZdQZiZnxed dRkrejdjdSZeed dkrdTZn dUZdVZiZned dWkrdXZdYZiZned dZkr&d[Zd\ZiZned d]krQd^Zd_ZiZned d`kr|daZdbZiZnfed dckrddZdeZiZn;ejjdfej ejefdgZdhZiZee dioe jpdjZee dkoe jpdlZee dmo3e jp9dnZee dooQe j pWdpZ ee dqooe j!pudZ!ee droe j"pdZ"ee dsoe j#pdtZ#ee duoe j$pdvZ$ee dwoe j%pdxZ%ee dyoe j&p dzZ&ee d{o#e j'p)e$Z'ee d|oAe j(pGe%Z(ee d}o_e j)ped~Z*ej+dd Z,ej+de"Z-ej+de!Z.ee doe j/pdZ/ee doe j0pdZ0de1fdYZ2yddl3Z3Wn*e4k r,de2e5fdYZ6nXde2e3j7fdYZ6de6fdYZ8e9dkre6d dd&de:de;de<dddd dd Z=e=j>d e=j?d e=j@e=jAe=jdejBjde=jCdejBjde=jD[=ndS(iN(t*iiitlinuxcCsd|S(Ns /dev/ttyS%d((tport((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytdevice$si0i0cCsddl}|jddgd}tj|jtj||d||d<|dctM<|dctO||ndS(s,Set communication parameters on opened port.s+Can only operate on a valid file descriptoriii sCould not configure port: %stECHOCTLtECHOKEtIUCLCtPARMRKsB%stB38400sInvalid baud rate: %riiiisInvalid char len: %rs"Invalid stop bit specification: %rsInvalid parity: %rtIXANYtCRTSCTSt CNEW_RTSCTSisInvalid vmin: %r sInvalid vtime: %rN(RGRH(?RR9R&t_interCharTimeouttintttermiost tcgetattrterrorR tCLOCALtCREADtICANONtECHOtECHOEtECHOKtECHONLtISIGtIEXTENthasattrtgetattrtOPOSTtINLCRtIGNCRtICRNLtIGNBRKRIRJt _baudratetAttributeErrortbaudrate_constantstKeyErrorRtCSIZEt _bytesizetCS8tCS7tCS6tCS5t _stopbitst STOPBITS_ONEtCSTOPBtSTOPBITS_ONE_POINT_FIVEt STOPBITS_TWOtINPCKtISTRIPt_parityt PARITY_NONEtPARENBtPARODDt PARITY_EVENt PARITY_ODDt_xonxofftIXONtIXOFFRLt_rtsctsRMRNtVMINtVTIMEt tcsetattrtTCSANOWR(REt custom_baudtvmintvtimet orig_attrtiflagtoflagtcflagtlflagtispeedtospeedtccRFtflag((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRB)s 5 #          !1 cCsD|jr@|jdk r4tj|jd|_nt|_ndS(s Close portN(R:RR9R;RCtFalse(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRCs   cCs t|S(N(R(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytmakeDeviceNamescCs,tj|jtt}tjd|dS(s>Return the number of characters currently in the input buffer.R4i(RRRtTIOCINQtTIOCM_zero_strtstructtunpack(REts((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt inWaitingsicCs|jstnt}xt||krtj|jggg|j\}}}|sdPntj|j|t|}|st dn|j |qWt |S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.sLdevice reports readiness to read but returned no data (device disconnected?)( R:tportNotOpenErrort bytearraytlentselectRt_timeoutR;treadR&textendtbytes(REtsizeRtreadyt_R((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRs  *c CsJ|jstnt|}|}|jdk rX|jdkrXtj|j}nd}x|dkr?ytj|j|}|r|tj}|dkrt nt j g|jgg|\}}}|st qn||}||}Wqat k r;} | j t j kr<td| fq<qaXqaWt|S(s-Output the given string over the serial port.iswrite failed: %sN(R:RRt _writeTimeoutR9ttimeR;twriteRtwriteTimeoutErrorRtOSErrorterrnotEAGAINR&( REtdatatttdttimeouttnttimeleftRRtv((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRs.    '  cCs|jdS(sTFlush of file like objects. In this case, wait until all data is written.N(t drainOutput(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytflushscCs,|jstntj|jtjdS(s9Clear input buffer, discarding all that is in the buffer.N(R:RRQttcflushRR tTCIFLUSH(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt flushInputs cCs,|jstntj|jtjdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(R:RRQRRR tTCOFLUSH(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt flushOutputs g?cCs3|jstntj|jt|ddS(sHSend break condition. Timed, returns to idle state after given duration.g?N(R:RRQt tcsendbreakRRP(REtduration((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt sendBreaks cCsK|jdkrtn|r4tj|jtntj|jtdS(sBSet break: Controls TXD. When active, no transmitting is possible.N(RR9RRRR5R6(REtlevel((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytsetBreaks  cCsK|jstn|r1tj|jttntj|jttdS(s)Set terminal status line: Request To SendN(R:RRRRR(t TIOCM_RTS_strR)(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytsetRTS s  cCsK|jstn|r1tj|jttntj|jttdS(s-Set terminal status line: Data Terminal ReadyN(R:RRRRR(t TIOCM_DTR_strR)(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytsetDTRs  cCsH|jstntj|jtt}tjd|dt @dkS(s(Read terminal status line: Clear To SendR4i( R:RRRRR'RRRR-(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetCTSs cCsH|jstntj|jtt}tjd|dt @dkS(s)Read terminal status line: Data Set ReadyR4i( R:RRRRR'RRRR0(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetDSRs cCsH|jstntj|jtt}tjd|dt @dkS(s)Read terminal status line: Ring IndicatorR4i( R:RRRRR'RRRR2(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetRI%s cCsH|jstntj|jtt}tjd|dt @dkS(s)Read terminal status line: Carrier DetectR4i( R:RRRRR'RRRR1(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetCD+s cCs&|jstntj|jdS(sinternal - not portable!N(R:RRQttcdrainR(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR3s cCs2|jstntj|jtjtjdS(sinternal - not portable!N(R:RRRRtF_SETFLR;R@(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt nonblocking8s cCs|jstn|jS(sFor easier use of the serial port instance with select. WARNING: this function is not portable to different platforms!(R:RR(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytfileno=s cCsK|jstn|r1tj|jtjntj|jtjdS(sQmanually control flow - when hardware or software flow control is enabledN(R:RRQttcflowRR tTCIONtTCIOFF(REtenable((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt flowControlCs  (t__name__t __module__t__doc__R<RBRCRRRRRRRRRRRRRRRRRRR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR7s. z                   tSerialcBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRTscBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRXstPosixPollSerialcBseZdZddZRS(spoll based read implementation. not all systems support poll properly. however this one has better handling of errors, such as a device disconnecting while it's in use (e.g. USB-serial unplugged)icCsN|jdkrtnt}tj}|j|jtjtjBtj Btj B|dkrDxt ||kr@xN|j|j dD]6\}}|tjtj Btj B@rt dqqWtj|j|t |}|j||j dk r|j dks2|jdk rg|jdkrg| rgPqgqgWnt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.iisdevice reports error (poll)N(RR9RRRtpolltregistertPOLLINtPOLLERRtPOLLHUPtPOLLNVALRRR&R;RRROR(RERRRRteventR((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR`s    + # % (RRRR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR[st__main__RtbytesizetparitytstopbitsRtxonxofftrtsctsthellos%r s%s (EtsysR;RRQRRRRtserial.serialutilt hexversionR RtplatformtlowertplatRR R RRftunametsplittversionRPtstderrRtnametVERSIONR]R'R(R)R*R+R,R-R.R/R0R1R2R3RtpackRRRR5R6t SerialBaseR7tiot ImportErrortFileLikeRt RawIOBaseRRt EIGHTBITSRyRoRRRRRtstdoutRR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyts `                                      M         PK[#%%"site-packages/serial/serialcli.pycnu[ {QNc@s^ddlZddlZddlZddlTdZejejZdZde fdYZ yddl Z Wn*e k rde e fdYZnXde e jfd YZed krZddlZed Zejjd eeZejjd ed e_de_ejd e_ejejjd endS(iN(t*cCstjjjj|S(s%Turn a port number into a device name(tSystemtIOtPortst SerialPortt GetPortNames(tportnum((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytdevicescCs#tg|D]}t|^q S(N(tsabtord(tstringtx((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt as_byte_arrayst IronSerialcBseZdZd%ZdZdZdZdZdZddZ dZ dZ dZ ddZ edZedZed Zd!Zd"Zd#Zd$ZRS(&s(Serial port implemenation for .NET/Mono.i2iKiniiii,iXiii` ii%iKiiicCs|jdkrtdn|jr6tdnytjjj|j|_ Wn5t k r}d|_ td|j|fnX|j |j j t |_|js|jt |jt n|j|jdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.scould not open port %s: %sN(t_porttNonetSerialExceptiont_isOpenRRRRtportstrt _port_handlet Exceptiont_reconfigurePorttOpentTruet_rtsctstsetRTStsetDTRt flushInputt flushOutput(tselftmsg((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytopen s"        cCsw|jstdn|jd krBtjjjj|j_ nt |jd|j_ |j d krtjjjj|j_ nt |j d|j_ y|j |j_Wn%tk r}tt|nX|jtkrd|j_nm|jtkrd|j_nO|jtkr3d|j_n1|jtkrQd|j_ntd|j|jtkrttjjjd|j_n|jtkrtjjjj|j_n|jtkrtjjjj|j_ng|jt krtjjjj!|j_n=|jt"kr<tjjjj#|j_ntd |j|j$t%krytjjj&j'|j_&ng|j$t(krtjjj&j)|j_&n=|j$t*krtjjj&j+|j_&ntd |j$|j,r |j-r tjjj.j/|j_.nf|j,r1tjjj.j0|j_.nB|j-rUtjjj.j1|j_.nttjjj.d|j_.d S( s,Set communication parameters on opened port.s'Can only operate on a valid port handleiiiiis#Unsupported number of data bits: %rRsUnsupported parity mode: %rs#Unsupported number of stop bits: %rN(2RRt_timeoutRRRRRtInfiniteTimeoutt ReadTimeouttintt _writeTimeoutt WriteTimeoutt _baudratetBaudRatetIOErrort ValueErrortstrt _bytesizetFIVEBITStDataBitstSIXBITSt SEVENBITSt EIGHTBITSt_parityt PARITY_NONEtgetattrtParityt PARITY_EVENtEvent PARITY_ODDtOddt PARITY_MARKtMarkt PARITY_SPACEtSpacet _stopbitst STOPBITS_ONEtStopBitstOnetSTOPBITS_ONE_POINT_FIVEt OnePointFivet STOPBITS_TWOtTwoRt_xonxofft HandshaketRequestToSendXOnXOfft RequestToSendtXOnXOff(Rte((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyR6s\ !  cCs\|jrX|jrLy|jjWntjjjk r?nXd|_nt|_ndS(s Close portN( RRtCloseRRRtInvalidOperationExceptionRtFalse(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytcloses   cCs:yt|SWn%tk r5}tt|nXdS(N(Rt TypeErrorRR*(RtportRJ((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytmakeDeviceNamescCs|jstn|jjS(s>Return the number of characters currently in the input buffer.(RtportNotOpenErrort BytesToRead(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt inWaitings icCsp|jstnt}xH|rey|j|jjWntjk rW}PqX|d8}qWt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.i(RRRt bytearraytappendtReadByteRtTimeoutExceptiontbytes(RtsizetdataRJ((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytreads   cCs|jstnt|ttfsFtdtt|fny&|jjt|dt |Wnt j k r}t nXt |S(s-Output the given string over the serial port.s expected %s or bytearray, got %si( RRRt isinstanceRYRUROttypetWriteR tlenRRXtwriteTimeoutError(RR[RJ((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytwrites & cCs#|jstn|jjdS(s9Clear input buffer, discarding all that is in the buffer.N(RRRtDiscardInBuffer(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs cCs#|jstn|jjdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(RRRtDiscardOutBuffer(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs g?cCsG|jstnddl}t|j_|j|t|j_dS(sHSend break condition. Timed, returns to idle state after given duration.iN(RRRttimeRt BreakStatetsleepRM(RtdurationRe((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt sendBreaks     cCs(|jstnt||j_dS(sBSet break: Controls TXD. When active, to transmitting is possible.N(RRRtboolRf(Rtlevel((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytsetBreaks cCs(|jstnt||j_dS(s)Set terminal status line: Request To SendN(RRRRjt RtsEnable(RRk((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs cCs(|jstnt||j_dS(s-Set terminal status line: Data Terminal ReadyN(RRRRjt DtrEnable(RRk((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs cCs|jstn|jjS(s(Read terminal status line: Clear To Send(RRRt CtsHolding(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetCTSs cCs|jstn|jjS(s)Read terminal status line: Data Set Ready(RRRt DsrHolding(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetDSRs cCs|jstntS(s)Read terminal status line: Ring Indicator(RRRRM(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetRIs cCs|jstn|jjS(s)Read terminal status line: Carrier Detect(RRRt CDHolding(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetCDs (i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESRRRNRQRTR\RbRRRiRRlRRRpRrRsRu(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyR s(  I            tSerialcBseZRS((RvRw(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRzscBseZRS((RvRw(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRzst__main__is%s iKi(tclrRtSystem.IO.Portstserial.serialutilRtArraytByteRR t SerialBaseR tiot ImportErrortFileLikeRzt RawIOBaseRvtsystststdioRbtbaudratetdatabitsRNRPR(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt s0                PK[k'''site-packages/serial/win32.pynu[from ctypes import * from ctypes.wintypes import HANDLE from ctypes.wintypes import BOOL from ctypes.wintypes import LPCWSTR _stdcall_libraries = {} _stdcall_libraries['kernel32'] = WinDLL('kernel32') from ctypes.wintypes import DWORD from ctypes.wintypes import WORD from ctypes.wintypes import BYTE INVALID_HANDLE_VALUE = HANDLE(-1).value # some details of the windows API differ between 32 and 64 bit systems.. def is_64bit(): """Returns true when running on a 64 bit system""" return sizeof(c_ulong) != sizeof(c_void_p) # ULONG_PTR is a an ordinary number, not a pointer and contrary to the name it # is either 32 or 64 bits, depending on the type of windows... # so test if this a 32 bit windows... if is_64bit(): # assume 64 bits ULONG_PTR = c_int64 else: # 32 bits ULONG_PTR = c_ulong class _SECURITY_ATTRIBUTES(Structure): pass LPSECURITY_ATTRIBUTES = POINTER(_SECURITY_ATTRIBUTES) try: CreateEventW = _stdcall_libraries['kernel32'].CreateEventW except AttributeError: # Fallback to non wide char version for old OS... from ctypes.wintypes import LPCSTR CreateEventA = _stdcall_libraries['kernel32'].CreateEventA CreateEventA.restype = HANDLE CreateEventA.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCSTR] CreateEvent=CreateEventA CreateFileA = _stdcall_libraries['kernel32'].CreateFileA CreateFileA.restype = HANDLE CreateFileA.argtypes = [LPCSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE] CreateFile = CreateFileA else: CreateEventW.restype = HANDLE CreateEventW.argtypes = [LPSECURITY_ATTRIBUTES, BOOL, BOOL, LPCWSTR] CreateEvent = CreateEventW # alias CreateFileW = _stdcall_libraries['kernel32'].CreateFileW CreateFileW.restype = HANDLE CreateFileW.argtypes = [LPCWSTR, DWORD, DWORD, LPSECURITY_ATTRIBUTES, DWORD, DWORD, HANDLE] CreateFile = CreateFileW # alias class _OVERLAPPED(Structure): pass OVERLAPPED = _OVERLAPPED class _COMSTAT(Structure): pass COMSTAT = _COMSTAT class _DCB(Structure): pass DCB = _DCB class _COMMTIMEOUTS(Structure): pass COMMTIMEOUTS = _COMMTIMEOUTS GetLastError = _stdcall_libraries['kernel32'].GetLastError GetLastError.restype = DWORD GetLastError.argtypes = [] LPOVERLAPPED = POINTER(_OVERLAPPED) LPDWORD = POINTER(DWORD) GetOverlappedResult = _stdcall_libraries['kernel32'].GetOverlappedResult GetOverlappedResult.restype = BOOL GetOverlappedResult.argtypes = [HANDLE, LPOVERLAPPED, LPDWORD, BOOL] ResetEvent = _stdcall_libraries['kernel32'].ResetEvent ResetEvent.restype = BOOL ResetEvent.argtypes = [HANDLE] LPCVOID = c_void_p WriteFile = _stdcall_libraries['kernel32'].WriteFile WriteFile.restype = BOOL WriteFile.argtypes = [HANDLE, LPCVOID, DWORD, LPDWORD, LPOVERLAPPED] LPVOID = c_void_p ReadFile = _stdcall_libraries['kernel32'].ReadFile ReadFile.restype = BOOL ReadFile.argtypes = [HANDLE, LPVOID, DWORD, LPDWORD, LPOVERLAPPED] CloseHandle = _stdcall_libraries['kernel32'].CloseHandle CloseHandle.restype = BOOL CloseHandle.argtypes = [HANDLE] ClearCommBreak = _stdcall_libraries['kernel32'].ClearCommBreak ClearCommBreak.restype = BOOL ClearCommBreak.argtypes = [HANDLE] LPCOMSTAT = POINTER(_COMSTAT) ClearCommError = _stdcall_libraries['kernel32'].ClearCommError ClearCommError.restype = BOOL ClearCommError.argtypes = [HANDLE, LPDWORD, LPCOMSTAT] SetupComm = _stdcall_libraries['kernel32'].SetupComm SetupComm.restype = BOOL SetupComm.argtypes = [HANDLE, DWORD, DWORD] EscapeCommFunction = _stdcall_libraries['kernel32'].EscapeCommFunction EscapeCommFunction.restype = BOOL EscapeCommFunction.argtypes = [HANDLE, DWORD] GetCommModemStatus = _stdcall_libraries['kernel32'].GetCommModemStatus GetCommModemStatus.restype = BOOL GetCommModemStatus.argtypes = [HANDLE, LPDWORD] LPDCB = POINTER(_DCB) GetCommState = _stdcall_libraries['kernel32'].GetCommState GetCommState.restype = BOOL GetCommState.argtypes = [HANDLE, LPDCB] LPCOMMTIMEOUTS = POINTER(_COMMTIMEOUTS) GetCommTimeouts = _stdcall_libraries['kernel32'].GetCommTimeouts GetCommTimeouts.restype = BOOL GetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS] PurgeComm = _stdcall_libraries['kernel32'].PurgeComm PurgeComm.restype = BOOL PurgeComm.argtypes = [HANDLE, DWORD] SetCommBreak = _stdcall_libraries['kernel32'].SetCommBreak SetCommBreak.restype = BOOL SetCommBreak.argtypes = [HANDLE] SetCommMask = _stdcall_libraries['kernel32'].SetCommMask SetCommMask.restype = BOOL SetCommMask.argtypes = [HANDLE, DWORD] SetCommState = _stdcall_libraries['kernel32'].SetCommState SetCommState.restype = BOOL SetCommState.argtypes = [HANDLE, LPDCB] SetCommTimeouts = _stdcall_libraries['kernel32'].SetCommTimeouts SetCommTimeouts.restype = BOOL SetCommTimeouts.argtypes = [HANDLE, LPCOMMTIMEOUTS] WaitForSingleObject = _stdcall_libraries['kernel32'].WaitForSingleObject WaitForSingleObject.restype = DWORD WaitForSingleObject.argtypes = [HANDLE, DWORD] ONESTOPBIT = 0 # Variable c_int TWOSTOPBITS = 2 # Variable c_int ONE5STOPBITS = 1 NOPARITY = 0 # Variable c_int ODDPARITY = 1 # Variable c_int EVENPARITY = 2 # Variable c_int MARKPARITY = 3 SPACEPARITY = 4 RTS_CONTROL_HANDSHAKE = 2 # Variable c_int RTS_CONTROL_DISABLE = 0 # Variable c_int RTS_CONTROL_ENABLE = 1 # Variable c_int RTS_CONTROL_TOGGLE = 3 # Variable c_int SETRTS = 3 CLRRTS = 4 DTR_CONTROL_HANDSHAKE = 2 # Variable c_int DTR_CONTROL_DISABLE = 0 # Variable c_int DTR_CONTROL_ENABLE = 1 # Variable c_int SETDTR = 5 CLRDTR = 6 MS_DSR_ON = 32 # Variable c_ulong EV_RING = 256 # Variable c_int EV_PERR = 512 # Variable c_int EV_ERR = 128 # Variable c_int SETXOFF = 1 # Variable c_int EV_RXCHAR = 1 # Variable c_int GENERIC_WRITE = 1073741824 # Variable c_long PURGE_TXCLEAR = 4 # Variable c_int FILE_FLAG_OVERLAPPED = 1073741824 # Variable c_int EV_DSR = 16 # Variable c_int MAXDWORD = 4294967295L # Variable c_uint EV_RLSD = 32 # Variable c_int ERROR_IO_PENDING = 997 # Variable c_long MS_CTS_ON = 16 # Variable c_ulong EV_EVENT1 = 2048 # Variable c_int EV_RX80FULL = 1024 # Variable c_int PURGE_RXABORT = 2 # Variable c_int FILE_ATTRIBUTE_NORMAL = 128 # Variable c_int PURGE_TXABORT = 1 # Variable c_int SETXON = 2 # Variable c_int OPEN_EXISTING = 3 # Variable c_int MS_RING_ON = 64 # Variable c_ulong EV_TXEMPTY = 4 # Variable c_int EV_RXFLAG = 2 # Variable c_int MS_RLSD_ON = 128 # Variable c_ulong GENERIC_READ = 2147483648L # Variable c_ulong EV_EVENT2 = 4096 # Variable c_int EV_CTS = 8 # Variable c_int EV_BREAK = 64 # Variable c_int PURGE_RXCLEAR = 8 # Variable c_int INFINITE = 0xFFFFFFFFL class N11_OVERLAPPED4DOLLAR_48E(Union): pass class N11_OVERLAPPED4DOLLAR_484DOLLAR_49E(Structure): pass N11_OVERLAPPED4DOLLAR_484DOLLAR_49E._fields_ = [ ('Offset', DWORD), ('OffsetHigh', DWORD), ] PVOID = c_void_p N11_OVERLAPPED4DOLLAR_48E._anonymous_ = ['_0'] N11_OVERLAPPED4DOLLAR_48E._fields_ = [ ('_0', N11_OVERLAPPED4DOLLAR_484DOLLAR_49E), ('Pointer', PVOID), ] _OVERLAPPED._anonymous_ = ['_0'] _OVERLAPPED._fields_ = [ ('Internal', ULONG_PTR), ('InternalHigh', ULONG_PTR), ('_0', N11_OVERLAPPED4DOLLAR_48E), ('hEvent', HANDLE), ] _SECURITY_ATTRIBUTES._fields_ = [ ('nLength', DWORD), ('lpSecurityDescriptor', LPVOID), ('bInheritHandle', BOOL), ] _COMSTAT._fields_ = [ ('fCtsHold', DWORD, 1), ('fDsrHold', DWORD, 1), ('fRlsdHold', DWORD, 1), ('fXoffHold', DWORD, 1), ('fXoffSent', DWORD, 1), ('fEof', DWORD, 1), ('fTxim', DWORD, 1), ('fReserved', DWORD, 25), ('cbInQue', DWORD), ('cbOutQue', DWORD), ] _DCB._fields_ = [ ('DCBlength', DWORD), ('BaudRate', DWORD), ('fBinary', DWORD, 1), ('fParity', DWORD, 1), ('fOutxCtsFlow', DWORD, 1), ('fOutxDsrFlow', DWORD, 1), ('fDtrControl', DWORD, 2), ('fDsrSensitivity', DWORD, 1), ('fTXContinueOnXoff', DWORD, 1), ('fOutX', DWORD, 1), ('fInX', DWORD, 1), ('fErrorChar', DWORD, 1), ('fNull', DWORD, 1), ('fRtsControl', DWORD, 2), ('fAbortOnError', DWORD, 1), ('fDummy2', DWORD, 17), ('wReserved', WORD), ('XonLim', WORD), ('XoffLim', WORD), ('ByteSize', BYTE), ('Parity', BYTE), ('StopBits', BYTE), ('XonChar', c_char), ('XoffChar', c_char), ('ErrorChar', c_char), ('EofChar', c_char), ('EvtChar', c_char), ('wReserved1', WORD), ] _COMMTIMEOUTS._fields_ = [ ('ReadIntervalTimeout', DWORD), ('ReadTotalTimeoutMultiplier', DWORD), ('ReadTotalTimeoutConstant', DWORD), ('WriteTotalTimeoutMultiplier', DWORD), ('WriteTotalTimeoutConstant', DWORD), ] __all__ = ['GetLastError', 'MS_CTS_ON', 'FILE_ATTRIBUTE_NORMAL', 'DTR_CONTROL_ENABLE', '_COMSTAT', 'MS_RLSD_ON', 'GetOverlappedResult', 'SETXON', 'PURGE_TXABORT', 'PurgeComm', 'N11_OVERLAPPED4DOLLAR_48E', 'EV_RING', 'ONESTOPBIT', 'SETXOFF', 'PURGE_RXABORT', 'GetCommState', 'RTS_CONTROL_ENABLE', '_DCB', 'CreateEvent', '_COMMTIMEOUTS', '_SECURITY_ATTRIBUTES', 'EV_DSR', 'EV_PERR', 'EV_RXFLAG', 'OPEN_EXISTING', 'DCB', 'FILE_FLAG_OVERLAPPED', 'EV_CTS', 'SetupComm', 'LPOVERLAPPED', 'EV_TXEMPTY', 'ClearCommBreak', 'LPSECURITY_ATTRIBUTES', 'SetCommBreak', 'SetCommTimeouts', 'COMMTIMEOUTS', 'ODDPARITY', 'EV_RLSD', 'GetCommModemStatus', 'EV_EVENT2', 'PURGE_TXCLEAR', 'EV_BREAK', 'EVENPARITY', 'LPCVOID', 'COMSTAT', 'ReadFile', 'PVOID', '_OVERLAPPED', 'WriteFile', 'GetCommTimeouts', 'ResetEvent', 'EV_RXCHAR', 'LPCOMSTAT', 'ClearCommError', 'ERROR_IO_PENDING', 'EscapeCommFunction', 'GENERIC_READ', 'RTS_CONTROL_HANDSHAKE', 'OVERLAPPED', 'DTR_CONTROL_HANDSHAKE', 'PURGE_RXCLEAR', 'GENERIC_WRITE', 'LPDCB', 'CreateEventW', 'SetCommMask', 'EV_EVENT1', 'SetCommState', 'LPVOID', 'CreateFileW', 'LPDWORD', 'EV_RX80FULL', 'TWOSTOPBITS', 'LPCOMMTIMEOUTS', 'MAXDWORD', 'MS_DSR_ON', 'MS_RING_ON', 'N11_OVERLAPPED4DOLLAR_484DOLLAR_49E', 'EV_ERR', 'ULONG_PTR', 'CreateFile', 'NOPARITY', 'CloseHandle'] PK[t_t_#site-packages/serial/serialposix.pynu[#!/usr/bin/env python # # Python Serial Port Extension for Win32, Linux, BSD, Jython # module for serial IO for POSIX compatible systems, like Linux # see __init__.py # # (C) 2001-2010 Chris Liechti # this is distributed under a free software license, see license.txt # # parts based on code from Grant B. Edwards : # ftp://ftp.visi.com/users/grante/python/PosixSerial.py # # references: http://www.easysw.com/~mike/serial/serial.html import sys, os, fcntl, termios, struct, select, errno, time from serial.serialutil import * # Do check the Python version as some constants have moved. if (sys.hexversion < 0x020100f0): import TERMIOS else: TERMIOS = termios if (sys.hexversion < 0x020200f0): import FCNTL else: FCNTL = fcntl # try to detect the OS so that a device can be selected... # this code block should supply a device() and set_special_baudrate() function # for the platform plat = sys.platform.lower() if plat[:5] == 'linux': # Linux (confirmed) def device(port): return '/dev/ttyS%d' % port ASYNC_SPD_MASK = 0x1030 ASYNC_SPD_CUST = 0x0030 def set_special_baudrate(port, baudrate): import array buf = array.array('i', [0] * 32) # get serial_struct FCNTL.ioctl(port.fd, TERMIOS.TIOCGSERIAL, buf) # set custom divisor buf[6] = buf[7] / baudrate # update flags buf[4] &= ~ASYNC_SPD_MASK buf[4] |= ASYNC_SPD_CUST # set serial_struct try: res = FCNTL.ioctl(port.fd, TERMIOS.TIOCSSERIAL, buf) except IOError: raise ValueError('Failed to set custom baud rate: %r' % baudrate) baudrate_constants = { 0: 0000000, # hang up 50: 0000001, 75: 0000002, 110: 0000003, 134: 0000004, 150: 0000005, 200: 0000006, 300: 0000007, 600: 0000010, 1200: 0000011, 1800: 0000012, 2400: 0000013, 4800: 0000014, 9600: 0000015, 19200: 0000016, 38400: 0000017, 57600: 0010001, 115200: 0010002, 230400: 0010003, 460800: 0010004, 500000: 0010005, 576000: 0010006, 921600: 0010007, 1000000: 0010010, 1152000: 0010011, 1500000: 0010012, 2000000: 0010013, 2500000: 0010014, 3000000: 0010015, 3500000: 0010016, 4000000: 0010017 } elif plat == 'cygwin': # cygwin/win32 (confirmed) def device(port): return '/dev/com%d' % (port + 1) def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} elif plat == 'openbsd3': # BSD (confirmed) def device(port): return '/dev/ttyp%d' % port def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} elif plat[:3] == 'bsd' or \ plat[:7] == 'freebsd' or \ plat[:7] == 'openbsd': # BSD (confirmed for freebsd4: cuaa%d) def device(port): return '/dev/cuad%d' % port def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} elif plat[:6] == 'darwin': # OS X version = os.uname()[2].split('.') # Tiger or above can support arbitrary serial speeds if int(version[0]) >= 8: def set_special_baudrate(port, baudrate): # use IOKit-specific call to set up high speeds import array, fcntl buf = array.array('i', [baudrate]) IOSSIOSPEED = 0x80045402 #_IOW('T', 2, speed_t) fcntl.ioctl(port.fd, IOSSIOSPEED, buf, 1) else: # version < 8 def set_special_baudrate(port, baudrate): raise ValueError("baud rate not supported") def device(port): return '/dev/cuad%d' % port baudrate_constants = {} elif plat[:6] == 'netbsd': # NetBSD 1.6 testing by Erk def device(port): return '/dev/dty%02d' % port def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} elif plat[:4] == 'irix': # IRIX (partially tested) def device(port): return '/dev/ttyf%d' % (port+1) #XXX different device names depending on flow control def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} elif plat[:2] == 'hp': # HP-UX (not tested) def device(port): return '/dev/tty%dp0' % (port+1) def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} elif plat[:5] == 'sunos': # Solaris/SunOS (confirmed) def device(port): return '/dev/tty%c' % (ord('a')+port) def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} elif plat[:3] == 'aix': # AIX def device(port): return '/dev/tty%d' % (port) def set_special_baudrate(port, baudrate): raise ValueError("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} else: # platform detection has failed... sys.stderr.write("""\ don't know how to number ttys on this system. ! Use an explicit path (eg /dev/ttyS1) or send this information to ! the author of this module: sys.platform = %r os.name = %r serialposix.py version = %s also add the device name of the serial port and where the counting starts for the first serial port. e.g. 'first serial port: /dev/ttyS0' and with a bit luck you can get this module running... """ % (sys.platform, os.name, VERSION)) # no exception, just continue with a brave attempt to build a device name # even if the device name is not correct for the platform it has chances # to work using a string with the real device name as port parameter. def device(portum): return '/dev/ttyS%d' % portnum def set_special_baudrate(port, baudrate): raise SerialException("sorry don't know how to handle non standard baud rate on this platform") baudrate_constants = {} #~ raise Exception, "this module does not run on this platform, sorry." # whats up with "aix", "beos", .... # they should work, just need to know the device names. # load some constants for later use. # try to use values from TERMIOS, use defaults from linux otherwise TIOCMGET = hasattr(TERMIOS, 'TIOCMGET') and TERMIOS.TIOCMGET or 0x5415 TIOCMBIS = hasattr(TERMIOS, 'TIOCMBIS') and TERMIOS.TIOCMBIS or 0x5416 TIOCMBIC = hasattr(TERMIOS, 'TIOCMBIC') and TERMIOS.TIOCMBIC or 0x5417 TIOCMSET = hasattr(TERMIOS, 'TIOCMSET') and TERMIOS.TIOCMSET or 0x5418 #TIOCM_LE = hasattr(TERMIOS, 'TIOCM_LE') and TERMIOS.TIOCM_LE or 0x001 TIOCM_DTR = hasattr(TERMIOS, 'TIOCM_DTR') and TERMIOS.TIOCM_DTR or 0x002 TIOCM_RTS = hasattr(TERMIOS, 'TIOCM_RTS') and TERMIOS.TIOCM_RTS or 0x004 #TIOCM_ST = hasattr(TERMIOS, 'TIOCM_ST') and TERMIOS.TIOCM_ST or 0x008 #TIOCM_SR = hasattr(TERMIOS, 'TIOCM_SR') and TERMIOS.TIOCM_SR or 0x010 TIOCM_CTS = hasattr(TERMIOS, 'TIOCM_CTS') and TERMIOS.TIOCM_CTS or 0x020 TIOCM_CAR = hasattr(TERMIOS, 'TIOCM_CAR') and TERMIOS.TIOCM_CAR or 0x040 TIOCM_RNG = hasattr(TERMIOS, 'TIOCM_RNG') and TERMIOS.TIOCM_RNG or 0x080 TIOCM_DSR = hasattr(TERMIOS, 'TIOCM_DSR') and TERMIOS.TIOCM_DSR or 0x100 TIOCM_CD = hasattr(TERMIOS, 'TIOCM_CD') and TERMIOS.TIOCM_CD or TIOCM_CAR TIOCM_RI = hasattr(TERMIOS, 'TIOCM_RI') and TERMIOS.TIOCM_RI or TIOCM_RNG #TIOCM_OUT1 = hasattr(TERMIOS, 'TIOCM_OUT1') and TERMIOS.TIOCM_OUT1 or 0x2000 #TIOCM_OUT2 = hasattr(TERMIOS, 'TIOCM_OUT2') and TERMIOS.TIOCM_OUT2 or 0x4000 TIOCINQ = hasattr(TERMIOS, 'FIONREAD') and TERMIOS.FIONREAD or 0x541B TIOCM_zero_str = struct.pack('I', 0) TIOCM_RTS_str = struct.pack('I', TIOCM_RTS) TIOCM_DTR_str = struct.pack('I', TIOCM_DTR) TIOCSBRK = hasattr(TERMIOS, 'TIOCSBRK') and TERMIOS.TIOCSBRK or 0x5427 TIOCCBRK = hasattr(TERMIOS, 'TIOCCBRK') and TERMIOS.TIOCCBRK or 0x5428 class PosixSerial(SerialBase): """Serial port class POSIX implementation. Serial port configuration is done with termios and fcntl. Runs on Linux and many other Un*x like systems.""" def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" if self._port is None: raise SerialException("Port must be configured before it can be used.") if self._isOpen: raise SerialException("Port is already open.") self.fd = None # open try: self.fd = os.open(self.portstr, os.O_RDWR|os.O_NOCTTY|os.O_NONBLOCK) except Exception, msg: self.fd = None raise SerialException("could not open port %s: %s" % (self._port, msg)) #~ fcntl.fcntl(self.fd, FCNTL.F_SETFL, 0) # set blocking try: self._reconfigurePort() except: try: os.close(self.fd) except: # ignore any exception when closing the port # also to keep original exception that happened when setting up pass self.fd = None raise else: self._isOpen = True #~ self.flushInput() def _reconfigurePort(self): """Set communication parameters on opened port.""" if self.fd is None: raise SerialException("Can only operate on a valid file descriptor") custom_baud = None vmin = vtime = 0 # timeout is done via select if self._interCharTimeout is not None: vmin = 1 vtime = int(self._interCharTimeout * 10) try: orig_attr = termios.tcgetattr(self.fd) iflag, oflag, cflag, lflag, ispeed, ospeed, cc = orig_attr except termios.error, msg: # if a port is nonexistent but has a /dev file, it'll fail here raise SerialException("Could not configure port: %s" % msg) # set up raw mode / no echo / binary cflag |= (TERMIOS.CLOCAL|TERMIOS.CREAD) lflag &= ~(TERMIOS.ICANON|TERMIOS.ECHO|TERMIOS.ECHOE|TERMIOS.ECHOK|TERMIOS.ECHONL| TERMIOS.ISIG|TERMIOS.IEXTEN) #|TERMIOS.ECHOPRT for flag in ('ECHOCTL', 'ECHOKE'): # netbsd workaround for Erk if hasattr(TERMIOS, flag): lflag &= ~getattr(TERMIOS, flag) oflag &= ~(TERMIOS.OPOST) iflag &= ~(TERMIOS.INLCR|TERMIOS.IGNCR|TERMIOS.ICRNL|TERMIOS.IGNBRK) if hasattr(TERMIOS, 'IUCLC'): iflag &= ~TERMIOS.IUCLC if hasattr(TERMIOS, 'PARMRK'): iflag &= ~TERMIOS.PARMRK # setup baud rate try: ispeed = ospeed = getattr(TERMIOS, 'B%s' % (self._baudrate)) except AttributeError: try: ispeed = ospeed = baudrate_constants[self._baudrate] except KeyError: #~ raise ValueError('Invalid baud rate: %r' % self._baudrate) # may need custom baud rate, it isn't in our list. ispeed = ospeed = getattr(TERMIOS, 'B38400') try: custom_baud = int(self._baudrate) # store for later except ValueError: raise ValueError('Invalid baud rate: %r' % self._baudrate) else: if custom_baud < 0: raise ValueError('Invalid baud rate: %r' % self._baudrate) # setup char len cflag &= ~TERMIOS.CSIZE if self._bytesize == 8: cflag |= TERMIOS.CS8 elif self._bytesize == 7: cflag |= TERMIOS.CS7 elif self._bytesize == 6: cflag |= TERMIOS.CS6 elif self._bytesize == 5: cflag |= TERMIOS.CS5 else: raise ValueError('Invalid char len: %r' % self._bytesize) # setup stopbits if self._stopbits == STOPBITS_ONE: cflag &= ~(TERMIOS.CSTOPB) elif self._stopbits == STOPBITS_ONE_POINT_FIVE: cflag |= (TERMIOS.CSTOPB) # XXX same as TWO.. there is no POSIX support for 1.5 elif self._stopbits == STOPBITS_TWO: cflag |= (TERMIOS.CSTOPB) else: raise ValueError('Invalid stop bit specification: %r' % self._stopbits) # setup parity iflag &= ~(TERMIOS.INPCK|TERMIOS.ISTRIP) if self._parity == PARITY_NONE: cflag &= ~(TERMIOS.PARENB|TERMIOS.PARODD) elif self._parity == PARITY_EVEN: cflag &= ~(TERMIOS.PARODD) cflag |= (TERMIOS.PARENB) elif self._parity == PARITY_ODD: cflag |= (TERMIOS.PARENB|TERMIOS.PARODD) else: raise ValueError('Invalid parity: %r' % self._parity) # setup flow control # xonxoff if hasattr(TERMIOS, 'IXANY'): if self._xonxoff: iflag |= (TERMIOS.IXON|TERMIOS.IXOFF) #|TERMIOS.IXANY) else: iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF|TERMIOS.IXANY) else: if self._xonxoff: iflag |= (TERMIOS.IXON|TERMIOS.IXOFF) else: iflag &= ~(TERMIOS.IXON|TERMIOS.IXOFF) # rtscts if hasattr(TERMIOS, 'CRTSCTS'): if self._rtscts: cflag |= (TERMIOS.CRTSCTS) else: cflag &= ~(TERMIOS.CRTSCTS) elif hasattr(TERMIOS, 'CNEW_RTSCTS'): # try it with alternate constant name if self._rtscts: cflag |= (TERMIOS.CNEW_RTSCTS) else: cflag &= ~(TERMIOS.CNEW_RTSCTS) # XXX should there be a warning if setting up rtscts (and xonxoff etc) fails?? # buffer # vmin "minimal number of characters to be read. = for non blocking" if vmin < 0 or vmin > 255: raise ValueError('Invalid vmin: %r ' % vmin) cc[TERMIOS.VMIN] = vmin # vtime if vtime < 0 or vtime > 255: raise ValueError('Invalid vtime: %r' % vtime) cc[TERMIOS.VTIME] = vtime # activate settings if [iflag, oflag, cflag, lflag, ispeed, ospeed, cc] != orig_attr: termios.tcsetattr(self.fd, TERMIOS.TCSANOW, [iflag, oflag, cflag, lflag, ispeed, ospeed, cc]) # apply custom baud rate, if any if custom_baud is not None: set_special_baudrate(self, custom_baud) def close(self): """Close port""" if self._isOpen: if self.fd is not None: os.close(self.fd) self.fd = None self._isOpen = False def makeDeviceName(self, port): return device(port) # - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): """Return the number of characters currently in the input buffer.""" #~ s = fcntl.ioctl(self.fd, TERMIOS.FIONREAD, TIOCM_zero_str) s = fcntl.ioctl(self.fd, TIOCINQ, TIOCM_zero_str) return struct.unpack('I',s)[0] # select based implementation, proved to work on many systems def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self._isOpen: raise portNotOpenError read = bytearray() while len(read) < size: ready,_,_ = select.select([self.fd],[],[], self._timeout) # If select was used with a timeout, and the timeout occurs, it # returns with empty lists -> thus abort read operation. # For timeout == 0 (non-blocking operation) also abort when there # is nothing to read. if not ready: break # timeout buf = os.read(self.fd, size-len(read)) # read should always return some data as select reported it was # ready to read when we get to this point. if not buf: # Disconnected devices, at least on Linux, show the # behavior that they are always ready to read immediately # but reading returns nothing. raise SerialException('device reports readiness to read but returned no data (device disconnected?)') read.extend(buf) return bytes(read) def write(self, data): """Output the given string over the serial port.""" if not self._isOpen: raise portNotOpenError t = len(data) d = data if self._writeTimeout is not None and self._writeTimeout > 0: timeout = time.time() + self._writeTimeout else: timeout = None while t > 0: try: n = os.write(self.fd, d) if timeout: # when timeout is set, use select to wait for being ready # with the time left as timeout timeleft = timeout - time.time() if timeleft < 0: raise writeTimeoutError _, ready, _ = select.select([], [self.fd], [], timeleft) if not ready: raise writeTimeoutError d = d[n:] t = t - n except OSError, v: if v.errno != errno.EAGAIN: raise SerialException('write failed: %s' % (v,)) return len(data) def flush(self): """Flush of file like objects. In this case, wait until all data is written.""" self.drainOutput() def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError termios.tcflush(self.fd, TERMIOS.TCIFLUSH) def flushOutput(self): """Clear output buffer, aborting the current output and discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError termios.tcflush(self.fd, TERMIOS.TCOFLUSH) def sendBreak(self, duration=0.25): """Send break condition. Timed, returns to idle state after given duration.""" if not self._isOpen: raise portNotOpenError termios.tcsendbreak(self.fd, int(duration/0.25)) def setBreak(self, level=1): """Set break: Controls TXD. When active, no transmitting is possible.""" if self.fd is None: raise portNotOpenError if level: fcntl.ioctl(self.fd, TIOCSBRK) else: fcntl.ioctl(self.fd, TIOCCBRK) def setRTS(self, level=1): """Set terminal status line: Request To Send""" if not self._isOpen: raise portNotOpenError if level: fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_RTS_str) else: fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_RTS_str) def setDTR(self, level=1): """Set terminal status line: Data Terminal Ready""" if not self._isOpen: raise portNotOpenError if level: fcntl.ioctl(self.fd, TIOCMBIS, TIOCM_DTR_str) else: fcntl.ioctl(self.fd, TIOCMBIC, TIOCM_DTR_str) def getCTS(self): """Read terminal status line: Clear To Send""" if not self._isOpen: raise portNotOpenError s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) return struct.unpack('I',s)[0] & TIOCM_CTS != 0 def getDSR(self): """Read terminal status line: Data Set Ready""" if not self._isOpen: raise portNotOpenError s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) return struct.unpack('I',s)[0] & TIOCM_DSR != 0 def getRI(self): """Read terminal status line: Ring Indicator""" if not self._isOpen: raise portNotOpenError s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) return struct.unpack('I',s)[0] & TIOCM_RI != 0 def getCD(self): """Read terminal status line: Carrier Detect""" if not self._isOpen: raise portNotOpenError s = fcntl.ioctl(self.fd, TIOCMGET, TIOCM_zero_str) return struct.unpack('I',s)[0] & TIOCM_CD != 0 # - - platform specific - - - - def drainOutput(self): """internal - not portable!""" if not self._isOpen: raise portNotOpenError termios.tcdrain(self.fd) def nonblocking(self): """internal - not portable!""" if not self._isOpen: raise portNotOpenError fcntl.fcntl(self.fd, FCNTL.F_SETFL, os.O_NONBLOCK) def fileno(self): """For easier use of the serial port instance with select. WARNING: this function is not portable to different platforms!""" if not self._isOpen: raise portNotOpenError return self.fd def flowControl(self, enable): """manually control flow - when hardware or software flow control is enabled""" if not self._isOpen: raise portNotOpenError if enable: termios.tcflow(self.fd, TERMIOS.TCION) else: termios.tcflow(self.fd, TERMIOS.TCIOFF) # assemble Serial class with the platform specifc implementation and the base # for file-like behavior. for Python 2.6 and newer, that provide the new I/O # library, derrive from io.RawIOBase try: import io except ImportError: # classic version with our own file-like emulation class Serial(PosixSerial, FileLike): pass else: # io library present class Serial(PosixSerial, io.RawIOBase): pass class PosixPollSerial(Serial): """poll based read implementation. not all systems support poll properly. however this one has better handling of errors, such as a device disconnecting while it's in use (e.g. USB-serial unplugged)""" def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if self.fd is None: raise portNotOpenError read = bytearray() poll = select.poll() poll.register(self.fd, select.POLLIN|select.POLLERR|select.POLLHUP|select.POLLNVAL) if size > 0: while len(read) < size: # print "\tread(): size",size, "have", len(read) #debug # wait until device becomes ready to read (or something fails) for fd, event in poll.poll(self._timeout*1000): if event & (select.POLLERR|select.POLLHUP|select.POLLNVAL): raise SerialException('device reports error (poll)') # we don't care if it is select.POLLIN or timeout, that's # handled below buf = os.read(self.fd, size - len(read)) read.extend(buf) if ((self._timeout is not None and self._timeout >= 0) or (self._interCharTimeout is not None and self._interCharTimeout > 0)) and not buf: break # early abort on timeout return bytes(read) if __name__ == '__main__': s = Serial(0, baudrate=19200, # baud rate bytesize=EIGHTBITS, # number of data bits parity=PARITY_EVEN, # enable parity checking stopbits=STOPBITS_ONE, # number of stop bits timeout=3, # set a timeout value, None for waiting forever xonxoff=0, # enable software flow control rtscts=0, # enable RTS/CTS flow control ) s.setRTS(1) s.setDTR(1) s.flushInput() s.flushOutput() s.write('hello') sys.stdout.write('%r\n' % s.read(5)) sys.stdout.write('%s\n' % s.inWaiting()) del s PK[,site-packages/serial/urlhandler/__init__.pycnu[ ApMc@sdS(N((((s>/usr/lib/python2.7/site-packages/serial/urlhandler/__init__.pytsPK[q+{i&i&3site-packages/serial/urlhandler/protocol_socket.pycnu[ Mc@sXddlTddlZddlZddlZiejd6ejd6ejd6ejd6Zde fdYZ yddl Z Wn*e k rd e e fd YZnXd e e jfd YZed krTddlZed ZejjdeejjdejdejejjdejdejndS(i(t*Ntdebugtinfotwarningterrort SocketSerialcBseZdZd&ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZedZed Zed!Zd"Zd#Zd$Zd%ZRS('s-Serial port implementation for plain sockets.i2iKiniiii,iXiii` ii%iKiiicCsd|_|jdkr'tdn|jr?tdny;tjtjtj|_|jj |j |j Wn5t k r}d|_td|j |fnX|jj d|jt|_|js|jt|jtn|j|jdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.sCould not open port %s: %siN(tNonetloggert_porttSerialExceptiont_isOpentsockettAF_INETt SOCK_STREAMt_sockettconnecttfromURLtportstrt Exceptiont settimeoutt_reconfigurePorttTruet_rtsctstsetRTStsetDTRt flushInputt flushOutput(tselftmsg((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytopen(s&         cCs>|jdkrtdn|jr:|jjdndS(siSet communication parameters on opened port. for the socket:// protocol all settings are ignored!sCan only operate on open portss!ignored port configuration changeN(RRR RR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRCs cCsi|jre|jrLy$|jjtj|jjWnnXd|_nt|_tj dndS(s Close portg333333?N( R RtshutdownR t SHUT_RDWRtcloseRtFalsettimetsleep(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyR Ks    cCstddS(Ns2there is no sensible way to turn numbers into URLs(R (Rtport((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytmakeDeviceNameZscCsu|jjdr"|d}ny#d|kr|jdd\}}x|jdD]}d|kr|jdd\}}nd}|dkrtjtjd|_|jjt ||jj dqYt d |fqYWn|jd d\}}t |}d |ko0d knsDt d nWn#t k rj}t d|nX||fS(s(extract host and port from an URL strings socket://i t/it=tloggingspySerial.socketsenabled loggingsunknown option: %rt:iisport not in range 0...65535sRexpected a string in the form "[rfc2217://]:[/option[/option...]]": %sN(tlowert startswithtsplitRR(t basicConfigt getLoggerRtsetLevelt LOGGER_LEVELSRt ValueErrortintR (RturltoptionstoptiontvaluethostR$te((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyR]s,      cCs2|jstn|jr.|jjdndS(s>Return the number of characters currently in the input buffer.s&WARNING: inWaiting returns dummy valuei(R tportNotOpenErrorRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyt inWaiting|s   icCs|jstnt}tj|j}xt||krtj|kry |jj|t|}Wq1tj k rq1q1tj k r}t d|q1Xq1Wt |S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.sconnection failed (%s)( R R9t bytearrayR"t_timeouttlenRtrecvR ttimeoutRR tbytes(RtsizetdataR?R8((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytreads  ' cCsY|jstny|jj|Wn&tjk rN}td|nXt|S(sOutput the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.ssocket connection failed: %s(R R9RtsendallR RR R=(RRBR8((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytwrites cCs2|jstn|jr.|jjdndS(s9Clear input buffer, discarding all that is in the buffer.signored flushInputN(R R9RR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  cCs2|jstn|jr.|jjdndS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.signored flushOutputN(R R9RR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  g?cCs9|jstn|jr5|jjd|fndS(sPSend break condition. Timed, returns to idle state after given duration.signored sendBreak(%r)N(R R9RR(Rtduration((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyt sendBreaks  cCs9|jstn|jr5|jjd|fndS(sJSet break: Controls TXD. When active, to transmitting is possible.signored setBreak(%r)N(R R9RR(Rtlevel((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytsetBreaks  cCs9|jstn|jr5|jjd|fndS(s)Set terminal status line: Request To Sendsignored setRTS(%r)N(R R9RR(RRH((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  cCs9|jstn|jr5|jjd|fndS(s-Set terminal status line: Data Terminal Readysignored setDTR(%r)N(R R9RR(RRH((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  cCs2|jstn|jr.|jjdntS(s(Read terminal status line: Clear To Sendsreturning dummy for getCTS()(R R9RRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetCTSs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Data Set Readysreturning dummy for getDSR()(R R9RRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetDSRs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Ring Indicatorsreturning dummy for getRI()(R R9RRR!(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetRIs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Carrier Detectsreturning dummy for getCD()(R R9RRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetCDs   (i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESRRR R%RR:RCRERRRGRRIRRRJRKRLRM(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyR"s*                tSerialcBseZRS((RNRO(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRRscBseZRS((RNRO(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRRst__main__ssocket://localhost:7000s%s s write... shello s read: %s i(tserial.serialutilR"R R(tDEBUGtINFOtWARNINGtERRORR0t SerialBaseRtiot ImportErrortFileLikeRRt RawIOBaseRNtsystststdoutREtflushRCR (((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyts.              PK[a333site-packages/serial/urlhandler/protocol_rfc2217.pynu[#! python # # Python Serial Port Extension for Win32, Linux, BSD, Jython # see ../__init__.py # # This is a thin wrapper to load the rfc2271 implementation. # # (C) 2011 Chris Liechti # this is distributed under a free software license, see license.txt from serial.rfc2217 import Serial PK[GTT3site-packages/serial/urlhandler/protocol_hwgrep.pyonu[ qNNc@s^ddlZddlZdejfdYZedkrZedZde_eGHndS(iNtSerialcBs;eZdZdZdZeejjeddZ RS(sOJust inherit the native Serial port implementation and patch the open function.cCsTt|tr=|jdr=tjj||j|ntjj||dS(s%translate port name before storing its hwgrep://N(t isinstancet basestringt startswithtserialRtsetPorttfromURL(tselftvalue((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyRscCsf|jjdr"|d}nx=tjjj|D]\}}}|SWtjd|fdS(s(extract host and port from an URL strings hwgrep://i s!no ports found matching regexp %rN(tlowerRRttoolst list_portstgreptSerialException(Rturltporttdescthwid((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyRs  %tdocs Port setting( t__name__t __module__t__doc__RRtpropertyRRtgetPortR(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyRs  t__main__shwgrep://ttyS0(Rtserial.tools.list_portsRRtNonetsR(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyts     PK[M 4site-packages/serial/urlhandler/protocol_rfc2217.pycnu[ FpMc@sddlmZdS(i(tSerialN(tserial.rfc2217R(((sF/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_rfc2217.pyt sPK[GTT3site-packages/serial/urlhandler/protocol_hwgrep.pycnu[ qNNc@s^ddlZddlZdejfdYZedkrZedZde_eGHndS(iNtSerialcBs;eZdZdZdZeejjeddZ RS(sOJust inherit the native Serial port implementation and patch the open function.cCsTt|tr=|jdr=tjj||j|ntjj||dS(s%translate port name before storing its hwgrep://N(t isinstancet basestringt startswithtserialRtsetPorttfromURL(tselftvalue((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyRscCsf|jjdr"|d}nx=tjjj|D]\}}}|SWtjd|fdS(s(extract host and port from an URL strings hwgrep://i s!no ports found matching regexp %rN(tlowerRRttoolst list_portstgreptSerialException(Rturltporttdescthwid((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyRs  %tdocs Port setting( t__name__t __module__t__doc__RRtpropertyRRtgetPortR(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyRs  t__main__shwgrep://ttyS0(Rtserial.tools.list_portsRRtNonetsR(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_hwgrep.pyts     PK[+site-packages/serial/urlhandler/__init__.pynu[PK[@R%%1site-packages/serial/urlhandler/protocol_loop.pyonu[ MNc@sXddlTddlZddlZddlZiejd6ejd6ejd6ejd6Zde fdYZ yddl Z Wn*e k rd e e fd YZnXd e e jfd YZed krTddlZed ZejjdeejjdejdejejjdejdejndS(i(t*NtdebugtinfotwarningterrortLoopbackSerialcBseZdZd&ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZedZed Zed!Zd"Zd#Zd$Zd%ZRS('sSSerial port implementation that simulates a loop back connection in plain software.i2iKiniiii,iXiii` ii%iKiiicCs|jrtdnd|_tj|_t|_t |_ t |_ |j dkrltdn|j |j|jt|_|js|jt|jtn|j|jdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.sPort is already open.s.Port must be configured before it can be used.N(t_isOpentSerialExceptiontNonetloggert threadingtLockt buffer_lockt bytearrayt loop_buffertFalsetctstdsrt_porttfromURLtportt_reconfigurePorttTruet_rtsctstsetRTStsetDTRt flushInputt flushOutput(tself((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytopen&s"          cCsot|jttf s9d|jko3dkn rOtd|jn|jrk|jjdndS(sgSet communication parameters on opened port. for the loop:// protocol all settings are ignored!iii sinvalid baudrate: %rs_reconfigurePort()NI(t isinstancet _baudratetinttlongt ValueErrorR R(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRAs9 cCs&|jr"t|_tjdndS(s Close portg333333?N(RRttimetsleep(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytcloseJs  cCstddS(Ns2there is no sensible way to turn numbers into URLs(R(RR((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytmakeDeviceNameQscCs|jjdr"|d}nyx|jdD]}d|krb|jdd\}}nd }|sqq5|dkrtjtjd|_|jjt ||jj dq5t d |fq5WWn#t k r}t d |nXd S( s(extract host and port from an URL stringsloop://it/t=itloggings pySerial.loopsenabled loggingsunknown option: %rsAexpected a string in the form "[loop://][option[/option...]]": %sN( tlowert startswithtsplitRR)t basicConfigt getLoggerR tsetLevelt LOGGER_LEVELSRR"R(Rturltoptiontvaluete((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRTs"    cCsK|jstn|jr>|jjdt|jfnt|jS(s>Return the number of characters currently in the input buffer.sinWaiting() -> %d(RtportNotOpenErrorR RtlenR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyt inWaitingls   #icCs|jstn|jdk r7tj|j}nd}t}x|dkr|jjz!t|j | }|j |4Wd|jj X||7}|t |8}|rItj|krIPqIqIWt |S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.iN( RR5t_timeoutRR#R R tacquiretto_bytesRtreleaseR6tbytes(Rtsizettimeouttdatatblock((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytreadus"    cCs|jstnt|}dt||j}|jdk rl||jkrltj|jt n|j j z|j |7_ Wd|j j Xt|S(sOutput the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.g$@N(RR5R<R6Rt _writeTimeoutRR#R$twriteTimeoutErrorR R9RR;(RR?ttime_used_to_send((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytwrites    cCs[|jstn|jr.|jjdn|jjz |j2Wd|jjXdS(s9Clear input buffer, discarding all that is in the buffer.s flushInput()N(RR5R RR R9RR;(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs    cCs2|jstn|jr.|jjdndS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.s flushOutput()N(RR5R R(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs  g?cCs|jstndS(sPSend break condition. Timed, returns to idle state after given duration.N(RR5(Rtduration((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyt sendBreaks cCs9|jstn|jr5|jjd|fndS(sJSet break: Controls TXD. When active, to transmitting is possible.s setBreak(%r)N(RR5R R(Rtlevel((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytsetBreaks  cCsB|jstn|jr5|jjd|fn||_dS(s)Set terminal status line: Request To SendssetRTS(%r) -> state of CTSN(RR5R RR(RRH((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs   cCsB|jstn|jr5|jjd|fn||_dS(s-Set terminal status line: Data Terminal ReadyssetDTR(%r) -> state of DSRN(RR5R RR(RRH((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs   cCs?|jstn|jr8|jjd|jfn|jS(s(Read terminal status line: Clear To SendsgetCTS() -> state of RTS (%r)(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetCTSs   cCs?|jstn|jr8|jjd|jfn|jS(s)Read terminal status line: Data Set ReadysgetDSR() -> state of DTR (%r)(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetDSRs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Ring Indicatorsreturning dummy for getRI()(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetRIs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Carrier Detectsreturning dummy for getCD()(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetCDs   (i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESRRR%R&RR7RARERRRGRRIRRRJRKRLRM(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyR s*              tSerialcBseZRS((RNRO(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRRscBseZRS((RNRO(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRRst__main__sloop://s%s s write... shello s read: %s i(tserial.serialutilR R#R)tDEBUGtINFOtWARNINGtERRORR0t SerialBaseRtiot ImportErrortFileLikeRRt RawIOBaseRNtsystststdoutREtflushRAR%(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyts.              PK[c1%%2site-packages/serial/urlhandler/protocol_socket.pynu[#! python # # Python Serial Port Extension for Win32, Linux, BSD, Jython # see __init__.py # # This module implements a simple socket based client. # It does not support changing any port parameters and will silently ignore any # requests to do so. # # The purpose of this module is that applications using pySerial can connect to # TCP/IP to serial port converters that do not support RFC 2217. # # (C) 2001-2011 Chris Liechti # this is distributed under a free software license, see license.txt # # URL format: socket://:[/option[/option...]] # options: # - "debug" print diagnostic messages from serial.serialutil import * import time import socket import logging # map log level names to constants. used in fromURL() LOGGER_LEVELS = { 'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING, 'error': logging.ERROR, } class SocketSerial(SerialBase): """Serial port implementation for plain sockets.""" BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200) def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" self.logger = None if self._port is None: raise SerialException("Port must be configured before it can be used.") if self._isOpen: raise SerialException("Port is already open.") try: self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._socket.connect(self.fromURL(self.portstr)) except Exception, msg: self._socket = None raise SerialException("Could not open port %s: %s" % (self.portstr, msg)) self._socket.settimeout(2) # used for write timeout support :/ # not that there anything to configure... self._reconfigurePort() # all things set up get, now a clean start self._isOpen = True if not self._rtscts: self.setRTS(True) self.setDTR(True) self.flushInput() self.flushOutput() def _reconfigurePort(self): """Set communication parameters on opened port. for the socket:// protocol all settings are ignored!""" if self._socket is None: raise SerialException("Can only operate on open ports") if self.logger: self.logger.info('ignored port configuration change') def close(self): """Close port""" if self._isOpen: if self._socket: try: self._socket.shutdown(socket.SHUT_RDWR) self._socket.close() except: # ignore errors. pass self._socket = None self._isOpen = False # in case of quick reconnects, give the server some time time.sleep(0.3) def makeDeviceName(self, port): raise SerialException("there is no sensible way to turn numbers into URLs") def fromURL(self, url): """extract host and port from an URL string""" if url.lower().startswith("socket://"): url = url[9:] try: # is there a "path" (our options)? if '/' in url: # cut away options url, options = url.split('/', 1) # process options now, directly altering self for option in options.split('/'): if '=' in option: option, value = option.split('=', 1) else: value = None if option == 'logging': logging.basicConfig() # XXX is that good to call it here? self.logger = logging.getLogger('pySerial.socket') self.logger.setLevel(LOGGER_LEVELS[value]) self.logger.debug('enabled logging') else: raise ValueError('unknown option: %r' % (option,)) # get host and port host, port = url.split(':', 1) # may raise ValueError because of unpacking port = int(port) # and this if it's not a number if not 0 <= port < 65536: raise ValueError("port not in range 0...65535") except ValueError, e: raise SerialException('expected a string in the form "[rfc2217://]:[/option[/option...]]": %s' % e) return (host, port) # - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): """Return the number of characters currently in the input buffer.""" if not self._isOpen: raise portNotOpenError if self.logger: # set this one to debug as the function could be called often... self.logger.debug('WARNING: inWaiting returns dummy value') return 0 # hmmm, see comment in read() def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self._isOpen: raise portNotOpenError data = bytearray() timeout = time.time() + self._timeout while len(data) < size and time.time() < timeout: try: # an implementation with internal buffer would be better # performing... data = self._socket.recv(size - len(data)) except socket.timeout: # just need to get out of recv form time to time to check if # still alive continue except socket.error, e: # connection fails -> terminate loop raise SerialException('connection failed (%s)' % e) return bytes(data) def write(self, data): """Output the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.""" if not self._isOpen: raise portNotOpenError try: self._socket.sendall(data) except socket.error, e: raise SerialException("socket connection failed: %s" % e) # XXX what exception if socket connection fails return len(data) def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('ignored flushInput') def flushOutput(self): """Clear output buffer, aborting the current output and discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('ignored flushOutput') def sendBreak(self, duration=0.25): """Send break condition. Timed, returns to idle state after given duration.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('ignored sendBreak(%r)' % (duration,)) def setBreak(self, level=True): """Set break: Controls TXD. When active, to transmitting is possible.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('ignored setBreak(%r)' % (level,)) def setRTS(self, level=True): """Set terminal status line: Request To Send""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('ignored setRTS(%r)' % (level,)) def setDTR(self, level=True): """Set terminal status line: Data Terminal Ready""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('ignored setDTR(%r)' % (level,)) def getCTS(self): """Read terminal status line: Clear To Send""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('returning dummy for getCTS()') return True def getDSR(self): """Read terminal status line: Data Set Ready""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('returning dummy for getDSR()') return True def getRI(self): """Read terminal status line: Ring Indicator""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('returning dummy for getRI()') return False def getCD(self): """Read terminal status line: Carrier Detect""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('returning dummy for getCD()') return True # - - - platform specific - - - # None so far # assemble Serial class with the platform specific implementation and the base # for file-like behavior. for Python 2.6 and newer, that provide the new I/O # library, derive from io.RawIOBase try: import io except ImportError: # classic version with our own file-like emulation class Serial(SocketSerial, FileLike): pass else: # io library present class Serial(SocketSerial, io.RawIOBase): pass # simple client test if __name__ == '__main__': import sys s = Serial('socket://localhost:7000') sys.stdout.write('%s\n' % s) sys.stdout.write("write...\n") s.write("hello\n") s.flush() sys.stdout.write("read: %s\n" % s.read(5)) s.close() PK[q+{i&i&3site-packages/serial/urlhandler/protocol_socket.pyonu[ Mc@sXddlTddlZddlZddlZiejd6ejd6ejd6ejd6Zde fdYZ yddl Z Wn*e k rd e e fd YZnXd e e jfd YZed krTddlZed ZejjdeejjdejdejejjdejdejndS(i(t*Ntdebugtinfotwarningterrort SocketSerialcBseZdZd&ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZedZed Zed!Zd"Zd#Zd$Zd%ZRS('s-Serial port implementation for plain sockets.i2iKiniiii,iXiii` ii%iKiiicCsd|_|jdkr'tdn|jr?tdny;tjtjtj|_|jj |j |j Wn5t k r}d|_td|j |fnX|jj d|jt|_|js|jt|jtn|j|jdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.sCould not open port %s: %siN(tNonetloggert_porttSerialExceptiont_isOpentsockettAF_INETt SOCK_STREAMt_sockettconnecttfromURLtportstrt Exceptiont settimeoutt_reconfigurePorttTruet_rtsctstsetRTStsetDTRt flushInputt flushOutput(tselftmsg((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytopen(s&         cCs>|jdkrtdn|jr:|jjdndS(siSet communication parameters on opened port. for the socket:// protocol all settings are ignored!sCan only operate on open portss!ignored port configuration changeN(RRR RR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRCs cCsi|jre|jrLy$|jjtj|jjWnnXd|_nt|_tj dndS(s Close portg333333?N( R RtshutdownR t SHUT_RDWRtcloseRtFalsettimetsleep(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyR Ks    cCstddS(Ns2there is no sensible way to turn numbers into URLs(R (Rtport((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytmakeDeviceNameZscCsu|jjdr"|d}ny#d|kr|jdd\}}x|jdD]}d|kr|jdd\}}nd}|dkrtjtjd|_|jjt ||jj dqYt d |fqYWn|jd d\}}t |}d |ko0d knsDt d nWn#t k rj}t d|nX||fS(s(extract host and port from an URL strings socket://i t/it=tloggingspySerial.socketsenabled loggingsunknown option: %rt:iisport not in range 0...65535sRexpected a string in the form "[rfc2217://]:[/option[/option...]]": %sN(tlowert startswithtsplitRR(t basicConfigt getLoggerRtsetLevelt LOGGER_LEVELSRt ValueErrortintR (RturltoptionstoptiontvaluethostR$te((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyR]s,      cCs2|jstn|jr.|jjdndS(s>Return the number of characters currently in the input buffer.s&WARNING: inWaiting returns dummy valuei(R tportNotOpenErrorRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyt inWaiting|s   icCs|jstnt}tj|j}xt||krtj|kry |jj|t|}Wq1tj k rq1q1tj k r}t d|q1Xq1Wt |S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.sconnection failed (%s)( R R9t bytearrayR"t_timeouttlenRtrecvR ttimeoutRR tbytes(RtsizetdataR?R8((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytreads  ' cCsY|jstny|jj|Wn&tjk rN}td|nXt|S(sOutput the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.ssocket connection failed: %s(R R9RtsendallR RR R=(RRBR8((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytwrites cCs2|jstn|jr.|jjdndS(s9Clear input buffer, discarding all that is in the buffer.signored flushInputN(R R9RR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  cCs2|jstn|jr.|jjdndS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.signored flushOutputN(R R9RR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  g?cCs9|jstn|jr5|jjd|fndS(sPSend break condition. Timed, returns to idle state after given duration.signored sendBreak(%r)N(R R9RR(Rtduration((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyt sendBreaks  cCs9|jstn|jr5|jjd|fndS(sJSet break: Controls TXD. When active, to transmitting is possible.signored setBreak(%r)N(R R9RR(Rtlevel((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytsetBreaks  cCs9|jstn|jr5|jjd|fndS(s)Set terminal status line: Request To Sendsignored setRTS(%r)N(R R9RR(RRH((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  cCs9|jstn|jr5|jjd|fndS(s-Set terminal status line: Data Terminal Readysignored setDTR(%r)N(R R9RR(RRH((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRs  cCs2|jstn|jr.|jjdntS(s(Read terminal status line: Clear To Sendsreturning dummy for getCTS()(R R9RRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetCTSs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Data Set Readysreturning dummy for getDSR()(R R9RRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetDSRs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Ring Indicatorsreturning dummy for getRI()(R R9RRR!(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetRIs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Carrier Detectsreturning dummy for getCD()(R R9RRR(R((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pytgetCDs   (i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESRRR R%RR:RCRERRRGRRIRRRJRKRLRM(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyR"s*                tSerialcBseZRS((RNRO(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRRscBseZRS((RNRO(((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyRRst__main__ssocket://localhost:7000s%s s write... shello s read: %s i(tserial.serialutilR"R R(tDEBUGtINFOtWARNINGtERRORR0t SerialBaseRtiot ImportErrortFileLikeRRt RawIOBaseRNtsystststdoutREtflushRCR (((sE/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_socket.pyts.              PK[,site-packages/serial/urlhandler/__init__.pyonu[ ApMc@sdS(N((((s>/usr/lib/python2.7/site-packages/serial/urlhandler/__init__.pytsPK[I+})%)%0site-packages/serial/urlhandler/protocol_loop.pynu[#! python # # Python Serial Port Extension for Win32, Linux, BSD, Jython # see __init__.py # # This module implements a loop back connection receiving itself what it sent. # # The purpose of this module is.. well... You can run the unit tests with it. # and it was so easy to implement ;-) # # (C) 2001-2011 Chris Liechti # this is distributed under a free software license, see license.txt # # URL format: loop://[option[/option...]] # options: # - "debug" print diagnostic messages from serial.serialutil import * import threading import time import logging # map log level names to constants. used in fromURL() LOGGER_LEVELS = { 'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING, 'error': logging.ERROR, } class LoopbackSerial(SerialBase): """Serial port implementation that simulates a loop back connection in plain software.""" BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200) def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" if self._isOpen: raise SerialException("Port is already open.") self.logger = None self.buffer_lock = threading.Lock() self.loop_buffer = bytearray() self.cts = False self.dsr = False if self._port is None: raise SerialException("Port must be configured before it can be used.") # not that there is anything to open, but the function applies the # options found in the URL self.fromURL(self.port) # not that there anything to configure... self._reconfigurePort() # all things set up get, now a clean start self._isOpen = True if not self._rtscts: self.setRTS(True) self.setDTR(True) self.flushInput() self.flushOutput() def _reconfigurePort(self): """Set communication parameters on opened port. for the loop:// protocol all settings are ignored!""" # not that's it of any real use, but it helps in the unit tests if not isinstance(self._baudrate, (int, long)) or not 0 < self._baudrate < 2**32: raise ValueError("invalid baudrate: %r" % (self._baudrate)) if self.logger: self.logger.info('_reconfigurePort()') def close(self): """Close port""" if self._isOpen: self._isOpen = False # in case of quick reconnects, give the server some time time.sleep(0.3) def makeDeviceName(self, port): raise SerialException("there is no sensible way to turn numbers into URLs") def fromURL(self, url): """extract host and port from an URL string""" if url.lower().startswith("loop://"): url = url[7:] try: # process options now, directly altering self for option in url.split('/'): if '=' in option: option, value = option.split('=', 1) else: value = None if not option: pass elif option == 'logging': logging.basicConfig() # XXX is that good to call it here? self.logger = logging.getLogger('pySerial.loop') self.logger.setLevel(LOGGER_LEVELS[value]) self.logger.debug('enabled logging') else: raise ValueError('unknown option: %r' % (option,)) except ValueError, e: raise SerialException('expected a string in the form "[loop://][option[/option...]]": %s' % e) # - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): """Return the number of characters currently in the input buffer.""" if not self._isOpen: raise portNotOpenError if self.logger: # attention the logged value can differ from return value in # threaded environments... self.logger.debug('inWaiting() -> %d' % (len(self.loop_buffer),)) return len(self.loop_buffer) def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self._isOpen: raise portNotOpenError if self._timeout is not None: timeout = time.time() + self._timeout else: timeout = None data = bytearray() while size > 0: self.buffer_lock.acquire() try: block = to_bytes(self.loop_buffer[:size]) del self.loop_buffer[:size] finally: self.buffer_lock.release() data += block size -= len(block) # check for timeout now, after data has been read. # useful for timeout = 0 (non blocking) read if timeout and time.time() > timeout: break return bytes(data) def write(self, data): """Output the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.""" if not self._isOpen: raise portNotOpenError # ensure we're working with bytes data = bytes(data) # calculate aprox time that would be used to send the data time_used_to_send = 10.0*len(data) / self._baudrate # when a write timeout is configured check if we would be successful # (not sending anything, not even the part that would have time) if self._writeTimeout is not None and time_used_to_send > self._writeTimeout: time.sleep(self._writeTimeout) # must wait so that unit test succeeds raise writeTimeoutError self.buffer_lock.acquire() try: self.loop_buffer += data finally: self.buffer_lock.release() return len(data) def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('flushInput()') self.buffer_lock.acquire() try: del self.loop_buffer[:] finally: self.buffer_lock.release() def flushOutput(self): """Clear output buffer, aborting the current output and discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('flushOutput()') def sendBreak(self, duration=0.25): """Send break condition. Timed, returns to idle state after given duration.""" if not self._isOpen: raise portNotOpenError def setBreak(self, level=True): """Set break: Controls TXD. When active, to transmitting is possible.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('setBreak(%r)' % (level,)) def setRTS(self, level=True): """Set terminal status line: Request To Send""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('setRTS(%r) -> state of CTS' % (level,)) self.cts = level def setDTR(self, level=True): """Set terminal status line: Data Terminal Ready""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('setDTR(%r) -> state of DSR' % (level,)) self.dsr = level def getCTS(self): """Read terminal status line: Clear To Send""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('getCTS() -> state of RTS (%r)' % (self.cts,)) return self.cts def getDSR(self): """Read terminal status line: Data Set Ready""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('getDSR() -> state of DTR (%r)' % (self.dsr,)) return self.dsr def getRI(self): """Read terminal status line: Ring Indicator""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('returning dummy for getRI()') return False def getCD(self): """Read terminal status line: Carrier Detect""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('returning dummy for getCD()') return True # - - - platform specific - - - # None so far # assemble Serial class with the platform specific implementation and the base # for file-like behavior. for Python 2.6 and newer, that provide the new I/O # library, derive from io.RawIOBase try: import io except ImportError: # classic version with our own file-like emulation class Serial(LoopbackSerial, FileLike): pass else: # io library present class Serial(LoopbackSerial, io.RawIOBase): pass # simple client test if __name__ == '__main__': import sys s = Serial('loop://') sys.stdout.write('%s\n' % s) sys.stdout.write("write...\n") s.write("hello\n") s.flush() sys.stdout.write("read: %s\n" % s.read(5)) s.close() PK[@R%%1site-packages/serial/urlhandler/protocol_loop.pycnu[ MNc@sXddlTddlZddlZddlZiejd6ejd6ejd6ejd6Zde fdYZ yddl Z Wn*e k rd e e fd YZnXd e e jfd YZed krTddlZed ZejjdeejjdejdejejjdejdejndS(i(t*NtdebugtinfotwarningterrortLoopbackSerialcBseZdZd&ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZedZed Zed!Zd"Zd#Zd$Zd%ZRS('sSSerial port implementation that simulates a loop back connection in plain software.i2iKiniiii,iXiii` ii%iKiiicCs|jrtdnd|_tj|_t|_t |_ t |_ |j dkrltdn|j |j|jt|_|js|jt|jtn|j|jdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.sPort is already open.s.Port must be configured before it can be used.N(t_isOpentSerialExceptiontNonetloggert threadingtLockt buffer_lockt bytearrayt loop_buffertFalsetctstdsrt_porttfromURLtportt_reconfigurePorttTruet_rtsctstsetRTStsetDTRt flushInputt flushOutput(tself((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytopen&s"          cCsot|jttf s9d|jko3dkn rOtd|jn|jrk|jjdndS(sgSet communication parameters on opened port. for the loop:// protocol all settings are ignored!iii sinvalid baudrate: %rs_reconfigurePort()NI(t isinstancet _baudratetinttlongt ValueErrorR R(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRAs9 cCs&|jr"t|_tjdndS(s Close portg333333?N(RRttimetsleep(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytcloseJs  cCstddS(Ns2there is no sensible way to turn numbers into URLs(R(RR((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytmakeDeviceNameQscCs|jjdr"|d}nyx|jdD]}d|krb|jdd\}}nd }|sqq5|dkrtjtjd|_|jjt ||jj dq5t d |fq5WWn#t k r}t d |nXd S( s(extract host and port from an URL stringsloop://it/t=itloggings pySerial.loopsenabled loggingsunknown option: %rsAexpected a string in the form "[loop://][option[/option...]]": %sN( tlowert startswithtsplitRR)t basicConfigt getLoggerR tsetLevelt LOGGER_LEVELSRR"R(Rturltoptiontvaluete((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRTs"    cCsK|jstn|jr>|jjdt|jfnt|jS(s>Return the number of characters currently in the input buffer.sinWaiting() -> %d(RtportNotOpenErrorR RtlenR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyt inWaitingls   #icCs|jstn|jdk r7tj|j}nd}t}x|dkr|jjz!t|j | }|j |4Wd|jj X||7}|t |8}|rItj|krIPqIqIWt |S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.iN( RR5t_timeoutRR#R R tacquiretto_bytesRtreleaseR6tbytes(Rtsizettimeouttdatatblock((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytreadus"    cCs|jstnt|}dt||j}|jdk rl||jkrltj|jt n|j j z|j |7_ Wd|j j Xt|S(sOutput the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.g$@N(RR5R<R6Rt _writeTimeoutRR#R$twriteTimeoutErrorR R9RR;(RR?ttime_used_to_send((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytwrites    cCs[|jstn|jr.|jjdn|jjz |j2Wd|jjXdS(s9Clear input buffer, discarding all that is in the buffer.s flushInput()N(RR5R RR R9RR;(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs    cCs2|jstn|jr.|jjdndS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.s flushOutput()N(RR5R R(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs  g?cCs|jstndS(sPSend break condition. Timed, returns to idle state after given duration.N(RR5(Rtduration((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyt sendBreaks cCs9|jstn|jr5|jjd|fndS(sJSet break: Controls TXD. When active, to transmitting is possible.s setBreak(%r)N(RR5R R(Rtlevel((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytsetBreaks  cCsB|jstn|jr5|jjd|fn||_dS(s)Set terminal status line: Request To SendssetRTS(%r) -> state of CTSN(RR5R RR(RRH((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs   cCsB|jstn|jr5|jjd|fn||_dS(s-Set terminal status line: Data Terminal ReadyssetDTR(%r) -> state of DSRN(RR5R RR(RRH((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRs   cCs?|jstn|jr8|jjd|jfn|jS(s(Read terminal status line: Clear To SendsgetCTS() -> state of RTS (%r)(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetCTSs   cCs?|jstn|jr8|jjd|jfn|jS(s)Read terminal status line: Data Set ReadysgetDSR() -> state of DTR (%r)(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetDSRs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Ring Indicatorsreturning dummy for getRI()(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetRIs   cCs2|jstn|jr.|jjdntS(s)Read terminal status line: Carrier Detectsreturning dummy for getCD()(RR5R RR(R((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pytgetCDs   (i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESRRR%R&RR7RARERRRGRRIRRRJRKRLRM(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyR s*              tSerialcBseZRS((RNRO(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRRscBseZRS((RNRO(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyRRst__main__sloop://s%s s write... shello s read: %s i(tserial.serialutilR R#R)tDEBUGtINFOtWARNINGtERRORR0t SerialBaseRtiot ImportErrortFileLikeRRt RawIOBaseRNtsystststdoutREtflushRAR%(((sC/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_loop.pyts.              PK[xwK2site-packages/serial/urlhandler/protocol_hwgrep.pynu[#! python # # Python Serial Port Extension for Win32, Linux, BSD, Jython # see __init__.py # # This module implements a special URL handler that uses the port listing to # find ports by searching the string descriptions. # # (C) 2011 Chris Liechti # this is distributed under a free software license, see license.txt # # URL format: hwgrep://regexp import serial import serial.tools.list_ports class Serial(serial.Serial): """Just inherit the native Serial port implementation and patch the open function.""" def setPort(self, value): """translate port name before storing it""" if isinstance(value, basestring) and value.startswith('hwgrep://'): serial.Serial.setPort(self, self.fromURL(value)) else: serial.Serial.setPort(self, value) def fromURL(self, url): """extract host and port from an URL string""" if url.lower().startswith("hwgrep://"): url = url[9:] # use a for loop to get the 1st element from the generator for port, desc, hwid in serial.tools.list_ports.grep(url): return port else: raise serial.SerialException('no ports found matching regexp %r' % (url,)) # override property port = property(serial.Serial.getPort, setPort, doc="Port setting") # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - if __name__ == '__main__': #~ s = Serial('hwgrep://ttyS0') s = Serial(None) s.port = 'hwgrep://ttyS0' print s PK[M 4site-packages/serial/urlhandler/protocol_rfc2217.pyonu[ FpMc@sddlmZdS(i(tSerialN(tserial.rfc2217R(((sF/usr/lib/python2.7/site-packages/serial/urlhandler/protocol_rfc2217.pyt sPK[ g5P5P#site-packages/serial/serialutil.pyonu[ [;Nc@s5y eeWn3eefk rAeZdefdYZnXdZedgZedgZedgZ edgZ ddd d d f\Z Z Z ZZd d df\ZZZddddf\ZZZZide 6de 6de 6de6de6ZdefdYZdefdYZedZedZdefdYZd efd!YZ e!d"kr1d#d$l"Z"e Z#e"j$j%d%e#j&e"j$j%d&e#j'e"j$j%d'e#j(e"j$j%d(e#j)e"j$j%d)e#j*e"j$j%d*e#nd$S(+t bytearraycBsGeZdZdZdZdZdZdZdZRS(cCs dj|S(Nt(tjoin(tself((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__str__scCsddj|S(Ns bytearray(%r)R(R(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__repr__scCs<t|tr"tj||ntj|t|dS(N(t isinstancetstrtlisttappendtchr(Rtitem((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR scCs"x|D]}|j|qW|S(N(R (Rtothertbyte((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__iadd__s cCsttj|||S(N(RRt __getslice__(Rtitj((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR#scCs?t|tr%ttj||Sttj||SdS(N(RtsliceRRt __getitem__tord(RR ((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR&scCs.t|trt|}ntj||S(N(Rt basestringRRt__eq__(RR ((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR,s( t__name__t __module__RRR RRRR(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyRs      cCs1t}x|D]}|j|qWt|S(s"convert a sequence to a bytes type(RR tbytes(tseqtbR ((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytto_bytes3s  iii i tNtEtOtMtSig?iiiiitNonetEventOddtMarktSpacetSerialExceptioncBseZdZRS(s.Base class for serial port related exceptions.(RRt__doc__(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR'OstSerialTimeoutExceptioncBseZdZRS(s Write timeouts give an exception(RRR((((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR)Sss Write timeouts)Attempting to use a port that is not opentFileLikecBseZdZdZdZdZdZdZdZdZ de dZ de d Z dd Zd d Zd ZddZdZRS(sAn abstract file like class. This class implements readline and readlines based on read and writelines based on write. This class is used to provide the above functions for to Serial port objects. Note that when the serial port was opened with _NO_ timeout that readline blocks until it sees a newline (or the specified size is reached) and that readlines would never return and therefore refuses to work (it raises an exception in this case)! cCs t|_dS(N(tTruetclosed(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__init__iscCs t|_dS(N(R+R,(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytcloselscCsy|jWnnXdS(sDestructor. Calls close().N(R.(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__del__pscCs"x|D]}|j|qWdS(N(twrite(Rtsequencetline((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt writelines|s cCsdS(sflush of file like objectsN((R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytflushscCs|j}|stn|S(N(treadlinet StopIteration(RR2((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytnexts  cCs|S(N((R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__iter__scCst|}t}xdtr{|jd}|rw||7}|| |krRPn|dk rxt||krxPqxqPqWt|S(skread a line which is terminated with end-of-line (eol) character (' ' by default) or until timeout.iN(tlenRR+treadR"R(RtsizeteoltleneolR2tc((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR5s    cCs|jdkrtdnt|}g}xHtrz|jd|}|rv|j||| |krwPqwq3Pq3W|S(sAread a list of lines, until timeout. sizehint is ignored.s8Serial port MUST have enabled timeout for this function!R<N(ttimeoutR"t ValueErrorR9R+R5R (RtsizehintR<R=tlinesR2((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt readliness   ccs,x%tr'|j}|sPn|VqWdS(swRead lines, implemented as generator. It will raise StopIteration on timeout (empty read). sizehint is ignored.N(R+R5(RRAR2((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt xreadliness   icCstddS(Nsfile is not seekable(tIOError(Rtpostwhence((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytseekscCstddS(Nsfile is not seekable(RE(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyttellscCstddS(Nsfile is not seekable(RE(Rtn((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyttruncatescCstS(N(tFalse(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytisattysN(RRR(R-R.R/R3R4R7R8R"tLFR5RCRDRHRIRKRM(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR*[s          t SerialBasecBseZdZdXZeeeefZe e e e e fZeeefZdYd ee edYeedYedYd Zd Zd!Zd"Zd#Zd$Zd%Zd&Zeeed'd(Zd)Zd*Z ee ed'd+Z!d,Z"d-Z#ee#e"d'd.Z$d/Z%d0Z&ee&e%d'd1Z'd2Z(d3Z)ee)e(d'd4Z*d5Z+d6Z,ee,e+d'd7Z-d8Z.d9Z/ee/e.d'd:Z0d;Z1d<Z2ee2e1d'd=Z3d>Z4d?Z5ee5e4d'd@Z6dYdAZ7dBZ8ee8e7dCZ9dDZ:dEZ;ee;e:d'dFZ<dZZ=dQZ>dRZ?dSZ@dTZAdUZBdVZCdWZDRS([sbSerial port base class. Provides __init__ function and properties to get/set port settings.i2iKiniiii,iXiii` ii%iKiiiiii iii@Bii`ii%&i-ig5i =c Cst|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ ||_||_||_||_||_||_| |_||_||_| |_| |_|dk r|jndS(sInitialize comm port object. If a port is given, then the port will be opened immediately. Otherwise a Serial port object in closed state is returned.N(RLt_isOpenR"t_portt _baudratet _bytesizet_parityt _stopbitst_timeoutt _writeTimeoutt_xonxofft_rtsctst_dsrdtrt_interCharTimeouttporttbaudratetbytesizetparitytstopbitsR?t writeTimeouttxonxofftrtsctstdsrdtrtinterCharTimeouttopen( RR\R]R^R_R`R?RbRcRaRdRe((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR-s2                        cCs|jS(sCheck if the port is opened.(RP(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytisOpenscCs&g|jD]}t||f^q S(N(t BAUDRATESR(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedBaudratesscCs&g|jD]}t||f^q S(N(t BYTESIZESR(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedByteSizesscCs&g|jD]}t||f^q S(N(tSTOPBITSR(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedStopbitsscCs$g|jD]}t||f^q S(N(tPARITIESt PARITY_NAMES(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedParitiesscCs|j}|r|jn|dk rXt|trC||_qa|j||_n d|_||_|j|_|r|j ndS(shChange the port. The attribute portstr is set to a string that contains the name of the port.N( RPR.R"RRtportstrtmakeDeviceNameRQtnameRf(RR\twas_open((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytsetPorts       cCs|jS(sGet the current port setting. The value that was passed on init or using setPort() is passed back. See also the attribute portstr which contains the name of the port as a string.(RQ(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetPort/stdocs Port settingcCsTyt||_Wn$tk r9td|fnX|jrP|jndS(sChange baud rate. It raises a ValueError if the port is open and the baud rate is not possible. If the port is closed, then the value is accepted and the exception is raised when the port is opened.sNot a valid baudrate: %rN(tintRRt TypeErrorR@RPt_reconfigurePort(RR]((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setBaudrate8s   cCs|jS(s"Get the current baud rate setting.(RR(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getBaudrateCssBaud rate settingcCsH||jkr%td|fn||_|jrD|jndS(sChange byte size.sNot a valid byte size: %rN(RjR@RSRPRz(RR^((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setByteSizeJs   cCs|jS(s"Get the current byte size setting.(RS(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getByteSizePssByte size settingcCsH||jkr%td|fn||_|jrD|jndS(sChange parity setting.sNot a valid parity: %rN(RnR@RTRPRz(RR_((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setParityWs   cCs|jS(sGet the current parity setting.(RT(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getParity]ssParity settingcCsH||jkr%td|fn||_|jrD|jndS(sChange stop bits size.sNot a valid stop bit size: %rN(RlR@RURPRz(RR`((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setStopbitsds   cCs|jS(s"Get the current stop bits setting.(RU(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getStopbitsjssStop bits settingcCs|dk rdy |dWn$tk r>td|fnX|dkrdtd|fqdn||_|jr|jndS(sChange timeout setting.isNot a valid timeout: %riN(R"RyR@RVRPRz(RR?((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setTimeoutqs      cCs|jS(s Get the current timeout setting.(RV(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getTimeout|ssTimeout setting for read()cCs|dk ra|dkr.td|fny |dWqatk r]td|qaXn||_|jr|jndS(sChange timeout setting.isNot a valid timeout: %riN(R"R@RyRWRPRz(RR?((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytsetWriteTimeouts      cCs|jS(s Get the current timeout setting.(RW(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetWriteTimeoutssTimeout setting for write()cCs#||_|jr|jndS(sChange XON/XOFF setting.N(RXRPRz(RRb((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setXonXoffs  cCs|jS(s!Get the current XON/XOFF setting.(RX(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getXonXoffssXON/XOFF settingcCs#||_|jr|jndS(s$Change RTS/CTS flow control setting.N(RYRPRz(RRc((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setRtsCtss  cCs|jS(s-Get the current RTS/CTS flow control setting.(RY(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getRtsCtsssRTS/CTS flow control settingcCs>|dkr|j|_n ||_|jr:|jndS(s#Change DsrDtr flow control setting.N(R"RYRZRPRz(RRd((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setDsrDtrs    cCs|jS(s-Get the current DSR/DTR flow control setting.(RZ(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getDsrDtrssDSR/DTR flow control settingcCs|dk r^|dkr+td|ny |dWq^tk rZtd|q^Xn||_|jr}|jndS(s'Change inter-character timeout setting.isNot a valid timeout: %riN(R"R@RyR[RPRz(RRe((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytsetInterCharTimeouts      cCs|jS(s0Get the current inter-character timeout setting.(R[(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetInterCharTimeoutss*Inter-character timeout setting for read()R]R^R_R`RbRdRcR?RaRecCs3tg|jD]}|t|d|f^q S(sQGet current port settings as a dictionary. For use with applySettingsDictt_(tdictt _SETTINGStgetattr(Rtkey((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSettingsDictscCsLxE|jD]:}||t|d|kr t||||q q WdS(sapply stored settings from a dictionary returned from getSettingsDict. it's allowed to delete keys from the dictionary. these values will simply left unchanged.RN(RRtsetattr(RtdR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytapplySettingsDictsc CsVd|jjt||j|j|j|j|j|j|j |j |j |j f S(sAString representation of the current port settings and its state.s}%s(port=%r, baudrate=%r, bytesize=%r, parity=%r, stopbits=%r, timeout=%r, xonxoff=%r, rtscts=%r, dsrdtr=%r)( t __class__RtidRPRqR]R^R_R`R?RbRcRd(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyRs  cCstS(N(R+(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytreadablescCstS(N(R+(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytwritablescCstS(N(RL(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytseekablescCs|jt|}t|}y|||*WnPtk r}ddl}t||jsh|n|jd|||*nX|S(NiR(R:R9RytarrayR(RRtdataRJterrR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytreadintos   (i2iKiniiii,iXiii` ii%iKiiiiii iii@Bii`ii%&i-ig5i =N( sbaudratesbytesizesparitysstopbitssxonxoffsdsrdtrsrtsctsstimeouts writeTimeoutsinterCharTimeout(ERRR(RhtFIVEBITStSIXBITSt SEVENBITSt EIGHTBITSRjt PARITY_NONEt PARITY_EVENt PARITY_ODDt PARITY_MARKt PARITY_SPACERnt STOPBITS_ONEtSTOPBITS_ONE_POINT_FIVEt STOPBITS_TWORlR"RLR-RgRiRkRmRpRuRvtpropertyR\R{R|R]R}R~R^RRR_RRR`RRR?RRRaRRRbRRRcRRRdRRReRRRRRRRR(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyROs #                          t__main__iNsport name: %s sbaud rates: %s sbyte sizes: %s sparities: %s sstop bits: %s s%s (+RRt NameErrortAttributeErrorRRRtXONtXOFFtCRRNRRRRRRRRRRRRRoRER'R)twriteTimeoutErrorR@tportNotOpenErrortobjectR*RORtsystststdoutR0RqRiRkRpRm(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt sF $   m@   PK[AU5'5'!site-packages/serial/serialcli.pynu[#! python # Python Serial Port Extension for Win32, Linux, BSD, Jython and .NET/Mono # serial driver for .NET/Mono (IronPython), .NET >= 2 # see __init__.py # # (C) 2008 Chris Liechti # this is distributed under a free software license, see license.txt import clr import System import System.IO.Ports from serial.serialutil import * def device(portnum): """Turn a port number into a device name""" return System.IO.Ports.SerialPort.GetPortNames()[portnum] # must invoke function with byte array, make a helper to convert strings # to byte arrays sab = System.Array[System.Byte] def as_byte_array(string): return sab([ord(x) for x in string]) # XXX will require adaption when run with a 3.x compatible IronPython class IronSerial(SerialBase): """Serial port implemenation for .NET/Mono.""" BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200) def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" if self._port is None: raise SerialException("Port must be configured before it can be used.") if self._isOpen: raise SerialException("Port is already open.") try: self._port_handle = System.IO.Ports.SerialPort(self.portstr) except Exception, msg: self._port_handle = None raise SerialException("could not open port %s: %s" % (self.portstr, msg)) self._reconfigurePort() self._port_handle.Open() self._isOpen = True if not self._rtscts: self.setRTS(True) self.setDTR(True) self.flushInput() self.flushOutput() def _reconfigurePort(self): """Set communication parameters on opened port.""" if not self._port_handle: raise SerialException("Can only operate on a valid port handle") #~ self._port_handle.ReceivedBytesThreshold = 1 if self._timeout is None: self._port_handle.ReadTimeout = System.IO.Ports.SerialPort.InfiniteTimeout else: self._port_handle.ReadTimeout = int(self._timeout*1000) # if self._timeout != 0 and self._interCharTimeout is not None: # timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:] if self._writeTimeout is None: self._port_handle.WriteTimeout = System.IO.Ports.SerialPort.InfiniteTimeout else: self._port_handle.WriteTimeout = int(self._writeTimeout*1000) # Setup the connection info. try: self._port_handle.BaudRate = self._baudrate except IOError, e: # catch errors from illegal baudrate settings raise ValueError(str(e)) if self._bytesize == FIVEBITS: self._port_handle.DataBits = 5 elif self._bytesize == SIXBITS: self._port_handle.DataBits = 6 elif self._bytesize == SEVENBITS: self._port_handle.DataBits = 7 elif self._bytesize == EIGHTBITS: self._port_handle.DataBits = 8 else: raise ValueError("Unsupported number of data bits: %r" % self._bytesize) if self._parity == PARITY_NONE: self._port_handle.Parity = getattr(System.IO.Ports.Parity, 'None') # reserved keyword in Py3k elif self._parity == PARITY_EVEN: self._port_handle.Parity = System.IO.Ports.Parity.Even elif self._parity == PARITY_ODD: self._port_handle.Parity = System.IO.Ports.Parity.Odd elif self._parity == PARITY_MARK: self._port_handle.Parity = System.IO.Ports.Parity.Mark elif self._parity == PARITY_SPACE: self._port_handle.Parity = System.IO.Ports.Parity.Space else: raise ValueError("Unsupported parity mode: %r" % self._parity) if self._stopbits == STOPBITS_ONE: self._port_handle.StopBits = System.IO.Ports.StopBits.One elif self._stopbits == STOPBITS_ONE_POINT_FIVE: self._port_handle.StopBits = System.IO.Ports.StopBits.OnePointFive elif self._stopbits == STOPBITS_TWO: self._port_handle.StopBits = System.IO.Ports.StopBits.Two else: raise ValueError("Unsupported number of stop bits: %r" % self._stopbits) if self._rtscts and self._xonxoff: self._port_handle.Handshake = System.IO.Ports.Handshake.RequestToSendXOnXOff elif self._rtscts: self._port_handle.Handshake = System.IO.Ports.Handshake.RequestToSend elif self._xonxoff: self._port_handle.Handshake = System.IO.Ports.Handshake.XOnXOff else: self._port_handle.Handshake = getattr(System.IO.Ports.Handshake, 'None') # reserved keyword in Py3k #~ def __del__(self): #~ self.close() def close(self): """Close port""" if self._isOpen: if self._port_handle: try: self._port_handle.Close() except System.IO.Ports.InvalidOperationException: # ignore errors. can happen for unplugged USB serial devices pass self._port_handle = None self._isOpen = False def makeDeviceName(self, port): try: return device(port) except TypeError, e: raise SerialException(str(e)) # - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): """Return the number of characters currently in the input buffer.""" if not self._port_handle: raise portNotOpenError return self._port_handle.BytesToRead def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self._port_handle: raise portNotOpenError # must use single byte reads as this is the only way to read # without applying encodings data = bytearray() while size: try: data.append(self._port_handle.ReadByte()) except System.TimeoutException, e: break else: size -= 1 return bytes(data) def write(self, data): """Output the given string over the serial port.""" if not self._port_handle: raise portNotOpenError if not isinstance(data, (bytes, bytearray)): raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data))) try: # must call overloaded method with byte array argument # as this is the only one not applying encodings self._port_handle.Write(as_byte_array(data), 0, len(data)) except System.TimeoutException, e: raise writeTimeoutError return len(data) def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self._port_handle: raise portNotOpenError self._port_handle.DiscardInBuffer() def flushOutput(self): """Clear output buffer, aborting the current output and discarding all that is in the buffer.""" if not self._port_handle: raise portNotOpenError self._port_handle.DiscardOutBuffer() def sendBreak(self, duration=0.25): """Send break condition. Timed, returns to idle state after given duration.""" if not self._port_handle: raise portNotOpenError import time self._port_handle.BreakState = True time.sleep(duration) self._port_handle.BreakState = False def setBreak(self, level=True): """Set break: Controls TXD. When active, to transmitting is possible.""" if not self._port_handle: raise portNotOpenError self._port_handle.BreakState = bool(level) def setRTS(self, level=True): """Set terminal status line: Request To Send""" if not self._port_handle: raise portNotOpenError self._port_handle.RtsEnable = bool(level) def setDTR(self, level=True): """Set terminal status line: Data Terminal Ready""" if not self._port_handle: raise portNotOpenError self._port_handle.DtrEnable = bool(level) def getCTS(self): """Read terminal status line: Clear To Send""" if not self._port_handle: raise portNotOpenError return self._port_handle.CtsHolding def getDSR(self): """Read terminal status line: Data Set Ready""" if not self._port_handle: raise portNotOpenError return self._port_handle.DsrHolding def getRI(self): """Read terminal status line: Ring Indicator""" if not self._port_handle: raise portNotOpenError #~ return self._port_handle.XXX return False #XXX an error would be better def getCD(self): """Read terminal status line: Carrier Detect""" if not self._port_handle: raise portNotOpenError return self._port_handle.CDHolding # - - platform specific - - - - # none # assemble Serial class with the platform specific implementation and the base # for file-like behavior. for Python 2.6 and newer, that provide the new I/O # library, derive from io.RawIOBase try: import io except ImportError: # classic version with our own file-like emulation class Serial(IronSerial, FileLike): pass else: # io library present class Serial(IronSerial, io.RawIOBase): pass # Nur Testfunktion!! if __name__ == '__main__': import sys s = Serial(0) sys.stdio.write('%s\n' % s) s = Serial() sys.stdio.write('%s\n' % s) s.baudrate = 19200 s.databits = 7 s.close() s.port = 0 s.open() sys.stdio.write('%s\n' % s) PK[c site-packages/serial/rfc2217.pyonu[ {QNc@s ddlTddlZddlZddlZddlZddlZddlZiejd6ejd6ej d6ej d6Z e dgZ e dgZe d gZe d gZe d gZe e e gZe d gZe d gZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZ e dgZ!e dgZ"e dgZ#e dgZ$e dgZ%e dgZ&e dgZ'e dgZ(e d gZ)e d!gZ*e d"gZ+e d#gZ,e d$gZ-e d%gZ.e d&gZ/e d'gZ0e d(gZ1e d)gZ2e d*gZ3e d+gZ4e d,gZ5e d-gZ6e d.gZ7e d/gZ8e d0gZ9i e.e"6e/e#6e0e$6e1e%6e2e&6e3e'6e4e(6e5e)6e6e*6e7e+6e8e,6e9e-6Z:e dgZ;e dgZ<e dgZ=e dgZ>e dgZ?e dgZ@e dgZAe dgZBe d gZCe d!gZDe d"gZEe d#gZFe d$gZGe d1gZHe d2gZIe d3gZJe d4gZKe d5gZLe d6gZMe d7gZNd8ZOd9ZPd:ZQd4ZRd ZSdZTdZUdZVd8ZWd9ZXd:ZYd4ZZd Z[dZ\dZ]dZ^e dgZ_e dgZ`e dgZaideb6dec6ded6dee6def6Zgehd;egjiDZjidek6del6dem6Znehd<enjiDZodZpdZqdZrd=Zsd>Ztd?Zud@ZvdAewfdBYZxdCewfdDYZydEezfdFYZ{yddl|Z|Wn*e}k r]dGe{e~fdHYZnXdGe{e|jfdIYZdJewfdKYZedLkrddlZedMdNZejjdOeejjdPejdQejejjdRejdejndS(Si(t*Ntdebugtinfotwarningterroriiiiiiiiiiiiiiiiiiii,iiiiiii i i i ieifigihiiijikiliminioipi iiiiiiii@i ccs!|]\}}||fVqdS(N((t.0tktv((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys sccs!|]\}}||fVqdS(N((RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys st REQUESTEDtACTIVEtINACTIVEtREALLY_INACTIVEt TelnetOptioncBs,eZdZddZdZdZRS(s@Manage a single telnet option, keeps track of DO/DONT WILL/WONT.c Cs^||_||_||_||_||_||_||_||_t|_ | |_ dS(s-Init option. :param connection: connection used to transmit answers :param name: a readable name for debug outputs :param send_yes: what to send when option is to be enabled. :param send_no: what to send when option is to be disabled. :param ack_yes: what to expect when remote agrees on option. :param ack_no: what to expect when remote disagrees on option. :param initial_state: options initialized with REQUESTED are tried to be enabled on startup. use INACTIVE for all others. N( t connectiontnametoptiontsend_yestsend_notack_yestack_notstatetFalsetactivetactivation_callback( tselfR RRRRRRt initial_stateR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt__init__s         cCsd|j|j|jfS(sString for debug outputss %s:%s(%s)(RRR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt__repr__scCs||jkr|jtkrOt|_t|_|jdk r|jqq|jtkraq|jtkrt|_|j j |j |j t|_|jdk r|jqq|jt kr|j j |j|j qtd|n||jkr|jtkr+t|_t|_q|jtkrht|_|j j |j|j t|_q|jtkrzq|jt krqtd|ndS(s^A DO/DONT/WILL/WONT was received for this option, update state and answer when needed.soption in illegal state %rN(RRRR tTrueRRtNoneR R ttelnetSendOptionRRR Rt ValueErrorRR(Rtcommand((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytprocess_incomings<        N(t__name__t __module__t__doc__RRRR!(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR s  tTelnetSubnegotiationcBsVeZdZddZdZdZdZeeZ ddZ dZ RS( sA object to handle subnegotiation of options. In this case actually sub-sub options for RFC 2217. It is used to track com port options.cCsO|dkr|}n||_||_||_d|_||_t|_dS(N(RR RRtvaluet ack_optionR R(RR RRR'((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR's      cCsd|j|jfS(sString for debug outputs.s%s:%s(RR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR0scCsa||_t|_|jj|j|j|jjr]|jjjd|j|jfndS(srequest a change of the value. a request is sent to the server. if the client needs to know if the change is performed he has to check the state of this object.sSB Requesting %s -> %rN( R&RRR trfc2217SendSubnegotiationRtloggerRR(RR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytset4s    cCs2|jtkr%td|jn|jtkS(sjcheck if answer from server has been received. when server rejects the change, raise a ValueError.s#remote rejected value for option %r(RR RRR (R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytisReady>sicCs]tj|}xFtj|krEtjd|jrPqqWtd|jdS(swait until the subnegotiation has been acknowledged or timeout. It can also throw a value error when the answer from the server does not match the value sent.g?s#timeout while waiting for option %rN(ttimetsleepR+tSerialExceptionR(Rttimeoutt timeout_time((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytwaitGs   cCsj|j|t|j kr(t|_n t|_|jjrf|jjjd|j||jfndS(scheck an incoming subnegotiation block. the parameter already has cut off the header like sub option number and com port option value.sSB Answer %s -> %r -> %sN( R&tlenR RR R R)RR(Rt suboption((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt checkAnswerSs    N( R"R#R$RRRR*R+tpropertyRR1R4(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR%#s    t RFC2217SerialcBs+eZdZd2ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZedZed Zed!Zd"Zd#Zd$Zd%Zd&Zd'Zd(Zd)Zd*Zd+Zd,d-Zd.Zd/Zd0Z d1Z!RS(3s<Serial port implementation for RFC 2217 remote serial ports.i2iKiniiii,iXiii` ii%iKiiic Cs7d|_t|_t|_d|_|jdkrBtdn|jrZtdnyWt j t j t j |_ |j j |j|j|j jt jt jdWn5tk r}d|_ td|j|fnX|j jdtj|_tj|_t|dtttttt t|dt!ttttt"g}t|d t#ttttt"t|d t$ttttt"t|d t$ttttt"t|d tttttt t|d t!ttttt"g||_%it&|dt't(d6t&|dt)t*d6t&|dt+t,d6t&|dt-t.d6|_/it&|dt0t1d6t&|dt2t3d6|_4|j4j5|j/d|_6d|_7d|_8t|_9tj:d|j;|_<|j<j=t>|j<j?d|jf|j<j@x9|j%D].}|jAt"kr"|jB|jC|jDq"q"WtEjE|j}xYtEjE|krtEjFdtGd|DtH|krjPqjqjWtd||jr|jjId|j%n|jJt>|_|jKs|jLt>|jMt>n|jN|jOdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.is.Port must be configured before it can be used.sPort is already open.isCould not open port %s: %sis we-BINARYs we-RFC2217tECHOswe-SGAsthey-SGAs they-BINARYs they-RFC2217tbaudratetdatasizetparitytstopsizetpurgetcontrolittargets&pySerial RFC 2217 reader thread for %sg?css|]}|jVqdS(N(R(Rto((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys ss9Remote does not seem to support RFC2217 or BINARY mode %rsNegotiated options: %sN(PRR)Rt_ignore_set_control_answert_poll_modem_statet_network_timeoutt_portR.t_isOpentsockettAF_INETt SOCK_STREAMt_sockettconnecttfromURLtportstrt setsockoptt IPPROTO_TCPt TCP_NODELAYt Exceptiont settimeouttQueuet _read_buffert threadingtLockt _write_lockR tBINARYtWILLtWONTtDOtDONTR tCOM_PORT_OPTIONRR7tSGAt_telnet_optionsR%t SET_BAUDRATEtSERVER_SET_BAUDRATEt SET_DATASIZEtSERVER_SET_DATASIZEt SET_PARITYtSERVER_SET_PARITYt SET_STOPSIZEtSERVER_SET_STOPSIZEt_rfc2217_port_settingst PURGE_DATAtSERVER_PURGE_DATAt SET_CONTROLtSERVER_SET_CONTROLt_rfc2217_optionstupdatet _linestatet _modemstatet_modemstate_expirest_remote_suspend_flowtThreadt_telnetReadLoopt_threadt setDaemonRtsetNametstartRRRRR,R-tsumR2Rt_reconfigurePortt_rtsctstsetRTStsetDTRt flushInputt flushOutput(Rtmsgtmandadory_optionsRR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytopenesz       $!       "      cCsG|jdkrtdn|jdk r<tdnt|jttf sud|jkoodkn rt d|jn|j dj t j d|j|j d j t j d |j|j d j t j d t|j|j d j t j d t|j|j j}|jrQ|jjd |fntj|j}xYtj|krtjdtd|Dt|krgPqgqgWtd||jr|jjd|fn|jr|jrt dn?|jr|jtn&|jr6|jt n |jt!dS(s,Set communication parameters on opened port.sCan only operate on open portss'writeTimeout is currently not supportediii sinvalid baudrate: %rR8s!IR9s!BR:R;sNegotiating settings: %sg?css|]}|jVqdS(N(R(RR?((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys ss5Remote does not accept parameter change (RFC2217): %rsNegotiated settings: %ss-xonxoff and rtscts together are not supportedNI("RHRR.t _writeTimeouttNotImplementedErrort isinstancet _baudratetinttlongRRfR*tstructtpackt _bytesizetRFC2217_PARITY_MAPt_paritytRFC2217_STOPBIT_MAPt _stopbitstvaluesR)RR,RBR-RwR2RRyt_xonxofftrfc2217SetControltSET_CONTROL_USE_HW_FLOW_CONTROLtSET_CONTROL_USE_SW_FLOW_CONTROLtSET_CONTROL_USE_NO_FLOW_CONTROL(RtitemsR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRxs89##''  "   cCs|jr~|jrLy$|jjtj|jjWnnXd|_n|jre|jjnt |_t j dndS(s Close portg333333?N( RDRHtshutdownREt SHUT_RDWRtcloseRRstjoinRR,R-(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs     cCstddS(Ns2there is no sensible way to turn numbers into URLs(R.(Rtport((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytmakeDeviceNamescCs|jjdr"|d}nyqd|krC|jdd\}}x|jdD]}d|kr|jdd\}}nd}|dkrtjtjd|_|jjt ||jj dqY|d krt |_ qY|d kr t |_ qY|d kr)t||_qYtd |fqYWn|jd d\}}t|}d|ko~dknstdnWn#tk r}td|nX||fS(s(extract host and port from an URL strings rfc2217://i t/it=tloggingspySerial.rfc2217senabled loggingtign_set_controlt poll_modemR/sunknown option: %rt:iisport not in range 0...65535sRexpected a string in the form "[rfc2217://]:[/option[/option...]]": %sN(tlowert startswithtsplitRRt basicConfigt getLoggerR)tsetLevelt LOGGER_LEVELSRRR@RAtfloatRBRRR.(RturltoptionsRR&thostRte((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRJs8           cCs|jstn|jjS(s>Return the number of characters currently in the input buffer.(RDtportNotOpenErrorRRtqsize(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt inWaiting&s icCs|jstnt}yZxSt||krs|jdkrQtdn|j|jj t |j q!WWnt j k rnXt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.s&connection failed (reader thread died)N(RDRt bytearrayR2RsRR.tappendRRtgetRt_timeoutRQtEmptytbytes(Rtsizetdata((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytread+s  'cCs|jstn|jjzMy |jj|jttWn&t j k rj}t d|nXWd|jj Xt |S(sOutput the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.s$connection failed (socket error): %sN(RDRRUtacquireRHtsendalltreplacetIACt IAC_DOUBLEDRERR.treleaseR2(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytwrite:s   cCsI|jstn|jtx#|jjrD|jjtq"WdS(s9Clear input buffer, discarding all that is in the buffer.N(RDRtrfc2217SendPurgetPURGE_RECEIVE_BUFFERRRRRR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR|Is   cCs#|jstn|jtdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(RDRRtPURGE_TRANSMIT_BUFFER(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR}Qs g?cCs=|jstn|jttj||jtdS(sPSend break condition. Timed, returns to idle state after given duration.N(RDRtsetBreakRR,R-R(Rtduration((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt sendBreakWs    cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(sJSet break: Controls TXD. When active, to transmitting is possible.sset BREAK to %stinactiveRN(Rsactive(RDRR)RtboolRtSET_CONTROL_BREAK_ONtSET_CONTROL_BREAK_OFF(Rtlevel((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR_s  !cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(s*Set terminal status line: Request To Send.s set RTS to %sRRN(sinactivesactive(RDRR)RRRtSET_CONTROL_RTS_ONtSET_CONTROL_RTS_OFF(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRzjs  !cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(s.Set terminal status line: Data Terminal Ready.s set DTR to %sRRN(sinactivesactive(RDRR)RRRtSET_CONTROL_DTR_ONtSET_CONTROL_DTR_OFF(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR{ts  !cCs&|jstnt|jt@S(s)Read terminal status line: Clear To Send.(RDRRt getModemStatetMODEMSTATE_MASK_CTS(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetCTS~s cCs&|jstnt|jt@S(s*Read terminal status line: Data Set Ready.(RDRRRtMODEMSTATE_MASK_DSR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetDSRs cCs&|jstnt|jt@S(s*Read terminal status line: Ring Indicator.(RDRRRtMODEMSTATE_MASK_RI(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetRIs cCs&|jstnt|jt@S(s*Read terminal status line: Carrier Detect.(RDRRRtMODEMSTATE_MASK_CD(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetCDs cCs"t}d}zx|jdk ry|jjd}WnPtjk rPqn:tjk r}|jr|jjd|fnPnX|sPnxY|D]Q}|tkr|t krt }q|dk r|j |q|j j |q|t kr|t kr>|dk r%|j t n|j j t t}q|tkr\t}t}q|tkr|jt|d}t}q|ttttfkr|}t}q|j|t}q|tkr|j||t}qqWqWWdd|_|jr|jjdnXdS(sread loop for the socket.is!socket error in reader thread: %sNsread thread terminated(tM_NORMALRRHtrecvRER/RR)RRt M_IAC_SEENRRRtputtSBRtSEt_telnetProcessSubnegotiationRRYRZRWRXt M_NEGOTIATEt_telnetProcessCommandt_telnetNegotiateOptionRs(RtmodeR3RRtbytettelnet_command((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRrsZ                     cCs'|jr#|jjd|fndS(s1Process commands other than DO, DONT, WILL, WONT.signoring Telnet command: %rN(R)R(RR ((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs cCst}x6|jD]+}|j|kr|j|t}qqW|s|tks]|tkr|j|tkrutpxt ||j r|j j d|fqqndS(s&Process incoming DO, DONT, WILL, WONT.srejected Telnet option: %rN( RR]RR!RRWRYRRZRXR)R(RR Rtknowntitem((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs  " cCs|dd!tkr|dd!tkrtt|dkrtt|dd!|_|jr|jjd|jqq|dd!tkrt|dkrt|dd!|_|jr|jjd|jnt j d|_ q|dd!t krt |_ q|dd!tkr&t|_ qx|jjD]7}|j|dd!kr6|jt|dPq6q6W|jr|jjd|fqn#|jr|jjd |fnd S( s;Process subnegotiation, the data between IAC SB and IAC SE.iiiisNOTIFY_LINESTATE: %ssNOTIFY_MODEMSTATE: %sg333333?signoring COM_PORT_OPTION: %rsignoring subnegotiation: %rN(R[tSERVER_NOTIFY_LINESTATER2tordRmR)RtSERVER_NOTIFY_MODEMSTATERnR,RotFLOWCONTROL_SUSPENDRRptFLOWCONTROL_RESUMERRkRR'R4RR(RR3R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs,% %     cCs6|jjz|jj|Wd|jjXdS(sGinternal socket write with no data escaping. used to send telnet stuff.N(RURRHRR(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt_internal_raw_writes cCs |jtt||gdS(sSend DO, DONT, WILL, WONT.N(Rtto_bytesR(RtactionR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRstcCsI|jtt}|jtttt|gt|ttgdS(s%Subnegotiation of RFC2217 parameters.N( RRRRRRR[tlistR(RRR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR(scCs.|jd}|j||j|jdS(NR<(RkR*R1RB(RR&R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR$s  cCsG|jd}|j||jr3tjdn|j|jdS(NR=g?(RkR*R@R,R-R1RB(RR&R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR)s    cCsdS(sOcheck if server is ready to receive data. block for some time when not.N((R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytrfc2217FlowServerReady4scCs|jr|jtjkr|jr:|jjdn|jttj|j}x[tj|krtjd|jtjkr]|jr|jj dnPq]q]Wn|j dk r|jr|jjdn|j St ddS(sget last modem state (cached value. if value is "old", request a new one. this cache helps that we don't issue to many requests when e.g. all status lines, one after the other is queried by te user (getCTS, getDSR etc.)spolling modem stateg?spoll for modem state failedsusing cached modem states!remote sends no NOTIFY_MODEMSTATEN( RARoR,R)RR(tNOTIFY_MODEMSTATERBR-RRnRR.(RR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR:s       (i2iKiniiii,iXiii` ii%iKiii("R"R#R$t BAUDRATESRRxRRRJRRRR|R}RRRRzR{RRRRRrRRRRRR(RRRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR6_s@ \ ,   %          B       tSerialcBseZRS((R"R#(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRbscBseZRS((R"R#(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRfst PortManagercBsqeZdZd dZdZdZddZedZ dZ dZ d Z d Z d ZRS( sThis class manages the state of Telnet and RFC 2217. It needs a serial instance and a connection to work with. Connection is expected to implement a (thread safe) write function, that writes the string to the network.cCs||_||_||_t|_t|_d|_d|_ d|_ d|_ d|_ t |dttttttt |dttttttt |dttttttt |dttttttt |dttttttt |dtttttt|j t |d tttttt|j g|_|jr]|jjd nx9|jD].}|jtkrg|j|j|jqgqgWdS( NiiR7swe-SGAsthey-SGAs we-BINARYs they-BINARYs we-RFC2217s they-RFC2217s*requesting initial Telnet/RFC 2217 options(tserialR R)Rt_client_is_rfc2217RRRR3Rtmodemstate_masktlast_modemstatet linstate_maskR R7RWRXRYRZRR\R RVR[t _client_okR]RRRRR(Rt serial_portR R)R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRrs,          $- cCs9t|_|jr%|jjdn|jdtdS(scallback of telnet option. it gets called when option is activated. this one here is used to detect when the client agrees on RFC 2217. a flag is set so that other functions like check_modem_lines know if the client is ok.sclient accepts RFC 2217tforce_notificationN(RRR)Rtcheck_modem_lines(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs  cCs#|jjtt||gdS(sSend DO, DONT, WILL, WONT.N(R RRR(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRsRcCsL|jtt}|jjtttt|gt|tt gdS(s&Subnegotiation of RFC 2217 parameters.N( RRRR RRRR[RR(RRR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR(sc CsH|jjot|jjo$tB|jjo7tB|jjoJtB}||j p]dA}|t@rx|t O}n|t@r|t O}n|t@r|t O}n|t@r|t O}n||j ks|rD|jr||j@s|r4|jtt||j@g|jr4|jjd|fq4n|d@|_ ndS(NisNOTIFY_MODEMSTATE: %si(RRRRRRRRRRtMODEMSTATE_MASK_CTS_CHANGEtMODEMSTATE_MASK_DSR_CHANGEtMODEMSTATE_MASK_RI_CHANGEtMODEMSTATE_MASK_CD_CHANGERRR(RRR)R(RRt modemstatetdeltas((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs&8         ccs3x,|D]$}|tkr&tVtVq|VqWdS(sthis generator function is for the user. all outgoing data has to be properly escaped, so that no IAC character in the data stream messes up the Telnet state machine in the server. socket.sendall(escape(data)) N(R(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytescapes   ccsx||D]t}|jtkr^|tkr4t|_q{|jdk rV|jj|q{|Vq|jtkrM|tkr|jdk r|jj|n|Vt|_q{|tkrt|_t|_q{|t kr|j t |jd|_t|_q{|t t ttfkr4||_t|_q{|j|t|_q|jtkr|j|j|t|_qqWdS(shandle a bunch of incoming bytes. this is a generator. it will yield all characters not of interest for Telnet/RFC 2217. The idea is that the reader thread pushes data from the socket through this filter: for byte in filter(socket.recv(1024)): # do things like CR/LF conversion/whatever # and write data to the serial port serial.write(byte) (socket error handling code left as exercise for the reader) N(RRRRR3RRRRRRRRYRZRWRXRRRR(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytfilters8               cCs'|jr#|jjd|fndS(s1Process commands other than DO, DONT, WILL, WONT.signoring Telnet command: %rN(R)R(RR ((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs cCst}x6|jD]+}|j|kr|j|t}qqW|s|tks]|tkr|j|tkrutpxt ||j r|j j d|fqqndS(s&Process incoming DO, DONT, WILL, WONT.srejected Telnet option: %rN( RR]RR!RRWRYRRZRXR)R(RR RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR%s  " cCs |dd!tkr |jr6|jjd|fn|dd!tkr|jj}y&tjd|dd!\|j_WnBtk r}|jr|jj d|fn||j_n*X|jr|jj d|jjfn|j t tj d|jjq |dd!tkr|jj}y&tjd |dd !\|j_WnBtk r}|jr|jj d |fn||j_n*X|jr|jj d |jjfn|j ttj d |jjq |dd!tkr|jj}y+ttjd |dd !d|j_WnBtk rt}|jre|jj d |fn||j_n*X|jr|jj d|jjfn|j ttj d t|jjq |dd!tkr|jj}y+ttjd |dd !d|j_WnBtk rU}|jrF|jj d|fn||j_n*X|jr|jj d|jjfn|j ttj d t|jjq |dd!tkr|dd !tkr|jjr|j ttq|jj r |j tt!q|j tt"q |dd !t"kryt#|j_t#|j_ |jrf|jj dn|j tt"q |dd !tkrt$|j_|jr|jj dn|j ttq |dd !t!krt$|j_ |jr|jj dn|j tt!q |dd !t%krG|jr|jj&dqq |dd !t'kr|jj(t$|jr|jj dn|j tt'q |dd !t)kr|jj(t#|jr|jj dn|j tt)q |dd !t*kr|jr|jj&dqq |dd !t+kro|jj,t$|jr\|jj dn|j tt+q |dd !t-kr|jj,t#|jr|jj dn|j tt-q |dd !t.kr|jr|jj&dqq |dd !t/krE|jj0t$|jr2|jj dn|j tt/q |dd !t1kr |jj0t#|jr|jj dn|j tt1q q |dd!t2kr|j t3t4dgq |dd!t5kr |jr|jj dn|j6dt$q |dd!t7krF|jr:|jj dnt$|_8q |dd!t9kr|jru|jj d nt#|_8q |dd!t:krt;|dd !|_<|jr |jj d!|j<fq q |dd!t=kr% t;|dd !|_>|jr |jj d"|j>fq q |dd!t?kr_ |dd !t@kr |jjA|jrt |jj d#n|j tBt@q |dd !tCkr |jjD|jr |jj d$n|j tBtCq |dd !tEkr2 |jjA|jjD|jr |jj d%n|j tBtEq |jr |jj d&tF|dq q |jr |jj d'tF|dq n#|jr |jj&d(|fnd)S(*s;Process subnegotiation, the data between IAC SB and IAC SE.iisreceived COM_PORT_OPTION: %ris!Iisfailed to set baud rate: %sschanged baud rate: %ss!Bisfailed to set data size: %sschanged data size: %ssfailed to set parity: %sschanged parity: %ssfailed to set stop bits: %sschanged stop bits: %sschanged flow control to Nones changed flow control to XON/XOFFschanged flow control to RTS/CTSs'requested break state - not implementedschanged BREAK to activeschanged BREAK to inactives%requested DTR state - not implementedschanged DTR to activeschanged DTR to inactives%requested RTS state - not implementedschanged RTS to activeschanged RTS to inactivesrequest for modem stateRtsuspendtresumesline state mask: 0x%02xsmodem state mask: 0x%02xspurge ins purge outs purge bothsundefined PURGE_DATA: %rsundefined COM_PORT_OPTION: %rsunknown subnegotiation: %rN(GR[R)RR^RR8RtunpackRRRR(R_RR`tbytesizeRaRbR:tRFC2217_REVERSE_PARITY_MAPRcRRdtstopbitstRFC2217_REVERSE_STOPBIT_MAPReRRitSET_CONTROL_REQ_FLOW_SETTINGtxonxoffRjRtrtsctsRRRRtSET_CONTROL_REQ_BREAK_STATERRRRtSET_CONTROL_REQ_DTRRR{RtSET_CONTROL_REQ_RTSRRzRtNOTIFY_LINESTATERRRRRRpRtSET_LINESTATE_MASKRRtSET_MODEMSTATE_MASKRRgRR|RhRR}tPURGE_BOTH_BUFFERSR(RR3tbackupR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR9sF  &   % &   % +     +                                       $ $ N(R"R#R$RRRRR(RRRRRRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRms #    "  :  t__main__srfc2217://localhost:7000is%s s write... shello s read: %s (tserial.serialutilR,RRERSRQRtDEBUGtINFOtWARNINGtERRORRRRRZRYRXRWRRtNOPtDMtBRKtIPtAOtAYTtECtELtGARRVR7R\R[R^R`RbRdRiRRRRRRRgR_RaRcReRjRRtSERVER_FLOWCONTROL_SUSPENDtSERVER_FLOWCONTROL_RESUMEtSERVER_SET_LINESTATE_MASKtSERVER_SET_MODEMSTATE_MASKRhtRFC2217_ANSWER_MAPRRRRRRRRRRRRRtSET_CONTROL_REQ_FLOW_SETTING_INt"SET_CONTROL_USE_NO_FLOW_CONTROL_INt!SET_CONTROL_USE_SW_FLOW_CONTOL_INt!SET_CONTROL_USE_HW_FLOW_CONTOL_INt SET_CONTROL_USE_DCD_FLOW_CONTROLt SET_CONTROL_USE_DTR_FLOW_CONTROLt SET_CONTROL_USE_DSR_FLOW_CONTROLtLINESTATE_MASK_TIMEOUTtLINESTATE_MASK_SHIFTREG_EMPTYtLINESTATE_MASK_TRANSREG_EMPTYtLINESTATE_MASK_BREAK_DETECTtLINESTATE_MASK_FRAMING_ERRORtLINESTATE_MASK_PARTIY_ERRORtLINESTATE_MASK_OVERRUN_ERRORtLINESTATE_MASK_DATA_READYRRRRRRRRRRRt PARITY_NONEt PARITY_ODDt PARITY_EVENt PARITY_MARKt PARITY_SPACERtdictRR t STOPBITS_ONEtSTOPBITS_ONE_POINT_FIVEt STOPBITS_TWORR RRRRR R R tobjectR R%t SerialBaseR6tiot ImportErrortFileLikeRt RawIOBaseRR"tsystststdoutRtflushRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt>s(              B<     PK[U site-packages/serial/__init__.pynu[#!/usr/bin/env python # portable serial port access with python # this is a wrapper module for different platform implementations # # (C) 2001-2010 Chris Liechti # this is distributed under a free software license, see license.txt VERSION = '2.6' import sys if sys.platform == 'cli': from serial.serialcli import * else: import os # chose an implementation, depending on os if os.name == 'nt': #sys.platform == 'win32': from serial.serialwin32 import * elif os.name == 'posix': from serial.serialposix import * elif os.name == 'java': from serial.serialjava import * else: raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,)) protocol_handler_packages = [ 'serial.urlhandler', ] def serial_for_url(url, *args, **kwargs): """\ Get an instance of the Serial class, depending on port/url. The port is not opened when the keyword parameter 'do_not_open' is true, by default it is. All other parameters are directly passed to the __init__ method when the port is instantiated. The list of package names that is searched for protocol handlers is kept in ``protocol_handler_packages``. e.g. we want to support a URL ``foobar://``. A module ``my_handlers.protocol_foobar`` is provided by the user. Then ``protocol_handler_packages.append("my_handlers")`` would extend the search path so that ``serial_for_url("foobar://"))`` would work. """ # check remove extra parameter to not confuse the Serial class do_open = 'do_not_open' not in kwargs or not kwargs['do_not_open'] if 'do_not_open' in kwargs: del kwargs['do_not_open'] # the default is to use the native version klass = Serial # 'native' implementation # check port type and get class try: url_nocase = url.lower() except AttributeError: # it's not a string, use default pass else: if '://' in url_nocase: protocol = url_nocase.split('://', 1)[0] for package_name in protocol_handler_packages: module_name = '%s.protocol_%s' % (package_name, protocol,) try: handler_module = __import__(module_name) except ImportError: pass else: klass = sys.modules[module_name].Serial break else: raise ValueError('invalid URL, protocol %r not known' % (protocol,)) else: klass = Serial # 'native' implementation # instantiate and open when desired instance = klass(None, *args, **kwargs) instance.port = url if do_open: instance.open() return instance PK[c site-packages/serial/rfc2217.pycnu[ {QNc@s ddlTddlZddlZddlZddlZddlZddlZiejd6ejd6ej d6ej d6Z e dgZ e dgZe d gZe d gZe d gZe e e gZe d gZe d gZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZe dgZ e dgZ!e dgZ"e dgZ#e dgZ$e dgZ%e dgZ&e dgZ'e dgZ(e d gZ)e d!gZ*e d"gZ+e d#gZ,e d$gZ-e d%gZ.e d&gZ/e d'gZ0e d(gZ1e d)gZ2e d*gZ3e d+gZ4e d,gZ5e d-gZ6e d.gZ7e d/gZ8e d0gZ9i e.e"6e/e#6e0e$6e1e%6e2e&6e3e'6e4e(6e5e)6e6e*6e7e+6e8e,6e9e-6Z:e dgZ;e dgZ<e dgZ=e dgZ>e dgZ?e dgZ@e dgZAe dgZBe d gZCe d!gZDe d"gZEe d#gZFe d$gZGe d1gZHe d2gZIe d3gZJe d4gZKe d5gZLe d6gZMe d7gZNd8ZOd9ZPd:ZQd4ZRd ZSdZTdZUdZVd8ZWd9ZXd:ZYd4ZZd Z[dZ\dZ]dZ^e dgZ_e dgZ`e dgZaideb6dec6ded6dee6def6Zgehd;egjiDZjidek6del6dem6Znehd<enjiDZodZpdZqdZrd=Zsd>Ztd?Zud@ZvdAewfdBYZxdCewfdDYZydEezfdFYZ{yddl|Z|Wn*e}k r]dGe{e~fdHYZnXdGe{e|jfdIYZdJewfdKYZedLkrddlZedMdNZejjdOeejjdPejdQejejjdRejdejndS(Si(t*Ntdebugtinfotwarningterroriiiiiiiiiiiiiiiiiiii,iiiiiii i i i ieifigihiiijikiliminioipi iiiiiiii@i ccs!|]\}}||fVqdS(N((t.0tktv((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys sccs!|]\}}||fVqdS(N((RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys st REQUESTEDtACTIVEtINACTIVEtREALLY_INACTIVEt TelnetOptioncBs,eZdZddZdZdZRS(s@Manage a single telnet option, keeps track of DO/DONT WILL/WONT.c Cs^||_||_||_||_||_||_||_||_t|_ | |_ dS(s-Init option. :param connection: connection used to transmit answers :param name: a readable name for debug outputs :param send_yes: what to send when option is to be enabled. :param send_no: what to send when option is to be disabled. :param ack_yes: what to expect when remote agrees on option. :param ack_no: what to expect when remote disagrees on option. :param initial_state: options initialized with REQUESTED are tried to be enabled on startup. use INACTIVE for all others. N( t connectiontnametoptiontsend_yestsend_notack_yestack_notstatetFalsetactivetactivation_callback( tselfR RRRRRRt initial_stateR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt__init__s         cCsd|j|j|jfS(sString for debug outputss %s:%s(%s)(RRR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt__repr__scCs||jkr|jtkrOt|_t|_|jdk r|jqq|jtkraq|jtkrt|_|j j |j |j t|_|jdk r|jqq|jt kr|j j |j|j qtd|n||jkr|jtkr+t|_t|_q|jtkrht|_|j j |j|j t|_q|jtkrzq|jt krqtd|ndS(s^A DO/DONT/WILL/WONT was received for this option, update state and answer when needed.soption in illegal state %rN(RRRR tTrueRRtNoneR R ttelnetSendOptionRRR Rt ValueErrorRR(Rtcommand((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytprocess_incomings<        N(t__name__t __module__t__doc__RRRR!(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR s  tTelnetSubnegotiationcBsVeZdZddZdZdZdZeeZ ddZ dZ RS( sA object to handle subnegotiation of options. In this case actually sub-sub options for RFC 2217. It is used to track com port options.cCsO|dkr|}n||_||_||_d|_||_t|_dS(N(RR RRtvaluet ack_optionR R(RR RRR'((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR's      cCsd|j|jfS(sString for debug outputs.s%s:%s(RR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR0scCsa||_t|_|jj|j|j|jjr]|jjjd|j|jfndS(srequest a change of the value. a request is sent to the server. if the client needs to know if the change is performed he has to check the state of this object.sSB Requesting %s -> %rN( R&RRR trfc2217SendSubnegotiationRtloggerRR(RR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytset4s    cCs2|jtkr%td|jn|jtkS(sjcheck if answer from server has been received. when server rejects the change, raise a ValueError.s#remote rejected value for option %r(RR RRR (R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytisReady>sicCs]tj|}xFtj|krEtjd|jrPqqWtd|jdS(swait until the subnegotiation has been acknowledged or timeout. It can also throw a value error when the answer from the server does not match the value sent.g?s#timeout while waiting for option %rN(ttimetsleepR+tSerialExceptionR(Rttimeoutt timeout_time((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytwaitGs   cCsj|j|t|j kr(t|_n t|_|jjrf|jjjd|j||jfndS(scheck an incoming subnegotiation block. the parameter already has cut off the header like sub option number and com port option value.sSB Answer %s -> %r -> %sN( R&tlenR RR R R)RR(Rt suboption((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt checkAnswerSs    N( R"R#R$RRRR*R+tpropertyRR1R4(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR%#s    t RFC2217SerialcBs+eZdZd2ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZedZed Zed!Zd"Zd#Zd$Zd%Zd&Zd'Zd(Zd)Zd*Zd+Zd,d-Zd.Zd/Zd0Z d1Z!RS(3s<Serial port implementation for RFC 2217 remote serial ports.i2iKiniiii,iXiii` ii%iKiiic Cs7d|_t|_t|_d|_|jdkrBtdn|jrZtdnyWt j t j t j |_ |j j |j|j|j jt jt jdWn5tk r}d|_ td|j|fnX|j jdtj|_tj|_t|dtttttt t|dt!ttttt"g}t|d t#ttttt"t|d t$ttttt"t|d t$ttttt"t|d tttttt t|d t!ttttt"g||_%it&|dt't(d6t&|dt)t*d6t&|dt+t,d6t&|dt-t.d6|_/it&|dt0t1d6t&|dt2t3d6|_4|j4j5|j/d|_6d|_7d|_8t|_9tj:d|j;|_<|j<j=t>|j<j?d|jf|j<j@x9|j%D].}|jAt"kr"|jB|jC|jDq"q"WtEjE|j}xYtEjE|krtEjFdtGd|DtH|krjPqjqjWtd||jr|jjId|j%n|jJt>|_|jKs|jLt>|jMt>n|jN|jOdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.is.Port must be configured before it can be used.sPort is already open.isCould not open port %s: %sis we-BINARYs we-RFC2217tECHOswe-SGAsthey-SGAs they-BINARYs they-RFC2217tbaudratetdatasizetparitytstopsizetpurgetcontrolittargets&pySerial RFC 2217 reader thread for %sg?css|]}|jVqdS(N(R(Rto((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys ss9Remote does not seem to support RFC2217 or BINARY mode %rsNegotiated options: %sN(PRR)Rt_ignore_set_control_answert_poll_modem_statet_network_timeoutt_portR.t_isOpentsockettAF_INETt SOCK_STREAMt_sockettconnecttfromURLtportstrt setsockoptt IPPROTO_TCPt TCP_NODELAYt Exceptiont settimeouttQueuet _read_buffert threadingtLockt _write_lockR tBINARYtWILLtWONTtDOtDONTR tCOM_PORT_OPTIONRR7tSGAt_telnet_optionsR%t SET_BAUDRATEtSERVER_SET_BAUDRATEt SET_DATASIZEtSERVER_SET_DATASIZEt SET_PARITYtSERVER_SET_PARITYt SET_STOPSIZEtSERVER_SET_STOPSIZEt_rfc2217_port_settingst PURGE_DATAtSERVER_PURGE_DATAt SET_CONTROLtSERVER_SET_CONTROLt_rfc2217_optionstupdatet _linestatet _modemstatet_modemstate_expirest_remote_suspend_flowtThreadt_telnetReadLoopt_threadt setDaemonRtsetNametstartRRRRR,R-tsumR2Rt_reconfigurePortt_rtsctstsetRTStsetDTRt flushInputt flushOutput(Rtmsgtmandadory_optionsRR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytopenesz       $!       "      cCsG|jdkrtdn|jdk r<tdnt|jttf sud|jkoodkn rt d|jn|j dj t j d|j|j d j t j d |j|j d j t j d t|j|j d j t j d t|j|j j}|jrQ|jjd |fntj|j}xYtj|krtjdtd|Dt|krgPqgqgWtd||jr|jjd|fn|jr|jrt dn?|jr|jtn&|jr6|jt n |jt!dS(s,Set communication parameters on opened port.sCan only operate on open portss'writeTimeout is currently not supportediii sinvalid baudrate: %rR8s!IR9s!BR:R;sNegotiating settings: %sg?css|]}|jVqdS(N(R(RR?((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pys ss5Remote does not accept parameter change (RFC2217): %rsNegotiated settings: %ss-xonxoff and rtscts together are not supportedNI("RHRR.t _writeTimeouttNotImplementedErrort isinstancet _baudratetinttlongRRfR*tstructtpackt _bytesizetRFC2217_PARITY_MAPt_paritytRFC2217_STOPBIT_MAPt _stopbitstvaluesR)RR,RBR-RwR2RRyt_xonxofftrfc2217SetControltSET_CONTROL_USE_HW_FLOW_CONTROLtSET_CONTROL_USE_SW_FLOW_CONTROLtSET_CONTROL_USE_NO_FLOW_CONTROL(RtitemsR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRxs89##''  "   cCs|jr~|jrLy$|jjtj|jjWnnXd|_n|jre|jjnt |_t j dndS(s Close portg333333?N( RDRHtshutdownREt SHUT_RDWRtcloseRRstjoinRR,R-(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs     cCstddS(Ns2there is no sensible way to turn numbers into URLs(R.(Rtport((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytmakeDeviceNamescCs|jjdr"|d}nyqd|krC|jdd\}}x|jdD]}d|kr|jdd\}}nd}|dkrtjtjd|_|jjt ||jj dqY|d krt |_ qY|d kr t |_ qY|d kr)t||_qYtd |fqYWn|jd d\}}t|}d|ko~dknstdnWn#tk r}td|nX||fS(s(extract host and port from an URL strings rfc2217://i t/it=tloggingspySerial.rfc2217senabled loggingtign_set_controlt poll_modemR/sunknown option: %rt:iisport not in range 0...65535sRexpected a string in the form "[rfc2217://]:[/option[/option...]]": %sN(tlowert startswithtsplitRRt basicConfigt getLoggerR)tsetLevelt LOGGER_LEVELSRRR@RAtfloatRBRRR.(RturltoptionsRR&thostRte((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRJs8           cCs|jstn|jjS(s>Return the number of characters currently in the input buffer.(RDtportNotOpenErrorRRtqsize(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt inWaiting&s icCs|jstnt}yZxSt||krs|jdkrQtdn|j|jj t |j q!WWnt j k rnXt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.s&connection failed (reader thread died)N(RDRt bytearrayR2RsRR.tappendRRtgetRt_timeoutRQtEmptytbytes(Rtsizetdata((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytread+s  'cCs|jstn|jjzMy |jj|jttWn&t j k rj}t d|nXWd|jj Xt |S(sOutput the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.s$connection failed (socket error): %sN(RDRRUtacquireRHtsendalltreplacetIACt IAC_DOUBLEDRERR.treleaseR2(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytwrite:s   cCsI|jstn|jtx#|jjrD|jjtq"WdS(s9Clear input buffer, discarding all that is in the buffer.N(RDRtrfc2217SendPurgetPURGE_RECEIVE_BUFFERRRRRR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR|Is   cCs#|jstn|jtdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(RDRRtPURGE_TRANSMIT_BUFFER(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR}Qs g?cCs=|jstn|jttj||jtdS(sPSend break condition. Timed, returns to idle state after given duration.N(RDRtsetBreakRR,R-R(Rtduration((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt sendBreakWs    cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(sJSet break: Controls TXD. When active, to transmitting is possible.sset BREAK to %stinactiveRN(Rsactive(RDRR)RtboolRtSET_CONTROL_BREAK_ONtSET_CONTROL_BREAK_OFF(Rtlevel((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR_s  !cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(s*Set terminal status line: Request To Send.s set RTS to %sRRN(sinactivesactive(RDRR)RRRtSET_CONTROL_RTS_ONtSET_CONTROL_RTS_OFF(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRzjs  !cCsc|jstn|jr<|jjddt|n|rR|jtn |jtdS(s.Set terminal status line: Data Terminal Ready.s set DTR to %sRRN(sinactivesactive(RDRR)RRRtSET_CONTROL_DTR_ONtSET_CONTROL_DTR_OFF(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR{ts  !cCs&|jstnt|jt@S(s)Read terminal status line: Clear To Send.(RDRRt getModemStatetMODEMSTATE_MASK_CTS(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetCTS~s cCs&|jstnt|jt@S(s*Read terminal status line: Data Set Ready.(RDRRRtMODEMSTATE_MASK_DSR(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetDSRs cCs&|jstnt|jt@S(s*Read terminal status line: Ring Indicator.(RDRRRtMODEMSTATE_MASK_RI(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetRIs cCs&|jstnt|jt@S(s*Read terminal status line: Carrier Detect.(RDRRRtMODEMSTATE_MASK_CD(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytgetCDs cCs"t}d}zx|jdk ry|jjd}WnPtjk rPqn:tjk r}|jr|jjd|fnPnX|sPnxY|D]Q}|tkr|t krt }q|dk r|j |q|j j |q|t kr|t kr>|dk r%|j t n|j j t t}q|tkr\t}t}q|tkr|jt|d}t}q|ttttfkr|}t}q|j|t}q|tkr|j||t}qqWqWWdd|_|jr|jjdnXdS(sread loop for the socket.is!socket error in reader thread: %sNsread thread terminated(tM_NORMALRRHtrecvRER/RR)RRt M_IAC_SEENRRRtputtSBRtSEt_telnetProcessSubnegotiationRRYRZRWRXt M_NEGOTIATEt_telnetProcessCommandt_telnetNegotiateOptionRs(RtmodeR3RRtbytettelnet_command((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRrsZ                     cCs'|jr#|jjd|fndS(s1Process commands other than DO, DONT, WILL, WONT.signoring Telnet command: %rN(R)R(RR ((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs cCst}x6|jD]+}|j|kr|j|t}qqW|s|tks]|tkr|j|tkrutpxt ||j r|j j d|fqqndS(s&Process incoming DO, DONT, WILL, WONT.srejected Telnet option: %rN( RR]RR!RRWRYRRZRXR)R(RR Rtknowntitem((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs  " cCs|dd!tkr|dd!tkrtt|dkrtt|dd!|_|jr|jjd|jqq|dd!tkrt|dkrt|dd!|_|jr|jjd|jnt j d|_ q|dd!t krt |_ q|dd!tkr&t|_ qx|jjD]7}|j|dd!kr6|jt|dPq6q6W|jr|jjd|fqn#|jr|jjd |fnd S( s;Process subnegotiation, the data between IAC SB and IAC SE.iiiisNOTIFY_LINESTATE: %ssNOTIFY_MODEMSTATE: %sg333333?signoring COM_PORT_OPTION: %rsignoring subnegotiation: %rN(R[tSERVER_NOTIFY_LINESTATER2tordRmR)RtSERVER_NOTIFY_MODEMSTATERnR,RotFLOWCONTROL_SUSPENDRRptFLOWCONTROL_RESUMERRkRR'R4RR(RR3R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs,% %     cCs6|jjz|jj|Wd|jjXdS(sGinternal socket write with no data escaping. used to send telnet stuff.N(RURRHRR(RR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt_internal_raw_writes cCs |jtt||gdS(sSend DO, DONT, WILL, WONT.N(Rtto_bytesR(RtactionR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRstcCsI|jtt}|jtttt|gt|ttgdS(s%Subnegotiation of RFC2217 parameters.N( RRRRRRR[tlistR(RRR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR(scCs.|jd}|j||j|jdS(NR<(RkR*R1RB(RR&R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR$s  cCsG|jd}|j||jr3tjdn|j|jdS(NR=g?(RkR*R@R,R-R1RB(RR&R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR)s    cCsdS(sOcheck if server is ready to receive data. block for some time when not.N((R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytrfc2217FlowServerReady4scCs|jr|jtjkr|jr:|jjdn|jttj|j}x[tj|krtjd|jtjkr]|jr|jj dnPq]q]Wn|j dk r|jr|jjdn|j St ddS(sget last modem state (cached value. if value is "old", request a new one. this cache helps that we don't issue to many requests when e.g. all status lines, one after the other is queried by te user (getCTS, getDSR etc.)spolling modem stateg?spoll for modem state failedsusing cached modem states!remote sends no NOTIFY_MODEMSTATEN( RARoR,R)RR(tNOTIFY_MODEMSTATERBR-RRnRR.(RR0((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR:s       (i2iKiniiii,iXiii` ii%iKiii("R"R#R$t BAUDRATESRRxRRRJRRRR|R}RRRRzR{RRRRRrRRRRRR(RRRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR6_s@ \ ,   %          B       tSerialcBseZRS((R"R#(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRbscBseZRS((R"R#(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRfst PortManagercBsqeZdZd dZdZdZddZedZ dZ dZ d Z d Z d ZRS( sThis class manages the state of Telnet and RFC 2217. It needs a serial instance and a connection to work with. Connection is expected to implement a (thread safe) write function, that writes the string to the network.cCs||_||_||_t|_t|_d|_d|_ d|_ d|_ d|_ t |dttttttt |dttttttt |dttttttt |dttttttt |dttttttt |dtttttt|j t |d tttttt|j g|_|jr]|jjd nx9|jD].}|jtkrg|j|j|jqgqgWdS( NiiR7swe-SGAsthey-SGAs we-BINARYs they-BINARYs we-RFC2217s they-RFC2217s*requesting initial Telnet/RFC 2217 options(tserialR R)Rt_client_is_rfc2217RRRR3Rtmodemstate_masktlast_modemstatet linstate_maskR R7RWRXRYRZRR\R RVR[t _client_okR]RRRRR(Rt serial_portR R)R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRrs,          $- cCs9t|_|jr%|jjdn|jdtdS(scallback of telnet option. it gets called when option is activated. this one here is used to detect when the client agrees on RFC 2217. a flag is set so that other functions like check_modem_lines know if the client is ok.sclient accepts RFC 2217tforce_notificationN(RRR)Rtcheck_modem_lines(R((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs  cCs#|jjtt||gdS(sSend DO, DONT, WILL, WONT.N(R RRR(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRsRcCsL|jtt}|jjtttt|gt|tt gdS(s&Subnegotiation of RFC 2217 parameters.N( RRRR RRRR[RR(RRR&((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR(sc CsH|jjot|jjo$tB|jjo7tB|jjoJtB}||j p]dA}|t@rx|t O}n|t@r|t O}n|t@r|t O}n|t@r|t O}n||j ks|rD|jr||j@s|r4|jtt||j@g|jr4|jjd|fq4n|d@|_ ndS(NisNOTIFY_MODEMSTATE: %si(RRRRRRRRRRtMODEMSTATE_MASK_CTS_CHANGEtMODEMSTATE_MASK_DSR_CHANGEtMODEMSTATE_MASK_RI_CHANGEtMODEMSTATE_MASK_CD_CHANGERRR(RRR)R(RRt modemstatetdeltas((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs&8         ccs3x,|D]$}|tkr&tVtVq|VqWdS(sthis generator function is for the user. all outgoing data has to be properly escaped, so that no IAC character in the data stream messes up the Telnet state machine in the server. socket.sendall(escape(data)) N(R(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytescapes   ccsx||D]t}|jtkr^|tkr4t|_q{|jdk rV|jj|q{|Vq|jtkrM|tkr|jdk r|jj|n|Vt|_q{|tkrt|_t|_q{|t kr|j t |jd|_t|_q{|t t ttfkr4||_t|_q{|j|t|_q|jtkr|j|j|t|_qqWdS(shandle a bunch of incoming bytes. this is a generator. it will yield all characters not of interest for Telnet/RFC 2217. The idea is that the reader thread pushes data from the socket through this filter: for byte in filter(socket.recv(1024)): # do things like CR/LF conversion/whatever # and write data to the serial port serial.write(byte) (socket error handling code left as exercise for the reader) N(RRRRR3RRRRRRRRYRZRWRXRRRR(RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pytfilters8               cCs'|jr#|jjd|fndS(s1Process commands other than DO, DONT, WILL, WONT.signoring Telnet command: %rN(R)R(RR ((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRs cCst}x6|jD]+}|j|kr|j|t}qqW|s|tks]|tkr|j|tkrutpxt ||j r|j j d|fqqndS(s&Process incoming DO, DONT, WILL, WONT.srejected Telnet option: %rN( RR]RR!RRWRYRRZRXR)R(RR RRR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR%s  " cCs |dd!tkr |jr6|jjd|fn|dd!tkr|jj}y&tjd|dd!\|j_WnBtk r}|jr|jj d|fn||j_n*X|jr|jj d|jjfn|j t tj d|jjq |dd!tkr|jj}y&tjd |dd !\|j_WnBtk r}|jr|jj d |fn||j_n*X|jr|jj d |jjfn|j ttj d |jjq |dd!tkr|jj}y+ttjd |dd !d|j_WnBtk rt}|jre|jj d |fn||j_n*X|jr|jj d|jjfn|j ttj d t|jjq |dd!tkr|jj}y+ttjd |dd !d|j_WnBtk rU}|jrF|jj d|fn||j_n*X|jr|jj d|jjfn|j ttj d t|jjq |dd!tkr|dd !tkr|jjr|j ttq|jj r |j tt!q|j tt"q |dd !t"kryt#|j_t#|j_ |jrf|jj dn|j tt"q |dd !tkrt$|j_|jr|jj dn|j ttq |dd !t!krt$|j_ |jr|jj dn|j tt!q |dd !t%krG|jr|jj&dqq |dd !t'kr|jj(t$|jr|jj dn|j tt'q |dd !t)kr|jj(t#|jr|jj dn|j tt)q |dd !t*kr|jr|jj&dqq |dd !t+kro|jj,t$|jr\|jj dn|j tt+q |dd !t-kr|jj,t#|jr|jj dn|j tt-q |dd !t.kr|jr|jj&dqq |dd !t/krE|jj0t$|jr2|jj dn|j tt/q |dd !t1kr |jj0t#|jr|jj dn|j tt1q q |dd!t2kr|j t3t4dgq |dd!t5kr |jr|jj dn|j6dt$q |dd!t7krF|jr:|jj dnt$|_8q |dd!t9kr|jru|jj d nt#|_8q |dd!t:krt;|dd !|_<|jr |jj d!|j<fq q |dd!t=kr% t;|dd !|_>|jr |jj d"|j>fq q |dd!t?kr_ |dd !t@kr |jjA|jrt |jj d#n|j tBt@q |dd !tCkr |jjD|jr |jj d$n|j tBtCq |dd !tEkr2 |jjA|jjD|jr |jj d%n|j tBtEq |jr |jj d&tF|dq q |jr |jj d'tF|dq n#|jr |jj&d(|fnd)S(*s;Process subnegotiation, the data between IAC SB and IAC SE.iisreceived COM_PORT_OPTION: %ris!Iisfailed to set baud rate: %sschanged baud rate: %ss!Bisfailed to set data size: %sschanged data size: %ssfailed to set parity: %sschanged parity: %ssfailed to set stop bits: %sschanged stop bits: %sschanged flow control to Nones changed flow control to XON/XOFFschanged flow control to RTS/CTSs'requested break state - not implementedschanged BREAK to activeschanged BREAK to inactives%requested DTR state - not implementedschanged DTR to activeschanged DTR to inactives%requested RTS state - not implementedschanged RTS to activeschanged RTS to inactivesrequest for modem stateRtsuspendtresumesline state mask: 0x%02xsmodem state mask: 0x%02xspurge ins purge outs purge bothsundefined PURGE_DATA: %rsundefined COM_PORT_OPTION: %rsunknown subnegotiation: %rN(GR[R)RR^RR8RtunpackRRRR(R_RR`tbytesizeRaRbR:tRFC2217_REVERSE_PARITY_MAPRcRRdtstopbitstRFC2217_REVERSE_STOPBIT_MAPReRRitSET_CONTROL_REQ_FLOW_SETTINGtxonxoffRjRtrtsctsRRRRtSET_CONTROL_REQ_BREAK_STATERRRRtSET_CONTROL_REQ_DTRRR{RtSET_CONTROL_REQ_RTSRRzRtNOTIFY_LINESTATERRRRRRpRtSET_LINESTATE_MASKRRtSET_MODEMSTATE_MASKRRgRR|RhRR}tPURGE_BOTH_BUFFERSR(RR3tbackupR((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyR9sF  &   % &   % +     +                                       $ $ N(R"R#R$RRRRR(RRRRRRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyRms #    "  :  t__main__srfc2217://localhost:7000is%s s write... shello s read: %s (tserial.serialutilR,RRERSRQRtDEBUGtINFOtWARNINGtERRORRRRRZRYRXRWRRtNOPtDMtBRKtIPtAOtAYTtECtELtGARRVR7R\R[R^R`RbRdRiRRRRRRRgR_RaRcReRjRRtSERVER_FLOWCONTROL_SUSPENDtSERVER_FLOWCONTROL_RESUMEtSERVER_SET_LINESTATE_MASKtSERVER_SET_MODEMSTATE_MASKRhtRFC2217_ANSWER_MAPRRRRRRRRRRRRRtSET_CONTROL_REQ_FLOW_SETTING_INt"SET_CONTROL_USE_NO_FLOW_CONTROL_INt!SET_CONTROL_USE_SW_FLOW_CONTOL_INt!SET_CONTROL_USE_HW_FLOW_CONTOL_INt SET_CONTROL_USE_DCD_FLOW_CONTROLt SET_CONTROL_USE_DTR_FLOW_CONTROLt SET_CONTROL_USE_DSR_FLOW_CONTROLtLINESTATE_MASK_TIMEOUTtLINESTATE_MASK_SHIFTREG_EMPTYtLINESTATE_MASK_TRANSREG_EMPTYtLINESTATE_MASK_BREAK_DETECTtLINESTATE_MASK_FRAMING_ERRORtLINESTATE_MASK_PARTIY_ERRORtLINESTATE_MASK_OVERRUN_ERRORtLINESTATE_MASK_DATA_READYRRRRRRRRRRRt PARITY_NONEt PARITY_ODDt PARITY_EVENt PARITY_MARKt PARITY_SPACERtdictRR t STOPBITS_ONEtSTOPBITS_ONE_POINT_FIVEt STOPBITS_TWORR RRRRR R R tobjectR R%t SerialBaseR6tiot ImportErrortFileLikeRt RawIOBaseRR"tsystststdoutRtflushRR(((s2/usr/lib/python2.7/site-packages/serial/rfc2217.pyt>s(              B<     PK[RqD$D$"site-packages/serial/serialjava.pynu[#!jython # # Python Serial Port Extension for Win32, Linux, BSD, Jython # module for serial IO for Jython and JavaComm # see __init__.py # # (C) 2002-2008 Chris Liechti # this is distributed under a free software license, see license.txt from serial.serialutil import * def my_import(name): mod = __import__(name) components = name.split('.') for comp in components[1:]: mod = getattr(mod, comp) return mod def detect_java_comm(names): """try given list of modules and return that imports""" for name in names: try: mod = my_import(name) mod.SerialPort return mod except (ImportError, AttributeError): pass raise ImportError("No Java Communications API implementation found") # Java Communications API implementations # http://mho.republika.pl/java/comm/ comm = detect_java_comm([ 'javax.comm', # Sun/IBM 'gnu.io', # RXTX ]) def device(portnumber): """Turn a port number into a device name""" enum = comm.CommPortIdentifier.getPortIdentifiers() ports = [] while enum.hasMoreElements(): el = enum.nextElement() if el.getPortType() == comm.CommPortIdentifier.PORT_SERIAL: ports.append(el) return ports[portnumber].getName() class JavaSerial(SerialBase): """Serial port class, implemented with Java Communications API and thus usable with jython and the appropriate java extension.""" def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" if self._port is None: raise SerialException("Port must be configured before it can be used.") if self._isOpen: raise SerialException("Port is already open.") if type(self._port) == type(''): # strings are taken directly portId = comm.CommPortIdentifier.getPortIdentifier(self._port) else: portId = comm.CommPortIdentifier.getPortIdentifier(device(self._port)) # numbers are transformed to a comport id obj try: self.sPort = portId.open("python serial module", 10) except Exception, msg: self.sPort = None raise SerialException("Could not open port: %s" % msg) self._reconfigurePort() self._instream = self.sPort.getInputStream() self._outstream = self.sPort.getOutputStream() self._isOpen = True def _reconfigurePort(self): """Set communication parameters on opened port.""" if not self.sPort: raise SerialException("Can only operate on a valid port handle") self.sPort.enableReceiveTimeout(30) if self._bytesize == FIVEBITS: jdatabits = comm.SerialPort.DATABITS_5 elif self._bytesize == SIXBITS: jdatabits = comm.SerialPort.DATABITS_6 elif self._bytesize == SEVENBITS: jdatabits = comm.SerialPort.DATABITS_7 elif self._bytesize == EIGHTBITS: jdatabits = comm.SerialPort.DATABITS_8 else: raise ValueError("unsupported bytesize: %r" % self._bytesize) if self._stopbits == STOPBITS_ONE: jstopbits = comm.SerialPort.STOPBITS_1 elif stopbits == STOPBITS_ONE_POINT_FIVE: self._jstopbits = comm.SerialPort.STOPBITS_1_5 elif self._stopbits == STOPBITS_TWO: jstopbits = comm.SerialPort.STOPBITS_2 else: raise ValueError("unsupported number of stopbits: %r" % self._stopbits) if self._parity == PARITY_NONE: jparity = comm.SerialPort.PARITY_NONE elif self._parity == PARITY_EVEN: jparity = comm.SerialPort.PARITY_EVEN elif self._parity == PARITY_ODD: jparity = comm.SerialPort.PARITY_ODD elif self._parity == PARITY_MARK: jparity = comm.SerialPort.PARITY_MARK elif self._parity == PARITY_SPACE: jparity = comm.SerialPort.PARITY_SPACE else: raise ValueError("unsupported parity type: %r" % self._parity) jflowin = jflowout = 0 if self._rtscts: jflowin |= comm.SerialPort.FLOWCONTROL_RTSCTS_IN jflowout |= comm.SerialPort.FLOWCONTROL_RTSCTS_OUT if self._xonxoff: jflowin |= comm.SerialPort.FLOWCONTROL_XONXOFF_IN jflowout |= comm.SerialPort.FLOWCONTROL_XONXOFF_OUT self.sPort.setSerialPortParams(self._baudrate, jdatabits, jstopbits, jparity) self.sPort.setFlowControlMode(jflowin | jflowout) if self._timeout >= 0: self.sPort.enableReceiveTimeout(self._timeout*1000) else: self.sPort.disableReceiveTimeout() def close(self): """Close port""" if self._isOpen: if self.sPort: self._instream.close() self._outstream.close() self.sPort.close() self.sPort = None self._isOpen = False def makeDeviceName(self, port): return device(port) # - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): """Return the number of characters currently in the input buffer.""" if not self.sPort: raise portNotOpenError return self._instream.available() def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self.sPort: raise portNotOpenError read = bytearray() if size > 0: while len(read) < size: x = self._instream.read() if x == -1: if self.timeout >= 0: break else: read.append(x) return bytes(read) def write(self, data): """Output the given string over the serial port.""" if not self.sPort: raise portNotOpenError if not isinstance(data, (bytes, bytearray)): raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data))) self._outstream.write(data) return len(data) def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self.sPort: raise portNotOpenError self._instream.skip(self._instream.available()) def flushOutput(self): """Clear output buffer, aborting the current output and discarding all that is in the buffer.""" if not self.sPort: raise portNotOpenError self._outstream.flush() def sendBreak(self, duration=0.25): """Send break condition. Timed, returns to idle state after given duration.""" if not self.sPort: raise portNotOpenError self.sPort.sendBreak(duration*1000.0) def setBreak(self, level=1): """Set break: Controls TXD. When active, to transmitting is possible.""" if self.fd is None: raise portNotOpenError raise SerialException("The setBreak function is not implemented in java.") def setRTS(self, level=1): """Set terminal status line: Request To Send""" if not self.sPort: raise portNotOpenError self.sPort.setRTS(level) def setDTR(self, level=1): """Set terminal status line: Data Terminal Ready""" if not self.sPort: raise portNotOpenError self.sPort.setDTR(level) def getCTS(self): """Read terminal status line: Clear To Send""" if not self.sPort: raise portNotOpenError self.sPort.isCTS() def getDSR(self): """Read terminal status line: Data Set Ready""" if not self.sPort: raise portNotOpenError self.sPort.isDSR() def getRI(self): """Read terminal status line: Ring Indicator""" if not self.sPort: raise portNotOpenError self.sPort.isRI() def getCD(self): """Read terminal status line: Carrier Detect""" if not self.sPort: raise portNotOpenError self.sPort.isCD() # assemble Serial class with the platform specific implementation and the base # for file-like behavior. for Python 2.6 and newer, that provide the new I/O # library, derive from io.RawIOBase try: import io except ImportError: # classic version with our own file-like emulation class Serial(JavaSerial, FileLike): pass else: # io library present class Serial(JavaSerial, io.RawIOBase): pass if __name__ == '__main__': s = Serial(0, baudrate=19200, # baudrate bytesize=EIGHTBITS, # number of databits parity=PARITY_EVEN, # enable parity checking stopbits=STOPBITS_ONE, # number of stopbits timeout=3, # set a timeout value, None for waiting forever xonxoff=0, # enable software flow control rtscts=0, # enable RTS/CTS flow control ) s.setRTS(1) s.setDTR(1) s.flushInput() s.flushOutput() s.write('hello') sys.stdio.write('%r\n' % s.read(5)) sys.stdio.write('%s\n' % s.inWaiting()) del s PK[#%%"site-packages/serial/serialcli.pyonu[ {QNc@s^ddlZddlZddlZddlTdZejejZdZde fdYZ yddl Z Wn*e k rde e fdYZnXde e jfd YZed krZddlZed Zejjd eeZejjd ed e_de_ejd e_ejejjd endS(iN(t*cCstjjjj|S(s%Turn a port number into a device name(tSystemtIOtPortst SerialPortt GetPortNames(tportnum((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytdevicescCs#tg|D]}t|^q S(N(tsabtord(tstringtx((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt as_byte_arrayst IronSerialcBseZdZd%ZdZdZdZdZdZddZ dZ dZ dZ ddZ edZedZed Zd!Zd"Zd#Zd$ZRS(&s(Serial port implemenation for .NET/Mono.i2iKiniiii,iXiii` ii%iKiiicCs|jdkrtdn|jr6tdnytjjj|j|_ Wn5t k r}d|_ td|j|fnX|j |j j t |_|js|jt |jt n|j|jdS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.scould not open port %s: %sN(t_porttNonetSerialExceptiont_isOpenRRRRtportstrt _port_handlet Exceptiont_reconfigurePorttOpentTruet_rtsctstsetRTStsetDTRt flushInputt flushOutput(tselftmsg((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytopen s"        cCsw|jstdn|jd krBtjjjj|j_ nt |jd|j_ |j d krtjjjj|j_ nt |j d|j_ y|j |j_Wn%tk r}tt|nX|jtkrd|j_nm|jtkrd|j_nO|jtkr3d|j_n1|jtkrQd|j_ntd|j|jtkrttjjjd|j_n|jtkrtjjjj|j_n|jtkrtjjjj|j_ng|jt krtjjjj!|j_n=|jt"kr<tjjjj#|j_ntd |j|j$t%krytjjj&j'|j_&ng|j$t(krtjjj&j)|j_&n=|j$t*krtjjj&j+|j_&ntd |j$|j,r |j-r tjjj.j/|j_.nf|j,r1tjjj.j0|j_.nB|j-rUtjjj.j1|j_.nttjjj.d|j_.d S( s,Set communication parameters on opened port.s'Can only operate on a valid port handleiiiiis#Unsupported number of data bits: %rRsUnsupported parity mode: %rs#Unsupported number of stop bits: %rN(2RRt_timeoutRRRRRtInfiniteTimeoutt ReadTimeouttintt _writeTimeoutt WriteTimeoutt _baudratetBaudRatetIOErrort ValueErrortstrt _bytesizetFIVEBITStDataBitstSIXBITSt SEVENBITSt EIGHTBITSt_parityt PARITY_NONEtgetattrtParityt PARITY_EVENtEvent PARITY_ODDtOddt PARITY_MARKtMarkt PARITY_SPACEtSpacet _stopbitst STOPBITS_ONEtStopBitstOnetSTOPBITS_ONE_POINT_FIVEt OnePointFivet STOPBITS_TWOtTwoRt_xonxofft HandshaketRequestToSendXOnXOfft RequestToSendtXOnXOff(Rte((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyR6s\ !  cCs\|jrX|jrLy|jjWntjjjk r?nXd|_nt|_ndS(s Close portN( RRtCloseRRRtInvalidOperationExceptionRtFalse(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytcloses   cCs:yt|SWn%tk r5}tt|nXdS(N(Rt TypeErrorRR*(RtportRJ((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytmakeDeviceNamescCs|jstn|jjS(s>Return the number of characters currently in the input buffer.(RtportNotOpenErrort BytesToRead(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt inWaitings icCsp|jstnt}xH|rey|j|jjWntjk rW}PqX|d8}qWt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.i(RRRt bytearraytappendtReadByteRtTimeoutExceptiontbytes(RtsizetdataRJ((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytreads   cCs|jstnt|ttfsFtdtt|fny&|jjt|dt |Wnt j k r}t nXt |S(s-Output the given string over the serial port.s expected %s or bytearray, got %si( RRRt isinstanceRYRUROttypetWriteR tlenRRXtwriteTimeoutError(RR[RJ((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytwrites & cCs#|jstn|jjdS(s9Clear input buffer, discarding all that is in the buffer.N(RRRtDiscardInBuffer(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs cCs#|jstn|jjdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(RRRtDiscardOutBuffer(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs g?cCsG|jstnddl}t|j_|j|t|j_dS(sHSend break condition. Timed, returns to idle state after given duration.iN(RRRttimeRt BreakStatetsleepRM(RtdurationRe((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt sendBreaks     cCs(|jstnt||j_dS(sBSet break: Controls TXD. When active, to transmitting is possible.N(RRRtboolRf(Rtlevel((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytsetBreaks cCs(|jstnt||j_dS(s)Set terminal status line: Request To SendN(RRRRjt RtsEnable(RRk((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs cCs(|jstnt||j_dS(s-Set terminal status line: Data Terminal ReadyN(RRRRjt DtrEnable(RRk((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRs cCs|jstn|jjS(s(Read terminal status line: Clear To Send(RRRt CtsHolding(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetCTSs cCs|jstn|jjS(s)Read terminal status line: Data Set Ready(RRRt DsrHolding(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetDSRs cCs|jstntS(s)Read terminal status line: Ring Indicator(RRRRM(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetRIs cCs|jstn|jjS(s)Read terminal status line: Carrier Detect(RRRt CDHolding(R((s4/usr/lib/python2.7/site-packages/serial/serialcli.pytgetCDs (i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESRRRNRQRTR\RbRRRiRRlRRRpRrRsRu(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyR s(  I            tSerialcBseZRS((RvRw(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRzscBseZRS((RvRw(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyRzst__main__is%s iKi(tclrRtSystem.IO.Portstserial.serialutilRtArraytByteRR t SerialBaseR tiot ImportErrortFileLikeRzt RawIOBaseRvtsystststdioRbtbaudratetdatabitsRNRPR(((s4/usr/lib/python2.7/site-packages/serial/serialcli.pyt s0                PK[Uz!site-packages/serial/sermsdos.pyonu[ {QNc@s'ddlZddlZddlZddlZi dd6dd6dd6dd 6d d 6d d 6dd6dd6dd6Zd)\ZZZZ Z d*\Z Z Z d+\ZZZZd,\ZZZZZed#Zd$Zd%ejfd&YZed'kr#edZejj d(eefndS(-iNt11int15it30i,t60iXt12it24i` t48it96i%t19iKiiiiig?iiiitEtBtPtRtNs port not opencCs d|dS(NsCOM%di((tportnum((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytdevice?stSerialc BseZdZdeeedddedZdZ dZ dZ dZ dZ d d Zd Zd Zd ZdZd dZd dZdZdZdZdZdZRS(s port: number of device; numbering starts at zero. if everything fails, the user can specify a device string, note that this isn't portable any more baudrate: baud rate bytesize: number of databits parity: enable parity checking stopbits: number of stopbits timeout: set a timeout (None for waiting forever) xonxoff: enable software flow control rtscts: enable RTS/CTS flow control retry: DOS retry mode i%ic Cs$t|tdkr$||_nt|d|_t||_t||_|tkrkd|_n`|t krd|_nH|t krd|_n0|t krd|_n|t krd|_nt||_ | |_d|_|j|j|j|j|j|j |j|jdS( NtiR R tOtMtSs sermsdos.tmp(ttypetportstrRt BAUD_RATEStbaudtstrtbytesizet PARITY_NONEtparityt PARITY_EVENt PARITY_ODDt PARITY_MARKt PARITY_SPACEtstoptretrytfilenamet_config( tselftporttbaudrateRRtstopbitsttimeouttxonxofftrtsctsR"((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt__init__Qs(               cCs|jdS(N(tclose(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt__del__yscCsdS(N((R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyR-|sc CsPtjd|dd|d|d|d|d|d|fd }tj|dS( NsMODE t:s BAUD= s PARITY= s DATA= s STOP= s RETRY= s > R(tstringtjointostsystem( R%R&RRtdataR!R"R#t comString((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyR$s  cCs9|j|jt||j|j|j|j|jdS(N(R$RRRRR!R"R#(R%R'((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt setBaudratescCs tdS(s.returns the number of bytes waiting to be readN(tNotImplementedError(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt inWaitingsicCsBtj|jtjtjB}tj||}tj||S(sRead num bytes from serial port(R2topenRtO_RDONLYtO_BINARYtreadR-(R%tnumthandletrv((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyR<s   cCsBtj|jtjtjB}tj||}tj||S(sWrite string to serial port(R2R9RtO_WRONLYR;twriteR-(R%tsR>R?((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyRAs   cCs tdS(N(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt flushInputscCs tdS(N(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt flushOutputscCs tdS(N(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt sendBreakscCs tdS(sSet terminal status lineN(R7(R%tlevel((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytsetRTSscCs tdS(sSet terminal status lineN(R7(R%RF((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytsetDTRscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetCTSscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetDSRscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetRIscCs tdS(sEead terminal status lineN(R7(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pytgetCDsc Cs=tjd|j|j|j|j|j|j|jfdS(Ns : t ( R0R1RRRRR!R"R#(R%((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt__repr__sN(t__name__t __module__t__doc__t EIGHTBITSRt STOPBITS_ONEtNonet RETURN_RETRYR,R.R-R$R6R8R<RARCRDRERGRHRIRJRKRLRN(((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyRBs4                 t__main__s%s %s (iiiii(ig?i(iiii(R R R R R (!R2tsysR0tserial.serialutiltserialRRRRRR RStSTOPBITS_ONEANDAHALFt STOPBITS_TWOtFIVEBITStSIXBITSt SEVENBITSRRt RETURN_ERRORt RETURN_BUSYRUt RETURN_READYt RETURN_NONEt ValueErrortportNotOpenErrorRt serialutiltFileLikeRRORBtstdioRA(((s3/usr/lib/python2.7/site-packages/serial/sermsdos.pyt&s.         PK[N ''#site-packages/serial/serialjava.pycnu[ {QNc@sdddlTdZdZeddgZdZdefdYZydd lZWn*ek rd ee fd YZ nXd eej fd YZ e d kr`e dddde dededdddddZejdejdejejejdejjdejdejjdej[nd S(i(t*cCsCt|}|jd}x!|dD]}t||}q&W|S(Nt.i(t __import__tsplittgetattr(tnametmodt componentstcomp((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt my_import s  cCsVxC|D];}yt|}|j|SWqttfk rAqXqWtddS(s1try given list of modules and return that importss/No Java Communications API implementation foundN(R t SerialPortt ImportErrortAttributeError(tnamesRR((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytdetect_java_comms  s javax.commsgnu.iocCsjtjj}g}xD|jr[|j}|jtjjkr|j|qqW||jS(s%Turn a port number into a device name( tcommtCommPortIdentifiertgetPortIdentifiersthasMoreElementst nextElementt getPortTypet PORT_SERIALtappendtgetName(t portnumbertenumtportstel((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytdevice)s t JavaSerialcBseZdZdZdZdZdZdZddZdZ d Z d Z d d Z dd Z ddZddZdZdZdZdZRS(sSerial port class, implemented with Java Communications API and thus usable with jython and the appropriate java extension.cCs|jdkrtdn|jr6tdnt|jtdkritjj|j}ntjjt|j}y|j dd|_ Wn,t k r}d|_ td|nX|j |j j |_|j j|_t|_dS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.tspython serial modulei sCould not open port: %sN(t_porttNonetSerialExceptiont_isOpenttypeRRtgetPortIdentifierRtopentsPortt Exceptiont_reconfigurePorttgetInputStreamt _instreamtgetOutputStreamt _outstreamtTrue(tselftportIdtmsg((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR%8s    cCs|jstdn|jjd|jtkrFtjj}nm|jtkrdtjj }nO|jt krtjj }n1|jt krtjj }ntd|j|jtkrtjj}nOttkrtjj|_n1|jtkr tjj}ntd|j|jtkr>tjj}n|jtkr\tjj}nm|jtkrztjj}nO|jtkrtjj}n1|jtkrtjj}ntd|jd}}|jr|tjjO}|tjj O}n|j!r+|tjj"O}|tjj#O}n|jj$|j%||||jj&||B|j'dkr|jj|j'dn |jj(dS( s,Set communication parameters on opened port.s'Can only operate on a valid port handleisunsupported bytesize: %rs"unsupported number of stopbits: %rsunsupported parity type: %riiN()R&R!tenableReceiveTimeoutt _bytesizetFIVEBITSRR t DATABITS_5tSIXBITSt DATABITS_6t SEVENBITSt DATABITS_7t EIGHTBITSt DATABITS_8t ValueErrort _stopbitst STOPBITS_ONEt STOPBITS_1tstopbitstSTOPBITS_ONE_POINT_FIVEt STOPBITS_1_5t _jstopbitst STOPBITS_TWOt STOPBITS_2t_parityt PARITY_NONEt PARITY_EVENt PARITY_ODDt PARITY_MARKt PARITY_SPACEt_rtsctstFLOWCONTROL_RTSCTS_INtFLOWCONTROL_RTSCTS_OUTt_xonxofftFLOWCONTROL_XONXOFF_INtFLOWCONTROL_XONXOFF_OUTtsetSerialPortParamst _baudratetsetFlowControlModet_timeouttdisableReceiveTimeout(R.t jdatabitst jstopbitstjparitytjflowintjflowout((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR(MsT     cCsU|jrQ|jrE|jj|jj|jjd|_nt|_ndS(s Close portN(R"R&R*tcloseR,R tFalse(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR[s      cCs t|S(N(R(R.tport((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytmakeDeviceNamescCs|jstn|jjS(s>Return the number of characters currently in the input buffer.(R&tportNotOpenErrorR*t available(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt inWaitings icCs|jstnt}|dkrxWt||kr}|jj}|dkrm|jdkrzPqzq*|j|q*Wnt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.ii( R&R_t bytearraytlenR*treadttimeoutRtbytes(R.tsizeRdtx((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRds    cCs`|jstnt|ttfsFtdtt|fn|jj|t |S(s-Output the given string over the serial port.s expected %s or bytearray, got %s( R&R_t isinstanceRfRbt TypeErrorR#R,twriteRc(R.tdata((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRks  cCs/|jstn|jj|jjdS(s9Clear input buffer, discarding all that is in the buffer.N(R&R_R*tskipR`(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt flushInputs cCs#|jstn|jjdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(R&R_R,tflush(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt flushOutputs g?cCs*|jstn|jj|ddS(sHSend break condition. Timed, returns to idle state after given duration.g@@N(R&R_t sendBreak(R.tduration((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRqs cCs(|jdkrtntddS(sBSet break: Controls TXD. When active, to transmitting is possible.s1The setBreak function is not implemented in java.N(tfdR R_R!(R.tlevel((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytsetBreaks cCs&|jstn|jj|dS(s)Set terminal status line: Request To SendN(R&R_tsetRTS(R.Rt((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRvs cCs&|jstn|jj|dS(s-Set terminal status line: Data Terminal ReadyN(R&R_tsetDTR(R.Rt((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRws cCs#|jstn|jjdS(s(Read terminal status line: Clear To SendN(R&R_tisCTS(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetCTSs cCs#|jstn|jjdS(s)Read terminal status line: Data Set ReadyN(R&R_tisDSR(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetDSRs cCs#|jstn|jjdS(s)Read terminal status line: Ring IndicatorN(R&R_tisRI(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetRIs cCs#|jstn|jjdS(s)Read terminal status line: Carrier DetectN(R&R_tisCD(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetCDs (t__name__t __module__t__doc__R%R(R[R^RaRdRkRnRpRqRuRvRwRyR{R}R(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR4s$  7             NtSerialcBseZRS((RR(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRscBseZRS((RR(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRst__main__itbaudrateiKtbytesizetparityR?Reitxonxofftrtsctsithellos%r is%s (tserial.serialutilR RRRt SerialBaseRtioR tFileLikeRt RawIOBaseRR9RGR=tsRvRwRnRpRktsyststdioRdRa(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt s:              PK[@٤ site-packages/serial/sermsdos.pynu[# sermsdos.py # # History: # # 3rd September 2002 Dave Haynes # 1. First defined # # Although this code should run under the latest versions of # Python, on DOS-based platforms such as Windows 95 and 98, # it has been specifically written to be compatible with # PyDOS, available at: # http://www.python.org/ftp/python/wpy/dos.html # # PyDOS is a stripped-down version of Python 1.5.2 for # DOS machines. Therefore, in making changes to this file, # please respect Python 1.5.2 syntax. In addition, please # limit the width of this file to 60 characters. # # Note also that the modules in PyDOS contain fewer members # than other versions, so we are restricted to using the # following: # # In module os: # ------------- # environ, chdir, getcwd, getpid, umask, fdopen, close, # dup, dup2, fstat, lseek, open, read, write, O_RDONLY, # O_WRONLY, O_RDWR, O_APPEND, O_CREAT, O_EXCL, O_TRUNC, # access, F_OK, R_OK, W_OK, X_OK, chmod, listdir, mkdir, # remove, rename, renames, rmdir, stat, unlink, utime, # execl, execle, execlp, execlpe, execvp, execvpe, _exit, # system. # # In module os.path: # ------------------ # curdir, pardir, sep, altsep, pathsep, defpath, linesep. # import os import sys import string import serial.serialutil BAUD_RATES = { 110: "11", 150: "15", 300: "30", 600: "60", 1200: "12", 2400: "24", 4800: "48", 9600: "96", 19200: "19"} (PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE) = (0, 1, 2, 3, 4) (STOPBITS_ONE, STOPBITS_ONEANDAHALF, STOPBITS_TWO) = (1, 1.5, 2) FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8) (RETURN_ERROR, RETURN_BUSY, RETURN_RETRY, RETURN_READY, RETURN_NONE) = ('E', 'B', 'P', 'R', 'N') portNotOpenError = ValueError('port not open') def device(portnum): return 'COM%d' % (portnum+1) class Serial(serialutil.FileLike): """ port: number of device; numbering starts at zero. if everything fails, the user can specify a device string, note that this isn't portable any more baudrate: baud rate bytesize: number of databits parity: enable parity checking stopbits: number of stopbits timeout: set a timeout (None for waiting forever) xonxoff: enable software flow control rtscts: enable RTS/CTS flow control retry: DOS retry mode """ def __init__(self, port, baudrate = 9600, bytesize = EIGHTBITS, parity = PARITY_NONE, stopbits = STOPBITS_ONE, timeout = None, xonxoff = 0, rtscts = 0, retry = RETURN_RETRY ): if type(port) == type(''): # strings are taken directly self.portstr = port else: # numbers are transformed to a string self.portstr = device(port+1) self.baud = BAUD_RATES[baudrate] self.bytesize = str(bytesize) if parity == PARITY_NONE: self.parity = 'N' elif parity == PARITY_EVEN: self.parity = 'E' elif parity == PARITY_ODD: self.parity = 'O' elif parity == PARITY_MARK: self.parity = 'M' elif parity == PARITY_SPACE: self.parity = 'S' self.stop = str(stopbits) self.retry = retry self.filename = "sermsdos.tmp" self._config(self.portstr, self.baud, self.parity, self.bytesize, self.stop, self.retry, self.filename) def __del__(self): self.close() def close(self): pass def _config(self, port, baud, parity, data, stop, retry, filename): comString = string.join(("MODE ", port, ":" , " BAUD= ", baud, " PARITY= ", parity , " DATA= ", data, " STOP= ", stop, " RETRY= ", retry, " > ", filename ), '') os.system(comString) def setBaudrate(self, baudrate): self._config(self.portstr, BAUD_RATES[baudrate], self.parity, self.bytesize, self.stop, self.retry, self.filename) def inWaiting(self): """returns the number of bytes waiting to be read""" raise NotImplementedError def read(self, num = 1): """Read num bytes from serial port""" handle = os.open(self.portstr, os.O_RDONLY | os.O_BINARY) rv = os.read(handle, num) os.close(handle) return rv def write(self, s): """Write string to serial port""" handle = os.open(self.portstr, os.O_WRONLY | os.O_BINARY) rv = os.write(handle, s) os.close(handle) return rv def flushInput(self): raise NotImplementedError def flushOutput(self): raise NotImplementedError def sendBreak(self): raise NotImplementedError def setRTS(self,level=1): """Set terminal status line""" raise NotImplementedError def setDTR(self,level=1): """Set terminal status line""" raise NotImplementedError def getCTS(self): """Eead terminal status line""" raise NotImplementedError def getDSR(self): """Eead terminal status line""" raise NotImplementedError def getRI(self): """Eead terminal status line""" raise NotImplementedError def getCD(self): """Eead terminal status line""" raise NotImplementedError def __repr__(self): return string.join(( ": ", self.portstr , self.baud, self.parity, self.bytesize, self.stop, self.retry , self.filename), ' ') if __name__ == '__main__': s = Serial(0) sys.stdio.write('%s %s\n' % (__name__, s)) PK[kJBKBK"site-packages/serial/serialutil.pynu[#! python # Python Serial Port Extension for Win32, Linux, BSD, Jython # see __init__.py # # (C) 2001-2010 Chris Liechti # this is distributed under a free software license, see license.txt # compatibility for older Python < 2.6 try: bytes bytearray except (NameError, AttributeError): # Python older than 2.6 do not have these types. Like for Python 2.6 they # should behave like str. For Python older than 3.0 we want to work with # strings anyway, only later versions have a true bytes type. bytes = str # bytearray is a mutable type that is easily turned into an instance of # bytes class bytearray(list): # for bytes(bytearray()) usage def __str__(self): return ''.join(self) def __repr__(self): return 'bytearray(%r)' % ''.join(self) # append automatically converts integers to characters def append(self, item): if isinstance(item, str): list.append(self, item) else: list.append(self, chr(item)) # += def __iadd__(self, other): for byte in other: self.append(byte) return self def __getslice__(self, i, j): return bytearray(list.__getslice__(self, i, j)) def __getitem__(self, item): if isinstance(item, slice): return bytearray(list.__getitem__(self, item)) else: return ord(list.__getitem__(self, item)) def __eq__(self, other): if isinstance(other, basestring): other = bytearray(other) return list.__eq__(self, other) # all Python versions prior 3.x convert str([17]) to '[17]' instead of '\x11' # so a simple bytes(sequence) doesn't work for all versions def to_bytes(seq): """convert a sequence to a bytes type""" b = bytearray() for item in seq: b.append(item) # this one handles int and str return bytes(b) # create control bytes XON = to_bytes([17]) XOFF = to_bytes([19]) CR = to_bytes([13]) LF = to_bytes([10]) PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE = 'N', 'E', 'O', 'M', 'S' STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO = (1, 1.5, 2) FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS = (5, 6, 7, 8) PARITY_NAMES = { PARITY_NONE: 'None', PARITY_EVEN: 'Even', PARITY_ODD: 'Odd', PARITY_MARK: 'Mark', PARITY_SPACE: 'Space', } class SerialException(IOError): """Base class for serial port related exceptions.""" class SerialTimeoutException(SerialException): """Write timeouts give an exception""" writeTimeoutError = SerialTimeoutException("Write timeout") portNotOpenError = ValueError('Attempting to use a port that is not open') class FileLike(object): """An abstract file like class. This class implements readline and readlines based on read and writelines based on write. This class is used to provide the above functions for to Serial port objects. Note that when the serial port was opened with _NO_ timeout that readline blocks until it sees a newline (or the specified size is reached) and that readlines would never return and therefore refuses to work (it raises an exception in this case)! """ def __init__(self): self.closed = True def close(self): self.closed = True # so that ports are closed when objects are discarded def __del__(self): """Destructor. Calls close().""" # The try/except block is in case this is called at program # exit time, when it's possible that globals have already been # deleted, and then the close() call might fail. Since # there's nothing we can do about such failures and they annoy # the end users, we suppress the traceback. try: self.close() except: pass def writelines(self, sequence): for line in sequence: self.write(line) def flush(self): """flush of file like objects""" pass # iterator for e.g. "for line in Serial(0): ..." usage def next(self): line = self.readline() if not line: raise StopIteration return line def __iter__(self): return self def readline(self, size=None, eol=LF): """read a line which is terminated with end-of-line (eol) character ('\n' by default) or until timeout.""" leneol = len(eol) line = bytearray() while True: c = self.read(1) if c: line += c if line[-leneol:] == eol: break if size is not None and len(line) >= size: break else: break return bytes(line) def readlines(self, sizehint=None, eol=LF): """read a list of lines, until timeout. sizehint is ignored.""" if self.timeout is None: raise ValueError("Serial port MUST have enabled timeout for this function!") leneol = len(eol) lines = [] while True: line = self.readline(eol=eol) if line: lines.append(line) if line[-leneol:] != eol: # was the line received with a timeout? break else: break return lines def xreadlines(self, sizehint=None): """Read lines, implemented as generator. It will raise StopIteration on timeout (empty read). sizehint is ignored.""" while True: line = self.readline() if not line: break yield line # other functions of file-likes - not used by pySerial #~ readinto(b) def seek(self, pos, whence=0): raise IOError("file is not seekable") def tell(self): raise IOError("file is not seekable") def truncate(self, n=None): raise IOError("file is not seekable") def isatty(self): return False class SerialBase(object): """Serial port base class. Provides __init__ function and properties to get/set port settings.""" # default values, may be overridden in subclasses that do not support all values BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800, 500000, 576000, 921600, 1000000, 1152000, 1500000, 2000000, 2500000, 3000000, 3500000, 4000000) BYTESIZES = (FIVEBITS, SIXBITS, SEVENBITS, EIGHTBITS) PARITIES = (PARITY_NONE, PARITY_EVEN, PARITY_ODD, PARITY_MARK, PARITY_SPACE) STOPBITS = (STOPBITS_ONE, STOPBITS_ONE_POINT_FIVE, STOPBITS_TWO) def __init__(self, port = None, # number of device, numbering starts at # zero. if everything fails, the user # can specify a device string, note # that this isn't portable anymore # port will be opened if one is specified baudrate=9600, # baud rate bytesize=EIGHTBITS, # number of data bits parity=PARITY_NONE, # enable parity checking stopbits=STOPBITS_ONE, # number of stop bits timeout=None, # set a timeout value, None to wait forever xonxoff=False, # enable software flow control rtscts=False, # enable RTS/CTS flow control writeTimeout=None, # set a timeout for writes dsrdtr=False, # None: use rtscts setting, dsrdtr override if True or False interCharTimeout=None # Inter-character timeout, None to disable ): """Initialize comm port object. If a port is given, then the port will be opened immediately. Otherwise a Serial port object in closed state is returned.""" self._isOpen = False self._port = None # correct value is assigned below through properties self._baudrate = None # correct value is assigned below through properties self._bytesize = None # correct value is assigned below through properties self._parity = None # correct value is assigned below through properties self._stopbits = None # correct value is assigned below through properties self._timeout = None # correct value is assigned below through properties self._writeTimeout = None # correct value is assigned below through properties self._xonxoff = None # correct value is assigned below through properties self._rtscts = None # correct value is assigned below through properties self._dsrdtr = None # correct value is assigned below through properties self._interCharTimeout = None # correct value is assigned below through properties # assign values using get/set methods using the properties feature self.port = port self.baudrate = baudrate self.bytesize = bytesize self.parity = parity self.stopbits = stopbits self.timeout = timeout self.writeTimeout = writeTimeout self.xonxoff = xonxoff self.rtscts = rtscts self.dsrdtr = dsrdtr self.interCharTimeout = interCharTimeout if port is not None: self.open() def isOpen(self): """Check if the port is opened.""" return self._isOpen # - - - - - - - - - - - - - - - - - - - - - - - - # TODO: these are not really needed as the is the BAUDRATES etc. attribute... # maybe i remove them before the final release... def getSupportedBaudrates(self): return [(str(b), b) for b in self.BAUDRATES] def getSupportedByteSizes(self): return [(str(b), b) for b in self.BYTESIZES] def getSupportedStopbits(self): return [(str(b), b) for b in self.STOPBITS] def getSupportedParities(self): return [(PARITY_NAMES[b], b) for b in self.PARITIES] # - - - - - - - - - - - - - - - - - - - - - - - - def setPort(self, port): """Change the port. The attribute portstr is set to a string that contains the name of the port.""" was_open = self._isOpen if was_open: self.close() if port is not None: if isinstance(port, basestring): self.portstr = port else: self.portstr = self.makeDeviceName(port) else: self.portstr = None self._port = port self.name = self.portstr if was_open: self.open() def getPort(self): """Get the current port setting. The value that was passed on init or using setPort() is passed back. See also the attribute portstr which contains the name of the port as a string.""" return self._port port = property(getPort, setPort, doc="Port setting") def setBaudrate(self, baudrate): """Change baud rate. It raises a ValueError if the port is open and the baud rate is not possible. If the port is closed, then the value is accepted and the exception is raised when the port is opened.""" try: self._baudrate = int(baudrate) except TypeError: raise ValueError("Not a valid baudrate: %r" % (baudrate,)) else: if self._isOpen: self._reconfigurePort() def getBaudrate(self): """Get the current baud rate setting.""" return self._baudrate baudrate = property(getBaudrate, setBaudrate, doc="Baud rate setting") def setByteSize(self, bytesize): """Change byte size.""" if bytesize not in self.BYTESIZES: raise ValueError("Not a valid byte size: %r" % (bytesize,)) self._bytesize = bytesize if self._isOpen: self._reconfigurePort() def getByteSize(self): """Get the current byte size setting.""" return self._bytesize bytesize = property(getByteSize, setByteSize, doc="Byte size setting") def setParity(self, parity): """Change parity setting.""" if parity not in self.PARITIES: raise ValueError("Not a valid parity: %r" % (parity,)) self._parity = parity if self._isOpen: self._reconfigurePort() def getParity(self): """Get the current parity setting.""" return self._parity parity = property(getParity, setParity, doc="Parity setting") def setStopbits(self, stopbits): """Change stop bits size.""" if stopbits not in self.STOPBITS: raise ValueError("Not a valid stop bit size: %r" % (stopbits,)) self._stopbits = stopbits if self._isOpen: self._reconfigurePort() def getStopbits(self): """Get the current stop bits setting.""" return self._stopbits stopbits = property(getStopbits, setStopbits, doc="Stop bits setting") def setTimeout(self, timeout): """Change timeout setting.""" if timeout is not None: try: timeout + 1 # test if it's a number, will throw a TypeError if not... except TypeError: raise ValueError("Not a valid timeout: %r" % (timeout,)) if timeout < 0: raise ValueError("Not a valid timeout: %r" % (timeout,)) self._timeout = timeout if self._isOpen: self._reconfigurePort() def getTimeout(self): """Get the current timeout setting.""" return self._timeout timeout = property(getTimeout, setTimeout, doc="Timeout setting for read()") def setWriteTimeout(self, timeout): """Change timeout setting.""" if timeout is not None: if timeout < 0: raise ValueError("Not a valid timeout: %r" % (timeout,)) try: timeout + 1 #test if it's a number, will throw a TypeError if not... except TypeError: raise ValueError("Not a valid timeout: %r" % timeout) self._writeTimeout = timeout if self._isOpen: self._reconfigurePort() def getWriteTimeout(self): """Get the current timeout setting.""" return self._writeTimeout writeTimeout = property(getWriteTimeout, setWriteTimeout, doc="Timeout setting for write()") def setXonXoff(self, xonxoff): """Change XON/XOFF setting.""" self._xonxoff = xonxoff if self._isOpen: self._reconfigurePort() def getXonXoff(self): """Get the current XON/XOFF setting.""" return self._xonxoff xonxoff = property(getXonXoff, setXonXoff, doc="XON/XOFF setting") def setRtsCts(self, rtscts): """Change RTS/CTS flow control setting.""" self._rtscts = rtscts if self._isOpen: self._reconfigurePort() def getRtsCts(self): """Get the current RTS/CTS flow control setting.""" return self._rtscts rtscts = property(getRtsCts, setRtsCts, doc="RTS/CTS flow control setting") def setDsrDtr(self, dsrdtr=None): """Change DsrDtr flow control setting.""" if dsrdtr is None: # if not set, keep backwards compatibility and follow rtscts setting self._dsrdtr = self._rtscts else: # if defined independently, follow its value self._dsrdtr = dsrdtr if self._isOpen: self._reconfigurePort() def getDsrDtr(self): """Get the current DSR/DTR flow control setting.""" return self._dsrdtr dsrdtr = property(getDsrDtr, setDsrDtr, "DSR/DTR flow control setting") def setInterCharTimeout(self, interCharTimeout): """Change inter-character timeout setting.""" if interCharTimeout is not None: if interCharTimeout < 0: raise ValueError("Not a valid timeout: %r" % interCharTimeout) try: interCharTimeout + 1 # test if it's a number, will throw a TypeError if not... except TypeError: raise ValueError("Not a valid timeout: %r" % interCharTimeout) self._interCharTimeout = interCharTimeout if self._isOpen: self._reconfigurePort() def getInterCharTimeout(self): """Get the current inter-character timeout setting.""" return self._interCharTimeout interCharTimeout = property(getInterCharTimeout, setInterCharTimeout, doc="Inter-character timeout setting for read()") # - - - - - - - - - - - - - - - - - - - - - - - - _SETTINGS = ('baudrate', 'bytesize', 'parity', 'stopbits', 'xonxoff', 'dsrdtr', 'rtscts', 'timeout', 'writeTimeout', 'interCharTimeout') def getSettingsDict(self): """Get current port settings as a dictionary. For use with applySettingsDict""" return dict([(key, getattr(self, '_'+key)) for key in self._SETTINGS]) def applySettingsDict(self, d): """apply stored settings from a dictionary returned from getSettingsDict. it's allowed to delete keys from the dictionary. these values will simply left unchanged.""" for key in self._SETTINGS: if d[key] != getattr(self, '_'+key): # check against internal "_" value setattr(self, key, d[key]) # set non "_" value to use properties write function # - - - - - - - - - - - - - - - - - - - - - - - - def __repr__(self): """String representation of the current port settings and its state.""" return "%s(port=%r, baudrate=%r, bytesize=%r, parity=%r, stopbits=%r, timeout=%r, xonxoff=%r, rtscts=%r, dsrdtr=%r)" % ( self.__class__.__name__, id(self), self._isOpen, self.portstr, self.baudrate, self.bytesize, self.parity, self.stopbits, self.timeout, self.xonxoff, self.rtscts, self.dsrdtr, ) # - - - - - - - - - - - - - - - - - - - - - - - - # compatibility with io library def readable(self): return True def writable(self): return True def seekable(self): return False def readinto(self, b): data = self.read(len(b)) n = len(data) try: b[:n] = data except TypeError, err: import array if not isinstance(b, array.array): raise err b[:n] = array.array('b', data) return n if __name__ == '__main__': import sys s = SerialBase() sys.stdout.write('port name: %s\n' % s.portstr) sys.stdout.write('baud rates: %s\n' % s.getSupportedBaudrates()) sys.stdout.write('byte sizes: %s\n' % s.getSupportedByteSizes()) sys.stdout.write('parities: %s\n' % s.getSupportedParities()) sys.stdout.write('stop bits: %s\n' % s.getSupportedStopbits()) sys.stdout.write('%s\n' % s) PK[قg]@]@#site-packages/serial/serialwin32.pynu[#! python # Python Serial Port Extension for Win32, Linux, BSD, Jython # serial driver for win32 # see __init__.py # # (C) 2001-2011 Chris Liechti # this is distributed under a free software license, see license.txt # # Initial patch to use ctypes by Giovanni Bajo import ctypes from serial import win32 from serial.serialutil import * def device(portnum): """Turn a port number into a device name""" return 'COM%d' % (portnum+1) # numbers are transformed to a string class Win32Serial(SerialBase): """Serial port implementation for Win32 based on ctypes.""" BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200) def __init__(self, *args, **kwargs): self.hComPort = None self._rtsToggle = False SerialBase.__init__(self, *args, **kwargs) def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" if self._port is None: raise SerialException("Port must be configured before it can be used.") if self._isOpen: raise SerialException("Port is already open.") # the "\\.\COMx" format is required for devices other than COM1-COM8 # not all versions of windows seem to support this properly # so that the first few ports are used with the DOS device name port = self.portstr try: if port.upper().startswith('COM') and int(port[3:]) > 8: port = '\\\\.\\' + port except ValueError: # for like COMnotanumber pass self.hComPort = win32.CreateFile(port, win32.GENERIC_READ | win32.GENERIC_WRITE, 0, # exclusive access None, # no security win32.OPEN_EXISTING, win32.FILE_ATTRIBUTE_NORMAL | win32.FILE_FLAG_OVERLAPPED, 0) if self.hComPort == win32.INVALID_HANDLE_VALUE: self.hComPort = None # 'cause __del__ is called anyway raise SerialException("could not open port %s: %s" % (self.portstr, ctypes.WinError())) # Setup a 4k buffer win32.SetupComm(self.hComPort, 4096, 4096) # Save original timeout values: self._orgTimeouts = win32.COMMTIMEOUTS() win32.GetCommTimeouts(self.hComPort, ctypes.byref(self._orgTimeouts)) self._rtsState = win32.RTS_CONTROL_ENABLE self._dtrState = win32.DTR_CONTROL_ENABLE self._reconfigurePort() # Clear buffers: # Remove anything that was there win32.PurgeComm(self.hComPort, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT | win32.PURGE_RXCLEAR | win32.PURGE_RXABORT) self._overlappedRead = win32.OVERLAPPED() self._overlappedRead.hEvent = win32.CreateEvent(None, 1, 0, None) self._overlappedWrite = win32.OVERLAPPED() #~ self._overlappedWrite.hEvent = win32.CreateEvent(None, 1, 0, None) self._overlappedWrite.hEvent = win32.CreateEvent(None, 0, 0, None) self._isOpen = True def _reconfigurePort(self): """Set communication parameters on opened port.""" if not self.hComPort: raise SerialException("Can only operate on a valid port handle") # Set Windows timeout values # timeouts is a tuple with the following items: # (ReadIntervalTimeout,ReadTotalTimeoutMultiplier, # ReadTotalTimeoutConstant,WriteTotalTimeoutMultiplier, # WriteTotalTimeoutConstant) if self._timeout is None: timeouts = (0, 0, 0, 0, 0) elif self._timeout == 0: timeouts = (win32.MAXDWORD, 0, 0, 0, 0) else: timeouts = (0, 0, int(self._timeout*1000), 0, 0) if self._timeout != 0 and self._interCharTimeout is not None: timeouts = (int(self._interCharTimeout * 1000),) + timeouts[1:] if self._writeTimeout is None: pass elif self._writeTimeout == 0: timeouts = timeouts[:-2] + (0, win32.MAXDWORD) else: timeouts = timeouts[:-2] + (0, int(self._writeTimeout*1000)) win32.SetCommTimeouts(self.hComPort, ctypes.byref(win32.COMMTIMEOUTS(*timeouts))) win32.SetCommMask(self.hComPort, win32.EV_ERR) # Setup the connection info. # Get state and modify it: comDCB = win32.DCB() win32.GetCommState(self.hComPort, ctypes.byref(comDCB)) comDCB.BaudRate = self._baudrate if self._bytesize == FIVEBITS: comDCB.ByteSize = 5 elif self._bytesize == SIXBITS: comDCB.ByteSize = 6 elif self._bytesize == SEVENBITS: comDCB.ByteSize = 7 elif self._bytesize == EIGHTBITS: comDCB.ByteSize = 8 else: raise ValueError("Unsupported number of data bits: %r" % self._bytesize) if self._parity == PARITY_NONE: comDCB.Parity = win32.NOPARITY comDCB.fParity = 0 # Disable Parity Check elif self._parity == PARITY_EVEN: comDCB.Parity = win32.EVENPARITY comDCB.fParity = 1 # Enable Parity Check elif self._parity == PARITY_ODD: comDCB.Parity = win32.ODDPARITY comDCB.fParity = 1 # Enable Parity Check elif self._parity == PARITY_MARK: comDCB.Parity = win32.MARKPARITY comDCB.fParity = 1 # Enable Parity Check elif self._parity == PARITY_SPACE: comDCB.Parity = win32.SPACEPARITY comDCB.fParity = 1 # Enable Parity Check else: raise ValueError("Unsupported parity mode: %r" % self._parity) if self._stopbits == STOPBITS_ONE: comDCB.StopBits = win32.ONESTOPBIT elif self._stopbits == STOPBITS_ONE_POINT_FIVE: comDCB.StopBits = win32.ONE5STOPBITS elif self._stopbits == STOPBITS_TWO: comDCB.StopBits = win32.TWOSTOPBITS else: raise ValueError("Unsupported number of stop bits: %r" % self._stopbits) comDCB.fBinary = 1 # Enable Binary Transmission # Char. w/ Parity-Err are replaced with 0xff (if fErrorChar is set to TRUE) if self._rtscts: comDCB.fRtsControl = win32.RTS_CONTROL_HANDSHAKE elif self._rtsToggle: comDCB.fRtsControl = win32.RTS_CONTROL_TOGGLE else: comDCB.fRtsControl = self._rtsState if self._dsrdtr: comDCB.fDtrControl = win32.DTR_CONTROL_HANDSHAKE else: comDCB.fDtrControl = self._dtrState if self._rtsToggle: comDCB.fOutxCtsFlow = 0 else: comDCB.fOutxCtsFlow = self._rtscts comDCB.fOutxDsrFlow = self._dsrdtr comDCB.fOutX = self._xonxoff comDCB.fInX = self._xonxoff comDCB.fNull = 0 comDCB.fErrorChar = 0 comDCB.fAbortOnError = 0 comDCB.XonChar = XON comDCB.XoffChar = XOFF if not win32.SetCommState(self.hComPort, ctypes.byref(comDCB)): raise ValueError("Cannot configure port, some setting was wrong. Original message: %s" % ctypes.WinError()) #~ def __del__(self): #~ self.close() def close(self): """Close port""" if self._isOpen: if self.hComPort: # Restore original timeout values: win32.SetCommTimeouts(self.hComPort, self._orgTimeouts) # Close COM-Port: win32.CloseHandle(self.hComPort) win32.CloseHandle(self._overlappedRead.hEvent) win32.CloseHandle(self._overlappedWrite.hEvent) self.hComPort = None self._isOpen = False def makeDeviceName(self, port): return device(port) # - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): """Return the number of characters currently in the input buffer.""" flags = win32.DWORD() comstat = win32.COMSTAT() if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)): raise SerialException('call to ClearCommError failed') return comstat.cbInQue def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self.hComPort: raise portNotOpenError if size > 0: win32.ResetEvent(self._overlappedRead.hEvent) flags = win32.DWORD() comstat = win32.COMSTAT() if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)): raise SerialException('call to ClearCommError failed') if self.timeout == 0: n = min(comstat.cbInQue, size) if n > 0: buf = ctypes.create_string_buffer(n) rc = win32.DWORD() err = win32.ReadFile(self.hComPort, buf, n, ctypes.byref(rc), ctypes.byref(self._overlappedRead)) if not err and win32.GetLastError() != win32.ERROR_IO_PENDING: raise SerialException("ReadFile failed (%s)" % ctypes.WinError()) err = win32.WaitForSingleObject(self._overlappedRead.hEvent, win32.INFINITE) read = buf.raw[:rc.value] else: read = bytes() else: buf = ctypes.create_string_buffer(size) rc = win32.DWORD() err = win32.ReadFile(self.hComPort, buf, size, ctypes.byref(rc), ctypes.byref(self._overlappedRead)) if not err and win32.GetLastError() != win32.ERROR_IO_PENDING: raise SerialException("ReadFile failed (%s)" % ctypes.WinError()) err = win32.GetOverlappedResult(self.hComPort, ctypes.byref(self._overlappedRead), ctypes.byref(rc), True) read = buf.raw[:rc.value] else: read = bytes() return bytes(read) def write(self, data): """Output the given string over the serial port.""" if not self.hComPort: raise portNotOpenError #~ if not isinstance(data, (bytes, bytearray)): #~ raise TypeError('expected %s or bytearray, got %s' % (bytes, type(data))) # convert data (needed in case of memoryview instance: Py 3.1 io lib), ctypes doesn't like memoryview data = bytes(data) if data: #~ win32event.ResetEvent(self._overlappedWrite.hEvent) n = win32.DWORD() err = win32.WriteFile(self.hComPort, data, len(data), ctypes.byref(n), self._overlappedWrite) if not err and win32.GetLastError() != win32.ERROR_IO_PENDING: raise SerialException("WriteFile failed (%s)" % ctypes.WinError()) if self._writeTimeout != 0: # if blocking (None) or w/ write timeout (>0) # Wait for the write to complete. #~ win32.WaitForSingleObject(self._overlappedWrite.hEvent, win32.INFINITE) err = win32.GetOverlappedResult(self.hComPort, self._overlappedWrite, ctypes.byref(n), True) if n.value != len(data): raise writeTimeoutError return n.value else: return 0 def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self.hComPort: raise portNotOpenError win32.PurgeComm(self.hComPort, win32.PURGE_RXCLEAR | win32.PURGE_RXABORT) def flushOutput(self): """Clear output buffer, aborting the current output and discarding all that is in the buffer.""" if not self.hComPort: raise portNotOpenError win32.PurgeComm(self.hComPort, win32.PURGE_TXCLEAR | win32.PURGE_TXABORT) def sendBreak(self, duration=0.25): """Send break condition. Timed, returns to idle state after given duration.""" if not self.hComPort: raise portNotOpenError import time win32.SetCommBreak(self.hComPort) time.sleep(duration) win32.ClearCommBreak(self.hComPort) def setBreak(self, level=1): """Set break: Controls TXD. When active, to transmitting is possible.""" if not self.hComPort: raise portNotOpenError if level: win32.SetCommBreak(self.hComPort) else: win32.ClearCommBreak(self.hComPort) def setRTS(self, level=1): """Set terminal status line: Request To Send""" if not self.hComPort: raise portNotOpenError if level: self._rtsState = win32.RTS_CONTROL_ENABLE win32.EscapeCommFunction(self.hComPort, win32.SETRTS) else: self._rtsState = win32.RTS_CONTROL_DISABLE win32.EscapeCommFunction(self.hComPort, win32.CLRRTS) def setDTR(self, level=1): """Set terminal status line: Data Terminal Ready""" if not self.hComPort: raise portNotOpenError if level: self._dtrState = win32.DTR_CONTROL_ENABLE win32.EscapeCommFunction(self.hComPort, win32.SETDTR) else: self._dtrState = win32.DTR_CONTROL_DISABLE win32.EscapeCommFunction(self.hComPort, win32.CLRDTR) def _GetCommModemStatus(self): stat = win32.DWORD() win32.GetCommModemStatus(self.hComPort, ctypes.byref(stat)) return stat.value def getCTS(self): """Read terminal status line: Clear To Send""" if not self.hComPort: raise portNotOpenError return win32.MS_CTS_ON & self._GetCommModemStatus() != 0 def getDSR(self): """Read terminal status line: Data Set Ready""" if not self.hComPort: raise portNotOpenError return win32.MS_DSR_ON & self._GetCommModemStatus() != 0 def getRI(self): """Read terminal status line: Ring Indicator""" if not self.hComPort: raise portNotOpenError return win32.MS_RING_ON & self._GetCommModemStatus() != 0 def getCD(self): """Read terminal status line: Carrier Detect""" if not self.hComPort: raise portNotOpenError return win32.MS_RLSD_ON & self._GetCommModemStatus() != 0 # - - platform specific - - - - def setXON(self, level=True): """Platform specific - set flow state.""" if not self.hComPort: raise portNotOpenError if level: win32.EscapeCommFunction(self.hComPort, win32.SETXON) else: win32.EscapeCommFunction(self.hComPort, win32.SETXOFF) def outWaiting(self): """return how many characters the in the outgoing buffer""" flags = win32.DWORD() comstat = win32.COMSTAT() if not win32.ClearCommError(self.hComPort, ctypes.byref(flags), ctypes.byref(comstat)): raise SerialException('call to ClearCommError failed') return comstat.cbOutQue # functions useful for RS-485 adapters def setRtsToggle(self, rtsToggle): """Change RTS toggle control setting.""" self._rtsToggle = rtsToggle if self._isOpen: self._reconfigurePort() def getRtsToggle(self): """Get the current RTS toggle control setting.""" return self._rtsToggle rtsToggle = property(getRtsToggle, setRtsToggle, doc="RTS toggle control setting") # assemble Serial class with the platform specific implementation and the base # for file-like behavior. for Python 2.6 and newer, that provide the new I/O # library, derive from io.RawIOBase try: import io except ImportError: # classic version with our own file-like emulation class Serial(Win32Serial, FileLike): pass else: # io library present class Serial(Win32Serial, io.RawIOBase): pass # Nur Testfunktion!! if __name__ == '__main__': s = Serial(0) sys.stdout.write("%s\n" % s) s = Serial() sys.stdout.write("%s\n" % s) s.baudrate = 19200 s.databits = 7 s.close() s.port = 0 s.open() sys.stdout.write("%s\n" % s) PK[LOyy!site-packages/serial/__init__.pyonu[ -Nc@sdZddlZejdkr.ddlTnvddlZejdkrVddlTnNejdkrrddlTn2ejdkrddlTne dejfd gZ d Z dS( s2.6iNtcli(t*tnttposixtjavas;Sorry: no implementation for your platform ('%s') availablesserial.urlhandlerc Osd|kp|d }d|kr-|d=nt}y|j}Wntk rVnXd|kr|jddd}xotD]K}d||f}yt|} Wntk rqXtj|j}PqWt d|fnt}|d||} || _ |r| j n| S(s Get an instance of the Serial class, depending on port/url. The port is not opened when the keyword parameter 'do_not_open' is true, by default it is. All other parameters are directly passed to the __init__ method when the port is instantiated. The list of package names that is searched for protocol handlers is kept in ``protocol_handler_packages``. e.g. we want to support a URL ``foobar://``. A module ``my_handlers.protocol_foobar`` is provided by the user. Then ``protocol_handler_packages.append("my_handlers")`` would extend the search path so that ``serial_for_url("foobar://"))`` would work. t do_not_opens://iis%s.protocol_%ss"invalid URL, protocol %r not knownN( tSerialtlowertAttributeErrortsplittprotocol_handler_packagest __import__t ImportErrortsystmodulest ValueErrortNonetporttopen( turltargstkwargstdo_opentklasst url_nocasetprotocolt package_namet module_namethandler_moduletinstance((s3/usr/lib/python2.7/site-packages/serial/__init__.pytserial_for_url s2       ( tVERSIONR tplatformtserial.serialclitostnametserial.serialwin32tserial.serialposixtserial.serialjavaR R R(((s3/usr/lib/python2.7/site-packages/serial/__init__.pyt s       PK[zلUUsite-packages/serial/win32.pycnu[ aUNcR@s0 ddlTddlmZddlmZddlmZiZededZ>ee>_ee7ge>_edj?Z?ee?_ee9ge?_edj@Z@ee@_eege@_dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJdZKdZLdZMdZNdZOdZPdZQdZRdZSdZTdZUdZVdZWdZXdZYd ZZdZ[d Z\d!Z]d"Z^dZ_d#Z`d!Zad$Zbd%ZcdZddZedZfdZgdZhd&ZidZjdZkdZld'Zmd(Znd)Zod&Zpd)Zqd"Zrd*esfd+YZtd,efd-YZud.efd/efgeu_ve+Zwd0get_xd0eufd1ewfget_vd0ge_xd2efd3efd0etfd4efge_vd5efd6e.fd7efge_vd8edfd9edfd:edfd;edfd<edfd=edfd>edfd?ed@fdAefdBefg e _vdCefdDefdEedfdFedfdGedfdHedfdIedfdJedfdKedfdLedfdMedfdNedfdOedfdPedfdQedfdRedSfdTefdUefdVefdWe fdXe fdYe fdZeyfd[eyfd\eyfd]eyfd^eyfd_efge"_vd`efdaefdbefdcefddefge$_vdedfdgdhddidjdkdldmd*dndodpdqdrdsddtdd dudvdwdxdydzd{d|d}d~ddddddddddddddddd ddddddddddddddddddddddddddddd,dddddgRZzdS(i(t*(tHANDLE(tBOOL(tLPCWSTRtkernel32(tDWORD(tWORD(tBYTEcCsttttkS(s,Returns true when running on a 64 bit system(tsizeoftc_ulongtc_void_p(((s0/usr/lib/python2.7/site-packages/serial/win32.pytis_64bitst_SECURITY_ATTRIBUTEScBseZRS((t__name__t __module__(((s0/usr/lib/python2.7/site-packages/serial/win32.pyR s(tLPCSTRt _OVERLAPPEDcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyR:st_COMSTATcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyR>st_DCBcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRBst _COMMTIMEOUTScBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRFsiiiiiiii iiii@iliiii@liitN11_OVERLAPPED4DOLLAR_48EcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRst#N11_OVERLAPPED4DOLLAR_484DOLLAR_49EcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRstOffsett OffsetHight_0tPointertInternalt InternalHighthEventtnLengthtlpSecurityDescriptortbInheritHandletfCtsHoldtfDsrHoldt fRlsdHoldt fXoffHoldt fXoffSenttfEoftfTximt fReserveditcbInQuetcbOutQuet DCBlengthtBaudRatetfBinarytfParityt fOutxCtsFlowt fOutxDsrFlowt fDtrControltfDsrSensitivitytfTXContinueOnXofftfOutXtfInXt fErrorChartfNullt fRtsControlt fAbortOnErrortfDummy2it wReservedtXonLimtXoffLimtByteSizetParitytStopBitstXonChartXoffChart ErrorChartEofChartEvtChart wReserved1tReadIntervalTimeouttReadTotalTimeoutMultipliertReadTotalTimeoutConstanttWriteTotalTimeoutMultipliertWriteTotalTimeoutConstantt GetLastErrort MS_CTS_ONtFILE_ATTRIBUTE_NORMALtDTR_CONTROL_ENABLEt MS_RLSD_ONtGetOverlappedResulttSETXONt PURGE_TXABORTt PurgeCommtEV_RINGt ONESTOPBITtSETXOFFt PURGE_RXABORTt GetCommStatetRTS_CONTROL_ENABLEt CreateEventtEV_DSRtEV_PERRt EV_RXFLAGt OPEN_EXISTINGtDCBtFILE_FLAG_OVERLAPPEDtEV_CTSt SetupCommt LPOVERLAPPEDt EV_TXEMPTYtClearCommBreaktLPSECURITY_ATTRIBUTESt SetCommBreaktSetCommTimeoutst COMMTIMEOUTSt ODDPARITYtEV_RLSDtGetCommModemStatust EV_EVENT2t PURGE_TXCLEARtEV_BREAKt EVENPARITYtLPCVOIDtCOMSTATtReadFiletPVOIDt WriteFiletGetCommTimeoutst ResetEventt EV_RXCHARt LPCOMSTATtClearCommErrortERROR_IO_PENDINGtEscapeCommFunctiont GENERIC_READtRTS_CONTROL_HANDSHAKEt OVERLAPPEDtDTR_CONTROL_HANDSHAKEt PURGE_RXCLEARt GENERIC_WRITEtLPDCBt CreateEventWt SetCommMaskt EV_EVENT1t SetCommStatetLPVOIDt CreateFileWtLPDWORDt EV_RX80FULLt TWOSTOPBITStLPCOMMTIMEOUTStMAXDWORDt MS_DSR_ONt MS_RING_ONtEV_ERRt ULONG_PTRt CreateFiletNOPARITYt CloseHandleN({tctypestctypes.wintypesRRRt_stdcall_librariestWinDLLRRRtvaluetINVALID_HANDLE_VALUER tc_int64RR t StructureR tPOINTERRfRtAttributeErrorRt CreateEventAtrestypetargtypesRZt CreateFileARRRRRRrRR_RRiRKRcRRPRwR RqRuRRsRReRyRzRbR|RlRRXRRvRSRgRRRhtWaitForSingleObjectRURt ONE5STOPBITSRRjRpt MARKPARITYt SPACEPARITYR~tRTS_CONTROL_DISABLERYtRTS_CONTROL_TOGGLEtSETRTStCLRRTSRtDTR_CONTROL_DISABLERNtSETDTRtCLRDTRRRTR\RRVRxRRnR`R[RRkR{RLRRRWRMRRRQR^RRdR]ROR}RmRaRoRtINFINITEtUnionRRt_fields_Rtt _anonymous_tc_chart__all__(((s0/usr/lib/python2.7/site-packages/serial/win32.pyts                                                                                                                                   PK[ g5P5P#site-packages/serial/serialutil.pycnu[ [;Nc@s5y eeWn3eefk rAeZdefdYZnXdZedgZedgZedgZ edgZ ddd d d f\Z Z Z ZZd d df\ZZZddddf\ZZZZide 6de 6de 6de6de6ZdefdYZdefdYZedZedZdefdYZd efd!YZ e!d"kr1d#d$l"Z"e Z#e"j$j%d%e#j&e"j$j%d&e#j'e"j$j%d'e#j(e"j$j%d(e#j)e"j$j%d)e#j*e"j$j%d*e#nd$S(+t bytearraycBsGeZdZdZdZdZdZdZdZRS(cCs dj|S(Nt(tjoin(tself((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__str__scCsddj|S(Ns bytearray(%r)R(R(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__repr__scCs<t|tr"tj||ntj|t|dS(N(t isinstancetstrtlisttappendtchr(Rtitem((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR scCs"x|D]}|j|qW|S(N(R (Rtothertbyte((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__iadd__s cCsttj|||S(N(RRt __getslice__(Rtitj((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR#scCs?t|tr%ttj||Sttj||SdS(N(RtsliceRRt __getitem__tord(RR ((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR&scCs.t|trt|}ntj||S(N(Rt basestringRRt__eq__(RR ((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR,s( t__name__t __module__RRR RRRR(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyRs      cCs1t}x|D]}|j|qWt|S(s"convert a sequence to a bytes type(RR tbytes(tseqtbR ((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytto_bytes3s  iii i tNtEtOtMtSig?iiiiitNonetEventOddtMarktSpacetSerialExceptioncBseZdZRS(s.Base class for serial port related exceptions.(RRt__doc__(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR'OstSerialTimeoutExceptioncBseZdZRS(s Write timeouts give an exception(RRR((((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR)Sss Write timeouts)Attempting to use a port that is not opentFileLikecBseZdZdZdZdZdZdZdZdZ de dZ de d Z dd Zd d Zd ZddZdZRS(sAn abstract file like class. This class implements readline and readlines based on read and writelines based on write. This class is used to provide the above functions for to Serial port objects. Note that when the serial port was opened with _NO_ timeout that readline blocks until it sees a newline (or the specified size is reached) and that readlines would never return and therefore refuses to work (it raises an exception in this case)! cCs t|_dS(N(tTruetclosed(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__init__iscCs t|_dS(N(R+R,(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytcloselscCsy|jWnnXdS(sDestructor. Calls close().N(R.(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__del__pscCs"x|D]}|j|qWdS(N(twrite(Rtsequencetline((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt writelines|s cCsdS(sflush of file like objectsN((R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytflushscCs|j}|stn|S(N(treadlinet StopIteration(RR2((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytnexts  cCs|S(N((R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt__iter__scCst|}t}xdtr{|jd}|rw||7}|| |krRPn|dk rxt||krxPqxqPqWt|S(skread a line which is terminated with end-of-line (eol) character (' ' by default) or until timeout.iN(tlenRR+treadR"R(RtsizeteoltleneolR2tc((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR5s    cCs|jdkrtdnt|}g}xHtrz|jd|}|rv|j||| |krwPqwq3Pq3W|S(sAread a list of lines, until timeout. sizehint is ignored.s8Serial port MUST have enabled timeout for this function!R<N(ttimeoutR"t ValueErrorR9R+R5R (RtsizehintR<R=tlinesR2((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt readliness   ccs,x%tr'|j}|sPn|VqWdS(swRead lines, implemented as generator. It will raise StopIteration on timeout (empty read). sizehint is ignored.N(R+R5(RRAR2((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt xreadliness   icCstddS(Nsfile is not seekable(tIOError(Rtpostwhence((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytseekscCstddS(Nsfile is not seekable(RE(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyttellscCstddS(Nsfile is not seekable(RE(Rtn((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyttruncatescCstS(N(tFalse(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytisattysN(RRR(R-R.R/R3R4R7R8R"tLFR5RCRDRHRIRKRM(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR*[s          t SerialBasecBseZdZdXZeeeefZe e e e e fZeeefZdYd ee edYeedYedYd Zd Zd!Zd"Zd#Zd$Zd%Zd&Zeeed'd(Zd)Zd*Z ee ed'd+Z!d,Z"d-Z#ee#e"d'd.Z$d/Z%d0Z&ee&e%d'd1Z'd2Z(d3Z)ee)e(d'd4Z*d5Z+d6Z,ee,e+d'd7Z-d8Z.d9Z/ee/e.d'd:Z0d;Z1d<Z2ee2e1d'd=Z3d>Z4d?Z5ee5e4d'd@Z6dYdAZ7dBZ8ee8e7dCZ9dDZ:dEZ;ee;e:d'dFZ<dZZ=dQZ>dRZ?dSZ@dTZAdUZBdVZCdWZDRS([sbSerial port base class. Provides __init__ function and properties to get/set port settings.i2iKiniiii,iXiii` ii%iKiiiiii iii@Bii`ii%&i-ig5i =c Cst|_d|_d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ ||_||_||_||_||_||_| |_||_||_| |_| |_|dk r|jndS(sInitialize comm port object. If a port is given, then the port will be opened immediately. Otherwise a Serial port object in closed state is returned.N(RLt_isOpenR"t_portt _baudratet _bytesizet_parityt _stopbitst_timeoutt _writeTimeoutt_xonxofft_rtsctst_dsrdtrt_interCharTimeouttporttbaudratetbytesizetparitytstopbitsR?t writeTimeouttxonxofftrtsctstdsrdtrtinterCharTimeouttopen( RR\R]R^R_R`R?RbRcRaRdRe((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyR-s2                        cCs|jS(sCheck if the port is opened.(RP(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytisOpenscCs&g|jD]}t||f^q S(N(t BAUDRATESR(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedBaudratesscCs&g|jD]}t||f^q S(N(t BYTESIZESR(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedByteSizesscCs&g|jD]}t||f^q S(N(tSTOPBITSR(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedStopbitsscCs$g|jD]}t||f^q S(N(tPARITIESt PARITY_NAMES(RR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSupportedParitiesscCs|j}|r|jn|dk rXt|trC||_qa|j||_n d|_||_|j|_|r|j ndS(shChange the port. The attribute portstr is set to a string that contains the name of the port.N( RPR.R"RRtportstrtmakeDeviceNameRQtnameRf(RR\twas_open((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytsetPorts       cCs|jS(sGet the current port setting. The value that was passed on init or using setPort() is passed back. See also the attribute portstr which contains the name of the port as a string.(RQ(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetPort/stdocs Port settingcCsTyt||_Wn$tk r9td|fnX|jrP|jndS(sChange baud rate. It raises a ValueError if the port is open and the baud rate is not possible. If the port is closed, then the value is accepted and the exception is raised when the port is opened.sNot a valid baudrate: %rN(tintRRt TypeErrorR@RPt_reconfigurePort(RR]((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setBaudrate8s   cCs|jS(s"Get the current baud rate setting.(RR(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getBaudrateCssBaud rate settingcCsH||jkr%td|fn||_|jrD|jndS(sChange byte size.sNot a valid byte size: %rN(RjR@RSRPRz(RR^((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setByteSizeJs   cCs|jS(s"Get the current byte size setting.(RS(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getByteSizePssByte size settingcCsH||jkr%td|fn||_|jrD|jndS(sChange parity setting.sNot a valid parity: %rN(RnR@RTRPRz(RR_((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setParityWs   cCs|jS(sGet the current parity setting.(RT(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getParity]ssParity settingcCsH||jkr%td|fn||_|jrD|jndS(sChange stop bits size.sNot a valid stop bit size: %rN(RlR@RURPRz(RR`((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setStopbitsds   cCs|jS(s"Get the current stop bits setting.(RU(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getStopbitsjssStop bits settingcCs|dk rdy |dWn$tk r>td|fnX|dkrdtd|fqdn||_|jr|jndS(sChange timeout setting.isNot a valid timeout: %riN(R"RyR@RVRPRz(RR?((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setTimeoutqs      cCs|jS(s Get the current timeout setting.(RV(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getTimeout|ssTimeout setting for read()cCs|dk ra|dkr.td|fny |dWqatk r]td|qaXn||_|jr|jndS(sChange timeout setting.isNot a valid timeout: %riN(R"R@RyRWRPRz(RR?((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytsetWriteTimeouts      cCs|jS(s Get the current timeout setting.(RW(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetWriteTimeoutssTimeout setting for write()cCs#||_|jr|jndS(sChange XON/XOFF setting.N(RXRPRz(RRb((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setXonXoffs  cCs|jS(s!Get the current XON/XOFF setting.(RX(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getXonXoffssXON/XOFF settingcCs#||_|jr|jndS(s$Change RTS/CTS flow control setting.N(RYRPRz(RRc((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setRtsCtss  cCs|jS(s-Get the current RTS/CTS flow control setting.(RY(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getRtsCtsssRTS/CTS flow control settingcCs>|dkr|j|_n ||_|jr:|jndS(s#Change DsrDtr flow control setting.N(R"RYRZRPRz(RRd((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt setDsrDtrs    cCs|jS(s-Get the current DSR/DTR flow control setting.(RZ(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt getDsrDtrssDSR/DTR flow control settingcCs|dk r^|dkr+td|ny |dWq^tk rZtd|q^Xn||_|jr}|jndS(s'Change inter-character timeout setting.isNot a valid timeout: %riN(R"R@RyR[RPRz(RRe((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytsetInterCharTimeouts      cCs|jS(s0Get the current inter-character timeout setting.(R[(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetInterCharTimeoutss*Inter-character timeout setting for read()R]R^R_R`RbRdRcR?RaRecCs3tg|jD]}|t|d|f^q S(sQGet current port settings as a dictionary. For use with applySettingsDictt_(tdictt _SETTINGStgetattr(Rtkey((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytgetSettingsDictscCsLxE|jD]:}||t|d|kr t||||q q WdS(sapply stored settings from a dictionary returned from getSettingsDict. it's allowed to delete keys from the dictionary. these values will simply left unchanged.RN(RRtsetattr(RtdR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytapplySettingsDictsc CsVd|jjt||j|j|j|j|j|j|j |j |j |j f S(sAString representation of the current port settings and its state.s}%s(port=%r, baudrate=%r, bytesize=%r, parity=%r, stopbits=%r, timeout=%r, xonxoff=%r, rtscts=%r, dsrdtr=%r)( t __class__RtidRPRqR]R^R_R`R?RbRcRd(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyRs  cCstS(N(R+(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytreadablescCstS(N(R+(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytwritablescCstS(N(RL(R((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytseekablescCs|jt|}t|}y|||*WnPtk r}ddl}t||jsh|n|jd|||*nX|S(NiR(R:R9RytarrayR(RRtdataRJterrR((s5/usr/lib/python2.7/site-packages/serial/serialutil.pytreadintos   (i2iKiniiii,iXiii` ii%iKiiiiii iii@Bii`ii%&i-ig5i =N( sbaudratesbytesizesparitysstopbitssxonxoffsdsrdtrsrtsctsstimeouts writeTimeoutsinterCharTimeout(ERRR(RhtFIVEBITStSIXBITSt SEVENBITSt EIGHTBITSRjt PARITY_NONEt PARITY_EVENt PARITY_ODDt PARITY_MARKt PARITY_SPACERnt STOPBITS_ONEtSTOPBITS_ONE_POINT_FIVEt STOPBITS_TWORlR"RLR-RgRiRkRmRpRuRvtpropertyR\R{R|R]R}R~R^RRR_RRR`RRR?RRRaRRRbRRRcRRRdRRReRRRRRRRR(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyROs #                          t__main__iNsport name: %s sbaud rates: %s sbyte sizes: %s sparities: %s sstop bits: %s s%s (+RRt NameErrortAttributeErrorRRRtXONtXOFFtCRRNRRRRRRRRRRRRRoRER'R)twriteTimeoutErrorR@tportNotOpenErrortobjectR*RORtsystststdoutR0RqRiRkRpRm(((s5/usr/lib/python2.7/site-packages/serial/serialutil.pyt sF $   m@   PK[zلUUsite-packages/serial/win32.pyonu[ aUNcR@s0 ddlTddlmZddlmZddlmZiZededZ>ee>_ee7ge>_edj?Z?ee?_ee9ge?_edj@Z@ee@_eege@_dZAdZBdZCdZDdZEdZFdZGdZHdZIdZJdZKdZLdZMdZNdZOdZPdZQdZRdZSdZTdZUdZVdZWdZXdZYd ZZdZ[d Z\d!Z]d"Z^dZ_d#Z`d!Zad$Zbd%ZcdZddZedZfdZgdZhd&ZidZjdZkdZld'Zmd(Znd)Zod&Zpd)Zqd"Zrd*esfd+YZtd,efd-YZud.efd/efgeu_ve+Zwd0get_xd0eufd1ewfget_vd0ge_xd2efd3efd0etfd4efge_vd5efd6e.fd7efge_vd8edfd9edfd:edfd;edfd<edfd=edfd>edfd?ed@fdAefdBefg e _vdCefdDefdEedfdFedfdGedfdHedfdIedfdJedfdKedfdLedfdMedfdNedfdOedfdPedfdQedfdRedSfdTefdUefdVefdWe fdXe fdYe fdZeyfd[eyfd\eyfd]eyfd^eyfd_efge"_vd`efdaefdbefdcefddefge$_vdedfdgdhddidjdkdldmd*dndodpdqdrdsddtdd dudvdwdxdydzd{d|d}d~ddddddddddddddddd ddddddddddddddddddddddddddddd,dddddgRZzdS(i(t*(tHANDLE(tBOOL(tLPCWSTRtkernel32(tDWORD(tWORD(tBYTEcCsttttkS(s,Returns true when running on a 64 bit system(tsizeoftc_ulongtc_void_p(((s0/usr/lib/python2.7/site-packages/serial/win32.pytis_64bitst_SECURITY_ATTRIBUTEScBseZRS((t__name__t __module__(((s0/usr/lib/python2.7/site-packages/serial/win32.pyR s(tLPCSTRt _OVERLAPPEDcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyR:st_COMSTATcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyR>st_DCBcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRBst _COMMTIMEOUTScBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRFsiiiiiiii iiii@iliiii@liitN11_OVERLAPPED4DOLLAR_48EcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRst#N11_OVERLAPPED4DOLLAR_484DOLLAR_49EcBseZRS((R R(((s0/usr/lib/python2.7/site-packages/serial/win32.pyRstOffsett OffsetHight_0tPointertInternalt InternalHighthEventtnLengthtlpSecurityDescriptortbInheritHandletfCtsHoldtfDsrHoldt fRlsdHoldt fXoffHoldt fXoffSenttfEoftfTximt fReserveditcbInQuetcbOutQuet DCBlengthtBaudRatetfBinarytfParityt fOutxCtsFlowt fOutxDsrFlowt fDtrControltfDsrSensitivitytfTXContinueOnXofftfOutXtfInXt fErrorChartfNullt fRtsControlt fAbortOnErrortfDummy2it wReservedtXonLimtXoffLimtByteSizetParitytStopBitstXonChartXoffChart ErrorChartEofChartEvtChart wReserved1tReadIntervalTimeouttReadTotalTimeoutMultipliertReadTotalTimeoutConstanttWriteTotalTimeoutMultipliertWriteTotalTimeoutConstantt GetLastErrort MS_CTS_ONtFILE_ATTRIBUTE_NORMALtDTR_CONTROL_ENABLEt MS_RLSD_ONtGetOverlappedResulttSETXONt PURGE_TXABORTt PurgeCommtEV_RINGt ONESTOPBITtSETXOFFt PURGE_RXABORTt GetCommStatetRTS_CONTROL_ENABLEt CreateEventtEV_DSRtEV_PERRt EV_RXFLAGt OPEN_EXISTINGtDCBtFILE_FLAG_OVERLAPPEDtEV_CTSt SetupCommt LPOVERLAPPEDt EV_TXEMPTYtClearCommBreaktLPSECURITY_ATTRIBUTESt SetCommBreaktSetCommTimeoutst COMMTIMEOUTSt ODDPARITYtEV_RLSDtGetCommModemStatust EV_EVENT2t PURGE_TXCLEARtEV_BREAKt EVENPARITYtLPCVOIDtCOMSTATtReadFiletPVOIDt WriteFiletGetCommTimeoutst ResetEventt EV_RXCHARt LPCOMSTATtClearCommErrortERROR_IO_PENDINGtEscapeCommFunctiont GENERIC_READtRTS_CONTROL_HANDSHAKEt OVERLAPPEDtDTR_CONTROL_HANDSHAKEt PURGE_RXCLEARt GENERIC_WRITEtLPDCBt CreateEventWt SetCommMaskt EV_EVENT1t SetCommStatetLPVOIDt CreateFileWtLPDWORDt EV_RX80FULLt TWOSTOPBITStLPCOMMTIMEOUTStMAXDWORDt MS_DSR_ONt MS_RING_ONtEV_ERRt ULONG_PTRt CreateFiletNOPARITYt CloseHandleN({tctypestctypes.wintypesRRRt_stdcall_librariestWinDLLRRRtvaluetINVALID_HANDLE_VALUER tc_int64RR t StructureR tPOINTERRfRtAttributeErrorRt CreateEventAtrestypetargtypesRZt CreateFileARRRRRRrRR_RRiRKRcRRPRwR RqRuRRsRReRyRzRbR|RlRRXRRvRSRgRRRhtWaitForSingleObjectRURt ONE5STOPBITSRRjRpt MARKPARITYt SPACEPARITYR~tRTS_CONTROL_DISABLERYtRTS_CONTROL_TOGGLEtSETRTStCLRRTSRtDTR_CONTROL_DISABLERNtSETDTRtCLRDTRRRTR\RRVRxRRnR`R[RRkR{RLRRRWRMRRRQR^RRdR]ROR}RmRaRoRtINFINITEtUnionRRt_fields_Rtt _anonymous_tc_chart__all__(((s0/usr/lib/python2.7/site-packages/serial/win32.pyts                                                                                                                                   PK[0!77$site-packages/serial/serialwin32.pycnu[ {QNc@s1ddlZddlmZddlTdZdefdYZyddlZWn*ek rdee fdYZ nXdeej fd YZ e d kr-e d Z ejjd e e Z ejjd e d e _de _e jd e _e jejjd e ndS(iN(twin32(t*cCs d|dS(s%Turn a port number into a device namesCOM%di((tportnum((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytdevicest Win32SerialcBs eZdZd-ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZddZdd Zdd!Zd"Zd#Zd$Zd%Zd&Zed'Zd(Zd)Zd*Zeeed+d,ZRS(.s5Serial port implementation for Win32 based on ctypes.i2iKiniiii,iXiii` ii%iKiiicOs)d|_t|_tj|||dS(N(tNonethComPorttFalset _rtsTogglet SerialBaset__init__(tselftargstkwargs((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyR s  c Cs|jd krtdn|jr6tdn|j}y<|jjdrzt|ddkrzd|}nWntk rnXt j |t j t j Bdd t j t jt jBd|_|jt jkrd |_td|jtjfnt j|jd d t j|_t j|jtj|jt j|_t j|_|jt j|jt jt j Bt j!Bt j"Bt j#|_$t j%d d dd |j$_&t j#|_'t j%d ddd |j'_&t(|_d S( sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.tCOMiis\\.\iscould not open port %s: %siiN()t_portRtSerialExceptiont_isOpentportstrtuppert startswithtintt ValueErrorRt CreateFilet GENERIC_READt GENERIC_WRITEt OPEN_EXISTINGtFILE_ATTRIBUTE_NORMALtFILE_FLAG_OVERLAPPEDRtINVALID_HANDLE_VALUEtctypestWinErrort SetupCommt COMMTIMEOUTSt _orgTimeoutstGetCommTimeoutstbyreftRTS_CONTROL_ENABLEt _rtsStatetDTR_CONTROL_ENABLEt _dtrStatet_reconfigurePortt PurgeCommt PURGE_TXCLEARt PURGE_TXABORTt PURGE_RXCLEARt PURGE_RXABORTt OVERLAPPEDt_overlappedReadt CreateEventthEventt_overlappedWritetTrue(R tport((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytopen!sB  +      "    cCs^|jstdn|jdkr0d}nL|jdkrZtjddddf}n"ddt|jdddf}|jdkr|jdk rt|jdf|d}n|jdkrnJ|jdkr|d dtjf}n!|d dt|jdf}tj |jt j tj |tj |jtjtj}tj|jt j ||j|_|jtkrd|_nd|jtkrd|_nI|jtkrd|_n.|jtkrd |_ntd |j|jtkr,tj|_d|_n|jtkrStj |_d|_n|jt!krztj"|_d|_na|jt#krtj$|_d|_n:|jt%krtj&|_d|_ntd |j|j't(krtj)|_*nO|j't+krtj,|_*n1|j't-kr5tj.|_*ntd |j'd|_/|j0ritj1|_2n$|j3rtj4|_2n |j5|_2|j6rtj7|_8n |j9|_8|j3rd|_:n |j0|_:|j6|_;|j<|_=|j<|_>d|_?d|_@d|_AtB|_CtD|_EtjF|jt j |sZtd t jGndS(s,Set communication parameters on opened port.s'Can only operate on a valid port handleiiiiiiiis#Unsupported number of data bits: %rsUnsupported parity mode: %rs#Unsupported number of stop bits: %rsCCannot configure port, some setting was wrong. Original message: %sN(iiiii(HRRt_timeoutRRtMAXDWORDRt_interCharTimeoutt _writeTimeouttSetCommTimeoutsRR$R!t SetCommMasktEV_ERRtDCBt GetCommStatet _baudratetBaudRatet _bytesizetFIVEBITStByteSizetSIXBITSt SEVENBITSt EIGHTBITSRt_parityt PARITY_NONEtNOPARITYtParitytfParityt PARITY_EVENt EVENPARITYt PARITY_ODDt ODDPARITYt PARITY_MARKt MARKPARITYt PARITY_SPACEt SPACEPARITYt _stopbitst STOPBITS_ONEt ONESTOPBITtStopBitstSTOPBITS_ONE_POINT_FIVEt ONE5STOPBITSt STOPBITS_TWOt TWOSTOPBITStfBinaryt_rtsctstRTS_CONTROL_HANDSHAKEt fRtsControlRtRTS_CONTROL_TOGGLER&t_dsrdtrtDTR_CONTROL_HANDSHAKEt fDtrControlR(t fOutxCtsFlowt fOutxDsrFlowt_xonxofftfOutXtfInXtfNullt fErrorChart fAbortOnErrortXONtXonChartXOFFtXoffChart SetCommStateR(R ttimeoutstcomDCB((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyR)Vs  "!!%                                 cCsz|jrv|jrjtj|j|jtj|jtj|jjtj|jjd|_nt |_ndS(s Close portN( RRRR;R"t CloseHandleR0R2R3RR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytcloses   cCs t|S(N(R(R R5((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytmakeDeviceNamescCsXtj}tj}tj|jtj|tj|sQtdn|jS(s>Return the number of characters currently in the input buffer.scall to ClearCommError failed( RtDWORDtCOMSTATtClearCommErrorRRR$RtcbInQue(R tflagstcomstat((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt inWaitings   *ic CsE|jstn|dkr2tj|jjtj}tj}tj|jt j |t j |st dn|j dkrlt |j|}|dkr`t j|}tj}tj|j||t j |t j |j}| r2tjtjkr2t dt jntj|jjtj}|j|j }q/t}q;t j|}tj}tj|j||t j |t j |j}| rtjtjkrt dt jntj|jt j |jt j |t}|j|j }n t}t|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.iscall to ClearCommError failedsReadFile failed (%s)(RtportNotOpenErrorRt ResetEventR0R2RwRxRyRR$RttimeouttminRztcreate_string_buffertReadFilet GetLastErrortERROR_IO_PENDINGRtWaitForSingleObjecttINFINITEtrawtvaluetbytestGetOverlappedResultR4( R tsizeR{R|tntbuftrcterrtread((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRs8    *  3  30 cCs|jstnt|}|rtj}tj|j|t|tj||j }| rtj tj krt dtj n|jdkrtj|j|j tj|t}|jt|krtqn|jSdSdS(s-Output the given string over the serial port.sWriteFile failed (%s)iN(RR~RRRwt WriteFiletlenRR$R3RRRRR:RR4RtwriteTimeoutError(R tdataRR((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytwrites   0' cCs3|jstntj|jtjtjBdS(s9Clear input buffer, discarding all that is in the buffer.N(RR~RR*R-R.(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt flushInputs cCs3|jstntj|jtjtjBdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(RR~RR*R+R,(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt flushOutputs g?cCsO|jstnddl}tj|j|j|tj|jdS(sHSend break condition. Timed, returns to idle state after given duration.iN(RR~ttimeRt SetCommBreaktsleeptClearCommBreak(R tdurationR((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt sendBreaks    cCs?|jstn|r+tj|jntj|jdS(sBSet break: Controls TXD. When active, to transmitting is possible.N(RR~RRR(R tlevel((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetBreak's  cCsc|jstn|r=tj|_tj|jtjn"tj|_tj|jtjdS(s)Set terminal status line: Request To SendN( RR~RR%R&tEscapeCommFunctiontSETRTStRTS_CONTROL_DISABLEtCLRRTS(R R((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetRTS/s   cCsc|jstn|r=tj|_tj|jtjn"tj|_tj|jtjdS(s-Set terminal status line: Data Terminal ReadyN( RR~RR'R(RtSETDTRtDTR_CONTROL_DISABLEtCLRDTR(R R((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetDTR9s   cCs/tj}tj|jtj||jS(N(RRwtGetCommModemStatusRRR$R(R tstat((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt_GetCommModemStatusCs cCs)|jstntj|j@dkS(s(Read terminal status line: Clear To Sendi(RR~Rt MS_CTS_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetCTSHs cCs)|jstntj|j@dkS(s)Read terminal status line: Data Set Readyi(RR~Rt MS_DSR_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetDSRMs cCs)|jstntj|j@dkS(s)Read terminal status line: Ring Indicatori(RR~Rt MS_RING_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetRIRs cCs)|jstntj|j@dkS(s)Read terminal status line: Carrier Detecti(RR~Rt MS_RLSD_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetCDWs cCsK|jstn|r1tj|jtjntj|jtjdS(s#Platform specific - set flow state.N(RR~RRtSETXONtSETXOFF(R R((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetXON^s  cCsXtj}tj}tj|jtj|tj|sQtdn|jS(s5return how many characters the in the outgoing bufferscall to ClearCommError failed( RRwRxRyRRR$RtcbOutQue(R R{R|((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt outWaitingfs   *cCs#||_|jr|jndS(s"Change RTS toggle control setting.N(RRR)(R t rtsToggle((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt setRtsToggleos  cCs|jS(s+Get the current RTS toggle control setting.(R(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt getRtsToggletstdocsRTS toggle control setting(i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESR R6R)RuRvR}RRRRRRRRRRRRRR4RRRRtpropertyR(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRs6  5 i   #             tSerialcBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRscBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRst__main__is%s iKi(RtserialRtserial.serialutilRR Rtiot ImportErrortFileLikeRt RawIOBaseRtstsyststdoutRtbaudratetdatabitsRuR5R6(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt s*   i         PK[ؐ'site-packages/serial/tools/__init__.pycnu[ ApMc@sdS(N((((s9/usr/lib/python2.7/site-packages/serial/tools/__init__.pytsPK[e1site-packages/serial/tools/list_ports_windows.pyonu[ Nc @s@ddlZddlZdZddlZddlmZmZddlmZddlm Z ddlm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZdZejZejZejZeje ZZejZZejeZe ZeZ dZ!dZ"dej#fdYZ$dej#fdYZ%eje%Z&dej#fdYZ'eje'Z(ejZ)ej*j+dZ,e,j-Z-ege-_.e e-_/e,j0Z1eje$ee e ge1_.ee1_/ee1_2e,j3Z3ee&eje$e e(ge3_.e e3_/e,j4Z5ee(e)e ee&ge5_.e e5_/e,j6Z7ee&e eee ege7_.e e7_/e,j8Z8ee&e e e e ge8_.ee8_/ej*j+dZ9e9j:Z:ege:_.e e:_/e9j;Z<eeeeeege<_.e e<_/e$dddeddddddd d!d"Z=d#Z>d$Z?dZ@d%ZAd&ZBd'ZCd(ZDd&ZEd&ZFd)ZGd&ZHejId*d+d,d-d.d/d0d1gZJd2ZKeLd3kr<ddlZx5eMeKD]!\ZNZOZPd4eNeOePfGHqWndS(5iNcCs|dkrtjn|S(Ni(tctypestWinError(tvaluetfunct arguments((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyt ValidHandles (t ULONG_PTRtis_64bit(tHANDLE(tBOOL(tHWND(tDWORD(tWORD(tLONG(tULONG(tLPCSTR(tHKEY(tBYTEicCs t|S(sGet a buffer for a string(R(tlength((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyt byte_buffer#scCsKg}x5|D]-}|dkr#Pn|jt|d@q Wdj|S(Niit(tappendtchrtjoin(tbuffertstc((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pytstring's   tGUIDcBs?eZdefdefdefdedfgZdZRS(tData1tData2tData3tData4ic Csnd|j|j|jdjg|jd D]}d|^q)djg|jdD]}d|^qSfS(Ns{%08x-%04x-%04x-%s-%s}Ris%02x(RRRRR (tselftd((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyt__str__6s *(t__name__t __module__R R Rt_fields_R#(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR/s    tSP_DEVINFO_DATAcBs;eZdefdefdefdefgZdZRS(tcbSizet ClassGuidtDevInsttReservedcCsd|j|jfS(NsClassGuid:%s DevInst:%s(R)R*(R!((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR#Fs(R$R%R RRR&R#(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR'?s    tSP_DEVICE_INTERFACE_DATAcBs;eZdefdefdefdefgZdZRS(R(tInterfaceClassGuidtFlagsR+cCsd|j|jfS(NsInterfaceClassGuid:%s Flags:%s(R-R.(R!((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR#Qs(R$R%R RRR&R#(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR,Js    tsetupapitAdvapi32lQ iiiiii>i0iisiiizii iiiPioiritiNiaimiec #sttjtd tttB}xtdD]}t }tj ||_ t |d tjt|tj|stj tkrtjnPntt|tj|d dtjd stj tkrtjqndtjffdY}|}tr6d|_ n d|_ t}tj ||_ t|tj|tj|d tj|stjntd}t|tj|td tj|tj |dd s t tkr tjq ntd}t|tj|td tj|tj |dd sptj tkr d }q q/t|tj|tdtt} td} ttj | } t| t d d tj| tj| t!| t"| t"|t"|fVq/Wt#|d S( sRThis generator scans the device registry for com ports and yields port, desc, hwidiit!SP_DEVICE_INTERFACE_DETAIL_DATA_Acs=eZdefdejejefgZdZRS(R(t DevicePathcSsd|jfS(Ns DevicePath:%s(R2(R!((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR#s( R$R%R tCHARRRtsizeofR&R#((tdwNeeded(sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR1s #iiiiN($tSetupDiGetClassDevsRtbyreftGUID_CLASS_COMPORTtNonetNULLt DIGCF_PRESENTtDIGCF_DEVICEINTERFACEtrangeR,R4R(tSetupDiEnumDeviceInterfacest GetLastErrortERROR_NO_MORE_ITEMSRR tSetupDiGetDeviceInterfaceDetailtERROR_INSUFFICIENT_BUFFERt StructureRR'Rt SetupDiGetDeviceRegistryPropertytSPDRP_HARDWAREIDtSPDRP_FRIENDLYNAMEtSetupDiOpenDevRegKeytDICS_FLAG_GLOBALt DIREG_DEVtKEY_READRtRegQueryValueExtPortNamet RegCloseKeyRtSetupDiDestroyDeviceInfoList( tg_hditdwIndextdidR1tiddtdevinfot szHardwareIDtszFriendlyNamet port_namethkeytport_name_buffertport_name_length((R5sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pytcomportssH" * -     6 = = $ + $t__main__s %s: %s [%s](QRtreRtserialt serial.win32RRtctypes.wintypesRR R R R R RRRRR:tc_void_ptHDEVINFOtc_char_ptPCTSTRtc_charR3tPOINTERtLPDWORDtPDWORDtLPBYTEtPBYTEtPHKEYt ACCESS_MASKtREGSAMRRRCRR'tPSP_DEVINFO_DATAR,tPSP_DEVICE_INTERFACE_DATAt PSP_DEVICE_INTERFACE_DETAIL_DATAtwindllt LoadLibraryR/RNtargtypestrestypetSetupDiGetClassDevsAR6terrcheckR>t SetupDiGetDeviceInterfaceDetailARAt!SetupDiGetDeviceRegistryPropertyARDRGtadvapi32RMtRegQueryValueExARKR8R;R<tINVALID_HANDLE_VALUERBRERFR@RHRIRJtREG_SZtto_bytesRLRZR$tsortedtporttdescthwid(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyts                    !             (' @  PK[-.site-packages/serial/tools/list_ports_posix.pynu[import glob import sys import os import re try: import subprocess except ImportError: def popen(argv): try: si, so = os.popen4(' '.join(argv)) return so.read().strip() except: raise IOError('lsusb failed') else: def popen(argv): try: return subprocess.check_output(argv, stderr=subprocess.STDOUT).strip() except: raise IOError('lsusb failed') # The comports function is expected to return an iterable that yields tuples of # 3 strings: port name, human readable description and a hardware ID. # # as currently no method is known to get the second two strings easily, they # are currently just identical to the port name. # try to detect the OS so that a device can be selected... plat = sys.platform.lower() def read_line(filename): """help function to read a single line from a file. returns none""" try: f = open(filename) line = f.readline().strip() f.close() return line except IOError: return None def re_group(regexp, text): """search for regexp in text, return 1st group on match""" m = re.search(regexp, text) if m: return m.group(1) if plat[:5] == 'linux': # Linux (confirmed) # try to extract descriptions from sysfs. this was done by experimenting, # no guarantee that it works for all devices or in the future... def usb_sysfs_hw_string(sysfs_path): """given a path to a usb device in sysfs, return a string describing it""" bus, dev = os.path.basename(os.path.realpath(sysfs_path)).split('-') snr = read_line(sysfs_path+'/serial') if snr: snr_txt = ' SNR=%s' % (snr,) else: snr_txt = '' return 'USB VID:PID=%s:%s%s' % ( read_line(sysfs_path+'/idVendor'), read_line(sysfs_path+'/idProduct'), snr_txt ) def usb_lsusb_string(sysfs_path): bus, dev = os.path.basename(os.path.realpath(sysfs_path)).split('-') try: desc = popen(['lsusb', '-v', '-s', '%s:%s' % (bus, dev)]) # descriptions from device iManufacturer = re_group('iManufacturer\s+\w+ (.+)', desc) iProduct = re_group('iProduct\s+\w+ (.+)', desc) iSerial = re_group('iSerial\s+\w+ (.+)', desc) or '' # descriptions from kernel idVendor = re_group('idVendor\s+0x\w+ (.+)', desc) idProduct = re_group('idProduct\s+0x\w+ (.+)', desc) # create descriptions. prefer text from device, fall back to the others return '%s %s %s' % (iManufacturer or idVendor, iProduct or idProduct, iSerial) except IOError: return base def describe(device): """\ Get a human readable description. For USB-Serial devices try to run lsusb to get a human readable description. For USB-CDC devices read the description from sysfs. """ base = os.path.basename(device) # USB-Serial devices sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base) if os.path.exists(sys_dev_path): sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path))) return usb_lsusb_string(sys_usb) # USB-CDC devices sys_dev_path = '/sys/class/tty/%s/device/interface' % (base,) if os.path.exists(sys_dev_path): return read_line(sys_dev_path) return base def hwinfo(device): """Try to get a HW identification using sysfs""" base = os.path.basename(device) if os.path.exists('/sys/class/tty/%s/device' % (base,)): # PCI based devices sys_id_path = '/sys/class/tty/%s/device/id' % (base,) if os.path.exists(sys_id_path): return read_line(sys_id_path) # USB-Serial devices sys_dev_path = '/sys/class/tty/%s/device/driver/%s' % (base, base) if os.path.exists(sys_dev_path): sys_usb = os.path.dirname(os.path.dirname(os.path.realpath(sys_dev_path))) return usb_sysfs_hw_string(sys_usb) # USB-CDC devices if base.startswith('ttyACM'): sys_dev_path = '/sys/class/tty/%s/device' % (base,) if os.path.exists(sys_dev_path): return usb_sysfs_hw_string(sys_dev_path + '/..') return 'n/a' # XXX directly remove these from the list? def comports(): devices = glob.glob('/dev/ttyS*') + glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') return [(d, describe(d), hwinfo(d)) for d in devices] elif plat == 'cygwin': # cygwin/win32 def comports(): devices = glob.glob('/dev/com*') return [(d, d, d) for d in devices] elif plat == 'openbsd3': # BSD def comports(): devices = glob.glob('/dev/ttyp*') return [(d, d, d) for d in devices] elif plat[:3] == 'bsd' or \ plat[:7] == 'freebsd' or \ plat[:7] == 'openbsd': # BSD def comports(): devices = glob.glob('/dev/cuad*') return [(d, d, d) for d in devices] elif plat[:6] == 'darwin': # OS X (confirmed) def comports(): """scan for available ports. return a list of device names.""" devices = glob.glob('/dev/tty.*') return [(d, d, d) for d in devices] elif plat[:6] == 'netbsd': # NetBSD def comports(): """scan for available ports. return a list of device names.""" devices = glob.glob('/dev/dty*') return [(d, d, d) for d in devices] elif plat[:4] == 'irix': # IRIX def comports(): """scan for available ports. return a list of device names.""" devices = glob.glob('/dev/ttyf*') return [(d, d, d) for d in devices] elif plat[:2] == 'hp': # HP-UX (not tested) def comports(): """scan for available ports. return a list of device names.""" devices = glob.glob('/dev/tty*p0') return [(d, d, d) for d in devices] elif plat[:5] == 'sunos': # Solaris/SunOS def comports(): """scan for available ports. return a list of device names.""" devices = glob.glob('/dev/tty*c') return [(d, d, d) for d in devices] elif plat[:3] == 'aix': # AIX def comports(): """scan for available ports. return a list of device names.""" devices = glob.glob('/dev/tty*') return [(d, d, d) for d in devices] else: # platform detection has failed... sys.stderr.write("""\ don't know how to enumerate ttys on this system. ! I you know how the serial ports are named send this information to ! the author of this module: sys.platform = %r os.name = %r pySerial version = %s also add the naming scheme of the serial ports and with a bit luck you can get this module running... """ % (sys.platform, os.name, serial.VERSION)) raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,)) # test if __name__ == '__main__': for port, desc, hwid in sorted(comports()): print "%s: %s [%s]" % (port, desc, hwid) PK[e1site-packages/serial/tools/list_ports_windows.pycnu[ Nc @s@ddlZddlZdZddlZddlmZmZddlmZddlm Z ddlm Z ddlm Z ddlm Z dd lm Z dd lmZdd lmZdd lmZdd lmZdZejZejZejZeje ZZejZZejeZe ZeZ dZ!dZ"dej#fdYZ$dej#fdYZ%eje%Z&dej#fdYZ'eje'Z(ejZ)ej*j+dZ,e,j-Z-ege-_.e e-_/e,j0Z1eje$ee e ge1_.ee1_/ee1_2e,j3Z3ee&eje$e e(ge3_.e e3_/e,j4Z5ee(e)e ee&ge5_.e e5_/e,j6Z7ee&e eee ege7_.e e7_/e,j8Z8ee&e e e e ge8_.ee8_/ej*j+dZ9e9j:Z:ege:_.e e:_/e9j;Z<eeeeeege<_.e e<_/e$dddeddddddd d!d"Z=d#Z>d$Z?dZ@d%ZAd&ZBd'ZCd(ZDd&ZEd&ZFd)ZGd&ZHejId*d+d,d-d.d/d0d1gZJd2ZKeLd3kr<ddlZx5eMeKD]!\ZNZOZPd4eNeOePfGHqWndS(5iNcCs|dkrtjn|S(Ni(tctypestWinError(tvaluetfunct arguments((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyt ValidHandles (t ULONG_PTRtis_64bit(tHANDLE(tBOOL(tHWND(tDWORD(tWORD(tLONG(tULONG(tLPCSTR(tHKEY(tBYTEicCs t|S(sGet a buffer for a string(R(tlength((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyt byte_buffer#scCsKg}x5|D]-}|dkr#Pn|jt|d@q Wdj|S(Niit(tappendtchrtjoin(tbuffertstc((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pytstring's   tGUIDcBs?eZdefdefdefdedfgZdZRS(tData1tData2tData3tData4ic Csnd|j|j|jdjg|jd D]}d|^q)djg|jdD]}d|^qSfS(Ns{%08x-%04x-%04x-%s-%s}Ris%02x(RRRRR (tselftd((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyt__str__6s *(t__name__t __module__R R Rt_fields_R#(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR/s    tSP_DEVINFO_DATAcBs;eZdefdefdefdefgZdZRS(tcbSizet ClassGuidtDevInsttReservedcCsd|j|jfS(NsClassGuid:%s DevInst:%s(R)R*(R!((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR#Fs(R$R%R RRR&R#(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR'?s    tSP_DEVICE_INTERFACE_DATAcBs;eZdefdefdefdefgZdZRS(R(tInterfaceClassGuidtFlagsR+cCsd|j|jfS(NsInterfaceClassGuid:%s Flags:%s(R-R.(R!((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR#Qs(R$R%R RRR&R#(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR,Js    tsetupapitAdvapi32lQ iiiiii>i0iisiiizii iiiPioiritiNiaimiec #sttjtd tttB}xtdD]}t }tj ||_ t |d tjt|tj|stj tkrtjnPntt|tj|d dtjd stj tkrtjqndtjffdY}|}tr6d|_ n d|_ t}tj ||_ t|tj|tj|d tj|stjntd}t|tj|td tj|tj |dd s t tkr tjq ntd}t|tj|td tj|tj |dd sptj tkr d }q q/t|tj|tdtt} td} ttj | } t| t d d tj| tj| t!| t"| t"|t"|fVq/Wt#|d S( sRThis generator scans the device registry for com ports and yields port, desc, hwidiit!SP_DEVICE_INTERFACE_DETAIL_DATA_Acs=eZdefdejejefgZdZRS(R(t DevicePathcSsd|jfS(Ns DevicePath:%s(R2(R!((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR#s( R$R%R tCHARRRtsizeofR&R#((tdwNeeded(sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyR1s #iiiiN($tSetupDiGetClassDevsRtbyreftGUID_CLASS_COMPORTtNonetNULLt DIGCF_PRESENTtDIGCF_DEVICEINTERFACEtrangeR,R4R(tSetupDiEnumDeviceInterfacest GetLastErrortERROR_NO_MORE_ITEMSRR tSetupDiGetDeviceInterfaceDetailtERROR_INSUFFICIENT_BUFFERt StructureRR'Rt SetupDiGetDeviceRegistryPropertytSPDRP_HARDWAREIDtSPDRP_FRIENDLYNAMEtSetupDiOpenDevRegKeytDICS_FLAG_GLOBALt DIREG_DEVtKEY_READRtRegQueryValueExtPortNamet RegCloseKeyRtSetupDiDestroyDeviceInfoList( tg_hditdwIndextdidR1tiddtdevinfot szHardwareIDtszFriendlyNamet port_namethkeytport_name_buffertport_name_length((R5sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pytcomportssH" * -     6 = = $ + $t__main__s %s: %s [%s](QRtreRtserialt serial.win32RRtctypes.wintypesRR R R R R RRRRR:tc_void_ptHDEVINFOtc_char_ptPCTSTRtc_charR3tPOINTERtLPDWORDtPDWORDtLPBYTEtPBYTEtPHKEYt ACCESS_MASKtREGSAMRRRCRR'tPSP_DEVINFO_DATAR,tPSP_DEVICE_INTERFACE_DATAt PSP_DEVICE_INTERFACE_DETAIL_DATAtwindllt LoadLibraryR/RNtargtypestrestypetSetupDiGetClassDevsAR6terrcheckR>t SetupDiGetDeviceInterfaceDetailARAt!SetupDiGetDeviceRegistryPropertyARDRGtadvapi32RMtRegQueryValueExARKR8R;R<tINVALID_HANDLE_VALUERBRERFR@RHRIRJtREG_SZtto_bytesRLRZR$tsortedtporttdescthwid(((sC/usr/lib/python2.7/site-packages/serial/tools/list_ports_windows.pyts                    !             (' @  PK[;8:/site-packages/serial/tools/list_ports_posix.pycnu[ MNc@s_ddlZddlZddlZddlZyddlZWnek r\dZn XdZejjZ dZ dZ e d dkrdZ d Z d Zd Zd ZnPe d krdZn8e dkrdZn e d dks'e d dks'e d dkr3dZne d dkrOdZne d dkrkdZne d dkrdZne d d krd!Znte d d"krd#ZnXe d d$krd%Zn<ejjd&ejejejfed'ejfed(kr[x5eeD]!\ZZZd)eeefGHq3WndS(*iNcCsLy2tjdj|\}}|jjSWntdnXdS(Nt s lsusb failed(tostpopen4tjointreadtstriptIOError(targvtsitso((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytpopen s cCs:y tj|dtjjSWntdnXdS(Ntstderrs lsusb failed(t subprocesst check_outputtSTDOUTRR(R((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyR s cCsIy0t|}|jj}|j|SWntk rDdSXdS(s=help function to read a single line from a file. returns noneN(topentreadlineRtcloseRtNone(tfilenametftline((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyt read_line s   cCs)tj||}|r%|jdSdS(s4search for regexp in text, return 1st group on matchiN(tretsearchtgroup(tregexpttexttm((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytre_group*sitlinuxcCs~tjjtjj|jd\}}t|d}|rSd|f}nd}dt|dt|d|fS(sDgiven a path to a usb device in sysfs, return a string describing itt-s/serials SNR=%stsUSB VID:PID=%s:%s%ss /idVendors /idProduct(RtpathtbasenametrealpathtsplitR(t sysfs_pathtbustdevtsnrtsnr_txt((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytusb_sysfs_hw_string4s-  c Cstjjtjj|jd\}}ytdddd||fg}td|}td|}td|pd }td |}td |}d |p||p||fSWntk rtSXdS( NRtlsusbs-vs-ss%s:%ssiManufacturer\s+\w+ (.+)siProduct\s+\w+ (.+)siSerial\s+\w+ (.+)R sidVendor\s+0x\w+ (.+)sidProduct\s+0x\w+ (.+)s%s %s %s( RR!R"R#R$R RRtbase( R%R&R'tdesct iManufacturertiProducttiSerialtidVendort idProduct((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytusb_lsusb_stringBs-"! cCstjj|}d||f}tjj|rhtjjtjjtjj|}t|Sd|f}tjj|rt|S|S(s Get a human readable description. For USB-Serial devices try to run lsusb to get a human readable description. For USB-CDC devices read the description from sysfs. s"/sys/class/tty/%s/device/driver/%ss"/sys/class/tty/%s/device/interface(RR!R"texiststdirnameR#R3R(tdeviceR,t sys_dev_pathtsys_usb((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytdescribeRs*   cCstjj|}tjjd|frd|f}tjj|rTt|Sd||f}tjj|rtjjtjjtjj|}t|S|jdrd|f}tjj|rt|dSqndS(s*Try to get a HW identification using sysfss/sys/class/tty/%s/devices/sys/class/tty/%s/device/ids"/sys/class/tty/%s/device/driver/%stttyACMs/..sn/a( RR!R"R4RR5R#R*t startswith(R6R,t sys_id_pathR7R8((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pythwinfods  *  cCsUtjdtjdtjd}g|D]!}|t|t|f^q0S(Ns /dev/ttyS*s /dev/ttyUSB*s /dev/ttyACM*(tglobR9R=(tdevicestd((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytcomportsxs)tcygwincCs/tjd}g|D]}|||f^qS(Ns /dev/com*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRA}stopenbsd3cCs/tjd}g|D]}|||f^qS(Ns /dev/ttyp*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsitbsditfreebsdtopenbsdcCs/tjd}g|D]}|||f^qS(Ns /dev/cuad*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsitdarwincCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty.*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAstnetbsdcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/dty*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsitirixcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/ttyf*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsithpcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty*p0(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAstsunoscCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty*c(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAstaixcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAss0don't know how to enumerate ttys on this system. ! I you know how the serial ports are named send this information to ! the author of this module: sys.platform = %r os.name = %r pySerial version = %s also add the naming scheme of the serial ports and with a bit luck you can get this module running... s;Sorry: no implementation for your platform ('%s') availablet__main__s %s: %s [%s](R>tsysRRR t ImportErrorR tplatformtlowertplatRRR*R3R9R=RAR twritetnametserialtVERSIONt__name__tsortedtportR-thwid(((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytsV                          PK[&site-packages/serial/tools/__init__.pynu[PK["T0site-packages/serial/tools/list_ports_windows.pynu[import ctypes import re def ValidHandle(value, func, arguments): if value == 0: raise ctypes.WinError() return value import serial from serial.win32 import ULONG_PTR, is_64bit from ctypes.wintypes import HANDLE from ctypes.wintypes import BOOL from ctypes.wintypes import HWND from ctypes.wintypes import DWORD from ctypes.wintypes import WORD from ctypes.wintypes import LONG from ctypes.wintypes import ULONG from ctypes.wintypes import LPCSTR from ctypes.wintypes import HKEY from ctypes.wintypes import BYTE NULL = 0 HDEVINFO = ctypes.c_void_p PCTSTR = ctypes.c_char_p CHAR = ctypes.c_char LPDWORD = PDWORD = ctypes.POINTER(DWORD) #~ LPBYTE = PBYTE = ctypes.POINTER(BYTE) LPBYTE = PBYTE = ctypes.c_void_p # XXX avoids error about types PHKEY = ctypes.POINTER(HKEY) ACCESS_MASK = DWORD REGSAM = ACCESS_MASK def byte_buffer(length): """Get a buffer for a string""" return (BYTE*length)() def string(buffer): s = [] for c in buffer: if c == 0: break s.append(chr(c & 0xff)) # "& 0xff": hack to convert signed to unsigned return ''.join(s) class GUID(ctypes.Structure): _fields_ = [ ('Data1', DWORD), ('Data2', WORD), ('Data3', WORD), ('Data4', BYTE*8), ] def __str__(self): return "{%08x-%04x-%04x-%s-%s}" % ( self.Data1, self.Data2, self.Data3, ''.join(["%02x" % d for d in self.Data4[:2]]), ''.join(["%02x" % d for d in self.Data4[2:]]), ) class SP_DEVINFO_DATA(ctypes.Structure): _fields_ = [ ('cbSize', DWORD), ('ClassGuid', GUID), ('DevInst', DWORD), ('Reserved', ULONG_PTR), ] def __str__(self): return "ClassGuid:%s DevInst:%s" % (self.ClassGuid, self.DevInst) PSP_DEVINFO_DATA = ctypes.POINTER(SP_DEVINFO_DATA) class SP_DEVICE_INTERFACE_DATA(ctypes.Structure): _fields_ = [ ('cbSize', DWORD), ('InterfaceClassGuid', GUID), ('Flags', DWORD), ('Reserved', ULONG_PTR), ] def __str__(self): return "InterfaceClassGuid:%s Flags:%s" % (self.InterfaceClassGuid, self.Flags) PSP_DEVICE_INTERFACE_DATA = ctypes.POINTER(SP_DEVICE_INTERFACE_DATA) PSP_DEVICE_INTERFACE_DETAIL_DATA = ctypes.c_void_p setupapi = ctypes.windll.LoadLibrary("setupapi") SetupDiDestroyDeviceInfoList = setupapi.SetupDiDestroyDeviceInfoList SetupDiDestroyDeviceInfoList.argtypes = [HDEVINFO] SetupDiDestroyDeviceInfoList.restype = BOOL SetupDiGetClassDevs = setupapi.SetupDiGetClassDevsA SetupDiGetClassDevs.argtypes = [ctypes.POINTER(GUID), PCTSTR, HWND, DWORD] SetupDiGetClassDevs.restype = HDEVINFO SetupDiGetClassDevs.errcheck = ValidHandle SetupDiEnumDeviceInterfaces = setupapi.SetupDiEnumDeviceInterfaces SetupDiEnumDeviceInterfaces.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, ctypes.POINTER(GUID), DWORD, PSP_DEVICE_INTERFACE_DATA] SetupDiEnumDeviceInterfaces.restype = BOOL SetupDiGetDeviceInterfaceDetail = setupapi.SetupDiGetDeviceInterfaceDetailA SetupDiGetDeviceInterfaceDetail.argtypes = [HDEVINFO, PSP_DEVICE_INTERFACE_DATA, PSP_DEVICE_INTERFACE_DETAIL_DATA, DWORD, PDWORD, PSP_DEVINFO_DATA] SetupDiGetDeviceInterfaceDetail.restype = BOOL SetupDiGetDeviceRegistryProperty = setupapi.SetupDiGetDeviceRegistryPropertyA SetupDiGetDeviceRegistryProperty.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, PDWORD, PBYTE, DWORD, PDWORD] SetupDiGetDeviceRegistryProperty.restype = BOOL SetupDiOpenDevRegKey = setupapi.SetupDiOpenDevRegKey SetupDiOpenDevRegKey.argtypes = [HDEVINFO, PSP_DEVINFO_DATA, DWORD, DWORD, DWORD, REGSAM] SetupDiOpenDevRegKey.restype = HKEY advapi32 = ctypes.windll.LoadLibrary("Advapi32") RegCloseKey = advapi32.RegCloseKey RegCloseKey.argtypes = [HKEY] RegCloseKey.restype = LONG RegQueryValueEx = advapi32.RegQueryValueExA RegQueryValueEx.argtypes = [HKEY, LPCSTR, LPDWORD, LPDWORD, LPBYTE, LPDWORD] RegQueryValueEx.restype = LONG GUID_CLASS_COMPORT = GUID(0x86e0d1e0L, 0x8089, 0x11d0, (BYTE*8)(0x9c, 0xe4, 0x08, 0x00, 0x3e, 0x30, 0x1f, 0x73)) DIGCF_PRESENT = 2 DIGCF_DEVICEINTERFACE = 16 INVALID_HANDLE_VALUE = 0 ERROR_INSUFFICIENT_BUFFER = 122 SPDRP_HARDWAREID = 1 SPDRP_FRIENDLYNAME = 12 ERROR_NO_MORE_ITEMS = 259 DICS_FLAG_GLOBAL = 1 DIREG_DEV = 0x00000001 KEY_READ = 0x20019 REG_SZ = 1 # workaround for compatibility between Python 2.x and 3.x PortName = serial.to_bytes([80, 111, 114, 116, 78, 97, 109, 101]) # "PortName" def comports(): """This generator scans the device registry for com ports and yields port, desc, hwid""" g_hdi = SetupDiGetClassDevs(ctypes.byref(GUID_CLASS_COMPORT), None, NULL, DIGCF_PRESENT|DIGCF_DEVICEINTERFACE); #~ for i in range(256): for dwIndex in range(256): did = SP_DEVICE_INTERFACE_DATA() did.cbSize = ctypes.sizeof(did) if not SetupDiEnumDeviceInterfaces(g_hdi, None, ctypes.byref(GUID_CLASS_COMPORT), dwIndex, ctypes.byref(did)): if ctypes.GetLastError() != ERROR_NO_MORE_ITEMS: raise ctypes.WinError() break dwNeeded = DWORD() # get the size if not SetupDiGetDeviceInterfaceDetail(g_hdi, ctypes.byref(did), None, 0, ctypes.byref(dwNeeded), None): # Ignore ERROR_INSUFFICIENT_BUFFER if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER: raise ctypes.WinError() # allocate buffer class SP_DEVICE_INTERFACE_DETAIL_DATA_A(ctypes.Structure): _fields_ = [ ('cbSize', DWORD), ('DevicePath', CHAR*(dwNeeded.value - ctypes.sizeof(DWORD))), ] def __str__(self): return "DevicePath:%s" % (self.DevicePath,) idd = SP_DEVICE_INTERFACE_DETAIL_DATA_A() if is_64bit(): idd.cbSize = 8 else: idd.cbSize = 5 devinfo = SP_DEVINFO_DATA() devinfo.cbSize = ctypes.sizeof(devinfo) if not SetupDiGetDeviceInterfaceDetail(g_hdi, ctypes.byref(did), ctypes.byref(idd), dwNeeded, None, ctypes.byref(devinfo)): raise ctypes.WinError() # hardware ID szHardwareID = byte_buffer(250) if not SetupDiGetDeviceRegistryProperty(g_hdi, ctypes.byref(devinfo), SPDRP_HARDWAREID, None, ctypes.byref(szHardwareID), ctypes.sizeof(szHardwareID) - 1, None): # Ignore ERROR_INSUFFICIENT_BUFFER if GetLastError() != ERROR_INSUFFICIENT_BUFFER: raise ctypes.WinError() # friendly name szFriendlyName = byte_buffer(250) if not SetupDiGetDeviceRegistryProperty(g_hdi, ctypes.byref(devinfo), SPDRP_FRIENDLYNAME, None, ctypes.byref(szFriendlyName), ctypes.sizeof(szFriendlyName) - 1, None): # Ignore ERROR_INSUFFICIENT_BUFFER if ctypes.GetLastError() != ERROR_INSUFFICIENT_BUFFER: #~ raise IOError("failed to get details for %s (%s)" % (devinfo, szHardwareID.value)) port_name = None else: # the real com port name has to read differently... hkey = SetupDiOpenDevRegKey(g_hdi, ctypes.byref(devinfo), DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_READ) port_name_buffer = byte_buffer(250) port_name_length = ULONG(ctypes.sizeof(port_name_buffer)) RegQueryValueEx(hkey, PortName, None, None, ctypes.byref(port_name_buffer), ctypes.byref(port_name_length)) RegCloseKey(hkey) yield string(port_name_buffer), string(szFriendlyName), string(szHardwareID) SetupDiDestroyDeviceInfoList(g_hdi) # test if __name__ == '__main__': import serial for port, desc, hwid in sorted(comports()): print "%s: %s [%s]" % (port, desc, hwid) PK[AۛGG'site-packages/serial/tools/miniterm.pyonu[ {QNc@sddlZddlZddlZddlZdadadZdZejddfkrodZ n d Z ej d krddl Z d e fd YZ e anej d kr&ddlZddlZddlZd e fdYZ e adZtjee_nedejdZdZdZdddfZdddfZddddfZde fdYZdZed krendS(!iNsscCs8t|}|dkr*dtd|St|SdS(s)generate a readable description for a keyi sCtrl+%ct@N(tordtrepr(t charactert ascii_code((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytkey_descriptions  cCsdi ttddd6ttd6ttd6tdd6td d 6td d 6td d6tdd6tdd6tdd6tdd6ttd6ttd6S(Nsw --- pySerial (%(version)s) - miniterm - help --- --- %(exit)-8s Exit program --- %(menu)-8s Menu escape key, followed by: --- Menu keys: --- %(itself)-7s Send the menu character itself to remote --- %(exchar)-7s Send the exit character itself to remote --- %(info)-7s Show info --- %(upload)-7s Upload file (prompt will be shown) --- Toggles: --- %(rts)-7s RTS %(echo)-7s local echo --- %(dtr)-7s DTR %(break)-7s BREAK --- %(lfm)-7s line feed %(repr)-7s Cycle repr mode --- --- Port settings (%(menu)s followed by the following): --- p change port --- 7 8 set data bits --- n e o s m change parity (None, Even, Odd, Space, Mark) --- 1 2 3 set stop bits (1, 2, 1.5) --- b change baud rate --- x X disable/enable software flow control --- r R disable/enable hardware flow control tVERSIONsunknown versiontversiontexittmenustrtssRstdtrs tlfmstbreakstechos tinfostuploadtitselftexchar(tgetattrtserialRt EXITCHARCTERt MENUCHARACTER(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt get_help_texts           iicCs |jdS(Ntlatin1(tdecode(tb((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyREscCs|S(N((R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRHstnttConsolecBs,eZdZdZdZdZRS(cCsdS(N((tself((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt__init__QscCsdS(N((R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytsetupTscCsdS(N((R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytcleanupWscCsVxOtrQtj}|dks-|dkr:tjq|dkrJdS|SqWdS(Ntss s (tTruetmsvcrttgetch(Rtz((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytgetkeyZs    (t__name__t __module__RRR R&(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRPs   tposixcBs,eZdZdZdZdZRS(cCstjj|_dS(N(tsyststdintfilenotfd(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRiscCstj|j|_tj|j}|dtj@tj@tj@|dtk rqtj||d|d|d|dd|_nX||_||_||_t|j|_t |_ t |_ t |_ dS(Ntparitytrtsctstxonxoffttimeouti(Rtserial_for_urltAttributeErrortSerialRt repr_modetconvert_outgoingtNEWLINE_CONVERISON_MAPtnewlineR"t dtr_statet rts_statetFalset break_state( RtporttbaudrateRDRERFRRLRK((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRs1 1     cCsBt|_tjd|j|_|jjt|jjdS(sStart reader threadttargetN(R"t _reader_alivet threadingtThreadtreadertreceiver_threadt setDaemontstart(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt _start_readers cCst|_|jjdS(s6Stop reader thread only, wait for clean exit of threadN(RQRVRZtjoin(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt _stop_readers cCsLt|_|jtjd|j|_|jjt|jjdS(NRU( R"taliveR]RWRXtwriterttransmitter_threadR[R\(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyR\s   cCs t|_dS(N(RQR`(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytstopscCs'|jj|s#|jjndS(N(RbR^RZ(Rt transmit_only((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyR^s cCstjjd|jj|jj|jj|jj|jjftjjd|j r\dp_d|j rndpqd|j rdpdfyxtjjd|jj rdpd|jj rdpd|jjrdpd|jjrdpdfWntjk rnXtjjd|jjr8dp;dtjjd|jjr^dpadtjjdt|jt|jfdS( Ns --- Settings: %s %s,%s,%s,%s s&--- RTS: %-8s DTR: %-8s BREAK: %-8s tactivetinactives---- CTS: %-8s DSR: %-8s RI: %-8s CD: %-8s s--- software flow control: %s s--- hardware flow control: %s s$--- data escaping: %s linefeed: %s (R*tstderrtwriteRtportstrRTtbytesizeRDtstopbitsRPRORRtgetCTStgetDSRtgetRItgetCDtSerialExceptionRFREt REPR_MODESRKtLF_MODESRL(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytdump_port_settingss.       $&&  cCsyx|jr|jrt|jjd}|jdkr|dkrm|jtkrmtj j dqtj j |nF|jdkrW|jt kr|dkr|dkrtj j dqT|dkrTqTq|dkr |jt kr tj j dq|dkr7|jtkr7tj j dqtj j t |dd!no|jdkrtj j t |dd!n@|jdkrx.|D]#}tj j d |jd qWntj jqWWn"tjk r}t|_nXd S( sloop and copy serial->consoleiis s s iiis%s RBN(R`RVRRR:RKRLt CONVERT_CRR*tstdoutRht CONVERT_CRLFt CONVERT_LFRtencodetflushRpRQ(RtdataR;te((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRYs6     $ c Cs> t}y x |jr" ytj}Wn#tk rJtjdg}nXt|}|rl|tksu|t kr|jj ||j rct j j |qcn|dkrt jj dt jjtjt jjjd}|ryt|d}t jj d|xftr|jjd}|sCPn|jj ||jj d|jjt jj dqWt jj d|Wqtk r}t jj d ||fqXntjn|d krt jj tnh|d krM|j |_|jj|jt jj d |jrBd pEdn|dkr|j |_|jj|jt jj d|jrd pdn|dkr|j |_|jj|jt jj d|jrd pdnr|dkr0|j |_ t jj d|j r%d p(dn3|dkrI|jn|dkr|j d7_ |j dkrd|_ nt jj dt!|j fn|dkr|j"d7_"|j"dkrd|_"nt#|j"|_$t jj dt%|j"fn\|dkrt jj dt jjtjyt jjj&}Wntk rld5}nXtj|rc||jj(krc|j)|jj*} yytj+|dt} Wn&t,k rtj-} || _(nX| j.| | j| j|j| j|j| j|jWn4t/k rk}t jj d |f| j0n4X|jj0| |_t jj d!|jj(f|j1qcn|d"krct jj d#t jjtj|jj2} y%t3t jjj&|j_2Wn6t4k rK}t jj d$|f| |j_2n X|jtjn|d%krtj5|j_6|jn|d&krtj7|j_6|jn|d'krtj8|j_9|jn|d(krtj:|j_9|jn`|d)kr+tj;|j_9|jn8|d*krStj<|j_9|jn|d+kr{tj=|j_9|jn|d,krtj>|j_?|jn|d-krtj@|j_?|jn|d.krtjA|j_?|jnp|d/kr|d0k|j_B|jnE|d1krI|d2k|j_C|jnt jj d3tD|t}q |tkrt}q |t kr|jEPq |d4kr|jj |j$|j r t j j |t j jq q |jj ||j r t j j |t j jq q WWnt|_nXd5S(6s Loop and copy console->serial until EXITCHARCTER character is found. When MENUCHARACTER is found, interpret the next key locally. iss --- File to upload: s trs--- Sending file %s --- t.s --- File %s sent --- s"--- ERROR opening file %s: %s --- shH?ss--- RTS %s --- ReRfss--- DTR %s --- ss--- BREAK %s --- ss--- local echo %s --- s siis--- escape data: %s --- s is--- line feed %s --- tpPs --- Enter port name: t do_not_opens#--- ERROR opening new port: %s --- s--- Port changed to: %s --- tbBs --- Baudrate: s#--- ERROR setting baudrate: %s --- t8t7teEtoOtmMtsStnNt1t2t3txXtXtrRtRs!--- unknown menu character %s -- s N(FRQR`R=R&tKeyboardInterruptRtto_bytesRRRRhRR*RuRgRyR R+treadlinetrstriptopenR"tIOErrorRRRPtsetRTSROtsetDTRRRtsetBreakRsRKRqRLRMRNRrtstriptNoneRSR_tgetSettingsDictRHRIRJtapplySettingsDictt ExceptiontcloseR]RTtintt ValueErrort EIGHTBITSRjt SEVENBITSt PARITY_EVENRDt PARITY_ODDt PARITY_MARKt PARITY_SPACEt PARITY_NONEt STOPBITS_ONERkt STOPBITS_TWOtSTOPBITS_ONE_POINT_FIVERFRERRc( Rt menu_activeRR;tfilenametfiletlineR{RStsettingst new_serialtbackup((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRasF         !    &  &  &  &                          %                                   ( R'R(RQRvRR]R_R\RcR^RsRYRa(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRCs       (c Csddl}|jdddd}|jdddd d d d d|jd dddddddd dd d|jdddddd dd d|jddddddd dd t|jddd ddd d!d t|jd"dd#ddd d$d t|jd%dd&ddd d'd t|jd(dd)ddd d*d t|jd+d,dd-dd.d d/d d0|jd1dd2ddddd d3d d|jd4dd5ddddd d6d d|jd7d8dd9ddd d:d t|jd;dd<ddddd d=d d>|jd?dd@ddddd dAd dB|j\}}|jj|_|jdCkr|jdDn|j r|j r|jdEn|j |j kr|jdFnt |j at |j a|j}|j}|r|jdk r-|jdGn|jd0}|ryt|d0}Wn&tk r~|jdH|d0nX|jd0n|r|jdIqn|dkrd0}nt}|j rt}n|j rt}nyCt|||jd |jd#|jd|jdJ|d-|j}Wn=tjk ri}tj j!dK||ftj"dLnX|j#stj j!dM|jj$|jj|jj%|jj|jj&ftj j!dNt'tt'tt'tt'dOfn|j(dk rO|j#s-tj j!dP|j(r"dQp%dRn|jj)|j(|j(|_(n|j*dk r|j#stj j!dS|j*rdQpdRn|jj+|j*|j*|_*n|j,y|j-t.Wnt/k rnX|j#stj j!dTn|j-dS(UNitusages!%prog [options] [port [baudrate]]t descriptions9Miniterm - A simple terminal program for the serial port.s-ps--porttdestRSthelpsKport, a number or a device name. (deprecated option, use parameter instead)tdefaults-bs--baudRTtactiontstorettypeRsset baud rate, default %defaulti%s--parityRDs-set parity, one of [N, E, O, S, M], default=NtNs-es--echoRt store_truesenable local echo (default off)s--rtsctsREs)enable RTS/CTS flow control (default off)s --xonxoffRFs*enable software flow control (default off)s--crtcrsdo not send CR+LF, send CR onlys--lftlfsdo not send CR+LF, send LF onlys-Ds--debugRKtcountsdebug received data (escape non-printable chars) --debug can be given multiple times: 0: just print what is received 1: escape non-printable characters, do newlines as unusual 2: escape non-printable characters, newlines too 3: hex dump everythingis--rtsRPs2set initial RTS line state (possible values: 0, 1)s--dtrROs2set initial DTR line state (possible values: 0, 1)s-qs--quiettquietssuppress non error messagess --exit-chart exit_charsDASCII code of special character that is used to exit the applicationis --menu-chart menu_charsGASCII code of special character that is used to control miniterm (menu)itNEOSMsinvalid paritys)only one of --cr or --lf can be specifieds.--exit-char can not be the same as --menu-chars;no arguments are allowed, options only when --port is givens"baud rate must be a number, not %rstoo many argumentsRLscould not open port %r: %s is$--- Miniterm on %s: %d,%s,%s,%s --- s8--- Quit: %s | Menu: %s | Help: %s followed by %s --- ss--- forcing DTR %s ReRfs--- forcing RTS %s s --- exit --- (0toptparset OptionParsert add_optionRRQt parse_argsRDtupperterrorRRRRtchrRRRSRTtpopRRRvRtRwRCRERFRRKRRpR*RgRhRRRiRjRkRRORRPRR\R^R"R( RtparsertoptionstargsRSRTRLtminitermR{((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytmains0                                   & &   t__main__(R*R9RRWRRRRt version_infoRtnameR#tobjectRR=R.R>RtexitfunctNotImplementedErrortplatformRvRtRwRMRrRqRCRR'(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt s<0 (    $    ) PK[;8:/site-packages/serial/tools/list_ports_posix.pyonu[ MNc@s_ddlZddlZddlZddlZyddlZWnek r\dZn XdZejjZ dZ dZ e d dkrdZ d Z d Zd Zd ZnPe d krdZn8e dkrdZn e d dks'e d dks'e d dkr3dZne d dkrOdZne d dkrkdZne d dkrdZne d d krd!Znte d d"krd#ZnXe d d$krd%Zn<ejjd&ejejejfed'ejfed(kr[x5eeD]!\ZZZd)eeefGHq3WndS(*iNcCsLy2tjdj|\}}|jjSWntdnXdS(Nt s lsusb failed(tostpopen4tjointreadtstriptIOError(targvtsitso((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytpopen s cCs:y tj|dtjjSWntdnXdS(Ntstderrs lsusb failed(t subprocesst check_outputtSTDOUTRR(R((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyR s cCsIy0t|}|jj}|j|SWntk rDdSXdS(s=help function to read a single line from a file. returns noneN(topentreadlineRtcloseRtNone(tfilenametftline((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyt read_line s   cCs)tj||}|r%|jdSdS(s4search for regexp in text, return 1st group on matchiN(tretsearchtgroup(tregexpttexttm((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytre_group*sitlinuxcCs~tjjtjj|jd\}}t|d}|rSd|f}nd}dt|dt|d|fS(sDgiven a path to a usb device in sysfs, return a string describing itt-s/serials SNR=%stsUSB VID:PID=%s:%s%ss /idVendors /idProduct(RtpathtbasenametrealpathtsplitR(t sysfs_pathtbustdevtsnrtsnr_txt((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytusb_sysfs_hw_string4s-  c Cstjjtjj|jd\}}ytdddd||fg}td|}td|}td|pd }td |}td |}d |p||p||fSWntk rtSXdS( NRtlsusbs-vs-ss%s:%ssiManufacturer\s+\w+ (.+)siProduct\s+\w+ (.+)siSerial\s+\w+ (.+)R sidVendor\s+0x\w+ (.+)sidProduct\s+0x\w+ (.+)s%s %s %s( RR!R"R#R$R RRtbase( R%R&R'tdesct iManufacturertiProducttiSerialtidVendort idProduct((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytusb_lsusb_stringBs-"! cCstjj|}d||f}tjj|rhtjjtjjtjj|}t|Sd|f}tjj|rt|S|S(s Get a human readable description. For USB-Serial devices try to run lsusb to get a human readable description. For USB-CDC devices read the description from sysfs. s"/sys/class/tty/%s/device/driver/%ss"/sys/class/tty/%s/device/interface(RR!R"texiststdirnameR#R3R(tdeviceR,t sys_dev_pathtsys_usb((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytdescribeRs*   cCstjj|}tjjd|frd|f}tjj|rTt|Sd||f}tjj|rtjjtjjtjj|}t|S|jdrd|f}tjj|rt|dSqndS(s*Try to get a HW identification using sysfss/sys/class/tty/%s/devices/sys/class/tty/%s/device/ids"/sys/class/tty/%s/device/driver/%stttyACMs/..sn/a( RR!R"R4RR5R#R*t startswith(R6R,t sys_id_pathR7R8((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pythwinfods  *  cCsUtjdtjdtjd}g|D]!}|t|t|f^q0S(Ns /dev/ttyS*s /dev/ttyUSB*s /dev/ttyACM*(tglobR9R=(tdevicestd((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytcomportsxs)tcygwincCs/tjd}g|D]}|||f^qS(Ns /dev/com*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRA}stopenbsd3cCs/tjd}g|D]}|||f^qS(Ns /dev/ttyp*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsitbsditfreebsdtopenbsdcCs/tjd}g|D]}|||f^qS(Ns /dev/cuad*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsitdarwincCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty.*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAstnetbsdcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/dty*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsitirixcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/ttyf*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAsithpcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty*p0(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAstsunoscCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty*c(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAstaixcCs/tjd}g|D]}|||f^qS(s8scan for available ports. return a list of device names.s /dev/tty*(R>(R?R@((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pyRAss0don't know how to enumerate ttys on this system. ! I you know how the serial ports are named send this information to ! the author of this module: sys.platform = %r os.name = %r pySerial version = %s also add the naming scheme of the serial ports and with a bit luck you can get this module running... s;Sorry: no implementation for your platform ('%s') availablet__main__s %s: %s [%s](R>tsysRRR t ImportErrorR tplatformtlowertplatRRR*R3R9R=RAR twritetnametserialtVERSIONt__name__tsortedtportR-thwid(((sA/usr/lib/python2.7/site-packages/serial/tools/list_ports_posix.pytsV                          PK[ մree&site-packages/serial/tools/miniterm.pynu[#!/usr/bin/env python # Very simple serial terminal # (C)2002-2011 Chris Liechti # Input characters are sent directly (only LF -> CR/LF/CRLF translation is # done), received characters are displayed as is (or escaped trough pythons # repr, useful for debug purposes) import sys, os, serial, threading EXITCHARCTER = '\x1d' # GS/CTRL+] MENUCHARACTER = '\x14' # Menu: CTRL+T def key_description(character): """generate a readable description for a key""" ascii_code = ord(character) if ascii_code < 32: return 'Ctrl+%c' % (ord('@') + ascii_code) else: return repr(character) # help text, starts with blank line! it's a function so that the current values # for the shortcut keys is used and not the value at program start def get_help_text(): return """ --- pySerial (%(version)s) - miniterm - help --- --- %(exit)-8s Exit program --- %(menu)-8s Menu escape key, followed by: --- Menu keys: --- %(itself)-7s Send the menu character itself to remote --- %(exchar)-7s Send the exit character itself to remote --- %(info)-7s Show info --- %(upload)-7s Upload file (prompt will be shown) --- Toggles: --- %(rts)-7s RTS %(echo)-7s local echo --- %(dtr)-7s DTR %(break)-7s BREAK --- %(lfm)-7s line feed %(repr)-7s Cycle repr mode --- --- Port settings (%(menu)s followed by the following): --- p change port --- 7 8 set data bits --- n e o s m change parity (None, Even, Odd, Space, Mark) --- 1 2 3 set stop bits (1, 2, 1.5) --- b change baud rate --- x X disable/enable software flow control --- r R disable/enable hardware flow control """ % { 'version': getattr(serial, 'VERSION', 'unknown version'), 'exit': key_description(EXITCHARCTER), 'menu': key_description(MENUCHARACTER), 'rts': key_description('\x12'), 'repr': key_description('\x01'), 'dtr': key_description('\x04'), 'lfm': key_description('\x0c'), 'break': key_description('\x02'), 'echo': key_description('\x05'), 'info': key_description('\x09'), 'upload': key_description('\x15'), 'itself': key_description(MENUCHARACTER), 'exchar': key_description(EXITCHARCTER), } if sys.version_info >= (3, 0): def character(b): return b.decode('latin1') else: def character(b): return b # first choose a platform dependant way to read single characters from the console global console if os.name == 'nt': import msvcrt class Console(object): def __init__(self): pass def setup(self): pass # Do nothing for 'nt' def cleanup(self): pass # Do nothing for 'nt' def getkey(self): while True: z = msvcrt.getch() if z == '\0' or z == '\xe0': # functions keys, ignore msvcrt.getch() else: if z == '\r': return '\n' return z console = Console() elif os.name == 'posix': import termios, sys, os class Console(object): def __init__(self): self.fd = sys.stdin.fileno() def setup(self): self.old = termios.tcgetattr(self.fd) new = termios.tcgetattr(self.fd) new[3] = new[3] & ~termios.ICANON & ~termios.ECHO & ~termios.ISIG new[6][termios.VMIN] = 1 new[6][termios.VTIME] = 0 termios.tcsetattr(self.fd, termios.TCSANOW, new) def getkey(self): c = os.read(self.fd, 1) return c def cleanup(self): termios.tcsetattr(self.fd, termios.TCSAFLUSH, self.old) console = Console() def cleanup_console(): console.cleanup() console.setup() sys.exitfunc = cleanup_console # terminal modes have to be restored on exit... else: raise NotImplementedError("Sorry no implementation for your platform (%s) available." % sys.platform) CONVERT_CRLF = 2 CONVERT_CR = 1 CONVERT_LF = 0 NEWLINE_CONVERISON_MAP = ('\n', '\r', '\r\n') LF_MODES = ('LF', 'CR', 'CR/LF') REPR_MODES = ('raw', 'some control', 'all control', 'hex') class Miniterm(object): def __init__(self, port, baudrate, parity, rtscts, xonxoff, echo=False, convert_outgoing=CONVERT_CRLF, repr_mode=0): try: self.serial = serial.serial_for_url(port, baudrate, parity=parity, rtscts=rtscts, xonxoff=xonxoff, timeout=1) except AttributeError: # happens when the installed pyserial is older than 2.5. use the # Serial class directly then. self.serial = serial.Serial(port, baudrate, parity=parity, rtscts=rtscts, xonxoff=xonxoff, timeout=1) self.echo = echo self.repr_mode = repr_mode self.convert_outgoing = convert_outgoing self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing] self.dtr_state = True self.rts_state = True self.break_state = False def _start_reader(self): """Start reader thread""" self._reader_alive = True # start serial->console thread self.receiver_thread = threading.Thread(target=self.reader) self.receiver_thread.setDaemon(True) self.receiver_thread.start() def _stop_reader(self): """Stop reader thread only, wait for clean exit of thread""" self._reader_alive = False self.receiver_thread.join() def start(self): self.alive = True self._start_reader() # enter console->serial loop self.transmitter_thread = threading.Thread(target=self.writer) self.transmitter_thread.setDaemon(True) self.transmitter_thread.start() def stop(self): self.alive = False def join(self, transmit_only=False): self.transmitter_thread.join() if not transmit_only: self.receiver_thread.join() def dump_port_settings(self): sys.stderr.write("\n--- Settings: %s %s,%s,%s,%s\n" % ( self.serial.portstr, self.serial.baudrate, self.serial.bytesize, self.serial.parity, self.serial.stopbits)) sys.stderr.write('--- RTS: %-8s DTR: %-8s BREAK: %-8s\n' % ( (self.rts_state and 'active' or 'inactive'), (self.dtr_state and 'active' or 'inactive'), (self.break_state and 'active' or 'inactive'))) try: sys.stderr.write('--- CTS: %-8s DSR: %-8s RI: %-8s CD: %-8s\n' % ( (self.serial.getCTS() and 'active' or 'inactive'), (self.serial.getDSR() and 'active' or 'inactive'), (self.serial.getRI() and 'active' or 'inactive'), (self.serial.getCD() and 'active' or 'inactive'))) except serial.SerialException: # on RFC 2217 ports it can happen to no modem state notification was # yet received. ignore this error. pass sys.stderr.write('--- software flow control: %s\n' % (self.serial.xonxoff and 'active' or 'inactive')) sys.stderr.write('--- hardware flow control: %s\n' % (self.serial.rtscts and 'active' or 'inactive')) sys.stderr.write('--- data escaping: %s linefeed: %s\n' % ( REPR_MODES[self.repr_mode], LF_MODES[self.convert_outgoing])) def reader(self): """loop and copy serial->console""" try: while self.alive and self._reader_alive: data = character(self.serial.read(1)) if self.repr_mode == 0: # direct output, just have to care about newline setting if data == '\r' and self.convert_outgoing == CONVERT_CR: sys.stdout.write('\n') else: sys.stdout.write(data) elif self.repr_mode == 1: # escape non-printable, let pass newlines if self.convert_outgoing == CONVERT_CRLF and data in '\r\n': if data == '\n': sys.stdout.write('\n') elif data == '\r': pass elif data == '\n' and self.convert_outgoing == CONVERT_LF: sys.stdout.write('\n') elif data == '\r' and self.convert_outgoing == CONVERT_CR: sys.stdout.write('\n') else: sys.stdout.write(repr(data)[1:-1]) elif self.repr_mode == 2: # escape all non-printable, including newline sys.stdout.write(repr(data)[1:-1]) elif self.repr_mode == 3: # escape everything (hexdump) for c in data: sys.stdout.write("%s " % c.encode('hex')) sys.stdout.flush() except serial.SerialException, e: self.alive = False # would be nice if the console reader could be interruptted at this # point... raise def writer(self): """\ Loop and copy console->serial until EXITCHARCTER character is found. When MENUCHARACTER is found, interpret the next key locally. """ menu_active = False try: while self.alive: try: b = console.getkey() except KeyboardInterrupt: b = serial.to_bytes([3]) c = character(b) if menu_active: if c == MENUCHARACTER or c == EXITCHARCTER: # Menu character again/exit char -> send itself self.serial.write(b) # send character if self.echo: sys.stdout.write(c) elif c == '\x15': # CTRL+U -> upload file sys.stderr.write('\n--- File to upload: ') sys.stderr.flush() console.cleanup() filename = sys.stdin.readline().rstrip('\r\n') if filename: try: file = open(filename, 'r') sys.stderr.write('--- Sending file %s ---\n' % filename) while True: line = file.readline().rstrip('\r\n') if not line: break self.serial.write(line) self.serial.write('\r\n') # Wait for output buffer to drain. self.serial.flush() sys.stderr.write('.') # Progress indicator. sys.stderr.write('\n--- File %s sent ---\n' % filename) except IOError, e: sys.stderr.write('--- ERROR opening file %s: %s ---\n' % (filename, e)) console.setup() elif c in '\x08hH?': # CTRL+H, h, H, ? -> Show help sys.stderr.write(get_help_text()) elif c == '\x12': # CTRL+R -> Toggle RTS self.rts_state = not self.rts_state self.serial.setRTS(self.rts_state) sys.stderr.write('--- RTS %s ---\n' % (self.rts_state and 'active' or 'inactive')) elif c == '\x04': # CTRL+D -> Toggle DTR self.dtr_state = not self.dtr_state self.serial.setDTR(self.dtr_state) sys.stderr.write('--- DTR %s ---\n' % (self.dtr_state and 'active' or 'inactive')) elif c == '\x02': # CTRL+B -> toggle BREAK condition self.break_state = not self.break_state self.serial.setBreak(self.break_state) sys.stderr.write('--- BREAK %s ---\n' % (self.break_state and 'active' or 'inactive')) elif c == '\x05': # CTRL+E -> toggle local echo self.echo = not self.echo sys.stderr.write('--- local echo %s ---\n' % (self.echo and 'active' or 'inactive')) elif c == '\x09': # CTRL+I -> info self.dump_port_settings() elif c == '\x01': # CTRL+A -> cycle escape mode self.repr_mode += 1 if self.repr_mode > 3: self.repr_mode = 0 sys.stderr.write('--- escape data: %s ---\n' % ( REPR_MODES[self.repr_mode], )) elif c == '\x0c': # CTRL+L -> cycle linefeed mode self.convert_outgoing += 1 if self.convert_outgoing > 2: self.convert_outgoing = 0 self.newline = NEWLINE_CONVERISON_MAP[self.convert_outgoing] sys.stderr.write('--- line feed %s ---\n' % ( LF_MODES[self.convert_outgoing], )) elif c in 'pP': # P -> change port sys.stderr.write('\n--- Enter port name: ') sys.stderr.flush() console.cleanup() try: port = sys.stdin.readline().strip() except KeyboardInterrupt: port = None console.setup() if port and port != self.serial.port: # reader thread needs to be shut down self._stop_reader() # save settings settings = self.serial.getSettingsDict() try: try: new_serial = serial.serial_for_url(port, do_not_open=True) except AttributeError: # happens when the installed pyserial is older than 2.5. use the # Serial class directly then. new_serial = serial.Serial() new_serial.port = port # restore settings and open new_serial.applySettingsDict(settings) new_serial.open() new_serial.setRTS(self.rts_state) new_serial.setDTR(self.dtr_state) new_serial.setBreak(self.break_state) except Exception, e: sys.stderr.write('--- ERROR opening new port: %s ---\n' % (e,)) new_serial.close() else: self.serial.close() self.serial = new_serial sys.stderr.write('--- Port changed to: %s ---\n' % (self.serial.port,)) # and restart the reader thread self._start_reader() elif c in 'bB': # B -> change baudrate sys.stderr.write('\n--- Baudrate: ') sys.stderr.flush() console.cleanup() backup = self.serial.baudrate try: self.serial.baudrate = int(sys.stdin.readline().strip()) except ValueError, e: sys.stderr.write('--- ERROR setting baudrate: %s ---\n' % (e,)) self.serial.baudrate = backup else: self.dump_port_settings() console.setup() elif c == '8': # 8 -> change to 8 bits self.serial.bytesize = serial.EIGHTBITS self.dump_port_settings() elif c == '7': # 7 -> change to 8 bits self.serial.bytesize = serial.SEVENBITS self.dump_port_settings() elif c in 'eE': # E -> change to even parity self.serial.parity = serial.PARITY_EVEN self.dump_port_settings() elif c in 'oO': # O -> change to odd parity self.serial.parity = serial.PARITY_ODD self.dump_port_settings() elif c in 'mM': # M -> change to mark parity self.serial.parity = serial.PARITY_MARK self.dump_port_settings() elif c in 'sS': # S -> change to space parity self.serial.parity = serial.PARITY_SPACE self.dump_port_settings() elif c in 'nN': # N -> change to no parity self.serial.parity = serial.PARITY_NONE self.dump_port_settings() elif c == '1': # 1 -> change to 1 stop bits self.serial.stopbits = serial.STOPBITS_ONE self.dump_port_settings() elif c == '2': # 2 -> change to 2 stop bits self.serial.stopbits = serial.STOPBITS_TWO self.dump_port_settings() elif c == '3': # 3 -> change to 1.5 stop bits self.serial.stopbits = serial.STOPBITS_ONE_POINT_FIVE self.dump_port_settings() elif c in 'xX': # X -> change software flow control self.serial.xonxoff = (c == 'X') self.dump_port_settings() elif c in 'rR': # R -> change hardware flow control self.serial.rtscts = (c == 'R') self.dump_port_settings() else: sys.stderr.write('--- unknown menu character %s --\n' % key_description(c)) menu_active = False elif c == MENUCHARACTER: # next char will be for menu menu_active = True elif c == EXITCHARCTER: self.stop() break # exit app elif c == '\n': self.serial.write(self.newline) # send newline character(s) if self.echo: sys.stdout.write(c) # local echo is a real newline in any case sys.stdout.flush() else: self.serial.write(b) # send byte if self.echo: sys.stdout.write(c) sys.stdout.flush() except: self.alive = False raise def main(): import optparse parser = optparse.OptionParser( usage = "%prog [options] [port [baudrate]]", description = "Miniterm - A simple terminal program for the serial port." ) parser.add_option("-p", "--port", dest = "port", help = "port, a number or a device name. (deprecated option, use parameter instead)", default = None ) parser.add_option("-b", "--baud", dest = "baudrate", action = "store", type = 'int', help = "set baud rate, default %default", default = 9600 ) parser.add_option("--parity", dest = "parity", action = "store", help = "set parity, one of [N, E, O, S, M], default=N", default = 'N' ) parser.add_option("-e", "--echo", dest = "echo", action = "store_true", help = "enable local echo (default off)", default = False ) parser.add_option("--rtscts", dest = "rtscts", action = "store_true", help = "enable RTS/CTS flow control (default off)", default = False ) parser.add_option("--xonxoff", dest = "xonxoff", action = "store_true", help = "enable software flow control (default off)", default = False ) parser.add_option("--cr", dest = "cr", action = "store_true", help = "do not send CR+LF, send CR only", default = False ) parser.add_option("--lf", dest = "lf", action = "store_true", help = "do not send CR+LF, send LF only", default = False ) parser.add_option("-D", "--debug", dest = "repr_mode", action = "count", help = """debug received data (escape non-printable chars) --debug can be given multiple times: 0: just print what is received 1: escape non-printable characters, do newlines as unusual 2: escape non-printable characters, newlines too 3: hex dump everything""", default = 0 ) parser.add_option("--rts", dest = "rts_state", action = "store", type = 'int', help = "set initial RTS line state (possible values: 0, 1)", default = None ) parser.add_option("--dtr", dest = "dtr_state", action = "store", type = 'int', help = "set initial DTR line state (possible values: 0, 1)", default = None ) parser.add_option("-q", "--quiet", dest = "quiet", action = "store_true", help = "suppress non error messages", default = False ) parser.add_option("--exit-char", dest = "exit_char", action = "store", type = 'int', help = "ASCII code of special character that is used to exit the application", default = 0x1d ) parser.add_option("--menu-char", dest = "menu_char", action = "store", type = 'int', help = "ASCII code of special character that is used to control miniterm (menu)", default = 0x14 ) (options, args) = parser.parse_args() options.parity = options.parity.upper() if options.parity not in 'NEOSM': parser.error("invalid parity") if options.cr and options.lf: parser.error("only one of --cr or --lf can be specified") if options.menu_char == options.exit_char: parser.error('--exit-char can not be the same as --menu-char') global EXITCHARCTER, MENUCHARACTER EXITCHARCTER = chr(options.exit_char) MENUCHARACTER = chr(options.menu_char) port = options.port baudrate = options.baudrate if args: if options.port is not None: parser.error("no arguments are allowed, options only when --port is given") port = args.pop(0) if args: try: baudrate = int(args[0]) except ValueError: parser.error("baud rate must be a number, not %r" % args[0]) args.pop(0) if args: parser.error("too many arguments") else: if port is None: port = 0 convert_outgoing = CONVERT_CRLF if options.cr: convert_outgoing = CONVERT_CR elif options.lf: convert_outgoing = CONVERT_LF try: miniterm = Miniterm( port, baudrate, options.parity, rtscts=options.rtscts, xonxoff=options.xonxoff, echo=options.echo, convert_outgoing=convert_outgoing, repr_mode=options.repr_mode, ) except serial.SerialException, e: sys.stderr.write("could not open port %r: %s\n" % (port, e)) sys.exit(1) if not options.quiet: sys.stderr.write('--- Miniterm on %s: %d,%s,%s,%s ---\n' % ( miniterm.serial.portstr, miniterm.serial.baudrate, miniterm.serial.bytesize, miniterm.serial.parity, miniterm.serial.stopbits, )) sys.stderr.write('--- Quit: %s | Menu: %s | Help: %s followed by %s ---\n' % ( key_description(EXITCHARCTER), key_description(MENUCHARACTER), key_description(MENUCHARACTER), key_description('\x08'), )) if options.dtr_state is not None: if not options.quiet: sys.stderr.write('--- forcing DTR %s\n' % (options.dtr_state and 'active' or 'inactive')) miniterm.serial.setDTR(options.dtr_state) miniterm.dtr_state = options.dtr_state if options.rts_state is not None: if not options.quiet: sys.stderr.write('--- forcing RTS %s\n' % (options.rts_state and 'active' or 'inactive')) miniterm.serial.setRTS(options.rts_state) miniterm.rts_state = options.rts_state miniterm.start() try: miniterm.join(True) except KeyboardInterrupt: pass if not options.quiet: sys.stderr.write("\n--- exit ---\n") miniterm.join() if __name__ == '__main__': main() PK[ؐ'site-packages/serial/tools/__init__.pyonu[ ApMc@sdS(N((((s9/usr/lib/python2.7/site-packages/serial/tools/__init__.pytsPK[  )site-packages/serial/tools/list_ports.pycnu[ VNc@sdZddlZddlZddlZddlZejdkrRddlTn2ejdkrnddlTnedejfdZdZ e d kre ndS( sAThis module will provide a function called comports that returns an iterable (generator or list) that will enumerate available com ports. Note that on some systems non-existent ports may be listed. Additionally a grep function is supplied that can be used to search for ports based on their descriptions or hardware ID. iNtnt(t*tposixs;Sorry: no implementation for your platform ('%s') availableccsnxgtD]\\}}}tj||tjsUtj||sUtj||r |||fVq q WdS(s Search for ports using a regular expression. Port name, description and hardware ID are searched. The function returns an iterable that returns the same tuples as comport() would do. N(tcomportstretsearchtI(tregexptporttdescthwid((s;/usr/lib/python2.7/site-packages/serial/tools/list_ports.pytgrep#s<c Csddl}|jdddd}|jdddd d d td d |jddddd dd dd d|jddddd dd ddd|j\}}d}|rt|dkr|jdnd|dfGHtt|d}ntt }xW|D]O\}}}d|fGH|j dkr]d|fGHd|fGHn|d7}qW|j r|rd|fGHqd GHndS(!Nitusages%prog [options] []t descriptions9Miniterm - A simple terminal program for the serial port.s--debugthelps6print debug messages and tracebacks (development mode)tdesttdebugtdefaulttactiont store_trues-vs --verboses0show more messages (can be given multiple times)tverboseitcounts-qs--quietssuppress all messagest store_consttconstis"more than one regexp not supportedsFiltered list with regexp: %rs%-20ss desc: %ss hwid: %ss%d ports foundsno ports found( toptparset OptionParsert add_optiontFalset parse_argstlenterrortsortedR RR( RtparsertoptionstargsthitstiteratorRR R ((s;/usr/lib/python2.7/site-packages/serial/tools/list_ports.pytmain.sJ       t__main__( t__doc__tsystosRtnametserial.tools.list_ports_windowstserial.tools.list_ports_posixt ImportErrorR R%t__name__(((s;/usr/lib/python2.7/site-packages/serial/tools/list_ports.pyts$    4 PK[AۛGG'site-packages/serial/tools/miniterm.pycnu[ {QNc@sddlZddlZddlZddlZdadadZdZejddfkrodZ n d Z ej d krddl Z d e fd YZ e anej d kr&ddlZddlZddlZd e fdYZ e adZtjee_nedejdZdZdZdddfZdddfZddddfZde fdYZdZed krendS(!iNsscCs8t|}|dkr*dtd|St|SdS(s)generate a readable description for a keyi sCtrl+%ct@N(tordtrepr(t charactert ascii_code((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytkey_descriptions  cCsdi ttddd6ttd6ttd6tdd6td d 6td d 6td d6tdd6tdd6tdd6tdd6ttd6ttd6S(Nsw --- pySerial (%(version)s) - miniterm - help --- --- %(exit)-8s Exit program --- %(menu)-8s Menu escape key, followed by: --- Menu keys: --- %(itself)-7s Send the menu character itself to remote --- %(exchar)-7s Send the exit character itself to remote --- %(info)-7s Show info --- %(upload)-7s Upload file (prompt will be shown) --- Toggles: --- %(rts)-7s RTS %(echo)-7s local echo --- %(dtr)-7s DTR %(break)-7s BREAK --- %(lfm)-7s line feed %(repr)-7s Cycle repr mode --- --- Port settings (%(menu)s followed by the following): --- p change port --- 7 8 set data bits --- n e o s m change parity (None, Even, Odd, Space, Mark) --- 1 2 3 set stop bits (1, 2, 1.5) --- b change baud rate --- x X disable/enable software flow control --- r R disable/enable hardware flow control tVERSIONsunknown versiontversiontexittmenustrtssRstdtrs tlfmstbreakstechos tinfostuploadtitselftexchar(tgetattrtserialRt EXITCHARCTERt MENUCHARACTER(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt get_help_texts           iicCs |jdS(Ntlatin1(tdecode(tb((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyREscCs|S(N((R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRHstnttConsolecBs,eZdZdZdZdZRS(cCsdS(N((tself((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt__init__QscCsdS(N((R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytsetupTscCsdS(N((R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytcleanupWscCsVxOtrQtj}|dks-|dkr:tjq|dkrJdS|SqWdS(Ntss s (tTruetmsvcrttgetch(Rtz((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytgetkeyZs    (t__name__t __module__RRR R&(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRPs   tposixcBs,eZdZdZdZdZRS(cCstjj|_dS(N(tsyststdintfilenotfd(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRiscCstj|j|_tj|j}|dtj@tj@tj@|dtk rqtj||d|d|d|dd|_nX||_||_||_t|j|_t |_ t |_ t |_ dS(Ntparitytrtsctstxonxoffttimeouti(Rtserial_for_urltAttributeErrortSerialRt repr_modetconvert_outgoingtNEWLINE_CONVERISON_MAPtnewlineR"t dtr_statet rts_statetFalset break_state( RtporttbaudrateRDRERFRRLRK((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRs1 1     cCsBt|_tjd|j|_|jjt|jjdS(sStart reader threadttargetN(R"t _reader_alivet threadingtThreadtreadertreceiver_threadt setDaemontstart(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt _start_readers cCst|_|jjdS(s6Stop reader thread only, wait for clean exit of threadN(RQRVRZtjoin(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt _stop_readers cCsLt|_|jtjd|j|_|jjt|jjdS(NRU( R"taliveR]RWRXtwriterttransmitter_threadR[R\(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyR\s   cCs t|_dS(N(RQR`(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytstopscCs'|jj|s#|jjndS(N(RbR^RZ(Rt transmit_only((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyR^s cCstjjd|jj|jj|jj|jj|jjftjjd|j r\dp_d|j rndpqd|j rdpdfyxtjjd|jj rdpd|jj rdpd|jjrdpd|jjrdpdfWntjk rnXtjjd|jjr8dp;dtjjd|jjr^dpadtjjdt|jt|jfdS( Ns --- Settings: %s %s,%s,%s,%s s&--- RTS: %-8s DTR: %-8s BREAK: %-8s tactivetinactives---- CTS: %-8s DSR: %-8s RI: %-8s CD: %-8s s--- software flow control: %s s--- hardware flow control: %s s$--- data escaping: %s linefeed: %s (R*tstderrtwriteRtportstrRTtbytesizeRDtstopbitsRPRORRtgetCTStgetDSRtgetRItgetCDtSerialExceptionRFREt REPR_MODESRKtLF_MODESRL(R((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytdump_port_settingss.       $&&  cCsyx|jr|jrt|jjd}|jdkr|dkrm|jtkrmtj j dqtj j |nF|jdkrW|jt kr|dkr|dkrtj j dqT|dkrTqTq|dkr |jt kr tj j dq|dkr7|jtkr7tj j dqtj j t |dd!no|jdkrtj j t |dd!n@|jdkrx.|D]#}tj j d |jd qWntj jqWWn"tjk r}t|_nXd S( sloop and copy serial->consoleiis s s iiis%s RBN(R`RVRRR:RKRLt CONVERT_CRR*tstdoutRht CONVERT_CRLFt CONVERT_LFRtencodetflushRpRQ(RtdataR;te((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRYs6     $ c Cs> t}y x |jr" ytj}Wn#tk rJtjdg}nXt|}|rl|tksu|t kr|jj ||j rct j j |qcn|dkrt jj dt jjtjt jjjd}|ryt|d}t jj d|xftr|jjd}|sCPn|jj ||jj d|jjt jj dqWt jj d|Wqtk r}t jj d ||fqXntjn|d krt jj tnh|d krM|j |_|jj|jt jj d |jrBd pEdn|dkr|j |_|jj|jt jj d|jrd pdn|dkr|j |_|jj|jt jj d|jrd pdnr|dkr0|j |_ t jj d|j r%d p(dn3|dkrI|jn|dkr|j d7_ |j dkrd|_ nt jj dt!|j fn|dkr|j"d7_"|j"dkrd|_"nt#|j"|_$t jj dt%|j"fn\|dkrt jj dt jjtjyt jjj&}Wntk rld5}nXtj|rc||jj(krc|j)|jj*} yytj+|dt} Wn&t,k rtj-} || _(nX| j.| | j| j|j| j|j| j|jWn4t/k rk}t jj d |f| j0n4X|jj0| |_t jj d!|jj(f|j1qcn|d"krct jj d#t jjtj|jj2} y%t3t jjj&|j_2Wn6t4k rK}t jj d$|f| |j_2n X|jtjn|d%krtj5|j_6|jn|d&krtj7|j_6|jn|d'krtj8|j_9|jn|d(krtj:|j_9|jn`|d)kr+tj;|j_9|jn8|d*krStj<|j_9|jn|d+kr{tj=|j_9|jn|d,krtj>|j_?|jn|d-krtj@|j_?|jn|d.krtjA|j_?|jnp|d/kr|d0k|j_B|jnE|d1krI|d2k|j_C|jnt jj d3tD|t}q |tkrt}q |t kr|jEPq |d4kr|jj |j$|j r t j j |t j jq q |jj ||j r t j j |t j jq q WWnt|_nXd5S(6s Loop and copy console->serial until EXITCHARCTER character is found. When MENUCHARACTER is found, interpret the next key locally. iss --- File to upload: s trs--- Sending file %s --- t.s --- File %s sent --- s"--- ERROR opening file %s: %s --- shH?ss--- RTS %s --- ReRfss--- DTR %s --- ss--- BREAK %s --- ss--- local echo %s --- s siis--- escape data: %s --- s is--- line feed %s --- tpPs --- Enter port name: t do_not_opens#--- ERROR opening new port: %s --- s--- Port changed to: %s --- tbBs --- Baudrate: s#--- ERROR setting baudrate: %s --- t8t7teEtoOtmMtsStnNt1t2t3txXtXtrRtRs!--- unknown menu character %s -- s N(FRQR`R=R&tKeyboardInterruptRtto_bytesRRRRhRR*RuRgRyR R+treadlinetrstriptopenR"tIOErrorRRRPtsetRTSROtsetDTRRRtsetBreakRsRKRqRLRMRNRrtstriptNoneRSR_tgetSettingsDictRHRIRJtapplySettingsDictt ExceptiontcloseR]RTtintt ValueErrort EIGHTBITSRjt SEVENBITSt PARITY_EVENRDt PARITY_ODDt PARITY_MARKt PARITY_SPACEt PARITY_NONEt STOPBITS_ONERkt STOPBITS_TWOtSTOPBITS_ONE_POINT_FIVERFRERRc( Rt menu_activeRR;tfilenametfiletlineR{RStsettingst new_serialtbackup((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRasF         !    &  &  &  &                          %                                   ( R'R(RQRvRR]R_R\RcR^RsRYRa(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyRCs       (c Csddl}|jdddd}|jdddd d d d d|jd dddddddd dd d|jdddddd dd d|jddddddd dd t|jddd ddd d!d t|jd"dd#ddd d$d t|jd%dd&ddd d'd t|jd(dd)ddd d*d t|jd+d,dd-dd.d d/d d0|jd1dd2ddddd d3d d|jd4dd5ddddd d6d d|jd7d8dd9ddd d:d t|jd;dd<ddddd d=d d>|jd?dd@ddddd dAd dB|j\}}|jj|_|jdCkr|jdDn|j r|j r|jdEn|j |j kr|jdFnt |j at |j a|j}|j}|r|jdk r-|jdGn|jd0}|ryt|d0}Wn&tk r~|jdH|d0nX|jd0n|r|jdIqn|dkrd0}nt}|j rt}n|j rt}nyCt|||jd |jd#|jd|jdJ|d-|j}Wn=tjk ri}tj j!dK||ftj"dLnX|j#stj j!dM|jj$|jj|jj%|jj|jj&ftj j!dNt'tt'tt'tt'dOfn|j(dk rO|j#s-tj j!dP|j(r"dQp%dRn|jj)|j(|j(|_(n|j*dk r|j#stj j!dS|j*rdQpdRn|jj+|j*|j*|_*n|j,y|j-t.Wnt/k rnX|j#stj j!dTn|j-dS(UNitusages!%prog [options] [port [baudrate]]t descriptions9Miniterm - A simple terminal program for the serial port.s-ps--porttdestRSthelpsKport, a number or a device name. (deprecated option, use parameter instead)tdefaults-bs--baudRTtactiontstorettypeRsset baud rate, default %defaulti%s--parityRDs-set parity, one of [N, E, O, S, M], default=NtNs-es--echoRt store_truesenable local echo (default off)s--rtsctsREs)enable RTS/CTS flow control (default off)s --xonxoffRFs*enable software flow control (default off)s--crtcrsdo not send CR+LF, send CR onlys--lftlfsdo not send CR+LF, send LF onlys-Ds--debugRKtcountsdebug received data (escape non-printable chars) --debug can be given multiple times: 0: just print what is received 1: escape non-printable characters, do newlines as unusual 2: escape non-printable characters, newlines too 3: hex dump everythingis--rtsRPs2set initial RTS line state (possible values: 0, 1)s--dtrROs2set initial DTR line state (possible values: 0, 1)s-qs--quiettquietssuppress non error messagess --exit-chart exit_charsDASCII code of special character that is used to exit the applicationis --menu-chart menu_charsGASCII code of special character that is used to control miniterm (menu)itNEOSMsinvalid paritys)only one of --cr or --lf can be specifieds.--exit-char can not be the same as --menu-chars;no arguments are allowed, options only when --port is givens"baud rate must be a number, not %rstoo many argumentsRLscould not open port %r: %s is$--- Miniterm on %s: %d,%s,%s,%s --- s8--- Quit: %s | Menu: %s | Help: %s followed by %s --- ss--- forcing DTR %s ReRfs--- forcing RTS %s s --- exit --- (0toptparset OptionParsert add_optionRRQt parse_argsRDtupperterrorRRRRtchrRRRSRTtpopRRRvRtRwRCRERFRRKRRpR*RgRhRRRiRjRkRRORRPRR\R^R"R( RtparsertoptionstargsRSRTRLtminitermR{((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pytmains0                                   & &   t__main__(R*R9RRWRRRRt version_infoRtnameR#tobjectRR=R.R>RtexitfunctNotImplementedErrortplatformRvRtRwRMRrRqRCRR'(((s9/usr/lib/python2.7/site-packages/serial/tools/miniterm.pyt s<0 (    $    ) PK[  )site-packages/serial/tools/list_ports.pyonu[ VNc@sdZddlZddlZddlZddlZejdkrRddlTn2ejdkrnddlTnedejfdZdZ e d kre ndS( sAThis module will provide a function called comports that returns an iterable (generator or list) that will enumerate available com ports. Note that on some systems non-existent ports may be listed. Additionally a grep function is supplied that can be used to search for ports based on their descriptions or hardware ID. iNtnt(t*tposixs;Sorry: no implementation for your platform ('%s') availableccsnxgtD]\\}}}tj||tjsUtj||sUtj||r |||fVq q WdS(s Search for ports using a regular expression. Port name, description and hardware ID are searched. The function returns an iterable that returns the same tuples as comport() would do. N(tcomportstretsearchtI(tregexptporttdescthwid((s;/usr/lib/python2.7/site-packages/serial/tools/list_ports.pytgrep#s<c Csddl}|jdddd}|jdddd d d td d |jddddd dd dd d|jddddd dd ddd|j\}}d}|rt|dkr|jdnd|dfGHtt|d}ntt }xW|D]O\}}}d|fGH|j dkr]d|fGHd|fGHn|d7}qW|j r|rd|fGHqd GHndS(!Nitusages%prog [options] []t descriptions9Miniterm - A simple terminal program for the serial port.s--debugthelps6print debug messages and tracebacks (development mode)tdesttdebugtdefaulttactiont store_trues-vs --verboses0show more messages (can be given multiple times)tverboseitcounts-qs--quietssuppress all messagest store_consttconstis"more than one regexp not supportedsFiltered list with regexp: %rs%-20ss desc: %ss hwid: %ss%d ports foundsno ports found( toptparset OptionParsert add_optiontFalset parse_argstlenterrortsortedR RR( RtparsertoptionstargsthitstiteratorRR R ((s;/usr/lib/python2.7/site-packages/serial/tools/list_ports.pytmain.sJ       t__main__( t__doc__tsystosRtnametserial.tools.list_ports_windowstserial.tools.list_ports_posixt ImportErrorR R%t__name__(((s;/usr/lib/python2.7/site-packages/serial/tools/list_ports.pyts$    4 PK[o (site-packages/serial/tools/list_ports.pynu[#!/usr/bin/env python # portable serial port access with python # this is a wrapper module for different platform implementations of the # port enumeration feature # # (C) 2011 Chris Liechti # this is distributed under a free software license, see license.txt """\ This module will provide a function called comports that returns an iterable (generator or list) that will enumerate available com ports. Note that on some systems non-existent ports may be listed. Additionally a grep function is supplied that can be used to search for ports based on their descriptions or hardware ID. """ import sys, os, re # chose an implementation, depending on os #~ if sys.platform == 'cli': #~ else: import os # chose an implementation, depending on os if os.name == 'nt': #sys.platform == 'win32': from serial.tools.list_ports_windows import * elif os.name == 'posix': from serial.tools.list_ports_posix import * #~ elif os.name == 'java': else: raise ImportError("Sorry: no implementation for your platform ('%s') available" % (os.name,)) def grep(regexp): """\ Search for ports using a regular expression. Port name, description and hardware ID are searched. The function returns an iterable that returns the same tuples as comport() would do. """ for port, desc, hwid in comports(): if re.search(regexp, port, re.I) or re.search(regexp, desc) or re.search(regexp, hwid): yield port, desc, hwid def main(): import optparse parser = optparse.OptionParser( usage = "%prog [options] []", description = "Miniterm - A simple terminal program for the serial port." ) parser.add_option("--debug", help="print debug messages and tracebacks (development mode)", dest="debug", default=False, action='store_true') parser.add_option("-v", "--verbose", help="show more messages (can be given multiple times)", dest="verbose", default=1, action='count') parser.add_option("-q", "--quiet", help="suppress all messages", dest="verbose", action='store_const', const=0) (options, args) = parser.parse_args() hits = 0 # get iteraror w/ or w/o filter if args: if len(args) > 1: parser.error('more than one regexp not supported') print "Filtered list with regexp: %r" % (args[0],) iterator = sorted(grep(args[0])) else: iterator = sorted(comports()) # list them for port, desc, hwid in iterator: print "%-20s" % (port,) if options.verbose > 1: print " desc: %s" % (desc,) print " hwid: %s" % (hwid,) hits += 1 if options.verbose: if hits: print "%d ports found" % (hits,) else: print "no ports found" # test if __name__ == '__main__': main() PK[N ''#site-packages/serial/serialjava.pyonu[ {QNc@sdddlTdZdZeddgZdZdefdYZydd lZWn*ek rd ee fd YZ nXd eej fd YZ e d kr`e dddde dededdddddZejdejdejejejdejjdejdejjdej[nd S(i(t*cCsCt|}|jd}x!|dD]}t||}q&W|S(Nt.i(t __import__tsplittgetattr(tnametmodt componentstcomp((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt my_import s  cCsVxC|D];}yt|}|j|SWqttfk rAqXqWtddS(s1try given list of modules and return that importss/No Java Communications API implementation foundN(R t SerialPortt ImportErrortAttributeError(tnamesRR((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytdetect_java_comms  s javax.commsgnu.iocCsjtjj}g}xD|jr[|j}|jtjjkr|j|qqW||jS(s%Turn a port number into a device name( tcommtCommPortIdentifiertgetPortIdentifiersthasMoreElementst nextElementt getPortTypet PORT_SERIALtappendtgetName(t portnumbertenumtportstel((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytdevice)s t JavaSerialcBseZdZdZdZdZdZdZddZdZ d Z d Z d d Z dd Z ddZddZdZdZdZdZRS(sSerial port class, implemented with Java Communications API and thus usable with jython and the appropriate java extension.cCs|jdkrtdn|jr6tdnt|jtdkritjj|j}ntjjt|j}y|j dd|_ Wn,t k r}d|_ td|nX|j |j j |_|j j|_t|_dS(sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.tspython serial modulei sCould not open port: %sN(t_porttNonetSerialExceptiont_isOpenttypeRRtgetPortIdentifierRtopentsPortt Exceptiont_reconfigurePorttgetInputStreamt _instreamtgetOutputStreamt _outstreamtTrue(tselftportIdtmsg((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR%8s    cCs|jstdn|jjd|jtkrFtjj}nm|jtkrdtjj }nO|jt krtjj }n1|jt krtjj }ntd|j|jtkrtjj}nOttkrtjj|_n1|jtkr tjj}ntd|j|jtkr>tjj}n|jtkr\tjj}nm|jtkrztjj}nO|jtkrtjj}n1|jtkrtjj}ntd|jd}}|jr|tjjO}|tjj O}n|j!r+|tjj"O}|tjj#O}n|jj$|j%||||jj&||B|j'dkr|jj|j'dn |jj(dS( s,Set communication parameters on opened port.s'Can only operate on a valid port handleisunsupported bytesize: %rs"unsupported number of stopbits: %rsunsupported parity type: %riiN()R&R!tenableReceiveTimeoutt _bytesizetFIVEBITSRR t DATABITS_5tSIXBITSt DATABITS_6t SEVENBITSt DATABITS_7t EIGHTBITSt DATABITS_8t ValueErrort _stopbitst STOPBITS_ONEt STOPBITS_1tstopbitstSTOPBITS_ONE_POINT_FIVEt STOPBITS_1_5t _jstopbitst STOPBITS_TWOt STOPBITS_2t_parityt PARITY_NONEt PARITY_EVENt PARITY_ODDt PARITY_MARKt PARITY_SPACEt_rtsctstFLOWCONTROL_RTSCTS_INtFLOWCONTROL_RTSCTS_OUTt_xonxofftFLOWCONTROL_XONXOFF_INtFLOWCONTROL_XONXOFF_OUTtsetSerialPortParamst _baudratetsetFlowControlModet_timeouttdisableReceiveTimeout(R.t jdatabitst jstopbitstjparitytjflowintjflowout((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR(MsT     cCsU|jrQ|jrE|jj|jj|jjd|_nt|_ndS(s Close portN(R"R&R*tcloseR,R tFalse(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR[s      cCs t|S(N(R(R.tport((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytmakeDeviceNamescCs|jstn|jjS(s>Return the number of characters currently in the input buffer.(R&tportNotOpenErrorR*t available(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt inWaitings icCs|jstnt}|dkrxWt||kr}|jj}|dkrm|jdkrzPqzq*|j|q*Wnt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.ii( R&R_t bytearraytlenR*treadttimeoutRtbytes(R.tsizeRdtx((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRds    cCs`|jstnt|ttfsFtdtt|fn|jj|t |S(s-Output the given string over the serial port.s expected %s or bytearray, got %s( R&R_t isinstanceRfRbt TypeErrorR#R,twriteRc(R.tdata((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRks  cCs/|jstn|jj|jjdS(s9Clear input buffer, discarding all that is in the buffer.N(R&R_R*tskipR`(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt flushInputs cCs#|jstn|jjdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(R&R_R,tflush(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt flushOutputs g?cCs*|jstn|jj|ddS(sHSend break condition. Timed, returns to idle state after given duration.g@@N(R&R_t sendBreak(R.tduration((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRqs cCs(|jdkrtntddS(sBSet break: Controls TXD. When active, to transmitting is possible.s1The setBreak function is not implemented in java.N(tfdR R_R!(R.tlevel((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytsetBreaks cCs&|jstn|jj|dS(s)Set terminal status line: Request To SendN(R&R_tsetRTS(R.Rt((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRvs cCs&|jstn|jj|dS(s-Set terminal status line: Data Terminal ReadyN(R&R_tsetDTR(R.Rt((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRws cCs#|jstn|jjdS(s(Read terminal status line: Clear To SendN(R&R_tisCTS(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetCTSs cCs#|jstn|jjdS(s)Read terminal status line: Data Set ReadyN(R&R_tisDSR(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetDSRs cCs#|jstn|jjdS(s)Read terminal status line: Ring IndicatorN(R&R_tisRI(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetRIs cCs#|jstn|jjdS(s)Read terminal status line: Carrier DetectN(R&R_tisCD(R.((s5/usr/lib/python2.7/site-packages/serial/serialjava.pytgetCDs (t__name__t __module__t__doc__R%R(R[R^RaRdRkRnRpRqRuRvRwRyR{R}R(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyR4s$  7             NtSerialcBseZRS((RR(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRscBseZRS((RR(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyRst__main__itbaudrateiKtbytesizetparityR?Reitxonxofftrtsctsithellos%r is%s (tserial.serialutilR RRRt SerialBaseRtioR tFileLikeRt RawIOBaseRR9RGR=tsRvRwRnRpRktsyststdioRdRa(((s5/usr/lib/python2.7/site-packages/serial/serialjava.pyt s:              PK[0!77$site-packages/serial/serialwin32.pyonu[ {QNc@s1ddlZddlmZddlTdZdefdYZyddlZWn*ek rdee fdYZ nXdeej fd YZ e d kr-e d Z ejjd e e Z ejjd e d e _de _e jd e _e jejjd e ndS(iN(twin32(t*cCs d|dS(s%Turn a port number into a device namesCOM%di((tportnum((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytdevicest Win32SerialcBs eZdZd-ZdZdZdZdZdZdZ ddZ dZ dZ dZ ddZddZdd Zdd!Zd"Zd#Zd$Zd%Zd&Zed'Zd(Zd)Zd*Zeeed+d,ZRS(.s5Serial port implementation for Win32 based on ctypes.i2iKiniiii,iXiii` ii%iKiiicOs)d|_t|_tj|||dS(N(tNonethComPorttFalset _rtsTogglet SerialBaset__init__(tselftargstkwargs((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyR s  c Cs|jd krtdn|jr6tdn|j}y<|jjdrzt|ddkrzd|}nWntk rnXt j |t j t j Bdd t j t jt jBd|_|jt jkrd |_td|jtjfnt j|jd d t j|_t j|jtj|jt j|_t j|_|jt j|jt jt j Bt j!Bt j"Bt j#|_$t j%d d dd |j$_&t j#|_'t j%d ddd |j'_&t(|_d S( sjOpen port with current settings. This may throw a SerialException if the port cannot be opened.s.Port must be configured before it can be used.sPort is already open.tCOMiis\\.\iscould not open port %s: %siiN()t_portRtSerialExceptiont_isOpentportstrtuppert startswithtintt ValueErrorRt CreateFilet GENERIC_READt GENERIC_WRITEt OPEN_EXISTINGtFILE_ATTRIBUTE_NORMALtFILE_FLAG_OVERLAPPEDRtINVALID_HANDLE_VALUEtctypestWinErrort SetupCommt COMMTIMEOUTSt _orgTimeoutstGetCommTimeoutstbyreftRTS_CONTROL_ENABLEt _rtsStatetDTR_CONTROL_ENABLEt _dtrStatet_reconfigurePortt PurgeCommt PURGE_TXCLEARt PURGE_TXABORTt PURGE_RXCLEARt PURGE_RXABORTt OVERLAPPEDt_overlappedReadt CreateEventthEventt_overlappedWritetTrue(R tport((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytopen!sB  +      "    cCs^|jstdn|jdkr0d}nL|jdkrZtjddddf}n"ddt|jdddf}|jdkr|jdk rt|jdf|d}n|jdkrnJ|jdkr|d dtjf}n!|d dt|jdf}tj |jt j tj |tj |jtjtj}tj|jt j ||j|_|jtkrd|_nd|jtkrd|_nI|jtkrd|_n.|jtkrd |_ntd |j|jtkr,tj|_d|_n|jtkrStj |_d|_n|jt!krztj"|_d|_na|jt#krtj$|_d|_n:|jt%krtj&|_d|_ntd |j|j't(krtj)|_*nO|j't+krtj,|_*n1|j't-kr5tj.|_*ntd |j'd|_/|j0ritj1|_2n$|j3rtj4|_2n |j5|_2|j6rtj7|_8n |j9|_8|j3rd|_:n |j0|_:|j6|_;|j<|_=|j<|_>d|_?d|_@d|_AtB|_CtD|_EtjF|jt j |sZtd t jGndS(s,Set communication parameters on opened port.s'Can only operate on a valid port handleiiiiiiiis#Unsupported number of data bits: %rsUnsupported parity mode: %rs#Unsupported number of stop bits: %rsCCannot configure port, some setting was wrong. Original message: %sN(iiiii(HRRt_timeoutRRtMAXDWORDRt_interCharTimeoutt _writeTimeouttSetCommTimeoutsRR$R!t SetCommMasktEV_ERRtDCBt GetCommStatet _baudratetBaudRatet _bytesizetFIVEBITStByteSizetSIXBITSt SEVENBITSt EIGHTBITSRt_parityt PARITY_NONEtNOPARITYtParitytfParityt PARITY_EVENt EVENPARITYt PARITY_ODDt ODDPARITYt PARITY_MARKt MARKPARITYt PARITY_SPACEt SPACEPARITYt _stopbitst STOPBITS_ONEt ONESTOPBITtStopBitstSTOPBITS_ONE_POINT_FIVEt ONE5STOPBITSt STOPBITS_TWOt TWOSTOPBITStfBinaryt_rtsctstRTS_CONTROL_HANDSHAKEt fRtsControlRtRTS_CONTROL_TOGGLER&t_dsrdtrtDTR_CONTROL_HANDSHAKEt fDtrControlR(t fOutxCtsFlowt fOutxDsrFlowt_xonxofftfOutXtfInXtfNullt fErrorChart fAbortOnErrortXONtXonChartXOFFtXoffChart SetCommStateR(R ttimeoutstcomDCB((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyR)Vs  "!!%                                 cCsz|jrv|jrjtj|j|jtj|jtj|jjtj|jjd|_nt |_ndS(s Close portN( RRRR;R"t CloseHandleR0R2R3RR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytcloses   cCs t|S(N(R(R R5((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytmakeDeviceNamescCsXtj}tj}tj|jtj|tj|sQtdn|jS(s>Return the number of characters currently in the input buffer.scall to ClearCommError failed( RtDWORDtCOMSTATtClearCommErrorRRR$RtcbInQue(R tflagstcomstat((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt inWaitings   *ic CsE|jstn|dkr2tj|jjtj}tj}tj|jt j |t j |st dn|j dkrlt |j|}|dkr`t j|}tj}tj|j||t j |t j |j}| r2tjtjkr2t dt jntj|jjtj}|j|j }q/t}q;t j|}tj}tj|j||t j |t j |j}| rtjtjkrt dt jntj|jt j |jt j |t}|j|j }n t}t|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.iscall to ClearCommError failedsReadFile failed (%s)(RtportNotOpenErrorRt ResetEventR0R2RwRxRyRR$RttimeouttminRztcreate_string_buffertReadFilet GetLastErrortERROR_IO_PENDINGRtWaitForSingleObjecttINFINITEtrawtvaluetbytestGetOverlappedResultR4( R tsizeR{R|tntbuftrcterrtread((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRs8    *  3  30 cCs|jstnt|}|rtj}tj|j|t|tj||j }| rtj tj krt dtj n|jdkrtj|j|j tj|t}|jt|krtqn|jSdSdS(s-Output the given string over the serial port.sWriteFile failed (%s)iN(RR~RRRwt WriteFiletlenRR$R3RRRRR:RR4RtwriteTimeoutError(R tdataRR((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytwrites   0' cCs3|jstntj|jtjtjBdS(s9Clear input buffer, discarding all that is in the buffer.N(RR~RR*R-R.(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt flushInputs cCs3|jstntj|jtjtjBdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(RR~RR*R+R,(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt flushOutputs g?cCsO|jstnddl}tj|j|j|tj|jdS(sHSend break condition. Timed, returns to idle state after given duration.iN(RR~ttimeRt SetCommBreaktsleeptClearCommBreak(R tdurationR((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt sendBreaks    cCs?|jstn|r+tj|jntj|jdS(sBSet break: Controls TXD. When active, to transmitting is possible.N(RR~RRR(R tlevel((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetBreak's  cCsc|jstn|r=tj|_tj|jtjn"tj|_tj|jtjdS(s)Set terminal status line: Request To SendN( RR~RR%R&tEscapeCommFunctiontSETRTStRTS_CONTROL_DISABLEtCLRRTS(R R((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetRTS/s   cCsc|jstn|r=tj|_tj|jtjn"tj|_tj|jtjdS(s-Set terminal status line: Data Terminal ReadyN( RR~RR'R(RtSETDTRtDTR_CONTROL_DISABLEtCLRDTR(R R((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetDTR9s   cCs/tj}tj|jtj||jS(N(RRwtGetCommModemStatusRRR$R(R tstat((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt_GetCommModemStatusCs cCs)|jstntj|j@dkS(s(Read terminal status line: Clear To Sendi(RR~Rt MS_CTS_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetCTSHs cCs)|jstntj|j@dkS(s)Read terminal status line: Data Set Readyi(RR~Rt MS_DSR_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetDSRMs cCs)|jstntj|j@dkS(s)Read terminal status line: Ring Indicatori(RR~Rt MS_RING_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetRIRs cCs)|jstntj|j@dkS(s)Read terminal status line: Carrier Detecti(RR~Rt MS_RLSD_ONR(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytgetCDWs cCsK|jstn|r1tj|jtjntj|jtjdS(s#Platform specific - set flow state.N(RR~RRtSETXONtSETXOFF(R R((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pytsetXON^s  cCsXtj}tj}tj|jtj|tj|sQtdn|jS(s5return how many characters the in the outgoing bufferscall to ClearCommError failed( RRwRxRyRRR$RtcbOutQue(R R{R|((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt outWaitingfs   *cCs#||_|jr|jndS(s"Change RTS toggle control setting.N(RRR)(R t rtsToggle((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt setRtsToggleos  cCs|jS(s+Get the current RTS toggle control setting.(R(R ((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt getRtsToggletstdocsRTS toggle control setting(i2iKiniiii,iXiii` ii%iKiii(t__name__t __module__t__doc__t BAUDRATESR R6R)RuRvR}RRRRRRRRRRRRRR4RRRRtpropertyR(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRs6  5 i   #             tSerialcBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRscBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyRst__main__is%s iKi(RtserialRtserial.serialutilRR Rtiot ImportErrortFileLikeRt RawIOBaseRtstsyststdoutRtbaudratetdatabitsRuR5R6(((s6/usr/lib/python2.7/site-packages/serial/serialwin32.pyt s*   i         PK[ 3W&V&V$site-packages/serial/serialposix.pycnu[ {QNc0@sddlZddlZddlZddlZddlZddlZddlZddlZddlTej dkrddl Z neZ ej dkrddl Z neZ ej j Zed dkrdZdZd Zd Zid d 6d d 6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d1d26d3d46d5d66d7d86d9d:6d;d<6d=d>6d?d@6dAdB6dCdD6dEdF6ZnedGkrdHZdIZiZnedJkrdKZdLZiZned dMkpLed dNkpLed dOkrjdPZdQZiZnxed dRkrejdjdSZeed dkrdTZn dUZdVZiZned dWkrdXZdYZiZned dZkr&d[Zd\ZiZned d]krQd^Zd_ZiZned d`kr|daZdbZiZnfed dckrddZdeZiZn;ejjdfej ejefdgZdhZiZee dioe jpdjZee dkoe jpdlZee dmo3e jp9dnZee dooQe j pWdpZ ee dqooe j!pudZ!ee droe j"pdZ"ee dsoe j#pdtZ#ee duoe j$pdvZ$ee dwoe j%pdxZ%ee dyoe j&p dzZ&ee d{o#e j'p)e$Z'ee d|oAe j(pGe%Z(ee d}o_e j)ped~Z*ej+dd Z,ej+de"Z-ej+de!Z.ee doe j/pdZ/ee doe j0pdZ0de1fdYZ2yddl3Z3Wn*e4k r,de2e5fdYZ6nXde2e3j7fdYZ6de6fdYZ8e9dkre6d dd&de:de;de<dddd dd Z=e=j>d e=j?d e=j@e=jAe=jdejBjde=jCdejBjde=jD[=ndS(iN(t*iiitlinuxcCsd|S(Ns /dev/ttyS%d((tport((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytdevice$si0i0cCsddl}|jddgd}tj|jtj||d||d<|dctM<|dctO||ndS(s,Set communication parameters on opened port.s+Can only operate on a valid file descriptoriii sCould not configure port: %stECHOCTLtECHOKEtIUCLCtPARMRKsB%stB38400sInvalid baud rate: %riiiisInvalid char len: %rs"Invalid stop bit specification: %rsInvalid parity: %rtIXANYtCRTSCTSt CNEW_RTSCTSisInvalid vmin: %r sInvalid vtime: %rN(RGRH(?RR9R&t_interCharTimeouttintttermiost tcgetattrterrorR tCLOCALtCREADtICANONtECHOtECHOEtECHOKtECHONLtISIGtIEXTENthasattrtgetattrtOPOSTtINLCRtIGNCRtICRNLtIGNBRKRIRJt _baudratetAttributeErrortbaudrate_constantstKeyErrorRtCSIZEt _bytesizetCS8tCS7tCS6tCS5t _stopbitst STOPBITS_ONEtCSTOPBtSTOPBITS_ONE_POINT_FIVEt STOPBITS_TWOtINPCKtISTRIPt_parityt PARITY_NONEtPARENBtPARODDt PARITY_EVENt PARITY_ODDt_xonxofftIXONtIXOFFRLt_rtsctsRMRNtVMINtVTIMEt tcsetattrtTCSANOWR(REt custom_baudtvmintvtimet orig_attrtiflagtoflagtcflagtlflagtispeedtospeedtccRFtflag((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRB)s 5 #          !1 cCsD|jr@|jdk r4tj|jd|_nt|_ndS(s Close portN(R:RR9R;RCtFalse(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRCs   cCs t|S(N(R(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytmakeDeviceNamescCs,tj|jtt}tjd|dS(s>Return the number of characters currently in the input buffer.R4i(RRRtTIOCINQtTIOCM_zero_strtstructtunpack(REts((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt inWaitingsicCs|jstnt}xt||krtj|jggg|j\}}}|sdPntj|j|t|}|st dn|j |qWt |S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.sLdevice reports readiness to read but returned no data (device disconnected?)( R:tportNotOpenErrort bytearraytlentselectRt_timeoutR;treadR&textendtbytes(REtsizeRtreadyt_R((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRs  *c CsJ|jstnt|}|}|jdk rX|jdkrXtj|j}nd}x|dkr?ytj|j|}|r|tj}|dkrt nt j g|jgg|\}}}|st qn||}||}Wqat k r;} | j t j kr<td| fq<qaXqaWt|S(s-Output the given string over the serial port.iswrite failed: %sN(R:RRt _writeTimeoutR9ttimeR;twriteRtwriteTimeoutErrorRtOSErrorterrnotEAGAINR&( REtdatatttdttimeouttnttimeleftRRtv((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRs.    '  cCs|jdS(sTFlush of file like objects. In this case, wait until all data is written.N(t drainOutput(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytflushscCs,|jstntj|jtjdS(s9Clear input buffer, discarding all that is in the buffer.N(R:RRQttcflushRR tTCIFLUSH(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt flushInputs cCs,|jstntj|jtjdS(sbClear output buffer, aborting the current output and discarding all that is in the buffer.N(R:RRQRRR tTCOFLUSH(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt flushOutputs g?cCs3|jstntj|jt|ddS(sHSend break condition. Timed, returns to idle state after given duration.g?N(R:RRQt tcsendbreakRRP(REtduration((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt sendBreaks cCsK|jdkrtn|r4tj|jtntj|jtdS(sBSet break: Controls TXD. When active, no transmitting is possible.N(RR9RRRR5R6(REtlevel((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytsetBreaks  cCsK|jstn|r1tj|jttntj|jttdS(s)Set terminal status line: Request To SendN(R:RRRRR(t TIOCM_RTS_strR)(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytsetRTS s  cCsK|jstn|r1tj|jttntj|jttdS(s-Set terminal status line: Data Terminal ReadyN(R:RRRRR(t TIOCM_DTR_strR)(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytsetDTRs  cCsH|jstntj|jtt}tjd|dt @dkS(s(Read terminal status line: Clear To SendR4i( R:RRRRR'RRRR-(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetCTSs cCsH|jstntj|jtt}tjd|dt @dkS(s)Read terminal status line: Data Set ReadyR4i( R:RRRRR'RRRR0(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetDSRs cCsH|jstntj|jtt}tjd|dt @dkS(s)Read terminal status line: Ring IndicatorR4i( R:RRRRR'RRRR2(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetRI%s cCsH|jstntj|jtt}tjd|dt @dkS(s)Read terminal status line: Carrier DetectR4i( R:RRRRR'RRRR1(RER((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytgetCD+s cCs&|jstntj|jdS(sinternal - not portable!N(R:RRQttcdrainR(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR3s cCs2|jstntj|jtjtjdS(sinternal - not portable!N(R:RRRRtF_SETFLR;R@(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt nonblocking8s cCs|jstn|jS(sFor easier use of the serial port instance with select. WARNING: this function is not portable to different platforms!(R:RR(RE((s6/usr/lib/python2.7/site-packages/serial/serialposix.pytfileno=s cCsK|jstn|r1tj|jtjntj|jtjdS(sQmanually control flow - when hardware or software flow control is enabledN(R:RRQttcflowRR tTCIONtTCIOFF(REtenable((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyt flowControlCs  (t__name__t __module__t__doc__R<RBRCRRRRRRRRRRRRRRRRRRR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR7s. z                   tSerialcBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRTscBseZRS((RR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyRXstPosixPollSerialcBseZdZddZRS(spoll based read implementation. not all systems support poll properly. however this one has better handling of errors, such as a device disconnecting while it's in use (e.g. USB-serial unplugged)icCsN|jdkrtnt}tj}|j|jtjtjBtj Btj B|dkrDxt ||kr@xN|j|j dD]6\}}|tjtj Btj B@rt dqqWtj|j|t |}|j||j dk r|j dks2|jdk rg|jdkrg| rgPqgqgWnt|S(sRead size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.iisdevice reports error (poll)N(RR9RRRtpolltregistertPOLLINtPOLLERRtPOLLHUPtPOLLNVALRRR&R;RRROR(RERRRRteventR((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR`s    + # % (RRRR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyR[st__main__RtbytesizetparitytstopbitsRtxonxofftrtsctsthellos%r s%s (EtsysR;RRQRRRRtserial.serialutilt hexversionR RtplatformtlowertplatRR R RRftunametsplittversionRPtstderrRtnametVERSIONR]R'R(R)R*R+R,R-R.R/R0R1R2R3RtpackRRRR5R6t SerialBaseR7tiot ImportErrortFileLikeRt RawIOBaseRRt EIGHTBITSRyRoRRRRRtstdoutRR(((s6/usr/lib/python2.7/site-packages/serial/serialposix.pyts `                                      M         PK[.ydsite-packages/serial/rfc2217.pynu[#! python # # Python Serial Port Extension for Win32, Linux, BSD, Jython # see __init__.py # # This module implements a RFC2217 compatible client. RF2217 descibes a # protocol to access serial ports over TCP/IP and allows setting the baud rate, # modem control lines etc. # # (C) 2001-2009 Chris Liechti # this is distributed under a free software license, see license.txt # TODO: # - setting control line -> answer is not checked (had problems with one of the # severs). consider implementing a compatibility mode flag to make check # conditional # - write timeout not implemented at all ############################################################################## # observations and issues with servers #============================================================================= # sredird V2.2.1 # - http://www.ibiblio.org/pub/Linux/system/serial/ sredird-2.2.2.tar.gz # - does not acknowledge SET_CONTROL (RTS/DTR) correctly, always responding # [105 1] instead of the actual value. # - SET_BAUDRATE answer contains 4 extra null bytes -> probably for larger # numbers than 2**32? # - To get the signature [COM_PORT_OPTION 0] has to be sent. # - run a server: while true; do nc -l -p 7000 -c "sredird debug /dev/ttyUSB0 /var/lock/sredir"; done #============================================================================= # telnetcpcd (untested) # - http://ftp.wayne.edu/kermit/sredird/telnetcpcd-1.09.tar.gz # - To get the signature [COM_PORT_OPTION] w/o data has to be sent. #============================================================================= # ser2net # - does not negotiate BINARY or COM_PORT_OPTION for his side but at least # acknowledges that the client activates these options # - The configuration may be that the server prints a banner. As this client # implementation does a flushInput on connect, this banner is hidden from # the user application. # - NOTIFY_MODEMSTATE: the poll interval of the server seems to be one # second. # - To get the signature [COM_PORT_OPTION 0] has to be sent. # - run a server: run ser2net daemon, in /etc/ser2net.conf: # 2000:telnet:0:/dev/ttyS0:9600 remctl banner ############################################################################## # How to identify ports? pySerial might want to support other protocols in the # future, so lets use an URL scheme. # for RFC2217 compliant servers we will use this: # rfc2217://:[/option[/option...]] # # options: # - "debug" print diagnostic messages # - "ign_set_control": do not look at the answers to SET_CONTROL # - "poll_modem": issue NOTIFY_MODEMSTATE requests when CTS/DTR/RI/CD is read. # Without this option it expects that the server sends notifications # automatically on change (which most servers do and is according to the # RFC). # the order of the options is not relevant from serial.serialutil import * import time import struct import socket import threading import Queue import logging # port string is expected to be something like this: # rfc2217://host:port # host may be an IP or including domain, whatever. # port is 0...65535 # map log level names to constants. used in fromURL() LOGGER_LEVELS = { 'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARNING, 'error': logging.ERROR, } # telnet protocol characters IAC = to_bytes([255]) # Interpret As Command DONT = to_bytes([254]) DO = to_bytes([253]) WONT = to_bytes([252]) WILL = to_bytes([251]) IAC_DOUBLED = to_bytes([IAC, IAC]) SE = to_bytes([240]) # Subnegotiation End NOP = to_bytes([241]) # No Operation DM = to_bytes([242]) # Data Mark BRK = to_bytes([243]) # Break IP = to_bytes([244]) # Interrupt process AO = to_bytes([245]) # Abort output AYT = to_bytes([246]) # Are You There EC = to_bytes([247]) # Erase Character EL = to_bytes([248]) # Erase Line GA = to_bytes([249]) # Go Ahead SB = to_bytes([250]) # Subnegotiation Begin # selected telnet options BINARY = to_bytes([0]) # 8-bit data path ECHO = to_bytes([1]) # echo SGA = to_bytes([3]) # suppress go ahead # RFC2217 COM_PORT_OPTION = to_bytes([44]) # Client to Access Server SET_BAUDRATE = to_bytes([1]) SET_DATASIZE = to_bytes([2]) SET_PARITY = to_bytes([3]) SET_STOPSIZE = to_bytes([4]) SET_CONTROL = to_bytes([5]) NOTIFY_LINESTATE = to_bytes([6]) NOTIFY_MODEMSTATE = to_bytes([7]) FLOWCONTROL_SUSPEND = to_bytes([8]) FLOWCONTROL_RESUME = to_bytes([9]) SET_LINESTATE_MASK = to_bytes([10]) SET_MODEMSTATE_MASK = to_bytes([11]) PURGE_DATA = to_bytes([12]) SERVER_SET_BAUDRATE = to_bytes([101]) SERVER_SET_DATASIZE = to_bytes([102]) SERVER_SET_PARITY = to_bytes([103]) SERVER_SET_STOPSIZE = to_bytes([104]) SERVER_SET_CONTROL = to_bytes([105]) SERVER_NOTIFY_LINESTATE = to_bytes([106]) SERVER_NOTIFY_MODEMSTATE = to_bytes([107]) SERVER_FLOWCONTROL_SUSPEND = to_bytes([108]) SERVER_FLOWCONTROL_RESUME = to_bytes([109]) SERVER_SET_LINESTATE_MASK = to_bytes([110]) SERVER_SET_MODEMSTATE_MASK = to_bytes([111]) SERVER_PURGE_DATA = to_bytes([112]) RFC2217_ANSWER_MAP = { SET_BAUDRATE: SERVER_SET_BAUDRATE, SET_DATASIZE: SERVER_SET_DATASIZE, SET_PARITY: SERVER_SET_PARITY, SET_STOPSIZE: SERVER_SET_STOPSIZE, SET_CONTROL: SERVER_SET_CONTROL, NOTIFY_LINESTATE: SERVER_NOTIFY_LINESTATE, NOTIFY_MODEMSTATE: SERVER_NOTIFY_MODEMSTATE, FLOWCONTROL_SUSPEND: SERVER_FLOWCONTROL_SUSPEND, FLOWCONTROL_RESUME: SERVER_FLOWCONTROL_RESUME, SET_LINESTATE_MASK: SERVER_SET_LINESTATE_MASK, SET_MODEMSTATE_MASK: SERVER_SET_MODEMSTATE_MASK, PURGE_DATA: SERVER_PURGE_DATA, } SET_CONTROL_REQ_FLOW_SETTING = to_bytes([0]) # Request Com Port Flow Control Setting (outbound/both) SET_CONTROL_USE_NO_FLOW_CONTROL = to_bytes([1]) # Use No Flow Control (outbound/both) SET_CONTROL_USE_SW_FLOW_CONTROL = to_bytes([2]) # Use XON/XOFF Flow Control (outbound/both) SET_CONTROL_USE_HW_FLOW_CONTROL = to_bytes([3]) # Use HARDWARE Flow Control (outbound/both) SET_CONTROL_REQ_BREAK_STATE = to_bytes([4]) # Request BREAK State SET_CONTROL_BREAK_ON = to_bytes([5]) # Set BREAK State ON SET_CONTROL_BREAK_OFF = to_bytes([6]) # Set BREAK State OFF SET_CONTROL_REQ_DTR = to_bytes([7]) # Request DTR Signal State SET_CONTROL_DTR_ON = to_bytes([8]) # Set DTR Signal State ON SET_CONTROL_DTR_OFF = to_bytes([9]) # Set DTR Signal State OFF SET_CONTROL_REQ_RTS = to_bytes([10]) # Request RTS Signal State SET_CONTROL_RTS_ON = to_bytes([11]) # Set RTS Signal State ON SET_CONTROL_RTS_OFF = to_bytes([12]) # Set RTS Signal State OFF SET_CONTROL_REQ_FLOW_SETTING_IN = to_bytes([13]) # Request Com Port Flow Control Setting (inbound) SET_CONTROL_USE_NO_FLOW_CONTROL_IN = to_bytes([14]) # Use No Flow Control (inbound) SET_CONTROL_USE_SW_FLOW_CONTOL_IN = to_bytes([15]) # Use XON/XOFF Flow Control (inbound) SET_CONTROL_USE_HW_FLOW_CONTOL_IN = to_bytes([16]) # Use HARDWARE Flow Control (inbound) SET_CONTROL_USE_DCD_FLOW_CONTROL = to_bytes([17]) # Use DCD Flow Control (outbound/both) SET_CONTROL_USE_DTR_FLOW_CONTROL = to_bytes([18]) # Use DTR Flow Control (inbound) SET_CONTROL_USE_DSR_FLOW_CONTROL = to_bytes([19]) # Use DSR Flow Control (outbound/both) LINESTATE_MASK_TIMEOUT = 128 # Time-out Error LINESTATE_MASK_SHIFTREG_EMPTY = 64 # Transfer Shift Register Empty LINESTATE_MASK_TRANSREG_EMPTY = 32 # Transfer Holding Register Empty LINESTATE_MASK_BREAK_DETECT = 16 # Break-detect Error LINESTATE_MASK_FRAMING_ERROR = 8 # Framing Error LINESTATE_MASK_PARTIY_ERROR = 4 # Parity Error LINESTATE_MASK_OVERRUN_ERROR = 2 # Overrun Error LINESTATE_MASK_DATA_READY = 1 # Data Ready MODEMSTATE_MASK_CD = 128 # Receive Line Signal Detect (also known as Carrier Detect) MODEMSTATE_MASK_RI = 64 # Ring Indicator MODEMSTATE_MASK_DSR = 32 # Data-Set-Ready Signal State MODEMSTATE_MASK_CTS = 16 # Clear-To-Send Signal State MODEMSTATE_MASK_CD_CHANGE = 8 # Delta Receive Line Signal Detect MODEMSTATE_MASK_RI_CHANGE = 4 # Trailing-edge Ring Detector MODEMSTATE_MASK_DSR_CHANGE = 2 # Delta Data-Set-Ready MODEMSTATE_MASK_CTS_CHANGE = 1 # Delta Clear-To-Send PURGE_RECEIVE_BUFFER = to_bytes([1]) # Purge access server receive data buffer PURGE_TRANSMIT_BUFFER = to_bytes([2]) # Purge access server transmit data buffer PURGE_BOTH_BUFFERS = to_bytes([3]) # Purge both the access server receive data buffer and the access server transmit data buffer RFC2217_PARITY_MAP = { PARITY_NONE: 1, PARITY_ODD: 2, PARITY_EVEN: 3, PARITY_MARK: 4, PARITY_SPACE: 5, } RFC2217_REVERSE_PARITY_MAP = dict((v,k) for k,v in RFC2217_PARITY_MAP.items()) RFC2217_STOPBIT_MAP = { STOPBITS_ONE: 1, STOPBITS_ONE_POINT_FIVE: 3, STOPBITS_TWO: 2, } RFC2217_REVERSE_STOPBIT_MAP = dict((v,k) for k,v in RFC2217_STOPBIT_MAP.items()) # Telnet filter states M_NORMAL = 0 M_IAC_SEEN = 1 M_NEGOTIATE = 2 # TelnetOption and TelnetSubnegotiation states REQUESTED = 'REQUESTED' ACTIVE = 'ACTIVE' INACTIVE = 'INACTIVE' REALLY_INACTIVE = 'REALLY_INACTIVE' class TelnetOption(object): """Manage a single telnet option, keeps track of DO/DONT WILL/WONT.""" def __init__(self, connection, name, option, send_yes, send_no, ack_yes, ack_no, initial_state, activation_callback=None): """Init option. :param connection: connection used to transmit answers :param name: a readable name for debug outputs :param send_yes: what to send when option is to be enabled. :param send_no: what to send when option is to be disabled. :param ack_yes: what to expect when remote agrees on option. :param ack_no: what to expect when remote disagrees on option. :param initial_state: options initialized with REQUESTED are tried to be enabled on startup. use INACTIVE for all others. """ self.connection = connection self.name = name self.option = option self.send_yes = send_yes self.send_no = send_no self.ack_yes = ack_yes self.ack_no = ack_no self.state = initial_state self.active = False self.activation_callback = activation_callback def __repr__(self): """String for debug outputs""" return "%s:%s(%s)" % (self.name, self.active, self.state) def process_incoming(self, command): """A DO/DONT/WILL/WONT was received for this option, update state and answer when needed.""" if command == self.ack_yes: if self.state is REQUESTED: self.state = ACTIVE self.active = True if self.activation_callback is not None: self.activation_callback() elif self.state is ACTIVE: pass elif self.state is INACTIVE: self.state = ACTIVE self.connection.telnetSendOption(self.send_yes, self.option) self.active = True if self.activation_callback is not None: self.activation_callback() elif self.state is REALLY_INACTIVE: self.connection.telnetSendOption(self.send_no, self.option) else: raise ValueError('option in illegal state %r' % self) elif command == self.ack_no: if self.state is REQUESTED: self.state = INACTIVE self.active = False elif self.state is ACTIVE: self.state = INACTIVE self.connection.telnetSendOption(self.send_no, self.option) self.active = False elif self.state is INACTIVE: pass elif self.state is REALLY_INACTIVE: pass else: raise ValueError('option in illegal state %r' % self) class TelnetSubnegotiation(object): """A object to handle subnegotiation of options. In this case actually sub-sub options for RFC 2217. It is used to track com port options.""" def __init__(self, connection, name, option, ack_option=None): if ack_option is None: ack_option = option self.connection = connection self.name = name self.option = option self.value = None self.ack_option = ack_option self.state = INACTIVE def __repr__(self): """String for debug outputs.""" return "%s:%s" % (self.name, self.state) def set(self, value): """request a change of the value. a request is sent to the server. if the client needs to know if the change is performed he has to check the state of this object.""" self.value = value self.state = REQUESTED self.connection.rfc2217SendSubnegotiation(self.option, self.value) if self.connection.logger: self.connection.logger.debug("SB Requesting %s -> %r" % (self.name, self.value)) def isReady(self): """check if answer from server has been received. when server rejects the change, raise a ValueError.""" if self.state == REALLY_INACTIVE: raise ValueError("remote rejected value for option %r" % (self.name)) return self.state == ACTIVE # add property to have a similar interface as TelnetOption active = property(isReady) def wait(self, timeout=3): """wait until the subnegotiation has been acknowledged or timeout. It can also throw a value error when the answer from the server does not match the value sent.""" timeout_time = time.time() + timeout while time.time() < timeout_time: time.sleep(0.05) # prevent 100% CPU load if self.isReady(): break else: raise SerialException("timeout while waiting for option %r" % (self.name)) def checkAnswer(self, suboption): """check an incoming subnegotiation block. the parameter already has cut off the header like sub option number and com port option value.""" if self.value == suboption[:len(self.value)]: self.state = ACTIVE else: # error propagation done in isReady self.state = REALLY_INACTIVE if self.connection.logger: self.connection.logger.debug("SB Answer %s -> %r -> %s" % (self.name, suboption, self.state)) class RFC2217Serial(SerialBase): """Serial port implementation for RFC 2217 remote serial ports.""" BAUDRATES = (50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200) def open(self): """Open port with current settings. This may throw a SerialException if the port cannot be opened.""" self.logger = None self._ignore_set_control_answer = False self._poll_modem_state = False self._network_timeout = 3 if self._port is None: raise SerialException("Port must be configured before it can be used.") if self._isOpen: raise SerialException("Port is already open.") try: self._socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self._socket.connect(self.fromURL(self.portstr)) self._socket.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) except Exception, msg: self._socket = None raise SerialException("Could not open port %s: %s" % (self.portstr, msg)) self._socket.settimeout(5) # XXX good value? # use a thread save queue as buffer. it also simplifies implementing # the read timeout self._read_buffer = Queue.Queue() # to ensure that user writes does not interfere with internal # telnet/rfc2217 options establish a lock self._write_lock = threading.Lock() # name the following separately so that, below, a check can be easily done mandadory_options = [ TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE), TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED), ] # all supported telnet options self._telnet_options = [ TelnetOption(self, 'ECHO', ECHO, DO, DONT, WILL, WONT, REQUESTED), TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED), TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, REQUESTED), TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, INACTIVE), TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, REQUESTED), ] + mandadory_options # RFC 2217 specific states # COM port settings self._rfc2217_port_settings = { 'baudrate': TelnetSubnegotiation(self, 'baudrate', SET_BAUDRATE, SERVER_SET_BAUDRATE), 'datasize': TelnetSubnegotiation(self, 'datasize', SET_DATASIZE, SERVER_SET_DATASIZE), 'parity': TelnetSubnegotiation(self, 'parity', SET_PARITY, SERVER_SET_PARITY), 'stopsize': TelnetSubnegotiation(self, 'stopsize', SET_STOPSIZE, SERVER_SET_STOPSIZE), } # There are more subnegotiation objects, combine all in one dictionary # for easy access self._rfc2217_options = { 'purge': TelnetSubnegotiation(self, 'purge', PURGE_DATA, SERVER_PURGE_DATA), 'control': TelnetSubnegotiation(self, 'control', SET_CONTROL, SERVER_SET_CONTROL), } self._rfc2217_options.update(self._rfc2217_port_settings) # cache for line and modem states that the server sends to us self._linestate = 0 self._modemstate = None self._modemstate_expires = 0 # RFC 2217 flow control between server and client self._remote_suspend_flow = False self._thread = threading.Thread(target=self._telnetReadLoop) self._thread.setDaemon(True) self._thread.setName('pySerial RFC 2217 reader thread for %s' % (self._port,)) self._thread.start() # negotiate Telnet/RFC 2217 -> send initial requests for option in self._telnet_options: if option.state is REQUESTED: self.telnetSendOption(option.send_yes, option.option) # now wait until important options are negotiated timeout_time = time.time() + self._network_timeout while time.time() < timeout_time: time.sleep(0.05) # prevent 100% CPU load if sum(o.active for o in mandadory_options) == len(mandadory_options): break else: raise SerialException("Remote does not seem to support RFC2217 or BINARY mode %r" % mandadory_options) if self.logger: self.logger.info("Negotiated options: %s" % self._telnet_options) # fine, go on, set RFC 2271 specific things self._reconfigurePort() # all things set up get, now a clean start self._isOpen = True if not self._rtscts: self.setRTS(True) self.setDTR(True) self.flushInput() self.flushOutput() def _reconfigurePort(self): """Set communication parameters on opened port.""" if self._socket is None: raise SerialException("Can only operate on open ports") # if self._timeout != 0 and self._interCharTimeout is not None: # XXX if self._writeTimeout is not None: raise NotImplementedError('writeTimeout is currently not supported') # XXX # Setup the connection # to get good performance, all parameter changes are sent first... if not isinstance(self._baudrate, (int, long)) or not 0 < self._baudrate < 2**32: raise ValueError("invalid baudrate: %r" % (self._baudrate)) self._rfc2217_port_settings['baudrate'].set(struct.pack('!I', self._baudrate)) self._rfc2217_port_settings['datasize'].set(struct.pack('!B', self._bytesize)) self._rfc2217_port_settings['parity'].set(struct.pack('!B', RFC2217_PARITY_MAP[self._parity])) self._rfc2217_port_settings['stopsize'].set(struct.pack('!B', RFC2217_STOPBIT_MAP[self._stopbits])) # and now wait until parameters are active items = self._rfc2217_port_settings.values() if self.logger: self.logger.debug("Negotiating settings: %s" % (items,)) timeout_time = time.time() + self._network_timeout while time.time() < timeout_time: time.sleep(0.05) # prevent 100% CPU load if sum(o.active for o in items) == len(items): break else: raise SerialException("Remote does not accept parameter change (RFC2217): %r" % items) if self.logger: self.logger.info("Negotiated settings: %s" % (items,)) if self._rtscts and self._xonxoff: raise ValueError('xonxoff and rtscts together are not supported') elif self._rtscts: self.rfc2217SetControl(SET_CONTROL_USE_HW_FLOW_CONTROL) elif self._xonxoff: self.rfc2217SetControl(SET_CONTROL_USE_SW_FLOW_CONTROL) else: self.rfc2217SetControl(SET_CONTROL_USE_NO_FLOW_CONTROL) def close(self): """Close port""" if self._isOpen: if self._socket: try: self._socket.shutdown(socket.SHUT_RDWR) self._socket.close() except: # ignore errors. pass self._socket = None if self._thread: self._thread.join() self._isOpen = False # in case of quick reconnects, give the server some time time.sleep(0.3) def makeDeviceName(self, port): raise SerialException("there is no sensible way to turn numbers into URLs") def fromURL(self, url): """extract host and port from an URL string""" if url.lower().startswith("rfc2217://"): url = url[10:] try: # is there a "path" (our options)? if '/' in url: # cut away options url, options = url.split('/', 1) # process options now, directly altering self for option in options.split('/'): if '=' in option: option, value = option.split('=', 1) else: value = None if option == 'logging': logging.basicConfig() # XXX is that good to call it here? self.logger = logging.getLogger('pySerial.rfc2217') self.logger.setLevel(LOGGER_LEVELS[value]) self.logger.debug('enabled logging') elif option == 'ign_set_control': self._ignore_set_control_answer = True elif option == 'poll_modem': self._poll_modem_state = True elif option == 'timeout': self._network_timeout = float(value) else: raise ValueError('unknown option: %r' % (option,)) # get host and port host, port = url.split(':', 1) # may raise ValueError because of unpacking port = int(port) # and this if it's not a number if not 0 <= port < 65536: raise ValueError("port not in range 0...65535") except ValueError, e: raise SerialException('expected a string in the form "[rfc2217://]:[/option[/option...]]": %s' % e) return (host, port) # - - - - - - - - - - - - - - - - - - - - - - - - def inWaiting(self): """Return the number of characters currently in the input buffer.""" if not self._isOpen: raise portNotOpenError return self._read_buffer.qsize() def read(self, size=1): """Read size bytes from the serial port. If a timeout is set it may return less characters as requested. With no timeout it will block until the requested number of bytes is read.""" if not self._isOpen: raise portNotOpenError data = bytearray() try: while len(data) < size: if self._thread is None: raise SerialException('connection failed (reader thread died)') data.append(self._read_buffer.get(True, self._timeout)) except Queue.Empty: # -> timeout pass return bytes(data) def write(self, data): """Output the given string over the serial port. Can block if the connection is blocked. May raise SerialException if the connection is closed.""" if not self._isOpen: raise portNotOpenError self._write_lock.acquire() try: try: self._socket.sendall(data.replace(IAC, IAC_DOUBLED)) except socket.error, e: raise SerialException("connection failed (socket error): %s" % e) # XXX what exception if socket connection fails finally: self._write_lock.release() return len(data) def flushInput(self): """Clear input buffer, discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError self.rfc2217SendPurge(PURGE_RECEIVE_BUFFER) # empty read buffer while self._read_buffer.qsize(): self._read_buffer.get(False) def flushOutput(self): """Clear output buffer, aborting the current output and discarding all that is in the buffer.""" if not self._isOpen: raise portNotOpenError self.rfc2217SendPurge(PURGE_TRANSMIT_BUFFER) def sendBreak(self, duration=0.25): """Send break condition. Timed, returns to idle state after given duration.""" if not self._isOpen: raise portNotOpenError self.setBreak(True) time.sleep(duration) self.setBreak(False) def setBreak(self, level=True): """Set break: Controls TXD. When active, to transmitting is possible.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('set BREAK to %s' % ('inactive', 'active')[bool(level)]) if level: self.rfc2217SetControl(SET_CONTROL_BREAK_ON) else: self.rfc2217SetControl(SET_CONTROL_BREAK_OFF) def setRTS(self, level=True): """Set terminal status line: Request To Send.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('set RTS to %s' % ('inactive', 'active')[bool(level)]) if level: self.rfc2217SetControl(SET_CONTROL_RTS_ON) else: self.rfc2217SetControl(SET_CONTROL_RTS_OFF) def setDTR(self, level=True): """Set terminal status line: Data Terminal Ready.""" if not self._isOpen: raise portNotOpenError if self.logger: self.logger.info('set DTR to %s' % ('inactive', 'active')[bool(level)]) if level: self.rfc2217SetControl(SET_CONTROL_DTR_ON) else: self.rfc2217SetControl(SET_CONTROL_DTR_OFF) def getCTS(self): """Read terminal status line: Clear To Send.""" if not self._isOpen: raise portNotOpenError return bool(self.getModemState() & MODEMSTATE_MASK_CTS) def getDSR(self): """Read terminal status line: Data Set Ready.""" if not self._isOpen: raise portNotOpenError return bool(self.getModemState() & MODEMSTATE_MASK_DSR) def getRI(self): """Read terminal status line: Ring Indicator.""" if not self._isOpen: raise portNotOpenError return bool(self.getModemState() & MODEMSTATE_MASK_RI) def getCD(self): """Read terminal status line: Carrier Detect.""" if not self._isOpen: raise portNotOpenError return bool(self.getModemState() & MODEMSTATE_MASK_CD) # - - - platform specific - - - # None so far # - - - RFC2217 specific - - - def _telnetReadLoop(self): """read loop for the socket.""" mode = M_NORMAL suboption = None try: while self._socket is not None: try: data = self._socket.recv(1024) except socket.timeout: # just need to get out of recv form time to time to check if # still alive continue except socket.error, e: # connection fails -> terminate loop if self.logger: self.logger.debug("socket error in reader thread: %s" % (e,)) break if not data: break # lost connection for byte in data: if mode == M_NORMAL: # interpret as command or as data if byte == IAC: mode = M_IAC_SEEN else: # store data in read buffer or sub option buffer # depending on state if suboption is not None: suboption.append(byte) else: self._read_buffer.put(byte) elif mode == M_IAC_SEEN: if byte == IAC: # interpret as command doubled -> insert character # itself if suboption is not None: suboption.append(IAC) else: self._read_buffer.put(IAC) mode = M_NORMAL elif byte == SB: # sub option start suboption = bytearray() mode = M_NORMAL elif byte == SE: # sub option end -> process it now self._telnetProcessSubnegotiation(bytes(suboption)) suboption = None mode = M_NORMAL elif byte in (DO, DONT, WILL, WONT): # negotiation telnet_command = byte mode = M_NEGOTIATE else: # other telnet commands self._telnetProcessCommand(byte) mode = M_NORMAL elif mode == M_NEGOTIATE: # DO, DONT, WILL, WONT was received, option now following self._telnetNegotiateOption(telnet_command, byte) mode = M_NORMAL finally: self._thread = None if self.logger: self.logger.debug("read thread terminated") # - incoming telnet commands and options def _telnetProcessCommand(self, command): """Process commands other than DO, DONT, WILL, WONT.""" # Currently none. RFC2217 only uses negotiation and subnegotiation. if self.logger: self.logger.warning("ignoring Telnet command: %r" % (command,)) def _telnetNegotiateOption(self, command, option): """Process incoming DO, DONT, WILL, WONT.""" # check our registered telnet options and forward command to them # they know themselves if they have to answer or not known = False for item in self._telnet_options: # can have more than one match! as some options are duplicated for # 'us' and 'them' if item.option == option: item.process_incoming(command) known = True if not known: # handle unknown options # only answer to positive requests and deny them if command == WILL or command == DO: self.telnetSendOption((command == WILL and DONT or WONT), option) if self.logger: self.logger.warning("rejected Telnet option: %r" % (option,)) def _telnetProcessSubnegotiation(self, suboption): """Process subnegotiation, the data between IAC SB and IAC SE.""" if suboption[0:1] == COM_PORT_OPTION: if suboption[1:2] == SERVER_NOTIFY_LINESTATE and len(suboption) >= 3: self._linestate = ord(suboption[2:3]) # ensure it is a number if self.logger: self.logger.info("NOTIFY_LINESTATE: %s" % self._linestate) elif suboption[1:2] == SERVER_NOTIFY_MODEMSTATE and len(suboption) >= 3: self._modemstate = ord(suboption[2:3]) # ensure it is a number if self.logger: self.logger.info("NOTIFY_MODEMSTATE: %s" % self._modemstate) # update time when we think that a poll would make sense self._modemstate_expires = time.time() + 0.3 elif suboption[1:2] == FLOWCONTROL_SUSPEND: self._remote_suspend_flow = True elif suboption[1:2] == FLOWCONTROL_RESUME: self._remote_suspend_flow = False else: for item in self._rfc2217_options.values(): if item.ack_option == suboption[1:2]: #~ print "processing COM_PORT_OPTION: %r" % list(suboption[1:]) item.checkAnswer(bytes(suboption[2:])) break else: if self.logger: self.logger.warning("ignoring COM_PORT_OPTION: %r" % (suboption,)) else: if self.logger: self.logger.warning("ignoring subnegotiation: %r" % (suboption,)) # - outgoing telnet commands and options def _internal_raw_write(self, data): """internal socket write with no data escaping. used to send telnet stuff.""" self._write_lock.acquire() try: self._socket.sendall(data) finally: self._write_lock.release() def telnetSendOption(self, action, option): """Send DO, DONT, WILL, WONT.""" self._internal_raw_write(to_bytes([IAC, action, option])) def rfc2217SendSubnegotiation(self, option, value=''): """Subnegotiation of RFC2217 parameters.""" value = value.replace(IAC, IAC_DOUBLED) self._internal_raw_write(to_bytes([IAC, SB, COM_PORT_OPTION, option] + list(value) + [IAC, SE])) def rfc2217SendPurge(self, value): item = self._rfc2217_options['purge'] item.set(value) # transmit desired purge type item.wait(self._network_timeout) # wait for acknowledge from the server def rfc2217SetControl(self, value): item = self._rfc2217_options['control'] item.set(value) # transmit desired control type if self._ignore_set_control_answer: # answers are ignored when option is set. compatibility mode for # servers that answer, but not the expected one... (or no answer # at all) i.e. sredird time.sleep(0.1) # this helps getting the unit tests passed else: item.wait(self._network_timeout) # wait for acknowledge from the server def rfc2217FlowServerReady(self): """check if server is ready to receive data. block for some time when not.""" #~ if self._remote_suspend_flow: #~ wait--- def getModemState(self): """get last modem state (cached value. if value is "old", request a new one. this cache helps that we don't issue to many requests when e.g. all status lines, one after the other is queried by te user (getCTS, getDSR etc.)""" # active modem state polling enabled? is the value fresh enough? if self._poll_modem_state and self._modemstate_expires < time.time(): if self.logger: self.logger.debug('polling modem state') # when it is older, request an update self.rfc2217SendSubnegotiation(NOTIFY_MODEMSTATE) timeout_time = time.time() + self._network_timeout while time.time() < timeout_time: time.sleep(0.05) # prevent 100% CPU load # when expiration time is updated, it means that there is a new # value if self._modemstate_expires > time.time(): if self.logger: self.logger.warning('poll for modem state failed') break # even when there is a timeout, do not generate an error just # return the last known value. this way we can support buggy # servers that do not respond to polls, but send automatic # updates. if self._modemstate is not None: if self.logger: self.logger.debug('using cached modem state') return self._modemstate else: # never received a notification from the server raise SerialException("remote sends no NOTIFY_MODEMSTATE") # assemble Serial class with the platform specific implementation and the base # for file-like behavior. for Python 2.6 and newer, that provide the new I/O # library, derive from io.RawIOBase try: import io except ImportError: # classic version with our own file-like emulation class Serial(RFC2217Serial, FileLike): pass else: # io library present class Serial(RFC2217Serial, io.RawIOBase): pass ############################################################################# # The following is code that helps implementing an RFC 2217 server. class PortManager(object): """This class manages the state of Telnet and RFC 2217. It needs a serial instance and a connection to work with. Connection is expected to implement a (thread safe) write function, that writes the string to the network.""" def __init__(self, serial_port, connection, logger=None): self.serial = serial_port self.connection = connection self.logger = logger self._client_is_rfc2217 = False # filter state machine self.mode = M_NORMAL self.suboption = None self.telnet_command = None # states for modem/line control events self.modemstate_mask = 255 self.last_modemstate = None self.linstate_mask = 0 # all supported telnet options self._telnet_options = [ TelnetOption(self, 'ECHO', ECHO, WILL, WONT, DO, DONT, REQUESTED), TelnetOption(self, 'we-SGA', SGA, WILL, WONT, DO, DONT, REQUESTED), TelnetOption(self, 'they-SGA', SGA, DO, DONT, WILL, WONT, INACTIVE), TelnetOption(self, 'we-BINARY', BINARY, WILL, WONT, DO, DONT, INACTIVE), TelnetOption(self, 'they-BINARY', BINARY, DO, DONT, WILL, WONT, REQUESTED), TelnetOption(self, 'we-RFC2217', COM_PORT_OPTION, WILL, WONT, DO, DONT, REQUESTED, self._client_ok), TelnetOption(self, 'they-RFC2217', COM_PORT_OPTION, DO, DONT, WILL, WONT, INACTIVE, self._client_ok), ] # negotiate Telnet/RFC2217 -> send initial requests if self.logger: self.logger.debug("requesting initial Telnet/RFC 2217 options") for option in self._telnet_options: if option.state is REQUESTED: self.telnetSendOption(option.send_yes, option.option) # issue 1st modem state notification def _client_ok(self): """callback of telnet option. it gets called when option is activated. this one here is used to detect when the client agrees on RFC 2217. a flag is set so that other functions like check_modem_lines know if the client is ok.""" # The callback is used for we and they so if one party agrees, we're # already happy. it seems not all servers do the negotiation correctly # and i guess there are incorrect clients too.. so be happy if client # answers one or the other positively. self._client_is_rfc2217 = True if self.logger: self.logger.info("client accepts RFC 2217") # this is to ensure that the client gets a notification, even if there # was no change self.check_modem_lines(force_notification=True) # - outgoing telnet commands and options def telnetSendOption(self, action, option): """Send DO, DONT, WILL, WONT.""" self.connection.write(to_bytes([IAC, action, option])) def rfc2217SendSubnegotiation(self, option, value=''): """Subnegotiation of RFC 2217 parameters.""" value = value.replace(IAC, IAC_DOUBLED) self.connection.write(to_bytes([IAC, SB, COM_PORT_OPTION, option] + list(value) + [IAC, SE])) # - check modem lines, needs to be called periodically from user to # establish polling def check_modem_lines(self, force_notification=False): modemstate = ( (self.serial.getCTS() and MODEMSTATE_MASK_CTS) | (self.serial.getDSR() and MODEMSTATE_MASK_DSR) | (self.serial.getRI() and MODEMSTATE_MASK_RI) | (self.serial.getCD() and MODEMSTATE_MASK_CD) ) # check what has changed deltas = modemstate ^ (self.last_modemstate or 0) # when last is None -> 0 if deltas & MODEMSTATE_MASK_CTS: modemstate |= MODEMSTATE_MASK_CTS_CHANGE if deltas & MODEMSTATE_MASK_DSR: modemstate |= MODEMSTATE_MASK_DSR_CHANGE if deltas & MODEMSTATE_MASK_RI: modemstate |= MODEMSTATE_MASK_RI_CHANGE if deltas & MODEMSTATE_MASK_CD: modemstate |= MODEMSTATE_MASK_CD_CHANGE # if new state is different and the mask allows this change, send # notification. suppress notifications when client is not rfc2217 if modemstate != self.last_modemstate or force_notification: if (self._client_is_rfc2217 and (modemstate & self.modemstate_mask)) or force_notification: self.rfc2217SendSubnegotiation( SERVER_NOTIFY_MODEMSTATE, to_bytes([modemstate & self.modemstate_mask]) ) if self.logger: self.logger.info("NOTIFY_MODEMSTATE: %s" % (modemstate,)) # save last state, but forget about deltas. # otherwise it would also notify about changing deltas which is # probably not very useful self.last_modemstate = modemstate & 0xf0 # - outgoing data escaping def escape(self, data): """this generator function is for the user. all outgoing data has to be properly escaped, so that no IAC character in the data stream messes up the Telnet state machine in the server. socket.sendall(escape(data)) """ for byte in data: if byte == IAC: yield IAC yield IAC else: yield byte # - incoming data filter def filter(self, data): """handle a bunch of incoming bytes. this is a generator. it will yield all characters not of interest for Telnet/RFC 2217. The idea is that the reader thread pushes data from the socket through this filter: for byte in filter(socket.recv(1024)): # do things like CR/LF conversion/whatever # and write data to the serial port serial.write(byte) (socket error handling code left as exercise for the reader) """ for byte in data: if self.mode == M_NORMAL: # interpret as command or as data if byte == IAC: self.mode = M_IAC_SEEN else: # store data in sub option buffer or pass it to our # consumer depending on state if self.suboption is not None: self.suboption.append(byte) else: yield byte elif self.mode == M_IAC_SEEN: if byte == IAC: # interpret as command doubled -> insert character # itself if self.suboption is not None: self.suboption.append(byte) else: yield byte self.mode = M_NORMAL elif byte == SB: # sub option start self.suboption = bytearray() self.mode = M_NORMAL elif byte == SE: # sub option end -> process it now self._telnetProcessSubnegotiation(bytes(self.suboption)) self.suboption = None self.mode = M_NORMAL elif byte in (DO, DONT, WILL, WONT): # negotiation self.telnet_command = byte self.mode = M_NEGOTIATE else: # other telnet commands self._telnetProcessCommand(byte) self.mode = M_NORMAL elif self.mode == M_NEGOTIATE: # DO, DONT, WILL, WONT was received, option now following self._telnetNegotiateOption(self.telnet_command, byte) self.mode = M_NORMAL # - incoming telnet commands and options def _telnetProcessCommand(self, command): """Process commands other than DO, DONT, WILL, WONT.""" # Currently none. RFC2217 only uses negotiation and subnegotiation. if self.logger: self.logger.warning("ignoring Telnet command: %r" % (command,)) def _telnetNegotiateOption(self, command, option): """Process incoming DO, DONT, WILL, WONT.""" # check our registered telnet options and forward command to them # they know themselves if they have to answer or not known = False for item in self._telnet_options: # can have more than one match! as some options are duplicated for # 'us' and 'them' if item.option == option: item.process_incoming(command) known = True if not known: # handle unknown options # only answer to positive requests and deny them if command == WILL or command == DO: self.telnetSendOption((command == WILL and DONT or WONT), option) if self.logger: self.logger.warning("rejected Telnet option: %r" % (option,)) def _telnetProcessSubnegotiation(self, suboption): """Process subnegotiation, the data between IAC SB and IAC SE.""" if suboption[0:1] == COM_PORT_OPTION: if self.logger: self.logger.debug('received COM_PORT_OPTION: %r' % (suboption,)) if suboption[1:2] == SET_BAUDRATE: backup = self.serial.baudrate try: (self.serial.baudrate,) = struct.unpack("!I", suboption[2:6]) except ValueError, e: if self.logger: self.logger.error("failed to set baud rate: %s" % (e,)) self.serial.baudrate = backup else: if self.logger: self.logger.info("changed baud rate: %s" % (self.serial.baudrate,)) self.rfc2217SendSubnegotiation(SERVER_SET_BAUDRATE, struct.pack("!I", self.serial.baudrate)) elif suboption[1:2] == SET_DATASIZE: backup = self.serial.bytesize try: (self.serial.bytesize,) = struct.unpack("!B", suboption[2:3]) except ValueError, e: if self.logger: self.logger.error("failed to set data size: %s" % (e,)) self.serial.bytesize = backup else: if self.logger: self.logger.info("changed data size: %s" % (self.serial.bytesize,)) self.rfc2217SendSubnegotiation(SERVER_SET_DATASIZE, struct.pack("!B", self.serial.bytesize)) elif suboption[1:2] == SET_PARITY: backup = self.serial.parity try: self.serial.parity = RFC2217_REVERSE_PARITY_MAP[struct.unpack("!B", suboption[2:3])[0]] except ValueError, e: if self.logger: self.logger.error("failed to set parity: %s" % (e,)) self.serial.parity = backup else: if self.logger: self.logger.info("changed parity: %s" % (self.serial.parity,)) self.rfc2217SendSubnegotiation( SERVER_SET_PARITY, struct.pack("!B", RFC2217_PARITY_MAP[self.serial.parity]) ) elif suboption[1:2] == SET_STOPSIZE: backup = self.serial.stopbits try: self.serial.stopbits = RFC2217_REVERSE_STOPBIT_MAP[struct.unpack("!B", suboption[2:3])[0]] except ValueError, e: if self.logger: self.logger.error("failed to set stop bits: %s" % (e,)) self.serial.stopbits = backup else: if self.logger: self.logger.info("changed stop bits: %s" % (self.serial.stopbits,)) self.rfc2217SendSubnegotiation( SERVER_SET_STOPSIZE, struct.pack("!B", RFC2217_STOPBIT_MAP[self.serial.stopbits]) ) elif suboption[1:2] == SET_CONTROL: if suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING: if self.serial.xonxoff: self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL) elif self.serial.rtscts: self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL) else: self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL) elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL: self.serial.xonxoff = False self.serial.rtscts = False if self.logger: self.logger.info("changed flow control to None") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_NO_FLOW_CONTROL) elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTROL: self.serial.xonxoff = True if self.logger: self.logger.info("changed flow control to XON/XOFF") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_SW_FLOW_CONTROL) elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTROL: self.serial.rtscts = True if self.logger: self.logger.info("changed flow control to RTS/CTS") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_USE_HW_FLOW_CONTROL) elif suboption[2:3] == SET_CONTROL_REQ_BREAK_STATE: if self.logger: self.logger.warning("requested break state - not implemented") pass # XXX needs cached value elif suboption[2:3] == SET_CONTROL_BREAK_ON: self.serial.setBreak(True) if self.logger: self.logger.info("changed BREAK to active") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_ON) elif suboption[2:3] == SET_CONTROL_BREAK_OFF: self.serial.setBreak(False) if self.logger: self.logger.info("changed BREAK to inactive") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_BREAK_OFF) elif suboption[2:3] == SET_CONTROL_REQ_DTR: if self.logger: self.logger.warning("requested DTR state - not implemented") pass # XXX needs cached value elif suboption[2:3] == SET_CONTROL_DTR_ON: self.serial.setDTR(True) if self.logger: self.logger.info("changed DTR to active") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_ON) elif suboption[2:3] == SET_CONTROL_DTR_OFF: self.serial.setDTR(False) if self.logger: self.logger.info("changed DTR to inactive") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_DTR_OFF) elif suboption[2:3] == SET_CONTROL_REQ_RTS: if self.logger: self.logger.warning("requested RTS state - not implemented") pass # XXX needs cached value #~ self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON) elif suboption[2:3] == SET_CONTROL_RTS_ON: self.serial.setRTS(True) if self.logger: self.logger.info("changed RTS to active") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_ON) elif suboption[2:3] == SET_CONTROL_RTS_OFF: self.serial.setRTS(False) if self.logger: self.logger.info("changed RTS to inactive") self.rfc2217SendSubnegotiation(SERVER_SET_CONTROL, SET_CONTROL_RTS_OFF) #~ elif suboption[2:3] == SET_CONTROL_REQ_FLOW_SETTING_IN: #~ elif suboption[2:3] == SET_CONTROL_USE_NO_FLOW_CONTROL_IN: #~ elif suboption[2:3] == SET_CONTROL_USE_SW_FLOW_CONTOL_IN: #~ elif suboption[2:3] == SET_CONTROL_USE_HW_FLOW_CONTOL_IN: #~ elif suboption[2:3] == SET_CONTROL_USE_DCD_FLOW_CONTROL: #~ elif suboption[2:3] == SET_CONTROL_USE_DTR_FLOW_CONTROL: #~ elif suboption[2:3] == SET_CONTROL_USE_DSR_FLOW_CONTROL: elif suboption[1:2] == NOTIFY_LINESTATE: # client polls for current state self.rfc2217SendSubnegotiation( SERVER_NOTIFY_LINESTATE, to_bytes([0]) # sorry, nothing like that implemented ) elif suboption[1:2] == NOTIFY_MODEMSTATE: if self.logger: self.logger.info("request for modem state") # client polls for current state self.check_modem_lines(force_notification=True) elif suboption[1:2] == FLOWCONTROL_SUSPEND: if self.logger: self.logger.info("suspend") self._remote_suspend_flow = True elif suboption[1:2] == FLOWCONTROL_RESUME: if self.logger: self.logger.info("resume") self._remote_suspend_flow = False elif suboption[1:2] == SET_LINESTATE_MASK: self.linstate_mask = ord(suboption[2:3]) # ensure it is a number if self.logger: self.logger.info("line state mask: 0x%02x" % (self.linstate_mask,)) elif suboption[1:2] == SET_MODEMSTATE_MASK: self.modemstate_mask = ord(suboption[2:3]) # ensure it is a number if self.logger: self.logger.info("modem state mask: 0x%02x" % (self.modemstate_mask,)) elif suboption[1:2] == PURGE_DATA: if suboption[2:3] == PURGE_RECEIVE_BUFFER: self.serial.flushInput() if self.logger: self.logger.info("purge in") self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_RECEIVE_BUFFER) elif suboption[2:3] == PURGE_TRANSMIT_BUFFER: self.serial.flushOutput() if self.logger: self.logger.info("purge out") self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_TRANSMIT_BUFFER) elif suboption[2:3] == PURGE_BOTH_BUFFERS: self.serial.flushInput() self.serial.flushOutput() if self.logger: self.logger.info("purge both") self.rfc2217SendSubnegotiation(SERVER_PURGE_DATA, PURGE_BOTH_BUFFERS) else: if self.logger: self.logger.error("undefined PURGE_DATA: %r" % list(suboption[2:])) else: if self.logger: self.logger.error("undefined COM_PORT_OPTION: %r" % list(suboption[1:])) else: if self.logger: self.logger.warning("unknown subnegotiation: %r" % (suboption,)) # simple client test if __name__ == '__main__': import sys s = Serial('rfc2217://localhost:7000', 115200) sys.stdout.write('%s\n' % s) #~ s.baudrate = 1898 sys.stdout.write("write...\n") s.write("hello\n") s.flush() sys.stdout.write("read: %s\n" % s.read(5)) #~ s.baudrate = 19200 #~ s.databits = 7 s.close() PK[(i'site-packages/slip-0.4.0-py2.7.egg-infonu[Metadata-Version: 1.1 Name: slip Version: 0.4.0 Summary: UNKNOWN Home-page: UNKNOWN Author: UNKNOWN Author-email: UNKNOWN License: UNKNOWN Description: UNKNOWN Platform: UNKNOWN Requires: selinux PK[ci*wwsite-packages/validate.pycnu[ CSc@sdZdZdddddddd d d d d ddddddddddddddddfZddlZejd ejejBZejd!ejejBZd"Z d#e Z ye Wne k rd$Z nXd%Z d&Zdefd'YZdefd(YZdefd)YZdefd*YZdefd+YZd efd,YZd efd-YZd efd.YZd efd/YZd efd0YZdefd1YZed2Zeed3Z eed4Z!i e"e"6e"d56e"d66e"d76e"d86ee6ed96ed:6ed;6ed<6Z#d=Z$d>Z%eed?Z&eed@Z'eedAZ(eedBZ)eedCZ*eedDZ+eedEZ,eedFZ-eedGZ.ie dH6e!dI6e%dJ6e(dK6e$dL6Z/dMZ0dNZ1dOZ2dPZ3dQZ4e5dRkrddl6Z6ddl7Z7e6j8j9dRZ:e:j;j<Z=e=j>iedS6e7j?e:dTe=ndS(Us The Validator object is used to check that supplied values conform to a specification. The value can be supplied as a string - e.g. from a config file. In this case the check will also *convert* the value to the required type. This allows you to add validation as a transparent layer to access data stored as strings. The validation checks that the data is correct *and* converts it to the expected type. Some standard checks are provided for basic data types. Additional checks are easy to write. They can be provided when the ``Validator`` is instantiated or added afterwards. The standard functions work with the following basic data types : * integers * floats * booleans * strings * ip_addr plus lists of these datatypes Adding additional checks is done through coding simple functions. The full set of standard checks are : * 'integer': matches integer values (including negative) Takes optional 'min' and 'max' arguments : :: integer() integer(3, 9) # any value from 3 to 9 integer(min=0) # any positive value integer(max=9) * 'float': matches float values Has the same parameters as the integer check. * 'boolean': matches boolean values - ``True`` or ``False`` Acceptable string values for True are : true, on, yes, 1 Acceptable string values for False are : false, off, no, 0 Any other value raises an error. * 'ip_addr': matches an Internet Protocol address, v.4, represented by a dotted-quad string, i.e. '1.2.3.4'. * 'string': matches any string. Takes optional keyword args 'min' and 'max' to specify min and max lengths of the string. * 'list': matches any list. Takes optional keyword args 'min', and 'max' to specify min and max sizes of the list. (Always returns a list.) * 'tuple': matches any tuple. Takes optional keyword args 'min', and 'max' to specify min and max sizes of the tuple. (Always returns a tuple.) * 'int_list': Matches a list of integers. Takes the same arguments as list. * 'float_list': Matches a list of floats. Takes the same arguments as list. * 'bool_list': Matches a list of boolean values. Takes the same arguments as list. * 'ip_addr_list': Matches a list of IP addresses. Takes the same arguments as list. * 'string_list': Matches a list of strings. Takes the same arguments as list. * 'mixed_list': Matches a list with different types in specific positions. List size must match the number of arguments. Each position can be one of : 'integer', 'float', 'ip_addr', 'string', 'boolean' So to specify a list with two strings followed by two integers, you write the check as : :: mixed_list('string', 'string', 'integer', 'integer') * 'pass': This check matches everything ! It never fails and the value is unchanged. It is also the default if no check is specified. * 'option': This check matches any from a list of options. You specify this check with : :: option('option 1', 'option 2', 'option 3') You can supply a default value (returned if no value is supplied) using the default keyword argument. You specify a list argument for default using a list constructor syntax in the check : :: checkname(arg1, arg2, default=list('val 1', 'val 2', 'val 3')) A badly formatted set of arguments will raise a ``VdtParamError``. s1.0.1t __version__tdottedQuadToNumtnumToDottedQuadt ValidateErrortVdtUnknownCheckErrort VdtParamErrort VdtTypeErrort VdtValueErrortVdtValueTooSmallErrortVdtValueTooBigErrortVdtValueTooShortErrortVdtValueTooLongErrortVdtMissingValuet Validatort is_integertis_floatt is_booleantis_listtis_tuplet is_ip_addrt is_stringt is_int_listt is_bool_listt is_float_listtis_string_listtis_ip_addr_listt is_mixed_listt is_optioniNs (?: ([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*list\( ( (?: \s* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted ) \s*,\s* )* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted )? # last one ) \) ) s ( (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s=][^,=]*?) # unquoted ) (?: (?:\s*,\s*)|(?:\s*$) # comma ) s (?: ( (?: [a-zA-Z_][a-zA-Z0-9_]*\s*=\s*list\( (?: \s* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted ) \s*,\s* )* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s\)][^,\)]*?) # unquoted )? # last one \) )| (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s=][^,=]*?)| # unquoted (?: # keyword argument [a-zA-Z_][a-zA-Z0-9_]*\s*=\s* (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\s=][^,=]*?) # unquoted ) ) ) ) (?: (?:\s*,\s*)|(?:\s*$) # comma ) ) s^%s*cCs|r dSdSdS(s$Simple boolean equivalent function. iiN((tval((s,/usr/lib/python2.7/site-packages/validate.pytboolscCsddl}ddl}y'|jd|j|jdSWn:|jk r{|jdkrhdStd|nXdS(s Convert decimal dotted quad string to long integer >>> int(dottedQuadToNum('1 ')) 1 >>> int(dottedQuadToNum(' 1.2')) 16777218 >>> int(dottedQuadToNum(' 1.2.3 ')) 16908291 >>> int(dottedQuadToNum('1.2.3.4')) 16909060 >>> dottedQuadToNum('255.255.255.255') 4294967295L >>> dottedQuadToNum('255.255.255.256') Traceback (most recent call last): ValueError: Not a good dotted-quad IP: 255.255.255.256 iNs!Lis255.255.255.255lsNot a good dotted-quad IP: %s(tsockettstructtunpackt inet_atontstripterrort ValueError(tipRR((s,/usr/lib/python2.7/site-packages/validate.pyRs cCsddl}ddl}|dks0|dkrCtd|ny#|j|jdt|SWn0|j|jtfk rtd|nXdS(s Convert long int to dotted quad string >>> numToDottedQuad(-1L) Traceback (most recent call last): ValueError: Not a good numeric IP: -1 >>> numToDottedQuad(1L) '0.0.0.1' >>> numToDottedQuad(16777218L) '1.0.0.2' >>> numToDottedQuad(16908291L) '1.2.0.3' >>> numToDottedQuad(16909060L) '1.2.3.4' >>> numToDottedQuad(4294967295L) '255.255.255.255' >>> numToDottedQuad(4294967296L) Traceback (most recent call last): ValueError: Not a good numeric IP: 4294967296 iNlisNot a good numeric IP: %ss!L(RRR$t inet_ntoatpacktlongR#t OverflowError(tnumRR((s,/usr/lib/python2.7/site-packages/validate.pyR$scBseZdZRS(s This error indicates that the check failed. It can be the base class for more specific errors. Any check function that fails ought to raise this error. (or a subclass) >>> raise ValidateError Traceback (most recent call last): ValidateError (t__name__t __module__t__doc__(((s,/usr/lib/python2.7/site-packages/validate.pyRGs cBseZdZRS(s1No value was supplied to a check that needed one.(R+R,R-(((s,/usr/lib/python2.7/site-packages/validate.pyR UscBseZdZdZRS(s'An unknown check function was requestedcCstj|d|fdS(s >>> raise VdtUnknownCheckError('yoda') Traceback (most recent call last): VdtUnknownCheckError: the check "yoda" is unknown. sthe check "%s" is unknown.N(Rt__init__(tselftvalue((s,/usr/lib/python2.7/site-packages/validate.pyR.\s(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyRYscBseZdZdZRS(s!An incorrect parameter was passedcCstj|d||fdS(s >>> raise VdtParamError('yoda', 'jedi') Traceback (most recent call last): VdtParamError: passed an incorrect value "jedi" for parameter "yoda". s2passed an incorrect value "%s" for parameter "%s".N(t SyntaxErrorR.(R/tnameR0((s,/usr/lib/python2.7/site-packages/validate.pyR.hs(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyRescBseZdZdZRS(s(The value supplied was of the wrong typecCstj|d|fdS(s >>> raise VdtTypeError('jedi') Traceback (most recent call last): VdtTypeError: the value "jedi" is of the wrong type. s$the value "%s" is of the wrong type.N(RR.(R/R0((s,/usr/lib/python2.7/site-packages/validate.pyR.ts(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyRqscBseZdZdZRS(sIThe value supplied was of the correct type, but was not an allowed value.cCstj|d|fdS(s >>> raise VdtValueError('jedi') Traceback (most recent call last): VdtValueError: the value "jedi" is unacceptable. sthe value "%s" is unacceptable.N(RR.(R/R0((s,/usr/lib/python2.7/site-packages/validate.pyR.s(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyR}scBseZdZdZRS(s>The value supplied was of the correct type, but was too small.cCstj|d|fdS(s >>> raise VdtValueTooSmallError('0') Traceback (most recent call last): VdtValueTooSmallError: the value "0" is too small. sthe value "%s" is too small.N(RR.(R/R0((s,/usr/lib/python2.7/site-packages/validate.pyR.s(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyRscBseZdZdZRS(s<The value supplied was of the correct type, but was too big.cCstj|d|fdS(s >>> raise VdtValueTooBigError('1') Traceback (most recent call last): VdtValueTooBigError: the value "1" is too big. sthe value "%s" is too big.N(RR.(R/R0((s,/usr/lib/python2.7/site-packages/validate.pyR.s(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyR scBseZdZdZRS(s>The value supplied was of the correct type, but was too short.cCstj|d|fdS(s >>> raise VdtValueTooShortError('jed') Traceback (most recent call last): VdtValueTooShortError: the value "jed" is too short. sthe value "%s" is too short.N(RR.(R/R0((s,/usr/lib/python2.7/site-packages/validate.pyR.s(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyR scBseZdZdZRS(s=The value supplied was of the correct type, but was too long.cCstj|d|fdS(s >>> raise VdtValueTooLongError('jedie') Traceback (most recent call last): VdtValueTooLongError: the value "jedie" is too long. sthe value "%s" is too long.N(RR.(R/R0((s,/usr/lib/python2.7/site-packages/validate.pyR.s(R+R,R-R.(((s,/usr/lib/python2.7/site-packages/validate.pyR scBseZdZejdejZejdejZeZe Z eje ej ejBZ eje ej ejBZd dZedZdZdZdZdZd Zd Zd Zd ZRS(s( Validator is an object that allows you to register a set of 'checks'. These checks take input and test that it conforms to the check. This can also involve converting the value from a string into the correct datatype. The ``check`` method takes an input string which configures which check is to be used and applies that check to a supplied value. An example input string would be: 'int_range(param1, param2)' You would then provide something like: >>> def int_range_check(value, min, max): ... # turn min and max from strings to integers ... min = int(min) ... max = int(max) ... # check that value is of the correct type. ... # possible valid inputs are integers or strings ... # that represent integers ... if not isinstance(value, (int, long, basestring)): ... raise VdtTypeError(value) ... elif isinstance(value, basestring): ... # if we are given a string ... # attempt to convert to an integer ... try: ... value = int(value) ... except ValueError: ... raise VdtValueError(value) ... # check the value is between our constraints ... if not min <= value: ... raise VdtValueTooSmallError(value) ... if not value <= max: ... raise VdtValueTooBigError(value) ... return value >>> fdict = {'int_range': int_range_check} >>> vtr1 = Validator(fdict) >>> vtr1.check('int_range(20, 40)', '30') 30 >>> vtr1.check('int_range(20, 40)', '60') Traceback (most recent call last): VdtValueTooBigError: the value "60" is too big. New functions can be added with : :: >>> vtr2 = Validator() >>> vtr2.functions['int_range'] = int_range_check Or by passing in a dictionary of functions when Validator is instantiated. Your functions *can* use keyword arguments, but the first argument should always be 'value'. If the function doesn't take additional arguments, the parentheses are optional in the check. It can be written with either of : :: keyword = function_name keyword = function_name() The first program to utilise Validator() was Michael Foord's ConfigObj, an alternative to ConfigParser which supports lists and can validate a config file using a config schema. For more details on using Validator with ConfigObj see: http://www.voidspace.org.uk/python/configobj.html s (.+?)\((.*)\)s%^([a-zA-Z_][a-zA-Z0-9_]*)\s*=\s*(.*)$cCsi|jd6td6td6td6td6td6td6td6td 6t d 6t d 6t d 6t d 6t d6|jd6td6td6|_|dk r|jj|nt|_i|_dS(s( >>> vtri = Validator() ttintegertfloattbooleantip_addrtstringtlistttupletint_listt float_listt bool_listt ip_addr_listt string_listt mixed_listtpasstoptiont force_listN(t_passRRRRRRRRRRRRRRRCt functionstNonetupdateRtbaseErrorClasst_cache(R/RE((s,/usr/lib/python2.7/site-packages/validate.pyR.s,     cCsq|j|\}}}}|rK|dkr9tn|j|}n|dkr[dS|j||||S(s Usage: check(check, value) Arguments: check: string representing check to apply (including arguments) value: object to be checked Returns value, converted to correct type if necessary If the check fails, raises a ``ValidateError`` subclass. >>> vtor.check('yoda', '') Traceback (most recent call last): VdtUnknownCheckError: the check "yoda" is unknown. >>> vtor.check('yoda()', '') Traceback (most recent call last): VdtUnknownCheckError: the check "yoda" is unknown. >>> vtor.check('string(default="")', '', missing=True) '' N(t_parse_with_cachingRFR t _handle_nonet _check_value(R/tcheckR0tmissingtfun_nametfun_argst fun_kwargstdefault((s,/usr/lib/python2.7/site-packages/validate.pyRM4s   cCs2|dkrdS|dkr.|j|}n|S(NRFs'None's"None"(s'None's"None"(RFt_unquote(R/R0((s,/usr/lib/python2.7/site-packages/validate.pyRKWs   cCs||jkrC|j|\}}}}t|}t|}nw|j|\}}}}tg|jD]\}}t||f^qn}|t|t||f|j|<||||fS(N(RIR9tdictt _parse_checktitemststr(R/RMRORPRQRRtkeyR0((s,/usr/lib/python2.7/site-packages/validate.pyRJ`s 7%cCsEy|j|}Wntk r0t|nX||||SdS(N(REtKeyErrorR(R/R0RORPRQtfun((s,/usr/lib/python2.7/site-packages/validate.pyRLns  cCs|jj|}|rP|jd}|jd}|jj|}|dkrgtd|ng}i}x|jj|D]}|j}|j j|} | r|j | \} } | || >> vtor.check('', 0) 0 >>> vtor.check('', '0') '0' ((R/R0((s,/usr/lib/python2.7/site-packages/validate.pyRDs cCso|j|\}}}}|dkr:td|n|j|}|dkrY|S|j||||S(s Given a check, return the default value for the check (converted to the right type). If the check doesn't specify a default value then a ``KeyError`` will be raised. s Check "%s" has no default value.N(RJRFRYRKRL(R/RMRORPRQRRR0((s,/usr/lib/python2.7/site-packages/validate.pytget_default_values  N(R+R,R-tretcompiletDOTALLR[RcRaRot _paramstringtVERBOSER_t _matchstringR^RFR.tFalseRMRKRJRLRURSRbRDRr(((s,/usr/lib/python2.7/site-packages/validate.pyR s"F  #  (  c Cs|r tpt}g}xt||D]\}}|dkrP|j|q(t|ttttfry|j||Wqtk r}t ||qXq(t ||q(W|S(s Return numbers from inputs or raise VdtParamError. Lets ``None`` pass through. Pass in keyword argument ``to_float=True`` to use float for the conversion rather than int. >>> _is_num_param(('', ''), (0, 1.0)) [0, 1] >>> _is_num_param(('', ''), (0, 1.0), to_float=True) [0.0, 1.0] >>> _is_num_param(('a'), ('a')) Traceback (most recent call last): VdtParamError: passed an incorrect value "a" for parameter "a". N( R5tinttzipRFRdt isinstanceR(t basestringR$R(tnamestvaluestto_floatRZt out_paramsR2Rte((s,/usr/lib/python2.7/site-packages/validate.pyt _is_num_params cCstd||f\}}t|tttfsBt|nt|tryt|}Wqtk rt|qXn|dk r||krt|n|dk r||krt |n|S(sH A check that tests that a given value is an integer (int, or long) and optionally, between bounds. A negative value is accepted, while a float will fail. If the value is a string, then the conversion is done - if possible. Otherwise a VdtError is raised. >>> vtor.check('integer', '-1') -1 >>> vtor.check('integer', '0') 0 >>> vtor.check('integer', 9) 9 >>> vtor.check('integer', 'a') Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. >>> vtor.check('integer', '2.2') Traceback (most recent call last): VdtTypeError: the value "2.2" is of the wrong type. >>> vtor.check('integer(10)', '20') 20 >>> vtor.check('integer(max=20)', '15') 15 >>> vtor.check('integer(10)', '9') Traceback (most recent call last): VdtValueTooSmallError: the value "9" is too small. >>> vtor.check('integer(10)', 9) Traceback (most recent call last): VdtValueTooSmallError: the value "9" is too small. >>> vtor.check('integer(max=20)', '35') Traceback (most recent call last): VdtValueTooBigError: the value "35" is too big. >>> vtor.check('integer(max=20)', 35) Traceback (most recent call last): VdtValueTooBigError: the value "35" is too big. >>> vtor.check('integer(0, 9)', False) 0 tmintmax(sminsmaxN( RR|RzR(R}RR$RFRR (R0RRtmin_valtmax_val((s,/usr/lib/python2.7/site-packages/validate.pyRs( cCstd||fdt\}}t|ttttfsKt|nt|tsyt|}Wqtk rt|qXn|dk r||krt |n|dk r||krt |n|S(s< A check that tests that a given value is a float (an integer will be accepted), and optionally - that it is between bounds. If the value is a string, then the conversion is done - if possible. Otherwise a VdtError is raised. This can accept negative values. >>> vtor.check('float', '2') 2.0 From now on we multiply the value to avoid comparing decimals >>> vtor.check('float', '-6.8') * 10 -68.0 >>> vtor.check('float', '12.2') * 10 122.0 >>> vtor.check('float', 8.4) * 10 84.0 >>> vtor.check('float', 'a') Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. >>> vtor.check('float(10.1)', '10.2') * 10 102.0 >>> vtor.check('float(max=20.2)', '15.1') * 10 151.0 >>> vtor.check('float(10.0)', '9.0') Traceback (most recent call last): VdtValueTooSmallError: the value "9.0" is too small. >>> vtor.check('float(max=20.0)', '35.0') Traceback (most recent call last): VdtValueTooBigError: the value "35.0" is too big. RRR(sminsmaxN( RtTrueR|RzR(R5R}RR$RFRR (R0RRRR((s,/usr/lib/python2.7/site-packages/validate.pyR*s# tont1ttruetyestofft0tfalsetnocCstt|trDyt|jSWqDtk r@t|qDXn|tkrTtS|tkrdtSt|dS(s Check if the value represents a boolean. >>> vtor.check('boolean', 0) 0 >>> vtor.check('boolean', False) 0 >>> vtor.check('boolean', '0') 0 >>> vtor.check('boolean', 'off') 0 >>> vtor.check('boolean', 'false') 0 >>> vtor.check('boolean', 'no') 0 >>> vtor.check('boolean', 'nO') 0 >>> vtor.check('boolean', 'NO') 0 >>> vtor.check('boolean', 1) 1 >>> vtor.check('boolean', True) 1 >>> vtor.check('boolean', '1') 1 >>> vtor.check('boolean', 'on') 1 >>> vtor.check('boolean', 'true') 1 >>> vtor.check('boolean', 'yes') 1 >>> vtor.check('boolean', 'Yes') 1 >>> vtor.check('boolean', 'YES') 1 >>> vtor.check('boolean', '') Traceback (most recent call last): VdtTypeError: the value "" is of the wrong type. >>> vtor.check('boolean', 'up') Traceback (most recent call last): VdtTypeError: the value "up" is of the wrong type. N(R|R}t bool_dicttlowerRYRRyR(R0((s,/usr/lib/python2.7/site-packages/validate.pyRds,   cCs\t|tst|n|j}yt|Wntk rWt|nX|S(ss Check that the supplied value is an Internet Protocol address, v.4, represented by a dotted-quad string, i.e. '1.2.3.4'. >>> vtor.check('ip_addr', '1 ') '1' >>> vtor.check('ip_addr', ' 1.2') '1.2' >>> vtor.check('ip_addr', ' 1.2.3 ') '1.2.3' >>> vtor.check('ip_addr', '1.2.3.4') '1.2.3.4' >>> vtor.check('ip_addr', '0.0.0.0') '0.0.0.0' >>> vtor.check('ip_addr', '255.255.255.255') '255.255.255.255' >>> vtor.check('ip_addr', '255.255.255.256') Traceback (most recent call last): VdtValueError: the value "255.255.255.256" is unacceptable. >>> vtor.check('ip_addr', '1.2.3.4.5') Traceback (most recent call last): VdtValueError: the value "1.2.3.4.5" is unacceptable. >>> vtor.check('ip_addr', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. (R|R}RR"RR$R(R0((s,/usr/lib/python2.7/site-packages/validate.pyRs  cCstd||f\}}t|tr9t|nyt|}Wntk rht|nX|dk r||krt|n|dk r||krt|nt |S(s Check that the value is a list of values. You can optionally specify the minimum and maximum number of members. It does no check on list members. >>> vtor.check('list', ()) [] >>> vtor.check('list', []) [] >>> vtor.check('list', (1, 2)) [1, 2] >>> vtor.check('list', [1, 2]) [1, 2] >>> vtor.check('list(3)', (1, 2)) Traceback (most recent call last): VdtValueTooShortError: the value "(1, 2)" is too short. >>> vtor.check('list(max=5)', (1, 2, 3, 4, 5, 6)) Traceback (most recent call last): VdtValueTooLongError: the value "(1, 2, 3, 4, 5, 6)" is too long. >>> vtor.check('list(min=3, max=5)', (1, 2, 3, 4)) [1, 2, 3, 4] >>> vtor.check('list', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. >>> vtor.check('list', '12') Traceback (most recent call last): VdtTypeError: the value "12" is of the wrong type. RR(sminsmaxN( RR|R}RRnt TypeErrorRFR R R9(R0RRtmin_lentmax_lent num_members((s,/usr/lib/python2.7/site-packages/validate.pyRs cCstt|||S(s Check that the value is a tuple of values. You can optionally specify the minimum and maximum number of members. It does no check on members. >>> vtor.check('tuple', ()) () >>> vtor.check('tuple', []) () >>> vtor.check('tuple', (1, 2)) (1, 2) >>> vtor.check('tuple', [1, 2]) (1, 2) >>> vtor.check('tuple(3)', (1, 2)) Traceback (most recent call last): VdtValueTooShortError: the value "(1, 2)" is too short. >>> vtor.check('tuple(max=5)', (1, 2, 3, 4, 5, 6)) Traceback (most recent call last): VdtValueTooLongError: the value "(1, 2, 3, 4, 5, 6)" is too long. >>> vtor.check('tuple(min=3, max=5)', (1, 2, 3, 4)) (1, 2, 3, 4) >>> vtor.check('tuple', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. >>> vtor.check('tuple', '12') Traceback (most recent call last): VdtTypeError: the value "12" is of the wrong type. (R:R(R0RR((s,/usr/lib/python2.7/site-packages/validate.pyRscCst|tst|ntd||f\}}yt|}Wntk rht|nX|dk r||krt|n|dk r||krt|n|S(s Check that the supplied value is a string. You can optionally specify the minimum and maximum number of members. >>> vtor.check('string', '0') '0' >>> vtor.check('string', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. >>> vtor.check('string(2)', '12') '12' >>> vtor.check('string(2)', '1') Traceback (most recent call last): VdtValueTooShortError: the value "1" is too short. >>> vtor.check('string(min=2, max=3)', '123') '123' >>> vtor.check('string(min=2, max=3)', '1234') Traceback (most recent call last): VdtValueTooLongError: the value "1234" is too long. RR(sminsmaxN( R|R}RRRnRRFR R (R0RRRRR((s,/usr/lib/python2.7/site-packages/validate.pyRs cCs)gt|||D]}t|^qS(s Check that the value is a list of integers. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is an integer. >>> vtor.check('int_list', ()) [] >>> vtor.check('int_list', []) [] >>> vtor.check('int_list', (1, 2)) [1, 2] >>> vtor.check('int_list', [1, 2]) [1, 2] >>> vtor.check('int_list', [1, 'a']) Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. (RR(R0RRtmem((s,/usr/lib/python2.7/site-packages/validate.pyR8scCs)gt|||D]}t|^qS(sl Check that the value is a list of booleans. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is a boolean. >>> vtor.check('bool_list', ()) [] >>> vtor.check('bool_list', []) [] >>> check_res = vtor.check('bool_list', (True, False)) >>> check_res == [True, False] 1 >>> check_res = vtor.check('bool_list', [True, False]) >>> check_res == [True, False] 1 >>> vtor.check('bool_list', [True, 'a']) Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. (RR(R0RRR((s,/usr/lib/python2.7/site-packages/validate.pyROscCs)gt|||D]}t|^qS(s Check that the value is a list of floats. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is a float. >>> vtor.check('float_list', ()) [] >>> vtor.check('float_list', []) [] >>> vtor.check('float_list', (1, 2.0)) [1.0, 2.0] >>> vtor.check('float_list', [1, 2.0]) [1.0, 2.0] >>> vtor.check('float_list', [1, 'a']) Traceback (most recent call last): VdtTypeError: the value "a" is of the wrong type. (RR(R0RRR((s,/usr/lib/python2.7/site-packages/validate.pyRhscCsGt|trt|ngt|||D]}t|^q1S(sn Check that the value is a list of strings. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is a string. >>> vtor.check('string_list', ()) [] >>> vtor.check('string_list', []) [] >>> vtor.check('string_list', ('a', 'b')) ['a', 'b'] >>> vtor.check('string_list', ['a', 1]) Traceback (most recent call last): VdtTypeError: the value "1" is of the wrong type. >>> vtor.check('string_list', 'hello') Traceback (most recent call last): VdtTypeError: the value "hello" is of the wrong type. (R|R}RRR(R0RRR((s,/usr/lib/python2.7/site-packages/validate.pyRscCs)gt|||D]}t|^qS(s Check that the value is a list of IP addresses. You can optionally specify the minimum and maximum number of members. Each list member is checked that it is an IP address. >>> vtor.check('ip_addr_list', ()) [] >>> vtor.check('ip_addr_list', []) [] >>> vtor.check('ip_addr_list', ('1.2.3.4', '5.6.7.8')) ['1.2.3.4', '5.6.7.8'] >>> vtor.check('ip_addr_list', ['a']) Traceback (most recent call last): VdtValueError: the value "a" is unacceptable. (RR(R0RRR((s,/usr/lib/python2.7/site-packages/validate.pyRscCs1t|ttfs!|g}nt|||S(s Check that a value is a list, coercing strings into a list with one member. Useful where users forget the trailing comma that turns a single value into a list. You can optionally specify the minimum and maximum number of members. A minumum of greater than one will fail if the user only supplies a string. >>> vtor.check('force_list', ()) [] >>> vtor.check('force_list', []) [] >>> vtor.check('force_list', 'hello') ['hello'] (R|R9R:R(R0RR((s,/usr/lib/python2.7/site-packages/validate.pyRCs R4R5R7R8R6cGsyt|}Wntk r/t|nX|t|krQt|n!|t|krrt|ny4gt||D]\}}t||^qSWn"tk r}td|nXdS(s Check that the value is a list. Allow specifying the type of each member. Work on lists of specific lengths. You specify each member as a positional argument specifying type Each type should be one of the following strings : 'integer', 'float', 'ip_addr', 'string', 'boolean' So you can specify a list of two strings, followed by two integers as : mixed_list('string', 'string', 'integer', 'integer') The length of the list must match the number of positional arguments you supply. >>> mix_str = "mixed_list('integer', 'float', 'ip_addr', 'string', 'boolean')" >>> check_res = vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', True)) >>> check_res == [1, 2.0, '1.2.3.4', 'a', True] 1 >>> check_res = vtor.check(mix_str, ('1', '2.0', '1.2.3.4', 'a', 'True')) >>> check_res == [1, 2.0, '1.2.3.4', 'a', True] 1 >>> vtor.check(mix_str, ('b', 2.0, '1.2.3.4', 'a', True)) Traceback (most recent call last): VdtTypeError: the value "b" is of the wrong type. >>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a')) Traceback (most recent call last): VdtValueTooShortError: the value "(1, 2.0, '1.2.3.4', 'a')" is too short. >>> vtor.check(mix_str, (1, 2.0, '1.2.3.4', 'a', 1, 'b')) Traceback (most recent call last): VdtValueTooLongError: the value "(1, 2.0, '1.2.3.4', 'a', 1, 'b')" is too long. >>> vtor.check(mix_str, 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. This test requires an elaborate setup, because of a change in error string output from the interpreter between Python 2.2 and 2.3 . >>> res_seq = ( ... 'passed an incorrect value "', ... 'yoda', ... '" for parameter "mixed_list".', ... ) >>> res_str = "'".join(res_seq) >>> try: ... vtor.check('mixed_list("yoda")', ('a')) ... except VdtParamError, err: ... str(err) == res_str 1 R@N( RnRRR R R{tfun_dictRYR(R0RqtlengthRiRR((s,/usr/lib/python2.7/site-packages/validate.pyRs6 4cGs=t|tst|n||kr9t|n|S(s This check matches the value to any of a set of options. >>> vtor.check('option("yoda", "jedi")', 'yoda') 'yoda' >>> vtor.check('option("yoda", "jedi")', 'jed') Traceback (most recent call last): VdtValueError: the value "jed" is unacceptable. >>> vtor.check('option("yoda", "jedi")', 0) Traceback (most recent call last): VdtTypeError: the value "0" is of the wrong type. (R|R}RR(R0toptions((s,/usr/lib/python2.7/site-packages/validate.pyRs  cOs |||fS(s A function that exists for test purposes. >>> checks = [ ... '3, 6, min=1, max=3, test=list(a, b, c)', ... '3', ... '3, 6', ... '3,', ... 'min=1, test="a b c"', ... 'min=5, test="a, b, c"', ... 'min=1, max=3, test="a, b, c"', ... 'min=-100, test=-99', ... 'min=1, max=3', ... '3, 6, test="36"', ... '3, 6, test="a, b, c"', ... '3, max=3, test=list("a", "b", "c")', ... '''3, max=3, test=list("'a'", 'b', "x=(c)")''', ... "test='x=fish(3)'", ... ] >>> v = Validator({'test': _test}) >>> for entry in checks: ... print v.check(('test(%s)' % entry), 3) (3, ('3', '6'), {'test': ['a', 'b', 'c'], 'max': '3', 'min': '1'}) (3, ('3',), {}) (3, ('3', '6'), {}) (3, ('3',), {}) (3, (), {'test': 'a b c', 'min': '1'}) (3, (), {'test': 'a, b, c', 'min': '5'}) (3, (), {'test': 'a, b, c', 'max': '3', 'min': '1'}) (3, (), {'test': '-99', 'min': '-100'}) (3, (), {'max': '3', 'min': '1'}) (3, ('3', '6'), {'test': '36'}) (3, ('3', '6'), {'test': 'a, b, c'}) (3, ('3',), {'test': ['a', 'b', 'c'], 'max': '3'}) (3, ('3',), {'test': ["'a'", 'b', 'x=(c)'], 'max': '3'}) (3, (), {'test': 'x=fish(3)'}) >>> v = Validator() >>> v.check('integer(default=6)', '3') 3 >>> v.check('integer(default=6)', None, True) 6 >>> v.get_default_value('integer(default=6)') 6 >>> v.get_default_value('float(default=6)') 6.0 >>> v.get_default_value('pass(default=None)') >>> v.get_default_value("string(default='None')") 'None' >>> v.get_default_value('pass') Traceback (most recent call last): KeyError: 'Check "pass" has no default value.' >>> v.get_default_value('pass(default=list(1, 2, 3, 4))') ['1', '2', '3', '4'] >>> v = Validator() >>> v.check("pass(default=None)", None, True) >>> v.check("pass(default='None')", None, True) 'None' >>> v.check('pass(default="None")', None, True) 'None' >>> v.check('pass(default=list(1, 2, 3, 4))', None, True) ['1', '2', '3', '4'] Bug test for unicode arguments >>> v = Validator() >>> v.check(u'string(min=4)', u'test') u'test' >>> v = Validator() >>> v.get_default_value(u'string(min=4, default="1234")') u'1234' >>> v.check(u'string(min=4, default="1234")', u'test') u'test' >>> v = Validator() >>> default = v.get_default_value('string(default=None)') >>> default == None 1 ((R0Rqtkeywargs((s,/usr/lib/python2.7/site-packages/validate.pyt_test&sQcCsdS(s >>> >>> v = Validator() >>> v.get_default_value('string(default="#ff00dd")') '#ff00dd' >>> v.get_default_value('integer(default=3) # comment') 3 N((((s,/usr/lib/python2.7/site-packages/validate.pyt_test2zscCsdS(s >>> vtor.check('string(default="")', '', missing=True) '' >>> vtor.check('string(default="\n")', '', missing=True) '\n' >>> print vtor.check('string(default="\n")', '', missing=True), >>> vtor.check('string()', '\n') '\n' >>> vtor.check('string(default="\n\n\n")', '', missing=True) '\n\n\n' >>> vtor.check('string()', 'random \n text goes here\n\n') 'random \n text goes here\n\n' >>> vtor.check('string(default=" \nrandom text\ngoes \n here\n\n ")', ... '', missing=True) ' \nrandom text\ngoes \n here\n\n ' >>> vtor.check("string(default='\n\n\n')", '', missing=True) '\n\n\n' >>> vtor.check("option('\n','a','b',default='\n')", '', missing=True) '\n' >>> vtor.check("string_list()", ['foo', '\n', 'bar']) ['foo', '\n', 'bar'] >>> vtor.check("string_list(default=list('\n'))", '', missing=True) ['\n'] N((((s,/usr/lib/python2.7/site-packages/validate.pyt_test3st__main__tvtortglobs(@R-Rt__all__RsRtRwRuRaRoRvRxRt NameErrorRRt ExceptionRR RR1RRRRR R R tobjectR RyRRFRRRRRRRRRRRRRRRCRRRRRRR+tsystdoctesttmodulestgettmt__dict__tcopyRRGttestmod(((s,/usr/lib/python2.7/site-packages/validate.pyts   )    " #        %84#& < %-"$  D  T     PK[O$$site-packages/jsonpointer.pyonu[ KUc@sgddlmZyddlmZmZWn'ek rSddlmZmZnXdZdZdZ dZ y*ddl m Z ddl mZeZWn'ek rddlm Z eZnXdd l mZdd lZdd lZejd Zd efd YZdefdYZeZedZedZdefdYZ dZ!d S(i(tunicode_literals(tMappingtSequenceu Stefan Kögl u1.9u2https://github.com/stefankoegl/python-json-pointeruModified BSD License(tunquote(tizip(tteeNu0|[1-9][0-9]*$tJsonPointerExceptioncBseZRS((t__name__t __module__(((s//usr/lib/python2.7/site-packages/jsonpointer.pyRBst EndOfListcBs eZdZdZdZRS(u+ Result of accessing element "-" of a list cCs ||_dS(N(tlist_(tselfR ((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__init__IscCs%djd|jjdt|jS(Nu {cls}({lst})tclstlst(tformatt __class__RtreprR (R ((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__repr__Ms(RRt__doc__R R(((s//usr/lib/python2.7/site-packages/jsonpointer.pyR Fs cCst|}|j||S(un Resolves pointer against doc and returns the referenced object >>> obj = {"foo": {"anArray": [ {"prop": 44}], "another prop": {"baz": "A string" }}} >>> resolve_pointer(obj, '') == obj True >>> resolve_pointer(obj, '/foo') == obj['foo'] True >>> resolve_pointer(obj, '/foo/another%20prop') == obj['foo']['another prop'] True >>> resolve_pointer(obj, '/foo/another%20prop/baz') == obj['foo']['another prop']['baz'] True >>> resolve_pointer(obj, '/foo/anArray/0') == obj['foo']['anArray'][0] True >>> resolve_pointer(obj, '/some/path', None) == None True (t JsonPointertresolve(tdoctpointertdefault((s//usr/lib/python2.7/site-packages/jsonpointer.pytresolve_pointerUs cCst|}|j|||S(uV Resolves pointer against doc and sets the value of the target within doc. With inplace set to true, doc is modified as long as pointer is not the root. >>> obj = {"foo": {"anArray": [ {"prop": 44}], "another prop": {"baz": "A string" }}} >>> set_pointer(obj, '/foo/anArray/0/prop', 55) == {'foo': {'another prop': {'baz': 'A string'}, 'anArray': [{'prop': 55}]}} True >>> set_pointer(obj, '/foo/yet%20another%20prop', 'added prop') == {'foo': {'another prop': {'baz': 'A string'}, 'yet another prop': 'added prop', 'anArray': [{'prop': 55}]}} True (Rtset(RRtvaluetinplace((s//usr/lib/python2.7/site-packages/jsonpointer.pyt set_pointerrs RcBseZdZdZdZedZeZedZ dZ dZ dZ dZ ed Zd Zd Zed ZRS( u= A JSON Pointer that can reference parts of an JSON document cCs|jd}|jddkr3tdntt|}g|D]}|jdd^qI}g|D]}|jdd^qn}||_dS(Nu/iuulocation must starts with /u~1u~0u~(tsplittpopRtmapRtreplacetparts(R RR"tpart((s//usr/lib/python2.7/site-packages/jsonpointer.pyR s%%cCsZ|js|dfSx'|jd D]}|j||}q!W||j||jdfS(u@ Resolves ptr until the last step, returns (sub-doc, last-step) iN(R"tNonetwalktget_part(R RR#((s//usr/lib/python2.7/site-packages/jsonpointer.pytto_lasts   cCsXxQ|jD]F}y|j||}Wq tk rO|tkrHqP|Sq Xq W|S(uBResolves the pointer against doc and returns the referenced object(R"R%Rt_nothing(R RRR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyRs   cCsit|jdkr.|r*tdn|S|sFtj|}n|j|\}}|||<|S(uH Resolve the pointer against the doc and replace the target with value. iucannot set root in place(tlenR"RtcopytdeepcopyR'(R RRRtparentR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyRs cCst|tr|St|trg|dkr2|Stjt|s]td|fnt|St|drz|Stdt |dS(u+ Returns the next step in the correct type u-u'%s' is not a valid list indexu __getitem__uQDocument '%s' does not support indexing, must be dict/list or support __getitem__N( t isinstanceRRtRE_ARRAY_INDEXtmatchtstrRtintthasattrttype(R RR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyR&s  cCs|j||}t|trZy ||SWqtk rVtd||fqXnct|tr|dkrt|Sy ||SWqtk rtd|fqXn||SdS(u7 Walks one step in doc and returns the referenced part umember '%s' not found in %su-uindex '%s' is out of boundsN(R&R-RtKeyErrorRRR t IndexError(R RR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyR%s      cCs|jt|j |jkS(u+Returns True if self contains the given ptr(R"R)(R tptr((s//usr/lib/python2.7/site-packages/jsonpointer.pytcontainsscCs |j|S(u+Returns True if self contains the given ptr(R7(R titem((s//usr/lib/python2.7/site-packages/jsonpointer.pyt __contains__scCsdg|jD]}|jdd^q }g|D]}|jdd^q/}djd|DS(ux Returns the string representation of the pointer >>> ptr = JsonPointer('/~0/0/~1').path == '/~0/0/~1' u~u~0u/u~1ucss|]}d|VqdS(u/N((t.0R#((s//usr/lib/python2.7/site-packages/jsonpointer.pys s(R"R!tjoin(R R#R"((s//usr/lib/python2.7/site-packages/jsonpointer.pytpaths(%cCs#t|tstS|j|jkS(u compares a pointer to another object Pointers can be compared by comparing their strings (or splitted strings), because no two different parts can point to the same structure in an object (eg no different number representations) (R-RtFalseR"(R tother((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__eq__ scCstt|jS(N(thashttupleR"(R ((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__hash__scCsg|D]}t|^q}g|D]}|jdd^q&}g|D]}|jdd^qK}|djd|D}|S(u Constructs a JsonPointer from a list of (unescaped) paths >>> JsonPointer.from_parts(['a', '~', '/', 0]).path == '/a/~0/~1/0' True u~u~0u/u~1ucss|]}d|VqdS(u/N((R:R#((s//usr/lib/python2.7/site-packages/jsonpointer.pys 's(R0R!R;(R R"R#R6((s//usr/lib/python2.7/site-packages/jsonpointer.pyt from_partss %%(RRRR R'R(RtgettTrueRR&R%R7R9tpropertyR<R?RBt classmethodRC(((s//usr/lib/python2.7/site-packages/jsonpointer.pyRs       cCs1t|\}}x|D]}PqWt||S(u s -> (s0,s1), (s1,s2), (s2, s3), ... >>> list(pairwise([])) [] >>> list(pairwise([1])) [] >>> list(pairwise([1, 2, 3, 4])) [(1, 2), (2, 3), (3, 4)] (RR(titerabletatbt_((s//usr/lib/python2.7/site-packages/jsonpointer.pytpairwise,s  ("t __future__Rtcollections.abcRRt ImportErrort collectionst __author__t __version__t __website__t __license__turllibRt itertoolsRtunicodeR0t urllib.parsetzipRtreR*tcompileR.t ExceptionRtobjectR R(RRERRRL(((s//usr/lib/python2.7/site-packages/jsonpointer.pyt!s4         PK[wX7site-packages/jsonpatch-1.2-py2.7.egg-info/requires.txtnu[jsonpointer>=1.0PK[Onr 8site-packages/jsonpatch-1.2-py2.7.egg-info/top_level.txtnu[jsonpatch PK[2?site-packages/jsonpatch-1.2-py2.7.egg-info/dependency_links.txtnu[ PK[96site-packages/jsonpatch-1.2-py2.7.egg-info/SOURCES.txtnu[COPYING MANIFEST.in jsonpatch.py requirements.txt setup.py jsonpatch.egg-info/PKG-INFO jsonpatch.egg-info/SOURCES.txt jsonpatch.egg-info/dependency_links.txt jsonpatch.egg-info/requires.txt jsonpatch.egg-info/top_level.txtPK[3site-packages/jsonpatch-1.2-py2.7.egg-info/PKG-INFOnu[Metadata-Version: 1.0 Name: jsonpatch Version: 1.2 Summary: Apply JSON-Patches (RFC 6902) Home-page: https://github.com/stefankoegl/python-json-patch Author: Stefan Kögl Author-email: stefan@skoegl.net License: Modified BSD License Description: UNKNOWN Platform: UNKNOWN PK[][vsite-packages/configobj.pycnu[ PKc@s3ddlmZddlZddlZddlZddlmZmZmZm Z e a ide fe6ddfe6ddfe 6ddfe6Z idd6dd6dd 6dd 6dd6dd 6dd 6dd6dd 6dd6dd6dd6dd6dd6dd6Z ied6ed6ed6e d6ee 6ZdZdZdZdZdZdZdZeZdZyeWnek rdZnXddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.fZd/Zd0Zd1Zi ed26e d36ed46e d56e d66e d76ed86e d96e d:6e d;6e d<6e d=6Z!d>Z"d,e#fd?YZ$d@efdAYZ%e%Z&dBZ'de(fdCYZ)d e)fdDYZ*d!e)fdEYZ+d*e,fdFYZ-d"e)fdGYZ.d#e)fdHYZ/d&e)fdIYZ0d'e0fdJYZ1d)e)fdKYZ2d(e0fdLYZ3d+e)fdMYZ4dNefdOYZ5dPe5fdQYZ6dRe5fdSYZ7ie6d/6e7dT6Z8dUZ9dVe:fdWYZ;d$e;fdXYZ<d%efdYYZ=e e dZZ>fd[Z?dS(\i(t generatorsN(tBOM_UTF8t BOM_UTF16t BOM_UTF16_BEt BOM_UTF16_LEtutf_8tutf16_betutf_16tutf16_letu16tutf16sutf-16t utf_16_besutf-16bet utf_16_lesutf-16letu8tutftutf8sutf-8cCstj|jdkS(NR(tBOM_LISTtgettlower(tencoding((s-/usr/lib/python2.7/site-packages/configobj.pyt match_utf8Gss'%s's"%s"s%ss '"s"""%s"""s'''%s'''s4.7.2cCsx|D]}|rtSqWtS(N(tTruetFalse(titerabletentry((s-/usr/lib/python2.7/site-packages/configobj.pytany[s t __version__tDEFAULT_INDENT_TYPEtDEFAULT_INTERPOLATIONtConfigObjErrort NestingErrort ParseErrortDuplicateErrortConfigspecErrort ConfigObjt SimpleValtInterpolationErrortInterpolationLoopErrortMissingInterpolationOptiontRepeatSectionErrort ReloadErrort UnreprErrort UnknownTypetflatten_errorstget_extra_valuest configparsers i t interpolationt raise_errorst list_valuest create_emptyt file_errort configspect stringifyt indent_typeRtdefault_encodingtunreprtwrite_empty_valuescCsVtdkrddland|}tj|}|jdjdjdS(Nisa=ii(tcompilertNonetparset getChildren(tstp((s-/usr/lib/python2.7/site-packages/configobj.pytgetObjs   cBseZRS((t__name__t __module__(((s-/usr/lib/python2.7/site-packages/configobj.pyR*stBuildercBsbeZdZdZdZdZdZdZdZdZ dZ d Z RS( cCsGt|d|jjd}|dkr=t|jjn||S(Ntbuild_(tgetattrt __class__R@R:R*(tselftotm((s-/usr/lib/python2.7/site-packages/configobj.pytbuilds cCst|j|jS(N(tmapRIR<(RFRG((s-/usr/lib/python2.7/site-packages/configobj.pyt build_ListscCs|jS(N(tvalue(RFRG((s-/usr/lib/python2.7/site-packages/configobj.pyt build_ConstscCsIi}tt|j|j}x|D]}|j||\$) | # Two $ signs (?P[_a-z][_a-z0-9]*) | # $name format {(?P[^}]*)} # ${name} format ) cCs|jdp|jd}|dk rL|j|\}}|||fS|jddk rqd|jdfSd|jdfS(Ntnamedtbracedtescaped(RR:Rt _delimiter(RFR|RzRLRs((s-/usr/lib/python2.7/site-packages/configobj.pyRvs  ( R@RARmRRRRt IGNORECASEtVERBOSERtRv(((s-/usr/lib/python2.7/site-packages/configobj.pyRs ttemplatecGs|j||S(N(t__new__(tclstargs((s-/usr/lib/python2.7/site-packages/configobj.pyt __newobj__sRcBsReZdZdZdZd!d!dZdZdZdZ e dZ dZ d!d Z d Zed Zd Zd Zd!dZdZdZdZdZdZeZdZdZeZde_dZdZdZe e dZ!dZ"dZ#dZ$dZ%dZ&d Z'RS("s A dictionary-like object that represents a section in a config file. It does string interpolation if the 'interpolation' attribute of the 'main' object is set to True. Interpolation is tried first from this object, then from the 'DEFAULT' section of this object, next from the parent and its 'DEFAULT' section, and so on until the main object is reached. A Section will behave like an ordered dictionary - following the order of the ``scalars`` and ``sections`` attributes. You can use this to change the order of members. Iteration follows the order: scalars, then sections. cCs,tj||d|jj|ddS(Nii(tdicttupdatet__dict__(RFtstate((s-/usr/lib/python2.7/site-packages/configobj.pyt __setstate__scCs(t||jf}t|jf|fS(N(RRRRE(RFR((s-/usr/lib/python2.7/site-packages/configobj.pyt __reduce__scCs{|dkri}ntj|||_||_||_||_|jx$|jD]\}}|||t}n|j}tj|d}|dkrxt |j_|S||}|_nX|j ||S(N( t_interpolation_enginetAttributeErrorRR.RRRtinterpolation_enginesRR:RR(RFRzRLtengineRVtclass_((s-/usr/lib/python2.7/site-packages/configobj.pyt _interpolates        cstj}jjrt|tr=j|St|trfd}g|D]}||^qe}||kr|Sqn|S(s+Fetch the item and do string interpolation.cs#t|trj|S|S(N(R[t basestringR(R(RzRF(s-/usr/lib/python2.7/site-packages/configobj.pyt_check<s(Rt __getitem__RR.R[RRtlist(RFRzRRRtnew((RzRFs-/usr/lib/python2.7/site-packages/configobj.pyR5s   c Cst|ts"td|n||jkrNg|j|A version of ``get`` that doesn't bypass string interpolation.N(tKeyError(RFRztdefault((s-/usr/lib/python2.7/site-packages/configobj.pyRs  cCs#x|D]}|||| v, remove specified key and return the corresponding value. If key is not found, d is returned if given, otherwise KeyError is raised' (RtMISSING(RFRzRR((s-/usr/lib/python2.7/site-packages/configobj.pytpops   cCsJ|j|j}|s%tdn|d}||}||=||fS(sPops the first (key,val)s": 'popitem(): dictionary is empty'i(RRR(RFtsequenceRzR((s-/usr/lib/python2.7/site-packages/configobj.pytpopitems  cCsPtj|g|_g|_i|_i|_d|_g|_g|_ dS(s A version of clear that also affects scalars/sections Also clears comments and configspec. Leaves other attributes alone : depth/main/parent are not affected N( RtclearRRRRR:R3RR(RF((s-/usr/lib/python2.7/site-packages/configobj.pyRs       cCs3y ||SWn tk r.|||<||SXdS(s:A version of setdefault that sets sequence if appropriate.N(R(RFRzR((s-/usr/lib/python2.7/site-packages/configobj.pyt setdefaults    cCst|j|j|jS(s8D.items() -> list of D's (key, value) pairs, as 2-tuples(tzipRRtvalues(RF((s-/usr/lib/python2.7/site-packages/configobj.pytitemsscCs|j|jS(sD.keys() -> list of D's keys(RR(RF((s-/usr/lib/python2.7/site-packages/configobj.pytkeysscCs%g|j|jD]}||^qS(s D.values() -> list of D's values(RR(RFRz((s-/usr/lib/python2.7/site-packages/configobj.pyRscCst|jS(s=D.iteritems() -> an iterator over the (key, value) items of D(RNR(RF((s-/usr/lib/python2.7/site-packages/configobj.pyRscCst|j|jS(s.D.iterkeys() -> an iterator over the keys of D(RNRR(RF((s-/usr/lib/python2.7/site-packages/configobj.pytiterkeysscCst|jS(s2D.itervalues() -> an iterator over the values of D(RNR(RF((s-/usr/lib/python2.7/site-packages/configobj.pyt itervaluessc sYfd}ddjgjjD](}dt|t||f^q)S(sx.__repr__() <==> repr(x)cs1y |SWntk r,tj|SXdS(N(R&RR(Rz(RF(s-/usr/lib/python2.7/site-packages/configobj.pyt_getvals  s{%s}s, s%s: %s(RxRRtrepr(RFRRz((RFs-/usr/lib/python2.7/site-packages/configobj.pyt__repr__s sx.__str__() <==> str(x)cCsi}x||D]t}||}t|tr;|j}n<t|trYt|}nt|trwt|}n|||>> n = a.dict() >>> n == a 1 >>> n is a 0 (R[RRRRT(RFtnewdictRt this_entry((s-/usr/lib/python2.7/site-packages/configobj.pyRs   cCsmxf|jD]X\}}||kr[t||tr[t|tr[||j|q |||>> a = '''[section1] ... option1 = True ... [[subsection]] ... more_options = False ... # end of file'''.splitlines() >>> b = '''# File is user.ini ... [section1] ... option1 = False ... # end of file'''.splitlines() >>> c1 = ConfigObj(b) >>> c2 = ConfigObj(a) >>> c2.merge(c1) >>> c2 ConfigObj({'section1': {'option1': 'False', 'subsection': {'more_options': 'False'}}}) N(RR[Rtmerge(RFRRzR((s-/usr/lib/python2.7/site-packages/configobj.pyRs cCs||jkr|j}n+||jkr6|j}ntd||j|}||}tj||tj||||j||j|||j |}|j |}|j |=|j |=||j |<||j |>> config = '''[XXXXsection] ... XXXXkey = XXXXvalue'''.splitlines() >>> cfg = ConfigObj(config) >>> cfg ConfigObj({'XXXXsection': {'XXXXkey': 'XXXXvalue'}}) >>> def transform(section, key): ... val = section[key] ... newkey = key.replace('XXXX', 'CLIENT1') ... section.rename(key, newkey) ... if isinstance(val, (tuple, list, dict)): ... pass ... else: ... val = val.replace('XXXX', 'CLIENT1') ... section[newkey] = val >>> cfg.walk(transform, call_on_sections=True) {'CLIENT1section': {'CLIENT1key': None}} >>> cfg ConfigObj({'CLIENT1section': {'CLIENT1key': 'CLIENT1value'}}) R/tcall_on_sections(trangeRyRt ExceptionRRtwalk( RFtfunctionR/RtkeywargstoutRQRR((s-/usr/lib/python2.7/site-packages/configobj.pyRWs:/        cCs||}|tkrtS|tkr*tSy3t|tsHtn|jj|jSWn!tk rtd|nXdS(s_ Accepts a key as input. The corresponding value must be a string or the objects (``True`` or 1) or (``False`` or 0). We allow 0 and 1 to retain compatibility with Python 2.2. If the string is one of ``True``, ``On``, ``Yes``, or ``1`` it returns ``True``. If the string is one of ``False``, ``Off``, ``No``, or ``0`` it returns ``False``. ``as_bool`` is not case sensitive. Any other input will raise a ``ValueError``. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_bool('a') Traceback (most recent call last): ValueError: Value "fish" is neither True nor False >>> a['b'] = 'True' >>> a.as_bool('b') 1 >>> a['b'] = 'off' >>> a.as_bool('b') 0 s$Value "%s" is neither True nor FalseN( RRR[RRRt_boolsRR(RFRzR((s-/usr/lib/python2.7/site-packages/configobj.pytas_bools     cCst||S(si A convenience method which coerces the specified value to an integer. If the value is an invalid literal for ``int``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_int('a') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: 'fish' >>> a['b'] = '1' >>> a.as_int('b') 1 >>> a['b'] = '3.2' >>> a.as_int('b') Traceback (most recent call last): ValueError: invalid literal for int() with base 10: '3.2' (tint(RFRz((s-/usr/lib/python2.7/site-packages/configobj.pytas_intscCst||S(s A convenience method which coerces the specified value to a float. If the value is an invalid literal for ``float``, a ``ValueError`` will be raised. >>> a = ConfigObj() >>> a['a'] = 'fish' >>> a.as_float('a') Traceback (most recent call last): ValueError: invalid literal for float(): fish >>> a['b'] = '1' >>> a.as_float('b') 1.0 >>> a['b'] = '3.2' >>> a.as_float('b') 3.2000000000000002 (RY(RFRz((s-/usr/lib/python2.7/site-packages/configobj.pytas_floatscCs0||}t|ttfr)t|S|gS(sU A convenience method which fetches the specified value, guaranteeing that it is a list. >>> a = ConfigObj() >>> a['a'] = 1 >>> a.as_list('a') [1] >>> a['a'] = (1,) >>> a.as_list('a') [1] >>> a['a'] = [1] >>> a.as_list('a') [1] (R[RTR(RFRztresult((s-/usr/lib/python2.7/site-packages/configobj.pytas_lists  cCsF|j|}tj|||||jkrB|jj|n|S(s Restore (and return) default value for the specified key. This method will only work for a ConfigObj that was created with a configspec and has been validated. If there is no default value for this key, ``KeyError`` is raised. (RRRRR(RFRzR((s-/usr/lib/python2.7/site-packages/configobj.pytrestore_defaults cCsGx|jD]}|j|q Wx|jD]}||jq+WdS(s' Recursively restore default values to all members that have them. This method will only work for a ConfigObj that was created with a configspec and has been validated. It doesn't delete or modify entries without default values. N(RRRtrestore_defaults(RFRzRs((s-/usr/lib/python2.7/site-packages/configobj.pyR+s N((R@RARmRRR:RkRRRRRRRRRRRRRRRRRRt__iter__RRt__str__RRRRRRRRRRR(((s-/usr/lib/python2.7/site-packages/configobj.pyRsH      ;                T ,    cBsFeZdZejdejZejdejZejdejZejdejZ ejdejZ ejdZ ejdZ ejdZ ejd Zie e fd 6e efd 6Zied 6ed 6ed6ed6ed6ed6ed6ed6Zd/d/d/d/eeeeeed/d/eeedZdZd/dZdZdZdZdZdZdZdZdZdZd Z ed!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d/d/d+Z+eed/d,Z,d-Z-d.Z.RS(0s2An object to read, create, and write config files.s^ # line start (\s*) # indentation ( # keyword (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'"=].*?) # no quotes ) \s*=\s* # divider (.*) # value (including list values and comments) $ # line end s=^ (\s*) # 1: indentation ((?:\[\s*)+) # 2: section marker open ( # 3: section name open (?:"\s*\S.*?\s*")| # at least one non-space with double quotes (?:'\s*\S.*?\s*')| # at least one non-space with single quotes (?:[^'"\s].*?) # at least one non-space unquoted ) # section name close ((?:\s*\])+) # 4: section marker close \s*(\#.*)? # 5: optional comment $s^ (?: (?: ( (?: (?: (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#][^,\#]*?) # unquoted ) \s*,\s* # comma )* # match all list items ending in a comma (if any) ) ( (?:".*?")| # double quotes (?:'.*?')| # single quotes (?:[^'",\#\s][^,]*?)| # unquoted (?:(?infile must be a filename, file like object, or list of lines.is s s s at line %s.iis2Parsing failed with several errors. First error %s(s s s (s s s ("R[RtfilenametostpathtisfiletopenR tcloseR2RnR1twriteRRTRR"t_errorsR:t_handle_configspecR3RDRRZt _handle_bomtendswithtnewlinestrstript_parseRiRyRterrorstconfig( RFRR3thRRhRtinfoRpterror((R s-/usr/lib/python2.7/site-packages/configobj.pyRsl              %         cCs |dkrt}nd|_g|_|d|_|d|_|d|_|d|_|d|_|d|_ |d|_ |d|_ |d |_ t |_d|_|d |_|d |_g|_g|_d|_|jrt |_ntj|dS( NR/R.R0R1R2R4R5RR6R8R7(R:RR RR/R.R0R1R2R4R5RR6RtBOMRR8R7tinitial_commentt final_commentR3RRR(RFR((s-/usr/lib/python2.7/site-packages/configobj.pyR>s.                      c sYfd}ddjgjjD](}dt|t||f^q)S(Ncs1y |SWntk r,tj|SXdS(N(R&RR(Rz(RF(s-/usr/lib/python2.7/site-packages/configobj.pyR_s  sConfigObj({%s})s, s%s: %s(RxRRR(RFRRz((RFs-/usr/lib/python2.7/site-packages/configobj.pyR^s cCsI|jdk r7|jjtkr7|j||jSt|ttfrY|d}n|}|jdk rnt|jj}|dkrxKtj D]=\}\}}|sqn|j |r|j||SqW|j||jSt |}|j |s|j||jS|t |}t|ttfrL||d>> filename = a.filename >>> a.filename = 'test.ini' >>> a.write() >>> a.filename = filename >>> a == ConfigObj('test.ini', raise_errors=True) 1 >>> import os >>> os.remove('test.ini') R2s# RsRRgitmodeRtwin32s s twbN(.R5R:RR,R.RRR0R5R#RRRRRRtlstripRwRR[RRvtextendRRuR R RtencodeRRRRRRR tlinesepRDRxtsystplatformRxRRRR(RFtoutfileRsRtcstcsptint_valRht stripped_lineRtRt comment_lineRRLtlR(toutputR((s-/usr/lib/python2.7/site-packages/configobj.pyRs                 ('  '    c sdkrjdkr*tdnrLddlm}|_nrjj_jj_jj_jj _ jj _ jj _ qnjj fd}it }t }gjD]} | kr| ^q} gjD]} | jkr6| ^q6} gjD]} | jkra| ^qa} xjD]} | dkrqn| jks| jkr!t }d}r1| jkr1jj| gj| <jj| dj| s   "            8     |   g< PK[8`5Asite-packages/backports.ssl_match_hostname-3.5.0.1-py2.7.egg-infonu[Metadata-Version: 1.1 Name: backports.ssl_match_hostname Version: 3.5.0.1 Summary: The ssl.match_hostname() function from Python 3.5 Home-page: http://bitbucket.org/brandon/backports.ssl_match_hostname Author: Toshio Kuratomi Author-email: toshio@fedoraproject.org License: Python Software Foundation License Description: The ssl.match_hostname() function from Python 3.5 ================================================= The Secure Sockets Layer is only actually *secure* if you check the hostname in the certificate returned by the server to which you are connecting, and verify that it matches to hostname that you are trying to reach. But the matching logic, defined in `RFC2818`_, can be a bit tricky to implement on your own. So the ``ssl`` package in the Standard Library of Python 3.2 and greater now includes a ``match_hostname()`` function for performing this check instead of requiring every application to implement the check separately. This backport brings ``match_hostname()`` to users of earlier versions of Python. Simply make this distribution a dependency of your package, and then use it like this:: from backports.ssl_match_hostname import match_hostname, CertificateError [...] sslsock = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_SSLv23, cert_reqs=ssl.CERT_REQUIRED, ca_certs=...) try: match_hostname(sslsock.getpeercert(), hostname) except CertificateError, ce: ... Brandon Craig Rhodes is merely the packager of this distribution; the actual code inside comes from Python 3.5 with small changes for portability. Requirements ------------ * If you want to verify hosts match with certificates via ServerAltname IPAddress fields, you need to install the `ipaddress module`_. backports.ssl_match_hostname will continue to work without ipaddress but will only be able to handle ServerAltName DNSName fields, not IPAddress. System packagers (Linux distributions, et al) are encouraged to add this as a hard dependency in their packages. * If you need to use this on Python versions earlier than 2.6 you will need to install the `ssl module`_. From Python 2.6 upwards ``ssl`` is included in the Python Standard Library so you do not need to install it separately. .. _`ipaddress module`:: https://pypi.python.org/pypi/ipaddress .. _`ssl module`:: https://pypi.python.org/pypi/ssl History ------- * This function was introduced in python-3.2 * It was updated for python-3.4a1 for a CVE (backports-ssl_match_hostname-3.4.0.1) * It was updated from RFC2818 to RFC 6125 compliance in order to fix another security flaw for python-3.3.3 and python-3.4a5 (backports-ssl_match_hostname-3.4.0.2) * It was updated in python-3.5 to handle IPAddresses in ServerAltName fields (something that backports.ssl_match_hostname will do if you also install the ipaddress library from pypi). .. _RFC2818: http://tools.ietf.org/html/rfc2818.html Platform: UNKNOWN Classifier: Development Status :: 5 - Production/Stable Classifier: License :: OSI Approved :: Python Software Foundation License Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.0 Classifier: Programming Language :: Python :: 3.1 Classifier: Topic :: Security :: Cryptography PK[oa+site-packages/prettytable.pyonu[ F`Qc@sdZddlZddlZddlZddlZddlZddlZddlZddlZej ddkZ e re Z e Z eZeZeZddlmZn(ejZejZeZddlmZe oej ddkrddlmZnddlmZdZdZdZdZd Z d Z!d Z"d Z#ej$d Z%dZ&de'fdYZ(dZ)dZ*e+dZ,dZ-defdYZ.dZ/dZ0dZ1e2dkre1ndS(s0.7.2iNii(t HTMLParserii(tescapei i i is \[[0-9;]*mcCsJ|jd}t|}tg|D]}t|^q%}||fS(Ns (tsplittlentmaxt_str_block_width(ttexttlinestheighttlinetwidth((s//usr/lib/python2.7/site-packages/prettytable.pyt _get_sizeLs %t PrettyTablecBs-eZdgdZdZdZdZdZerHdZ n dZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZeeeZdZdZ eee Z!dZ"dZ#ee"e#Z$dZ%dZ&ee%e&Z'd Z(d!Z)ee(e)Z*d"Z+d#Z,ee+e,Z-d$Z.d%Z/ee.e/Z0d&Z1d'Z2ee1e2Z3d(Z4d)Z5ee4e5Z6d*Z7d+Z8ee7e8Z9d,Z:d-Z;ee:e;Z<d.Z=d/Z>ee=e>Z?d0Z@d1ZAee@eAZBd2ZCd3ZDeeCeDZEd4ZFd5ZGeeFeGZHd6ZId7ZJeeIeJZKd8ZLd9ZMeeLeMZNd:ZOd;ZPeeOePZQd<ZRd=ZSeeReSZTd>ZUd?ZVeeUeVZWd@ZXdAZYeeXeYZZdBZ[dCZ\ee[e\Z]dDZ^dEZ_ee^e_Z`dFZadGZbeeaebZcdHZddIZeeedeeZfdJZgdKZheegehZidLZjdMZkdNZldOZmdPZndQZodRZpdSZqdTdUdVZrdWZsdXZtdYZudZZvd[Zwd\Zxd]Zyd^Zzd_Z{d`Z|daZ}dbZ~dcZddZdeZdfZRS(hcKs |jdd|_g|_i|_i|_i|_g|_|rT||_n g|_dj |_ |j j dj |j j dj x>|j D]3}||kr|j |||qd#||st int_formatt float_formatt padding_widthitleft_padding_widthtright_padding_widtht vertical_chart|thorizontal_chart-t junction_chart+t print_emptytformattxhtmlt attributesN(*tgetR t _field_namest_alignt_valignt _max_widtht_rowst field_namest_widthsRt_optionstextendt_validate_optiontNonet_startt_endt_fieldstTruetFalset_headert _header_stylet_bordertFRAMEt_hrulestALLt_vrulest_sortbyt _reversesortt _sort_keyt _int_formatt _float_formatt_padding_widtht_left_padding_widtht_right_padding_widtht_unicodet_vertical_chart_horizontal_chart_junction_chart _print_emptyt_formatt_xhtmlt _attributes(tselfR0tkwargstoption((s//usr/lib/python2.7/site-packages/prettytable.pyt__init__Ts^            cCsIt|tst|}nt|tsEt||jd}n|S(Ntstrict(t isinstancet basestringtstrtunicodeR (RRtvalue((s//usr/lib/python2.7/site-packages/prettytable.pyRJs cCs|t|}|dkr(||dS|dkr@|d|S|drt|drz|dd||dddS|ddd||ddSn|dd||ddSdS(Ntlt trii(R(RRRR taligntexcess((s//usr/lib/python2.7/site-packages/prettytable.pyt_justifys      #cCsl|dkrt|jS|dkr\|jr;t|jS|jrUt|jdSdSn t|dS(Ntrowcounttcolcounti(RR/R+tAttributeError(RRtname((s//usr/lib/python2.7/site-packages/prettytable.pyt __getattr__s      cCst}|j|_x2|jD]'}t|d|t|d|qWt|dt|dt|trxa|j|D]}|j|qWn<t|t r|j|j|nt dt ||S(Nt_R,s0Index %s is invalid, must be an integer or slice( R R0R2tsetattrtgetattrRWtsliceR/tadd_rowtintt ExceptionRY(RRtindextnewtattrtrow((s//usr/lib/python2.7/site-packages/prettytable.pyt __getitem__s  %cCs |jS(N(t __unicode__(RR((s//usr/lib/python2.7/site-packages/prettytable.pyt__str__scCs|jj|jS(N(RstencodeR (RR((s//usr/lib/python2.7/site-packages/prettytable.pyRtscCs |jS(N(t get_string(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRsscCs|dkr|j|n|dkr;|j||nb|d krZ|j||nC|d kry|j||n$|d kr|j||n|d kr|j||n|d kr|j||n|dkr|j||n|dkr|j|n|dkr0|j ||nm|dkrO|j ||nN|dkrn|j ||n/|dkr|j ||nt d|dS(NR0RRt max_widthRRRR'RRRRRRRRR(R&RRRR R"R$R)sUnrecognised option: %s!(sstartsends max_widths padding_widthsleft_padding_widthsright_padding_widthsformat(sheadersborders reversesortsxhtmls print_empty(s vertical_charshorizontal_chars junction_char(t_validate_field_namest_validate_nonnegative_intt_validate_field_namet_validate_functiont_validate_hrulest_validate_vrulest_validate_all_field_namest_validate_true_or_falset_validate_header_stylet_validate_int_formatt_validate_float_formatt_validate_single_chart_validate_attributesRm(RRRTtval((s//usr/lib/python2.7/site-packages/prettytable.pyR4s6             cCs|jrIyWqItk rEtdt|t|jfqIXn|jryWqtk rtdt|t|jdfqXnyWntk rtdnXdS(NsJField name list has incorrect number of values, (actual) %d!=%d (expected)isField names must be unique!(R+tAssertionErrorRmRR/(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyRxs  ,  0 cCs(yWntk r#tdnXdS(Ns;Invalid header style, use cap, title, upper, lower or None!(RRm(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyR0s cCs,yWn!tk r'td|nXdS(Ns'Alignment %s is invalid, use l, c or r!(RRm(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyt_validate_align6s cCs,yWn!tk r'td|nXdS(Ns-Alignment %s is invalid, use t, m, b or None!(RRm(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyt_validate_valign<s cCs;yWn0tk r6td||j|fnXdS(NsInvalid value for %s: %s!(RRmRJ(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRyBs cCs,yWn!tk r'td|nXdS(Ns-Invalid value for %s! Must be True or False.(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRHs cCs<|dkrdSyWn!tk r7td|nXdS(Nts8Invalid value for %s! Must be an integer format string.(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRNs   cCsK|dkrdSy|jd}Wn!tk rFtd|nXdS(NRt.s5Invalid value for %s! Must be a float format string.(RRRm(RRReRtbits((s//usr/lib/python2.7/site-packages/prettytable.pyRWs  cCs,yWn!tk r'td|nXdS(Ns*Invalid value for %s! Must be a function.(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyR{ds cCs,yWn!tk r'td|nXdS(Ns:Invalid value for %s! Must be ALL, FRAME, HEADER or NONE.(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyR|js cCs,yWn!tk r'td|nXdS(Ns3Invalid value for %s! Must be ALL, FRAME, or NONE.(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyR}ps cCs,yWn!tk r'td|nXdS(NsInvalid field name: %s!(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRzvs cCsIy%x|D]}|j||q WWntk rDtdnXdS(Ns)fields must be a sequence of field names!(RzRRm(RRReRR((s//usr/lib/python2.7/site-packages/prettytable.pyR~|s   cCs,yWn!tk r'td|nXdS(Ns4Invalid value for %s! Must be a string of length 1.(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRs cCs(yWntk r#tdnXdS(Ns4attributes must be a dictionary of name/value pairs!(RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRs cCs|jS(N(R+(RR((s//usr/lib/python2.7/site-packages/prettytable.pyt_get_field_namesscCsg|D]}|j|^q}|jd||jrH|j}n||_|jr|rx1t||D] \}}|j||j| tag when printing HTML Arguments: attributes - dictionary of attributes(RQ(RR((s//usr/lib/python2.7/site-packages/prettytable.pyt_get_attributesscCs|jd|||_dS(NR)(R4RQ(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyt_set_attributesscCsfi}xY|jD]N}||krG|j||||||||tkrK|jn%|tkrd|jn tddS(NsInvalid pre-set style!( tDEFAULTt_set_default_styletMSWORD_FRIENDLYt_set_msword_stylet PLAIN_COLUMNSt_set_columns_styletRANDOMt_set_random_styleRm(RRtstyle((s//usr/lib/python2.7/site-packages/prettytable.pyt set_styles        cCs^t|_t|_t|_t|_d|_d|_d|_ d|_ d|_ d|_ dS(NiR!R#R%( R9RRR>R?R@RARRRR R"R$(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRs         cCsCt|_t|_t|_d|_d|_d|_d|_dS(NiR!( R9RRtNONER?RRRR (RR((s//usr/lib/python2.7/site-packages/prettytable.pyRs      cCs1t|_t|_d|_d|_d|_dS(Niii(R9RR:RRRR(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRs     cCstjttf|_tjttf|_tjtttt f|_ tjttt f|_ tj dd|_ tj dd|_tjd|_tjd|_tjd|_dS(Niis ~!@#$%^&*()_+|-=\{}[];':",./;<>?(trandomtchoiceR9R:RRR@R>tHEADERRR?RAtrandintRRR R"R$(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRscCs|jrLt|t|jkrLtdt|t|jfn|jsgtdt|D]}d|d^qk|_n|jjt|dS(sAdd a row to the table Arguments: row - row of data, should be a list with as many elements as the table has fieldss>Row has incorrect number of values, (actual) %d!=%d (expected)isField %diN(R+RRmtrangeR0R/tappendtlist(RRRqtn((s//usr/lib/python2.7/site-packages/prettytable.pyRk(s $( 6cCsI|t|jdkr;td|t|jfn|j|=dS(sDelete a row to the table Arguments: row_index - The index of the row you want to delete. Indexing starts at 0.is4Cant delete row at index %d, table only has %d rows!N(RR/Rm(RRt row_index((s//usr/lib/python2.7/site-packages/prettytable.pytdel_row7s"RRcCst|jdt|fkr|j||j||jj|||j|<||j||d s:|d r>dS|j|}|j||}|j|||j||_|dr|j|j|n3|dr|dt t fkr|j|jnx'|D]}|j|j ||qW|dr.|dt kr.|j|jn|j dj |S(s"Return string representation of table in current state. Arguments: start - index of first data row to include in output end - index of last data row to include in output PLUS ONE (list slice style) fields - names of fields (columns) to include header - print a header showing field names (True or False) border - print a border around the table (True or False) hrules - controls printing of horizontal rules after rows. Allowed values: ALL, FRAME, HEADER, NONE vrules - controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE int_format - controls formatting of integer data float_format - controls formatting of floating point data padding_width - number of spaces on either side of column data (only used if left and right paddings are None) left_padding_width - number of spaces on left hand side of column data right_padding_width - number of spaces on right hand side of column data vertical_char - single character string used to draw vertical lines horizontal_char - single character string used to draw horizontal lines junction_char - single character string used to draw line junctions sortby - name of field to sort rows by sort_key - sorting key function, applied to data points before sorting reversesort - True or False to sort in descending or ascending order print empty - if True, stringify just the header for an empty table, if False return an empty string iR&RRRRs (RRbRRRt_stringify_hrulet_hruleRt_stringify_headerR@R>t_stringify_rowRJtjoin(RRRSRRRtformatted_rowsRq((s//usr/lib/python2.7/site-packages/prettytable.pyRvs"%   cCsP|dsdS|j|\}}|dttfkrI|dg}n |dg}|js}|j|ddj|Sxt|j|jD]~\}}|dr||dkrqn|j||||d|dtkr|j|dq|j|dqW|dtkrC|j|j|dndj|S(NRRRR$R"R( RR@R>R+RRRR1R(RRRRRRRR ((s//usr/lib/python2.7/site-packages/prettytable.pyRs(    " c Csg}|j|\}}|dr|dttfkr[|j|j|jdn|dttfkr|j|dq|jdn|js|dttfkr|j|dq|jdnx2t|j|jD]\}}|dr||dkrqn|jdkr8|j }n`|jd krV|j }nB|jd krt|j }n$|jd kr|j }n|}|jd||j |||j|d||dr|dtkr|j|dq |jdqqW|drE|dtkrE|j|j|dn|dr|dtkr|jd|j|jnd j|S( NRRs RR R]RtcapttitletuppertlowerR(RR@R>RRR+RR1R<t capitalizeRRRRaR,RRR(RRRRRRRR R((s//usr/lib/python2.7/site-packages/prettytable.pyR sJ  "3   c Csxttdt||j||jD]\}}}}|jd}g}xB|D]:} t| |krtj| |} n|j | qYW|}dj |}|||R R-RlRaR,RR(RRRqRRnRR[R Rt new_linesR t row_heightRthRRRtyRtdHeightR\((s//usr/lib/python2.7/site-packages/prettytable.pyR:sj=      (  7  7 cKs>|j|}|dr+|j|}n|j|}|S(s;Return string representation of HTML formatted version of table in current state. Arguments: start - index of first data row to include in output end - index of last data row to include in output PLUS ONE (list slice style) fields - names of fields (columns) to include header - print a header showing field names (True or False) border - print a border around the table (True or False) hrules - controls printing of horizontal rules after rows. Allowed values: ALL, FRAME, HEADER, NONE vrules - controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE int_format - controls formatting of integer data float_format - controls formatting of floating point data padding_width - number of spaces on either side of column data (only used if left and right paddings are None) left_padding_width - number of spaces on left hand side of column data right_padding_width - number of spaces on right hand side of column data sortby - name of field to sort rows by sort_key - sorting key function, applied to data points before sorting attributes - dictionary of name/value pairs to include as HTML attributes in the tag xhtml - print
tags if True,
tags if falseR'(Rt_get_formatted_html_stringt_get_simple_html_string(RRRSRtstring((s//usr/lib/python2.7/site-packages/prettytable.pytget_html_strings  c Csg}|drd}nd}g}|jd|drsx4|dD]%}|jd||d|fqGWn|jd|jdj||d r|jd xT|jD]I}|d r||d krqn|jd t|jd |qW|jdn|j|}|j||}x|D]} |jd xct|j| D]O\}} |d r||d krqbn|jdt| jd |qbW|jdq<W|jd|jd j|S(NR(s
s
sRRs Rs s s s s
%s
%s
( RRR+RtreplaceRRRRJ( RRRRt linebreaktopen_tagt attr_nameRRRRqtdatum((s//usr/lib/python2.7/site-packages/prettytable.pyRs:    &   '  ' cCsg}|j|\}}|dr.d}nd}g}|jd|drd|dtkr|dtkr|jdqd|dtkr|dtkr|jd qd|dtkr|dtkr|jd qd|dtkr|jd qd|dtkr!|jd qd|dtkrA|jd qd|dtkrd|jdqdn|drx4|dD]%}|jd||d|fqyWn|jd|jdj||drO|jdx]|jD]R}|dr||dkrqn|jd||t|jd|fqW|jdn|j|} |j | |} g} g} xk|jD]`}| jidd6dd6dd6|j || jidd 6d!d"6d#d$6|j |qWx| D]} |jdx~t |j| | | D]d\}}}}|drO||dkrOqn|jd%||||t|jd|fqW|jdqW|jd&|j dj|S('NR(s
s
sRsW
%s
%s
(RRR@R>RR+RRRRR,R-RRJ(RRRRRRRRRRRRtalignstvalignsRqRR_R((s//usr/lib/python2.7/site-packages/prettytable.pyR sd        &   0-1  +6 N(t__name__t __module__R5RURJRaRfRrtpy3kRtRsR4RxRRRRyRRRR{R|R}RzR~RRRRtpropertyR0RRR_RRRRRRwRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRR"RRR$RRR'RRR&RRR)RRRRRRRkRRRRRRRRRRRRvRRRRRR (((s//usr/lib/python2.7/site-packages/prettytable.pyR Rs ]                                                                                     =  / L (c Csd|kodknr dSd|ko7dknr@dSd|koWdknr`dStjt|ryd Sd |kod knsd |kod knrdSd|kodknrdSd|kodknrdS|dkrdS|dkrd SdS(Ni!i~iiNiiiiii@0i0i0i0ii`i0i>0iiii(ii(ii(t unicodedatat combiningtuni_chr(tchar((s//usr/lib/python2.7/site-packages/prettytable.pyt_char_block_widths&8  cCs(ttttttjd|S(NR(tsumtitermapR'tordt_retsub(R((s//usr/lib/python2.7/site-packages/prettytable.pyR/scKstjj|jd}|jdtj||}t|}|r[||_nYtrgt |D]}|j ^qn|_n(g|j D]}|j ^q|_x4|D],}|j g|D]}|j ^qqW|S(Nii( tcsvtSniffertsnifftreadtseektreaderR R0R!tnexttstripRk(tfpR0RStdialectR2ttableRRq((s//usr/lib/python2.7/site-packages/prettytable.pytfrom_csv7s   +( *cKsd|jr`t|}g|jD]}|d^q|_x!|jD]}|j|qEW|SdS(Ni(t descriptionR R0tfetchallRk(tcursorRSR7tcolRq((s//usr/lib/python2.7/site-packages/prettytable.pytfrom_db_cursorKs   #t TableHandlercBs>eZdZdZdZdZdZdZRS(cKsYtj|||_g|_g|_g|_d|_d|_d|_ t |_ dS(NiR( RRURSttablestlast_rowRt max_row_widthR5tactivet last_contentR:tis_last_row_header(RRRS((s//usr/lib/python2.7/site-packages/prettytable.pyRUVs        cCs%||_|dkr!t|_ndS(Ntth(RBR9RD(RRttagtattrs((s//usr/lib/python2.7/site-packages/prettytable.pythandle_starttagas  cCs|dkr.|jj}|jj|n|dkr|jj|j|jft|jt|j|_g|_t |_n|dkr|j |j}|j j|g|_nd|_d|_ dS(NREttdttrR7R](sthRI(RCR4R@RRRDRRARR:tgenerate_tableR?R5RB(RRRFtstripped_contentR7((s//usr/lib/python2.7/site-packages/prettytable.pyt handle_endtagfs        cCs|j|7_dS(N(RC(RRtdata((s//usr/lib/python2.7/site-packages/prettytable.pyt handle_dataxscCst|j}x|jD]}t|d|jkr}|jt|d}x+td|D]}|djdq_Wn|dtkr|j|d|d|_ q|j |dqW|S(sE Generates from a list of rows a PrettyTable object. iiR#( R RSRRRARRR9tmake_fields_uniqueR0Rk(RRRR7RqtappendsR((s//usr/lib/python2.7/site-packages/prettytable.pyRK{scCsoxhtdt|D]Q}xHt|dt|D]-}||||kr6||cd7Ts     cKs t|}|j||jS(s Generates a list of PrettyTables from a string of HTML code. Each in the HTML becomes one PrettyTable object. (R>tfeedR?(t html_codeRStparser((s//usr/lib/python2.7/site-packages/prettytable.pyt from_htmls  cKs;t||}yWntk r2tdnX|dS(sf Generates a PrettyTables from a string of HTML code which contains only a single
sDMore than one
in provided HTML code! Use from_html instead.i(RWRRm(RURSR?((s//usr/lib/python2.7/site-packages/prettytable.pyt from_html_ones  cCstddddg}d|_t|_d|jdR@RRRRRRtcompileR+R tobjectR R'RR5R8R=R>RWRXRcR(((s//usr/lib/python2.7/site-packages/prettytable.pyt s`            !   B   PK[z''site-packages/ipaddress.pycnu[ lVc@sdZddlmZddlZddlZdZefZyeefZWne k r`nXy e Z Wn)e k re Z e e kstnXdddkrdZn dZy ejZWnek rd ZnXd Zeed r d Zn d ZddZdefdYZdZdZdefdYZdefdYZdZedZ dZ!dZ"dZ#dZ$dZ%dZ&d Z'd!Z(d"Z)d#Z*d$efd%YZ+d&e+fd'YZ,d(e+fd)YZ-d*efd+YZ.d,e.e,fd-YZ/d.e/fd/YZ0d0e.e-fd1YZ1d2efd3YZ2e2e/_3d4efd5YZ4d6e4e,fd7YZ5d8e5fd9YZ6d:e4e-fd;YZ7d<efd=YZ8e8e5_3dS(>uA fast, lightweight IPv4/IPv6 manipulation library in Python. This library is used to create/poke/manipulate IPv4 and IPv6 addresses and networks. i(tunicode_literalsNu1.0.16ticCs|S(N((tbyt((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_bytes_to_byte_valsscCs'g|D]}tjd|d^qS(Ns!Bi(tstructtunpack(Rtb((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"scCsP|dkstd}x1|D])}t|ts:t|d>|}qW|S(Nubigii(tAssertionErrort isinstancet_compat_int_types(tbytvalst endianesstrestbv((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_int_from_byte_vals's  cCst|tst|dks't|dkrm|dksK|dkr]tjdntjd|S|dkr|dks|dkrtjd ntjd |d ?|d @StdS(Nubigiiii u(integer out of range for 'I' format codes!Iiiu)integer out of range for 'QQ' format codes!QQi@lIl (RR RRterrortpacktNotImplementedError(tintvaltlengthR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_to_bytes0s  u bit_lengthcCs |jS(N(t bit_length(ti((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compat_bit_length?scCs/x(tjD]}||?dkr |Sq WdS(Ni(t itertoolstcount(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyRBsiccs>|dkst|}x||kr9|V||7}qWdS(Ni(R(tstarttendtstepR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt _compat_rangeHs t_TotalOrderingMixincBsDeZdZdZdZdZdZdZdZRS(cCs tdS(N(R(tselftother((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__eq__WscCs$|j|}|tkrtS| S(N(R!tNotImplemented(RR tequal((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__ne__Zs cCs tdS(N(R(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__lt__`scCs3|j|}|tks"| r/|j|S|S(N(R%R"R!(RR tless((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__le__cs cCsI|j|}|tkrtS|j|}|tkr>tS|pG| S(N(R%R"R!(RR R&R#((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__gt__is  cCs$|j|}|tkrtS| S(N(R%R"(RR R&((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__ge__rs (( t__name__t __module__t __slots__R!R$R%R'R(R)(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRPs     i itAddressValueErrorcBseZdZRS(u%A Value Error related to the address.(R*R+t__doc__(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR-}stNetmaskValueErrorcBseZdZRS(u%A Value Error related to the netmask.(R*R+R.(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR/scCsyt|SWnttfk r'nXyt|SWnttfk rOnXt|trrtd|ntd|dS(uTake an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. Returns: An IPv4Address or IPv6Address object. Raises: ValueError: if the *address* passed isn't either a v4 or a v6 address ux%r does not appear to be an IPv4 or IPv6 address. Did you pass in a bytes (str in Python 2) instead of a unicode object?u0%r does not appear to be an IPv4 or IPv6 addressN(t IPv4AddressR-R/t IPv6AddressRtbytest ValueError(taddress((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ip_addresss cCsyt||SWnttfk r*nXyt||SWnttfk rUnXt|trxtd|ntd|dS(uTake an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP network. Either IPv4 or IPv6 networks may be supplied; integers less than 2**32 will be considered to be IPv4 by default. Returns: An IPv4Network or IPv6Network object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. Or if the network has host bits set. ux%r does not appear to be an IPv4 or IPv6 network. Did you pass in a bytes (str in Python 2) instead of a unicode object?u0%r does not appear to be an IPv4 or IPv6 networkN(t IPv4NetworkR-R/t IPv6NetworkRR2R3(R4tstrict((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ip_networks cCsdyt|SWnttfk r'nXyt|SWnttfk rOnXtd|dS(ugTake an IP string/int and return an object of the correct type. Args: address: A string or integer, the IP address. Either IPv4 or IPv6 addresses may be supplied; integers less than 2**32 will be considered to be IPv4 by default. Returns: An IPv4Interface or IPv6Interface object. Raises: ValueError: if the string passed isn't either a v4 or a v6 address. Notes: The IPv?Interface classes describe an Address on a particular Network, so they're basically a combination of both the Address and Network classes. u2%r does not appear to be an IPv4 or IPv6 interfaceN(t IPv4InterfaceR-R/t IPv6InterfaceR3(R4((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ip_interfacescCsAyt|ddSWn&tjtfk r<tdnXdS(u`Represent an address as 4 packed bytes in network (big-endian) order. Args: address: An integer representation of an IPv4 IP address. Returns: The integer address packed as 4 bytes in network (big-endian) order. Raises: ValueError: If the integer is negative or too large to be an IPv4 IP address. iubigu&Address negative or too large for IPv4N(RRRt OverflowErrorR3(R4((s-/usr/lib/python2.7/site-packages/ipaddress.pytv4_int_to_packedscCsAyt|ddSWn&tjtfk r<tdnXdS(uRepresent an address as 16 packed bytes in network (big-endian) order. Args: address: An integer representation of an IPv6 IP address. Returns: The integer address packed as 16 bytes in network (big-endian) order. iubigu&Address negative or too large for IPv6N(RRRR=R3(R4((s-/usr/lib/python2.7/site-packages/ipaddress.pytv6_int_to_packeds cCs>t|jd}t|dkr:td|n|S(uAHelper to split the netmask and raise AddressValueError if neededu/iuOnly one '/' permitted in %r(t _compat_strtsplittlenR-(R4taddr((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_split_optional_netmasksccslt|}t|}}x>|D]6}|j|jdkrS||fV|}n|}q#W||fVdS(uFind a sequence of sorted deduplicated IPv#Address. Args: addresses: a list of IPv#Address objects. Yields: A tuple containing the first and last IP addresses in the sequence. iN(titertnextt_ip(t addressestittfirsttlasttip((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_find_address_ranges     cCs,|dkr|St|t||d@S(uCount the number of zero bits on the right hand side. Args: number: an integer. bits: maximum number of bits to count. Returns: The number of zero bits on the right hand side of the number. ii(tminR(tnumbertbits((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_count_righthand_zero_bits0s ccsKt|tot|ts-tdn|j|jkrXtd||fn||krstdn|jdkrt}n$|jdkrt}n td|j}|j}|j}xz||krFt t ||t ||dd}||||f}|V|d|>7}|d|j krPqqWdS( uSummarize a network range given the first and last IP addresses. Example: >>> list(summarize_address_range(IPv4Address('192.0.2.0'), ... IPv4Address('192.0.2.130'))) ... #doctest: +NORMALIZE_WHITESPACE [IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/31'), IPv4Network('192.0.2.130/32')] Args: first: the first IPv4Address or IPv6Address in the range. last: the last IPv4Address or IPv6Address in the range. Returns: An iterator of the summarized IPv(4|6) network objects. Raise: TypeError: If the first and last objects are not IP addresses. If the first and last objects are not the same version. ValueError: If the last object is not greater than the first. If the version of the first address is not 4 or 6. u1first and last must be IP addresses, not networksu%%s and %s are not of the same versionu*last IP address must be greater than firstiiuunknown IP versioniN( Rt _BaseAddresst TypeErrortversionR3R6R7t_max_prefixlenRGRNRQRt _ALL_ONES(RJRKRLtip_bitst first_inttlast_inttnbitstnet((s-/usr/lib/python2.7/site-packages/ipaddress.pytsummarize_address_range@s0       ccst|}i}xm|r|j}|j}|j|}|dkr[||| [IPv4Network('192.0.2.0/24')] This shouldn't be called directly; it is called via collapse_addresses([]). Args: addresses: A list of IPv4Network's or IPv6Network's Returns: A list of IPv4Network's or IPv6Network's depending on what we were passed. N( tlisttpoptsupernettgettNonetappendtsortedtvaluestbroadcast_address(RHtto_mergetsubnetsR[R_texistingRK((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_collapse_addresses_internalws$         cCsg}g}g}x2|D]*}t|trw|rg|dj|jkrgtd||dfn|j|q|j|jkr|r|dj|jkrtd||dfny|j|jWqCtk r|j|j qCXq|r6|dj|jkr6td||dfn|j|qWt t |}|rx3t |D]"\}}|j t||qlWnt||S(uCollapse a list of IP objects. Example: collapse_addresses([IPv4Network('192.0.2.0/25'), IPv4Network('192.0.2.128/25')]) -> [IPv4Network('192.0.2.0/24')] Args: addresses: An iterator of IPv4Network or IPv6Network objects. Returns: An iterator of the collapsed IPv(4|6)Network objects. Raises: TypeError: If passed a list of mixed version objects. iu%%s and %s are not of the same version(RRRt_versionRSRbt _prefixlenRURLtAttributeErrortnetwork_addressRctsetRMtextendR\Ri(RHtaddrstipstnetsRLRJRK((s-/usr/lib/python2.7/site-packages/ipaddress.pytcollapse_addressess4  cCs6t|tr|jSt|tr2|jStS(u2Return a key suitable for sorting between networks and addresses. Address and Network objects are not sortable by default; they're fundamentally different so the expression IPv4Address('192.0.2.0') <= IPv4Network('192.0.2.0/24') doesn't make any sense. There are some times however, where you may wish to have ipaddress sort these for you anyway. If you need to do this, you can use this function as the key= argument to sorted(). Args: obj: either a Network or Address object. Returns: appropriate key. (Rt _BaseNetworkt_get_networks_keyRRt_get_address_keyR"(tobj((s-/usr/lib/python2.7/site-packages/ipaddress.pytget_mixed_type_keys   t_IPAddressBasecBseZdZd ZedZedZedZedZdZ dZ e dZ e dZ e d Ze d Ze d Zd ZRS(uThe mother class.cCs |jS(u:Return the longhand version of the IP address as a string.(t_explode_shorthand_ip_string(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytexplodedscCs t|S(u;Return the shorthand version of the IP address as a string.(R@(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt compressedscCs |jS(uIThe name of the reverse DNS pointer for the IP address, e.g.: >>> ipaddress.ip_address("127.0.0.1").reverse_pointer '1.0.0.127.in-addr.arpa' >>> ipaddress.ip_address("2001:db8::1").reverse_pointer '1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa' (t_reverse_pointer(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytreverse_pointers cCs#dt|f}t|dS(Nu%200s has no version specified(ttypeR(Rtmsg((s-/usr/lib/python2.7/site-packages/ipaddress.pyRTscCsi|dkr.d}t|||jfn||jkred}t|||j|jfndS(Niu-%d (< 0) is not permitted as an IPv%d addressu2%d (>= 2**%d) is not permitted as an IPv%d address(R-RjRVRU(RR4R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_check_int_addresss cCsDt|}||kr@d}t|||||jfndS(Nu~%r (len %d != %d) is not permitted as an IPv%d address. Did you pass in a bytes (str in Python 2) instead of a unicode object?(RBR-Rj(RR4t expected_lent address_lenR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_check_packed_address s    cCs|j|j|?AS(uTurn the prefix length into a bitwise netmask Args: prefixlen: An integer, the prefix length. Returns: An integer. (RV(tclst prefixlen((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_ip_int_from_prefix+s c Cst||j}|j|}||?}d|>d}||kr{|jd}t||d}d}t||n|S(uReturn prefix length from the bitwise netmask. Args: ip_int: An integer, the netmask in expanded bitwise format Returns: An integer, the prefix length. Raises: ValueError: If the input intermingles zeroes & ones iiubigu&Netmask pattern %r mixes zeroes & ones(RQRURR3( Rtip_intttrailing_zeroesRt leading_onestall_onestbyteslentdetailsR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_prefix_from_ip_int8s      cCsd|}t|dS(Nu%r is not a valid netmask(R/(Rt netmask_strR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_report_invalid_netmaskQs cCstjj|s"|j|nyt|}Wntk rR|j|nXd|kom|jkns|j|n|S(u Return prefix length from a numeric string Args: prefixlen_str: The string to be converted Returns: An integer, the prefix length. Raises: NetmaskValueError: If the input is not a valid netmask i(t_BaseV4t_DECIMAL_DIGITSt issupersetRtintR3RU(Rt prefixlen_strR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_prefix_from_prefix_stringVs cCsy|j|}Wntk r3|j|nXy|j|SWntk rXnX||jN}y|j|SWntk r|j|nXdS(uTurn a netmask/hostmask string into a prefix length Args: ip_str: The netmask/hostmask to be converted Returns: An integer, the prefix length. Raises: NetmaskValueError: If the input is not a valid netmask/hostmask N(t_ip_int_from_stringR-RRR3RV(Rtip_strR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_prefix_from_ip_stringos    cCs|jt|ffS(N(t __class__R@(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt __reduce__s((R*R+R.R,tpropertyR{R|R~RTRRt classmethodRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRys   "RRcBsneZdZd ZdZdZdZdZdZdZ dZ dZ d Z d Z RS( uA generic IP object. This IP class contains the version independent methods which are used by single IP addresses. cCs|jS(N(RG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__int__scCs?y&|j|jko$|j|jkSWntk r:tSXdS(N(RGRjRlR"(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyR!s  cCst|tstSt|ts;td||fn|j|jkrftd||fn|j|jkr|j|jkStS(Nu"%s and %s are not of the same typeu%%s and %s are not of the same version(RRyR"RRRSRjRGtFalse(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyR%scCs*t|tstS|jt||S(N(RR R"RR(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__add__scCs*t|tstS|jt||S(N(RR R"RR(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__sub__scCsd|jjt|fS(Nu%s(%r)(RR*R@(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__repr__scCst|j|jS(N(R@t_string_from_ip_intRG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__str__scCsttt|jS(N(thashthexRRG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__hash__scCs |j|fS(N(Rj(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRvscCs|j|jffS(N(RRG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs((R*R+R.R,RR!R%RRRRRRvR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRRs         RtcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z ed Zed ZedZedZedZedZedZedZdZdZdZdd#dZdd#dZedZdZdZedZ edZ!edZ"ed Z#ed!Z$ed"Z%RS($u~A generic IP network object. This IP class contains the version independent methods which are used by networks. cCs i|_dS(N(t_cache(RR4((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__init__scCsd|jjt|fS(Nu%s(%r)(RR*R@(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|jfS(Nu%s/%d(RmR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRsccsNt|j}t|j}x)t|d|D]}|j|Vq2WdS(uGenerate Iterator over usable hosts in a network. This is like __iter__ except it doesn't return the network or broadcast addresses. iN(RRmReRt_address_class(Rtnetworkt broadcasttx((s-/usr/lib/python2.7/site-packages/ipaddress.pythostssccsNt|j}t|j}x)t||dD]}|j|Vq2WdS(Ni(RRmReRR(RRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt__iter__scCst|j}t|j}|dkrT|||krCtn|j||S|d7}|||krwtn|j||SdS(Nii(RRmRet IndexErrorR(RtnRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyt __getitem__s    cCst|tstSt|ts;td||fn|j|jkrftd||fn|j|jkr|j|jkS|j|jkr|j|jkStS(Nu"%s and %s are not of the same typeu%%s and %s are not of the same version( RRyR"RtRSRjRmtnetmaskR(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyR%scCs]yD|j|jkoB|j|jkoBt|jt|jkSWntk rXtSXdS(N(RjRmRRRlR"(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyR!s   cCs tt|jt|jAS(N(RRRmR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs`|j|jkrtSt|tr)tSt|jt|jkoYt|jkSSdS(N(RjRRRtRRmRGRe(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyt __contains__s  cCs:|j|kp9|j|kp9|j|kp9|j|kS(u*Tell if self is partly contained in other.(RmRe(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pytoverlaps)scCsW|jjd}|dkrS|jt|jt|jB}||jd other eg: IPv4Network('192.0.2.128/25') > IPv4Network('192.0.2.0/25') IPv6Network('2001:db8::2000/124') > IPv6Network('2001:db8::1000/124') Raises: TypeError if the IP versions are different. u"%s and %s are not of the same typeiii(RjRSRmR(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pytcompare_networkss!cCs|j|j|jfS(uNetwork-only key function. Returns an object that identifies this address' network and netmask. This function is a suitable "key" argument for sorted() and list.sort(). (RjRmR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRusic cs0|j|jkr|VdS|dk rp||jkrEtdn|dkr`tdn||j}n|dkrtdn|j|}||jkrtd||fnt|j}t|j}t|jd|?}x4t|||D] }|j ||f}|VqWdS(uThe subnets which join to make the current subnet. In the case that self contains only one IP (self._prefixlen == 32 for IPv4 or self._prefixlen == 128 for IPv6), yield an iterator with just ourself. Args: prefixlen_diff: An integer, the amount the prefix length should be increased by. This should not be set if new_prefix is also set. new_prefix: The desired new prefix length. This must be a larger number (smaller prefix) than the existing prefix. This should not be set if prefixlen_diff is also set. Returns: An iterator of IPv(4|6) objects. Raises: ValueError: The prefixlen_diff is too small or too large. OR prefixlen_diff and new_prefix are both set or new_prefix is a smaller number than the current prefix (smaller number means a larger network) Nunew prefix must be longeriu(cannot set prefixlen_diff and new_prefixiuprefix length diff must be > 0u0prefix length diff %d is invalid for netblock %s( RkRURaR3RRmReRRR( Rtprefixlen_difft new_prefixt new_prefixlenRRRtnew_addrtcurrent((s-/usr/lib/python2.7/site-packages/ipaddress.pyRgs,    cCs|jdkr|S|dk rh||jkr=tdn|dkrXtdn|j|}n|j|}|dkrtd|j|fn|jt|jt|j|>@|fS(uThe supernet containing the current network. Args: prefixlen_diff: An integer, the amount the prefix length of the network should be decreased by. For example, given a /24 network and a prefixlen_diff of 3, a supernet with a /21 netmask is returned. Returns: An IPv4 network object. Raises: ValueError: If self.prefixlen - prefixlen_diff < 0. I.e., you have a negative prefix length. OR If prefixlen_diff and new_prefix are both set or new_prefix is a larger number than the current prefix (larger number means a smaller network) iunew prefix must be shorteriu(cannot set prefixlen_diff and new_prefixu;current prefixlen is %d, cannot have a prefixlen_diff of %dN(RkRaR3RRRRmR(RRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR_s     cCs|jjo|jjS(uTest if the address is reserved for multicast use. Returns: A boolean, True if the address is a multicast address. See RFC 2373 2.7 for details. (Rmt is_multicastRe(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRAs cCsp|j|jkrtSt|drVt|drV|j|jkoU|j|jkStdt|dS(Nunetwork_addressubroadcast_addressu9Unable to test subnet containment with element of type %s(RjRthasattrRmReRSR(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyRMscCsp|j|jkrtSt|drVt|drV|j|jkoU|j|jkStdt|dS(Nunetwork_addressubroadcast_addressu9Unable to test subnet containment with element of type %s(RjRRRmReRSR(RR ((s-/usr/lib/python2.7/site-packages/ipaddress.pyt supernet_of[scCs|jjo|jjS(uTest if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within one of the reserved IPv6 Network ranges. (Rmt is_reservedRe(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRis cCs|jjo|jjS(uTest if the address is reserved for link-local. Returns: A boolean, True if the address is reserved per RFC 4291. (Rmt is_link_localRe(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRus cCs|jjo|jjS(uTest if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per iana-ipv4-special-registry or iana-ipv6-special-registry. (Rmt is_privateRe(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs|j S(uTest if this address is allocated for public networks. Returns: A boolean, True if the address is not reserved per iana-ipv4-special-registry or iana-ipv6-special-registry. (R(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt is_globals cCs|jjo|jjS(uTest if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 2373 2.5.2. (Rmtis_unspecifiedRe(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs|jjo|jjS(uTest if the address is a loopback address. Returns: A boolean, True if the address is a loopback address as defined in RFC 2373 2.5.3. (Rmt is_loopbackRe(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs N(&R*R+R.RRRRRRR%R!RRRRReRRRRRRRRRRuRaRgR_RRRRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRtsD          K 0 5)       Rc BseZdZdZdZdedZedZeddddd d d d d g Z eZ iZ dZ e dZe dZe dZe dZdZdZedZedZRS(uyBase IPv4 object. The following methods are used by IPv4 objects in both single IP addresses and networks. iiiu 0123456789iiiiiiiiicCs t|S(N(R@(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRzscCs||jkrt|tr'|}n6y|j|}Wn tk r\|j|}nXt|j|}||f|j| 255) not permitted(R3RRRBR(Rt octet_strRt octet_int((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs#djdt|ddDS(uTurns a 32-bit integer into dotted decimal notation. Args: ip_int: An integer, the IP address. Returns: The IP address as a string in dotted decimal notation. u.css@|]6}tt|tr1tjd|dn|VqdS(s!BiN(R@RR2RR(t.0R((s-/usr/lib/python2.7/site-packages/ipaddress.pys -siubig(tjoinR(RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR"s cCs|jd}y5gtt|D]}||jkr"|^q"}Wntk rXtSXt|t|krutS|d|dkrtStS(uTest if the IP string is a hostmask (rather than a netmask). Args: ip_str: A string, the potential hostmask. Returns: A boolean, True if the IP string is a hostmask. u.ii(RARRt_valid_mask_octetsR3RRBtTrue(RRRPRtparts((s-/usr/lib/python2.7/site-packages/ipaddress.pyt _is_hostmask2s 5 cCs3t|jdddd}dj|dS(uReturn the reverse DNS pointer name for the IPv4 address. This implements the method described in RFC1035 3.5. u.Niu .in-addr.arpa(R@RAR(Rtreverse_octets((s-/usr/lib/python2.7/site-packages/ipaddress.pyR}Gs"cCs|jS(N(RU(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt max_prefixlenPscCs|jS(N(Rj(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRTTs((R*R+R.R,Rjt IPV4LENGTHRVt frozensetRRRURRzRRRRRRR}RRRT(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs" ' %  R0cBseZdZd ZdZedZedZedZedZ edZ ed Z ed Z RS( u/Represent and manipulate single IPv4 Addresses.u_ipu __weakref__cCst|tr)|j|||_dSt|trj|j|dt|}t|d|_dSt|}d|krt d|n|j ||_dS(u Args: address: A string or integer representing the IP Additionally, an integer can be passed, so IPv4Address('192.0.2.1') == IPv4Address(3221225985). or, more generally IPv4Address(int(IPv4Address('192.0.2.1'))) == IPv4Address('192.0.2.1') Raises: AddressValueError: If ipaddress isn't a valid IPv4 address. Niubigu/uUnexpected '/' in %r( RR RRGR2RRRR@R-R(RR4tbvstaddr_str((s-/usr/lib/python2.7/site-packages/ipaddress.pyR_s     cCs t|jS(u*The binary representation of this address.(R>RG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytpackedscCs||jjkS(uTest if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within the reserved IPv4 Network range. (t _constantst_reserved_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cs tfdjjDS(uTest if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per iana-ipv4-special-registry. c3s|]}|kVqdS(N((RR[(R(s-/usr/lib/python2.7/site-packages/ipaddress.pys s(tanyRt_private_networks(R((Rs-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is reserved for multicast use. Returns: A boolean, True if the address is multicast. See RFC 3171 for details. (Rt_multicast_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 5735 3. (Rt_unspecified_address(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is a loopback address. Returns: A boolean, True if the address is a loopback per RFC 3330. (Rt_loopback_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs||jjkS(uTest if the address is reserved for link-local. Returns: A boolean, True if the address is link-local per RFC 3927. (Rt_linklocal_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(u_ipu __weakref__( R*R+R.R,RRRRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR0Ys $     R:cBszeZdZdZdZdZdZejZe dZ e dZ e dZ e dZ RS( cCs;t|ttfrGtj||t|j|_|j|_ dSt|t rtj||dt |dkrt |d|_ n |j|_ t|dt |_|jj|_|jj|_dSt|}tj||dt|dt |_|jj |_ |jj|_|jj|_dS(NiiR8(RR2R R0RR6RGRRURkttupleRBRRRRRD(RR4RC((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(   cCs d|j|j|jjfS(Nu%s/%d(RRGRR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsVtj||}| s%|tkr)|Sy|j|jkSWntk rQtSXdS(N(R0R!R"RRlR(RR t address_equal((s-/usr/lib/python2.7/site-packages/ipaddress.pyR!s cCsOtj||}|tkr"tSy|j|jkSWntk rJtSXdS(N(R0R%R"RRlR(RR t address_less((s-/usr/lib/python2.7/site-packages/ipaddress.pyR%s  cCs|j|jAt|jjAS(N(RGRkRRRm(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs t|jS(N(R0RG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRLscCsd|j|j|jfS(Nu%s/%s(RRGRk(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR scCsd|j|j|jfS(Nu%s/%s(RRGR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|j|jfS(Nu%s/%s(RRGR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(R*R+RRR!R%RRyRRRLRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR:s    R6cBs/eZdZeZedZedZRS(ueThis class represents and manipulates 32-bit IPv4 network + addresses.. Attributes: [examples for IPv4Network('192.0.2.0/27')] .network_address: IPv4Address('192.0.2.0') .hostmask: IPv4Address('0.0.0.31') .broadcast_address: IPv4Address('192.0.2.32') .netmask: IPv4Address('255.255.255.224') .prefixlen: 27 cCstj||t|ttfrVt||_|j|j\|_ |_ dSt|t rt |dkr|d}n |j}t|d|_|j|\|_ |_ t |j}|t |j @|kr|rtd|qt|t |j @|_ndSt|}t|j|d|_t |dkrf|d}n |j}|j|\|_ |_ |rtt |jt |j @|jkrtd|qntt |jt |j @|_|j |jdkr|j|_ndS(uInstantiate a new IPv4 network object. Args: address: A string or integer representing the IP [& network]. '192.0.2.0/24' '192.0.2.0/255.255.255.0' '192.0.0.2/0.0.0.255' are all functionally the same in IPv4. Similarly, '192.0.2.1' '192.0.2.1/255.255.255.255' '192.0.2.1/32' are also functionally equivalent. That is to say, failing to provide a subnetmask will create an object with a mask of /32. If the mask (portion after the / in the argument) is given in dotted quad form, it is treated as a netmask if it starts with a non-zero field (e.g. /255.0.0.0 == /8) and as a hostmask if it starts with a zero field (e.g. 0.255.255.255 == /8), with the single exception of an all-zero mask which is treated as a netmask == /0. If no mask is given, a default of /32 is used. Additionally, an integer can be passed, so IPv4Network('192.0.2.1') == IPv4Network(3221225985) or, more generally IPv4Interface(int(IPv4Interface('192.0.2.1'))) == IPv4Interface('192.0.2.1') Raises: AddressValueError: If ipaddress isn't a valid IPv4 address. NetmaskValueError: If the netmask isn't valid for an IPv4 address. ValueError: If strict is True and a network address is not supplied. Niiu%s has host bits seti(RtRRR R2R0RmRRURRkRRBRR3RDRRR(RR4R8RRRC((s-/usr/lib/python2.7/site-packages/ipaddress.pyR*sB%      cCs3|jtdko'|jtdk o2|j S(uTest if this address is allocated for public networks. Returns: A boolean, True if the address is not reserved per iana-ipv4-special-registry. u 100.64.0.0/10(RmR6ReR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs ( R*R+R.R0RRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR6s  Ut_IPv4ConstantscBseZedZedZedZededededededededed ed ed ed ed edgZed ZedZ RS(u169.254.0.0/16u 127.0.0.0/8u 224.0.0.0/4u 0.0.0.0/8u 10.0.0.0/8u 172.16.0.0/12u 192.0.0.0/29u192.0.0.170/31u 192.0.2.0/24u192.168.0.0/16u 198.18.0.0/15u198.51.100.0/24u203.0.113.0/24u 240.0.0.0/4u255.255.255.255/32u0.0.0.0( R*R+R6RRRRRR0R(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs&                 t_BaseV6cBseZdZdZdZdedZdZedZ eZ iZ e dZ e dZe dZe d Ze dd Zd Zd Zed ZedZRS(uyBase IPv6 object. The following methods are used by IPv6 objects in both single IP addresses and networks. iiiiu0123456789ABCDEFabcdefcCsl||jkrat|tr'|}n|j|}t|j|}||f|j|} || sC|dk rxd |}t|n| }qCqCW|dk r]|} t||d } |ds| d 8} | rd}t||qn|ds| d 8} | rd}t||qn|j| | } | d krd}t||jd |fqnt||jkrd}t||j|fn|dsd}t||n|dsd}t||nt|} d} d} yd} x5t | D]'} | d K} | |j || O} qW| d | K} x9t | dD]'} | d K} | |j || O} qRW| SWn)t k r}td||fnXdS(uTurn an IPv6 ip_str into an integer. Args: ip_str: A string, the IPv6 ip_str. Returns: An int, the IPv6 address Raises: AddressValueError: if ip_str isn't a valid IPv6 Address. uAddress cannot be emptyu:iu At least %d parts expected in %ru.iu%s in %ru%xiiiu!At most %d colons permitted in %ru At most one '::' permitted in %riu0Leading ':' only permitted as part of '::' in %ru1Trailing ':' only permitted as part of '::' in %ru/Expected at most %d other parts with '::' in %ru,Exactly %d parts expected without '::' in %rN( R-RARBR0R^RGRbt _HEXTET_COUNTRaRtranget _parse_hextetR3(RRRt _min_partsRtipv4_intRt _max_partst skip_indexRtparts_hitparts_lot parts_skippedR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs            #     cCs]|jj|s%td|nt|dkrPd}t||nt|dS(u&Convert an IPv6 hextet string into an integer. Args: hextet_str: A string, the number to parse. Returns: The hextet as an integer. Raises: ValueError: if the input isn't strictly a hex number from [0..FFFF]. uOnly hex digits permitted in %riu$At most 4 characters permitted in %ri(t _HEX_DIGITSRR3RBR(Rt hextet_strR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR=s c Csd}d}d}d}xot|D]a\}}|dkrz|d7}|dkr\|}n||kr|}|}qq%d}d}q%W|dkr||}|t|kr|dg7}ndg|||+|dkrdg|}qn|S(uCompresses a list of hextets. Compresses a list of strings, replacing the longest continuous sequence of "0" in the list with "" and adding empty strings at the beginning or at the end of the string such that subsequently calling ":".join(hextets) will produce the compressed version of the IPv6 address. Args: hextets: A list of strings, the hextets to compress. Returns: A list of strings. iiu0iu(t enumerateRB( Rthextetstbest_doublecolon_starttbest_doublecolon_lentdoublecolon_starttdoublecolon_lentindexthextettbest_doublecolon_end((s-/usr/lib/python2.7/site-packages/ipaddress.pyt_compress_hextetsWs.         cCs|d krt|j}n||jkr<tdnd|}gtdddD]$}dt|||d!d^qY}|j|}dj|S( u,Turns a 128-bit integer into hexadecimal notation. Args: ip_int: An integer, the IP address. Returns: A string, the hexadecimal representation of the address. Raises: ValueError: The address is bigger than 128 bits of all ones. uIPv6 address is too largeu%032xii iu%xiu:N(RaRRGRVR3RRR(RRthex_strRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs  =cCst|tr!t|j}n-t|trBt|j}n t|}|j|}d|}gtdddD]}|||d!^qz}t|ttfrddj ||j fSdj |S(uExpand a shortened IPv6 address. Args: ip_str: A string, the IPv6 address. Returns: A string, the expanded IPv6 address. u%032xii iu%s/%du:( RR7R@RmR;RLRRRtRRk(RRRRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRzs   0cCs3|jdddjdd}dj|dS(uReturn the reverse DNS pointer name for the IPv6 address. This implements the method described in RFC3596 2.5. Niu:uu.u .ip6.arpa(R{treplaceR(Rt reverse_chars((s-/usr/lib/python2.7/site-packages/ipaddress.pyR}s"cCs|jS(N(RU(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs|jS(N(Rj(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRTs(N(R*R+R.R,Rjt IPV6LENGTHRVRRRRURRRRRRRaRRzR}RRRT(((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs$ i0  R1cBseZdZdZdZedZedZedZedZ edZ ed Z ed Z ed Z ed Zed ZedZedZRS(u/Represent and manipulate single IPv6 Addresses.u_ipu __weakref__cCst|tr)|j|||_dSt|trj|j|dt|}t|d|_dSt|}d|krt d|n|j ||_dS(uInstantiate a new IPv6 address object. Args: address: A string or integer representing the IP Additionally, an integer can be passed, so IPv6Address('2001:db8::') == IPv6Address(42540766411282592856903984951653826560) or, more generally IPv6Address(int(IPv6Address('2001:db8::'))) == IPv6Address('2001:db8::') Raises: AddressValueError: If address isn't a valid IPv6 address. Niubigu/uUnexpected '/' in %r( RR RRGR2RRRR@R-R(RR4RR((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs     cCs t|jS(u*The binary representation of this address.(R?RG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs||jjkS(uTest if the address is reserved for multicast use. Returns: A boolean, True if the address is a multicast address. See RFC 2373 2.7 for details. (RR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs cs tfdjjDS(uTest if the address is otherwise IETF reserved. Returns: A boolean, True if the address is within one of the reserved IPv6 Network ranges. c3s|]}|kVqdS(N((RR(R(s-/usr/lib/python2.7/site-packages/ipaddress.pys s(RRt_reserved_networks(R((Rs-/usr/lib/python2.7/site-packages/ipaddress.pyRs cCs||jjkS(uTest if the address is reserved for link-local. Returns: A boolean, True if the address is reserved per RFC 4291. (RR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs||jjkS(u`Test if the address is reserved for site-local. Note that the site-local address space has been deprecated by RFC 3879. Use is_private to test if this address is in the space of unique local addresses as defined by RFC 4193. Returns: A boolean, True if the address is reserved per RFC 3513 2.5.6. (Rt_sitelocal_network(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt is_site_locals cs tfdjjDS(uTest if this address is allocated for private networks. Returns: A boolean, True if the address is reserved per iana-ipv6-special-registry. c3s|]}|kVqdS(N((RR[(R(s-/usr/lib/python2.7/site-packages/ipaddress.pys 2s(RRR(R((Rs-/usr/lib/python2.7/site-packages/ipaddress.pyR)s cCs|j S(uTest if this address is allocated for public networks. Returns: A boolean, true if the address is not reserved per iana-ipv6-special-registry. (R(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR4s cCs |jdkS(uTest if the address is unspecified. Returns: A boolean, True if this is the unspecified address as defined in RFC 2373 2.5.2. i(RG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR?s cCs |jdkS(uTest if the address is a loopback address. Returns: A boolean, True if the address is a loopback address as defined in RFC 2373 2.5.3. i(RG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRJs cCs(|jd?dkrdSt|jd@S(uReturn the IPv4 mapped address. Returns: If the IPv6 address is a v4 mapped address, return the IPv4 mapped address. Return None otherwise. i iIN(RGRaR0(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt ipv4_mappedUs cCs@|jd?dkrdSt|jd?d@t|jd@fS(uTuple of embedded teredo IPs. Returns: Tuple of the (server, client) IPs or None if the address doesn't appear to be a teredo address (doesn't start with 2001::/32) i`i i@IN(RGRaR0(R((s-/usr/lib/python2.7/site-packages/ipaddress.pytteredobs cCs,|jd?dkrdSt|jd?d@S(uReturn the IPv4 6to4 embedded address. Returns: The IPv4 6to4-embedded address if present or None if the address doesn't appear to contain a 6to4 embedded address. ipi iPIN(RGRaR0(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyt sixtofourqs (u_ipu __weakref__(R*R+R.R,RRRRRRR RRRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR1s %        R;cBseZdZdZdZdZdZejZe dZ e dZ e dZ e dZ e d Ze d ZRS( cCs;t|ttfrGtj||t|j|_|j|_ dSt|t rtj||dt |dkrt |d|_ n |j|_ t|dt |_|jj|_|jj|_dSt|}tj||dt|dt |_|jj|_|jj |_ |jj|_dS(NiiR8(RR2R R1RR7RGRRURkRRBRRRRRD(RR4RC((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(   cCs d|j|j|jjfS(Nu%s/%d(RRGRR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsVtj||}| s%|tkr)|Sy|j|jkSWntk rQtSXdS(N(R1R!R"RRlR(RR R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR!s cCsOtj||}|tkr"tSy|j|jkSWntk rJtSXdS(N(R1R%R"RRlR(RR R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR%s  cCs|j|jAt|jjAS(N(RGRkRRRm(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs t|jS(N(R1RG(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRLscCsd|j|j|jfS(Nu%s/%s(RRGRk(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|j|jfS(Nu%s/%s(RRGR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCsd|j|j|jfS(Nu%s/%s(RRGR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs|jdko|jjS(Ni(RGRR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRscCs|jdko|jjS(Ni(RGRR(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyRs(R*R+RRR!R%RRyRRRLRRRRR(((s-/usr/lib/python2.7/site-packages/ipaddress.pyR;s    R7cBs8eZdZeZedZdZedZ RS(uvThis class represents and manipulates 128-bit IPv6 networks. Attributes: [examples for IPv6('2001:db8::1000/124')] .network_address: IPv6Address('2001:db8::1000') .hostmask: IPv6Address('::f') .broadcast_address: IPv6Address('2001:db8::100f') .netmask: IPv6Address('ffff:ffff:ffff:ffff:ffff:ffff:ffff:fff0') .prefixlen: 124 cCstj||t|ttfrVt||_|j|j\|_ |_ dSt|t rt |dkr|d}n |j}|j|\|_ |_ t|d|_t |j}|t |j @|kr|rtd|qt|t |j @|_ndSt|}t|j|d|_t |dkrf|d}n |j}|j|\|_ |_ |rtt |jt |j @|jkrtd|qntt |jt |j @|_|j |jdkr|j|_ndS(uInstantiate a new IPv6 Network object. Args: address: A string or integer representing the IPv6 network or the IP and prefix/netmask. '2001:db8::/128' '2001:db8:0000:0000:0000:0000:0000:0000/128' '2001:db8::' are all functionally the same in IPv6. That is to say, failing to provide a subnetmask will create an object with a mask of /128. Additionally, an integer can be passed, so IPv6Network('2001:db8::') == IPv6Network(42540766411282592856903984951653826560) or, more generally IPv6Network(int(IPv6Network('2001:db8::'))) == IPv6Network('2001:db8::') strict: A boolean. If true, ensure that we have been passed A true network address, eg, 2001:db8::1000/124 and not an IP address on a network, eg, 2001:db8::1/124. Raises: AddressValueError: If address isn't a valid IPv6 address. NetmaskValueError: If the netmask isn't valid for an IPv6 address. ValueError: If strict was True and a network address was not supplied. Niiu%s has host bits seti(RtRRR2R R1RmRRURRkRRBRR3RDRRR(RR4R8RRRC((s-/usr/lib/python2.7/site-packages/ipaddress.pyRsB       ccsRt|j}t|j}x-t|d|dD]}|j|Vq6WdS(uGenerate Iterator over usable hosts in a network. This is like __iter__ except it doesn't return the Subnet-Router anycast address. iN(RRmReRR(RRRR((s-/usr/lib/python2.7/site-packages/ipaddress.pyR4 scCs|jjo|jjS(u`Test if the address is reserved for site-local. Note that the site-local address space has been deprecated by RFC 3879. Use is_private to test if this address is in the space of unique local addresses as defined by RFC 4193. Returns: A boolean, True if the address is reserved per RFC 3513 2.5.6. (RmR Re(R((s-/usr/lib/python2.7/site-packages/ipaddress.pyR @ s ( R*R+R.R1RRRRRR (((s-/usr/lib/python2.7/site-packages/ipaddress.pyR7s   O t_IPv6ConstantscBseZedZedZedededededededed ed edg Zed ed ed ededededededededededededgZedZRS(u fe80::/10uff00::/8u::1/128u::/128u ::ffff:0:0/96u100::/64u 2001::/23u 2001:2::/48u 2001:db8::/32u 2001:10::/28ufc00::/7u::/8u100::/8u200::/7u400::/6u800::/5u1000::/4u4000::/3u6000::/3u8000::/3uA000::/3uC000::/3uE000::/4uF000::/5uF800::/6uFE00::/9u fec0::/10(R*R+R7RRRR R (((s-/usr/lib/python2.7/site-packages/ipaddress.pyRP s*           (9R.t __future__RRRt __version__RR tlongt NameErrortunicodeR@tstrR2RRt from_bytesRRlRRRRtobjectRRR R3R-R/R5RR9R<R>R?RDRMRQR\RiRsRxRyRRRtRR0R:R6RRRR1R;R7R(((s-/usr/lib/python2.7/site-packages/ipaddress.pyt sx              ) $ $ #      7 1 6 =pRr V{!PK[=FFsite-packages/IPy.pynu[""" IPy - class and tools for handling of IPv4 and IPv6 addresses and networks. See README file for learn how to use IPy. Further Information might be available at: https://github.com/haypo/python-ipy """ __version__ = '0.75' import sys import types # Definition of the Ranges for IPv4 IPs # this should include www.iana.org/assignments/ipv4-address-space # and www.iana.org/assignments/multicast-addresses IPv4ranges = { '0': 'PUBLIC', # fall back '00000000': 'PRIVATE', # 0/8 '00001010': 'PRIVATE', # 10/8 '01111111': 'PRIVATE', # 127.0/8 '1': 'PUBLIC', # fall back '1010100111111110': 'PRIVATE', # 169.254/16 '101011000001': 'PRIVATE', # 172.16/12 '1100000010101000': 'PRIVATE', # 192.168/16 '111': 'RESERVED' # 224/3 } # Definition of the Ranges for IPv6 IPs # http://www.iana.org/assignments/ipv6-address-space/ # http://www.iana.org/assignments/ipv6-unicast-address-assignments/ # http://www.iana.org/assignments/ipv6-multicast-addresses/ IPv6ranges = { '00000000' : 'RESERVED', # ::/8 '0' * 96 : 'RESERVED', # ::/96 Formerly IPV4COMP [RFC4291] '0' * 128 : 'UNSPECIFIED', # ::/128 '0' * 127 + '1' : 'LOOPBACK', # ::1/128 '0' * 80 + '1' * 16 : 'IPV4MAP', # ::ffff:0:0/96 '00000000011001001111111110011011' + '0' * 64 : 'WKP46TRANS', # 0064:ff9b::/96 Well-Known-Prefix [RFC6052] '00000001' : 'UNASSIGNED', # 0100::/8 '0000001' : 'RESERVED', # 0200::/7 Formerly NSAP [RFC4048] '0000010' : 'RESERVED', # 0400::/7 Formerly IPX [RFC3513] '0000011' : 'RESERVED', # 0600::/7 '00001' : 'RESERVED', # 0800::/5 '0001' : 'RESERVED', # 1000::/4 '001' : 'GLOBAL-UNICAST', # 2000::/3 [RFC4291] '00100000000000010000000' : 'SPECIALPURPOSE', # 2001::/23 [RFC4773] '00100000000000010000000000000000' : 'TEREDO', # 2001::/32 [RFC4380] '00100000000000010000000000000010' + '0' * 16 : 'BMWG', # 2001:0002::/48 Benchmarking [RFC5180] '0010000000000001000000000001' : 'ORCHID', # 2001:0010::/28 (Temp until 2014-03-21) [RFC4843] '00100000000000010000001' : 'ALLOCATED APNIC', # 2001:0200::/23 '00100000000000010000010' : 'ALLOCATED ARIN', # 2001:0400::/23 '00100000000000010000011' : 'ALLOCATED RIPE NCC', # 2001:0600::/23 '00100000000000010000100' : 'ALLOCATED RIPE NCC', # 2001:0800::/23 '00100000000000010000101' : 'ALLOCATED RIPE NCC', # 2001:0a00::/23 '00100000000000010000110' : 'ALLOCATED APNIC', # 2001:0c00::/23 '00100000000000010000110110111000' : 'DOCUMENTATION', # 2001:0db8::/32 [RFC3849] '00100000000000010000111' : 'ALLOCATED APNIC', # 2001:0e00::/23 '00100000000000010001001' : 'ALLOCATED LACNIC', # 2001:1200::/23 '00100000000000010001010' : 'ALLOCATED RIPE NCC', # 2001:1400::/23 '00100000000000010001011' : 'ALLOCATED RIPE NCC', # 2001:1600::/23 '00100000000000010001100' : 'ALLOCATED ARIN', # 2001:1800::/23 '00100000000000010001101' : 'ALLOCATED RIPE NCC', # 2001:1a00::/23 '0010000000000001000111' : 'ALLOCATED RIPE NCC', # 2001:1c00::/22 '00100000000000010010' : 'ALLOCATED RIPE NCC', # 2001:2000::/20 '001000000000000100110' : 'ALLOCATED RIPE NCC', # 2001:3000::/21 '0010000000000001001110' : 'ALLOCATED RIPE NCC', # 2001:3800::/22 '0010000000000001001111' : 'RESERVED', # 2001:3c00::/22 Possible future allocation to RIPE NCC '00100000000000010100000' : 'ALLOCATED RIPE NCC', # 2001:4000::/23 '00100000000000010100001' : 'ALLOCATED AFRINIC', # 2001:4200::/23 '00100000000000010100010' : 'ALLOCATED APNIC', # 2001:4400::/23 '00100000000000010100011' : 'ALLOCATED RIPE NCC', # 2001:4600::/23 '00100000000000010100100' : 'ALLOCATED ARIN', # 2001:4800::/23 '00100000000000010100101' : 'ALLOCATED RIPE NCC', # 2001:4a00::/23 '00100000000000010100110' : 'ALLOCATED RIPE NCC', # 2001:4c00::/23 '00100000000000010101' : 'ALLOCATED RIPE NCC', # 2001:5000::/20 '0010000000000001100' : 'ALLOCATED APNIC', # 2001:8000::/19 '00100000000000011010' : 'ALLOCATED APNIC', # 2001:a000::/20 '00100000000000011011' : 'ALLOCATED APNIC', # 2001:b000::/20 '0010000000000010' : '6TO4', # 2002::/16 "6to4" [RFC3056] '001000000000001100' : 'ALLOCATED RIPE NCC', # 2003::/18 '001001000000' : 'ALLOCATED APNIC', # 2400::/12 '001001100000' : 'ALLOCATED ARIN', # 2600::/12 '00100110000100000000000' : 'ALLOCATED ARIN', # 2610::/23 '00100110001000000000000' : 'ALLOCATED ARIN', # 2620::/23 '001010000000' : 'ALLOCATED LACNIC', # 2800::/12 '001010100000' : 'ALLOCATED RIPE NCC', # 2a00::/12 '001011000000' : 'ALLOCATED AFRINIC', # 2c00::/12 '00101101' : 'RESERVED', # 2d00::/8 '0010111' : 'RESERVED', # 2e00::/7 '0011' : 'RESERVED', # 3000::/4 '010' : 'RESERVED', # 4000::/3 '011' : 'RESERVED', # 6000::/3 '100' : 'RESERVED', # 8000::/3 '101' : 'RESERVED', # a000::/3 '110' : 'RESERVED', # c000::/3 '1110' : 'RESERVED', # e000::/4 '11110' : 'RESERVED', # f000::/5 '111110' : 'RESERVED', # f800::/6 '1111110' : 'ULA', # fc00::/7 [RFC4193] '111111100' : 'RESERVED', # fe00::/9 '1111111010' : 'LINKLOCAL', # fe80::/10 '1111111011' : 'RESERVED', # fec0::/10 Formerly SITELOCAL [RFC4291] '11111111' : 'MULTICAST', # ff00::/8 '1111111100000001' : 'NODE-LOCAL MULTICAST', # ff01::/16 '1111111100000010' : 'LINK-LOCAL MULTICAST', # ff02::/16 '1111111100000100' : 'ADMIN-LOCAL MULTICAST', # ff04::/16 '1111111100000101' : 'SITE-LOCAL MULTICAST', # ff05::/16 '1111111100001000' : 'ORG-LOCAL MULTICAST', # ff08::/16 '1111111100001110' : 'GLOBAL MULTICAST', # ff0e::/16 '1111111100001111' : 'RESERVED MULTICAST', # ff0f::/16 '111111110011' : 'PREFIX-BASED MULTICAST', # ff30::/12 [RFC3306] '111111110111' : 'RP-EMBEDDED MULTICAST', # ff70::/12 [RFC3956] } class IPint: """Handling of IP addresses returning integers. Use class IP instead because some features are not implemented for IPint.""" def __init__(self, data, ipversion=0, make_net=0): """Create an instance of an IP object. Data can be a network specification or a single IP. IP addresses can be specified in all forms understood by parseAddress(). The size of a network can be specified as /prefixlen a.b.c.0/24 2001:658:22a:cafe::/64 -lastIP a.b.c.0-a.b.c.255 2001:658:22a:cafe::-2001:658:22a:cafe:ffff:ffff:ffff:ffff /decimal netmask a.b.c.d/255.255.255.0 not supported for IPv6 If no size specification is given a size of 1 address (/32 for IPv4 and /128 for IPv6) is assumed. If make_net is True, an IP address will be transformed into the network address by applying the specified netmask. >>> print(IP('127.0.0.0/8')) 127.0.0.0/8 >>> print(IP('127.0.0.0/255.0.0.0')) 127.0.0.0/8 >>> print(IP('127.0.0.0-127.255.255.255')) 127.0.0.0/8 >>> print(IP('127.0.0.1/255.0.0.0', make_net=True)) 127.0.0.0/8 See module documentation for more examples. """ # Print no Prefixlen for /32 and /128 self.NoPrefixForSingleIp = 1 # Do we want prefix printed by default? see _printPrefix() self.WantPrefixLen = None netbits = 0 prefixlen = -1 # handling of non string values in constructor if isinstance(data, (int, long)): self.ip = long(data) if ipversion == 0: if self.ip < 0x100000000: ipversion = 4 else: ipversion = 6 if ipversion == 4: if self.ip > 0xffffffff: raise ValueError("IPv4 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %x" % self.ip) prefixlen = 32 elif ipversion == 6: if self.ip > 0xffffffffffffffffffffffffffffffff: raise ValueError("IPv6 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %x" % self.ip) prefixlen = 128 else: raise ValueError("only IPv4 and IPv6 supported") self._ipversion = ipversion self._prefixlen = prefixlen # handle IP instance as an parameter elif isinstance(data, IPint): self._ipversion = data._ipversion self._prefixlen = data._prefixlen self.ip = data.ip elif isinstance(data, (str, unicode)): # TODO: refactor me! # splitting of a string into IP and prefixlen et. al. x = data.split('-') if len(x) == 2: # a.b.c.0-a.b.c.255 specification ? (ip, last) = x (self.ip, parsedVersion) = parseAddress(ip) if parsedVersion != 4: raise ValueError("first-last notation only allowed for IPv4") (last, lastversion) = parseAddress(last) if lastversion != 4: raise ValueError("last address should be IPv4, too") if last < self.ip: raise ValueError("last address should be larger than first") size = last - self.ip netbits = _count1Bits(size) # make sure the broadcast is the same as the last ip # otherwise it will return /16 for something like: # 192.168.0.0-192.168.191.255 if IP('%s/%s' % (ip, 32-netbits)).broadcast().int() != last: raise ValueError("the range %s is not on a network boundary." % data) elif len(x) == 1: x = data.split('/') # if no prefix is given use defaults if len(x) == 1: ip = x[0] prefixlen = -1 elif len(x) > 2: raise ValueError("only one '/' allowed in IP Address") else: (ip, prefixlen) = x if prefixlen.find('.') != -1: # check if the user might have used a netmask like # a.b.c.d/255.255.255.0 (netmask, vers) = parseAddress(prefixlen) if vers != 4: raise ValueError("netmask must be IPv4") prefixlen = _netmaskToPrefixlen(netmask) elif len(x) > 2: raise ValueError("only one '-' allowed in IP Address") else: raise ValueError("can't parse") (self.ip, parsedVersion) = parseAddress(ip) if ipversion == 0: ipversion = parsedVersion if prefixlen == -1: if ipversion == 4: prefixlen = 32 - netbits elif ipversion == 6: prefixlen = 128 - netbits else: raise ValueError("only IPv4 and IPv6 supported") self._ipversion = ipversion self._prefixlen = int(prefixlen) if make_net: self.ip = self.ip & _prefixlenToNetmask(self._prefixlen, self._ipversion) if not _checkNetaddrWorksWithPrefixlen(self.ip, self._prefixlen, self._ipversion): raise ValueError("%s has invalid prefix length (%s)" % (repr(self), self._prefixlen)) else: raise TypeError("Unsupported data type: %s" % type(data)) def int(self): """Return the first / base / network addess as an (long) integer. The same as IP[0]. >>> "%X" % IP('10.0.0.0/8').int() 'A000000' """ return self.ip def version(self): """Return the IP version of this Object. >>> IP('10.0.0.0/8').version() 4 >>> IP('::1').version() 6 """ return self._ipversion def prefixlen(self): """Returns Network Prefixlen. >>> IP('10.0.0.0/8').prefixlen() 8 """ return self._prefixlen def net(self): """ Return the base (first) address of a network as an (long) integer. """ return self.int() def broadcast(self): """ Return the broadcast (last) address of a network as an (long) integer. The same as IP[-1].""" return self.int() + self.len() - 1 def _printPrefix(self, want): """Prints Prefixlen/Netmask. Not really. In fact it is our universal Netmask/Prefixlen printer. This is considered an internal function. want == 0 / None don't return anything 1.2.3.0 want == 1 /prefix 1.2.3.0/24 want == 2 /netmask 1.2.3.0/255.255.255.0 want == 3 -lastip 1.2.3.0-1.2.3.255 """ if (self._ipversion == 4 and self._prefixlen == 32) or \ (self._ipversion == 6 and self._prefixlen == 128): if self.NoPrefixForSingleIp: want = 0 if want == None: want = self.WantPrefixLen if want == None: want = 1 if want: if want == 2: # this should work with IP and IPint netmask = self.netmask() if not isinstance(netmask, (int, long)): netmask = netmask.int() return "/%s" % (intToIp(netmask, self._ipversion)) elif want == 3: return "-%s" % (intToIp(self.ip + self.len() - 1, self._ipversion)) else: # default return "/%d" % (self._prefixlen) else: return '' # We have different flavours to convert to: # strFullsize 127.0.0.1 2001:0658:022a:cafe:0200:c0ff:fe8d:08fa # strNormal 127.0.0.1 2001:658:22a:cafe:200:c0ff:fe8d:08fa # strCompressed 127.0.0.1 2001:658:22a:cafe::1 # strHex 0x7F000001 0x20010658022ACAFE0200C0FFFE8D08FA # strDec 2130706433 42540616829182469433547974687817795834 def strBin(self, wantprefixlen = None): """Return a string representation as a binary value. >>> print(IP('127.0.0.1').strBin()) 01111111000000000000000000000001 """ if self._ipversion == 4: bits = 32 elif self._ipversion == 6: bits = 128 else: raise ValueError("only IPv4 and IPv6 supported") if self.WantPrefixLen == None and wantprefixlen == None: wantprefixlen = 0 ret = _intToBin(self.ip) return '0' * (bits - len(ret)) + ret + self._printPrefix(wantprefixlen) def strCompressed(self, wantprefixlen = None): """Return a string representation in compressed format using '::' Notation. >>> IP('127.0.0.1').strCompressed() '127.0.0.1' >>> IP('2001:0658:022a:cafe:0200::1').strCompressed() '2001:658:22a:cafe:200::1' >>> IP('ffff:ffff:ffff:ffff:ffff:f:f:fffc/127').strCompressed() 'ffff:ffff:ffff:ffff:ffff:f:f:fffc/127' """ if self.WantPrefixLen == None and wantprefixlen == None: wantprefixlen = 1 if self._ipversion == 4: return self.strFullsize(wantprefixlen) else: if self.ip >> 32 == 0xffff: ipv4 = intToIp(self.ip & 0xffffffff, 4) text = "::ffff:" + ipv4 + self._printPrefix(wantprefixlen) return text # find the longest sequence of '0' hextets = [int(x, 16) for x in self.strFullsize(0).split(':')] # every element of followingzeros will contain the number of zeros # following the corresponding element of hextets followingzeros = [0] * 8 for i in xrange(len(hextets)): followingzeros[i] = _countFollowingZeros(hextets[i:]) # compressionpos is the position where we can start removing zeros compressionpos = followingzeros.index(max(followingzeros)) if max(followingzeros) > 1: # genererate string with the longest number of zeros cut out # now we need hextets as strings hextets = [x for x in self.strNormal(0).split(':')] while compressionpos < len(hextets) and hextets[compressionpos] == '0': del(hextets[compressionpos]) hextets.insert(compressionpos, '') if compressionpos + 1 >= len(hextets): hextets.append('') if compressionpos == 0: hextets = [''] + hextets return ':'.join(hextets) + self._printPrefix(wantprefixlen) else: return self.strNormal(0) + self._printPrefix(wantprefixlen) def strNormal(self, wantprefixlen = None): """Return a string representation in the usual format. >>> print(IP('127.0.0.1').strNormal()) 127.0.0.1 >>> print(IP('2001:0658:022a:cafe:0200::1').strNormal()) 2001:658:22a:cafe:200:0:0:1 """ if self.WantPrefixLen == None and wantprefixlen == None: wantprefixlen = 1 if self._ipversion == 4: ret = self.strFullsize(0) elif self._ipversion == 6: ret = ':'.join([hex(x)[2:] for x in [int(x, 16) for x in self.strFullsize(0).split(':')]]) else: raise ValueError("only IPv4 and IPv6 supported") return ret + self._printPrefix(wantprefixlen) def strFullsize(self, wantprefixlen = None): """Return a string representation in the non-mangled format. >>> print(IP('127.0.0.1').strFullsize()) 127.0.0.1 >>> print(IP('2001:0658:022a:cafe:0200::1').strFullsize()) 2001:0658:022a:cafe:0200:0000:0000:0001 """ if self.WantPrefixLen == None and wantprefixlen == None: wantprefixlen = 1 return intToIp(self.ip, self._ipversion).lower() + self._printPrefix(wantprefixlen) def strHex(self, wantprefixlen = None): """Return a string representation in hex format in lower case. >>> IP('127.0.0.1').strHex() '0x7f000001' >>> IP('2001:0658:022a:cafe:0200::1').strHex() '0x20010658022acafe0200000000000001' """ if self.WantPrefixLen == None and wantprefixlen == None: wantprefixlen = 0 x = hex(self.ip) if x[-1] == 'L': x = x[:-1] return x.lower() + self._printPrefix(wantprefixlen) def strDec(self, wantprefixlen = None): """Return a string representation in decimal format. >>> print(IP('127.0.0.1').strDec()) 2130706433 >>> print(IP('2001:0658:022a:cafe:0200::1').strDec()) 42540616829182469433547762482097946625 """ if self.WantPrefixLen == None and wantprefixlen == None: wantprefixlen = 0 x = str(self.ip) if x[-1] == 'L': x = x[:-1] return x + self._printPrefix(wantprefixlen) def iptype(self): """Return a description of the IP type ('PRIVATE', 'RESERVERD', etc). >>> print(IP('127.0.0.1').iptype()) PRIVATE >>> print(IP('192.168.1.1').iptype()) PRIVATE >>> print(IP('195.185.1.2').iptype()) PUBLIC >>> print(IP('::1').iptype()) LOOPBACK >>> print(IP('2001:0658:022a:cafe:0200::1').iptype()) ALLOCATED RIPE NCC The type information for IPv6 is out of sync with reality. """ # this could be greatly improved if self._ipversion == 4: iprange = IPv4ranges elif self._ipversion == 6: iprange = IPv6ranges else: raise ValueError("only IPv4 and IPv6 supported") bits = self.strBin() for i in xrange(len(bits), 0, -1): if bits[:i] in iprange: return iprange[bits[:i]] return "unknown" def netmask(self): """Return netmask as an integer. >>> "%X" % IP('195.185.0.0/16').netmask().int() 'FFFF0000' """ # TODO: unify with prefixlenToNetmask? if self._ipversion == 4: locallen = 32 - self._prefixlen elif self._ipversion == 6: locallen = 128 - self._prefixlen else: raise ValueError("only IPv4 and IPv6 supported") return ((2 ** self._prefixlen) - 1) << locallen def strNetmask(self): """Return netmask as an string. Mostly useful for IPv6. >>> print(IP('195.185.0.0/16').strNetmask()) 255.255.0.0 >>> print(IP('2001:0658:022a:cafe::0/64').strNetmask()) /64 """ # TODO: unify with prefixlenToNetmask? if self._ipversion == 4: locallen = 32 - self._prefixlen return intToIp(((2 ** self._prefixlen) - 1) << locallen, 4) elif self._ipversion == 6: locallen = 128 - self._prefixlen return "/%d" % self._prefixlen else: raise ValueError("only IPv4 and IPv6 supported") def len(self): """Return the length of a subnet. >>> print(IP('195.185.1.0/28').len()) 16 >>> print(IP('195.185.1.0/24').len()) 256 """ if self._ipversion == 4: locallen = 32 - self._prefixlen elif self._ipversion == 6: locallen = 128 - self._prefixlen else: raise ValueError("only IPv4 and IPv6 supported") return 2 ** locallen def __nonzero__(self): """All IPy objects should evaluate to true in boolean context. Ordinarily they do, but if handling a default route expressed as 0.0.0.0/0, the __len__() of the object becomes 0, which is used as the boolean value of the object. """ return True def __len__(self): """Return the length of a subnet. Called to implement the built-in function len(). It breaks with IPv6 Networks. Anybody knows how to fix this.""" # Python < 2.2 has this silly restriction which breaks IPv6 # how about Python >= 2.2 ... ouch - it persists! return int(self.len()) def __getitem__(self, key): """Called to implement evaluation of self[key]. >>> ip=IP('127.0.0.0/30') >>> for x in ip: ... print(repr(x)) ... IP('127.0.0.0') IP('127.0.0.1') IP('127.0.0.2') IP('127.0.0.3') >>> ip[2] IP('127.0.0.2') >>> ip[-1] IP('127.0.0.3') """ if not isinstance(key, (int, long)): raise TypeError if key < 0: if abs(key) <= self.len(): key = self.len() - abs(key) else: raise IndexError else: if key >= self.len(): raise IndexError return self.ip + long(key) def __contains__(self, item): """Called to implement membership test operators. Should return true if item is in self, false otherwise. Item can be other IP-objects, strings or ints. >>> IP('195.185.1.1').strHex() '0xc3b90101' >>> 0xC3B90101 in IP('195.185.1.0/24') True >>> '127.0.0.1' in IP('127.0.0.0/24') True >>> IP('127.0.0.0/24') in IP('127.0.0.0/25') False """ item = IP(item) if item.ip >= self.ip and item.ip < self.ip + self.len() - item.len() + 1: return True else: return False def overlaps(self, item): """Check if two IP address ranges overlap. Returns 0 if the two ranges don't overlap, 1 if the given range overlaps at the end and -1 if it does at the beginning. >>> IP('192.168.0.0/23').overlaps('192.168.1.0/24') 1 >>> IP('192.168.0.0/23').overlaps('192.168.1.255') 1 >>> IP('192.168.0.0/23').overlaps('192.168.2.0') 0 >>> IP('192.168.1.0/24').overlaps('192.168.0.0/23') -1 """ item = IP(item) if item.ip >= self.ip and item.ip < self.ip + self.len(): return 1 elif self.ip >= item.ip and self.ip < item.ip + item.len(): return -1 else: return 0 def __str__(self): """Dispatch to the prefered String Representation. Used to implement str(IP).""" return self.strCompressed() def __repr__(self): """Print a representation of the Object. Used to implement repr(IP). Returns a string which evaluates to an identical Object (without the wantprefixlen stuff - see module docstring. >>> print(repr(IP('10.0.0.0/24'))) IP('10.0.0.0/24') """ return("IPint('%s')" % (self.strCompressed(1))) def __cmp__(self, other): """Called by comparison operations. Should return a negative integer if self < other, zero if self == other, a positive integer if self > other. Networks with different prefixlen are considered non-equal. Networks with the same prefixlen and differing addresses are considered non equal but are compared by their base address integer value to aid sorting of IP objects. The version of Objects is not put into consideration. >>> IP('10.0.0.0/24') > IP('10.0.0.0') 1 >>> IP('10.0.0.0/24') < IP('10.0.0.0') 0 >>> IP('10.0.0.0/24') < IP('12.0.0.0/24') 1 >>> IP('10.0.0.0/24') > IP('12.0.0.0/24') 0 """ # Im not really sure if this is "the right thing to do" if self._prefixlen < other.prefixlen(): return (other.prefixlen() - self._prefixlen) elif self._prefixlen > other.prefixlen(): # Fixed bySamuel Krempp : # The bug is quite obvious really (as 99% bugs are once # spotted, isn't it ? ;-) Because of precedence of # multiplication by -1 over the substraction, prefixlen # differences were causing the __cmp__ function to always # return positive numbers, thus the function was failing # the basic assumptions for a __cmp__ function. # Namely we could have (a > b AND b > a), when the # prefixlen of a and b are different. (eg let # a=IP("1.0.0.0/24"); b=IP("2.0.0.0/16");) thus, anything # could happen when launching a sort algorithm.. # everything's in order with the trivial, attached patch. return other.prefixlen() - self._prefixlen else: if self.ip < other.ip: return -1 elif self.ip > other.ip: return 1 elif self._ipversion != other._ipversion: # IP('0.0.0.0'), IP('::/0') if self._ipversion < other._ipversion: return -1 elif self._ipversion > other._ipversion: return 1 else: return 0 else: return 0 def __eq__(self, other): return self.__cmp__(other) == 0 def __lt__(self, other): return self.__cmp__(other) < 0 def __hash__(self): """Called for the key object for dictionary operations, and by the built-in function hash(). Should return a 32-bit integer usable as a hash value for dictionary operations. The only required property is that objects which compare equal have the same hash value >>> IP('10.0.0.0/24').__hash__() -167772185 """ thehash = int(-1) ip = self.ip while ip > 0: thehash = thehash ^ (ip & 0x7fffffff) ip = ip >> 32 thehash = thehash ^ self._prefixlen return int(thehash) class IP(IPint): """Class for handling IP addresses and networks.""" def net(self): """Return the base (first) address of a network as an IP object. The same as IP[0]. >>> IP('10.0.0.0/8').net() IP('10.0.0.0') """ return IP(IPint.net(self), ipversion=self._ipversion) def broadcast(self): """Return the broadcast (last) address of a network as an IP object. The same as IP[-1]. >>> IP('10.0.0.0/8').broadcast() IP('10.255.255.255') """ return IP(IPint.broadcast(self)) def netmask(self): """Return netmask as an IP object. >>> IP('10.0.0.0/8').netmask() IP('255.0.0.0') """ return IP(IPint.netmask(self), ipversion=self._ipversion) def _getIPv4Map(self): if self._ipversion != 6: return None if (self.ip >> 32) != 0xffff: return None ipv4 = self.ip & 0xffffffff if self._prefixlen != 128: ipv4 = '%s/%s' % (ipv4, 32-(128-self._prefixlen)) return IP(ipv4, ipversion=4) def reverseNames(self): """Return a list with values forming the reverse lookup. >>> IP('213.221.113.87/32').reverseNames() ['87.113.221.213.in-addr.arpa.'] >>> IP('213.221.112.224/30').reverseNames() ['224.112.221.213.in-addr.arpa.', '225.112.221.213.in-addr.arpa.', '226.112.221.213.in-addr.arpa.', '227.112.221.213.in-addr.arpa.'] >>> IP('127.0.0.0/24').reverseNames() ['0.0.127.in-addr.arpa.'] >>> IP('127.0.0.0/23').reverseNames() ['0.0.127.in-addr.arpa.', '1.0.127.in-addr.arpa.'] >>> IP('127.0.0.0/16').reverseNames() ['0.127.in-addr.arpa.'] >>> IP('127.0.0.0/15').reverseNames() ['0.127.in-addr.arpa.', '1.127.in-addr.arpa.'] >>> IP('128.0.0.0/8').reverseNames() ['128.in-addr.arpa.'] >>> IP('128.0.0.0/7').reverseNames() ['128.in-addr.arpa.', '129.in-addr.arpa.'] >>> IP('::1:2').reverseNames() ['2.0.0.0.1.ip6.arpa.'] """ if self._ipversion == 4: ret = [] # TODO: Refactor. Add support for IPint objects if self.len() < 2**8: for x in self: ret.append(x.reverseName()) elif self.len() < 2**16: for i in xrange(0, self.len(), 2**8): ret.append(self[i].reverseName()[2:]) elif self.len() < 2**24: for i in xrange(0, self.len(), 2**16): ret.append(self[i].reverseName()[4:]) else: for i in xrange(0, self.len(), 2**24): ret.append(self[i].reverseName()[6:]) return ret elif self._ipversion == 6: ipv4 = self._getIPv4Map() if ipv4 is not None: return ipv4.reverseNames() s = hex(self.ip)[2:].lower() if s[-1] == 'l': s = s[:-1] if self._prefixlen % 4 != 0: raise NotImplementedError("can't create IPv6 reverse names at sub nibble level") s = list(s) s.reverse() s = '.'.join(s) first_nibble_index = int(32 - (self._prefixlen // 4)) * 2 return ["%s.ip6.arpa." % s[first_nibble_index:]] else: raise ValueError("only IPv4 and IPv6 supported") def reverseName(self): """Return the value for reverse lookup/PTR records as RFC 2317 look alike. RFC 2317 is an ugly hack which only works for sub-/24 e.g. not for /23. Do not use it. Better set up a zone for every address. See reverseName for a way to achieve that. >>> print(IP('195.185.1.1').reverseName()) 1.1.185.195.in-addr.arpa. >>> print(IP('195.185.1.0/28').reverseName()) 0-15.1.185.195.in-addr.arpa. >>> IP('::1:2').reverseName() '2.0.0.0.1.ip6.arpa.' """ if self._ipversion == 4: s = self.strFullsize(0) s = s.split('.') s.reverse() first_byte_index = int(4 - (self._prefixlen // 8)) if self._prefixlen % 8 != 0: nibblepart = "%s-%s" % (s[3-(self._prefixlen // 8)], intToIp(self.ip + self.len() - 1, 4).split('.')[-1]) if nibblepart[-1] == 'l': nibblepart = nibblepart[:-1] nibblepart += '.' else: nibblepart = "" s = '.'.join(s[first_byte_index:]) return "%s%s.in-addr.arpa." % (nibblepart, s) elif self._ipversion == 6: ipv4 = self._getIPv4Map() if ipv4 is not None: return ipv4.reverseName() s = hex(self.ip)[2:].lower() if s[-1] == 'l': s = s[:-1] if self._prefixlen % 4 != 0: nibblepart = "%s-%s" % (s[self._prefixlen:], hex(self.ip + self.len() - 1)[2:].lower()) if nibblepart[-1] == 'l': nibblepart = nibblepart[:-1] nibblepart += '.' else: nibblepart = "" s = list(s) s.reverse() s = '.'.join(s) first_nibble_index = int(32 - (self._prefixlen // 4)) * 2 return "%s%s.ip6.arpa." % (nibblepart, s[first_nibble_index:]) else: raise ValueError("only IPv4 and IPv6 supported") def make_net(self, netmask): """Transform a single IP address into a network specification by applying the given netmask. Returns a new IP instance. >>> print(IP('127.0.0.1').make_net('255.0.0.0')) 127.0.0.0/8 """ if '/' in str(netmask): raise ValueError("invalid netmask (%s)" % netmask) return IP('%s/%s' % (self, netmask), make_net=True) def __getitem__(self, key): """Called to implement evaluation of self[key]. >>> ip=IP('127.0.0.0/30') >>> for x in ip: ... print(str(x)) ... 127.0.0.0 127.0.0.1 127.0.0.2 127.0.0.3 >>> print(str(ip[2])) 127.0.0.2 >>> print(str(ip[-1])) 127.0.0.3 """ return IP(IPint.__getitem__(self, key)) def __repr__(self): """Print a representation of the Object. >>> IP('10.0.0.0/8') IP('10.0.0.0/8') """ return("IP('%s')" % (self.strCompressed(1))) def __add__(self, other): """Emulate numeric objects through network aggregation""" if self.prefixlen() != other.prefixlen(): raise ValueError("Only networks with the same prefixlen can be added.") if self.prefixlen() < 1: raise ValueError("Networks with a prefixlen longer than /1 can't be added.") if self.version() != other.version(): raise ValueError("Only networks with the same IP version can be added.") if self > other: # fixed by Skinny Puppy return other.__add__(self) else: ret = IP(self.int()) ret._prefixlen = self.prefixlen() - 1 return ret def _parseAddressIPv6(ipstr): """ Internal function used by parseAddress() to parse IPv6 address with ':'. >>> print(_parseAddressIPv6('::')) 0 >>> print(_parseAddressIPv6('::1')) 1 >>> print(_parseAddressIPv6('0:0:0:0:0:0:0:1')) 1 >>> print(_parseAddressIPv6('0:0:0::0:0:1')) 1 >>> print(_parseAddressIPv6('0:0:0:0:0:0:0:0')) 0 >>> print(_parseAddressIPv6('0:0:0::0:0:0')) 0 >>> print(_parseAddressIPv6('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210')) 338770000845734292534325025077361652240 >>> print(_parseAddressIPv6('1080:0000:0000:0000:0008:0800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080:0:0:0:8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080:0::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('FF01:0:0:0:0:0:0:43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('FF01:0:0::0:0:43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('FF01::43')) 338958331222012082418099330867817087043 >>> print(_parseAddressIPv6('0:0:0:0:0:0:13.1.68.3')) 218186755 >>> print(_parseAddressIPv6('::13.1.68.3')) 218186755 >>> print(_parseAddressIPv6('0:0:0:0:0:FFFF:129.144.52.38')) 281472855454758 >>> print(_parseAddressIPv6('::FFFF:129.144.52.38')) 281472855454758 >>> print(_parseAddressIPv6('1080:0:0:0:8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('1080::8:800:200C:417A')) 21932261930451111902915077091070067066 >>> print(_parseAddressIPv6('::1:2:3:4:5:6')) 1208962713947218704138246 >>> print(_parseAddressIPv6('1:2:3:4:5:6::')) 5192455318486707404433266432802816 """ # Split string into a list, example: # '1080:200C::417A' => ['1080', '200C', '417A'] and fill_pos=2 # and fill_pos is the position of '::' in the list items = [] index = 0 fill_pos = None while index < len(ipstr): text = ipstr[index:] if text.startswith("::"): if fill_pos is not None: # Invalid IPv6, eg. '1::2::' raise ValueError("%r: Invalid IPv6 address: more than one '::'" % ipstr) fill_pos = len(items) index += 2 continue pos = text.find(':') if pos == 0: # Invalid IPv6, eg. '1::2:' raise ValueError("%r: Invalid IPv6 address" % ipstr) if pos != -1: items.append(text[:pos]) if text[pos:pos+2] == "::": index += pos else: index += pos+1 if index == len(ipstr): # Invalid IPv6, eg. '1::2:' raise ValueError("%r: Invalid IPv6 address" % ipstr) else: items.append(text) break if items and '.' in items[-1]: # IPv6 ending with IPv4 like '::ffff:192.168.0.1' if (fill_pos is not None) and not (fill_pos <= len(items)-1): # Invalid IPv6: 'ffff:192.168.0.1::' raise ValueError("%r: Invalid IPv6 address: '::' after IPv4" % ipstr) value = parseAddress(items[-1])[0] items = items[:-1] + ["%04x" % (value >> 16), "%04x" % (value & 0xffff)] # Expand fill_pos to fill with '0' # ['1','2'] with fill_pos=1 => ['1', '0', '0', '0', '0', '0', '0', '2'] if fill_pos is not None: diff = 8 - len(items) if diff <= 0: raise ValueError("%r: Invalid IPv6 address: '::' is not needed" % ipstr) items = items[:fill_pos] + ['0']*diff + items[fill_pos:] # Here we have a list of 8 strings if len(items) != 8: # Invalid IPv6, eg. '1:2:3' raise ValueError("%r: Invalid IPv6 address: should have 8 hextets" % ipstr) # Convert strings to long integer value = 0 index = 0 for item in items: try: item = int(item, 16) error = not(0 <= item <= 0xFFFF) except ValueError: error = True if error: raise ValueError("%r: Invalid IPv6 address: invalid hexlet %r" % (ipstr, item)) value = (value << 16) + item index += 1 return value def parseAddress(ipstr): """ Parse a string and return the corresponding IP address (as integer) and a guess of the IP version. Following address formats are recognized: >>> def testParseAddress(address): ... ip, version = parseAddress(address) ... print(("%s (IPv%s)" % (ip, version))) ... >>> testParseAddress('0x0123456789abcdef') # IPv4 if <= 0xffffffff else IPv6 81985529216486895 (IPv6) >>> testParseAddress('123.123.123.123') # IPv4 2071690107 (IPv4) >>> testParseAddress('123.123') # 0-padded IPv4 2071658496 (IPv4) >>> testParseAddress('1080:0000:0000:0000:0008:0800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('1080:0:0:0:8:800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('1080:0::8:800:200C:417A') 21932261930451111902915077091070067066 (IPv6) >>> testParseAddress('::1') 1 (IPv6) >>> testParseAddress('::') 0 (IPv6) >>> testParseAddress('0:0:0:0:0:FFFF:129.144.52.38') 281472855454758 (IPv6) >>> testParseAddress('::13.1.68.3') 218186755 (IPv6) >>> testParseAddress('::FFFF:129.144.52.38') 281472855454758 (IPv6) """ if ipstr.startswith('0x'): ret = long(ipstr[2:], 16) if ret > 0xffffffffffffffffffffffffffffffff: raise ValueError("%r: IP Address can't be bigger than 2^128" % (ipstr)) if ret < 0x100000000: return (ret, 4) else: return (ret, 6) if ipstr.find(':') != -1: return (_parseAddressIPv6(ipstr), 6) elif len(ipstr) == 32: # assume IPv6 in pure hexadecimal notation return (long(ipstr, 16), 6) elif ipstr.find('.') != -1 or (len(ipstr) < 4 and int(ipstr) < 256): # assume IPv4 ('127' gets interpreted as '127.0.0.0') bytes = ipstr.split('.') if len(bytes) > 4: raise ValueError("IPv4 Address with more than 4 bytes") bytes += ['0'] * (4 - len(bytes)) bytes = [long(x) for x in bytes] for x in bytes: if x > 255 or x < 0: raise ValueError("%r: single byte must be 0 <= byte < 256" % (ipstr)) return ((bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3], 4) else: # we try to interprete it as a decimal digit - # this ony works for numbers > 255 ... others # will be interpreted as IPv4 first byte ret = long(ipstr, 10) if ret > 0xffffffffffffffffffffffffffffffff: raise ValueError("IP Address can't be bigger than 2^128") if ret <= 0xffffffff: return (ret, 4) else: return (ret, 6) def intToIp(ip, version): """Transform an integer string into an IP address.""" # just to be sure and hoping for Python 2.22 ip = long(ip) if ip < 0: raise ValueError("IPs can't be negative: %d" % (ip)) ret = '' if version == 4: if ip > 0xffffffff: raise ValueError("IPv4 Addresses can't be larger than 0xffffffff: %s" % (hex(ip))) for l in xrange(4): ret = str(ip & 0xff) + '.' + ret ip = ip >> 8 ret = ret[:-1] elif version == 6: if ip > 0xffffffffffffffffffffffffffffffff: raise ValueError("IPv6 Addresses can't be larger than 0xffffffffffffffffffffffffffffffff: %s" % (hex(ip))) if sys.hexversion >= 0x03000000: # Remove "0x" prefix l = hex(ip)[2:] else: # Remove "0x" prefix and "L" suffix l = hex(ip)[2:-1] l = l.zfill(32) for x in xrange(1, 33): ret = l[-x] + ret if x % 4 == 0: ret = ':' + ret ret = ret[1:] else: raise ValueError("only IPv4 and IPv6 supported") return ret def _ipVersionToLen(version): """Return number of bits in address for a certain IP version. >>> _ipVersionToLen(4) 32 >>> _ipVersionToLen(6) 128 >>> _ipVersionToLen(5) Traceback (most recent call last): File "", line 1, in ? File "IPy.py", line 1076, in _ipVersionToLen raise ValueError("only IPv4 and IPv6 supported") ValueError: only IPv4 and IPv6 supported """ if version == 4: return 32 elif version == 6: return 128 else: raise ValueError("only IPv4 and IPv6 supported") def _countFollowingZeros(l): """Return number of elements containing 0 at the beginning of the list.""" if len(l) == 0: return 0 elif l[0] != 0: return 0 else: return 1 + _countFollowingZeros(l[1:]) _BitTable = {'0': '0000', '1': '0001', '2': '0010', '3': '0011', '4': '0100', '5': '0101', '6': '0110', '7': '0111', '8': '1000', '9': '1001', 'a': '1010', 'b': '1011', 'c': '1100', 'd': '1101', 'e': '1110', 'f': '1111'} def _intToBin(val): """Return the binary representation of an integer as string.""" if val < 0: raise ValueError("Only positive values allowed") s = hex(val).lower() ret = '' if s[-1] == 'l': s = s[:-1] for x in s[2:]: ret += _BitTable[x] # remove leading zeros while ret[0] == '0' and len(ret) > 1: ret = ret[1:] return ret def _count1Bits(num): """Find the highest bit set to 1 in an integer.""" ret = 0 while num > 0: num = num >> 1 ret += 1 return ret def _count0Bits(num): """Find the highest bit set to 0 in an integer.""" # this could be so easy if _count1Bits(~long(num)) would work as excepted num = long(num) if num < 0: raise ValueError("Only positive Numbers please: %s" % (num)) ret = 0 while num > 0: if num & 1 == 1: break num = num >> 1 ret += 1 return ret def _checkPrefix(ip, prefixlen, version): """Check the validity of a prefix Checks if the variant part of a prefix only has 0s, and the length is correct. >>> _checkPrefix(0x7f000000, 24, 4) 1 >>> _checkPrefix(0x7f000001, 24, 4) 0 >>> repr(_checkPrefix(0x7f000001, -1, 4)) 'None' >>> repr(_checkPrefix(0x7f000001, 33, 4)) 'None' """ # TODO: unify this v4/v6/invalid code in a function bits = _ipVersionToLen(version) if prefixlen < 0 or prefixlen > bits: return None if ip == 0: zbits = bits + 1 else: zbits = _count0Bits(ip) if zbits < bits - prefixlen: return 0 else: return 1 def _checkNetmask(netmask, masklen): """Checks if a netmask is expressable as a prefixlen.""" num = long(netmask) bits = masklen # remove zero bits at the end while (num & 1) == 0 and bits != 0: num = num >> 1 bits -= 1 if bits == 0: break # now check if the rest consists only of ones while bits > 0: if (num & 1) == 0: raise ValueError("Netmask %s can't be expressed as an prefix." % (hex(netmask))) num = num >> 1 bits -= 1 def _checkNetaddrWorksWithPrefixlen(net, prefixlen, version): """Check if a base addess of a network is compatible with a prefixlen""" return (net & _prefixlenToNetmask(prefixlen, version) == net) def _netmaskToPrefixlen(netmask): """Convert an Integer representing a netmask to a prefixlen. E.g. 0xffffff00 (255.255.255.0) returns 24 """ netlen = _count0Bits(netmask) masklen = _count1Bits(netmask) _checkNetmask(netmask, masklen) return masklen - netlen def _prefixlenToNetmask(prefixlen, version): """Return a mask of n bits as a long integer. From 'IP address conversion functions with the builtin socket module' by Alex Martelli http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66517 """ if prefixlen == 0: return 0 elif prefixlen < 0: raise ValueError("Prefixlen must be > 0") return ((2<sPK[ #ee!site-packages/firewall/errors.pyonu[ c`c@s?dZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;d<Z<d=Z=d>Z>d?Z?d@Z@dAZAdBZBdCZCdDZDdEZEdFZFdGZGdHZHdIZIdJZJdKZKdLZLdMZMdNZNdOdPlOZOdQePfdRYZQeOjReQjSZTdSeUeTDeQ_VdTeQjVDeQ_WdPS(Ui i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&idieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiNt FirewallErrorcBs;eZddZdZdZdZeeZRS(cCsp||_|dk rctjdkrcyt|}Wq`tk r\t|jd}q`Xqcn||_dS(Nt3tunicode_escape( tcodetNonetsystversiontstrtUnicodeEncodeErrortunicodetencodetmsg(tselfRR tx((s3/usr/lib/python2.7/site-packages/firewall/errors.pyt__init__ls   cCsd|j|j|jfS(Ns %s(%r, %r)(t __class__RR (R ((s3/usr/lib/python2.7/site-packages/firewall/errors.pyt__repr__wscCs2|jr$d|j|j|jfS|j|jS(Ns%s: %s(R terrorsR(R ((s3/usr/lib/python2.7/site-packages/firewall/errors.pyt__str__zs cCs]d|kr(|jd}|| }n|}ytj|}Wntk rXt}nX|S(Nt:(tindexRtcodestKeyErrort UNKNOWN_ERROR(R tidxtecodeR((s3/usr/lib/python2.7/site-packages/firewall/errors.pytget_codes    N(t__name__t __module__RRRRRt staticmethod(((s3/usr/lib/python2.7/site-packages/firewall/errors.pyRks    cCsMi|]C}|jd rttt|tkr|tt|qS(t_(t startswithttypetgetattrtmodtint(t.0tvarname((s3/usr/lib/python2.7/site-packages/firewall/errors.pys s cCs i|]}|tj|qS((RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/errors.pys s (XtALREADY_ENABLEDt NOT_ENABLEDtCOMMAND_FAILEDt NO_IPV6_NATt PANIC_MODEtZONE_ALREADY_SETtUNKNOWN_INTERFACEt ZONE_CONFLICTt BUILTIN_CHAINtEBTABLES_NO_REJECTtNOT_OVERLOADABLEt NO_DEFAULTSt BUILTIN_ZONEtBUILTIN_SERVICEtBUILTIN_ICMPTYPEt NAME_CONFLICTt NAME_MISMATCHt PARSE_ERRORt ACCESS_DENIEDtUNKNOWN_SOURCEtRT_TO_PERM_FAILEDtIPSET_WITH_TIMEOUTt BUILTIN_IPSETt ALREADY_SETtMISSING_IMPORTt DBUS_ERRORtBUILTIN_HELPERt NOT_APPLIEDtINVALID_ACTIONtINVALID_SERVICEt INVALID_PORTtINVALID_PROTOCOLtINVALID_INTERFACEt INVALID_ADDRtINVALID_FORWARDtINVALID_ICMPTYPEt INVALID_TABLEt INVALID_CHAINtINVALID_TARGETt INVALID_IPVt INVALID_ZONEtINVALID_PROPERTYt INVALID_VALUEtINVALID_OBJECTt INVALID_NAMEtINVALID_FILENAMEtINVALID_DIRECTORYt INVALID_TYPEtINVALID_SETTINGtINVALID_DESTINATIONt INVALID_RULEt INVALID_LIMITtINVALID_FAMILYtINVALID_LOG_LEVELtINVALID_AUDIT_TYPEt INVALID_MARKtINVALID_CONTEXTtINVALID_COMMANDt INVALID_USERt INVALID_UIDtINVALID_MODULEtINVALID_PASSTHROUGHt INVALID_MACt INVALID_IPSETt INVALID_ENTRYtINVALID_OPTIONtINVALID_HELPERt MISSING_TABLEt MISSING_CHAINt MISSING_PORTtMISSING_PROTOCOLt MISSING_ADDRt MISSING_NAMEtMISSING_SETTINGtMISSING_FAMILYtRUNNING_BUT_FAILEDt NOT_RUNNINGtNOT_AUTHORIZEDRRt ExceptionRtmodulesRR"tdirRR(((s3/usr/lib/python2.7/site-packages/firewall/errors.pyts $PK[~x11*site-packages/firewall/config/__init__.pycnu[ c`c@@sddlmZddlZyejejdWn@ejk ruddlZdejdi(tabsolute_importNttCtLC_ALLt firewalldtdomaini(tdbussfirewall-configsfirewall-applets /usr/share/s.glades(C) 2010-2017 Red Hat, Inc.s0.6.3s$Thomas Woerner s"Jiri Popelka sEric Garver scThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see .shttp://www.firewalld.orgcC@sZ|a|da|da|da|da|da|da|da|dadS( Ns/firewalld.confs/zoness /servicess /icmptypess/ipsetss/helperss /direct.xmls/lockdown-whitelist.xml( t ETC_FIREWALLDtFIREWALLD_CONFtETC_FIREWALLD_ZONEStETC_FIREWALLD_SERVICEStETC_FIREWALLD_ICMPTYPEStETC_FIREWALLD_IPSETStETC_FIREWALLD_HELPERStFIREWALLD_DIRECTtLOCKDOWN_WHITELIST(tpath((s</usr/lib/python2.7/site-packages/firewall/config/__init__.pytset_system_config_pathsBs       s/etc/firewalldcC@s<|a|da|da|da|da|dadS(Ns/zoness /servicess /icmptypess/ipsetss/helpers(tUSR_LIB_FIREWALLDtFIREWALLD_ZONEStFIREWALLD_SERVICEStFIREWALLD_ICMPTYPEStFIREWALLD_IPSETStFIREWALLD_HELPERS(R((s</usr/lib/python2.7/site-packages/firewall/config/__init__.pytset_default_config_pathsRs     s/usr/lib/firewallds/var/log/firewallds/var/run/firewalld.pids/run/firewallds/etc/sysconfigs/etc/sysconfig/network-scriptss/etc/sysctl.confs/usr/sbin/iptablestipv4s/usr/sbin/iptables-restores ipv4-restores/usr/sbin/ip6tablestipv6s/usr/sbin/ip6tables-restores ipv6-restores/usr/sbin/ebtablestebs/usr/sbin/ebtables-restores eb-restores/usr/sbin/ipsettipsets/usr/sbin/modprobetmodprobes/usr/sbin/rmmodtrmmods@NFT@tnfttalltunicastt broadcastt multicasttofftyestnotsystemtpublicidtiptables(.t __future__Rtlocalet setlocaleRtErrortostenvirontDOMAINtgettexttinstallRRt DAEMON_NAMEt CONFIG_NAMEt APPLET_NAMEtDATADIRtCONFIG_GLADE_NAMEt COPYRIGHTtVERSIONtAUTHORStLICENSEtWEBSITERRtFIREWALLD_LOGFILEtFIREWALLD_PIDFILEtFIREWALLD_TEMPDIRt SYSCONFIGDIRtIFCFGDIRt SYSCTL_CONFIGtCOMMANDStLOG_DENIED_VALUEStAUTOMATIC_HELPERS_VALUESt FALLBACK_ZONEtFALLBACK_MINIMAL_MARKtTruetFALLBACK_CLEANUP_ON_EXITtFalsetFALLBACK_LOCKDOWNtFALLBACK_IPV6_RPFILTERtFALLBACK_INDIVIDUAL_CALLStFALLBACK_LOG_DENIEDtFALLBACK_AUTOMATIC_HELPERStFALLBACK_FIREWALL_BACKENDtFALLBACK_ALLOW_ZONE_DRIFTING(((s</usr/lib/python2.7/site-packages/firewall/config/__init__.pytsr            PK[@PP&site-packages/firewall/config/dbus.pyonu[ c`c@s2dZdZdeZedZedZedZedZedZedZedZ ed Z edZ edZ edZ ed Zd eZed Zed ZedZedZedZedZdeZedZedZedZedZedZedZedZedZdS(ii sorg.fedoraproject.FirewallD%ds.zones.directs .policiess.ipsets.configs.services .icmptypes.helpers/org/fedoraproject/FirewallD%ds/configs/config/icmptypes/config/services /config/zones /config/ipsets/config/helpers.infos.allN(tDBUS_INTERFACE_VERSIONtDBUS_INTERFACE_REVISIONtDBUS_INTERFACEtDBUS_INTERFACE_ZONEtDBUS_INTERFACE_DIRECTtDBUS_INTERFACE_POLICIEStDBUS_INTERFACE_IPSETtDBUS_INTERFACE_CONFIGtDBUS_INTERFACE_CONFIG_ZONEtDBUS_INTERFACE_CONFIG_SERVICEtDBUS_INTERFACE_CONFIG_ICMPTYPEtDBUS_INTERFACE_CONFIG_POLICIEStDBUS_INTERFACE_CONFIG_DIRECTtDBUS_INTERFACE_CONFIG_IPSETtDBUS_INTERFACE_CONFIG_HELPERt DBUS_PATHtDBUS_PATH_CONFIGtDBUS_PATH_CONFIG_ICMPTYPEtDBUS_PATH_CONFIG_SERVICEtDBUS_PATH_CONFIG_ZONEtDBUS_PATH_CONFIG_IPSETtDBUS_PATH_CONFIG_HELPERt _PK_ACTIONtPK_ACTION_POLICIEStPK_ACTION_POLICIES_INFOtPK_ACTION_CONFIGtPK_ACTION_CONFIG_INFOtPK_ACTION_DIRECTtPK_ACTION_DIRECT_INFOtPK_ACTION_INFOt PK_ACTION_ALL(((s8/usr/lib/python2.7/site-packages/firewall/config/dbus.pyts<                            PK[@PP&site-packages/firewall/config/dbus.pycnu[ c`c@s2dZdZdeZedZedZedZedZedZedZedZ ed Z edZ edZ edZ ed Zd eZed Zed ZedZedZedZedZdeZedZedZedZedZedZedZedZedZdS(ii sorg.fedoraproject.FirewallD%ds.zones.directs .policiess.ipsets.configs.services .icmptypes.helpers/org/fedoraproject/FirewallD%ds/configs/config/icmptypes/config/services /config/zones /config/ipsets/config/helpers.infos.allN(tDBUS_INTERFACE_VERSIONtDBUS_INTERFACE_REVISIONtDBUS_INTERFACEtDBUS_INTERFACE_ZONEtDBUS_INTERFACE_DIRECTtDBUS_INTERFACE_POLICIEStDBUS_INTERFACE_IPSETtDBUS_INTERFACE_CONFIGtDBUS_INTERFACE_CONFIG_ZONEtDBUS_INTERFACE_CONFIG_SERVICEtDBUS_INTERFACE_CONFIG_ICMPTYPEtDBUS_INTERFACE_CONFIG_POLICIEStDBUS_INTERFACE_CONFIG_DIRECTtDBUS_INTERFACE_CONFIG_IPSETtDBUS_INTERFACE_CONFIG_HELPERt DBUS_PATHtDBUS_PATH_CONFIGtDBUS_PATH_CONFIG_ICMPTYPEtDBUS_PATH_CONFIG_SERVICEtDBUS_PATH_CONFIG_ZONEtDBUS_PATH_CONFIG_IPSETtDBUS_PATH_CONFIG_HELPERt _PK_ACTIONtPK_ACTION_POLICIEStPK_ACTION_POLICIES_INFOtPK_ACTION_CONFIGtPK_ACTION_CONFIG_INFOtPK_ACTION_DIRECTtPK_ACTION_DIRECT_INFOtPK_ACTION_INFOt PK_ACTION_ALL(((s8/usr/lib/python2.7/site-packages/firewall/config/dbus.pyts<                            PK[Nl)site-packages/firewall/config/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2007-2016 Red Hat, Inc. # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # from __future__ import absolute_import # translation import locale try: locale.setlocale(locale.LC_ALL, "") except locale.Error: import os os.environ['LC_ALL'] = 'C' locale.setlocale(locale.LC_ALL, "") DOMAIN = 'firewalld' import gettext gettext.install(domain=DOMAIN) from . import dbus # noqa: F401 # configuration DAEMON_NAME = 'firewalld' CONFIG_NAME = 'firewall-config' APPLET_NAME = 'firewall-applet' DATADIR = '/usr/share/' + DAEMON_NAME CONFIG_GLADE_NAME = CONFIG_NAME + '.glade' COPYRIGHT = '(C) 2010-2017 Red Hat, Inc.' VERSION = '0.6.3' AUTHORS = [ "Thomas Woerner ", "Jiri Popelka ", "Eric Garver ", ] LICENSE = gettext.gettext( "This program is free software; you can redistribute it and/or modify " "it under the terms of the GNU General Public License as published by " "the Free Software Foundation; either version 2 of the License, or " "(at your option) any later version.\n" "\n" "This program is distributed in the hope that it will be useful, " "but WITHOUT ANY WARRANTY; without even the implied warranty of " "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the " "GNU General Public License for more details.\n" "\n" "You should have received a copy of the GNU General Public License " "along with this program. If not, see .") WEBSITE = 'http://www.firewalld.org' def set_system_config_paths(path): global ETC_FIREWALLD, FIREWALLD_CONF, ETC_FIREWALLD_ZONES, \ ETC_FIREWALLD_SERVICES, ETC_FIREWALLD_ICMPTYPES, \ ETC_FIREWALLD_IPSETS, ETC_FIREWALLD_HELPERS, \ FIREWALLD_DIRECT, LOCKDOWN_WHITELIST ETC_FIREWALLD = path FIREWALLD_CONF = path + '/firewalld.conf' ETC_FIREWALLD_ZONES = path + '/zones' ETC_FIREWALLD_SERVICES = path + '/services' ETC_FIREWALLD_ICMPTYPES = path + '/icmptypes' ETC_FIREWALLD_IPSETS = path + '/ipsets' ETC_FIREWALLD_HELPERS = path + '/helpers' FIREWALLD_DIRECT = path + '/direct.xml' LOCKDOWN_WHITELIST = path + '/lockdown-whitelist.xml' set_system_config_paths('/etc/firewalld') def set_default_config_paths(path): global USR_LIB_FIREWALLD, FIREWALLD_ZONES, FIREWALLD_SERVICES, \ FIREWALLD_ICMPTYPES, FIREWALLD_IPSETS, FIREWALLD_HELPERS USR_LIB_FIREWALLD = path FIREWALLD_ZONES = path + '/zones' FIREWALLD_SERVICES = path + '/services' FIREWALLD_ICMPTYPES = path + '/icmptypes' FIREWALLD_IPSETS = path + '/ipsets' FIREWALLD_HELPERS = path + '/helpers' set_default_config_paths('/usr/lib/firewalld') FIREWALLD_LOGFILE = '/var/log/firewalld' FIREWALLD_PIDFILE = "/var/run/firewalld.pid" FIREWALLD_TEMPDIR = '/run/firewalld' SYSCONFIGDIR = '/etc/sysconfig' IFCFGDIR = "/etc/sysconfig/network-scripts" SYSCTL_CONFIG = '/etc/sysctl.conf' # commands used by backends COMMANDS = { "ipv4": "/usr/sbin/iptables", "ipv4-restore": "/usr/sbin/iptables-restore", "ipv6": "/usr/sbin/ip6tables", "ipv6-restore": "/usr/sbin/ip6tables-restore", "eb": "/usr/sbin/ebtables", "eb-restore": "/usr/sbin/ebtables-restore", "ipset": "/usr/sbin/ipset", "modprobe": "/usr/sbin/modprobe", "rmmod": "/usr/sbin/rmmod", "nft": "@NFT@", } LOG_DENIED_VALUES = [ "all", "unicast", "broadcast", "multicast", "off" ] AUTOMATIC_HELPERS_VALUES = [ "yes", "no", "system" ] # fallbacks: will be overloaded by firewalld.conf FALLBACK_ZONE = "public" FALLBACK_MINIMAL_MARK = 100 FALLBACK_CLEANUP_ON_EXIT = True FALLBACK_LOCKDOWN = False FALLBACK_IPV6_RPFILTER = True FALLBACK_INDIVIDUAL_CALLS = False FALLBACK_LOG_DENIED = "off" FALLBACK_AUTOMATIC_HELPERS = "system" FALLBACK_FIREWALL_BACKEND = "iptables" FALLBACK_ALLOW_ZONE_DRIFTING = True PK[l l %site-packages/firewall/config/dbus.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011,2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # DBUS_INTERFACE_VERSION = 1 DBUS_INTERFACE_REVISION = 12 DBUS_INTERFACE = "org.fedoraproject.FirewallD%d" % DBUS_INTERFACE_VERSION DBUS_INTERFACE_ZONE = DBUS_INTERFACE+".zone" DBUS_INTERFACE_DIRECT = DBUS_INTERFACE+".direct" DBUS_INTERFACE_POLICIES = DBUS_INTERFACE+".policies" DBUS_INTERFACE_IPSET = DBUS_INTERFACE+".ipset" DBUS_INTERFACE_CONFIG = DBUS_INTERFACE+".config" DBUS_INTERFACE_CONFIG_ZONE = DBUS_INTERFACE_CONFIG+".zone" DBUS_INTERFACE_CONFIG_SERVICE = DBUS_INTERFACE_CONFIG+".service" DBUS_INTERFACE_CONFIG_ICMPTYPE = DBUS_INTERFACE_CONFIG+".icmptype" DBUS_INTERFACE_CONFIG_POLICIES = DBUS_INTERFACE_CONFIG+".policies" DBUS_INTERFACE_CONFIG_DIRECT = DBUS_INTERFACE_CONFIG+".direct" DBUS_INTERFACE_CONFIG_IPSET = DBUS_INTERFACE_CONFIG+".ipset" DBUS_INTERFACE_CONFIG_HELPER = DBUS_INTERFACE_CONFIG+".helper" DBUS_PATH = "/org/fedoraproject/FirewallD%d" % DBUS_INTERFACE_VERSION DBUS_PATH_CONFIG = DBUS_PATH+"/config" DBUS_PATH_CONFIG_ICMPTYPE = DBUS_PATH+"/config/icmptype" DBUS_PATH_CONFIG_SERVICE = DBUS_PATH+"/config/service" DBUS_PATH_CONFIG_ZONE = DBUS_PATH+"/config/zone" DBUS_PATH_CONFIG_IPSET = DBUS_PATH+"/config/ipset" DBUS_PATH_CONFIG_HELPER = DBUS_PATH+"/config/helper" # Polkit actions _PK_ACTION = "org.fedoraproject.FirewallD%d" % DBUS_INTERFACE_VERSION PK_ACTION_POLICIES = _PK_ACTION+".policies" PK_ACTION_POLICIES_INFO = PK_ACTION_POLICIES+".info" PK_ACTION_CONFIG = _PK_ACTION+".config" PK_ACTION_CONFIG_INFO = PK_ACTION_CONFIG+".info" PK_ACTION_DIRECT = _PK_ACTION+".direct" PK_ACTION_DIRECT_INFO = PK_ACTION_DIRECT+".info" PK_ACTION_INFO = _PK_ACTION+".info" PK_ACTION_ALL = _PK_ACTION+".all" # implies all other actions PK[~x11*site-packages/firewall/config/__init__.pyonu[ c`c@@sddlmZddlZyejejdWn@ejk ruddlZdejdi(tabsolute_importNttCtLC_ALLt firewalldtdomaini(tdbussfirewall-configsfirewall-applets /usr/share/s.glades(C) 2010-2017 Red Hat, Inc.s0.6.3s$Thomas Woerner s"Jiri Popelka sEric Garver scThis program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see .shttp://www.firewalld.orgcC@sZ|a|da|da|da|da|da|da|da|dadS( Ns/firewalld.confs/zoness /servicess /icmptypess/ipsetss/helperss /direct.xmls/lockdown-whitelist.xml( t ETC_FIREWALLDtFIREWALLD_CONFtETC_FIREWALLD_ZONEStETC_FIREWALLD_SERVICEStETC_FIREWALLD_ICMPTYPEStETC_FIREWALLD_IPSETStETC_FIREWALLD_HELPERStFIREWALLD_DIRECTtLOCKDOWN_WHITELIST(tpath((s</usr/lib/python2.7/site-packages/firewall/config/__init__.pytset_system_config_pathsBs       s/etc/firewalldcC@s<|a|da|da|da|da|dadS(Ns/zoness /servicess /icmptypess/ipsetss/helpers(tUSR_LIB_FIREWALLDtFIREWALLD_ZONEStFIREWALLD_SERVICEStFIREWALLD_ICMPTYPEStFIREWALLD_IPSETStFIREWALLD_HELPERS(R((s</usr/lib/python2.7/site-packages/firewall/config/__init__.pytset_default_config_pathsRs     s/usr/lib/firewallds/var/log/firewallds/var/run/firewalld.pids/run/firewallds/etc/sysconfigs/etc/sysconfig/network-scriptss/etc/sysctl.confs/usr/sbin/iptablestipv4s/usr/sbin/iptables-restores ipv4-restores/usr/sbin/ip6tablestipv6s/usr/sbin/ip6tables-restores ipv6-restores/usr/sbin/ebtablestebs/usr/sbin/ebtables-restores eb-restores/usr/sbin/ipsettipsets/usr/sbin/modprobetmodprobes/usr/sbin/rmmodtrmmods@NFT@tnfttalltunicastt broadcastt multicasttofftyestnotsystemtpublicidtiptables(.t __future__Rtlocalet setlocaleRtErrortostenvirontDOMAINtgettexttinstallRRt DAEMON_NAMEt CONFIG_NAMEt APPLET_NAMEtDATADIRtCONFIG_GLADE_NAMEt COPYRIGHTtVERSIONtAUTHORStLICENSEtWEBSITERRtFIREWALLD_LOGFILEtFIREWALLD_PIDFILEtFIREWALLD_TEMPDIRt SYSCONFIGDIRtIFCFGDIRt SYSCTL_CONFIGtCOMMANDStLOG_DENIED_VALUEStAUTOMATIC_HELPERS_VALUESt FALLBACK_ZONEtFALLBACK_MINIMAL_MARKtTruetFALLBACK_CLEANUP_ON_EXITtFalsetFALLBACK_LOCKDOWNtFALLBACK_IPV6_RPFILTERtFALLBACK_INDIVIDUAL_CALLStFALLBACK_LOG_DENIEDtFALLBACK_AUTOMATIC_HELPERStFALLBACK_FIREWALL_BACKENDtFALLBACK_ALLOW_ZONE_DRIFTING(((s</usr/lib/python2.7/site-packages/firewall/config/__init__.pytsr            PK[ #ee!site-packages/firewall/errors.pycnu[ c`c@s?dZdZdZdZdZdZdZdZdZd Z d Z d Z d Z d Z dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9d:Z:d;Z;d<Z<d=Z=d>Z>d?Z?d@Z@dAZAdBZBdCZCdDZDdEZEdFZFdGZGdHZHdIZIdJZJdKZKdLZLdMZMdNZNdOdPlOZOdQePfdRYZQeOjReQjSZTdSeUeTDeQ_VdTeQjVDeQ_WdPS(Ui i i iiiiiiiiiiiiiiiiiii i!i"i#i$i%i&idieifigihiiijikiliminioipiqirisitiuiviwixiyizi{i|i}i~iiiiiiiiiiiiiiiiiiiiiiiiiNt FirewallErrorcBs;eZddZdZdZdZeeZRS(cCsp||_|dk rctjdkrcyt|}Wq`tk r\t|jd}q`Xqcn||_dS(Nt3tunicode_escape( tcodetNonetsystversiontstrtUnicodeEncodeErrortunicodetencodetmsg(tselfRR tx((s3/usr/lib/python2.7/site-packages/firewall/errors.pyt__init__ls   cCsd|j|j|jfS(Ns %s(%r, %r)(t __class__RR (R ((s3/usr/lib/python2.7/site-packages/firewall/errors.pyt__repr__wscCs2|jr$d|j|j|jfS|j|jS(Ns%s: %s(R terrorsR(R ((s3/usr/lib/python2.7/site-packages/firewall/errors.pyt__str__zs cCs]d|kr(|jd}|| }n|}ytj|}Wntk rXt}nX|S(Nt:(tindexRtcodestKeyErrort UNKNOWN_ERROR(R tidxtecodeR((s3/usr/lib/python2.7/site-packages/firewall/errors.pytget_codes    N(t__name__t __module__RRRRRt staticmethod(((s3/usr/lib/python2.7/site-packages/firewall/errors.pyRks    cCsMi|]C}|jd rttt|tkr|tt|qS(t_(t startswithttypetgetattrtmodtint(t.0tvarname((s3/usr/lib/python2.7/site-packages/firewall/errors.pys s cCs i|]}|tj|qS((RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/errors.pys s (XtALREADY_ENABLEDt NOT_ENABLEDtCOMMAND_FAILEDt NO_IPV6_NATt PANIC_MODEtZONE_ALREADY_SETtUNKNOWN_INTERFACEt ZONE_CONFLICTt BUILTIN_CHAINtEBTABLES_NO_REJECTtNOT_OVERLOADABLEt NO_DEFAULTSt BUILTIN_ZONEtBUILTIN_SERVICEtBUILTIN_ICMPTYPEt NAME_CONFLICTt NAME_MISMATCHt PARSE_ERRORt ACCESS_DENIEDtUNKNOWN_SOURCEtRT_TO_PERM_FAILEDtIPSET_WITH_TIMEOUTt BUILTIN_IPSETt ALREADY_SETtMISSING_IMPORTt DBUS_ERRORtBUILTIN_HELPERt NOT_APPLIEDtINVALID_ACTIONtINVALID_SERVICEt INVALID_PORTtINVALID_PROTOCOLtINVALID_INTERFACEt INVALID_ADDRtINVALID_FORWARDtINVALID_ICMPTYPEt INVALID_TABLEt INVALID_CHAINtINVALID_TARGETt INVALID_IPVt INVALID_ZONEtINVALID_PROPERTYt INVALID_VALUEtINVALID_OBJECTt INVALID_NAMEtINVALID_FILENAMEtINVALID_DIRECTORYt INVALID_TYPEtINVALID_SETTINGtINVALID_DESTINATIONt INVALID_RULEt INVALID_LIMITtINVALID_FAMILYtINVALID_LOG_LEVELtINVALID_AUDIT_TYPEt INVALID_MARKtINVALID_CONTEXTtINVALID_COMMANDt INVALID_USERt INVALID_UIDtINVALID_MODULEtINVALID_PASSTHROUGHt INVALID_MACt INVALID_IPSETt INVALID_ENTRYtINVALID_OPTIONtINVALID_HELPERt MISSING_TABLEt MISSING_CHAINt MISSING_PORTtMISSING_PROTOCOLt MISSING_ADDRt MISSING_NAMEtMISSING_SETTINGtMISSING_FAMILYtRUNNING_BUT_FAILEDt NOT_RUNNINGtNOT_AUTHORIZEDRRt ExceptionRtmodulesRR"tdirRR(((s3/usr/lib/python2.7/site-packages/firewall/errors.pyts $PK[u|%site-packages/firewall/dbus_utils.pycnu[ c`c @sdddddddddd d g Zd d lZd d lZd d lZd d lmZd dlmZejdkZ dZ dZ dZ dZ dZdZdZd dZdZd dZdZd S(tcommand_of_pidt pid_of_sendert uid_of_sendert user_of_uidtcontext_of_sendertcommand_of_sendertuser_of_sendertdbus_to_pythontdbus_signaturet%dbus_introspection_prepare_propertiest!dbus_introspection_add_propertiesiN(tminidom(tlogt3cCs[yBtd|d)}|jdjddj}WdQXWntk rVdSX|S(s Get command for pid from /proc s/proc/%d/cmdlinetritt N(topent readlinestreplacetstript ExceptiontNone(tpidtftcmd((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR%s , cCsV|jdd}tj|d}yt|j|}Wntk rQdSX|S(sW Get pid from sender string using org.freedesktop.DBus.GetConnectionUnixProcessID sorg.freedesktop.DBuss/org/freedesktop/DBusN(t get_objecttdbust InterfacetinttGetConnectionUnixProcessIDt ValueErrorR(tbustsendertdbus_objt dbus_ifaceR((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR.s cCsV|jdd}tj|d}yt|j|}Wntk rQdSX|S(sV Get user id from sender string using org.freedesktop.DBus.GetConnectionUnixUser sorg.freedesktop.DBuss/org/freedesktop/DBusN(RRRRtGetConnectionUnixUserRR(R R!R"R#tuid((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR;s cCs0ytj|}Wntk r'dSX|dS(s Get user for uid from pwd iN(tpwdtgetpwuidRR(R%tpws((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRHs  cCsh|jdd}tj|d}y|j|}Wntk rKdSXdjttt |S(sl Get SELinux context from sender string using org.freedesktop.DBus.GetConnectionSELinuxSecurityContext sorg.freedesktop.DBuss/org/freedesktop/DBustN( RRRt#GetConnectionSELinuxSecurityContextRRtjointmaptchrR(R R!R"R#tcontext((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRQs cCstt||S(s Return command of D-Bus sender (RR(R R!((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR_scCstt||S(N(RR(R R!((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRdsc Cs|dkr|}n}t|tjr6t|}n\t|tjrltr]|jdn t|}n&trt|tj rt|}nt|tj rt|}nt|tj s2t|tj s2t|tj s2t|tjs2t|tjs2t|tjs2t|tjrAt|}nQt|tjrbt|}n0t|tjrg|D]}t|^q{}nt|tjrtg|D]}t|^q}nt|tjrd|jD}nt|tsst|tsst|tsst|tsst|tsst|tsst|tsst|tr||}ntdt||dk r|tkrt|t sb|tkrt|t sb|tkrt|t sb|tkrt|t sb|tkr*t|t sb|tkrFt|t sb|tkrt|t rtd|t ||fqn|S(Nsutf-8cSs+i|]!\}}t|t|qS((R(t.0tktv((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pys s s Unhandled %ss%s is %s, expected %s(!Rt isinstanceRtBooleantbooltStringtPY2tencodetstrt UTF8Stringt ObjectPathtBytetInt16tInt32tInt64tUInt16tUInt32tUInt64RtDoubletfloattArrayRtStructttuplet Dictionarytitemstbytestlisttdictt TypeErrortreprttype(tobjt expected_typet python_objtx((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRgsV  $"(  %cCst|tjrdSt|tjr,dSt|tjrBdSt|tjrXdSt|tjrndSt|tjrdSt|tjrdSt|tj rdSt|tj rd St|tj rd St|tj rd St|tj r2t|jd kr$d |jSd|jSnlt|tjrOd|jSt|tjrld|jStrt|tjrdStdt|dS(NtbtstotytntiRRtqtutttdisa(%s)sa%ss(%s)sa{%s}s Unhandled %s(R2RR3R5R:R;R<R=R>R?R@RARBRDtlent signatureRERGR6R9RLRM(RO((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRsB   cCs|dkri}nt|ds7t|dint|d}i||s*          0 % PK[ !site-packages/firewall/client.pycnu[ c`c@s^ddlmZmZddlZeejded7Z?ed8Z@ed9ZAed:ZBed;ZCed<ZDed=ZEed>ZFed?ZGed@ZHRS(BcCsO|r||_n9dddttgggtggggggtg|_dS(Nt(tsettingsR R(tselfR#((s3/usr/lib/python2.7/site-packages/firewall/client.pyt__init__Vs cCsd|j|jfS(Ns%s(%r)(t __class__R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyt__repr__^scCs |jdS(Ni(R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getVersionbscCs||jdR?R@RBRERFRGRHRJRKRLRMRNRORPRQRRRSRURWRXRYRZR\tslipR tpolkitt enable_proxyR]R^R_R`RbRcRdReRfRgRkRlRmRnRpRrRsRtRuRwRyRzR{R|RRRR(((s3/usr/lib/python2.7/site-packages/firewall/client.pyR!Us        tFirewallClientConfigZonecBsceZdZejjjedZejjjedZ ejjjedZ ejjjedZ ejjjedZ ejjjedZ ejjjedZejjjedZejjjed Zejjjed Zejjjed Zejjjed Zejjjed ZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZ ejjjedZ!ejjjedZ"ejjjedZ#ejjjedZ$ejjjedZ%ejjjedZ&ejjjed Z'ejjjed!Z(ejjjed"Z)ejjjed#Z*ejjjed$Z+ejjjed%Z,ejjjed&Z-ejjjed'Z.ejjjed(Z/ejjjed)Z0ejjjed*Z1ejjjed+Z2ejjjed,Z3ejjjed-Z4ejjjed.Z5ejjjed/Z6ejjjed0Z7ejjjed1Z8ejjjed2Z9ejjjed3Z:ejjjed4Z;ejjjed5Z<ejjjed6Z=ejjjed7Z>ejjjed8Z?ejjjed9Z@ejjjed:ZAejjjed;ZBejjjed<ZCejjjed=ZDejjjed>ZEejjjed?ZFejjjed@ZGejjjedAZHejjjedBZIejjjedCZJejjjedDZKejjjedEZLejjjedFZMejjjedGZNRS(HcCsp||_||_|jjtjj||_tj|jdtjj|_ tj|jdd|_ dS(Ntdbus_interfacesorg.freedesktop.DBus.Properties( tbustpatht get_objectRR tDBUS_INTERFACEtdbus_objt InterfacetDBUS_INTERFACE_CONFIG_ZONEtfw_zonet fw_properties(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR%s   cCst|jjtjj|S(N(RRtGetRR R(R$tprop((s3/usr/lib/python2.7/site-packages/firewall/client.pyt get_propertys cCst|jjtjjS(N(RRtGetAllRR R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytget_propertiess cCs |jjtjj||dS(N(RtSetRR R(R$Rtvalue((s3/usr/lib/python2.7/site-packages/firewall/client.pyt set_propertyscCsttt|jjS(N(R!tlistRRt getSettings(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRs cCs|jjt|jdS(N(RtupdatettupleR#(R$R#((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs|jjdS(N(Rt loadDefaults(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs|jjdS(N(RR<(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR<scCs|jj|dS(N(Rtrename(R$tname((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs |jjS(N(RR((R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR(scCs|jj|dS(N(RR*(R$R)((s3/usr/lib/python2.7/site-packages/firewall/client.pyR*scCs |jjS(N(RR+(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR+scCs|jj|dS(N(RR-(R$R,((s3/usr/lib/python2.7/site-packages/firewall/client.pyR-scCs |jjS(N(RR.(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR.scCs|jj|dS(N(RR0(R$R/((s3/usr/lib/python2.7/site-packages/firewall/client.pyR0scCs |jjS(N(RR2(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR2scCs|jj|dS(N(RR4(R$R3((s3/usr/lib/python2.7/site-packages/firewall/client.pyR4scCs |jjS(N(RR5(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR5scCs|jj|dS(N(RR7(R$R6((s3/usr/lib/python2.7/site-packages/firewall/client.pyR7scCs|jj|dS(N(RR;(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR;scCs|jj|dS(N(RR>(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR> scCs|jj|S(N(RR?(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR?scCs |jjS(N(RR@(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR@scCs|jj|dS(N(RRB(R$RA((s3/usr/lib/python2.7/site-packages/firewall/client.pyRBscCs|jj||dS(N(RRE(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRE!scCs|jj||dS(N(RRF(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF&scCs|jj||S(N(RRG(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRG+scCs |jjS(N(RRH(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRH2scCs|jj|dS(N(RRJ(R$RI((s3/usr/lib/python2.7/site-packages/firewall/client.pyRJ7scCs|jj|dS(N(RRK(R$RD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRK<scCs|jj|dS(N(RRL(R$RD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRLAscCs|jj|S(N(RRM(R$RD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRMFscCs |jjS(N(RRN(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRNMscCs|jj|dS(N(RRO(R$RA((s3/usr/lib/python2.7/site-packages/firewall/client.pyRORscCs|jj||dS(N(RRP(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRPWscCs|jj||dS(N(RRQ(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRQ\scCs|jj||S(N(RRR(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRRascCs |jjS(N(RRS(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRShscCs|jj|dS(N(RRU(R$t icmptypes((s3/usr/lib/python2.7/site-packages/firewall/client.pyRUmscCs|jj|dS(N(RRW(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyRWrscCs|jj|dS(N(RRX(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyRXwscCs|jj|S(N(RRY(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyRY|scCs |jjS(N(RRZ(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRZscCs|jj|dS(N(RR\(R$t inversion((s3/usr/lib/python2.7/site-packages/firewall/client.pyR\scCs|jjdS(N(RR](R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR]scCs|jjdS(N(RR^(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR^scCs |jjS(N(RR_(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR_scCs |jjS(N(RR`(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR`scCs|jj|dS(N(RRb(R$Ra((s3/usr/lib/python2.7/site-packages/firewall/client.pyRbscCs|jjdS(N(RRc(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRcscCs|jjdS(N(RRd(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRdscCs |jjS(N(RRe(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRescCs |jjS(N(RRf(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRfscCs|jj|dS(N(RRg(R$RA((s3/usr/lib/python2.7/site-packages/firewall/client.pyRgscCsG|dkrd}n|dkr*d}n|jj||||dS(NR"(RhRRk(R$RCRDttoportttoaddr((s3/usr/lib/python2.7/site-packages/firewall/client.pyRks     cCsG|dkrd}n|dkr*d}n|jj||||dS(NR"(RhRRl(R$RCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRls     cCsC|dkrd}n|dkr*d}n|jj||||S(NR"(RhRRm(R$RCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRms     cCs |jjS(N(RRn(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRnscCs|jj|dS(N(RRp(R$Ro((s3/usr/lib/python2.7/site-packages/firewall/client.pyRpscCs|jj|dS(N(RRr(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRrscCs|jj|dS(N(RRs(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRsscCs|jj|S(N(RRt(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRtscCs |jjS(N(RRu(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRuscCs|jj|dS(N(RRw(R$Rv((s3/usr/lib/python2.7/site-packages/firewall/client.pyRwscCs|jj|dS(N(RRy(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRyscCs|jj|dS(N(RRz(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRz scCs|jj|S(N(RR{(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyR{scCs |jjS(N(RR|(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR|scCs|jj|dS(N(RR(R$R~((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR%scCs|jj|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR*s(ORRR%RR RRR RRRRRRR<RR(R*R+R-R.R0R2R4R5R7R;R>R?R@RBRERFRGRHRJRKRLRMRNRORPRQRRRSRURWRXRYRZR\R]R^R_R`RbRcRdReRfRgRkRlRmRnRpRrRsRtRuRwRyRzR{R|RRRR(((s3/usr/lib/python2.7/site-packages/firewall/client.pyRs                                                                       tFirewallClientServiceSettingscBseZed!dZedZedZedZedZedZ edZ edZ edZ ed Z ed Zed Zed Zed ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZ edZ!edZ"ed!dZ#ed Z$RS("cCs7|r||_n!dddggiggg|_dS(NR"(R#(R$R#((s3/usr/lib/python2.7/site-packages/firewall/client.pyR%3s cCsd|j|jfS(Ns%s(%r)(R&R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR':scCs |jdS(Ni(R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR(>scCs||jd||jd|||jd|scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetIPSetscCs(t|jj|}t|j|S(N(RR:tgetIPSetByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR@scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(t isinstanceRR:taddIPSetRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRB s!cCst|jjS(N(RR:t getZoneNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRC scCst|jjS(N(RR:t listZones(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRD scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetZone scCs(t|jj|}t|j|S(N(RR:t getZoneByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF scCst|jj|S(N(RR:tgetZoneOfInterface(R$tiface((s3/usr/lib/python2.7/site-packages/firewall/client.pyRG$ scCst|jj|S(N(RR:tgetZoneOfSource(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRI) scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RAR!R:taddZoneRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRJ. s!cCst|jjS(N(RR:tgetServiceNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRK9 scCst|jjS(N(RR:t listServices(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRL> scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getServiceC scCs(t|jj|}t|j|S(N(RR:tgetServiceByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRNH scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RARR:R;RR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR;N s!cCst|jjS(N(RR:tgetIcmpTypeNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyROY scCst|jjS(N(RR:t listIcmpTypes(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRP^ scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getIcmpTypec scCs(t|jj|}t|j|S(N(RR:tgetIcmpTypeByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRRh scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RARR:t addIcmpTypeRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRSn s!cCs|jS(N(R;(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytpoliciesw scCs|jS(N(R<(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytdirect| scCst|jjS(N(RR:tgetHelperNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRV scCst|jjS(N(RR:t listHelpers(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRW scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getHelper scCs(t|jj|}t|j|S(N(RR:tgetHelperByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRY scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RARR:t addHelperRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRZ s!((RRR R%RR RRRRRR=R>R?R@RBRCRDRERFRGRIRJRKRLRMRNR;RORPRQRRRSRTRURVRWRXRYRZ(((s3/usr/lib/python2.7/site-packages/firewall/client.pyR8s                                tFirewallClientcBseZeddedZedZedZedZedZ edZ edZ edZ ed Z ed Zed Zejjjed Zejjjed ZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZ ejjjedZ!ejjjedZ"ejjjedZ#ejjjedZ$ejjjedZ%ejjjedZ&ejjjedZ'ejjjed Z(ejjjed!Z)ejjjed"Z*ejjjed#Z+ejjjed$Z,ejjjed%Z-ejjjed&Z.ejjjed'Z/ejjjed(Z0ejjjed)Z1ejjjed*Z2ejjjed+Z3ejjjed,Z4ejjjed-Z5ejjjed.Z6ejjjed/Z7ejjjed0Z8ejjjed1Z9ejjjed2Z:ejjjed3Z;ejjjed4Z<ejjjed5Z=ejjjed6Z>ejjjed7Z?ejjjed8Z@ejjjed9ZAejjjed:ZBejjjedd;ZCejjjed<ZDejjjed=ZEejjjed>ZFejjjedd?ZGejjjed@ZHejjjedAZIejjjedBZJejjjeddCZKejjjedDZLejjjedEZMejjjedFZNejjjeddGZOejjjedHZPejjjedIZQejjjedJZRejjjeddKZSejjjedLZTejjjedMZUejjjeddNZVejjjedOZWejjjedPZXejjjedQZYejjjeddRZZejjjedSZ[ejjjedTZ\ejjjedUZ]ejjjeddVZ^ejjjedWZ_ejjjedXZ`ejjjedYZaejjjedZZbejjjed[Zcejjjed\Zdejjjed]Zeejjjed^Zfejjjed_Zgejjjed`ZhejjjedaZiejjjedbZjejjjedcZkejjjeddZlejjjedeZmejjjedfZnejjjedgZoejjjedhZpejjjediZqejjjedjZrejjjedkZsejjjedlZtejjjedmZuejjjednZvejjjedoZwejjjedpZxejjjedqZyejjjedrZzejjjedsZ{ejjjedtZ|ejjjeduZ}ejjjedvZ~ejjjedwZejjjedxZejjjedyZejjjedzZejjjed{Zejjjed|Zejjjed}Zejjjed~ZejjjedZejjjedZejjjedZejjjedZRS(ic Cs|stjjjdty"tjj|_d|j_ Wqt k rytj|_Wn1tj j k r}t tj|jqXdGHqXn ||_|jjd|jdddddtjjxtjjtjjtjjtjjtjjtjjtjjtjjtjjtjjtjjtjjtjj g D]1}|jj|j!d|d d d d d dqTWi|_"iIdd6dd6dd6dd6dd6dd6dd6dd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6dDdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6dYdZ6d[d\6d]d^6d_d`6dadb6dcdd6dedf6dgdh6didj6dkdl6dmdn6dodp6dqdr6dsdt6dudv6dwdx6dydz6d{d|6d}d~6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6|_#|j$||_%|dkrt&j'||j(n |j(dS(Ntset_as_defaultsNot using slip.dbusthandler_functiont signal_nametNameOwnerChangedRsorg.freedesktop.DBustarg0tinterface_keywordRqtmember_keywordtmembert path_keywordRsconnection-changedsconnection-establishedsconnection-losttLogDeniedChangedslog-denied-changedtDefaultZoneChangedsdefault-zone-changedtPanicModeEnabledspanic-mode-enabledtPanicModeDisabledspanic-mode-disabledtReloadedtreloadedt ServiceAddeds service-addedtServiceRemovedsservice-removedt PortAddeds port-addedt PortRemoveds port-removedtSourcePortAddedssource-port-addedtSourcePortRemovedssource-port-removedt ProtocolAddedsprotocol-addedtProtocolRemovedsprotocol-removedtMasqueradeAddedsmasquerade-addedtMasqueradeRemovedsmasquerade-removedtForwardPortAddedsforward-port-addedtForwardPortRemovedsforward-port-removedtIcmpBlockAddedsicmp-block-addedtIcmpBlockRemovedsicmp-block-removedtIcmpBlockInversionAddedsicmp-block-inversion-addedtIcmpBlockInversionRemovedsicmp-block-inversion-removedt RichRuleAddedsrichrule-addedtRichRuleRemovedsrichrule-removedtInterfaceAddedsinterface-addedtInterfaceRemovedsinterface-removedtZoneOfInterfaceChangeds zone-changedszone-of-interface-changedt SourceAddeds source-addedt SourceRemovedssource-removedtZoneOfSourceChangedszone-of-source-changedt EntryAddedsipset-entry-addedt EntryRemovedsipset-entry-removedt ChainAddedsdirect:chain-addedt ChainRemovedsdirect:chain-removedt RuleAddedsdirect:rule-addedt RuleRemovedsdirect:rule-removedtPassthroughAddedsdirect:passthrough-addedtPassthroughRemovedsdirect:passthrough-removedsconfig:direct:Updatedsconfig:direct:updatedtLockdownEnabledslockdown-enabledtLockdownDisabledslockdown-disabledtLockdownWhitelistCommandAddeds lockdown-whitelist-command-addedtLockdownWhitelistCommandRemoveds"lockdown-whitelist-command-removedtLockdownWhitelistContextAddeds lockdown-whitelist-context-addedtLockdownWhitelistContextRemoveds"lockdown-whitelist-context-removedtLockdownWhitelistUidAddedslockdown-whitelist-uid-addedtLockdownWhitelistUidRemovedslockdown-whitelist-uid-removedtLockdownWhitelistUserAddedslockdown-whitelist-user-addedtLockdownWhitelistUserRemovedslockdown-whitelist-user-removeds(config:policies:LockdownWhitelistUpdateds*config:policies:lockdown-whitelist-updatedsconfig:IPSetAddedsconfig:ipset-addedsconfig:IPSetUpdatedsconfig:ipset-updatedsconfig:IPSetRemovedsconfig:ipset-removedsconfig:IPSetRenamedsconfig:ipset-renamedsconfig:ZoneAddedsconfig:zone-addedsconfig:ZoneUpdatedsconfig:zone-updatedsconfig:ZoneRemovedsconfig:zone-removedsconfig:ZoneRenamedsconfig:zone-renamedsconfig:ServiceAddedsconfig:service-addedsconfig:ServiceUpdatedsconfig:service-updatedsconfig:ServiceRemovedsconfig:service-removedsconfig:ServiceRenamedsconfig:service-renamedsconfig:IcmpTypeAddedsconfig:icmptype-addedsconfig:IcmpTypeUpdatedsconfig:icmptype-updatedsconfig:IcmpTypeRemovedsconfig:icmptype-removedsconfig:IcmpTypeRenamedsconfig:icmptype-renamedsconfig:HelperAddedsconfig:helper-addedsconfig:HelperUpdatedsconfig:helper-updatedsconfig:HelperRemovedsconfig:helper-removedsconfig:HelperRenamedsconfig:helper-renamedi()R tmainlooptglibt DBusGMainLoopRRt SystemBusRRhtdefault_timeoutRRRR R t DBUS_ERRORRtadd_signal_receivert_dbus_connection_changedRRtDBUS_INTERFACE_IPSETtDBUS_INTERFACE_ZONEtDBUS_INTERFACE_DIRECTtDBUS_INTERFACE_POLICIESR9RRRRR6RRt_signal_receivert _callbackt _callbackst _init_varstquietRttimeout_add_secondst_connection_established(R$RtwaitRRRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyR% s                         cCsLd|_d|_d|_d|_d|_d|_d|_t|_ dS(N( RhtfwRRRR7Rt_configR t connected(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR. s       cCstS(N(R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetExceptionHandler9 scCs |adS(N(R(R$thandler((s3/usr/lib/python2.7/site-packages/firewall/client.pytsetExceptionHandler= scCstS(N(R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetNotAuthorizedLoopB scCs |adS(N(R(R$tenable((s3/usr/lib/python2.7/site-packages/firewall/client.pytsetNotAuthorizedLoopF scGs@||jkr,||f|j|j|      cCsF|j|jdddtjj|jdddtjjdS(NRcsconnection-lostRqsconnection-changed(RRRR R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s   c Osd|ksd|krdS|d}|d}|jtjjrRd|}n|jtjjrtd|}n|jtjjrd|}n|jtjjrd|}n|jtjjrd|}n]|tjjkrd|}n>|tjj krd |}n|tjj kr7d |}nd}xQ|j D]F}|j ||krG|j ||j krG|j |j |}qGqGW|dkrdSg|D]}t|^q}y0|d r|j|d n|d |Wntk r } | GHnXdS( NRcRqs config:Zones config:IPSetsconfig:Servicesconfig:IcmpTypes config:Helpersconfig:sconfig:policies:sconfig:direct:ii(t startswithRR RRRRRR9RR6RhRRRtextendR( R$RRtsignalRqtcbRtargtcb_argstmsg((s3/usr/lib/python2.7/site-packages/firewall/client.pyR sD            cCs|jS(N(R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(Rtreload(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtcompleteReload(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytcomplete_reload scCs|jjdS(N(RtruntimeToPermanent(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtcheckPermanentConfig(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjtjj|S(N(RRRRR R(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCst|jjtjjS(N(RRRRR R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCs |jjtjj||dS(N(RRRR R(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtenablePanicMode(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtdisablePanicMode(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RRtqueryPanicMode(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs"ttt|jj|S(N(R!RRRtgetZoneSettings(R$tzone((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCst|jjS(N(RRt getIPSets(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs"ttt|jj|S(N(RRRRtgetIPSetSettings(R$tipset((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCs|jj||dS(N(RR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj||S(N(RR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj||dS(N(RR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj||S(N(RRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RRRL(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRL scCs"ttt|jj|S(N(RRRRtgetServiceSettings(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR# s cCst|jjS(N(RRRP(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRP) scCs"ttt|jj|S(N(RRRRtgetIcmpTypeSettings(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyR. s cCst|jjS(N(RRt getHelpers(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR4 scCs"ttt|jj|S(N(RRRRtgetHelperSettings(R$thelper((s3/usr/lib/python2.7/site-packages/firewall/client.pyR9 s cCst|jjS(N(RRtgetAutomaticHelpers(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRA scCs|jj|dS(N(RtsetAutomaticHelpers(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF scCst|jjS(N(RRt getLogDenied(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRM scCs|jj|dS(N(Rt setLogDenied(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRR scCst|jjS(N(RRtgetDefaultZone(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRY scCs|jj|dS(N(RtsetDefaultZone(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR^ scCst|jjS(N(RRtgetZones(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRe scCst|jjS(N(RRtgetActiveZones(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRj scCst|jj|S(N(RRRG(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRGo scCst|jj|S(N(RRRI(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRIt scCst|jj|S(N(RRt isImmutable(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRy scCst|jj||S(N(RRRr(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRr scCst|jj||S(N(RRt changeZone(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj||S(N(RRtchangeZoneOfInterface(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRRn(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRn scCst|jj||S(N(RRRt(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRt scCst|jj||S(N(RRRs(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRs scCst|jj||S(N(RRRy(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRy scCst|jj||S(N(RRtchangeZoneOfSource(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRRu(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRu scCst|jj||S(N(RRR{(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyR{ scCst|jj||S(N(RRRz(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRz scCst|jj|||S(N(RRR(R$RRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRR|(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR| scCst|jj||S(N(RRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj||S(N(RRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|||S(N(RRR;(R$RR:R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR; scCst|jj|S(N(RRR5(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR5 scCst|jj||S(N(RRR?(R$RR:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR? scCst|jj||S(N(RRR>(R$RR:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR> scCst|jj||||S(N(RRRE(R$RRCRDR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRE scCst|jj|S(N(RRR@(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR@ scCst|jj|||S(N(RRRG(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRG scCst|jj|||S(N(RRRF(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF scCst|jj|||S(N(RRRK(R$RRDR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRK scCst|jj|S(N(RRRH(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRH scCst|jj||S(N(RRRM(R$RRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRM scCst|jj||S(N(RRRL(R$RRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRL scCst|jj||S(N(RRRc(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRc scCst|jj|S(N(RRRe(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRe scCst|jj|S(N(RRRd(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRd scCsO|dkrd}n|dkr*d}nt|jj||||||S(NR"(RhRRRk(R$RRCRDRRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRk% s    cCst|jj|S(N(RRRf(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRf1 scCsL|dkrd}n|dkr*d}nt|jj|||||S(NR"(RhRRRm(R$RRCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRm6 s    cCsL|dkrd}n|dkr*d}nt|jj|||||S(NR"(RhRRRl(R$RRCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRlA s    cCst|jj||||S(N(RRRP(R$RRCRDR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRPN scCst|jj|S(N(RRRN(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRNT scCst|jj|||S(N(RRRR(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRRY scCst|jj|||S(N(RRRQ(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRQ^ scCst|jj|||S(N(RRRW(R$RticmpR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRWf scCst|jj|S(N(RRRS(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRSk scCst|jj||S(N(RRRY(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRYp scCst|jj||S(N(RRRX(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRXu scCst|jj|S(N(RRR](R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR]| scCst|jj|S(N(RRR_(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR_ scCst|jj|S(N(RRR^(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR^ scCs|jj|||dS(N(R7R"(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR" scCs|jj|||dS(N(R7R#(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR# scCst|jj|||S(N(RR7R$(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR$ scCst|jj||S(N(RR7R(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RR7R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs |jj|||||dS(N(R7R)(R$RRR R(R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR) scCs |jj|||||dS(N(R7R*(R$RRR R(R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR* scCs|jj|||dS(N(R7R+(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR+ scCs"t|jj|||||S(N(RR7R,(R$RRR R(R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR, scCst|jj|||S(N(RR7R&(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR& scCst|jjS(N(RR7R%(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR% scCst|jj||S(N(RR7t passthrough(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RR7R-(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR- scCs|jjdS(N(R7R0(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR0 scCst|jj|S(N(RR7R1(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR1 scCs|jj||dS(N(R7R2(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR2 scCs|jj||dS(N(R7R3(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR3 scCst|jj||S(N(RR7R4(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR4 scCs|jjdS(N(RtenableLockdown(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtdisableLockdown(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RRt queryLockdown(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj|dS(N(RR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCst|jjS(N(RRR (R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCst|jj|S(N(RRR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCs|jj|dS(N(RR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCs|jj|dS(N(RR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCst|jjS(N(RRR(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR" scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR' scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR. scCst|jjS(N(RRR(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR3 scCst|jj|S(N(RRR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR8 scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR= scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRD scCst|jjS(N(RRR(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRI scCst|jj|S(N(RRR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRN scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRS scCs|jjdS(s( Authorize once for all polkit actions. N(Rt authorizeAll(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRX sN(RRR RhRR%RRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRLRRPRRRRRRRRRRRRGRIRRrRRRnRtRsRyRRuR{RzRR|RRR;R5R?R>RER@RGRFRKRHRMRLRcReRdRkRfRmRlRPRNRRRQRWRSRYRXR]R_R^R"R#R$RRR)R*R+R,R&R%RR-R0R1R2R3R4RRRR R R R R RRRRRRRRRRRR(((s3/usr/lib/python2.7/site-packages/firewall/client.pyR[ s  #.                                                                                                                       (.t gi.repositoryRRtsysRtdbus.mainloop.glibR t slip.dbusRRtfirewallRtfirewall.core.baseRtfirewall.dbus_utilsRtfirewall.functionsRtfirewall.core.richRR tfirewall.errorsR RRhRR RR tobjectR!RRRRRRRRRRRRR5R8R[(((s3/usr/lib/python2.7/site-packages/firewall/client.pytsF      '=cyKCzVtbmPK[rJJ$site-packages/firewall/dbus_utils.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "command_of_pid", "pid_of_sender", "uid_of_sender", "user_of_uid", "context_of_sender", "command_of_sender", "user_of_sender", "dbus_to_python", "dbus_signature", "dbus_introspection_prepare_properties", "dbus_introspection_add_properties" ] import dbus import pwd import sys from xml.dom import minidom from firewall.core.logger import log PY2 = sys.version < '3' def command_of_pid(pid): """ Get command for pid from /proc """ try: with open("/proc/%d/cmdline" % pid, "r") as f: cmd = f.readlines()[0].replace('\0', " ").strip() except Exception: return None return cmd def pid_of_sender(bus, sender): """ Get pid from sender string using org.freedesktop.DBus.GetConnectionUnixProcessID """ dbus_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(dbus_obj, 'org.freedesktop.DBus') try: pid = int(dbus_iface.GetConnectionUnixProcessID(sender)) except ValueError: return None return pid def uid_of_sender(bus, sender): """ Get user id from sender string using org.freedesktop.DBus.GetConnectionUnixUser """ dbus_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(dbus_obj, 'org.freedesktop.DBus') try: uid = int(dbus_iface.GetConnectionUnixUser(sender)) except ValueError: return None return uid def user_of_uid(uid): """ Get user for uid from pwd """ try: pws = pwd.getpwuid(uid) except Exception: return None return pws[0] def context_of_sender(bus, sender): """ Get SELinux context from sender string using org.freedesktop.DBus.GetConnectionSELinuxSecurityContext """ dbus_obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(dbus_obj, 'org.freedesktop.DBus') try: context = dbus_iface.GetConnectionSELinuxSecurityContext(sender) except Exception: return None return "".join(map(chr, dbus_to_python(context))) def command_of_sender(bus, sender): """ Return command of D-Bus sender """ return command_of_pid(pid_of_sender(bus, sender)) def user_of_sender(bus, sender): return user_of_uid(uid_of_sender(bus, sender)) def dbus_to_python(obj, expected_type=None): if obj is None: python_obj = obj elif isinstance(obj, dbus.Boolean): python_obj = bool(obj) elif isinstance(obj, dbus.String): python_obj = obj.encode('utf-8') if PY2 else str(obj) elif PY2 and isinstance(obj, dbus.UTF8String): # Python3 has no UTF8String python_obj = str(obj) elif isinstance(obj, dbus.ObjectPath): python_obj = str(obj) elif isinstance(obj, dbus.Byte) or \ isinstance(obj, dbus.Int16) or \ isinstance(obj, dbus.Int32) or \ isinstance(obj, dbus.Int64) or \ isinstance(obj, dbus.UInt16) or \ isinstance(obj, dbus.UInt32) or \ isinstance(obj, dbus.UInt64): python_obj = int(obj) elif isinstance(obj, dbus.Double): python_obj = float(obj) elif isinstance(obj, dbus.Array): python_obj = [dbus_to_python(x) for x in obj] elif isinstance(obj, dbus.Struct): python_obj = tuple([dbus_to_python(x) for x in obj]) elif isinstance(obj, dbus.Dictionary): python_obj = {dbus_to_python(k): dbus_to_python(v) for k, v in obj.items()} elif isinstance(obj, bool) or \ isinstance(obj, str) or isinstance(obj, bytes) or \ isinstance(obj, int) or isinstance(obj, float) or \ isinstance(obj, list) or isinstance(obj, tuple) or \ isinstance(obj, dict): python_obj = obj else: raise TypeError("Unhandled %s" % repr(obj)) if expected_type is not None: if (expected_type == bool and not isinstance(python_obj, bool)) or \ (expected_type == str and not isinstance(python_obj, str)) or \ (expected_type == int and not isinstance(python_obj, int)) or \ (expected_type == float and not isinstance(python_obj, float)) or \ (expected_type == list and not isinstance(python_obj, list)) or \ (expected_type == tuple and not isinstance(python_obj, tuple)) or \ (expected_type == dict and not isinstance(python_obj, dict)): raise TypeError("%s is %s, expected %s" % (python_obj, type(python_obj), expected_type)) return python_obj def dbus_signature(obj): if isinstance(obj, dbus.Boolean): return 'b' elif isinstance(obj, dbus.String): return 's' elif isinstance(obj, dbus.ObjectPath): return 'o' elif isinstance(obj, dbus.Byte): return 'y' elif isinstance(obj, dbus.Int16): return 'n' elif isinstance(obj, dbus.Int32): return 'i' elif isinstance(obj, dbus.Int64): return 'x' elif isinstance(obj, dbus.UInt16): return 'q' elif isinstance(obj, dbus.UInt32): return 'u' elif isinstance(obj, dbus.UInt64): return 't' elif isinstance(obj, dbus.Double): return 'd' elif isinstance(obj, dbus.Array): if len(obj.signature) > 1: return 'a(%s)' % obj.signature else: return 'a%s' % obj.signature elif isinstance(obj, dbus.Struct): return '(%s)' % obj.signature elif isinstance(obj, dbus.Dictionary): return 'a{%s}' % obj.signature elif PY2 and isinstance(obj, dbus.UTF8String): return 's' else: raise TypeError("Unhandled %s" % repr(obj)) def dbus_introspection_prepare_properties(obj, interface, access=None): if access is None: access = { } if not hasattr(obj, "_fw_dbus_properties"): setattr(obj, "_fw_dbus_properties", { }) dip = getattr(obj, "_fw_dbus_properties") dip[interface] = { } try: _dict = obj.GetAll(interface) except Exception: _dict = { } for key,value in _dict.items(): dip[interface][key] = { "type": dbus_signature(value) } if key in access: dip[interface][key]["access"] = access[key] else: dip[interface][key]["access"] = "read" def dbus_introspection_add_properties(obj, data, interface): doc = minidom.parseString(data) if hasattr(obj, "_fw_dbus_properties"): for node in doc.getElementsByTagName("interface"): if node.hasAttribute("name") and \ node.getAttribute("name") == interface: dip = { } if getattr(obj, "_fw_dbus_properties"): dip = getattr(obj, "_fw_dbus_properties") if interface in dip: for key,value in dip[interface].items(): prop = doc.createElement("property") prop.setAttribute("name", key) prop.setAttribute("type", value["type"]) prop.setAttribute("access", value["access"]) node.appendChild(prop) log.debug10(doc.toxml()) new_data = doc.toxml() doc.unlink() return new_data PK[CIR%$%$(site-packages/firewall/core/ebtables.pycnu[ c`c@sdgZddlZddlmZddlmZddlmZm Z m Z ddl m Z ddl mZddlmZmZddlZid gd 6d d d gd6dd dgd6ZiZiZiZxejD]Zgees0      PK['^ $site-packages/firewall/core/icmp.pycnu[ c`c@sddddgZi"dd6dd6dd6d d 6d d 6d d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d/d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6ZidFdG6dHd 6dIdJ6dKd6dLdM6dd76d d96d%dN6dOdP6dQdR6dSd06dSd16dTd6dTd6dUd56dVd36dWdX6dWdY6dZd[6dZd\6d]d^6Zd_Zd`ZdaZdbZdcS(dt ICMP_TYPESt ICMPV6_TYPEStcheck_icmp_typetcheck_icmpv6_types0/0s echo-replytpongs3/0snetwork-unreachables3/1shost-unreachables3/2sprotocol-unreachables3/3sport-unreachables3/4sfragmentation-neededs3/5ssource-route-faileds3/6snetwork-unknowns3/7s host-unknowns3/9snetwork-prohibiteds3/10shost-prohibiteds3/11sTOS-network-unreachables3/12sTOS-host-unreachables3/13scommunication-prohibiteds3/14shost-precedence-violations3/15sprecedence-cutoffs4/0s source-quenchs5/0snetwork-redirects5/1s host-redirects5/2sTOS-network-redirects5/3sTOS-host-redirects8/0s echo-requesttpings9/0srouter-advertisements10/0srouter-solicitations11/0sttl-zero-during-transits11/1sttl-zero-during-reassemblys12/0s ip-header-bads12/1srequired-option-missings13/0stimestamp-requests14/0stimestamp-replys17/0saddress-mask-requests18/0saddress-mask-replys1/0sno-routes1/1s1/3saddress-unreachables1/4s2/0spacket-too-bigs bad-headers4/1sunknown-header-types4/2sunknown-options128/0s129/0s133/0s134/0s135/0sneighbour-solicitationsneigbour-solicitations136/0sneighbour-advertisementsneigbour-advertisements137/0tredirectcCs|tkrtStS(N(RtTruetFalse(t_name((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pytcheck_icmp_nameVs cCs|tjkrtStS(N(RtvaluesRR(t_type((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pyR[scCs|tkrtStS(N(RRR(R ((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pytcheck_icmpv6_name`s cCs|tjkrtStS(N(RR RR(R ((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pyResN(t__all__RRR RR R(((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pyts|      PK[S>R(*(*-site-packages/firewall/core/fw_transaction.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """Transaction classes for firewalld""" __all__ = [ "FirewallTransaction", "FirewallZoneTransaction" ] from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError from firewall.fw_types import LastUpdatedOrderedDict class SimpleFirewallTransaction(object): """Base class for FirewallTransaction and FirewallZoneTransaction""" def __init__(self, fw): self.fw = fw self.rules = { } # [ ( backend.name, [ rule,.. ] ),.. ] self.pre_funcs = [ ] # [ (func, args),.. ] self.post_funcs = [ ] # [ (func, args),.. ] self.fail_funcs = [ ] # [ (func, args),.. ] def clear(self): self.rules.clear() del self.pre_funcs[:] del self.post_funcs[:] del self.fail_funcs[:] def add_rule(self, backend, rule): self.rules.setdefault(backend.name, [ ]).append(rule) def add_rules(self, backend, rules): for rule in rules: self.add_rule(backend, rule) def query_rule(self, backend, rule): return backend.name in self.rules and rule in self.rules[backend.name] def remove_rule(self, backend, rule): if backend.name in self.rules and rule in self.rules[backend.name]: self.rules[backend.name].remove(rule) def add_pre(self, func, *args): self.pre_funcs.append((func, args)) def add_post(self, func, *args): self.post_funcs.append((func, args)) def add_fail(self, func, *args): self.fail_funcs.append((func, args)) def prepare(self, enable, rules=None, modules=None): log.debug4("%s.prepare(%s, %s)" % (type(self), enable, "...")) if rules is None: rules = { } if modules is None: modules = [ ] if not enable: # reverse rule order for cleanup for backend_name in self.rules: for rule in reversed(self.rules[backend_name]): rules.setdefault(backend_name, [ ]).append( self.fw.get_backend_by_name(backend_name).reverse_rule(rule)) else: for backend_name in self.rules: rules.setdefault(backend_name, [ ]).extend(self.rules[backend_name]) return rules, modules def execute(self, enable): log.debug4("%s.execute(%s)" % (type(self), enable)) rules, modules = self.prepare(enable) # pre self.pre() # stage 1: apply rules error = False errorMsg = "" done = [ ] for backend_name in rules: try: self.fw.rules(backend_name, rules[backend_name]) except Exception as msg: error = True errorMsg = msg log.error(msg) else: done.append(backend_name) # stage 2: load modules if not error: module_return = self.fw.handle_modules(modules, enable) if module_return: # Debug log about issues loading modules, but don't error. The # modules may be builtin or CONFIG_MODULES=n, in which case # modprobe will fail. Or we may be running inside a container # that doesn't have sufficient privileges. Unfortunately there # is no way for us to know. (status, msg) = module_return if status: log.debug1(msg) # error case: revert rules if error: undo_rules = { } for backend_name in done: undo_rules[backend_name] = [ ] for rule in reversed(rules[backend_name]): undo_rules[backend_name].append( self.fw.get_backend_by_name(backend_name).reverse_rule(rule)) for backend_name in undo_rules: try: self.fw.rules(backend_name, undo_rules[backend_name]) except Exception as msg: log.error(msg) # call failure functions for (func, args) in self.fail_funcs: try: func(*args) except Exception as msg: log.error("Calling fail func %s(%s) failed: %s" % \ (func, args, msg)) raise FirewallError(errors.COMMAND_FAILED, errorMsg) # post self.post() def pre(self): log.debug4("%s.pre()" % type(self)) for (func, args) in self.pre_funcs: try: func(*args) except Exception as msg: log.error("Calling pre func %s(%s) failed: %s" % \ (func, args, msg)) def post(self): log.debug4("%s.post()" % type(self)) for (func, args) in self.post_funcs: try: func(*args) except Exception as msg: log.error("Calling post func %s(%s) failed: %s" % \ (func, args, msg)) # class FirewallTransaction class FirewallTransaction(SimpleFirewallTransaction): """General FirewallTransaction, contains also zone transactions""" def __init__(self, fw): super(FirewallTransaction, self).__init__(fw) self.zone_transactions = LastUpdatedOrderedDict() # { zone: transaction, .. } def clear(self): super(FirewallTransaction, self).clear() self.zone_transactions.clear() def zone_transaction(self, zone): if zone not in self.zone_transactions: self.zone_transactions[zone] = FirewallZoneTransaction( self.fw, zone, self) return self.zone_transactions[zone] def prepare(self, enable, rules=None, modules=None): log.debug4("%s.prepare(%s, %s)" % (type(self), enable, "...")) rules, modules = super(FirewallTransaction, self).prepare( enable, rules, modules) for zone in self.zone_transactions: try: self.zone_transactions[zone].prepare(enable, rules) for module in self.zone_transactions[zone].modules: if module not in modules: modules.append(module) except FirewallError as msg: log.error("Failed to prepare transaction rules for zone '%s'", str(msg)) return rules, modules def pre(self): log.debug4("%s.pre()" % type(self)) super(FirewallTransaction, self).pre() for zone in self.zone_transactions: self.zone_transactions[zone].pre() def post(self): log.debug4("%s.post()" % type(self)) super(FirewallTransaction, self).post() for zone in self.zone_transactions: self.zone_transactions[zone].post() # class FirewallZoneTransaction class FirewallZoneTransaction(SimpleFirewallTransaction): """Zone transaction with additional chain and module interface""" def __init__(self, fw, zone, fw_transaction=None): super(FirewallZoneTransaction, self).__init__(fw) self.zone = zone self.fw_transaction = fw_transaction self.chains = [ ] # [ (table, chain),.. ] self.modules = [ ] # [ module,.. ] def clear(self): # calling clear on a zone_transaction that was spawned from a # FirewallTransaction needs to clear the fw_transaction and all the # other zones otherwise we end up with a partially cleared transaction. if self.fw_transaction: super(FirewallTransaction, self.fw_transaction).clear() for zone in self.fw_transaction.zone_transactions.keys(): super(FirewallZoneTransaction, self.fw_transaction.zone_transactions[zone]).clear() del self.fw_transaction.zone_transactions[zone].chains[:] del self.fw_transaction.zone_transactions[zone].modules[:] else: super(FirewallZoneTransaction, self).clear() del self.chains[:] del self.modules[:] def prepare(self, enable, rules=None, modules=None): log.debug4("%s.prepare(%s, %s)" % (type(self), enable, "...")) rules, modules = super(FirewallZoneTransaction, self).prepare( enable, rules, modules) for module in self.modules: if module not in modules: modules.append(module) return rules, modules def execute(self, enable): # calling execute on a zone_transaction that was spawned from a # FirewallTransaction should execute the FirewallTransaction as it may # have prerequisite rules if self.fw_transaction: self.fw_transaction.execute(enable) else: super(FirewallZoneTransaction, self).execute(enable) def add_chain(self, table, chain): table_chain = (table, chain) if table_chain not in self.chains: self.fw.zone.gen_chain_rules(self.zone, True, [table_chain], self) self.chains.append(table_chain) def remove_chain(self, table, chain): table_chain = (table, chain) if table_chain in self.chains: self.chains.remove(table_chain) def add_chains(self, chains): for table_chain in chains: if table_chain not in self.chains: self.add_chain(table_chain[0], table_chain[1]) def remove_chains(self, chains): for table_chain in chains: if table_chain in self.chains: self.chains.remove(table_chain) def add_module(self, module): if module not in self.modules: self.modules.append(module) def remove_module(self, module): if module in self.modules: self.modules.remove(module) def add_modules(self, modules): for module in modules: self.add_module(module) def remove_modules(self, modules): for module in modules: self.remove_module(module) PK[~ &site-packages/firewall/core/watcher.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2012-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "Watcher" ] from gi.repository import Gio, GLib class Watcher(object): def __init__(self, callback, timeout): self._callback = callback self._timeout = timeout self._monitors = { } self._timeouts = { } self._blocked = [ ] def add_watch_dir(self, directory): gfile = Gio.File.new_for_path(directory) self._monitors[directory] = gfile.monitor_directory(\ Gio.FileMonitorFlags.NONE, None) self._monitors[directory].connect("changed", self._file_changed_cb) def add_watch_file(self, filename): gfile = Gio.File.new_for_path(filename) self._monitors[filename] = gfile.monitor_file(\ Gio.FileMonitorFlags.NONE, None) self._monitors[filename].connect("changed", self._file_changed_cb) def get_watches(self): return self._monitors.keys() def has_watch(self, filename): return filename in self._monitors def remove_watch(self, filename): del self._monitors[filename] def block_source(self, filename): if filename not in self._blocked: self._blocked.append(filename) def unblock_source(self, filename): if filename in self._blocked: self._blocked.remove(filename) def clear_timeouts(self): for filename in list(self._timeouts.keys()): GLib.source_remove(self._timeouts[filename]) del self._timeouts[filename] def _call_callback(self, filename): if filename not in self._blocked: self._callback(filename) del self._timeouts[filename] def _file_changed_cb(self, monitor, gio_file, gio_other_file, event): filename = gio_file.get_parse_name() if filename in self._blocked: if filename in self._timeouts: GLib.source_remove(self._timeouts[filename]) del self._timeouts[filename] return if event == Gio.FileMonitorEvent.CHANGED or \ event == Gio.FileMonitorEvent.CREATED or \ event == Gio.FileMonitorEvent.DELETED or \ event == Gio.FileMonitorEvent.ATTRIBUTE_CHANGED: if filename in self._timeouts: GLib.source_remove(self._timeouts[filename]) del self._timeouts[filename] self._timeouts[filename] = GLib.timeout_add_seconds(\ self._timeout, self._call_callback, filename) PK[Er##'site-packages/firewall/core/fw_ipset.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2015-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """ipset backend""" __all__ = [ "FirewallIPSet" ] from firewall.core.logger import log from firewall.core.ipset import remove_default_create_options as rm_def_cr_opts from firewall.core.io.ipset import IPSet from firewall import errors from firewall.errors import FirewallError class FirewallIPSet(object): def __init__(self, fw): self._fw = fw self._ipsets = { } def __repr__(self): return '%s(%r)' % (self.__class__, self._ipsets) # ipsets def cleanup(self): self._ipsets.clear() def check_ipset(self, name): if name not in self.get_ipsets(): raise FirewallError(errors.INVALID_IPSET, name) def query_ipset(self, name): return name in self.get_ipsets() def get_ipsets(self): return sorted(self._ipsets.keys()) def has_ipsets(self): return len(self._ipsets) > 0 def get_ipset(self, name, applied=False): self.check_ipset(name) obj = self._ipsets[name] if applied: self.check_applied_obj(obj) return obj def _error2warning(self, f, name, *args): # transform errors into warnings try: f(name, *args) except FirewallError as error: msg = str(error) log.warning("%s: %s" % (name, msg)) def backends(self): backends = [] if self._fw.nftables_enabled: backends.append(self._fw.nftables_backend) if self._fw.ipset_enabled: backends.append(self._fw.ipset_backend) return backends def add_ipset(self, obj): if obj.type not in self._fw.ipset_supported_types: raise FirewallError(errors.INVALID_TYPE, "'%s' is not supported by ipset." % obj.type) self._ipsets[obj.name] = obj def remove_ipset(self, name, keep=False): obj = self._ipsets[name] if obj.applied and not keep: try: for backend in self.backends(): backend.set_destroy(name) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: log.debug1("Keeping ipset '%s' because of timeout option", name) del self._ipsets[name] def apply_ipsets(self): for name in self.get_ipsets(): obj = self._ipsets[name] obj.applied = False log.debug1("Applying ipset '%s'" % name) for backend in self.backends(): if backend.name == "ipset": active = backend.set_get_active_terse() if name in active and ("timeout" not in obj.options or \ obj.options["timeout"] == "0" or \ obj.type != active[name][0] or \ rm_def_cr_opts(obj.options) != \ active[name][1]): try: backend.set_destroy(name) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) if self._fw.individual_calls() \ or backend.name == "nftables": try: backend.set_create(obj.name, obj.type, obj.options) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: obj.applied = True if "timeout" in obj.options and \ obj.options["timeout"] != "0": # no entries visible for ipsets with timeout continue for entry in obj.entries: try: backend.set_add(obj.name, entry) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: try: backend.set_restore(obj.name, obj.type, obj.entries, obj.options, None) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: obj.applied = True # TYPE def get_type(self, name): return self.get_ipset(name, applied=True).type # DIMENSION def get_dimension(self, name): return len(self.get_ipset(name, applied=True).type.split(",")) def check_applied(self, name): obj = self.get_ipset(name) self.check_applied_obj(obj) def check_applied_obj(self, obj): if not obj.applied: raise FirewallError( errors.NOT_APPLIED, obj.name) # OPTIONS def get_family(self, name): obj = self.get_ipset(name, applied=True) if "family" in obj.options: if obj.options["family"] == "inet6": return "ipv6" return "ipv4" # ENTRIES def __entry_id(self, entry): return entry def __entry(self, enable, name, entry): pass def add_entry(self, name, entry): obj = self.get_ipset(name, applied=True) IPSet.check_entry(entry, obj.options, obj.type) if entry in obj.entries: raise FirewallError(errors.ALREADY_ENABLED, "'%s' already is in '%s'" % (entry, name)) try: for backend in self.backends(): backend.set_add(obj.name, entry) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: if "timeout" not in obj.options or obj.options["timeout"] == "0" \ and entry not in obj.entries: # no entries visible for ipsets with timeout obj.entries.append(entry) def remove_entry(self, name, entry): obj = self.get_ipset(name, applied=True) # no entry check for removal if entry not in obj.entries: raise FirewallError(errors.NOT_ENABLED, "'%s' not in '%s'" % (entry, name)) try: for backend in self.backends(): backend.set_delete(obj.name, entry) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: if "timeout" not in obj.options or obj.options["timeout"] == "0" \ and entry not in obj.entries: # no entries visible for ipsets with timeout obj.entries.remove(entry) def query_entry(self, name, entry): obj = self.get_ipset(name, applied=True) if "timeout" in obj.options and obj.options["timeout"] != "0": # no entries visible for ipsets with timeout raise FirewallError(errors.IPSET_WITH_TIMEOUT, name) return entry in obj.entries def get_entries(self, name): obj = self.get_ipset(name, applied=True) return obj.entries def set_entries(self, name, entries): obj = self.get_ipset(name, applied=True) for entry in entries: IPSet.check_entry(entry, obj.options, obj.type) if "timeout" not in obj.options or obj.options["timeout"] == "0": # no entries visible for ipsets with timeout obj.entries = entries try: for backend in self.backends(): backend.set_flush(obj.name) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: obj.applied = True try: for backend in self.backends(): if self._fw.individual_calls() \ or backend.name == "nftables": for entry in obj.entries: backend.set_add(obj.name, entry) else: backend.set_restore(obj.name, obj.type, obj.entries, obj.options, None) except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) else: obj.applied = True return PK[4Hzz)site-packages/firewall/core/fw_config.pyonu[ c`c@sdgZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZddlmZmZmZddlmZmZmZdd lmZmZmZdd lmZdd lmZde fd YZ!dS( tFirewallConfigiN(tconfig(tlog(tIcmpTypeticmptype_readerticmptype_writer(tServicetservice_readertservice_writer(tZonet zone_readert zone_writer(tIPSett ipset_readert ipset_writer(tHelpert helper_readert helper_writer(terrors(t FirewallErrorcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRRS(QcCs||_|jdS(N(t_fwt_FirewallConfig__init_vars(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt__init__'s cCs\d|j|j|j|j|j|j|j|j|j|j |j |j |j |j fS(Ns6%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)(t __class__t_ipsetst _icmptypest _servicest_zonest_helperst_builtin_ipsetst_builtin_icmptypest_builtin_servicest_builtin_zonest_builtin_helperst_firewalld_conft _policiest_direct(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt__repr__+s cCsyi|_i|_i|_i|_i|_i|_i|_i|_i|_i|_ d|_ d|_ d|_ dS(N(RRRRRRR R!R"R#tNoneR$R%R&(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt __init_vars4s            cCsx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=qQWx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=q=Wx8t|j jD]!}|j |j|j |=qxWx8t|j jD]!}|j |j|j |=qWx8t|j jD]!}|j |j|j |=qWx8t|j jD]!}|j |j|j |=q)W|j rv|j j|` d|_ n|jr|jj|`d|_n|jr|jj|`d|_n|jdS(N(tlistRtkeystcleanupRR RR!RR"RR#RR$R(R%R&R(Rtx((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyR,CsV         cCs|jjjS(N(Rtpoliciestquery_lockdown(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytlockdown_enabledzscCs|jjj||S(N(RR.t access_check(Rtkeytvalue((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyR1}scCs ||_dS(N(R$(Rtconf((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytset_firewalld_confscCs|jS(N(R$(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytget_firewalld_confscCs6tjjtjs%|jjn |jjdS(N(tostpathtexistsRtFIREWALLD_CONFR$tcleartread(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytupdate_firewalld_confscCs ||_dS(N(R%(RR.((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt set_policiesscCs|jS(N(R%(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt get_policiesscCs<tjjtjs(|jjjn|jjjdS(N( R7R8R9RtLOCKDOWN_WHITELISTR%tlockdown_whitelistR,R<(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytupdate_lockdown_whitelistscCs ||_dS(N(R&(Rtdirect((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt set_directscCs|jS(N(R&(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt get_directscCs6tjjtjs%|jjn |jjdS(N(R7R8R9RtFIREWALLD_DIRECTR&R,R<(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt update_directscCs2ttt|jjt|jjS(N(tsortedtsetR*RR+R(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt get_ipsetsscCs0|jr||j|jR?RBRDRERGRJRNRPRSRUR[R`RjRRRoRpRrRqRsRtRvRxRyR{R|R}RwRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyR&s   7                  E            E            E             M            E    ("t__all__RVR7tos.pathRltfirewallRtfirewall.core.loggerRtfirewall.core.io.icmptypeRRRtfirewall.core.io.serviceRRRtfirewall.core.io.zoneR R R tfirewall.core.io.ipsetR R Rtfirewall.core.io.helperRRRRtfirewall.errorsRtobjectR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyts     PK[ө= (site-packages/firewall/core/__init__.pycnu[ c`c@sdS(N((((s:/usr/lib/python2.7/site-packages/firewall/core/__init__.pytsPK[zz"site-packages/firewall/core/fw.pyonu[ c`c@sdgZddlZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z ddl m Z ddl mZdd l mZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-m.Z.ddl/m0Z0ddl1m2Z2ddlm3Z3ddl4m5Z5de6fdYZ7dS(tFirewalliN(tconfig(t functions(t ipXtables(tebtables(tnftables(tipset(tmodules(tFirewallIcmpType(tFirewallService(t FirewallZone(tFirewallDirect(tFirewallConfig(tFirewallPolicies(t FirewallIPSet(tFirewallTransaction(tFirewallHelper(tlog(tfirewalld_conf(tDirect(tservice_reader(ticmptype_reader(t zone_readertZone(t ipset_reader(t helper_reader(terrors(t FirewallErrorcBseZdZdZdZdZdZdZeedZ dZ edZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZedZedZedZedZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)ed&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4RS(1cCs@ttj|_tj||_t|_g|_ tj ||_ t|_ g|_ tj|_t|_tj|_t|_g|_tj||_t|_tj|_t||_t||_t||_t ||_!t"||_t#|_$t%||_t&||_'|j(dS(N()RRtFIREWALLD_CONFt_firewalld_confRt ip4tablestip4tables_backendtTruetip4tables_enabledtip4tables_supported_icmp_typest ip6tablestip6tables_backendtip6tables_enabledtip6tables_supported_icmp_typesRtebtables_backendtebtables_enabledRt ipset_backendt ipset_enabledtipset_supported_typesRtnftables_backendtnftables_enabledRtmodules_backendRticmptypeR tserviceR tzoneR tdirectR R tpoliciesRRthelpert_Firewall__init_vars(tself((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt__init__?s0         cCshd|j|j|j|j|j|j|j|j|j|j |j |j |j |j |j|jfS(Ns>%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)(t __class__R!R%R(t_statet_panict _default_zonet_module_refcountt_markst _min_marktcleanup_on_exittipv6_rpfilter_enabledR*t_individual_callst _log_deniedt_automatic_helpers(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt__repr__]scCsd|_t|_d|_i|_g|_tj|_tj |_ tj |_ tj |_tj|_tj|_tj|_d|_tj|_dS(NtINITti(R9tFalseR:R;R<R=RtFALLBACK_MINIMAL_MARKR>tFALLBACK_CLEANUP_ON_EXITR?tFALLBACK_IPV6_RPFILTERR@tFALLBACK_INDIVIDUAL_CALLSRAtFALLBACK_LOG_DENIEDRBtFALLBACK_AUTOMATIC_HELPERSRCtFALLBACK_FIREWALL_BACKENDt_firewall_backendtnf_conntrack_helper_settingtFALLBACK_ALLOW_ZONE_DRIFTINGt_allow_zone_drifting(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt __init_varsfs             cCs|jS(N(RA(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytindividual_callswscCs|jr=d|jdjkr=tjdt|_n|jrzd|jdjkrztjdt|_n|jrd|jdjkrtjdt|_n|j r|j r|j rtj dt j d ndS( Ntfiltertipv4s-iptables not usable, disabling IPv4 firewall.tipv6s.ip6tables not usable, disabling IPv6 firewall.tebs8ebtables not usable, disabling ethernet bridge firewall.sNo IPv4 and IPv6 firewall.i( R!tget_backend_by_ipvtget_available_tablesRtwarningRGR%R(R-tfataltsystexit(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt _check_tableszs            cCsy|jjWn0tk rCtjdt|_g|_nX|jj|_|j j |j j s|j j rtjdqtjdt|_ n|j r|j j|_n g|_|jj |jj s|jj rtjdqtjdt|_n|jr7|jj|_n g|_|jj |jj s|jj rutjdqtjdt|_n|jr|j r|jj rtjdndS( Ns4ipset not usable, disabling ipset usage in firewall.sFiptables-restore is missing, using individual calls for IPv4 firewall.sCiptables-restore and iptables are missing, disabling IPv4 firewall.sGip6tables-restore is missing, using individual calls for IPv6 firewall.sEip6tables-restore and ip6tables are missing, disabling IPv6 firewall.sHebtables-restore is missing, using individual calls for bridge firewall.sEebtables-restore and ebtables are missing, disabling bridge firewall.sSebtables-restore is not supporting the --noflush option, will therefore not be used(R)tset_listt ValueErrorRR[RGR*R+tset_supported_typesRt fill_existstrestore_command_existstcommand_existsR!tsupported_icmp_typesR"R$R%R&R'R(RAtrestore_noflush_optiontdebug1(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt _start_checksD                        cCsw tj}tjdtjy|jjWn-tk r\}tj|tjdnX|jj dr|jj d}n|jj drt |jj d|_ n|jj dr|jj d}|dk r|j d<krt|_ntjd|jn|jj d r|jj d }|dk r|j d=krtjd y|jjWqtk rqXqn|jj d r|jj d }|dk r|j d>krt|_n|j d?krt|_qqn|jrtjdn tjd|jj dr|jj d}|dk r|j d@krtjdt|_qn|jj dr|jj d}|dks|j dkrd|_q|j |_tjd|jn|jj dr|jj d}|dk r|j dAkrId|_n-|j dBkrgd |_n|j |_tjd|jqn|jj dr|jj d}|j dCkrt|_nt|_tjdtjd|jn|jjtj|j|j|j|jtjdy|jjjWn]tk r}|jj rtj!d|jjj"|qtjd|jjj"|nX|jj#tj|j|j$tj%d|j$tj&d|j$tj'd|j$tj(dt)|j*j+dkrGtj!dn|j$tj,d |j$tj-d |j$tj.d!|j$tj/d!t)|j0j1dkrtj!d"n|j$tj2d#|j$tj3d#t)|j4j5dkrtj6d$t7j8d%nt}xEd&d'd(gD]4}||j4j5kr2tj6d)|t}q2q2W|rt7j8d%n||j4j5krd*|j4j5krd*}n$d+|j4j5krd+}nd&}tj!d,|||}ntjd-|t9tj:} t;j<j=tj:rxtjd.tj:y| jWqxtk rt}tj!d/tj:|qxXn|j>j?| |jj@tj| |jAd0gt\} }| dkrtjd1|n|jd2krtBjC|jd kntBjD|_E|jFtjGdkr>tHjH} ntI|} |jJd3| |rf|s~|jKr|jLjMr| jNt| jOn|r|rtjd4|jPjQn|jRd3| | jNt| jO|jKr |jLjMr tjd5|jLjSntjd6|jTd3| tjd7|j4jUd3| |jV||_W|j4jXd|jWd3| | jNt| jO|j>jYr: tjd8|j>jZ| y| jNt| jOWq: tk r# } t| j[d9| j\r | j\nd:q: tk r6 q: Xn~ tjGd%krs tHjH}tj]d;|| ndS(DNs"Loading firewalld config file '%s's0Using fallback firewalld configuration settings.t DefaultZonet MinimalMarkt CleanupOnExittnotfalsesCleanupOnExit is set to '%s'tLockdowntyesttruesLockdown is enabledt IPv6_rpfiltersIPv6 rpfilter is enabledsIPV6 rpfilter is disabledtIndividualCallssIndividualCalls is enabledt LogDeniedtoffsLogDenied is set to '%s'tAutomaticHelperssAutomaticHelpers is set to '%s'tAllowZoneDriftingsAllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.s AllowZoneDrifting is set to '%s'sLoading lockdown whitelists*Failed to load lockdown whitelist '%s': %sRR/isNo icmptypes found.R4R0sNo services found.R1sNo zones found.itblocktdropttrustedsZone '%s' is not available.tpublictexternals+Default zone '%s' is not valid. Using '%s'.sUsing default zone '%s'sLoading direct rules file '%s's)Failed to load direct rules file '%s': %st nf_conntracks&Failed to load nf_conntrack module: %stsystemtuse_transactionsUnloading firewall modulessApplying ipsetssApplying default rule setsApplying used zoness2Applying direct chains rules and passthrough ruless Direct: %sRFs%Flushing and applying took %f seconds(RmRn(syesRq(RmRn(syesRq(syesRq(RmRn(syesRq(RmRn(^Rt FALLBACK_ZONERRhRRtreadt ExceptionR[tgettintR>tNonetlowerRGR?R3tenable_lockdownRR@R RARBRCRRtset_firewalld_conftcopytdeepcopyt_select_firewall_backendRORitlockdown_whitelisttquery_lockdownterrortfilenamet set_policiest_loadertFIREWALLD_IPSETStETC_FIREWALLD_IPSETStFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPEStlenR/t get_icmptypestFIREWALLD_HELPERStETC_FIREWALLD_HELPERStFIREWALLD_SERVICEStETC_FIREWALLD_SERVICESR0t get_servicestFIREWALLD_ZONEStETC_FIREWALLD_ZONESR1t get_zonesR\R]R^RtFIREWALLD_DIRECTtostpathtexistsR2tset_permanent_configt set_directthandle_modulesRtset_nf_conntrack_helper_settingtget_nf_conntrack_helper_settingRPR_tgetDebugLogLevelttimeRtflushR*Rt has_ipsetstexecutetclearR.tunload_firewall_modulestapply_default_tablest apply_ipsetstapply_default_rulest apply_zonest check_zoneR;tchange_default_zonethas_configurationt apply_directtcodetmsgtdebug2(R6treloadtcomplete_reloadt default_zoneRtvalueRtzR1tobjtstatusttm1t transactiontettm2((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt_startsR                                                      +   cCsUy|jWn*tk r:d|_|jdnXd|_|jddS(NtFAILEDtACCEPTtRUNNING(RRR9t set_policy(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytstarts    c Cstjj|sdS|r|jtjr}|dkr}t}tjj||_|j |j||_t |_ qt }nx[t tj |D]D}|jds|jtjr|dkrtjjd||fr|jd||f|dtqqnd||f}tjd||yP|dkrAt||}|j|jjkr|jj|j}tjd||j|j|j|jj|jn!|jjtjrt|_ ny|jj|Wn3tk r$} tjd|jt| fnX|jjtj|nE|d krt||}|j|j j!kr|j j"|j}tjd||j|j|j|j j#|jn!|jjtjrt|_ n|j j$||jj$tj|nx|dkrt%||d |}|rzdtjj|tjj|d d !f|_|j |jntj|} |j|j&j'kr#|j&j(|j}|j&j)|j|j*rtjd ||j|||j+|qMtjd||j|j|jn*|jjtjrMt|_ t| _ n|jj,| |rtjd ||j|||j+|q|j&j,|n|dkrt-||}|j|j.j/kr"|j.j0|j}tjd||j|j|j|j.j1|jn!|jjtjrCt|_ ny|j.j2|Wn3tk r} tj3d|jt| fnX|jj2tj|n|dkrvt4||}|j|j5j6kr)|j5j7|j}tjd||j|j|j|j5j8|jn!|jjtjrJt|_ n|j5j9||jj9tj|ntj:d|Wqtk r} tj;d||| qt<k rtj;d||tj=qXqW|r|j*r|j|j&j'kr|j&j(|j}tjd||j|j|jy|j&j)|jWnt<k rlnX|jj>|jn|j&j,|ndS(NR1s.xmls%s/%stcombinesLoading %s file '%s'R/s Overloads %s '%s' ('%s/%s')s%s: %s, ignoring for run-time.R0t no_check_nameiis Combining %s '%s' ('%s/%s')RR4sUnknown reader type %ssFailed to load %s file '%s': %ssFailed to load %s file '%s':s0 Overloading and deactivating %s '%s' ('%s/%s')(?RRtisdirt startswithRt ETC_FIREWALLDRtbasenametnamet check_nameRGtdefaulttsortedtlistdirtendswithRR RRhRR/Rt get_icmptypeRtremove_icmptypet add_icmptypeRtinfo1tstrRRRR0Rt get_servicetremove_servicet add_serviceRR1Rtget_zonet remove_zonetcombinedRtadd_zoneRRt get_ipsetst get_ipsett remove_ipsett add_ipsetR[RR4t get_helperst get_helpert remove_helpert add_helperR\RRt exceptiont forget_zone( R6Rt reader_typeRt combined_zoneRRRtorig_objRt config_objR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs                                                cCs|jj|jj|jj|jj|jj|jj|jj|jj|j j|j dS(N( R/tcleanupR0R1RR4RR2R3RR5(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRls         cCs>|jr0|j|jd|jjn|jdS(NR(R?RRR.RR(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytstopxs    cCs=|j}x||jkr(|d7}q W|jj||S(Ni(R>R=tappend(R6ti((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytnew_marks  cCs|jj|dS(N(R=tremove(R6tmark((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytdel_marksc Cs"d}d}x t|D]\}}|rF|jj|\}}n4|j|dkrbd}n|jj|\}}|dkr|d7}||7}qn|r|jj|d|j|cd7|j|jn|jrZ|j|jn|jrv|j|jn|S(N( R-RR,R!RR%R$R(R'(R6tbackends((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytenabled_backendss    cCszg}|jr"|j|jn|jr>|j|jn|jrZ|j|jn|jrv|j|jn|S(N( R!RRR%R$R(R'R-R,(R6R ((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs    cCsn|dkrt|}n|}x*|jD]}|j||jq.W|dkrj|jtndS(N(RRR t add_rulestbuild_default_tablesRR (R6RRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs  cCs3|dkrt|}n|}x6|jD](}|j|j}|j||q.W|jdr|jd}|jrd|j kr|j t |j |j |j}|j||y|j t Wn#tk r}tjd|nX|j qn|dkr/|j t ndS(NRWtraws+Applying rules for ipv6_rpfilter failed: %s(RRR tbuild_default_rulesRBRR RYR@RZRR Rtbuild_rpfilter_rulesRRR[(R6RRRtrulest ipv6_backendR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs*     cCs|dkrt|}n|}tjdx0|jD]"}|j}|j||q;W|dkr}|jtndS(NsFlushing rule set( RRRRhRtbuild_flush_rulesRRR (R6RRRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR+s    cCs|dkrt|}n|}tjd|x3|jD]%}|j|}|j||q>W|dkr|jtndS(NsSetting policy to '%s'( RRRRhR tbuild_set_policy_rulesRRR (R6tpolicyRRRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR:s  cCs^|s dS|j|}|s8ttjd|n|j|sKdS|j||jS(NRFs'%s' is not a valid backend(RRRRR tset_ruleRB(R6t backend_nametruleR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRKs c Cs\ttd|}|j|}|sCttjd|n|j|sVdS|js|j s|dkrE|j j rExt |D]\}}y|j ||jWqtk r<}tjtjtj|xLt|| D]:}y |j |j||jWqtk r.qXqW|qXqWtS|j||jSdS(Ns'%s' is not a valid backendRFR(tlistRURRRRRR RARdR'RgRRRBRRRht tracebackt format_excRtreversedt reverse_ruleR t set_rules(R6RRt_rulesRRRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRYs0      cCs|jrttjndS(N(R:RRt PANIC_MODE(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_paniczs cCsV|}| s|dkr(|j}n||jjkrRttj|n|S(NRF(tget_default_zoneR1RRRt INVALID_ZONE(R6R1t_zone((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR~s cCs(tj|s$ttj|ndS(N(RtcheckInterfaceRRtINVALID_INTERFACE(R6t interface((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytcheck_interfacescCs|jj|dS(N(R0t check_service(R6R0((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR+scCs(tj|s$ttj|ndS(N(Rt check_portRRt INVALID_PORT(R6tport((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR,scCsA|sttjn|dkr=ttjd|ndS(Nttcptudptsctptdccps''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}(R/R0R1R2(RRtMISSING_PROTOCOLtINVALID_PROTOCOL(R6tprotocol((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_tcpudps   cCs(tj|s$ttj|ndS(N(RtcheckIPRRt INVALID_ADDR(R6tip((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytcheck_ipscCs||dkr3tj|sxttj|qxnE|dkrftj|sxttj|qxnttjddS(NRVRWs'%s' not in {'ipv4'|'ipv6'}(Rt checkIPnMaskRRR8t checkIP6nMaskR(R6Rtsource((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_addresss   cCs|jj|dS(N(R/tcheck_icmptype(R6ticmp((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR?scCs]t|ts.td|t|fnt|dkrYttjd|ndS(Ns%s is %s, expected intis#timeout '%d' is not positive number(t isinstanceRt TypeErrorttypeRRt INVALID_VALUE(R6ttimeout((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_timeouts  c Cs9|j}i}x1|jjD] }|jj|d||R?RFRRXRPR\R]R^RdReRgR$Rk(((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR>sd     7      $    !         K       (8t__all__tos.pathRR]RRRtfirewallRRt firewall.coreRRRRRtfirewall.core.fw_icmptypeRtfirewall.core.fw_serviceR tfirewall.core.fw_zoneR tfirewall.core.fw_directR tfirewall.core.fw_configR tfirewall.core.fw_policiesR tfirewall.core.fw_ipsetRtfirewall.core.fw_transactionRtfirewall.core.fw_helperRtfirewall.core.loggerRtfirewall.core.io.firewalld_confRtfirewall.core.io.directRtfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.zoneRRtfirewall.core.io.ipsetRtfirewall.core.io.helperRRtfirewall.errorsRtobjectR(((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyts@      PK[gg)site-packages/firewall/core/fw_service.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "FirewallService" ] from firewall import errors from firewall.errors import FirewallError class FirewallService(object): def __init__(self, fw): self._fw = fw self._services = { } def __repr__(self): return '%s(%r)' % (self.__class__, self._services) def cleanup(self): self._services.clear() # zones def get_services(self): return sorted(self._services.keys()) def check_service(self, service): if service not in self._services: raise FirewallError(errors.INVALID_SERVICE, service) def get_service(self, service): self.check_service(service) return self._services[service] def add_service(self, obj): self._services[obj.name] = obj def remove_service(self, service): self.check_service(service) del self._services[service] PK[V_P))(site-packages/firewall/core/fw_helper.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2015-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """helper backend""" __all__ = [ "FirewallHelper" ] from firewall import errors from firewall.errors import FirewallError class FirewallHelper(object): def __init__(self, fw): self._fw = fw self._helpers = { } def __repr__(self): return '%s(%r)' % (self.__class__, self._helpers) # helpers def cleanup(self): self._helpers.clear() def check_helper(self, name): if name not in self.get_helpers(): raise FirewallError(errors.INVALID_HELPER, name) def query_helper(self, name): return name in self.get_helpers() def get_helpers(self): return sorted(self._helpers.keys()) def has_helpers(self): return len(self._helpers) > 0 def get_helper(self, name): self.check_helper(name) return self._helpers[name] def add_helper(self, obj): self._helpers[obj.name] = obj def remove_helper(self, name): if name not in self._helpers: raise FirewallError(errors.INVALID_HELPER, name) del self._helpers[name] PK[e&$$%site-packages/firewall/core/ipset.pyonu[ c`c @sdZdddgZddlZddlmZddlmZddlm Z dd l m Z dd l m Z mZdd lmZd Zd ddddddddddg Zidd6dd6dd6dd6Zidd6d d6d!d6Zdefd"YZd#Zd$ZdS(%sThe ipset command wrappertipsettcheck_ipset_nametremove_default_create_optionsiN(terrors(t FirewallError(trunProg(tlog(ttempFiletreadfile(tCOMMANDSi shash:ips hash:ip,portshash:ip,port,ipshash:ip,port,nets hash:ip,markshash:nets hash:net,nets hash:net,portshash:net,port,netshash:net,ifaceshash:macs inet|inet6tfamilytvaluethashsizetmaxelems value in secsttimeouttinett1024t65536cBseZdZdZdZdZdZdZddZ dZ dZ d Z dd Z ddd Zd Zdd ZdddZdZdZdZdZRS(sipset command wrapper classcCstd|_d|_dS(NR(R t_commandtname(tself((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt__init__Js cCsg|D]}d|^q}tjd|j|jdj|t|j|\}}|dkrtd|jdj||fn|S(sCall ipset with argss%ss %s: %s %st is'%s %s' failed: %s(Rtdebug2t __class__RtjoinRt ValueError(Rtargstitemt_argststatustret((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt__runNs%  cCs/t|tkr+ttjd|ndS(sCheck ipset namesipset name '%s' is not validN(tlentIPSET_MAXNAMELENRRt INVALID_NAME(RR((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt check_nameYs cCsg}d}y|jdg}Wn$tk rH}tjd|nX|j}t}x{|D]s}|r|jjdd}|d|kr|dt kr|j |dqn|j drbt }qbqbW|S(s?Return types that are supported by the ipset command and kernelts--helpsipset error: %siisSupported set types:N( t _ipset__runRRtdebug1t splitlinestFalsetstriptsplittNonet IPSET_TYPEStappendt startswithtTrue(RRtoutputtextlinestin_typestlinetsplits((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pytset_supported_types_s     cCs;t|tks|tkr7ttjd|ndS(sCheck ipset types!ipset type name '%s' is not validN(R!R"R-RRt INVALID_TYPE(Rt type_name((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt check_typets cCs|j||j|d||g}t|trxF|jD]5\}}|j||dkrE|j|qEqEWn|j|S(s+Create an ipset with name, type and optionstcreateR%(R$R:t isinstancetdicttitemsR.R&(Rtset_nameR9toptionsRtkeytval((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_createzs    cCs |j||jd|gS(Ntdestroy(R$R&(RR?((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_destroys cCsd||g}|j|S(Ntadd(R&(RR?tentryR((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pytset_addscCsd||g}|j|S(Ntdel(R&(RR?RGR((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_deletescCs?d||g}|r2|jddj|n|j|S(Nttests%sR(R.RR&(RR?RGR@R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRKscCsKdg}|r|j|n|r5|j|n|j|jdS(Ntlists (R.textendR&R+(RR?R@R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pytset_lists  c Cs|jddg}i}d}}i}x|D]z}t|dkrPq2ng|jddD]}|j^qc}t|dkrq2q2|ddkr|d}q2|ddkr|d}q2|dd kr2|dj} d} xz| t| kro| | } | dkrbt| | krK| d7} | | || R.twriteRtclosetoststatRRRRRtst_sizeRtgetDebugLogLevelRt Exceptiontdebug3tendswithtunlinkR(RR?R9tentriestcreate_optionst entry_optionst temp_fileRRARBRGRfRRR[R5((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_restoresV              #  cCs,dg}|r|j|n|j|S(Ntflush(R.R&(RR?R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_flushs cCs|jd||gS(Ntrename(R&(Rt old_set_namet new_set_name((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRt scCs|jd||gS(Ntswap(R&(Rt set_name_1t set_name_2((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRwscCs|jdgS(Ntversion(R&(R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRzsN(t__name__t __module__t__doc__RR&R$R7R:R,RCRERHRJRKRNR]R^RqRsRtRwRz(((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRGs&         ' 7   cCst|tkrtStS(s"Return true if ipset name is valid(R!R"R)R0(R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRscCsK|j}x8tD]0}||krt|||kr||=qqW|S(s( Return only non default create options (tcopytIPSET_DEFAULT_CREATE_OPTIONS(R@RXR\((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRs    (R}t__all__tos.pathRetfirewallRtfirewall.errorsRtfirewall.core.progRtfirewall.core.loggerRtfirewall.functionsRRtfirewall.configR R"R-tIPSET_CREATE_OPTIONSRtobjectRRR(((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyts@     PK[*<<'site-packages/firewall/core/fw_zone.pycnu[ c`c@s$ddlZddlmZmZmZddlmZddlmZm Z m Z m Z m Z m Z mZmZmZddlmZmZmZmZmZmZmZmZmZmZmZddlmZmZddl m!Z!ddl"m#Z#dd l$m%Z%d e&fd YZ'dS( iN(t SHORTCUTStDEFAULT_ZONE_TARGETtZONE_SOURCE_IPSET_TYPES(tlog( tportStrt checkIPnMaskt checkIP6nMaskt checkProtocoltenable_ip_forwardingtcheck_single_addresst check_mactportInPortRangetget_nf_conntrack_short_name( t Rich_Rulet Rich_Acceptt Rich_Markt Rich_Servicet Rich_Portt Rich_ProtocoltRich_MasqueradetRich_ForwardPorttRich_SourcePorttRich_IcmpBlockt Rich_IcmpType(tFirewallTransactiontFirewallZoneTransaction(terrors(t FirewallError(tLastUpdatedOrderedDictt FirewallZonecBsxeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z dd Zd ZdZddZdZddZdZdZddZddZddZdZdZdZdZdZdddZdZ ddZ!ddZ"dd Z#d!Z$d"Z%d#Z&d$Z'd%Z(ddd&Z)d'Z*dd(Z+dd)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2d0Z3d1ddd2Z4d3Z5dd4Z6dd5Z7d6Z8d7Z9d8Z:d9Z;d1ddd:Z<d;Z=dd<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDd1dddCZEdDZFddEZGdFZHdGZIdHZJdIZKdJZLd1dddKZMdLZNddMZOdNZPdOZQdPZRdQZSd1dddRZTdSZUddTZVdUZWdVZXdWZYdXZZd1dddYZ[dZZ\dd[Z]d\Z^d]Z_ddd^Z`ddd_Zaddd1ddd`ZbdaZcddddbZddcZeddddZfdeZgdfZhdgZid1dddhZjdiZkddjZldkZmdlZndmZodnZpdddoZqdpZrdqZsddrZtdsZudtZvduZwexdvZydwZzdxZ{dyZ|dzZ}d{Z~d|Zd}Zd~ZdZdZdZdZddddZdZdZRS(cCs||_i|_i|_dS(N(t_fwt_chainst_zones(tselftfw((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__init__(s  cCsd|j|j|jfS(Ns %s(%r, %r)(t __class__RR (R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__repr__-scCs|jj|jjdS(N(RtclearR (R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytcleanup0s cCs t|jS(N(RR(R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytnew_transaction6scCst|j|S(N(RR(R!tzone((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytnew_zone_transaction9scCst|jjS(N(tsortedR tkeys(R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt get_zones>scCsE|j|}x/|jD]$}||j|jdkr|SqWdS(Nt interfaces(t_FirewallZone__interface_idR tsettingstNone(R!t interfacet interface_idR)((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_zone_of_interfaceAs cCsE|j|}x/|jD]$}||j|jdkr|SqWdS(Ntsources(t_FirewallZone__source_idR R0R1(R!tsourcet source_idR)((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_zone_of_sourceIs cCs|jj|}|j|S(N(Rt check_zoneR (R!R)tz((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_zoneQscOsQy||||Wn6tk rL}t|}tjd||fnXdS(Ns%s: %s(RtstrRtwarning(R!tftnametargstkwargsterrortmsg((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt_error2warningUs  c CsHddddddddd d d d g D|_||j|j^s R.R5tservicestportst masqueradet forward_portst source_portst icmp_blockstrulest protocolsticmp_block_inversion(R0R R@(R!tobj((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytadd_zone]scCsA|j|}|jr&|j|n|jj|j|=dS(N(R tappliedtunapply_zone_settingsR0R&(R!R)RQ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt remove_zonehs    c Cs|dkr|j}n|}x|jD]}|j|}|j|}|jrx|j|j|jd|nt |j dkst |j dkrt |_ ntjd|jx0|jD]%}|j|j|j|d|qWx0|jD]%}|j|j|jd||qWx0|jD]%}|j|j|j|d|q1Wx0|jD]%}|j|j|jd||qdWx0|jD]%}|j|j|j|d|qWx0|jD]%}|j|j|jd||qW|jr|j|j|jd|nx0|jD]%}|j|j|j|d|q%Wx0|j D]%}|j|j |j|d|qXWx0|j D]%}|j|j!|j|d|qW|j r.|j|j"t |j|q.q.W|dkr|j#t ndS(Ntuse_zone_transactionisApplying zone '%s'($R1R(R-R tzone_transactionRPREtadd_icmp_block_inversionR@tlenR.R5tTrueRSRtdebug1RMtadd_icmp_blockRKtadd_forward_portRHt add_serviceRItadd_portROt add_protocolRLtadd_source_portRJtadd_masqueradeRNtadd_rulet add_interfacet add_sourcet_icmp_block_inversiontexecute(R!tuse_transactiont transactionR)RQRWRA((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt apply_zonesos^    *           cCs|j|}||_dS(N(R RS(R!R)RSRQ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytset_zone_applieds cCsd|krdS|jd}t|dkr5dSd}x+tD]#}|dt|krB|}qBqBW|dk r|d|jkrdSt|dkst|dkr|dd kr|d|fSndS( Nt_iiiiRtdenytallow(slogRmRn(R1tsplitRYRR-(R!tchaintsplitst_chainRG((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytzone_from_chains     "c Cs|dkr|j|}|dk r|\}}|dkrN|j}n|}|j|t||fg||dkr|jtqqndS(Ntipv4tipv6(RtRu(RsR1R(tgen_chain_rulesRZRg( R!tipvttableRpRhRGt_zoneRrRi((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytcreate_zone_base_by_chains     cCsx|D]\}}|rD|jj|ij|gj|q|j||j|t|j||dkr|j||=nt|j|dkr|j|=qqWdS(Ni(Rt setdefaulttappendtremoveRY(R!R)tcreatetchainsRxRp((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt_register_chainss+cCs8itjd6|d6|d6}|r4||dRR=(R!R)R0t_objtkeyRARD((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt set_settingss@             (c Cs.|jj|}|j|}|r.|js?| rC|j rCdS|rUt|_n|dkrs|j|}n|}|j|}xd|D]\}xS||D]G} y|dkr|j||| |n|dkrwn|dkr |j d| d} |j |||d| | n|dkrE|j ||| |nx|dkru|j ||| d| d |nH|d kr|j ||| |n#|d kr|j||| d| d |n|d kr|j|||n|d krRd|j d | kr'|j d | d} nd} |j||td| | |nk|dkrw|j||| |nF|dkr|j||| d| d |ntjd||| Wqtk r} tjt| qXqWqW|r|jt|j|n|dkr*|j|ndS(NRMRPRKRtmark_idRHRIiiRORLRJRNRR.R5s3Zone '%s': Unknown setting '%s:%s', unable to apply(RR:R RSRZR1R*Rt _icmp_blockR0t _forward_portt_servicet_portt _protocolt _source_portt _masqueradet_FirewallZone__ruleR t _interfacet_sourceRR>RR=RfR@Rg( R!tenableR)RVRyRQRWR0RRARRD((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__zone_settings sj                        cCs|jt||dS(N(t_FirewallZone__zone_settingsRZ(R!R)RV((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytapply_zone_settings_scCs|jt||dS(N(RtFalse(R!R)RV((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRTbscCsK|j|}t|jdkrGt|jdkrG|j|ndS(Ni(R RYR.R5RT(R!R)RQ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytunapply_zone_settings_if_unusedes *cCst|j|j}|dtkr8d|d|S|dk r]|j||n|j|||}|S(N(RRR4R:R1tremove_interfaceRd(R!R)R2Rt _old_zonet _new_zoneRy((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs   cCs|jj|dkr(|j}n|}|j|}|j|||jt|d|dt|dk r|dkr|j|}|jt|d|dtn|dkr|j tndS(Nt+R|R( RRR1R(RWRRRZRRg(R!told_zonetnew_zoneRhRiRW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytchange_default_zones   c Cs|jj|j|}|dkrAttjd|n|dkrS|n|jj|}||krttjd|||fn|dkr|j |}n|}|j |}|j |}|j t ||||j|j|||dkr|jtn|S(Ns'%s' is not in any zoneRs"remove_interface(%s, %s): zoi='%s'(RRR4R1RRtUNKNOWN_INTERFACER:RR*R R/RRtadd_postRRgRZ( R!R)R2RVtzoiRyRWRR3((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs*   $     cCs(||jdkr$|jd|=ndS(NR.(R0(R!RR3((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__unregister_interfacescCs |j||j|dkS(NR.(R/R(R!R)R2((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytquery_interfacescCs|j|djS(NR.(RR,(R!R)((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR scCst|rdSt|r dSt|r0dS|jdrr|j|d|j|d|j|dSttj |dS(NRtRuRsipset:i( RRR t startswitht_check_ipset_type_for_sourcet_check_ipset_appliedt _ipset_familyRRt INVALID_ADDR(R!R7((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt check_sources   cCs|j|}||fS(N(R(R!R7Rw((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt __source_idsc Cs||jj|jj|}|j|}t|rG|j}n|j|}||jdkrtt j d||fn|j |dk rtt j d|n|dkr|j|}n|}|js|j|d||j|j|tn|jt||d|d||j|||||j|j|||dkrx|jtn|S(NR5s'%s' already bound to '%s's'%s' already bound to a zoneRVii(RRR:R R tupperR6R0RRRR9R1RR*RSRRRkRRRZt_FirewallZone__register_sourcet _FirewallZone__unregister_sourceRg( R!R)R7RRVRyRR8RW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRe s4        ! cCsC|jd||jd|<| p-|dk|jd|d|St|rY|j}n|dk rx|j||n|j|||}|S(N( RRR9R:R RR1t remove_sourceRe(R!R)R7RRRRy((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRLs    c CsE|jjt|r(|j}n|j|}|dkr\ttjd|n|dkrn|n|jj |}||krttj d|||fn|dkr|j |}n|}|j |}|j |}|jt||d|d||j|j|||dkrA|jtn|S(Ns'%s' is not in any zoneRsremove_source(%s, %s): zos='%s'ii(RRR RR9R1RRtUNKNOWN_SOURCER:RR*R R6RRRRRgRZ( R!R)R7RVtzosRyRWRR8((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR^s.    $    ! cCs(||jdkr$|jd|=ndS(NR5(R0(R!RR8((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__unregister_sourcescCs;t|r|j}n|j||j|dkS(NR5(R RR6R(R!R)R7((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt query_sources cCs.g|j|djD]}|d^qS(NR5i(RR,(R!R)tk((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRscCs|jdS(N(tcheck(R!trule((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt check_rulescCs|j|t|S(N(RR=(R!R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt __rule_ids cCs|s dS|jr<t|jr&dSt|jrdSndt|drX|jrXdSt|dr|jr|j|j|j|j|j |jSdS(NRtRutmacRtipset( R1taddrRRthasattrRRRRR(R!R7((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt_rule_source_ipvs cCs|j|||||dS(N(t _rule_prepare(R!RR)RRRW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__rulesic CsE|jj|}|jj||jj|j|}|j|}||jdkr}ttj d||fn|dkr|j |} n|} t |j tkr|jj} nd} |jr|jt||| | n|j||| ||| j|j||| |dkrA| jtn|S(NRNs'%s' already in '%s'(RR:t check_timeoutRR t_FirewallZone__rule_idR0RRtALREADY_ENABLEDR1R*ttypetelementRtnew_markRSRRZt_FirewallZone__register_ruleRt_FirewallZone__unregister_ruleRg( R!R)RRRRVRyRtrule_idRWR((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRcs*      cCs'|j||d||jd|(R!tmodulesRt_helpersRRt_module_short_namet_helper((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_helpers_for_service_modulesGs$    cCs$|jj||jj|dS(N(Rt check_portt check_tcpudp(R!tporttprotocol((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR ascCs#|j||t|d|fS(Nt-(R R(R!R R ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt __port_idesc Cs|jj|}|jj||jj|j|}|j||} | |jdkrttj d|||fn|dkr|j |} n|} |j r|j t|||| n|j|| ||| j|j|| |dkr| jtn|S(NRIs'%s:%s' already in '%s'(RR:RRR t_FirewallZone__port_idR0RRRR1R*RSRRZt_FirewallZone__register_portRt_FirewallZone__unregister_portRg( R!R)R R RRRVRyRtport_idRW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR_is&       cCs!|j|||jd||j|}|tkr:ttjd||fndS(Ns.ipset '%s' with type '%s' not usable as source(t_FirewallZone__ipset_typeRRRt INVALID_IPSET(R!R@t_type((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs  c Csx|r|jj|gn |jjD]}|js@q+nxr|jD]d}x[|j|D]J}|r|j||n|j|||||} |j|| qcWqMWq+WdS(N( Rtget_backend_by_ipvRVRWRXR\R]tbuild_zone_source_address_rulesRZ( R!RR)RwR7RWR[RxRpRN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs1  cCs |jdk r|jg}n1gddgD]}|jj|r+|^q+}|j|j}|dk r|dkr|jdk r|j|krttjd||jfqq|g}n||_ x t g|D]} |jj | ^qD] } t |j tkr|jjj|j j} g} t| jdkr|jrlttjdnxS|D];}|| jkrs| j|rs| j| j|qsqsWn | jdx| D]} |r |jdd|jjdkr |jd d q nt |jtkr|j| j|}g}x6|D].}|j}t|}|jjdkr.|jd d }|j||jdkr| j|j rqDnt|jd kr|j|qrx|jD]@\}}| j ||||| |j|}|j!| |qWqD|j|krD|j|j|jjd d }|j|qDqDW|j"|nxs| jD]h\}}|rt |jt#kr|jdd n| j$||||| |}|j!| |qWxj| j%D]_}|r:t |jt#kr:|jdd n| j&|||| |}|j!| |qWxs| j'D]h\}}|rt |jt#kr|jdd n| j(||||| |}|j!| |qsWqWqt |j t)kr|j j*}|j j+}|j,|||r<|jddn|rjt |jt#krj|jdd n| j$||||d|}|j!| |qt |j t-kr>|j j.}|j/||r|jddn|rt |jt#kr|jdd n| j&|||d|}|j!| |qt |j t0kr|r|jd d|jddx3|D](}| j|r|j1t2|qqWn| j3|||}|j!| |qt |j t4kr|j j*}|j j+}|j j5}|j j6}xX|D]P}| j|rT|j7|||||n|r#|r#|j1t2|q#q#W|sdnd}|r|jdd |jd d |jd|n| j8||||||||| }|j!| |qt |j t9kr|j j*}|j j+}|j,|||rR|jddn|rt |jt#kr|jdd n| j(||||d|}|j!| |qt |j t:kst |j t;kr |jj<j=|j j}t |j t:kr> |jr> t |jtkr> ttjdn|jr xv|D]k}||jkrN | j| rN ttjdt |j t:kr dnd|j j| jfqN qN Wnd}|r |j|d|j|dn| j>||||}|j!| |q|j dkr |rB |jddn|rp t |jt#krp |jdd n| j?|||}|j!| |qttjdt |j qW|S(NRtRuRs;Source address family '%s' conflicts with rule family '%s'.is"Destination conflict with service.tfiltertINPUTtrawt PREROUTINGt conntracktnatitmanglet POSTROUTINGt FORWARD_OUTt FORWARD_INs'IcmpBlock not usable with accept actionsIcmp%s %s not usable with %stBlocktTypesUnknown element %s(@tfamilyR1Rtis_ipv_enabledRR7RRt INVALID_RULEtipvstsetRkRRRRt get_serviceR@RYt destinationtis_ipv_supportedR|R]RtactionRR RRR treplaceRItbuild_zone_helper_ports_rulesRZt add_modulesRtbuild_zone_ports_rulesROtbuild_zone_protocol_rulesRLtbuild_zone_source_ports_rulesRR R R RtvalueRRRRtbuild_zone_masquerade_rulesRtto_portt to_addressR6tbuild_zone_forward_port_rulesRRRticmptypet get_icmptypetbuild_zone_icmp_block_rulest(build_zone_rich_source_destination_rules(R!RR)RRRWR|Rwt source_ipvRGR[tsvct destinationsRthelpersRRRRt nat_moduleR tprotoRNR R4R5t filter_chaintictRx((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRsH1   2            "                   # c CsJ|jjj|}|j|j|}|r|jjdkrU|jddnVg}x@|D]8}|j|j|jj dd} |j| qbW|j ||jddng} xdd gD]} |jj | sqn|jj | } t |jdkrE| |jkrm| j| |j| fqmq| df| kr| j| dfqqWx| D]\} } |jjdkr|x|D]}|j}t|}|jj dd} |j| |jd kr| j|j rqnt |jd kr'|j|qxK|jD]@\}}| j||||| |j|}|j| |q1WqWnxB|jD]7\}}| j||||| }|j| |qWx9|jD].}| j|||| }|j| |qWxB|jD]7\}}| j||||| }|j| |qWqxWdS( NiRoRpRqRrRmRnRtRuRi(RRR~R RRR]R|RRRRzRkRYRR1R t add_moduleRyRRIRR@RZRRORRLR(R!RR)RRWRRRRRt backends_ipvRwR[RRRR RRNR ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRsd       "  cCsn|r|jddnxN|jjD]=}|js>q)n|j||||}|j||q)WdS(NRmRn(R]RRVRWRRZ(R!RR)R R RWR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR3s  cCsk|r|jddnxK|jjD]:}|js>q)n|j|||}|j||q)WdS(NRmRn(R]RRVRWRRZ(R!RR)R RWR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR?s cCsn|r|jddnxN|jjD]=}|js>q)n|j||||}|j||q)WdS(NRmRn(R]RRVRWRRZ(R!RR)R R RWR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRJs cCsw|r)|jdd|jddnd}|jt||jj|}|j||}|j||dS(NRrRtRmRuRt(R]RRRRkRRZ(R!RR)RWRwR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRUsc Cstd|rd} nd} |s*dnd} |ri|jdd|jdd|jd| n|r|r|jt| n|jj| } | j||| |||||} |j| | dS( NRuRtRnRvRsRpRrRm(R R]RRRRkRRZ( R!RR)RWR R R4R5RRwRR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRas   c Cs|jjj|}|r>|jdd|jddnx|jjD]}|jscqNnt}|jrxBddgD]1}||jkr|j|st }PqqqWn|rqNn|j |||} |j || qNWdS(NRmRnRvRtRu( RRRR]RVRWRRRRZRRZ( R!RR)RARWRR[t skip_backendRwRN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRws$  cCs|j|j}|dkr dS|j| r@|dkr@dS|jdd|jdd|r|j||jnxH|jjD]7}|jsqn|j ||}|j ||qWdS( NtDROPs %%REJECT%%tREJECTtACCEPTRmRnRv(Rs %%REJECT%%R( R ttargetRR]RgR&RRVRWt%build_zone_icmp_block_inversion_rulesRZ(R!RR)RWRR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRfs    N(t__name__t __module__R#R%R'R(R*R-R4R9R<RERRRUR1RjRkRsRzRRRRRRRTRRRRR/RdRRRRRRRRR6ReRRRRRRRRRRRcRRRRRRRR^RRRRRR R RR_RRRRRRRR`RR RR"RR$RaR%R(R&R*RR,RbR-R1R.RR6R8R]R9R=R:R?RRBRDR\RERIRFRKRRMRXRNRORTRSRRvRRRRhRfRRRRRRRRRRRRf(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR's$            <      ) ?       '         &                                                                   (   (           A  ((Rtfirewall.core.baseRRRtfirewall.core.loggerRtfirewall.functionsRRRRRR R R R tfirewall.core.richR RRRRRRRRRRtfirewall.core.fw_transactionRRtfirewallRtfirewall.errorsRtfirewall.fw_typesRtobjectR(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyts @LPK[@@'site-packages/firewall/core/modules.pyonu[ c`c@sYdZdgZddlmZddlmZddlmZdefdYZ dS(smodules backendtmodulesi(trunProg(tlog(tCOMMANDScBsPeZdZdZdZdZdZdZdZdZ RS(cCstd|_td|_dS(Ntmodprobetrmmod(Rt _load_commandt_unload_command(tself((s9/usr/lib/python2.7/site-packages/firewall/core/modules.pyt__init__s cCs d|jS(Ns%s(t __class__(R((s9/usr/lib/python2.7/site-packages/firewall/core/modules.pyt__repr__$sc Csg}i}tdd}x|D]y}|s5Pn|j}|j}|j|d|ddkr|djdd ||ds  PK[͙22'site-packages/firewall/core/nftables.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2018 Red Hat, Inc. # # Authors: # Eric Garver # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os.path import copy from firewall.core.base import SHORTCUTS, DEFAULT_ZONE_TARGET from firewall.core.prog import runProg from firewall.core.logger import log from firewall.functions import splitArgs, check_mac, portStr, \ check_single_address, check_address from firewall import config from firewall.errors import FirewallError, UNKNOWN_ERROR, INVALID_RULE, \ INVALID_ICMPTYPE, INVALID_TYPE, INVALID_ENTRY from firewall.core.rich import Rich_Accept, Rich_Reject, Rich_Drop, Rich_Mark TABLE_NAME = "firewalld" # Map iptables (table, chain) to hooks and priorities. # These are well defined by NF_IP_PRI_* defines in netfilter. # # This is analogous to ipXtables.BUILT_IN_CHAINS, but we omit the chains that # are only used for direct rules. # # Note: All hooks use their standard position + NFT_HOOK_OFFSET. This means # iptables will have DROP precedence. It also means that even if iptables # ACCEPTs a packet it may still be dropped later by firewalld's rules. # NFT_HOOK_OFFSET = 10 IPTABLES_TO_NFT_HOOK = { #"security": { # "INPUT": ("input", 50 + NFT_HOOK_OFFSET), # "OUTPUT": ("output", 50 + NFT_HOOK_OFFSET), # "FORWARD": ("forward", 50 + NFT_HOOK_OFFSET), #}, "raw": { "PREROUTING": ("prerouting", -300 + NFT_HOOK_OFFSET), # "OUTPUT": ("output", -300 + NFT_HOOK_OFFSET), }, "mangle": { "PREROUTING": ("prerouting", -150 + NFT_HOOK_OFFSET), # "POSTROUTING": ("postrouting", -150 + NFT_HOOK_OFFSET), # "INPUT": ("input", -150 + NFT_HOOK_OFFSET), # "OUTPUT": ("output", -150 + NFT_HOOK_OFFSET), # "FORWARD": ("forward", -150 + NFT_HOOK_OFFSET), }, "nat": { "PREROUTING": ("prerouting", -100 + NFT_HOOK_OFFSET), "POSTROUTING": ("postrouting", 100 + NFT_HOOK_OFFSET), # "INPUT": ("input", 100 + NFT_HOOK_OFFSET), # "OUTPUT": ("output", -100 + NFT_HOOK_OFFSET), }, "filter": { "INPUT": ("input", 0 + NFT_HOOK_OFFSET), "FORWARD": ("forward", 0 + NFT_HOOK_OFFSET), # "OUTPUT": ("output", 0 + NFT_HOOK_OFFSET), }, } OUR_CHAINS = { # chains created by firewalld # family: { chains ...} "inet": {}, "ip": {}, "ip6": {}, } # Most ICMP types are provided by nft, but for the codes we have to use numeric # values. # ICMP_TYPES_FRAGMENT = { "ipv4" : { "communication-prohibited" : ["icmp", "type", "destination-unreachable", "icmp", "code", "13"], "destination-unreachable" : ["icmp", "type", "destination-unreachable"], "echo-reply" : ["icmp", "type", "echo-reply"], "echo-request" : ["icmp", "type", "echo-request"], "fragmentation-needed" : ["icmp", "type", "destination-unreachable", "icmp", "code", "4"], "host-precedence-violation" : ["icmp", "type", "destination-unreachable", "icmp", "code", "14"], "host-prohibited" : ["icmp", "type", "destination-unreachable", "icmp", "code", "10"], "host-redirect" : ["icmp", "type", "redirect", "icmp", "code", "1"], "host-unknown" : ["icmp", "type", "destination-unreachable", "icmp", "code", "7"], "host-unreachable" : ["icmp", "type", "destination-unreachable", "icmp", "code", "1"], "ip-header-bad" : ["icmp", "type", "parameter-problem", "icmp", "code", "1"], "network-prohibited" : ["icmp", "type", "destination-unreachable", "icmp", "code", "8"], "network-redirect" : ["icmp", "type", "redirect", "icmp", "code", "0"], "network-unknown" : ["icmp", "type", "destination-unreachable", "icmp", "code", "6"], "network-unreachable" : ["icmp", "type", "destination-unreachable", "icmp", "code", "0"], "parameter-problem" : ["icmp", "type", "parameter-problem"], "port-unreachable" : ["icmp", "type", "destination-unreachable", "icmp", "code", "3"], "precedence-cutoff" : ["icmp", "type", "destination-unreachable", "icmp", "code", "15"], "protocol-unreachable" : ["icmp", "type", "destination-unreachable", "icmp", "code", "2"], "redirect" : ["icmp", "type", "redirect"], "required-option-missing" : ["icmp", "type", "parameter-problem", "icmp", "code", "1"], "router-advertisement" : ["icmp", "type", "router-advertisement"], "router-solicitation" : ["icmp", "type", "router-solicitation"], "source-quench" : ["icmp", "type", "source-quench"], "source-route-failed" : ["icmp", "type", "destination-unreachable", "icmp", "code", "5"], "time-exceeded" : ["icmp", "type", "time-exceeded"], "timestamp-reply" : ["icmp", "type", "timestamp-reply"], "timestamp-request" : ["icmp", "type", "timestamp-request"], "tos-host-redirect" : ["icmp", "type", "redirect", "icmp", "code", "3"], "tos-host-unreachable" : ["icmp", "type", "destination-unreachable", "icmp", "code", "12"], "tos-network-redirect" : ["icmp", "type", "redirect", "icmp", "code", "2"], "tos-network-unreachable" : ["icmp", "type", "destination-unreachable", "icmp", "code", "11"], "ttl-zero-during-reassembly" : ["icmp", "type", "time-exceeded", "icmp", "code", "1"], "ttl-zero-during-transit" : ["icmp", "type", "time-exceeded", "icmp", "code", "0"], }, "ipv6" : { "address-unreachable" : ["icmpv6", "type", "destination-unreachable", "icmpv6", "code", "3"], "bad-header" : ["icmpv6", "type", "parameter-problem", "icmpv6", "code", "0"], "beyond-scope" : ["icmpv6", "type", "destination-unreachable", "icmpv6", "code", "2"], "communication-prohibited" : ["icmpv6", "type", "destination-unreachable", "icmpv6", "code", "1"], "destination-unreachable" : ["icmpv6", "type", "destination-unreachable"], "echo-reply" : ["icmpv6", "type", "echo-reply"], "echo-request" : ["icmpv6", "type", "echo-request"], "failed-policy" : ["icmpv6", "type", "destination-unreachable", "icmpv6", "code", "5"], "neighbour-advertisement" : ["icmpv6", "type", "nd-neighbor-advert"], "neighbour-solicitation" : ["icmpv6", "type", "nd-neighbor-solicit"], "no-route" : ["icmpv6", "type", "destination-unreachable", "icmpv6", "code", "0"], "packet-too-big" : ["icmpv6", "type", "packet-too-big"], "parameter-problem" : ["icmpv6", "type", "parameter-problem"], "port-unreachable" : ["icmpv6", "type", "destination-unreachable", "icmpv6", "code", "4"], "redirect" : ["icmpv6", "type", "nd-redirect"], "reject-route" : ["icmpv6", "type", "destination-unreachable", "icmpv6", "code", "6"], "router-advertisement" : ["icmpv6", "type", "nd-router-advert"], "router-solicitation" : ["icmpv6", "type", "nd-router-solicit"], "time-exceeded" : ["icmpv6", "type", "time-exceeded"], "ttl-zero-during-reassembly" : ["icmpv6", "type", "time-exceeded", "icmpv6", "code", "1"], "ttl-zero-during-transit" : ["icmpv6", "type", "time-exceeded", "icmpv6", "code", "0"], "unknown-header-type" : ["icmpv6", "type", "parameter-problem", "icmpv6", "code", "1"], "unknown-option" : ["icmpv6", "type", "parameter-problem", "icmpv6", "code", "2"], } } class nftables(object): name = "nftables" zones_supported = True def __init__(self, fw): self._fw = fw self._command = config.COMMANDS["nft"] self.fill_exists() self.available_tables = [] self.rule_to_handle = {} self.rule_ref_count = {} self.zone_source_index_cache = {} def fill_exists(self): self.command_exists = os.path.exists(self._command) self.restore_command_exists = False def _run_replace_zone_source(self, rule_add, rule, zone_source_index_cache): try: i = rule.index("%%ZONE_SOURCE%%") rule.pop(i) zone = rule.pop(i) zone_source = (zone, rule[7]) # (zone, address) except ValueError: try: i = rule.index("%%ZONE_INTERFACE%%") rule.pop(i) zone_source = None except ValueError: return family = rule[2] if zone_source and not rule_add: if family in zone_source_index_cache and \ zone_source in zone_source_index_cache[family]: zone_source_index_cache[family].remove(zone_source) elif rule_add: if family not in zone_source_index_cache: zone_source_index_cache[family] = [] if zone_source: # order source based dispatch by zone name if zone_source not in zone_source_index_cache[family]: zone_source_index_cache[family].append(zone_source) zone_source_index_cache[family].sort(key=lambda x: x[0]) index = zone_source_index_cache[family].index(zone_source) else: if self._fw._allow_zone_drifting: index = 0 else: index = len(zone_source_index_cache[family]) if index == 0: rule[0] = "insert" else: index -= 1 # point to the rule before insertion point rule[0] = "add" rule.insert(i, "index") rule.insert(i+1, "%d" % index) def __run(self, args): nft_opts = ["--echo", "--handle"] _args = args[:] # If we're deleting a table (i.e. build_flush_rules()) # then check if its exist first to avoid nft throwing an error if _args[0] == "delete" and _args[1] == "table": _args_test = _args[:] _args_test[0] = "list" (status, output) = runProg(self._command, nft_opts + _args_test) if status != 0: return "" rule_key = None if _args[0] in ["add", "insert"] and _args[1] == "rule": rule_add = True rule_key = _args[2:] if rule_key[3] == "position": # strip "position #" # "insert rule family table chain position " # ^^ rule_key starts here try: int(rule_key[4]) except Exception: raise FirewallError(INVALID_RULE, "position without a number") else: rule_key.pop(3) rule_key.pop(3) rule_key = " ".join(rule_key) elif _args[0] in ["delete"] and _args[1] == "rule": rule_add = False rule_key = _args[2:] rule_key = " ".join(rule_key) # rule deduplication if rule_key in self.rule_ref_count: if rule_add: self.rule_ref_count[rule_key] += 1 return "" if not rule_add and self.rule_ref_count[rule_key] > 1: self.rule_ref_count[rule_key] -= 1 return "" elif self.rule_ref_count[rule_key] == 1: self.rule_ref_count[rule_key] -= 1 else: raise FirewallError(UNKNOWN_ERROR, "rule ref count bug: rule_key '%s', cnt %d" % (rule_key, self.rule_ref_count[rule_key])) log.debug2("%s: rule ref cnt %d, %s %s", self.__class__, self.rule_ref_count[rule_key], self._command, " ".join(_args)) if rule_key: zone_source_index_cache = copy.deepcopy(self.zone_source_index_cache) self._run_replace_zone_source(rule_add, _args, zone_source_index_cache) if not rule_key or (not rule_add and self.rule_ref_count[rule_key] == 0) \ or ( rule_add and rule_key not in self.rule_ref_count): # delete using rule handle if rule_key and not rule_add: _args = ["delete", "rule"] + _args[2:5] + \ ["handle", self.rule_to_handle[rule_key]] _args_str = " ".join(_args) log.debug2("%s: %s %s", self.__class__, self._command, _args_str) (status, output) = runProg(self._command, nft_opts + _args) if status != 0: raise ValueError("'%s %s' failed: %s" % (self._command, _args_str, output)) if rule_key: self.zone_source_index_cache = zone_source_index_cache # nft requires deleting rules by handle. So we must cache the rule # handle when adding/inserting rules. # if rule_key: if rule_add: str = "# handle " offset = output.index(str) + len(str) self.rule_to_handle[rule_key] = output[offset:].strip() self.rule_ref_count[rule_key] = 1 else: del self.rule_to_handle[rule_key] del self.rule_ref_count[rule_key] return output def _rule_replace(self, rule, pattern, replacement): try: i = rule.index(pattern) except ValueError: return False else: rule[i:i+1] = replacement return True def reverse_rule(self, args): ret_args = args[:] ret_args[0] = "delete" return ret_args def set_rules(self, rules, log_denied): # We can't support using "nft -f" because we need to retrieve the # handles for each rules so we can delete them later on. # See also: self.restore_command_exists # # We can implement this once libnftables in ready. # raise FirewallError(UNKNOWN_ERROR, "not implemented") def set_rule(self, rule, log_denied): # replace %%REJECT%% # # HACK: work around nft bug in which icmpx does not work if the rule # has qualified the ip family. icmp_keyword = "icmpx" if "ipv4" in rule or "ip" in rule or "icmp" in rule: icmp_keyword = "icmp" elif "ipv6" in rule or "ip6" in rule or "icmpv6" in rule: icmp_keyword = "icmpv6" self._rule_replace(rule, "%%REJECT%%", ["reject", "with", icmp_keyword, "type", "admin-prohibited"]) # replace %%ICMP%% self._rule_replace(rule, "%%ICMP%%", ["meta", "l4proto", "{icmp, icmpv6}"]) # replace %%LOGTYPE%% try: i = rule.index("%%LOGTYPE%%") except ValueError: pass else: if log_denied == "off": return "" if log_denied in ["unicast", "broadcast", "multicast"]: rule[i:i+1] = ["pkttype", log_denied] else: rule.pop(i) return self.__run(rule) def get_available_tables(self, table=None): # Tables always exist in nftables return [table] if table else IPTABLES_TO_NFT_HOOK.keys() def build_flush_rules(self): self.rule_to_handle = {} self.rule_ref_count = {} self.zone_source_index_cache = {} rules = [] for family in OUR_CHAINS.keys(): rules.append(["delete", "table", family, "%s" % TABLE_NAME]) return rules def build_set_policy_rules(self, policy): # Policy is not exposed to the user. It's only to make sure we DROP # packets while initially starting and for panic mode. As such, using # hooks with a higher priority than our base chains is sufficient. # table_name = TABLE_NAME + "_" + "policy_drop" rules = [] if policy == "DROP": rules.append(["add", "table", "inet", table_name]) # To drop everything we need to use the "raw" priority. These occur # before conntrack, mangle, nat, etc for hook in ["prerouting", "output"]: _add_chain = "add chain inet %s %s_%s '{ type filter hook %s priority %d ; policy drop ; }'" % \ (table_name, "raw", hook, hook, -300 + NFT_HOOK_OFFSET - 1) rules.append(splitArgs(_add_chain)) elif policy == "ACCEPT": rules.append(["delete", "table", "inet", table_name]) else: FirewallError(UNKNOWN_ERROR, "not implemented") return rules def supported_icmp_types(self): # nftables supports any icmp_type via arbitrary type/code matching. # We just need a translation for it in ICMP_TYPES_FRAGMENT. supported = set() for ipv in ICMP_TYPES_FRAGMENT.keys(): supported.update(ICMP_TYPES_FRAGMENT[ipv].keys()) return list(supported) def build_default_tables(self): default_tables = [] for family in OUR_CHAINS.keys(): default_tables.append("add table %s %s" % (family, TABLE_NAME)) return map(splitArgs, default_tables) def build_default_rules(self, log_denied="off"): default_rules = [] OUR_CHAINS["inet"]["raw"] = set() for chain in IPTABLES_TO_NFT_HOOK["raw"].keys(): default_rules.append("add chain inet %s raw_%s '{ type filter hook %s priority %d ; }'" % (TABLE_NAME, chain, IPTABLES_TO_NFT_HOOK["raw"][chain][0], IPTABLES_TO_NFT_HOOK["raw"][chain][1])) for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules.append("add chain inet %s raw_%s_%s" % (TABLE_NAME, chain, dispatch_suffix)) default_rules.append("add rule inet %s raw_%s jump raw_%s_%s" % (TABLE_NAME, chain, chain, dispatch_suffix)) OUR_CHAINS["inet"]["raw"].update(set(["%s_%s" % (chain, dispatch_suffix)])) OUR_CHAINS["inet"]["mangle"] = set() for chain in IPTABLES_TO_NFT_HOOK["mangle"].keys(): default_rules.append("add chain inet %s mangle_%s '{ type filter hook %s priority %d ; }'" % (TABLE_NAME, chain, IPTABLES_TO_NFT_HOOK["mangle"][chain][0], IPTABLES_TO_NFT_HOOK["mangle"][chain][1])) for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules.append("add chain inet %s mangle_%s_%s" % (TABLE_NAME, chain, dispatch_suffix)) default_rules.append("add rule inet %s mangle_%s jump mangle_%s_%s" % (TABLE_NAME, chain, chain, dispatch_suffix)) OUR_CHAINS["inet"]["mangle"].update(set(["%s_%s" % (chain, dispatch_suffix)])) OUR_CHAINS["ip"]["nat"] = set() OUR_CHAINS["ip6"]["nat"] = set() for family in ["ip", "ip6"]: for chain in IPTABLES_TO_NFT_HOOK["nat"].keys(): default_rules.append("add chain %s %s nat_%s '{ type nat hook %s priority %d ; }'" % (family, TABLE_NAME, chain, IPTABLES_TO_NFT_HOOK["nat"][chain][0], IPTABLES_TO_NFT_HOOK["nat"][chain][1])) for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules.append("add chain %s %s nat_%s_%s" % (family, TABLE_NAME, chain, dispatch_suffix)) default_rules.append("add rule %s %s nat_%s jump nat_%s_%s" % (family, TABLE_NAME, chain, chain, dispatch_suffix)) OUR_CHAINS[family]["nat"].update(set(["%s_%s" % (chain, dispatch_suffix)])) OUR_CHAINS["inet"]["filter"] = set() for chain in IPTABLES_TO_NFT_HOOK["filter"].keys(): default_rules.append("add chain inet %s filter_%s '{ type filter hook %s priority %d ; }'" % (TABLE_NAME, chain, IPTABLES_TO_NFT_HOOK["filter"][chain][0], IPTABLES_TO_NFT_HOOK["filter"][chain][1])) # filter, INPUT default_rules.append("add rule inet %s filter_%s ct state established,related accept" % (TABLE_NAME, "INPUT")) default_rules.append("add rule inet %s filter_%s iifname lo accept" % (TABLE_NAME, "INPUT")) for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules.append("add chain inet %s filter_%s_%s" % (TABLE_NAME, "INPUT", dispatch_suffix)) default_rules.append("add rule inet %s filter_%s jump filter_%s_%s" % (TABLE_NAME, "INPUT", "INPUT", dispatch_suffix)) if log_denied != "off": default_rules.append("add rule inet %s filter_%s ct state invalid %%%%LOGTYPE%%%% log prefix '\"STATE_INVALID_DROP: \"'" % (TABLE_NAME, "INPUT")) default_rules.append("add rule inet %s filter_%s ct state invalid drop" % (TABLE_NAME, "INPUT")) if log_denied != "off": default_rules.append("add rule inet %s filter_%s %%%%LOGTYPE%%%% log prefix '\"FINAL_REJECT: \"'" % (TABLE_NAME, "INPUT")) default_rules.append("add rule inet %s filter_%s reject with icmpx type admin-prohibited" % (TABLE_NAME, "INPUT")) # filter, FORWARD default_rules.append("add chain inet %s filter_%s_IN_ZONES" % (TABLE_NAME, "FORWARD")) default_rules.append("add rule inet %s filter_%s ct state established,related accept" % (TABLE_NAME, "FORWARD")) default_rules.append("add rule inet %s filter_%s iifname lo accept" % (TABLE_NAME, "FORWARD")) for direction in ["IN", "OUT"]: for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules.append("add chain inet %s filter_%s_%s_%s" % (TABLE_NAME, "FORWARD", direction, dispatch_suffix)) default_rules.append("add rule inet %s filter_%s jump filter_%s_%s_%s" % (TABLE_NAME, "FORWARD", "FORWARD", direction, dispatch_suffix)) if log_denied != "off": default_rules.append("add rule inet %s filter_%s ct state invalid %%%%LOGTYPE%%%% log prefix '\"STATE_INVALID_DROP: \"'" % (TABLE_NAME, "FORWARD")) default_rules.append("add rule inet %s filter_%s ct state invalid drop" % (TABLE_NAME, "FORWARD")) if log_denied != "off": default_rules.append("add rule inet %s filter_%s %%%%LOGTYPE%%%% log prefix '\"FINAL_REJECT: \"'" % (TABLE_NAME, "FORWARD")) default_rules.append("add rule inet %s filter_%s reject with icmpx type admin-prohibited" % (TABLE_NAME, "FORWARD")) OUR_CHAINS["inet"]["filter"] = set(["INPUT_ZONES_SOURCE", "INPUT_ZONES", "FORWARD_IN_ZONES_SOURCE", "FORWARD_IN_ZONES", "FORWARD_OUT_ZONES_SOURCE", "FORWARD_OUT_ZONES"]) return map(splitArgs, default_rules) def get_zone_table_chains(self, table): if table == "filter": return ["INPUT", "FORWARD_IN", "FORWARD_OUT"] if table == "mangle": return ["PREROUTING"] if table == "nat": return ["PREROUTING", "POSTROUTING"] if table == "raw": return ["PREROUTING"] return {} def build_zone_source_interface_rules(self, enable, zone, interface, table, chain, append=False, family="inet"): # nat tables needs to use ip/ip6 family if table == "nat" and family == "inet": rules = [] rules.extend(self.build_zone_source_interface_rules(enable, zone, interface, table, chain, append, "ip")) rules.extend(self.build_zone_source_interface_rules(enable, zone, interface, table, chain, append, "ip6")) return rules # handle all zones in the same way here, now # trust and block zone targets are handled now in __chain opt = { "PREROUTING": "iifname", "POSTROUTING": "oifname", "INPUT": "iifname", "FORWARD_IN": "iifname", "FORWARD_OUT": "oifname", "OUTPUT": "oifname", }[chain] if interface[len(interface)-1] == "+": interface = interface[:len(interface)-1] + "*" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) action = "goto" if enable and not append: rule = ["insert", "rule", family, "%s" % TABLE_NAME, "%s_%s_ZONES" % (table, chain), "%%ZONE_INTERFACE%%"] elif enable: rule = ["add", "rule", family, "%s" % TABLE_NAME, "%s_%s_ZONES" % (table, chain)] else: rule = ["delete", "rule", family, "%s" % TABLE_NAME, "%s_%s_ZONES" % (table, chain)] if not append: rule += ["%%ZONE_INTERFACE%%"] if interface == "*": rule += [action, "%s_%s" % (table, target)] else: rule += [opt, "\"" + interface + "\"", action, "%s_%s" % (table, target)] return [rule] def build_zone_source_address_rules(self, enable, zone, address, table, chain, family="inet"): # nat tables needs to use ip/ip6 family if table == "nat" and family == "inet": rules = [] if address.startswith("ipset:"): ipset_family = self._set_get_family(address[len("ipset:"):]) else: ipset_family = None if check_address("ipv4", address) or check_mac(address) or ipset_family == "ip": rules.extend(self.build_zone_source_address_rules(enable, zone, address, table, chain, "ip")) if check_address("ipv6", address) or check_mac(address) or ipset_family == "ip6": rules.extend(self.build_zone_source_address_rules(enable, zone, address, table, chain, "ip6")) return rules add_del = { True: "insert", False: "delete" }[enable] opt = { "PREROUTING": "saddr", "POSTROUTING": "daddr", "INPUT": "saddr", "FORWARD_IN": "saddr", "FORWARD_OUT": "daddr", "OUTPUT": "daddr", }[chain] if self._fw._allow_zone_drifting: zone_dispatch_chain = "%s_%s_ZONES_SOURCE" % (table, chain) else: zone_dispatch_chain = "%s_%s_ZONES" % (table, chain) target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) action = "goto" if address.startswith("ipset:"): ipset = address[len("ipset:"):] rule_family = self._set_get_family(ipset) address = "@" + ipset else: if check_mac(address): # outgoing can not be set if opt == "daddr": return "" rule_family = "ether" elif check_address("ipv4", address): rule_family = "ip" else: rule_family = "ip6" rule = [add_del, "rule", family, "%s" % TABLE_NAME, zone_dispatch_chain, "%%ZONE_SOURCE%%", zone, rule_family, opt, address, action, "%s_%s" % (table, target)] return [rule] def build_zone_chain_rules(self, zone, table, chain, family="inet"): # nat tables needs to use ip/ip6 family if table == "nat" and family == "inet": rules = [] rules.extend(self.build_zone_chain_rules(zone, table, chain, "ip")) rules.extend(self.build_zone_chain_rules(zone, table, chain, "ip6")) return rules _zone = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) OUR_CHAINS[family][table].update(set([_zone, "%s_log" % _zone, "%s_deny" % _zone, "%s_allow" % _zone])) rules = [] rules.append(["add", "chain", family, "%s" % TABLE_NAME, "%s_%s" % (table, _zone)]) rules.append(["add", "chain", family, "%s" % TABLE_NAME, "%s_%s_log" % (table, _zone)]) rules.append(["add", "chain", family, "%s" % TABLE_NAME, "%s_%s_deny" % (table, _zone)]) rules.append(["add", "chain", family, "%s" % TABLE_NAME, "%s_%s_allow" % (table, _zone)]) rules.append(["add", "rule", family, "%s" % TABLE_NAME, "%s_%s" % (table, _zone), "jump", "%s_%s_log" % (table, _zone)]) rules.append(["add", "rule", family, "%s" % TABLE_NAME, "%s_%s" % (table, _zone), "jump", "%s_%s_deny" % (table, _zone)]) rules.append(["add", "rule", family, "%s" % TABLE_NAME, "%s_%s" % (table, _zone), "jump", "%s_%s_allow" % (table, _zone)]) target = self._fw.zone._zones[zone].target if self._fw.get_log_denied() != "off": if table == "filter" and \ chain in ["INPUT", "FORWARD_IN", "FORWARD_OUT", "OUTPUT"]: if target in ["REJECT", "%%REJECT%%", "DROP"]: log_suffix = target if target == "%%REJECT%%": log_suffix = "REJECT" rules.append(["add", "rule", family, "%s" % TABLE_NAME, "%s_%s" % (table, _zone), "%%LOGTYPE%%", "log", "prefix", "\"filter_%s_%s: \"" % (_zone, log_suffix)]) # Handle trust, block and drop zones: # Add an additional rule with the zone target (accept, reject # or drop) to the base zone only in the filter table. # Otherwise it is not be possible to have a zone with drop # target, that is allowing traffic that is locally initiated # or that adds additional rules. (RHBZ#1055190) if table == "filter" and \ target in ["ACCEPT", "REJECT", "%%REJECT%%", "DROP"] and \ chain in ["INPUT", "FORWARD_IN", "FORWARD_OUT", "OUTPUT"]: rules.append(["add", "rule", family, "%s" % TABLE_NAME, "%s_%s" % (table, _zone), target.lower() if target != "%%REJECT%%" else "%%REJECT%%"]) return rules def _reject_types_fragment(self, reject_type): frags = { # REJECT_TYPES : "icmp-host-prohibited" : ["with", "icmp", "type", "host-prohibited"], "host-prohib" : ["with", "icmp", "type", "host-prohibited"], "icmp-net-prohibited" : ["with", "icmp", "type", "net-prohibited"], "net-prohib" : ["with", "icmp", "type", "net-prohibited"], "icmp-admin-prohibited" : ["with", "icmp", "type", "admin-prohibited"], "admin-prohib" : ["with", "icmp", "type", "admin-prohibited"], "icmp6-adm-prohibited" : ["with", "icmpv6", "type", "admin-prohibited"], "adm-prohibited" : ["with", "icmpv6", "type", "admin-prohibited"], "icmp-net-unreachable" : ["with", "icmp", "type", "net-unreachable"], "net-unreach" : ["with", "icmp", "type", "net-unreachable"], "icmp-host-unreachable" : ["with", "icmp", "type", "host-unreachable"], "host-unreach" : ["with", "icmp", "type", "host-unreachable"], "icmp-port-unreachable" : ["with", "icmp", "type", "port-unreachable"], "icmp6-port-unreachable" : ["with", "icmpv6", "type", "port-unreachable"], "port-unreach" : ["with", "icmpx", "type", "port-unreachable"], "icmp-proto-unreachable" : ["with", "icmp", "type", "prot-unreachable"], "proto-unreach" : ["with", "icmp", "type", "prot-unreachable"], "icmp6-addr-unreachable" : ["with", "icmpv6", "type", "addr-unreachable"], "addr-unreach" : ["with", "icmpv6", "type", "addr-unreachable"], "icmp6-no-route" : ["with", "icmpv6", "type", "no-route"], "no-route" : ["with", "icmpv6", "type", "no-route"], "tcp-reset" : ["with", "tcp", "reset"], "tcp-rst" : ["with", "tcp", "reset"], } return frags[reject_type] def _rich_rule_limit_fragment(self, limit): if not limit: return [] rich_to_nft = { "s" : "second", "m" : "minute", "h" : "hour", "d" : "day", } try: i = limit.value.index("/") except ValueError: raise FirewallError(INVALID_RULE, "Expected '/' in limit") return ["limit", "rate", limit.value[0:i], "/", rich_to_nft[limit.value[i+1]]] def _rich_rule_log(self, rich_rule, enable, table, target, rule_fragment): if not rich_rule.log: return [] add_del = { True: "add", False: "delete" }[enable] rule = [add_del, "rule", "inet", "%s" % TABLE_NAME, "%s_%s_log" % (table, target)] rule += rule_fragment + ["log"] if rich_rule.log.prefix: rule += ["prefix", "\"%s\"" % rich_rule.log.prefix] if rich_rule.log.level: rule += ["level", '"%s"' % rich_rule.log.level] rule += self._rich_rule_limit_fragment(rich_rule.log.limit) return rule def _rich_rule_audit(self, rich_rule, enable, table, target, rule_fragment): if not rich_rule.audit: return [] add_del = { True: "add", False: "delete" }[enable] rule = [add_del, "rule", "inet", "%s" % TABLE_NAME, "%s_%s_log" % (table, target)] rule += rule_fragment + ["log", "level", "audit"] rule += self._rich_rule_limit_fragment(rich_rule.audit.limit) return rule def _rich_rule_action(self, zone, rich_rule, enable, table, target, rule_fragment): if not rich_rule.action: return [] add_del = { True: "add", False: "delete" }[enable] if type(rich_rule.action) == Rich_Accept: chain = "%s_%s_allow" % (table, target) rule_action = ["accept"] elif type(rich_rule.action) == Rich_Reject: chain = "%s_%s_deny" % (table, target) rule_action = ["reject"] if rich_rule.action.type: rule_action += self._reject_types_fragment(rich_rule.action.type) elif type(rich_rule.action) == Rich_Drop: chain = "%s_%s_deny" % (table, target) rule_action = ["drop"] elif type(rich_rule.action) == Rich_Mark: target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["PREROUTING"], zone=zone) table = "mangle" chain = "%s_%s_allow" % (table, target) rule_action = ["meta", "mark", "set", rich_rule.action.set] else: raise FirewallError(INVALID_RULE, "Unknown action %s" % type(rich_rule.action)) rule = [add_del, "rule", "inet", "%s" % TABLE_NAME, chain] rule += rule_fragment rule += self._rich_rule_limit_fragment(rich_rule.action.limit) rule += rule_action return rule def _rich_rule_family_fragment(self, rich_family): if not rich_family: return [] if rich_family == "ipv4": return ["meta", "nfproto", "ipv4"] if rich_family == "ipv6": return ["meta", "nfproto", "ipv6"] raise FirewallError(INVALID_RULE, "Invalid family" % rich_family) def _rich_rule_destination_fragment(self, rich_dest): if not rich_dest: return [] rule_fragment = [] if check_address("ipv4", rich_dest.addr): rule_fragment += ["ip"] else: rule_fragment += ["ip6"] if rich_dest.invert: rule_fragment += ["daddr", "!=", rich_dest.addr] else: rule_fragment += ["daddr", rich_dest.addr] return rule_fragment def _rich_rule_source_fragment(self, rich_source): if not rich_source: return [] rule_fragment = [] if rich_source.addr: if check_address("ipv4", rich_source.addr): rule_fragment += ["ip"] else: rule_fragment += ["ip6"] if rich_source.invert: rule_fragment += ["saddr", "!=", rich_source.addr] else: rule_fragment += ["saddr", rich_source.addr] elif hasattr(rich_source, "mac") and rich_source.mac: if rich_source.invert: rule_fragment += ["ether", "saddr", "!=", rich_source.mac] else: rule_fragment += ["ether", "saddr", rich_source.mac] elif hasattr(rich_source, "ipset") and rich_source.ipset: family = self._set_get_family(rich_source.ipset) if rich_source.invert: rule_fragment += [family, "saddr", "!=", "@" + rich_source.ipset] else: rule_fragment += [family, "saddr", "@" + rich_source.ipset] return rule_fragment def build_zone_ports_rules(self, enable, zone, proto, port, destination=None, rich_rule=None): add_del = { True: "add", False: "delete" }[enable] table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_family_fragment(rich_rule.family) if destination: if check_address("ipv4", destination): rule_fragment += ["ip"] else: rule_fragment += ["ip6"] rule_fragment += ["daddr", destination] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rule_fragment += [proto, "dport", "%s" % portStr(port, "-")] if not rich_rule or type(rich_rule.action) != Rich_Mark: rule_fragment += ["ct", "state", "new,untracked"] rules = [] if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, "%s_%s_allow" % (table, target)] + rule_fragment + ["accept"]) return rules def build_zone_protocol_rules(self, enable, zone, protocol, destination=None, rich_rule=None): add_del = { True: "add", False: "delete" }[enable] table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_family_fragment(rich_rule.family) if destination: if check_address("ipv4", destination): rule_fragment += ["ip"] else: rule_fragment += ["ip6"] rule_fragment += ["daddr", destination] if rich_rule: rule_fragment += self._rich_rule_family_fragment(rich_rule.family) rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rule_fragment = ["meta", "l4proto", protocol] if not rich_rule or type(rich_rule.action) != Rich_Mark: rule_fragment += ["ct", "state", "new,untracked"] rules = [] if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, "filter_%s_allow" % (target)] + rule_fragment + ["accept"]) return rules def build_zone_source_ports_rules(self, enable, zone, proto, port, destination=None, rich_rule=None): add_del = { True: "add", False: "delete" }[enable] table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_family_fragment(rich_rule.family) if destination: if check_address("ipv4", destination): rule_fragment += ["ip"] else: rule_fragment += ["ip6"] rule_fragment += ["daddr", destination] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rule_fragment += [proto, "sport", "%s" % portStr(port, "-")] if not rich_rule or type(rich_rule.action) != Rich_Mark: rule_fragment += ["ct", "state", "new,untracked"] rules = [] if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, "%s_%s_allow" % (table, target)] + rule_fragment + ["accept"]) return rules def build_zone_helper_ports_rules(self, enable, zone, proto, port, destination, helper_name, module_short_name): add_del = { True: "add", False: "delete" }[enable] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule = [add_del, "rule", "inet", "%s" % TABLE_NAME, "filter_%s_allow" % (target)] if destination: if check_address("ipv4", destination): rule += ["ip"] else: rule += ["ip6"] rule += ["daddr", destination] rule += [proto, "dport", "%s" % portStr(port, "-")] rule += ["ct", "helper", "set", "\"helper-%s-%s\"" % (helper_name, proto)] helper_object = ["ct", "helper", "inet", TABLE_NAME, "helper-%s-%s" % (helper_name, proto), "{", "type", "\"%s\"" % (module_short_name), "protocol", proto, ";", "}"] return [helper_object, rule] def _build_zone_masquerade_nat_rules(self, enable, zone, family, rich_rule=None): add_del = { True: "add", False: "delete" }[enable] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["POSTROUTING"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) return [[add_del, "rule", family, "%s" % TABLE_NAME, "nat_%s_allow" % (target)] + rule_fragment + ["oifname", "!=", "lo", "masquerade"]] def build_zone_masquerade_rules(self, enable, zone, rich_rule=None): # nat tables needs to use ip/ip6 family rules = [] if rich_rule and (rich_rule.family and rich_rule.family == "ipv6" or rich_rule.source and check_address("ipv6", rich_rule.source.addr)): rules.extend(self._build_zone_masquerade_nat_rules(enable, zone, "ip6", rich_rule)) elif rich_rule and (rich_rule.family and rich_rule.family == "ipv4" or rich_rule.source and check_address("ipv4", rich_rule.source.addr)): rules.extend(self._build_zone_masquerade_nat_rules(enable, zone, "ip", rich_rule)) else: rules.extend(self._build_zone_masquerade_nat_rules(enable, zone, "ip", rich_rule)) add_del = { True: "add", False: "delete" }[enable] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["FORWARD_OUT"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, "filter_%s_allow" % (target)] + rule_fragment + ["ct", "state", "new,untracked", "accept"]) return rules def _build_zone_forward_port_nat_rules(self, enable, zone, protocol, mark_fragment, toaddr, toport, family): add_del = { True: "add", False: "delete" }[enable] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["PREROUTING"], zone=zone) dnat_fragment = [] if toaddr: dnat_fragment += ["dnat", "to", toaddr] else: dnat_fragment += ["redirect", "to"] if toport and toport != "": dnat_fragment += [":%s" % portStr(toport, "-")] return [[add_del, "rule", family, "%s" % TABLE_NAME, "nat_%s_allow" % (target), "meta", "l4proto", protocol] + mark_fragment + dnat_fragment] def build_zone_forward_port_rules(self, enable, zone, filter_chain, port, protocol, toport, toaddr, mark_id, rich_rule=None): add_del = { True: "add", False: "delete" }[enable] mark_str = "0x%x" % mark_id mark_fragment = ["meta", "mark", mark_str] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["PREROUTING"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_family_fragment(rich_rule.family) rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rules = [] rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, "mangle_%s_allow" % (target)] + rule_fragment + [protocol, "dport", port, "meta", "mark", "set", mark_str]) if rich_rule and (rich_rule.family and rich_rule.family == "ipv6" or toaddr and check_single_address("ipv6", toaddr)): rules.extend(self._build_zone_forward_port_nat_rules(enable, zone, protocol, mark_fragment, toaddr, toport, "ip6")) elif rich_rule and (rich_rule.family and rich_rule.family == "ipv4" or toaddr and check_single_address("ipv4", toaddr)): rules.extend(self._build_zone_forward_port_nat_rules(enable, zone, protocol, mark_fragment, toaddr, toport, "ip")) else: if toaddr and check_single_address("ipv6", toaddr): rules.extend(self._build_zone_forward_port_nat_rules(enable, zone, protocol, mark_fragment, toaddr, toport, "ip6")) else: rules.extend(self._build_zone_forward_port_nat_rules(enable, zone, protocol, mark_fragment, toaddr, toport, "ip")) target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[filter_chain], zone=zone) rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, "filter_%s_allow" % (target), "ct", "state", "new,untracked"] + mark_fragment + ["accept"]) return rules def _icmp_types_to_nft_fragment(self, ipv, icmp_type): if icmp_type in ICMP_TYPES_FRAGMENT[ipv]: return ICMP_TYPES_FRAGMENT[ipv][icmp_type] else: raise FirewallError(INVALID_ICMPTYPE, "ICMP type '%s' not supported by %s" % (icmp_type, self.name)) def build_zone_icmp_block_rules(self, enable, zone, ict, rich_rule=None): table = "filter" add_del = { True: "add", False: "delete" }[enable] if rich_rule and rich_rule.ipvs: ipvs = rich_rule.ipvs elif ict.destination: ipvs = [] if "ipv4" in ict.destination: ipvs.append("ipv4") if "ipv6" in ict.destination: ipvs.append("ipv6") else: ipvs = ["ipv4", "ipv6"] rules = [] for ipv in ipvs: for chain in ["INPUT", "FORWARD_IN"]: target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) if self._fw.zone.query_icmp_block_inversion(zone): final_chain = "%s_%s_allow" % (table, target) final_target = "accept" else: final_chain = "%s_%s_deny" % (table, target) final_target = "%%REJECT%%" rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_family_fragment(rich_rule.family) rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rule_fragment += self._icmp_types_to_nft_fragment(ipv, ict.name) if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) if rich_rule.action: rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, "%s_%s_deny" % (table, target)] + rule_fragment + ["%%REJECT%%"]) else: if self._fw.get_log_denied() != "off" and final_target != "accept": rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, final_chain] + rule_fragment + ["%%LOGTYPE%%", "log", "prefix", "\"%s_%s_ICMP_BLOCK: \"" % (table, zone)]) rules.append([add_del, "rule", "inet", "%s" % TABLE_NAME, final_chain] + rule_fragment + [final_target]) return rules def build_zone_icmp_block_inversion_rules(self, enable, zone): table = "filter" rules = [] for chain in ["INPUT", "FORWARD_IN"]: _zone = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) # HACK: nft position is actually a handle, so we need to lookup the # handle of the rule we want to insert this after. # # This must be kept in sync with build_zone_chain_rules() # # WARN: This does not work if we haven't executed the transaction # yet, because we don't have a handle for our rule_key!! As such, # we execute transactions before calling this function. # rule_key = " ".join(["inet", "%s" % TABLE_NAME, "%s_%s" % (table, _zone), "jump", "%s_%s_allow" % (table, _zone)]) rule_handle = self.rule_to_handle[rule_key] if self._fw.zone.query_icmp_block_inversion(zone): ibi_target = "%%REJECT%%" else: ibi_target = "accept" if enable: # FIXME: can we get rid of position ? rule = ["add", "rule", "inet", "%s" % TABLE_NAME, "%s_%s" % (table, _zone), "position", rule_handle] else: rule = ["delete", "rule", "inet", "%s" % TABLE_NAME, "%s_%s" % (table, _zone)] rule += ["%%ICMP%%", ibi_target] rules.append(rule) if self._fw.zone.query_icmp_block_inversion(zone): if self._fw.get_log_denied() != "off": if enable: # FIXME: can we get rid of position ? rule = ["add", "rule", "inet", "%s" % TABLE_NAME, "%s_%s" % (table, _zone), "position", rule_handle] else: rule = ["delete", "rule", "inet", "%s" % TABLE_NAME, "%s_%s" % (table, _zone)] rule += ["%%ICMP%%", "%%LOGTYPE%%", "log", "prefix", "\"%s_%s_ICMP_BLOCK: \"" % (table, _zone)] rules.append(rule) return rules def build_rpfilter_rules(self, log_denied=False): rules = [] rules.append(["insert", "rule", "inet", "%s" % TABLE_NAME, "raw_%s" % "PREROUTING", "meta", "nfproto", "ipv6", "fib", "saddr", ".", "iif", "oif", "missing", "drop"]) if log_denied != "off": rules.append(["insert", "rule", "inet", "%s" % TABLE_NAME, "raw_%s" % "PREROUTING", "meta", "nfproto", "ipv6", "fib", "saddr", ".", "iif", "oif", "missing", "log", "prefix", "\"rpfilter_DROP: \""]) rules.append(["insert", "rule", "inet", "%s" % TABLE_NAME, "raw_%s" % "PREROUTING", "icmpv6", "type", "{ nd-router-advert, nd-neighbor-solicit }", "accept"]) # RHBZ#1058505, RHBZ#1575431 (bug in kernel 4.16-4.17) return rules def build_zone_rich_source_destination_rules(self, enable, zone, rich_rule): table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [] rule_fragment += self._rich_rule_family_fragment(rich_rule.family) rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rules = [] rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) return rules def is_ipv_supported(self, ipv): if ipv in ["ipv4", "ipv6", "eb"]: return True return False def _set_type_fragment(self, ipv, type): ipv_addr = { "ipv4" : "ipv4_addr", "ipv6" : "ipv6_addr", } types = { "hash:ip" : [ipv_addr[ipv]], "hash:ip,port" : [ipv_addr[ipv], ". inet_proto", ". inet_service"], "hash:ip,port,ip" : [ipv_addr[ipv], ". inet_proto", ". inet_service .", ipv_addr[ipv]], "hash:ip,port,net" : [ipv_addr[ipv], ". inet_proto", ". inet_service .", ipv_addr[ipv]], "hash:ip,mark" : [ipv_addr[ipv], ". mark"], "hash:net" : [ipv_addr[ipv]], "hash:net,port" : [ipv_addr[ipv], ". inet_proto", ". inet_service"], "hash:net,port,ip" : [ipv_addr[ipv], ". inet_proto", ". inet_service .", ipv_addr[ipv]], "hash:net,port,net" : [ipv_addr[ipv], ". inet_proto", ". inet_service .", ipv_addr[ipv]], "hash:net,iface" : [ipv_addr[ipv], ". ifname"], "hash:mac" : ["ether_addr"], } try: return ["type"] + types[type] + [";"] except KeyError: raise FirewallError(INVALID_TYPE, "ipset type name '%s' is not valid" % type) def set_create(self, name, type, options=None): if options and "family" in options and options["family"] == "inet6": ipv = "ipv6" else: ipv = "ipv4" cmd = [name, "{"] cmd += self._set_type_fragment(ipv, type) if options: if "timeout" in options: cmd += ["timeout", options["timeout"]+ "s", ";"] if "maxelem" in options: cmd += ["size", options["maxelem"], ";"] # flag "interval" currently does not work with timeouts or # concatenations. See rhbz 1576426, 1576430. if (not options or "timeout" not in options) \ and "," not in type: # e.g. hash:net,port cmd += ["flags", "interval", ";"] cmd += ["}"] for family in ["inet", "ip", "ip6"]: self.__run(["add", "set", family, TABLE_NAME] + cmd) def set_destroy(self, name): for family in ["inet", "ip", "ip6"]: self.__run(["delete", "set", family, TABLE_NAME, name]) def _set_entry_fragment(self, name, entry): # convert something like # 1.2.3.4,sctp:8080 (type hash:ip,port) # to # 1.2.3.4 . sctp . 8080 type_format = self._fw.ipset.get_type(name).split(":")[1].split(",") entry_tokens = entry.split(",") if len(type_format) != len(entry_tokens): raise FirewallError(INVALID_ENTRY, "Number of values does not match ipset type.") fragment = [] for i in range(len(type_format)): if type_format[i] == "port": try: index = entry_tokens[i].index(":") except ValueError: # no protocol means default tcp fragment += ["tcp", ".", entry_tokens[i]] else: fragment += [entry_tokens[i][:index], ".", entry_tokens[i][index+1:]] else: fragment.append(entry_tokens[i]) fragment.append(".") return fragment[:-1] # snip last concat operator def set_add(self, name, entry): for family in ["inet", "ip", "ip6"]: self.__run(["add", "element", family, TABLE_NAME, name, "{"] + self._set_entry_fragment(name, entry) + ["}"]) def set_delete(self, name, entry): for family in ["inet", "ip", "ip6"]: self.__run(["delete", "element", family, TABLE_NAME, name, "{"] + self._set_entry_fragment(name, entry) + ["}"]) def set_flush(self, name): for family in ["inet", "ip", "ip6"]: self.__run(["flush", "set", family, TABLE_NAME, name]) def _set_get_family(self, name): ipset = self._fw.ipset.get_ipset(name) if ipset.type == "hash:mac": family = "ether" elif ipset.options and "family" in ipset.options \ and ipset.options["family"] == "inet6": family = "ip6" else: family = "ip" return family PK[YL;;)site-packages/firewall/core/fw_direct.pyonu[ c`c@sdgZddlmZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z defd YZd S( tFirewallDirecti(tLastUpdatedOrderedDict(t ipXtables(tebtables(tFirewallTransaction(tlog(terrors(t FirewallErrorcBsdeZdZdZdZdZdZdZdZd$dZ dZ d Z d$d Z d Zd Zd ZdZd$dZd$dZdZdZdZd$dZd$dZdZdZdZdZdZdZd$dZd$dZ dZ!dZ"d Z#d!Z$d"Z%d#Z&RS(%cCs||_|jdS(N(t_fwt_FirewallDirect__init_vars(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt__init__'s cCs d|j|j|j|jfS(Ns%s(%r, %r, %r)(t __class__t_chainst_rulest_rule_priority_positions(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt__repr__+scCs1i|_i|_i|_i|_d|_dS(N(RRRt _passthroughstNonet_obj(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt __init_vars/s     cCs|jdS(N(R (R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pytcleanup6scCs t|jS(N(RR(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pytnew_transaction;scCs ||_dS(N(R(R tobj((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pytset_permanent_config@scCs|t|jt|jt|jdkr3tSt|jjt|jjt|jjdkrxtSt S(Ni( tlenRRRtTrueRtget_all_chainst get_all_rulestget_all_passthroughstFalse(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pythas_configurationCs /%cCsu|dkr|j}n|}|j|jj|jj|jjf||dkrq|jtndS(N( RRt set_configRRRRtexecuteR(R tuse_transactiont transaction((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt apply_directLs   c Csi}i}i}xi|jD]^}|\}}xI|j|D]:}|jj|||s<|j|gj|q<q<WqWx|jD]}|\}}}xl|j|D]]\} } |jj|||| | s||krt||dddg}||kr:ttjd||fndS(Ntipv4tipv6tebs'%s' not in '%s'(RRt INVALID_IPV(R R/tipvs((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt _check_ipvs  cCsf|j||dkr(tjjn tjj}||krbttjd||fndS(NR>R?s'%s' not in '%s'(sipv4sipv6(RCRtBUILT_IN_CHAINStkeysRRRt INVALID_TABLE(R R/R0ttables((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt_check_ipv_tables    cCs|dkrJtj|}|jjr.i}qd|jj|j|}ntj|}tj|}||krtt j d|n||krtt j d|n|dkr|jj j |dk rtt jd|qndS(NR>R?schain '%s' is built-in chainschain '%s' is reservedsChain '%s' is reserved(sipv4sipv6(sipv4sipv6(RRDRtnftables_enabledtget_direct_backend_by_ipvt our_chainsRt OUR_CHAINSRRt BUILTIN_CHAINtzonetzone_from_chainRt INVALID_CHAIN(R R/R0R1tbuilt_in_chainsRK((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt_check_builtin_chains"            cCsc|r%|jj|gj|n:|j|j|t|j|dkr_|j|=ndS(Ni(RR'R(tremoveR(R R.R1tadd((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt_register_chains cCsZ|dkr|j}n|}|jt|||||dkrV|jtndS(N(RRt_chainRR"(R R/R0R1R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR7s   cCsZ|dkr|j}n|}|jt|||||dkrV|jtndS(N(RRRVRR"R(R R/R0R1R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt remove_chains   cCsO|j|||j|||||f}||jkoN||j|kS(N(RHRRR(R R/R0R1R.((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR&s  cCs:|j||||f}||jkr6|j|SgS(N(RHR(R R/R0R.((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt get_chainss   cCsXg}xK|jD]@}|\}}x+|j|D]}|j|||fq0WqW|S(N(RR((R trtkeyR/R0R1((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyRs  cCs`|dkr|j}n|}|jt|||||||dkr\|jtndS(N(RRt_ruleRR"(R R/R0R1R3R4R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR:s   cCs`|dkr|j}n|}|jt|||||||dkr\|jtndS(N(RRR[RR"R(R R/R0R1R3R4R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt remove_rule s   cCsE|j|||||f}||jkoD||f|j|kS(N(RHR(R R/R0R1R3R4R2((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR)scCsI|j|||||f}||jkrEt|j|jSgS(N(RHRtlistRE(R R/R0R1R2((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt get_ruless c Csmg}x`|jD]U}|\}}}x=|j|D].\}}|j||||t|fq3WqW|S(N(RR(R](R RYRZR/R0R1R3R4((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR%s *cCs|r||jkr(t|j|R?s %s_directit_directs"rule '%s' already is in '%s:%s:%s'srule '%s' is not in '%s:%s:%s'ii(sipv4sipv6(RHRRIRNtcreate_zone_base_by_chainRJtis_chain_builtinRRRtALREADY_ENABLEDt NOT_ENABLEDRtsortedRERR:t build_ruleRatadd_fail(R R`R/R0R1R3R4R$RVtbackendR2R_tindext positionstj((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR[{sL         (%% cCs"|j|||j|||||f}|r|||jkr||j|krttjd|||fqnD||jks||j|krttjd|||fn|jj|}|j ||j ||||j ||||j |j ||| dS(Ns chain '%s' already is in '%s:%s'schain '%s' is not in '%s:%s'( RHRRRRRRqRrRRJt add_rulestbuild_chain_rulesRURu(R RTR/R0R1R$R.Rv((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyRVs$   c Csn|j|t|}|rc||jkr||j|krttjd||fqnA||jks||j|krttjd||fn|jj|}|r|j ||dkr|j |\}}|r|r|jj j |||qn|} n|j |} |j|| |j||||j|j||| dS(Nspassthrough '%s', '%s'R>R?(sipv4sipv6(RCRlRRRRqRrRRJtcheck_passthroughtpassthrough_parse_table_chainRNRotreverse_passthroughR:RiRu( R R`R/R4R$t tuple_argsRvR0R1t_args((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyRjs0        N('t__name__t __module__R RR RRRR RR%R5R6R!RCRHRRRUR7RWR&RXRR:R\R)R^RRaRhRiR;RkR*RRmR[RVRj(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR&sH          '              _ N(t__all__tfirewall.fw_typesRt firewall.coreRRtfirewall.core.fw_transactionRtfirewall.core.loggerRtfirewallRtfirewall.errorsRtobjectR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyts PK[e&$$%site-packages/firewall/core/ipset.pycnu[ c`c @sdZdddgZddlZddlmZddlmZddlm Z dd l m Z dd l m Z mZdd lmZd Zd ddddddddddg Zidd6dd6dd6dd6Zidd6d d6d!d6Zdefd"YZd#Zd$ZdS(%sThe ipset command wrappertipsettcheck_ipset_nametremove_default_create_optionsiN(terrors(t FirewallError(trunProg(tlog(ttempFiletreadfile(tCOMMANDSi shash:ips hash:ip,portshash:ip,port,ipshash:ip,port,nets hash:ip,markshash:nets hash:net,nets hash:net,portshash:net,port,netshash:net,ifaceshash:macs inet|inet6tfamilytvaluethashsizetmaxelems value in secsttimeouttinett1024t65536cBseZdZdZdZdZdZdZddZ dZ dZ d Z dd Z ddd Zd Zdd ZdddZdZdZdZdZRS(sipset command wrapper classcCstd|_d|_dS(NR(R t_commandtname(tself((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt__init__Js cCsg|D]}d|^q}tjd|j|jdj|t|j|\}}|dkrtd|jdj||fn|S(sCall ipset with argss%ss %s: %s %st is'%s %s' failed: %s(Rtdebug2t __class__RtjoinRt ValueError(Rtargstitemt_argststatustret((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt__runNs%  cCs/t|tkr+ttjd|ndS(sCheck ipset namesipset name '%s' is not validN(tlentIPSET_MAXNAMELENRRt INVALID_NAME(RR((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt check_nameYs cCsg}d}y|jdg}Wn$tk rH}tjd|nX|j}t}x{|D]s}|r|jjdd}|d|kr|dt kr|j |dqn|j drbt }qbqbW|S(s?Return types that are supported by the ipset command and kernelts--helpsipset error: %siisSupported set types:N( t _ipset__runRRtdebug1t splitlinestFalsetstriptsplittNonet IPSET_TYPEStappendt startswithtTrue(RRtoutputtextlinestin_typestlinetsplits((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pytset_supported_types_s     cCs;t|tks|tkr7ttjd|ndS(sCheck ipset types!ipset type name '%s' is not validN(R!R"R-RRt INVALID_TYPE(Rt type_name((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt check_typets cCs|j||j|d||g}t|trxF|jD]5\}}|j||dkrE|j|qEqEWn|j|S(s+Create an ipset with name, type and optionstcreateR%(R$R:t isinstancetdicttitemsR.R&(Rtset_nameR9toptionsRtkeytval((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_createzs    cCs |j||jd|gS(Ntdestroy(R$R&(RR?((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_destroys cCsd||g}|j|S(Ntadd(R&(RR?tentryR((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pytset_addscCsd||g}|j|S(Ntdel(R&(RR?RGR((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_deletescCs?d||g}|r2|jddj|n|j|S(Nttests%sR(R.RR&(RR?RGR@R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRKscCsKdg}|r|j|n|r5|j|n|j|jdS(Ntlists (R.textendR&R+(RR?R@R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pytset_lists  c Cs|jddg}i}d}}i}x|D]z}t|dkrPq2ng|jddD]}|j^qc}t|dkrq2q2|ddkr|d}q2|ddkr|d}q2|dd kr2|dj} d} xz| t| kro| | } | dkrbt| | krK| d7} | | || R.twriteRtclosetoststatRRRRRtst_sizeRtgetDebugLogLevelRt Exceptiontdebug3tendswithtunlinkR(RR?R9tentriestcreate_optionst entry_optionst temp_fileRRARBRGRfRRR[R5((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_restoresV              #  cCs,dg}|r|j|n|j|S(Ntflush(R.R&(RR?R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyt set_flushs cCs|jd||gS(Ntrename(R&(Rt old_set_namet new_set_name((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRt scCs|jd||gS(Ntswap(R&(Rt set_name_1t set_name_2((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRwscCs|jdgS(Ntversion(R&(R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRzsN(t__name__t __module__t__doc__RR&R$R7R:R,RCRERHRJRKRNR]R^RqRsRtRwRz(((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRGs&         ' 7   cCst|tkrtStS(s"Return true if ipset name is valid(R!R"R)R0(R((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRscCsK|j}x8tD]0}||krt|||kr||=qqW|S(s( Return only non default create options (tcopytIPSET_DEFAULT_CREATE_OPTIONS(R@RXR\((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyRs    (R}t__all__tos.pathRetfirewallRtfirewall.errorsRtfirewall.core.progRtfirewall.core.loggerRtfirewall.functionsRRtfirewall.configR R"R-tIPSET_CREATE_OPTIONSRtobjectRRR(((s7/usr/lib/python2.7/site-packages/firewall/core/ipset.pyts@     PK[~N +site-packages/firewall/core/fw_policies.pyonu[ c`c@ssdgZddlmZddlmZddlmZddlmZddlm Z de fdYZ dS( tFirewallPoliciesi(tconfig(tlog(tLockdownWhitelist(terrors(t FirewallErrorcBsGeZdZdZdZdZdZdZdZRS(cCst|_ttj|_dS(N(tFalset _lockdownRRtLOCKDOWN_WHITELISTtlockdown_whitelist(tself((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyt__init__s cCsd|j|j|jfS(Ns %s(%r, %r)(t __class__RR (R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyt__repr__#scCst|_|jjdS(N(RRR tcleanup(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyR's cCs|dkrCtjd||jj|r tjdtSn|dkrtjd||jj|r tjdtSn|dkrtjd||jj|r tjd tSnC|d kr tjd ||jj|r tjd tSnt S( Ntcontexts#Doing access check for context "%s"scontext matches.tuidsDoing access check for uid %ds uid matches.tusers Doing access check for user "%s"s user matches.tcommands#Doing access check for command "%s"scommand matches.( Rtdebug2R t match_contexttdebug3tTruet match_uidt match_usert match_commandR(R tkeytvalue((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyt access_check-s*        cCs+|jrttjdnt|_dS(Nsenable_lockdown()(RRRtALREADY_ENABLEDR(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pytenable_lockdownDs cCs+|jsttjdnt|_dS(Nsdisable_lockdown()(RRRt NOT_ENABLEDR(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pytdisable_lockdownIs cCs|jS(N(R(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pytquery_lockdownNs( t__name__t __module__R R RRRR R!(((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyRs      N( t__all__tfirewallRtfirewall.core.loggerRt#firewall.core.io.lockdown_whitelistRRtfirewall.errorsRtobjectR(((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyts PK[H H )site-packages/firewall/core/fw_helper.pycnu[ c`c@sIdZdgZddlmZddlmZdefdYZdS(shelper backendtFirewallHelperi(terrors(t FirewallErrorcBsbeZdZdZdZdZdZdZdZdZ dZ d Z RS( cCs||_i|_dS(N(t_fwt_helpers(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt__init__s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt__repr__"scCs|jjdS(N(Rtclear(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pytcleanup'scCs+||jkr'ttj|ndS(N(t get_helpersRRtINVALID_HELPER(Rtname((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt check_helper*scCs||jkS(N(R (RR((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt query_helper.scCst|jjS(N(tsortedRtkeys(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyR 1scCst|jdkS(Ni(tlenR(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt has_helpers4scCs|j||j|S(N(RR(RR((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt get_helper7s cCs||j|js( t__name__t __module__RR R RRR RRRR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyRs         N(t__doc__t__all__tfirewallRtfirewall.errorsRtobjectR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyts PK[D#site-packages/firewall/core/prog.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import subprocess __all__ = ["runProg"] def runProg(prog, argv=None, stdin=None): if argv is None: argv = [] args = [prog] + argv input_string = None if stdin: with open(stdin, 'r') as handle: input_string = handle.read().encode() env = {'LANG': 'C'} try: process = subprocess.Popen(args, stdin=subprocess.PIPE, stderr=subprocess.STDOUT, stdout=subprocess.PIPE, close_fds=True, env=env) except OSError: return (255, '') (output, err_output) = process.communicate(input_string) output = output.decode('utf-8', 'replace') return (process.returncode, output) PK[zz"site-packages/firewall/core/fw.pycnu[ c`c@sdgZddlZddlZddlZddlZddlZddlmZddlm Z ddl m Z ddl m Z ddl m Z ddl mZdd l mZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#ddl$m%Z%ddl&m'Z'ddl(m)Z)ddl*m+Z+ddl,m-Z-m.Z.ddl/m0Z0ddl1m2Z2ddlm3Z3ddl4m5Z5de6fdYZ7dS(tFirewalliN(tconfig(t functions(t ipXtables(tebtables(tnftables(tipset(tmodules(tFirewallIcmpType(tFirewallService(t FirewallZone(tFirewallDirect(tFirewallConfig(tFirewallPolicies(t FirewallIPSet(tFirewallTransaction(tFirewallHelper(tlog(tfirewalld_conf(tDirect(tservice_reader(ticmptype_reader(t zone_readertZone(t ipset_reader(t helper_reader(terrors(t FirewallErrorcBseZdZdZdZdZdZdZeedZ dZ edZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZedZedZedZedZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)ed&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4RS(1cCs@ttj|_tj||_t|_g|_ tj ||_ t|_ g|_ tj|_t|_tj|_t|_g|_tj||_t|_tj|_t||_t||_t||_t ||_!t"||_t#|_$t%||_t&||_'|j(dS(N()RRtFIREWALLD_CONFt_firewalld_confRt ip4tablestip4tables_backendtTruetip4tables_enabledtip4tables_supported_icmp_typest ip6tablestip6tables_backendtip6tables_enabledtip6tables_supported_icmp_typesRtebtables_backendtebtables_enabledRt ipset_backendt ipset_enabledtipset_supported_typesRtnftables_backendtnftables_enabledRtmodules_backendRticmptypeR tserviceR tzoneR tdirectR R tpoliciesRRthelpert_Firewall__init_vars(tself((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt__init__?s0         cCshd|j|j|j|j|j|j|j|j|j|j |j |j |j |j |j|jfS(Ns>%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)(t __class__R!R%R(t_statet_panict _default_zonet_module_refcountt_markst _min_marktcleanup_on_exittipv6_rpfilter_enabledR*t_individual_callst _log_deniedt_automatic_helpers(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt__repr__]scCsd|_t|_d|_i|_g|_tj|_tj |_ tj |_ tj |_tj|_tj|_tj|_d|_tj|_dS(NtINITti(R9tFalseR:R;R<R=RtFALLBACK_MINIMAL_MARKR>tFALLBACK_CLEANUP_ON_EXITR?tFALLBACK_IPV6_RPFILTERR@tFALLBACK_INDIVIDUAL_CALLSRAtFALLBACK_LOG_DENIEDRBtFALLBACK_AUTOMATIC_HELPERSRCtFALLBACK_FIREWALL_BACKENDt_firewall_backendtnf_conntrack_helper_settingtFALLBACK_ALLOW_ZONE_DRIFTINGt_allow_zone_drifting(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt __init_varsfs             cCs|jS(N(RA(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytindividual_callswscCs|jr=d|jdjkr=tjdt|_n|jrzd|jdjkrztjdt|_n|jrd|jdjkrtjdt|_n|j r|j r|j rtj dt j d ndS( Ntfiltertipv4s-iptables not usable, disabling IPv4 firewall.tipv6s.ip6tables not usable, disabling IPv6 firewall.tebs8ebtables not usable, disabling ethernet bridge firewall.sNo IPv4 and IPv6 firewall.i( R!tget_backend_by_ipvtget_available_tablesRtwarningRGR%R(R-tfataltsystexit(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt _check_tableszs            cCsy|jjWn0tk rCtjdt|_g|_nX|jj|_|j j |j j s|j j rtjdqtjdt|_ n|j r|j j|_n g|_|jj |jj s|jj rtjdqtjdt|_n|jr7|jj|_n g|_|jj |jj s|jj rutjdqtjdt|_n|jr|j r|jj rtjdndS( Ns4ipset not usable, disabling ipset usage in firewall.sFiptables-restore is missing, using individual calls for IPv4 firewall.sCiptables-restore and iptables are missing, disabling IPv4 firewall.sGip6tables-restore is missing, using individual calls for IPv6 firewall.sEip6tables-restore and ip6tables are missing, disabling IPv6 firewall.sHebtables-restore is missing, using individual calls for bridge firewall.sEebtables-restore and ebtables are missing, disabling bridge firewall.sSebtables-restore is not supporting the --noflush option, will therefore not be used(R)tset_listt ValueErrorRR[RGR*R+tset_supported_typesRt fill_existstrestore_command_existstcommand_existsR!tsupported_icmp_typesR"R$R%R&R'R(RAtrestore_noflush_optiontdebug1(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt _start_checksD                        cCsw tj}tjdtjy|jjWn-tk r\}tj|tjdnX|jj dr|jj d}n|jj drt |jj d|_ n|jj dr|jj d}|dk r|j d<krt|_ntjd|jn|jj d r|jj d }|dk r|j d=krtjd y|jjWqtk rqXqn|jj d r|jj d }|dk r|j d>krt|_n|j d?krt|_qqn|jrtjdn tjd|jj dr|jj d}|dk r|j d@krtjdt|_qn|jj dr|jj d}|dks|j dkrd|_q|j |_tjd|jn|jj dr|jj d}|dk r|j dAkrId|_n-|j dBkrgd |_n|j |_tjd|jqn|jj dr|jj d}|j dCkrt|_nt|_tjdtjd|jn|jjtj|j|j|j|jtjdy|jjjWn]tk r}|jj rtj!d|jjj"|qtjd|jjj"|nX|jj#tj|j|j$tj%d|j$tj&d|j$tj'd|j$tj(dt)|j*j+dkrGtj!dn|j$tj,d |j$tj-d |j$tj.d!|j$tj/d!t)|j0j1dkrtj!d"n|j$tj2d#|j$tj3d#t)|j4j5dkrtj6d$t7j8d%nt}xEd&d'd(gD]4}||j4j5kr2tj6d)|t}q2q2W|rt7j8d%n||j4j5krd*|j4j5krd*}n$d+|j4j5krd+}nd&}tj!d,|||}ntjd-|t9tj:} t;j<j=tj:rxtjd.tj:y| jWqxtk rt}tj!d/tj:|qxXn|j>j?| |jj@tj| |jAd0gt\} }| dkrtjd1|n|jd2krtBjC|jd kntBjD|_E|jFtjGdkr>tHjH} ntI|} |jJd3| |rf|s~|jKr|jLjMr| jNt| jOn|r|rtjd4|jPjQn|jRd3| | jNt| jO|jKr |jLjMr tjd5|jLjSntjd6|jTd3| tjd7|j4jUd3| |jV||_W|j4jXd|jWd3| | jNt| jO|j>jYr: tjd8|j>jZ| y| jNt| jOWq: tk r# } t| j[d9| j\r | j\nd:q: tk r6 q: Xn~ tjGd%krs tHjH}tj]d;|| ndS(DNs"Loading firewalld config file '%s's0Using fallback firewalld configuration settings.t DefaultZonet MinimalMarkt CleanupOnExittnotfalsesCleanupOnExit is set to '%s'tLockdowntyesttruesLockdown is enabledt IPv6_rpfiltersIPv6 rpfilter is enabledsIPV6 rpfilter is disabledtIndividualCallssIndividualCalls is enabledt LogDeniedtoffsLogDenied is set to '%s'tAutomaticHelperssAutomaticHelpers is set to '%s'tAllowZoneDriftingsAllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.s AllowZoneDrifting is set to '%s'sLoading lockdown whitelists*Failed to load lockdown whitelist '%s': %sRR/isNo icmptypes found.R4R0sNo services found.R1sNo zones found.itblocktdropttrustedsZone '%s' is not available.tpublictexternals+Default zone '%s' is not valid. Using '%s'.sUsing default zone '%s'sLoading direct rules file '%s's)Failed to load direct rules file '%s': %st nf_conntracks&Failed to load nf_conntrack module: %stsystemtuse_transactionsUnloading firewall modulessApplying ipsetssApplying default rule setsApplying used zoness2Applying direct chains rules and passthrough ruless Direct: %sRFs%Flushing and applying took %f seconds(RmRn(syesRq(RmRn(syesRq(syesRq(RmRn(syesRq(RmRn(^Rt FALLBACK_ZONERRhRRtreadt ExceptionR[tgettintR>tNonetlowerRGR?R3tenable_lockdownRR@R RARBRCRRtset_firewalld_conftcopytdeepcopyt_select_firewall_backendRORitlockdown_whitelisttquery_lockdownterrortfilenamet set_policiest_loadertFIREWALLD_IPSETStETC_FIREWALLD_IPSETStFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPEStlenR/t get_icmptypestFIREWALLD_HELPERStETC_FIREWALLD_HELPERStFIREWALLD_SERVICEStETC_FIREWALLD_SERVICESR0t get_servicestFIREWALLD_ZONEStETC_FIREWALLD_ZONESR1t get_zonesR\R]R^RtFIREWALLD_DIRECTtostpathtexistsR2tset_permanent_configt set_directthandle_modulesRtset_nf_conntrack_helper_settingtget_nf_conntrack_helper_settingRPR_tgetDebugLogLevelttimeRtflushR*Rt has_ipsetstexecutetclearR.tunload_firewall_modulestapply_default_tablest apply_ipsetstapply_default_rulest apply_zonest check_zoneR;tchange_default_zonethas_configurationt apply_directtcodetmsgtdebug2(R6treloadtcomplete_reloadt default_zoneRtvalueRtzR1tobjtstatusttm1t transactiontettm2((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt_startsR                                                      +   cCsUy|jWn*tk r:d|_|jdnXd|_|jddS(NtFAILEDtACCEPTtRUNNING(RRR9t set_policy(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytstarts    c Cstjj|sdS|r|jtjr}|dkr}t}tjj||_|j |j||_t |_ qt }nx[t tj |D]D}|jds|jtjr|dkrtjjd||fr|jd||f|dtqqnd||f}tjd||yP|dkrAt||}|j|jjkr|jj|j}tjd||j|j|j|jj|jn!|jjtjrt|_ ny|jj|Wn3tk r$} tjd|jt| fnX|jjtj|nE|d krt||}|j|j j!kr|j j"|j}tjd||j|j|j|j j#|jn!|jjtjrt|_ n|j j$||jj$tj|nx|dkrt%||d |}|rzdtjj|tjj|d d !f|_|j |jntj|} |j|j&j'kr#|j&j(|j}|j&j)|j|j*rtjd ||j|||j+|qMtjd||j|j|jn*|jjtjrMt|_ t| _ n|jj,| |rtjd ||j|||j+|q|j&j,|n|dkrt-||}|j|j.j/kr"|j.j0|j}tjd||j|j|j|j.j1|jn!|jjtjrCt|_ ny|j.j2|Wn3tk r} tj3d|jt| fnX|jj2tj|n|dkrvt4||}|j|j5j6kr)|j5j7|j}tjd||j|j|j|j5j8|jn!|jjtjrJt|_ n|j5j9||jj9tj|ntj:d|Wqtk r} tj;d||| qt<k rtj;d||tj=qXqW|r|j*r|j|j&j'kr|j&j(|j}tjd||j|j|jy|j&j)|jWnt<k rlnX|jj>|jn|j&j,|ndS(NR1s.xmls%s/%stcombinesLoading %s file '%s'R/s Overloads %s '%s' ('%s/%s')s%s: %s, ignoring for run-time.R0t no_check_nameiis Combining %s '%s' ('%s/%s')RR4sUnknown reader type %ssFailed to load %s file '%s': %ssFailed to load %s file '%s':s0 Overloading and deactivating %s '%s' ('%s/%s')(?RRtisdirt startswithRt ETC_FIREWALLDRtbasenametnamet check_nameRGtdefaulttsortedtlistdirtendswithRR RRhRR/Rt get_icmptypeRtremove_icmptypet add_icmptypeRtinfo1tstrRRRR0Rt get_servicetremove_servicet add_serviceRR1Rtget_zonet remove_zonetcombinedRtadd_zoneRRt get_ipsetst get_ipsett remove_ipsett add_ipsetR[RR4t get_helperst get_helpert remove_helpert add_helperR\RRt exceptiont forget_zone( R6Rt reader_typeRt combined_zoneRRRtorig_objRt config_objR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs                                                cCs|jj|jj|jj|jj|jj|jj|jj|jj|j j|j dS(N( R/tcleanupR0R1RR4RR2R3RR5(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRls         cCs>|jr0|j|jd|jjn|jdS(NR(R?RRR.RR(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytstopxs    cCs=|j}x||jkr(|d7}q W|jj||S(Ni(R>R=tappend(R6ti((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytnew_marks  cCs|jj|dS(N(R=tremove(R6tmark((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytdel_marksc Cs"d}d}x t|D]\}}|rF|jj|\}}n4|j|dkrbd}n|jj|\}}|dkr|d7}||7}qn|r|jj|d|j|cd7|j|jn|jrZ|j|jn|jrv|j|jn|S(N( R-RR,R!RR%R$R(R'(R6tbackends((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytenabled_backendss    cCszg}|jr"|j|jn|jr>|j|jn|jrZ|j|jn|jrv|j|jn|S(N( R!RRR%R$R(R'R-R,(R6R ((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs    cCsn|dkrt|}n|}x*|jD]}|j||jq.W|dkrj|jtndS(N(RRR t add_rulestbuild_default_tablesRR (R6RRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs  cCs3|dkrt|}n|}x6|jD](}|j|j}|j||q.W|jdr|jd}|jrd|j kr|j t |j |j |j}|j||y|j t Wn#tk r}tjd|nX|j qn|dkr/|j t ndS(NRWtraws+Applying rules for ipv6_rpfilter failed: %s(RRR tbuild_default_rulesRBRR RYR@RZRR Rtbuild_rpfilter_rulesRRR[(R6RRRtrulest ipv6_backendR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRs*     cCs|dkrt|}n|}tjdx0|jD]"}|j}|j||q;W|dkr}|jtndS(NsFlushing rule set( RRRRhRtbuild_flush_rulesRRR (R6RRRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR+s    cCs|dkrt|}n|}tjd|x3|jD]%}|j|}|j||q>W|dkr|jtndS(NsSetting policy to '%s'( RRRRhR tbuild_set_policy_rulesRRR (R6tpolicyRRRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR:s  cCs^|s dS|j|}|s8ttjd|n|j|sKdS|j||jS(NRFs'%s' is not a valid backend(RRRRR tset_ruleRB(R6t backend_nametruleR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRKs c Cs\ttd|}|j|}|sCttjd|n|j|sVdS|js|j s|dkrE|j j rExt |D]\}}y|j ||jWqtk r<}tjtjtj|xLt|| D]:}y |j |j||jWqtk r.qXqW|qXqWtS|j||jSdS(Ns'%s' is not a valid backendRFR(tlistRURRRRRR RARdR'RgRRRBRRRht tracebackt format_excRtreversedt reverse_ruleR t set_rules(R6RRt_rulesRRRR((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyRYs0      cCs|jrttjndS(N(R:RRt PANIC_MODE(R6((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_paniczs cCsV|}| s|dkr(|j}n||jjkrRttj|n|S(NRF(tget_default_zoneR1RRRt INVALID_ZONE(R6R1t_zone((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR~s cCs(tj|s$ttj|ndS(N(RtcheckInterfaceRRtINVALID_INTERFACE(R6t interface((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytcheck_interfacescCs|jj|dS(N(R0t check_service(R6R0((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR+scCs(tj|s$ttj|ndS(N(Rt check_portRRt INVALID_PORT(R6tport((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR,scCsA|sttjn|dkr=ttjd|ndS(Nttcptudptsctptdccps''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}(R/R0R1R2(RRtMISSING_PROTOCOLtINVALID_PROTOCOL(R6tprotocol((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_tcpudps   cCs(tj|s$ttj|ndS(N(RtcheckIPRRt INVALID_ADDR(R6tip((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pytcheck_ipscCs||dkr3tj|sxttj|qxnE|dkrftj|sxttj|qxnttjddS(NRVRWs'%s' not in {'ipv4'|'ipv6'}(Rt checkIPnMaskRRR8t checkIP6nMaskR(R6Rtsource((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_addresss   cCs|jj|dS(N(R/tcheck_icmptype(R6ticmp((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR?scCs]t|ts.td|t|fnt|dkrYttjd|ndS(Ns%s is %s, expected intis#timeout '%d' is not positive number(t isinstanceRt TypeErrorttypeRRt INVALID_VALUE(R6ttimeout((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyt check_timeouts  c Cs9|j}i}x1|jjD] }|jj|d||R?RFRRXRPR\R]R^RdReRgR$Rk(((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyR>sd     7      $    !         K       (8t__all__tos.pathRR]RRRtfirewallRRt firewall.coreRRRRRtfirewall.core.fw_icmptypeRtfirewall.core.fw_serviceR tfirewall.core.fw_zoneR tfirewall.core.fw_directR tfirewall.core.fw_configR tfirewall.core.fw_policiesR tfirewall.core.fw_ipsetRtfirewall.core.fw_transactionRtfirewall.core.fw_helperRtfirewall.core.loggerRtfirewall.core.io.firewalld_confRtfirewall.core.io.directRtfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.zoneRRtfirewall.core.io.ipsetRtfirewall.core.io.helperRRtfirewall.errorsRtobjectR(((s4/usr/lib/python2.7/site-packages/firewall/core/fw.pyts@      PK[H H )site-packages/firewall/core/fw_helper.pyonu[ c`c@sIdZdgZddlmZddlmZdefdYZdS(shelper backendtFirewallHelperi(terrors(t FirewallErrorcBsbeZdZdZdZdZdZdZdZdZ dZ d Z RS( cCs||_i|_dS(N(t_fwt_helpers(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt__init__s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt__repr__"scCs|jjdS(N(Rtclear(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pytcleanup'scCs+||jkr'ttj|ndS(N(t get_helpersRRtINVALID_HELPER(Rtname((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt check_helper*scCs||jkS(N(R (RR((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt query_helper.scCst|jjS(N(tsortedRtkeys(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyR 1scCst|jdkS(Ni(tlenR(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt has_helpers4scCs|j||j|S(N(RR(RR((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyt get_helper7s cCs||j|js( t__name__t __module__RR R RRR RRRR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyRs         N(t__doc__t__all__tfirewallRtfirewall.errorsRtobjectR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_helper.pyts PK[x#site-packages/firewall/core/base.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """Base firewall settings""" DEFAULT_ZONE_TARGET = "{chain}_{zone}" ZONE_TARGETS = [ "ACCEPT", "%%REJECT%%", "DROP", DEFAULT_ZONE_TARGET, "default" ] SHORTCUTS = { "PREROUTING": "PRE", "POSTROUTING": "POST", "INPUT": "IN", "FORWARD_IN": "FWDI", "FORWARD_OUT": "FWDO", "OUTPUT": "OUT", } REJECT_TYPES = { "ipv4": [ "icmp-host-prohibited", "host-prohib", "icmp-net-unreachable", "net-unreach", "icmp-host-unreachable", "host-unreach", "icmp-port-unreachable", "port-unreach", "icmp-proto-unreachable", "proto-unreach", "icmp-net-prohibited", "net-prohib", "tcp-reset", "tcp-rst", "icmp-admin-prohibited", "admin-prohib" ], "ipv6": [ "icmp6-adm-prohibited", "adm-prohibited", "icmp6-no-route", "no-route", "icmp6-addr-unreachable", "addr-unreach", "icmp6-port-unreachable", "port-unreach", "tcp-reset" ] } # ipset types that can be used as a source in zones # The match-set option will be src or src,src according to the # dimension of the ipset. ZONE_SOURCE_IPSET_TYPES = [ "hash:ip", "hash:ip,port", "hash:ip,mark", "hash:net", "hash:net,port", "hash:net,iface", "hash:mac" ] PK[َ:  'site-packages/firewall/core/fw_ifcfg.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """Functions to search for and change ifcfg files""" __all__ = [ "search_ifcfg_of_interface", "ifcfg_set_zone_of_interface" ] import os import os.path from firewall import config from firewall.core.logger import log from firewall.core.io.ifcfg import ifcfg def search_ifcfg_of_interface(interface): """search ifcfg file for the interface in config.IFCFGDIR""" # Return quickly if config.IFCFGDIR does not exist if not os.path.exists(config.IFCFGDIR): return None for filename in sorted(os.listdir(config.IFCFGDIR)): if not filename.startswith("ifcfg-"): continue for ignored in [ ".bak", ".orig", ".rpmnew", ".rpmorig", ".rpmsave", "-range" ]: if filename.endswith(ignored): continue if "." in filename: continue ifcfg_file = ifcfg("%s/%s" % (config.IFCFGDIR, filename)) ifcfg_file.read() if ifcfg_file.get("DEVICE") == interface: return ifcfg_file # Wasn't found above, so assume filename matches the device we want filename = "%s/ifcfg-%s" % (config.IFCFGDIR, interface) if os.path.exists(filename): ifcfg_file = ifcfg(filename) ifcfg_file.read() return ifcfg_file return None def ifcfg_set_zone_of_interface(zone, interface): """Set zone (ZONE=) in the ifcfg file that uses the interface (DEVICE=)""" if zone is None: zone = "" ifcfg_file = search_ifcfg_of_interface(interface) if ifcfg_file is not None and ifcfg_file.get("ZONE") != zone and not \ (ifcfg_file.get("ZONE") is None and zone == ""): log.debug1("Setting ZONE=%s in '%s'" % (zone, ifcfg_file.filename)) ifcfg_file.set("ZONE", zone) ifcfg_file.write() PK[f$f$$site-packages/firewall/core/ipset.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2015-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """The ipset command wrapper""" __all__ = [ "ipset", "check_ipset_name", "remove_default_create_options" ] import os.path from firewall import errors from firewall.errors import FirewallError from firewall.core.prog import runProg from firewall.core.logger import log from firewall.functions import tempFile, readfile from firewall.config import COMMANDS IPSET_MAXNAMELEN = 32 IPSET_TYPES = [ # bitmap and set types are currently not supported # "bitmap:ip", # "bitmap:ip,mac", # "bitmap:port", # "list:set", "hash:ip", "hash:ip,port", "hash:ip,port,ip", "hash:ip,port,net", "hash:ip,mark", "hash:net", "hash:net,net", "hash:net,port", "hash:net,port,net", "hash:net,iface", "hash:mac", ] IPSET_CREATE_OPTIONS = { "family": "inet|inet6", "hashsize": "value", "maxelem": "value", "timeout": "value in secs", #"counters": None, #"comment": None, } IPSET_DEFAULT_CREATE_OPTIONS = { "family": "inet", "hashsize": "1024", "maxelem": "65536", } class ipset(object): """ipset command wrapper class""" def __init__(self): self._command = COMMANDS["ipset"] self.name = "ipset" def __run(self, args): """Call ipset with args""" # convert to string list _args = ["%s" % item for item in args] log.debug2("%s: %s %s", self.__class__, self._command, " ".join(_args)) (status, ret) = runProg(self._command, _args) if status != 0: raise ValueError("'%s %s' failed: %s" % (self._command, " ".join(_args), ret)) return ret def check_name(self, name): """Check ipset name""" if len(name) > IPSET_MAXNAMELEN: raise FirewallError(errors.INVALID_NAME, "ipset name '%s' is not valid" % name) def set_supported_types(self): """Return types that are supported by the ipset command and kernel""" ret = [ ] output = "" try: output = self.__run(["--help"]) except ValueError as ex: log.debug1("ipset error: %s" % ex) lines = output.splitlines() in_types = False for line in lines: #print(line) if in_types: splits = line.strip().split(None, 2) if splits[0] not in ret and splits[0] in IPSET_TYPES: ret.append(splits[0]) if line.startswith("Supported set types:"): in_types = True return ret def check_type(self, type_name): """Check ipset type""" if len(type_name) > IPSET_MAXNAMELEN or type_name not in IPSET_TYPES: raise FirewallError(errors.INVALID_TYPE, "ipset type name '%s' is not valid" % type_name) def set_create(self, set_name, type_name, options=None): """Create an ipset with name, type and options""" self.check_name(set_name) self.check_type(type_name) args = [ "create", set_name, type_name ] if isinstance(options, dict): for key, val in options.items(): args.append(key) if val != "": args.append(val) return self.__run(args) def set_destroy(self, set_name): self.check_name(set_name) return self.__run([ "destroy", set_name ]) def set_add(self, set_name, entry): args = [ "add", set_name, entry ] return self.__run(args) def set_delete(self, set_name, entry): args = [ "del", set_name, entry ] return self.__run(args) def test(self, set_name, entry, options=None): args = [ "test", set_name, entry ] if options: args.append("%s" % " ".join(options)) return self.__run(args) def set_list(self, set_name=None, options=None): args = [ "list" ] if set_name: args.append(set_name) if options: args.extend(options) return self.__run(args).split("\n") def set_get_active_terse(self): """ Get active ipsets (only headers) """ lines = self.set_list(options=["-terse"]) ret = { } _name = _type = None _options = { } for line in lines: if len(line) < 1: continue pair = [ x.strip() for x in line.split(":", 1) ] if len(pair) != 2: continue elif pair[0] == "Name": _name = pair[1] elif pair[0] == "Type": _type = pair[1] elif pair[0] == "Header": splits = pair[1].split() i = 0 while i < len(splits): opt = splits[i] if opt in [ "family", "hashsize", "maxelem", "timeout", "netmask" ]: if len(splits) > i: i += 1 _options[opt] = splits[i] else: log.error("Malformed ipset list -terse output: %s", line) return { } i += 1 if _name and _type: ret[_name] = (_type, remove_default_create_options(_options)) _name = _type = None _options.clear() return ret def save(self, set_name=None): args = [ "save" ] if set_name: args.append(set_name) return self.__run(args) def set_restore(self, set_name, type_name, entries, create_options=None, entry_options=None): self.check_name(set_name) self.check_type(type_name) temp_file = tempFile() if ' ' in set_name: set_name = "'%s'" % set_name args = [ "create", set_name, type_name, "-exist" ] if create_options: for key, val in create_options.items(): args.append(key) if val != "": args.append(val) temp_file.write("%s\n" % " ".join(args)) temp_file.write("flush %s\n" % set_name) for entry in entries: if ' ' in entry: entry = "'%s'" % entry if entry_options: temp_file.write("add %s %s %s\n" % \ (set_name, entry, " ".join(entry_options))) else: temp_file.write("add %s %s\n" % (set_name, entry)) temp_file.close() stat = os.stat(temp_file.name) log.debug2("%s: %s restore %s", self.__class__, self._command, "%s: %d" % (temp_file.name, stat.st_size)) args = [ "restore" ] (status, ret) = runProg(self._command, args, stdin=temp_file.name) if log.getDebugLogLevel() > 2: try: readfile(temp_file.name) except Exception: pass else: i = 1 for line in readfile(temp_file.name): log.debug3("%8d: %s" % (i, line), nofmt=1, nl=0) if not line.endswith("\n"): log.debug3("", nofmt=1) i += 1 os.unlink(temp_file.name) if status != 0: raise ValueError("'%s %s' failed: %s" % (self._command, " ".join(args), ret)) return ret def set_flush(self, set_name): args = [ "flush" ] if set_name: args.append(set_name) return self.__run(args) def rename(self, old_set_name, new_set_name): return self.__run([ "rename", old_set_name, new_set_name ]) def swap(self, set_name_1, set_name_2): return self.__run([ "swap", set_name_1, set_name_2 ]) def version(self): return self.__run([ "version" ]) def check_ipset_name(name): """Return true if ipset name is valid""" if len(name) > IPSET_MAXNAMELEN: return False return True def remove_default_create_options(options): """ Return only non default create options """ _options = options.copy() for opt in IPSET_DEFAULT_CREATE_OPTIONS: if opt in _options and \ IPSET_DEFAULT_CREATE_OPTIONS[opt] == _options[opt]: del _options[opt] return _options PK[~N +site-packages/firewall/core/fw_policies.pycnu[ c`c@ssdgZddlmZddlmZddlmZddlmZddlm Z de fdYZ dS( tFirewallPoliciesi(tconfig(tlog(tLockdownWhitelist(terrors(t FirewallErrorcBsGeZdZdZdZdZdZdZdZRS(cCst|_ttj|_dS(N(tFalset _lockdownRRtLOCKDOWN_WHITELISTtlockdown_whitelist(tself((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyt__init__s cCsd|j|j|jfS(Ns %s(%r, %r)(t __class__RR (R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyt__repr__#scCst|_|jjdS(N(RRR tcleanup(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyR's cCs|dkrCtjd||jj|r tjdtSn|dkrtjd||jj|r tjdtSn|dkrtjd||jj|r tjd tSnC|d kr tjd ||jj|r tjd tSnt S( Ntcontexts#Doing access check for context "%s"scontext matches.tuidsDoing access check for uid %ds uid matches.tusers Doing access check for user "%s"s user matches.tcommands#Doing access check for command "%s"scommand matches.( Rtdebug2R t match_contexttdebug3tTruet match_uidt match_usert match_commandR(R tkeytvalue((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyt access_check-s*        cCs+|jrttjdnt|_dS(Nsenable_lockdown()(RRRtALREADY_ENABLEDR(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pytenable_lockdownDs cCs+|jsttjdnt|_dS(Nsdisable_lockdown()(RRRt NOT_ENABLEDR(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pytdisable_lockdownIs cCs|jS(N(R(R ((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pytquery_lockdownNs( t__name__t __module__R R RRRR R!(((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyRs      N( t__all__tfirewallRtfirewall.core.loggerRt#firewall.core.io.lockdown_whitelistRRtfirewall.errorsRtobjectR(((s=/usr/lib/python2.7/site-packages/firewall/core/fw_policies.pyts PK[\ }XuXu#site-packages/firewall/core/rich.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2013-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "Rich_Source", "Rich_Destination", "Rich_Service", "Rich_Port", "Rich_Protocol", "Rich_Masquerade", "Rich_IcmpBlock", "Rich_IcmpType", "Rich_SourcePort", "Rich_ForwardPort", "Rich_Log", "Rich_Audit", "Rich_Accept", "Rich_Reject", "Rich_Drop", "Rich_Mark", "Rich_Limit", "Rich_Rule" ] from firewall import functions from firewall.core.ipset import check_ipset_name from firewall.core.base import REJECT_TYPES from firewall import errors from firewall.errors import FirewallError class Rich_Source(object): def __init__(self, addr, mac, ipset, invert=False): self.addr = addr if self.addr == "": self.addr = None self.mac = mac if self.mac == "" or self.mac is None: self.mac = None elif self.mac is not None: self.mac = self.mac.upper() self.ipset = ipset if self.ipset == "": self.ipset = None self.invert = invert if self.addr is None and self.mac is None and self.ipset is None: raise FirewallError(errors.INVALID_RULE, "no address, mac and ipset") def __str__(self): ret = 'source%s ' % (" NOT" if self.invert else "") if self.addr is not None: return ret + 'address="%s"' % self.addr elif self.mac is not None: return ret + 'mac="%s"' % self.mac elif self.ipset is not None: return ret + 'ipset="%s"' % self.ipset else: raise FirewallError(errors.INVALID_RULE, "no address, mac and ipset") class Rich_Destination(object): def __init__(self, addr, invert=False): self.addr = addr self.invert = invert def __str__(self): return 'destination %saddress="%s"' % ("not " if self.invert else "", self.addr) class Rich_Service(object): def __init__(self, name): self.name = name def __str__(self): return 'service name="%s"' % (self.name) class Rich_Port(object): def __init__(self, port, protocol): self.port = port self.protocol = protocol def __str__(self): return 'port port="%s" protocol="%s"' % (self.port, self.protocol) class Rich_SourcePort(Rich_Port): def __str__(self): return 'source-port port="%s" protocol="%s"' % (self.port, self.protocol) class Rich_Protocol(object): def __init__(self, value): self.value = value def __str__(self): return 'protocol value="%s"' % (self.value) class Rich_Masquerade(object): def __init__(self): pass def __str__(self): return 'masquerade' class Rich_IcmpBlock(object): def __init__(self, name): self.name = name def __str__(self): return 'icmp-block name="%s"' % (self.name) class Rich_IcmpType(object): def __init__(self, name): self.name = name def __str__(self): return 'icmp-type name="%s"' % (self.name) class Rich_ForwardPort(object): def __init__(self, port, protocol, to_port, to_address): self.port = port self.protocol = protocol self.to_port = to_port self.to_address = to_address # replace None with "" in to_port and/or to_address if self.to_port is None: self.to_port = "" if self.to_address is None: self.to_address = "" def __str__(self): return 'forward-port port="%s" protocol="%s"%s%s' % \ (self.port, self.protocol, ' to-port="%s"' % self.to_port if self.to_port != "" else '', ' to-addr="%s"' % self.to_address if self.to_address != "" else '') class Rich_Log(object): def __init__(self, prefix=None, level=None, limit=None): #TODO check default level in iptables self.prefix = prefix self.level = level self.limit = limit def __str__(self): return 'log%s%s%s' % \ (' prefix="%s"' % (self.prefix) if self.prefix else "", ' level="%s"' % (self.level) if self.level else "", " %s" % self.limit if self.limit else "") class Rich_Audit(object): def __init__(self, limit=None): #TODO check default level in iptables self.limit = limit def __str__(self): return 'audit%s' % (" %s" % self.limit if self.limit else "") class Rich_Accept(object): def __init__(self, limit=None): self.limit = limit def __str__(self): return "accept%s" % (" %s" % self.limit if self.limit else "") class Rich_Reject(object): def __init__(self, _type=None, limit=None): self.type = _type self.limit = limit def __str__(self): return "reject%s%s" % (' type="%s"' % self.type if self.type else "", " %s" % self.limit if self.limit else "") def check(self, family): if self.type: if not family: raise FirewallError(errors.INVALID_RULE, "When using reject type you must specify also rule family.") if family in ['ipv4', 'ipv6'] and \ self.type not in REJECT_TYPES[family]: valid_types = ", ".join(REJECT_TYPES[family]) raise FirewallError(errors.INVALID_RULE, "Wrong reject type %s.\nUse one of: %s." % (self.type, valid_types)) class Rich_Drop(Rich_Accept): def __str__(self): return "drop%s" % (" %s" % self.limit if self.limit else "") class Rich_Mark(object): def __init__(self, _set, limit=None): self.set = _set self.limit = limit def __str__(self): return "mark set=%s%s" % (self.set, " %s" % self.limit if self.limit else "") def check(self): if self.set is not None: x = self.set else: raise FirewallError(errors.INVALID_MARK, "no value set") if "/" in x: splits = x.split("/") if len(splits) != 2: raise FirewallError(errors.INVALID_MARK, x) if not functions.checkUINT32(splits[0]) or \ not functions.checkUINT32(splits[1]): # value and mask are uint32 raise FirewallError(errors.INVALID_MARK, x) else: if not functions.checkUINT32(x): # value is uint32 raise FirewallError(errors.INVALID_MARK, x) class Rich_Limit(object): def __init__(self, value): self.value = value if "/" in self.value: splits = self.value.split("/") if len(splits) == 2 and \ splits[1] in [ "second", "minute", "hour", "day" ]: self.value = "%s/%s" % (splits[0], splits[1][:1]) def check(self): splits = None if "/" in self.value: splits = self.value.split("/") if not splits or len(splits) != 2: raise FirewallError(errors.INVALID_LIMIT, self.value) (rate, duration) = splits try: rate = int(rate) except: raise FirewallError(errors.INVALID_LIMIT, self.value) if rate < 1 or duration not in [ "s", "m", "h", "d" ]: raise FirewallError(errors.INVALID_LIMIT, self.value) mult = 1 if duration == "s": mult = 1 elif duration == "m": mult = 60 elif duration == "h": mult = 60*60 elif duration == "d": mult = 24*60*60 if 10000 * mult / rate == 0: raise FirewallError(errors.INVALID_LIMIT, "%s too fast" % self.value) if rate == 1 and duration == "d": # iptables (v1.4.21) doesn't accept 1/d raise FirewallError(errors.INVALID_LIMIT, "%s too slow" % self.value) def __str__(self): return 'limit value="%s"' % (self.value) def command(self): return '' class Rich_Rule(object): def __init__(self, family=None, rule_str=None): if family is not None: self.family = str(family) else: self.family = None self.source = None self.destination = None self.element = None self.log = None self.audit = None self.action = None if rule_str: self._import_from_string(rule_str) def _lexer(self, rule_str): """ Lexical analysis """ tokens = [] for r in functions.splitArgs(rule_str): if "=" in r: attr = r.split('=') if len(attr) != 2 or not attr[0] or not attr[1]: raise FirewallError(errors.INVALID_RULE, 'internal error in _lexer(): %s' % r) tokens.append({'attr_name':attr[0], 'attr_value':attr[1]}) else: tokens.append({'element':r}) tokens.append({'element':'EOL'}) return tokens def _import_from_string(self, rule_str): if not rule_str: raise FirewallError(errors.INVALID_RULE, 'empty rule') self.family = None self.source = None self.destination = None self.element = None self.log = None self.audit = None self.action = None tokens = self._lexer(rule_str) if tokens and tokens[0].get('element') == 'EOL': raise FirewallError(errors.INVALID_RULE, 'empty rule') attrs = {} # attributes of elements in_elements = [] # stack with elements we are in index = 0 # index into tokens while not (tokens[index].get('element') == 'EOL' and in_elements == ['rule']): element = tokens[index].get('element') attr_name = tokens[index].get('attr_name') attr_value = tokens[index].get('attr_value') #print ("in_elements: ", in_elements) #print ("index: %s, element: %s, attribute: %s=%s" % (index, element, attr_name, attr_value)) if attr_name: # attribute if attr_name not in ['family', 'address', 'mac', 'ipset', 'invert', 'value', 'port', 'protocol', 'to-port', 'to-addr', 'name', 'prefix', 'level', 'type', 'set']: raise FirewallError(errors.INVALID_RULE, "bad attribute '%s'" % attr_name) else: # element if element in ['rule', 'source', 'destination', 'protocol', 'service', 'port', 'icmp-block', 'icmp-type', 'masquerade', 'forward-port', 'source-port', 'log', 'audit', 'accept', 'drop', 'reject', 'mark', 'limit', 'not', 'NOT', 'EOL']: if element == 'source' and self.source: raise FirewallError(errors.INVALID_RULE, "more than one 'source' element") elif element == 'destination' and self.destination: raise FirewallError(errors.INVALID_RULE, "more than one 'destination' element") elif element in ['protocol', 'service', 'port', 'icmp-block', 'icmp-type', 'masquerade', 'forward-port', 'source-port'] and self.element: raise FirewallError(errors.INVALID_RULE, "more than one element. There cannot be both '%s' and '%s' in one rule." % (element, self.element)) elif element == 'log' and self.log: raise FirewallError(errors.INVALID_RULE, "more than one 'log' element") elif element == 'audit' and self.audit: raise FirewallError(errors.INVALID_RULE, "more than one 'audit' element") elif element in ['accept', 'drop', 'reject', 'mark'] and self.action: raise FirewallError(errors.INVALID_RULE, "more than one 'action' element. There cannot be both '%s' and '%s' in one rule." % (element, self.action)) else: raise FirewallError(errors.INVALID_RULE, "unknown element %s" % element) in_element = in_elements[len(in_elements)-1] if len(in_elements) > 0 else '' if in_element == '': if not element and attr_name: if attr_name == 'family': raise FirewallError(errors.INVALID_RULE, "'family' outside of rule. Use 'rule family=...'.") else: raise FirewallError(errors.INVALID_RULE, "'%s' outside of any element. Use 'rule %s= ...'." % (attr_name, attr_name)) elif 'rule' not in element: raise FirewallError(errors.INVALID_RULE, "'%s' outside of rule. Use 'rule ... %s ...'." % (element, element)) else: in_elements.append('rule') # push into stack elif in_element == 'rule': if attr_name == 'family': if attr_value not in ['ipv4', 'ipv6']: raise FirewallError(errors.INVALID_RULE, "'family' attribute cannot have '%s' value. Use 'ipv4' or 'ipv6' instead." % attr_value) self.family = attr_value elif attr_name: if attr_name == 'protocol': err_msg = "wrong 'protocol' usage. Use either 'rule protocol value=...' or 'rule [forward-]port protocol=...'." else: err_msg = "attribute '%s' outside of any element. Use 'rule %s= ...'." % (attr_name, attr_name) raise FirewallError(errors.INVALID_RULE, err_msg) else: in_elements.append(element) # push into stack elif in_element == 'source': if attr_name in ['address', 'mac', 'ipset', 'invert']: attrs[attr_name] = attr_value elif element in ['not', 'NOT']: attrs['invert'] = True else: self.source = Rich_Source(attrs.get('address'), attrs.get('mac'), attrs.get('ipset'), attrs.get('invert', False)) in_elements.pop() # source attrs.clear() index = index -1 # return token to input elif in_element == 'destination': if attr_name in ['address', 'invert']: attrs[attr_name] = attr_value elif element in ['not', 'NOT']: attrs['invert'] = True else: self.destination = Rich_Destination(attrs.get('address'), attrs.get('invert')) in_elements.pop() # destination attrs.clear() index = index -1 # return token to input elif in_element == 'protocol': if attr_name == 'value': self.element = Rich_Protocol(attr_value) in_elements.pop() # protocol else: raise FirewallError(errors.INVALID_RULE, "invalid 'protocol' element") elif in_element == 'service': if attr_name == 'name': self.element = Rich_Service(attr_value) in_elements.pop() # service else: raise FirewallError(errors.INVALID_RULE, "invalid 'service' element") elif in_element == 'port': if attr_name in ['port', 'protocol']: attrs[attr_name] = attr_value else: self.element = Rich_Port(attrs.get('port'), attrs.get('protocol')) in_elements.pop() # port attrs.clear() index = index -1 # return token to input elif in_element == 'icmp-block': if attr_name == 'name': self.element = Rich_IcmpBlock(attr_value) in_elements.pop() # icmp-block else: raise FirewallError(errors.INVALID_RULE, "invalid 'icmp-block' element") elif in_element == 'icmp-type': if attr_name == 'name': self.element = Rich_IcmpType(attr_value) in_elements.pop() # icmp-type else: raise FirewallError(errors.INVALID_RULE, "invalid 'icmp-type' element") elif in_element == 'masquerade': self.element = Rich_Masquerade() in_elements.pop() attrs.clear() index = index -1 # return token to input elif in_element == 'forward-port': if attr_name in ['port', 'protocol', 'to-port', 'to-addr']: attrs[attr_name] = attr_value else: self.element = Rich_ForwardPort(attrs.get('port'), attrs.get('protocol'), attrs.get('to-port'), attrs.get('to-addr')) in_elements.pop() # forward-port attrs.clear() index = index -1 # return token to input elif in_element == 'source-port': if attr_name in ['port', 'protocol']: attrs[attr_name] = attr_value else: self.element = Rich_SourcePort(attrs.get('port'), attrs.get('protocol')) in_elements.pop() # source-port attrs.clear() index = index -1 # return token to input elif in_element == 'log': if attr_name in ['prefix', 'level']: attrs[attr_name] = attr_value elif element == 'limit': in_elements.append('limit') else: self.log = Rich_Log(attrs.get('prefix'), attrs.get('level'), attrs.get('limit')) in_elements.pop() # log attrs.clear() index = index -1 # return token to input elif in_element == 'audit': if element == 'limit': in_elements.append('limit') else: self.audit = Rich_Audit(attrs.get('limit')) in_elements.pop() # audit attrs.clear() index = index -1 # return token to input elif in_element == 'accept': if element == 'limit': in_elements.append('limit') else: self.action = Rich_Accept(attrs.get('limit')) in_elements.pop() # accept attrs.clear() index = index -1 # return token to input elif in_element == 'drop': if element == 'limit': in_elements.append('limit') else: self.action = Rich_Drop(attrs.get('limit')) in_elements.pop() # drop attrs.clear() index = index -1 # return token to input elif in_element == 'reject': if attr_name == 'type': attrs[attr_name] = attr_value elif element == 'limit': in_elements.append('limit') else: self.action = Rich_Reject(attrs.get('type'), attrs.get('limit')) in_elements.pop() # accept attrs.clear() index = index -1 # return token to input elif in_element == 'mark': if attr_name == 'set': attrs[attr_name] = attr_value elif element == 'limit': in_elements.append('limit') else: self.action = Rich_Mark(attrs.get('set'), attrs.get('limit')) in_elements.pop() # accept attrs.clear() index = index -1 # return token to input elif in_element == 'limit': if attr_name == 'value': attrs['limit'] = Rich_Limit(attr_value) in_elements.pop() # limit else: raise FirewallError(errors.INVALID_RULE, "invalid 'limit' element") index = index + 1 self.check() def check(self): if self.family is not None and self.family not in [ "ipv4", "ipv6" ]: raise FirewallError(errors.INVALID_FAMILY, self.family) if self.family is None: if (self.source is not None and self.source.addr is not None) or \ self.destination is not None: raise FirewallError(errors.MISSING_FAMILY) if type(self.element) == Rich_ForwardPort: raise FirewallError(errors.MISSING_FAMILY) if self.element is None: if self.action is None: raise FirewallError(errors.INVALID_RULE, "no element, no action") if self.source is None and self.destination is None: raise FirewallError(errors.INVALID_RULE, "no element, no source, no destination") if type(self.element) not in [ Rich_IcmpBlock, Rich_ForwardPort, Rich_Masquerade ]: if self.log is None and self.audit is None and \ self.action is None: raise FirewallError(errors.INVALID_RULE, "no action, no log, no audit") # source if self.source is not None: if self.source.addr is not None: if self.family is None: raise FirewallError(errors.INVALID_FAMILY) if self.source.mac is not None: raise FirewallError(errors.INVALID_RULE, "address and mac") if self.source.ipset is not None: raise FirewallError(errors.INVALID_RULE, "address and ipset") if not functions.check_address(self.family, self.source.addr): raise FirewallError(errors.INVALID_ADDR, str(self.source.addr)) elif self.source.mac is not None: if self.source.ipset is not None: raise FirewallError(errors.INVALID_RULE, "mac and ipset") if not functions.check_mac(self.source.mac): raise FirewallError(errors.INVALID_MAC, str(self.source.mac)) elif self.source.ipset is not None: if not check_ipset_name(self.source.ipset): raise FirewallError(errors.INVALID_IPSET, str(self.source.ipset)) else: raise FirewallError(errors.INVALID_RULE, "invalid source") # destination if self.destination is not None: if self.family is None: raise FirewallError(errors.INVALID_FAMILY) if self.destination.addr is None or \ not functions.check_address(self.family, self.destination.addr): raise FirewallError(errors.INVALID_ADDR, str(self.destination.addr)) # service if type(self.element) == Rich_Service: # service availability needs to be checked in Firewall, here is no # knowledge about this, therefore only simple check if self.element.name is None or len(self.element.name) < 1: raise FirewallError(errors.INVALID_SERVICE, str(self.element.name)) # port elif type(self.element) == Rich_Port: if not functions.check_port(self.element.port): raise FirewallError(errors.INVALID_PORT, self.element.port) if self.element.protocol not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, self.element.protocol) # protocol elif type(self.element) == Rich_Protocol: if not functions.checkProtocol(self.element.value): raise FirewallError(errors.INVALID_PROTOCOL, self.element.value) # masquerade elif type(self.element) == Rich_Masquerade: if self.action is not None: raise FirewallError(errors.INVALID_RULE, "masquerade and action") if self.source is not None and self.source.mac is not None: raise FirewallError(errors.INVALID_RULE, "masquerade and mac source") # icmp-block elif type(self.element) == Rich_IcmpBlock: # icmp type availability needs to be checked in Firewall, here is no # knowledge about this, therefore only simple check if self.element.name is None or len(self.element.name) < 1: raise FirewallError(errors.INVALID_ICMPTYPE, str(self.element.name)) if self.action: raise FirewallError(errors.INVALID_RULE, "icmp-block and action") # icmp-type elif type(self.element) == Rich_IcmpType: # icmp type availability needs to be checked in Firewall, here is no # knowledge about this, therefore only simple check if self.element.name is None or len(self.element.name) < 1: raise FirewallError(errors.INVALID_ICMPTYPE, str(self.element.name)) # forward-port elif type(self.element) == Rich_ForwardPort: if not functions.check_port(self.element.port): raise FirewallError(errors.INVALID_PORT, self.element.port) if self.element.protocol not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, self.element.protocol) if self.element.to_port == "" and self.element.to_address == "": raise FirewallError(errors.INVALID_PORT, self.element.to_port) if self.element.to_port != "" and \ not functions.check_port(self.element.to_port): raise FirewallError(errors.INVALID_PORT, self.element.to_port) if self.element.to_address != "" and \ not functions.check_single_address(self.family, self.element.to_address): raise FirewallError(errors.INVALID_ADDR, self.element.to_address) if self.family is None: raise FirewallError(errors.INVALID_FAMILY) if self.action is not None: raise FirewallError(errors.INVALID_RULE, "forward-port and action") # source-port elif type(self.element) == Rich_SourcePort: if not functions.check_port(self.element.port): raise FirewallError(errors.INVALID_PORT, self.element.port) if self.element.protocol not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, self.element.protocol) # other element and not empty? elif self.element is not None: raise FirewallError(errors.INVALID_RULE, "Unknown element %s" % type(self.element)) # log if self.log is not None: if self.log.level and \ self.log.level not in [ "emerg", "alert", "crit", "error", "warning", "notice", "info", "debug" ]: raise FirewallError(errors.INVALID_LOG_LEVEL, self.log.level) if self.log.limit is not None: self.log.limit.check() # audit if self.audit is not None: if type(self.action) not in [ Rich_Accept, Rich_Reject, Rich_Drop ]: raise FirewallError(errors.INVALID_AUDIT_TYPE, type(self.action)) if self.audit.limit is not None: self.audit.limit.check() # action if self.action is not None: if type(self.action) == Rich_Reject: self.action.check(self.family) elif type(self.action) == Rich_Mark: self.action.check() if self.action.limit is not None: self.action.limit.check() def __str__(self): ret = 'rule' if self.family: ret += ' family="%s"' % self.family if self.source: ret += " %s" % self.source if self.destination: ret += " %s" % self.destination if self.element: ret += " %s" % self.element if self.log: ret += " %s" % self.log if self.audit: ret += " %s" % self.audit if self.action: ret += " %s" % self.action return (functions.u2b(ret)) if functions.PY2 else ret #class Rich_RawRule(object): #class Rich_RuleSet(object): #class Rich_AddressList(object): PK[²]22'site-packages/firewall/core/watcher.pycnu[ c`c@s9dgZddlmZmZdefdYZdS(tWatcheri(tGiotGLibcBskeZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( cCs1||_||_i|_i|_g|_dS(N(t _callbackt_timeoutt _monitorst _timeoutst_blocked(tselftcallbackttimeout((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt__init__s     cCsOtjj|}|jtjjd|j|<|j|jd|j dS(Ntchanged( RtFilet new_for_pathtmonitor_directorytFileMonitorFlagstNONEtNoneRtconnectt_file_changed_cb(Rt directorytgfile((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt add_watch_dir"scCsOtjj|}|jtjjd|j|<|j|jd|j dS(NR ( RR Rt monitor_fileRRRRRR(RtfilenameR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pytadd_watch_file(scCs |jjS(N(Rtkeys(R((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt get_watches.scCs ||jkS(N(R(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt has_watch1scCs|j|=dS(N(R(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt remove_watch4scCs&||jkr"|jj|ndS(N(Rtappend(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt block_source7scCs&||jkr"|jj|ndS(N(Rtremove(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pytunblock_source;scCsBx;t|jjD]$}tj|j||j|=qWdS(N(tlistRRRt source_remove(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pytclear_timeouts?scCs-||jkr|j|n|j|=dS(N(RRR(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt_call_callbackDscCs|j}||jkrO||jkrKtj|j||j|=ndS|tjjks|tjjks|tjj ks|tjj kr||jkrtj|j||j|=ntj |j |j ||j|s PK[²]22'site-packages/firewall/core/watcher.pyonu[ c`c@s9dgZddlmZmZdefdYZdS(tWatcheri(tGiotGLibcBskeZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( cCs1||_||_i|_i|_g|_dS(N(t _callbackt_timeoutt _monitorst _timeoutst_blocked(tselftcallbackttimeout((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt__init__s     cCsOtjj|}|jtjjd|j|<|j|jd|j dS(Ntchanged( RtFilet new_for_pathtmonitor_directorytFileMonitorFlagstNONEtNoneRtconnectt_file_changed_cb(Rt directorytgfile((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt add_watch_dir"scCsOtjj|}|jtjjd|j|<|j|jd|j dS(NR ( RR Rt monitor_fileRRRRRR(RtfilenameR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pytadd_watch_file(scCs |jjS(N(Rtkeys(R((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt get_watches.scCs ||jkS(N(R(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt has_watch1scCs|j|=dS(N(R(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt remove_watch4scCs&||jkr"|jj|ndS(N(Rtappend(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt block_source7scCs&||jkr"|jj|ndS(N(Rtremove(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pytunblock_source;scCsBx;t|jjD]$}tj|j||j|=qWdS(N(tlistRRRt source_remove(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pytclear_timeouts?scCs-||jkr|j|n|j|=dS(N(RRR(RR((s9/usr/lib/python2.7/site-packages/firewall/core/watcher.pyt_call_callbackDscCs|j}||jkrO||jkrKtj|j||j|=ndS|tjjks|tjjks|tjj ks|tjj kr||jkrtj|j||j|=ntj |j |j ||j|s PK[*<<'site-packages/firewall/core/fw_zone.pyonu[ c`c@s$ddlZddlmZmZmZddlmZddlmZm Z m Z m Z m Z m Z mZmZmZddlmZmZmZmZmZmZmZmZmZmZmZddlmZmZddl m!Z!ddl"m#Z#dd l$m%Z%d e&fd YZ'dS( iN(t SHORTCUTStDEFAULT_ZONE_TARGETtZONE_SOURCE_IPSET_TYPES(tlog( tportStrt checkIPnMaskt checkIP6nMaskt checkProtocoltenable_ip_forwardingtcheck_single_addresst check_mactportInPortRangetget_nf_conntrack_short_name( t Rich_Rulet Rich_Acceptt Rich_Markt Rich_Servicet Rich_Portt Rich_ProtocoltRich_MasqueradetRich_ForwardPorttRich_SourcePorttRich_IcmpBlockt Rich_IcmpType(tFirewallTransactiontFirewallZoneTransaction(terrors(t FirewallError(tLastUpdatedOrderedDictt FirewallZonecBsxeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z dd Zd ZdZddZdZddZdZdZddZddZddZdZdZdZdZdZdddZdZ ddZ!ddZ"dd Z#d!Z$d"Z%d#Z&d$Z'd%Z(ddd&Z)d'Z*dd(Z+dd)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2d0Z3d1ddd2Z4d3Z5dd4Z6dd5Z7d6Z8d7Z9d8Z:d9Z;d1ddd:Z<d;Z=dd<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDd1dddCZEdDZFddEZGdFZHdGZIdHZJdIZKdJZLd1dddKZMdLZNddMZOdNZPdOZQdPZRdQZSd1dddRZTdSZUddTZVdUZWdVZXdWZYdXZZd1dddYZ[dZZ\dd[Z]d\Z^d]Z_ddd^Z`ddd_Zaddd1ddd`ZbdaZcddddbZddcZeddddZfdeZgdfZhdgZid1dddhZjdiZkddjZldkZmdlZndmZodnZpdddoZqdpZrdqZsddrZtdsZudtZvduZwexdvZydwZzdxZ{dyZ|dzZ}d{Z~d|Zd}Zd~ZdZdZdZdZddddZdZdZRS(cCs||_i|_i|_dS(N(t_fwt_chainst_zones(tselftfw((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__init__(s  cCsd|j|j|jfS(Ns %s(%r, %r)(t __class__RR (R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__repr__-scCs|jj|jjdS(N(RtclearR (R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytcleanup0s cCs t|jS(N(RR(R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytnew_transaction6scCst|j|S(N(RR(R!tzone((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytnew_zone_transaction9scCst|jjS(N(tsortedR tkeys(R!((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt get_zones>scCsE|j|}x/|jD]$}||j|jdkr|SqWdS(Nt interfaces(t_FirewallZone__interface_idR tsettingstNone(R!t interfacet interface_idR)((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_zone_of_interfaceAs cCsE|j|}x/|jD]$}||j|jdkr|SqWdS(Ntsources(t_FirewallZone__source_idR R0R1(R!tsourcet source_idR)((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_zone_of_sourceIs cCs|jj|}|j|S(N(Rt check_zoneR (R!R)tz((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_zoneQscOsQy||||Wn6tk rL}t|}tjd||fnXdS(Ns%s: %s(RtstrRtwarning(R!tftnametargstkwargsterrortmsg((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt_error2warningUs  c CsHddddddddd d d d g D|_||j|j^s R.R5tservicestportst masqueradet forward_portst source_portst icmp_blockstrulest protocolsticmp_block_inversion(R0R R@(R!tobj((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytadd_zone]scCsA|j|}|jr&|j|n|jj|j|=dS(N(R tappliedtunapply_zone_settingsR0R&(R!R)RQ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt remove_zonehs    c Cs|dkr|j}n|}x|jD]}|j|}|j|}|jrx|j|j|jd|nt |j dkst |j dkrt |_ ntjd|jx0|jD]%}|j|j|j|d|qWx0|jD]%}|j|j|jd||qWx0|jD]%}|j|j|j|d|q1Wx0|jD]%}|j|j|jd||qdWx0|jD]%}|j|j|j|d|qWx0|jD]%}|j|j|jd||qW|jr|j|j|jd|nx0|jD]%}|j|j|j|d|q%Wx0|j D]%}|j|j |j|d|qXWx0|j D]%}|j|j!|j|d|qW|j r.|j|j"t |j|q.q.W|dkr|j#t ndS(Ntuse_zone_transactionisApplying zone '%s'($R1R(R-R tzone_transactionRPREtadd_icmp_block_inversionR@tlenR.R5tTrueRSRtdebug1RMtadd_icmp_blockRKtadd_forward_portRHt add_serviceRItadd_portROt add_protocolRLtadd_source_portRJtadd_masqueradeRNtadd_rulet add_interfacet add_sourcet_icmp_block_inversiontexecute(R!tuse_transactiont transactionR)RQRWRA((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt apply_zonesos^    *           cCs|j|}||_dS(N(R RS(R!R)RSRQ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytset_zone_applieds cCsd|krdS|jd}t|dkr5dSd}x+tD]#}|dt|krB|}qBqBW|dk r|d|jkrdSt|dkst|dkr|dd kr|d|fSndS( Nt_iiiiRtdenytallow(slogRmRn(R1tsplitRYRR-(R!tchaintsplitst_chainRG((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytzone_from_chains     "c Cs|dkr|j|}|dk r|\}}|dkrN|j}n|}|j|t||fg||dkr|jtqqndS(Ntipv4tipv6(RtRu(RsR1R(tgen_chain_rulesRZRg( R!tipvttableRpRhRGt_zoneRrRi((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytcreate_zone_base_by_chains     cCsx|D]\}}|rD|jj|ij|gj|q|j||j|t|j||dkr|j||=nt|j|dkr|j|=qqWdS(Ni(Rt setdefaulttappendtremoveRY(R!R)tcreatetchainsRxRp((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt_register_chainss+cCs8itjd6|d6|d6}|r4||dRR=(R!R)R0t_objtkeyRARD((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt set_settingss@             (c Cs.|jj|}|j|}|r.|js?| rC|j rCdS|rUt|_n|dkrs|j|}n|}|j|}xd|D]\}xS||D]G} y|dkr|j||| |n|dkrwn|dkr |j d| d} |j |||d| | n|dkrE|j ||| |nx|dkru|j ||| d| d |nH|d kr|j ||| |n#|d kr|j||| d| d |n|d kr|j|||n|d krRd|j d | kr'|j d | d} nd} |j||td| | |nk|dkrw|j||| |nF|dkr|j||| d| d |ntjd||| Wqtk r} tjt| qXqWqW|r|jt|j|n|dkr*|j|ndS(NRMRPRKRtmark_idRHRIiiRORLRJRNRR.R5s3Zone '%s': Unknown setting '%s:%s', unable to apply(RR:R RSRZR1R*Rt _icmp_blockR0t _forward_portt_servicet_portt _protocolt _source_portt _masqueradet_FirewallZone__ruleR t _interfacet_sourceRR>RR=RfR@Rg( R!tenableR)RVRyRQRWR0RRARRD((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__zone_settings sj                        cCs|jt||dS(N(t_FirewallZone__zone_settingsRZ(R!R)RV((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytapply_zone_settings_scCs|jt||dS(N(RtFalse(R!R)RV((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRTbscCsK|j|}t|jdkrGt|jdkrG|j|ndS(Ni(R RYR.R5RT(R!R)RQ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytunapply_zone_settings_if_unusedes *cCst|j|j}|dtkr8d|d|S|dk r]|j||n|j|||}|S(N(RRR4R:R1tremove_interfaceRd(R!R)R2Rt _old_zonet _new_zoneRy((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs   cCs|jj|dkr(|j}n|}|j|}|j|||jt|d|dt|dk r|dkr|j|}|jt|d|dtn|dkr|j tndS(Nt+R|R( RRR1R(RWRRRZRRg(R!told_zonetnew_zoneRhRiRW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytchange_default_zones   c Cs|jj|j|}|dkrAttjd|n|dkrS|n|jj|}||krttjd|||fn|dkr|j |}n|}|j |}|j |}|j t ||||j|j|||dkr|jtn|S(Ns'%s' is not in any zoneRs"remove_interface(%s, %s): zoi='%s'(RRR4R1RRtUNKNOWN_INTERFACER:RR*R R/RRtadd_postRRgRZ( R!R)R2RVtzoiRyRWRR3((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs*   $     cCs(||jdkr$|jd|=ndS(NR.(R0(R!RR3((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__unregister_interfacescCs |j||j|dkS(NR.(R/R(R!R)R2((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytquery_interfacescCs|j|djS(NR.(RR,(R!R)((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR scCst|rdSt|r dSt|r0dS|jdrr|j|d|j|d|j|dSttj |dS(NRtRuRsipset:i( RRR t startswitht_check_ipset_type_for_sourcet_check_ipset_appliedt _ipset_familyRRt INVALID_ADDR(R!R7((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt check_sources   cCs|j|}||fS(N(R(R!R7Rw((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt __source_idsc Cs||jj|jj|}|j|}t|rG|j}n|j|}||jdkrtt j d||fn|j |dk rtt j d|n|dkr|j|}n|}|js|j|d||j|j|tn|jt||d|d||j|||||j|j|||dkrx|jtn|S(NR5s'%s' already bound to '%s's'%s' already bound to a zoneRVii(RRR:R R tupperR6R0RRRR9R1RR*RSRRRkRRRZt_FirewallZone__register_sourcet _FirewallZone__unregister_sourceRg( R!R)R7RRVRyRR8RW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRe s4        ! cCsC|jd||jd|<| p-|dk|jd|d|St|rY|j}n|dk rx|j||n|j|||}|S(N( RRR9R:R RR1t remove_sourceRe(R!R)R7RRRRy((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRLs    c CsE|jjt|r(|j}n|j|}|dkr\ttjd|n|dkrn|n|jj |}||krttj d|||fn|dkr|j |}n|}|j |}|j |}|jt||d|d||j|j|||dkrA|jtn|S(Ns'%s' is not in any zoneRsremove_source(%s, %s): zos='%s'ii(RRR RR9R1RRtUNKNOWN_SOURCER:RR*R R6RRRRRgRZ( R!R)R7RVtzosRyRWRR8((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR^s.    $    ! cCs(||jdkr$|jd|=ndS(NR5(R0(R!RR8((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__unregister_sourcescCs;t|r|j}n|j||j|dkS(NR5(R RR6R(R!R)R7((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt query_sources cCs.g|j|djD]}|d^qS(NR5i(RR,(R!R)tk((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRscCs|jdS(N(tcheck(R!trule((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt check_rulescCs|j|t|S(N(RR=(R!R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt __rule_ids cCs|s dS|jr<t|jr&dSt|jrdSndt|drX|jrXdSt|dr|jr|j|j|j|j|j |jSdS(NRtRutmacRtipset( R1taddrRRthasattrRRRRR(R!R7((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt_rule_source_ipvs cCs|j|||||dS(N(t _rule_prepare(R!RR)RRRW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt__rulesic CsE|jj|}|jj||jj|j|}|j|}||jdkr}ttj d||fn|dkr|j |} n|} t |j tkr|jj} nd} |jr|jt||| | n|j||| ||| j|j||| |dkrA| jtn|S(NRNs'%s' already in '%s'(RR:t check_timeoutRR t_FirewallZone__rule_idR0RRtALREADY_ENABLEDR1R*ttypetelementRtnew_markRSRRZt_FirewallZone__register_ruleRt_FirewallZone__unregister_ruleRg( R!R)RRRRVRyRtrule_idRWR((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRcs*      cCs'|j||d||jd|(R!tmodulesRt_helpersRRt_module_short_namet_helper((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pytget_helpers_for_service_modulesGs$    cCs$|jj||jj|dS(N(Rt check_portt check_tcpudp(R!tporttprotocol((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR ascCs#|j||t|d|fS(Nt-(R R(R!R R ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyt __port_idesc Cs|jj|}|jj||jj|j|}|j||} | |jdkrttj d|||fn|dkr|j |} n|} |j r|j t|||| n|j|| ||| j|j|| |dkr| jtn|S(NRIs'%s:%s' already in '%s'(RR:RRR t_FirewallZone__port_idR0RRRR1R*RSRRZt_FirewallZone__register_portRt_FirewallZone__unregister_portRg( R!R)R R RRRVRyRtport_idRW((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR_is&       cCs!|j|||jd||j|}|tkr:ttjd||fndS(Ns.ipset '%s' with type '%s' not usable as source(t_FirewallZone__ipset_typeRRRt INVALID_IPSET(R!R@t_type((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs  c Csx|r|jj|gn |jjD]}|js@q+nxr|jD]d}x[|j|D]J}|r|j||n|j|||||} |j|| qcWqMWq+WdS(N( Rtget_backend_by_ipvRVRWRXR\R]tbuild_zone_source_address_rulesRZ( R!RR)RwR7RWR[RxRpRN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRs1  cCs |jdk r|jg}n1gddgD]}|jj|r+|^q+}|j|j}|dk r|dkr|jdk r|j|krttjd||jfqq|g}n||_ x t g|D]} |jj | ^qD] } t |j tkr|jjj|j j} g} t| jdkr|jrlttjdnxS|D];}|| jkrs| j|rs| j| j|qsqsWn | jdx| D]} |r |jdd|jjdkr |jd d q nt |jtkr|j| j|}g}x6|D].}|j}t|}|jjdkr.|jd d }|j||jdkr| j|j rqDnt|jd kr|j|qrx|jD]@\}}| j ||||| |j|}|j!| |qWqD|j|krD|j|j|jjd d }|j|qDqDW|j"|nxs| jD]h\}}|rt |jt#kr|jdd n| j$||||| |}|j!| |qWxj| j%D]_}|r:t |jt#kr:|jdd n| j&|||| |}|j!| |qWxs| j'D]h\}}|rt |jt#kr|jdd n| j(||||| |}|j!| |qsWqWqt |j t)kr|j j*}|j j+}|j,|||r<|jddn|rjt |jt#krj|jdd n| j$||||d|}|j!| |qt |j t-kr>|j j.}|j/||r|jddn|rt |jt#kr|jdd n| j&|||d|}|j!| |qt |j t0kr|r|jd d|jddx3|D](}| j|r|j1t2|qqWn| j3|||}|j!| |qt |j t4kr|j j*}|j j+}|j j5}|j j6}xX|D]P}| j|rT|j7|||||n|r#|r#|j1t2|q#q#W|sdnd}|r|jdd |jd d |jd|n| j8||||||||| }|j!| |qt |j t9kr|j j*}|j j+}|j,|||rR|jddn|rt |jt#kr|jdd n| j(||||d|}|j!| |qt |j t:kst |j t;kr |jj<j=|j j}t |j t:kr> |jr> t |jtkr> ttjdn|jr xv|D]k}||jkrN | j| rN ttjdt |j t:kr dnd|j j| jfqN qN Wnd}|r |j|d|j|dn| j>||||}|j!| |q|j dkr |rB |jddn|rp t |jt#krp |jdd n| j?|||}|j!| |qttjdt |j qW|S(NRtRuRs;Source address family '%s' conflicts with rule family '%s'.is"Destination conflict with service.tfiltertINPUTtrawt PREROUTINGt conntracktnatitmanglet POSTROUTINGt FORWARD_OUTt FORWARD_INs'IcmpBlock not usable with accept actionsIcmp%s %s not usable with %stBlocktTypesUnknown element %s(@tfamilyR1Rtis_ipv_enabledRR7RRt INVALID_RULEtipvstsetRkRRRRt get_serviceR@RYt destinationtis_ipv_supportedR|R]RtactionRR RRR treplaceRItbuild_zone_helper_ports_rulesRZt add_modulesRtbuild_zone_ports_rulesROtbuild_zone_protocol_rulesRLtbuild_zone_source_ports_rulesRR R R RtvalueRRRRtbuild_zone_masquerade_rulesRtto_portt to_addressR6tbuild_zone_forward_port_rulesRRRticmptypet get_icmptypetbuild_zone_icmp_block_rulest(build_zone_rich_source_destination_rules(R!RR)RRRWR|Rwt source_ipvRGR[tsvct destinationsRthelpersRRRRt nat_moduleR tprotoRNR R4R5t filter_chaintictRx((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRsH1   2            "                   # c CsJ|jjj|}|j|j|}|r|jjdkrU|jddnVg}x@|D]8}|j|j|jj dd} |j| qbW|j ||jddng} xdd gD]} |jj | sqn|jj | } t |jdkrE| |jkrm| j| |j| fqmq| df| kr| j| dfqqWx| D]\} } |jjdkr|x|D]}|j}t|}|jj dd} |j| |jd kr| j|j rqnt |jd kr'|j|qxK|jD]@\}}| j||||| |j|}|j| |q1WqWnxB|jD]7\}}| j||||| }|j| |qWx9|jD].}| j|||| }|j| |qWxB|jD]7\}}| j||||| }|j| |qWqxWdS( NiRoRpRqRrRmRnRtRuRi(RRR~R RRR]R|RRRRzRkRYRR1R t add_moduleRyRRIRR@RZRRORRLR(R!RR)RRWRRRRRt backends_ipvRwR[RRRR RRNR ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRsd       "  cCsn|r|jddnxN|jjD]=}|js>q)n|j||||}|j||q)WdS(NRmRn(R]RRVRWRRZ(R!RR)R R RWR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR3s  cCsk|r|jddnxK|jjD]:}|js>q)n|j|||}|j||q)WdS(NRmRn(R]RRVRWRRZ(R!RR)R RWR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR?s cCsn|r|jddnxN|jjD]=}|js>q)n|j||||}|j||q)WdS(NRmRn(R]RRVRWRRZ(R!RR)R R RWR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRJs cCsw|r)|jdd|jddnd}|jt||jj|}|j||}|j||dS(NRrRtRmRuRt(R]RRRRkRRZ(R!RR)RWRwR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRUsc Cstd|rd} nd} |s*dnd} |ri|jdd|jdd|jd| n|r|r|jt| n|jj| } | j||| |||||} |j| | dS( NRuRtRnRvRsRpRrRm(R R]RRRRkRRZ( R!RR)RWR R R4R5RRwRR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRas   c Cs|jjj|}|r>|jdd|jddnx|jjD]}|jscqNnt}|jrxBddgD]1}||jkr|j|st }PqqqWn|rqNn|j |||} |j || qNWdS(NRmRnRvRtRu( RRRR]RVRWRRRRZRRZ( R!RR)RARWRR[t skip_backendRwRN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRws$  cCs|j|j}|dkr dS|j| r@|dkr@dS|jdd|jdd|r|j||jnxH|jjD]7}|jsqn|j ||}|j ||qWdS( NtDROPs %%REJECT%%tREJECTtACCEPTRmRnRv(Rs %%REJECT%%R( R ttargetRR]RgR&RRVRWt%build_zone_icmp_block_inversion_rulesRZ(R!RR)RWRR[RN((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyRfs    N(t__name__t __module__R#R%R'R(R*R-R4R9R<RERRRUR1RjRkRsRzRRRRRRRTRRRRR/RdRRRRRRRRR6ReRRRRRRRRRRRcRRRRRRRR^RRRRRR R RR_RRRRRRRR`RR RR"RR$RaR%R(R&R*RR,RbR-R1R.RR6R8R]R9R=R:R?RRBRDR\RERIRFRKRRMRXRNRORTRSRRvRRRRhRfRRRRRRRRRRRRf(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyR's$            <      ) ?       '         &                                                                   (   (           A  ((Rtfirewall.core.baseRRRtfirewall.core.loggerRtfirewall.functionsRRRRRR R R R tfirewall.core.richR RRRRRRRRRRtfirewall.core.fw_transactionRRtfirewallRtfirewall.errorsRtfirewall.fw_typesRtobjectR(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_zone.pyts @LPK[ф$$(site-packages/firewall/core/fw_ipset.pycnu[ c`c@sydZdgZddlmZddlmZddlmZddl m Z ddl m Z de fdYZd S( s ipset backendt FirewallIPSeti(tlog(tremove_default_create_options(tIPSet(terrors(t FirewallErrorcBseZdZdZdZdZdZdZdZe dZ dZ d Z d Z e d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZRS(cCs||_i|_dS(N(t_fwt_ipsets(tselftfw((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt__init__!s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt__repr__%scCs|jjdS(N(Rtclear(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pytcleanup*scCs+||jkr'ttj|ndS(N(t get_ipsetsRRt INVALID_IPSET(Rtname((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt check_ipset-scCs||jkS(N(R(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt query_ipset1scCst|jjS(N(tsortedRtkeys(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyR4scCst|jdkS(Ni(tlenR(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt has_ipsets7scCs4|j||j|}|r0|j|n|S(N(RRtcheck_applied_obj(RRtappliedtobj((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_ipset:s   cGsNy|||Wn6tk rI}t|}tjd||fnXdS(Ns%s: %s(RtstrRtwarning(RtfRtargsterrortmsg((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt_error2warningAs  cCsNg}|jjr(|j|jjn|jjrJ|j|jjn|S(N(Rtnftables_enabledtappendtnftables_backendt ipset_enabledt ipset_backend(Rtbackends((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyR(Is   cCsE|j|jjkr1ttjd|jn||j|jR)(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pytget_typescCs%t|j|dtjjdS(NRt,(RRR>R)tsplit(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_dimensionscCs |j|}|j|dS(N(RR(RRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt check_appliedscCs%|js!ttj|jndS(N(RRRt NOT_APPLIEDR(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyRs cCsB|j|dt}d|jkr>|jddkr>dSndS(NRtfamilytinet6tipv6tipv4(RR>R:(RRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_familys cCs|S(N((RRD((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt __entry_idscCsdS(N((RtenableRRD((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt__entryscCs|j|dt}tj||j|j||jkr\ttj d||fny.x'|j D]}|j |j |qlWWn%t k r}ttj|nEXd|jks|jddkr||jkr|jj|ndS(NRs'%s' already is in '%s'R5R6(RR>Rt check_entryR:R)R?RRtALREADY_ENABLEDR(R@RR.R/R$(RRRDRR2R!((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt add_entrys "cCs|j|dt}||jkrCttjd||fny.x'|jD]}|j|j|qSWWn%t k r}ttj |nEXd|j ks|j ddkr||jkr|jj |ndS(NRs'%s' not in '%s'R5R6( RR>R?RRt NOT_ENABLEDR(t set_deleteRR.R/R:tremove(RRRDRR2R!((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt remove_entrys "cCsY|j|dt}d|jkrL|jddkrLttj|n||jkS(NRR5R6(RR>R:RRtIPSET_WITH_TIMEOUTR?(RRRDR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt query_entrys"cCs|j|dt}|jS(NR(RR>R?(RRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_entriessc Cs|j|dt}x'|D]}tj||j|jqWd|jksa|jddkrm||_ny+x$|jD]}|j|j q}WWn%t k r}t t j |n Xt|_yx|jD]s}|jjs|j dkr'xL|jD]}|j|j |qWq|j|j |j|j|jdqWWn%t k rx}t t j |n Xt|_dS(NRR5R6R7(RR>RRTR:R)R?R(t set_flushRR.RRR/RRR<R@RARB(RRR?RRDR2R!((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt set_entriess. "   (t__name__t __module__R R RRRRRR8RR"R(R,R3RERFRIRJRRPt_FirewallIPSet__entry_idt_FirewallIPSet__entryRVRZR\R]R_(((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyR s2            3          N(t__doc__t__all__tfirewall.core.loggerRtfirewall.core.ipsetRR;tfirewall.core.io.ipsetRtfirewallRtfirewall.errorsRtobjectR(((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyts PK['site-packages/firewall/core/__init__.pynu[PK[Ɵ8C$$%site-packages/firewall/core/helper.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """The helper maxnamelen""" HELPER_MAXNAMELEN = 32 PK[Cnƒ$$'site-packages/firewall/core/ebtables.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "ebtables" ] import os.path from firewall.core.prog import runProg from firewall.core.logger import log from firewall.functions import tempFile, readfile, splitArgs from firewall.config import COMMANDS from firewall.core import ipXtables # some common stuff lives there from firewall.errors import FirewallError, INVALID_IPV import string BUILT_IN_CHAINS = { "broute": [ "BROUTING" ], "nat": [ "PREROUTING", "POSTROUTING", "OUTPUT" ], "filter": [ "INPUT", "OUTPUT", "FORWARD" ], } DEFAULT_RULES = { } LOG_RULES = { } OUR_CHAINS = {} # chains created by firewalld for table in BUILT_IN_CHAINS.keys(): DEFAULT_RULES[table] = [ ] OUR_CHAINS[table] = set() for chain in BUILT_IN_CHAINS[table]: DEFAULT_RULES[table].append("-N %s_direct" % chain) DEFAULT_RULES[table].append("-I %s 1 -j %s_direct" % (chain, chain)) DEFAULT_RULES[table].append("-I %s_direct 1 -j RETURN" % chain) OUR_CHAINS[table].add("%s_direct" % chain) class ebtables(object): ipv = "eb" name = "ebtables" zones_supported = False # ebtables only supported with direct interface def __init__(self): self._command = COMMANDS[self.ipv] self._restore_command = COMMANDS["%s-restore" % self.ipv] self.restore_noflush_option = self._detect_restore_noflush_option() self.concurrent_option = self._detect_concurrent_option() self.fill_exists() self.available_tables = [] def fill_exists(self): self.command_exists = os.path.exists(self._command) self.restore_command_exists = os.path.exists(self._restore_command) def _detect_concurrent_option(self): # Do not change any rules, just try to use the --concurrent option # with -L concurrent_option = "" ret = runProg(self._command, ["--concurrent", "-L"]) if ret[0] == 0: concurrent_option = "--concurrent" # concurrent for ebtables lock return concurrent_option def _detect_restore_noflush_option(self): # Do not change any rules, just try to use the restore command # with --noflush rules = [ ] try: self.set_rules(rules, "off") except ValueError: return False return True def __run(self, args): # convert to string list _args = [ ] if self.concurrent_option and self.concurrent_option not in args: _args.append(self.concurrent_option) _args += ["%s" % item for item in args] log.debug2("%s: %s %s", self.__class__, self._command, " ".join(_args)) (status, ret) = runProg(self._command, _args) if status != 0: raise ValueError("'%s %s' failed: %s" % (self._command, " ".join(args), ret)) return ret def _rule_validate(self, rule): for str in ["%%REJECT%%", "%%ICMP%%", "%%LOGTYPE%%"]: if str in rule: raise FirewallError(INVALID_IPV, "'%s' invalid for ebtables" % str) def is_chain_builtin(self, ipv, table, chain): return table in BUILT_IN_CHAINS and \ chain in BUILT_IN_CHAINS[table] def build_chain_rules(self, add, table, chain): rules = [] if add: rules.append([ "-t", table, "-N", chain ]) rules.append([ "-t", table, "-I", chain, "1", "-j", "RETURN" ]) else: rules.append([ "-t", table, "-X", chain ]) return rules def build_rule(self, add, table, chain, index, args): rule = [ "-t", table ] if add: rule += [ "-I", chain, str(index) ] else: rule += [ "-D", chain ] rule += args return rule def reverse_rule(self, args): return ipXtables.common_reverse_rule(args) def check_passthrough(self, args): ipXtables.common_check_passthrough(args) def reverse_passthrough(self, args): return ipXtables.common_reverse_passthrough(args) def set_rules(self, rules, log_denied): temp_file = tempFile() table = "filter" table_rules = { } for _rule in rules: rule = _rule[:] self._rule_validate(rule) # get table form rule for opt in [ "-t", "--table" ]: try: i = rule.index(opt) except ValueError: pass else: if len(rule) >= i+1: rule.pop(i) table = rule.pop(i) # we can not use joinArgs here, because it would use "'" instead # of '"' for the start and end of the string, this breaks # iptables-restore for i in range(len(rule)): for c in string.whitespace: if c in rule[i] and not (rule[i].startswith('"') and rule[i].endswith('"')): rule[i] = '"%s"' % rule[i] table_rules.setdefault(table, []).append(rule) for table in table_rules: temp_file.write("*%s\n" % table) for rule in table_rules[table]: temp_file.write(" ".join(rule) + "\n") temp_file.close() stat = os.stat(temp_file.name) log.debug2("%s: %s %s", self.__class__, self._restore_command, "%s: %d" % (temp_file.name, stat.st_size)) args = [ ] args.append("--noflush") (status, ret) = runProg(self._restore_command, args, stdin=temp_file.name) if log.getDebugLogLevel() > 2: lines = readfile(temp_file.name) if lines is not None: i = 1 for line in lines: log.debug3("%8d: %s" % (i, line), nofmt=1, nl=0) if not line.endswith("\n"): log.debug3("", nofmt=1) i += 1 os.unlink(temp_file.name) if status != 0: raise ValueError("'%s %s' failed: %s" % (self._restore_command, " ".join(args), ret)) return ret def set_rule(self, rule, log_denied): self._rule_validate(rule) return self.__run(rule) def get_available_tables(self, table=None): ret = [] tables = [ table ] if table else BUILT_IN_CHAINS.keys() for table in tables: if table in self.available_tables: ret.append(table) else: try: self.__run(["-t", table, "-L"]) self.available_tables.append(table) ret.append(table) except ValueError: log.debug1("ebtables table '%s' does not exist." % table) return ret def get_zone_table_chains(self, table): return {} def build_flush_rules(self): rules = [] for table in BUILT_IN_CHAINS.keys(): if table not in self.get_available_tables(): continue # Flush firewall rules: -F # Delete firewall chains: -X # Set counter to zero: -Z for flag in [ "-F", "-X", "-Z" ]: rules.append(["-t", table, flag]) return rules def build_set_policy_rules(self, policy): rules = [] for table in BUILT_IN_CHAINS.keys(): if table not in self.get_available_tables(): continue for chain in BUILT_IN_CHAINS[table]: rules.append(["-t", table, "-P", chain, policy]) return rules def build_default_tables(self): # nothing to do, they always exist return [] def build_default_rules(self, log_denied="off"): default_rules = [] for table in DEFAULT_RULES: if table not in self.get_available_tables(): continue _default_rules = DEFAULT_RULES[table][:] if log_denied != "off" and table in LOG_RULES: _default_rules.extend(LOG_RULES[table]) prefix = [ "-t", table ] for rule in _default_rules: if type(rule) == list: default_rules.append(prefix + rule) else: default_rules.append(prefix + splitArgs(rule)) return default_rules def is_ipv_supported(self, ipv): return ipv == self.ipv PK[`3$site-packages/firewall/core/fw_nm.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """Functions for NetworkManager interaction""" __all__ = [ "check_nm_imported", "nm_is_imported", "nm_get_zone_of_connection", "nm_set_zone_of_connection", "nm_get_connections", "nm_get_connection_of_interface", "nm_get_bus_name", "nm_get_dbus_interface" ] import gi from gi.repository import GLib try: gi.require_version('NM', '1.0') except ValueError: _nm_imported = False else: try: from gi.repository import NM _nm_imported = True except (ImportError, ValueError, GLib.Error): _nm_imported = False _nm_client = None from firewall import errors from firewall.errors import FirewallError from firewall.core.logger import log import dbus def check_nm_imported(): """Check function to raise a MISSING_IMPORT error if the import of NM failed """ if not _nm_imported: raise FirewallError(errors.MISSING_IMPORT, "gi.repository.NM = 1.0") def nm_is_imported(): """Returns true if NM has been properly imported @return True if import was successful, False otherwirse """ return _nm_imported def nm_get_client(): """Returns the NM client object or None if the import of NM failed @return NM.Client instance if import was successful, None otherwise """ global _nm_client if not _nm_client: _nm_client = NM.Client.new(None) return _nm_client def nm_get_zone_of_connection(connection): """Get zone of connection from NM @param connection name @return zone string setting of connection, empty string if not set, None if connection is unknown """ check_nm_imported() con = nm_get_client().get_connection_by_uuid(connection) if con is None: return None setting_con = con.get_setting_connection() if setting_con is None: return None try: if con.get_flags() & (NM.SettingsConnectionFlags.NM_GENERATED | NM.SettingsConnectionFlags.NM_VOLATILE): return "" except AttributeError: # Prior to NetworkManager 1.12, we can only guess # that a connection was generated/volatile. if con.get_unsaved(): return "" zone = setting_con.get_zone() if zone is None: zone = "" return zone def nm_set_zone_of_connection(zone, connection): """Set the zone for a connection @param zone name @param connection name @return True if zone was set, else False """ check_nm_imported() con = nm_get_client().get_connection_by_uuid(connection) if con is None: return False setting_con = con.get_setting_connection() if setting_con is None: return False if zone == "": zone = None setting_con.set_property("zone", zone) return con.commit_changes(True, None) def nm_get_connections(connections, connections_name): """Get active connections from NM @param connections return dict @param connections_name return dict """ connections.clear() connections_name.clear() check_nm_imported() active_connections = nm_get_client().get_active_connections() for active_con in active_connections: # ignore vpn devices for now if active_con.get_vpn(): continue name = active_con.get_id() uuid = active_con.get_uuid() devices = active_con.get_devices() connections_name[uuid] = name for dev in devices: connections[dev.get_iface()] = uuid def nm_get_interfaces(): """Get active interfaces from NM @returns list of interface names """ check_nm_imported() active_interfaces = [] for active_con in nm_get_client().get_active_connections(): # ignore vpn devices for now if active_con.get_vpn(): continue try: con = active_con.get_connection() if con.get_flags() & (NM.SettingsConnectionFlags.NM_GENERATED | NM.SettingsConnectionFlags.NM_VOLATILE): continue except AttributeError: # Prior to NetworkManager 1.12, we can only guess # that a connection was generated/volatile. if con.get_unsaved(): continue for dev in active_con.get_devices(): active_interfaces.append(dev.get_iface()) return active_interfaces def nm_get_interfaces_in_zone(zone): interfaces = [] for interface in nm_get_interfaces(): conn = nm_get_connection_of_interface(interface) if zone == nm_get_zone_of_connection(conn): interfaces.append(interface) return interfaces def nm_get_connection_of_interface(interface): """Get connection from NM that is using the interface @param interface name @returns connection that is using interface or None """ check_nm_imported() device = nm_get_client().get_device_by_iface(interface) if device is None: return None active_con = device.get_active_connection() if active_con is None: return None try: con = active_con.get_connection() if con.get_flags() & NM.SettingsConnectionFlags.NM_GENERATED: return None except AttributeError: # Prior to NetworkManager 1.12, we can only guess # that a connection was generated. if con.get_unsaved(): return None return active_con.get_uuid() def nm_get_bus_name(): if not _nm_imported: return None try: bus = dbus.SystemBus() obj = bus.get_object(NM.DBUS_INTERFACE, NM.DBUS_PATH) name = obj.bus_name del obj, bus return name except Exception: log.debug2("Failed to get bus name of NetworkManager") return None def nm_get_dbus_interface(): if not _nm_imported: return "" return NM.DBUS_INTERFACE PK[n%?-*site-packages/firewall/core/fw_service.pyonu[ c`c@sCdgZddlmZddlmZdefdYZdS(tFirewallServicei(terrors(t FirewallErrorcBsPeZdZdZdZdZdZdZdZdZ RS(cCs||_i|_dS(N(t_fwt _services(tselftfw((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt__init__s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt__repr__ scCs|jjdS(N(Rtclear(R((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pytcleanup#scCst|jjS(N(tsortedRtkeys(R((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt get_services(scCs(||jkr$ttj|ndS(N(RRRtINVALID_SERVICE(Rtservice((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt check_service+scCs|j||j|S(N(RR(RR((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt get_service/s cCs||j|js PK[㏷%site-packages/firewall/core/fw_nm.pyonu[ c`c@sWdZddddddddgZd d lZd d lmZyejd d Wnek rmeZnAXyd dlm Z e ZWn#e eej fk reZnXd ad dlmZd dlmZd dlmZd d lZdZdZdZdZdZdZdZdZdZdZdZ d S(s(Functions for NetworkManager interactiontcheck_nm_importedtnm_is_importedtnm_get_zone_of_connectiontnm_set_zone_of_connectiontnm_get_connectionstnm_get_connection_of_interfacetnm_get_bus_nametnm_get_dbus_interfaceiN(tGLibtNMs1.0(R (terrors(t FirewallError(tlogcCststtjdndS(sNCheck function to raise a MISSING_IMPORT error if the import of NM failed sgi.repository.NM = 1.0N(t _nm_importedR R tMISSING_IMPORT(((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyR0scCstS(snReturns true if NM has been properly imported @return True if import was successful, False otherwirse (R (((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyR6scCststjjdantS(sReturns the NM client object or None if the import of NM failed @return NM.Client instance if import was successful, None otherwise N(t _nm_clientR tClienttnewtNone(((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyt nm_get_client<scCsttj|}|dkr)dS|j}|dkrEdSy(|jtjjtjj B@rldSWn!t k r|j rdSnX|j }|dkrd}n|S(sGet zone of connection from NM @param connection name @return zone string setting of connection, empty string if not set, None if connection is unknown tN( RRtget_connection_by_uuidRtget_setting_connectiont get_flagsR tSettingsConnectionFlagst NM_GENERATEDt NM_VOLATILEtAttributeErrort get_unsavedtget_zone(t connectiontcont setting_contzone((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyREs$        cCszttj|}|dkr)tS|j}|dkrEtS|dkrZd}n|jd||jtdS(sSet the zone for a connection @param zone name @param connection name @return True if zone was set, else False RR!N( RRRRtFalseRt set_propertytcommit_changestTrue(R!RRR ((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyRcs     cCs|j|jttj}xo|D]g}|jrIq1n|j}|j}|j}|||s>               PK[%77)site-packages/firewall/core/ipXtables.pyonu[ c`c@sddlZddlZddlmZmZddlmZddlm Z ddl m Z m Z m Z mZmZmZmZmZddlmZddlmZmZmZddlmZmZmZmZddlZid d d gd 6d d gd6d dd d d gd6d dd gd6d d d gd6Zidd6dd6Z idd6dd6Z!dZ"dZ#dZ$de%fdYZ&de&fdYZ'dS( iN(t SHORTCUTStDEFAULT_ZONE_TARGET(trunProg(tlog(ttempFiletreadfilet splitArgst check_mactportStrtcheck_single_addresst check_addresst normalizeIP6(tconfig(t FirewallErrortINVALID_PASSTHROUGHt INVALID_RULE(t Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_MarktINPUTtOUTPUTtFORWARDtsecurityt PREROUTINGtrawt POSTROUTINGtmangletnattfiltersicmp-host-prohibitedtipv4sicmp6-adm-prohibitedtipv6ticmps ipv6-icmpcCsidd6dd6dd6dd6dd6d d 6}|}x|D]}y|j|}Wntk rmq>nX|d kryt||d Wntk rqX|j|d n||||W|S( s Inverse valid rule s-Ds-As--deletes--appends-Is--inserts-Xs-Ns--delete-chains --new-chaini(s-Is--insert(tindext Exceptiontinttpop(targst replace_argstret_argstargtidx((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcommon_reverse_rule7s*     cCsidd6dd6dd6dd6dd6d d 6}|}x|D]}y|j|}Wntk rmq>nX|dkryt||d Wntk rqX|j|d n||||<|SWttd d S(s Reverse valid passthough rule s-Ds-As--deletes--appends-Is--inserts-Xs-Ns--delete-chains --new-chainisno '-A', '-I' or '-N' argN(s-Is--insert(R!t ValueErrorR#R$R R(R%R&R'txR)((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcommon_reverse_passthrough\s.     cCst|}tddddddddd d d d d dddddddg}t||@dkrttdt||@dntddddddg}t||@dkrttdndS(sZ Check if passthough rule is valid (only add, insert and new chain rules are allowed) s-Cs--checks-Ds--deletes-Rs --replaces-Ls--lists-Ss --list-ruless-Fs--flushs-Zs--zeros-Xs--delete-chains-Ps--policys-Es--rename-chainisarg '%s' is not alloweds-As--appends-Is--inserts-Ns --new-chainsno '-A', '-I' or '-N' argN(tsettlenR Rtlist(R%t not_allowedtneeded((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcommon_check_passthroughs*   t ip4tablescBseZdZdZeZdZdZdZd.dZ dZ dZ dZ d Zd Zd Zd Zd ZdZdZdZd.dZdZdZdZdZdZdZddZdZedZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d.d.d$Z)d.d.d%Z*d.d.d&Z+d'Z,d.d(Z-d.d)Z.d.d*Z/d+Z0d,Z1d-Z2RS(/RR4cCsz||_tj|j|_tjd|j|_|j|_|j|_ |j g|_ g|_ i|_ dS(Ns %s-restore(t_fwR tCOMMANDStipvt_commandt_restore_commandt_detect_wait_optiont wait_optiont_detect_restore_wait_optiontrestore_wait_optiont fill_existstavailable_tablestzone_source_index_cachet our_chains(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt__init__s    cCs4tjj|j|_tjj|j|_dS(N(tostpathtexistsR8tcommand_existsR9trestore_command_exists(RB((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyR>scCs|jrB|j|krB|jgg|D]}d|^q(}ng|D]}d|^qI}tjd|j|jdj|t|j|\}}|dkrtd|jdj||fn|S(Ns%ss %s: %s %st is'%s %s' failed: %s(R;Rtdebug2t __class__R8tjoinRR+(RBR%titemt_argststatustret((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt__runs*%  c Cs|dkr|Sg}x|D]}t}x|D]}y|j|}Wntk r\q0Xt||kr0d||dkr0t}||djd}x3|D](} |} | | |d<|j| qWq0q0W|s|j|qqW|S(s5Split values combined with commas for options in optst,iN(tNonetFalseR!R+R/tTruetsplittappend( RBtrulestoptst out_rulestrulet processedtopttititemsRNt_rule((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt split_values(    & cCsAy|j|}Wntk r'tSX||||d+tSdS(Ni(R!R+RURV(RBR\tpatternt replacementR_((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt _rule_replaces  cCs|tko|t|kS(N(tBUILT_IN_CHAINS(RBR7ttabletchain((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytis_chain_builtins cCsCd|g}|r"|jdn |jd|j||gS(Ns-ts-Ns-X(RX(RBtaddRgRhR\((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytbuild_chain_ruless    cCsLd|g}|r.|d|t|g7}n|d|g7}||7}|S(Ns-ts-Is-D(tstr(RBRjRgRhR!R%R\((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt build_rules   cCs t|S(N(R*(RBR%((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt reverse_rulescCst|dS(N(R3(RBR%((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcheck_passthroughscCs t|S(N(R-(RBR%((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytreverse_passthrough scCsd}y|jd}Wntk r,n(Xt||dkrT||d}nd}xndddddd gD]T}y|j|}Wntk rqsXt||dkrs||d}qsqsW||fS( NRs-tis-As--appends-Is--inserts-Ns --new-chain(R!R+R/RT(RBR%RgR_RhR^((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytpassthrough_parse_table_chain s$   cCsyb|jd}|j||j|}d|dkrQ||df}n||df}WnLtk ry&|jd}|j|d}Wqtk rdSXnXt}|ddkrt}n|r| r||kr|j|qn|r|rI||kr7|j||jd d n|j|}n!|j j r^d}n t |}d |d<|j d d|dndS(Ns%%ZONE_SOURCE%%s-miiis%%ZONE_INTERFACE%%is-Ds--deletetkeycSs|dS(Ni((R,((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt@ss-Iis%di(s-Ds--delete( R!R$R+RTRVRUtremoveRXtsortR5t_allow_zone_driftingR/tinsert(RBR\R@R_tzonet zone_sourcetrule_addR!((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt_run_replace_zone_source#s>               cCs#t}i}tj|j}x|D]}|}|j|dddt|jg|j|dt|jgy|jd}Wnt k rnLX|dkrq(n|d&krd d d |g|||d +n |j ||j ||d} xpddgD]b} y|j| }Wnt k r6q Xt ||d kr |j ||j |} q q Wxzt t |D]f}x]tjD]R} | ||kr||jdo||jd rd||||i}|jdrg|dRRTRbReRiRkRmRnRoRpRqR{RRRR:R<RRRRRRRURRRRRRRRRRRRR R RRR R!R"(((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyR4s\        ) ^    !  i   7 ,    !     , 1 # t ip6tablescBs eZdZdZedZRS(RR&c Csg}|jddddddddd g |d krk|jddddddddd d d g n|jdddddddddg |jdddddddddg |S(Ns-IRs-tRs-mtrpfilters--inverts-jRR}Rs --log-prefixsrpfilter_DROP: s-ps ipv6-icmps$--icmpv6-type=neighbour-solicitationRs"--icmpv6-type=router-advertisement(RX(RBRRY((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytbuild_rpfilter_ruless"    (R#R$R7RRUR((((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyR&s((tos.pathRERtfirewall.core.baseRRtfirewall.core.progRtfirewall.core.loggerRtfirewall.functionsRRRRRR R R tfirewallR tfirewall.errorsR RRtfirewall.core.richRRRRRRfRRR*R-R3tobjectR4R&(((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyts<  :"     % * PK[YL;;)site-packages/firewall/core/fw_direct.pycnu[ c`c@sdgZddlmZddlmZddlmZddlmZddlm Z ddl m Z ddl m Z defd YZd S( tFirewallDirecti(tLastUpdatedOrderedDict(t ipXtables(tebtables(tFirewallTransaction(tlog(terrors(t FirewallErrorcBsdeZdZdZdZdZdZdZdZd$dZ dZ d Z d$d Z d Zd Zd ZdZd$dZd$dZdZdZdZd$dZd$dZdZdZdZdZdZdZd$dZd$dZ dZ!dZ"d Z#d!Z$d"Z%d#Z&RS(%cCs||_|jdS(N(t_fwt_FirewallDirect__init_vars(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt__init__'s cCs d|j|j|j|jfS(Ns%s(%r, %r, %r)(t __class__t_chainst_rulest_rule_priority_positions(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt__repr__+scCs1i|_i|_i|_i|_d|_dS(N(RRRt _passthroughstNonet_obj(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt __init_vars/s     cCs|jdS(N(R (R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pytcleanup6scCs t|jS(N(RR(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pytnew_transaction;scCs ||_dS(N(R(R tobj((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pytset_permanent_config@scCs|t|jt|jt|jdkr3tSt|jjt|jjt|jjdkrxtSt S(Ni( tlenRRRtTrueRtget_all_chainst get_all_rulestget_all_passthroughstFalse(R ((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pythas_configurationCs /%cCsu|dkr|j}n|}|j|jj|jj|jjf||dkrq|jtndS(N( RRt set_configRRRRtexecuteR(R tuse_transactiont transaction((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt apply_directLs   c Csi}i}i}xi|jD]^}|\}}xI|j|D]:}|jj|||s<|j|gj|q<q<WqWx|jD]}|\}}}xl|j|D]]\} } |jj|||| | s||krt||dddg}||kr:ttjd||fndS(Ntipv4tipv6tebs'%s' not in '%s'(RRt INVALID_IPV(R R/tipvs((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt _check_ipvs  cCsf|j||dkr(tjjn tjj}||krbttjd||fndS(NR>R?s'%s' not in '%s'(sipv4sipv6(RCRtBUILT_IN_CHAINStkeysRRRt INVALID_TABLE(R R/R0ttables((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt_check_ipv_tables    cCs|dkrJtj|}|jjr.i}qd|jj|j|}ntj|}tj|}||krtt j d|n||krtt j d|n|dkr|jj j |dk rtt jd|qndS(NR>R?schain '%s' is built-in chainschain '%s' is reservedsChain '%s' is reserved(sipv4sipv6(sipv4sipv6(RRDRtnftables_enabledtget_direct_backend_by_ipvt our_chainsRt OUR_CHAINSRRt BUILTIN_CHAINtzonetzone_from_chainRt INVALID_CHAIN(R R/R0R1tbuilt_in_chainsRK((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt_check_builtin_chains"            cCsc|r%|jj|gj|n:|j|j|t|j|dkr_|j|=ndS(Ni(RR'R(tremoveR(R R.R1tadd((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt_register_chains cCsZ|dkr|j}n|}|jt|||||dkrV|jtndS(N(RRt_chainRR"(R R/R0R1R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR7s   cCsZ|dkr|j}n|}|jt|||||dkrV|jtndS(N(RRRVRR"R(R R/R0R1R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt remove_chains   cCsO|j|||j|||||f}||jkoN||j|kS(N(RHRRR(R R/R0R1R.((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR&s  cCs:|j||||f}||jkr6|j|SgS(N(RHR(R R/R0R.((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt get_chainss   cCsXg}xK|jD]@}|\}}x+|j|D]}|j|||fq0WqW|S(N(RR((R trtkeyR/R0R1((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyRs  cCs`|dkr|j}n|}|jt|||||||dkr\|jtndS(N(RRt_ruleRR"(R R/R0R1R3R4R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR:s   cCs`|dkr|j}n|}|jt|||||||dkr\|jtndS(N(RRR[RR"R(R R/R0R1R3R4R#R$((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt remove_rule s   cCsE|j|||||f}||jkoD||f|j|kS(N(RHR(R R/R0R1R3R4R2((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR)scCsI|j|||||f}||jkrEt|j|jSgS(N(RHRtlistRE(R R/R0R1R2((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyt get_ruless c Csmg}x`|jD]U}|\}}}x=|j|D].\}}|j||||t|fq3WqW|S(N(RR(R](R RYRZR/R0R1R3R4((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR%s *cCs|r||jkr(t|j|R?s %s_directit_directs"rule '%s' already is in '%s:%s:%s'srule '%s' is not in '%s:%s:%s'ii(sipv4sipv6(RHRRIRNtcreate_zone_base_by_chainRJtis_chain_builtinRRRtALREADY_ENABLEDt NOT_ENABLEDRtsortedRERR:t build_ruleRatadd_fail(R R`R/R0R1R3R4R$RVtbackendR2R_tindext positionstj((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR[{sL         (%% cCs"|j|||j|||||f}|r|||jkr||j|krttjd|||fqnD||jks||j|krttjd|||fn|jj|}|j ||j ||||j ||||j |j ||| dS(Ns chain '%s' already is in '%s:%s'schain '%s' is not in '%s:%s'( RHRRRRRRqRrRRJt add_rulestbuild_chain_rulesRURu(R RTR/R0R1R$R.Rv((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyRVs$   c Csn|j|t|}|rc||jkr||j|krttjd||fqnA||jks||j|krttjd||fn|jj|}|r|j ||dkr|j |\}}|r|r|jj j |||qn|} n|j |} |j|| |j||||j|j||| dS(Nspassthrough '%s', '%s'R>R?(sipv4sipv6(RCRlRRRRqRrRRJtcheck_passthroughtpassthrough_parse_table_chainRNRotreverse_passthroughR:RiRu( R R`R/R4R$t tuple_argsRvR0R1t_args((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyRjs0        N('t__name__t __module__R RR RRRR RR%R5R6R!RCRHRRRUR7RWR&RXRR:R\R)R^RRaRhRiR;RkR*RRmR[RVRj(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyR&sH          '              _ N(t__all__tfirewall.fw_typesRt firewall.coreRRtfirewall.core.fw_transactionRtfirewall.core.loggerRtfirewallRtfirewall.errorsRtobjectR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_direct.pyts PK[ZZ(site-packages/firewall/core/fw_ifcfg.pyonu[ c`c@spdZddgZddlZddlZddlmZddlmZddlm Z dZ d Z dS( s.Functions to search for and change ifcfg filestsearch_ifcfg_of_interfacetifcfg_set_zone_of_interfaceiN(tconfig(tlog(tifcfgcCstjjtjsd SxttjtjD]}|jdsMq2nx5ddddddgD]}|j |rfqfqfqfWd|krq2nt d tj|f}|j |j d |kr2|Sq2Wd tj|f}tjj|rt |}|j |Sd S( s6search ifcfg file for the interface in config.IFCFGDIRsifcfg-s.baks.origs.rpmnews.rpmorigs.rpmsaves-ranget.s%s/%stDEVICEs %s/ifcfg-%sN( tostpathtexistsRtIFCFGDIRtNonetsortedtlistdirt startswithtendswithRtreadtget(t interfacetfilenametignoredt ifcfg_file((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ifcfg.pyR!s*      cCs|dkrd}nt|}|dk r|jd|kr|jddko`|dk rtjd||jf|jd||jndS(sYSet zone (ZONE=) in the ifcfg file that uses the interface (DEVICE=)ttZONEsSetting ZONE=%s in '%s'N(R RRRtdebug1Rtsettwrite(tzoneRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ifcfg.pyR?s   !"( t__doc__t__all__Rtos.pathtfirewallRtfirewall.core.loggerRtfirewall.core.io.ifcfgRRR(((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ifcfg.pyts    PK[i֑ +site-packages/firewall/core/fw_icmptype.pyonu[ c`c@s_dgZddlZddlmZddlmZddlmZdefdYZ dS(tFirewallIcmpTypeiN(tlog(terrors(t FirewallErrorcBsPeZdZdZdZdZdZdZdZdZ RS(cCs||_i|_dS(N(t_fwt _icmptypes(tselftfw((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt__init__s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt__repr__"scCs|jjdS(N(Rtclear(R((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pytcleanup%scCst|jjS(N(tsortedRtkeys(R((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt get_icmptypes*scCs(||jkr$ttj|ndS(N(RRRtINVALID_ICMPTYPE(Rticmptype((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pytcheck_icmptype-scCs|j||j|S(N(RR(RR((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt get_icmptype1s cCs_|j}t|dkr*ddg}n|}x|D]}|dkrk|jjs\q8n|jj}n3|dkr|jjsq8n|jj}ng}|jj|kr8t j d|j|f|j |q8q8Wt|t|krKt|dkr t t jdntj|}||_||j|js  PK[}w@&site-packages/firewall/core/helper.pyonu[ c`c@sdZdZdS(sThe helper maxnameleni N(t__doc__tHELPER_MAXNAMELEN(((s8/usr/lib/python2.7/site-packages/firewall/core/helper.pytsPK[@>>1site-packages/firewall/core/io/firewalld_conf.pyonu[ c`c @sddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddddd d d d d g Z defdYZdS(iN(tconfig(tlog(tb2utu2btPY2t DefaultZonet MinimalMarkt CleanupOnExittLockdownt IPv6_rpfiltertIndividualCallst LogDeniedtAutomaticHelperstAllowZoneDriftingtfirewalld_confcBsPeZdZdZdZdZdZdZdZdZ RS(cCs)i|_g|_||_|jdS(N(t_configt_deletedtfilenametclear(tselfR((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyt__init__$s   cCsi|_g|_dS(N(RR(R((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyR*s cCs|jjg|_dS(N(RRR(R((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pytcleanup.s cCs|jj|jS(N(Rtgettstrip(Rtkey((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyR2scCsQt|j}t|j|j|<||jkrM|jj|ndS(N(RRRRtremove(RRtvaluet_key((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pytset5scCsad}xD|jjD]3\}}|r5|d7}n|d||f7}qWtr]t|S|S(Nts s%s=%s(RtitemsRR(RtsRR((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyt__str__;s  c Cs|jyt|jd}Wntk r;}tjd|j||jdtj|jdt tj |jdtj rdnd|jdtj rdnd|jd tj rdnd|jd tjrdnd|jd tj|jd tj|jd tjr.dndnXxG|D]?}|sSPn|j}t|dksC|dd$krqCng|jdD]}|j^q}t|dkrtjd|jqCn|dtkr tjd|jqCnd|ddkr5tjd|jqCn8|jj|ddk rmtjd|jqCn|d|j|ds       PK[C114site-packages/firewall/core/io/lockdown_whitelist.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import xml.sax as sax import os import io import shutil from firewall import config from firewall.core.io.io_object import PY2, IO_Object, \ IO_Object_ContentHandler, IO_Object_XMLGenerator from firewall.core.logger import log from firewall.functions import uniqify, checkUser, checkUid, checkCommand, \ checkContext, u2b_if_py2 from firewall import errors from firewall.errors import FirewallError class lockdown_whitelist_ContentHandler(IO_Object_ContentHandler): def __init__(self, item): IO_Object_ContentHandler.__init__(self, item) self.whitelist = False def startElement(self, name, attrs): IO_Object_ContentHandler.startElement(self, name, attrs) self.item.parser_check_element_attrs(name, attrs) if name == "whitelist": if self.whitelist: raise FirewallError(errors.PARSE_ERROR, "More than one whitelist.") self.whitelist = True elif name == "command": if not self.whitelist: log.error("Parse Error: command outside of whitelist") return command = attrs["name"] self.item.add_command(command) elif name == "user": if not self.whitelist: log.error("Parse Error: user outside of whitelist") return if "id" in attrs: try: uid = int(attrs["id"]) except ValueError: log.error("Parse Error: %s is not a valid uid" % attrs["id"]) return self.item.add_uid(uid) elif "name" in attrs: self.item.add_user(attrs["name"]) elif name == "selinux": if not self.whitelist: log.error("Parse Error: selinux outside of whitelist") return if "context" not in attrs: log.error("Parse Error: no context") return self.item.add_context(attrs["context"]) else: log.error('Unknown XML element %s' % name) return class LockdownWhitelist(IO_Object): """ LockdownWhitelist class """ IMPORT_EXPORT_STRUCTURE = ( ( "commands", [ "" ] ), # as ( "contexts", [ "" ] ), # as ( "users", [ "" ] ), # as ( "uids", [ 0 ] ) # ai ) DBUS_SIGNATURE = '(asasasai)' ADDITIONAL_ALNUM_CHARS = [ "_" ] PARSER_REQUIRED_ELEMENT_ATTRS = { "whitelist": None, "command": [ "name" ], "user": None, # "group": None, "selinux": [ "context" ], } PARSER_OPTIONAL_ELEMENT_ATTRS = { "user": [ "id", "name" ], # "group": [ "id", "name" ], } def __init__(self, filename): super(LockdownWhitelist, self).__init__() self.filename = filename self.parser = None self.commands = [ ] self.contexts = [ ] self.users = [ ] self.uids = [ ] # self.gids = [ ] # self.groups = [ ] def _check_config(self, config, item): if item in [ "commands", "contexts", "users", "uids" ]: for x in config: self._check_config(x, item[:-1]) elif item == "command": if not checkCommand(config): raise FirewallError(errors.INVALID_COMMAND, config) elif item == "context": if not checkContext(config): raise FirewallError(errors.INVALID_CONTEXT, config) elif item == "user": if not checkUser(config): raise FirewallError(errors.INVALID_USER, config) elif item == "uid": if not checkUid(config): raise FirewallError(errors.INVALID_UID, config) def cleanup(self): del self.commands[:] del self.contexts[:] del self.users[:] del self.uids[:] # del self.gids[:] # del self.groups[:] def encode_strings(self): """ HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.""" self.commands = [ u2b_if_py2(x) for x in self.commands ] self.contexts = [ u2b_if_py2(x) for x in self.contexts ] self.users = [ u2b_if_py2(x) for x in self.users ] # commands def add_command(self, command): if not checkCommand(command): raise FirewallError(errors.INVALID_COMMAND, command) if command not in self.commands: self.commands.append(command) else: raise FirewallError(errors.ALREADY_ENABLED, 'Command "%s" already in whitelist' % command) def remove_command(self, command): if command in self.commands: self.commands.remove(command) else: raise FirewallError(errors.NOT_ENABLED, 'Command "%s" not in whitelist.' % command) def has_command(self, command): return (command in self.commands) def match_command(self, command): for _command in self.commands: if _command.endswith("*"): if command.startswith(_command[:-1]): return True else: if _command == command: return True return False def get_commands(self): return self.commands # user ids def add_uid(self, uid): if not checkUid(uid): raise FirewallError(errors.INVALID_UID, str(uid)) if uid not in self.uids: self.uids.append(uid) else: raise FirewallError(errors.ALREADY_ENABLED, 'Uid "%s" already in whitelist' % uid) def remove_uid(self, uid): if uid in self.uids: self.uids.remove(uid) else: raise FirewallError(errors.NOT_ENABLED, 'Uid "%s" not in whitelist.' % uid) def has_uid(self, uid): return (uid in self.uids) def match_uid(self, uid): return (uid in self.uids) def get_uids(self): return self.uids # users def add_user(self, user): if not checkUser(user): raise FirewallError(errors.INVALID_USER, user) if user not in self.users: self.users.append(user) else: raise FirewallError(errors.ALREADY_ENABLED, 'User "%s" already in whitelist' % user) def remove_user(self, user): if user in self.users: self.users.remove(user) else: raise FirewallError(errors.NOT_ENABLED, 'User "%s" not in whitelist.' % user) def has_user(self, user): return (user in self.users) def match_user(self, user): return (user in self.users) def get_users(self): return self.users # # group ids # # def add_gid(self, gid): # if gid not in self.gids: # self.gids.append(gid) # # def remove_gid(self, gid): # if gid in self.gids: # self.gids.remove(gid) # else: # raise FirewallError(errors.NOT_ENABLED, # 'Gid "%s" not in whitelist.' % gid) # # def has_gid(self, gid): # return (gid in self.gids) # # def match_gid(self, gid): # return (gid in self.gids) # # def get_gids(self): # return self.gids # # groups # # def add_group(self, group): # if group not in self.groups: # self.groups.append(group) # # def remove_group(self, group): # if group in self.groups: # self.groups.remove(group) # else: # raise FirewallError(errors.NOT_ENABLED, # 'Group "%s" not in whitelist.' % group) # # def has_group(self, group): # return (group in self.groups) # # def match_group(self, group): # return (group in self.groups) # # def get_groups(self): # return self.groups # selinux contexts def add_context(self, context): if not checkContext(context): raise FirewallError(errors.INVALID_CONTEXT, context) if context not in self.contexts: self.contexts.append(context) else: raise FirewallError(errors.ALREADY_ENABLED, 'Context "%s" already in whitelist' % context) def remove_context(self, context): if context in self.contexts: self.contexts.remove(context) else: raise FirewallError(errors.NOT_ENABLED, 'Context "%s" not in whitelist.' % context) def has_context(self, context): return (context in self.contexts) def match_context(self, context): return (context in self.contexts) def get_contexts(self): return self.contexts # read and write def read(self): self.cleanup() if not self.filename.endswith(".xml"): raise FirewallError(errors.INVALID_NAME, "'%s' is missing .xml suffix" % self.filename) handler = lockdown_whitelist_ContentHandler(self) parser = sax.make_parser() parser.setContentHandler(handler) try: parser.parse(self.filename) except sax.SAXParseException as msg: raise FirewallError(errors.INVALID_TYPE, "Not a valid file: %s" % \ msg.getException()) del handler del parser if PY2: self.encode_strings() def write(self): if os.path.exists(self.filename): try: shutil.copy2(self.filename, "%s.old" % self.filename) except Exception as msg: raise IOError("Backup of '%s' failed: %s" % (self.filename, msg)) if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) f = io.open(self.filename, mode='wt', encoding='UTF-8') handler = IO_Object_XMLGenerator(f) handler.startDocument() # start whitelist element handler.startElement("whitelist", { }) handler.ignorableWhitespace("\n") # commands for command in uniqify(self.commands): handler.ignorableWhitespace(" ") handler.simpleElement("command", { "name": command }) handler.ignorableWhitespace("\n") for uid in uniqify(self.uids): handler.ignorableWhitespace(" ") handler.simpleElement("user", { "id": str(uid) }) handler.ignorableWhitespace("\n") for user in uniqify(self.users): handler.ignorableWhitespace(" ") handler.simpleElement("user", { "name": user }) handler.ignorableWhitespace("\n") # for gid in uniqify(self.gids): # handler.ignorableWhitespace(" ") # handler.simpleElement("user", { "id": str(gid) }) # handler.ignorableWhitespace("\n") # for group in uniqify(self.groups): # handler.ignorableWhitespace(" ") # handler.simpleElement("group", { "name": group }) # handler.ignorableWhitespace("\n") for context in uniqify(self.contexts): handler.ignorableWhitespace(" ") handler.simpleElement("selinux", { "context": context }) handler.ignorableWhitespace("\n") # end whitelist element handler.endElement("whitelist") handler.ignorableWhitespace("\n") handler.endDocument() f.close() del handler PK[%yUU+site-packages/firewall/core/io/icmptype.pycnu[ c`c@sdddgZddljZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZddlmZdd lmZdd lmZde fd YZd e fd YZdZddZdS(tIcmpTypeticmptype_readerticmptype_writeriN(tconfig(t u2b_if_py2(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(tlog(terrors(t FirewallErrorcBseZdddddgffZdZddgZidd6dd6dd6Zid dgd6d d gd6Zd Zd Z dZ dZ RS(tversionttshortt descriptiont destinations(sssas)t_t-ticmptypetnametipv4tipv6cCs;tt|jd|_d|_d|_g|_dS(NR (tsuperRt__init__R RRR(tself((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR8s    cCs&d|_d|_d|_|j2dS(NR (R RRR(R((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pytcleanup?s   cCs_t|j|_t|j|_t|j|_g|jD]}t|^q@|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(RR RRR(Rtm((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pytencode_stringsEscCsI|dkrEx6|D]+}|dkrttjd|qqWndS(NRRRs'%s' not from {'ipv4'|'ipv6'}(RR(R R tINVALID_DESTINATION(RRtitemR((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyt _check_configNs     (sversionR (sshortR (s descriptionR N( t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRRRR(((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR%s"      ticmptype_ContentHandlercBseZdZRS(cCstj||||jj|||dkrxd|krVtjd|dnd|kr|d|j_qn|dkrns|dkrnd|dkrxUdd gD]D}||kr||jd kr|jjj t |qqWndS( NRRs'Ignoring deprecated attribute name='%s'R RRRRRtyesttrue(syesR*( Rt startElementRtparser_check_element_attrsR twarningR tlowerRtappendtstr(RRtattrstx((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR+Ys"        (R R!R+(((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR(Xsc CsYt}|jds1ttjd|n|d |_|j|j||_||_|j t j rxt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r5}ttjd|jnXWdQX~~trU|jn|S(Ns.xmls%s is missing .xml suffixis%s/%strbsnot a valid icmptype file: %s(RtendswithR R t INVALID_NAMERt check_nametfilenametpatht startswithRt ETC_FIREWALLDtFalsetTruetbuiltintdefaultR(tsaxt make_parsertsetContentHandlertopent InputSourceR%t setByteStreamtparsetSAXParseExceptiontINVALID_ICMPTYPEt getExceptionRR( R7R8RthandlertparserRtftsourcetmsg((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyRms8     !       c Cs|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|jrq|jd krq|j|d s   "3 PK[g{f,f,0site-packages/firewall/core/io/firewalld_conf.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2012 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os.path import io import tempfile import shutil from firewall import config from firewall.core.logger import log from firewall.functions import b2u, u2b, PY2 valid_keys = [ "DefaultZone", "MinimalMark", "CleanupOnExit", "Lockdown", "IPv6_rpfilter", "IndividualCalls", "LogDenied", "AutomaticHelpers", "AllowZoneDrifting" ] class firewalld_conf(object): def __init__(self, filename): self._config = { } self._deleted = [ ] self.filename = filename self.clear() def clear(self): self._config = { } self._deleted = [ ] def cleanup(self): self._config.clear() self._deleted = [ ] def get(self, key): return self._config.get(key.strip()) def set(self, key, value): _key = b2u(key.strip()) self._config[_key] = b2u(value.strip()) if _key in self._deleted: self._deleted.remove(_key) def __str__(self): s = "" for (key,value) in self._config.items(): if s: s += '\n' s += '%s=%s' % (key, value) return u2b(s) if PY2 else s # load self.filename def read(self): self.clear() try: f = open(self.filename, "r") except Exception as msg: log.error("Failed to load '%s': %s", self.filename, msg) self.set("DefaultZone", config.FALLBACK_ZONE) self.set("MinimalMark", str(config.FALLBACK_MINIMAL_MARK)) self.set("CleanupOnExit", "yes" if config.FALLBACK_CLEANUP_ON_EXIT else "no") self.set("Lockdown", "yes" if config.FALLBACK_LOCKDOWN else "no") self.set("IPv6_rpfilter","yes" if config.FALLBACK_IPV6_RPFILTER else "no") self.set("IndividualCalls", "yes" if config.FALLBACK_INDIVIDUAL_CALLS else "no") self.set("LogDenied", config.FALLBACK_LOG_DENIED) self.set("AutomaticHelpers", config.FALLBACK_AUTOMATIC_HELPERS) self.set("AllowZoneDrifting", "yes" if config.FALLBACK_ALLOW_ZONE_DRIFTING else "no") raise for line in f: if not line: break line = line.strip() if len(line) < 1 or line[0] in ['#', ';']: continue # get key/value pair pair = [ x.strip() for x in line.split("=") ] if len(pair) != 2: log.error("Invalid option definition: '%s'", line.strip()) continue elif pair[0] not in valid_keys: log.error("Invalid option: '%s'", line.strip()) continue elif pair[1] == '': log.error("Missing value: '%s'", line.strip()) continue elif self._config.get(pair[0]) is not None: log.error("Duplicate option definition: '%s'", line.strip()) continue self._config[pair[0]] = pair[1] f.close() # check default zone if not self.get("DefaultZone"): log.error("DefaultZone is not set, using default value '%s'", config.FALLBACK_ZONE) self.set("DefaultZone", str(config.FALLBACK_ZONE)) # check minimal mark value = self.get("MinimalMark") try: int(value) except ValueError: if value is not None: log.warning("MinimalMark '%s' is not valid, using default " "value '%d'", value if value else '', config.FALLBACK_MINIMAL_MARK) self.set("MinimalMark", str(config.FALLBACK_MINIMAL_MARK)) # check cleanup on exit value = self.get("CleanupOnExit") if not value or value.lower() not in [ "no", "false", "yes", "true" ]: if value is not None: log.warning("CleanupOnExit '%s' is not valid, using default " "value %s", value if value else '', config.FALLBACK_CLEANUP_ON_EXIT) self.set("CleanupOnExit", "yes" if config.FALLBACK_CLEANUP_ON_EXIT else "no") # check lockdown value = self.get("Lockdown") if not value or value.lower() not in [ "yes", "true", "no", "false" ]: if value is not None: log.warning("Lockdown '%s' is not valid, using default " "value %s", value if value else '', config.FALLBACK_LOCKDOWN) self.set("Lockdown", "yes" if config.FALLBACK_LOCKDOWN else "no") # check ipv6_rpfilter value = self.get("IPv6_rpfilter") if not value or value.lower() not in [ "yes", "true", "no", "false" ]: if value is not None: log.warning("IPv6_rpfilter '%s' is not valid, using default " "value %s", value if value else '', config.FALLBACK_IPV6_RPFILTER) self.set("IPv6_rpfilter","yes" if config.FALLBACK_IPV6_RPFILTER else "no") # check individual calls value = self.get("IndividualCalls") if not value or value.lower() not in [ "yes", "true", "no", "false" ]: if value is not None: log.warning("IndividualCalls '%s' is not valid, using default " "value %s", value if value else '', config.FALLBACK_INDIVIDUAL_CALLS) self.set("IndividualCalls", "yes" if config.FALLBACK_INDIVIDUAL_CALLS else "no") # check log denied value = self.get("LogDenied") if not value or value not in config.LOG_DENIED_VALUES: if value is not None: log.warning("LogDenied '%s' is invalid, using default value '%s'", value, config.FALLBACK_LOG_DENIED) self.set("LogDenied", str(config.FALLBACK_LOG_DENIED)) # check automatic helpers value = self.get("AutomaticHelpers") if not value or value.lower() not in config.AUTOMATIC_HELPERS_VALUES: if value is not None: log.warning("AutomaticHelpers '%s' is not valid, using default " "value %s", value if value else '', config.FALLBACK_AUTOMATIC_HELPERS) self.set("AutomaticHelpers", str(config.FALLBACK_AUTOMATIC_HELPERS)) value = self.get("AllowZoneDrifting") if not value or value.lower() not in [ "yes", "true", "no", "false" ]: if value is not None: log.warning("AllowZoneDrifting '%s' is not valid, using default " "value %s", value if value else '', config.FALLBACK_ALLOW_ZONE_DRIFTING) self.set("AllowZoneDrifting", str(config.FALLBACK_ALLOW_ZONE_DRIFTING)) # save to self.filename if there are key/value changes def write(self): if len(self._config) < 1: # no changes: nothing to do return # handled keys done = [ ] if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) try: temp_file = tempfile.NamedTemporaryFile(mode='wt', prefix="%s." % os.path.basename(self.filename), dir=os.path.dirname(self.filename), delete=False) except Exception as msg: log.error("Failed to open temporary file: %s" % msg) raise modified = False empty = False try: f= io.open(self.filename, mode='rt', encoding='UTF-8') except Exception as msg: if os.path.exists(self.filename): log.error("Failed to open '%s': %s" % (self.filename, msg)) raise else: f = None else: for line in f: if not line: break # remove newline line = line.strip("\n") if len(line) < 1: if not empty: temp_file.write(u"\n") empty = True elif line[0] == '#': empty = False temp_file.write(line) temp_file.write(u"\n") else: p = line.split("=") if len(p) != 2: empty = False temp_file.write(line+u"\n") continue key = p[0].strip() value = p[1].strip() # check for modified key/value pairs if key not in done: if (key in self._config and \ self._config[key] != value): empty = False temp_file.write(u'%s=%s\n' % (key, self._config[key])) modified = True elif key in self._deleted: modified = True else: empty = False temp_file.write(line+u"\n") done.append(key) else: modified = True # write remaining key/value pairs if len(self._config) > 0: for (key,value) in self._config.items(): if key in done: continue if not empty: temp_file.write(u"\n") empty = True temp_file.write(u'%s=%s\n' % (key, value)) modified = True if f: f.close() temp_file.close() if not modified: # not modified: remove tempfile os.remove(temp_file.name) return # make backup if os.path.exists(self.filename): try: shutil.copy2(self.filename, "%s.old" % self.filename) except Exception as msg: os.remove(temp_file.name) raise IOError("Backup of '%s' failed: %s" % (self.filename, msg)) # copy tempfile try: shutil.move(temp_file.name, self.filename) except Exception as msg: os.remove(temp_file.name) raise IOError("Failed to create '%s': %s" % (self.filename, msg)) else: os.chmod(self.filename, 0o600) PK[ʱ/+site-packages/firewall/core/io/__init__.pycnu[ c`c@sddlZdejkrddlmZeedsVdZeedenddlmZeedsdZ eede qndS( iNt_xmlplus(tAttributesImplt __contains__cCs|t|dkS(Nt_attrs(tgetattr(tselftname((s=/usr/lib/python2.7/site-packages/firewall/core/io/__init__.pyt__AttributesImpl__contains__s(t XMLGeneratort_writecCst|dj|dS(Nt_out(Rtwrite(Rttext((s=/usr/lib/python2.7/site-packages/firewall/core/io/__init__.pyt__XMLGenerator_write$s( txmlt__file__txml.sax.xmlreaderRthasattrRtsetattrtxml.sax.saxutilsRR (((s=/usr/lib/python2.7/site-packages/firewall/core/io/__init__.pyts   PK[A(site-packages/firewall/core/io/ifcfg.pycnu[ c`c@sdZdgZddlZddlZddlZddlZddlmZddl m Z m Z m Z de fdYZdS(sifcfg file parsertifcfgiN(tlog(tb2utu2btPY2cBsPeZdZdZdZdZdZdZdZdZ RS(cCs)i|_g|_||_|jdS(N(t_configt_deletedtfilenametclear(tselfR((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyt__init__#s   cCsi|_g|_dS(N(RR(R ((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyR)s cCs|jjdS(N(RR(R ((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pytcleanup-scCs|jj|jS(N(Rtgettstrip(R tkey((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyR 0scCsQt|j}t|j|j|<||jkrM|jj|ndS(N(RR RRtremove(R Rtvaluet_key((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pytset3scCsad}xD|jjD]3\}}|r5|d7}n|d||f7}qWtr]t|S|S(Nts s%s=%s(RtitemsRR(R tsRR((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyt__str__9s  cCs|jyt|jd}Wn,tk rN}tjd|j|nXxL|D]D}|sfPn|j}t|dksV|dd krqVng|jddD]}|j^q}t|dkrqVnt|ddkr1|dj d r1|dj d r1|ddd !|d|j j |ddk rtjd |j|jqVn|d|j |ds     PK[oyr66(site-packages/firewall/core/io/ipset.pyonu[ c`c@sgdZdddgZddljZddlZddlZddlZddlmZddl m Z m Z m Z m Z mZmZmZmZmZddlmZmZmZmZdd lmZmZdd lmZmZmZmZdd l m!Z!dd lm"Z"dd l#m$Z$defdYZ%defdYZ&dZ'e(dZ)dS(s$ipset io XML handler, reader, writertIPSett ipset_readert ipset_writeriN(tconfig( tcheckIPtcheckIP6t checkIPnMaskt checkIP6nMaskt u2b_if_py2t check_mact check_porttcheckInterfacet checkProtocol(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(t IPSET_TYPEStIPSET_CREATE_OPTIONS(tcheck_icmp_nametcheck_icmp_typetcheck_icmpv6_nametcheck_icmpv6_type(tlog(terrors(t FirewallErrorcBseZdddddidd6fddgffZdZdd d d gZidd6dd6dgd 6d gd6dd6Zidgd 6dgd6ZdZdZ dZ e dZ dZ dZRS(tversionttshortt descriptionttypetoptionstentriess (ssssa{ss}as)t_t-t:t.tipsettnametoptiontentrytvaluecCsVtt|jd|_d|_d|_d|_g|_i|_t |_ dS(NR( tsuperRt__init__RRRRR RtFalsetapplied(tself((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyR+Cs      cCsEd|_d|_d|_d|_|j2|jjt|_dS(NR( RRRRR RtclearR,R-(R.((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pytcleanupMs     cCst|j|_t|j|_t|j|_t|j|_d|jjD|_g|jD]}t|^qn|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.cSs+i|]!\}}t|t|qS((R(t.0tktv((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pys ^s N(RRRRRRtitemsR (R.te((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pytencode_stringsVsc Csd}d|kr.|ddkr.d}q.n|jdsVttjd|n|djd}|jd}t|t|kst|d krttjd ||fnx'tt|D]}||}||}|d krd |kr|dkr|d kr@ttjd |||fn|jd } t| dkrttjd||||fnx| D]]} |dkrt|  s|dkrt |  rttjd| |||fqqWq|dkrL|dkr.ttjd||||fn|dkrCt } qRt} nt } | |sttjd||||fqq|dkrbd |kr|jd } t| dkrttjd||||fn|dkrt| d s|dkrGt | d rGttjd| d|||fn|dkrdt | d  s|dkr_t | d  r_ttjd| d |||fq_q|j dr|dko|dko|dksttjd||||fqn|dkr!t | s:|dkrt | rttjd||||fqq|dkrt | s|dkrttjd||fqq|dkrd|kr{|jd} t| dkrttjd|n| ddkr~|dkr6ttjd||fnt| d  rxt| d  rxttjd| d |fqxq| dd1kr|dkrttjd||fnt| d  rxt| d  rxttjd!| d |fqxq| dd2krEt| d rEttjd&| d|fqt| d sttjd'| d |fqqt|sttjd(||fqq|d)kr|jd*r yt|d+} WqJtk rttjd,||fqJXn@yt|} Wn-tk rIttjd,||fnX| dksb| d-krttjd,||fqq|d.krt| st|d/krttjd0||fqqttjd|qWdS(3Ntipv4tfamilytinet6tipv6shash:sipset type '%s' not usableit,is)entry '%s' does not match ipset type '%s'tipR"s invalid address '%s' in '%s'[%d]is.invalid address range '%s' in '%s' for %s (%s)s(invalid address '%s' in '%s' for %s (%s)s0.0.0.0itnets/0shash:net,ifacetmacs00:00:00:00:00:00s invalid mac address '%s' in '%s'tportR#sinvalid port '%s'ticmps(invalid protocol for family '%s' in '%s'sinvalid icmp type '%s' in '%s'ticmpv6s ipv6-icmps invalid icmpv6 type '%s' in '%s'ttcptsctptudptudplitesinvalid protocol '%s' in '%s'sinvalid port '%s'in '%s'sinvalid port '%s' in '%s'tmarkt0xisinvalid mark '%s' in '%s'Itifaceisinvalid interface '%s' in '%s'(RAs ipv6-icmp(RBRCRDRE(t startswithRRt INVALID_IPSETtsplittlent INVALID_ENTRYtrangeRRRRtendswithR RRRRR R tintt ValueErrorR ( R(Rt ipset_typeR8tflagsR4titflagtitemtsplitst_splittip_checktint_val((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyt check_entrybs@   *                            cCs>|dkr4|tkr4ttjd|q4n|dkr:x|jD]}|tkrxttjd|n|dkryt||}Wn1tk rttj d|||fnX|d kr3ttj d |||fq3qM|d krM||dkrMttj ||qMqMWndS(NRs'%s' is not valid ipset typeRsipset invalid option '%s'ttimeoutthashsizetmaxelems)Option '%s': Value '%s' is not an integeris#Option '%s': Value '%s' is negativeR8tinetR9(R\R]R^(R_sinet6( RRRt INVALID_TYPEtkeysRRJRPRQt INVALID_VALUEtINVALID_FAMILY(R.RRVtkeyt int_value((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyt _check_configs2          cCsd|dkrO|dddkrOt|ddkrOttjqOnx-|dD]!}tj||d|dqZWtt|j|dS(NR\it0iii(RLRRtIPSET_WITH_TIMEOUTRR[R*t import_config(R.RR(((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRi3s $(sversionR(sshortR(s descriptionR(stypeRN(t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSR+R0R6t staticmethodR[RfRi(((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyR,s.       tipset_ContentHandlercBseZdZdZRS(cCstj||||jj|||dkrd|kr~|dtkrkttjd|dn|d|j_nd|kr|d|j_ qn|dkrn|dkrn|dkrd}d |kr|d }n|d dkrttj d|d n|jjdkra|d dkrattj d|d |jjfn|d dkr| rttj d|d n|d dkryt |}Wn1t k rttj d|d |fnX|dkrttj d|d |fqn|d d krL|dkrLttj|n|d |jjkry||jj|d sd         "  cCs9tj|||dkr5|jjj|jndS(NR((Rt endElementRVR tappendt_element(R.R&((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRyus (RjRkRtRy(((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRs=s 7c Cst}|jds1ttjd|n|d |_|j|j||_||_|j t j rxt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r5}ttjd|jnXWdQX~~d|jkr|jddkrt|jd krtj d |j|j2nd } t!} x| t|jkru|j| | krtj d |j| |jj"| qy$|j#|j| |j|j$Wn3tk rS} tj d | |jj"| qX| j%|j| | d 7} qW~ t&r|j'n|S(Ns.xmls'%s' is missing .xml suffixis%s/%strbsnot a valid ipset file: %sR\Rgis6ipset '%s': timeout option is set, entries are ignoredsEntry %s already set, ignoring.s %s, ignoring.i((RRORRt INVALID_NAMER&t check_nametfilenametpathRIRt ETC_FIREWALLDR,tTruetbuiltintdefaultRstsaxt make_parsertsetContentHandlertopent InputSourceRot setByteStreamtparsetSAXParseExceptionRJt getExceptionRRLR RRwtsettpopR[RtaddR R6( RRR%thandlertparserR&tftsourcetmsgRTt entries_setR5((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRzs^     !      "    $ c Csg|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji|jd 6}|jr{|jd kr{|j|d s$   @""= 5PK[{5`.`.)site-packages/firewall/core/io/service.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "Service", "service_reader", "service_writer" ] import xml.sax as sax import os import io import shutil from firewall import config from firewall.functions import u2b_if_py2 from firewall.core.io.io_object import PY2, IO_Object, \ IO_Object_ContentHandler, IO_Object_XMLGenerator, check_port, \ check_tcpudp, check_protocol, check_address from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError class Service(IO_Object): IMPORT_EXPORT_STRUCTURE = ( ( "version", "" ), # s ( "short", "" ), # s ( "description", "" ), # s ( "ports", [ ( "", "" ), ], ), # a(ss) ( "modules", [ "", ], ), # as ( "destination", { "": "", }, ), # a{ss} ( "protocols", [ "", ], ), # as ( "source_ports", [ ( "", "" ), ], ), # a(ss) ) DBUS_SIGNATURE = '(sssa(ss)asa{ss}asa(ss))' ADDITIONAL_ALNUM_CHARS = [ "_", "-" ] PARSER_REQUIRED_ELEMENT_ATTRS = { "short": None, "description": None, "service": None, } PARSER_OPTIONAL_ELEMENT_ATTRS = { "service": [ "name", "version" ], "port": [ "port", "protocol" ], "protocol": [ "value" ], "module": [ "name" ], "destination": [ "ipv4", "ipv6" ], "source-port": [ "port", "protocol" ], } def __init__(self): super(Service, self).__init__() self.version = "" self.short = "" self.description = "" self.ports = [ ] self.protocols = [ ] self.modules = [ ] self.destination = { } self.source_ports = [ ] def cleanup(self): self.version = "" self.short = "" self.description = "" del self.ports[:] del self.protocols[:] del self.modules[:] self.destination.clear() del self.source_ports[:] def encode_strings(self): """ HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.""" self.version = u2b_if_py2(self.version) self.short = u2b_if_py2(self.short) self.description = u2b_if_py2(self.description) self.ports = [(u2b_if_py2(po),u2b_if_py2(pr)) for (po,pr) in self.ports] self.modules = [u2b_if_py2(m) for m in self.modules] self.destination = {u2b_if_py2(k):u2b_if_py2(v) for k,v in self.destination.items()} self.protocols = [u2b_if_py2(pr) for pr in self.protocols] self.source_ports = [(u2b_if_py2(po),u2b_if_py2(pr)) for (po,pr) in self.source_ports] def _check_config(self, config, item): if item == "ports": for port in config: if port[0] != "": check_port(port[0]) check_tcpudp(port[1]) else: # only protocol check_protocol(port[1]) elif item == "protocols": for proto in config: check_protocol(proto) elif item == "source_ports": for port in config: check_port(port[0]) check_tcpudp(port[1]) elif item == "destination": for destination in config: if destination not in [ "ipv4", "ipv6" ]: raise FirewallError(errors.INVALID_DESTINATION, "'%s' not in {'ipv4'|'ipv6'}" % \ destination) check_address(destination, config[destination]) elif item == "modules": for module in config: if module.startswith("nf_conntrack_"): module = module.replace("nf_conntrack_", "") if "_" in module: module = module.replace("_", "-") if len(module) < 2: raise FirewallError(errors.INVALID_MODULE, module) # PARSER class service_ContentHandler(IO_Object_ContentHandler): def startElement(self, name, attrs): IO_Object_ContentHandler.startElement(self, name, attrs) self.item.parser_check_element_attrs(name, attrs) if name == "service": if "name" in attrs: log.warning("Ignoring deprecated attribute name='%s'", attrs["name"]) if "version" in attrs: self.item.version = attrs["version"] elif name == "short": pass elif name == "description": pass elif name == "port": if attrs["port"] != "": check_port(attrs["port"]) check_tcpudp(attrs["protocol"]) entry = (attrs["port"], attrs["protocol"]) if entry not in self.item.ports: self.item.ports.append(entry) else: log.warning("Port '%s/%s' already set, ignoring.", attrs["port"], attrs["protocol"]) else: check_protocol(attrs["protocol"]) if attrs["protocol"] not in self.item.protocols: self.item.protocols.append(attrs["protocol"]) else: log.warning("Protocol '%s' already set, ignoring.", attrs["protocol"]) elif name == "protocol": check_protocol(attrs["value"]) if attrs["value"] not in self.item.protocols: self.item.protocols.append(attrs["value"]) else: log.warning("Protocol '%s' already set, ignoring.", attrs["value"]) elif name == "source-port": check_port(attrs["port"]) check_tcpudp(attrs["protocol"]) entry = (attrs["port"], attrs["protocol"]) if entry not in self.item.source_ports: self.item.source_ports.append(entry) else: log.warning("SourcePort '%s/%s' already set, ignoring.", attrs["port"], attrs["protocol"]) elif name == "destination": for x in [ "ipv4", "ipv6" ]: if x in attrs: check_address(x, attrs[x]) if x in self.item.destination: log.warning("Destination address for '%s' already set, ignoring", x) else: self.item.destination[x] = attrs[x] elif name == "module": module = attrs["name"] if module.startswith("nf_conntrack_"): module = module.replace("nf_conntrack_", "") if "_" in module: module = module.replace("_", "-") if module not in self.item.modules: self.item.modules.append(module) else: log.warning("Module '%s' already set, ignoring.", module) def service_reader(filename, path): service = Service() if not filename.endswith(".xml"): raise FirewallError(errors.INVALID_NAME, "'%s' is missing .xml suffix" % filename) service.name = filename[:-4] service.check_name(service.name) service.filename = filename service.path = path service.builtin = False if path.startswith(config.ETC_FIREWALLD) else True service.default = service.builtin handler = service_ContentHandler(service) parser = sax.make_parser() parser.setContentHandler(handler) name = "%s/%s" % (path, filename) with open(name, "rb") as f: source = sax.InputSource(None) source.setByteStream(f) try: parser.parse(source) except sax.SAXParseException as msg: raise FirewallError(errors.INVALID_SERVICE, "not a valid service file: %s" % \ msg.getException()) del handler del parser if PY2: service.encode_strings() return service def service_writer(service, path=None): _path = path if path else service.path if service.filename: name = "%s/%s" % (_path, service.filename) else: name = "%s/%s.xml" % (_path, service.name) if os.path.exists(name): try: shutil.copy2(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) dirpath = os.path.dirname(name) if dirpath.startswith(config.ETC_FIREWALLD) and not os.path.exists(dirpath): if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) os.mkdir(dirpath, 0o750) f = io.open(name, mode='wt', encoding='UTF-8') handler = IO_Object_XMLGenerator(f) handler.startDocument() # start service element attrs = {} if service.version and service.version != "": attrs["version"] = service.version handler.startElement("service", attrs) handler.ignorableWhitespace("\n") # short if service.short and service.short != "": handler.ignorableWhitespace(" ") handler.startElement("short", { }) handler.characters(service.short) handler.endElement("short") handler.ignorableWhitespace("\n") # description if service.description and service.description != "": handler.ignorableWhitespace(" ") handler.startElement("description", { }) handler.characters(service.description) handler.endElement("description") handler.ignorableWhitespace("\n") # ports for port in service.ports: handler.ignorableWhitespace(" ") handler.simpleElement("port", { "port": port[0], "protocol": port[1] }) handler.ignorableWhitespace("\n") # protocols for protocol in service.protocols: handler.ignorableWhitespace(" ") handler.simpleElement("protocol", { "value": protocol }) handler.ignorableWhitespace("\n") # source ports for port in service.source_ports: handler.ignorableWhitespace(" ") handler.simpleElement("source-port", { "port": port[0], "protocol": port[1] }) handler.ignorableWhitespace("\n") # modules for module in service.modules: handler.ignorableWhitespace(" ") handler.simpleElement("module", { "name": module }) handler.ignorableWhitespace("\n") # destination if len(service.destination) > 0: handler.ignorableWhitespace(" ") handler.simpleElement("destination", service.destination) handler.ignorableWhitespace("\n") # end service element handler.endElement('service') handler.ignorableWhitespace("\n") handler.endDocument() f.close() del handler PK[oyr66(site-packages/firewall/core/io/ipset.pycnu[ c`c@sgdZdddgZddljZddlZddlZddlZddlmZddl m Z m Z m Z m Z mZmZmZmZmZddlmZmZmZmZdd lmZmZdd lmZmZmZmZdd l m!Z!dd lm"Z"dd l#m$Z$defdYZ%defdYZ&dZ'e(dZ)dS(s$ipset io XML handler, reader, writertIPSett ipset_readert ipset_writeriN(tconfig( tcheckIPtcheckIP6t checkIPnMaskt checkIP6nMaskt u2b_if_py2t check_mact check_porttcheckInterfacet checkProtocol(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(t IPSET_TYPEStIPSET_CREATE_OPTIONS(tcheck_icmp_nametcheck_icmp_typetcheck_icmpv6_nametcheck_icmpv6_type(tlog(terrors(t FirewallErrorcBseZdddddidd6fddgffZdZdd d d gZidd6dd6dgd 6d gd6dd6Zidgd 6dgd6ZdZdZ dZ e dZ dZ dZRS(tversionttshortt descriptionttypetoptionstentriess (ssssa{ss}as)t_t-t:t.tipsettnametoptiontentrytvaluecCsVtt|jd|_d|_d|_d|_g|_i|_t |_ dS(NR( tsuperRt__init__RRRRR RtFalsetapplied(tself((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyR+Cs      cCsEd|_d|_d|_d|_|j2|jjt|_dS(NR( RRRRR RtclearR,R-(R.((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pytcleanupMs     cCst|j|_t|j|_t|j|_t|j|_d|jjD|_g|jD]}t|^qn|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.cSs+i|]!\}}t|t|qS((R(t.0tktv((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pys ^s N(RRRRRRtitemsR (R.te((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pytencode_stringsVsc Csd}d|kr.|ddkr.d}q.n|jdsVttjd|n|djd}|jd}t|t|kst|d krttjd ||fnx'tt|D]}||}||}|d krd |kr|dkr|d kr@ttjd |||fn|jd } t| dkrttjd||||fnx| D]]} |dkrt|  s|dkrt |  rttjd| |||fqqWq|dkrL|dkr.ttjd||||fn|dkrCt } qRt} nt } | |sttjd||||fqq|dkrbd |kr|jd } t| dkrttjd||||fn|dkrt| d s|dkrGt | d rGttjd| d|||fn|dkrdt | d  s|dkr_t | d  r_ttjd| d |||fq_q|j dr|dko|dko|dksttjd||||fqn|dkr!t | s:|dkrt | rttjd||||fqq|dkrt | s|dkrttjd||fqq|dkrd|kr{|jd} t| dkrttjd|n| ddkr~|dkr6ttjd||fnt| d  rxt| d  rxttjd| d |fqxq| dd1kr|dkrttjd||fnt| d  rxt| d  rxttjd!| d |fqxq| dd2krEt| d rEttjd&| d|fqt| d sttjd'| d |fqqt|sttjd(||fqq|d)kr|jd*r yt|d+} WqJtk rttjd,||fqJXn@yt|} Wn-tk rIttjd,||fnX| dksb| d-krttjd,||fqq|d.krt| st|d/krttjd0||fqqttjd|qWdS(3Ntipv4tfamilytinet6tipv6shash:sipset type '%s' not usableit,is)entry '%s' does not match ipset type '%s'tipR"s invalid address '%s' in '%s'[%d]is.invalid address range '%s' in '%s' for %s (%s)s(invalid address '%s' in '%s' for %s (%s)s0.0.0.0itnets/0shash:net,ifacetmacs00:00:00:00:00:00s invalid mac address '%s' in '%s'tportR#sinvalid port '%s'ticmps(invalid protocol for family '%s' in '%s'sinvalid icmp type '%s' in '%s'ticmpv6s ipv6-icmps invalid icmpv6 type '%s' in '%s'ttcptsctptudptudplitesinvalid protocol '%s' in '%s'sinvalid port '%s'in '%s'sinvalid port '%s' in '%s'tmarkt0xisinvalid mark '%s' in '%s'Itifaceisinvalid interface '%s' in '%s'(RAs ipv6-icmp(RBRCRDRE(t startswithRRt INVALID_IPSETtsplittlent INVALID_ENTRYtrangeRRRRtendswithR RRRRR R tintt ValueErrorR ( R(Rt ipset_typeR8tflagsR4titflagtitemtsplitst_splittip_checktint_val((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyt check_entrybs@   *                            cCs>|dkr4|tkr4ttjd|q4n|dkr:x|jD]}|tkrxttjd|n|dkryt||}Wn1tk rttj d|||fnX|d kr3ttj d |||fq3qM|d krM||dkrMttj ||qMqMWndS(NRs'%s' is not valid ipset typeRsipset invalid option '%s'ttimeoutthashsizetmaxelems)Option '%s': Value '%s' is not an integeris#Option '%s': Value '%s' is negativeR8tinetR9(R\R]R^(R_sinet6( RRRt INVALID_TYPEtkeysRRJRPRQt INVALID_VALUEtINVALID_FAMILY(R.RRVtkeyt int_value((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyt _check_configs2          cCsd|dkrO|dddkrOt|ddkrOttjqOnx-|dD]!}tj||d|dqZWtt|j|dS(NR\it0iii(RLRRtIPSET_WITH_TIMEOUTRR[R*t import_config(R.RR(((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRi3s $(sversionR(sshortR(s descriptionR(stypeRN(t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSR+R0R6t staticmethodR[RfRi(((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyR,s.       tipset_ContentHandlercBseZdZdZRS(cCstj||||jj|||dkrd|kr~|dtkrkttjd|dn|d|j_nd|kr|d|j_ qn|dkrn|dkrn|dkrd}d |kr|d }n|d dkrttj d|d n|jjdkra|d dkrattj d|d |jjfn|d dkr| rttj d|d n|d dkryt |}Wn1t k rttj d|d |fnX|dkrttj d|d |fqn|d d krL|dkrLttj|n|d |jjkry||jj|d sd         "  cCs9tj|||dkr5|jjj|jndS(NR((Rt endElementRVR tappendt_element(R.R&((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRyus (RjRkRtRy(((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRs=s 7c Cst}|jds1ttjd|n|d |_|j|j||_||_|j t j rxt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r5}ttjd|jnXWdQX~~d|jkr|jddkrt|jd krtj d |j|j2nd } t!} x| t|jkru|j| | krtj d |j| |jj"| qy$|j#|j| |j|j$Wn3tk rS} tj d | |jj"| qX| j%|j| | d 7} qW~ t&r|j'n|S(Ns.xmls'%s' is missing .xml suffixis%s/%strbsnot a valid ipset file: %sR\Rgis6ipset '%s': timeout option is set, entries are ignoredsEntry %s already set, ignoring.s %s, ignoring.i((RRORRt INVALID_NAMER&t check_nametfilenametpathRIRt ETC_FIREWALLDR,tTruetbuiltintdefaultRstsaxt make_parsertsetContentHandlertopent InputSourceRot setByteStreamtparsetSAXParseExceptionRJt getExceptionRRLR RRwtsettpopR[RtaddR R6( RRR%thandlertparserR&tftsourcetmsgRTt entries_setR5((s:/usr/lib/python2.7/site-packages/firewall/core/io/ipset.pyRzs^     !      "    $ c Csg|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji|jd 6}|jr{|jd kr{|j|d s$   @""= 5PK[@>>1site-packages/firewall/core/io/firewalld_conf.pycnu[ c`c @sddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddddd d d d d g Z defdYZdS(iN(tconfig(tlog(tb2utu2btPY2t DefaultZonet MinimalMarkt CleanupOnExittLockdownt IPv6_rpfiltertIndividualCallst LogDeniedtAutomaticHelperstAllowZoneDriftingtfirewalld_confcBsPeZdZdZdZdZdZdZdZdZ RS(cCs)i|_g|_||_|jdS(N(t_configt_deletedtfilenametclear(tselfR((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyt__init__$s   cCsi|_g|_dS(N(RR(R((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyR*s cCs|jjg|_dS(N(RRR(R((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pytcleanup.s cCs|jj|jS(N(Rtgettstrip(Rtkey((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyR2scCsQt|j}t|j|j|<||jkrM|jj|ndS(N(RRRRtremove(RRtvaluet_key((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pytset5scCsad}xD|jjD]3\}}|r5|d7}n|d||f7}qWtr]t|S|S(Nts s%s=%s(RtitemsRR(RtsRR((sC/usr/lib/python2.7/site-packages/firewall/core/io/firewalld_conf.pyt__str__;s  c Cs|jyt|jd}Wntk r;}tjd|j||jdtj|jdt tj |jdtj rdnd|jdtj rdnd|jd tj rdnd|jd tjrdnd|jd tj|jd tj|jd tjr.dndnXxG|D]?}|sSPn|j}t|dksC|dd$krqCng|jdD]}|j^q}t|dkrtjd|jqCn|dtkr tjd|jqCnd|ddkr5tjd|jqCn8|jj|ddk rmtjd|jqCn|d|j|ds       PK[""&site-packages/firewall/core/io/zone.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "Zone", "zone_reader", "zone_writer" ] import xml.sax as sax import os import io import shutil from firewall import config from firewall.functions import checkIP, checkIP6, checkIPnMask, checkIP6nMask, checkInterface, uniqify, max_zone_name_len, u2b_if_py2, check_mac, portStr from firewall.core.base import DEFAULT_ZONE_TARGET, ZONE_TARGETS from firewall.core.io.io_object import PY2, IO_Object, \ IO_Object_ContentHandler, IO_Object_XMLGenerator, check_port, \ check_tcpudp, check_protocol from firewall.core import rich from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError class Zone(IO_Object): """ Zone class """ IMPORT_EXPORT_STRUCTURE = ( ( "version", "" ), # s ( "short", "" ), # s ( "description", "" ), # s ( "UNUSED", False ), # b ( "target", "" ), # s ( "services", [ "", ], ), # as ( "ports", [ ( "", "" ), ], ), # a(ss) ( "icmp_blocks", [ "", ], ), # as ( "masquerade", False ), # b ( "forward_ports", [ ( "", "", "", "" ), ], ), # a(ssss) ( "interfaces", [ "" ] ), # as ( "sources", [ "" ] ), # as ( "rules_str", [ "" ] ), # as ( "protocols", [ "", ], ), # as ( "source_ports", [ ( "", "" ), ], ), # a(ss) ( "icmp_block_inversion", False ), # b ) DBUS_SIGNATURE = '(sssbsasa(ss)asba(ssss)asasasasa(ss)b)' ADDITIONAL_ALNUM_CHARS = [ "_", "-", "/" ] PARSER_REQUIRED_ELEMENT_ATTRS = { "short": None, "description": None, "zone": None, "service": [ "name" ], "port": [ "port", "protocol" ], "icmp-block": [ "name" ], "icmp-type": [ "name" ], "forward-port": [ "port", "protocol" ], "interface": [ "name" ], "rule": None, "source": None, "destination": [ "address" ], "protocol": [ "value" ], "source-port": [ "port", "protocol" ], "log": None, "audit": None, "accept": None, "reject": None, "drop": None, "mark": [ "set" ], "limit": [ "value" ], "icmp-block-inversion": None, } PARSER_OPTIONAL_ELEMENT_ATTRS = { "zone": [ "name", "immutable", "target", "version" ], "masquerade": [ "enabled" ], "forward-port": [ "to-port", "to-addr" ], "rule": [ "family" ], "source": [ "address", "mac", "invert", "family", "ipset" ], "destination": [ "invert" ], "log": [ "prefix", "level" ], "reject": [ "type" ], } @staticmethod def index_of(element): for i, (el, dummy) in enumerate(Zone.IMPORT_EXPORT_STRUCTURE): if el == element: return i raise FirewallError(errors.UNKNOWN_ERROR, "index_of()") def __init__(self): super(Zone, self).__init__() self.version = "" self.short = "" self.description = "" self.UNUSED = False self.target = DEFAULT_ZONE_TARGET self.services = [ ] self.ports = [ ] self.protocols = [ ] self.icmp_blocks = [ ] self.masquerade = False self.forward_ports = [ ] self.source_ports = [ ] self.interfaces = [ ] self.sources = [ ] self.fw_config = None # to be able to check services and a icmp_blocks self.rules = [ ] self.rules_str = [ ] self.icmp_block_inversion = False self.combined = False self.applied = False def cleanup(self): self.version = "" self.short = "" self.description = "" self.UNUSED = False self.target = DEFAULT_ZONE_TARGET del self.services[:] del self.ports[:] del self.protocols[:] del self.icmp_blocks[:] self.masquerade = False del self.forward_ports[:] del self.source_ports[:] del self.interfaces[:] del self.sources[:] self.fw_config = None # to be able to check services and a icmp_blocks del self.rules[:] del self.rules_str[:] self.icmp_block_inversion = False self.combined = False self.applied = False def encode_strings(self): """ HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.""" self.version = u2b_if_py2(self.version) self.short = u2b_if_py2(self.short) self.description = u2b_if_py2(self.description) self.target = u2b_if_py2(self.target) self.services = [u2b_if_py2(s) for s in self.services] self.ports = [(u2b_if_py2(po),u2b_if_py2(pr)) for (po,pr) in self.ports] self.protocols = [u2b_if_py2(pr) for pr in self.protocols] self.icmp_blocks = [u2b_if_py2(i) for i in self.icmp_blocks] self.forward_ports = [(u2b_if_py2(p1),u2b_if_py2(p2),u2b_if_py2(p3),u2b_if_py2(p4)) for (p1,p2,p3,p4) in self.forward_ports] self.source_ports = [(u2b_if_py2(po),u2b_if_py2(pr)) for (po,pr) in self.source_ports] self.interfaces = [u2b_if_py2(i) for i in self.interfaces] self.sources = [u2b_if_py2(s) for s in self.sources] self.rules = [u2b_if_py2(s) for s in self.rules] self.rules_str = [u2b_if_py2(s) for s in self.rules_str] def __setattr__(self, name, value): if name == "rules_str": self.rules = [rich.Rich_Rule(rule_str=s) for s in value] # must convert back to string to get the canonical string. super(Zone, self).__setattr__(name, [str(s) for s in self.rules]) else: super(Zone, self).__setattr__(name, value) def _check_config(self, config, item): if item == "services" and self.fw_config: existing_services = self.fw_config.get_services() for service in config: if service not in existing_services: raise FirewallError(errors.INVALID_SERVICE, "'%s' not among existing services" % \ service) elif item == "ports": for port in config: check_port(port[0]) check_tcpudp(port[1]) elif item == "protocols": for proto in config: check_protocol(proto) elif item == "icmp_blocks" and self.fw_config: existing_icmptypes = self.fw_config.get_icmptypes() for icmptype in config: if icmptype not in existing_icmptypes: raise FirewallError(errors.INVALID_ICMPTYPE, "'%s' not among existing icmp types" % \ icmptype) elif item == "forward_ports": for fwd_port in config: check_port(fwd_port[0]) check_tcpudp(fwd_port[1]) if not fwd_port[2] and not fwd_port[3]: raise FirewallError( errors.INVALID_FORWARD, "'%s' is missing to-port AND to-addr " % fwd_port) if fwd_port[2]: check_port(fwd_port[2]) if fwd_port[3]: if not checkIP(fwd_port[3]) and not checkIP6(fwd_port[3]): raise FirewallError( errors.INVALID_ADDR, "to-addr '%s' is not a valid address" % fwd_port[3]) elif item == "source_ports": for port in config: check_port(port[0]) check_tcpudp(port[1]) elif item == "target": if config not in ZONE_TARGETS: raise FirewallError(errors.INVALID_TARGET, config) elif item == "interfaces": for interface in config: if not checkInterface(interface): raise FirewallError(errors.INVALID_INTERFACE, interface) elif item == "sources": for source in config: if not checkIPnMask(source) and not checkIP6nMask(source) and \ not check_mac(source) and not source.startswith("ipset:"): raise FirewallError(errors.INVALID_ADDR, source) elif item == "rules_str": for rule in config: rich.Rich_Rule(rule_str=rule) def check_name(self, name): super(Zone, self).check_name(name) if name.startswith('/'): raise FirewallError(errors.INVALID_NAME, "'%s' can't start with '/'" % name) elif name.endswith('/'): raise FirewallError(errors.INVALID_NAME, "'%s' can't end with '/'" % name) elif name.count('/') > 1: raise FirewallError(errors.INVALID_NAME, "more than one '/' in '%s'" % name) else: if "/" in name: checked_name = name[:name.find('/')] else: checked_name = name if len(checked_name) > max_zone_name_len(): raise FirewallError(errors.INVALID_NAME, "Zone of '%s' has %d chars, max is %d %s" % ( name, len(checked_name), max_zone_name_len(), self.combined)) def combine(self, zone): self.combined = True self.filename = None self.version = "" self.short = "" self.description = "" for interface in zone.interfaces: if interface not in self.interfaces: self.interfaces.append(interface) for source in zone.sources: if source not in self.sources: self.sources.append(source) for service in zone.services: if service not in self.services: self.services.append(service) for port in zone.ports: if port not in self.ports: self.ports.append(port) for proto in zone.protocols: if proto not in self.protocols: self.protocols.append(proto) for icmp in zone.icmp_blocks: if icmp not in self.icmp_blocks: self.icmp_blocks.append(icmp) if zone.masquerade: self.masquerade = True for forward in zone.forward_ports: if forward not in self.forward_ports: self.forward_ports.append(forward) for port in zone.source_ports: if port not in self.source_ports: self.source_ports.append(port) for rule in zone.rules: self.rules.append(rule) self.rules_str.append(str(rule)) if zone.icmp_block_inversion: self.icmp_block_inversion = True # PARSER class zone_ContentHandler(IO_Object_ContentHandler): def __init__(self, item): IO_Object_ContentHandler.__init__(self, item) self._rule = None self._rule_error = False self._limit_ok = None def startElement(self, name, attrs): IO_Object_ContentHandler.startElement(self, name, attrs) if self._rule_error: return self.item.parser_check_element_attrs(name, attrs) if name == "zone": if "name" in attrs: log.warning("Ignoring deprecated attribute name='%s'", attrs["name"]) if "version" in attrs: self.item.version = attrs["version"] if "immutable" in attrs: log.warning("Ignoring deprecated attribute immutable='%s'", attrs["immutable"]) if "target" in attrs: target = attrs["target"] if target not in ZONE_TARGETS: raise FirewallError(errors.INVALID_TARGET, target) if target != "" and target != DEFAULT_ZONE_TARGET: self.item.target = target elif name == "short": pass elif name == "description": pass elif name == "service": if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_Service(attrs["name"]) return if attrs["name"] not in self.item.services: self.item.services.append(attrs["name"]) else: log.warning("Service '%s' already set, ignoring.", attrs["name"]) elif name == "port": if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_Port(attrs["port"], attrs["protocol"]) return check_port(attrs["port"]) check_tcpudp(attrs["protocol"]) entry = (portStr(attrs["port"], "-"), attrs["protocol"]) if entry not in self.item.ports: self.item.ports.append(entry) else: log.warning("Port '%s/%s' already set, ignoring.", attrs["port"], attrs["protocol"]) elif name == "protocol": if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_Protocol(attrs["value"]) else: check_protocol(attrs["value"]) if attrs["value"] not in self.item.protocols: self.item.protocols.append(attrs["value"]) else: log.warning("Protocol '%s' already set, ignoring.", attrs["value"]) elif name == "icmp-block": if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_IcmpBlock(attrs["name"]) return if attrs["name"] not in self.item.icmp_blocks: self.item.icmp_blocks.append(attrs["name"]) else: log.warning("icmp-block '%s' already set, ignoring.", attrs["name"]) elif name == "icmp-type": if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_IcmpType(attrs["name"]) return else: log.warning("Invalid rule: icmp-block '%s' outside of rule", attrs["name"]) elif name == "masquerade": if "enabled" in attrs and \ attrs["enabled"].lower() in [ "no", "false" ] : log.warning("Ignoring deprecated attribute enabled='%s'", attrs["enabled"]) return if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_Masquerade() else: if self.item.masquerade: log.warning("Masquerade already set, ignoring.") else: self.item.masquerade = True elif name == "forward-port": to_port = "" if "to-port" in attrs: to_port = attrs["to-port"] to_addr = "" if "to-addr" in attrs: to_addr = attrs["to-addr"] if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_ForwardPort(attrs["port"], attrs["protocol"], to_port, to_addr) return check_port(attrs["port"]) check_tcpudp(attrs["protocol"]) if to_port: check_port(to_port) if to_addr: if not checkIP(to_addr) and not checkIP6(to_addr): raise FirewallError(errors.INVALID_ADDR, "to-addr '%s' is not a valid address" \ % to_addr) entry = (portStr(attrs["port"], "-"), attrs["protocol"], portStr(to_port, "-"), str(to_addr)) if entry not in self.item.forward_ports: self.item.forward_ports.append(entry) else: log.warning("Forward port %s/%s%s%s already set, ignoring.", attrs["port"], attrs["protocol"], " >%s" % to_port if to_port else "", " @%s" % to_addr if to_addr else "") elif name == "source-port": if self._rule: if self._rule.element: log.warning("Invalid rule: More than one element in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.element = rich.Rich_SourcePort(attrs["port"], attrs["protocol"]) return check_port(attrs["port"]) check_tcpudp(attrs["protocol"]) entry = (portStr(attrs["port"], "-"), attrs["protocol"]) if entry not in self.item.source_ports: self.item.source_ports.append(entry) else: log.warning("Source port '%s/%s' already set, ignoring.", attrs["port"], attrs["protocol"]) elif name == "interface": if self._rule: log.warning('Invalid rule: interface use in rule.') self._rule_error = True return # zone bound to interface if "name" not in attrs: log.warning('Invalid interface: Name missing.') self._rule_error = True return if attrs["name"] not in self.item.interfaces: self.item.interfaces.append(attrs["name"]) else: log.warning("Interface '%s' already set, ignoring.", attrs["name"]) elif name == "source": if self._rule: if self._rule.source: log.warning("Invalid rule: More than one source in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return invert = False if "invert" in attrs and \ attrs["invert"].lower() in [ "yes", "true" ]: invert = True addr = mac = ipset = None if "address" in attrs: addr = attrs["address"] if "mac" in attrs: mac = attrs["mac"] if "ipset" in attrs: ipset = attrs["ipset"] self._rule.source = rich.Rich_Source(addr, mac, ipset, invert=invert) return # zone bound to source if "address" not in attrs and "ipset" not in attrs: log.warning('Invalid source: No address no ipset.') return if "address" in attrs and "ipset" in attrs: log.warning('Invalid source: Address and ipset.') return if "family" in attrs: log.warning("Ignoring deprecated attribute family='%s'", attrs["family"]) if "invert" in attrs: log.warning('Invalid source: Invertion not allowed here.') return if "address" in attrs: if not checkIPnMask(attrs["address"]) and \ not checkIP6nMask(attrs["address"]) and \ not check_mac(attrs["address"]): raise FirewallError(errors.INVALID_ADDR, attrs["address"]) if "ipset" in attrs: entry = "ipset:%s" % attrs["ipset"] if entry not in self.item.sources: self.item.sources.append(entry) else: log.warning("Source '%s' already set, ignoring.", attrs["address"]) if "address" in attrs: entry = attrs["address"] if entry not in self.item.sources: self.item.sources.append(entry) else: log.warning("Source '%s' already set, ignoring.", attrs["address"]) elif name == "destination": if not self._rule: log.warning('Invalid rule: Destination outside of rule') self._rule_error = True return if self._rule.destination: log.warning("Invalid rule: More than one destination in rule '%s', ignoring.", str(self._rule)) return invert = False if "invert" in attrs and \ attrs["invert"].lower() in [ "yes", "true" ]: invert = True self._rule.destination = rich.Rich_Destination(attrs["address"], invert) elif name in [ "accept", "reject", "drop", "mark" ]: if not self._rule: log.warning('Invalid rule: Action outside of rule') self._rule_error = True return if self._rule.action: log.warning('Invalid rule: More than one action') self._rule_error = True return if name == "accept": self._rule.action = rich.Rich_Accept() elif name == "reject": _type = None if "type" in attrs: _type = attrs["type"] self._rule.action = rich.Rich_Reject(_type) elif name == "drop": self._rule.action = rich.Rich_Drop() elif name == "mark": _set = attrs["set"] self._rule.action = rich.Rich_Mark(_set) self._limit_ok = self._rule.action elif name == "log": if not self._rule: log.warning('Invalid rule: Log outside of rule') return if self._rule.log: log.warning('Invalid rule: More than one log') return level = None if "level" in attrs: level = attrs["level"] if level not in [ "emerg", "alert", "crit", "error", "warning", "notice", "info", "debug" ]: log.warning('Invalid rule: Invalid log level') self._rule_error = True return prefix = attrs["prefix"] if "prefix" in attrs else None self._rule.log = rich.Rich_Log(prefix, level) self._limit_ok = self._rule.log elif name == "audit": if not self._rule: log.warning('Invalid rule: Audit outside of rule') return if self._rule.audit: log.warning("Invalid rule: More than one audit in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return self._rule.audit = rich.Rich_Audit() self._limit_ok = self._rule.audit elif name == "rule": family = None if "family" in attrs: family = attrs["family"] if family not in [ "ipv4", "ipv6" ]: log.warning('Invalid rule: Rule family "%s" invalid', attrs["family"]) self._rule_error = True return self._rule = rich.Rich_Rule(family) elif name == "limit": if not self._limit_ok: log.warning('Invalid rule: Limit outside of action, log and audit') self._rule_error = True return if self._limit_ok.limit: log.warning("Invalid rule: More than one limit in rule '%s', ignoring.", str(self._rule)) self._rule_error = True return value = attrs["value"] self._limit_ok.limit = rich.Rich_Limit(value) elif name == "icmp-block-inversion": if self.item.icmp_block_inversion: log.warning("Icmp-Block-Inversion already set, ignoring.") else: self.item.icmp_block_inversion = True else: log.warning("Unknown XML element '%s'", name) return def endElement(self, name): IO_Object_ContentHandler.endElement(self, name) if name == "rule": if not self._rule_error: try: self._rule.check() except Exception as e: log.warning("%s: %s", e, str(self._rule)) else: if str(self._rule) not in self.item.rules_str: self.item.rules.append(self._rule) self.item.rules_str.append(str(self._rule)) else: log.warning("Rule '%s' already set, ignoring.", str(self._rule)) self._rule = None self._rule_error = False elif name in [ "accept", "reject", "drop", "mark", "log", "audit" ]: self._limit_ok = None def zone_reader(filename, path, no_check_name=False): zone = Zone() if not filename.endswith(".xml"): raise FirewallError(errors.INVALID_NAME, "'%s' is missing .xml suffix" % filename) zone.name = filename[:-4] if not no_check_name: zone.check_name(zone.name) zone.filename = filename zone.path = path zone.builtin = False if path.startswith(config.ETC_FIREWALLD) else True zone.default = zone.builtin handler = zone_ContentHandler(zone) parser = sax.make_parser() parser.setContentHandler(handler) name = "%s/%s" % (path, filename) with open(name, "rb") as f: source = sax.InputSource(None) source.setByteStream(f) try: parser.parse(source) except sax.SAXParseException as msg: raise FirewallError(errors.INVALID_ZONE, "not a valid zone file: %s" % \ msg.getException()) del handler del parser if PY2: zone.encode_strings() return zone def zone_writer(zone, path=None): _path = path if path else zone.path if zone.filename: name = "%s/%s" % (_path, zone.filename) else: name = "%s/%s.xml" % (_path, zone.name) if os.path.exists(name): try: shutil.copy2(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) dirpath = os.path.dirname(name) if dirpath.startswith(config.ETC_FIREWALLD) and not os.path.exists(dirpath): if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) os.mkdir(dirpath, 0o750) f = io.open(name, mode='wt', encoding='UTF-8') handler = IO_Object_XMLGenerator(f) handler.startDocument() # start zone element attrs = {} if zone.version and zone.version != "": attrs["version"] = zone.version if zone.target != DEFAULT_ZONE_TARGET: attrs["target"] = zone.target handler.startElement("zone", attrs) handler.ignorableWhitespace("\n") # short if zone.short and zone.short != "": handler.ignorableWhitespace(" ") handler.startElement("short", { }) handler.characters(zone.short) handler.endElement("short") handler.ignorableWhitespace("\n") # description if zone.description and zone.description != "": handler.ignorableWhitespace(" ") handler.startElement("description", { }) handler.characters(zone.description) handler.endElement("description") handler.ignorableWhitespace("\n") # interfaces for interface in uniqify(zone.interfaces): handler.ignorableWhitespace(" ") handler.simpleElement("interface", { "name": interface }) handler.ignorableWhitespace("\n") # source for source in uniqify(zone.sources): handler.ignorableWhitespace(" ") if "ipset:" in source: handler.simpleElement("source", { "ipset": source[6:] }) else: handler.simpleElement("source", { "address": source }) handler.ignorableWhitespace("\n") # services for service in uniqify(zone.services): handler.ignorableWhitespace(" ") handler.simpleElement("service", { "name": service }) handler.ignorableWhitespace("\n") # ports for port in uniqify(zone.ports): handler.ignorableWhitespace(" ") handler.simpleElement("port", { "port": port[0], "protocol": port[1] }) handler.ignorableWhitespace("\n") # protocols for protocol in uniqify(zone.protocols): handler.ignorableWhitespace(" ") handler.simpleElement("protocol", { "value": protocol }) handler.ignorableWhitespace("\n") # icmp-block-inversion if zone.icmp_block_inversion: handler.ignorableWhitespace(" ") handler.simpleElement("icmp-block-inversion", { }) handler.ignorableWhitespace("\n") # icmp-blocks for icmp in uniqify(zone.icmp_blocks): handler.ignorableWhitespace(" ") handler.simpleElement("icmp-block", { "name": icmp }) handler.ignorableWhitespace("\n") # masquerade if zone.masquerade: handler.ignorableWhitespace(" ") handler.simpleElement("masquerade", { }) handler.ignorableWhitespace("\n") # forward-ports for forward in uniqify(zone.forward_ports): handler.ignorableWhitespace(" ") attrs = { "port": forward[0], "protocol": forward[1] } if forward[2] and forward[2] != "" : attrs["to-port"] = forward[2] if forward[3] and forward[3] != "" : attrs["to-addr"] = forward[3] handler.simpleElement("forward-port", attrs) handler.ignorableWhitespace("\n") # source-ports for port in uniqify(zone.source_ports): handler.ignorableWhitespace(" ") handler.simpleElement("source-port", { "port": port[0], "protocol": port[1] }) handler.ignorableWhitespace("\n") # rules for rule in zone.rules: attrs = { } if rule.family: attrs["family"] = rule.family handler.ignorableWhitespace(" ") handler.startElement("rule", attrs) handler.ignorableWhitespace("\n") # source if rule.source: attrs = { } if rule.source.addr: attrs["address"] = rule.source.addr if rule.source.mac: attrs["mac"] = rule.source.mac if rule.source.ipset: attrs["ipset"] = rule.source.ipset if rule.source.invert: attrs["invert"] = "True" handler.ignorableWhitespace(" ") handler.simpleElement("source", attrs) handler.ignorableWhitespace("\n") # destination if rule.destination: attrs = { "address": rule.destination.addr } if rule.destination.invert: attrs["invert"] = "True" handler.ignorableWhitespace(" ") handler.simpleElement("destination", attrs) handler.ignorableWhitespace("\n") # element if rule.element: element = "" attrs = { } if type(rule.element) == rich.Rich_Service: element = "service" attrs["name"] = rule.element.name elif type(rule.element) == rich.Rich_Port: element = "port" attrs["port"] = rule.element.port attrs["protocol"] = rule.element.protocol elif type(rule.element) == rich.Rich_Protocol: element = "protocol" attrs["value"] = rule.element.value elif type(rule.element) == rich.Rich_Masquerade: element = "masquerade" elif type(rule.element) == rich.Rich_IcmpBlock: element = "icmp-block" attrs["name"] = rule.element.name elif type(rule.element) == rich.Rich_IcmpType: element = "icmp-type" attrs["name"] = rule.element.name elif type(rule.element) == rich.Rich_ForwardPort: element = "forward-port" attrs["port"] = rule.element.port attrs["protocol"] = rule.element.protocol if rule.element.to_port != "": attrs["to-port"] = rule.element.to_port if rule.element.to_address != "": attrs["to-addr"] = rule.element.to_address elif type(rule.element) == rich.Rich_SourcePort: element = "source-port" attrs["port"] = rule.element.port attrs["protocol"] = rule.element.protocol else: raise FirewallError( errors.INVALID_OBJECT, "Unknown element '%s' in zone_writer" % type(rule.element)) handler.ignorableWhitespace(" ") handler.simpleElement(element, attrs) handler.ignorableWhitespace("\n") # rule.element # log if rule.log: attrs = { } if rule.log.prefix: attrs["prefix"] = rule.log.prefix if rule.log.level: attrs["level"] = rule.log.level if rule.log.limit: handler.ignorableWhitespace(" ") handler.startElement("log", attrs) handler.ignorableWhitespace("\n ") handler.simpleElement("limit", { "value": rule.log.limit.value }) handler.ignorableWhitespace("\n ") handler.endElement("log") else: handler.ignorableWhitespace(" ") handler.simpleElement("log", attrs) handler.ignorableWhitespace("\n") # audit if rule.audit: attrs = {} if rule.audit.limit: handler.ignorableWhitespace(" ") handler.startElement("audit", { }) handler.ignorableWhitespace("\n ") handler.simpleElement("limit", { "value": rule.audit.limit.value }) handler.ignorableWhitespace("\n ") handler.endElement("audit") else: handler.ignorableWhitespace(" ") handler.simpleElement("audit", attrs) handler.ignorableWhitespace("\n") # action if rule.action: action = "" attrs = { } if type(rule.action) == rich.Rich_Accept: action = "accept" elif type(rule.action) == rich.Rich_Reject: action = "reject" if rule.action.type: attrs["type"] = rule.action.type elif type(rule.action) == rich.Rich_Drop: action = "drop" elif type(rule.action) == rich.Rich_Mark: action = "mark" attrs["set"] = rule.action.set else: log.warning("Unknown action '%s'", type(rule.action)) if rule.action.limit: handler.ignorableWhitespace(" ") handler.startElement(action, attrs) handler.ignorableWhitespace("\n ") handler.simpleElement("limit", { "value": rule.action.limit.value }) handler.ignorableWhitespace("\n ") handler.endElement(action) else: handler.ignorableWhitespace(" ") handler.simpleElement(action, attrs) handler.ignorableWhitespace("\n") handler.ignorableWhitespace(" ") handler.endElement("rule") handler.ignorableWhitespace("\n") # end zone element handler.endElement("zone") handler.ignorableWhitespace("\n") handler.endDocument() f.close() del handler PK[yRyR'site-packages/firewall/core/io/ipset.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2015-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """ipset io XML handler, reader, writer""" __all__ = [ "IPSet", "ipset_reader", "ipset_writer" ] import xml.sax as sax import os import io import shutil from firewall import config from firewall.functions import checkIP, checkIP6, checkIPnMask, \ checkIP6nMask, u2b_if_py2, check_mac, check_port, checkInterface, \ checkProtocol from firewall.core.io.io_object import PY2, IO_Object, \ IO_Object_ContentHandler, IO_Object_XMLGenerator from firewall.core.ipset import IPSET_TYPES, IPSET_CREATE_OPTIONS from firewall.core.icmp import check_icmp_name, check_icmp_type, \ check_icmpv6_name, check_icmpv6_type from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError class IPSet(IO_Object): IMPORT_EXPORT_STRUCTURE = ( ( "version", "" ), # s ( "short", "" ), # s ( "description", "" ), # s ( "type", "" ), # s ( "options", { "": "", }, ), # a{ss} ( "entries", [ "" ], ), # as ) DBUS_SIGNATURE = '(ssssa{ss}as)' ADDITIONAL_ALNUM_CHARS = [ "_", "-", ":", "." ] PARSER_REQUIRED_ELEMENT_ATTRS = { "short": None, "description": None, "ipset": [ "type" ], "option": [ "name" ], "entry": None, } PARSER_OPTIONAL_ELEMENT_ATTRS = { "ipset": [ "version" ], "option": [ "value" ], } def __init__(self): super(IPSet, self).__init__() self.version = "" self.short = "" self.description = "" self.type = "" self.entries = [ ] self.options = { } self.applied = False def cleanup(self): self.version = "" self.short = "" self.description = "" self.type = "" del self.entries[:] self.options.clear() self.applied = False def encode_strings(self): """ HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.""" self.version = u2b_if_py2(self.version) self.short = u2b_if_py2(self.short) self.description = u2b_if_py2(self.description) self.type = u2b_if_py2(self.type) self.options = { u2b_if_py2(k):u2b_if_py2(v) for k, v in self.options.items() } self.entries = [ u2b_if_py2(e) for e in self.entries ] @staticmethod def check_entry(entry, options, ipset_type): family = "ipv4" if "family" in options: if options["family"] == "inet6": family = "ipv6" if not ipset_type.startswith("hash:"): raise FirewallError(errors.INVALID_IPSET, "ipset type '%s' not usable" % ipset_type) flags = ipset_type[5:].split(",") items = entry.split(",") if len(flags) != len(items) or len(flags) < 1: raise FirewallError( errors.INVALID_ENTRY, "entry '%s' does not match ipset type '%s'" % \ (entry, ipset_type)) for i in range(len(flags)): flag = flags[i] item = items[i] if flag == "ip": if "-" in item and family == "ipv4": # IP ranges only with plain IPs, no masks if i > 1: raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s'[%d]" % \ (item, entry, i)) splits = item.split("-") if len(splits) != 2: raise FirewallError( errors.INVALID_ENTRY, "invalid address range '%s' in '%s' for %s (%s)" % \ (item, entry, ipset_type, family)) for _split in splits: if (family == "ipv4" and not checkIP(_split)) or \ (family == "ipv6" and not checkIP6(_split)): raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s' for %s (%s)" % \ (_split, entry, ipset_type, family)) else: # IPs with mask only allowed in the first # position of the type if family == "ipv4": if item == "0.0.0.0": raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s' for %s (%s)" % \ (item, entry, ipset_type, family)) if i == 0: ip_check = checkIPnMask else: ip_check = checkIP else: ip_check = checkIP6 if not ip_check(item): raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s' for %s (%s)" % \ (item, entry, ipset_type, family)) elif flag == "net": if "-" in item: # IP ranges only with plain IPs, no masks splits = item.split("-") if len(splits) != 2: raise FirewallError( errors.INVALID_ENTRY, "invalid address range '%s' in '%s' for %s (%s)" % \ (item, entry, ipset_type, family)) # First part can only be a plain IP if (family == "ipv4" and not checkIP(splits[0])) or \ (family == "ipv6" and not checkIP6(splits[0])): raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s' for %s (%s)" % \ (splits[0], entry, ipset_type, family)) # Second part can also have a mask if (family == "ipv4" and not checkIPnMask(splits[1])) or \ (family == "ipv6" and not checkIP6nMask(splits[1])): raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s' for %s (%s)" % \ (splits[1], entry, ipset_type, family)) else: # IPs with mask allowed in all positions, but no /0 if item.endswith("/0"): if not (family == "ipv6" and i == 0 and ipset_type == "hash:net,iface"): raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s' for %s (%s)" % \ (item, entry, ipset_type, family)) if (family == "ipv4" and not checkIPnMask(item)) or \ (family == "ipv6" and not checkIP6nMask(item)): raise FirewallError( errors.INVALID_ENTRY, "invalid address '%s' in '%s' for %s (%s)" % \ (item, entry, ipset_type, family)) elif flag == "mac": # ipset does not allow to add 00:00:00:00:00:00 if not check_mac(item) or item == "00:00:00:00:00:00": raise FirewallError( errors.INVALID_ENTRY, "invalid mac address '%s' in '%s'" % (item, entry)) elif flag == "port": if ":" in item: splits = item.split(":") if len(splits) != 2: raise FirewallError( errors.INVALID_ENTRY, "invalid port '%s'" % (item)) if splits[0] == "icmp": if family != "ipv4": raise FirewallError( errors.INVALID_ENTRY, "invalid protocol for family '%s' in '%s'" % \ (family, entry)) if not check_icmp_name(splits[1]) and not \ check_icmp_type(splits[1]): raise FirewallError( errors.INVALID_ENTRY, "invalid icmp type '%s' in '%s'" % \ (splits[1], entry)) elif splits[0] in [ "icmpv6", "ipv6-icmp" ]: if family != "ipv6": raise FirewallError( errors.INVALID_ENTRY, "invalid protocol for family '%s' in '%s'" % \ (family, entry)) if not check_icmpv6_name(splits[1]) and not \ check_icmpv6_type(splits[1]): raise FirewallError( errors.INVALID_ENTRY, "invalid icmpv6 type '%s' in '%s'" % \ (splits[1], entry)) elif splits[0] not in [ "tcp", "sctp", "udp", "udplite" ] \ and not checkProtocol(splits[0]): raise FirewallError( errors.INVALID_ENTRY, "invalid protocol '%s' in '%s'" % (splits[0], entry)) elif not check_port(splits[1]): raise FirewallError( errors.INVALID_ENTRY, "invalid port '%s'in '%s'" % (splits[1], entry)) else: if not check_port(item): raise FirewallError( errors.INVALID_ENTRY, "invalid port '%s' in '%s'" % (item, entry)) elif flag == "mark": if item.startswith("0x"): try: int_val = int(item, 16) except ValueError: raise FirewallError( errors.INVALID_ENTRY, "invalid mark '%s' in '%s'" % (item, entry)) else: try: int_val = int(item) except ValueError: raise FirewallError( errors.INVALID_ENTRY, "invalid mark '%s' in '%s'" % (item, entry)) if int_val < 0 or int_val > 4294967295: raise FirewallError( errors.INVALID_ENTRY, "invalid mark '%s' in '%s'" % (item, entry)) elif flag == "iface": if not checkInterface(item) or len(item) > 15: raise FirewallError( errors.INVALID_ENTRY, "invalid interface '%s' in '%s'" % (item, entry)) else: raise FirewallError(errors.INVALID_IPSET, "ipset type '%s' not usable" % ipset_type) def _check_config(self, config, item): if item == "type": if config not in IPSET_TYPES: raise FirewallError(errors.INVALID_TYPE, "'%s' is not valid ipset type" % config) if item == "options": for key in config.keys(): if key not in IPSET_CREATE_OPTIONS: raise FirewallError(errors.INVALID_IPSET, "ipset invalid option '%s'" % key) if key in [ "timeout", "hashsize", "maxelem" ]: try: int_value = int(config[key]) except ValueError: raise FirewallError( errors.INVALID_VALUE, "Option '%s': Value '%s' is not an integer" % \ (key, config[key])) if int_value < 0: raise FirewallError( errors.INVALID_VALUE, "Option '%s': Value '%s' is negative" % \ (key, config[key])) elif key == "family" and \ config[key] not in [ "inet", "inet6" ]: raise FirewallError(errors.INVALID_FAMILY, config[key]) def import_config(self, config): if "timeout" in config[4] and config[4]["timeout"] != "0": if len(config[5]) != 0: raise FirewallError(errors.IPSET_WITH_TIMEOUT) for entry in config[5]: IPSet.check_entry(entry, config[4], config[3]) super(IPSet, self).import_config(config) # PARSER class ipset_ContentHandler(IO_Object_ContentHandler): def startElement(self, name, attrs): IO_Object_ContentHandler.startElement(self, name, attrs) self.item.parser_check_element_attrs(name, attrs) if name == "ipset": if "type" in attrs: if attrs["type"] not in IPSET_TYPES: raise FirewallError(errors.INVALID_TYPE, "%s" % attrs["type"]) self.item.type = attrs["type"] if "version" in attrs: self.item.version = attrs["version"] elif name == "short": pass elif name == "description": pass elif name == "option": value = "" if "value" in attrs: value = attrs["value"] if attrs["name"] not in \ [ "family", "timeout", "hashsize", "maxelem" ]: raise FirewallError( errors.INVALID_OPTION, "Unknown option '%s'" % attrs["name"]) if self.item.type == "hash:mac" and attrs["name"] in [ "family" ]: raise FirewallError( errors.INVALID_OPTION, "Unsupported option '%s' for type '%s'" % \ (attrs["name"], self.item.type)) if attrs["name"] in [ "family", "timeout", "hashsize", "maxelem" ] \ and not value: raise FirewallError( errors.INVALID_OPTION, "Missing mandatory value of option '%s'" % attrs["name"]) if attrs["name"] in [ "timeout", "hashsize", "maxelem" ]: try: int_value = int(value) except ValueError: raise FirewallError( errors.INVALID_VALUE, "Option '%s': Value '%s' is not an integer" % \ (attrs["name"], value)) if int_value < 0: raise FirewallError( errors.INVALID_VALUE, "Option '%s': Value '%s' is negative" % \ (attrs["name"], value)) if attrs["name"] == "family" and value not in [ "inet", "inet6" ]: raise FirewallError(errors.INVALID_FAMILY, value) if attrs["name"] not in self.item.options: self.item.options[attrs["name"]] = value else: log.warning("Option %s already set, ignoring.", attrs["name"]) # nothing to do for entry and entries here def endElement(self, name): IO_Object_ContentHandler.endElement(self, name) if name == "entry": self.item.entries.append(self._element) def ipset_reader(filename, path): ipset = IPSet() if not filename.endswith(".xml"): raise FirewallError(errors.INVALID_NAME, "'%s' is missing .xml suffix" % filename) ipset.name = filename[:-4] ipset.check_name(ipset.name) ipset.filename = filename ipset.path = path ipset.builtin = False if path.startswith(config.ETC_FIREWALLD) else True ipset.default = ipset.builtin handler = ipset_ContentHandler(ipset) parser = sax.make_parser() parser.setContentHandler(handler) name = "%s/%s" % (path, filename) with open(name, "rb") as f: source = sax.InputSource(None) source.setByteStream(f) try: parser.parse(source) except sax.SAXParseException as msg: raise FirewallError(errors.INVALID_IPSET, "not a valid ipset file: %s" % \ msg.getException()) del handler del parser if "timeout" in ipset.options and ipset.options["timeout"] != "0" and \ len(ipset.entries) > 0: # no entries visible for ipsets with timeout log.warning("ipset '%s': timeout option is set, entries are ignored", ipset.name) del ipset.entries[:] i = 0 entries_set = set() while i < len(ipset.entries): if ipset.entries[i] in entries_set: log.warning("Entry %s already set, ignoring.", ipset.entries[i]) ipset.entries.pop(i) else: try: ipset.check_entry(ipset.entries[i], ipset.options, ipset.type) except FirewallError as e: log.warning("%s, ignoring.", e) ipset.entries.pop(i) else: entries_set.add(ipset.entries[i]) i += 1 del entries_set if PY2: ipset.encode_strings() return ipset def ipset_writer(ipset, path=None): _path = path if path else ipset.path if ipset.filename: name = "%s/%s" % (_path, ipset.filename) else: name = "%s/%s.xml" % (_path, ipset.name) if os.path.exists(name): try: shutil.copy2(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) dirpath = os.path.dirname(name) if dirpath.startswith(config.ETC_FIREWALLD) and not os.path.exists(dirpath): if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) os.mkdir(dirpath, 0o750) f = io.open(name, mode='wt', encoding='UTF-8') handler = IO_Object_XMLGenerator(f) handler.startDocument() # start ipset element attrs = { "type": ipset.type } if ipset.version and ipset.version != "": attrs["version"] = ipset.version handler.startElement("ipset", attrs) handler.ignorableWhitespace("\n") # short if ipset.short and ipset.short != "": handler.ignorableWhitespace(" ") handler.startElement("short", { }) handler.characters(ipset.short) handler.endElement("short") handler.ignorableWhitespace("\n") # description if ipset.description and ipset.description != "": handler.ignorableWhitespace(" ") handler.startElement("description", { }) handler.characters(ipset.description) handler.endElement("description") handler.ignorableWhitespace("\n") # options for key,value in ipset.options.items(): handler.ignorableWhitespace(" ") if value != "": handler.simpleElement("option", { "name": key, "value": value }) else: handler.simpleElement("option", { "name": key }) handler.ignorableWhitespace("\n") # entries for entry in ipset.entries: handler.ignorableWhitespace(" ") handler.startElement("entry", { }) handler.characters(entry) handler.endElement("entry") handler.ignorableWhitespace("\n") # end ipset element handler.endElement('ipset') handler.ignorableWhitespace("\n") handler.endDocument() f.close() del handler PK[,:<<*site-packages/firewall/core/io/__init__.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2012 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # fix xmlplus to be compatible with the python xml sax parser and python 3 # by adding __contains__ to xml.sax.xmlreader.AttributesImpl import xml if "_xmlplus" in xml.__file__: from xml.sax.xmlreader import AttributesImpl if not hasattr(AttributesImpl, "__contains__"): # this is missing: def __AttributesImpl__contains__(self, name): return name in getattr(self, "_attrs") # add it using the name __contains__ setattr(AttributesImpl, "__contains__", __AttributesImpl__contains__) from xml.sax.saxutils import XMLGenerator if not hasattr(XMLGenerator, "_write"): # this is missing: def __XMLGenerator_write(self, text): getattr(self, "_out").write(text) # add it using the name _write setattr(XMLGenerator, "_write", __XMLGenerator_write) PK[ (site-packages/firewall/core/io/helper.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "Helper", "helper_reader", "helper_writer" ] import xml.sax as sax import os import io import shutil from firewall import config from firewall.functions import u2b_if_py2 from firewall.core.io.io_object import PY2, IO_Object, \ IO_Object_ContentHandler, IO_Object_XMLGenerator, check_port, \ check_tcpudp from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError class Helper(IO_Object): IMPORT_EXPORT_STRUCTURE = ( ( "version", "" ), # s ( "short", "" ), # s ( "description", "" ), # s ( "family", "", ), # s ( "module", "", ), # s ( "ports", [ ( "", "" ), ], ), # a(ss) ) DBUS_SIGNATURE = '(sssssa(ss))' ADDITIONAL_ALNUM_CHARS = [ "-", "." ] PARSER_REQUIRED_ELEMENT_ATTRS = { "short": None, "description": None, "helper": [ "module" ], } PARSER_OPTIONAL_ELEMENT_ATTRS = { "helper": [ "name", "version", "family" ], "port": [ "port", "protocol" ], } def __init__(self): super(Helper, self).__init__() self.version = "" self.short = "" self.description = "" self.module = "" self.family = "" self.ports = [ ] def cleanup(self): self.version = "" self.short = "" self.description = "" self.module = "" self.family = "" del self.ports[:] def encode_strings(self): """ HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.""" self.version = u2b_if_py2(self.version) self.short = u2b_if_py2(self.short) self.description = u2b_if_py2(self.description) self.module = u2b_if_py2(self.module) self.family = u2b_if_py2(self.family) self.ports = [(u2b_if_py2(po),u2b_if_py2(pr)) for (po,pr) in self.ports] def check_ipv(self, ipv): ipvs = [ 'ipv4', 'ipv6' ] if ipv not in ipvs: raise FirewallError(errors.INVALID_IPV, "'%s' not in '%s'" % (ipv, ipvs)) def _check_config(self, config, item): if item == "ports": for port in config: check_port(port[0]) check_tcpudp(port[1]) elif item == "module": if not config.startswith("nf_conntrack_"): raise FirewallError( errors.INVALID_MODULE, "'%s' does not start with 'nf_conntrack_'" % config) if len(config.replace("nf_conntrack_", "")) < 1: raise FirewallError(errors.INVALID_MODULE, "Module name '%s' too short" % config) # PARSER class helper_ContentHandler(IO_Object_ContentHandler): def startElement(self, name, attrs): IO_Object_ContentHandler.startElement(self, name, attrs) self.item.parser_check_element_attrs(name, attrs) if name == "helper": if "version" in attrs: self.item.version = attrs["version"] if "family" in attrs: self.item.check_ipv(attrs["family"]) self.item.family = attrs["family"] if "module" in attrs: if not attrs["module"].startswith("nf_conntrack_"): raise FirewallError( errors.INVALID_MODULE, "'%s' does not start with 'nf_conntrack_'" % \ attrs["module"]) if len(attrs["module"].replace("nf_conntrack_", "")) < 1: raise FirewallError( errors.INVALID_MODULE, "Module name '%s' too short" % attrs["module"]) self.item.module = attrs["module"] elif name == "short": pass elif name == "description": pass elif name == "port": check_port(attrs["port"]) check_tcpudp(attrs["protocol"]) entry = (attrs["port"], attrs["protocol"]) if entry not in self.item.ports: self.item.ports.append(entry) else: log.warning("Port '%s/%s' already set, ignoring.", attrs["port"], attrs["protocol"]) def helper_reader(filename, path): helper = Helper() if not filename.endswith(".xml"): raise FirewallError(errors.INVALID_NAME, "'%s' is missing .xml suffix" % filename) helper.name = filename[:-4] helper.check_name(helper.name) helper.filename = filename helper.path = path helper.builtin = False if path.startswith(config.ETC_FIREWALLD) else True helper.default = helper.builtin handler = helper_ContentHandler(helper) parser = sax.make_parser() parser.setContentHandler(handler) name = "%s/%s" % (path, filename) with open(name, "rb") as f: source = sax.InputSource(None) source.setByteStream(f) try: parser.parse(source) except sax.SAXParseException as msg: raise FirewallError(errors.INVALID_HELPER, "not a valid helper file: %s" % \ msg.getException()) del handler del parser if PY2: helper.encode_strings() return helper def helper_writer(helper, path=None): _path = path if path else helper.path if helper.filename: name = "%s/%s" % (_path, helper.filename) else: name = "%s/%s.xml" % (_path, helper.name) if os.path.exists(name): try: shutil.copy2(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) dirpath = os.path.dirname(name) if dirpath.startswith(config.ETC_FIREWALLD) and not os.path.exists(dirpath): if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) os.mkdir(dirpath, 0o750) f = io.open(name, mode='wt', encoding='UTF-8') handler = IO_Object_XMLGenerator(f) handler.startDocument() # start helper element attrs = {} attrs["module"] = helper.module if helper.version and helper.version != "": attrs["version"] = helper.version if helper.family and helper.family != "": attrs["family"] = helper.family handler.startElement("helper", attrs) handler.ignorableWhitespace("\n") # short if helper.short and helper.short != "": handler.ignorableWhitespace(" ") handler.startElement("short", { }) handler.characters(helper.short) handler.endElement("short") handler.ignorableWhitespace("\n") # description if helper.description and helper.description != "": handler.ignorableWhitespace(" ") handler.startElement("description", { }) handler.characters(helper.description) handler.endElement("description") handler.ignorableWhitespace("\n") # ports for port in helper.ports: handler.ignorableWhitespace(" ") handler.simpleElement("port", { "port": port[0], "protocol": port[1] }) handler.ignorableWhitespace("\n") # end helper element handler.endElement('helper') handler.ignorableWhitespace("\n") handler.endDocument() f.close() del handler PK[%yUU+site-packages/firewall/core/io/icmptype.pyonu[ c`c@sdddgZddljZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZddlmZdd lmZdd lmZde fd YZd e fd YZdZddZdS(tIcmpTypeticmptype_readerticmptype_writeriN(tconfig(t u2b_if_py2(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(tlog(terrors(t FirewallErrorcBseZdddddgffZdZddgZidd6dd6dd6Zid dgd6d d gd6Zd Zd Z dZ dZ RS(tversionttshortt descriptiont destinations(sssas)t_t-ticmptypetnametipv4tipv6cCs;tt|jd|_d|_d|_g|_dS(NR (tsuperRt__init__R RRR(tself((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR8s    cCs&d|_d|_d|_|j2dS(NR (R RRR(R((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pytcleanup?s   cCs_t|j|_t|j|_t|j|_g|jD]}t|^q@|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(RR RRR(Rtm((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pytencode_stringsEscCsI|dkrEx6|D]+}|dkrttjd|qqWndS(NRRRs'%s' not from {'ipv4'|'ipv6'}(RR(R R tINVALID_DESTINATION(RRtitemR((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyt _check_configNs     (sversionR (sshortR (s descriptionR N( t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRRRR(((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR%s"      ticmptype_ContentHandlercBseZdZRS(cCstj||||jj|||dkrxd|krVtjd|dnd|kr|d|j_qn|dkrns|dkrnd|dkrxUdd gD]D}||kr||jd kr|jjj t |qqWndS( NRRs'Ignoring deprecated attribute name='%s'R RRRRRtyesttrue(syesR*( Rt startElementRtparser_check_element_attrsR twarningR tlowerRtappendtstr(RRtattrstx((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR+Ys"        (R R!R+(((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyR(Xsc CsYt}|jds1ttjd|n|d |_|j|j||_||_|j t j rxt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r5}ttjd|jnXWdQX~~trU|jn|S(Ns.xmls%s is missing .xml suffixis%s/%strbsnot a valid icmptype file: %s(RtendswithR R t INVALID_NAMERt check_nametfilenametpatht startswithRt ETC_FIREWALLDtFalsetTruetbuiltintdefaultR(tsaxt make_parsertsetContentHandlertopent InputSourceR%t setByteStreamtparsetSAXParseExceptiontINVALID_ICMPTYPEt getExceptionRR( R7R8RthandlertparserRtftsourcetmsg((s=/usr/lib/python2.7/site-packages/firewall/core/io/icmptype.pyRms8     !       c Cs|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|jrq|jd krq|j|d s   "3 PK[ߓM}.}.5site-packages/firewall/core/io/lockdown_whitelist.pycnu[ c`c@sddljZddlZddlZddlZddlmZddlmZm Z m Z m Z ddl m Z ddlmZmZmZmZmZmZddlmZddlmZde fd YZd e fd YZdS( iN(tconfig(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(tlog(tuniqifyt checkUsertcheckUidt checkCommandt checkContextt u2b_if_py2(terrors(t FirewallErrort!lockdown_whitelist_ContentHandlercBseZdZdZRS(cCstj||t|_dS(N(Rt__init__tFalset whitelist(tselftitem((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR%scCstj||||jj|||dkr\|jrPttjdnt|_n[|dkr|jst j ddS|d}|jj |n|dkrH|jst j ddSd|kr"yt |d}Wn't k rt j d |ddSX|jj|qd|kr|jj|dqno|d kr|jsnt j d dSd |krt j d dS|jj|d nt j d|dSdS(NRsMore than one whitelist.tcommands)Parse Error: command outside of whitelisttnametusers&Parse Error: user outside of whitelisttids"Parse Error: %s is not a valid uidtselinuxs)Parse Error: selinux outside of whitelisttcontextsParse Error: no contextsUnknown XML element %s(Rt startElementRtparser_check_element_attrsRR R t PARSE_ERRORtTrueRterrort add_commandtintt ValueErrortadd_uidtadd_usert add_context(RRtattrsRtuid((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR)sJ                      (t__name__t __module__RR(((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR$s tLockdownWhitelistcBsxeZdZddgfddgfddgfddgffZdZdgZid*d 6d gd 6d*d 6d gd6Zidd gd 6ZdZ dZ dZ dZ dZ dZdZdZdZdZdZdZdZdZdZdZd Zd!Zd"Zd#Zd$Zd%Zd&Zd'Z d(Z!d)Z"RS(+s LockdownWhitelist class tcommandsttcontextstuserstuidsis (asasasai)t_RRRRRRRcCsMtt|j||_d|_g|_g|_g|_g|_ dS(N( tsuperR)RtfilenametNonetparserR*R,R-R.(RR1((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyRns     cCs|d kr4x|D]}|j||d qWn|dkrdt|sttj|qn|dkrt|sttj|qn`|dkrt|sttj|qn0|d krt |sttj |qndS( NR*R,R-R.iRRRR&(scommandsscontextssuserssuids( t _check_configR R R tINVALID_COMMANDR tINVALID_CONTEXTRt INVALID_USERRt INVALID_UID(RRRtx((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR4ys          cCs |j2|j2|j2|j2dS(N(R*R,R-R.(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytcleanupscCssg|jD]}t|^q |_g|jD]}t|^q/|_g|jD]}t|^qT|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(R*R R,R-(RR9((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytencode_stringss%%cCs]t|s!ttj|n||jkrC|jj|nttjd|dS(Ns!Command "%s" already in whitelist(R R R R5R*tappendtALREADY_ENABLED(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyRs   cCs<||jkr"|jj|nttjd|dS(NsCommand "%s" not in whitelist.(R*tremoveR R t NOT_ENABLED(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytremove_commands cCs ||jkS(N(R*(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt has_commandscCsQxJ|jD]?}|jdr9|j|d rItSq ||kr tSq WtS(Nt*i(R*tendswitht startswithRR(RRt_command((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_commands cCs|jS(N(R*(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt get_commandsscCsct|s'ttjt|n||jkrI|jj|nttjd|dS(NsUid "%s" already in whitelist(RR R R8tstrR.R<R=(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR"s   cCs<||jkr"|jj|nttjd|dS(NsUid "%s" not in whitelist.(R.R>R R R?(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt remove_uids cCs ||jkS(N(R.(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pythas_uidscCs ||jkS(N(R.(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_uidscCs|jS(N(R.(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytget_uidsscCs]t|s!ttj|n||jkrC|jj|nttjd|dS(NsUser "%s" already in whitelist(RR R R7R-R<R=(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR#s   cCs<||jkr"|jj|nttjd|dS(NsUser "%s" not in whitelist.(R-R>R R R?(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt remove_users cCs ||jkS(N(R-(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pythas_userscCs ||jkS(N(R-(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_userscCs|jS(N(R-(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt get_usersscCs]t|s!ttj|n||jkrC|jj|nttjd|dS(Ns!Context "%s" already in whitelist(R R R R6R,R<R=(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR$"s   cCs<||jkr"|jj|nttjd|dS(NsContext "%s" not in whitelist.(R,R>R R R?(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytremove_context,s cCs ||jkS(N(R,(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt has_context3scCs ||jkS(N(R,(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_context6scCs|jS(N(R,(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt get_contexts9scCs|j|jjds8ttjd|jnt|}tj}|j |y|j |jWn2tj k r}ttj d|j nX~~tr|jndS(Ns.xmls'%s' is missing .xml suffixsNot a valid file: %s(R:R1RCR R t INVALID_NAMERtsaxt make_parsertsetContentHandlertparsetSAXParseExceptiont INVALID_TYPEt getExceptionRR;(RthandlerR3tmsg((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytread>s"      cCsHtjj|jreytj|jd|jWqetk ra}td|j|fqeXntjjtj stj tj dnt j |jdddd}t |}|j|jdi|jd xHt|jD]7}|jd |jd i|d 6|jd qWxNt|jD]=}|jd |jd it|d6|jd q<WxHt|jD]7}|jd |jd i|d 6|jd qWxHt|jD]7}|jd |jdi|d6|jd qW|jd|jd |j|j~dS(Ns%s.oldsBackup of '%s' failed: %sitmodetwttencodingsUTF-8Rs s RRRRRR(tostpathtexistsR1tshutiltcopy2t ExceptiontIOErrorRt ETC_FIREWALLDtmkdirtiotopenRt startDocumentRtignorableWhitespaceRR*t simpleElementR.RHR-R,t endElementt endDocumenttclose(RR^tfR]RR&RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytwriteQsB             N(#R'R(t__doc__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARSR2tPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRR4R:R;RR@RARFRGR"RIRJRKRLR#RMRNRORPR$RQRRRSRTR_Ru(((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR)WsP                   1     (txml.saxRVRcRlRftfirewallRtfirewall.core.io.io_objectRRRRtfirewall.core.loggerRtfirewall.functionsRRRR R R R tfirewall.errorsR RR)(((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyts   ".3PK[99)site-packages/firewall/core/io/direct.pycnu[ c`c@s ddljZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZddlmZddlmZddlmZdd lmZdd lmZd efd YZd efdYZdS(iN(tconfig(tLastUpdatedOrderedDict(t splitArgstjoinArgst u2b_if_py2(t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(tlog(t ipXtables(tebtables(terrors(t FirewallErrortdirect_ContentHandlercBs#eZdZdZdZRS(cCstj||t|_dS(N(Rt__init__tFalsetdirect(tselftitem((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR(scCstj||||jj|||dkr\|jrPttjdnt|_n|dkr|jst j ddS|d}|d}|d}|jj t |t |t |n+|dkr|jst j ddS|d}|dkr ttj d |n|d}|d}yt|d }Wn'tk rqt j d|d dSXt |t |t ||g|_nZ|dkr|jst j ddS|d}t |g|_nt j d|dSdS(NRsMore than one direct tag.tchains$Parse Error: chain outside of directtipvttabletrules#Parse Error: rule outside of directtipv4tipv6tebs"'%s' not from {'ipv4'|'ipv6'|'eb'}tprioritys'Parse Error: %s is not a valid priorityt passthroughs&Parse Error: command outside of directsUnknown XML element %s(RRR(Rt startElementRtparser_check_element_attrsRR R t PARSE_ERRORtTrueRterrort add_chainRt INVALID_IPVtintt ValueErrort_rulet _passthrough(RtnametattrsRRRR((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR,sT                          cCstj|||dkr|jrm|jjgt|jD]}t|^q>|jj|jn t j dd|_nz|dkr|jr|j jgt|jD]}t|^q|jj |j nt j ddd|_ ndS(NRs2Error: rule does not have any arguments, ignoring.Rs0Error: passthrough does not have any arguments, s ignoring.(Rt endElementt_elementR%tappendRRRtadd_ruleRR tNoneR&tadd_passthrough(RR'tx((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR)^s    &     & (t__name__t __module__RRR)(((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR 's  2tDirectcBseZdZdd(gfddddddgfgfdddgfgffZdZid)d6dd d gd 6dd d d gd 6dgd 6ZiZdZdZ dZ dZ dZ dZ dZdZdZdZdZdZdZdZdZdZdZdZd Zd!Zd"Zd#Zd$Zd%Zd&Z d'Z!RS(*s Direct class tchainsttrulesit passthroughss(a(sss)a(sssias)a(sas))RRRRRRRcCsDtt|j||_t|_t|_t|_dS(N(tsuperR2RtfilenameRR3R5R6(RR8((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyRs    cCsdS(N((RtconfR((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt _check_configsc CsNg}g}xO|jD]D}x;|j|D],}|jtt|t|gq*WqW|j|g}xe|jD]Z}xQ|j|D]B}|jt|d|d|d|dt|dfqWq{W|j|g}xH|jD]=}x4|j|D]%}|jt|t|fq WqW|j|t|S(Niii(R3R+ttupletlistR5R6(RtretR/tkeyRR((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt export_configs$. % ' cCs|j|j|xt|jD]\}\}}|dkrjx"||D]}|j|qPWn|dkrx"||D]}|j|qWn|dkr'x"||D]}|j|qWq'q'WdS(NR3R5R6(tcleanupt check_configt enumeratetIMPORT_EXPORT_STRUCTURER!R,R.(RR9titelementtdummyR/((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt import_configs  "   cCs+|jj|jj|jjdS(N(R3tclearR5R6(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR@s  cCsdGHx;|jD]0}d|d|ddj|j|fGHqWdGHxe|jD]Z}d|d|d|dfGHx3|j|D]$\}}d |d j|fGHqWqRWd GHxD|jD]9}d |GHx'|j|D]}d d j|GHqWqWdS(NR3s (%s, %s): %siit,R5s (%s, %s, %s):is (%d, ('%s'))s','R6s %s:s ('%s')(R3tjoinR5R6(RR>Rtargs((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pytoutputs  cCs>dddg}||kr:ttjd||fndS(NRRRs'%s' not in '%s'(R R R"(RRtipvs((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt _check_ipvs  cCsf|j||dkr(tjjn tjj}||krbttjd||fndS(NRRs'%s' not in '%s'(sipv4sipv6(RNR tBUILT_IN_CHAINStkeysR R R t INVALID_TABLE(RRRttables((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt_check_ipv_tables    cCs|j||||f}||jkr;g|j|((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR!s  cCs|j||||f}||jkr{||j|kr{|j|j|t|j|dkr|j|=qntd|||fdS(Nis4Chain '%s' with table '%s' with ipv '%s' not in list(RSR3tremovetlenR$(RRRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt remove_chains "cCs<|j||||f}||jko;||j|kS(N(RSR3(RRRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt query_chains cCsP|j||||f}||jkr6|j|Std||fdS(Ns&No chains for table '%s' with ipv '%s'(RSR3R$(RRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt get_chainss   cCs|jS(N(R3(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pytget_all_chainsscCs|j|||||f}||jkrAt|j|tvalue((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR,s'cCs|j|||||f}|t|f}||jkr||j|kr|j||=t|j|dkr|j|=qn0tddj|||fd||fdS(Nis(Rule '%s' for table '%s' and chain '%s' s',s)with ipv '%s' and priority %d not in list(RSR;R5RVR$RJ(RRRRRRKR>R[((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt remove_rules"cCs|j|||||f}||jkrx)|j|jD]}|j||=qBWt|j|dkr|j|=qndS(Ni(RSR5RPRV(RRRRR>R[((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt remove_rules"scCsQ|j|||||f}|t|f}||jkoP||j|kS(N(RSR;R5(RRRRRRKR>R[((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt query_rule+scCs[|j|||||f}||jkr9|j|Std||fd|dS(Ns'No rules for table '%s' and chain '%s' s with ipv '%s'(RSR5R$(RRRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt get_rules1s  cCs|jS(N(R5(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt get_all_rules:scCs~|j|||jkr,g|j|RRRRRK((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pytwriteusZ               (R4R4R4N("R0R1t__doc__RCtDBUS_SIGNATURER-tPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRR:R?RGR@RLRNRSR!RWRXRYRZR,R\R]R^R_R`R.RaRbRcRdRwR(((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR2usJ                  (txml.saxRhR{RR~tfirewallRtfirewall.fw_typesRtfirewall.functionsRRRtfirewall.core.io.io_objectRRRtfirewall.core.loggerRt firewall.coreR R R tfirewall.errorsR R R2(((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyts   NPK[! )site-packages/firewall/core/io/helper.pyonu[ c`c@sdddgZddljZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZmZmZddlmZdd lmZdd lmZde fd YZd e fd YZdZddZdS(tHelpert helper_readert helper_writeriN(tconfig(t u2b_if_py2(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudp(tlog(terrors(t FirewallErrorcBseZdddddddgffZdZdd gZidd6dd6dgd 6Zid ddgd 6d d gd 6ZdZdZ dZ dZ dZ RS(tversionttshortt descriptiontfamilytmoduletportss (sssssa(ss))t-t.thelpertnametporttprotocolcCsMtt|jd|_d|_d|_d|_d|_g|_dS(NR( tsuperRt__init__RRRRRR(tself((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR;s     cCs8d|_d|_d|_d|_d|_|j2dS(NR(RRRRRR(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pytcleanupDs      cCst|j|_t|j|_t|j|_t|j|_t|j|_g|jD]$\}}t|t|f^qd|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(RRRRRRR(Rtpotpr((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pytencode_stringsLs cCs;ddg}||kr7ttjd||fndS(Ntipv4tipv6s'%s' not in '%s'(R R t INVALID_IPV(Rtipvtipvs((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyt check_ipvWs   cCs|dkr<x|D]"}t|dt|dqWnn|dkr|jdspttjd|nt|jdddkrttjd|qndS( NRiiRt nf_conntrack_s('%s' does not start with 'nf_conntrack_'RsModule name '%s' too short(R R t startswithR R tINVALID_MODULEtlentreplace(RRtitemR((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyt _check_config]s    (sversionR(sshortR(s descriptionR(sfamilyR(smoduleR(RRN( t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRRR!R'R.(((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR&s(    thelper_ContentHandlercBseZdZRS(cCstj||||jj|||dkrd|krQ|d|j_nd|kr|jj|d|d|j_nd|kr|djdstt j d|dnt |dj dddkrtt j d |dn|d|j_ qn|d kr$n|d kr3n|d krt|d t|d |d |d f}||jjkr|jjj|qtjd|d |d ndS(NRRRRR(s('%s' does not start with 'nf_conntrack_'RisModule name '%s' too shortRRRRs#Port '%s/%s' already set, ignoring.(Rt startElementR-tparser_check_element_attrsRR'RR)R R R*R+R,RR R RtappendR twarning(RRtattrstentry((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR8ns>    "    (R/R0R8(((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR7msc CsYt}|jds1ttjd|n|d |_|j|j||_||_|j t j rxt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r5}ttjd|jnXWdQX~~trU|jn|S(Ns.xmls'%s' is missing .xml suffixis%s/%strbsnot a valid helper file: %s(RtendswithR R t INVALID_NAMERt check_nametfilenametpathR)Rt ETC_FIREWALLDtFalsetTruetbuiltintdefaultR7tsaxt make_parsertsetContentHandlertopent InputSourceR4t setByteStreamtparsetSAXParseExceptiontINVALID_HELPERt getExceptionRR!( RBRCRthandlertparserRtftsourcetmsg((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyRs8     !       c Cs|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|j|d <|jr~|jd kr~|j|d s   .G# PK[m'site-packages/firewall/core/io/ifcfg.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """ifcfg file parser""" __all__ = [ "ifcfg" ] import os.path import io import tempfile import shutil from firewall.core.logger import log from firewall.functions import b2u, u2b, PY2 class ifcfg(object): def __init__(self, filename): self._config = { } self._deleted = [ ] self.filename = filename self.clear() def clear(self): self._config = { } self._deleted = [ ] def cleanup(self): self._config.clear() def get(self, key): return self._config.get(key.strip()) def set(self, key, value): _key = b2u(key.strip()) self._config[_key] = b2u(value.strip()) if _key in self._deleted: self._deleted.remove(_key) def __str__(self): s = "" for (key, value) in self._config.items(): if s: s += '\n' s += '%s=%s' % (key, value) return u2b(s) if PY2 else s # load self.filename def read(self): self.clear() try: f = open(self.filename, "r") except Exception as msg: log.error("Failed to load '%s': %s", self.filename, msg) raise for line in f: if not line: break line = line.strip() if len(line) < 1 or line[0] in ['#', ';']: continue # get key/value pair pair = [ x.strip() for x in line.split("=", 1) ] if len(pair) != 2: continue if len(pair[1]) >= 2 and \ pair[1].startswith('"') and pair[1].endswith('"'): pair[1] = pair[1][1:-1] if pair[1] == '': continue elif self._config.get(pair[0]) is not None: log.warning("%s: Duplicate option definition: '%s'", self.filename, line.strip()) continue self._config[pair[0]] = pair[1] f.close() def write(self): if len(self._config) < 1: # no changes: nothing to do return # handled keys done = [ ] try: temp_file = tempfile.NamedTemporaryFile( mode='wt', prefix="%s." % os.path.basename(self.filename), dir=os.path.dirname(self.filename), delete=False) except Exception as msg: log.error("Failed to open temporary file: %s" % msg) raise modified = False empty = False try: f = io.open(self.filename, mode='rt', encoding='UTF-8') except Exception as msg: if os.path.exists(self.filename): log.error("Failed to open '%s': %s" % (self.filename, msg)) raise else: f = None else: for line in f: if not line: break # remove newline line = line.strip("\n") if len(line) < 1: if not empty: temp_file.write(u"\n") empty = True elif line[0] == '#': empty = False temp_file.write(line) temp_file.write(u"\n") else: p = line.split("=", 1) if len(p) != 2: empty = False temp_file.write(line+u"\n") continue key = p[0].strip() value = p[1].strip() if len(value) >= 2 and \ value.startswith('"') and value.endswith('"'): value = value[1:-1] # check for modified key/value pairs if key not in done: if key in self._config and self._config[key] != value: empty = False temp_file.write(u'%s=%s\n' % (key, self._config[key])) modified = True elif key in self._deleted: modified = True else: empty = False temp_file.write(line+u"\n") done.append(key) else: modified = True # write remaining key/value pairs if len(self._config) > 0: for (key, value) in self._config.items(): if key in done: continue if not empty: empty = True temp_file.write(u'%s=%s\n' % (key, value)) modified = True if f: f.close() temp_file.close() if not modified: # not modified: remove tempfile os.remove(temp_file.name) return # make backup if os.path.exists(self.filename): try: shutil.copy2(self.filename, "%s.bak" % self.filename) except Exception as msg: os.remove(temp_file.name) raise IOError("Backup of '%s' failed: %s" % (self.filename, msg)) # copy tempfile try: shutil.move(temp_file.name, self.filename) except Exception as msg: os.remove(temp_file.name) raise IOError("Failed to create '%s': %s" % (self.filename, msg)) else: os.chmod(self.filename, 0o600) PK[99)site-packages/firewall/core/io/direct.pyonu[ c`c@s ddljZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZddlmZddlmZddlmZdd lmZdd lmZd efd YZd efdYZdS(iN(tconfig(tLastUpdatedOrderedDict(t splitArgstjoinArgst u2b_if_py2(t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(tlog(t ipXtables(tebtables(terrors(t FirewallErrortdirect_ContentHandlercBs#eZdZdZdZRS(cCstj||t|_dS(N(Rt__init__tFalsetdirect(tselftitem((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR(scCstj||||jj|||dkr\|jrPttjdnt|_n|dkr|jst j ddS|d}|d}|d}|jj t |t |t |n+|dkr|jst j ddS|d}|dkr ttj d |n|d}|d}yt|d }Wn'tk rqt j d|d dSXt |t |t ||g|_nZ|dkr|jst j ddS|d}t |g|_nt j d|dSdS(NRsMore than one direct tag.tchains$Parse Error: chain outside of directtipvttabletrules#Parse Error: rule outside of directtipv4tipv6tebs"'%s' not from {'ipv4'|'ipv6'|'eb'}tprioritys'Parse Error: %s is not a valid priorityt passthroughs&Parse Error: command outside of directsUnknown XML element %s(RRR(Rt startElementRtparser_check_element_attrsRR R t PARSE_ERRORtTrueRterrort add_chainRt INVALID_IPVtintt ValueErrort_rulet _passthrough(RtnametattrsRRRR((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR,sT                          cCstj|||dkr|jrm|jjgt|jD]}t|^q>|jj|jn t j dd|_nz|dkr|jr|j jgt|jD]}t|^q|jj |j nt j ddd|_ ndS(NRs2Error: rule does not have any arguments, ignoring.Rs0Error: passthrough does not have any arguments, s ignoring.(Rt endElementt_elementR%tappendRRRtadd_ruleRR tNoneR&tadd_passthrough(RR'tx((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR)^s    &     & (t__name__t __module__RRR)(((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR 's  2tDirectcBseZdZdd(gfddddddgfgfdddgfgffZdZid)d6dd d gd 6dd d d gd 6dgd 6ZiZdZdZ dZ dZ dZ dZ dZdZdZdZdZdZdZdZdZdZdZdZd Zd!Zd"Zd#Zd$Zd%Zd&Z d'Z!RS(*s Direct class tchainsttrulesit passthroughss(a(sss)a(sssias)a(sas))RRRRRRRcCsDtt|j||_t|_t|_t|_dS(N(tsuperR2RtfilenameRR3R5R6(RR8((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyRs    cCsdS(N((RtconfR((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt _check_configsc CsNg}g}xO|jD]D}x;|j|D],}|jtt|t|gq*WqW|j|g}xe|jD]Z}xQ|j|D]B}|jt|d|d|d|dt|dfqWq{W|j|g}xH|jD]=}x4|j|D]%}|jt|t|fq WqW|j|t|S(Niii(R3R+ttupletlistR5R6(RtretR/tkeyRR((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt export_configs$. % ' cCs|j|j|xt|jD]\}\}}|dkrjx"||D]}|j|qPWn|dkrx"||D]}|j|qWn|dkr'x"||D]}|j|qWq'q'WdS(NR3R5R6(tcleanupt check_configt enumeratetIMPORT_EXPORT_STRUCTURER!R,R.(RR9titelementtdummyR/((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt import_configs  "   cCs+|jj|jj|jjdS(N(R3tclearR5R6(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR@s  cCsdGHx;|jD]0}d|d|ddj|j|fGHqWdGHxe|jD]Z}d|d|d|dfGHx3|j|D]$\}}d |d j|fGHqWqRWd GHxD|jD]9}d |GHx'|j|D]}d d j|GHqWqWdS(NR3s (%s, %s): %siit,R5s (%s, %s, %s):is (%d, ('%s'))s','R6s %s:s ('%s')(R3tjoinR5R6(RR>Rtargs((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pytoutputs  cCs>dddg}||kr:ttjd||fndS(NRRRs'%s' not in '%s'(R R R"(RRtipvs((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt _check_ipvs  cCsf|j||dkr(tjjn tjj}||krbttjd||fndS(NRRs'%s' not in '%s'(sipv4sipv6(RNR tBUILT_IN_CHAINStkeysR R R t INVALID_TABLE(RRRttables((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt_check_ipv_tables    cCs|j||||f}||jkr;g|j|((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR!s  cCs|j||||f}||jkr{||j|kr{|j|j|t|j|dkr|j|=qntd|||fdS(Nis4Chain '%s' with table '%s' with ipv '%s' not in list(RSR3tremovetlenR$(RRRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt remove_chains "cCs<|j||||f}||jko;||j|kS(N(RSR3(RRRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt query_chains cCsP|j||||f}||jkr6|j|Std||fdS(Ns&No chains for table '%s' with ipv '%s'(RSR3R$(RRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt get_chainss   cCs|jS(N(R3(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pytget_all_chainsscCs|j|||||f}||jkrAt|j|tvalue((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR,s'cCs|j|||||f}|t|f}||jkr||j|kr|j||=t|j|dkr|j|=qn0tddj|||fd||fdS(Nis(Rule '%s' for table '%s' and chain '%s' s',s)with ipv '%s' and priority %d not in list(RSR;R5RVR$RJ(RRRRRRKR>R[((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt remove_rules"cCs|j|||||f}||jkrx)|j|jD]}|j||=qBWt|j|dkr|j|=qndS(Ni(RSR5RPRV(RRRRR>R[((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt remove_rules"scCsQ|j|||||f}|t|f}||jkoP||j|kS(N(RSR;R5(RRRRRRKR>R[((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt query_rule+scCs[|j|||||f}||jkr9|j|Std||fd|dS(Ns'No rules for table '%s' and chain '%s' s with ipv '%s'(RSR5R$(RRRRR>((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt get_rules1s  cCs|jS(N(R5(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyt get_all_rules:scCs~|j|||jkr,g|j|RRRRRK((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pytwriteusZ               (R4R4R4N("R0R1t__doc__RCtDBUS_SIGNATURER-tPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRR:R?RGR@RLRNRSR!RWRXRYRZR,R\R]R^R_R`R.RaRbRcRdRwR(((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyR2usJ                  (txml.saxRhR{RR~tfirewallRtfirewall.fw_typesRtfirewall.functionsRRRtfirewall.core.io.io_objectRRRtfirewall.core.loggerRt firewall.coreR R R tfirewall.errorsR R R2(((s;/usr/lib/python2.7/site-packages/firewall/core/io/direct.pyts   NPK[H˨+site-packages/firewall/core/io/functions.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2018 Red Hat, Inc. # # Authors: # Eric Garver # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os from firewall import config from firewall.errors import FirewallError from firewall.core.io.zone import zone_reader from firewall.core.io.service import service_reader from firewall.core.io.ipset import ipset_reader from firewall.core.io.icmptype import icmptype_reader from firewall.core.io.helper import helper_reader from firewall.core.io.direct import Direct from firewall.core.io.lockdown_whitelist import LockdownWhitelist from firewall.core.io.firewalld_conf import firewalld_conf def check_config(fw=None): readers = { "ipset" : (ipset_reader, [config.FIREWALLD_IPSETS, config.ETC_FIREWALLD_IPSETS]), "helper" : (helper_reader, [config.FIREWALLD_HELPERS, config.ETC_FIREWALLD_HELPERS]), "icmptype" : (icmptype_reader, [config.FIREWALLD_ICMPTYPES, config.ETC_FIREWALLD_ICMPTYPES]), "service" : (service_reader, [config.FIREWALLD_SERVICES, config.ETC_FIREWALLD_SERVICES]), "zone" : (zone_reader, [config.FIREWALLD_ZONES, config.ETC_FIREWALLD_ZONES]), } for reader in readers.keys(): for dir in readers[reader][1]: if not os.path.isdir(dir): continue for file in sorted(os.listdir(dir)): if file.endswith(".xml"): try: obj = readers[reader][0](file, dir) if fw and reader == "zone": obj.fw_config = fw.config obj.check_config(obj.export_config()) except FirewallError as error: raise FirewallError(error.code, "'%s': %s" % (file, error.msg)) except Exception as msg: raise Exception("'%s': %s" % (file, msg)) if os.path.isfile(config.FIREWALLD_DIRECT): try: obj = Direct(config.FIREWALLD_DIRECT) obj.read() obj.check_config(obj.export_config()) except FirewallError as error: raise FirewallError(error.code, "'%s': %s" % (config.FIREWALLD_DIRECT, error.msg)) except Exception as msg: raise Exception("'%s': %s" % (config.FIREWALLD_DIRECT, msg)) if os.path.isfile(config.LOCKDOWN_WHITELIST): try: obj = LockdownWhitelist(config.LOCKDOWN_WHITELIST) obj.read() obj.check_config(obj.export_config()) except FirewallError as error: raise FirewallError(error.code, "'%s': %s" % (config.LOCKDOWN_WHITELIST, error.msg)) except Exception as msg: raise Exception("'%s': %s" % (config.LOCKDOWN_WHITELIST, msg)) if os.path.isfile(config.FIREWALLD_CONF): try: obj = firewalld_conf(config.FIREWALLD_CONF) obj.read() except FirewallError as error: raise FirewallError(error.code, "'%s': %s" % (config.FIREWALLD_CONF, error.msg)) except Exception as msg: raise Exception("'%s': %s" % (config.FIREWALLD_CONF, msg)) PK[ߓM}.}.5site-packages/firewall/core/io/lockdown_whitelist.pyonu[ c`c@sddljZddlZddlZddlZddlmZddlmZm Z m Z m Z ddl m Z ddlmZmZmZmZmZmZddlmZddlmZde fd YZd e fd YZdS( iN(tconfig(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGenerator(tlog(tuniqifyt checkUsertcheckUidt checkCommandt checkContextt u2b_if_py2(terrors(t FirewallErrort!lockdown_whitelist_ContentHandlercBseZdZdZRS(cCstj||t|_dS(N(Rt__init__tFalset whitelist(tselftitem((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR%scCstj||||jj|||dkr\|jrPttjdnt|_n[|dkr|jst j ddS|d}|jj |n|dkrH|jst j ddSd|kr"yt |d}Wn't k rt j d |ddSX|jj|qd|kr|jj|dqno|d kr|jsnt j d dSd |krt j d dS|jj|d nt j d|dSdS(NRsMore than one whitelist.tcommands)Parse Error: command outside of whitelisttnametusers&Parse Error: user outside of whitelisttids"Parse Error: %s is not a valid uidtselinuxs)Parse Error: selinux outside of whitelisttcontextsParse Error: no contextsUnknown XML element %s(Rt startElementRtparser_check_element_attrsRR R t PARSE_ERRORtTrueRterrort add_commandtintt ValueErrortadd_uidtadd_usert add_context(RRtattrsRtuid((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR)sJ                      (t__name__t __module__RR(((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR$s tLockdownWhitelistcBsxeZdZddgfddgfddgfddgffZdZdgZid*d 6d gd 6d*d 6d gd6Zidd gd 6ZdZ dZ dZ dZ dZ dZdZdZdZdZdZdZdZdZdZdZd Zd!Zd"Zd#Zd$Zd%Zd&Zd'Z d(Z!d)Z"RS(+s LockdownWhitelist class tcommandsttcontextstuserstuidsis (asasasai)t_RRRRRRRcCsMtt|j||_d|_g|_g|_g|_g|_ dS(N( tsuperR)RtfilenametNonetparserR*R,R-R.(RR1((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyRns     cCs|d kr4x|D]}|j||d qWn|dkrdt|sttj|qn|dkrt|sttj|qn`|dkrt|sttj|qn0|d krt |sttj |qndS( NR*R,R-R.iRRRR&(scommandsscontextssuserssuids( t _check_configR R R tINVALID_COMMANDR tINVALID_CONTEXTRt INVALID_USERRt INVALID_UID(RRRtx((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR4ys          cCs |j2|j2|j2|j2dS(N(R*R,R-R.(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytcleanupscCssg|jD]}t|^q |_g|jD]}t|^q/|_g|jD]}t|^qT|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(R*R R,R-(RR9((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytencode_stringss%%cCs]t|s!ttj|n||jkrC|jj|nttjd|dS(Ns!Command "%s" already in whitelist(R R R R5R*tappendtALREADY_ENABLED(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyRs   cCs<||jkr"|jj|nttjd|dS(NsCommand "%s" not in whitelist.(R*tremoveR R t NOT_ENABLED(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytremove_commands cCs ||jkS(N(R*(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt has_commandscCsQxJ|jD]?}|jdr9|j|d rItSq ||kr tSq WtS(Nt*i(R*tendswitht startswithRR(RRt_command((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_commands cCs|jS(N(R*(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt get_commandsscCsct|s'ttjt|n||jkrI|jj|nttjd|dS(NsUid "%s" already in whitelist(RR R R8tstrR.R<R=(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR"s   cCs<||jkr"|jj|nttjd|dS(NsUid "%s" not in whitelist.(R.R>R R R?(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt remove_uids cCs ||jkS(N(R.(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pythas_uidscCs ||jkS(N(R.(RR&((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_uidscCs|jS(N(R.(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytget_uidsscCs]t|s!ttj|n||jkrC|jj|nttjd|dS(NsUser "%s" already in whitelist(RR R R7R-R<R=(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR#s   cCs<||jkr"|jj|nttjd|dS(NsUser "%s" not in whitelist.(R-R>R R R?(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt remove_users cCs ||jkS(N(R-(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pythas_userscCs ||jkS(N(R-(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_userscCs|jS(N(R-(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt get_usersscCs]t|s!ttj|n||jkrC|jj|nttjd|dS(Ns!Context "%s" already in whitelist(R R R R6R,R<R=(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR$"s   cCs<||jkr"|jj|nttjd|dS(NsContext "%s" not in whitelist.(R,R>R R R?(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytremove_context,s cCs ||jkS(N(R,(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt has_context3scCs ||jkS(N(R,(RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt match_context6scCs|jS(N(R,(R((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyt get_contexts9scCs|j|jjds8ttjd|jnt|}tj}|j |y|j |jWn2tj k r}ttj d|j nX~~tr|jndS(Ns.xmls'%s' is missing .xml suffixsNot a valid file: %s(R:R1RCR R t INVALID_NAMERtsaxt make_parsertsetContentHandlertparsetSAXParseExceptiont INVALID_TYPEt getExceptionRR;(RthandlerR3tmsg((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytread>s"      cCsHtjj|jreytj|jd|jWqetk ra}td|j|fqeXntjjtj stj tj dnt j |jdddd}t |}|j|jdi|jd xHt|jD]7}|jd |jd i|d 6|jd qWxNt|jD]=}|jd |jd it|d6|jd q<WxHt|jD]7}|jd |jd i|d 6|jd qWxHt|jD]7}|jd |jdi|d6|jd qW|jd|jd |j|j~dS(Ns%s.oldsBackup of '%s' failed: %sitmodetwttencodingsUTF-8Rs s RRRRRR(tostpathtexistsR1tshutiltcopy2t ExceptiontIOErrorRt ETC_FIREWALLDtmkdirtiotopenRt startDocumentRtignorableWhitespaceRR*t simpleElementR.RHR-R,t endElementt endDocumenttclose(RR^tfR]RR&RR((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pytwriteQsB             N(#R'R(t__doc__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARSR2tPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRR4R:R;RR@RARFRGR"RIRJRKRLR#RMRNRORPR$RQRRRSRTR_Ru(((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyR)WsP                   1     (txml.saxRVRcRlRftfirewallRtfirewall.core.io.io_objectRRRRtfirewall.core.loggerRtfirewall.functionsRRRR R R R tfirewall.errorsR RR)(((sG/usr/lib/python2.7/site-packages/firewall/core/io/lockdown_whitelist.pyts   ".3PK[ʱ/+site-packages/firewall/core/io/__init__.pyonu[ c`c@sddlZdejkrddlmZeedsVdZeedenddlmZeedsdZ eede qndS( iNt_xmlplus(tAttributesImplt __contains__cCs|t|dkS(Nt_attrs(tgetattr(tselftname((s=/usr/lib/python2.7/site-packages/firewall/core/io/__init__.pyt__AttributesImpl__contains__s(t XMLGeneratort_writecCst|dj|dS(Nt_out(Rtwrite(Rttext((s=/usr/lib/python2.7/site-packages/firewall/core/io/__init__.pyt__XMLGenerator_write$s( txmlt__file__txml.sax.xmlreaderRthasattrRtsetattrtxml.sax.saxutilsRR (((s=/usr/lib/python2.7/site-packages/firewall/core/io/__init__.pyts   PK[) ,site-packages/firewall/core/io/functions.pycnu[ c`c@sddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z ddl mZdd lmZdd lmZdd lmZdd ZdS( iN(tconfig(t FirewallError(t zone_reader(tservice_reader(t ipset_reader(ticmptype_reader(t helper_reader(tDirect(tLockdownWhitelist(tfirewalld_confcCsittjtjgfd6ttjtjgfd6ttjtj gfd6t tj tj gfd6t tjtjgfd6}x#|jD]}x ||dD]}tjj|sqnxttj|D]}|jdryO||d||}|r)|dkr)|j|_n|j|jWqtk rq}t|jd ||jfqtk r}td ||fqXqqWqWqWtjjtjrTy0t tj}|j!|j|jWqTtk r%}t|jd tj|jfqTtk rP}td tj|fqTXntjjtj"ry0t#tj"}|j!|j|jWqtk r}t|jd tj"|jfqtk r}td tj"|fqXntjjtj$ryt%tj$}|j!Wqtk rh}t|jd tj$|jfqtk r}td tj$|fqXndS( Ntipsetthelperticmptypetservicetzoneis.xmlis'%s': %s(&RRtFIREWALLD_IPSETStETC_FIREWALLD_IPSETSRtFIREWALLD_HELPERStETC_FIREWALLD_HELPERSRtFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPESRtFIREWALLD_SERVICEStETC_FIREWALLD_SERVICESRtFIREWALLD_ZONEStETC_FIREWALLD_ZONEStkeystostpathtisdirtsortedtlistdirtendswitht fw_configt check_configt export_configRtcodetmsgt ExceptiontisfiletFIREWALLD_DIRECTRtreadtLOCKDOWN_WHITELISTRtFIREWALLD_CONFR (tfwtreaderstreadertdirtfiletobjterrorR$((s>/usr/lib/python2.7/site-packages/firewall/core/io/functions.pyR!$s^") %  % %(RtfirewallRtfirewall.errorsRtfirewall.core.io.zoneRtfirewall.core.io.serviceRtfirewall.core.io.ipsetRtfirewall.core.io.icmptypeRtfirewall.core.io.helperRtfirewall.core.io.directRt#firewall.core.io.lockdown_whitelistRtfirewall.core.io.firewalld_confR tNoneR!(((s>/usr/lib/python2.7/site-packages/firewall/core/io/functions.pyts PK[) ,site-packages/firewall/core/io/functions.pyonu[ c`c@sddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z ddl mZdd lmZdd lmZdd lmZdd ZdS( iN(tconfig(t FirewallError(t zone_reader(tservice_reader(t ipset_reader(ticmptype_reader(t helper_reader(tDirect(tLockdownWhitelist(tfirewalld_confcCsittjtjgfd6ttjtjgfd6ttjtj gfd6t tj tj gfd6t tjtjgfd6}x#|jD]}x ||dD]}tjj|sqnxttj|D]}|jdryO||d||}|r)|dkr)|j|_n|j|jWqtk rq}t|jd ||jfqtk r}td ||fqXqqWqWqWtjjtjrTy0t tj}|j!|j|jWqTtk r%}t|jd tj|jfqTtk rP}td tj|fqTXntjjtj"ry0t#tj"}|j!|j|jWqtk r}t|jd tj"|jfqtk r}td tj"|fqXntjjtj$ryt%tj$}|j!Wqtk rh}t|jd tj$|jfqtk r}td tj$|fqXndS( Ntipsetthelperticmptypetservicetzoneis.xmlis'%s': %s(&RRtFIREWALLD_IPSETStETC_FIREWALLD_IPSETSRtFIREWALLD_HELPERStETC_FIREWALLD_HELPERSRtFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPESRtFIREWALLD_SERVICEStETC_FIREWALLD_SERVICESRtFIREWALLD_ZONEStETC_FIREWALLD_ZONEStkeystostpathtisdirtsortedtlistdirtendswitht fw_configt check_configt export_configRtcodetmsgt ExceptiontisfiletFIREWALLD_DIRECTRtreadtLOCKDOWN_WHITELISTRtFIREWALLD_CONFR (tfwtreaderstreadertdirtfiletobjterrorR$((s>/usr/lib/python2.7/site-packages/firewall/core/io/functions.pyR!$s^") %  % %(RtfirewallRtfirewall.errorsRtfirewall.core.io.zoneRtfirewall.core.io.serviceRtfirewall.core.io.ipsetRtfirewall.core.io.icmptypeRtfirewall.core.io.helperRtfirewall.core.io.directRt#firewall.core.io.lockdown_whitelistRtfirewall.core.io.firewalld_confR tNoneR!(((s>/usr/lib/python2.7/site-packages/firewall/core/io/functions.pyts PK[ L\44,site-packages/firewall/core/io/io_object.pycnu[ c`c@sadZddddddddgZd d ljZd d ljjZd d lZd d lZd d lm Z d d l m Z d d lm Z d dl mZejdkZdefdYZdefdYZdefdYZdefdYZdejjfdYZdejfdYZdZdZdZdZd S(s5Generic io_object handler, io specific check methods.tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudptcheck_protocolt check_addressiN(t functions(tb2u(terrors(t FirewallErrort3cBsteZdZd ZdZgZiZiZdZdZ dZ dZ dZ dZ dZd ZRS( s; Abstract IO_Object as base for icmptype, service and zone s()cCs1d|_d|_d|_t|_t|_dS(Nt(tfilenametpathtnametFalsetdefaulttbuiltin(tself((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt__init__1s     cCsGg}x4|jD])}|jtjt||dqWt|S(Ni(tIMPORT_EXPORT_STRUCTUREtappendtcopytdeepcopytgetattrttuple(Rtrettx((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt export_config8s'cCs|j|xt|jD]\}\}}t||trg}t}x;||D]/}||kr\|j||j|q\q\W~t||t j |qt||t j ||qWdS(N( t check_configt enumerateRt isinstancetlisttsetRtaddtsetattrRR(Rtconftitelementtdummyt_conft_setR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt import_config>s "   cCst|ts=ttjd|tdt|fnt|dkrdttjdnxI|D]A}|j rk||j krkttjd||fqkqkWdS(Ns'%s' not of type %s, but %sR isname can't be emptys'%s' is not allowed in '%s'( R!tstrR R t INVALID_TYPEttypetlent INVALID_NAMEtisalnumtADDITIONAL_ALNUM_CHARS(RRtchar((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt check_nameNs  cCst|t|jkrIttjdt|t|jfnxKt|jD]:\}\}}|j||||j|||qYWdS(Ns structure size mismatch %d != %d(R0RR R R.R t_check_config_structuret _check_config(RR&R'R(tvalue((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR[s""cCsdS(N((Rtdummy1tdummy2((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR7esc Cst|t|ksFttjd|t|t|fnt|trt|dkrttjd|nx||D]}|j||dqWnWt|tr(t|t|krttjd|t|fnxt |D] \}}|j|||qWnt|t rt|j d\}}x|j D]\}}t|t|krttjd|t|t|fnt|t|kr`ttjd|t|t|fq`q`WndS(Ns'%s' not of type %s, but %sislen('%s') != 1islen('%s') != %d( R/R R R.R!R"R0R6RR tdicttitems( RR&t structureRR'R8tskeytsvaluetkey((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR6is8 "    " cCs,|j}t}||jkrt}|j|dk rxP|j|D]>}||krj|j|qHttjd||fqHWqn||j krt}x4|j |D]"}||kr|j|qqWn|sttjd|nx*|D]"}ttjd||fqWdS(NsMissing attribute %s for %ssUnexpected element %ss%s: Unexpected attribute %s( tgetNamesRtPARSER_REQUIRED_ELEMENT_ATTRStTruetNonetremoveR R t PARSE_ERRORtPARSER_OPTIONAL_ELEMENT_ATTRS(RRtattrst_attrstfoundR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pytparser_check_element_attrss,      ((t__name__t __module__t__doc__RtDBUS_SIGNATURER3RBRGRRR,R5RR7R6RK(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR(s     !tUnexpectedElementErrorcBseZdZdZRS(cCs tt|j||_dS(N(tsuperRPRR(RR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRscCs d|jS(NsUnexpected element '%s'(R(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt__str__s(RLRMRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRPs tMissingAttributeErrorcBseZdZdZRS(cCs)tt|j||_||_dS(N(RQRSRRt attribute(RRRT((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs cCsd|j|jfS(Ns$Element '%s': missing '%s' attribute(RRT(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRRs(RLRMRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRSs tUnexpectedAttributeErrorcBseZdZdZRS(cCs)tt|j||_||_dS(N(RQRURRRT(RRRT((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs cCsd|j|jfS(Ns'Element '%s': unexpected attribute '%s'(RRT(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRRs(RLRMRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRUs cBs5eZdZdZdZdZdZRS(cCs||_d|_dS(NR (titemt_element(RRV((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs cCs d|_dS(NR (RW(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt startDocumentscCs d|_dS(NR (RW(RRRH((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt startElementscCs@|dkr|j|j_n|dkr<|j|j_ndS(Ntshortt description(RWRVRZR[(RR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt endElements  cCs|j|jdd7_dS(Ns t (RWtreplace(Rtcontent((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt characterss(RLRMRRXRYR\R`(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs     cBs>eZdZdZdZdZdZdZRS(cCsotjjj||j|_|j|_ig|_|jd|_ g|_ d|_ t |_ t |_dS(Nisutf-8(tsaxthandlertContentHandlerRtwritet_writetflusht_flusht _ns_contextst_current_contextt_undeclared_ns_mapst _encodingRt_pending_start_elementt_short_empty_elements(Rtout((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs      cCs9trd|jD}ntjj|||dS(s saxutils.XMLGenerator.startElement() expects name and attrs to be unicode and bad things happen if any of them is (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. cSs+i|]!\}}t|t|qS((R (t.0RR8((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pys s N(RR<tsaxutilst XMLGeneratorRY(RRRH((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRYscCstrv|jdt|xF|jD]8\}}|jdt|tjt|fq*W|jdn[|jd|x:|jD],\}}|jd|tj|fqW|jddS(s* slightly modified startElement() utN(RReR R<Rpt quoteattr(RRRHR8((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt simpleElements$cCstjj|t|dS(s saxutils.XMLGenerator.endElement() expects name to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. N(RpRqR\R (RR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR\scCstjj|t|dS(s saxutils.XMLGenerator.characters() expects content to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. N(RpRqR`R (RR_((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR`scCstjj|t|dS(s saxutils.XMLGenerator.ignorableWhitespace() expects content to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. N(RpRqtignorableWhitespaceR (RR_((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRus(RLRMRRYRtR\R`Ru(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs     cCstj|}|dkr4ttjd|n|dkrYttjd|nd|dkr~ttjd|n?t|dkr|d|dkrttjd|ndS( Nisport number in '%s' is too bigis'%s' is invalid port rangesport range '%s' is ambiguousiii(Rt getPortRangeR R t INVALID_PORTRDR0(tportt port_range((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs      & cCs)|dkr%ttjd|ndS(Nttcptudptsctptdccps)'%s' not from {'tcp'|'udp'|'sctp'|'dccp'}(RzR{R|R}(R R tINVALID_PROTOCOL(tprotocol((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR&s  cCs(tj|s$ttj|ndS(N(Rt checkProtocolR R R~(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR,scCs5tj||s1ttjd||fndS(Ns'%s' is not valid %s address(RRR R t INVALID_ADDR(tipvtaddr((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR0s ( RNt__all__txml.saxRatxml.sax.saxutilsRpRtsystfirewallRtfirewall.functionsR R tfirewall.errorsR tversionRtobjectRt ExceptionRPRSRURbRcRRqRRRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyts,     C   PK[A(site-packages/firewall/core/io/ifcfg.pyonu[ c`c@sdZdgZddlZddlZddlZddlZddlmZddl m Z m Z m Z de fdYZdS(sifcfg file parsertifcfgiN(tlog(tb2utu2btPY2cBsPeZdZdZdZdZdZdZdZdZ RS(cCs)i|_g|_||_|jdS(N(t_configt_deletedtfilenametclear(tselfR((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyt__init__#s   cCsi|_g|_dS(N(RR(R ((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyR)s cCs|jjdS(N(RR(R ((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pytcleanup-scCs|jj|jS(N(Rtgettstrip(R tkey((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyR 0scCsQt|j}t|j|j|<||jkrM|jj|ndS(N(RR RRtremove(R Rtvaluet_key((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pytset3scCsad}xD|jjD]3\}}|r5|d7}n|d||f7}qWtr]t|S|S(Nts s%s=%s(RtitemsRR(R tsRR((s:/usr/lib/python2.7/site-packages/firewall/core/io/ifcfg.pyt__str__9s  cCs|jyt|jd}Wn,tk rN}tjd|j|nXxL|D]D}|sfPn|j}t|dksV|dd krqVng|jddD]}|j^q}t|dkrqVnt|ddkr1|dj d r1|dj d r1|ddd !|d|j j |ddk rtjd |j|jqVn|d|j |ds     PK[ Ɵ//+site-packages/firewall/core/io/io_object.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """Generic io_object handler, io specific check methods.""" __all__ = [ "PY2", "IO_Object", "IO_Object_ContentHandler", "IO_Object_XMLGenerator", "check_port", "check_tcpudp", "check_protocol", "check_address" ] import xml.sax as sax import xml.sax.saxutils as saxutils import copy import sys from firewall import functions from firewall.functions import b2u from firewall import errors from firewall.errors import FirewallError PY2 = sys.version < '3' class IO_Object(object): """ Abstract IO_Object as base for icmptype, service and zone """ IMPORT_EXPORT_STRUCTURE = ( ) DBUS_SIGNATURE = '()' ADDITIONAL_ALNUM_CHARS = [ ] # additional to alnum PARSER_REQUIRED_ELEMENT_ATTRS = { } PARSER_OPTIONAL_ELEMENT_ATTRS = { } def __init__(self): self.filename = "" self.path = "" self.name = "" self.default = False self.builtin = False def export_config(self): ret = [ ] for x in self.IMPORT_EXPORT_STRUCTURE: ret.append(copy.deepcopy(getattr(self, x[0]))) return tuple(ret) def import_config(self, conf): self.check_config(conf) for i,(element,dummy) in enumerate(self.IMPORT_EXPORT_STRUCTURE): if isinstance(conf[i], list): # remove duplicates without changing the order _conf = [ ] _set = set() for x in conf[i]: if x not in _set: _conf.append(x) _set.add(x) del _set setattr(self, element, copy.deepcopy(_conf)) else: setattr(self, element, copy.deepcopy(conf[i])) def check_name(self, name): if not isinstance(name, str): raise FirewallError(errors.INVALID_TYPE, "'%s' not of type %s, but %s" % (name, type(""), type(name))) if len(name) < 1: raise FirewallError(errors.INVALID_NAME, "name can't be empty") for char in name: if not char.isalnum() and char not in self.ADDITIONAL_ALNUM_CHARS: raise FirewallError( errors.INVALID_NAME, "'%s' is not allowed in '%s'" % ((char, name))) def check_config(self, conf): if len(conf) != len(self.IMPORT_EXPORT_STRUCTURE): raise FirewallError( errors.INVALID_TYPE, "structure size mismatch %d != %d" % \ (len(conf), len(self.IMPORT_EXPORT_STRUCTURE))) for i,(element,value) in enumerate(self.IMPORT_EXPORT_STRUCTURE): self._check_config_structure(conf[i], value) self._check_config(conf[i], element) def _check_config(self, dummy1, dummy2): # to be overloaded by sub classes return def _check_config_structure(self, conf, structure): if not type(conf) == type(structure): raise FirewallError(errors.INVALID_TYPE, "'%s' not of type %s, but %s" % \ (conf, type(structure), type(conf))) if isinstance(structure, list): # same type elements, else struct if len(structure) != 1: raise FirewallError(errors.INVALID_TYPE, "len('%s') != 1" % structure) for x in conf: self._check_config_structure(x, structure[0]) elif isinstance(structure, tuple): if len(structure) != len(conf): raise FirewallError(errors.INVALID_TYPE, "len('%s') != %d" % (conf, len(structure))) for i,value in enumerate(structure): self._check_config_structure(conf[i], value) elif isinstance(structure, dict): # only one key value pair in structure (skey, svalue) = list(structure.items())[0] for (key, value) in conf.items(): if type(key) != type(skey): raise FirewallError(errors.INVALID_TYPE, "'%s' not of type %s, but %s" % (\ key, type(skey), type(key))) if type(value) != type(svalue): raise FirewallError(errors.INVALID_TYPE, "'%s' not of type %s, but %s" % (\ value, type(svalue), type(value))) # check required elements and attributes and also optional attributes def parser_check_element_attrs(self, name, attrs): _attrs = attrs.getNames() found = False if name in self.PARSER_REQUIRED_ELEMENT_ATTRS: found = True if self.PARSER_REQUIRED_ELEMENT_ATTRS[name] is not None: for x in self.PARSER_REQUIRED_ELEMENT_ATTRS[name]: if x in _attrs: _attrs.remove(x) else: raise FirewallError( errors.PARSE_ERROR, "Missing attribute %s for %s" % (x, name)) if name in self.PARSER_OPTIONAL_ELEMENT_ATTRS: found = True for x in self.PARSER_OPTIONAL_ELEMENT_ATTRS[name]: if x in _attrs: _attrs.remove(x) if not found: raise FirewallError(errors.PARSE_ERROR, "Unexpected element %s" % name) # raise attributes[0] for x in _attrs: raise FirewallError(errors.PARSE_ERROR, "%s: Unexpected attribute %s" % (name, x)) # PARSER class UnexpectedElementError(Exception): def __init__(self, name): super(UnexpectedElementError, self).__init__() self.name = name def __str__(self): return "Unexpected element '%s'" % (self.name) class MissingAttributeError(Exception): def __init__(self, name, attribute): super(MissingAttributeError, self).__init__() self.name = name self.attribute = attribute def __str__(self): return "Element '%s': missing '%s' attribute" % \ (self.name, self.attribute) class UnexpectedAttributeError(Exception): def __init__(self, name, attribute): super(UnexpectedAttributeError, self).__init__() self.name = name self.attribute = attribute def __str__(self): return "Element '%s': unexpected attribute '%s'" % \ (self.name, self.attribute) class IO_Object_ContentHandler(sax.handler.ContentHandler): def __init__(self, item): self.item = item self._element = "" def startDocument(self): self._element = "" def startElement(self, name, attrs): self._element = "" def endElement(self, name): if name == "short": self.item.short = self._element elif name == "description": self.item.description = self._element def characters(self, content): self._element += content.replace('\n', ' ') class IO_Object_XMLGenerator(saxutils.XMLGenerator): def __init__(self, out): # fix memory leak in saxutils.XMLGenerator.__init__: # out = _gettextwriter(out, encoding) # creates unbound object results in garbage in gc # # saxutils.XMLGenerator.__init__(self, out, "utf-8") # replaced by modified saxutils.XMLGenerator.__init__ code: sax.handler.ContentHandler.__init__(self) self._write = out.write self._flush = out.flush self._ns_contexts = [{}] # contains uri -> prefix dicts self._current_context = self._ns_contexts[-1] self._undeclared_ns_maps = [] self._encoding = "utf-8" self._pending_start_element = False self._short_empty_elements = False def startElement(self, name, attrs): """ saxutils.XMLGenerator.startElement() expects name and attrs to be unicode and bad things happen if any of them is (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. """ if PY2: attrs = { b2u(name):b2u(value) for name, value in attrs.items() } saxutils.XMLGenerator.startElement(self, name, attrs) def simpleElement(self, name, attrs): """ slightly modified startElement() """ if PY2: self._write(u'<' + b2u(name)) for (name, value) in attrs.items(): self._write(u' %s=%s' % (b2u(name), saxutils.quoteattr(b2u(value)))) self._write(u'/>') else: self._write('<' + name) for (name, value) in attrs.items(): self._write(' %s=%s' % (name, saxutils.quoteattr(value))) self._write('/>') def endElement(self, name): """ saxutils.XMLGenerator.endElement() expects name to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. """ saxutils.XMLGenerator.endElement(self, b2u(name)) def characters(self, content): """ saxutils.XMLGenerator.characters() expects content to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. """ saxutils.XMLGenerator.characters(self, b2u(content)) def ignorableWhitespace(self, content): """ saxutils.XMLGenerator.ignorableWhitespace() expects content to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. """ saxutils.XMLGenerator.ignorableWhitespace(self, b2u(content)) def check_port(port): port_range = functions.getPortRange(port) if port_range == -2: raise FirewallError(errors.INVALID_PORT, "port number in '%s' is too big" % port) elif port_range == -1: raise FirewallError(errors.INVALID_PORT, "'%s' is invalid port range" % port) elif port_range is None: raise FirewallError(errors.INVALID_PORT, "port range '%s' is ambiguous" % port) elif len(port_range) == 2 and port_range[0] >= port_range[1]: raise FirewallError(errors.INVALID_PORT, "'%s' is invalid port range" % port) def check_tcpudp(protocol): if protocol not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, "'%s' not from {'tcp'|'udp'|'sctp'|'dccp'}" % \ protocol) def check_protocol(protocol): if not functions.checkProtocol(protocol): raise FirewallError(errors.INVALID_PROTOCOL, protocol) def check_address(ipv, addr): if not functions.check_address(ipv, addr): raise FirewallError(errors.INVALID_ADDR, "'%s' is not valid %s address" % (addr, ipv)) PK[,==(site-packages/firewall/core/io/direct.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import xml.sax as sax import os import io import shutil from firewall import config from firewall.fw_types import LastUpdatedOrderedDict from firewall.functions import splitArgs, joinArgs, u2b_if_py2 from firewall.core.io.io_object import IO_Object, IO_Object_ContentHandler, \ IO_Object_XMLGenerator from firewall.core.logger import log from firewall.core import ipXtables from firewall.core import ebtables from firewall import errors from firewall.errors import FirewallError class direct_ContentHandler(IO_Object_ContentHandler): def __init__(self, item): IO_Object_ContentHandler.__init__(self, item) self.direct = False def startElement(self, name, attrs): IO_Object_ContentHandler.startElement(self, name, attrs) self.item.parser_check_element_attrs(name, attrs) if name == "direct": if self.direct: raise FirewallError(errors.PARSE_ERROR, "More than one direct tag.") self.direct = True elif name == "chain": if not self.direct: log.error("Parse Error: chain outside of direct") return ipv = attrs["ipv"] table = attrs["table"] chain = attrs["chain"] self.item.add_chain(u2b_if_py2(ipv), u2b_if_py2(table), u2b_if_py2(chain)) elif name == "rule": if not self.direct: log.error("Parse Error: rule outside of direct") return ipv = attrs["ipv"] if ipv not in [ "ipv4", "ipv6", "eb" ]: raise FirewallError(errors.INVALID_IPV, "'%s' not from {'ipv4'|'ipv6'|'eb'}" % ipv) table = attrs["table"] chain = attrs["chain"] try: priority = int(attrs["priority"]) except ValueError: log.error("Parse Error: %s is not a valid priority" % attrs["priority"]) return self._rule = [ u2b_if_py2(ipv), u2b_if_py2(table), u2b_if_py2(chain), priority ] elif name == "passthrough": if not self.direct: log.error("Parse Error: command outside of direct") return ipv = attrs["ipv"] self._passthrough = [ u2b_if_py2(ipv) ] else: log.error('Unknown XML element %s' % name) return def endElement(self, name): IO_Object_ContentHandler.endElement(self, name) if name == "rule": if self._element: # add arguments self._rule.append([ u2b_if_py2(x) for x in splitArgs(self._element) ]) self.item.add_rule(*self._rule) else: log.error("Error: rule does not have any arguments, ignoring.") self._rule = None elif name == "passthrough": if self._element: # add arguments self._passthrough.append([ u2b_if_py2(x) for x in splitArgs(self._element) ]) self.item.add_passthrough(*self._passthrough) else: log.error("Error: passthrough does not have any arguments, " + "ignoring.") self._passthrough = None class Direct(IO_Object): """ Direct class """ IMPORT_EXPORT_STRUCTURE = ( # chain: [ ipv, table, [ chain ] ] ( "chains", [ ( "", "", "" ), ], ), # a(sss) # rule: [ ipv, table, chain, [ priority, [ arg ] ] ] ( "rules", [ ( "", "", "", 0, [ "" ] ), ], ), # a(sssias) # passthrough: [ ipv, [ [ arg ] ] ] ( "passthroughs", [ ( "", [ "" ]), ], ), # a(sas) ) DBUS_SIGNATURE = '(a(sss)a(sssias)a(sas))' PARSER_REQUIRED_ELEMENT_ATTRS = { "direct": None, "chain": [ "ipv", "table", "chain" ], "rule": [ "ipv", "table", "chain", "priority" ], "passthrough": [ "ipv" ] } PARSER_OPTIONAL_ELEMENT_ATTRS = { } def __init__(self, filename): super(Direct, self).__init__() self.filename = filename self.chains = LastUpdatedOrderedDict() self.rules = LastUpdatedOrderedDict() self.passthroughs = LastUpdatedOrderedDict() def _check_config(self, conf, item): pass # check arg lists def export_config(self): ret = [ ] x = [ ] for key in self.chains: for chain in self.chains[key]: x.append(tuple(list(key) + list([chain]))) ret.append(x) x = [ ] for key in self.rules: for rule in self.rules[key]: x.append(tuple((key[0], key[1], key[2], rule[0], list(rule[1])))) ret.append(x) x = [ ] for key in self.passthroughs: for rule in self.passthroughs[key]: x.append(tuple((key, list(rule)))) ret.append(x) return tuple(ret) def import_config(self, conf): self.cleanup() self.check_config(conf) for i,(element,dummy) in enumerate(self.IMPORT_EXPORT_STRUCTURE): if element == "chains": for x in conf[i]: self.add_chain(*x) if element == "rules": for x in conf[i]: self.add_rule(*x) if element == "passthroughs": for x in conf[i]: self.add_passthrough(*x) def cleanup(self): self.chains.clear() self.rules.clear() self.passthroughs.clear() def output(self): print("chains") for key in self.chains: print(" (%s, %s): %s" % (key[0], key[1], ",".join(self.chains[key]))) print("rules") for key in self.rules: print(" (%s, %s, %s):" % (key[0], key[1], key[2])) for (priority,args) in self.rules[key]: print(" (%d, ('%s'))" % (priority, "','".join(args))) print("passthroughs") for key in self.passthroughs: print(" %s:" % (key)) for args in self.passthroughs[key]: print(" ('%s')" % ("','".join(args))) def _check_ipv(self, ipv): ipvs = ['ipv4', 'ipv6', 'eb'] if ipv not in ipvs: raise FirewallError(errors.INVALID_IPV, "'%s' not in '%s'" % (ipv, ipvs)) def _check_ipv_table(self, ipv, table): self._check_ipv(ipv) tables = ipXtables.BUILT_IN_CHAINS.keys() if ipv in ['ipv4', 'ipv6'] \ else ebtables.BUILT_IN_CHAINS.keys() if table not in tables: raise FirewallError(errors.INVALID_TABLE, "'%s' not in '%s'" % (table, tables)) # chains def add_chain(self, ipv, table, chain): self._check_ipv_table(ipv, table) key = (ipv, table) if key not in self.chains: self.chains[key] = [ ] if chain not in self.chains[key]: self.chains[key].append(chain) else: log.warning("Chain '%s' for table '%s' with ipv '%s' " % \ (chain, table, ipv) + "already in list, ignoring") def remove_chain(self, ipv, table, chain): self._check_ipv_table(ipv, table) key = (ipv, table) if key in self.chains and chain in self.chains[key]: self.chains[key].remove(chain) if len(self.chains[key]) == 0: del self.chains[key] else: raise ValueError( \ "Chain '%s' with table '%s' with ipv '%s' not in list" % \ (chain, table, ipv)) def query_chain(self, ipv, table, chain): self._check_ipv_table(ipv, table) key = (ipv, table) return (key in self.chains and chain in self.chains[key]) def get_chains(self, ipv, table): self._check_ipv_table(ipv, table) key = (ipv, table) if key in self.chains: return self.chains[key] else: raise ValueError("No chains for table '%s' with ipv '%s'" % \ (table, ipv)) def get_all_chains(self): return self.chains # rules def add_rule(self, ipv, table, chain, priority, args): self._check_ipv_table(ipv, table) key = (ipv, table, chain) if key not in self.rules: self.rules[key] = LastUpdatedOrderedDict() value = (priority, tuple(args)) if value not in self.rules[key]: self.rules[key][value] = priority else: log.warning("Rule '%s' for table '%s' and chain '%s' " % \ ("',".join(args), table, chain) + "with ipv '%s' and priority %d " % (ipv, priority) + "already in list, ignoring") def remove_rule(self, ipv, table, chain, priority, args): self._check_ipv_table(ipv, table) key = (ipv, table, chain) value = (priority, tuple(args)) if key in self.rules and value in self.rules[key]: del self.rules[key][value] if len(self.rules[key]) == 0: del self.rules[key] else: raise ValueError("Rule '%s' for table '%s' and chain '%s' " % \ ("',".join(args), table, chain) + \ "with ipv '%s' and priority %d not in list" % (ipv, priority)) def remove_rules(self, ipv, table, chain): self._check_ipv_table(ipv, table) key = (ipv, table, chain) if key in self.rules: for value in self.rules[key].keys(): del self.rules[key][value] if len(self.rules[key]) == 0: del self.rules[key] def query_rule(self, ipv, table, chain, priority, args): self._check_ipv_table(ipv, table) key = (ipv, table, chain) value = (priority, tuple(args)) return (key in self.rules and value in self.rules[key]) def get_rules(self, ipv, table, chain): self._check_ipv_table(ipv, table) key = (ipv, table, chain) if key in self.rules: return self.rules[key] else: raise ValueError("No rules for table '%s' and chain '%s' " %\ (table, chain) + "with ipv '%s'" % (ipv)) def get_all_rules(self): return self.rules # # passthrough # def add_passthrough(self, ipv, args): self._check_ipv(ipv) if ipv not in self.passthroughs: self.passthroughs[ipv] = [ ] if args not in self.passthroughs[ipv]: self.passthroughs[ipv].append(args) else: log.warning("Passthrough '%s' for ipv '%s'" % \ ("',".join(args), ipv) + "already in list, ignoring") def remove_passthrough(self, ipv, args): self._check_ipv(ipv) if ipv in self.passthroughs and args in self.passthroughs[ipv]: self.passthroughs[ipv].remove(args) if len(self.passthroughs[ipv]) == 0: del self.passthroughs[ipv] else: raise ValueError("Passthrough '%s' for ipv '%s'" % \ ("',".join(args), ipv) + "not in list") def query_passthrough(self, ipv, args): self._check_ipv(ipv) return ipv in self.passthroughs and args in self.passthroughs[ipv] def get_passthroughs(self, ipv): self._check_ipv(ipv) if ipv in self.passthroughs: return self.passthroughs[ipv] else: raise ValueError("No passthroughs for ipv '%s'" % (ipv)) def get_all_passthroughs(self): return self.passthroughs # read def read(self): self.cleanup() if not self.filename.endswith(".xml"): raise FirewallError(errors.INVALID_NAME, "'%s' is missing .xml suffix" % self.filename) handler = direct_ContentHandler(self) parser = sax.make_parser() parser.setContentHandler(handler) with open(self.filename, "rb") as f: source = sax.InputSource(None) source.setByteStream(f) try: parser.parse(source) except sax.SAXParseException as msg: raise FirewallError(errors.INVALID_TYPE, "Not a valid file: %s" % \ msg.getException()) def write(self): if os.path.exists(self.filename): try: shutil.copy2(self.filename, "%s.old" % self.filename) except Exception as msg: raise IOError("Backup of '%s' failed: %s" % (self.filename, msg)) if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) f = io.open(self.filename, mode='wt', encoding='UTF-8') handler = IO_Object_XMLGenerator(f) handler.startDocument() # start whitelist element handler.startElement("direct", { }) handler.ignorableWhitespace("\n") # chains for key in self.chains: (ipv, table) = key for chain in self.chains[key]: handler.ignorableWhitespace(" ") handler.simpleElement("chain", { "ipv": ipv, "table": table, "chain": chain }) handler.ignorableWhitespace("\n") # rules for key in self.rules: (ipv, table, chain) = key for (priority, args) in self.rules[key]: if len(args) < 1: continue handler.ignorableWhitespace(" ") handler.startElement("rule", { "ipv": ipv, "table": table, "chain": chain, "priority": "%d" % priority }) handler.ignorableWhitespace(sax.saxutils.escape(joinArgs(args))) handler.endElement("rule") handler.ignorableWhitespace("\n") # passthroughs for ipv in self.passthroughs: for args in self.passthroughs[ipv]: if len(args) < 1: continue handler.ignorableWhitespace(" ") handler.startElement("passthrough", { "ipv": ipv }) handler.ignorableWhitespace(sax.saxutils.escape(joinArgs(args))) handler.endElement("passthrough") handler.ignorableWhitespace("\n") # end zone element handler.endElement("direct") handler.ignorableWhitespace("\n") handler.endDocument() f.close() del handler PK[Bq^^'site-packages/firewall/core/io/zone.pycnu[ c`c@sjdddgZddljZddlZddlZddlZddlmZddlm Z m Z m Z m Z m Z mZmZmZmZmZddlmZmZddlmZmZmZmZmZmZmZdd lmZdd l m!Z!dd lm"Z"dd l#m$Z$defd YZ%defdYZ&e'dZ(e)dZ*dS(tZonet zone_readert zone_writeriN(tconfig( tcheckIPtcheckIP6t checkIPnMaskt checkIP6nMasktcheckInterfacetuniqifytmax_zone_name_lent u2b_if_py2t check_mactportStr(tDEFAULT_ZONE_TARGETt ZONE_TARGETS(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudptcheck_protocol(trich(tlog(terrors(t FirewallErrorcBsEeZdZdAdBdCdefdDddgfddEgfd dgfd efd dFgfd dgfd dgfddgfddgfddGgfdeffZdZdddgZidHd6dHd6dHd6dgd6ddgd6dgd6dgd6ddgd6dgd6dHd6dHd 6d!gd"6d#gd6ddgd$6dHd%6dHd&6dHd'6dHd(6dHd)6d*gd+6d#gd,6dHd-6Zidd.ddgd6d/gd 6d0d1gd6d2gd6d!d3d4d2d5gd 6d4gd"6d6d7gd%6d8gd(6Z e d9Z d:Z d;Z d<Zd=Zd>Zd?Zd@ZRS(Is Zone class tversionttshortt descriptiontUNUSEDttargettservicestportst icmp_blockst masqueradet forward_portst interfacestsourcest rules_strt protocolst source_portsticmp_block_inversions&(sssbsasa(ss)asba(ssss)asasasasa(ss)b)t_t-t/tzonetnametservicetporttprotocols icmp-blocks icmp-types forward-portt interfacetruletsourcetaddresst destinationtvalues source-portRtaudittaccepttrejecttdroptsettmarktlimitsicmp-block-inversiont immutabletenabledsto-portsto-addrtfamilytmactinverttipsettprefixtlevelttypecCsLx3ttjD]"\}\}}||kr|SqWttjddS(Ns index_of()(t enumerateRtIMPORT_EXPORT_STRUCTURERRt UNKNOWN_ERROR(telementtiteltdummy((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytindex_ofbs" cCstt|jd|_d|_d|_t|_t|_ g|_ g|_ g|_ g|_ t|_g|_g|_g|_g|_d|_g|_g|_t|_t|_t|_dS(NR(tsuperRt__init__RRRtFalseRRR R!R"R)R#R$R%R*R&R'tNonet fw_configtrulesR(R+tcombinedtapplied(tself((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRSis*                   cCsd|_d|_d|_t|_t|_|j2|j2|j 2|j 2t|_ |j 2|j 2|j2|j2d|_|j2|j2t|_t|_t|_dS(NR(RRRRTRRR R!R"R)R#R$R%R*R&R'RURVRWR(R+RXRY(RZ((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytcleanups(         c Cs t|j|_t|j|_t|j|_t|j|_g|jD]}t|^qR|_g|jD]$\}}t|t|f^qw|_g|jD]}t|^q|_g|jD]}t|^q|_g|j D]<\}}}}t|t|t|t|f^q|_ g|j D]$\}}t|t|f^qG|_ g|j D]}t|^q~|_ g|j D]}t|^q|_ g|j D]}t|^q|_ g|jD]}t|^q|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(R RRRR R!R"R)R#R%R*R&R'RWR(( RZtstpotprRNtp1tp2tp3tp4((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytencode_stringss%7%%O4%%%cCs|dkrlg|D]}tjd|^q|_tt|j|g|jD]}t|^qPntt|j||dS(NR(trule_str(Rt Rich_RuleRWRRRt __setattr__tstr(RZR0R9R\((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRfs (8c Cs?|dkr]|jr]|jj}x|D]+}||kr+ttjd|q+q+Wn|dkrx|D]"}t|dt|dqpWn|dkrx|D]}t|qWnx|dkr |jr |jj}xQ|D]+}||krttj d|qqWn|d krx |D]} t| dt| d| d  r| d  rttj d | n| d rt| d n| d r3t | d  rt | d  rttj d | d qq3q3WnI|dkr.x:|D]"}t|dt|dqWn |dkr^|tkr;ttj|q;n|dkrx|D]'} t| sqttj| qqqqWn|dkr x|D]R} t|  rt|  rt|  r| jd rttj | qqWn0|dkr;x!|D]} tjd| qWndS(NR!s '%s' not among existing servicesR"iiR)R#s"'%s' not among existing icmp typesR%iis$'%s' is missing to-port AND to-addr s#to-addr '%s' is not a valid addressR*R R&R'sipset:R(Rd(RVt get_servicesRRtINVALID_SERVICERRRt get_icmptypestINVALID_ICMPTYPEtINVALID_FORWARDRRt INVALID_ADDRRtINVALID_TARGETRtINVALID_INTERFACERRR t startswithRRe( RZRtitemtexisting_servicesR1R2tprototexisting_icmptypesticmptypetfwd_portR4R6R5((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyt _check_configsn              "           cCstt|j||jdr>ttjd|n|jdrfttjd|n|jddkrttjd|nnd|kr||j d }n|}t |t krttjd|t |t |j fndS(NR.s'%s' can't start with '/'s'%s' can't end with '/'ismore than one '/' in '%s's'Zone of '%s' has %d chars, max is %d %s( RRRt check_nameRpRRt INVALID_NAMEtendswithtcounttfindtlenR RX(RZR0t checked_name((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRxs&      c CsEt|_d|_d|_d|_d|_x3|jD](}||jkr7|jj|q7q7Wx3|j D](}||j krm|j j|qmqmWx3|j D](}||j kr|j j|qqWx3|j D](}||j kr|j j|qqWx3|j D](}||j kr|j j|qqWx3|j D](}||j krE|j j|qEqEW|jrt|_nx3|jD](}||jkr|jj|qqWx3|jD](}||jkr|jj|qqWx7|jD],} |jj| |jjt| qW|jrAt|_ndS(NR(tTrueRXRUtfilenameRRRR&tappendR'R!R"R)R#R$R%R*RWR(RgR+( RZR/R4R6R1R2RsticmptforwardR5((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytcombinesH        (sversionR(sshortR(s descriptionR(stargetR(RR(RRRR(RRN(t__name__t __module__t__doc__RTRKtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARSRUtPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSt staticmethodRQRSR[RcRfRwRxR(((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyR(sv                                  9 tzone_ContentHandlercBs#eZdZdZdZRS(cCs/tj||d|_t|_d|_dS(N(RRSRUt_ruleRTt _rule_errort _limit_ok(RZRq((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRS,s  c Cswtj||||jr dS|jj|||dkrd|krbtjd|dnd|kr|d|j_nd|krtjd|dnd|krs|d}|tkrt t j |n|dkr|t kr||j_ qqsnk|d krn\|d kr&nM|d kr|jr|jjrmtjd t|jt|_dStj|d|j_dS|d|jjkr|jjj|dqstjd |dn |dkr|jr<|jjrtjd t|jt|_dStj|d|d|j_dSt|dt|dt|dd|df}||jjkr|jjj|qstjd|d|dn |dkrs|jr|jjrtjd t|jt|_dStj|d|j_qst|d|d|jjkr\|jjj|dqstjd|dn |dkr|jr|jjrtjd t|jt|_dStj|d|j_dS|d|jjkr|jjj|dqstjd|dnU |dkr|jr|jjretjd t|jt|_dStj |d|j_dStjd|dn |dkrZd|kr|dj!d`krtjd|ddS|jr/|jjrtjd t|jt|_dStj"|j_qs|jj#rKtjdqst|j_#n |dkrd}d|kr|d}nd}d |kr|d }n|jr |jjrtjd t|jt|_dStj$|d|d|||j_dSt|dt|d|r8t|n|rtt%| rtt&| rtt t j'd!|qtnt|dd|dt|dt|f}||jj(kr|jj(j|qstjd"|d|d|rd#|nd|rd$|ndna|d%kr|jr}|jjrYtjd t|jt|_dStj)|d|d|j_dSt|dt|dt|dd|df}||jj*kr|jj*j|qstjd&|d|dnw|d'kr|jr+tjd(t|_dSd|krQtjd)t|_dS|d|jj+kr|jj+j|dqstjd*|dn|d+kr, |jr |jj,rtjd,t|jt|_dSt-}d-|kr |d-j!dakr t}nd}} } d0|kr7 |d0}nd1|krP |d1} nd2|kri |d2} ntj/|| | d-||j_,dSd0|kr d2|kr tjd3dSd0|kr d2|kr tjd4dSd5|kr tjd6|d5nd-|kr tjd7dSd0|kr{ t0|d0 r{ t1|d0 r{ t2|d0 r{ t t j'|d0q{ nd2|kr d8|d2}||jj3kr |jj3j|q tjd9|d0nd0|krs|d0}||jj3kr |jj3j|q) tjd9|d0qsnG|d:kr |js[ tjd;t|_dS|jj4r tjd<t|jdSt-}d-|kr |d-j!dbkr t}ntj5|d0||j_4n|dckr |js tjdAt|_dS|jj6r) tjdBt|_dS|d=krJ tj7|j_6n|d>kr d} dC|kru |dC} ntj8| |j_6nO|d?kr tj9|j_6n.|d@kr |dD} tj:| |j_6n|jj6|_;n|dEkr |js tjdFdS|jjr1 tjdGdSd} dH|krv |dH} | ddkrv tjdQt|_dSndR|kr |dRnd}tj<|| |j_|jj|_;n|dSkr8|js tjdTdS|jj=rtjdUt|jt|_dStj>|j_=|jj=|_;n;|dVkrd}d5|kr|d5}|dekrtjdY|d5t|_dSntj?||_n|dZkr(|j;stjd[t|_dS|j;j@rtjd\t|jt|_dS|d}tjA||j;_@nK|d]kr_|jjBrPtjd^qst|j_Bntjd_|dSdS(fNR/R0s'Ignoring deprecated attribute name='%s'RRAs,Ignoring deprecated attribute immutable='%s'R RRRR1s;Invalid rule: More than one element in rule '%s', ignoring.s#Service '%s' already set, ignoring.R2R3R-s#Port '%s/%s' already set, ignoring.R9s$Protocol '%s' already set, ignoring.s icmp-blocks&icmp-block '%s' already set, ignoring.s icmp-types-Invalid rule: icmp-block '%s' outside of ruleR$RBtnotfalses*Ignoring deprecated attribute enabled='%s's!Masquerade already set, ignoring.s forward-portsto-portsto-addrs#to-addr '%s' is not a valid addresss-Forward port %s/%s%s%s already set, ignoring.s >%ss @%ss source-ports*Source port '%s/%s' already set, ignoring.R4s$Invalid rule: interface use in rule.s Invalid interface: Name missing.s%Interface '%s' already set, ignoring.R6s:Invalid rule: More than one source in rule '%s', ignoring.REtyesttrueR7RDRFs$Invalid source: No address no ipset.s"Invalid source: Address and ipset.RCs)Ignoring deprecated attribute family='%s's+Invalid source: Invertion not allowed here.sipset:%ss"Source '%s' already set, ignoring.R8s)Invalid rule: Destination outside of rules?Invalid rule: More than one destination in rule '%s', ignoring.R;R<R=R?s$Invalid rule: Action outside of rules"Invalid rule: More than one actionRIR>Rs!Invalid rule: Log outside of rulesInvalid rule: More than one logRHtemergtalerttcritterrortwarningtnoticetinfotdebugsInvalid rule: Invalid log levelRGR:s#Invalid rule: Audit outside of rules9Invalid rule: More than one audit in rule '%s', ignoring.R5tipv4tipv6s&Invalid rule: Rule family "%s" invalidR@s4Invalid rule: Limit outside of action, log and audits9Invalid rule: More than one limit in rule '%s', ignoring.sicmp-block-inversions+Icmp-Block-Inversion already set, ignoring.sUnknown XML element '%s'(RR(syesR(syesR(sacceptsrejectsdropsmark(RRRserrorswarningRsinfosdebug(RR(CRt startElementRRqtparser_check_element_attrsRRRRRRRnRR RRMRgRRt Rich_ServiceR!Rt Rich_PortRRR R"t Rich_ProtocolRR)tRich_IcmpBlockR#t Rich_IcmpTypetlowertRich_MasqueradeR$tRich_ForwardPortRRRmR%tRich_SourcePortR*R&R6RTRUt Rich_SourceRRR R'R8tRich_Destinationtactiont Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_MarkRtRich_LogR:t Rich_AuditReR@t Rich_LimitR+(RZR0tattrsR tentrytto_porttto_addrREtaddrRDRFt_typet_setRHRGRCR9((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyR2st                                                                                                                                                                 cCstj|||dkr|jsy|jjWn/tk rg}tjd|t|jqXt|j|j j kr|j j j |j|j j j t|jqtjdt|jnd|_t|_n|d krd|_ndS( NR5s%s: %ss Rule '%s' already set, ignoring.R;R<R=R?RR:(sacceptsrejectsdropsmarkslogsaudit(Rt endElementRRtcheckt ExceptionRRRgRqR(RWRRURTR(RZR0te((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRs        (RRRSRR(((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyR+s  dc Csbt}|jds1ttjd|n|d |_|sW|j|jn||_||_|j t j rt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r>} ttjd| jnXWdQX~~tr^|jn|S(Ns.xmls'%s' is missing .xml suffixis%s/%strbsnot a valid zone file: %s(RRzRRRyR0RxRtpathRpRt ETC_FIREWALLDRTRtbuiltintdefaultRtsaxt make_parsertsetContentHandlertopent InputSourceRUt setByteStreamtparsetSAXParseExceptiont INVALID_ZONEt getExceptionRRc( RRt no_check_nameR/thandlertparserR0tfR6tmsg((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRs:     !       c Cs% |r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|jrq|jd krq|j|d d kr{ |j0j>|d%t1|jG|jGjEr |jd-|j|||jd4|jd5i|jGjEj8d6|jd6|j|n|jd-|j|||jdn|jd|jd)|jdqW|jd |jd|jN|jO~dS(?Ns%s/%ss %s/%s.xmls%s.oldsBackup of file '%s' failed: %sitmodetwttencodingsUTF-8RRR R/s s RRR4R0sipset:R6iRFR7R1R2iiR3R9sicmp-block-inversions icmp-blockR$isto-portisto-addrs forward-ports source-portRCR5RDRREs R8s icmp-types#Unknown element '%s' in zone_writerRGRHRs R@s R:R;R<RIR=R?R>sUnknown action '%s'(PRRR0tostexiststshutiltcopy2RRRtdirnameRpRRtmkdirtioRRt startDocumentRR RRtignorableWhitespaceRt charactersRRR R&t simpleElementR'R!R"R)R+R#R$R%R*RWRCR6RRDRFRER8RMRIRRRR2R3RR9RRRRRt to_addressRRRtINVALID_OBJECTRGRHR@R:RRRRRR>Rt endDocumenttclose(R/Rt_pathR0RtdirpathRRRR4R6R1R2R3RRR5RMR((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRs %            &                                                         (+t__all__txml.saxRRRRtfirewallRtfirewall.functionsRRRRRR R R R R tfirewall.core.baseRRtfirewall.core.io.io_objectRRRRRRRt firewall.coreRtfirewall.core.loggerRRtfirewall.errorsRRRRTRRUR(((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyts$   F4 PK[hΘ*site-packages/firewall/core/io/icmptype.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "IcmpType", "icmptype_reader", "icmptype_writer" ] import xml.sax as sax import os import io import shutil from firewall import config from firewall.functions import u2b_if_py2 from firewall.core.io.io_object import PY2, IO_Object, \ IO_Object_ContentHandler, IO_Object_XMLGenerator from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError class IcmpType(IO_Object): IMPORT_EXPORT_STRUCTURE = ( ( "version", "" ), # s ( "short", "" ), # s ( "description", "" ), # s ( "destination", [ "", ], ), # as ) DBUS_SIGNATURE = '(sssas)' ADDITIONAL_ALNUM_CHARS = [ "_", "-" ] PARSER_REQUIRED_ELEMENT_ATTRS = { "short": None, "description": None, "icmptype": None, } PARSER_OPTIONAL_ELEMENT_ATTRS = { "icmptype": [ "name", "version" ], "destination": [ "ipv4", "ipv6" ], } def __init__(self): super(IcmpType, self).__init__() self.version = "" self.short = "" self.description = "" self.destination = [ ] def cleanup(self): self.version = "" self.short = "" self.description = "" del self.destination[:] def encode_strings(self): """ HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.""" self.version = u2b_if_py2(self.version) self.short = u2b_if_py2(self.short) self.description = u2b_if_py2(self.description) self.destination = [u2b_if_py2(m) for m in self.destination] def _check_config(self, config, item): if item == "destination": for destination in config: if destination not in [ "ipv4", "ipv6" ]: raise FirewallError(errors.INVALID_DESTINATION, "'%s' not from {'ipv4'|'ipv6'}" % \ destination) # PARSER class icmptype_ContentHandler(IO_Object_ContentHandler): def startElement(self, name, attrs): IO_Object_ContentHandler.startElement(self, name, attrs) self.item.parser_check_element_attrs(name, attrs) if name == "icmptype": if "name" in attrs: log.warning("Ignoring deprecated attribute name='%s'" % attrs["name"]) if "version" in attrs: self.item.version = attrs["version"] elif name == "short": pass elif name == "description": pass elif name == "destination": for x in [ "ipv4", "ipv6" ]: if x in attrs and \ attrs[x].lower() in [ "yes", "true" ]: self.item.destination.append(str(x)) def icmptype_reader(filename, path): icmptype = IcmpType() if not filename.endswith(".xml"): raise FirewallError(errors.INVALID_NAME, "%s is missing .xml suffix" % filename) icmptype.name = filename[:-4] icmptype.check_name(icmptype.name) icmptype.filename = filename icmptype.path = path icmptype.builtin = False if path.startswith(config.ETC_FIREWALLD) else True icmptype.default = icmptype.builtin handler = icmptype_ContentHandler(icmptype) parser = sax.make_parser() parser.setContentHandler(handler) name = "%s/%s" % (path, filename) with open(name, "rb") as f: source = sax.InputSource(None) source.setByteStream(f) try: parser.parse(source) except sax.SAXParseException as msg: raise FirewallError(errors.INVALID_ICMPTYPE, "not a valid icmptype file: %s" % \ msg.getException()) del handler del parser if PY2: icmptype.encode_strings() return icmptype def icmptype_writer(icmptype, path=None): _path = path if path else icmptype.path if icmptype.filename: name = "%s/%s" % (_path, icmptype.filename) else: name = "%s/%s.xml" % (_path, icmptype.name) if os.path.exists(name): try: shutil.copy2(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) dirpath = os.path.dirname(name) if dirpath.startswith(config.ETC_FIREWALLD) and not os.path.exists(dirpath): if not os.path.exists(config.ETC_FIREWALLD): os.mkdir(config.ETC_FIREWALLD, 0o750) os.mkdir(dirpath, 0o750) f = io.open(name, mode='wt', encoding='UTF-8') handler = IO_Object_XMLGenerator(f) handler.startDocument() # start icmptype element attrs = {} if icmptype.version and icmptype.version != "": attrs["version"] = icmptype.version handler.startElement("icmptype", attrs) handler.ignorableWhitespace("\n") # short if icmptype.short and icmptype.short != "": handler.ignorableWhitespace(" ") handler.startElement("short", { }) handler.characters(icmptype.short) handler.endElement("short") handler.ignorableWhitespace("\n") # description if icmptype.description and icmptype.description != "": handler.ignorableWhitespace(" ") handler.startElement("description", { }) handler.characters(icmptype.description) handler.endElement("description") handler.ignorableWhitespace("\n") # destination if icmptype.destination: handler.ignorableWhitespace(" ") attrs = { } for x in icmptype.destination: attrs[x] = "yes" handler.simpleElement("destination", attrs) handler.ignorableWhitespace("\n") # end icmptype element handler.endElement('icmptype') handler.ignorableWhitespace("\n") handler.endDocument() f.close() del handler PK[DܳU##*site-packages/firewall/core/io/service.pycnu[ c`c@sdddgZddljZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZmZmZmZmZddlmZdd lmZdd lmZde fd YZd e fd YZdZddZdS(tServicetservice_readertservice_writeriN(tconfig(t u2b_if_py2(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudptcheck_protocolt check_address(tlog(terrors(t FirewallErrorc BseZdddddgfddgfdidd6fddgfddgffZd Zd d gZidd6dd6dd 6Zid dgd 6ddgd6dgd6d gd6ddgd6ddgd6ZdZdZ dZ dZ RS(tversionttshortt descriptiontportstmodulest destinationt protocolst source_portss(sssa(ss)asa{ss}asa(ss))t_t-tservicetnametporttprotocoltvaluetmoduletipv4tipv6s source-portcCs_tt|jd|_d|_d|_g|_g|_g|_i|_ g|_ dS(NR( tsuperRt__init__RRRRRRRR(tself((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyR$As       cCsHd|_d|_d|_|j2|j2|j2|jj|j2dS(NR( RRRRRRRtclearR(R%((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pytcleanupLs    cCst|j|_t|j|_t|j|_g|jD]$\}}t|t|f^q@|_g|jD]}t|^qw|_d|jjD|_g|jD]}t|^q|_g|j D]$\}}t|t|f^q|_ dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.cSs+i|]!\}}t|t|qS((R(t.0tktv((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pys _s N( RRRRRRRtitemsRR(R%tpotprtm((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pytencode_stringsVs7%%cCs|dkr]x|D]C}|ddkrHt|dt|dqt|dqWnH|dkrx9|D]}t|qpWn|dkrx|D]"}t|dt|dqWn|dkrx|D]<}|dkrttjd |nt|||qWn|d krx}|D]r}|jd rw|jd d}d |krw|jd d}qwnt |dkr,ttj |q,q,WndS(NRiRiRRRR!R"s'%s' not in {'ipv4'|'ipv6'}Rt nf_conntrack_RRi(R!R"( R R R RRtINVALID_DESTINATIONR t startswithtreplacetlentINVALID_MODULE(R%RtitemRtprotoRR ((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyt _check_configds8              (sversionR(sshortR(s descriptionR(RR(RRN( t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSR$R'R/R8(((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyR&s2           tservice_ContentHandlercBseZdZRS(cCsxtj||||jj|||dkrwd|krUtjd|dnd|krt|d|j_qtn|dkrn|dkrn|dkr||ddkr't|dt|d |d|d f}||jj kr |jj j |qytjd |d|d qtt |d |d |jj kre|jj j |d qttjd |d n|d krt |d |d |jj kr|jj j |d qttjd |d n|d kr_t|dt|d |d|d f}||jj krA|jj j |qttjd|d|d n|dkrxddgD]_}||krxt|||||jjkrtjd|q|||jj|t setByteStreamtparsetSAXParseExceptiontINVALID_SERVICEt getExceptionRR/( RMRNRthandlertparserRtftsourcetmsg((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyRs8     !       c Cs|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|jrq|jd krq|j|d R(((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyts   :dE PK[DܳU##*site-packages/firewall/core/io/service.pyonu[ c`c@sdddgZddljZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZmZmZmZmZddlmZdd lmZdd lmZde fd YZd e fd YZdZddZdS(tServicetservice_readertservice_writeriN(tconfig(t u2b_if_py2(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudptcheck_protocolt check_address(tlog(terrors(t FirewallErrorc BseZdddddgfddgfdidd6fddgfddgffZd Zd d gZidd6dd6dd 6Zid dgd 6ddgd6dgd6d gd6ddgd6ddgd6ZdZdZ dZ dZ RS(tversionttshortt descriptiontportstmodulest destinationt protocolst source_portss(sssa(ss)asa{ss}asa(ss))t_t-tservicetnametporttprotocoltvaluetmoduletipv4tipv6s source-portcCs_tt|jd|_d|_d|_g|_g|_g|_i|_ g|_ dS(NR( tsuperRt__init__RRRRRRRR(tself((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyR$As       cCsHd|_d|_d|_|j2|j2|j2|jj|j2dS(NR( RRRRRRRtclearR(R%((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pytcleanupLs    cCst|j|_t|j|_t|j|_g|jD]$\}}t|t|f^q@|_g|jD]}t|^qw|_d|jjD|_g|jD]}t|^q|_g|j D]$\}}t|t|f^q|_ dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.cSs+i|]!\}}t|t|qS((R(t.0tktv((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pys _s N( RRRRRRRtitemsRR(R%tpotprtm((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pytencode_stringsVs7%%cCs|dkr]x|D]C}|ddkrHt|dt|dqt|dqWnH|dkrx9|D]}t|qpWn|dkrx|D]"}t|dt|dqWn|dkrx|D]<}|dkrttjd |nt|||qWn|d krx}|D]r}|jd rw|jd d}d |krw|jd d}qwnt |dkr,ttj |q,q,WndS(NRiRiRRRR!R"s'%s' not in {'ipv4'|'ipv6'}Rt nf_conntrack_RRi(R!R"( R R R RRtINVALID_DESTINATIONR t startswithtreplacetlentINVALID_MODULE(R%RtitemRtprotoRR ((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyt _check_configds8              (sversionR(sshortR(s descriptionR(RR(RRN( t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSR$R'R/R8(((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyR&s2           tservice_ContentHandlercBseZdZRS(cCsxtj||||jj|||dkrwd|krUtjd|dnd|krt|d|j_qtn|dkrn|dkrn|dkr||ddkr't|dt|d |d|d f}||jj kr |jj j |qytjd |d|d qtt |d |d |jj kre|jj j |d qttjd |d n|d krt |d |d |jj kr|jj j |d qttjd |d n|d kr_t|dt|d |d|d f}||jj krA|jj j |qttjd|d|d n|dkrxddgD]_}||krxt|||||jjkrtjd|q|||jj|t setByteStreamtparsetSAXParseExceptiontINVALID_SERVICEt getExceptionRR/( RMRNRthandlertparserRtftsourcetmsg((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyRs8     !       c Cs|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|jrq|jd krq|j|d R(((s</usr/lib/python2.7/site-packages/firewall/core/io/service.pyts   :dE PK[! )site-packages/firewall/core/io/helper.pycnu[ c`c@sdddgZddljZddlZddlZddlZddlmZddlm Z ddl m Z m Z m Z mZmZmZddlmZdd lmZdd lmZde fd YZd e fd YZdZddZdS(tHelpert helper_readert helper_writeriN(tconfig(t u2b_if_py2(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudp(tlog(terrors(t FirewallErrorcBseZdddddddgffZdZdd gZidd6dd6dgd 6Zid ddgd 6d d gd 6ZdZdZ dZ dZ dZ RS(tversionttshortt descriptiontfamilytmoduletportss (sssssa(ss))t-t.thelpertnametporttprotocolcCsMtt|jd|_d|_d|_d|_d|_g|_dS(NR( tsuperRt__init__RRRRRR(tself((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR;s     cCs8d|_d|_d|_d|_d|_|j2dS(NR(RRRRRR(R((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pytcleanupDs      cCst|j|_t|j|_t|j|_t|j|_t|j|_g|jD]$\}}t|t|f^qd|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(RRRRRRR(Rtpotpr((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pytencode_stringsLs cCs;ddg}||kr7ttjd||fndS(Ntipv4tipv6s'%s' not in '%s'(R R t INVALID_IPV(Rtipvtipvs((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyt check_ipvWs   cCs|dkr<x|D]"}t|dt|dqWnn|dkr|jdspttjd|nt|jdddkrttjd|qndS( NRiiRt nf_conntrack_s('%s' does not start with 'nf_conntrack_'RsModule name '%s' too short(R R t startswithR R tINVALID_MODULEtlentreplace(RRtitemR((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyt _check_config]s    (sversionR(sshortR(s descriptionR(sfamilyR(smoduleR(RRN( t__name__t __module__tIMPORT_EXPORT_STRUCTUREtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARStNonetPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSRRR!R'R.(((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR&s(    thelper_ContentHandlercBseZdZRS(cCstj||||jj|||dkrd|krQ|d|j_nd|kr|jj|d|d|j_nd|kr|djdstt j d|dnt |dj dddkrtt j d |dn|d|j_ qn|d kr$n|d kr3n|d krt|d t|d |d |d f}||jjkr|jjj|qtjd|d |d ndS(NRRRRR(s('%s' does not start with 'nf_conntrack_'RisModule name '%s' too shortRRRRs#Port '%s/%s' already set, ignoring.(Rt startElementR-tparser_check_element_attrsRR'RR)R R R*R+R,RR R RtappendR twarning(RRtattrstentry((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR8ns>    "    (R/R0R8(((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyR7msc CsYt}|jds1ttjd|n|d |_|j|j||_||_|j t j rxt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r5}ttjd|jnXWdQX~~trU|jn|S(Ns.xmls'%s' is missing .xml suffixis%s/%strbsnot a valid helper file: %s(RtendswithR R t INVALID_NAMERt check_nametfilenametpathR)Rt ETC_FIREWALLDtFalsetTruetbuiltintdefaultR7tsaxt make_parsertsetContentHandlertopent InputSourceR4t setByteStreamtparsetSAXParseExceptiontINVALID_HELPERt getExceptionRR!( RBRCRthandlertparserRtftsourcetmsg((s;/usr/lib/python2.7/site-packages/firewall/core/io/helper.pyRs8     !       c Cs|r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|j|d <|jr~|jd kr~|j|d s   .G# PK[ L\44,site-packages/firewall/core/io/io_object.pyonu[ c`c@sadZddddddddgZd d ljZd d ljjZd d lZd d lZd d lm Z d d l m Z d d lm Z d dl mZejdkZdefdYZdefdYZdefdYZdefdYZdejjfdYZdejfdYZdZdZdZdZd S(s5Generic io_object handler, io specific check methods.tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudptcheck_protocolt check_addressiN(t functions(tb2u(terrors(t FirewallErrort3cBsteZdZd ZdZgZiZiZdZdZ dZ dZ dZ dZ dZd ZRS( s; Abstract IO_Object as base for icmptype, service and zone s()cCs1d|_d|_d|_t|_t|_dS(Nt(tfilenametpathtnametFalsetdefaulttbuiltin(tself((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt__init__1s     cCsGg}x4|jD])}|jtjt||dqWt|S(Ni(tIMPORT_EXPORT_STRUCTUREtappendtcopytdeepcopytgetattrttuple(Rtrettx((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt export_config8s'cCs|j|xt|jD]\}\}}t||trg}t}x;||D]/}||kr\|j||j|q\q\W~t||t j |qt||t j ||qWdS(N( t check_configt enumerateRt isinstancetlisttsetRtaddtsetattrRR(Rtconftitelementtdummyt_conft_setR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt import_config>s "   cCst|ts=ttjd|tdt|fnt|dkrdttjdnxI|D]A}|j rk||j krkttjd||fqkqkWdS(Ns'%s' not of type %s, but %sR isname can't be emptys'%s' is not allowed in '%s'( R!tstrR R t INVALID_TYPEttypetlent INVALID_NAMEtisalnumtADDITIONAL_ALNUM_CHARS(RRtchar((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt check_nameNs  cCst|t|jkrIttjdt|t|jfnxKt|jD]:\}\}}|j||||j|||qYWdS(Ns structure size mismatch %d != %d(R0RR R R.R t_check_config_structuret _check_config(RR&R'R(tvalue((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR[s""cCsdS(N((Rtdummy1tdummy2((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR7esc Cst|t|ksFttjd|t|t|fnt|trt|dkrttjd|nx||D]}|j||dqWnWt|tr(t|t|krttjd|t|fnxt |D] \}}|j|||qWnt|t rt|j d\}}x|j D]\}}t|t|krttjd|t|t|fnt|t|kr`ttjd|t|t|fq`q`WndS(Ns'%s' not of type %s, but %sislen('%s') != 1islen('%s') != %d( R/R R R.R!R"R0R6RR tdicttitems( RR&t structureRR'R8tskeytsvaluetkey((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR6is8 "    " cCs,|j}t}||jkrt}|j|dk rxP|j|D]>}||krj|j|qHttjd||fqHWqn||j krt}x4|j |D]"}||kr|j|qqWn|sttjd|nx*|D]"}ttjd||fqWdS(NsMissing attribute %s for %ssUnexpected element %ss%s: Unexpected attribute %s( tgetNamesRtPARSER_REQUIRED_ELEMENT_ATTRStTruetNonetremoveR R t PARSE_ERRORtPARSER_OPTIONAL_ELEMENT_ATTRS(RRtattrst_attrstfoundR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pytparser_check_element_attrss,      ((t__name__t __module__t__doc__RtDBUS_SIGNATURER3RBRGRRR,R5RR7R6RK(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR(s     !tUnexpectedElementErrorcBseZdZdZRS(cCs tt|j||_dS(N(tsuperRPRR(RR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRscCs d|jS(NsUnexpected element '%s'(R(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt__str__s(RLRMRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRPs tMissingAttributeErrorcBseZdZdZRS(cCs)tt|j||_||_dS(N(RQRSRRt attribute(RRRT((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs cCsd|j|jfS(Ns$Element '%s': missing '%s' attribute(RRT(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRRs(RLRMRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRSs tUnexpectedAttributeErrorcBseZdZdZRS(cCs)tt|j||_||_dS(N(RQRURRRT(RRRT((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs cCsd|j|jfS(Ns'Element '%s': unexpected attribute '%s'(RRT(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRRs(RLRMRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRUs cBs5eZdZdZdZdZdZRS(cCs||_d|_dS(NR (titemt_element(RRV((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs cCs d|_dS(NR (RW(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt startDocumentscCs d|_dS(NR (RW(RRRH((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt startElementscCs@|dkr|j|j_n|dkr<|j|j_ndS(Ntshortt description(RWRVRZR[(RR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt endElements  cCs|j|jdd7_dS(Ns t (RWtreplace(Rtcontent((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt characterss(RLRMRRXRYR\R`(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs     cBs>eZdZdZdZdZdZdZRS(cCsotjjj||j|_|j|_ig|_|jd|_ g|_ d|_ t |_ t |_dS(Nisutf-8(tsaxthandlertContentHandlerRtwritet_writetflusht_flusht _ns_contextst_current_contextt_undeclared_ns_mapst _encodingRt_pending_start_elementt_short_empty_elements(Rtout((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs      cCs9trd|jD}ntjj|||dS(s saxutils.XMLGenerator.startElement() expects name and attrs to be unicode and bad things happen if any of them is (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. cSs+i|]!\}}t|t|qS((R (t.0RR8((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pys s N(RR<tsaxutilst XMLGeneratorRY(RRRH((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRYscCstrv|jdt|xF|jD]8\}}|jdt|tjt|fq*W|jdn[|jd|x:|jD],\}}|jd|tj|fqW|jddS(s* slightly modified startElement() utN(RReR R<Rpt quoteattr(RRRHR8((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyt simpleElements$cCstjj|t|dS(s saxutils.XMLGenerator.endElement() expects name to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. N(RpRqR\R (RR((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR\scCstjj|t|dS(s saxutils.XMLGenerator.characters() expects content to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. N(RpRqR`R (RR_((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR`scCstjj|t|dS(s saxutils.XMLGenerator.ignorableWhitespace() expects content to be unicode and bad things happen if it's (utf-8) encoded. We override the method here to sanitize this case. Can be removed once we drop Python2 support. N(RpRqtignorableWhitespaceR (RR_((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRus(RLRMRRYRtR\R`Ru(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs     cCstj|}|dkr4ttjd|n|dkrYttjd|nd|dkr~ttjd|n?t|dkr|d|dkrttjd|ndS( Nisport number in '%s' is too bigis'%s' is invalid port rangesport range '%s' is ambiguousiii(Rt getPortRangeR R t INVALID_PORTRDR0(tportt port_range((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyRs      & cCs)|dkr%ttjd|ndS(Nttcptudptsctptdccps)'%s' not from {'tcp'|'udp'|'sctp'|'dccp'}(RzR{R|R}(R R tINVALID_PROTOCOL(tprotocol((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR&s  cCs(tj|s$ttj|ndS(N(Rt checkProtocolR R R~(R((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR,scCs5tj||s1ttjd||fndS(Ns'%s' is not valid %s address(RRR R t INVALID_ADDR(tipvtaddr((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyR0s ( RNt__all__txml.saxRatxml.sax.saxutilsRpRtsystfirewallRtfirewall.functionsR R tfirewall.errorsR tversionRtobjectRt ExceptionRPRSRURbRcRRqRRRRR(((s>/usr/lib/python2.7/site-packages/firewall/core/io/io_object.pyts,     C   PK[Bq^^'site-packages/firewall/core/io/zone.pyonu[ c`c@sjdddgZddljZddlZddlZddlZddlmZddlm Z m Z m Z m Z m Z mZmZmZmZmZddlmZmZddlmZmZmZmZmZmZmZdd lmZdd l m!Z!dd lm"Z"dd l#m$Z$defd YZ%defdYZ&e'dZ(e)dZ*dS(tZonet zone_readert zone_writeriN(tconfig( tcheckIPtcheckIP6t checkIPnMaskt checkIP6nMasktcheckInterfacetuniqifytmax_zone_name_lent u2b_if_py2t check_mactportStr(tDEFAULT_ZONE_TARGETt ZONE_TARGETS(tPY2t IO_ObjecttIO_Object_ContentHandlertIO_Object_XMLGeneratort check_portt check_tcpudptcheck_protocol(trich(tlog(terrors(t FirewallErrorcBsEeZdZdAdBdCdefdDddgfddEgfd dgfd efd dFgfd dgfd dgfddgfddgfddGgfdeffZdZdddgZidHd6dHd6dHd6dgd6ddgd6dgd6dgd6ddgd6dgd6dHd6dHd 6d!gd"6d#gd6ddgd$6dHd%6dHd&6dHd'6dHd(6dHd)6d*gd+6d#gd,6dHd-6Zidd.ddgd6d/gd 6d0d1gd6d2gd6d!d3d4d2d5gd 6d4gd"6d6d7gd%6d8gd(6Z e d9Z d:Z d;Z d<Zd=Zd>Zd?Zd@ZRS(Is Zone class tversionttshortt descriptiontUNUSEDttargettservicestportst icmp_blockst masqueradet forward_portst interfacestsourcest rules_strt protocolst source_portsticmp_block_inversions&(sssbsasa(ss)asba(ssss)asasasasa(ss)b)t_t-t/tzonetnametservicetporttprotocols icmp-blocks icmp-types forward-portt interfacetruletsourcetaddresst destinationtvalues source-portRtaudittaccepttrejecttdroptsettmarktlimitsicmp-block-inversiont immutabletenabledsto-portsto-addrtfamilytmactinverttipsettprefixtlevelttypecCsLx3ttjD]"\}\}}||kr|SqWttjddS(Ns index_of()(t enumerateRtIMPORT_EXPORT_STRUCTURERRt UNKNOWN_ERROR(telementtiteltdummy((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytindex_ofbs" cCstt|jd|_d|_d|_t|_t|_ g|_ g|_ g|_ g|_ t|_g|_g|_g|_g|_d|_g|_g|_t|_t|_t|_dS(NR(tsuperRt__init__RRRtFalseRRR R!R"R)R#R$R%R*R&R'tNonet fw_configtrulesR(R+tcombinedtapplied(tself((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRSis*                   cCsd|_d|_d|_t|_t|_|j2|j2|j 2|j 2t|_ |j 2|j 2|j2|j2d|_|j2|j2t|_t|_t|_dS(NR(RRRRTRRR R!R"R)R#R$R%R*R&R'RURVRWR(R+RXRY(RZ((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytcleanups(         c Cs t|j|_t|j|_t|j|_t|j|_g|jD]}t|^qR|_g|jD]$\}}t|t|f^qw|_g|jD]}t|^q|_g|jD]}t|^q|_g|j D]<\}}}}t|t|t|t|f^q|_ g|j D]$\}}t|t|f^qG|_ g|j D]}t|^q~|_ g|j D]}t|^q|_ g|j D]}t|^q|_ g|jD]}t|^q|_dS(s HACK. I haven't been able to make sax parser return strings encoded (because of python 2) instead of in unicode. Get rid of it once we throw out python 2 support.N(R RRRR R!R"R)R#R%R*R&R'RWR(( RZtstpotprRNtp1tp2tp3tp4((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytencode_stringss%7%%O4%%%cCs|dkrlg|D]}tjd|^q|_tt|j|g|jD]}t|^qPntt|j||dS(NR(trule_str(Rt Rich_RuleRWRRRt __setattr__tstr(RZR0R9R\((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRfs (8c Cs?|dkr]|jr]|jj}x|D]+}||kr+ttjd|q+q+Wn|dkrx|D]"}t|dt|dqpWn|dkrx|D]}t|qWnx|dkr |jr |jj}xQ|D]+}||krttj d|qqWn|d krx |D]} t| dt| d| d  r| d  rttj d | n| d rt| d n| d r3t | d  rt | d  rttj d | d qq3q3WnI|dkr.x:|D]"}t|dt|dqWn |dkr^|tkr;ttj|q;n|dkrx|D]'} t| sqttj| qqqqWn|dkr x|D]R} t|  rt|  rt|  r| jd rttj | qqWn0|dkr;x!|D]} tjd| qWndS(NR!s '%s' not among existing servicesR"iiR)R#s"'%s' not among existing icmp typesR%iis$'%s' is missing to-port AND to-addr s#to-addr '%s' is not a valid addressR*R R&R'sipset:R(Rd(RVt get_servicesRRtINVALID_SERVICERRRt get_icmptypestINVALID_ICMPTYPEtINVALID_FORWARDRRt INVALID_ADDRRtINVALID_TARGETRtINVALID_INTERFACERRR t startswithRRe( RZRtitemtexisting_servicesR1R2tprototexisting_icmptypesticmptypetfwd_portR4R6R5((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyt _check_configsn              "           cCstt|j||jdr>ttjd|n|jdrfttjd|n|jddkrttjd|nnd|kr||j d }n|}t |t krttjd|t |t |j fndS(NR.s'%s' can't start with '/'s'%s' can't end with '/'ismore than one '/' in '%s's'Zone of '%s' has %d chars, max is %d %s( RRRt check_nameRpRRt INVALID_NAMEtendswithtcounttfindtlenR RX(RZR0t checked_name((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRxs&      c CsEt|_d|_d|_d|_d|_x3|jD](}||jkr7|jj|q7q7Wx3|j D](}||j krm|j j|qmqmWx3|j D](}||j kr|j j|qqWx3|j D](}||j kr|j j|qqWx3|j D](}||j kr|j j|qqWx3|j D](}||j krE|j j|qEqEW|jrt|_nx3|jD](}||jkr|jj|qqWx3|jD](}||jkr|jj|qqWx7|jD],} |jj| |jjt| qW|jrAt|_ndS(NR(tTrueRXRUtfilenameRRRR&tappendR'R!R"R)R#R$R%R*RWR(RgR+( RZR/R4R6R1R2RsticmptforwardR5((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pytcombinesH        (sversionR(sshortR(s descriptionR(stargetR(RR(RRRR(RRN(t__name__t __module__t__doc__RTRKtDBUS_SIGNATUREtADDITIONAL_ALNUM_CHARSRUtPARSER_REQUIRED_ELEMENT_ATTRStPARSER_OPTIONAL_ELEMENT_ATTRSt staticmethodRQRSR[RcRfRwRxR(((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyR(sv                                  9 tzone_ContentHandlercBs#eZdZdZdZRS(cCs/tj||d|_t|_d|_dS(N(RRSRUt_ruleRTt _rule_errort _limit_ok(RZRq((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRS,s  c Cswtj||||jr dS|jj|||dkrd|krbtjd|dnd|kr|d|j_nd|krtjd|dnd|krs|d}|tkrt t j |n|dkr|t kr||j_ qqsnk|d krn\|d kr&nM|d kr|jr|jjrmtjd t|jt|_dStj|d|j_dS|d|jjkr|jjj|dqstjd |dn |dkr|jr<|jjrtjd t|jt|_dStj|d|d|j_dSt|dt|dt|dd|df}||jjkr|jjj|qstjd|d|dn |dkrs|jr|jjrtjd t|jt|_dStj|d|j_qst|d|d|jjkr\|jjj|dqstjd|dn |dkr|jr|jjrtjd t|jt|_dStj|d|j_dS|d|jjkr|jjj|dqstjd|dnU |dkr|jr|jjretjd t|jt|_dStj |d|j_dStjd|dn |dkrZd|kr|dj!d`krtjd|ddS|jr/|jjrtjd t|jt|_dStj"|j_qs|jj#rKtjdqst|j_#n |dkrd}d|kr|d}nd}d |kr|d }n|jr |jjrtjd t|jt|_dStj$|d|d|||j_dSt|dt|d|r8t|n|rtt%| rtt&| rtt t j'd!|qtnt|dd|dt|dt|f}||jj(kr|jj(j|qstjd"|d|d|rd#|nd|rd$|ndna|d%kr|jr}|jjrYtjd t|jt|_dStj)|d|d|j_dSt|dt|dt|dd|df}||jj*kr|jj*j|qstjd&|d|dnw|d'kr|jr+tjd(t|_dSd|krQtjd)t|_dS|d|jj+kr|jj+j|dqstjd*|dn|d+kr, |jr |jj,rtjd,t|jt|_dSt-}d-|kr |d-j!dakr t}nd}} } d0|kr7 |d0}nd1|krP |d1} nd2|kri |d2} ntj/|| | d-||j_,dSd0|kr d2|kr tjd3dSd0|kr d2|kr tjd4dSd5|kr tjd6|d5nd-|kr tjd7dSd0|kr{ t0|d0 r{ t1|d0 r{ t2|d0 r{ t t j'|d0q{ nd2|kr d8|d2}||jj3kr |jj3j|q tjd9|d0nd0|krs|d0}||jj3kr |jj3j|q) tjd9|d0qsnG|d:kr |js[ tjd;t|_dS|jj4r tjd<t|jdSt-}d-|kr |d-j!dbkr t}ntj5|d0||j_4n|dckr |js tjdAt|_dS|jj6r) tjdBt|_dS|d=krJ tj7|j_6n|d>kr d} dC|kru |dC} ntj8| |j_6nO|d?kr tj9|j_6n.|d@kr |dD} tj:| |j_6n|jj6|_;n|dEkr |js tjdFdS|jjr1 tjdGdSd} dH|krv |dH} | ddkrv tjdQt|_dSndR|kr |dRnd}tj<|| |j_|jj|_;n|dSkr8|js tjdTdS|jj=rtjdUt|jt|_dStj>|j_=|jj=|_;n;|dVkrd}d5|kr|d5}|dekrtjdY|d5t|_dSntj?||_n|dZkr(|j;stjd[t|_dS|j;j@rtjd\t|jt|_dS|d}tjA||j;_@nK|d]kr_|jjBrPtjd^qst|j_Bntjd_|dSdS(fNR/R0s'Ignoring deprecated attribute name='%s'RRAs,Ignoring deprecated attribute immutable='%s'R RRRR1s;Invalid rule: More than one element in rule '%s', ignoring.s#Service '%s' already set, ignoring.R2R3R-s#Port '%s/%s' already set, ignoring.R9s$Protocol '%s' already set, ignoring.s icmp-blocks&icmp-block '%s' already set, ignoring.s icmp-types-Invalid rule: icmp-block '%s' outside of ruleR$RBtnotfalses*Ignoring deprecated attribute enabled='%s's!Masquerade already set, ignoring.s forward-portsto-portsto-addrs#to-addr '%s' is not a valid addresss-Forward port %s/%s%s%s already set, ignoring.s >%ss @%ss source-ports*Source port '%s/%s' already set, ignoring.R4s$Invalid rule: interface use in rule.s Invalid interface: Name missing.s%Interface '%s' already set, ignoring.R6s:Invalid rule: More than one source in rule '%s', ignoring.REtyesttrueR7RDRFs$Invalid source: No address no ipset.s"Invalid source: Address and ipset.RCs)Ignoring deprecated attribute family='%s's+Invalid source: Invertion not allowed here.sipset:%ss"Source '%s' already set, ignoring.R8s)Invalid rule: Destination outside of rules?Invalid rule: More than one destination in rule '%s', ignoring.R;R<R=R?s$Invalid rule: Action outside of rules"Invalid rule: More than one actionRIR>Rs!Invalid rule: Log outside of rulesInvalid rule: More than one logRHtemergtalerttcritterrortwarningtnoticetinfotdebugsInvalid rule: Invalid log levelRGR:s#Invalid rule: Audit outside of rules9Invalid rule: More than one audit in rule '%s', ignoring.R5tipv4tipv6s&Invalid rule: Rule family "%s" invalidR@s4Invalid rule: Limit outside of action, log and audits9Invalid rule: More than one limit in rule '%s', ignoring.sicmp-block-inversions+Icmp-Block-Inversion already set, ignoring.sUnknown XML element '%s'(RR(syesR(syesR(sacceptsrejectsdropsmark(RRRserrorswarningRsinfosdebug(RR(CRt startElementRRqtparser_check_element_attrsRRRRRRRnRR RRMRgRRt Rich_ServiceR!Rt Rich_PortRRR R"t Rich_ProtocolRR)tRich_IcmpBlockR#t Rich_IcmpTypetlowertRich_MasqueradeR$tRich_ForwardPortRRRmR%tRich_SourcePortR*R&R6RTRUt Rich_SourceRRR R'R8tRich_Destinationtactiont Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_MarkRtRich_LogR:t Rich_AuditReR@t Rich_LimitR+(RZR0tattrsR tentrytto_porttto_addrREtaddrRDRFt_typet_setRHRGRCR9((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyR2st                                                                                                                                                                 cCstj|||dkr|jsy|jjWn/tk rg}tjd|t|jqXt|j|j j kr|j j j |j|j j j t|jqtjdt|jnd|_t|_n|d krd|_ndS( NR5s%s: %ss Rule '%s' already set, ignoring.R;R<R=R?RR:(sacceptsrejectsdropsmarkslogsaudit(Rt endElementRRtcheckt ExceptionRRRgRqR(RWRRURTR(RZR0te((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRs        (RRRSRR(((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyR+s  dc Csbt}|jds1ttjd|n|d |_|sW|j|jn||_||_|j t j rt nt |_|j|_t|}tj}|j|d||f}t|di}tjd}|j|y|j|Wn2tjk r>} ttjd| jnXWdQX~~tr^|jn|S(Ns.xmls'%s' is missing .xml suffixis%s/%strbsnot a valid zone file: %s(RRzRRRyR0RxRtpathRpRt ETC_FIREWALLDRTRtbuiltintdefaultRtsaxt make_parsertsetContentHandlertopent InputSourceRUt setByteStreamtparsetSAXParseExceptiont INVALID_ZONEt getExceptionRRc( RRt no_check_nameR/thandlertparserR0tfR6tmsg((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRs:     !       c Cs% |r |n|j}|jr4d||jf}nd||jf}tjj|rytj|d|Wqtk r}tj d||qXntjj |}|j t j rtjj| rtjjt j stjt j dntj|dntj|dddd }t|}|ji}|jrq|jd krq|j|d d kr{ |j0j>|d%t1|jG|jGjEr |jd-|j|||jd4|jd5i|jGjEj8d6|jd6|j|n|jd-|j|||jdn|jd|jd)|jdqW|jd |jd|jN|jO~dS(?Ns%s/%ss %s/%s.xmls%s.oldsBackup of file '%s' failed: %sitmodetwttencodingsUTF-8RRR R/s s RRR4R0sipset:R6iRFR7R1R2iiR3R9sicmp-block-inversions icmp-blockR$isto-portisto-addrs forward-ports source-portRCR5RDRREs R8s icmp-types#Unknown element '%s' in zone_writerRGRHRs R@s R:R;R<RIR=R?R>sUnknown action '%s'(PRRR0tostexiststshutiltcopy2RRRtdirnameRpRRtmkdirtioRRt startDocumentRR RRtignorableWhitespaceRt charactersRRR R&t simpleElementR'R!R"R)R+R#R$R%R*RWRCR6RRDRFRER8RMRIRRRR2R3RR9RRRRRt to_addressRRRtINVALID_OBJECTRGRHR@R:RRRRRR>Rt endDocumenttclose(R/Rt_pathR0RtdirpathRRRR4R6R1R2R3RRR5RMR((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyRs %            &                                                         (+t__all__txml.saxRRRRtfirewallRtfirewall.functionsRRRRRR R R R R tfirewall.core.baseRRtfirewall.core.io.io_objectRRRRRRRt firewall.coreRtfirewall.core.loggerRRtfirewall.errorsRRRRTRRUR(((s9/usr/lib/python2.7/site-packages/firewall/core/io/zone.pyts$   F4 PK[CIR%$%$(site-packages/firewall/core/ebtables.pyonu[ c`c@sdgZddlZddlmZddlmZddlmZm Z m Z ddl m Z ddl mZddlmZmZddlZid gd 6d d d gd6dd dgd6ZiZiZiZxejD]Zgees0      PK[ф$$(site-packages/firewall/core/fw_ipset.pyonu[ c`c@sydZdgZddlmZddlmZddlmZddl m Z ddl m Z de fdYZd S( s ipset backendt FirewallIPSeti(tlog(tremove_default_create_options(tIPSet(terrors(t FirewallErrorcBseZdZdZdZdZdZdZdZe dZ dZ d Z d Z e d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZRS(cCs||_i|_dS(N(t_fwt_ipsets(tselftfw((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt__init__!s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt__repr__%scCs|jjdS(N(Rtclear(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pytcleanup*scCs+||jkr'ttj|ndS(N(t get_ipsetsRRt INVALID_IPSET(Rtname((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt check_ipset-scCs||jkS(N(R(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt query_ipset1scCst|jjS(N(tsortedRtkeys(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyR4scCst|jdkS(Ni(tlenR(R((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt has_ipsets7scCs4|j||j|}|r0|j|n|S(N(RRtcheck_applied_obj(RRtappliedtobj((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_ipset:s   cGsNy|||Wn6tk rI}t|}tjd||fnXdS(Ns%s: %s(RtstrRtwarning(RtfRtargsterrortmsg((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt_error2warningAs  cCsNg}|jjr(|j|jjn|jjrJ|j|jjn|S(N(Rtnftables_enabledtappendtnftables_backendt ipset_enabledt ipset_backend(Rtbackends((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyR(Is   cCsE|j|jjkr1ttjd|jn||j|jR)(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pytget_typescCs%t|j|dtjjdS(NRt,(RRR>R)tsplit(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_dimensionscCs |j|}|j|dS(N(RR(RRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt check_appliedscCs%|js!ttj|jndS(N(RRRt NOT_APPLIEDR(RR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyRs cCsB|j|dt}d|jkr>|jddkr>dSndS(NRtfamilytinet6tipv6tipv4(RR>R:(RRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_familys cCs|S(N((RRD((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt __entry_idscCsdS(N((RtenableRRD((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt__entryscCs|j|dt}tj||j|j||jkr\ttj d||fny.x'|j D]}|j |j |qlWWn%t k r}ttj|nEXd|jks|jddkr||jkr|jj|ndS(NRs'%s' already is in '%s'R5R6(RR>Rt check_entryR:R)R?RRtALREADY_ENABLEDR(R@RR.R/R$(RRRDRR2R!((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt add_entrys "cCs|j|dt}||jkrCttjd||fny.x'|jD]}|j|j|qSWWn%t k r}ttj |nEXd|j ks|j ddkr||jkr|jj |ndS(NRs'%s' not in '%s'R5R6( RR>R?RRt NOT_ENABLEDR(t set_deleteRR.R/R:tremove(RRRDRR2R!((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt remove_entrys "cCsY|j|dt}d|jkrL|jddkrLttj|n||jkS(NRR5R6(RR>R:RRtIPSET_WITH_TIMEOUTR?(RRRDR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt query_entrys"cCs|j|dt}|jS(NR(RR>R?(RRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt get_entriessc Cs|j|dt}x'|D]}tj||j|jqWd|jksa|jddkrm||_ny+x$|jD]}|j|j q}WWn%t k r}t t j |n Xt|_yx|jD]s}|jjs|j dkr'xL|jD]}|j|j |qWq|j|j |j|j|jdqWWn%t k rx}t t j |n Xt|_dS(NRR5R6R7(RR>RRTR:R)R?R(t set_flushRR.RRR/RRR<R@RARB(RRR?RRDR2R!((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyt set_entriess. "   (t__name__t __module__R R RRRRRR8RR"R(R,R3RERFRIRJRRPt_FirewallIPSet__entry_idt_FirewallIPSet__entryRVRZR\R]R_(((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyR s2            3          N(t__doc__t__all__tfirewall.core.loggerRtfirewall.core.ipsetRR;tfirewall.core.io.ipsetRtfirewallRtfirewall.errorsRtobjectR(((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ipset.pyts PK[[Domm&site-packages/firewall/core/logger.pycnu[ c`c@sddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z de fdYZ de fdYZ d e fd YZd e fd YZde fd YZde fdYZeZdS(t LogTargettFileLogtLoggertlogiNcBs5eZdZdZddZdZdZRS(s% Abstract class for logging targets. cCs d|_dS(N(tNonetfd(tself((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt__init__(sicCstddS(Ns%LogTarget.write is an abstract method(tNotImplementedError(Rtdatatleveltloggertis_debug((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytwrite+scCstddS(Ns%LogTarget.flush is an abstract method(R(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytflush.scCstddS(Ns%LogTarget.close is an abstract method(R(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytclose1s(t__name__t __module__t__doc__RR RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR&s    t _StdoutLogcBs/eZdZddZdZdZRS(cCstj|tj|_dS(N(RRtsyststdoutR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR8s icCs|jj||jdS(N(RR R(RR R R R ((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR <scCs|jdS(N(R(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRAscCs|jjdS(N(RR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRDs(RRRR RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR7s   t _StderrLogcBseZdZRS(cCstj|tj|_dS(N(RRRtstderrR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRKs (RRR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRJst _SyslogLogcBs/eZdZddZdZdZRS(cCs=tj|tjtjjtjdtj tj dS(Ni( RRtsyslogtopenlogtostpathtbasenameRtargvtLOG_PIDt LOG_DAEMON(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRSs icCsd}|rtj}nl||jkr3tj}nQ||jkrNtj}n6||jkritj}n||j krtj }n|j dr|t |d }nt |dkr|dkrtj|qtj||ndS(Ns ii( RRt LOG_DEBUGtINFO1tLOG_INFOtWARNINGt LOG_WARNINGtERRORtLOG_ERRtFATALtLOG_CRITtendswithtlen(RR R R R tpriority((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR as"      cCstjdS(N(Rtcloselog(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRwscCsdS(N((R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRzs(RRRR RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRRs   cBsAeZdZddZdZddZdZdZRS(s< FileLog class. File will be opened on the first write. twcCs#tj|||_||_dS(N(RRtfilenametmode(RR/R0((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs  cCs|jr dStjtjB}|jjdr?|tjO}ntj|j|d|_tj |jdtj |j|j|_t j |jt j t j dS(Ntai(RRtO_CREATtO_WRONLYR0t startswithtO_APPENDtopenR/tfchmodtfdopentfcntltF_SETFDt FD_CLOEXEC(Rtflags((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR6s icCs7|js|jn|jj||jjdS(N(RR6R R(RR R R R ((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR s  cCs'|js dS|jjd|_dS(N(RRR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs  cCs|js dS|jjdS(N(RR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs (RRRRR6R RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs    cBseZdZdZdZdZdZdZdZe Z e Z e Zddd Zd Zd d Zd d Zd dZd dZdZdZdZdZdZdZed2dZed2dZed2dZed2dZed2dZ ed2dZ!dZ"dZ#dZ$dZ%d Z&d!Z'd"Z(d#Z)d$Z*d%Z+d&Z,dd'Z-d(Z.dd)Z/ed2dd*Z0ed2dd+Z1ed2dd,Z2dd-Z3d.Z4d/Z5d0Z6dd1Z7RS(3sL Format string: %(class)s Calling class the function belongs to, else empty %(date)s Date using Logger.date_format, see time module %(domain)s Full Domain: %(module)s.%(class)s.%(function)s %(file)s Filename of the module %(function)s Function name, empty in __main__ %(label)s Label according to log function call from Logger.label %(level)d Internal logging level %(line)d Line number in module %(module)s Module name %(message)s Log message Standard levels: FATAL Fatal error messages ERROR Error messages WARNING Warning messages INFOx, x in [1..5] Information DEBUGy, y in [1..10] Debug messages NO_INFO No info output NO_DEBUG No debug output INFO_MAX Maximum info level DEBUG_MAX Maximum debug level x and y depend on info_max and debug_max from Logger class initialization. See __init__ function. Default logging targets: stdout Logs to stdout stderr Logs to stderr syslog Logs to syslog Additional arguments for logging functions (fatal, error, warning, info and debug): nl Disable newline at the end with nl=0, default is nl=1. fmt Format string for this logging entry, overloads global format string. Example: fmt="%(file)s:%(line)d %(message)s" nofmt Only output message with nofmt=1. The nofmt argument wins over the fmt argument. Example: from logger import log log.setInfoLogLevel(log.INFO1) log.setDebugLogLevel(log.DEBUG1) for i in range(1, log.INFO_MAX+1): log.setInfoLogLabel(i, "INFO%d: " % i) log.setFormat("%(date)s %(module)s:%(line)d [%(domain)s] %(label)s: " "%(level)d %(message)s") log.setDateFormat("%Y-%m-%d %H:%M:%S") fl = FileLog("/tmp/log", "a") log.addInfoLogging("*", fl) log.addDebugLogging("*", fl) log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s") log.debug3("debug3") log.debug2("debug2") log.debug1("debug1") log.info2("info2") log.info1("info1") log.warning("warning\n", nl=0) log.error("error\n", nl=0) log.fatal("fatal") log.info(log.INFO1, "nofmt info", nofmt=1) iiiiiiii cCsi|_i|_d|_d|_i|_i|_i|_i|_i|_i|_ |dkryt d|n|dkrt d|n|j |_ ||_ d|_||_|j|jd|j|jd|j|jd|j|j dxbtd|j dD]J}t|d |||j|dt|d |d ||q"Wxftd|jdD]N}t|d |||j|d |t|d|d||qW|j|j|j|j|jd|jd|jd|j|j|j|j g|jd|jgt|j|j dD] }|^qd|jd|jgtd|jdD] }|^qdS(s Logger class initialization tisLogger: info_max %d is too lowisLogger: debug_max %d is too lows FATAL ERROR: sERROR: s WARNING: sINFO%dsinfo%dcsfdS(Ncsj|||S(N(tinfo(tmessagetargstkwargs(Rtx(s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt s((RRB((RRBs8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRCssDEBUG%ds DEBUG%d: sdebug%dcsfdS(Ncsj|||S(N(tdebug(R?R@RA(RRB(s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRC)s((RRB((RRBs8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRC(ss%(label)s%(message)ss%d %b %Y %H:%M:%St*N( t_levelt _debug_levelt_formatt _date_formatt_labelt _debug_labelt_loggingt_debug_loggingt_domainst_debug_domainst ValueErrorR$tNO_INFOtINFO_MAXtNO_DEBUGt DEBUG_MAXtsetInfoLogLabelR(t TRACEBACKR&trangetsetattrtsetDebugLogLabeltsetInfoLogLevelR"tsetDebugLogLevelt setFormatt setDateFormattsetInfoLoggingRRtsetDebugLogging(Rtinfo_maxt debug_maxRFti((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRsX                     -cCshxat|j|jdD]F}||jkr5qnx(|j|D]\}}}|jqCWqWdS(s Close all logging targets iN(RWR(RTRLR(RR tdummyttarget((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR8s  REcCs.|j|||jkr'|j|S|jS(s Get info log level. (t _checkDomainRFtNOTHING(Rtdomain((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytgetInfoLogLevel@s  cCsT|j|||jkr(|j}n||jkrC|j}n||j|s  cOsM|j|ddd|j|j|d|d<|j||||dS(s Debug log using debug level [1..debug_max]. There are additional debugx functions according to debug_max from __init__RliRmR N(RoRTR}R~(RR RHR@RA((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRDs  cCs)|j|jtjdgdidS(NR@RA(R~RVt tracebackt format_exc(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt exceptionscCs8||ks||kr4td|||fndS(Ns*Level %d out of range, should be [%d..%d].(RP(RR RlRm((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRoscCsD|s dSx3|jD]%}|dkrtd|qqWdS(NtnlRstnofmts0Key '%s' is not allowed as argument for logging.(snlsfmtsnofmt(tkeysRP(RRAtkey((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR}s  cCs*| s|dkr&td|ndS(NR=sDomain '%s' is not valid.(RP(RRg((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRescCs||jkrt|ts-t|tr6|}n |g}x|D]J}|rq|j|ddd|jqF|j|d|jd|jqFWnY|rgt|j |jD] }|^q}n(gt|j|jD] }|^q}|S(s Generate log level array. RliRm( tALLt isinstancetlistttupleRoRTR(RRRWtDEBUG1(RR R RqRb((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRns    +(cCspt|tst|tr'|}n |g}x9|D]1}t|jts7td|jjq7q7W|S(s Generate target array. s '%s' is no valid logging target.(RRRt issubclasst __class__RRPR(RRdttargetst_target((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt _getTargetss   cCs|r.|j}|j}d|jdf}n(|j}|j}|j|jdf}t|dkru|jnxwt |d|dD]^}||krqnxC||D]7\}}}||kr|j |gj |qqWqWdS(s% Generate dict with domain by level. iiN( RORMRTRNRLR(RRR+tclearRWt setdefaulttappend(RR RNRLt_rangeR RgRc((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt _genDomainss       c Cs|j||j||}|j|}|r@|j}n |j}x5|D]-}x$|D]}|||fg|||SqqWx-|jD]"}|j||}|rL|SqLWdS(s@ Internal function to get calling class. Returns class or None. N( RtvaluesRRRRt __bases__RR(RRRRtbaset_obj((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs cOsd}d|kr|d}nd}d|kr>|d}nd}d|kr]|d}n|j||}|sydSt|dkr|||dRDRRoR}ReRnRRRrRtRwRzRRR~R(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRsdG   ;                      4(t__all__RRRRRRRR9tos.pathRtobjectRRRRRRR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyts(          -( 4PK[ Z?(site-packages/firewall/core/fw_config.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "FirewallConfig" ] import copy import os import os.path import shutil from firewall import config from firewall.core.logger import log from firewall.core.io.icmptype import IcmpType, icmptype_reader, icmptype_writer from firewall.core.io.service import Service, service_reader, service_writer from firewall.core.io.zone import Zone, zone_reader, zone_writer from firewall.core.io.ipset import IPSet, ipset_reader, ipset_writer from firewall.core.io.helper import Helper, helper_reader, helper_writer from firewall import errors from firewall.errors import FirewallError class FirewallConfig(object): def __init__(self, fw): self._fw = fw self.__init_vars() def __repr__(self): return '%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)' % \ (self.__class__, self._ipsets, self._icmptypes, self._services, self._zones, self._helpers, self._builtin_ipsets, self._builtin_icmptypes, self._builtin_services, self._builtin_zones, self._builtin_helpers, self._firewalld_conf, self._policies, self._direct) def __init_vars(self): self._ipsets = { } self._icmptypes = { } self._services = { } self._zones = { } self._helpers = { } self._builtin_ipsets = { } self._builtin_icmptypes = { } self._builtin_services = { } self._builtin_zones = { } self._builtin_helpers = { } self._firewalld_conf = None self._policies = None self._direct = None def cleanup(self): for x in list(self._builtin_ipsets.keys()): self._builtin_ipsets[x].cleanup() del self._builtin_ipsets[x] for x in list(self._ipsets.keys()): self._ipsets[x].cleanup() del self._ipsets[x] for x in list(self._builtin_icmptypes.keys()): self._builtin_icmptypes[x].cleanup() del self._builtin_icmptypes[x] for x in list(self._icmptypes.keys()): self._icmptypes[x].cleanup() del self._icmptypes[x] for x in list(self._builtin_services.keys()): self._builtin_services[x].cleanup() del self._builtin_services[x] for x in list(self._services.keys()): self._services[x].cleanup() del self._services[x] for x in list(self._builtin_zones.keys()): self._builtin_zones[x].cleanup() del self._builtin_zones[x] for x in list(self._zones.keys()): self._zones[x].cleanup() del self._zones[x] for x in list(self._builtin_helpers.keys()): self._builtin_helpers[x].cleanup() del self._builtin_helpers[x] for x in list(self._helpers.keys()): self._helpers[x].cleanup() del self._helpers[x] if self._firewalld_conf: self._firewalld_conf.cleanup() del self._firewalld_conf self._firewalld_conf = None if self._policies: self._policies.cleanup() del self._policies self._policies = None if self._direct: self._direct.cleanup() del self._direct self._direct = None self.__init_vars() # access check def lockdown_enabled(self): return self._fw.policies.query_lockdown() def access_check(self, key, value): return self._fw.policies.access_check(key, value) # firewalld_conf def set_firewalld_conf(self, conf): self._firewalld_conf = conf def get_firewalld_conf(self): return self._firewalld_conf def update_firewalld_conf(self): if not os.path.exists(config.FIREWALLD_CONF): self._firewalld_conf.clear() else: self._firewalld_conf.read() # policies def set_policies(self, policies): self._policies = policies def get_policies(self): return self._policies def update_lockdown_whitelist(self): if not os.path.exists(config.LOCKDOWN_WHITELIST): self._policies.lockdown_whitelist.cleanup() else: self._policies.lockdown_whitelist.read() # direct def set_direct(self, direct): self._direct = direct def get_direct(self): return self._direct def update_direct(self): if not os.path.exists(config.FIREWALLD_DIRECT): self._direct.cleanup() else: self._direct.read() # ipset def get_ipsets(self): return sorted(set(list(self._ipsets.keys()) + \ list(self._builtin_ipsets.keys()))) def add_ipset(self, obj): if obj.builtin: self._builtin_ipsets[obj.name] = obj else: self._ipsets[obj.name] = obj def get_ipset(self, name): if name in self._ipsets: return self._ipsets[name] elif name in self._builtin_ipsets: return self._builtin_ipsets[name] raise FirewallError(errors.INVALID_IPSET, name) def load_ipset_defaults(self, obj): if obj.name not in self._ipsets: raise FirewallError(errors.NO_DEFAULTS, obj.name) elif self._ipsets[obj.name] != obj: raise FirewallError(errors.NO_DEFAULTS, "self._ipsets[%s] != obj" % obj.name) elif obj.name not in self._builtin_ipsets: raise FirewallError(errors.NO_DEFAULTS, "'%s' not a built-in ipset" % obj.name) self._remove_ipset(obj) return self._builtin_ipsets[obj.name] def get_ipset_config(self, obj): return obj.export_config() def set_ipset_config(self, obj, conf): if obj.builtin: x = copy.copy(obj) x.import_config(conf) x.path = config.ETC_FIREWALLD_IPSETS x.builtin = False if obj.path != x.path: x.default = False self.add_ipset(x) ipset_writer(x) return x else: obj.import_config(conf) ipset_writer(obj) return obj def new_ipset(self, name, conf): if name in self._ipsets or name in self._builtin_ipsets: raise FirewallError(errors.NAME_CONFLICT, "new_ipset(): '%s'" % name) x = IPSet() x.check_name(name) x.import_config(conf) x.name = name x.filename = "%s.xml" % name x.path = config.ETC_FIREWALLD_IPSETS # It is not possible to add a new one with a name of a buitin x.builtin = False x.default = True ipset_writer(x) self.add_ipset(x) return x def update_ipset_from_path(self, name): filename = os.path.basename(name) path = os.path.dirname(name) if not os.path.exists(name): # removed file if path == config.ETC_FIREWALLD_IPSETS: # removed custom ipset for x in self._ipsets.keys(): obj = self._ipsets[x] if obj.filename == filename: del self._ipsets[x] if obj.name in self._builtin_ipsets: return ("update", self._builtin_ipsets[obj.name]) return ("remove", obj) else: # removed builtin ipset for x in self._builtin_ipsets.keys(): obj = self._builtin_ipsets[x] if obj.filename == filename: del self._builtin_ipsets[x] if obj.name not in self._ipsets: # update dbus ipset return ("remove", obj) else: # builtin hidden, no update needed return (None, None) # ipset not known to firewalld, yet (timeout, ..) return (None, None) # new or updated file log.debug1("Loading ipset file '%s'", name) try: obj = ipset_reader(filename, path) except Exception as msg: log.error("Failed to load ipset file '%s': %s", filename, msg) return (None, None) # new ipset if obj.name not in self._builtin_ipsets and obj.name not in self._ipsets: self.add_ipset(obj) return ("new", obj) # updated ipset if path == config.ETC_FIREWALLD_IPSETS: # custom ipset update if obj.name in self._ipsets: obj.default = self._ipsets[obj.name].default self._ipsets[obj.name] = obj return ("update", obj) else: if obj.name in self._builtin_ipsets: # builtin ipset update del self._builtin_ipsets[obj.name] self._builtin_ipsets[obj.name] = obj if obj.name not in self._ipsets: # update dbus ipset return ("update", obj) else: # builtin hidden, no update needed return (None, None) # ipset not known to firewalld, yet (timeout, ..) return (None, None) def _remove_ipset(self, obj): if obj.name not in self._ipsets: raise FirewallError(errors.INVALID_IPSET, obj.name) if obj.path != config.ETC_FIREWALLD_IPSETS: raise FirewallError(errors.INVALID_DIRECTORY, "'%s' != '%s'" % (obj.path, config.ETC_FIREWALLD_IPSETS)) name = "%s/%s.xml" % (obj.path, obj.name) try: shutil.move(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) os.remove(name) del self._ipsets[obj.name] def check_builtin_ipset(self, obj): if obj.builtin or not obj.default: raise FirewallError(errors.BUILTIN_IPSET, "'%s' is built-in ipset" % obj.name) def remove_ipset(self, obj): self.check_builtin_ipset(obj) self._remove_ipset(obj) def rename_ipset(self, obj, name): self.check_builtin_ipset(obj) new_ipset = self._copy_ipset(obj, name) self._remove_ipset(obj) return new_ipset def _copy_ipset(self, obj, name): return self.new_ipset(name, obj.export_config()) # icmptypes def get_icmptypes(self): return sorted(set(list(self._icmptypes.keys()) + \ list(self._builtin_icmptypes.keys()))) def add_icmptype(self, obj): if obj.builtin: self._builtin_icmptypes[obj.name] = obj else: self._icmptypes[obj.name] = obj def get_icmptype(self, name): if name in self._icmptypes: return self._icmptypes[name] elif name in self._builtin_icmptypes: return self._builtin_icmptypes[name] raise FirewallError(errors.INVALID_ICMPTYPE, name) def load_icmptype_defaults(self, obj): if obj.name not in self._icmptypes: raise FirewallError(errors.NO_DEFAULTS, obj.name) elif self._icmptypes[obj.name] != obj: raise FirewallError(errors.NO_DEFAULTS, "self._icmptypes[%s] != obj" % obj.name) elif obj.name not in self._builtin_icmptypes: raise FirewallError(errors.NO_DEFAULTS, "'%s' not a built-in icmptype" % obj.name) self._remove_icmptype(obj) return self._builtin_icmptypes[obj.name] def get_icmptype_config(self, obj): return obj.export_config() def set_icmptype_config(self, obj, conf): if obj.builtin: x = copy.copy(obj) x.import_config(conf) x.path = config.ETC_FIREWALLD_ICMPTYPES x.builtin = False if obj.path != x.path: x.default = False self.add_icmptype(x) icmptype_writer(x) return x else: obj.import_config(conf) icmptype_writer(obj) return obj def new_icmptype(self, name, conf): if name in self._icmptypes or name in self._builtin_icmptypes: raise FirewallError(errors.NAME_CONFLICT, "new_icmptype(): '%s'" % name) x = IcmpType() x.check_name(name) x.import_config(conf) x.name = name x.filename = "%s.xml" % name x.path = config.ETC_FIREWALLD_ICMPTYPES # It is not possible to add a new one with a name of a buitin x.builtin = False x.default = True icmptype_writer(x) self.add_icmptype(x) return x def update_icmptype_from_path(self, name): filename = os.path.basename(name) path = os.path.dirname(name) if not os.path.exists(name): # removed file if path == config.ETC_FIREWALLD_ICMPTYPES: # removed custom icmptype for x in self._icmptypes.keys(): obj = self._icmptypes[x] if obj.filename == filename: del self._icmptypes[x] if obj.name in self._builtin_icmptypes: return ("update", self._builtin_icmptypes[obj.name]) return ("remove", obj) else: # removed builtin icmptype for x in self._builtin_icmptypes.keys(): obj = self._builtin_icmptypes[x] if obj.filename == filename: del self._builtin_icmptypes[x] if obj.name not in self._icmptypes: # update dbus icmptype return ("remove", obj) else: # builtin hidden, no update needed return (None, None) # icmptype not known to firewalld, yet (timeout, ..) return (None, None) # new or updated file log.debug1("Loading icmptype file '%s'", name) try: obj = icmptype_reader(filename, path) except Exception as msg: log.error("Failed to load icmptype file '%s': %s", filename, msg) return (None, None) # new icmptype if obj.name not in self._builtin_icmptypes and obj.name not in self._icmptypes: self.add_icmptype(obj) return ("new", obj) # updated icmptype if path == config.ETC_FIREWALLD_ICMPTYPES: # custom icmptype update if obj.name in self._icmptypes: obj.default = self._icmptypes[obj.name].default self._icmptypes[obj.name] = obj return ("update", obj) else: if obj.name in self._builtin_icmptypes: # builtin icmptype update del self._builtin_icmptypes[obj.name] self._builtin_icmptypes[obj.name] = obj if obj.name not in self._icmptypes: # update dbus icmptype return ("update", obj) else: # builtin hidden, no update needed return (None, None) # icmptype not known to firewalld, yet (timeout, ..) return (None, None) def _remove_icmptype(self, obj): if obj.name not in self._icmptypes: raise FirewallError(errors.INVALID_ICMPTYPE, obj.name) if obj.path != config.ETC_FIREWALLD_ICMPTYPES: raise FirewallError(errors.INVALID_DIRECTORY, "'%s' != '%s'" % \ (obj.path, config.ETC_FIREWALLD_ICMPTYPES)) name = "%s/%s.xml" % (obj.path, obj.name) try: shutil.move(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) os.remove(name) del self._icmptypes[obj.name] def check_builtin_icmptype(self, obj): if obj.builtin or not obj.default: raise FirewallError(errors.BUILTIN_ICMPTYPE, "'%s' is built-in icmp type" % obj.name) def remove_icmptype(self, obj): self.check_builtin_icmptype(obj) self._remove_icmptype(obj) def rename_icmptype(self, obj, name): self.check_builtin_icmptype(obj) new_icmptype = self._copy_icmptype(obj, name) self._remove_icmptype(obj) return new_icmptype def _copy_icmptype(self, obj, name): return self.new_icmptype(name, obj.export_config()) # services def get_services(self): return sorted(set(list(self._services.keys()) + \ list(self._builtin_services.keys()))) def add_service(self, obj): if obj.builtin: self._builtin_services[obj.name] = obj else: self._services[obj.name] = obj def get_service(self, name): if name in self._services: return self._services[name] elif name in self._builtin_services: return self._builtin_services[name] raise FirewallError(errors.INVALID_SERVICE, "get_service(): '%s'" % name) def load_service_defaults(self, obj): if obj.name not in self._services: raise FirewallError(errors.NO_DEFAULTS, obj.name) elif self._services[obj.name] != obj: raise FirewallError(errors.NO_DEFAULTS, "self._services[%s] != obj" % obj.name) elif obj.name not in self._builtin_services: raise FirewallError(errors.NO_DEFAULTS, "'%s' not a built-in service" % obj.name) self._remove_service(obj) return self._builtin_services[obj.name] def get_service_config(self, obj): return obj.export_config() def set_service_config(self, obj, conf): if obj.builtin: x = copy.copy(obj) x.import_config(conf) x.path = config.ETC_FIREWALLD_SERVICES x.builtin = False if obj.path != x.path: x.default = False self.add_service(x) service_writer(x) return x else: obj.import_config(conf) service_writer(obj) return obj def new_service(self, name, conf): if name in self._services or name in self._builtin_services: raise FirewallError(errors.NAME_CONFLICT, "new_service(): '%s'" % name) x = Service() x.check_name(name) x.import_config(conf) x.name = name x.filename = "%s.xml" % name x.path = config.ETC_FIREWALLD_SERVICES # It is not possible to add a new one with a name of a buitin x.builtin = False x.default = True service_writer(x) self.add_service(x) return x def update_service_from_path(self, name): filename = os.path.basename(name) path = os.path.dirname(name) if not os.path.exists(name): # removed file if path == config.ETC_FIREWALLD_SERVICES: # removed custom service for x in self._services.keys(): obj = self._services[x] if obj.filename == filename: del self._services[x] if obj.name in self._builtin_services: return ("update", self._builtin_services[obj.name]) return ("remove", obj) else: # removed builtin service for x in self._builtin_services.keys(): obj = self._builtin_services[x] if obj.filename == filename: del self._builtin_services[x] if obj.name not in self._services: # update dbus service return ("remove", obj) else: # builtin hidden, no update needed return (None, None) # service not known to firewalld, yet (timeout, ..) return (None, None) # new or updated file log.debug1("Loading service file '%s'", name) try: obj = service_reader(filename, path) except Exception as msg: log.error("Failed to load service file '%s': %s", filename, msg) return (None, None) # new service if obj.name not in self._builtin_services and obj.name not in self._services: self.add_service(obj) return ("new", obj) # updated service if path == config.ETC_FIREWALLD_SERVICES: # custom service update if obj.name in self._services: obj.default = self._services[obj.name].default self._services[obj.name] = obj return ("update", obj) else: if obj.name in self._builtin_services: # builtin service update del self._builtin_services[obj.name] self._builtin_services[obj.name] = obj if obj.name not in self._services: # update dbus service return ("update", obj) else: # builtin hidden, no update needed return (None, None) # service not known to firewalld, yet (timeout, ..) return (None, None) def _remove_service(self, obj): if obj.name not in self._services: raise FirewallError(errors.INVALID_SERVICE, obj.name) if obj.path != config.ETC_FIREWALLD_SERVICES: raise FirewallError(errors.INVALID_DIRECTORY, "'%s' != '%s'" % \ (obj.path, config.ETC_FIREWALLD_SERVICES)) name = "%s/%s.xml" % (obj.path, obj.name) try: shutil.move(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) os.remove(name) del self._services[obj.name] def check_builtin_service(self, obj): if obj.builtin or not obj.default: raise FirewallError(errors.BUILTIN_SERVICE, "'%s' is built-in service" % obj.name) def remove_service(self, obj): self.check_builtin_service(obj) self._remove_service(obj) def rename_service(self, obj, name): self.check_builtin_service(obj) new_service = self._copy_service(obj, name) self._remove_service(obj) return new_service def _copy_service(self, obj, name): return self.new_service(name, obj.export_config()) # zones def get_zones(self): return sorted(set(list(self._zones.keys()) + \ list(self._builtin_zones.keys()))) def add_zone(self, obj): if obj.builtin: self._builtin_zones[obj.name] = obj else: self._zones[obj.name] = obj def forget_zone(self, name): if name in self._builtin_zones: del self._builtin_zones[name] if name in self._zones: del self._zones[name] def get_zone(self, name): if name in self._zones: return self._zones[name] elif name in self._builtin_zones: return self._builtin_zones[name] raise FirewallError(errors.INVALID_ZONE, "get_zone(): %s" % name) def load_zone_defaults(self, obj): if obj.name not in self._zones: raise FirewallError(errors.NO_DEFAULTS, obj.name) elif self._zones[obj.name] != obj: raise FirewallError(errors.NO_DEFAULTS, "self._zones[%s] != obj" % obj.name) elif obj.name not in self._builtin_zones: raise FirewallError(errors.NO_DEFAULTS, "'%s' not a built-in zone" % obj.name) self._remove_zone(obj) return self._builtin_zones[obj.name] def get_zone_config(self, obj): return obj.export_config() def set_zone_config(self, obj, conf): if obj.builtin: x = copy.copy(obj) x.fw_config = self x.import_config(conf) x.path = config.ETC_FIREWALLD_ZONES x.builtin = False if obj.path != x.path: x.default = False self.add_zone(x) zone_writer(x) return x else: obj.fw_config = self obj.import_config(conf) zone_writer(obj) return obj def new_zone(self, name, conf): if name in self._zones or name in self._builtin_zones: raise FirewallError(errors.NAME_CONFLICT, "new_zone(): '%s'" % name) x = Zone() x.check_name(name) x.fw_config = self x.import_config(conf) x.name = name x.filename = "%s.xml" % name x.path = config.ETC_FIREWALLD_ZONES # It is not possible to add a new one with a name of a buitin x.builtin = False x.default = True zone_writer(x) self.add_zone(x) return x def update_zone_from_path(self, name): filename = os.path.basename(name) path = os.path.dirname(name) if not os.path.exists(name): # removed file if path.startswith(config.ETC_FIREWALLD_ZONES): # removed custom zone for x in self._zones.keys(): obj = self._zones[x] if obj.filename == filename: del self._zones[x] if obj.name in self._builtin_zones: return ("update", self._builtin_zones[obj.name]) return ("remove", obj) else: # removed builtin zone for x in self._builtin_zones.keys(): obj = self._builtin_zones[x] if obj.filename == filename: del self._builtin_zones[x] if obj.name not in self._zones: # update dbus zone return ("remove", obj) else: # builtin hidden, no update needed return (None, None) # zone not known to firewalld, yet (timeout, ..) return (None, None) # new or updated file log.debug1("Loading zone file '%s'", name) try: obj = zone_reader(filename, path) except Exception as msg: log.error("Failed to load zone file '%s': %s", filename, msg) return (None, None) obj.fw_config = self if path.startswith(config.ETC_FIREWALLD_ZONES) and \ len(path) > len(config.ETC_FIREWALLD_ZONES): # custom combined zone part obj.name = "%s/%s" % (os.path.basename(path), os.path.basename(filename)[0:-4]) # new zone if obj.name not in self._builtin_zones and obj.name not in self._zones: self.add_zone(obj) return ("new", obj) # updated zone if path.startswith(config.ETC_FIREWALLD_ZONES): # custom zone update if obj.name in self._zones: obj.default = self._zones[obj.name].default self._zones[obj.name] = obj return ("update", obj) else: if obj.name in self._builtin_zones: # builtin zone update del self._builtin_zones[obj.name] self._builtin_zones[obj.name] = obj if obj.name not in self._zones: # update dbus zone return ("update", obj) else: # builtin hidden, no update needed return (None, None) # zone not known to firewalld, yet (timeout, ..) return (None, None) def _remove_zone(self, obj): if obj.name not in self._zones: raise FirewallError(errors.INVALID_ZONE, obj.name) if not obj.path.startswith(config.ETC_FIREWALLD_ZONES): raise FirewallError(errors.INVALID_DIRECTORY, "'%s' doesn't start with '%s'" % \ (obj.path, config.ETC_FIREWALLD_ZONES)) name = "%s/%s.xml" % (obj.path, obj.name) try: shutil.move(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) os.remove(name) del self._zones[obj.name] def check_builtin_zone(self, obj): if obj.builtin or not obj.default: raise FirewallError(errors.BUILTIN_ZONE, "'%s' is built-in zone" % obj.name) def remove_zone(self, obj): self.check_builtin_zone(obj) self._remove_zone(obj) def rename_zone(self, obj, name): self.check_builtin_zone(obj) new_zone = self._copy_zone(obj, name) self._remove_zone(obj) return new_zone def _copy_zone(self, obj, name): return self.new_zone(name, obj.export_config()) # helper def get_helpers(self): return sorted(set(list(self._helpers.keys()) + \ list(self._builtin_helpers.keys()))) def add_helper(self, obj): if obj.builtin: self._builtin_helpers[obj.name] = obj else: self._helpers[obj.name] = obj def get_helper(self, name): if name in self._helpers: return self._helpers[name] elif name in self._builtin_helpers: return self._builtin_helpers[name] raise FirewallError(errors.INVALID_HELPER, name) def load_helper_defaults(self, obj): if obj.name not in self._helpers: raise FirewallError(errors.NO_DEFAULTS, obj.name) elif self._helpers[obj.name] != obj: raise FirewallError(errors.NO_DEFAULTS, "self._helpers[%s] != obj" % obj.name) elif obj.name not in self._builtin_helpers: raise FirewallError(errors.NO_DEFAULTS, "'%s' not a built-in helper" % obj.name) self._remove_helper(obj) return self._builtin_helpers[obj.name] def get_helper_config(self, obj): return obj.export_config() def set_helper_config(self, obj, conf): if obj.builtin: x = copy.copy(obj) x.import_config(conf) x.path = config.ETC_FIREWALLD_HELPERS x.builtin = False if obj.path != x.path: x.default = False self.add_helper(x) helper_writer(x) return x else: obj.import_config(conf) helper_writer(obj) return obj def new_helper(self, name, conf): if name in self._helpers or name in self._builtin_helpers: raise FirewallError(errors.NAME_CONFLICT, "new_helper(): '%s'" % name) x = Helper() x.check_name(name) x.import_config(conf) x.name = name x.filename = "%s.xml" % name x.path = config.ETC_FIREWALLD_HELPERS # It is not possible to add a new one with a name of a buitin x.builtin = False x.default = True helper_writer(x) self.add_helper(x) return x def update_helper_from_path(self, name): filename = os.path.basename(name) path = os.path.dirname(name) if not os.path.exists(name): # removed file if path == config.ETC_FIREWALLD_HELPERS: # removed custom helper for x in self._helpers.keys(): obj = self._helpers[x] if obj.filename == filename: del self._helpers[x] if obj.name in self._builtin_helpers: return ("update", self._builtin_helpers[obj.name]) return ("remove", obj) else: # removed builtin helper for x in self._builtin_helpers.keys(): obj = self._builtin_helpers[x] if obj.filename == filename: del self._builtin_helpers[x] if obj.name not in self._helpers: # update dbus helper return ("remove", obj) else: # builtin hidden, no update needed return (None, None) # helper not known to firewalld, yet (timeout, ..) return (None, None) # new or updated file log.debug1("Loading helper file '%s'", name) try: obj = helper_reader(filename, path) except Exception as msg: log.error("Failed to load helper file '%s': %s", filename, msg) return (None, None) # new helper if obj.name not in self._builtin_helpers and obj.name not in self._helpers: self.add_helper(obj) return ("new", obj) # updated helper if path == config.ETC_FIREWALLD_HELPERS: # custom helper update if obj.name in self._helpers: obj.default = self._helpers[obj.name].default self._helpers[obj.name] = obj return ("update", obj) else: if obj.name in self._builtin_helpers: # builtin helper update del self._builtin_helpers[obj.name] self._builtin_helpers[obj.name] = obj if obj.name not in self._helpers: # update dbus helper return ("update", obj) else: # builtin hidden, no update needed return (None, None) # helper not known to firewalld, yet (timeout, ..) return (None, None) def _remove_helper(self, obj): if obj.name not in self._helpers: raise FirewallError(errors.INVALID_HELPER, obj.name) if obj.path != config.ETC_FIREWALLD_HELPERS: raise FirewallError(errors.INVALID_DIRECTORY, "'%s' != '%s'" % (obj.path, config.ETC_FIREWALLD_HELPERS)) name = "%s/%s.xml" % (obj.path, obj.name) try: shutil.move(name, "%s.old" % name) except Exception as msg: log.error("Backup of file '%s' failed: %s", name, msg) os.remove(name) del self._helpers[obj.name] def check_builtin_helper(self, obj): if obj.builtin or not obj.default: raise FirewallError(errors.BUILTIN_HELPER, "'%s' is built-in helper" % obj.name) def remove_helper(self, obj): self.check_builtin_helper(obj) self._remove_helper(obj) def rename_helper(self, obj, name): self.check_builtin_helper(obj) new_helper = self._copy_helper(obj, name) self._remove_helper(obj) return new_helper def _copy_helper(self, obj, name): return self.new_helper(name, obj.export_config()) PK[H&site-packages/firewall/core/modules.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """modules backend""" __all__ = [ "modules" ] from firewall.core.prog import runProg from firewall.core.logger import log from firewall.config import COMMANDS class modules(object): def __init__(self): self._load_command = COMMANDS["modprobe"] # Use rmmod instead of modprobe -r (RHBZ#1031102) self._unload_command = COMMANDS["rmmod"] def __repr__(self): return '%s' % (self.__class__) def loaded_modules(self): """ get all loaded kernel modules and their dependencies """ mods = [ ] deps = { } with open("/proc/modules", "r") as f: for line in f: if not line: break line = line.strip() splits = line.split() mods.append(splits[0]) if splits[3] != "-": deps[splits[0]] = splits[3].split(",")[:-1] else: deps[splits[0]] = [ ] return mods, deps # [loaded modules], {module:[dependants]} def load_module(self, module): log.debug2("%s: %s %s", self.__class__, self._load_command, module) return runProg(self._load_command, [ module ]) def unload_module(self, module): log.debug2("%s: %s %s", self.__class__, self._unload_command, module) return runProg(self._unload_command, [ module ]) def get_deps(self, module, deps, ret): """ get all dependants of a module """ if module not in deps: return for mod in deps[module]: self.get_deps(mod, deps, ret) if mod not in ret: ret.append(mod) if module not in ret: ret.append(module) def get_firewall_modules(self): """ get all loaded firewall-related modules """ mods = [ ] (mods2, deps) = self.loaded_modules() self.get_deps("nf_conntrack", deps, mods) # these modules don't have dependants listed in /proc/modules for bad_bad_module in ["nf_conntrack_ipv4", "nf_conntrack_ipv6"]: if bad_bad_module in mods: # move them to end of list, so we'll remove them later mods.remove(bad_bad_module) mods.insert(-1, bad_bad_module) for mod in mods2: if mod in [ "ip_tables", "ip6_tables", "ebtables" ] or \ mod.startswith("iptable_") or mod.startswith("ip6table_") or \ mod.startswith("nf_") or mod.startswith("xt_") or \ mod.startswith("ipt_") or mod.startswith("ip6t_") : self.get_deps(mod, deps, mods) return mods def unload_firewall_modules(self): """ unload all firewall-related modules """ for module in self.get_firewall_modules(): (status, ret) = self.unload_module(module) if status != 0: log.debug1("Failed to unload module '%s': %s" %(module, ret)) PK[8^^$site-packages/firewall/core/rich.pycnu[ c`c@sdddddddddd d d d d ddddgZddlmZddlmZddlmZddlmZddlm Z de fdYZ de fdYZ de fdYZ de fdYZdefdYZde fdYZde fdYZde fdYZde fd YZd e fd!YZd e fd"YZd e fd#YZd e fd$YZd e fd%YZdefd&YZde fd'YZde fd(YZde fd)YZd*S(+t Rich_SourcetRich_Destinationt Rich_Servicet Rich_Portt Rich_ProtocoltRich_MasqueradetRich_IcmpBlockt Rich_IcmpTypetRich_SourcePorttRich_ForwardPorttRich_Logt Rich_Auditt Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_Markt Rich_Limitt Rich_Rulei(t functions(tcheck_ipset_name(t REJECT_TYPES(terrors(t FirewallErrorcBseZedZdZRS(cCs||_|jdkr$d|_n||_|jdksK|jdkrWd|_n$|jdk r{|jj|_n||_|jdkrd|_n||_|jdkr|jdkr|jdkrttjdndS(Ntsno address, mac and ipset( taddrtNonetmactuppertipsettinvertRRt INVALID_RULE(tselfRRRR((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyt__init__$s       - cCsd|jrdnd}|jdk r7|d|jS|jdk rU|d|jS|jdk rs|d|jSttjddS(Ns source%s s NOTRs address="%s"smac="%s"s ipset="%s"sno address, mac and ipset(RRRRRRRR(Rtret((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyt__str__5s (t__name__t __module__tFalseR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR#s cBseZedZdZRS(cCs||_||_dS(N(RR(RRR((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR Bs cCs d|jrdnd|jfS(Nsdestination %saddress="%s"snot R(RR(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Fs(R#R$R%R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRAs cBseZdZdZRS(cCs ||_dS(N(tname(RR&((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR KscCs d|jS(Nsservice name="%s"(R&(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Ns(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRJs cBseZdZdZRS(cCs||_||_dS(N(tporttprotocol(RR'R(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR Rs cCsd|j|jfS(Nsport port="%s" protocol="%s"(R'R((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Vs(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRQs cBseZdZRS(cCsd|j|jfS(Ns#source-port port="%s" protocol="%s"(R'R((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Zs (R#R$R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRYscBseZdZdZRS(cCs ||_dS(N(tvalue(RR)((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR _scCs d|jS(Nsprotocol value="%s"(R)(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"bs(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR^s cBseZdZdZRS(cCsdS(N((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR fscCsdS(Nt masquerade((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"is(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRes cBseZdZdZRS(cCs ||_dS(N(R&(RR&((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR mscCs d|jS(Nsicmp-block name="%s"(R&(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"ps(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRls cBseZdZdZRS(cCs ||_dS(N(R&(RR&((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR tscCs d|jS(Nsicmp-type name="%s"(R&(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"ws(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRss cBseZdZdZRS(cCs^||_||_||_||_|jdkr?d|_n|jdkrZd|_ndS(NR(R'R(tto_portt to_addressR(RR'R(R+R,((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR {s     cCsRd|j|j|jdkr+d|jnd|jdkrJd|jndfS(Ns(forward-port port="%s" protocol="%s"%s%sRs to-port="%s"s to-addr="%s"(R'R(R+R,(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s (R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR zs cBs#eZddddZdZRS(cCs||_||_||_dS(N(tprefixtleveltlimit(RR-R.R/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s  cCsSd|jrd|jnd|jr2d|jnd|jrKd|jndfS(Ns log%s%s%ss prefix="%s"Rs level="%s"s %s(R-R.R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"sN(R#R$RR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR scBseZddZdZRS(cCs ||_dS(N(R/(RR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR scCsd|jrd|jndS(Nsaudit%ss %sR(R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"sN(R#R$RR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cBseZddZdZRS(cCs ||_dS(N(R/(RR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR scCsd|jrd|jndS(Nsaccept%ss %sR(R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"sN(R#R$RR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cBs)eZdddZdZdZRS(cCs||_||_dS(N(ttypeR/(Rt_typeR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cCs:d|jrd|jnd|jr2d|jndfS(Ns reject%s%ss type="%s"Rs %s(R0R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"scCs|jr{|s$ttjdn|dkr{|jt|kr{djt|}ttjd|j|fq{ndS(Ns9When using reject type you must specify also rule family.tipv4tipv6s, s%Wrong reject type %s. Use one of: %s.(R2R3(R0RRRRtjoin(Rtfamilyt valid_types((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pytchecks  N(R#R$RR R"R7(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cBseZdZRS(cCsd|jrd|jndS(Nsdrop%ss %sR(R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s(R#R$R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRscBs&eZddZdZdZRS(cCs||_||_dS(N(tsetR/(Rt_setR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cCs'd|j|jrd|jndfS(Ns mark set=%s%ss %sR(R8R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s cCs|jdk r|j}nttjdd|kr|jd}t|dkrottj|ntj|d stj|d rttj|qn$tj|sttj|ndS(Ns no value sett/iii( R8RRRt INVALID_MARKtsplittlenRt checkUINT32(Rtxtsplits((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR7s  N(R#R$RR R"R7(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRs  cBs,eZdZdZdZdZRS(cCsu||_d|jkrq|jjd}t|dkrq|dd krqd|d |dd f|_qqndS( NR:iitsecondtminutethourtdays%s/%si(RARBRCRD(R)R<R=(RR)R@((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s  cCsd}d|jkr*|jjd}n| sCt|dkr[ttj|jn|\}}yt|}Wnttj|jnX|dks|dkrttj|jnd}|dkrd}n?|dkrd}n*|dkr d}n|dkr d}nd ||d krPttjd |jn|dkr|dkrttjd |jndS(NR:iitstmthtdi<ii'is %s too fasts %s too slow(RERFRGRHiiiQ(RR)R<R=RRt INVALID_LIMITtint(RR@tratetdurationtmult((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR7s6           cCs d|jS(Nslimit value="%s"(R)(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"scCsdS(NR((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pytcommand s(R#R$R R7R"RN(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRs  " cBs;eZdddZdZdZdZdZRS(cCsw|dk rt||_n d|_d|_d|_d|_d|_d|_d|_|rs|j |ndS(N( RtstrR5tsourcet destinationtelementtlogtaudittactiont_import_from_string(RR5trule_str((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s        cCsg}xtj|D]}d|kr|jd}t|dks_|d s_|d rxttjd|n|ji|dd6|dd6q|ji|d6qW|jid d6|S( s Lexical analysis t=iiisinternal error in _lexer(): %st attr_namet attr_valueRRtEOL(Rt splitArgsR<R=RRRtappend(RRWttokenstrtattr((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyt_lexers ( &c Cs |sttjdnd|_d|_d|_d|_d|_d|_ d|_ |j |}|r|dj ddkrttjdni}g}d}x ||j ddko|dgks ||j d}||j d}||j d}|rA|d?kr|ttjd|q|n;|d@krf|dkrw|jrwttjd)q||dkr|jrttjd*q||dAkr|jrttjd+||jfq||d kr|jrttjd,q||d!kr,|j r,ttjd-q||dBkr||j r|ttjd.||j fq|nttjd/|t |dkr|t |d0nd1} | d1kr<| r|r|dkrttjd2q9ttjd3||fq d|kr,ttjd4||fq |jdnx| dkr|dkr|dCkryttjd7|n||_q |r|dkrd8} nd9||f} ttj| q |j|n| dkrs|dDkr|||n|d0}qW|j$dS(LNs empty ruleiRRR[truleRYRZR5taddressRRRR)R'R(sto-portsto-addrR&R-R.R0R8sbad attribute '%s'RPRQtservices icmp-blocks icmp-typeR*s forward-ports source-portRSRTtaccepttdroptrejecttmarkR/tnottNOTsmore than one 'source' elements#more than one 'destination' elementsFmore than one element. There cannot be both '%s' and '%s' in one rule.smore than one 'log' elementsmore than one 'audit' elementsOmore than one 'action' element. There cannot be both '%s' and '%s' in one rule.sunknown element %siRs0'family' outside of rule. Use 'rule family=...'.s:'%s' outside of any element. Use 'rule %s= ...'.s,'%s' outside of rule. Use 'rule ... %s ...'.R2R3sH'family' attribute cannot have '%s' value. Use 'ipv4' or 'ipv6' instead.sdwrong 'protocol' usage. Use either 'rule protocol value=...' or 'rule [forward-]port protocol=...'.sDattribute '%s' outside of any element. Use 'rule %s= ...'.sinvalid 'protocol' elementsinvalid 'service' elementsinvalid 'icmp-block' elementsinvalid 'icmp-type' elementsinvalid 'limit' element(sfamilyRcsmacsipsetsinvertsvaluesportsprotocolsto-portsto-addrsnamesprefixslevelstypesset(Rbssources destinationsprotocolRdsports icmp-blocks icmp-types masquerades forward-ports source-portslogsauditReRfRgsmarkslimitRiRjsEOL(sprotocolRdsports icmp-blocks icmp-types masquerades forward-ports source-port(ReRfRgsmark(sipv4sipv6(Rcsmacsipsetsinvert(RiRj(Rcsinvert(RiRj(sportsprotocol(sportsprotocolsto-portsto-addr(sportsprotocol(sprefixslevel(%RRRRR5RPRQRRRSRTRURatgetR=R]tTrueRR%tpoptclearRRRRRRRR RR R R RR RRR7( RRWR^tattrst in_elementstindexRRRYRZt in_elementterr_msg((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRV.st       +  "%,               ?        $            $                 <      $       0                      $             cCs |jdk r6|jdkr6ttj|jn|jdkr|jdk rf|jjdk su|jdk rttjnt |j t krttjqn|j dkr|j dkrttj dn|jdkr|jdkrttj dqnt |j tt tgkr}|jdkr}|jdkr}|j dkr}ttj dq}n|jdk r|jjdk rL|jdkrttjn|jjdk rttj dn|jjdk r ttj dntj|j|jjsttjt|jjqq|jjdk r|jjdk rttj dntj|jjsttjt|jjqq|jjdk rt|jjsttjt|jjqqttj d n|jdk r|jdkrKttjn|jjdksytj|j|jj rttjt|jjqnt |j tkr|j jdkst|j jd kr>ttjt|j jq>n>t |j t krutj!|j j"sEttj#|j j"n|j j$dkr>ttj%|j j$q>nt |j t&krtj'|j j(s>ttj%|j j(q>nt |j tkr/|j dk rttj dn|jdk r>|jjdk r>ttj dq>nt |j tkr|j jdksnt|j jd krttj)t|j jn|j r>ttj dq>nt |j t*kr|j jdkst|j jd kr>ttj)t|j jq>n+t |j t krtj!|j j"sXttj#|j j"n|j j$dkrttj%|j j$n|j j+dkr|j j,dkrttj#|j j+n|j j+dkrtj!|j j+ rttj#|j j+n|j j,dkrPtj-|j|j j, rPttj|j j,n|jdkrqttjn|j dk r>ttj dq>nt |j t.kr tj!|j j"sttj#|j j"n|j j$d kr>ttj%|j j$q>n1|j dk r>ttj dt |j n|jdk r|jj/r|jj/d!krttj0|jj/n|jj1dk r|jj1j2qn|jdk r! t |j t3t4t5gkrttj6t |j n|jj1dk r! |jj1j2q! n|j dk r t |j t4kr[ |j j2|jn%t |j t7kr |j j2n|j j1dk r |j j1j2q ndS("NR2R3sno element, no actions%no element, no source, no destinationsno action, no log, no auditsaddress and macsaddress and ipsets mac and ipsetsinvalid sourceittcptudptsctptdccpsmasquerade and actionsmasquerade and mac sourcesicmp-block and actionRsforward-port and actionsUnknown element %stemergtalerttcritterrortwarningtnoticetinfotdebug(sipv4sipv6(RtRuRvRw(RtRuRvRw(RtRuRvRw(RxRyRzserrorR|R}sinfosdebug(8R5RRRtINVALID_FAMILYRPRRQtMISSING_FAMILYR0RRR RURRRRSRTRRRt check_addresst INVALID_ADDRROt check_mact INVALID_MACRt INVALID_IPSETRR&R=tINVALID_SERVICERt check_portR't INVALID_PORTR(tINVALID_PROTOCOLRt checkProtocolR)tINVALID_ICMPTYPERR+R,tcheck_single_addressRR.tINVALID_LOG_LEVELR/R7R R RtINVALID_AUDIT_TYPER(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR7 s! $$$ $*$!*! *$$     cCsd}|jr#|d|j7}n|jr@|d|j7}n|jr]|d|j7}n|jrz|d|j7}n|jr|d|j7}n|jr|d|j7}n|jr|d|j7}ntjrtj |S|S(NRbs family="%s"s %s( R5RPRQRRRSRTRURtPY2tu2b(RR!((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s        N(R#R$RR RaRVR7R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s   N(t__all__tfirewallRtfirewall.core.ipsetRtfirewall.core.baseRRtfirewall.errorsRtobjectRRRRRRRRRR R R R R RRRR(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyts8       1PK[Y++.site-packages/firewall/core/fw_transaction.pycnu[ c`c@sdZddgZddlmZddlmZddlmZddlm Z de fd YZ de fd YZ de fd YZ d S( s!Transaction classes for firewalldtFirewallTransactiontFirewallZoneTransactioni(tlog(terrors(t FirewallError(tLastUpdatedOrderedDicttSimpleFirewallTransactioncBseZdZdZdZdZdZdZdZdZ dZ d Z ddd Z d Zd Zd ZRS(s>Base class for FirewallTransaction and FirewallZoneTransactioncCs1||_i|_g|_g|_g|_dS(N(tfwtrulest pre_funcst post_funcst fail_funcs(tselfR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt__init__"s     cCs&|jj|j2|j2|j2dS(N(RtclearR R R (R ((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR)s cCs#|jj|jgj|dS(N(Rt setdefaulttnametappend(R tbackendtrule((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_rule/scCs%x|D]}|j||qWdS(N(R(R RRR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_rules2s cCs&|j|jko%||j|jkS(N(RR(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt query_rule6scCsF|j|jkrB||j|jkrB|j|jj|ndS(N(RRtremove(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_rule9s(cGs|jj||fdS(N(R R(R tfunctargs((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_pre=scGs|jj||fdS(N(R R(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_post@scGs|jj||fdS(N(R R(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_failCscCstjdt||df|dkr5i}n|dkrJg}n|sx|jD]R}xIt|j|D]4}|j|gj|jj |j |qtWqZWn4x1|jD]&}|j|gj |j|qW||fS(Ns%s.prepare(%s, %s)s...( Rtdebug4ttypetNoneRtreversedRRRtget_backend_by_namet reverse_ruletextend(R tenableRtmodulest backend_nameR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytprepareFs     '$cCs1tjdt||f|j|\}}|jt}d}g}xe|D]]}y|jj|||Wn,tk r}t }|}tj |qUX|j |qUW|s|jj ||} | r| \} }| rtj |qqn|r#i} xY|D]Q}g| |t||D],} | |j |jj|j| q3WqWxL| D]D}y|jj|| |Wqntk r}tj |qnXqnWxU|jD]J\} }y| |Wqtk r }tj d| ||fqXqWttj|n|jdS(Ns%s.execute(%s)ts#Calling fail func %s(%s) failed: %s(RRRR(tpretFalseRRt ExceptiontTrueterrorRthandle_modulestdebug1R!R"R#R RRtCOMMAND_FAILEDtpost(R R%RR&R.terrorMsgtdoneR'tmsgt module_returntstatust undo_rulesRRR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytexecuteZsP      $  cCsstjdt|xU|jD]J\}}y||Wq!tk rj}tjd|||fq!Xq!WdS(Ns%s.pre()s"Calling pre func %s(%s) failed: %s(RRRR R,R.(R RRR5((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR*s cCsstjdt|xU|jD]J\}}y||Wq!tk rj}tjd|||fq!Xq!WdS(Ns %s.post()s#Calling post func %s(%s) failed: %s(RRRR R,R.(R RRR5((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR2s N(t__name__t __module__t__doc__R RRRRRRRRR R(R9R*R2(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs          = cBsJeZdZdZdZdZdddZdZdZ RS(s<General FirewallTransaction, contains also zone transactionscCs&tt|j|t|_dS(N(tsuperRR Rtzone_transactions(R R((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR scCs$tt|j|jjdS(N(R=RRR>(R ((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRscCs9||jkr.t|j|||j|RR(R tzone((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytzone_transactionscCstjdt||dftt|j|||\}}x|jD]}yR|j|j||x4|j|jD]"}||kr|j|qqWWqNt k r}tj dt |qNXqNW||fS(Ns%s.prepare(%s, %s)s...s1Failed to prepare transaction rules for zone '%s'( RRRR=RR(R>R&RRR.tstr(R R%RR&R?tmoduleR5((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR(s   cCsStjdt|tt|jx"|jD]}|j|jq4WdS(Ns%s.pre()(RRRR=RR*R>(R R?((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR*scCsStjdt|tt|jx"|jD]}|j|jq4WdS(Ns %s.post()(RRRR=RR2R>(R R?((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR2sN( R:R;R<R RR@R R(R*R2(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs    cBseZdZd dZdZd d dZdZdZdZ dZ dZ d Z d Z d Zd ZRS(s;Zone transaction with additional chain and module interfacecCs>tt|j|||_||_g|_g|_dS(N(R=RR R?tfw_transactiontchainsR&(R RR?RC((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR s    cCs|jr~tt|jjx}|jjjD]E}tt|jj|j|jj|j2|jj|j2q2Wn!tt|j|j2|j2dS(N( RCR=RRR>tkeysRRDR&(R R?((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs cCs~tjdt||dftt|j|||\}}x-|jD]"}||krN|j|qNqNW||fS(Ns%s.prepare(%s, %s)s...(RRRR=RR(R&R(R R%RR&RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR(s  cCs6|jr|jj|ntt|j|dS(N(RCR9R=R(R R%((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR9s cCsT||f}||jkrP|jjj|jt|g||jj|ndS(N(RDRR?tgen_chain_rulesR-R(R ttabletchaint table_chain((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_chains "cCs2||f}||jkr.|jj|ndS(N(RDR(R RGRHRI((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_chains cCs?x8|D]0}||jkr|j|d|dqqWdS(Nii(RDRJ(R RDRI((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_chainss cCs7x0|D](}||jkr|jj|qqWdS(N(RDR(R RDRI((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_chains s cCs&||jkr"|jj|ndS(N(R&R(R RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_module%scCs&||jkr"|jj|ndS(N(R&R(R RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_module)scCs"x|D]}|j|qWdS(N(RN(R R&RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_modules-s cCs"x|D]}|j|qWdS(N(RO(R R&RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytremove_modules1s N(R:R;R<R R RR(R9RJRKRLRMRNRORPRQ(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs         N(R<t__all__tfirewall.core.loggerRtfirewallRtfirewall.errorsRtfirewall.fw_typesRtobjectRRR(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyts 5PK[Ы99(site-packages/firewall/core/nftables.pycnu[ c`c@s~ddlZddlZddlmZmZddlmZddlm Z ddl m Z m Z m Z mZmZddlmZddlmZmZmZmZmZmZddlmZmZmZmZd Zd Ziid d efd 6d6id defd 6d6id defd 6ddefd6d6iddefd6ddefd6d6Z iid6id6id6Z!ii"dd d!dd"d#gd$6dd d!gd!6dd d%gd%6dd d&gd&6dd d!dd"d'gd(6dd d!dd"d)gd*6dd d!dd"d+gd,6dd d-dd"d.gd/6dd d!dd"d0gd16dd d!dd"d.gd26dd d3dd"d.gd46dd d!dd"d5gd66dd d-dd"d7gd86dd d!dd"d9gd:6dd d!dd"d7gd;6dd d3gd36dd d!dd"d<gd=6dd d!dd"d>gd?6dd d!dd"d@gdA6dd d-gd-6dd d3dd"d.gdB6dd dCgdC6dd dDgdD6dd dEgdE6dd d!dd"dFgdG6dd dHgdH6dd dIgdI6dd dJgdJ6dd d-dd"d<gdK6dd d!dd"dLgdM6dd d-dd"d@gdN6dd d!dd"dOgdP6dd dHdd"d.gdQ6dd dHdd"d7gdR6dS6idTd d!dTd"d<gdU6dTd d3dTd"d7gdV6dTd d!dTd"d@gdW6dTd d!dTd"d.gd$6dTd d!gd!6dTd d%gd%6dTd d&gd&6dTd d!dTd"dFgdX6dTd dYgdZ6dTd d[gd\6dTd d!dTd"d7gd]6dTd d^gd^6dTd d3gd36dTd d!dTd"d'gd=6dTd d_gd-6dTd d!dTd"d9gd`6dTd dagdC6dTd dbgdD6dTd dHgdH6dTd dHdTd"d.gdQ6dTd dHdTd"d7gdR6dTd d3dTd"d.gdc6dTd d3dTd"d@gdd6de6Z"dfe#fdgYZ$dS(hiN(t SHORTCUTStDEFAULT_ZONE_TARGET(trunProg(tlog(t splitArgst check_mactportStrtcheck_single_addresst check_address(tconfig(t FirewallErrort UNKNOWN_ERRORt INVALID_RULEtINVALID_ICMPTYPEt INVALID_TYPEt INVALID_ENTRY(t Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_Markt firewalldi t preroutingit PREROUTINGtrawijtmangleit postroutingidt POSTROUTINGtnattinputitINPUTtforwardtFORWARDtfiltertinettiptip6ticmpttypesdestination-unreachabletcodet13scommunication-prohibiteds echo-replys echo-requestt4sfragmentation-neededt14shost-precedence-violationt10shost-prohibitedtredirectt1s host-redirectt7s host-unknownshost-unreachablesparameter-problems ip-header-badt8snetwork-prohibitedt0snetwork-redirectt6snetwork-unknownsnetwork-unreachablet3sport-unreachablet15sprecedence-cutofft2sprotocol-unreachablesrequired-option-missingsrouter-advertisementsrouter-solicitations source-quencht5ssource-route-faileds time-exceededstimestamp-replystimestamp-requeststos-host-redirectt12stos-host-unreachablestos-network-redirectt11stos-network-unreachablesttl-zero-during-reassemblysttl-zero-during-transittipv4ticmpv6saddress-unreachables bad-headers beyond-scopes failed-policysnd-neighbor-advertsneighbour-advertisementsnd-neighbor-solicitsneighbour-solicitationsno-routespacket-too-bigs nd-redirects reject-routesnd-router-advertsnd-router-solicitsunknown-header-typesunknown-optiontipv6tnftablescBseZdZeZdZdZdZdZdZ dZ dZ dZ d3d Zd Zd Zd Zd ZddZdZeddZddZddZdZdZdZdZdZdZdZdZ d3d3dZ!d3d3dZ"d3d3dZ#d Z$d3d!Z%d3d"Z&d#Z'd3d$Z(d%Z)d3d&Z*d'Z+ed(Z,d)Z-d*Z.d+Z/d3d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6RS(4R:cCsK||_tjd|_|jg|_i|_i|_i|_dS(Ntnft( t_fwR tCOMMANDSt_commandt fill_existstavailable_tablestrule_to_handletrule_ref_counttzone_source_index_cache(tselftfw((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt__init__s     cCs%tjj|j|_t|_dS(N(tostpathtexistsR>tcommand_existstFalsetrestore_command_exists(RD((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR?sc Csy?|jd}|j||j|}||df}WnLtk ry&|jd}|j|d}Wqtk rdSXnX|d}|r| r||kr|||kr||j|qn|r||krg||sitinsertitaddtindexs%d( RRtpopt ValueErrortNonetremovetappendtsortR<t_allow_zone_driftingtlenRP( RDtrule_addtruleRCtitzonet zone_sourcetfamilyRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_run_replace_zone_sourcesD                 c Csddg}|}|ddkrs|ddkrs|}d|dRUtTruetintt ExceptionR R RStjoinRKRBR Rtdebug2t __class__tcopytdeepcopyRCRaRARTRRRZtstrip( RDtargstnft_optst_argst _args_testtstatustoutputtrule_keyR[RCt _args_strtstrtoffset((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt__runs|           #!     cCsAy|j|}Wntk r'tSX||||d+tSdS(Ni(RRRTRKRi(RDR\tpatternt replacementR]((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt _rule_replace,s  cCs|}d|d<|S(NRbi((RDRrtret_args((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt reverse_rule5s cCsttddS(Nsnot implemented(R R (RDtrulest log_denied((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_rules:sc Csd}d|ks*d|ks*d|kr3d}n-d|ksWd|ksWd|kr`d}n|j|dd d |d d g|j|d dddgy|jd}Wntk rnDX|dkrdS|dkrd|g|||d+n |j||j|S(NticmpxR7R"R$R9R#R8s %%REJECT%%trejecttwithR%sadmin-prohibiteds%%ICMP%%tmetatl4protos{icmp, icmpv6}s %%LOGTYPE%%toffRetunicastt broadcastt multicasttpkttypei(RRR(RRRRTRSt_nftables__run(RDR\Rt icmp_keywordR]((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytset_ruleCs$$ $      cCs|r |gStjS(N(tIPTABLES_TO_NFT_HOOKtkeys(RDRc((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytget_available_tablesbscCsYi|_i|_i|_g}x1tjD]#}|jdd|dtgq.W|S(NRbRcs%s(RARBRCt OUR_CHAINSRRWt TABLE_NAME(RDRR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_flush_rulesfs   !cCstdd}g}|dkr|jddd|gxddgD]:}d |d ||d td f}|jt|qFWn5|d kr|jddd|gn ttd|S(Nt_t policy_droptDROPRQRcR!RRwsMadd chain inet %s %s_%s '{ type filter hook %s priority %d ; policy drop ; }'RiitACCEPTRbsnot implemented(RRWtNFT_HOOK_OFFSETRR R (RDtpolicyt table_nameRthookt _add_chain((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_set_policy_rulesps   cCsAt}x+tjD]}|jt|jqWt|S(N(tsettICMP_TYPES_FRAGMENTRtupdateRd(RDt supportedtipv((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytsupported_icmp_typess cCsAg}x+tjD]}|jd|tfqWtt|S(Nsadd table %s %s(RRRWRtmapR(RDtdefault_tablesR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_default_tablessRc Csg}ttddadd rule inet %s filter_%s ct state established,related acceptRs,add rule inet %s filter_%s iifname lo acceptsadd chain inet %s filter_%s_%ss,add rule inet %s filter_%s jump filter_%s_%sRs_add rule inet %s filter_%s ct state invalid %%%%LOGTYPE%%%% log prefix '"STATE_INVALID_DROP: "'s0add rule inet %s filter_%s ct state invalid dropsHadd rule inet %s filter_%s %%%%LOGTYPE%%%% log prefix '"FINAL_REJECT: "'sBadd rule inet %s filter_%s reject with icmpx type admin-prohibiteds$add chain inet %s filter_%s_IN_ZONESRtINtOUTs!add chain inet %s filter_%s_%s_%ss/add rule inet %s filter_%s jump filter_%s_%s_%stINPUT_ZONES_SOURCEt INPUT_ZONEStFORWARD_IN_ZONES_SOURCEtFORWARD_IN_ZONEStFORWARD_OUT_ZONES_SOURCEtFORWARD_OUT_ZONES( RRRRRWRR<RYRRR(RDRt default_rulestchaintdispatch_suffixR`t direction((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_default_ruless (0 (0  ( 4 (!  ((  cCsY|dkrdddgS|dkr,dgS|dkrBddgS|d krUdgSiS( NR Rt FORWARD_INt FORWARD_OUTRRRRR((RDRc((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytget_zone_table_chainss      R!c Cs|dkrr|dkrrg}|j|j||||||d|j|j||||||d|Sidd6dd6dd 6dd 6dd 6dd 6|} |t|d dkr|t|d  d}ntjdt|d|} d} |r3| r3dd|dtd||fdg} ne|r_dd|dtd||fg} n9dd|dtd||fg} |s| dg7} n|dkr| | d|| fg7} n(| | d|d| d|| fg7} | gS(NRR!R"R#tiifnameRtoifnameRRRRtOUTPUTit+t*RR^tgotoRPR\s%ss %s_%s_ZONESs%%ZONE_INTERFACE%%RQRbs%s_%ss"(textendt!build_zone_source_interface_rulesRZRtformatRR( RDtenableR^t interfaceRcRRWR`RtoptttargettactionR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyRs>  &# (cCsK|dkr|dkrg}|jdrI|j|td}nd}td|svt|sv|dkr|j|j|||||dntd|st|s|dkr|j|j|||||dn|Sidt6d t 6|} id d 6d d 6d d6d d6d d6d d6|} |j j r\d||f} nd||f} t j dt|d|} d} |jdr|td}|j|}d|}nCt|r| d krdSd}ntd|rd}nd}| d|dt| d||| || d|| fg }|gS(NRR!sipset:R7R"R9R#RPRbtsaddrRtdaddrRRRRRs%s_%s_ZONES_SOURCEs %s_%s_ZONESRR^Rt@RetetherR\s%ss%%ZONE_SOURCE%%s%s_%s(t startswitht_set_get_familyRZRURRRtbuild_zone_source_address_rulesRiRKR<RYRRRR(RDRR^taddressRcRR`Rt ipset_familytadd_delRtzone_dispatch_chainRRtipsett rule_familyR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR$sT''      c Cs.|dkr`|dkr`g}|j|j|||d|j|j|||d|Stjdt|d|}t||jt|d|d|d |gg}|jd d|d t d ||fg|jd d|d t d ||fg|jd d|d t d||fg|jd d|d t d||fg|jd d|d t d ||fdd ||fg|jd d|d t d ||fdd||fg|jd d|d t d ||fdd||fg|j j j |j }|j jdkr|dkr|d kr|d!kr|}|dkrud}n|jd d|d t d ||fdddd||fg qqn|dkr*|d"kr*|d#kr*|jd d|d t d ||f|dkr|jndgn|S($NRR!R"R#RR^s%s_logs%s_denys%s_allowRQs%ss%s_%ss %s_%s_logs %s_%s_denys %s_%s_allowR\tjumpRR RRRRtREJECTs %%REJECT%%Rs %%LOGTYPE%%Rtprefixs"filter_%s_%s: "R(sINPUTs FORWARD_INs FORWARD_OUTsOUTPUT(Rs %%REJECT%%sDROP(sACCEPTRs %%REJECT%%sDROP(sINPUTs FORWARD_INs FORWARD_OUTsOUTPUT(Rtbuild_zone_chain_rulesRRRRRRRWRR<R^t_zonesRtget_log_deniedtlower( RDR^RcRR`Rt_zoneRt log_suffix((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR^s^            %cCsiddddgd6ddddgd6ddddgd6ddddgd 6dddd gd 6dddd gd 6dd dd gd6dd dd gd6ddddgd6ddddgd6ddddgd6ddddgd6ddddgd6dd ddgd6ddddgd6ddddgd6ddddgd6dd ddgd6dd ddgd 6dd dd!gd"6dd dd!gd!6dd#d$gd%6dd#d$gd&6}||S('NRR$R%shost-prohibitedsicmp-host-prohibiteds host-prohibsnet-prohibitedsicmp-net-prohibiteds net-prohibsadmin-prohibitedsicmp-admin-prohibiteds admin-prohibR8sicmp6-adm-prohibitedsadm-prohibitedsnet-unreachablesicmp-net-unreachables net-unreachshost-unreachablesicmp-host-unreachables host-unreachsport-unreachablesicmp-port-unreachablesicmp6-port-unreachableRs port-unreachsprot-unreachablesicmp-proto-unreachables proto-unreachsaddr-unreachablesicmp6-addr-unreachables addr-unreachsno-routesicmp6-no-routettcptresets tcp-resetstcp-rst((RDt reject_typetfrags((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_reject_types_fragments2cCs|s gSidd6dd6dd6dd6}y|jjd }Wn tk rdttd nXd d |jd |!d ||j|dgS(Ntsecondtstminutetmthourthtdaytdt/sExpected '/' in limittlimittrateii(tvalueRRRTR R (RDRt rich_to_nftR]((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_limit_fragments  cCs|js gSidt6dt6|}|dddtd||fg}||dg7}|jjr|dd |jjg7}n|jjr|d d |jjg7}n||j|jj7}|S( NRQRbR\R!s%ss %s_%s_logRRs"%s"tlevel(RRiRKRRRRR(RDt rich_ruleRRcRt rule_fragmentRR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_logs   cCs||js gSidt6dt6|}|dddtd||fg}||ddd g7}||j|jj7}|S( NRQRbR\R!s%ss %s_%s_logRRtaudit(RRiRKRRR(RDRRRcRRRR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_audits c Cs|js gSidt6dt6|}t|jtkrVd||f}dg} nt|jtkrd||f}dg} |jjr^| |j|jj7} q^nt|jtkrd||f}dg} n~t|jtkrBt j dt d d |}d }d||f}d d d|jj g} nt tdt|j|dddt|g} | |7} | |j|jj7} | | 7} | S(NRQRbs %s_%s_allowtaccepts %s_%s_denyRtdropRRR^RRtmarkRsUnknown action %sR\R!s%s(RRiRKR%RRRRRRRRRR R RRR( RDR^RRRcRRRRt rule_actionR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_actions6        cCsS|s gS|dkr#dddgS|dkr<dddgSttd|dS(NR7RtnfprotoR9sInvalid family(R R (RDt rich_family((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_family_fragments    cCsx|s gSg}td|jr2|dg7}n |dg7}|jra|dd|jg7}n|d|jg7}|S(NR7R"R#Rs!=(Rtaddrtinvert(RDt rich_destR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_destination_fragments  cCsJ|s gSg}|jrtd|jr;|dg7}n |dg7}|jrj|dd|jg7}qF|d|jg7}nt|dr|jr|jr|ddd|jg7}qF|dd|jg7}npt|drF|jrF|j|j}|jr)||ddd |jg7}qF||dd |jg7}n|S( NR7R"R#Rs!=tmacRRR(RRRthasattrRRR(RDt rich_sourceRR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_source_fragment,s(      c Csidt6dt6|}d}tjdtdd|} g} |r_| |j|j7} n|rtd|r| dg7} n | d g7} | d |g7} n|r| |j|j 7} | |j |j 7} n| |d d t |d g7} | st |jtkr+| dddg7} ng} |r| j|j|||| | | j|j|||| | | j|j||||| | n5| j|ddd td|| fg| dg| S(NRQRbR RRR^R7R"R#Rtdports%st-tcttstates new,untrackedR\R!s %s_%s_allowR(RiRKRRRRR`RRt destinationR tsourceRR%RRRWRRRR( RDRR^tprototportRRRRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_ports_rulesIs2  ""(/c Csidt6dt6|}d}tjdtdd|}g} |r_| |j|j7} n|rtd|r| dg7} n | d g7} | d |g7} n|r| |j|j7} | |j|j 7} | |j |j 7} nd d |g} | st |j tkr0| d ddg7} ng} |r| j|j||||| | j|j||||| | j|j|||||| n/| j|dddtd|g| dg| S(NRQRbR RRR^R7R"R#RRRR R s new,untrackedR\R!s%ssfilter_%s_allowR(RiRKRRRRR`RRRR RR%RRRWRRRR( RDRR^tprotocolRRRRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_protocol_rulesjs4 ""()c Csidt6dt6|}d}tjdtdd|} g} |r_| |j|j7} n|rtd|r| dg7} n | d g7} | d |g7} n|r| |j|j 7} | |j |j 7} n| |d d t |d g7} | st |jtkr+| dddg7} ng} |r| j|j|||| | | j|j|||| | | j|j||||| | n5| j|ddd td|| fg| dg| S(NRQRbR RRR^R7R"R#Rtsports%sR R R s new,untrackedR\R!s %s_%s_allowR(RiRKRRRRR`RRRR RRR%RRRWRRRR( RDRR^RRRRRRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_source_ports_ruless2  ""(/c Csidt6dt6|}tjdtdd|} |dddtd | g} |rtd |rv| d g7} n | d g7} | d |g7} n| |ddt|dg7} | dddd||fg7} dddtd||fddd|d|ddg } | | gS(NRQRbRRR^R\R!s%ssfilter_%s_allowR7R"R#RR R R thelperRs"helper-%s-%s"s helper-%s-%st{R%s"%s"Rt;t}(RiRKRRRRRR( RDRR^RRRt helper_nametmodule_short_nameRRR\t helper_object((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_helper_ports_ruless"       cCsidt6dt6|}tjdtdd|}g}|ro||j|j7}||j|j7}n|d|dt d|g|d d d d ggS( NRQRbRRR^R\s%ss nat_%s_allowRs!=tlot masquerade( RiRKRRRRRR RR(RDRR^R`RRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt _build_zone_masquerade_nat_ruless cCsg}|rd|jr$|jdksB|jrdtd|jjrd|j|j||d|n}|r|jr|jdks|jrtd|jjr|j|j||d|n|j|j||d|idt6dt6|}tj dt dd |}g}|rP||j |j 7}||j |j7}n|j|d d d td |g|ddddg|S(NR9R#R7R"RQRbRRR^R\R!s%ssfilter_%s_allowR R s new,untrackedR(R`RRRRR!RiRKRRRRRR RWR(RDRR^RRRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_masquerade_ruless$"" 2c Csidt6dt6|}tjdtdd|} g} |rV| dd|g7} n| ddg7} |r|d kr| d t|d g7} n|d |d td| dd|g|| gS(NRQRbRRR^tdnatttoR+Res:%sR R\s%ss nat_%s_allowRR(RiRKRRRRR( RDRR^Rt mark_fragmentttoaddrttoportR`RRt dnat_fragment((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt"_build_zone_forward_port_nat_ruless c Csaidt6dt6|} d|} dd| g} tjdtdd|} g}| r||j| j7}||j| j7}||j | j 7}ng}|j | d d d t d | g||d |ddd| g| rC| jr| jdks|rCt d|rC|j|j|||| ||dn| r| jra| jdksv|rt d|r|j|j|||| ||dnh|rt d|r|j|j|||| ||dn(|j|j|||| ||dtjdt|d|} |j | d d d t d| dddg| dg|S(NRQRbs0x%xRRRRR^R\R!s%ssmangle_%s_allowR RR9R#R7R"sfilter_%s_allowR R s new,untrackedR(RiRKRRRRR`RRR RRWRRRR)(RDRR^t filter_chainRRR'R&tmark_idRRtmark_strR%RRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_forward_port_ruless@   2cCs<|t|krt||Sttd||jfdS(Ns"ICMP type '%s' not supported by %s(RR R tname(RDRt icmp_type((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_icmp_types_to_nft_fragment/s c Csd}idt6dt6|}|r9|jr9|j}n\|jrg}d|jkrg|jdnd|jkr|jdqn ddg}g}x/|D]'} xddgD]} tjdt| d |} |jj j |rd || f} d } nd || f} d } g}|rl||j |j 7}||j |j7}||j|j7}n||j| |j7}|r8|j|j|||| ||j|j|||| ||jr|j|j||||| |q|j|dddtd || fg|d gq|jjdkr| d kr|j|dddt| g|dddd||fgn|j|dddt| g|| gqWqW|S(NR RQRbR7R9RRRR^s %s_%s_allowRs %s_%s_denys %%REJECT%%R\R!s%sRs %%LOGTYPE%%RRs"%s_%s_ICMP_BLOCK: "(RiRKtipvsRRWRRRR<R^tquery_icmp_block_inversionRR`RR RR0R.RRRRRR(RDRR^tictRRcRR1RRRRt final_chaint final_targetR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_icmp_block_rules6sT      "" (2! -c Csd}g}xddgD]}tjdt|d|}djddtd ||fd d ||fg}|j|}|jjj|rd } nd } |rddddtd ||fd|g} n#ddddtd ||fg} | d| g7} |j | |jjj|r|jj dkr|rpddddtd ||fd|g} n#ddddtd ||fg} | ddddd||fg7} |j | qqqW|S(NR RRRR^RgR!s%ss%s_%sRs %s_%s_allows %%REJECT%%RRQR\RfRbs%%ICMP%%Rs %%LOGTYPE%%RRs"%s_%s_ICMP_BLOCK: "( RRRRlRRAR<R^R2RWR( RDRR^RcRRRRxt rule_handlet ibi_targetR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt%build_zone_icmp_block_inversion_rulesls<     cCsg}|jddddtdddd d d d d dddg|dkr|jddddtdddd d d d d dddddgn|jddddtdddddg |S(NRPR\R!s%ssraw_%sRRRR9tfibRt.tiiftoiftmissingRRRRs"rpfilter_DROP: "R8R%s){ nd-router-advert, nd-neighbor-solicit }Rtraw_PREROUTINGR?R?(RWR(RDRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_rpfilter_ruless   cCsd}tjdtdd|}g}||j|j7}||j|j7}||j|j7}g}|j |j ||||||j |j ||||||j |j |||||||S(NR RRR^( RRRRR`RRR RRWRRR(RDRR^RRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt(build_zone_rich_source_destination_ruless ""%cCs|dkrtStS(NR7R9teb(sipv4sipv6RB(RiRK(RDR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytis_ipv_supporteds cCs;idd6dd6}i ||gd6||ddgd6||dd ||gd 6||dd ||gd 6||d gd 6||gd6||ddgd6||dd ||gd6||dd ||gd6||dgd6dgd6}ydg||dgSWn$tk r6ttd|nXdS(Nt ipv4_addrR7t ipv6_addrR9shash:ips . inet_protos. inet_services hash:ip,ports. inet_service .shash:ip,port,ipshash:ip,port,nets. marks hash:ip,markshash:nets hash:net,portshash:net,port,ipshash:net,port,nets. ifnameshash:net,ifacet ether_addrshash:macR%Rs!ipset type name '%s' is not valid(tKeyErrorR R(RDRR%tipv_addrttypes((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_set_type_fragments(   c Cs)|r+d|kr+|ddkr+d}nd}|dg}||j||7}|rd|kr|d|dddg7}nd |kr|d |d dg7}qn| sd|krd |kr|d d dg7}n|dg7}x4dddgD]#}|jdd|tg|qWdS(NR`tinet6R9R7RttimeoutRRtmaxelemtsizet,tflagstintervalRR!R"R#RQR(RJRR(RDR.R%toptionsRtcmdR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_creates "      cCs:x3dddgD]"}|jdd|t|gqWdS(NR!R"R#RbR(RR(RDR.R`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_destroyscCs)|jjj|jddjd}|jd}t|t|krdttdng}xtt|D]}||dkry||jd}Wn(t k r|dd||g7}qX|||| d|||dg7}n|j |||j dq}W|d S( Nt:iROs+Number of values does not match ipset type.RRR;i( R<Rtget_typetsplitRZR RtrangeRRRTRW(RDR.tentryt type_formatt entry_tokenstfragmentR]RR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_set_entry_fragments +  *cCsTxMdddgD]<}|jdd|t|dg|j||dgqWdS(NR!R"R#RQtelementRR(RRR^(RDR.RZR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytset_addscCsTxMdddgD]<}|jdd|t|dg|j||dgqWdS(NR!R"R#RbR_RR(RRR^(RDR.RZR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_deletescCs:x3dddgD]"}|jdd|t|gqWdS(NR!R"R#tflushR(RR(RDR.R`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_flushscCsk|jjj|}|jdkr-d}n:|jrad|jkra|jddkrad}nd}|S(Nshash:macRR`RKR#R"(R<Rt get_ipsetR%RR(RDR.RR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR!s  N(7t__name__t __module__R.Ritzones_supportedRFR?RaRRRRRRURRRRRRRRKRRRRRRRRRRR RRRRR!R"R)R-R0R6R9R@RARCRJRTRUR^R`RaRcR(((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR:sf  - U      T  + 9 @   "  !#!     ,  6 2          (%tos.pathRGRotfirewall.core.baseRRtfirewall.core.progRtfirewall.core.loggerRtfirewall.functionsRRRRRtfirewallR tfirewall.errorsR R R R RRtfirewall.core.richRRRRRRRRRtobjectR:(((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyts  (."   PK[n%?-*site-packages/firewall/core/fw_service.pycnu[ c`c@sCdgZddlmZddlmZdefdYZdS(tFirewallServicei(terrors(t FirewallErrorcBsPeZdZdZdZdZdZdZdZdZ RS(cCs||_i|_dS(N(t_fwt _services(tselftfw((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt__init__s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt__repr__ scCs|jjdS(N(Rtclear(R((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pytcleanup#scCst|jjS(N(tsortedRtkeys(R((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt get_services(scCs(||jkr$ttj|ndS(N(RRRtINVALID_SERVICE(Rtservice((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt check_service+scCs|j||j|S(N(RR(RR((s</usr/lib/python2.7/site-packages/firewall/core/fw_service.pyt get_service/s cCs||j|js PK['^ $site-packages/firewall/core/icmp.pyonu[ c`c@sddddgZi"dd6dd6dd6d d 6d d 6d d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d#d$6d%d&6d'd(6d)d*6d+d,6d-d.6d/d06d/d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6ZidFdG6dHd 6dIdJ6dKd6dLdM6dd76d d96d%dN6dOdP6dQdR6dSd06dSd16dTd6dTd6dUd56dVd36dWdX6dWdY6dZd[6dZd\6d]d^6Zd_Zd`ZdaZdbZdcS(dt ICMP_TYPESt ICMPV6_TYPEStcheck_icmp_typetcheck_icmpv6_types0/0s echo-replytpongs3/0snetwork-unreachables3/1shost-unreachables3/2sprotocol-unreachables3/3sport-unreachables3/4sfragmentation-neededs3/5ssource-route-faileds3/6snetwork-unknowns3/7s host-unknowns3/9snetwork-prohibiteds3/10shost-prohibiteds3/11sTOS-network-unreachables3/12sTOS-host-unreachables3/13scommunication-prohibiteds3/14shost-precedence-violations3/15sprecedence-cutoffs4/0s source-quenchs5/0snetwork-redirects5/1s host-redirects5/2sTOS-network-redirects5/3sTOS-host-redirects8/0s echo-requesttpings9/0srouter-advertisements10/0srouter-solicitations11/0sttl-zero-during-transits11/1sttl-zero-during-reassemblys12/0s ip-header-bads12/1srequired-option-missings13/0stimestamp-requests14/0stimestamp-replys17/0saddress-mask-requests18/0saddress-mask-replys1/0sno-routes1/1s1/3saddress-unreachables1/4s2/0spacket-too-bigs bad-headers4/1sunknown-header-types4/2sunknown-options128/0s129/0s133/0s134/0s135/0sneighbour-solicitationsneigbour-solicitations136/0sneighbour-advertisementsneigbour-advertisements137/0tredirectcCs|tkrtStS(N(RtTruetFalse(t_name((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pytcheck_icmp_nameVs cCs|tjkrtStS(N(RtvaluesRR(t_type((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pyR[scCs|tkrtStS(N(RRR(R ((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pytcheck_icmpv6_name`s cCs|tjkrtStS(N(RR RR(R ((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pyResN(t__all__RRR RR R(((s6/usr/lib/python2.7/site-packages/firewall/core/icmp.pyts|      PK[ө= (site-packages/firewall/core/__init__.pyonu[ c`c@sdS(N((((s:/usr/lib/python2.7/site-packages/firewall/core/__init__.pytsPK[1 *site-packages/firewall/core/fw_policies.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "FirewallPolicies" ] from firewall import config from firewall.core.logger import log from firewall.core.io.lockdown_whitelist import LockdownWhitelist from firewall import errors from firewall.errors import FirewallError class FirewallPolicies(object): def __init__(self): self._lockdown = False self.lockdown_whitelist = LockdownWhitelist(config.LOCKDOWN_WHITELIST) def __repr__(self): return '%s(%r, %r)' % (self.__class__, self._lockdown, self.lockdown_whitelist) def cleanup(self): self._lockdown = False self.lockdown_whitelist.cleanup() # lockdown def access_check(self, key, value): if key == "context": log.debug2('Doing access check for context "%s"' % value) if self.lockdown_whitelist.match_context(value): log.debug3('context matches.') return True elif key == "uid": log.debug2('Doing access check for uid %d' % value) if self.lockdown_whitelist.match_uid(value): log.debug3('uid matches.') return True elif key == "user": log.debug2('Doing access check for user "%s"' % value) if self.lockdown_whitelist.match_user(value): log.debug3('user matches.') return True elif key == "command": log.debug2('Doing access check for command "%s"' % value) if self.lockdown_whitelist.match_command(value): log.debug3('command matches.') return True return False def enable_lockdown(self): if self._lockdown: raise FirewallError(errors.ALREADY_ENABLED, "enable_lockdown()") self._lockdown = True def disable_lockdown(self): if not self._lockdown: raise FirewallError(errors.NOT_ENABLED, "disable_lockdown()") self._lockdown = False def query_lockdown(self): return self._lockdown PK[8^^$site-packages/firewall/core/rich.pyonu[ c`c@sdddddddddd d d d d ddddgZddlmZddlmZddlmZddlmZddlm Z de fdYZ de fdYZ de fdYZ de fdYZdefdYZde fdYZde fdYZde fdYZde fd YZd e fd!YZd e fd"YZd e fd#YZd e fd$YZd e fd%YZdefd&YZde fd'YZde fd(YZde fd)YZd*S(+t Rich_SourcetRich_Destinationt Rich_Servicet Rich_Portt Rich_ProtocoltRich_MasqueradetRich_IcmpBlockt Rich_IcmpTypetRich_SourcePorttRich_ForwardPorttRich_Logt Rich_Auditt Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_Markt Rich_Limitt Rich_Rulei(t functions(tcheck_ipset_name(t REJECT_TYPES(terrors(t FirewallErrorcBseZedZdZRS(cCs||_|jdkr$d|_n||_|jdksK|jdkrWd|_n$|jdk r{|jj|_n||_|jdkrd|_n||_|jdkr|jdkr|jdkrttjdndS(Ntsno address, mac and ipset( taddrtNonetmactuppertipsettinvertRRt INVALID_RULE(tselfRRRR((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyt__init__$s       - cCsd|jrdnd}|jdk r7|d|jS|jdk rU|d|jS|jdk rs|d|jSttjddS(Ns source%s s NOTRs address="%s"smac="%s"s ipset="%s"sno address, mac and ipset(RRRRRRRR(Rtret((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyt__str__5s (t__name__t __module__tFalseR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR#s cBseZedZdZRS(cCs||_||_dS(N(RR(RRR((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR Bs cCs d|jrdnd|jfS(Nsdestination %saddress="%s"snot R(RR(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Fs(R#R$R%R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRAs cBseZdZdZRS(cCs ||_dS(N(tname(RR&((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR KscCs d|jS(Nsservice name="%s"(R&(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Ns(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRJs cBseZdZdZRS(cCs||_||_dS(N(tporttprotocol(RR'R(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR Rs cCsd|j|jfS(Nsport port="%s" protocol="%s"(R'R((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Vs(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRQs cBseZdZRS(cCsd|j|jfS(Ns#source-port port="%s" protocol="%s"(R'R((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"Zs (R#R$R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRYscBseZdZdZRS(cCs ||_dS(N(tvalue(RR)((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR _scCs d|jS(Nsprotocol value="%s"(R)(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"bs(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR^s cBseZdZdZRS(cCsdS(N((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR fscCsdS(Nt masquerade((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"is(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRes cBseZdZdZRS(cCs ||_dS(N(R&(RR&((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR mscCs d|jS(Nsicmp-block name="%s"(R&(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"ps(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRls cBseZdZdZRS(cCs ||_dS(N(R&(RR&((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR tscCs d|jS(Nsicmp-type name="%s"(R&(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"ws(R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRss cBseZdZdZRS(cCs^||_||_||_||_|jdkr?d|_n|jdkrZd|_ndS(NR(R'R(tto_portt to_addressR(RR'R(R+R,((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR {s     cCsRd|j|j|jdkr+d|jnd|jdkrJd|jndfS(Ns(forward-port port="%s" protocol="%s"%s%sRs to-port="%s"s to-addr="%s"(R'R(R+R,(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s (R#R$R R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR zs cBs#eZddddZdZRS(cCs||_||_||_dS(N(tprefixtleveltlimit(RR-R.R/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s  cCsSd|jrd|jnd|jr2d|jnd|jrKd|jndfS(Ns log%s%s%ss prefix="%s"Rs level="%s"s %s(R-R.R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"sN(R#R$RR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR scBseZddZdZRS(cCs ||_dS(N(R/(RR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR scCsd|jrd|jndS(Nsaudit%ss %sR(R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"sN(R#R$RR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cBseZddZdZRS(cCs ||_dS(N(R/(RR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR scCsd|jrd|jndS(Nsaccept%ss %sR(R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"sN(R#R$RR R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cBs)eZdddZdZdZRS(cCs||_||_dS(N(ttypeR/(Rt_typeR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cCs:d|jrd|jnd|jr2d|jndfS(Ns reject%s%ss type="%s"Rs %s(R0R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"scCs|jr{|s$ttjdn|dkr{|jt|kr{djt|}ttjd|j|fq{ndS(Ns9When using reject type you must specify also rule family.tipv4tipv6s, s%Wrong reject type %s. Use one of: %s.(R2R3(R0RRRRtjoin(Rtfamilyt valid_types((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pytchecks  N(R#R$RR R"R7(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cBseZdZRS(cCsd|jrd|jndS(Nsdrop%ss %sR(R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s(R#R$R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRscBs&eZddZdZdZRS(cCs||_||_dS(N(tsetR/(Rt_setR/((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s cCs'd|j|jrd|jndfS(Ns mark set=%s%ss %sR(R8R/(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s cCs|jdk r|j}nttjdd|kr|jd}t|dkrottj|ntj|d stj|d rttj|qn$tj|sttj|ndS(Ns no value sett/iii( R8RRRt INVALID_MARKtsplittlenRt checkUINT32(Rtxtsplits((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR7s  N(R#R$RR R"R7(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRs  cBs,eZdZdZdZdZRS(cCsu||_d|jkrq|jjd}t|dkrq|dd krqd|d |dd f|_qqndS( NR:iitsecondtminutethourtdays%s/%si(RARBRCRD(R)R<R=(RR)R@((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s  cCsd}d|jkr*|jjd}n| sCt|dkr[ttj|jn|\}}yt|}Wnttj|jnX|dks|dkrttj|jnd}|dkrd}n?|dkrd}n*|dkr d}n|dkr d}nd ||d krPttjd |jn|dkr|dkrttjd |jndS(NR:iitstmthtdi<ii'is %s too fasts %s too slow(RERFRGRHiiiQ(RR)R<R=RRt INVALID_LIMITtint(RR@tratetdurationtmult((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR7s6           cCs d|jS(Nslimit value="%s"(R)(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"scCsdS(NR((R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pytcommand s(R#R$R R7R"RN(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRs  " cBs;eZdddZdZdZdZdZRS(cCsw|dk rt||_n d|_d|_d|_d|_d|_d|_d|_|rs|j |ndS(N( RtstrR5tsourcet destinationtelementtlogtaudittactiont_import_from_string(RR5trule_str((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s        cCsg}xtj|D]}d|kr|jd}t|dks_|d s_|d rxttjd|n|ji|dd6|dd6q|ji|d6qW|jid d6|S( s Lexical analysis t=iiisinternal error in _lexer(): %st attr_namet attr_valueRRtEOL(Rt splitArgsR<R=RRRtappend(RRWttokenstrtattr((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyt_lexers ( &c Cs |sttjdnd|_d|_d|_d|_d|_d|_ d|_ |j |}|r|dj ddkrttjdni}g}d}x ||j ddko|dgks ||j d}||j d}||j d}|rA|d?kr|ttjd|q|n;|d@krf|dkrw|jrwttjd)q||dkr|jrttjd*q||dAkr|jrttjd+||jfq||d kr|jrttjd,q||d!kr,|j r,ttjd-q||dBkr||j r|ttjd.||j fq|nttjd/|t |dkr|t |d0nd1} | d1kr<| r|r|dkrttjd2q9ttjd3||fq d|kr,ttjd4||fq |jdnx| dkr|dkr|dCkryttjd7|n||_q |r|dkrd8} nd9||f} ttj| q |j|n| dkrs|dDkr|||n|d0}qW|j$dS(LNs empty ruleiRRR[truleRYRZR5taddressRRRR)R'R(sto-portsto-addrR&R-R.R0R8sbad attribute '%s'RPRQtservices icmp-blocks icmp-typeR*s forward-ports source-portRSRTtaccepttdroptrejecttmarkR/tnottNOTsmore than one 'source' elements#more than one 'destination' elementsFmore than one element. There cannot be both '%s' and '%s' in one rule.smore than one 'log' elementsmore than one 'audit' elementsOmore than one 'action' element. There cannot be both '%s' and '%s' in one rule.sunknown element %siRs0'family' outside of rule. Use 'rule family=...'.s:'%s' outside of any element. Use 'rule %s= ...'.s,'%s' outside of rule. Use 'rule ... %s ...'.R2R3sH'family' attribute cannot have '%s' value. Use 'ipv4' or 'ipv6' instead.sdwrong 'protocol' usage. Use either 'rule protocol value=...' or 'rule [forward-]port protocol=...'.sDattribute '%s' outside of any element. Use 'rule %s= ...'.sinvalid 'protocol' elementsinvalid 'service' elementsinvalid 'icmp-block' elementsinvalid 'icmp-type' elementsinvalid 'limit' element(sfamilyRcsmacsipsetsinvertsvaluesportsprotocolsto-portsto-addrsnamesprefixslevelstypesset(Rbssources destinationsprotocolRdsports icmp-blocks icmp-types masquerades forward-ports source-portslogsauditReRfRgsmarkslimitRiRjsEOL(sprotocolRdsports icmp-blocks icmp-types masquerades forward-ports source-port(ReRfRgsmark(sipv4sipv6(Rcsmacsipsetsinvert(RiRj(Rcsinvert(RiRj(sportsprotocol(sportsprotocolsto-portsto-addr(sportsprotocol(sprefixslevel(%RRRRR5RPRQRRRSRTRURatgetR=R]tTrueRR%tpoptclearRRRRRRRR RR R R RR RRR7( RRWR^tattrst in_elementstindexRRRYRZt in_elementterr_msg((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyRV.st       +  "%,               ?        $            $                 <      $       0                      $             cCs |jdk r6|jdkr6ttj|jn|jdkr|jdk rf|jjdk su|jdk rttjnt |j t krttjqn|j dkr|j dkrttj dn|jdkr|jdkrttj dqnt |j tt tgkr}|jdkr}|jdkr}|j dkr}ttj dq}n|jdk r|jjdk rL|jdkrttjn|jjdk rttj dn|jjdk r ttj dntj|j|jjsttjt|jjqq|jjdk r|jjdk rttj dntj|jjsttjt|jjqq|jjdk rt|jjsttjt|jjqqttj d n|jdk r|jdkrKttjn|jjdksytj|j|jj rttjt|jjqnt |j tkr|j jdkst|j jd kr>ttjt|j jq>n>t |j t krutj!|j j"sEttj#|j j"n|j j$dkr>ttj%|j j$q>nt |j t&krtj'|j j(s>ttj%|j j(q>nt |j tkr/|j dk rttj dn|jdk r>|jjdk r>ttj dq>nt |j tkr|j jdksnt|j jd krttj)t|j jn|j r>ttj dq>nt |j t*kr|j jdkst|j jd kr>ttj)t|j jq>n+t |j t krtj!|j j"sXttj#|j j"n|j j$dkrttj%|j j$n|j j+dkr|j j,dkrttj#|j j+n|j j+dkrtj!|j j+ rttj#|j j+n|j j,dkrPtj-|j|j j, rPttj|j j,n|jdkrqttjn|j dk r>ttj dq>nt |j t.kr tj!|j j"sttj#|j j"n|j j$d kr>ttj%|j j$q>n1|j dk r>ttj dt |j n|jdk r|jj/r|jj/d!krttj0|jj/n|jj1dk r|jj1j2qn|jdk r! t |j t3t4t5gkrttj6t |j n|jj1dk r! |jj1j2q! n|j dk r t |j t4kr[ |j j2|jn%t |j t7kr |j j2n|j j1dk r |j j1j2q ndS("NR2R3sno element, no actions%no element, no source, no destinationsno action, no log, no auditsaddress and macsaddress and ipsets mac and ipsetsinvalid sourceittcptudptsctptdccpsmasquerade and actionsmasquerade and mac sourcesicmp-block and actionRsforward-port and actionsUnknown element %stemergtalerttcritterrortwarningtnoticetinfotdebug(sipv4sipv6(RtRuRvRw(RtRuRvRw(RtRuRvRw(RxRyRzserrorR|R}sinfosdebug(8R5RRRtINVALID_FAMILYRPRRQtMISSING_FAMILYR0RRR RURRRRSRTRRRt check_addresst INVALID_ADDRROt check_mact INVALID_MACRt INVALID_IPSETRR&R=tINVALID_SERVICERt check_portR't INVALID_PORTR(tINVALID_PROTOCOLRt checkProtocolR)tINVALID_ICMPTYPERR+R,tcheck_single_addressRR.tINVALID_LOG_LEVELR/R7R R RtINVALID_AUDIT_TYPER(R((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR7 s! $$$ $*$!*! *$$     cCsd}|jr#|d|j7}n|jr@|d|j7}n|jr]|d|j7}n|jrz|d|j7}n|jr|d|j7}n|jr|d|j7}n|jr|d|j7}ntjrtj |S|S(NRbs family="%s"s %s( R5RPRQRRRSRTRURtPY2tu2b(RR!((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR"s        N(R#R$RR RaRVR7R"(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyR s   N(t__all__tfirewallRtfirewall.core.ipsetRtfirewall.core.baseRRtfirewall.errorsRtobjectRRRRRRRRRR R R R R RRRR(((s6/usr/lib/python2.7/site-packages/firewall/core/rich.pyts8       1PK[@@'site-packages/firewall/core/modules.pycnu[ c`c@sYdZdgZddlmZddlmZddlmZdefdYZ dS(smodules backendtmodulesi(trunProg(tlog(tCOMMANDScBsPeZdZdZdZdZdZdZdZdZ RS(cCstd|_td|_dS(Ntmodprobetrmmod(Rt _load_commandt_unload_command(tself((s9/usr/lib/python2.7/site-packages/firewall/core/modules.pyt__init__s cCs d|jS(Ns%s(t __class__(R((s9/usr/lib/python2.7/site-packages/firewall/core/modules.pyt__repr__$sc Csg}i}tdd}x|D]y}|s5Pn|j}|j}|j|d|ddkr|djdd ||ds  PK[|:vPvP(site-packages/firewall/core/fw_direct.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "FirewallDirect" ] from firewall.fw_types import LastUpdatedOrderedDict from firewall.core import ipXtables from firewall.core import ebtables from firewall.core.fw_transaction import FirewallTransaction from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class Firewall # ############################################################################ class FirewallDirect(object): def __init__(self, fw): self._fw = fw self.__init_vars() def __repr__(self): return '%s(%r, %r, %r)' % (self.__class__, self._chains, self._rules, self._rule_priority_positions) def __init_vars(self): self._chains = { } self._rules = { } self._rule_priority_positions = { } self._passthroughs = { } self._obj = None def cleanup(self): self.__init_vars() # transaction def new_transaction(self): return FirewallTransaction(self._fw) # configuration def set_permanent_config(self, obj): self._obj = obj def has_configuration(self): if len(self._chains) + len(self._rules) + len(self._passthroughs) > 0: return True if len(self._obj.get_all_chains()) + \ len(self._obj.get_all_rules()) + \ len(self._obj.get_all_passthroughs()) > 0: return True return False def apply_direct(self, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction # Apply permanent configuration and save the obj to be able to # remove permanent configuration settings within get_runtime_config # for use in firewalld reload. self.set_config((self._obj.get_all_chains(), self._obj.get_all_rules(), self._obj.get_all_passthroughs()), transaction) if use_transaction is None: transaction.execute(True) def get_runtime_config(self): # Return only runtime changes # Remove all chains, rules and passthroughs that are in self._obj # (permanent config applied in firewalld _start. chains = { } rules = { } passthroughs = { } for table_id in self._chains: (ipv, table) = table_id for chain in self._chains[table_id]: if not self._obj.query_chain(ipv, table, chain): chains.setdefault(table_id, [ ]).append(chain) for chain_id in self._rules: (ipv, table, chain) = chain_id for (priority, args) in self._rules[chain_id]: if not self._obj.query_rule(ipv, table, chain, priority, args): if chain_id not in rules: rules[chain_id] = LastUpdatedOrderedDict() rules[chain_id][(priority, args)] = priority for ipv in self._passthroughs: for args in self._passthroughs[ipv]: if not self._obj.query_passthrough(ipv, args): if ipv not in passthroughs: passthroughs[ipv] = [ ] passthroughs[ipv].append(args) return (chains, rules, passthroughs) def get_config(self): return (self._chains, self._rules, self._passthroughs) def set_config(self, conf, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction (_chains, _rules, _passthroughs) = conf for table_id in _chains: (ipv, table) = table_id for chain in _chains[table_id]: if not self.query_chain(ipv, table, chain): try: self.add_chain(ipv, table, chain, use_transaction=transaction) except FirewallError as error: log.warning(str(error)) for chain_id in _rules: (ipv, table, chain) = chain_id for (priority, args) in _rules[chain_id]: if not self.query_rule(ipv, table, chain, priority, args): try: self.add_rule(ipv, table, chain, priority, args, use_transaction=transaction) except FirewallError as error: log.warning(str(error)) for ipv in _passthroughs: for args in _passthroughs[ipv]: if not self.query_passthrough(ipv, args): try: self.add_passthrough(ipv, args, use_transaction=transaction) except FirewallError as error: log.warning(str(error)) if use_transaction is None: transaction.execute(True) def _check_ipv(self, ipv): ipvs = ['ipv4', 'ipv6', 'eb'] if ipv not in ipvs: raise FirewallError(errors.INVALID_IPV, "'%s' not in '%s'" % (ipv, ipvs)) def _check_ipv_table(self, ipv, table): self._check_ipv(ipv) tables = ipXtables.BUILT_IN_CHAINS.keys() if ipv in [ 'ipv4', 'ipv6' ] \ else ebtables.BUILT_IN_CHAINS.keys() if table not in tables: raise FirewallError(errors.INVALID_TABLE, "'%s' not in '%s'" % (table, tables)) def _check_builtin_chain(self, ipv, table, chain): if ipv in ['ipv4', 'ipv6']: built_in_chains = ipXtables.BUILT_IN_CHAINS[table] if self._fw.nftables_enabled: our_chains = {} else: our_chains = self._fw.get_direct_backend_by_ipv(ipv).our_chains[table] else: built_in_chains = ebtables.BUILT_IN_CHAINS[table] our_chains = ebtables.OUR_CHAINS[table] if chain in built_in_chains: raise FirewallError(errors.BUILTIN_CHAIN, "chain '%s' is built-in chain" % chain) if chain in our_chains: raise FirewallError(errors.BUILTIN_CHAIN, "chain '%s' is reserved" % chain) if ipv in [ "ipv4", "ipv6" ]: if self._fw.zone.zone_from_chain(chain) is not None: raise FirewallError(errors.INVALID_CHAIN, "Chain '%s' is reserved" % chain) def _register_chain(self, table_id, chain, add): if add: self._chains.setdefault(table_id, [ ]).append(chain) else: self._chains[table_id].remove(chain) if len(self._chains[table_id]) == 0: del self._chains[table_id] def add_chain(self, ipv, table, chain, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction #TODO: policy="ACCEPT" self._chain(True, ipv, table, chain, transaction) if use_transaction is None: transaction.execute(True) def remove_chain(self, ipv, table, chain, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction self._chain(False, ipv, table, chain, transaction) if use_transaction is None: transaction.execute(True) def query_chain(self, ipv, table, chain): self._check_ipv_table(ipv, table) self._check_builtin_chain(ipv, table, chain) table_id = (ipv, table) return (table_id in self._chains and chain in self._chains[table_id]) def get_chains(self, ipv, table): self._check_ipv_table(ipv, table) table_id = (ipv, table) if table_id in self._chains: return self._chains[table_id] return [ ] def get_all_chains(self): r = [ ] for key in self._chains: (ipv, table) = key for chain in self._chains[key]: r.append((ipv, table, chain)) return r def add_rule(self, ipv, table, chain, priority, args, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction self._rule(True, ipv, table, chain, priority, args, transaction) if use_transaction is None: transaction.execute(True) def remove_rule(self, ipv, table, chain, priority, args, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction self._rule(False, ipv, table, chain, priority, args, transaction) if use_transaction is None: transaction.execute(True) def query_rule(self, ipv, table, chain, priority, args): self._check_ipv_table(ipv, table) chain_id = (ipv, table, chain) return chain_id in self._rules and \ (priority, args) in self._rules[chain_id] def get_rules(self, ipv, table, chain): self._check_ipv_table(ipv, table) chain_id = (ipv, table, chain) if chain_id in self._rules: return list(self._rules[chain_id].keys()) return [ ] def get_all_rules(self): r = [ ] for key in self._rules: (ipv, table, chain) = key for (priority, args) in self._rules[key]: r.append((ipv, table, chain, priority, list(args))) return r def _register_rule(self, rule_id, chain_id, priority, enable): if enable: if chain_id not in self._rules: self._rules[chain_id] = LastUpdatedOrderedDict() self._rules[chain_id][rule_id] = priority if chain_id not in self._rule_priority_positions: self._rule_priority_positions[chain_id] = { } if priority in self._rule_priority_positions[chain_id]: self._rule_priority_positions[chain_id][priority] += 1 else: self._rule_priority_positions[chain_id][priority] = 1 else: del self._rules[chain_id][rule_id] if len(self._rules[chain_id]) == 0: del self._rules[chain_id] self._rule_priority_positions[chain_id][priority] -= 1 # DIRECT PASSTHROUGH (untracked) def passthrough(self, ipv, args): try: return self._fw.rule(self._fw.get_direct_backend_by_ipv(ipv).name, args) except Exception as msg: log.debug2(msg) raise FirewallError(errors.COMMAND_FAILED, msg) def _register_passthrough(self, ipv, args, enable): if enable: if ipv not in self._passthroughs: self._passthroughs[ipv] = [ ] self._passthroughs[ipv].append(args) else: self._passthroughs[ipv].remove(args) if len(self._passthroughs[ipv]) == 0: del self._passthroughs[ipv] def add_passthrough(self, ipv, args, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction self._passthrough(True, ipv, list(args), transaction) if use_transaction is None: transaction.execute(True) def remove_passthrough(self, ipv, args, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction self._passthrough(False, ipv, list(args), transaction) if use_transaction is None: transaction.execute(True) def query_passthrough(self, ipv, args): return ipv in self._passthroughs and \ tuple(args) in self._passthroughs[ipv] def get_all_passthroughs(self): r = [ ] for ipv in self._passthroughs: for args in self._passthroughs[ipv]: r.append((ipv, list(args))) return r def get_passthroughs(self, ipv): r = [ ] if ipv in self._passthroughs: for args in self._passthroughs[ipv]: r.append(list(args)) return r def _rule(self, enable, ipv, table, chain, priority, args, transaction): self._check_ipv_table(ipv, table) # Do not create zone chains if we're using nftables. Only allow direct # rules in the built in chains. if not self._fw.nftables_enabled \ and ipv in [ "ipv4", "ipv6" ]: self._fw.zone.create_zone_base_by_chain(ipv, table, chain, transaction) _chain = chain backend = self._fw.get_direct_backend_by_ipv(ipv) # if nftables is in use, just put the direct rules in the chain # specified by the user. i.e. don't append _direct. if not self._fw.nftables_enabled \ and backend.is_chain_builtin(ipv, table, chain): _chain = "%s_direct" % (chain) elif self._fw.nftables_enabled and chain[-7:] == "_direct" \ and backend.is_chain_builtin(ipv, table, chain[:-7]): # strip _direct suffix. If we're using nftables we don't bother # creating the *_direct chains for builtin chains. _chain = chain[:-7] chain_id = (ipv, table, chain) rule_id = (priority, args) if enable: if chain_id in self._rules and \ rule_id in self._rules[chain_id]: raise FirewallError(errors.ALREADY_ENABLED, "rule '%s' already is in '%s:%s:%s'" % \ (args, ipv, table, chain)) else: if chain_id not in self._rules or \ rule_id not in self._rules[chain_id]: raise FirewallError(errors.NOT_ENABLED, "rule '%s' is not in '%s:%s:%s'" % \ (args, ipv, table, chain)) # get priority of rule priority = self._rules[chain_id][rule_id] # If a rule gets added, the initial rule index position within the # ipv, table and chain combination (chain_id) is 1. # Tf the chain_id exists in _rule_priority_positions, there are already # other rules for this chain_id. The number of rules for a priority # less or equal to the priority of the new rule will increase the # index of the new rule. The index is the ip*tables -I insert rule # number. # # Example: We have the following rules for chain_id (ipv4, filter, # INPUT) already: # ipv4, filter, INPUT, 1, -i, foo1, -j, ACCEPT # ipv4, filter, INPUT, 2, -i, foo2, -j, ACCEPT # ipv4, filter, INPUT, 2, -i, foo2_1, -j, ACCEPT # ipv4, filter, INPUT, 3, -i, foo3, -j, ACCEPT # This results in the following _rule_priority_positions structure: # _rule_priority_positions[(ipv4,filter,INPUT)][1] = 1 # _rule_priority_positions[(ipv4,filter,INPUT)][2] = 2 # _rule_priority_positions[(ipv4,filter,INPUT)][3] = 1 # The new rule # ipv4, filter, INPUT, 2, -i, foo2_2, -j, ACCEPT # has the same pritority as the second rule before and will be added # right after it. # The initial index is 1 and the chain_id is already in # _rule_priority_positions. Therefore the index will increase for # the number of rules in every rule position in # _rule_priority_positions[(ipv4,filter,INPUT)].keys() # where position is smaller or equal to the entry in keys. # With the example from above: # The priority of the new rule is 2. Therefore for all keys in # _rule_priority_positions[chain_id] where priority is 1 or 2, the # number of the rules will increase the index of the rule. # For _rule_priority_positions[chain_id][1]: index += 1 # _rule_priority_positions[chain_id][2]: index += 2 # index will be 4 in the end and the rule in the table chain # combination will be added at index 4. # If there are no rules in the table chain combination, a new rule # has index 1. index = 1 if chain_id in self._rule_priority_positions: positions = sorted(self._rule_priority_positions[chain_id].keys()) j = 0 while j < len(positions) and priority >= positions[j]: index += self._rule_priority_positions[chain_id][positions[j]] j += 1 transaction.add_rule(backend, backend.build_rule(enable, table, _chain, index, args)) self._register_rule(rule_id, chain_id, priority, enable) transaction.add_fail(self._register_rule, rule_id, chain_id, priority, not enable) def _chain(self, add, ipv, table, chain, transaction): self._check_ipv_table(ipv, table) self._check_builtin_chain(ipv, table, chain) table_id = (ipv, table) if add: if table_id in self._chains and \ chain in self._chains[table_id]: raise FirewallError(errors.ALREADY_ENABLED, "chain '%s' already is in '%s:%s'" % \ (chain, ipv, table)) else: if table_id not in self._chains or \ chain not in self._chains[table_id]: raise FirewallError(errors.NOT_ENABLED, "chain '%s' is not in '%s:%s'" % \ (chain, ipv, table)) backend = self._fw.get_direct_backend_by_ipv(ipv) transaction.add_rules(backend, backend.build_chain_rules(add, table, chain)) self._register_chain(table_id, chain, add) transaction.add_fail(self._register_chain, table_id, chain, not add) def _passthrough(self, enable, ipv, args, transaction): self._check_ipv(ipv) tuple_args = tuple(args) if enable: if ipv in self._passthroughs and \ tuple_args in self._passthroughs[ipv]: raise FirewallError(errors.ALREADY_ENABLED, "passthrough '%s', '%s'" % (ipv, args)) else: if ipv not in self._passthroughs or \ tuple_args not in self._passthroughs[ipv]: raise FirewallError(errors.NOT_ENABLED, "passthrough '%s', '%s'" % (ipv, args)) backend = self._fw.get_direct_backend_by_ipv(ipv) if enable: backend.check_passthrough(args) # try to find out if a zone chain should be used if ipv in [ "ipv4", "ipv6" ]: table, chain = backend.passthrough_parse_table_chain(args) if table and chain: self._fw.zone.create_zone_base_by_chain(ipv, table, chain) _args = args else: _args = backend.reverse_passthrough(args) transaction.add_rule(backend, _args) self._register_passthrough(ipv, tuple_args, enable) transaction.add_fail(self._register_passthrough, ipv, tuple_args, not enable) PK[Uu))$site-packages/firewall/core/base.pyonu[ c`c@sdZdZdddedgZidd6dd 6d d 6d d 6dd6dd6Ziddddddddddddddd d!gd"6d#d$d%d&d'd(d)ddg d*6Zd+d,d-d.d/d0d1gZd2S(3sBase firewall settingss{chain}_{zone}tACCEPTs %%REJECT%%tDROPtdefaulttPREt PREROUTINGtPOSTt POSTROUTINGtINtINPUTtFWDIt FORWARD_INtFWDOt FORWARD_OUTtOUTtOUTPUTsicmp-host-prohibiteds host-prohibsicmp-net-unreachables net-unreachsicmp-host-unreachables host-unreachsicmp-port-unreachables port-unreachsicmp-proto-unreachables proto-unreachsicmp-net-prohibiteds net-prohibs tcp-resetstcp-rstsicmp-admin-prohibiteds admin-prohibtipv4sicmp6-adm-prohibitedsadm-prohibitedsicmp6-no-routesno-routesicmp6-addr-unreachables addr-unreachsicmp6-port-unreachabletipv6shash:ips hash:ip,ports hash:ip,markshash:nets hash:net,portshash:net,ifaceshash:macN(t__doc__tDEFAULT_ZONE_TARGETt ZONE_TARGETSt SHORTCUTSt REJECT_TYPEStZONE_SOURCE_IPSET_TYPES(((s6/usr/lib/python2.7/site-packages/firewall/core/base.pyts,           PK[(site-packages/firewall/core/ipXtables.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import os.path import copy from firewall.core.base import SHORTCUTS, DEFAULT_ZONE_TARGET from firewall.core.prog import runProg from firewall.core.logger import log from firewall.functions import tempFile, readfile, splitArgs, check_mac, portStr, \ check_single_address, check_address, normalizeIP6 from firewall import config from firewall.errors import FirewallError, INVALID_PASSTHROUGH, INVALID_RULE from firewall.core.rich import Rich_Accept, Rich_Reject, Rich_Drop, Rich_Mark import string BUILT_IN_CHAINS = { "security": [ "INPUT", "OUTPUT", "FORWARD" ], "raw": [ "PREROUTING", "OUTPUT" ], "mangle": [ "PREROUTING", "POSTROUTING", "INPUT", "OUTPUT", "FORWARD" ], "nat": [ "PREROUTING", "POSTROUTING", "OUTPUT" ], "filter": [ "INPUT", "OUTPUT", "FORWARD" ], } DEFAULT_REJECT_TYPE = { "ipv4": "icmp-host-prohibited", "ipv6": "icmp6-adm-prohibited", } ICMP = { "ipv4": "icmp", "ipv6": "ipv6-icmp", } # ipv ebtables also uses this # def common_reverse_rule(args): """ Inverse valid rule """ replace_args = { # Append "-A": "-D", "--append": "--delete", # Insert "-I": "-D", "--insert": "--delete", # New chain "-N": "-X", "--new-chain": "--delete-chain", } ret_args = args[:] for arg in replace_args: try: idx = ret_args.index(arg) except Exception: continue if arg in [ "-I", "--insert" ]: # With insert rulenum, then remove it if it is a number # Opt at position idx, chain at position idx+1, [rulenum] at # position idx+2 try: int(ret_args[idx+2]) except Exception: pass else: ret_args.pop(idx+2) ret_args[idx] = replace_args[arg] return ret_args def common_reverse_passthrough(args): """ Reverse valid passthough rule """ replace_args = { # Append "-A": "-D", "--append": "--delete", # Insert "-I": "-D", "--insert": "--delete", # New chain "-N": "-X", "--new-chain": "--delete-chain", } ret_args = args[:] for x in replace_args: try: idx = ret_args.index(x) except ValueError: continue if x in [ "-I", "--insert" ]: # With insert rulenum, then remove it if it is a number # Opt at position idx, chain at position idx+1, [rulenum] at # position idx+2 try: int(ret_args[idx+2]) except ValueError: pass else: ret_args.pop(idx+2) ret_args[idx] = replace_args[x] return ret_args raise FirewallError(INVALID_PASSTHROUGH, "no '-A', '-I' or '-N' arg") # ipv ebtables also uses this # def common_check_passthrough(args): """ Check if passthough rule is valid (only add, insert and new chain rules are allowed) """ args = set(args) not_allowed = set(["-C", "--check", # check rule "-D", "--delete", # delete rule "-R", "--replace", # replace rule "-L", "--list", # list rule "-S", "--list-rules", # print rules "-F", "--flush", # flush rules "-Z", "--zero", # zero rules "-X", "--delete-chain", # delete chain "-P", "--policy", # policy "-E", "--rename-chain"]) # rename chain) # intersection of args and not_allowed is not empty, i.e. # something from args is not allowed if len(args & not_allowed) > 0: raise FirewallError(INVALID_PASSTHROUGH, "arg '%s' is not allowed" % list(args & not_allowed)[0]) # args need to contain one of -A, -I, -N needed = set(["-A", "--append", "-I", "--insert", "-N", "--new-chain"]) # empty intersection of args and needed, i.e. # none from args contains any needed command if len(args & needed) == 0: raise FirewallError(INVALID_PASSTHROUGH, "no '-A', '-I' or '-N' arg") class ip4tables(object): ipv = "ipv4" name = "ip4tables" zones_supported = True def __init__(self, fw): self._fw = fw self._command = config.COMMANDS[self.ipv] self._restore_command = config.COMMANDS["%s-restore" % self.ipv] self.wait_option = self._detect_wait_option() self.restore_wait_option = self._detect_restore_wait_option() self.fill_exists() self.available_tables = [] self.zone_source_index_cache = [] self.our_chains = {} # chains created by firewalld def fill_exists(self): self.command_exists = os.path.exists(self._command) self.restore_command_exists = os.path.exists(self._restore_command) def __run(self, args): # convert to string list if self.wait_option and self.wait_option not in args: _args = [self.wait_option] + ["%s" % item for item in args] else: _args = ["%s" % item for item in args] log.debug2("%s: %s %s", self.__class__, self._command, " ".join(_args)) (status, ret) = runProg(self._command, _args) if status != 0: raise ValueError("'%s %s' failed: %s" % (self._command, " ".join(_args), ret)) return ret def split_value(self, rules, opts=None): """Split values combined with commas for options in opts""" if opts is None: return rules out_rules = [ ] for rule in rules: processed = False for opt in opts: try: i = rule.index(opt) except ValueError: pass else: if len(rule) > i and "," in rule[i+1]: # For all items in the comma separated list in index # i of the rule, a new rule is created with a single # item from this list processed = True items = rule[i+1].split(",") for item in items: _rule = rule[:] _rule[i+1] = item out_rules.append(_rule) if not processed: out_rules.append(rule) return out_rules def _rule_replace(self, rule, pattern, replacement): try: i = rule.index(pattern) except ValueError: return False else: rule[i:i+1] = replacement return True def is_chain_builtin(self, ipv, table, chain): return table in BUILT_IN_CHAINS and \ chain in BUILT_IN_CHAINS[table] def build_chain_rules(self, add, table, chain): rule = [ "-t", table ] if add: rule.append("-N") else: rule.append("-X") rule.append(chain) return [rule] def build_rule(self, add, table, chain, index, args): rule = [ "-t", table ] if add: rule += [ "-I", chain, str(index) ] else: rule += [ "-D", chain ] rule += args return rule def reverse_rule(self, args): return common_reverse_rule(args) def check_passthrough(self, args): common_check_passthrough(args) def reverse_passthrough(self, args): return common_reverse_passthrough(args) def passthrough_parse_table_chain(self, args): table = "filter" try: i = args.index("-t") except ValueError: pass else: if len(args) >= i+1: table = args[i+1] chain = None for opt in [ "-A", "--append", "-I", "--insert", "-N", "--new-chain" ]: try: i = args.index(opt) except ValueError: pass else: if len(args) >= i+1: chain = args[i+1] return (table, chain) def _run_replace_zone_source(self, rule, zone_source_index_cache): try: i = rule.index("%%ZONE_SOURCE%%") rule.pop(i) zone = rule.pop(i) if "-m" == rule[4]: # ipset/mac zone_source = (zone, rule[7]) # (zone, address) else: zone_source = (zone, rule[5]) # (zone, address) except ValueError: try: i = rule.index("%%ZONE_INTERFACE%%") rule.pop(i) zone_source = None except ValueError: return rule_add = True if rule[0] in ["-D", "--delete"]: rule_add = False if zone_source and not rule_add: if zone_source in zone_source_index_cache: zone_source_index_cache.remove(zone_source) elif rule_add: if zone_source: # order source based dispatch by zone name if zone_source not in zone_source_index_cache: zone_source_index_cache.append(zone_source) zone_source_index_cache.sort(key=lambda x: x[0]) index = zone_source_index_cache.index(zone_source) else: if self._fw._allow_zone_drifting: index = 0 else: index = len(zone_source_index_cache) rule[0] = "-I" rule.insert(2, "%d" % (index + 1)) def set_rules(self, rules, log_denied): temp_file = tempFile() table_rules = { } zone_source_index_cache = copy.deepcopy(self.zone_source_index_cache) for _rule in rules: rule = _rule[:] # replace %%REJECT%% self._rule_replace(rule, "%%REJECT%%", \ ["REJECT", "--reject-with", DEFAULT_REJECT_TYPE[self.ipv]]) # replace %%ICMP%% self._rule_replace(rule, "%%ICMP%%", [ICMP[self.ipv]]) # replace %%LOGTYPE%% try: i = rule.index("%%LOGTYPE%%") except ValueError: pass else: if log_denied == "off": continue if log_denied in [ "unicast", "broadcast", "multicast" ]: rule[i:i+1] = [ "-m", "pkttype", "--pkt-type", log_denied ] else: rule.pop(i) self._run_replace_zone_source(rule, zone_source_index_cache) table = "filter" # get table form rule for opt in [ "-t", "--table" ]: try: i = rule.index(opt) except ValueError: pass else: if len(rule) >= i+1: rule.pop(i) table = rule.pop(i) # we can not use joinArgs here, because it would use "'" instead # of '"' for the start and end of the string, this breaks # iptables-restore for i in range(len(rule)): for c in string.whitespace: if c in rule[i] and not (rule[i].startswith('"') and rule[i].endswith('"')): rule[i] = '"%s"' % rule[i] table_rules.setdefault(table, []).append(rule) for table in table_rules: rules = table_rules[table] rules = self.split_value(rules, [ "-s", "--source" ]) rules = self.split_value(rules, [ "-d", "--destination" ]) temp_file.write("*%s\n" % table) for rule in rules: temp_file.write(" ".join(rule) + "\n") temp_file.write("COMMIT\n") temp_file.close() stat = os.stat(temp_file.name) log.debug2("%s: %s %s", self.__class__, self._restore_command, "%s: %d" % (temp_file.name, stat.st_size)) args = [ ] if self.restore_wait_option: args.append(self.restore_wait_option) args.append("-n") (status, ret) = runProg(self._restore_command, args, stdin=temp_file.name) if log.getDebugLogLevel() > 2: lines = readfile(temp_file.name) if lines is not None: i = 1 for line in lines: log.debug3("%8d: %s" % (i, line), nofmt=1, nl=0) if not line.endswith("\n"): log.debug3("", nofmt=1) i += 1 os.unlink(temp_file.name) if status != 0: raise ValueError("'%s %s' failed: %s" % (self._restore_command, " ".join(args), ret)) self.zone_source_index_cache = zone_source_index_cache return ret def set_rule(self, rule, log_denied): # replace %%REJECT%% self._rule_replace(rule, "%%REJECT%%", \ ["REJECT", "--reject-with", DEFAULT_REJECT_TYPE[self.ipv]]) # replace %%ICMP%% self._rule_replace(rule, "%%ICMP%%", [ICMP[self.ipv]]) # replace %%LOGTYPE%% try: i = rule.index("%%LOGTYPE%%") except ValueError: pass else: if log_denied == "off": return "" if log_denied in [ "unicast", "broadcast", "multicast" ]: rule[i:i+1] = [ "-m", "pkttype", "--pkt-type", log_denied ] else: rule.pop(i) zone_source_index_cache = copy.deepcopy(self.zone_source_index_cache) self._run_replace_zone_source(rule, zone_source_index_cache) output = self.__run(rule) self.zone_source_index_cache = zone_source_index_cache return output def get_available_tables(self, table=None): ret = [] tables = [ table ] if table else BUILT_IN_CHAINS.keys() for table in tables: if table in self.available_tables: ret.append(table) else: try: self.__run(["-t", table, "-L", "-n"]) self.available_tables.append(table) ret.append(table) except ValueError: log.debug1("%s table '%s' does not exist (or not enough permission to check)." % (self.ipv, table)) return ret def _detect_wait_option(self): wait_option = "" ret = runProg(self._command, ["-w", "-L", "-n"]) # since iptables-1.4.20 if ret[0] == 0: wait_option = "-w" # wait for xtables lock ret = runProg(self._command, ["-w10", "-L", "-n"]) # since iptables > 1.4.21 if ret[0] == 0: wait_option = "-w10" # wait max 10 seconds log.debug2("%s: %s will be using %s option.", self.__class__, self._command, wait_option) return wait_option def _detect_restore_wait_option(self): temp_file = tempFile() temp_file.write("#foo") temp_file.close() wait_option = "" for test_option in ["-w", "--wait=2"]: ret = runProg(self._restore_command, [test_option], stdin=temp_file.name) if ret[0] == 0 and "invalid option" not in ret[1] \ and "unrecognized option" not in ret[1]: wait_option = test_option break log.debug2("%s: %s will be using %s option.", self.__class__, self._restore_command, wait_option) os.unlink(temp_file.name) return wait_option def build_flush_rules(self): self.zone_source_index_cache = [] rules = [] for table in BUILT_IN_CHAINS.keys(): if not self.get_available_tables(table): continue # Flush firewall rules: -F # Delete firewall chains: -X # Set counter to zero: -Z for flag in [ "-F", "-X", "-Z" ]: rules.append(["-t", table, flag]) return rules def build_set_policy_rules(self, policy): rules = [] for table in BUILT_IN_CHAINS.keys(): if not self.get_available_tables(table): continue if table == "nat": continue for chain in BUILT_IN_CHAINS[table]: rules.append(["-t", table, "-P", chain, policy]) return rules def supported_icmp_types(self): """Return ICMP types that are supported by the iptables/ip6tables command and kernel""" ret = [ ] output = "" try: output = self.__run(["-p", "icmp" if self.ipv == "ipv4" else "ipv6-icmp", "--help"]) except ValueError as ex: if self.ipv == "ipv4": log.debug1("iptables error: %s" % ex) else: log.debug1("ip6tables error: %s" % ex) lines = output.splitlines() in_types = False for line in lines: #print(line) if in_types: line = line.strip().lower() splits = line.split() for split in splits: if split.startswith("(") and split.endswith(")"): x = split[1:-1] else: x = split if x not in ret: ret.append(x) if self.ipv == "ipv4" and line.startswith("Valid ICMP Types:") or \ self.ipv == "ipv6" and line.startswith("Valid ICMPv6 Types:"): in_types = True return ret def build_default_tables(self): # nothing to do, they always exist return [] def build_default_rules(self, log_denied="off"): default_rules = {} if self.get_available_tables("security"): default_rules["security"] = [ ] self.our_chains["security"] = set() for chain in BUILT_IN_CHAINS["security"]: default_rules["security"].append("-N %s_direct" % chain) default_rules["security"].append("-A %s -j %s_direct" % (chain, chain)) self.our_chains["security"].add("%s_direct" % chain) if self.get_available_tables("raw"): default_rules["raw"] = [ ] self.our_chains["raw"] = set() for chain in BUILT_IN_CHAINS["raw"]: default_rules["raw"].append("-N %s_direct" % chain) default_rules["raw"].append("-A %s -j %s_direct" % (chain, chain)) self.our_chains["raw"].add("%s_direct" % chain) if chain == "PREROUTING": for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules["raw"].append("-N %s_%s" % (chain, dispatch_suffix)) default_rules["raw"].append("-A %s -j %s_%s" % (chain, chain, dispatch_suffix)) self.our_chains["raw"].update(set(["%s_%s" % (chain, dispatch_suffix)])) if self.get_available_tables("mangle"): default_rules["mangle"] = [ ] self.our_chains["mangle"] = set() for chain in BUILT_IN_CHAINS["mangle"]: default_rules["mangle"].append("-N %s_direct" % chain) default_rules["mangle"].append("-A %s -j %s_direct" % (chain, chain)) self.our_chains["mangle"].add("%s_direct" % chain) if chain == "PREROUTING": for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules["mangle"].append("-N %s_%s" % (chain, dispatch_suffix)) default_rules["mangle"].append("-A %s -j %s_%s" % (chain, chain, dispatch_suffix)) self.our_chains["mangle"].update(set(["%s_%s" % (chain, dispatch_suffix)])) if self.get_available_tables("nat"): default_rules["nat"] = [ ] self.our_chains["nat"] = set() for chain in BUILT_IN_CHAINS["nat"]: default_rules["nat"].append("-N %s_direct" % chain) default_rules["nat"].append("-A %s -j %s_direct" % (chain, chain)) self.our_chains["nat"].add("%s_direct" % chain) if chain in [ "PREROUTING", "POSTROUTING" ]: for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules["nat"].append("-N %s_%s" % (chain, dispatch_suffix)) default_rules["nat"].append("-A %s -j %s_%s" % (chain, chain, dispatch_suffix)) self.our_chains["nat"].update(set(["%s_%s" % (chain, dispatch_suffix)])) default_rules["filter"] = [] self.our_chains["filter"] = set() default_rules["filter"].append("-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT") default_rules["filter"].append("-A INPUT -i lo -j ACCEPT") default_rules["filter"].append("-N INPUT_direct") default_rules["filter"].append("-A INPUT -j INPUT_direct") self.our_chains["filter"].update(set("INPUT_direct")) for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules["filter"].append("-N INPUT_%s" % (dispatch_suffix)) default_rules["filter"].append("-A INPUT -j INPUT_%s" % (dispatch_suffix)) self.our_chains["filter"].update(set("INPUT_%s" % (dispatch_suffix))) if log_denied != "off": default_rules["filter"].append("-A INPUT -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: '") default_rules["filter"].append("-A INPUT -m conntrack --ctstate INVALID -j DROP") if log_denied != "off": default_rules["filter"].append("-A INPUT %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: '") default_rules["filter"].append("-A INPUT -j %%REJECT%%") default_rules["filter"].append("-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT") default_rules["filter"].append("-A FORWARD -i lo -j ACCEPT") default_rules["filter"].append("-N FORWARD_direct") default_rules["filter"].append("-A FORWARD -j FORWARD_direct") self.our_chains["filter"].update(set("FORWARD_direct")) for direction in ["IN", "OUT"]: for dispatch_suffix in ["ZONES_SOURCE", "ZONES"] if self._fw._allow_zone_drifting else ["ZONES"]: default_rules["filter"].append("-N FORWARD_%s_%s" % (direction, dispatch_suffix)) default_rules["filter"].append("-A FORWARD -j FORWARD_%s_%s" % (direction, dispatch_suffix)) self.our_chains["filter"].update(set("FORWARD_%s_%s" % (direction, dispatch_suffix))) if log_denied != "off": default_rules["filter"].append("-A FORWARD -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: '") default_rules["filter"].append("-A FORWARD -m conntrack --ctstate INVALID -j DROP") if log_denied != "off": default_rules["filter"].append("-A FORWARD %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: '") default_rules["filter"].append("-A FORWARD -j %%REJECT%%") default_rules["filter"] += [ "-N OUTPUT_direct", "-A OUTPUT -o lo -j ACCEPT", "-A OUTPUT -j OUTPUT_direct", ] self.our_chains["filter"].update(set("OUTPUT_direct")) final_default_rules = [] for table in default_rules: if table not in self.get_available_tables(): continue for rule in default_rules[table]: final_default_rules.append(["-t", table] + splitArgs(rule)) return final_default_rules def get_zone_table_chains(self, table): if table == "filter": return { "INPUT", "FORWARD_IN", "FORWARD_OUT" } if table == "mangle": if "mangle" in self.get_available_tables() and \ "nat" in self.get_available_tables(): return { "PREROUTING" } if table == "nat": if "nat" in self.get_available_tables(): return { "PREROUTING", "POSTROUTING" } if table == "raw": if "raw" in self.get_available_tables(): return { "PREROUTING" } return {} def build_zone_source_interface_rules(self, enable, zone, interface, table, chain, append=False): # handle all zones in the same way here, now # trust and block zone targets are handled now in __chain opt = { "PREROUTING": "-i", "POSTROUTING": "-o", "INPUT": "-i", "FORWARD_IN": "-i", "FORWARD_OUT": "-o", "OUTPUT": "-o", }[chain] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) action = "-g" if enable and not append: rule = [ "-I", "%s_ZONES" % chain, "%%ZONE_INTERFACE%%" ] elif enable: rule = [ "-A", "%s_ZONES" % chain ] else: rule = [ "-D", "%s_ZONES" % chain ] if not append: rule += ["%%ZONE_INTERFACE%%"] rule += [ "-t", table, opt, interface, action, target ] return [rule] def build_zone_source_address_rules(self, enable, zone, address, table, chain): add_del = { True: "-I", False: "-D" }[enable] opt = { "PREROUTING": "-s", "POSTROUTING": "-d", "INPUT": "-s", "FORWARD_IN": "-s", "FORWARD_OUT": "-d", "OUTPUT": "-d", }[chain] if self._fw._allow_zone_drifting: zone_dispatch_chain = "%s_ZONES_SOURCE" % (chain) else: zone_dispatch_chain = "%s_ZONES" % (chain) target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) action = "-g" if address.startswith("ipset:"): name = address[6:] if opt == "-d": opt = "dst" else: opt = "src" flags = ",".join([opt] * self._fw.ipset.get_dimension(name)) rule = [ add_del, zone_dispatch_chain, "%%ZONE_SOURCE%%", zone, "-t", table, "-m", "set", "--match-set", name, flags, action, target ] else: if check_mac(address): # outgoing can not be set if opt == "-d": return "" rule = [ add_del, zone_dispatch_chain, "%%ZONE_SOURCE%%", zone, "-t", table, "-m", "mac", "--mac-source", address.upper(), action, target ] else: if check_single_address("ipv6", address): address = normalizeIP6(address) elif check_address("ipv6", address): addr_split = address.split("/") address = normalizeIP6(addr_split[0]) + "/" + addr_split[1] rule = [ add_del, zone_dispatch_chain, "%%ZONE_SOURCE%%", zone, "-t", table, opt, address, action, target ] return [rule] def build_zone_chain_rules(self, zone, table, chain): _zone = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) self.our_chains[table].update(set([_zone, "%s_log" % _zone, "%s_deny" % _zone, "%s_allow" % _zone])) rules = [] rules.append([ "-N", _zone, "-t", table ]) rules.append([ "-N", "%s_log" % _zone, "-t", table ]) rules.append([ "-N", "%s_deny" % _zone, "-t", table ]) rules.append([ "-N", "%s_allow" % _zone, "-t", table ]) rules.append([ "-A", _zone, "-t", table, "-j", "%s_log" % _zone ]) rules.append([ "-A", _zone, "-t", table, "-j", "%s_deny" % _zone ]) rules.append([ "-A", _zone, "-t", table, "-j", "%s_allow" % _zone ]) target = self._fw.zone._zones[zone].target if self._fw.get_log_denied() != "off": if table == "filter" and \ chain in [ "INPUT", "FORWARD_IN", "FORWARD_OUT", "OUTPUT" ]: if target in [ "REJECT", "%%REJECT%%" ]: rules.append([ "-A", _zone, "-t", table, "%%LOGTYPE%%", "-j", "LOG", "--log-prefix", "\"%s_REJECT: \"" % _zone ]) if target == "DROP": rules.append([ "-A", _zone, "-t", table, "%%LOGTYPE%%", "-j", "LOG", "--log-prefix", "\"%s_DROP: \"" % _zone ]) # Handle trust, block and drop zones: # Add an additional rule with the zone target (accept, reject # or drop) to the base zone only in the filter table. # Otherwise it is not be possible to have a zone with drop # target, that is allowing traffic that is locally initiated # or that adds additional rules. (RHBZ#1055190) if table == "filter" and \ target in [ "ACCEPT", "REJECT", "%%REJECT%%", "DROP" ] and \ chain in [ "INPUT", "FORWARD_IN", "FORWARD_OUT", "OUTPUT" ]: rules.append([ "-A", _zone, "-t", table, "-j", target ]) return rules def _rule_limit(self, limit): if limit: return [ "-m", "limit", "--limit", limit.value ] return [] def _rich_rule_log(self, rich_rule, enable, table, target, rule_fragment): if not rich_rule.log: return [] add_del = { True: "-A", False: "-D" }[enable] rule = [ add_del, "%s_log" % (target), "-t", table] rule += rule_fragment + [ "-j", "LOG" ] if rich_rule.log.prefix: rule += [ "--log-prefix", "'%s'" % rich_rule.log.prefix ] if rich_rule.log.level: rule += [ "--log-level", "%s" % rich_rule.log.level ] rule += self._rule_limit(rich_rule.log.limit) return rule def _rich_rule_audit(self, rich_rule, enable, table, target, rule_fragment): if not rich_rule.audit: return [] add_del = { True: "-A", False: "-D" }[enable] rule = [add_del, "%s_log" % (target), "-t", table] + rule_fragment if type(rich_rule.action) == Rich_Accept: _type = "accept" elif type(rich_rule.action) == Rich_Reject: _type = "reject" elif type(rich_rule.action) == Rich_Drop: _type = "drop" else: _type = "unknown" rule += [ "-j", "AUDIT", "--type", _type ] rule += self._rule_limit(rich_rule.audit.limit) return rule def _rich_rule_action(self, zone, rich_rule, enable, table, target, rule_fragment): if not rich_rule.action: return [] add_del = { True: "-A", False: "-D" }[enable] if type(rich_rule.action) == Rich_Accept: chain = "%s_allow" % target rule_action = [ "-j", "ACCEPT" ] elif type(rich_rule.action) == Rich_Reject: chain = "%s_deny" % target rule_action = [ "-j", "REJECT" ] if rich_rule.action.type: rule_action += [ "--reject-with", rich_rule.action.type ] elif type(rich_rule.action) == Rich_Drop: chain = "%s_deny" % target rule_action = [ "-j", "DROP" ] elif type(rich_rule.action) == Rich_Mark: target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["PREROUTING"], zone=zone) table = "mangle" chain = "%s_allow" % target rule_action = [ "-j", "MARK", "--set-xmark", rich_rule.action.set ] else: raise FirewallError(INVALID_RULE, "Unknown action %s" % type(rich_rule.action)) rule = [ add_del, chain, "-t", table ] rule += rule_fragment + rule_action rule += self._rule_limit(rich_rule.action.limit) return rule def _rich_rule_destination_fragment(self, rich_dest): if not rich_dest: return [] rule_fragment = [] if rich_dest.invert: rule_fragment.append("!") if check_single_address("ipv6", rich_dest.addr): rule_fragment += [ "-d", normalizeIP6(rich_dest.addr) ] elif check_address("ipv6", rich_dest.addr): addr_split = rich_dest.addr.split("/") rule_fragment += [ "-d", normalizeIP6(addr_split[0]) + "/" + addr_split[1] ] else: rule_fragment += [ "-d", rich_dest.addr ] return rule_fragment def _rich_rule_source_fragment(self, rich_source): if not rich_source: return [] rule_fragment = [] if rich_source.addr: if rich_source.invert: rule_fragment.append("!") if check_single_address("ipv6", rich_source.addr): rule_fragment += [ "-s", normalizeIP6(rich_source.addr) ] elif check_address("ipv6", rich_source.addr): addr_split = rich_source.addr.split("/") rule_fragment += [ "-s", normalizeIP6(addr_split[0]) + "/" + addr_split[1] ] else: rule_fragment += [ "-s", rich_source.addr ] elif hasattr(rich_source, "mac") and rich_source.mac: rule_fragment += [ "-m", "mac" ] if rich_source.invert: rule_fragment.append("!") rule_fragment += [ "--mac-source", rich_source.mac ] elif hasattr(rich_source, "ipset") and rich_source.ipset: rule_fragment += [ "-m", "set" ] if rich_source.invert: rule_fragment.append("!") flags = self._fw.zone._ipset_match_flags(rich_source.ipset, "src") rule_fragment += [ "--match-set", rich_source.ipset, flags ] return rule_fragment def build_zone_ports_rules(self, enable, zone, proto, port, destination=None, rich_rule=None): add_del = { True: "-A", False: "-D" }[enable] table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [ "-p", proto ] if port: rule_fragment += [ "--dport", "%s" % portStr(port) ] if destination: rule_fragment += [ "-d", destination ] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) if not rich_rule or type(rich_rule.action) != Rich_Mark: rule_fragment += [ "-m", "conntrack", "--ctstate", "NEW,UNTRACKED" ] rules = [] if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([add_del, "%s_allow" % (target), "-t", table] + rule_fragment + [ "-j", "ACCEPT" ]) return rules def build_zone_protocol_rules(self, enable, zone, protocol, destination=None, rich_rule=None): add_del = { True: "-A", False: "-D" }[enable] table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [ "-p", protocol ] if destination: rule_fragment += [ "-d", destination ] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) if not rich_rule or type(rich_rule.action) != Rich_Mark: rule_fragment += [ "-m", "conntrack", "--ctstate", "NEW,UNTRACKED" ] rules = [] if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([add_del, "%s_allow" % (target), "-t", table] + rule_fragment + [ "-j", "ACCEPT" ]) return rules def build_zone_source_ports_rules(self, enable, zone, proto, port, destination=None, rich_rule=None): add_del = { True: "-A", False: "-D" }[enable] table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [ "-p", proto ] if port: rule_fragment += [ "--sport", "%s" % portStr(port) ] if destination: rule_fragment += [ "-d", destination ] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) if not rich_rule or type(rich_rule.action) != Rich_Mark: rule_fragment += [ "-m", "conntrack", "--ctstate", "NEW,UNTRACKED" ] rules = [] if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([add_del, "%s_allow" % (target), "-t", table] + rule_fragment + [ "-j", "ACCEPT" ]) return rules def build_zone_helper_ports_rules(self, enable, zone, proto, port, destination, helper_name, module_short_name): add_del = { True: "-A", False: "-D" }[enable] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["PREROUTING"], zone=zone) rule = [ add_del, "%s_allow" % (target), "-t", "raw", "-p", proto ] if port: rule += [ "--dport", "%s" % portStr(port) ] if destination: rule += [ "-d", destination ] rule += [ "-j", "CT", "--helper", module_short_name ] return [rule] def build_zone_masquerade_rules(self, enable, zone, rich_rule=None): add_del = { True: "-A", False: "-D" }[enable] target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["POSTROUTING"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rules = [] rules.append([ add_del, "%s_allow" % (target), "-t", "nat" ] + rule_fragment + [ "!", "-o", "lo", "-j", "MASQUERADE" ]) # FORWARD_OUT target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["FORWARD_OUT"], zone=zone) rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rules.append([ add_del, "%s_allow" % (target), "-t", "filter"] + rule_fragment + ["-m", "conntrack", "--ctstate", "NEW,UNTRACKED", "-j", "ACCEPT" ]) return rules def build_zone_forward_port_rules(self, enable, zone, filter_chain, port, protocol, toport, toaddr, mark_id, rich_rule=None): add_del = { True: "-A", False: "-D" }[enable] mark_str = "0x%x" % mark_id mark = [ "-m", "mark", "--mark", mark_str ] to = "" if toaddr: if check_single_address("ipv6", toaddr): to += "[%s]" % normalizeIP6(toaddr) else: to += toaddr if toport and toport != "": to += ":%s" % portStr(toport, "-") target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["PREROUTING"], zone=zone) rule_fragment = [ "-p", protocol, "--dport", portStr(port) ] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rules = [] if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, "mangle", target, rule_fragment)) rules.append([ add_del, "%s_allow" % (target), "-t", "mangle"] + rule_fragment + [ "-j", "MARK", "--set-mark", mark_str ]) # local and remote rules.append([ add_del, "%s_allow" % (target), "-t", "nat", "-p", protocol ] + mark + [ "-j", "DNAT", "--to-destination", to ]) target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[filter_chain], zone=zone) rules.append([ add_del, "%s_allow" % (target), "-t", "filter", "-m", "conntrack", "--ctstate", "NEW,UNTRACKED" ] + mark + [ "-j", "ACCEPT" ]) return rules def build_zone_icmp_block_rules(self, enable, zone, ict, rich_rule=None): table = "filter" add_del = { True: "-A", False: "-D" }[enable] if self.ipv == "ipv4": proto = [ "-p", "icmp" ] match = [ "-m", "icmp", "--icmp-type", ict.name ] else: proto = [ "-p", "ipv6-icmp" ] match = [ "-m", "icmp6", "--icmpv6-type", ict.name ] rules = [] for chain in ["INPUT", "FORWARD_IN"]: target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) if self._fw.zone.query_icmp_block_inversion(zone): final_chain = "%s_allow" % target final_target = "ACCEPT" else: final_chain = "%s_deny" % target final_target = "%%REJECT%%" rule_fragment = [] if rich_rule: rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rule_fragment += proto + match if rich_rule: rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) if rich_rule.action: rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) else: rules.append([ add_del, "%s_deny" % target, "-t", table ] + rule_fragment + [ "-j", "%%REJECT%%" ]) else: if self._fw.get_log_denied() != "off" and final_target != "ACCEPT": rules.append([ add_del, final_chain, "-t", table ] + rule_fragment + [ "%%LOGTYPE%%", "-j", "LOG", "--log-prefix", "\"%s_ICMP_BLOCK: \"" % zone ]) rules.append([ add_del, final_chain, "-t", table ] + rule_fragment + [ "-j", final_target ]) return rules def build_zone_icmp_block_inversion_rules(self, enable, zone): table = "filter" rules = [] for chain in [ "INPUT", "FORWARD_IN" ]: rule_idx = 4 _zone = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS[chain], zone=zone) if self._fw.zone.query_icmp_block_inversion(zone): ibi_target = "%%REJECT%%" if self._fw.get_log_denied() != "off": if enable: rule = [ "-I", _zone, str(rule_idx) ] else: rule = [ "-D", _zone ] rule = rule + [ "-t", table, "-p", "%%ICMP%%", "%%LOGTYPE%%", "-j", "LOG", "--log-prefix", "\"%s_ICMP_BLOCK: \"" % _zone ] rules.append(rule) rule_idx += 1 else: ibi_target = "ACCEPT" if enable: rule = [ "-I", _zone, str(rule_idx) ] else: rule = [ "-D", _zone ] rule = rule + [ "-t", table, "-p", "%%ICMP%%", "-j", ibi_target ] rules.append(rule) return rules def build_zone_rich_source_destination_rules(self, enable, zone, rich_rule): table = "filter" target = DEFAULT_ZONE_TARGET.format(chain=SHORTCUTS["INPUT"], zone=zone) rule_fragment = [] rule_fragment += self._rich_rule_destination_fragment(rich_rule.destination) rule_fragment += self._rich_rule_source_fragment(rich_rule.source) rules = [] rules.append(self._rich_rule_log(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_audit(rich_rule, enable, table, target, rule_fragment)) rules.append(self._rich_rule_action(zone, rich_rule, enable, table, target, rule_fragment)) return rules def is_ipv_supported(self, ipv): return ipv == self.ipv class ip6tables(ip4tables): ipv = "ipv6" name = "ip6tables" def build_rpfilter_rules(self, log_denied=False): rules = [] rules.append([ "-I", "PREROUTING", "-t", "raw", "-m", "rpfilter", "--invert", "-j", "DROP" ]) if log_denied != "off": rules.append([ "-I", "PREROUTING", "-t", "raw", "-m", "rpfilter", "--invert", "-j", "LOG", "--log-prefix", "rpfilter_DROP: " ]) rules.append([ "-I", "PREROUTING", "-t", "raw", "-p", "ipv6-icmp", "--icmpv6-type=neighbour-solicitation", "-j", "ACCEPT" ]) # RHBZ#1575431, kernel bug in 4.16-4.17 rules.append([ "-I", "PREROUTING", "-t", "raw", "-p", "ipv6-icmp", "--icmpv6-type=router-advertisement", "-j", "ACCEPT" ]) # RHBZ#1058505 return rules PK[a  *site-packages/firewall/core/fw_icmptype.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "FirewallIcmpType" ] import copy from firewall.core.logger import log from firewall import errors from firewall.errors import FirewallError class FirewallIcmpType(object): def __init__(self, fw): self._fw = fw self._icmptypes = { } def __repr__(self): return '%s(%r)' % (self.__class__, self._icmptypes) def cleanup(self): self._icmptypes.clear() # zones def get_icmptypes(self): return sorted(self._icmptypes.keys()) def check_icmptype(self, icmptype): if icmptype not in self._icmptypes: raise FirewallError(errors.INVALID_ICMPTYPE, icmptype) def get_icmptype(self, icmptype): self.check_icmptype(icmptype) return self._icmptypes[icmptype] def add_icmptype(self, obj): orig_ipvs = obj.destination if len(orig_ipvs) == 0: orig_ipvs = [ "ipv4", "ipv6" ] ipvs = orig_ipvs[:] for ipv in orig_ipvs: if ipv == "ipv4": if not self._fw.ip4tables_enabled: continue supported_icmps = self._fw.ip4tables_supported_icmp_types elif ipv == "ipv6": if not self._fw.ip6tables_enabled: continue supported_icmps = self._fw.ip6tables_supported_icmp_types else: supported_icmps = [ ] if obj.name.lower() not in supported_icmps: log.info1("ICMP type '%s' is not supported by the kernel for %s." % (obj.name, ipv)) ipvs.remove(ipv) if len(ipvs) != len(orig_ipvs): if len(ipvs) < 1: raise FirewallError(errors.INVALID_ICMPTYPE, "No supported ICMP type.") new_obj = copy.deepcopy(obj) new_obj.destination = ipvs self._icmptypes[obj.name] = new_obj else: self._icmptypes[obj.name] = obj def remove_icmptype(self, icmptype): self.check_icmptype(icmptype) del self._icmptypes[icmptype] PK[|QӮӮ!site-packages/firewall/core/fw.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "Firewall" ] import os.path import sys import copy import time import traceback from firewall import config from firewall import functions from firewall.core import ipXtables from firewall.core import ebtables from firewall.core import nftables from firewall.core import ipset from firewall.core import modules from firewall.core.fw_icmptype import FirewallIcmpType from firewall.core.fw_service import FirewallService from firewall.core.fw_zone import FirewallZone from firewall.core.fw_direct import FirewallDirect from firewall.core.fw_config import FirewallConfig from firewall.core.fw_policies import FirewallPolicies from firewall.core.fw_ipset import FirewallIPSet from firewall.core.fw_transaction import FirewallTransaction from firewall.core.fw_helper import FirewallHelper from firewall.core.logger import log from firewall.core.io.firewalld_conf import firewalld_conf from firewall.core.io.direct import Direct from firewall.core.io.service import service_reader from firewall.core.io.icmptype import icmptype_reader from firewall.core.io.zone import zone_reader, Zone from firewall.core.io.ipset import ipset_reader from firewall.core.io.helper import helper_reader from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class Firewall # ############################################################################ class Firewall(object): def __init__(self): self._firewalld_conf = firewalld_conf(config.FIREWALLD_CONF) self.ip4tables_backend = ipXtables.ip4tables(self) self.ip4tables_enabled = True self.ip4tables_supported_icmp_types = [ ] self.ip6tables_backend = ipXtables.ip6tables(self) self.ip6tables_enabled = True self.ip6tables_supported_icmp_types = [ ] self.ebtables_backend = ebtables.ebtables() self.ebtables_enabled = True self.ipset_backend = ipset.ipset() self.ipset_enabled = True self.ipset_supported_types = [ ] self.nftables_backend = nftables.nftables(self) self.nftables_enabled = True self.modules_backend = modules.modules() self.icmptype = FirewallIcmpType(self) self.service = FirewallService(self) self.zone = FirewallZone(self) self.direct = FirewallDirect(self) self.config = FirewallConfig(self) self.policies = FirewallPolicies() self.ipset = FirewallIPSet(self) self.helper = FirewallHelper(self) self.__init_vars() def __repr__(self): return '%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)' % \ (self.__class__, self.ip4tables_enabled, self.ip6tables_enabled, self.ebtables_enabled, self._state, self._panic, self._default_zone, self._module_refcount, self._marks, self._min_mark, self.cleanup_on_exit, self.ipv6_rpfilter_enabled, self.ipset_enabled, self._individual_calls, self._log_denied, self._automatic_helpers) def __init_vars(self): self._state = "INIT" self._panic = False self._default_zone = "" self._module_refcount = { } self._marks = [ ] # fallback settings will be overloaded by firewalld.conf self._min_mark = config.FALLBACK_MINIMAL_MARK self.cleanup_on_exit = config.FALLBACK_CLEANUP_ON_EXIT self.ipv6_rpfilter_enabled = config.FALLBACK_IPV6_RPFILTER self._individual_calls = config.FALLBACK_INDIVIDUAL_CALLS self._log_denied = config.FALLBACK_LOG_DENIED self._automatic_helpers = config.FALLBACK_AUTOMATIC_HELPERS self._firewall_backend = config.FALLBACK_FIREWALL_BACKEND self.nf_conntrack_helper_setting = 0 self._allow_zone_drifting = config.FALLBACK_ALLOW_ZONE_DRIFTING def individual_calls(self): return self._individual_calls def _check_tables(self): # check if iptables, ip6tables and ebtables are usable, else disable if self.ip4tables_enabled and \ "filter" not in self.get_backend_by_ipv("ipv4").get_available_tables(): log.warning("iptables not usable, disabling IPv4 firewall.") self.ip4tables_enabled = False if self.ip6tables_enabled and \ "filter" not in self.get_backend_by_ipv("ipv6").get_available_tables(): log.warning("ip6tables not usable, disabling IPv6 firewall.") self.ip6tables_enabled = False if self.ebtables_enabled and \ "filter" not in self.get_backend_by_ipv("eb").get_available_tables(): log.warning("ebtables not usable, disabling ethernet bridge firewall.") self.ebtables_enabled = False # is there at least support for ipv4 or ipv6 if not self.ip4tables_enabled and not self.ip6tables_enabled \ and not self.nftables_enabled: log.fatal("No IPv4 and IPv6 firewall.") sys.exit(1) def _start_check(self): try: self.ipset_backend.set_list() except ValueError: log.warning("ipset not usable, disabling ipset usage in firewall.") # ipset is not usable, no supported types self.ipset_enabled = False self.ipset_supported_types = [ ] else: # ipset is usable, get all supported types self.ipset_supported_types = self.ipset_backend.set_supported_types() self.ip4tables_backend.fill_exists() if not self.ip4tables_backend.restore_command_exists: if self.ip4tables_backend.command_exists: log.warning("iptables-restore is missing, using " "individual calls for IPv4 firewall.") else: log.warning("iptables-restore and iptables are missing, " "disabling IPv4 firewall.") self.ip4tables_enabled = False if self.ip4tables_enabled: self.ip4tables_supported_icmp_types = \ self.ip4tables_backend.supported_icmp_types() else: self.ip4tables_supported_icmp_types = [ ] self.ip6tables_backend.fill_exists() if not self.ip6tables_backend.restore_command_exists: if self.ip6tables_backend.command_exists: log.warning("ip6tables-restore is missing, using " "individual calls for IPv6 firewall.") else: log.warning("ip6tables-restore and ip6tables are missing, " "disabling IPv6 firewall.") self.ip6tables_enabled = False if self.ip6tables_enabled: self.ip6tables_supported_icmp_types = \ self.ip6tables_backend.supported_icmp_types() else: self.ip6tables_supported_icmp_types = [ ] self.ebtables_backend.fill_exists() if not self.ebtables_backend.restore_command_exists: if self.ebtables_backend.command_exists: log.warning("ebtables-restore is missing, using " "individual calls for bridge firewall.") else: log.warning("ebtables-restore and ebtables are missing, " "disabling bridge firewall.") self.ebtables_enabled = False if self.ebtables_enabled and not self._individual_calls and \ not self.ebtables_backend.restore_noflush_option: log.debug1("ebtables-restore is not supporting the --noflush " "option, will therefore not be used") def _start(self, reload=False, complete_reload=False): # initialize firewall default_zone = config.FALLBACK_ZONE # load firewalld config log.debug1("Loading firewalld config file '%s'", config.FIREWALLD_CONF) try: self._firewalld_conf.read() except Exception as msg: log.warning(msg) log.warning("Using fallback firewalld configuration settings.") else: if self._firewalld_conf.get("DefaultZone"): default_zone = self._firewalld_conf.get("DefaultZone") if self._firewalld_conf.get("MinimalMark"): self._min_mark = int(self._firewalld_conf.get("MinimalMark")) if self._firewalld_conf.get("CleanupOnExit"): value = self._firewalld_conf.get("CleanupOnExit") if value is not None and value.lower() in [ "no", "false" ]: self.cleanup_on_exit = False log.debug1("CleanupOnExit is set to '%s'", self.cleanup_on_exit) if self._firewalld_conf.get("Lockdown"): value = self._firewalld_conf.get("Lockdown") if value is not None and value.lower() in [ "yes", "true" ]: log.debug1("Lockdown is enabled") try: self.policies.enable_lockdown() except FirewallError: # already enabled, this is probably reload pass if self._firewalld_conf.get("IPv6_rpfilter"): value = self._firewalld_conf.get("IPv6_rpfilter") if value is not None: if value.lower() in [ "no", "false" ]: self.ipv6_rpfilter_enabled = False if value.lower() in [ "yes", "true" ]: self.ipv6_rpfilter_enabled = True if self.ipv6_rpfilter_enabled: log.debug1("IPv6 rpfilter is enabled") else: log.debug1("IPV6 rpfilter is disabled") if self._firewalld_conf.get("IndividualCalls"): value = self._firewalld_conf.get("IndividualCalls") if value is not None and value.lower() in [ "yes", "true" ]: log.debug1("IndividualCalls is enabled") self._individual_calls = True if self._firewalld_conf.get("LogDenied"): value = self._firewalld_conf.get("LogDenied") if value is None or value.lower() == "no": self._log_denied = "off" else: self._log_denied = value.lower() log.debug1("LogDenied is set to '%s'", self._log_denied) if self._firewalld_conf.get("AutomaticHelpers"): value = self._firewalld_conf.get("AutomaticHelpers") if value is not None: if value.lower() in [ "no", "false" ]: self._automatic_helpers = "no" elif value.lower() in [ "yes", "true" ]: self._automatic_helpers = "yes" else: self._automatic_helpers = value.lower() log.debug1("AutomaticHelpers is set to '%s'", self._automatic_helpers) if self._firewalld_conf.get("AllowZoneDrifting"): value = self._firewalld_conf.get("AllowZoneDrifting") if value.lower() in [ "no", "false" ]: self._allow_zone_drifting = False else: self._allow_zone_drifting = True log.warning("AllowZoneDrifting is enabled. This is considered " "an insecure configuration option. It will be " "removed in a future release. Please consider " "disabling it now.") log.debug1("AllowZoneDrifting is set to '%s'", self._allow_zone_drifting) self.config.set_firewalld_conf(copy.deepcopy(self._firewalld_conf)) self._select_firewall_backend(self._firewall_backend) self._start_check() # load lockdown whitelist log.debug1("Loading lockdown whitelist") try: self.policies.lockdown_whitelist.read() except Exception as msg: if self.policies.query_lockdown(): log.error("Failed to load lockdown whitelist '%s': %s", self.policies.lockdown_whitelist.filename, msg) else: log.debug1("Failed to load lockdown whitelist '%s': %s", self.policies.lockdown_whitelist.filename, msg) # copy policies to config interface self.config.set_policies(copy.deepcopy(self.policies)) # load ipset files self._loader(config.FIREWALLD_IPSETS, "ipset") self._loader(config.ETC_FIREWALLD_IPSETS, "ipset") # load icmptype files self._loader(config.FIREWALLD_ICMPTYPES, "icmptype") self._loader(config.ETC_FIREWALLD_ICMPTYPES, "icmptype") if len(self.icmptype.get_icmptypes()) == 0: log.error("No icmptypes found.") # load helper files self._loader(config.FIREWALLD_HELPERS, "helper") self._loader(config.ETC_FIREWALLD_HELPERS, "helper") # load service files self._loader(config.FIREWALLD_SERVICES, "service") self._loader(config.ETC_FIREWALLD_SERVICES, "service") if len(self.service.get_services()) == 0: log.error("No services found.") # load zone files self._loader(config.FIREWALLD_ZONES, "zone") self._loader(config.ETC_FIREWALLD_ZONES, "zone") if len(self.zone.get_zones()) == 0: log.fatal("No zones found.") sys.exit(1) # check minimum required zones error = False for z in [ "block", "drop", "trusted" ]: if z not in self.zone.get_zones(): log.fatal("Zone '%s' is not available.", z) error = True if error: sys.exit(1) # check if default_zone is a valid zone if default_zone not in self.zone.get_zones(): if "public" in self.zone.get_zones(): zone = "public" elif "external" in self.zone.get_zones(): zone = "external" else: zone = "block" # block is a base zone, therefore it has to exist log.error("Default zone '%s' is not valid. Using '%s'.", default_zone, zone) default_zone = zone else: log.debug1("Using default zone '%s'", default_zone) # load direct rules obj = Direct(config.FIREWALLD_DIRECT) if os.path.exists(config.FIREWALLD_DIRECT): log.debug1("Loading direct rules file '%s'" % \ config.FIREWALLD_DIRECT) try: obj.read() except Exception as msg: log.error("Failed to load direct rules file '%s': %s", config.FIREWALLD_DIRECT, msg) self.direct.set_permanent_config(obj) self.config.set_direct(copy.deepcopy(obj)) # automatic helpers # # NOTE: must force loading of nf_conntrack to make sure the values are # available in /proc (status, msg) = self.handle_modules(["nf_conntrack"], True) if status != 0: log.warning("Failed to load nf_conntrack module: %s" % msg) if self._automatic_helpers != "system": functions.set_nf_conntrack_helper_setting(self._automatic_helpers == "yes") self.nf_conntrack_helper_setting = \ functions.get_nf_conntrack_helper_setting() # check if needed tables are there self._check_tables() if log.getDebugLogLevel() > 0: # get time before flushing and applying tm1 = time.time() # Start transaction transaction = FirewallTransaction(self) # flush rules self.flush(use_transaction=transaction) # If modules need to be unloaded in complete reload or if there are # ipsets to get applied, limit the transaction to flush. # # Future optimization for the ipset case in reload: The transaction # only needs to be split here if there are conflicting ipset types in # exsting ipsets and the configuration in firewalld. if (reload and complete_reload) or \ (self.ipset_enabled and self.ipset.has_ipsets()): transaction.execute(True) transaction.clear() # complete reload: unload modules also if reload and complete_reload: log.debug1("Unloading firewall modules") self.modules_backend.unload_firewall_modules() self.apply_default_tables(use_transaction=transaction) transaction.execute(True) transaction.clear() # apply settings for loaded ipsets while reloading here if self.ipset_enabled and self.ipset.has_ipsets(): log.debug1("Applying ipsets") self.ipset.apply_ipsets() # Start or continue with transaction # apply default rules log.debug1("Applying default rule set") self.apply_default_rules(use_transaction=transaction) # apply settings for loaded zones log.debug1("Applying used zones") self.zone.apply_zones(use_transaction=transaction) self._default_zone = self.check_zone(default_zone) self.zone.change_default_zone(None, self._default_zone, use_transaction=transaction) # Execute transaction transaction.execute(True) # Start new transaction for direct rules transaction.clear() # apply direct chains, rules and passthrough rules if self.direct.has_configuration(): log.debug1("Applying direct chains rules and passthrough rules") self.direct.apply_direct(transaction) # since direct rules are easy to make syntax errors lets highlight # the cause if the transaction fails. try: transaction.execute(True) transaction.clear() except FirewallError as e: raise FirewallError(e.code, "Direct: %s" % (e.msg if e.msg else "")) except Exception: raise del transaction if log.getDebugLogLevel() > 1: # get time after flushing and applying tm2 = time.time() log.debug2("Flushing and applying took %f seconds" % (tm2 - tm1)) def start(self): try: self._start() except Exception: self._state = "FAILED" self.set_policy("ACCEPT") raise else: self._state = "RUNNING" self.set_policy("ACCEPT") def _loader(self, path, reader_type, combine=False): # combine: several zone files are getting combined into one obj if not os.path.isdir(path): return if combine: if path.startswith(config.ETC_FIREWALLD) and reader_type == "zone": combined_zone = Zone() combined_zone.name = os.path.basename(path) combined_zone.check_name(combined_zone.name) combined_zone.path = path combined_zone.default = False else: combine = False for filename in sorted(os.listdir(path)): if not filename.endswith(".xml"): if path.startswith(config.ETC_FIREWALLD) and \ reader_type == "zone" and \ os.path.isdir("%s/%s" % (path, filename)): self._loader("%s/%s" % (path, filename), reader_type, combine=True) continue name = "%s/%s" % (path, filename) log.debug1("Loading %s file '%s'", reader_type, name) try: if reader_type == "icmptype": obj = icmptype_reader(filename, path) if obj.name in self.icmptype.get_icmptypes(): orig_obj = self.icmptype.get_icmptype(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.icmptype.remove_icmptype(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True try: self.icmptype.add_icmptype(obj) except FirewallError as error: log.info1("%s: %s, ignoring for run-time." % \ (obj.name, str(error))) # add a deep copy to the configuration interface self.config.add_icmptype(copy.deepcopy(obj)) elif reader_type == "service": obj = service_reader(filename, path) if obj.name in self.service.get_services(): orig_obj = self.service.get_service(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.service.remove_service(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True self.service.add_service(obj) # add a deep copy to the configuration interface self.config.add_service(copy.deepcopy(obj)) elif reader_type == "zone": obj = zone_reader(filename, path, no_check_name=combine) if combine: # Change name for permanent configuration obj.name = "%s/%s" % ( os.path.basename(path), os.path.basename(filename)[0:-4]) obj.check_name(obj.name) # Copy object before combine config_obj = copy.deepcopy(obj) if obj.name in self.zone.get_zones(): orig_obj = self.zone.get_zone(obj.name) self.zone.remove_zone(orig_obj.name) if orig_obj.combined: log.debug1(" Combining %s '%s' ('%s/%s')", reader_type, obj.name, path, filename) obj.combine(orig_obj) else: log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True config_obj.default = True self.config.add_zone(config_obj) if combine: log.debug1(" Combining %s '%s' ('%s/%s')", reader_type, combined_zone.name, path, filename) combined_zone.combine(obj) else: self.zone.add_zone(obj) elif reader_type == "ipset": obj = ipset_reader(filename, path) if obj.name in self.ipset.get_ipsets(): orig_obj = self.ipset.get_ipset(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.ipset.remove_ipset(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True try: self.ipset.add_ipset(obj) except FirewallError as error: log.warning("%s: %s, ignoring for run-time." % \ (obj.name, str(error))) # add a deep copy to the configuration interface self.config.add_ipset(copy.deepcopy(obj)) elif reader_type == "helper": obj = helper_reader(filename, path) if obj.name in self.helper.get_helpers(): orig_obj = self.helper.get_helper(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.helper.remove_helper(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True self.helper.add_helper(obj) # add a deep copy to the configuration interface self.config.add_helper(copy.deepcopy(obj)) else: log.fatal("Unknown reader type %s", reader_type) except FirewallError as msg: log.error("Failed to load %s file '%s': %s", reader_type, name, msg) except Exception: log.error("Failed to load %s file '%s':", reader_type, name) log.exception() if combine and combined_zone.combined: if combined_zone.name in self.zone.get_zones(): orig_obj = self.zone.get_zone(combined_zone.name) log.debug1(" Overloading and deactivating %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) try: self.zone.remove_zone(combined_zone.name) except Exception: pass self.config.forget_zone(combined_zone.name) self.zone.add_zone(combined_zone) def cleanup(self): self.icmptype.cleanup() self.service.cleanup() self.zone.cleanup() self.ipset.cleanup() self.helper.cleanup() self.config.cleanup() self.direct.cleanup() self.policies.cleanup() self._firewalld_conf.cleanup() self.__init_vars() def stop(self): if self.cleanup_on_exit: self.flush() self.set_policy("ACCEPT") self.modules_backend.unload_firewall_modules() self.cleanup() # marks def new_mark(self): # return first unused mark i = self._min_mark while i in self._marks: i += 1 self._marks.append(i) return i def del_mark(self, mark): self._marks.remove(mark) # handle modules def handle_modules(self, _modules, enable): num_failed = 0 error_msgs = "" for i,module in enumerate(_modules): if enable: (status, msg) = self.modules_backend.load_module(module) else: if self._module_refcount[module] > 1: status = 0 # module referenced more then one, do not unload else: (status, msg) = self.modules_backend.unload_module(module) if status != 0: num_failed += 1 error_msgs += msg continue if enable: self._module_refcount.setdefault(module, 0) self._module_refcount[module] += 1 else: if module in self._module_refcount: self._module_refcount[module] -= 1 if self._module_refcount[module] == 0: del self._module_refcount[module] return (num_failed, error_msgs) def _select_firewall_backend(self, backend): if backend != "nftables": self.nftables_enabled = False # even if using nftables, the other backends are enabled for use with # the direct interface. nftables is used for the firewalld primitives. def get_backend_by_name(self, name): for backend in self.all_backends(): if backend.name == name: return backend raise FirewallError(errors.UNKNOWN_ERROR, "'%s' backend does not exist" % name) def get_backend_by_ipv(self, ipv): if self.nftables_enabled: return self.nftables_backend if ipv == "ipv4" and self.ip4tables_enabled: return self.ip4tables_backend elif ipv == "ipv6" and self.ip6tables_enabled: return self.ip6tables_backend elif ipv == "eb" and self.ebtables_enabled: return self.ebtables_backend raise FirewallError(errors.INVALID_IPV, "'%s' is not a valid backend or is unavailable" % ipv) def get_direct_backend_by_ipv(self, ipv): if ipv == "ipv4" and self.ip4tables_enabled: return self.ip4tables_backend elif ipv == "ipv6" and self.ip6tables_enabled: return self.ip6tables_backend elif ipv == "eb" and self.ebtables_enabled: return self.ebtables_backend raise FirewallError(errors.INVALID_IPV, "'%s' is not a valid backend or is unavailable" % ipv) def is_backend_enabled(self, name): if name == "ip4tables": return self.ip4tables_enabled elif name == "ip6tables": return self.ip6tables_enabled elif name == "ebtables": return self.ebtables_enabled elif name == "nftables": return self.nftables_enabled return False def is_ipv_enabled(self, ipv): if self.nftables_enabled: return True if ipv == "ipv4": return self.ip4tables_enabled elif ipv == "ipv6": return self.ip6tables_enabled elif ipv == "eb": return self.ebtables_enabled return False def enabled_backends(self): backends = [] if self.nftables_enabled: backends.append(self.nftables_backend) else: if self.ip4tables_enabled: backends.append(self.ip4tables_backend) if self.ip6tables_enabled: backends.append(self.ip6tables_backend) if self.ebtables_enabled: backends.append(self.ebtables_backend) return backends def all_backends(self): backends = [] if self.ip4tables_enabled: backends.append(self.ip4tables_backend) if self.ip6tables_enabled: backends.append(self.ip6tables_backend) if self.ebtables_enabled: backends.append(self.ebtables_backend) if self.nftables_enabled: backends.append(self.nftables_backend) return backends def apply_default_tables(self, use_transaction=None): if use_transaction is None: transaction = FirewallTransaction(self) else: transaction = use_transaction for backend in self.enabled_backends(): transaction.add_rules(backend, backend.build_default_tables()) if use_transaction is None: transaction.execute(True) def apply_default_rules(self, use_transaction=None): if use_transaction is None: transaction = FirewallTransaction(self) else: transaction = use_transaction for backend in self.enabled_backends(): rules = backend.build_default_rules(self._log_denied) transaction.add_rules(backend, rules) if self.is_ipv_enabled("ipv6"): ipv6_backend = self.get_backend_by_ipv("ipv6") if self.ipv6_rpfilter_enabled and \ "raw" in ipv6_backend.get_available_tables(): # Execute existing transaction transaction.execute(True) # Start new transaction transaction.clear() rules = ipv6_backend.build_rpfilter_rules(self._log_denied) transaction.add_rules(ipv6_backend, rules) # Execute ipv6_rpfilter transaction, it might fail try: transaction.execute(True) except FirewallError as msg: log.warning("Applying rules for ipv6_rpfilter failed: %s", msg) # Start new transaction transaction.clear() if use_transaction is None: transaction.execute(True) # flush and policy def flush(self, use_transaction=None): if use_transaction is None: transaction = FirewallTransaction(self) else: transaction = use_transaction log.debug1("Flushing rule set") for backend in self.all_backends(): rules = backend.build_flush_rules() transaction.add_rules(backend, rules) if use_transaction is None: transaction.execute(True) def set_policy(self, policy, use_transaction=None): if use_transaction is None: transaction = FirewallTransaction(self) else: transaction = use_transaction log.debug1("Setting policy to '%s'", policy) for backend in self.enabled_backends(): rules = backend.build_set_policy_rules(policy) transaction.add_rules(backend, rules) if use_transaction is None: transaction.execute(True) # rule function used in handle_ functions def rule(self, backend_name, rule): if not rule: return "" backend = self.get_backend_by_name(backend_name) if not backend: raise FirewallError(errors.INVALID_IPV, "'%s' is not a valid backend" % backend_name) if not self.is_backend_enabled(backend_name): return "" return backend.set_rule(rule, self._log_denied) def rules(self, backend_name, rules): _rules = list(filter(None, rules)) backend = self.get_backend_by_name(backend_name) if not backend: raise FirewallError(errors.INVALID_IPV, "'%s' is not a valid backend" % backend_name) if not self.is_backend_enabled(backend_name): return "" if self._individual_calls or \ not backend.restore_command_exists or \ (backend_name == "ebtables" and not self.ebtables_backend.restore_noflush_option): for i,rule in enumerate(_rules): try: backend.set_rule(rule, self._log_denied) except Exception as msg: log.debug1(traceback.format_exc()) log.error(msg) for rule in reversed(_rules[:i]): try: backend.set_rule(backend.reverse_rule(rule), self._log_denied) except Exception: # ignore errors here pass raise msg return True else: return backend.set_rules(_rules, self._log_denied) # check functions def check_panic(self): if self._panic: raise FirewallError(errors.PANIC_MODE) def check_zone(self, zone): _zone = zone if not _zone or _zone == "": _zone = self.get_default_zone() if _zone not in self.zone.get_zones(): raise FirewallError(errors.INVALID_ZONE, _zone) return _zone def check_interface(self, interface): if not functions.checkInterface(interface): raise FirewallError(errors.INVALID_INTERFACE, interface) def check_service(self, service): self.service.check_service(service) def check_port(self, port): if not functions.check_port(port): raise FirewallError(errors.INVALID_PORT, port) def check_tcpudp(self, protocol): if not protocol: raise FirewallError(errors.MISSING_PROTOCOL) if protocol not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, "'%s' not in {'tcp'|'udp'|'sctp'|'dccp'}" % \ protocol) def check_ip(self, ip): if not functions.checkIP(ip): raise FirewallError(errors.INVALID_ADDR, ip) def check_address(self, ipv, source): if ipv == "ipv4": if not functions.checkIPnMask(source): raise FirewallError(errors.INVALID_ADDR, source) elif ipv == "ipv6": if not functions.checkIP6nMask(source): raise FirewallError(errors.INVALID_ADDR, source) else: raise FirewallError(errors.INVALID_IPV, "'%s' not in {'ipv4'|'ipv6'}") def check_icmptype(self, icmp): self.icmptype.check_icmptype(icmp) def check_timeout(self, timeout): if not isinstance(timeout, int): raise TypeError("%s is %s, expected int" % (timeout, type(timeout))) if int(timeout) < 0: raise FirewallError(errors.INVALID_VALUE, "timeout '%d' is not positive number" % timeout) # RELOAD def reload(self, stop=False): _panic = self._panic # save zone interfaces _zone_interfaces = { } for zone in self.zone.get_zones(): _zone_interfaces[zone] = self.zone.get_settings(zone)["interfaces"] # save direct config _direct_config = self.direct.get_runtime_config() _old_dz = self.get_default_zone() self.set_policy("DROP") # stop self.cleanup() start_exception = None try: self._start(reload=True, complete_reload=stop) except Exception as e: # save the exception for later, but continue restoring interfaces, # etc. We'll re-raise it at the end. start_exception = e # handle interfaces in the default zone and move them to the new # default zone if it changed _new_dz = self.get_default_zone() if _new_dz != _old_dz: # if_new_dz has been introduced with the reload, we need to add it # https://github.com/firewalld/firewalld/issues/53 if _new_dz not in _zone_interfaces: _zone_interfaces[_new_dz] = { } # default zone changed. Move interfaces from old default zone to # the new one. for iface, settings in list(_zone_interfaces[_old_dz].items()): if settings["__default__"]: # move only those that were added to default zone # (not those that were added to specific zone same as # default) _zone_interfaces[_new_dz][iface] = \ _zone_interfaces[_old_dz][iface] del _zone_interfaces[_old_dz][iface] # add interfaces to zones again for zone in self.zone.get_zones(): if zone in _zone_interfaces: self.zone.set_settings(zone, { "interfaces": _zone_interfaces[zone] }) del _zone_interfaces[zone] else: log.info1("New zone '%s'.", zone) if len(_zone_interfaces) > 0: for zone in list(_zone_interfaces.keys()): log.info1("Lost zone '%s', zone interfaces dropped.", zone) del _zone_interfaces[zone] del _zone_interfaces # restore direct config self.direct.set_config(_direct_config) # enable panic mode again if it has been enabled before or set policy # to ACCEPT if _panic: self.enable_panic_mode() else: self.set_policy("ACCEPT") if start_exception: self._state = "FAILED" raise start_exception else: self._state = "RUNNING" # STATE def get_state(self): return self._state # PANIC MODE def enable_panic_mode(self): if self._panic: raise FirewallError(errors.ALREADY_ENABLED, "panic mode already enabled") # TODO: use rule in raw table not default chain policy try: self.set_policy("DROP") except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) self._panic = True def disable_panic_mode(self): if not self._panic: raise FirewallError(errors.NOT_ENABLED, "panic mode is not enabled") # TODO: use rule in raw table not default chain policy try: self.set_policy("ACCEPT") except Exception as msg: raise FirewallError(errors.COMMAND_FAILED, msg) self._panic = False def query_panic_mode(self): return self._panic # LOG DENIED def get_log_denied(self): return self._log_denied def set_log_denied(self, value): if value not in config.LOG_DENIED_VALUES: raise FirewallError(errors.INVALID_VALUE, "'%s', choose from '%s'" % \ (value, "','".join(config.LOG_DENIED_VALUES))) if value != self.get_log_denied(): self._log_denied = value self._firewalld_conf.set("LogDenied", value) self._firewalld_conf.write() else: raise FirewallError(errors.ALREADY_SET, value) # AUTOMATIC HELPERS def get_automatic_helpers(self): return self._automatic_helpers def set_automatic_helpers(self, value): if value not in config.AUTOMATIC_HELPERS_VALUES: raise FirewallError(errors.INVALID_VALUE, "'%s', choose from '%s'" % \ (value, "','".join(config.AUTOMATIC_HELPERS_VALUES))) if value != self.get_automatic_helpers(): self._automatic_helpers = value self._firewalld_conf.set("AutomaticHelpers", value) self._firewalld_conf.write() else: raise FirewallError(errors.ALREADY_SET, value) # DEFAULT ZONE def get_default_zone(self): return self._default_zone def set_default_zone(self, zone): _zone = self.check_zone(zone) if _zone != self._default_zone: _old_dz = self._default_zone self._default_zone = _zone self._firewalld_conf.set("DefaultZone", _zone) self._firewalld_conf.write() # remove old default zone from ZONES and add new default zone self.zone.change_default_zone(_old_dz, _zone) # Move interfaces from old default zone to the new one. _old_dz_settings = self.zone.get_settings(_old_dz) for iface, settings in list(_old_dz_settings["interfaces"].items()): if settings["__default__"]: # move only those that were added to default zone # (not those that were added to specific zone same as default) self.zone.change_zone_of_interface("", iface) else: raise FirewallError(errors.ZONE_ALREADY_SET, _zone) PK[nF"]9X9X&site-packages/firewall/core/fw_test.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "Firewall_test" ] import os.path import sys import copy from firewall import config from firewall import functions from firewall.core.fw_icmptype import FirewallIcmpType from firewall.core.fw_service import FirewallService from firewall.core.fw_zone import FirewallZone from firewall.core.fw_direct import FirewallDirect from firewall.core.fw_config import FirewallConfig from firewall.core.fw_policies import FirewallPolicies from firewall.core.fw_ipset import FirewallIPSet from firewall.core.fw_helper import FirewallHelper from firewall.core.logger import log from firewall.core.io.firewalld_conf import firewalld_conf from firewall.core.io.direct import Direct from firewall.core.io.service import service_reader from firewall.core.io.icmptype import icmptype_reader from firewall.core.io.zone import zone_reader, Zone from firewall.core.io.ipset import ipset_reader from firewall.core.ipset import IPSET_TYPES from firewall.core.io.helper import helper_reader from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class Firewall # ############################################################################ class Firewall_test(object): def __init__(self): self._firewalld_conf = firewalld_conf(config.FIREWALLD_CONF) self.ip4tables_enabled = False self.ip6tables_enabled = False self.ebtables_enabled = False self.ipset_enabled = False self.ipset_supported_types = IPSET_TYPES self.icmptype = FirewallIcmpType(self) self.service = FirewallService(self) self.zone = FirewallZone(self) self.direct = FirewallDirect(self) self.config = FirewallConfig(self) self.policies = FirewallPolicies() self.ipset = FirewallIPSet(self) self.helper = FirewallHelper(self) self.__init_vars() def __repr__(self): return '%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)' % \ (self.__class__, self.ip4tables_enabled, self.ip6tables_enabled, self.ebtables_enabled, self._state, self._panic, self._default_zone, self._module_refcount, self._marks, self._min_mark, self.cleanup_on_exit, self.ipv6_rpfilter_enabled, self.ipset_enabled, self._individual_calls, self._log_denied, self._automatic_helpers) def __init_vars(self): self._state = "INIT" self._panic = False self._default_zone = "" self._module_refcount = { } self._marks = [ ] # fallback settings will be overloaded by firewalld.conf self._min_mark = config.FALLBACK_MINIMAL_MARK self.cleanup_on_exit = config.FALLBACK_CLEANUP_ON_EXIT self.ipv6_rpfilter_enabled = config.FALLBACK_IPV6_RPFILTER self._individual_calls = config.FALLBACK_INDIVIDUAL_CALLS self._log_denied = config.FALLBACK_LOG_DENIED self._automatic_helpers = config.FALLBACK_AUTOMATIC_HELPERS def individual_calls(self): return self._individual_calls def _start(self, reload=False, complete_reload=False): # initialize firewall default_zone = config.FALLBACK_ZONE # load firewalld config log.debug1("Loading firewalld config file '%s'", config.FIREWALLD_CONF) try: self._firewalld_conf.read() except Exception: log.warning("Using fallback firewalld configuration settings.") else: if self._firewalld_conf.get("DefaultZone"): default_zone = self._firewalld_conf.get("DefaultZone") if self._firewalld_conf.get("MinimalMark"): self._min_mark = int(self._firewalld_conf.get("MinimalMark")) if self._firewalld_conf.get("CleanupOnExit"): value = self._firewalld_conf.get("CleanupOnExit") if value is not None and value.lower() in [ "no", "false" ]: self.cleanup_on_exit = False if self._firewalld_conf.get("Lockdown"): value = self._firewalld_conf.get("Lockdown") if value is not None and value.lower() in [ "yes", "true" ]: log.debug1("Lockdown is enabled") try: self.policies.enable_lockdown() except FirewallError: # already enabled, this is probably reload pass if self._firewalld_conf.get("IPv6_rpfilter"): value = self._firewalld_conf.get("IPv6_rpfilter") if value is not None: if value.lower() in [ "no", "false" ]: self.ipv6_rpfilter_enabled = False if value.lower() in [ "yes", "true" ]: self.ipv6_rpfilter_enabled = True if self.ipv6_rpfilter_enabled: log.debug1("IPv6 rpfilter is enabled") else: log.debug1("IPV6 rpfilter is disabled") if self._firewalld_conf.get("IndividualCalls"): value = self._firewalld_conf.get("IndividualCalls") if value is not None and value.lower() in [ "yes", "true" ]: log.debug1("IndividualCalls is enabled") self._individual_calls = True if self._firewalld_conf.get("LogDenied"): value = self._firewalld_conf.get("LogDenied") if value is None or value.lower() == "no": self._log_denied = "off" else: self._log_denied = value.lower() log.debug1("LogDenied is set to '%s'", self._log_denied) if self._firewalld_conf.get("AutomaticHelpers"): value = self._firewalld_conf.get("AutomaticHelpers") if value is not None: if value.lower() in [ "no", "false" ]: self._automatic_helpers = "no" elif value.lower() in [ "yes", "true" ]: self._automatic_helpers = "yes" else: self._automatic_helpers = value.lower() log.debug1("AutomaticHelpers is set to '%s'", self._automatic_helpers) self.config.set_firewalld_conf(copy.deepcopy(self._firewalld_conf)) # load lockdown whitelist log.debug1("Loading lockdown whitelist") try: self.policies.lockdown_whitelist.read() except Exception as msg: if self.policies.query_lockdown(): log.error("Failed to load lockdown whitelist '%s': %s", self.policies.lockdown_whitelist.filename, msg) else: log.debug1("Failed to load lockdown whitelist '%s': %s", self.policies.lockdown_whitelist.filename, msg) # copy policies to config interface self.config.set_policies(copy.deepcopy(self.policies)) # load ipset files self._loader(config.FIREWALLD_IPSETS, "ipset") self._loader(config.ETC_FIREWALLD_IPSETS, "ipset") # load icmptype files self._loader(config.FIREWALLD_ICMPTYPES, "icmptype") self._loader(config.ETC_FIREWALLD_ICMPTYPES, "icmptype") if len(self.icmptype.get_icmptypes()) == 0: log.error("No icmptypes found.") # load helper files self._loader(config.FIREWALLD_HELPERS, "helper") self._loader(config.ETC_FIREWALLD_HELPERS, "helper") # load service files self._loader(config.FIREWALLD_SERVICES, "service") self._loader(config.ETC_FIREWALLD_SERVICES, "service") if len(self.service.get_services()) == 0: log.error("No services found.") # load zone files self._loader(config.FIREWALLD_ZONES, "zone") self._loader(config.ETC_FIREWALLD_ZONES, "zone") if len(self.zone.get_zones()) == 0: log.fatal("No zones found.") sys.exit(1) # check minimum required zones error = False for z in [ "block", "drop", "trusted" ]: if z not in self.zone.get_zones(): log.fatal("Zone '%s' is not available.", z) error = True if error: sys.exit(1) # check if default_zone is a valid zone if default_zone not in self.zone.get_zones(): if "public" in self.zone.get_zones(): zone = "public" elif "external" in self.zone.get_zones(): zone = "external" else: zone = "block" # block is a base zone, therefore it has to exist log.error("Default zone '%s' is not valid. Using '%s'.", default_zone, zone) default_zone = zone else: log.debug1("Using default zone '%s'", default_zone) # load direct rules obj = Direct(config.FIREWALLD_DIRECT) if os.path.exists(config.FIREWALLD_DIRECT): log.debug1("Loading direct rules file '%s'" % \ config.FIREWALLD_DIRECT) try: obj.read() except Exception as msg: log.error("Failed to load direct rules file '%s': %s", config.FIREWALLD_DIRECT, msg) self.config.set_direct(copy.deepcopy(obj)) self._default_zone = self.check_zone(default_zone) self._state = "RUNNING" def start(self): self._start() def _loader(self, path, reader_type, combine=False): # combine: several zone files are getting combined into one obj if not os.path.isdir(path): return if combine: if path.startswith(config.ETC_FIREWALLD) and reader_type == "zone": combined_zone = Zone() combined_zone.name = os.path.basename(path) combined_zone.check_name(combined_zone.name) combined_zone.path = path combined_zone.default = False else: combine = False for filename in sorted(os.listdir(path)): if not filename.endswith(".xml"): if path.startswith(config.ETC_FIREWALLD) and \ reader_type == "zone" and \ os.path.isdir("%s/%s" % (path, filename)): self._loader("%s/%s" % (path, filename), reader_type, combine=True) continue name = "%s/%s" % (path, filename) log.debug1("Loading %s file '%s'", reader_type, name) try: if reader_type == "icmptype": obj = icmptype_reader(filename, path) if obj.name in self.icmptype.get_icmptypes(): orig_obj = self.icmptype.get_icmptype(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.icmptype.remove_icmptype(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True self.icmptype.add_icmptype(obj) # add a deep copy to the configuration interface self.config.add_icmptype(copy.deepcopy(obj)) elif reader_type == "service": obj = service_reader(filename, path) if obj.name in self.service.get_services(): orig_obj = self.service.get_service(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.service.remove_service(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True self.service.add_service(obj) # add a deep copy to the configuration interface self.config.add_service(copy.deepcopy(obj)) elif reader_type == "zone": obj = zone_reader(filename, path, no_check_name=combine) if combine: # Change name for permanent configuration obj.name = "%s/%s" % ( os.path.basename(path), os.path.basename(filename)[0:-4]) obj.check_name(obj.name) # Copy object before combine config_obj = copy.deepcopy(obj) if obj.name in self.zone.get_zones(): orig_obj = self.zone.get_zone(obj.name) self.zone.remove_zone(orig_obj.name) if orig_obj.combined: log.debug1(" Combining %s '%s' ('%s/%s')", reader_type, obj.name, path, filename) obj.combine(orig_obj) else: log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True config_obj.default = True self.config.add_zone(config_obj) if combine: log.debug1(" Combining %s '%s' ('%s/%s')", reader_type, combined_zone.name, path, filename) combined_zone.combine(obj) else: self.zone.add_zone(obj) elif reader_type == "ipset": obj = ipset_reader(filename, path) if obj.name in self.ipset.get_ipsets(): orig_obj = self.ipset.get_ipset(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.ipset.remove_ipset(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True self.ipset.add_ipset(obj) # add a deep copy to the configuration interface self.config.add_ipset(copy.deepcopy(obj)) elif reader_type == "helper": obj = helper_reader(filename, path) if obj.name in self.helper.get_helpers(): orig_obj = self.helper.get_helper(obj.name) log.debug1(" Overloads %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) self.helper.remove_helper(orig_obj.name) elif obj.path.startswith(config.ETC_FIREWALLD): obj.default = True self.helper.add_helper(obj) # add a deep copy to the configuration interface self.config.add_helper(copy.deepcopy(obj)) else: log.fatal("Unknown reader type %s", reader_type) except FirewallError as msg: log.error("Failed to load %s file '%s': %s", reader_type, name, msg) except Exception: log.error("Failed to load %s file '%s':", reader_type, name) log.exception() if combine and combined_zone.combined: if combined_zone.name in self.zone.get_zones(): orig_obj = self.zone.get_zone(combined_zone.name) log.debug1(" Overloading and deactivating %s '%s' ('%s/%s')", reader_type, orig_obj.name, orig_obj.path, orig_obj.filename) try: self.zone.remove_zone(combined_zone.name) except: pass self.config.forget_zone(combined_zone.name) self.zone.add_zone(combined_zone) def cleanup(self): self.icmptype.cleanup() self.service.cleanup() self.zone.cleanup() self.ipset.cleanup() self.helper.cleanup() self.config.cleanup() self.direct.cleanup() self.policies.cleanup() self._firewalld_conf.cleanup() self.__init_vars() def stop(self): self.cleanup() # check functions def check_panic(self): return def check_zone(self, zone): _zone = zone if not _zone or _zone == "": _zone = self.get_default_zone() if _zone not in self.zone.get_zones(): raise FirewallError(errors.INVALID_ZONE, _zone) return _zone def check_interface(self, interface): if not functions.checkInterface(interface): raise FirewallError(errors.INVALID_INTERFACE, interface) def check_service(self, service): self.service.check_service(service) def check_port(self, port): range = functions.getPortRange(port) if range == -2 or range == -1 or range is None or \ (len(range) == 2 and range[0] >= range[1]): if range == -2: log.debug1("'%s': port > 65535" % port) elif range == -1: log.debug1("'%s': port is invalid" % port) elif range is None: log.debug1("'%s': port is ambiguous" % port) elif len(range) == 2 and range[0] >= range[1]: log.debug1("'%s': range start >= end" % port) raise FirewallError(errors.INVALID_PORT, port) def check_tcpudp(self, protocol): if not protocol: raise FirewallError(errors.MISSING_PROTOCOL) if protocol not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, "'%s' not in {'tcp'|'udp'|'sctp'|'dccp'}" % \ protocol) def check_ip(self, ip): if not functions.checkIP(ip): raise FirewallError(errors.INVALID_ADDR, ip) def check_address(self, ipv, source): if ipv == "ipv4": if not functions.checkIPnMask(source): raise FirewallError(errors.INVALID_ADDR, source) elif ipv == "ipv6": if not functions.checkIP6nMask(source): raise FirewallError(errors.INVALID_ADDR, source) else: raise FirewallError(errors.INVALID_IPV, "'%s' not in {'ipv4'|'ipv6'}") def check_icmptype(self, icmp): self.icmptype.check_icmptype(icmp) # RELOAD def reload(self, stop=False): return # STATE def get_state(self): return self._state # PANIC MODE def enable_panic_mode(self): return def disable_panic_mode(self): return def query_panic_mode(self): return self._panic # LOG DENIED def get_log_denied(self): return self._log_denied def set_log_denied(self, value): if value not in config.LOG_DENIED_VALUES: raise FirewallError(errors.INVALID_VALUE, "'%s', choose from '%s'" % \ (value, "','".join(config.LOG_DENIED_VALUES))) if value != self.get_log_denied(): self._log_denied = value self._firewalld_conf.set("LogDenied", value) self._firewalld_conf.write() # now reload the firewall self.reload() else: raise FirewallError(errors.ALREADY_SET, value) # AUTOMATIC HELPERS def get_automatic_helpers(self): return self._automatic_helpers def set_automatic_helpers(self, value): if value not in config.AUTOMATIC_HELPERS_VALUES: raise FirewallError(errors.INVALID_VALUE, "'%s', choose from '%s'" % \ (value, "','".join(config.AUTOMATIC_HELPERS_VALUES))) if value != self.get_automatic_helpers(): self._automatic_helpers = value self._firewalld_conf.set("AutomaticHelpers", value) self._firewalld_conf.write() # now reload the firewall self.reload() else: raise FirewallError(errors.ALREADY_SET, value) # DEFAULT ZONE def get_default_zone(self): return self._default_zone def set_default_zone(self, zone): _zone = self.check_zone(zone) if _zone != self._default_zone: self._default_zone = _zone self._firewalld_conf.set("DefaultZone", _zone) self._firewalld_conf.write() else: raise FirewallError(errors.ZONE_ALREADY_SET, _zone) # lockdown def enable_lockdown(self): self._firewalld_conf.set("Lockdown", "yes") self._firewalld_conf.write() def disable_lockdown(self): self._firewalld_conf.set("Lockdown", "no") self._firewalld_conf.write() PK[i֑ +site-packages/firewall/core/fw_icmptype.pycnu[ c`c@s_dgZddlZddlmZddlmZddlmZdefdYZ dS(tFirewallIcmpTypeiN(tlog(terrors(t FirewallErrorcBsPeZdZdZdZdZdZdZdZdZ RS(cCs||_i|_dS(N(t_fwt _icmptypes(tselftfw((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt__init__s cCsd|j|jfS(Ns%s(%r)(t __class__R(R((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt__repr__"scCs|jjdS(N(Rtclear(R((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pytcleanup%scCst|jjS(N(tsortedRtkeys(R((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt get_icmptypes*scCs(||jkr$ttj|ndS(N(RRRtINVALID_ICMPTYPE(Rticmptype((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pytcheck_icmptype-scCs|j||j|S(N(RR(RR((s=/usr/lib/python2.7/site-packages/firewall/core/fw_icmptype.pyt get_icmptype1s cCs_|j}t|dkr*ddg}n|}x|D]}|dkrk|jjs\q8n|jj}n3|dkr|jjsq8n|jj}ng}|jj|kr8t j d|j|f|j |q8q8Wt|t|krKt|dkr t t jdntj|}||_||j|js  PK[ZZ(site-packages/firewall/core/fw_ifcfg.pycnu[ c`c@spdZddgZddlZddlZddlmZddlmZddlm Z dZ d Z dS( s.Functions to search for and change ifcfg filestsearch_ifcfg_of_interfacetifcfg_set_zone_of_interfaceiN(tconfig(tlog(tifcfgcCstjjtjsd SxttjtjD]}|jdsMq2nx5ddddddgD]}|j |rfqfqfqfWd|krq2nt d tj|f}|j |j d |kr2|Sq2Wd tj|f}tjj|rt |}|j |Sd S( s6search ifcfg file for the interface in config.IFCFGDIRsifcfg-s.baks.origs.rpmnews.rpmorigs.rpmsaves-ranget.s%s/%stDEVICEs %s/ifcfg-%sN( tostpathtexistsRtIFCFGDIRtNonetsortedtlistdirt startswithtendswithRtreadtget(t interfacetfilenametignoredt ifcfg_file((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ifcfg.pyR!s*      cCs|dkrd}nt|}|dk r|jd|kr|jddko`|dk rtjd||jf|jd||jndS(sYSet zone (ZONE=) in the ifcfg file that uses the interface (DEVICE=)ttZONEsSetting ZONE=%s in '%s'N(R RRRtdebug1Rtsettwrite(tzoneRR((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ifcfg.pyR?s   !"( t__doc__t__all__Rtos.pathtfirewallRtfirewall.core.loggerRtfirewall.core.io.ifcfgRRR(((s:/usr/lib/python2.7/site-packages/firewall/core/fw_ifcfg.pyts    PK[4Hzz)site-packages/firewall/core/fw_config.pycnu[ c`c@sdgZddlZddlZddlZddlZddlmZddlmZddl m Z m Z m Z ddl mZmZmZddlmZmZmZddlmZmZmZdd lmZmZmZdd lmZdd lmZde fd YZ!dS( tFirewallConfigiN(tconfig(tlog(tIcmpTypeticmptype_readerticmptype_writer(tServicetservice_readertservice_writer(tZonet zone_readert zone_writer(tIPSett ipset_readert ipset_writer(tHelpert helper_readert helper_writer(terrors(t FirewallErrorcBseZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4d3Z5d4Z6d5Z7d6Z8d7Z9d8Z:d9Z;d:Z<d;Z=d<Z>d=Z?d>Z@d?ZAd@ZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMdLZNdMZOdNZPdOZQdPZRRS(QcCs||_|jdS(N(t_fwt_FirewallConfig__init_vars(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt__init__'s cCs\d|j|j|j|j|j|j|j|j|j|j |j |j |j |j fS(Ns6%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)(t __class__t_ipsetst _icmptypest _servicest_zonest_helperst_builtin_ipsetst_builtin_icmptypest_builtin_servicest_builtin_zonest_builtin_helperst_firewalld_conft _policiest_direct(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt__repr__+s cCsyi|_i|_i|_i|_i|_i|_i|_i|_i|_i|_ d|_ d|_ d|_ dS(N(RRRRRRR R!R"R#tNoneR$R%R&(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt __init_vars4s            cCsx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=qQWx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=qWx8t|jjD]!}|j|j|j|=q=Wx8t|j jD]!}|j |j|j |=qxWx8t|j jD]!}|j |j|j |=qWx8t|j jD]!}|j |j|j |=qWx8t|j jD]!}|j |j|j |=q)W|j rv|j j|` d|_ n|jr|jj|`d|_n|jr|jj|`d|_n|jdS(N(tlistRtkeystcleanupRR RR!RR"RR#RR$R(R%R&R(Rtx((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyR,CsV         cCs|jjjS(N(Rtpoliciestquery_lockdown(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytlockdown_enabledzscCs|jjj||S(N(RR.t access_check(Rtkeytvalue((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyR1}scCs ||_dS(N(R$(Rtconf((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytset_firewalld_confscCs|jS(N(R$(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytget_firewalld_confscCs6tjjtjs%|jjn |jjdS(N(tostpathtexistsRtFIREWALLD_CONFR$tcleartread(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytupdate_firewalld_confscCs ||_dS(N(R%(RR.((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt set_policiesscCs|jS(N(R%(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt get_policiesscCs<tjjtjs(|jjjn|jjjdS(N( R7R8R9RtLOCKDOWN_WHITELISTR%tlockdown_whitelistR,R<(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pytupdate_lockdown_whitelistscCs ||_dS(N(R&(Rtdirect((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt set_directscCs|jS(N(R&(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt get_directscCs6tjjtjs%|jjn |jjdS(N(R7R8R9RtFIREWALLD_DIRECTR&R,R<(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt update_directscCs2ttt|jjt|jjS(N(tsortedtsetR*RR+R(R((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyt get_ipsetsscCs0|jr||j|jR?RBRDRERGRJRNRPRSRUR[R`RjRRRoRpRrRqRsRtRvRxRyR{R|R}RwRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyR&s   7                  E            E            E             M            E    ("t__all__RVR7tos.pathRltfirewallRtfirewall.core.loggerRtfirewall.core.io.icmptypeRRRtfirewall.core.io.serviceRRRtfirewall.core.io.zoneR R R tfirewall.core.io.ipsetR R Rtfirewall.core.io.helperRRRRtfirewall.errorsRtobjectR(((s;/usr/lib/python2.7/site-packages/firewall/core/fw_config.pyts     PK[  #site-packages/firewall/core/icmp.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2017 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "ICMP_TYPES", "ICMPV6_TYPES", "check_icmp_type", "check_icmpv6_type" ] ICMP_TYPES = { "echo-reply": "0/0", "pong": "0/0", "network-unreachable": "3/0", "host-unreachable": "3/1", "protocol-unreachable": "3/2", "port-unreachable": "3/3", "fragmentation-needed": "3/4", "source-route-failed": "3/5", "network-unknown": "3/6", "host-unknown": "3/7", "network-prohibited": "3/9", "host-prohibited": "3/10", "TOS-network-unreachable": "3/11", "TOS-host-unreachable": "3/12", "communication-prohibited": "3/13", "host-precedence-violation": "3/14", "precedence-cutoff": "3/15", "source-quench": "4/0", "network-redirect": "5/0", "host-redirect": "5/1", "TOS-network-redirect": "5/2", "TOS-host-redirect": "5/3", "echo-request": "8/0", "ping": "8/0", "router-advertisement": "9/0", "router-solicitation": "10/0", "ttl-zero-during-transit": "11/0", "ttl-zero-during-reassembly": "11/1", "ip-header-bad": "12/0", "required-option-missing": "12/1", "timestamp-request": "13/0", "timestamp-reply": "14/0", "address-mask-request": "17/0", "address-mask-reply": "18/0", } ICMPV6_TYPES = { "no-route": "1/0", "communication-prohibited": "1/1", "address-unreachable": "1/3", "port-unreachable": "1/4", "packet-too-big": "2/0", "ttl-zero-during-transit": "3/0", "ttl-zero-during-reassembly": "3/1", "bad-header": "4/0", "unknown-header-type": "4/1", "unknown-option": "4/2", "echo-request": "128/0", "ping": "128/0", "echo-reply": "129/0", "pong": "129/0", "router-solicitation": "133/0", "router-advertisement": "134/0", "neighbour-solicitation": "135/0", "neigbour-solicitation": "135/0", "neighbour-advertisement": "136/0", "neigbour-advertisement": "136/0", "redirect": "137/0", } def check_icmp_name(_name): if _name in ICMP_TYPES: return True return False def check_icmp_type(_type): if _type in ICMP_TYPES.values(): return True return False def check_icmpv6_name(_name): if _name in ICMP_TYPES: return True return False def check_icmpv6_type(_type): if _type in ICMPV6_TYPES.values(): return True return False PK[ $site-packages/firewall/core/prog.pyonu[ c`c@s(ddlZdgZdddZdS(iNtrunProgc Cs|dkrg}n|g|}d}|r[t|d}|jj}WdQXnidd6}y:tj|dtjdtjdtjdtd|}Wnt k rd SX|j |\}} |j d d }|j |fS(NtrtCtLANGtstdintstderrtstdoutt close_fdstenvitsutf-8treplace(iR ( tNonetopentreadtencodet subprocesstPopentPIPEtSTDOUTtTruetOSErrort communicatetdecodet returncode( tprogtargvRtargst input_stringthandleRtprocesstoutputt err_output((s6/usr/lib/python2.7/site-packages/firewall/core/prog.pyRs$       (Rt__all__R R(((s6/usr/lib/python2.7/site-packages/firewall/core/prog.pyts  PK[%77)site-packages/firewall/core/ipXtables.pycnu[ c`c@sddlZddlZddlmZmZddlmZddlm Z ddl m Z m Z m Z mZmZmZmZmZddlmZddlmZmZmZddlmZmZmZmZddlZid d d gd 6d d gd6d dd d d gd6d dd gd6d d d gd6Zidd6dd6Z idd6dd6Z!dZ"dZ#dZ$de%fdYZ&de&fdYZ'dS( iN(t SHORTCUTStDEFAULT_ZONE_TARGET(trunProg(tlog(ttempFiletreadfilet splitArgst check_mactportStrtcheck_single_addresst check_addresst normalizeIP6(tconfig(t FirewallErrortINVALID_PASSTHROUGHt INVALID_RULE(t Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_MarktINPUTtOUTPUTtFORWARDtsecurityt PREROUTINGtrawt POSTROUTINGtmangletnattfiltersicmp-host-prohibitedtipv4sicmp6-adm-prohibitedtipv6ticmps ipv6-icmpcCsidd6dd6dd6dd6dd6d d 6}|}x|D]}y|j|}Wntk rmq>nX|d kryt||d Wntk rqX|j|d n||||W|S( s Inverse valid rule s-Ds-As--deletes--appends-Is--inserts-Xs-Ns--delete-chains --new-chaini(s-Is--insert(tindext Exceptiontinttpop(targst replace_argstret_argstargtidx((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcommon_reverse_rule7s*     cCsidd6dd6dd6dd6dd6d d 6}|}x|D]}y|j|}Wntk rmq>nX|dkryt||d Wntk rqX|j|d n||||<|SWttd d S(s Reverse valid passthough rule s-Ds-As--deletes--appends-Is--inserts-Xs-Ns--delete-chains --new-chainisno '-A', '-I' or '-N' argN(s-Is--insert(R!t ValueErrorR#R$R R(R%R&R'txR)((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcommon_reverse_passthrough\s.     cCst|}tddddddddd d d d d dddddddg}t||@dkrttdt||@dntddddddg}t||@dkrttdndS(sZ Check if passthough rule is valid (only add, insert and new chain rules are allowed) s-Cs--checks-Ds--deletes-Rs --replaces-Ls--lists-Ss --list-ruless-Fs--flushs-Zs--zeros-Xs--delete-chains-Ps--policys-Es--rename-chainisarg '%s' is not alloweds-As--appends-Is--inserts-Ns --new-chainsno '-A', '-I' or '-N' argN(tsettlenR Rtlist(R%t not_allowedtneeded((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcommon_check_passthroughs*   t ip4tablescBseZdZdZeZdZdZdZd.dZ dZ dZ dZ d Zd Zd Zd Zd ZdZdZdZd.dZdZdZdZdZdZdZddZdZedZ dZ!dZ"dZ#dZ$d Z%d!Z&d"Z'd#Z(d.d.d$Z)d.d.d%Z*d.d.d&Z+d'Z,d.d(Z-d.d)Z.d.d*Z/d+Z0d,Z1d-Z2RS(/RR4cCsz||_tj|j|_tjd|j|_|j|_|j|_ |j g|_ g|_ i|_ dS(Ns %s-restore(t_fwR tCOMMANDStipvt_commandt_restore_commandt_detect_wait_optiont wait_optiont_detect_restore_wait_optiontrestore_wait_optiont fill_existstavailable_tablestzone_source_index_cachet our_chains(tselftfw((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt__init__s    cCs4tjj|j|_tjj|j|_dS(N(tostpathtexistsR8tcommand_existsR9trestore_command_exists(RB((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyR>scCs|jrB|j|krB|jgg|D]}d|^q(}ng|D]}d|^qI}tjd|j|jdj|t|j|\}}|dkrtd|jdj||fn|S(Ns%ss %s: %s %st is'%s %s' failed: %s(R;Rtdebug2t __class__R8tjoinRR+(RBR%titemt_argststatustret((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt__runs*%  c Cs|dkr|Sg}x|D]}t}x|D]}y|j|}Wntk r\q0Xt||kr0d||dkr0t}||djd}x3|D](} |} | | |d<|j| qWq0q0W|s|j|qqW|S(s5Split values combined with commas for options in optst,iN(tNonetFalseR!R+R/tTruetsplittappend( RBtrulestoptst out_rulestrulet processedtopttititemsRNt_rule((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt split_values(    & cCsAy|j|}Wntk r'tSX||||d+tSdS(Ni(R!R+RURV(RBR\tpatternt replacementR_((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt _rule_replaces  cCs|tko|t|kS(N(tBUILT_IN_CHAINS(RBR7ttabletchain((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytis_chain_builtins cCsCd|g}|r"|jdn |jd|j||gS(Ns-ts-Ns-X(RX(RBtaddRgRhR\((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytbuild_chain_ruless    cCsLd|g}|r.|d|t|g7}n|d|g7}||7}|S(Ns-ts-Is-D(tstr(RBRjRgRhR!R%R\((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt build_rules   cCs t|S(N(R*(RBR%((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt reverse_rulescCst|dS(N(R3(RBR%((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytcheck_passthroughscCs t|S(N(R-(RBR%((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytreverse_passthrough scCsd}y|jd}Wntk r,n(Xt||dkrT||d}nd}xndddddd gD]T}y|j|}Wntk rqsXt||dkrs||d}qsqsW||fS( NRs-tis-As--appends-Is--inserts-Ns --new-chain(R!R+R/RT(RBR%RgR_RhR^((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytpassthrough_parse_table_chain s$   cCsyb|jd}|j||j|}d|dkrQ||df}n||df}WnLtk ry&|jd}|j|d}Wqtk rdSXnXt}|ddkrt}n|r| r||kr|j|qn|r|rI||kr7|j||jd d n|j|}n!|j j r^d}n t |}d |d<|j d d|dndS(Ns%%ZONE_SOURCE%%s-miiis%%ZONE_INTERFACE%%is-Ds--deletetkeycSs|dS(Ni((R,((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt@ss-Iis%di(s-Ds--delete( R!R$R+RTRVRUtremoveRXtsortR5t_allow_zone_driftingR/tinsert(RBR\R@R_tzonet zone_sourcetrule_addR!((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyt_run_replace_zone_source#s>               cCs#t}i}tj|j}x|D]}|}|j|dddt|jg|j|dt|jgy|jd}Wnt k rnLX|dkrq(n|d&krd d d |g|||d +n |j ||j ||d} xpddgD]b} y|j| }Wnt k r6q Xt ||d kr |j ||j |} q q Wxzt t |D]f}x]tjD]R} | ||kr||jdo||jd rd||||i}|jdrg|dRRTRbReRiRkRmRnRoRpRqR{RRRR:R<RRRRRRRURRRRRRRRRRRRR R RRR R!R"(((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyR4s\        ) ^    !  i   7 ,    !     , 1 # t ip6tablescBs eZdZdZedZRS(RR&c Csg}|jddddddddd g |d krk|jddddddddd d d g n|jdddddddddg |jdddddddddg |S(Ns-IRs-tRs-mtrpfilters--inverts-jRR}Rs --log-prefixsrpfilter_DROP: s-ps ipv6-icmps$--icmpv6-type=neighbour-solicitationRs"--icmpv6-type=router-advertisement(RX(RBRRY((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pytbuild_rpfilter_ruless"    (R#R$R7RRUR((((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyR&s((tos.pathRERtfirewall.core.baseRRtfirewall.core.progRtfirewall.core.loggerRtfirewall.functionsRRRRRR R R tfirewallR tfirewall.errorsR RRtfirewall.core.richRRRRRRfRRR*R-R3tobjectR4R&(((s;/usr/lib/python2.7/site-packages/firewall/core/ipXtables.pyts<  :"     % * PK[㏷%site-packages/firewall/core/fw_nm.pycnu[ c`c@sWdZddddddddgZd d lZd d lmZyejd d Wnek rmeZnAXyd dlm Z e ZWn#e eej fk reZnXd ad dlmZd dlmZd dlmZd d lZdZdZdZdZdZdZdZdZdZdZdZ d S(s(Functions for NetworkManager interactiontcheck_nm_importedtnm_is_importedtnm_get_zone_of_connectiontnm_set_zone_of_connectiontnm_get_connectionstnm_get_connection_of_interfacetnm_get_bus_nametnm_get_dbus_interfaceiN(tGLibtNMs1.0(R (terrors(t FirewallError(tlogcCststtjdndS(sNCheck function to raise a MISSING_IMPORT error if the import of NM failed sgi.repository.NM = 1.0N(t _nm_importedR R tMISSING_IMPORT(((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyR0scCstS(snReturns true if NM has been properly imported @return True if import was successful, False otherwirse (R (((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyR6scCststjjdantS(sReturns the NM client object or None if the import of NM failed @return NM.Client instance if import was successful, None otherwise N(t _nm_clientR tClienttnewtNone(((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyt nm_get_client<scCsttj|}|dkr)dS|j}|dkrEdSy(|jtjjtjj B@rldSWn!t k r|j rdSnX|j }|dkrd}n|S(sGet zone of connection from NM @param connection name @return zone string setting of connection, empty string if not set, None if connection is unknown tN( RRtget_connection_by_uuidRtget_setting_connectiont get_flagsR tSettingsConnectionFlagst NM_GENERATEDt NM_VOLATILEtAttributeErrort get_unsavedtget_zone(t connectiontcont setting_contzone((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyREs$        cCszttj|}|dkr)tS|j}|dkrEtS|dkrZd}n|jd||jtdS(sSet the zone for a connection @param zone name @param connection name @return True if zone was set, else False RR!N( RRRRtFalseRt set_propertytcommit_changestTrue(R!RRR ((s7/usr/lib/python2.7/site-packages/firewall/core/fw_nm.pyRcs     cCs|j|jttj}xo|D]g}|jrIq1n|j}|j}|j}|||s>               PK[^ܪ>y>y%site-packages/firewall/core/logger.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2005-2007,2012 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "LogTarget", "FileLog", "Logger", "log" ] import sys import types import time import inspect import fnmatch import syslog import traceback import fcntl import os.path import os # --------------------------------------------------------------------------- # abstract class for logging targets class LogTarget(object): """ Abstract class for logging targets. """ def __init__(self): self.fd = None def write(self, data, level, logger, is_debug=0): raise NotImplementedError("LogTarget.write is an abstract method") def flush(self): raise NotImplementedError("LogTarget.flush is an abstract method") def close(self): raise NotImplementedError("LogTarget.close is an abstract method") # --------------------------------------------------------------------------- # private class for stdout class _StdoutLog(LogTarget): def __init__(self): LogTarget.__init__(self) self.fd = sys.stdout def write(self, data, level, logger, is_debug=0): # ignore level self.fd.write(data) self.flush() def close(self): self.flush() def flush(self): self.fd.flush() # --------------------------------------------------------------------------- # private class for stderr class _StderrLog(_StdoutLog): def __init__(self): _StdoutLog.__init__(self) self.fd = sys.stderr # --------------------------------------------------------------------------- # private class for syslog class _SyslogLog(LogTarget): def __init__(self): # Only initialize LogTarget here as fs should be None LogTarget.__init__(self) # # Derived from: https://github.com/canvon/firewalld/commit/af0edfee1cc1891b7b13f302ca5911b24e9b0f13 # # Work around Python issue 27875, "Syslogs /usr/sbin/foo as /foo # instead of as foo" # (but using openlog explicitly might be better anyway) # # Set ident to basename, log PID as well, and log to facility "daemon". syslog.openlog(os.path.basename(sys.argv[0]), syslog.LOG_PID, syslog.LOG_DAEMON) def write(self, data, level, logger, is_debug=0): priority = None if is_debug: priority = syslog.LOG_DEBUG else: if level >= logger.INFO1: priority = syslog.LOG_INFO elif level == logger.WARNING: priority = syslog.LOG_WARNING elif level == logger.ERROR: priority = syslog.LOG_ERR elif level == logger.FATAL: priority = syslog.LOG_CRIT if data.endswith("\n"): data = data[:len(data)-1] if len(data) > 0: if priority is None: syslog.syslog(data) else: syslog.syslog(priority, data) def close(self): syslog.closelog() def flush(self): pass # --------------------------------------------------------------------------- class FileLog(LogTarget): """ FileLog class. File will be opened on the first write. """ def __init__(self, filename, mode="w"): LogTarget.__init__(self) self.filename = filename self.mode = mode def open(self): if self.fd: return flags = os.O_CREAT | os.O_WRONLY if self.mode.startswith('a'): flags |= os.O_APPEND self.fd = os.open(self.filename, flags, 0o640) # Make sure that existing file has correct perms os.fchmod(self.fd, 0o640) # Make it an object self.fd = os.fdopen(self.fd, self.mode) fcntl.fcntl(self.fd, fcntl.F_SETFD, fcntl.FD_CLOEXEC) def write(self, data, level, logger, is_debug=0): if not self.fd: self.open() self.fd.write(data) self.fd.flush() def close(self): if not self.fd: return self.fd.close() self.fd = None def flush(self): if not self.fd: return self.fd.flush() # --------------------------------------------------------------------------- class Logger(object): r""" Format string: %(class)s Calling class the function belongs to, else empty %(date)s Date using Logger.date_format, see time module %(domain)s Full Domain: %(module)s.%(class)s.%(function)s %(file)s Filename of the module %(function)s Function name, empty in __main__ %(label)s Label according to log function call from Logger.label %(level)d Internal logging level %(line)d Line number in module %(module)s Module name %(message)s Log message Standard levels: FATAL Fatal error messages ERROR Error messages WARNING Warning messages INFOx, x in [1..5] Information DEBUGy, y in [1..10] Debug messages NO_INFO No info output NO_DEBUG No debug output INFO_MAX Maximum info level DEBUG_MAX Maximum debug level x and y depend on info_max and debug_max from Logger class initialization. See __init__ function. Default logging targets: stdout Logs to stdout stderr Logs to stderr syslog Logs to syslog Additional arguments for logging functions (fatal, error, warning, info and debug): nl Disable newline at the end with nl=0, default is nl=1. fmt Format string for this logging entry, overloads global format string. Example: fmt="%(file)s:%(line)d %(message)s" nofmt Only output message with nofmt=1. The nofmt argument wins over the fmt argument. Example: from logger import log log.setInfoLogLevel(log.INFO1) log.setDebugLogLevel(log.DEBUG1) for i in range(1, log.INFO_MAX+1): log.setInfoLogLabel(i, "INFO%d: " % i) log.setFormat("%(date)s %(module)s:%(line)d [%(domain)s] %(label)s: " "%(level)d %(message)s") log.setDateFormat("%Y-%m-%d %H:%M:%S") fl = FileLog("/tmp/log", "a") log.addInfoLogging("*", fl) log.addDebugLogging("*", fl) log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s") log.debug3("debug3") log.debug2("debug2") log.debug1("debug1") log.info2("info2") log.info1("info1") log.warning("warning\n", nl=0) log.error("error\n", nl=0) log.fatal("fatal") log.info(log.INFO1, "nofmt info", nofmt=1) """ ALL = -5 NOTHING = -4 FATAL = -3 TRACEBACK = -2 ERROR = -1 WARNING = 0 # Additional levels are generated in class initilization stdout = _StdoutLog() stderr = _StderrLog() syslog = _SyslogLog() def __init__(self, info_max=5, debug_max=10): """ Logger class initialization """ self._level = { } self._debug_level = { } self._format = "" self._date_format = "" self._label = { } self._debug_label = { } self._logging = { } self._debug_logging = { } self._domains = { } self._debug_domains = { } # INFO1 is required for standard log level if info_max < 1: raise ValueError("Logger: info_max %d is too low" % info_max) if debug_max < 0: raise ValueError("Logger: debug_max %d is too low" % debug_max) self.NO_INFO = self.WARNING # = 0 self.INFO_MAX = info_max self.NO_DEBUG = 0 self.DEBUG_MAX = debug_max self.setInfoLogLabel(self.FATAL, "FATAL ERROR: ") self.setInfoLogLabel(self.TRACEBACK, "") self.setInfoLogLabel(self.ERROR, "ERROR: ") self.setInfoLogLabel(self.WARNING, "WARNING: ") # generate info levels and infox functions for _level in range(1, self.INFO_MAX+1): setattr(self, "INFO%d" % _level, _level) self.setInfoLogLabel(_level, "") setattr(self, "info%d" % (_level), (lambda self, x: lambda message, *args, **kwargs: self.info(x, message, *args, **kwargs))(self, _level)) # pylint: disable=E0602 # generate debug levels and debugx functions for _level in range(1, self.DEBUG_MAX+1): setattr(self, "DEBUG%d" % _level, _level) self.setDebugLogLabel(_level, "DEBUG%d: " % _level) setattr(self, "debug%d" % (_level), (lambda self, x: lambda message, *args, **kwargs: self.debug(x, message, *args, **kwargs))(self, _level)) # pylint: disable=E0602 # set initial log levels, formats and targets self.setInfoLogLevel(self.INFO1) self.setDebugLogLevel(self.NO_DEBUG) self.setFormat("%(label)s%(message)s") self.setDateFormat("%d %b %Y %H:%M:%S") self.setInfoLogging("*", self.stderr, [ self.FATAL, self.ERROR, self.WARNING ]) self.setInfoLogging("*", self.stdout, [ i for i in range(self.INFO1, self.INFO_MAX+1) ]) self.setDebugLogging("*", self.stdout, [ i for i in range(1, self.DEBUG_MAX+1) ]) def close(self): """ Close all logging targets """ for level in range(self.FATAL, self.DEBUG_MAX+1): if level not in self._logging: continue for (dummy, target, dummy) in self._logging[level]: target.close() def getInfoLogLevel(self, domain="*"): """ Get info log level. """ self._checkDomain(domain) if domain in self._level: return self._level[domain] return self.NOTHING def setInfoLogLevel(self, level, domain="*"): """ Set log level [NOTHING .. INFO_MAX] """ self._checkDomain(domain) if level < self.NOTHING: level = self.NOTHING if level > self.INFO_MAX: level = self.INFO_MAX self._level[domain] = level def getDebugLogLevel(self, domain="*"): """ Get debug log level. """ self._checkDomain(domain) if domain in self._debug_level: return self._debug_level[domain] + self.NO_DEBUG return self.NO_DEBUG def setDebugLogLevel(self, level, domain="*"): """ Set debug log level [NO_DEBUG .. DEBUG_MAX] """ self._checkDomain(domain) if level < 0: level = 0 if level > self.DEBUG_MAX: level = self.DEBUG_MAX self._debug_level[domain] = level - self.NO_DEBUG def getFormat(self): return self._format def setFormat(self, _format): self._format = _format def getDateFormat(self): return self._date_format def setDateFormat(self, _format): self._date_format = _format def setInfoLogLabel(self, level, label): """ Set log label for level. Level can be a single level or an array of levels. """ levels = self._getLevels(level) for level in levels: self._checkLogLevel(level, min_level=self.FATAL, max_level=self.INFO_MAX) self._label[level] = label def setDebugLogLabel(self, level, label): """ Set log label for level. Level can be a single level or an array of levels. """ levels = self._getLevels(level, is_debug=1) for level in levels: self._checkLogLevel(level, min_level=self.INFO1, max_level=self.DEBUG_MAX) self._debug_label[level] = label def setInfoLogging(self, domain, target, level=ALL, fmt=None): """ Set info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. """ self._setLogging(domain, target, level, fmt, is_debug=0) def setDebugLogging(self, domain, target, level=ALL, fmt=None): """ Set debug log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. """ self._setLogging(domain, target, level, fmt, is_debug=1) def addInfoLogging(self, domain, target, level=ALL, fmt=None): """ Add info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. """ self._addLogging(domain, target, level, fmt, is_debug=0) def addDebugLogging(self, domain, target, level=ALL, fmt=None): """ Add debg log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. """ self._addLogging(domain, target, level, fmt, is_debug=1) def delInfoLogging(self, domain, target, level=ALL, fmt=None): """ Delete info log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. """ self._delLogging(domain, target, level, fmt, is_debug=0) def delDebugLogging(self, domain, target, level=ALL, fmt=None): """ Delete debug log target for domain and level. Level can be a single level or an array of levels. Use level ALL to set for all levels. If no format is specified, the default format will be used. """ self._delLogging(domain, target, level, fmt, is_debug=1) def isInfoLoggingHere(self, level): """ Is there currently any info logging for this log level (and domain)? """ return self._isLoggingHere(level, is_debug=0) def isDebugLoggingHere(self, level): """ Is there currently any debug logging for this log level (and domain)? """ return self._isLoggingHere(level, is_debug=1) ### log functions def fatal(self, _format, *args, **kwargs): """ Fatal error log. """ self._checkKWargs(kwargs) kwargs["is_debug"] = 0 self._log(self.FATAL, _format, *args, **kwargs) def error(self, _format, *args, **kwargs): """ Error log. """ self._checkKWargs(kwargs) kwargs["is_debug"] = 0 self._log(self.ERROR, _format, *args, **kwargs) def warning(self, _format, *args, **kwargs): """ Warning log. """ self._checkKWargs(kwargs) kwargs["is_debug"] = 0 self._log(self.WARNING, _format, *args, **kwargs) def info(self, level, _format, *args, **kwargs): """ Information log using info level [1..info_max]. There are additional infox functions according to info_max from __init__""" self._checkLogLevel(level, min_level=1, max_level=self.INFO_MAX) self._checkKWargs(kwargs) kwargs["is_debug"] = 0 self._log(level+self.NO_INFO, _format, *args, **kwargs) def debug(self, level, _format, *args, **kwargs): """ Debug log using debug level [1..debug_max]. There are additional debugx functions according to debug_max from __init__""" self._checkLogLevel(level, min_level=1, max_level=self.DEBUG_MAX) self._checkKWargs(kwargs) kwargs["is_debug"] = 1 self._log(level, _format, *args, **kwargs) def exception(self): self._log(self.TRACEBACK, traceback.format_exc(), args=[], kwargs={}) ### internal functions def _checkLogLevel(self, level, min_level, max_level): if level < min_level or level > max_level: raise ValueError("Level %d out of range, should be [%d..%d]." % \ (level, min_level, max_level)) def _checkKWargs(self, kwargs): if not kwargs: return for key in kwargs.keys(): if key not in [ "nl", "fmt", "nofmt" ]: raise ValueError("Key '%s' is not allowed as argument for logging." % key) def _checkDomain(self, domain): if not domain or domain == "": raise ValueError("Domain '%s' is not valid." % domain) def _getLevels(self, level, is_debug=0): """ Generate log level array. """ if level != self.ALL: if isinstance(level, list) or isinstance(level, tuple): levels = level else: levels = [ level ] for level in levels: if is_debug: self._checkLogLevel(level, min_level=1, max_level=self.DEBUG_MAX) else: self._checkLogLevel(level, min_level=self.FATAL, max_level=self.INFO_MAX) else: if is_debug: levels = [ i for i in range(self.DEBUG1, self.DEBUG_MAX) ] else: levels = [ i for i in range(self.FATAL, self.INFO_MAX) ] return levels def _getTargets(self, target): """ Generate target array. """ if isinstance(target, list) or isinstance(target, tuple): targets = target else: targets = [ target ] for _target in targets: if not issubclass(_target.__class__, LogTarget): raise ValueError("'%s' is no valid logging target." % \ _target.__class__.__name__) return targets def _genDomains(self, is_debug=0): # private method for self._domains array creation, speeds up """ Generate dict with domain by level. """ if is_debug: _domains = self._debug_domains _logging = self._debug_logging _range = ( 1, self.DEBUG_MAX+1 ) else: _domains = self._domains _logging = self._logging _range = ( self.FATAL, self.INFO_MAX+1 ) if len(_domains) > 0: _domains.clear() for level in range(_range[0], _range[1]): if level not in _logging: continue for (domain, dummy, dummy) in _logging[level]: if domain not in _domains: _domains.setdefault(level, [ ]).append(domain) def _setLogging(self, domain, target, level=ALL, fmt=None, is_debug=0): self._checkDomain(domain) levels = self._getLevels(level, is_debug) targets = self._getTargets(target) if is_debug: _logging = self._debug_logging else: _logging = self._logging for level in levels: for target in targets: _logging[level] = [ (domain, target, fmt) ] self._genDomains(is_debug) def _addLogging(self, domain, target, level=ALL, fmt=None, is_debug=0): self._checkDomain(domain) levels = self._getLevels(level, is_debug) targets = self._getTargets(target) if is_debug: _logging = self._debug_logging else: _logging = self._logging for level in levels: for target in targets: _logging.setdefault(level, [ ]).append((domain, target, fmt)) self._genDomains(is_debug) def _delLogging(self, domain, target, level=ALL, fmt=None, is_debug=0): self._checkDomain(domain) levels = self._getLevels(level, is_debug) targets = self._getTargets(target) if is_debug: _logging = self._debug_logging else: _logging = self._logging for _level in levels: for target in targets: if _level not in _logging: continue if (domain, target, fmt) in _logging[_level]: _logging[_level].remove( (domain, target, fmt) ) if len(_logging[_level]) == 0: del _logging[_level] continue if level != self.ALL: raise ValueError("No mathing logging for " \ "level %d, domain %s, target %s and format %s." % \ (_level, domain, target.__class__.__name__, fmt)) self._genDomains(is_debug) def _isLoggingHere(self, level, is_debug=0): _dict = self._genDict(level, is_debug) if not _dict: return False point_domain = _dict["domain"] + "." if is_debug: _logging = self._debug_logging else: _logging = self._logging # do we need to log? for (domain, dummy, dummy) in _logging[level]: if domain == "*" or \ point_domain.startswith(domain) or \ fnmatch.fnmatchcase(_dict["domain"], domain): return True return False def _getClass(self, frame): """ Function to get calling class. Returns class or None. """ # get class by first function argument, if there are any if frame.f_code.co_argcount > 0: selfname = frame.f_code.co_varnames[0] if selfname in frame.f_locals: _self = frame.f_locals[selfname] obj = self._getClass2(_self.__class__, frame.f_code) if obj: return obj module = inspect.getmodule(frame.f_code) code = frame.f_code # function in module? if code.co_name in module.__dict__: if hasattr(module.__dict__[code.co_name], "func_code") and \ module.__dict__[code.co_name].__code__ == code: return None # class in module for (dummy, obj) in module.__dict__.items(): if isinstance(obj, types.ClassType): if hasattr(obj, code.co_name): value = getattr(obj, code.co_name) if isinstance(value, types.FunctionType): if value.__code__ == code: return obj # nothing found return None def _getClass2(self, obj, code): """ Internal function to get calling class. Returns class or None. """ for value in obj.__dict__.values(): if isinstance(value, types.FunctionType): if value.__code__ == code: return obj for base in obj.__bases__: _obj = self._getClass2(base, code) if _obj: return _obj return None # internal log class def _log(self, level, _format, *args, **kwargs): is_debug = 0 if "is_debug" in kwargs: is_debug = kwargs["is_debug"] nl = 1 if "nl" in kwargs: nl = kwargs["nl"] nofmt = 0 if "nofmt" in kwargs: nofmt = kwargs["nofmt"] _dict = self._genDict(level, is_debug) if not _dict: return if len(args) > 1: _dict['message'] = _format % args elif len(args) == 1: # needed for _format % _dict _dict['message'] = _format % args[0] else: _dict['message'] = _format point_domain = _dict["domain"] + "." if is_debug: _logging = self._debug_logging else: _logging = self._logging used_targets = [ ] # log to target(s) for (domain, target, _format) in _logging[level]: if target in used_targets: continue if domain == "*" \ or point_domain.startswith(domain+".") \ or fnmatch.fnmatchcase(_dict["domain"], domain): if not _format: _format = self._format if "fmt" in kwargs: _format = kwargs["fmt"] if nofmt: target.write(_dict["message"], level, self, is_debug) else: target.write(_format % _dict, level, self, is_debug) if nl: # newline target.write("\n", level, self, is_debug) used_targets.append(target) # internal function to generate the dict, needed for logging def _genDict(self, level, is_debug=0): """ Internal function. """ check_domains = [ ] simple_match = False if is_debug: _dict = self._debug_level _domains = self._debug_domains _label = self._debug_label else: _dict = self._level _domains = self._domains _label = self._label # no debug for domain in _dict: if domain == "*": # '*' matches everything: simple match if _dict[domain] >= level: simple_match = True if len(check_domains) > 0: check_domains = [ ] break else: if _dict[domain] >= level: check_domains.append(domain) if not simple_match and len(check_domains) < 1: return None if level not in _domains: return None f = inspect.currentframe() # go outside of logger module as long as there is a lower frame while f and f.f_back and f.f_globals["__name__"] == self.__module__: f = f.f_back if not f: raise ValueError("Frame information not available.") # get module name module_name = f.f_globals["__name__"] # simple module match test for all entries of check_domain point_module = module_name + "." for domain in check_domains: if point_module.startswith(domain): # found domain in module name check_domains = [ ] break # get code co = f.f_code # optimization: bail out early if domain can not match at all _len = len(module_name) for domain in _domains[level]: i = domain.find("*") if i == 0: continue elif i > 0: d = domain[:i] else: d = domain if _len >= len(d): if not module_name.startswith(d): return None else: if not d.startswith(module_name): return None # generate _dict for format output level_str = "" if level in _label: level_str = _label[level] _dict = { 'file': co.co_filename, 'line': f.f_lineno, 'module': module_name, 'class': '', 'function': co.co_name, 'domain': '', 'label' : level_str, 'level' : level, 'date' : time.strftime(self._date_format, time.localtime()) } if _dict["function"] == "?": _dict["function"] = "" # domain match needed? domain_needed = False for domain in _domains[level]: # standard domain, matches everything if domain == "*": continue # domain is needed domain_needed = True break # do we need to get the class object? if self._format.find("%(domain)") >= 0 or \ self._format.find("%(class)") >= 0 or \ domain_needed or \ len(check_domains) > 0: obj = self._getClass(f) if obj: _dict["class"] = obj.__name__ # build domain string _dict["domain"] = "" + _dict["module"] if _dict["class"] != "": _dict["domain"] += "." + _dict["class"] if _dict["function"] != "": _dict["domain"] += "." + _dict["function"] if len(check_domains) < 1: return _dict point_domain = _dict["domain"] + "." for domain in check_domains: if point_domain.startswith(domain) or \ fnmatch.fnmatchcase(_dict["domain"], domain): return _dict return None # --------------------------------------------------------------------------- # Global logging object. log = Logger() # --------------------------------------------------------------------------- """ # Example if __name__ == '__main__': log.setInfoLogLevel(log.INFO2) log.setDebugLogLevel(log.DEBUG5) for i in range(log.INFO1, log.INFO_MAX+1): log.setInfoLogLabel(i, "INFO%d: " % i) for i in range(log.DEBUG1, log.DEBUG_MAX+1): log.setDebugLogLabel(i, "DEBUG%d: " % i) log.setFormat("%(date)s %(module)s:%(line)d %(label)s" "%(message)s") log.setDateFormat("%Y-%m-%d %H:%M:%S") fl = FileLog("/tmp/log", "a") log.addInfoLogging("*", fl) log.delDebugLogging("*", log.stdout) log.setDebugLogging("*", log.stdout, [ log.DEBUG1, log.DEBUG2 ] ) log.addDebugLogging("*", fl) # log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s") # log.addDebugLogging("*", log.syslog, fmt="%(label)s%(message)s") log.debug10("debug10") log.debug9("debug9") log.debug8("debug8") log.debug7("debug7") log.debug6("debug6") log.debug5("debug5") log.debug4("debug4") log.debug3("debug3") log.debug2("debug2", fmt="%(file)s:%(line)d %(message)s") log.debug1("debug1", nofmt=1) log.info5("info5") log.info4("info4") log.info3("info3") log.info2("info2") log.info1("info1") log.warning("warning\n", nl=0) log.error("error ", nl=0) log.error("error", nofmt=1) log.fatal("fatal") log.info(log.INFO1, "nofmt info", nofmt=1) log.info(log.INFO2, "info2 fmt", fmt="%(file)s:%(line)d %(message)s") try: a = b except Exception as e: log.exception() """ # vim:ts=4:sw=4:showmatch:expandtab PK[gnbk.k.&site-packages/firewall/core/fw_zone.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # import time from firewall.core.base import SHORTCUTS, DEFAULT_ZONE_TARGET, \ ZONE_SOURCE_IPSET_TYPES from firewall.core.logger import log from firewall.functions import portStr, checkIPnMask, checkIP6nMask, \ checkProtocol, enable_ip_forwarding, check_single_address, check_mac, \ portInPortRange, get_nf_conntrack_short_name from firewall.core.rich import Rich_Rule, Rich_Accept, \ Rich_Mark, Rich_Service, Rich_Port, Rich_Protocol, \ Rich_Masquerade, Rich_ForwardPort, Rich_SourcePort, Rich_IcmpBlock, \ Rich_IcmpType from firewall.core.fw_transaction import FirewallTransaction, \ FirewallZoneTransaction from firewall import errors from firewall.errors import FirewallError from firewall.fw_types import LastUpdatedOrderedDict class FirewallZone(object): def __init__(self, fw): self._fw = fw self._chains = { } self._zones = { } def __repr__(self): return '%s(%r, %r)' % (self.__class__, self._chains, self._zones) def cleanup(self): self._chains.clear() self._zones.clear() # transaction def new_transaction(self): return FirewallTransaction(self._fw) def new_zone_transaction(self, zone): return FirewallZoneTransaction(self._fw, zone) # zones def get_zones(self): return sorted(self._zones.keys()) def get_zone_of_interface(self, interface): interface_id = self.__interface_id(interface) for zone in self._zones: if interface_id in self._zones[zone].settings["interfaces"]: # an interface can only be part of one zone return zone return None def get_zone_of_source(self, source): source_id = self.__source_id(source) for zone in self._zones: if source_id in self._zones[zone].settings["sources"]: # a source_id can only be part of one zone return zone return None def get_zone(self, zone): z = self._fw.check_zone(zone) return self._zones[z] def _error2warning(self, f, name, *args, **kwargs): # transform errors into warnings try: f(name, *args, **kwargs) except FirewallError as error: msg = str(error) log.warning("%s: %s" % (name, msg)) def add_zone(self, obj): obj.settings = { x : LastUpdatedOrderedDict() for x in [ "interfaces", "sources", "services", "ports", "masquerade", "forward_ports", "source_ports", "icmp_blocks", "rules", "protocols", "icmp_block_inversion" ] } self._zones[obj.name] = obj def remove_zone(self, zone): obj = self._zones[zone] if obj.applied: self.unapply_zone_settings(zone) obj.settings.clear() del self._zones[zone] def apply_zones(self, use_transaction=None): if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction for zone in self.get_zones(): obj = self._zones[zone] zone_transaction = transaction.zone_transaction(zone) # register icmp block inversion setting but don't apply if obj.icmp_block_inversion: self._error2warning(self.add_icmp_block_inversion, obj.name, use_zone_transaction=zone_transaction) if len(obj.interfaces) > 0 or len(obj.sources) > 0: obj.applied = True log.debug1("Applying zone '%s'", obj.name) # load zone in case of missing services, icmptypes etc. for args in obj.icmp_blocks: self._error2warning(self.add_icmp_block, obj.name, args, use_zone_transaction=zone_transaction) for args in obj.forward_ports: self._error2warning(self.add_forward_port, obj.name, *args, use_zone_transaction=zone_transaction) for args in obj.services: self._error2warning(self.add_service, obj.name, args, use_zone_transaction=zone_transaction) for args in obj.ports: self._error2warning(self.add_port, obj.name, *args, use_zone_transaction=zone_transaction) for args in obj.protocols: self._error2warning(self.add_protocol, obj.name, args, use_zone_transaction=zone_transaction) for args in obj.source_ports: self._error2warning(self.add_source_port, obj.name, *args, use_zone_transaction=zone_transaction) if obj.masquerade: self._error2warning(self.add_masquerade, obj.name, use_zone_transaction=zone_transaction) for args in obj.rules: self._error2warning(self.add_rule, obj.name, args, use_zone_transaction=zone_transaction) for args in obj.interfaces: self._error2warning(self.add_interface, obj.name, args, use_zone_transaction=zone_transaction) for args in obj.sources: self._error2warning(self.add_source, obj.name, args, use_zone_transaction=zone_transaction) # apply icmp accept/reject rule always if obj.applied: self._error2warning(self._icmp_block_inversion, True, obj.name, zone_transaction) if use_transaction is None: transaction.execute(True) def set_zone_applied(self, zone, applied): obj = self._zones[zone] obj.applied = applied # zone from chain def zone_from_chain(self, chain): if "_" not in chain: # no zone chain return None splits = chain.split("_") if len(splits) < 2: return None _chain = None for x in SHORTCUTS: if splits[0] == SHORTCUTS[x]: _chain = x if _chain is not None: # next part needs to be zone name if splits[1] not in self.get_zones(): return None if len(splits) == 2 or \ (len(splits) == 3 and splits[2] in [ "log", "deny", "allow" ]): return (splits[1], _chain) return None def create_zone_base_by_chain(self, ipv, table, chain, use_transaction=None): # Create zone base chains if the chain is reserved for a zone if ipv in [ "ipv4", "ipv6" ]: x = self.zone_from_chain(chain) if x is not None: (_zone, _chain) = x if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction self.gen_chain_rules(_zone, True, [(table, _chain)], transaction) if use_transaction is None: transaction.execute(True) # dynamic chain handling def _register_chains(self, zone, create, chains): # this method is used by FirewallZoneTransaction for (table, chain) in chains: if create: self._chains.setdefault(zone, { }).setdefault(table, [ ]).append(chain) else: self._chains[zone][table].remove(chain) if len(self._chains[zone][table]) == 0: del self._chains[zone][table] if len(self._chains[zone]) == 0: del self._chains[zone] # settings # generate settings record with sender, timeout, mark def __gen_settings(self, timeout, sender, mark=None): ret = { "date": time.time(), "sender": sender, "timeout": timeout, } if mark: ret["mark"] = mark return ret def get_settings(self, zone): return self.get_zone(zone).settings def set_settings(self, zone, settings): _obj = self.get_zone(zone) try: for key in settings: for args in settings[key]: if args in _obj.settings[key]: # do not add things, that are already active in the # zone configuration, also do not restore date, # sender and timeout continue if key == "icmp_blocks": self.add_icmp_block(zone, args) elif key == "forward_ports": self.add_forward_port(zone, *args) elif key == "services": self.add_service(zone, args) elif key == "ports": self.add_port(zone, *args) elif key == "protocols": self.add_protocol(zone, *args) elif key == "source_ports": self.add_source_port(zone, *args) elif key == "masquerade": self.add_masquerade(zone) elif key == "rules": self.add_rule(zone, Rich_Rule(rule_str=args)) elif key == "interfaces": self.change_zone_of_interface(zone, args) elif key == "sources": self.change_zone_of_source(zone, args) else: log.warning("Zone '%s': Unknown setting '%s:%s', " "unable to restore.", zone, key, args) # restore old date, sender and timeout if args in _obj.settings[key]: _obj.settings[key][args] = settings[key][args] except FirewallError as msg: log.warning(str(msg)) def __zone_settings(self, enable, zone, use_zone_transaction=None): _zone = self._fw.check_zone(zone) obj = self._zones[_zone] if (enable and obj.applied) or (not enable and not obj.applied): return if enable: obj.applied = True if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(zone) else: zone_transaction = use_zone_transaction settings = self.get_settings(zone) for key in settings: for args in settings[key]: try: if key == "icmp_blocks": self._icmp_block(enable, _zone, args, zone_transaction) elif key == "icmp_block_inversion": continue elif key == "forward_ports": mark = obj.settings["forward_ports"][args]["mark"] self._forward_port(enable, _zone, zone_transaction, *args, mark_id=mark) elif key == "services": self._service(enable, _zone, args, zone_transaction) elif key == "ports": self._port(enable, _zone, args[0], args[1], zone_transaction) elif key == "protocols": self._protocol(enable, _zone, args, zone_transaction) elif key == "source_ports": self._source_port(enable, _zone, args[0], args[1], zone_transaction) elif key == "masquerade": self._masquerade(enable, _zone, zone_transaction) elif key == "rules": if "mark" in obj.settings["rules"][args]: mark = obj.settings["rules"][args]["mark"] else: mark = None self.__rule(enable, _zone, Rich_Rule(rule_str=args), mark, zone_transaction) elif key == "interfaces": self._interface(enable, _zone, args, zone_transaction) elif key == "sources": self._source(enable, _zone, args[0], args[1], zone_transaction) else: log.warning("Zone '%s': Unknown setting '%s:%s', " "unable to apply", zone, key, args) except FirewallError as msg: log.warning(str(msg)) if enable: # add icmp rule(s) always self._icmp_block_inversion(True, obj.name, zone_transaction) if use_zone_transaction is None: zone_transaction.execute(enable) def apply_zone_settings(self, zone, use_zone_transaction=None): self.__zone_settings(True, zone, use_zone_transaction) def unapply_zone_settings(self, zone, use_zone_transaction=None): self.__zone_settings(False, zone, use_zone_transaction) def unapply_zone_settings_if_unused(self, zone): obj = self._zones[zone] if len(obj.interfaces) == 0 and len(obj.sources) == 0: self.unapply_zone_settings(zone) def get_config_with_settings(self, zone): """ :return: exported config updated with runtime settings """ conf = list(self.get_zone(zone).export_config()) if conf[4] == DEFAULT_ZONE_TARGET: conf[4] = "default" conf[5] = self.list_services(zone) conf[6] = self.list_ports(zone) conf[7] = self.list_icmp_blocks(zone) conf[8] = self.query_masquerade(zone) conf[9] = self.list_forward_ports(zone) conf[10] = self.list_interfaces(zone) conf[11] = self.list_sources(zone) conf[12] = self.list_rules(zone) conf[13] = self.list_protocols(zone) conf[14] = self.list_source_ports(zone) conf[15] = self.query_icmp_block_inversion(zone) return tuple(conf) # INTERFACES def check_interface(self, interface): self._fw.check_interface(interface) def interface_get_sender(self, zone, interface): _zone = self._fw.check_zone(zone) _obj = self._zones[_zone] interface_id = self.__interface_id(interface) if interface_id in _obj.settings["interfaces"]: settings = _obj.settings["interfaces"][interface_id] if "sender" in settings and settings["sender"] is not None: return settings["sender"] return None def __interface_id(self, interface): self.check_interface(interface) return interface def add_interface(self, zone, interface, sender=None, use_zone_transaction=None): self._fw.check_panic() _zone = self._fw.check_zone(zone) _obj = self._zones[_zone] interface_id = self.__interface_id(interface) if interface_id in _obj.settings["interfaces"]: raise FirewallError(errors.ZONE_ALREADY_SET, "'%s' already bound to '%s'" % (interface, zone)) if self.get_zone_of_interface(interface) is not None: raise FirewallError(errors.ZONE_CONFLICT, "'%s' already bound to a zone" % interface) log.debug1("Setting zone of interface '%s' to '%s'" % (interface, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if not _obj.applied: self.apply_zone_settings(zone, use_zone_transaction=zone_transaction) zone_transaction.add_fail(self.set_zone_applied, _zone, False) self._interface(True, _zone, interface, zone_transaction) self.__register_interface(_obj, interface_id, zone, sender) zone_transaction.add_fail(self.__unregister_interface, _obj, interface_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_interface(self, _obj, interface_id, zone, sender): _obj.settings["interfaces"][interface_id] = \ self.__gen_settings(0, sender) # add information whether we add to default or specific zone _obj.settings["interfaces"][interface_id]["__default__"] = \ (not zone or zone == "") def change_zone_of_interface(self, zone, interface, sender=None): self._fw.check_panic() _old_zone = self.get_zone_of_interface(interface) _new_zone = self._fw.check_zone(zone) if _new_zone == _old_zone: return _old_zone if _old_zone is not None: self.remove_interface(_old_zone, interface) _zone = self.add_interface(zone, interface, sender) return _zone def change_default_zone(self, old_zone, new_zone, use_transaction=None): self._fw.check_panic() if use_transaction is None: transaction = self.new_transaction() else: transaction = use_transaction zone_transaction = transaction.zone_transaction(new_zone) self.apply_zone_settings(new_zone, zone_transaction) self._interface(True, new_zone, "+", zone_transaction, append=True) if old_zone is not None and old_zone != "": zone_transaction = transaction.zone_transaction(old_zone) self._interface(False, old_zone, "+", zone_transaction, append=True) if use_transaction is None: transaction.execute(True) def remove_interface(self, zone, interface, use_zone_transaction=None): self._fw.check_panic() zoi = self.get_zone_of_interface(interface) if zoi is None: raise FirewallError(errors.UNKNOWN_INTERFACE, "'%s' is not in any zone" % interface) _zone = zoi if zone == "" else self._fw.check_zone(zone) if zoi != _zone: raise FirewallError(errors.ZONE_CONFLICT, "remove_interface(%s, %s): zoi='%s'" % \ (zone, interface, zoi)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction _obj = self._zones[_zone] interface_id = self.__interface_id(interface) self._interface(False, _zone, interface, zone_transaction) zone_transaction.add_post(self.__unregister_interface, _obj, interface_id) if use_zone_transaction is None: zone_transaction.execute(True) # self.unapply_zone_settings_if_unused(_zone) return _zone def __unregister_interface(self, _obj, interface_id): if interface_id in _obj.settings["interfaces"]: del _obj.settings["interfaces"][interface_id] def query_interface(self, zone, interface): return self.__interface_id(interface) in self.get_settings(zone)["interfaces"] def list_interfaces(self, zone): return self.get_settings(zone)["interfaces"].keys() # SOURCES def check_source(self, source): if checkIPnMask(source): return "ipv4" elif checkIP6nMask(source): return "ipv6" elif check_mac(source): return "" elif source.startswith("ipset:"): self._check_ipset_type_for_source(source[6:]) self._check_ipset_applied(source[6:]) return self._ipset_family(source[6:]) else: raise FirewallError(errors.INVALID_ADDR, source) def __source_id(self, source): ipv = self.check_source(source) return (ipv, source) def add_source(self, zone, source, sender=None, use_zone_transaction=None): self._fw.check_panic() _zone = self._fw.check_zone(zone) _obj = self._zones[_zone] if check_mac(source): source = source.upper() source_id = self.__source_id(source) if source_id in _obj.settings["sources"]: raise FirewallError(errors.ZONE_ALREADY_SET, "'%s' already bound to '%s'" % (source, _zone)) if self.get_zone_of_source(source) is not None: raise FirewallError(errors.ZONE_CONFLICT, "'%s' already bound to a zone" % source) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if not _obj.applied: self.apply_zone_settings(zone, use_zone_transaction=zone_transaction) zone_transaction.add_fail(self.set_zone_applied, _zone, False) self._source(True, _zone, source_id[0], source_id[1], zone_transaction) self.__register_source(_obj, source_id, zone, sender) zone_transaction.add_fail(self.__unregister_source, _obj, source_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_source(self, _obj, source_id, zone, sender): _obj.settings["sources"][source_id] = \ self.__gen_settings(0, sender) # add information whether we add to default or specific zone _obj.settings["sources"][source_id]["__default__"] = (not zone or zone == "") def change_zone_of_source(self, zone, source, sender=None): self._fw.check_panic() _old_zone = self.get_zone_of_source(source) _new_zone = self._fw.check_zone(zone) if _new_zone == _old_zone: return _old_zone if check_mac(source): source = source.upper() if _old_zone is not None: self.remove_source(_old_zone, source) _zone = self.add_source(zone, source, sender) return _zone def remove_source(self, zone, source, use_zone_transaction=None): self._fw.check_panic() if check_mac(source): source = source.upper() zos = self.get_zone_of_source(source) if zos is None: raise FirewallError(errors.UNKNOWN_SOURCE, "'%s' is not in any zone" % source) _zone = zos if zone == "" else self._fw.check_zone(zone) if zos != _zone: raise FirewallError(errors.ZONE_CONFLICT, "remove_source(%s, %s): zos='%s'" % \ (zone, source, zos)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction _obj = self._zones[_zone] source_id = self.__source_id(source) self._source(False, _zone, source_id[0], source_id[1], zone_transaction) zone_transaction.add_post(self.__unregister_source, _obj, source_id) if use_zone_transaction is None: zone_transaction.execute(True) # self.unapply_zone_settings_if_unused(_zone) return _zone def __unregister_source(self, _obj, source_id): if source_id in _obj.settings["sources"]: del _obj.settings["sources"][source_id] def query_source(self, zone, source): if check_mac(source): source = source.upper() return self.__source_id(source) in self.get_settings(zone)["sources"] def list_sources(self, zone): return [ k[1] for k in self.get_settings(zone)["sources"].keys() ] # RICH LANGUAGE def check_rule(self, rule): rule.check() def __rule_id(self, rule): self.check_rule(rule) return str(rule) def _rule_source_ipv(self, source): if not source: return None if source.addr: if checkIPnMask(source.addr): return "ipv4" elif checkIP6nMask(source.addr): return "ipv6" elif hasattr(source, "mac") and source.mac: return "" elif hasattr(source, "ipset") and source.ipset: self._check_ipset_type_for_source(source.ipset) self._check_ipset_applied(source.ipset) return self._ipset_family(source.ipset) return None def __rule(self, enable, zone, rule, mark_id, zone_transaction): self._rule_prepare(enable, zone, rule, mark_id, zone_transaction) def add_rule(self, zone, rule, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] rule_id = self.__rule_id(rule) if rule_id in _obj.settings["rules"]: raise FirewallError(errors.ALREADY_ENABLED, "'%s' already in '%s'" % (rule, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if type(rule.element) == Rich_ForwardPort: mark = self._fw.new_mark() else: mark = None if _obj.applied: self.__rule(True, _zone, rule, mark, zone_transaction) self.__register_rule(_obj, rule_id, mark, timeout, sender) zone_transaction.add_fail(self.__unregister_rule, _obj, rule_id, mark) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_rule(self, _obj, rule_id, mark, timeout, sender): _obj.settings["rules"][rule_id] = self.__gen_settings( timeout, sender, mark=mark) def remove_rule(self, zone, rule, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] rule_id = self.__rule_id(rule) if rule_id not in _obj.settings["rules"]: raise FirewallError(errors.NOT_ENABLED, "'%s' not in '%s'" % (rule, _zone)) if "mark" in _obj.settings["rules"][rule_id]: mark = _obj.settings["rules"][rule_id]["mark"] else: mark = None if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self.__rule(False, _zone, rule, mark, zone_transaction) zone_transaction.add_post(self.__unregister_rule, _obj, rule_id, mark) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_rule(self, _obj, rule_id, mark=None): if rule_id in _obj.settings["rules"]: del _obj.settings["rules"][rule_id] if mark: self._fw.del_mark(mark) def query_rule(self, zone, rule): return self.__rule_id(rule) in self.get_settings(zone)["rules"] def list_rules(self, zone): return list(self.get_settings(zone)["rules"].keys()) # SERVICES def check_service(self, service): self._fw.check_service(service) def __service_id(self, service): self.check_service(service) return service def add_service(self, zone, service, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] service_id = self.__service_id(service) if service_id in _obj.settings["services"]: raise FirewallError(errors.ALREADY_ENABLED, "'%s' already in '%s'" % (service, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._service(True, _zone, service, zone_transaction) self.__register_service(_obj, service_id, timeout, sender) zone_transaction.add_fail(self.__unregister_service, _obj, service_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_service(self, _obj, service_id, timeout, sender): _obj.settings["services"][service_id] = \ self.__gen_settings(timeout, sender) def remove_service(self, zone, service, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] service_id = self.__service_id(service) if service_id not in _obj.settings["services"]: raise FirewallError(errors.NOT_ENABLED, "'%s' not in '%s'" % (service, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._service(False, _zone, service, zone_transaction) zone_transaction.add_post(self.__unregister_service, _obj, service_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_service(self, _obj, service_id): if service_id in _obj.settings["services"]: del _obj.settings["services"][service_id] def query_service(self, zone, service): return self.__service_id(service) in self.get_settings(zone)["services"] def list_services(self, zone): return self.get_settings(zone)["services"].keys() def get_helpers_for_service_modules(self, modules, enable): # If automatic helper assignment is turned off, helpers that # do not have ports defined will be replaced by the helpers # that the helper.module defines. _helpers = [ ] for module in modules: try: helper = self._fw.helper.get_helper(module) except FirewallError: raise FirewallError(errors.INVALID_HELPER, module) if self._fw.nf_conntrack_helper_setting == 0 and \ len(helper.ports) < 1: _module_short_name = get_nf_conntrack_short_name(helper.module) try: _helper = self._fw.helper.get_helper(_module_short_name) _helpers.append(_helper) except FirewallError: if enable: log.warning("Helper '%s' is not available" % _module_short_name) continue else: _helpers.append(helper) return _helpers # PORTS def check_port(self, port, protocol): self._fw.check_port(port) self._fw.check_tcpudp(protocol) def __port_id(self, port, protocol): self.check_port(port, protocol) return (portStr(port, "-"), protocol) def add_port(self, zone, port, protocol, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] port_id = self.__port_id(port, protocol) if port_id in _obj.settings["ports"]: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s' already in '%s'" % (port, protocol, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._port(True, _zone, port, protocol, zone_transaction) self.__register_port(_obj, port_id, timeout, sender) zone_transaction.add_fail(self.__unregister_port, _obj, port_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_port(self, _obj, port_id, timeout, sender): _obj.settings["ports"][port_id] = \ self.__gen_settings(timeout, sender) def remove_port(self, zone, port, protocol, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] port_id = self.__port_id(port, protocol) if port_id not in _obj.settings["ports"]: raise FirewallError(errors.NOT_ENABLED, "'%s:%s' not in '%s'" % (port, protocol, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._port(False, _zone, port, protocol, zone_transaction) zone_transaction.add_post(self.__unregister_port, _obj, port_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_port(self, _obj, port_id): if port_id in _obj.settings["ports"]: del _obj.settings["ports"][port_id] def query_port(self, zone, port, protocol): if self.__port_id(port, protocol) in self.get_settings(zone)["ports"]: return True else: # It might be a single port query that is inside a range for (_port, _protocol) in self.get_settings(zone)["ports"]: if portInPortRange(port, _port) and protocol == _protocol: return True return False def list_ports(self, zone): return list(self.get_settings(zone)["ports"].keys()) # PROTOCOLS def check_protocol(self, protocol): if not checkProtocol(protocol): raise FirewallError(errors.INVALID_PROTOCOL, protocol) def __protocol_id(self, protocol): self.check_protocol(protocol) return protocol def add_protocol(self, zone, protocol, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] protocol_id = self.__protocol_id(protocol) if protocol_id in _obj.settings["protocols"]: raise FirewallError(errors.ALREADY_ENABLED, "'%s' already in '%s'" % (protocol, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._protocol(True, _zone, protocol, zone_transaction) self.__register_protocol(_obj, protocol_id, timeout, sender) zone_transaction.add_fail(self.__unregister_protocol, _obj, protocol_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_protocol(self, _obj, protocol_id, timeout, sender): _obj.settings["protocols"][protocol_id] = \ self.__gen_settings(timeout, sender) def remove_protocol(self, zone, protocol, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] protocol_id = self.__protocol_id(protocol) if protocol_id not in _obj.settings["protocols"]: raise FirewallError(errors.NOT_ENABLED, "'%s' not in '%s'" % (protocol, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._protocol(False, _zone, protocol, zone_transaction) zone_transaction.add_post(self.__unregister_protocol, _obj, protocol_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_protocol(self, _obj, protocol_id): if protocol_id in _obj.settings["protocols"]: del _obj.settings["protocols"][protocol_id] def query_protocol(self, zone, protocol): return self.__protocol_id(protocol) in self.get_settings(zone)["protocols"] def list_protocols(self, zone): return list(self.get_settings(zone)["protocols"].keys()) # SOURCE PORTS def __source_port_id(self, port, protocol): self.check_port(port, protocol) return (portStr(port, "-"), protocol) def add_source_port(self, zone, port, protocol, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] port_id = self.__source_port_id(port, protocol) if port_id in _obj.settings["source_ports"]: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s' already in '%s'" % (port, protocol, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._source_port(True, _zone, port, protocol, zone_transaction) self.__register_source_port(_obj, port_id, timeout, sender) zone_transaction.add_fail(self.__unregister_source_port, _obj, port_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_source_port(self, _obj, port_id, timeout, sender): _obj.settings["source_ports"][port_id] = \ self.__gen_settings(timeout, sender) def remove_source_port(self, zone, port, protocol, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] port_id = self.__source_port_id(port, protocol) if port_id not in _obj.settings["source_ports"]: raise FirewallError(errors.NOT_ENABLED, "'%s:%s' not in '%s'" % (port, protocol, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._source_port(False, _zone, port, protocol, zone_transaction) zone_transaction.add_post(self.__unregister_source_port, _obj, port_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_source_port(self, _obj, port_id): if port_id in _obj.settings["source_ports"]: del _obj.settings["source_ports"][port_id] def query_source_port(self, zone, port, protocol): return self.__source_port_id(port, protocol) in \ self.get_settings(zone)["source_ports"] def list_source_ports(self, zone): return list(self.get_settings(zone)["source_ports"].keys()) # MASQUERADE def __masquerade_id(self): return True def add_masquerade(self, zone, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] masquerade_id = self.__masquerade_id() if masquerade_id in _obj.settings["masquerade"]: raise FirewallError(errors.ALREADY_ENABLED, "masquerade already enabled in '%s'" % _zone) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._masquerade(True, _zone, zone_transaction) self.__register_masquerade(_obj, masquerade_id, timeout, sender) zone_transaction.add_fail(self.__unregister_masquerade, _obj, masquerade_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_masquerade(self, _obj, masquerade_id, timeout, sender): _obj.settings["masquerade"][masquerade_id] = \ self.__gen_settings(timeout, sender) def remove_masquerade(self, zone, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] masquerade_id = self.__masquerade_id() if masquerade_id not in _obj.settings["masquerade"]: raise FirewallError(errors.NOT_ENABLED, "masquerade not enabled in '%s'" % _zone) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._masquerade(False, _zone, zone_transaction) zone_transaction.add_post(self.__unregister_masquerade, _obj, masquerade_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_masquerade(self, _obj, masquerade_id): if masquerade_id in _obj.settings["masquerade"]: del _obj.settings["masquerade"][masquerade_id] def query_masquerade(self, zone): return self.__masquerade_id() in self.get_settings(zone)["masquerade"] # PORT FORWARDING def check_forward_port(self, ipv, port, protocol, toport=None, toaddr=None): self._fw.check_port(port) self._fw.check_tcpudp(protocol) if toport: self._fw.check_port(toport) if toaddr: if not check_single_address(ipv, toaddr): raise FirewallError(errors.INVALID_ADDR, toaddr) if not toport and not toaddr: raise FirewallError( errors.INVALID_FORWARD, "port-forwarding is missing to-port AND to-addr") def __forward_port_id(self, port, protocol, toport=None, toaddr=None): if check_single_address("ipv6", toaddr): self.check_forward_port("ipv6", port, protocol, toport, toaddr) else: self.check_forward_port("ipv4", port, protocol, toport, toaddr) return (portStr(port, "-"), protocol, portStr(toport, "-"), str(toaddr)) def add_forward_port(self, zone, port, protocol, toport=None, toaddr=None, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] forward_id = self.__forward_port_id(port, protocol, toport, toaddr) if forward_id in _obj.settings["forward_ports"]: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s:%s:%s' already in '%s'" % \ (port, protocol, toport, toaddr, _zone)) mark = self._fw.new_mark() if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._forward_port(True, _zone, zone_transaction, port, protocol, toport, toaddr, mark_id=mark) self.__register_forward_port(_obj, forward_id, timeout, sender, mark) zone_transaction.add_fail(self.__unregister_forward_port, _obj, forward_id, mark) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_forward_port(self, _obj, forward_id, timeout, sender, mark): _obj.settings["forward_ports"][forward_id] = \ self.__gen_settings(timeout, sender, mark=mark) def remove_forward_port(self, zone, port, protocol, toport=None, toaddr=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] forward_id = self.__forward_port_id(port, protocol, toport, toaddr) if forward_id not in _obj.settings["forward_ports"]: raise FirewallError(errors.NOT_ENABLED, "'%s:%s:%s:%s' not in '%s'" % \ (port, protocol, toport, toaddr, _zone)) mark = _obj.settings["forward_ports"][forward_id]["mark"] if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._forward_port(False, _zone, zone_transaction, port, protocol, toport, toaddr, mark_id=mark) zone_transaction.add_post(self.__unregister_forward_port, _obj, forward_id, mark) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_forward_port(self, _obj, forward_id, mark): if forward_id in _obj.settings["forward_ports"]: del _obj.settings["forward_ports"][forward_id] self._fw.del_mark(mark) def query_forward_port(self, zone, port, protocol, toport=None, toaddr=None): forward_id = self.__forward_port_id(port, protocol, toport, toaddr) return forward_id in self.get_settings(zone)["forward_ports"] def list_forward_ports(self, zone): return list(self.get_settings(zone)["forward_ports"].keys()) # ICMP BLOCK def check_icmp_block(self, icmp): self._fw.check_icmptype(icmp) def __icmp_block_id(self, icmp): self.check_icmp_block(icmp) return icmp def add_icmp_block(self, zone, icmp, timeout=0, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_timeout(timeout) self._fw.check_panic() _obj = self._zones[_zone] icmp_id = self.__icmp_block_id(icmp) if icmp_id in _obj.settings["icmp_blocks"]: raise FirewallError(errors.ALREADY_ENABLED, "'%s' already in '%s'" % (icmp, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._icmp_block(True, _zone, icmp, zone_transaction) self.__register_icmp_block(_obj, icmp_id, timeout, sender) zone_transaction.add_fail(self.__unregister_icmp_block, _obj, icmp_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_icmp_block(self, _obj, icmp_id, timeout, sender): _obj.settings["icmp_blocks"][icmp_id] = \ self.__gen_settings(timeout, sender) def remove_icmp_block(self, zone, icmp, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] icmp_id = self.__icmp_block_id(icmp) if icmp_id not in _obj.settings["icmp_blocks"]: raise FirewallError(errors.NOT_ENABLED, "'%s' not in '%s'" % (icmp, _zone)) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: self._icmp_block(False, _zone, icmp, zone_transaction) zone_transaction.add_post(self.__unregister_icmp_block, _obj, icmp_id) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_icmp_block(self, _obj, icmp_id): if icmp_id in _obj.settings["icmp_blocks"]: del _obj.settings["icmp_blocks"][icmp_id] def query_icmp_block(self, zone, icmp): return self.__icmp_block_id(icmp) in self.get_settings(zone)["icmp_blocks"] def list_icmp_blocks(self, zone): return self.get_settings(zone)["icmp_blocks"].keys() # ICMP BLOCK INVERSION def __icmp_block_inversion_id(self): return True def add_icmp_block_inversion(self, zone, sender=None, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] icmp_block_inversion_id = self.__icmp_block_inversion_id() if icmp_block_inversion_id in _obj.settings["icmp_block_inversion"]: raise FirewallError( errors.ALREADY_ENABLED, "icmp-block-inversion already enabled in '%s'" % _zone) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: # undo icmp blocks for args in self.get_settings(_zone)["icmp_blocks"]: self._icmp_block(False, _zone, args, zone_transaction) self._icmp_block_inversion(False, _zone, zone_transaction) self.__register_icmp_block_inversion(_obj, icmp_block_inversion_id, sender) zone_transaction.add_fail(self.__undo_icmp_block_inversion, _zone, _obj, icmp_block_inversion_id) # redo icmp blocks if _obj.applied: for args in self.get_settings(_zone)["icmp_blocks"]: self._icmp_block(True, _zone, args, zone_transaction) self._icmp_block_inversion(True, _zone, zone_transaction) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __register_icmp_block_inversion(self, _obj, icmp_block_inversion_id, sender): _obj.settings["icmp_block_inversion"][icmp_block_inversion_id] = \ self.__gen_settings(0, sender) def __undo_icmp_block_inversion(self, _zone, _obj, icmp_block_inversion_id): zone_transaction = self.new_zone_transaction(_zone) # undo icmp blocks if _obj.applied: for args in self.get_settings(_zone)["icmp_blocks"]: self._icmp_block(False, _zone, args, zone_transaction) if icmp_block_inversion_id in _obj.settings["icmp_block_inversion"]: del _obj.settings["icmp_block_inversion"][icmp_block_inversion_id] # redo icmp blocks if _obj.applied: for args in self.get_settings(_zone)["icmp_blocks"]: self._icmp_block(True, _zone, args, zone_transaction) zone_transaction.execute(True) def remove_icmp_block_inversion(self, zone, use_zone_transaction=None): _zone = self._fw.check_zone(zone) self._fw.check_panic() _obj = self._zones[_zone] icmp_block_inversion_id = self.__icmp_block_inversion_id() if icmp_block_inversion_id not in _obj.settings["icmp_block_inversion"]: raise FirewallError( errors.NOT_ENABLED, "icmp-block-inversion not enabled in '%s'" % _zone) if use_zone_transaction is None: zone_transaction = self.new_zone_transaction(_zone) else: zone_transaction = use_zone_transaction if _obj.applied: # undo icmp blocks for args in self.get_settings(_zone)["icmp_blocks"]: self._icmp_block(False, _zone, args, zone_transaction) self._icmp_block_inversion(False, _zone, zone_transaction) self.__unregister_icmp_block_inversion(_obj, icmp_block_inversion_id) zone_transaction.add_fail(self.__register_icmp_block_inversion, _obj, icmp_block_inversion_id, None) # redo icmp blocks if _obj.applied: for args in self.get_settings(_zone)["icmp_blocks"]: self._icmp_block(True, _zone, args, zone_transaction) self._icmp_block_inversion(True, _zone, zone_transaction) if use_zone_transaction is None: zone_transaction.execute(True) return _zone def __unregister_icmp_block_inversion(self, _obj, icmp_block_inversion_id): if icmp_block_inversion_id in _obj.settings["icmp_block_inversion"]: del _obj.settings["icmp_block_inversion"][icmp_block_inversion_id] def query_icmp_block_inversion(self, zone): return self.__icmp_block_inversion_id() in \ self.get_settings(zone)["icmp_block_inversion"] # dynamic chain handling def gen_chain_rules(self, zone, create, chains, transaction): for (table, chain) in chains: if create: if zone in self._chains and \ table in self._chains[zone] and \ chain in self._chains[zone][table]: continue else: if zone not in self._chains or \ table not in self._chains[zone] or \ chain not in self._chains[zone][table]: continue for backend in self._fw.enabled_backends(): if backend.zones_supported and \ table in backend.get_available_tables(): rules = backend.build_zone_chain_rules(zone, table, chain) transaction.add_rules(backend, rules) self._register_chains(zone, create, chains) transaction.add_fail(self._register_chains, zone, create, chains) def _interface(self, enable, zone, interface, zone_transaction, append=False): for backend in self._fw.enabled_backends(): if not backend.zones_supported: continue for table in backend.get_available_tables(): for chain in backend.get_zone_table_chains(table): # create needed chains if not done already if enable: zone_transaction.add_chain(table, chain) rules = backend.build_zone_source_interface_rules(enable, zone, interface, table, chain, append) zone_transaction.add_rules(backend, rules) # IPSETS def _ipset_family(self, name): if self._fw.ipset.get_type(name) == "hash:mac": return None return self._fw.ipset.get_family(name) def __ipset_type(self, name): return self._fw.ipset.get_type(name) def _ipset_match_flags(self, name, flag): return ",".join([flag] * self._fw.ipset.get_dimension(name)) def _check_ipset_applied(self, name): return self._fw.ipset.check_applied(name) def _check_ipset_type_for_source(self, name): _type = self.__ipset_type(name) if _type not in ZONE_SOURCE_IPSET_TYPES: raise FirewallError( errors.INVALID_IPSET, "ipset '%s' with type '%s' not usable as source" % \ (name, _type)) def _source(self, enable, zone, ipv, source, zone_transaction): # For mac source bindings ipv is an empty string, the mac source will # be added for ipv4 and ipv6 for backend in [self._fw.get_backend_by_ipv(ipv)] if ipv else self._fw.enabled_backends(): if not backend.zones_supported: continue for table in backend.get_available_tables(): for chain in backend.get_zone_table_chains(table): # create needed chains if not done already if enable: zone_transaction.add_chain(table, chain) rules = backend.build_zone_source_address_rules(enable, zone, source, table, chain) zone_transaction.add_rules(backend, rules) def _rule_prepare(self, enable, zone, rule, mark_id, zone_transaction): if rule.family is not None: ipvs = [ rule.family ] else: ipvs = [ipv for ipv in ["ipv4", "ipv6"] if self._fw.is_ipv_enabled(ipv)] source_ipv = self._rule_source_ipv(rule.source) if source_ipv is not None and source_ipv != "": if rule.family is not None: # rule family is defined by user, no way to change it if rule.family != source_ipv: raise FirewallError(errors.INVALID_RULE, "Source address family '%s' conflicts with rule family '%s'." % (source_ipv, rule.family)) else: # use the source family as rule family ipvs = [ source_ipv ] # add an element to object to allow backends to know what ipvs this applies to rule.ipvs = ipvs for backend in set([self._fw.get_backend_by_ipv(x) for x in ipvs]): # SERVICE if type(rule.element) == Rich_Service: svc = self._fw.service.get_service(rule.element.name) destinations = [] if len(svc.destination) > 0: if rule.destination: # we can not use two destinations at the same time raise FirewallError(errors.INVALID_RULE, "Destination conflict with service.") for ipv in ipvs: if ipv in svc.destination and backend.is_ipv_supported(ipv): destinations.append(svc.destination[ipv]) else: # dummy for the following for loop destinations.append(None) for destination in destinations: if enable: zone_transaction.add_chain("filter", "INPUT") if self._fw.nf_conntrack_helper_setting == 0: zone_transaction.add_chain("raw", "PREROUTING") if type(rule.action) == Rich_Accept: # only load modules for accept action helpers = self.get_helpers_for_service_modules(svc.modules, enable) modules = [ ] for helper in helpers: module = helper.module _module_short_name = get_nf_conntrack_short_name(module) if self._fw.nf_conntrack_helper_setting == 0: nat_module = module.replace("conntrack", "nat") modules.append(nat_module) if helper.family != "" and not backend.is_ipv_supported(helper.family): # no support for family ipv, continue continue if len(helper.ports) < 1: modules.append(module) else: for (port,proto) in helper.ports: rules = backend.build_zone_helper_ports_rules( enable, zone, proto, port, destination, helper.name, _module_short_name) zone_transaction.add_rules(backend, rules) else: if helper.module not in modules: modules.append(helper.module) nat_module = helper.module.replace("conntrack", "nat") modules.append(nat_module) zone_transaction.add_modules(modules) # create rules for (port,proto) in svc.ports: if enable and type(rule.action) == Rich_Mark: zone_transaction.add_chain("mangle", "PREROUTING") rules = backend.build_zone_ports_rules( enable, zone, proto, port, destination, rule) zone_transaction.add_rules(backend, rules) for proto in svc.protocols: if enable and type(rule.action) == Rich_Mark: zone_transaction.add_chain("mangle", "PREROUTING") rules = backend.build_zone_protocol_rules( enable, zone, proto, destination, rule) zone_transaction.add_rules(backend, rules) # create rules for (port,proto) in svc.source_ports: if enable and type(rule.action) == Rich_Mark: zone_transaction.add_chain("mangle", "PREROUTING") rules = backend.build_zone_source_ports_rules( enable, zone, proto, port, destination, rule) zone_transaction.add_rules(backend, rules) # PORT elif type(rule.element) == Rich_Port: port = rule.element.port protocol = rule.element.protocol self.check_port(port, protocol) if enable: zone_transaction.add_chain("filter", "INPUT") if enable and type(rule.action) == Rich_Mark: zone_transaction.add_chain("mangle", "PREROUTING") rules = backend.build_zone_ports_rules( enable, zone, protocol, port, None, rule) zone_transaction.add_rules(backend, rules) # PROTOCOL elif type(rule.element) == Rich_Protocol: protocol = rule.element.value self.check_protocol(protocol) if enable: zone_transaction.add_chain("filter", "INPUT") if enable and type(rule.action) == Rich_Mark: zone_transaction.add_chain("mangle", "PREROUTING") rules = backend.build_zone_protocol_rules( enable, zone, protocol, None, rule) zone_transaction.add_rules(backend, rules) # MASQUERADE elif type(rule.element) == Rich_Masquerade: if enable: zone_transaction.add_chain("nat", "POSTROUTING") zone_transaction.add_chain("filter", "FORWARD_OUT") for ipv in ipvs: if backend.is_ipv_supported(ipv): zone_transaction.add_post(enable_ip_forwarding, ipv) rules = backend.build_zone_masquerade_rules(enable, zone, rule) zone_transaction.add_rules(backend, rules) # FORWARD PORT elif type(rule.element) == Rich_ForwardPort: port = rule.element.port protocol = rule.element.protocol toport = rule.element.to_port toaddr = rule.element.to_address for ipv in ipvs: if backend.is_ipv_supported(ipv): self.check_forward_port(ipv, port, protocol, toport, toaddr) if toaddr and enable: zone_transaction.add_post(enable_ip_forwarding, ipv) filter_chain = "INPUT" if not toaddr else "FORWARD_IN" if enable: zone_transaction.add_chain("mangle", "PREROUTING") zone_transaction.add_chain("nat", "PREROUTING") zone_transaction.add_chain("filter", filter_chain) rules = backend.build_zone_forward_port_rules( enable, zone, filter_chain, port, protocol, toport, toaddr, mark_id, rule) zone_transaction.add_rules(backend, rules) # SOURCE PORT elif type(rule.element) == Rich_SourcePort: port = rule.element.port protocol = rule.element.protocol self.check_port(port, protocol) if enable: zone_transaction.add_chain("filter", "INPUT") if enable and type(rule.action) == Rich_Mark: zone_transaction.add_chain("mangle", "PREROUTING") rules = backend.build_zone_source_ports_rules( enable, zone, protocol, port, None, rule) zone_transaction.add_rules(backend, rules) # ICMP BLOCK and ICMP TYPE elif type(rule.element) == Rich_IcmpBlock or \ type(rule.element) == Rich_IcmpType: ict = self._fw.icmptype.get_icmptype(rule.element.name) if type(rule.element) == Rich_IcmpBlock and \ rule.action and type(rule.action) == Rich_Accept: # icmp block might have reject or drop action, but not accept raise FirewallError(errors.INVALID_RULE, "IcmpBlock not usable with accept action") if ict.destination: for ipv in ipvs: if ipv in ict.destination \ and not backend.is_ipv_supported(ipv): raise FirewallError( errors.INVALID_RULE, "Icmp%s %s not usable with %s" % \ ("Block" if type(rule.element) == \ Rich_IcmpBlock else "Type", rule.element.name, backend.name)) table = "filter" if enable: zone_transaction.add_chain(table, "INPUT") zone_transaction.add_chain(table, "FORWARD_IN") rules = backend.build_zone_icmp_block_rules(enable, zone, ict, rule) zone_transaction.add_rules(backend, rules) elif rule.element is None: if enable: zone_transaction.add_chain("filter", "INPUT") if enable and type(rule.action) == Rich_Mark: zone_transaction.add_chain("mangle", "PREROUTING") rules = backend.build_zone_rich_source_destination_rules( enable, zone, rule) zone_transaction.add_rules(backend, rules) # EVERYTHING ELSE else: raise FirewallError(errors.INVALID_RULE, "Unknown element %s" % type(rule.element)) return mark_id def _service(self, enable, zone, service, zone_transaction): svc = self._fw.service.get_service(service) helpers = self.get_helpers_for_service_modules(svc.modules, enable) if enable: if self._fw.nf_conntrack_helper_setting == 0: zone_transaction.add_chain("raw", "PREROUTING") else: modules = [ ] for helper in helpers: modules.append(helper.module) nat_module = helper.module.replace("conntrack", "nat") modules.append(nat_module) zone_transaction.add_modules(modules) zone_transaction.add_chain("filter", "INPUT") # build a list of (backend, destination). The destination may be ipv4, # ipv6 or None # backends_ipv = [] for ipv in ["ipv4", "ipv6"]: if not self._fw.is_ipv_enabled(ipv): continue backend = self._fw.get_backend_by_ipv(ipv) if len(svc.destination) > 0: if ipv in svc.destination: backends_ipv.append((backend, svc.destination[ipv])) else: if (backend, None) not in backends_ipv: backends_ipv.append((backend, None)) for (backend,destination) in backends_ipv: if self._fw.nf_conntrack_helper_setting == 0: for helper in helpers: module = helper.module _module_short_name = get_nf_conntrack_short_name(module) nat_module = helper.module.replace("conntrack", "nat") zone_transaction.add_module(nat_module) if helper.family != "" and not backend.is_ipv_supported(helper.family): # no support for family ipv, continue continue if len(helper.ports) < 1: zone_transaction.add_module(module) else: for (port,proto) in helper.ports: rules = backend.build_zone_helper_ports_rules( enable, zone, proto, port, destination, helper.name, _module_short_name) zone_transaction.add_rules(backend, rules) for (port,proto) in svc.ports: rules = backend.build_zone_ports_rules(enable, zone, proto, port, destination) zone_transaction.add_rules(backend, rules) for protocol in svc.protocols: rules = backend.build_zone_protocol_rules( enable, zone, protocol, destination) zone_transaction.add_rules(backend, rules) for (port,proto) in svc.source_ports: rules = backend.build_zone_source_ports_rules( enable, zone, proto, port, destination) zone_transaction.add_rules(backend, rules) def _port(self, enable, zone, port, protocol, zone_transaction): if enable: zone_transaction.add_chain("filter", "INPUT") for backend in self._fw.enabled_backends(): if not backend.zones_supported: continue rules = backend.build_zone_ports_rules(enable, zone, protocol, port) zone_transaction.add_rules(backend, rules) def _protocol(self, enable, zone, protocol, zone_transaction): if enable: zone_transaction.add_chain("filter", "INPUT") for backend in self._fw.enabled_backends(): if not backend.zones_supported: continue rules = backend.build_zone_protocol_rules(enable, zone, protocol) zone_transaction.add_rules(backend, rules) def _source_port(self, enable, zone, port, protocol, zone_transaction): if enable: zone_transaction.add_chain("filter", "INPUT") for backend in self._fw.enabled_backends(): if not backend.zones_supported: continue rules = backend.build_zone_source_ports_rules(enable, zone, protocol, port) zone_transaction.add_rules(backend, rules) def _masquerade(self, enable, zone, zone_transaction): if enable: zone_transaction.add_chain("nat", "POSTROUTING") zone_transaction.add_chain("filter", "FORWARD_OUT") ipv = "ipv4" zone_transaction.add_post(enable_ip_forwarding, ipv) backend = self._fw.get_backend_by_ipv(ipv) rules = backend.build_zone_masquerade_rules(enable, zone) zone_transaction.add_rules(backend, rules) def _forward_port(self, enable, zone, zone_transaction, port, protocol, toport=None, toaddr=None, mark_id=None): if check_single_address("ipv6", toaddr): ipv = "ipv6" else: ipv = "ipv4" filter_chain = "INPUT" if not toaddr else "FORWARD_IN" if enable: zone_transaction.add_chain("mangle", "PREROUTING") zone_transaction.add_chain("nat", "PREROUTING") zone_transaction.add_chain("filter", filter_chain) if toaddr and enable: zone_transaction.add_post(enable_ip_forwarding, ipv) backend = self._fw.get_backend_by_ipv(ipv) rules = backend.build_zone_forward_port_rules( enable, zone, filter_chain, port, protocol, toport, toaddr, mark_id) zone_transaction.add_rules(backend, rules) def _icmp_block(self, enable, zone, icmp, zone_transaction): ict = self._fw.icmptype.get_icmptype(icmp) if enable: zone_transaction.add_chain("filter", "INPUT") zone_transaction.add_chain("filter", "FORWARD_IN") for backend in self._fw.enabled_backends(): if not backend.zones_supported: continue skip_backend = False if ict.destination: for ipv in ["ipv4", "ipv6"]: if ipv in ict.destination: if not backend.is_ipv_supported(ipv): skip_backend = True break if skip_backend: continue rules = backend.build_zone_icmp_block_rules(enable, zone, ict) zone_transaction.add_rules(backend, rules) def _icmp_block_inversion(self, enable, zone, zone_transaction): target = self._zones[zone].target # Do not add general icmp accept rules into a trusted, block or drop # zone. if target in [ "DROP", "%%REJECT%%", "REJECT" ]: return if not self.query_icmp_block_inversion(zone) and target == "ACCEPT": # ibi target and zone target are ACCEPT, no need to add an extra # rule return zone_transaction.add_chain("filter", "INPUT") zone_transaction.add_chain("filter", "FORWARD_IN") # To satisfy nftables backend rule lookup we must execute pending # rules. See nftables.build_zone_icmp_block_inversion_rules() if enable: zone_transaction.execute(enable) zone_transaction.clear() for backend in self._fw.enabled_backends(): if not backend.zones_supported: continue rules = backend.build_zone_icmp_block_inversion_rules(enable, zone) zone_transaction.add_rules(backend, rules) PK[ $site-packages/firewall/core/prog.pycnu[ c`c@s(ddlZdgZdddZdS(iNtrunProgc Cs|dkrg}n|g|}d}|r[t|d}|jj}WdQXnidd6}y:tj|dtjdtjdtjdtd|}Wnt k rd SX|j |\}} |j d d }|j |fS(NtrtCtLANGtstdintstderrtstdoutt close_fdstenvitsutf-8treplace(iR ( tNonetopentreadtencodet subprocesstPopentPIPEtSTDOUTtTruetOSErrort communicatetdecodet returncode( tprogtargvRtargst input_stringthandleRtprocesstoutputt err_output((s6/usr/lib/python2.7/site-packages/firewall/core/prog.pyRs$       (Rt__all__R R(((s6/usr/lib/python2.7/site-packages/firewall/core/prog.pyts  PK[[Domm&site-packages/firewall/core/logger.pyonu[ c`c@sddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z de fdYZ de fdYZ d e fd YZd e fd YZde fd YZde fdYZeZdS(t LogTargettFileLogtLoggertlogiNcBs5eZdZdZddZdZdZRS(s% Abstract class for logging targets. cCs d|_dS(N(tNonetfd(tself((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt__init__(sicCstddS(Ns%LogTarget.write is an abstract method(tNotImplementedError(Rtdatatleveltloggertis_debug((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytwrite+scCstddS(Ns%LogTarget.flush is an abstract method(R(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytflush.scCstddS(Ns%LogTarget.close is an abstract method(R(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytclose1s(t__name__t __module__t__doc__RR RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR&s    t _StdoutLogcBs/eZdZddZdZdZRS(cCstj|tj|_dS(N(RRtsyststdoutR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR8s icCs|jj||jdS(N(RR R(RR R R R ((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR <scCs|jdS(N(R(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRAscCs|jjdS(N(RR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRDs(RRRR RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR7s   t _StderrLogcBseZdZRS(cCstj|tj|_dS(N(RRRtstderrR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRKs (RRR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRJst _SyslogLogcBs/eZdZddZdZdZRS(cCs=tj|tjtjjtjdtj tj dS(Ni( RRtsyslogtopenlogtostpathtbasenameRtargvtLOG_PIDt LOG_DAEMON(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRSs icCsd}|rtj}nl||jkr3tj}nQ||jkrNtj}n6||jkritj}n||j krtj }n|j dr|t |d }nt |dkr|dkrtj|qtj||ndS(Ns ii( RRt LOG_DEBUGtINFO1tLOG_INFOtWARNINGt LOG_WARNINGtERRORtLOG_ERRtFATALtLOG_CRITtendswithtlen(RR R R R tpriority((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR as"      cCstjdS(N(Rtcloselog(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRwscCsdS(N((R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRzs(RRRR RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRRs   cBsAeZdZddZdZddZdZdZRS(s< FileLog class. File will be opened on the first write. twcCs#tj|||_||_dS(N(RRtfilenametmode(RR/R0((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs  cCs|jr dStjtjB}|jjdr?|tjO}ntj|j|d|_tj |jdtj |j|j|_t j |jt j t j dS(Ntai(RRtO_CREATtO_WRONLYR0t startswithtO_APPENDtopenR/tfchmodtfdopentfcntltF_SETFDt FD_CLOEXEC(Rtflags((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR6s icCs7|js|jn|jj||jjdS(N(RR6R R(RR R R R ((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR s  cCs'|js dS|jjd|_dS(N(RRR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs  cCs|js dS|jjdS(N(RR(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs (RRRRR6R RR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs    cBseZdZdZdZdZdZdZdZe Z e Z e Zddd Zd Zd d Zd d Zd dZd dZdZdZdZdZdZdZed2dZed2dZed2dZed2dZed2dZ ed2dZ!dZ"dZ#dZ$dZ%d Z&d!Z'd"Z(d#Z)d$Z*d%Z+d&Z,dd'Z-d(Z.dd)Z/ed2dd*Z0ed2dd+Z1ed2dd,Z2dd-Z3d.Z4d/Z5d0Z6dd1Z7RS(3sL Format string: %(class)s Calling class the function belongs to, else empty %(date)s Date using Logger.date_format, see time module %(domain)s Full Domain: %(module)s.%(class)s.%(function)s %(file)s Filename of the module %(function)s Function name, empty in __main__ %(label)s Label according to log function call from Logger.label %(level)d Internal logging level %(line)d Line number in module %(module)s Module name %(message)s Log message Standard levels: FATAL Fatal error messages ERROR Error messages WARNING Warning messages INFOx, x in [1..5] Information DEBUGy, y in [1..10] Debug messages NO_INFO No info output NO_DEBUG No debug output INFO_MAX Maximum info level DEBUG_MAX Maximum debug level x and y depend on info_max and debug_max from Logger class initialization. See __init__ function. Default logging targets: stdout Logs to stdout stderr Logs to stderr syslog Logs to syslog Additional arguments for logging functions (fatal, error, warning, info and debug): nl Disable newline at the end with nl=0, default is nl=1. fmt Format string for this logging entry, overloads global format string. Example: fmt="%(file)s:%(line)d %(message)s" nofmt Only output message with nofmt=1. The nofmt argument wins over the fmt argument. Example: from logger import log log.setInfoLogLevel(log.INFO1) log.setDebugLogLevel(log.DEBUG1) for i in range(1, log.INFO_MAX+1): log.setInfoLogLabel(i, "INFO%d: " % i) log.setFormat("%(date)s %(module)s:%(line)d [%(domain)s] %(label)s: " "%(level)d %(message)s") log.setDateFormat("%Y-%m-%d %H:%M:%S") fl = FileLog("/tmp/log", "a") log.addInfoLogging("*", fl) log.addDebugLogging("*", fl) log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s") log.debug3("debug3") log.debug2("debug2") log.debug1("debug1") log.info2("info2") log.info1("info1") log.warning("warning\n", nl=0) log.error("error\n", nl=0) log.fatal("fatal") log.info(log.INFO1, "nofmt info", nofmt=1) iiiiiiii cCsi|_i|_d|_d|_i|_i|_i|_i|_i|_i|_ |dkryt d|n|dkrt d|n|j |_ ||_ d|_||_|j|jd|j|jd|j|jd|j|j dxbtd|j dD]J}t|d |||j|dt|d |d ||q"Wxftd|jdD]N}t|d |||j|d |t|d|d||qW|j|j|j|j|jd|jd|jd|j|j|j|j g|jd|jgt|j|j dD] }|^qd|jd|jgtd|jdD] }|^qdS(s Logger class initialization tisLogger: info_max %d is too lowisLogger: debug_max %d is too lows FATAL ERROR: sERROR: s WARNING: sINFO%dsinfo%dcsfdS(Ncsj|||S(N(tinfo(tmessagetargstkwargs(Rtx(s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt s((RRB((RRBs8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRCssDEBUG%ds DEBUG%d: sdebug%dcsfdS(Ncsj|||S(N(tdebug(R?R@RA(RRB(s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRC)s((RRB((RRBs8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRC(ss%(label)s%(message)ss%d %b %Y %H:%M:%St*N( t_levelt _debug_levelt_formatt _date_formatt_labelt _debug_labelt_loggingt_debug_loggingt_domainst_debug_domainst ValueErrorR$tNO_INFOtINFO_MAXtNO_DEBUGt DEBUG_MAXtsetInfoLogLabelR(t TRACEBACKR&trangetsetattrtsetDebugLogLabeltsetInfoLogLevelR"tsetDebugLogLevelt setFormatt setDateFormattsetInfoLoggingRRtsetDebugLogging(Rtinfo_maxt debug_maxRFti((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRsX                     -cCshxat|j|jdD]F}||jkr5qnx(|j|D]\}}}|jqCWqWdS(s Close all logging targets iN(RWR(RTRLR(RR tdummyttarget((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR8s  REcCs.|j|||jkr'|j|S|jS(s Get info log level. (t _checkDomainRFtNOTHING(Rtdomain((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pytgetInfoLogLevel@s  cCsT|j|||jkr(|j}n||jkrC|j}n||j|s  cOsM|j|ddd|j|j|d|d<|j||||dS(s Debug log using debug level [1..debug_max]. There are additional debugx functions according to debug_max from __init__RliRmR N(RoRTR}R~(RR RHR@RA((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRDs  cCs)|j|jtjdgdidS(NR@RA(R~RVt tracebackt format_exc(R((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt exceptionscCs8||ks||kr4td|||fndS(Ns*Level %d out of range, should be [%d..%d].(RP(RR RlRm((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRoscCsD|s dSx3|jD]%}|dkrtd|qqWdS(NtnlRstnofmts0Key '%s' is not allowed as argument for logging.(snlsfmtsnofmt(tkeysRP(RRAtkey((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyR}s  cCs*| s|dkr&td|ndS(NR=sDomain '%s' is not valid.(RP(RRg((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRescCs||jkrt|ts-t|tr6|}n |g}x|D]J}|rq|j|ddd|jqF|j|d|jd|jqFWnY|rgt|j |jD] }|^q}n(gt|j|jD] }|^q}|S(s Generate log level array. RliRm( tALLt isinstancetlistttupleRoRTR(RRRWtDEBUG1(RR R RqRb((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRns    +(cCspt|tst|tr'|}n |g}x9|D]1}t|jts7td|jjq7q7W|S(s Generate target array. s '%s' is no valid logging target.(RRRt issubclasst __class__RRPR(RRdttargetst_target((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt _getTargetss   cCs|r.|j}|j}d|jdf}n(|j}|j}|j|jdf}t|dkru|jnxwt |d|dD]^}||krqnxC||D]7\}}}||kr|j |gj |qqWqWdS(s% Generate dict with domain by level. iiN( RORMRTRNRLR(RRR+tclearRWt setdefaulttappend(RR RNRLt_rangeR RgRc((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyt _genDomainss       c Cs|j||j||}|j|}|r@|j}n |j}x5|D]-}x$|D]}|||fg|||SqqWx-|jD]"}|j||}|rL|SqLWdS(s@ Internal function to get calling class. Returns class or None. N( RtvaluesRRRRt __bases__RR(RRRRtbaset_obj((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRs cOsd}d|kr|d}nd}d|kr>|d}nd}d|kr]|d}n|j||}|sydSt|dkr|||dRDRRoR}ReRnRRRrRtRwRzRRR~R(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyRsdG   ;                      4(t__all__RRRRRRRR9tos.pathRtobjectRRRRRRR(((s8/usr/lib/python2.7/site-packages/firewall/core/logger.pyts(          -( 4PK[Uu))$site-packages/firewall/core/base.pycnu[ c`c@sdZdZdddedgZidd6dd 6d d 6d d 6dd6dd6Ziddddddddddddddd d!gd"6d#d$d%d&d'd(d)ddg d*6Zd+d,d-d.d/d0d1gZd2S(3sBase firewall settingss{chain}_{zone}tACCEPTs %%REJECT%%tDROPtdefaulttPREt PREROUTINGtPOSTt POSTROUTINGtINtINPUTtFWDIt FORWARD_INtFWDOt FORWARD_OUTtOUTtOUTPUTsicmp-host-prohibiteds host-prohibsicmp-net-unreachables net-unreachsicmp-host-unreachables host-unreachsicmp-port-unreachables port-unreachsicmp-proto-unreachables proto-unreachsicmp-net-prohibiteds net-prohibs tcp-resetstcp-rstsicmp-admin-prohibiteds admin-prohibtipv4sicmp6-adm-prohibitedsadm-prohibitedsicmp6-no-routesno-routesicmp6-addr-unreachables addr-unreachsicmp6-port-unreachabletipv6shash:ips hash:ip,ports hash:ip,markshash:nets hash:net,portshash:net,ifaceshash:macN(t__doc__tDEFAULT_ZONE_TARGETt ZONE_TARGETSt SHORTCUTSt REJECT_TYPEStZONE_SOURCE_IPSET_TYPES(((s6/usr/lib/python2.7/site-packages/firewall/core/base.pyts,           PK[}w@&site-packages/firewall/core/helper.pycnu[ c`c@sdZdZdS(sThe helper maxnameleni N(t__doc__tHELPER_MAXNAMELEN(((s8/usr/lib/python2.7/site-packages/firewall/core/helper.pytsPK[/>EE'site-packages/firewall/core/fw_test.pycnu[ c`c@sdgZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddlm+Z+ddl,m-Z-de.fdYZ/dS(t Firewall_testiN(tconfig(t functions(tFirewallIcmpType(tFirewallService(t FirewallZone(tFirewallDirect(tFirewallConfig(tFirewallPolicies(t FirewallIPSet(tFirewallHelper(tlog(tfirewalld_conf(tDirect(tservice_reader(ticmptype_reader(t zone_readertZone(t ipset_reader(t IPSET_TYPES(t helper_reader(terrors(t FirewallErrorcBs+eZdZdZdZdZeedZdZedZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZedZdZdZdZdZdZdZdZdZdZdZdZ dZ!RS(cCsttj|_t|_t|_t|_t|_t |_ t ||_ t ||_t||_t||_t||_t|_t||_t||_|jdS(N(R RtFIREWALLD_CONFt_firewalld_conftFalsetip4tables_enabledtip6tables_enabledtebtables_enabledt ipset_enabledRtipset_supported_typesRticmptypeRtserviceRtzoneRtdirectRRtpoliciesR tipsetR thelpert_Firewall_test__init_vars(tself((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt__init__8s      cCshd|j|j|j|j|j|j|j|j|j|j |j |j |j |j |j|jfS(Ns>%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)(t __class__RRRt_statet_panict _default_zonet_module_refcountt_markst _min_marktcleanup_on_exittipv6_rpfilter_enabledRt_individual_callst _log_deniedt_automatic_helpers(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt__repr__LscCsyd|_t|_d|_i|_g|_tj|_tj |_ tj |_ tj |_tj|_tj|_dS(NtINITt(R*RR+R,R-R.RtFALLBACK_MINIMAL_MARKR/tFALLBACK_CLEANUP_ON_EXITR0tFALLBACK_IPV6_RPFILTERR1tFALLBACK_INDIVIDUAL_CALLSR2tFALLBACK_LOG_DENIEDR3tFALLBACK_AUTOMATIC_HELPERSR4(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt __init_varsUs          cCs|jS(N(R2(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytindividual_callscsc Cstj}tjdtjy|jjWntk rMtjdn X|jj dru|jj d}n|jj drt |jj d|_ n|jj dr|jj d}|dk r|j d-krt|_qn|jj drp|jj d}|dk rp|j d.krptjd y|jjWqmtk riqmXqpn|jj d r|jj d }|dk r|j d/krt|_n|j d0krt|_qqn|jrtjd n tjd|jj drf|jj d}|dk rf|j d1krftjdt|_qfn|jj dr|jj d}|dks|j dkrd|_q|j |_tjd|jn|jj drm|jj d}|dk rm|j d2kr'd|_n-|j d3krEd |_n|j |_tjd|jqmn|jjtj|jtjdy|jjjWn]tk r }|jjrtjd|jjj|q tjd|jjj|nX|jjtj|j|j tj!d|j tj"d|j tj#d|j tj$dt%|j&j'dkrtjdn|j tj(d|j tj)d|j tj*d|j tj+dt%|j,j-dkrtjdn|j tj.d|j tj/dt%|j0j1dkrrtj2d t3j4d!nt}xEd"d#d$gD]4}||j0j1krtj2d%|t}qqW|rt3j4d!n||j0j1krId&|j0j1kr d&}n$d'|j0j1kr'd'}nd"}tjd(|||}ntjd)|t5tj6} t7j8j9tj6rtjd*tj6y| jWqtk r}tjd+tj6|qXn|jj:tj| |j;||_<d,|_=dS(4Ns"Loading firewalld config file '%s's0Using fallback firewalld configuration settings.t DefaultZonet MinimalMarkt CleanupOnExittnotfalsetLockdowntyesttruesLockdown is enabledt IPv6_rpfiltersIPv6 rpfilter is enabledsIPV6 rpfilter is disabledtIndividualCallssIndividualCalls is enabledt LogDeniedtoffsLogDenied is set to '%s'tAutomaticHelperssAutomaticHelpers is set to '%s'sLoading lockdown whitelists*Failed to load lockdown whitelist '%s': %sR$RisNo icmptypes found.R%R sNo services found.R!sNo zones found.itblocktdropttrustedsZone '%s' is not available.tpublictexternals+Default zone '%s' is not valid. Using '%s'.sUsing default zone '%s'sLoading direct rules file '%s's)Failed to load direct rules file '%s': %stRUNNING(RCRD(syesRG(RCRD(syesRG(syesRG(RCRD(syesRG(>Rt FALLBACK_ZONER tdebug1RRtreadt ExceptiontwarningtgettintR/tNonetlowerRR0R#tenable_lockdownRR1tTrueR2R3R4tset_firewalld_conftcopytdeepcopytlockdown_whitelisttquery_lockdownterrortfilenamet set_policiest_loadertFIREWALLD_IPSETStETC_FIREWALLD_IPSETStFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPEStlenRt get_icmptypestFIREWALLD_HELPERStETC_FIREWALLD_HELPERStFIREWALLD_SERVICEStETC_FIREWALLD_SERVICESR t get_servicestFIREWALLD_ZONEStETC_FIREWALLD_ZONESR!t get_zonestfataltsystexitR tFIREWALLD_DIRECTtostpathtexistst set_directt check_zoneR,R*( R'treloadtcomplete_reloadt default_zonetvaluetmsgRctzR!tobj((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt_startfs                            cCs|jdS(N(R(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytstartsc Cstjj|sdS|r|jtjr}|dkr}t}tjj||_|j |j||_t |_ qt }nxt tj |D]}|jds|jtjr|dkrtjjd||fr|jd||f|dtqqnd||f}tjd||y|dkrt||}|j|jjkr|jj|j}tjd||j|j|j|jj|jn!|jjtjrt|_ n|jj||jjtj|n |dkrt||}|j|jjkr|jj|j}tjd||j|j|j|jj |jn!|jjtjrt|_ n|jj!||jj!tj|n>|dkrht"||d |}|r@dtjj|tjj|d d !f|_|j |jntj|} |j|j#j$kr|j#j%|j}|j#j&|j|j'rtjd ||j|||j(|qtjd||j|j|jn*|jjtjrt|_ t| _ n|jj)| |rUtjd ||j|||j(|q|j#j)|n|d kr5t*||}|j|j+j,kr|j+j-|j}tjd||j|j|j|j+j.|jn!|jjtjr t|_ n|j+j/||jj/tj|n|dkrt0||}|j|j1j2kr|j1j3|j}tjd||j|j|j|j1j4|jn!|jjtjrt|_ n|j1j5||jj5tj|ntj6d|Wqt7k r>} tj8d||| qt9k rktj8d||tj:qXqW|r|j'r|j|j#j$kr|j#j%|j}tjd||j|j|jy|j#j&|jWnnX|jj;|jn|j#j)|ndS(NR!s.xmls%s/%stcombinesLoading %s file '%s'Rs Overloads %s '%s' ('%s/%s')R t no_check_nameiis Combining %s '%s' ('%s/%s')R$R%sUnknown reader type %ssFailed to load %s file '%s': %ssFailed to load %s file '%s':s0 Overloading and deactivating %s '%s' ('%s/%s')(<RyRztisdirt startswithRt ETC_FIREWALLDRtbasenametnamet check_nameRtdefaulttsortedtlistdirtendswithRfR]R RTRRRlt get_icmptypeRdtremove_icmptypet add_icmptypeR_R`RR Rqt get_servicetremove_servicet add_serviceRR!Rttget_zonet remove_zonetcombinedRtadd_zoneRR$t get_ipsetst get_ipsett remove_ipsett add_ipsetRR%t get_helperst get_helpert remove_helpert add_helperRuRRcRVt exceptiont forget_zone( R'Rzt reader_typeRt combined_zoneRdRRtorig_objt config_objR((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRfs                                             cCs|jj|jj|jj|jj|jj|jj|jj|jj|j j|j dS(N( RtcleanupR R!R$R%RR"R#RR&(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRs         cCs|jdS(N(R(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytstopscCsdS(N((R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_panicscCsV|}| s|dkr(|j}n||jjkrRttj|n|S(NR7(tget_default_zoneR!RtRRt INVALID_ZONE(R'R!t_zone((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR}s cCs(tj|s$ttj|ndS(N(RtcheckInterfaceRRtINVALID_INTERFACE(R't interface((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytcheck_interfacescCs|jj|dS(N(R t check_service(R'R ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRscCs tj|}|dksY|dksY|dksYt|dkr|d|dkr|dkrytjd|nz|dkrtjd|nZ|dkrtjd|n:t|dkr|d|dkrtjd |nttj|ndS( Niiiiis'%s': port > 65535s'%s': port is invalids'%s': port is ambiguouss'%s': range start >= end( Rt getPortRangeRZRkR RTRRt INVALID_PORT(R'tporttrange((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_ports$&   &cCsA|sttjn|dkr=ttjd|ndS(Nttcptudptsctptdccps''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}(RRRR(RRtMISSING_PROTOCOLtINVALID_PROTOCOL(R'tprotocol((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_tcpudps   cCs(tj|s$ttj|ndS(N(RtcheckIPRRt INVALID_ADDR(R'tip((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytcheck_ipscCs||dkr3tj|sxttj|qxnE|dkrftj|sxttj|qxnttjddS(Ntipv4tipv6s'%s' not in {'ipv4'|'ipv6'}(Rt checkIPnMaskRRRt checkIP6nMaskt INVALID_IPV(R'tipvtsource((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_addresss   cCs|jj|dS(N(Rtcheck_icmptype(R'ticmp((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRscCsdS(N((R'R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR~scCs|jS(N(R*(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt get_statescCsdS(N((R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytenable_panic_modescCsdS(N((R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytdisable_panic_modescCs|jS(N(R+(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytquery_panic_modescCs|jS(N(R3(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytget_log_deniedscCs|tjkr:ttjd|djtjfn||jkr||_|jj d||jj |j nttj |dS(Ns'%s', choose from '%s's','RJ( RtLOG_DENIED_VALUESRRt INVALID_VALUEtjoinRR3RtsettwriteR~t ALREADY_SET(R'R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytset_log_denieds    cCs|jS(N(R4(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytget_automatic_helpersscCs|tjkr:ttjd|djtjfn||jkr||_|jj d||jj |j nttj |dS(Ns'%s', choose from '%s's','RL( RtAUTOMATIC_HELPERS_VALUESRRRRRR4RRRR~R(R'R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytset_automatic_helperss    cCs|jS(N(R,(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRscCs`|j|}||jkrJ||_|jjd||jjnttj|dS(NR@(R}R,RRRRRtZONE_ALREADY_SET(R'R!R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytset_default_zones  cCs$|jjdd|jjdS(NRERF(RRR(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR\(scCs$|jjdd|jjdS(NRERC(RRR(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytdisable_lockdown,s("t__name__t __module__R(R5R&R?RRRRfRRRR}RRRRRRRR~RRRRRRRRRRR\R(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR7s>                        (0t__all__tos.pathRyRvR_tfirewallRRtfirewall.core.fw_icmptypeRtfirewall.core.fw_serviceRtfirewall.core.fw_zoneRtfirewall.core.fw_directRtfirewall.core.fw_configRtfirewall.core.fw_policiesRtfirewall.core.fw_ipsetR tfirewall.core.fw_helperR tfirewall.core.loggerR tfirewall.core.io.firewalld_confR tfirewall.core.io.directR tfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.zoneRRtfirewall.core.io.ipsetRtfirewall.core.ipsetRtfirewall.core.io.helperRRtfirewall.errorsRtobjectR(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyts2    PK[/>EE'site-packages/firewall/core/fw_test.pyonu[ c`c@sdgZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ddl m Z ddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddlm+Z+ddl,m-Z-de.fdYZ/dS(t Firewall_testiN(tconfig(t functions(tFirewallIcmpType(tFirewallService(t FirewallZone(tFirewallDirect(tFirewallConfig(tFirewallPolicies(t FirewallIPSet(tFirewallHelper(tlog(tfirewalld_conf(tDirect(tservice_reader(ticmptype_reader(t zone_readertZone(t ipset_reader(t IPSET_TYPES(t helper_reader(terrors(t FirewallErrorcBs+eZdZdZdZdZeedZdZedZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZedZdZdZdZdZdZdZdZdZdZdZdZ dZ!RS(cCsttj|_t|_t|_t|_t|_t |_ t ||_ t ||_t||_t||_t||_t|_t||_t||_|jdS(N(R RtFIREWALLD_CONFt_firewalld_conftFalsetip4tables_enabledtip6tables_enabledtebtables_enabledt ipset_enabledRtipset_supported_typesRticmptypeRtserviceRtzoneRtdirectRRtpoliciesR tipsetR thelpert_Firewall_test__init_vars(tself((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt__init__8s      cCshd|j|j|j|j|j|j|j|j|j|j |j |j |j |j |j|jfS(Ns>%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r)(t __class__RRRt_statet_panict _default_zonet_module_refcountt_markst _min_marktcleanup_on_exittipv6_rpfilter_enabledRt_individual_callst _log_deniedt_automatic_helpers(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt__repr__LscCsyd|_t|_d|_i|_g|_tj|_tj |_ tj |_ tj |_tj|_tj|_dS(NtINITt(R*RR+R,R-R.RtFALLBACK_MINIMAL_MARKR/tFALLBACK_CLEANUP_ON_EXITR0tFALLBACK_IPV6_RPFILTERR1tFALLBACK_INDIVIDUAL_CALLSR2tFALLBACK_LOG_DENIEDR3tFALLBACK_AUTOMATIC_HELPERSR4(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt __init_varsUs          cCs|jS(N(R2(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytindividual_callscsc Cstj}tjdtjy|jjWntk rMtjdn X|jj dru|jj d}n|jj drt |jj d|_ n|jj dr|jj d}|dk r|j d-krt|_qn|jj drp|jj d}|dk rp|j d.krptjd y|jjWqmtk riqmXqpn|jj d r|jj d }|dk r|j d/krt|_n|j d0krt|_qqn|jrtjd n tjd|jj drf|jj d}|dk rf|j d1krftjdt|_qfn|jj dr|jj d}|dks|j dkrd|_q|j |_tjd|jn|jj drm|jj d}|dk rm|j d2kr'd|_n-|j d3krEd |_n|j |_tjd|jqmn|jjtj|jtjdy|jjjWn]tk r }|jjrtjd|jjj|q tjd|jjj|nX|jjtj|j|j tj!d|j tj"d|j tj#d|j tj$dt%|j&j'dkrtjdn|j tj(d|j tj)d|j tj*d|j tj+dt%|j,j-dkrtjdn|j tj.d|j tj/dt%|j0j1dkrrtj2d t3j4d!nt}xEd"d#d$gD]4}||j0j1krtj2d%|t}qqW|rt3j4d!n||j0j1krId&|j0j1kr d&}n$d'|j0j1kr'd'}nd"}tjd(|||}ntjd)|t5tj6} t7j8j9tj6rtjd*tj6y| jWqtk r}tjd+tj6|qXn|jj:tj| |j;||_<d,|_=dS(4Ns"Loading firewalld config file '%s's0Using fallback firewalld configuration settings.t DefaultZonet MinimalMarkt CleanupOnExittnotfalsetLockdowntyesttruesLockdown is enabledt IPv6_rpfiltersIPv6 rpfilter is enabledsIPV6 rpfilter is disabledtIndividualCallssIndividualCalls is enabledt LogDeniedtoffsLogDenied is set to '%s'tAutomaticHelperssAutomaticHelpers is set to '%s'sLoading lockdown whitelists*Failed to load lockdown whitelist '%s': %sR$RisNo icmptypes found.R%R sNo services found.R!sNo zones found.itblocktdropttrustedsZone '%s' is not available.tpublictexternals+Default zone '%s' is not valid. Using '%s'.sUsing default zone '%s'sLoading direct rules file '%s's)Failed to load direct rules file '%s': %stRUNNING(RCRD(syesRG(RCRD(syesRG(syesRG(RCRD(syesRG(>Rt FALLBACK_ZONER tdebug1RRtreadt ExceptiontwarningtgettintR/tNonetlowerRR0R#tenable_lockdownRR1tTrueR2R3R4tset_firewalld_conftcopytdeepcopytlockdown_whitelisttquery_lockdownterrortfilenamet set_policiest_loadertFIREWALLD_IPSETStETC_FIREWALLD_IPSETStFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPEStlenRt get_icmptypestFIREWALLD_HELPERStETC_FIREWALLD_HELPERStFIREWALLD_SERVICEStETC_FIREWALLD_SERVICESR t get_servicestFIREWALLD_ZONEStETC_FIREWALLD_ZONESR!t get_zonestfataltsystexitR tFIREWALLD_DIRECTtostpathtexistst set_directt check_zoneR,R*( R'treloadtcomplete_reloadt default_zonetvaluetmsgRctzR!tobj((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt_startfs                            cCs|jdS(N(R(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytstartsc Cstjj|sdS|r|jtjr}|dkr}t}tjj||_|j |j||_t |_ qt }nxt tj |D]}|jds|jtjr|dkrtjjd||fr|jd||f|dtqqnd||f}tjd||y|dkrt||}|j|jjkr|jj|j}tjd||j|j|j|jj|jn!|jjtjrt|_ n|jj||jjtj|n |dkrt||}|j|jjkr|jj|j}tjd||j|j|j|jj |jn!|jjtjrt|_ n|jj!||jj!tj|n>|dkrht"||d |}|r@dtjj|tjj|d d !f|_|j |jntj|} |j|j#j$kr|j#j%|j}|j#j&|j|j'rtjd ||j|||j(|qtjd||j|j|jn*|jjtjrt|_ t| _ n|jj)| |rUtjd ||j|||j(|q|j#j)|n|d kr5t*||}|j|j+j,kr|j+j-|j}tjd||j|j|j|j+j.|jn!|jjtjr t|_ n|j+j/||jj/tj|n|dkrt0||}|j|j1j2kr|j1j3|j}tjd||j|j|j|j1j4|jn!|jjtjrt|_ n|j1j5||jj5tj|ntj6d|Wqt7k r>} tj8d||| qt9k rktj8d||tj:qXqW|r|j'r|j|j#j$kr|j#j%|j}tjd||j|j|jy|j#j&|jWnnX|jj;|jn|j#j)|ndS(NR!s.xmls%s/%stcombinesLoading %s file '%s'Rs Overloads %s '%s' ('%s/%s')R t no_check_nameiis Combining %s '%s' ('%s/%s')R$R%sUnknown reader type %ssFailed to load %s file '%s': %ssFailed to load %s file '%s':s0 Overloading and deactivating %s '%s' ('%s/%s')(<RyRztisdirt startswithRt ETC_FIREWALLDRtbasenametnamet check_nameRtdefaulttsortedtlistdirtendswithRfR]R RTRRRlt get_icmptypeRdtremove_icmptypet add_icmptypeR_R`RR Rqt get_servicetremove_servicet add_serviceRR!Rttget_zonet remove_zonetcombinedRtadd_zoneRR$t get_ipsetst get_ipsett remove_ipsett add_ipsetRR%t get_helperst get_helpert remove_helpert add_helperRuRRcRVt exceptiont forget_zone( R'Rzt reader_typeRt combined_zoneRdRRtorig_objt config_objR((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRfs                                             cCs|jj|jj|jj|jj|jj|jj|jj|jj|j j|j dS(N( RtcleanupR R!R$R%RR"R#RR&(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRs         cCs|jdS(N(R(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytstopscCsdS(N((R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_panicscCsV|}| s|dkr(|j}n||jjkrRttj|n|S(NR7(tget_default_zoneR!RtRRt INVALID_ZONE(R'R!t_zone((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR}s cCs(tj|s$ttj|ndS(N(RtcheckInterfaceRRtINVALID_INTERFACE(R't interface((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytcheck_interfacescCs|jj|dS(N(R t check_service(R'R ((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRscCs tj|}|dksY|dksY|dksYt|dkr|d|dkr|dkrytjd|nz|dkrtjd|nZ|dkrtjd|n:t|dkr|d|dkrtjd |nttj|ndS( Niiiiis'%s': port > 65535s'%s': port is invalids'%s': port is ambiguouss'%s': range start >= end( Rt getPortRangeRZRkR RTRRt INVALID_PORT(R'tporttrange((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_ports$&   &cCsA|sttjn|dkr=ttjd|ndS(Nttcptudptsctptdccps''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}(RRRR(RRtMISSING_PROTOCOLtINVALID_PROTOCOL(R'tprotocol((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_tcpudps   cCs(tj|s$ttj|ndS(N(RtcheckIPRRt INVALID_ADDR(R'tip((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytcheck_ipscCs||dkr3tj|sxttj|qxnE|dkrftj|sxttj|qxnttjddS(Ntipv4tipv6s'%s' not in {'ipv4'|'ipv6'}(Rt checkIPnMaskRRRt checkIP6nMaskt INVALID_IPV(R'tipvtsource((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt check_addresss   cCs|jj|dS(N(Rtcheck_icmptype(R'ticmp((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRscCsdS(N((R'R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR~scCs|jS(N(R*(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyt get_statescCsdS(N((R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytenable_panic_modescCsdS(N((R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytdisable_panic_modescCs|jS(N(R+(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytquery_panic_modescCs|jS(N(R3(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytget_log_deniedscCs|tjkr:ttjd|djtjfn||jkr||_|jj d||jj |j nttj |dS(Ns'%s', choose from '%s's','RJ( RtLOG_DENIED_VALUESRRt INVALID_VALUEtjoinRR3RtsettwriteR~t ALREADY_SET(R'R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytset_log_denieds    cCs|jS(N(R4(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytget_automatic_helpersscCs|tjkr:ttjd|djtjfn||jkr||_|jj d||jj |j nttj |dS(Ns'%s', choose from '%s's','RL( RtAUTOMATIC_HELPERS_VALUESRRRRRR4RRRR~R(R'R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytset_automatic_helperss    cCs|jS(N(R,(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyRscCs`|j|}||jkrJ||_|jjd||jjnttj|dS(NR@(R}R,RRRRRtZONE_ALREADY_SET(R'R!R((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytset_default_zones  cCs$|jjdd|jjdS(NRERF(RRR(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR\(scCs$|jjdd|jjdS(NRERC(RRR(R'((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pytdisable_lockdown,s("t__name__t __module__R(R5R&R?RRRRfRRRR}RRRRRRRR~RRRRRRRRRRR\R(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyR7s>                        (0t__all__tos.pathRyRvR_tfirewallRRtfirewall.core.fw_icmptypeRtfirewall.core.fw_serviceRtfirewall.core.fw_zoneRtfirewall.core.fw_directRtfirewall.core.fw_configRtfirewall.core.fw_policiesRtfirewall.core.fw_ipsetR tfirewall.core.fw_helperR tfirewall.core.loggerR tfirewall.core.io.firewalld_confR tfirewall.core.io.directR tfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.zoneRRtfirewall.core.io.ipsetRtfirewall.core.ipsetRtfirewall.core.io.helperRRtfirewall.errorsRtobjectR(((s9/usr/lib/python2.7/site-packages/firewall/core/fw_test.pyts2    PK[Ы99(site-packages/firewall/core/nftables.pyonu[ c`c@s~ddlZddlZddlmZmZddlmZddlm Z ddl m Z m Z m Z mZmZddlmZddlmZmZmZmZmZmZddlmZmZmZmZd Zd Ziid d efd 6d6id defd 6d6id defd 6ddefd6d6iddefd6ddefd6d6Z iid6id6id6Z!ii"dd d!dd"d#gd$6dd d!gd!6dd d%gd%6dd d&gd&6dd d!dd"d'gd(6dd d!dd"d)gd*6dd d!dd"d+gd,6dd d-dd"d.gd/6dd d!dd"d0gd16dd d!dd"d.gd26dd d3dd"d.gd46dd d!dd"d5gd66dd d-dd"d7gd86dd d!dd"d9gd:6dd d!dd"d7gd;6dd d3gd36dd d!dd"d<gd=6dd d!dd"d>gd?6dd d!dd"d@gdA6dd d-gd-6dd d3dd"d.gdB6dd dCgdC6dd dDgdD6dd dEgdE6dd d!dd"dFgdG6dd dHgdH6dd dIgdI6dd dJgdJ6dd d-dd"d<gdK6dd d!dd"dLgdM6dd d-dd"d@gdN6dd d!dd"dOgdP6dd dHdd"d.gdQ6dd dHdd"d7gdR6dS6idTd d!dTd"d<gdU6dTd d3dTd"d7gdV6dTd d!dTd"d@gdW6dTd d!dTd"d.gd$6dTd d!gd!6dTd d%gd%6dTd d&gd&6dTd d!dTd"dFgdX6dTd dYgdZ6dTd d[gd\6dTd d!dTd"d7gd]6dTd d^gd^6dTd d3gd36dTd d!dTd"d'gd=6dTd d_gd-6dTd d!dTd"d9gd`6dTd dagdC6dTd dbgdD6dTd dHgdH6dTd dHdTd"d.gdQ6dTd dHdTd"d7gdR6dTd d3dTd"d.gdc6dTd d3dTd"d@gdd6de6Z"dfe#fdgYZ$dS(hiN(t SHORTCUTStDEFAULT_ZONE_TARGET(trunProg(tlog(t splitArgst check_mactportStrtcheck_single_addresst check_address(tconfig(t FirewallErrort UNKNOWN_ERRORt INVALID_RULEtINVALID_ICMPTYPEt INVALID_TYPEt INVALID_ENTRY(t Rich_Acceptt Rich_Rejectt Rich_Dropt Rich_Markt firewalldi t preroutingit PREROUTINGtrawijtmangleit postroutingidt POSTROUTINGtnattinputitINPUTtforwardtFORWARDtfiltertinettiptip6ticmpttypesdestination-unreachabletcodet13scommunication-prohibiteds echo-replys echo-requestt4sfragmentation-neededt14shost-precedence-violationt10shost-prohibitedtredirectt1s host-redirectt7s host-unknownshost-unreachablesparameter-problems ip-header-badt8snetwork-prohibitedt0snetwork-redirectt6snetwork-unknownsnetwork-unreachablet3sport-unreachablet15sprecedence-cutofft2sprotocol-unreachablesrequired-option-missingsrouter-advertisementsrouter-solicitations source-quencht5ssource-route-faileds time-exceededstimestamp-replystimestamp-requeststos-host-redirectt12stos-host-unreachablestos-network-redirectt11stos-network-unreachablesttl-zero-during-reassemblysttl-zero-during-transittipv4ticmpv6saddress-unreachables bad-headers beyond-scopes failed-policysnd-neighbor-advertsneighbour-advertisementsnd-neighbor-solicitsneighbour-solicitationsno-routespacket-too-bigs nd-redirects reject-routesnd-router-advertsnd-router-solicitsunknown-header-typesunknown-optiontipv6tnftablescBseZdZeZdZdZdZdZdZ dZ dZ dZ d3d Zd Zd Zd Zd ZddZdZeddZddZddZdZdZdZdZdZdZdZdZ d3d3dZ!d3d3dZ"d3d3dZ#d Z$d3d!Z%d3d"Z&d#Z'd3d$Z(d%Z)d3d&Z*d'Z+ed(Z,d)Z-d*Z.d+Z/d3d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6RS(4R:cCsK||_tjd|_|jg|_i|_i|_i|_dS(Ntnft( t_fwR tCOMMANDSt_commandt fill_existstavailable_tablestrule_to_handletrule_ref_counttzone_source_index_cache(tselftfw((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt__init__s     cCs%tjj|j|_t|_dS(N(tostpathtexistsR>tcommand_existstFalsetrestore_command_exists(RD((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR?sc Csy?|jd}|j||j|}||df}WnLtk ry&|jd}|j|d}Wqtk rdSXnX|d}|r| r||kr|||kr||j|qn|r||krg||sitinsertitaddtindexs%d( RRtpopt ValueErrortNonetremovetappendtsortR<t_allow_zone_driftingtlenRP( RDtrule_addtruleRCtitzonet zone_sourcetfamilyRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_run_replace_zone_sourcesD                 c Csddg}|}|ddkrs|ddkrs|}d|dRUtTruetintt ExceptionR R RStjoinRKRBR Rtdebug2t __class__tcopytdeepcopyRCRaRARTRRRZtstrip( RDtargstnft_optst_argst _args_testtstatustoutputtrule_keyR[RCt _args_strtstrtoffset((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt__runs|           #!     cCsAy|j|}Wntk r'tSX||||d+tSdS(Ni(RRRTRKRi(RDR\tpatternt replacementR]((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt _rule_replace,s  cCs|}d|d<|S(NRbi((RDRrtret_args((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt reverse_rule5s cCsttddS(Nsnot implemented(R R (RDtrulest log_denied((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_rules:sc Csd}d|ks*d|ks*d|kr3d}n-d|ksWd|ksWd|kr`d}n|j|dd d |d d g|j|d dddgy|jd}Wntk rnDX|dkrdS|dkrd|g|||d+n |j||j|S(NticmpxR7R"R$R9R#R8s %%REJECT%%trejecttwithR%sadmin-prohibiteds%%ICMP%%tmetatl4protos{icmp, icmpv6}s %%LOGTYPE%%toffRetunicastt broadcastt multicasttpkttypei(RRR(RRRRTRSt_nftables__run(RDR\Rt icmp_keywordR]((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytset_ruleCs$$ $      cCs|r |gStjS(N(tIPTABLES_TO_NFT_HOOKtkeys(RDRc((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytget_available_tablesbscCsYi|_i|_i|_g}x1tjD]#}|jdd|dtgq.W|S(NRbRcs%s(RARBRCt OUR_CHAINSRRWt TABLE_NAME(RDRR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_flush_rulesfs   !cCstdd}g}|dkr|jddd|gxddgD]:}d |d ||d td f}|jt|qFWn5|d kr|jddd|gn ttd|S(Nt_t policy_droptDROPRQRcR!RRwsMadd chain inet %s %s_%s '{ type filter hook %s priority %d ; policy drop ; }'RiitACCEPTRbsnot implemented(RRWtNFT_HOOK_OFFSETRR R (RDtpolicyt table_nameRthookt _add_chain((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_set_policy_rulesps   cCsAt}x+tjD]}|jt|jqWt|S(N(tsettICMP_TYPES_FRAGMENTRtupdateRd(RDt supportedtipv((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytsupported_icmp_typess cCsAg}x+tjD]}|jd|tfqWtt|S(Nsadd table %s %s(RRRWRtmapR(RDtdefault_tablesR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_default_tablessRc Csg}ttddadd rule inet %s filter_%s ct state established,related acceptRs,add rule inet %s filter_%s iifname lo acceptsadd chain inet %s filter_%s_%ss,add rule inet %s filter_%s jump filter_%s_%sRs_add rule inet %s filter_%s ct state invalid %%%%LOGTYPE%%%% log prefix '"STATE_INVALID_DROP: "'s0add rule inet %s filter_%s ct state invalid dropsHadd rule inet %s filter_%s %%%%LOGTYPE%%%% log prefix '"FINAL_REJECT: "'sBadd rule inet %s filter_%s reject with icmpx type admin-prohibiteds$add chain inet %s filter_%s_IN_ZONESRtINtOUTs!add chain inet %s filter_%s_%s_%ss/add rule inet %s filter_%s jump filter_%s_%s_%stINPUT_ZONES_SOURCEt INPUT_ZONEStFORWARD_IN_ZONES_SOURCEtFORWARD_IN_ZONEStFORWARD_OUT_ZONES_SOURCEtFORWARD_OUT_ZONES( RRRRRWRR<RYRRR(RDRt default_rulestchaintdispatch_suffixR`t direction((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_default_ruless (0 (0  ( 4 (!  ((  cCsY|dkrdddgS|dkr,dgS|dkrBddgS|d krUdgSiS( NR Rt FORWARD_INt FORWARD_OUTRRRRR((RDRc((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytget_zone_table_chainss      R!c Cs|dkrr|dkrrg}|j|j||||||d|j|j||||||d|Sidd6dd6dd 6dd 6dd 6dd 6|} |t|d dkr|t|d  d}ntjdt|d|} d} |r3| r3dd|dtd||fdg} ne|r_dd|dtd||fg} n9dd|dtd||fg} |s| dg7} n|dkr| | d|| fg7} n(| | d|d| d|| fg7} | gS(NRR!R"R#tiifnameRtoifnameRRRRtOUTPUTit+t*RR^tgotoRPR\s%ss %s_%s_ZONESs%%ZONE_INTERFACE%%RQRbs%s_%ss"(textendt!build_zone_source_interface_rulesRZRtformatRR( RDtenableR^t interfaceRcRRWR`RtoptttargettactionR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyRs>  &# (cCsK|dkr|dkrg}|jdrI|j|td}nd}td|svt|sv|dkr|j|j|||||dntd|st|s|dkr|j|j|||||dn|Sidt6d t 6|} id d 6d d 6d d6d d6d d6d d6|} |j j r\d||f} nd||f} t j dt|d|} d} |jdr|td}|j|}d|}nCt|r| d krdSd}ntd|rd}nd}| d|dt| d||| || d|| fg }|gS(NRR!sipset:R7R"R9R#RPRbtsaddrRtdaddrRRRRRs%s_%s_ZONES_SOURCEs %s_%s_ZONESRR^Rt@RetetherR\s%ss%%ZONE_SOURCE%%s%s_%s(t startswitht_set_get_familyRZRURRRtbuild_zone_source_address_rulesRiRKR<RYRRRR(RDRR^taddressRcRR`Rt ipset_familytadd_delRtzone_dispatch_chainRRtipsett rule_familyR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR$sT''      c Cs.|dkr`|dkr`g}|j|j|||d|j|j|||d|Stjdt|d|}t||jt|d|d|d |gg}|jd d|d t d ||fg|jd d|d t d ||fg|jd d|d t d||fg|jd d|d t d||fg|jd d|d t d ||fdd ||fg|jd d|d t d ||fdd||fg|jd d|d t d ||fdd||fg|j j j |j }|j jdkr|dkr|d kr|d!kr|}|dkrud}n|jd d|d t d ||fdddd||fg qqn|dkr*|d"kr*|d#kr*|jd d|d t d ||f|dkr|jndgn|S($NRR!R"R#RR^s%s_logs%s_denys%s_allowRQs%ss%s_%ss %s_%s_logs %s_%s_denys %s_%s_allowR\tjumpRR RRRRtREJECTs %%REJECT%%Rs %%LOGTYPE%%Rtprefixs"filter_%s_%s: "R(sINPUTs FORWARD_INs FORWARD_OUTsOUTPUT(Rs %%REJECT%%sDROP(sACCEPTRs %%REJECT%%sDROP(sINPUTs FORWARD_INs FORWARD_OUTsOUTPUT(Rtbuild_zone_chain_rulesRRRRRRRWRR<R^t_zonesRtget_log_deniedtlower( RDR^RcRR`Rt_zoneRt log_suffix((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR^s^            %cCsiddddgd6ddddgd6ddddgd6ddddgd 6dddd gd 6dddd gd 6dd dd gd6dd dd gd6ddddgd6ddddgd6ddddgd6ddddgd6ddddgd6dd ddgd6ddddgd6ddddgd6ddddgd6dd ddgd6dd ddgd 6dd dd!gd"6dd dd!gd!6dd#d$gd%6dd#d$gd&6}||S('NRR$R%shost-prohibitedsicmp-host-prohibiteds host-prohibsnet-prohibitedsicmp-net-prohibiteds net-prohibsadmin-prohibitedsicmp-admin-prohibiteds admin-prohibR8sicmp6-adm-prohibitedsadm-prohibitedsnet-unreachablesicmp-net-unreachables net-unreachshost-unreachablesicmp-host-unreachables host-unreachsport-unreachablesicmp-port-unreachablesicmp6-port-unreachableRs port-unreachsprot-unreachablesicmp-proto-unreachables proto-unreachsaddr-unreachablesicmp6-addr-unreachables addr-unreachsno-routesicmp6-no-routettcptresets tcp-resetstcp-rst((RDt reject_typetfrags((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_reject_types_fragments2cCs|s gSidd6dd6dd6dd6}y|jjd }Wn tk rdttd nXd d |jd |!d ||j|dgS(Ntsecondtstminutetmthourthtdaytdt/sExpected '/' in limittlimittrateii(tvalueRRRTR R (RDRt rich_to_nftR]((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_limit_fragments  cCs|js gSidt6dt6|}|dddtd||fg}||dg7}|jjr|dd |jjg7}n|jjr|d d |jjg7}n||j|jj7}|S( NRQRbR\R!s%ss %s_%s_logRRs"%s"tlevel(RRiRKRRRRR(RDt rich_ruleRRcRt rule_fragmentRR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_logs   cCs||js gSidt6dt6|}|dddtd||fg}||ddd g7}||j|jj7}|S( NRQRbR\R!s%ss %s_%s_logRRtaudit(RRiRKRRR(RDRRRcRRRR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_audits c Cs|js gSidt6dt6|}t|jtkrVd||f}dg} nt|jtkrd||f}dg} |jjr^| |j|jj7} q^nt|jtkrd||f}dg} n~t|jtkrBt j dt d d |}d }d||f}d d d|jj g} nt tdt|j|dddt|g} | |7} | |j|jj7} | | 7} | S(NRQRbs %s_%s_allowtaccepts %s_%s_denyRtdropRRR^RRtmarkRsUnknown action %sR\R!s%s(RRiRKR%RRRRRRRRRR R RRR( RDR^RRRcRRRRt rule_actionR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_actions6        cCsS|s gS|dkr#dddgS|dkr<dddgSttd|dS(NR7RtnfprotoR9sInvalid family(R R (RDt rich_family((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_family_fragments    cCsx|s gSg}td|jr2|dg7}n |dg7}|jra|dd|jg7}n|d|jg7}|S(NR7R"R#Rs!=(Rtaddrtinvert(RDt rich_destR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_destination_fragments  cCsJ|s gSg}|jrtd|jr;|dg7}n |dg7}|jrj|dd|jg7}qF|d|jg7}nt|dr|jr|jr|ddd|jg7}qF|dd|jg7}npt|drF|jrF|j|j}|jr)||ddd |jg7}qF||dd |jg7}n|S( NR7R"R#Rs!=tmacRRR(RRRthasattrRRR(RDt rich_sourceRR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_rich_rule_source_fragment,s(      c Csidt6dt6|}d}tjdtdd|} g} |r_| |j|j7} n|rtd|r| dg7} n | d g7} | d |g7} n|r| |j|j 7} | |j |j 7} n| |d d t |d g7} | st |jtkr+| dddg7} ng} |r| j|j|||| | | j|j|||| | | j|j||||| | n5| j|ddd td|| fg| dg| S(NRQRbR RRR^R7R"R#Rtdports%st-tcttstates new,untrackedR\R!s %s_%s_allowR(RiRKRRRRR`RRt destinationR tsourceRR%RRRWRRRR( RDRR^tprototportRRRRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_ports_rulesIs2  ""(/c Csidt6dt6|}d}tjdtdd|}g} |r_| |j|j7} n|rtd|r| dg7} n | d g7} | d |g7} n|r| |j|j7} | |j|j 7} | |j |j 7} nd d |g} | st |j tkr0| d ddg7} ng} |r| j|j||||| | j|j||||| | j|j|||||| n/| j|dddtd|g| dg| S(NRQRbR RRR^R7R"R#RRRR R s new,untrackedR\R!s%ssfilter_%s_allowR(RiRKRRRRR`RRRR RR%RRRWRRRR( RDRR^tprotocolRRRRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_protocol_rulesjs4 ""()c Csidt6dt6|}d}tjdtdd|} g} |r_| |j|j7} n|rtd|r| dg7} n | d g7} | d |g7} n|r| |j|j 7} | |j |j 7} n| |d d t |d g7} | st |jtkr+| dddg7} ng} |r| j|j|||| | | j|j|||| | | j|j||||| | n5| j|ddd td|| fg| dg| S(NRQRbR RRR^R7R"R#Rtsports%sR R R s new,untrackedR\R!s %s_%s_allowR(RiRKRRRRR`RRRR RRR%RRRWRRRR( RDRR^RRRRRRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_source_ports_ruless2  ""(/c Csidt6dt6|}tjdtdd|} |dddtd | g} |rtd |rv| d g7} n | d g7} | d |g7} n| |ddt|dg7} | dddd||fg7} dddtd||fddd|d|ddg } | | gS(NRQRbRRR^R\R!s%ssfilter_%s_allowR7R"R#RR R R thelperRs"helper-%s-%s"s helper-%s-%st{R%s"%s"Rt;t}(RiRKRRRRRR( RDRR^RRRt helper_nametmodule_short_nameRRR\t helper_object((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_helper_ports_ruless"       cCsidt6dt6|}tjdtdd|}g}|ro||j|j7}||j|j7}n|d|dt d|g|d d d d ggS( NRQRbRRR^R\s%ss nat_%s_allowRs!=tlot masquerade( RiRKRRRRRR RR(RDRR^R`RRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt _build_zone_masquerade_nat_ruless cCsg}|rd|jr$|jdksB|jrdtd|jjrd|j|j||d|n}|r|jr|jdks|jrtd|jjr|j|j||d|n|j|j||d|idt6dt6|}tj dt dd |}g}|rP||j |j 7}||j |j7}n|j|d d d td |g|ddddg|S(NR9R#R7R"RQRbRRR^R\R!s%ssfilter_%s_allowR R s new,untrackedR(R`RRRRR!RiRKRRRRRR RWR(RDRR^RRRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_masquerade_ruless$"" 2c Csidt6dt6|}tjdtdd|} g} |rV| dd|g7} n| ddg7} |r|d kr| d t|d g7} n|d |d td| dd|g|| gS(NRQRbRRR^tdnatttoR+Res:%sR R\s%ss nat_%s_allowRR(RiRKRRRRR( RDRR^Rt mark_fragmentttoaddrttoportR`RRt dnat_fragment((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt"_build_zone_forward_port_nat_ruless c Csaidt6dt6|} d|} dd| g} tjdtdd|} g}| r||j| j7}||j| j7}||j | j 7}ng}|j | d d d t d | g||d |ddd| g| rC| jr| jdks|rCt d|rC|j|j|||| ||dn| r| jra| jdksv|rt d|r|j|j|||| ||dnh|rt d|r|j|j|||| ||dn(|j|j|||| ||dtjdt|d|} |j | d d d t d| dddg| dg|S(NRQRbs0x%xRRRRR^R\R!s%ssmangle_%s_allowR RR9R#R7R"sfilter_%s_allowR R s new,untrackedR(RiRKRRRRR`RRR RRWRRRR)(RDRR^t filter_chainRRR'R&tmark_idRRtmark_strR%RRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_forward_port_ruless@   2cCs<|t|krt||Sttd||jfdS(Ns"ICMP type '%s' not supported by %s(RR R tname(RDRt icmp_type((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_icmp_types_to_nft_fragment/s c Csd}idt6dt6|}|r9|jr9|j}n\|jrg}d|jkrg|jdnd|jkr|jdqn ddg}g}x/|D]'} xddgD]} tjdt| d |} |jj j |rd || f} d } nd || f} d } g}|rl||j |j 7}||j |j7}||j|j7}n||j| |j7}|r8|j|j|||| ||j|j|||| ||jr|j|j||||| |q|j|dddtd || fg|d gq|jjdkr| d kr|j|dddt| g|dddd||fgn|j|dddt| g|| gqWqW|S(NR RQRbR7R9RRRR^s %s_%s_allowRs %s_%s_denys %%REJECT%%R\R!s%sRs %%LOGTYPE%%RRs"%s_%s_ICMP_BLOCK: "(RiRKtipvsRRWRRRR<R^tquery_icmp_block_inversionRR`RR RR0R.RRRRRR(RDRR^tictRRcRR1RRRRt final_chaint final_targetR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_zone_icmp_block_rules6sT      "" (2! -c Csd}g}xddgD]}tjdt|d|}djddtd ||fd d ||fg}|j|}|jjj|rd } nd } |rddddtd ||fd|g} n#ddddtd ||fg} | d| g7} |j | |jjj|r|jj dkr|rpddddtd ||fd|g} n#ddddtd ||fg} | ddddd||fg7} |j | qqqW|S(NR RRRR^RgR!s%ss%s_%sRs %s_%s_allows %%REJECT%%RRQR\RfRbs%%ICMP%%Rs %%LOGTYPE%%RRs"%s_%s_ICMP_BLOCK: "( RRRRlRRAR<R^R2RWR( RDRR^RcRRRRxt rule_handlet ibi_targetR\((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt%build_zone_icmp_block_inversion_rulesls<     cCsg}|jddddtdddd d d d d dddg|dkr|jddddtdddd d d d d dddddgn|jddddtdddddg |S(NRPR\R!s%ssraw_%sRRRR9tfibRt.tiiftoiftmissingRRRRs"rpfilter_DROP: "R8R%s){ nd-router-advert, nd-neighbor-solicit }Rtraw_PREROUTINGR?R?(RWR(RDRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytbuild_rpfilter_ruless   cCsd}tjdtdd|}g}||j|j7}||j|j7}||j|j7}g}|j |j ||||||j |j ||||||j |j |||||||S(NR RRR^( RRRRR`RRR RRWRRR(RDRR^RRcRRR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt(build_zone_rich_source_destination_ruless ""%cCs|dkrtStS(NR7R9teb(sipv4sipv6RB(RiRK(RDR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytis_ipv_supporteds cCs;idd6dd6}i ||gd6||ddgd6||dd ||gd 6||dd ||gd 6||d gd 6||gd6||ddgd6||dd ||gd6||dd ||gd6||dgd6dgd6}ydg||dgSWn$tk r6ttd|nXdS(Nt ipv4_addrR7t ipv6_addrR9shash:ips . inet_protos. inet_services hash:ip,ports. inet_service .shash:ip,port,ipshash:ip,port,nets. marks hash:ip,markshash:nets hash:net,portshash:net,port,ipshash:net,port,nets. ifnameshash:net,ifacet ether_addrshash:macR%Rs!ipset type name '%s' is not valid(tKeyErrorR R(RDRR%tipv_addrttypes((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_set_type_fragments(   c Cs)|r+d|kr+|ddkr+d}nd}|dg}||j||7}|rd|kr|d|dddg7}nd |kr|d |d dg7}qn| sd|krd |kr|d d dg7}n|dg7}x4dddgD]#}|jdd|tg|qWdS(NR`tinet6R9R7RttimeoutRRtmaxelemtsizet,tflagstintervalRR!R"R#RQR(RJRR(RDR.R%toptionsRtcmdR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_creates "      cCs:x3dddgD]"}|jdd|t|gqWdS(NR!R"R#RbR(RR(RDR.R`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_destroyscCs)|jjj|jddjd}|jd}t|t|krdttdng}xtt|D]}||dkry||jd}Wn(t k r|dd||g7}qX|||| d|||dg7}n|j |||j dq}W|d S( Nt:iROs+Number of values does not match ipset type.RRR;i( R<Rtget_typetsplitRZR RtrangeRRRTRW(RDR.tentryt type_formatt entry_tokenstfragmentR]RR((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt_set_entry_fragments +  *cCsTxMdddgD]<}|jdd|t|dg|j||dgqWdS(NR!R"R#RQtelementRR(RRR^(RDR.RZR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pytset_addscCsTxMdddgD]<}|jdd|t|dg|j||dgqWdS(NR!R"R#RbR_RR(RRR^(RDR.RZR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_deletescCs:x3dddgD]"}|jdd|t|gqWdS(NR!R"R#tflushR(RR(RDR.R`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyt set_flushscCsk|jjj|}|jdkr-d}n:|jrad|jkra|jddkrad}nd}|S(Nshash:macRR`RKR#R"(R<Rt get_ipsetR%RR(RDR.RR`((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR!s  N(7t__name__t __module__R.Ritzones_supportedRFR?RaRRRRRRURRRRRRRRKRRRRRRRRRRR RRRRR!R"R)R-R0R6R9R@RARCRJRTRUR^R`RaRcR(((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyR:sf  - U      T  + 9 @   "  !#!     ,  6 2          (%tos.pathRGRotfirewall.core.baseRRtfirewall.core.progRtfirewall.core.loggerRtfirewall.functionsRRRRRtfirewallR tfirewall.errorsR R R R RRtfirewall.core.richRRRRRRRRRtobjectR:(((s:/usr/lib/python2.7/site-packages/firewall/core/nftables.pyts  (."   PK[Y++.site-packages/firewall/core/fw_transaction.pyonu[ c`c@sdZddgZddlmZddlmZddlmZddlm Z de fd YZ de fd YZ de fd YZ d S( s!Transaction classes for firewalldtFirewallTransactiontFirewallZoneTransactioni(tlog(terrors(t FirewallError(tLastUpdatedOrderedDicttSimpleFirewallTransactioncBseZdZdZdZdZdZdZdZdZ dZ d Z ddd Z d Zd Zd ZRS(s>Base class for FirewallTransaction and FirewallZoneTransactioncCs1||_i|_g|_g|_g|_dS(N(tfwtrulest pre_funcst post_funcst fail_funcs(tselfR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt__init__"s     cCs&|jj|j2|j2|j2dS(N(RtclearR R R (R ((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR)s cCs#|jj|jgj|dS(N(Rt setdefaulttnametappend(R tbackendtrule((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_rule/scCs%x|D]}|j||qWdS(N(R(R RRR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_rules2s cCs&|j|jko%||j|jkS(N(RR(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt query_rule6scCsF|j|jkrB||j|jkrB|j|jj|ndS(N(RRtremove(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_rule9s(cGs|jj||fdS(N(R R(R tfunctargs((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_pre=scGs|jj||fdS(N(R R(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_post@scGs|jj||fdS(N(R R(R RR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytadd_failCscCstjdt||df|dkr5i}n|dkrJg}n|sx|jD]R}xIt|j|D]4}|j|gj|jj |j |qtWqZWn4x1|jD]&}|j|gj |j|qW||fS(Ns%s.prepare(%s, %s)s...( Rtdebug4ttypetNoneRtreversedRRRtget_backend_by_namet reverse_ruletextend(R tenableRtmodulest backend_nameR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytprepareFs     '$cCs1tjdt||f|j|\}}|jt}d}g}xe|D]]}y|jj|||Wn,tk r}t }|}tj |qUX|j |qUW|s|jj ||} | r| \} }| rtj |qqn|r#i} xY|D]Q}g| |t||D],} | |j |jj|j| q3WqWxL| D]D}y|jj|| |Wqntk r}tj |qnXqnWxU|jD]J\} }y| |Wqtk r }tj d| ||fqXqWttj|n|jdS(Ns%s.execute(%s)ts#Calling fail func %s(%s) failed: %s(RRRR(tpretFalseRRt ExceptiontTrueterrorRthandle_modulestdebug1R!R"R#R RRtCOMMAND_FAILEDtpost(R R%RR&R.terrorMsgtdoneR'tmsgt module_returntstatust undo_rulesRRR((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytexecuteZsP      $  cCsstjdt|xU|jD]J\}}y||Wq!tk rj}tjd|||fq!Xq!WdS(Ns%s.pre()s"Calling pre func %s(%s) failed: %s(RRRR R,R.(R RRR5((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR*s cCsstjdt|xU|jD]J\}}y||Wq!tk rj}tjd|||fq!Xq!WdS(Ns %s.post()s#Calling post func %s(%s) failed: %s(RRRR R,R.(R RRR5((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR2s N(t__name__t __module__t__doc__R RRRRRRRRR R(R9R*R2(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs          = cBsJeZdZdZdZdZdddZdZdZ RS(s<General FirewallTransaction, contains also zone transactionscCs&tt|j|t|_dS(N(tsuperRR Rtzone_transactions(R R((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR scCs$tt|j|jjdS(N(R=RRR>(R ((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRscCs9||jkr.t|j|||j|RR(R tzone((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytzone_transactionscCstjdt||dftt|j|||\}}x|jD]}yR|j|j||x4|j|jD]"}||kr|j|qqWWqNt k r}tj dt |qNXqNW||fS(Ns%s.prepare(%s, %s)s...s1Failed to prepare transaction rules for zone '%s'( RRRR=RR(R>R&RRR.tstr(R R%RR&R?tmoduleR5((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR(s   cCsStjdt|tt|jx"|jD]}|j|jq4WdS(Ns%s.pre()(RRRR=RR*R>(R R?((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR*scCsStjdt|tt|jx"|jD]}|j|jq4WdS(Ns %s.post()(RRRR=RR2R>(R R?((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR2sN( R:R;R<R RR@R R(R*R2(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs    cBseZdZd dZdZd d dZdZdZdZ dZ dZ d Z d Z d Zd ZRS(s;Zone transaction with additional chain and module interfacecCs>tt|j|||_||_g|_g|_dS(N(R=RR R?tfw_transactiontchainsR&(R RR?RC((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR s    cCs|jr~tt|jjx}|jjjD]E}tt|jj|j|jj|j2|jj|j2q2Wn!tt|j|j2|j2dS(N( RCR=RRR>tkeysRRDR&(R R?((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs cCs~tjdt||dftt|j|||\}}x-|jD]"}||krN|j|qNqNW||fS(Ns%s.prepare(%s, %s)s...(RRRR=RR(R&R(R R%RR&RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR(s  cCs6|jr|jj|ntt|j|dS(N(RCR9R=R(R R%((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyR9s cCsT||f}||jkrP|jjj|jt|g||jj|ndS(N(RDRR?tgen_chain_rulesR-R(R ttabletchaint table_chain((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_chains "cCs2||f}||jkr.|jj|ndS(N(RDR(R RGRHRI((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_chains cCs?x8|D]0}||jkr|j|d|dqqWdS(Nii(RDRJ(R RDRI((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_chainss cCs7x0|D](}||jkr|jj|qqWdS(N(RDR(R RDRI((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_chains s cCs&||jkr"|jj|ndS(N(R&R(R RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_module%scCs&||jkr"|jj|ndS(N(R&R(R RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt remove_module)scCs"x|D]}|j|qWdS(N(RN(R R&RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyt add_modules-s cCs"x|D]}|j|qWdS(N(RO(R R&RB((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pytremove_modules1s N(R:R;R<R R RR(R9RJRKRLRMRNRORPRQ(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyRs         N(R<t__all__tfirewall.core.loggerRtfirewallRtfirewall.errorsRtfirewall.fw_typesRtobjectRRR(((s@/usr/lib/python2.7/site-packages/firewall/core/fw_transaction.pyts 5PK["site-packages/firewall/__init__.pynu[PK[B699#site-packages/firewall/functions.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2007,2008,2011,2012 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "PY2", "getPortID", "getPortRange", "portStr", "getServiceName", "checkIP", "checkIP6", "checkIPnMask", "checkIP6nMask", "checkProtocol", "checkInterface", "checkUINT32", "firewalld_is_active", "tempFile", "readfile", "writefile", "enable_ip_forwarding", "get_nf_conntrack_helper_setting", "set_nf_conntrack_helper_setting", "check_port", "check_address", "check_single_address", "check_mac", "uniqify", "ppid_of_pid", "max_zone_name_len", "checkUser", "checkUid", "checkCommand", "checkContext", "joinArgs", "splitArgs", "b2u", "u2b", "u2b_if_py2" ] import socket import os import os.path import shlex import pipes import string import sys import tempfile from firewall.core.logger import log from firewall.config import FIREWALLD_TEMPDIR, FIREWALLD_PIDFILE PY2 = sys.version < '3' def getPortID(port): """ Check and Get port id from port string or port id using socket.getservbyname @param port port string or port id @return Port id if valid, -1 if port can not be found and -2 if port is too big """ if isinstance(port, int): _id = port else: if port: port = port.strip() try: _id = int(port) except ValueError: try: _id = socket.getservbyname(port) except socket.error: return -1 if _id > 65535: return -2 return _id def getPortRange(ports): """ Get port range for port range string or single port id @param ports an integer or port string or port range string @return Array containing start and end port id for a valid range or -1 if port can not be found and -2 if port is too big for integer input or -1 for invalid ranges or None if the range is ambiguous. """ # "" case if isinstance(ports, int) or ports.isdigit(): id1 = getPortID(ports) if id1 >= 0: return (id1,) return id1 splits = ports.split("-") # "-" case if len(splits) == 2 and splits[0].isdigit() and splits[1].isdigit(): id1 = getPortID(splits[0]) id2 = getPortID(splits[1]) if id1 >= 0 and id2 >= 0: if id1 < id2: return (id1, id2) elif id1 > id2: return (id2, id1) else: # ids are the same return (id1,) # everything else "[-]" matched = [ ] for i in range(len(splits), 0, -1): id1 = getPortID("-".join(splits[:i])) port2 = "-".join(splits[i:]) if len(port2) > 0: id2 = getPortID(port2) if id1 >= 0 and id2 >= 0: if id1 < id2: matched.append((id1, id2)) elif id1 > id2: matched.append((id2, id1)) else: matched.append((id1, )) else: if id1 >= 0: matched.append((id1,)) if i == len(splits): # full match, stop here break if len(matched) < 1: return -1 elif len(matched) > 1: return None return matched[0] def portStr(port, delimiter=":"): """ Create port and port range string @param port port or port range int or [int, int] @param delimiter of the output string for port ranges, default ':' @return Port or port range string, empty string if port isn't specified, None if port or port range is not valid """ if port == "": return "" _range = getPortRange(port) if isinstance(_range, int) and _range < 0: return None elif len(_range) == 1: return "%s" % _range else: return "%s%s%s" % (_range[0], delimiter, _range[1]) def portInPortRange(port, range): _port = getPortID(port) _range = getPortRange(range) if len(_range) == 1: return _port == getPortID(_range[0]) if len(_range) == 2 and \ _port >= getPortID(_range[0]) and _port <= getPortID(_range[1]): return True return False def getServiceName(port, proto): """ Check and Get service name from port and proto string combination using socket.getservbyport @param port string or id @param protocol string @return Service name if port and protocol are valid, else None """ try: name = socket.getservbyport(int(port), proto) except socket.error: return None return name def checkIP(ip): """ Check IPv4 address. @param ip address string @return True if address is valid, else False """ try: socket.inet_pton(socket.AF_INET, ip) except socket.error: return False return True def normalizeIP6(ip): """ Normalize the IPv6 address This is mostly about converting URL-like IPv6 address to normal ones. e.g. [1234::4321] --> 1234:4321 """ return ip.strip("[]") def checkIP6(ip): """ Check IPv6 address. @param ip address string @return True if address is valid, else False """ try: socket.inet_pton(socket.AF_INET6, normalizeIP6(ip)) except socket.error: return False return True def checkIPnMask(ip): if "/" in ip: addr = ip[:ip.index("/")] mask = ip[ip.index("/")+1:] if len(addr) < 1 or len(mask) < 1: return False else: addr = ip mask = None if not checkIP(addr): return False if mask: if "." in mask: return checkIP(mask) else: try: i = int(mask) except ValueError: return False if i < 0 or i > 32: return False return True def checkIP6nMask(ip): if "/" in ip: addr = ip[:ip.index("/")] mask = ip[ip.index("/")+1:] if len(addr) < 1 or len(mask) < 1: return False else: addr = ip mask = None if not checkIP6(addr): return False if mask: try: i = int(mask) except ValueError: return False if i < 0 or i > 128: return False return True def checkProtocol(protocol): try: i = int(protocol) except ValueError: # string try: socket.getprotobyname(protocol) except socket.error: return False else: if i < 0 or i > 255: return False return True def checkInterface(iface): """ Check interface string @param interface string @return True if interface is valid (maximum 16 chars and does not contain ' ', '/', '!', ':', '*'), else False """ if not iface or len(iface) > 16: return False for ch in [ ' ', '/', '!', '*' ]: # !:* are limits for iptables <= 1.4.5 if ch in iface: return False # disabled old iptables check #if iface == "+": # # limit for iptables <= 1.4.5 # return False return True def checkUINT32(val): try: x = int(val, 0) except ValueError: return False else: if x >= 0 and x <= 4294967295: return True return False def firewalld_is_active(): """ Check if firewalld is active @return True if there is a firewalld pid file and the pid is used by firewalld """ if not os.path.exists(FIREWALLD_PIDFILE): return False try: with open(FIREWALLD_PIDFILE, "r") as fd: pid = fd.readline() except Exception: return False if not os.path.exists("/proc/%s" % pid): return False try: with open("/proc/%s/cmdline" % pid, "r") as fd: cmdline = fd.readline() except Exception: return False if "firewalld" in cmdline: return True return False def tempFile(): try: if not os.path.exists(FIREWALLD_TEMPDIR): os.mkdir(FIREWALLD_TEMPDIR, 0o750) return tempfile.NamedTemporaryFile(mode='wt', prefix="temp.", dir=FIREWALLD_TEMPDIR, delete=False) except Exception as msg: log.error("Failed to create temporary file: %s" % msg) raise return None def readfile(filename): try: with open(filename, "r") as f: return f.readlines() except Exception as e: log.error('Failed to read file "%s": %s' % (filename, e)) return None def writefile(filename, line): try: with open(filename, "w") as f: f.write(line) except Exception as e: log.error('Failed to write to file "%s": %s' % (filename, e)) return False return True def enable_ip_forwarding(ipv): if ipv == "ipv4": return writefile("/proc/sys/net/ipv4/ip_forward", "1\n") elif ipv == "ipv6": return writefile("/proc/sys/net/ipv6/conf/all/forwarding", "1\n") return False def get_nf_conntrack_short_name(module): return module.replace("_","-").replace("nf-conntrack-", "") def get_nf_conntrack_helper_setting(): try: return int(readfile("/proc/sys/net/netfilter/nf_conntrack_helper")[0]) except Exception: log.warning("Failed to get and parse nf_conntrack_helper setting") return 0 def set_nf_conntrack_helper_setting(flag): return writefile("/proc/sys/net/netfilter/nf_conntrack_helper", "1\n" if flag else "0\n") def check_port(port): _range = getPortRange(port) if _range == -2 or _range == -1 or _range is None or \ (len(_range) == 2 and _range[0] >= _range[1]): if _range == -2: log.debug2("'%s': port > 65535" % port) elif _range == -1: log.debug2("'%s': port is invalid" % port) elif _range is None: log.debug2("'%s': port is ambiguous" % port) elif len(_range) == 2 and _range[0] >= _range[1]: log.debug2("'%s': range start >= end" % port) return False return True def check_address(ipv, source): if ipv == "ipv4": return checkIPnMask(source) elif ipv == "ipv6": return checkIP6nMask(source) else: return False def check_single_address(ipv, source): if ipv == "ipv4": return checkIP(source) elif ipv == "ipv6": return checkIP6(source) else: return False def check_mac(mac): if len(mac) == 12+5: # 0 1 : 3 4 : 6 7 : 9 10 : 12 13 : 15 16 for i in (2, 5, 8, 11, 14): if mac[i] != ":": return False for i in (0, 1, 3, 4, 6, 7, 9, 10, 12, 13, 15, 16): if mac[i] not in string.hexdigits: return False return True return False def uniqify(_list): # removes duplicates from list, whilst preserving order output = [] for x in _list: if x not in output: output.append(x) return output def ppid_of_pid(pid): """ Get parent for pid """ try: f = os.popen("ps -o ppid -h -p %d 2>/dev/null" % pid) pid = int(f.readlines()[0].strip()) f.close() except Exception: return None return pid def max_zone_name_len(): """ Netfilter limits length of chain to (currently) 28 chars. The longest chain we create is FWDI__allow, which leaves 28 - 11 = 17 chars for . """ from firewall.core.base import SHORTCUTS longest_shortcut = max(map(len, SHORTCUTS.values())) return 28 - (longest_shortcut + len("__allow")) def checkUser(user): if len(user) < 1 or len(user) > os.sysconf('SC_LOGIN_NAME_MAX'): return False for c in user: if c not in string.ascii_letters and \ c not in string.digits and \ c not in [ ".", "-", "_", "$" ]: return False return True def checkUid(uid): if isinstance(uid, str): try: uid = int(uid) except ValueError: return False if uid >= 0 and uid <= 2**31-1: return True return False def checkCommand(command): if len(command) < 1 or len(command) > 1024: return False for ch in [ "|", "\n", "\0" ]: if ch in command: return False if command[0] != "/": return False return True def checkContext(context): splits = context.split(":") if len(splits) not in [4, 5]: return False # user ends with _u if not root if splits[0] != "root" and splits[0][-2:] != "_u": return False # role ends with _r if splits[1][-2:] != "_r": return False # type ends with _t if splits[2][-2:] != "_t": return False # level might also contain : if len(splits[3]) < 1: return False return True def joinArgs(args): if "quote" in dir(shlex): return " ".join(shlex.quote(a) for a in args) else: return " ".join(pipes.quote(a) for a in args) def splitArgs(_string): if PY2 and isinstance(_string, unicode): # noqa: F821 # Python2's shlex doesn't like unicode _string = u2b(_string) splits = shlex.split(_string) return map(b2u, splits) else: return shlex.split(_string) def b2u(_string): """ bytes to unicode """ if isinstance(_string, bytes): return _string.decode('UTF-8', 'replace') return _string def u2b(_string): """ unicode to bytes """ if not isinstance(_string, bytes): return _string.encode('UTF-8', 'replace') return _string def u2b_if_py2(_string): """ unicode to bytes only if Python 2""" if PY2 and isinstance(_string, unicode): # noqa: F821 return _string.encode('UTF-8', 'replace') return _string PK[EWEW!site-packages/firewall/command.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2011-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # """FirewallCommand class for command line client simplification""" __all__ = [ "FirewallCommand" ] import sys from firewall import errors from firewall.errors import FirewallError from dbus.exceptions import DBusException from firewall.functions import checkIPnMask, checkIP6nMask, check_mac, \ check_port, check_single_address class FirewallCommand(object): def __init__(self, quiet=False, verbose=False): self.quiet = quiet self.verbose = verbose self.__use_exception_handler = True self.fw = None def set_fw(self, fw): self.fw = fw def set_quiet(self, flag): self.quiet = flag def get_quiet(self): return self.quiet def set_verbose(self, flag): self.verbose = flag def get_verbose(self): return self.verbose def print_msg(self, msg=None): if msg is not None and not self.quiet: sys.stdout.write(msg + "\n") def print_error_msg(self, msg=None): if msg is not None and not self.quiet: sys.stderr.write(msg + "\n") def print_warning(self, msg=None): FAIL = '\033[91m' END = '\033[00m' if sys.stderr.isatty(): msg = FAIL + msg + END self.print_error_msg(msg) def print_and_exit(self, msg=None, exit_code=0): #OK = '\033[92m' #END = '\033[00m' if exit_code > 1: self.print_warning(msg) else: #if sys.stdout.isatty(): # msg = OK + msg + END self.print_msg(msg) sys.exit(exit_code) def fail(self, msg=None): self.print_and_exit(msg, 2) def print_if_verbose(self, msg=None): if msg is not None and self.verbose: sys.stdout.write(msg + "\n") def __cmd_sequence(self, cmd_type, option, action_method, query_method, # pylint: disable=W0613, R0913, R0914 parse_method, message, start_args=None, end_args=None, # pylint: disable=W0613 no_exit=False): if self.fw is not None: self.fw.authorizeAll() items = [ ] _errors = 0 _error_codes = [ ] for item in option: if parse_method is not None: try: item = parse_method(item) except Exception as msg: code = FirewallError.get_code(str(msg)) if len(option) > 1: self.print_warning("Warning: %s" % msg) else: self.print_and_exit("Error: %s" % msg, code) if code not in _error_codes: _error_codes.append(code) _errors += 1 continue items.append(item) for item in items: call_item = [ ] if start_args is not None: call_item += start_args if not isinstance(item, list) and not isinstance(item, tuple): call_item.append(item) else: call_item += item if end_args is not None: call_item += end_args self.deactivate_exception_handler() try: action_method(*call_item) except (DBusException, Exception) as msg: if isinstance(msg, DBusException): self.fail_if_not_authorized(msg.get_dbus_name()) msg = msg.get_dbus_message() else: msg = str(msg) code = FirewallError.get_code(msg) if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED, errors.ZONE_ALREADY_SET, errors.ALREADY_SET ]: code = 0 if len(option) > 1: self.print_warning("Warning: %s" % msg) elif code == 0: self.print_warning("Warning: %s" % msg) return else: self.print_and_exit("Error: %s" % msg, code) if code not in _error_codes: _error_codes.append(code) _errors += 1 self.activate_exception_handler() if not no_exit: if len(option) > _errors or 0 in _error_codes: # There have been more options than errors or there # was at least one error code 0, return. return elif len(_error_codes) == 1: # Exactly one error code, use it. sys.exit(_error_codes[0]) elif len(_error_codes) > 1: # There is more than error, exit using # UNKNOWN_ERROR. This could happen within sequences # where parsing failed with different errors like # INVALID_PORT and INVALID_PROTOCOL. sys.exit(errors.UNKNOWN_ERROR) def add_sequence(self, option, action_method, query_method, parse_method, # pylint: disable=R0913 message, no_exit=False): self.__cmd_sequence("add", option, action_method, query_method, parse_method, message, no_exit=no_exit) def x_add_sequence(self, x, option, action_method, query_method, # pylint: disable=R0913 parse_method, message, no_exit=False): self.__cmd_sequence("add", option, action_method, query_method, parse_method, message, start_args=[x], no_exit=no_exit) def zone_add_timeout_sequence(self, zone, option, action_method, # pylint: disable=R0913 query_method, parse_method, message, timeout, no_exit=False): self.__cmd_sequence("add", option, action_method, query_method, parse_method, message, start_args=[zone], end_args=[timeout], no_exit=no_exit) def remove_sequence(self, option, action_method, query_method, # pylint: disable=R0913 parse_method, message, no_exit=False): self.__cmd_sequence("remove", option, action_method, query_method, parse_method, message, no_exit=no_exit) def x_remove_sequence(self, x, option, action_method, query_method, # pylint: disable=R0913 parse_method, message, no_exit=False): self.__cmd_sequence("remove", option, action_method, query_method, parse_method, message, start_args=[x], no_exit=no_exit) def __query_sequence(self, option, query_method, parse_method, message, # pylint: disable=R0913 start_args=None, no_exit=False): items = [ ] for item in option: if parse_method is not None: try: item = parse_method(item) except Exception as msg: if len(option) > 1: self.print_warning("Warning: %s" % msg) continue else: code = FirewallError.get_code(str(msg)) self.print_and_exit("Error: %s" % msg, code) items.append(item) for item in items: call_item = [ ] if start_args is not None: call_item += start_args if not isinstance(item, list) and not isinstance(item, tuple): call_item.append(item) else: call_item += item self.deactivate_exception_handler() try: res = query_method(*call_item) except DBusException as msg: self.fail_if_not_authorized(msg.get_dbus_name()) code = FirewallError.get_code(msg.get_dbus_message()) if len(option) > 1: self.print_warning("Warning: %s" % msg.get_dbus_message()) continue else: self.print_and_exit("Error: %s" % msg.get_dbus_message(), code) except Exception as msg: code = FirewallError.get_code(str(msg)) if len(option) > 1: self.print_warning("Warning: %s" % msg) else: self.print_and_exit("Error: %s" % msg, code) self.activate_exception_handler() if len(option) > 1: self.print_msg("%s: %s" % (message % item, ("no", "yes")[res])) else: self.print_query_result(res) if not no_exit: sys.exit(0) def query_sequence(self, option, query_method, parse_method, message, # pylint: disable=R0913 no_exit=False): self.__query_sequence(option, query_method, parse_method, message, no_exit=no_exit) def x_query_sequence(self, x, option, query_method, parse_method, # pylint: disable=R0913 message, no_exit=False): self.__query_sequence(option, query_method, parse_method, message, start_args=[x], no_exit=no_exit) def parse_source(self, value): if not checkIPnMask(value) and not checkIP6nMask(value) \ and not check_mac(value) and not \ (value.startswith("ipset:") and len(value) > 6): raise FirewallError(errors.INVALID_ADDR, "'%s' is no valid IPv4, IPv6 or MAC address, nor an ipset" % value) return value def parse_port(self, value, separator="/"): try: (port, proto) = value.split(separator) except ValueError: raise FirewallError(errors.INVALID_PORT, "bad port (most likely " "missing protocol), correct syntax is " "portid[-portid]%sprotocol" % separator) if not check_port(port): raise FirewallError(errors.INVALID_PORT, port) if proto not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, "'%s' not in {'tcp'|'udp'|'sctp'|'dccp'}" % \ proto) return (port, proto) def parse_forward_port(self, value, compat=False): port = None protocol = None toport = None toaddr = None i = 0 while ("=" in value[i:]): opt = value[i:].split("=", 1)[0] i += len(opt) + 1 if "=" in value[i:]: val = value[i:].split(":", 1)[0] else: val = value[i:] i += len(val) + 1 if opt == "port": port = val elif opt == "proto": protocol = val elif opt == "toport": toport = val elif opt == "toaddr": toaddr = val elif opt == "if" and compat: # ignore if option in compat mode pass else: raise FirewallError(errors.INVALID_FORWARD, "invalid forward port arg '%s'" % (opt)) if not port: raise FirewallError(errors.INVALID_FORWARD, "missing port") if not protocol: raise FirewallError(errors.INVALID_FORWARD, "missing protocol") if not (toport or toaddr): raise FirewallError(errors.INVALID_FORWARD, "missing destination") if not check_port(port): raise FirewallError(errors.INVALID_PORT, port) if protocol not in [ "tcp", "udp", "sctp", "dccp" ]: raise FirewallError(errors.INVALID_PROTOCOL, "'%s' not in {'tcp'|'udp'|'sctp'|'dccp'}" % \ protocol) if toport and not check_port(toport): raise FirewallError(errors.INVALID_PORT, toport) if toaddr and not check_single_address("ipv4", toaddr): if compat or not check_single_address("ipv6", toaddr): raise FirewallError(errors.INVALID_ADDR, toaddr) return (port, protocol, toport, toaddr) def parse_ipset_option(self, value): args = value.split("=") if len(args) == 1: return (args[0], "") elif len(args) == 2: return args else: raise FirewallError(errors.INVALID_OPTION, "invalid ipset option '%s'" % (value)) def check_destination_ipv(self, value): ipvs = [ "ipv4", "ipv6", ] if value not in ipvs: raise FirewallError(errors.INVALID_IPV, "invalid argument: %s (choose from '%s')" % \ (value, "', '".join(ipvs))) return value def parse_service_destination(self, value): try: (ipv, destination) = value.split(":", 1) except ValueError: raise FirewallError(errors.INVALID_DESTINATION, "destination syntax is ipv:address[/mask]") return (self.check_destination_ipv(ipv), destination) def check_ipv(self, value): ipvs = [ "ipv4", "ipv6", "eb" ] if value not in ipvs: raise FirewallError(errors.INVALID_IPV, "invalid argument: %s (choose from '%s')" % \ (value, "', '".join(ipvs))) return value def check_helper_family(self, value): ipvs = [ "", "ipv4", "ipv6" ] if value not in ipvs: raise FirewallError(errors.INVALID_IPV, "invalid argument: %s (choose from '%s')" % \ (value, "', '".join(ipvs))) return value def check_module(self, value): if not value.startswith("nf_conntrack_"): raise FirewallError( errors.INVALID_MODULE, "'%s' does not start with 'nf_conntrack_'" % value) if len(value.replace("nf_conntrack_", "")) < 1: raise FirewallError(errors.INVALID_MODULE, "Module name '%s' too short" % value) return value def print_zone_info(self, zone, settings, default_zone=None, extra_interfaces=[]): # pylint: disable=R0914 target = settings.getTarget() icmp_block_inversion = settings.getIcmpBlockInversion() interfaces = sorted(set(settings.getInterfaces() + extra_interfaces)) sources = settings.getSources() services = settings.getServices() ports = settings.getPorts() protocols = settings.getProtocols() masquerade = settings.getMasquerade() forward_ports = settings.getForwardPorts() source_ports = settings.getSourcePorts() icmp_blocks = settings.getIcmpBlocks() rules = settings.getRichRules() description = settings.getDescription() short_description = settings.getShort() attributes = [] if default_zone is not None: if zone == default_zone: attributes.append("default") if interfaces or sources: attributes.append("active") if attributes: zone = zone + " (%s)" % ", ".join(attributes) self.print_msg(zone) if self.verbose: self.print_msg(" summary: " + short_description) self.print_msg(" description: " + description) self.print_msg(" target: " + target) self.print_msg(" icmp-block-inversion: %s" % \ ("yes" if icmp_block_inversion else "no")) self.print_msg(" interfaces: " + " ".join(interfaces)) self.print_msg(" sources: " + " ".join(sources)) self.print_msg(" services: " + " ".join(sorted(services))) self.print_msg(" ports: " + " ".join(["%s/%s" % (port[0], port[1]) for port in ports])) self.print_msg(" protocols: " + " ".join(sorted(protocols))) self.print_msg(" masquerade: %s" % ("yes" if masquerade else "no")) self.print_msg(" forward-ports: " + "\n\t".join(["port=%s:proto=%s:toport=%s:toaddr=%s" % \ (port, proto, toport, toaddr) for (port, proto, toport, toaddr) in \ forward_ports])) self.print_msg(" source-ports: " + " ".join(["%s/%s" % (port[0], port[1]) for port in source_ports])) self.print_msg(" icmp-blocks: " + " ".join(icmp_blocks)) self.print_msg(" rich rules: \n\t" + "\n\t".join(rules)) def print_service_info(self, service, settings): ports = settings.getPorts() protocols = settings.getProtocols() source_ports = settings.getSourcePorts() modules = settings.getModules() description = settings.getDescription() destinations = settings.getDestinations() short_description = settings.getShort() self.print_msg(service) if self.verbose: self.print_msg(" summary: " + short_description) self.print_msg(" description: " + description) self.print_msg(" ports: " + " ".join(["%s/%s" % (port[0], port[1]) for port in ports])) self.print_msg(" protocols: " + " ".join(protocols)) self.print_msg(" source-ports: " + " ".join(["%s/%s" % (port[0], port[1]) for port in source_ports])) self.print_msg(" modules: " + " ".join(modules)) self.print_msg(" destination: " + " ".join(["%s:%s" % (k, v) for k, v in destinations.items()])) def print_icmptype_info(self, icmptype, settings): destinations = settings.getDestinations() description = settings.getDescription() short_description = settings.getShort() if len(destinations) == 0: destinations = [ "ipv4", "ipv6" ] self.print_msg(icmptype) if self.verbose: self.print_msg(" summary: " + short_description) self.print_msg(" description: " + description) self.print_msg(" destination: " + " ".join(destinations)) def print_ipset_info(self, ipset, settings): ipset_type = settings.getType() options = settings.getOptions() entries = settings.getEntries() description = settings.getDescription() short_description = settings.getShort() self.print_msg(ipset) if self.verbose: self.print_msg(" summary: " + short_description) self.print_msg(" description: " + description) self.print_msg(" type: " + ipset_type) self.print_msg(" options: " + " ".join(["%s=%s" % (k, v) if v else k for k, v in options.items()])) self.print_msg(" entries: " + " ".join(entries)) def print_helper_info(self, helper, settings): ports = settings.getPorts() module = settings.getModule() family = settings.getFamily() description = settings.getDescription() short_description = settings.getShort() self.print_msg(helper) if self.verbose: self.print_msg(" summary: " + short_description) self.print_msg(" description: " + description) self.print_msg(" family: " + family) self.print_msg(" module: " + module) self.print_msg(" ports: " + " ".join(["%s/%s" % (port[0], port[1]) for port in ports])) def print_query_result(self, value): if value: self.print_and_exit("yes") else: self.print_and_exit("no", 1) def exception_handler(self, exception_message): if not self.__use_exception_handler: raise self.fail_if_not_authorized(exception_message) code = FirewallError.get_code(str(exception_message)) if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED, errors.ZONE_ALREADY_SET, errors.ALREADY_SET ]: self.print_warning("Warning: %s" % exception_message) else: self.print_and_exit("Error: %s" % exception_message, code) def fail_if_not_authorized(self, exception_message): if "NotAuthorizedException" in exception_message: msg = """Authorization failed. Make sure polkit agent is running or run the application as superuser.""" self.print_and_exit(msg, errors.NOT_AUTHORIZED) def deactivate_exception_handler(self): self.__use_exception_handler = False def activate_exception_handler(self): self.__use_exception_handler = True def get_ipset_entries_from_file(self, filename): entries = [ ] entries_set = set() f = open(filename) for line in f: if not line: break line = line.strip() if len(line) < 1 or line[0] in ['#', ';']: continue if line not in entries_set: entries.append(line) entries_set.add(line) f.close() return entries PK[x׌#site-packages/firewall/__init__.pyonu[ c`c@sdS(N((((s5/usr/lib/python2.7/site-packages/firewall/__init__.pytsPK[u@@$site-packages/firewall/functions.pycnu[ c`c#@sXdddddddddd d d d d ddddddddddddddddddd d!d"g#Zd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d%l m Z d#d&l m Z m Z ejd'kZd(Zd)Zd*d+Zd,Zd-Zd.Zd/Zd0Zd1Zd2Zd3Zd4Zd5Zd6Zd7Zd8Zd9Z d:Z!d;Z"d<Z#d=Z$d>Z%d?Z&d@Z'dAZ(dBZ)dCZ*dDZ+dEZ,dFZ-dGZ.dHZ/dIZ0dJZ1dKZ2dLZ3dMZ4d$S(NtPY2t getPortIDt getPortRangetportStrtgetServiceNametcheckIPtcheckIP6t checkIPnMaskt checkIP6nMaskt checkProtocoltcheckInterfacet checkUINT32tfirewalld_is_activettempFiletreadfilet writefiletenable_ip_forwardingtget_nf_conntrack_helper_settingtset_nf_conntrack_helper_settingt check_portt check_addresstcheck_single_addresst check_mactuniqifyt ppid_of_pidtmax_zone_name_lent checkUsertcheckUidt checkCommandt checkContexttjoinArgst splitArgstb2utu2bt u2b_if_py2iN(tlog(tFIREWALLD_TEMPDIRtFIREWALLD_PIDFILEt3cCst|tr|}nd|r-|j}nyt|}Wn<tk r{ytj|}Wq|tjk rwdSXnX|dkrdS|S(s Check and Get port id from port string or port id using socket.getservbyname @param port port string or port id @return Port id if valid, -1 if port can not be found and -2 if port is too big iii(t isinstancetinttstript ValueErrortsockett getservbynameterror(tportt_id((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR.s    c Cs>t|ts|jr>t|}|dkr:|fS|S|jd}t|dkr|djr|djrt|d}t|d}|dkr|dkr||kr||fS||kr||fS|fSqng}xtt|ddD]}tdj|| }dj||}t|dkrt|}|dkr|dkr||kr|j||fq||kr|j||fq|j|fqq|dkr|j|f|t|krPqqqWt|dkr dSt|dkr6dS|dS(sI Get port range for port range string or single port id @param ports an integer or port string or port range string @return Array containing start and end port id for a valid range or -1 if port can not be found and -2 if port is too big for integer input or -1 for invalid ranges or None if the range is ambiguous. it-iiiN( R'R(tisdigitRtsplittlentrangetjointappendtNone(tportstid1tsplitstid2tmatchedtitport2((s6/usr/lib/python2.7/site-packages/firewall/functions.pyREsH  2          t:cCsr|dkrdSt|}t|tr;|dkr;dSt|dkrUd|Sd|d||dfSdS(s Create port and port range string @param port port or port range int or [int, int] @param delimiter of the output string for port ranges, default ':' @return Port or port range string, empty string if port isn't specified, None if port or port range is not valid tiis%ss%s%s%sN(RR'R(R7R3(R.t delimitert_range((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR{s  cCst|}t|}t|dkr>|t|dkSt|dkr|t|dkr|t|dkrtStS(Niii(RRR3tTruetFalse(R.R4t_portRB((s6/usr/lib/python2.7/site-packages/firewall/functions.pytportInPortRanges  ,cCs8ytjt||}Wntjk r3dSX|S(s Check and Get service name from port and proto string combination using socket.getservbyport @param port string or id @param protocol string @return Service name if port and protocol are valid, else None N(R+t getservbyportR(R-R7(R.tprototname((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCs3ytjtj|Wntjk r.tSXtS(sl Check IPv4 address. @param ip address string @return True if address is valid, else False (R+t inet_ptontAF_INETR-RDRC(tip((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCs |jdS(s Normalize the IPv6 address This is mostly about converting URL-like IPv6 address to normal ones. e.g. [1234::4321] --> 1234:4321 s[](R)(RL((s6/usr/lib/python2.7/site-packages/firewall/functions.pyt normalizeIP6scCs9ytjtjt|Wntjk r4tSXtS(sl Check IPv6 address. @param ip address string @return True if address is valid, else False (R+RJtAF_INET6RMR-RDRC(RL((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCsd|kra||jd }||jdd}t|dksZt|dkrmtSn |}d}t|s}tS|rd|krt|Syt|}Wntk rtSX|dks|dkrtSntS(Nt/it.ii (tindexR3RDR7RR(R*RC(RLtaddrtmaskR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs& $    cCsd|kra||jd }||jdd}t|dksZt|dkrmtSn |}d}t|s}tS|ryt|}Wntk rtSX|dks|dkrtSntS(NROiii(RQR3RDR7RR(R*RC(RLRRRSR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs" $  cCsmyt|}Wn:tk rLytj|Wqitjk rHtSXnX|dkse|dkritStS(Nii(R(R*R+tgetprotobynameR-RDRC(tprotocolR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR s  cCsN| st|dkrtSx*ddddgD]}||kr0tSq0WtS(s Check interface string @param interface string @return True if interface is valid (maximum 16 chars and does not contain ' ', '/', '!', ':', '*'), else False it ROt!t*(R3RDRC(tifacetch((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR s  cCsHyt|d}Wntk r'tSX|dkrD|dkrDtStS(NiI(R(R*RDRC(tvaltx((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR s cCstjjtstSy(ttd}|j}WdQXWntk rRtSXtjjd|smtSy,td|d}|j}WdQXWntk rtSXd|krtStS(sv Check if firewalld is active @return True if there is a firewalld pid file and the pid is used by firewalld trNs/proc/%ss/proc/%s/cmdlinet firewalld( tostpathtexistsR%RDtopentreadlinet ExceptionRC(tfdtpidtcmdline((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR !s"   c CsyyKtjjts(tjtdntjdddddtdtSWn'tk rt}t j d|nXdS( Nitmodetwttprefixstemp.tdirtdeletes#Failed to create temporary file: %s( R_R`RaR$tmkdirttempfiletNamedTemporaryFileRDRdR#R-R7(tmsg((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR >scCsWy&t|d}|jSWdQXWn*tk rR}tjd||fnXdS(NR]sFailed to read file "%s": %s(Rbt readlinesRdR#R-R7(tfilenametfte((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRJs cCs[y)t|d}|j|WdQXWn+tk rV}tjd||ftSXtS(Ntws Failed to write to file "%s": %s(RbtwriteRdR#R-RDRC(RrtlineRsRt((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRRscCs6|dkrtddS|dkr2tddStS(Ntipv4s/proc/sys/net/ipv4/ip_forwards1 tipv6s&/proc/sys/net/ipv6/conf/all/forwarding(RRD(tipv((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR[s     cCs|jddjddS(Nt_R0s nf-conntrack-R@(treplace(tmodule((s6/usr/lib/python2.7/site-packages/firewall/functions.pytget_nf_conntrack_short_namebscCs>yttddSWntk r9tjddSXdS(Ns+/proc/sys/net/netfilter/nf_conntrack_helperis3Failed to get and parse nf_conntrack_helper setting(R(RRdR#twarning(((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRes   cCstd|rdndS(Ns+/proc/sys/net/netfilter/nf_conntrack_helpers1 s0 (R(tflag((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRlscCst|}|dksV|dksV|dksVt|dkr|d|dkr|dkrvtjd|nz|dkrtjd|nZ|dkrtjd|n:t|dkr|d|dkrtjd |ntStS( Niiiiis'%s': port > 65535s'%s': port is invalids'%s': port is ambiguouss'%s': range start >= end(RR7R3R#tdebug2RDRC(R.RB((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRps $&   &cCs4|dkrt|S|dkr,t|StSdS(NRxRy(RRRD(Rztsource((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs     cCs4|dkrt|S|dkr,t|StSdS(NRxRy(RRRD(RzR((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs     c Csgt|dkrcx"dD]}||dkrtSqWx%dD]}||tjkr>tSq>WtStS(Ni iiii iR?iiiiiii i i iii(iiii i( iiiiiii i i i ii(R3RDtstringt hexdigitsRC(tmacR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs  cCs7g}x*|D]"}||kr |j|q q W|S(N(R6(t_listtoutputR\((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs   cCsVy=tjd|}t|jdj}|jWntk rQdSX|S(s Get parent for pid sps -o ppid -h -p %d 2>/dev/nulliN(R_tpopenR(RqR)tcloseRdR7(RfRs((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCs=ddlm}ttt|j}d|tdS(s Netfilter limits length of chain to (currently) 28 chars. The longest chain we create is FWDI__allow, which leaves 28 - 11 = 17 chars for . i(t SHORTCUTSit__allow(tfirewall.core.baseRtmaxtmapR3tvalues(Rtlongest_shortcut((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRsc Cstt|dks-t|tjdkr1tSx<|D]4}|tjkr8|tjkr8|dkr8tSq8WtS(NitSC_LOGIN_NAME_MAXRPR0R{t$(RPR0R{R(R3R_tsysconfRDRt ascii_letterstdigitsRC(tusertc((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs-  cCsWt|tr7yt|}Wq7tk r3tSXn|dkrS|dkrStStS(NiiiiIi(R'tstrR(R*RDRC(tuid((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCsjt|dks$t|dkr(tSx'dddgD]}||kr8tSq8W|ddkrftStS(Niit|s tiRO(R3RDRC(tcommandRZ((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs$ cCs|jd}t|d kr%tS|ddkrM|dddkrMtS|ddd kretS|d dd kr}tSt|d dkrtStS(NR?iiitrootit_uit_rit_ti(ii(R2R3RDRC(tcontextR:((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs$cCsDdttkr)djd|DSdjd|DSdS(NtquoteRVcss|]}tj|VqdS(N(tshlexR(t.0ta((s6/usr/lib/python2.7/site-packages/firewall/functions.pys scss|]}tj|VqdS(N(tpipesR(RR((s6/usr/lib/python2.7/site-packages/firewall/functions.pys s(RkRR5(targs((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRscCsNtr=t|tr=t|}tj|}tt|Stj|SdS(N(RR'tunicodeR!RR2RR (t_stringR:((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs   cCs#t|tr|jddS|S(s bytes to unicode sUTF-8R|(R'tbytestdecode(R((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR scCs#t|ts|jddS|S(s unicode to bytes sUTF-8R|(R'Rtencode(R((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR!scCs)tr%t|tr%|jddS|S(s" unicode to bytes only if Python 2sUTF-8R|(RR'RR(R((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR"s(5t__all__R+R_tos.pathRRRtsysRntfirewall.core.loggerR#tfirewall.configR$R%tversionRRRRRFRRRMRRRR R R R R RRRR~RRRRRRRRRRRRRRRR R!R"(((s6/usr/lib/python2.7/site-packages/firewall/functions.pytsr                 6                     PK[u@@$site-packages/firewall/functions.pyonu[ c`c#@sXdddddddddd d d d d ddddddddddddddddddd d!d"g#Zd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d$lZd#d%l m Z d#d&l m Z m Z ejd'kZd(Zd)Zd*d+Zd,Zd-Zd.Zd/Zd0Zd1Zd2Zd3Zd4Zd5Zd6Zd7Zd8Zd9Z d:Z!d;Z"d<Z#d=Z$d>Z%d?Z&d@Z'dAZ(dBZ)dCZ*dDZ+dEZ,dFZ-dGZ.dHZ/dIZ0dJZ1dKZ2dLZ3dMZ4d$S(NtPY2t getPortIDt getPortRangetportStrtgetServiceNametcheckIPtcheckIP6t checkIPnMaskt checkIP6nMaskt checkProtocoltcheckInterfacet checkUINT32tfirewalld_is_activettempFiletreadfilet writefiletenable_ip_forwardingtget_nf_conntrack_helper_settingtset_nf_conntrack_helper_settingt check_portt check_addresstcheck_single_addresst check_mactuniqifyt ppid_of_pidtmax_zone_name_lent checkUsertcheckUidt checkCommandt checkContexttjoinArgst splitArgstb2utu2bt u2b_if_py2iN(tlog(tFIREWALLD_TEMPDIRtFIREWALLD_PIDFILEt3cCst|tr|}nd|r-|j}nyt|}Wn<tk r{ytj|}Wq|tjk rwdSXnX|dkrdS|S(s Check and Get port id from port string or port id using socket.getservbyname @param port port string or port id @return Port id if valid, -1 if port can not be found and -2 if port is too big iii(t isinstancetinttstript ValueErrortsockett getservbynameterror(tportt_id((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR.s    c Cs>t|ts|jr>t|}|dkr:|fS|S|jd}t|dkr|djr|djrt|d}t|d}|dkr|dkr||kr||fS||kr||fS|fSqng}xtt|ddD]}tdj|| }dj||}t|dkrt|}|dkr|dkr||kr|j||fq||kr|j||fq|j|fqq|dkr|j|f|t|krPqqqWt|dkr dSt|dkr6dS|dS(sI Get port range for port range string or single port id @param ports an integer or port string or port range string @return Array containing start and end port id for a valid range or -1 if port can not be found and -2 if port is too big for integer input or -1 for invalid ranges or None if the range is ambiguous. it-iiiN( R'R(tisdigitRtsplittlentrangetjointappendtNone(tportstid1tsplitstid2tmatchedtitport2((s6/usr/lib/python2.7/site-packages/firewall/functions.pyREsH  2          t:cCsr|dkrdSt|}t|tr;|dkr;dSt|dkrUd|Sd|d||dfSdS(s Create port and port range string @param port port or port range int or [int, int] @param delimiter of the output string for port ranges, default ':' @return Port or port range string, empty string if port isn't specified, None if port or port range is not valid tiis%ss%s%s%sN(RR'R(R7R3(R.t delimitert_range((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR{s  cCst|}t|}t|dkr>|t|dkSt|dkr|t|dkr|t|dkrtStS(Niii(RRR3tTruetFalse(R.R4t_portRB((s6/usr/lib/python2.7/site-packages/firewall/functions.pytportInPortRanges  ,cCs8ytjt||}Wntjk r3dSX|S(s Check and Get service name from port and proto string combination using socket.getservbyport @param port string or id @param protocol string @return Service name if port and protocol are valid, else None N(R+t getservbyportR(R-R7(R.tprototname((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCs3ytjtj|Wntjk r.tSXtS(sl Check IPv4 address. @param ip address string @return True if address is valid, else False (R+t inet_ptontAF_INETR-RDRC(tip((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCs |jdS(s Normalize the IPv6 address This is mostly about converting URL-like IPv6 address to normal ones. e.g. [1234::4321] --> 1234:4321 s[](R)(RL((s6/usr/lib/python2.7/site-packages/firewall/functions.pyt normalizeIP6scCs9ytjtjt|Wntjk r4tSXtS(sl Check IPv6 address. @param ip address string @return True if address is valid, else False (R+RJtAF_INET6RMR-RDRC(RL((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCsd|kra||jd }||jdd}t|dksZt|dkrmtSn |}d}t|s}tS|rd|krt|Syt|}Wntk rtSX|dks|dkrtSntS(Nt/it.ii (tindexR3RDR7RR(R*RC(RLtaddrtmaskR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs& $    cCsd|kra||jd }||jdd}t|dksZt|dkrmtSn |}d}t|s}tS|ryt|}Wntk rtSX|dks|dkrtSntS(NROiii(RQR3RDR7RR(R*RC(RLRRRSR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs" $  cCsmyt|}Wn:tk rLytj|Wqitjk rHtSXnX|dkse|dkritStS(Nii(R(R*R+tgetprotobynameR-RDRC(tprotocolR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR s  cCsN| st|dkrtSx*ddddgD]}||kr0tSq0WtS(s Check interface string @param interface string @return True if interface is valid (maximum 16 chars and does not contain ' ', '/', '!', ':', '*'), else False it ROt!t*(R3RDRC(tifacetch((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR s  cCsHyt|d}Wntk r'tSX|dkrD|dkrDtStS(NiI(R(R*RDRC(tvaltx((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR s cCstjjtstSy(ttd}|j}WdQXWntk rRtSXtjjd|smtSy,td|d}|j}WdQXWntk rtSXd|krtStS(sv Check if firewalld is active @return True if there is a firewalld pid file and the pid is used by firewalld trNs/proc/%ss/proc/%s/cmdlinet firewalld( tostpathtexistsR%RDtopentreadlinet ExceptionRC(tfdtpidtcmdline((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR !s"   c CsyyKtjjts(tjtdntjdddddtdtSWn'tk rt}t j d|nXdS( Nitmodetwttprefixstemp.tdirtdeletes#Failed to create temporary file: %s( R_R`RaR$tmkdirttempfiletNamedTemporaryFileRDRdR#R-R7(tmsg((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR >scCsWy&t|d}|jSWdQXWn*tk rR}tjd||fnXdS(NR]sFailed to read file "%s": %s(Rbt readlinesRdR#R-R7(tfilenametfte((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRJs cCs[y)t|d}|j|WdQXWn+tk rV}tjd||ftSXtS(Ntws Failed to write to file "%s": %s(RbtwriteRdR#R-RDRC(RrtlineRsRt((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRRscCs6|dkrtddS|dkr2tddStS(Ntipv4s/proc/sys/net/ipv4/ip_forwards1 tipv6s&/proc/sys/net/ipv6/conf/all/forwarding(RRD(tipv((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR[s     cCs|jddjddS(Nt_R0s nf-conntrack-R@(treplace(tmodule((s6/usr/lib/python2.7/site-packages/firewall/functions.pytget_nf_conntrack_short_namebscCs>yttddSWntk r9tjddSXdS(Ns+/proc/sys/net/netfilter/nf_conntrack_helperis3Failed to get and parse nf_conntrack_helper setting(R(RRdR#twarning(((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRes   cCstd|rdndS(Ns+/proc/sys/net/netfilter/nf_conntrack_helpers1 s0 (R(tflag((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRlscCst|}|dksV|dksV|dksVt|dkr|d|dkr|dkrvtjd|nz|dkrtjd|nZ|dkrtjd|n:t|dkr|d|dkrtjd |ntStS( Niiiiis'%s': port > 65535s'%s': port is invalids'%s': port is ambiguouss'%s': range start >= end(RR7R3R#tdebug2RDRC(R.RB((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRps $&   &cCs4|dkrt|S|dkr,t|StSdS(NRxRy(RRRD(Rztsource((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs     cCs4|dkrt|S|dkr,t|StSdS(NRxRy(RRRD(RzR((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs     c Csgt|dkrcx"dD]}||dkrtSqWx%dD]}||tjkr>tSq>WtStS(Ni iiii iR?iiiiiii i i iii(iiii i( iiiiiii i i i ii(R3RDtstringt hexdigitsRC(tmacR=((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs  cCs7g}x*|D]"}||kr |j|q q W|S(N(R6(t_listtoutputR\((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs   cCsVy=tjd|}t|jdj}|jWntk rQdSX|S(s Get parent for pid sps -o ppid -h -p %d 2>/dev/nulliN(R_tpopenR(RqR)tcloseRdR7(RfRs((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCs=ddlm}ttt|j}d|tdS(s Netfilter limits length of chain to (currently) 28 chars. The longest chain we create is FWDI__allow, which leaves 28 - 11 = 17 chars for . i(t SHORTCUTSit__allow(tfirewall.core.baseRtmaxtmapR3tvalues(Rtlongest_shortcut((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRsc Cstt|dks-t|tjdkr1tSx<|D]4}|tjkr8|tjkr8|dkr8tSq8WtS(NitSC_LOGIN_NAME_MAXRPR0R{t$(RPR0R{R(R3R_tsysconfRDRt ascii_letterstdigitsRC(tusertc((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs-  cCsWt|tr7yt|}Wq7tk r3tSXn|dkrS|dkrStStS(NiiiiIi(R'tstrR(R*RDRC(tuid((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs cCsjt|dks$t|dkr(tSx'dddgD]}||kr8tSq8W|ddkrftStS(Niit|s tiRO(R3RDRC(tcommandRZ((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs$ cCs|jd}t|d kr%tS|ddkrM|dddkrMtS|ddd kretS|d dd kr}tSt|d dkrtStS(NR?iiitrootit_uit_rit_ti(ii(R2R3RDRC(tcontextR:((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs$cCsDdttkr)djd|DSdjd|DSdS(NtquoteRVcss|]}tj|VqdS(N(tshlexR(t.0ta((s6/usr/lib/python2.7/site-packages/firewall/functions.pys scss|]}tj|VqdS(N(tpipesR(RR((s6/usr/lib/python2.7/site-packages/firewall/functions.pys s(RkRR5(targs((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRscCsNtr=t|tr=t|}tj|}tt|Stj|SdS(N(RR'tunicodeR!RR2RR (t_stringR:((s6/usr/lib/python2.7/site-packages/firewall/functions.pyRs   cCs#t|tr|jddS|S(s bytes to unicode sUTF-8R|(R'tbytestdecode(R((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR scCs#t|ts|jddS|S(s unicode to bytes sUTF-8R|(R'Rtencode(R((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR!scCs)tr%t|tr%|jddS|S(s" unicode to bytes only if Python 2sUTF-8R|(RR'RR(R((s6/usr/lib/python2.7/site-packages/firewall/functions.pyR"s(5t__all__R+R_tos.pathRRRtsysRntfirewall.core.loggerR#tfirewall.configR$R%tversionRRRRRFRRRMRRRR R R R R RRRR~RRRRRRRRRRRRRRRR R!R"(((s6/usr/lib/python2.7/site-packages/firewall/functions.pytsr                 6                     PK[ kիի site-packages/firewall/client.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2009-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # from gi.repository import GLib, GObject # force use of pygobject3 in python-slip import sys sys.modules['gobject'] = GObject import dbus.mainloop.glib import slip.dbus from decorator import decorator from firewall import config from firewall.core.base import DEFAULT_ZONE_TARGET from firewall.dbus_utils import dbus_to_python from firewall.functions import b2u from firewall.core.rich import Rich_Rule from firewall import errors from firewall.errors import FirewallError import dbus import traceback exception_handler = None not_authorized_loop = False @decorator def handle_exceptions(func, *args, **kwargs): """Decorator to handle exceptions """ authorized = False while not authorized: try: return func(*args, **kwargs) except dbus.exceptions.DBusException as e: dbus_message = e.get_dbus_message() # returns unicode dbus_name = e.get_dbus_name() if not exception_handler: raise if "NotAuthorizedException" in dbus_name: exception_handler("NotAuthorizedException") elif "org.freedesktop.DBus.Error" in dbus_name: # dbus error, try again exception_handler(dbus_message) else: authorized = True if dbus_message: exception_handler(dbus_message) else: exception_handler(b2u(str(e))) except FirewallError as e: if not exception_handler: raise else: exception_handler(b2u(str(e))) except Exception: if not exception_handler: raise else: exception_handler(b2u(traceback.format_exc())) if not not_authorized_loop: break # zone config setings class FirewallClientZoneSettings(object): @handle_exceptions def __init__(self, settings = None): if settings: self.settings = settings else: self.settings = ["", "", "", False, DEFAULT_ZONE_TARGET, [], [], [], False, [], [], [], [], [], [], False] @handle_exceptions def __repr__(self): return '%s(%r)' % (self.__class__, self.settings) @handle_exceptions def getVersion(self): return self.settings[0] @handle_exceptions def setVersion(self, version): self.settings[0] = version @handle_exceptions def getShort(self): return self.settings[1] @handle_exceptions def setShort(self, short): self.settings[1] = short @handle_exceptions def getDescription(self): return self.settings[2] @handle_exceptions def setDescription(self, description): self.settings[2] = description # self.settings[3] was used for 'immutable' @handle_exceptions def getTarget(self): return self.settings[4] if self.settings[4] != DEFAULT_ZONE_TARGET else "default" @handle_exceptions def setTarget(self, target): self.settings[4] = target if target != "default" else DEFAULT_ZONE_TARGET @handle_exceptions def getServices(self): return self.settings[5] @handle_exceptions def setServices(self, services): self.settings[5] = services @handle_exceptions def addService(self, service): if service not in self.settings[5]: self.settings[5].append(service) else: raise FirewallError(errors.ALREADY_ENABLED, service) @handle_exceptions def removeService(self, service): if service in self.settings[5]: self.settings[5].remove(service) else: raise FirewallError(errors.NOT_ENABLED, service) @handle_exceptions def queryService(self, service): return service in self.settings[5] @handle_exceptions def getPorts(self): return self.settings[6] @handle_exceptions def setPorts(self, ports): self.settings[6] = ports @handle_exceptions def addPort(self, port, protocol): if (port,protocol) not in self.settings[6]: self.settings[6].append((port,protocol)) else: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def removePort(self, port, protocol): if (port,protocol) in self.settings[6]: self.settings[6].remove((port,protocol)) else: raise FirewallError(errors.NOT_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def queryPort(self, port, protocol): return (port,protocol) in self.settings[6] @handle_exceptions def getProtocols(self): return self.settings[13] @handle_exceptions def setProtocols(self, protocols): self.settings[13] = protocols @handle_exceptions def addProtocol(self, protocol): if protocol not in self.settings[13]: self.settings[13].append(protocol) else: raise FirewallError(errors.ALREADY_ENABLED, protocol) @handle_exceptions def removeProtocol(self, protocol): if protocol in self.settings[13]: self.settings[13].remove(protocol) else: raise FirewallError(errors.NOT_ENABLED, protocol) @handle_exceptions def queryProtocol(self, protocol): return protocol in self.settings[13] @handle_exceptions def getSourcePorts(self): return self.settings[14] @handle_exceptions def setSourcePorts(self, ports): self.settings[14] = ports @handle_exceptions def addSourcePort(self, port, protocol): if (port,protocol) not in self.settings[14]: self.settings[14].append((port,protocol)) else: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def removeSourcePort(self, port, protocol): if (port,protocol) in self.settings[14]: self.settings[14].remove((port,protocol)) else: raise FirewallError(errors.NOT_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def querySourcePort(self, port, protocol): return (port,protocol) in self.settings[14] @handle_exceptions def getIcmpBlocks(self): return self.settings[7] @handle_exceptions def setIcmpBlocks(self, icmpblocks): self.settings[7] = icmpblocks @handle_exceptions def addIcmpBlock(self, icmptype): if icmptype not in self.settings[7]: self.settings[7].append(icmptype) else: raise FirewallError(errors.ALREADY_ENABLED, icmptype) @handle_exceptions def removeIcmpBlock(self, icmptype): if icmptype in self.settings[7]: self.settings[7].remove(icmptype) else: raise FirewallError(errors.NOT_ENABLED, icmptype) @handle_exceptions def queryIcmpBlock(self, icmptype): return icmptype in self.settings[7] @handle_exceptions def getIcmpBlockInversion(self): return self.settings[15] @handle_exceptions def setIcmpBlockInversion(self, flag): self.settings[15] = flag @slip.dbus.polkit.enable_proxy @handle_exceptions def addIcmpBlockInversion(self): if not self.settings[15]: self.settings[15] = True else: FirewallError(errors.ALREADY_ENABLED, "icmp-block-inversion") @slip.dbus.polkit.enable_proxy @handle_exceptions def removeIcmpBlockInversion(self): if self.settings[15]: self.settings[15] = False else: FirewallError(errors.NOT_ENABLED, "icmp-block-inversion") @slip.dbus.polkit.enable_proxy @handle_exceptions def queryIcmpBlockInversion(self): return self.settings[15] @handle_exceptions def getMasquerade(self): return self.settings[8] @handle_exceptions def setMasquerade(self, masquerade): self.settings[8] = masquerade @slip.dbus.polkit.enable_proxy @handle_exceptions def addMasquerade(self): if not self.settings[8]: self.settings[8] = True else: FirewallError(errors.ALREADY_ENABLED, "masquerade") @slip.dbus.polkit.enable_proxy @handle_exceptions def removeMasquerade(self): if self.settings[8]: self.settings[8] = False else: FirewallError(errors.NOT_ENABLED, "masquerade") @slip.dbus.polkit.enable_proxy @handle_exceptions def queryMasquerade(self): return self.settings[8] @handle_exceptions def getForwardPorts(self): return self.settings[9] @handle_exceptions def setForwardPorts(self, ports): self.settings[9] = ports @handle_exceptions def addForwardPort(self, port, protocol, to_port, to_addr): if to_port is None: to_port = '' if to_addr is None: to_addr = '' if (port,protocol,to_port,to_addr) not in self.settings[9]: self.settings[9].append((port,protocol,to_port,to_addr)) else: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s:%s:%s'" % \ (port, protocol, to_port, to_addr)) @handle_exceptions def removeForwardPort(self, port, protocol, to_port, to_addr): if to_port is None: to_port = '' if to_addr is None: to_addr = '' if (port,protocol,to_port,to_addr) in self.settings[9]: self.settings[9].remove((port,protocol,to_port,to_addr)) else: raise FirewallError(errors.NOT_ENABLED, "'%s:%s:%s:%s'" % \ (port, protocol, to_port, to_addr)) @handle_exceptions def queryForwardPort(self, port, protocol, to_port, to_addr): if to_port is None: to_port = '' if to_addr is None: to_addr = '' return (port,protocol,to_port,to_addr) in self.settings[9] @handle_exceptions def getInterfaces(self): return self.settings[10] @handle_exceptions def setInterfaces(self, interfaces): self.settings[10] = interfaces @handle_exceptions def addInterface(self, interface): if interface not in self.settings[10]: self.settings[10].append(interface) else: raise FirewallError(errors.ALREADY_ENABLED, interface) @handle_exceptions def removeInterface(self, interface): if interface in self.settings[10]: self.settings[10].remove(interface) else: raise FirewallError(errors.NOT_ENABLED, interface) @handle_exceptions def queryInterface(self, interface): return interface in self.settings[10] @handle_exceptions def getSources(self): return self.settings[11] @handle_exceptions def setSources(self, sources): self.settings[11] = sources @handle_exceptions def addSource(self, source): if source not in self.settings[11]: self.settings[11].append(source) else: raise FirewallError(errors.ALREADY_ENABLED, source) @handle_exceptions def removeSource(self, source): if source in self.settings[11]: self.settings[11].remove(source) else: raise FirewallError(errors.NOT_ENABLED, source) @handle_exceptions def querySource(self, source): return source in self.settings[11] @handle_exceptions def getRichRules(self): return self.settings[12] @handle_exceptions def setRichRules(self, rules): rules = [ str(Rich_Rule(rule_str=r)) for r in rules ] self.settings[12] = rules @handle_exceptions def addRichRule(self, rule): rule = str(Rich_Rule(rule_str=rule)) if rule not in self.settings[12]: self.settings[12].append(rule) else: raise FirewallError(errors.ALREADY_ENABLED, rule) @handle_exceptions def removeRichRule(self, rule): rule = str(Rich_Rule(rule_str=rule)) if rule in self.settings[12]: self.settings[12].remove(rule) else: raise FirewallError(errors.NOT_ENABLED, rule) @handle_exceptions def queryRichRule(self, rule): rule = str(Rich_Rule(rule_str=rule)) return rule in self.settings[12] # zone config class FirewallClientConfigZone(object): def __init__(self, bus, path): self.bus = bus self.path = path self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, path) self.fw_zone = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG_ZONE) self.fw_properties = dbus.Interface( self.dbus_obj, dbus_interface='org.freedesktop.DBus.Properties') #TODO: check interface version and revision (need to match client # version) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_property(self, prop): return dbus_to_python(self.fw_properties.Get( config.dbus.DBUS_INTERFACE_CONFIG_ZONE, prop)) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_properties(self): return dbus_to_python(self.fw_properties.GetAll( config.dbus.DBUS_INTERFACE_CONFIG_ZONE)) @slip.dbus.polkit.enable_proxy @handle_exceptions def set_property(self, prop, value): self.fw_properties.Set(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, prop, value) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSettings(self): return FirewallClientZoneSettings(list(dbus_to_python(\ self.fw_zone.getSettings()))) @slip.dbus.polkit.enable_proxy @handle_exceptions def update(self, settings): self.fw_zone.update(tuple(settings.settings)) @slip.dbus.polkit.enable_proxy @handle_exceptions def loadDefaults(self): self.fw_zone.loadDefaults() @slip.dbus.polkit.enable_proxy @handle_exceptions def remove(self): self.fw_zone.remove() @slip.dbus.polkit.enable_proxy @handle_exceptions def rename(self, name): self.fw_zone.rename(name) # version @slip.dbus.polkit.enable_proxy @handle_exceptions def getVersion(self): return self.fw_zone.getVersion() @slip.dbus.polkit.enable_proxy @handle_exceptions def setVersion(self, version): self.fw_zone.setVersion(version) # short @slip.dbus.polkit.enable_proxy @handle_exceptions def getShort(self): return self.fw_zone.getShort() @slip.dbus.polkit.enable_proxy @handle_exceptions def setShort(self, short): self.fw_zone.setShort(short) # description @slip.dbus.polkit.enable_proxy @handle_exceptions def getDescription(self): return self.fw_zone.getDescription() @slip.dbus.polkit.enable_proxy @handle_exceptions def setDescription(self, description): self.fw_zone.setDescription(description) # target @slip.dbus.polkit.enable_proxy @handle_exceptions def getTarget(self): return self.fw_zone.getTarget() @slip.dbus.polkit.enable_proxy @handle_exceptions def setTarget(self, target): self.fw_zone.setTarget(target) # service @slip.dbus.polkit.enable_proxy @handle_exceptions def getServices(self): return self.fw_zone.getServices() @slip.dbus.polkit.enable_proxy @handle_exceptions def setServices(self, services): self.fw_zone.setServices(services) @slip.dbus.polkit.enable_proxy @handle_exceptions def addService(self, service): self.fw_zone.addService(service) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeService(self, service): self.fw_zone.removeService(service) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryService(self, service): return self.fw_zone.queryService(service) # port @slip.dbus.polkit.enable_proxy @handle_exceptions def getPorts(self): return self.fw_zone.getPorts() @slip.dbus.polkit.enable_proxy @handle_exceptions def setPorts(self, ports): self.fw_zone.setPorts(ports) @slip.dbus.polkit.enable_proxy @handle_exceptions def addPort(self, port, protocol): self.fw_zone.addPort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def removePort(self, port, protocol): self.fw_zone.removePort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryPort(self, port, protocol): return self.fw_zone.queryPort(port, protocol) # protocol @slip.dbus.polkit.enable_proxy @handle_exceptions def getProtocols(self): return self.fw_zone.getProtocols() @slip.dbus.polkit.enable_proxy @handle_exceptions def setProtocols(self, protocols): self.fw_zone.setProtocols(protocols) @slip.dbus.polkit.enable_proxy @handle_exceptions def addProtocol(self, protocol): self.fw_zone.addProtocol(protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeProtocol(self, protocol): self.fw_zone.removeProtocol(protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryProtocol(self, protocol): return self.fw_zone.queryProtocol(protocol) # source-port @slip.dbus.polkit.enable_proxy @handle_exceptions def getSourcePorts(self): return self.fw_zone.getSourcePorts() @slip.dbus.polkit.enable_proxy @handle_exceptions def setSourcePorts(self, ports): self.fw_zone.setSourcePorts(ports) @slip.dbus.polkit.enable_proxy @handle_exceptions def addSourcePort(self, port, protocol): self.fw_zone.addSourcePort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeSourcePort(self, port, protocol): self.fw_zone.removeSourcePort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def querySourcePort(self, port, protocol): return self.fw_zone.querySourcePort(port, protocol) # icmp block @slip.dbus.polkit.enable_proxy @handle_exceptions def getIcmpBlocks(self): return self.fw_zone.getIcmpBlocks() @slip.dbus.polkit.enable_proxy @handle_exceptions def setIcmpBlocks(self, icmptypes): self.fw_zone.setIcmpBlocks(icmptypes) @slip.dbus.polkit.enable_proxy @handle_exceptions def addIcmpBlock(self, icmptype): self.fw_zone.addIcmpBlock(icmptype) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeIcmpBlock(self, icmptype): self.fw_zone.removeIcmpBlock(icmptype) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryIcmpBlock(self, icmptype): return self.fw_zone.queryIcmpBlock(icmptype) # icmp-block-inversion @slip.dbus.polkit.enable_proxy @handle_exceptions def getIcmpBlockInversion(self): return self.fw_zone.getIcmpBlockInversion() @slip.dbus.polkit.enable_proxy @handle_exceptions def setIcmpBlockInversion(self, inversion): self.fw_zone.setIcmpBlockInversion(inversion) @slip.dbus.polkit.enable_proxy @handle_exceptions def addIcmpBlockInversion(self): self.fw_zone.addIcmpBlockInversion() @slip.dbus.polkit.enable_proxy @handle_exceptions def removeIcmpBlockInversion(self): self.fw_zone.removeIcmpBlockInversion() @slip.dbus.polkit.enable_proxy @handle_exceptions def queryIcmpBlockInversion(self): return self.fw_zone.queryIcmpBlockInversion() # masquerade @slip.dbus.polkit.enable_proxy @handle_exceptions def getMasquerade(self): return self.fw_zone.getMasquerade() @slip.dbus.polkit.enable_proxy @handle_exceptions def setMasquerade(self, masquerade): self.fw_zone.setMasquerade(masquerade) @slip.dbus.polkit.enable_proxy @handle_exceptions def addMasquerade(self): self.fw_zone.addMasquerade() @slip.dbus.polkit.enable_proxy @handle_exceptions def removeMasquerade(self): self.fw_zone.removeMasquerade() @slip.dbus.polkit.enable_proxy @handle_exceptions def queryMasquerade(self): return self.fw_zone.queryMasquerade() # forward port @slip.dbus.polkit.enable_proxy @handle_exceptions def getForwardPorts(self): return self.fw_zone.getForwardPorts() @slip.dbus.polkit.enable_proxy @handle_exceptions def setForwardPorts(self, ports): self.fw_zone.setForwardPorts(ports) @slip.dbus.polkit.enable_proxy @handle_exceptions def addForwardPort(self, port, protocol, toport, toaddr): if toport is None: toport = '' if toaddr is None: toaddr = '' self.fw_zone.addForwardPort(port, protocol, toport, toaddr) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeForwardPort(self, port, protocol, toport, toaddr): if toport is None: toport = '' if toaddr is None: toaddr = '' self.fw_zone.removeForwardPort(port, protocol, toport, toaddr) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryForwardPort(self, port, protocol, toport, toaddr): if toport is None: toport = '' if toaddr is None: toaddr = '' return self.fw_zone.queryForwardPort(port, protocol, toport, toaddr) # interface @slip.dbus.polkit.enable_proxy @handle_exceptions def getInterfaces(self): return self.fw_zone.getInterfaces() @slip.dbus.polkit.enable_proxy @handle_exceptions def setInterfaces(self, interfaces): self.fw_zone.setInterfaces(interfaces) @slip.dbus.polkit.enable_proxy @handle_exceptions def addInterface(self, interface): self.fw_zone.addInterface(interface) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeInterface(self, interface): self.fw_zone.removeInterface(interface) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryInterface(self, interface): return self.fw_zone.queryInterface(interface) # source @slip.dbus.polkit.enable_proxy @handle_exceptions def getSources(self): return self.fw_zone.getSources() @slip.dbus.polkit.enable_proxy @handle_exceptions def setSources(self, sources): self.fw_zone.setSources(sources) @slip.dbus.polkit.enable_proxy @handle_exceptions def addSource(self, source): self.fw_zone.addSource(source) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeSource(self, source): self.fw_zone.removeSource(source) @slip.dbus.polkit.enable_proxy @handle_exceptions def querySource(self, source): return self.fw_zone.querySource(source) # rich rule @slip.dbus.polkit.enable_proxy @handle_exceptions def getRichRules(self): return self.fw_zone.getRichRules() @slip.dbus.polkit.enable_proxy @handle_exceptions def setRichRules(self, rules): self.fw_zone.setRichRules(rules) @slip.dbus.polkit.enable_proxy @handle_exceptions def addRichRule(self, rule): self.fw_zone.addRichRule(rule) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeRichRule(self, rule): self.fw_zone.removeRichRule(rule) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryRichRule(self, rule): return self.fw_zone.queryRichRule(rule) # service config settings class FirewallClientServiceSettings(object): @handle_exceptions def __init__(self, settings=None): if settings: self.settings = settings else: self.settings = ["", "", "", [], [], {}, [], []] @handle_exceptions def __repr__(self): return '%s(%r)' % (self.__class__, self.settings) @handle_exceptions def getVersion(self): return self.settings[0] @handle_exceptions def setVersion(self, version): self.settings[0] = version @handle_exceptions def getShort(self): return self.settings[1] @handle_exceptions def setShort(self, short): self.settings[1] = short @handle_exceptions def getDescription(self): return self.settings[2] @handle_exceptions def setDescription(self, description): self.settings[2] = description @handle_exceptions def getPorts(self): return self.settings[3] @handle_exceptions def setPorts(self, ports): self.settings[3] = ports @handle_exceptions def addPort(self, port, protocol): if (port,protocol) not in self.settings[3]: self.settings[3].append((port,protocol)) else: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def removePort(self, port, protocol): if (port,protocol) in self.settings[3]: self.settings[3].remove((port,protocol)) else: raise FirewallError(errors.NOT_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def queryPort(self, port, protocol): return (port,protocol) in self.settings[3] @handle_exceptions def getProtocols(self): return self.settings[6] @handle_exceptions def setProtocols(self, protocols): self.settings[6] = protocols @handle_exceptions def addProtocol(self, protocol): if protocol not in self.settings[6]: self.settings[6].append(protocol) else: raise FirewallError(errors.ALREADY_ENABLED, protocol) @handle_exceptions def removeProtocol(self, protocol): if protocol in self.settings[6]: self.settings[6].remove(protocol) else: raise FirewallError(errors.NOT_ENABLED, protocol) @handle_exceptions def queryProtocol(self, protocol): return protocol in self.settings[6] @handle_exceptions def getSourcePorts(self): return self.settings[7] @handle_exceptions def setSourcePorts(self, ports): self.settings[7] = ports @handle_exceptions def addSourcePort(self, port, protocol): if (port,protocol) not in self.settings[7]: self.settings[7].append((port,protocol)) else: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def removeSourcePort(self, port, protocol): if (port,protocol) in self.settings[7]: self.settings[7].remove((port,protocol)) else: raise FirewallError(errors.NOT_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def querySourcePort(self, port, protocol): return (port,protocol) in self.settings[7] @handle_exceptions def getModules(self): return self.settings[4] @handle_exceptions def setModules(self, modules): self.settings[4] = modules @handle_exceptions def addModule(self, module): if module not in self.settings[4]: self.settings[4].append(module) else: raise FirewallError(errors.ALREADY_ENABLED, module) @handle_exceptions def removeModule(self, module): if module in self.settings[4]: self.settings[4].remove(module) else: raise FirewallError(errors.NOT_ENABLED, module) @handle_exceptions def queryModule(self, module): return module in self.settings[4] @handle_exceptions def getDestinations(self): return self.settings[5] @handle_exceptions def setDestinations(self, destinations): self.settings[5] = destinations @handle_exceptions def setDestination(self, dest_type, address): if dest_type not in self.settings[5] or \ self.settings[5][dest_type] != address: self.settings[5][dest_type] = address else: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s'" % \ (dest_type, address)) @handle_exceptions def removeDestination(self, dest_type, address=None): if dest_type in self.settings[5]: if address is not None and self.settings[5][dest_type] != address: raise FirewallError(errors.NOT_ENABLED, "'%s:%s'" % \ (dest_type, address)) del self.settings[5][dest_type] else: raise FirewallError(errors.NOT_ENABLED, "'%s'" % dest_type) @handle_exceptions def queryDestination(self, dest_type, address): return (dest_type in self.settings[5] and \ address == self.settings[5][dest_type]) # ipset config settings class FirewallClientIPSetSettings(object): @handle_exceptions def __init__(self, settings=None): if settings: self.settings = settings else: self.settings = ["", "", "", "", {}, []] @handle_exceptions def __repr__(self): return '%s(%r)' % (self.__class__, self.settings) @handle_exceptions def getVersion(self): return self.settings[0] @handle_exceptions def setVersion(self, version): self.settings[0] = version @handle_exceptions def getShort(self): return self.settings[1] @handle_exceptions def setShort(self, short): self.settings[1] = short @handle_exceptions def getDescription(self): return self.settings[2] @handle_exceptions def setDescription(self, description): self.settings[2] = description @handle_exceptions def getType(self): return self.settings[3] @handle_exceptions def setType(self, ipset_type): self.settings[3] = ipset_type @handle_exceptions def getOptions(self): return self.settings[4] @handle_exceptions def setOptions(self, options): self.settings[4] = options @handle_exceptions def addOption(self, key, value): if key not in self.settings[4] or self.settings[4][key] != value: self.settings[4][key] = value else: raise FirewallError(errors.ALREADY_ENABLED, "'%s=%s'" % (key,value) if value else key) @handle_exceptions def removeOption(self, key): if key in self.settings[4]: del self.settings[4][key] else: raise FirewallError(errors.NOT_ENABLED, key) @handle_exceptions def queryOption(self, key, value): return key in self.settings[4] and self.settings[4][key] == value @handle_exceptions def getEntries(self): return self.settings[5] @handle_exceptions def setEntries(self, entries): if "timeout" in self.settings[4] and \ self.settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) self.settings[5] = entries @handle_exceptions def addEntry(self, entry): if "timeout" in self.settings[4] and \ self.settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) if entry not in self.settings[5]: self.settings[5].append(entry) else: raise FirewallError(errors.ALREADY_ENABLED, entry) @handle_exceptions def removeEntry(self, entry): if "timeout" in self.settings[4] and \ self.settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) if entry in self.settings[5]: self.settings[5].remove(entry) else: raise FirewallError(errors.NOT_ENABLED, entry) @handle_exceptions def queryEntry(self, entry): if "timeout" in self.settings[4] and \ self.settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) return entry in self.settings[5] # ipset config class FirewallClientConfigIPSet(object): @handle_exceptions def __init__(self, bus, path): self.bus = bus self.path = path self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, path) self.fw_ipset = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG_IPSET) self.fw_properties = dbus.Interface( self.dbus_obj, dbus_interface='org.freedesktop.DBus.Properties') @slip.dbus.polkit.enable_proxy @handle_exceptions def get_property(self, prop): return dbus_to_python(self.fw_properties.Get( config.dbus.DBUS_INTERFACE_CONFIG_IPSET, prop)) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_properties(self): return dbus_to_python(self.fw_properties.GetAll( config.dbus.DBUS_INTERFACE_CONFIG_IPSET)) @slip.dbus.polkit.enable_proxy @handle_exceptions def set_property(self, prop, value): self.fw_properties.Set(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, prop, value) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSettings(self): return FirewallClientIPSetSettings(list(dbus_to_python(\ self.fw_ipset.getSettings()))) @slip.dbus.polkit.enable_proxy @handle_exceptions def update(self, settings): self.fw_ipset.update(tuple(settings.settings)) @slip.dbus.polkit.enable_proxy @handle_exceptions def loadDefaults(self): self.fw_ipset.loadDefaults() @slip.dbus.polkit.enable_proxy @handle_exceptions def remove(self): self.fw_ipset.remove() @slip.dbus.polkit.enable_proxy @handle_exceptions def rename(self, name): self.fw_ipset.rename(name) # version @slip.dbus.polkit.enable_proxy @handle_exceptions def getVersion(self): return self.fw_ipset.getVersion() @slip.dbus.polkit.enable_proxy @handle_exceptions def setVersion(self, version): self.fw_ipset.setVersion(version) # short @slip.dbus.polkit.enable_proxy @handle_exceptions def getShort(self): return self.fw_ipset.getShort() @slip.dbus.polkit.enable_proxy @handle_exceptions def setShort(self, short): self.fw_ipset.setShort(short) # description @slip.dbus.polkit.enable_proxy @handle_exceptions def getDescription(self): return self.fw_ipset.getDescription() @slip.dbus.polkit.enable_proxy @handle_exceptions def setDescription(self, description): self.fw_ipset.setDescription(description) # entry @slip.dbus.polkit.enable_proxy @handle_exceptions def getEntries(self): return self.fw_ipset.getEntries() @slip.dbus.polkit.enable_proxy @handle_exceptions def setEntries(self, entries): self.fw_ipset.setEntries(entries) @slip.dbus.polkit.enable_proxy @handle_exceptions def addEntry(self, entry): self.fw_ipset.addEntry(entry) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeEntry(self, entry): self.fw_ipset.removeEntry(entry) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryEntry(self, entry): return self.fw_ipset.queryEntry(entry) # helper config settings class FirewallClientHelperSettings(object): @handle_exceptions def __init__(self, settings=None): if settings: self.settings = settings else: self.settings = ["", "", "", "", "", [ ]] @handle_exceptions def __repr__(self): return '%s(%r)' % (self.__class__, self.settings) @handle_exceptions def getVersion(self): return self.settings[0] @handle_exceptions def setVersion(self, version): self.settings[0] = version @handle_exceptions def getShort(self): return self.settings[1] @handle_exceptions def setShort(self, short): self.settings[1] = short @handle_exceptions def getDescription(self): return self.settings[2] @handle_exceptions def setDescription(self, description): self.settings[2] = description @handle_exceptions def getFamily(self): return self.settings[3] @handle_exceptions def setFamily(self, ipv): if ipv is None: self.settings[3] = "" self.settings[3] = ipv @handle_exceptions def getModule(self): return self.settings[4] @handle_exceptions def setModule(self, module): self.settings[4] = module @handle_exceptions def getPorts(self): return self.settings[5] @handle_exceptions def setPorts(self, ports): self.settings[5] = ports @handle_exceptions def addPort(self, port, protocol): if (port,protocol) not in self.settings[5]: self.settings[5].append((port,protocol)) else: raise FirewallError(errors.ALREADY_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def removePort(self, port, protocol): if (port,protocol) in self.settings[5]: self.settings[5].remove((port,protocol)) else: raise FirewallError(errors.NOT_ENABLED, "'%s:%s'" % (port, protocol)) @handle_exceptions def queryPort(self, port, protocol): return (port,protocol) in self.settings[5] # helper config class FirewallClientConfigHelper(object): @handle_exceptions def __init__(self, bus, path): self.bus = bus self.path = path self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, path) self.fw_helper = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG_HELPER) self.fw_properties = dbus.Interface( self.dbus_obj, dbus_interface='org.freedesktop.DBus.Properties') @slip.dbus.polkit.enable_proxy @handle_exceptions def get_property(self, prop): return dbus_to_python(self.fw_properties.Get( config.dbus.DBUS_INTERFACE_CONFIG_HELPER, prop)) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_properties(self): return dbus_to_python(self.fw_properties.GetAll( config.dbus.DBUS_INTERFACE_CONFIG_HELPER)) @slip.dbus.polkit.enable_proxy @handle_exceptions def set_property(self, prop, value): self.fw_properties.Set(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, prop, value) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSettings(self): return FirewallClientHelperSettings(list(dbus_to_python(\ self.fw_helper.getSettings()))) @slip.dbus.polkit.enable_proxy @handle_exceptions def update(self, settings): self.fw_helper.update(tuple(settings.settings)) @slip.dbus.polkit.enable_proxy @handle_exceptions def loadDefaults(self): self.fw_helper.loadDefaults() @slip.dbus.polkit.enable_proxy @handle_exceptions def remove(self): self.fw_helper.remove() @slip.dbus.polkit.enable_proxy @handle_exceptions def rename(self, name): self.fw_helper.rename(name) # version @slip.dbus.polkit.enable_proxy @handle_exceptions def getVersion(self): return self.fw_helper.getVersion() @slip.dbus.polkit.enable_proxy @handle_exceptions def setVersion(self, version): self.fw_helper.setVersion(version) # short @slip.dbus.polkit.enable_proxy @handle_exceptions def getShort(self): return self.fw_helper.getShort() @slip.dbus.polkit.enable_proxy @handle_exceptions def setShort(self, short): self.fw_helper.setShort(short) # description @slip.dbus.polkit.enable_proxy @handle_exceptions def getDescription(self): return self.fw_helper.getDescription() @slip.dbus.polkit.enable_proxy @handle_exceptions def setDescription(self, description): self.fw_helper.setDescription(description) # port @slip.dbus.polkit.enable_proxy @handle_exceptions def getPorts(self): return self.fw_helper.getPorts() @slip.dbus.polkit.enable_proxy @handle_exceptions def setPorts(self, ports): self.fw_helper.setPorts(ports) @slip.dbus.polkit.enable_proxy @handle_exceptions def addPort(self, port, protocol): self.fw_helper.addPort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def removePort(self, port, protocol): self.fw_helper.removePort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryPort(self, port, protocol): return self.fw_helper.queryPort(port, protocol) # family @slip.dbus.polkit.enable_proxy @handle_exceptions def getFamily(self): return self.fw_helper.getFamily() @slip.dbus.polkit.enable_proxy @handle_exceptions def setFamily(self, ipv): if ipv is None: self.fw_helper.setFamily("") self.fw_helper.setFamily(ipv) # module @slip.dbus.polkit.enable_proxy @handle_exceptions def getModule(self): return self.fw_helper.getModule() @slip.dbus.polkit.enable_proxy @handle_exceptions def setModule(self, module): self.fw_helper.setModule(module) # service config class FirewallClientConfigService(object): @handle_exceptions def __init__(self, bus, path): self.bus = bus self.path = path self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, path) self.fw_service = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG_SERVICE) self.fw_properties = dbus.Interface( self.dbus_obj, dbus_interface='org.freedesktop.DBus.Properties') @slip.dbus.polkit.enable_proxy @handle_exceptions def get_property(self, prop): return dbus_to_python(self.fw_properties.Get( config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, prop)) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_properties(self): return dbus_to_python(self.fw_properties.GetAll( config.dbus.DBUS_INTERFACE_CONFIG_SERVICE)) @slip.dbus.polkit.enable_proxy @handle_exceptions def set_property(self, prop, value): self.fw_properties.Set(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, prop, value) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSettings(self): return FirewallClientServiceSettings(list(dbus_to_python(\ self.fw_service.getSettings()))) @slip.dbus.polkit.enable_proxy @handle_exceptions def update(self, settings): self.fw_service.update(tuple(settings.settings)) @slip.dbus.polkit.enable_proxy @handle_exceptions def loadDefaults(self): self.fw_service.loadDefaults() @slip.dbus.polkit.enable_proxy @handle_exceptions def remove(self): self.fw_service.remove() @slip.dbus.polkit.enable_proxy @handle_exceptions def rename(self, name): self.fw_service.rename(name) # version @slip.dbus.polkit.enable_proxy @handle_exceptions def getVersion(self): return self.fw_service.getVersion() @slip.dbus.polkit.enable_proxy @handle_exceptions def setVersion(self, version): self.fw_service.setVersion(version) # short @slip.dbus.polkit.enable_proxy @handle_exceptions def getShort(self): return self.fw_service.getShort() @slip.dbus.polkit.enable_proxy @handle_exceptions def setShort(self, short): self.fw_service.setShort(short) # description @slip.dbus.polkit.enable_proxy @handle_exceptions def getDescription(self): return self.fw_service.getDescription() @slip.dbus.polkit.enable_proxy @handle_exceptions def setDescription(self, description): self.fw_service.setDescription(description) # port @slip.dbus.polkit.enable_proxy @handle_exceptions def getPorts(self): return self.fw_service.getPorts() @slip.dbus.polkit.enable_proxy @handle_exceptions def setPorts(self, ports): self.fw_service.setPorts(ports) @slip.dbus.polkit.enable_proxy @handle_exceptions def addPort(self, port, protocol): self.fw_service.addPort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def removePort(self, port, protocol): self.fw_service.removePort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryPort(self, port, protocol): return self.fw_service.queryPort(port, protocol) # protocol @slip.dbus.polkit.enable_proxy @handle_exceptions def getProtocols(self): return self.fw_service.getProtocols() @slip.dbus.polkit.enable_proxy @handle_exceptions def setProtocols(self, protocols): self.fw_service.setProtocols(protocols) @slip.dbus.polkit.enable_proxy @handle_exceptions def addProtocol(self, protocol): self.fw_service.addProtocol(protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeProtocol(self, protocol): self.fw_service.removeProtocol(protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryProtocol(self, protocol): return self.fw_service.queryProtocol(protocol) # source-port @slip.dbus.polkit.enable_proxy @handle_exceptions def getSourcePorts(self): return self.fw_service.getSourcePorts() @slip.dbus.polkit.enable_proxy @handle_exceptions def setSourcePorts(self, ports): self.fw_service.setSourcePorts(ports) @slip.dbus.polkit.enable_proxy @handle_exceptions def addSourcePort(self, port, protocol): self.fw_service.addSourcePort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeSourcePort(self, port, protocol): self.fw_service.removeSourcePort(port, protocol) @slip.dbus.polkit.enable_proxy @handle_exceptions def querySourcePort(self, port, protocol): return self.fw_service.querySourcePort(port, protocol) # module @slip.dbus.polkit.enable_proxy @handle_exceptions def getModules(self): return self.fw_service.getModules() @slip.dbus.polkit.enable_proxy @handle_exceptions def setModules(self, modules): self.fw_service.setModules(modules) @slip.dbus.polkit.enable_proxy @handle_exceptions def addModule(self, module): self.fw_service.addModule(module) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeModule(self, module): self.fw_service.removeModule(module) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryModule(self, module): return self.fw_service.queryModule(module) # destination @slip.dbus.polkit.enable_proxy @handle_exceptions def getDestinations(self): return self.fw_service.getDestinations() @slip.dbus.polkit.enable_proxy @handle_exceptions def setDestinations(self, destinations): self.fw_service.setDestinations(destinations) @slip.dbus.polkit.enable_proxy @handle_exceptions def getDestination(self, destination): return self.fw_service.getDestination(destination) @slip.dbus.polkit.enable_proxy @handle_exceptions def setDestination(self, destination, address): self.fw_service.setDestination(destination, address) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeDestination(self, destination, address=None): if address is not None and self.getDestination(destination) != address: raise FirewallError(errors.NOT_ENABLED, "'%s:%s'" % \ (destination, address)) self.fw_service.removeDestination(destination) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryDestination(self, destination, address): return self.fw_service.queryDestination(destination, address) # icmptype config settings class FirewallClientIcmpTypeSettings(object): @handle_exceptions def __init__(self, settings=None): if settings: self.settings = settings else: self.settings = ["", "", "", []] @handle_exceptions def __repr__(self): return '%s(%r)' % (self.__class__, self.settings) @handle_exceptions def getVersion(self): return self.settings[0] @handle_exceptions def setVersion(self, version): self.settings[0] = version @handle_exceptions def getShort(self): return self.settings[1] @handle_exceptions def setShort(self, short): self.settings[1] = short @handle_exceptions def getDescription(self): return self.settings[2] @handle_exceptions def setDescription(self, description): self.settings[2] = description @handle_exceptions def getDestinations(self): return self.settings[3] @handle_exceptions def setDestinations(self, destinations): self.settings[3] = destinations @handle_exceptions def addDestination(self, destination): # empty means all if not self.settings[3]: raise FirewallError(errors.ALREADY_ENABLED, destination) elif destination not in self.settings[3]: self.settings[3].append(destination) else: raise FirewallError(errors.ALREADY_ENABLED, destination) @handle_exceptions def removeDestination(self, destination): if destination in self.settings[3]: self.settings[3].remove(destination) # empty means all elif not self.settings[3]: self.setDestinations(list(set(['ipv4','ipv6']) - \ set([destination]))) else: raise FirewallError(errors.NOT_ENABLED, destination) @handle_exceptions def queryDestination(self, destination): # empty means all return not self.settings[3] or \ destination in self.settings[3] # icmptype config class FirewallClientConfigIcmpType(object): @handle_exceptions def __init__(self, bus, path): self.bus = bus self.path = path self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, path) self.fw_icmptype = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE) self.fw_properties = dbus.Interface( self.dbus_obj, dbus_interface='org.freedesktop.DBus.Properties') @slip.dbus.polkit.enable_proxy @handle_exceptions def get_property(self, prop): return dbus_to_python(self.fw_properties.Get( config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, prop)) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_properties(self): return dbus_to_python(self.fw_properties.GetAll( config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE)) @slip.dbus.polkit.enable_proxy @handle_exceptions def set_property(self, prop, value): self.fw_properties.Set(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, prop, value) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSettings(self): return FirewallClientIcmpTypeSettings(list(dbus_to_python(\ self.fw_icmptype.getSettings()))) @slip.dbus.polkit.enable_proxy @handle_exceptions def update(self, settings): self.fw_icmptype.update(tuple(settings.settings)) @slip.dbus.polkit.enable_proxy @handle_exceptions def loadDefaults(self): self.fw_icmptype.loadDefaults() @slip.dbus.polkit.enable_proxy @handle_exceptions def remove(self): self.fw_icmptype.remove() @slip.dbus.polkit.enable_proxy @handle_exceptions def rename(self, name): self.fw_icmptype.rename(name) # version @slip.dbus.polkit.enable_proxy @handle_exceptions def getVersion(self): return self.fw_icmptype.getVersion() @slip.dbus.polkit.enable_proxy @handle_exceptions def setVersion(self, version): self.fw_icmptype.setVersion(version) # short @slip.dbus.polkit.enable_proxy @handle_exceptions def getShort(self): return self.fw_icmptype.getShort() @slip.dbus.polkit.enable_proxy @handle_exceptions def setShort(self, short): self.fw_icmptype.setShort(short) # description @slip.dbus.polkit.enable_proxy @handle_exceptions def getDescription(self): return self.fw_icmptype.getDescription() @slip.dbus.polkit.enable_proxy @handle_exceptions def setDescription(self, description): self.fw_icmptype.setDescription(description) # destination @slip.dbus.polkit.enable_proxy @handle_exceptions def getDestinations(self): return self.fw_icmptype.getDestinations() @slip.dbus.polkit.enable_proxy @handle_exceptions def setDestinations(self, destinations): self.fw_icmptype.setDestinations(destinations) @slip.dbus.polkit.enable_proxy @handle_exceptions def addDestination(self, destination): self.fw_icmptype.addDestination(destination) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeDestination(self, destination): self.fw_icmptype.removeDestination(destination) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryDestination(self, destination): return self.fw_icmptype.queryDestination(destination) # config.policies lockdown whitelist class FirewallClientPoliciesLockdownWhitelist(object): @handle_exceptions def __init__(self, settings=None): if settings: self.settings = settings else: self.settings = [ [], [], [], [] ] @handle_exceptions def __repr__(self): return '%s(%r)' % (self.__class__, self.settings) @handle_exceptions def getCommands(self): return self.settings[0] @handle_exceptions def setCommands(self, commands): self.settings[0] = commands @handle_exceptions def addCommand(self, command): if command not in self.settings[0]: self.settings[0].append(command) @handle_exceptions def removeCommand(self, command): if command in self.settings[0]: self.settings[0].remove(command) @handle_exceptions def queryCommand(self, command): return command in self.settings[0] @handle_exceptions def getContexts(self): return self.settings[1] @handle_exceptions def setContexts(self, contexts): self.settings[1] = contexts @handle_exceptions def addContext(self, context): if context not in self.settings[1]: self.settings[1].append(context) @handle_exceptions def removeContext(self, context): if context in self.settings[1]: self.settings[1].remove(context) @handle_exceptions def queryContext(self, context): return context in self.settings[1] @handle_exceptions def getUsers(self): return self.settings[2] @handle_exceptions def setUsers(self, users): self.settings[2] = users @handle_exceptions def addUser(self, user): if user not in self.settings[2]: self.settings[2].append(user) @handle_exceptions def removeUser(self, user): if user in self.settings[2]: self.settings[2].remove(user) @handle_exceptions def queryUser(self, user): return user in self.settings[2] @handle_exceptions def getUids(self): return self.settings[3] @handle_exceptions def setUids(self, uids): self.settings[3] = uids @handle_exceptions def addUid(self, uid): if uid not in self.settings[3]: self.settings[3].append(uid) @handle_exceptions def removeUid(self, uid): if uid in self.settings[3]: self.settings[3].remove(uid) @handle_exceptions def queryUid(self, uid): return uid in self.settings[3] # config.policies class FirewallClientConfigPolicies(object): @handle_exceptions def __init__(self, bus): self.bus = bus self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, config.dbus.DBUS_PATH_CONFIG) self.fw_policies = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG_POLICIES) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelist(self): return FirewallClientPoliciesLockdownWhitelist( \ list(dbus_to_python(self.fw_policies.getLockdownWhitelist()))) @slip.dbus.polkit.enable_proxy @handle_exceptions def setLockdownWhitelist(self, settings): self.fw_policies.setLockdownWhitelist(tuple(settings.settings)) # command @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistCommand(self, command): self.fw_policies.addLockdownWhitelistCommand(command) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistCommand(self, command): self.fw_policies.removeLockdownWhitelistCommand(command) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistCommand(self, command): return dbus_to_python(self.fw_policies.queryLockdownWhitelistCommand(command)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistCommands(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistCommands()) # context @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistContext(self, context): self.fw_policies.addLockdownWhitelistContext(context) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistContext(self, context): self.fw_policies.removeLockdownWhitelistContext(context) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistContext(self, context): return dbus_to_python(self.fw_policies.queryLockdownWhitelistContext(context)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistContexts(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistContexts()) # user @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistUser(self, user): self.fw_policies.addLockdownWhitelistUser(user) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistUser(self, user): self.fw_policies.removeLockdownWhitelistUser(user) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistUser(self, user): return dbus_to_python(self.fw_policies.queryLockdownWhitelistUser(user)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistUsers(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistUsers()) # uid @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistUids(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistUids()) @slip.dbus.polkit.enable_proxy @handle_exceptions def setLockdownWhitelistUids(self, uids): self.fw_policies.setLockdownWhitelistUids(uids) @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistUid(self, uid): self.fw_policies.addLockdownWhitelistUid(uid) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistUid(self, uid): self.fw_policies.removeLockdownWhitelistUid(uid) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistUid(self, uid): return dbus_to_python(self.fw_policies.queryLockdownWhitelistUid(uid)) # config.direct class FirewallClientDirect(object): @handle_exceptions def __init__(self, settings=None): if settings: self.settings = settings else: self.settings = [ [], [], [], ] @handle_exceptions def __repr__(self): return '%s(%r)' % (self.__class__, self.settings) @handle_exceptions def getAllChains(self): return self.settings[0] @handle_exceptions def getChains(self, ipv, table): return [ entry[2] for entry in self.settings[0] \ if entry[0] == ipv and entry[1] == table ] @handle_exceptions def setAllChains(self, chains): self.settings[0] = chains @handle_exceptions def addChain(self, ipv, table, chain): idx = (ipv, table, chain) if idx not in self.settings[0]: self.settings[0].append(idx) @handle_exceptions def removeChain(self, ipv, table, chain): idx = (ipv, table, chain) if idx in self.settings[0]: self.settings[0].remove(idx) @handle_exceptions def queryChain(self, ipv, table, chain): idx = (ipv, table, chain) return idx in self.settings[0] @handle_exceptions def getAllRules(self): return self.settings[1] @handle_exceptions def getRules(self, ipv, table, chain): return [ entry[3:] for entry in self.settings[1] \ if entry[0] == ipv and entry[1] == table \ and entry[2] == chain ] @handle_exceptions def setAllRules(self, rules): self.settings[1] = rules @handle_exceptions def addRule(self, ipv, table, chain, priority, args): idx = (ipv, table, chain, priority, args) if idx not in self.settings[1]: self.settings[1].append(idx) @handle_exceptions def removeRule(self, ipv, table, chain, priority, args): idx = (ipv, table, chain, priority, args) if idx in self.settings[1]: self.settings[1].remove(idx) @handle_exceptions def removeRules(self, ipv, table, chain): for idx in list(self.settings[1]): if idx[0] == ipv and idx[1] == table and idx[2] == chain: self.settings[1].remove(idx) @handle_exceptions def queryRule(self, ipv, table, chain, priority, args): idx = (ipv, table, chain, priority, args) return idx in self.settings[1] @handle_exceptions def getAllPassthroughs(self): return self.settings[2] @handle_exceptions def setAllPassthroughs(self, passthroughs): self.settings[2] = passthroughs @handle_exceptions def removeAllPassthroughs(self): self.settings[2] = [] @handle_exceptions def getPassthroughs(self, ipv): return [ entry[1] for entry in self.settings[2] \ if entry[0] == ipv ] @handle_exceptions def addPassthrough(self, ipv, args): idx = (ipv, args) if idx not in self.settings[2]: self.settings[2].append(idx) @handle_exceptions def removePassthrough(self, ipv, args): idx = (ipv, args) if idx in self.settings[2]: self.settings[2].remove(idx) @handle_exceptions def queryPassthrough(self, ipv, args): idx = (ipv, args) return idx in self.settings[2] # config.direct class FirewallClientConfigDirect(object): @handle_exceptions def __init__(self, bus): self.bus = bus self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, config.dbus.DBUS_PATH_CONFIG) self.fw_direct = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG_DIRECT) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSettings(self): return FirewallClientDirect( \ list(dbus_to_python(self.fw_direct.getSettings()))) @slip.dbus.polkit.enable_proxy @handle_exceptions def update(self, settings): self.fw_direct.update(tuple(settings.settings)) # direct chain @slip.dbus.polkit.enable_proxy @handle_exceptions def addChain(self, ipv, table, chain): self.fw_direct.addChain(ipv, table, chain) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeChain(self, ipv, table, chain): self.fw_direct.removeChain(ipv, table, chain) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryChain(self, ipv, table, chain): return dbus_to_python(self.fw_direct.queryChain(ipv, table, chain)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getChains(self, ipv, table): return dbus_to_python(self.fw_direct.getChains(ipv, table)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getAllChains(self): return dbus_to_python(self.fw_direct.getAllChains()) # direct rule @slip.dbus.polkit.enable_proxy @handle_exceptions def addRule(self, ipv, table, chain, priority, args): self.fw_direct.addRule(ipv, table, chain, priority, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeRule(self, ipv, table, chain, priority, args): self.fw_direct.removeRule(ipv, table, chain, priority, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeRules(self, ipv, table, chain): self.fw_direct.removeRules(ipv, table, chain) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryRule(self, ipv, table, chain, priority, args): return dbus_to_python(self.fw_direct.queryRule(ipv, table, chain, priority, args)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getRules(self, ipv, table, chain): return dbus_to_python(self.fw_direct.getRules(ipv, table, chain)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getAllRules(self): return dbus_to_python(self.fw_direct.getAllRules()) # tracked passthrough @slip.dbus.polkit.enable_proxy @handle_exceptions def addPassthrough(self, ipv, args): self.fw_direct.addPassthrough(ipv, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def removePassthrough(self, ipv, args): self.fw_direct.removePassthrough(ipv, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryPassthrough(self, ipv, args): return dbus_to_python(self.fw_direct.queryPassthrough(ipv, args)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getPassthroughs(self, ipv): return dbus_to_python(self.fw_direct.getPassthroughs(ipv)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getAllPassthroughs(self): return dbus_to_python(self.fw_direct.getAllPassthroughs()) # config class FirewallClientConfig(object): @handle_exceptions def __init__(self, bus): self.bus = bus self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, config.dbus.DBUS_PATH_CONFIG) self.fw_config = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_CONFIG) self.fw_properties = dbus.Interface( self.dbus_obj, dbus_interface='org.freedesktop.DBus.Properties') self._policies = FirewallClientConfigPolicies(self.bus) self._direct = FirewallClientConfigDirect(self.bus) # properties @slip.dbus.polkit.enable_proxy @handle_exceptions def get_property(self, prop): return dbus_to_python(self.fw_properties.Get( config.dbus.DBUS_INTERFACE_CONFIG, prop)) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_properties(self): return dbus_to_python(self.fw_properties.GetAll( config.dbus.DBUS_INTERFACE_CONFIG)) @slip.dbus.polkit.enable_proxy @handle_exceptions def set_property(self, prop, value): self.fw_properties.Set(config.dbus.DBUS_INTERFACE_CONFIG, prop, value) # ipset @slip.dbus.polkit.enable_proxy @handle_exceptions def getIPSetNames(self): return dbus_to_python(self.fw_config.getIPSetNames()) @slip.dbus.polkit.enable_proxy @handle_exceptions def listIPSets(self): return dbus_to_python(self.fw_config.listIPSets()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIPSet(self, path): return FirewallClientConfigIPSet(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIPSetByName(self, name): path = dbus_to_python(self.fw_config.getIPSetByName(name)) return FirewallClientConfigIPSet(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def addIPSet(self, name, settings): if isinstance(settings, FirewallClientIPSetSettings): path = self.fw_config.addIPSet(name, tuple(settings.settings)) else: path = self.fw_config.addIPSet(name, tuple(settings)) return FirewallClientConfigIPSet(self.bus, path) # zone @slip.dbus.polkit.enable_proxy @handle_exceptions def getZoneNames(self): return dbus_to_python(self.fw_config.getZoneNames()) @slip.dbus.polkit.enable_proxy @handle_exceptions def listZones(self): return dbus_to_python(self.fw_config.listZones()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getZone(self, path): return FirewallClientConfigZone(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def getZoneByName(self, name): path = dbus_to_python(self.fw_config.getZoneByName(name)) return FirewallClientConfigZone(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def getZoneOfInterface(self, iface): return dbus_to_python(self.fw_config.getZoneOfInterface(iface)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getZoneOfSource(self, source): return dbus_to_python(self.fw_config.getZoneOfSource(source)) @slip.dbus.polkit.enable_proxy @handle_exceptions def addZone(self, name, settings): if isinstance(settings, FirewallClientZoneSettings): path = self.fw_config.addZone(name, tuple(settings.settings)) else: path = self.fw_config.addZone(name, tuple(settings)) return FirewallClientConfigZone(self.bus, path) # service @slip.dbus.polkit.enable_proxy @handle_exceptions def getServiceNames(self): return dbus_to_python(self.fw_config.getServiceNames()) @slip.dbus.polkit.enable_proxy @handle_exceptions def listServices(self): return dbus_to_python(self.fw_config.listServices()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getService(self, path): return FirewallClientConfigService(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def getServiceByName(self, name): path = dbus_to_python(self.fw_config.getServiceByName(name)) return FirewallClientConfigService(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def addService(self, name, settings): if isinstance(settings, FirewallClientServiceSettings): path = self.fw_config.addService(name, tuple(settings.settings)) else: path = self.fw_config.addService(name, tuple(settings)) return FirewallClientConfigService(self.bus, path) # icmptype @slip.dbus.polkit.enable_proxy @handle_exceptions def getIcmpTypeNames(self): return dbus_to_python(self.fw_config.getIcmpTypeNames()) @slip.dbus.polkit.enable_proxy @handle_exceptions def listIcmpTypes(self): return dbus_to_python(self.fw_config.listIcmpTypes()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIcmpType(self, path): return FirewallClientConfigIcmpType(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIcmpTypeByName(self, name): path = dbus_to_python(self.fw_config.getIcmpTypeByName(name)) return FirewallClientConfigIcmpType(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def addIcmpType(self, name, settings): if isinstance(settings, FirewallClientIcmpTypeSettings): path = self.fw_config.addIcmpType(name, tuple(settings.settings)) else: path = self.fw_config.addIcmpType(name, tuple(settings)) return FirewallClientConfigIcmpType(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def policies(self): return self._policies @slip.dbus.polkit.enable_proxy @handle_exceptions def direct(self): return self._direct # helper @slip.dbus.polkit.enable_proxy @handle_exceptions def getHelperNames(self): return dbus_to_python(self.fw_config.getHelperNames()) @slip.dbus.polkit.enable_proxy @handle_exceptions def listHelpers(self): return dbus_to_python(self.fw_config.listHelpers()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getHelper(self, path): return FirewallClientConfigHelper(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def getHelperByName(self, name): path = dbus_to_python(self.fw_config.getHelperByName(name)) return FirewallClientConfigHelper(self.bus, path) @slip.dbus.polkit.enable_proxy @handle_exceptions def addHelper(self, name, settings): if isinstance(settings, FirewallClientHelperSettings): path = self.fw_config.addHelper(name, tuple(settings.settings)) else: path = self.fw_config.addHelper(name, tuple(settings)) return FirewallClientConfigHelper(self.bus, path) # class FirewallClient(object): @handle_exceptions def __init__(self, bus=None, wait=0, quiet=True): if not bus: dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) try: self.bus = slip.dbus.SystemBus() self.bus.default_timeout = None except Exception: try: self.bus = dbus.SystemBus() except dbus.exceptions.DBusException as e: raise FirewallError(errors.DBUS_ERROR, e.get_dbus_message()) else: print("Not using slip.dbus") else: self.bus = bus self.bus.add_signal_receiver( handler_function=self._dbus_connection_changed, signal_name="NameOwnerChanged", dbus_interface="org.freedesktop.DBus", arg0=config.dbus.DBUS_INTERFACE) for interface in [ config.dbus.DBUS_INTERFACE, config.dbus.DBUS_INTERFACE_IPSET, config.dbus.DBUS_INTERFACE_ZONE, config.dbus.DBUS_INTERFACE_DIRECT, config.dbus.DBUS_INTERFACE_POLICIES, config.dbus.DBUS_INTERFACE_CONFIG, config.dbus.DBUS_INTERFACE_CONFIG_IPSET, config.dbus.DBUS_INTERFACE_CONFIG_ZONE, config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, config.dbus.DBUS_INTERFACE_CONFIG_HELPER, config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, config.dbus.DBUS_INTERFACE_CONFIG_POLICIES ]: self.bus.add_signal_receiver(self._signal_receiver, dbus_interface=interface, interface_keyword='interface', member_keyword='member', path_keyword='path') # callbacks self._callback = { } self._callbacks = { # client callbacks "connection-changed": "connection-changed", "connection-established": "connection-established", "connection-lost": "connection-lost", # firewalld callbacks "log-denied-changed": "LogDeniedChanged", "default-zone-changed": "DefaultZoneChanged", "panic-mode-enabled": "PanicModeEnabled", "panic-mode-disabled": "PanicModeDisabled", "reloaded": "Reloaded", "service-added": "ServiceAdded", "service-removed": "ServiceRemoved", "port-added": "PortAdded", "port-removed": "PortRemoved", "source-port-added": "SourcePortAdded", "source-port-removed": "SourcePortRemoved", "protocol-added": "ProtocolAdded", "protocol-removed": "ProtocolRemoved", "masquerade-added": "MasqueradeAdded", "masquerade-removed": "MasqueradeRemoved", "forward-port-added": "ForwardPortAdded", "forward-port-removed": "ForwardPortRemoved", "icmp-block-added": "IcmpBlockAdded", "icmp-block-removed": "IcmpBlockRemoved", "icmp-block-inversion-added": "IcmpBlockInversionAdded", "icmp-block-inversion-removed": "IcmpBlockInversionRemoved", "richrule-added": "RichRuleAdded", "richrule-removed": "RichRuleRemoved", "interface-added": "InterfaceAdded", "interface-removed": "InterfaceRemoved", "zone-changed": "ZoneOfInterfaceChanged", # DEPRECATED, use zone-of-interface-changed instead "zone-of-interface-changed": "ZoneOfInterfaceChanged", "source-added": "SourceAdded", "source-removed": "SourceRemoved", "zone-of-source-changed": "ZoneOfSourceChanged", # ipset callbacks "ipset-entry-added": "EntryAdded", "ipset-entry-removed": "EntryRemoved", # direct callbacks "direct:chain-added": "ChainAdded", "direct:chain-removed": "ChainRemoved", "direct:rule-added": "RuleAdded", "direct:rule-removed": "RuleRemoved", "direct:passthrough-added": "PassthroughAdded", "direct:passthrough-removed": "PassthroughRemoved", "config:direct:updated": "config:direct:Updated", # policy callbacks "lockdown-enabled": "LockdownEnabled", "lockdown-disabled": "LockdownDisabled", "lockdown-whitelist-command-added": "LockdownWhitelistCommandAdded", "lockdown-whitelist-command-removed": "LockdownWhitelistCommandRemoved", "lockdown-whitelist-context-added": "LockdownWhitelistContextAdded", "lockdown-whitelist-context-removed": "LockdownWhitelistContextRemoved", "lockdown-whitelist-uid-added": "LockdownWhitelistUidAdded", "lockdown-whitelist-uid-removed": "LockdownWhitelistUidRemoved", "lockdown-whitelist-user-added": "LockdownWhitelistUserAdded", "lockdown-whitelist-user-removed": "LockdownWhitelistUserRemoved", # firewalld.config callbacks "config:policies:lockdown-whitelist-updated": "config:policies:LockdownWhitelistUpdated", "config:ipset-added": "config:IPSetAdded", "config:ipset-updated": "config:IPSetUpdated", "config:ipset-removed": "config:IPSetRemoved", "config:ipset-renamed": "config:IPSetRenamed", "config:zone-added": "config:ZoneAdded", "config:zone-updated": "config:ZoneUpdated", "config:zone-removed": "config:ZoneRemoved", "config:zone-renamed": "config:ZoneRenamed", "config:service-added": "config:ServiceAdded", "config:service-updated": "config:ServiceUpdated", "config:service-removed": "config:ServiceRemoved", "config:service-renamed": "config:ServiceRenamed", "config:icmptype-added": "config:IcmpTypeAdded", "config:icmptype-updated": "config:IcmpTypeUpdated", "config:icmptype-removed": "config:IcmpTypeRemoved", "config:icmptype-renamed": "config:IcmpTypeRenamed", "config:helper-added": "config:HelperAdded", "config:helper-updated": "config:HelperUpdated", "config:helper-removed": "config:HelperRemoved", "config:helper-renamed": "config:HelperRenamed", } # initialize variables used for connection self._init_vars() self.quiet = quiet if wait > 0: # connect in one second GLib.timeout_add_seconds(wait, self._connection_established) else: self._connection_established() @handle_exceptions def _init_vars(self): self.fw = None self.fw_ipset = None self.fw_zone = None self.fw_helper = None self.fw_direct = None self.fw_properties = None self._config = None self.connected = False @handle_exceptions def getExceptionHandler(self): return exception_handler @handle_exceptions def setExceptionHandler(self, handler): global exception_handler exception_handler = handler @handle_exceptions def getNotAuthorizedLoop(self): return not_authorized_loop @handle_exceptions def setNotAuthorizedLoop(self, enable): global not_authorized_loop not_authorized_loop = enable @handle_exceptions def connect(self, name, callback, *args): if name in self._callbacks: self._callback[self._callbacks[name]] = (callback, args) else: raise ValueError("Unknown callback name '%s'" % name) @handle_exceptions def _dbus_connection_changed(self, name, old_owner, new_owner): if name != config.dbus.DBUS_INTERFACE: return if new_owner: # connection established self._connection_established() else: # connection lost self._connection_lost() @handle_exceptions def _connection_established(self): try: self.dbus_obj = self.bus.get_object(config.dbus.DBUS_INTERFACE, config.dbus.DBUS_PATH) self.fw = dbus.Interface(self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE) self.fw_ipset = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_IPSET) self.fw_zone = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_ZONE) self.fw_direct = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_DIRECT) self.fw_policies = dbus.Interface( self.dbus_obj, dbus_interface=config.dbus.DBUS_INTERFACE_POLICIES) self.fw_properties = dbus.Interface( self.dbus_obj, dbus_interface='org.freedesktop.DBus.Properties') except dbus.exceptions.DBusException as e: # ignore dbus errors if not self.quiet: print ("DBusException", e.get_dbus_message()) return except Exception as e: if not self.quiet: print ("Exception", e) return self._config = FirewallClientConfig(self.bus) self.connected = True self._signal_receiver(member="connection-established", interface=config.dbus.DBUS_INTERFACE) self._signal_receiver(member="connection-changed", interface=config.dbus.DBUS_INTERFACE) @handle_exceptions def _connection_lost(self): self._init_vars() self._signal_receiver(member="connection-lost", interface=config.dbus.DBUS_INTERFACE) self._signal_receiver(member="connection-changed", interface=config.dbus.DBUS_INTERFACE) @handle_exceptions def _signal_receiver(self, *args, **kwargs): if "member" not in kwargs or "interface" not in kwargs: return signal = kwargs["member"] interface = kwargs["interface"] # config signals need special treatment # pimp signal name if interface.startswith(config.dbus.DBUS_INTERFACE_CONFIG_ZONE): signal = "config:Zone" + signal elif interface.startswith(config.dbus.DBUS_INTERFACE_CONFIG_IPSET): signal = "config:IPSet" + signal elif interface.startswith(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE): signal = "config:Service" + signal elif interface.startswith(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE): signal = "config:IcmpType" + signal elif interface.startswith(config.dbus.DBUS_INTERFACE_CONFIG_HELPER): signal = "config:Helper" + signal elif interface == config.dbus.DBUS_INTERFACE_CONFIG: signal = "config:" + signal elif interface == config.dbus.DBUS_INTERFACE_CONFIG_POLICIES: signal = "config:policies:" + signal elif interface == config.dbus.DBUS_INTERFACE_CONFIG_DIRECT: signal = "config:direct:" + signal cb = None for callback in self._callbacks: if self._callbacks[callback] == signal and \ self._callbacks[callback] in self._callback: cb = self._callback[self._callbacks[callback]] if cb is None: return # call back with args converted to python types ... cb_args = [ dbus_to_python(arg) for arg in args ] try: if cb[1]: # add call data cb_args.extend(cb[1]) # call back cb[0](*cb_args) except Exception as msg: print(msg) @slip.dbus.polkit.enable_proxy @handle_exceptions def config(self): return self._config @slip.dbus.polkit.enable_proxy @handle_exceptions def reload(self): self.fw.reload() @slip.dbus.polkit.enable_proxy @handle_exceptions def complete_reload(self): self.fw.completeReload() @slip.dbus.polkit.enable_proxy @handle_exceptions def runtimeToPermanent(self): self.fw.runtimeToPermanent() @slip.dbus.polkit.enable_proxy @handle_exceptions def checkPermanentConfig(self): self.fw.checkPermanentConfig() @slip.dbus.polkit.enable_proxy @handle_exceptions def get_property(self, prop): return dbus_to_python(self.fw_properties.Get( config.dbus.DBUS_INTERFACE, prop)) @slip.dbus.polkit.enable_proxy @handle_exceptions def get_properties(self): return dbus_to_python(self.fw_properties.GetAll( config.dbus.DBUS_INTERFACE)) @slip.dbus.polkit.enable_proxy @handle_exceptions def set_property(self, prop, value): self.fw_properties.Set(config.dbus.DBUS_INTERFACE, prop, value) # panic mode @slip.dbus.polkit.enable_proxy @handle_exceptions def enablePanicMode(self): self.fw.enablePanicMode() @slip.dbus.polkit.enable_proxy @handle_exceptions def disablePanicMode(self): self.fw.disablePanicMode() @slip.dbus.polkit.enable_proxy @handle_exceptions def queryPanicMode(self): return dbus_to_python(self.fw.queryPanicMode()) # list functions @slip.dbus.polkit.enable_proxy @handle_exceptions def getZoneSettings(self, zone): return FirewallClientZoneSettings(list(dbus_to_python(\ self.fw.getZoneSettings(zone)))) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIPSets(self): return dbus_to_python(self.fw_ipset.getIPSets()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIPSetSettings(self, ipset): return FirewallClientIPSetSettings(list(dbus_to_python(\ self.fw_ipset.getIPSetSettings(ipset)))) @slip.dbus.polkit.enable_proxy @handle_exceptions def addEntry(self, ipset, entry): self.fw_ipset.addEntry(ipset, entry) @slip.dbus.polkit.enable_proxy @handle_exceptions def getEntries(self, ipset): return self.fw_ipset.getEntries(ipset) @slip.dbus.polkit.enable_proxy @handle_exceptions def setEntries(self, ipset, entries): return self.fw_ipset.setEntries(ipset, entries) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeEntry(self, ipset, entry): self.fw_ipset.removeEntry(ipset, entry) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryEntry(self, ipset, entry): return dbus_to_python(self.fw_ipset.queryEntry(ipset, entry)) @slip.dbus.polkit.enable_proxy @handle_exceptions def listServices(self): return dbus_to_python(self.fw.listServices()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getServiceSettings(self, service): return FirewallClientServiceSettings(list(dbus_to_python(\ self.fw.getServiceSettings(service)))) @slip.dbus.polkit.enable_proxy @handle_exceptions def listIcmpTypes(self): return dbus_to_python(self.fw.listIcmpTypes()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIcmpTypeSettings(self, icmptype): return FirewallClientIcmpTypeSettings(list(dbus_to_python(\ self.fw.getIcmpTypeSettings(icmptype)))) @slip.dbus.polkit.enable_proxy @handle_exceptions def getHelpers(self): return dbus_to_python(self.fw.getHelpers()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getHelperSettings(self, helper): return FirewallClientHelperSettings(list(dbus_to_python(\ self.fw.getHelperSettings(helper)))) # automatic helper setting @slip.dbus.polkit.enable_proxy @handle_exceptions def getAutomaticHelpers(self): return dbus_to_python(self.fw.getAutomaticHelpers()) @slip.dbus.polkit.enable_proxy @handle_exceptions def setAutomaticHelpers(self, value): self.fw.setAutomaticHelpers(value) # log denied @slip.dbus.polkit.enable_proxy @handle_exceptions def getLogDenied(self): return dbus_to_python(self.fw.getLogDenied()) @slip.dbus.polkit.enable_proxy @handle_exceptions def setLogDenied(self, value): self.fw.setLogDenied(value) # default zone @slip.dbus.polkit.enable_proxy @handle_exceptions def getDefaultZone(self): return dbus_to_python(self.fw.getDefaultZone()) @slip.dbus.polkit.enable_proxy @handle_exceptions def setDefaultZone(self, zone): self.fw.setDefaultZone(zone) # zone @slip.dbus.polkit.enable_proxy @handle_exceptions def getZones(self): return dbus_to_python(self.fw_zone.getZones()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getActiveZones(self): return dbus_to_python(self.fw_zone.getActiveZones()) @slip.dbus.polkit.enable_proxy @handle_exceptions def getZoneOfInterface(self, interface): return dbus_to_python(self.fw_zone.getZoneOfInterface(interface)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getZoneOfSource(self, source): return dbus_to_python(self.fw_zone.getZoneOfSource(source)) @slip.dbus.polkit.enable_proxy @handle_exceptions def isImmutable(self, zone): return dbus_to_python(self.fw_zone.isImmutable(zone)) # interfaces @slip.dbus.polkit.enable_proxy @handle_exceptions def addInterface(self, zone, interface): return dbus_to_python(self.fw_zone.addInterface(zone, interface)) @slip.dbus.polkit.enable_proxy @handle_exceptions def changeZone(self, zone, interface): # DEPRECATED return dbus_to_python(self.fw_zone.changeZone(zone, interface)) @slip.dbus.polkit.enable_proxy @handle_exceptions def changeZoneOfInterface(self, zone, interface): return dbus_to_python(self.fw_zone.changeZoneOfInterface(zone, interface)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getInterfaces(self, zone): return dbus_to_python(self.fw_zone.getInterfaces(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryInterface(self, zone, interface): return dbus_to_python(self.fw_zone.queryInterface(zone, interface)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeInterface(self, zone, interface): return dbus_to_python(self.fw_zone.removeInterface(zone, interface)) # sources @slip.dbus.polkit.enable_proxy @handle_exceptions def addSource(self, zone, source): return dbus_to_python(self.fw_zone.addSource(zone, source)) @slip.dbus.polkit.enable_proxy @handle_exceptions def changeZoneOfSource(self, zone, source): return dbus_to_python(self.fw_zone.changeZoneOfSource(zone, source)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSources(self, zone): return dbus_to_python(self.fw_zone.getSources(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def querySource(self, zone, source): return dbus_to_python(self.fw_zone.querySource(zone, source)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeSource(self, zone, source): return dbus_to_python(self.fw_zone.removeSource(zone, source)) # rich rules @slip.dbus.polkit.enable_proxy @handle_exceptions def addRichRule(self, zone, rule, timeout=0): return dbus_to_python(self.fw_zone.addRichRule(zone, rule, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getRichRules(self, zone): return dbus_to_python(self.fw_zone.getRichRules(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryRichRule(self, zone, rule): return dbus_to_python(self.fw_zone.queryRichRule(zone, rule)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeRichRule(self, zone, rule): return dbus_to_python(self.fw_zone.removeRichRule(zone, rule)) # services @slip.dbus.polkit.enable_proxy @handle_exceptions def addService(self, zone, service, timeout=0): return dbus_to_python(self.fw_zone.addService(zone, service, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getServices(self, zone): return dbus_to_python(self.fw_zone.getServices(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryService(self, zone, service): return dbus_to_python(self.fw_zone.queryService(zone, service)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeService(self, zone, service): return dbus_to_python(self.fw_zone.removeService(zone, service)) # ports @slip.dbus.polkit.enable_proxy @handle_exceptions def addPort(self, zone, port, protocol, timeout=0): return dbus_to_python(self.fw_zone.addPort(zone, port, protocol, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getPorts(self, zone): return dbus_to_python(self.fw_zone.getPorts(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryPort(self, zone, port, protocol): return dbus_to_python(self.fw_zone.queryPort(zone, port, protocol)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removePort(self, zone, port, protocol): return dbus_to_python(self.fw_zone.removePort(zone, port, protocol)) # protocols @slip.dbus.polkit.enable_proxy @handle_exceptions def addProtocol(self, zone, protocol, timeout=0): return dbus_to_python(self.fw_zone.addProtocol(zone, protocol, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getProtocols(self, zone): return dbus_to_python(self.fw_zone.getProtocols(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryProtocol(self, zone, protocol): return dbus_to_python(self.fw_zone.queryProtocol(zone, protocol)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeProtocol(self, zone, protocol): return dbus_to_python(self.fw_zone.removeProtocol(zone, protocol)) # masquerade @slip.dbus.polkit.enable_proxy @handle_exceptions def addMasquerade(self, zone, timeout=0): return dbus_to_python(self.fw_zone.addMasquerade(zone, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryMasquerade(self, zone): return dbus_to_python(self.fw_zone.queryMasquerade(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeMasquerade(self, zone): return dbus_to_python(self.fw_zone.removeMasquerade(zone)) # forward ports @slip.dbus.polkit.enable_proxy @handle_exceptions def addForwardPort(self, zone, port, protocol, toport, toaddr, timeout=0): if toport is None: toport = "" if toaddr is None: toaddr = "" return dbus_to_python(self.fw_zone.addForwardPort(zone, port, protocol, toport, toaddr, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getForwardPorts(self, zone): return dbus_to_python(self.fw_zone.getForwardPorts(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryForwardPort(self, zone, port, protocol, toport, toaddr): if toport is None: toport = "" if toaddr is None: toaddr = "" return dbus_to_python(self.fw_zone.queryForwardPort(zone, port, protocol, toport, toaddr)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeForwardPort(self, zone, port, protocol, toport, toaddr): if toport is None: toport = "" if toaddr is None: toaddr = "" return dbus_to_python(self.fw_zone.removeForwardPort(zone, port, protocol, toport, toaddr)) # source ports @slip.dbus.polkit.enable_proxy @handle_exceptions def addSourcePort(self, zone, port, protocol, timeout=0): return dbus_to_python(self.fw_zone.addSourcePort(zone, port, protocol, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getSourcePorts(self, zone): return dbus_to_python(self.fw_zone.getSourcePorts(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def querySourcePort(self, zone, port, protocol): return dbus_to_python(self.fw_zone.querySourcePort(zone, port, protocol)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeSourcePort(self, zone, port, protocol): return dbus_to_python(self.fw_zone.removeSourcePort(zone, port, protocol)) # icmpblock @slip.dbus.polkit.enable_proxy @handle_exceptions def addIcmpBlock(self, zone, icmp, timeout=0): return dbus_to_python(self.fw_zone.addIcmpBlock(zone, icmp, timeout)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getIcmpBlocks(self, zone): return dbus_to_python(self.fw_zone.getIcmpBlocks(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryIcmpBlock(self, zone, icmp): return dbus_to_python(self.fw_zone.queryIcmpBlock(zone, icmp)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeIcmpBlock(self, zone, icmp): return dbus_to_python(self.fw_zone.removeIcmpBlock(zone, icmp)) # icmp block inversion @slip.dbus.polkit.enable_proxy @handle_exceptions def addIcmpBlockInversion(self, zone): return dbus_to_python(self.fw_zone.addIcmpBlockInversion(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryIcmpBlockInversion(self, zone): return dbus_to_python(self.fw_zone.queryIcmpBlockInversion(zone)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeIcmpBlockInversion(self, zone): return dbus_to_python(self.fw_zone.removeIcmpBlockInversion(zone)) # direct chain @slip.dbus.polkit.enable_proxy @handle_exceptions def addChain(self, ipv, table, chain): self.fw_direct.addChain(ipv, table, chain) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeChain(self, ipv, table, chain): self.fw_direct.removeChain(ipv, table, chain) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryChain(self, ipv, table, chain): return dbus_to_python(self.fw_direct.queryChain(ipv, table, chain)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getChains(self, ipv, table): return dbus_to_python(self.fw_direct.getChains(ipv, table)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getAllChains(self): return dbus_to_python(self.fw_direct.getAllChains()) # direct rule @slip.dbus.polkit.enable_proxy @handle_exceptions def addRule(self, ipv, table, chain, priority, args): self.fw_direct.addRule(ipv, table, chain, priority, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeRule(self, ipv, table, chain, priority, args): self.fw_direct.removeRule(ipv, table, chain, priority, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeRules(self, ipv, table, chain): self.fw_direct.removeRules(ipv, table, chain) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryRule(self, ipv, table, chain, priority, args): return dbus_to_python(self.fw_direct.queryRule(ipv, table, chain, priority, args)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getRules(self, ipv, table, chain): return dbus_to_python(self.fw_direct.getRules(ipv, table, chain)) @slip.dbus.polkit.enable_proxy @handle_exceptions def getAllRules(self): return dbus_to_python(self.fw_direct.getAllRules()) # direct passthrough @slip.dbus.polkit.enable_proxy @handle_exceptions def passthrough(self, ipv, args): return dbus_to_python(self.fw_direct.passthrough(ipv, args)) # tracked passthrough @slip.dbus.polkit.enable_proxy @handle_exceptions def getAllPassthroughs(self): return dbus_to_python(self.fw_direct.getAllPassthroughs()) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeAllPassthroughs(self): self.fw_direct.removeAllPassthroughs() @slip.dbus.polkit.enable_proxy @handle_exceptions def getPassthroughs(self, ipv): return dbus_to_python(self.fw_direct.getPassthroughs(ipv)) @slip.dbus.polkit.enable_proxy @handle_exceptions def addPassthrough(self, ipv, args): self.fw_direct.addPassthrough(ipv, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def removePassthrough(self, ipv, args): self.fw_direct.removePassthrough(ipv, args) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryPassthrough(self, ipv, args): return dbus_to_python(self.fw_direct.queryPassthrough(ipv, args)) # lockdown @slip.dbus.polkit.enable_proxy @handle_exceptions def enableLockdown(self): self.fw_policies.enableLockdown() @slip.dbus.polkit.enable_proxy @handle_exceptions def disableLockdown(self): self.fw_policies.disableLockdown() @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdown(self): return dbus_to_python(self.fw_policies.queryLockdown()) # policies # lockdown white list commands @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistCommand(self, command): self.fw_policies.addLockdownWhitelistCommand(command) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistCommands(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistCommands()) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistCommand(self, command): return dbus_to_python(self.fw_policies.queryLockdownWhitelistCommand(command)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistCommand(self, command): self.fw_policies.removeLockdownWhitelistCommand(command) # lockdown white list contexts @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistContext(self, context): self.fw_policies.addLockdownWhitelistContext(context) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistContexts(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistContexts()) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistContext(self, context): return dbus_to_python(self.fw_policies.queryLockdownWhitelistContext(context)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistContext(self, context): self.fw_policies.removeLockdownWhitelistContext(context) # lockdown white list uids @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistUid(self, uid): self.fw_policies.addLockdownWhitelistUid(uid) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistUids(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistUids()) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistUid(self, uid): return dbus_to_python(self.fw_policies.queryLockdownWhitelistUid(uid)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistUid(self, uid): self.fw_policies.removeLockdownWhitelistUid(uid) # lockdown white list users @slip.dbus.polkit.enable_proxy @handle_exceptions def addLockdownWhitelistUser(self, user): self.fw_policies.addLockdownWhitelistUser(user) @slip.dbus.polkit.enable_proxy @handle_exceptions def getLockdownWhitelistUsers(self): return dbus_to_python(self.fw_policies.getLockdownWhitelistUsers()) @slip.dbus.polkit.enable_proxy @handle_exceptions def queryLockdownWhitelistUser(self, user): return dbus_to_python(self.fw_policies.queryLockdownWhitelistUser(user)) @slip.dbus.polkit.enable_proxy @handle_exceptions def removeLockdownWhitelistUser(self, user): self.fw_policies.removeLockdownWhitelistUser(user) @slip.dbus.polkit.enable_proxy @handle_exceptions def authorizeAll(self): """ Authorize once for all polkit actions. """ self.fw.authorizeAll() PK[u|%site-packages/firewall/dbus_utils.pyonu[ c`c @sdddddddddd d g Zd d lZd d lZd d lZd d lmZd dlmZejdkZ dZ dZ dZ dZ dZdZdZd dZdZd dZdZd S(tcommand_of_pidt pid_of_sendert uid_of_sendert user_of_uidtcontext_of_sendertcommand_of_sendertuser_of_sendertdbus_to_pythontdbus_signaturet%dbus_introspection_prepare_propertiest!dbus_introspection_add_propertiesiN(tminidom(tlogt3cCs[yBtd|d)}|jdjddj}WdQXWntk rVdSX|S(s Get command for pid from /proc s/proc/%d/cmdlinetritt N(topent readlinestreplacetstript ExceptiontNone(tpidtftcmd((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR%s , cCsV|jdd}tj|d}yt|j|}Wntk rQdSX|S(sW Get pid from sender string using org.freedesktop.DBus.GetConnectionUnixProcessID sorg.freedesktop.DBuss/org/freedesktop/DBusN(t get_objecttdbust InterfacetinttGetConnectionUnixProcessIDt ValueErrorR(tbustsendertdbus_objt dbus_ifaceR((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR.s cCsV|jdd}tj|d}yt|j|}Wntk rQdSX|S(sV Get user id from sender string using org.freedesktop.DBus.GetConnectionUnixUser sorg.freedesktop.DBuss/org/freedesktop/DBusN(RRRRtGetConnectionUnixUserRR(R R!R"R#tuid((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR;s cCs0ytj|}Wntk r'dSX|dS(s Get user for uid from pwd iN(tpwdtgetpwuidRR(R%tpws((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRHs  cCsh|jdd}tj|d}y|j|}Wntk rKdSXdjttt |S(sl Get SELinux context from sender string using org.freedesktop.DBus.GetConnectionSELinuxSecurityContext sorg.freedesktop.DBuss/org/freedesktop/DBustN( RRRt#GetConnectionSELinuxSecurityContextRRtjointmaptchrR(R R!R"R#tcontext((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRQs cCstt||S(s Return command of D-Bus sender (RR(R R!((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyR_scCstt||S(N(RR(R R!((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRdsc Cs|dkr|}n}t|tjr6t|}n\t|tjrltr]|jdn t|}n&trt|tj rt|}nt|tj rt|}nt|tj s2t|tj s2t|tj s2t|tjs2t|tjs2t|tjs2t|tjrAt|}nQt|tjrbt|}n0t|tjrg|D]}t|^q{}nt|tjrtg|D]}t|^q}nt|tjrd|jD}nt|tsst|tsst|tsst|tsst|tsst|tsst|tsst|tr||}ntdt||dk r|tkrt|t sb|tkrt|t sb|tkrt|t sb|tkrt|t sb|tkr*t|t sb|tkrFt|t sb|tkrt|t rtd|t ||fqn|S(Nsutf-8cSs+i|]!\}}t|t|qS((R(t.0tktv((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pys s s Unhandled %ss%s is %s, expected %s(!Rt isinstanceRtBooleantbooltStringtPY2tencodetstrt UTF8Stringt ObjectPathtBytetInt16tInt32tInt64tUInt16tUInt32tUInt64RtDoubletfloattArrayRtStructttuplet Dictionarytitemstbytestlisttdictt TypeErrortreprttype(tobjt expected_typet python_objtx((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRgsV  $"(  %cCst|tjrdSt|tjr,dSt|tjrBdSt|tjrXdSt|tjrndSt|tjrdSt|tjrdSt|tj rdSt|tj rd St|tj rd St|tj rd St|tj r2t|jd kr$d |jSd|jSnlt|tjrOd|jSt|tjrld|jStrt|tjrdStdt|dS(NtbtstotytntiRRtqtutttdisa(%s)sa%ss(%s)sa{%s}s Unhandled %s(R2RR3R5R:R;R<R=R>R?R@RARBRDtlent signatureRERGR6R9RLRM(RO((s7/usr/lib/python2.7/site-packages/firewall/dbus_utils.pyRsB   cCs|dkri}nt|ds7t|dint|d}i||s*          0 % PK[U222-site-packages/firewall/server/config_zone.pycnu[ c`c@sDddlmZddlZeejdeejjdd e d`d4Z?eejjdd dd)e d`d5Z@eejjdd+e d`d6ZAeejjdd+e d`d7ZBeejjdde d`d8ZCeejjdde d`d9ZDeejjdddd)e d`d:ZEeejjdd$e d`d;ZFeejjdd$e d`d<ZGeejjdd e d`d=ZHeejjdd e d`d>ZIeejjdd dd)e d`d?ZJeejjdd)e d`d@ZKeejjdd)e d`dAZLeejje d`dBZMeejje d`dCZNeejjdd)e d`dDZOeejjdd)e d`dEZPeejjdd)e d`dFZQeejje d`dGZReejje d`dHZSeejjdd)e d`dIZTeejjddJe d`dKZUeejjddJe d`dLZVeejjddMe d`dNZWeejjddMe d`dOZXeejjddMdd)e d`dPZYeejjdd$e d`dQZZeejjdd$e d`dRZ[eejjdd e d`dSZ\eejjdd e d`dTZ]eejjdd dd)e d`dUZ^eejjdd$e d`dVZ_eejjdd$e d`dWZ`eejjdd e d`dXZaeejjdd e d`dYZbeejjdd dd)e d`dZZceejjdd$e d`d[Zdeejjdd$e d`d\Zeeejjdd e d`d]Zfeejjdd e d`d^Zgeejjdd dd)e d`d_ZhRS(asFirewallD main classcOs~tt|j||||_||_||_||_|d|_|d|_d|j|_ t |tj j dS(Niisconfig.zone.%d( tsuperRt__init__tparentRtobjtitem_idtbusnametpatht _log_prefixRtdbustDBUS_INTERFACE_CONFIG_ZONE(tselfRtconftzoneRtargstkwargs((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyR<s      cCsdS(N((R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt__del__IscCs|jdS(N(tremove_from_connection(R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt unregisterMscCs|dkrtj|jjS|dkr>tj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR$R%RtBooleanR&R't exceptionst DBusException(Rt property_name((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt _get_propertyUs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrR tdebug1RRRRR*R+R-(Rtinterface_nameR,tsender((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytGetfs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||si( RRJt isinstanceR}RKR R3RRyRR?RNR`(RtportsR5t_portsRRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetPortss cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addPort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRR|R}R`(RRtprotocolR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytaddPorts cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removePort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRRReR`(RRRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt removePortscCst|t}t|t}tjd|j||||f|jdkrWtSx=|jdD]+\}}t||rh||krhtSqhWtS(Ns%s.queryPort('%s', '%s')i( RR2R R3RRNtTrueRtFalse(RRRR5t_portt _protocol((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt queryPortscCs!tjd|j|jdS(Ns%s.getProtocols()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getProtocolsscCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setProtocols('[%s]')Rxi ( RRJR R3RRyRR?RNR`(Rt protocolsR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setProtocolss cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addProtocol('%s')i (RR2R R3RRR?RJRNRRR|R}R`(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addProtocolscCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeProtocol('%s')i (RR2R R3RRR?RJRNRRRReR`(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveProtocolscCs9t|t}tjd|j|||jdkS(Ns%s.queryProtocol('%s')i (RR2R R3RRN(RRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt queryProtocol scCs!tjd|j|jdS(Ns%s.getSourcePorts()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytgetSourcePorts*scCsg}xIt|tD]8}t|trA|jt|q|j|qW|}tjd|jdjd|D|j j |t|j }||d<|j |dS(Ns%s.setSourcePorts('[%s]')Rxcss'|]}d|d|dfVqdS(s ('%s, '%s')iiN((RR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pys >si( RRJRR}RKR R3RRyRR?RNR`(RRR5RRRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetSourcePorts1s cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addSourcePort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRR|R}R`(RRRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addSourcePortDs cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removeSourcePort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRRReR`(RRRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveSourcePortTscCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.querySourcePort('%s', '%s')i(RR2R R3RRN(RRRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytquerySourcePortcs cCs!tjd|j|jdS(Ns%s.getIcmpBlocks()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getIcmpBlocksoscCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setIcmpBlocks('[%s]')Rxi( RRJR R3RRyRR?RNR`(Rt icmptypesR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setIcmpBlocksvs cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addIcmpBlock('%s')i(RR2R R3RRR?RJRNRRR|R}R`(RticmptypeR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addIcmpBlockscCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeIcmpBlock('%s')i(RR2R R3RRR?RJRNRRRReR`(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveIcmpBlockscCs9t|t}tjd|j|||jdkS(Ns%s.queryIcmpBlock('%s')i(RR2R R3RRN(RRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryIcmpBlockscCs!tjd|j|jdS(Ns%s.getIcmpBlockInversion()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytgetIcmpBlockInversionscCsbt|t}tjd|j||jj|t|j}||d<|j |dS(Ns%s.setIcmpBlockInversion('%s')i( RtboolR R3RRR?RJRNR`(RtflagR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetIcmpBlockInversions  cCsotjd|j|jj|t|j}|drTttj dnt |d<|j |dS(Ns%s.addIcmpBlockInversion()isicmp-block-inversion( R R3RRR?RJRNRRR|RR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytaddIcmpBlockInversions  cCsotjd|j|jj|t|j}|dsTttj dnt |d<|j |dS(Ns%s.removeIcmpBlockInversion()isicmp-block-inversion( R R3RRR?RJRNRRRRR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveIcmpBlockInversions  cCs!tjd|j|jdS(Ns%s.queryIcmpBlockInversion()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryIcmpBlockInversionscCs!tjd|j|jdS(Ns%s.getMasquerade()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getMasqueradescCsbt|t}tjd|j||jj|t|j}||d<|j |dS(Ns%s.setMasquerade('%s')i( RRR R3RRR?RJRNR`(Rt masqueradeR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setMasquerades  cCsotjd|j|jj|t|j}|drTttj dnt |d<|j |dS(Ns%s.addMasquerade()iR( R R3RRR?RJRNRRR|RR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addMasquerades  cCsotjd|j|jj|t|j}|dsTttj dnt |d<|j |dS(Ns%s.removeMasquerade()iR( R R3RRR?RJRNRRRRR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveMasquerades  cCs!tjd|j|jdS(Ns%s.queryMasquerade()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryMasqueradessa(ssss)cCs!tjd|j|jdS(Ns%s.getForwardPorts()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytgetForwardPortsscCsg}xIt|tD]8}t|trA|jt|q|j|qW|}tjd|jdjd|D|j j |t|j }||d<|j |dS(Ns%s.setForwardPorts('[%s]')Rxcss5|]+}d|d|d|d|dfVqdS(s('%s, '%s', '%s', '%s')iiiiN((RR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pys si ( RRJRR}RKR R3RRyRR?RNR`(RRR5RRRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetForwardPortss  tsssscCst|t}t|t}t|t}t|t}tjd|j|||||jj|||t|t|f}t|j}||dkrt t j d||||fn|dj ||j |dS(Ns)%s.addForwardPort('%s', '%s', '%s', '%s')i s %s:%s:%s:%s(RR2R R3RRR?RJRNRRR|R}R`(RRRttoportttoaddrR5tfwp_idRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytaddForwardPort#s   cCst|t}t|t}t|t}t|t}tjd|j|||||jj|||t|t|f}t|j}||dkrt t j d||||fn|dj ||j |dS(Ns,%s.removeForwardPort('%s', '%s', '%s', '%s')i s %s:%s:%s:%s(RR2R R3RRR?RJRNRRRReR`(RRRRRR5RRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveForwardPort7s   cCst|t}t|t}t|t}t|t}tjd|j||||||t|t|f}||jdkS(Ns+%s.queryForwardPort('%s', '%s', '%s', '%s')i (RR2R R3RRN(RRRRRR5R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryForwardPortKs cCs!tjd|j|jdS(Ns%s.getInterfaces()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getInterfaces[scCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setInterfaces('[%s]')Rxi ( RRJR R3RRyRR?RNR`(RROR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setInterfacesbs cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |t|jj|dS(Ns%s.addInterface('%s')i (RR2R R3RRR?RJRNRRR|R}R`RRR$(Rt interfaceR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addInterfacens cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |td|dS(Ns%s.removeInterface('%s')i t(RR2R R3RRR?RJRNRRRReR`R(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveInterface}s cCs9t|t}tjd|j|||jdkS(Ns%s.queryInterface('%s')i (RR2R R3RRN(RRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryInterfacescCs!tjd|j|jdS(Ns%s.getSources()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getSourcesscCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setSources('[%s]')Rxi ( RRJR R3RRyRR?RNR`(RRPR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setSourcess cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addSource('%s')i (RR2R R3RRR?RJRNRRR|R}R`(RR\R5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addSourcescCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeSource('%s')i (RR2R R3RRR?RJRNRRRReR`(RR\R5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt removeSourcescCs9t|t}tjd|j|||jdkS(Ns%s.querySource('%s')i (RR2R R3RRN(RR\R5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt querySourcescCs!tjd|j|jdS(Ns%s.getRichRules()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getRichRulesscCst|t}tjd|jdj||jj|t|j}g|D]}t t d|^qW}||d<|j |dS(Ns%s.setRichRules('[%s]')Rxtrule_stri ( RRJR R3RRyRR?RNR2R R`(RtrulesR5RLtr((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setRichRuless( cCst|t}tjd|j||jj|t|j}tt d|}||dkrt t j |n|dj ||j|dS(Ns%s.addRichRule('%s')Ri (RR2R R3RRR?RJRNR RRR|R}R`(RtruleR5RLR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addRichRulescCst|t}tjd|j||jj|t|j}tt d|}||dkrt t j |n|dj ||j|dS(Ns%s.removeRichRule('%s')Ri (RR2R R3RRR?RJRNR RRRReR`(RRR5RLR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveRichRulescCsNt|t}tjd|j|ttd|}||jdkS(Ns%s.queryRichRule('%s')Ri (RR2R R3RR RN(RRR5R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt queryRichRulesN(it__name__t __module__t__doc__Rt persistentRRtPK_ACTION_CONFIGtdefault_polkit_auth_requiredR RR R!R#R-R tPROPERTIES_IFACEtNoneR6R=tsliptpolkitt require_authRAR~tsignalRDtPK_ACTION_INFOtINTROSPECTABLE_IFACERFRRtDBUS_SIGNATURERNR]R`RbR_ReRfRiRhRjRlRmRoRpRrRsRuRwR{RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyR4sV  $                                             (%t gi.repositoryRtsystmodulesRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.zoneRtfirewall.core.fw_ifcfgRtfirewall.core.baseRtfirewall.core.richR tfirewall.core.loggerR tfirewall.server.decoratorsR R R Rtfirewall.errorsRtfirewall.functionsRR~tObjectR(((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyts$      PK[P*site-packages/firewall/server/__init__.pycnu[ c`c@sdS(N((((s</usr/lib/python2.7/site-packages/firewall/server/__init__.pytsPK[iZ Z ,site-packages/firewall/server/decorators.pycnu[ c`c@sdZddddgZddlZddlZddlZddlmZddlmZdd lm Z dd l m Z dd lm Z dd l mZdejfd YZedZedZdZdS(s>This module contains decorators for use with and without D-BustFirewallDBusExceptionthandle_exceptionstdbus_handle_exceptionstdbus_service_methodiN(t DBusException(t decorator(tconfig(t FirewallError(terrors(tlogcBseZdZdejjZRS(Rs %s.Exception(t__name__t __module__t__doc__RtdbustDBUS_INTERFACEt_dbus_error_name(((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyR+scOsxy|||SWn`tk rF}tjtjtj|n.tk rstjtjtjnXdS(sTDecorator to handle exceptions and log them. Used if not conneced to D-Bus. N(RR tdebug1t tracebackt format_excterrort Exceptiont exception(tfunctargstkwargsR((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyR/s cOs y|||SWntk r}tjt|}|tjtjtjtjgkrrtj t|n&tj t j tj t|tt|nZtk r}|nBtk r}tj t j tjtt|nXdS(sDecorator to handle exceptions, log and report them into D-Bus :Raises DBusException: on a firewall error code problems. N(Rtget_codetstrRtALREADY_ENABLEDt NOT_ENABLEDtZONE_ALREADY_SETt ALREADY_SETR twarningRRRRRRRR(RRRRtcodetex((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyR=s   cOs#|jddtjj||S(sAdd sender argument for D-Bustsender_keywordtsender(t setdefaultR tservicetmethod(RR((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyRVs(R t__all__R t dbus.serviceRtdbus.exceptionsRRtfirewallRtfirewall.errorsRRtfirewall.core.loggerR RRRR(((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyts    PK[iZ Z ,site-packages/firewall/server/decorators.pyonu[ c`c@sdZddddgZddlZddlZddlZddlmZddlmZdd lm Z dd l m Z dd lm Z dd l mZdejfd YZedZedZdZdS(s>This module contains decorators for use with and without D-BustFirewallDBusExceptionthandle_exceptionstdbus_handle_exceptionstdbus_service_methodiN(t DBusException(t decorator(tconfig(t FirewallError(terrors(tlogcBseZdZdejjZRS(Rs %s.Exception(t__name__t __module__t__doc__RtdbustDBUS_INTERFACEt_dbus_error_name(((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyR+scOsxy|||SWn`tk rF}tjtjtj|n.tk rstjtjtjnXdS(sTDecorator to handle exceptions and log them. Used if not conneced to D-Bus. N(RR tdebug1t tracebackt format_excterrort Exceptiont exception(tfunctargstkwargsR((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyR/s cOs y|||SWntk r}tjt|}|tjtjtjtjgkrrtj t|n&tj t j tj t|tt|nZtk r}|nBtk r}tj t j tjtt|nXdS(sDecorator to handle exceptions, log and report them into D-Bus :Raises DBusException: on a firewall error code problems. N(Rtget_codetstrRtALREADY_ENABLEDt NOT_ENABLEDtZONE_ALREADY_SETt ALREADY_SETR twarningRRRRRRRR(RRRRtcodetex((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyR=s   cOs#|jddtjj||S(sAdd sender argument for D-Bustsender_keywordtsender(t setdefaultR tservicetmethod(RR((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyRVs(R t__all__R t dbus.serviceRtdbus.exceptionsRRtfirewallRtfirewall.errorsRRtfirewall.core.loggerR RRRR(((s>/usr/lib/python2.7/site-packages/firewall/server/decorators.pyts    PK[U222-site-packages/firewall/server/config_zone.pyonu[ c`c@sDddlmZddlZeejdeejjdd e d`d4Z?eejjdd dd)e d`d5Z@eejjdd+e d`d6ZAeejjdd+e d`d7ZBeejjdde d`d8ZCeejjdde d`d9ZDeejjdddd)e d`d:ZEeejjdd$e d`d;ZFeejjdd$e d`d<ZGeejjdd e d`d=ZHeejjdd e d`d>ZIeejjdd dd)e d`d?ZJeejjdd)e d`d@ZKeejjdd)e d`dAZLeejje d`dBZMeejje d`dCZNeejjdd)e d`dDZOeejjdd)e d`dEZPeejjdd)e d`dFZQeejje d`dGZReejje d`dHZSeejjdd)e d`dIZTeejjddJe d`dKZUeejjddJe d`dLZVeejjddMe d`dNZWeejjddMe d`dOZXeejjddMdd)e d`dPZYeejjdd$e d`dQZZeejjdd$e d`dRZ[eejjdd e d`dSZ\eejjdd e d`dTZ]eejjdd dd)e d`dUZ^eejjdd$e d`dVZ_eejjdd$e d`dWZ`eejjdd e d`dXZaeejjdd e d`dYZbeejjdd dd)e d`dZZceejjdd$e d`d[Zdeejjdd$e d`d\Zeeejjdd e d`d]Zfeejjdd e d`d^Zgeejjdd dd)e d`d_ZhRS(asFirewallD main classcOs~tt|j||||_||_||_||_|d|_|d|_d|j|_ t |tj j dS(Niisconfig.zone.%d( tsuperRt__init__tparentRtobjtitem_idtbusnametpatht _log_prefixRtdbustDBUS_INTERFACE_CONFIG_ZONE(tselfRtconftzoneRtargstkwargs((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyR<s      cCsdS(N((R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt__del__IscCs|jdS(N(tremove_from_connection(R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt unregisterMscCs|dkrtj|jjS|dkr>tj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR$R%RtBooleanR&R't exceptionst DBusException(Rt property_name((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt _get_propertyUs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrR tdebug1RRRRR*R+R-(Rtinterface_nameR,tsender((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytGetfs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||si( RRJt isinstanceR}RKR R3RRyRR?RNR`(RtportsR5t_portsRRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetPortss cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addPort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRR|R}R`(RRtprotocolR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytaddPorts cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removePort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRRReR`(RRRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt removePortscCst|t}t|t}tjd|j||||f|jdkrWtSx=|jdD]+\}}t||rh||krhtSqhWtS(Ns%s.queryPort('%s', '%s')i( RR2R R3RRNtTrueRtFalse(RRRR5t_portt _protocol((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt queryPortscCs!tjd|j|jdS(Ns%s.getProtocols()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getProtocolsscCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setProtocols('[%s]')Rxi ( RRJR R3RRyRR?RNR`(Rt protocolsR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setProtocolss cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addProtocol('%s')i (RR2R R3RRR?RJRNRRR|R}R`(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addProtocolscCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeProtocol('%s')i (RR2R R3RRR?RJRNRRRReR`(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveProtocolscCs9t|t}tjd|j|||jdkS(Ns%s.queryProtocol('%s')i (RR2R R3RRN(RRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt queryProtocol scCs!tjd|j|jdS(Ns%s.getSourcePorts()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytgetSourcePorts*scCsg}xIt|tD]8}t|trA|jt|q|j|qW|}tjd|jdjd|D|j j |t|j }||d<|j |dS(Ns%s.setSourcePorts('[%s]')Rxcss'|]}d|d|dfVqdS(s ('%s, '%s')iiN((RR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pys >si( RRJRR}RKR R3RRyRR?RNR`(RRR5RRRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetSourcePorts1s cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addSourcePort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRR|R}R`(RRRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addSourcePortDs cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removeSourcePort('%s', '%s')is%s:%s(RR2R R3RRR?RJRNRRRReR`(RRRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveSourcePortTscCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.querySourcePort('%s', '%s')i(RR2R R3RRN(RRRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytquerySourcePortcs cCs!tjd|j|jdS(Ns%s.getIcmpBlocks()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getIcmpBlocksoscCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setIcmpBlocks('[%s]')Rxi( RRJR R3RRyRR?RNR`(Rt icmptypesR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setIcmpBlocksvs cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addIcmpBlock('%s')i(RR2R R3RRR?RJRNRRR|R}R`(RticmptypeR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addIcmpBlockscCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeIcmpBlock('%s')i(RR2R R3RRR?RJRNRRRReR`(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveIcmpBlockscCs9t|t}tjd|j|||jdkS(Ns%s.queryIcmpBlock('%s')i(RR2R R3RRN(RRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryIcmpBlockscCs!tjd|j|jdS(Ns%s.getIcmpBlockInversion()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytgetIcmpBlockInversionscCsbt|t}tjd|j||jj|t|j}||d<|j |dS(Ns%s.setIcmpBlockInversion('%s')i( RtboolR R3RRR?RJRNR`(RtflagR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetIcmpBlockInversions  cCsotjd|j|jj|t|j}|drTttj dnt |d<|j |dS(Ns%s.addIcmpBlockInversion()isicmp-block-inversion( R R3RRR?RJRNRRR|RR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytaddIcmpBlockInversions  cCsotjd|j|jj|t|j}|dsTttj dnt |d<|j |dS(Ns%s.removeIcmpBlockInversion()isicmp-block-inversion( R R3RRR?RJRNRRRRR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveIcmpBlockInversions  cCs!tjd|j|jdS(Ns%s.queryIcmpBlockInversion()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryIcmpBlockInversionscCs!tjd|j|jdS(Ns%s.getMasquerade()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getMasqueradescCsbt|t}tjd|j||jj|t|j}||d<|j |dS(Ns%s.setMasquerade('%s')i( RRR R3RRR?RJRNR`(Rt masqueradeR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setMasquerades  cCsotjd|j|jj|t|j}|drTttj dnt |d<|j |dS(Ns%s.addMasquerade()iR( R R3RRR?RJRNRRR|RR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addMasquerades  cCsotjd|j|jj|t|j}|dsTttj dnt |d<|j |dS(Ns%s.removeMasquerade()iR( R R3RRR?RJRNRRRRR`(RR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveMasquerades  cCs!tjd|j|jdS(Ns%s.queryMasquerade()i(R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryMasqueradessa(ssss)cCs!tjd|j|jdS(Ns%s.getForwardPorts()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytgetForwardPortsscCsg}xIt|tD]8}t|trA|jt|q|j|qW|}tjd|jdjd|D|j j |t|j }||d<|j |dS(Ns%s.setForwardPorts('[%s]')Rxcss5|]+}d|d|d|d|dfVqdS(s('%s, '%s', '%s', '%s')iiiiN((RR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pys si ( RRJRR}RKR R3RRyRR?RNR`(RRR5RRRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytsetForwardPortss  tsssscCst|t}t|t}t|t}t|t}tjd|j|||||jj|||t|t|f}t|j}||dkrt t j d||||fn|dj ||j |dS(Ns)%s.addForwardPort('%s', '%s', '%s', '%s')i s %s:%s:%s:%s(RR2R R3RRR?RJRNRRR|R}R`(RRRttoportttoaddrR5tfwp_idRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytaddForwardPort#s   cCst|t}t|t}t|t}t|t}tjd|j|||||jj|||t|t|f}t|j}||dkrt t j d||||fn|dj ||j |dS(Ns,%s.removeForwardPort('%s', '%s', '%s', '%s')i s %s:%s:%s:%s(RR2R R3RRR?RJRNRRRReR`(RRRRRR5RRL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveForwardPort7s   cCst|t}t|t}t|t}t|t}tjd|j||||||t|t|f}||jdkS(Ns+%s.queryForwardPort('%s', '%s', '%s', '%s')i (RR2R R3RRN(RRRRRR5R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryForwardPortKs cCs!tjd|j|jdS(Ns%s.getInterfaces()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getInterfaces[scCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setInterfaces('[%s]')Rxi ( RRJR R3RRyRR?RNR`(RROR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setInterfacesbs cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |t|jj|dS(Ns%s.addInterface('%s')i (RR2R R3RRR?RJRNRRR|R}R`RRR$(Rt interfaceR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addInterfacens cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |td|dS(Ns%s.removeInterface('%s')i t(RR2R R3RRR?RJRNRRRReR`R(RRR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveInterface}s cCs9t|t}tjd|j|||jdkS(Ns%s.queryInterface('%s')i (RR2R R3RRN(RRR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytqueryInterfacescCs!tjd|j|jdS(Ns%s.getSources()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getSourcesscCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setSources('[%s]')Rxi ( RRJR R3RRyRR?RNR`(RRPR5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setSourcess cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addSource('%s')i (RR2R R3RRR?RJRNRRR|R}R`(RR\R5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addSourcescCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeSource('%s')i (RR2R R3RRR?RJRNRRRReR`(RR\R5RL((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt removeSourcescCs9t|t}tjd|j|||jdkS(Ns%s.querySource('%s')i (RR2R R3RRN(RR\R5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt querySourcescCs!tjd|j|jdS(Ns%s.getRichRules()i (R R3RRN(RR5((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt getRichRulesscCst|t}tjd|jdj||jj|t|j}g|D]}t t d|^qW}||d<|j |dS(Ns%s.setRichRules('[%s]')Rxtrule_stri ( RRJR R3RRyRR?RNR2R R`(RtrulesR5RLtr((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt setRichRuless( cCst|t}tjd|j||jj|t|j}tt d|}||dkrt t j |n|dj ||j|dS(Ns%s.addRichRule('%s')Ri (RR2R R3RRR?RJRNR RRR|R}R`(RtruleR5RLR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt addRichRulescCst|t}tjd|j||jj|t|j}tt d|}||dkrt t j |n|dj ||j|dS(Ns%s.removeRichRule('%s')Ri (RR2R R3RRR?RJRNR RRRReR`(RRR5RLR((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pytremoveRichRulescCsNt|t}tjd|j|ttd|}||jdkS(Ns%s.queryRichRule('%s')Ri (RR2R R3RR RN(RRR5R((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyt queryRichRulesN(it__name__t __module__t__doc__Rt persistentRRtPK_ACTION_CONFIGtdefault_polkit_auth_requiredR RR R!R#R-R tPROPERTIES_IFACEtNoneR6R=tsliptpolkitt require_authRAR~tsignalRDtPK_ACTION_INFOtINTROSPECTABLE_IFACERFRRtDBUS_SIGNATURERNR]R`RbR_ReRfRiRhRjRlRmRoRpRrRsRuRwR{RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyR4sV  $                                             (%t gi.repositoryRtsystmodulesRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.zoneRtfirewall.core.fw_ifcfgRtfirewall.core.baseRtfirewall.core.richR tfirewall.core.loggerR tfirewall.server.decoratorsR R R Rtfirewall.errorsRtfirewall.functionsRR~tObjectR(((s?/usr/lib/python2.7/site-packages/firewall/server/config_zone.pyts$      PK[rΗ"U"U+site-packages/firewall/server/firewalld.pyonu[ c`c@sdgZddlmZmZddlZeejdejjjejj-eejj*d dd d edd5Z?ejjjejj-eejj*d dd d'edd6Z@ejjejj*dded7ZAejjejj*dded8ZBejjjejj)eejj*d dd dedd9ZCejjjejj)eejj*d dd dedd:ZDejjjejj-eejj*d dd d edd;ZEejjjejj-eejj*d dd d'edd<ZFejjejj*dded=ZGejjejj*dded>ZHejjjejjeejj#d dd dedd?ZIejjjejjeejj#d dd dedd@ZJejjjejj eejj#d dd d eddAZKejjejj#ddedBZLejjejj#ddedCZMejjjejjNeejj#d dd eOjPeddDZQejjjejj eejj#d dd d'eddEZRejjjejjNeejj#d dd eSjPeddFZTejjjejj eejj#d dd d'eddGZUejjjejjNeejj#d dd eVjPeddHZWejjjejjNeejj#d dd deddIZXejjjejjeejj#d dd deddJZYejjejj#ddedKZZejjjejjNeejj#d dd deddLZ[ejjjejjeejj#d dd deddMZ\ejjejj#ddedNZ]ejjjejj eejj#d dd deddOZ^ejjjejjeejj#d dd deddPZ_ejjejj#ddedQZ`ejjjejj eejjad dd d'eddRZbejjjejj eejjad dd dSeddTZcejjjejj eejjad dd deddUZdejjjejj eejjad dd deddVZeejjjejjNeejjad dd d eddWZfejjjejjeejjad d d deddXZgejjjejjeejjad d d deddYZhejjjejjeejjad d d deddZZiejjjejjeejjad d d dedd[ZjejjjejjNeejjad d d d edd\ZkejjjejjNeejjad dd d'edd]Zlejjejjadd ed^Zmejjejjadd ed_Znejjejjadd ed`Zoejjejjadd edaZpejjjejjeejjad d d deddbZqejjjejjeejjad d d deddcZrejjjejjeejjad d d dedddZsejjjejjNeejjad d d d eddeZtejjjejjNeejjad dd d'eddfZuejjejjadd edgZvejjejjadd edhZwejjejjadd ediZxedjZyejjjejjeejjad dkd deddlZzejjjejjeejjad d d deddmZ{ejjjejjNeejjad d d d eddnZ|ejjjejjNeejjad dd d'eddoZ}ejjejjaddkedpZ~ejjejjadd edqZedrZejjjejjeejjad dkd deddsZejjjejjeejjad d d deddtZejjjejjNeejjad d d d edduZejjjejjNeejjad dd d'eddvZejjejjaddkedwZejjejjadd edxZedyZejjjejjeejjad dzd dedd{Zejjjejjeejjad d|d dedd}ZejjjejjNeejjad d|d d edd~ZejjjejjNeejjad dd deddZejjejjaddzeddZejjejjadd|edZedZejjjejjeejjad dkd deddZejjjejjeejjad d d deddZejjjejjNeejjad d d d eddZejjjejjNeejjad dd d'eddZejjejjaddkeddZejjejjadd edZedZejjjejjeejjad dzd deddZejjjejjeejjad d|d deddZejjjejjNeejjad d|d d eddZejjjejjNeejjad dd deddZejjejjaddzeddZejjejjadd|edZedZejjjejjeejjad dd deddZejjjejjeejjad dd deddZejjjejjNeejjad dd d eddZejjejjaddeddZejjejjaddedZedZejjjejjeejjad dd deddZejjjejjeejjad dd deddZejjjejjNeejjad dd d eddZejjjejjNeejjad dd deddZejjejjaddeddZejjejjaddedZedZejjjejjeejjad dkd deddZejjjejjeejjad d d deddZejjjejjNeejjad d d d eddZejjjejjNeejjad dd d'eddZejjejjaddkeddZejjejjadd edZejjjejjeejjad dd deddZejjjejjeejjad dd deddZejjjejjNeejjad dd d eddZejjejjaddedZejjejjaddedZejjjejjeejjd d|d deddZejjjejjeejjd d|d deddZejjjejjeejjd d|d d eddZejjjejjeejjd d d d'eddZejjjejjeejjd dd deddZejjejjdd|edZejjejjdd|edZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd d|d deddZejjjejjeejjd dd d eddZejjjejjeejjd d|d deddZejjjejjeejjd dd deddZejjejjddedZejjejjddedZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd dd d eddZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjejjddedZejjejjddedZejjjejjeejj#d dd deddZejjjejj eejjd dd d eddZejjjejj eejjd dd d'eddZejjjejjNeejjd dd ejPeddZejjjejjeejjd d d deddZejjjejjeejjd d d deddZejjjejj eejjd d d d eddZejjjejj eejjd dd d'eddZejjjejjeejjd deddZejjejjdd edZejjejjdd edZejjjejj eejj#d dd d'eddZejjjejjNeejj#d dd ejPeddZRS(sFirewallD main classcOstt|j||t|_|d|_|d|_|jt|t j j t |jj |jt j j |_ dS(Nii(tsuperRt__init__RtfwtbusnametpathtstartRRtdbustDBUS_INTERFACER tDBUS_PATH_CONFIG(tselftargstkwargs((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR"Js    cCs|jdS(N(tstop(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt__del__UscCs#tjdi|_|jjS(Nsstart()(Rtdebug1t _timeoutsR#R&(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR&Xs  cCstjd|jjS(Nsstop()(RR/R#R-(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR-`s cCs|jjjr|dkr/tjddStj}t||}|jjj d|rfdSt ||}|jjj d|rdSt |}|jjj d|rdSt ||}|jjj d|rdSt tjdndS(Ns&Lockdown not possible, sender not set.tcontexttuidtusertcommandslockdown is enabled(R#tpoliciestquery_lockdowntNoneRterrorR't SystemBusRt access_checkRRRR Rt ACCESS_DENIED(R*tsendertbusR1R2R3R4((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt accessCheckis$    cCs4||jkri|j|RR'R(RfRgRoRpRqRr(R*RsRtt new_valueR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytSets:             Rvssa{sv}ascCsAt|t}t|}t|}tjd|||dS(Ns#PropertiesChanged('%s', '%s', '%s')(RRnRR/(R*Rstchanged_propertiestinvalidated_properties((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytPropertiesChangeds    cCsJtjdtt|j|j|jj}t||t j j S(Ns Introspect()( Rtdebug2R!Rt IntrospectR%R$tget_busRRR'R((R*R<tdata((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR's   tcCs5tjd|jj|jj|jdS(s#Reload the firewall rules. sreload()N(RR/R#treloadRtReloaded(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR5s   cCs8tjd|jjt|jj|jdS(sCompletely reload the firewall. Completely reload the firewall: Stops firewall, unloads modules and starts the firewall again. scompleteReload()N(RR/R#RtTrueRR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytcompleteReloadDs  cCstjddS(Ns Reloaded()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRTscCstjdt|jdS(s&Check permanent configuration scheckPermanentConfig()N(RR/RR#(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytcheckPermanentConfigYs c Csotjdt}|jj}x|jjjD]}|j|}y||kr|jj |}|j |krtjd||j |qtjd|n$tjd||jj ||Wq5t k r }tjd||ft}q5Xq5W|jj}x|jjjD]}|j|}y||kr|jj|}|j |krtjd||j |qtjd|n$tjd||jj||Wq0t k r}tjd ||ft}q0Xq0W|jj}x|jjjD]}y|j|}||kr|jj|}|j |krtjd ||j |qtjd |n$tjd ||jj||Wq+t k r}tjd ||ft}q+Xq+W|jj}t}x |jjjD]}|j |}t!|} |dk rBt} x_| j#D]Q} |jjj$|| |krotjd|| f| j%| t} qoqoWxc| j#D]U} y;t&| } | rt'|| r| j%| t} nWqt k r%qXqW| rB~| j(}qBnx!| j#D]} t)|| qOWy||kr|jj*|}|j |krtjd||j |qtjd|n$tjd||jj+||Wq/t k r%}tjd||ft}q/Xq/W|jj,}x|jj-j.D]}|j/|}y||kr|jj0|}|j |krtjd||j |qtjd|n$tjd||jj1||WqLt k r }tjd||ft}qLXqLW|jj2j3|jj2j4|jj2j5f}yF|jj |krtjd|jj |n tjdWn*t k r}tjd|t}nX|jj6j7j8}yF|jj |krtjd|jj9|n tjdWn*t k rR}tjd|t}nX|rkt:t;j<ndS(s-Make runtime configuration permanent scopyRuntimeToPermanent()sCopying service '%s' settingss$Service '%s' is identical, ignoring.sCreating service '%s's/Runtime To Permanent failed on service '%s': %ssCopying icmptype '%s' settingss%IcmpType '%s' is identical, ignoring.sCreating icmptype '%s's0Runtime To Permanent failed on icmptype '%s': %ssCopying ipset '%s' settingss"IPSet '%s' is identical, ignoring.sCreating ipset '%s's-Runtime To Permanent failed on ipset '%s': %ssEZone '%s': interface binding for '%s' has been added by NM, ignoring.sCopying zone '%s' settingss!Zone '%s' is identical, ignoring.sCreating zone '%s's,Runtime To Permanent failed on zone '%s': %ssCopying helper '%s' settingss#Helper '%s' is identical, ignoring.sCreating helper '%s's.Runtime To Permanent failed on helper '%s': %ssCopying direct configurations,Direct configuration is identical, ignoring.s7Runtime To Permanent failed on direct configuration: %ssCopying policies configurations.Policies configuration is identical, ignoring.s9Runtime To Permanent failed on policies configuration: %sN(=RR/tFalseRtgetServiceNamesR#tservicet get_servicestgetServiceSettingstgetServiceByNamet getSettingstupdatet addServicet ExceptiontwarningRtgetIcmpTypeNamesticmptypet get_icmptypestgetIcmpTypeSettingstgetIcmpTypeByNamet addIcmpTypet getIPSetNamestipsett get_ipsetstgetIPSetSettingstgetIPSetByNametaddIPSett getZoneNamesRR?t get_zonestgetZoneSettingsRR7t getInterfacestinterface_get_sendertremoveInterfaceRRtsettingsRt getZoneByNametaddZonetgetHelperNamesthelpert get_helperstgetHelperSettingstgetHelperByNamet addHelpertdirecttget_all_chainst get_all_rulestget_all_passthroughsR5tlockdown_whitelistt export_configtsetLockdownWhitelistR RtRT_TO_PERM_FAILED( R*R<R8t config_namestnametconftconf_objtet nm_bus_nameRtchangedt interfacet connection((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytruntimeToPermanentes                     cCs8tjd|j||jjj|jdS(s!Enable lockdown policies spolicies.enableLockdown()N(RR/R>R#R5tenable_lockdowntLockdownEnabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytenableLockdown$s  cCs8tjd|j||jjj|jdS(s"Disable lockdown policies spolicies.disableLockdown()N(RR/R>R#R5tdisable_lockdowntLockdownDisabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableLockdown0s  tbcCstjd|jjjS(s+Retuns True if lockdown is enabled spolicies.queryLockdown()(RR/R#R5R6(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryLockdown<s cCstjddS(NsLockdownEnabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRGscCstjddS(NsLockdownDisabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRLscCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown command s*policies.addLockdownWhitelistCommand('%s')N( RRnRR/R>R#R5Rt add_commandtLockdownWhitelistCommandAdded(R*R4R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistCommandUs  cCsTt|t}tjd||j||jjjj||j |dS(s Remove lockdown command s-policies.removeLockdownWhitelistCommand('%s')N( RRnRR/R>R#R5Rtremove_commandtLockdownWhitelistCommandRemoved(R*R4R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistCommandbs  cCs6t|t}tjd||jjjj|S(sQuery lockdown command s,policies.queryLockdownWhitelistCommand('%s')(RRnRR/R#R5Rt has_command(R*R4R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistCommandostascCs tjd|jjjjS(sAdd lockdown command s'policies.getLockdownWhitelistCommands()(RR/R#R5Rt get_commands(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistCommands{s cCstjd|dS(Ns#LockdownWhitelistCommandAdded('%s')(RR/(R*R4((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Ns%LockdownWhitelistCommandRemoved('%s')(RR/(R*R4((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRsticCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown uid s&policies.addLockdownWhitelistUid('%s')N( RtintRR/R>R#R5Rtadd_uidtLockdownWhitelistUidAdded(R*R2R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistUids  cCsTt|t}tjd||j||jjjj||j |dS(sRemove lockdown uid s)policies.removeLockdownWhitelistUid('%s')N( RRRR/R>R#R5Rt remove_uidtLockdownWhitelistUidRemoved(R*R2R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistUids  cCs6t|t}tjd||jjjj|S(sQuery lockdown uid s(policies.queryLockdownWhitelistUid('%s')(RRRR/R#R5Rthas_uid(R*R2R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistUidstaicCs tjd|jjjjS(sAdd lockdown uid s#policies.getLockdownWhitelistUids()(RR/R#R5Rtget_uids(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistUidss cCstjd|dS(NsLockdownWhitelistUidAdded(%d)(RR/(R*R2((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(NsLockdownWhitelistUidRemoved(%d)(RR/(R*R2((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown user s'policies.addLockdownWhitelistUser('%s')N( RRnRR/R>R#R5Rtadd_usertLockdownWhitelistUserAdded(R*R3R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistUsers  cCsTt|t}tjd||j||jjjj||j |dS(sRemove lockdown user s*policies.removeLockdownWhitelistUser('%s')N( RRnRR/R>R#R5Rt remove_usertLockdownWhitelistUserRemoved(R*R3R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistUsers  cCs6t|t}tjd||jjjj|S(sQuery lockdown user s)policies.queryLockdownWhitelistUser('%s')(RRnRR/R#R5Rthas_user(R*R3R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistUserscCs tjd|jjjjS(sAdd lockdown user s$policies.getLockdownWhitelistUsers()(RR/R#R5Rt get_users(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistUserss cCstjd|dS(Ns LockdownWhitelistUserAdded('%s')(RR/(R*R3((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Ns"LockdownWhitelistUserRemoved('%s')(RR/(R*R3((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown context s*policies.addLockdownWhitelistContext('%s')N( RRnRR/R>R#R5Rt add_contexttLockdownWhitelistContextAdded(R*R1R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistContext s  cCsTt|t}tjd||j||jjjj||j |dS(s Remove lockdown context s-policies.removeLockdownWhitelistContext('%s')N( RRnRR/R>R#R5Rtremove_contexttLockdownWhitelistContextRemoved(R*R1R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistContexts  cCs6t|t}tjd||jjjj|S(sQuery lockdown context s,policies.queryLockdownWhitelistContext('%s')(RRnRR/R#R5Rt has_context(R*R1R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistContext&scCs tjd|jjjjS(sAdd lockdown context s'policies.getLockdownWhitelistContexts()(RR/R#R5Rt get_contexts(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistContexts2s cCstjd|dS(Ns#LockdownWhitelistContextAdded('%s')(RR/(R*R1((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR=scCstjd|dS(Ns%LockdownWhitelistContextRemoved('%s')(RR/(R*R1((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRBscCs5tjd|j||jj|jdS(snEnable panic mode. All ingoing and outgoing connections and packets will be blocked. senablePanicMode()N(RR/R>R#tenable_panic_modetPanicModeEnabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytenablePanicModeKs   cCs5tjd|j||jj|jdS(sDisable panic mode. Enables normal mode: Allowed ingoing and outgoing connections will not be blocked anymore sdisablePanicMode()N(RR/R>R#tdisable_panic_modetPanicModeDisabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisablePanicModeYs   cCstjd|jjS(NsqueryPanicMode()(RR/R#tquery_panic_mode(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryPanicModehs cCstjddS(NsPanicModeEnabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRqscCstjddS(NsPanicModeDisabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRvscCs2t|t}tjd||jjj|S(NsgetZoneSettings(%s)(RRnRR/R#R?tget_config_with_settings(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjjS(NslistServices()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt listServicess cCs8t|t}tjd||jjj|jS(NsgetServiceSettings(%s)(RRnRR/R#Rt get_serviceR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjjS(NslistIcmpTypes()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt listIcmpTypess cCs8t|t}tjd||jjj|jS(NsgetIcmpTypeSettings(%s)(RRnRR/R#Rt get_icmptypeR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjS(NsgetLogDenied()(RR/R#tget_log_denied(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getLogDenieds cCsrt|t}tjd||j||jj||j||jj|j j|j dS(NssetLogDenied('%s')( RRnRR/R>R#tset_log_deniedtLogDeniedChangedRRR(R*tvalueR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt setLogDenieds    cCstjd|dS(NsLogDeniedChanged('%s')(RR/(R*R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjS(NsgetAutomaticHelpers()(RR/R#tget_automatic_helpers(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetAutomaticHelperss cCsrt|t}tjd||j||jj||j||jj|j j|j dS(NssetAutomaticHelpers('%s')( RRnRR/R>R#tset_automatic_helperstAutomaticHelpersChangedRRR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytsetAutomaticHelperss    cCstjd|dS(NsAutomaticHelpersChanged('%s')(RR/(R*R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR scCstjd|jjS(NsgetDefaultZone()(RR/R#tget_default_zone(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetDefaultZones cCsNt|t}tjd||j||jj||j|dS(NssetDefaultZone('%s')(RRnRR/R>R#tset_default_zonetDefaultZoneChanged(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytsetDefaultZones  cCstjd|dS(NsDefaultZoneChanged('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjjS(Nszone.getZones()(RR/R#R?R(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetZoness s a{sa{sas}}cCstjdi}x|jjjD]}|jjj|}|jjj|}t|t|dkr&i||R#R?t add_interfacetInterfaceAdded(R*R?RR<t_zone((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addInterfaceds cCs1t|t}t|t}|j|||S(sChange a zone an interface is part of. If zone is empty, use default zone. This function is deprecated, use changeZoneOfInterface instead (RRntchangeZoneOfInterface(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt changeZoneus cCsqt|t}t|t}tjd||f|j||jjj|||}|j|||S(s[Change a zone an interface is part of. If zone is empty, use default zone. s&zone.changeZoneOfInterface('%s', '%s')( RRnRR/R>R#R?tchange_zone_of_interfacetZoneOfInterfaceChanged(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR%s cCsnt|t}t|t}tjd||f|j||jjj||}|j|||S(skRemove interface from a zone. If zone is empty, remove from zone the interface belongs to. s zone.removeInterface('%s', '%s')( RRnRR/R>R#R?tremove_interfacetInterfaceRemoved(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCsKt|t}t|t}tjd||f|jjj||S(s^Return true if an interface is in a zone. If zone is empty, use default zone. szone.queryInterface('%s', '%s')(RRnRR/R#R?tquery_interface(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryInterfacescCs3t|t}tjd||jjj|S(s]Return the list of interfaces of a zone. If zone is empty, use default zone. szone.getInterfaces('%s')(RRnRR/R#R?R(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCstjd||fdS(Nszone.InterfaceAdded('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR"scCstjd||fdS(s, This signal is deprecated. szone.ZoneChanged('%s', '%s')N(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt ZoneChangedscCs+tjd||f|j||dS(Ns'zone.ZoneOfInterfaceChanged('%s', '%s')(RR/R-(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR(s  cCstjd||fdS(Ns!zone.InterfaceRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR*scCsqt|t}t|t}tjd||f|j||jjj|||}|j|||S(sLAdd a source to a zone. If zone is empty, use default zone. szone.addSource('%s', '%s')( RRnRR/R>R#R?t add_sourcet SourceAdded(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addSources cCsqt|t}t|t}tjd||f|j||jjj|||}|j|||S(sXChange a zone an source is part of. If zone is empty, use default zone. s#zone.changeZoneOfSource('%s', '%s')( RRnRR/R>R#R?tchange_zone_of_sourcetZoneOfSourceChanged(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytchangeZoneOfSources cCsnt|t}t|t}tjd||f|j||jjj||}|j|||S(seRemove source from a zone. If zone is empty, remove from zone the source belongs to. szone.removeSource('%s', '%s')( RRnRR/R>R#R?t remove_sourcet SourceRemoved(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeSources cCsKt|t}t|t}tjd||f|jjj||S(s[Return true if an source is in a zone. If zone is empty, use default zone. szone.querySource('%s', '%s')(RRnRR/R#R?t query_source(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt querySourcescCs3t|t}tjd||jjj|S(sZReturn the list of sources of a zone. If zone is empty, use default zone. szone.getSources('%s')(RRnRR/R#R?R(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getSourcess cCstjd||fdS(Nszone.SourceAdded('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR/+scCstjd||fdS(Ns$zone.ZoneOfSourceChanged('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR20scCstjd||fdS(Nszone.SourceRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR55scCs^tjd||f|j||=td|}|jjj|||j||dS(Ns%zone.disableTimedRichRule('%s', '%s')trule_str(RR/R0RR#R?t remove_ruletRichRuleRemoved(R*R?truletobj((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedRichRule>s tssicCst|t}t|t}t|t}tjd||ftd|}|jjj|||}|dkrt j ||j ||}|j |||n|j ||||S(Nszone.addRichRule('%s', '%s')R:i(RRnRRR/RR#R?tadd_ruleRttimeout_add_secondsR?RBt RichRuleAdded(R*R?R=ttimeoutR<R>R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addRichRuleFs  cCst|t}t|t}tjd||ftd|}|jjj||}|j|||j |||S(Nszone.removeRichRule('%s', '%s')R:( RRnRR/RR#R?R;RDR<(R*R?R=R<R>R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveRichRuleZscCsZt|t}t|t}tjd||ftd|}|jjj||S(Nszone.queryRichRule('%s', '%s')R:(RRnRR/RR#R?t query_rule(R*R?R=R<R>((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryRichRulehs cCs3t|t}tjd||jjj|S(Nszone.getRichRules('%s')(RRnRR/R#R?t list_rules(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getRichRulessscCstjd|||fdS(Ns"zone.RichRuleAdded('%s', '%s', %d)(RR/(R*R?R=RD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRCscCstjd||fdS(Ns zone.RichRuleRemoved('%s', '%s')(RR/(R*R?R=((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR<scCsOtjd||f|j||=|jjj|||j||dS(Ns$zone.disableTimedService('%s', '%s')(RR/R0R#R?tremove_servicetServiceRemoved(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedServicescCst|t}t|t}t|t}tjd|||f|j||jjj||||}|dkrt j ||j ||}|j |||n|j ||||S(Nszone.addService('%s', '%s', %d)i(RRnRRR/R>R#R?t add_serviceRRBRMRBt ServiceAdded(R*R?RRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs   cCs~t|t}t|t}tjd||f|j||jjj||}|j|||j |||S(Nszone.removeService('%s', '%s')( RRnRR/R>R#R?RKRDRL(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeServices cCsKt|t}t|t}tjd||f|jjj||S(Nszone.queryService('%s', '%s')(RRnRR/R#R?t query_service(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryServicescCs3t|t}tjd||jjj|S(Nszone.getServices('%s')(RRnRR/R#R?t list_services(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getServicesscCstjd|||fdS(Ns!zone.ServiceAdded('%s', '%s', %d)(RR/(R*R?RRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyROs cCstjd||fdS(Nszone.ServiceRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRLscCs^tjd|||f|j|||f=|jjj||||j|||dS(Ns'zone.disableTimedPort('%s', '%s', '%s')(RR/R0R#R?t remove_portt PortRemoved(R*R?tporttprotocol((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedPorts  tsssicCst|t}t|t}t|t}t|t}tjd|||f|j||jjj|||||}|dkrt j ||j |||}|j |||f|n|j |||||S(Nszone.addPort('%s', '%s', '%s')i(RRnRRR/R>R#R?tadd_portRRBRYRBt PortAdded(R*R?RWRXRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddPorts  ! tssscCst|t}t|t}t|t}tjd|||f|j||jjj|||}|j|||f|j ||||S(Ns!zone.removePort('%s', '%s', '%s')( RRnRR/R>R#R?RURDRV(R*R?RWRXR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removePorts  cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns zone.queryPort('%s', '%s', '%s')(RRnRR/R#R?t query_port(R*R?RWRXR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryPorts taascCs3t|t}tjd||jjj|S(Nszone.getPorts('%s')(RRnRR/R#R?t list_ports(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetPortssicCs!tjd||||fdS(Ns$zone.PortAdded('%s', '%s', '%s', %d)(RR/(R*R?RWRXRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR\*s cCstjd|||fdS(Ns"zone.PortRemoved('%s', '%s', '%s')(RR/(R*R?RWRX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRV0s cCsOtjd||f|j||=|jjj|||j||dS(Ns%zone.disableTimedProtocol('%s', '%s')(RR/R0R#R?tremove_protocoltProtocolRemoved(R*R?RX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedProtocol:scCst|t}t|t}t|t}tjd||f|j||jjj||||}|dkrt j ||j ||}|j |||n|j ||||S(Nszone.enableProtocol('%s', '%s')i(RRnRRR/R>R#R?t add_protocolRRBRgRBt ProtocolAdded(R*R?RXRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addProtocolAs   cCs~t|t}t|t}tjd||f|j||jjj||}|j|||j |||S(Nszone.removeProtocol('%s', '%s')( RRnRR/R>R#R?ReRDRf(R*R?RXR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveProtocolVs cCsKt|t}t|t}tjd||f|jjj||S(Nszone.queryProtocol('%s', '%s')(RRnRR/R#R?tquery_protocol(R*R?RXR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryProtocolfscCs3t|t}tjd||jjj|S(Nszone.getProtocols('%s')(RRnRR/R#R?tlist_protocols(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getProtocolsqscCstjd|||fdS(Ns"zone.ProtocolAdded('%s', '%s', %d)(RR/(R*R?RXRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRi}s cCstjd||fdS(Ns zone.ProtocolRemoved('%s', '%s')(RR/(R*R?RX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRfscCsatjd|||f|j|d||f=|jjj||||j|||dS(Ns-zone.disableTimedSourcePort('%s', '%s', '%s')tsport(RR/R0R#R?tremove_source_porttSourcePortRemoved(R*R?RWRX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedSourcePorts  cCst|t}t|t}t|t}t|t}tjd|||f|j||jjj|||||}|dkrt j ||j |||}|j |d||f|n|j |||||S(Ns$zone.addSourcePort('%s', '%s', '%s')iRp(RRnRRR/R>R#R?tadd_source_portRRBRsRBtSourcePortAdded(R*R?RWRXRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addSourcePorts    cCst|t}t|t}t|t}tjd|||f|j||jjj|||}|j|d||f|j ||||S(Ns'zone.removeSourcePort('%s', '%s', '%s')Rp( RRnRR/R>R#R?RqRDRr(R*R?RWRXR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveSourcePorts  cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns&zone.querySourcePort('%s', '%s', '%s')(RRnRR/R#R?tquery_source_port(R*R?RWRXR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytquerySourcePorts  cCs3t|t}tjd||jjj|S(Nszone.getSourcePorts('%s')(RRnRR/R#R?tlist_source_ports(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetSourcePortsscCs!tjd||||fdS(Ns*zone.SourcePortAdded('%s', '%s', '%s', %d)(RR/(R*R?RWRXRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRus cCstjd|||fdS(Ns(zone.SourcePortRemoved('%s', '%s', '%s')(RR/(R*R?RWRX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRrscCs2|j|d=|jjj||j|dS(Nt masquerade(R0R#R?tremove_masqueradetMasqueradeRemoved(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedMasqueradestsicCst|t}t|t}tjd||j||jjj|||}|dkrt j ||j |}|j |d|n|j |||S(Nszone.addMasquerade('%s')iR|(RRnRRR/R>R#R?tadd_masqueradeRRBRRBtMasqueradeAdded(R*R?RDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addMasquerades   cCsct|t}tjd||j||jjj|}|j|d|j ||S(Nszone.removeMasquerade('%s')R|( RRnRR/R>R#R?R}RDR~(R*R?R<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveMasquerades  cCs3t|t}tjd||jjj|S(Nszone.queryMasquerade('%s')(RRnRR/R#R?tquery_masquerade(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryMasqueradescCstjd||fdS(Nszone.MasqueradeAdded('%s', %d)(RR/(R*R?RD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Nszone.MasqueradeRemoved('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR~scCsV|j|||||f=|jjj||||||j|||||dS(N(R0R#R?tremove_forward_porttForwardPortRemoved(R*R?RWRXttoportttoaddr((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisable_forward_port(stsssssic Cs t|t}t|t}t|t}t|t}t|t}t|t}tjd|||||f|j||jjj|||||||}|dkrt j ||j |||||} |j |||||f| n|j |||||||S(Ns1zone.addForwardPort('%s', '%s', '%s', '%s', '%s')i(RRnRRR/R>R#R?tadd_forward_portRRBRRBtForwardPortAdded( R*R?RWRXRRRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddForwardPort.s&      "tssssscCst|t}t|t}t|t}t|t}t|t}tjd|||||f|j||jjj|||||}|j|||||f|j ||||||S(Ns4zone.removeForwardPort('%s', '%s', '%s', '%s', '%s')( RRnRR/R>R#R?RRDR(R*R?RWRXRRR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveForwardPortKs   cCst|t}t|t}t|t}t|t}t|t}tjd|||||f|jjj|||||S(Ns3zone.queryForwardPort('%s', '%s', '%s', '%s', '%s')(RRnRR/R#R?tquery_forward_port(R*R?RWRXRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryForwardPortas cCs3t|t}tjd||jjj|S(Nszone.getForwardPorts('%s')(RRnRR/R#R?tlist_forward_ports(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetForwardPortsrscCs'tjd||||||fdS(Ns7zone.ForwardPortAdded('%s', '%s', '%s', '%s', '%s', %d)(RR/(R*R?RWRXRRRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR~s cCs$tjd|||||fdS(Ns5zone.ForwardPortRemoved('%s', '%s', '%s', '%s', '%s')(RR/(R*R?RWRXRR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCsOtjd||f|j||=|jjj|||j||dS(Ns&zone.disableTimedIcmpBlock('%s', '%s')(RR/R0R#R?tremove_icmp_blocktIcmpBlockRemoved(R*R?ticmpR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedIcmpBlockscCst|t}t|t}t|t}tjd||f|j||jjj||||}|dkrt j ||j |||}|j |||n|j ||||S(Ns zone.enableIcmpBlock('%s', '%s')i(RRnRRR/R>R#R?tadd_icmp_blockRRBRRBtIcmpBlockAdded(R*R?RRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addIcmpBlocks  cCs~t|t}t|t}tjd||f|j||jjj||}|j|||j |||S(Ns zone.removeIcmpBlock('%s', '%s')( RRnRR/R>R#R?RRDR(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveIcmpBlocks cCsKt|t}t|t}tjd||f|jjj||S(Nszone.queryIcmpBlock('%s', '%s')(RRnRR/R#R?tquery_icmp_block(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryIcmpBlockscCs3t|t}tjd||jjj|S(Nszone.getIcmpBlocks('%s')(RRnRR/R#R?tlist_icmp_blocks(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getIcmpBlocksscCstjd|||fdS(Ns#zone.IcmpBlockAdded('%s', '%s', %d)(RR/(R*R?RRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCstjd||fdS(Ns!zone.IcmpBlockRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCsVt|t}tjd||j||jjj||}|j||S(Ns zone.addIcmpBlockInversion('%s')( RRnRR/R>R#R?tadd_icmp_block_inversiontIcmpBlockInversionAdded(R*R?R<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddIcmpBlockInversions   cCsSt|t}tjd||j||jjj|}|j||S(Ns#zone.removeIcmpBlockInversion('%s')( RRnRR/R>R#R?tremove_icmp_block_inversiontIcmpBlockInversionRemoved(R*R?R<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveIcmpBlockInversions   cCs3t|t}tjd||jjj|S(Ns"zone.queryIcmpBlockInversion('%s')(RRnRR/R#R?tquery_icmp_block_inversion(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryIcmpBlockInversionscCstjd|dS(Ns"zone.IcmpBlockInversionAdded('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Ns$zone.IcmpBlockInversionRemoved('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR scCst|t}t|t}t|t}tjd|||f|j||jjj||||j|||dS(Ns!direct.addChain('%s', '%s', '%s')( RRnRR/R>R#Rt add_chaint ChainAdded(R*tipvttabletchainR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddChains cCst|t}t|t}t|t}tjd|||f|j||jjj||||j|||dS(Ns$direct.removeChain('%s', '%s', '%s')( RRnRR/R>R#Rt remove_chaint ChainRemoved(R*RRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeChain%s cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns#direct.queryChain('%s', '%s', '%s')(RRnRR/R#Rt query_chain(R*RRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryChain3s cCsKt|t}t|t}tjd||f|jjj||S(Nsdirect.getChains('%s', '%s')(RRnRR/R#Rt get_chains(R*RRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getChains?ssa(sss)cCstjd|jjjS(Nsdirect.getAllChains()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getAllChainsJs cCstjd|||fdS(Ns#direct.ChainAdded('%s', '%s', '%s')(RR/(R*RRR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRSscCstjd|||fdS(Ns%direct.ChainRemoved('%s', '%s', '%s')(RR/(R*RRR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRXstsssiascCst|t}t|t}t|t}t|t}td|D}tjd||||dj|f|j||jj j ||||||j |||||dS(Ncss|]}t|tVqdS(N(RRn(t.0R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys lss*direct.addRule('%s', '%s', '%s', %d, '%s')s','( RRnRttupleRR/tjoinR>R#RRAt RuleAdded(R*RRRtpriorityR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddRulebs   cCst|t}t|t}t|t}t|t}td|D}tjd||||dj|f|j||jj j ||||||j |||||dS(Ncss|]}t|tVqdS(N(RRn(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys }ss-direct.removeRule('%s', '%s', '%s', %d, '%s')s','( RRnRRRR/RR>R#RR;t RuleRemoved(R*RRRRR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeRuless   cCst|t}t|t}t|t}tjd|||f|j|xa|jjj|||D]D\}}|jjj||||||j |||||qpWdS(Ns$direct.removeRules('%s', '%s', '%s')( RRnRR/R>R#Rt get_rulesR;R(R*RRRR<RR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeRuless (cCst|t}t|t}t|t}t|t}td|D}tjd||||dj|f|jjj |||||S(Ncss|]}t|tVqdS(N(RRn(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ss,direct.queryRule('%s', '%s', '%s', %d, '%s')s','( RRnRRRR/RR#RRG(R*RRRRR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryRules  sa(ias)cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns!direct.getRules('%s', '%s', '%s')(RRnRR/R#RR(R*RRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetRuless s a(sssias)cCstjd|jjjS(Nsdirect.getAllRules()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getAllRuless cCs-tjd||||dj|fdS(Ns,direct.RuleAdded('%s', '%s', '%s', %d, '%s')s','(RR/R(R*RRRRR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCs-tjd||||dj|fdS(Ns.direct.RuleRemoved('%s', '%s', '%s', %d, '%s')s','(RR/R(R*RRRRR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs RTcCst|t}td|D}tjd|dj|f|j|y|jjj ||SWnt k r}|d krt dddd g}nt dd g}t|}|j t jkrtt ||@d krtj|nt|nnXdS( Ncss|]}t|tVqdS(N(RRn(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ssdirect.passthrough('%s', '%s')s','tipv4tipv6s-Cs--checks-Ls--listi(RR(RRnRRR/RR>R#Rt passthroughR tsettcodeRtCOMMAND_FAILEDRRR (R*RR+R<R8t query_argstmsg((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs"     cCsyt|}td|D}tjd|dj|f|j||jjj|||j ||dS(Ncss|]}t|VqdS(N(R(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ss!direct.addPassthrough('%s', '%s')s','( RRRR/RR>R#Rtadd_passthroughtPassthroughAdded(R*RR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddPassthroughs   cCsyt|}td|D}tjd|dj|f|j||jjj|||j ||dS(Ncss|]}t|VqdS(N(R(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ss$direct.removePassthrough('%s', '%s')s','( RRRR/RR>R#Rtremove_passthroughtPassthroughRemoved(R*RR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremovePassthroughs   cCsXt|}td|D}tjd|dj|f|jjj||S(Ncss|]}t|VqdS(N(R(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys  ss#direct.queryPassthrough('%s', '%s')s','(RRRR/RR#Rtquery_passthrough(R*RR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryPassthroughs   sa(sas)cCstjd|jjjS(Nsdirect.getAllPassthroughs()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetAllPassthroughs s cCs;tjdx't|jD]}|j|q WdS(Nsdirect.removeAllPassthroughs()(RR/treversedRR(R*R<R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveAllPassthroughs s cCs/t|}tjd||jjj|S(Nsdirect.getPassthroughs('%s')(RRR/R#Rtget_passthroughs(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetPassthroughs s cCs$tjd|dj|fdS(Ns#direct.PassthroughAdded('%s', '%s')s','(RR/R(R*RR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR( s cCs$tjd|dj|fdS(Ns%direct.PassthroughRemoved('%s', '%s')s','(RR/R(R*RR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR. s cCsdS(s PK_ACTION_ALL implies all other actions, i.e. once a subject is authorized for PK_ACTION_ALL it's also authorized for any other action. Use-case is GUI (RHBZ#994729). N((R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt authorizeAll6 s cCs0t|}tjd||jjj|S(Nsipset.queryIPSet('%s')(RRR/R#Rt query_ipset(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryIPSetE s cCstjd|jjjS(Nsipsets.getIPSets()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getIPSetsO s cCs8t|t}tjd||jjj|jS(NsgetIPSetSettings(%s)(RRnRR/R#Rt get_ipsetR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRX scCsft|}t|}tjd||f|j||jjj|||j||dS(Nsipset.addEntry('%s', '%s')(RRR/R>R#Rt add_entryt EntryAdded(R*RtentryR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddEntryd s    cCsft|}t|}tjd||f|j||jjj|||j||dS(Nsipset.removeEntry('%s', '%s')(RRR/R>R#Rt remove_entryt EntryRemoved(R*RRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeEntryq s    cCsEt|}t|}tjd||f|jjj||S(Nsipset.queryEntry('%s', '%s')(RRR/R#Rt query_entry(R*RRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryEntry~ s  cCs0t|}tjd||jjj|S(Nsipset.getEntries('%s')(RRR/R#Rt get_entries(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getEntries s cCst|}t|t}tjd|dj||jjj|}|jjj||t |}t |}x"||D]}|j ||qWx"||D]}|j ||qWdS(Nsipset.setEntries('%s', '[%s]')t,( RtlistRR/RR#RRt set_entriesRRR(R*RtentriesR<t old_entriestold_entries_sett entries_setR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt setEntries s   cCs3t|}t|}tjd||fdS(Nsipset.EntryAdded('%s', '%s')(RRR/(R*RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR s  cCs3t|}t|}tjd||fdS(Nsipset.EntryRemoved('%s', '%s')(RRR/(R*RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR s  cCstjd|jjjS(Nshelpers.getHelpers()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getHelpers s cCs8t|t}tjd||jjj|jS(NsgetHelperSettings(%s)(RRnRR/R#Rt get_helperR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR sN(t__name__t __module__t__doc__Rt persistentRR'tPK_ACTION_CONFIGtdefault_polkit_auth_requiredR R"R.R&R-R R>RBRDRFRiR tPROPERTIES_IFACER7RuRytsliptpolkitt require_authR|RtsignalRtPK_ACTION_INFOtINTROSPECTABLE_IFACERR(RRRRRtPK_ACTION_POLICIESRqRRtPK_ACTION_POLICIES_INFORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRtPK_ACTION_CONFIG_INFORtDBUS_SIGNATURERRRRRRRRRRR R R RRRRoRRRRR R$R&R%RR,RR"R-R(R*R0R3R6R8R9R/R2R5R?RERFRHRJRCR<RMRRPRRRTRORLRYR]R_RaRdR\RVRgRjRkRmRoRiRfRsRvRwRyR{RuRrRRRRRR~RRRRRRRRRRRRRRRRRRRtPK_ACTION_DIRECTRpRRtPK_ACTION_DIRECT_INFORRRRRRRRRRRRRRRRRRRRRRt PK_ACTION_ALLRRrRRRRRRRRRRRRRR(((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRBs    0"$                                                                 (<t__all__t gi.repositoryRRtsystmodulesR't dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.core.fwRtfirewall.core.richRtfirewall.core.loggerRtfirewall.clientRtfirewall.server.decoratorsR R R R tfirewall.server.configR tfirewall.dbus_utilsRRRRRRRtfirewall.core.io.functionsRtfirewall.core.io.zoneRtfirewall.core.io.ipsetRtfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.helperRtfirewall.core.fw_nmRRRtfirewall.core.fw_ifcfgRRtfirewall.errorsR RtObjectR(((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyts4       "4PK[rΗ"U"U+site-packages/firewall/server/firewalld.pycnu[ c`c@sdgZddlmZmZddlZeejdejjjejj-eejj*d dd d edd5Z?ejjjejj-eejj*d dd d'edd6Z@ejjejj*dded7ZAejjejj*dded8ZBejjjejj)eejj*d dd dedd9ZCejjjejj)eejj*d dd dedd:ZDejjjejj-eejj*d dd d edd;ZEejjjejj-eejj*d dd d'edd<ZFejjejj*dded=ZGejjejj*dded>ZHejjjejjeejj#d dd dedd?ZIejjjejjeejj#d dd dedd@ZJejjjejj eejj#d dd d eddAZKejjejj#ddedBZLejjejj#ddedCZMejjjejjNeejj#d dd eOjPeddDZQejjjejj eejj#d dd d'eddEZRejjjejjNeejj#d dd eSjPeddFZTejjjejj eejj#d dd d'eddGZUejjjejjNeejj#d dd eVjPeddHZWejjjejjNeejj#d dd deddIZXejjjejjeejj#d dd deddJZYejjejj#ddedKZZejjjejjNeejj#d dd deddLZ[ejjjejjeejj#d dd deddMZ\ejjejj#ddedNZ]ejjjejj eejj#d dd deddOZ^ejjjejjeejj#d dd deddPZ_ejjejj#ddedQZ`ejjjejj eejjad dd d'eddRZbejjjejj eejjad dd dSeddTZcejjjejj eejjad dd deddUZdejjjejj eejjad dd deddVZeejjjejjNeejjad dd d eddWZfejjjejjeejjad d d deddXZgejjjejjeejjad d d deddYZhejjjejjeejjad d d deddZZiejjjejjeejjad d d dedd[ZjejjjejjNeejjad d d d edd\ZkejjjejjNeejjad dd d'edd]Zlejjejjadd ed^Zmejjejjadd ed_Znejjejjadd ed`Zoejjejjadd edaZpejjjejjeejjad d d deddbZqejjjejjeejjad d d deddcZrejjjejjeejjad d d dedddZsejjjejjNeejjad d d d eddeZtejjjejjNeejjad dd d'eddfZuejjejjadd edgZvejjejjadd edhZwejjejjadd ediZxedjZyejjjejjeejjad dkd deddlZzejjjejjeejjad d d deddmZ{ejjjejjNeejjad d d d eddnZ|ejjjejjNeejjad dd d'eddoZ}ejjejjaddkedpZ~ejjejjadd edqZedrZejjjejjeejjad dkd deddsZejjjejjeejjad d d deddtZejjjejjNeejjad d d d edduZejjjejjNeejjad dd d'eddvZejjejjaddkedwZejjejjadd edxZedyZejjjejjeejjad dzd dedd{Zejjjejjeejjad d|d dedd}ZejjjejjNeejjad d|d d edd~ZejjjejjNeejjad dd deddZejjejjaddzeddZejjejjadd|edZedZejjjejjeejjad dkd deddZejjjejjeejjad d d deddZejjjejjNeejjad d d d eddZejjjejjNeejjad dd d'eddZejjejjaddkeddZejjejjadd edZedZejjjejjeejjad dzd deddZejjjejjeejjad d|d deddZejjjejjNeejjad d|d d eddZejjjejjNeejjad dd deddZejjejjaddzeddZejjejjadd|edZedZejjjejjeejjad dd deddZejjjejjeejjad dd deddZejjjejjNeejjad dd d eddZejjejjaddeddZejjejjaddedZedZejjjejjeejjad dd deddZejjjejjeejjad dd deddZejjjejjNeejjad dd d eddZejjjejjNeejjad dd deddZejjejjaddeddZejjejjaddedZedZejjjejjeejjad dkd deddZejjjejjeejjad d d deddZejjjejjNeejjad d d d eddZejjjejjNeejjad dd d'eddZejjejjaddkeddZejjejjadd edZejjjejjeejjad dd deddZejjjejjeejjad dd deddZejjjejjNeejjad dd d eddZejjejjaddedZejjejjaddedZejjjejjeejjd d|d deddZejjjejjeejjd d|d deddZejjjejjeejjd d|d d eddZejjjejjeejjd d d d'eddZejjjejjeejjd dd deddZejjejjdd|edZejjejjdd|edZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd d|d deddZejjjejjeejjd dd d eddZejjjejjeejjd d|d deddZejjjejjeejjd dd deddZejjejjddedZejjejjddedZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd dd d eddZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjjejjeejjd dd deddZejjejjddedZejjejjddedZejjjejjeejj#d dd deddZejjjejj eejjd dd d eddZejjjejj eejjd dd d'eddZejjjejjNeejjd dd ejPeddZejjjejjeejjd d d deddZejjjejjeejjd d d deddZejjjejj eejjd d d d eddZejjjejj eejjd dd d'eddZejjjejjeejjd deddZejjejjdd edZejjejjdd edZejjjejj eejj#d dd d'eddZejjjejjNeejj#d dd ejPeddZRS(sFirewallD main classcOstt|j||t|_|d|_|d|_|jt|t j j t |jj |jt j j |_ dS(Nii(tsuperRt__init__RtfwtbusnametpathtstartRRtdbustDBUS_INTERFACER tDBUS_PATH_CONFIG(tselftargstkwargs((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR"Js    cCs|jdS(N(tstop(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt__del__UscCs#tjdi|_|jjS(Nsstart()(Rtdebug1t _timeoutsR#R&(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR&Xs  cCstjd|jjS(Nsstop()(RR/R#R-(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR-`s cCs|jjjr|dkr/tjddStj}t||}|jjj d|rfdSt ||}|jjj d|rdSt |}|jjj d|rdSt ||}|jjj d|rdSt tjdndS(Ns&Lockdown not possible, sender not set.tcontexttuidtusertcommandslockdown is enabled(R#tpoliciestquery_lockdowntNoneRterrorR't SystemBusRt access_checkRRRR Rt ACCESS_DENIED(R*tsendertbusR1R2R3R4((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt accessCheckis$    cCs4||jkri|j|RR'R(RfRgRoRpRqRr(R*RsRtt new_valueR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytSets:             Rvssa{sv}ascCsAt|t}t|}t|}tjd|||dS(Ns#PropertiesChanged('%s', '%s', '%s')(RRnRR/(R*Rstchanged_propertiestinvalidated_properties((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytPropertiesChangeds    cCsJtjdtt|j|j|jj}t||t j j S(Ns Introspect()( Rtdebug2R!Rt IntrospectR%R$tget_busRRR'R((R*R<tdata((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR's   tcCs5tjd|jj|jj|jdS(s#Reload the firewall rules. sreload()N(RR/R#treloadRtReloaded(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR5s   cCs8tjd|jjt|jj|jdS(sCompletely reload the firewall. Completely reload the firewall: Stops firewall, unloads modules and starts the firewall again. scompleteReload()N(RR/R#RtTrueRR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytcompleteReloadDs  cCstjddS(Ns Reloaded()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRTscCstjdt|jdS(s&Check permanent configuration scheckPermanentConfig()N(RR/RR#(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytcheckPermanentConfigYs c Csotjdt}|jj}x|jjjD]}|j|}y||kr|jj |}|j |krtjd||j |qtjd|n$tjd||jj ||Wq5t k r }tjd||ft}q5Xq5W|jj}x|jjjD]}|j|}y||kr|jj|}|j |krtjd||j |qtjd|n$tjd||jj||Wq0t k r}tjd ||ft}q0Xq0W|jj}x|jjjD]}y|j|}||kr|jj|}|j |krtjd ||j |qtjd |n$tjd ||jj||Wq+t k r}tjd ||ft}q+Xq+W|jj}t}x |jjjD]}|j |}t!|} |dk rBt} x_| j#D]Q} |jjj$|| |krotjd|| f| j%| t} qoqoWxc| j#D]U} y;t&| } | rt'|| r| j%| t} nWqt k r%qXqW| rB~| j(}qBnx!| j#D]} t)|| qOWy||kr|jj*|}|j |krtjd||j |qtjd|n$tjd||jj+||Wq/t k r%}tjd||ft}q/Xq/W|jj,}x|jj-j.D]}|j/|}y||kr|jj0|}|j |krtjd||j |qtjd|n$tjd||jj1||WqLt k r }tjd||ft}qLXqLW|jj2j3|jj2j4|jj2j5f}yF|jj |krtjd|jj |n tjdWn*t k r}tjd|t}nX|jj6j7j8}yF|jj |krtjd|jj9|n tjdWn*t k rR}tjd|t}nX|rkt:t;j<ndS(s-Make runtime configuration permanent scopyRuntimeToPermanent()sCopying service '%s' settingss$Service '%s' is identical, ignoring.sCreating service '%s's/Runtime To Permanent failed on service '%s': %ssCopying icmptype '%s' settingss%IcmpType '%s' is identical, ignoring.sCreating icmptype '%s's0Runtime To Permanent failed on icmptype '%s': %ssCopying ipset '%s' settingss"IPSet '%s' is identical, ignoring.sCreating ipset '%s's-Runtime To Permanent failed on ipset '%s': %ssEZone '%s': interface binding for '%s' has been added by NM, ignoring.sCopying zone '%s' settingss!Zone '%s' is identical, ignoring.sCreating zone '%s's,Runtime To Permanent failed on zone '%s': %ssCopying helper '%s' settingss#Helper '%s' is identical, ignoring.sCreating helper '%s's.Runtime To Permanent failed on helper '%s': %ssCopying direct configurations,Direct configuration is identical, ignoring.s7Runtime To Permanent failed on direct configuration: %ssCopying policies configurations.Policies configuration is identical, ignoring.s9Runtime To Permanent failed on policies configuration: %sN(=RR/tFalseRtgetServiceNamesR#tservicet get_servicestgetServiceSettingstgetServiceByNamet getSettingstupdatet addServicet ExceptiontwarningRtgetIcmpTypeNamesticmptypet get_icmptypestgetIcmpTypeSettingstgetIcmpTypeByNamet addIcmpTypet getIPSetNamestipsett get_ipsetstgetIPSetSettingstgetIPSetByNametaddIPSett getZoneNamesRR?t get_zonestgetZoneSettingsRR7t getInterfacestinterface_get_sendertremoveInterfaceRRtsettingsRt getZoneByNametaddZonetgetHelperNamesthelpert get_helperstgetHelperSettingstgetHelperByNamet addHelpertdirecttget_all_chainst get_all_rulestget_all_passthroughsR5tlockdown_whitelistt export_configtsetLockdownWhitelistR RtRT_TO_PERM_FAILED( R*R<R8t config_namestnametconftconf_objtet nm_bus_nameRtchangedt interfacet connection((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytruntimeToPermanentes                     cCs8tjd|j||jjj|jdS(s!Enable lockdown policies spolicies.enableLockdown()N(RR/R>R#R5tenable_lockdowntLockdownEnabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytenableLockdown$s  cCs8tjd|j||jjj|jdS(s"Disable lockdown policies spolicies.disableLockdown()N(RR/R>R#R5tdisable_lockdowntLockdownDisabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableLockdown0s  tbcCstjd|jjjS(s+Retuns True if lockdown is enabled spolicies.queryLockdown()(RR/R#R5R6(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryLockdown<s cCstjddS(NsLockdownEnabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRGscCstjddS(NsLockdownDisabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRLscCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown command s*policies.addLockdownWhitelistCommand('%s')N( RRnRR/R>R#R5Rt add_commandtLockdownWhitelistCommandAdded(R*R4R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistCommandUs  cCsTt|t}tjd||j||jjjj||j |dS(s Remove lockdown command s-policies.removeLockdownWhitelistCommand('%s')N( RRnRR/R>R#R5Rtremove_commandtLockdownWhitelistCommandRemoved(R*R4R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistCommandbs  cCs6t|t}tjd||jjjj|S(sQuery lockdown command s,policies.queryLockdownWhitelistCommand('%s')(RRnRR/R#R5Rt has_command(R*R4R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistCommandostascCs tjd|jjjjS(sAdd lockdown command s'policies.getLockdownWhitelistCommands()(RR/R#R5Rt get_commands(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistCommands{s cCstjd|dS(Ns#LockdownWhitelistCommandAdded('%s')(RR/(R*R4((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Ns%LockdownWhitelistCommandRemoved('%s')(RR/(R*R4((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRsticCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown uid s&policies.addLockdownWhitelistUid('%s')N( RtintRR/R>R#R5Rtadd_uidtLockdownWhitelistUidAdded(R*R2R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistUids  cCsTt|t}tjd||j||jjjj||j |dS(sRemove lockdown uid s)policies.removeLockdownWhitelistUid('%s')N( RRRR/R>R#R5Rt remove_uidtLockdownWhitelistUidRemoved(R*R2R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistUids  cCs6t|t}tjd||jjjj|S(sQuery lockdown uid s(policies.queryLockdownWhitelistUid('%s')(RRRR/R#R5Rthas_uid(R*R2R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistUidstaicCs tjd|jjjjS(sAdd lockdown uid s#policies.getLockdownWhitelistUids()(RR/R#R5Rtget_uids(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistUidss cCstjd|dS(NsLockdownWhitelistUidAdded(%d)(RR/(R*R2((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(NsLockdownWhitelistUidRemoved(%d)(RR/(R*R2((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown user s'policies.addLockdownWhitelistUser('%s')N( RRnRR/R>R#R5Rtadd_usertLockdownWhitelistUserAdded(R*R3R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistUsers  cCsTt|t}tjd||j||jjjj||j |dS(sRemove lockdown user s*policies.removeLockdownWhitelistUser('%s')N( RRnRR/R>R#R5Rt remove_usertLockdownWhitelistUserRemoved(R*R3R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistUsers  cCs6t|t}tjd||jjjj|S(sQuery lockdown user s)policies.queryLockdownWhitelistUser('%s')(RRnRR/R#R5Rthas_user(R*R3R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistUserscCs tjd|jjjjS(sAdd lockdown user s$policies.getLockdownWhitelistUsers()(RR/R#R5Rt get_users(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistUserss cCstjd|dS(Ns LockdownWhitelistUserAdded('%s')(RR/(R*R3((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Ns"LockdownWhitelistUserRemoved('%s')(RR/(R*R3((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCsTt|t}tjd||j||jjjj||j |dS(sAdd lockdown context s*policies.addLockdownWhitelistContext('%s')N( RRnRR/R>R#R5Rt add_contexttLockdownWhitelistContextAdded(R*R1R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddLockdownWhitelistContext s  cCsTt|t}tjd||j||jjjj||j |dS(s Remove lockdown context s-policies.removeLockdownWhitelistContext('%s')N( RRnRR/R>R#R5Rtremove_contexttLockdownWhitelistContextRemoved(R*R1R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveLockdownWhitelistContexts  cCs6t|t}tjd||jjjj|S(sQuery lockdown context s,policies.queryLockdownWhitelistContext('%s')(RRnRR/R#R5Rt has_context(R*R1R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryLockdownWhitelistContext&scCs tjd|jjjjS(sAdd lockdown context s'policies.getLockdownWhitelistContexts()(RR/R#R5Rt get_contexts(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetLockdownWhitelistContexts2s cCstjd|dS(Ns#LockdownWhitelistContextAdded('%s')(RR/(R*R1((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR=scCstjd|dS(Ns%LockdownWhitelistContextRemoved('%s')(RR/(R*R1((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRBscCs5tjd|j||jj|jdS(snEnable panic mode. All ingoing and outgoing connections and packets will be blocked. senablePanicMode()N(RR/R>R#tenable_panic_modetPanicModeEnabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytenablePanicModeKs   cCs5tjd|j||jj|jdS(sDisable panic mode. Enables normal mode: Allowed ingoing and outgoing connections will not be blocked anymore sdisablePanicMode()N(RR/R>R#tdisable_panic_modetPanicModeDisabled(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisablePanicModeYs   cCstjd|jjS(NsqueryPanicMode()(RR/R#tquery_panic_mode(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryPanicModehs cCstjddS(NsPanicModeEnabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRqscCstjddS(NsPanicModeDisabled()(RR/(R*((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRvscCs2t|t}tjd||jjj|S(NsgetZoneSettings(%s)(RRnRR/R#R?tget_config_with_settings(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjjS(NslistServices()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt listServicess cCs8t|t}tjd||jjj|jS(NsgetServiceSettings(%s)(RRnRR/R#Rt get_serviceR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjjS(NslistIcmpTypes()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt listIcmpTypess cCs8t|t}tjd||jjj|jS(NsgetIcmpTypeSettings(%s)(RRnRR/R#Rt get_icmptypeR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjS(NsgetLogDenied()(RR/R#tget_log_denied(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getLogDenieds cCsrt|t}tjd||j||jj||j||jj|j j|j dS(NssetLogDenied('%s')( RRnRR/R>R#tset_log_deniedtLogDeniedChangedRRR(R*tvalueR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt setLogDenieds    cCstjd|dS(NsLogDeniedChanged('%s')(RR/(R*R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjS(NsgetAutomaticHelpers()(RR/R#tget_automatic_helpers(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetAutomaticHelperss cCsrt|t}tjd||j||jj||j||jj|j j|j dS(NssetAutomaticHelpers('%s')( RRnRR/R>R#tset_automatic_helperstAutomaticHelpersChangedRRR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytsetAutomaticHelperss    cCstjd|dS(NsAutomaticHelpersChanged('%s')(RR/(R*R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR scCstjd|jjS(NsgetDefaultZone()(RR/R#tget_default_zone(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetDefaultZones cCsNt|t}tjd||j||jj||j|dS(NssetDefaultZone('%s')(RRnRR/R>R#tset_default_zonetDefaultZoneChanged(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytsetDefaultZones  cCstjd|dS(NsDefaultZoneChanged('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|jjjS(Nszone.getZones()(RR/R#R?R(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetZoness s a{sa{sas}}cCstjdi}x|jjjD]}|jjj|}|jjj|}t|t|dkr&i||R#R?t add_interfacetInterfaceAdded(R*R?RR<t_zone((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addInterfaceds cCs1t|t}t|t}|j|||S(sChange a zone an interface is part of. If zone is empty, use default zone. This function is deprecated, use changeZoneOfInterface instead (RRntchangeZoneOfInterface(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt changeZoneus cCsqt|t}t|t}tjd||f|j||jjj|||}|j|||S(s[Change a zone an interface is part of. If zone is empty, use default zone. s&zone.changeZoneOfInterface('%s', '%s')( RRnRR/R>R#R?tchange_zone_of_interfacetZoneOfInterfaceChanged(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR%s cCsnt|t}t|t}tjd||f|j||jjj||}|j|||S(skRemove interface from a zone. If zone is empty, remove from zone the interface belongs to. s zone.removeInterface('%s', '%s')( RRnRR/R>R#R?tremove_interfacetInterfaceRemoved(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCsKt|t}t|t}tjd||f|jjj||S(s^Return true if an interface is in a zone. If zone is empty, use default zone. szone.queryInterface('%s', '%s')(RRnRR/R#R?tquery_interface(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryInterfacescCs3t|t}tjd||jjj|S(s]Return the list of interfaces of a zone. If zone is empty, use default zone. szone.getInterfaces('%s')(RRnRR/R#R?R(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCstjd||fdS(Nszone.InterfaceAdded('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR"scCstjd||fdS(s, This signal is deprecated. szone.ZoneChanged('%s', '%s')N(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt ZoneChangedscCs+tjd||f|j||dS(Ns'zone.ZoneOfInterfaceChanged('%s', '%s')(RR/R-(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR(s  cCstjd||fdS(Ns!zone.InterfaceRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR*scCsqt|t}t|t}tjd||f|j||jjj|||}|j|||S(sLAdd a source to a zone. If zone is empty, use default zone. szone.addSource('%s', '%s')( RRnRR/R>R#R?t add_sourcet SourceAdded(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addSources cCsqt|t}t|t}tjd||f|j||jjj|||}|j|||S(sXChange a zone an source is part of. If zone is empty, use default zone. s#zone.changeZoneOfSource('%s', '%s')( RRnRR/R>R#R?tchange_zone_of_sourcetZoneOfSourceChanged(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytchangeZoneOfSources cCsnt|t}t|t}tjd||f|j||jjj||}|j|||S(seRemove source from a zone. If zone is empty, remove from zone the source belongs to. szone.removeSource('%s', '%s')( RRnRR/R>R#R?t remove_sourcet SourceRemoved(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeSources cCsKt|t}t|t}tjd||f|jjj||S(s[Return true if an source is in a zone. If zone is empty, use default zone. szone.querySource('%s', '%s')(RRnRR/R#R?t query_source(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt querySourcescCs3t|t}tjd||jjj|S(sZReturn the list of sources of a zone. If zone is empty, use default zone. szone.getSources('%s')(RRnRR/R#R?R(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getSourcess cCstjd||fdS(Nszone.SourceAdded('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR/+scCstjd||fdS(Ns$zone.ZoneOfSourceChanged('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR20scCstjd||fdS(Nszone.SourceRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR55scCs^tjd||f|j||=td|}|jjj|||j||dS(Ns%zone.disableTimedRichRule('%s', '%s')trule_str(RR/R0RR#R?t remove_ruletRichRuleRemoved(R*R?truletobj((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedRichRule>s tssicCst|t}t|t}t|t}tjd||ftd|}|jjj|||}|dkrt j ||j ||}|j |||n|j ||||S(Nszone.addRichRule('%s', '%s')R:i(RRnRRR/RR#R?tadd_ruleRttimeout_add_secondsR?RBt RichRuleAdded(R*R?R=ttimeoutR<R>R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addRichRuleFs  cCst|t}t|t}tjd||ftd|}|jjj||}|j|||j |||S(Nszone.removeRichRule('%s', '%s')R:( RRnRR/RR#R?R;RDR<(R*R?R=R<R>R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveRichRuleZscCsZt|t}t|t}tjd||ftd|}|jjj||S(Nszone.queryRichRule('%s', '%s')R:(RRnRR/RR#R?t query_rule(R*R?R=R<R>((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryRichRulehs cCs3t|t}tjd||jjj|S(Nszone.getRichRules('%s')(RRnRR/R#R?t list_rules(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getRichRulessscCstjd|||fdS(Ns"zone.RichRuleAdded('%s', '%s', %d)(RR/(R*R?R=RD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRCscCstjd||fdS(Ns zone.RichRuleRemoved('%s', '%s')(RR/(R*R?R=((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR<scCsOtjd||f|j||=|jjj|||j||dS(Ns$zone.disableTimedService('%s', '%s')(RR/R0R#R?tremove_servicetServiceRemoved(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedServicescCst|t}t|t}t|t}tjd|||f|j||jjj||||}|dkrt j ||j ||}|j |||n|j ||||S(Nszone.addService('%s', '%s', %d)i(RRnRRR/R>R#R?t add_serviceRRBRMRBt ServiceAdded(R*R?RRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs   cCs~t|t}t|t}tjd||f|j||jjj||}|j|||j |||S(Nszone.removeService('%s', '%s')( RRnRR/R>R#R?RKRDRL(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeServices cCsKt|t}t|t}tjd||f|jjj||S(Nszone.queryService('%s', '%s')(RRnRR/R#R?t query_service(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryServicescCs3t|t}tjd||jjj|S(Nszone.getServices('%s')(RRnRR/R#R?t list_services(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getServicesscCstjd|||fdS(Ns!zone.ServiceAdded('%s', '%s', %d)(RR/(R*R?RRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyROs cCstjd||fdS(Nszone.ServiceRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRLscCs^tjd|||f|j|||f=|jjj||||j|||dS(Ns'zone.disableTimedPort('%s', '%s', '%s')(RR/R0R#R?t remove_portt PortRemoved(R*R?tporttprotocol((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedPorts  tsssicCst|t}t|t}t|t}t|t}tjd|||f|j||jjj|||||}|dkrt j ||j |||}|j |||f|n|j |||||S(Nszone.addPort('%s', '%s', '%s')i(RRnRRR/R>R#R?tadd_portRRBRYRBt PortAdded(R*R?RWRXRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddPorts  ! tssscCst|t}t|t}t|t}tjd|||f|j||jjj|||}|j|||f|j ||||S(Ns!zone.removePort('%s', '%s', '%s')( RRnRR/R>R#R?RURDRV(R*R?RWRXR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removePorts  cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns zone.queryPort('%s', '%s', '%s')(RRnRR/R#R?t query_port(R*R?RWRXR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryPorts taascCs3t|t}tjd||jjj|S(Nszone.getPorts('%s')(RRnRR/R#R?t list_ports(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetPortssicCs!tjd||||fdS(Ns$zone.PortAdded('%s', '%s', '%s', %d)(RR/(R*R?RWRXRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR\*s cCstjd|||fdS(Ns"zone.PortRemoved('%s', '%s', '%s')(RR/(R*R?RWRX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRV0s cCsOtjd||f|j||=|jjj|||j||dS(Ns%zone.disableTimedProtocol('%s', '%s')(RR/R0R#R?tremove_protocoltProtocolRemoved(R*R?RX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedProtocol:scCst|t}t|t}t|t}tjd||f|j||jjj||||}|dkrt j ||j ||}|j |||n|j ||||S(Nszone.enableProtocol('%s', '%s')i(RRnRRR/R>R#R?t add_protocolRRBRgRBt ProtocolAdded(R*R?RXRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addProtocolAs   cCs~t|t}t|t}tjd||f|j||jjj||}|j|||j |||S(Nszone.removeProtocol('%s', '%s')( RRnRR/R>R#R?ReRDRf(R*R?RXR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveProtocolVs cCsKt|t}t|t}tjd||f|jjj||S(Nszone.queryProtocol('%s', '%s')(RRnRR/R#R?tquery_protocol(R*R?RXR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryProtocolfscCs3t|t}tjd||jjj|S(Nszone.getProtocols('%s')(RRnRR/R#R?tlist_protocols(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getProtocolsqscCstjd|||fdS(Ns"zone.ProtocolAdded('%s', '%s', %d)(RR/(R*R?RXRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRi}s cCstjd||fdS(Ns zone.ProtocolRemoved('%s', '%s')(RR/(R*R?RX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRfscCsatjd|||f|j|d||f=|jjj||||j|||dS(Ns-zone.disableTimedSourcePort('%s', '%s', '%s')tsport(RR/R0R#R?tremove_source_porttSourcePortRemoved(R*R?RWRX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedSourcePorts  cCst|t}t|t}t|t}t|t}tjd|||f|j||jjj|||||}|dkrt j ||j |||}|j |d||f|n|j |||||S(Ns$zone.addSourcePort('%s', '%s', '%s')iRp(RRnRRR/R>R#R?tadd_source_portRRBRsRBtSourcePortAdded(R*R?RWRXRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addSourcePorts    cCst|t}t|t}t|t}tjd|||f|j||jjj|||}|j|d||f|j ||||S(Ns'zone.removeSourcePort('%s', '%s', '%s')Rp( RRnRR/R>R#R?RqRDRr(R*R?RWRXR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveSourcePorts  cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns&zone.querySourcePort('%s', '%s', '%s')(RRnRR/R#R?tquery_source_port(R*R?RWRXR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytquerySourcePorts  cCs3t|t}tjd||jjj|S(Nszone.getSourcePorts('%s')(RRnRR/R#R?tlist_source_ports(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetSourcePortsscCs!tjd||||fdS(Ns*zone.SourcePortAdded('%s', '%s', '%s', %d)(RR/(R*R?RWRXRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRus cCstjd|||fdS(Ns(zone.SourcePortRemoved('%s', '%s', '%s')(RR/(R*R?RWRX((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRrscCs2|j|d=|jjj||j|dS(Nt masquerade(R0R#R?tremove_masqueradetMasqueradeRemoved(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedMasqueradestsicCst|t}t|t}tjd||j||jjj|||}|dkrt j ||j |}|j |d|n|j |||S(Nszone.addMasquerade('%s')iR|(RRnRRR/R>R#R?tadd_masqueradeRRBRRBtMasqueradeAdded(R*R?RDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addMasquerades   cCsct|t}tjd||j||jjj|}|j|d|j ||S(Nszone.removeMasquerade('%s')R|( RRnRR/R>R#R?R}RDR~(R*R?R<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveMasquerades  cCs3t|t}tjd||jjj|S(Nszone.queryMasquerade('%s')(RRnRR/R#R?tquery_masquerade(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryMasqueradescCstjd||fdS(Nszone.MasqueradeAdded('%s', %d)(RR/(R*R?RD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Nszone.MasqueradeRemoved('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR~scCsV|j|||||f=|jjj||||||j|||||dS(N(R0R#R?tremove_forward_porttForwardPortRemoved(R*R?RWRXttoportttoaddr((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisable_forward_port(stsssssic Cs t|t}t|t}t|t}t|t}t|t}t|t}tjd|||||f|j||jjj|||||||}|dkrt j ||j |||||} |j |||||f| n|j |||||||S(Ns1zone.addForwardPort('%s', '%s', '%s', '%s', '%s')i(RRnRRR/R>R#R?tadd_forward_portRRBRRBtForwardPortAdded( R*R?RWRXRRRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddForwardPort.s&      "tssssscCst|t}t|t}t|t}t|t}t|t}tjd|||||f|j||jjj|||||}|j|||||f|j ||||||S(Ns4zone.removeForwardPort('%s', '%s', '%s', '%s', '%s')( RRnRR/R>R#R?RRDR(R*R?RWRXRRR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveForwardPortKs   cCst|t}t|t}t|t}t|t}t|t}tjd|||||f|jjj|||||S(Ns3zone.queryForwardPort('%s', '%s', '%s', '%s', '%s')(RRnRR/R#R?tquery_forward_port(R*R?RWRXRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryForwardPortas cCs3t|t}tjd||jjj|S(Nszone.getForwardPorts('%s')(RRnRR/R#R?tlist_forward_ports(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetForwardPortsrscCs'tjd||||||fdS(Ns7zone.ForwardPortAdded('%s', '%s', '%s', '%s', '%s', %d)(RR/(R*R?RWRXRRRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR~s cCs$tjd|||||fdS(Ns5zone.ForwardPortRemoved('%s', '%s', '%s', '%s', '%s')(RR/(R*R?RWRXRR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCsOtjd||f|j||=|jjj|||j||dS(Ns&zone.disableTimedIcmpBlock('%s', '%s')(RR/R0R#R?tremove_icmp_blocktIcmpBlockRemoved(R*R?ticmpR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytdisableTimedIcmpBlockscCst|t}t|t}t|t}tjd||f|j||jjj||||}|dkrt j ||j |||}|j |||n|j ||||S(Ns zone.enableIcmpBlock('%s', '%s')i(RRnRRR/R>R#R?tadd_icmp_blockRRBRRBtIcmpBlockAdded(R*R?RRDR<R#RA((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt addIcmpBlocks  cCs~t|t}t|t}tjd||f|j||jjj||}|j|||j |||S(Ns zone.removeIcmpBlock('%s', '%s')( RRnRR/R>R#R?RRDR(R*R?RR<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveIcmpBlocks cCsKt|t}t|t}tjd||f|jjj||S(Nszone.queryIcmpBlock('%s', '%s')(RRnRR/R#R?tquery_icmp_block(R*R?RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryIcmpBlockscCs3t|t}tjd||jjj|S(Nszone.getIcmpBlocks('%s')(RRnRR/R#R?tlist_icmp_blocks(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getIcmpBlocksscCstjd|||fdS(Ns#zone.IcmpBlockAdded('%s', '%s', %d)(RR/(R*R?RRD((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCstjd||fdS(Ns!zone.IcmpBlockRemoved('%s', '%s')(RR/(R*R?R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCsVt|t}tjd||j||jjj||}|j||S(Ns zone.addIcmpBlockInversion('%s')( RRnRR/R>R#R?tadd_icmp_block_inversiontIcmpBlockInversionAdded(R*R?R<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddIcmpBlockInversions   cCsSt|t}tjd||j||jjj|}|j||S(Ns#zone.removeIcmpBlockInversion('%s')( RRnRR/R>R#R?tremove_icmp_block_inversiontIcmpBlockInversionRemoved(R*R?R<R#((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveIcmpBlockInversions   cCs3t|t}tjd||jjj|S(Ns"zone.queryIcmpBlockInversion('%s')(RRnRR/R#R?tquery_icmp_block_inversion(R*R?R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryIcmpBlockInversionscCstjd|dS(Ns"zone.IcmpBlockInversionAdded('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRscCstjd|dS(Ns$zone.IcmpBlockInversionRemoved('%s')(RR/(R*R?((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR scCst|t}t|t}t|t}tjd|||f|j||jjj||||j|||dS(Ns!direct.addChain('%s', '%s', '%s')( RRnRR/R>R#Rt add_chaint ChainAdded(R*tipvttabletchainR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddChains cCst|t}t|t}t|t}tjd|||f|j||jjj||||j|||dS(Ns$direct.removeChain('%s', '%s', '%s')( RRnRR/R>R#Rt remove_chaint ChainRemoved(R*RRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeChain%s cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns#direct.queryChain('%s', '%s', '%s')(RRnRR/R#Rt query_chain(R*RRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryChain3s cCsKt|t}t|t}tjd||f|jjj||S(Nsdirect.getChains('%s', '%s')(RRnRR/R#Rt get_chains(R*RRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getChains?ssa(sss)cCstjd|jjjS(Nsdirect.getAllChains()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getAllChainsJs cCstjd|||fdS(Ns#direct.ChainAdded('%s', '%s', '%s')(RR/(R*RRR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRSscCstjd|||fdS(Ns%direct.ChainRemoved('%s', '%s', '%s')(RR/(R*RRR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRXstsssiascCst|t}t|t}t|t}t|t}td|D}tjd||||dj|f|j||jj j ||||||j |||||dS(Ncss|]}t|tVqdS(N(RRn(t.0R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys lss*direct.addRule('%s', '%s', '%s', %d, '%s')s','( RRnRttupleRR/tjoinR>R#RRAt RuleAdded(R*RRRtpriorityR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddRulebs   cCst|t}t|t}t|t}t|t}td|D}tjd||||dj|f|j||jj j ||||||j |||||dS(Ncss|]}t|tVqdS(N(RRn(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys }ss-direct.removeRule('%s', '%s', '%s', %d, '%s')s','( RRnRRRR/RR>R#RR;t RuleRemoved(R*RRRRR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeRuless   cCst|t}t|t}t|t}tjd|||f|j|xa|jjj|||D]D\}}|jjj||||||j |||||qpWdS(Ns$direct.removeRules('%s', '%s', '%s')( RRnRR/R>R#Rt get_rulesR;R(R*RRRR<RR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeRuless (cCst|t}t|t}t|t}t|t}td|D}tjd||||dj|f|jjj |||||S(Ncss|]}t|tVqdS(N(RRn(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ss,direct.queryRule('%s', '%s', '%s', %d, '%s')s','( RRnRRRR/RR#RRG(R*RRRRR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryRules  sa(ias)cCs`t|t}t|t}t|t}tjd|||f|jjj|||S(Ns!direct.getRules('%s', '%s', '%s')(RRnRR/R#RR(R*RRRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetRuless s a(sssias)cCstjd|jjjS(Nsdirect.getAllRules()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getAllRuless cCs-tjd||||dj|fdS(Ns,direct.RuleAdded('%s', '%s', '%s', %d, '%s')s','(RR/R(R*RRRRR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs cCs-tjd||||dj|fdS(Ns.direct.RuleRemoved('%s', '%s', '%s', %d, '%s')s','(RR/R(R*RRRRR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs RTcCst|t}td|D}tjd|dj|f|j|y|jjj ||SWnt k r}|d krt dddd g}nt dd g}t|}|j t jkrtt ||@d krtj|nt|nnXdS( Ncss|]}t|tVqdS(N(RRn(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ssdirect.passthrough('%s', '%s')s','tipv4tipv6s-Cs--checks-Ls--listi(RR(RRnRRR/RR>R#Rt passthroughR tsettcodeRtCOMMAND_FAILEDRRR (R*RR+R<R8t query_argstmsg((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRs"     cCsyt|}td|D}tjd|dj|f|j||jjj|||j ||dS(Ncss|]}t|VqdS(N(R(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ss!direct.addPassthrough('%s', '%s')s','( RRRR/RR>R#Rtadd_passthroughtPassthroughAdded(R*RR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddPassthroughs   cCsyt|}td|D}tjd|dj|f|j||jjj|||j ||dS(Ncss|]}t|VqdS(N(R(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys ss$direct.removePassthrough('%s', '%s')s','( RRRR/RR>R#Rtremove_passthroughtPassthroughRemoved(R*RR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremovePassthroughs   cCsXt|}td|D}tjd|dj|f|jjj||S(Ncss|]}t|VqdS(N(R(RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pys  ss#direct.queryPassthrough('%s', '%s')s','(RRRR/RR#Rtquery_passthrough(R*RR+R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytqueryPassthroughs   sa(sas)cCstjd|jjjS(Nsdirect.getAllPassthroughs()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetAllPassthroughs s cCs;tjdx't|jD]}|j|q WdS(Nsdirect.removeAllPassthroughs()(RR/treversedRR(R*R<R((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytremoveAllPassthroughs s cCs/t|}tjd||jjj|S(Nsdirect.getPassthroughs('%s')(RRR/R#Rtget_passthroughs(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytgetPassthroughs s cCs$tjd|dj|fdS(Ns#direct.PassthroughAdded('%s', '%s')s','(RR/R(R*RR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR( s cCs$tjd|dj|fdS(Ns%direct.PassthroughRemoved('%s', '%s')s','(RR/R(R*RR+((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR. s cCsdS(s PK_ACTION_ALL implies all other actions, i.e. once a subject is authorized for PK_ACTION_ALL it's also authorized for any other action. Use-case is GUI (RHBZ#994729). N((R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt authorizeAll6 s cCs0t|}tjd||jjj|S(Nsipset.queryIPSet('%s')(RRR/R#Rt query_ipset(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryIPSetE s cCstjd|jjjS(Nsipsets.getIPSets()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getIPSetsO s cCs8t|t}tjd||jjj|jS(NsgetIPSetSettings(%s)(RRnRR/R#Rt get_ipsetR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRX scCsft|}t|}tjd||f|j||jjj|||j||dS(Nsipset.addEntry('%s', '%s')(RRR/R>R#Rt add_entryt EntryAdded(R*RtentryR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pytaddEntryd s    cCsft|}t|}tjd||f|j||jjj|||j||dS(Nsipset.removeEntry('%s', '%s')(RRR/R>R#Rt remove_entryt EntryRemoved(R*RRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt removeEntryq s    cCsEt|}t|}tjd||f|jjj||S(Nsipset.queryEntry('%s', '%s')(RRR/R#Rt query_entry(R*RRR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt queryEntry~ s  cCs0t|}tjd||jjj|S(Nsipset.getEntries('%s')(RRR/R#Rt get_entries(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getEntries s cCst|}t|t}tjd|dj||jjj|}|jjj||t |}t |}x"||D]}|j ||qWx"||D]}|j ||qWdS(Nsipset.setEntries('%s', '[%s]')t,( RtlistRR/RR#RRt set_entriesRRR(R*RtentriesR<t old_entriestold_entries_sett entries_setR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt setEntries s   cCs3t|}t|}tjd||fdS(Nsipset.EntryAdded('%s', '%s')(RRR/(R*RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR s  cCs3t|}t|}tjd||fdS(Nsipset.EntryRemoved('%s', '%s')(RRR/(R*RR((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR s  cCstjd|jjjS(Nshelpers.getHelpers()(RR/R#RR(R*R<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyt getHelpers s cCs8t|t}tjd||jjj|jS(NsgetHelperSettings(%s)(RRnRR/R#Rt get_helperR(R*RR<((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyR sN(t__name__t __module__t__doc__Rt persistentRR'tPK_ACTION_CONFIGtdefault_polkit_auth_requiredR R"R.R&R-R R>RBRDRFRiR tPROPERTIES_IFACER7RuRytsliptpolkitt require_authR|RtsignalRtPK_ACTION_INFOtINTROSPECTABLE_IFACERR(RRRRRtPK_ACTION_POLICIESRqRRtPK_ACTION_POLICIES_INFORRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRtPK_ACTION_CONFIG_INFORtDBUS_SIGNATURERRRRRRRRRRR R R RRRRoRRRRR R$R&R%RR,RR"R-R(R*R0R3R6R8R9R/R2R5R?RERFRHRJRCR<RMRRPRRRTRORLRYR]R_RaRdR\RVRgRjRkRmRoRiRfRsRvRwRyR{RuRrRRRRRR~RRRRRRRRRRRRRRRRRRRtPK_ACTION_DIRECTRpRRtPK_ACTION_DIRECT_INFORRRRRRRRRRRRRRRRRRRRRRt PK_ACTION_ALLRRrRRRRRRRRRRRRRR(((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyRBs    0"$                                                                 (<t__all__t gi.repositoryRRtsystmodulesR't dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.core.fwRtfirewall.core.richRtfirewall.core.loggerRtfirewall.clientRtfirewall.server.decoratorsR R R R tfirewall.server.configR tfirewall.dbus_utilsRRRRRRRtfirewall.core.io.functionsRtfirewall.core.io.zoneRtfirewall.core.io.ipsetRtfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.helperRtfirewall.core.fw_nmRRRtfirewall.core.fw_ifcfgRRtfirewall.errorsR RtObjectR(((s=/usr/lib/python2.7/site-packages/firewall/server/firewalld.pyts4       "4PK[GV|hh/site-packages/firewall/server/config_service.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # force use of pygobject3 in python-slip from gi.repository import GObject import sys sys.modules['gobject'] = GObject import dbus import dbus.service import slip.dbus import slip.dbus.service from firewall import config from firewall.dbus_utils import dbus_to_python, \ dbus_introspection_prepare_properties, \ dbus_introspection_add_properties from firewall.core.io.service import Service from firewall.core.logger import log from firewall.server.decorators import handle_exceptions, \ dbus_handle_exceptions, dbus_service_method from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class FirewallDConfig # ############################################################################ class FirewallDConfigService(slip.dbus.service.Object): """FirewallD main class""" persistent = True """ Make FirewallD persistent. """ default_polkit_auth_required = config.dbus.PK_ACTION_CONFIG """ Use PK_ACTION_INFO as a default """ @handle_exceptions def __init__(self, parent, conf, service, item_id, *args, **kwargs): super(FirewallDConfigService, self).__init__(*args, **kwargs) self.parent = parent self.config = conf self.obj = service self.item_id = item_id self.busname = args[0] self.path = args[1] self._log_prefix = "config.service.%d" % self.item_id dbus_introspection_prepare_properties( self, config.dbus.DBUS_INTERFACE_CONFIG_SERVICE) @dbus_handle_exceptions def __del__(self): pass @dbus_handle_exceptions def unregister(self): self.remove_from_connection() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # P R O P E R T I E S @dbus_handle_exceptions def _get_property(self, property_name): if property_name == "name": return dbus.String(self.obj.name) elif property_name == "filename": return dbus.String(self.obj.filename) elif property_name == "path": return dbus.String(self.obj.path) elif property_name == "default": return dbus.Boolean(self.obj.default) elif property_name == "builtin": return dbus.Boolean(self.obj.builtin) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @dbus_handle_exceptions def Get(self, interface_name, property_name, sender=None): # pylint: disable=W0613 # get a property interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) log.debug1("%s.Get('%s', '%s')", self._log_prefix, interface_name, property_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_SERVICE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return self._get_property(property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') @dbus_handle_exceptions def GetAll(self, interface_name, sender=None): # pylint: disable=W0613 interface_name = dbus_to_python(interface_name, str) log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_SERVICE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) ret = { } for x in [ "name", "filename", "path", "default", "builtin" ]: ret[x] = self._get_property(x) return dbus.Dictionary(ret, signature="sv") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ssv') @dbus_handle_exceptions def Set(self, interface_name, property_name, new_value, sender=None): interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) new_value = dbus_to_python(new_value) log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix, interface_name, property_name, new_value) self.parent.accessCheck(sender) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_SERVICE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.PropertyReadOnly: " "Property '%s' is read-only" % property_name) @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): interface_name = dbus_to_python(interface_name, str) changed_properties = dbus_to_python(changed_properties) invalidated_properties = dbus_to_python(invalidated_properties) log.debug1("%s.PropertiesChanged('%s', '%s', '%s')", self._log_prefix, interface_name, changed_properties, invalidated_properties) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(dbus.INTROSPECTABLE_IFACE, out_signature='s') @dbus_handle_exceptions def Introspect(self, sender=None): # pylint: disable=W0613 log.debug2("%s.Introspect()", self._log_prefix) data = super(FirewallDConfigService, self).Introspect( self.path, self.busname.get_bus()) return dbus_introspection_add_properties( self, data, config.dbus.DBUS_INTERFACE_CONFIG_SERVICE) # S E T T I N G S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature=Service.DBUS_SIGNATURE) @dbus_handle_exceptions def getSettings(self, sender=None): # pylint: disable=W0613 """get settings for service """ log.debug1("%s.getSettings()", self._log_prefix) return self.config.get_service_config(self.obj) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature=Service.DBUS_SIGNATURE) @dbus_handle_exceptions def update(self, settings, sender=None): """update settings for service """ settings = dbus_to_python(settings) log.debug1("%s.update('...')", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.set_service_config(self.obj, settings) self.Updated(self.obj.name) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE) @dbus_handle_exceptions def loadDefaults(self, sender=None): """load default settings for builtin service """ log.debug1("%s.loadDefaults()", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.load_service_defaults(self.obj) self.Updated(self.obj.name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, signature='s') @dbus_handle_exceptions def Updated(self, name): log.debug1("%s.Updated('%s')" % (self._log_prefix, name)) # R E M O V E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE) @dbus_handle_exceptions def remove(self, sender=None): """remove service """ log.debug1("%s.removeService()", self._log_prefix) self.parent.accessCheck(sender) self.config.remove_service(self.obj) self.parent.removeService(self.obj) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, signature='s') @dbus_handle_exceptions def Removed(self, name): log.debug1("%s.Removed('%s')" % (self._log_prefix, name)) # R E N A M E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def rename(self, name, sender=None): """rename service """ name = dbus_to_python(name, str) log.debug1("%s.rename('%s')", self._log_prefix, name) self.parent.accessCheck(sender) self.obj = self.config.rename_service(self.obj, name) self.Renamed(name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, signature='s') @dbus_handle_exceptions def Renamed(self, name): log.debug1("%s.Renamed('%s')" % (self._log_prefix, name)) # version @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='s') @dbus_handle_exceptions def getVersion(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getVersion()", self._log_prefix) return self.getSettings()[0] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def setVersion(self, version, sender=None): version = dbus_to_python(version, str) log.debug1("%s.setVersion('%s')", self._log_prefix, version) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[0] = version self.update(settings) # short @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='s') @dbus_handle_exceptions def getShort(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getShort()", self._log_prefix) return self.getSettings()[1] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def setShort(self, short, sender=None): short = dbus_to_python(short, str) log.debug1("%s.setShort('%s')", self._log_prefix, short) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[1] = short self.update(settings) # description @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='s') @dbus_handle_exceptions def getDescription(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getDescription()", self._log_prefix) return self.getSettings()[2] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def setDescription(self, description, sender=None): description = dbus_to_python(description, str) log.debug1("%s.setDescription('%s')", self._log_prefix, description) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[2] = description self.update(settings) # port @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='a(ss)') @dbus_handle_exceptions def getPorts(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getPorts()", self._log_prefix) return self.getSettings()[3] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='a(ss)') @dbus_handle_exceptions def setPorts(self, ports, sender=None): _ports = [ ] # convert embedded lists to tuples for port in dbus_to_python(ports, list): if isinstance(port, list): _ports.append(tuple(port)) else: _ports.append(port) ports = _ports log.debug1("%s.setPorts('[%s]')", self._log_prefix, ",".join("('%s, '%s')" % (port[0], port[1]) for port in ports)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[3] = ports self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss') @dbus_handle_exceptions def addPort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.addPort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) in settings[3]: raise FirewallError(errors.ALREADY_ENABLED, "%s:%s" % (port, protocol)) settings[3].append((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss') @dbus_handle_exceptions def removePort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.removePort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) not in settings[3]: raise FirewallError(errors.NOT_ENABLED, "%s:%s" % (port, protocol)) settings[3].remove((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryPort(self, port, protocol, sender=None): # pylint: disable=W0613 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.queryPort('%s', '%s')", self._log_prefix, port, protocol) return (port,protocol) in self.getSettings()[3] # protocol @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='as') @dbus_handle_exceptions def getProtocols(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getProtocols()", self._log_prefix) return self.getSettings()[6] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='as') @dbus_handle_exceptions def setProtocols(self, protocols, sender=None): protocols = dbus_to_python(protocols, list) log.debug1("%s.setProtocols('[%s]')", self._log_prefix, ",".join(protocols)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[6] = protocols self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def addProtocol(self, protocol, sender=None): protocol = dbus_to_python(protocol, str) log.debug1("%s.addProtocol('%s')", self._log_prefix, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if protocol in settings[6]: raise FirewallError(errors.ALREADY_ENABLED, protocol) settings[6].append(protocol) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def removeProtocol(self, protocol, sender=None): protocol = dbus_to_python(protocol, str) log.debug1("%s.removeProtocol('%s')", self._log_prefix, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if protocol not in settings[6]: raise FirewallError(errors.NOT_ENABLED, protocol) settings[6].remove(protocol) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryProtocol(self, protocol, sender=None): # pylint: disable=W0613 protocol = dbus_to_python(protocol, str) log.debug1("%s.queryProtocol(%s')", self._log_prefix, protocol) return protocol in self.getSettings()[6] # source port @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='a(ss)') @dbus_handle_exceptions def getSourcePorts(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getSourcePorts()", self._log_prefix) return self.getSettings()[7] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='a(ss)') @dbus_handle_exceptions def setSourcePorts(self, ports, sender=None): _ports = [ ] # convert embedded lists to tuples for port in dbus_to_python(ports, list): if isinstance(port, list): _ports.append(tuple(port)) else: _ports.append(port) ports = _ports log.debug1("%s.setSourcePorts('[%s]')", self._log_prefix, ",".join("('%s, '%s')" % (port[0], port[1]) for port in ports)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[7] = ports self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss') @dbus_handle_exceptions def addSourcePort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.addSourcePort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) in settings[7]: raise FirewallError(errors.ALREADY_ENABLED, "%s:%s" % (port, protocol)) settings[7].append((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss') @dbus_handle_exceptions def removeSourcePort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.removeSourcePort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) not in settings[7]: raise FirewallError(errors.NOT_ENABLED, "%s:%s" % (port, protocol)) settings[7].remove((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def querySourcePort(self, port, protocol, sender=None): # pylint: disable=W0613 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.querySourcePort('%s', '%s')", self._log_prefix, port, protocol) return (port,protocol) in self.getSettings()[7] # module @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='as') @dbus_handle_exceptions def getModules(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getModules()", self._log_prefix) return self.getSettings()[4] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='as') @dbus_handle_exceptions def setModules(self, modules, sender=None): modules = dbus_to_python(modules, list) _modules = [ ] for module in modules: if module.startswith("nf_conntrack_"): module = module.replace("nf_conntrack_", "") if "_" in module: module = module.replace("_", "-") _modules.append(module) modules = _modules log.debug1("%s.setModules('[%s]')", self._log_prefix, ",".join(modules)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[4] = modules self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def addModule(self, module, sender=None): module = dbus_to_python(module, str) if module.startswith("nf_conntrack_"): module = module.replace("nf_conntrack_", "") if "_" in module: module = module.replace("_", "-") log.debug1("%s.addModule('%s')", self._log_prefix, module) self.parent.accessCheck(sender) settings = list(self.getSettings()) if module in settings[4]: raise FirewallError(errors.ALREADY_ENABLED, module) settings[4].append(module) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def removeModule(self, module, sender=None): module = dbus_to_python(module, str) if module.startswith("nf_conntrack_"): module = module.replace("nf_conntrack_", "") if "_" in module: module = module.replace("_", "-") log.debug1("%s.removeModule('%s')", self._log_prefix, module) self.parent.accessCheck(sender) settings = list(self.getSettings()) if module not in settings[4]: raise FirewallError(errors.NOT_ENABLED, module) settings[4].remove(module) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryModule(self, module, sender=None): # pylint: disable=W0613 module = dbus_to_python(module, str) if module.startswith("nf_conntrack_"): module = module.replace("nf_conntrack_", "") if "_" in module: module = module.replace("_", "-") log.debug1("%s.queryModule('%s')", self._log_prefix, module) return module in self.getSettings()[4] # destination @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, out_signature='a{ss}') @dbus_handle_exceptions def getDestinations(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getDestinations()", self._log_prefix) return self.getSettings()[5] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='a{ss}') @dbus_handle_exceptions def setDestinations(self, destinations, sender=None): destinations = dbus_to_python(destinations, dict) log.debug1("%s.setDestinations({ipv4:'%s', ipv6:'%s'})", self._log_prefix, destinations.get('ipv4'), destinations.get('ipv6')) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[5] = destinations self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s', out_signature='s') @dbus_handle_exceptions def getDestination(self, family, sender=None): family = dbus_to_python(family, str) log.debug1("%s.getDestination('%s')", self._log_prefix, family) self.parent.accessCheck(sender) settings = list(self.getSettings()) if family not in settings[5]: raise FirewallError(errors.NOT_ENABLED, family) return settings[5][family] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss') @dbus_handle_exceptions def setDestination(self, family, address, sender=None): family = dbus_to_python(family, str) address = dbus_to_python(address, str) log.debug1("%s.setDestination('%s', '%s')", self._log_prefix, family, address) self.parent.accessCheck(sender) settings = list(self.getSettings()) if family in settings[5] and settings[5][family] == address: raise FirewallError(errors.ALREADY_ENABLED, "'%s': '%s'" % (family, address)) settings[5][family] = address self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='s') @dbus_handle_exceptions def removeDestination(self, family, sender=None): family = dbus_to_python(family, str) log.debug1("%s.removeDestination('%s')", self._log_prefix, family) self.parent.accessCheck(sender) settings = list(self.getSettings()) if family not in settings[5]: raise FirewallError(errors.NOT_ENABLED, family) del settings[5][family] self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_SERVICE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryDestination(self, family, address, sender=None): # pylint: disable=W0613 family = dbus_to_python(family, str) address = dbus_to_python(address, str) log.debug1("%s.queryDestination('%s', '%s')", self._log_prefix, family, address) settings = self.getSettings() return (family in settings[5] and address == settings[5][family]) PK[*!0o[o[0site-packages/firewall/server/config_service.pyonu[ c`c@sddlmZddlZeejdeejjdd(e d?d4Z?eejjdd e d?d5Z@eejjdd e d?d6ZAeejjdd dd&e d?d7ZBeejjdd8e d?d9ZCeejjdd8e d?d:ZDeejjdd dd e d?d;ZEeejjdde d?d<ZFeejjdd e d?d=ZGeejjdddd&e d?d>ZHRS(@sFirewallD main classcOs~tt|j||||_||_||_||_|d|_|d|_d|j|_ t |tj j dS(Niisconfig.service.%d( tsuperR t__init__tparentRtobjtitem_idtbusnametpatht _log_prefixRtdbustDBUS_INTERFACE_CONFIG_SERVICE(tselfRtconftserviceRtargstkwargs((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyR8s      cCsdS(N((R((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt__del__EscCs|jdS(N(tremove_from_connection(R((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt unregisterIscCs|dkrtj|jjS|dkr>tj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR R!RtBooleanR"R#t exceptionst DBusException(Rt property_name((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt _get_propertyQs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR&R'R)(Rtinterface_nameR(tsender((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytGetbs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||Msi( RRUt isinstancetappendttupleRR/RtjoinRR;RFRJ(RtportsR1t_portsRaRI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetPorts@s cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addPort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R tALREADY_ENABLEDRcRJ(RRatprotocolR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytaddPortSs cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R t NOT_ENABLEDRORJ(RRaRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt removePortcstbcCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.queryPort('%s', '%s')i(RR.RR/RRF(RRaRjR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt queryPortrs tascCs!tjd|j|jdS(Ns%s.getProtocols()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt getProtocols~scCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setProtocols('[%s]')R_i( RRURR/RReRR;RFRJ(Rt protocolsR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt setProtocolss cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addProtocol('%s')i(RR.RR/RRR;RURFR R RiRcRJ(RRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt addProtocolscCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeProtocol('%s')i(RR.RR/RRR;RURFR R RlRORJ(RRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytremoveProtocolscCs9t|t}tjd|j|||jdkS(Ns%s.queryProtocol(%s')i(RR.RR/RRF(RRjR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt queryProtocolscCs!tjd|j|jdS(Ns%s.getSourcePorts()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytgetSourcePortsscCsg}xIt|tD]8}t|trA|jt|q|j|qW|}tjd|jdjd|D|j j |t|j }||d<|j |dS(Ns%s.setSourcePorts('[%s]')R_css'|]}d|d|dfVqdS(s ('%s, '%s')iiN((R`Ra((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pys si( RRURbRcRdRR/RReRR;RFRJ(RRfR1RgRaRI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetSourcePortss cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addSourcePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R RiRcRJ(RRaRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt addSourcePorts cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removeSourcePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R RlRORJ(RRaRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytremoveSourcePortscCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.querySourcePort('%s', '%s')i(RR.RR/RRF(RRaRjR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytquerySourcePorts cCs!tjd|j|jdS(Ns%s.getModules()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt getModulesscCst|t}g}x`|D]X}|jdrg|jdd}d|krg|jdd}qgn|j|qW|}tjd|jdj||j j |t|j }||d<|j |dS(Nt nf_conntrack_tt_t-s%s.setModules('[%s]')R_i( RRUt startswithtreplaceRcRR/RReRR;RFRJ(RtmodulesR1t_modulestmoduleRI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt setModuless   cCst|t}|jdrT|jdd}d|krT|jdd}qTntjd|j||jj|t |j }||dkrt t j |n|dj||j|dS(NR}R~RRs%s.addModule('%s')i(RR.RRRR/RRR;RURFR R RiRcRJ(RRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt addModules cCst|t}|jdrT|jdd}d|krT|jdd}qTntjd|j||jj|t |j }||dkrt t j |n|dj||j|dS(NR}R~RRs%s.removeModule('%s')i(RR.RRRR/RRR;RURFR R RlRORJ(RRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt removeModule&s cCs~t|t}|jdrT|jdd}d|krT|jdd}qTntjd|j|||jdkS(NR}R~RRs%s.queryModule('%s')i(RR.RRRR/RRF(RRR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt queryModule7s sa{ss}cCs!tjd|j|jdS(Ns%s.getDestinations()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytgetDestinationsEscCswt|t}tjd|j|jd|jd|jj|t|j }||d<|j |dS(Ns*%s.setDestinations({ipv4:'%s', ipv6:'%s'})tipv4tipv6i( RtdictRR/RtgetRR;RURFRJ(Rt destinationsR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetDestinationsLs  cCsxt|t}tjd|j||jj|t|j}||dkrlt t j |n|d|S(Ns%s.getDestination('%s')i( RR.RR/RRR;RURFR R Rl(RtfamilyR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytgetDestinationYscCst|t}t|t}tjd|j|||jj|t|j}||dkr|d||krt t j d||fn||d|<|j |dS(Ns%s.setDestination('%s', '%s')is '%s': '%s'( RR.RR/RRR;RURFR R RiRJ(RRtaddressR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetDestinationfs $ cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|d|=|j |dS(Ns%s.removeDestination('%s')i( RR.RR/RRR;RURFR R RlRJ(RRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytremoveDestinationvs cCset|t}t|t}tjd|j|||j}||dkod||d|kS(Ns%s.queryDestination('%s', '%s')i(RR.RR/RRF(RRRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytqueryDestinations  N(It__name__t __module__t__doc__tTruet persistentRRtPK_ACTION_CONFIGtdefault_polkit_auth_requiredRRR RRR)R tPROPERTIES_IFACEtNoneR2R9tsliptpolkitt require_authR=RtsignalR@tPK_ACTION_INFOtINTROSPECTABLE_IFACERBRRtDBUS_SIGNATURERFRJRLRHRORPRSRRRTRWRXRZR[R]R^RhRkRmRoRqRsRtRuRvRwRxRyRzR{R|RRRRRRRRRR(((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyR 0sf  $                             (t gi.repositoryRtsysRRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.serviceRtfirewall.core.loggerRtfirewall.server.decoratorsRR R R tfirewall.errorsR RtObjectR (((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyts      PK[~x  (site-packages/firewall/server/server.pycnu[ c`c@sdgZddlZddlZddlmZmZeejd>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sGARBAGE OBJECTS (%d): s sP <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< (tcollecttlentgarbagettypeRttimeout_add_seconds(tx(tgct gc_collectt gc_timeoutR(s:/usr/lib/python2.7/site-packages/firewall/server/server.pyRLs tset_as_defaulttbustunix_signal_adds Stopping..s Raising SystemExit in run_serversException %s: %s(,tNonetpprintRRtenablet set_debugt DEBUG_LEAKtdbusR tglibt DBusGMainLoopRt SystemBusR tBusNameRtDBUS_INTERFACERt DBUS_PATHRtMainLooptslipt set_mainloopRthasattrRtunix_signal_add_fullt PRIORITY_HIGHtsignaltSIGHUPR tSIGTERMR truntKeyboardInterruptRtdebug1t SystemExitterrort Exceptiont __class__t__name__tstrtstop(tdebug_gcR RtnameR Rte((RRRRs:/usr/lib/python2.7/site-packages/firewall/server/server.pyRAsB           #(t__all__tsysR-t gi.repositoryRRtmodulesR t dbus.servicetdbus.mainloop.glibt slip.dbusR(tfirewallRtfirewall.core.loggerRtfirewall.server.firewalldRR R tFalseR(((s:/usr/lib/python2.7/site-packages/firewall/server/server.pyts          PK[)site-packages/firewall/server/__init__.pynu[PK[ZYrRR(site-packages/firewall/server/config.pyonu[ c`c@sddlmZddlZeejde"ejj1ddedvd3Z?e"ejj1ddedvd4Z@e"ejj1dddd+edvd5ZAe"ejj1dd-edvd6ZBe"ejj1dd7edvd8ZCe"ejj1dd7edvd9ZDe"ejj1dd7dd+edvd:ZEe"ejj1dd;edvd<ZFe"ejjGdd=edvd>ZHe"ejjGdd-edvd?ZIe"ejjGdddd@edvdAZJe"ejjGddeKj3dd@edvdBZLej+j,ejjGd"dedCZMe"ejjGdd=edvdDZNe"ejjGdd-edvdEZOe"ejjGdddd@edvdFZPe"ejjGddeQj3dd@edvdGZRej+j,ejjGd"dedHZSe"ejjGdd=edvdIZTe"ejjGdd-edvdJZUe"ejjGdddd@edvdKZVe"ejjGddeWj3dd@edvdLZXej+j,ejjGd"dedMZYe"ejjGdd=edvdNZZe"ejjGdd-edvdOZ[e"ejjGdddd@edvdPZ\e"ejjGddddedvdQZ]e"ejjGddddedvdRZ^e"ejjGdde_j3dd@edvdSZ`ej+j,ejjGd"dedTZae"ejjGdd=edvdUZbe"ejjGdd-edvdVZce"ejjGdddd@edvdWZde"ejjGddeej3dd@edvdXZfej+j,ejjGd"dedYZge"ejjhdeij3edvdZZje"ejjhdeij3edvd[Zkej+j,ejjhed\Zle"ejjhdd]edvd^Zme"ejjhdd]edvd_Zne"ejjhdd]dd+edvd`Zoe"ejjhdddd-edvdaZpe"ejjhddbddcedvddZqe"ejjhddeedvdfZre"ejjhddeedvdgZse"ejjhddedd+edvdhZte"ejjhdd]edvdiZue"ejjhdd]ddjedvdkZve"ejjhddbddledvdmZwe"ejjhddnedvdoZxe"ejjhddnedvdpZye"ejjhddndd+edvdqZze"ejjhddddredvdsZ{e"ejjhddtedvduZ|RS(wsFirewallD main classcOstt|j||||_|d|_|d|_|jt|jd|_ |j j tj |j j tj |j j tj |j j tj|j j tj|j j tj|j j tj|j j tj|j j tj|j j tjtjjtjrx[ttjtjD]>}dtj|f}tjj|rG|j j |qGqGWn|j jtj|j jtj|j jtjt|tjj idd6dd6dd6dd 6dd 6dd 6dd 6dd 6dS(Niiis%s/%st readwritet CleanupOnExitt IPv6_rpfiltertLockdownt MinimalMarktIndividualCallst LogDeniedtAutomaticHelperstAllowZoneDrifting(!tsuperRt__init__Rtbusnametpatht _init_varsRt watch_updatertwatchert add_watch_dirtFIREWALLD_IPSETStETC_FIREWALLD_IPSETStFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPEStFIREWALLD_HELPERStETC_FIREWALLD_HELPERStFIREWALLD_SERVICEStETC_FIREWALLD_SERVICEStFIREWALLD_ZONEStETC_FIREWALLD_ZONEStostexiststsortedtlistdirtisdirtadd_watch_filetLOCKDOWN_WHITELISTtFIREWALLD_DIRECTtFIREWALLD_CONFRtdbustDBUS_INTERFACE_CONFIG(tselftconftargstkwargstfilenameR+((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR)GsD      cCs]g|_d|_g|_d|_g|_d|_g|_d|_g|_d|_ x0|j j D]}|j |j j |qjWx0|j jD]}|j|j j|qWx0|j jD]}|j|j j|qWx0|j jD]}|j|j j|qWx0|j jD]}|j|j j|q6WdS(Ni(tipsetst ipset_idxt icmptypest icmptype_idxtservicest service_idxtzonestzone_idxthelperst helper_idxRt get_ipsetst _addIPSett get_ipsett get_icmptypest _addIcmpTypet get_icmptypet get_servicest _addServicet get_servicet get_zonest_addZonetget_zonet get_helperst _addHelpert get_helper(REtipsetticmptypetservicetzonethelper((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR,os(          cCsdS(N((RE((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt__del__scCs&x5t|jdkr7|jj}|j~qWx5t|jdkro|jj}|j~q;Wx5t|jdkr|jj}|j~qsWx5t|jdkr|jj}|j~qWx5t|jdkr|jj}|j~qW|jdS(Ni( tlenRJtpopt unregisterRLRNRPRRR,(REtitem((s:/usr/lib/python2.7/site-packages/firewall/server/config.pytreloads*     c Cs|tjkr |jtjj}tjdtjy|jjWn+tk ru}tj d||fdSX|jtjjj }xDt |j D]0}||kr||||kr||=qqWt |dkr|jtjj|gndS|jtjs.|jtjr|jdry|jj|\}}Wn+tk r}tj d||fdSX|dkr|j|q|dkr|j|q|dkr|j|qn|jtjs|jtjr|jdry|jj|\}}Wn+tk rZ}tj d ||fdSX|dkrw|j|q|dkr|j|q|dkr|j|qn|jtjs|jtjr=|jdry|jj|\}}Wn+tk r.}tj d ||fdSX|dkrK|j |q:|dkrg|j!|q:|dkr:|j"|q:q|jtjr|j#tjd j$d }t |d ksd |krdSt%j&j'|r|j(j)|s7|j(j*|q7q:|j(j)|r:|j(j+|q:qn^|jtj,sa|jtj-r|jdry|jj.|\}}Wn+tk r}tj d||fdSX|dkr|j/|q|dkr|j0|q|dkr|j1|qn|jtj2s5|jtj3r|jdry|jj4|\}}Wn+tk r}tj d||fdSX|dkr|j5|q|dkr|j6|q|dkr|j7|qn|tj8kr@y|jj9Wn+tk r2}tj d||fdSX|j:n[|tj;kry|jj<Wn+tk r}tj d||fdSX|j=ndS(Ns,config: Reloading firewalld config file '%s's+Failed to load firewalld.conf file '%s': %sis.xmls%Failed to load icmptype file '%s': %stnewtremovetupdates$Failed to load service file '%s': %ss!Failed to load zone file '%s': %stt/is"Failed to load ipset file '%s': %ss#Failed to load helper file '%s': %ss/Failed to load lockdown whitelist file '%s': %ss)Failed to load direct rules file '%s': %s(>RRBtGetAllRCRDRtdebug1tupdate_firewalld_conft ExceptionterrortcopytlisttkeysRitPropertiesChangedt startswithR2R3tendswithtupdate_icmptype_from_pathRXtremoveIcmpTypet_updateIcmpTypeR6R7tupdate_service_from_pathR[t removeServicet_updateServiceR8R9tupdate_zone_from_pathR^t removeZonet _updateZonetreplacetstripR:R+R>R.t has_watchR/t remove_watchR0R1tupdate_ipset_from_pathRUt removeIPSett _updateIPSetR4R5tupdate_helper_from_pathRat removeHelpert _updateHelperR@tupdate_lockdown_whitelisttLockdownWhitelistUpdatedRAt update_directtUpdated( REtnamet old_propstmsgtpropstkeytwhattobjt_name((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR-s                            c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRMR*RCtDBUS_PATH_CONFIG_ICMPTYPERLtappendt IcmpTypeAddedR(RERtconfig_icmptype((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRX&s cCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RLRRR+RIR(RERRd((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR2s  cCsd}xu|jD]j}|j}|j||kr||j|j|jj|j||_|j|jjqqWxP|jD]E}|j|kr|j |j|j |jj|~qqWdS(Ni( RPt getSettingsRRoRtset_zone_configRRRLtRemovedRk(RERtindexRftsettingsRd((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR;s  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RROR*RCtDBUS_PATH_CONFIG_SERVICERNRt ServiceAddedR(RERtconfig_service((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR[MscCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RNRRR+RIR(RERRe((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRXs  cCsd}xu|jD]j}|j}|j||kr||j|j|jj|j||_|j|jjqqWxP|jD]E}|j|kr|j |j|j |jj|~qqWdS(Ni( RPRRRoRRRRRNRRk(RERRRfRRe((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRas  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRQR*RCtDBUS_PATH_CONFIG_ZONERPRt ZoneAddedR(RERt config_zone((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR^sscCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RPRRR+RIR(RERRf((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR~s * cCsWxP|jD]E}|j|kr |j|j|j|jj|~q q WdS(N(RPRRRRkRo(RERRf((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRKR*RCtDBUS_PATH_CONFIG_IPSETRJRt IPSetAddedR(RERt config_ipset((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRUscCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RJRRR+RIR(RERRc((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs * cCsWxP|jD]E}|j|kr |j|j|j|jj|~q q WdS(N(RJRRRRkRo(RERRc((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRSR*RCtDBUS_PATH_CONFIG_HELPERRRRt HelperAddedR(RERt config_helper((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRascCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RRRRR+RIR(RERRg((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs * cCsWxP|jD]E}|j|kr |j|j|j|jj|~q q WdS(N(RRRRRRkRo(RERRg((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs  cCs|jjr|dkr,tjddStj}t||}|jjd|r`dSt ||}|jjd|rdSt |}|jjd|rdSt ||}|jjd|rdSt t jdndS(Ns&Lockdown not possible, sender not set.tcontexttuidtusertcommandslockdown is enabled(Rtlockdown_enabledtNoneRRwRCt SystemBusRt access_checkRRRRRt ACCESS_DENIED(REtsendertbusRRRR((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt accessChecks$    c CsB|d kr%tjjd |n|jjj|}|dkrn|dkratj}ntj|S|dkr|dkrtj }n t |}tj |S|dkr|dkrtj rd nd }ntj|S|dkr%|dkrtj rd nd }ntj|S|dkrb|dkrUtjrLd nd }ntj|S|dkr|dkrtjrd nd }ntj|S|dkr|dkrtj}ntj|S|dkr|dkrtj}ntj|S|d kr>|dkr1tjr(d nd }ntj|SdS(Nt DefaultZoneR#R R"R!R$R%R&R'sDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not existtyestno( Rs MinimalMarks CleanupOnExitsLockdowns IPv6_rpfiltersIndividualCallss LogDeniedsAutomaticHelperssAllowZoneDrifting(RCt exceptionst DBusExceptionRtget_firewalld_conftgetRt FALLBACK_ZONEtStringtFALLBACK_MINIMAL_MARKtinttInt32tFALLBACK_CLEANUP_ON_EXITtFALLBACK_LOCKDOWNtFALLBACK_IPV6_RPFILTERtFALLBACK_INDIVIDUAL_CALLStFALLBACK_LOG_DENIEDtFALLBACK_AUTOMATIC_HELPERStFALLBACK_ALLOW_ZONE_DRIFTING(REtproptvalue((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt _get_propertysX                                  cCsL|dkr"tj|j|S|dkrDtj|j|S|dkrftj|j|S|dkrtj|j|S|dkrtj|j|S|dkrtj|j|S|dkrtj|j|S|dkrtj|j|S|d kr2tj|j|Stjjd |dS( NRR#R R"R!R$R%R&R'sDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist(RCRRRRR(RER((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt_get_dbus_propertys*          t in_signaturetsst out_signaturetvcCst|t}t|t}tjd|||tjjkrP|j|S|tjjtjj gkrtj j d|ntj j d||j|S(Nsconfig.Get('%s', '%s')sDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not existsJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRRtRRCRDRtDBUS_INTERFACE_CONFIG_DIRECTtDBUS_INTERFACE_CONFIG_POLICIESRR(REtinterface_namet property_nameR((s:/usr/lib/python2.7/site-packages/firewall/server/config.pytGet/s      tssa{sv}c Cst|t}tjd|i}|tjjkryxvdddddddd d g D]}|j|||RRRRRpRRERFRGRHRIRLRMRNRPRQRRRTRURVRXRY(((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR?s8 (          2A$                                                   (<t gi.repositoryRtsystmodulesR:RCt dbus.servicet slip.dbusRbtslip.dbus.servicetfirewallRtfirewall.core.baseRtfirewall.core.watcherRtfirewall.core.loggerRtfirewall.server.decoratorsRRRtfirewall.server.config_icmptypeR tfirewall.server.config_serviceR tfirewall.server.config_zoneR tfirewall.server.config_ipsetR tfirewall.server.config_helperR tfirewall.core.io.zoneRtfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.ipsetRtfirewall.core.io.helperRt#firewall.core.io.lockdown_whitelistRtfirewall.core.io.directRtfirewall.dbus_utilsRRRRRRRRtfirewall.errorsRRetObjectR(((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyts8       4PK[ %331site-packages/firewall/server/config_icmptype.pycnu[ c`c@sddlmZddlZeejdtj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR R!RtBooleanR"R#t exceptionst DBusException(Rt property_name((sC/usr/lib/python2.7/site-packages/firewall/server/config_icmptype.pyt _get_propertyQs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR&R'R)(Rtinterface_nameR(tsender((sC/usr/lib/python2.7/site-packages/firewall/server/config_icmptype.pytGetbs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||s      PK[o??.site-packages/firewall/server/config_ipset.pycnu[ c`c@sddlmZddlZeejdtj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR!R"RtBooleanR#R$t exceptionst DBusException(Rt property_name((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pyt _get_propertyRs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR'R(R*(Rtinterface_nameR)tsender((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pytGetcs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||tservicetsignalRAtPK_ACTION_INFOtINTROSPECTABLE_IFACERCRRtDBUS_SIGNATURERGRKRMRIRPRQRTRSRURXRYR[R\R^R_RbRcRgRkRmRoRqRxR{R|R}(((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pyR1s  $                   (t gi.repositoryRtsystmodulesRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.ipsetRtfirewall.core.ipsetRtfirewall.core.loggerRtfirewall.server.decoratorsR R R R tfirewall.errorsR RtObjectR(((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pyts      PK[S==/site-packages/firewall/server/config_helper.pycnu[ c`c@sddlmZddlZeejdtj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR R!RtBooleanR"R#t exceptionst DBusException(Rt property_name((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyt _get_propertyQs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR&R'R)(Rtinterface_nameR(tsender((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pytGetbs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||si( RRUt isinstancetappendttupleRR/RtjoinRR;RFRJ(RtportsR1t_portsRkRI((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pytsetPortss cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addPort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R R_RmRJ(RRktprotocolR1RI((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pytaddPorts cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R t NOT_ENABLEDRORJ(RRkRsR1RI((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyt removePortscCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.queryPort('%s', '%s')i(RR.RR/RRF(RRkRsR1((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyt queryPorts N(:t__name__t __module__t__doc__tTruet persistentRRtPK_ACTION_CONFIGtdefault_polkit_auth_requiredRRR RRR)R tPROPERTIES_IFACEtNoneR2R9tsliptpolkitt require_authR=tservicetsignalR@tPK_ACTION_INFOtINTROSPECTABLE_IFACERBRRtDBUS_SIGNATURERFRJRLRHRORPRSRRRTRWRXRZR[R]R^RaRcRdRfRgRhRrRtRvRw(((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyR 0s  $                (t gi.repositoryRtsystmodulesRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.helperRtfirewall.core.loggerRtfirewall.server.decoratorsRR R R tfirewall.errorsR RtObjectR (((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyts      PK[b]GG-site-packages/firewall/server/config_ipset.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2015-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # force use of pygobject3 in python-slip from gi.repository import GObject import sys sys.modules['gobject'] = GObject import dbus import dbus.service import slip.dbus import slip.dbus.service from firewall import config from firewall.dbus_utils import dbus_to_python, \ dbus_introspection_prepare_properties, \ dbus_introspection_add_properties from firewall.core.io.ipset import IPSet from firewall.core.ipset import IPSET_TYPES from firewall.core.logger import log from firewall.server.decorators import handle_exceptions, \ dbus_handle_exceptions, dbus_service_method from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class FirewallDConfigIPSet # ############################################################################ class FirewallDConfigIPSet(slip.dbus.service.Object): """FirewallD main class""" persistent = True """ Make FirewallD persistent. """ default_polkit_auth_required = config.dbus.PK_ACTION_CONFIG """ Use PK_ACTION_INFO as a default """ @handle_exceptions def __init__(self, parent, conf, ipset, item_id, *args, **kwargs): super(FirewallDConfigIPSet, self).__init__(*args, **kwargs) self.parent = parent self.config = conf self.obj = ipset self.item_id = item_id self.busname = args[0] self.path = args[1] self._log_prefix = "config.ipset.%d" % self.item_id dbus_introspection_prepare_properties( self, config.dbus.DBUS_INTERFACE_CONFIG_IPSET) @dbus_handle_exceptions def __del__(self): pass @dbus_handle_exceptions def unregister(self): self.remove_from_connection() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # P R O P E R T I E S @dbus_handle_exceptions def _get_property(self, property_name): if property_name == "name": return dbus.String(self.obj.name) elif property_name == "filename": return dbus.String(self.obj.filename) elif property_name == "path": return dbus.String(self.obj.path) elif property_name == "default": return dbus.Boolean(self.obj.default) elif property_name == "builtin": return dbus.Boolean(self.obj.builtin) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @dbus_handle_exceptions def Get(self, interface_name, property_name, sender=None): # pylint: disable=W0613 # get a property interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) log.debug1("%s.Get('%s', '%s')", self._log_prefix, interface_name, property_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_IPSET: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return self._get_property(property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') @dbus_handle_exceptions def GetAll(self, interface_name, sender=None): # pylint: disable=W0613 interface_name = dbus_to_python(interface_name, str) log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_IPSET: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) ret = { } for x in [ "name", "filename", "path", "default", "builtin" ]: ret[x] = self._get_property(x) return dbus.Dictionary(ret, signature="sv") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ssv') @dbus_handle_exceptions def Set(self, interface_name, property_name, new_value, sender=None): interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) new_value = dbus_to_python(new_value) log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix, interface_name, property_name, new_value) self.parent.accessCheck(sender) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_IPSET: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.PropertyReadOnly: " "Property '%s' is read-only" % property_name) @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): interface_name = dbus_to_python(interface_name, str) changed_properties = dbus_to_python(changed_properties) invalidated_properties = dbus_to_python(invalidated_properties) log.debug1("%s.PropertiesChanged('%s', '%s', '%s')", self._log_prefix, interface_name, changed_properties, invalidated_properties) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(dbus.INTROSPECTABLE_IFACE, out_signature='s') @dbus_handle_exceptions def Introspect(self, sender=None): # pylint: disable=W0613 log.debug2("%s.Introspect()", self._log_prefix) data = super(FirewallDConfigIPSet, self).Introspect( self.path, self.busname.get_bus()) return dbus_introspection_add_properties( self, data, config.dbus.DBUS_INTERFACE_CONFIG_IPSET) # S E T T I N G S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, out_signature=IPSet.DBUS_SIGNATURE) @dbus_handle_exceptions def getSettings(self, sender=None): # pylint: disable=W0613 """get settings for ipset """ log.debug1("%s.getSettings()", self._log_prefix) return self.config.get_ipset_config(self.obj) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature=IPSet.DBUS_SIGNATURE) @dbus_handle_exceptions def update(self, settings, sender=None): """update settings for ipset """ settings = dbus_to_python(settings) log.debug1("%s.update('...')", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.set_ipset_config(self.obj, settings) self.Updated(self.obj.name) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET) @dbus_handle_exceptions def loadDefaults(self, sender=None): """load default settings for builtin ipset """ log.debug1("%s.loadDefaults()", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.load_ipset_defaults(self.obj) self.Updated(self.obj.name) #self.PropertiesChanged(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, # { "default": True }, [ ]) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, signature='s') @dbus_handle_exceptions def Updated(self, name): log.debug1("%s.Updated('%s')" % (self._log_prefix, name)) # R E M O V E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET) @dbus_handle_exceptions def remove(self, sender=None): """remove ipset """ log.debug1("%s.remove()", self._log_prefix) self.parent.accessCheck(sender) self.config.remove_ipset(self.obj) self.parent.removeIPSet(self.obj) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, signature='s') @dbus_handle_exceptions def Removed(self, name): log.debug1("%s.Removed('%s')" % (self._log_prefix, name)) # R E N A M E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def rename(self, name, sender=None): """rename ipset """ name = dbus_to_python(name, str) log.debug1("%s.rename('%s')", self._log_prefix, name) self.parent.accessCheck(sender) self.obj = self.config.rename_ipset(self.obj, name) self.Renamed(name) #self.PropertiesChanged(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, # { "name": name }, [ ]) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, signature='s') @dbus_handle_exceptions def Renamed(self, name): log.debug1("%s.Renamed('%s')" % (self._log_prefix, name)) # version @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, out_signature='s') @dbus_handle_exceptions def getVersion(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getVersion()", self._log_prefix) return self.getSettings()[0] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def setVersion(self, version, sender=None): version = dbus_to_python(version, str) log.debug1("%s.setVersion('%s')", self._log_prefix, version) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[0] = version self.update(settings) # short @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, out_signature='s') @dbus_handle_exceptions def getShort(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getShort()", self._log_prefix) return self.getSettings()[1] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def setShort(self, short, sender=None): short = dbus_to_python(short, str) log.debug1("%s.setShort('%s')", self._log_prefix, short) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[1] = short self.update(settings) # description @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, out_signature='s') @dbus_handle_exceptions def getDescription(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getDescription()", self._log_prefix) return self.getSettings()[2] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def setDescription(self, description, sender=None): description = dbus_to_python(description, str) log.debug1("%s.setDescription('%s')", self._log_prefix, description) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[2] = description self.update(settings) # type @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, out_signature='s') @dbus_handle_exceptions def getType(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getType()", self._log_prefix) return self.getSettings()[3] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def setType(self, ipset_type, sender=None): ipset_type = dbus_to_python(ipset_type, str) log.debug1("%s.setType('%s')", self._log_prefix, ipset_type) self.parent.accessCheck(sender) if ipset_type not in IPSET_TYPES: raise FirewallError(errors.INVALID_TYPE, ipset_type) settings = list(self.getSettings()) settings[3] = ipset_type self.update(settings) # options @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, out_signature='a{ss}') @dbus_handle_exceptions def getOptions(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getOptions()", self._log_prefix) return self.getSettings()[4] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='a{ss}') @dbus_handle_exceptions def setOptions(self, options, sender=None): options = dbus_to_python(options, dict) log.debug1("%s.setOptions('[%s]')", self._log_prefix, repr(options)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[4] = options self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='ss') @dbus_handle_exceptions def addOption(self, key, value, sender=None): key = dbus_to_python(key, str) value = dbus_to_python(value, str) log.debug1("%s.addOption('%s', '%s')", self._log_prefix, key, value) self.parent.accessCheck(sender) settings = list(self.getSettings()) if key in settings[4] and settings[4][key] == value: raise FirewallError(errors.ALREADY_ENABLED, "'%s': '%s'" % (key, value)) settings[4][key] = value self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def removeOption(self, key, sender=None): key = dbus_to_python(key, str) log.debug1("%s.removeOption('%s')", self._log_prefix, key) self.parent.accessCheck(sender) settings = list(self.getSettings()) if key not in settings[4]: raise FirewallError(errors.NOT_ENABLED, key) del settings[4][key] self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryOption(self, key, value, sender=None): # pylint: disable=W0613 key = dbus_to_python(key, str) value = dbus_to_python(value, str) log.debug1("%s.queryOption('%s', '%s')", self._log_prefix, key, value) settings = list(self.getSettings()) return (key in settings[4] and settings[4][key] == value) # entries @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, out_signature='as') @dbus_handle_exceptions def getEntries(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getEntries()", self._log_prefix) return self.getSettings()[5] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='as') @dbus_handle_exceptions def setEntries(self, entries, sender=None): entries = dbus_to_python(entries, list) log.debug1("%s.setEntries('[%s]')", self._log_prefix, ",".join(entries)) self.parent.accessCheck(sender) settings = list(self.getSettings()) if "timeout" in settings[4] and settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) settings[5] = entries self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def addEntry(self, entry, sender=None): entry = dbus_to_python(entry, str) log.debug1("%s.addEntry('%s')", self._log_prefix, entry) self.parent.accessCheck(sender) settings = list(self.getSettings()) if "timeout" in settings[4] and settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) if entry in settings[5]: raise FirewallError(errors.ALREADY_ENABLED, entry) settings[5].append(entry) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s') @dbus_handle_exceptions def removeEntry(self, entry, sender=None): entry = dbus_to_python(entry, str) log.debug1("%s.removeEntry('%s')", self._log_prefix, entry) self.parent.accessCheck(sender) settings = list(self.getSettings()) if "timeout" in settings[4] and settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) if entry not in settings[5]: raise FirewallError(errors.NOT_ENABLED, entry) settings[5].remove(entry) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_IPSET, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryEntry(self, entry, sender=None): # pylint: disable=W0613 entry = dbus_to_python(entry, str) log.debug1("%s.queryEntry('%s')", self._log_prefix, entry) settings = list(self.getSettings()) if "timeout" in settings[4] and settings[4]["timeout"] != "0": raise FirewallError(errors.IPSET_WITH_TIMEOUT) return entry in settings[5] PK["z44,site-packages/firewall/server/config_zone.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # force use of pygobject3 in python-slip from gi.repository import GObject import sys sys.modules['gobject'] = GObject import dbus import dbus.service import slip.dbus import slip.dbus.service from firewall import config from firewall.dbus_utils import dbus_to_python, \ dbus_introspection_prepare_properties, \ dbus_introspection_add_properties from firewall.core.io.zone import Zone from firewall.core.fw_ifcfg import ifcfg_set_zone_of_interface from firewall.core.base import DEFAULT_ZONE_TARGET from firewall.core.rich import Rich_Rule from firewall.core.logger import log from firewall.server.decorators import handle_exceptions, \ dbus_handle_exceptions, dbus_service_method from firewall import errors from firewall.errors import FirewallError from firewall.functions import portInPortRange ############################################################################ # # class FirewallDConfig # ############################################################################ class FirewallDConfigZone(slip.dbus.service.Object): """FirewallD main class""" persistent = True """ Make FirewallD persistent. """ default_polkit_auth_required = config.dbus.PK_ACTION_CONFIG """ Use PK_ACTION_INFO as a default """ @handle_exceptions def __init__(self, parent, conf, zone, item_id, *args, **kwargs): super(FirewallDConfigZone, self).__init__(*args, **kwargs) self.parent = parent self.config = conf self.obj = zone self.item_id = item_id self.busname = args[0] self.path = args[1] self._log_prefix = "config.zone.%d" % self.item_id dbus_introspection_prepare_properties( self, config.dbus.DBUS_INTERFACE_CONFIG_ZONE) @dbus_handle_exceptions def __del__(self): pass @dbus_handle_exceptions def unregister(self): self.remove_from_connection() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # P R O P E R T I E S @dbus_handle_exceptions def _get_property(self, property_name): if property_name == "name": return dbus.String(self.obj.name) elif property_name == "filename": return dbus.String(self.obj.filename) elif property_name == "path": return dbus.String(self.obj.path) elif property_name == "default": return dbus.Boolean(self.obj.default) elif property_name == "builtin": return dbus.Boolean(self.obj.builtin) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @dbus_handle_exceptions def Get(self, interface_name, property_name, sender=None): # pylint: disable=W0613 # get a property interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) log.debug1("%s.Get('%s', '%s')", self._log_prefix, interface_name, property_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_ZONE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return self._get_property(property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') @dbus_handle_exceptions def GetAll(self, interface_name, sender=None): # pylint: disable=W0613 interface_name = dbus_to_python(interface_name, str) log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_ZONE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) ret = { } for x in [ "name", "filename", "path", "default", "builtin" ]: ret[x] = self._get_property(x) return dbus.Dictionary(ret, signature="sv") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ssv') @dbus_handle_exceptions def Set(self, interface_name, property_name, new_value, sender=None): interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) new_value = dbus_to_python(new_value) log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix, interface_name, property_name, new_value) self.parent.accessCheck(sender) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_ZONE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.PropertyReadOnly: " "Property '%s' is read-only" % property_name) @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): interface_name = dbus_to_python(interface_name, str) changed_properties = dbus_to_python(changed_properties) invalidated_properties = dbus_to_python(invalidated_properties) log.debug1("%s.PropertiesChanged('%s', '%s', '%s')", self._log_prefix, interface_name, changed_properties, invalidated_properties) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(dbus.INTROSPECTABLE_IFACE, out_signature='s') @dbus_handle_exceptions def Introspect(self, sender=None): # pylint: disable=W0613 log.debug2("%s.Introspect()", self._log_prefix) data = super(FirewallDConfigZone, self).Introspect( self.path, self.busname.get_bus()) return dbus_introspection_add_properties( self, data, config.dbus.DBUS_INTERFACE_CONFIG_ZONE) # S E T T I N G S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature=Zone.DBUS_SIGNATURE) @dbus_handle_exceptions def getSettings(self, sender=None): # pylint: disable=W0613 """get settings for zone """ log.debug1("%s.getSettings()", self._log_prefix) settings = self.config.get_zone_config(self.obj) if settings[4] == DEFAULT_ZONE_TARGET: # convert to list, fix target, convert back to tuple _settings = list(settings) _settings[4] = "default" settings = tuple(_settings) return settings def _checkDuplicateInterfacesSources(self, settings): """Assignment of interfaces/sources to zones is different from other zone settings in the sense that particular interface/zone can be part of only one zone. So make sure added interfaces/sources have not already been bound to another zone.""" old_settings = self.config.get_zone_config(self.obj) idx_i = Zone.index_of("interfaces") idx_s = Zone.index_of("sources") added_ifaces = set(settings[idx_i]) - set(old_settings[idx_i]) added_sources = set(settings[idx_s]) - set(old_settings[idx_s]) for iface in added_ifaces: if self.parent.getZoneOfInterface(iface): raise FirewallError(errors.ZONE_CONFLICT, iface) # or move to new zone ? for source in added_sources: if self.parent.getZoneOfSource(source): raise FirewallError(errors.ZONE_CONFLICT, source) # or move to new zone ? @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature=Zone.DBUS_SIGNATURE) @dbus_handle_exceptions def update(self, settings, sender=None): """update settings for zone """ settings = dbus_to_python(settings) log.debug1("%s.update('...')", self._log_prefix) self.parent.accessCheck(sender) if settings[4] == "default": # convert to list, fix target, convert back to tuple _settings = list(settings) _settings[4] = DEFAULT_ZONE_TARGET settings = tuple(_settings) self._checkDuplicateInterfacesSources(settings) self.obj = self.config.set_zone_config(self.obj, settings) self.Updated(self.obj.name) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE) @dbus_handle_exceptions def loadDefaults(self, sender=None): """load default settings for builtin zone """ log.debug1("%s.loadDefaults()", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.load_zone_defaults(self.obj) self.Updated(self.obj.name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, signature='s') @dbus_handle_exceptions def Updated(self, name): log.debug1("%s.Updated('%s')" % (self._log_prefix, name)) # R E M O V E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE) @dbus_handle_exceptions def remove(self, sender=None): """remove zone """ log.debug1("%s.removeZone()", self._log_prefix) self.parent.accessCheck(sender) self.config.remove_zone(self.obj) self.parent.removeZone(self.obj) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, signature='s') @dbus_handle_exceptions def Removed(self, name): log.debug1("%s.Removed('%s')" % (self._log_prefix, name)) # R E N A M E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def rename(self, name, sender=None): """rename zone """ name = dbus_to_python(name, str) log.debug1("%s.rename('%s')", self._log_prefix, name) self.parent.accessCheck(sender) self.obj = self.config.rename_zone(self.obj, name) self.Renamed(name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, signature='s') @dbus_handle_exceptions def Renamed(self, name): log.debug1("%s.Renamed('%s')" % (self._log_prefix, name)) # version @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='s') @dbus_handle_exceptions def getVersion(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getVersion()", self._log_prefix) return self.getSettings()[0] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def setVersion(self, version, sender=None): version = dbus_to_python(version, str) log.debug1("%s.setVersion('%s')", self._log_prefix, version) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[0] = version self.update(settings) # short @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='s') @dbus_handle_exceptions def getShort(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getShort()", self._log_prefix) return self.getSettings()[1] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def setShort(self, short, sender=None): short = dbus_to_python(short, str) log.debug1("%s.setShort('%s')", self._log_prefix, short) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[1] = short self.update(settings) # description @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='s') @dbus_handle_exceptions def getDescription(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getDescription()", self._log_prefix) return self.getSettings()[2] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def setDescription(self, description, sender=None): description = dbus_to_python(description, str) log.debug1("%s.setDescription('%s')", self._log_prefix, description) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[2] = description self.update(settings) # immutable (deprecated) # settings[3] was used for 'immutable' # target @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='s') @dbus_handle_exceptions def getTarget(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getTarget()", self._log_prefix) settings = self.getSettings() return settings[4] if settings[4] != DEFAULT_ZONE_TARGET else "default" @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def setTarget(self, target, sender=None): target = dbus_to_python(target, str) log.debug1("%s.setTarget('%s')", self._log_prefix, target) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[4] = target if target != "default" else DEFAULT_ZONE_TARGET self.update(settings) # service @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='as') @dbus_handle_exceptions def getServices(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getServices()", self._log_prefix) return self.getSettings()[5] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='as') @dbus_handle_exceptions def setServices(self, services, sender=None): services = dbus_to_python(services, list) log.debug1("%s.setServices('[%s]')", self._log_prefix, ",".join(services)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[5] = services self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def addService(self, service, sender=None): service = dbus_to_python(service, str) log.debug1("%s.addService('%s')", self._log_prefix, service) self.parent.accessCheck(sender) settings = list(self.getSettings()) if service in settings[5]: raise FirewallError(errors.ALREADY_ENABLED, service) settings[5].append(service) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def removeService(self, service, sender=None): service = dbus_to_python(service, str) log.debug1("%s.removeService('%s')", self._log_prefix, service) self.parent.accessCheck(sender) settings = list(self.getSettings()) if service not in settings[5]: raise FirewallError(errors.NOT_ENABLED, service) settings[5].remove(service) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryService(self, service, sender=None): # pylint: disable=W0613 service = dbus_to_python(service, str) log.debug1("%s.queryService('%s')", self._log_prefix, service) return service in self.getSettings()[5] # port @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='a(ss)') @dbus_handle_exceptions def getPorts(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getPorts()", self._log_prefix) return self.getSettings()[6] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='a(ss)') @dbus_handle_exceptions def setPorts(self, ports, sender=None): _ports = [ ] # convert embedded lists to tuples for port in dbus_to_python(ports, list): if isinstance(port, list): _ports.append(tuple(port)) else: _ports.append(port) ports = _ports log.debug1("%s.setPorts('[%s]')", self._log_prefix, ",".join("('%s, '%s')" % (port[0], port[1]) for port in ports)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[6] = ports self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ss') @dbus_handle_exceptions def addPort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.addPort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) in settings[6]: raise FirewallError(errors.ALREADY_ENABLED, "%s:%s" % (port, protocol)) settings[6].append((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ss') @dbus_handle_exceptions def removePort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.removePort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) not in settings[6]: raise FirewallError(errors.NOT_ENABLED, "%s:%s" % (port, protocol)) settings[6].remove((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryPort(self, port, protocol, sender=None): # pylint: disable=W0613 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.queryPort('%s', '%s')", self._log_prefix, port, protocol) if (port,protocol) in self.getSettings()[6]: return True else: # It might be a single port query that is inside a range for (_port, _protocol) in self.getSettings()[6]: if portInPortRange(port, _port) and protocol == _protocol: return True return False # protocol @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='as') @dbus_handle_exceptions def getProtocols(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getProtocols()", self._log_prefix) return self.getSettings()[13] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='as') @dbus_handle_exceptions def setProtocols(self, protocols, sender=None): protocols = dbus_to_python(protocols, list) log.debug1("%s.setProtocols('[%s]')", self._log_prefix, ",".join(protocols)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[13] = protocols self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def addProtocol(self, protocol, sender=None): protocol = dbus_to_python(protocol, str) log.debug1("%s.addProtocol('%s')", self._log_prefix, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if protocol in settings[13]: raise FirewallError(errors.ALREADY_ENABLED, protocol) settings[13].append(protocol) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def removeProtocol(self, protocol, sender=None): protocol = dbus_to_python(protocol, str) log.debug1("%s.removeProtocol('%s')", self._log_prefix, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if protocol not in settings[13]: raise FirewallError(errors.NOT_ENABLED, protocol) settings[13].remove(protocol) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryProtocol(self, protocol, sender=None): # pylint: disable=W0613 protocol = dbus_to_python(protocol, str) log.debug1("%s.queryProtocol('%s')", self._log_prefix, protocol) return protocol in self.getSettings()[13] # source port @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='a(ss)') @dbus_handle_exceptions def getSourcePorts(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getSourcePorts()", self._log_prefix) return self.getSettings()[14] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='a(ss)') @dbus_handle_exceptions def setSourcePorts(self, ports, sender=None): _ports = [ ] # convert embedded lists to tuples for port in dbus_to_python(ports, list): if isinstance(port, list): _ports.append(tuple(port)) else: _ports.append(port) ports = _ports log.debug1("%s.setSourcePorts('[%s]')", self._log_prefix, ",".join("('%s, '%s')" % (port[0], port[1]) for port in ports)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[14] = ports self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ss') @dbus_handle_exceptions def addSourcePort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.addSourcePort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) in settings[14]: raise FirewallError(errors.ALREADY_ENABLED, "%s:%s" % (port, protocol)) settings[14].append((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ss') @dbus_handle_exceptions def removeSourcePort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.removeSourcePort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) not in settings[14]: raise FirewallError(errors.NOT_ENABLED, "%s:%s" % (port, protocol)) settings[14].remove((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def querySourcePort(self, port, protocol, sender=None): # pylint: disable=W0613 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.querySourcePort('%s', '%s')", self._log_prefix, port, protocol) return (port,protocol) in self.getSettings()[14] # icmp block @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='as') @dbus_handle_exceptions def getIcmpBlocks(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getIcmpBlocks()", self._log_prefix) return self.getSettings()[7] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='as') @dbus_handle_exceptions def setIcmpBlocks(self, icmptypes, sender=None): icmptypes = dbus_to_python(icmptypes, list) log.debug1("%s.setIcmpBlocks('[%s]')", self._log_prefix, ",".join(icmptypes)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[7] = icmptypes self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def addIcmpBlock(self, icmptype, sender=None): icmptype = dbus_to_python(icmptype, str) log.debug1("%s.addIcmpBlock('%s')", self._log_prefix, icmptype) self.parent.accessCheck(sender) settings = list(self.getSettings()) if icmptype in settings[7]: raise FirewallError(errors.ALREADY_ENABLED, icmptype) settings[7].append(icmptype) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def removeIcmpBlock(self, icmptype, sender=None): icmptype = dbus_to_python(icmptype, str) log.debug1("%s.removeIcmpBlock('%s')", self._log_prefix, icmptype) self.parent.accessCheck(sender) settings = list(self.getSettings()) if icmptype not in settings[7]: raise FirewallError(errors.NOT_ENABLED, icmptype) settings[7].remove(icmptype) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryIcmpBlock(self, icmptype, sender=None): # pylint: disable=W0613 icmptype = dbus_to_python(icmptype, str) log.debug1("%s.queryIcmpBlock('%s')", self._log_prefix, icmptype) return icmptype in self.getSettings()[7] # icmp block inversion @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='b') @dbus_handle_exceptions def getIcmpBlockInversion(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getIcmpBlockInversion()", self._log_prefix) return self.getSettings()[15] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='b') @dbus_handle_exceptions def setIcmpBlockInversion(self, flag, sender=None): flag = dbus_to_python(flag, bool) log.debug1("%s.setIcmpBlockInversion('%s')", self._log_prefix, flag) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[15] = flag self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE) @dbus_handle_exceptions def addIcmpBlockInversion(self, sender=None): log.debug1("%s.addIcmpBlockInversion()", self._log_prefix) self.parent.accessCheck(sender) settings = list(self.getSettings()) if settings[15]: raise FirewallError(errors.ALREADY_ENABLED, "icmp-block-inversion") settings[15] = True self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE) @dbus_handle_exceptions def removeIcmpBlockInversion(self, sender=None): log.debug1("%s.removeIcmpBlockInversion()", self._log_prefix) self.parent.accessCheck(sender) settings = list(self.getSettings()) if not settings[15]: raise FirewallError(errors.NOT_ENABLED, "icmp-block-inversion") settings[15] = False self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='b') @dbus_handle_exceptions def queryIcmpBlockInversion(self, sender=None): # pylint: disable=W0613 log.debug1("%s.queryIcmpBlockInversion()", self._log_prefix) return self.getSettings()[15] # masquerade @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='b') @dbus_handle_exceptions def getMasquerade(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getMasquerade()", self._log_prefix) return self.getSettings()[8] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='b') @dbus_handle_exceptions def setMasquerade(self, masquerade, sender=None): masquerade = dbus_to_python(masquerade, bool) log.debug1("%s.setMasquerade('%s')", self._log_prefix, masquerade) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[8] = masquerade self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE) @dbus_handle_exceptions def addMasquerade(self, sender=None): log.debug1("%s.addMasquerade()", self._log_prefix) self.parent.accessCheck(sender) settings = list(self.getSettings()) if settings[8]: raise FirewallError(errors.ALREADY_ENABLED, "masquerade") settings[8] = True self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE) @dbus_handle_exceptions def removeMasquerade(self, sender=None): log.debug1("%s.removeMasquerade()", self._log_prefix) self.parent.accessCheck(sender) settings = list(self.getSettings()) if not settings[8]: raise FirewallError(errors.NOT_ENABLED, "masquerade") settings[8] = False self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='b') @dbus_handle_exceptions def queryMasquerade(self, sender=None): # pylint: disable=W0613 log.debug1("%s.queryMasquerade()", self._log_prefix) return self.getSettings()[8] # forward port @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='a(ssss)') @dbus_handle_exceptions def getForwardPorts(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getForwardPorts()", self._log_prefix) return self.getSettings()[9] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='a(ssss)') @dbus_handle_exceptions def setForwardPorts(self, ports, sender=None): _ports = [ ] # convert embedded lists to tuples for port in dbus_to_python(ports, list): if isinstance(port, list): _ports.append(tuple(port)) else: _ports.append(port) ports = _ports log.debug1("%s.setForwardPorts('[%s]')", self._log_prefix, ",".join("('%s, '%s', '%s', '%s')" % (port[0], port[1], \ port[2], port[3]) for port in ports)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[9] = ports self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ssss') @dbus_handle_exceptions def addForwardPort(self, port, protocol, toport, toaddr, sender=None): # pylint: disable=R0913 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) toport = dbus_to_python(toport, str) toaddr = dbus_to_python(toaddr, str) log.debug1("%s.addForwardPort('%s', '%s', '%s', '%s')", self._log_prefix, port, protocol, toport, toaddr) self.parent.accessCheck(sender) fwp_id = (port, protocol, str(toport), str(toaddr)) settings = list(self.getSettings()) if fwp_id in settings[9]: raise FirewallError(errors.ALREADY_ENABLED, "%s:%s:%s:%s" % (port, protocol, toport, toaddr)) settings[9].append(fwp_id) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ssss') @dbus_handle_exceptions def removeForwardPort(self, port, protocol, toport, toaddr, sender=None): # pylint: disable=R0913 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) toport = dbus_to_python(toport, str) toaddr = dbus_to_python(toaddr, str) log.debug1("%s.removeForwardPort('%s', '%s', '%s', '%s')", self._log_prefix, port, protocol, toport, toaddr) self.parent.accessCheck(sender) fwp_id = (port, protocol, str(toport), str(toaddr)) settings = list(self.getSettings()) if fwp_id not in settings[9]: raise FirewallError(errors.NOT_ENABLED, "%s:%s:%s:%s" % (port, protocol, toport, toaddr)) settings[9].remove(fwp_id) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='ssss', out_signature='b') @dbus_handle_exceptions def queryForwardPort(self, port, protocol, toport, toaddr, sender=None): # pylint: disable=W0613, R0913 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) toport = dbus_to_python(toport, str) toaddr = dbus_to_python(toaddr, str) log.debug1("%s.queryForwardPort('%s', '%s', '%s', '%s')", self._log_prefix, port, protocol, toport, toaddr) fwp_id = (port, protocol, str(toport), str(toaddr)) return fwp_id in self.getSettings()[9] # interface @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='as') @dbus_handle_exceptions def getInterfaces(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getInterfaces()", self._log_prefix) return self.getSettings()[10] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='as') @dbus_handle_exceptions def setInterfaces(self, interfaces, sender=None): interfaces = dbus_to_python(interfaces, list) log.debug1("%s.setInterfaces('[%s]')", self._log_prefix, ",".join(interfaces)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[10] = interfaces self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def addInterface(self, interface, sender=None): interface = dbus_to_python(interface, str) log.debug1("%s.addInterface('%s')", self._log_prefix, interface) self.parent.accessCheck(sender) settings = list(self.getSettings()) if interface in settings[10]: raise FirewallError(errors.ALREADY_ENABLED, interface) settings[10].append(interface) self.update(settings) ifcfg_set_zone_of_interface(self.obj.name, interface) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def removeInterface(self, interface, sender=None): interface = dbus_to_python(interface, str) log.debug1("%s.removeInterface('%s')", self._log_prefix, interface) self.parent.accessCheck(sender) settings = list(self.getSettings()) if interface not in settings[10]: raise FirewallError(errors.NOT_ENABLED, interface) settings[10].remove(interface) self.update(settings) ifcfg_set_zone_of_interface("", interface) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryInterface(self, interface, sender=None): # pylint: disable=W0613 interface = dbus_to_python(interface, str) log.debug1("%s.queryInterface('%s')", self._log_prefix, interface) return interface in self.getSettings()[10] # source @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='as') @dbus_handle_exceptions def getSources(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getSources()", self._log_prefix) return self.getSettings()[11] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='as') @dbus_handle_exceptions def setSources(self, sources, sender=None): sources = dbus_to_python(sources, list) log.debug1("%s.setSources('[%s]')", self._log_prefix, ",".join(sources)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[11] = sources self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def addSource(self, source, sender=None): source = dbus_to_python(source, str) log.debug1("%s.addSource('%s')", self._log_prefix, source) self.parent.accessCheck(sender) settings = list(self.getSettings()) if source in settings[11]: raise FirewallError(errors.ALREADY_ENABLED, source) settings[11].append(source) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def removeSource(self, source, sender=None): source = dbus_to_python(source, str) log.debug1("%s.removeSource('%s')", self._log_prefix, source) self.parent.accessCheck(sender) settings = list(self.getSettings()) if source not in settings[11]: raise FirewallError(errors.NOT_ENABLED, source) settings[11].remove(source) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def querySource(self, source, sender=None): # pylint: disable=W0613 source = dbus_to_python(source, str) log.debug1("%s.querySource('%s')", self._log_prefix, source) return source in self.getSettings()[11] # rich rule @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, out_signature='as') @dbus_handle_exceptions def getRichRules(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getRichRules()", self._log_prefix) return self.getSettings()[12] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='as') @dbus_handle_exceptions def setRichRules(self, rules, sender=None): rules = dbus_to_python(rules, list) log.debug1("%s.setRichRules('[%s]')", self._log_prefix, ",".join(rules)) self.parent.accessCheck(sender) settings = list(self.getSettings()) rules = [ str(Rich_Rule(rule_str=r)) for r in rules ] settings[12] = rules self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def addRichRule(self, rule, sender=None): rule = dbus_to_python(rule, str) log.debug1("%s.addRichRule('%s')", self._log_prefix, rule) self.parent.accessCheck(sender) settings = list(self.getSettings()) rule_str = str(Rich_Rule(rule_str=rule)) if rule_str in settings[12]: raise FirewallError(errors.ALREADY_ENABLED, rule) settings[12].append(rule_str) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s') @dbus_handle_exceptions def removeRichRule(self, rule, sender=None): rule = dbus_to_python(rule, str) log.debug1("%s.removeRichRule('%s')", self._log_prefix, rule) self.parent.accessCheck(sender) settings = list(self.getSettings()) rule_str = str(Rich_Rule(rule_str=rule)) if rule_str not in settings[12]: raise FirewallError(errors.NOT_ENABLED, rule) settings[12].remove(rule_str) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryRichRule(self, rule, sender=None): # pylint: disable=W0613 rule = dbus_to_python(rule, str) log.debug1("%s.queryRichRule('%s')", self._log_prefix, rule) rule_str = str(Rich_Rule(rule_str=rule)) return rule_str in self.getSettings()[12] PK[ %331site-packages/firewall/server/config_icmptype.pyonu[ c`c@sddlmZddlZeejdtj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR R!RtBooleanR"R#t exceptionst DBusException(Rt property_name((sC/usr/lib/python2.7/site-packages/firewall/server/config_icmptype.pyt _get_propertyQs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR&R'R)(Rtinterface_nameR(tsender((sC/usr/lib/python2.7/site-packages/firewall/server/config_icmptype.pytGetbs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||s      PK[P*site-packages/firewall/server/__init__.pyonu[ c`c@sdS(N((((s</usr/lib/python2.7/site-packages/firewall/server/__init__.pytsPK[~x  (site-packages/firewall/server/server.pyonu[ c`c@sdgZddlZddlZddlmZmZeejd>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sGARBAGE OBJECTS (%d): s sP <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< (tcollecttlentgarbagettypeRttimeout_add_seconds(tx(tgct gc_collectt gc_timeoutR(s:/usr/lib/python2.7/site-packages/firewall/server/server.pyRLs tset_as_defaulttbustunix_signal_adds Stopping..s Raising SystemExit in run_serversException %s: %s(,tNonetpprintRRtenablet set_debugt DEBUG_LEAKtdbusR tglibt DBusGMainLoopRt SystemBusR tBusNameRtDBUS_INTERFACERt DBUS_PATHRtMainLooptslipt set_mainloopRthasattrRtunix_signal_add_fullt PRIORITY_HIGHtsignaltSIGHUPR tSIGTERMR truntKeyboardInterruptRtdebug1t SystemExitterrort Exceptiont __class__t__name__tstrtstop(tdebug_gcR RtnameR Rte((RRRRs:/usr/lib/python2.7/site-packages/firewall/server/server.pyRAsB           #(t__all__tsysR-t gi.repositoryRRtmodulesR t dbus.servicetdbus.mainloop.glibt slip.dbusR(tfirewallRtfirewall.core.loggerRtfirewall.server.firewalldRR R tFalseR(((s:/usr/lib/python2.7/site-packages/firewall/server/server.pyts          PK[ZYrRR(site-packages/firewall/server/config.pycnu[ c`c@sddlmZddlZeejde"ejj1ddedvd3Z?e"ejj1ddedvd4Z@e"ejj1dddd+edvd5ZAe"ejj1dd-edvd6ZBe"ejj1dd7edvd8ZCe"ejj1dd7edvd9ZDe"ejj1dd7dd+edvd:ZEe"ejj1dd;edvd<ZFe"ejjGdd=edvd>ZHe"ejjGdd-edvd?ZIe"ejjGdddd@edvdAZJe"ejjGddeKj3dd@edvdBZLej+j,ejjGd"dedCZMe"ejjGdd=edvdDZNe"ejjGdd-edvdEZOe"ejjGdddd@edvdFZPe"ejjGddeQj3dd@edvdGZRej+j,ejjGd"dedHZSe"ejjGdd=edvdIZTe"ejjGdd-edvdJZUe"ejjGdddd@edvdKZVe"ejjGddeWj3dd@edvdLZXej+j,ejjGd"dedMZYe"ejjGdd=edvdNZZe"ejjGdd-edvdOZ[e"ejjGdddd@edvdPZ\e"ejjGddddedvdQZ]e"ejjGddddedvdRZ^e"ejjGdde_j3dd@edvdSZ`ej+j,ejjGd"dedTZae"ejjGdd=edvdUZbe"ejjGdd-edvdVZce"ejjGdddd@edvdWZde"ejjGddeej3dd@edvdXZfej+j,ejjGd"dedYZge"ejjhdeij3edvdZZje"ejjhdeij3edvd[Zkej+j,ejjhed\Zle"ejjhdd]edvd^Zme"ejjhdd]edvd_Zne"ejjhdd]dd+edvd`Zoe"ejjhdddd-edvdaZpe"ejjhddbddcedvddZqe"ejjhddeedvdfZre"ejjhddeedvdgZse"ejjhddedd+edvdhZte"ejjhdd]edvdiZue"ejjhdd]ddjedvdkZve"ejjhddbddledvdmZwe"ejjhddnedvdoZxe"ejjhddnedvdpZye"ejjhddndd+edvdqZze"ejjhddddredvdsZ{e"ejjhddtedvduZ|RS(wsFirewallD main classcOstt|j||||_|d|_|d|_|jt|jd|_ |j j tj |j j tj |j j tj |j j tj|j j tj|j j tj|j j tj|j j tj|j j tj|j j tjtjjtjrx[ttjtjD]>}dtj|f}tjj|rG|j j |qGqGWn|j jtj|j jtj|j jtjt|tjj idd6dd6dd6dd 6dd 6dd 6dd 6dd 6dS(Niiis%s/%st readwritet CleanupOnExitt IPv6_rpfiltertLockdownt MinimalMarktIndividualCallst LogDeniedtAutomaticHelperstAllowZoneDrifting(!tsuperRt__init__Rtbusnametpatht _init_varsRt watch_updatertwatchert add_watch_dirtFIREWALLD_IPSETStETC_FIREWALLD_IPSETStFIREWALLD_ICMPTYPEStETC_FIREWALLD_ICMPTYPEStFIREWALLD_HELPERStETC_FIREWALLD_HELPERStFIREWALLD_SERVICEStETC_FIREWALLD_SERVICEStFIREWALLD_ZONEStETC_FIREWALLD_ZONEStostexiststsortedtlistdirtisdirtadd_watch_filetLOCKDOWN_WHITELISTtFIREWALLD_DIRECTtFIREWALLD_CONFRtdbustDBUS_INTERFACE_CONFIG(tselftconftargstkwargstfilenameR+((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR)GsD      cCs]g|_d|_g|_d|_g|_d|_g|_d|_g|_d|_ x0|j j D]}|j |j j |qjWx0|j jD]}|j|j j|qWx0|j jD]}|j|j j|qWx0|j jD]}|j|j j|qWx0|j jD]}|j|j j|q6WdS(Ni(tipsetst ipset_idxt icmptypest icmptype_idxtservicest service_idxtzonestzone_idxthelperst helper_idxRt get_ipsetst _addIPSett get_ipsett get_icmptypest _addIcmpTypet get_icmptypet get_servicest _addServicet get_servicet get_zonest_addZonetget_zonet get_helperst _addHelpert get_helper(REtipsetticmptypetservicetzonethelper((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR,os(          cCsdS(N((RE((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt__del__scCs&x5t|jdkr7|jj}|j~qWx5t|jdkro|jj}|j~q;Wx5t|jdkr|jj}|j~qsWx5t|jdkr|jj}|j~qWx5t|jdkr|jj}|j~qW|jdS(Ni( tlenRJtpopt unregisterRLRNRPRRR,(REtitem((s:/usr/lib/python2.7/site-packages/firewall/server/config.pytreloads*     c Cs|tjkr |jtjj}tjdtjy|jjWn+tk ru}tj d||fdSX|jtjjj }xDt |j D]0}||kr||||kr||=qqWt |dkr|jtjj|gndS|jtjs.|jtjr|jdry|jj|\}}Wn+tk r}tj d||fdSX|dkr|j|q|dkr|j|q|dkr|j|qn|jtjs|jtjr|jdry|jj|\}}Wn+tk rZ}tj d ||fdSX|dkrw|j|q|dkr|j|q|dkr|j|qn|jtjs|jtjr=|jdry|jj|\}}Wn+tk r.}tj d ||fdSX|dkrK|j |q:|dkrg|j!|q:|dkr:|j"|q:q|jtjr|j#tjd j$d }t |d ksd |krdSt%j&j'|r|j(j)|s7|j(j*|q7q:|j(j)|r:|j(j+|q:qn^|jtj,sa|jtj-r|jdry|jj.|\}}Wn+tk r}tj d||fdSX|dkr|j/|q|dkr|j0|q|dkr|j1|qn|jtj2s5|jtj3r|jdry|jj4|\}}Wn+tk r}tj d||fdSX|dkr|j5|q|dkr|j6|q|dkr|j7|qn|tj8kr@y|jj9Wn+tk r2}tj d||fdSX|j:n[|tj;kry|jj<Wn+tk r}tj d||fdSX|j=ndS(Ns,config: Reloading firewalld config file '%s's+Failed to load firewalld.conf file '%s': %sis.xmls%Failed to load icmptype file '%s': %stnewtremovetupdates$Failed to load service file '%s': %ss!Failed to load zone file '%s': %stt/is"Failed to load ipset file '%s': %ss#Failed to load helper file '%s': %ss/Failed to load lockdown whitelist file '%s': %ss)Failed to load direct rules file '%s': %s(>RRBtGetAllRCRDRtdebug1tupdate_firewalld_conft ExceptionterrortcopytlisttkeysRitPropertiesChangedt startswithR2R3tendswithtupdate_icmptype_from_pathRXtremoveIcmpTypet_updateIcmpTypeR6R7tupdate_service_from_pathR[t removeServicet_updateServiceR8R9tupdate_zone_from_pathR^t removeZonet _updateZonetreplacetstripR:R+R>R.t has_watchR/t remove_watchR0R1tupdate_ipset_from_pathRUt removeIPSett _updateIPSetR4R5tupdate_helper_from_pathRat removeHelpert _updateHelperR@tupdate_lockdown_whitelisttLockdownWhitelistUpdatedRAt update_directtUpdated( REtnamet old_propstmsgtpropstkeytwhattobjt_name((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR-s                            c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRMR*RCtDBUS_PATH_CONFIG_ICMPTYPERLtappendt IcmpTypeAddedR(RERtconfig_icmptype((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRX&s cCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RLRRR+RIR(RERRd((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR2s  cCsd}xu|jD]j}|j}|j||kr||j|j|jj|j||_|j|jjqqWxP|jD]E}|j|kr|j |j|j |jj|~qqWdS(Ni( RPt getSettingsRRoRtset_zone_configRRRLtRemovedRk(RERtindexRftsettingsRd((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR;s  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RROR*RCtDBUS_PATH_CONFIG_SERVICERNRt ServiceAddedR(RERtconfig_service((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR[MscCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RNRRR+RIR(RERRe((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRXs  cCsd}xu|jD]j}|j}|j||kr||j|j|jj|j||_|j|jjqqWxP|jD]E}|j|kr|j |j|j |jj|~qqWdS(Ni( RPRRRoRRRRRNRRk(RERRRfRRe((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRas  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRQR*RCtDBUS_PATH_CONFIG_ZONERPRt ZoneAddedR(RERt config_zone((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR^sscCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RPRRR+RIR(RERRf((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR~s * cCsWxP|jD]E}|j|kr |j|j|j|jj|~q q WdS(N(RPRRRRkRo(RERRf((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRKR*RCtDBUS_PATH_CONFIG_IPSETRJRt IPSetAddedR(RERt config_ipset((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRUscCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RJRRR+RIR(RERRc((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs * cCsWxP|jD]E}|j|kr |j|j|j|jj|~q q WdS(N(RJRRRRkRo(RERRc((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs  c Csjt||j||j|jdtjj|jf}|jj||jd7_|j|j |S(Ns%s/%di( R RRSR*RCtDBUS_PATH_CONFIG_HELPERRRRt HelperAddedR(RERt config_helper((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRascCssxl|jD]a}|jj|jkr |jj|jkr |jj|jkr ||_|j|jq q WdS(N(RRRRR+RIR(RERRg((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs * cCsWxP|jD]E}|j|kr |j|j|j|jj|~q q WdS(N(RRRRRRkRo(RERRg((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyRs  cCs|jjr|dkr,tjddStj}t||}|jjd|r`dSt ||}|jjd|rdSt |}|jjd|rdSt ||}|jjd|rdSt t jdndS(Ns&Lockdown not possible, sender not set.tcontexttuidtusertcommandslockdown is enabled(Rtlockdown_enabledtNoneRRwRCt SystemBusRt access_checkRRRRRt ACCESS_DENIED(REtsendertbusRRRR((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt accessChecks$    c CsB|d kr%tjjd |n|jjj|}|dkrn|dkratj}ntj|S|dkr|dkrtj }n t |}tj |S|dkr|dkrtj rd nd }ntj|S|dkr%|dkrtj rd nd }ntj|S|dkrb|dkrUtjrLd nd }ntj|S|dkr|dkrtjrd nd }ntj|S|dkr|dkrtj}ntj|S|dkr|dkrtj}ntj|S|d kr>|dkr1tjr(d nd }ntj|SdS(Nt DefaultZoneR#R R"R!R$R%R&R'sDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not existtyestno( Rs MinimalMarks CleanupOnExitsLockdowns IPv6_rpfiltersIndividualCallss LogDeniedsAutomaticHelperssAllowZoneDrifting(RCt exceptionst DBusExceptionRtget_firewalld_conftgetRt FALLBACK_ZONEtStringtFALLBACK_MINIMAL_MARKtinttInt32tFALLBACK_CLEANUP_ON_EXITtFALLBACK_LOCKDOWNtFALLBACK_IPV6_RPFILTERtFALLBACK_INDIVIDUAL_CALLStFALLBACK_LOG_DENIEDtFALLBACK_AUTOMATIC_HELPERStFALLBACK_ALLOW_ZONE_DRIFTING(REtproptvalue((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt _get_propertysX                                  cCsL|dkr"tj|j|S|dkrDtj|j|S|dkrftj|j|S|dkrtj|j|S|dkrtj|j|S|dkrtj|j|S|dkrtj|j|S|dkrtj|j|S|d kr2tj|j|Stjjd |dS( NRR#R R"R!R$R%R&R'sDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist(RCRRRRR(RER((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyt_get_dbus_propertys*          t in_signaturetsst out_signaturetvcCst|t}t|t}tjd|||tjjkrP|j|S|tjjtjj gkrtj j d|ntj j d||j|S(Nsconfig.Get('%s', '%s')sDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not existsJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRRtRRCRDRtDBUS_INTERFACE_CONFIG_DIRECTtDBUS_INTERFACE_CONFIG_POLICIESRR(REtinterface_namet property_nameR((s:/usr/lib/python2.7/site-packages/firewall/server/config.pytGet/s      tssa{sv}c Cst|t}tjd|i}|tjjkryxvdddddddd d g D]}|j|||RRRRRpRRERFRGRHRIRLRMRNRPRQRRRTRURVRXRY(((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyR?s8 (          2A$                                                   (<t gi.repositoryRtsystmodulesR:RCt dbus.servicet slip.dbusRbtslip.dbus.servicetfirewallRtfirewall.core.baseRtfirewall.core.watcherRtfirewall.core.loggerRtfirewall.server.decoratorsRRRtfirewall.server.config_icmptypeR tfirewall.server.config_serviceR tfirewall.server.config_zoneR tfirewall.server.config_ipsetR tfirewall.server.config_helperR tfirewall.core.io.zoneRtfirewall.core.io.serviceRtfirewall.core.io.icmptypeRtfirewall.core.io.ipsetRtfirewall.core.io.helperRt#firewall.core.io.lockdown_whitelistRtfirewall.core.io.directRtfirewall.dbus_utilsRRRRRRRRtfirewall.errorsRRetObjectR(((s:/usr/lib/python2.7/site-packages/firewall/server/config.pyts8       4PK[*!0o[o[0site-packages/firewall/server/config_service.pycnu[ c`c@sddlmZddlZeejdeejjdd(e d?d4Z?eejjdd e d?d5Z@eejjdd e d?d6ZAeejjdd dd&e d?d7ZBeejjdd8e d?d9ZCeejjdd8e d?d:ZDeejjdd dd e d?d;ZEeejjdde d?d<ZFeejjdd e d?d=ZGeejjdddd&e d?d>ZHRS(@sFirewallD main classcOs~tt|j||||_||_||_||_|d|_|d|_d|j|_ t |tj j dS(Niisconfig.service.%d( tsuperR t__init__tparentRtobjtitem_idtbusnametpatht _log_prefixRtdbustDBUS_INTERFACE_CONFIG_SERVICE(tselfRtconftserviceRtargstkwargs((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyR8s      cCsdS(N((R((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt__del__EscCs|jdS(N(tremove_from_connection(R((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt unregisterIscCs|dkrtj|jjS|dkr>tj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR R!RtBooleanR"R#t exceptionst DBusException(Rt property_name((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt _get_propertyQs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR&R'R)(Rtinterface_nameR(tsender((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytGetbs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||Msi( RRUt isinstancetappendttupleRR/RtjoinRR;RFRJ(RtportsR1t_portsRaRI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetPorts@s cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addPort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R tALREADY_ENABLEDRcRJ(RRatprotocolR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytaddPortSs cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R t NOT_ENABLEDRORJ(RRaRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt removePortcstbcCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.queryPort('%s', '%s')i(RR.RR/RRF(RRaRjR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt queryPortrs tascCs!tjd|j|jdS(Ns%s.getProtocols()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt getProtocols~scCskt|t}tjd|jdj||jj|t|j}||d<|j |dS(Ns%s.setProtocols('[%s]')R_i( RRURR/RReRR;RFRJ(Rt protocolsR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt setProtocolss cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.addProtocol('%s')i(RR.RR/RRR;RURFR R RiRcRJ(RRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt addProtocolscCst|t}tjd|j||jj|t|j}||dkrlt t j |n|dj ||j |dS(Ns%s.removeProtocol('%s')i(RR.RR/RRR;RURFR R RlRORJ(RRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytremoveProtocolscCs9t|t}tjd|j|||jdkS(Ns%s.queryProtocol(%s')i(RR.RR/RRF(RRjR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt queryProtocolscCs!tjd|j|jdS(Ns%s.getSourcePorts()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytgetSourcePortsscCsg}xIt|tD]8}t|trA|jt|q|j|qW|}tjd|jdjd|D|j j |t|j }||d<|j |dS(Ns%s.setSourcePorts('[%s]')R_css'|]}d|d|dfVqdS(s ('%s, '%s')iiN((R`Ra((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pys si( RRURbRcRdRR/RReRR;RFRJ(RRfR1RgRaRI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetSourcePortss cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addSourcePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R RiRcRJ(RRaRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt addSourcePorts cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removeSourcePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R RlRORJ(RRaRjR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytremoveSourcePortscCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.querySourcePort('%s', '%s')i(RR.RR/RRF(RRaRjR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytquerySourcePorts cCs!tjd|j|jdS(Ns%s.getModules()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt getModulesscCst|t}g}x`|D]X}|jdrg|jdd}d|krg|jdd}qgn|j|qW|}tjd|jdj||j j |t|j }||d<|j |dS(Nt nf_conntrack_tt_t-s%s.setModules('[%s]')R_i( RRUt startswithtreplaceRcRR/RReRR;RFRJ(RtmodulesR1t_modulestmoduleRI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt setModuless   cCst|t}|jdrT|jdd}d|krT|jdd}qTntjd|j||jj|t |j }||dkrt t j |n|dj||j|dS(NR}R~RRs%s.addModule('%s')i(RR.RRRR/RRR;RURFR R RiRcRJ(RRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt addModules cCst|t}|jdrT|jdd}d|krT|jdd}qTntjd|j||jj|t |j }||dkrt t j |n|dj||j|dS(NR}R~RRs%s.removeModule('%s')i(RR.RRRR/RRR;RURFR R RlRORJ(RRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt removeModule&s cCs~t|t}|jdrT|jdd}d|krT|jdd}qTntjd|j|||jdkS(NR}R~RRs%s.queryModule('%s')i(RR.RRRR/RRF(RRR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyt queryModule7s sa{ss}cCs!tjd|j|jdS(Ns%s.getDestinations()i(RR/RRF(RR1((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytgetDestinationsEscCswt|t}tjd|j|jd|jd|jj|t|j }||d<|j |dS(Ns*%s.setDestinations({ipv4:'%s', ipv6:'%s'})tipv4tipv6i( RtdictRR/RtgetRR;RURFRJ(Rt destinationsR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetDestinationsLs  cCsxt|t}tjd|j||jj|t|j}||dkrlt t j |n|d|S(Ns%s.getDestination('%s')i( RR.RR/RRR;RURFR R Rl(RtfamilyR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytgetDestinationYscCst|t}t|t}tjd|j|||jj|t|j}||dkr|d||krt t j d||fn||d|<|j |dS(Ns%s.setDestination('%s', '%s')is '%s': '%s'( RR.RR/RRR;RURFR R RiRJ(RRtaddressR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytsetDestinationfs $ cCst|t}tjd|j||jj|t|j}||dkrlt t j |n|d|=|j |dS(Ns%s.removeDestination('%s')i( RR.RR/RRR;RURFR R RlRJ(RRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytremoveDestinationvs cCset|t}t|t}tjd|j|||j}||dkod||d|kS(Ns%s.queryDestination('%s', '%s')i(RR.RR/RRF(RRRR1RI((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pytqueryDestinations  N(It__name__t __module__t__doc__tTruet persistentRRtPK_ACTION_CONFIGtdefault_polkit_auth_requiredRRR RRR)R tPROPERTIES_IFACEtNoneR2R9tsliptpolkitt require_authR=RtsignalR@tPK_ACTION_INFOtINTROSPECTABLE_IFACERBRRtDBUS_SIGNATURERFRJRLRHRORPRSRRRTRWRXRZR[R]R^RhRkRmRoRqRsRtRuRvRwRxRyRzR{R|RRRRRRRRRR(((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyR 0sf  $                             (t gi.repositoryRtsysRRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.serviceRtfirewall.core.loggerRtfirewall.server.decoratorsRR R R tfirewall.errorsR RtObjectR (((sB/usr/lib/python2.7/site-packages/firewall/server/config_service.pyts      PK[S==/site-packages/firewall/server/config_helper.pyonu[ c`c@sddlmZddlZeejdtj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR R!RtBooleanR"R#t exceptionst DBusException(Rt property_name((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyt _get_propertyQs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR&R'R)(Rtinterface_nameR(tsender((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pytGetbs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||si( RRUt isinstancetappendttupleRR/RtjoinRR;RFRJ(RtportsR1t_portsRkRI((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pytsetPortss cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.addPort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R R_RmRJ(RRktprotocolR1RI((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pytaddPorts cCst|t}t|t}tjd|j|||jj|t|j}||f|dkrt t j d||fn|dj ||f|j |dS(Ns%s.removePort('%s', '%s')is%s:%s(RR.RR/RRR;RURFR R t NOT_ENABLEDRORJ(RRkRsR1RI((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyt removePortscCsQt|t}t|t}tjd|j||||f|jdkS(Ns%s.queryPort('%s', '%s')i(RR.RR/RRF(RRkRsR1((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyt queryPorts N(:t__name__t __module__t__doc__tTruet persistentRRtPK_ACTION_CONFIGtdefault_polkit_auth_requiredRRR RRR)R tPROPERTIES_IFACEtNoneR2R9tsliptpolkitt require_authR=tservicetsignalR@tPK_ACTION_INFOtINTROSPECTABLE_IFACERBRRtDBUS_SIGNATURERFRJRLRHRORPRSRRRTRWRXRZR[R]R^RaRcRdRfRgRhRrRtRvRw(((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyR 0s  $                (t gi.repositoryRtsystmodulesRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.helperRtfirewall.core.loggerRtfirewall.server.decoratorsRR R R tfirewall.errorsR RtObjectR (((sA/usr/lib/python2.7/site-packages/firewall/server/config_helper.pyts      PK[x]DD.site-packages/firewall/server/config_helper.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # force use of pygobject3 in python-slip from gi.repository import GObject import sys sys.modules['gobject'] = GObject import dbus import dbus.service import slip.dbus import slip.dbus.service from firewall import config from firewall.dbus_utils import dbus_to_python, \ dbus_introspection_prepare_properties, \ dbus_introspection_add_properties from firewall.core.io.helper import Helper from firewall.core.logger import log from firewall.server.decorators import handle_exceptions, \ dbus_handle_exceptions, dbus_service_method from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class FirewallDConfig # ############################################################################ class FirewallDConfigHelper(slip.dbus.service.Object): """FirewallD main class""" persistent = True """ Make FirewallD persistent. """ default_polkit_auth_required = config.dbus.PK_ACTION_CONFIG """ Use PK_ACTION_INFO as a default """ @handle_exceptions def __init__(self, parent, conf, helper, item_id, *args, **kwargs): super(FirewallDConfigHelper, self).__init__(*args, **kwargs) self.parent = parent self.config = conf self.obj = helper self.item_id = item_id self.busname = args[0] self.path = args[1] self._log_prefix = "config.helper.%d" % self.item_id dbus_introspection_prepare_properties( self, config.dbus.DBUS_INTERFACE_CONFIG_HELPER) @dbus_handle_exceptions def __del__(self): pass @dbus_handle_exceptions def unregister(self): self.remove_from_connection() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # P R O P E R T I E S @dbus_handle_exceptions def _get_property(self, property_name): if property_name == "name": return dbus.String(self.obj.name) elif property_name == "filename": return dbus.String(self.obj.filename) elif property_name == "path": return dbus.String(self.obj.path) elif property_name == "default": return dbus.Boolean(self.obj.default) elif property_name == "builtin": return dbus.Boolean(self.obj.builtin) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @dbus_handle_exceptions def Get(self, interface_name, property_name, sender=None): # pylint: disable=W0613 # get a property interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) log.debug1("%s.Get('%s', '%s')", self._log_prefix, interface_name, property_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_HELPER: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return self._get_property(property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') @dbus_handle_exceptions def GetAll(self, interface_name, sender=None): # pylint: disable=W0613 interface_name = dbus_to_python(interface_name, str) log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_HELPER: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) ret = { } for x in [ "name", "filename", "path", "default", "builtin" ]: ret[x] = self._get_property(x) return dbus.Dictionary(ret, signature="sv") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ssv') @dbus_handle_exceptions def Set(self, interface_name, property_name, new_value, sender=None): interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) new_value = dbus_to_python(new_value) log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix, interface_name, property_name, new_value) self.parent.accessCheck(sender) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_HELPER: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.PropertyReadOnly: " "Property '%s' is read-only" % property_name) @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): interface_name = dbus_to_python(interface_name, str) changed_properties = dbus_to_python(changed_properties) invalidated_properties = dbus_to_python(invalidated_properties) log.debug1("%s.PropertiesChanged('%s', '%s', '%s')", self._log_prefix, interface_name, changed_properties, invalidated_properties) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(dbus.INTROSPECTABLE_IFACE, out_signature='s') @dbus_handle_exceptions def Introspect(self, sender=None): # pylint: disable=W0613 log.debug2("%s.Introspect()", self._log_prefix) data = super(FirewallDConfigHelper, self).Introspect( self.path, self.busname.get_bus()) return dbus_introspection_add_properties( self, data, config.dbus.DBUS_INTERFACE_CONFIG_HELPER) # S E T T I N G S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, out_signature=Helper.DBUS_SIGNATURE) @dbus_handle_exceptions def getSettings(self, sender=None): # pylint: disable=W0613 """get settings for helper """ log.debug1("%s.getSettings()", self._log_prefix) return self.config.get_helper_config(self.obj) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature=Helper.DBUS_SIGNATURE) @dbus_handle_exceptions def update(self, settings, sender=None): """update settings for helper """ settings = dbus_to_python(settings) log.debug1("%s.update('...')", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.set_helper_config(self.obj, settings) self.Updated(self.obj.name) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER) @dbus_handle_exceptions def loadDefaults(self, sender=None): """load default settings for builtin helper """ log.debug1("%s.loadDefaults()", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.load_helper_defaults(self.obj) self.Updated(self.obj.name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, signature='s') @dbus_handle_exceptions def Updated(self, name): log.debug1("%s.Updated('%s')" % (self._log_prefix, name)) # R E M O V E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER) @dbus_handle_exceptions def remove(self, sender=None): """remove helper """ log.debug1("%s.removeHelper()", self._log_prefix) self.parent.accessCheck(sender) self.config.remove_helper(self.obj) self.parent.removeHelper(self.obj) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, signature='s') @dbus_handle_exceptions def Removed(self, name): log.debug1("%s.Removed('%s')" % (self._log_prefix, name)) # R E N A M E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s') @dbus_handle_exceptions def rename(self, name, sender=None): """rename helper """ name = dbus_to_python(name, str) log.debug1("%s.rename('%s')", self._log_prefix, name) self.parent.accessCheck(sender) self.obj = self.config.rename_helper(self.obj, name) self.Renamed(name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, signature='s') @dbus_handle_exceptions def Renamed(self, name): log.debug1("%s.Renamed('%s')" % (self._log_prefix, name)) # version @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, out_signature='s') @dbus_handle_exceptions def getVersion(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getVersion()", self._log_prefix) return self.getSettings()[0] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s') @dbus_handle_exceptions def setVersion(self, version, sender=None): version = dbus_to_python(version, str) log.debug1("%s.setVersion('%s')", self._log_prefix, version) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[0] = version self.update(settings) # short @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, out_signature='s') @dbus_handle_exceptions def getShort(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getShort()", self._log_prefix) return self.getSettings()[1] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s') @dbus_handle_exceptions def setShort(self, short, sender=None): short = dbus_to_python(short, str) log.debug1("%s.setShort('%s')", self._log_prefix, short) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[1] = short self.update(settings) # description @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, out_signature='s') @dbus_handle_exceptions def getDescription(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getDescription()", self._log_prefix) return self.getSettings()[2] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s') @dbus_handle_exceptions def setDescription(self, description, sender=None): description = dbus_to_python(description, str) log.debug1("%s.setDescription('%s')", self._log_prefix, description) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[2] = description self.update(settings) # family @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, out_signature='s') @dbus_handle_exceptions def getFamily(self, sender=None): log.debug1("%s.getFamily()", self._log_prefix) self.parent.accessCheck(sender) settings = list(self.getSettings()) return settings[3] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s') @dbus_handle_exceptions def setFamily(self, ipv, sender=None): ipv = dbus_to_python(ipv, str) log.debug1("%s.setFamily('%s')", self._log_prefix, ipv) self.parent.accessCheck(sender) settings = list(self.getSettings()) if settings[3] == ipv: raise FirewallError(errors.ALREADY_ENABLED, "'%s'" % ipv) settings[3] = ipv self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryFamily(self, ipv, sender=None): # pylint: disable=W0613 ipv = dbus_to_python(ipv, str) log.debug1("%s.queryFamily('%s')", self._log_prefix, ipv) settings = self.getSettings() return (settings[3] == ipv) # module @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, out_signature='s') @dbus_handle_exceptions def getModule(self, sender=None): log.debug1("%s.getModule()", self._log_prefix) self.parent.accessCheck(sender) settings = list(self.getSettings()) return settings[4] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s') @dbus_handle_exceptions def setModule(self, module, sender=None): module = dbus_to_python(module, str) log.debug1("%s.setModule('%s')", self._log_prefix, module) self.parent.accessCheck(sender) settings = list(self.getSettings()) if settings[4] == module: raise FirewallError(errors.ALREADY_ENABLED, "'%s'" % module) settings[4] = module self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryModule(self, module, sender=None): # pylint: disable=W0613 module = dbus_to_python(module, str) log.debug1("%s.queryModule('%s')", self._log_prefix, module) settings = self.getSettings() return (settings[4] == module) # port @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, out_signature='a(ss)') @dbus_handle_exceptions def getPorts(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getPorts()", self._log_prefix) return self.getSettings()[5] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='a(ss)') @dbus_handle_exceptions def setPorts(self, ports, sender=None): _ports = [ ] # convert embedded lists to tuples for port in dbus_to_python(ports, list): if isinstance(port, list): _ports.append(tuple(port)) else: _ports.append(port) ports = _ports log.debug1("%s.setPorts('[%s]')", self._log_prefix, ",".join("('%s, '%s')" % (port[0], port[1]) for port in ports)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[5] = ports self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='ss') @dbus_handle_exceptions def addPort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.addPort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) in settings[5]: raise FirewallError(errors.ALREADY_ENABLED, "%s:%s" % (port, protocol)) settings[5].append((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='ss') @dbus_handle_exceptions def removePort(self, port, protocol, sender=None): port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.removePort('%s', '%s')", self._log_prefix, port, protocol) self.parent.accessCheck(sender) settings = list(self.getSettings()) if (port,protocol) not in settings[5]: raise FirewallError(errors.NOT_ENABLED, "%s:%s" % (port, protocol)) settings[5].remove((port,protocol)) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_HELPER, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryPort(self, port, protocol, sender=None): # pylint: disable=W0613 port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("%s.queryPort('%s', '%s')", self._log_prefix, port, protocol) return (port,protocol) in self.getSettings()[5] PK[Zŋ'site-packages/firewall/server/config.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # force use of pygobject3 in python-slip from gi.repository import GObject import sys sys.modules['gobject'] = GObject import os import dbus import dbus.service import slip.dbus import slip.dbus.service from firewall import config from firewall.core.base import DEFAULT_ZONE_TARGET from firewall.core.watcher import Watcher from firewall.core.logger import log from firewall.server.decorators import handle_exceptions, \ dbus_handle_exceptions, dbus_service_method from firewall.server.config_icmptype import FirewallDConfigIcmpType from firewall.server.config_service import FirewallDConfigService from firewall.server.config_zone import FirewallDConfigZone from firewall.server.config_ipset import FirewallDConfigIPSet from firewall.server.config_helper import FirewallDConfigHelper from firewall.core.io.zone import Zone from firewall.core.io.service import Service from firewall.core.io.icmptype import IcmpType from firewall.core.io.ipset import IPSet from firewall.core.io.helper import Helper from firewall.core.io.lockdown_whitelist import LockdownWhitelist from firewall.core.io.direct import Direct from firewall.dbus_utils import dbus_to_python, \ command_of_sender, context_of_sender, uid_of_sender, user_of_uid, \ dbus_introspection_prepare_properties, \ dbus_introspection_add_properties from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class FirewallDConfig # ############################################################################ class FirewallDConfig(slip.dbus.service.Object): """FirewallD main class""" persistent = True """ Make FirewallD persistent. """ default_polkit_auth_required = config.dbus.PK_ACTION_CONFIG """ Use config.dbus.PK_ACTION_INFO as a default """ @handle_exceptions def __init__(self, conf, *args, **kwargs): super(FirewallDConfig, self).__init__(*args, **kwargs) self.config = conf self.busname = args[0] self.path = args[1] self._init_vars() self.watcher = Watcher(self.watch_updater, 5) self.watcher.add_watch_dir(config.FIREWALLD_IPSETS) self.watcher.add_watch_dir(config.ETC_FIREWALLD_IPSETS) self.watcher.add_watch_dir(config.FIREWALLD_ICMPTYPES) self.watcher.add_watch_dir(config.ETC_FIREWALLD_ICMPTYPES) self.watcher.add_watch_dir(config.FIREWALLD_HELPERS) self.watcher.add_watch_dir(config.ETC_FIREWALLD_HELPERS) self.watcher.add_watch_dir(config.FIREWALLD_SERVICES) self.watcher.add_watch_dir(config.ETC_FIREWALLD_SERVICES) self.watcher.add_watch_dir(config.FIREWALLD_ZONES) self.watcher.add_watch_dir(config.ETC_FIREWALLD_ZONES) # Add watches for combined zone directories if os.path.exists(config.ETC_FIREWALLD_ZONES): for filename in sorted(os.listdir(config.ETC_FIREWALLD_ZONES)): path = "%s/%s" % (config.ETC_FIREWALLD_ZONES, filename) if os.path.isdir(path): self.watcher.add_watch_dir(path) self.watcher.add_watch_file(config.LOCKDOWN_WHITELIST) self.watcher.add_watch_file(config.FIREWALLD_DIRECT) self.watcher.add_watch_file(config.FIREWALLD_CONF) dbus_introspection_prepare_properties(self, config.dbus.DBUS_INTERFACE_CONFIG, { "CleanupOnExit": "readwrite", "IPv6_rpfilter": "readwrite", "Lockdown": "readwrite", "MinimalMark": "readwrite", "IndividualCalls": "readwrite", "LogDenied": "readwrite", "AutomaticHelpers": "readwrite", "AllowZoneDrifting": "readwrite", }) @handle_exceptions def _init_vars(self): self.ipsets = [ ] self.ipset_idx = 0 self.icmptypes = [ ] self.icmptype_idx = 0 self.services = [ ] self.service_idx = 0 self.zones = [ ] self.zone_idx = 0 self.helpers = [ ] self.helper_idx = 0 for ipset in self.config.get_ipsets(): self._addIPSet(self.config.get_ipset(ipset)) for icmptype in self.config.get_icmptypes(): self._addIcmpType(self.config.get_icmptype(icmptype)) for service in self.config.get_services(): self._addService(self.config.get_service(service)) for zone in self.config.get_zones(): self._addZone(self.config.get_zone(zone)) for helper in self.config.get_helpers(): self._addHelper(self.config.get_helper(helper)) @handle_exceptions def __del__(self): pass @handle_exceptions def reload(self): while len(self.ipsets) > 0: item = self.ipsets.pop() item.unregister() del item while len(self.icmptypes) > 0: item = self.icmptypes.pop() item.unregister() del item while len(self.services) > 0: item = self.services.pop() item.unregister() del item while len(self.zones) > 0: item = self.zones.pop() item.unregister() del item while len(self.helpers) > 0: item = self.helpers.pop() item.unregister() del item self._init_vars() @handle_exceptions def watch_updater(self, name): if name == config.FIREWALLD_CONF: old_props = self.GetAll(config.dbus.DBUS_INTERFACE_CONFIG) log.debug1("config: Reloading firewalld config file '%s'", config.FIREWALLD_CONF) try: self.config.update_firewalld_conf() except Exception as msg: log.error("Failed to load firewalld.conf file '%s': %s" % \ (name, msg)) return props = self.GetAll(config.dbus.DBUS_INTERFACE_CONFIG).copy() for key in list(props.keys()): if key in old_props and old_props[key] == props[key]: del props[key] if len(props) > 0: self.PropertiesChanged(config.dbus.DBUS_INTERFACE_CONFIG, props, []) return if (name.startswith(config.FIREWALLD_ICMPTYPES) or \ name.startswith(config.ETC_FIREWALLD_ICMPTYPES)) and \ name.endswith(".xml"): try: (what, obj) = self.config.update_icmptype_from_path(name) except Exception as msg: log.error("Failed to load icmptype file '%s': %s" % (name, msg)) return if what == "new": self._addIcmpType(obj) elif what == "remove": self.removeIcmpType(obj) elif what == "update": self._updateIcmpType(obj) elif (name.startswith(config.FIREWALLD_SERVICES) or \ name.startswith(config.ETC_FIREWALLD_SERVICES)) and \ name.endswith(".xml"): try: (what, obj) = self.config.update_service_from_path(name) except Exception as msg: log.error("Failed to load service file '%s': %s" % (name, msg)) return if what == "new": self._addService(obj) elif what == "remove": self.removeService(obj) elif what == "update": self._updateService(obj) elif name.startswith(config.FIREWALLD_ZONES) or \ name.startswith(config.ETC_FIREWALLD_ZONES): if name.endswith(".xml"): try: (what, obj) = self.config.update_zone_from_path(name) except Exception as msg: log.error("Failed to load zone file '%s': %s" % (name, msg)) return if what == "new": self._addZone(obj) elif what == "remove": self.removeZone(obj) elif what == "update": self._updateZone(obj) elif name.startswith(config.ETC_FIREWALLD_ZONES): # possible combined zone base directory _name = name.replace(config.ETC_FIREWALLD_ZONES, "").strip("/") if len(_name) < 1 or "/" in _name: # if there is a / in x, then it is a sub sub directory # ignore it return if os.path.isdir(name): if not self.watcher.has_watch(name): self.watcher.add_watch_dir(name) elif self.watcher.has_watch(name): self.watcher.remove_watch(name) elif (name.startswith(config.FIREWALLD_IPSETS) or \ name.startswith(config.ETC_FIREWALLD_IPSETS)) and \ name.endswith(".xml"): try: (what, obj) = self.config.update_ipset_from_path(name) except Exception as msg: log.error("Failed to load ipset file '%s': %s" % (name, msg)) return if what == "new": self._addIPSet(obj) elif what == "remove": self.removeIPSet(obj) elif what == "update": self._updateIPSet(obj) elif (name.startswith(config.FIREWALLD_HELPERS) or \ name.startswith(config.ETC_FIREWALLD_HELPERS)) and \ name.endswith(".xml"): try: (what, obj) = self.config.update_helper_from_path(name) except Exception as msg: log.error("Failed to load helper file '%s': %s" % (name, msg)) return if what == "new": self._addHelper(obj) elif what == "remove": self.removeHelper(obj) elif what == "update": self._updateHelper(obj) elif name == config.LOCKDOWN_WHITELIST: try: self.config.update_lockdown_whitelist() except Exception as msg: log.error("Failed to load lockdown whitelist file '%s': %s" % \ (name, msg)) return self.LockdownWhitelistUpdated() elif name == config.FIREWALLD_DIRECT: try: self.config.update_direct() except Exception as msg: log.error("Failed to load direct rules file '%s': %s" % (name, msg)) return self.Updated() @handle_exceptions def _addIcmpType(self, obj): # TODO: check for idx overflow config_icmptype = FirewallDConfigIcmpType( self, self.config, obj, self.icmptype_idx, self.busname, "%s/%d" % (config.dbus.DBUS_PATH_CONFIG_ICMPTYPE, self.icmptype_idx)) self.icmptypes.append(config_icmptype) self.icmptype_idx += 1 self.IcmpTypeAdded(obj.name) return config_icmptype @handle_exceptions def _updateIcmpType(self, obj): for icmptype in self.icmptypes: if icmptype.obj.name == obj.name and \ icmptype.obj.path == obj.path and \ icmptype.obj.filename == obj.filename: icmptype.obj = obj icmptype.Updated(obj.name) @handle_exceptions def removeIcmpType(self, obj): index = 7 # see IMPORT_EXPORT_STRUCTURE in class Zone(IO_Object) for zone in self.zones: settings = zone.getSettings() # if this IcmpType is used in a zone remove it from that zone first if obj.name in settings[index]: settings[index].remove(obj.name) zone.obj = self.config.set_zone_config(zone.obj, settings) zone.Updated(zone.obj.name) for icmptype in self.icmptypes: if icmptype.obj == obj: icmptype.Removed(obj.name) icmptype.unregister() self.icmptypes.remove(icmptype) del icmptype @handle_exceptions def _addService(self, obj): # TODO: check for idx overflow config_service = FirewallDConfigService( self, self.config, obj, self.service_idx, self.busname, "%s/%d" % (config.dbus.DBUS_PATH_CONFIG_SERVICE, self.service_idx)) self.services.append(config_service) self.service_idx += 1 self.ServiceAdded(obj.name) return config_service @handle_exceptions def _updateService(self, obj): for service in self.services: if service.obj.name == obj.name and \ service.obj.path == obj.path and \ service.obj.filename == obj.filename: service.obj = obj service.Updated(obj.name) @handle_exceptions def removeService(self, obj): index = 5 # see IMPORT_EXPORT_STRUCTURE in class Zone(IO_Object) for zone in self.zones: settings = zone.getSettings() # if this Service is used in a zone remove it from that zone first if obj.name in settings[index]: settings[index].remove(obj.name) zone.obj = self.config.set_zone_config(zone.obj, settings) zone.Updated(zone.obj.name) for service in self.services: if service.obj == obj: service.Removed(obj.name) service.unregister() self.services.remove(service) del service @handle_exceptions def _addZone(self, obj): # TODO: check for idx overflow config_zone = FirewallDConfigZone( self, self.config, obj, self.zone_idx, self.busname, "%s/%d" % (config.dbus.DBUS_PATH_CONFIG_ZONE, self.zone_idx)) self.zones.append(config_zone) self.zone_idx += 1 self.ZoneAdded(obj.name) return config_zone @handle_exceptions def _updateZone(self, obj): for zone in self.zones: if zone.obj.name == obj.name and zone.obj.path == obj.path and \ zone.obj.filename == obj.filename: zone.obj = obj zone.Updated(obj.name) @handle_exceptions def removeZone(self, obj): for zone in self.zones: if zone.obj == obj: zone.Removed(obj.name) zone.unregister() self.zones.remove(zone) del zone @handle_exceptions def _addIPSet(self, obj): # TODO: check for idx overflow config_ipset = FirewallDConfigIPSet( self, self.config, obj, self.ipset_idx, self.busname, "%s/%d" % (config.dbus.DBUS_PATH_CONFIG_IPSET, self.ipset_idx)) self.ipsets.append(config_ipset) self.ipset_idx += 1 self.IPSetAdded(obj.name) return config_ipset @handle_exceptions def _updateIPSet(self, obj): for ipset in self.ipsets: if ipset.obj.name == obj.name and ipset.obj.path == obj.path and \ ipset.obj.filename == obj.filename: ipset.obj = obj ipset.Updated(obj.name) @handle_exceptions def removeIPSet(self, obj): for ipset in self.ipsets: if ipset.obj == obj: ipset.Removed(obj.name) ipset.unregister() self.ipsets.remove(ipset) del ipset # access check @handle_exceptions def _addHelper(self, obj): # TODO: check for idx overflow config_helper = FirewallDConfigHelper( self, self.config, obj, self.helper_idx, self.busname, "%s/%d" % (config.dbus.DBUS_PATH_CONFIG_HELPER, self.helper_idx)) self.helpers.append(config_helper) self.helper_idx += 1 self.HelperAdded(obj.name) return config_helper @handle_exceptions def _updateHelper(self, obj): for helper in self.helpers: if helper.obj.name == obj.name and helper.obj.path == obj.path and \ helper.obj.filename == obj.filename: helper.obj = obj helper.Updated(obj.name) @handle_exceptions def removeHelper(self, obj): for helper in self.helpers: if helper.obj == obj: helper.Removed(obj.name) helper.unregister() self.helpers.remove(helper) del helper # access check @dbus_handle_exceptions def accessCheck(self, sender): if self.config.lockdown_enabled(): if sender is None: log.error("Lockdown not possible, sender not set.") return bus = dbus.SystemBus() context = context_of_sender(bus, sender) if self.config.access_check("context", context): return uid = uid_of_sender(bus, sender) if self.config.access_check("uid", uid): return user = user_of_uid(uid) if self.config.access_check("user", user): return command = command_of_sender(bus, sender) if self.config.access_check("command", command): return raise FirewallError(errors.ACCESS_DENIED, "lockdown is enabled") # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # P R O P E R T I E S @dbus_handle_exceptions def _get_property(self, prop): if prop not in [ "DefaultZone", "MinimalMark", "CleanupOnExit", "Lockdown", "IPv6_rpfilter", "IndividualCalls", "LogDenied", "AutomaticHelpers", "AllowZoneDrifting"]: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % prop) value = self.config.get_firewalld_conf().get(prop) if prop == "DefaultZone": if value is None: value = config.FALLBACK_ZONE return dbus.String(value) elif prop == "MinimalMark": if value is None: value = config.FALLBACK_MINIMAL_MARK else: value = int(value) return dbus.Int32(value) elif prop == "CleanupOnExit": if value is None: value = "yes" if config.FALLBACK_CLEANUP_ON_EXIT else "no" return dbus.String(value) elif prop == "Lockdown": if value is None: value = "yes" if config.FALLBACK_LOCKDOWN else "no" return dbus.String(value) elif prop == "IPv6_rpfilter": if value is None: value = "yes" if config.FALLBACK_IPV6_RPFILTER else "no" return dbus.String(value) elif prop == "IndividualCalls": if value is None: value = "yes" if config.FALLBACK_INDIVIDUAL_CALLS else "no" return dbus.String(value) elif prop == "LogDenied": if value is None: value = config.FALLBACK_LOG_DENIED return dbus.String(value) elif prop == "AutomaticHelpers": if value is None: value = config.FALLBACK_AUTOMATIC_HELPERS return dbus.String(value) elif prop == "AllowZoneDrifting": if value is None: value = "yes" if config.FALLBACK_ALLOW_ZONE_DRIFTING else "no" return dbus.String(value) @dbus_handle_exceptions def _get_dbus_property(self, prop): if prop == "DefaultZone": return dbus.String(self._get_property(prop)) elif prop == "MinimalMark": return dbus.Int32(self._get_property(prop)) elif prop == "CleanupOnExit": return dbus.String(self._get_property(prop)) elif prop == "Lockdown": return dbus.String(self._get_property(prop)) elif prop == "IPv6_rpfilter": return dbus.String(self._get_property(prop)) elif prop == "IndividualCalls": return dbus.String(self._get_property(prop)) elif prop == "LogDenied": return dbus.String(self._get_property(prop)) elif prop == "AutomaticHelpers": return dbus.String(self._get_property(prop)) elif prop == "AllowZoneDrifting": return dbus.String(self._get_property(prop)) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % prop) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @dbus_handle_exceptions def Get(self, interface_name, property_name, sender=None): # pylint: disable=W0613 # get a property interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) log.debug1("config.Get('%s', '%s')", interface_name, property_name) if interface_name == config.dbus.DBUS_INTERFACE_CONFIG: return self._get_dbus_property(property_name) elif interface_name in [ config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, config.dbus.DBUS_INTERFACE_CONFIG_POLICIES ]: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return self._get_dbus_property(property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') @dbus_handle_exceptions def GetAll(self, interface_name, sender=None): # pylint: disable=W0613 interface_name = dbus_to_python(interface_name, str) log.debug1("config.GetAll('%s')", interface_name) ret = { } if interface_name == config.dbus.DBUS_INTERFACE_CONFIG: for x in [ "DefaultZone", "MinimalMark", "CleanupOnExit", "Lockdown", "IPv6_rpfilter", "IndividualCalls", "LogDenied", "AutomaticHelpers", "AllowZoneDrifting" ]: ret[x] = self._get_property(x) elif interface_name in [ config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, config.dbus.DBUS_INTERFACE_CONFIG_POLICIES ]: pass else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return dbus.Dictionary(ret, signature="sv") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ssv') @dbus_handle_exceptions def Set(self, interface_name, property_name, new_value, sender=None): interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) new_value = dbus_to_python(new_value) log.debug1("config.Set('%s', '%s', '%s')", interface_name, property_name, new_value) self.accessCheck(sender) if interface_name == config.dbus.DBUS_INTERFACE_CONFIG: if property_name in [ "MinimalMark", "CleanupOnExit", "Lockdown", "IPv6_rpfilter", "IndividualCalls", "LogDenied", "AutomaticHelpers", "AllowZoneDrifting" ]: if property_name == "MinimalMark": try: int(new_value) except ValueError: raise FirewallError(errors.INVALID_MARK, new_value) try: new_value = str(new_value) except: raise FirewallError(errors.INVALID_VALUE, "'%s' for %s" % \ (new_value, property_name)) if property_name in [ "CleanupOnExit", "Lockdown", "IPv6_rpfilter", "IndividualCalls" ]: if new_value.lower() not in [ "yes", "no", "true", "false" ]: raise FirewallError(errors.INVALID_VALUE, "'%s' for %s" % \ (new_value, property_name)) if property_name == "LogDenied": if new_value not in config.LOG_DENIED_VALUES: raise FirewallError(errors.INVALID_VALUE, "'%s' for %s" % \ (new_value, property_name)) if property_name == "AutomaticHelpers": if new_value not in config.AUTOMATIC_HELPERS_VALUES: raise FirewallError(errors.INVALID_VALUE, "'%s' for %s" % \ (new_value, property_name)) if property_name == "AllowZoneDrifting": if new_value.lower() not in ["yes", "true", "no", "false"]: raise FirewallError(errors.INVALID_VALUE, "'%s' for %s" % \ (new_value, property_name)) self.config.get_firewalld_conf().set(property_name, new_value) self.config.get_firewalld_conf().write() self.PropertiesChanged(interface_name, { property_name: new_value }, [ ]) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) elif interface_name in [ config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, config.dbus.DBUS_INTERFACE_CONFIG_POLICIES ]: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): interface_name = dbus_to_python(interface_name, str) changed_properties = dbus_to_python(changed_properties) invalidated_properties = dbus_to_python(invalidated_properties) log.debug1("config.PropertiesChanged('%s', '%s', '%s')", interface_name, changed_properties, invalidated_properties) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(dbus.INTROSPECTABLE_IFACE, out_signature='s') @dbus_handle_exceptions def Introspect(self, sender=None): # pylint: disable=W0613 log.debug2("config.Introspect()") data = super(FirewallDConfig, self).Introspect(self.path, self.busname.get_bus()) return dbus_introspection_add_properties( self, data, config.dbus.DBUS_INTERFACE_CONFIG) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # policies @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, out_signature=LockdownWhitelist.DBUS_SIGNATURE) @dbus_handle_exceptions def getLockdownWhitelist(self, sender=None): # pylint: disable=W0613 log.debug1("config.policies.getLockdownWhitelist()") return self.config.get_policies().lockdown_whitelist.export_config() @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature=LockdownWhitelist.DBUS_SIGNATURE) @dbus_handle_exceptions def setLockdownWhitelist(self, settings, sender=None): # pylint: disable=W0613 log.debug1("config.policies.setLockdownWhitelist(...)") settings = dbus_to_python(settings) self.config.get_policies().lockdown_whitelist.import_config(settings) self.config.get_policies().lockdown_whitelist.write() self.LockdownWhitelistUpdated() @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES) @dbus_handle_exceptions def LockdownWhitelistUpdated(self): log.debug1("config.policies.LockdownWhitelistUpdated()") # command @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s') @dbus_handle_exceptions def addLockdownWhitelistCommand(self, command, sender=None): command = dbus_to_python(command) log.debug1("config.policies.addLockdownWhitelistCommand('%s')", command) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if command in settings[0]: raise FirewallError(errors.ALREADY_ENABLED, command) settings[0].append(command) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s') @dbus_handle_exceptions def removeLockdownWhitelistCommand(self, command, sender=None): command = dbus_to_python(command) log.debug1("config.policies.removeLockdownWhitelistCommand('%s')", command) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if command not in settings[0]: raise FirewallError(errors.NOT_ENABLED, command) settings[0].remove(command) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistCommand(self, command, sender=None): # pylint: disable=W0613 command = dbus_to_python(command) log.debug1("config.policies.queryLockdownWhitelistCommand('%s')", command) return command in self.getLockdownWhitelist()[0] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, out_signature='as') @dbus_handle_exceptions def getLockdownWhitelistCommands(self, sender=None): # pylint: disable=W0613 log.debug1("config.policies.getLockdownWhitelistCommands()") return self.getLockdownWhitelist()[0] # context @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s') @dbus_handle_exceptions def addLockdownWhitelistContext(self, context, sender=None): context = dbus_to_python(context) log.debug1("config.policies.addLockdownWhitelistContext('%s')", context) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if context in settings[1]: raise FirewallError(errors.ALREADY_ENABLED, context) settings[1].append(context) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s') @dbus_handle_exceptions def removeLockdownWhitelistContext(self, context, sender=None): context = dbus_to_python(context) log.debug1("config.policies.removeLockdownWhitelistContext('%s')", context) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if context not in settings[1]: raise FirewallError(errors.NOT_ENABLED, context) settings[1].remove(context) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistContext(self, context, sender=None): # pylint: disable=W0613 context = dbus_to_python(context) log.debug1("config.policies.queryLockdownWhitelistContext('%s')", context) return context in self.getLockdownWhitelist()[1] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, out_signature='as') @dbus_handle_exceptions def getLockdownWhitelistContexts(self, sender=None): # pylint: disable=W0613 log.debug1("config.policies.getLockdownWhitelistContexts()") return self.getLockdownWhitelist()[1] # user @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s') @dbus_handle_exceptions def addLockdownWhitelistUser(self, user, sender=None): user = dbus_to_python(user) log.debug1("config.policies.addLockdownWhitelistUser('%s')", user) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if user in settings[2]: raise FirewallError(errors.ALREADY_ENABLED, user) settings[2].append(user) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s') @dbus_handle_exceptions def removeLockdownWhitelistUser(self, user, sender=None): user = dbus_to_python(user) log.debug1("config.policies.removeLockdownWhitelistUser('%s')", user) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if user not in settings[2]: raise FirewallError(errors.NOT_ENABLED, user) settings[2].remove(user) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistUser(self, user, sender=None): # pylint: disable=W0613 user = dbus_to_python(user) log.debug1("config.policies.queryLockdownWhitelistUser('%s')", user) return user in self.getLockdownWhitelist()[2] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, out_signature='as') @dbus_handle_exceptions def getLockdownWhitelistUsers(self, sender=None): # pylint: disable=W0613 log.debug1("config.policies.getLockdownWhitelistUsers()") return self.getLockdownWhitelist()[2] # uid @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='i') @dbus_handle_exceptions def addLockdownWhitelistUid(self, uid, sender=None): uid = dbus_to_python(uid) log.debug1("config.policies.addLockdownWhitelistUid(%d)", uid) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if uid in settings[3]: raise FirewallError(errors.ALREADY_ENABLED, uid) settings[3].append(uid) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='i') @dbus_handle_exceptions def removeLockdownWhitelistUid(self, uid, sender=None): uid = dbus_to_python(uid) log.debug1("config.policies.removeLockdownWhitelistUid(%d)", uid) self.accessCheck(sender) settings = list(self.getLockdownWhitelist()) if uid not in settings[3]: raise FirewallError(errors.NOT_ENABLED, uid) settings[3].remove(uid) self.setLockdownWhitelist(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, in_signature='i', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistUid(self, uid, sender=None): # pylint: disable=W0613 uid = dbus_to_python(uid) log.debug1("config.policies.queryLockdownWhitelistUid(%d)", uid) return uid in self.getLockdownWhitelist()[3] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_POLICIES, out_signature='ai') @dbus_handle_exceptions def getLockdownWhitelistUids(self, sender=None): # pylint: disable=W0613 log.debug1("config.policies.getLockdownWhitelistUids()") return self.getLockdownWhitelist()[3] # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # I P S E T S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='ao') @dbus_handle_exceptions def listIPSets(self, sender=None): # pylint: disable=W0613 """list ipsets objects paths """ log.debug1("config.listIPSets()") return self.ipsets @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='as') @dbus_handle_exceptions def getIPSetNames(self, sender=None): # pylint: disable=W0613 """get ipset names """ log.debug1("config.getIPSetNames()") ipsets = [ ] for obj in self.ipsets: ipsets.append(obj.obj.name) return sorted(ipsets) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s', out_signature='o') @dbus_handle_exceptions def getIPSetByName(self, ipset, sender=None): # pylint: disable=W0613 """object path of ipset with given name """ ipset = dbus_to_python(ipset, str) log.debug1("config.getIPSetByName('%s')", ipset) for obj in self.ipsets: if obj.obj.name == ipset: return obj raise FirewallError(errors.INVALID_IPSET, ipset) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s'+IPSet.DBUS_SIGNATURE, out_signature='o') @dbus_handle_exceptions def addIPSet(self, ipset, settings, sender=None): """add ipset with given name and settings """ ipset = dbus_to_python(ipset, str) settings = dbus_to_python(settings) log.debug1("config.addIPSet('%s')", ipset) self.accessCheck(sender) obj = self.config.new_ipset(ipset, settings) config_ipset = self._addIPSet(obj) return config_ipset @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG, signature='s') @dbus_handle_exceptions def IPSetAdded(self, ipset): ipset = dbus_to_python(ipset, str) log.debug1("config.IPSetAdded('%s')" % (ipset)) # I C M P T Y P E S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='ao') @dbus_handle_exceptions def listIcmpTypes(self, sender=None): # pylint: disable=W0613 """list icmptypes objects paths """ log.debug1("config.listIcmpTypes()") return self.icmptypes @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='as') @dbus_handle_exceptions def getIcmpTypeNames(self, sender=None): # pylint: disable=W0613 """get icmptype names """ log.debug1("config.getIcmpTypeNames()") icmptypes = [ ] for obj in self.icmptypes: icmptypes.append(obj.obj.name) return sorted(icmptypes) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s', out_signature='o') @dbus_handle_exceptions def getIcmpTypeByName(self, icmptype, sender=None): # pylint: disable=W0613 """object path of icmptype with given name """ icmptype = dbus_to_python(icmptype, str) log.debug1("config.getIcmpTypeByName('%s')", icmptype) for obj in self.icmptypes: if obj.obj.name == icmptype: return obj raise FirewallError(errors.INVALID_ICMPTYPE, icmptype) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s'+IcmpType.DBUS_SIGNATURE, out_signature='o') @dbus_handle_exceptions def addIcmpType(self, icmptype, settings, sender=None): """add icmptype with given name and settings """ icmptype = dbus_to_python(icmptype, str) settings = dbus_to_python(settings) log.debug1("config.addIcmpType('%s')", icmptype) self.accessCheck(sender) obj = self.config.new_icmptype(icmptype, settings) config_icmptype = self._addIcmpType(obj) return config_icmptype @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG, signature='s') @dbus_handle_exceptions def IcmpTypeAdded(self, icmptype): log.debug1("config.IcmpTypeAdded('%s')" % (icmptype)) # S E R V I C E S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='ao') @dbus_handle_exceptions def listServices(self, sender=None): # pylint: disable=W0613 """list services objects paths """ log.debug1("config.listServices()") return self.services @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='as') @dbus_handle_exceptions def getServiceNames(self, sender=None): # pylint: disable=W0613 """get service names """ log.debug1("config.getServiceNames()") services = [ ] for obj in self.services: services.append(obj.obj.name) return sorted(services) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s', out_signature='o') @dbus_handle_exceptions def getServiceByName(self, service, sender=None): # pylint: disable=W0613 """object path of service with given name """ service = dbus_to_python(service, str) log.debug1("config.getServiceByName('%s')", service) for obj in self.services: if obj.obj.name == service: return obj raise FirewallError(errors.INVALID_SERVICE, service) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s'+Service.DBUS_SIGNATURE, out_signature='o') @dbus_handle_exceptions def addService(self, service, settings, sender=None): """add service with given name and settings """ service = dbus_to_python(service, str) settings = dbus_to_python(settings) log.debug1("config.addService('%s')", service) self.accessCheck(sender) obj = self.config.new_service(service, settings) config_service = self._addService(obj) return config_service @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG, signature='s') @dbus_handle_exceptions def ServiceAdded(self, service): log.debug1("config.ServiceAdded('%s')" % (service)) # Z O N E S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='ao') @dbus_handle_exceptions def listZones(self, sender=None): # pylint: disable=W0613 """list zones objects paths """ log.debug1("config.listZones()") return self.zones @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='as') @dbus_handle_exceptions def getZoneNames(self, sender=None): # pylint: disable=W0613 """get zone names """ log.debug1("config.getZoneNames()") zones = [ ] for obj in self.zones: zones.append(obj.obj.name) return sorted(zones) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s', out_signature='o') @dbus_handle_exceptions def getZoneByName(self, zone, sender=None): # pylint: disable=W0613 """object path of zone with given name """ zone = dbus_to_python(zone, str) log.debug1("config.getZoneByName('%s')", zone) for obj in self.zones: if obj.obj.name == zone: return obj raise FirewallError(errors.INVALID_ZONE, zone) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s', out_signature='s') @dbus_handle_exceptions def getZoneOfInterface(self, iface, sender=None): # pylint: disable=W0613 """name of zone the given interface belongs to """ iface = dbus_to_python(iface, str) log.debug1("config.getZoneOfInterface('%s')", iface) ret = [] for obj in self.zones: if iface in obj.obj.interfaces: ret.append(obj.obj.name) if len(ret) > 1: # Even it shouldn't happen, it's actually possible that # the same interface is in several zone XML files return " ".join(ret) + \ " (ERROR: interface '%s' is in %s zone XML files, can be only in one)" % \ (iface, len(ret)) return ret[0] if ret else "" @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s', out_signature='s') @dbus_handle_exceptions def getZoneOfSource(self, source, sender=None): # pylint: disable=W0613 """name of zone the given source belongs to """ source = dbus_to_python(source, str) log.debug1("config.getZoneOfSource('%s')", source) ret = [] for obj in self.zones: if source in obj.obj.sources: ret.append(obj.obj.name) if len(ret) > 1: # Even it shouldn't happen, it's actually possible that # the same source is in several zone XML files return " ".join(ret) + \ " (ERROR: source '%s' is in %s zone XML files, can be only in one)" % \ (source, len(ret)) return ret[0] if ret else "" @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s'+Zone.DBUS_SIGNATURE, out_signature='o') @dbus_handle_exceptions def addZone(self, zone, settings, sender=None): """add zone with given name and settings """ zone = dbus_to_python(zone, str) settings = dbus_to_python(settings) log.debug1("config.addZone('%s')", zone) self.accessCheck(sender) if settings[4] == "default": # convert to list, fix target, convert back to tuple _settings = list(settings) _settings[4] = DEFAULT_ZONE_TARGET settings = tuple(_settings) obj = self.config.new_zone(zone, settings) config_zone = self._addZone(obj) return config_zone @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG, signature='s') @dbus_handle_exceptions def ZoneAdded(self, zone): log.debug1("config.ZoneAdded('%s')" % (zone)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # H E L P E R S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='ao') @dbus_handle_exceptions def listHelpers(self, sender=None): # pylint: disable=W0613 """list helpers objects paths """ log.debug1("config.listHelpers()") return self.helpers @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, out_signature='as') @dbus_handle_exceptions def getHelperNames(self, sender=None): # pylint: disable=W0613 """get helper names """ log.debug1("config.getHelperNames()") helpers = [ ] for obj in self.helpers: helpers.append(obj.obj.name) return sorted(helpers) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s', out_signature='o') @dbus_handle_exceptions def getHelperByName(self, helper, sender=None): # pylint: disable=W0613 """object path of helper with given name """ helper = dbus_to_python(helper, str) log.debug1("config.getHelperByName('%s')", helper) for obj in self.helpers: if obj.obj.name == helper: return obj raise FirewallError(errors.INVALID_HELPER, helper) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG, in_signature='s'+Helper.DBUS_SIGNATURE, out_signature='o') @dbus_handle_exceptions def addHelper(self, helper, settings, sender=None): """add helper with given name and settings """ helper = dbus_to_python(helper, str) settings = dbus_to_python(settings) log.debug1("config.addHelper('%s')", helper) self.accessCheck(sender) obj = self.config.new_helper(helper, settings) config_helper = self._addHelper(obj) return config_helper @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG, signature='s') @dbus_handle_exceptions def HelperAdded(self, helper): helper = dbus_to_python(helper, str) log.debug1("config.HelperAdded('%s')" % (helper)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # DIRECT @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, out_signature=Direct.DBUS_SIGNATURE) @dbus_handle_exceptions def getSettings(self, sender=None): # pylint: disable=W0613 # returns list ipv, table, list of chains log.debug1("config.direct.getSettings()") return self.config.get_direct().export_config() @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature=Direct.DBUS_SIGNATURE) @dbus_handle_exceptions def update(self, settings, sender=None): # pylint: disable=W0613 # returns list ipv, table, list of chains log.debug1("config.direct.update()") settings = dbus_to_python(settings) self.config.get_direct().import_config(settings) self.config.get_direct().write() self.Updated() @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT) @dbus_handle_exceptions def Updated(self): log.debug1("config.direct.Updated()") # chain @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sss') @dbus_handle_exceptions def addChain(self, ipv, table, chain, sender=None): ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) log.debug1("config.direct.addChain('%s', '%s', '%s')" % \ (ipv, table, chain)) self.accessCheck(sender) idx = tuple((ipv, table, chain)) settings = list(self.getSettings()) if idx in settings[0]: raise FirewallError(errors.ALREADY_ENABLED, "chain '%s' already is in '%s:%s'" % \ (chain, ipv, table)) settings[0].append(idx) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sss') @dbus_handle_exceptions def removeChain(self, ipv, table, chain, sender=None): ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) log.debug1("config.direct.removeChain('%s', '%s', '%s')" % \ (ipv, table, chain)) self.accessCheck(sender) idx = tuple((ipv, table, chain)) settings = list(self.getSettings()) if idx not in settings[0]: raise FirewallError(errors.NOT_ENABLED, "chain '%s' is not in '%s:%s'" % (chain, ipv, table)) settings[0].remove(idx) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sss', out_signature='b') @dbus_handle_exceptions def queryChain(self, ipv, table, chain, sender=None): # pylint: disable=W0613 ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) log.debug1("config.direct.queryChain('%s', '%s', '%s')" % \ (ipv, table, chain)) idx = tuple((ipv, table, chain)) return idx in self.getSettings()[0] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='ss', out_signature='as') @dbus_handle_exceptions def getChains(self, ipv, table, sender=None): # pylint: disable=W0613 ipv = dbus_to_python(ipv) table = dbus_to_python(table) log.debug1("config.direct.getChains('%s', '%s')" % (ipv, table)) ret = [ ] for idx in self.getSettings()[0]: if idx[0] == ipv and idx[1] == table: ret.append(idx[2]) return ret @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='', out_signature='a(sss)') @dbus_handle_exceptions def getAllChains(self, sender=None): # pylint: disable=W0613 log.debug1("config.direct.getAllChains()") return self.getSettings()[0] # rule @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sssias') @dbus_handle_exceptions def addRule(self, ipv, table, chain, priority, args, sender=None): # pylint: disable=R0913 ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) priority = dbus_to_python(priority) args = dbus_to_python(args) log.debug1("config.direct.addRule('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) self.accessCheck(sender) idx = (ipv, table, chain, priority, args) settings = list(self.getSettings()) if idx in settings[1]: raise FirewallError(errors.ALREADY_ENABLED, "rule '%s' already is in '%s:%s:%s'" % \ (args, ipv, table, chain)) settings[1].append(idx) self.update(tuple(settings)) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sssias') @dbus_handle_exceptions def removeRule(self, ipv, table, chain, priority, args, sender=None): # pylint: disable=R0913 ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) priority = dbus_to_python(priority) args = dbus_to_python(args) log.debug1("config.direct.removeRule('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) self.accessCheck(sender) idx = (ipv, table, chain, priority, args) settings = list(self.getSettings()) if idx not in settings[1]: raise FirewallError(errors.NOT_ENABLED, "rule '%s' is not in '%s:%s:%s'" % \ (args, ipv, table, chain)) settings[1].remove(idx) self.update(tuple(settings)) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sssias', out_signature='b') @dbus_handle_exceptions def queryRule(self, ipv, table, chain, priority, args, sender=None): # pylint: disable=W0613,R0913 ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) priority = dbus_to_python(priority) args = dbus_to_python(args) log.debug1("config.direct.queryRule('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) idx = (ipv, table, chain, priority, args) return idx in self.getSettings()[1] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sss') @dbus_handle_exceptions def removeRules(self, ipv, table, chain, sender=None): ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) log.debug1("config.direct.removeRules('%s', '%s', '%s')" % \ (ipv, table, chain, )) self.accessCheck(sender) settings = list(self.getSettings()) for rule in settings[1][:]: if (ipv, table, chain) == (rule[0], rule[1], rule[2]): settings[1].remove(rule) self.update(tuple(settings)) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sss', out_signature='a(ias)') @dbus_handle_exceptions def getRules(self, ipv, table, chain, sender=None): # pylint: disable=W0613 ipv = dbus_to_python(ipv) table = dbus_to_python(table) chain = dbus_to_python(chain) log.debug1("config.direct.getRules('%s', '%s', '%s')" % \ (ipv, table, chain)) ret = [ ] for idx in self.getSettings()[1]: if idx[0] == ipv and idx[1] == table and idx[2] == chain: ret.append((idx[3], idx[4])) return ret @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='', out_signature='a(sssias)') @dbus_handle_exceptions def getAllRules(self, sender=None): # pylint: disable=W0613 log.debug1("config.direct.getAllRules()") return self.getSettings()[1] # passthrough @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sas') @dbus_handle_exceptions def addPassthrough(self, ipv, args, sender=None): ipv = dbus_to_python(ipv) args = dbus_to_python(args) log.debug1("config.direct.addPassthrough('%s', '%s')" % \ (ipv, "','".join(args))) self.accessCheck(sender) idx = (ipv, args) settings = list(self.getSettings()) if idx in settings[2]: raise FirewallError(errors.ALREADY_ENABLED, "passthrough '%s', '%s'" % (ipv, args)) settings[2].append(idx) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sas') @dbus_handle_exceptions def removePassthrough(self, ipv, args, sender=None): ipv = dbus_to_python(ipv) args = dbus_to_python(args) log.debug1("config.direct.removePassthrough('%s', '%s')" % \ (ipv, "','".join(args))) self.accessCheck(sender) idx = (ipv, args) settings = list(self.getSettings()) if idx not in settings[2]: raise FirewallError(errors.NOT_ENABLED, "passthrough '%s', '%s'" % (ipv, args)) settings[2].remove(idx) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='sas', out_signature='b') @dbus_handle_exceptions def queryPassthrough(self, ipv, args, sender=None): # pylint: disable=W0613 ipv = dbus_to_python(ipv) args = dbus_to_python(args) log.debug1("config.direct.queryPassthrough('%s', '%s')" % \ (ipv, "','".join(args))) idx = (ipv, args) return idx in self.getSettings()[2] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, in_signature='s', out_signature='aas') @dbus_handle_exceptions def getPassthroughs(self, ipv, sender=None): # pylint: disable=W0613 ipv = dbus_to_python(ipv) log.debug1("config.direct.getPassthroughs('%s')" % (ipv)) ret = [ ] for idx in self.getSettings()[2]: if idx[0] == ipv: ret.append(idx[1]) return ret @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_DIRECT, out_signature='a(sas)') @dbus_handle_exceptions def getAllPassthroughs(self, sender=None): # pylint: disable=W0613 log.debug1("config.direct.getAllPassthroughs()") return self.getSettings()[2] PK['site-packages/firewall/server/server.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # # signal handling and run_server derived from setroubleshoot # Copyright (C) 2006,2007,2008,2009 Red Hat, Inc. # Authors: # John Dennis # Thomas Liu # Dan Walsh __all__ = [ "run_server" ] import sys import signal # force use of pygobject3 in python-slip from gi.repository import GObject, GLib sys.modules['gobject'] = GObject import dbus import dbus.service import dbus.mainloop.glib import slip.dbus from firewall import config from firewall.core.logger import log from firewall.server.firewalld import FirewallD ############################################################################ # # signal handlers # ############################################################################ def sighup(service): service.reload() return True def sigterm(mainloop): mainloop.quit() ############################################################################ # # run_server function # ############################################################################ def run_server(debug_gc=False): """ Main function for firewall server. Handles D-Bus and GLib mainloop. """ service = None if debug_gc: from pprint import pformat import gc gc.enable() gc.set_debug(gc.DEBUG_LEAK) gc_timeout = 10 def gc_collect(): gc.collect() if len(gc.garbage) > 0: print("\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n") print("GARBAGE OBJECTS (%d):\n" % len(gc.garbage)) for x in gc.garbage: print(type(x), "\n ",) print(pformat(x)) print("\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n") GLib.timeout_add_seconds(gc_timeout, gc_collect) try: dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() name = dbus.service.BusName(config.dbus.DBUS_INTERFACE, bus=bus) service = FirewallD(name, config.dbus.DBUS_PATH) mainloop = GLib.MainLoop() slip.dbus.service.set_mainloop(mainloop) if debug_gc: GLib.timeout_add_seconds(gc_timeout, gc_collect) # use unix_signal_add if available, else unix_signal_add_full if hasattr(GLib, 'unix_signal_add'): unix_signal_add = GLib.unix_signal_add else: unix_signal_add = GLib.unix_signal_add_full unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGHUP, sighup, service) unix_signal_add(GLib.PRIORITY_HIGH, signal.SIGTERM, sigterm, mainloop) mainloop.run() except KeyboardInterrupt: log.debug1("Stopping..") except SystemExit: log.error("Raising SystemExit in run_server") except Exception as e: log.error("Exception %s: %s", e.__class__.__name__, str(e)) if service: service.stop() PK[4Jl*site-packages/firewall/server/firewalld.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . __all__ = [ "FirewallD" ] from gi.repository import GLib, GObject # force use of pygobject3 in python-slip import sys sys.modules['gobject'] = GObject import dbus import dbus.service import slip.dbus import slip.dbus.service from firewall import config from firewall.core.fw import Firewall from firewall.core.rich import Rich_Rule from firewall.core.logger import log from firewall.client import FirewallClientZoneSettings from firewall.server.decorators import dbus_handle_exceptions, \ dbus_service_method, \ handle_exceptions, \ FirewallDBusException from firewall.server.config import FirewallDConfig from firewall.dbus_utils import dbus_to_python, \ command_of_sender, context_of_sender, uid_of_sender, user_of_uid, \ dbus_introspection_prepare_properties, \ dbus_introspection_add_properties from firewall.core.io.functions import check_config from firewall.core.io.zone import Zone from firewall.core.io.ipset import IPSet from firewall.core.io.service import Service from firewall.core.io.icmptype import IcmpType from firewall.core.io.helper import Helper from firewall.core.fw_nm import nm_get_bus_name, nm_get_connection_of_interface, \ nm_set_zone_of_connection from firewall.core.fw_ifcfg import ifcfg_set_zone_of_interface from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class FirewallD # ############################################################################ class FirewallD(slip.dbus.service.Object): """FirewallD main class""" persistent = True """ Make FirewallD persistent. """ default_polkit_auth_required = config.dbus.PK_ACTION_CONFIG """ Use config.dbus.PK_ACTION_CONFIG as a default """ @handle_exceptions def __init__(self, *args, **kwargs): super(FirewallD, self).__init__(*args, **kwargs) self.fw = Firewall() self.busname = args[0] self.path = args[1] self.start() dbus_introspection_prepare_properties(self, config.dbus.DBUS_INTERFACE) self.config = FirewallDConfig(self.fw.config, self.busname, config.dbus.DBUS_PATH_CONFIG) def __del__(self): self.stop() @handle_exceptions def start(self): # tests if iptables and ip6tables are usable using test functions # loads default firewall rules for iptables and ip6tables log.debug1("start()") self._timeouts = { } return self.fw.start() @handle_exceptions def stop(self): # stops firewall: unloads firewall modules, flushes chains and tables, # resets policies log.debug1("stop()") return self.fw.stop() # lockdown functions @dbus_handle_exceptions def accessCheck(self, sender): if self.fw.policies.query_lockdown(): if sender is None: log.error("Lockdown not possible, sender not set.") return bus = dbus.SystemBus() context = context_of_sender(bus, sender) if self.fw.policies.access_check("context", context): return uid = uid_of_sender(bus, sender) if self.fw.policies.access_check("uid", uid): return user = user_of_uid(uid) if self.fw.policies.access_check("user", user): return command = command_of_sender(bus, sender) if self.fw.policies.access_check("command", command): return raise FirewallError(errors.ACCESS_DENIED, "lockdown is enabled") # timeout functions @dbus_handle_exceptions def addTimeout(self, zone, x, tag): if zone not in self._timeouts: self._timeouts[zone] = { } self._timeouts[zone][x] = tag @dbus_handle_exceptions def removeTimeout(self, zone, x): if zone in self._timeouts and x in self._timeouts[zone]: GLib.source_remove(self._timeouts[zone][x]) del self._timeouts[zone][x] @dbus_handle_exceptions def cleanup_timeouts(self): # cleanup timeouts for zone in self._timeouts: for x in self._timeouts[zone]: GLib.source_remove(self._timeouts[zone][x]) self._timeouts[zone].clear() self._timeouts.clear() # property handling @dbus_handle_exceptions def _get_property(self, prop): if prop == "version": return dbus.String(config.VERSION) elif prop == "interface_version": return dbus.String("%d.%d" % (config.dbus.DBUS_INTERFACE_VERSION, config.dbus.DBUS_INTERFACE_REVISION)) elif prop == "state": return dbus.String(self.fw.get_state()) elif prop == "IPv4": return dbus.Boolean(self.fw.ip4tables_enabled) elif prop == "IPv4ICMPTypes": return dbus.Array(self.fw.ip4tables_supported_icmp_types, "s") elif prop == "IPv6": return dbus.Boolean(self.fw.ip6tables_enabled) elif prop == "IPv6_rpfilter": return dbus.Boolean(self.fw.ipv6_rpfilter_enabled) elif prop == "IPv6ICMPTypes": return dbus.Array(self.fw.ip6tables_supported_icmp_types, "s") elif prop == "BRIDGE": return dbus.Boolean(self.fw.ebtables_enabled) elif prop == "IPSet": return dbus.Boolean(self.fw.ipset_enabled) elif prop == "IPSetTypes": return dbus.Array(self.fw.ipset_supported_types, "s") elif prop == "nf_conntrack_helper_setting": return dbus.Boolean(self.fw.nf_conntrack_helper_setting == 1) elif prop == "nf_conntrack_helpers": return dbus.Dictionary({}, "sas") elif prop == "nf_nat_helpers": return dbus.Dictionary({}, "sas") else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % prop) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @dbus_handle_exceptions def Get(self, interface_name, property_name, sender=None): # pylint: disable=W0613 # get a property interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) log.debug1("Get('%s', '%s')", interface_name, property_name) if interface_name == config.dbus.DBUS_INTERFACE: return self._get_property(property_name) elif interface_name in [ config.dbus.DBUS_INTERFACE_ZONE, config.dbus.DBUS_INTERFACE_DIRECT, config.dbus.DBUS_INTERFACE_POLICIES, config.dbus.DBUS_INTERFACE_IPSET ]: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') @dbus_handle_exceptions def GetAll(self, interface_name, sender=None): # pylint: disable=W0613 interface_name = dbus_to_python(interface_name, str) log.debug1("GetAll('%s')", interface_name) ret = { } if interface_name == config.dbus.DBUS_INTERFACE: for x in [ "version", "interface_version", "state", "IPv4", "IPv6", "IPv6_rpfilter", "BRIDGE", "IPSet", "IPSetTypes", "nf_conntrack_helper_setting", "nf_conntrack_helpers", "nf_nat_helpers", "IPv4ICMPTypes", "IPv6ICMPTypes" ]: ret[x] = self._get_property(x) elif interface_name in [ config.dbus.DBUS_INTERFACE_ZONE, config.dbus.DBUS_INTERFACE_DIRECT, config.dbus.DBUS_INTERFACE_POLICIES, config.dbus.DBUS_INTERFACE_IPSET ]: pass else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return dbus.Dictionary(ret, signature="sv") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ssv') @dbus_handle_exceptions def Set(self, interface_name, property_name, new_value, sender=None): interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) new_value = dbus_to_python(new_value) log.debug1("Set('%s', '%s', '%s')", interface_name, property_name, new_value) self.accessCheck(sender) if interface_name == config.dbus.DBUS_INTERFACE: if property_name in [ "version", "interface_version", "state", "IPv4", "IPv6", "IPv6_rpfilter", "BRIDGE", "IPSet", "IPSetTypes", "nf_conntrack_helper_setting", "nf_conntrack_helpers", "nf_nat_helpers", "IPv4ICMPTypes", "IPv6ICMPTypes" ]: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.PropertyReadOnly: " "Property '%s' is read-only" % property_name) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) elif interface_name in [ config.dbus.DBUS_INTERFACE_ZONE, config.dbus.DBUS_INTERFACE_DIRECT, config.dbus.DBUS_INTERFACE_POLICIES, config.dbus.DBUS_INTERFACE_IPSET ]: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): interface_name = dbus_to_python(interface_name, str) changed_properties = dbus_to_python(changed_properties) invalidated_properties = dbus_to_python(invalidated_properties) log.debug1("PropertiesChanged('%s', '%s', '%s')", interface_name, changed_properties, invalidated_properties) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(dbus.INTROSPECTABLE_IFACE, out_signature='s') @dbus_handle_exceptions def Introspect(self, sender=None): # pylint: disable=W0613 log.debug2("Introspect()") data = super(FirewallD, self).Introspect(self.path, self.busname.get_bus()) return dbus_introspection_add_properties(self, data, config.dbus.DBUS_INTERFACE) # reload @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='') @dbus_handle_exceptions def reload(self, sender=None): # pylint: disable=W0613 """Reload the firewall rules. """ log.debug1("reload()") self.fw.reload() self.config.reload() self.Reloaded() # complete_reload @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='') @dbus_handle_exceptions def completeReload(self, sender=None): # pylint: disable=W0613 """Completely reload the firewall. Completely reload the firewall: Stops firewall, unloads modules and starts the firewall again. """ log.debug1("completeReload()") self.fw.reload(True) self.config.reload() self.Reloaded() @dbus.service.signal(config.dbus.DBUS_INTERFACE) @dbus_handle_exceptions def Reloaded(self): log.debug1("Reloaded()") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='') @dbus_handle_exceptions def checkPermanentConfig(self, sender=None): # pylint: disable=W0613 """Check permanent configuration """ log.debug1("checkPermanentConfig()") check_config(self.fw) # runtime to permanent @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='') @dbus_handle_exceptions def runtimeToPermanent(self, sender=None): # pylint: disable=W0613 """Make runtime configuration permanent """ log.debug1("copyRuntimeToPermanent()") error = False # Services or icmptypes can not be modified in runtime, but they can # be removed or modified in permanent environment. Therefore copying # of services and icmptypes to permanent is also needed. # services config_names = self.config.getServiceNames() for name in self.fw.service.get_services(): conf = self.getServiceSettings(name) try: if name in config_names: conf_obj = self.config.getServiceByName(name) if conf_obj.getSettings() != conf: log.debug1("Copying service '%s' settings" % name) conf_obj.update(conf) else: log.debug1("Service '%s' is identical, ignoring." % name) else: log.debug1("Creating service '%s'" % name) self.config.addService(name, conf) except Exception as e: log.warning( "Runtime To Permanent failed on service '%s': %s" % \ (name, e)) error = True # icmptypes config_names = self.config.getIcmpTypeNames() for name in self.fw.icmptype.get_icmptypes(): conf = self.getIcmpTypeSettings(name) try: if name in config_names: conf_obj = self.config.getIcmpTypeByName(name) if conf_obj.getSettings() != conf: log.debug1("Copying icmptype '%s' settings" % name) conf_obj.update(conf) else: log.debug1("IcmpType '%s' is identical, ignoring." % name) else: log.debug1("Creating icmptype '%s'" % name) self.config.addIcmpType(name, conf) except Exception as e: log.warning( "Runtime To Permanent failed on icmptype '%s': %s" % \ (name, e)) error = True # ipsets config_names = self.config.getIPSetNames() for name in self.fw.ipset.get_ipsets(): try: conf = self.getIPSetSettings(name) if name in config_names: conf_obj = self.config.getIPSetByName(name) if conf_obj.getSettings() != conf: log.debug1("Copying ipset '%s' settings" % name) conf_obj.update(conf) else: log.debug1("IPSet '%s' is identical, ignoring." % name) else: log.debug1("Creating ipset '%s'" % name) self.config.addIPSet(name, conf) except Exception as e: log.warning( "Runtime To Permanent failed on ipset '%s': %s" % \ (name, e)) error = True # zones config_names = self.config.getZoneNames() nm_bus_name = nm_get_bus_name() for name in self.fw.zone.get_zones(): conf = self.getZoneSettings(name) settings = FirewallClientZoneSettings(conf) if nm_bus_name is not None: changed = False for interface in settings.getInterfaces(): if self.fw.zone.interface_get_sender(name, interface) == nm_bus_name: log.debug1("Zone '%s': interface binding for '%s' has been added by NM, ignoring." % (name, interface)) settings.removeInterface(interface) changed = True # For the remaining interfaces, attempt to let NM manage them for interface in settings.getInterfaces(): try: connection = nm_get_connection_of_interface(interface) if connection and nm_set_zone_of_connection(name, connection): settings.removeInterface(interface) changed = True except Exception: pass if changed: del conf conf = settings.settings # For the remaining try to update the ifcfg files for interface in settings.getInterfaces(): ifcfg_set_zone_of_interface(name, interface) try: if name in config_names: conf_obj = self.config.getZoneByName(name) if conf_obj.getSettings() != conf: log.debug1("Copying zone '%s' settings" % name) conf_obj.update(conf) else: log.debug1("Zone '%s' is identical, ignoring." % name) else: log.debug1("Creating zone '%s'" % name) self.config.addZone(name, conf) except Exception as e: log.warning( "Runtime To Permanent failed on zone '%s': %s" % \ (name, e)) error = True # helpers config_names = self.config.getHelperNames() for name in self.fw.helper.get_helpers(): conf = self.getHelperSettings(name) try: if name in config_names: conf_obj = self.config.getHelperByName(name) if conf_obj.getSettings() != conf: log.debug1("Copying helper '%s' settings" % name) conf_obj.update(conf) else: log.debug1("Helper '%s' is identical, ignoring." % name) else: log.debug1("Creating helper '%s'" % name) self.config.addHelper(name, conf) except Exception as e: log.warning( "Runtime To Permanent failed on helper '%s': %s" % \ (name, e)) error = True # direct # rt_config = self.fw.direct.get_config() conf = ( self.fw.direct.get_all_chains(), self.fw.direct.get_all_rules(), self.fw.direct.get_all_passthroughs() ) try: if self.config.getSettings() != conf: log.debug1("Copying direct configuration") self.config.update(conf) else: log.debug1("Direct configuration is identical, ignoring.") except Exception as e: log.warning( "Runtime To Permanent failed on direct configuration: %s" % e) error = True # policies conf = self.fw.policies.lockdown_whitelist.export_config() try: if self.config.getSettings() != conf: log.debug1("Copying policies configuration") self.config.setLockdownWhitelist(conf) else: log.debug1("Policies configuration is identical, ignoring.") except Exception as e: log.warning( "Runtime To Permanent failed on policies configuration: %s" % \ e) error = True if error: raise FirewallError(errors.RT_TO_PERM_FAILED) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # POLICIES # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # lockdown @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='', out_signature='') @dbus_handle_exceptions def enableLockdown(self, sender=None): """Enable lockdown policies """ log.debug1("policies.enableLockdown()") self.accessCheck(sender) self.fw.policies.enable_lockdown() self.LockdownEnabled() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='', out_signature='') @dbus_handle_exceptions def disableLockdown(self, sender=None): """Disable lockdown policies """ log.debug1("policies.disableLockdown()") self.accessCheck(sender) self.fw.policies.disable_lockdown() self.LockdownDisabled() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='', out_signature='b') @dbus_handle_exceptions def queryLockdown(self, sender=None): # pylint: disable=W0613 """Retuns True if lockdown is enabled """ log.debug1("policies.queryLockdown()") # no access check here return self.fw.policies.query_lockdown() @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='') @dbus_handle_exceptions def LockdownEnabled(self): log.debug1("LockdownEnabled()") @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='') @dbus_handle_exceptions def LockdownDisabled(self): log.debug1("LockdownDisabled()") # lockdown whitelist # command @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='') @dbus_handle_exceptions def addLockdownWhitelistCommand(self, command, sender=None): """Add lockdown command """ command = dbus_to_python(command, str) log.debug1("policies.addLockdownWhitelistCommand('%s')" % command) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.add_command(command) self.LockdownWhitelistCommandAdded(command) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='') @dbus_handle_exceptions def removeLockdownWhitelistCommand(self, command, sender=None): """Remove lockdown command """ command = dbus_to_python(command, str) log.debug1("policies.removeLockdownWhitelistCommand('%s')" % command) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.remove_command(command) self.LockdownWhitelistCommandRemoved(command) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistCommand(self, command, sender=None): # pylint: disable=W0613 """Query lockdown command """ command = dbus_to_python(command, str) log.debug1("policies.queryLockdownWhitelistCommand('%s')" % command) # no access check here return self.fw.policies.lockdown_whitelist.has_command(command) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='', out_signature='as') @dbus_handle_exceptions def getLockdownWhitelistCommands(self, sender=None): # pylint: disable=W0613 """Add lockdown command """ log.debug1("policies.getLockdownWhitelistCommands()") # no access check here return self.fw.policies.lockdown_whitelist.get_commands() @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='s') @dbus_handle_exceptions def LockdownWhitelistCommandAdded(self, command): log.debug1("LockdownWhitelistCommandAdded('%s')" % command) @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='s') @dbus_handle_exceptions def LockdownWhitelistCommandRemoved(self, command): log.debug1("LockdownWhitelistCommandRemoved('%s')" % command) # uid @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='i', out_signature='') @dbus_handle_exceptions def addLockdownWhitelistUid(self, uid, sender=None): """Add lockdown uid """ uid = dbus_to_python(uid, int) log.debug1("policies.addLockdownWhitelistUid('%s')" % uid) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.add_uid(uid) self.LockdownWhitelistUidAdded(uid) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='i', out_signature='') @dbus_handle_exceptions def removeLockdownWhitelistUid(self, uid, sender=None): """Remove lockdown uid """ uid = dbus_to_python(uid, int) log.debug1("policies.removeLockdownWhitelistUid('%s')" % uid) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.remove_uid(uid) self.LockdownWhitelistUidRemoved(uid) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='i', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistUid(self, uid, sender=None): # pylint: disable=W0613 """Query lockdown uid """ uid = dbus_to_python(uid, int) log.debug1("policies.queryLockdownWhitelistUid('%s')" % uid) # no access check here return self.fw.policies.lockdown_whitelist.has_uid(uid) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='', out_signature='ai') @dbus_handle_exceptions def getLockdownWhitelistUids(self, sender=None): # pylint: disable=W0613 """Add lockdown uid """ log.debug1("policies.getLockdownWhitelistUids()") # no access check here return self.fw.policies.lockdown_whitelist.get_uids() @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='i') @dbus_handle_exceptions def LockdownWhitelistUidAdded(self, uid): log.debug1("LockdownWhitelistUidAdded(%d)" % uid) @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='i') @dbus_handle_exceptions def LockdownWhitelistUidRemoved(self, uid): log.debug1("LockdownWhitelistUidRemoved(%d)" % uid) # user @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='') @dbus_handle_exceptions def addLockdownWhitelistUser(self, user, sender=None): """Add lockdown user """ user = dbus_to_python(user, str) log.debug1("policies.addLockdownWhitelistUser('%s')" % user) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.add_user(user) self.LockdownWhitelistUserAdded(user) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='') @dbus_handle_exceptions def removeLockdownWhitelistUser(self, user, sender=None): """Remove lockdown user """ user = dbus_to_python(user, str) log.debug1("policies.removeLockdownWhitelistUser('%s')" % user) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.remove_user(user) self.LockdownWhitelistUserRemoved(user) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistUser(self, user, sender=None): # pylint: disable=W0613 """Query lockdown user """ user = dbus_to_python(user, str) log.debug1("policies.queryLockdownWhitelistUser('%s')" % user) # no access check here return self.fw.policies.lockdown_whitelist.has_user(user) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='', out_signature='as') @dbus_handle_exceptions def getLockdownWhitelistUsers(self, sender=None): # pylint: disable=W0613 """Add lockdown user """ log.debug1("policies.getLockdownWhitelistUsers()") # no access check here return self.fw.policies.lockdown_whitelist.get_users() @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='s') @dbus_handle_exceptions def LockdownWhitelistUserAdded(self, user): log.debug1("LockdownWhitelistUserAdded('%s')" % user) @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='s') @dbus_handle_exceptions def LockdownWhitelistUserRemoved(self, user): log.debug1("LockdownWhitelistUserRemoved('%s')" % user) # context @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='') @dbus_handle_exceptions def addLockdownWhitelistContext(self, context, sender=None): """Add lockdown context """ context = dbus_to_python(context, str) log.debug1("policies.addLockdownWhitelistContext('%s')" % context) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.add_context(context) self.LockdownWhitelistContextAdded(context) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='') @dbus_handle_exceptions def removeLockdownWhitelistContext(self, context, sender=None): """Remove lockdown context """ context = dbus_to_python(context, str) log.debug1("policies.removeLockdownWhitelistContext('%s')" % context) self.accessCheck(sender) self.fw.policies.lockdown_whitelist.remove_context(context) self.LockdownWhitelistContextRemoved(context) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryLockdownWhitelistContext(self, context, sender=None): # pylint: disable=W0613 """Query lockdown context """ context = dbus_to_python(context, str) log.debug1("policies.queryLockdownWhitelistContext('%s')" % context) # no access check here return self.fw.policies.lockdown_whitelist.has_context(context) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_POLICIES_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_POLICIES, in_signature='', out_signature='as') @dbus_handle_exceptions def getLockdownWhitelistContexts(self, sender=None): # pylint: disable=W0613 """Add lockdown context """ log.debug1("policies.getLockdownWhitelistContexts()") # no access check here return self.fw.policies.lockdown_whitelist.get_contexts() @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='s') @dbus_handle_exceptions def LockdownWhitelistContextAdded(self, context): log.debug1("LockdownWhitelistContextAdded('%s')" % context) @dbus.service.signal(config.dbus.DBUS_INTERFACE_POLICIES, signature='s') @dbus_handle_exceptions def LockdownWhitelistContextRemoved(self, context): log.debug1("LockdownWhitelistContextRemoved('%s')" % context) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # PANIC @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='') @dbus_handle_exceptions def enablePanicMode(self, sender=None): """Enable panic mode. All ingoing and outgoing connections and packets will be blocked. """ log.debug1("enablePanicMode()") self.accessCheck(sender) self.fw.enable_panic_mode() self.PanicModeEnabled() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='') @dbus_handle_exceptions def disablePanicMode(self, sender=None): """Disable panic mode. Enables normal mode: Allowed ingoing and outgoing connections will not be blocked anymore """ log.debug1("disablePanicMode()") self.accessCheck(sender) self.fw.disable_panic_mode() self.PanicModeDisabled() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='b') @dbus_handle_exceptions def queryPanicMode(self, sender=None): # pylint: disable=W0613 # returns True if in panic mode log.debug1("queryPanicMode()") return self.fw.query_panic_mode() @dbus.service.signal(config.dbus.DBUS_INTERFACE, signature='') @dbus_handle_exceptions def PanicModeEnabled(self): log.debug1("PanicModeEnabled()") @dbus.service.signal(config.dbus.DBUS_INTERFACE, signature='') @dbus_handle_exceptions def PanicModeDisabled(self): log.debug1("PanicModeDisabled()") # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # list functions @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='s', out_signature=Zone.DBUS_SIGNATURE) @dbus_handle_exceptions def getZoneSettings(self, zone, sender=None): # pylint: disable=W0613 # returns zone settings for zone zone = dbus_to_python(zone, str) log.debug1("getZoneSettings(%s)", zone) return self.fw.zone.get_config_with_settings(zone) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='as') @dbus_handle_exceptions def listServices(self, sender=None): # pylint: disable=W0613 # returns the list of services # TODO: should be renamed to getServices() # because is called by firewall-cmd --get-services log.debug1("listServices()") return self.fw.service.get_services() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='s', out_signature=Service.DBUS_SIGNATURE) @dbus_handle_exceptions def getServiceSettings(self, service, sender=None): # pylint: disable=W0613 # returns service settings for service service = dbus_to_python(service, str) log.debug1("getServiceSettings(%s)", service) return self.fw.service.get_service(service).export_config() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='as') @dbus_handle_exceptions def listIcmpTypes(self, sender=None): # pylint: disable=W0613 # returns the list of services # TODO: should be renamed to getIcmptypes() # because is called by firewall-cmd --get-icmptypes log.debug1("listIcmpTypes()") return self.fw.icmptype.get_icmptypes() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='s', out_signature=IcmpType.DBUS_SIGNATURE) @dbus_handle_exceptions def getIcmpTypeSettings(self, icmptype, sender=None): # pylint: disable=W0613 # returns icmptype settings for icmptype icmptype = dbus_to_python(icmptype, str) log.debug1("getIcmpTypeSettings(%s)", icmptype) return self.fw.icmptype.get_icmptype(icmptype).export_config() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # LOG DENIED @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='s') @dbus_handle_exceptions def getLogDenied(self, sender=None): # pylint: disable=W0613 # returns the log denied value log.debug1("getLogDenied()") return self.fw.get_log_denied() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='s', out_signature='') @dbus_handle_exceptions def setLogDenied(self, value, sender=None): # set the log denied value value = dbus_to_python(value, str) log.debug1("setLogDenied('%s')" % value) self.accessCheck(sender) self.fw.set_log_denied(value) self.LogDeniedChanged(value) # must reload the firewall as well self.fw.reload() self.config.reload() self.Reloaded() @dbus.service.signal(config.dbus.DBUS_INTERFACE, signature='s') @dbus_handle_exceptions def LogDeniedChanged(self, value): log.debug1("LogDeniedChanged('%s')" % (value)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # AUTOMATIC HELPER ASSIGNMENT @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='s') @dbus_handle_exceptions def getAutomaticHelpers(self, sender=None): # pylint: disable=W0613 # returns the automatic helpers value log.debug1("getAutomaticHelpers()") return self.fw.get_automatic_helpers() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='s', out_signature='') @dbus_handle_exceptions def setAutomaticHelpers(self, value, sender=None): # set the automatic helpers value value = dbus_to_python(value, str) log.debug1("setAutomaticHelpers('%s')" % value) self.accessCheck(sender) self.fw.set_automatic_helpers(value) self.AutomaticHelpersChanged(value) # must reload the firewall as well self.fw.reload() self.config.reload() self.Reloaded() @dbus.service.signal(config.dbus.DBUS_INTERFACE, signature='s') @dbus_handle_exceptions def AutomaticHelpersChanged(self, value): log.debug1("AutomaticHelpersChanged('%s')" % (value)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # DEFAULT ZONE @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='s') @dbus_handle_exceptions def getDefaultZone(self, sender=None): # pylint: disable=W0613 # returns the system default zone log.debug1("getDefaultZone()") return self.fw.get_default_zone() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='s', out_signature='') @dbus_handle_exceptions def setDefaultZone(self, zone, sender=None): # set the system default zone zone = dbus_to_python(zone, str) log.debug1("setDefaultZone('%s')" % zone) self.accessCheck(sender) self.fw.set_default_zone(zone) self.DefaultZoneChanged(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE, signature='s') @dbus_handle_exceptions def DefaultZoneChanged(self, zone): log.debug1("DefaultZoneChanged('%s')" % (zone)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ZONE INTERFACE # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ZONES @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) # TODO: shouldn't this be in DBUS_INTERFACE instead of DBUS_INTERFACE_ZONE ? @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='', out_signature='as') @dbus_handle_exceptions def getZones(self, sender=None): # pylint: disable=W0613 # returns the list of zones log.debug1("zone.getZones()") return self.fw.zone.get_zones() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='', out_signature='a{sa{sas}}') @dbus_handle_exceptions def getActiveZones(self, sender=None): # pylint: disable=W0613 # returns the list of active zones log.debug1("zone.getActiveZones()") zones = { } for zone in self.fw.zone.get_zones(): interfaces = self.fw.zone.list_interfaces(zone) sources = self.fw.zone.list_sources(zone) if len(interfaces) + len(sources) > 0: zones[zone] = { } if len(interfaces) > 0: zones[zone]["interfaces"] = interfaces if len(sources) > 0: zones[zone]["sources"] = sources return zones @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='s') @dbus_handle_exceptions def getZoneOfInterface(self, interface, sender=None): # pylint: disable=W0613 """Return the zone an interface belongs to. :Parameters: `interface` : str Name of the interface :Returns: str. The name of the zone. """ interface = dbus_to_python(interface, str) log.debug1("zone.getZoneOfInterface('%s')" % interface) zone = self.fw.zone.get_zone_of_interface(interface) if zone: return zone return "" @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='s') @dbus_handle_exceptions def getZoneOfSource(self, source, sender=None): # pylint: disable=W0613 #Return the zone an source belongs to. source = dbus_to_python(source, str) log.debug1("zone.getZoneOfSource('%s')" % source) zone = self.fw.zone.get_zone_of_source(source) if zone: return zone return "" @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def isImmutable(self, zone, sender=None): # pylint: disable=W0613 # no immutable zones anymore return False # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # INTERFACES @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def addInterface(self, zone, interface, sender=None): """Add an interface to a zone. If zone is empty, use default zone. """ zone = dbus_to_python(zone, str) interface = dbus_to_python(interface, str) log.debug1("zone.addInterface('%s', '%s')" % (zone, interface)) self.accessCheck(sender) _zone = self.fw.zone.add_interface(zone, interface, sender) self.InterfaceAdded(_zone, interface) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def changeZone(self, zone, interface, sender=None): """Change a zone an interface is part of. If zone is empty, use default zone. This function is deprecated, use changeZoneOfInterface instead """ zone = dbus_to_python(zone, str) interface = dbus_to_python(interface, str) return self.changeZoneOfInterface(zone, interface, sender) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def changeZoneOfInterface(self, zone, interface, sender=None): """Change a zone an interface is part of. If zone is empty, use default zone. """ zone = dbus_to_python(zone, str) interface = dbus_to_python(interface, str) log.debug1("zone.changeZoneOfInterface('%s', '%s')" % (zone, interface)) self.accessCheck(sender) _zone = self.fw.zone.change_zone_of_interface(zone, interface, sender) self.ZoneOfInterfaceChanged(_zone, interface) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def removeInterface(self, zone, interface, sender=None): """Remove interface from a zone. If zone is empty, remove from zone the interface belongs to. """ zone = dbus_to_python(zone, str) interface = dbus_to_python(interface, str) log.debug1("zone.removeInterface('%s', '%s')" % (zone, interface)) self.accessCheck(sender) _zone = self.fw.zone.remove_interface(zone, interface) self.InterfaceRemoved(_zone, interface) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryInterface(self, zone, interface, sender=None): # pylint: disable=W0613 """Return true if an interface is in a zone. If zone is empty, use default zone. """ zone = dbus_to_python(zone, str) interface = dbus_to_python(interface, str) log.debug1("zone.queryInterface('%s', '%s')" % (zone, interface)) return self.fw.zone.query_interface(zone, interface) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='as') @dbus_handle_exceptions def getInterfaces(self, zone, sender=None): # pylint: disable=W0613 """Return the list of interfaces of a zone. If zone is empty, use default zone. """ # TODO: should be renamed to listInterfaces() # because is called by firewall-cmd --zone --list-interfaces zone = dbus_to_python(zone, str) log.debug1("zone.getInterfaces('%s')" % (zone)) return self.fw.zone.list_interfaces(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def InterfaceAdded(self, zone, interface): log.debug1("zone.InterfaceAdded('%s', '%s')" % (zone, interface)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def ZoneChanged(self, zone, interface): """ This signal is deprecated. """ log.debug1("zone.ZoneChanged('%s', '%s')" % (zone, interface)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def ZoneOfInterfaceChanged(self, zone, interface): log.debug1("zone.ZoneOfInterfaceChanged('%s', '%s')" % (zone, interface)) self.ZoneChanged(zone, interface) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def InterfaceRemoved(self, zone, interface): log.debug1("zone.InterfaceRemoved('%s', '%s')" % (zone, interface)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # SOURCES @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def addSource(self, zone, source, sender=None): """Add a source to a zone. If zone is empty, use default zone. """ zone = dbus_to_python(zone, str) source = dbus_to_python(source, str) log.debug1("zone.addSource('%s', '%s')" % (zone, source)) self.accessCheck(sender) _zone = self.fw.zone.add_source(zone, source, sender) self.SourceAdded(_zone, source) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def changeZoneOfSource(self, zone, source, sender=None): """Change a zone an source is part of. If zone is empty, use default zone. """ zone = dbus_to_python(zone, str) source = dbus_to_python(source, str) log.debug1("zone.changeZoneOfSource('%s', '%s')" % (zone, source)) self.accessCheck(sender) _zone = self.fw.zone.change_zone_of_source(zone, source, sender) self.ZoneOfSourceChanged(_zone, source) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def removeSource(self, zone, source, sender=None): """Remove source from a zone. If zone is empty, remove from zone the source belongs to. """ zone = dbus_to_python(zone, str) source = dbus_to_python(source, str) log.debug1("zone.removeSource('%s', '%s')" % (zone, source)) self.accessCheck(sender) _zone = self.fw.zone.remove_source(zone, source) self.SourceRemoved(_zone, source) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def querySource(self, zone, source, sender=None): # pylint: disable=W0613 """Return true if an source is in a zone. If zone is empty, use default zone. """ zone = dbus_to_python(zone, str) source = dbus_to_python(source, str) log.debug1("zone.querySource('%s', '%s')" % (zone, source)) return self.fw.zone.query_source(zone, source) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='as') @dbus_handle_exceptions def getSources(self, zone, sender=None): # pylint: disable=W0613 """Return the list of sources of a zone. If zone is empty, use default zone. """ # TODO: should be renamed to listSources() # because is called by firewall-cmd --zone --list-sources zone = dbus_to_python(zone, str) log.debug1("zone.getSources('%s')" % (zone)) return self.fw.zone.list_sources(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def SourceAdded(self, zone, source): log.debug1("zone.SourceAdded('%s', '%s')" % (zone, source)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def ZoneOfSourceChanged(self, zone, source): log.debug1("zone.ZoneOfSourceChanged('%s', '%s')" % (zone, source)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def SourceRemoved(self, zone, source): log.debug1("zone.SourceRemoved('%s', '%s')" % (zone, source)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # RICH RULES @dbus_handle_exceptions def disableTimedRichRule(self, zone, rule): log.debug1("zone.disableTimedRichRule('%s', '%s')" % (zone, rule)) del self._timeouts[zone][rule] obj = Rich_Rule(rule_str=rule) self.fw.zone.remove_rule(zone, obj) self.RichRuleRemoved(zone, rule) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ssi', out_signature='s') @dbus_handle_exceptions def addRichRule(self, zone, rule, timeout, sender=None): # pylint: disable=W0613 zone = dbus_to_python(zone, str) rule = dbus_to_python(rule, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.addRichRule('%s', '%s')" % (zone, rule)) obj = Rich_Rule(rule_str=rule) _zone = self.fw.zone.add_rule(zone, obj, timeout) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disableTimedRichRule, _zone, rule) self.addTimeout(_zone, rule, tag) self.RichRuleAdded(_zone, rule, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def removeRichRule(self, zone, rule, sender=None): # pylint: disable=W0613 zone = dbus_to_python(zone, str) rule = dbus_to_python(rule, str) log.debug1("zone.removeRichRule('%s', '%s')" % (zone, rule)) obj = Rich_Rule(rule_str=rule) _zone = self.fw.zone.remove_rule(zone, obj) self.removeTimeout(_zone, rule) self.RichRuleRemoved(_zone, rule) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryRichRule(self, zone, rule, sender=None): # pylint: disable=W0613 zone = dbus_to_python(zone, str) rule = dbus_to_python(rule, str) log.debug1("zone.queryRichRule('%s', '%s')" % (zone, rule)) obj = Rich_Rule(rule_str=rule) return self.fw.zone.query_rule(zone, obj) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='as') @dbus_handle_exceptions def getRichRules(self, zone, sender=None): # pylint: disable=W0613 # returns the list of enabled rich rules for zone # TODO: should be renamed to listRichRules() # because is called by firewall-cmd --zone --list-rich-rules zone = dbus_to_python(zone, str) log.debug1("zone.getRichRules('%s')" % (zone)) return self.fw.zone.list_rules(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ssi') @dbus_handle_exceptions def RichRuleAdded(self, zone, rule, timeout): log.debug1("zone.RichRuleAdded('%s', '%s', %d)" % (zone, rule, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def RichRuleRemoved(self, zone, rule): log.debug1("zone.RichRuleRemoved('%s', '%s')" % (zone, rule)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # SERVICES @dbus_handle_exceptions def disableTimedService(self, zone, service): log.debug1("zone.disableTimedService('%s', '%s')" % (zone, service)) del self._timeouts[zone][service] self.fw.zone.remove_service(zone, service) self.ServiceRemoved(zone, service) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ssi', out_signature='s') @dbus_handle_exceptions def addService(self, zone, service, timeout, sender=None): # enables service if not enabled already for zone zone = dbus_to_python(zone, str) service = dbus_to_python(service, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.addService('%s', '%s', %d)" % (zone, service, timeout)) self.accessCheck(sender) _zone = self.fw.zone.add_service(zone, service, timeout, sender) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disableTimedService, _zone, service) self.addTimeout(_zone, service, tag) self.ServiceAdded(_zone, service, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def removeService(self, zone, service, sender=None): # disables service for zone zone = dbus_to_python(zone, str) service = dbus_to_python(service, str) log.debug1("zone.removeService('%s', '%s')" % (zone, service)) self.accessCheck(sender) _zone = self.fw.zone.remove_service(zone, service) self.removeTimeout(_zone, service) self.ServiceRemoved(_zone, service) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryService(self, zone, service, sender=None): # pylint: disable=W0613 # returns true if a service is enabled for zone zone = dbus_to_python(zone, str) service = dbus_to_python(service, str) log.debug1("zone.queryService('%s', '%s')" % (zone, service)) return self.fw.zone.query_service(zone, service) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='as') @dbus_handle_exceptions def getServices(self, zone, sender=None): # pylint: disable=W0613 # returns the list of enabled services for zone # TODO: should be renamed to listServices() # because is called by firewall-cmd --zone --list-services zone = dbus_to_python(zone, str) log.debug1("zone.getServices('%s')" % (zone)) return self.fw.zone.list_services(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ssi') @dbus_handle_exceptions def ServiceAdded(self, zone, service, timeout): log.debug1("zone.ServiceAdded('%s', '%s', %d)" % \ (zone, service, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def ServiceRemoved(self, zone, service): log.debug1("zone.ServiceRemoved('%s', '%s')" % (zone, service)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # PORTS @dbus_handle_exceptions def disableTimedPort(self, zone, port, protocol): log.debug1("zone.disableTimedPort('%s', '%s', '%s')" % \ (zone, port, protocol)) del self._timeouts[zone][(port, protocol)] self.fw.zone.remove_port(zone, port, protocol) self.PortRemoved(zone, port, protocol) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sssi', out_signature='s') @dbus_handle_exceptions def addPort(self, zone, port, protocol, timeout, sender=None): # pylint: disable=R0913 # adds port if not enabled already to zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.addPort('%s', '%s', '%s')" % \ (zone, port, protocol)) self.accessCheck(sender) _zone = self.fw.zone.add_port(zone, port, protocol, timeout, sender) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disableTimedPort, _zone, port, protocol) self.addTimeout(_zone, (port, protocol), tag) self.PortAdded(_zone, port, protocol, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sss', out_signature='s') @dbus_handle_exceptions def removePort(self, zone, port, protocol, sender=None): # pylint: disable=R0913 # removes port if enabled from zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("zone.removePort('%s', '%s', '%s')" % \ (zone, port, protocol)) self.accessCheck(sender) _zone= self.fw.zone.remove_port(zone, port, protocol) self.removeTimeout(_zone, (port, protocol)) self.PortRemoved(_zone, port, protocol) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sss', out_signature='b') @dbus_handle_exceptions def queryPort(self, zone, port, protocol, sender=None): # pylint: disable=W0613, R0913 # returns true if a port is enabled for zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("zone.queryPort('%s', '%s', '%s')" % (zone, port, protocol)) return self.fw.zone.query_port(zone, port, protocol) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='aas') @dbus_handle_exceptions def getPorts(self, zone, sender=None): # pylint: disable=W0613 # returns the list of enabled ports # TODO: should be renamed to listPorts() # because is called by firewall-cmd --zone --list-ports zone = dbus_to_python(zone, str) log.debug1("zone.getPorts('%s')" % (zone)) return self.fw.zone.list_ports(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='sssi') @dbus_handle_exceptions def PortAdded(self, zone, port, protocol, timeout=0): log.debug1("zone.PortAdded('%s', '%s', '%s', %d)" % \ (zone, port, protocol, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='sss') @dbus_handle_exceptions def PortRemoved(self, zone, port, protocol): log.debug1("zone.PortRemoved('%s', '%s', '%s')" % \ (zone, port, protocol)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # PROTOCOLS @dbus_handle_exceptions def disableTimedProtocol(self, zone, protocol): log.debug1("zone.disableTimedProtocol('%s', '%s')" % (zone, protocol)) del self._timeouts[zone][(protocol)] self.fw.zone.remove_protocol(zone, protocol) self.ProtocolRemoved(zone, protocol) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ssi', out_signature='s') @dbus_handle_exceptions def addProtocol(self, zone, protocol, timeout, sender=None): # adds protocol if not enabled already to zone zone = dbus_to_python(zone, str) protocol = dbus_to_python(protocol, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.enableProtocol('%s', '%s')" % (zone, protocol)) self.accessCheck(sender) _zone = self.fw.zone.add_protocol(zone, protocol, timeout, sender) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disableTimedProtocol, _zone, protocol) self.addTimeout(_zone, protocol, tag) self.ProtocolAdded(_zone, protocol, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def removeProtocol(self, zone, protocol, sender=None): # removes protocol if enabled from zone zone = dbus_to_python(zone, str) protocol = dbus_to_python(protocol, str) log.debug1("zone.removeProtocol('%s', '%s')" % (zone, protocol)) self.accessCheck(sender) _zone= self.fw.zone.remove_protocol(zone, protocol) self.removeTimeout(_zone, protocol) self.ProtocolRemoved(_zone, protocol) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryProtocol(self, zone, protocol, sender=None): # pylint: disable=W0613 # returns true if a protocol is enabled for zone zone = dbus_to_python(zone, str) protocol = dbus_to_python(protocol, str) log.debug1("zone.queryProtocol('%s', '%s')" % (zone, protocol)) return self.fw.zone.query_protocol(zone, protocol) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='as') @dbus_handle_exceptions def getProtocols(self, zone, sender=None): # pylint: disable=W0613 # returns the list of enabled protocols # TODO: should be renamed to listProtocols() # because is called by firewall-cmd --zone --list-protocols zone = dbus_to_python(zone, str) log.debug1("zone.getProtocols('%s')" % (zone)) return self.fw.zone.list_protocols(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ssi') @dbus_handle_exceptions def ProtocolAdded(self, zone, protocol, timeout=0): log.debug1("zone.ProtocolAdded('%s', '%s', %d)" % \ (zone, protocol, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def ProtocolRemoved(self, zone, protocol): log.debug1("zone.ProtocolRemoved('%s', '%s')" % (zone, protocol)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # SOURCE PORTS @dbus_handle_exceptions def disableTimedSourcePort(self, zone, port, protocol): log.debug1("zone.disableTimedSourcePort('%s', '%s', '%s')" % \ (zone, port, protocol)) del self._timeouts[zone][("sport", port, protocol)] self.fw.zone.remove_source_port(zone, port, protocol) self.SourcePortRemoved(zone, port, protocol) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sssi', out_signature='s') @dbus_handle_exceptions def addSourcePort(self, zone, port, protocol, timeout, sender=None): # pylint: disable=R0913 # adds source port if not enabled already to zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.addSourcePort('%s', '%s', '%s')" % (zone, port, protocol)) self.accessCheck(sender) _zone = self.fw.zone.add_source_port(zone, port, protocol, timeout, sender) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disableTimedSourcePort, _zone, port, protocol) self.addTimeout(_zone, ("sport", port, protocol), tag) self.SourcePortAdded(_zone, port, protocol, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sss', out_signature='s') @dbus_handle_exceptions def removeSourcePort(self, zone, port, protocol, sender=None): # pylint: disable=R0913 # removes source port if enabled from zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("zone.removeSourcePort('%s', '%s', '%s')" % (zone, port, protocol)) self.accessCheck(sender) _zone= self.fw.zone.remove_source_port(zone, port, protocol) self.removeTimeout(_zone, ("sport", port, protocol)) self.SourcePortRemoved(_zone, port, protocol) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sss', out_signature='b') @dbus_handle_exceptions def querySourcePort(self, zone, port, protocol, sender=None): # pylint: disable=W0613, R0913 # returns true if a source port is enabled for zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) log.debug1("zone.querySourcePort('%s', '%s', '%s')" % (zone, port, protocol)) return self.fw.zone.query_source_port(zone, port, protocol) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='aas') @dbus_handle_exceptions def getSourcePorts(self, zone, sender=None): # pylint: disable=W0613 # returns the list of enabled source ports # TODO: should be renamed to listSourcePorts() # because is called by firewall-cmd --zone --list-source-ports zone = dbus_to_python(zone, str) log.debug1("zone.getSourcePorts('%s')" % (zone)) return self.fw.zone.list_source_ports(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='sssi') @dbus_handle_exceptions def SourcePortAdded(self, zone, port, protocol, timeout=0): log.debug1("zone.SourcePortAdded('%s', '%s', '%s', %d)" % \ (zone, port, protocol, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='sss') @dbus_handle_exceptions def SourcePortRemoved(self, zone, port, protocol): log.debug1("zone.SourcePortRemoved('%s', '%s', '%s')" % (zone, port, protocol)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # MASQUERADE @dbus_handle_exceptions def disableTimedMasquerade(self, zone): del self._timeouts[zone]["masquerade"] self.fw.zone.remove_masquerade(zone) self.MasqueradeRemoved(zone) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='si', out_signature='s') @dbus_handle_exceptions def addMasquerade(self, zone, timeout, sender=None): # adds masquerade if not added already zone = dbus_to_python(zone, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.addMasquerade('%s')" % (zone)) self.accessCheck(sender) _zone = self.fw.zone.add_masquerade(zone, timeout, sender) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disableTimedMasquerade, _zone) self.addTimeout(_zone, "masquerade", tag) self.MasqueradeAdded(_zone, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='s') @dbus_handle_exceptions def removeMasquerade(self, zone, sender=None): # removes masquerade zone = dbus_to_python(zone, str) log.debug1("zone.removeMasquerade('%s')" % (zone)) self.accessCheck(sender) _zone = self.fw.zone.remove_masquerade(zone) self.removeTimeout(_zone, "masquerade") self.MasqueradeRemoved(_zone) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryMasquerade(self, zone, sender=None): # pylint: disable=W0613 # returns true if a masquerade is added zone = dbus_to_python(zone, str) log.debug1("zone.queryMasquerade('%s')" % (zone)) return self.fw.zone.query_masquerade(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='si') @dbus_handle_exceptions def MasqueradeAdded(self, zone, timeout=0): log.debug1("zone.MasqueradeAdded('%s', %d)" % (zone, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='s') @dbus_handle_exceptions def MasqueradeRemoved(self, zone): log.debug1("zone.MasqueradeRemoved('%s')" % (zone)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # FORWARD PORT @dbus_handle_exceptions def disable_forward_port(self, zone, port, protocol, toport, toaddr): # pylint: disable=R0913 del self._timeouts[zone][(port, protocol, toport, toaddr)] self.fw.zone.remove_forward_port(zone, port, protocol, toport, toaddr) self.ForwardPortRemoved(zone, port, protocol, toport, toaddr) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sssssi', out_signature='s') @dbus_handle_exceptions def addForwardPort(self, zone, port, protocol, toport, toaddr, timeout, sender=None): # pylint: disable=R0913 # add forward port if not enabled already for zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) toport = dbus_to_python(toport, str) toaddr = dbus_to_python(toaddr, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.addForwardPort('%s', '%s', '%s', '%s', '%s')" % \ (zone, port, protocol, toport, toaddr)) self.accessCheck(sender) _zone = self.fw.zone.add_forward_port(zone, port, protocol, toport, toaddr, timeout, sender) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disable_forward_port, _zone, port, protocol, toport, toaddr) self.addTimeout(_zone, (port, protocol, toport, toaddr), tag) self.ForwardPortAdded(_zone, port, protocol, toport, toaddr, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sssss', out_signature='s') @dbus_handle_exceptions def removeForwardPort(self, zone, port, protocol, toport, toaddr, sender=None): # pylint: disable=R0913 # remove forward port from zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) toport = dbus_to_python(toport, str) toaddr = dbus_to_python(toaddr, str) log.debug1("zone.removeForwardPort('%s', '%s', '%s', '%s', '%s')" % \ (zone, port, protocol, toport, toaddr)) self.accessCheck(sender) _zone = self.fw.zone.remove_forward_port(zone, port, protocol, toport, toaddr) self.removeTimeout(_zone, (port, protocol, toport, toaddr)) self.ForwardPortRemoved(_zone, port, protocol, toport, toaddr) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='sssss', out_signature='b') @dbus_handle_exceptions def queryForwardPort(self, zone, port, protocol, toport, toaddr, sender=None): # pylint: disable=W0613, R0913 # returns true if a forward port is enabled for zone zone = dbus_to_python(zone, str) port = dbus_to_python(port, str) protocol = dbus_to_python(protocol, str) toport = dbus_to_python(toport, str) toaddr = dbus_to_python(toaddr, str) log.debug1("zone.queryForwardPort('%s', '%s', '%s', '%s', '%s')" % \ (zone, port, protocol, toport, toaddr)) return self.fw.zone.query_forward_port(zone, port, protocol, toport, toaddr) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='aas') @dbus_handle_exceptions def getForwardPorts(self, zone, sender=None): # pylint: disable=W0613 # returns the list of enabled ports for zone # TODO: should be renamed to listForwardPorts() # because is called by firewall-cmd --zone --list-forward-ports zone = dbus_to_python(zone, str) log.debug1("zone.getForwardPorts('%s')" % (zone)) return self.fw.zone.list_forward_ports(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='sssssi') @dbus_handle_exceptions def ForwardPortAdded(self, zone, port, protocol, toport, toaddr, timeout=0): # pylint: disable=R0913 log.debug1("zone.ForwardPortAdded('%s', '%s', '%s', '%s', '%s', %d)" % \ (zone, port, protocol, toport, toaddr, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='sssss') @dbus_handle_exceptions def ForwardPortRemoved(self, zone, port, protocol, toport, toaddr): # pylint: disable=R0913 log.debug1("zone.ForwardPortRemoved('%s', '%s', '%s', '%s', '%s')" % \ (zone, port, protocol, toport, toaddr)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ICMP BLOCK @dbus_handle_exceptions def disableTimedIcmpBlock(self, zone, icmp, sender): # pylint: disable=W0613 log.debug1("zone.disableTimedIcmpBlock('%s', '%s')" % (zone, icmp)) del self._timeouts[zone][icmp] self.fw.zone.remove_icmp_block(zone, icmp) self.IcmpBlockRemoved(zone, icmp) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ssi', out_signature='s') @dbus_handle_exceptions def addIcmpBlock(self, zone, icmp, timeout, sender=None): # add icmpblock if not enabled already for zone zone = dbus_to_python(zone, str) icmp = dbus_to_python(icmp, str) timeout = dbus_to_python(timeout, int) log.debug1("zone.enableIcmpBlock('%s', '%s')" % (zone, icmp)) self.accessCheck(sender) _zone = self.fw.zone.add_icmp_block(zone, icmp, timeout, sender) if timeout > 0: tag = GLib.timeout_add_seconds(timeout, self.disableTimedIcmpBlock, _zone, icmp, sender) self.addTimeout(_zone, icmp, tag) self.IcmpBlockAdded(_zone, icmp, timeout) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='s') @dbus_handle_exceptions def removeIcmpBlock(self, zone, icmp, sender=None): # removes icmpBlock from zone zone = dbus_to_python(zone, str) icmp = dbus_to_python(icmp, str) log.debug1("zone.removeIcmpBlock('%s', '%s')" % (zone, icmp)) self.accessCheck(sender) _zone = self.fw.zone.remove_icmp_block(zone, icmp) self.removeTimeout(_zone, icmp) self.IcmpBlockRemoved(_zone, icmp) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryIcmpBlock(self, zone, icmp, sender=None): # pylint: disable=W0613 # returns true if a icmp is enabled for zone zone = dbus_to_python(zone, str) icmp = dbus_to_python(icmp, str) log.debug1("zone.queryIcmpBlock('%s', '%s')" % (zone, icmp)) return self.fw.zone.query_icmp_block(zone, icmp) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='as') @dbus_handle_exceptions def getIcmpBlocks(self, zone, sender=None): # pylint: disable=W0613 # returns the list of enabled icmpblocks # TODO: should be renamed to listIcmpBlocks() # because is called by firewall-cmd --zone --list-icmp-blocks zone = dbus_to_python(zone, str) log.debug1("zone.getIcmpBlocks('%s')" % (zone)) return self.fw.zone.list_icmp_blocks(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ssi') @dbus_handle_exceptions def IcmpBlockAdded(self, zone, icmp, timeout=0): log.debug1("zone.IcmpBlockAdded('%s', '%s', %d)" % \ (zone, icmp, timeout)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='ss') @dbus_handle_exceptions def IcmpBlockRemoved(self, zone, icmp): log.debug1("zone.IcmpBlockRemoved('%s', '%s')" % (zone, icmp)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # ICMP BLOCK INVERSION @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='s') @dbus_handle_exceptions def addIcmpBlockInversion(self, zone, sender=None): # adds icmpBlockInversion if not added already zone = dbus_to_python(zone, str) log.debug1("zone.addIcmpBlockInversion('%s')" % (zone)) self.accessCheck(sender) _zone = self.fw.zone.add_icmp_block_inversion(zone, sender) self.IcmpBlockInversionAdded(_zone) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='s') @dbus_handle_exceptions def removeIcmpBlockInversion(self, zone, sender=None): # removes icmpBlockInversion zone = dbus_to_python(zone, str) log.debug1("zone.removeIcmpBlockInversion('%s')" % (zone)) self.accessCheck(sender) _zone = self.fw.zone.remove_icmp_block_inversion(zone) self.IcmpBlockInversionRemoved(_zone) return _zone @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_ZONE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryIcmpBlockInversion(self, zone, sender=None): # pylint: disable=W0613 # returns true if a icmpBlockInversion is added zone = dbus_to_python(zone, str) log.debug1("zone.queryIcmpBlockInversion('%s')" % (zone)) return self.fw.zone.query_icmp_block_inversion(zone) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='s') @dbus_handle_exceptions def IcmpBlockInversionAdded(self, zone): log.debug1("zone.IcmpBlockInversionAdded('%s')" % (zone)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_ZONE, signature='s') @dbus_handle_exceptions def IcmpBlockInversionRemoved(self, zone): log.debug1("zone.IcmpBlockInversionRemoved('%s')" % (zone)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # DIRECT INTERFACE # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # DIRECT CHAIN @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sss', out_signature='') @dbus_handle_exceptions def addChain(self, ipv, table, chain, sender=None): # inserts direct chain ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) log.debug1("direct.addChain('%s', '%s', '%s')" % (ipv, table, chain)) self.accessCheck(sender) self.fw.direct.add_chain(ipv, table, chain) self.ChainAdded(ipv, table, chain) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sss', out_signature='') @dbus_handle_exceptions def removeChain(self, ipv, table, chain, sender=None): # removes direct chain ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) log.debug1("direct.removeChain('%s', '%s', '%s')" % (ipv, table, chain)) self.accessCheck(sender) self.fw.direct.remove_chain(ipv, table, chain) self.ChainRemoved(ipv, table, chain) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sss', out_signature='b') @dbus_handle_exceptions def queryChain(self, ipv, table, chain, sender=None): # pylint: disable=W0613 # returns true if a chain is enabled ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) log.debug1("direct.queryChain('%s', '%s', '%s')" % (ipv, table, chain)) return self.fw.direct.query_chain(ipv, table, chain) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='ss', out_signature='as') @dbus_handle_exceptions def getChains(self, ipv, table, sender=None): # pylint: disable=W0613 # returns list of added chains ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) log.debug1("direct.getChains('%s', '%s')" % (ipv, table)) return self.fw.direct.get_chains(ipv, table) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='', out_signature='a(sss)') @dbus_handle_exceptions def getAllChains(self, sender=None): # pylint: disable=W0613 # returns list of added chains log.debug1("direct.getAllChains()") return self.fw.direct.get_all_chains() @dbus.service.signal(config.dbus.DBUS_INTERFACE_DIRECT, signature='sss') @dbus_handle_exceptions def ChainAdded(self, ipv, table, chain): log.debug1("direct.ChainAdded('%s', '%s', '%s')" % (ipv, table, chain)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_DIRECT, signature='sss') @dbus_handle_exceptions def ChainRemoved(self, ipv, table, chain): log.debug1("direct.ChainRemoved('%s', '%s', '%s')" % (ipv, table, chain)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # DIRECT RULE @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sssias', out_signature='') @dbus_handle_exceptions def addRule(self, ipv, table, chain, priority, args, sender=None): # pylint: disable=R0913 # inserts direct rule ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) priority = dbus_to_python(priority, int) args = tuple( dbus_to_python(i, str) for i in args ) log.debug1("direct.addRule('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) self.accessCheck(sender) self.fw.direct.add_rule(ipv, table, chain, priority, args) self.RuleAdded(ipv, table, chain, priority, args) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sssias', out_signature='') @dbus_handle_exceptions def removeRule(self, ipv, table, chain, priority, args, sender=None): # pylint: disable=R0913 # removes direct rule ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) priority = dbus_to_python(priority, int) args = tuple( dbus_to_python(i, str) for i in args ) log.debug1("direct.removeRule('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) self.accessCheck(sender) self.fw.direct.remove_rule(ipv, table, chain, priority, args) self.RuleRemoved(ipv, table, chain, priority, args) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sss', out_signature='') @dbus_handle_exceptions def removeRules(self, ipv, table, chain, sender=None): # removes direct rule ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) log.debug1("direct.removeRules('%s', '%s', '%s')" % (ipv, table, chain)) self.accessCheck(sender) for (priority, args) in self.fw.direct.get_rules(ipv, table, chain): self.fw.direct.remove_rule(ipv, table, chain, priority, args) self.RuleRemoved(ipv, table, chain, priority, args) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sssias', out_signature='b') @dbus_handle_exceptions def queryRule(self, ipv, table, chain, priority, args, sender=None): # pylint: disable=W0613, R0913 # returns true if a rule is enabled ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) priority = dbus_to_python(priority, int) args = tuple( dbus_to_python(i, str) for i in args ) log.debug1("direct.queryRule('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) return self.fw.direct.query_rule(ipv, table, chain, priority, args) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sss', out_signature='a(ias)') @dbus_handle_exceptions def getRules(self, ipv, table, chain, sender=None): # pylint: disable=W0613 # returns list of added rules ipv = dbus_to_python(ipv, str) table = dbus_to_python(table, str) chain = dbus_to_python(chain, str) log.debug1("direct.getRules('%s', '%s', '%s')" % (ipv, table, chain)) return self.fw.direct.get_rules(ipv, table, chain) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='', out_signature='a(sssias)') @dbus_handle_exceptions def getAllRules(self, sender=None): # pylint: disable=W0613 # returns list of added rules log.debug1("direct.getAllRules()") return self.fw.direct.get_all_rules() @dbus.service.signal(config.dbus.DBUS_INTERFACE_DIRECT, signature='sssias') @dbus_handle_exceptions def RuleAdded(self, ipv, table, chain, priority, args): # pylint: disable=R0913 log.debug1("direct.RuleAdded('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) @dbus.service.signal(config.dbus.DBUS_INTERFACE_DIRECT, signature='sssias') @dbus_handle_exceptions def RuleRemoved(self, ipv, table, chain, priority, args): # pylint: disable=R0913 log.debug1("direct.RuleRemoved('%s', '%s', '%s', %d, '%s')" % \ (ipv, table, chain, priority, "','".join(args))) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # DIRECT PASSTHROUGH (untracked) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sas', out_signature='s') @dbus_handle_exceptions def passthrough(self, ipv, args, sender=None): # inserts direct rule ipv = dbus_to_python(ipv, str) args = tuple( dbus_to_python(i, str) for i in args ) log.debug1("direct.passthrough('%s', '%s')" % (ipv, "','".join(args))) self.accessCheck(sender) try: return self.fw.direct.passthrough(ipv, args) except FirewallError as error: if ipv in ["ipv4", "ipv6"]: query_args = set(["-C", "--check", "-L", "--list"]) else: query_args = set(["-L", "--list"]) msg = str(error) if error.code == errors.COMMAND_FAILED: if len(set(args) & query_args) <= 0: log.warning(msg) raise FirewallDBusException(msg) raise # DIRECT PASSTHROUGH (tracked) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sas', out_signature='') @dbus_handle_exceptions def addPassthrough(self, ipv, args, sender=None): # inserts direct passthrough ipv = dbus_to_python(ipv) args = tuple( dbus_to_python(i) for i in args ) log.debug1("direct.addPassthrough('%s', '%s')" % \ (ipv, "','".join(args))) self.accessCheck(sender) self.fw.direct.add_passthrough(ipv, args) self.PassthroughAdded(ipv, args) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sas', out_signature='') @dbus_handle_exceptions def removePassthrough(self, ipv, args, sender=None): # removes direct passthrough ipv = dbus_to_python(ipv) args = tuple( dbus_to_python(i) for i in args ) log.debug1("direct.removePassthrough('%s', '%s')" % \ (ipv, "','".join(args))) self.accessCheck(sender) self.fw.direct.remove_passthrough(ipv, args) self.PassthroughRemoved(ipv, args) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='sas', out_signature='b') @dbus_handle_exceptions def queryPassthrough(self, ipv, args, sender=None): # pylint: disable=W0613 # returns true if a passthrough is enabled ipv = dbus_to_python(ipv) args = tuple( dbus_to_python(i) for i in args ) log.debug1("direct.queryPassthrough('%s', '%s')" % \ (ipv, "','".join(args))) return self.fw.direct.query_passthrough(ipv, args) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='', out_signature='a(sas)') @dbus_handle_exceptions def getAllPassthroughs(self, sender=None): # pylint: disable=W0613 # returns list of all added passthroughs log.debug1("direct.getAllPassthroughs()") return self.fw.direct.get_all_passthroughs() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='', out_signature='') @dbus_handle_exceptions def removeAllPassthroughs(self, sender=None): # pylint: disable=W0613 # remove all passhroughs log.debug1("direct.removeAllPassthroughs()") # remove in reverse order to avoid removing non-empty chains for passthrough in reversed(self.getAllPassthroughs()): self.removePassthrough(*passthrough) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_DIRECT_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_DIRECT, in_signature='s', out_signature='aas') @dbus_handle_exceptions def getPassthroughs(self, ipv, sender=None): # pylint: disable=W0613 # returns list of all added passthroughs with ipv ipv = dbus_to_python(ipv) log.debug1("direct.getPassthroughs('%s')", ipv) return self.fw.direct.get_passthroughs(ipv) @dbus.service.signal(config.dbus.DBUS_INTERFACE_DIRECT, signature='sas') @dbus_handle_exceptions def PassthroughAdded(self, ipv, args): log.debug1("direct.PassthroughAdded('%s', '%s')" % \ (ipv, "','".join(args))) @dbus.service.signal(config.dbus.DBUS_INTERFACE_DIRECT, signature='sas') @dbus_handle_exceptions def PassthroughRemoved(self, ipv, args): log.debug1("direct.PassthroughRemoved('%s', '%s')" % \ (ipv, "','".join(args))) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_ALL) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='') @dbus_handle_exceptions def authorizeAll(self, sender=None): # pylint: disable=W0613 """ PK_ACTION_ALL implies all other actions, i.e. once a subject is authorized for PK_ACTION_ALL it's also authorized for any other action. Use-case is GUI (RHBZ#994729). """ pass # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # IPSETS # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryIPSet(self, ipset, sender=None): # pylint: disable=W0613 # returns true if a set with the name exists ipset = dbus_to_python(ipset) log.debug1("ipset.queryIPSet('%s')" % (ipset)) return self.fw.ipset.query_ipset(ipset) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='', out_signature='as') @dbus_handle_exceptions def getIPSets(self, sender=None): # pylint: disable=W0613 # returns list of added sets log.debug1("ipsets.getIPSets()") return self.fw.ipset.get_ipsets() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='s', out_signature=IPSet.DBUS_SIGNATURE) @dbus_handle_exceptions def getIPSetSettings(self, ipset, sender=None): # pylint: disable=W0613 # returns ipset settings for ipset ipset = dbus_to_python(ipset, str) log.debug1("getIPSetSettings(%s)", ipset) return self.fw.ipset.get_ipset(ipset).export_config() # set entries # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='ss', out_signature='') @dbus_handle_exceptions def addEntry(self, ipset, entry, sender=None): # adds ipset entry ipset = dbus_to_python(ipset) entry = dbus_to_python(entry) log.debug1("ipset.addEntry('%s', '%s')" % (ipset, entry)) self.accessCheck(sender) self.fw.ipset.add_entry(ipset, entry) self.EntryAdded(ipset, entry) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='ss', out_signature='') @dbus_handle_exceptions def removeEntry(self, ipset, entry, sender=None): # removes ipset entry ipset = dbus_to_python(ipset) entry = dbus_to_python(entry) log.debug1("ipset.removeEntry('%s', '%s')" % (ipset, entry)) self.accessCheck(sender) self.fw.ipset.remove_entry(ipset, entry) self.EntryRemoved(ipset, entry) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='ss', out_signature='b') @dbus_handle_exceptions def queryEntry(self, ipset, entry, sender=None): # pylint: disable=W0613 # returns true if the entry exists in the ipset ipset = dbus_to_python(ipset) entry = dbus_to_python(entry) log.debug1("ipset.queryEntry('%s', '%s')" % (ipset, entry)) return self.fw.ipset.query_entry(ipset, entry) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='s', out_signature='as') @dbus_handle_exceptions def getEntries(self, ipset, sender=None): # pylint: disable=W0613 # returns list of added entries for the ipset ipset = dbus_to_python(ipset) log.debug1("ipset.getEntries('%s')" % ipset) return self.fw.ipset.get_entries(ipset) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(config.dbus.DBUS_INTERFACE_IPSET, in_signature='sas') @dbus_handle_exceptions def setEntries(self, ipset, entries, sender=None): # pylint: disable=W0613 # returns list of added entries for the ipset ipset = dbus_to_python(ipset) entries = dbus_to_python(entries, list) log.debug1("ipset.setEntries('%s', '[%s]')", ipset, ",".join(entries)) old_entries = self.fw.ipset.get_entries(ipset) self.fw.ipset.set_entries(ipset, entries) old_entries_set = set(old_entries) entries_set = set(entries) for entry in entries_set - old_entries_set: self.EntryAdded(ipset, entry) for entry in old_entries_set - entries_set: self.EntryRemoved(ipset, entry) @dbus.service.signal(config.dbus.DBUS_INTERFACE_IPSET, signature='ss') @dbus_handle_exceptions def EntryAdded(self, ipset, entry): ipset = dbus_to_python(ipset) entry = dbus_to_python(entry) log.debug1("ipset.EntryAdded('%s', '%s')" % (ipset, entry)) @dbus.service.signal(config.dbus.DBUS_INTERFACE_IPSET, signature='ss') @dbus_handle_exceptions def EntryRemoved(self, ipset, entry): ipset = dbus_to_python(ipset) entry = dbus_to_python(entry) log.debug1("ipset.EntryRemoved('%s', '%s')" % (ipset, entry)) # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # HELPERS # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='', out_signature='as') @dbus_handle_exceptions def getHelpers(self, sender=None): # pylint: disable=W0613 # returns list of added sets log.debug1("helpers.getHelpers()") return self.fw.helper.get_helpers() @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG_INFO) @dbus_service_method(config.dbus.DBUS_INTERFACE, in_signature='s', out_signature=Helper.DBUS_SIGNATURE) @dbus_handle_exceptions def getHelperSettings(self, helper, sender=None): # pylint: disable=W0613 # returns helper settings for helper helper = dbus_to_python(helper, str) log.debug1("getHelperSettings(%s)", helper) return self.fw.helper.get_helper(helper).export_config() PK[o??.site-packages/firewall/server/config_ipset.pyonu[ c`c@sddlmZddlZeejdtj|jjS|dkr]tj|jjS|dkr|tj|jjS|dkrtj|jjStj j d|dS(NtnametfilenameRtdefaulttbuiltinsDorg.freedesktop.DBus.Error.InvalidArgs: Property '%s' does not exist( RtStringRR!R"RtBooleanR#R$t exceptionst DBusException(Rt property_name((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pyt _get_propertyRs      t in_signaturetsst out_signaturetvcCsot|t}t|t}tjd|j|||tjjkrbtjj d|n|j |S(Ns%s.Get('%s', '%s')sJorg.freedesktop.DBus.Error.UnknownInterface: Interface '%s' does not exist( RtstrRtdebug1RRRRR'R(R*(Rtinterface_nameR)tsender((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pytGetcs   tssa{sv}cCst|t}tjd|j||tjjkrPtjj d|ni}x0dddddgD]}|j |||tservicetsignalRAtPK_ACTION_INFOtINTROSPECTABLE_IFACERCRRtDBUS_SIGNATURERGRKRMRIRPRQRTRSRURXRYR[R\R^R_RbRcRgRkRmRoRqRxR{R|R}(((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pyR1s  $                   (t gi.repositoryRtsystmodulesRt dbus.servicet slip.dbusRtslip.dbus.servicetfirewallRtfirewall.dbus_utilsRRRtfirewall.core.io.ipsetRtfirewall.core.ipsetRtfirewall.core.loggerRtfirewall.server.decoratorsR R R R tfirewall.errorsR RtObjectR(((s@/usr/lib/python2.7/site-packages/firewall/server/config_ipset.pyts      PK[v8S:S:0site-packages/firewall/server/config_icmptype.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # force use of pygobject3 in python-slip from gi.repository import GObject import sys sys.modules['gobject'] = GObject import dbus import dbus.service import slip.dbus import slip.dbus.service from firewall import config from firewall.dbus_utils import dbus_to_python, \ dbus_introspection_prepare_properties, \ dbus_introspection_add_properties from firewall.core.io.icmptype import IcmpType from firewall.core.logger import log from firewall.server.decorators import handle_exceptions, \ dbus_handle_exceptions, dbus_service_method from firewall import errors from firewall.errors import FirewallError ############################################################################ # # class FirewallDConfigIcmpType # ############################################################################ class FirewallDConfigIcmpType(slip.dbus.service.Object): """FirewallD main class""" persistent = True """ Make FirewallD persistent. """ default_polkit_auth_required = config.dbus.PK_ACTION_CONFIG """ Use PK_ACTION_INFO as a default """ @handle_exceptions def __init__(self, parent, conf, icmptype, item_id, *args, **kwargs): super(FirewallDConfigIcmpType, self).__init__(*args, **kwargs) self.parent = parent self.config = conf self.obj = icmptype self.item_id = item_id self.busname = args[0] self.path = args[1] self._log_prefix = "config.icmptype.%d" % self.item_id dbus_introspection_prepare_properties( self, config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE) @dbus_handle_exceptions def __del__(self): pass @dbus_handle_exceptions def unregister(self): self.remove_from_connection() # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # P R O P E R T I E S @dbus_handle_exceptions def _get_property(self, property_name): if property_name == "name": return dbus.String(self.obj.name) elif property_name == "filename": return dbus.String(self.obj.filename) elif property_name == "path": return dbus.String(self.obj.path) elif property_name == "default": return dbus.Boolean(self.obj.default) elif property_name == "builtin": return dbus.Boolean(self.obj.builtin) else: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.InvalidArgs: " "Property '%s' does not exist" % property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ss', out_signature='v') @dbus_handle_exceptions def Get(self, interface_name, property_name, sender=None): # pylint: disable=W0613 # get a property interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) log.debug1("%s.Get('%s', '%s')", self._log_prefix, interface_name, property_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) return self._get_property(property_name) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='s', out_signature='a{sv}') @dbus_handle_exceptions def GetAll(self, interface_name, sender=None): # pylint: disable=W0613 interface_name = dbus_to_python(interface_name, str) log.debug1("%s.GetAll('%s')", self._log_prefix, interface_name) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) ret = { } for x in [ "name", "filename", "path", "default", "builtin" ]: ret[x] = self._get_property(x) return dbus.Dictionary(ret, signature="sv") @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_CONFIG) @dbus_service_method(dbus.PROPERTIES_IFACE, in_signature='ssv') @dbus_handle_exceptions def Set(self, interface_name, property_name, new_value, sender=None): interface_name = dbus_to_python(interface_name, str) property_name = dbus_to_python(property_name, str) new_value = dbus_to_python(new_value) log.debug1("%s.Set('%s', '%s', '%s')", self._log_prefix, interface_name, property_name, new_value) self.parent.accessCheck(sender) if interface_name != config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE: raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.UnknownInterface: " "Interface '%s' does not exist" % interface_name) raise dbus.exceptions.DBusException( "org.freedesktop.DBus.Error.PropertyReadOnly: " "Property '%s' is read-only" % property_name) @dbus.service.signal(dbus.PROPERTIES_IFACE, signature='sa{sv}as') def PropertiesChanged(self, interface_name, changed_properties, invalidated_properties): interface_name = dbus_to_python(interface_name, str) changed_properties = dbus_to_python(changed_properties) invalidated_properties = dbus_to_python(invalidated_properties) log.debug1("%s.PropertiesChanged('%s', '%s', '%s')", self._log_prefix, interface_name, changed_properties, invalidated_properties) @slip.dbus.polkit.require_auth(config.dbus.PK_ACTION_INFO) @dbus_service_method(dbus.INTROSPECTABLE_IFACE, out_signature='s') @dbus_handle_exceptions def Introspect(self, sender=None): # pylint: disable=W0613 log.debug2("%s.Introspect()", self._log_prefix) data = super(FirewallDConfigIcmpType, self).Introspect( self.path, self.busname.get_bus()) return dbus_introspection_add_properties( self, data, config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE) # S E T T I N G S @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, out_signature=IcmpType.DBUS_SIGNATURE) @dbus_handle_exceptions def getSettings(self, sender=None): # pylint: disable=W0613 """get settings for icmptype """ log.debug1("%s.getSettings()", self._log_prefix) return self.config.get_icmptype_config(self.obj) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature=IcmpType.DBUS_SIGNATURE) @dbus_handle_exceptions def update(self, settings, sender=None): """update settings for icmptype """ settings = dbus_to_python(settings) log.debug1("%s.update('...')", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.set_icmptype_config(self.obj, settings) self.Updated(self.obj.name) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE) @dbus_handle_exceptions def loadDefaults(self, sender=None): """load default settings for builtin icmptype """ log.debug1("%s.loadDefaults()", self._log_prefix) self.parent.accessCheck(sender) self.obj = self.config.load_icmptype_defaults(self.obj) self.Updated(self.obj.name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, signature='s') @dbus_handle_exceptions def Updated(self, name): log.debug1("%s.Updated('%s')" % (self._log_prefix, name)) # R E M O V E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE) @dbus_handle_exceptions def remove(self, sender=None): """remove icmptype """ log.debug1("%s.removeIcmpType()", self._log_prefix) self.parent.accessCheck(sender) self.config.remove_icmptype(self.obj) self.parent.removeIcmpType(self.obj) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, signature='s') @dbus_handle_exceptions def Removed(self, name): log.debug1("%s.Removed('%s')" % (self._log_prefix, name)) # R E N A M E @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='s') @dbus_handle_exceptions def rename(self, name, sender=None): """rename icmptype """ name = dbus_to_python(name, str) log.debug1("%s.rename('%s')", self._log_prefix, name) self.parent.accessCheck(sender) self.obj = self.config.rename_icmptype(self.obj, name) self.Renamed(name) @dbus.service.signal(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, signature='s') @dbus_handle_exceptions def Renamed(self, name): log.debug1("%s.Renamed('%s')" % (self._log_prefix, name)) # version @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, out_signature='s') @dbus_handle_exceptions def getVersion(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getVersion()", self._log_prefix) return self.getSettings()[0] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='s') @dbus_handle_exceptions def setVersion(self, version, sender=None): version = dbus_to_python(version, str) log.debug1("%s.setVersion('%s')", self._log_prefix, version) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[0] = version self.update(settings) # short @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, out_signature='s') @dbus_handle_exceptions def getShort(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getShort()", self._log_prefix) return self.getSettings()[1] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='s') @dbus_handle_exceptions def setShort(self, short, sender=None): short = dbus_to_python(short, str) log.debug1("%s.setShort('%s')", self._log_prefix, short) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[1] = short self.update(settings) # description @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, out_signature='s') @dbus_handle_exceptions def getDescription(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getDescription()", self._log_prefix) return self.getSettings()[2] @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='s') @dbus_handle_exceptions def setDescription(self, description, sender=None): description = dbus_to_python(description, str) log.debug1("%s.setDescription('%s')", self._log_prefix, description) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[2] = description self.update(settings) # destination @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, out_signature='as') @dbus_handle_exceptions def getDestinations(self, sender=None): # pylint: disable=W0613 log.debug1("%s.getDestinations()", self._log_prefix) return sorted(self.getSettings()[3]) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='as') @dbus_handle_exceptions def setDestinations(self, destinations, sender=None): destinations = dbus_to_python(destinations, list) log.debug1("%s.setDestinations('[%s]')", self._log_prefix, ",".join(destinations)) self.parent.accessCheck(sender) settings = list(self.getSettings()) settings[3] = destinations self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='s') @dbus_handle_exceptions def addDestination(self, destination, sender=None): destination = dbus_to_python(destination, str) log.debug1("%s.addDestination('%s')", self._log_prefix, destination) self.parent.accessCheck(sender) settings = list(self.getSettings()) if destination in settings[3]: raise FirewallError(errors.ALREADY_ENABLED, destination) settings[3].append(destination) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='s') @dbus_handle_exceptions def removeDestination(self, destination, sender=None): destination = dbus_to_python(destination, str) log.debug1("%s.removeDestination('%s')", self._log_prefix, destination) self.parent.accessCheck(sender) settings = list(self.getSettings()) if settings[3]: if destination not in settings[3]: raise FirewallError(errors.NOT_ENABLED, destination) else: settings[3].remove(destination) else: # empty means all settings[3] = list(set(['ipv4', 'ipv6']) - set([destination])) self.update(settings) @dbus_service_method(config.dbus.DBUS_INTERFACE_CONFIG_ICMPTYPE, in_signature='s', out_signature='b') @dbus_handle_exceptions def queryDestination(self, destination, sender=None): # pylint: disable=W0613 destination = dbus_to_python(destination, str) log.debug1("%s.queryDestination('%s')", self._log_prefix, destination) settings = self.getSettings() # empty means all return (not settings[3] or destination in settings[3]) PK[[g +site-packages/firewall/server/decorators.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2012-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . """This module contains decorators for use with and without D-Bus""" __all__ = ["FirewallDBusException", "handle_exceptions", "dbus_handle_exceptions", "dbus_service_method"] import dbus import dbus.service import traceback from dbus.exceptions import DBusException from decorator import decorator from firewall import config from firewall.errors import FirewallError from firewall import errors from firewall.core.logger import log ############################################################################ # # Exception handler decorators # ############################################################################ class FirewallDBusException(dbus.DBusException): """FirewallDBusException""" _dbus_error_name = "%s.Exception" % config.dbus.DBUS_INTERFACE @decorator def handle_exceptions(func, *args, **kwargs): """Decorator to handle exceptions and log them. Used if not conneced to D-Bus. """ try: return func(*args, **kwargs) except FirewallError as error: log.debug1(traceback.format_exc()) log.error(error) except Exception: # pylint: disable=W0703 log.debug1(traceback.format_exc()) log.exception() @decorator def dbus_handle_exceptions(func, *args, **kwargs): """Decorator to handle exceptions, log and report them into D-Bus :Raises DBusException: on a firewall error code problems. """ try: return func(*args, **kwargs) except FirewallError as error: code = FirewallError.get_code(str(error)) if code in [ errors.ALREADY_ENABLED, errors.NOT_ENABLED, errors.ZONE_ALREADY_SET, errors.ALREADY_SET ]: log.warning(str(error)) else: log.debug1(traceback.format_exc()) log.error(str(error)) raise FirewallDBusException(str(error)) except DBusException as ex: # only log DBusExceptions once raise ex except Exception as ex: log.debug1(traceback.format_exc()) log.exception() raise FirewallDBusException(str(ex)) def dbus_service_method(*args, **kwargs): """Add sender argument for D-Bus""" kwargs.setdefault("sender_keyword", "sender") return dbus.service.method(*args, **kwargs) PK[l"site-packages/firewall/fw_types.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2013-2016 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # __all__ = [ "LastUpdatedOrderedDict" ] class LastUpdatedOrderedDict(object): def __init__(self, x=None): self._dict = { } self._list = [ ] if x: self.update(x) def clear(self): del self._list[:] self._dict.clear() def update(self, x): for key,value in x.items(): self[key] = value def items(self): return [(key, self[key]) for key in self._list] def __delitem__(self, key): if key in self._dict: self._list.remove(key) del self._dict[key] def __repr__(self): return '%s([%s])' % (self.__class__.__name__, ', '.join( ['(%r, %r)' % (key, self[key]) for key in self._list])) def __setitem__(self, key, value): if key not in self._dict: self._list.append(key) self._dict[key] = value def __getitem__(self, key): if key in self._dict: return self._dict[key] else: return self._list[key] def __len__(self): return len(self._list) def copy(self): return LastUpdatedOrderedDict(self) def keys(self): return self._list[:] def values(self): return [ self[key] for key in self._list ] def setdefault(self, key, value=None): if key in self: return self[key] else: self[key] = value return value PK[ !site-packages/firewall/client.pyonu[ c`c@s^ddlmZmZddlZeejded7Z?ed8Z@ed9ZAed:ZBed;ZCed<ZDed=ZEed>ZFed?ZGed@ZHRS(BcCsO|r||_n9dddttgggtggggggtg|_dS(Nt(tsettingsR R(tselfR#((s3/usr/lib/python2.7/site-packages/firewall/client.pyt__init__Vs cCsd|j|jfS(Ns%s(%r)(t __class__R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyt__repr__^scCs |jdS(Ni(R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getVersionbscCs||jdR?R@RBRERFRGRHRJRKRLRMRNRORPRQRRRSRURWRXRYRZR\tslipR tpolkitt enable_proxyR]R^R_R`RbRcRdReRfRgRkRlRmRnRpRrRsRtRuRwRyRzR{R|RRRR(((s3/usr/lib/python2.7/site-packages/firewall/client.pyR!Us        tFirewallClientConfigZonecBsceZdZejjjedZejjjedZ ejjjedZ ejjjedZ ejjjedZ ejjjedZ ejjjedZejjjedZejjjed Zejjjed Zejjjed Zejjjed Zejjjed ZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZ ejjjedZ!ejjjedZ"ejjjedZ#ejjjedZ$ejjjedZ%ejjjedZ&ejjjed Z'ejjjed!Z(ejjjed"Z)ejjjed#Z*ejjjed$Z+ejjjed%Z,ejjjed&Z-ejjjed'Z.ejjjed(Z/ejjjed)Z0ejjjed*Z1ejjjed+Z2ejjjed,Z3ejjjed-Z4ejjjed.Z5ejjjed/Z6ejjjed0Z7ejjjed1Z8ejjjed2Z9ejjjed3Z:ejjjed4Z;ejjjed5Z<ejjjed6Z=ejjjed7Z>ejjjed8Z?ejjjed9Z@ejjjed:ZAejjjed;ZBejjjed<ZCejjjed=ZDejjjed>ZEejjjed?ZFejjjed@ZGejjjedAZHejjjedBZIejjjedCZJejjjedDZKejjjedEZLejjjedFZMejjjedGZNRS(HcCsp||_||_|jjtjj||_tj|jdtjj|_ tj|jdd|_ dS(Ntdbus_interfacesorg.freedesktop.DBus.Properties( tbustpatht get_objectRR tDBUS_INTERFACEtdbus_objt InterfacetDBUS_INTERFACE_CONFIG_ZONEtfw_zonet fw_properties(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR%s   cCst|jjtjj|S(N(RRtGetRR R(R$tprop((s3/usr/lib/python2.7/site-packages/firewall/client.pyt get_propertys cCst|jjtjjS(N(RRtGetAllRR R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytget_propertiess cCs |jjtjj||dS(N(RtSetRR R(R$Rtvalue((s3/usr/lib/python2.7/site-packages/firewall/client.pyt set_propertyscCsttt|jjS(N(R!tlistRRt getSettings(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRs cCs|jjt|jdS(N(RtupdatettupleR#(R$R#((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs|jjdS(N(Rt loadDefaults(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs|jjdS(N(RR<(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR<scCs|jj|dS(N(Rtrename(R$tname((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs |jjS(N(RR((R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR(scCs|jj|dS(N(RR*(R$R)((s3/usr/lib/python2.7/site-packages/firewall/client.pyR*scCs |jjS(N(RR+(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR+scCs|jj|dS(N(RR-(R$R,((s3/usr/lib/python2.7/site-packages/firewall/client.pyR-scCs |jjS(N(RR.(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR.scCs|jj|dS(N(RR0(R$R/((s3/usr/lib/python2.7/site-packages/firewall/client.pyR0scCs |jjS(N(RR2(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR2scCs|jj|dS(N(RR4(R$R3((s3/usr/lib/python2.7/site-packages/firewall/client.pyR4scCs |jjS(N(RR5(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR5scCs|jj|dS(N(RR7(R$R6((s3/usr/lib/python2.7/site-packages/firewall/client.pyR7scCs|jj|dS(N(RR;(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR;scCs|jj|dS(N(RR>(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR> scCs|jj|S(N(RR?(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR?scCs |jjS(N(RR@(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR@scCs|jj|dS(N(RRB(R$RA((s3/usr/lib/python2.7/site-packages/firewall/client.pyRBscCs|jj||dS(N(RRE(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRE!scCs|jj||dS(N(RRF(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF&scCs|jj||S(N(RRG(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRG+scCs |jjS(N(RRH(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRH2scCs|jj|dS(N(RRJ(R$RI((s3/usr/lib/python2.7/site-packages/firewall/client.pyRJ7scCs|jj|dS(N(RRK(R$RD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRK<scCs|jj|dS(N(RRL(R$RD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRLAscCs|jj|S(N(RRM(R$RD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRMFscCs |jjS(N(RRN(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRNMscCs|jj|dS(N(RRO(R$RA((s3/usr/lib/python2.7/site-packages/firewall/client.pyRORscCs|jj||dS(N(RRP(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRPWscCs|jj||dS(N(RRQ(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRQ\scCs|jj||S(N(RRR(R$RCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRRascCs |jjS(N(RRS(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRShscCs|jj|dS(N(RRU(R$t icmptypes((s3/usr/lib/python2.7/site-packages/firewall/client.pyRUmscCs|jj|dS(N(RRW(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyRWrscCs|jj|dS(N(RRX(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyRXwscCs|jj|S(N(RRY(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyRY|scCs |jjS(N(RRZ(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRZscCs|jj|dS(N(RR\(R$t inversion((s3/usr/lib/python2.7/site-packages/firewall/client.pyR\scCs|jjdS(N(RR](R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR]scCs|jjdS(N(RR^(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR^scCs |jjS(N(RR_(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR_scCs |jjS(N(RR`(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR`scCs|jj|dS(N(RRb(R$Ra((s3/usr/lib/python2.7/site-packages/firewall/client.pyRbscCs|jjdS(N(RRc(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRcscCs|jjdS(N(RRd(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRdscCs |jjS(N(RRe(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRescCs |jjS(N(RRf(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRfscCs|jj|dS(N(RRg(R$RA((s3/usr/lib/python2.7/site-packages/firewall/client.pyRgscCsG|dkrd}n|dkr*d}n|jj||||dS(NR"(RhRRk(R$RCRDttoportttoaddr((s3/usr/lib/python2.7/site-packages/firewall/client.pyRks     cCsG|dkrd}n|dkr*d}n|jj||||dS(NR"(RhRRl(R$RCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRls     cCsC|dkrd}n|dkr*d}n|jj||||S(NR"(RhRRm(R$RCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRms     cCs |jjS(N(RRn(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRnscCs|jj|dS(N(RRp(R$Ro((s3/usr/lib/python2.7/site-packages/firewall/client.pyRpscCs|jj|dS(N(RRr(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRrscCs|jj|dS(N(RRs(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRsscCs|jj|S(N(RRt(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRtscCs |jjS(N(RRu(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRuscCs|jj|dS(N(RRw(R$Rv((s3/usr/lib/python2.7/site-packages/firewall/client.pyRwscCs|jj|dS(N(RRy(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRyscCs|jj|dS(N(RRz(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRz scCs|jj|S(N(RR{(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyR{scCs |jjS(N(RR|(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR|scCs|jj|dS(N(RR(R$R~((s3/usr/lib/python2.7/site-packages/firewall/client.pyRscCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR%scCs|jj|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR*s(ORRR%RR RRR RRRRRRR<RR(R*R+R-R.R0R2R4R5R7R;R>R?R@RBRERFRGRHRJRKRLRMRNRORPRQRRRSRURWRXRYRZR\R]R^R_R`RbRcRdReRfRgRkRlRmRnRpRrRsRtRuRwRyRzR{R|RRRR(((s3/usr/lib/python2.7/site-packages/firewall/client.pyRs                                                                       tFirewallClientServiceSettingscBseZed!dZedZedZedZedZedZ edZ edZ edZ ed Z ed Zed Zed Zed ZedZedZedZedZedZedZedZedZedZedZedZedZedZedZedZ edZ!edZ"ed!dZ#ed Z$RS("cCs7|r||_n!dddggiggg|_dS(NR"(R#(R$R#((s3/usr/lib/python2.7/site-packages/firewall/client.pyR%3s cCsd|j|jfS(Ns%s(%r)(R&R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR':scCs |jdS(Ni(R#(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR(>scCs||jd||jd|||jd|scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetIPSetscCs(t|jj|}t|j|S(N(RR:tgetIPSetByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR@scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(t isinstanceRR:taddIPSetRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRB s!cCst|jjS(N(RR:t getZoneNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRC scCst|jjS(N(RR:t listZones(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRD scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetZone scCs(t|jj|}t|j|S(N(RR:t getZoneByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF scCst|jj|S(N(RR:tgetZoneOfInterface(R$tiface((s3/usr/lib/python2.7/site-packages/firewall/client.pyRG$ scCst|jj|S(N(RR:tgetZoneOfSource(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRI) scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RAR!R:taddZoneRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRJ. s!cCst|jjS(N(RR:tgetServiceNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRK9 scCst|jjS(N(RR:t listServices(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRL> scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getServiceC scCs(t|jj|}t|j|S(N(RR:tgetServiceByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRNH scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RARR:R;RR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR;N s!cCst|jjS(N(RR:tgetIcmpTypeNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyROY scCst|jjS(N(RR:t listIcmpTypes(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRP^ scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getIcmpTypec scCs(t|jj|}t|j|S(N(RR:tgetIcmpTypeByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRRh scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RARR:t addIcmpTypeRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRSn s!cCs|jS(N(R;(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytpoliciesw scCs|jS(N(R<(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytdirect| scCst|jjS(N(RR:tgetHelperNames(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRV scCst|jjS(N(RR:t listHelpers(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRW scCst|j|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyt getHelper scCs(t|jj|}t|j|S(N(RR:tgetHelperByNameRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRY scCs[t|tr0|jj|t|j}n|jj|t|}t|j|S(N(RARR:t addHelperRR#RR(R$RR#R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRZ s!((RRR R%RR RRRRRR=R>R?R@RBRCRDRERFRGRIRJRKRLRMRNR;RORPRQRRRSRTRURVRWRXRYRZ(((s3/usr/lib/python2.7/site-packages/firewall/client.pyR8s                                tFirewallClientcBseZeddedZedZedZedZedZ edZ edZ edZ ed Z ed Zed Zejjjed Zejjjed ZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZejjjedZ ejjjedZ!ejjjedZ"ejjjedZ#ejjjedZ$ejjjedZ%ejjjedZ&ejjjedZ'ejjjed Z(ejjjed!Z)ejjjed"Z*ejjjed#Z+ejjjed$Z,ejjjed%Z-ejjjed&Z.ejjjed'Z/ejjjed(Z0ejjjed)Z1ejjjed*Z2ejjjed+Z3ejjjed,Z4ejjjed-Z5ejjjed.Z6ejjjed/Z7ejjjed0Z8ejjjed1Z9ejjjed2Z:ejjjed3Z;ejjjed4Z<ejjjed5Z=ejjjed6Z>ejjjed7Z?ejjjed8Z@ejjjed9ZAejjjed:ZBejjjedd;ZCejjjed<ZDejjjed=ZEejjjed>ZFejjjedd?ZGejjjed@ZHejjjedAZIejjjedBZJejjjeddCZKejjjedDZLejjjedEZMejjjedFZNejjjeddGZOejjjedHZPejjjedIZQejjjedJZRejjjeddKZSejjjedLZTejjjedMZUejjjeddNZVejjjedOZWejjjedPZXejjjedQZYejjjeddRZZejjjedSZ[ejjjedTZ\ejjjedUZ]ejjjeddVZ^ejjjedWZ_ejjjedXZ`ejjjedYZaejjjedZZbejjjed[Zcejjjed\Zdejjjed]Zeejjjed^Zfejjjed_Zgejjjed`ZhejjjedaZiejjjedbZjejjjedcZkejjjeddZlejjjedeZmejjjedfZnejjjedgZoejjjedhZpejjjediZqejjjedjZrejjjedkZsejjjedlZtejjjedmZuejjjednZvejjjedoZwejjjedpZxejjjedqZyejjjedrZzejjjedsZ{ejjjedtZ|ejjjeduZ}ejjjedvZ~ejjjedwZejjjedxZejjjedyZejjjedzZejjjed{Zejjjed|Zejjjed}Zejjjed~ZejjjedZejjjedZejjjedZejjjedZRS(ic Cs|stjjjdty"tjj|_d|j_ Wqt k rytj|_Wn1tj j k r}t tj|jqXdGHqXn ||_|jjd|jdddddtjjxtjjtjjtjjtjjtjjtjjtjjtjjtjjtjjtjjtjjtjj g D]1}|jj|j!d|d d d d d dqTWi|_"iIdd6dd6dd6dd6dd6dd6dd6dd6dd6dd6d d!6d"d#6d$d%6d&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6dDdE6dDdF6dGdH6dIdJ6dKdL6dMdN6dOdP6dQdR6dSdT6dUdV6dWdX6dYdZ6d[d\6d]d^6d_d`6dadb6dcdd6dedf6dgdh6didj6dkdl6dmdn6dodp6dqdr6dsdt6dudv6dwdx6dydz6d{d|6d}d~6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd6|_#|j$||_%|dkrt&j'||j(n |j(dS(Ntset_as_defaultsNot using slip.dbusthandler_functiont signal_nametNameOwnerChangedRsorg.freedesktop.DBustarg0tinterface_keywordRqtmember_keywordtmembert path_keywordRsconnection-changedsconnection-establishedsconnection-losttLogDeniedChangedslog-denied-changedtDefaultZoneChangedsdefault-zone-changedtPanicModeEnabledspanic-mode-enabledtPanicModeDisabledspanic-mode-disabledtReloadedtreloadedt ServiceAddeds service-addedtServiceRemovedsservice-removedt PortAddeds port-addedt PortRemoveds port-removedtSourcePortAddedssource-port-addedtSourcePortRemovedssource-port-removedt ProtocolAddedsprotocol-addedtProtocolRemovedsprotocol-removedtMasqueradeAddedsmasquerade-addedtMasqueradeRemovedsmasquerade-removedtForwardPortAddedsforward-port-addedtForwardPortRemovedsforward-port-removedtIcmpBlockAddedsicmp-block-addedtIcmpBlockRemovedsicmp-block-removedtIcmpBlockInversionAddedsicmp-block-inversion-addedtIcmpBlockInversionRemovedsicmp-block-inversion-removedt RichRuleAddedsrichrule-addedtRichRuleRemovedsrichrule-removedtInterfaceAddedsinterface-addedtInterfaceRemovedsinterface-removedtZoneOfInterfaceChangeds zone-changedszone-of-interface-changedt SourceAddeds source-addedt SourceRemovedssource-removedtZoneOfSourceChangedszone-of-source-changedt EntryAddedsipset-entry-addedt EntryRemovedsipset-entry-removedt ChainAddedsdirect:chain-addedt ChainRemovedsdirect:chain-removedt RuleAddedsdirect:rule-addedt RuleRemovedsdirect:rule-removedtPassthroughAddedsdirect:passthrough-addedtPassthroughRemovedsdirect:passthrough-removedsconfig:direct:Updatedsconfig:direct:updatedtLockdownEnabledslockdown-enabledtLockdownDisabledslockdown-disabledtLockdownWhitelistCommandAddeds lockdown-whitelist-command-addedtLockdownWhitelistCommandRemoveds"lockdown-whitelist-command-removedtLockdownWhitelistContextAddeds lockdown-whitelist-context-addedtLockdownWhitelistContextRemoveds"lockdown-whitelist-context-removedtLockdownWhitelistUidAddedslockdown-whitelist-uid-addedtLockdownWhitelistUidRemovedslockdown-whitelist-uid-removedtLockdownWhitelistUserAddedslockdown-whitelist-user-addedtLockdownWhitelistUserRemovedslockdown-whitelist-user-removeds(config:policies:LockdownWhitelistUpdateds*config:policies:lockdown-whitelist-updatedsconfig:IPSetAddedsconfig:ipset-addedsconfig:IPSetUpdatedsconfig:ipset-updatedsconfig:IPSetRemovedsconfig:ipset-removedsconfig:IPSetRenamedsconfig:ipset-renamedsconfig:ZoneAddedsconfig:zone-addedsconfig:ZoneUpdatedsconfig:zone-updatedsconfig:ZoneRemovedsconfig:zone-removedsconfig:ZoneRenamedsconfig:zone-renamedsconfig:ServiceAddedsconfig:service-addedsconfig:ServiceUpdatedsconfig:service-updatedsconfig:ServiceRemovedsconfig:service-removedsconfig:ServiceRenamedsconfig:service-renamedsconfig:IcmpTypeAddedsconfig:icmptype-addedsconfig:IcmpTypeUpdatedsconfig:icmptype-updatedsconfig:IcmpTypeRemovedsconfig:icmptype-removedsconfig:IcmpTypeRenamedsconfig:icmptype-renamedsconfig:HelperAddedsconfig:helper-addedsconfig:HelperUpdatedsconfig:helper-updatedsconfig:HelperRemovedsconfig:helper-removedsconfig:HelperRenamedsconfig:helper-renamedi()R tmainlooptglibt DBusGMainLoopRRt SystemBusRRhtdefault_timeoutRRRR R t DBUS_ERRORRtadd_signal_receivert_dbus_connection_changedRRtDBUS_INTERFACE_IPSETtDBUS_INTERFACE_ZONEtDBUS_INTERFACE_DIRECTtDBUS_INTERFACE_POLICIESR9RRRRR6RRt_signal_receivert _callbackt _callbackst _init_varstquietRttimeout_add_secondst_connection_established(R$RtwaitRRRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyR% s                         cCsLd|_d|_d|_d|_d|_d|_d|_t|_ dS(N( RhtfwRRRR7Rt_configR t connected(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR. s       cCstS(N(R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetExceptionHandler9 scCs |adS(N(R(R$thandler((s3/usr/lib/python2.7/site-packages/firewall/client.pytsetExceptionHandler= scCstS(N(R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytgetNotAuthorizedLoopB scCs |adS(N(R(R$tenable((s3/usr/lib/python2.7/site-packages/firewall/client.pytsetNotAuthorizedLoopF scGs@||jkr,||f|j|j|      cCsF|j|jdddtjj|jdddtjjdS(NRcsconnection-lostRqsconnection-changed(RRRR R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s   c Osd|ksd|krdS|d}|d}|jtjjrRd|}n|jtjjrtd|}n|jtjjrd|}n|jtjjrd|}n|jtjjrd|}n]|tjjkrd|}n>|tjj krd |}n|tjj kr7d |}nd}xQ|j D]F}|j ||krG|j ||j krG|j |j |}qGqGW|dkrdSg|D]}t|^q}y0|d r|j|d n|d |Wntk r } | GHnXdS( NRcRqs config:Zones config:IPSetsconfig:Servicesconfig:IcmpTypes config:Helpersconfig:sconfig:policies:sconfig:direct:ii(t startswithRR RRRRRR9RR6RhRRRtextendR( R$RRtsignalRqtcbRtargtcb_argstmsg((s3/usr/lib/python2.7/site-packages/firewall/client.pyR sD            cCs|jS(N(R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(Rtreload(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtcompleteReload(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pytcomplete_reload scCs|jjdS(N(RtruntimeToPermanent(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtcheckPermanentConfig(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjtjj|S(N(RRRRR R(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCst|jjtjjS(N(RRRRR R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCs |jjtjj||dS(N(RRRR R(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtenablePanicMode(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtdisablePanicMode(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RRtqueryPanicMode(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs"ttt|jj|S(N(R!RRRtgetZoneSettings(R$tzone((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCst|jjS(N(RRt getIPSets(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs"ttt|jj|S(N(RRRRtgetIPSetSettings(R$tipset((s3/usr/lib/python2.7/site-packages/firewall/client.pyR s cCs|jj||dS(N(RR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj|S(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj||S(N(RR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj||dS(N(RR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj||S(N(RRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RRRL(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRL scCs"ttt|jj|S(N(RRRRtgetServiceSettings(R$R:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR# s cCst|jjS(N(RRRP(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRP) scCs"ttt|jj|S(N(RRRRtgetIcmpTypeSettings(R$RV((s3/usr/lib/python2.7/site-packages/firewall/client.pyR. s cCst|jjS(N(RRt getHelpers(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR4 scCs"ttt|jj|S(N(RRRRtgetHelperSettings(R$thelper((s3/usr/lib/python2.7/site-packages/firewall/client.pyR9 s cCst|jjS(N(RRtgetAutomaticHelpers(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRA scCs|jj|dS(N(RtsetAutomaticHelpers(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF scCst|jjS(N(RRt getLogDenied(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRM scCs|jj|dS(N(Rt setLogDenied(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRR scCst|jjS(N(RRtgetDefaultZone(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRY scCs|jj|dS(N(RtsetDefaultZone(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR^ scCst|jjS(N(RRtgetZones(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRe scCst|jjS(N(RRtgetActiveZones(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRj scCst|jj|S(N(RRRG(R$Rq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRGo scCst|jj|S(N(RRRI(R$Rx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRIt scCst|jj|S(N(RRt isImmutable(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRy scCst|jj||S(N(RRRr(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRr scCst|jj||S(N(RRt changeZone(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj||S(N(RRtchangeZoneOfInterface(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRRn(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRn scCst|jj||S(N(RRRt(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRt scCst|jj||S(N(RRRs(R$RRq((s3/usr/lib/python2.7/site-packages/firewall/client.pyRs scCst|jj||S(N(RRRy(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRy scCst|jj||S(N(RRtchangeZoneOfSource(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRRu(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRu scCst|jj||S(N(RRR{(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyR{ scCst|jj||S(N(RRRz(R$RRx((s3/usr/lib/python2.7/site-packages/firewall/client.pyRz scCst|jj|||S(N(RRR(R$RRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRR|(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR| scCst|jj||S(N(RRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj||S(N(RRR(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|||S(N(RRR;(R$RR:R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR; scCst|jj|S(N(RRR5(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR5 scCst|jj||S(N(RRR?(R$RR:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR? scCst|jj||S(N(RRR>(R$RR:((s3/usr/lib/python2.7/site-packages/firewall/client.pyR> scCst|jj||||S(N(RRRE(R$RRCRDR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRE scCst|jj|S(N(RRR@(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR@ scCst|jj|||S(N(RRRG(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRG scCst|jj|||S(N(RRRF(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRF scCst|jj|||S(N(RRRK(R$RRDR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRK scCst|jj|S(N(RRRH(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRH scCst|jj||S(N(RRRM(R$RRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRM scCst|jj||S(N(RRRL(R$RRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRL scCst|jj||S(N(RRRc(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRc scCst|jj|S(N(RRRe(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRe scCst|jj|S(N(RRRd(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRd scCsO|dkrd}n|dkr*d}nt|jj||||||S(NR"(RhRRRk(R$RRCRDRRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRk% s    cCst|jj|S(N(RRRf(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRf1 scCsL|dkrd}n|dkr*d}nt|jj|||||S(NR"(RhRRRm(R$RRCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRm6 s    cCsL|dkrd}n|dkr*d}nt|jj|||||S(NR"(RhRRRl(R$RRCRDRR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRlA s    cCst|jj||||S(N(RRRP(R$RRCRDR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRPN scCst|jj|S(N(RRRN(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRNT scCst|jj|||S(N(RRRR(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRRY scCst|jj|||S(N(RRRQ(R$RRCRD((s3/usr/lib/python2.7/site-packages/firewall/client.pyRQ^ scCst|jj|||S(N(RRRW(R$RticmpR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRWf scCst|jj|S(N(RRRS(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRSk scCst|jj||S(N(RRRY(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRYp scCst|jj||S(N(RRRX(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyRXu scCst|jj|S(N(RRR](R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR]| scCst|jj|S(N(RRR_(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR_ scCst|jj|S(N(RRR^(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR^ scCs|jj|||dS(N(R7R"(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR" scCs|jj|||dS(N(R7R#(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR# scCst|jj|||S(N(RR7R$(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR$ scCst|jj||S(N(RR7R(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RR7R(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs |jj|||||dS(N(R7R)(R$RRR R(R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR) scCs |jj|||||dS(N(R7R*(R$RRR R(R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR* scCs|jj|||dS(N(R7R+(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR+ scCs"t|jj|||||S(N(RR7R,(R$RRR R(R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR, scCst|jj|||S(N(RR7R&(R$RRR ((s3/usr/lib/python2.7/site-packages/firewall/client.pyR& scCst|jjS(N(RR7R%(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR% scCst|jj||S(N(RR7t passthrough(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RR7R-(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR- scCs|jjdS(N(R7R0(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR0 scCst|jj|S(N(RR7R1(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR1 scCs|jj||dS(N(R7R2(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR2 scCs|jj||dS(N(R7R3(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR3 scCst|jj||S(N(RR7R4(R$RR((s3/usr/lib/python2.7/site-packages/firewall/client.pyR4 scCs|jjdS(N(RtenableLockdown(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jjdS(N(RtdisableLockdown(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jjS(N(RRt queryLockdown(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCs|jj|dS(N(RR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCst|jjS(N(RRR (R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCst|jj|S(N(RRR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCs|jj|dS(N(RR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCs|jj|dS(N(RR (R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR  scCst|jjS(N(RRR(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR scCst|jj|S(N(RRR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR" scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR' scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR. scCst|jjS(N(RRR(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyR3 scCst|jj|S(N(RRR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR8 scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyR= scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRD scCst|jjS(N(RRR(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRI scCst|jj|S(N(RRR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRN scCs|jj|dS(N(RR(R$R((s3/usr/lib/python2.7/site-packages/firewall/client.pyRS scCs|jjdS(s( Authorize once for all polkit actions. N(Rt authorizeAll(R$((s3/usr/lib/python2.7/site-packages/firewall/client.pyRX sN(RRR RhRR%RRRRRRRRRRRR RRRRRRRRRRRRRRRRRRRRRRLRRPRRRRRRRRRRRRGRIRRrRRRnRtRsRyRRuR{RzRR|RRR;R5R?R>RER@RGRFRKRHRMRLRcReRdRkRfRmRlRPRNRRRQRWRSRYRXR]R_R^R"R#R$RRR)R*R+R,R&R%RR-R0R1R2R3R4RRRR R R R R RRRRRRRRRRRR(((s3/usr/lib/python2.7/site-packages/firewall/client.pyR[ s  #.                                                                                                                       (.t gi.repositoryRRtsysRtdbus.mainloop.glibR t slip.dbusRRtfirewallRtfirewall.core.baseRtfirewall.dbus_utilsRtfirewall.functionsRtfirewall.core.richRR tfirewall.errorsR RRhRR RR tobjectR!RRRRRRRRRRRRR5R8R[(((s3/usr/lib/python2.7/site-packages/firewall/client.pytsF      '=cyKCzVtbmPK[9ÊKK"site-packages/firewall/command.pyonu[ c`c@sdZdgZddlZddlmZddlmZddlmZddl m Z m Z m Z m Z mZdefdYZdS( s<FirewallCommand class for command line client simplificationtFirewallCommandiN(terrors(t FirewallError(t DBusException(t checkIPnMaskt checkIP6nMaskt check_mact check_porttcheck_single_addresscBseZeedZdZdZdZdZdZd+dZ d+dZ d+dZ d+d d Z d+d Zd+d Zd+d+ed ZedZedZedZedZedZd+edZedZedZdZddZedZdZdZdZdZdZ dZ!d+gd Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,RS(,cCs(||_||_t|_d|_dS(N(tquiettverbosetTruet'_FirewallCommand__use_exception_handlertNonetfw(tselfR R ((s4/usr/lib/python2.7/site-packages/firewall/command.pyt__init__#s   cCs ||_dS(N(R(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytset_fw)scCs ||_dS(N(R (Rtflag((s4/usr/lib/python2.7/site-packages/firewall/command.pyt set_quiet,scCs|jS(N(R (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyt get_quiet/scCs ||_dS(N(R (RR((s4/usr/lib/python2.7/site-packages/firewall/command.pyt set_verbose2scCs|jS(N(R (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyt get_verbose5scCs1|dk r-|j r-tjj|dndS(Ns (R R tsyststdouttwrite(Rtmsg((s4/usr/lib/python2.7/site-packages/firewall/command.pyt print_msg8scCs1|dk r-|j r-tjj|dndS(Ns (R R RtstderrR(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_error_msg<scCs=d}d}tjjr,|||}n|j|dS(Nss(RRtisattyR(RRtFAILtEND((s4/usr/lib/python2.7/site-packages/firewall/command.pyt print_warning@s icCs:|dkr|j|n |j|tj|dS(Ni(R!RRtexit(RRt exit_code((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_and_exitGs  cCs|j|ddS(Ni(R$(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytfailRscCs0|dk r,|jr,tjj|dndS(Ns (R R RRR(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_if_verboseUsc Cs1|jdk r|jjng} d} g} x|D]} |dk ry|| } Wqtk r}tjt|}t|dkr|jd|n|j d|||| kr| j |n| d7} q8qXn| j | q8Wx| D]} g}|dk r(||7}nt | t  rXt | t  rX|j | n || 7}|dk r{||7}n|jy||Wnttfk r}t |tr|j|j|j}n t|}tj|}|tjtjtjtjgkr$d}nt|dkrJ|jd|n5|dkrk|jd|dS|j d|||| kr| j |n| d7} nX|jqW| s-t|| ksd| krdSt| dkrtj| dq-t| dkr-tjtjq-ndS(Niis Warning: %ss Error: %s(RR t authorizeAllt ExceptionRtget_codetstrtlenR!R$tappendt isinstancetlistttupletdeactivate_exception_handlerRtfail_if_not_authorizedt get_dbus_nametget_dbus_messageRtALREADY_ENABLEDt NOT_ENABLEDtZONE_ALREADY_SETt ALREADY_SETtactivate_exception_handlerRR"t UNKNOWN_ERROR(Rtcmd_typetoptiont action_methodt query_methodt parse_methodtmessaget start_argstend_argstno_exittitemst_errorst _error_codestitemRtcodet call_item((s4/usr/lib/python2.7/site-packages/firewall/command.pyt__cmd_sequenceYsr                 c Cs&|jd|||||d|dS(NtaddRB(t_FirewallCommand__cmd_sequence(RR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pyt add_sequencesc Cs/|jd|||||d|gd|dS(NRJR@RB(RK(RtxR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytx_add_sequencesc Cs8|jd|||||d|gd|gd|dS(NRJR@RARB(RK( RtzoneR;R<R=R>R?ttimeoutRB((s4/usr/lib/python2.7/site-packages/firewall/command.pytzone_add_timeout_sequencesc Cs&|jd|||||d|dS(NtremoveRB(RK(RR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytremove_sequencesc Cs/|jd|||||d|gd|dS(NRRR@RB(RK(RRMR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytx_remove_sequencesc Cs|g}x|D]}|dk ry||}Wqtk r} t|dkrj|jd| q qtjt| } |jd| | qXn|j|q Wx|D]}g} |dk r| |7} nt |t  rt |t  r| j|n | |7} |j y|| } Wnt k r} |j| jtj| j} t|dkr|jd| jqq|jd| j| nbtk r} tjt| } t|dkr|jd| q|jd| | nX|jt|dkrQ|jd||d| fq|j| qW|sxtjdndS( Nis Warning: %ss Error: %ss%s: %stnotyesi(RUsyes(R R(R+R!RR)R*R$R,R-R.R/R0RR1R2R3R8Rtprint_query_resultRR"( RR;R=R>R?R@RBRCRFRRGRHtres((s4/usr/lib/python2.7/site-packages/firewall/command.pyt__query_sequencesR          "cCs |j||||d|dS(NRB(t _FirewallCommand__query_sequence(RR;R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytquery_sequencesc Cs)|j||||d|gd|dS(NR@RB(RZ(RRMR;R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytx_query_sequencescCsft| rbt| rbt| rb|jdoEt|dk rbttjd|n|S(Nsipset:is8'%s' is no valid IPv4, IPv6 or MAC address, nor an ipset(RRRt startswithR+RRt INVALID_ADDR(Rtvalue((s4/usr/lib/python2.7/site-packages/firewall/command.pyt parse_sources  " t/cCsy|j|\}}Wn'tk rBttjd|nXt|sdttj|n|dkrttjd|n||fS(NsTbad port (most likely missing protocol), correct syntax is portid[-portid]%sprotocolttcptudptsctptdccps''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}(RbRcRdRe(tsplitt ValueErrorRRt INVALID_PORTRtINVALID_PROTOCOL(RR_t separatortporttproto((s4/usr/lib/python2.7/site-packages/firewall/command.pyt parse_ports      c CsFd}d}d}d}d}x d||kr,||jddd}|t|d7}d||kr||jddd} n ||} |t| d7}|dkr| }q!|dkr| }q!|dkr| }q!|dkr| }q!|d kr|rq!ttjd |q!W|sHttjd n|scttjd n|pl|sttjd nt|sttj|n|dkrttjd|n|rt| rttj|n|r6t d| r6|st d| r6ttj |q6n||||fS(Nit=it:RkRlttoportttoaddrtifsinvalid forward port arg '%s's missing portsmissing protocolsmissing destinationRbRcRdRes''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}tipv4tipv6(stcpsudpssctpsdccp( R RfR+RRtINVALID_FORWARDRRhRiRR^( RR_tcompatRktprotocolRpRqtitopttval((s4/usr/lib/python2.7/site-packages/firewall/command.pytparse_forward_portsT               cCs_|jd}t|dkr/|ddfSt|dkrE|Sttjd|dS(NRniitisinvalid ipset option '%s'(RfR+RRtINVALID_OPTION(RR_targs((s4/usr/lib/python2.7/site-packages/firewall/command.pytparse_ipset_optionHs cCsDddg}||kr@ttjd|dj|fn|S(NRsRts'invalid argument: %s (choose from '%s')s', '(RRt INVALID_IPVtjoin(RR_tipvs((s4/usr/lib/python2.7/site-packages/firewall/command.pytcheck_destination_ipvRs    cCsUy|jdd\}}Wn#tk rAttjdnX|j||fS(NRois(destination syntax is ipv:address[/mask](RfRgRRtINVALID_DESTINATIONR(RR_tipvt destination((s4/usr/lib/python2.7/site-packages/firewall/command.pytparse_service_destinationZs    cCsGdddg}||krCttjd|dj|fn|S(NRsRttebs'invalid argument: %s (choose from '%s')s', '(RRRR(RR_R((s4/usr/lib/python2.7/site-packages/firewall/command.pyt check_ipvbs   cCsGdddg}||krCttjd|dj|fn|S(NR|RsRts'invalid argument: %s (choose from '%s')s', '(RRRR(RR_R((s4/usr/lib/python2.7/site-packages/firewall/command.pytcheck_helper_familyjs   cCsc|jds(ttjd|nt|jdddkr_ttjd|n|S(Nt nf_conntrack_s('%s' does not start with 'nf_conntrack_'R|isModule name '%s' too short(R]RRtINVALID_MODULER+treplace(RR_((s4/usr/lib/python2.7/site-packages/firewall/command.pyt check_modulers c Cs|j}|j}tt|j|}|j}|j} |j} |j} |j } |j } |j }|j }|j }|j}|j}g}|dk r||kr|jdqn|s|r|jdn|r%|ddj|}n|j||jr`|jd||jd|n|jd||jd|rd nd |jd d j||jd d j||jdd jt| |jdd jg| D]}d|d|df^q|jdd jt| |jd| rVd nd |jddjg| D](\}}}}d||||f^qt|jdd jg|D]}d|d|df^q|jdd j||jddj|dS(Ntdefaulttactives (%s)s, s summary: s description: s target: s icmp-block-inversion: %sRVRUs interfaces: t s sources: s services: s ports: s%s/%siis protocols: s masquerade: %ss forward-ports: s s$port=%s:proto=%s:toport=%s:toaddr=%ss source-ports: s icmp-blocks: s rich rules: (t getTargettgetIcmpBlockInversiontsortedtsett getInterfacest getSourcest getServicestgetPortst getProtocolst getMasqueradetgetForwardPortstgetSourcePortst getIcmpBlockst getRichRulestgetDescriptiontgetShortR R,RRR (RROtsettingst default_zonetextra_interfacesttargetticmp_block_inversiont interfacestsourcestservicestportst protocolst masqueradet forward_portst source_portst icmp_blockstrulest descriptiontshort_descriptiont attributesRkRlRpRq((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_zone_info|sX                    -   7  -c Cs|j}|j}|j}|j}|j}|j}|j} |j||jr|jd| |jd|n|jddj g|D]} d| d| df^q|jddj ||jd dj g|D]} d| d| df^q|jd dj ||jd dj g|j D]\} } d | | f^q]dS( Ns summary: s description: s ports: Rs%s/%siis protocols: s source-ports: s modules: s destination: s%s:%s( RRRt getModulesRtgetDestinationsRRR RRC( RtserviceRRRRtmodulesRt destinationsRRktktv((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_service_infos*         -  -  cCs|j}|j}|j}t|dkrEddg}n|j||jr|jd||jd|n|jddj|dS(NiRsRts summary: s description: s destination: R(RRRR+RR R(RticmptypeRRRR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_icmptype_infos     c Cs|j}|j}|j}|j}|j}|j||jrw|jd||jd|n|jd||jddjg|jD](\}} | rd|| fn|^q|jddj|dS(Ns summary: s description: s type: s options: Rs%s=%ss entries: ( tgetTypet getOptionst getEntriesRRRR RRC( RtipsetRt ipset_typetoptionstentriesRRRR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_ipset_infos       =c Cs|j}|j}|j}|j}|j}|j||jrw|jd||jd|n|jd||jd||jddjg|D]}d|d|d f^qdS( Ns summary: s description: s family: s module: s ports: Rs%s/%sii(Rt getModulet getFamilyRRRR R( RthelperRRtmoduletfamilyRRRk((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_helper_infos       cCs*|r|jdn|jdddS(NRVRUi(R$(RR_((s4/usr/lib/python2.7/site-packages/firewall/command.pyRWscCs|jsn|j|tjt|}|tjtjtjtj gkri|j d|n|j d||dS(Ns Warning: %ss Error: %s( R R1RR)R*RR4R5R6R7R!R$(Rtexception_messageRG((s4/usr/lib/python2.7/site-packages/firewall/command.pytexception_handlers  cCs,d|kr(d}|j|tjndS(NtNotAuthorizedExceptions`Authorization failed. Make sure polkit agent is running or run the application as superuser.(R$RtNOT_AUTHORIZED(RRR((s4/usr/lib/python2.7/site-packages/firewall/command.pyR1s cCs t|_dS(N(tFalseR (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyR0scCs t|_dS(N(R R (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyR8scCsg}t}t|}xu|D]m}|s2Pn|j}t|dks"|ddkrfq"n||kr"|j||j|q"q"W|j|S(Niit#t;(RR(RtopentstripR+R,RJtclose(RtfilenameRt entries_settftline((s4/usr/lib/python2.7/site-packages/firewall/command.pytget_ipset_entries_from_file s    "   N(-t__name__t __module__RRRRRRRR RRR!R$R%R&RKRLRNRQRSRTRZR[R\R`RmR{RRRRRRRRRRRRWRR1R0R8R(((s4/usr/lib/python2.7/site-packages/firewall/command.pyR"sT           J     2     2     1       (t__doc__t__all__RtfirewallRtfirewall.errorsRtdbus.exceptionsRtfirewall.functionsRRRRRtobjectR(((s4/usr/lib/python2.7/site-packages/firewall/command.pyts  (PK[9ÊKK"site-packages/firewall/command.pycnu[ c`c@sdZdgZddlZddlmZddlmZddlmZddl m Z m Z m Z m Z mZdefdYZdS( s<FirewallCommand class for command line client simplificationtFirewallCommandiN(terrors(t FirewallError(t DBusException(t checkIPnMaskt checkIP6nMaskt check_mact check_porttcheck_single_addresscBseZeedZdZdZdZdZdZd+dZ d+dZ d+dZ d+d d Z d+d Zd+d Zd+d+ed ZedZedZedZedZedZd+edZedZedZdZddZedZdZdZdZdZdZ dZ!d+gd Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,RS(,cCs(||_||_t|_d|_dS(N(tquiettverbosetTruet'_FirewallCommand__use_exception_handlertNonetfw(tselfR R ((s4/usr/lib/python2.7/site-packages/firewall/command.pyt__init__#s   cCs ||_dS(N(R(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytset_fw)scCs ||_dS(N(R (Rtflag((s4/usr/lib/python2.7/site-packages/firewall/command.pyt set_quiet,scCs|jS(N(R (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyt get_quiet/scCs ||_dS(N(R (RR((s4/usr/lib/python2.7/site-packages/firewall/command.pyt set_verbose2scCs|jS(N(R (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyt get_verbose5scCs1|dk r-|j r-tjj|dndS(Ns (R R tsyststdouttwrite(Rtmsg((s4/usr/lib/python2.7/site-packages/firewall/command.pyt print_msg8scCs1|dk r-|j r-tjj|dndS(Ns (R R RtstderrR(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_error_msg<scCs=d}d}tjjr,|||}n|j|dS(Nss(RRtisattyR(RRtFAILtEND((s4/usr/lib/python2.7/site-packages/firewall/command.pyt print_warning@s icCs:|dkr|j|n |j|tj|dS(Ni(R!RRtexit(RRt exit_code((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_and_exitGs  cCs|j|ddS(Ni(R$(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytfailRscCs0|dk r,|jr,tjj|dndS(Ns (R R RRR(RR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_if_verboseUsc Cs1|jdk r|jjng} d} g} x|D]} |dk ry|| } Wqtk r}tjt|}t|dkr|jd|n|j d|||| kr| j |n| d7} q8qXn| j | q8Wx| D]} g}|dk r(||7}nt | t  rXt | t  rX|j | n || 7}|dk r{||7}n|jy||Wnttfk r}t |tr|j|j|j}n t|}tj|}|tjtjtjtjgkr$d}nt|dkrJ|jd|n5|dkrk|jd|dS|j d|||| kr| j |n| d7} nX|jqW| s-t|| ksd| krdSt| dkrtj| dq-t| dkr-tjtjq-ndS(Niis Warning: %ss Error: %s(RR t authorizeAllt ExceptionRtget_codetstrtlenR!R$tappendt isinstancetlistttupletdeactivate_exception_handlerRtfail_if_not_authorizedt get_dbus_nametget_dbus_messageRtALREADY_ENABLEDt NOT_ENABLEDtZONE_ALREADY_SETt ALREADY_SETtactivate_exception_handlerRR"t UNKNOWN_ERROR(Rtcmd_typetoptiont action_methodt query_methodt parse_methodtmessaget start_argstend_argstno_exittitemst_errorst _error_codestitemRtcodet call_item((s4/usr/lib/python2.7/site-packages/firewall/command.pyt__cmd_sequenceYsr                 c Cs&|jd|||||d|dS(NtaddRB(t_FirewallCommand__cmd_sequence(RR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pyt add_sequencesc Cs/|jd|||||d|gd|dS(NRJR@RB(RK(RtxR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytx_add_sequencesc Cs8|jd|||||d|gd|gd|dS(NRJR@RARB(RK( RtzoneR;R<R=R>R?ttimeoutRB((s4/usr/lib/python2.7/site-packages/firewall/command.pytzone_add_timeout_sequencesc Cs&|jd|||||d|dS(NtremoveRB(RK(RR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytremove_sequencesc Cs/|jd|||||d|gd|dS(NRRR@RB(RK(RRMR;R<R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytx_remove_sequencesc Cs|g}x|D]}|dk ry||}Wqtk r} t|dkrj|jd| q qtjt| } |jd| | qXn|j|q Wx|D]}g} |dk r| |7} nt |t  rt |t  r| j|n | |7} |j y|| } Wnt k r} |j| jtj| j} t|dkr|jd| jqq|jd| j| nbtk r} tjt| } t|dkr|jd| q|jd| | nX|jt|dkrQ|jd||d| fq|j| qW|sxtjdndS( Nis Warning: %ss Error: %ss%s: %stnotyesi(RUsyes(R R(R+R!RR)R*R$R,R-R.R/R0RR1R2R3R8Rtprint_query_resultRR"( RR;R=R>R?R@RBRCRFRRGRHtres((s4/usr/lib/python2.7/site-packages/firewall/command.pyt__query_sequencesR          "cCs |j||||d|dS(NRB(t _FirewallCommand__query_sequence(RR;R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytquery_sequencesc Cs)|j||||d|gd|dS(NR@RB(RZ(RRMR;R=R>R?RB((s4/usr/lib/python2.7/site-packages/firewall/command.pytx_query_sequencescCsft| rbt| rbt| rb|jdoEt|dk rbttjd|n|S(Nsipset:is8'%s' is no valid IPv4, IPv6 or MAC address, nor an ipset(RRRt startswithR+RRt INVALID_ADDR(Rtvalue((s4/usr/lib/python2.7/site-packages/firewall/command.pyt parse_sources  " t/cCsy|j|\}}Wn'tk rBttjd|nXt|sdttj|n|dkrttjd|n||fS(NsTbad port (most likely missing protocol), correct syntax is portid[-portid]%sprotocolttcptudptsctptdccps''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}(RbRcRdRe(tsplitt ValueErrorRRt INVALID_PORTRtINVALID_PROTOCOL(RR_t separatortporttproto((s4/usr/lib/python2.7/site-packages/firewall/command.pyt parse_ports      c CsFd}d}d}d}d}x d||kr,||jddd}|t|d7}d||kr||jddd} n ||} |t| d7}|dkr| }q!|dkr| }q!|dkr| }q!|dkr| }q!|d kr|rq!ttjd |q!W|sHttjd n|scttjd n|pl|sttjd nt|sttj|n|dkrttjd|n|rt| rttj|n|r6t d| r6|st d| r6ttj |q6n||||fS(Nit=it:RkRlttoportttoaddrtifsinvalid forward port arg '%s's missing portsmissing protocolsmissing destinationRbRcRdRes''%s' not in {'tcp'|'udp'|'sctp'|'dccp'}tipv4tipv6(stcpsudpssctpsdccp( R RfR+RRtINVALID_FORWARDRRhRiRR^( RR_tcompatRktprotocolRpRqtitopttval((s4/usr/lib/python2.7/site-packages/firewall/command.pytparse_forward_portsT               cCs_|jd}t|dkr/|ddfSt|dkrE|Sttjd|dS(NRniitisinvalid ipset option '%s'(RfR+RRtINVALID_OPTION(RR_targs((s4/usr/lib/python2.7/site-packages/firewall/command.pytparse_ipset_optionHs cCsDddg}||kr@ttjd|dj|fn|S(NRsRts'invalid argument: %s (choose from '%s')s', '(RRt INVALID_IPVtjoin(RR_tipvs((s4/usr/lib/python2.7/site-packages/firewall/command.pytcheck_destination_ipvRs    cCsUy|jdd\}}Wn#tk rAttjdnX|j||fS(NRois(destination syntax is ipv:address[/mask](RfRgRRtINVALID_DESTINATIONR(RR_tipvt destination((s4/usr/lib/python2.7/site-packages/firewall/command.pytparse_service_destinationZs    cCsGdddg}||krCttjd|dj|fn|S(NRsRttebs'invalid argument: %s (choose from '%s')s', '(RRRR(RR_R((s4/usr/lib/python2.7/site-packages/firewall/command.pyt check_ipvbs   cCsGdddg}||krCttjd|dj|fn|S(NR|RsRts'invalid argument: %s (choose from '%s')s', '(RRRR(RR_R((s4/usr/lib/python2.7/site-packages/firewall/command.pytcheck_helper_familyjs   cCsc|jds(ttjd|nt|jdddkr_ttjd|n|S(Nt nf_conntrack_s('%s' does not start with 'nf_conntrack_'R|isModule name '%s' too short(R]RRtINVALID_MODULER+treplace(RR_((s4/usr/lib/python2.7/site-packages/firewall/command.pyt check_modulers c Cs|j}|j}tt|j|}|j}|j} |j} |j} |j } |j } |j }|j }|j }|j}|j}g}|dk r||kr|jdqn|s|r|jdn|r%|ddj|}n|j||jr`|jd||jd|n|jd||jd|rd nd |jd d j||jd d j||jdd jt| |jdd jg| D]}d|d|df^q|jdd jt| |jd| rVd nd |jddjg| D](\}}}}d||||f^qt|jdd jg|D]}d|d|df^q|jdd j||jddj|dS(Ntdefaulttactives (%s)s, s summary: s description: s target: s icmp-block-inversion: %sRVRUs interfaces: t s sources: s services: s ports: s%s/%siis protocols: s masquerade: %ss forward-ports: s s$port=%s:proto=%s:toport=%s:toaddr=%ss source-ports: s icmp-blocks: s rich rules: (t getTargettgetIcmpBlockInversiontsortedtsett getInterfacest getSourcest getServicestgetPortst getProtocolst getMasqueradetgetForwardPortstgetSourcePortst getIcmpBlockst getRichRulestgetDescriptiontgetShortR R,RRR (RROtsettingst default_zonetextra_interfacesttargetticmp_block_inversiont interfacestsourcestservicestportst protocolst masqueradet forward_portst source_portst icmp_blockstrulest descriptiontshort_descriptiont attributesRkRlRpRq((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_zone_info|sX                    -   7  -c Cs|j}|j}|j}|j}|j}|j}|j} |j||jr|jd| |jd|n|jddj g|D]} d| d| df^q|jddj ||jd dj g|D]} d| d| df^q|jd dj ||jd dj g|j D]\} } d | | f^q]dS( Ns summary: s description: s ports: Rs%s/%siis protocols: s source-ports: s modules: s destination: s%s:%s( RRRt getModulesRtgetDestinationsRRR RRC( RtserviceRRRRtmodulesRt destinationsRRktktv((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_service_infos*         -  -  cCs|j}|j}|j}t|dkrEddg}n|j||jr|jd||jd|n|jddj|dS(NiRsRts summary: s description: s destination: R(RRRR+RR R(RticmptypeRRRR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_icmptype_infos     c Cs|j}|j}|j}|j}|j}|j||jrw|jd||jd|n|jd||jddjg|jD](\}} | rd|| fn|^q|jddj|dS(Ns summary: s description: s type: s options: Rs%s=%ss entries: ( tgetTypet getOptionst getEntriesRRRR RRC( RtipsetRt ipset_typetoptionstentriesRRRR((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_ipset_infos       =c Cs|j}|j}|j}|j}|j}|j||jrw|jd||jd|n|jd||jd||jddjg|D]}d|d|d f^qdS( Ns summary: s description: s family: s module: s ports: Rs%s/%sii(Rt getModulet getFamilyRRRR R( RthelperRRtmoduletfamilyRRRk((s4/usr/lib/python2.7/site-packages/firewall/command.pytprint_helper_infos       cCs*|r|jdn|jdddS(NRVRUi(R$(RR_((s4/usr/lib/python2.7/site-packages/firewall/command.pyRWscCs|jsn|j|tjt|}|tjtjtjtj gkri|j d|n|j d||dS(Ns Warning: %ss Error: %s( R R1RR)R*RR4R5R6R7R!R$(Rtexception_messageRG((s4/usr/lib/python2.7/site-packages/firewall/command.pytexception_handlers  cCs,d|kr(d}|j|tjndS(NtNotAuthorizedExceptions`Authorization failed. Make sure polkit agent is running or run the application as superuser.(R$RtNOT_AUTHORIZED(RRR((s4/usr/lib/python2.7/site-packages/firewall/command.pyR1s cCs t|_dS(N(tFalseR (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyR0scCs t|_dS(N(R R (R((s4/usr/lib/python2.7/site-packages/firewall/command.pyR8scCsg}t}t|}xu|D]m}|s2Pn|j}t|dks"|ddkrfq"n||kr"|j||j|q"q"W|j|S(Niit#t;(RR(RtopentstripR+R,RJtclose(RtfilenameRt entries_settftline((s4/usr/lib/python2.7/site-packages/firewall/command.pytget_ipset_entries_from_file s    "   N(-t__name__t __module__RRRRRRRR RRR!R$R%R&RKRLRNRQRSRTRZR[R\R`RmR{RRRRRRRRRRRRWRR1R0R8R(((s4/usr/lib/python2.7/site-packages/firewall/command.pyR"sT           J     2     2     1       (t__doc__t__all__RtfirewallRtfirewall.errorsRtdbus.exceptionsRtfirewall.functionsRRRRRtobjectR(((s4/usr/lib/python2.7/site-packages/firewall/command.pyts  (PK[ ɜ% % #site-packages/firewall/fw_types.pycnu[ c`c@s#dgZdefdYZdS(tLastUpdatedOrderedDictcBseZd dZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd d ZRS(cCs,i|_g|_|r(|j|ndS(N(t_dictt_listtupdate(tselftx((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyt__init__s  cCs|j2|jjdS(N(RRtclear(R((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyRscCs+x$|jD]\}}|||scCs t|S(N(R(R((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pytcopyAscCs|jS(N(R(R((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pytkeysDscCsg|jD]}||^q S(N(R(RR ((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pytvaluesGscCs&||kr||S|||<|SdS(N((RR R ((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyt setdefaultJs  N(Rt __module__tNoneRRRRR RRRRRRRR(((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyRs            N(t__all__tobjectR(((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyts PK[C] site-packages/firewall/errors.pynu[# -*- coding: utf-8 -*- # # Copyright (C) 2010-2012 Red Hat, Inc. # # Authors: # Thomas Woerner # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # ALREADY_ENABLED = 11 NOT_ENABLED = 12 COMMAND_FAILED = 13 NO_IPV6_NAT = 14 PANIC_MODE = 15 ZONE_ALREADY_SET = 16 UNKNOWN_INTERFACE = 17 ZONE_CONFLICT = 18 BUILTIN_CHAIN = 19 EBTABLES_NO_REJECT = 20 NOT_OVERLOADABLE = 21 NO_DEFAULTS = 22 BUILTIN_ZONE = 23 BUILTIN_SERVICE = 24 BUILTIN_ICMPTYPE = 25 NAME_CONFLICT = 26 NAME_MISMATCH = 27 PARSE_ERROR = 28 ACCESS_DENIED = 29 UNKNOWN_SOURCE = 30 RT_TO_PERM_FAILED = 31 IPSET_WITH_TIMEOUT = 32 BUILTIN_IPSET = 33 ALREADY_SET = 34 MISSING_IMPORT = 35 DBUS_ERROR = 36 BUILTIN_HELPER = 37 NOT_APPLIED = 38 INVALID_ACTION = 100 INVALID_SERVICE = 101 INVALID_PORT = 102 INVALID_PROTOCOL = 103 INVALID_INTERFACE = 104 INVALID_ADDR = 105 INVALID_FORWARD = 106 INVALID_ICMPTYPE = 107 INVALID_TABLE = 108 INVALID_CHAIN = 109 INVALID_TARGET = 110 INVALID_IPV = 111 INVALID_ZONE = 112 INVALID_PROPERTY = 113 INVALID_VALUE = 114 INVALID_OBJECT = 115 INVALID_NAME = 116 INVALID_FILENAME = 117 INVALID_DIRECTORY = 118 INVALID_TYPE = 119 INVALID_SETTING = 120 INVALID_DESTINATION = 121 INVALID_RULE = 122 INVALID_LIMIT = 123 INVALID_FAMILY = 124 INVALID_LOG_LEVEL = 125 INVALID_AUDIT_TYPE = 126 INVALID_MARK = 127 INVALID_CONTEXT = 128 INVALID_COMMAND = 129 INVALID_USER = 130 INVALID_UID = 131 INVALID_MODULE = 132 INVALID_PASSTHROUGH = 133 INVALID_MAC = 134 INVALID_IPSET = 135 INVALID_ENTRY = 136 INVALID_OPTION = 137 INVALID_HELPER = 138 MISSING_TABLE = 200 MISSING_CHAIN = 201 MISSING_PORT = 202 MISSING_PROTOCOL = 203 MISSING_ADDR = 204 MISSING_NAME = 205 MISSING_SETTING = 206 MISSING_FAMILY = 207 RUNNING_BUT_FAILED = 251 NOT_RUNNING = 252 NOT_AUTHORIZED = 253 UNKNOWN_ERROR = 254 import sys class FirewallError(Exception): def __init__(self, code, msg=None): self.code = code if msg is not None: # escape msg if needed if sys.version < '3': try: x = str(msg) # noqa: F841 except UnicodeEncodeError: msg = unicode(msg).encode("unicode_escape") # noqa: F821 self.msg = msg def __repr__(self): return '%s(%r, %r)' % (self.__class__, self.code, self.msg) def __str__(self): if self.msg: return "%s: %s" % (self.errors[self.code], self.msg) return self.errors[self.code] def get_code(msg): if ":" in msg: idx = msg.index(":") ecode = msg[:idx] else: ecode = msg try: code = FirewallError.codes[ecode] except KeyError: code = UNKNOWN_ERROR return code get_code = staticmethod(get_code) mod = sys.modules[FirewallError.__module__] FirewallError.errors = { getattr(mod,varname) : varname for varname in dir(mod) if not varname.startswith("_") and \ type(getattr(mod,varname)) == int } FirewallError.codes = { FirewallError.errors[code] : code for code in FirewallError.errors } PK[ ɜ% % #site-packages/firewall/fw_types.pyonu[ c`c@s#dgZdefdYZdS(tLastUpdatedOrderedDictcBseZd dZdZdZdZdZdZdZ dZ dZ d Z d Z d Zd d ZRS(cCs,i|_g|_|r(|j|ndS(N(t_dictt_listtupdate(tselftx((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyt__init__s  cCs|j2|jjdS(N(RRtclear(R((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyRscCs+x$|jD]\}}|||scCs t|S(N(R(R((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pytcopyAscCs|jS(N(R(R((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pytkeysDscCsg|jD]}||^q S(N(R(RR ((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pytvaluesGscCs&||kr||S|||<|SdS(N((RR R ((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyt setdefaultJs  N(Rt __module__tNoneRRRRR RRRRRRRR(((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyRs            N(t__all__tobjectR(((s5/usr/lib/python2.7/site-packages/firewall/fw_types.pyts PK[25site-packages/Babel-0.9.6-py2.7.egg-info/not-zip-safenu[ PK[6site-packages/Babel-0.9.6-py2.7.egg-info/top_level.txtnu[babel PK[@  9site-packages/Babel-0.9.6-py2.7.egg-info/entry_points.txtnu[ [console_scripts] pybabel = babel.messages.frontend:main [distutils.commands] compile_catalog = babel.messages.frontend:compile_catalog extract_messages = babel.messages.frontend:extract_messages init_catalog = babel.messages.frontend:init_catalog update_catalog = babel.messages.frontend:update_catalog [distutils.setup_keywords] message_extractors = babel.messages.frontend:check_message_extractors [babel.checkers] num_plurals = babel.messages.checkers:num_plurals python_format = babel.messages.checkers:python_format [babel.extractors] ignore = babel.messages.extract:extract_nothing python = babel.messages.extract:extract_python javascript = babel.messages.extract:extract_javascript PK[2=site-packages/Babel-0.9.6-py2.7.egg-info/dependency_links.txtnu[ PK[2L?L?4site-packages/Babel-0.9.6-py2.7.egg-info/SOURCES.txtnu[COPYING ChangeLog INSTALL.txt MANIFEST.in README.txt setup.cfg setup.py Babel.egg-info/PKG-INFO Babel.egg-info/SOURCES.txt Babel.egg-info/dependency_links.txt Babel.egg-info/entry_points.txt Babel.egg-info/not-zip-safe Babel.egg-info/top_level.txt babel/__init__.py babel/core.py babel/dates.py babel/global.dat babel/localedata.py babel/numbers.py babel/support.py babel/util.py babel/localedata/aa.dat babel/localedata/aa_DJ.dat babel/localedata/aa_ER.dat babel/localedata/aa_ER_SAAHO.dat babel/localedata/aa_ET.dat babel/localedata/af.dat babel/localedata/af_NA.dat babel/localedata/af_ZA.dat babel/localedata/ak.dat babel/localedata/ak_GH.dat babel/localedata/am.dat babel/localedata/am_ET.dat babel/localedata/ar.dat babel/localedata/ar_AE.dat babel/localedata/ar_BH.dat babel/localedata/ar_DZ.dat babel/localedata/ar_EG.dat babel/localedata/ar_IQ.dat babel/localedata/ar_JO.dat babel/localedata/ar_KW.dat babel/localedata/ar_LB.dat babel/localedata/ar_LY.dat babel/localedata/ar_MA.dat babel/localedata/ar_OM.dat babel/localedata/ar_QA.dat babel/localedata/ar_SA.dat babel/localedata/ar_SD.dat babel/localedata/ar_SY.dat babel/localedata/ar_TN.dat babel/localedata/ar_YE.dat babel/localedata/as.dat babel/localedata/as_IN.dat babel/localedata/az.dat babel/localedata/az_AZ.dat babel/localedata/az_Cyrl.dat babel/localedata/az_Cyrl_AZ.dat babel/localedata/az_Latn.dat babel/localedata/az_Latn_AZ.dat babel/localedata/be.dat babel/localedata/be_BY.dat babel/localedata/bg.dat babel/localedata/bg_BG.dat babel/localedata/bn.dat babel/localedata/bn_BD.dat babel/localedata/bn_IN.dat babel/localedata/bs.dat babel/localedata/bs_BA.dat babel/localedata/byn.dat babel/localedata/byn_ER.dat babel/localedata/ca.dat babel/localedata/ca_ES.dat babel/localedata/cch.dat babel/localedata/cch_NG.dat babel/localedata/cop.dat babel/localedata/cs.dat babel/localedata/cs_CZ.dat babel/localedata/cy.dat babel/localedata/cy_GB.dat babel/localedata/da.dat babel/localedata/da_DK.dat babel/localedata/de.dat babel/localedata/de_AT.dat babel/localedata/de_BE.dat babel/localedata/de_CH.dat babel/localedata/de_DE.dat babel/localedata/de_LI.dat babel/localedata/de_LU.dat babel/localedata/dv.dat babel/localedata/dv_MV.dat babel/localedata/dz.dat babel/localedata/dz_BT.dat babel/localedata/ee.dat babel/localedata/ee_GH.dat babel/localedata/ee_TG.dat babel/localedata/el.dat babel/localedata/el_CY.dat babel/localedata/el_GR.dat babel/localedata/el_POLYTON.dat babel/localedata/en.dat babel/localedata/en_AS.dat babel/localedata/en_AU.dat babel/localedata/en_BE.dat babel/localedata/en_BW.dat babel/localedata/en_BZ.dat babel/localedata/en_CA.dat babel/localedata/en_Dsrt.dat babel/localedata/en_Dsrt_US.dat babel/localedata/en_GB.dat babel/localedata/en_GU.dat babel/localedata/en_HK.dat babel/localedata/en_IE.dat babel/localedata/en_IN.dat babel/localedata/en_JM.dat babel/localedata/en_MH.dat babel/localedata/en_MP.dat babel/localedata/en_MT.dat babel/localedata/en_NA.dat babel/localedata/en_NZ.dat babel/localedata/en_PH.dat babel/localedata/en_PK.dat babel/localedata/en_SG.dat babel/localedata/en_Shaw.dat babel/localedata/en_TT.dat babel/localedata/en_UM.dat babel/localedata/en_US.dat babel/localedata/en_US_POSIX.dat babel/localedata/en_VI.dat babel/localedata/en_ZA.dat babel/localedata/en_ZW.dat babel/localedata/eo.dat babel/localedata/es.dat babel/localedata/es_AR.dat babel/localedata/es_BO.dat babel/localedata/es_CL.dat babel/localedata/es_CO.dat babel/localedata/es_CR.dat babel/localedata/es_DO.dat babel/localedata/es_EC.dat babel/localedata/es_ES.dat babel/localedata/es_GT.dat babel/localedata/es_HN.dat babel/localedata/es_MX.dat babel/localedata/es_NI.dat babel/localedata/es_PA.dat babel/localedata/es_PE.dat babel/localedata/es_PR.dat babel/localedata/es_PY.dat babel/localedata/es_SV.dat babel/localedata/es_US.dat babel/localedata/es_UY.dat babel/localedata/es_VE.dat babel/localedata/et.dat babel/localedata/et_EE.dat babel/localedata/eu.dat babel/localedata/eu_ES.dat babel/localedata/fa.dat babel/localedata/fa_AF.dat babel/localedata/fa_IR.dat babel/localedata/fi.dat babel/localedata/fi_FI.dat babel/localedata/fil.dat babel/localedata/fil_PH.dat babel/localedata/fo.dat babel/localedata/fo_FO.dat babel/localedata/fr.dat babel/localedata/fr_BE.dat babel/localedata/fr_CA.dat babel/localedata/fr_CH.dat babel/localedata/fr_FR.dat babel/localedata/fr_LU.dat babel/localedata/fr_MC.dat babel/localedata/fr_SN.dat babel/localedata/fur.dat babel/localedata/fur_IT.dat babel/localedata/ga.dat babel/localedata/ga_IE.dat babel/localedata/gaa.dat babel/localedata/gaa_GH.dat babel/localedata/gez.dat babel/localedata/gez_ER.dat babel/localedata/gez_ET.dat babel/localedata/gl.dat babel/localedata/gl_ES.dat babel/localedata/gu.dat babel/localedata/gu_IN.dat babel/localedata/gv.dat babel/localedata/gv_GB.dat babel/localedata/ha.dat babel/localedata/ha_Arab.dat babel/localedata/ha_Arab_NG.dat babel/localedata/ha_Arab_SD.dat babel/localedata/ha_GH.dat babel/localedata/ha_Latn.dat babel/localedata/ha_Latn_GH.dat babel/localedata/ha_Latn_NE.dat babel/localedata/ha_Latn_NG.dat babel/localedata/ha_NE.dat babel/localedata/ha_NG.dat babel/localedata/ha_SD.dat babel/localedata/haw.dat babel/localedata/haw_US.dat babel/localedata/he.dat babel/localedata/he_IL.dat babel/localedata/hi.dat babel/localedata/hi_IN.dat babel/localedata/hr.dat babel/localedata/hr_HR.dat babel/localedata/hu.dat babel/localedata/hu_HU.dat babel/localedata/hy.dat babel/localedata/hy_AM.dat babel/localedata/hy_AM_REVISED.dat babel/localedata/ia.dat babel/localedata/id.dat babel/localedata/id_ID.dat babel/localedata/ig.dat babel/localedata/ig_NG.dat babel/localedata/ii.dat babel/localedata/ii_CN.dat babel/localedata/in.dat babel/localedata/is.dat babel/localedata/is_IS.dat babel/localedata/it.dat babel/localedata/it_CH.dat babel/localedata/it_IT.dat babel/localedata/iu.dat babel/localedata/iw.dat babel/localedata/ja.dat babel/localedata/ja_JP.dat babel/localedata/ka.dat babel/localedata/ka_GE.dat babel/localedata/kaj.dat babel/localedata/kaj_NG.dat babel/localedata/kam.dat babel/localedata/kam_KE.dat babel/localedata/kcg.dat babel/localedata/kcg_NG.dat babel/localedata/kfo.dat babel/localedata/kfo_CI.dat babel/localedata/kk.dat babel/localedata/kk_Cyrl.dat babel/localedata/kk_Cyrl_KZ.dat babel/localedata/kk_KZ.dat babel/localedata/kl.dat babel/localedata/kl_GL.dat babel/localedata/km.dat babel/localedata/km_KH.dat babel/localedata/kn.dat babel/localedata/kn_IN.dat babel/localedata/ko.dat babel/localedata/ko_KR.dat babel/localedata/kok.dat babel/localedata/kok_IN.dat babel/localedata/kpe.dat babel/localedata/kpe_GN.dat babel/localedata/kpe_LR.dat babel/localedata/ku.dat babel/localedata/ku_Arab.dat babel/localedata/ku_Latn.dat babel/localedata/ku_Latn_TR.dat babel/localedata/ku_TR.dat babel/localedata/kw.dat babel/localedata/kw_GB.dat babel/localedata/ky.dat babel/localedata/ky_KG.dat babel/localedata/ln.dat babel/localedata/ln_CD.dat babel/localedata/ln_CG.dat babel/localedata/lo.dat babel/localedata/lo_LA.dat babel/localedata/lt.dat babel/localedata/lt_LT.dat babel/localedata/lv.dat babel/localedata/lv_LV.dat babel/localedata/mk.dat babel/localedata/mk_MK.dat babel/localedata/ml.dat babel/localedata/ml_IN.dat babel/localedata/mn.dat babel/localedata/mn_CN.dat babel/localedata/mn_Cyrl.dat babel/localedata/mn_Cyrl_MN.dat babel/localedata/mn_MN.dat babel/localedata/mn_Mong.dat babel/localedata/mn_Mong_CN.dat babel/localedata/mo.dat babel/localedata/mr.dat babel/localedata/mr_IN.dat babel/localedata/ms.dat babel/localedata/ms_BN.dat babel/localedata/ms_MY.dat babel/localedata/mt.dat babel/localedata/mt_MT.dat babel/localedata/my.dat babel/localedata/my_MM.dat babel/localedata/nb.dat babel/localedata/nb_NO.dat babel/localedata/ne.dat babel/localedata/ne_IN.dat babel/localedata/ne_NP.dat babel/localedata/nl.dat babel/localedata/nl_BE.dat babel/localedata/nl_NL.dat babel/localedata/nn.dat babel/localedata/nn_NO.dat babel/localedata/no.dat babel/localedata/nr.dat babel/localedata/nr_ZA.dat babel/localedata/nso.dat babel/localedata/nso_ZA.dat babel/localedata/ny.dat babel/localedata/ny_MW.dat babel/localedata/om.dat babel/localedata/om_ET.dat babel/localedata/om_KE.dat babel/localedata/or.dat babel/localedata/or_IN.dat babel/localedata/pa.dat babel/localedata/pa_Arab.dat babel/localedata/pa_Arab_PK.dat babel/localedata/pa_Guru.dat babel/localedata/pa_Guru_IN.dat babel/localedata/pa_IN.dat babel/localedata/pa_PK.dat babel/localedata/pl.dat babel/localedata/pl_PL.dat babel/localedata/ps.dat babel/localedata/ps_AF.dat babel/localedata/pt.dat babel/localedata/pt_BR.dat babel/localedata/pt_PT.dat babel/localedata/ro.dat babel/localedata/ro_MD.dat babel/localedata/ro_RO.dat babel/localedata/root.dat babel/localedata/ru.dat babel/localedata/ru_RU.dat babel/localedata/ru_UA.dat babel/localedata/rw.dat babel/localedata/rw_RW.dat babel/localedata/sa.dat babel/localedata/sa_IN.dat babel/localedata/se.dat babel/localedata/se_FI.dat babel/localedata/se_NO.dat babel/localedata/sh.dat babel/localedata/sh_BA.dat babel/localedata/sh_CS.dat babel/localedata/sh_YU.dat babel/localedata/si.dat babel/localedata/si_LK.dat babel/localedata/sid.dat babel/localedata/sid_ET.dat babel/localedata/sk.dat babel/localedata/sk_SK.dat babel/localedata/sl.dat babel/localedata/sl_SI.dat babel/localedata/so.dat babel/localedata/so_DJ.dat babel/localedata/so_ET.dat babel/localedata/so_KE.dat babel/localedata/so_SO.dat babel/localedata/sq.dat babel/localedata/sq_AL.dat babel/localedata/sr.dat babel/localedata/sr_BA.dat babel/localedata/sr_CS.dat babel/localedata/sr_Cyrl.dat babel/localedata/sr_Cyrl_BA.dat babel/localedata/sr_Cyrl_CS.dat babel/localedata/sr_Cyrl_ME.dat babel/localedata/sr_Cyrl_RS.dat babel/localedata/sr_Cyrl_YU.dat babel/localedata/sr_Latn.dat babel/localedata/sr_Latn_BA.dat babel/localedata/sr_Latn_CS.dat babel/localedata/sr_Latn_ME.dat babel/localedata/sr_Latn_RS.dat babel/localedata/sr_Latn_YU.dat babel/localedata/sr_ME.dat babel/localedata/sr_RS.dat babel/localedata/sr_YU.dat babel/localedata/ss.dat babel/localedata/ss_SZ.dat babel/localedata/ss_ZA.dat babel/localedata/st.dat babel/localedata/st_LS.dat babel/localedata/st_ZA.dat babel/localedata/sv.dat babel/localedata/sv_FI.dat babel/localedata/sv_SE.dat babel/localedata/sw.dat babel/localedata/sw_KE.dat babel/localedata/sw_TZ.dat babel/localedata/syr.dat babel/localedata/syr_SY.dat babel/localedata/ta.dat babel/localedata/ta_IN.dat babel/localedata/te.dat babel/localedata/te_IN.dat babel/localedata/tg.dat babel/localedata/tg_Cyrl.dat babel/localedata/tg_Cyrl_TJ.dat babel/localedata/tg_TJ.dat babel/localedata/th.dat babel/localedata/th_TH.dat babel/localedata/ti.dat babel/localedata/ti_ER.dat babel/localedata/ti_ET.dat babel/localedata/tig.dat babel/localedata/tig_ER.dat babel/localedata/tl.dat babel/localedata/tn.dat babel/localedata/tn_ZA.dat babel/localedata/to.dat babel/localedata/to_TO.dat babel/localedata/tr.dat babel/localedata/tr_TR.dat babel/localedata/trv.dat babel/localedata/ts.dat babel/localedata/ts_ZA.dat babel/localedata/tt.dat babel/localedata/tt_RU.dat babel/localedata/ug.dat babel/localedata/ug_Arab.dat babel/localedata/ug_Arab_CN.dat babel/localedata/ug_CN.dat babel/localedata/uk.dat babel/localedata/uk_UA.dat babel/localedata/ur.dat babel/localedata/ur_IN.dat babel/localedata/ur_PK.dat babel/localedata/uz.dat babel/localedata/uz_AF.dat babel/localedata/uz_Arab.dat babel/localedata/uz_Arab_AF.dat babel/localedata/uz_Cyrl.dat babel/localedata/uz_Cyrl_UZ.dat babel/localedata/uz_Latn.dat babel/localedata/uz_Latn_UZ.dat babel/localedata/uz_UZ.dat babel/localedata/ve.dat babel/localedata/ve_ZA.dat babel/localedata/vi.dat babel/localedata/vi_VN.dat babel/localedata/wal.dat babel/localedata/wal_ET.dat babel/localedata/wo.dat babel/localedata/wo_Latn.dat babel/localedata/wo_Latn_SN.dat babel/localedata/wo_SN.dat babel/localedata/xh.dat babel/localedata/xh_ZA.dat babel/localedata/yo.dat babel/localedata/yo_NG.dat babel/localedata/zh.dat babel/localedata/zh_CN.dat babel/localedata/zh_HK.dat babel/localedata/zh_Hans.dat babel/localedata/zh_Hans_CN.dat babel/localedata/zh_Hans_HK.dat babel/localedata/zh_Hans_MO.dat babel/localedata/zh_Hans_SG.dat babel/localedata/zh_Hant.dat babel/localedata/zh_Hant_HK.dat babel/localedata/zh_Hant_MO.dat babel/localedata/zh_Hant_TW.dat babel/localedata/zh_MO.dat babel/localedata/zh_SG.dat babel/localedata/zh_TW.dat babel/localedata/zu.dat babel/localedata/zu_ZA.dat babel/messages/__init__.py babel/messages/catalog.py babel/messages/checkers.py babel/messages/extract.py babel/messages/frontend.py babel/messages/jslexer.py babel/messages/mofile.py babel/messages/plurals.py babel/messages/pofile.py babel/messages/tests/__init__.py babel/messages/tests/catalog.py babel/messages/tests/checkers.py babel/messages/tests/extract.py babel/messages/tests/frontend.py babel/messages/tests/mofile.py babel/messages/tests/plurals.py babel/messages/tests/pofile.py babel/messages/tests/data/mapping.cfg babel/messages/tests/data/setup.cfg babel/messages/tests/data/setup.py babel/messages/tests/data/project/__init__.py babel/messages/tests/data/project/file1.py babel/messages/tests/data/project/file2.py babel/messages/tests/data/project/i18n/messages.pot babel/messages/tests/data/project/i18n/messages_non_fuzzy.pot babel/messages/tests/data/project/i18n/de_DE/LC_MESSAGES/messages.po babel/messages/tests/data/project/i18n/ru_RU/LC_MESSAGES/messages.po babel/messages/tests/data/project/ignored/a_test_file.txt babel/messages/tests/data/project/ignored/an_example.txt babel/messages/tests/data/project/ignored/this_wont_normally_be_here.py babel/tests/__init__.py babel/tests/core.py babel/tests/dates.py babel/tests/localedata.py babel/tests/numbers.py babel/tests/support.py babel/tests/util.py contrib/babel.js doc/cmdline.html doc/cmdline.txt doc/dates.html doc/dates.txt doc/display.html doc/display.txt doc/index.html doc/index.txt doc/intro.html doc/intro.txt doc/logo.pdf doc/logo.png doc/logo_small.png doc/messages.html doc/messages.txt doc/numbers.html doc/numbers.txt doc/setup.html doc/setup.txt doc/support.html doc/support.txt doc/api/api-objects.txt doc/api/babel-module.html doc/api/babel.core-module.html doc/api/babel.core.Locale-class.html doc/api/babel.core.UnknownLocaleError-class.html doc/api/babel.dates-module.html doc/api/babel.localedata-module.html doc/api/babel.messages-module.html doc/api/babel.messages.catalog-module.html doc/api/babel.messages.catalog.Catalog-class.html doc/api/babel.messages.catalog.Message-class.html doc/api/babel.messages.catalog.TranslationError-class.html doc/api/babel.messages.checkers-module.html doc/api/babel.messages.extract-module.html doc/api/babel.messages.frontend-module.html doc/api/babel.messages.frontend.CommandLineInterface-class.html doc/api/babel.messages.frontend.compile_catalog-class.html doc/api/babel.messages.frontend.extract_messages-class.html doc/api/babel.messages.frontend.init_catalog-class.html doc/api/babel.messages.frontend.update_catalog-class.html doc/api/babel.messages.jslexer-module.html doc/api/babel.messages.jslexer.Token-class.html doc/api/babel.messages.mofile-module.html doc/api/babel.messages.plurals-module.html doc/api/babel.messages.pofile-module.html doc/api/babel.numbers-module.html doc/api/babel.numbers.NumberFormatError-class.html doc/api/babel.support-module.html doc/api/babel.support.Format-class.html doc/api/babel.support.LazyProxy-class.html doc/api/babel.support.Translations-class.html doc/api/babel.util-module.html doc/api/babel.util.odict-class.html doc/api/class-tree.html doc/api/crarr.png doc/api/epydoc.css doc/api/epydoc.js doc/api/help.html doc/api/identifier-index.html doc/api/index.html doc/api/module-tree.html doc/api/redirect.html doc/api/since-index.html doc/common/COPYING doc/common/README.txt doc/common/doctools.py doc/common/template.html doc/common/conf/docutils.ini doc/common/conf/epydoc.ini doc/common/style/bkgnd_pattern.png doc/common/style/docutils.css doc/common/style/edgewall.css doc/common/style/epydoc.css doc/common/style/pygments.css doc/common/style/shadow.gif doc/common/style/vertbars.png scripts/dump_data.py scripts/dump_global.py scripts/import_cldr.pyPK[ً1site-packages/Babel-0.9.6-py2.7.egg-info/PKG-INFOnu[Metadata-Version: 1.1 Name: Babel Version: 0.9.6 Summary: Internationalization utilities Home-page: http://babel.edgewall.org/ Author: Edgewall Software Author-email: info@edgewall.org License: BSD Download-URL: http://babel.edgewall.org/wiki/Download Description: A collection of tools for internationalizing Python applications. Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: Environment :: Web Environment Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules PK[vϏ%%site-packages/jsonpointer.pycnu[ KUc@sgddlmZyddlmZmZWn'ek rSddlmZmZnXdZdZdZ dZ y*ddl m Z ddl mZeZWn'ek rddlm Z eZnXdd l mZdd lZdd lZejd Zd efd YZdefdYZeZedZedZdefdYZ dZ!d S(i(tunicode_literals(tMappingtSequenceu Stefan Kögl u1.9u2https://github.com/stefankoegl/python-json-pointeruModified BSD License(tunquote(tizip(tteeNu0|[1-9][0-9]*$tJsonPointerExceptioncBseZRS((t__name__t __module__(((s//usr/lib/python2.7/site-packages/jsonpointer.pyRBst EndOfListcBs eZdZdZdZRS(u+ Result of accessing element "-" of a list cCs ||_dS(N(tlist_(tselfR ((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__init__IscCs%djd|jjdt|jS(Nu {cls}({lst})tclstlst(tformatt __class__RtreprR (R ((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__repr__Ms(RRt__doc__R R(((s//usr/lib/python2.7/site-packages/jsonpointer.pyR Fs cCst|}|j||S(un Resolves pointer against doc and returns the referenced object >>> obj = {"foo": {"anArray": [ {"prop": 44}], "another prop": {"baz": "A string" }}} >>> resolve_pointer(obj, '') == obj True >>> resolve_pointer(obj, '/foo') == obj['foo'] True >>> resolve_pointer(obj, '/foo/another%20prop') == obj['foo']['another prop'] True >>> resolve_pointer(obj, '/foo/another%20prop/baz') == obj['foo']['another prop']['baz'] True >>> resolve_pointer(obj, '/foo/anArray/0') == obj['foo']['anArray'][0] True >>> resolve_pointer(obj, '/some/path', None) == None True (t JsonPointertresolve(tdoctpointertdefault((s//usr/lib/python2.7/site-packages/jsonpointer.pytresolve_pointerUs cCst|}|j|||S(uV Resolves pointer against doc and sets the value of the target within doc. With inplace set to true, doc is modified as long as pointer is not the root. >>> obj = {"foo": {"anArray": [ {"prop": 44}], "another prop": {"baz": "A string" }}} >>> set_pointer(obj, '/foo/anArray/0/prop', 55) == {'foo': {'another prop': {'baz': 'A string'}, 'anArray': [{'prop': 55}]}} True >>> set_pointer(obj, '/foo/yet%20another%20prop', 'added prop') == {'foo': {'another prop': {'baz': 'A string'}, 'yet another prop': 'added prop', 'anArray': [{'prop': 55}]}} True (Rtset(RRtvaluetinplace((s//usr/lib/python2.7/site-packages/jsonpointer.pyt set_pointerrs RcBseZdZdZdZedZeZedZ dZ dZ dZ dZ ed Zd Zd Zed ZRS( u= A JSON Pointer that can reference parts of an JSON document cCs|jd}|jddkr3tdntt|}g|D]}|jdd^qI}g|D]}|jdd^qn}||_dS(Nu/iuulocation must starts with /u~1u~0u~(tsplittpopRtmapRtreplacetparts(R RR"tpart((s//usr/lib/python2.7/site-packages/jsonpointer.pyR s%%cCsZ|js|dfSx'|jd D]}|j||}q!W||j||jdfS(u@ Resolves ptr until the last step, returns (sub-doc, last-step) iN(R"tNonetwalktget_part(R RR#((s//usr/lib/python2.7/site-packages/jsonpointer.pytto_lasts   cCsXxQ|jD]F}y|j||}Wq tk rO|tkrHqP|Sq Xq W|S(uBResolves the pointer against doc and returns the referenced object(R"R%Rt_nothing(R RRR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyRs   cCsit|jdkr.|r*tdn|S|sFtj|}n|j|\}}|||<|S(uH Resolve the pointer against the doc and replace the target with value. iucannot set root in place(tlenR"RtcopytdeepcopyR'(R RRRtparentR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyRs cCst|tr|St|trg|dkr2|Stjt|s]td|fnt|St|drz|Stdt |dS(u+ Returns the next step in the correct type u-u'%s' is not a valid list indexu __getitem__uQDocument '%s' does not support indexing, must be dict/list or support __getitem__N( t isinstanceRRtRE_ARRAY_INDEXtmatchtstrRtintthasattrttype(R RR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyR&s  cCs|j||}t|ttfksRt|dsRtdt|ft|try ||SWqtk rt d||fqXnct|t r|dkrt |Sy ||SWqt k rt d|fqXn||SdS(u7 Walks one step in doc and returns the referenced part u __getitem__uinvalid document type %sumember '%s' not found in %su-uindex '%s' is out of boundsN( R&R3tdicttlistR2tAssertionErrorR-RtKeyErrorRRR t IndexError(R RR#((s//usr/lib/python2.7/site-packages/jsonpointer.pyR%s@      cCs|jt|j |jkS(u+Returns True if self contains the given ptr(R"R)(R tptr((s//usr/lib/python2.7/site-packages/jsonpointer.pytcontainsscCs |j|S(u+Returns True if self contains the given ptr(R:(R titem((s//usr/lib/python2.7/site-packages/jsonpointer.pyt __contains__scCsdg|jD]}|jdd^q }g|D]}|jdd^q/}djd|DS(ux Returns the string representation of the pointer >>> ptr = JsonPointer('/~0/0/~1').path == '/~0/0/~1' u~u~0u/u~1ucss|]}d|VqdS(u/N((t.0R#((s//usr/lib/python2.7/site-packages/jsonpointer.pys s(R"R!tjoin(R R#R"((s//usr/lib/python2.7/site-packages/jsonpointer.pytpaths(%cCs#t|tstS|j|jkS(u compares a pointer to another object Pointers can be compared by comparing their strings (or splitted strings), because no two different parts can point to the same structure in an object (eg no different number representations) (R-RtFalseR"(R tother((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__eq__ scCstt|jS(N(thashttupleR"(R ((s//usr/lib/python2.7/site-packages/jsonpointer.pyt__hash__scCsg|D]}t|^q}g|D]}|jdd^q&}g|D]}|jdd^qK}|djd|D}|S(u Constructs a JsonPointer from a list of (unescaped) paths >>> JsonPointer.from_parts(['a', '~', '/', 0]).path == '/a/~0/~1/0' True u~u~0u/u~1ucss|]}d|VqdS(u/N((R=R#((s//usr/lib/python2.7/site-packages/jsonpointer.pys 's(R0R!R>(R R"R#R9((s//usr/lib/python2.7/site-packages/jsonpointer.pyt from_partss %%(RRRR R'R(RtgettTrueRR&R%R:R<tpropertyR?RBREt classmethodRF(((s//usr/lib/python2.7/site-packages/jsonpointer.pyRs       cCs1t|\}}x|D]}PqWt||S(u s -> (s0,s1), (s1,s2), (s2, s3), ... >>> list(pairwise([])) [] >>> list(pairwise([1])) [] >>> list(pairwise([1, 2, 3, 4])) [(1, 2), (2, 3), (3, 4)] (RR(titerabletatbt_((s//usr/lib/python2.7/site-packages/jsonpointer.pytpairwise,s  ("t __future__Rtcollections.abcRRt ImportErrort collectionst __author__t __version__t __website__t __license__turllibRt itertoolsRtunicodeR0t urllib.parsetzipRtreR*tcompileR.t ExceptionRtobjectR R(RRHRRRO(((s//usr/lib/python2.7/site-packages/jsonpointer.pyt!s4         PK[site-packages/prettytable.pycnu[ F`Qc@sdZddlZddlZddlZddlZddlZddlZddlZddlZej ddkZ e re Z e Z eZeZeZddlmZn(ejZejZeZddlmZe oej ddkrddlmZnddlmZdZdZdZdZd Z d Z!d Z"d Z#ej$d Z%dZ&de'fdYZ(dZ)dZ*e+dZ,dZ-defdYZ.dZ/dZ0dZ1e2dkre1ndS(s0.7.2iNii(t HTMLParserii(tescapei i i is \[[0-9;]*mcCsJ|jd}t|}tg|D]}t|^q%}||fS(Ns (tsplittlentmaxt_str_block_width(ttexttlinestheighttlinetwidth((s//usr/lib/python2.7/site-packages/prettytable.pyt _get_sizeLs %t PrettyTablecBs-eZdgdZdZdZdZdZerHdZ n dZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZeeeZdZdZ eee Z!dZ"dZ#ee"e#Z$dZ%dZ&ee%e&Z'd Z(d!Z)ee(e)Z*d"Z+d#Z,ee+e,Z-d$Z.d%Z/ee.e/Z0d&Z1d'Z2ee1e2Z3d(Z4d)Z5ee4e5Z6d*Z7d+Z8ee7e8Z9d,Z:d-Z;ee:e;Z<d.Z=d/Z>ee=e>Z?d0Z@d1ZAee@eAZBd2ZCd3ZDeeCeDZEd4ZFd5ZGeeFeGZHd6ZId7ZJeeIeJZKd8ZLd9ZMeeLeMZNd:ZOd;ZPeeOePZQd<ZRd=ZSeeReSZTd>ZUd?ZVeeUeVZWd@ZXdAZYeeXeYZZdBZ[dCZ\ee[e\Z]dDZ^dEZ_ee^e_Z`dFZadGZbeeaebZcdHZddIZeeedeeZfdJZgdKZheegehZidLZjdMZkdNZldOZmdPZndQZodRZpdSZqdTdUdVZrdWZsdXZtdYZudZZvd[Zwd\Zxd]Zyd^Zzd_Z{d`Z|daZ}dbZ~dcZddZdeZdfZRS(hcKs |jdd|_g|_i|_i|_i|_g|_|rT||_n g|_dj |_ |j j dj |j j dj x>|j D]3}||kr|j |||qd#||st int_formatt float_formatt padding_widthitleft_padding_widthtright_padding_widtht vertical_chart|thorizontal_chart-t junction_chart+t print_emptytformattxhtmlt attributesN(*tgetR t _field_namest_alignt_valignt _max_widtht_rowst field_namest_widthsRt_optionstextendt_validate_optiontNonet_startt_endt_fieldstTruetFalset_headert _header_stylet_bordertFRAMEt_hrulestALLt_vrulest_sortbyt _reversesortt _sort_keyt _int_formatt _float_formatt_padding_widtht_left_padding_widtht_right_padding_widtht_unicodet_vertical_chart_horizontal_chart_junction_chart _print_emptyt_formatt_xhtmlt _attributes(tselfR0tkwargstoption((s//usr/lib/python2.7/site-packages/prettytable.pyt__init__Ts^            cCsIt|tst|}nt|tsEt||jd}n|S(Ntstrict(t isinstancet basestringtstrtunicodeR (RRtvalue((s//usr/lib/python2.7/site-packages/prettytable.pyRJs cCs|t|}|dkr(||dS|dkr@|d|S|drt|drz|dd||dddS|ddd||ddSn|dd||ddSdS(Ntlt trii(R(RRRR taligntexcess((s//usr/lib/python2.7/site-packages/prettytable.pyt_justifys      #cCsl|dkrt|jS|dkr\|jr;t|jS|jrUt|jdSdSn t|dS(Ntrowcounttcolcounti(RR/R+tAttributeError(RRtname((s//usr/lib/python2.7/site-packages/prettytable.pyt __getattr__s      cCst}|j|_x2|jD]'}t|d|t|d|qWt|dt|dt|trxa|j|D]}|j|qWn<t|t r|j|j|nt dt ||S(Nt_R,s0Index %s is invalid, must be an integer or slice( R R0R2tsetattrtgetattrRWtsliceR/tadd_rowtintt ExceptionRY(RRtindextnewtattrtrow((s//usr/lib/python2.7/site-packages/prettytable.pyt __getitem__s  %cCs |jS(N(t __unicode__(RR((s//usr/lib/python2.7/site-packages/prettytable.pyt__str__scCs|jj|jS(N(RstencodeR (RR((s//usr/lib/python2.7/site-packages/prettytable.pyRtscCs |jS(N(t get_string(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRsscCs|dkr|j|n|dkr;|j||nb|d krZ|j||nC|d kry|j||n$|d kr|j||n|d kr|j||n|d kr|j||n|dkr|j||n|dkr|j|n|dkr0|j ||nm|dkrO|j ||nN|dkrn|j ||n/|dkr|j ||nt d|dS(NR0RRt max_widthRRRR'RRRRRRRRR(R&RRRR R"R$R)sUnrecognised option: %s!(sstartsends max_widths padding_widthsleft_padding_widthsright_padding_widthsformat(sheadersborders reversesortsxhtmls print_empty(s vertical_charshorizontal_chars junction_char(t_validate_field_namest_validate_nonnegative_intt_validate_field_namet_validate_functiont_validate_hrulest_validate_vrulest_validate_all_field_namest_validate_true_or_falset_validate_header_stylet_validate_int_formatt_validate_float_formatt_validate_single_chart_validate_attributesRm(RRRTtval((s//usr/lib/python2.7/site-packages/prettytable.pyR4s6             cCs(|jrjy%t|t|jks-tWqjtk rftdt|t|jfqjXn|jry)t|t|jdkstWqtk rtdt|t|jdfqXny(t|tt|kstWntk r#tdnXdS(NsJField name list has incorrect number of values, (actual) %d!=%d (expected)isField names must be unique!(R+RtAssertionErrorRmR/tset(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyRxs % , ) 0( cCs:y|dkstWntk r5tdnXdS(Ntcapttitletuppertlowers;Invalid header style, use cap, title, upper, lower or None!(RstitlesupperslowerN(R5RRm(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyR0s cCs>y|dkstWn!tk r9td|nXdS(NR\tcR^s'Alignment %s is invalid, use l, c or r!(R\RR^(RRm(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyt_validate_align6s cCs>y|dkstWn!tk r9td|nXdS(Ntttmtbs-Alignment %s is invalid, use t, m, b or None!(RRRN(R5RRm(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyt_validate_valign<s cCsSyt|dkstWn0tk rNtd||j|fnXdS(NisInvalid value for %s: %s!(RlRRmRJ(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRyBs cCsDy|ttfkstWn!tk r?td|nXdS(Ns-Invalid value for %s! Must be True or False.(R9R:RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRHs cCsl|dkrdSy4t|ttfks1t|jsCtWn!tk rgtd|nXdS(Nts8Invalid value for %s! Must be an integer format string.(ttypeRYRZRtisdigitRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRNs  cCs|dkrdSyt|ttfks1td|ksCt|jd}t|dksjt|ddks|djst|ddks|djstWn!tk rtd|nXdS(NRt.iiis5Invalid value for %s! Must be a float format string.(RRYRZRRRRRm(RRReRtbits((s//usr/lib/python2.7/site-packages/prettytable.pyRWs &* cCsAyt|dstWn!tk r<td|nXdS(Nt__call__s*Invalid value for %s! Must be a function.(thasattrRRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyR{ds cCsJy"|ttttfks!tWn!tk rEtd|nXdS(Ns:Invalid value for %s! Must be ALL, FRAME, HEADER or NONE.(R@R>tHEADERtNONERRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyR|js" cCsGy|tttfkstWn!tk rBtd|nXdS(Ns3Invalid value for %s! Must be ALL, FRAME, or NONE.(R@R>RRRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyR}ps cCsMy%||jks$|dks$tWn!tk rHtd|nXdS(NsInvalid field name: %s!(R+R5RRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRzvs% cCsIy%x|D]}|j||q WWntk rDtdnXdS(Ns)fields must be a sequence of field names!(RzRRm(RRReRR((s//usr/lib/python2.7/site-packages/prettytable.pyR~|s   cCsDyt|dkstWn!tk r?td|nXdS(Nis4Invalid value for %s! Must be a string of length 1.(RRRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRs cCs=yt|tstWntk r8tdnXdS(Ns4attributes must be a dictionary of name/value pairs!(RWtdictRRm(RRReR((s//usr/lib/python2.7/site-packages/prettytable.pyRs cCs|jS(N(R+(RR((s//usr/lib/python2.7/site-packages/prettytable.pyt_get_field_namesscCsg|D]}|j|^q}|jd||jrH|j}n||_|jr|rx1t||D] \}}|j||j| tag when printing HTML Arguments: attributes - dictionary of attributes(RQ(RR((s//usr/lib/python2.7/site-packages/prettytable.pyt_get_attributesscCs|jd|||_dS(NR)(R4RQ(RRR((s//usr/lib/python2.7/site-packages/prettytable.pyt_set_attributesscCsfi}xY|jD]N}||krG|j||||||||tkrK|jn%|tkrd|jn tddS(NsInvalid pre-set style!( tDEFAULTt_set_default_styletMSWORD_FRIENDLYt_set_msword_stylet PLAIN_COLUMNSt_set_columns_styletRANDOMt_set_random_styleRm(RRtstyle((s//usr/lib/python2.7/site-packages/prettytable.pyt set_styles        cCs^t|_t|_t|_t|_d|_d|_d|_ d|_ d|_ d|_ dS(NiR!R#R%( R9RRR>R?R@RARRRR R"R$(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRs         cCsCt|_t|_t|_d|_d|_d|_d|_dS(NiR!( R9RRRR?RRRR (RR((s//usr/lib/python2.7/site-packages/prettytable.pyRs      cCs1t|_t|_d|_d|_d|_dS(Niii(R9RR:RRRR(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRs     cCstjttf|_tjttf|_tjtttt f|_ tjttt f|_ tj dd|_ tj dd|_tjd|_tjd|_tjd|_dS(Niis ~!@#$%^&*()_+|-=\{}[];':",./;<>?(trandomtchoiceR9R:RRR@R>RRR?RAtrandintRRR R"R$(RR((s//usr/lib/python2.7/site-packages/prettytable.pyRscCs|jrLt|t|jkrLtdt|t|jfn|jsgtdt|D]}d|d^qk|_n|jjt|dS(sAdd a row to the table Arguments: row - row of data, should be a list with as many elements as the table has fieldss>Row has incorrect number of values, (actual) %d!=%d (expected)isField %diN(R+RRmtrangeR0R/tappendtlist(RRRqtn((s//usr/lib/python2.7/site-packages/prettytable.pyRk(s $( 6cCsI|t|jdkr;td|t|jfn|j|=dS(sDelete a row to the table Arguments: row_index - The index of the row you want to delete. Indexing starts at 0.is4Cant delete row at index %d, table only has %d rows!N(RR/Rm(RRt row_index((s//usr/lib/python2.7/site-packages/prettytable.pytdel_row7s"RRcCst|jdt|fkr|j||j||jj|||j|<||j||d s:|d r>dS|j|}|j||}|j|||j||_|dr|j|j|n3|dr|dt t fkr|j|jnx'|D]}|j|j ||qW|dr.|dt kr.|j|jn|j dj |S(s"Return string representation of table in current state. Arguments: start - index of first data row to include in output end - index of last data row to include in output PLUS ONE (list slice style) fields - names of fields (columns) to include header - print a header showing field names (True or False) border - print a border around the table (True or False) hrules - controls printing of horizontal rules after rows. Allowed values: ALL, FRAME, HEADER, NONE vrules - controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE int_format - controls formatting of integer data float_format - controls formatting of floating point data padding_width - number of spaces on either side of column data (only used if left and right paddings are None) left_padding_width - number of spaces on left hand side of column data right_padding_width - number of spaces on right hand side of column data vertical_char - single character string used to draw vertical lines horizontal_char - single character string used to draw horizontal lines junction_char - single character string used to draw line junctions sortby - name of field to sort rows by sort_key - sorting key function, applied to data points before sorting reversesort - True or False to sort in descending or ascending order print empty - if True, stringify just the header for an empty table, if False return an empty string iR&RRRRs (RRbRRRt_stringify_hrulet_hruleRt_stringify_headerR@R>t_stringify_rowRJtjoin(RRRSRRRtformatted_rowsRq((s//usr/lib/python2.7/site-packages/prettytable.pyRvs"%   cCsP|dsdS|j|\}}|dttfkrI|dg}n |dg}|js}|j|ddj|Sxt|j|jD]~\}}|dr||dkrqn|j||||d|dtkr|j|dq|j|dqW|dtkrC|j|j|dndj|S(NRRRR$R"R( RR@R>R+RR RR1R(RRRRRRRR ((s//usr/lib/python2.7/site-packages/prettytable.pyRs(    " c Csg}|j|\}}|dr|dttfkr[|j|j|jdn|dttfkr|j|dq|jdn|js|dttfkr|j|dq|jdnx2t|j|jD]\}}|dr||dkrqn|jdkr8|j }n`|jd krV|j }nB|jd krt|j }n$|jd kr|j }n|}|jd||j |||j|d||dr|dtkr|j|dq |jdqqW|drE|dtkrE|j|j|dn|dr|dtkr|jd|j|jnd j|S( NRRs RR R]RRRRRR(RR@R>RRR+RR1R<t capitalizeRRRRaR,RRR (RRRRRRRR R((s//usr/lib/python2.7/site-packages/prettytable.pyR sJ  "3   c Csxttdt||j||jD]\}}}}|jd}g}xB|D]:} t| |krtj| |} n|j | qYW|}dj |}|||R R-RlRaR,RR(RRRqRRnRR[R Rt new_linesR t row_heightRthRRRtyRtdHeightR\((s//usr/lib/python2.7/site-packages/prettytable.pyR:sj=      (  7  7 cKs>|j|}|dr+|j|}n|j|}|S(s;Return string representation of HTML formatted version of table in current state. Arguments: start - index of first data row to include in output end - index of last data row to include in output PLUS ONE (list slice style) fields - names of fields (columns) to include header - print a header showing field names (True or False) border - print a border around the table (True or False) hrules - controls printing of horizontal rules after rows. Allowed values: ALL, FRAME, HEADER, NONE vrules - controls printing of vertical rules between columns. Allowed values: FRAME, ALL, NONE int_format - controls formatting of integer data float_format - controls formatting of floating point data padding_width - number of spaces on either side of column data (only used if left and right paddings are None) left_padding_width - number of spaces on left hand side of column data right_padding_width - number of spaces on right hand side of column data sortby - name of field to sort rows by sort_key - sorting key function, applied to data points before sorting attributes - dictionary of name/value pairs to include as HTML attributes in the
tag xhtml - print
tags if True,
tags if falseR'(Rt_get_formatted_html_stringt_get_simple_html_string(RRRSRtstring((s//usr/lib/python2.7/site-packages/prettytable.pytget_html_strings  c Csg}|drd}nd}g}|jd|drsx4|dD]%}|jd||d|fqGWn|jd|jdj||d r|jd xT|jD]I}|d r||d krqn|jd t|jd |qW|jdn|j|}|j||}x|D]} |jd xct|j| D]O\}} |d r||d krqbn|jdt| jd |qbW|jdq<W|jd|jd j|S(NR(s
s
sRRs Rs s s s s
%s
%s
( RR R+RtreplaceRRRRJ( RRRRt linebreaktopen_tagt attr_nameRRR Rqtdatum((s//usr/lib/python2.7/site-packages/prettytable.pyRs:    &   '  ' cCsg}|j|\}}|dr.d}nd}g}|jd|drd|dtkr|dtkr|jdqd|dtkr|dtkr|jd qd|dtkr|dtkr|jd qd|dtkr|jd qd|dtkr!|jd qd|dtkrA|jd qd|dtkrd|jdqdn|drx4|dD]%}|jd||d|fqyWn|jd|jdj||drO|jdx]|jD]R}|dr||dkrqn|jd||t|jd|fqW|jdn|j|} |j | |} g} g} xk|jD]`}| jidd6dd6dd6|j || jidd 6d!d"6d#d$6|j |qWx| D]} |jdx~t |j| | | D]d\}}}}|drO||dkrOqn|jd%||||t|jd|fqW|jdqW|jd&|j dj|S('NR(s
s
sRsW %ss s tleftR\trightR^tcenterRttopRtmiddleRtbottomRsg %ss(RRR@R>R R+RRRRR,R-RRJ(RRRRRRRRRRRR talignstvalignsRqRR_R((s//usr/lib/python2.7/site-packages/prettytable.pyRsd        &   0-1  +6 N(t__name__t __module__R5RURJRaRfRrtpy3kRtRsR4RxRRRRyRRRR{R|R}RzR~RRRRtpropertyR0RRR_RRRRRRwRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR RRR"RRR$RRR'RRR&RRR)RRRRRRRkRRRRRRRRRRRRvRRRRRR(((s//usr/lib/python2.7/site-packages/prettytable.pyR Rs ]                                                                                     =  / L (c Csd|kodknr dSd|ko7dknr@dSd|koWdknr`dStjt|ryd Sd |kod knsd |kod knrdSd|kodknrdSd|kodknrdS|dkrdS|dkrd SdS(Ni!i~iiNiiiiii@0i0i0i0ii`i0i>0iiii(ii(ii(t unicodedatat combiningtuni_chr(tchar((s//usr/lib/python2.7/site-packages/prettytable.pyt_char_block_widths&8  cCs(ttttttjd|S(NR(tsumtitermapR-tordt_retsub(R((s//usr/lib/python2.7/site-packages/prettytable.pyR/scKstjj|jd}|jdtj||}t|}|r[||_nYtrgt |D]}|j ^qn|_n(g|j D]}|j ^q|_x4|D],}|j g|D]}|j ^qqW|S(Nii( tcsvtSniffertsnifftreadtseektreaderR R0R'tnexttstripRk(tfpR0RStdialectR8ttableRRq((s//usr/lib/python2.7/site-packages/prettytable.pytfrom_csv7s   +( *cKsd|jr`t|}g|jD]}|d^q|_x!|jD]}|j|qEW|SdS(Ni(t descriptionR R0tfetchallRk(tcursorRSR=tcolRq((s//usr/lib/python2.7/site-packages/prettytable.pytfrom_db_cursorKs   #t TableHandlercBs>eZdZdZdZdZdZdZRS(cKsYtj|||_g|_g|_g|_d|_d|_d|_ t |_ dS(NiR( RRURSttablestlast_rowRt max_row_widthR5tactivet last_contentR:tis_last_row_header(RRRS((s//usr/lib/python2.7/site-packages/prettytable.pyRUVs        cCs%||_|dkr!t|_ndS(Ntth(RHR9RJ(RRttagtattrs((s//usr/lib/python2.7/site-packages/prettytable.pythandle_starttagas  cCs|dkr.|jj}|jj|n|dkr|jj|j|jft|jt|j|_g|_t |_n|dkr|j |j}|j j|g|_nd|_d|_ dS(NRKttdttrR=R](sthRO(RIR:RFRRRJRRGRR:tgenerate_tableRER5RH(RRRLtstripped_contentR=((s//usr/lib/python2.7/site-packages/prettytable.pyt handle_endtagfs        cCs|j|7_dS(N(RI(RRtdata((s//usr/lib/python2.7/site-packages/prettytable.pyt handle_dataxscCst|j}x|jD]}t|d|jkr}|jt|d}x+td|D]}|djdq_Wn|dtkr|j|d|d|_ q|j |dqW|S(sE Generates from a list of rows a PrettyTable object. iiR#( R RSRRRGRRR9tmake_fields_uniqueR0Rk(RRRR=RqtappendsR((s//usr/lib/python2.7/site-packages/prettytable.pyRQ{scCsoxhtdt|D]Q}xHt|dt|D]-}||||kr6||cd7 in the HTML becomes one PrettyTable object. (RDtfeedRE(t html_codeRStparser((s//usr/lib/python2.7/site-packages/prettytable.pyt from_htmls  cKsSt||}yt|dks*tWntk rJtdnX|dS(sf Generates a PrettyTables from a string of HTML code which contains only a single isDMore than one
in provided HTML code! Use from_html instead.i(R]RRRm(R[RSRE((s//usr/lib/python2.7/site-packages/prettytable.pyt from_html_ones  cCstddddg}d|_t|_d|jdR@RRRRRRtcompileR1R tobjectR R-RR5R>RCRDR]R^RiR%(((s//usr/lib/python2.7/site-packages/prettytable.pyt s`            !   B   PK[Q8site-packages/kitchen-1.1.1-py2.7.egg-info/top_level.txtnu[kitchen PK[2?site-packages/kitchen-1.1.1-py2.7.egg-info/dependency_links.txtnu[ PK[i-6site-packages/kitchen-1.1.1-py2.7.egg-info/SOURCES.txtnu[README setup.cfg setup.py kitchen/__init__.py kitchen/exceptions.py kitchen/release.py kitchen.egg-info/PKG-INFO kitchen.egg-info/SOURCES.txt kitchen.egg-info/dependency_links.txt kitchen.egg-info/top_level.txt kitchen/collections/__init__.py kitchen/collections/strictdict.py kitchen/i18n/__init__.py kitchen/iterutils/__init__.py kitchen/pycompat24/__init__.py kitchen/pycompat24/subprocess.py kitchen/pycompat24/base64/__init__.py kitchen/pycompat24/base64/_base64.py kitchen/pycompat24/sets/__init__.py kitchen/pycompat25/__init__.py kitchen/pycompat25/collections/__init__.py kitchen/pycompat25/collections/_defaultdict.py kitchen/pycompat27/__init__.py kitchen/pycompat27/subprocess/__init__.py kitchen/pycompat27/subprocess/_subprocess.py kitchen/text/__init__.py kitchen/text/converters.py kitchen/text/display.py kitchen/text/exceptions.py kitchen/text/misc.py kitchen/text/utf8.py kitchen/versioning/__init__.pyPK[pMdd3site-packages/kitchen-1.1.1-py2.7.egg-info/PKG-INFOnu[Metadata-Version: 1.1 Name: kitchen Version: 1.1.1 Summary: Kitchen contains a cornucopia of useful code Home-page: https://fedorahosted.org/kitchen Author: Toshio Kuratomi Author-email: toshio@fedoraproject.org License: LGPLv2+ Download-URL: https://fedorahosted.org/releases/k/i/kitchen Description: We've all done it. In the process of writing a brand new application we've discovered that we need a little bit of code that we've invented before. Perhaps it's something to handle unicode text. Perhaps it's something to make a bit of python-2.5 code run on python-2.3. Whatever it is, it ends up being a tiny bit of code that seems too small to worry about pushing into its own module so it sits there, a part of your current project, waiting to be cut and pasted into your next project. And the next. And the next. And since that little bittybit of code proved so useful to you, it's highly likely that it proved useful to someone else as well. Useful enough that they've written it and copy and pasted it over and over into each of their new projects. Well, no longer! Kitchen aims to pull these small snippets of code into a few python modules which you can import and use within your project. No more copy and paste! Now you can let someone else maintain and release these small snippets so that you can get on with your life. Keywords: Useful Small Code Snippets Platform: UNKNOWN Classifier: Development Status :: 4 - Beta Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python :: 2.3 Classifier: Programming Language :: Python :: 2.4 Classifier: Programming Language :: Python :: 2.5 Classifier: Programming Language :: Python :: 2.6 Classifier: Programming Language :: Python :: 2.7 Classifier: Topic :: Software Development :: Internationalization Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Topic :: Text Processing :: General PK[i"EEsite-packages/yum/misc.pynuȯ#! /usr/bin/python -tt """ Assorted utility functions for yum. """ import types import os import sys import os.path from cStringIO import StringIO import base64 import binascii import struct import re import errno import Errors import constants import pgpmsg import tempfile import glob import pwd import fnmatch import bz2 import gzip import shutil import urllib import string _available_compression = ['gz', 'bz2'] try: import lzma _available_compression.append('xz') except ImportError: lzma = None from rpmUtils.miscutils import stringToVersion, flagToString from stat import * try: import gpgme import gpgme.editutil except ImportError: gpgme = None try: import hashlib _available_checksums = set(['md5', 'sha1', 'sha256', 'sha384', 'sha512']) except ImportError: # Python-2.4.z ... gah! import sha import md5 _available_checksums = set(['md5', 'sha1']) class hashlib: @staticmethod def new(algo): if algo == 'md5': return md5.new() if algo == 'sha1': return sha.new() raise ValueError, "Bad checksum type" # some checksum types might be disabled _fips_noncompliant = set() for ctype in list(_available_checksums): try: hashlib.new(ctype) except Exception as e: # Print an error unless this is due to FIPS mode (in which case it's # not really an error and we don't want to pollute the output # needlessly; if someone actually tries to instantiate a Checksum with # a FIPS non-compliant ctype, we'll raise an explanatory exception # anyway). if isinstance(e, ValueError) and str(e).endswith('disabled for fips'): _fips_noncompliant.add(ctype) else: print >> sys.stderr, 'Checksum type %s disabled' % repr(ctype) _available_checksums.remove(ctype) for ctype in 'sha256', 'sha1': if ctype in _available_checksums: _default_checksums = [ctype] break else: raise ImportError, 'broken hashlib' from Errors import MiscError, FIPSNonCompliantError # These are API things, so we can't remove them even if they aren't used here. # pylint: disable-msg=W0611 from i18n import to_utf8, to_unicode # pylint: enable-msg=W0611 _share_data_store = {} _share_data_store_u = {} def share_data(value): """ Take a value and use the same value from the store, if the value isn't in the store this one becomes the shared version. """ # We don't want to change the types of strings, between str <=> unicode # and hash('a') == hash(u'a') ... so use different stores. # In theory eventaully we'll have all of one type, but don't hold breath. store = _share_data_store if isinstance(value, unicode): store = _share_data_store_u # hahahah, of course the above means that: # hash(('a', 'b')) == hash((u'a', u'b')) # ...which we have in deptuples, so just screw sharing those atm. if type(value) == types.TupleType: return value return store.setdefault(value, value) def unshare_data(): global _share_data_store global _share_data_store_u _share_data_store = {} _share_data_store_u = {} _re_compiled_glob_match = None def re_glob(s): """ Tests if a string is a shell wildcard. """ # TODO/FIXME maybe consider checking if it is a stringsType before going on - otherwise # returning None global _re_compiled_glob_match if _re_compiled_glob_match is None: _re_compiled_glob_match = re.compile('[*?]|\[.+\]').search return _re_compiled_glob_match(s) def compile_pattern(pat, ignore_case=False): """ Compile shell wildcards, return a 'match' function. """ if re_glob(pat): try: flags = ignore_case and re.I or 0 return re.compile(fnmatch.translate(pat), flags).match except re.error: pass # fall back to exact match if ignore_case: pat = pat.lower() return lambda s: s.lower() == pat return lambda s: s == pat _re_compiled_filename_match = None def re_filename(s): """ Tests if a string could be a filename. We still get negated character classes wrong (are they supported), and ranges in character classes. """ global _re_compiled_filename_match if _re_compiled_filename_match is None: _re_compiled_filename_match = re.compile('[/*?]|\[[^]]*/[^]]*\]').match return _re_compiled_filename_match(s) def re_primary_filename(filename): """ Tests if a filename string, can be matched against just primary. Note that this can produce false negatives (Eg. /b?n/zsh) but not false positives (because the former is a perf hit, and the later is a failure). Note that this is a superset of re_primary_dirname(). """ if re_primary_dirname(filename): return True if filename == '/usr/lib/sendmail': return True return False def re_primary_dirname(dirname): """ Tests if a dirname string, can be matched against just primary. Note that this is a subset of re_primary_filename(). """ if 'bin/' in dirname: return True if dirname.startswith('/etc/'): return True return False _re_compiled_full_match = None def re_full_search_needed(s): """ Tests if a string needs a full nevra match, instead of just name. """ global _re_compiled_full_match if _re_compiled_full_match is None: # A glob, or a "." or "-" separator, followed by something (the ".") one = re.compile('.*([-.*?]|\[.+\]).').match # Any epoch, for envra two = re.compile('[0-9]+:').match _re_compiled_full_match = (one, two) for rec in _re_compiled_full_match: if rec(s): return True return False def re_remote_url(s): """ Tests if a string is a "remote" URL, http, https, ftp. """ s = s.lower() if s.startswith("http://"): return True if s.startswith("https://"): return True if s.startswith("ftp://"): return True return False ########### # Title: Remove duplicates from a sequence # Submitter: Tim Peters # From: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52560 def unique(s): """Return a list of the elements in s, but without duplicates. For example, unique([1,2,3,1,2,3]) is some permutation of [1,2,3], unique("abcabc") some permutation of ["a", "b", "c"], and unique(([1, 2], [2, 3], [1, 2])) some permutation of [[2, 3], [1, 2]]. For best speed, all sequence elements should be hashable. Then unique() will usually work in linear time. If not possible, the sequence elements should enjoy a total ordering, and if list(s).sort() doesn't raise TypeError it's assumed that they do enjoy a total ordering. Then unique() will usually work in O(N*log2(N)) time. If that's not possible either, the sequence elements must support equality-testing. Then unique() will usually work in quadratic time. """ n = len(s) if n == 0: return [] # Try using a set first, as that's the fastest and will usually # work. If it doesn't work, it will usually fail quickly, so it # usually doesn't cost much to *try* it. It requires that all the # sequence elements be hashable, and support equality comparison. try: u = set(s) except TypeError: pass else: return list(u) # We can't hash all the elements. Second fastest is to sort, # which brings the equal elements together; then duplicates are # easy to weed out in a single pass. # NOTE: Python's list.sort() was designed to be efficient in the # presence of many duplicate elements. This isn't true of all # sort functions in all languages or libraries, so this approach # is more effective in Python than it may be elsewhere. try: t = list(s) t.sort() except TypeError: del t # move on to the next method else: assert n > 0 last = t[0] lasti = i = 1 while i < n: if t[i] != last: t[lasti] = last = t[i] lasti += 1 i += 1 return t[:lasti] # Brute force is all that's left. u = [] for x in s: if x not in u: u.append(x) return u class Checksums: """ Generate checksum(s), on given pieces of data. Producing the Length and the result(s) when complete. """ def __init__(self, checksums=None, ignore_missing=False, ignore_none=False): if checksums is None: checksums = _default_checksums self._sumalgos = [] self._sumtypes = [] self._len = 0 done = set() for sumtype in checksums: if sumtype == 'sha': sumtype = 'sha1' if sumtype in done: continue if sumtype in _available_checksums: sumalgo = hashlib.new(sumtype) elif ignore_missing: continue elif sumtype in _fips_noncompliant: raise FIPSNonCompliantError(sumtype) else: raise MiscError, 'Error Checksumming, bad checksum type %s' % sumtype done.add(sumtype) self._sumtypes.append(sumtype) self._sumalgos.append(sumalgo) if not done and not ignore_none: raise MiscError, 'Error Checksumming, no valid checksum type' def __len__(self): return self._len # Note that len(x) is assert limited to INT_MAX, which is 2GB on i686. length = property(fget=lambda self: self._len) def update(self, data): self._len += len(data) for sumalgo in self._sumalgos: sumalgo.update(data) def read(self, fo, size=2**16): data = fo.read(size) self.update(data) return data def hexdigests(self): ret = {} for sumtype, sumdata in zip(self._sumtypes, self._sumalgos): ret[sumtype] = sumdata.hexdigest() return ret def hexdigest(self, checksum=None): if checksum is None: if not self._sumtypes: return None checksum = self._sumtypes[0] if checksum == 'sha': checksum = 'sha1' return self.hexdigests()[checksum] def digests(self): ret = {} for sumtype, sumdata in zip(self._sumtypes, self._sumalgos): ret[sumtype] = sumdata.digest() return ret def digest(self, checksum=None): if checksum is None: if not self._sumtypes: return None checksum = self._sumtypes[0] if checksum == 'sha': checksum = 'sha1' return self.digests()[checksum] class AutoFileChecksums: """ Generate checksum(s), on given file/fileobject. Pretending to be a file object (overrrides read). """ def __init__(self, fo, checksums, ignore_missing=False, ignore_none=False): self._fo = fo self.checksums = Checksums(checksums, ignore_missing, ignore_none) def __getattr__(self, attr): return getattr(self._fo, attr) def read(self, size=-1): return self.checksums.read(self._fo, size) def checksum(sumtype, file, CHUNK=2**16, datasize=None): """takes filename, hand back Checksum of it sumtype = md5 or sha/sha1/sha256/sha512 (note sha == sha1) filename = /path/to/file CHUNK=65536 by default""" # chunking brazenly lifted from Ryan Tomayko try: if type(file) not in types.StringTypes: fo = file # assume it's a file-like-object else: fo = open(file, 'r') data = Checksums([sumtype]) while data.read(fo, CHUNK): if datasize is not None and data.length > datasize: break if type(file) is types.StringType: fo.close() # This screws up the length, but that shouldn't matter. We only care # if this checksum == what we expect. if datasize is not None and datasize != data.length: return '!%u!%s' % (datasize, data.hexdigest(sumtype)) return data.hexdigest(sumtype) except (IOError, OSError), e: raise MiscError, 'Error opening file for checksum: %s' % file def getFileList(path, ext, filelist): """Return all files in path matching ext, store them in filelist, recurse dirs return list object""" extlen = len(ext) try: dir_list = os.listdir(path) except OSError, e: raise MiscError, ('Error accessing directory %s, %s') % (path, e) for d in dir_list: if os.path.isdir(path + '/' + d): filelist = getFileList(path + '/' + d, ext, filelist) else: if not ext or d[-extlen:].lower() == '%s' % (ext): newpath = os.path.normpath(path + '/' + d) filelist.append(newpath) return filelist class GenericHolder: """Generic Holder class used to hold other objects of known types It exists purely to be able to do object.somestuff, object.someotherstuff or object[key] and pass object to another function that will understand it""" def __init__(self, iter=None): self.__iter = iter def __iter__(self): if self.__iter is not None: return iter(self[self.__iter]) def __getitem__(self, item): if hasattr(self, item): return getattr(self, item) else: raise KeyError, item def procgpgkey(rawkey): '''Convert ASCII armoured GPG key to binary ''' # TODO: CRC checking? (will RPM do this anyway?) # Normalise newlines rawkey = re.sub('\r\n?', '\n', rawkey) # Extract block block = StringIO() inblock = 0 pastheaders = 0 for line in rawkey.split('\n'): if line.startswith('-----BEGIN PGP PUBLIC KEY BLOCK-----'): inblock = 1 elif inblock and line.strip() == '': pastheaders = 1 elif inblock and line.startswith('-----END PGP PUBLIC KEY BLOCK-----'): # Hit the end of the block, get out break elif pastheaders and line.startswith('='): # Hit the CRC line, don't include this and stop break elif pastheaders: block.write(line+'\n') # Decode and return return base64.decodestring(block.getvalue()) def gpgkey_fingerprint_ascii(info, chop=4): ''' Given a key_info data from getgpgkeyinfo(), return an ascii fingerprint. Chop every 4 ascii values, as that is what GPG does. ''' # First "duh" ... it's a method... fp = info['fingerprint']() fp = binascii.hexlify(fp) if chop: fp = [fp[i:i+chop] for i in range(0, len(fp), chop)] fp = " ".join(fp) return fp def getgpgkeyinfo(rawkey, multiple=False): '''Return a dict of info for the given ASCII armoured key text Returned dict will have the following keys: 'userid', 'keyid', 'timestamp' Will raise ValueError if there was a problem decoding the key. ''' # Catch all exceptions as there can be quite a variety raised by this call key_info_objs = [] try: keys = pgpmsg.decode_multiple_keys(rawkey) except Exception, e: raise ValueError(str(e)) if len(keys) == 0: raise ValueError('No key found in given key data') for key in keys: keyid_blob = key.public_key.key_id() info = { 'userid': key.user_id, 'keyid': struct.unpack('>Q', keyid_blob)[0], 'timestamp': key.public_key.timestamp, 'fingerprint' : key.public_key.fingerprint, 'raw_key' : key.raw_key, 'has_sig' : False, 'valid_sig': False, } # Retrieve the timestamp from the matching signature packet # (this is what RPM appears to do) for userid in key.user_ids[0]: if not isinstance(userid, pgpmsg.signature): continue if userid.key_id() == keyid_blob: # Get the creation time sub-packet if available if hasattr(userid, 'hashed_subpaks'): tspkt = \ userid.get_hashed_subpak(pgpmsg.SIG_SUB_TYPE_CREATE_TIME) if tspkt != None: info['timestamp'] = int(tspkt[1]) break key_info_objs.append(info) if multiple: return key_info_objs else: return key_info_objs[0] def keyIdToRPMVer(keyid): '''Convert an integer representing a GPG key ID to the hex version string used by RPM ''' return "%08x" % (keyid & 0xffffffffL) def keyInstalled(ts, keyid, timestamp): ''' Return if the GPG key described by the given keyid and timestamp are installed in the rpmdb. The keyid and timestamp should both be passed as integers. The ts is an rpm transaction set object Return values: - -1 key is not installed - 0 key with matching ID and timestamp is installed - 1 key with matching ID is installed but has a older timestamp - 2 key with matching ID is installed but has a newer timestamp No effort is made to handle duplicates. The first matching keyid is used to calculate the return result. ''' # Convert key id to 'RPM' form keyid = keyIdToRPMVer(keyid) # Search for hdr in ts.dbMatch('name', 'gpg-pubkey'): if hdr['version'] == keyid: installedts = int(hdr['release'], 16) if installedts == timestamp: return 0 elif installedts < timestamp: return 1 else: return 2 return -1 def import_key_to_pubring(rawkey, keyid, cachedir=None, gpgdir=None, make_ro_copy=True): # FIXME - cachedir can be removed from this method when we break api if gpgme is None: return False if not gpgdir: gpgdir = '%s/gpgdir' % cachedir if not os.path.exists(gpgdir): os.makedirs(gpgdir) key_fo = StringIO(rawkey) os.environ['GNUPGHOME'] = gpgdir # import the key ctx = gpgme.Context() fp = open(os.path.join(gpgdir, 'gpg.conf'), 'wb') fp.write('') fp.close() ctx.import_(key_fo) key_fo.close() # ultimately trust the key or pygpgme is definitionally stupid k = ctx.get_key(keyid) gpgme.editutil.edit_trust(ctx, k, gpgme.VALIDITY_ULTIMATE) if make_ro_copy: rodir = gpgdir + '-ro' if not os.path.exists(rodir): os.makedirs(rodir, mode=0755) for f in glob.glob(gpgdir + '/*'): basename = os.path.basename(f) ro_f = rodir + '/' + basename shutil.copy(f, ro_f) os.chmod(ro_f, 0755) fp = open(rodir + '/gpg.conf', 'w', 0755) # yes it is this stupid, why do you ask? opts="""lock-never no-auto-check-trustdb trust-model direct no-expensive-trust-checks no-permission-warning preserve-permissions """ fp.write(opts) fp.close() return True def return_keyids_from_pubring(gpgdir): if gpgme is None or not os.path.exists(gpgdir): return [] os.environ['GNUPGHOME'] = gpgdir ctx = gpgme.Context() keyids = [] for k in ctx.keylist(): for subkey in k.subkeys: if subkey.can_sign: keyids.append(subkey.keyid) return keyids def valid_detached_sig(sig_file, signed_file, gpghome=None): """takes signature , file that was signed and an optional gpghomedir""" if gpgme is None: return False if gpghome: if not os.path.exists(gpghome): return False os.environ['GNUPGHOME'] = gpghome if hasattr(sig_file, 'read'): sig = sig_file else: sig = open(sig_file, 'r') if hasattr(signed_file, 'read'): signed_text = signed_file else: signed_text = open(signed_file, 'r') plaintext = None ctx = gpgme.Context() try: sigs = ctx.verify(sig, signed_text, plaintext) except gpgme.GpgmeError, e: return False else: if not sigs: return False # is there ever a case where we care about a sig beyond the first one? thissig = sigs[0] if not thissig: return False if thissig.validity in (gpgme.VALIDITY_FULL, gpgme.VALIDITY_MARGINAL, gpgme.VALIDITY_ULTIMATE): return True return False def getCacheDir(tmpdir='/var/tmp', reuse=True, prefix='yum-'): """return a path to a valid and safe cachedir - only used when not running as root or when --tempcache is set""" uid = os.geteuid() try: usertup = pwd.getpwuid(uid) username = usertup[0] # we prefer ascii-only paths username = urllib.quote(username) except KeyError: return None # if it returns None then, well, it's bollocksed if reuse: # check for /var/tmp/yum-username-* - prefix = '%s%s-' % (prefix, username) dirpath = '%s/%s*' % (tmpdir, prefix) cachedirs = sorted(glob.glob(dirpath)) for thisdir in cachedirs: stats = os.lstat(thisdir) if S_ISDIR(stats[0]) and S_IMODE(stats[0]) == 448 and stats[4] == uid: return thisdir # make the dir (tempfile.mkdtemp()) cachedir = tempfile.mkdtemp(prefix=prefix, dir=tmpdir) return cachedir def sortPkgObj(pkg1 ,pkg2): """sorts a list of yum package objects by name""" if pkg1.name > pkg2.name: return 1 elif pkg1.name == pkg2.name: return 0 else: return -1 def newestInList(pkgs): """ Return the newest in the list of packages. """ ret = [ pkgs.pop() ] newest = ret[0] for pkg in pkgs: if pkg.verGT(newest): ret = [ pkg ] newest = pkg elif pkg.verEQ(newest): ret.append(pkg) return ret def version_tuple_to_string(evrTuple): """ Convert a tuple representing a package version to a string. @param evrTuple: A 3-tuple of epoch, version, and release. Return the string representation of evrTuple. """ (e, v, r) = evrTuple s = "" if e not in [0, '0', None]: s += '%s:' % e if v is not None: s += '%s' % v if r is not None: s += '-%s' % r return s def prco_tuple_to_string(prcoTuple): """returns a text string of the prco from the tuple format""" (name, flag, evr) = prcoTuple flags = {'GT':'>', 'GE':'>=', 'EQ':'=', 'LT':'<', 'LE':'<='} if flag is None: return name return '%s %s %s' % (name, flags[flag], version_tuple_to_string(evr)) def string_to_prco_tuple(prcoString): """returns a prco tuple (name, flags, (e, v, r)) for a string""" if type(prcoString) == types.TupleType: (n, f, v) = prcoString else: n = prcoString f = v = None # We love GPG keys as packages, esp. awesome provides like: # gpg(Fedora (13) ) if n[0] != '/' and not n.startswith("gpg("): # not a file dep - look at it for being versioned prco_split = n.split() if len(prco_split) == 3: n, f, v = prco_split # now we have 'n, f, v' where f and v could be None and None if f is not None and f not in constants.LETTERFLAGS: if f not in constants.SYMBOLFLAGS: try: f = flagToString(int(f)) except (ValueError,TypeError), e: raise Errors.MiscError, 'Invalid version flag: %s' % f else: f = constants.SYMBOLFLAGS[f] if type(v) in (types.StringType, types.NoneType, types.UnicodeType): (prco_e, prco_v, prco_r) = stringToVersion(v) elif type(v) in (types.TupleType, types.ListType): (prco_e, prco_v, prco_r) = v #now we have (n, f, (e, v, r)) for the thing specified return (n, f, (prco_e, prco_v, prco_r)) def refineSearchPattern(arg): """Takes a search string from the cli for Search or Provides and cleans it up so it doesn't make us vomit""" if re.search('[*{}?+]|\[.+\]', arg): restring = fnmatch.translate(arg) else: restring = re.escape(arg) return restring def _decompress_chunked(source, dest, ztype): if ztype not in _available_compression: msg = "%s compression not available" % ztype raise Errors.MiscError, msg if ztype == 'bz2': s_fn = bz2.BZ2File(source, 'r') elif ztype == 'xz': s_fn = lzma.LZMAFile(source, 'r') elif ztype == 'gz': s_fn = gzip.GzipFile(source, 'r') destination = open(dest, 'w') while True: try: data = s_fn.read(1024000) except (OSError, IOError, EOFError), e: msg = "Error reading from file %s: %s" % (source, str(e)) raise Errors.MiscError, msg if not data: break try: destination.write(data) except (OSError, IOError), e: msg = "Error writing to file %s: %s" % (dest, str(e)) raise Errors.MiscError, msg destination.close() s_fn.close() def bunzipFile(source,dest): """ Extract the bzipped contents of source to dest. """ _decompress_chunked(source, dest, ztype='bz2') def get_running_kernel_pkgtup(ts): """This takes the output of uname and figures out the pkgtup of the running kernel (name, arch, epoch, version, release).""" ver = os.uname()[2] # we glob for the file that MIGHT have this kernel # and then look up the file in our rpmdb. fns = sorted(glob.glob('/boot/vmlinuz*%s*' % ver)) for fn in fns: mi = ts.dbMatch('basenames', fn) for h in mi: e = h['epoch'] if h['epoch'] is None: e = '0' else: e = str(e) return (h['name'], h['arch'], e, h['version'], h['release']) return (None, None, None, None, None) def get_running_kernel_version_release(ts): """This takes the output of uname and figures out the (version, release) tuple for the running kernel.""" pkgtup = get_running_kernel_pkgtup(ts) if pkgtup[0] is not None: return (pkgtup[3], pkgtup[4]) return (None, None) def find_unfinished_transactions(yumlibpath='/var/lib/yum'): """returns a list of the timestamps from the filenames of the unfinished transactions remaining in the yumlibpath specified. """ timestamps = [] tsallg = '%s/%s' % (yumlibpath, 'transaction-all*') tsdoneg = '%s/%s' % (yumlibpath, 'transaction-done*') tsalls = glob.glob(tsallg) tsdones = glob.glob(tsdoneg) for fn in tsalls: if fn.endswith('disabled'): continue trans = os.path.basename(fn) timestamp = trans.replace('transaction-all.','') timestamps.append(timestamp) timestamps.sort() return timestamps def find_ts_remaining(timestamp, yumlibpath='/var/lib/yum'): """this function takes the timestamp of the transaction to look at and the path to the yum lib dir (defaults to /var/lib/yum) returns a list of tuples(action, pkgspec) for the unfinished transaction elements. Returns an empty list if none. """ to_complete_items = [] tsallpath = '%s/%s.%s' % (yumlibpath, 'transaction-all', timestamp) tsdonepath = '%s/%s.%s' % (yumlibpath,'transaction-done', timestamp) tsdone_items = [] if not os.path.exists(tsallpath): # something is wrong, here, probably need to raise _something_ return to_complete_items if os.path.exists(tsdonepath): tsdone_fo = open(tsdonepath, 'r') tsdone_items = tsdone_fo.readlines() tsdone_fo.close() tsall_fo = open(tsallpath, 'r') tsall_items = tsall_fo.readlines() tsall_fo.close() for item in tsdone_items: # this probably shouldn't happen but it's worth catching anyway if item not in tsall_items: continue tsall_items.remove(item) for item in tsall_items: item = item.replace('\n', '') if item == '': continue try: (action, pkgspec) = item.split() except ValueError, e: msg = "Transaction journal file %s is corrupt." % (tsallpath) raise Errors.MiscError, msg to_complete_items.append((action, pkgspec)) return to_complete_items def seq_max_split(seq, max_entries): """ Given a seq, split into a list of lists of length max_entries each. """ ret = [] num = len(seq) seq = list(seq) # Trying to use a set/etc. here is bad beg = 0 while num > max_entries: end = beg + max_entries ret.append(seq[beg:end]) beg += max_entries num -= max_entries ret.append(seq[beg:]) return ret _deletechars = ''.join(chr(i) for i in range(32) if i not in (9, 10, 13)) def to_xml(item, attrib=False): """ Returns xml-friendly utf-8 encoded string. Accepts utf-8, iso-8859-1, or unicode. """ if type(item) is str: # check if valid utf8 try: unicode(item, 'utf-8') except UnicodeDecodeError: # assume iso-8859-1 item = unicode(item, 'iso-8859-1').encode('utf-8') elif type(item) is unicode: item = item.encode('utf-8') elif item is None: return '' else: raise ValueError, 'String expected, got %s' % repr(item) # compat cruft... item = item.rstrip() # kill ivalid low bytes item = item.translate(None, _deletechars) # quote reserved XML characters item = item.replace('&', '&') item = item.replace('<', '<') item = item.replace('>', '>') if attrib: item = item.replace('"', '"') item = item.replace("'", ''') return item def unlink_f(filename): """ Call os.unlink, but don't die if the file isn't there. This is the main difference between "rm -f" and plain "rm". """ try: os.unlink(filename) except OSError, e: if e.errno not in (errno.ENOENT, errno.EPERM, errno.EACCES, errno.EROFS): raise def stat_f(filename, ignore_EACCES=False): """ Call os.stat(), but don't die if the file isn't there. Returns None. """ try: return os.stat(filename) except OSError, e: if e.errno in (errno.ENOENT, errno.ENOTDIR): return None if ignore_EACCES and e.errno == errno.EACCES: return None raise def _getloginuid(): """ Get the audit-uid/login-uid, if available. None is returned if there was a problem. Note that no caching is done here. """ # We might normally call audit.audit_getloginuid(), except that requires # importing all of the audit module. And it doesn't work anyway: BZ 518721 try: fo = open("/proc/self/loginuid") except IOError: return None data = fo.read() try: return int(data) except ValueError: return None _cached_getloginuid = None def getloginuid(): """ Get the audit-uid/login-uid, if available. None is returned if there was a problem. The value is cached, so you don't have to save it. """ global _cached_getloginuid if _cached_getloginuid is None: _cached_getloginuid = _getloginuid() return _cached_getloginuid # ---------- i18n ---------- import locale def setup_locale(override_codecs=True, override_time=False): # This test needs to be before locale.getpreferredencoding() as that # does setlocale(LC_CTYPE, "") try: locale.setlocale(locale.LC_ALL, '') # set time to C so that we output sane things in the logs (#433091) if override_time: locale.setlocale(locale.LC_TIME, 'C') except locale.Error, e: # default to C locale if we get a failure. print >> sys.stderr, 'Failed to set locale, defaulting to C' os.environ['LC_ALL'] = 'C' locale.setlocale(locale.LC_ALL, 'C') if override_codecs: class UnicodeStream: def __init__(self, stream, encoding): self.stream = stream self.encoding = encoding def write(self, s): if isinstance(s, unicode): s = s.encode(self.encoding, 'replace') self.stream.write(s) def __getattr__(self, name): return getattr(self.stream, name) sys.stdout = UnicodeStream(sys.stdout, locale.getpreferredencoding()) def get_my_lang_code(): try: mylang = locale.getlocale(locale.LC_MESSAGES) except ValueError, e: # This is RHEL-5 python crack, Eg. en_IN can't be parsed properly mylang = (None, None) if mylang == (None, None): # odd :) mylang = 'C' else: mylang = '.'.join(mylang) return mylang def return_running_pids(): """return list of running processids, excluding this one""" mypid = os.getpid() pids = [] for fn in glob.glob('/proc/[0123456789]*'): if mypid == os.path.basename(fn): continue pids.append(os.path.basename(fn)) return pids def get_open_files(pid): """returns files open from this pid""" files = [] maps_f = '/proc/%s/maps' % pid try: maps = open(maps_f, 'r') except (IOError, OSError), e: return files for line in maps: if line.find('fd:') == -1: continue line = line.replace('\n', '') slash = line.find('/') filename = line[slash:] filename = filename.replace('(deleted)', '') #only mildly retarded filename = filename.strip() if filename not in files: files.append(filename) cli_f = '/proc/%s/cmdline' % pid try: cli = open(cli_f, 'r') except (IOError, OSError), e: return files cmdline = cli.read() if cmdline.find('\00') != -1: cmds = cmdline.split('\00') for i in cmds: if i.startswith('/'): files.append(i) return files def get_uuid(savepath): """create, store and return a uuid. If a stored one exists, report that if it cannot be stored, return a random one""" if os.path.exists(savepath): return open(savepath, 'r').read() else: try: from uuid import uuid4 except ImportError: myid = open('/proc/sys/kernel/random/uuid', 'r').read() else: myid = str(uuid4()) try: sf = open(savepath, 'w') sf.write(myid) sf.flush() sf.close() except (IOError, OSError), e: pass return myid def decompress(filename, dest=None, fn_only=False, check_timestamps=False): """take a filename and decompress it into the same relative location. if the file is not compressed just return the file""" out = dest if not dest: out = filename if filename.endswith('.gz'): ztype='gz' if not dest: out = filename.replace('.gz', '') elif filename.endswith('.bz') or filename.endswith('.bz2'): ztype='bz2' if not dest: if filename.endswith('.bz'): out = filename.replace('.bz','') else: out = filename.replace('.bz2', '') elif filename.endswith('.xz'): ztype='xz' if not dest: out = filename.replace('.xz', '') else: return filename # returning the same file since it is not compressed if check_timestamps: fi = stat_f(filename) fo = stat_f(out) if fi and fo: # Eliminate sub second precision in mtime before comparison, # see http://bugs.python.org/issue14127 if int(fo.st_mtime) == int(fi.st_mtime): return out if fn_only: # out exists but not valid return None if not fn_only: try: _decompress_chunked(filename, out, ztype) if check_timestamps and fi: os.utime(out, (fi.st_mtime, fi.st_mtime)) except: unlink_f(out) raise return out def repo_gen_decompress(filename, generated_name, cached=False): """ This is a wrapper around decompress, where we work out a cached generated name, and use check_timestamps. filename _must_ be from a repo. and generated_name is the type of the file. """ dest = os.path.dirname(filename) + '/gen/' + generated_name try: return decompress(filename, dest=dest, check_timestamps=True) except (OSError, IOError), e: if cached and e.errno == errno.EACCES: return None raise def read_in_items_from_dot_dir(thisglob, line_as_list=True): """takes a glob of a dir (like /etc/foo.d/*.foo) returns a list of all the lines in all the files matching that glob, ignores comments and blank lines, optional paramater 'line_as_list tells whether to treat each line as a space or comma-separated list, defaults to True""" results = [] for fname in glob.glob(thisglob): for line in open(fname): if re.match('\s*(#|$)', line): continue line = line.rstrip() # no more trailing \n's line = line.lstrip() # be nice if not line: continue if line_as_list: line = line.replace('\n', ' ') line = line.replace(',', ' ') results.extend(line.split()) continue results.append(line) return results __cached_cElementTree = None def _cElementTree_import(): """ Importing xElementTree all the time, when we often don't need it, is a huge timesink. This makes python -c 'import yum' suck. So we hide it behind this function. And have accessors. """ global __cached_cElementTree if __cached_cElementTree is None: try: from xml.etree import cElementTree except ImportError: import cElementTree __cached_cElementTree = cElementTree def cElementTree_iterparse(filename): """ Lazily load/run: cElementTree.iterparse """ _cElementTree_import() return __cached_cElementTree.iterparse(filename) def cElementTree_xmlparse(filename): """ Lazily load/run: cElementTree.parse """ _cElementTree_import() return __cached_cElementTree.parse(filename) def filter_pkgs_repoid(pkgs, repoid): """ Given a list of packages, filter them for those "in" the repoid. uses from_repo for installed packages, used by repo-pkgs commands. """ if repoid is None: return pkgs ret = [] for pkg in pkgs: if pkg.repoid == 'installed': if 'from_repo' not in pkg.yumdb_info: continue if pkg.yumdb_info.from_repo != repoid: continue elif pkg.repoid != repoid: continue ret.append(pkg) return ret def validate_repoid(repoid): """Return the first invalid char found in the repoid, or None.""" allowed_chars = string.ascii_letters + string.digits + '-_.:' for char in repoid: if char not in allowed_chars: return char else: return None def disk_usage(path): """Return disk usage of the given filename, recursively for dirs.""" def usage(path): return os.stat(path).st_blocks * 512 total = usage(path) if not os.path.isdir(path): return total for root, dirs, files in os.walk(path): paths = (os.path.join(root, entry) for entry in dirs + files) total += sum(usage(path) for path in paths) return total PK[}BBsite-packages/yum/repos.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2004 Duke University import re import types import logging import misc import os import Errors from packageSack import MetaSack import urlgrabber.grabber from weakref import proxy as weakref class _wrap_ayum_getKeyForRepo: """ This is a wrapper for calling YumBase.getKeyForRepo() because otherwise we take a real reference through the bound method and that is d00m (this applies to YumBase and RepoStorage, hence why we have a separate class). A "better" fix might be to explicitly pass the YumBase instance to the callback ... API change! """ def __init__(self, ayum, ca=False): self.ayum = weakref(ayum) self.ca = ca def __call__(self, repo, callback=None): if self.ca: return self.ayum.getCAKeyForRepo(repo, callback) return self.ayum.getKeyForRepo(repo, callback) class RepoStorage: """This class contains multiple repositories and core configuration data about them.""" def __init__(self, ayum): self.repos = {} # list of repos by repoid pointing a repo object # of repo options/misc data self.callback = None # progress callback used for populateSack() for importing the xml files self.cache = 0 self.pkgSack = MetaSack() self.logger = logging.getLogger("yum.RepoStorage") self._setup = False self.ayum = weakref(ayum) # callbacks for handling gpg key imports for repomd.xml sig checks # need to be set from outside of the repos object to do anything # even quasi-useful # defaults to what is probably sane-ish self.gpg_import_func = _wrap_ayum_getKeyForRepo(ayum) self.gpgca_import_func = _wrap_ayum_getKeyForRepo(ayum, ca=True) self.confirm_func = None # This allow listEnabled() to be O(1) most of the time. self._cache_enabled_repos = [] self.quick_enable_disable = {} # This allows plugins to setup a repo. just before the first # listEnabled() call. self._list_enabled_hasrun = False def retrieveAllMD(self): """ Download metadata for all enabled repositories, based on mdpolicy. """ if not hasattr(urlgrabber.grabber, 'parallel_wait'): return repos = [] for repo in self.listEnabled(): if repo.cache: continue try: dl = repo._async and repo._commonLoadRepoXML(repo) except Errors.RepoError, e: if not repo.skip_if_unavailable: raise self.disableRepo(repo.id) dl = False if dl: mdtypes = repo._mdpolicy2mdtypes() downloading = repo._commonRetrieveDataMD_list(mdtypes) repos.append((repo, downloading, [False])) # with sizes first, then without sizes.. for no_size in (False, True): for repo, downloading, error in repos: def failfunc(obj, error=error): error[0] = True for (ndata, nmdtype) in downloading: if (ndata.size is None) == no_size: repo._retrieveMD(nmdtype, async=True, failfunc=failfunc) urlgrabber.grabber.parallel_wait() # done or revert for repo, downloading, error in repos: if error[0]: # some MD failed? repo._revertOldRepoXML() else: repo._commonRetrieveDataMD_done(downloading) def doSetup(self, thisrepo = None): if thisrepo is None: # Just in case the prelistenabledrepos plugin point hasn't run. self.listEnabled() self.ayum.plugins.run('prereposetup') if thisrepo is None: repos = self.listEnabled() else: repos = self.findRepos(thisrepo) if len(repos) < 1: self.logger.debug('No Repositories Available to Set Up') if hasattr(urlgrabber.grabber, 'pycurl'): # Must do basename checking, on cert. files... cert_basenames = {} for repo in self.listEnabled(): if repo.sslclientcert: bn = os.path.basename(repo.sslclientcert) other = cert_basenames.setdefault(bn, repo) if repo.sslclientcert != other.sslclientcert: msg = 'sslclientcert basename shared between %s and %s' raise Errors.ConfigError, msg % (repo, other) for repo in repos: repo.setup(self.ayum.conf.cache, self.ayum.mediagrabber, gpg_import_func = self.gpg_import_func, confirm_func=self.confirm_func, gpgca_import_func = self.gpgca_import_func) # if we come back from setup NOT enabled then mark as disabled # so nothing else touches us if not repo.enabled: self.disableRepo(repo.id) else: pkgdir = getattr(self.ayum.conf, 'downloaddir', None) if pkgdir: repo.pkgdir = pkgdir self._setup = True self.retrieveAllMD() self.ayum.plugins.run('postreposetup') def __str__(self): return str(self.repos.keys()) def __del__(self): try: self.close() except Errors.RepoError, e: self.logger.debug("Exception %s %s in %s ignored" % (repr(e), str(e), self.__del__)) def close(self): for repo in self.repos.values(): repo.close() def add(self, repoobj): if repoobj.id in self.repos: raise Errors.DuplicateRepoError, 'Repository %s is listed more than once in the configuration' % (repoobj.id) self.repos[repoobj.id] = repoobj if hasattr(repoobj, 'quick_enable_disable'): self.quick_enable_disable.update(repoobj.quick_enable_disable) repoobj.quick_enable_disable = self.quick_enable_disable else: self._cache_enabled_repos = None # At least pulp reuses RepoStorage but doesn't have a "real" YumBase() # so we can't guarantee new YumBase() attrs. exist. if not hasattr(self.ayum, '_override_sigchecks'): repoobj._override_sigchecks = False else: repoobj._override_sigchecks = self.ayum._override_sigchecks def delete(self, repoid): if repoid in self.repos: thisrepo = self.repos[repoid] thisrepo.close() del self.repos[repoid] def sort(self): repolist = self.repos.values() repolist.sort() return repolist def getRepo(self, repoid): try: return self.repos[repoid] except KeyError, e: raise Errors.RepoError, \ 'Error getting repository data for %s, repository not found' % (repoid) def findRepos(self, pattern, name_match=False, ignore_case=False): """ Find all repositories matching fnmatch `pattern` on the repo.id, can also do case insensitive searches and/or search on the name.""" if pattern in self.repos: # Minor opt. as we do this a lot... return [self.repos[pattern]] result = [] for item in pattern.split(','): item = item.strip() match = misc.compile_pattern(item.strip(), ignore_case) for name,repo in self.repos.items(): assert name == repo.id if match(name): result.append(repo) elif name_match and match(repo.name): result.append(repo) return result def disableRepo(self, repoid): """disable a repository from use fnmatch wildcards may be used to disable a group of repositories. returns repoid of disabled repos as list """ repos = [] if misc.re_glob(repoid) or repoid.find(',') != -1: for repo in self.findRepos(repoid): repos.append(repo.id) repo.disable() else: thisrepo = self.getRepo(repoid) repos.append(thisrepo.id) thisrepo.disable() return repos def enableRepo(self, repoid): """enable a repository for use fnmatch wildcards may be used to enable a group of repositories. returns repoid of enables repos as list """ repos = [] if misc.re_glob(repoid) or repoid.find(',') != -1: for repo in self.findRepos(repoid): repos.append(repo.id) repo.enable() else: thisrepo = self.getRepo(repoid) repos.append(thisrepo.id) thisrepo.enable() return repos def listEnabled(self): """return list of enabled repo objects""" if not self._list_enabled_hasrun: self.ayum.plugins.run('prelistenabledrepos') self._list_enabled_hasrun = True if (self._cache_enabled_repos is not None and not self.quick_enable_disable): return self._cache_enabled_repos returnlist = [] for repo in self.repos.values(): if repo.isEnabled(): returnlist.append(repo) returnlist.sort() if self._cache_enabled_repos is not None: self._cache_enabled_repos = returnlist self.quick_enable_disable.clear() return returnlist def listGroupsEnabled(self): """return a list of repo objects that have groups enabled""" returnlist = [] for repo in self.listEnabled(): if repo.enablegroups: returnlist.append(repo) return returnlist def setCache(self, cacheval): """sets cache value in all repos""" self.cache = cacheval for repo in self.repos.values(): repo.cache = cacheval def setCacheDir(self, cachedir): """sets the cachedir value in all repos""" self._cachedir = cachedir for repo in self.repos.values(): if cachedir != repo.basecachedir: repo.old_base_cache_dir = repo.basecachedir repo.basecachedir = cachedir def setProgressBar(self, obj, multi_obj=None): """sets the progress bar for downloading files from repos""" for repo in self.repos.values(): repo.setCallback(obj, multi_obj) def setFailureCallback(self, obj): """sets the failure callback for all repos""" for repo in self.repos.values(): repo.setFailureObj(obj) def setMirrorFailureCallback(self, obj): """sets the failure callback for all mirrors""" for repo in self.repos.values(): repo.setMirrorFailureObj(obj) def setInterruptCallback(self, callback): for repo in self.repos.values(): repo.setInterruptCallback(callback) def getPackageSack(self): return self.pkgSack def populateSack(self, which='enabled', mdtype='metadata', callback=None, cacheonly=0): """ This populates the package sack from the repositories, two optional arguments: - which='repoid, enabled, all' - mdtype='metadata, filelists, otherdata, all' """ if not self._setup: self.doSetup() if not callback: callback = self.callback myrepos = [] if which == 'enabled': myrepos = self.listEnabled() elif which == 'all': myrepos = self.repos.values() else: if type(which) == types.ListType: for repo in which: if isinstance(repo, Repository): myrepos.append(repo) else: repobj = self.getRepo(repo) myrepos.append(repobj) elif type(which) == types.StringType: repobj = self.getRepo(which) myrepos.append(repobj) if mdtype == 'all': data = ['metadata', 'filelists', 'otherdata'] else: data = [ mdtype ] if hasattr(urlgrabber.grabber, 'parallel_wait'): # download all metadata in parallel for repo in myrepos: if repo.cache: continue if repo._async: sack = repo.getPackageSack() sack._retrieve_async(repo, data) urlgrabber.grabber.parallel_wait() for repo in myrepos: sack = repo.getPackageSack() try: sack.populate(repo, mdtype, callback, cacheonly) except TypeError, e: if not e.args[0].startswith('Parsing'): raise if mdtype in ['all', 'metadata'] and repo.skip_if_unavailable: self.disableRepo(repo.id) else: raise Errors.RepoError(e.args[0]) except Errors.RepoError, e: if mdtype in ['all', 'metadata'] and repo.skip_if_unavailable: self.disableRepo(repo.id) else: raise else: self.pkgSack.addSack(repo.id, sack) class Repository: """this is an actual repository object""" def __init__(self, repoid): self.id = repoid self.quick_enable_disable = {} self.disable() self._xml2sqlite_local = False def __cmp__(self, other): """ Sort base class repos. by alphanumeric on their id, also see __cmp__ in YumRepository(). """ if self.id > other.id: return 1 elif self.id < other.id: return -1 else: return 0 def __str__(self): return self.id def __hash__(self): return hash(self.id) def __del__(self): try: self.close() except Errors.RepoError, e: self.logger.debug("Exception %s %s in %s ignored" % (repr(e), str(e), self.__del__)) def _ui_id(self): """ Show self.id, so we can use it and override it. """ return self.id ui_id = property(_ui_id) def close(self): pass def setAttribute(self, key, value): """sets a generic attribute of this repository""" setattr(self, key, value) def getAttribute(self, key): return getattr(self, key, None) def isEnabled(self): enabled = self.getAttribute('enabled') return enabled is not None and enabled def enable(self): self.setAttribute('enabled', 1) self.quick_enable_disable[self.id] = True def disable(self): self.setAttribute('enabled', 0) self.quick_enable_disable[self.id] = False def getExcludePkgList(self): excludeList = self.getAttribute('exclude') return excludeList or [] def getIncludePkgList(self): includeList = self.getAttribute('includepkgs') return includeList or [] # Abstract interface def ready(self): raise NotImplementedError() def getGroupLocation(self): raise NotImplementedError() def getPackageSack(self): raise NotImplementedError() def setup(self, cache): raise NotImplementedError() def setCallback(self, callback): raise NotImplementedError() def setFailureObj(self, obj): raise NotImplementedError() def setMirrorFailureObj(self, obj): raise NotImplementedError() def getPackage(self, package, checkfunc = None, text = None, cache = True): raise NotImplementedError() def getHeader(self, package, checkfunc = None, reget = 'simple', cache = True): raise NotImplementedError() PK[QQsite-packages/yum/i18n.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. def dummy_wrapper(str): ''' Dummy Translation wrapper, just returning the same string. ''' return to_unicode(str) def dummyP_wrapper(str1, str2, n): ''' Dummy Plural Translation wrapper, just returning the singular or plural string. ''' if n == 1: return str1 else: return str2 # This is ported from ustr_utf8_* which I got from: # http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c # I've tried to leave it close to the original C (same names etc.) so that # it is easy to read/compare both versions... # ----------------------------- BEG utf8 ----------------------------- # This is an implementation of wcwidth() and wcswidth() (defined in # IEEE Std 1002.1-2001) for Unicode. # # http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html # http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html # # In fixed-width output devices, Latin characters all occupy a single # "cell" position of equal width, whereas ideographic CJK characters # occupy two such cells. Interoperability between terminal-line # applications and (teletype-style) character terminals using the # UTF-8 encoding requires agreement on which character should advance # the cursor by how many cell positions. No established formal # standards exist at present on which Unicode character shall occupy # how many cell positions on character terminals. These routines are # a first attempt of defining such behavior based on simple rules # applied to data provided by the Unicode Consortium. # # [...] # # Markus Kuhn -- 2007-05-26 (Unicode 5.0) # # Permission to use, copy, modify, and distribute this software # for any purpose and without fee is hereby granted. The author # disclaims all warranties with regard to this software. # # Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c def __utf8_bisearch(ucs, table): """ auxiliary function for binary search in interval table. """ min = 0 max = len(table) - 1 if ucs < table[min][0] or ucs > table[max][1]: return False while max >= min: mid = (min + max) / 2 if ucs > table[mid][1]: min = mid + 1 elif ucs < table[mid][0]: max = mid - 1 else: return True return False # sorted list of non-overlapping intervals of non-spacing characters # generated by "uniset +cat=Me +cat=Mn +cat=Cf -00AD +1160-11FF +200B c" __combining = ( ( 0x0300, 0x036F ), ( 0x0483, 0x0486 ), ( 0x0488, 0x0489 ), ( 0x0591, 0x05BD ), ( 0x05BF, 0x05BF ), ( 0x05C1, 0x05C2 ), ( 0x05C4, 0x05C5 ), ( 0x05C7, 0x05C7 ), ( 0x0600, 0x0603 ), ( 0x0610, 0x0615 ), ( 0x064B, 0x065E ), ( 0x0670, 0x0670 ), ( 0x06D6, 0x06E4 ), ( 0x06E7, 0x06E8 ), ( 0x06EA, 0x06ED ), ( 0x070F, 0x070F ), ( 0x0711, 0x0711 ), ( 0x0730, 0x074A ), ( 0x07A6, 0x07B0 ), ( 0x07EB, 0x07F3 ), ( 0x0901, 0x0902 ), ( 0x093C, 0x093C ), ( 0x0941, 0x0948 ), ( 0x094D, 0x094D ), ( 0x0951, 0x0954 ), ( 0x0962, 0x0963 ), ( 0x0981, 0x0981 ), ( 0x09BC, 0x09BC ), ( 0x09C1, 0x09C4 ), ( 0x09CD, 0x09CD ), ( 0x09E2, 0x09E3 ), ( 0x0A01, 0x0A02 ), ( 0x0A3C, 0x0A3C ), ( 0x0A41, 0x0A42 ), ( 0x0A47, 0x0A48 ), ( 0x0A4B, 0x0A4D ), ( 0x0A70, 0x0A71 ), ( 0x0A81, 0x0A82 ), ( 0x0ABC, 0x0ABC ), ( 0x0AC1, 0x0AC5 ), ( 0x0AC7, 0x0AC8 ), ( 0x0ACD, 0x0ACD ), ( 0x0AE2, 0x0AE3 ), ( 0x0B01, 0x0B01 ), ( 0x0B3C, 0x0B3C ), ( 0x0B3F, 0x0B3F ), ( 0x0B41, 0x0B43 ), ( 0x0B4D, 0x0B4D ), ( 0x0B56, 0x0B56 ), ( 0x0B82, 0x0B82 ), ( 0x0BC0, 0x0BC0 ), ( 0x0BCD, 0x0BCD ), ( 0x0C3E, 0x0C40 ), ( 0x0C46, 0x0C48 ), ( 0x0C4A, 0x0C4D ), ( 0x0C55, 0x0C56 ), ( 0x0CBC, 0x0CBC ), ( 0x0CBF, 0x0CBF ), ( 0x0CC6, 0x0CC6 ), ( 0x0CCC, 0x0CCD ), ( 0x0CE2, 0x0CE3 ), ( 0x0D41, 0x0D43 ), ( 0x0D4D, 0x0D4D ), ( 0x0DCA, 0x0DCA ), ( 0x0DD2, 0x0DD4 ), ( 0x0DD6, 0x0DD6 ), ( 0x0E31, 0x0E31 ), ( 0x0E34, 0x0E3A ), ( 0x0E47, 0x0E4E ), ( 0x0EB1, 0x0EB1 ), ( 0x0EB4, 0x0EB9 ), ( 0x0EBB, 0x0EBC ), ( 0x0EC8, 0x0ECD ), ( 0x0F18, 0x0F19 ), ( 0x0F35, 0x0F35 ), ( 0x0F37, 0x0F37 ), ( 0x0F39, 0x0F39 ), ( 0x0F71, 0x0F7E ), ( 0x0F80, 0x0F84 ), ( 0x0F86, 0x0F87 ), ( 0x0F90, 0x0F97 ), ( 0x0F99, 0x0FBC ), ( 0x0FC6, 0x0FC6 ), ( 0x102D, 0x1030 ), ( 0x1032, 0x1032 ), ( 0x1036, 0x1037 ), ( 0x1039, 0x1039 ), ( 0x1058, 0x1059 ), ( 0x1160, 0x11FF ), ( 0x135F, 0x135F ), ( 0x1712, 0x1714 ), ( 0x1732, 0x1734 ), ( 0x1752, 0x1753 ), ( 0x1772, 0x1773 ), ( 0x17B4, 0x17B5 ), ( 0x17B7, 0x17BD ), ( 0x17C6, 0x17C6 ), ( 0x17C9, 0x17D3 ), ( 0x17DD, 0x17DD ), ( 0x180B, 0x180D ), ( 0x18A9, 0x18A9 ), ( 0x1920, 0x1922 ), ( 0x1927, 0x1928 ), ( 0x1932, 0x1932 ), ( 0x1939, 0x193B ), ( 0x1A17, 0x1A18 ), ( 0x1B00, 0x1B03 ), ( 0x1B34, 0x1B34 ), ( 0x1B36, 0x1B3A ), ( 0x1B3C, 0x1B3C ), ( 0x1B42, 0x1B42 ), ( 0x1B6B, 0x1B73 ), ( 0x1DC0, 0x1DCA ), ( 0x1DFE, 0x1DFF ), ( 0x200B, 0x200F ), ( 0x202A, 0x202E ), ( 0x2060, 0x2063 ), ( 0x206A, 0x206F ), ( 0x20D0, 0x20EF ), ( 0x302A, 0x302F ), ( 0x3099, 0x309A ), ( 0xA806, 0xA806 ), ( 0xA80B, 0xA80B ), ( 0xA825, 0xA826 ), ( 0xFB1E, 0xFB1E ), ( 0xFE00, 0xFE0F ), ( 0xFE20, 0xFE23 ), ( 0xFEFF, 0xFEFF ), ( 0xFFF9, 0xFFFB ), ( 0x10A01, 0x10A03 ), ( 0x10A05, 0x10A06 ), ( 0x10A0C, 0x10A0F ), ( 0x10A38, 0x10A3A ), ( 0x10A3F, 0x10A3F ), ( 0x1D167, 0x1D169 ), ( 0x1D173, 0x1D182 ), ( 0x1D185, 0x1D18B ), ( 0x1D1AA, 0x1D1AD ), ( 0x1D242, 0x1D244 ), ( 0xE0001, 0xE0001 ), ( 0xE0020, 0xE007F ), ( 0xE0100, 0xE01EF )) def __utf8_ucp_width(ucs): """ Get the textual width of a ucs character. """ # test for 8-bit control characters if ucs == 0: return 0 if ucs < 32 or (ucs >= 0x7f and ucs < 0xa0): return (-1) if __utf8_bisearch(ucs, __combining): return 0 # if we arrive here, ucs is not a combining or C0/C1 control character return (1 + (ucs >= 0x1100 and (ucs <= 0x115f or # Hangul Jamo init. consonants ucs == 0x2329 or ucs == 0x232a or (ucs >= 0x2e80 and ucs <= 0xa4cf and ucs != 0x303f) or # CJK ... Yi (ucs >= 0xac00 and ucs <= 0xd7a3) or # Hangul Syllables (ucs >= 0xf900 and ucs <= 0xfaff) or # CJK Compatibility Ideographs (ucs >= 0xfe10 and ucs <= 0xfe19) or # Vertical forms (ucs >= 0xfe30 and ucs <= 0xfe6f) or # CJK Compatibility Forms (ucs >= 0xff00 and ucs <= 0xff60) or # Fullwidth Forms (ucs >= 0xffe0 and ucs <= 0xffe6) or (ucs >= 0x20000 and ucs <= 0x2fffd) or (ucs >= 0x30000 and ucs <= 0x3fffd)))) def __utf8_iter_ints(msg): for byte in to_utf8(msg): yield ord(byte) def __utf8_iter_ucs(msg): uiter = __utf8_iter_ints(msg) for byte0 in uiter: if byte0 < 0x80: # 0xxxxxxx yield (byte0, 1) elif (byte0 & 0xe0) == 0xc0: # 110XXXXx 10xxxxxx byte1 = uiter.next() if (((byte1 & 0xc0) != 0x80) or ((byte0 & 0xfe) == 0xc0)): # overlong? yield (None, 2) return yield ((((byte0 & 0x1f) << 6) | (byte1 & 0x3f)), 2) elif (byte0 & 0xf0) == 0xe0: # 1110XXXX 10Xxxxxx 10xxxxxx byte1 = uiter.next() byte2 = uiter.next() if (((byte1 & 0xc0) != 0x80) or ((byte2 & 0xc0) != 0x80) or ((byte0 == 0xe0) and ((byte1 & 0xe0) == 0x80)) or # overlong? ((byte0 == 0xed) and ((byte1 & 0xe0) == 0xa0)) or # surrogate? ((byte0 == 0xef) and (byte1 == 0xbf) and ((byte2 & 0xfe) == 0xbe))): # U+FFFE or U+FFFF? yield (None, 3) return yield ((((byte0 & 0x0f) << 12) | ((byte1 & 0x3f) << 6) | (byte2 & 0x3f)), 3) elif (byte0 & 0xf8) == 0xf0: # 11110XXX 10XXxxxx 10xxxxxx 10xxxxxx byte1 = uiter.next() byte2 = uiter.next() byte3 = uiter.next() if (((byte1 & 0xc0) != 0x80) or ((byte2 & 0xc0) != 0x80) or ((byte3 & 0xc0) != 0x80) or ((byte0 == 0xf0) and ((byte1 & 0xf0) == 0x80)) or # overlong? ((byte0 == 0xf4) and (byte1 > 0x8f)) or # > U+10FFFF? (byte0 > 0xf4)): # > U+10FFFF? yield (None, 4) return yield ((((byte0 & 0x07) << 18) | ((byte1 & 0x3f) << 12) | ((byte2 & 0x3f) << 6) | (byte3 & 0x3f)), 4) else: yield (None, 1) return def utf8_width(msg): """ Get the textual width of a utf8 string. """ ret = 0 for (ucs, bytes) in __utf8_iter_ucs(msg): if ucs is None: ret += bytes # Ugly ... should not feed bad utf8 else: ret += __utf8_ucp_width(ucs) return ret def utf8_width_chop(msg, chop=None): """ Return the textual width of a utf8 string, chopping it to a specified value. This is what you want to use instead of %.*s, as it does the "right" thing with regard to utf-8 sequences. Eg. "%.*s" % (10, msg) <= becomes => "%s" % (utf8_width_chop(msg, 10)) """ if chop is None or utf8_width(msg) <= chop: return utf8_width(msg), msg ret = 0 passed_unicode = isinstance(msg, unicode) msg_bytes = 0 msg = to_utf8(msg) for (ucs, bytes) in __utf8_iter_ucs(msg): if ucs is None: width = bytes # Ugly ... should not feed bad utf8 else: width = __utf8_ucp_width(ucs) if chop is not None and (ret + width) > chop: msg = msg[:msg_bytes] break ret += width msg_bytes += bytes if passed_unicode: msg = to_unicode(msg) return ret, msg def utf8_width_fill(msg, fill, chop=None, left=True, prefix='', suffix=''): """ Expand a utf8 msg to a specified "width" or chop to same. Expansion can be left or right. This is what you want to use instead of %*.*s, as it does the "right" thing with regard to utf-8 sequences. prefix and suffix should be used for "invisible" bytes, like highlighting. Eg. "%-*.*s" % (10, 20, msg) <= becomes => "%s" % (utf8_width_fill(msg, 10, 20)). "%20.10s" % (msg) <= becomes => "%s" % (utf8_width_fill(msg, 20, 10, left=False)). "%s%.10s%s" % (prefix, msg, suffix) <= becomes => "%s" % (utf8_width_fill(msg, 0, 10, prefix=prefix, suffix=suffix)). """ passed_msg = msg width, msg = utf8_width_chop(msg, chop) if width >= fill: if prefix or suffix: msg = ''.join([prefix, msg, suffix]) else: extra = " " * (fill - width) if left: msg = ''.join([prefix, msg, suffix, extra]) else: msg = ''.join([extra, prefix, msg, suffix]) if isinstance(passed_msg, unicode): return to_unicode(msg) return msg def utf8_valid(msg): """ Return True/False is the text is valid utf8. """ for (ucs, bytes) in __utf8_iter_ucs(msg): if ucs is None: return False return True def _utf8_width_le(width, *args): """ Minor speed hack, we often want to know "does X fit in Y". It takes "a while" to work out a utf8_width() (see above), and we know that a utf8 character is always <= byte. So given: assert bytes >= characters characters <= width? ...we can change to: bytes <= width or characters <= width ...and bytes are much faster. """ # This assumes that all args. are utf8. ret = 0 for arg in args: ret += len(arg) if ret <= width: return True ret = 0 for arg in args: ret += utf8_width(arg) return ret <= width def utf8_text_wrap(text, width=70, initial_indent='', subsequent_indent=''): """ Works like we want textwrap.wrap() to work, uses utf-8 data and doesn't screw up lists/blocks/etc. """ # Tested with: # yum info robodoc gpicview php-pear-Net-Socket wmctrl ustr moreutils # mediawiki-HNP ocspd insight yum mousepad # ...at 120, 80 and 40 chars. # Also, notable among lots of others, searching for "\n ": # exim-clamav, jpackage-utils, tcldom, synaptics, "quake3", # perl-Class-Container, ez-ipupdate, perl-Net-XMPP, "kipi-plugins", # perl-Apache-DBI, netcdf, python-configobj, "translate-toolkit", alpine, # "udunits", "conntrack-tools" # # Note that, we "fail" on: # alsa-plugins-jack, setools*, dblatex, uisp, "perl-Getopt-GUI-Long", # suitesparse, "synce-serial", writer2latex, xenwatch, ltsp-utils passed_unicode = isinstance(text, unicode) def _indent_at_beg(line): count = 0 byte = 'X' for byte in line: if byte != ' ': break count += 1 if byte not in ("-", "*", ".", "o", '\xe2'): return count, 0 list_chr = utf8_width_chop(line[count:], 1)[1] if list_chr in ("-", "*", ".", "o", "\xe2\x80\xa2", "\xe2\x80\xa3", "\xe2\x88\x98"): nxt = _indent_at_beg(line[count+len(list_chr):]) nxt = nxt[1] or nxt[0] if nxt: return count, count + 1 + nxt return count, 0 initial_indent = to_utf8(initial_indent) subsequent_indent = to_utf8(subsequent_indent) text = to_utf8(text).rstrip('\n') lines = to_utf8(text).replace('\t', ' ' * 8).split('\n') ret = [] indent = initial_indent wrap_last = False csab = 0 cspc_indent = 0 for line in lines: line = line.rstrip(' ') (lsab, lspc_indent) = (csab, cspc_indent) (csab, cspc_indent) = _indent_at_beg(line) force_nl = False # We want to stop wrapping under "certain" conditions: if wrap_last and cspc_indent: # if line starts a list or force_nl = True if wrap_last and csab == len(line):# is empty line force_nl = True if wrap_last and not lspc_indent: # if line doesn't continue a list and if csab >= 4 and csab != lsab: # is "block indented" force_nl = True if force_nl: ret.append(indent.rstrip(' ')) indent = subsequent_indent wrap_last = False if csab == len(line): # empty line, remove spaces to make it easier. line = '' if wrap_last: line = line.lstrip(' ') cspc_indent = lspc_indent if _utf8_width_le(width, indent, line): wrap_last = False ret.append(indent + line) indent = subsequent_indent continue wrap_last = True words = line.split(' ') line = indent spcs = cspc_indent if not spcs and csab >= 4: spcs = csab for word in words: if (not _utf8_width_le(width, line, word) and utf8_width(line) > utf8_width(subsequent_indent)): ret.append(line.rstrip(' ')) line = subsequent_indent + ' ' * spcs line += word line += ' ' indent = line.rstrip(' ') + ' ' if wrap_last: ret.append(indent.rstrip(' ')) if passed_unicode: return map(to_unicode, ret) return ret def utf8_text_fill(text, *args, **kwargs): """ Works like we want textwrap.fill() to work, uses utf-8 data and doesn't screw up lists/blocks/etc. """ return '\n'.join(utf8_text_wrap(text, *args, **kwargs)) # ----------------------------- END utf8 ----------------------------- def to_unicode(obj, encoding='utf-8', errors='replace'): ''' convert a 'str' to 'unicode' ''' if isinstance(obj, basestring): if not isinstance(obj, unicode): obj = unicode(obj, encoding, errors) return obj def to_utf8(obj, errors='replace'): '''convert 'unicode' to an encoded utf-8 byte string ''' if isinstance(obj, unicode): obj = obj.encode('utf-8', errors) return obj # Don't use this, to_unicode should just work now def to_unicode_maybe(obj, encoding='utf-8', errors='replace'): ''' Don't ask don't tell, only use when you must ''' try: return to_unicode(obj, encoding, errors) except UnicodeEncodeError: return obj def to_str(obj): """ Convert something to a string, if it isn't one. """ # NOTE: unicode counts as a string just fine. We just want objects to call # their __str__ methods. if not isinstance(obj, basestring): obj = str(obj) return obj def str_eq(a, b): """ convert between unicode and not and compare them, w/o warning or being annoying""" if isinstance(a, unicode) == isinstance(b, unicode): if a == b: # stupid python... return True elif to_utf8(a) == to_utf8(b): return True return False def exception2msg(e): """Convert an exception to a message. This function will convert the exception using to_unicode, unicode, or str, whichever works correctly. :param e: an exception :return: a string representation of the exception """ # DIE python DIE! Which one works: # to_unicode(e.value); unicode(e); str(e); # Call this so you don't have to care. try: return to_unicode(e.value) except: pass try: return unicode(e) except: pass try: return to_unicode(str(e)) except: pass return "" try: ''' Setup the yum translation domain and make _() and P_() translation wrappers available. using ugettext to make sure translated strings are in Unicode. ''' import gettext t = gettext.translation('yum', fallback=True) _ = t.ugettext P_ = t.ungettext # we describe yum commands and options with unicode but optparse # mixes this with non-unicode translations so "yum --help" may fail. # It's much easier to fix this in optparse than in yum. BZ 1033416 import optparse if optparse._ is gettext.gettext: #optparse._ = lambda msg: to_unicode(gettext.gettext(msg)) optparse._ = gettext.translation('messages', fallback=True).ugettext except: ''' Something went wrong so we make a dummy _() wrapper there is just returning the same text ''' _ = dummy_wrapper P_ = dummyP_wrapper if __name__ == "__main__": import sys def out(arg): arg = to_utf8(arg) print "UTF8 :", arg print "len :", len(arg) arg = to_unicode(arg) print "USC :", arg print "len :", len(arg) print "valid:", utf8_valid(arg) print "width:", utf8_width(arg) print "4.8 :", "%s%s%s" % ('<', utf8_width_fill(arg, 4, 8), '>') print "4.3 :", "%s%s%s" % ('<', utf8_width_fill(arg, 4, 3), '>') print "4.2 :", "%s%s%s" % ('<', utf8_width_fill(arg, 4, 2), '>') print "4.1 :", "%s%s%s" % ('<', utf8_width_fill(arg, 4, 1), '>') print "3.3 :", "%s%s%s" % ('<', utf8_width_fill(arg, 3, 3), '>') print "3.2 :", "%s%s%s" % ('<', utf8_width_fill(arg, 3, 2), '>') print "3.1 :", "%s%s%s" % ('<', utf8_width_fill(arg, 3, 1), '>') print "40.79:", "%s%s%s" % ('<', utf8_width_fill(arg, 40, 79), '>') print "40.20:", "%s%s%s" % ('<', utf8_width_fill(arg, 40, 20), '>') print '' print " ---- Arguments/str ---- " for arg in sys.argv[1:]: out(arg) print " ---- Arguments/gettext ---- " for arg in sys.argv[1:]: try: arg = _(arg) except UnicodeDecodeError: continue out(arg) if len(sys.argv) > 2: print " ---- Arguments/str/all ---- " out(sys.argv[1] % sys.argv[2:]) print " ---- Arguments/gettext/all ---- " try: arg = _(sys.argv[1]) % map(_, sys.argv[2:]) except UnicodeDecodeError: sys.exit(0) out(arg) PK[=vCPsite-packages/yum/__init__.pycnu[ v_c@s(dZddlZddlZddlZddlZdZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZejjadZejjadZddlZddlmZmZddlZddlZddlZddlm Z m!Z!m"Z"m#Z#ddl$m%Z%ddl&Zddl'Z'ddl(Z(dd l)m*Z*ddl+Z+dd l,m-Z-m.Z.ddl/Z/ddl0Z0dd l1m2Z2m3Z3dd l4m5Z5dd l6m7Z7m8Z8m9Z9ddl:Z:ddl;Z;ddl<Z<ddl=Z=ddl>Z>ddl?Zddl@Zddl@mAZAmBZBddlCZddlDZDddlEZEeEjFdejGddlHmIZImJZJddlHmKZKmLZLmMZMddlHmNZNmOZOddlPTddlQmRZRmSZSddlmTZTmUZUmVZVddlWmXZXmYZYddlZZZddl[m\Z[ddl1m]Z]dZ^e_ge^j`dD]Zaebea^qZce]jdjede^7_edd$dYZfdd%dYZgd d&d!YZhd"e:jifd#YZjdS('s The Yum RPM software updater. iNcCsXttdsdSy6tgtjD]}t|^q#}||kSWndSXdS(s Check if rpm is at least the current vertup. Can return False/True/None as rpm hasn't had version info for a long time. t__version_info__N(thasattrtrpmtNonettupleRtint(tvertuptnumtvi((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_rpm_ver_atleasts(cOs t||S(N(t_wrap_yum_i18n__(targstkwargs((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_5scOs t||S(N(t_wrap_yum_i18n_P_(R R ((s0/usr/lib/python2.7/site-packages/yum/__init__.pytP_8s(t ParsingErrort ConfigParser(tarchDifferencet canCoinstallt ArchStoragetisMultiLibArch(t compareEVR(t RepoStorage(tConfigPreProcessort varReplace(t URLGrabbert URLGrabError(t format_number(tpackagesNewestByNametpackagesNewestByNameArchtListPackageSack(t LibLVMErrort lvmerr2strtignore(t parsePackagest comparePoEVR(tYumAvailablePackagetYumLocalPackagetYumInstalledPackage(t YumUrlPackagetYumNotFoundPackage(t*(tRPMTransactiontSimpleCliCallBack(t to_unicodetto_strt exception2msg(t DeltaInfot DeltaPackage(tproxy(tdefault_grabbers3.4.3t.s yum/t_YumPreBaseConfcBseZdZdZRS(sDThis is the configuration interface for the :class:`YumBase` configuration. To change configuration settings such as whether plugins are on or off, or the value of debuglevel, change the values here. Later, when :func:`YumBase.conf` is first called, all of the options will be automatically configured. cCsd|_d|_t|_tjf|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_dS(Ns/etc/yum/yum.conft/(tfntroottTruet init_pluginstpluginst TYPE_COREt plugin_typesRt optparsert debuglevelt errorleveltdisabled_pluginstenabled_pluginst syslog_identtsyslog_facilityt syslog_devicetarcht releasevertuuid(tself((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt__init__zs             (t__name__t __module__t__doc__RJ(((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR5sst_YumPreRepoConfcBseZdZdZRS(s#This is the configuration interface for the repos configuration configuration. To change configuration settings such what callbacks are used, change the values here. Later, when :func:`YumBase.repos` is first called, all of the options will be automatically configured. cCs^d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_ dS(N( Rt progressbartmulti_progressbartcallbacktfailure_callbacktinterrupt_callbackt confirm_functgpg_import_functgpgca_import_functcachedirtcache(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRJs         (RKRLRMRJ(((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRNst_YumCostExcludecBs eZdZdZdZRS(sW This excludes packages that are in repos. of lower cost than the passed repo. cCs"t||_t||_dS(N(tweakreftrepot_repos(RIR[trepos((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRJscCsMxF|jjD]5}|j|jjkr/Pn||jjkrtSqWtS(N(R\t listEnabledtcostR[tsackt _pkgtup2pkgsR9tFalse(RItpkgtupR[((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt __contains__s (RKRLRMRJRd(((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRYs tYumBasec BsP eZdZdZdZdZdZddZddee j fe e e d Z d Z e e d d Zd Ze e dZdZdZdZe e e e e e dZdZdZdZdZe dZe edZdZe e dZe e dZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)e*d'd(d)d*d+d,d-d.Z+e*d'd/d)d0d+d1d-d2Z,e*d'd3d)d4d+d5d-d6Z-e*d'd7d)d8d+d9d-d:Z.e*d'd;d)d<d+d=d-d>Z/e*d'd?d+d@d-dAZ0e*d'dBd)dCd+dDd-dEZ1e*d'dFd)dGd+dHd-dIZ2e*d'dJd)dKd+dLd-dMZ3e*d'dNd)dOd+dPd-dQZ4e*d'dRd)dSd+dTd-dUZ5e*d'dVd)dWd+dXd-dYZ6e*d'dZd)d[d+d\d-d]Z7d^Z8d_Z9ed`Z:edaZ;dbZ<dcZ=ie ddZ>ie deZ?dfZ@dgZAdhZBdiZCdjZDdkZEdlZFdmZGdnZHdoZIe ee e gdpZJdqZKe e drZLdsZMe dtZNduZOePdvZQe dwZReSdxdydzZTeSd{ZUeSd|ZVd}ZWd~ZXe e dZYdZZdZ[dZ\dZ]dZ^dZ_dZ`dZadZbdZcdZddZedZfde e ee dZgdZheeeedZidZje dZke edZldZmdZne edZode eedZpdZqdZrdZsge ee dZtedZuge edZvedZwedZxdZydZzdZ{dZ|dZ}dZ~e dZe ee dZdZdZdZedZdZdZdZdZdZdZdZdZdZe dZdZe dZdZdZdZe e edZe dZe edZe dZe dZe dZdZe dZeSdZdZeedZdZdZe edZddZe e dZee dZe dZe dZdZe e e dZdZdZdZe dZe dZdZge dZee eddZdZdZdZe edZdZe e e dZdZdZRS(sThis is a primary structure and base class. It houses the objects and methods needed to perform most things in yum. It is almost an abstract class in that you will need to add your own class above it for most real use. cCsbtjj|d|_d|_d|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_g|_i|_i|_tjd|_tjd|_tjd|_t|_t||_i|_|jg|_d|_ t!|_"t#|_$t%|_&t'|_(g|_)d|_*i|_+dS(Ns yum.YumBasesyum.verbose.YumBasesyum.filelogging.YumBasei(,tdepsolvetDepsolveRJRt_conft_tsInfot_rpmdbt_upt_compst_historyt_igroupst_pkgSackt _lockfilet_tagst_upinfot_fssnapt _ts_save_filetskipped_packagest _not_found_at _not_found_itloggingt getLoggertloggertverbose_loggert file_loggerRbt_override_sigchecksRR\t repo_setoptstdisablePluginst localPackagest mediagrabberRRFR5tpreconfRNt prerepoconftsettrun_with_package_namest_cleanupt exit_codetupdateinfo_filters(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRJsB                           cCsy=|j|j|jx|jD] }|q+WWnBtjk r}|jjdt|t ||j fnXdS(NsException %s %s in %s ignored( tcloset closeRpmDBtdoUnlockRtErrorst RepoErrorR{tdebugtreprtstrt__del__(RItcbte((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs   cCs[|jdk r|jjn|jdk r>|jjn|jrW|jjndS(s#Close the history and repo objects.N(RmRthistoryRRntigroupsR\(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs  cCs tjS(s/Factory method returning TransactionData object(ttransactioninfotTransactionData(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_transactionDataFactorysicCst|j_||j_dS(s Do a default setup for all the normal or necessary yum components. This function is really just a shorthand for testing purposes. :param cache: whether to run in cache only mode, which will run only from the system cache N(RbRR:tconfRX(RIRX((s0/usr/lib/python2.7/site-packages/yum/__init__.pytdoGenericSetups s/etc/yum/yum.confR6cCstjtdtjddt|dr||j_||j_||j_ ||j_ ||j_ ||j_ ||j_ n|jS(sQDeprecated. Perform configuration setup. :param fn: the name of the configuration file to use :param root: the root directory to use :param init_plugins: whether to initialize plugins before running yum :param plugin_types: a tuple containing the types to plugins to load :param optparser: the option parser to use for configuration :param debuglevel: the minimum debug logging level to output messages from :param errorlevel: the minimum error logging level to output messages from s9doConfigSetup() will go away in a future version of Yum. t stackleveliR(twarningstwarnR RtYumFutureDeprecationWarningRRR7R8R:R=R>R?R@R(RIR7R8R:R=R>R?R@((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt doConfigSetup s      c KsH|rtjdn|jr&|jStj}|rrx7dD],}||kr?t|j|||q?q?Wn|jj}|jj}|jj}|jj }|jj }|jj } |jj } |jj } |jj} |jj} |jj}|jj}|jj}|jj}|jj}|r?|jj|n |jj}|d krstjj| rsd }ntj|||}||_|jj|_|r||_n|jrtjj a!tjj"a#n| dkr| |_ n| dkr| |_ n| dkr| |_n|dkr6||_n|dkrN||_n|d kr|j%d krrd}qtjj&d |j'}n|dkr||_n|j(|j |j |j|j|j|r|j)r|j*|||j+|j,| | ntj-||_|jj.}|dkr:|t/j0_.n|jj1dt/j0_2|`x$|j3j4D]}|j5j6|qcW|j)j7d|j3j8|_8tj9|j3_:tjj;d|j3j<|j8j=dd|j8j=ddf|j3_>|j?|j3j:|j3j@|jAjBdtj||j)j7d|jS(s Parse and load Yum's configuration files and call hooks initialise plugins and logging. Uses self.preconf for pre-configuration, configuration. s2Use .preconf instead of passing args to _getConfigR7R8R:R=R>R?R@RARBs/etc/yum/yum.confs /etc/yum.confR6is /timedhostst postconfigs%s/repos/%s/%s/tbasearchs $basearchRGs $releaseversConfig time: %0.3ftinit( sfnsroots init_pluginss plugin_typess optparsers debuglevels errorlevelsdisabled_pluginssenabled_pluginsN(CRRRhttimetsetattrRR7R8R:R=R>R?R@RARBRCRDRERGRFRHt setup_archt canonarchtostpathtexiststconfigtreadStartupConfigRt gaftonmodetyumti18nt dummy_wrapperR tdummyP_wrapperRRt installroott _getsysvert distroverpkgtdoLoggingSetupR;t doPluginSetupt pluginpathtpluginconfpathtreadMainConfigtmax_connectionsR3toptsRWt timedhostsRthistory_record_packagesRtaddtruntyumvartgeteuidtuidtnormpatht persistdirtgett_repos_persistdirtdoFileLogSetuptlogfileR{R(RIR tconf_sttargR7R8R:R=R>R?R@RARBRCRDRERGRFRHt startupconftmctpkgname((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _getConfig,s    !                                       "s/dev/logcCstj|||||dS(sPerform logging related setup. :param debuglevel: the minimum debug logging level to output messages from :param errorlevel: the minimum error logging level to output messages from :param syslog_ident: the ident of the syslog to use :param syslog_facility: the name of the syslog facility to use :param syslog_device: the syslog device to use N(t logginglevelsR(RIR?R@RCRDRE((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs cCstj|||jdS(sSet up the logging file. :param uid: the user id of the current user :param logfile: the name of the file to use for logging N(Rt setFileLogR(RIRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRsc Cs||dkr"tj|d}nt|d|jj}t}y|j|Wn(tk r~}t j t |nXx|j D]}|d krqnt j|}|r|jjd|||j|fqny|j||} Wn2t jt j fk r/}|jj|qn"X|| _|| _|jj| _xt|jD]} t j| s|qantj| j| raxp|j| jD][} t| | sd} |jj| | j| fnt| | t |j| | qWqaqaW| j|jkrxv|j| jjD]^} t| | sid} |jj| | j| fnt| | t |j| j| q.Wn|r||  rqn| j!r7x| j"| j#| j$fD]b} | sqntj%| tj&sd} | j'r$|jj| | j| fnt(| _)qqWny|j*j+| Wqt jk rs}|jj|qXqWdS( sRead in repositories from a config .repo file. :param repofn: a string specifying the path of the .repo file to read :param repo_age: the last time that the .repo file was modified, in seconds since the epoch itvarstmaint installeds!Bad id for repo: %s, byte = %s %ds-Repo %s did not have a %s attr. before setopts2Repo %s forced skip_if_unavailable=True due to: %sN(smains installed(,RRtstatRRRRtreadfpRRt ConfigErrorR/tsectionstmisctvalidate_repoidRztwarningtfindtreadRepoConfigRtrepo_config_agetrepofileRtbase_persistdirtsortedR~tre_globtfnmatchtidtitemsRRtgetattrtssl_check_cert_permissionst sslcacertt sslclientcertt sslclientkeytaccesstR_OKtenabledR9tskip_if_unavailableR\R(RItrepofntrepo_agetvalidatet confpp_objtparserRtsectiontbadtthisrepotitopttmsgR7((s0/usr/lib/python2.7/site-packages/yum/__init__.pytgetReposFromConfigFilesn       + *    cCs4|jj}|j|jj|x |jjD]}tjj|jjd|rl|jjd|}ntjj |}tjj |r/xt t j d|D]{}tj |tjs|jjtdt|qntj|d}||kr|}n|j|d|qWq/q/WdS(s Read in repositories from the main yum conf file, and from .repo files. The location of the main yum conf file is given by self.conf.config_file_path, and the location of the directory of .repo files is given by self.conf.reposdir. R6s %s/*.repos!Skipping unreadable repository %siRN(Rtconfig_file_ageRtconfig_file_pathtreposdirRRRRRtisdirRtglobRRRzRR RR(RIRRRt thisrepo_age((s0/usr/lib/python2.7/site-packages/yum/__init__.pytgetReposFromConfigs     cCstj|}y|j|||jWn5tk r`}td||f}tj|nX|js||_|j j td|nt |j|_t |dd|_ |jj|_|jj|jj||_|j|_|S(s Parse an INI file section for a repository. :param parser: :class:`ConfigParser` or similar object to read INI file values from :param section: INI file section to read :return: :class:`yum.yumRepo.YumRepository` instance s'Repository %r: Error parsing config: %ss8Repository %r is missing name in configuration, using idt _old_cachedirt(tyumRepot YumRepositorytpopulateRt ValueErrorR RRtnameRzterrorR-Rtold_base_cache_dirRWt basecachedirRtupdatetcfgtasynct_async(RIRRR[RR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR9s"     cCstj|_dS(sDisable yum plugins.N(R;tDummyYumPlugins(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRXscCsRt|jtjr*ttdntj||||||||_dS(sInitialise and enable yum plugins. Note: _getConfig() will also initialise plugins if instructed to. Only call this method directly if not calling _getConfig() or calling doConfigSetup(init_plugins=False). :param optparser: the :class:`OptionParser` instance to use for this run :param plugin_types: a sequence specifying the types of plugins to load. This should be a sequence containing one or more of the yum.plugins.TYPE_... constants. If None (the default), all plugins will be loaded :param searchpath: a list of directories to look in for plugins. A default will be used if no value is specified :param confpath: a list of directories to look in for plugin configuration files. A default will be used if no value is specified :param disabled_plugins: a list of plugins to be disabled :param enabled_plugins: a list plugins to be enabled splugins already initialisedN(t isinstanceR;t YumPluginst RuntimeErrorR (RIR>R=t searchpathtconfpathRARB((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR]scCs)tjtdtjdd|jS(s%Deprecated. Set up the rpm database.s8doRpmDBSetup() will go away in a future version of Yum. Ri(RRR RRt _getRpmDB(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt doRpmDBSetupyscCs|jdkrtj}|jjtjtdtj d|j j d|j j dd|j j |_|jjdtj|n|jS(s@sets up a holder object for important information from the rpmdbsReading Local RPMDBR8RGRsrpmdb time: %0.3fN(RjRRR{tlogRtDEBUG_4R trpmsacktRPMDBPackageSackRRRRR(RItrpmdb_st((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs  !cCse|jdk r+d|j_|jjnd|_d|_d|_d|_d|_d|_dS(s6Closes down the instances of rpmdb that could be open.N( RjRttstdropCachedDatat_tsRiRktcompsR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs      cCs|`d|_dS(N(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _deleteTsscCs/tjtdtjdd|j|tS(sDeprecated. Set up the yum repositories. :param thisrepo: the repository to set up. If None, all repositories will be set up :return: the set up repos s7doRepoSetup() will go away in a future version of Yum. Ri(RRR RRt _getReposR9(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt doRepoSetupscCst|drm|j|jjdkr`t|d r`t|jj}|jj||_n|jnt|drS|j}|`|jj |j |j |j |j_ |jj |j|jj|j|j|j_|j|j_|j|j_|jdk r+|jj|jn|jdk rS|jj|jqSn|rtj}|jj||jjdtj|n|jS(sB For each enabled repository set up the basics of the repository. RR6Rsrepo time: %0.3fN(RRRtlenRWRRRR]tsetProgressBarRORPRQtsetFailureCallbackRRtsetInterruptCallbackRSRTRURVRt setCacheDirRXtsetCacheRR\tdoSetupR{R(RIRR(tirRtrepo_st((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR s6    !cCs|`t||_dS(N(R\R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _delReposscCs5tjtdtjdd|jd|d|S(s4Deprecated. Populate the package sacks with information from our repositories. :param archlist: a list of the names of archs to include. If None, all arches are set up :param thisrepo: the repository to use. If None, all enabled repositories are used s7doSackSetup() will go away in a future version of Yum. RitarchlistR(RRR RRt _getSacks(RIR,R((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt doSackSetups cCs|jdk r"|dkr"|jS|dkr7d}n|jj|}|jjtdtj}|s|jj }ni}x|D]}d|||jqtjtdtdt j ddqWdS(szreset the package sacks back to zero - making sure to nuke the ones in the repo objects, too - where it matterst _resetSacks2repo object for repo %s lacks a _resetSack method s%therefore this repo cannot be reset. RiN( RRoR]tvaluesRR<RRR RR(RIR[((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _delSacks!s   cCs)tjtdtjdd|jS(s}Deprecated. Set up the update object in the base class and populate the updates, obsoletes, and other lists. s9doUpdateSetup() will go away in a future version of Yum. Ri(RRR RRt _getUpdates(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt doUpdateSetup2scCs@|jr|jS|jjtdtj}tjj|jj |j j |_|j j dkr}d|j_nt |dr|jj|j_|`nT|j jrtj}|j jdt|j_|jjdtj|n|jj|j_|jj|j_|jj|j_|jj|j_|j j|j_|j j|j_tj}|jj|jjdtj||j jrtj}|jj|jjdtj|ntj}|jj |jjd tj||jjd tj||jS( snsetups up the update object in the base class and fills out the updates, obsoletes and others listssBuilding updates objectiit _up_obs_hacktnewestsup:Obs Init time: %0.3fsup:simple updates time: %0.3fsup:obs time: %0.3fsup:condense time: %0.3fsupdates time: %0.3f(!RkR{RR RtrpmUtilstupdatestUpdatestrpmdbt simplePkgListtpkgSackRR?RRAt rawobsoletest obsoletestreturnObsoletesR9RFRtmyarchtmultilibt _is_multilibR,t _archlistt compatarchest_multilib_compat_archest exactarcht exactarchlistt doUpdatest doObsoletestcondenseUpdates(RItup_sttobs_inittup_pr_sttobs_stt cond_up_st((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR?;s@  *   !     !  cCs2tjtdtjddd|_|jS(s2Deprecated. Create and populate the groups object.s8doGroupSetup() will go away in a future version of Yum. RiN(RRR RRRRt _getGroups(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt doGroupSetupks cCsK|dkr>|jr>x#|jjD]}t|_q%Wq>n||_dS(N(RR\tsortRbt groups_addedRl(RItvalR[((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _setGroupsts   c Cs |jr|jStj}|jjtjtdg}|jx|jj D]w}|j rw|j |qUn|j st jd|ny|j}Wnt jk r}qUX|j |qUW|jj}tjd||_|jjdkr|jjd7_xI|jjD];}tj}||_|_t|_|jj|q"WxL|jjD];} tj } | | _| _!t| _|jj"| qnWnx|D]}|j rqn|jjtjtd||j#} | s#td|} |j$j%| qny|jj&| WnKt j't j(fk r}td|t)|f} |j$j%| qXt|_ qW|jjd krt j'td n|jjdkr|jj*|j+j,n|jj-d tj||jS( screate the groups object that will store the comps metadata finds the repos with groups, gets their comps data and merge it into the group objectsGetting group metadatasRepository '%s' not yet setuptoverwrite_groupstobjectsis%Adding group file from repository: %ss0Failed to retrieve group file for repository: %ss1Failed to add groups file for repository: %s - %sis%No Groups Available in any repositorysgroup time: %0.3f(.RlRR{RRRR RHR]tlistGroupsEnabledR_tappendtreadyRRtgetGroupLocationt RepoMDErrorRRbRtCompst group_commandt compscountRtgroupstGroupRtgroupidR9t_weakt add_groupt environmentst Environmentt environmentidtadd_environmentt getGroupsRztcriticalRt GroupsErrortCompsExceptionR/tcompileRFRGR( RItgroup_sttreposWithGroupsR[t groupremoteRt overwritetgidtgrptevgidtenvt groupfileR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR\sl               cCsWtj}|jjtjtd|jdkr2tj j |_x|j j D]}d|j jkrzqYn|jjtjtd|yD|jd}tj|dd|j}|jj|j|WqYtjtjfk r*}td|t|f}|jj|qYXqYWn|jjdtj||jS( sT create the tags object used to search/report from the pkgtags metadatasGetting pkgtags metadatatpkgtagssAdding tags from repository: %sspkgtags.sqlitetcacheds.Failed to add Pkg Tags for repository: %s - %sstags time: %0.3fN(RR{RRRR RqRRt pkgtag_dbt PackageTagsR]R^trepoXMLt fileTypest retrieveMDRtrepo_gen_decompressRXRRRRt PkgTagsErrorR/RzRvR(RIttag_stR[ttag_mdt tag_sqliteRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_getTagss*    cCsLtj}|jjtjtd|jd kr'tj d}tj d}t j d|d||_|j x|j jD]}d|jjkrqn|jjtjtd|y|jj|Wqtjk r}td|t|f}|jj|qXqWn|jjd tj||jS( sX create the Update Info object used to search/report the updateinfo metadatasGetting updateinfo metadatas yum.update_mdsyum.verbose.update_mdRztvloggert updateinfos&Adding Update Info from repository: %ss1Failed to add Update Info for repository: %s - %ssupdateinfo time: %0.3fN(RR{RRRR RrRRxRyt update_mdtUpdateMetadataRHR]R^RRRRRhR/RzRvR(RItupi_stRzRR[RR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_getUpdateinfos,    cCs]|jdkrV|jjd}tjjd|jjd|d|jjd|_n|jS(seauto create the history object that to access/append the transaction history information. s/historyR8tdb_pathRGN( RmRRRRRt YumHistoryRR(RItpdb_path((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _getHistorys cCsR|jdkrK|jj}tjjd|jjd|d|j|_n|jS(s: create the fssnap object used to query/create snapshots. R8tdevicesRzN( RsRRtfssnap_devicesRt fssnapshotst_FSSnapRR|(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _getFSsnaps  cCsA|jdkr:|jjd}tjjd||_n|jS(skauto create the installed groups object that to access/change the installed groups information. s/groupsRN(RnRRRRRtInstalledGroups(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _getIGroups&stfgetcCs |jS(N(R (RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt/stfsetcCst|d|S(NR\(R(RItvalue((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR0stfdelcCs |jS(N(R+(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR1stdocs0Repo Storage object - object of yum repositoriescCs |jS(N(R-(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR3scCst|d|S(NRo(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR4scCs |jS(N(R>(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR5ss3Package sack object - object of yum package objectscCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR7scCst|d|S(NRh(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR8scCst|ddS(NRh(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR9ssYum Config ObjectcCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR;scCst|d|S(NRj(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR<scCst|ddS(NRj(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR=ssRpmSack objectcCs |jS(N(t _getTsInfo(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR?scCs |j|S(N(t _setTsInfo(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR@scCs |jS(N(t _delTsInfo(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRAss"Transaction Set information objectcCs |jS(N(t _getActionTs(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRCscCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRDssTransactionSet objectcCs |jS(N(R?(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRFscCst|d|S(NRk(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRGscCst|ddS(NRk(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRHssUpdates ObjectcCs |jS(N(R\(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRJscCs |j|S(N(Ra(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRKscCst|ddS(NRl(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRLssYum Component/groups objectcCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRNscCst|d|S(NRm(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyROscCst|ddS(NRm(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRPssYum History ObjectcCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRSscCst|d|S(NRn(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRTscCst|ddS(NRn(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRUssYum Installed Groups ObjectcCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRXscCst|d|S(NRq(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRYscCst|ddS(NRq(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRZssYum Package Tags ObjectcCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR]scCst|d|S(NRr(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR^scCst|ddS(NRr(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR_ssYum Update Info ObjectcCs |jS(N(R(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRbscCst|d|S(NRs(R(RIR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRcscCst|ddS(NRs(RR(RI((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRdssYum FS snapshot ObjectcCst}|jrixW|jjD]C}||jjkr\d|jj|krSqqbt}qt}qWn|rtd}|jj t j ||jj ddndS(sConvenience function to populate the repositories with the filelist metadata, and emit a log message only if new information is actually populated. t filelistss)Importing additional filelist informationtmdtypeN( RbRHR]R^R`taddedR9R R{RRtINFO_2R4(RIt necessaryR[R((s0/usr/lib/python2.7/site-packages/yum/__init__.pytdoSackFilelistPopulategs    cCsy|jjddrdSd \}}t|drX|jjd|jjd}}n|td|j|dS( sOutput a message that the given tool requires the yum-utils package, if it not installed. :param func: the function to output the message :param prog: the name of the tool that requires yum-utils Rs yum-utilsNRttermtboldtnormals1The program %s is found in the yum-utils package.(RR(RFtcontainsRRtMODER t _try_bold(RItfunctprogthibegthiend((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt yumUtilsMsgs  $c Cst|_|ritjd|jjritd}|jj||j |jjdt j dn|j j dt j }|j\}}|j|jjr|jjtjtd|jnd}|dkr|jjrtj|jj}nd|j_|j||\}}|j j dd |d ||jjr|j|d k\}}|j||d t\}}n|jjdk r|jj j!n|d k|_g}|dkr |jj"r |j#j$r |jj%dt&}ni}xe|D]]} |j'| j(r8qn| j)|kr`| j(g|| j)dkr|j'|j(r|j?|j(rPqqqWn|jj@dt j |||fS(s'Go through the packages in the transaction set, find them in the packageSack or rpmdb, and pack up the transaction set accordingly. :param unfinished_transactions_check: whether to check for unfinished transactions before building the new transaction t yumlibpaths/There are unfinished transactions remaining. You might consider running yum-complete-transaction, or "yum-complete-transaction --cleanup-only" and "yum history redo last", first to finish them. If those don't work you'll have to try removing/installing packages by hand (maybe package-cleanup can help).syum-complete-transactionit preresolves*--> Finding unneeded leftover dependenciesit postresolvetrescodetrestringit clear_skippedis%Protected multilib versions: %s != %ss Multilib version problems found. This often means that the root cause is something else and multilib version checking is just pointing out that there is a problem. Eg.: 1. You have an upgrade for %(name)s which is missing some dependency that another package requires. Yum is trying to solve this by installing an older version of %(name)s of the different architecture. If you exclude the bad architecture yum will tell you what the root cause is (which package requires what). You can try redoing the upgrade with --exclude %(name)s.otherarch ... this should give you an error message showing the root cause of the problem. 2. You have multiple architectures of %(name)s installed, but yum can only see an upgrade for one of those architectures. If you don't want/need both architectures anymore then you can remove the one with the missing update and everything will work. 3. You have duplicate versions of %(name)s installed already. You can use "yum check" to get yum show these errors. ...you can also use --setopt=protected_multilib=false to remove this checking, however this is almost never the correct thing to do as something else is very likely to go wrong (often causing much more problems). Rs)Trying to remove "%s", which is protectedtautoRsDepsolve time: %0.3fN(ARbt_depsolving_failedRtfind_unfinished_transactionsRRR RzRvRRtsleepR;Rt resolveDepst_limit_installonly_pkgstclean_requirements_on_removeR{RRRt_remove_old_depsRtprotected_packagestget_running_kernel_pkgtupRFt readOnlyTSRt _doSkipBrokenttsInfotchangedRoRHRtprotected_multilibRFRMtgetMembersWithStatetTS_INSTALL_STATEStallowedMultipleInstallstpoRReR"t searchNamesRctTS_REMOVE_STATEStverEQt TS_OBSOLETEDtTS_ERASERtkeyst matchNaevrt output_stateRt autosavetstsave_tsR9RtRPMPROB_FILTER_OLDPACKAGEtprobFilterFlagst getMemberstts_statet_enable_oldpackage_flagR(RItunfinished_transactions_checkRtds_stRRt kern_pkgtupttxmbrstversttxmbrtfinet xrestringRtpkgtfirsttothertbigmsgtprotect_statest protectedtbad_togotipkgtm((s0/usr/lib/python2.7/site-packages/yum/__init__.pytbuildTransactions        !$             !cCs|jjry|dkry|r*g|_ntj}|j||\}}|j|jjdtj|n||fS(s! do skip broken if it is enabled isSkip-Broken time: %0.3f(Rt skip_brokenRuRt_skipPackagesWithProblemst_printTransactionR{R(RIRRRtsb_st((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRYs   !csfd}fdd}t}t|}d}xtjdkr|dkr|d7}jjd_jjd||dkrjjdPnj j }tj } t} xRjD]G\} } } j j | j s.|| || q|| || qWxc| D][} j| }xC|D];}|j||kre|jdkre|qeqeWqIW| s|d7}|d krPqjjd j jd tnjtd t\}}tj }| |tkrk|d7}|d krEPqqjjd j jd tnd}|dkrKjjdj jd tjjj\}}qKqKW|dkr{jjd|jjtdg|D] }|^q }|jx@|D]8} tdt| | jjf}jj|q,Wjj|njjdd|fS||fS(s= Remove the packages with depsolve errors and depsolve again cs+|s dSj||||dS(N(t_getPackagesToRemove(RtdepTreettoRemove(t_remove_from_sackRI(s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_removekscsj|}xw|D]o}|jdk r|krjjdt|jj|jj|jj |qqWdS(NRs.SKIPBROKEN: removing %s from pkgSack & updates( t_getPackagesToRemoveAllArchtrepoidR{RRRHt delPackagetupRcR(RtpkgsR(tremoved_from_sackRI(s0/usr/lib/python2.7/site-packages/yum/__init__.pyRrs iis1SKIPBROKEN: ########### Round %i ################isSKIPBROKEN: Too many loops RisESKIPBROKEN: resetting already resolved packages (no packages to skip)thardtskipping_brokensISKIPBROKEN: resetting already resolved packages (transaction not changed)s0SKIPBROKEN: sanity check the current transactionsSKIPBROKEN: took %i rounds s1 Packages skipped because of dependency problems:s %s from %ss$Skip-broken could not solve problemsN(RR"tpo_with_problemsRFttransactionResetRtinstalledFileRequiresR{RRt _buildDepTreeRRRct_skipFromTransactionRRt resetResolvedR9Rt_checkMissingObsoletedt_checkUpdatedLeftoverstinfoR R^RR[RRutextend(RIRRRtcountt skipped_pot orig_restringtloopingRtstartTsRRtwpoterrtskippedtskiptendTstpt skipped_listR((RRRIs0/usr/lib/python2.7/site-packages/yum/__init__.pyRhs|  $                    " cCsG|r dS|d|d|d|d|df}d|krCdS|S(NRRFtepochtversiontrelease(R(RIRt nevra_dictRc((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_add_not_founds  cCsN|dkr'|r'|j||}n|dkr7dSt||j|sitallsmissing requirestrequiressinstalled conflictt conflictsR<tprovides(sallRO(sallRP(salls obsoleted(sallsprovides(RRzRR ttypeRt intersectionRFtcheck_dependenciesRRctproblemR9RVRbReRtinstallonlypkgstcheck_duplicatest duplicatetcheck_obsoletedt obsoletertcheck_providesR"R(RIRRRtchkcmdtheadert ignore_pkgstignore_pkgtupstrctprobstprob2uitprobtfoundtrestiopkgs((RRRs0/usr/lib/python2.7/site-packages/yum/__init__.pyt_rpmdb_warn_checks{sl    ' c!sqtfd}jjs*jjrjj rtd}jjd-krptj ddd|qj j |njjr:jjsjjr:jj r:t}yjj }Wn5tk r}j jt|t}g}nXt|dd d t}d }d }g} xd|D]\} |d 7}|| dkrn| d}d }q8n|jj kr8| j| dq8q8Wyjjd| }Wn5tk r}j jt|t}g}nXt|rj jtdt|q:|r:j jtdq:njjrrjjtj rrjjrr|njjdx4jjD]#} | j rj!j"dPqqWjj# sjjtjrj$j%} nt&j!} j'j(d| }j'j)dtd }j*j+}|d.k rQ|j-}ng}|d.kso||krj$j.d.t/}g|D]}|j0^q}|d.k }j1d|d|}nd.}t2drj3rdj4j3}n-t2dr'j5r'dj4j5}nj$j%} j*j6||t&j$j7||j8t2drj9njjdj'j:| j;d.k rt<j;dj=}j*j>d|yt?j@j;WqtAtBfk r}qXnd._;jjCrft?jDd }|rfyt?jD| Wqcd }qcXqfnjj|jEd }jjCryt?jD|WqqXntFjG}d |_H|d.krnt|d krtd!}j j|d |_Hnjj#ryjjtj ryg|D]}tItJ|^q/}jjd"j*jK|d#d|njLj td$x"|D]}jLj |d qWtj dtd%d|jjtjsjMnxvd/D]n}t2||rtN||}ytFjO|WqitAtBfk re}jLj td(|qiXqqWjjtjs|jHrj'jPnj'jQt&j$jjd)jjtjs/d.} t2|d*r|jR} njS|| jjTd+kr/jUjVq/njjrmjjtj rmjjrm|d,tn|S(0sOPerform the transaction. :param cb: an rpm callback object to use in the transaction :return: a :class:`yum.misc.GenericHolder` containing information about the results of the transaction :raises: :class:`yum.Errors.YumRPMTransError` if there is a transaction cannot be completed cstd|rdnd}yjjjj}Wn/tk ri}tdt|}t}nX|s| rjjdkrt j ddd |qj j |nid gd 6}td }y"jj jjd |}Wn-tk r$}|dt|7}g}nX|sr| r_jjdkr_t j ddd |qrj j |nx4|D],\}}j jtd||fqyWdS(s<Create the pre or post trans snapshot if we have free space.s=Not enough space on logical volumes to create %s FS snapshot.s post transspre.s3Could not determine free space on logical volumes: ssnapshot-failuretanyRsAborting transactionterrorssreason=automaticR*sFailed to create snapshotttagss: s(Created snapshot from %s, results is: %sN(ssnapshot-failuresany(ssnapshot-failuresany(R tfssnapt has_spaceRtfssnap_percentageR R!Rbtfssnap_abort_on_errorsRtYumRPMTransErrorR{RvtsnapshotR(tpostRRrRRptsnapstodevtndev(RI(s0/usr/lib/python2.7/site-packages/yum/__init__.pytcreate_snapshots0  " sSnapshot support not available.s broken-setupRnRsAborting transaction.RotkeycSs|d|dfS(Ntctimet origin_dev((tx((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRstreversesiiR~tdevRsDeleted %u snapshots.s3Skipping the cleanup of old snapshots due to errorstpretranssyum-metadata-parsertpatternst main_onlyRRdR t tcmdst_shell_history_writet historybeginR/tsaved_txRsIWarning: scriptlet or other non-fatal errors occurred during transaction.t historyendisTransaction couldn't start:sCould not run transaction.t ts_all_fnt ts_done_fns$Failed to remove transaction file %st posttranst verify_txmbrRcRw(s broken-setupsanyN(RR(WRbRtfssnap_automatic_pretfssnap_automatic_postRqR>R RtRRuR{Rvtfssnap_automatic_keept old_snapshotsR RR!R9RRet del_snapshotsR"RRRt isTsFlagSetRtRPMTRANS_FLAG_TESTR;RR]R^t_xml2sqlite_localRRthistory_recordRtfutureRpmDBVersiontlistRFtreturnPackagest simpleVersionRtlastRtend_rpmdbversionRRRRmRR tjoinRtbegRut_store_config_in_historyRttransactionResultVersionRttopentreadtwrite_addon_dataRtunlinktIOErrortOSErrort reset_nicetniceRQRt GenericHoldert return_codeR-R.tendRztcleanUsedHeadersPackagesRtunlink_fRtdropCachedDataPostTransactionRtverifyTransactionRjRtsave(!RIRR{Rt cleanup_failRxRRRttodeltsnapR[tfrpmdbvtusing_pkgs_patst using_pkgstrpmdbvtlastdbvtrpmdb_problemsRRRdt output_warntcmdlinet savetx_msgtoniceRot resultobjectt errstringRtherrorsRR7tvTcb((RIs0/usr/lib/python2.7/site-packages/yum/__init__.pytrunTransactions %          #                   "%    %    csfd}|jj}|s3tjd}n|dkrHd}n'|rodjt|jd}ntj}|jj dd}x|j D]}|j t kr|j jd|js|jjtd |jt|_ |||}qn|||}|j|j}|j} | j|j_|j|j_|jjd |j_xk|jjD]]} | d krqnn| d krqnn| d krqnnt|jd | |jj| qnW|r||j_nd|jjkrd|j_nd|jjkr&d|j_ nd|jjkrGd|j_!nd|jjkrhd|j_"nt#|dr|j$rdj|j$|j_%n3t#|dr|j&rdj|j&|j_%n| j'} | d#k rt)| d|j_*t)| d|j_+nt,| t-ry[t.j/| j0} t)t1| j2} t)t1| j3}| |j_4||j_5WqqXn| j6d#k r| j6|j_7nt#| j8dr| j8j9}|r|j:d#k rt)|j:|j_4n|rt)|j;|j_5qnt#|dr:|j<|j_<nt=j>}|j?sa|j@sa|jAr|j?rz|j?d}n|j@r|j@d}n|}d|jkr|jjB|j_Bnd|jkr|jj<|j_<n|d#k r&t)||j_Cq&n!|d#k r&t)||j_Bn|jjDrH|jEjF|qHqqWx |j D]}|j t krnqV|j tGkr(|j jd|jr|j jHd|jdt s|jjtd|jt|_ |||}qVqn|||}|j jIjJd|j}|jKqV|||}|jLjMtNjOd|jqVW|jj d|j jPdtQd}|jjDr|jRjStjT rd }|d#k r|jU}n|jj d!|jEjV||n|j jW|jLjXd"tj|d#S($sCheck that the transaction did what was expected, and propagate external yumdb information. Output error messages if the transaction did not do what was expected. :param resultobject: the :class:`yum.misc.GenericHolder` object returned from the :func:`runTransaction` call that ran the transaction :param txmbr_cb: the callback for the rpm transaction members cs*dk r&|d7}||n|S(Ni(R(RR(ttxmbr_cb(s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_call_txmbr_cbs  s%_install_langsRTRt:tpreverifytransiRs+%s was supposed to be installed but is not!RGRRFtvar_t nocontextsttruetnodocst noscriptst notriggersR RRiRt group_membert installed_byRct output_statess)%s was supposed to be removed but is not!sWhat is this? %stpostverifytransRiRsVerifyTransaction time: %0.3fN(YRtoverride_install_langsRt expandMacroRRtsplitRR;RRRRRFRRRzRvR t TS_FAILEDtgetInstalledPackageObjectRcRt yumdb_infot from_repotreasonRRGRtts_install_langsttsflagsttsflag_nocontextst tsflag_nodocsttsflag_noscriptsttsflag_notriggersRR t command_lineRt returnIdSumRRt checksum_typet checksum_dataRR&RRtlocalPkgRtst_ctimetst_mtimetfrom_repo_revisiontfrom_repo_timestamptxattr_origin_urlt origin_urlR[Rtrevisiont timestampRRt getloginuidRDt downgradest reinstallRt changed_byRRt sync_alldbRRtyumdbt get_packagetcleanR{RRRERR9RRRRRRR(RIRRRtoiltvt_stRRRtrpotvartcsumtsttlp_ctimetlp_mtimetmdtloginuidtopot yumdb_itemRtret((Rs0/usr/lib/python2.7/site-packages/yum/__init__.pyRs   !       %              !"   c Csi}x3|jjD]"}|j|jgj|qWt|dkrRdSt}d}g}xwt|D]i}|rxC||D]4}t||j}|j j |j |d|qWn|j ||t }qqWdS(sCreate an excluder for repositories with higher costs. For example, if repo-A:cost=1 and repo-B:cost=2, this function will set up an excluder on repo-B that looks for packages in repo-B. iNsyum.costexcludessexclude.pkgtup.in(R]R^R3R_ReR"RbRRYR`taddPackageExcluderRRR9( RItcostsR/tdonetexidtoreposR_R[tyce((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR9Cs  cCsd|jjkrdS|sMd|jjkr2dS|jj}d}d}n8|j|jjkrfdS|j}|j}d|}d}xA|D]9}|d7}d||f}|jj||d |qWdS( sRemove packages from packageSacks based on global exclude lists, command line excludes and per-repository excludes. :param repo: a repo object to use. If not given, all repositories are used RTNRsyum.excludepkgssyum.excludepkgs.iis%s.%us exclude.match(Rtdisable_excludesR0RRtgetExcludePkgListRHR(RIR[t excludelistRtexid_begRtmatchR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR5]s$       cCsx<t|jdgD]%}|dks7||jkrdSqW|j}t|dkradSd}|jj|j|dd}xD|D]<}|d7}dd |f}|jj|j|d |qWd }|jj|j|d dS( sRemove packages from packageSacks based on list of packages to include. :param repo: the repository to use tdisable_includesRTNisyum.includepkgs.1s mark.washedis%s.%usyum.includepkgs.2s wash.matchsyum.includepkgs.3sexclude.marked(RRRtgetIncludePkgListR"RHR(RIR[tdit includelistRRR ((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR7}s    cCsK|jjdkrC|jjr"dS|jj}tjj|}n |jj}|d|}tjj|}t tj }xt r|j ||d}|rPn|j |}|s|j|qn|tj krd}Pntd||f}tjd||qW|dkr,dS|dks>t||_dS(sAcquire the yum lock. :param lockfile: the file to use for the lock :raises: :class:`yum.Errors.LockError` iNR6iis4Existing lock %s: another copy is running as pid %s.i(RRRXRWRRtbasenameRRRtgetpidR9t_lockt _get_lockert_unlockR Rt LockErrortAssertionErrorRp(RItlockfileR8tmypidRtoldpidR((s0/usr/lib/python2.7/site-packages/yum/__init__.pytdoLocks4      cCst|drdS|jjdkr.d}n|dk rW|jj}|d|}n|jdkrjdS|j}|j|d|_dS(sRelease the yum lock. :param lockfile: the lock file to use. If not given, the file that was given as a parameter to the :func:`doLock` call that closed the lock is used RNiR6(RRRRRRpR(RIRR8((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs      RicCstjj|}yatjj|s+dStj|tjtjBtjB|}tj||tj |dSWnct k r}|j t j kst d|t|f}tj|j |t|ndSXdS(Niis Could not create lock at %s: %s i(RRtdirnameRRtO_EXCLtO_CREATtO_WRONLYtwriteRRterrnotEEXISTR R/RRR(tfilenametcontentstmodetlockdirtfdRterrmsg((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs& !cCstj|dS(N(RR(R#((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRscCs:yt|d}WnDttfk rY}td||f}tjtj|nXyt|j }Wnt k rdSXy4td|j }|j ddkrdSWnztk r5yt j|dWq6tk r1}|dtjkrdStd|}tjtj||q6XnX|S(NR/sCould not open lock %s: %ss /proc/%d/statitZis#Unable to check if PID %s is active(RRRR RRR!tEPERMRtreadlineRRRRtkilltESRCH(RR'RRRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs,   c Cs/t}t|tjkr'|j}n||jkrE||_n|jsZt}n3t |j j |}|j |j krt}n|r+t j|d}t|j}||kr|jj r|j|jjrt j|qn|r$td|jj}td|q+tSntS(sCheck that the checksum of a remote package matches what we expect it to be. If the checksum of the package file is wrong, and the file is also larger than expected, it cannot be redeemed, so delete it. :param fo: the file object of the package :param po: the package object to verify :param raiseError: if *raiseError* is 1, and the package does not check out, a :class:`URLGrabError will be raised. Defaults to 0 :return: True if the package is verified successfully. Otherwise, False will be returned, unless *raiseError* is 1, in which case a :class:`URLGrabError` will be raised :raises: :class:`URLGrabError` if verification fails, and *raiseError* is 1 is\Package does not match intended download. Suggestion: run yum --enablerepo=%s clean metadatai(RbRXttypest InstanceTypeR#Rt localpathtverifyLocalPkgR9R&RFRRcRRtlongtsizeR[RXt startswithtpkgdirRR RR( RItfoRt raiseErrortfailedtylptcursizettotsizeR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt verifyPkg s*     cCslytj||}Wn+tjk rC}tdtdnX||krhtdtdndS(sVerify that the checksum of the given file matches the given checksum. :param fo: the file object to verify the checksum of :param checksumType: the type of checksum to use :parm csum: the checksum to check against :return: 0 if the checksums match :raises: :class:`URLGrabError` if there is an error performing the checksums, or the checksums do not match isCould not perform checksumisPackage does not match checksumi(RtchecksumRt MiscErrorRR (RIR6t checksumTypeRtfilesumR((s0/usr/lib/python2.7/site-packages/yum/__init__.pytverifyChecksumO s  csd}ifdjjjjdd|ttjdtg}dfd}g}x[|D]S}t|dr|j d krqn||rqnrS|j |qWt |d} } xv|D]n}t |t r^||r>j|q n| |j7} | |jj7} n|j ||j7q W| rjjtd t| t| d | d | nrtd rlx|D]}|jjjjsqn|jtjj} ytj|jj| Wqytj|jj| WqeqeXqXqWnjjjj nt!j!} |} }x9t"r|j#|tt$j%drt|dkrt$j%j&nd}dgttt$j'd}x,|D]$}|d7}|fd}tj(j)|j*}i}|r|j+j,r|fd|dj?nS( sDownload the packages specified by the given list of package objects. :param pkglist: a list of package objects specifying the packages to download :param callback: unused :param callback_total: a callback to output messages about the download operation :return: a dictionary containing errors from the downloading process :raises: :class:`URLGrabError` cSs|j}|j}|dkr^|dkr^tt|tt|tp]t||S|dkrndS|dkr~dS||krdS||krdSdS(Niii(t getDiscNumRtcmpRR1(tapotbpoR-tb((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt mediasortp s      csBj|gj||jjdr>tj|jndS(Ns.tmp(R3ReR0tendswithRR(RR(Ro(s0/usr/lib/python2.7/site-packages/yum/__init__.pytadderror st predownloadtpkglistt downloadonlyicsF|j}|kr6jjtd|tSj|rotjj| ro|j j |ntjj|rj ||t rjj td|tS|j jr|td|j jt SnrB|jdtj7_ytj||jWntk r-nX|j|jnt S(Nsignoring a dupe of %ssusing local copy of %ss4package fails checksum but caching is enabled for %ss.%d.tmp(RR{RR R9RRRRR[t_preload_pkg_from_system_cacheR<RbRRXRR0RtrenameRRtbasepath(Rtlocal(RIt beenthereRLRI(s0/usr/lib/python2.7/site-packages/yum/__init__.pyt verify_local s0       tpkgtypeRPs3Delta RPMs reduced %s of updates to %s (%d%% saved)idgY@Rttext_meter_total_sizeit parallel_waitcs9j||d|jjdr]|jjddd}tj|j|||_ndc|j7RRtextrass distro-extrasRJtrecentiQN(3RRtshowdupesfromreposRRRFRtfilter_pkgs_repoidRcRRFtverGTR=RHtsackstreturnNewestByNameArchRtPackageSackErrorReR+RRtgetUpdatesListR"R{RRtDEBUG_1R R#RR9RRGRRRJtgetObsoletesTuplesRRRRRtfiletimeRR>treinstall_availablet old_availableRDtobsoletesTuplesR(+RIt pkgnarrowRtshowdupsRRtyghRR>RRRDRJRRRtictdinsttndinstRR|tavailRtipkgsR,R-RR.R/tmatchest exactmatchR0t unmatchedtlatestRctinstTupRtinstpotmatched_obsoletestnobsoletesTuplestfilttnowt recentlimit((s0/usr/lib/python2.7/site-packages/yum/__init__.pytdoPackageListsb sn            %                  -                         c Csi}x|D]}i||<|j}|j||}xo|D]g}|\}}} |jdrkqAng} x*|j||| D]} | j| qW| || siiti(tsumR"RR(R(R(s0/usr/lib/python2.7/site-packages/yum/__init__.pyR scs|d |d kS(Ni((RR(t sort_func(s0/usr/lib/python2.7/site-packages/yum/__init__.pyR sR|N(Ret RPM_TO_SQLITERRR3RHRR=Rt"searchPrimaryFieldsMultipleStringsRFR9RtsearchPackageTagsR"Rtuniquetoperatort itemgettertreversedRRRRF(%RIRtcriteriaRRt searchtagst searchrpmdbt sql_fieldsRRRt real_critt critweightRR`Rtresults_by_pkgRRt matchkeyst tagresultsR ttaglistRtkR.ttotkeysttotvalstduptyieldedR`Rtsl_valsRtkstvstna((RRRRRs0/usr/lib/python2.7/site-packages/yum/__init__.pytsearchGenerator s               "       /     c Csi}x|D]}|j}|jj|}xu|jD]g\}}|jjd|}|skq>n|d}||krg||Wq W|S(s Search for and return a list packages that have tags matching the given criteria. :param criteria: a list of strings specifying the criteria to search for :return: a list of package objects that have tags matching the given criteria Ri(RRt search_tagsRRHR+Re( RIRRtcRkRR RR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR: s      cCstjtdtjddi}|j||}xT|D]L\}}|r`|||n||kryg||W|S(sDeprecated. Search the specified fields for packages that match the given criteria, and return a list of the results. :param fields: the fields to search :param criteria: a list of strings specifying the criteria to search for :param callback: a function to print out the results as they are found. *callback* should have the form callback(po, matched values list) sosearchPackages() will go away in a future version of Yum. Use searchGenerator() instead. Ri(RRR RRRR(RIRRRQRt match_genRtmatched_strings((s0/usr/lib/python2.7/site-packages/yum/__init__.pytsearchPackagesR s   c Csed}i}xf|D]^}t|}||\}}|sXt} |j|} nt} |jj|} |jjtj t ddt | t | xt | D]} |jjtj td| g} | r| j|n| r |r | j|n|r{|r{|jjtj tdxD| j| j| jD](} tj| |rL| j| qLqLWn|jjtj tdx| jD]v\}}\}}}tj|||||ff}| stj||stj||r| j|qqqWt | dkr|rc| rS|rS|| | |qc|| | n| || (installed, available, backlisted-installed, blacklisted-available). RctpackagesR>sblacklisted-availableRRRsblacklisted-installed(RRjRnRRlt pkg_namesRRRR R:RFRRR(RItgroupRR;t all_pkg_namestpkg_nameRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_groupInstalledData s0     cCsi}| s|jjdkr#|Si}|j|jjkr]|jj|j}|j}ntt|}t |dr|j |j nx|D]}}|jjj |}||kr| rd|| (installed, available, backlisted-installed, blacklisted-available). Rct allgroupsR>sblacklisted-availableRsblacklisted-installed(RRjRsRRlRqt grp_namesRRRR R@Rt environment(RItevgroupRRAt all_grp_namestgrp_nametigrp((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_groupInstalledEnvDatas,     c Cs$d}d}|dkr|jj}|jjdkrK|jjj}n|jj}|jjdkr~|jjj}n||||fSg}g}xn|D]f} | jdr|j | dq| jdr|j | dq|j | |j | qWdj |}dj |}| } |jj |d| }|jjdkr|ddj g|D]} | j ^qn}|jj |d| }n|jj |d| }|jjdkr|ddj g|D]} | j^q}|jj |d| }n||||fS(NRcs@^it@it,tcase_sensitive(RRRlRRjRR=RqR4ReRt return_groupsRntreturn_environmentsRs( RIRRtigrpstievgrpstgrpstevgrpstgpatstepatstpattcsR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_groupReturnGroups7s>     --cCsLg}g}g}g}|jjdkr?tjtdn|j||\} } } } | dk ri} x| D]}|| |j|j rK|j |qKq}|j |q|rp|j r}|j |q}q|j |qWxk| D]c}| dkr|j }n"|j | k}|r| |j =n|r|j |q|j |qW| dkri} n| dkri} n| s&t| s3txo| jD]a}tj}|j|_ t|_ |j |_x|jD]}d|j|t einstalledt eavailableRMRORNRPtdigrpsRFtievgrpRt grp_installedtevgrptevgrp_installedR>((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt doGroupLists_s                               c Csg}|jj|}|s=tjtdt|nx|D]}|j|}t|_|j }|j }xv|D]n}||kr||dkrq{n|j d|dt} |j | x| D]} | j j|qWq{W|rD|jj|qDqDW|S(s Mark all the packages in the given group to be removed. :param grpid: the name of the group containing the packages to mark for removal :return: a list of transaction members added to the transaction set by this function sNo Group named %s existsRRtsilence_warnings(RRKRRwR R-R?R9ttoremoveR:RnR'RRlReRt del_group( RItgrpidt txmbrs_usedt thesegroupst thisgroupt igroup_dataRR~RRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt groupRemoves&       c Cs+|jj|}|s7tjtdt|nx|D]}t|_|j}x|jD]}x|j D]}|j j |krp|j j t krpy|jj|Wn9tk r|jjtjtd|j |qpnXt|jdkr|j j|j jqqpqpWq`Wq>WdS(sUnmark any packages in the given group from being removed. :param grpid: the name of the group to unmark the packages of sNo Group named %s existss%package %s was not marked in group %siN(RRKRRwR R-RbRdR:RRRRGRRlR'RR{RRRR"Rc(RIRfRhRiRRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt groupUnremoves$   $ c Csg}|jj|}|s=tjtdt|nx|D]}|j|}|j}|j}xm|D]e}||kr||dkrqrn|j |} |j | x| D]} | j j |qWqrW|rD|j j|qDqDW|S(sMark all the packages in the given group to be removed. :param evgrpid: the name of the environment containing the groups to mark for removal :return: a list of transaction members added to the transaction set by this function sNo Environment named %s existsR(RRLRRwR R-RGR@RsRkRRqReRtdel_environment( RItevgrpidRgRhRiRjRORRRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pytenvironmentRemove s$      c Csg}|jj|}|s=tjtdt|n|jj}|rX|}n|jjdkrst }nx|D]} | j rqznt | _ |} g} d|kr| j | j nd|kr| j | jnd|kr| j | jn|j| } d} | rl| j|jjkrM|jj| j} t } ql|jj| j| j|nx.| D]&}| |dkrs| j|qsqsWt|}x| D]}|jjdkr-|| kst|| ks| |jdr-td }|jjtj||| jqq-n|jjtjtd || j| dk r}| jj |t |j_!ng}y| r|jjd ks| r| |dkr|j"d |d d}ni| r| |dkrnP|j#d |d d}x5|D]-}| j|_$| r+| |_%q| |_&qWWn/tj'k rj}|jj(td|qX|j |x!|D]}|jj| jqWqW|jj)}|dk r|}nd}| r|rx| j*j+D]\}}|j,|ry|j#d |}Wntj'k r.qn&X||j-j.krTg|j-j.|WdS(s@Unmark the groups in the given environment group from being installed. :param evgrpid: the name of the environment group containing the groups to unmark from installation :param force: if True, force remove all the packages in the given groups from the transaction sNo Environment named %s existsRIN( RRLRhRRwR R-RRRlR(RIRnRRPR`RO((s0/usr/lib/python2.7/site-packages/yum/__init__.pytdeselectEnvironment;s  cCsx$|jD]}|j|kr |Sq W|jj|}t|dkr|j|d||rhdStjt dt |nt|dkr|d}n |d}|S(sReturn a package object that corresponds to the given package tuple. :param pkgtup: the package tuple specifying the package object to return :param allow_missing: If no package corresponding to the given package tuple can be found, None is returned if *allow_missing* is True, and a :class:`yum.Errors.DepError` is raised if *allow_missing* is False. :return: a package object corresponding to the given package tuple :raises: a :class:`yum.Errors.DepError` if no package corresponding to the given package tuple can be found, and *allow_missing* is False iRcs2Package tuple %s could not be found in packagesackiN( RRcRHtsearchPkgTupleR"R"RRtDepErrorR R(RIRct allow_missingRRR^((s0/usr/lib/python2.7/site-packages/yum/__init__.pytgetPackageObjectMs  cCsd|jj|}t|dkrV|j|d|tjtdt|n|d}|S(s=Return a :class:`yum.packages.YumInstalledPackage` object that corresponds to the given package tuple. This function should be used instead of :func:`searchPkgTuple` if you are assuming that the package object exists. :param pkgtup: the package tuple specifying the package object to return :return: a :class:`yum.packages.YumInstalledPackage` object corresponding to the given package tuple :raises: a :class:`yum.Errors.RpmDBError` if the specified package object cannot be found iRcs,Package tuple %s could not be found in rpmdb(RFRR"R#Rt RpmDBErrorR R(RIRcRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRts  cCs|jjd}tjj|r&dStjjd|jj}|j t j t j B|j dd}|j}~~|dkrdStjj|}tjj|stj|nt|d}|j~dSdS( sChecks for the presence of GPG keys in the rpmdb. :return: 0 if there are no GPG keys in the rpmdb, and 1 if there are keys s/.gpgkeyschecked.yumiR8Rs gpg-pubkeyitwN(RRWRRRRCt transactiontinitReadOnlyTransactionRt pushVSFlagsRt_RPMVSF_NOSIGNATURESt_RPMVSF_NODIGESTStdbMatchRRRRR(RItgpgkeyscheckedtmytstidxRtmydirR6((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt gpgKeyChecks$   cCs|s gSt|tjkr1|\}}}n|}d}d}|ddkr|j}t|dkr|\}}}|tkrtjt dt |nt|}qn|dkr|j j |S|j j |||jS(sReturn a list of package objects that provide the given dependencies. :param depstring: a string specifying the dependency to return the packages that fulfil :return: a list of packages that fulfil the given dependency iR6isInvalid version flag from: %sN(RXR.t TupleTypeRRR"t SYMBOLFLAGSRt YumBaseErrorR RRHR!t getProvidesR(RIt depstringtdepnametdepflagstdepvert dep_splitt flagsymbol((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR s"   cCs|}t|tjkr*t|}ny|j|}Wn*tjk ritjtd|nXt|}|j |j d|}|dkrtjtd|n|S(sReturn the best, or first, package object that provides the given dependencies. :param depstring: a string specifying the dependency to return the package that fulfils :return: the best, or first, package that fulfils the given dependency :raises: a :class:`yum.Errors.YumBaseError` if no packages that fulfil the given dependency can be found sNo Package found for %sRN( RXR.t StringTypesRR RRR Rt_bestPackageFromListRR(RIRRRKtpsR^((s0/usr/lib/python2.7/site-packages/yum/__init__.pytreturnPackageByDeps    cCs|s gSt|tjkr1|\}}}n|}d}d}|ddkr|j}t|dkr|\}}}|tkrtjt dt |nt|}qn|dkr|j j |S|j j |||jS(s&Return a list of installed package objects that provide the given dependencies. :param depstring: a string specifying the dependency to return the packages that fulfil :return: a list of installed packages that fulfil the given dependency iR6isInvalid version flag from: %sN(RXR.RRRR"RRRR RRFR!RR(RIRRRRRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR%s"    cCs|}t|tjkr*t|}ny|j|}Wn*tjk ritjtd|nXt|}|j |j d|}|dkrtjtd|n|S(sReturn the best, or first, installed package object that provides the given dependencies. :param depstring: a string specifying the dependency to return the package that fulfils :return: the best, or first, installed package that fulfils the given dependency :raises: a :class:`yum.Errors.YumBaseError` if no packages that fulfil the given dependency can be found sNo Package found for %sRN( RXR.RRR%RRR RRRR(RIRRRKRR^((s0/usr/lib/python2.7/site-packages/yum/__init__.pytreturnInstalledPackageByDeps    cCsWt|dkrdSt|dkr0|dS|j|ddd|}|ddS(stake list of package objects and return the best package object. If the list is empty, return None. Note: this is not aware of multilib so make sure you're only passing it packages of a single arch group. :param pkglist: the list of packages to return the best packages from :param req: the requirement from the user :return: a list of the best packages from *pkglist* iitreqpoRN(R"Rt_compare_providers(RIRKRtbestlist((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR,s cCsg}|jj|}g}g}g} xq|D]i} | j|krLq1q1| jdkrk| j| q1td| jr|j| q1|j| q1W|j|d|} |j|d|} |j| d|} |r | r | r | j| jkr d} n| dkrE| r,|j| n| r|j| qn| r|j| | gd|}|jdkr|j| q| r|j| n| r|j| qn]| r|j| | gd|}|jdkr|j| q|j| n |j| |S(s,Return the best packages from a list of packages. This function is multilib aware, so that it will not compare multilib to singlelib packages. :param pkglist: the list of packages to return the best packages from :param arch: packages will be selected that are compatible with the architecture specified by *arch* :param single_name: whether to return a single package name :param req: the requirement from the user :return: a list of the best packages from *pkglist* RyRFRN(RFt get_arch_listReRRRR(RIRKRFt single_nameRt returnlisttcompatArchListtmultiLibt singleLibRyRtmultitsingletnoRx((s0/usr/lib/python2.7/site-packages/yum/__init__.pytbestPackagesFromListCsL $   c sSjd k r*jjjg}njjs:d Stdstj}t j j gg}j j dt|_jjdtj||_njjjg}j|krO|j}g}x4|D],}tj|ds|j|qqW|r,|}nt|dkrx|d}g|D] } |d| dkrO| ^qO}nt|dkrd} |j| |d}g|D]} | || s| ^q}nt|dkrdfd} |j| nx3|D]+} j| d t} | d k r| SqWd Sd S( s Given a package return the package it's obsoleted by and so we should install instead. Or None if there isn't one. RARBsObs Init time: %0.3fiic SsI|\}}}}}|\}}} } } t|||f| | | fS(N(R( RRtn1ta1te1tv1tr1tn2ta2te2tv2tr2((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _sort_verscSs:t||}|sdSt||}|s2dS||S(Ni(R(tcarchRRtres1tres2((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _sort_arch_isc se|\}}}}}|\}}} } } j||} | rI| Sjj||} | S(N(RFtbestarch( RRRRRRRRRRRRR(RRRI(s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _sort_archsRN(RkRRtcheckForObsoleteRcRRJRRRCRDRERHRKR9RIR{RRARRFReR"R^R( RIRtthispkgobsdictRXRR=t oobsoletingtopkgtupRRcRRR((RRRIs0/usr/lib/python2.7/site-packages/yum/__init__.pyt _pkg2obspkgsP         #       cCs|}t}x{tr||}|dkr8| r8dS|dkrH|S||}|dkrd|St}||}||krdSqWdS(s Generic comp. sci. test for looping, walk the list with two pointers moving one twice as fast as the other. If they are ever == you have a loop. If loop we return None, if no loop the last element. N(RbR9R(RItnodet next_functslowRtnext((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _test_loops       cCs8t|dr4d|jjd||jjdfS|S(s1Attempt to make the string look bold in terminal.Rs%s%s%sRR(RRR(RItstring_((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs%c Cs?|ddkst|d}g}y |j}Wn*tjjk r_}|jj||SXt}|r|ddkr|d}x|j|D]1}t }|j |j d|} |j | qWnExB|j |D]1} t }|j| jd|} |j | qW|s;tjtd|j|n|S(s= Do groupinstall via. leading @ on the cmd line, for install.iRHit^RsGroup %s does not exist.(RRRRRwRzRRbRLR9RRsRRKRRntGroupInstallErrorR R( RItpatternRt group_stringt tx_returnRRRjtenv_grpRR<((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_at_groupinstalls.    "cCs`y|j|dtSWnBtjk r[}|jjtd||jjrUgSnXdS(s= Do group upgrade via. leading @ on the cmd line, for update.Rs Warning: %sN( RR9RRRzRR Rtskip_missing_names_on_update(RIRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_at_groupupgrade s cCs|ddkst|d}g}|r|ddkr|d}y|j|}Wn0tjjk r|jjtd|nX|j||Sy|j |}Wn0tjjk r|jjtd|nX|j||S(s; Do groupremove via. leading @ on the cmd line, for remove.iRHiRs-Warning: Environment Group %s does not exist.sNo group named %s exists( RRoRRRwRzRvR RRk(RIRRRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_at_groupremoves"    cCs|ddkst|d}|jj|}|sWtjtdt|nt}x|D]}|j|j qgW|j j |S(s8 Do downgrade of a group via. leading @ on the cmd line.iRHisNo Group named %s exists( RRRKRRwR R-RR R:RHR(RIRRfRhtpkgnamesRi((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_at_groupdowngrade/s   cCs|ddkst|dj}|rR|jdrR|d}|j|S|r|ddkr|d}|j|S|jj|S(s5 Remove things from the transaction, like kickstart. it-is@^iRH(RtstripR4RRRtdeselect(RIRRS((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_minus_deselect>s    ccs|jjsdSt|tsqxn|jjd|jD]2\}}|j|kr8|j|}|Vq8q8Wnx|j |D] }|VqWdS(s; Return the pkgs. that are obsoleted by the po we pass in. NR( RRJRR&RtgetObsoletersTuplesRRcRt_find_obsoletees_direct(RIRtobstuptinst_tupt installed_pkgR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_find_obsoleteesMs %ccsRxK|jD]@}x7|jjd|D] }|j|gr&|Vq&q&Wq WdS(s< Return the pkgs. that are obsoleted by the po we pass in. This works directly on the package data, for two reasons: 1. Consulting .up. has a slow setup for small/fast ops. 2. We need this work even if obsoletes are turned off, because rpm will be doing it for us. RN(tobsoletes_namesRFR+t obsoletedBy(RIRtobs_nR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR[scGs=x6|D].}||jjkr|jjj|qqWdS(sB Add all of the passed flags to the tsInfo.probFilterFlags array. N(RRRe(RItflagstflag((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_add_prob_flagsfs cCs`xY|jjd|jD]?}|j|rt|j|j r|jtjt SqWt S(s9Add RPMPROB_FILTER_OLDPACKAGE if the package requires it.R( RFR+RRRRFRRRR9Rb(RIRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRls %cCstr(|jdk r(|j|jjkS|j|r;tSx|D]y}|j|r]qBn|j|jkrst Sd|j|jfkrt S|jj st St |j|jrqBnt SWtS(sh See if po is an upgradeable version of an installed pkg. Non-compat. arch differences mean no. RyN( RbRkRRcRt updating_dictRtverLERFR9RMR(RIRRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_install_is_upgradets"  cCs|s!|jj|jg}n|}xB|jj|jD]+}|jtkrYq>n|j|jq>Wxy|D]q}|j |j krqtn|j |sqtnt |j |j rqtn|j j tjtd||tSWtS(sj See if we can install this arch of package, mainly for i386 vs. i586 or ppc64 vs. ppc64 etc. s&Package: %s - can't co-install with %s(RFRRRRRRReRRFRRR{RRRR RbR9(RIRRRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_valid_install_archs$ cCsX|jj s|jjdkr#tS|jdksA|jdkrEtS|j|jjkS(syReturn whether this obsoleter meets multilib_policy in case we are dealing with the noarch->arch obsoletion case.RxRy(RFRMRRR9R(RIR`t obsoletee((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_valid_obsoleter_archs c so |jdd}fd}i|d6jjd6}||krPd}n||}g}t}|rt|tst|tr|j|q tj t dnq|stj t dnd|kr'|dr|dd d krj |dS|dr4|dd d kr4j |dSd)}d |krS|d }nt}|dg} jjd | d |dt} |j| | s|d} jjt d| j| } |rtj| |} ntj| sj| dtd| } n|j| qn{j|} jjd| dd| dd| dd| dd| d}j|| tj||jd }|r jjr|s| d rjjdkri} g}g}jj}|jdxG|D]?}|j|kr;d| |j <|j|q |j|q Wx-|D]%}|j | krS|j|qSqSW|}qqnt!|}i}xD|D]<}|j |kr|g||j t=j?t=j@j%jA|j'PqqWjB|tCjD|}|rH xe|D];}j%jE||}j%jF|||j|q WqAj%jG|}|j|qAW|S(*sfMark the specified item for installation. If a package object is given, mark it for installation. Otherwise, mark the best package specified by the key word arguments for installation. :param po: a package object to install :param kwargs: if *po* is not specified, these keyword arguments will be used to find the best package to install :return: a list of the transaction members added to the transaction set by this function :raises: :class:`yum.Errors.InstallError` if there is a problem installing the package Rvtflibblecsjjtj||dS(N(R{RRRE(R R (RI(s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_dbg2sRwRs0Package Object was not a package object instancesNothing specified to installRiRRHRRRs3Checking for virtual provide or file-provide for %sRRRRRFRRRHRRxRyis=Checking for installed virtual provide or file-provide for %sRcs&Package %s installed and not availables"No package(s) available to installs)Package: %s - already in transaction setRtlimits8Package %s is obsoleted by %s which is already installedt provides_forsWPackage %s is obsoleted by %s, but obsoleting package does not provide for requirementss;Package %s is obsoleted by %s, trying to install %s insteads/Package %s already installed and latest versions;Package matching %s already installed. Checking for update.N(HRR{RRbRR%R&ReRRR RRRR9RHRRRR RRRRt_nevra_kwarg_parseR+R"RFRMRRRRRR=RFR%RRRcRRRRRRRRR RRJRRRRR9RRRRRRtRPMPROB_FILTER_REPLACEPKGtRPMPROB_FILTER_REPLACENEWFILEStRPMPROB_FILTER_REPLACEOLDFILESR'RRRt addObsoletingR%t addInstall(RIRR tpkg_warnRt level2funcRt was_patternRtpatstmypkgsRR t pkgs_by_nameRt not_addedRxRt pkgbynametlstRRRtobsoleting_pkgt already_obsRjRtobs_pkgsRR((RIs0/usr/lib/python2.7/site-packages/yum/__init__.pyR9sH                                  !          (!  (    c Cst|jd}t|jd}g}x|j|D]}|jj|}x|D]y}xp||D]d} |jd| sp|j|jf} x3|jj | D]}|j |j d|qWPqpqpWq_Wq@W|S(s Check for any difference in the provides of the old and new update that is needed by the transaction. If so we "update" those pkgs too, to the latest version. RWR( Rt returnPrcot differenceRt getRequirest inPrcoRangeRRFRHRRR ( RItopkgtnpkgtoprovstnprovsRR2RRRtnaTup((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_check_new_update_providess c Cst}x|jj|tgD]}d}x|jD]z}|j|rW|d7}q5xU|jj|jD]>}|jj|j j|j |j |} |j | qmWq5W|rt }q|jj|j jqW|S(s We return True if there is a newer package already in the transaction. If there is an older one, we remove it (and update any deps. that aren't satisfied by the newer pkg) and return False so we'll update to this newer pkg. ii( RbRRR)R*RRRcR'RR#RR9( RIRct available_pkgRRjRRRtntxmbrR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_newer_update_in_transs    cCs\|jj||}|r+|j|nd|jkrX|jjdkrXd|_n|S(NRR4(Rt addUpdatetsetAsDepRR(RIt requiringPotupkgRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _add_up_txmbrs ! c, s |jdd}fd}i|d6jjd6}||krPd}n||}g}| r| rjjtjtdjj} j j rjj dd} ng} x| D]\} } j | d t } | d'krqnj| }j| |s$qnj| j}|d'k rN|} njj| |}jj|| |r|j|n|j|qWx| D]\}}jjd |rjjtjtd |qj |d t }|d'krqn|jjd |qWj jd krj jrx.jjD] }|jjd|qWWx1jj D] }|jjd|qWn|Sg}g}t }|r|j!dkr|j|q|j|nd|kr|dr5|dddkr5j"|dS|drd|dddkrdj|dS|d}|sj#j$d|g}t%j&||jd}n'j'j$d|gd|jd}| r| rg}y+|rj(|}nj)|}Wn3t*j+j,k rE}j-j.td|nXt%j&||jd}|rw|j|q|j|nyz|rg}ng|jdr|dg}j'j/|d}|j0d|}n"|dg}j'j0d|}Wnt+j1k rg}nX|j|| r}| r}j-j.tdt2|j j3s}t+j4tdq}nd|dk}nj5|}j#j6d|dd|dd|dd|dd|d }|sj'j6d|dd|dd|dd|dd|d }j7||t8|dkrpj9||}t:d!|}q|s|td"j;|qnj j rQx|D]}jj<j|j=g}g}xb|D]Z} j | d t } | d'krqn| r&j| | r&qn|j| qWx-t>|D]} |jj?d | qDWqWx|D]}!xj@|!D]}"| rj|!|" rqn|"j=}#jj|!|"}|r|j|n|j|jj|#r$jjtjtd#|#qjj|"|!}|j|qWqrWnx|D]z}xqjjAj|j=gD]T}$j |$d t }|d'krqznjj|j=rjjtjtd |j=qz|j=jjBd|jCkr~ xj@|D]d}%jjD||}|rD |j|njj||%jj|%||j|q WqzjjE|j=tFr jjG|j=njH|||}|j|qzWqXWx0|D](}!jI|!s q ntJ|!tKr |!jC}&xmj#jL|&D]Y}'|'j=}(jjE|(tFrZ jjG|(njH||!|'}|j|q# Wq nj|!j} | d'k r |jdr | j!|jdkr q njjtjtd$|!|jjd | q nxjjMj|!j=gD]}(jj|(ri jjtjtd |(q. jN|(|!|r jjtjtd%|(q. j|(}'jjE|(tFr jjG|(njH||!|'}|j|q. Wj#j6d|!jCd|!jO})|)rG jP|!rG tQ|)d&})nx|)D]}*jj|*j=r jjtjtd |*j=qN jN|*j=|!|r jjtjtd%|*j=qN |*jR|!rN jH||!|*}|j|qN qN Wq Wxq|D]i}x`j#j6d|jCD]F}+|+|jSkr/ jT|jU|+ru jjV|+|jUqu q/ q/ Wq W|S((sOMark the specified items to be updated. If a package object is given, mark it. Else, if a package is specified by the keyword arguments, mark it. Finally, if nothing is given, mark all installed packages to be updated. :param po: the package object to be marked for updating :param requiringPo: the package object that requires the upgrade :param update_to: if *update_to* is True, the update will only be run if it will update the given package to the given version. For example, if the package foo-1-2 is installed,:: updatePkgs(["foo-1-2"], update_to=False) will work identically to:: updatePkgs(["foo"]) but:: updatePkgs(["foo-1-2"], update_to=True) will do nothing :param kwargs: if *po* is not given, the names or wildcards in *kwargs* will be used to find the packages to update :return: a list of transaction members added to the transaction set by this function RvRcsjjtj||dS(N(R{RRRE(R R (RI(s0/usr/lib/python2.7/site-packages/yum/__init__.pyRsRwRsUpdating EverythingRBiRRcs>Not Updating Package that is already obsoleted: %s.%s %s:%s-%sRRcs@^RHRRiRRRs%ssNo Match for argument: %ss1Not tolerating missing names on update, stopping.R4RRRFRRRHRcSs|dS(Ni((R((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRss!No package matched to upgrade: %ss,Package is already obsoleted: %s.%s %s:%s-%ss*Not Updating Package that is obsoleted: %ss<Not Updating Package that is already updated: %s.%s %s:%s-%siN(WRR{RRRRER RtgetUpdatesTuplesRRJRRR9RRRRRRR R%R(Ret isObsoletedRR Rjtupgrade_group_objects_upgradeRRqRRlRRRFRRRRHR R%RRRRzRvRRRR-RtUpdateMissingNameErrorRR+R"R"Rtmapt_ui_nevra_dicttobsoleted_dictRcRR9Rt updatesdicttgetObsoletesListRR'RRR'R+RRR&treturnNewestByNameRR&RFRRtverLTRDt_does_this_updateRt addUpdated(,RIRR)t update_toR RRRRRDRJR=RRRttopkgRtnewtoldR^RFtinstpkgst availpkgstarch_specifiedRt depmatchesRRRR tobs_tupsRRcR$t obsoleted_pkgR<tupdatingRR,t updated_pkgR?t pot_updatedRti_pkg((RIs0/usr/lib/python2.7/site-packages/yum/__init__.pyR s!             !           "      !   # " !         "        !   $c Ks| r| rtjdng}g}|r;|g}nYd|kr|drv|dddkrv|j|dS|dr|dddkr|j|dS|jj|dg\}}}d|krtj||d}tj||d}n|j||j||rg}|d} y|j | }Wn3t jj k rz}|j j td|nXd|krtj||d}n|st| } |j j tdt| q|j|qn|j|} |jjd | d d | d d | d d | d d| d}|j|| t|dkr|jdts|j jtd|j| qn|jj} tj| } x|D]}|jjr|j| kr|j jtd|qn|jj|jr_xM|jj|j D]3} |j j!td| |jj"| jq%Wn|jj#|} |j$| qW|S(sZMark the specified packages for removal. If a package object is given, mark it for removal. Otherwise, mark the package specified by the keyword arguments. :param po: the package object to mark for installation :param kwargs: If *po* is not given, the keyword arguments will be used to specify a package to mark for installation :return: a list of the transaction members that were added to the transaction set by this method :raises: :class:`yum.Errors.RemoveError` if nothing is specified to mark for removal sNothing specified to removeRiRRHRs%ssNo Match for argument: %sRRRFRRRHRRcs No package matched to remove: %ssSkipping the running kernel: %ss Removing %s from the transaction(%Rt RemoveErrorRRRFtmatchPackageNamesRRRR%RRRzRvR R-RR+R#R"RRbRR1RRRRRcRRRRRR'taddEraseRe(RIRR RRRRRR@RR RRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR'Dsj   "       #( cCsg}g}g}g}|sy1t|d|jjd|dtjj}Wn.tjk r|jj t d||SX|j j t jt d|j|n|jddkr|jj t d||S|j|jjkr|jj t d ||j|S|jjrg|j|jj|j}|rg|jj t d ||d |Sn|jjd |j} t| d kr|r|jjt d |j|S|j|nxj| D]b} |j| rO| j|jjkr|j| jkr|j|q0|j|r9|j|q0|j|| fq|j| r|j| jkrt |jst | jr|r|jjt d|j|jq|j|q0|j|q|j|r#|r|jjt d|j|jq0|j|q|j|qW|g|D]} | d ^q>} |j!|| r|j j"t d||SxY|D]Q}|j j t jt d|j|j#j||j$|j%d|qWxh|D]`\}} |j j t jt d|j| |j#j||j&d|}|j$|qWx0|D](}|j j t jt d|jqRWx|D]x}|j'jr|j rxY|j(|j'D]B}|j)j*||j'|jj||j)j+|j'|qWqqW|S(s|Mark a package on the local filesystem (i.e. not from a repository) for installation. :param pkg: a string specifying the path to an rpm file in the local filesystem to be marked for installation :param po: a :class:`yum.packages.YumLocalPackage` :param updateonly: if True, the given package will only be marked for installation if it is an upgrade for a package that is already installed. If False, this restriction is not enforced :return: a list of the transaction members added to the transaction set by this method RturltuasCannot open: %s. Skipping.sExamining %s: %st payloadformattdrpms+Cannot localinstall deltarpm: %s. Skipping.sGCannot add package %s to transaction. Not a compatible architecture: %ssBCannot install package %s. It is obsoleted by installed package %siRsRPackage %s not installed, cannot update it. Run yum install to install it instead.sUPackage %s.%s not installed, cannot update it. Run yum install to install it instead.s Excluding %ssMarking %s to be installedRsMarking %s as an update to %ss&%s: does not update installed package.(,R(RFRR3Rt user_agentRR>RzRvR R{RRRR0RRFR,RRJRtsearchObsoletesRR+R"RReRRSRRRt_is_local_excludeRRRR9R RRRR%R (RIRRt updateonlyRt installpkgst updatepkgst donothingpkgst obsoleterstinstalledByKeyRRt check_pkgstoldpoRRtobs_pkg((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt installLocals   %%!   !cCs |sy1t|d|jjd|dtjj}Wn.tjk rg|jj t d|gSX|j j t jt d|j|n|j|jjkr|jj t d||jgS|j||gr|j jt d|gS|jd|S( sMark a package on the local filesystem (i.e. not from a repository) for reinstallation. :param pkg: a string specifying the path to an rpm file in the local filesystem to be marked for reinstallation :param po: a :class:`yum.packages.YumLocalPackage` :return: a list of the transaction members added to the transaction set by this method RRJRKsCannot open file: %s. Skipping.sExamining %s: %ssGCannot add package %s to transaction. Not a compatible architecture: %ss Excluding %sR(R(RFRR3RRNRR>RzRvR R{RRRR0RFR,RPRR(RIRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pytreinstallLocals c Ks|jtjtjtjg}|rG|j|jd|jn|j|j||sxtj t dnt |}g}g}g}x|D]}|j j } t|j _ t|trd|kr|jd|} n$|jd|jd|jd} | |j _ t | dkrz|jj|j|j||jt|j|j|jqn|j| qW|r| rtjt ddj|d |n|j||S( sMark the given package for reinstallation. This is accomplished by setting problem filters to allow a reinstall take place, then calling :func:`install`. :param po: the package object to mark for reinstallation :param kwargs: if po is not given, the keyword will be used to specify a package for reinstallation :return: a list of the transaction members added to the transaction set by this method :raises: :class:`yum.Errors.ReinstallRemoveError` or :class:`yum.Errors.ReinstallInstallError` depending the nature of the error that is encountered Rcs2Problem in reinstall: no package matched to removeRRtrepoid_installis6Problem in reinstall: no package %s matched to installs, t failed_pkgs(RRR R R RR'RcRtReinstallRemoveErrorR R"RRJRbRR&R9RRReRRtReinstallInstallErrorR( RIRR ttx_mbrsttemplent new_membersR8R]Rt old_conf_obstmembers((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR:s@        + cCs |sy1t|d|jjd|dtjj}Wn.tjk rg|jj t d|gSX|j j t jt d|j|n|j|jjkr|jj t d||jgS|j||gr|j jt d|gS|jd|S( sMark a package on the local filesystem (i.e. not from a repository) to be downgraded. :param pkg: a string specifying the path to an rpm file in the local filesystem to be marked to be downgraded :param po: a :class:`yum.packages.YumLocalPackage` :return: a list of the transaction members added to the transaction set by this method RRJRKsCannot open file: %s. Skipping.sExamining %s: %ssGCannot add package %s to transaction. Not a compatible architecture: %ss Excluding %sR(R(RFRR3RRNRR>RzRvR R{RRRR0RFR,RPRt downgrade(RIRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pytdowngradeLocalws cCsd|jjks$d|jjkr(tSg}t|jjdkrwt||jjdd\}}}||}n||krtStS(s0returns True if the local pkg should be excludedRTRiRi(RRRbR"R0R#R9(RIRRKttoexcRR0R((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRPs$  c Ks| r| rtjdnt}|r5|g}nud|krJ|drp|dddkrp|j|dS|dr|dddkr|j|d}t}q|jjd|dgdt}|s|d}|jj t d|y|j |}WqGt jj k rC}|jjt d t|qGXqn`|j|}|jjd |d d |d d |d d |dd|d}|j|||s.g}d|kr|jjd|dgdt}nd |kr|jjd |d }n|rgStjt dnt} g} x|D]} |j| r| j| jf| krt d| } |jjtj| n| j| j| jfqDn| j| qDW| }t} x|D]} | j| jqW|jjt| }i}i}xt |D]} | j|ksZ| j!|| jdrm| g|| j((R R,RR.R/R-tevr((s0/usr/lib/python2.7/site-packages/yum/__init__.pyR1?s*         cCsi}d|kra|d\}}}}}||d<||d<||d<||d<||d<|S|jd|d<|jd|d<|jd|d<|jd|d<|ddkr|jd|dGPG key signature on key %s does not match CA Key for repo: %ss,GPG key signature verified against CA Key(s)tmultiplesInvalid GPG Key from %s: %stkeyidRtuseridt fingerprinttraw_keys2GPG key parsing failed: key does not have value %sthexkeyidt valid_sigthas_sigN(Rs timestampsuseridRR(!RbRR R{RRRRtto_utf8Rt_default_graboptsRRWturlreadRmRRRR/tgpgcakeytgetCAKeyForRepoRTturlopentvalid_detached_sigtStringIOtgpgcadirR9t getgpgkeyinfoRt keyIdToRPMVertuppertboolRe(RItkeyurlR[tgetSigt key_installedRRRJRRftrawkeyRtsigfileRt keys_infoRtkeyinfotthiskeyR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_retrievePublicKeysh          %      tGPGc Csd}|jdr|td}|jj|}|rt|d}td||dt|dtj |||j |j ddf}qn|dkrtd||dt|dtj ||j ddf}n|j j d |dS( Nsfile:isaImporting %s key 0x%s: Userid : "%s" Fingerprint: %s Package : %s (%s) From : %sRRsfile://RsKImporting %s key 0x%s: Userid : "%s" Fingerprint: %s From : %ss%s(RR4R"RFt searchFilesRR R-Rtgpgkey_fingerprint_asciit ui_from_repoRRzRv(RIRRtkeytypeRtfnameR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_getKeyImportMessagebs"      c s|jjjj}t}fd}t}x|D]}|j|} x| D]} |jj} tj | | d| ddkr|j j t d|| dfqbnj r| dr| drt}n|j| |t} |jjrt} n|jjr*t} nr|ry|id 6| d d 6| dd6|d 6| d d 6| dd6} n#|r|| d | d} n| st}qbn|jj} | jtj| d } | dkr t d| }tj||n|j j t dt}qbWqCW| rP|rPtjt dn|s~t dj}tj||n|j\} }| dkrt d}|j j |t|}tj||ndS(sRetrieve a key for a package. If needed, use the given callback to prompt whether the key should be imported. :param po: the package object to retrieve the key of :param askcb: Callback function to use to ask permission to import a key. The arguments *askck* should take are the package object, the userid of the key, and the keyid :param fullaskcb: Callback function to use to ask permission to import a key. This differs from *askcb* in that it gets passed a dictionary so that we can expand the values passed. :raises: :class:`yum.Errors.YumBaseError` if there are errors retrieving the keys cs*|tddjjf7}|S(Ns; Failing package is: %s GPG Keys are configured as: %s s, (R RR(R(RR[(s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_prov_key_datas RRis)GPG key at %s (0x%s) is already installedRRRRRRRRsKey import failed (code %d)sKey imported successfullysDidn't install any keyssThe GPG keys listed for the "%s" repository are already installed but they are not correct for this package. Check that the correct key URLs are configured for this repository.s+Import of key(s) didn't help, wrong key(s)?N(R]RRRRbRRFRRt keyInstalledRzRR RR9RRtassumenot assumeyestpgpImportPubkeyt procgpgkeyRRRR[R-(RIRtaskcbt fullaskcbtkeyurlsRRt user_cb_failRRRRRfR^RR(((RR[s0/usr/lib/python2.7/site-packages/yum/__init__.pytgetKeyForPackage|sf   #              c sat}fd}t}xD]} |j| d } x| D]} tt| ddd!jtj|kr|jjt d| | dft }qNnr9j d} d } g}y(t | d j }|jd }Wnttfk rnXt| d|kret }qen,d } jre| d re| dret }n|s|j| | | t}|jjrt}nd|jjrt }nO|r|id6| dd6| dd6| d6| dd6| dd6}n|st }qNqntj| d| dd|}|sat d| d}tj||n|jjt dt }rN|rN| d|krt | d}y-|j| dd |j|jWqttfk rqXqqNqNWq(W| r/|r/t d}tj||n|s]t dj}tj||ndS(sL Retrieve a key for a repository If needed, prompt for if the key should be imported using callback @param repo: Repository object to retrieve the key of. @param destdir: destination of the gpg pub ring @param keyurl_list: list of urls for gpg keys @param is_cakey: bool - are we pulling in a ca key or not @param callback: Callback function to use for asking for permission to import a key. This is verification, but also "choice". Takes a dictionary of key info. csKtd}r!td}n|td|djf7}|S(NtNotYessD CA Key: %s Failing repo is: %s GPG Keys are configured as: %s s, (R R(Rtcakeytxt(tis_cakeyt keyurl_listR[(s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs   RRiis(GPG key at %s (0x%s) is already importedRs/imported_cakeystCAR/s RRRR[RRRRRtgpgdirsKey %s import failedsKey imported successfullyR-s#Didn't install any keys for repo %ssThe GPG keys listed for the "%s" repository are already installed but they are not correct. Check that the correct key URLs are configured for this repository.N(RbRthexRRRtreturn_keyids_from_pubringRzRR R9RRRRRRRRRRRRtimport_key_to_pubringRRR tflushRR(RIR[tdestdirRRRQRRRRRRtikfRtcakeystcakeys_dRfR^Rtikfo((RRR[s0/usr/lib/python2.7/site-packages/yum/__init__.pyt_getAnyKeyForRepos|   2               cCs)|j||j|jdtd|dS(s-Retrieve a key for a repository. If needed, use the given callback to prompt whether the key should be imported. :param repo: repository object to retrieve the key of :param callback: callback function to use for asking for verification of key information RRQN(RRRRb(RIR[RQ((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt getKeyForRepoDscCs)|j||j|jdtd|dS(s-Retrieve a key for a repository. If needed, use the given callback to prompt whether the key should be imported. :param repo: repository object to retrieve the key of :param callback: callback function to use for asking for verification of key information RRQN(RRRR9(RIR[RQ((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRNscCs!d}|jjdkrdS|jjr/dSg}|jj}tj|\}}i}x|jjD]~}|j dkrqon|j rqon|j |j sqon|j |kr|j g||j Dependencies not solved. Will not save unresolved transaction.Nsyum_save_tx.%ss%Y-%m-%d.%H-%M.Rs.yumtxtprefixRs%s Ris1 is %s:%s:%s s%s:%s RRs&Could not save transaction file %s: %s(&Rt_unresolvedMembersRzRvR RRRtstrftimettempfiletmkstempRtfdopenRRtRFRR9Rt getTsFlagsRoRR"R]R^RR`RRRRt_dumpR RRRRR/( RIR#RRR'RRR/RR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs<  $0   )cCsyt|dj}Wn&ttfk rA}t|d fSX|sXtdd fS|ddkr|ddkr|dd!}q|dd !}nd |fS( s* Load the file into a simple data format. R/sFile is empty.is saved_tx: ishistory addon-info iiiN(Rt readlinesRRR/RR (RIR#RR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyt _load_ts_datasc! Csf|j|}|dd&k rEtjtd||dfn|d}|d&krj|jj}n|d&kr|jj}n|d&kr|jj}n|rt }n|dj }|t |j j dt dkrAtd}|r|td7}|jjt|qA|td7}tj|nyt|dj }Wn4ttfk r} td}tj|nX|jj|t|d j } g} d | } d&} xk|d | !D]\}|j jd }|r+|dd kr+d |d|d f} qn| j|qWt|| j }| d}d}t}d&}t}x||D]}|j}|jdr3|r|jj|||jjkr| r|jjj|qnt}|jd dj jd\}}t|j }t|j jd}y_|tkrd|j |}n=|t!kr|j"|}ntd|}tj|Wnftjk r } t }tdt ||f}|stj|q0t }|jj|q3X|d7}t#j$|}||_%qn|j }|jd d\}}|j&}|d'kr|j j'}|dkrt(||tqT|dkrTt(||t qTn|dkrt(||t|j ng|dkr|j)j*|jdn?|d(krx0|j jdD]}|jd \}}yO|d!kr|j t|jd}n|j"t|jd}WnHtjk r} td"t ||f}|jj|t }q7Xt+||}|j|t(|||q7Wn5|d#kr>x&|jdD]}|jd \}} |jd \}}yO|d!kr|j t|jd}n|j"t|jd}WnHtjk r} td"t ||f}|jj|t }q;Xt+||}|j|| ft(|||q;Wnt(|||j |rt }qqW|jj|||jjkr|jjj|n||krt }n|rtd$}|rt }|td%7}|jj|q|td7}tj|nt,|j|kr5d&} n| d&k rY|| |f|j_-n|jj.S()s,Load a transaction from a .yumtx file. :param filename: the name of the file to load the transaction from :param ignorerpm: whether to ignore starting rpmdb version mismatch. :param ignoremissing: whether to ignore that there may be transaction members missing :param ignorenewrpm: whether to ignore ending rpmdb version mismatch. :return: the members of the loaded transaction :raises: :class:`yum.Errors.YumBaseError` if there are problems loading the transaction is/Could not access/read saved transaction %s : %siRs/rpmdb ver mismatched saved transaction version,s ignoring, as requested.s aborting.s+cannot find tsflags or tsflags not integer.iiRRs%s:%ssmbr:RRIs(Found txmbr in unknown current state: %ss$Could not find txmbr: %s in state %stisDepRtfalseRRRlR*R&t downgraded_byRRDRJR2RHRs(Could not find txmbr: %s from origin: %sRFsCTransaction members, relations are missing or ts has been modified,s- ignoring, as requested. You must redepsolve!N(R's reinstall(s updated_bys obsoleted_byR)s downgradessupdatess obsoletess depends_on(/R&RRRR Rtloadts_ignorerpmtloadts_ignorenewrpmtloadts_ignoremissingR9RRRFRRzRvRRRRtsetFlagsRReRbtrstripR4RRRR'RRBRRDRRtTransactionMembert current_statetlstripRRRlRRR"RR(!RIR#t ignorerpmt ignoremissingt ignorenewrpmRtrpmvRRRtnumreposR]trindext future_rpmdbvR/R[tnumpkgstpkgstarttpkgcounttpkgprobtcurpkgt missinganyR7RcR0RR R.tpkgspectorigintcurlistRRH((s0/usr/lib/python2.7/site-packages/yum/__init__.pytload_ts,s&     %     (             !"    !"       c Cst}t}g|jjdtD]}|j^q(}i}x!|jjD]}t|| Marking %s to be removed - no longer needed by %sRs+Found and removing %s unneeded dependenciesN(RRRRRRFRR9trequired_packagesRRRbt_has_needed_revdepstrequiring_packagesRR'R(ReRR{RRRR"( RIt found_leavestcheckedttt beingremovedtokay_to_removeRRtrequiredt still_neededt requiringRR((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRs8  +      cCs||s-|jjtjtd|tS|jjtjtd|i}x!|jjD]}t||R@R?R]RaR\RRRRRtpropertyR]RHRRFRRRRRRRtupinfoRqRRRRRR!R"R#R RRR R1R R8RRRIRmRRR9R5R7t YUM_PID_FILERRt staticmethodRRRR<RARRRR[RRRRRRRRRRRRRRRR9R?RGRURbRkRlRoRRRRRRRR RR%RRRRRRRRRRRRRRRRRRR9R#R&R+R R'RZR[RRfRPReR1RRRRRRRRRRRRRRRRRRRR&R7RRRR&RBRRD(((s0/usr/lib/python2.7/site-packages/yum/__init__.pyRes +    }  Y       * :  0  M #                                           n          C    .  7  ' 1 ? *           & #(  l #  ! +I  '   %  &   H F                U U  =    K : N _i \#    3 :  #   3  3((((kRMRtos.pathRRuR R&R.R!RRRRxtlogging.configRR Rktyum.i18nRRR R RRRRRRRtrpmUtils.updatesRCt rpmUtils.archRRRRtrpmUtils.miscutilsRtrpmUtils.transactionRRR]RRRRRRRWturlgrabber.grabberRRturlgrabber.progressRt packageSackRRRRfR;RRRt yum.historytyum.fssnapshotsR R!t yum.igroupsRRt simplefilterRR:R#R$R%R&R'R(R)t constantst yum.rpmtransR+R,R-R.R/tyum.drpmR0R1RRZR2R3t __version__RRRRRRRNR5RNRYRgRe(((s0/usr/lib/python2.7/site-packages/yum/__init__.pyts                        "                  .PK[z site-packages/yum/failover.pynuȯ#!/usr/bin/python # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2003 Jack Neely, NC State University # Here we define a base class for failover methods. The idea here is that each # failover method uses a class derived from the base class so yum only has to # worry about calling get_serverurl() and server_failed() and these classes will # figure out which URL to cough up based on the failover method. """Classes for handling failovers for server URLs.""" import random class baseFailOverMethod: """A base class to provide a failover to switch to a new server if the current one fails. """ def __init__(self, repo): self.repo = repo self.failures = 0 def get_serverurl(self, i=None): """Return a server URL based on this failover method, or None if there is a complete failure. This method should always be used to translate an index into a URL, as this object may change how indexes map. :param i: if given, this is the index of the server URL to return, instead of using the failures counter :return: the next server URL """ return None def server_failed(self): """Notify the failover method that the current server has failed. """ self.failures = self.failures + 1 def reset(self, i=0): """Reset the failures counter to the given index. :param i: the index to reset the failures counter to """ self.failures = i def get_index(self): """Return the current number of failures, which is also the current index into the list of URLs that this object represents. :fun:`get_serverurl` should always be used to translate an index into a URL, as this object may change how indexes map. :return: the current number of failures, which is also the current index """ return self.failures def len(self): """Return the total number of URLs available to cycle through in this object. :return: the total number of URLs available """ return len(self.repo.urls) class priority(baseFailOverMethod): """A class to provide a failover to switch to a new server if the current one fails. This classes chooses the next server based on the first success in the list of servers. """ def get_serverurl(self, i=None): """Return the next successful server URL in the list, or None if there is a complete failure. This method should always be used to translate an index into a URL, as this object may change how indexes map. :param i: if given, this is the index of the server URL to return, instead of using the failures counter :return: the next server URL """ if i == None: index = self.failures else: index = i if index >= len(self.repo.urls): return None return self.repo.urls[index] class roundRobin(baseFailOverMethod): """A class to provide a failover to switch to a new server if the current one fails. When an object of this class is created, it selects a random place in the list of URLs to begin with, then each time :func:`get_serveurl` is called, the next URL in the list is returned, cycling back to the beginning of the list after the end is reached. """ def __init__(self, repo): baseFailOverMethod.__init__(self, repo) random.seed() self.offset = random.randint(0, 37) def get_serverurl(self, i=None): """Return the next successful server URL in the list, using the round robin scheme, or None if there is a complete failure. This method should always be used to translate an index into a URL, as this object may change how indexes map. :param i: if given, this is the index of the server URL to return, instead of using the failures counter :return: the next server URL """ if i == None: index = self.failures else: index = i if index >= len(self.repo.urls): return None rr = (index + self.offset) % len(self.repo.urls) return self.repo.urls[rr] # SDG PK[D{99site-packages/yum/history.pycnu[ v_c@sddlZddlZddlZddlZddlZddlmZddlmZm Z m Z ddl j Z ddl Zddl TddlmZmZmZddlmZmZddlmZdZid e6d e6d e6d e6d e6de6de6Z i ed 6ed 6ed 6ed 6ed 6ed6ed6ed6ed6ed6ed6Z!e"e#dZ$dfdYZ%defdYZ&de&fdYZ'dfdYZ(dfdYZ)de)fd YZ*d!fd"YZ+d#Z,dS($iN(tproxy(tsqlitet executeSQLt sql_esc_glob(t*(tYumInstalledPackagetYumAvailablePackaget PackageObject(t to_unicodetto_utf8(t getBaseArchs/var/lib/yum/historytUpdatetUpdatedtErasetInstalls True-Installt Obsoletedt Obsoletings Dep-Installt Reinstallt Downgradet DowngradedcCsF|d krg}ndddddddg}t}x*|D]"}tjj|r=t}Pq=q=Wt}|sdg}t}nt||krg}n|rt |}ng}t}xL|D]D}tj |r|j |dft}q|j |d fqW| r0| r0|r0|||tfS|}|||tfS( svSetup need_full and patterns for _yieldSQLDataList, also see if we can get away with just using searchNames(). tnamet sql_nameArchtsql_nameVerRelArcht sql_nameVertsql_nameVerRelt sql_envrat sql_nevratglobt=N( tNonetFalsetyumtmisctre_full_search_neededtTruet PATTERNS_MAXtPATTERNS_INDEXED_MAXtlenRtre_globtappend(tpatternst ignore_casetfieldst need_fulltpattpat_maxttmpt need_glob((s//usr/lib/python2.7/site-packages/yum/history.pyt_setupHistorySearchSQL>s:          t_YumHistPackageYumDBc BsYeZdZdZedddddddd gZd Zd Zd d Z RS(s9 Class to pretend to be yumdb_info for history packages. cCs ||_dS(N(t_pkg(tselftpkg((s//usr/lib/python2.7/site-packages/yum/history.pyt__init__hst command_linet from_repotfrom_repo_revisiontfrom_repo_timestampt installed_byt changed_bytreasont releasevercCs|j}|jdr.td||fn||jkrStd||fn|jj||}tr|dkrtd||fn|dkrdSt|pd}t ||||S(s0 Load yumdb attributes from the history sqlite. t_s%s has no yum attribute %stN( R2t startswithtAttributeErrort_valid_yumdb_keyst_historyt_load_yumdb_keyRRtstrtsetattr(R3tattrR4tval((s//usr/lib/python2.7/site-packages/yum/history.pyt __getattr__ps  cCs|j|}|dk S(N(tgetR(R3RGtx((s//usr/lib/python2.7/site-packages/yum/history.pyt __contains__scCs,yt||}Wntk r'|SX|S(sretrieve an add'l data obj(tgetattrRA(R3RGtdefaulttres((s//usr/lib/python2.7/site-packages/yum/history.pyRJs  N( t__name__t __module__t__doc__R5tsetRBRIRLRRJ(((s//usr/lib/python2.7/site-packages/yum/history.pyR1es   tYumHistoryPackagec BseeZdddZeddddddddd d g Zd Zd Zed dZ RS(c Cs||_||_||_||_||_|j|j|j|j|jf|_|dkrlg|_n,|jd}|d|ddfg|_d|_ ||_ t ||_ dS(Nt:iis ( RtversiontreleasetepochtarchtpkgtupRt _checksumstsplittrepoidRCR1t yumdb_info( R3RRYRXRVRWtchecksumthistorytchk((s//usr/lib/python2.7/site-packages/yum/history.pyR5s          t buildtimet buildhosttlicensetpackagertsizet sourcerpmturltvendort committert committimecCs|jdr%td||fn||jkrJtd||fn|jj||}tr|dkrtd||fn|dkrdSt|pd}t||||S(s0 Load rpmdb attributes from the history sqlite. R>s%s has no attribute %sR?N( R@RAt_valid_rpmdb_keysRCt_load_rpmdb_keyRRRERF(R3RGRH((s//usr/lib/python2.7/site-packages/yum/history.pyRIs cCsd|jkr}|jjd}|jjdk rkd|jkrk|jj|jjkrkd|jj}nd|jj|S|jS(s This reports the repo the package is from, we integrate YUMDB info. for RPM packages so a package from "fedora" that is installed has a ui_from_repo of "@fedora". Note that, esp. with the --releasever option, "fedora" or "rawhide" isn't authoritative. So we also check against the current releasever and if it is different we also print the YUMDB releasever. This means that installing from F12 fedora, while running F12, would report as "@fedora/13". R7R?R=t/t@N(R^RCR=RR7R](R3tend((s//usr/lib/python2.7/site-packages/yum/history.pyt _ui_from_repos  tfgetcCs |jS(N(Rq(R3((s//usr/lib/python2.7/site-packages/yum/history.pytsN( RPRQRR5RSRlRIRqtpropertyt ui_from_repo(((s//usr/lib/python2.7/site-packages/yum/history.pyRTs     tYumHistoryPackageStatecBseZdddZRS(c Cs8tj||||||||d|_||_dS(N(RTR5Rtdonetstate( R3RRYRXRVRWRxR_R`((s//usr/lib/python2.7/site-packages/yum/history.pyR5s  N(RPRQRR5(((s//usr/lib/python2.7/site-packages/yum/history.pyRvstYumHistoryRpmdbProblemcBsDeZdZdZdZdZdZeddZRS(sZ Class representing an rpmdb problem that existed at the time of the transaction. cCs7t||_||_||_||_d|_dS(N(tweakrefRCtrpidtproblemttextRt _loaded_P(R3R`R{R|R}((s//usr/lib/python2.7/site-packages/yum/history.pyR5s    cCsI|dkrdSt|j|j}|r0| St|j|j}|S(Ni(RtcmpR|R{(R3tothertret((s//usr/lib/python2.7/site-packages/yum/history.pyt__cmp__s cCs t|jS(N(thashR{(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt__hash__scCs7|jdkr0t|jj|j|_n|jS(N(R~RtsortedRCt_old_prob_pkgsR{(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getProbPkgss!RrcCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRss( RPRQRRR5RRRRttpackages(((s//usr/lib/python2.7/site-packages/yum/history.pyRys    tYumHistoryTransactioncBseZdZdZdZdZdZdZeddZ eddZ edd Z d Z edd Z d Zedd ZdZdZeddZeddZRS(s# Holder for a history transaction. cCst||_|d|_|d|_|d|_|d|_|d|_|d|_|d|_d|_ d|_ d|_ d|_ t|_d|_d|_d|_d|_d|_dS(Niiiiiii(RzRCttidt beg_timestamptbeg_rpmdbversiont end_timestamptend_rpmdbversiontloginuidt return_codeRt _loaded_TWt _loaded_TDt _loaded_TSt _loaded_PROBRt_have_loaded_CMDt _loaded_CMDt _loaded_ERt _loaded_OTtaltered_lt_rpmdbtaltered_gt_rpmdb(R3R`trow((s//usr/lib/python2.7/site-packages/yum/history.pyR5s$                cCsi|dkrdSt|j|j}|r0| St|j|j}|rO|St|j|j}| S(Ni(RRRRR(R3RR((s//usr/lib/python2.7/site-packages/yum/history.pyRs cCs7|jdkr0t|jj|j|_n|jS(N(RRRRCt_old_with_pkgsR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getTransWith)s!cCs7|jdkr0t|jj|j|_n|jS(N(RRRRCt_old_data_pkgsR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getTransData-s!cCs7|jdkr0t|jj|j|_n|jS(N(RRRRCt_old_skip_pkgsR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getTransSkip1s!RrcCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRs6scCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRs7scCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRs8scCs7|jdkr0t|jj|j|_n|jS(N(RRRRCt _old_problemsR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getProblems:s!cCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRs?scCs4|js-t|_|jj|j|_n|jS(N(RR"RCt _old_cmdlineRR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getCmdlineAs  cCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRsGscCs1|jdkr*|jj|j|_n|jS(N(RRRCt _load_errorsR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getErrorsIscCs1|jdkr*|jj|j|_n|jS(N(RRRCt _load_outputR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getOutputMscCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRsRscCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRsSs(RPRQRRR5RRRRRtt trans_witht trans_datat trans_skipRtrpmdb_problemsRtcmdlineRRterrorstoutput(((s//usr/lib/python2.7/site-packages/yum/history.pyRs"        tYumMergedHistoryTransactioncBseZdZdZeddZdZeddZdZeddZ dZ e dd Z e d Ze d Ze d Zd ZdZdZdZdZdZdZRS(cCst|jg|_|g|_|j|_|j|_|j|_|j|_d|_ d|_ g|_ d|_ t |_d|_d|_d|_d|_d|_dS(N(RSRt _merged_tidst _merged_objsRRRRRRRRRRRRRRRR(R3tobj((s//usr/lib/python2.7/site-packages/yum/history.pyR5Vs               cCs t|jS(N(RR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _getAllTidsqsRrcCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRssscCsCtd|jD}t|dkr9t|dSt|S(Ncss|]}|jVqdS(N(R(t.0R((s//usr/lib/python2.7/site-packages/yum/history.pys vsii(RSRR%tlistR(R3R((s//usr/lib/python2.7/site-packages/yum/history.pyt _getLoginUIDsuscCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRszscCsatd|jD}t|dkr;d|kr;dSd|krW|jdnt|S(Ncss|]}|jVqdS(N(R(RR((s//usr/lib/python2.7/site-packages/yum/history.pys }sii(RSRR%tremoveR(R3t ret_codes((s//usr/lib/python2.7/site-packages/yum/history.pyt_getReturnCodes|s  cCs |jS(N(R(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRsscCssg}t}xW|jD]L}xC|jD]8}|j|krDq)n|j|j|j|q)WqWt|S(N(RSRRRZtaddR'R(R3RtfiltRR4((s//usr/lib/python2.7/site-packages/yum/history.pyRs cCs1|dkr|j}n|jt|j|fS(s6 Take a pkg and return the key for it's state lookup. N(RRxRR RY(R4Rx((s//usr/lib/python2.7/site-packages/yum/history.pyt_p2sks  cCsMi}i}x4|D],}tj|}|||j<|||Z:d?Z;RS(As, API for accessing the history sqlite data. Rnc Csd|_tjj|_tjj|j |sYtjj|d||j_ ntjjd||j_ t |j_ t |j_||_d|_tjj|jj sytj|jj Wnttfk r}dSXt |j_ n*tj|jj tjr$t |j_ ntjd|jj }xtt|D]}tjj|}|tdtd !}|jdd}t|dkrqPnytt|Wntk rqPnXd|d |d |d f|_ ||_PqPW|jdkr&|j!s&dSn|jj d|j |j_"tjj|jj"sytj|jj"Wqttfk r}dSXn*tj|jj"tjrt |j_ ndS( NRns%s/history-*-*-*.sqliteshistory-s.sqlitet-iis%s-%s-%siii(#Rt_connRR t GenericHoldertconftostpathtnormpathR@tdb_pathRtwritableR"treadableR=t_db_filetexiststmakedirstIOErrortOSErrortaccesstW_OKRtreversedRtbasenameR%R\tmaptintt ValueErrort_db_datet_create_db_filet addon_path( R3trootRR=tetDBstdtfnametpieces((s//usr/lib/python2.7/site-packages/yum/history.pyR5sT #     "  cCs|jdS(N(tclose(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt__del__scCs|jdkr~|jjsdSytj|j|_Wn*tjtjfk rdt |j_dSXt |jj dn|jj S(NsPRAGMA locking_mode = EXCLUSIVE( RRRRRtconnectRtOperationalErrort DatabaseErrorRRtcursor(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _get_cursors  cCs |jjS(N(Rtcommit(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt_commitscCs |jjS(N(Rtrollback(R3((s//usr/lib/python2.7/site-packages/yum/history.pyt _rollbackscCs,|jdk r(|jjd|_ndS(N(RRR(R3((s//usr/lib/python2.7/site-packages/yum/history.pyRs c Cs?|j}t|d|xd|D]\\}}|dkrK|dkrK|S|dkr]q#n|dkroq#n||kr#|Sq#W|sdS|\}}} } } t|t|t| t| t| f\}}} } } |dk rt|d||| | | |f} n!t|d||| | | f} |jS(NsSELECT pkgtupid, checksum FROM pkgtups WHERE name=? AND arch=? AND epoch=? AND version=? AND release=?sINSERT INTO pkgtups (name, arch, epoch, version, release, checksum) VALUES (?, ?, ?, ?, ?, ?)sINSERT INTO pkgtups (name, arch, epoch, version, release) VALUES (?, ?, ?, ?, ?)(RRRRt lastrowid( R3RZR_tcreatetcurt sql_pkgtupidt sql_checksumtntaR tvtrRO((s//usr/lib/python2.7/site-packages/yum/history.pyt _pkgtup2pids0     0 cCsU|j}|dk r?dt|dt|df}n|j|j||S(Ns%s:%sii(t returnIdSumRRER#RZ(R3tpoRtcsum((s//usr/lib/python2.7/site-packages/yum/history.pyt _apkg2pids  'cCsVd}|j}d|kr@d|kr@d|j|jf}n|j|j||S(Nt checksum_typet checksum_datas%s:%s(RR^R(R)R#RZ(R3R%RR&tyumdb((s//usr/lib/python2.7/site-packages/yum/history.pyt _ipkg2pids  cCs|j||S(N(R'(R3R%R((s//usr/lib/python2.7/site-packages/yum/history.pyt _hpkg2pidscCsst|tr|j||St|tr>|j||St|tr]|j||S|j|jd|S(N( t isinstanceRR+RR'RTR,R#RZR(R3R%R((s//usr/lib/python2.7/site-packages/yum/history.pytpkg2pid"scCsd}|jttfkrB|jr-d}qB|jrBd}qBn|jtkrf|jrfd}qfn|dkrtj |j}|dkr|j rd}qn|S(NRRRRs Dep-Install( Rt output_statet TS_INSTALLtTS_TRUEINSTALLt reinstallt downgradestTS_ERASEt downgraded_byt _stcode2sttxtRJtisDep(ttxmbrRx((s//usr/lib/python2.7/site-packages/yum/history.pyt txmbr2state+s        cCs>|j}|dkrdSt|d|j|f}|jS(NskINSERT INTO trans_with_pkgs (tid, pkgtupid) VALUES (?, ?)(RRRt_tidR(R3tpidRRO((s//usr/lib/python2.7/site-packages/yum/history.pyttrans_with_pid<s   cCsK|j}|dks%|j r)dSt|d|j|f}|jS(NskINSERT INTO trans_skip_pkgs (tid, pkgtupid) VALUES (?, ?)(RRt_update_db_file_2RR:R(R3R;RRO((s//usr/lib/python2.7/site-packages/yum/history.pyttrans_skip_pidFs  cCss|dk stt|d s.|dkr2dS|j}|dkrNdSt|d|j||f}|jS(NR:suINSERT INTO trans_data_pkgs (tid, pkgtupid, state) VALUES (?, ?, ?)(RRthasattrRRR:R(R3R;RxRRO((s//usr/lib/python2.7/site-packages/yum/history.pyttrans_data_pid_begQs  cCskt|d s|dkr dS|j}|dkr<dSt|dd|j||f}|jdS(NR:sUPDATE trans_data_pkgs SET done = ? WHERE tid = ? AND pkgtupid = ? AND state = ? tTRUE(R?RRRR:R(R3R;RxRRO((s//usr/lib/python2.7/site-packages/yum/history.pyttrans_data_pid_end]s  c Cs_t|dsdS|j}|dks8|j r<dSt|j}t|d|j|j|f}|j }|s|Si}|j }|||j <|jdkrx!|j D]}|||j RJRKR(R3t rpmdb_versiont using_pkgsttxmbrst skip_packagesRRRROR4R;R8RxR|((s//usr/lib/python2.7/site-packages/yum/history.pytbegs.        cCs`|j}|dkrdSx3|D]+}t|}t|d|j|fq#W|jdS(NsJINSERT INTO trans_error (tid, msg) VALUES (?, ?)(RRRRR:R(R3RRterror((s//usr/lib/python2.7/site-packages/yum/history.pyt _log_errorss    cCs|dkst|d r dS|j}|dkr<dSx9|jD]+}t|}t|d|j|fqIW|jdS(s6 Note that data can be either a real pkg. ... or not. R:NsSINSERT INTO trans_script_stdout (tid, line) VALUES (?, ?)(RR?Rt splitlinesRRR:R(R3tdatatmsgRRS((s//usr/lib/python2.7/site-packages/yum/history.pytlog_scriptlet_outputs   cCsK|j}t|d|fg}x|D]}|j|dq,W|S(NsfSELECT msg FROM trans_error WHERE tid = ? ORDER BY mid ASCi(RRR'(R3RRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRs   cCsK|j}t|d|fg}x|D]}|j|dq,W|S(NsoSELECT line FROM trans_script_stdout WHERE tid = ? ORDER BY lid ASCi(RRR'(R3RRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRs   cCs|s| stt|ds&dS|j}|dkrBdSt|d|jttjt||f}|j |st|dd|jf|j n|dk r|j |n|`dS(NR:sINSERT INTO trans_end (tid, timestamp, rpmdb_version, return_code) VALUES (?, ?, ?, ?)sKUPDATE trans_data_pkgs SET done = ? WHERE tid = ?RA( RR?RRRR:RRLRERRT(R3RNRRRRO((s//usr/lib/python2.7/site-packages/yum/history.pyRps$       cCst|dstS|stS|s'tS|jjdt|j}|jjrtjj | rytj |ddWqt t fk r}tSXn|j dd}|d|}y:t|d}|jt||j|jWnt t fk r}tSXtS(sappend data to an arbitrary-named file in the history addon_path/transaction id location, returns True if write succeeded, False if notR:RntmodeiR>sw+(R?RRRRER:RRRRRRRtreplacetopentwriteR tflushRR"(R3tdatanameRVttid_dirR tsafenametdata_fntfo((s//usr/lib/python2.7/site-packages/yum/history.pytwrite_addon_data s, c Cs|jjdt|d}tj|d}g|D]}|j|d^q8}|s`|S||krpdSt||d}|j}|j|S(NRnRR?R"( RRRERRZRR[treadR( R3Rtitemt hist_and_tidt addon_infotit addon_namesRbRV((s//usr/lib/python2.7/site-packages/yum/history.pytreturn_addon_data6s%   c Cs|j}t|d|fg}xT|D]L}t|d|d|d|d|d|dd|}|j|q,W|S( NsSELECT name, arch, epoch, version, release, checksum FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASCiiiiiiR`(RRRTR'(R3RRRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRFs   0 c Cs|j}t|d|fg}x|D]}t|d|d|d|d|d|d|dd |}|d d k|_d|_t|jtkrt |_nt|jt krt |_n|j |q,W|S( Ns SELECT name, arch, epoch, version, release, checksum, done, state FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC, state DESCiiiiiiiR`iRA( RRRvRwRRRRxRR"RRR'(R3RRRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRSs   &   c Cs|j}|dks%|j r)gSt|d|fg}xT|D]L}t|d|d|d|d|d|dd|}|j|qIW|S( NsSELECT name, arch, epoch, version, release, checksum FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASCiiiiiiR`(RRR=RRTR'(R3RRRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRgs   0 c Cs|j}|dks%|j r)gSt|d|fg}xg|D]_}t|d|d|d|d|d|dd|}|d d k|_|j|qIW|S( NsSELECT name, arch, epoch, version, release, checksum, main FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid) WHERE rpid = ? ORDER BY name ASC, epoch ASCiiiiiiR`iRA(RRR=RRTRIR'(R3R{RRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRvs   0 cCs|j}|dks%|j r)gSt|d|fg}x<|D]4}t||d|d|d}|j|qIW|S(NsSELECT rpid, problem, msg FROM trans_rpmdb_problems WHERE tid = ? ORDER BY problem ASC, rpid ASCiii(RRR=RRyR'(R3RRRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRs   !cCs\|j}|dks%|j r)dSt|d|fg}x|D] }|dSWdS(Ns[SELECT cmdline FROM trans_cmdline WHERE tid = ?i(RRR=R(R3RRRR((s//usr/lib/python2.7/site-packages/yum/history.pyRs    cCs|j}|d krgSd}|s1d}nd }|rt|tjjkrtt|}}|ddjdgt|7}n|d7}|d k r|dt |7}nt |||g}i}xo|D]g} |rt|tjjkr| d|krqqnt || } | || d<|j | qWd }|j }t|tjjkrt ||n4|ddjdgt|7}t |||xc|D][} | d|krqn| d || d_| d || d_| d || d_qWd } xt|D]} | j} d } | d k ra| j} n| d ks| d ks| jd | jkrn3| | krt| _t| _nt| _t| _| } q4W|S(s Return a list of the last transactions, note that this includes partial transactions (ones without an end transaction). s]SELECT tid, trans_beg.timestamp AS beg_ts, trans_beg.rpmdb_version AS beg_rv, trans_end.timestamp AS end_ts, trans_end.rpmdb_version AS end_rv, loginuid, return_code FROM trans_beg JOIN trans_end USING(tid)sSELECT tid, trans_beg.timestamp AS beg_ts, trans_beg.rpmdb_version AS beg_rv, NULL, NULL, loginuid, NULL FROM trans_begs WHERE tid IN (%s)s, t?s ORDER BY tid DESCs LIMIT isSELECT tid, trans_end.timestamp AS end_ts, trans_end.rpmdb_version AS end_rv, return_code FROM trans_endiiiN(RRR%Rt constantsR$RRStjoinRERRR'RRRRRRRR"RRR(R3ttidstlimittcomplete_transactions_onlyRtsqltparamsRttid2objRRtlastcur_rvtlas_rv((s//usr/lib/python2.7/site-packages/yum/history.pytoldsd   '     $    .      cCs?|jgd|}|sdSt|dks7t|dS(si This is the last full transaction. So any incomplete transactions do not count, by default. iiN(RwRR%R(R3RpR((s//usr/lib/python2.7/site-packages/yum/history.pytlasts cCs|j}|dks%|j r)dS|j|dt}|dkrNdSdi|d6}t||||fx|D] }|dSWdS(NRs\SELECT %(db)sdb_val FROM pkg_%(db)sdb WHERE pkgtupid=? and %(db)sdb_key=? tdbi(RRt_update_db_file_3R.RR(R3R4RyRGRR;RqR((s//usr/lib/python2.7/site-packages/yum/history.pyt_load_anydb_keys    cCs|j|d|S(Ntrpm(R{(R3R4RG((s//usr/lib/python2.7/site-packages/yum/history.pyRmscCs|j|d|S(NR(R{(R3R4RG((s//usr/lib/python2.7/site-packages/yum/history.pyRDscCs|j}|dks%|j r)dS|j|dt}|dkrNdSdi|d6}t||||t|f|jS(NRshINSERT INTO pkg_%(db)sdb (pkgtupid, %(db)sdb_key, %(db)sdb_val) VALUES (?, ?, ?)Ry(RRRzR.RRRR(R3R4RyRGRHRR;Rq((s//usr/lib/python2.7/site-packages/yum/history.pyt_save_anydb_keys  cCs|j|d||S(NR|(R}(R3R4RGRH((s//usr/lib/python2.7/site-packages/yum/history.pyt_save_rpmdb_key"scCs|j|d||S(NR(R}(R3R4RGRH((s//usr/lib/python2.7/site-packages/yum/history.pyt_save_yumdb_key$scCsXxQtjD]F}t||d}|dkr4q n|j|d||s tSq WtS(se Save all the data for rpmdb for this installed pkg, assumes there is no data currently. R|N(RTRlRMRR}RR"(R3tipkgRGRH((s//usr/lib/python2.7/site-packages/yum/history.pyt _save_rpmdb's cCsXxQtjD]F}|jj|}|dkr4q n|j|d||s tSq WtS(se Save all the data for yumdb for this installed pkg, assumes there is no data currently. RN(R1RBR^RJRR}RR"(R3RRGRH((s//usr/lib/python2.7/site-packages/yum/history.pyt _save_yumdb2s cCsv|j}|dks%|j r)tS|j|dt}|dkrNtSdi|d6}t|||ftS(s= Delete all the data for rpmdb/yumdb for this installed pkg. Rs)DELETE FROM pkg_%(db)sdb WHERE pkgtupid=?RyN(RRRzRR.RR"(R3R4RyRR;Rq((s//usr/lib/python2.7/site-packages/yum/history.pyt _wipe_anydb=s  cCsb|j|dstS|j|doC|j|oC|j|sT|jtS|jtS(s< Sync. all the data for rpmdb/yumdb for this installed pkg. R|R(RRRRRRR"(R3R((s//usr/lib/python2.7/site-packages/yum/history.pyt sync_alldbLs  c Csidd6dd6dd6dd6dd6dd6}|j}|dksU|j rYtSddddddf}xM|D]E\}}}t|d||fx|D]}|d||R@RBRJRKRRRTRXRRRpRcRjRRRRRRRwRxR{RmRDR}R~RRRRRRRRRRzRR=R(((s//usr/lib/python2.7/site-packages/yum/history.pyRs<     !      * !   )      Q          @     s SELECT pkgtupid,name,epoch,version,release,arch, name || "." || arch AS sql_nameArch, name || "-" || version || "-" || release || "." || arch AS sql_nameVerRelArch, name || "-" || version AS sql_nameVer, name || "-" || version || "-" || release AS sql_nameVerRel, epoch || ":" || name || "-" || version || "-" || release || "." || arch AS sql_envra, name || "-" || epoch || ":" || version || "-" || release || "." || arch AS sql_nevra FROM pkgtups WHERE (-RLRtos.pathRRRzRtsqlutilsRRRtyum.miscR t yum.constantsRt yum.packagesRRRtyum.i18nRR t rpmUtils.archR Rt TS_UPDATEt TS_UPDATEDR4R0R1t TS_OBSOLETEDt TS_OBSOLETINGR6RRRR0R1RTRvRyRRRR(((s//usr/lib/python2.7/site-packages/yum/history.pytsX         '0D  S?PK[fllsite-packages/yum/rpmsack.pycnu[ v_c@sddlZddlZddlZddlZddlZddlZddlmZddlmZddl m Z ddl Z ddl Z ddl mZmZddlmZmZddlZddlZddlmZmZddlZddlZdZd Zd Zd efd YZd fdYZdefdYZ defdYZ!defdYZ"defdYZ#defdYZ$dZ%de&fdYZ'dZ(de&fdYZ)dZ*e+d kre*ndS(!iN(t miscutils(tarch(tinitReadOnlyTransaction(tYumInstalledPackaget parsePackages(tPackageSackBasetPackageSackVersion(t to_unicodet_cGs4tjd}zt|}Wdtj|X|S(sk Annoying people like to set umask's for root, which screws everything up for user readable stuff. iN(tostumasktopen(targstoumasktret((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_open_no_umask(s cGs7tjd}ztj|}Wdtj|X|S(sk Annoying people like to set umask's for root, which screws everything up for user readable stuff. iN(R R tmakedirs(R R R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_makedirs_no_umask3s cGs7yt|}Wntk r,}d|fSX|dfS(s1 IOError wrapper BS for open, stupid exceptions. N(R tIOErrortNone(R Rte((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_iopen>s  tRPMInstalledPackagecBs5eZdZdZdZdZdZRS(cCsGt|_tj||d|j||_||_t|_|`dS(Ntyumdb( tTruet_has_hdrRt__init__RtidxtrpmdbtFalsethdr(tselftrpmhdrtindexR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRIs     cCsf|jr|jS|jj}|jd|j}y|jSWntk ratj dnXdS(NisRpmdb changed underneath us( RRRt readOnlyTStdbMatchRtnextt StopIterationtErrorstPackageSackError(Rttstmi((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_get_hdrSs  cCsy|jdr%td||fn|dkr@|j}n|j|_}t|_|dkru||}n|S(NRs%s has no attribute %sR(t startswithtAttributeErrorR*RRR(Rtvarnametval((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt __getattr___s    cCst}xY|jD]N\}}}x<|jj|||D]"}||kr;|j|q;q;WqWxW|j|jD]E}x<|jj|ddD]"}||kr|j|qqWqvWt|S(s4return list of installed pkgs requiring this packageN(NNN( tsettprovidesRt getRequirestaddtfilelisttdirlistRtlist(Rtpkgsettreqntreqftreqevrtpkgtfn((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytrequiring_packagesss   cCsot}xY|jD]N\}}}x<|jj|||D]"}||kr;|j|q;q;WqWt|S(N(R0tstrong_requiresRt getProvidesR3R6(RR7R8R9R:R;((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytrequired_packagess   (t__name__t __module__RR*R/R=R@(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRGs   t RPMDBProblemcBs eZdZdZdZRS(sJ Represents a problem in the rpmdb, from the check_*() functions. cKs;||_||_x"|D]}t||||qWdS(N(R;tproblemtsetattr(RR;RDtkwargstkwarg((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRs   cCs8|dkrdSt|j|jp7t|j|jS(Ni(RtcmpR;RD(Rtother((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt__cmp__s (RARBt__doc__RRJ(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRCs tRPMDBProblemDependencycBseZdZRS(cCsa|jdkr,d|jtd|jfSd|jtd|jdjtt|jfS(Ntrequiress%s %s %sshas missing requires ofs %s %s %s: %sshas installed conflictss, ( RDR;Rtmissingtfoundtjointmaptstrt conflicts(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt__str__s  (RARBRT(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRLstRPMDBProblemDuplicatecBseZdZdZRS(cKstj||d|dS(Nt duplicate(RCR(RR;RF((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRscCstd|j|jfS(Ns%s is a duplicate with %s(RR;RV(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRTs(RARBRRT(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRUs tRPMDBProblemObsoletedcBseZdZdZRS(cKstj||d|dS(Nt obsoleted(RCR(RR;RF((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRscCstd|j|jfS(Ns%s is obsoleted by %s(RR;t obsoleter(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRTs(RARBRRT(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRWs tRPMDBProblemProvidescBseZdZdZRS(cKstj||d|dS(NR1(RCR(RR;RF((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRscCstd|j|jfS(Ns%%s provides %s but it cannot be found(RR;tprovide(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRTs(RARBRRT(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRZs tRPMDBPackageSackcBseZdZiejejejfd6ejejej fd6ej ej ej fd6ej ejejfd6ZeZddWdWddZdZeedWZd Zd Zd Zd Zd ZddZdZddZdZ dZ!dZ"dZ#dZ$dZ%dZ&e'j(Z)dWdWdZ*dWdZ+e,e-dZ.e,dZ/dWdWe-dZ0dZ1d Z2d!Z3d"Z4d#Z5d$Z6d%Z7d&Z8d'Z9d(Z:d)Z;d*Z<d+Z=d,Z>d-Z?d.Z@d/ZAd0ZBd1ZCd2ZDd3ZEed4ZFd5ZGd6ZHd7ZId8ZJe-id9ZKe,d:ZLe-d;ZMgd<ZNdWdWdWdWdWd=ZOd>ZPdWd?ZQd@ZRdWdWdWdWdWdAZSdBZTdCZUdDZVdEZWdFZXdGZYdWdWdWdWdWdHZZdIZ[dJZ\dKZ]e,dLZ^dWdXdMZ_dNZ`dWdYdOZadPZbdQZcdWdRZddSZegdTZfdUZgdVZhRS(Zs* Represent rpmdb as a packagesack RMR1RSt obsoletest/s /var/lib/yumcCs||_i|_i|_t|_i|_t|_t|_t|_ t|_ g|_ i|_ i|_ t|_|dkr|d}n|j|tjj|j|js|d||_n ||_ttdrtjd}nd}tjj|d||_d|_d|_i|_d|_||_t|_d|_ iid6id6id6id 6|_!tjj|jd }tjj|d }t"d |d ||_#dS(Ns/rpmdb-indexesR^t expandMacros%_dbpaths /var/lib/rpmR1RMRSR]s/yumdbs/versiontdb_patht version_path($troott_idx2pkgt _name2pkgR0t_pkgnames_loadedt_tup2pkgRt_completely_loadedt_pkgname_failst_pkgmatch_failst_provmatch_failst_simple_pkgtup_listt_get_pro_cachet_get_req_cachet_loaded_gpg_keysRt setCacheDirR tpathtnormpathR+t _persistdirthasattrtrpmR_t _rpmdbpatht_have_cached_rpmdbv_datat_cached_conflicts_datat_trans_cache_storeR(t releasevert auto_closet_cached_rpmdb_mtimet_cachetRPMDBAdditionalDataR(RRbRytcachedirt persistdirtdbpatht addldb_pathRa((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRsN                          cCs|js<|jdt}|dk r<|j|_q<n|js~x6|jD]%\}}|jj|j|qRWn|jS(sTGetter for the pkglist property. Returns a list of package tuples. t load_packagesN(RktpreloadPackageChecksumsRRtkeyst _get_packagestappendt _hdr2pkgTuple(Rt csumpkgtupsRR)((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt _get_pkglists    cCsi|_i|_t|_i|_t|_t|_t|_t|_ g|_ i|_ i|_ t dk rt jniid6id6id6id6|_d|_d|_|jd|_dS(s Drop all cached data, this is a big perf. hit if we need to load the data back in again. Also note that if we ever call this while a transaction is ongoing we'll have multiple copies of packages which is _bad_. R1RMRSR]N(RcRdR0ReRfRRgRiRhRjRkRlRmtmiscRt unshare_dataR|RvRwttransactionResetR{(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytdropCachedDatas,                 cCst|_t|_t|_g|_i|_i|_td k rUtj niid6id6id6id6|_ d |_ d |_ |j|jd}tjj||_d}g}x|D]}|jj|j||j|j|jtjkrq|jj|j|j||jrq|j|j}||j |j!||j|jqqn|jtj"kr||j |j#j!||j|jqqWx|D]}|j\}}} } } |j$|| | | |} | s|j%d|qn| d} |j#j&} | d kr;qnt'| dt'| d }}d | j(j)ksd | j(j)krqn|| j(j)d <|| j(j)d |jj|n|S(NR1(RjRR3(RRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytsearchProvidess cCs|j|dS(NRM(R(RR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytsearchRequiresscCs|j|dS(NR](R(RR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytsearchObsoletesscCs|j|dS(NRS(R(RR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytsearchConflictsscCs|jS(N(tpkglist(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt simplePkgListscCsj|s dS|\}}|jd|d|}|sGtjd|ngtj|D]}|j^qWS(NRRsNo Package Matching %s(t_searchR&R'Rt newestInListR(RtnaTupRRRtallpkgR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytreturnNewestByNameArchs cCsB|s dS|jd|}|s5tjd|ntj|S(NRsNo Package Matching %s(RR&R'RR(RRtallpkgs((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytreturnNewestByNames cCs| st|tjkr dSg}xm|D]e}|s?q-n|d}|dkr^d}n|rs|j}n|j|tj||fq-W|S(Nit?t*t[(RRR(tlenRt PATTERNS_MAXRtlowerRRtcompile_pattern(Rt ignore_caseRtpattqpat((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_compile_patternss    #cCs?|d krtSx(|D] \}}|d}|d krBd}n t|}|dd}|rq|j}n|d k r||kr||dkrqn||drtS|d|rtS|d|rtS|d|rtS|d|rtS||d |rtS|d |d |rtSqWtS( s< This is basically parsePackages() but for rpm hdr objects. tepocht0Ris)%(name)s-%(version)s-%(release)s.%(arch)ss%(name)s.%(arch)ss%(name)s-%(version)ss %(name)s-%(version)s-%(release)ss*:%(name)s-%(version)s-%(release)s.%(arch)ss %(name)s-s!:%(version)s-%(release)s.%(arch)sN(RRRRRR(t repatternsRRRtrepatRtqname((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_match_repattern/s:     (   c Cs||j r|rg}xz|D]k}|j|g}|s{|rEPntj|rXPnd|krhPnd|kr{Pq{n|j|qW|Sng}|r| rg}xY|D]Q}||jkrqn||jkr|j|j|qn|j|qW|}|s|Sn|js|j ||}xB|j D]4\} } |j || |rC|j | | qCqCW|dk|_n|jj} |jrg| D]} | jdkr| ^q} n|rxt| || } |jj| d|r| d| d|} n| d| d} xG| D]<} x3|D]+}| j|krB|jj| jqBqBWq5Wn| S(sReturns a list of packages. Note that the packages are always filtered to those matching the patterns/case. repoid is ignored, and is just here for compatibility with non-rpmdb sacks. t-t.s gpg-pubkeyiiiN(Rgt searchNamesRRtextendRiReRdRRRRRRRcRRnRRtupdateR3( RtrepoidRRRRtpkgsttpatstrpatsRRt pkgobjlistR;((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytreturnPackagesRs`         +  !cCs|jdkri}x|jdD]u\}}|tjsDq%n|j||}|||j<|jrrq%n||_t |_|j t |_|`q%W|j |_n|jS(s Load the packages which have conflicts from the rpmdb, newer versions of rpm have an index here so this is as fast as cached (we test rpm version at cache write time). t conflictnameN( RwRRRttRPMTAG_CONFLICTNAMERRRRRRSRR(RRRRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt _uncached_returnConflictPackagess        cCstj|jtjsdS|jd}t|dd}|jd||jdt|x9t|D]+}x"|jD]}|jd|qWqqW|j tj |d|dS(Ns /conflictss.tmptws%s s%u ( R taccessRtW_OKRtwriteRtsortedRtclosetrename(RRtrpmdbvtconflicts_fnametfoR;tvar((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_write_conflicts_news  cCs*|jdtd}|j||dS(Nt main_onlyi(t simpleVersionRR(RRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_write_conflictsscCs|jdkri}x|jdD]u\}}|tjsDq%n|j||}|||j<|jrrq%n||_t |_|j t |_|`q%W|j |_n|jS(s Load the packages which have obsoletes from the rpmdb, this is needed because newer rpm's have obsoletes imply conflicts. t obsoletenameN( t_cached_obsoletes_dataRRRttRPMTAG_OBSOLETENAMERRRRRR]RR(RRRRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt _uncached_returnObsoletePackagess        cCstj|jtjsdS|jd}t|dd}|jd||jdt|x9t|D]+}x"|jD]}|jd|qWqqW|j tj |d|dS(Ns /obsoletess.tmpRs%s s%u ( R RRRRRRRRRR(RRRtobsoletes_fnameRR;R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_write_obsoletes_news  cCs*|jdtd}|j||dS(NRi(RRR(RRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_write_obsoletesscCsxtj|jdtj|jdtj|jdtj|jdtj|jdtjd|dS(s This shouldn't be called, but people are hitting weird stuff so we want to deal with it so it doesn't stay broken "forever". s/versions /conflictss /obsoletess/file-requiress/pkgtups-checksumssRpmdb checksum is invalid: %sN(Rtunlink_fRR&R'(Rtcaller((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRs  c CsR|js dSd}|jd|}t|\}}|dkrIdS|j}|jdtd}| s||d krdSg}yt||} xq| dkr| d8} ||||||||||f} t| d|j|j | qW|jdkr+dSWnt k rM|j |dSX|S( NcSs|jd S(Ni(treadline(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt _read_strsR^Riiiit( t__cache_rpmdb__RRRRRRtintRtsearchPkgTuplet ValueErrorR( RtfnameRt full_fnameRRtfrpmdbvRRt pkgtups_numR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt _read_pkglists4     !  cCs|jd|_|jS(NRS(RRw(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_read_conflicts3scCs|jr||jd|D]6} | j || kr||| | || | qqWqiW|j dkr|j |n|r||||gS||gS( s5 Return a simple version for all installed packages. cSso|j|i}|jdt}|j|||dk rk|j|t}|j||ndS(N(RRRR(tireposRtrevR;Rtirevstrpsv((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_up_revss  RRt installedt from_repot@tfrom_repo_revisionN(RHRRRRRRRRRRQRSRvRJ(RRtgroupsRORtmainRKt main_grpst irepos_grpsR;tydbiRtgroupRRL((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRsL            %cCskd}x^|D]V}xM|D]E}t||}|r|jj|dkr|d7}PqqWq W|S(Niii(RRtfind(tfieldst searchstringsRtcounttstfieldtvalue((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_find_search_fieldss  !  cCs|std|}ng}x]|jD]O\}}|j|||}|dkr.|j|j|||fq.q.W|S(NcSs |jS(N(R(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytsi(RQRRaRR(RR[R\tloweredRRRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt"searchPrimaryFieldsMultipleStringss &cCs4g}x'|D]}|j|jd|q W|S(NR(RR(Rtnamest returnListR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRs cCs|j|||||S(N(R(RRRtvertrelR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRscCsdS(N((Rtarchlist((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt excludeArchs scCsA|j}g|jdtD]\}}|j||^qS(Ntheaders(R"treturnLeafNodesRR(RRR(thR)((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRls coss|j}|j||}x2|D]*}|ddkr%||jfVq%q%W~|jro|jjndS(sLdbMatch() wrapper generator that yields (header, index) for matches Rs gpg-pubkeyN(R"R#R)RzR(R(RR tkwdsR(R)Rm((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRs   c CsA|dk r||jkrgS|||||f}||jkrQ|j|gSt}g}|jsx||jkr!|dk r|jj|g} | s|jj|qn |j } xY| D]Q} xHdD]3} || dk r|| t | | krPqqW|j | qW|S|j } |dk rN|j d|} n6|dk ro|j d|} n|j } t|_t}x| D]\}}|j||} |jj| jt}xHdD]3} || dk r|| t | | krPqqW|j | qW| r=|dk r=|jj|n|S( s4List of matching packages, to zero or more of NEVRA.RRhRgRRN(sarchsrelsversepoch(sarchsrelsversepoch(RRhRftlocalsRgReRdRR3RtgetattrRR"RRRRR(RRRRgRhRRtlocRRRRR(R)tdoneRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyR!sL     )      )cCs||jkr|j|St|||}||j|<|jj|jgj|||j|j<|jr|j dkr|j d}t j j||_ n|S(Ns /Packages(RcRRdRRRRfRRR{RRuR RpR(RRR!RR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRXs   cCstj|d}tj|d}tjt|d}tjt|d}|d}|dkrwd}n t|}tj|}tj|||||fS(NRRtversiontreleaseRR(Rt share_dataRRR(RRRRRgRhR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRes    cCstjdtdd|jS(NscgetPkgList() will go away in a future version of Yum. Please access this via the pkglist attribute.t stackleveli(twarningstwarntDeprecationWarningR(R((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt getPkgListts  cCs9tjdtddg|jD]\}}|^q#S(Ns6getHdrList() will go away in a future version of Yum. Rvi(RwRxRyR(RRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt getHdrList{s  cCs_tjdtddg}x3|jD](\}}}}}|j||fq&Wtj|S(Ns>getNameArchPkgList() will go away in a future version of Yum. Rvi(RwRxRyRRRtunique(RtlstRRRRgRh((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytgetNameArchPkgLists   cCsYtjdtddg}x-|jD]"\}}}}}|j|q&Wtj|S(Ns:getNamePkgList() will go away in a future version of Yum. Rvi(RwRxRyRRRR|(RR}RRRRgRh((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytgetNamePkgLists   c CsTtjdtddg|jd|d|d|d|d|D]}|j^qAS( Ns@returnTuplebyKeyword() will go away in a future version of Yum. RviRRRRgRh(RwRxRyRR(RRRRRgRhR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytreturnTupleByKeywords  c Cstjdtdd|\}}}}}|jd|d|d|d|d|}t|d kr{|d }|jgSgSdS( Ns?returnHeaderByTuple() will go away in a future version of Yum. RviRRRRgRhi(RwRxRyRRR( RtpkgtupleRRRRRR}titem((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytreturnHeaderByTuples  *  cCsotjdtdd|\}}}}}|d kr@d}ng|j|||||D]}|j^q\S( s?returns a list of header indexes based on the pkgtuple provideds>returnIndexbyTuple() will go away in a future version of Yum. Rviis(none)RRN(Nis(none)R(RwRxRyRRR(RRRRRRsRtR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytreturnIndexByTuples     cCs tdS(N(tNotImplementedError(RR(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytaddDBscCs|dkrd}nt|tjkrEtj|\}}}n>t|tjtjfkru|\}}}nd}}}|tj |tj |tj |tj |ff}tj |S(s2 Given random stuff, generate a usable dep tuple. iN( Rttypettypest StringTypeRtstringToVersiont TupleTypetListTypeRRu(RtflagsRstr_etr_vtr_rtdeptup((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt _genDeptups  c Cstj|}|j|||}||jkr>|j|S|dd}|j|}i}xk|D]c}|ddkr|dkr|ddfg|||j|S|dd}|j|}i}xk|D]c}|ddkr|dkr|ddfg||R+R?R3tyumtdepsolveRRRt formatRequireRLRRSR(RRt providersR=R;trreqtreqRRgRNtprobtcreqtrestnrestconflicting_poRO((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytcheck_dependenciessJ     4 ccsd}xvt|jD]b}|j|kr4qn|jt|jrRqn|dkrj|}qn||fV|}qWdS(N(RRRRt intersectionR0tprovides_names(Rtignore_providestlastR;((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_iter_two_pkgsBs  c Cst|}g}x|j|D]\}}|j|jkrFq"n|j|r||krtj|jr|jdkrq"ntj|jr|jdkrq"qn|jt|d|q"W|S(s Checks for any "duplicate packages" (those with multiple versions installed), we ignore any packages with a provide in the passed provide list (this is how installonlyworks, so we do the same). tnoarchRV(R0RRtverEQRtisMultiLibArchRRU(RRR=RR;((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytcheck_duplicatesPs !! cCsg}g}x6t|jD]"}|js4qn|j|qWxMt|jD]9}x0|j|D]}|jt|d|qnWqXW|S(s@ Checks for any packages which are obsoleted by other packages. RY(RRR]Rt obsoletedByRW(Rt obsoletersR=R;tobspo((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytcheck_obsoletedcs !cCsg}xut|jD]a}xX|jD]M}|\}}}||j|||kr)|jt|d|Pq)q)WqW|S(sq For each package, check that a provides search for it's name (and everything it provides) finds it. R[(RRR1R?RRZ(RR=R;tprovtupRRRs((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytcheck_providesps N(NNN(NNN(iRARBRKRttRPMTAG_REQUIRENAMEtRPMTAG_REQUIREVERSIONtRPMTAG_REQUIREFLAGStRPMTAG_PROVIDENAMEtRPMTAG_PROVIDEVERSIONtRPMTAG_PROVIDEFLAGSRtRPMTAG_CONFLICTVERSIONtRPMTAG_CONFLICTFLAGSR tRPMTAG_OBSOLETEVERSIONtRPMTAG_OBSOLETEFLAGSRRRRRRtpropertyRRRRoR"RRRRRRRRRRRRtcontainsRPRRt staticmethodRRRRRRR R RRRRRR R!R"R#R$R(RR*R/R;R>R%RRBR&RHRJRRaRdRRRjRlRRRRRzR{R~RRRRRRR?RR2RRRRRRR(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyR\s     1   W             #N        $       < (  & C    #7    7          /   cCs|jddjddS(NR^Rt~(treplace(Rp((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt _sanitize|sR}cBsJeZdZdddZdZdZddddZdZRS(sQclass for access to the additional data not able to be stored in the rpmdbs/var/lib/yum/yumdbcCstj|_||j_||j_t|j_i|_tj j |jjsy t |jjt |j_Wqt tfk r}qXn*tj|jjtjrt |j_niid6|_dS(Ntattr(Rt GenericHolderRR`RaRtwritablet _packagesR RpRDRRRRIRRt yumdb_cache(RR`RaR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRs    cCs`d|jj}tj|}x:|D]2}tjj|jdd}||j||j}n|dkr]||jkr]dS||jdkr|jd|d}|dk r|dk r|j|jf|j|jfkr|jd|dj|||j|s#Invalid value of attribute %s on %s(RRRRR,Rtstat_fRRRRRRRRterrnotreadRt _validators( RRR<RtkeyRRR`tvalid((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_readSs:         cCst|}|j|}||jkr7|j|=n|j|tjj|rytj|Wqtt fk rt d||fqXndS(sremove the attribute files!Cannot delete attribute %s on %s N( RRRRR RpRDtunlinkRRIR,(RRR<((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt_delete}s   cCs |j|S(N(R(RR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyR/scCs9|jds"|j||ntj|||dS(NR(R+Rtobjectt __setattr__(RRR`((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRscCs3|jds|j|ntj||dS(NR(R+RRt __delattr__(RR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRscCs|j|}|dk S(N(RR(RRR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt __contains__sccsx|jD] }|Vq Wxktj|jdD]S}|t|jd}||jkrbq0n| r~|jdr~q0n|Vq0WdS(Ns/*is.tmp(RRRRR(Rt show_hiddenR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyt__iter__s cCsVx'|jdtD]}|j|qWytj|jWntk rQnXdS(NR(RRRR trmdirRRI(RR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytcleans  cCs,y|j|}Wntk r'|SX|S(sretrieve an add'l data obj(RR,(RRtdefaultR((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRs  N(RARBR0RRRRRRRRRRRRR/RRRRRRR(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRs.       & *      cCs,td}x|jD] }|GHqWdS(NR^(R\R(tsacktp((s//usr/lib/python2.7/site-packages/yum/rpmsack.pyRUs t__main__(,RtRRwRR tos.pathtrpmUtilsRRtrpmUtils.transactionRRR&tpackagesRRt packageSackRRtfnmatchtretyum.i18nRRRt yum.depsolveRRRRRRCRLRURWRZR\RRR}RRRURA(((s//usr/lib/python2.7/site-packages/yum/rpmsack.pytsN             E   F   PK[ site-packages/yum/failover.pycnu[ v_c@sUdZddlZdd dYZdefdYZdefdYZdS( s/Classes for handling failovers for server URLs.iNtbaseFailOverMethodcBsJeZdZdZddZdZddZdZdZ RS( s_A base class to provide a failover to switch to a new server if the current one fails. cCs||_d|_dS(Ni(trepotfailures(tselfR((s0/usr/lib/python2.7/site-packages/yum/failover.pyt__init__s cCsdS(sReturn a server URL based on this failover method, or None if there is a complete failure. This method should always be used to translate an index into a URL, as this object may change how indexes map. :param i: if given, this is the index of the server URL to return, instead of using the failures counter :return: the next server URL N(tNone(Rti((s0/usr/lib/python2.7/site-packages/yum/failover.pyt get_serverurl"s cCs|jd|_dS(sONotify the failover method that the current server has failed. iN(R(R((s0/usr/lib/python2.7/site-packages/yum/failover.pyt server_failed.sicCs ||_dS(suReset the failures counter to the given index. :param i: the index to reset the failures counter to N(R(RR((s0/usr/lib/python2.7/site-packages/yum/failover.pytreset4scCs|jS(s{Return the current number of failures, which is also the current index into the list of URLs that this object represents. :fun:`get_serverurl` should always be used to translate an index into a URL, as this object may change how indexes map. :return: the current number of failures, which is also the current index (R(R((s0/usr/lib/python2.7/site-packages/yum/failover.pyt get_index;s cCst|jjS(sReturn the total number of URLs available to cycle through in this object. :return: the total number of URLs available (tlenRturls(R((s0/usr/lib/python2.7/site-packages/yum/failover.pyR GsN( t__name__t __module__t__doc__RRRRR R R (((s0/usr/lib/python2.7/site-packages/yum/failover.pyRs    tprioritycBseZdZddZRS(sA class to provide a failover to switch to a new server if the current one fails. This classes chooses the next server based on the first success in the list of servers. cCsH|dkr|j}n|}|t|jjkr:dS|jj|S(sReturn the next successful server URL in the list, or None if there is a complete failure. This method should always be used to translate an index into a URL, as this object may change how indexes map. :param i: if given, this is the index of the server URL to return, instead of using the failures counter :return: the next server URL N(RRR RR (RRtindex((s0/usr/lib/python2.7/site-packages/yum/failover.pyRVs  N(R RRRR(((s0/usr/lib/python2.7/site-packages/yum/failover.pyRQst roundRobincBs#eZdZdZddZRS(sjA class to provide a failover to switch to a new server if the current one fails. When an object of this class is created, it selects a random place in the list of URLs to begin with, then each time :func:`get_serveurl` is called, the next URL in the list is returned, cycling back to the beginning of the list after the end is reached. cCs3tj||tjtjdd|_dS(Nii%(RRtrandomtseedtrandinttoffset(RR((s0/usr/lib/python2.7/site-packages/yum/failover.pyRts cCse|dkr|j}n|}|t|jjkr:dS||jt|jj}|jj|S(sReturn the next successful server URL in the list, using the round robin scheme, or None if there is a complete failure. This method should always be used to translate an index into a URL, as this object may change how indexes map. :param i: if given, this is the index of the server URL to return, instead of using the failures counter :return: the next server URL N(RRR RR R(RRRtrr((s0/usr/lib/python2.7/site-packages/yum/failover.pyRys  N(R RRRRR(((s0/usr/lib/python2.7/site-packages/yum/failover.pyRls ((RRRRR(((s0/usr/lib/python2.7/site-packages/yum/failover.pyts 7PK[=  #site-packages/yum/logginglevels.pycnu[ v_c@sdZddlZddlZddlZddlZddlZdZdZdZdZ dZ dZ ej ed ej ed ej ed ej e d ej e d ej e ddZ ee_ddlmZdaiejd6ejd6ejd6ejd6ejd6ejd6ejd6ejd6ejd6ejd6ejd6ejd6ej d6ej!d6ej"d6ej#d 6ej$d!6Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+ea,ddd(d)Z-dd*Z.d+Z/dS(,sY Custom logging levels for finer-grained logging using python's standard logging module. iNiii iiitINFO_1tINFO_2tDEBUG_1tDEBUG_2tDEBUG_3tDEBUG_4id(t SysLogHandlertKERNtUSERtMAILtDAEMONtAUTHtLPRtNEWStUUCPtCRONtLOCAL0tLOCAL1tLOCAL2tLOCAL3tLOCAL4tLOCAL5tLOCAL6tLOCAL7cCs{t|tkr|S|jtkr6t|jS|jjdrs|djtkrst|djStdS(NtLOG_iR(ttypetinttuppert_syslog_facility_mapt startswith(tfacility((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pytsyslogFacilityMapGscCs8itd6tjd6tjd6tjd6}t||S(s< Convert an old-style error logging level to the new style. iiii(t __NO_LOGGINGtloggingtCRITICALtERRORtWARNINGt__convertLevel(t error_levelt error_table((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pytlogLevelFromErrorLevelQs cCs}i td6tjd6tjd6tjd6td6tjd6td6td6tjd 6t d 6t d 6t d 6t d 6}t ||S(s< Convert an old-style debug logging level to the new style. iiiiiiiiiiiii(R R!R"R#R$tINFORRtDEBUGRRRRR%(t debug_levelt debug_table((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pytlogLevelFromDebugLevelXs  )cCsgy||}WnRtk rbt|j}||dkrQ||d}qc||d}nX|S(s2 Convert yum logging levels using a lookup table. ii(tKeyErrortsortedtkeys(tlevelttablet new_levelR0((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pyR%as cCs&t|}tjdj|dS(Ns yum.verbose(R-R!t getLoggertsetLevel(R1tconverted_level((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pyt setDebugLevelrs cCs&t|}tjdj|dS(Ntyum(R(R!R4R5(R1R6((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pyt setErrorLevelvs s/dev/logc Cstr<|dk rt|n|dk r8t|ndStjd}tjtj}|j |tj d}t |_ |j |tjtj}|j |tj d} t | _ | j |tj d} | jtjt | _ |rd} d|krB|jdd} | dt| df} ntjj|r]|} n| ry+t|prd } tjj| | aWn-tjk rtdk rtjqqXt|pd| j tqnta|dk rt|n|dk rt|ndS( s; Configure the python logger. errorlevel is optional. If provided, it will override the logging level provided in the logging config file for error messages. debuglevel is optional. If provided, it will override the logging level provided in the logging config file for debug messages. Ns %(message)ss yum.verboseR8syum.fileloggingt:iiR(t_added_handlerstNoneR7R9R!t Formattert StreamHandlertsyststdoutt setFormatterR4tFalset propagatet addHandlertstderrR5R)trsplitRtostpathtexistsRthandlersRtsyslogtsocketterrortcloset setLoggingApptTrue( t debuglevelt errorlevelt syslog_identtsyslog_facilityt syslog_devicetplainformattertconsole_stdouttverbosetconsole_stderrtloggert fileloggertaddresstfacil((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pytdoLoggingSetup{sR                 cs.|dkr*ytjj|}tjj|sItj|ddntjj|st|d}tj|d|jntj dtj |tj dd}j |j |dk r|jfd nWq*tk r&tj d jd |q*XndS( Nitmodeitwisyum.fileloggings%(asctime)s %(message)ss%b %d %H:%M:%Scs jS(N(t removeHandler((t filehandlerR[(s5/usr/lib/python2.7/site-packages/yum/logginglevels.pytsR8sCannot open logfile %s(RGRHtdirnameRItmakedirstopentchmodRNR!R4t FileHandlerR=RARDR<tappendtIOErrortcritical(tuidtlogfiletcleanuptlogdirtft formatter((RbR[s5/usr/lib/python2.7/site-packages/yum/logginglevels.pyt setFileLogs&         cCs-tr)tj|d}tj|ndS(Ns[%(process)d]: %(message)s(RKR!R=RA(tapptsyslogformatter((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pyROs(0t__doc__RGRLR?R!tlogging.handlersRRRRRRt addLevelNameR RBtraiseExceptionsRt syslog_moduleR<RKtLOG_KERNtLOG_USERtLOG_MAILt LOG_DAEMONtLOG_AUTHtLOG_LPRtLOG_NEWStLOG_UUCPtLOG_CRONt LOG_LOCAL0t LOG_LOCAL1t LOG_LOCAL2t LOG_LOCAL3t LOG_LOCAL4t LOG_LOCAL5t LOG_LOCAL6t LOG_LOCAL7RRR(R-R%R7R9R;R^RrRO(((s5/usr/lib/python2.7/site-packages/yum/logginglevels.pytsb                            B PK[DU site-packages/yum/sqlitesack.pycnu[ v_c@sddlZddlZddlZddlZddlmZmZmZmZddl Z ddl Z ddl m Z m Z mZddlZddl Z ddlZddlZddlmZddlmZmZddlZddlZddlZdZdZdZd Zd Zd Z d eeefd YZ!dej"fdYZ#dZ$dZ%dZ&dZ'dZ(dZ)dS(iN(t PackageObjecttRpmBasetYumAvailablePackaget parsePackages(t executeSQLtsql_esct sql_esc_glob(t seq_max_split(tto_utf8t to_unicodecs>fd}j|_j|_|jjj|S(s8This decorator converts sqlite exceptions into RepoErrorcsy||SWnvtjjk r}tjdkrtt|dr_tjt|j qttjt|ntjt|nXdS(Nitmessage( tsqlutilstsqlitetErrortsyst hexversionthasattrtErrorst RepoErrortstrR (targstkwargste(tfunc(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytnewFunc,s(t__name__t__doc__t__dict__tupdate(RR((Rs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytcatchSqliteException*s   cCs tj|S(N(tmisct share_data(tvalue((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _share_data>scCsb||krtS|stS|rN|rN|ddkrN|d|dkrNtS||r^tStS(Nit?t*t[(R"R#R$(tTruetFalse(tmatcht regexp_matchtn((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _parse_pkg_nBs 0 c Cs|d}|std||kr,tS|rt|rt|ddkrt|d|dkrt|d|dkrttSd|krd||f|d|dkrt|||rtSn|dkrd |krd |d|||f|d (tcurtfieldt first_valtob((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _deduplicates   tYumAvailablePackageSqlitecBseZdZeddZddZedZdZ dZ dZ dZ d Z d ed Zed Zd d ZedZdZRS(cCsidd6dd6dd6d d6|_|j|_|j|_||_d|_t|_d|_ |j ||j dkrd|_ n|j |_|j |_|j|_|j|j|j |j |jf|_d|_d|_dS( Nt obsoletest conflictstrequirestprovidest0(((((tprcotsacktidtrepoidtrepoR>tstateR&t _loadedfilest_filest _read_db_objtepochtpkgIdtversiontvertreleasetreltnametarchR;t _changelogt_hash(tselfRPtdb_obj((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt__init__s&             ' tfgetcCs |jS(N(t _loadFiles(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytscCs|r0y ||SWq0ttfk r,d SXnxXddddddgD]>}yt||t||WqIttfk rqIXqIWy@|d|_t|d}||dtf}|g|_Wnttfk rnXd S( swread the db obj. If asked for a specific item, return it. otherwise populate out into the object what existsR[R\RURWRYtpkgKeyRVt checksum_typeN(t IndexErrortKeyErrorR>tsetattrR!RVR%t _checksums(R_R`R7Rft check_sum((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRTs"  cGs=t|j|d|j}|j}t||||S(s6 Exec SQL against an MD of the repo, return a cursor. tdb(tgetattrRMRPtcursorR(R_tMDtsqlRtcacheRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_sql_MDs cCsidd6dd6dd6dd6d d 6d d 6d d6dd6dd6dd6dd6dd6dd6dd6dd6dd 6}|jd!r|jd!rt|n|j||}y)|jd"d#||jfj}Wn@tjk r}t |jd$rt t |nnX|d%}|d&krI|dkrId'}n|d-krj|dkrjd*}n|i d+d6d+d6d+d6d+d6d+d6d+d(6d+d)6d+d6d+d,6krt |}nt ||||S(.Nt size_packaget packagesizet size_archivet archivesizetsize_installedt installedsizet time_buildt buildtimetrpm_header_startthdrstarttrpm_header_endthdrendt location_basetbasepatht location_hreft relativepatht time_filetfiletimet rpm_packagertpackagert rpm_grouptgroupt rpm_buildhostt buildhostt rpm_sourcerpmt sourcerpmt rpm_vendortvendort rpm_licensetlicenseRVtchecksum_valuet__tprimarys'SELECT %s FROM packages WHERE pkgId = ?sno such columniRURKtsummaryt descriptiontiturl(RR(t startswithtendswithtAttributeErrortgetRrRVtfetchoneRRRRhR>R!Ri(R_tvarnamet db2simplemaptdbnameR5RR ((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt __getattr__sN        c Cs'|jr|jSi}|jj|jdd|jdd|jf}xt|dD]}|d}|dkrd}n#|r|dd kr|d 7}nt|d }t |d }xE|r ||j }t |j }|j |gj |qWqZWt|_||_|jS( Ntmdtypet filelistssrSELECT pkgKey, dirname, filetypes, filenames FROM filelist JOIN packages USING(pkgKey) WHERE packages.pkgId = ?Retdirnamet.Rit/t filetypest filenames(RRRSRMtpopulateRPRrRVREtdecodefiletypelisttdecodefilenamelisttpopR!t setdefaulttappendR%( R_tresultRARDRRRtfilenametfiletype((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRc6s,       !  cCsg}|js|j|jjkrey|jj|jddWqetjk ra||_dSXn|jdd|jf}xet |dD]T}d|dd}t |d}t |d }|j |t ||fqW||_dSdS( NRt otherdatatotherswSELECT pkgKey, date, author, changelog FROM changelog JOIN packages USING(pkgKey) WHERE pkgId = ? ORDER BY date DESCReidtdatetauthort changelog( R]RPRMtotherdbRRRRrRVRERRR!(R_RRARDtc_datetc_authortc_log((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_loadChangelogSs$     cCs|j|jfS(N(RfRV(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt returnIdSumrscCs|j|jS(N(RR](R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnChangelogus tfilecCsa|rD|j rDd}|jd||j|f}td|S|jtj|||S(s}return list of files based on type, you can pass primary_only=True to limit to those files in the primary repodatas=SELECT name as fname FROM files WHERE pkgKey = ? and type = ?RcSs|dS(Ntfname((tx((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(RRRrRetmapRcRtreturnFileEntries(R_tftypet primary_onlyRpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRys  cCsX|rA|j rAd}|jd||jf}td|S|jtj|S(sreturn list of types of files in the package, you can pass primary_only=True to limit to those files in the primary repodatas9SELECT DISTINCT type as ftype FROM files WHERE pkgKey = ?RcSs|dS(NR((R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(RRRrReRRcRtreturnFileTypes(R_RRpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs  cCsMtjdtjddd}|jd||j|f}td|S(Ns_simpleFiles() will go away in a future version of Yum.Use returnFileEntries(primary_only=True) t stacklevelis=SELECT name as fname FROM files WHERE pkgKey = ? and type = ?RcSs|dS(NR((R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(twarningstwarnRtYumDeprecationWarningRrReR(R_RRpRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt simpleFiless  cCst|}|dkr!d}nt|j|trd|}|jd||jf}g|j|RTRRrRRcRRRR&RRRRR(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRFs   9      tYumSqlitePackageSackcBseZdZdZedZdZdZdZdZ edZ dZ d d Z d Z d Zd ZdZdZdZdZdZdZdZedZedZdZdZd<dZddZd<edZ dZ!edZ"edZ#d Z$eed!Z%ed"Z&ed#Z'eed$Z(ed%Z)ed&Z*ed'Z+ed(Z,d<d=d)Z-d<d>d*Z.eged+Z/ed,Z0d-Z1d.Z2d/Z3d0Z4ed1Z5ed<d<ed2Z6ed<d<ed3Z7ed4Z8d<d<ed5Z9d6Z:ed<d<ed7Z;d<d<ed8Z<ed<ed9Z=ed<d<d<d<d<d:Z>ed;Z?RS(?s~ Implementation of a PackageSack that uses sqlite cache instead of fully expanded metadata objects to provide information cCstjj||i|_i|_i|_i|_t|_t|_ i|_ iid6id6|_ i|_ i|_ i|_t|_t|_t|_d|_g|_i|_t|_dS(NRJRI(tyumRepotYumPackageSackRat primarydbt filelistsdbRtexcludesR2t _excludest_exclude_whitelistt _all_excludest _search_cachet_key2pkgt_pkgname2pkgkeyst _pkgtup2pkgst_pkgnames_loadedt_pkgmatch_failst_provmatch_failsR>t _arch_allowedt _pkgExcludert_pkgExcludeIdsR&t_pkgobjlist_dirty(R_t packageClass((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRas*                 cGs7t||d|}|j}t||||S(s6 Exec SQL against an MD of the repo, return a cursor. Rl(RmRnR(R_RoRPRpRRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRrs cCs#d}|jd||jdS(s- Give a count of pkgIds in the given repo DB s!SELECT count(pkgId) FROM packagesRi(RrR(R_RoRPRp((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_sql_MD_pkg_numscsUtdstjrNtfdj}|_t_njS(s{ If the pkgobjlist is dirty (possible pkgs on it which are excluded) then clean it, and return the clean list. t pkgobjlistcsj| S(N(t _pkgExcluded(R(R_(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRds(RR1RtfilterRR&(R_tpol((R_s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_clean_pkgobjlists    cCst}x6|jjD]%\}}||jkrt}PqqW|rIdSt|drht|jSd}x(|jD]}|t|j|7}qxWd}x'|jD]}||j d|7}qW||S(NiRR( R%RtitemsRR&RtlenRRR(R_t all_excludedRPRqt exclude_numtpkg_num((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt__len__s cCst|dr|`nt|dr0|`nt|drH|`nt|_i|_i|_t|_ t|_ t|_ i|_ iid6id6|_ tjdS(Nt_memoize_requirest_memoize_providesRRJRI(RRRRR&RRRR2RRRRRRt unshare_data(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytdropCachedData s"           cCs|jx;|jj|jj|jjD]}|jq4Wi|_i|_i|_i|_t|_t|_ i|_ g|_ i|_ t |_tjj|dS(N(RRtvaluesRRtcloseRR2RRRRRR&RRR(R_tdataobj((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs            cCsdS(N((R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt buildIndexes3sterrorcCsdS(N((R_tfailure((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _checkIndexes8scs|jj||f||jkr|j|j|ddk r|jj}tfd|}||jjRR;R(R_RPRetpos((Rs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _delPackageRK;s cCs|j|jkr%i|j|jR RRRNtsplitRR1R@R(R_RPReR)RR4R5R6R3ROR?R'R(texSPLITtexTtexM((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgExcludedRKNEVRAlsX 0      ! !  !  !c Cs4|\}}}}}|j|||||||S(sb Helper function to call _pkgExcludedRKNEVRA. Takes a repo, pkgKey and a package tuple(R( R_RPReR;R)R6RR4R5((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgExcludedRKTsc CsW|d|d|d|d|df\}}}}}|j|||||||S(si Helper function to call _pkgExcludedRKNEVRA. Takes a repo, pkgKey and a dict of package dataR[R\RURWRY(R( R_RPReR3R)R6RR4R5((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgExcludedRKDs*cCs|j|j|j|jS(sR Helper function to call _pkgExcludedRKNEVRA. Takes a package object. (RRPReR;(R_R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRscGs|dk r||jkrdSd}d}tr4nS|jdrnt|dks[t|dj}n|jdrt|dkst|d}n|jdr t|dkst|dj}tj|rt j t j |j }qn~|jdr3t|dkstnT|jdr]t|dkstn*|jd rt|dkstn|jj||||f|dk rt|j|j|RR&RRR1RRtre_globtretcompiletfnmatcht translateR'RRR2RR%R(R_ROt excluderidR?RR'R(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytaddPackageExcluders8 !  c Cs|s t|r(|j||r(dS||jkrTi|j|RRRrRRRRtpcRRR;RRR ( R_RPReRRpR3tmsgRtpkgkeys((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _packageByKeys.  !  cCs|s t|r+|j|||r+dS||jkrWi|j|RRRR"RRR;R(R_RPReR3RRR$((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_packageByKeyDatas  cCs|j|||rdS|jj|}|dkrTi|j|RRRR;(R_RPReR3tprepo((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_pkgtupByKeyDatas  cCsg}x|jD]u}|jj|ij|g}|sCqnx?|D]7}|j||}|dkrtqJn|j|qJWqW|S(s2 Load all pkgnames from cache, with a given name. N(RRRR%R>R(R_tpkgnametretRPR$tpkgkeytpkg((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_packagesByName#s!  cCs||jkr)||j|kr6dSn g|j|<||jkrUi|j|RRRRRR(R_RPtdatatypeRtcallback((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytaddDict2s      tlikecCs|j|dS(NRJ(t searchPrco(R_R[t query_type((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt searchAllOscCs|dkrg}nxe|D]]}|rD|j||d|}n|j||d}|dkrlqn|j|qW|S(sB Takes a cursor and maps the pkgKey rows into a list of packages. ReN(R>R&R%R(R_RPRAtpkgst have_dataRDR,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_sql_pkgKey2poSs   cCs7t}x*|jD]}||jkrt}PqqW|S(s6 Are we going to skip every package in all our repos? (R%R/RR&(R_tskip_allRP((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt _skip_all`s cCsd}tjj|}tj|s0d}ng}xh|jjD]W\}}||jkrgqFn|j}t |d||f|j |||qFWtj |S(Ntglobt=s1select DISTINCT pkgKey from files where name %s ?( tostpathtnormpathRRRRRRnRR9tunique(R_R[t querytypetresultstrepRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_search_primary_filesis  cCshxa|jjD]P\}}||jkr1qn|j}t|dx|D]}PqQWtSqWtS(s Return true if pkg.returnFileEntries(primary_only=True) is fast. basically does "CREATE INDEX pkgfiles ON files (pkgKey);" exist. sPRAGMA index_info(pkgfiles)(RRRRnRR&R%(R_RDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_have_fastReturnFileEntrieszs   cCs(t|ds!|j|_n|jS(sb Is calling pkg.returnFileEntries(primary_only=True) faster than using searchFiles(). t _cached_fRFE(RRFRG(R_((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pythave_fastReturnFileEntriesscs|jrgSt}td}tjj|}tjj|}tjj||sntj| rt }t d}ntjst n|ddkr|d }ng}tj |r|j |St |j dkr:xH|jjD]4\}}||jkr qn|j|ddqWnxk|j D]`}t|dr_qDn|jd |} |jd|} | | krtjnt|_qDWg} d } |st\} }d |} | j|| jd | d nsBt\} }d |} | j|| jd | d ndkrxu|j jD]d\}}||jkrq^n|j}| j|t|d|f| |j|||q^Wtj|Sx|j jD]\}}||jkrqn|j}t|d| |f| d|g|j|||rhtjtj |nfd}|j!dd|t|d| | |j|||qWtj|}|S(sYsearch primary if file will be in there, if not, search filelists, use globs, if possibleR<R=iRiRRt_checked_filelists_pkgsRRs(dirname = ? and filenames LIKE ? %s and t%s+dirname GLOB ? and filenames LIKE ? %s and R#sQSELECT pkgKey FROM filelist WHERE dirname %s ?sselect pkgKey from filelist where %s length(filetypes) = 1 and dirname || ? || filenames %s ?cse|jd}s%t|kStfd|}x!|D]}j|rDdSqDWdS(NRcsd|fS(Ns%s/%s((tf(t sql_dirname(s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRdsii(RtintRR'(RLt sql_filenamesRtfnsR'(t file_globRtname_re(RLs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytfilelist_globbers RRisselect pkgKey from filelist where %s length(filetypes) > 1 and filelist_globber(dirname,filenames)("R;R%R>R?R@RtbasenameRRR&tre_primary_filenameRERRRRRRRRRRRIRRRnRR9RARRRRtcreate_function(R_R[tstrictR<RBRR7RPRqtpri_pkgstfil_pkgst sql_paramst dirname_checktpatterntescRDRARR((RPRRQs2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt searchFiless                  c Cs|jrgSg}t|dkr,|S|jdd}t|\}}d|d||f}x(|dD]}d||||f}qrWxI|jjD]8\}}|j} t| ||j|| |qW|S(s7search arbitrary fields from the primarydb for a stringit's''s>select DISTINCT pkgKey from packages where %s like '%%%s%%'%s is%s or %s like '%%%s%%'%s ( R;RtreplaceRRRRnRR9( R_tfieldst searchstringRR\RpRKRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchPrimaryFieldss   cCs|jrgSg}| s$| r(|St|tjt|kri}xK|D]C}|j||}x(|D] }|j|dd||(R_R`t searchstringsRttotRatmatchesRt unionstringtendunionstringtselectstsR\RpRKt totalstringRDRqRARDR,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt"searchPrimaryFieldsMultipleStrings)sD   ""     c Csu|jriS|r"tni}xF|jjD]5\}}|j}t|dx |D]}t|dt|dt|dt|dt|df}|j||d|rqdnt|dt|d t|d t|d t|d f\}} } } } t|}t|| | | | ff} |j|gj | qdWq8W|S( Nsselect packages.name as name, packages.pkgKey as pkgKey, packages.arch as arch, packages.epoch as epoch, packages.release as release, packages.version as version, obsoletes.name as oname, obsoletes.epoch as oepoch, obsoletes.release as orelease, obsoletes.version as oversion, obsoletes.flags as oflags from obsoletes,packages where obsoletes.pkgKey = packages.pkgKeyR[R\RURWRYRetonametoflagstoepochtoversiontorelease( R;tNotImplementedErrorRRRnRR!RRR(R_tnewestRGRDRqRARDRcR)RKRR4R5tval((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnObsoletes]s0        " !cCsUxN|jjD]=\}}|j}t|d|fx|D]}|SWqWdS(Ns&select * from packages where pkgId = ?(RRRnR(R_RVRDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytgetPackageDetailss   cCsg}t|dkr|Stt|}x[|jjD]J\}}|j}t|d|fx|D]}|j|qqWq>W|S(Nis(select * from packages where pkgId in %s(RRRRRRnRR(R_t pkgId_listR7t pkgid_queryRDRqRARD((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_getListofPackageDetailss  c Cs?t|d|s.i}x|jjD]\}}||jkrJq)n|j}t|d|x|D]}t|dt|dt|dt|dt|dff}t|}||df}t|d } | |f}|j|gj|qnWq)Wt |d||nt |d|S( Nt _memoize_sselect * from %sR[RRURWRYiRe( RRRRRnRR!RRRiRm( R_RtmemoizeRDRqRARR|RcR+((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_search_get_memoizes$    !c Cs|jriSt|}|dkr1d}nt|ttdtfkrp||tjj|f}n*t|t t fkr|||f}nt |}t |}||j |kr|j ||Si}t r|jj}t}ng}t }|j|} x|jjD]\} } | |jkrDq#ni} x]| j| |fgD]C} | \}}tjj||rc| j|gj|qcqcWxH| jD]:\}}|j| |}|dkrqn||||j|D]-}|ddfg||<||j ||ttypeRtunicodetrpmUtilst miscutilststringToVersionRtlistR!RR%RRR&RRRt rangeCompareRRt iteritemsR%RnRRRTR]RE(R_RR[RRWtreqRtprimarydb_itemstpreloadRRDRqttmpRR+R|RethitsR,RA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_searchs    !           $ cCs|jd|||S(NRJ(R(R_R[RRW((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt getProvides scCs|jd|||S(NRI(R(R_R[RRW((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt getRequiresscCs0|jrgSt|d}g}t|}g}x^|D]V}||jkrYq>n|sn||jkr|j|j|q>|j|q>W|rg|D]}|j^q}n|s|St j }t ||krx0t ||D]}|j|j ||qW|Sg} d} x|D]} | jdq,W| dj| } x|jjD]\} } | j}t|| ||rxF|D]>}|j| |d|}|dkrqn|j|qWqfn|j| ||dtqfW|s,|jjg|D] } | ^qn|S(syreturn a list of packages matching any of the given names. This is only a match on package name, nothing elseRs^select pkgId,pkgKey,name,epoch,version,release,arch from packages where sname = ?s OR ReR8N(R;RR2RRtextendR-RR;RftPATTERNS_INDEXED_MAXRRt searchNamesRkRRRnRR(R>R9R%R(R_tnamestreturn_pkgtupstloaded_all_namest returnListt user_namesR)R,t max_entriestpat_sqlstqsqlR[RPRqRARDR;((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRsP        &c Cs|jrgSy%tj|\}}\}}}Wn(tjk r_}tjt|nX|}t|} | }t} d} tj|st } d} ng} g} xY|j j D]H\}}|j }t |d|| f|f|j||| qWx| D]~}tj|rE|dkrE| j|qn| s|j||||||ffr| j|qq| j|qW|dkr| Stj|s| S| j|j|tj|r| rtj| S| j|j|tj| S(s3return list of packages matching name and prcotype R<R=s.select DISTINCT pkgKey from %s where name %s ?RJN(R;Rtstring_to_prco_tupleRt MiscErrortPackageSackErrorR R%RR&RRRnRR9t re_filenameR>Rt checkPrcoRRERTRAR](R_R[RR)RKRR4R5tn_btn_uR<RBt basic_resultsRCRDRqRAR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR4NsJ %     $  cCsB||jkrgS|j|d}|s>|jj|n|S(s9return list of packages providing name (any evr and flag)RJ(RR4R(R_R[R*((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchProvidess cCs|j|dS(s9return list of packages requiring name (any evr and flag)RI(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchRequiresscCs|j|dS(s:return list of packages obsoleting name (any evr and flag)RG(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchObsoletesscCs|j|dS(s@return list of packages conflicting with name (any evr and flag)RH(R4(R_R[((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsearchConflictsscCsdGHdd1dY}|}|d|d|d|d|df|_||_|d |_|rm|Si|d d 6|d d 6|_i|dd6dd6|dd6|_idd6|dd6|d d6|_i|dd6|dd6|_i|dd6|dd6|d d!6|_i |d"d"6|d#d#6|d$d%6|d&d'6|d(d)6|d*d+6|d,d,6|d-d.6|d/d06|_|S(2Nsdie die die die die db2classt tmpObjectcBseZRS((RR(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRsR[RURWRYR\RVR{tstartR}tendRthrefRR RtbasetYEStpkgidRfRRytbuildRRRstpackageRutarchiveRwt installedRRRRRRRRRRRRRRR(( R0RMRVthdrangetlocationtchecksumttimetsizetinfo(R_Rlt nevra_onlyRty((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytdb2classs& ,  &*'cCs|stjj||||Sg}xR|jjD]A\}}|j}t|d||j|||dtq5W|st j d|nt j |S(NsYselect pkgId,pkgKey,name,epoch,version,release,arch from packages where name=? and arch=?R8sNo Package Matching %s.%s( RRtreturnNewestByNameArchRRRnRR9R%RRRt newestInList(R_tnaTuptpatternst ignore_casetallpkgRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs cCs|jrgS|s/tjj||||Sg}xU|jjD]D\}}|j}t|d|f|j|||dt qEW|st j d|nt j |S(sBreturn list of newest packages based on name matching this means(in name.arch form): foo.i386 and foo.noarch will be compared to each other for highest version. Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 The last _two_ pkgs will be returned, not just one of them. sNselect pkgId,pkgKey,name,epoch,version,release,arch from packages where name=?R8sNo Package Matching %s(R;RRtreturnNewestByNameRRRnRR9R%RRRR(R_R[RRRRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs  c Cs>|jrgggfSg}g}t|}x|D]}tj|rntidd6|d6}|}ntidd6|d6}|}xq|jjD]`\}} | j} t| ||j || } t | r|j |n|j | qWq8Wtj |}tj |}tj |}|||fS(NR<toptqR=(R;RRRt PARSE_QUERYRRRnRR9RtremoveRRA( R_tpkgspecstmatchedt exactmatcht unmatchedtptquerytmatchresRDRlRAtpmatches((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytmatchPackageNamess,        c Cs^|d krg}ndddddddg}t}x<|D]4}tj|r=|sg||jkr=t}Pq=q=Wtj}|sdg}tj}nt ||krg}n|rt |}ng}t} xL|D]D}tj |r |j |dft} q|j |d fqW| rH| rH|rH|||tfS|}|||tfS( szSetup need_full and patterns for _yieldSQLDataList, also see if we can get away with just using searchNames(). R[t sql_nameArchtsql_nameVerRelArcht sql_nameVertsql_nameVerRelt sql_envrat sql_nevraR<R=N( R>R&Rtre_full_search_neededRR%RfRgRRRRR( R_RORRR`t need_fulltpattpat_maxRt need_glob((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_setupPkgObjLists<           ccsAg}g}x|D]}\}}| r;||jkr;qnxR|D]J} |rh|jd| |fn|jd| |f|j|qBWqW|r| rdS|rtdj|} nd} xs|jjD]b\} } |dks|| jkr| j} t | | |x| D]}| |fVq!WqqWdS(s^Yields all the package data for the given params. Excludes are done at this stage. s %s LIKE ?%ss%s %s ?Ns OR sYselect pkgId, pkgKey, name,epoch,version,release,arch from packages( RRt_FULL_PARSE_QUERY_BEGRkRRR>RNRnR(R_RORR`RRtpat_dataR[trestRBRRPRqRAR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_yieldSQLDataList7s*    cCsg}|j|||}|\}}}}|r@|j|Sx^|j||||D]D\} } |j| | d| } | dkrqYn|j| qYW| r|dkr||_t|_n| r|dkr|jj g|D]} | j ^qn|rqx`|D]U\} } | dkr3qnx4|D],}|j | kr:|jj |j Pq:q:WqWn|sx'|D]\} } |j j | q~Wn|S(sjBuilds a list of packages, only containing nevra information. Excludes are done at this stage. ReR=RN(R=R( RRRR&R>RRR2RRR[RR(R_RORRRR3RR`RRPRRRRR,((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt_buildPkgObjListWs8   )  cCs|jrgSt|d}|r4|j}n$|j|||}t|d}|r|rt}t||| dd}|d|d}n|dkr|r|}n|Sg}x0|D](}||jkrqn|j|qW|S(sReturns a list of packages, only containing nevra information. The packages are processed for excludes. Note that the packages are always filtered to those matching the patterns/case. RRAs repo-pkgkeyiiN( R;RRRR&RR>ROR(R_RORRtinternal_pkgoblistRRR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytreturnPackages~s,      cCs|jrgSt|d}|r;tjj|||Sd}g}|j|||}|\}}}} | rg|j|D]} | j^qSx^|j ||||D]D\} } |j | | d| } | dkrqn|j | qW|S(sReturns a list of pkg tuples (n, a, e, v, r), optionally from a single repoid. Note that the packages are always filtered to those matching the patterns/case. RReN( R;RRRt simplePkgListR>RRR;RR(R(R_RRRRORR3RR`RR,RPRR;((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs& # cCs|jrgSg}|rx|jd|gD]}t}x]d|fd|fd|fd|fgD]1\} } | rit|| | krit}PqiqiW|r2|j|q2q2W|St} x,|||||fD]} | rt} qqW| r|Sd} xd|fd|fd|fd|fd|fgD]P\} } | r5| dd krn| d | | f} q| d | | f} q5q5WxO|jjD]>\}}|j}t || |j |||d tqW|S( s6return list of pkgobjects matching the nevra requestedRRURWR\RYsGselect pkgId,pkgKey,name,epoch,version,release,arch from packages WHERER[itWHEREs AND %s = "%s"s %s = "%s"R8( R;RR%RmR&RRRRnRR9(R_R[RURXRZR\RR,R'tcoltvartemptytargRRDRqRA((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt searchNevras@ " "  c Cs|jdkr!t||_n|jj||_td|}dj|}x|jjD]\}}|j}|j j d sgd|jkrqgnt }t |dx(|D] }|d|krt }PqqW|sg|j|dSqgWdS(sBexcludes incompatible arches - archlist is a list of compat archescSsd|S(Ns'%s'((R((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRdst,s-sourcetsrcs"SELECT DISTINCT arch FROM packagesiN(RR>R2t intersectionRRkRRRnRNRR&RR%R ( R_tarchlistt sarchlistt arch_queryRDRqRAthas_archtrow((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyt excludeArchss$ "   N(NNN(NNN(@RRRRaRRrRRRRRRRR R R RRRRRRR!R%R%R&R(R-R>R2R6R&R9R;RERFRHR]RbRtR}R~RRRRRRR4RRRRRRRRRRRRRRR(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRs         A    )        }4%[;A    ( &#,cCs dj|S(NR(Rk(t filenamelist((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytencodefilenamelist scCs|jdd}|jdS(Ns//R(R_R(tfilenamestring((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyRscCsDd}idd6dd6dd6}x|D]}|||7}q(W|S(NRRKRtdtdirtgtghost((t filetypelistRt ft2stringR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytencodefiletypelists  cCs6idd6dd6dd6}g|D]}||^q"S(NRRKRRRR((tfiletypestringt string2ftR((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pyR ss select pkgKey from packages where name %(op)s '%(q)s' or name || '.' || arch %(op)s '%(q)s' or name || '-' || version %(op)s '%(q)s' or name || '-' || version || '-' || release %(op)s '%(q)s' or name || '-' || version || '-' || release || '.' || arch %(op)s '%(q)s' or epoch || ':' || name || '-' || version || '-' || release || '.' || arch %(op)s '%(q)s' or name || '-' || epoch || ':' || version || '-' || release || '.' || arch %(op)s '%(q)s' s SELECT pkgId,pkgKey,name,epoch,version,release,arch, name || "." || arch AS sql_nameArch, name || "-" || version || "-" || release || "." || arch AS sql_nameVerRelArch, name || "-" || version AS sql_nameVer, name || "-" || version || "-" || release AS sql_nameVerRel, epoch || ":" || name || "-" || version || "-" || release || "." || arch AS sql_envra, name || "-" || epoch || ":" || version || "-" || release || "." || arch AS sql_nevra FROM packages WHERE (*R>tos.pathRRtpackagesRRRRRRR RRRtrpmUtils.miscutilsRRfRityum.miscRtyum.i18nRR RRRRR!R*R8R@RERFRRRRRRRR(((s2/usr/lib/python2.7/site-packages/yum/sqlitesack.pytsF    "             C T   PK["'ggsite-packages/yum/update_md.pynuȯ#!/usr/bin/python -t # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University # # Seth Vidal # Luke Macken """ Update metadata (updateinfo.xml) parsing. """ import sys from yum.i18n import utf8_text_wrap, to_utf8, to_unicode, _ from yum.yumRepo import YumRepository from yum.packages import FakeRepository from yum.misc import to_xml, decompress, repo_gen_decompress from yum.misc import cElementTree_iterparse as iterparse import Errors import logginglevels import rpmUtils.miscutils from rpmUtils.arch import ArchStorage def safe_iterparse(filename, logger=None): """ Works like iterparse, but hides XML errors (prints a warning). """ try: for event, elem in iterparse(filename): yield event, elem except SyntaxError: # Bad XML if logger: logger.critical(_("Updateinfo file is not valid XML: %s"), filename) else: print >> sys.stderr, "Updateinfo file is not valid XML:", filename class UpdateNoticeException(Exception): """ An exception thrown for bad UpdateNotice data. """ pass class UpdateNotice(object): """ A single update notice (for instance, a security fix). """ def __init__(self, elem=None, repoid=None, vlogger=None): self._md = { 'from' : '', 'type' : '', 'title' : '', 'release' : '', 'status' : '', 'version' : '', 'pushcount' : '', 'update_id' : '', 'issued' : '', 'updated' : '', 'description' : '', 'rights' : '', 'severity' : '', 'summary' : '', 'solution' : '', 'references' : [], 'pkglist' : [], 'reboot_suggested' : False } if elem: self._parse(elem) self._repoid = repoid self._vlogger = vlogger def __getitem__(self, item): """ Allows scriptable metadata access (ie: un['update_id']). """ if type(item) is int: return sorted(self._md)[item] ret = self._md.get(item) if ret == '': ret = None return ret def __contains__(self, item): """ Allows quick tests for foo in blah. """ return item in self._md def __setitem__(self, item, val): self._md[item] = val def __eq__(self, other): # Tests to see if it's "the same data", which means that the # packages can be different (see add_notice). def _rid(un): if hasattr(un, '_repoid') and un._repoid is not None: return un._repoid else: return '' def _log_failure(data): """Log the mismatched data similarly to conflict markers in git.""" if self._vlogger is None: return msg = _('Duplicate of %s differs in some fields:\n') msg %= other._md['update_id'] msg += '<<<<<<< %s:%s\n' % (_rid(other), data) msg += '%r\n=======\n%r\n' % (other._md[data], self._md[data]) msg += '>>>>>>> %s:%s' % (_rid(self), data) # --verbose mode enables this self._vlogger.log(logginglevels.DEBUG_3, msg) if not other or not hasattr(other, '_md'): return False for data in ('type', 'update_id', 'status', 'rights', 'severity', 'release', 'issued', 'updated', 'version', 'pushcount', 'from', 'title', 'summary', 'description', 'solution'): if data == 'status': # FIXME: See below... continue if self._md[data] != other._md[data]: _log_failure(data) return False # FIXME: Massive hack, Fedora is really broken and gives status=stable # and status=testing for updateinfo notices, just depending on which # repo. they come from. data = 'status' if self._md[data] != other._md[data]: if self._md[data] not in ('stable', 'testing'): _log_failure(data) return False if other._md[data] not in ('stable', 'testing'): _log_failure(data) return False # They are both really "stable" ... self._md[data] = 'stable' other._md[data] = 'stable' return True def __ne__(self, other): return not (self == other) def text(self, skip_data=('files', 'summary', 'rights', 'solution')): head = """ =============================================================================== %(title)s =============================================================================== Update ID : %(update_id)s Release : %(release)s Type : %(type)s Status : %(status)s Issued : %(issued)s """ % self._md if self._md['updated'] and self._md['updated'] != self._md['issued']: head += " Updated : %s" % self._md['updated'] # Add our bugzilla references bzs = filter(lambda r: r['type'] == 'bugzilla', self._md['references']) if len(bzs) and 'bugs' not in skip_data: buglist = " Bugs :" for bz in bzs: buglist += " %s%s\n\t :" % (bz['id'], 'title' in bz and ' - %s' % bz['title'] or '') head += buglist[: - 1].rstrip() + '\n' # Add our CVE references cves = filter(lambda r: r['type'] == 'cve', self._md['references']) if len(cves) and 'cves' not in skip_data: cvelist = " CVEs :" for cve in cves: cvelist += " %s\n\t :" % cve['id'] head += cvelist[: - 1].rstrip() + '\n' if self._md['summary'] and 'summary' not in skip_data: data = utf8_text_wrap(self._md['summary'], width=64, subsequent_indent=' ' * 12 + ': ') head += " Summary : %s\n" % '\n'.join(data) if self._md['description'] and 'description' not in skip_data: desc = utf8_text_wrap(self._md['description'], width=64, subsequent_indent=' ' * 12 + ': ') head += "Description : %s\n" % '\n'.join(desc) if self._md['solution'] and 'solution' not in skip_data: data = utf8_text_wrap(self._md['solution'], width=64, subsequent_indent=' ' * 12 + ': ') head += " Solution : %s\n" % '\n'.join(data) if self._md['rights'] and 'rights' not in skip_data: data = utf8_text_wrap(self._md['rights'], width=64, subsequent_indent=' ' * 12 + ': ') head += " Rights : %s\n" % '\n'.join(data) if self._md['severity'] and 'severity' not in skip_data: data = utf8_text_wrap(self._md['severity'], width=64, subsequent_indent=' ' * 12 + ': ') head += " Severity : %s\n" % '\n'.join(data) if 'files' in skip_data: return head[:-1] # chop the last '\n' # Get a list of arches we care about: #XXX ARCH CHANGE - what happens here if we set the arch - we need to # pass this in, perhaps arches = set(rpmUtils.arch.getArchList()) filelist = " Files :" for pkg in self._md['pkglist']: for file in pkg['packages']: if file['arch'] not in arches: continue filelist += " %s\n\t :" % file['filename'] head += filelist[: - 1].rstrip() return head def __str__(self): return to_utf8(self.text()) def __unicode__(self): return to_unicode(self.text()) def get_metadata(self): """ Return the metadata dict. """ return self._md def _parse(self, elem): """ Parse an update element:: """ if elem.tag == 'update': for attrib in ('from', 'type', 'status', 'version'): self._md[attrib] = elem.attrib.get(attrib) for child in elem: if child.tag == 'id': if not child.text: raise UpdateNoticeException("No id element found") self._md['update_id'] = child.text elif child.tag == 'pushcount': self._md['pushcount'] = child.text elif child.tag == 'issued': self._md['issued'] = child.attrib.get('date') elif child.tag == 'updated': self._md['updated'] = child.attrib.get('date') elif child.tag == 'references': self._parse_references(child) elif child.tag == 'description': self._md['description'] = child.text elif child.tag == 'rights': self._md['rights'] = child.text elif child.tag == 'severity': self._md[child.tag] = child.text elif child.tag == 'summary': self._md['summary'] = child.text elif child.tag == 'solution': self._md['solution'] = child.text elif child.tag == 'pkglist': self._parse_pkglist(child) elif child.tag == 'title': self._md['title'] = child.text elif child.tag == 'release': self._md['release'] = child.text else: raise UpdateNoticeException('No update element found') def _parse_references(self, elem): """ Parse the update references:: """ for reference in elem: if reference.tag == 'reference': data = {} for refattrib in ('id', 'href', 'type', 'title'): data[refattrib] = reference.attrib.get(refattrib) self._md['references'].append(data) else: raise UpdateNoticeException('No reference element found') def _parse_pkglist(self, elem): """ Parse the package list:: """ for collection in elem: data = { 'packages' : [] } if 'short' in collection.attrib: data['short'] = collection.attrib.get('short') for item in collection: if item.tag == 'name': data['name'] = item.text elif item.tag == 'package': data['packages'].append(self._parse_package(item)) self._md['pkglist'].append(data) def _parse_package(self, elem): """ Parse an individual package:: """ package = {} for pkgfield in ('arch', 'epoch', 'name', 'version', 'release', 'src'): package[pkgfield] = elem.attrib.get(pkgfield) # Bad epoch and arch data is the most common (missed) screwups. # Deal with bad epoch data. if not package['epoch'] or package['epoch'][0] not in '0123456789': package['epoch'] = None for child in elem: if child.tag == 'filename': package['filename'] = child.text elif child.tag == 'sum': package['sum'] = (child.attrib.get('type'), child.text) elif child.tag == 'reboot_suggested': self._md['reboot_suggested'] = True return package def xml(self): """Generate the xml for this update notice object""" msg = """ %s %s %s %s\n""" % (to_xml(self._md['from']), to_xml(self._md['status']), to_xml(self._md['type']), to_xml(self._md['version']), to_xml(self._md['update_id']), to_xml(self._md['title']), to_xml(self._md['release']), to_xml(self._md['issued'], attrib=True), to_xml(self._md['description'])) if self._md['updated']: # include the updated date in the generated xml msg += """ \n""" % (to_xml(self._md['updated'], attrib=True)) if self._md['summary']: msg += """ %s\n""" % (to_xml(self._md['summary'])) if self._md['solution']: msg += """ %s\n""" % (to_xml(self._md['solution'])) if self._md['rights']: msg += """ %s\n""" % (to_xml(self._md['rights'])) if self._md['severity']: msg += """ %s\n""" % (to_xml(self._md['severity'])) if self._md['references']: msg += """ \n""" for ref in self._md['references']: if ref['title']: msg += """ \n""" % ( to_xml(ref['href'], attrib=True), to_xml(ref['id'], attrib=True), to_xml(ref['title'], attrib=True), to_xml(ref['type'], attrib=True)) else: msg += """ \n""" % ( to_xml(ref['href'], attrib=True), to_xml(ref['id'], attrib=True), to_xml(ref['type'], attrib=True)) msg += """ \n""" if self._md['pkglist']: msg += """ \n""" for coll in self._md['pkglist']: msg += """ \n %s\n""" % ( to_xml(coll['short'], attrib=True), to_xml(coll['name'])) for pkg in coll['packages']: msg += """ %s \n""" % (to_xml(pkg['arch'], attrib=True), to_xml(pkg['name'], attrib=True), to_xml(pkg['release'], attrib=True), to_xml(pkg['src'], attrib=True), to_xml(pkg['version'], attrib=True), to_xml(pkg['epoch'] or '0', attrib=True), to_xml(pkg['filename'])) msg += """ \n""" msg += """ \n""" msg += """\n""" return msg def _rpm_tup_vercmp(tup1, tup2): """ Compare two "std." tuples, (n, a, e, v, r). """ return rpmUtils.miscutils.compareEVR((tup1[2], tup1[3], tup1[4]), (tup2[2], tup2[3], tup2[4])) class UpdateMetadata(object): """ The root update metadata object. """ def __init__(self, repos=[], logger=None, vlogger=None): self._notices = {} self._cache = {} # a pkg nvr => notice cache for quick lookups self._no_cache = {} # a pkg name only => notice list self._repos = [] # list of repo ids that we've parsed self._logger = logger self._vlogger = vlogger for repo in repos: try: # attempt to grab the updateinfo.xml.gz from the repodata self.add(repo) except Errors.RepoMDError: continue # No metadata found for this repo self.arch_storage = ArchStorage() self.archlist = self.arch_storage.archlist def get_notices(self, name=None): """ Return all notices. """ if name is None: return self._notices.values() return name in self._no_cache and self._no_cache[name] or [] notices = property(get_notices) def get_notice(self, nvr): """ Retrieve an update notice for a given (name, version, release) string or tuple. """ if type(nvr) in (type([]), type(())): nvr = '-'.join(nvr) return self._cache.get(nvr) or None # The problem with the above "get_notice" is that not everyone updates # daily. So if you are at pkg-1, pkg-2 has a security notice, and pkg-3 # has a BZ fix notice. All you can see is the BZ notice for the new "pkg-3" # with the above. # So now instead you lookup based on the _installed_ pkg.pkgtup, and get # two notices, in order: [(pkgtup-3, notice), (pkgtup-2, notice)] # the reason for the sorting order is that the first match will give you # the minimum pkg you need to move to. def get_applicable_notices(self, pkgtup): """ Retrieve any update notices which are newer than a given std. pkgtup (name, arch, epoch, version, release) tuple. Returns: list of (pkgtup, notice) that are newer than the given pkgtup, in the order of newest pkgtups first. """ oldpkgtup = pkgtup name = oldpkgtup[0] arch = oldpkgtup[1] ret = [] other_arch_list = [] notices = set() for notice in self.get_notices(name): for upkg in notice['pkglist']: for pkg in upkg['packages']: other_arch = False if pkg['name'] != name or pkg['arch'] != arch: if (notice not in notices and pkg['name'] == name and pkg['arch'] in self.archlist): other_arch = True else: continue pkgtup = (pkg['name'], pkg['arch'], pkg['epoch'] or '0', pkg['version'], pkg['release']) if _rpm_tup_vercmp(pkgtup, oldpkgtup) <= 0: continue if other_arch: other_arch_list.append((pkgtup, notice)) else: ret.append((pkgtup, notice)) notices.add(notice) for pkgtup, notice in other_arch_list: if notice not in notices: ret.append((pkgtup, notice)) ret.sort(cmp=_rpm_tup_vercmp, key=lambda x: x[0], reverse=True) return ret def add_notice(self, un): """ Add an UpdateNotice object. This should be fully populated with data, esp. update_id and pkglist/packages. """ if not un or not un["update_id"]: return False # This is "special", the main thing we want to deal with here is # having one errata that has multiple packages in it rpmA and rpmB, but # the packages are in repos. repoA and repoB. So instead of doing a # single errata pointing to both rpmA and rpmB and put the same thing # in both repodata (which is legal, and works fine) people want to have # just the packages from repoA in the repodata for repoA and vice versa. if un['update_id'] in self._notices: oun = self._notices[un['update_id']] if oun != un: return False # Ok, main parts of errata are the same, so now merge references: seen = set() for ref in oun['references']: seen.add(ref['id']) for ref in un['references']: if ref['id'] in seen: continue seen.add(ref['id']) oun['references'].append(ref) # ...and pkglist (this assumes that a pkglist name XYZ is the same): seen = set() for pkg in oun['pkglist']: seen.add(pkg['name']) for pkg in un['pkglist']: if pkg['name'] in seen: continue seen.add(pkg['name']) oun['pkglist'].append(pkg) un = oun self._notices[un['update_id']] = un for pkg in un['pkglist']: for filedata in pkg['packages']: self._cache['%s-%s-%s' % (filedata['name'], filedata['version'], filedata['release'])] = un no = self._no_cache.setdefault(filedata['name'], set()) no.add(un) return True def add(self, obj, mdtype='updateinfo'): """ Parse a metadata from a given YumRepository, file, or filename. """ def _rid(repoid, fmt=_(' (from %s)')): if not repoid: return '' return fmt % repoid if not obj: raise UpdateNoticeException repoid = None if type(obj) in (type(''), type(u'')): unfile = decompress(obj) infile = open(unfile, 'rt') elif isinstance(obj, YumRepository): if obj.id not in self._repos: repoid = obj.id self._repos.append(obj.id) md = obj.retrieveMD(mdtype) if not md: raise UpdateNoticeException() unfile = repo_gen_decompress(md, 'updateinfo.xml') infile = open(unfile, 'rt') elif isinstance(obj, FakeRepository): raise Errors.RepoMDError, "No updateinfo for local pkg" else: # obj is a file object infile = obj have_dup = False for event, elem in safe_iterparse(infile, logger=self._logger): if elem.tag == 'update': try: un = UpdateNotice(elem, repoid, self._vlogger) except UpdateNoticeException, e: msg = _("An update notice%s is broken, skipping.") % _rid(repoid) if self._vlogger: self._vlogger.log(logginglevels.DEBUG_1, "%s", msg) else: print >> sys.stderr, msg continue if not self.add_notice(un): msg = _("Update notice %s%s is broken, or a bad duplicate, skipping.") % (un['update_id'], _rid(repoid)) if not have_dup: msg += _('\nYou should report this problem to the owner of the %srepository.') % _rid(repoid, "%s ") msg += _('\nTo help pinpoint the issue, please attach the output of "yum updateinfo --verbose" to the report.') have_dup = True if self._vlogger: self._vlogger.warn("%s", msg) else: print >> sys.stderr, msg def __unicode__(self): ret = u'' for notice in self.notices: ret += unicode(notice) return ret def __str__(self): return to_utf8(self.__unicode__()) def xml(self, fileobj=None): msg = """\n""" if fileobj: fileobj.write(msg) for notice in self._notices.values(): if fileobj: fileobj.write(notice.xml()) else: msg += notice.xml() end = """\n""" if fileobj: fileobj.write(end) else: msg += end if fileobj: return return msg def main(): """ update_md test function. """ import yum.misc yum.misc.setup_locale() def usage(): print >> sys.stderr, "Usage: %s ..." % sys.argv[0] sys.exit(1) if len(sys.argv) < 2: usage() try: print sys.argv[1] um = UpdateMetadata() for srcfile in sys.argv[1:]: um.add(srcfile) print unicode(um) except IOError: print >> sys.stderr, "%s: No such file:\'%s\'" % (sys.argv[0], sys.argv[1:]) usage() if __name__ == '__main__': main() PK[DVctctsite-packages/yum/plugins.pycnu[ v_c@sSddlZddlZddlZddlZddlZddlZddlZddlZddlTddl Z ddl m Z m Z ddl Z ddl mZddlmZddlZddlmZddlmZddlmZd Zd efd YZd Zd Zed ZeefZidd6dd6dd6dd6dd6dd6dd6dd6dd6dd6dd 6d!d"6d!d#6d!d$6d!d%6d!d&6d'd(6d'd)6d*d+6d*d,6d-d.6d/d06Ze ej!Z"d1e#fd2YZ$d3dFd4YZ%d5dGd6YZ&ddHd7YZ'de'fd8YZ(de(fd9YZ)de'fd:YZ*de*fd;YZ+de*fd<YZ,de,fd=YZ-de-fd>YZ.d!e-fd?YZ/d'e/fd@YZ0d-e/fdAYZ1d*e/fdBYZ2d/e/fdCYZ3dDZ4dEZ5dS(IiN(t*(t ParsingErrort ConfigParser(tConfigPreProcessor(tfill(tproxy(t_(t utf8_widths2.7t DeprecatedIntcBseZdZRS(sXA simple int subclass that is used to check when a deprecated constant is used. (t__name__t __module__t__doc__(((s//usr/lib/python2.7/site-packages/yum/plugins.pyRDsiitConfigPluginConduittconfigtPostConfigPluginConduitt postconfigtInitPluginConduittinittArgsPluginConduittargstDownloadPluginConduitt predownloadt postdownloadtPreRepoSetupPluginConduittprelistenabledrepost prereposetuptPostRepoSetupPluginConduitt postreposetupt PluginConduittclosetcleantMainPluginConduittpretranst posttranstpreverifytranstpostverifytranstexcludetDepsolvePluginConduitt preresolvet postresolvetHistoryPluginConduitt historybegint historyendtCompareProvidersPluginConduittcompare_providerstVerifyPluginConduittverify_packaget PluginYumExitcBs&eZdZdddZdZRS(sGException that can be raised by plugins to signal that yum should stop.tcCs||_||_dS(N(tvaluettranslation_domain(tselfR1R2((s//usr/lib/python2.7/site-packages/yum/plugins.pyt__init__os cCs*|jrtj|j|jS|jSdS(N(R2tgettexttdgettextR1(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyt__str__rs (R R R R4R7(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR/lst YumPluginscBsbeZdZddddddZdZdZedZdZ dZ dZ RS( sManager class for Yum plugins.c Cs|sdg}n||_||_t||_||_d|_tjd|_ ||_ ||_ |dkr~t }nt |ttfs|f}nttg|D]}t|^qkr|j jtjdn|j|i|_tj|jd|jddS(svInitialise the instance. @param base: The @param searchpath: A list of paths to look for plugin modules. @param optparser: The OptionParser instance for this run (optional). Use to allow plugins to extend command line options. @param types: A sequence specifying the types of plugins to load. This should be sequnce containing one or more of the TYPE_... constants. If None (the default), all plugins will be loaded. @param pluginconfpath: A list of paths to look for plugin configuration files. Defaults to "/etc/yum/pluginconf.d". s/etc/yum/pluginconf.dsyum.verbose.YumPluginsseDeprecated constant TYPE_INTERFACE during plugin initialization. Please use TYPE_INTERACTIVE instead.RR N(NN(t searchpathtpluginconfpathtweakreftbaset optparsertNonetcmdlinetloggingt getLoggertverbose_loggertdisabledPluginstenabledPluginst ALL_TYPESt isinstancetlistttupletidtTYPE_INTERFACEtlogt logginglevelstINFO_2t_importpluginstcmdlinestatexittregistertrun( R3R<R9R=ttypesR:tdisabledtenabledtt((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4{s*          +   cKstj|d}|dkr1td|nt|}xf|j|D]W\}}|jjtj d|||j |\}}||||j ||qKWdS(sRun all plugin functions for the given slot. :param slotname: a string representing the name of the slot to run the plugins for :param kwargs: keyword arguments that will be simply passed on to the plugins sunknown slot name "%s"s$Running "%s" handler for "%s" pluginN( tSLOT_TO_CONDUITtgetR>t ValueErrortevalt _pluginfuncsRBRKRLtDEBUG_4t_pluginsR<(R3tslotnametkwargst conduitclstmodnametfuncRtconf((s//usr/lib/python2.7/site-packages/yum/plugins.pyRRs    c Csi|_i|_xtD]}g|j|tFalsetfnmatchtaddtTrue(RatpluginstusedR~((s//usr/lib/python2.7/site-packages/yum/plugins.pyt_plugin_cmdline_matchs   c Cstjj|\}}|jdd}|j||j|jrf|j||j|j rfdS|j|}| st j |ddt j t  r|j||j|j r|j jtd|dSyLtj||g\}}}ztj||||} Wd|jXWn=|j jtjrDn|j jtd|dSXt| ds|j jtd |dStt| js|j jtd || jtfdSt| d t} t| tt fs| f} nt!| d krdSxR| D]J} t"| t"t#krV|j j$tj%d |n| |krdSqW|j j$tj&td|||j'kr| |f|j'|RRtreadfpRRRtstr(R3RaRyt conffilenametparsert confpp_objte((s//usr/lib/python2.7/site-packages/yum/plugins.pyRRs $   cCs||f|_dS(sSet the parsed command line options so that plugins can access them. :param opts: a dictionary containing the values of the command line options :param commands: a list of command line arguments passed to yum N(R?(R3toptstcommands((s//usr/lib/python2.7/site-packages/yum/plugins.pyt setCmdLineksN( R R R R>R4RRRNt staticmethodRRrRR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR8xs,  . X tDummyYumPluginscBs eZdZdZdZRS(sThis class provides basic emulation of the :class:`YumPlugins` class. It exists so that calls to plugins.run() don't fail if plugins aren't in use. cOsdS(s&Do nothing. All arguments are unused.N((R3RR_((s//usr/lib/python2.7/site-packages/yum/plugins.pyRR{scOsdS(s&Do nothing. All arguments are unused.N((R3RR_((s//usr/lib/python2.7/site-packages/yum/plugins.pyRs(R R R RRR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyRvs cBseZdZdZdZdZd dZdZdZ d dZ d dZ d d Z d d Z d d Zd ZRS(sLA conduit class to transfer information between yum and the plugin. cCsC||_||_||_tjd|_tjd|_dS(Ns yum.pluginsyum.verbose.plugin(t_parentt_baset_confR@RAtloggerRB(R3tparentR<Rc((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4s    cCs&tj|}|jj||dS(sSend an info message to the logger. :param level: the level of the message to send :param msg: the message to send N(RLtlogLevelFromDebugLevelRBRK(R3tleveltmsgtconverted_level((s//usr/lib/python2.7/site-packages/yum/plugins.pytinfoscCs&tj|}|jj||dS(sSend an error message to the logger. :param level: the level of the message to send :param msg: the message to send N(RLtlogLevelFromErrorLevelRRK(R3RRR((s//usr/lib/python2.7/site-packages/yum/plugins.pyRscCsi|jd||jjjr#tS|jjjr6tS|rIi|d6ni}t|jj|SdS(sOReturn a yes or no response, either from assumeyes already being set, or from prompting the user. :param msg: the message to show to the user :param prompt: the question to ask the user (optional); defaults to 'Is this ok [y/N]: ' :return: 1 if the response is yes, and 0 if the response is no itpromptN( RRRctassumenoRt assumeyesRtboolt userconfirm(R3RRR_((s//usr/lib/python2.7/site-packages/yum/plugins.pytpromptYNscCsddl}|jS(s8Return a string representing the current version of yum.iN(tyumt __version__(R3R((s//usr/lib/python2.7/site-packages/yum/plugins.pyt getYumVersions cCs |jjS(sReturn the :class:`optparse.OptionParser` instance for this execution of Yum. In the "config" and "init" slots a plugin may add extra options to this instance to extend the command line options that Yum exposes. In all other slots a plugin may only read the :class:`OptionParser` instance. Any modification of the instance at this point will have no effect. See the :func:`PreRepoSetupPluginConduit.getCmdLine` method for details on how to retrieve the parsed values of command line options. :return: the global :class:`optparse.OptionParser` instance used by Yum. May be None if an OptionParser isn't in use (RR=(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyt getOptParserscCs"tj|j||tj|S(s5Read a string value from the plugin's own configuration file. :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: string option value read, or default if option was missing (R RRtOption(R3tsectiontopttdefault((s//usr/lib/python2.7/site-packages/yum/plugins.pyt confStrings cCs"tj|j||tj|S(sfRead an integer value from the plugin's own configuration file. :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: the integer option value read, or *default* if the option was missing or could not be parsed (R RRt IntOption(R3RRR((s//usr/lib/python2.7/site-packages/yum/plugins.pytconfInts cCs"tj|j||tj|S(s\Read a float value from the plugin's own configuration file. :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: float option value read, or *default* if the option was missing or could not be parsed (R RRt FloatOption(R3RRR((s//usr/lib/python2.7/site-packages/yum/plugins.pyt confFloats cCs"tj|j||tj|S(s_Read a boolean value from the plugin's own configuration file :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: boolean option value read, or *default* if the option was missing or could not be parsed (R RRR(R3RRR((s//usr/lib/python2.7/site-packages/yum/plugins.pytconfBools cCs"tj|j||tj|S(s_Read a boolean value from the plugin's own configuration file :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: boolean option value read, or *default* if the option was missing or could not be parsed (R RRt ListOption(R3RRR((s//usr/lib/python2.7/site-packages/yum/plugins.pytconfLists cCs|jjj|dS(siRegister the name of a package to use. :param name: the name of the package to register N(Rtrun_with_package_namesR(R3tname((s//usr/lib/python2.7/site-packages/yum/plugins.pytregisterPackageNamesN(R R R R4RRR>RRRRRRRRR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyRs     cBs eZdZdZdZRS(s%A conduit for use in the config slot.cCstjdtitjt6tjt6tjt 6tj t 6}|t krjt tj||||nz|tkrt tj||||nN|tkr|||}t tj||t tj|tj|ndS(sDeprecated. Register a yum configuration file option. :param name: name of the new option :param valuetype: option type (PLUG_OPT_BOOL, PLUG_OPT_STRING, etc.) :param where: where the option should be available in the config file (PLUG_OPT_WHERE_MAIN, PLUG_OPT_WHERE_REPO, etc) :param default: default value for the option if it is not set by the user suregisterOpt() will go away in a future version of Yum. Please manipulate config.YumConf and config.RepoConf directly.N(twarningstwarntDeprecationWarningR RtPLUG_OPT_STRINGRt PLUG_OPT_INTRt PLUG_OPT_BOOLRtPLUG_OPT_FLOATtPLUG_OPT_WHERE_MAINtsetattrtYumConftPLUG_OPT_WHERE_REPOtRepoConftPLUG_OPT_WHERE_ALLtInherit(R3Rt valuetypetwhereRttype2opttoption((s//usr/lib/python2.7/site-packages/yum/plugins.pyt registerOpts          cCs>t|jdr%|jj|ntjtddS(sRegister a new command. :param command: the command to register :raises: :class:`yum.Errors.ConfigError` if the registration of commands is not supported tregisterCommands&registration of commands not supportedN(RvRRRRR(R3tcommand((s//usr/lib/python2.7/site-packages/yum/plugins.pyR0s(R R R RR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR s cBseZdZdZRS(s'Conduit for use in the postconfig slot.cCs |jjS(sReturn a dictionary containing the values of the configuration options. :return: a dictionary containing the values of the configuration options (RRc(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pytgetConf?s(R R R R(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR<scBs eZdZdZdZRS(s!Conduit for use in the init slot.cCs |jjS(sReturn a dictionary containing the values of the configuration options. :return: a dictionary containing the values of the configuration options (RRc(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyRKscCs |jjS(sReturn Yum's container object for all configured repositories. :return: Yum's :class:`yum.repos.RepoStorage` instance (Rtrepos(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pytgetReposTs(R R R RR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyRHs cBs eZdZdZdZRS(s0Conduit for dealing with command line arguments.cCs#tj||||||_dS(N(RR4t_args(R3RR<RcR((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4^scCs|jS(sReturn a list of the command line arguments passed to yum. :return: a list of the command line arguments passed to yum (R(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pytgetArgsbs(R R R R4R(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR[s cBs eZdZdZdZRS(s)Conduit for use in the prererosetup slot.cCs |jjS(sReturn parsed command line options. :return: (options, commands) as returned by :class:`OptionParser.parse_args()` (RR?(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyt getCmdLinemscCs |jjS(sReturn a representation of the local RPM database. This allows querying of installed packages. :return: a :class:`yum.rpmUtils.RpmDBHolder` instance (Rtrpmdb(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pytgetRpmDBts(R R R RR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyRis cBseZdZdZRS(s*Conduit for use in the postreposetup slot.cCs |jjS(sVReturn group information. :return: :class:`yum.comps.Comps` instance (Rtcomps(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyt getGroupss(R R R R(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR|scBs,eZdZddZdZdZRS(s&Conduit for use in the download slots.cCs,tj||||||_||_dS(N(RR4t_pkglistt_errors(R3RR<Rctpkglistterrors((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4s cCs|jS(sReturn a list of package objects representing packages to be downloaded. :return: a list of package object representing packages to be downloaded (R(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pytgetDownloadPackagesscCs|js iS|jS(sReturn a dictionary of download errors. :return: a dictionary of download errors. This dictionary is indexed by package object. Each element is a list of strings describing the error (R(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyt getErrorss N(R R R R>R4RR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyRs  cBs5eZdZddZdZdZdZRS(sbMain conduit class for plugins. Many other conduit classes will inherit from this class. cCs+|r|j}nd}|jjj|S(sReturn a list of packages. :param repo: the repo to return a packages from :return: a list of package objects N(RIR>RtpkgSacktreturnPackages(R3trepotarg((s//usr/lib/python2.7/site-packages/yum/plugins.pyt getPackagess cCs|jj|S(s Retrieve a package object from the packages loaded by Yum using nevra information. :param nevra: a tuple holding (name, epoch, version, release, arch) for a package :return: a :class:`yum.packages.PackageObject` instance (or subclass) (RtgetPackageObject(R3tnevra((s//usr/lib/python2.7/site-packages/yum/plugins.pytgetPackageByNevrascCs|jjj|dS(siDelete the given package from the package sack. :param po: the package object to delete N(Rtsackt delPackage(R3tpo((s//usr/lib/python2.7/site-packages/yum/plugins.pyRscCs |jjS(sFReturn transaction set. :return: the transaction set (RttsInfo(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyt getTsInfosN(R R R R>RRRR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyRs  cBs5eZdZdgdZedZdZRS(s(Conduit for use in solving dependencies.cCs,tj||||||_||_dS(N(RR4t resultcodet resultstring(R3RR<Rctrescodetrestring((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4s cCs |jjS(sDBoolean indicating if depsolving failed due to missing dependencies.(Rt_missing_requires(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pytmissing_requiresscCs&djd|jj|jDS(Ns css|]\}}||VqdS(N((t.0tprefixR((s//usr/lib/python2.7/site-packages/yum/plugins.pys s(RuRtpretty_output_restringR(R3((s//usr/lib/python2.7/site-packages/yum/plugins.pyR sN(R R R R>R4tpropertyR R (((s//usr/lib/python2.7/site-packages/yum/plugins.pyR%scBseZdZiddZRS(s3Conduit to compare different providers of packages.cCs,tj||||||_||_dS(N(RR4tpackagestreqpo(R3RR<Rctproviders_dictR((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4s N(R R R R>R4(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR+scBseZdZdgdZRS(s4Conduit to access information about the yum history.cCs)tj|||||jj|_dS(N(RR4Rthistory(R3RR<RcRR((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4sN(R R R R>R4(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR(scBseZdZdZRS(sConduit to verify packages.cCs#tj||||||_dS(N(RR4R.(R3RR<RcR.((s//usr/lib/python2.7/site-packages/yum/plugins.pyR4s(R R R R4(((s//usr/lib/python2.7/site-packages/yum/plugins.pyR-scCs+|jd\}}t|t|fS(sParse a string representing an api version. :param apiver: a string representing an api version :return: a tuple containing the major and minor version numbers t.(Rtint(tapivertmajtmin((s//usr/lib/python2.7/site-packages/yum/plugins.pytparseverscCsLt|}t|}|d|dkr0dS|d|dkrHdSdS(sReturn true if API version "a" supports API version "b" :param a: a string representing an api version :param b: a string representing an api version :return: whether version *a* supports version *b* ii(R(tatb((s//usr/lib/python2.7/site-packages/yum/plugins.pyRs  ((((6RmRqRRRPR5R@RLt constantsR RRRRRttextwrapRRR;RRRtyum.i18nRRRRt TYPE_COREtTYPE_INTERACTIVERJRERWRptkeysRit ExceptionR/R8RRR RRRRRRRR%R+R(R-RR(((s//usr/lib/python2.7/site-packages/yum/plugins.pyts                .  ( PK[<!site-packages/yum/packageSack.pycnu[ v_c@sdZddlmZddlZddlZddlZddlZddlmZddl Z ddl m Z dfdYZ de fd YZd efd YZd efd YZdZdZdefdYZdS(s; Classes for manipulating and querying groups of packages. i(tPackageSackErrorN(t parsePackages(t compareEVRtPackageSackVersioncBs5eZdZdZdZdZdZRS(cCs"d|_tjdg|_dS(Nitsha1(t_numtmisct Checksumst_chksum(tself((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt__init__s cCsd|j|jjfS(Ns%u:%s(RRt hexdigest(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt__str__#scCs|dkrtSt|tdtdfkrDt||kS|j|jkrZtS|jj|jjkr|tStS(Ntu(tNonetFalsettypetstrRRtdigesttTrue(R tother((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt__eq__&s $cCs ||k S(N((R R((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt__ne__-scCs`|jd7_|jjt||dk r\|jj|d|jj|dndS(Nii(RRtupdateRR(R tpkgtcsum((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR0s  (t__name__t __module__R R RRR(((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRs     tPackageSackBasecBseZdZdZdZdZdZdZdZdZ d%d%d%d%d%dZ ge d Z d Zd Zd%d%d%d%d%d%d Zd%d&d Zd%d'dZdZdZdZdZe dZdZdZdZdZdZd%d%e dZdZe idZd%d%e dZ d%d%e dZ!d%e dZ"dZ#d Z$d!Z%d"Z&d#Z'd%d$Z(RS((s8Base class that provides the interface for PackageSacks.cCs i|_dS(N(tadded(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR :scCst|jS(N(tlentreturnPackages(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt__len__=scCs3|j}t|dr%|jSt|SdS(Nt__iter__(RthasattrR!titer(R tret((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR!@s  cCs|dkrdSt|j}t|j}t|t|krZt|t|SxBtt|t|D]%\}}t||}|rv|SqvWdS(Nii(RtlistRRtziptsortedtcmp(R Rts_reposto_reposts_repoto_repoR$((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt__cmp__Gs (cCs tdS(N(tNotImplementedError(R t compatArchs((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytsetCompatArchsUscCs tdS(N(R.(R trepotmdtypetcallbackt cacheOnly((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytpopulateXscCs#tjdtdd|j|S(s5return a list of package objects by (n,a,e,v,r) tuples;packagesByTuple() will go away in a future version of Yum. t stackleveli(twarningstwarntDeprecationWarningtsearchPkgTuple(R tpkgtup((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytpackagesByTuple[s  cCs tdS(s6return list of pkgobjects matching the nevra requestedN(R.(R tnametepochtvertreltarch((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt searchNevracscCs tdS(N(R.(R tnamestreturn_pkgtups((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt searchNamesgsc Cs7|jd|jd|jd|jd|jd|jS(srreturn list of package objects matching the name, epoch, ver, rel, arch of the package object passed inR=R>R?R@RA(RBR=R>R?R@RA(R tpo((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytsearchPOjs$c Cs=|\}}}}}|jd|d|d|d|d|S(s7return list of pkgobject matching the (n,a,e,v,r) tupleR=RAR>R?R@(RB(R R;tntatetvtr((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR:qsc Csd|r6|j}|j}|j}|j}|j}nt|jd|d|d|d|d|S(spreturn if there are any packages in the sack that match the given NAEVR or the NAEVR of the given poR=RAR>R?R@(R=RAR>tversiontreleasetboolRB(R R=RAR>R?R@RF((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytcontainsvs     cCs tdS(s5return dict { packages -> list of matching provides }N(R.(R R=tflagsRM((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt getProvidesscCs tdS(s5return dict { packages -> list of matching requires }N(R.(R R=RQRM((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt getRequiresscCs tdS(s<return list of package requiring the name (any evr and flag)N(R.(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytsearchRequiresscCs tdS(s<return list of package providing the name (any evr and flag)N(R.(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytsearchProvidesscCs tdS(sCreturn list of package conflicting with the name (any evr and flag)N(R.(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytsearchConflictsscCs tdS(s=return list of package obsoleting the name (any evr and flag)N(R.(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytsearchObsoletesscCs tdS(sEreturns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]N(R.(R tnewest((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytreturnObsoletesscCs tdS(sb Is calling pkg.returnFileEntries(primary_only=True) faster than using searchFiles(). N(R.(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pythave_fastReturnFileEntriesscCs tdS(s#return list of packages by filenameN(R.(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt searchFilesscCs tdS(s"add a pkgobject to the packageSackN(R.(R tobj((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt addPackagescCs tdS(sbuilds the useful indexes for searching/querying the packageSack This should be called after all the necessary packages have been added/deletedN(R.(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt buildIndexesscCs tdS(sdelete a pkgobjectN(R.(R R\((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt delPackagescCs tdS(sreturn list of all packagesN(R.(R trepoidtpatternst ignore_case((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRscGs tdS(s Add an "excluder" for all packages in the repo/sack. Can basically do anything based on nevra, changes lots of exclude decisions from "preload package; test; delPackage" into "load excluder". Excluderid is used so the caller doesn't have to track "have I loaded the excluder for this repo.", it's probably only useful when repoid is None ... if it turns out utterly worthless then it's still not a huge wart. N(R.(R R`t excluderidtexcludertargs((s3/usr/lib/python2.7/site-packages/yum/packageSack.pytaddPackageExcludersc CsVd}t}i}i}i}xt|jD]}|j} |j|| x^|D]V} |j|| kr`| |krt|| R?R@RA((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRBscCs|jd||S(NRE(R(R RCRD((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyREscCs|jd|||S(s5return dict { packages -> list of matching provides }RR(t_computeAggregateDictResult(R R=RQRM((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRRscCs|jd|||S(s5return dict { packages -> list of matching requires }RS(R(R R=RQRM((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRSscCs|jd|S(s<return list of package requiring the name (any evr and flag)RT(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRTscCs|jd|S(s<return list of package providing the name (any evr and flag)RU(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRUscCs|jd|S(sCreturn list of package conflicting with the name (any evr and flag)RV(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRVscCs|jd|S(s=return list of package obsoleting the name (any evr and flag)RW(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRWsc s|s|jdS|jd}td|D}i}d}d }d }dfd}x~t|j|dtdD][} | d} || kr|||  rqn| }| }| |kr|| || sR cSsYt|d|d}|r!|St|d|d|df|d|d|df S(s4 Compare two pkgtup's (ignore arch): n, a, e, v, r. iiii(R(R(txtyR$((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt_pkgtup_nevr_cmpscs||dkS(Ni((RR(R(s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt_pkgtup_nevr_eqsRDR(iN(RRRR'RER( R RXtobsdictRCtnobsdictt last_nametlast_pkgt last_pkgtupRR;R=((Rs3/usr/lib/python2.7/site-packages/yum/packageSack.pyRYs(     cCs|jd|S(s#return list of packages by filenameR[(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR[scCsdS(saAdd a pkgobject to the packageSack. This is a meaningless operation for the MetaSack.N((R R\((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR]scCs(x!|jjD]}|jqWdS(sbuilds the useful indexes for searching/querying the packageSack This should be called after all the necessary packages have been added/deletedN(RRR^(R R((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR^scCs|jjj|dS(s2Delete a pkgobject if it exists in every sub-sack.N(R1RR_(R R\((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR_scCs9|s|jdd||S|j|jd|d|S(sReturns a list of packages. Note that the packages are always filtered to those matching the patterns/case. An optional repoid allows you to easily get data for a specific repo. RRaRbN(RRRR(R R`RaRb((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRs   cGsB|s%|j}|dd|||S|j|jd|||S(s Add an "excluder" for all packages in the repo/sack. Can basically do anything based on nevra, changes lots of exclude decisions from "preload package; test; delPackage" into "load excluder". Excluderid is used so the caller doesn't have to track "have I loaded the excluder for this repo.", it's probably only useful when repoid is None ... if it turns out utterly worthless then it's still not a huge wart. RfN(RRRRf(R R`RcRdRetcalr((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRfs  cCsf|j}|d|||}t|}| rb|s=|rbdj|pLg}td|n|S(sreturn list of newest packages based on name, arch matching this means(in name.arch form): foo.i386 and foo.noarch are not compared to each other for highest version only foo.i386 and foo.i386 will be compared. Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 The last _two_ pkgs will be returned, not just one of them. Rxs, sNo Package Matching %s(RtpackagesNewestByNameArchtjoinR(R RwRaRbRRtui_pats((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRxs  cCso|jd|||}t|}| rk|s7|rk|rF|}ndj|pUg}td|n|S(sreturn list of newest packages based on name matching this means(in name.arch form): foo.i386 and foo.noarch will be compared to each other for highest version.Rys, sNo Package Matching %s(RtpackagesNewestByNameRR(R R=RaRbRR((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRys    cCs|jd||S(s,returns a list of pkg tuples (n, a, e, v, r)Rz(R(R RaRb((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRzs cCs(x!|jjD]}|jqWdS(N(RRR{(R R((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR{#scCs+x$|jjD]}|j|qWdS(sDexclude incompatible arches. archlist is a list of compatible archesN(RRR}(R R|R((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR}'scCs|jd|||S(NR(R(R R~RR3((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR,scCs|jd||S(NR(R(R RR((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR/sc Csg}g}d}x|jjD]}t|dr"ggg}}}y|j|\}}}Wntk r}q"nX|j||j||dkrt|}q|jt|}q"q"Wt j |}t j |}|dkrg}n t |}|||fS(NR( RRRR"RRtextendRt intersectionRRR%( R RRRRRRJtmtu((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR2s*       cGsg}x~t|jjD]g}t||rt||}yt||}Wntk riqnX|r|j|qqqW|S(N(R'RRR"tgetattrtapplyRR(R t methodNameRetresultRtmethodt sackResult((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRMs cGsi}x~t|jjD]g}t||rt||}yt||}Wntk riqnX|r|j|qqqW|S(N(R'RRR"RRRR(R RReRRRR((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR\s N(NNN(NNN(%RRRR R RRR5R0R<RRBRRERRRSRTRURVRWRYR[R]R^R_RRfRxRyRzR{R}RRRRR(((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRisD            "           t PackageSackcBsveZdZdZdZddZdZdZd"d"d"d"d"dZ ge dZ d"d#d Z d"d$d Z d Zd Zd ZdZdZe dZdZdZdZdZdZdZdZdZdZdZd"d"e dZd"d"e dZd"d"e dZ d"e dZ!dZ"d Z#d!Z$RS(%s*represents sets (sacks) of Package ObjectscCsktj|i|_i|_i|_i|_i|_i|_i|_i|_ d|_ d|_ dS(Ni( RR tnevrat obsoletestrequirestprovidest conflictst filenamest pkgsByRepotpkgsByIDRRt indexesBuilt(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR ns          cCs5d}x(|jD]}|t|j|7}qW|S(Ni(RR(R R$R1((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR sterrorcCsA|js=|dkr!tdq=|dkr=|jq=ndS(scheck to see if the indexes are built, if not do what failure demands either error out or build the indexes, default is to error outRs$Indexes not yet built, cannot searchtbuildN(RRR^(R tfailure((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt _checkIndexess     cCs|jdS(s* Do nothing, mainly for the testing code. N(t clearIndexes(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRscCs ||_dS(N(R(R R((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR0sc Cs?|jdd|||||f|jkrH|j|||||fS|dk r{|jj|ddddfg}n-g}x$|jjD]}|j|qWg}x|D]} |r|| jks|r|| jks|r|| j ks|r|| j ks|r*|| j kr*qn|j | qW|S(s6return list of pkgobjects matching the nevra requestedRRN( RRRtgetRt itervaluesRR=R>R?R@RAR( R R=R>R?R@RARt pkgsbyRepoRRF((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRBs$ ' cCs|jddg}t}xX|D]P}||kr>q&n|j||j|jj|ddddfgq&W|rg|D]}|j^qS|S(s6return list of pkgobjects matching the names requestedRRN(RRRRRRRR;(R RCRDRtdoneR=R((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyREs    /cCs|jdd|dkr%d}n6t|ttdtfkr[tjj|}ni}xK|jj |gD]4}|j d|||f}|rw||| list of matching provides }RRRit/N(NNN(NNN(RRRRtunicodetrpmUtilst miscutilststringToVersionRRt matchingPrcosR[RgR(R R=RQRMRRFthitsthit((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRRs  ! cCs|jdd|dkr%d}n6t|ttdtfkr[tjj|}ni}xK|jj |gD]4}|j d|||f}|rw||| list of matching requires }RRRN(NNN( RRRRRRRRRRR(R R=RQRMRRFR((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRSs  !c Cs|jddt||}tj|\}}\}}}g} g} ||krl| j||nxB| D]:} | j||||||ffrs| j| qsqsW|dkr| Stj|s| S| j|j|tj | S(NRRR( RRRtstring_to_prco_tupleRt checkPrcoRt re_filenameR[R( R R=tprcotypetprcodictRHtfRJRKRLt basic_resultstresultsRF((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt searchPrcos !  $ cCs|j|dS(s3return list of package requiring the item requestedR(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRTscCs|j|dS(s3return list of package providing the item requestedR(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRUscCs|j|dS(s6return list of package conflicting with item requestedR(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRVscCs|j|dS(s4return list of package obsoleting the item requestedR(R(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRWscCsi}xN|jD]@}t|jdkr4qn|j|jgj|jqW|sa|Std|jD}g}x*|D]"}||kr|j|qqWx|D] }||=qW|S(sEreturns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]icss|]}|jVqdS(N(R;(RR((s3/usr/lib/python2.7/site-packages/yum/packageSack.pys s( RRRRgR;RRRyR(R RXtobsRFt newest_tupsttogoR((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRY s#    cCstS(sb Is calling pkg.returnFileEntries(primary_only=True) faster than using searchFiles(). (R(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRZ#scCs2|jdd||jkr*|j|SgSdS(s& Return list of packages by filename. RRN(RR(R R=((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR[(s cCs.||krg||R?R@((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR]Cs   cCsP|jx6|jD]+}x"|j|D]}|j|q(WqWd|_dS(sbuilds the useful indexes for searching/querying the packageSack This should be called after all the necessary packages have been added/deletediN(RRRR(R R`R\((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR^Ns  cCsLi|_i|_i|_i|_i|_i|_i|_d|_dS(Ni(RRRRRRRR(R ((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR[s       cCsx?|jdD].\}}\}}}|j|j||qWx?|jdD].\}}\}}}|j|j||qRWx?|jdD].\}}\}}}|j|j||qWx?|jdD].\}}\}}}|j|j||qWxD|jD]6}x-|j|D]}|j|j||q+WqW|j|j |j ||j \} } } } } |j|j | | | | | f||j|j | ddddf|dS(NRRRR(t returnPrcoRRRRRtreturnFileTypestreturnFileEntriesRRRR;RR(R R\RHtflRJRKRLtftypetfileR=RAR>R?R@((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRgs((((%cCsx?|jdD].\}}\}}}|j|j||qWx?|jdD].\}}\}}}|j|j||qRWx?|jdD].\}}\}}}|j|j||qWx?|jdD].\}}\}}}|j|j||qWxD|jD]6}x-|j|D]}|j|j||q+WqW|j|j |j ||j \} } } } } |j|j | | | | | f||j|j | ddddf|dS(NRRRR(RRRRRRRRRRRR;RR(R R\RHRRJRKRLRRR=RAR>R?R@((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyt_delPackageFromIndexzs((((%cCs6|j|j|j||jr2|j|ndS(sdelete a pkgobjectN(RRR`RR(R R\((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyR_s cCsg}|dkr=xM|jD]}|j|j|qWn%y|j|}Wntk ranX|rt||| dd}|d|d}n|S(s2return list of all packages, takes optional repoidRs repo-pkgkeyiiN(RRRtKeyErrorR(R R`RaRbt returnListR1((s3/usr/lib/python2.7/site-packages/yum/packageSack.pyRs   cCs)i}|rZ|jdd|jj|dddddf}|srtd|qrn|jd|d|}x}|D]u}|j|jf|kr|||j|jfs$     2  PK[yA%A%site-packages/yum/igroups.pynuȯ#! /usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Copyright 2010, 2012 Red Hat # # James Antill import os import fnmatch import re def _open_no_umask(*args): """ Annoying people like to set umask's for root, which screws everything up for user readable stuff. """ oumask = os.umask(022) try: ret = open(*args) finally: os.umask(oumask) return ret def _makedirs_no_umask(*args): """ Annoying people like to set umask's for root, which screws everything up for user readable stuff. """ oumask = os.umask(022) try: ret = os.makedirs(*args) finally: os.umask(oumask) return ret def _read_str(fo): for s in fo: if s[:-1]: return s[:-1] return '' class InstalledGroup(object): def __init__(self, gid): self.gid = gid self.pkg_names = set() self.environment = None def __cmp__(self, other): if other is None: return 1 return cmp(self.gid, other.gid) def _additions(self, pkg_names): pkg_names = set(pkg_names) return sorted(pkg_names.difference(self.pkg_names)) def _removals(self, pkg_names): pkg_names = set(pkg_names) return sorted(pkg_names.difference(self.pkg_names)) groupid = property(fget=lambda self: self.gid, fset=lambda self, value: setattr(self, "gid", value), fdel=lambda self: setattr(self, "gid", None), doc="Compat. to treat comps groups/igroups the same") class InstalledEnvironment(object): def __init__(self, evgid): self.evgid = evgid self.grp_names = set() def __cmp__(self, other): if other is None: return 1 return cmp(self.evgid, other.evgid) def _additions(self, grp_names): grp_names = set(grp_names) return sorted(grp_names.difference(self.grp_names)) def _removals(self, grp_names): grp_names = set(grp_names) return sorted(grp_names.difference(self.grp_names)) environmentid = property(fget=lambda self: self.evgid, fset=lambda self, value: setattr(self, "evgid", value), fdel=lambda self: setattr(self, "evgid", None), doc="Compat. to treat comps groups/igroups the same") class InstalledGroups(object): def __init__(self, db_path): self.groups = {} self.changed = False self.environments = {} self._read_pkg_grps(db_path) self._read_grp_grps(db_path) def _read_pkg_grps(self, db_path): self.filename = db_path + "/installed" if not os.access(self.filename, os.R_OK): return fo = open(self.filename) try: ver = int(_read_str(fo)) except ValueError: return if ver != 1: return groups_num = int(_read_str(fo)) while groups_num > 0: groups_num -= 1 grp = InstalledGroup(_read_str(fo)) self.groups[grp.gid] = grp num = int(_read_str(fo)) while num > 0: num -= 1 grp.pkg_names.add(_read_str(fo)) def _read_grp_grps(self, db_path): self.grp_filename = db_path + "/environment" if not os.access(self.grp_filename, os.R_OK): return fo = open(self.grp_filename) try: ver = int(_read_str(fo)) except ValueError: return if ver != 1: return groups_num = int(_read_str(fo)) while groups_num > 0: groups_num -= 1 evgrp = InstalledEnvironment(_read_str(fo)) self.environments[evgrp.evgid] = evgrp num = int(_read_str(fo)) while num > 0: num -= 1 grpname = _read_str(fo) memb = _read_str(fo) evgrp.grp_names.add(grpname) assert memb in ('true', 'false') if memb == 'true': assert grpname in self.groups if grpname in self.groups: self.groups[grpname].environment = evgrp.evgid def close(self): pass def save(self, force=False): if not force and not self.changed: return False db_path = os.path.dirname(self.filename) if not os.path.exists(db_path): try: _makedirs_no_umask(db_path) except (IOError, OSError), e: # some sort of useful thing here? A warning? return False if not os.access(db_path, os.W_OK): return False self._write_pkg_grps() self._write_grp_grps() self.changed = False def _write_pkg_grps(self): fo = _open_no_umask(self.filename + '.tmp', 'w') fo.write("1\n") # version fo.write("%u\n" % len(self.groups)) for grp in sorted(self.groups.values()): fo.write("%s\n" % grp.gid) fo.write("%u\n" % len(grp.pkg_names)) for pkgname in sorted(grp.pkg_names): fo.write("%s\n" % pkgname) fo.close() os.rename(self.filename + '.tmp', self.filename) def _write_grp_grps(self): fo = _open_no_umask(self.grp_filename + '.tmp', 'w') fo.write("1\n") # version fo.write("%u\n" % len(self.environments)) for evgrp in sorted(self.environments.values()): fo.write("%s\n" % evgrp.evgid) fo.write("%u\n" % len(evgrp.grp_names)) for grpname in sorted(evgrp.grp_names): fo.write("%s\n" % grpname) if (grpname in self.groups and self.groups[grpname].environment == evgrp.evgid): fo.write("%s\n" % "true") else: fo.write("%s\n" % "false") fo.close() os.rename(self.grp_filename + '.tmp', self.grp_filename) def add_group(self, groupid, pkg_names, ievgrp=None): self.changed = True if groupid not in self.groups: self.groups[groupid] = InstalledGroup(groupid) grp = self.groups[groupid] for pkg_name in pkg_names: grp.pkg_names.add(pkg_name) if ievgrp is not None: grp.environment = ievgrp.evgid ievgrp.grp_names.add(groupid) return grp def del_group(self, groupid): self.changed = True if groupid in self.groups: del self.groups[groupid] def return_groups(self, group_pattern, case_sensitive=False): returns = {} if not group_pattern: return [] for item in group_pattern.split(','): item = item.strip() if item in self.groups: thisgroup = self.groups[item] returns[thisgroup.gid] = thisgroup continue if case_sensitive: match = re.compile(fnmatch.translate(item)).match else: match = re.compile(fnmatch.translate(item), flags=re.I).match done = False for group in self.groups.values(): if match(group.gid): done = True returns[group.gid] = group break return returns.values() def add_environment(self, evgroupid, grp_names): self.changed = True if evgroupid not in self.environments: self.environments[evgroupid] = InstalledEnvironment(evgroupid) grp = self.environments[evgroupid] for grp_name in grp_names: grp.grp_names.add(grp_name) return grp def del_environment(self, evgroupid): self.changed = True if evgroupid in self.environments: del self.environments[evgroupid] def return_environments(self, evgroup_pattern, case_sensitive=False): returns = {} if not evgroup_pattern: return [] for item in evgroup_pattern.split(','): item = item.strip() if item in self.environments: thisgroup = self.environments[item] returns[thisgroup.evgid] = thisgroup continue if case_sensitive: match = re.compile(fnmatch.translate(item)).match else: match = re.compile(fnmatch.translate(item), flags=re.I).match done = False for group in self.environments.values(): if match(group.evgid): done = True returns[group.evgid] = group break return returns.values() PK[!> sys.stderr, msg def filelog(self, package, action): # If the action is not in the fileaction list then dump it as a string # hurky but, sadly, not much else if action in self.fileaction: msg = '%s: %s' % (self.fileaction[action], package) else: msg = '%s: %s' % (package, action) self.logger.info(msg) def verify_txmbr(self, base, txmbr, count): " Callback for post transaction when we are in verifyTransaction(). " pass class SimpleCliCallBack(RPMBaseCallback): def __init__(self): RPMBaseCallback.__init__(self) self.lastmsg = None self.lastpackage = None # name of last package we looked at def event(self, package, action, te_current, te_total, ts_current, ts_total): # this is where a progress bar would be called msg = '%s: %s %s/%s [%s/%s]' % (self.action[action], package, te_current, te_total, ts_current, ts_total) if msg != self.lastmsg: print msg self.lastmsg = msg self.lastpackage = package def scriptout(self, package, msgs): if msgs: print msgs, def verify_txmbr(self, base, txmbr, count): " Callback for post transaction when we are in verifyTransaction(). " print _("Verify: %u/%u: %s") % (count, len(base.tsInfo), txmbr) # This is ugly, but atm. rpm can go insane and run the "cleanup" phase # without the "install" phase if it gets an exception in it's callback. The # following means that we don't really need to know/care about that in the # display callback functions. # Note try/except's in RPMTransaction are for the same reason. class _WrapNoExceptions: def __init__(self, parent): self.__parent = parent def __getattr__(self, name): """ Wraps all access to the parent functions. This is so it'll eat all exceptions because rpm doesn't like exceptions in the callback. """ func = getattr(self.__parent, name) def newFunc(*args, **kwargs): try: func(*args, **kwargs) except Exception, e: # It's impossible to debug stuff without this: try: print "Error:", "display callback failed:", e except: pass newFunc.__name__ = func.__name__ newFunc.__doc__ = func.__doc__ newFunc.__dict__.update(func.__dict__) return newFunc class RPMTransaction: def __init__(self, base, test=False, display=NoOutputCallBack): if not callable(display): self.display = display else: self.display = display() # display callback self.display = _WrapNoExceptions(self.display) self.base = base # base yum object b/c we need so much self.test = test # are we a test? self.trans_running = False self.fd = None self.total_actions = 0 self.total_installed = 0 self.complete_actions = 0 self.installed_pkg_names = set() self.total_removed = 0 self.logger = logging.getLogger('yum.filelogging.RPMInstallCallback') self.filelog = False self._setupOutputLogging(base.conf.rpmverbosity) if not os.path.exists(self.base.conf.persistdir): os.makedirs(self.base.conf.persistdir) # make the dir, just in case # Error checking? -- these should probably be where else def _fdSetNonblock(self, fd): """ Set the Non-blocking flag for a filedescriptor. """ flag = os.O_NONBLOCK current_flags = fcntl.fcntl(fd, fcntl.F_GETFL) if current_flags & flag: return fcntl.fcntl(fd, fcntl.F_SETFL, current_flags | flag) def _fdSetCloseOnExec(self, fd): """ Set the close on exec. flag for a filedescriptor. """ flag = fcntl.FD_CLOEXEC current_flags = fcntl.fcntl(fd, fcntl.F_GETFD) if current_flags & flag: return fcntl.fcntl(fd, fcntl.F_SETFD, current_flags | flag) def _setupOutputLogging(self, rpmverbosity="info"): # UGLY... set up the transaction to record output from scriptlets io_r = tempfile.NamedTemporaryFile() self._readpipe = io_r self._writepipe = open(io_r.name, 'w+b') self.base.ts.setScriptFd(self._writepipe) rpmverbosity = {'critical' : 'crit', 'emergency' : 'emerg', 'error' : 'err', 'information' : 'info', 'warn' : 'warning'}.get(rpmverbosity, rpmverbosity) rpmverbosity = 'RPMLOG_' + rpmverbosity.upper() if not hasattr(rpm, rpmverbosity): rpmverbosity = 'RPMLOG_INFO' rpm.setVerbosity(getattr(rpm, rpmverbosity)) rpm.setLogFile(self._writepipe) def _shutdownOutputLogging(self): # reset rpm bits from reording output rpm.setVerbosity(rpm.RPMLOG_NOTICE) rpm.setLogFile(sys.stderr) try: self._writepipe.close() except: pass def _scriptOutput(self): try: out = self._readpipe.read() if not out: return None return out except IOError: pass def _scriptout(self, data): msgs = self._scriptOutput() self.display.scriptout(data, msgs) self.base.history.log_scriptlet_output(data, msgs) def __del__(self): self._shutdownOutputLogging() def _dopkgtup(self, hdr): tmpepoch = hdr['epoch'] if tmpepoch is None: epoch = '0' else: epoch = str(tmpepoch) return (hdr['name'], hdr['arch'], epoch, hdr['version'], hdr['release']) # Find out txmbr based on the callback key. On erasures we dont know # the exact txmbr but we always have a name, so return (name, txmbr) # tuples so callers have less twists to deal with. def _getTxmbr(self, cbkey, erase=False): if isinstance(cbkey, TransactionMember): return (cbkey.name, cbkey) elif isinstance(cbkey, tuple): pkgtup = self._dopkgtup(cbkey[0]) txmbrs = self.base.tsInfo.getMembers(pkgtup=pkgtup) # if this is not one, somebody screwed up assert len(txmbrs) == 1 return (txmbrs[0].name, txmbrs[0]) elif isinstance(cbkey, basestring): ret = None # If we don't have a tuple, it's because this is an erase txmbr and # rpm doesn't provide one in that case. So we can "cheat" and look # through all our txmbrs for the name we have, and if we find a # single match ... that must be it. if not erase: return (cbkey, None) for txmbr in self.base.tsInfo.matchNaevr(name=cbkey): if txmbr.output_state not in TS_REMOVE_STATES: continue # If we have more than one match, then we don't know which one # it is ... so just give up. if ret is not None: return (cbkey, None) ret = txmbr return (cbkey, ret) else: return (None, None) def _fn_rm_installroot(self, filename): """ Remove the installroot from the filename. """ # to handle us being inside a chroot at this point # we hand back the right path to those 'outside' of the chroot() calls # but we're using the right path inside. if self.base.conf.installroot == '/': return filename return filename.replace(os.path.normpath(self.base.conf.installroot),'') def ts_done_open(self): """ Open the transaction done file, must be started outside the chroot. """ if self.test: return False if hasattr(self, '_ts_done'): return True self.ts_done_fn = '%s/transaction-done.%s' % (self.base.conf.persistdir, self._ts_time) ts_done_fn = self._fn_rm_installroot(self.ts_done_fn) try: self._ts_done = open(ts_done_fn, 'w') except (IOError, OSError), e: self.display.errorlog('could not open ts_done file: %s' % e) self._ts_done = None return False self._fdSetCloseOnExec(self._ts_done.fileno()) return True def ts_done_write(self, msg): """ Write some data to the transaction done file. """ if self._ts_done is None: return try: self._ts_done.write(msg) self._ts_done.flush() except (IOError, OSError), e: # Having incomplete transactions is probably worse than having # nothing. self.display.errorlog('could not write to ts_done file: %s' % e) self._ts_done = None misc.unlink_f(self.ts_done_fn) def ts_done(self, package, action): """writes out the portions of the transaction which have completed""" if not self.ts_done_open(): return # walk back through self._te_tuples # make sure the package and the action make some kind of sense # write it out and pop(0) from the list # make sure we have a list to work from if len(self._te_tuples) == 0: # if we don't then this is pretrans or postrans or a trigger # either way we have to respond correctly so just return and don't # emit anything return (t,e,n,v,r,a) = self._te_tuples[0] # what we should be on # make sure we're in the right action state msg = 'ts_done state is %s %s should be %s %s' % (package, action, t, n) if action in TS_REMOVE_STATES: if t != 'erase': self.display.filelog(package, msg) if action in TS_INSTALL_STATES: if t != 'install': self.display.filelog(package, msg) # check the pkg name out to make sure it matches if type(package) in types.StringTypes: name = package else: name = package.name if n != name: msg = 'ts_done name in te is %s should be %s' % (n, package) self.display.filelog(package, msg) # hope springs eternal that this isn't wrong msg = '%s %s:%s-%s-%s.%s\n' % (t,e,n,v,r,a) self.ts_done_write(msg) self._te_tuples.pop(0) def ts_all(self): """write out what our transaction will do""" # save the transaction elements into a list so we can run across them if not hasattr(self, '_te_tuples'): self._te_tuples = [] for te in self.base.ts: n = te.N() a = te.A() v = te.V() r = te.R() e = te.E() if e is None: e = '0' if te.Type() == 1: t = 'install' elif te.Type() == 2: t = 'erase' else: t = te.Type() # save this in a list self._te_tuples.append((t,e,n,v,r,a)) # write to a file self._ts_time = time.strftime('%Y-%m-%d.%H:%M.%S') tsfn = '%s/transaction-all.%s' % (self.base.conf.persistdir, self._ts_time) self.ts_all_fn = tsfn tsfn = self._fn_rm_installroot(tsfn) try: if not os.path.exists(os.path.dirname(tsfn)): os.makedirs(os.path.dirname(tsfn)) # make the dir, fo = open(tsfn, 'w') except (IOError, OSError), e: self.display.errorlog('could not open ts_all file: %s' % e) self._ts_done = None return try: for (t,e,n,v,r,a) in self._te_tuples: msg = "%s %s:%s-%s-%s.%s\n" % (t,e,n,v,r,a) fo.write(msg) fo.flush() fo.close() except (IOError, OSError), e: # Having incomplete transactions is probably worse than having # nothing. self.display.errorlog('could not write to ts_all file: %s' % e) misc.unlink_f(tsfn) self._ts_done = None def callback( self, what, bytes, total, h, user ): if what == rpm.RPMCALLBACK_TRANS_START: self._transStart( bytes, total, h ) elif what == rpm.RPMCALLBACK_TRANS_PROGRESS: self._transProgress( bytes, total, h ) elif what == rpm.RPMCALLBACK_TRANS_STOP: self._transStop( bytes, total, h ) elif what == rpm.RPMCALLBACK_INST_OPEN_FILE: return self._instOpenFile( bytes, total, h ) elif what == rpm.RPMCALLBACK_INST_CLOSE_FILE: self._instCloseFile( bytes, total, h ) elif what == rpm.RPMCALLBACK_INST_PROGRESS: self._instProgress( bytes, total, h ) elif what == rpm.RPMCALLBACK_UNINST_START: self._unInstStart( bytes, total, h ) elif what == rpm.RPMCALLBACK_UNINST_PROGRESS: self._unInstProgress( bytes, total, h ) elif what == rpm.RPMCALLBACK_UNINST_STOP: self._unInstStop( bytes, total, h ) elif what == rpm.RPMCALLBACK_REPACKAGE_START: self._rePackageStart( bytes, total, h ) elif what == rpm.RPMCALLBACK_REPACKAGE_STOP: self._rePackageStop( bytes, total, h ) elif what == rpm.RPMCALLBACK_REPACKAGE_PROGRESS: self._rePackageProgress( bytes, total, h ) elif what == rpm.RPMCALLBACK_CPIO_ERROR: self._cpioError(bytes, total, h) elif what == rpm.RPMCALLBACK_UNPACK_ERROR: self._unpackError(bytes, total, h) # SCRIPT_ERROR is only in rpm >= 4.6.0 elif hasattr(rpm, "RPMCALLBACK_SCRIPT_ERROR") and what == rpm.RPMCALLBACK_SCRIPT_ERROR: self._scriptError(bytes, total, h) # SCRIPT_START and SCRIPT_STOP are only in rpm >= 4.10 elif hasattr(rpm, "RPMCALLBACK_SCRIPT_START") and what == rpm.RPMCALLBACK_SCRIPT_START: self._scriptStart(bytes, total, h); elif hasattr(rpm, "RPMCALLBACK_SCRIPT_STOP") and what == rpm.RPMCALLBACK_SCRIPT_STOP: self._scriptStop(bytes, total, h); def _transStart(self, bytes, total, h): self.total_actions = total if self.test: return self.trans_running = True self.ts_all() # write out what transaction will do self.ts_done_open() def _transProgress(self, bytes, total, h): pass def _transStop(self, bytes, total, h): pass def _instOpenFile(self, bytes, total, h): self.lastmsg = None name, txmbr = self._getTxmbr(h) if txmbr is not None: rpmloc = txmbr.po.localPkg() try: self.fd = file(rpmloc) except IOError, e: self.display.errorlog("Error: Cannot open file %s: %s" % (rpmloc, e)) else: if self.trans_running: self.total_installed += 1 self.complete_actions += 1 self.installed_pkg_names.add(name) return self.fd.fileno() else: self.display.errorlog("Error: No Header to INST_OPEN_FILE") def _instCloseFile(self, bytes, total, h): name, txmbr = self._getTxmbr(h) if txmbr is not None: self.fd.close() self.fd = None if self.test: return if self.trans_running: self.display.filelog(txmbr.po, txmbr.output_state) self._scriptout(txmbr.po) pid = self.base.history.pkg2pid(txmbr.po) state = self.base.history.txmbr2state(txmbr) self.base.history.trans_data_pid_end(pid, state) self.ts_done(txmbr.po, txmbr.output_state) def _instProgress(self, bytes, total, h): name, txmbr = self._getTxmbr(h) if name is not None: # If we only have a name, we're repackaging. # Why the RPMCALLBACK_REPACKAGE_PROGRESS flag isn't set, I have no idea if txmbr is None: self.display.event(name, 'repackaging', bytes, total, self.complete_actions, self.total_actions) else: action = txmbr.output_state self.display.event(txmbr.po, action, bytes, total, self.complete_actions, self.total_actions) def _unInstStart(self, bytes, total, h): pass def _unInstProgress(self, bytes, total, h): pass def _unInstStop(self, bytes, total, h): name, txmbr = self._getTxmbr(h, erase=True) self.total_removed += 1 self.complete_actions += 1 if name not in self.installed_pkg_names: if txmbr is not None: self.display.filelog(txmbr.po, TS_ERASE) else: self.display.filelog(name, TS_ERASE) action = TS_ERASE else: action = TS_UPDATED # FIXME: Do we want to pass txmbr.po here too? self.display.event(name, action, 100, 100, self.complete_actions, self.total_actions) if self.test: return # and we're done if txmbr is not None: self._scriptout(txmbr.po) # Note that we are currently inside the chroot, which makes # sqlite panic when it tries to open it's journal file. # So let's have some "fun" and workaround that: _do_chroot = False if _do_chroot and self.base.conf.installroot != '/': os.chroot(".") pid = self.base.history.pkg2pid(txmbr.po) state = self.base.history.txmbr2state(txmbr) self.base.history.trans_data_pid_end(pid, state) if _do_chroot and self.base.conf.installroot != '/': os.chroot(self.base.conf.installroot) self.ts_done(txmbr.po, txmbr.output_state) else: self._scriptout(name) self.ts_done(name, action) def _rePackageStart(self, bytes, total, h): pass def _rePackageStop(self, bytes, total, h): pass def _rePackageProgress(self, bytes, total, h): pass def _cpioError(self, bytes, total, h): name, txmbr = self._getTxmbr(h) # In the case of a remove, we only have a name, not a txmbr if txmbr is not None: msg = "Error in cpio payload of rpm package %s" % txmbr.po txmbr.output_state = TS_FAILED self.display.errorlog(msg) # FIXME - what else should we do here? raise a failure and abort? def _unpackError(self, bytes, total, h): name, txmbr = self._getTxmbr(h) # In the case of a remove, we only have a name, not a txmbr if txmbr is not None: txmbr.output_state = TS_FAILED msg = "Error unpacking rpm package %s" % txmbr.po self.display.errorlog(msg) # FIXME - should we raise? I need a test case pkg to see what the # right behavior should be def _scriptError(self, bytes, total, h): # "bytes" carries the failed scriptlet tag, # "total" carries fatal/non-fatal status scriptlet_name = rpm.tagnames.get(bytes, "") name, txmbr = self._getTxmbr(h, erase=True) if txmbr is None: package_name = name else: package_name = txmbr.po if total: msg = ("Error in %s scriptlet in rpm package %s" % (scriptlet_name, package_name)) # In the case of a remove, we only have a name, not a txmbr if txmbr is not None: txmbr.output_state = TS_FAILED else: msg = ("Non-fatal %s scriptlet failure in rpm package %s" % (scriptlet_name, package_name)) self.display.errorlog(msg) self._scriptout(package_name) # FIXME - what else should we do here? raise a failure and abort? def _scriptStart(self, bytes, total, h): pass def _scriptStop(self, bytes, total, h): name, txmbr = self._getTxmbr(h) self._scriptout(txmbr or name) def verify_txmbr(self, txmbr, count): " Callback for post transaction when we are in verifyTransaction(). " if not hasattr(self.display, 'verify_txmbr'): return self.display.verify_txmbr(self.base, txmbr, count) PK[&site-packages/yum/parser.pycnu[ v_c@skddlZddlZddlZddlZddlZejdZdZdddYZ dS(iNs\$(\w+)cCs|s |Sg}x|rtj|}|s?|j|Pn|jdj}|j||j}|j\}}|j|| |j|||}qWdj|S(sPerform variable replacement @param raw: String to perform substitution on. @param vars: Dictionary of variables to replace. Key is variable name (without $ prefix). Value is replacement string. @return: Input raw string with substituted values. it(t_KEYCREtsearchtappendtgrouptlowertgettspantjoin(trawtvarstdonetmtvarnamet replacementtstarttend((s./usr/lib/python2.7/site-packages/yum/parser.pyt varReplace s    tConfigPreProcessorcBsSeZdZd dZddZdZdZdZdZ dZ RS( s ConfigParser Include Pre-Processor File-like Object capable of pre-processing include= lines for a ConfigParser. The readline function expands lines matching include=(url) into lines from the url specified. Includes may occur in included files as well. Suggested Usage:: cfg = ConfigParser.ConfigParser() fileobj = confpp( fileorurl ) cfg.readfp(fileobj) cCs||_d|_d|_tj|d}|dkr|ddkr{ytjd}Wn d}nX||}nd|}n|}g|_g|_|j |}|dkrt j d|ndS(NtriRt/sfile://sError accessing file: %s( t_varstNonet_sectiontmodeturlparsetostgetcwdt _incstackt_alreadyincludedt _pushfiletErrorst ConfigError(tselft configfileR tschemetrootdirturltfo((s./usr/lib/python2.7/site-packages/yum/parser.pyt__init__=s$          icCs2d}xt|jdkr|jd}|j}t|dkrtjd|}|r|jd}t|dkrtjd|jqt ||j }|j |}qtjd|}|r|jd|_ nPq |j q Wtjd |}|r"|j}nt ||j S( s Implementation of File-Like Object readline function. This should be the only function called by ConfigParser according to the python docs. We maintain a stack of real FLOs and delegate readline calls to the FLO on top of the stack. When EOF occurs on the topmost FLO, it is popped off the stack and the next FLO takes over. include= lines found anywhere cause a new FLO to be opened and pushed onto the top of the stack. Finally, we return EOF when the bottom-most (configfile arg to __init__) FLO returns EOF. Very Technical Pseudo Code:: def confpp.readline() [this is called by ConfigParser] open configfile, push on stack while stack has some stuff on it line = readline from file on top of stack pop and continue if line is EOF if line starts with 'include=' then error if file is recursive or duplicate otherwise open file, push on stack continue else return line return EOF Riis\s*include\s*=\s*(?P.*)R%s>Error parsing config %s: include must specify file to include.s\s*\[(?P
.*)\]tsections\s+\[(?P
.*)\](tlenRtreadlinetretmatchRRR tnameRRRRt_popfiletlstrip(R!tsizetlineR&R R%tsecmatchtbroken_sec_match((s./usr/lib/python2.7/site-packages/yum/parser.pyR*as,  cCs3t|jdkr|Stj|j|SdS(s Returns an absolute url for the (possibly) relative url specified. The base url used to resolve the missing bits of url is the url of the file currently being included (i.e. the top of the stack). iN(R)RRturljointgeturl(R!R%((s./usr/lib/python2.7/site-packages/yum/parser.pyt_absurlscCs|j|}||jf}|j|r1dSytjj|}Wntjjk rh}d}nX|dk r||_|j j ||j j |nt j d||S(s Opens the url specified, pushes it on the stack, and returns a file like object. Returns None if the url has previously been included. If the file can not be opened this function exits. s"Error accessing file for config %sN(R6Rt_isalreadyincludedRt urlgrabbertgrabberturlopent URLGrabErrorR-RRRRR (R!R%tabsurlt includetupleR&te((s./usr/lib/python2.7/site-packages/yum/parser.pyRs     cCsT|jj}|jt|jdkrG|jdj|_n d|_dS(sW Pop a file off the stack signaling completion of including that file. iiN(RtpoptcloseR)R5R-R(R!R&((s./usr/lib/python2.7/site-packages/yum/parser.pyR.s  cCs(x!|jD]}||kr dSq WdS(s Checks if the tuple describes an include that was already done. This does not necessarily have to be recursive ii(R(R!ttupletetuple((s./usr/lib/python2.7/site-packages/yum/parser.pyR7s cCs|jS(N(R-(R!((s./usr/lib/python2.7/site-packages/yum/parser.pyR5sN( t__name__t __module__t__doc__RR'R*R6RR.R7R5(((s./usr/lib/python2.7/site-packages/yum/parser.pyR+s $ C  ! (( R+RR8tos.pathRRtcompileRRR(((s./usr/lib/python2.7/site-packages/yum/parser.pyts      PK[ۗpOOsite-packages/yum/yumRepo.pycnu[ v_c@sddlZddlZddlZddlZddlZejjdddlZddlZddl m Z ddl m Z ddl m Z ddlZddl mZddlZddlZddlmZddlZddlZddlZddlmZdd lmZdd lmZdd lmZdd lTddlZddlZddl Z ddl!Z!ddl"Z"ddl#Z#ddl$Z$ddl%Z%ddl&Z&e'Z(y9ddl)Z)e*e)d  pe*e)d re+Z)nWne,k r e+Z)nXdZ-dZ.e!j/dej0ej1dZ2ej1dZ3dej4fdYZ5deej6fdYZ7e+dZ8dfdYZ9dS(iNtmedia(t URLGrabber(tdefault_grabber(t format_number(t URLGrabError(t Repository(tconfig(tmisc(tcomps(t_(t*tgettsetcCs3ts dSytj|d|}WndSX|S(Nsuser.yum.checksum.(txattrtNoneR (tfilenametchktypetret((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_xattr_get_chksumQscCs4ts dSytj|d||WntSXtS(Nsuser.yum.checksum.(R RR tFalsetTrue(RRtchksum((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_xattr_set_chksum\stignores yum.Repossyum.verbose.RepostYumPackageSackcBsteZdZdZdZdZd dZdZdd ddZ d Z d Z d Z d Z RS(s;imports/handles package objects from an mdcache dict objectcCs&tjj|||_i|_dS(N(t packageSackt PackageSackt__init__tpctadded(tselft packageClass((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRos cCsTy|jWn?tjk rO}tjdt|t||jfnXdS(NsException %s %s in %s ignored(tclosetErrorst RepoErrortverbose_loggertdebugtreprtstrt__del__(Rte((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyR'tscCs i|_dS(N(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyR zsc Cs||jkr)||j|kr)dSnt|}|dkrd}x||D]t}|d7}|rz|j|||n||}|j||} || _|j|j|| |j| qNW||jkrg|j|sN(t__name__t __module__t__doc__RR'R RR?RKRsRFR]R{RE(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRms    , T  t YumRepositoryc Bs eZdZdZdZdZeeZdZeeZ dZ dZ dZ ee Z dZd Zd Zd ZdyedzdZdZdZdZdZdZedZdZdZedZdZdZ edZ!edZ"dZ#dZ$dZ%dZ&ed Z'ed!Z(ed"d#Z)ed$d%Z*ed&d'Z+ed(d)Z,ed*Z-d+Z.d,Z/d-Z0d.Z1d/Z2ed0d1d2d3d4d5Z3d6Z4ed0d7d2d8d4d9Z5d:Z6dzdzdzdzdzdzdzdzd;edzd< Z7e7Z8dzdzed=Z9dzd;ed>Z:d?Z;d@Z<dAZ=edBZ>dCZ?dzdzdzdzdDZ@dEZAdzdzdFZBdzdGZCdHZDdIZEdJZFdzdKZGedLZHdMZIeJdNZKdzdzdOZLdPZMdzdQZNdzdRZOedSZPdzdTZQdUZRdVZSdzdzdWZTdXZUdzdYZVdZZWed0d[d2d\d4d]ZXd^ZYd_ZZed`Z[edzedaZ\dbZ]edcZ^ddZ_deZ`dfZadgZbdzdhZcdiZddjZedkZfdzdlZgdmZhdnZidodzdpZjdqZkdrZldsZmdtZnduZodvdwgdxZpRS({so This is an actual repository object Configuration attributes are pulled in from config.RepoConf. cCstjj|tj||d|_g|_g|_d|_d|_ d|_ d|_ i|_ d|_ t|_d|_i|_i|_d|_d|_d|_t|_i|_d|_d|_d|_d|_d|_idd6dd6dd 6dd 6dd 6dd 6|_t|_d|_d|_ d|_!d|_"d|_#t|_$d|_%d|_&d|_'d|_(t)|_*d|_+d|_,d|_-t|_.dS( Nis yumgroups.xmlsrepodata/repomd.xmlt cachecookietiRPR*RQtgroupt updateinfot prestodelta(/RtRepoConfRRRtrepofilet mirrorurlst_urlst enablegroupstgroupsfilenamet repoMDFilet_repoXMLt_oldRepoMDDataRbRt_retry_no_cachetmirrorlistparsedtyumvart _proxy_dicttmetadata_cookie_fnt_metadataCurrentt _metalinkt groups_addedt http_headerstrepo_config_aget basecachedirtbase_persistdirtcostt copy_localt retrievedt_preloaded_repomdR9tmulti_callbackt failure_objtmirror_failure_objtinterrupt_callbackt_callbacks_changedt mediafunctgpg_import_functgpgca_import_funct confirm_funcRttimestamp_checkt_sackt _grabfunct_grabt_async(RRO((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRHsV                                      cCs`|dkrdSt|dr+|j}nd}t|j|}|rM|St|j|jS(s@ Sort yum repos. by cost, and then by alphanumeric on their id. iRiN(RRSRtcmpR.(RRQtocostR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt__cmp__s  cCs.|jdkr'tjtj|_n|jS(N(RRt sqlitesacktYumSqlitePackageSacktYumAvailablePackageSqlite(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_getSackscCst|drt|dStj|}|s:d}ng|\}}||}d|kri|d}n8d|kr|d}nd|kr|d}nd}|j}xE|jD]:}d||kr|d7}|t|j|7}qqWt|d||S(s@ Show self.id, but include any $releasever/$basearch/etc. data. t__cached_ui_idRtmetalinkt mirrorlisttbaseurlt$Rt( RStgetattrRt_readRawRepoFileR.tui_repoid_varsR&Rtsetattr(Rtvaltinit section_idRtvar((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_ui_ids*            cCs0|jdk r|jjntj|dS(N(RRtsackR R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyR scCs d|_dS(N(RR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _resetSackscCs|j|jr|jSdS(N(t doProxyDictRR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt__getProxyDicts  cCs|jS(s7Returns the instance of this repository's package sack.(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytgetPackageSackscCs t|dr|jdk StS(s;Returns true if this repository is setup and ready for use.tmetadata_cookieN(RSRcRR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytreadys cCsCd|jjkr*|jjd}n|jjd}|jS(s"Returns the location of the group.tgroup_gzR(Rct fileTypesRdRv(Rtthisdata((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytgetGroupLocationscCs|jS(N(R.(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt__str__siicCsytj||||SWn`tjtfk r|}|r?dSd|}t|tjrjt|}ntj |nXdS(stakes filename, hand back Checksum of it sumtype = md5 or sha filename = /path/to/file CHUNK=65536 by defaults#Error opening file for checksum: %sN( RReR!t MiscErrortEnvironmentErrorRt isinstancetFIPSNonCompliantErrorR&R"(RtsumtypetfiletCHUNKtchecksum_can_failtdatasizeR(tmsg((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _checksums c!Csd|j}d(}xt|D]}|jd#r;q n||krMq ntt||tjrnq nt||}| rt|tttd$fkrd%}nt|tj krd&j |}n|d'||f}q W|S()Ns[%s] RRt metalink_datatgrabtgrabfuncRctcfgRRRRRR9RRRR.RRRRRRRRtquick_enable_disableRRturlsRRRRR iRs, s%s = %s (!s mediafuncssacks metalink_datasgrabsgrabfuncsrepoXMLRs retrievedsmirrorlistparsedsgpg_import_funcsgpgca_import_funcs failure_objscallbacks confirm_funcs groups_addedsinterrupt_callbacksidsmirror_failure_objsrepo_config_agesgroupsfilenames copy_locals basecachedirs http_headerssmetadata_cookiesmetadata_cookie_fnRs repoMDFilestimestamp_checksurlss mirrorurlssyumvarsrepofilesmulti_callback( R.tdirt startswithRRttypest MethodTypettypeRtListTypetjoin(Rtoutputt excluded_varstattrtres((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytdumps4  + cCso|jytj|ddgWnDtk rj}|jtjkrXtj|qktt|nXdS(s%Persistently enables this repository.tonlytenabledN( tenableRtwriteRawRepoFiletIOErrorterrnotEACCEStloggertwarningR&(RR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytenablePersistents cCso|jytj|ddgWnDtk rj}|jtjkrXtj|qktt|nXdS(s&Persistently disables this repository.RRN( tdisableRRRRRRRR&(RR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytdisablePersistent"s cCs9t|jdkr5|j r5tjd|jndS(shself-check the repo information - if we don't have enough to move on then raise a repo erroris(Cannot find a valid baseurl for repo: %sN(R,RtmediaidR!R"R4(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytcheck-scCs|jr dSi|_d}d }|j|kr:d}n|jrd|j}|j|krtj|j}|j|kr|dtj|j7}ntjd|j \}}d|||f}qn|dk r ||jd<||jd<||jd scCs |jS(N(Rg(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs{tjj|r(tjj|r(dSytj|ddWn5tk rv}dd|d|f}tj|nXdS(s@make the necessary directory path, if possible, raise on failureNtmodeis %s: %s %s: %ssError making cache directorys error was(RwRxRtisdirtmakedirstOSErrorR!R"(RtdpathR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_dirSetupMkdir_ps$c Cstjj|j|j}tjj|j|j}tjj|d}tjj|d}|jd||jd||jd||jd|d}tjdkrd }n|jd |d ||jd |d ||jd|j }|jd|x1|j|jd|j gD]}|j |q2Wx>|j gD]0}y|j |WqVt jk r}qVXqVW|jdrt|_n|jd|jd|jddS(s6make the necessary dirs, if possible, raise on failuretpackagesRt_dir_setup_cachedirt_dir_setup_pkgdirt_dir_setup_hdrdirt_dir_setup_persistdirRis-rot_dir_setup_gpgdirs/gpgdirt_dir_setup_gpgcadirs /gpgcadirRtt_dir_setup_metadata_cookies/gens repomd.xmlRsmirrorlist.txts metalink.xmlN(RwRxRRR.Rt setAttributetgeteuidRVRtpkgdirRnt persistdirR!R"t_preload_md_from_system_cacheRR( RRVRzRythdrdirtexttcookieRR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytdirSetups6 #   cCs3d|}t||s&|jnt||S(s; Make the directory attributes call .dirSetup() if needed. t _dir_setup_(RSRR(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _dirGetAttrs  cCsd|}t||s&|jn|dkrit|dsMg|_n|jjt||nt|||}|dkr|j|n|S(s; Make the directory attributes call .dirSetup() if needed. RRqt _old_pkgdirs(s_dir_setup_pkgdir(RSRRR2RRRn(RRRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _dirSetAttrs     cCs |jdS(NRV(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRh scCs |jdS(NRz(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRh scCs |jdS(NRy(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRh scCs|jd|S(NRy(R(Rtx((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRh scCs |jdS(NR|(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs|jd|S(NR|(R(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs |jdS(Ntgpgdir(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs|jd|S(NR(R(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs |jdS(Ntgpgcadir(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs|jd|S(NR(R(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs |jdS(NR(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCs'tjdtjdd|jdS(Ns8baseurlSetup() will go away in a future version of Yum. Ri(RRR!Rt _baseurlSetup(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt baseurlSetups cCsF|jr dS|jsdS|jjddkr6dS|j|_dS(NRi(RRtfind(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_hack_mirrorlist_for_anacondas  c Cs|j|j|_|j|_g}|j|jrl|j rl|jt|jj t |_n|j r|j r|j|j t |_n|j||_ |j|j |_t|jdkrlt|drltjj|jrl|jsiytj|jWn3ttfk rN}tjd|j|fqfXtjd|jqiqln|j|_|jdS(sgo through the baseurls and mirrorlists and populate self.urls with valid ones, run self.check() at the end to make sure it workeditmirrorlist_files-Could not delete bad mirrorlist file: %s - %ss-removing mirrorlist with no valid mirrors: %sN(t_replace_and_check_urlRt _orig_baseurlRRRtextendtlistRRRRt_getMirrorListRRR,RSRwRxRRRbRR^RRlRterrorRR(RRR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyR*s,    $  c Cs g}d}x|D]}|d kr+qntj||j}|ddkr]|d}ny%tj|\}}}}} } Wn"tttfk r} d}nX|d kr|}qq|j|qW|dk r|rt j d t j |qt j d t j |n|S( NRiRttblahRRRRsMYumRepo Warning: Some mirror URLs are not using ftp, http[s] or file. Eg. %ssJYumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. %s(RN(shttpsftpsfileshttps(Rtparsert varReplaceRR+t ValueErrort IndexErrortKeyErrorR2RRRR0R( Rturl_listtgoodurlstskippedR1tstbtptqtftoR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRNs*   %   cCs|js|jn|jS(N(RR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_geturlsls  tfgetcCs |jS(N(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhqstfsetcCst|d|S(NR(R(Rtvalue((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhrstfdelcCst|ddS(NR(RR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhsscCs|js|jdd|_|jd}|jstj|j}|jd|jdk}y8t d|j |}|j ||dd|j }Wqt k r}tjj|jsd |j }tj|ntjd ||jd tj|jd ft|_qXn|jsy)tj||_tj||jWqtjk r}tjd ||ft|_tj|qXn|jrtj|j|_qn|jS(NRts metalink.xmls.tmpRbRLR ttexts %s/metalinksQCannot retrieve metalink for repository: %s. Please verify its path and try agains*Could not get metalink %s error was %s: %siis)Could not parse metalink %s error was %s(RRVtmetalink_filenamet_metalinkCurrentRR0RRHt http_cachingRR9turlgrabR4RRwRxRR!R"RRtargst to_unicodeRRtMetaLinkRepoMDtshutiltmovetMetaLinkRepoErrorParseFailR^(RtlocalR1RKtugRR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _getMetalinkus6   # 1   cCs |jS(N(R(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCst|d|S(NR(R(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhs cCst|ddS(NR(RR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRhscCsZ|r"|jdp!|jdS|js/tSx$|jD]}|j|s9tSq9WtS(NRtsfile:(RRRt_all_urls_are_filesR(RR1((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRs R$c Ks|dkr|j}n|dks0|dkrFtjd|jn|jdkrtjj|rk|Stjd||jfn|rt j |\} }}}}n|j r|j rd}|r| dkr|rt |}qny\|j d|d|d|d|d |d |d |j d |jd |d||f }|SWqtjk r~}tjtjd|fqXn| r|s|j| rtjtjj|}|j|j}|t| krtjtdtjj|t|tt| fqn|r,| dkr,|jd| }td|jd |d| d|jd|j d|d| d|j!|}|d|}y:|j"t#j$||dt#j$|d||f}Wqt%k r(}|j&|| d|||f}tj|}||_'|qXnt(|j)d| }yg|j*j"t#j$||dt#j$|d||fd |d| d|d|d| d|j!| }Wnit%k r}|j&|| d|||f}t+|dd}tj,||}||_'|nX|S(sretrieve file from the mirrorgroup for the repo relative to local, optionally get range from start to end, also optionally retrieve from a specific baseurls/get request for Repo %s, gave no source or destis0Caching enabled but no local cache of %s from %sRRt checkfunctrelativeRRR1Rtnametdiscnumtranges8Error getting package from media; falling back to url %ssKInsufficient space in download directory %s * free %s * needed %sRbR R#R"Rtsizetretry_no_cacheRts*failed to retrieve %s from %s error was %sRsfailure: %s from %s: %sterrorsN(-RRR!R"R4RbRwRxRR+R,RRtintRt MediaErrorR#tlogt logginglevelstDEBUG_2Rtstatvfstdirnametf_bavailtf_bsizetlongR RRHRR9RRRRRR0Rt _del_dl_fileR6R^R_RRtNoMoreMirrorsRepoError(RR1RRtstarttendRRRR#RbRR*tschemeR-RxtquerytfragidRRR(tdirstattavailRKRR~terrstrRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_getFiles  !T! 4         c  sj}jj}|jrMjr=Stjn|dkrnfd}n|jdk|_ z@|j d|d|dd|d|d|d j |}Wdt |_ X|j d  rj rd } | jjf} tj| n|S( Ncs5js1tjtdtdndS(Nis)Package does not match intended download.(tverifyLocalPkgRR^RR (R=(Rtpackage(s//usr/lib/python2.7/site-packages/yum/yumRepo.pyR"s  s lazy:packagesR1RRRRRbRRCs3Downloaded package %s, from %s, but it was invalid.(t relativepathtlocalPkgtbasepatht_preload_pkg_from_system_cacheRRR^RRRRRRR R6R.R!R"( RRRRRbR*R~RRR((RRs//usr/lib/python2.7/site-packages/yum/yumRepo.pyt getPackages2       c Cs|j}|j}|j}|j}||} |j} tjj|jsbtj |jn|j d| d|d|d|ddd|d|dd d |d | S( NR1RRRR#RRRiRbR( RtlocalHdrthdrstartthdrendRRwRxRR|RkRR( RRRR#RbR~RRRRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt getHeader@s      !cCs|jdk r|jS|j|j|j}|s8|S|jdd}tjj|s_t S|j |jdd}|j rtjj| rt St |_t S(sCheck if there is a metadata_cookie and check its age. If the age of the cookie is less than metadata_expire time then return true else return False. This result is cached, so that metalink/repomd.xml are synchronized.Rts repomd.xmls metalink.xmlN( RRtwithinCacheAgeRtmetadata_expireRVRwRxRRRRR(RtmC_deftrepomdfntmlfn((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytmetadataCurrentRs  cCs|jdk r|jS|jrHtjj|j rHtjd|n|jr]t |_nNtjj|js~t |_n-|j |j |j rt |_n t |_|jS(Ns$Cannot find metalink.xml file for %s(RRRbRwRxRRR!R"RRRRR(R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRos     cCst|dr|jjdr|jjdr|jtd}|jtd}|dkr{|dkswttS|dkr|dkrtSn|dkr|dkrtSqntS(s8Return whether cache_req matches metadata_expire_filter.t_metadata_cache_reqs read-only:tfuturetpasttpresent(RRR(RR(RSRRtmetadata_expire_filterR,tAssertionErrorRR(Rt cache_filtt cache_req((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_matchExpireFilters      cCs|r|jrd}n|dkr=tjj|r=tSt}tjj|rtj|}|d|tjkrt}n|dtjkrt}n|js|S|dt |j krt}qn|S(sxcheck if any file is older than a certain amount of time. Used for the cachecookie and the mirrorlist return True if w/i the expiration time limit false if the time limit has expired Additionally compare the file to age of the newest .repo or yum.conf file. If any of them are newer then invalidate the cache ii( RRwRxRRRtstatttimetcheck_config_file_ageRR(Rtmyfiletexpiration_timetexpire_req_filterRt cookie_info((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRs      cCse|j}tjj|js*|j}ntj|tjrat|jd}|j~ndS(s/if possible, set touch the metadata_cookie filesw+N( RRwRxRRVtaccesstW_OKtopenR (RRtfo((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytsetMetadataCookies   cCsy1||_||_||_||_||_Wntjk rL}nX|j r|jr|j r|j rt j t j dt|_t|_ndS(Ns1Disabling media repo for non-media-aware frontend(RbRRRRR!R"RRRR#RRRRRRtskip_if_unavailable(RRbRRRRR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytsetups     ' cCsO|jr2tjj| r2tjd|jn|jsG|jrKtSt S(s( Should we cache the current repomd.xml s"Cannot find repomd.xml file for %s( RbRwRxRR!R"R4RRR(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_cachingRepoXMLs cCsk|jdif}|dkr0d|jk}nd}yvtjdddddtjj|}|jd|j d |d d d |d dd|d|j dkdd}Wnmt k r}t j ||rdStjd||fn.tjk rt j ||rdSnXytj||Wn4t j ||rMdStjd||fnX|S(s* Call _getFile() for the repomd.xml file. t old_repo_XMLRtprefixtrepomdtsuffixstmp.xmlRRRRiRR#RRbRLRisError downloading file %s: %ssError renaming file %s to %s(N(t _checkRepoXMLRRttempfiletmktempRwRxRRRRRRR^R!R"trename(RRRt grab_can_failRttfnameRR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_getFileRepoXMLsD      cCsuytj|j|SWnWtjk rp}|dkrJd|jk}n|rTdStjd|j|fnXdS(s Parse the repomd.xml file. Rs&Error importing repomd.xml from %s: %sN( t repoMDObjecttRepoMDR.R!t RepoMDErrorRRR"R4(RRtparse_can_failR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _parseRepoXMLs cCsx+tj|jdD]}tj|qWtjj|r|d}tj|||j |t }|dkr|dSi|d6|d6|d6gd6|_ |SdS(s= If we have an older repomd.xml file available, save it out. s /*.old.tmps.old.tmpRRt old_localt new_MD_filesN( tglobRVRR^RwRxRRtcopy2R RRR(RRRR Rn((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_saveOldRepoXMLs  cCs|jstjd|jnd|jkr;i|_dSx"|jdD]}tj|qIW|j}i|_d|krtj|d|dn|d|_ d|krdSx&|dD]}tj|d|qWdS( s0 If we have older data available, revert to it. s*Can't download or revert repomd.xml for %sRNR R Rt old_MD_filess.old.tmp( RR!R"R4RRR^RwRR(RRtold_datatrevert((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_revertOldRepoXML s        cCsl|j}i|_d|kr2tj|dnd|krBdSx#|dD]}tj|dqMWdS(s Done with old data, delete it. R RNs.old.tmp(RRR^(RRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_doneOldRepoXML?s    cCs|dkr|j}n|dkr?d|jkr?d}n|dkrq|j|dd|rq|d7}n||jj|fS( NRRRQR*RPt_dbRc(sothers filelistssprimary(RRcRREtrepoDataR (RRfRc((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_get_mdtype_dataLs     cCsN|j\}}|jdtjj|}|rJtj|dt}n|S(NRtR(RvRVRwRxRyRRR(RRHt compressedR}R~R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_get_mdtype_fnameXs cCs~d|jkrtS|jd}|jrz|j|jjkrztjd|jtj |jtj |jjft StS(s| We check the timestamps, if any of the timestamps for the "new" data is older than what we have ... we revert. RskNot using downloaded %s/repomd.xml because it is older than what we have: Current : %s Downloaded: %s( RRRt timestampRcRRR.RtctimeR(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_groupCheckDataMDNewer`s   cCs|j|jkrtS|j|jkr,tSt}xJ|jD]?}||jkrWq<n|j||j|krutSt}q<W|S(s7 Check parsed repomd.xml against metalink.repomd data. (RRtlengthRt checksumstchksumsR(RcRtdoneRe((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_checkRepoXMLMetalinkss cCs|dkr|j}n|dkr0|j}n|j||jrItSxb|jjD]T}|j||rVtjt j dt j |jj t j |j ftSqVWtS(s@ Check the repomd.xml against the metalink data, if we have it. s/Using older repomd.xml Latest: %s Using: %sN(RRRR!RRt old_repomdsR#RRRRRRR(RRcRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_checkRepoMetalinks     cCsk|j|}|stS|j|js0tS|jj}|jr[|j|jkr[tS|j ||S(sx Save the Old Repo XML, and if it exists check to see if it's the latest available given the metalink data. ( RRRRRRRRRR!(RRtoxmlR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_latestRepoXMLs   cCsN|jd}|jdk r tS|j|r>t}|}nt}|j|rr|}|j}|d|_ni|j||}|dkr|j rt |dr|j dkrt j d|jn|jtS|j|jdkr |j||_n|jdkr&|jtS|r0tS|jsJ|jtStS( s` Common LoadRepoXML for instant and group, returns False if you should just return. s /repomd.xmlRRtwritesread-only:futures Can't download repomd.xml for %sN(swritesread-only:future(RVRRRRRR%RRRRSRR!R"R4RRR R(RRtmdtypesRtcachingRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_commonLoadRepoXMLs<         cCs[|jdkrtS|dkr+|j}n||jkrWt|j|jkrWtSntS(NRn(tmddownloadpolicyRRRcRt DBVERSIONt dbversionR(RRfRc((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyREs  c Cs|dkrdS|s.t}|j|}nEt}|j|}tjj|sstj|dt}t}n|j tjj ||j ||d|d|dtsdS|S(s Check that we already have this data, and that it's valid. Given the DB mdtype and the main mdtype (no _db suffix). RRRHRuN( RRRRwRxRRRRR{RyRz(RRHtdbmdtypetmmdtypet file_checkRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_groupCheckDataMDValids  cCsZ|j|}x7|D]/\}}|j|dts|jtSqW|j|tS(s Retrieve any listed mdtypes, and revert if there was a failure. Also put any of the non-valid mdtype files from the old_repo_XML into the delete list, this means metadata can change filename without us leaking it. tretrieve_can_fail(t_commonRetrieveDataMD_listRGRRRt_commonRetrieveDataMD_done(RR't downloadingtndatatnmdtype((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_commonRetrieveDataMDs  cCsd}|jj}xH|jjD]7}||kr@q(n|d krRq(n|j|q(W|d krx|}ng}d|jkrd }n|jd}||jds+Could not read mirrorlist %s, error was %ss \w+://\S+\s*$s$ARCHs $BASEARCHN( Rt readlinest ExceptionRRR RtrstriptreplaceR2(RRR1t returnlisttcontentR(tlineR&((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_readMirrorLists"      c Cs|jdd|_d }t}|j|j|jdtrft}t|jd}d|j}n|j}t j |d}|dkrd|}n|j }yt j j ||}WnJtk r }tjd||jdtj|jd fd }nX|j||\}}|r||j r| rt|jd } x|D]} | j| qUW| jqnL| rtjj|jrtj|jd |jt|jddS|S( s$retrieve an up2date-style mirrorlist file from our mirrorlist url, also save the file to the local repo dir and use that if cache expiry not expired we also s/$ARCH/$BASEARCH/ and move along return the baseurls from the mirrorlist file Rtsmirrorlist.txtRtrsfile://iRs1Could not retrieve mirrorlist %s error was %s: %sitwN(RVRRRRtmirrorlist_expireRRRR+RHREtgrabberturlopenRRRRRRRqRbR&R RwRxRtutime( RRtcacheokR1RRKR(RnRoRRp((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRs:     1  cCs~tjj|stStjj|r[tj|tjtj|tjkr[tSnytj||WntSXtS(s&attempts to copy the file, if possible( RwRxRRRtST_CTIMERRR(RR[tdestfn((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _preload_files,RcCst|dstS|jdkr&tStjj|j|j}tjj|sWtStjj|tjj|j krtS|d|tjj |}|dkr|j d|tjj |}n|j ||S(sLattempts to copy the file from the system-wide cache, if possibletold_base_cache_dirRRtN( RSRR|RwRxRR.RtnormpathRVRyRR{(RRtsubdirRztglob_repo_cache_dirR[((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_preload_file_from_system_caches' $cCs |j|S(sUattempts to copy the metadata file from the system-wide cache, if possible(R(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyR{ scCstjj|j}tjj|j|}|j|jddd|rUtSt|dsht Sx6|j D]+}|j tjj|||rrtSqrWt S(sOattempts to copy the package from the system-wide cache, if possibleR~s packages/RzR( RwRxRyRRRyRRRSRRR{(RtpkgtpnameRztopkgdir((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRs !cCsg}dGHy|jj}Wn<tjk r\}tddt|}|j||SXxp|D]h}d|GHy|j|Wqdtjk r}d|}td|t|}|j|qdXqdW|S(Ns verifying mdisfailed to load repomd.xmls verifying %ss.%s metadata missing or does not match checksumi(RcRR!R"tRepoVerifyProblemR&R2Ra(Rtproblemstmd_typesR(tprbtmd_typeR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _verify_md"s"    cCsdGHg}|j}|dk r5tj|}nytj}|j|WnJtjtj fk r}d}t t |t |}|j|n8X|j dkrd}t t |d}|j|n|S(Nsverifying compsscomps file failed to addisno groups in compsR(ReRRRRtCompstaddR!t GroupsErrortCompsExceptionRtREPO_PROBLEM_COMPSR&t compscount(RRtgrpfiletcR(RR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt _verify_comps7s"   cCsgS(N((R((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt_verify_packagesSstrepodataRcCs|g}d|kr(|j|jnd|krV|jrV|j|jqVnd|krx|j|jn|S(s}download/verify the specified items @items = ['repodata', 'comps'] can include: repodata, comps, packages RRRo(RRRRR(RtitemsR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytverifyVs    iN(qRRRRRRtpropertyRRR4R Rt_YumRepository__getProxyDictReRRRRRRRRRRRRRR_RRRHRfRgRRRnRRRRVRzRyR|RRRRRRRRRRRRRt_YumRepository__getRRRRRRRRRRR RRRRRRt staticmethodR!R#R%R)RER0R7R2R3RBRKRMRNRcRRRRzRaRGRWRYR[ReRfRgRhRiRqRR{RR{RRRRR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRAs =                 <    '             $     $    h)     #  *      -   S      , 0  Z          ,       c CsRtjdtjddg}ttjdr=tj}nddl}|}tj|d}|dkr{d|}n|}y|j |d |}WnBt k r}d ||j dt j |j d fGHd}nX|dk rN|j} xT| D]I} tjd | rqn| j} | jd d} |j| qWn|S(Ns9getMirrorList() will go away in a future version of Yum. RiRviiRsfile://R]s1Could not retrieve mirrorlist %s error was %s: %sis\s*(#|$)s$ARCHs $BASEARCH(RRR!RRSRERuR R+RvRRRRRRjR RRlRmR2( RtpdictRnt urlresolverR RR1RR(RoRpR&((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyt getMirrorListgs2     )     RcBseZdZedZRS(s9 Holder for each "problem" we find with a repo.verify(). cCs(||_||_||_||_dS(N(Rtmessagetdetailstfake(RRRRR((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRs   (RRRRR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pyRs(:RwR RRR+t uses_fragmentR2R R!turlgrabber.grabberRRturlgrabber.progressRturlgrabber.mirrorRERRRtreposRRRTRtyumRRRR t constantsRtloggingRRR RRRRRtskip_old_DBMD_checkR RSRt ImportErrorRRt simplefilterRt getLoggerRR#RRRRRR(((s//usr/lib/python2.7/site-packages/yum/yumRepo.pytsn                             - %PK[ۅsite-packages/yum/Errors.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2004 Duke University """ Exceptions and Errors thrown by yum. """ from i18n import to_unicode, to_utf8 class YumBaseError(Exception): """ Base Yum Error. All other Errors thrown by yum should inherit from this. """ def __init__(self, value=None): Exception.__init__(self) self.value = value def __str__(self): return "%s" % to_utf8(self.value) def __unicode__(self): return '%s' % to_unicode(self.value) class YumGPGCheckError(YumBaseError): pass class YumDownloadError(YumBaseError): pass class YumTestTransactionError(YumBaseError): pass class YumRPMCheckError(YumBaseError): pass class YumRPMTransError(YumBaseError): """ This class means rpm's .ts.run() returned known errors. We are compat. with YumBaseError in that we print nicely, and compat. with traditional usage of this error from runTransaction(). """ def __init__(self, msg, errors): self.msg = msg self.errors = errors # old YumBaseError raises from runTransaction used to raise just this self.value = self.errors def __str__(self): return "%s" %(self.msg,) def __unicode__(self): return '%s' % to_unicode(self.msg) class LockError(YumBaseError): def __init__(self, errno, msg, pid=0): YumBaseError.__init__(self, msg) self.errno = errno self.msg = msg self.pid = pid class DepError(YumBaseError): pass class RepoError(YumBaseError): pass class DuplicateRepoError(RepoError): pass # Have our own custom .value with all the mirror errors. class NoMoreMirrorsRepoError(RepoError): def __init__(self, value=None, errors=None): Exception.__init__(self) self._value = value self.errors = errors @property def value(self): ret = self._value for url, msg in self.errors or []: ret += '\n%s: %s' % (url, msg) return ret class ConfigError(YumBaseError): pass class MiscError(YumBaseError): pass class FIPSNonCompliantError(MiscError): def __init__(self, sumtype): MiscError.__init__( self, '%s algorithm is not FIPS compliant' % sumtype) class GroupsError(YumBaseError): pass class InstallError(YumBaseError): pass class GroupInstallError(InstallError): pass class UpdateError(YumBaseError): pass class UpdateMissingNameError(UpdateError): pass class RemoveError(YumBaseError): pass class ReinstallError(YumBaseError): pass class ReinstallRemoveError(ReinstallError): pass class ReinstallInstallError(ReinstallError): def __init__(self, value=None, failed_pkgs=[]): ReinstallError.__init__(self, value) self.failed_pkgs = failed_pkgs class DowngradeError(YumBaseError): pass class RepoMDError(YumBaseError): pass class PackageSackError(YumBaseError): pass class RpmDBError(YumBaseError): pass class CompsException(YumBaseError): pass class MediaError(YumBaseError): pass class PkgTagsError(YumBaseError): pass class YumDeprecationWarning(DeprecationWarning): """ Used to mark a method as deprecated. """ def __init__(self, value=None): DeprecationWarning.__init__(self, value) class YumFutureDeprecationWarning(YumDeprecationWarning): """ Used to mark a method as deprecated. Unlike YumDeprecationWarning, YumFutureDeprecationWarnings will not be shown on the console. """ def __init__(self, value=None): YumDeprecationWarning.__init__(self, value) PK[=5&site-packages/yum/parser.pynuȯ#! /usr/bin/python -tt import re import urlparse import urlgrabber import os.path import Errors _KEYCRE = re.compile(r"\$(\w+)") def varReplace(raw, vars): '''Perform variable replacement @param raw: String to perform substitution on. @param vars: Dictionary of variables to replace. Key is variable name (without $ prefix). Value is replacement string. @return: Input raw string with substituted values. ''' if not vars: return raw done = [] # Completed chunks to return while raw: m = _KEYCRE.search(raw) if not m: done.append(raw) break # Determine replacement value (if unknown variable then preserve # original) varname = m.group(1).lower() replacement = vars.get(varname, m.group()) start, end = m.span() done.append(raw[:start]) # Keep stuff leading up to token done.append(replacement) # Append replacement value raw = raw[end:] # Continue with remainder of string return ''.join(done) class ConfigPreProcessor: """ ConfigParser Include Pre-Processor File-like Object capable of pre-processing include= lines for a ConfigParser. The readline function expands lines matching include=(url) into lines from the url specified. Includes may occur in included files as well. Suggested Usage:: cfg = ConfigParser.ConfigParser() fileobj = confpp( fileorurl ) cfg.readfp(fileobj) """ def __init__(self, configfile, vars=None): # put the vars away in a helpful place self._vars = vars # used to track the current ini-section self._section = None # set some file-like object attributes for ConfigParser # these just make confpp look more like a real file object. self.mode = 'r' # first make configfile a url even if it points to # a local file scheme = urlparse.urlparse(configfile)[0] if scheme == '': # check it to make sure it's not a relative file url if configfile[0] != '/': try: rootdir = os.getcwd() + "/" except: rootdir = "/" configfile = rootdir + configfile url = 'file://' + configfile else: url = configfile # these are used to maintain the include stack and check # for recursive/duplicate includes self._incstack = [] self._alreadyincluded = [] # _pushfile will return None if he couldn't open the file fo = self._pushfile( url ) if fo is None: raise Errors.ConfigError, 'Error accessing file: %s' % url def readline( self, size=0 ): """ Implementation of File-Like Object readline function. This should be the only function called by ConfigParser according to the python docs. We maintain a stack of real FLOs and delegate readline calls to the FLO on top of the stack. When EOF occurs on the topmost FLO, it is popped off the stack and the next FLO takes over. include= lines found anywhere cause a new FLO to be opened and pushed onto the top of the stack. Finally, we return EOF when the bottom-most (configfile arg to __init__) FLO returns EOF. Very Technical Pseudo Code:: def confpp.readline() [this is called by ConfigParser] open configfile, push on stack while stack has some stuff on it line = readline from file on top of stack pop and continue if line is EOF if line starts with 'include=' then error if file is recursive or duplicate otherwise open file, push on stack continue else return line return EOF """ # set line to EOF initially. line='' while len(self._incstack) > 0: # peek at the file like object on top of the stack fo = self._incstack[-1] line = fo.readline() if len(line) > 0: m = re.match( r'\s*include\s*=\s*(?P.*)', line ) if m: url = m.group('url') if len(url) == 0: raise Errors.ConfigError, \ 'Error parsing config %s: include must specify file to include.' % (self.name) else: # whooohoo a valid include line.. push it on the stack url = varReplace(url, self._vars) fo = self._pushfile( url ) else: # check if the current line starts a new section secmatch = re.match( r'\s*\[(?P
.*)\]', line ) if secmatch: self._section = secmatch.group('section') # line didn't match include=, just return it as is # for the ConfigParser break else: # the current file returned EOF, pop it off the stack. self._popfile() # if the section is prefixed by a space then it is breaks iniparser/configparser # so fix it broken_sec_match = re.match(r'\s+\[(?P
.*)\]', line) if broken_sec_match: line = line.lstrip() # at this point we have a line from the topmost file on the stack # or EOF if the stack is empty return varReplace(line, self._vars) def _absurl( self, url ): """ Returns an absolute url for the (possibly) relative url specified. The base url used to resolve the missing bits of url is the url of the file currently being included (i.e. the top of the stack). """ if len(self._incstack) == 0: # it's the initial config file. No base url to resolve against. return url else: return urlparse.urljoin( self.geturl(), url ) def _pushfile( self, url ): """ Opens the url specified, pushes it on the stack, and returns a file like object. Returns None if the url has previously been included. If the file can not be opened this function exits. """ # absolutize this url using the including files url # as a base url. absurl = self._absurl(url) # get the current section to add it to the included # url's name. includetuple = (absurl, self._section) # check if this has previously been included. if self._isalreadyincluded(includetuple): return None try: fo = urlgrabber.grabber.urlopen(absurl) except urlgrabber.grabber.URLGrabError, e: fo = None if fo is not None: self.name = absurl self._incstack.append( fo ) self._alreadyincluded.append(includetuple) else: raise Errors.ConfigError, \ 'Error accessing file for config %s' % (absurl) return fo def _popfile( self ): """ Pop a file off the stack signaling completion of including that file. """ fo = self._incstack.pop() fo.close() if len(self._incstack) > 0: self.name = self._incstack[-1].geturl() else: self.name = None def _isalreadyincluded( self, tuple ): """ Checks if the tuple describes an include that was already done. This does not necessarily have to be recursive """ for etuple in self._alreadyincluded: if etuple == tuple: return 1 return 0 def geturl(self): return self.name PK[w,X~X~site-packages/yum/comps.pynuȯ#! /usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University import types import sys from yum.constants import * from yum.Errors import CompsException #FIXME - compsexception isn't caught ANYWHERE so it's pointless to raise it # switch all compsexceptions to grouperrors after api break import fnmatch import re from yum.i18n import to_unicode from yum.misc import get_my_lang_code from yum.misc import cElementTree_iterparse as iterparse lang_attr = '{http://www.w3.org/XML/1998/namespace}lang' def parse_boolean(strng): return BOOLEAN_STATES.get(strng.lower(), False) def parse_number(strng): return int(strng) class CompsObj(object): """ Group/Category helper object. """ # Could be the same as ui_name? def __str__(self): """ Return the "name" of the object for the C locale. """ return self.name @property def compsid(self): """ Return the "id": categoryid, groupid, environmentid. """ for idT in ('categoryid', 'groupid', 'environmentid'): if hasattr(self, idT): return getattr(self, idT) return None @property def ui_name(self): """ Return the "name" of the object for the current locale. """ return self.nameByLang(get_my_lang_code()) @property def ui_description(self): """ Return the "description" of the object for the current locale. """ return self.descriptionByLang(get_my_lang_code()) def __cmp__(self, other): if other is None: return 1 if self.display_order > other.display_order: return 1 if self.display_order < other.display_order: return -1 return cmp(self.ui_name, other.ui_name) def _expand_languages(self, lang): import gettext languages = [lang] if 'C' not in languages: languages.append('C') # now normalize and expand the languages nelangs = [] for lang in languages: for nelang in gettext._expand_lang(lang): if nelang not in nelangs: nelangs.append(nelang) return nelangs def nameByLang(self, lang): for langcode in self._expand_languages(lang): if langcode in self.translated_name: return to_unicode(self.translated_name[langcode]) return to_unicode(self.name) def descriptionByLang(self, lang): for langcode in self._expand_languages(lang): if langcode in self.translated_description: return to_unicode(self.translated_description[langcode]) return to_unicode(self.description) class Group(CompsObj): """ Group object parsed from group data in each repo. and merged. """ def __init__(self, elem=None): self.user_visible = True self.default = False self.selected = False self.name = "" self.description = "" self.translated_name = {} self.translated_description = {} self.mandatory_packages = {} self.optional_packages = {} self.default_packages = {} self.conditional_packages = {} self.langonly = None self.groupid = None self.display_order = 1024 self.installed = False self.toremove = False self._weak = False if elem: self.parse(elem) def _packageiter(self): # Gah, FIXME: real iterator/class lst = self.mandatory_packages.keys() + \ self.optional_packages.keys() + \ self.default_packages.keys() + \ self.conditional_packages.keys() return lst packages = property(_packageiter) def parse(self, elem): for child in elem: if child.tag == 'id': myid = child.text if self.groupid is not None: raise CompsException self.groupid = myid elif child.tag == 'name': text = child.text if text: text = text.encode('utf8') lang = child.attrib.get(lang_attr) if lang: self.translated_name[lang] = text else: self.name = text elif child.tag == 'description': text = child.text if text: text = text.encode('utf8') lang = child.attrib.get(lang_attr) if lang: self.translated_description[lang] = text else: if text: self.description = text elif child.tag == 'uservisible': self.user_visible = parse_boolean(child.text) elif child.tag == 'display_order': self.display_order = parse_number(child.text) elif child.tag == 'default': self.default = parse_boolean(child.text) elif child.tag in ['langonly', 'lang_only']: text = child.text if self.langonly is not None: raise CompsException self.langonly = text elif child.tag == 'packagelist': self.parse_package_list(child) def parse_package_list(self, packagelist_elem): for child in packagelist_elem: if child.tag == 'packagereq': genre = child.attrib.get('type') if not genre: genre = u'mandatory' if genre not in ('mandatory', 'default', 'optional', 'conditional'): # just ignore bad package lines continue package = child.text if not package: # Ignore this too, or we end up doing: # .searchNevra(name=None) continue if genre == 'mandatory': self.mandatory_packages[package] = 1 elif genre == 'default': self.default_packages[package] = 1 elif genre == 'optional': self.optional_packages[package] = 1 elif genre == 'conditional': self.conditional_packages[package] = child.attrib.get('requires') def add(self, obj): """Add another group object to this object""" # we only need package lists and any translation that we don't already # have for pkg in obj.mandatory_packages: self.mandatory_packages[pkg] = 1 for pkg in obj.default_packages: self.default_packages[pkg] = 1 for pkg in obj.optional_packages: self.optional_packages[pkg] = 1 for pkg in obj.conditional_packages: self.conditional_packages[pkg] = obj.conditional_packages[pkg] # Handle cases where a comps.xml without name & decription tags # has been setup first, so the name & decription for this object is blank. if self.name == '' and obj.name != '': self.name = obj.name if self.description == '' and obj.description != '': self.description = obj.description # name and description translations for lang in obj.translated_name: if lang not in self.translated_name: self.translated_name[lang] = obj.translated_name[lang] for lang in obj.translated_description: if lang not in self.translated_description: self.translated_description[lang] = obj.translated_description[lang] def xml(self): """write out an xml stanza for the group object""" msg =""" %s %s %s %s\n""" % (self.groupid, str(self.default).lower(), str(self.user_visible).lower(), self.display_order) if self.langonly: msg += """ %s""" % self.langonly msg +=""" %s\n""" % self.name for (lang, val) in sorted(self.translated_name.items()): msg += """ %s\n""" % (lang, val) msg += """ %s\n""" % self.description for (lang, val) in sorted(self.translated_description.items()): msg += """ %s\n""" % (lang, val) msg += """ \n""" for pkg in sorted(self.mandatory_packages): msg += """ %s\n""" % pkg for pkg in sorted(self.default_packages): msg += """ %s\n""" % pkg for pkg in sorted(self.optional_packages): msg += """ %s\n""" % pkg for (pkg, req) in sorted(self.conditional_packages.items()): msg += """ %s\n""" % (req, pkg) msg += """ \n""" msg += """ """ return msg class Environment(CompsObj): """ Environment object parsed from group data in each repo, and merged """ def __init__(self, elem=None): self.name = "" self.environmentid = None self.description = "" self.translated_name = {} self.translated_description = {} self.display_order = 1024 self.langonly = None self.installed = False self._groups = {} self._options = {} self._defaultoptions = {} self._weak = False if elem: self.parse(elem) def _allgroupiter(self): lst = self._groups.keys() + \ self._options.keys() return lst allgroups = property(_allgroupiter) def _groupiter(self): return self._groups.keys() groups = property(_groupiter) def _optioniter(self): return self._options.keys() options = property(_optioniter) def _defaultoptioniter(self): return self._defaultoptions.keys() defaultoptions = property(_defaultoptioniter) def parse(self, elem): for child in elem: if child.tag == 'id': myid = child.text if self.environmentid is not None: raise CompsException self.environmentid = myid elif child.tag == 'name': text = child.text if text: text = text.encode('utf8') lang = child.attrib.get(lang_attr) if lang: self.translated_name[lang] = text else: self.name = text elif child.tag == 'description': text = child.text if text: text = text.encode('utf8') lang = child.attrib.get(lang_attr) if lang: self.translated_description[lang] = text else: self.description = text elif child.tag == 'grouplist': self.parse_group_list(child) elif child.tag == 'optionlist': self.parse_option_list(child) elif child.tag == 'display_order': self.display_order = parse_number(child.text) def parse_group_list(self, grouplist_elem): for child in grouplist_elem: if child.tag == 'groupid': groupid = child.text self._groups[groupid] = 1 def parse_option_list(self, optionlist_elem): for child in optionlist_elem: if child.tag == 'groupid': optionid = child.text self._options[optionid] = 1 defopt = child.attrib.get('default') if defopt: default = parse_boolean(defopt) else: default = False if default: self._defaultoptions[optionid] = 1 def add(self, obj): """Add another environment object to this object""" for grp in obj.groups: self._groups[grp] = 1 for grp in obj.defaultoptions: self._defaultoptions[grp] = 1 for grp in obj.options: self._options[grp] = 1 # name and description translations for lang in obj.translated_name: if lang not in self.translated_name: self.translated_name[lang] = obj.translated_name[lang] for lang in obj.translated_description: if lang not in self.translated_description: self.translated_description[lang] = obj.translated_description[lang] def xml(self): """write out an xml stanza for the environment object""" msg =""" %s %s\n""" % (self.environmentid, self.display_order) msg +=""" %s\n""" % self.name for (lang, val) in self.translated_name.items(): msg += """ %s\n""" % (lang, val) msg += """ %s\n""" % self.description for (lang, val) in self.translated_description.items(): msg += """ %s\n""" % (lang, val) msg += """ \n""" for grp in self.groups: msg += """ %s\n""" % grp msg += """ \n""" msg += """ \n""" for grp in self.options: if grp in self.defaultoptions: msg += """ %s\n""" % grp else: msg += """ %s\n""" % grp msg += """ \n""" msg += """ \n""" return msg class Category(CompsObj): """ Category object parsed from group data in each repo. and merged. """ def __init__(self, elem=None): self.name = "" self.categoryid = None self.description = "" self.translated_name = {} self.translated_description = {} self.display_order = 1024 self._groups = {} if elem: self.parse(elem) def _groupiter(self): return self._groups.keys() groups = property(_groupiter) def parse(self, elem): for child in elem: if child.tag == 'id': myid = child.text if self.categoryid is not None: raise CompsException self.categoryid = myid elif child.tag == 'name': text = child.text if text: text = text.encode('utf8') lang = child.attrib.get(lang_attr) if lang: self.translated_name[lang] = text else: self.name = text elif child.tag == 'description': text = child.text if text: text = text.encode('utf8') lang = child.attrib.get(lang_attr) if lang: self.translated_description[lang] = text else: self.description = text elif child.tag == 'grouplist': self.parse_group_list(child) elif child.tag == 'display_order': self.display_order = parse_number(child.text) def parse_group_list(self, grouplist_elem): for child in grouplist_elem: if child.tag == 'groupid': groupid = child.text self._groups[groupid] = 1 def add(self, obj): """Add another category object to this object""" for grp in obj.groups: self._groups[grp] = 1 # name and description translations for lang in obj.translated_name: if lang not in self.translated_name: self.translated_name[lang] = obj.translated_name[lang] for lang in obj.translated_description: if lang not in self.translated_description: self.translated_description[lang] = obj.translated_description[lang] def xml(self): """write out an xml stanza for the category object""" msg =""" %s %s\n""" % (self.categoryid, self.display_order) msg +=""" %s\n""" % self.name for (lang, val) in self.translated_name.items(): msg += """ %s\n""" % (lang, val) msg += """ %s\n""" % self.description for (lang, val) in self.translated_description.items(): msg += """ %s\n""" % (lang, val) msg += """ \n""" for grp in self.groups: msg += """ %s\n""" % grp msg += """ \n""" msg += """ \n""" return msg class Langpacks(CompsObj): def __init__(self, elem=None): self.langpacks = [] self.name = "" # prevent CompsObj.__str__() throwing an AttributeError if elem is not None: self.parse(elem) def __getitem__(self, indx): return self.langpacks[indx] def __iter__(self): for i in self.langpacks: yield i def __len__(self): return len(self.langpacks) def add(self, name, install): langpack = { "name": name, "install": install, } self.langpacks.append(langpack) def parse(self, elem): for child in elem: if child.tag == "match": langpack = { "name": child.attrib.get("name"), "install": child.attrib.get("install"), } self.langpacks.append(langpack) else: raise CompsException("Unexpected element in : %s" % child.tag) self.name = elem.attrib.get("name") self.install = elem.attrib.get("install") def xml(self): """write out an xml stanza for the Langpacks object""" if not self.langpacks: return '' msg = ' \n' for i in self: msg += ' \n' % (i["name"], i["install"]) msg += ' \n' return msg class Comps(object): def __init__(self, overwrite_groups=False): self._groups = {} self._environments = {} self._categories = {} self._langpacks = Langpacks() self.compscount = 0 self.overwrite_groups = overwrite_groups self.compiled = False # have groups been compiled into avail/installed # lists, yet. def get_groups(self): grps = self._groups.values() grps.sort(key=lambda x: (x.display_order, x.name)) return grps def get_environments(self): environments = self._environments.values() environments.sort(key=lambda x: (x.display_order, x.name)) return environments def get_categories(self): cats = self._categories.values() cats.sort(key=lambda x: (x.display_order, x.name)) return cats def get_langpacks(self): return self._langpacks groups = property(get_groups) environments = property(get_environments) categories = property(get_categories) langpacks = property(get_langpacks) def has_group(self, grpid): exists = self.return_groups(grpid) if exists: return True return False def return_group(self, grpid): """Return the first group which matches""" grps = self.return_groups(grpid) if grps: return grps[0] return None def return_groups(self, group_pattern, case_sensitive=False): """return all groups which match either by glob or exact match""" returns = {} if not group_pattern: return [] for item in group_pattern.split(','): item = item.strip() if item in self._groups: thisgroup = self._groups[item] returns[thisgroup.groupid] = thisgroup continue if case_sensitive: match = re.compile(fnmatch.translate(item)).match else: match = re.compile(fnmatch.translate(item), flags=re.I).match done = False for group in self.groups: for name in group.name, group.groupid, group.ui_name: if match(name): done = True returns[group.groupid] = group break if done: continue # If we didn't match to anything in the current locale, try others for group in self.groups: for name in group.translated_name.values(): if match(name): returns[group.groupid] = group break return returns.values() def has_environment(self, environmentid): exists = self.return_environments(environmentid) if exists: return True return False def return_environment(self, environmentid): """Return the first group which matches""" environments = self.return_environments(environmentid) if environments: return environments[0] return None def return_environments(self, env_pattern, case_sensitive=False): """return all environments which match either by glob or exact match""" returns = {} if not env_pattern: return [] for item in env_pattern.split(','): item = item.strip() if item in self._environments: env = self._environments[item] returns[env.environmentid] = env continue if case_sensitive: match = re.compile(fnmatch.translate(item)).match else: match = re.compile(fnmatch.translate(item), flags=re.I).match done = False for env in self.environments: for name in env.name, env.environmentid, env.ui_name: if match(name): done = True returns[env.environmentid] = env break if done: continue # If we didn't match to anything in the current locale, try others for env in self.environments: for name in env.translated_name.values(): if match(name): returns[env.environmentid] = env break return returns.values() # This is close to returnPackages() etc. API ... need to std. these names # the above return_groups uses different, but equal, API. def return_categories(self, pattern, ignore_case=True): """return all categories which match either by glob or exact match""" returns = {} for item in pattern.split(','): item = item.strip() if item in self._categories: cat = self._categories[item] returns[cat.categoryid] = cat continue if not ignore_case: match = re.compile(fnmatch.translate(item)).match else: match = re.compile(fnmatch.translate(item), flags=re.I).match done = False for cat in self.categories: for name in cat.name, cat.categoryid, cat.ui_name: if match(name): done = True returns[cat.categoryid] = cat break if done: continue for cat in self.categories: for name in cat.translated_name.values(): if match(name): returns[cat.categoryid] = cat break return returns.values() def add_group(self, group): if group.groupid in self._groups: thatgroup = self._groups[group.groupid] if thatgroup._weak: # If what we had was weak, use this one and merge the weak one. tmp = group group = thatgroup thatgroup = self._groups[group.groupid] = tmp thatgroup.add(group) else: self._groups[group.groupid] = group def add_environment(self, environment): if environment.environmentid in self._environments: env = self._environments[environment.environmentid] if env._weak: # If what we had was weak, use this one and merge the weak one. tmp = environment environment = env env = self._environments[environment.environmentid] = tmp env.add(environment) else: self._environments[environment.environmentid] = environment def add_category(self, category): if category.categoryid in self._categories: thatcat = self._categories[category.categoryid] thatcat.add(category) else: self._categories[category.categoryid] = category def add_langpack(self, name, install): self._langpacks.add(name, install) def add(self, srcfile = None): if not srcfile: raise CompsException if type(srcfile) in types.StringTypes: # srcfile is a filename string try: infile = open(srcfile, 'rt') except IOError, e: raise CompsException, 'open(%s): #%u %s' % (srcfile, e.errno, e.strerror) else: # srcfile is a file object infile = srcfile self.compscount += 1 self.compiled = False parser = iterparse(infile) try: for event, elem in parser: if elem.tag == "group": group = Group(elem) self.add_group(group) if elem.tag == "environment": environment = Environment(elem) self.add_environment(environment) if elem.tag == "category": category = Category(elem) self.add_category(category) if elem.tag == "langpacks": self._langpacks.parse(elem) except SyntaxError, e: raise CompsException, "comps file is empty/damaged" del parser def compile(self, pkgtuplist): """ compile the groups into installed/available groups """ # convert the tuple list to a simple dict of pkgnames inst_pkg_names = {} for (n,a,e,v,r) in pkgtuplist: inst_pkg_names[n] = 1 for group in self.groups: # if there are mandatory packages in the group, then make sure # they're all installed. if any are missing, then the group # isn't installed. if len(group.mandatory_packages) > 0: group.installed = True for pkgname in group.mandatory_packages: if pkgname not in inst_pkg_names: group.installed = False break # if it doesn't have any of those then see if it has ANY of the # optional/default packages installed. # If so - then the group is installed else: check_pkgs = group.optional_packages.keys() + group.default_packages.keys() + group.conditional_packages.keys() group.installed = False for pkgname in check_pkgs: if pkgname in inst_pkg_names: group.installed = True break # Now do basically the same thing for evgroups. inst_grp_names = {} for group in self.groups: inst_grp_names[group.groupid] = group.installed for evgroup in self.environments: if evgroup.groups: evgroup.installed = True for grpname in evgroup.groups: if not inst_grp_names.get(grpname): evgroup.installed = False break else: evgroup.installed = False for grpname in evgroup.options: if grpname in inst_grp_names: evgroup.installed = True break self.compiled = True def xml(self): """returns the xml of the comps files in this class, merged""" if not self._groups and not self._categories and \ not self._environments and not len(self._langpacks): return "" msg = """ """ for g in self.get_groups(): msg += g.xml() for c in self.get_categories(): msg += c.xml() for e in self.get_environments(): msg += e.xml() msg += self.get_langpacks().xml() msg += """\n\n""" return msg def main(): try: print sys.argv[1] p = Comps() for srcfile in sys.argv[1:]: p.add(srcfile) print print "===== GROUPS =====" for group in p.groups: print "%s (id: %s)" % (group, group.groupid) for pkg in group.packages: print ' ' + pkg print print "===== ENVIRONMENTS =====" for environment in p.environments: print "%s (id: %s)" % (environment.name, environment.environmentid) for group in environment.groups: print ' ' + group for group in environment.options: print ' *' + group print print "===== CATEGORIES =====" for category in p.categories: print "%s (id: %s)" % (category.name, category.categoryid) for group in category.groups: print ' ' + group print print "===== LANGPACKS =====" for langpack in p.langpacks: print ' %s (%s)' % (langpack["name"], langpack["install"]) except IOError: print >> sys.stderr, "newcomps.py: No such file:\'%s\'" % sys.argv[1] sys.exit(1) if __name__ == '__main__': main() PK[VVsite-packages/yum/update_md.pycnu[ v_c@s.dZddlZddlmZmZmZmZddlmZddl m Z ddl m Z m Z mZddl mZddlZddlZddlZddlmZed Zd efd YZd efd YZdZdefdYZdZe dkr*endS(s+ Update metadata (updateinfo.xml) parsing. iN(tutf8_text_wraptto_utf8t to_unicodet_(t YumRepository(tFakeRepository(tto_xmlt decompresstrepo_gen_decompress(tcElementTree_iterparse(t ArchStorageccsvy,x%t|D]\}}||fVqWWnCtk rq|r[|jtd|qrtjdI|IJnXdS(s@ Works like iterparse, but hides XML errors (prints a warning). s$Updateinfo file is not valid XML: %ss!Updateinfo file is not valid XML:N(t iterparset SyntaxErrortcriticalRtsyststderr(tfilenametloggerteventtelem((s1/usr/lib/python2.7/site-packages/yum/update_md.pytsafe_iterparse's tUpdateNoticeExceptioncBseZdZRS(s0 An exception thrown for bad UpdateNotice data. (t__name__t __module__t__doc__(((s1/usr/lib/python2.7/site-packages/yum/update_md.pyR2st UpdateNoticecBseZdZddddZdZdZdZdZdZ dd Z d Z d Z dZ dZdZdZdZdZRS(s@ A single update notice (for instance, a security fix). cCsidd6dd6dd6dd6dd6dd6dd6dd 6dd 6dd 6dd 6dd 6dd6dd6dd6gd6gd6td6|_|r|j|n||_||_dS(Nttfromttypettitletreleasetstatustversiont pushcountt update_idtissuedtupdatedt descriptiontrightstseveritytsummarytsolutiont referencestpkglisttreboot_suggested(tFalset_mdt_parset_repoidt_vlogger(tselfRtrepoidtvlogger((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt__init__=s.  cCsNt|tkr#t|j|S|jj|}|dkrJd}n|S(s: Allows scriptable metadata access (ie: un['update_id']). RN(RtinttsortedR.tgettNone(R2titemtret((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt __getitem__Ys   cCs ||jkS(s% Allows quick tests for foo in blah. (R.(R2R:((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt __contains__bscCs||j|(thasattrR0R9(tun((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt_ridmscsjdkrdStd}|jd;}|d|f7}|dj|j|f7}|d|f7}jjtj|dS(s=Log the mismatched data similarly to conflict markers in git.Ns(Duplicate of %s differs in some fields: R"s<<<<<<< %s:%s s%r ======= %r s >>>>>>> %s:%s(R1R9RR.tlogt logginglevelstDEBUG_3(tdatatmsg(RBtotherR2(s1/usr/lib/python2.7/site-packages/yum/update_md.pyt _log_failuress "R.RR"RR&R'RR#R$R R!RRR(R%R)tstablettesting(stypes update_idsstatussrightssseveritysreleasesissuedsupdatedsversions pushcountsfromstitlessummarys descriptionssolution(RJRK(RJRK(R@R-R.tTrue(R2RHRIRF((RBRHR2s1/usr/lib/python2.7/site-packages/yum/update_md.pyt__eq__is0        cCs ||k S(N((R2RH((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt__ne__stfilesR(R&R)cCsd|j}|jdrL|jd|jdkrL|d|jd7}ntd|jd}t|rd|krd}x@|D]8}|d |d d |krd |d pd f7}qW||d jd7}ntd|jd}t|rVd|krVd}x |D]}|d|d 7}qW||d jd7}n|jdrd|krt|jddddd+} |ddj| 7}n|jdrd|krt|jddddd-} |ddj| 7}n|jdrLd|krLt|jddddd/} |ddj| 7}n|jd rd |krt|jd dddd1} |d!dj| 7}n|jd"rd"|krt|jd"dddd3} |d#dj| 7}nd$|kr|d Sttjj } d%} xR|jd&D]C} x:| d'D].}|d(| krZq>n| d|d)7} q>Wq-W|| d j7}|S(4Ns, =============================================================================== %(title)s =============================================================================== Update ID : %(update_id)s Release : %(release)s Type : %(type)s Status : %(status)s Issued : %(issued)s R$R#s Updated : %scSs|ddkS(NRtbugzilla((tr((s1/usr/lib/python2.7/site-packages/yum/update_md.pytsR*tbugss Bugs :s %s%s :tidRs - %sRis cSs|ddkS(NRtcve((RQ((s1/usr/lib/python2.7/site-packages/yum/update_md.pyRRstcvess CVEs :s %s :R(twidthi@tsubsequent_indentt i s: s Summary : %s R%sDescription : %s R)s Solution : %s R&s Rights : %s R's Severity : %s ROs Files :R+tpackagestarchRs s : s s : s s : s s : s s : ( R.tfiltertlentrstripRtjointsettrpmUtilsR[t getArchList(R2t skip_datatheadtbzstbuglisttbzRVtcvelistRURFtdesctarchestfilelisttpkgtfile((s1/usr/lib/python2.7/site-packages/yum/update_md.pyttexts^ '        cCst|jS(N(RRn(R2((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt__str__scCst|jS(N(RRn(R2((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt __unicode__scCs|jS(s Return the metadata dict. (R.(R2((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt get_metadatascCs>|jdkr.x'dD]}|jj||j| tupdateRRRR RTsNo id element foundR"R!R#tdateR$R*R%R&R'R(R)R+RRsNo update element foundN(sfromstypesstatussversion(ttagtattribR8R.RnRt_parse_referencest_parse_pkglist(R2RRutchild((s1/usr/lib/python2.7/site-packages/yum/update_md.pyR/sB    cCstxm|D]e}|jdkr`i}x$d D]}|jj||| t referenceRTthrefRRR*sNo reference element foundN(sidRzstypestitle(RtRuR8R.tappendR(R2RRyRFt refattrib((s1/usr/lib/python2.7/site-packages/yum/update_md.pyRv"s  cCsx|D]}igd6}d|jkrB|jjd|d RZtshorttnametpackageR+N(RuR8RtRnR{t_parse_packageR.(R2Rt collectionRFR:((s1/usr/lib/python2.7/site-packages/yum/update_md.pyRw6s   !cCsi}x$d D]}|jj||| R[tepochR~R Rtsrcit 0123456789RtsumRR,(sarchRsnamesversionsreleaseRN(RuR8R9RtRnRLR.(R2RRtpkgfieldRx((s1/usr/lib/python2.7/site-packages/yum/update_md.pyRKs   "cCsdt|jdt|jdt|jdt|jdt|jdt|jdt|jdt|jd d tt|jd f }|jd r|d t|jd d t7}n|jdr|dt|jd7}n|jdr'|dt|jd7}n|jdrR|dt|jd7}n|jdr}|dt|jd7}n|jdrg|d7}x|jdD]}|dr|dt|dd tt|dd tt|dd tt|dd tf7}q|dt|dd tt|dd tt|dd tf7}qW|d7}n|jdr|d7}x|jdD]}|dt|d d tt|d!f7}x|d"D]}|d#t|d$d tt|d!d tt|dd tt|d%d tt|dd tt|d&pFd'd tt|d(f7}qW|d)7}qW|d*7}n|d+7}|S(,s.Generate the xml for this update notice objects %s %s %s %s RRRR R"RRR#RuR%R$s R(s %s R)s %s R&s %s R's %s R*s s8 RzRTs. s R+s s2 %s R}R~RZs %s R[RRt0Rs s s (RR.RL(R2RGtreftcollRl((s1/usr/lib/python2.7/site-packages/yum/update_md.pytxmlms\    $       &1&     N(sfilesssummarysrightsssolution(RRRR9R5R<R=R?RMRNRnRoRpRqR/RvRwRR(((s1/usr/lib/python2.7/site-packages/yum/update_md.pyR7s    3  K    /   "cCs=tjj|d|d|df|d|d|dfS(s- Compare two "std." tuples, (n, a, e, v, r). iii(Rat miscutilst compareEVR(ttup1ttup2((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt_rpm_tup_vercmps!tUpdateMetadatacBs}eZdZgd d dZd dZeeZdZdZ dZ ddZ dZ d Z d d ZRS( s* The root update metadata object. cCsi|_i|_i|_g|_||_||_x9|D]1}y|j|Wq=tjk rmq=q=Xq=Wt |_ |j j |_ dS(N( t_noticest_cachet _no_cachet_repost_loggerR1taddtErrorst RepoMDErrorR t arch_storagetarchlist(R2treposRR4trepo((s1/usr/lib/python2.7/site-packages/yum/update_md.pyR5s         cCs9|dkr|jjS||jkr5|j|p8gS(s Return all notices. N(R9RtvaluesR(R2R~((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt get_noticess  cCsLt|tgtdfkr6dj|}n|jj|pKdS(si Retrieve an update notice for a given (name, version, release) string or tuple. t-(N(RR_RR8R9(R2tnvr((s1/usr/lib/python2.7/site-packages/yum/update_md.pyt get_notices$c Cs|}|d}|d}g}g}t}x+|j|D]}x|dD]} x| dD]} t} | d|ks| d|kr||kra| d|kra| d|jkrat} qqan| d| d| dpd| d | d f}t||dkrqan| r1|j||fqa|j||f|j|qaWqPWq?Wx6|D].\}}||krd|j||fqdqdW|jd td d dt|S(s Retrieve any update notices which are newer than a given std. pkgtup (name, arch, epoch, version, release) tuple. Returns: list of (pkgtup, notice) that are newer than the given pkgtup, in the order of newest pkgtups first. iiR+RZR~R[RRR RtcmptkeycSs|dS(Ni((tx((s1/usr/lib/python2.7/site-packages/yum/update_md.pyRRstreverse( R`RR-RRLRR{Rtsort( R2tpkgtupt oldpkgtupR~R[R;tother_arch_listtnoticestnoticetupkgRlt other_arch((s1/usr/lib/python2.7/site-packages/yum/update_md.pytget_applicable_noticess6    /  c Cs| s|d rtS|d|jkrK|j|d}||krJtSt}x#|dD]}|j|dq^WxJ|dD]>}|d|krqn|j|d|dj|qWt}x#|dD]}|j|dqWxJ|dD]>}|d|krqn|j|d|dj|qW|}n||j|d s (twriteRRR(R2tfileobjRGRtend((s1/usr/lib/python2.7/site-packages/yum/update_md.pyRus N(RRRR9R5RtpropertyRRRRRRpRoR(((s1/usr/lib/python2.7/site-packages/yum/update_md.pyRs    % 2 5  cCsddl}|jjd}ttjdkrA|nyItjdGHt}x"tjdD]}|j|qgWt|GHWn=t k rtj dtjdtjdfIJ|nXdS(s update_md test function. iNcSs)tjdtjdIJtjddS(NsUsage: %s ...ii(RRtargvtexit(((s1/usr/lib/python2.7/site-packages/yum/update_md.pytusagesiis%s: No such file:'%s'i( tyum.misctmisct setup_localeR]RRRRRtIOErrorR(tyumRtumtsrcfile((s1/usr/lib/python2.7/site-packages/yum/update_md.pytmains       t__main__(!RRtyum.i18nRRRRt yum.yumRepoRt yum.packagesRRRRRR R RRDtrpmUtils.miscutilsRat rpmUtils.archR R9Rt ExceptionRtobjectRRRRR(((s1/usr/lib/python2.7/site-packages/yum/update_md.pyts& "    u   PK[B/(/(site-packages/yum/depsolve.pynuȯ#!/usr/bin/python -t # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University """ Dependency resolution module for yum. """ import os.path import types import logging import rpmUtils.transaction import rpmUtils.miscutils from rpmUtils.arch import archDifference, canCoinstall import misc from misc import unique, version_tuple_to_string from transactioninfo import TransactionMember import rpm from packageSack import ListPackageSack from packages import PackageEVR from constants import * import logginglevels import Errors import warnings warnings.simplefilter("ignore", Errors.YumFutureDeprecationWarning) from weakref import proxy as weakref from yum import _, _rpm_ver_atleast try: assert max(2, 4) == 4 except: # Python-2.4.x doesn't have min/max ... *sigh* def min(x, *args): for y in args: if x > y: x = y return x def max(x, *args): for y in args: if x < y: x = y return x flags = {"GT": rpm.RPMSENSE_GREATER, "GE": rpm.RPMSENSE_EQUAL | rpm.RPMSENSE_GREATER, "LT": rpm.RPMSENSE_LESS, "LE": rpm.RPMSENSE_LESS | rpm.RPMSENSE_EQUAL, "EQ": rpm.RPMSENSE_EQUAL, None: 0 } _rflags = {} for f in flags: _rflags[flags[f]] = f class _wrap_ayum_getPkgSack: """ This is a wrapper for calling YumBase.pkgSack because otherwise we take a real reference through the bound method and that is d00m (this applies to YumBase and TransactionInfo, hence why we have a separate class). """ def __init__(self, ayum): self.ayum = weakref(ayum) def __call__(self): return self.ayum.pkgSack class _wrap_ayum_install: """ This is a wrapper for calling YumBase.install because otherwise we take a real reference through the bound method and that is d00m (this applies to YumBase and TransactionInfo, hence why we have a separate class). """ def __init__(self, ayum): self.ayum = weakref(ayum) def __call__(self, *args, **kwargs): return self.ayum.install(*args, **kwargs) class _wrap_ayum_remove: """ This is a wrapper for calling YumBase.remove because otherwise we take a real reference through the bound method and that is d00m (this applies to YumBase and TransactionInfo, hence why we have a separate class). """ def __init__(self, ayum): self.ayum = weakref(ayum) def __call__(self, *args, **kwargs): return self.ayum.remove(*args, **kwargs) class _wrap_ayum_update: """ This is a wrapper for calling YumBase.update because otherwise we take a real reference through the bound method and that is d00m (this applies to YumBase and TransactionInfo, hence why we have a separate class). """ def __init__(self, ayum): self.ayum = weakref(ayum) def __call__(self, *args, **kwargs): return self.ayum.update(*args, **kwargs) class Depsolve(object): """A class for resolving dependencies.""" def __init__(self): self._ts = None self._tsInfo = None self.dsCallback = None # Callback-style switch, default to legacy (hdr, file) mode self.use_txmbr_in_callback = False self.logger = logging.getLogger("yum.Depsolve") self.verbose_logger = logging.getLogger("yum.verbose.Depsolve") self.path = [] self.loops = [] self.installedFileRequires = None self.installedUnresolvedFileRequires = None self._missing_requires = False def doTsSetup(self): """Sets up the transaction set before it is used.""" warnings.warn(_('doTsSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) return self._getTs() def _getTs(self, remove_only=False): """setup all the transaction set storage items we'll need This can't happen in __init__ b/c we don't know our installroot yet""" if self._tsInfo != None and self._ts != None: if not remove_only and self._tsInfo.pkgSack is None: pkgSackCtor = _wrap_ayum_getPkgSack(self) self._tsInfo.setDatabases(self.rpmdb, None, pkgSackCtor) return if not self.conf.installroot: raise Errors.YumBaseError, _('Setting up TransactionSets before config class is up') self._getTsInfo(remove_only) self.initActionTs() def _getTsInfo(self, remove_only=False): """ remove_only param. says if we are going to do _only_ remove(s) in the transaction. If so we don't need to setup the remote repos. """ if self._tsInfo is None: self._tsInfo = self._transactionDataFactory() if remove_only: pkgSack = None pkgSackCtor = None else: # Don't instant setup, or things like localinstall are screwed. pkgSack = None pkgSackCtor = _wrap_ayum_getPkgSack(self) self._tsInfo.setDatabases(self.rpmdb, pkgSack, pkgSackCtor) self._tsInfo.installonlypkgs = self.conf.installonlypkgs # this kinda sucks # this REALLY sucks, sadly (needed for group conditionals) self._tsInfo.install_method = _wrap_ayum_install(self) self._tsInfo.update_method = _wrap_ayum_update(self) self._tsInfo.remove_method = _wrap_ayum_remove(self) return self._tsInfo def _setTsInfo(self, value): self._tsInfo = value def _delTsInfo(self): self._tsInfo = None def _getActionTs(self): if not self._ts: self.initActionTs() return self._ts def initActionTs(self): """Set up the transaction set that will be used for all the work.""" # LOL, override rpm transaction macro. # Must be done before rpmtsCreate() if self.conf.override_install_langs: old_install_langs = rpm.expandMacro("%_install_langs") rpm.expandMacro("%define _install_langs " + self.conf.override_install_langs) self._ts = rpmUtils.transaction.TransactionWrapper(self.conf.installroot) ts_flags_to_rpm = { 'noscripts': rpm.RPMTRANS_FLAG_NOSCRIPTS, 'notriggers': rpm.RPMTRANS_FLAG_NOTRIGGERS, 'nodocs': rpm.RPMTRANS_FLAG_NODOCS, 'test': rpm.RPMTRANS_FLAG_TEST, 'justdb': rpm.RPMTRANS_FLAG_JUSTDB, 'repackage': rpm.RPMTRANS_FLAG_REPACKAGE} # This is only in newer rpm.org releases if hasattr(rpm, 'RPMTRANS_FLAG_NOCONTEXTS'): ts_flags_to_rpm['nocontexts'] = rpm.RPMTRANS_FLAG_NOCONTEXTS self._ts.setFlags(0) # reset everything. for flag in self.conf.tsflags: if flag in ts_flags_to_rpm: self._ts.addTsFlag(ts_flags_to_rpm[flag]) else: self.logger.critical(_('Invalid tsflag in config file: %s'), flag) if not self.conf.diskspacecheck: self._add_prob_flags(rpm.RPMPROB_FILTER_DISKSPACE, rpm.RPMPROB_FILTER_DISKNODES) probfilter = 0 for flag in self.tsInfo.probFilterFlags: probfilter |= flag self._ts.setProbFilter(probfilter) def whatProvides(self, name, flags, version): """Search the packageSacks for what provides the specified feature or file. :param name: a string specifying the file or feature to search for :param flags: flags related to the search :param version: the version to search for :return: a :class:`ListPackagaSack` containing the packages that match the arguments, and may be empty """ self.verbose_logger.log(logginglevels.DEBUG_1, _('Searching pkgSack for dep: %s'), name) defSack = ListPackageSack(self.pkgSack.searchProvides((name, flags, version))) return defSack def allowedMultipleInstalls(self, po): """Return whether the given package object can be installed multiple times with different versions. For example, this would be true of kernels and kernel modules. :param po: the package object that this function will determine whether can be install multiple times :return: a boolean specifying whether *po* can be installed multiple times """ iopkgs = set(self.conf.installonlypkgs) if po.name in iopkgs: return True for prov in po.provides_names: if prov in iopkgs: return True return False def populateTs(self, test=0, keepold=1): """Populate the transaction set. :param test: unused :param keepold: whether to keep old packages """ if self.dsCallback: self.dsCallback.transactionPopulation() ts_elem = {} if self.ts.ts is None: self.initActionTs() if keepold: for te in self.ts: epoch = te.E() if epoch is None: epoch = '0' pkginfo = (te.N(), te.A(), epoch, te.V(), te.R()) if te.Type() == 1: mode = 'i' elif te.Type() == 2: mode = 'e' ts_elem[(pkginfo, mode)] = 1 for txmbr in self.tsInfo.getMembers(): self.verbose_logger.log(logginglevels.DEBUG_3, _('Member: %s'), txmbr) if txmbr.ts_state in ['u', 'i']: if (txmbr.pkgtup, 'i') in ts_elem: continue rpmfile = txmbr.po.localPkg() if os.path.exists(rpmfile): hdr = txmbr.po.returnHeaderFromPackage() else: self.downloadHeader(txmbr.po) hdr = txmbr.po.returnLocalHeader() if txmbr.ts_state == 'u': if self.allowedMultipleInstalls(txmbr.po): self.verbose_logger.log(logginglevels.DEBUG_2, _('%s converted to install'), txmbr.po) txmbr.ts_state = 'i' txmbr.output_state = TS_INSTALL # New-style callback with just txmbr instead of full headers? if self.use_txmbr_in_callback: cbkey = txmbr else: cbkey = (hdr, rpmfile) self.ts.addInstall(hdr, cbkey, txmbr.ts_state) self.verbose_logger.log(logginglevels.DEBUG_1, _('Adding Package %s in mode %s'), txmbr.po, txmbr.ts_state) if self.dsCallback: dscb_ts_state = txmbr.ts_state if dscb_ts_state == 'u' and txmbr.downgrades: dscb_ts_state = 'd' self.dsCallback.pkgAdded(txmbr.pkgtup, dscb_ts_state) elif txmbr.ts_state in ['e']: if (txmbr.pkgtup, txmbr.ts_state) in ts_elem: continue self.ts.addErase(txmbr.po.idx) if self.dsCallback: if txmbr.downgraded_by: continue self.dsCallback.pkgAdded(txmbr.pkgtup, 'e') self.verbose_logger.log(logginglevels.DEBUG_1, _('Removing Package %s'), txmbr.po) def _dscb_procReq(self, po, niceformatneed): """ Call the callback for processing requires, call the nicest one available. """ if not self.dsCallback: return if hasattr(self.dsCallback, 'procReqPo'): self.dsCallback.procReqPo(po, niceformatneed) else: self.dsCallback.procReq(po.name, niceformatneed) def _processReq(self, po, requirement): """processes a Requires dep from the resolveDeps functions, returns a tuple of (CheckDeps, missingdep, conflicts, errors) the last item is an array of error messages""" errormsgs = [] needname, flags, needversion = requirement niceformatneed = rpmUtils.miscutils.formatRequire(needname, needversion, flags) self.verbose_logger.log(logginglevels.DEBUG_1, _('%s requires: %s'), po, niceformatneed) self._dscb_procReq(po, niceformatneed) try: if po.repo.id != "installed": CheckDeps, missingdep = self._requiringFromTransaction(po, requirement, errormsgs) else: CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, errormsgs) # Check packages with problems if missingdep: self.po_with_problems.add((po,self._working_po,errormsgs[-1])) except Errors.DepError,e: # FIXME: This is a hack, it don't solve the problem # of tries to update to a package the have been removed from the # pkgSack because of dep problems. # The real solution is to remove the package from the updates, when # it is remove from the pkgSack self.po_with_problems.add((po,self._working_po,str(e))) CheckDeps = 1 missingdep = 0 return (CheckDeps, missingdep, errormsgs) @staticmethod def _prco_req_nfv2req(rn, rf, rv): return (rn, flags[rf], version_tuple_to_string(rv)) def _prco_req2req(self, req): return self._prco_req_nfv2req(req[0], req[1], req[2]) def _err_missing_requires(self, reqPo, reqTup): self._missing_requires = True if hasattr(self.dsCallback, 'format_missing_requires'): msg = self.dsCallback.format_missing_requires(reqPo, reqTup) if msg is not None: # PK return self.dsCallback.format_missing_requires(reqPo, reqTup) (needname, needflags, needversion) = reqTup ui_req = rpmUtils.miscutils.formatRequire(needname, needversion, needflags) return _('%s requires %s') % (reqPo, ui_req) def _requiringFromInstalled(self, requiringPo, requirement, errorlist): """processes the dependency resolution for a dep where the requiring package is installed""" checkdeps = 0 missingdep = 0 if self.tsInfo.getMembersWithState(requiringPo.pkgtup, TS_REMOVE_STATES): return checkdeps, missingdep name, arch, epoch, ver, rel = requiringPo.pkgtup needname, needflags, needversion = requirement niceformatneed = rpmUtils.miscutils.formatRequire(needname, needversion, needflags) # we must first find out why the requirement is no longer there # we must find out what provides/provided it from the rpmdb (if anything) # then check to see if that thing is being acted upon by the transaction set # if it is then we need to find out what is being done to it and act accordingly needmode = None # mode in the transaction of the needed pkg (if any) needpo = None providers = [] if (needname, needflags, needversion) in self.cheaterlookup: self.verbose_logger.log(logginglevels.DEBUG_2, _('Needed Require has already been looked up, cheating')) cheater_po = self.cheaterlookup[(needname, needflags, needversion)] providers = [cheater_po] elif self.rpmdb.contains(name=needname): txmbrs = self.tsInfo.matchNaevr(name=needname) for txmbr in txmbrs: providers.append(txmbr.po) else: self.verbose_logger.log(logginglevels.DEBUG_2, _('Needed Require is not a package name. Looking up: %s'), niceformatneed) providers = self.rpmdb.getProvides(needname, needflags, needversion) for inst_po in providers: self._working_po = inst_po # store the last provider inst_str = '%s.%s %s:%s-%s' % inst_po.pkgtup (i_n, i_a, i_e, i_v, i_r) = inst_po.pkgtup self.verbose_logger.log(logginglevels.DEBUG_2, _('Potential Provider: %s'), inst_str) thismode = self.tsInfo.getMode(name=i_n, arch=i_a, epoch=i_e, ver=i_v, rel=i_r) if thismode is None and i_n in self.conf.exactarchlist: # check for mode by the same name+arch thismode = self.tsInfo.getMode(name=i_n, arch=i_a) if thismode is None and i_n not in self.conf.exactarchlist: # check for mode by just the name thismode = self.tsInfo.getMode(name=i_n) # if this package is being obsoleted, it's just like if it's # being upgraded as far as checking for other providers if thismode is None: if filter(lambda x: x.obsoleted_by, self.tsInfo.matchNaevr(i_n, i_a, i_e, i_v, i_r)): thismode = 'u' if thismode is not None: needmode = thismode self.cheaterlookup[(needname, needflags, needversion)] = inst_po self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode is %s for provider of %s: %s'), needmode, niceformatneed, inst_str) break self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode for pkg providing %s: %s'), niceformatneed, needmode) if needmode in ['ud']: # the thing it needs is being updated or obsoleted away # try to update the requiring package in hopes that all this problem goes away :( self.verbose_logger.log(logginglevels.DEBUG_2, _('Trying to update %s to resolve dep'), requiringPo) # if the required pkg was updated, not obsoleted, then try to # only update the requiring po origobs = self.conf.obsoletes self.conf.obsoletes = 0 txmbrs = self.update(po=requiringPo, requiringPo=requiringPo) self.conf.obsoletes = origobs def _check_update_worked(txmbrs, obs=False): # Old code assumed that if there was an update, we were good: # if txmbrs: return True # ..however we have a problem when foo-1 and foo-2 both require # bar-1, and bar-2 is being installed. If the req. is identical # then we'll skip checking it in _checkInstall(), so we need to # check it here. for txmbr in txmbrs: if obs or txmbr.name == requiringPo.name: n,f,v = requirement creq = (n, _rflags[f], rpmUtils.miscutils.stringToVersion(v)) # If it's identical ... checkInstall will skip it. if creq not in txmbr.po.requires: return True return False if not _check_update_worked(txmbrs): txmbrs = self.update(po=requiringPo, requiringPo=requiringPo) if not _check_update_worked(txmbrs, obs=True): msg = self._err_missing_requires(requiringPo, requirement) self.verbose_logger.log(logginglevels.DEBUG_2, _('No update paths found for %s. Failure!'), requiringPo) return self._requiringFromTransaction(requiringPo, requirement, errorlist) checkdeps = 1 if needmode in ['od']: # the thing it needs is being updated or obsoleted away # try to update the requiring package in hopes that all this problem goes away :( self.verbose_logger.log(logginglevels.DEBUG_2, _('Trying to update %s to resolve dep'), requiringPo) txmbrs = self.update(po=requiringPo, requiringPo=requiringPo) fixed = False if not txmbrs: msg = self._err_missing_requires(requiringPo, requirement) self.verbose_logger.log(logginglevels.DEBUG_2, _('No update paths found for %s. Failure due to requirement: %s!'), requiringPo, msg) else: req_lookup = (needname, needflags, rpmUtils.miscutils.stringToVersion(needversion)) for txmbr in txmbrs: # This works for upgrades, and for obsoletes, on one side. # Also catches upgrades that don't work on the other. if txmbr.output_state in TS_INSTALL_STATES: if txmbr.po.checkPrco('requires', req_lookup): fixed = False break else: fixed = True if txmbrs and not fixed: msg = self._err_missing_requires(requiringPo, requirement) self.verbose_logger.log(logginglevels.DEBUG_2, _("Update for %s. Doesn't fix requirement: %s!"), requiringPo, msg) if not fixed: return self._requiringFromTransaction(requiringPo, requirement, errorlist) checkdeps = 1 if needmode in ['e']: self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: %s package requiring %s marked as erase'), requiringPo, needname) txmbrs = self.remove(po=requiringPo) for txmbr in txmbrs: txmbr.setAsDep(po=inst_po) checkdeps = 1 if needmode in ['i', 'u']: newupdates = self.update(name=name, epoch=epoch, version=ver, release=rel, requiringPo=requiringPo) txmbrs = self.tsInfo.getMembersWithState(requiringPo.pkgtup, TS_REMOVE_STATES) if newupdates and txmbrs: if txmbrs[0].output_state == TS_OBSOLETED: self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: Obsoleting %s with %s to resolve dep.'), requiringPo, txmbrs[0].obsoleted_by[0]) else: self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: Updating %s to resolve dep.'), requiringPo) # If the requirement is still there, try and solve it again # so we don't lose it for pkg in txmbrs[0].updated_by: if requirement in map(self._prco_req2req, pkg.returnPrco('requires')): return True, missingdep + self._requiringFromTransaction(pkg, requirement, errorlist)[1] checkdeps = True return checkdeps, missingdep self.verbose_logger.log(logginglevels.DEBUG_2, _('Cannot find an update path for dep for: %s'), niceformatneed) return self._requiringFromTransaction(requiringPo, requirement, errorlist) if needmode is None: reqpkg = (name, ver, rel, None) if self.pkgSack is None: return self._requiringFromTransaction(requiringPo, requirement, errorlist) else: msg = self._err_missing_requires(requiringPo, requirement) self.verbose_logger.log(logginglevels.DEBUG_2, msg) checkdeps = 0 missingdep = 1 errorlist.append(msg) return checkdeps, missingdep def _quickWhatProvides(self, name, flags, version): if self._last_req is None: return False if flags == 0: flags = None if type(version) in (types.StringType, types.NoneType, types.UnicodeType): (r_e, r_v, r_r) = rpmUtils.miscutils.stringToVersion(version) elif type(version) in (types.TupleType, types.ListType): # would this ever be a ListType? (r_e, r_v, r_r) = version # Quick lookup, lots of reqs for one pkg: po = self._last_req if po.checkPrco('provides', (name, flags, (r_e, r_v, r_r))): self.verbose_logger.debug(_('Quick matched %s to require for %s'), po, name) return True return False def _requiringFromTransaction(self, requiringPo, requirement, errorlist): """processes the dependency resolution for a dep where requiring package is in the transaction set""" (name, arch, epoch, version, release) = requiringPo.pkgtup (needname, needflags, needversion) = requirement checkdeps = 0 missingdep = 0 upgraded = {} #~ - if it's not available from some repository: #~ - mark as unresolveable. # #~ - if it's available from some repo: #~ - if there is an another version of the package currently installed then # - if the other version is marked in the transaction set # - if it's marked as erase # - mark the dep as unresolveable # - if it's marked as update or install # - check if the version for this requirement: # - if it is higher # - mark this version to be updated/installed # - remove the other version from the transaction set # - tell the transaction set to be rebuilt # - if it is lower # - mark the dep as unresolveable # - if they are the same # - be confused but continue if self._quickWhatProvides(needname, needflags, needversion): return checkdeps, missingdep provSack = self.whatProvides(needname, needflags, needversion) # get rid of things that are already in the rpmdb - b/c it's pointless to use them here for pkg in provSack.returnPackages(): if self.rpmdb.contains(po=pkg): # is it already installed? self.verbose_logger.log(logginglevels.DEBUG_2, _('%s is in providing packages but it is already installed, removing.'), pkg) provSack.delPackage(pkg) continue # we need to check to see, if we have anything similar to it (name-wise) # installed or in the ts, and this isn't a package that allows multiple installs # then if it's newer, fine - continue on, if not, then we're unresolveable # cite it and exit tspkgs = [] if not self.allowedMultipleInstalls(pkg): # from ts tspkgs = self.tsInfo.matchNaevr(name=pkg.name) for tspkg in tspkgs: if not canCoinstall(pkg.arch, tspkg.po.arch): # a comparable arch if tspkg.po.verGT(pkg): msg = _('Potential resolving package %s has newer instance in ts.') % pkg self.verbose_logger.log(logginglevels.DEBUG_2, msg) provSack.delPackage(pkg) continue elif tspkg.po.verLT(pkg): upgraded.setdefault(pkg.pkgtup, []).append(tspkg.pkgtup) # from rpmdb dbpkgs = self.rpmdb.searchNevra(name=pkg.name) for dbpkg in dbpkgs: if dbpkg.verGT(pkg) and not canCoinstall(pkg.arch, dbpkg.arch): msg = _('Potential resolving package %s has newer instance installed.') % pkg self.verbose_logger.log(logginglevels.DEBUG_2, msg) provSack.delPackage(pkg) continue if len(provSack) == 0: # unresolveable missingdep = 1 msg = self._err_missing_requires(requiringPo, requirement) errorlist.append(msg) return checkdeps, missingdep # iterate the provSack briefly, if we find the package is already in the # tsInfo then just skip this run for pkg in provSack.returnPackages(): (n,a,e,v,r) = pkg.pkgtup pkgmode = self.tsInfo.getMode(name=n, arch=a, epoch=e, ver=v, rel=r) if pkgmode in ['i', 'u']: self.verbose_logger.log(logginglevels.DEBUG_2, _('%s already in ts, skipping this one'), pkg) self._last_req = pkg return checkdeps, missingdep # find the best one # try updating the already install pkgs results = [] for pkg in provSack.returnNewestByName(): tresults = self.update(requiringPo=requiringPo, name=pkg.name, epoch=pkg.epoch, version=pkg.version, rel=pkg.rel) # Note that this does "interesting" things with multilib. We can # have say A.i686 and A.x86_64, and if we hit "A.i686" first, # .update() will actually update "A.x86_64" which will then fail # the pkg == txmbr.po test below, but then they'll be nothing to # update when we get around to A.x86_64 ... so this entire loop # fails. # Keeping results through the loop and thus. testing each pkg # against all txmbr's from previous runs "fixes" this. results.extend(tresults) for txmbr in results: if pkg == txmbr.po: checkdeps = True self._last_req = pkg return checkdeps, missingdep pkgs = provSack.returnPackages() if len(pkgs) == 1: # Minor opt. best = pkgs[0] else: # Always do compare providers for multiple pkgs, it deals with # newest etc. ... so no need to do NewestNameArch() ... and it # stops compare_providers from being clever. pkgresults = self._compare_providers(pkgs, requiringPo,req=needname) best = pkgresults[0][0] if self.rpmdb.contains(po=best): # is it already installed? missingdep = 1 checkdeps = 0 msg = self._err_missing_requires(requiringPo, requirement) errorlist.append(msg) return checkdeps, missingdep # FIXME - why can't we look up in the transaction set for the requiringPkg # and know what needs it that way and provide a more sensible dep structure in the txmbr inst = self.rpmdb.searchNevra(name=best.name, arch=best.arch) if len(inst) > 0: self.verbose_logger.debug(_('TSINFO: Marking %s as update for %s') %(best, requiringPo)) # FIXME: we should probably handle updating multiple packages... txmbr = self.tsInfo.addUpdate(best, inst[0]) txmbr.setAsDep(po=requiringPo) if 'reason' in inst[0].yumdb_info: txmbr.reason = inst[0].yumdb_info.reason else: txmbr.reason = 'dep' checkdeps = True self._last_req = best else: self.verbose_logger.debug(_('TSINFO: Marking %s as install for %s'), best, requiringPo) reqtuple = misc.string_to_prco_tuple(needname + str(needflags) + needversion) txmbrs = self.install(best, provides_for=reqtuple) for txmbr in txmbrs: txmbr.setAsDep(po=requiringPo) txmbr.reason = "dep" self._last_req = txmbr.po # if we had other packages with this name.arch that we found # before, they're not going to be installed anymore, so we # should mark them to be re-checked if txmbr.pkgtup in upgraded: map(self.tsInfo.remove, upgraded[txmbr.pkgtup]) if not txmbrs: missingdep = 1 checkdeps = 0 msg = self._err_missing_requires(requiringPo, requirement) errorlist.append(msg) else: checkdeps = 1 return checkdeps, missingdep def _dscb_procConflict(self, po, niceformatneed): """ Call the callback for processing requires, call the nicest one available. """ if not self.dsCallback: return if hasattr(self.dsCallback, 'procConflictPo'): self.dsCallback.procConflictPo(po, niceformatneed) else: self.dsCallback.procConflict(po.name, niceformatneed) def _processConflict(self, po, conflict, conflicting_po): """processes a Conflict dep from the resolveDeps() method""" CheckDeps = True errormsgs = [] needname, flags, needversion = conflict (name, arch, epoch, ver, rel) = po.pkgtup niceformatneed = rpmUtils.miscutils.formatRequire(needname, needversion, flags) self._dscb_procConflict(po, niceformatneed) length = len(self.tsInfo) if flags & rpm.RPMSENSE_LESS: self.update(name=conflicting_po.name) txmbrs = self.tsInfo.getMembersWithState(conflicting_po.pkgtup, TS_REMOVE_STATES) if len(self.tsInfo) != length and txmbrs: return CheckDeps, errormsgs elif flags & rpm.RPMSENSE_GREATER: self.update(name=name) txmbrs = self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES) if len(self.tsInfo) != length and txmbrs: return CheckDeps, errormsgs self.update(name=conflicting_po.name) txmbrs = self.tsInfo.getMembersWithState(conflicting_po.pkgtup, TS_REMOVE_STATES) if len(self.tsInfo) != length and txmbrs: return CheckDeps, errormsgs self.update(name=name) txmbrs = self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES) if len(self.tsInfo) != length and txmbrs: return CheckDeps, errormsgs msg = '%s conflicts with %s' % (name, str(conflicting_po)) errormsgs.append(msg) self.verbose_logger.log(logginglevels.DEBUG_1, msg) CheckDeps = False # report the conflicting po, so skip-broken can remove it self.po_with_problems.add((po,conflicting_po,errormsgs[-1])) return CheckDeps, errormsgs def _undoDepInstalls(self): # clean up after ourselves in the case of failures for txmbr in self.tsInfo: if txmbr.isDep: self.tsInfo.remove(txmbr.pkgtup) def prof_resolveDeps(self): """Call :func:`resolveDeps`, and profile the call using the hotshot profiler. :return: a tuple containing the result code and a list of result strings. This is simply the return value of :func:`resolveDeps` being passed up. """ fn = "anaconda.prof.0" import hotshot, hotshot.stats prof = hotshot.Profile(fn) rc = prof.runcall(self.resolveDeps) prof.close() print "done running depcheck" stats = hotshot.stats.load(fn) stats.strip_dirs() stats.sort_stats('time', 'calls') stats.print_stats(20) return rc def cprof_resolveDeps(self): """Call :func:`resolveDeps`, and profile the call using the cprof profiler. :return: a tuple containing the result code and a list of result strings. This is simply the return value of :func:`resolveDeps` being passed up. """ import cProfile, pstats prof = cProfile.Profile() rc = prof.runcall(self.resolveDeps) prof.dump_stats("yumprof") print "done running depcheck" p = pstats.Stats('yumprof') p.strip_dirs() p.sort_stats('time') p.print_stats(20) return rc def resolveDeps(self, full_check=True, skipping_broken=False): """Resolve dependencies for the packages in the current trasaction set. :param full_check: whether to also check removes and installs, as well as dependencies :param skipping_broken: if this is true, a message saying that dependency solving has finished successfully will not be output. This is useful since if there are broken packages that are being skipped, :func:`resolveDeps` will need to be called multiple times before dependency solving is completely finished """ if not len(self.tsInfo): return (0, [_('Success - empty transaction')]) self.po_with_problems = set() self._working_po = None self._last_req = None self.tsInfo.resetResolved(hard=False) CheckDeps = True CheckRemoves = full_check CheckInstalls = full_check missingdep = 0 errors = [] if self.dsCallback: self.dsCallback.start() depsolve_loop_count = 0 while True: if depsolve_loop_count == (self.conf.depsolve_loop_limit or -1): return (1, [_("Depsolving loop limit reached.")] + unique(errors)) depsolve_loop_count += 1 CheckDeps = True # check Requires while CheckDeps: self.cheaterlookup = {} if self.dsCallback: self.dsCallback.tscheck() CheckDeps, checkinstalls, checkremoves, missing = self._resolveRequires(errors) CheckInstalls |= checkinstalls CheckRemoves |= checkremoves # check global FileRequires self._working_po = None # reset the working po if CheckRemoves: CheckRemoves = False for po, dep in self._checkFileRequires(): (checkdep, missing, errormsgs) = self._processReq(po, dep) CheckDeps |= checkdep errors += errormsgs if CheckDeps: if self.dsCallback: self.dsCallback.restartLoop() self.verbose_logger.log(logginglevels.DEBUG_1, _('Restarting Loop')) continue # check Conflicts self._working_po = None # reset the working po if CheckInstalls: CheckInstalls = False for conflict in self._checkConflicts(): (checkdep, errormsgs) = self._processConflict(*conflict) CheckDeps |= checkdep errors += errormsgs if checkdep: break # The next conflict might be the same pkg if True: # Always have to check obsoletes... if self._checkObsoletes(): CheckDeps = True CheckRemoves = True self._last_req = None if CheckDeps: if self.dsCallback: self.dsCallback.restartLoop() self.verbose_logger.log(logginglevels.DEBUG_1, _('Restarting Loop')) continue break # FIXME: this doesn't belong here at all... for txmbr in self.tsInfo.getMembers(): if self.allowedMultipleInstalls(txmbr.po) and \ txmbr.ts_state == 'u': self.verbose_logger.log(logginglevels.DEBUG_2, _('%s converted to install'), txmbr.po) txmbr.ts_state = 'i' txmbr.output_state = TS_INSTALL if self.dsCallback: if not self.conf.skip_broken: self.dsCallback.end() elif not skipping_broken and not errors: self.dsCallback.end() self.verbose_logger.log(logginglevels.DEBUG_1, _('Dependency Process ending')) self.tsInfo.changed = False if len(errors) > 0: errors = unique(errors) # We immediately display this in cli, so don't show it twice. # Plus skip-broken can get here N times. Might be worth keeping # around for debugging? done = set() # Same as the unique above for po,wpo,err in self.po_with_problems: if (po,err) in done: continue done.add((po, err)) self.verbose_logger.log(logginglevels.DEBUG_4, "SKIPBROKEN: %s from %s has depsolving problems" % (po, po.repoid)) err = err.replace('\n', '\n --> ') self.verbose_logger.log(logginglevels.DEBUG_4,"SKIPBROKEN: --> %s" % err) return (1, errors) if not len(self.tsInfo): return (0, [_('Success - empty transaction')]) return (2, [_('Success - deps resolved')]) def _resolveRequires(self, errors): any_missing = False CheckDeps = False CheckInstalls = False CheckRemoves = False # we need to check the opposite of install and remove for regular # tsInfo members vs removed members for txmbr in self.tsInfo.getUnresolvedMembers(): if self.dsCallback and txmbr.ts_state: dscb_ts_state = txmbr.ts_state if txmbr.downgrades: dscb_ts_state = 'd' if dscb_ts_state == 'u' and txmbr.reinstall: dscb_ts_state = 'r' if dscb_ts_state == 'u': if txmbr.output_state == TS_OBSOLETING: dscb_ts_state = 'o' elif not txmbr.updates: dscb_ts_state = 'i' self.dsCallback.pkgAdded(txmbr.pkgtup, dscb_ts_state) self.verbose_logger.log(logginglevels.DEBUG_2, _("Checking deps for %s") %(txmbr,)) # store the primary po we currently are working on # so we can store it in self.po_with_problems. # it is useful when an update is breaking an require of an installed package # then we want to know who is causing the problem, not just who is having the problem. if not txmbr.updates and txmbr.relatedto: self._working_po = txmbr.relatedto[0][0] else: self._working_po = txmbr.po if (txmbr.output_state in TS_INSTALL_STATES) == (txmbr.po.state != None): thisneeds = self._checkInstall(txmbr) CheckInstalls = True else: thisneeds = self._checkRemove(txmbr) CheckRemoves = True missing_in_pkg = False for po, dep in thisneeds: if txmbr.downgraded_by: # Don't try to chain remove downgrades msg = self._err_missing_requires(po, dep) self.verbose_logger.log(logginglevels.DEBUG_2, msg) errors.append(msg) self.po_with_problems.add((po,self._working_po,errors[-1])) missing_in_pkg = 1 continue (checkdep, missing, errormsgs) = self._processReq(po, dep) CheckDeps |= checkdep errors += errormsgs missing_in_pkg |= missing if not missing_in_pkg: self.tsInfo.markAsResolved(txmbr) any_missing |= missing_in_pkg return CheckDeps, CheckInstalls, CheckRemoves, any_missing @staticmethod def _sort_req_key(pkgtup): """ Get a sort key for a package requires from most "narrow" to least, this tries to ensure that if we have two reqs like "libfoo = 1.2.3-4" and "foo-api" (which is also provided by libxyz-foo) that we'll get just libfoo. There are other similar cases this "handles".""" mapper = {'EQ' : 1, 'LT' : 2, 'LE' : 3, 'GT' : 4, 'GE' : 5, None : 99} flagscore = mapper.get(pkgtup[1], 10) # This is pretty magic, basically we want an explicit: # # Requires: foo # # ...to happen before the implicit: # # Requires: libfoo.so.0() # # ...because sometimes the libfoo.so.0() is provided by multiple # packages. Do we need more magic for other implicit deps. here? namescore = 0 if pkgtup[0].startswith("lib") and \ (pkgtup[0].endswith("()") or pkgtup[0].endswith("()(64bit)")): namescore = 99 # Processes these last return (flagscore, namescore) def _checkInstall(self, txmbr): txmbr_reqs = txmbr.po.returnPrco('requires') # if this is an update, we should check what the old # requires were to make things faster # Note that if the rpmdb is broken, this gets annoying. So we provide # a way to turn it off. oldreqs = [] if not self.conf.recheck_installed_requires: for oldpo in txmbr.updates: oldreqs.extend(oldpo.returnPrco('strong_requires')) oldreqs = set(oldreqs) ret = [] for req in sorted(txmbr_reqs, key=self._sort_req_key): if req[0].startswith('rpmlib('): continue if req in oldreqs: continue self.verbose_logger.log(logginglevels.DEBUG_2, _("looking for %s as a requirement of %s"), req, txmbr) provs = self.tsInfo.getProvides(*req) # The self provides should mostly be caught before here now, but # at least config() crack still turns up, it's not that # expensive to just do it, and we really don't want "false positive" # requires for compare_providers(). if not provs and not txmbr.po.inPrcoRange('provides', req): ret.append( (txmbr.po, self._prco_req2req(req)) ) continue #Add relationship for po in provs: if txmbr.name == po.name: continue for member in self.tsInfo.getMembersWithState( pkgtup=po.pkgtup, output_states=TS_INSTALL_STATES): member.setAsDep(txmbr.po, relonly=True) return ret def _checkRemove(self, txmbr): po = txmbr.po provs = po.returnPrco('provides') # if this is an update, we should check what the new package # provides to make things faster newpoprovs = {} for newpo in txmbr.updated_by + txmbr.obsoleted_by: for p in newpo.provides: newpoprovs[p] = 1 ret = [] # iterate over the provides of the package being removed # and see what's actually going away for prov in provs: if prov[0].startswith('rpmlib('): # ignore rpmlib() provides continue if prov in newpoprovs: continue # FIXME: This is probably the best place to fix the postfix rename # problem long term (post .21) ... see compare_providers. for pkg, hits in self.tsInfo.getRequires(*prov).iteritems(): # See the docs, this is to make remove* "more useful". if (self.conf.repopkgsremove_leaf_only and txmbr.repopkg and txmbr.output_state == TS_ERASE): cb = self.dsCallback if cb and hasattr(cb, 'repoPkgRemoveReq'): cb.repoPkgRemoveReq(txmbr.po, hits) elif cb and hasattr(cb, 'removeReq'): cb.removeReq(txmbr.po, pkg, hits) # We don't undo anything else here ... hopefully that's # fine. self.tsInfo.remove(txmbr.pkgtup) return [] if (self.conf.groupremove_leaf_only and txmbr.groups and txmbr.output_state == TS_ERASE): cb = self.dsCallback if cb and hasattr(cb, 'groupRemoveReq'): cb.groupRemoveReq(pkg, hits) elif cb and hasattr(cb, 'removeReq'): cb.removeReq(txmbr.po, pkg, hits) # We don't undo anything else here ... hopefully that's # fine. self.tsInfo.remove(txmbr.pkgtup) return [] if (self.conf.remove_leaf_only and txmbr.output_state == TS_ERASE): cb = self.dsCallback if cb and hasattr(cb, 'removeReq'): cb.removeReq(txmbr.po, pkg, hits) # We don't undo anything else here ... hopefully that's # fine. self.tsInfo.remove(txmbr.pkgtup) return [] for hit in hits: # See if the update solves the problem... found = False for newpo in txmbr.updated_by: if newpo.checkPrco('provides', hit): found = True break if found: continue for newpo in txmbr.obsoleted_by: if newpo.checkPrco('provides', hit): found = True break if found: continue # It doesn't, so see what else might... rn, rf, rv = hit if not self.tsInfo.getProvides(rn, rf, rv): ret.append( (pkg, self._prco_req_nfv2req(rn, rf, rv)) ) return ret def _checkFileRequires(self): fileRequires = set() nfileRequires = set() # These need to be looked up in the rpmdb. reverselookup = {} ret = [] # generate list of file requirement in rpmdb if self.installedFileRequires is None: self.installedFileRequires, \ self.installedUnresolvedFileRequires, \ self.installedFileProviders = self.rpmdb.fileRequiresData() # get file requirements from packages not deleted todel = [] for pkgtup, files in self.installedFileRequires.iteritems(): if self._tsInfo.getMembersWithState(pkgtup, output_states=TS_REMOVE_STATES): todel.append(pkgtup) else: fileRequires.update(files) for filename in files: reverselookup.setdefault(filename, []).append(pkgtup) for pkgtup in todel: del self.installedFileRequires[pkgtup] fileRequires -= self.installedUnresolvedFileRequires # get file requirements from new packages for txmbr in self._tsInfo.getMembersWithState(output_states=TS_INSTALL_STATES): files = [] for name, flag, evr in txmbr.po.requires: if name.startswith('/'): files.append(name) # check if file requires was already unresolved in update if name in self.installedUnresolvedFileRequires: already_broken = False for oldpo in txmbr.updates: if oldpo.checkPrco('requires', (name, None, (None, None, None))): already_broken = True break if already_broken: continue if name not in fileRequires: nfileRequires.add(name) fileRequires.add(name) reverselookup.setdefault(name, []).append(txmbr.po.pkgtup) self.installedFileRequires[txmbr.po.pkgtup] = files todel = [] for fname in self.installedFileProviders: niFP_fname = [] for pkgtup in self.installedFileProviders[fname]: if self._tsInfo.getMembersWithState(pkgtup, output_states=TS_REMOVE_STATES): continue niFP_fname.append(pkgtup) if not niFP_fname: todel.append(fname) continue self.installedFileProviders[fname] = niFP_fname for fname in todel: del self.installedFileProviders[fname] # check the file requires iFP = self.installedFileProviders for filename in fileRequires: # In theory we need this to be: # # nprov, filename in iFP (or new), oprov # # ...this keeps the cache exactly the same as the non-cached data. # However that also means that we'll always need the filelists, so # we do: # # filename in iFP (if found return), oprov (if found return), # nprov # # ...this means we'll always get the same _result_ (as we only need # to know if _something_ provides), but our cache will be off on # what does/doesn't provide the file. if filename in self.installedFileProviders: continue oprov = self.tsInfo.getOldProvides(filename) if oprov: iFP.setdefault(filename, []).extend([po.pkgtup for po in oprov]) continue nprov = self.tsInfo.getNewProvides(filename) if nprov: iFP.setdefault(filename, []).extend([po.pkgtup for po in nprov]) continue if filename != os.path.realpath(filename): realpath = os.path.realpath(filename) nprov = self.tsInfo.getNewProvides(realpath) if nprov: iFP.setdefault(realpath, []).extend([po.pkgtup for po in nprov]) continue for pkgtup in reverselookup[filename]: po = self.tsInfo.getMembersWithState(pkgtup, TS_INSTALL_STATES) if po: po = po[0].po # Should only have one else: po = self.getInstalledPackageObject(pkgtup) ret.append( (po, (filename, 0, '')) ) self.rpmdb.transactionCacheFileRequires(self.installedFileRequires, self.installedUnresolvedFileRequires, self.installedFileProviders, ret) return ret def _checkConflicts(self): ret = [ ] cpkgs = [] for po in self.rpmdb.returnConflictPackages(): if self.tsInfo.getMembersWithState(po.pkgtup, output_states=TS_REMOVE_STATES): continue conflicts = po.returnPrco('conflicts') if not conflicts: # We broke this due to dbMatch() usage. continue cpkgs.append(po) for conflict in conflicts: (r, f, v) = conflict for conflicting_po in self.tsInfo.getNewProvides(r, f, v): if conflicting_po.pkgtup[0] == po.pkgtup[0] and conflicting_po.pkgtup[2:] == po.pkgtup[2:]: continue ret.append( (po, self._prco_req_nfv2req(r, f, v), conflicting_po) ) for txmbr in self.tsInfo.getMembersWithState(output_states=TS_INSTALL_STATES): po = txmbr.po done = False for conflict in txmbr.po.returnPrco('conflicts'): if not done: cpkgs.append(txmbr.po) done = True (r, f, v) = conflict for conflicting_po in self.tsInfo.getProvides(r, f, v): if conflicting_po.pkgtup[0] == po.pkgtup[0] and conflicting_po.pkgtup[2:] == po.pkgtup[2:]: continue ret.append( (po, self._prco_req_nfv2req(r, f, v), conflicting_po) ) if _rpm_ver_atleast((4, 9, 0)): return ret # Don't need the conflicts cache anymore self.rpmdb.transactionCacheConflictPackages(cpkgs) return ret # This is checking for installed / transaction members which # obsolete each other. Because rpm will now auto. obs. those # anyway (even if we have obsoletes turned off). def _checkObsoletes(self): opkgs = [] ret = False def _do_obs(otxmbr): self.tsInfo.remove(otxmbr.pkgtup) # We need to remove an obsoleted entry that # was maybe used to resolve something ... ? self.pkgSack.delPackage(otxmbr.po) self.up.delPackage(otxmbr.pkgtup) # Remove it from the installed file requires cache (self.installedFileRequires or {}).pop(otxmbr.pkgtup, None) for po in self.rpmdb.returnObsoletePackages(): if self.tsInfo.getMembersWithState(po.pkgtup, output_states=TS_REMOVE_STATES): continue obsoletes = po.returnPrco('obsoletes') if not obsoletes: # We broke this due to dbMatch() usage. continue opkgs.append(po) for obs_name,f,v in obsoletes: for otxmbr in self.tsInfo.matchNaevr(name=obs_name): if not otxmbr.po.obsoletedBy([po]): continue if po.obsoletedBy([otxmbr.po]): # Loops, hope for rpm. continue msg = _('Removing %s due to obsoletes from installed %s') self.verbose_logger.warning(msg, otxmbr, po) _do_obs(otxmbr) ret = True for txmbr in self.tsInfo.getMembersWithState(None, output_states=TS_INSTALL_STATES): done = False for obs_n in txmbr.po.obsoletes_names: if not done: opkgs.append(txmbr.po) done = True for otxmbr in self.tsInfo.matchNaevr(name=obs_n): if otxmbr.output_state not in TS_INSTALL_STATES: continue if otxmbr.po == txmbr.po: # Not sure if we should just ignore this for # us, or for everyone... continue if not otxmbr.po.obsoletedBy([txmbr.po]): continue if txmbr.po.obsoletedBy([otxmbr.po]): # Have to deal with loops! Hope rpm behaves too. continue msg = _('Removing %s due to obsoletes from %s') self.verbose_logger.warning(msg, otxmbr, txmbr) _do_obs(otxmbr) ret = True self.rpmdb.transactionCacheObsoletePackages(opkgs) return ret def isPackageInstalled(self, pkgname): """Return whether the given package in installed. :param pkgname: the name of the package :return: whether the package in installed """ lst = self.tsInfo.matchNaevr(name = pkgname) for txmbr in lst: if txmbr.output_state in TS_INSTALL_STATES: return True if len(lst) > 0: # if we get here then it's in the tsInfo for an erase or obsoleted # --> not going to be installed return False if not self.rpmdb.contains(name=pkgname): return False return True _isPackageInstalled = isPackageInstalled def _compare_providers(self, pkgs, reqpo, req=None): """take the list of pkgs and score them based on the requesting package return a dictionary of po=score""" self.verbose_logger.log(logginglevels.DEBUG_4, _("Running compare_providers() for %s") %(str(pkgs))) def _common_prefix_len(x, y, minlen=2): num = min(len(x), len(y)) for off in range(num): if x[off] != y[off]: return max(off, minlen) return max(num, minlen) def _common_sourcerpm(x, y): if not hasattr(x, 'sourcerpm'): return False if not hasattr(y, 'sourcerpm'): return False return x.sourcerpm == y.sourcerpm def _conflict_req(x, y): if y is None: return False for ydep in y.conflicts: if x.checkPrco('provides', ydep): return True return False def _compare_arch_distance(x, y, req_compare_arch): # take X and Y package objects # determine which has a closer archdistance to compare_arch # if they are equal to compare_arch, compare which is closer to the # running arch # return the package which is closer or None for equal, or equally useless x_dist = archDifference(req_compare_arch, x.arch) if self.arch.multilib: # only go to the next one if we're multilib - if x_dist == 0: # can't really use best's arch anyway... self.verbose_logger.log(logginglevels.DEBUG_4, _("better arch in po %s") %(y)) return y # just try the next one - can't be much worse y_dist = archDifference(req_compare_arch, y.arch) if y_dist > 0 and x_dist > y_dist: self.verbose_logger.log(logginglevels.DEBUG_4, _("better arch in po %s") %(y)) return y if y_dist == x_dist: return None return x def _pkg2prov_version(pkg, provname): ''' This converts a package into a specific version tuple for the required provide. The provide _must_ be '=' and epoch=None and release=None == '0'. If there is 0 or 2+ matches, return None. If the req does not == the provide name, return None. ''' ret = None for prov in pkg.provides: (n, f, (e, v, r)) = prov if n != provname: continue if f != 'EQ': continue if ret is not None: return None ret = (e or '0', v, r or '0') return ret # Actual start of _compare_providers(). # Do a NameArch filtering, based on repo. __cmp__ unique_nevra_pkgs = {} for pkg in pkgs: if (pkg.pkgtup in unique_nevra_pkgs and unique_nevra_pkgs[pkg.pkgtup].repo <= pkg.repo): continue unique_nevra_pkgs[pkg.pkgtup] = pkg pkgs = unique_nevra_pkgs.values() pkgresults = {} penalize = set() for pkg in pkgs: pkgresults[pkg] = 0 # hand this off to our plugins self.plugins.run("compare_providers", providers_dict=pkgresults, reqpo=reqpo) for pkg in pkgresults.keys(): rpmdbpkgs = self.rpmdb.searchNevra(name=pkg.name) if rpmdbpkgs: # We only want to count things as "installed" if they are # older than what we are comparing, because this then an update # so we give preference. If they are newer then obsoletes/etc. # could play a part ... this probably needs a better fix. newest = sorted(rpmdbpkgs)[-1] if newest.verLT(pkg): # give pkgs which are updates just a SLIGHT edge # we should also make sure that any pkg # we are giving an edge to is not obsoleted by # something else in the transaction. :( # there are many ways I hate this - this is but one pkgresults[pkg] += 5 elif newest.verEQ(pkg): # We get here from bestPackagesFromList(), give a giant # bump to stuff that is already installed. pkgresults[pkg] += 1000 elif newest.verGT(pkg): # if the version we're looking at is older than what we have installed # score it down like we would an obsoleted pkg pkgresults[pkg] -= 1024 else: # just b/c they're not installed pkgs doesn't mean they should # be ignored entirely. Just not preferred pass pkgs = pkgresults.keys() # go through each pkg and compare to others # if it is same skip it # if the pkg is obsoleted by any other of the packages # then add -1024 to its score # don't need to look for mutual obsoletes b/c each package # is evaluated against all the others, so mutually obsoleting # packages will have their scores diminished equally # compare the arch vs each other pkg # give each time it returns with a better arch a +5 # look for common source vs the reqpo - give a +10 if it has it # look for common_prefix_len - add the length*2 to the score # add the negative of the length of the name to the score lpos = {} for po in pkgs: for nextpo in pkgs: if po == nextpo: continue # If this package isn't the latest version of said package, # treat it like it's obsoleted. The problem here is X-1 # accidentally provides FOO, so you release X-2 without the # provide, but X-1 is still picked over a real provider. if po.name not in lpos: lpos[po.name] = self.pkgSack.returnNewestByName(po.name)[:1] if not lpos[po.name] or not po.verEQ(lpos[po.name][0]): pkgresults[po] -= 1024 obsoleted = False if po.obsoletedBy([nextpo]): obsoleted = True pkgresults[po] -= 1024 self.verbose_logger.log(logginglevels.DEBUG_4, _("%s obsoletes %s") % (nextpo, po)) if reqpo: arches = (reqpo.arch, self.arch.bestarch) else: arches = (self.arch.bestarch,) for thisarch in arches: res = _compare_arch_distance(po, nextpo, thisarch) if not res: continue self.verbose_logger.log(logginglevels.DEBUG_4, _('archdist compared %s to %s on %s\n Winner: %s' % (po, nextpo, thisarch, res))) if res == po: pkgresults[po] += 5 # End of O(N*N): for nextpo in pkgs: # Respect the repository priority for each provider, the default is 80 pkgresults[po] += (100 - po.repo.compare_providers_priority) * 10 self.verbose_logger.log(logginglevels.DEBUG_4, _('compare_providers_priority for %s is %s' % (po, po.repo.compare_providers_priority))) if _common_sourcerpm(po, reqpo): self.verbose_logger.log(logginglevels.DEBUG_4, _('common sourcerpm %s and %s' % (po, reqpo))) pkgresults[po] += 20 if _conflict_req(po, reqpo): self.verbose_logger.log(logginglevels.DEBUG_4, _('conflict req %s and %s' % (po, reqpo))) penalize.add(po) if self.isPackageInstalled(po.base_package_name): self.verbose_logger.log(logginglevels.DEBUG_4, _('base package %s is installed for %s' % (po.base_package_name, po))) pkgresults[po] += 5 # Same as before - - but off of base package name if reqpo: cpl = _common_prefix_len(po.name, reqpo.name) if cpl > 2: self.verbose_logger.log(logginglevels.DEBUG_4, _('common prefix of %s between %s and %s' % (cpl, po, reqpo))) pkgresults[po] += cpl*2 if req is not None: bestnum = max(pkgresults.values()) prov_depsolve = {} for po in pkgs: if pkgresults[po] != bestnum: continue evr = _pkg2prov_version(po, req) if evr is None: prov_depsolve = {} break prov_depsolve[po] = evr if len(prov_depsolve) > 1: self.verbose_logger.log(logginglevels.DEBUG_4, _('provides vercmp: %s') % str(req)) newest = sorted(prov_depsolve, key = lambda x: PackageEVR(*prov_depsolve[x])) for winner in reversed(newest): if prov_depsolve[winner] != prov_depsolve[newest[-1]]: break self.verbose_logger.log(logginglevels.DEBUG_4, _(' Winner: %s') % winner) pkgresults[winner] += 1 # If we have more than one "best", see what would happen if we picked # each package ... ie. what things do they require that _aren't_ already # installed/to-be-installed. In theory this can screw up due to: # pkgA => requires pkgX # pkgB => requires pkgY, requires pkgZ # ...but pkgX requires 666 other things. Going recursive is # "non-trivial" though, python != prolog. This seems to do "better" # from simple testing though. bestnum = max(pkgresults.values()) rec_depsolve = {} for po in pkgs: if pkgresults[po] != bestnum: continue rec_depsolve[po] = 0 if len(rec_depsolve) > 1: for po in rec_depsolve: fake_txmbr = TransactionMember(po) # Note that this is just requirements, so you could also have # 4 requires for a single package. This might be fixable, if # needed, but given the above it's probably better to leave it # like this. reqs = self._checkInstall(fake_txmbr) rec_depsolve[po] = len(reqs) bestnum = min(rec_depsolve.values()) self.verbose_logger.log(logginglevels.DEBUG_4, _('requires minimal: %d') % bestnum) for po in rec_depsolve: if rec_depsolve[po] == bestnum: self.verbose_logger.log(logginglevels.DEBUG_4, _(' Winner: %s') % po) pkgresults[po] += 1 else: num = rec_depsolve[po] self.verbose_logger.log(logginglevels.DEBUG_4, _(' Loser(with %d): %s') % (num, po)) # We don't want to decide to use a "shortest first", if something else # has told us to pick something else. But we want to pick between # multiple "best" packages. So we spike all the best packages (so # only those can win) and then bump them down by package name length. bestnum = max(pkgresults.values()) for po in pkgs: if pkgresults[po] != bestnum: continue pkgresults[po] += 1000 pkgresults[po] += (len(po.name)*-1) # Bump down any packages that we identified as "last-resort" in such a # way that they all score below the worst overall score whilst keeping # their relative differences. shift = max(pkgresults.values()) - min(pkgresults.values()) + 1 for po in penalize: pkgresults[po] -= shift bestorder = sorted(pkgresults.items(), key=lambda x: (x[1], x[0]), reverse=True) self.verbose_logger.log(logginglevels.DEBUG_4, _('Best Order: %s' % str(bestorder))) return bestorder class DepCheck(object): """Object that :class:`YumDepsolver` uses to see what things are needed to close the transaction set. The attributes requires and conflicts are lists of requires and conflicts in the current transaction set. Each item in the lists is a :class:`Requires` or :class:`Conflicts` object. """ def __init__(self): self.requires = [] self.conflicts = [] def addRequires(self, po, req_tuple_list): """Create and add a :class:`Requires` object to the list of requires. :param po: the package object involved in the requires :param req_tuple_list: a list of required by *po* that are un-closed in the transaction set """ # fixme - do checking for duplicates or additions in here to zip things along reqobj = Requires(po, req_tuple_list) self.requires.append(reqobj) def addConflicts(self, conflict_po_list, conflict_item): """Create and add a :class:`Conflicts` object to the list of conflicts. :param conflict_po_list: a list of conflicting package objects :param conflict_item: what the conflict between the members of *conflict_po_list is. """ confobj = Conflicts(conflict_po_list, conflict_item) self.conflicts.append(confobj) class Requires(object): """A pure data class for holding a package and the list of things it requires. """ def __init__(self, pkg,requires): self.pkg = pkg # po of requiring pkg self.requires = requires # list of things it requires that are un-closed in the ts class Conflicts(object): """A pure data class for holding a list packages and what the conflict between them is. """ def __init__(self, pkglist, conflict): self.pkglist = pkglist # list of conflicting package objects self.conflict = conflict # what the conflict was between them PK[y*X#X#site-packages/yum/metalink.pycnu[ v_c@sddlZddlZddlZddlmZddlZddlmZdej fdYZ dZ dZ ie d6e d 6Z d e Zd e Zd e Zd ddYZdddYZdddYZdZedkrendS(iN(t format_number(tcElementTree_xmlparsetMetaLinkRepoErrorParseFailcBseZdZRS(s< An exception thrown for an unparsable MetaLinkRepoMD file. (t__name__t __module__t__doc__(((s0/usr/lib/python2.7/site-packages/yum/metalink.pyRsshttp://www.metalinker.org/s%http://fedorahosted.org/mirrormanagertmltmms{%(ml)s}files/{%(ml)s}files${%(mm)s}alternates/{%(mm)s}alternates{%(ml)s}resourcest MetaLinkFilecBs}eZdZdZdZdZeeZdZeeZ dZ ee Z dZ ee Z dZRS(s1 Parse the file metadata out of a metalink file. cCsQtddddg}x|D]}tr.q|jdtkrVt|j|_q|jdtkr~t|j|_q|jdtkri|_ x[|D]P}|jdtkr|j d |kr|j|j |j d j Iterate plain urls for the mirrors, like the old mirrorlist. cSs|jddjddS(Nt/it@i(tsplit(R6((s0/usr/lib/python2.7/site-packages/yum/metalink.pytssfile:shttp:sftp:shttps:s/repodata/repomd.xmlN(RAR6t startswithRBtendswithRO(Rturl2hosttmirrorR6thost((s0/usr/lib/python2.7/site-packages/yum/metalink.pyturlss   cCst|j}t}xU|jD]J}|s@|ddd7}n|rS|d7}nt}|t|7}qWt}xU|jD]J}|s|ddd7}n|r|d7}nt}|t|7}q}W|S(Ns%s t-iOs (tstrR?RR@R:RA(RR+tdonetorepomdR6((s0/usr/lib/python2.7/site-packages/yum/metalink.pyR"s$  (RRRRR\R"(((s0/usr/lib/python2.7/site-packages/yum/metalink.pyR<s - cCs~d}ttjdkr(|nxOtjdD]@}tjj|s]dG|GHq6ndG|GHt|GHdGHq6WdS(s MetaLinkRepoMD test function. cSs)tjdtjdIJtjddS(NsUsage: %s ...ii(tsyststderrtargvtexit(((s0/usr/lib/python2.7/site-packages/yum/metalink.pytusagesiis No such file:sFile:R#N(RORaRcRCRDRER<(ReRP((s0/usr/lib/python2.7/site-packages/yum/metalink.pytmain s     t__main__((((RaRCR turlgrabber.progressRtErrorstyum.miscRRFt RepoErrorRRRt __XML_FMT__RIRKRMRR.R<RfR(((s0/usr/lib/python2.7/site-packages/yum/metalink.pyts&         K2^  PK[p>xbbsite-packages/yum/__init__.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University """ The Yum RPM software updater. """ import os import os.path import rpm import sys def _rpm_ver_atleast(vertup): """ Check if rpm is at least the current vertup. Can return False/True/None as rpm hasn't had version info for a long time. """ if not hasattr(rpm, '__version_info__'): return None try: # 4.8.x rpm used strings for the tuple members, so convert. vi = tuple([ int(num) for num in rpm.__version_info__]) return vi >= vertup except: return None # Something went wrong... import re import types import errno import time import glob import fnmatch import logging import logging.config import operator import tempfile import shutil import yum.i18n # This is required to make gaftonmode work... _wrap_yum_i18n__ = yum.i18n._ def _(*args, **kwargs): return _wrap_yum_i18n__(*args, **kwargs) _wrap_yum_i18n_P_ = yum.i18n.P_ def P_(*args, **kwargs): return _wrap_yum_i18n_P_(*args, **kwargs) import config from config import ParsingError, ConfigParser import Errors import rpmsack import rpmUtils.updates from rpmUtils.arch import archDifference, canCoinstall, ArchStorage, isMultiLibArch from rpmUtils.miscutils import compareEVR import rpmUtils.transaction import comps import pkgtag_db from repos import RepoStorage import misc from parser import ConfigPreProcessor, varReplace import transactioninfo import urlgrabber from urlgrabber.grabber import URLGrabber, URLGrabError from urlgrabber.progress import format_number from packageSack import packagesNewestByName, packagesNewestByNameArch, ListPackageSack import depsolve import plugins import logginglevels import yumRepo import callbacks import yum.history import yum.fssnapshots from yum.fssnapshots import LibLVMError, lvmerr2str import yum.igroups import update_md import warnings warnings.simplefilter("ignore", Errors.YumFutureDeprecationWarning) from packages import parsePackages, comparePoEVR from packages import YumAvailablePackage, YumLocalPackage, YumInstalledPackage from packages import YumUrlPackage, YumNotFoundPackage from constants import * from yum.rpmtrans import RPMTransaction,SimpleCliCallBack from yum.i18n import to_unicode, to_str, exception2msg from yum.drpm import DeltaInfo, DeltaPackage import StringIO from weakref import proxy as weakref from urlgrabber.grabber import default_grabber __version__ = '3.4.3' __version_info__ = tuple([ int(num) for num in __version__.split('.')]) # Setup a default_grabber UA here that says we are yum, done using the global # so that other API users can easily add to it if they want. # Don't do it at init time, or we'll get multiple additions if you create # multiple YumBase() objects. default_grabber.opts.user_agent += " yum/" + __version__ class _YumPreBaseConf: """This is the configuration interface for the :class:`YumBase` configuration. To change configuration settings such as whether plugins are on or off, or the value of debuglevel, change the values here. Later, when :func:`YumBase.conf` is first called, all of the options will be automatically configured. """ def __init__(self): self.fn = '/etc/yum/yum.conf' self.root = '/' self.init_plugins = True self.plugin_types = (plugins.TYPE_CORE,) self.optparser = None self.debuglevel = None self.errorlevel = None self.disabled_plugins = None self.enabled_plugins = None self.syslog_ident = None self.syslog_facility = None self.syslog_device = None self.arch = None self.releasever = None self.uuid = None class _YumPreRepoConf: """This is the configuration interface for the repos configuration configuration. To change configuration settings such what callbacks are used, change the values here. Later, when :func:`YumBase.repos` is first called, all of the options will be automatically configured. """ def __init__(self): self.progressbar = None self.multi_progressbar = None self.callback = None self.failure_callback = None self.interrupt_callback = None self.confirm_func = None self.gpg_import_func = None self.gpgca_import_func = None self.cachedir = None self.cache = None class _YumCostExclude: """ This excludes packages that are in repos. of lower cost than the passed repo. """ def __init__(self, repo, repos): self.repo = weakref(repo) self._repos = weakref(repos) def __contains__(self, pkgtup): # (n, a, e, v, r) = pkgtup for repo in self._repos.listEnabled(): if repo.cost >= self.repo.cost: break # searchNevra is a bit slower, although more generic for repos. # that don't use sqlitesack as the backend ... although they are # probably screwed anyway. # # if repo.sack.searchNevra(n, e, v, r, a): if pkgtup in repo.sack._pkgtup2pkgs: return True return False class YumBase(depsolve.Depsolve): """This is a primary structure and base class. It houses the objects and methods needed to perform most things in yum. It is almost an abstract class in that you will need to add your own class above it for most real use. """ def __init__(self): depsolve.Depsolve.__init__(self) self._conf = None self._tsInfo = None self._rpmdb = None self._up = None self._comps = None self._history = None self._igroups = None self._pkgSack = None self._lockfile = None self._tags = None self._upinfo = None self._fssnap = None self._ts_save_file = None self.skipped_packages = [] # packages skip by the skip-broken code self._not_found_a = {} self._not_found_i = {} self.logger = logging.getLogger("yum.YumBase") self.verbose_logger = logging.getLogger("yum.verbose.YumBase") self.file_logger = logging.getLogger("yum.filelogging.YumBase") self._override_sigchecks = False self._repos = RepoStorage(self) self.repo_setopts = {} # since we have to use repo_setopts in base and # not in cli - set it up as empty so no one # trips over it later # Start with plugins disabled self.disablePlugins() self.localPackages = [] # for local package handling self.mediagrabber = None self.arch = ArchStorage() self.preconf = _YumPreBaseConf() self.prerepoconf = _YumPreRepoConf() self.run_with_package_names = set() self._cleanup = [] self.exit_code = 0 self.updateinfo_filters = {} def __del__(self): try: self.close() self.closeRpmDB() self.doUnlock() # call cleanup callbacks for cb in self._cleanup: cb() except Errors.RepoError, e: self.verbose_logger.debug("Exception %s %s in %s ignored" % (repr(e), str(e), self.__del__)) def close(self): """Close the history and repo objects.""" # We don't want to create the object, so we test if it's been created if self._history is not None: self.history.close() if self._igroups is not None: self.igroups.close() if self._repos: self._repos.close() def _transactionDataFactory(self): """Factory method returning TransactionData object""" return transactioninfo.TransactionData() def doGenericSetup(self, cache=0): """Do a default setup for all the normal or necessary yum components. This function is really just a shorthand for testing purposes. :param cache: whether to run in cache only mode, which will run only from the system cache """ self.preconf.init_plugins = False self.conf.cache = cache def doConfigSetup(self, fn='/etc/yum/yum.conf', root='/', init_plugins=True, plugin_types=(plugins.TYPE_CORE,), optparser=None, debuglevel=None, errorlevel=None): """Deprecated. Perform configuration setup. :param fn: the name of the configuration file to use :param root: the root directory to use :param init_plugins: whether to initialize plugins before running yum :param plugin_types: a tuple containing the types to plugins to load :param optparser: the option parser to use for configuration :param debuglevel: the minimum debug logging level to output messages from :param errorlevel: the minimum error logging level to output messages from """ warnings.warn(_('doConfigSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) if hasattr(self, 'preconf'): self.preconf.fn = fn self.preconf.root = root self.preconf.init_plugins = init_plugins self.preconf.plugin_types = plugin_types self.preconf.optparser = optparser self.preconf.debuglevel = debuglevel self.preconf.errorlevel = errorlevel return self.conf def _getConfig(self, **kwargs): ''' Parse and load Yum's configuration files and call hooks initialise plugins and logging. Uses self.preconf for pre-configuration, configuration. ''' # ' xemacs syntax hack if kwargs: warnings.warn('Use .preconf instead of passing args to _getConfig') if self._conf: return self._conf conf_st = time.time() if kwargs: for arg in ('fn', 'root', 'init_plugins', 'plugin_types', 'optparser', 'debuglevel', 'errorlevel', 'disabled_plugins', 'enabled_plugins'): if arg in kwargs: setattr(self.preconf, arg, kwargs[arg]) fn = self.preconf.fn root = self.preconf.root init_plugins = self.preconf.init_plugins plugin_types = self.preconf.plugin_types optparser = self.preconf.optparser debuglevel = self.preconf.debuglevel errorlevel = self.preconf.errorlevel disabled_plugins = self.preconf.disabled_plugins enabled_plugins = self.preconf.enabled_plugins syslog_ident = self.preconf.syslog_ident syslog_facility = self.preconf.syslog_facility syslog_device = self.preconf.syslog_device releasever = self.preconf.releasever arch = self.preconf.arch uuid = self.preconf.uuid if arch: # if preconf is setting an arch we need to pass that up self.arch.setup_arch(arch) else: arch = self.arch.canonarch # TODO: Remove this block when we no longer support configs outside # of /etc/yum/ if fn == '/etc/yum/yum.conf' and not os.path.exists(fn): # Try the old default fn = '/etc/yum.conf' startupconf = config.readStartupConfig(fn, root, releasever) startupconf.arch = arch startupconf.basearch = self.arch.basearch if uuid: startupconf.uuid = uuid if startupconf.gaftonmode: global _wrap_yum_i18n__ _wrap_yum_i18n__ = yum.i18n.dummy_wrapper global _wrap_yum_i18n_P_ _wrap_yum_i18n_P_ = yum.i18n.dummyP_wrapper if debuglevel != None: startupconf.debuglevel = debuglevel if errorlevel != None: startupconf.errorlevel = errorlevel if syslog_ident != None: startupconf.syslog_ident = syslog_ident if syslog_facility != None: startupconf.syslog_facility = syslog_facility if syslog_device != None: startupconf.syslog_device = syslog_device if releasever == '/': if startupconf.installroot == '/': releasever = None else: releasever = yum.config._getsysver("/",startupconf.distroverpkg) if releasever != None: startupconf.releasever = releasever self.doLoggingSetup(startupconf.debuglevel, startupconf.errorlevel, startupconf.syslog_ident, startupconf.syslog_facility, startupconf.syslog_device) if init_plugins and startupconf.plugins: self.doPluginSetup(optparser, plugin_types, startupconf.pluginpath, startupconf.pluginconfpath,disabled_plugins,enabled_plugins) self._conf = config.readMainConfig(startupconf) # update urlgrabber defaults mc = self._conf.max_connections if mc > 0: default_grabber.opts.max_connections = mc default_grabber.opts.timedhosts = self._conf.cachedir + '/timedhosts' # We don't want people accessing/altering preconf after it becomes # worthless. So we delete it, and thus. it'll raise AttributeError del self.preconf # Packages used to run yum... for pkgname in self.conf.history_record_packages: self.run_with_package_names.add(pkgname) # run the postconfig plugin hook self.plugins.run('postconfig') # Note that Pungi has historically replaced _getConfig(), and it sets # up self.conf.yumvar but not self.yumvar ... and AFAIK nothing needs # to use YumBase.yumvar, so it's probably easier to just semi-deprecate # this (core now only uses YumBase.conf.yumvar). self.yumvar = self.conf.yumvar # who are we: self.conf.uid = os.geteuid() # repos are ver/arch specific so add $basearch/$releasever self.conf._repos_persistdir = os.path.normpath('%s/repos/%s/%s/' % (self.conf.persistdir, self.yumvar.get('basearch', '$basearch'), self.yumvar.get('releasever', '$releasever'))) self.doFileLogSetup(self.conf.uid, self.conf.logfile) self.verbose_logger.debug('Config time: %0.3f' % (time.time() - conf_st)) self.plugins.run('init') return self._conf def doLoggingSetup(self, debuglevel, errorlevel, syslog_ident=None, syslog_facility=None, syslog_device='/dev/log'): """Perform logging related setup. :param debuglevel: the minimum debug logging level to output messages from :param errorlevel: the minimum error logging level to output messages from :param syslog_ident: the ident of the syslog to use :param syslog_facility: the name of the syslog facility to use :param syslog_device: the syslog device to use """ logginglevels.doLoggingSetup(debuglevel, errorlevel, syslog_ident, syslog_facility, syslog_device) def doFileLogSetup(self, uid, logfile): """Set up the logging file. :param uid: the user id of the current user :param logfile: the name of the file to use for logging """ logginglevels.setFileLog(uid, logfile, self._cleanup) def getReposFromConfigFile(self, repofn, repo_age=None, validate=None): """Read in repositories from a config .repo file. :param repofn: a string specifying the path of the .repo file to read :param repo_age: the last time that the .repo file was modified, in seconds since the epoch """ if repo_age is None: repo_age = os.stat(repofn)[8] confpp_obj = ConfigPreProcessor(repofn, vars=self.conf.yumvar) parser = ConfigParser() try: parser.readfp(confpp_obj) except ParsingError, e: raise Errors.ConfigError(exception2msg(e)) # Check sections in the .repo file that was just slurped up for section in parser.sections(): if section in ['main', 'installed']: continue # Check the repo.id against the valid chars bad = misc.validate_repoid(section) if bad: self.logger.warning("Bad id for repo: %s, byte = %s %d" % (section, bad, section.find(bad))) continue try: thisrepo = self.readRepoConfig(parser, section) except (Errors.RepoError, Errors.ConfigError), e: self.logger.warning(e) continue else: thisrepo.repo_config_age = repo_age thisrepo.repofile = repofn thisrepo.base_persistdir = self.conf._repos_persistdir # do the wildcard ones first # The keys are in indeterminate order at this point, *sigh*. for i in sorted(self.repo_setopts): # Skip normal names, as we want to do wildcard matches first # and then override with specific id stuff. if not misc.re_glob(i): continue if fnmatch.fnmatch(thisrepo.id, i): for opt in self.repo_setopts[i].items: if not hasattr(thisrepo, opt): msg = "Repo %s did not have a %s attr. before setopt" self.logger.warning(msg % (thisrepo.id, opt)) setattr(thisrepo, opt, getattr(self.repo_setopts[i], opt)) if thisrepo.id in self.repo_setopts: for opt in self.repo_setopts[thisrepo.id].items: if not hasattr(thisrepo, opt): msg = "Repo %s did not have a %s attr. before setopt" self.logger.warning(msg % (thisrepo.id, opt)) setattr(thisrepo, opt, getattr(self.repo_setopts[thisrepo.id], opt)) if validate and not validate(thisrepo): continue if thisrepo.ssl_check_cert_permissions: for fn in (thisrepo.sslcacert, thisrepo.sslclientcert, thisrepo.sslclientkey): if not fn: continue # If we can't read the SSL certs. we need to skip the repo. # if we don't have all the data. if not os.access(fn, os.R_OK): msg="Repo %s forced skip_if_unavailable=True due to: %s" if thisrepo.enabled: # Don't spam messages for disabled repos. self.logger.warning(msg % (thisrepo.id, fn)) thisrepo.skip_if_unavailable = True # Got our list of repo objects, add them to the repos # collection try: self._repos.add(thisrepo) except Errors.RepoError, e: self.logger.warning(e) def getReposFromConfig(self): """Read in repositories from the main yum conf file, and from .repo files. The location of the main yum conf file is given by self.conf.config_file_path, and the location of the directory of .repo files is given by self.conf.reposdir. """ # Read .repo files from directories specified by the reposdir option # (typically /etc/yum/repos.d) repo_config_age = self.conf.config_file_age # Get the repos from the main yum.conf file self.getReposFromConfigFile(self.conf.config_file_path, repo_config_age) for reposdir in self.conf.reposdir: # this check makes sure that our dirs exist properly. # if they aren't in the installroot then don't prepend the installroot path # if we don't do this then anaconda likes to not work. if os.path.exists(self.conf.installroot+'/'+reposdir): reposdir = self.conf.installroot + '/' + reposdir reposdir = os.path.normpath(reposdir) if os.path.isdir(reposdir): for repofn in sorted(glob.glob('%s/*.repo' % reposdir)): if not os.access(repofn, os.R_OK): self.logger.warning(_("Skipping unreadable repository %s"), repr(repofn)) continue thisrepo_age = os.stat(repofn)[8] if thisrepo_age < repo_config_age: thisrepo_age = repo_config_age self.getReposFromConfigFile(repofn, repo_age=thisrepo_age) def readRepoConfig(self, parser, section): """Parse an INI file section for a repository. :param parser: :class:`ConfigParser` or similar object to read INI file values from :param section: INI file section to read :return: :class:`yum.yumRepo.YumRepository` instance """ repo = yumRepo.YumRepository(section) try: repo.populate(parser, section, self.conf) except ValueError, e: msg = _('Repository %r: Error parsing config: %s' % (section,e)) raise Errors.ConfigError, msg # Ensure that the repo name is set if not repo.name: repo.name = section self.logger.error(_('Repository %r is missing name in configuration, ' 'using id') % section) repo.name = to_unicode(repo.name) # Set attributes not from the config file repo.old_base_cache_dir = getattr(self, '_old_cachedir', '') repo.basecachedir = self.conf.cachedir repo.yumvar.update(self.conf.yumvar) repo.cfg = parser # Enable parallel downloading repo._async = repo.async return repo def disablePlugins(self): """Disable yum plugins.""" self.plugins = plugins.DummyYumPlugins() def doPluginSetup(self, optparser=None, plugin_types=None, searchpath=None, confpath=None,disabled_plugins=None,enabled_plugins=None): """Initialise and enable yum plugins. Note: _getConfig() will also initialise plugins if instructed to. Only call this method directly if not calling _getConfig() or calling doConfigSetup(init_plugins=False). :param optparser: the :class:`OptionParser` instance to use for this run :param plugin_types: a sequence specifying the types of plugins to load. This should be a sequence containing one or more of the yum.plugins.TYPE_... constants. If None (the default), all plugins will be loaded :param searchpath: a list of directories to look in for plugins. A default will be used if no value is specified :param confpath: a list of directories to look in for plugin configuration files. A default will be used if no value is specified :param disabled_plugins: a list of plugins to be disabled :param enabled_plugins: a list plugins to be enabled """ if isinstance(self.plugins, plugins.YumPlugins): raise RuntimeError(_("plugins already initialised")) self.plugins = plugins.YumPlugins(self, searchpath, optparser, plugin_types, confpath, disabled_plugins, enabled_plugins) def doRpmDBSetup(self): """Deprecated. Set up the rpm database.""" warnings.warn(_('doRpmDBSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) return self._getRpmDB() def _getRpmDB(self): """sets up a holder object for important information from the rpmdb""" if self._rpmdb is None: rpmdb_st = time.time() self.verbose_logger.log(logginglevels.DEBUG_4, _('Reading Local RPMDB')) self._rpmdb = rpmsack.RPMDBPackageSack(root=self.conf.installroot, releasever=self.conf.yumvar['releasever'], persistdir=self.conf.persistdir) self.verbose_logger.debug('rpmdb time: %0.3f' % (time.time() - rpmdb_st)) return self._rpmdb def closeRpmDB(self): """Closes down the instances of rpmdb that could be open.""" if self._rpmdb is not None: self._rpmdb.ts = None self._rpmdb.dropCachedData() self._rpmdb = None self._ts = None self._tsInfo = None self._up = None self.comps = None self.igroups = None def _deleteTs(self): del self._ts self._ts = None def doRepoSetup(self, thisrepo=None): """Deprecated. Set up the yum repositories. :param thisrepo: the repository to set up. If None, all repositories will be set up :return: the set up repos """ warnings.warn(_('doRepoSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) return self._getRepos(thisrepo, True) def _getRepos(self, thisrepo=None, doSetup = False): """ For each enabled repository set up the basics of the repository. """ if hasattr(self, 'prerepoconf'): self.conf # touch the config class first if (self.conf.installroot != '/' and not hasattr(self, '_old_cachedir')): # Try loading cache from outside... ir = len(self.conf.installroot) self._old_cachedir = self.conf.cachedir[ir:] self.getReposFromConfig() # For rhnplugin, and in theory other stuff, calling # .getReposFromConfig() recurses back into this function but only once. # This means that we have two points on the stack leaving the above call # but only one of them can do the repos setup. BZ 678043. if hasattr(self, 'prerepoconf'): # Recursion prerepoconf = self.prerepoconf del self.prerepoconf self.repos.setProgressBar(prerepoconf.progressbar, prerepoconf.multi_progressbar) self.repos.callback = prerepoconf.callback self.repos.setFailureCallback(prerepoconf.failure_callback) self.repos.setInterruptCallback(prerepoconf.interrupt_callback) self.repos.confirm_func = prerepoconf.confirm_func self.repos.gpg_import_func = prerepoconf.gpg_import_func self.repos.gpgca_import_func = prerepoconf.gpgca_import_func if prerepoconf.cachedir is not None: self.repos.setCacheDir(prerepoconf.cachedir) if prerepoconf.cache is not None: self.repos.setCache(prerepoconf.cache) if doSetup: repo_st = time.time() self._repos.doSetup(thisrepo) self.verbose_logger.debug('repo time: %0.3f' % (time.time() - repo_st)) return self._repos def _delRepos(self): del self._repos self._repos = RepoStorage(self) def doSackSetup(self, archlist=None, thisrepo=None): """Deprecated. Populate the package sacks with information from our repositories. :param archlist: a list of the names of archs to include. If None, all arches are set up :param thisrepo: the repository to use. If None, all enabled repositories are used """ warnings.warn(_('doSackSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) return self._getSacks(archlist=archlist, thisrepo=thisrepo) def _getSacks(self, archlist=None, thisrepo=None): """populates the package sacks for information from our repositories, takes optional archlist for archs to include""" # FIXME: Fist of death ... normally we'd do either: # # 1. use self._pkgSack is not None, and only init. once. # 2. auto. correctly re-init each time a repo is added/removed # # ...we should probably just smeg it and do #2, but it's hard and will # probably break something (but it'll "fix" excludes). # #1 can't be done atm. because we did self._pkgSack and external # tools now rely on being able to create an empty sack and then have it # auto. re-init when they add some stuff. So we add a bit more "clever" # and don't setup the pkgSack to not be None when it's empty. This means # we skip excludes/includes/etc. ... but there's no packages, so # hopefully that's ok. if self._pkgSack is not None and thisrepo is None: return self._pkgSack if thisrepo is None: repos = 'enabled' else: repos = self.repos.findRepos(thisrepo) self.verbose_logger.debug(_('Setting up Package Sacks')) sack_st = time.time() if not archlist: archlist = self.arch.archlist archdict = {} for arch in archlist: archdict[arch] = 1 self.repos.getPackageSack().setCompatArchs(archdict) self.repos.populateSack(which=repos) if not self.repos.getPackageSack(): return self.repos.getPackageSack() # ha ha, see above self._pkgSack = self.repos.getPackageSack() self.excludePackages() self._pkgSack.excludeArchs(archlist) #FIXME - this could be faster, too. if repos == 'enabled': repos = self.repos.listEnabled() for repo in repos: self.includePackages(repo) self.excludePackages(repo) self.plugins.run('exclude') self._pkgSack.buildIndexes() # now go through and kill pkgs based on pkg.repo.cost() self.costExcludePackages() self.verbose_logger.debug('pkgsack time: %0.3f' % (time.time() - sack_st)) return self._pkgSack def _delSacks(self): """reset the package sacks back to zero - making sure to nuke the ones in the repo objects, too - where it matters""" # nuke the top layer self._pkgSack = None for repo in self.repos.repos.values(): if hasattr(repo, '_resetSack'): repo._resetSack() else: warnings.warn(_('repo object for repo %s lacks a _resetSack method\n') + _('therefore this repo cannot be reset.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) def doUpdateSetup(self): """Deprecated. Set up the update object in the base class and populate the updates, obsoletes, and other lists. """ warnings.warn(_('doUpdateSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) return self._getUpdates() def _getUpdates(self): """setups up the update object in the base class and fills out the updates, obsoletes and others lists""" if self._up: return self._up self.verbose_logger.debug(_('Building updates object')) up_st = time.time() self._up = rpmUtils.updates.Updates(self.rpmdb.simplePkgList(), self.pkgSack.simplePkgList()) if self.conf.debuglevel >= 7: self._up.debug = 1 if hasattr(self, '_up_obs_hack'): self._up.rawobsoletes = self._up_obs_hack.rawobsoletes del self._up_obs_hack elif self.conf.obsoletes: obs_init = time.time() # Note: newest=True here is semi-required for repos. with multiple # versions. The problem is that if pkgA-2 _accidentally_ obsoletes # pkgB-1, and we keep all versions, we want to release a pkgA-3 # that doesn't do the obsoletes ... and thus. not obsolete pkgB-1. self._up.rawobsoletes = self.pkgSack.returnObsoletes(newest=True) self.verbose_logger.debug('up:Obs Init time: %0.3f' % (time.time() - obs_init)) self._up.myarch = self.arch.canonarch self._up._is_multilib = self.arch.multilib self._up._archlist = self.arch.archlist self._up._multilib_compat_arches = self.arch.compatarches self._up.exactarch = self.conf.exactarch self._up.exactarchlist = self.conf.exactarchlist up_pr_st = time.time() self._up.doUpdates() self.verbose_logger.debug('up:simple updates time: %0.3f' % (time.time() - up_pr_st)) if self.conf.obsoletes: obs_st = time.time() self._up.doObsoletes() self.verbose_logger.debug('up:obs time: %0.3f' % (time.time() - obs_st)) cond_up_st = time.time() self._up.condenseUpdates() self.verbose_logger.debug('up:condense time: %0.3f' % (time.time() - cond_up_st)) self.verbose_logger.debug('updates time: %0.3f' % (time.time() - up_st)) return self._up def doGroupSetup(self): """Deprecated. Create and populate the groups object.""" warnings.warn(_('doGroupSetup() will go away in a future version of Yum.\n'), Errors.YumFutureDeprecationWarning, stacklevel=2) self.comps = None return self._getGroups() def _setGroups(self, val): if val is None: # if we unset the comps object, we need to undo which repos have # been added to the group file as well if self._repos: # Used to do listGroupsEnabled(), which seems fine but requires # calling .listEnalbed() ... which doesn't work on __del__ path # if we haven't already called that (due to # "prelistenabledrepos" plugins). So just blank it for # all repos. for repo in self._repos.sort(): repo.groups_added = False self._comps = val def _getGroups(self): """create the groups object that will store the comps metadata finds the repos with groups, gets their comps data and merge it into the group object""" if self._comps: return self._comps group_st = time.time() self.verbose_logger.log(logginglevels.DEBUG_4, _('Getting group metadata')) reposWithGroups = [] # Need to make sure the groups data is ready to read. Really we'd want # to add groups to the mdpolicy list of the repo. but we don't atm. self.pkgSack for repo in self.repos.listGroupsEnabled(): if repo.groups_added: # already added the groups from this repo reposWithGroups.append(repo) continue if not repo.ready(): raise Errors.RepoError, "Repository '%s' not yet setup" % repo try: groupremote = repo.getGroupLocation() except Errors.RepoMDError, e: pass else: reposWithGroups.append(repo) # now we know which repos actually have groups files. overwrite = self.conf.overwrite_groups self._comps = comps.Comps(overwrite_groups = overwrite) if self.conf.group_command == 'objects': # Add the ids for installed groups/envs as though sys is a repo. # makes everything easier (comps.return_groups() etc. works)... self._comps.compscount += 1 for gid in self.igroups.groups: grp = comps.Group() grp.name = grp.groupid = gid grp._weak = True self._comps.add_group(grp) for evgid in self.igroups.environments: env = comps.Environment() env.name = env.environmentid = evgid env._weak = True self._comps.add_environment(env) for repo in reposWithGroups: if repo.groups_added: # already added the groups from this repo continue self.verbose_logger.log(logginglevels.DEBUG_4, _('Adding group file from repository: %s'), repo) groupfile = repo.getGroups() if not groupfile: msg = _('Failed to retrieve group file for repository: %s') % repo self.logger.critical(msg) continue try: self._comps.add(groupfile) except (Errors.GroupsError,Errors.CompsException), e: msg = _('Failed to add groups file for repository: %s - %s') % (repo, exception2msg(e)) self.logger.critical(msg) else: repo.groups_added = True if self._comps.compscount == 0: raise Errors.GroupsError, _('No Groups Available in any repository') # Note that this means that grp.installed is not usable, when using # groups as objects ... but that's GOOD. if self.conf.group_command != 'objects': self._comps.compile(self.rpmdb.simplePkgList()) self.verbose_logger.debug('group time: %0.3f' % (time.time() - group_st)) return self._comps def _getTags(self): """ create the tags object used to search/report from the pkgtags metadata""" tag_st = time.time() self.verbose_logger.log(logginglevels.DEBUG_4, _('Getting pkgtags metadata')) if self._tags is None: self._tags = yum.pkgtag_db.PackageTags() for repo in self.repos.listEnabled(): if 'pkgtags' not in repo.repoXML.fileTypes(): continue self.verbose_logger.log(logginglevels.DEBUG_4, _('Adding tags from repository: %s'), repo) # fetch the sqlite tagdb try: tag_md = repo.retrieveMD('pkgtags') tag_sqlite = misc.repo_gen_decompress(tag_md, 'pkgtags.sqlite', cached=repo.cache) # feed it into _tags.add() self._tags.add(repo.id, tag_sqlite) except (Errors.RepoError, Errors.PkgTagsError), e: msg = _('Failed to add Pkg Tags for repository: %s - %s') % (repo, exception2msg(e)) self.logger.critical(msg) self.verbose_logger.debug('tags time: %0.3f' % (time.time() - tag_st)) return self._tags def _getUpdateinfo(self): """ create the Update Info object used to search/report the updateinfo metadata""" upi_st = time.time() self.verbose_logger.log(logginglevels.DEBUG_4, _('Getting updateinfo metadata')) if self._upinfo is None: logger = logging.getLogger("yum.update_md") vlogger = logging.getLogger("yum.verbose.update_md") self._upinfo = update_md.UpdateMetadata(logger=logger, vlogger=vlogger) self.pkgSack # Preload the sack now, to honor skip_if_unavailable for repo in self.repos.listEnabled(): if 'updateinfo' not in repo.repoXML.fileTypes(): continue self.verbose_logger.log(logginglevels.DEBUG_4, _('Adding Update Info from repository: %s'), repo) try: self._upinfo.add(repo) except Errors.RepoMDError, e: msg = _('Failed to add Update Info for repository: %s - %s') % (repo, exception2msg(e)) self.logger.critical(msg) self.verbose_logger.debug('updateinfo time: %0.3f' % (time.time() - upi_st)) return self._upinfo def _getHistory(self): """auto create the history object that to access/append the transaction history information. """ if self._history is None: pdb_path = self.conf.persistdir + "/history" self._history = yum.history.YumHistory(root=self.conf.installroot, db_path=pdb_path, releasever=self.conf.yumvar['releasever']) return self._history def _getFSsnap(self): """ create the fssnap object used to query/create snapshots. """ if self._fssnap is None: devices = self.conf.fssnap_devices self._fssnap = yum.fssnapshots._FSSnap(root=self.conf.installroot, devices=devices, logger=self.file_logger) return self._fssnap def _getIGroups(self): """auto create the installed groups object that to access/change the installed groups information. """ if self._igroups is None: pdb_path = self.conf.persistdir + "/groups" self._igroups = yum.igroups.InstalledGroups(db_path=pdb_path) return self._igroups # properties so they auto-create themselves with defaults repos = property(fget=lambda self: self._getRepos(), fset=lambda self, value: setattr(self, "_repos", value), fdel=lambda self: self._delRepos(), doc="Repo Storage object - object of yum repositories") pkgSack = property(fget=lambda self: self._getSacks(), fset=lambda self, value: setattr(self, "_pkgSack", value), fdel=lambda self: self._delSacks(), doc="Package sack object - object of yum package objects") conf = property(fget=lambda self: self._getConfig(), fset=lambda self, value: setattr(self, "_conf", value), fdel=lambda self: setattr(self, "_conf", None), doc="Yum Config Object") rpmdb = property(fget=lambda self: self._getRpmDB(), fset=lambda self, value: setattr(self, "_rpmdb", value), fdel=lambda self: setattr(self, "_rpmdb", None), doc="RpmSack object") tsInfo = property(fget=lambda self: self._getTsInfo(), fset=lambda self,value: self._setTsInfo(value), fdel=lambda self: self._delTsInfo(), doc="Transaction Set information object") ts = property(fget=lambda self: self._getActionTs(), fdel=lambda self: self._deleteTs(), doc="TransactionSet object") up = property(fget=lambda self: self._getUpdates(), fset=lambda self, value: setattr(self, "_up", value), fdel=lambda self: setattr(self, "_up", None), doc="Updates Object") comps = property(fget=lambda self: self._getGroups(), fset=lambda self, value: self._setGroups(value), fdel=lambda self: setattr(self, "_comps", None), doc="Yum Component/groups object") history = property(fget=lambda self: self._getHistory(), fset=lambda self, value: setattr(self, "_history",value), fdel=lambda self: setattr(self, "_history", None), doc="Yum History Object") igroups = property(fget=lambda self: self._getIGroups(), fset=lambda self, value: setattr(self, "_igroups",value), fdel=lambda self: setattr(self, "_igroups", None), doc="Yum Installed Groups Object") pkgtags = property(fget=lambda self: self._getTags(), fset=lambda self, value: setattr(self, "_tags",value), fdel=lambda self: setattr(self, "_tags", None), doc="Yum Package Tags Object") upinfo = property(fget=lambda self: self._getUpdateinfo(), fset=lambda self, value: setattr(self, "_upinfo", value), fdel=lambda self: setattr(self, "_upinfo", None), doc="Yum Update Info Object") fssnap = property(fget=lambda self: self._getFSsnap(), fset=lambda self, value: setattr(self, "_fssnap",value), fdel=lambda self: setattr(self, "_fssnap", None), doc="Yum FS snapshot Object") def doSackFilelistPopulate(self): """Convenience function to populate the repositories with the filelist metadata, and emit a log message only if new information is actually populated. """ necessary = False # I can't think of a nice way of doing this, we have to have the sack here # first or the below does nothing so... if self.pkgSack: for repo in self.repos.listEnabled(): if repo in repo.sack.added: if 'filelists' in repo.sack.added[repo]: continue else: necessary = True else: necessary = True if necessary: msg = _('Importing additional filelist information') self.verbose_logger.log(logginglevels.INFO_2, msg) self.repos.populateSack(mdtype='filelists') def yumUtilsMsg(self, func, prog): """Output a message that the given tool requires the yum-utils package, if it not installed. :param func: the function to output the message :param prog: the name of the tool that requires yum-utils """ if self.rpmdb.contains(name="yum-utils"): return hibeg, hiend = "", "" if hasattr(self, 'term'): hibeg, hiend = self.term.MODE['bold'], self.term.MODE['normal'] func(_("The program %s is found in the yum-utils package.") % self._try_bold(prog)) def buildTransaction(self, unfinished_transactions_check=True): """Go through the packages in the transaction set, find them in the packageSack or rpmdb, and pack up the transaction set accordingly. :param unfinished_transactions_check: whether to check for unfinished transactions before building the new transaction """ # FIXME: This is horrible, see below and yummain. Maybe create a real # rescode object? :( self._depsolving_failed = False if (unfinished_transactions_check and misc.find_unfinished_transactions(yumlibpath=self.conf.persistdir)): msg = _('There are unfinished transactions remaining. You might ' \ 'consider running yum-complete-transaction, or' \ ' "yum-complete-transaction --cleanup-only" and' \ ' "yum history redo last", first to finish them. If those' \ ' don\'t work you\'ll have to try removing/installing' \ ' packages by hand (maybe package-cleanup can help).') self.logger.critical(msg) self.yumUtilsMsg(self.logger.critical, "yum-complete-transaction") time.sleep(3) # XXX - we could add a conditional here to avoid running the plugins and # limit_installonly_pkgs, etc - if we're being run from yum-complete-transaction # and don't want it to happen. - skv self.plugins.run('preresolve') ds_st = time.time() (rescode, restring) = self.resolveDeps() self._limit_installonly_pkgs() # if enabled clean up requirments when removing the things which brought them in. if self.conf.clean_requirements_on_remove: self.verbose_logger.log(logginglevels.INFO_2, _('--> Finding unneeded leftover dependencies')) self._remove_old_deps() # We _must_ get rid of all the used tses before we go on, so that C-c # works for downloads / mirror failover etc. kern_pkgtup = None if rescode == 2 and self.conf.protected_packages: kern_pkgtup =misc.get_running_kernel_pkgtup(self.rpmdb.readOnlyTS()) self.rpmdb.ts = None # do the skip broken magic, if enabled and problems exist (rescode, restring) = self._doSkipBroken(rescode, restring) self.plugins.run('postresolve', rescode=rescode, restring=restring) if self.tsInfo.changed: (rescode, restring) = self.resolveDeps(rescode == 1) # If transaction was changed by postresolve plugins then we should run skipbroken again (rescode, restring) = self._doSkipBroken(rescode, restring, clear_skipped=False ) if self.tsInfo._pkgSack is not None: # Transactions have pkgSack? self.tsInfo.pkgSack.dropCachedData() # FIXME: This is horrible, see below and yummain. Maybe create a real # rescode object? :( self._depsolving_failed = rescode == 1 txmbrs = [] if rescode == 2 and self.conf.protected_multilib and self.arch.multilib: txmbrs = self.tsInfo.getMembersWithState(None, TS_INSTALL_STATES) vers = {} for txmbr in txmbrs: if self.allowedMultipleInstalls(txmbr.po): continue # Just allow these, it's easier. # In theory we could skip noarch packages here, but it's really # fast and there are some edge cases where it'll help. if txmbr.name not in vers: vers[txmbr.name] = [txmbr.po] continue vers[txmbr.name].append(txmbr.po) fine = [] xrestring = [] for pkgname in vers: if len(vers[pkgname]) <= 1: # We have to go govelling through the rpmdb data to get for pkg in self.rpmdb.searchNames([pkgname]): if self.tsInfo.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES): continue vers[pkgname].append(pkg) # If we have multiple packages, they should be of different arches # and so if all the versions are equal, we should be fine. first = vers[pkgname][0] for other in vers[pkgname][1:]: if first.verEQ(other): continue msg = _('Protected multilib versions: %s != %s') if not xrestring: # People are confused about protected mutilib ... so give # them a nicer message. bigmsg = _("""\ Multilib version problems found. This often means that the root cause is something else and multilib version checking is just pointing out that there is a problem. Eg.: 1. You have an upgrade for %(name)s which is missing some dependency that another package requires. Yum is trying to solve this by installing an older version of %(name)s of the different architecture. If you exclude the bad architecture yum will tell you what the root cause is (which package requires what). You can try redoing the upgrade with --exclude %(name)s.otherarch ... this should give you an error message showing the root cause of the problem. 2. You have multiple architectures of %(name)s installed, but yum can only see an upgrade for one of those architectures. If you don't want/need both architectures anymore then you can remove the one with the missing update and everything will work. 3. You have duplicate versions of %(name)s installed already. You can use "yum check" to get yum show these errors. ...you can also use --setopt=protected_multilib=false to remove this checking, however this is almost never the correct thing to do as something else is very likely to go wrong (often causing much more problems). """) % {'name' : pkgname} msg = bigmsg + msg xrestring.append(msg % (first, other)) if xrestring: rescode = 1 self._depsolving_failed = False restring = xrestring # This is a version of the old "protect-packages" plugin, it allows # you to erase duplicates and do remove+install. # But we don't allow you to turn it off!:) protect_states = [TS_OBSOLETED, TS_ERASE] txmbrs = [] if rescode == 2 and self.conf.protected_packages: protected = set(self.conf.protected_packages) txmbrs = self.tsInfo.getMembersWithState(None, protect_states) bad_togo = {} for txmbr in txmbrs: if kern_pkgtup is not None and txmbr.pkgtup == kern_pkgtup: pass elif kern_pkgtup is not None and txmbr.name == kern_pkgtup[0]: # We don't care if they've explicitly set protected on the # kernel package. Because we don't allow you to uninstall the # running one so it has _special_ semantics anyway. continue elif txmbr.name not in protected: continue if txmbr.name not in bad_togo: bad_togo[txmbr.name] = [] bad_togo[txmbr.name].append(txmbr.pkgtup) for ipkg in self.rpmdb.searchNames(bad_togo.keys()): if (kern_pkgtup is not None and ipkg.name == kern_pkgtup[0] and kern_pkgtup in bad_togo[kern_pkgtup[0]]): continue # If "running kernel" matches, it's always bad. if ipkg.name not in bad_togo: continue # If there is at least one version not being removed, allow it if ipkg.pkgtup not in bad_togo[ipkg.name]: del bad_togo[ipkg.name] for pkgname in bad_togo.keys(): if (kern_pkgtup is not None and pkgname == kern_pkgtup[0] and kern_pkgtup in bad_togo[kern_pkgtup[0]]): continue # If "running kernel" matches, it's always bad. for txmbr in self.tsInfo.matchNaevr(name=pkgname): if txmbr.name not in bad_togo: continue if txmbr.pkgtup in bad_togo[ipkg.name]: continue # If we are installing one version we aren't removing, allow it if txmbr.output_state in TS_INSTALL_STATES: del bad_togo[ipkg.name] if bad_togo: rescode = 1 restring = [] for pkgname in sorted(bad_togo): restring.append(_('Trying to remove "%s", which is protected') % pkgname) self._depsolving_failed = False if rescode == 2: if self.conf.autosavets: self.save_ts(auto=True) # Make sure we don't fail in rpm if we're installing a package that is # allowed multiple installs but has a newer version already installed. # Note that we already have a similar check in install(), but here we # do it to cover anything that was pulled in as a dependency. if rpm.RPMPROB_FILTER_OLDPACKAGE not in self.tsInfo.probFilterFlags: for m in self.tsInfo.getMembers(): if m.ts_state == 'i' and self.allowedMultipleInstalls(m.po): if self._enable_oldpackage_flag(m.po): break self.verbose_logger.debug('Depsolve time: %0.3f' % (time.time() - ds_st)) return rescode, restring def _doSkipBroken(self,rescode, restring, clear_skipped=True): ''' do skip broken if it is enabled ''' # if depsolve failed and skipbroken is enabled # The remove the broken packages from the transactions and # Try another depsolve if self.conf.skip_broken and rescode==1: if clear_skipped: self.skipped_packages = [] # reset the public list of skipped packages. sb_st = time.time() rescode, restring = self._skipPackagesWithProblems(rescode, restring) self._printTransaction() self.verbose_logger.debug('Skip-Broken time: %0.3f' % (time.time() - sb_st)) return (rescode, restring) def _skipPackagesWithProblems(self, rescode, restring): ''' Remove the packages with depsolve errors and depsolve again ''' def _remove(po, depTree, toRemove): if not po: return self._getPackagesToRemove(po, depTree, toRemove) # Only remove non installed packages from pkgSack _remove_from_sack(po) def _remove_from_sack(po): # get all compatible arch packages from pkgSack # we need to remove them too so i386 packages are not # dragged in when a x86_64 is skipped. pkgs = self._getPackagesToRemoveAllArch(po) for pkg in pkgs: if not po.repoid == 'installed' and pkg not in removed_from_sack: self.verbose_logger.debug('SKIPBROKEN: removing %s from pkgSack & updates' % str(po)) self.pkgSack.delPackage(pkg) self.up.delPackage(pkg.pkgtup) removed_from_sack.add(pkg) # Keep removing packages & Depsolve until all errors is gone # or the transaction is empty count = 0 skipped_po = set() removed_from_sack = set() orig_restring = restring # Keep the old error messages looping = 0 while (len(self.po_with_problems) > 0 and rescode == 1): count += 1 # Remove all the rpmdb cache data, this is somewhat heavy handed # but easier than removing/altering specific bits of the cache ... # and skip-broken shouldn't care too much about speed. self.rpmdb.transactionReset() self.installedFileRequires = None # Kind of hacky self.verbose_logger.debug("SKIPBROKEN: ########### Round %i ################" , count) if count == 30: # Failsafe, to avoid endless looping self.verbose_logger.debug('SKIPBROKEN: Too many loops ') break self._printTransaction() depTree = self._buildDepTree() startTs = set(self.tsInfo) toRemove = set() for po,wpo,err in self.po_with_problems: # check if the problem is caused by a package in the transaction if not self.tsInfo.exists(po.pkgtup): _remove(wpo, depTree, toRemove) else: _remove(po, depTree, toRemove) for po in toRemove: skipped = self._skipFromTransaction(po) for skip in skipped: skipped_po.add(skip) # make sure we get the compat arch packages skip from pkgSack and up too. if skip not in removed_from_sack and skip.repoid != 'installed': _remove_from_sack(skip) # Nothing was removed, so we still got a problem # the first time we get here we reset the resolved members of # tsInfo and takes a new run all members in the current transaction if not toRemove: looping += 1 if looping > 2: break # Bail out else: self.verbose_logger.debug('SKIPBROKEN: resetting already resolved packages (no packages to skip)' ) self.tsInfo.resetResolved(hard=True) rescode, restring = self.resolveDeps(True, skipping_broken=True) endTs = set(self.tsInfo) # Check if tsInfo has changes since we started to skip packages # if there is no changes then we got a loop. # the first time we get here we reset the resolved members of # tsInfo and takes a new run all members in the current transaction if startTs-endTs == set(): looping += 1 if looping > 2: break # Bail out else: self.verbose_logger.debug('SKIPBROKEN: resetting already resolved packages (transaction not changed)' ) self.tsInfo.resetResolved(hard=True) else: # Reset the looping counter, because it is only a loop if the same transaction is # unchanged two times in row, not if it has been unchanged in a early stage. looping = 0 # if we are all clear, then we have to check that the whole current transaction # can complete the depsolve without error, because the packages skipped # can have broken something that passed the tests earlier. # FIXME: We need do this in a better way. if rescode != 1: self.verbose_logger.debug('SKIPBROKEN: sanity check the current transaction' ) self.tsInfo.resetResolved(hard=True) self._checkMissingObsoleted() # This is totally insane, but needed :( self._checkUpdatedLeftovers() # Cleanup updated leftovers rescode, restring = self.resolveDeps() if rescode != 1: self.verbose_logger.debug("SKIPBROKEN: took %i rounds ", count) self.verbose_logger.info(_('\nPackages skipped because of dependency problems:')) skipped_list = [p for p in skipped_po] skipped_list.sort() for po in skipped_list: msg = _(" %s from %s") % (str(po),po.repo.id) self.verbose_logger.info(msg) self.skipped_packages.extend(skipped_list) # make the skipped packages public else: # If we can't solve the problems the show the original error messages. self.verbose_logger.info("Skip-broken could not solve problems") return 1, orig_restring return rescode, restring def _add_not_found(self, pkgs, nevra_dict): if pkgs: return None pkgtup = (nevra_dict['name'], nevra_dict['arch'], nevra_dict['epoch'], nevra_dict['version'], nevra_dict['release']) if None in pkgtup: return None return pkgtup def _add_not_found_a(self, pkgs, nevra_dict={}, pkgtup=None): if pkgtup is None and nevra_dict: pkgtup = self._add_not_found(pkgs, nevra_dict) if pkgtup is None: return self._not_found_a[pkgtup] = YumNotFoundPackage(pkgtup) def _add_not_found_i(self, pkgs, nevra_dict={}, pkgtup=None): if pkgtup is None and nevra_dict: pkgtup = self._add_not_found(pkgs, nevra_dict) if pkgtup is None: return self._not_found_i[pkgtup] = YumNotFoundPackage(pkgtup) def _checkMissingObsoleted(self): """ If multiple packages is obsoleting the same package then the TS_OBSOLETED can get removed from the transaction so we must make sure that they, exist and else create them """ for txmbr in self.tsInfo.getMembersWithState(None, [TS_OBSOLETING,TS_OBSOLETED]): for pkg in txmbr.obsoletes: if not self.tsInfo.exists(pkg.pkgtup): obs = self.tsInfo.addObsoleted(pkg,txmbr.po) self.verbose_logger.debug('SKIPBROKEN: Added missing obsoleted %s (%s)' % (pkg,txmbr.po) ) for pkg in txmbr.obsoleted_by: # check if the obsoleting txmbr is in the transaction # else remove the obsoleted txmbr # it clean out some really weird cases if not self.tsInfo.exists(pkg.pkgtup): self.verbose_logger.debug('SKIPBROKEN: Remove extra obsoleted %s (%s)' % (txmbr.po,pkg) ) self.tsInfo.remove(txmbr.po.pkgtup) def _checkUpdatedLeftovers(self): """ If multiple packages is updated the same package and this package get removed because of an dep issue then make sure that all the TS_UPDATED get removed. """ for txmbr in self.tsInfo.getMembersWithState(None, [TS_UPDATED]): for pkg in txmbr.updated_by: # check if the updating txmbr is in the transaction # else remove the updated txmbr # it clean out some really weird cases with dupes installed on the system if not self.tsInfo.exists(pkg.pkgtup): self.verbose_logger.debug('SKIPBROKEN: Remove extra updated %s (%s)' % (txmbr.po,pkg) ) self.tsInfo.remove(txmbr.po.pkgtup) def _getPackagesToRemoveAllArch(self,po): ''' get all compatible arch packages in pkgSack''' pkgs = [] if self.arch.multilib: n,a,e,v,r = po.pkgtup # skip for all compat archs for a in self.arch.archlist: pkgtup = (n,a,e,v,r) matched = self.pkgSack.searchNevra(n,e,v,r,a) pkgs.extend(matched) else: pkgs.append(po) return pkgs def _skipFromTransaction(self,po): skipped = [] n,a,e,v,r = po.pkgtup # skip for all compat archs for a in self.arch.archlist: pkgtup = (n,a,e,v,r) if self.tsInfo.exists(pkgtup): for txmbr in self.tsInfo.getMembers(pkgtup): pkg = txmbr.po skip = self._removePoFromTransaction(pkg) skipped.extend(skip) return skipped def _removePoFromTransaction(self,po): skip = [] if self.tsInfo.exists(po.pkgtup): self.verbose_logger.debug('SKIPBROKEN: removing %s from transaction' % str(po)) self.tsInfo.remove(po.pkgtup) if not po.repoid == 'installed': skip.append(po) return skip def _buildDepTree(self): ''' create a dictionary with po and deps ''' depTree = { } for txmbr in self.tsInfo: for dep in txmbr.depends_on: depTree.setdefault(dep, []).append(txmbr.po) # self._printDepTree(depTree) return depTree def _printDepTree(self, tree): for pkg, l in tree.iteritems(): print pkg for p in l: print "\t", p def _printTransaction(self): #transaction set states state = { TS_UPDATE : "update", TS_INSTALL : "install", TS_TRUEINSTALL: "trueinstall", TS_ERASE : "erase", TS_OBSOLETED : "obsoleted", TS_OBSOLETING : "obsoleting", TS_AVAILABLE : "available", TS_UPDATED : "updated"} self.verbose_logger.log(logginglevels.DEBUG_2,"SKIPBROKEN: Current Transaction : %i member(s) " % len(self.tsInfo)) for txmbr in sorted(self.tsInfo): msg = "SKIPBROKEN: %-11s : %s " % (state[txmbr.output_state],txmbr.po) self.verbose_logger.log(logginglevels.DEBUG_2, msg) for po,rel in sorted(set(txmbr.relatedto)): msg = "SKIPBROKEN: %s : %s" % (rel,po) self.verbose_logger.log(logginglevels.DEBUG_2, msg) self.verbose_logger.log(logginglevels.DEBUG_2,"SKIPBROKEN:%s" % (60 * "=")) def _getPackagesToRemove(self,po,deptree,toRemove): ''' get the (related) pos to remove. ''' toRemove.add(po) for txmbr in self.tsInfo.getMembers(po.pkgtup): for pkg in (txmbr.updates + txmbr.obsoletes): toRemove.add(pkg) self._getDepsToRemove(pkg, deptree, toRemove) # Remove related packages for (relative, relation) in txmbr.relatedto: toRemove.add(relative) self._getDepsToRemove(relative, deptree, toRemove) self._getDepsToRemove(po, deptree, toRemove) def _getDepsToRemove(self,po, deptree, toRemove): for dep in deptree.get(po, []): # Loop trough all deps of po more_deps = False for txmbr in self.tsInfo.getMembers(dep.pkgtup): txmbr.removeDep(po) if txmbr.depends_on: more_deps = True break for pkg in (txmbr.updates + txmbr.obsoletes): toRemove.add(pkg) if more_deps: # Others depend on this pkg, so leave it. bz#905899 continue if dep in toRemove: # If this is true we inf. recurse, so check continue # even though it shouldn't happen. bz#874065 toRemove.add(dep) self._getDepsToRemove(dep, deptree, toRemove) def _rpmdb_warn_checks(self, out=None, warn=True, chkcmd=None, header=None, ignore_pkgs=[]): if out is None: out = self.logger.warning if chkcmd is None: chkcmd = ['dependencies', 'duplicates'] if header is None: # FIXME: _N() msg = _("** Found %d pre-existing rpmdb problem(s)," " 'yum check' output follows:") header = lambda problems: not problems or out(msg % problems) if warn: out(_('Warning: RPMDB altered outside of yum.')) if type(chkcmd) in (type([]), type(set())): chkcmd = set(chkcmd) else: chkcmd = set([chkcmd]) ignore_pkgtups = set((pkg.pkgtup for pkg in ignore_pkgs)) rc = 0 probs = [] if chkcmd.intersection(set(('all', 'dependencies'))): prob2ui = {'requires' : _('missing requires'), 'conflicts' : _('installed conflict')} for prob in self.rpmdb.check_dependencies(): if prob.pkg.pkgtup in ignore_pkgtups: continue if prob.problem == 'conflicts': found = True # all the conflicting pkgs have to be ignored for res in prob.conflicts: if res.pkgtup not in ignore_pkgtups: found = False break if found: continue probs.append(prob) if chkcmd.intersection(set(('all', 'duplicates'))): iopkgs = set(self.conf.installonlypkgs) for prob in self.rpmdb.check_duplicates(iopkgs): if prob.pkg.pkgtup in ignore_pkgtups: continue if prob.duplicate.pkgtup in ignore_pkgtups: continue probs.append(prob) if chkcmd.intersection(set(('all', 'obsoleted'))): for prob in self.rpmdb.check_obsoleted(): if prob.pkg.pkgtup in ignore_pkgtups: continue if prob.obsoleter.pkgtup in ignore_pkgtups: continue probs.append(prob) if chkcmd.intersection(set(('all', 'provides'))): for prob in self.rpmdb.check_provides(): if prob.pkg.pkgtup in ignore_pkgtups: continue probs.append(prob) header(len(probs)) for prob in sorted(probs): out(prob) return probs def runTransaction(self, cb): """Perform the transaction. :param cb: an rpm callback object to use in the transaction :return: a :class:`yum.misc.GenericHolder` containing information about the results of the transaction :raises: :class:`yum.Errors.YumRPMTransError` if there is a transaction cannot be completed """ def create_snapshot(post=False): """Create the pre or post trans snapshot if we have free space.""" msg = _("Not enough space on logical volumes to create %s FS snapshot." % ("post trans" if post else "pre.")) try: has_space = self.fssnap.has_space(self.conf.fssnap_percentage) except LibLVMError as e: msg = _("Could not determine free space on logical volumes: ") + lvmerr2str(e) has_space = False if not has_space: if not post and self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'): raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg) else: self.verbose_logger.critical(msg) else: tags = {'*': ['reason=automatic']} # FIXME: pre. and post tags msg = _("Failed to create snapshot") try: snaps = self.fssnap.snapshot(self.conf.fssnap_percentage, tags=tags) except LibLVMError as e: msg += ": " + lvmerr2str(e) snaps = [] if not snaps: if not post and self.conf.fssnap_abort_on_errors in ('snapshot-failure', 'any'): raise Errors.YumRPMTransError(msg="Aborting transaction", errors=msg) else: self.verbose_logger.critical(msg) for (odev, ndev) in snaps: self.verbose_logger.info(_("Created snapshot from %s, results is: %s") % (odev, ndev)) if (self.conf.fssnap_automatic_pre or self.conf.fssnap_automatic_post) and not self.fssnap.available: msg = _("Snapshot support not available.") if self.conf.fssnap_abort_on_errors in ('broken-setup', 'any'): raise Errors.YumRPMTransError(msg="Aborting transaction.", errors=msg) else: self.verbose_logger.critical(msg) if self.fssnap.available and ((self.conf.fssnap_automatic_pre or self.conf.fssnap_automatic_post) and self.conf.fssnap_automatic_keep): # Automatically kill old snapshots... cleanup_fail = False try: snaps = self.fssnap.old_snapshots() except LibLVMError as e: self.verbose_logger.debug(lvmerr2str(e)) cleanup_fail = True snaps = [] snaps = sorted(snaps, key=lambda x: (x['ctime'], x['origin_dev']), reverse=True) last = '' num = 0 todel = [] for snap in snaps: num += 1 if last != snap['origin_dev']: last = snap['origin_dev'] num = 1 continue if num > self.conf.fssnap_automatic_keep: todel.append(snap['dev']) # Display something to the user? try: snaps = self.fssnap.del_snapshots(devices=todel) except LibLVMError as e: self.verbose_logger.debug(lvmerr2str(e)) cleanup_fail = True snaps = [] if len(snaps): self.verbose_logger.info(_("Deleted %u snapshots.") % len(snaps)) elif cleanup_fail: self.verbose_logger.warning(_("Skipping the cleanup of old " "snapshots due to errors")) if (self.fssnap.available and (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and self.conf.fssnap_automatic_pre)): create_snapshot() self.plugins.run('pretrans') # We may want to put this other places, eventually, but for now it's # good as long as we get it right for history. for repo in self.repos.listEnabled(): if repo._xml2sqlite_local: self.run_with_package_names.add('yum-metadata-parser') break if (not self.conf.history_record or self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST)): frpmdbv = self.tsInfo.futureRpmDBVersion() else: using_pkgs_pats = list(self.run_with_package_names) using_pkgs = self.rpmdb.returnPackages(patterns=using_pkgs_pats) rpmdbv = self.rpmdb.simpleVersion(main_only=True)[0] lastdbv = self.history.last() if lastdbv is not None: lastdbv = lastdbv.end_rpmdbversion rpmdb_problems = [] if lastdbv is None or rpmdbv != lastdbv: txmbrs = self.tsInfo.getMembersWithState(None, TS_REMOVE_STATES) ignore_pkgs = [txmbr.po for txmbr in txmbrs] output_warn = lastdbv is not None rpmdb_problems = self._rpmdb_warn_checks(warn=output_warn, ignore_pkgs=ignore_pkgs) cmdline = None if hasattr(self, 'args') and self.args: cmdline = ' '.join(self.args) elif hasattr(self, 'cmds') and self.cmds: cmdline = ' '.join(self.cmds) frpmdbv = self.tsInfo.futureRpmDBVersion() self.history.beg(rpmdbv, using_pkgs, list(self.tsInfo), self.skipped_packages, rpmdb_problems, cmdline) # write out our config and repo data to additional history info self._store_config_in_history() if hasattr(self, '_shell_history_write'): # Only in cli... self._shell_history_write() self.plugins.run('historybegin') # Just before we update the transaction, update what we think the # rpmdb will look like. This needs to be done before the run, so that if # "something" happens and the rpmdb is different from what we think it # will be we store what we thought, not what happened (so it'll be an # invalid cache). self.rpmdb.transactionResultVersion(frpmdbv) # transaction has started - all bets are off on our saved ts file if self._ts_save_file is not None: # write the saved transaction data to the addon location in history # so we can pull it back later if we need to savetx_msg = open(self._ts_save_file, 'r').read() self.history.write_addon_data('saved_tx', savetx_msg) try: os.unlink(self._ts_save_file) except (IOError, OSError), e: pass self._ts_save_file = None if self.conf.reset_nice: onice = os.nice(0) if onice: try: os.nice(-onice) except: onice = 0 errors = self.ts.run(cb.callback, '') # ts.run() exit codes are, hmm, "creative": None means all ok, empty # list means some errors happened in the transaction and non-empty # list that there were errors preventing the ts from starting... if self.conf.reset_nice: try: os.nice(onice) except: pass # make resultobject - just a plain yumgenericholder object resultobject = misc.GenericHolder() resultobject.return_code = 0 if errors is None: pass elif len(errors) == 0: errstring = _('Warning: scriptlet or other non-fatal errors occurred during transaction.') self.verbose_logger.debug(errstring) resultobject.return_code = 1 else: if self.conf.history_record and not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST): herrors = [to_unicode(to_str(x)) for x in errors] self.plugins.run('historyend') self.history.end(rpmdbv, 2, errors=herrors) self.logger.critical(_("Transaction couldn't start:")) for e in errors: self.logger.critical(e[0]) # should this be 'to_unicoded'? raise Errors.YumRPMTransError(msg=_("Could not run transaction."), errors=errors) if not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST): self.cleanUsedHeadersPackages() for i in ('ts_all_fn', 'ts_done_fn'): if hasattr(cb, i): fn = getattr(cb, i) try: misc.unlink_f(fn) except (IOError, OSError), e: self.logger.critical(_('Failed to remove transaction file %s') % fn) # drop out the rpm cache so we don't step on bad hdr indexes if (self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) or resultobject.return_code): self.rpmdb.dropCachedData() else: self.rpmdb.dropCachedDataPostTransaction(list(self.tsInfo)) self.plugins.run('posttrans') # sync up what just happened versus what is in the rpmdb if not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST): vTcb = None if hasattr(cb, 'verify_txmbr'): vTcb = cb.verify_txmbr self.verifyTransaction(resultobject, vTcb) if self.conf.group_command == 'objects': self.igroups.save() if (self.fssnap.available and (not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST) and self.conf.fssnap_automatic_post)): create_snapshot(post=True) return resultobject def verifyTransaction(self, resultobject=None, txmbr_cb=None): """Check that the transaction did what was expected, and propagate external yumdb information. Output error messages if the transaction did not do what was expected. :param resultobject: the :class:`yum.misc.GenericHolder` object returned from the :func:`runTransaction` call that ran the transaction :param txmbr_cb: the callback for the rpm transaction members """ # check to see that the rpmdb and the tsInfo roughly matches # push package object metadata outside of rpmdb into yumdb # delete old yumdb metadata entries # for each pkg in the tsInfo # if it is an install - see that the pkg is installed # if it is a remove - see that the pkg is no longer installed, provided # that there is not also an install of this pkg in the tsInfo (reinstall) # for any kind of install add from_repo to the yumdb, and the cmdline # and the install reason def _call_txmbr_cb(txmbr, count): if txmbr_cb is not None: count += 1 txmbr_cb(txmbr, count) return count oil = self.conf.override_install_langs if not oil: oil = rpm.expandMacro("%_install_langs") if oil == 'all': oil = '' elif oil: oil = ":".join(sorted(oil.split(':'))) vt_st = time.time() self.plugins.run('preverifytrans') count = 0 for txmbr in self.tsInfo: if txmbr.output_state in TS_INSTALL_STATES: if not self.rpmdb.contains(po=txmbr.po): # maybe a file log here, too # but raising an exception is not going to do any good self.logger.critical(_('%s was supposed to be installed' \ ' but is not!') % txmbr.po) # Note: Get Panu to do te.Failed() so we don't have to txmbr.output_state = TS_FAILED count = _call_txmbr_cb(txmbr, count) continue count = _call_txmbr_cb(txmbr, count) po = self.getInstalledPackageObject(txmbr.pkgtup) rpo = txmbr.po po.yumdb_info.from_repo = rpo.repoid po.yumdb_info.reason = txmbr.reason po.yumdb_info.releasever = self.conf.yumvar['releasever'] for var in self.conf.yumvar: # Store all yum variables. # Skip some of the variables... if var == 'releasever': continue if var == 'basearch': continue # This "never" changes. if var == 'arch': continue # Skip uuid? setattr(po.yumdb_info, 'var_' + var, self.conf.yumvar[var]) if oil: po.yumdb_info.ts_install_langs = oil if 'nocontexts' in self.conf.tsflags: po.yumdb_info.tsflag_nocontexts = 'true' if 'nodocs' in self.conf.tsflags: po.yumdb_info.tsflag_nodocs = 'true' if 'noscripts' in self.conf.tsflags: po.yumdb_info.tsflag_noscripts = 'true' if 'notriggers' in self.conf.tsflags: po.yumdb_info.tsflag_notriggers = 'true' if hasattr(self, 'args') and self.args: po.yumdb_info.command_line = ' '.join(self.args) elif hasattr(self, 'cmds') and self.cmds: po.yumdb_info.command_line = ' '.join(self.cmds) csum = rpo.returnIdSum() if csum is not None: po.yumdb_info.checksum_type = str(csum[0]) po.yumdb_info.checksum_data = str(csum[1]) if isinstance(rpo, YumLocalPackage): try: st = os.stat(rpo.localPkg()) lp_ctime = str(int(st.st_ctime)) lp_mtime = str(int(st.st_mtime)) po.yumdb_info.from_repo_revision = lp_ctime po.yumdb_info.from_repo_timestamp = lp_mtime except: pass if rpo.xattr_origin_url is not None: po.yumdb_info.origin_url = rpo.xattr_origin_url if hasattr(rpo.repo, 'repoXML'): md = rpo.repo.repoXML if md and md.revision is not None: po.yumdb_info.from_repo_revision = str(md.revision) if md: po.yumdb_info.from_repo_timestamp = str(md.timestamp) if hasattr(txmbr, 'group_member'): # FIXME: po.yumdb_info.group_member = txmbr.group_member loginuid = misc.getloginuid() if txmbr.updates or txmbr.downgrades or txmbr.reinstall: if txmbr.updates: opo = txmbr.updates[0] elif txmbr.downgrades: opo = txmbr.downgrades[0] else: opo = po if 'installed_by' in opo.yumdb_info: po.yumdb_info.installed_by = opo.yumdb_info.installed_by if 'group_member' in opo.yumdb_info: po.yumdb_info.group_member = opo.yumdb_info.group_member if loginuid is not None: po.yumdb_info.changed_by = str(loginuid) elif loginuid is not None: po.yumdb_info.installed_by = str(loginuid) if self.conf.history_record: self.history.sync_alldb(po) # Remove old ones after installing new ones, so we can copy values. for txmbr in self.tsInfo: if txmbr.output_state in TS_INSTALL_STATES: pass elif txmbr.output_state in TS_REMOVE_STATES: if self.rpmdb.contains(po=txmbr.po): if not self.tsInfo.getMembersWithState(pkgtup=txmbr.pkgtup, output_states=TS_INSTALL_STATES): # maybe a file log here, too # but raising an exception is not going to do any good # Note: This actually triggers atm. because we can't # always find the erased txmbr to set it when # we should. self.logger.critical(_('%s was supposed to be removed' \ ' but is not!' % txmbr.po)) # Note: Get Panu to do te.Failed() so we don't have to txmbr.output_state = TS_FAILED count = _call_txmbr_cb(txmbr, count) continue count = _call_txmbr_cb(txmbr, count) yumdb_item = self.rpmdb.yumdb.get_package(po=txmbr.po) yumdb_item.clean() else: count = _call_txmbr_cb(txmbr, count) self.verbose_logger.log(logginglevels.DEBUG_2, 'What is this? %s' % txmbr.po) self.plugins.run('postverifytrans') rpmdbv = self.rpmdb.simpleVersion(main_only=True)[0] if self.conf.history_record and not self.ts.isTsFlagSet(rpm.RPMTRANS_FLAG_TEST): ret = -1 if resultobject is not None: ret = resultobject.return_code self.plugins.run('historyend') self.history.end(rpmdbv, ret) self.rpmdb.dropCachedData() self.verbose_logger.debug('VerifyTransaction time: %0.3f' % (time.time() - vt_st)) def costExcludePackages(self): """Create an excluder for repositories with higher costs. For example, if repo-A:cost=1 and repo-B:cost=2, this function will set up an excluder on repo-B that looks for packages in repo-B. """ # if all the repo.costs are equal then don't bother running things costs = {} for r in self.repos.listEnabled(): costs.setdefault(r.cost, []).append(r) if len(costs) <= 1: return done = False exid = "yum.costexcludes" orepos = [] for cost in sorted(costs): if done: # Skip the first one, as they have lowest cost so are good. for repo in costs[cost]: yce = _YumCostExclude(repo, self.repos) repo.sack.addPackageExcluder(repo.id, exid, 'exclude.pkgtup.in', yce) orepos.extend(costs[cost]) done = True def excludePackages(self, repo=None): """Remove packages from packageSacks based on global exclude lists, command line excludes and per-repository excludes. :param repo: a repo object to use. If not given, all repositories are used """ if "all" in self.conf.disable_excludes: return # if not repo: then assume global excludes, only # if repo: then do only that repos' packages and excludes if not repo: # global only if "main" in self.conf.disable_excludes: return excludelist = self.conf.exclude repoid = None exid_beg = 'yum.excludepkgs' else: if repo.id in self.conf.disable_excludes: return excludelist = repo.getExcludePkgList() repoid = repo.id exid_beg = 'yum.excludepkgs.' + repoid count = 0 for match in excludelist: count += 1 exid = "%s.%u" % (exid_beg, count) self.pkgSack.addPackageExcluder(repoid, exid,'exclude.match', match) def includePackages(self, repo): """Remove packages from packageSacks based on list of packages to include. :param repo: the repository to use """ for di in getattr(self.conf, 'disable_includes', []): if di == 'all' or di == repo.id: return includelist = repo.getIncludePkgList() if len(includelist) == 0: return # includepkgs actually means "exclude everything that doesn't match". # So we mark everything, then wash those we want to keep and then # exclude everything that is marked. exid = "yum.includepkgs.1" self.pkgSack.addPackageExcluder(repo.id, exid, 'mark.washed') count = 0 for match in includelist: count += 1 exid = "%s.%u" % ("yum.includepkgs.2", count) self.pkgSack.addPackageExcluder(repo.id, exid, 'wash.match', match) exid = "yum.includepkgs.3" self.pkgSack.addPackageExcluder(repo.id, exid, 'exclude.marked') def doLock(self, lockfile = YUM_PID_FILE): """Acquire the yum lock. :param lockfile: the file to use for the lock :raises: :class:`yum.Errors.LockError` """ if self.conf.uid != 0: # If we are a user, assume we are using the root cache ... so don't # bother locking. if self.conf.cache: return root = self.conf.cachedir # Don't want /var/run/yum.pid ... just: /yum.pid lockfile = os.path.basename(lockfile) else: root = self.conf.installroot lockfile = root + '/' + lockfile # lock in the chroot lockfile = os.path.normpath(lockfile) # get rid of silly preceding extra / mypid=str(os.getpid()) while True: ret = self._lock(lockfile, mypid, 0644) if ret: break oldpid = self._get_locker(lockfile) if not oldpid: # Invalid locker: unlink lockfile and retry self._unlock(lockfile) continue if oldpid == os.getpid(): # if we own the lock, we're fine ret = 1 break # Another copy seems to be running. msg = _('Existing lock %s: another copy is running as pid %s.') % (lockfile, oldpid) raise Errors.LockError(0, msg, oldpid) if ret == 2: # Means lockdir isn't setup, out of bad options just run without # locks. return assert ret == 1 # We've got the lock, store it so we can auto-unlock on __del__... self._lockfile = lockfile def doUnlock(self, lockfile=None): """Release the yum lock. :param lockfile: the lock file to use. If not given, the file that was given as a parameter to the :func:`doLock` call that closed the lock is used """ # if we're not root then we don't lock - just return nicely # Note that we can get here from __del__, so if we haven't created # YumBase.conf we don't want to do so here as creating stuff inside # __del__ is bad. if hasattr(self, 'preconf'): return # Obviously, we can't lock random places as non-root, but we still want # to get rid of our lock file. Given we now have _lockfile I'm pretty # sure nothing should ever pass lockfile in here anyway. if self.conf.uid != 0: lockfile = None if lockfile is not None: root = self.conf.installroot lockfile = root + '/' + lockfile # lock in the chroot elif self._lockfile is None: return # Don't delete other people's lock files on __del__ else: lockfile = self._lockfile # Get the value we locked with self._unlock(lockfile) self._lockfile = None @staticmethod def _lock(filename, contents='', mode=0777): lockdir = os.path.dirname(filename) try: if not os.path.exists(lockdir): # We used to os.makedirs(lockdir, mode=0755) ... but that # causes problems now due to /var/run being a magic systemd dir. # So we now just give up and run, hopefully nobody runs N # instances before the magic dir. is activate. return 2 fd = os.open(filename, os.O_EXCL|os.O_CREAT|os.O_WRONLY, mode) os.write(fd, contents) os.close(fd) return 1 except OSError, msg: if not msg.errno == errno.EEXIST: # Whoa. What the heck happened? errmsg = _('Could not create lock at %s: %s ') % (filename, exception2msg(msg)) raise Errors.LockError(msg.errno, errmsg, int(contents)) return 0 @staticmethod def _unlock(filename): misc.unlink_f(filename) @staticmethod def _get_locker(lockfile): try: fd = open(lockfile, 'r') except (IOError, OSError), e: msg = _("Could not open lock %s: %s") % (lockfile, e) raise Errors.LockError(errno.EPERM, msg) try: oldpid = int(fd.readline()) except ValueError: return None # Bogus pid try: stat = open("/proc/%d/stat" % oldpid).readline() if stat.split()[2] == 'Z': return None # The pid is a zombie except IOError: # process dead or /proc not mounted try: os.kill(oldpid, 0) except OSError, e: if e[0] == errno.ESRCH: return None # The pid doesn't exist # Whoa. What the heck happened? msg = _('Unable to check if PID %s is active') % oldpid raise Errors.LockError(errno.EPERM, msg, oldpid) return oldpid def verifyPkg(self, fo, po, raiseError): """Check that the checksum of a remote package matches what we expect it to be. If the checksum of the package file is wrong, and the file is also larger than expected, it cannot be redeemed, so delete it. :param fo: the file object of the package :param po: the package object to verify :param raiseError: if *raiseError* is 1, and the package does not check out, a :class:`URLGrabError will be raised. Defaults to 0 :return: True if the package is verified successfully. Otherwise, False will be returned, unless *raiseError* is 1, in which case a :class:`URLGrabError` will be raised :raises: :class:`URLGrabError` if verification fails, and *raiseError* is 1 """ failed = False if type(fo) is types.InstanceType: fo = fo.filename if fo != po.localPkg(): po.localpath = fo if not po.verifyLocalPkg(): failed = True else: ylp = YumLocalPackage(self.rpmdb.readOnlyTS(), fo) if ylp.pkgtup != po.pkgtup: failed = True if failed: # if the file is wrong AND it is >= what we expected then it # can't be redeemed. If we can, kill it and start over fresh cursize = os.stat(fo)[6] totsize = long(po.size) if cursize >= totsize and not po.repo.cache: # if the path to the file is NOT inside the pkgdir then don't # unlink it b/c it is probably a file:// url and possibly not # unlinkable if fo.startswith(po.repo.pkgdir): os.unlink(fo) if raiseError: msg = _('Package does not match intended download. Suggestion: run yum --enablerepo=%s clean metadata') % po.repo.id raise URLGrabError(-1, msg) else: return False return True def verifyChecksum(self, fo, checksumType, csum): """Verify that the checksum of the given file matches the given checksum. :param fo: the file object to verify the checksum of :param checksumType: the type of checksum to use :parm csum: the checksum to check against :return: 0 if the checksums match :raises: :class:`URLGrabError` if there is an error performing the checksums, or the checksums do not match """ try: filesum = misc.checksum(checksumType, fo) except Errors.MiscError, e: raise URLGrabError(-3, _('Could not perform checksum')) if filesum != csum: raise URLGrabError(-1, _('Package does not match checksum')) return 0 def downloadPkgs(self, pkglist, callback=None, callback_total=None): """Download the packages specified by the given list of package objects. :param pkglist: a list of package objects specifying the packages to download :param callback: unused :param callback_total: a callback to output messages about the download operation :return: a dictionary containing errors from the downloading process :raises: :class:`URLGrabError` """ def mediasort(apo, bpo): # FIXME: we should probably also use the mediaid; else we # could conceivably ping-pong between different disc1's a = apo.getDiscNum() b = bpo.getDiscNum() if a is None and b is None: # deltas first to start rebuilding asap return cmp(isinstance(bpo, DeltaPackage), isinstance(apo, DeltaPackage)) or cmp(apo, bpo) if a is None: return -1 if b is None: return 1 if a < b: return -1 elif a > b: return 1 return 0 errors = {} def adderror(po, msg): errors.setdefault(po, []).append(msg) if po.localpath.endswith('.tmp'): misc.unlink_f(po.localpath) # won't resume this.. # We close the history DB here because some plugins (presto) use # threads. And sqlite really doesn't like threads. And while I don't # think it should matter, we've had some reports of history DB # corruption, and it was implied that it happened just after C-c # at download time and this is a safe thing to do. # Note that manual testing shows that history is not connected by # this point, from the cli with no plugins. So this really does # nothing *sigh*. self.history.close() self.plugins.run('predownload', pkglist=pkglist) beenthere = set() # only once, please. BZ 468401 downloadonly = getattr(self.conf, 'downloadonly', False) remote_pkgs = [] remote_size = 0 def verify_local(po): local = po.localPkg() if local in beenthere: # This is definitely a depsolver bug. Make it fatal? self.verbose_logger.warn(_("ignoring a dupe of %s") % po) return True beenthere.add(local) if downloadonly and not os.path.exists(local): # Check before we munge the name... po.repo._preload_pkg_from_system_cache(po) if os.path.exists(local): if self.verifyPkg(local, po, False): self.verbose_logger.debug(_("using local copy of %s") % po) return True if po.repo.cache: adderror(po, _('package fails checksum but caching is ' 'enabled for %s') % po.repo.id) return False if downloadonly: po.localpath += '.%d.tmp' % os.getpid() try: os.rename(local, po.localpath) except OSError: pass po.returnIdSum() po.basepath # prefetch now; fails when repos are closed return False pkgs = [] for po in pkglist: if hasattr(po, 'pkgtype') and po.pkgtype == 'local': continue if verify_local(po): continue if errors: return errors pkgs.append(po) # download presto metadata and use drpms presto = DeltaInfo(self, pkgs, adderror) deltasize = rpmsize = 0 for po in pkgs: if isinstance(po, DeltaPackage): if verify_local(po): # there's .drpm already, use it presto.rebuild(po) continue deltasize += po.size rpmsize += po.rpm.size remote_pkgs.append(po) remote_size += po.size if deltasize: self.verbose_logger.info(_('Delta RPMs reduced %s of updates to %s (%d%% saved)'), format_number(rpmsize), format_number(deltasize), 100 - deltasize*100.0/rpmsize) if downloadonly: if hasattr(self, '_old_cachedir'): # Try to link/copy them out, if we have somewhere to put them. for po in pkglist: if not po.localpath.startswith(self.conf.cachedir): continue end = po.localpath[len(self.conf.cachedir):] try: os.link(po.localpath, self._old_cachedir + end) except: try: shutil.copy2(po.localpath, self._old_cachedir + end) except: pass # close DBs, unlock self.repos.close() self.closeRpmDB() self.doUnlock() beg_download = time.time() all_remote_pkgs = remote_pkgs all_remote_size = remote_size while True: remote_pkgs.sort(mediasort) # This is kind of a hack and does nothing in non-Fedora versions, # we'll fix it one way or anther soon. if (hasattr(urlgrabber.progress, 'text_meter_total_size') and len(remote_pkgs) > 1): urlgrabber.progress.text_meter_total_size(remote_size) i = 0 local_size = [0] done_repos = set() async = hasattr(urlgrabber.grabber, 'parallel_wait') for po in remote_pkgs: i += 1 def checkfunc(obj, po=po): self.verifyPkg(obj, po, 1) if po.localpath.endswith('.tmp'): rpmfile = po.localpath.rsplit('.', 2)[0] os.rename(po.localpath, rpmfile) po.localpath = rpmfile local_size[0] += po.size if hasattr(urlgrabber.progress, 'text_meter_total_size'): urlgrabber.progress.text_meter_total_size(remote_size, local_size[0]) if isinstance(po, DeltaPackage): presto.rebuild(po) return else: presto.dequeue_max() if po.repoid not in done_repos: done_repos.add(po.repoid) # Check a single package per. repo. ... to give a hint to # the user on big downloads. result, errmsg = self.sigCheckPkg(po) if result != 0: self.verbose_logger.warn("%s", errmsg) if po in errors: del errors[po] text = os.path.basename(po.relativepath) kwargs = {} if async and po.repo._async: kwargs['failfunc'] = lambda obj, po=po: adderror(po, exception2msg(obj.exception)) kwargs['async'] = True elif not (i == 1 and not local_size[0] and remote_size == po.size): text = '(%s/%s): %s' % (i, len(remote_pkgs), text) try: po.repo.getPackage(po, checkfunc=checkfunc, text=text, cache=po.repo.http_caching != 'none', **kwargs ) except Errors.RepoError, e: adderror(po, exception2msg(e)) if async: try: urlgrabber.grabber.parallel_wait() except KeyboardInterrupt: for po in remote_pkgs: if po.localpath.endswith('.tmp'): misc.unlink_f(po.localpath) elif isinstance(po, DeltaPackage) and po.rpm.localpath.endswith('.tmp'): misc.unlink_f(po.rpm.localpath) raise presto.dequeue_all() presto.wait() if hasattr(urlgrabber.progress, 'text_meter_total_size'): urlgrabber.progress.text_meter_total_size(0) fatal = False for po in errors: if not isinstance(po, DeltaPackage): fatal = True break if not errors or fatal: break # there were drpm related errors *only* remote_pkgs = [] remote_size = 0 for po in errors: po = po.rpm remote_pkgs.append(po) remote_size += po.size # callback_total needs the total pkg count all_remote_pkgs.extend(remote_pkgs) all_remote_size += remote_size errors.clear() self.verbose_logger.warn(_('Some delta RPMs failed to download or rebuild. Retrying..')) if callback_total and not errors: callback_total(all_remote_pkgs, all_remote_size, beg_download) if not downloadonly: # XXX: Run unlocked? Skip this for now.. self.plugins.run('postdownload', pkglist=pkglist, errors=errors) # Close curl object after we've downloaded everything. if hasattr(urlgrabber.grabber, 'reset_curl_obj'): urlgrabber.grabber.reset_curl_obj() if downloadonly and not errors: # caller handles errors self.verbose_logger.info(_('exiting because "Download Only" specified')) sys.exit(self.exit_code) return errors def verifyHeader(self, fo, po, raiseError): """Check that the header of the given file object and matches the given package. :param fo: the file object to check :param po: the package object to check :param raiseError: if *raiseError* is True, a :class:`URLGrabError` will be raised if the header matches the package object, or cannot be read from the file. If *raiseError* is False, 0 will be returned in the above cases :return: 1 if the header matches the package object, and 0 if they do not match, and *raiseError* is False :raises: :class:`URLGrabError` if *raiseError* is True, and the header does not match the package object or cannot be read from the file """ if type(fo) is types.InstanceType: fo = fo.filename try: hlist = rpm.readHeaderListFromFile(fo) hdr = hlist[0] except (rpm.error, IndexError): if raiseError: raise URLGrabError(-1, _('Header is not complete.')) else: return 0 yip = YumInstalledPackage(hdr) # we're using YumInstalledPackage b/c # it takes headers if yip.pkgtup != po.pkgtup: if raiseError: raise URLGrabError(-1, 'Header does not match intended download') else: return 0 return 1 def downloadHeader(self, po): """Download a header from a package object. :param po: the package object to download the header from :raises: :class:`yum.Errors.RepoError` if there are errors obtaining the header """ if hasattr(po, 'pkgtype') and po.pkgtype == 'local': return errors = {} local = po.localHdr() repo = self.repos.getRepo(po.repoid) if os.path.exists(local): try: result = self.verifyHeader(local, po, raiseError=1) except URLGrabError, e: # might add a check for length of file - if it is < # required doing a reget misc.unlink_f(local) else: po.hdrpath = local return else: if self.conf.cache: raise Errors.RepoError, \ _('Header not in local cache and caching-only mode enabled. Cannot download %s') % po.hdrpath if self.dsCallback: self.dsCallback.downloadHeader(po.name) try: if not os.path.exists(repo.hdrdir): os.makedirs(repo.hdrdir) checkfunc = (self.verifyHeader, (po, 1), {}) hdrpath = repo.getHeader(po, checkfunc=checkfunc, cache=repo.http_caching != 'none', ) except Errors.RepoError, e: saved_repo_error = e try: misc.unlink_f(local) except OSError, e: raise Errors.RepoError, saved_repo_error else: raise Errors.RepoError, saved_repo_error else: po.hdrpath = hdrpath return def sigCheckPkg(self, po): """Verify the GPG signature of the given package object. :param po: the package object to verify the signature of :return: (result, error_string) where result is:: 0 = GPG signature verifies ok or verification is not required. 1 = GPG verification failed but installation of the right GPG key might help. 2 = Fatal GPG verification error, give up. """ if self._override_sigchecks: check = False hasgpgkey = 0 elif hasattr(po, 'pkgtype') and po.pkgtype == 'local': check = self.conf.localpkg_gpgcheck hasgpgkey = 0 else: repo = self.repos.getRepo(po.repoid) check = repo.gpgcheck hasgpgkey = not not repo.gpgkey if check: ts = self.rpmdb.readOnlyTS() sigresult = rpmUtils.miscutils.checkSig( ts, po.localPkg(), payload=self.conf.payload_gpgcheck, ) localfn = os.path.basename(po.localPkg()) if sigresult == 0: result = 0 msg = '' elif sigresult == 1: if hasgpgkey: result = 1 else: result = 2 msg = _('Public key for %s is not installed') % localfn elif sigresult == 2: result = 2 msg = _('Problem opening package %s') % localfn elif sigresult == 3: if hasgpgkey: result = 1 else: result = 2 result = 1 msg = _('Public key for %s is not trusted') % localfn elif sigresult == 4: result = 2 msg = _('Package %s is not signed') % localfn else: result =0 msg = '' return result, msg def cleanUsedHeadersPackages(self): """Delete the header and package files used in the transaction from the yum cache. """ filelist = [] for txmbr in self.tsInfo: if txmbr.po.state not in TS_INSTALL_STATES: continue if txmbr.po.repoid == "installed": continue if txmbr.po.repoid not in self.repos.repos: continue if txmbr.po.repo.keepcache: continue # make sure it's not a local file repo = self.repos.repos[txmbr.po.repoid] local = False for u in repo.baseurl: if u.startswith("file:"): local = True break if local: filelist.extend([txmbr.po.localHdr()]) else: txmbr.po.xattr_origin_url # Load this, before we rm the file. filelist.extend([txmbr.po.localPkg(), txmbr.po.localHdr()]) # now remove them for fn in filelist: if not os.path.exists(fn): continue try: misc.unlink_f(fn) except OSError, e: self.logger.warning(_('Cannot remove %s'), fn) continue else: self.verbose_logger.log(logginglevels.DEBUG_4, _('%s removed'), fn) def cleanHeaders(self): """Delete the header files from the yum cache.""" exts = ['hdr'] return self._cleanFiles(exts, 'hdrdir', 'header') def cleanPackages(self): """Delete the package files from the yum cache.""" exts = ['rpm'] return self._cleanFiles(exts, 'pkgdir', 'package') def cleanSqlite(self): """Delete the sqlite files from the yum cache.""" exts = ['sqlite', 'sqlite.bz2', 'sqlite.gz', 'sqlite.xz', 'sqlite-journal'] return self._cleanFiles(exts, 'cachedir', 'sqlite') def cleanMetadata(self): """Delete the metadata files from the yum cache.""" exts = ['xml.gz', 'xml', 'cachecookie', 'mirrorlist.txt', 'asc', 'xml.bz2', 'xml.xz'] # Metalink is also here, but is a *.xml file return self._cleanFiles(exts, 'cachedir', 'metadata') def cleanExpireCache(self): """Delete the local data saying when the metadata and mirror lists were downloaded for each repository.""" exts = ['cachecookie', 'mirrorlist.txt'] return self._cleanFiles(exts, 'cachedir', 'metadata') def cleanRpmDB(self): """Delete any cached data from the local rpmdb.""" cachedir = self.conf.persistdir + "/rpmdb-indexes/" if not os.path.exists(cachedir): filelist = [] else: filelist = misc.getFileList(cachedir, '', []) return self._cleanFilelist('rpmdb', filelist) def getCachedirGlob(self, dynvar): """Return a glob matching all dirs where yum stores cache files, based on cachedir and the given list of dynamic vars.""" yumvar = self.conf.yumvar.copy() for d in dynvar: yumvar[d] = '*' instroot = config.varReplace(self.conf.installroot, self.conf.yumvar) cachedir = config.varReplace(self.conf._pristine_cachedir, yumvar) return (instroot + cachedir).replace('//', '/') def _cleanFiles(self, exts, pathattr, filetype): filelist = [] for ext in exts: for repo in self.repos.listEnabled(): path = getattr(repo, pathattr) if os.path.exists(path) and os.path.isdir(path): filelist = misc.getFileList(path, ext, filelist) return self._cleanFilelist(filetype, filelist) def _cleanFilelist(self, filetype, filelist): removed = 0 for item in filelist: try: misc.unlink_f(item) except OSError, e: self.logger.critical(_('Cannot remove %s file %s'), filetype, item) continue else: self.verbose_logger.log(logginglevels.DEBUG_4, _('%s file %s removed'), filetype, item) removed+=1 msg = P_('%d %s file removed', '%d %s files removed', removed) % (removed, filetype) return 0, [msg] def doPackageLists(self, pkgnarrow='all', patterns=None, showdups=None, ignore_case=False, repoid=None): """Return a :class:`yum.misc.GenericHolder` containing lists of package objects. The contents of the lists are specified in various ways by the arguments. :param pkgnarrow: a string specifying which types of packages lists to produces, such as updates, installed, available, etc. :param patterns: a list of names or wildcards specifying packages to list :param showdups: whether to include duplicate packages in the lists :param ignore_case: whether to ignore case when searching by package names :param repoid: repoid that all pkgs will belong to :return: a :class:`yum.misc.GenericHolder` instance with the following lists defined:: available = list of packageObjects installed = list of packageObjects updates = tuples of packageObjects (updating, installed) extras = list of packageObjects obsoletes = tuples of packageObjects (obsoleting, installed) recent = list of packageObjects """ if showdups is None: showdups = self.conf.showdupesfromrepos ygh = misc.GenericHolder(iter=pkgnarrow) installed = [] available = [] reinstall_available = [] old_available = [] updates = [] obsoletes = [] obsoletesTuples = [] recent = [] extras = [] ic = ignore_case # list all packages - those installed and available, don't 'think about it' if pkgnarrow == 'all': dinst = {} ndinst = {} # Newest versions by name.arch for po in self.rpmdb.returnPackages(patterns=patterns, ignore_case=ic): if not misc.filter_pkgs_repoid([po], repoid): continue dinst[po.pkgtup] = po if showdups: continue key = (po.name, po.arch) if key not in ndinst or po.verGT(ndinst[key]): ndinst[key] = po installed = dinst.values() if showdups: avail = self.pkgSack.returnPackages(repoid=repoid, patterns=patterns, ignore_case=ic) elif repoid: avail = self.pkgSack.sacks[repoid] avail = avail.returnNewestByNameArch(patterns=patterns, ignore_case=ic) else: try: avail = self.pkgSack.returnNewestByNameArch(patterns=patterns, ignore_case=ic) except Errors.PackageSackError: avail = [] for pkg in avail: if showdups: if pkg.pkgtup in dinst: reinstall_available.append(pkg) else: available.append(pkg) else: key = (pkg.name, pkg.arch) if pkg.pkgtup in dinst: reinstall_available.append(pkg) else: # if (self.allowedMultipleInstalls(pkg) or # key not in ndinst): # Might be because pattern specified a version, so # we need to do a search for name/arch to find any # installed. Alas. calling allowedMultipleInstalls() # is much slower than calling searchNevra(). *Sigh* ipkgs = self.rpmdb.searchNevra(pkg.name, arch=pkg.arch) if ipkgs: ndinst[key] = sorted(ipkgs)[-1] if key not in ndinst or pkg.verGT(ndinst[key]): available.append(pkg) else: old_available.append(pkg) # produce the updates list of tuples elif pkgnarrow == 'updates': for (n,a,e,v,r) in self.up.getUpdatesList(): matches = self.pkgSack.searchNevra(name=n, arch=a, epoch=e, ver=v, rel=r) # This is kind of wrong, depending on how you look at it. matches = misc.filter_pkgs_repoid(matches, repoid) if len(matches) > 1: updates.append(matches[0]) self.verbose_logger.log(logginglevels.DEBUG_1, _('More than one identical match in sack for %s'), matches[0]) elif len(matches) == 1: updates.append(matches[0]) else: self.verbose_logger.log(logginglevels.DEBUG_1, _('Nothing matches %s.%s %s:%s-%s from update'), n,a,e,v,r) if patterns: exactmatch, matched, unmatched = \ parsePackages(updates, patterns, casematch=not ignore_case) updates = exactmatch + matched # installed only elif pkgnarrow == 'installed': installed = self.rpmdb.returnPackages(patterns=patterns, ignore_case=ic) installed = misc.filter_pkgs_repoid(installed, repoid) # available in a repository elif pkgnarrow == 'available': if showdups: avail = self.pkgSack.returnPackages(patterns=patterns, ignore_case=ic, repoid=repoid) elif repoid: avail = self.pkgSack.sacks[repoid] avail = avail.returnNewestByNameArch(patterns=patterns, ignore_case=ic) else: try: avail = self.pkgSack.returnNewestByNameArch(patterns=patterns, ignore_case=ic) except Errors.PackageSackError: avail = [] for pkg in avail: if showdups: if self.rpmdb.contains(po=pkg): reinstall_available.append(pkg) else: available.append(pkg) else: ipkgs = self.rpmdb.searchNevra(pkg.name, arch=pkg.arch) if ipkgs: latest = sorted(ipkgs, reverse=True)[0] if not ipkgs or pkg.verGT(latest): available.append(pkg) elif pkg.verEQ(latest): reinstall_available.append(pkg) else: old_available.append(pkg) # not in a repo but installed elif pkgnarrow == 'extras': # we must compare the installed set versus the repo set # anything installed but not in a repo is an extra avail = self.pkgSack.simplePkgList(patterns=patterns, ignore_case=ic) avail = set(avail) for po in self.rpmdb.returnPackages(patterns=patterns, ignore_case=ic): if not misc.filter_pkgs_repoid([po], repoid): continue if po.pkgtup not in avail: extras.append(po) # not in a repo but installed elif pkgnarrow == 'distro-extras': for po in self.rpmdb.returnPackages(patterns=patterns, ignore_case=ic): if not misc.filter_pkgs_repoid([po], repoid): continue if self.pkgSack.searchNames([po.name]): continue extras.append(po) # obsoleting packages (and what they obsolete) elif pkgnarrow == 'obsoletes': self.conf.obsoletes = 1 for (pkgtup, instTup) in self.up.getObsoletesTuples(): (n,a,e,v,r) = pkgtup pkgs = self.pkgSack.searchNevra(name=n, arch=a, ver=v, rel=r, epoch=e) pkgs = misc.filter_pkgs_repoid(pkgs, repoid) instpo = self.getInstalledPackageObject(instTup) if len(pkgs) > 1: self.verbose_logger.log(logginglevels.DEBUG_1, _('More than one identical match in sack for %s'), pkgs[0]) if len(pkgs) >= 1: obsoletes.append(pkgs[0]) obsoletesTuples.append((pkgs[0], instpo)) if patterns: exactmatch, matched, unmatched = \ parsePackages(obsoletes, patterns, casematch=not ignore_case) obsoletes = exactmatch + matched matched_obsoletes = set(obsoletes) nobsoletesTuples = [] for po, instpo in obsoletesTuples: if po not in matched_obsoletes: continue nobsoletesTuples.append((po, instpo)) obsoletesTuples = nobsoletesTuples if not showdups: obsoletes = packagesNewestByName(obsoletes) filt = set(obsoletes) nobsoletesTuples = [] for po, instpo in obsoletesTuples: if po not in filt: continue nobsoletesTuples.append((po, instpo)) obsoletesTuples = nobsoletesTuples # packages recently added to the repositories elif pkgnarrow == 'recent': now = time.time() recentlimit = now-(self.conf.recent*86400) if showdups: avail = self.pkgSack.returnPackages(patterns=patterns, ignore_case=ic, repoid=repoid) elif repoid: avail = self.pkgSack.sacks[repoid] avail = avail.returnNewestByNameArch(patterns=patterns, ignore_case=ic) else: try: avail = self.pkgSack.returnNewestByNameArch(patterns=patterns, ignore_case=ic) except Errors.PackageSackError: avail = [] for po in avail: if int(po.filetime) > recentlimit: recent.append(po) ygh.installed = installed ygh.available = available ygh.reinstall_available = reinstall_available ygh.old_available = old_available ygh.updates = updates ygh.obsoletes = obsoletes ygh.obsoletesTuples = obsoletesTuples ygh.recent = recent ygh.extras = extras return ygh def findDeps(self, pkgs): """Return the dependencies for a given package object list, as well as possible solutions for those dependencies. :param pkgs: a list of package objects :return: the dependencies as a dictionary of dictionaries: packageobject = [reqs] = [list of satisfying pkgs] """ results = {} for pkg in pkgs: results[pkg] = {} reqs = pkg.requires reqs.sort() pkgresults = results[pkg] # shorthand so we don't have to do the # double bracket thing for req in reqs: (r,f,v) = req if r.startswith('rpmlib('): continue satisfiers = [] for po in self.whatProvides(r, f, v): satisfiers.append(po) pkgresults[req] = satisfiers return results # pre 3.2.10 API used to always showdups, so that's the default atm. def searchGenerator(self, fields, criteria, showdups=True, keys=False, searchtags=True, searchrpmdb=True): """Yield the packages that match the given search criteria. This generator method will lighten memory load for some searches, and is the preferred search function to use. :param fields: the fields to search :param criteria: a list of strings specifying the criteria to search for :param showdups: whether to yield duplicate packages from different repositories :param keys: setting *keys* to True will use the search keys that matched in the sorting, and return the search keys in the results :param searchtags: whether to search the package tags :param searchrpmdb: whether to search the rmpdb """ sql_fields = [] for f in fields: sql_fields.append(RPM_TO_SQLITE.get(f, f)) # yield the results in order of most terms matched first sorted_lists = {} # count_of_matches = [(pkgobj, # [search strings which matched], # [results that matched])] tmpres = [] real_crit = [] real_crit_lower = [] # Take the s.lower()'s out of the loop rcl2c = {} # weigh terms in given order (earlier = more relevant) critweight = 0 critweights = {} for s in criteria: real_crit.append(s) real_crit_lower.append(s.lower()) rcl2c[s.lower()] = s critweights.setdefault(s, critweight) critweight -= 1 for sack in self.pkgSack.sacks.values(): tmpres.extend(sack.searchPrimaryFieldsMultipleStrings(sql_fields, real_crit)) def results2sorted_lists(tmpres, sorted_lists): for (po, count) in tmpres: # check the pkg for sanity # pop it into the sorted lists tmpkeys = set() tmpvalues = [] if count not in sorted_lists: sorted_lists[count] = [] for s in real_crit_lower: for field in fields: value = to_unicode(getattr(po, field)) if value and value.lower().find(s) != -1: tmpvalues.append(value) tmpkeys.add(rcl2c[s]) if len(tmpvalues) > 0: sorted_lists[count].append((po, tmpkeys, tmpvalues)) results2sorted_lists(tmpres, sorted_lists) if searchrpmdb: tmpres = self.rpmdb.searchPrimaryFieldsMultipleStrings(fields, real_crit_lower, lowered=True) # close our rpmdb connection so we can ctrl-c, kthxbai self.closeRpmDB() results2sorted_lists(tmpres, sorted_lists) del tmpres results_by_pkg = {} # pkg=[list_of_tuples_of_values] if searchtags: tmpres = self.searchPackageTags(real_crit_lower) for pkg in tmpres: count = 0 matchkeys = [] tagresults = [] for (match, taglist) in tmpres[pkg]: count += len(taglist) matchkeys.append(rcl2c[match]) tagresults.extend(taglist) if pkg not in results_by_pkg: results_by_pkg[pkg] = [] results_by_pkg[pkg].append((matchkeys, tagresults)) del tmpres if sorted_lists.values(): # do the ones we already have for item in sorted_lists.values(): for pkg, k, v in item: if pkg not in results_by_pkg: results_by_pkg[pkg] = [] results_by_pkg[pkg].append((k,v)) # take our existing dict-by-pkg and make the dict-by-count for # this bizarro sorted_lists format # FIXME - stab sorted_lists in the chest at some later date sorted_lists = {} for pkg in results_by_pkg: totkeys = [] totvals = [] for (k, v) in results_by_pkg[pkg]: totkeys.extend(k) totvals.extend(v) totkeys = misc.unique(totkeys) totvals = misc.unique(totvals) count = len(totkeys) if count not in sorted_lists: sorted_lists[count] = [] sorted_lists[count].append((pkg, totkeys, totvals)) # To explain why the following code looks like someone took drugs # before/during/after coding: # # We are sorting a list of: (po, tmpkeys, tmpvalues). # Eg. (po, ['foo', 'bar'], ['matches foo', # 'matches barx']) # # So we sort, and get a result like: # po | repo | matching value # 1. yum-1 | fed | -2 # 2. yum-2 | fed | -2 # 3. yum-2 | @fed | -2 # 4. yum-3 | ups | -1 # ...but without showdups we want to output _just_ #3, which requires # we find the newest EVR po for the best "matching value". Without keys # it's the same, except we just want the newest EVR. # If we screw it up it's probably not even noticeable most of the time # either, so it's pretty thankless. HTH. HAND. # By default just sort using package sorting sort_func = operator.itemgetter(0) dup = lambda x: True if keys: # Take into account the keys found, their original order, # and number of fields hit as well sort_func = lambda x: (-sum((critweights[y] for y in x[1])), -len(x[2]), "\0".join(sorted(x[1])), x[0]) dup = lambda x,y: sort_func(x)[:-1] == sort_func(y)[:-1] yielded = {} for val in reversed(sorted(sorted_lists)): last = None for sl_vals in sorted(sorted_lists[val], key=sort_func): if showdups: (po, ks, vs) = sl_vals else: if (sl_vals[0].name, sl_vals[0].arch) in yielded: continue na = (sl_vals[0].name, sl_vals[0].arch) if last is None or (last[0] == na and dup(last[1],sl_vals)): last = (na, sl_vals) continue (po, ks, vs) = last[1] if last[0] == na: # Dito. yielded test above. last = None else: last = (na, sl_vals) if keys: yield (po, ks, vs) else: yield (po, vs) if not showdups: yielded[(po.name, po.arch)] = 1 if last is not None: (po, ks, vs) = last[1] if keys: yield (po, ks, vs) else: yield (po, vs) def searchPackageTags(self, criteria): """Search for and return a list packages that have tags matching the given criteria. :param criteria: a list of strings specifying the criteria to search for :return: a list of package objects that have tags matching the given criteria """ results = {} # name = [(criteria, taglist)] for c in criteria: c = c.lower() res = self.pkgtags.search_tags(c) for (name, taglist) in res.items(): pkgs = self.pkgSack.searchNevra(name=name) if not pkgs: continue pkg = pkgs[0] if pkg not in results: results[pkg] = [] results[pkg].append((c, taglist)) return results def searchPackages(self, fields, criteria, callback=None): """Deprecated. Search the specified fields for packages that match the given criteria, and return a list of the results. :param fields: the fields to search :param criteria: a list of strings specifying the criteria to search for :param callback: a function to print out the results as they are found. *callback* should have the form callback(po, matched values list) """ warnings.warn(_('searchPackages() will go away in a future version of Yum.\ Use searchGenerator() instead. \n'), Errors.YumFutureDeprecationWarning, stacklevel=2) matches = {} match_gen = self.searchGenerator(fields, criteria) for (po, matched_strings) in match_gen: if callback: callback(po, matched_strings) if po not in matches: matches[po] = [] matches[po].extend(matched_strings) return matches def searchPackageProvides(self, args, callback=None, callback_has_matchfor=False): """Search for and return a list package objects that provide the given files or features. :param args: a list of strings specifying the files and features to search for the packages that provide :param callback: a callback function to print out the results as they are found :param callback_has_matchfor: whether the callback function will accept a list of strings to highlight in its output. If this is true, *args* will be passed to *callback* so that the files or features that were searched for can be highlighted """ def _arg_data(arg): if not misc.re_glob(arg): isglob = False canBeFile = arg.startswith('/') else: isglob = True canBeFile = misc.re_filename(arg) return isglob, canBeFile matches = {} for arg in args: arg = to_unicode(arg) isglob, canBeFile = _arg_data(arg) if not isglob: usedDepString = True where = self.returnPackagesByDep(arg) else: usedDepString = False where = self.pkgSack.searchProvides(arg) self.verbose_logger.log(logginglevels.DEBUG_1, P_('Searching %d package', 'Searching %d packages', len(where)), len(where)) for po in sorted(where): self.verbose_logger.log(logginglevels.DEBUG_2, _('searching package %s'), po) tmpvalues = [] if usedDepString: tmpvalues.append(arg) if not isglob and canBeFile: # then it is not a globbed file we have matched it precisely tmpvalues.append(arg) if isglob and canBeFile: self.verbose_logger.log(logginglevels.DEBUG_2, _('searching in file entries')) for thisfile in po.dirlist + po.filelist + po.ghostlist: if fnmatch.fnmatch(thisfile, arg): tmpvalues.append(thisfile) self.verbose_logger.log(logginglevels.DEBUG_2, _('searching in provides entries')) for (p_name, p_flag, (p_e, p_v, p_r)) in po.provides: prov = misc.prco_tuple_to_string((p_name, p_flag, (p_e, p_v, p_r))) if not usedDepString: if fnmatch.fnmatch(p_name, arg) or fnmatch.fnmatch(prov, arg): tmpvalues.append(prov) if len(tmpvalues) > 0: if callback: # No matchfor, on globs if not isglob and callback_has_matchfor: callback(po, tmpvalues, args) else: callback(po, tmpvalues) matches[po] = tmpvalues # installed rpms, too taglist = ['filelist', 'dirnames', 'provides_names'] taglist_provonly = ['provides_names'] for arg in args: isglob, canBeFile = _arg_data(arg) if not isglob: where = self.returnInstalledPackagesByDep(arg) usedDepString = True for po in where: tmpvalues = [arg] if len(tmpvalues) > 0: if callback: if callback_has_matchfor: callback(po, tmpvalues, args) else: callback(po, tmpvalues) matches[po] = tmpvalues else: usedDepString = False where = self.rpmdb if canBeFile: arg_taglist = taglist else: arg_taglist = taglist_provonly arg_regex = re.compile(fnmatch.translate(arg)) for po in sorted(where): searchlist = [] tmpvalues = [] for tag in arg_taglist: tagdata = getattr(po, tag) if tagdata is None: continue if type(tagdata) is types.ListType: searchlist.extend(tagdata) else: searchlist.append(tagdata) for item in searchlist: if arg_regex.match(item): tmpvalues.append(item) if len(tmpvalues) > 0: if callback: # No matchfor, on globs callback(po, tmpvalues) matches[po] = tmpvalues return matches def _groupInstalledData(self, group): """ Return a dict of pkg_name => (installed, available, backlisted-installed, blacklisted-available). """ ret = {} if not group or self.conf.group_command != 'objects': return ret pkg_names = {} if group.groupid in self.igroups.groups: pkg_names = self.igroups.groups[group.groupid].pkg_names all_pkg_names = set(list(pkg_names)) if hasattr(group, 'packages'): # If a comps. group, add remote pkgs. all_pkg_names.update(group.packages) for pkg_name in all_pkg_names: ipkgs = self.rpmdb.searchNames([pkg_name]) if pkg_name not in pkg_names and not ipkgs: ret[pkg_name] = 'available' continue if not ipkgs: ret[pkg_name] = 'blacklisted-available' continue for ipkg in ipkgs: # Multiarch, if any are installed for the group we count "both" if ipkg.yumdb_info.get('group_member', '') != group.groupid: continue ret[pkg_name] = 'installed' break else: ret[pkg_name] = 'blacklisted-installed' return ret def _groupInstalledEnvData(self, evgroup): """ Return a dict of grp_name => (installed, available, backlisted-installed, blacklisted-available). """ ret = {} if not evgroup or self.conf.group_command != 'objects': return ret grp_names = {} if evgroup.environmentid in self.igroups.groups: grp_names = self.igroups.environments[evgroup.environmentid] grp_names = grp_names.grp_names all_grp_names = set(list(grp_names)) if hasattr(evgroup, 'allgroups'): # If a comps. evgroup, add remote grps all_grp_names.update(evgroup.allgroups) for grp_name in all_grp_names: igrp = self.igroups.groups.get(grp_name) if grp_name not in grp_names and not igrp: ret[grp_name] = 'available' continue if not igrp: ret[grp_name] = 'blacklisted-available' continue if igrp.environment == evgroup.environmentid: ret[grp_name] = 'installed' else: ret[grp_name] = 'blacklisted-installed' return ret def _groupReturnGroups(self, patterns=None, ignore_case=True): igrps = None ievgrps = None if patterns is None: grps = self.comps.groups if self.conf.group_command == 'objects': igrps = self.igroups.groups.values() evgrps = self.comps.environments if self.conf.group_command == 'objects': ievgrps = self.igroups.environments.values() return igrps, grps, ievgrps, evgrps gpats = [] epats = [] for pat in patterns: if pat.startswith('@^'): epats.append(pat[2:]) elif pat.startswith('@'): gpats.append(pat[1:]) else: epats.append(pat) gpats.append(pat) epats = ",".join(epats) gpats = ",".join(gpats) cs = not ignore_case grps = self.comps.return_groups(gpats, case_sensitive=cs) # Because we want name matches too, and we don't store group names # we need to add the groupid's we've found: if self.conf.group_command == 'objects': gpats = gpats + "," + ",".join([grp.groupid for grp in grps]) igrps = self.igroups.return_groups(gpats, case_sensitive=cs) evgrps = self.comps.return_environments(epats, case_sensitive=cs) if self.conf.group_command == 'objects': epats = epats+ "," + ",".join([grp.environmentid for grp in evgrps]) ievgrps = self.igroups.return_environments(epats, case_sensitive=cs) return igrps, grps, ievgrps, evgrps def doGroupLists(self, uservisible=0, patterns=None, ignore_case=True, return_evgrps=False): """Return two lists of groups: installed groups and available groups. :param uservisible: If True, only groups marked as uservisible will be returned. Otherwise, all groups will be returned :param patterns: a list of stings. If given, only groups with names that match the patterns will be included in the lists. If not given, all groups will be included :param ignore_case: whether to ignore case when determining whether group names match the strings in *patterns* :param return_evgrps: whether to return environment groups as well as package groups """ installed = [] available = [] einstalled = [] eavailable = [] if self.comps.compscount == 0: raise Errors.GroupsError, _('No group data available for configured repositories') igrps, grps, ievgrps, evgrps = self._groupReturnGroups(patterns, ignore_case) if igrps is not None: digrps = {} for igrp in igrps: digrps[igrp.gid] = igrp igrps = digrps if ievgrps is not None: digrps = {} for ievgrp in ievgrps: digrps[ievgrp.evgid] = ievgrp ievgrps = digrps for grp in grps: if igrps is None: grp_installed = grp.installed else: grp_installed = grp.groupid in igrps if grp_installed: del igrps[grp.groupid] if grp_installed: if uservisible: if grp.user_visible: installed.append(grp) else: installed.append(grp) else: if uservisible: if grp.user_visible: available.append(grp) else: available.append(grp) for evgrp in evgrps: if ievgrps is None: evgrp_installed = evgrp.installed else: evgrp_installed = evgrp.environmentid in ievgrps if evgrp_installed: del ievgrps[evgrp.environmentid] if evgrp_installed: einstalled.append(evgrp) else: eavailable.append(evgrp) if igrps is None: igrps = {} if ievgrps is None: ievgrps = {} # Note that we used to get here with igrps/ievgrps that didn't exist # in comps. but we mock them in comps now because it was hard to deal # with that everywhere ... so just to confirm. assert not igrps assert not ievgrps for igrp in igrps.values(): # These are installed groups that aren't in comps anymore. so we # create fake comps groups for them. grp = comps.Group() grp.groupid = igrp.gid grp.installed = True grp.name = grp.groupid for pkg_name in igrp.pkg_names: grp.mandatory_packages[pkg_name] = 1 installed.append(grp) for ievgrp in ievgrps.values(): # These are installed evgroups that aren't in comps anymore. so we # create fake comps evgroups for them. evgrp = comps.Environment() grp.environmentid = ievgrp.evgid evgrp.installed = True evgrp.name = evgrp.environmentid evgrp._groups = list(ievgrp.groups) einstalled.append(evgrp) if return_evgrps: return (sorted(installed), sorted(available), sorted(einstalled), sorted(eavailable)) return sorted(installed), sorted(available) def groupRemove(self, grpid): """Mark all the packages in the given group to be removed. :param grpid: the name of the group containing the packages to mark for removal :return: a list of transaction members added to the transaction set by this function """ txmbrs_used = [] thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) for thisgroup in thesegroups: igroup_data = self._groupInstalledData(thisgroup) thisgroup.toremove = True pkgs = thisgroup.packages gid = thisgroup.groupid for pkg in pkgs: if pkg in igroup_data and igroup_data[pkg] != 'installed': continue txmbrs = self.remove(name=pkg, silence_warnings=True) txmbrs_used.extend(txmbrs) for txmbr in txmbrs: txmbr.groups.append(gid) if igroup_data: self.igroups.del_group(gid) return txmbrs_used def groupUnremove(self, grpid): """Unmark any packages in the given group from being removed. :param grpid: the name of the group to unmark the packages of """ thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) for thisgroup in thesegroups: thisgroup.toremove = False pkgs = thisgroup.packages for pkg in thisgroup.packages: for txmbr in self.tsInfo: if txmbr.po.name == pkg and txmbr.po.state in TS_INSTALL_STATES: try: txmbr.groups.remove(grpid) except ValueError: self.verbose_logger.log(logginglevels.DEBUG_1, _("package %s was not marked in group %s"), txmbr.po, grpid) continue # if there aren't any other groups mentioned then remove the pkg if len(txmbr.groups) == 0: self.tsInfo.remove(txmbr.po.pkgtup) def environmentRemove(self, evgrpid): """Mark all the packages in the given group to be removed. :param evgrpid: the name of the environment containing the groups to mark for removal :return: a list of transaction members added to the transaction set by this function """ txmbrs_used = [] thesegroups = self.comps.return_environments(evgrpid) if not thesegroups: raise Errors.GroupsError, _("No Environment named %s exists") % to_unicode(evgrpid) for thisgroup in thesegroups: igroup_data = self._groupInstalledEnvData(thisgroup) grps = thisgroup.allgroups evgid = thisgroup.environmentid for grp in grps: if grp in igroup_data and igroup_data[grp] != 'installed': continue txmbrs = self.groupRemove(grp) txmbrs_used.extend(txmbrs) for txmbr in txmbrs: txmbr.environments.append(evgid) if igroup_data: self.igroups.del_environment(evgid) return txmbrs_used def selectGroup(self, grpid, group_package_types=[], enable_group_conditionals=None, upgrade=False, ievgrp=None): """Mark all the packages in the given group to be installed. :param grpid: the name of the group containing the packages to mark for installation :param group_package_types: a list of the types of groups to work with. This overrides self.conf.group_package_types :param enable_group_conditionals: overrides self.conf.enable_group_conditionals :return: a list of transaction members added to the transaction set by this function """ txmbrs_used = [] thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) package_types = self.conf.group_package_types if group_package_types: package_types = group_package_types if self.conf.group_command == 'compat': upgrade = False for thisgroup in thesegroups: if thisgroup.selected: continue thisgroup.selected = True # Can move to upgrade, if installed and calling install lupgrade = upgrade pkgs = [] if 'mandatory' in package_types: pkgs.extend(thisgroup.mandatory_packages) if 'default' in package_types: pkgs.extend(thisgroup.default_packages) if 'optional' in package_types: pkgs.extend(thisgroup.optional_packages) igroup_data = self._groupInstalledData(thisgroup) igrp = None if igroup_data: if thisgroup.groupid in self.igroups.groups: igrp = self.igroups.groups[thisgroup.groupid] lupgrade = True else: self.igroups.add_group(thisgroup.groupid, thisgroup.packages, ievgrp) for pkg in igroup_data: if igroup_data[pkg] == 'installed': pkgs.append(pkg) old_txmbrs = len(txmbrs_used) for pkg in pkgs: if self.conf.group_command == 'objects': assert pkg in igroup_data if (pkg not in igroup_data or igroup_data[pkg].startswith('blacklisted')): # (lupgrade and igroup_data[pkg] == 'available')): msg = _('Skipping package %s from group %s') self.verbose_logger.log(logginglevels.DEBUG_2, msg, pkg, thisgroup.groupid) continue self.verbose_logger.log(logginglevels.DEBUG_2, _('Adding package %s from group %s'), pkg, thisgroup.groupid) if igrp is not None: igrp.pkg_names.add(pkg) self.igroups.changed = True txmbrs = [] try: if (lupgrade and (self.conf.group_command == 'simple' or (igroup_data and igroup_data[pkg] == 'installed'))): txmbrs = self.update(name = pkg, pkg_warning_level='debug2') elif igroup_data and igroup_data[pkg] == 'installed': pass # Don't upgrade on install. else: txmbrs = self.install(name = pkg, pkg_warning_level='debug2') for txmbr in txmbrs: txmbr.group_member = thisgroup.groupid if lupgrade: # For list transaction. txmbr._ugroup_member = thisgroup else: txmbr._igroup_member = thisgroup except Errors.InstallError, e: self.verbose_logger.debug(_('No package named %s available to be installed'), pkg) else: txmbrs_used.extend(txmbrs) for txmbr in txmbrs: txmbr.groups.append(thisgroup.groupid) group_conditionals = self.conf.enable_group_conditionals if enable_group_conditionals is not None: # has to be this way so we can set it to False group_conditionals = enable_group_conditionals count_cond_test = 0 # FIXME: What do we do about group conditionals when group==objects # or group upgrade for group_command=simple? if not lupgrade and group_conditionals: for condreq, cond in thisgroup.conditional_packages.iteritems(): if self.isPackageInstalled(cond): try: txmbrs = self.install(name = condreq) except Errors.InstallError: # we don't care if the package doesn't exist continue else: if cond not in self.tsInfo.conditionals: self.tsInfo.conditionals[cond]=[] txmbrs_used.extend(txmbrs) for txmbr in txmbrs: txmbr.groups.append(thisgroup.groupid) self.tsInfo.conditionals[cond].append(txmbr.po) continue # Otherwise we hook into tsInfo.add to make sure # we'll catch it if it's added later in this transaction pkgs = self.pkgSack.searchNevra(name=condreq) if pkgs: if self.arch.multilib: if self.conf.multilib_policy == 'best': use = [] best = self.arch.legit_multi_arches best.append('noarch') for pkg in pkgs: if pkg.arch in best: use.append(pkg) pkgs = use pkgs = packagesNewestByName(pkgs) count_cond_test += len(pkgs) if cond not in self.tsInfo.conditionals: self.tsInfo.conditionals[cond] = [] self.tsInfo.conditionals[cond].extend(pkgs) if not lupgrade and len(txmbrs_used) == old_txmbrs: self.logger.critical(_('Warning: Group %s does not have any packages to install.'), thisgroup.groupid) if count_cond_test: self.logger.critical(_('Group %s does have %u conditional packages, which may get installed.'), thisgroup.groupid, count_cond_test) return txmbrs_used def deselectGroup(self, grpid, force=False): """Unmark the packages in the given group from being installed. :param grpid: the name of the group containing the packages to unmark from installation :param force: if True, force remove all the packages in the given group from the transaction """ if not self.comps.has_group(grpid): raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) # FIXME: Do something with groups as objects, and env. groups. for thisgroup in thesegroups: thisgroup.selected = False for pkgname in thisgroup.packages: txmbrs = self.tsInfo.getMembersWithState(None,TS_INSTALL_STATES) for txmbr in txmbrs: if txmbr.po.name != pkgname: continue if not force: try: txmbr.groups.remove(grpid) except ValueError: self.verbose_logger.log(logginglevels.DEBUG_1, _("package %s was not marked in group %s"), txmbr.po, grpid) continue # If the pkg isn't part of any group, or the group is # being forced out ... then remove the pkg if force or len(txmbr.groups) == 0: self.tsInfo.remove(txmbr.po.pkgtup) for pkg in self.tsInfo.conditionals.get(txmbr.name, []): self.tsInfo.remove(pkg.pkgtup) def selectEnvironment(self, evgrpid, group_package_types=[], enable_group_conditionals=None, upgrade=False): """Mark all the groups in the given environment group to be installed. :param evgrpid: the name of the env. group containing the groups to mark for installation :param group_package_types: a list of the types of groups to work with. This overrides self.conf.group_package_types :param enable_group_conditionals: overrides self.conf.enable_group_conditionals :return: a list of transaction members added to the transaction set by this function """ evgrps = self.comps.return_environments(evgrpid) if not evgrps: raise Errors.GroupsError, _("No Environment named %s exists") % to_unicode(evgrpid) ret = [] for evgrp in evgrps: ievgrp = None if self.conf.group_command == 'compat': grps = ",".join(sorted(evgrp.groups)) elif self.conf.group_command == 'simple': if not upgrade: grps = ",".join(sorted(evgrp.groups)) else: # Only upgrade the installed groups... grps = [] for grpid in evgrp.groups: grp = self.comps.return_group(grpid) if grp is None: continue if not grp.installed: continue grps.append(grpid) grps = ",".join(sorted(grps)) elif self.conf.group_command == 'objects': igroup_data = self._groupInstalledEnvData(evgrp) grps = set() for grpid in evgrp.groups: if (grpid not in igroup_data or igroup_data[grpid].startswith('blacklisted')): msg = _('Skipping group %s from environment %s') self.verbose_logger.log(logginglevels.DEBUG_2, msg, grpid, evgrp.environmentid) continue grps.add(grpid) if evgrp.environmentid in self.igroups.environments: ievgrp = self.igroups.environments[evgrp.environmentid] # Add groups from the installed evgrp, for Eg. installed # only evgrps. for grp_name in ievgrp.grp_names: if grp_name not in self.igroups.groups: continue grp_evgrpid = self.igroups.groups[grp_name].environment if grp_evgrpid != evgrp.environmentid: continue grps.add(grp_name) else: ievgrp = self.igroups.add_environment(evgrp.environmentid, evgrp.allgroups) grps = ",".join(sorted(grps)) try: txs = self.selectGroup(grps, group_package_types, enable_group_conditionals, upgrade, ievgrp=ievgrp) except Errors.GroupsError: continue ret.extend(txs) return ret def deselectEnvironment(self, evgrpid, force=False): """Unmark the groups in the given environment group from being installed. :param evgrpid: the name of the environment group containing the groups to unmark from installation :param force: if True, force remove all the packages in the given groups from the transaction """ evgrps = self.comps.return_environments(evgrpid) if not thesegroups: raise Errors.GroupsError, _("No Environment named %s exists") % to_unicode(evgrpid) for evgrp in evgrps: grps = ",".join(sorted(evgrp.groups)) self.deselectGroup(grps, force) # FIXME: env. needs to be marked not-to-be-installed, etc. def getPackageObject(self, pkgtup, allow_missing=False): """Return a package object that corresponds to the given package tuple. :param pkgtup: the package tuple specifying the package object to return :param allow_missing: If no package corresponding to the given package tuple can be found, None is returned if *allow_missing* is True, and a :class:`yum.Errors.DepError` is raised if *allow_missing* is False. :return: a package object corresponding to the given package tuple :raises: a :class:`yum.Errors.DepError` if no package corresponding to the given package tuple can be found, and *allow_missing* is False """ # look it up in the self.localPackages first: for po in self.localPackages: if po.pkgtup == pkgtup: return po pkgs = self.pkgSack.searchPkgTuple(pkgtup) if len(pkgs) == 0: self._add_not_found_a(pkgs, pkgtup=pkgtup) if allow_missing: # This can happen due to excludes after .up has return None # happened. raise Errors.DepError, _('Package tuple %s could not be found in packagesack') % str(pkgtup) if len(pkgs) > 1: # boy it'd be nice to do something smarter here FIXME result = pkgs[0] else: result = pkgs[0] # which should be the only # this is where we could do something to figure out which repository # is the best one to pull from return result def getInstalledPackageObject(self, pkgtup): """Return a :class:`yum.packages.YumInstalledPackage` object that corresponds to the given package tuple. This function should be used instead of :func:`searchPkgTuple` if you are assuming that the package object exists. :param pkgtup: the package tuple specifying the package object to return :return: a :class:`yum.packages.YumInstalledPackage` object corresponding to the given package tuple :raises: a :class:`yum.Errors.RpmDBError` if the specified package object cannot be found """ pkgs = self.rpmdb.searchPkgTuple(pkgtup) if len(pkgs) == 0: self._add_not_found_i(pkgs, pkgtup=pkgtup) raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup) # Dito. FIXME from getPackageObject() for len() > 1 ... :) po = pkgs[0] # take the first one return po def gpgKeyCheck(self): """Checks for the presence of GPG keys in the rpmdb. :return: 0 if there are no GPG keys in the rpmdb, and 1 if there are keys """ gpgkeyschecked = self.conf.cachedir + '/.gpgkeyschecked.yum' if os.path.exists(gpgkeyschecked): return 1 myts = rpmUtils.transaction.initReadOnlyTransaction(root=self.conf.installroot) myts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) idx = myts.dbMatch('name', 'gpg-pubkey') keys = idx.count() del idx del myts if keys == 0: return 0 else: mydir = os.path.dirname(gpgkeyschecked) if not os.path.exists(mydir): os.makedirs(mydir) fo = open(gpgkeyschecked, 'w') fo.close() del fo return 1 def returnPackagesByDep(self, depstring): """Return a list of package objects that provide the given dependencies. :param depstring: a string specifying the dependency to return the packages that fulfil :return: a list of packages that fulfil the given dependency """ if not depstring: return [] # parse the string out # either it is 'dep (some operator) e:v-r' # or /file/dep # or packagename if type(depstring) == types.TupleType: (depname, depflags, depver) = depstring else: depname = depstring depflags = None depver = None if depstring[0] != '/': # not a file dep - look at it for being versioned dep_split = depstring.split() if len(dep_split) == 3: depname, flagsymbol, depver = dep_split if not flagsymbol in SYMBOLFLAGS: raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring) depflags = SYMBOLFLAGS[flagsymbol] if depflags is None: # This does wildcards... return self.pkgSack.searchProvides(depstring) # This does flags+versions, but no wildcards... return self.pkgSack.getProvides(depname, depflags, depver).keys() def returnPackageByDep(self, depstring): """Return the best, or first, package object that provides the given dependencies. :param depstring: a string specifying the dependency to return the package that fulfils :return: the best, or first, package that fulfils the given dependency :raises: a :class:`yum.Errors.YumBaseError` if no packages that fulfil the given dependency can be found """ # we get all sorts of randomness here errstring = depstring if type(depstring) not in types.StringTypes: errstring = str(depstring) try: pkglist = self.returnPackagesByDep(depstring) except Errors.YumBaseError: raise Errors.YumBaseError, _('No Package found for %s') % errstring ps = ListPackageSack(pkglist) result = self._bestPackageFromList(ps.returnNewestByNameArch(), req=errstring) if result is None: raise Errors.YumBaseError, _('No Package found for %s') % errstring return result def returnInstalledPackagesByDep(self, depstring): """Return a list of installed package objects that provide the given dependencies. :param depstring: a string specifying the dependency to return the packages that fulfil :return: a list of installed packages that fulfil the given dependency """ if not depstring: return [] # parse the string out # either it is 'dep (some operator) e:v-r' # or /file/dep # or packagename if type(depstring) == types.TupleType: (depname, depflags, depver) = depstring else: depname = depstring depflags = None depver = None if depstring[0] != '/': # not a file dep - look at it for being versioned dep_split = depstring.split() if len(dep_split) == 3: depname, flagsymbol, depver = dep_split if not flagsymbol in SYMBOLFLAGS: raise Errors.YumBaseError, _('Invalid version flag from: %s') % str(depstring) depflags = SYMBOLFLAGS[flagsymbol] if depflags is None: # This does wildcards... return self.rpmdb.searchProvides(depstring) # This does flags+versions, but no wildcards... return self.rpmdb.getProvides(depname, depflags, depver).keys() def returnInstalledPackageByDep(self, depstring): """Return the best, or first, installed package object that provides the given dependencies. :param depstring: a string specifying the dependency to return the package that fulfils :return: the best, or first, installed package that fulfils the given dependency :raises: a :class:`yum.Errors.YumBaseError` if no packages that fulfil the given dependency can be found """ # we get all sorts of randomness here errstring = depstring if type(depstring) not in types.StringTypes: errstring = str(depstring) try: pkglist = self.returnInstalledPackagesByDep(depstring) except Errors.YumBaseError: raise Errors.YumBaseError, _('No Package found for %s') % errstring ps = ListPackageSack(pkglist) result = self._bestPackageFromList(ps.returnNewestByNameArch(), req=errstring) if result is None: raise Errors.YumBaseError, _('No Package found for %s') % errstring return result def _bestPackageFromList(self, pkglist, req=None): """take list of package objects and return the best package object. If the list is empty, return None. Note: this is not aware of multilib so make sure you're only passing it packages of a single arch group. :param pkglist: the list of packages to return the best packages from :param req: the requirement from the user :return: a list of the best packages from *pkglist* """ if len(pkglist) == 0: return None if len(pkglist) == 1: return pkglist[0] bestlist = self._compare_providers(pkglist, reqpo=None, req=req) return bestlist[0][0] def bestPackagesFromList(self, pkglist, arch=None, single_name=False, req=None): """Return the best packages from a list of packages. This function is multilib aware, so that it will not compare multilib to singlelib packages. :param pkglist: the list of packages to return the best packages from :param arch: packages will be selected that are compatible with the architecture specified by *arch* :param single_name: whether to return a single package name :param req: the requirement from the user :return: a list of the best packages from *pkglist* """ returnlist = [] compatArchList = self.arch.get_arch_list(arch) multiLib = [] singleLib = [] noarch = [] for po in pkglist: if po.arch not in compatArchList: continue elif po.arch in ("noarch"): noarch.append(po) elif isMultiLibArch(arch=po.arch): multiLib.append(po) else: singleLib.append(po) # we now have three lists. find the best package(s) of each multi = self._bestPackageFromList(multiLib, req=req) single = self._bestPackageFromList(singleLib, req=req) no = self._bestPackageFromList(noarch, req=req) if single_name and multi and single and multi.name != single.name: # Sinlge _must_ match multi, if we want a single package name single = None # now, to figure out which arches we actually want # if there aren't noarch packages, it's easy. multi + single if no is None: if multi: returnlist.append(multi) if single: returnlist.append(single) # if there's a noarch and it's newer than the multilib, we want # just the noarch. otherwise, we want multi + single elif multi: best = self._bestPackageFromList([multi,no], req=req) if best.arch == "noarch": returnlist.append(no) else: if multi: returnlist.append(multi) if single: returnlist.append(single) # similar for the non-multilib case elif single: best = self._bestPackageFromList([single,no], req=req) if best.arch == "noarch": returnlist.append(no) else: returnlist.append(single) # if there's not a multi or single lib, then we want the noarch else: returnlist.append(no) return returnlist # FIXME: This doesn't really work, as it assumes one obsoleter for each pkg # when we can have: # 1 pkg obsoleted by multiple pkgs _and_ # 1 pkg obsoleting multiple pkgs # ...and we need to detect loops, and get the arches "right" and do this # for chains. Atm. I hate obsoletes, and I can't get it to work better, # easily ... so screw it, don't create huge chains of obsoletes with some # loops in there too ... or I'll have to hurt you. def _pkg2obspkg(self, po): """ Given a package return the package it's obsoleted by and so we should install instead. Or None if there isn't one. """ if self._up is not None: thispkgobsdict = self.up.checkForObsolete([po.pkgtup]) else: # This is pretty hacky, but saves a huge amount of time for small # ops. if not self.conf.obsoletes: return None if not hasattr(self, '_up_obs_hack'): obs_init = time.time() up = rpmUtils.updates.Updates([], []) up.rawobsoletes = self.pkgSack.returnObsoletes(newest=True) self.verbose_logger.debug('Obs Init time: %0.3f' % (time.time() - obs_init)) self._up_obs_hack = up thispkgobsdict = self._up_obs_hack.checkForObsolete([po.pkgtup]) if po.pkgtup in thispkgobsdict: obsoleting = thispkgobsdict[po.pkgtup] oobsoleting = [] # We want to keep the arch. of the obsoleted pkg. if possible. for opkgtup in obsoleting: if not canCoinstall(po.arch, opkgtup[1]): oobsoleting.append(opkgtup) if oobsoleting: obsoleting = oobsoleting if len(obsoleting) > 1: # Pick the first name, and run with it... first = obsoleting[0] obsoleting = [pkgtup for pkgtup in obsoleting if first[0] == pkgtup[0]] if len(obsoleting) > 1: # Lock to the latest version... def _sort_ver(x, y): n1,a1,e1,v1,r1 = x n2,a2,e2,v2,r2 = y return compareEVR((e1,v1,r1), (e2,v2,r2)) obsoleting.sort(_sort_ver) first = obsoleting[0] obsoleting = [pkgtup for pkgtup in obsoleting if not _sort_ver(first, pkgtup)] if len(obsoleting) > 1: # Now do arch distance (see depsolve:compare_providers)... def _sort_arch_i(carch, a1, a2): res1 = archDifference(carch, a1) if not res1: return 0 res2 = archDifference(carch, a2) if not res2: return 0 return res1 - res2 def _sort_arch(x, y): n1,a1,e1,v1,r1 = x n2,a2,e2,v2,r2 = y ret = _sort_arch_i(po.arch, a1, a2) if ret: return ret ret = _sort_arch_i(self.arch.bestarch, a1, a2) return ret obsoleting.sort(_sort_arch) for pkgtup in obsoleting: pkg = self.getPackageObject(pkgtup, allow_missing=True) if pkg is not None: return pkg return None return None def _test_loop(self, node, next_func): """ Generic comp. sci. test for looping, walk the list with two pointers moving one twice as fast as the other. If they are ever == you have a loop. If loop we return None, if no loop the last element. """ slow = node done = False while True: next = next_func(node) if next is None and not done: return None if next is None: return node node = next_func(next) if node is None: return next done = True slow = next_func(slow) if node == slow: return None def _try_bold(self, string_): """Attempt to make the string look bold in terminal.""" if hasattr(self, 'term'): return '%s%s%s' % (self.term.MODE['bold'], string_, self.term.MODE['normal']) return string_ def _at_groupinstall(self, pattern, upgrade=False): " Do groupinstall via. leading @ on the cmd line, for install." assert pattern[0] == '@' group_string = pattern[1:] tx_return = [] try: comps = self.comps except yum.Errors.GroupsError, e: # No Groups Available in any repository? # This also means no installed groups, when using objects. self.logger.warning(e) return tx_return found = False if group_string and group_string[0] == '^': group_string = group_string[1:] # Actually dealing with "environment groups". for env_grp in comps.return_environments(group_string): found = True txmbrs = self.selectEnvironment(env_grp.environmentid, upgrade=upgrade) tx_return.extend(txmbrs) else: for group in comps.return_groups(group_string): found = True txmbrs = self.selectGroup(group.groupid, upgrade=upgrade) tx_return.extend(txmbrs) if not found: raise Errors.GroupInstallError, _('Group %s does not exist.') % self._try_bold(group_string) return tx_return def _at_groupupgrade(self, pattern): " Do group upgrade via. leading @ on the cmd line, for update." try: return self._at_groupinstall(pattern, upgrade=True) except Errors.GroupInstallError, e: self.logger.warning(_('Warning: %s'), e) if self.conf.skip_missing_names_on_update: return [] else: raise def _at_groupremove(self, pattern): " Do groupremove via. leading @ on the cmd line, for remove." assert pattern[0] == '@' group_string = pattern[1:] tx_return = [] if group_string and group_string[0] == '^': group_string = group_string[1:] # Actually dealing with "environment groups". try: txmbrs = self.environmentRemove(group_string) except yum.Errors.GroupsError: self.logger.critical(_('Warning: Environment Group %s does not exist.'), group_string) else: tx_return.extend(txmbrs) return tx_return try: txmbrs = self.groupRemove(group_string) except yum.Errors.GroupsError: self.logger.critical(_('No group named %s exists'), group_string) else: tx_return.extend(txmbrs) return tx_return # Note that this returns available pkgs, and not txmbrs like the other # _at_group* functions. def _at_groupdowngrade(self, pattern): " Do downgrade of a group via. leading @ on the cmd line." assert pattern[0] == '@' grpid = pattern[1:] # FIXME: **** environment groups and groups as objects... **** thesegroups = self.comps.return_groups(grpid) if not thesegroups: raise Errors.GroupsError, _("No Group named %s exists") % to_unicode(grpid) pkgnames = set() for thisgroup in thesegroups: pkgnames.update(thisgroup.packages) return self.pkgSack.searchNames(pkgnames) def _minus_deselect(self, pattern): """ Remove things from the transaction, like kickstart. """ assert pattern[0] == '-' pat = pattern[1:].strip() if pat and pat.startswith('@^'): pat = pat[2:] return self.deselectEnvironment(pat) if pat and pat[0] == '@': pat = pat[1:] return self.deselectGroup(pat) return self.tsInfo.deselect(pat) def _find_obsoletees(self, po): """ Return the pkgs. that are obsoleted by the po we pass in. """ if not self.conf.obsoletes: return if not isinstance(po, YumLocalPackage): for (obstup, inst_tup) in self.up.getObsoletersTuples(name=po.name): if po.pkgtup == obstup: installed_pkg = self.getInstalledPackageObject(inst_tup) yield installed_pkg else: for pkg in self._find_obsoletees_direct(po): yield pkg def _find_obsoletees_direct(self, po): """ Return the pkgs. that are obsoleted by the po we pass in. This works directly on the package data, for two reasons: 1. Consulting .up. has a slow setup for small/fast ops. 2. We need this work even if obsoletes are turned off, because rpm will be doing it for us. """ for obs_n in po.obsoletes_names: for pkg in self.rpmdb.searchNevra(name=obs_n): if pkg.obsoletedBy([po]): yield pkg def _add_prob_flags(self, *flags): """ Add all of the passed flags to the tsInfo.probFilterFlags array. """ for flag in flags: if flag not in self.tsInfo.probFilterFlags: self.tsInfo.probFilterFlags.append(flag) def _enable_oldpackage_flag(self, po): """Add RPMPROB_FILTER_OLDPACKAGE if the package requires it.""" for ipkg in self.rpmdb.searchNevra(name=po.name): if ipkg.verGT(po) and not canCoinstall(ipkg.arch, po.arch): self._add_prob_flags(rpm.RPMPROB_FILTER_OLDPACKAGE) return True return False def _install_is_upgrade(self, po, ipkgs): """ See if po is an upgradeable version of an installed pkg. Non-compat. arch differences mean no. """ if False and self._up is not None: # This is the old code, not sure it's good to have two paths. And # we don't want to create .up. (which requires init repos.) if we # don't have to. return po.pkgtup in self.up.updating_dict if self.allowedMultipleInstalls(po): return False for ipkg in ipkgs: if po.verLE(ipkg): continue if po.arch == ipkg.arch: # always fine. return True if 'noarch' in (po.arch, ipkg.arch): return True if not self.arch.multilib: return True if canCoinstall(po.arch, ipkg.arch): continue return True return False def _valid_install_arch(self, po, ipkgs=None): ''' See if we can install this arch of package, mainly for i386 vs. i586 or ppc64 vs. ppc64 etc. ''' if not ipkgs: ipkgs = self.rpmdb.searchNames([po.name]) else: ipkgs = ipkgs[:] # Add these anyway, just to be sure. for txmbr in self.tsInfo.matchNaevr(po.name): if txmbr.output_state not in TS_INSTALL_STATES: continue ipkgs.append(txmbr.po) for ipkg in ipkgs: if po.arch == ipkg.arch: continue if not po.verEQ(ipkg): continue if canCoinstall(po.arch, ipkg.arch): continue self.verbose_logger.log(logginglevels.INFO_2, _("Package: %s - can't co-install with %s"), po, ipkg) return False return True def _valid_obsoleter_arch(self, obsoleter, obsoletee): """Return whether this obsoleter meets multilib_policy in case we are dealing with the noarch->arch obsoletion case.""" if not self.arch.multilib or self.conf.multilib_policy != 'best': # Install everything return True if obsoletee.arch != 'noarch' or obsoleter.arch == 'noarch': # We do respect any arch->(no)arch obsoletions (having # obsoletee.i386 installed on x86_64, you'd still expect # obsoleter.i386 to replace it, even if you have # multilib_policy=best). return True # noarch->arch case return obsoleter.arch in self.arch.legit_multi_arches def install(self, po=None, **kwargs): """Mark the specified item for installation. If a package object is given, mark it for installation. Otherwise, mark the best package specified by the key word arguments for installation. :param po: a package object to install :param kwargs: if *po* is not specified, these keyword arguments will be used to find the best package to install :return: a list of the transaction members added to the transaction set by this function :raises: :class:`yum.Errors.InstallError` if there is a problem installing the package """ # This is kind of hacky, we really need a better way to do errors than # doing them directly from .install/etc. ... but this is easy. *sigh*. # We are only using this in "groupinstall" atm. ... so we don't have # a long list of "blah already installed." messages when people run # "groupinstall mygroup" in yum-cron etc. pkg_warn = kwargs.get('pkg_warning_level', 'flibble') def _dbg2(*args, **kwargs): self.verbose_logger.log(logginglevels.DEBUG_2, *args, **kwargs) level2func = {'debug2' : _dbg2, 'warning' : self.verbose_logger.warning} if pkg_warn not in level2func: pkg_warn = 'warning' pkg_warn = level2func[pkg_warn] pkgs = [] was_pattern = False if po: if isinstance(po, YumAvailablePackage) or isinstance(po, YumLocalPackage): pkgs.append(po) else: raise Errors.InstallError, _('Package Object was not a package object instance') else: if not kwargs: raise Errors.InstallError, _('Nothing specified to install') if 'pattern' in kwargs: if kwargs['pattern'] and kwargs['pattern'][0] == '-': return self._minus_deselect(kwargs['pattern']) if kwargs['pattern'] and kwargs['pattern'][0] == '@': return self._at_groupinstall(kwargs['pattern']) repoid = None # All of them if 'repoid' in kwargs: repoid = kwargs['repoid'] was_pattern = True pats = [kwargs['pattern']] mypkgs = self.pkgSack.returnPackages(patterns=pats, repoid=repoid, ignore_case=False) pkgs.extend(mypkgs) # if we have anything left unmatched, let's take a look for it # being a dep like glibc.so.2 or /foo/bar/baz if not mypkgs: arg = kwargs['pattern'] self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), arg) mypkgs = self.returnPackagesByDep(arg) if repoid: mypkgs = misc.filter_pkgs_repoid(mypkgs, repoid) if not misc.re_glob(arg): mypkgs = self.bestPackagesFromList(mypkgs, single_name=True, req=arg) pkgs.extend(mypkgs) else: nevra_dict = self._nevra_kwarg_parse(kwargs) pkgs = self.pkgSack.searchNevra(name=nevra_dict['name'], epoch=nevra_dict['epoch'], arch=nevra_dict['arch'], ver=nevra_dict['version'], rel=nevra_dict['release']) self._add_not_found_a(pkgs, nevra_dict) pkgs = misc.filter_pkgs_repoid(pkgs, kwargs.get('repoid')) if pkgs: # if was_pattern or nevra-dict['arch'] is none, take the list # of arches based on our multilib_compat config and # toss out any pkgs of any arch NOT in that arch list # only do these things if we're multilib if self.arch.multilib: if was_pattern or not nevra_dict['arch']: # and only if they # they didn't specify an arch if self.conf.multilib_policy == 'best': pkgs_by_name = {} use = [] not_added = [] best = self.arch.legit_multi_arches best.append('noarch') for pkg in pkgs: if pkg.arch in best: pkgs_by_name[pkg.name] = 1 use.append(pkg) else: not_added.append(pkg) for pkg in not_added: if not pkg.name in pkgs_by_name: use.append(pkg) pkgs = use pkgs = packagesNewestByName(pkgs) pkgbyname = {} for pkg in pkgs: if pkg.name not in pkgbyname: pkgbyname[pkg.name] = [ pkg ] else: pkgbyname[pkg.name].append(pkg) lst = [] for pkgs in pkgbyname.values(): lst.extend(self.bestPackagesFromList(pkgs)) pkgs = lst if not pkgs: # Do we still want to return errors here? # We don't in the cases below, so I didn't here... if 'pattern' in kwargs: arg = kwargs['pattern'] pkgs = self.rpmdb.returnPackages(patterns=[arg], ignore_case=False) if not pkgs: self.verbose_logger.debug( _('Checking for installed virtual provide or file-provide for %s'), arg) pkgs = self.returnInstalledPackagesByDep(arg) if 'name' in kwargs: pkgs = self.rpmdb.searchNevra(name=kwargs['name']) if 'pkgtup' in kwargs: pkgs = self.rpmdb.searchNevra(name=kwargs['pkgtup'][0]) # Warning here does "weird" things when doing: # yum --disablerepo='*' install '*' # etc. ... see RHBZ#480402 if False: for pkg in pkgs: self.verbose_logger.warning(_('Package %s installed and not available'), pkg) if pkgs: return [] raise Errors.InstallError, _('No package(s) available to install') # FIXME - lots more checking here # - install instead of erase # - better error handling/reporting tx_return = [] for po in pkgs: if self.tsInfo.exists(pkgtup=po.pkgtup): if self.tsInfo.getMembersWithState(po.pkgtup, TS_INSTALL_STATES): self.verbose_logger.log(logginglevels.DEBUG_1, _('Package: %s - already in transaction set'), po) tx_return.extend(self.tsInfo.getMembers(pkgtup=po.pkgtup)) continue # make sure this shouldn't be passed to update: ipkgs = self.rpmdb.searchNames([po.name]) if ipkgs and self._install_is_upgrade(po, ipkgs): txmbrs = self.update(po=po, repoid=kwargs.get('repoid')) tx_return.extend(txmbrs) continue if not self._valid_install_arch(po, ipkgs): continue # Make sure we're not installing a package which is obsoleted by # something else in the repo. Unless there is a obsoletion loop, # at which point ignore everything. # NOTE: This is broken wrt. repoid... obsoleting_pkg = None if self.conf.obsoletes and not isinstance(po, YumLocalPackage): obsoleting_pkg = self._test_loop(po, self._pkg2obspkg) if obsoleting_pkg is not None: # this is not a definitive check but it'll make sure we don't # pull in foo.i586 when foo.x86_64 already obsoletes the pkg and # is already installed already_obs = None pkgs = self.rpmdb.searchNevra(name=obsoleting_pkg.name) pkgs = po.obsoletedBy(pkgs, limit=1) if pkgs: already_obs = pkgs[0] if already_obs: pkg_warn(_('Package %s is obsoleted by %s which is already installed'), po, already_obs) else: if 'provides_for' in kwargs: if not obsoleting_pkg.provides_for(kwargs['provides_for']): pkg_warn(_('Package %s is obsoleted by %s, but obsoleting package does not provide for requirements'), po.name, obsoleting_pkg.name) continue pkg_warn(_('Package %s is obsoleted by %s, trying to install %s instead'), po.name, obsoleting_pkg.name, obsoleting_pkg) tx_return.extend(self.install(po=obsoleting_pkg)) continue # make sure it's not already installed if self.rpmdb.contains(po=po): if not self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES): pkg_warn(_('Package %s already installed and latest version'), po) continue # make sure we don't have a name.arch of this already installed # if so pass it to update b/c it should be able to figure it out # if self.rpmdb.contains(name=po.name, arch=po.arch) and not self.allowedMultipleInstalls(po): if not self.allowedMultipleInstalls(po): found = True for ipkg in self.rpmdb.searchNevra(name=po.name, arch=po.arch): found = False if self.tsInfo.getMembersWithState(ipkg.pkgtup, TS_REMOVE_STATES): found = True break if not found: pkg_warn(_('Package matching %s already installed. Checking for update.'), po) txmbrs = self.update(po=po, repoid=kwargs.get('repoid')) tx_return.extend(txmbrs) continue # at this point we are going to mark the pkg to be installed, make sure # it's not an older package that is allowed in due to multiple installs # or some other oddity. If it is - then modify the problem filter to cope for ipkg in self.rpmdb.searchNevra(name=po.name, arch=po.arch): if ipkg.verEQ(po): self._add_prob_flags(rpm.RPMPROB_FILTER_REPLACEPKG, rpm.RPMPROB_FILTER_REPLACENEWFILES, rpm.RPMPROB_FILTER_REPLACEOLDFILES) # Yum needs the remove to happen before we allow the # install of the same version. But rpm doesn't like that # as it then has an install which removes the old version # and a remove, which also tries to remove the old version. self.tsInfo.remove(ipkg.pkgtup) break self._enable_oldpackage_flag(po) # it doesn't obsolete anything. If it does, mark that in the tsInfo, too obs_pkgs = list(self._find_obsoletees_direct(po)) if obs_pkgs: for obsoletee in obs_pkgs: txmbr = self.tsInfo.addObsoleting(po, obsoletee) self.tsInfo.addObsoleted(obsoletee, po) tx_return.append(txmbr) else: txmbr = self.tsInfo.addInstall(po) tx_return.append(txmbr) return tx_return def _check_new_update_provides(self, opkg, npkg): """ Check for any difference in the provides of the old and new update that is needed by the transaction. If so we "update" those pkgs too, to the latest version. """ oprovs = set(opkg.returnPrco('provides')) nprovs = set(npkg.returnPrco('provides')) tx_return = [] for prov in oprovs.difference(nprovs): reqs = self.tsInfo.getRequires(*prov) for pkg in reqs: for req in reqs[pkg]: if not npkg.inPrcoRange('provides', req): naTup = (pkg.name, pkg.arch) for pkg in self.pkgSack.returnNewestByNameArch(naTup): tx_return.extend(self.update(po=pkg)) break return tx_return def _newer_update_in_trans(self, pkgtup, available_pkg, tx_return): """ We return True if there is a newer package already in the transaction. If there is an older one, we remove it (and update any deps. that aren't satisfied by the newer pkg) and return False so we'll update to this newer pkg. """ found = False for txmbr in self.tsInfo.getMembersWithState(pkgtup, [TS_UPDATED]): count = 0 for po in txmbr.updated_by: if available_pkg.verLE(po): count += 1 else: for ntxmbr in self.tsInfo.getMembers(po.pkgtup): self.tsInfo.remove(ntxmbr.po.pkgtup) txs = self._check_new_update_provides(ntxmbr.po, available_pkg) tx_return.extend(txs) if count: found = True else: self.tsInfo.remove(txmbr.po.pkgtup) return found def _add_up_txmbr(self, requiringPo, upkg, ipkg): txmbr = self.tsInfo.addUpdate(upkg, ipkg) if requiringPo: txmbr.setAsDep(requiringPo) if ('reason' in ipkg.yumdb_info and ipkg.yumdb_info.reason == 'dep'): txmbr.reason = 'dep' return txmbr def update(self, po=None, requiringPo=None, update_to=False, **kwargs): """Mark the specified items to be updated. If a package object is given, mark it. Else, if a package is specified by the keyword arguments, mark it. Finally, if nothing is given, mark all installed packages to be updated. :param po: the package object to be marked for updating :param requiringPo: the package object that requires the upgrade :param update_to: if *update_to* is True, the update will only be run if it will update the given package to the given version. For example, if the package foo-1-2 is installed,:: updatePkgs(["foo-1-2"], update_to=False) will work identically to:: updatePkgs(["foo"]) but:: updatePkgs(["foo-1-2"], update_to=True) will do nothing :param kwargs: if *po* is not given, the names or wildcards in *kwargs* will be used to find the packages to update :return: a list of transaction members added to the transaction set by this function """ # check for args - if no po nor kwargs, do them all # if po, do it, ignore all else # if no po do kwargs # uninstalled pkgs called for update get returned with errors in a list, maybe? pkg_warn = kwargs.get('pkg_warning_level', 'flibble') def _dbg2(*args, **kwargs): self.verbose_logger.log(logginglevels.DEBUG_2, *args, **kwargs) level2func = {'debug2' : _dbg2, 'warning' : self.verbose_logger.warning} if pkg_warn not in level2func: pkg_warn = 'warning' pkg_warn = level2func[pkg_warn] tx_return = [] if not po and not kwargs: # update everything (the easy case) self.verbose_logger.log(logginglevels.DEBUG_2, _('Updating Everything')) updates = self.up.getUpdatesTuples() if self.conf.obsoletes: obsoletes = self.up.getObsoletesTuples(newest=1) else: obsoletes = [] for (obsoleting, installed) in obsoletes: obsoleting_pkg = self.getPackageObject(obsoleting, allow_missing=True) if obsoleting_pkg is None: continue installed_pkg = self.getInstalledPackageObject(installed) if not self._valid_obsoleter_arch(obsoleting_pkg, installed_pkg): continue topkg = self._test_loop(obsoleting_pkg, self._pkg2obspkg) if topkg is not None: obsoleting_pkg = topkg txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg) self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg) if requiringPo: txmbr.setAsDep(requiringPo) tx_return.append(txmbr) for (new, old) in updates: if self.tsInfo.isObsoleted(pkgtup=old): self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % old) else: new = self.getPackageObject(new, allow_missing=True) if new is None: continue tx_return.extend(self.update(po=new)) # Upgrade the installed groups, as part of generic "yum upgrade" if (self.conf.group_command == 'objects' and self.conf.upgrade_group_objects_upgrade): for ievgrp in self.igroups.environments: tx_return.extend(self._at_groupupgrade('@^' + ievgrp)) for igrp in self.igroups.groups: tx_return.extend(self._at_groupupgrade('@' + igrp)) return tx_return # complications # the user has given us something - either a package object to be # added to the transaction as an update or they've given us a pattern # of some kind instpkgs = [] availpkgs = [] arch_specified = True if po: # just a po if po.repoid == 'installed': instpkgs.append(po) else: availpkgs.append(po) elif 'pattern' in kwargs: if kwargs['pattern'] and kwargs['pattern'][0] == '-': return self._minus_deselect(kwargs['pattern']) if kwargs['pattern'] and kwargs['pattern'][0] == '@': return self._at_groupupgrade(kwargs['pattern']) arg = kwargs['pattern'] if not update_to: instpkgs = self.rpmdb.returnPackages(patterns=[arg]) instpkgs = misc.filter_pkgs_repoid(instpkgs, kwargs.get('repoid')) else: availpkgs = self.pkgSack.returnPackages(patterns=[arg], repoid=kwargs.get('repoid')) if not instpkgs and not availpkgs: depmatches = [] try: if update_to: depmatches = self.returnPackagesByDep(arg) else: depmatches = self.returnInstalledPackagesByDep(arg) except yum.Errors.YumBaseError, e: self.logger.critical(_('%s') % e) depmatches = misc.filter_pkgs_repoid(depmatches, kwargs.get('repoid')) if update_to: availpkgs.extend(depmatches) else: instpkgs.extend(depmatches) # Always look for available packages, it doesn't seem to do any # harm (apart from some time). And it fixes weird edge cases where # "update a" (which requires a new b) is different from "update b" try: if update_to: m = [] elif kwargs.get('repoid'): pats = [kwargs['pattern']] m = self.pkgSack.sacks[kwargs['repoid']] m = m.returnNewestByNameArch(patterns=pats) else: pats = [kwargs['pattern']] m = self.pkgSack.returnNewestByNameArch(patterns=pats) except Errors.PackageSackError: m = [] availpkgs.extend(m) if not availpkgs and not instpkgs: self.logger.critical(_('No Match for argument: %s') % to_unicode(arg)) if not self.conf.skip_missing_names_on_update: raise Errors.UpdateMissingNameError, _('Not tolerating missing names on update, stopping.') arch_specified = '.' in kwargs['pattern'] else: # we have kwargs, sort them out. nevra_dict = self._nevra_kwarg_parse(kwargs) instpkgs = self.rpmdb.searchNevra(name=nevra_dict['name'], epoch=nevra_dict['epoch'], arch=nevra_dict['arch'], ver=nevra_dict['version'], rel=nevra_dict['release']) if not instpkgs: availpkgs = self.pkgSack.searchNevra(name=nevra_dict['name'], epoch=nevra_dict['epoch'], arch=nevra_dict['arch'], ver=nevra_dict['version'], rel=nevra_dict['release']) self._add_not_found_a(availpkgs, nevra_dict) if len(availpkgs) > 1: availpkgs = self._compare_providers(availpkgs, requiringPo) availpkgs = map(lambda x: x[0], availpkgs) elif not availpkgs: pkg_warn(_("No package matched to upgrade: %s"), self._ui_nevra_dict(nevra_dict)) # for any thing specified # get the list of available pkgs matching it (or take the po) # get the list of installed pkgs matching it (or take the po) # go through each list and look for: # things obsoleting it if it is an installed pkg # things it updates if it is an available pkg # things updating it if it is an installed pkg # in that order # all along checking to make sure we: # don't update something that's already been obsoleted # don't update something that's already been updated # if there are more than one package that matches an update from # a pattern/kwarg then: # if it is a valid update and we' # TODO: we should search the updates and obsoletes list and # mark the package being updated or obsoleted away appropriately # and the package relationship in the tsInfo # check for obsoletes first if self.conf.obsoletes: for installed_pkg in instpkgs: obs_tups = self.up.obsoleted_dict.get(installed_pkg.pkgtup, []) # This is done so we don't have to returnObsoletes(newest=True) # It's a minor UI problem for RHEL, but might as well dtrt. obs_pkgs = [] for pkgtup in obs_tups: obsoleting_pkg = self.getPackageObject(pkgtup, allow_missing=True) if obsoleting_pkg is None: continue if not arch_specified and not self._valid_obsoleter_arch(obsoleting_pkg, installed_pkg): continue obs_pkgs.append(obsoleting_pkg) # NOTE: Broekn wrt. repoid for obsoleting_pkg in packagesNewestByName(obs_pkgs): tx_return.extend(self.install(po=obsoleting_pkg)) for available_pkg in availpkgs: for obsoleted_pkg in self._find_obsoletees(available_pkg): if not arch_specified and not self._valid_obsoleter_arch(available_pkg, obsoleted_pkg): continue obsoleted = obsoleted_pkg.pkgtup txmbr = self.tsInfo.addObsoleting(available_pkg, obsoleted_pkg) if requiringPo: txmbr.setAsDep(requiringPo) tx_return.append(txmbr) if self.tsInfo.isObsoleted(obsoleted): self.verbose_logger.log(logginglevels.DEBUG_2, _('Package is already obsoleted: %s.%s %s:%s-%s') % obsoleted) else: txmbr = self.tsInfo.addObsoleted(obsoleted_pkg, available_pkg) tx_return.append(txmbr) for installed_pkg in instpkgs: for updating in self.up.updatesdict.get(installed_pkg.pkgtup, []): po = self.getPackageObject(updating, allow_missing=True) if po is None: continue if self.tsInfo.isObsoleted(installed_pkg.pkgtup): self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % installed_pkg.pkgtup) # at this point we are going to mark the pkg to be installed, make sure # it doesn't obsolete anything. If it does, mark that in the tsInfo, too elif po.pkgtup in self.up.getObsoletesList(name=po.name): for obsoletee in self._find_obsoletees(po): txmbr = self.tsInfo.addUpdate(po, installed_pkg) if requiringPo: txmbr.setAsDep(requiringPo) self.tsInfo.addObsoleting(po, obsoletee) self.tsInfo.addObsoleted(obsoletee, po) tx_return.append(txmbr) else: if self.tsInfo.getMembersWithState(installed_pkg.pkgtup, TS_REMOVE_STATES): self.tsInfo.remove(installed_pkg.pkgtup) txmbr = self._add_up_txmbr(requiringPo, po, installed_pkg) tx_return.append(txmbr) for available_pkg in availpkgs: if not self._valid_install_arch(available_pkg): continue # "Just do it" if it's a local pkg. if isinstance(available_pkg, YumLocalPackage): n = available_pkg.name for updated_pkg in self.rpmdb.returnNewestByName(n): updated = updated_pkg.pkgtup if self.tsInfo.getMembersWithState(updated, TS_REMOVE_STATES): self.tsInfo.remove(updated) txmbr = self._add_up_txmbr(requiringPo, available_pkg, updated_pkg) tx_return.append(txmbr) continue # Make sure we're not installing a package which is obsoleted by # something else in the repo. Unless there is a obsoletion loop, # at which point ignore everything. obsoleting_pkg = self._test_loop(available_pkg, self._pkg2obspkg) if obsoleting_pkg is not None: if (kwargs.get('repoid') and obsoleting_pkg.repoid != kwargs.get('repoid')): continue # Meh. self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is obsoleted: %s'), available_pkg) tx_return.extend(self.update(po=obsoleting_pkg)) continue for updated in self.up.updating_dict.get(available_pkg.pkgtup, []): if self.tsInfo.isObsoleted(updated): self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % updated) elif self._newer_update_in_trans(updated, available_pkg, tx_return): self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s') % updated) else: updated_pkg = self.getInstalledPackageObject(updated) if self.tsInfo.getMembersWithState(updated, TS_REMOVE_STATES): self.tsInfo.remove(updated) txmbr = self._add_up_txmbr(requiringPo, available_pkg, updated_pkg) tx_return.append(txmbr) # check to see if the pkg we want to install is not _quite_ the newest # one but still technically an update over what is installed. pot_updated = self.rpmdb.searchNevra(name=available_pkg.name, arch=available_pkg.arch) if pot_updated and self.allowedMultipleInstalls(available_pkg): # only compare against the newest of what's installed for kernel pot_updated = sorted(pot_updated)[-1:] #FIXME - potentially do the comparables thing from what used to # be in cli.installPkgs() to see what we should be comparing # it to of what is installed. in the meantime name.arch is # most likely correct # this is sorta a fix - but it shouldn't be only for localPackages # else: # if available_pkg in self.localPackages: # # if we got here the potentially updated is not a matching arch # # and we're goofed up in a localPackage that someone wants to apply for some odd reason # # so we go for name-only update match and check # pot_updated = self.rpmdb.searchNevra(name=available_pkg.name) for ipkg in pot_updated: if self.tsInfo.isObsoleted(ipkg.pkgtup): self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already obsoleted: %s.%s %s:%s-%s') % ipkg.pkgtup) elif self._newer_update_in_trans(ipkg.pkgtup, available_pkg, tx_return): self.verbose_logger.log(logginglevels.DEBUG_2, _('Not Updating Package that is already updated: %s.%s %s:%s-%s') % ipkg.pkgtup) elif ipkg.verLT(available_pkg): txmbr = self._add_up_txmbr(requiringPo, available_pkg, ipkg) tx_return.append(txmbr) for txmbr in tx_return: for i_pkg in self.rpmdb.searchNevra(name=txmbr.name): if i_pkg not in txmbr.updates: if self._does_this_update(txmbr.po, i_pkg): self.tsInfo.addUpdated(i_pkg, txmbr.po) return tx_return def remove(self, po=None, **kwargs): """Mark the specified packages for removal. If a package object is given, mark it for removal. Otherwise, mark the package specified by the keyword arguments. :param po: the package object to mark for installation :param kwargs: If *po* is not given, the keyword arguments will be used to specify a package to mark for installation :return: a list of the transaction members that were added to the transaction set by this method :raises: :class:`yum.Errors.RemoveError` if nothing is specified to mark for removal """ if not po and not kwargs: raise Errors.RemoveError, 'Nothing specified to remove' tx_return = [] pkgs = [] if po: pkgs = [po] else: if 'pattern' in kwargs: if kwargs['pattern'] and kwargs['pattern'][0] == '-': return self._minus_deselect(kwargs['pattern']) if kwargs['pattern'] and kwargs['pattern'][0] == '@': return self._at_groupremove(kwargs['pattern']) (e,m,u) = self.rpmdb.matchPackageNames([kwargs['pattern']]) if 'repoid' in kwargs: e = misc.filter_pkgs_repoid(e, kwargs['repoid']) m = misc.filter_pkgs_repoid(m, kwargs['repoid']) pkgs.extend(e) pkgs.extend(m) if u: depmatches = [] arg = u[0] try: depmatches = self.returnInstalledPackagesByDep(arg) except yum.Errors.YumBaseError, e: self.logger.critical(_('%s') % e) if 'repoid' in kwargs: depmatches = misc.filter_pkgs_repoid(depmatches, kwargs['repoid']) if not depmatches: arg = to_unicode(arg) self.logger.critical(_('No Match for argument: %s') % to_unicode(arg)) else: pkgs.extend(depmatches) else: nevra_dict = self._nevra_kwarg_parse(kwargs) pkgs = self.rpmdb.searchNevra(name=nevra_dict['name'], epoch=nevra_dict['epoch'], arch=nevra_dict['arch'], ver=nevra_dict['version'], rel=nevra_dict['release']) self._add_not_found_i(pkgs, nevra_dict) if len(pkgs) == 0: if not kwargs.get('silence_warnings', False): self.logger.warning(_("No package matched to remove: %s"), self._ui_nevra_dict(nevra_dict)) ts = self.rpmdb.readOnlyTS() kern_pkgtup = misc.get_running_kernel_pkgtup(ts) for po in pkgs: if self.conf.protected_packages and po.pkgtup == kern_pkgtup: self.logger.warning(_("Skipping the running kernel: %s") % po) continue if self.tsInfo.getMembers(po.pkgtup): # This allows multiple reinstalls and update/downgrade "cancel" for txmbr in self.tsInfo.matchNaevr(po.name): self.logger.info(_("Removing %s from the transaction") % txmbr) self.tsInfo.remove(txmbr.pkgtup) # Now start the remove/reinstall txmbr = self.tsInfo.addErase(po) tx_return.append(txmbr) return tx_return def installLocal(self, pkg, po=None, updateonly=False): """Mark a package on the local filesystem (i.e. not from a repository) for installation. :param pkg: a string specifying the path to an rpm file in the local filesystem to be marked for installation :param po: a :class:`yum.packages.YumLocalPackage` :param updateonly: if True, the given package will only be marked for installation if it is an upgrade for a package that is already installed. If False, this restriction is not enforced :return: a list of the transaction members added to the transaction set by this method """ # read in the package into a YumLocalPackage Object # append it to self.localPackages # check if it can be installed or updated based on nevra versus rpmdb # don't import the repos until we absolutely need them for depsolving tx_return = [] installpkgs = [] updatepkgs = [] donothingpkgs = [] if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, ua=default_grabber.opts.user_agent) except Errors.MiscError: self.logger.critical(_('Cannot open: %s. Skipping.'), pkg) return tx_return self.verbose_logger.log(logginglevels.INFO_2, _('Examining %s: %s'), po.localpath, po) # apparently someone wanted to try to install a drpm as an rpm :( if po.hdr['payloadformat'] == 'drpm': self.logger.critical(_('Cannot localinstall deltarpm: %s. Skipping.'), pkg) return tx_return # if by any chance we're a noncompat arch rpm - bail and throw out an error # FIXME -our archlist should be stored somewhere so we don't have to # do this: but it's not a config file sort of thing # FIXME: Should add noarch, yum localinstall works ... # just rm this method? if po.arch not in self.arch.archlist: self.logger.critical(_('Cannot add package %s to transaction. Not a compatible architecture: %s'), pkg, po.arch) return tx_return if self.conf.obsoletes: obsoleters = po.obsoletedBy(self.rpmdb.searchObsoletes(po.name)) if obsoleters: self.logger.critical(_('Cannot install package %s. It is obsoleted by installed package %s'), po, obsoleters[0]) return tx_return # everything installed that matches the name installedByKey = self.rpmdb.searchNevra(name=po.name) # go through each package if len(installedByKey) == 0: # nothing installed by that name if updateonly: self.logger.warning(_('Package %s not installed, cannot update it. Run yum install to install it instead.'), po.name) return tx_return else: installpkgs.append(po) for installed_pkg in installedByKey: if po.verGT(installed_pkg): # we're newer - this is an update, pass to them if (installed_pkg.name in self.conf.exactarchlist and po.arch != installed_pkg.arch): donothingpkgs.append(po) elif self.allowedMultipleInstalls(po): installpkgs.append(po) else: updatepkgs.append((po, installed_pkg)) elif po.verEQ(installed_pkg): if (po.arch != installed_pkg.arch and (isMultiLibArch(po.arch) or isMultiLibArch(installed_pkg.arch))): if updateonly: self.logger.warning(_('Package %s.%s not installed, cannot update it. Run yum install to install it instead.'), po.name, po.arch) else: installpkgs.append(po) else: donothingpkgs.append(po) elif self.allowedMultipleInstalls(po): if updateonly: self.logger.warning(_('Package %s.%s not installed, cannot update it. Run yum install to install it instead.'), po.name, po.arch) else: installpkgs.append(po) else: donothingpkgs.append(po) # handle excludes for a localinstall check_pkgs = installpkgs + [x[0] for x in updatepkgs] if self._is_local_exclude(po, check_pkgs): self.verbose_logger.debug(_('Excluding %s'), po) return tx_return for po in installpkgs: self.verbose_logger.log(logginglevels.INFO_2, _('Marking %s to be installed'), po.localpath) self.localPackages.append(po) tx_return.extend(self.install(po=po)) for (po, oldpo) in updatepkgs: self.verbose_logger.log(logginglevels.INFO_2, _('Marking %s as an update to %s'), po.localpath, oldpo) self.localPackages.append(po) txmbrs = self.update(po=po) tx_return.extend(txmbrs) for po in donothingpkgs: self.verbose_logger.log(logginglevels.INFO_2, _('%s: does not update installed package.'), po.localpath) # this checks to make sure that any of the to-be-installed pkgs # does not obsolete something else that's installed # this doesn't handle the localpkgs obsoleting EACH OTHER or # anything else in the transaction set, though. That could/should # be fixed later but a fair bit of that is a pebkac and should be # said as "don't do that". potential 'fixme' for txmbr in tx_return: # We don't want to do this twice, so only bother if the txmbr # doesn't already obsolete anything. if txmbr.po.obsoletes and not txmbr.obsoletes: for obs_pkg in self._find_obsoletees(txmbr.po): self.tsInfo.addObsoleted(obs_pkg, txmbr.po) txmbr.obsoletes.append(obs_pkg) self.tsInfo.addObsoleting(txmbr.po,obs_pkg) return tx_return def reinstallLocal(self, pkg, po=None): """Mark a package on the local filesystem (i.e. not from a repository) for reinstallation. :param pkg: a string specifying the path to an rpm file in the local filesystem to be marked for reinstallation :param po: a :class:`yum.packages.YumLocalPackage` :return: a list of the transaction members added to the transaction set by this method """ if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, ua=default_grabber.opts.user_agent) except Errors.MiscError: self.logger.critical(_('Cannot open file: %s. Skipping.'), pkg) return [] self.verbose_logger.log(logginglevels.INFO_2, _('Examining %s: %s'), po.localpath, po) if po.arch not in self.arch.archlist: self.logger.critical(_('Cannot add package %s to transaction. Not a compatible architecture: %s'), pkg, po.arch) return [] # handle excludes for a local reinstall if self._is_local_exclude(po, [po]): self.verbose_logger.debug(_('Excluding %s'), po) return [] return self.reinstall(po=po) def reinstall(self, po=None, **kwargs): """Mark the given package for reinstallation. This is accomplished by setting problem filters to allow a reinstall take place, then calling :func:`install`. :param po: the package object to mark for reinstallation :param kwargs: if po is not given, the keyword will be used to specify a package for reinstallation :return: a list of the transaction members added to the transaction set by this method :raises: :class:`yum.Errors.ReinstallRemoveError` or :class:`yum.Errors.ReinstallInstallError` depending the nature of the error that is encountered """ self._add_prob_flags(rpm.RPMPROB_FILTER_REPLACEPKG, rpm.RPMPROB_FILTER_REPLACENEWFILES, rpm.RPMPROB_FILTER_REPLACEOLDFILES) # NOTE: For repoid=foo we could do two things: # 1. Only do the "remove" op. with packages installed from "foo". # 2. Only do the "install" op. with packages available from "foo". # ...so repoid=foo means #1 and repoid_install=foo means #2. Can also # combine them. tx_mbrs = [] if po: # The po, is the "available" po ... we want the installed po tx_mbrs.extend(self.remove(pkgtup=po.pkgtup)) else: tx_mbrs.extend(self.remove(**kwargs)) if not tx_mbrs: raise Errors.ReinstallRemoveError, _("Problem in reinstall: no package matched to remove") templen = len(tx_mbrs) # this is a reinstall, so if we can't reinstall exactly what we uninstalled # then we really shouldn't go on new_members = [] failed = [] failed_pkgs = [] for item in tx_mbrs[:]: # Make sure obsoletes processing is off, so we can reinstall() # pkgs that are obsolete. old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False if isinstance(po, YumLocalPackage) and 'repoid' not in kwargs: members = self.install(po=po) else: members = self.install(pkgtup=item.pkgtup, repoid=kwargs.get('repoid_install')) self.conf.obsoletes = old_conf_obs if len(members) == 0: self.tsInfo.remove(item.pkgtup) tx_mbrs.remove(item) failed.append(str(item.po)) failed_pkgs.append(item.po) continue new_members.extend(members) if failed and not tx_mbrs: raise Errors.ReinstallInstallError(_("Problem in reinstall: no package %s matched to install") % ", ".join(failed), failed_pkgs=failed_pkgs) tx_mbrs.extend(new_members) return tx_mbrs def downgradeLocal(self, pkg, po=None): """Mark a package on the local filesystem (i.e. not from a repository) to be downgraded. :param pkg: a string specifying the path to an rpm file in the local filesystem to be marked to be downgraded :param po: a :class:`yum.packages.YumLocalPackage` :return: a list of the transaction members added to the transaction set by this method """ if not po: try: po = YumUrlPackage(self, ts=self.rpmdb.readOnlyTS(), url=pkg, ua=default_grabber.opts.user_agent) except Errors.MiscError: self.logger.critical(_('Cannot open file: %s. Skipping.'), pkg) return [] self.verbose_logger.log(logginglevels.INFO_2, _('Examining %s: %s'), po.localpath, po) if po.arch not in self.arch.archlist: self.logger.critical(_('Cannot add package %s to transaction. Not a compatible architecture: %s'), pkg, po.arch) return [] # handle excludes for a local downgrade if self._is_local_exclude(po, [po]): self.verbose_logger.debug(_('Excluding %s'), po) return [] return self.downgrade(po=po) def _is_local_exclude(self, po, pkglist): """returns True if the local pkg should be excluded""" if "all" in self.conf.disable_excludes or \ "main" in self.conf.disable_excludes: return False toexc = [] if len(self.conf.exclude) > 0: exactmatch, matched, unmatched = \ parsePackages(pkglist, self.conf.exclude, casematch=1) toexc = exactmatch + matched if po in toexc: return True return False def downgrade(self, po=None, **kwargs): """Mark a package to be downgraded. This is equivalent to first removing the currently installed package, and then installing the older version. :param po: the package object to be marked to be downgraded :param kwargs: if a package object is not given, the keyword arguments will be used to specify a package to be marked to be downgraded :return: a list of the transaction members added to the transaction set by this method :raises: :class:`yum.Errors.DowngradeError` if no packages are specified or available for downgrade """ if not po and not kwargs: raise Errors.DowngradeError, 'Nothing specified to downgrade' doing_group_pkgs = False if po: apkgs = [po] elif 'pattern' in kwargs: if kwargs['pattern'] and kwargs['pattern'][0] == '-': return self._minus_deselect(kwargs['pattern']) if kwargs['pattern'] and kwargs['pattern'][0] == '@': apkgs = self._at_groupdowngrade(kwargs['pattern']) doing_group_pkgs = True # Don't warn. about some things else: apkgs = self.pkgSack.returnPackages(patterns=[kwargs['pattern']], ignore_case=False) if not apkgs: arg = kwargs['pattern'] self.verbose_logger.debug(_('Checking for virtual provide or file-provide for %s'), arg) try: apkgs = self.returnPackagesByDep(arg) except yum.Errors.YumBaseError, e: self.logger.critical(_('No Match for argument: %s') % to_unicode(arg)) else: nevra_dict = self._nevra_kwarg_parse(kwargs) apkgs = self.pkgSack.searchNevra(name=nevra_dict['name'], epoch=nevra_dict['epoch'], arch=nevra_dict['arch'], ver=nevra_dict['version'], rel=nevra_dict['release']) self._add_not_found_a(apkgs, nevra_dict) if not apkgs: # Do we still want to return errors here? # We don't in the cases below, so I didn't here... pkgs = [] if 'pattern' in kwargs: pkgs = self.rpmdb.returnPackages(patterns=[kwargs['pattern']], ignore_case=False) if 'name' in kwargs: pkgs = self.rpmdb.searchNevra(name=kwargs['name']) if pkgs: return [] raise Errors.DowngradeError, _('No package(s) available to downgrade') warned_nas = set() # Skip kernel etc. tapkgs = [] for pkg in apkgs: if self.allowedMultipleInstalls(pkg): if (pkg.name, pkg.arch) not in warned_nas: msg = _("Package %s is allowed multiple installs, skipping") % pkg self.verbose_logger.log(logginglevels.INFO_2, msg) warned_nas.add((pkg.name, pkg.arch)) continue tapkgs.append(pkg) apkgs = tapkgs # Find installed versions of "to downgrade pkgs" apkg_names = set() for pkg in apkgs: apkg_names.add(pkg.name) ipkgs = self.rpmdb.searchNames(list(apkg_names)) latest_installed_na = {} latest_installed_n = {} for pkg in sorted(ipkgs): if (pkg.name not in latest_installed_n or pkg.verGT(latest_installed_n[pkg.name][0])): latest_installed_n[pkg.name] = [pkg] elif pkg.verEQ(latest_installed_n[pkg.name][0]): latest_installed_n[pkg.name].append(pkg) latest_installed_na[(pkg.name, pkg.arch)] = pkg # Find "latest downgrade", ie. latest available pkg before # installed version. Indexed fromn the latest installed pkgtup. downgrade_apkgs = {} for pkg in sorted(apkgs): # We are cleverer here, I think... # if not self._valid_install_arch(pkg, ipkgs): # continue na = (pkg.name, pkg.arch) # Here we allow downgrades from .i386 => .noarch, or .i586 => .i386 # but not .i386 => .x86_64 (similar to update). lipkg = None if na in latest_installed_na: lipkg = latest_installed_na[na] elif pkg.name in latest_installed_n: for tlipkg in latest_installed_n[pkg.name]: if not canCoinstall(pkg.arch, tlipkg.arch): lipkg = tlipkg # Use this so we don't get confused when we have # different versions with different arches. na = (pkg.name, lipkg.arch) break if lipkg is None: if (na not in warned_nas and not doing_group_pkgs and pkg.name not in latest_installed_n): msg = _('No Match for available package: %s') % pkg self.logger.critical(msg) warned_nas.add(na) continue if pkg.verEQ(lipkg): continue if pkg.verGE(lipkg): if na not in warned_nas: msg = _('Only Upgrade available on package: %s') % pkg self.logger.critical(msg) warned_nas.add(na) continue warned_nas.add(na) if (lipkg.pkgtup in downgrade_apkgs and pkg.verLE(downgrade_apkgs[lipkg.pkgtup])): continue # Skip older than "latest downgrade" downgrade_apkgs[lipkg.pkgtup] = pkg tx_return = [] for ipkg in ipkgs: if ipkg.pkgtup not in downgrade_apkgs: continue txmbrs = self.tsInfo.addDowngrade(downgrade_apkgs[ipkg.pkgtup],ipkg) if not txmbrs: # Fail? continue self._add_prob_flags(rpm.RPMPROB_FILTER_OLDPACKAGE) tx_return.extend(txmbrs) return tx_return @staticmethod def _ui_nevra_dict(nevra_dict): n = nevra_dict['name'] e = nevra_dict['epoch'] v = nevra_dict['version'] r = nevra_dict['release'] a = nevra_dict['arch'] if e and v and r: evr = '%s:%s-%s' % (e, v, r) elif v and r: evr = '%s-%s' % (v, r) elif e and v: evr = '%s:%s' % (e, v) elif v: # e and r etc. is just too weird to print evr = v else: evr = '' if n and evr: return '%s-%s' % (n, evr) if evr: return '*-%s' % evr if n: return n return '' def _nevra_kwarg_parse(self, kwargs): returndict = {} if 'pkgtup' in kwargs: (n, a, e, v, r) = kwargs['pkgtup'] returndict['name'] = n returndict['epoch'] = e returndict['arch'] = a returndict['version'] = v returndict['release'] = r return returndict returndict['name'] = kwargs.get('name') returndict['epoch'] = kwargs.get('epoch') returndict['arch'] = kwargs.get('arch') # get them as ver, version and rel, release - if someone # specifies one of each then that's kinda silly. returndict['version'] = kwargs.get('version') if returndict['version'] is None: returndict['version'] = kwargs.get('ver') returndict['release'] = kwargs.get('release') if returndict['release'] is None: returndict['release'] = kwargs.get('rel') return returndict def history_redo(self, transaction, force_reinstall=False, force_changed_removal=False): """Repeat the transaction represented by the given :class:`yum.history.YumHistoryTransaction` object. :param transaction: a :class:`yum.history.YumHistoryTransaction` object representing the transaction to be repeated :param force_reinstall: bool - do we want to reinstall anything that was installed/updated/downgraded/etc. :param force_changed_removal: bool - do we want to force remove anything that was downgraded or upgraded. :return: whether the transaction was repeated successfully """ # NOTE: This is somewhat basic atm. ... see comment in undo. # Also note that redo doesn't force install Dep-Install packages, # which is probably what is wanted the majority of the time. old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False done = False for pkg in transaction.trans_data: if pkg.state == 'Reinstall': if self.reinstall(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: if pkg.state == 'Downgrade': if force_reinstall and self.rpmdb.searchPkgTuple(pkg.pkgtup): if self.reinstall(pkgtup=pkg.pkgtup): done = True continue try: if self.downgrade(pkgtup=pkg.pkgtup): done = True except yum.Errors.DowngradeError: self.logger.critical(_('Failed to downgrade: %s'), pkg) for pkg in transaction.trans_data: if force_changed_removal and pkg.state == 'Downgraded': if self.tsInfo.getMembers(pkg.pkgtup): continue if self.remove(pkgtup=pkg.pkgtup, silence_warnings=True): done = True for pkg in transaction.trans_data: if pkg.state == 'Update': if force_reinstall and self.rpmdb.searchPkgTuple(pkg.pkgtup): if self.reinstall(pkgtup=pkg.pkgtup): done = True continue if self.update(pkgtup=pkg.pkgtup): done = True else: self.logger.critical(_('Failed to upgrade: %s'), pkg) for pkg in transaction.trans_data: if force_changed_removal and pkg.state == 'Updated': if self.tsInfo.getMembers(pkg.pkgtup): continue if self.remove(pkgtup=pkg.pkgtup, silence_warnings=True): done = True for pkg in transaction.trans_data: if pkg.state in ('Install', 'True-Install', 'Obsoleting'): if force_reinstall and self.rpmdb.searchPkgTuple(pkg.pkgtup): if self.reinstall(pkgtup=pkg.pkgtup): done = True continue if self.install(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: if pkg.state == 'Erase': if self.remove(pkgtup=pkg.pkgtup): done = True self.conf.obsoletes = old_conf_obs return done def history_undo(self, transaction): """Undo the transaction represented by the given :class:`yum.history.YumHistoryTransaction` object. :param transaction: a :class:`yum.history.YumHistoryTransaction` object representing the transaction to be undone :return: whether the transaction was undone successfully """ # NOTE: This is somewhat basic atm. ... for instance we don't check # that we are going from the old new version. However it's still # better than the RHN rollback code, and people pay for that :). # We turn obsoletes off because we want the specific versions of stuff # from history ... even if they've been obsoleted since then. old_conf_obs = self.conf.obsoletes self.conf.obsoletes = False done = False for pkg in transaction.trans_data: if pkg.state == 'Reinstall': if self.reinstall(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: if pkg.state == 'Updated': try: if self.downgrade(pkgtup=pkg.pkgtup): done = True except yum.Errors.DowngradeError: self.logger.critical(_('Failed to downgrade: %s'), pkg) for pkg in transaction.trans_data: if pkg.state == 'Downgraded': if self.update(pkgtup=pkg.pkgtup): done = True else: self.logger.critical(_('Failed to upgrade: %s'), pkg) for pkg in transaction.trans_data: if pkg.state == 'Obsoleting': # Note that obsoleting can mean anything, so if this is part of # something else, it should be done by now (so do nothing). if self.tsInfo.getMembers(pkg.pkgtup): continue # If not it should be an install/obsolete ... so remove it. if self.remove(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: if pkg.state in ('Dep-Install', 'Install', 'True-Install'): if self.remove(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: if pkg.state == 'Obsoleted': if self.install(pkgtup=pkg.pkgtup): done = True for pkg in transaction.trans_data: if pkg.state == 'Erase': if self.install(pkgtup=pkg.pkgtup): done = True self.conf.obsoletes = old_conf_obs return done def redirect_failure_callback(self, data): """Failure callback for urlgrabber to force a retry if we time out (code 12) or error out (code 14) after being redirected (since these codes are not in opts.retrycodes). This allows for failovers if the URL points to a MirrorManager2 (such as download.fedoraproject.org). If the mirror it redirects to is down for some reason, this will ensure that we try again, hopefully getting a mirror that works. """ e = data.exception url_initial = data.url url_actual = e.url if (e.errno not in (12, 14) or url_initial == url_actual): # Not a timeout/HTTPError, or there was no redirect, so leave it up # to urlgrabber return if e.errno == 12: msg = _('Timeout on %s, trying again') % url_actual else: msg = _('Could not retrieve %s: %s, trying again') % (url_actual, e) # Force a retry by hacking the errno so that it falls within retrycodes e.errno = -1 self.logger.error(msg) def _retrievePublicKey(self, keyurl, repo=None, getSig=True): """ Retrieve a key file @param keyurl: url to the key to retrieve Returns a list of dicts with all the keyinfo """ key_installed = False cb = self.redirect_failure_callback msg = _('Retrieving key from %s') % keyurl self.verbose_logger.log(logginglevels.INFO_2, msg) # Go get the GPG key from the given URL try: url = misc.to_utf8(keyurl) if repo is None: opts = {'limit':9999} text = 'global/gpgkey' else: # If we have a repo. use the proxy etc. configuration for it. # In theory we have a global proxy config. too, but meh... # external callers should just update. opts = repo._default_grabopts() text = repo.id + '/gpgkey' rawkey = urlgrabber.urlread(url, failure_callback=cb, **opts) except urlgrabber.grabber.URLGrabError, e: raise Errors.YumBaseError(_('GPG key retrieval failed: ') + exception2msg(e)) # check for a .asc file accompanying it - that's our gpg sig on the key # suck it down and do the check sigfile = None valid_sig = False if getSig and repo and repo.gpgcakey: self.getCAKeyForRepo(repo, callback=repo.confirm_func) try: url = misc.to_utf8(keyurl + '.asc') opts = repo._default_grabopts() text = repo.id + '/gpgkeysig' sigfile = urlgrabber.urlopen(url, failure_callback=cb, **opts) except urlgrabber.grabber.URLGrabError, e: sigfile = None if sigfile: if not misc.valid_detached_sig(sigfile, StringIO.StringIO(rawkey), repo.gpgcadir): #if we decide we want to check, even though the sig failed # here is where we would do that raise Errors.YumBaseError(_('GPG key signature on key %s does not match CA Key for repo: %s') % (url, repo.id)) else: msg = _('GPG key signature verified against CA Key(s)') self.verbose_logger.log(logginglevels.INFO_2, msg) valid_sig = True # Parse the key try: keys_info = misc.getgpgkeyinfo(rawkey, multiple=True) except ValueError, e: raise Errors.YumBaseError(_('Invalid GPG Key from %s: %s') % (url, exception2msg(e))) keys = [] for keyinfo in keys_info: thiskey = {} for info in ('keyid', 'timestamp', 'userid', 'fingerprint', 'raw_key'): if info not in keyinfo: raise Errors.YumBaseError, \ _('GPG key parsing failed: key does not have value %s') + info thiskey[info] = keyinfo[info] thiskey['hexkeyid'] = misc.keyIdToRPMVer(keyinfo['keyid']).upper() thiskey['valid_sig'] = valid_sig thiskey['has_sig'] = bool(sigfile) keys.append(thiskey) return keys def _getKeyImportMessage(self, info, keyurl, keytype='GPG'): msg = None if keyurl.startswith("file:"): fname = keyurl[len("file:"):] pkgs = self.rpmdb.searchFiles(fname) if pkgs: pkgs = sorted(pkgs)[-1] msg = (_('Importing %s key 0x%s:\n' ' Userid : "%s"\n' ' Fingerprint: %s\n' ' Package : %s (%s)\n' ' From : %s') % (keytype, info['hexkeyid'], to_unicode(info['userid']), misc.gpgkey_fingerprint_ascii(info), pkgs, pkgs.ui_from_repo, keyurl.replace("file://",""))) if msg is None: msg = (_('Importing %s key 0x%s:\n' ' Userid : "%s"\n' ' Fingerprint: %s\n' ' From : %s') % (keytype, info['hexkeyid'], to_unicode(info['userid']), misc.gpgkey_fingerprint_ascii(info), keyurl.replace("file://",""))) self.logger.critical("%s", msg) def getKeyForPackage(self, po, askcb = None, fullaskcb = None): """Retrieve a key for a package. If needed, use the given callback to prompt whether the key should be imported. :param po: the package object to retrieve the key of :param askcb: Callback function to use to ask permission to import a key. The arguments *askck* should take are the package object, the userid of the key, and the keyid :param fullaskcb: Callback function to use to ask permission to import a key. This differs from *askcb* in that it gets passed a dictionary so that we can expand the values passed. :raises: :class:`yum.Errors.YumBaseError` if there are errors retrieving the keys """ repo = self.repos.getRepo(po.repoid) keyurls = repo.gpgkey key_installed = False def _prov_key_data(msg): msg += _('\n\n\n' ' Failing package is: %s\n' ' GPG Keys are configured as: %s\n' ) % (po, ", ".join(repo.gpgkey)) return msg user_cb_fail = False for keyurl in keyurls: keys = self._retrievePublicKey(keyurl, repo) for info in keys: ts = self.rpmdb.readOnlyTS() # Check if key is already installed if misc.keyInstalled(ts, info['keyid'], info['timestamp']) >= 0: self.logger.info(_('GPG key at %s (0x%s) is already installed') % ( keyurl, info['hexkeyid'])) continue if repo.gpgcakey and info['has_sig'] and info['valid_sig']: key_installed = True else: # Try installing/updating GPG key self._getKeyImportMessage(info, keyurl) rc = False if self.conf.assumeno: rc = False elif self.conf.assumeyes: rc = True # grab the .sig/.asc for the keyurl, if it exists # if it does check the signature on the key # if it is signed by one of our ca-keys for this repo or the global one # then rc = True # else ask as normal. elif fullaskcb: rc = fullaskcb({"po": po, "userid": info['userid'], "hexkeyid": info['hexkeyid'], "keyurl": keyurl, "fingerprint": info['fingerprint'], "timestamp": info['timestamp']}) elif askcb: rc = askcb(po, info['userid'], info['hexkeyid']) if not rc: user_cb_fail = True continue # Import the key ts = self.rpmdb.readOnlyTS() result = ts.pgpImportPubkey(misc.procgpgkey(info['raw_key'])) if result != 0: msg = _('Key import failed (code %d)') % result raise Errors.YumBaseError, _prov_key_data(msg) self.logger.info(_('Key imported successfully')) key_installed = True if not key_installed and user_cb_fail: raise Errors.YumBaseError, _("Didn't install any keys") if not key_installed: msg = _('The GPG keys listed for the "%s" repository are ' \ 'already installed but they are not correct for this ' \ 'package.\n' \ 'Check that the correct key URLs are configured for ' \ 'this repository.') % repo.name raise Errors.YumBaseError, _prov_key_data(msg) # Check if the newly installed keys helped result, errmsg = self.sigCheckPkg(po) if result != 0: msg = _("Import of key(s) didn't help, wrong key(s)?") self.logger.info(msg) errmsg = to_unicode(errmsg) raise Errors.YumBaseError, _prov_key_data(errmsg) def _getAnyKeyForRepo(self, repo, destdir, keyurl_list, is_cakey=False, callback=None): """ Retrieve a key for a repository If needed, prompt for if the key should be imported using callback @param repo: Repository object to retrieve the key of. @param destdir: destination of the gpg pub ring @param keyurl_list: list of urls for gpg keys @param is_cakey: bool - are we pulling in a ca key or not @param callback: Callback function to use for asking for permission to import a key. This is verification, but also "choice". Takes a dictionary of key info. """ key_installed = False def _prov_key_data(msg): cakeytxt = _("No") if is_cakey: cakeytxt = _("Yes") msg += _('\n\n\n' ' CA Key: %s\n' ' Failing repo is: %s\n' ' GPG Keys are configured as: %s\n' ) % (cakeytxt, repo, ", ".join(keyurl_list)) return msg user_cb_fail = False for keyurl in keyurl_list: keys = self._retrievePublicKey(keyurl, repo, getSig=not is_cakey) for info in keys: # Check if key is already installed if hex(int(info['keyid']))[2:-1].upper() in misc.return_keyids_from_pubring(destdir): self.logger.info(_('GPG key at %s (0x%s) is already imported') % ( keyurl, info['hexkeyid'])) key_installed = True continue # Try installing/updating GPG key if is_cakey: # know where the 'imported_cakeys' file is ikf = repo.base_persistdir + '/imported_cakeys' keytype = 'CA' cakeys = [] try: cakeys_d = open(ikf, 'r').read() cakeys = cakeys_d.split('\n') except (IOError, OSError): pass if str(info['hexkeyid']) in cakeys: key_installed = True else: keytype = 'GPG' if repo.gpgcakey and info['has_sig'] and info['valid_sig']: key_installed = True if not key_installed: self._getKeyImportMessage(info, keyurl, keytype) rc = False if self.conf.assumeno: rc = False elif self.conf.assumeyes: rc = True elif callback: rc = callback({"repo": repo, "userid": info['userid'], "hexkeyid": info['hexkeyid'], "keyurl": keyurl, "fingerprint": info['fingerprint'], "timestamp": info['timestamp']}) if not rc: user_cb_fail = True continue # Import the key result = misc.import_key_to_pubring(info['raw_key'], info['hexkeyid'], gpgdir=destdir) if not result: msg = _('Key %s import failed') % info['hexkeyid'] raise Errors.YumBaseError, _prov_key_data(msg) self.logger.info(_('Key imported successfully')) key_installed = True # write out the key id to imported_cakeys in the repos basedir if is_cakey and key_installed: if info['hexkeyid'] not in cakeys: ikfo = open(ikf, 'a') try: ikfo.write(info['hexkeyid']+'\n') ikfo.flush() ikfo.close() except (IOError, OSError): # maybe a warning - but in general this is not-critical, just annoying to the user pass if not key_installed and user_cb_fail: msg = _("Didn't install any keys for repo %s") % repo raise Errors.YumBaseError, _prov_key_data(msg) if not key_installed: msg = \ _('The GPG keys listed for the "%s" repository are ' \ 'already installed but they are not correct.\n' \ 'Check that the correct key URLs are configured for ' \ 'this repository.') % (repo.name) raise Errors.YumBaseError, _prov_key_data(msg) def getKeyForRepo(self, repo, callback=None): """Retrieve a key for a repository. If needed, use the given callback to prompt whether the key should be imported. :param repo: repository object to retrieve the key of :param callback: callback function to use for asking for verification of key information """ self._getAnyKeyForRepo(repo, repo.gpgdir, repo.gpgkey, is_cakey=False, callback=callback) def getCAKeyForRepo(self, repo, callback=None): """Retrieve a key for a repository. If needed, use the given callback to prompt whether the key should be imported. :param repo: repository object to retrieve the key of :param callback: callback function to use for asking for verification of key information """ self._getAnyKeyForRepo(repo, repo.gpgcadir, repo.gpgcakey, is_cakey=True, callback=callback) def _limit_installonly_pkgs(self): """ Limit packages based on conf.installonly_limit, if any of the packages being installed have a provide in conf.installonlypkgs. New in 3.2.24: Obey yumdb_info.installonly data. """ def _sort_and_filter_installonly(pkgs): """ Allow the admin to specify some overrides for installonly pkgs. using the yumdb. """ ret_beg = [] ret_mid = [] ret_end = [] for pkg in sorted(pkgs): if 'installonly' not in pkg.yumdb_info: ret_mid.append(pkg) continue if pkg.yumdb_info.installonly == 'keep': continue if True: # Don't to magic sorting, yet ret_mid.append(pkg) continue if pkg.yumdb_info.installonly == 'remove-first': ret_beg.append(pkg) elif pkg.yumdb_info.installonly == 'remove-last': ret_end.append(pkg) else: ret_mid.append(pkg) return ret_beg + ret_mid + ret_end if self.conf.installonly_limit < 1 : return # We shouldn't alter the transaction if this is set... if self.tsInfo._check_future_rpmdbv: return toremove = [] # We "probably" want to use either self.ts or self.rpmdb.ts if either # is available. However each ts takes a ref. on signals generally, and # SIGINT specifically, so we _must_ have got rid of all of the used tses # before we try downloading. This is called from buildTransaction() # so self.rpmdb.ts should be valid. ts = self.rpmdb.readOnlyTS() (cur_kernel_v, cur_kernel_r) = misc.get_running_kernel_version_release(ts) found = {} for m in self.tsInfo.getMembers(): if m.ts_state not in ('i', 'u'): continue if m.reinstall: continue if not self.allowedMultipleInstalls(m.po): continue if m.name not in found: found[m.name] = [m.po] else: found[m.name].append(m.po) for name in found: installed = self.rpmdb.searchNevra(name=name) installed = _sort_and_filter_installonly(installed) total = len(installed) + len(found[name]) if total <= self.conf.installonly_limit: continue # Not adding enough to trigger. # Number left to try and remove... numleft = total - self.conf.installonly_limit for po in installed: if (po.version, po.release) == (cur_kernel_v, cur_kernel_r): # don't remove running continue if numleft == 0: break toremove.append((po, found[name])) numleft -= 1 for po, newpos in toremove: txmbr = self.tsInfo.addErase(po) # Add a dep relation to the new version of the package that causes # this one to be erased. This way skipbroken should drop the old # one from the transaction if the new one is skipped. Note that we # can only do this for one new version, as skipbroken won't drop # deps that are shared with some other packages. For consistency, # let's give up completely if we are installing multiple new # versions (which is rather uncommon anyway). if len(newpos) == 1: txmbr.depends_on.append(newpos[0]) def processTransaction(self, callback=None,rpmTestDisplay=None, rpmDisplay=None): """Process the current transaction. This involves the following steps: - Download the packages - Check the GPG signatures of the packages - Run the test RPM transaction - Run the RPM Transaction The *callback*.event method is called at the start, and between each step. :param callback: a callback object, which must have an event method :param rpmTestDisplay: name of the display class to use in the RPM test transaction :param rpmDisplay: name of the display class to use in the rpm transaction """ if not callback: callback = callbacks.ProcessTransNoOutputCallback() # Download Packages callback.event(callbacks.PT_DOWNLOAD) pkgs = self._downloadPackages(callback) # Check Package Signatures if pkgs != None: callback.event(callbacks.PT_GPGCHECK) self._checkSignatures(pkgs,callback) # Run Test Transaction callback.event(callbacks.PT_TEST_TRANS) self._doTestTransaction(callback,display=rpmTestDisplay) # Run Transaction callback.event(callbacks.PT_TRANSACTION) self._doTransaction(callback,display=rpmDisplay) def _downloadPackages(self,callback): ''' Download the need packages in the Transaction ''' # This can be overloaded by a subclass. dlpkgs = map(lambda x: x.po, filter(lambda txmbr: txmbr.ts_state in ("i", "u"), self.tsInfo.getMembers())) # Check if there is something to do if len(dlpkgs) == 0: return None # make callback with packages to download callback.event(callbacks.PT_DOWNLOAD_PKGS,dlpkgs) try: probs = self.downloadPkgs(dlpkgs) except IndexError: raise Errors.YumBaseError, [_("Unable to find a suitable mirror.")] if len(probs) > 0: errstr = [_("Errors were encountered while downloading packages.")] for key in probs: errors = misc.unique(probs[key]) for error in errors: errstr.append("%s: %s" % (key, error)) raise Errors.YumDownloadError, errstr return dlpkgs def _checkSignatures(self,pkgs,callback): ''' The the signatures of the downloaded packages ''' # This can be overloaded by a subclass. for po in pkgs: result, errmsg = self.sigCheckPkg(po) if result == 0: # Verified ok, or verify not req'd continue elif result == 1: self.getKeyForPackage(po, self._askForGPGKeyImport) else: raise Errors.YumGPGCheckError, errmsg return 0 def _askForGPGKeyImport(self, po, userid, hexkeyid): ''' Ask for GPGKeyImport This need to be overloaded in a subclass to make GPG Key import work ''' return False def _doTestTransaction(self,callback,display=None): ''' Do the RPM test transaction ''' self.initActionTs() # save our dsCallback out dscb = self.dsCallback self.dsCallback = None # dumb, dumb dumb dumb! self.populateTs( keepold=0 ) # sigh # This can be overloaded by a subclass. self.verbose_logger.log(logginglevels.INFO_2, _('Running Transaction Check')) msgs = self._run_rpm_check() if msgs: rpmlib_only = True for msg in msgs: if msg.startswith('rpmlib('): continue rpmlib_only = False if rpmlib_only: retmsgs = [_("ERROR You need to update rpm to handle:")] retmsgs.extend(msgs) raise Errors.YumRPMCheckError, retmsgs retmsgs = [_('ERROR with transaction check vs depsolve:')] retmsgs.extend(msgs) # Don't encourage users to file a bug here, as this is probably # pre-existing issue in dependendies of installed packages raise Errors.YumRPMCheckError,retmsgs tsConf = {} for feature in ['diskspacecheck']: # more to come, I'm sure tsConf[feature] = getattr( self.conf, feature ) # testcb = RPMTransaction(self, test=True) # overwrite the default display class if display: testcb.display = display tserrors = self.ts.test( testcb, conf=tsConf ) del testcb if len( tserrors ) > 0: errstring = _('Test Transaction Errors: ') for descr in tserrors: errstring += ' %s\n' % descr raise Errors.YumTestTransactionError, errstring del self.ts # put back our depcheck callback self.dsCallback = dscb def _doTransaction(self,callback,display=None): ''' do the RPM Transaction ''' # This can be overloaded by a subclass. self.initActionTs() # make a new, blank ts to populate self.populateTs( keepold=0 ) # populate the ts self.ts.check() # required for ordering self.ts.order() # order cb = RPMTransaction(self,display=SimpleCliCallBack) # overwrite the default display class if display: cb.display = display self.runTransaction( cb=cb ) def _run_rpm_check(self): results = [] self.ts.check() for prob in self.ts.problems(): # Newer rpm (4.8.0+) has problem objects, older have just strings. # Should probably move to using the new objects, when we can. For # now just be compatible. msg = to_str(prob) # RPM currently complains about self-conflicts on reinstalls, even # though they are allowed otherwise, so just ignore them. # Unfortunately, we have to parse the problem string in order to # get the provide name (which should be the first token). if prob.type == rpm.RPMPROB_CONFLICT: tokens = msg.split() pkgs = self.rpmdb.returnPackages(patterns=[prob.pkgNEVR]) if tokens and pkgs: name = tokens[0] pkg = pkgs[0] provs = self.rpmdb.getProvides(name).keys() if len(provs) == 1 and provs[0] == pkg: continue results.append(msg) return results def add_enable_repo(self, repoid, baseurls=[], mirrorlist=None, **kwargs): """Add and enable a repository. :param repoid: a string specifying the name of the repository :param baseurls: a list of strings specifying the urls for the repository. At least one base url, or one mirror, must be given :param mirrorlist: a list of strings specifying a list of mirrors for the repository. At least one base url, or one mirror must be given :param kwargs: key word arguments to set any normal repository attribute :return: the new repository that has been added and enabled """ # out of place fixme - maybe we should make this the default repo addition # routine and use it from getReposFromConfigFile(), etc. newrepo = yumRepo.YumRepository(repoid) newrepo.name = repoid newrepo.basecachedir = self.conf.cachedir var_convert = kwargs.get('variable_convert', True) if baseurls: replaced = [] if var_convert: for baseurl in baseurls: if baseurl: replaced.append(varReplace(baseurl, self.conf.yumvar)) else: replaced = baseurls newrepo.baseurl = replaced if mirrorlist: if var_convert: mirrorlist = varReplace(mirrorlist, self.conf.yumvar) newrepo.mirrorlist = mirrorlist # setup the repo newrepo.setup(cache=self.conf.cache) # some reasonable defaults, (imo) newrepo.enablegroups = True newrepo.metadata_expire = 0 newrepo.gpgcheck = self.conf.gpgcheck newrepo.repo_gpgcheck = self.conf.repo_gpgcheck newrepo.basecachedir = self.conf.cachedir newrepo.base_persistdir = self.conf._repos_persistdir for key in kwargs.keys(): if not hasattr(newrepo, key): continue # skip the ones which aren't vars setattr(newrepo, key, kwargs[key]) # add the new repo self.repos.add(newrepo) # enable the main repo self.repos.enableRepo(newrepo.id) return newrepo def setCacheDir(self, force=False, tmpdir=None, reuse=True, suffix='/$basearch/$releasever'): """Set a new cache directory. :param force: whether to force the cache directory to be changed :param tmpdir: a temporary directory :param reuse: whether the temporary directory can be reused :param suffix: suffix to attach to the directory name :return: whether the new cache directory is successfully set """ if not force and os.geteuid() == 0: return True # We are root, not forced, so happy with the global dir. if tmpdir is None: tmpdir = os.getenv('TMPDIR') if tmpdir is None: # Note that TMPDIR isn't exported by default :( tmpdir = '/var/tmp' try: cachedir = misc.getCacheDir(tmpdir, reuse) except (IOError, OSError), e: self.logger.critical(_('Could not set cachedir: %s') % exception2msg(e)) cachedir = None if cachedir is None: return False # Tried, but failed, to get a "user" cachedir cachedir += varReplace(suffix, self.conf.yumvar) if hasattr(self, 'prerepoconf'): self.prerepoconf.cachedir = cachedir else: self.repos.setCacheDir(cachedir) if not hasattr(self, '_old_cachedir'): self._old_cachedir = self.conf.cachedir self.conf.cachedir = cachedir return True # We got a new cache dir def _does_this_update(self, pkg1, pkg2): """returns True if pkg1 can update pkg2, False if not. This only checks if it can be an update it does not check if it is obsoleting or anything else.""" if pkg1.name != pkg2.name: return False if pkg1.verLE(pkg2): return False if pkg1.arch not in self.arch.archlist: return False if rpmUtils.arch.canCoinstall(pkg1.arch, pkg2.arch): return False if self.allowedMultipleInstalls(pkg1): return False return True def _store_config_in_history(self): self.history.write_addon_data('config-main', self.conf.dump()) myrepos = '' for repo in self.repos.listEnabled(): myrepos += repo.dump() myrepos += '\n' self.history.write_addon_data('config-repos', myrepos) def verify_plugins_cb(self, verify_package): """Callback to call a plugin hook for pkg.verify(). :param verify_package: a conduit for the callback :return: *verify_package* """ self.plugins.run('verify_package', verify_package=verify_package) return verify_package def save_ts(self, filename=None, auto=False): """Save out a transaction to a .yumtx file to be loaded later. :param filename: the name of the file to save the transaction in. If *filename* is not given, a name will be generated :param auto: whether to output errors to the logger, rather than raising exceptions :raises: :class:`yum.Errors.YumBaseError` if there are errors saving the transaction """ if self.tsInfo._unresolvedMembers: if auto: self.logger.critical(_("Dependencies not solved. Will not save unresolved transaction.")) return raise Errors.YumBaseError(_("Dependencies not solved. Will not save unresolved transaction.")) if not filename: prefix = 'yum_save_tx.%s' % time.strftime('%Y-%m-%d.%H-%M.') fd,filename = tempfile.mkstemp(suffix='.yumtx', prefix=prefix) f = os.fdopen(fd, 'w') else: f = open(filename, 'w') self._ts_save_file = filename msg = ["%s\n" % self.rpmdb.simpleVersion(main_only=True)[0], "%s\n" % self.ts.getTsFlags()] if self.tsInfo._pkgSack is None: # Transactions have pkgSack? msg += ["1\n"] else: msg += ["%s\n" % (len(self.repos.listEnabled()) + 1)] for r in self.repos.listEnabled(): msg += ["%s:%s:%s\n" % (r.id, len(r.sack), r.repoXML.revision)] # Save what we think the future rpmdbv will be. msg += ["%s:%s\n" % ('installed', self.tsInfo.futureRpmDBVersion())] msg += ["%s\n" % len(self.tsInfo.getMembers())] for txmbr in self.tsInfo.getMembers(): msg += [txmbr._dump()] try: f.write(''.join(msg)) f.close() except (IOError, OSError), e: self._ts_save_file = None if auto: self.logger.critical(_("Could not save transaction file %s: %s") % (filename, exception2msg(e))) else: raise Errors.YumBaseError(_("Could not save transaction file %s: %s") % (filename, exception2msg(e))) def _load_ts_data(self, filename): """ Load the file into a simple data format. """ try: data = open(filename, 'r').readlines() except (IOError, OSError), e: return (exception2msg(e), None) if not data: return (_("File is empty."), None) if data[0] == 'saved_tx:\n': # Old versions of yum would put "saved_tx:" at the beginning and # two blank lines at the end when you used: # "yum -q history addon-info saved_tx". if data[-1] == 'history addon-info\n': # Might as well also DTRT if they hand removed the plugins line data = data[1:-3] else: data = data[1:-2] return (None, data) def load_ts(self, filename, ignorerpm=None, ignoremissing=None, ignorenewrpm=None): """Load a transaction from a .yumtx file. :param filename: the name of the file to load the transaction from :param ignorerpm: whether to ignore starting rpmdb version mismatch. :param ignoremissing: whether to ignore that there may be transaction members missing :param ignorenewrpm: whether to ignore ending rpmdb version mismatch. :return: the members of the loaded transaction :raises: :class:`yum.Errors.YumBaseError` if there are problems loading the transaction """ # check rpmversion - if not match throw a fit # check repoversions (and repos)- if not match throw a fit # load each txmbr - if pkgs being updated don't exist, bail w/error # setup any ts flags # setup cmds for history/yumdb to know about # return txmbrs loaded data = self._load_ts_data(filename) if data[0] is not None: raise Errors.YumBaseError(_("Could not access/read saved transaction %s : %s") % (filename, data[0])) data = data[1] if ignorerpm is None: ignorerpm = self.conf.loadts_ignorerpm if ignorenewrpm is None: ignorenewrpm = self.conf.loadts_ignorenewrpm if ignoremissing is None: ignoremissing = self.conf.loadts_ignoremissing # Inherit this, because for the ending version to match the starting # version must match. if ignorerpm: ignorenewrpm = True # data format # 0 == rpmdb version # 1 == tsflags # 2 == numrepos # 3:numrepos = repos # -- post 3.2.29 update: 'installed' repo. added with the values as the # new rpmdb version. # 3+numrepos = num pkgs # 3+numrepos+1 -> EOF= txmembers # rpm db ver rpmv = data[0].strip() if rpmv != str(self.rpmdb.simpleVersion(main_only=True)[0]): msg = _("rpmdb ver mismatched saved transaction version,") if ignorerpm: msg += _(" ignoring, as requested.") self.logger.critical(_(msg)) else: msg += _(" aborting.") raise Errors.YumBaseError(msg) # tsflags # FIXME - probably should let other tsflags play nicely together # so someone can add --nogpgcheck or --nodocs or --nodiskspace or some nonsense and have it work try: tsflags = int(data[1].strip()) except (ValueError, IndexError), e: msg = _("cannot find tsflags or tsflags not integer.") raise Errors.YumBaseError(msg) self.ts.setFlags(tsflags) # repos numrepos = int(data[2].strip()) repos = [] rindex=3+numrepos future_rpmdbv = None for r in data[3:rindex]: repo = r.strip().split(':') if repo and repo[0] == 'installed': # This is an update hack to list the _future_ rpmdb version. # Doing it this way allows older yum's to load newer ts files. future_rpmdbv = "%s:%s" % (repo[1], repo[2]) continue repos.append(repo) # pkgs/txmbrs numpkgs = int(data[rindex].strip()) pkgstart = rindex + 1 pkgcount = 0 pkgprob = False curpkg = None missingany = False for l in data[pkgstart:]: l = l.rstrip() # our main txmbrs if l.startswith('mbr:'): if curpkg: self.tsInfo.add(curpkg) if curpkg in self.tsInfo._unresolvedMembers and not missingany: self.tsInfo._unresolvedMembers.remove(curpkg) missingany = False pkgtup, current_state = l.split(':')[1].strip().split(' ') current_state = int(current_state.strip()) pkgtup = tuple(pkgtup.strip().split(',')) try: if current_state == TS_INSTALL: po = self.getInstalledPackageObject(pkgtup) elif current_state == TS_AVAILABLE: po = self.getPackageObject(pkgtup) else: msg = _("Found txmbr in unknown current state: %s" % current_state) raise Errors.YumBaseError(msg) except Errors.YumBaseError, e: missingany = True msg = _("Could not find txmbr: %s in state %s" % (str(pkgtup), current_state)) if not ignoremissing: raise Errors.YumBaseError(msg) else: ignorenewrpm = True self.logger.critical(msg) else: pkgcount += 1 curpkg = transactioninfo.TransactionMember(po) curpkg.current_state = current_state continue l = l.strip() k,v = l.split(':', 1) v = v.lstrip() # attributes of our txmbrs if k in ('isDep', 'reinstall'): v = v.strip().lower() if v == 'false': setattr(curpkg, k, False) elif v == 'true': setattr(curpkg, k, True) elif k in ('output_state'): setattr(curpkg, k, int(v.strip())) elif k in ('groups'): curpkg.groups.extend(v.split(' ')) # the relationships to our main txmbrs elif k in ('updated_by', 'obsoleted_by', 'downgraded_by', 'downgrades', 'updates', 'obsoletes', 'depends_on'): for pkgspec in v.strip().split(' '): pkgtup, origin = pkgspec.split('@') try: if origin == 'i': po = self.getInstalledPackageObject(tuple(pkgtup.split(','))) else: po = self.getPackageObject(tuple(pkgtup.split(','))) except Errors.YumBaseError, e: msg = _("Could not find txmbr: %s from origin: %s" % (str(pkgtup), origin)) self.logger.critical(msg) missingany = True else: curlist = getattr(curpkg, k) curlist.append(po) setattr(curpkg, k, curlist) elif k in ('relatedto'): for item in v.split(' '): pkgspec, rel = item.split(':') pkgtup,origin = pkgspec.split('@') try: if origin == 'i': po = self.getInstalledPackageObject(tuple(pkgtup.split(','))) else: po = self.getPackageObject(tuple(pkgtup.split(','))) except Errors.YumBaseError, e: msg = _("Could not find txmbr: %s from origin: %s" % (str(pkgtup), origin)) self.logger.critical(msg) missingany = True else: curlist = getattr(curpkg, k) curlist.append((po,rel)) setattr(curpkg, k, curlist) # the plain strings else: #ts_state, reason setattr(curpkg, k, v.strip()) if missingany: pkgprob = True # make sure we get the last one in! self.tsInfo.add(curpkg) if curpkg in self.tsInfo._unresolvedMembers: self.tsInfo._unresolvedMembers.remove(curpkg) if numpkgs != pkgcount: pkgprob = True if pkgprob: msg = _("Transaction members, relations are missing or ts has been modified,") if ignoremissing: ignorenewrpm = True msg += _(" ignoring, as requested. You must redepsolve!") self.logger.critical(msg) else: msg += _(" aborting.") raise Errors.YumBaseError(msg) if len(self.tsInfo) != pkgcount: future_rpmdbv = None if future_rpmdbv is not None: self.tsInfo._check_future_rpmdbv = (pkgcount, future_rpmdbv, ignorenewrpm) return self.tsInfo.getMembers() def _remove_old_deps(self): """take the set of pkgs being removed and remove any pkgs which are: 1. not required anymore 2. marked as a 'dep' in the 'reason' in the yumdb. """ found_leaves = set() checked = set() beingremoved = [ t.po for t in self.tsInfo.getMembersWithState(output_states=TS_REMOVE_STATES) ] # cache previously examined packages okay_to_remove = {} for i in self.rpmdb.returnPackages(): okay_to_remove[i] = True for pkg in beingremoved: # for each package required by the pkg being removed #print 'removal: %s' % pkg.name for required in pkg.required_packages(): #if required in checked: # continue # if we've already checked it, skip it. #checked.add(required) if required.yumdb_info.get('reason', '') != 'dep': # if the required pkg is not a dep, then skip it okay_to_remove[required] = False continue if required in beingremoved: continue if self._has_needed_revdeps(required, beingremoved, okay_to_remove): continue still_needed = False for requiring in required.requiring_packages(): # so we have required deps - look at all the pkgs which require them if requiring == required: # if they are self-requiring skip them continue #for tbi_pkg in self.tsInfo.getMembersWithState(output_states=TS_INSTALL_STATES): # for reqtuple in tbi_pkg.po.requires: # if required.provides_for(reqtuple): # still_needed = True # break if not still_needed: print '---> Marking %s to be removed - no longer needed by %s' % (required.name, pkg.name) txmbrs = self.remove(po=required) for txmbr in txmbrs: txmbr.setAsDep(po=pkg) if txmbr.po not in beingremoved: beingremoved.append(txmbr.po) found_leaves.add(txmbr) self.verbose_logger.log(logginglevels.INFO_2, "Found and removing %s unneeded dependencies" % len(found_leaves)) # Checks if pkg has any reverse deps which cannot be removed. # Currently this only checks the install reason for each revdep, # but we may want to check for other reasons that would # prevent the revdep from being removed (e.g. protected) def _has_needed_revdeps(self, pkg, beingremoved, ok_to_remove): # check if we've already found this package to have user-installed deps if not ok_to_remove[pkg]: # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has been visited already and cannot be removed."), pkg) return True # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("Examining revdeps of %s"), pkg) # track which pkgs we have visited already visited = {} for po in self.rpmdb.returnPackages(): visited[po] = False # no need to consider packages that are already being removed for po in beingremoved: visited[po] = True stack = [] stack.append(pkg) # depth-first search while stack: curpkg = stack[-1] if not visited[curpkg]: if not ok_to_remove[curpkg]: # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has been visited already and cannot be removed."), pkg) ok_to_remove[pkg] = False return True if curpkg.yumdb_info.get('reason', '') != 'dep': # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has revdep %s which was user-installed."), pkg, curpkg) ok_to_remove[pkg] = False ok_to_remove[curpkg] = False return True # Go through the stuff in the ts to be installed - make sure # none of that needs the required pkg, either. for (provn,provf,provevr) in curpkg.provides: if self.tsInfo.getNewRequires(provn, provf, provevr).keys(): ok_to_remove[pkg] = False ok_to_remove[curpkg] = False self.verbose_logger.log(logginglevels.DEBUG_2, _("%s is needed by a package to be installed."), curpkg) return True for fn in curpkg.filelist + curpkg.dirlist: if self.tsInfo.getNewRequires(fn, None,(None,None,None)).keys(): ok_to_remove[pkg] = False ok_to_remove[curpkg] = False self.verbose_logger.log(logginglevels.DEBUG_2, _("%s is needed by a package to be installed."), curpkg) return True visited[curpkg] = True all_leaves_visited = True leaves = curpkg.requiring_packages() for leaf in leaves: if not visited[leaf]: stack.append(leaf) all_leaves_visited = False break if all_leaves_visited: stack.pop() # Debugging output self.verbose_logger.log(logginglevels.DEBUG_2, _("%s has no user-installed revdeps."), pkg) return False PK[=qAqA site-packages/yum/updateinfo.pycnu[ v_c@s]ddlZddlZddlmZmZddlTddlmZddl Z ddl Z ddl Z d"Z d Zd Zd Zd ZdZdZdZdZdZddZdZdZdZdZdZdZdZdZ dZ!dZ"ddZ#ddZ$dd Z%gd!Z&dS(#iN(t_tP_(t*(tINFO_1tsecuritytbugfixt enhancementt recommendedt newpackagecCs=tjj|d|d|df|d|d|dfS(s- Compare two "std." tuples, (n, a, e, v, r). iii(trpmUtilst miscutilst compareEVR(ttup1ttup2((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_rpm_tup_vercmps!cCs|s gS|S(sj Sometimes refs == None, if so return the empty list here. So we don't have to check everywhere. ((trefs((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_ysp_safe_refsscCsx|D]}tj||r#|Stj|d|r=|S|}|jdp^|jdsnd|}nxbt|dD]P}|ddkrqntj|d|r|Stj|d|r|SqWqWdS(Nt update_idsCVE-Rt referencestid(tfnmatcht startswithRtNone(tsec_cmdstpkgnametnoticetitcveitref((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_match_sec_cmd#s    cCsZxSt|D]E}|d|kr)q n|d|kr?q nt|||d<|SWdS(s# Check if the given ID is a match. ttypeRN(RtTrueR(tused_mapRtref_typetref_idsR((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_has_id6scCst|j||}|r-t|d|s(RVtuptgetUpdatesTuplesRf(Rbtoupdates((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_get_name2oldpkgtupscCst||jjS(s) Get the pkgtups for all installed pkgs. (Rftrpmdbt simplePkgList(Rb((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_get_name2instpkgtupscCsFg|jjD]#}|d|ddddf^q}t||S(sa Get the pkgtups for all installed pkgs. and munge that to be the first possible pkgtup. iit0(RmRnRf(Rbtpttofirst((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_get_name2allpkgtups9cCsFg|jjD]#}|d|ddddf^q}t||S(sa Get the pkgtups for all available pkgs. and munge that to be the first possible pkgtup. iiRp(tpkgSackRnRf(RbRqRr((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_get_name2aallpkgtup s9cCsG|d}x6|j|D]%\}}t||||rtSqWtS(sA Do we want to keep this package to satisfy the security limits. i(tget_applicable_noticesR/RR,(R-Retmd_infoR tnameR((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_ysp_should_keep_pkgs  cCs~t}xq|D]i}y|jjd}Wn q nX|jdtjj|jd}tjj|s t }Pq q W|S(Nt updateinfot/i( RtrepoXMLtgetDatatcachedirtostpathtbasenametlocationtexistsR,(trepostdledtrepotdataR((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_repos_downloaded"s $c Cstj|j}|ddkr&dSt}x|j|D]\}}|s<|ddkrdq<nt}|jj|}|sq<n|d}d}|ddkrd|d}nd|d||d |d |d f} |t d ||t d | Pq<WdS(NiRRtiRps%s:s %s-%s%s-%s.%siiis,Security: %s is an installed security updates-Security: %s is the currently running version( R9tget_running_kernel_pkgtupttsRR,RvRRmtsearchPkgTupleR( tybRwR`t kern_pkgtupt found_secReRtipkgtetrpkg((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt_check_running_kernel2s*  csfd}|dkr*j}nt|}t|rFdSj}d}d}t|}jj}t} tt t g} t} x0|D](} | j | kr| j | j qqWt} x|D]} | j | kr |d7}n| j j}|| kst|| ||| rAqn| j | kr]|d7}n| j | j qW|}t}x|r`t}x|D]} | j | krx| jD]G\}}|| kr|| kr|d7}n| j |t}qqWqxV| jD]K\}}|| kr || kr;|d7}n| j | j t}Pq q WqWqWx*|D]"} | j | krh|| qhqhWt|fd|rjjttd||||fnjjttd||||fS( sJ Remove packages from the transaction, using the updateinfo data. cs@jjttd|j|jjfj|jdS(s) Deletes a package within a transaction. s$ --> %s from %s removed (updateinfo)N(tverbose_loggertlogRRtpot ui_from_repotremoveRe(ttspkg(Rbttsinfo(s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt ysp_del_pkgQs  iicsjjd|S(Ns%s(Rtwarn(Rg(Rb(s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyRhssD%d package(s) needed (+%d related) for security, out of %d availables6No packages needed for security; %d packages availableN(iii(RR<R^R4tupinfoR_ttsInfot getMembersRXtTS_INSTALL_STATEStTS_ERASEt output_statetaddRRlRxRyRR,t relatedtoRaRRRR(RbRJRR-RwttottcntR ttspkgst keep_pkgst count_statest count_pkgsRRdRxtscnttmini_depsolve_againRtreason((RbRs2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt remove_txmbrsLsp                           -csdfd}|d kr*j}nt|}t|rFdSj}t|}ttjddj jddj }j j }t }g} xS|D]K} | j} | |kst||| || r| j| jqqqW| rEx6jddd| d tjD]} || q.Wnttjddj jddj } t|fd | rjjttd | |fnjjttd || |fS(sM Exclude all packages to do with updates, using the updateinfo data. Rzcs@jjttd||j|f|jjj|dS(s7 Deletes a package from all trees that yum knows about s --> %s from %s excluded (%s)N(RRRRtrepoidRtsackt delPackage(tpkgR(Rb(s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyRs  it pkgnarrowtupdatest obsoletest availabletpatternstshowdupscsjjd|S(Ns%s(RR(Rg(Rb(s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyRhss6%d package(s) needed for security, out of %d availables6No packages needed for security; %d packages availableN(ii(RR<R^R4RR_tlenRXtdoPackageListsRRRttreturnPackagesRlRxRytappendRRRaRRRR(RbRJRR-RwR RtpkgsRdt pkgs_to_delRRxtpR((Rbs2/usr/lib/python2.7/site-packages/yum/updateinfo.pytexclude_updatess:           (&c sOdfd}|dkr*j}nt|}t|rFd Sj}t|}jj}t}d}d} xa|D]Y} |d7}| j } | |kst ||| || r|| qn| d7} qWt |fd| r(j j ttd| |fnj j ttd|| |fS( s: Exclude all packages, using the updateinfo data. Rzcs@jjttd||j|f|jjj|dS(s7 Deletes a package from all trees that yum knows about s --> %s from %s excluded (%s)N(RRRRRRRR(RR(Rb(s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyRs  iicsjjd|S(Ns%s(RR(Rg(Rb(s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyRhss6%d package(s) needed for security, out of %d availables6No packages needed for security; %d packages availableN(ii(RR<R^R4RR_RtRRuRxRyRaRRRR( RbRJRR-RwR RRdRRRRx((Rbs2/usr/lib/python2.7/site-packages/yum/updateinfo.pyt exclude_alls2            &c Cs4g}t|j}t|j}t|}td|jj}xt|D]}|jj |}|r|j nx|D]\} } | d} |rt || |  rqn| rt || | | rqn|j |jd| dd| dd| dd| d d | d PqWqXW|S( sMark the specified items to be updated, in the minimal way. :param extcmds: the user specified arguments :return: a list of transaction members added to the transaction set by this function cSs|dS(Ni((Rg((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pyRhsiRxtarchitepochitversionitreleasei(R_R<R^R4RVRiRjtsortedRRvtreverseRR/textendtupdate( RbtextcmdsttxmbrsR R-tndataRkt oldpkgtupRReRRx((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pytupdate_minimals*   #  (ssecuritysbugfixRRR('tos.pathRROtyum.i18nRRt yum.constantstyum.logginglevelsRtrpmUtils.miscutilsR R9RR0RRRR#R/R3R4R=RNRR^R_RaRfRlRoRsRuRyRRRRRR(((s2/usr/lib/python2.7/site-packages/yum/updateinfo.pytsB             5 "          T 4 .PK[!B,,!site-packages/yum/repoMDObject.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2006 Duke University from yum.misc import cElementTree_iterparse as iterparse from yum.misc import _available_compression, stat_f from Errors import RepoMDError import sys import types from misc import AutoFileChecksums, to_xml def ns_cleanup(qn): if qn.find('}') == -1: return qn return qn.split('}')[1] class RepoData: """represents anything beneath a tag""" def __init__(self, elem=None): self.type = None if elem: self.type = elem.attrib.get('type') self.location = (None, None) self.checksum = (None,None) # type,value self.openchecksum = (None,None) # type,value self.timestamp = None self.dbversion = None self.size = None self.opensize = None self.deltas = [] if elem: self.parse(elem) def parse(self, elem): for child in elem: child_name = ns_cleanup(child.tag) if child_name == 'location': relative = child.attrib.get('href') base = child.attrib.get('base') self.location = (base, relative) elif child_name == 'checksum': csum_value = child.text csum_type = child.attrib.get('type') self.checksum = (csum_type,csum_value) elif child_name == 'open-checksum': csum_value = child.text csum_type = child.attrib.get('type') self.openchecksum = (csum_type, csum_value) elif child_name == 'timestamp': self.timestamp = child.text elif child_name == 'database_version': self.dbversion = child.text elif child_name == 'size': self.size = child.text elif child_name == 'open-size': self.opensize = child.text elif child_name == 'delta': delta = RepoData(child) delta.type = self.type self.deltas.append(delta) def dump_xml(self): msg = "" top = """\n""" % to_xml(self.type, attrib=True) msg += top for (data, xmlname) in [('checksum', 'checksum'),('openchecksum', 'open-checksum')]: if hasattr(self, data): val = getattr(self, data) if val[0]: d_xml = """ <%s type="%s">%s\n""" % (xmlname, to_xml(val[0], attrib=True), to_xml(val[1]), xmlname) msg += d_xml if hasattr(self, 'location'): val = getattr(self, 'location') if val[1]: loc = """ \n""" % to_xml(val[1], attrib=True) if val[0]: loc = """ \n""" % ( to_xml(val[0], attrib=True), to_xml(val[1], attrib=True)) msg += loc for (data,xmlname) in [('timestamp', 'timestamp'), ('dbversion', 'database_version'), ('size','size'), ('opensize', 'open-size')]: val = getattr(self, data) if val: d_xml = """ <%s>%s\n""" % (xmlname, to_xml(val), xmlname) msg += d_xml for delta in self.deltas: # change tag to "delta" and increase indent body = '\n '.join(delta.dump_xml().split('\n')[1:-2]) msg += ' \n %s\n \n' % body bottom = """\n""" msg += bottom return msg def getDelta(self, old_timestamp): old_timestamp = int(old_timestamp) for deltamd in self.deltas: if int(deltamd.timestamp) <= old_timestamp: return deltamd class RepoMD: """represents the repomd xml file""" def __init__(self, repoid, srcfile=None): """takes a repoid and a filename for the repomd.xml""" self.timestamp = 0 self.repoid = repoid self.repoData = {} self.checksums = {} self.length = 0 self.revision = None self.tags = {'content' : set(), 'distro' : {}, 'repo': set()} if srcfile: self.parse(srcfile) def parse(self, srcfile): if type(srcfile) in types.StringTypes: # srcfile is a filename string try: infile = open(srcfile, 'rt') except IOError: raise RepoMDError, "Unable to open %s" %(srcfile,) else: # srcfile is a file object infile = srcfile srcfile = None # We trust any of these to mean the repomd.xml is valid. infile = AutoFileChecksums(infile, ['sha256', 'sha512'], ignore_missing=True, ignore_none=True) parser = iterparse(infile) try: for event, elem in parser: elem_name = ns_cleanup(elem.tag) if elem_name == "data": thisdata = RepoData(elem=elem) old = self.repoData.get(thisdata.type) if (old and old.size and old.size < thisdata.size and old.location[1].rsplit('.', 1)[1] in _available_compression and srcfile and stat_f(srcfile.rsplit('/', 1)[0] +'/'+ thisdata.location[1].rsplit('/', 1)[1]) is None): # previous is smaller, can unzip it, and next is not cached thisdata = old self.repoData[thisdata.type] = thisdata try: # NOTE: This will fail on float timestamps, this is # required for compatability. Fix is to not generate # float timestamps in repomd.xml. nts = int(thisdata.timestamp) if nts > self.timestamp: # max() not in old python self.timestamp = nts except: pass elif elem_name == "revision": self.revision = elem.text elif elem_name == "tags": for child in elem: child_name = ns_cleanup(child.tag) if child_name == 'content': self.tags['content'].add(child.text) if child_name == 'distro': cpeid = child.attrib.get('cpeid', '') distro = self.tags['distro'].setdefault(cpeid,set()) distro.add(child.text) self.checksums = infile.checksums.hexdigests() self.length = len(infile.checksums) except SyntaxError, e: raise RepoMDError, "Damaged repomd.xml file" def fileTypes(self): """return list of metadata file types available""" return self.repoData.keys() def getData(self, type): if type in self.repoData: return self.repoData[type] else: raise RepoMDError, "requested datatype %s not available" % type def dump(self): """dump fun output""" print "file timestamp: %s" % self.timestamp print "file length : %s" % self.length for csum in sorted(self.checksums): print "file checksum : %s/%s" % (csum, self.checksums[csum]) if self.revision is not None: print 'revision: %s' % self.revision if self.tags['content']: print 'tags content: %s' % ", ".join(sorted(self.tags['content'])) if self.tags['distro']: for distro in sorted(self.tags['distro']): print 'tags distro: %s' % distro tags = self.tags['distro'][distro] print ' tags: %s' % ", ".join(sorted(tags)) print '\n---- Data ----' for ft in sorted(self.fileTypes()): thisdata = self.repoData[ft] print ' datatype: %s' % thisdata.type print ' location : %s %s' % thisdata.location print ' timestamp : %s' % thisdata.timestamp print ' size : %s' % thisdata.size print ' open size : %s' % thisdata.opensize print ' checksum : %s - %s' % thisdata.checksum print ' open checksum: %s - %s' % thisdata.openchecksum print ' dbversion : %s' % thisdata.dbversion print '' def dump_xml(self): msg = "" top = """ \n""" msg += top if self.revision: rev = """ %s\n""" % to_xml(self.revision) msg += rev if self.tags['content'] or self.tags['distro'] or self.tags['repo']: tags = """ \n""" for item in self.tags['content']: tag = """ %s\n""" % (to_xml(item)) tags += tag for item in self.tags['repo']: tag = """ %s\n""" % (to_xml(item)) tags += tag distro = self.tags['distro'] if isinstance(distro, dict): lst = [] for cpeid in sorted(distro): for item in sorted(distro[cpeid]): lst.append((cpeid, item)) distro = lst for (cpeid, item) in distro: if cpeid: tag = """ %s\n""" % ( to_xml(cpeid, attrib=True), to_xml(item)) else: tag = """ %s\n""" % (to_xml(item)) tags += tag tags += """ \n""" msg += tags for md in self.repoData.values(): msg += md.dump_xml() msg += """\n""" return msg def main(): try: print "file : %s" % sys.argv[1] p = RepoMD('repoid', sys.argv[1]) p.dump() except IOError: print >> sys.stderr, "newcomps.py: No such file:\'%s\'" % sys.argv[1] sys.exit(1) if __name__ == '__main__': main() PK[,5site-packages/yum/callbacks.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """Classes for handling various callbacks.""" # imports import logging from urlgrabber.progress import BaseMeter,format_time,format_number # ProcessTransaction States PT_DOWNLOAD = 10 # Start Download PT_DOWNLOAD_PKGS = 11 # Packages to download PT_GPGCHECK = 20 # Start Checkin Package Signatures PT_TEST_TRANS = 30 # Start Test Transaction PT_TRANSACTION = 40 # Start Transaction PT_MESSAGES = { PT_DOWNLOAD : "Downloading Packages", PT_GPGCHECK : "Check Package Signatures", PT_TEST_TRANS : "Running Test Transaction", PT_TRANSACTION : "Running Transaction"} class ProcessTransBaseCallback: """A class to handle callbacks from :func:`YumBase.processTransaction`. """ def __init__(self): self.logger = logging.getLogger('yum.verbose.ProcessTrasactionBaseCallback') def event(self,state,data=None): """Handle an event by logging it. :param state: a number indicating the type of callback :param data: data associated with the callback """ if state in PT_MESSAGES.keys(): self.logger.info(PT_MESSAGES[state]) class ProcessTransNoOutputCallback: """A class to handle callbacks from :func:`YumBase.processTransaction`, without logging them. """ def __init__(self): pass def event(self,state,data=None): """Handle an event. :param state: a number indicating the type of callback :param data: data associated with the callback """ pass class DownloadBaseCallback( BaseMeter ): """This is a base class that can be extended to implement a custom download progress handler to be used with :func:`YumBase.repos.setProgressBar`. Example:: from yum.callbacks import DownloadBaseCallback class MyDownloadCallback( DownloadBaseCallback ): def updateProgress(self,name,frac,fread,ftime): ''' Update the progressbar @param name: filename @param frac: Progress fracment (0 -> 1) @param fread: formated string containing BytesRead @param ftime : formated string containing remaining or elapsed time ''' pct = int( frac*100 ) print " %s : %s " % (name,pct) if __name__ == '__main__': my = YumBase() my.doConfigSetup() dnlcb = MyDownloadCallback() my.repos.setProgressBar( dnlcb ) for pkg in my.pkgSack: print pkg.name """ def __init__(self): BaseMeter.__init__( self ) self.totSize = "" # Total size to download in a formatted string (Kb, MB etc) def update( self, amount_read, now=None ): """Update the status bar. :param amount_read: the amount of data, in bytes, that has been read :param now: the current time in seconds since the epoch. If *now* is not given, the output of :func:`time.time()` will be used. """ BaseMeter.update( self, amount_read, now ) def _do_start( self, now=None ): name = self._getName() self.updateProgress(name,0.0,"","") if not self.size is None: self.totSize = format_number( self.size ) def _do_update( self, amount_read, now=None ): fread = format_number( amount_read ) name = self._getName() if self.size is None: # Elapsed time etime = self.re.elapsed_time() fetime = format_time( etime ) frac = 0.0 self.updateProgress(name,frac,fread,fetime) else: # Remaining time rtime = self.re.remaining_time() frtime = format_time( rtime ) frac = self.re.fraction_read() self.updateProgress(name,frac,fread,frtime) def _do_end( self, amount_read, now=None ): total_time = format_time( self.re.elapsed_time() ) total_size = format_number( amount_read ) name = self._getName() self.updateProgress(name,1.0,total_size,total_time) def _getName(self): ''' Get the name of the package being downloaded ''' if self.text and type( self.text ) == type( "" ): name = self.text else: name = self.basename return name def updateProgress(self,name,frac,fread,ftime): """Update the progressbar. This method should be overridden by subclasses to implement the handler. :param name: the name of the filed being downloaded :param frac: number between 0 and 1 representing the fraction fraction of the file that has been downloaded :param fread: formatted string containing the number of bytes read :param ftime: formatted string containing remaining or elapsed time """ pass PK[8 jV+V+site-packages/yum/drpm.pycnu[ v_c@sddlmZddlmZddlmZmZddlmZddlm Z m Z m Z ddl m Z mZee dZddlmZdd lZdd lZd Zd dd YZd dZdddYZd S(i(t TS_UPDATE(t RepoError(t exception2msgt_(t MiscError(tchecksumtrepo_gen_decompresstunlink_f(tgrabbertprogresst parallel_wait(t iterparseNs/usr/bin/applydeltarpmt DeltaPackagecBsPeZdZdZdZdZdZdZdZdZ RS(cCs||_|j|_|j|_|j|_|j\|_|_|_|_|_d|_ ||_ ||_ t jj|jdt jj||_||_||_dS(Nt/(trpmtrepotbasepathtpkgtuptnametarchtepochtversiontreleasetNonet_hashtsizet relativepathtostpathtdirnamet localpathtbasenametcsumtoldrpm(tselfRRtremoteR R!((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt__init__!s    '   , cCs d|jS(NsDelta RPM of %s(R(R"((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt__str__2scCsw|dkrdSt|j|jpvt|j|jpvt|j|jpvt|j|jpvt|j|jS(Ni(RtcmpRRRRR(R"tother((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt__cmp__5s cCsY|jdkrRd|jj|j|j|j|j|jf}t ||_n|jS(Ns%s - %s:%s-%s-%s.%s( RRRtidRRRRRthash(R"tmystr((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt__hash__@s cCs|jS(N(R(R"((s,/usr/lib/python2.7/site-packages/yum/drpm.pytlocalPkgGscCsdS(N(R(R"((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt getDiscNumJscCsytjj|j}Wntk r-tSX||jkrAtS|j\}}yt||j}Wnt k rztSX||krtSt S(N( RRtgetsizeRtOSErrortFalseRR RRtTrue(R"tfsizetctypeR tfsum((s,/usr/lib/python2.7/site-packages/yum/drpm.pytverifyLocalPkgMs   cCs|jS(N(R (R"((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt returnIdSum\s( t__name__t __module__R$R%R(R,R-R.R6R7(((s,/usr/lib/python2.7/site-packages/yum/drpm.pyR s      icCs`ttds|Stjjds)|Stjd}yt|dkrQ|SWnnX|S(NtsysconftSC_NPROCESSORS_ONLNi(thasattrRt sysconf_namesthas_keyR:tint(tunknowntncpus((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt_num_cpus_online_st DeltaInfocBsPeZdZddZedZdZdZdZ e dZ RS(c+ s|j_|_i_g_d_|jj_jdkrjt }j| 9_njswdSi}i}i}xt |D]\}} | j j } | dkr| j j } |jj } t| dkr| djdrd} qn| dkrqn| jtkr'n| j|jjkr?n|j| j } | dkri} || j }$|$|"krqon|jd}%|jd}&|jd}'|&|'f|#krd|j||&|'| f}(n*|j?j@||%|&|'| s!qond}(|$}"|j=dj>})|j=d}*|*jd|*j>f}*tA| |$|)|*|(|| De-Queue all delta rebuilds and spawn the rebuild processes. iis.Finishing delta rebuilds of %d package(s) (%s)ttext_meter_total_sizeiRTturlR~sRN(RWtvaluesRXRRRHRoRR RvRtcallbackR<RRft timescaletstartRRtdequeue(R"tcountttotalR((s,/usr/lib/python2.7/site-packages/yum/drpm.pyt dequeue_all#s(     cCsA|js|jdSx#|jr<|jdtsPqqWdS(sQ De-Queue all delta rebuilds we can and spawn the rebuild processes. NR(RXRRR1(R"((s,/usr/lib/python2.7/site-packages/yum/drpm.pyR;s    cCs|j|jstS|jt|jkr]|s9tS|jt|j|jdn|jjd}d|jf}|j r|d|j f7}n||j |j j f7}t j t jtt|}||j|s? PK[M RRsite-packages/yum/mdparser.pycnu[ v_c@sddlZyddlmZWnek r?ddlZnXejZddlmZddlZddlZdddYZ dddYZ de fd YZ d e fd YZ d e fd YZ dZedkrendS(iN(t cElementTree(tStringIOtMDParsercBs#eZdZdZdZRS(cCsitd6td6td6}d|_d|_d|_|ddkr[tj|d}nt|d}t |dd }|j |_ |j j \}}|j |jd|_|jstd |j|fnt|j d d|_dS(Ns/{http://linux.duke.edu/metadata/common}metadatas3{http://linux.duke.edu/metadata/filelists}filelistss/{http://linux.duke.edu/metadata/other}otherdataiis.gztrteventststarttends Unknown repodata type "%s" in %stpackages(sstartsend(t PrimaryEntrytFilelistsEntryt OtherEntrytNonettotaltcountt _handlerclstgziptopent iterparset__iter__treadertnexttgetttagt ValueErrortint(tselftfilenamethandlerstfhtparserteventtelem((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyt__init__"s$     cCs|S(N((R((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR=scCs_xR|jD]G\}}|dkr |jddkr |jd7_|j|Sq WtdS(NRitpackagei(RRR Rt StopIteration(RRR((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR@s (t__name__t __module__R RR(((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR s  t BaseEntrycBsYeZdZdZdZdZdZdZdZdZ dZ RS( cCs i|_dS(N(t_p(RR((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR IscCs |j|S(N(R&(Rtk((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyt __getitem__LscCs |jjS(N(R&tkeys(R((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR)OscCs |jjS(N(R&tvalues(R((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR*RscCs&tjdtjdd||jkS(Ns3has_key() will go away in a future version of Yum. t stackleveli(twarningstwarntErrorstYumFutureDeprecationWarningR&(RR'((s0/usr/lib/python2.7/site-packages/yum/mdparser.pythas_keyUs cCs t|jS(N(titerR&(R((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyRZscCsdt}|j}|jx8|D]0}d|||f}|j|jdq&W|jS(Nu%s=%s tutf8(RR)tsorttwritetencodetgetvalue(RtoutR)R'tline((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyt__str__]s    cCs*|jddkr|S|jddS(Nt}ii(tfindtsplit(Rtqn((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyt_bnfscCs@i}x3|jD](}|j|||d|j|(RRtprefixtrettkey((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyt _prefixpropsjs&( R#R$R R(R)R*R0RR9R>RD(((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR%Hs       RcBs#eZdZdZdZRS(cCsGtj|||j}i|_i|_x|D]}|j|j}|dkrf|j||RttexttupdateR@RDR t setFormattclear(RRtptchildRE((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR qs,         cCs|j}x|D]}|j|j}|dkrD|j||RRWtgetPrcoRURXRDRRV(RRR[R\REt file_typetpath((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyRYs       cCs+g}x|D]}|j|jq W|S(N(tappendR@(RRtmembersR\((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyRis (R#R$R RYRi(((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyRps R cBseZdZRS(cCstj|||jd|jdRRRWRZ(RRR\RERjRk((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR s    (R#R$R (((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR sR cBseZdZRS(cCstj|||jd|jdRRWRlRZ(RRR\REtentry((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR s     (R#R$R (((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyR scCsWddl}t|jd}x|D]}ddGH|GHq&Wd|j|jfGHdS(Niit-i(s read: %s packages (%s suggested)(tsysRtargvR R (RsRtpkg((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyttests     t__main__(((Rt xml.etreeRt ImportErrorRt cStringIORR,R.RR%RR R RvR#(((s0/usr/lib/python2.7/site-packages/yum/mdparser.pyts     ((@  PK[gCÄV$V$site-packages/yum/Errors.pycnu[ v_c@sdZddlmZmZdefdYZdefdYZdefdYZd efd YZd efd YZ d efdYZ defdYZ defdYZ defdYZ de fdYZde fdYZdefdYZdefdYZdefdYZdefd YZd!efd"YZd#efd$YZd%efd&YZd'efd(YZd)efd*YZd+efd,YZd-efd.YZd/efd0YZd1efd2YZd3efd4YZd5efd6YZd7efd8YZd9efd:YZ d;efd<YZ!d=efd>YZ"d?e#fd@YZ$dAe$fdBYZ%dCS(Ds& Exceptions and Errors thrown by yum. i(t to_unicodetto_utf8t YumBaseErrorcBs,eZdZddZdZdZRS(sV Base Yum Error. All other Errors thrown by yum should inherit from this. cCstj|||_dS(N(t Exceptiont__init__tvalue(tselfR((s./usr/lib/python2.7/site-packages/yum/Errors.pyRs cCsdt|jS(Ns%s(RR(R((s./usr/lib/python2.7/site-packages/yum/Errors.pyt__str__scCsdt|jS(Ns%s(RR(R((s./usr/lib/python2.7/site-packages/yum/Errors.pyt __unicode__"sN(t__name__t __module__t__doc__tNoneRRR(((s./usr/lib/python2.7/site-packages/yum/Errors.pyRs  tYumGPGCheckErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR %stYumDownloadErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR(stYumTestTransactionErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR+stYumRPMCheckErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR.stYumRPMTransErrorcBs)eZdZdZdZdZRS(s This class means rpm's .ts.run() returned known errors. We are compat. with YumBaseError in that we print nicely, and compat. with traditional usage of this error from runTransaction(). cCs"||_||_|j|_dS(N(tmsgterrorsR(RRR((s./usr/lib/python2.7/site-packages/yum/Errors.pyR5s  cCsd|jfS(Ns%s(R(R((s./usr/lib/python2.7/site-packages/yum/Errors.pyR;scCsdt|jS(Ns%s(RR(R((s./usr/lib/python2.7/site-packages/yum/Errors.pyR>s(R R R RRR(((s./usr/lib/python2.7/site-packages/yum/Errors.pyR1s  t LockErrorcBseZddZRS(icCs/tj||||_||_||_dS(N(RRterrnoRtpid(RRRR((s./usr/lib/python2.7/site-packages/yum/Errors.pyRCs  (R R R(((s./usr/lib/python2.7/site-packages/yum/Errors.pyRBstDepErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyRIst RepoErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyRLstDuplicateRepoErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyROstNoMoreMirrorsRepoErrorcBs&eZdddZedZRS(cCs#tj|||_||_dS(N(RRt_valueR(RRR((s./usr/lib/python2.7/site-packages/yum/Errors.pyRTs  cCsA|j}x1|jpgD] \}}|d||f7}qW|S(Ns %s: %s(RR(RtretturlR((s./usr/lib/python2.7/site-packages/yum/Errors.pyRYs N(R R R RtpropertyR(((s./usr/lib/python2.7/site-packages/yum/Errors.pyRSst ConfigErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR`st MiscErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR cstFIPSNonCompliantErrorcBseZdZRS(cCstj|d|dS(Ns"%s algorithm is not FIPS compliant(R R(Rtsumtype((s./usr/lib/python2.7/site-packages/yum/Errors.pyRgs(R R R(((s./usr/lib/python2.7/site-packages/yum/Errors.pyR!fst GroupsErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR#kst InstallErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR$nstGroupInstallErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR%qst UpdateErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR&tstUpdateMissingNameErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR'wst RemoveErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR(zstReinstallErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR)}stReinstallRemoveErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR*stReinstallInstallErrorcBseZdgdZRS(cCstj||||_dS(N(R)Rt failed_pkgs(RRR,((s./usr/lib/python2.7/site-packages/yum/Errors.pyRsN(R R R R(((s./usr/lib/python2.7/site-packages/yum/Errors.pyR+stDowngradeErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR-st RepoMDErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR.stPackageSackErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR/st RpmDBErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR0stCompsExceptioncBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR1st MediaErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR2st PkgTagsErrorcBseZRS((R R (((s./usr/lib/python2.7/site-packages/yum/Errors.pyR3stYumDeprecationWarningcBseZdZddZRS(s. Used to mark a method as deprecated. cCstj||dS(N(tDeprecationWarningR(RR((s./usr/lib/python2.7/site-packages/yum/Errors.pyRsN(R R R R R(((s./usr/lib/python2.7/site-packages/yum/Errors.pyR4stYumFutureDeprecationWarningcBseZdZddZRS(s Used to mark a method as deprecated. Unlike YumDeprecationWarning, YumFutureDeprecationWarnings will not be shown on the console. cCstj||dS(N(R4R(RR((s./usr/lib/python2.7/site-packages/yum/Errors.pyRsN(R R R R R(((s./usr/lib/python2.7/site-packages/yum/Errors.pyR6sN(&R ti18nRRRRR RRRRRRRRRRR R!R#R$R%R&R'R(R)R*R+R-R.R/R0R1R2R3R5R4R6(((s./usr/lib/python2.7/site-packages/yum/Errors.pytsB PK[w>>site-packages/yum/pkgtag_db.pycnu[ v_c@sddlmZmZmZddlmZddlZddlZddlZdZde fdYZ de fdYZ dS( i(tsqlitet executeSQLtsql_esc(t PkgTagsErrorNcs>fd}j|_j|_|jjj|S(s;This decorator converts sqlite exceptions into PkgTagsErrorcsy||SWnmtjjk r}tjdkrnt|dr\tt|jqntt|ntt|nXdS(Nitmessage( tsqlutilsRtErrortsyst hexversionthasattrRtstrR(targstkwargste(tfunc(s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pytnewFuncs(t__name__t__doc__t__dict__tupdate(RR((Rs1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pytcatchSqliteExceptions   t PackageTagDBcBsYeZedZdZeddddZedZdZdZ RS( cCs:||_||_tj||_|jj|_dS(N(t sqlite_filetrepoidRtconnectt_conntcursortcur(tselfRR((s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pyt__init__1s  cCs#x|jdD] }|dSWdS(s Unused, so no need to cache. s select count(*) from packagetagsiN(t _sql_exec(Rtn((s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pyt _getTagsCount:stfgetcCs |jS(N(R (R((s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pyt?stdocs"Number of entries in the pkgtag DBcGst|j|||jS(s6 Exec SQL against an MD of the repo, return a cursor. (RR(RtsqlR ((s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pyRBscCsi}t|\}}d|}d|d}|j||f}xA|D]9\}}}||krtg||R?((s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pyR.s"  (RR0RR6R7R/R.(((s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pyR3gs     ( RRRRtErrorsRRR;RtobjectRR3(((s1/usr/lib/python2.7/site-packages/yum/pkgtag_db.pyts    7PK[z[fpfpsite-packages/yum/plugins.pynuȯ#! /usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University import os import glob import imp import warnings import atexit import gettext import logging import logginglevels from constants import * import config from config import ParsingError, ConfigParser import Errors from parser import ConfigPreProcessor from textwrap import fill import fnmatch from weakref import proxy as weakref from yum import _ from yum.i18n import utf8_width # TODO: expose rpm package sack objects to plugins (once finished) # TODO: allow plugins to use the existing config stuff to define options for # their own configuration files (would replace confString() etc). # TODO: expose progress bar interface # TODO "log" slot? To allow plugins to do customised logging/history (say to a # SQL db) # TODO: consistent case of YumPlugins methods # TODO: allow plugins to extend shell commands # TODO: allow plugins to define new repository types # TODO: More developer docs: use epydoc as API begins to stablise # The API_VERSION constant defines the current plugin API version. It is used # to decided whether or not plugins can be loaded. It is compared against the # 'requires_api_version' attribute of each plugin. The version number has the # format: "major_version.minor_version". # # For a plugin to be loaded the major version required by the plugin must match # the major version in API_VERSION. Additionally, the minor version in # API_VERSION must be greater than or equal the minor version required by the # plugin. # # If a change to yum is made that break backwards compatibility wrt the plugin # API, the major version number must be incremented and the minor version number # reset to 0. If a change is made that doesn't break backwards compatibility, # then the minor number must be incremented. API_VERSION = '2.7' class DeprecatedInt(int): """A simple int subclass that is used to check when a deprecated constant is used. """ # Plugin types TYPE_CORE = 0 TYPE_INTERACTIVE = 1 TYPE_INTERFACE = DeprecatedInt(1) ALL_TYPES = (TYPE_CORE, TYPE_INTERACTIVE) # Mapping of slots to conduit classes SLOT_TO_CONDUIT = { 'config': 'ConfigPluginConduit', 'postconfig': 'PostConfigPluginConduit', 'init': 'InitPluginConduit', 'args': 'ArgsPluginConduit', 'predownload': 'DownloadPluginConduit', 'postdownload': 'DownloadPluginConduit', 'prelistenabledrepos': 'PreRepoSetupPluginConduit', 'prereposetup': 'PreRepoSetupPluginConduit', 'postreposetup': 'PostRepoSetupPluginConduit', 'close': 'PluginConduit', 'clean': 'PluginConduit', 'pretrans': 'MainPluginConduit', 'posttrans': 'MainPluginConduit', 'preverifytrans': 'MainPluginConduit', 'postverifytrans': 'MainPluginConduit', 'exclude': 'MainPluginConduit', 'preresolve': 'DepsolvePluginConduit', 'postresolve': 'DepsolvePluginConduit', 'historybegin': 'HistoryPluginConduit', 'historyend': 'HistoryPluginConduit', 'compare_providers': 'CompareProvidersPluginConduit', 'verify_package': 'VerifyPluginConduit', } # Enumerate all slot names SLOTS = sorted(SLOT_TO_CONDUIT.keys()) class PluginYumExit(Exception): """Exception that can be raised by plugins to signal that yum should stop.""" def __init__(self, value="", translation_domain=""): self.value = value self.translation_domain = translation_domain def __str__(self): if self.translation_domain: return gettext.dgettext(self.translation_domain, self.value) else: return self.value class YumPlugins: """Manager class for Yum plugins.""" def __init__(self, base, searchpath, optparser=None, types=None, pluginconfpath=None,disabled=None,enabled=None): '''Initialise the instance. @param base: The @param searchpath: A list of paths to look for plugin modules. @param optparser: The OptionParser instance for this run (optional). Use to allow plugins to extend command line options. @param types: A sequence specifying the types of plugins to load. This should be sequnce containing one or more of the TYPE_... constants. If None (the default), all plugins will be loaded. @param pluginconfpath: A list of paths to look for plugin configuration files. Defaults to "/etc/yum/pluginconf.d". ''' if not pluginconfpath: pluginconfpath = ['/etc/yum/pluginconf.d'] self.searchpath = searchpath self.pluginconfpath = pluginconfpath self.base = weakref(base) self.optparser = optparser self.cmdline = (None, None) self.verbose_logger = logging.getLogger("yum.verbose.YumPlugins") self.disabledPlugins = disabled self.enabledPlugins = enabled if types is None: types = ALL_TYPES if not isinstance(types, (list, tuple)): types = (types,) if id(TYPE_INTERFACE) in [id(t) for t in types]: self.verbose_logger.log(logginglevels.INFO_2, 'Deprecated constant TYPE_INTERFACE during plugin ' 'initialization.\nPlease use TYPE_INTERACTIVE instead.') self._importplugins(types) self.cmdlines = {} # Call close handlers when yum exit's atexit.register(self.run, 'close') # Let plugins register custom config file options self.run('config') def run(self, slotname, **kwargs): """Run all plugin functions for the given slot. :param slotname: a string representing the name of the slot to run the plugins for :param kwargs: keyword arguments that will be simply passed on to the plugins """ # Determine handler class to use conduitcls = SLOT_TO_CONDUIT.get(slotname, None) if conduitcls is None: raise ValueError('unknown slot name "%s"' % slotname) conduitcls = eval(conduitcls) # Convert name to class object for modname, func in self._pluginfuncs[slotname]: self.verbose_logger.log(logginglevels.DEBUG_4, 'Running "%s" handler for "%s" plugin', slotname, modname) _, conf = self._plugins[modname] func(conduitcls(self, self.base, conf, **kwargs)) def _importplugins(self, types): '''Load plugins matching the given types. ''' # Initialise plugin dict self._plugins = {} self._pluginfuncs = {} for slot in SLOTS: self._pluginfuncs[slot] = [] # Import plugins self._used_disable_plugin = set() self._used_enable_plugin = set() for dir in self.searchpath: if not os.path.isdir(dir): continue for modulefile in sorted(glob.glob('%s/*.py' % dir)): self._loadplugin(modulefile, types) # If we are in verbose mode we get the full 'Loading "blah" plugin' lines if (self._plugins and not self.verbose_logger.isEnabledFor(logginglevels.DEBUG_3)): # Mostly copied from YumOutput._outKeyValFill() key = _("Loaded plugins: ") val = ", ".join(sorted(self._plugins)) nxt = ' ' * (utf8_width(key) - 2) + ': ' width = 80 if hasattr(self.base, 'term'): width = self.base.term.columns self.verbose_logger.log(logginglevels.INFO_2, fill(val, width=width, initial_indent=key, subsequent_indent=nxt)) if self.disabledPlugins: for wc in self.disabledPlugins: if wc not in self._used_disable_plugin: self.verbose_logger.log(logginglevels.INFO_2, _("No plugin match for: %s") % wc) del self._used_disable_plugin if self.enabledPlugins: for wc in self.enabledPlugins: if wc not in self._used_enable_plugin: self.verbose_logger.log(logginglevels.INFO_2, _("No plugin match for: %s") % wc) del self._used_enable_plugin @staticmethod def _plugin_cmdline_match(modname, plugins, used): """ Check if this plugin has been temporary enabled/disabled. """ if plugins is None: return False for wc in plugins: if fnmatch.fnmatch(modname, wc): used.add(wc) return True return False def _loadplugin(self, modulefile, types): '''Attempt to import a plugin module and register the hook methods it uses. ''' dir, modname = os.path.split(modulefile) modname = modname.split('.py')[0] # This should really work like enable/disable repo. and be based on the # cmd line order ... but the API doesn't really allow that easily. # FIXME: Fix for 4.* (lol) # Do disabled cmd line checks before loading the module code. if (self._plugin_cmdline_match(modname, self.disabledPlugins, self._used_disable_plugin) and not self._plugin_cmdline_match(modname, self.enabledPlugins, self._used_enable_plugin)): return conf = self._getpluginconf(modname) if (not conf or (not config.getOption(conf, 'main', 'enabled', config.BoolOption(False)) and not self._plugin_cmdline_match(modname, self.enabledPlugins, self._used_enable_plugin))): self.verbose_logger.debug(_('Not loading "%s" plugin, as it is disabled'), modname) return try: fp, pathname, description = imp.find_module(modname, [dir]) try: module = imp.load_module(modname, fp, pathname, description) finally: fp.close() except: if self.verbose_logger.isEnabledFor(logginglevels.DEBUG_4): raise # Give full backtrace: self.verbose_logger.error(_('Plugin "%s" can\'t be imported') % modname) return # Check API version required by the plugin if not hasattr(module, 'requires_api_version'): self.verbose_logger.error( _('Plugin "%s" doesn\'t specify required API version') % modname) return if not apiverok(API_VERSION, module.requires_api_version): self.verbose_logger.error( _('Plugin "%s" requires API %s. Supported API is %s.') % ( modname, module.requires_api_version, API_VERSION, )) return # Check plugin type against filter plugintypes = getattr(module, 'plugin_type', ALL_TYPES) if not isinstance(plugintypes, (list, tuple)): plugintypes = (plugintypes,) if len(plugintypes) < 1: return for plugintype in plugintypes: if id(plugintype) == id(TYPE_INTERFACE): self.verbose_logger.log(logginglevels.INFO_2, 'Plugin "%s" uses deprecated constant ' 'TYPE_INTERFACE.\nPlease use TYPE_INTERACTIVE ' 'instead.', modname) if plugintype not in types: return self.verbose_logger.log(logginglevels.DEBUG_3, _('Loading "%s" plugin'), modname) # Store the plugin module and its configuration file if modname not in self._plugins: self._plugins[modname] = (module, conf) else: raise Errors.ConfigError(_('Two or more plugins with the name "%s" ' \ 'exist in the plugin search path') % modname) for slot in SLOTS: funcname = slot+'_hook' if hasattr(module, funcname): self._pluginfuncs[slot].append( (modname, getattr(module, funcname)) ) def _getpluginconf(self, modname): '''Parse the plugin specific configuration file and return a IncludingConfigParser instance representing it. Returns None if there was an error reading or parsing the configuration file. ''' for dir in self.pluginconfpath: conffilename = os.path.join(dir, modname + ".conf") if os.access(conffilename, os.R_OK): # Found configuration file break self.verbose_logger.log(logginglevels.INFO_2, _("Configuration file %s not found") % conffilename) else: # for # Configuration files for the plugin not found self.verbose_logger.log(logginglevels.INFO_2, _("Unable to find configuration file for plugin %s") % modname) return None parser = ConfigParser() confpp_obj = ConfigPreProcessor(conffilename) try: parser.readfp(confpp_obj) except ParsingError, e: raise Errors.ConfigError("Couldn't parse %s: %s" % (conffilename, str(e))) return parser def setCmdLine(self, opts, commands): """Set the parsed command line options so that plugins can access them. :param opts: a dictionary containing the values of the command line options :param commands: a list of command line arguments passed to yum """ self.cmdline = (opts, commands) class DummyYumPlugins: """This class provides basic emulation of the :class:`YumPlugins` class. It exists so that calls to plugins.run() don't fail if plugins aren't in use. """ def run(self, *args, **kwargs): """Do nothing. All arguments are unused.""" pass def setCmdLine(self, *args, **kwargs): """Do nothing. All arguments are unused.""" pass class PluginConduit: """A conduit class to transfer information between yum and the plugin. """ def __init__(self, parent, base, conf): self._parent = parent self._base = base self._conf = conf self.logger = logging.getLogger("yum.plugin") self.verbose_logger = logging.getLogger("yum.verbose.plugin") def info(self, level, msg): """Send an info message to the logger. :param level: the level of the message to send :param msg: the message to send """ converted_level = logginglevels.logLevelFromDebugLevel(level) self.verbose_logger.log(converted_level, msg) def error(self, level, msg): """Send an error message to the logger. :param level: the level of the message to send :param msg: the message to send """ converted_level = logginglevels.logLevelFromErrorLevel(level) self.logger.log(converted_level, msg) def promptYN(self, msg, prompt=None): """Return a yes or no response, either from assumeyes already being set, or from prompting the user. :param msg: the message to show to the user :param prompt: the question to ask the user (optional); defaults to 'Is this ok [y/N]: ' :return: 1 if the response is yes, and 0 if the response is no """ self.info(2, msg) if self._base.conf.assumeno: return False if self._base.conf.assumeyes: return True else: kwargs = {'prompt': prompt} if prompt else {} return bool(self._base.userconfirm(**kwargs)) def getYumVersion(self): """Return a string representing the current version of yum.""" import yum return yum.__version__ def getOptParser(self): """Return the :class:`optparse.OptionParser` instance for this execution of Yum. In the "config" and "init" slots a plugin may add extra options to this instance to extend the command line options that Yum exposes. In all other slots a plugin may only read the :class:`OptionParser` instance. Any modification of the instance at this point will have no effect. See the :func:`PreRepoSetupPluginConduit.getCmdLine` method for details on how to retrieve the parsed values of command line options. :return: the global :class:`optparse.OptionParser` instance used by Yum. May be None if an OptionParser isn't in use """ # ' xemacs highlighting hack # This isn't API compatible :( # return self._parent.optparser.plugin_option_group return self._parent.optparser def confString(self, section, opt, default=None): """Read a string value from the plugin's own configuration file. :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: string option value read, or default if option was missing """ # ' xemacs highlighting hack return config.getOption(self._conf, section, opt, config.Option(default)) def confInt(self, section, opt, default=None): """Read an integer value from the plugin's own configuration file. :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: the integer option value read, or *default* if the option was missing or could not be parsed """ return config.getOption(self._conf, section, opt, config.IntOption(default)) def confFloat(self, section, opt, default=None): """Read a float value from the plugin's own configuration file. :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: float option value read, or *default* if the option was missing or could not be parsed """ return config.getOption(self._conf, section, opt, config.FloatOption(default)) def confBool(self, section, opt, default=None): """Read a boolean value from the plugin's own configuration file :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: boolean option value read, or *default* if the option was missing or could not be parsed """ return config.getOption(self._conf, section, opt, config.BoolOption(default)) def confList(self, section, opt, default=None): """Read a boolean value from the plugin's own configuration file :param section: configuration file section to read :param opt: option name to read :param default: value to read if the option is missing :return: boolean option value read, or *default* if the option was missing or could not be parsed """ return config.getOption(self._conf, section, opt, config.ListOption(default)) def registerPackageName(self, name): """Register the name of a package to use. :param name: the name of the package to register """ self._base.run_with_package_names.add(name) class ConfigPluginConduit(PluginConduit): """A conduit for use in the config slot.""" def registerOpt(self, name, valuetype, where, default): """Deprecated. Register a yum configuration file option. :param name: name of the new option :param valuetype: option type (PLUG_OPT_BOOL, PLUG_OPT_STRING, etc.) :param where: where the option should be available in the config file (PLUG_OPT_WHERE_MAIN, PLUG_OPT_WHERE_REPO, etc) :param default: default value for the option if it is not set by the user """ warnings.warn('registerOpt() will go away in a future version of Yum.\n' 'Please manipulate config.YumConf and config.RepoConf directly.', DeprecationWarning) type2opt = { PLUG_OPT_STRING: config.Option, PLUG_OPT_INT: config.IntOption, PLUG_OPT_BOOL: config.BoolOption, PLUG_OPT_FLOAT: config.FloatOption, } if where == PLUG_OPT_WHERE_MAIN: setattr(config.YumConf, name, type2opt[valuetype](default)) elif where == PLUG_OPT_WHERE_REPO: setattr(config.RepoConf, name, type2opt[valuetype](default)) elif where == PLUG_OPT_WHERE_ALL: option = type2opt[valuetype](default) setattr(config.YumConf, name, option) setattr(config.RepoConf, name, config.Inherit(option)) def registerCommand(self, command): """Register a new command. :param command: the command to register :raises: :class:`yum.Errors.ConfigError` if the registration of commands is not supported """ if hasattr(self._base, 'registerCommand'): self._base.registerCommand(command) else: raise Errors.ConfigError(_('registration of commands not supported')) class PostConfigPluginConduit(ConfigPluginConduit): """Conduit for use in the postconfig slot.""" def getConf(self): """Return a dictionary containing the values of the configuration options. :return: a dictionary containing the values of the configuration options """ return self._base.conf class InitPluginConduit(PluginConduit): """Conduit for use in the init slot.""" def getConf(self): """Return a dictionary containing the values of the configuration options. :return: a dictionary containing the values of the configuration options """ return self._base.conf def getRepos(self): """Return Yum's container object for all configured repositories. :return: Yum's :class:`yum.repos.RepoStorage` instance """ return self._base.repos class ArgsPluginConduit(InitPluginConduit): """Conduit for dealing with command line arguments.""" def __init__(self, parent, base, conf, args): InitPluginConduit.__init__(self, parent, base, conf) self._args = args def getArgs(self): """Return a list of the command line arguments passed to yum. :return: a list of the command line arguments passed to yum """ return self._args class PreRepoSetupPluginConduit(InitPluginConduit): """Conduit for use in the prererosetup slot.""" def getCmdLine(self): """Return parsed command line options. :return: (options, commands) as returned by :class:`OptionParser.parse_args()` """ return self._parent.cmdline def getRpmDB(self): """Return a representation of the local RPM database. This allows querying of installed packages. :return: a :class:`yum.rpmUtils.RpmDBHolder` instance """ return self._base.rpmdb class PostRepoSetupPluginConduit(PreRepoSetupPluginConduit): """Conduit for use in the postreposetup slot.""" def getGroups(self): """Return group information. :return: :class:`yum.comps.Comps` instance """ return self._base.comps class DownloadPluginConduit(PostRepoSetupPluginConduit): """Conduit for use in the download slots.""" def __init__(self, parent, base, conf, pkglist, errors=None): PostRepoSetupPluginConduit.__init__(self, parent, base, conf) self._pkglist = pkglist self._errors = errors def getDownloadPackages(self): """Return a list of package objects representing packages to be downloaded. :return: a list of package object representing packages to be downloaded """ return self._pkglist def getErrors(self): """Return a dictionary of download errors. :return: a dictionary of download errors. This dictionary is indexed by package object. Each element is a list of strings describing the error """ if not self._errors: return {} return self._errors class MainPluginConduit(PostRepoSetupPluginConduit): """Main conduit class for plugins. Many other conduit classes will inherit from this class. """ def getPackages(self, repo=None): """Return a list of packages. :param repo: the repo to return a packages from :return: a list of package objects """ if repo: arg = repo.id else: arg = None return self._base.pkgSack.returnPackages(arg) def getPackageByNevra(self, nevra): """Retrieve a package object from the packages loaded by Yum using nevra information. :param nevra: a tuple holding (name, epoch, version, release, arch) for a package :return: a :class:`yum.packages.PackageObject` instance (or subclass) """ return self._base.getPackageObject(nevra) def delPackage(self, po): """Delete the given package from the package sack. :param po: the package object to delete """ po.repo.sack.delPackage(po) def getTsInfo(self): """Return transaction set. :return: the transaction set """ return self._base.tsInfo class DepsolvePluginConduit(MainPluginConduit): """Conduit for use in solving dependencies.""" def __init__(self, parent, base, conf, rescode=None, restring=[]): MainPluginConduit.__init__(self, parent, base, conf) self.resultcode = rescode self.resultstring = restring @property def missing_requires(self): """Boolean indicating if depsolving failed due to missing dependencies.""" return self._base._missing_requires def pretty_output_restring(self): return '\n'.join(prefix % msg for prefix, msg in self._base.pretty_output_restring(self.resultstring)) class CompareProvidersPluginConduit(MainPluginConduit): """Conduit to compare different providers of packages.""" def __init__(self, parent, base, conf, providers_dict={}, reqpo=None): MainPluginConduit.__init__(self, parent, base, conf) self.packages = providers_dict self.reqpo = reqpo class HistoryPluginConduit(MainPluginConduit): """Conduit to access information about the yum history.""" def __init__(self, parent, base, conf, rescode=None, restring=[]): MainPluginConduit.__init__(self, parent, base, conf) self.history = self._base.history class VerifyPluginConduit(MainPluginConduit): """Conduit to verify packages.""" def __init__(self, parent, base, conf, verify_package): MainPluginConduit.__init__(self, parent, base, conf) self.verify_package = verify_package def parsever(apiver): """Parse a string representing an api version. :param apiver: a string representing an api version :return: a tuple containing the major and minor version numbers """ maj, min = apiver.split('.') return int(maj), int(min) def apiverok(a, b): """Return true if API version "a" supports API version "b" :param a: a string representing an api version :param b: a string representing an api version :return: whether version *a* supports version *b* """ a = parsever(a) b = parsever(b) if a[0] != b[0]: return 0 if a[1] >= b[1]: return 1 return 0 PK[W")I)Isite-packages/yum/updateinfo.pynuȯ import os.path import re from yum.i18n import _, P_ from yum.constants import * from yum.logginglevels import INFO_1 import rpmUtils.miscutils import misc import fnmatch # newpackages is weird, in that we'll never display that because we filter to # things relevant to installed pkgs... _update_info_types_ = ("security", "bugfix", "enhancement", "recommended", "newpackage") def _rpm_tup_vercmp(tup1, tup2): """ Compare two "std." tuples, (n, a, e, v, r). """ return rpmUtils.miscutils.compareEVR((tup1[2], tup1[3], tup1[4]), (tup2[2], tup2[3], tup2[4])) def _ysp_safe_refs(refs): """ Sometimes refs == None, if so return the empty list here. So we don't have to check everywhere. """ if not refs: return [] return refs def _match_sec_cmd(sec_cmds, pkgname, notice): for i in sec_cmds: if fnmatch.fnmatch(pkgname, i): return i if fnmatch.fnmatch(notice['update_id'], i): return i cvei = i if not (i.startswith("CVE-") or i.startswith("*")): cvei = 'CVE-' + i for ref in _ysp_safe_refs(notice['references']): if ref['id'] is None: continue if fnmatch.fnmatch(ref['id'], i): return i if fnmatch.fnmatch(ref['id'], cvei): return i return None def _has_id(used_map, refs, ref_type, ref_ids): ''' Check if the given ID is a match. ''' for ref in _ysp_safe_refs(refs): if ref['type'] != ref_type: continue if ref['id'] not in ref_ids: continue used_map[ref_type][ref['id']] = True return ref return None def _ysp_should_filter_pkg(opts, pkgname, notice, used_map): """ Do the package filtering for should_show and should_keep. """ rcmd = _match_sec_cmd(opts.sec_cmds, pkgname, notice) if rcmd: used_map['cmd'][rcmd] = True return True elif opts.advisory and notice['update_id'] in opts.advisory: used_map['id'][notice['update_id']] = True return True elif (opts.severity and notice['type'] == 'security' and notice['severity'] in opts.severity): used_map['sev'][notice['severity']] = True return True elif opts.cve and _has_id(used_map, notice['references'], "cve", opts.cve): return True elif opts.bz and _has_id(used_map, notice['references'],"bugzilla",opts.bz): return True # FIXME: Add opts for enhancement/etc.? -- __update_info_types__ elif (opts.security and notice['type'] == 'security' and (not opts.severity or 'severity' not in notice or not notice['severity'])): return True elif opts.bugfixes and notice['type'] == 'bugfix': return True elif not (opts.advisory or opts.cve or opts.bz or opts.security or opts.bugfixes or opts.sec_cmds or opts.severity): return True # This is only possible from should_show_pkg return False def _ysp_has_info_md(rname, md): if rname in _update_info_types_: if md['type'] == rname: return md for ref in _ysp_safe_refs(md['references']): if ref['type'] != rname: continue return md def _no_options(opts): return not (opts.security or opts.bugfixes or opts.advisory or opts.bz or opts.cve or opts.severity) def _updateinfofilter2opts(updateinfo_filters): opts = misc.GenericHolder() opts.sec_cmds = [] opts.advisory = updateinfo_filters.get('advs', []) opts.bz = updateinfo_filters.get('bzs', []) opts.cve = updateinfo_filters.get('cves', []) opts.severity = updateinfo_filters.get('sevs', []) opts.bugfixes = updateinfo_filters.get('bugfix', False) opts.security = updateinfo_filters.get('security', False) return opts def _args2filters(args): # Basically allow args to turn into security filters, for shell command etc. T_map = {'advs' : 'advs', 'advisory' : 'advs', 'advisories' : 'advs', 'bzs' : 'bzs', 'bz' : 'bzs', 'cves' : 'cves', 'cve' : 'cves', 'security-severity' : 'sevs', 'security-severities' : 'sevs', 'severity' : 'sevs', 'severities' : 'sevs', 'sevs' : 'sevs', 'sev' : 'sevs', 'security' : 'security', 'sec' : 'security', 'bugfix' : 'bugfix', 'bugfixes' : 'bugfix', 'bugs' : 'bugfix', } filters = {'security' : False, 'bugfix' : False} for arg0 in args: arg0 = arg0.replace(" ", ',') T = 'advs' if '=' in arg0: T, arg1 = arg0.split('=', 1) elif arg0 not in T_map: arg1 = arg0 else: T = arg0 arg1 = 'true' if T not in T_map: continue # Error message? T = T_map[T] if T in ('security', 'bugfix'): filters[T] = not filters[T] else: filters[T] = filters.get(T, []) + arg1.split(',') return filters def _ysp_gen_opts(filters, sec_cmds=None): def strip_respin(id_): # Example: RHSA-2016:1234-2 -> RHSA-2016:1234 pattern = r'^(RH[BES]A\-\d+\:\d+)(\-\d+)?$' match = re.match(pattern, id_) if match: return match.group(1) return id_ opts = _updateinfofilter2opts(filters) if sec_cmds is not None: opts.sec_cmds = sec_cmds # If a RH advisory was specified with a respin suffix, strip it out, as we # don't include these suffixes in the notice update_id attribute either (we # use the version attribute for that). Note that there's no ambiguity in # which notice version we should match then, as updateinfo.xml should only # contain one per advisory ID (we give a warning when duplicate IDs are # detected in it). The reason we are handling this is that we sometimes # refer to advisories in this form (e.g. on rhn.redhat.com/errata/...) and # the user may then use it with yum too, in which case we would yield no # matches. # # However, we used to put these suffixes in update_id in the past, so let's # also keep the original (unstripped) form around in opts, just in case we # are dealing with such an old updateinfo.xml. for attr in ['sec_cmds', 'advisory']: oldlist = getattr(opts, attr) stripped = map(strip_respin, oldlist) newlist = list(set(oldlist) | set(stripped)) setattr(opts, attr, newlist) return opts def _ysp_gen_used_map(opts): used_map = {'bugzilla' : {}, 'cve' : {}, 'id' : {}, 'cmd' : {}, 'sev' : {}} if True: return used_map for i in opts.sec_cmds: used_map['cmd'][i] = False for i in opts.advisory: used_map['id'][i] = False for i in opts.bz: used_map['bugzilla'][i] = False for i in opts.cve: used_map['cve'][i] = False for i in opts.severity: used_map['sev'][i] = False return used_map def _ysp_chk_used_map(used_map, msg): for i in used_map['cmd']: if not used_map['cmd'][i]: msg('No update information found for \"%s\"' % i) for i in used_map['id']: if not used_map['id'][i]: msg('Advisory \"%s\" not found applicable for this system' % i) for i in used_map['bugzilla']: if not used_map['bugzilla'][i]: msg('BZ \"%s\" not found applicable for this system' % i) for i in used_map['cve']: if not used_map['cve'][i]: msg('CVE \"%s\" not found applicable for this system' % i) for i in used_map['sev']: if not used_map['sev'][i]: msg('Severity \"%s\" not found applicable for this system' % i) def _get_name2pkgtup(base, pkgtups): name2tup = {} for pkgtup in pkgtups: # Get the latest "old" pkgtups if (pkgtup[0] in name2tup and _rpm_tup_vercmp(name2tup[pkgtup[0]], pkgtup) > 0): continue name2tup[pkgtup[0]] = pkgtup return name2tup def _get_name2oldpkgtup(base): """ Get the pkgtups for all installed pkgs. which have an update. """ oupdates = map(lambda x: x[1], base.up.getUpdatesTuples()) return _get_name2pkgtup(base, oupdates) def _get_name2instpkgtup(base): """ Get the pkgtups for all installed pkgs. """ return _get_name2pkgtup(base, base.rpmdb.simplePkgList()) def _get_name2allpkgtup(base): """ Get the pkgtups for all installed pkgs. and munge that to be the first possible pkgtup. """ ofirst = [(pt[0], pt[1], '0','0','0') for pt in base.rpmdb.simplePkgList()] return _get_name2pkgtup(base, ofirst) def _get_name2aallpkgtup(base): """ Get the pkgtups for all available pkgs. and munge that to be the first possible pkgtup. """ ofirst = [(pt[0], pt[1],'0','0','0') for pt in base.pkgSack.simplePkgList()] return _get_name2pkgtup(base, ofirst) # You might think we'd just call delPackage # and indeed that works for list updates etc. # # __but__ that doesn't work for dependancies on real updates # # So to fix deps. we need to do it at the preresolve stage and take the # "transaction package list" and then remove packages from that. # # __but__ that doesn't work for lists ... so we do it two ways # def _ysp_should_keep_pkg(opts, pkgtup, md_info, used_map): """ Do we want to keep this package to satisfy the security limits. """ name = pkgtup[0] for (pkgtup, notice) in md_info.get_applicable_notices(pkgtup): if _ysp_should_filter_pkg(opts, name, notice, used_map): return True return False def _repos_downloaded(repos): dled = True for repo in repos: try: data = repo.repoXML.getData('updateinfo'); except: continue # No data is fine... # Note that this doesn't check that it's decompressed... path = repo.cachedir +'/'+ os.path.basename(data.location[1]) if not os.path.exists(path): dled = False break return dled def _check_running_kernel(yb, md_info, msg): kern_pkgtup = misc.get_running_kernel_pkgtup(yb.ts) if kern_pkgtup[0] is None: return found_sec = False for (pkgtup, notice) in md_info.get_applicable_notices(kern_pkgtup): if found_sec or notice['type'] != 'security': continue found_sec = True ipkg = yb.rpmdb.searchPkgTuple(pkgtup) if not ipkg: continue # Not installed ipkg = ipkg[0] e = '' if kern_pkgtup[2] != '0': e = '%s:' % kern_pkgtup[2] rpkg = '%s-%s%s-%s.%s' % (kern_pkgtup[0], e, kern_pkgtup[3], kern_pkgtup[4], kern_pkgtup[1]) msg(_('Security: %s is an installed security update') % ipkg) msg(_('Security: %s is the currently running version') % rpkg) break def remove_txmbrs(base, filters=None): ''' Remove packages from the transaction, using the updateinfo data. ''' def ysp_del_pkg(tspkg): """ Deletes a package within a transaction. """ base.verbose_logger.log(INFO_1, _(" --> %s from %s removed (updateinfo)") % (tspkg.po, tspkg.po.ui_from_repo)) tsinfo.remove(tspkg.pkgtup) if filters is None: filters = base.updateinfo_filters opts = _ysp_gen_opts(filters) if _no_options(opts): return 0, 0, 0 md_info = base.upinfo tot = 0 cnt = 0 used_map = _ysp_gen_used_map(opts) tsinfo = base.tsInfo tspkgs = tsinfo.getMembers() # Ok, here we keep any pkgs that pass "ysp" tests, then we keep all # related pkgs ... Ie. "installed" version marked for removal. keep_pkgs = set() count_states = set(TS_INSTALL_STATES + [TS_ERASE]) count_pkgs = set() for tspkg in tspkgs: if tspkg.output_state in count_states: count_pkgs.add(tspkg.po) name2tup = _get_name2oldpkgtup(base) for tspkg in tspkgs: if tspkg.output_state in count_states: tot += 1 name = tspkg.po.name if (name not in name2tup or not _ysp_should_keep_pkg(opts, name2tup[name], md_info, used_map)): continue if tspkg.output_state in count_states: cnt += 1 keep_pkgs.add(tspkg.po) scnt = cnt mini_depsolve_again = True while mini_depsolve_again: mini_depsolve_again = False for tspkg in tspkgs: if tspkg.po in keep_pkgs: # Find any related pkgs, and add them: for (rpkg, reason) in tspkg.relatedto: if rpkg not in keep_pkgs: if rpkg in count_pkgs: cnt += 1 keep_pkgs.add(rpkg) mini_depsolve_again = True else: # If related to any keep pkgs, add us for (rpkg, reason) in tspkg.relatedto: if rpkg in keep_pkgs: if rpkg in count_pkgs: cnt += 1 keep_pkgs.add(tspkg.po) mini_depsolve_again = True break for tspkg in tspkgs: if tspkg.po not in keep_pkgs: ysp_del_pkg(tspkg) _ysp_chk_used_map(used_map, lambda x: base.verbose_logger.warn("%s", x)) if cnt: base.verbose_logger.log(INFO_1, _('%d package(s) needed (+%d related) for security, out of %d available') % (scnt, cnt - scnt, tot)) else: base.verbose_logger.log(INFO_1, _('No packages needed for security; %d packages available') % tot) return cnt, scnt, tot def exclude_updates(base, filters=None): ''' Exclude all packages to do with updates, using the updateinfo data. ''' def ysp_del_pkg(pkg, reason="updateinfo"): """ Deletes a package from all trees that yum knows about """ base.verbose_logger.log(INFO_1, _(" --> %s from %s excluded (%s)") % (pkg,pkg.repoid, reason)) pkg.repo.sack.delPackage(pkg) if filters is None: filters = base.updateinfo_filters opts = _ysp_gen_opts(filters) if _no_options(opts): return 0, 0 md_info = base.upinfo used_map = _ysp_gen_used_map(opts) tot = len(set(base.doPackageLists(pkgnarrow='updates').updates + \ base.doPackageLists(pkgnarrow='obsoletes').obsoletes)) pkgs = base.pkgSack.returnPackages() name2tup = _get_name2oldpkgtup(base) pkgs_to_del = [] for pkg in pkgs: name = pkg.name if (name not in name2tup or not _ysp_should_keep_pkg(opts, name2tup[name], md_info, used_map)): pkgs_to_del.append(pkg.name) continue if pkgs_to_del: for p in base.doPackageLists(pkgnarrow='available', patterns=pkgs_to_del, showdups=True).available: ysp_del_pkg(p) cnt = len(set(base.doPackageLists(pkgnarrow='updates').updates + \ base.doPackageLists(pkgnarrow='obsoletes').obsoletes)) _ysp_chk_used_map(used_map, lambda x: base.verbose_logger.warn("%s", x)) if cnt: base.verbose_logger.log(INFO_1, _('%d package(s) needed for security, out of %d available') % (cnt, tot)) else: base.verbose_logger.log(INFO_1, _('No packages needed for security; %d packages available' % tot)) return cnt, tot def exclude_all(base, filters=None): ''' Exclude all packages, using the updateinfo data. ''' def ysp_del_pkg(pkg, reason="updateinfo"): """ Deletes a package from all trees that yum knows about """ base.verbose_logger.log(INFO_1, _(" --> %s from %s excluded (%s)") % (pkg,pkg.repoid, reason)) pkg.repo.sack.delPackage(pkg) if filters is None: filters = base.updateinfo_filters opts = _ysp_gen_opts(filters) if _no_options(opts): return 0, 0 md_info = base.upinfo used_map = _ysp_gen_used_map(opts) pkgs = base.pkgSack.returnPackages() name2tup = _get_name2aallpkgtup(base) tot = 0 cnt = 0 for pkg in pkgs: tot += 1 name = pkg.name if (name not in name2tup or not _ysp_should_keep_pkg(opts, name2tup[name], md_info, used_map)): ysp_del_pkg(pkg) continue cnt += 1 _ysp_chk_used_map(used_map, lambda x: base.verbose_logger.warn("%s", x)) if cnt: base.verbose_logger.log(INFO_1, _('%d package(s) needed for security, out of %d available') % (cnt, tot)) else: base.verbose_logger.log(INFO_1, _('No packages needed for security; %d packages available' % tot)) return cnt, tot def update_minimal(base, extcmds=[]): """Mark the specified items to be updated, in the minimal way. :param extcmds: the user specified arguments :return: a list of transaction members added to the transaction set by this function """ txmbrs = [] used_map = _ysp_gen_used_map(base.updateinfo_filters) opts = _ysp_gen_opts(base.updateinfo_filters) ndata = _no_options(opts) # NOTE: Not doing obsoletes processing atm. ... maybe we should? -- # Also worth pointing out we don't go backwards for obsoletes in the: # update --security case etc. # obsoletes = base.up.getObsoletesTuples(newest=False) # for (obsoleting, installed) in sorted(obsoletes, key=lambda x: x[0]): # pass # Tuples == (n, a, e, v, r) oupdates = map(lambda x: x[1], base.up.getUpdatesTuples()) for oldpkgtup in sorted(oupdates): data = base.upinfo.get_applicable_notices(oldpkgtup) if ndata: # No options means pick the oldest update data.reverse() for (pkgtup, notice) in data: name = pkgtup[0] if extcmds and not _match_sec_cmd(extcmds, name, notice): continue if (not ndata and not _ysp_should_filter_pkg(opts, name, notice, used_map)): continue txmbrs.extend(base.update(name=pkgtup[0], arch=pkgtup[1], epoch=pkgtup[2], version=pkgtup[3], release=pkgtup[4])) break # _ysp_chk_used_map(used_map, msg) return txmbrs PK[Zsite-packages/yum/pgpmsg.pynuȯ#! /usr/bin/python -tt ##Copyright (C) 2003,2005,2009 Jens B. Jorgensen ## ##This program is free software; you can redistribute it and/or ##modify it under the terms of the GNU General Public License ##as published by the Free Software Foundation; either version 2 ##of the License, or (at your option) any later version. ## ##This program is distributed in the hope that it will be useful, ##but WITHOUT ANY WARRANTY; without even the implied warranty of ##MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ##GNU General Public License for more details. ## ##You should have received a copy of the GNU General Public License ##along with this program; if not, write to the Free Software ##Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import struct, time, cStringIO, base64, types # We use this so that we can work on python-2.4 and python-2.6, and thus. # use import md5/import sha on the older one and import hashlib on the newer. # Stupid deprecation warnings. # pylint: disable-msg=W0108 # Ignore :W0108: *Lambda may not be necessary* try: import hashlib except ImportError: # Python-2.4.z ... gah! import sha import md5 class hashlib: @staticmethod def new(algo): if algo == 'md5': return md5.new() if algo == 'sha1': return sha.new() raise ValueError, "Bad checksum type" debug = None # Cypher Type Byte # bits 7,6 of the CTB say what kind it is # we only have reserved defined CTB_76_NORMAL = 0x80 CTB_76_NEW = 0xc0 CTB_76_MASK = 0xc0 # CTB packet type, bits 5,4,3,2 CTB_PKTV2_MASK = 0x3c # 1111 - mask for this field CTB_PKT_MASK = 0x3f # 111111 - all the lower bits CTB_PKT_PK_ENC = 1 # 0001 - public-key encrypted session packet CTB_PKT_SIG = 2 # 0010 - signature packet CTB_PKT_SK_ENC = 3 # 0011 - symmetric-key encrypted session packet CTB_PKT_OP_SIG = 4 # 0100 - one-pass signature packet CTB_PKT_SK_CERT = 5 # 0101 - secret-key certificate packet CTB_PKT_PK_CERT = 6 # 0110 - public-key certificate packet CTB_PKT_SK_SUB = 7 # 0111 - secret-key subkey packet CTB_PKT_COMPRESSED = 8 # 1000 - compressed data packet CTB_PKT_ENC = 9 # 1001 - symmetric-key encrypted data packet CTB_PKT_MARKER = 10 # 1010 - marker packet CTB_PKT_LIT = 11 # 1011 - literal data packet CTB_PKT_TRUST = 12 # 1100 - trust packet CTB_PKT_USER_ID = 13 # 1101 - user id packet CTB_PKT_PK_SUB = 14 # 1110 - public subkey packet CTB_PKT_USER_ATTR = 17 # 10001 - user attribute packet CTB_PKT_SYM_ENC_INT = 18 # 10010 - symmetric encrypted integrity packet CTB_PKT_MOD_DETECT = 19 # 10011 - modification detection code packet ctb_pkt_to_str = { CTB_PKT_PK_ENC : 'public-key encrypted session packet', CTB_PKT_SIG : 'signature packet', CTB_PKT_SK_ENC : 'symmetric-key encrypted session packet', CTB_PKT_OP_SIG : 'one-pass signature packet', CTB_PKT_SK_CERT : 'secret-key certificate packet', CTB_PKT_PK_CERT : 'public-key certificate packet', CTB_PKT_SK_SUB : 'secret-key subkey packet', CTB_PKT_COMPRESSED : 'compressed data packet', CTB_PKT_ENC : 'symmetric-key encrypted data packet', CTB_PKT_MARKER : 'marker packet', CTB_PKT_LIT : 'literal data packet', CTB_PKT_TRUST : 'trust packet', CTB_PKT_USER_ID : 'user id packet', CTB_PKT_PK_SUB : 'public subkey packet', CTB_PKT_USER_ATTR : 'user attribute packet', CTB_PKT_SYM_ENC_INT : 'symmetric encrypted integrity packet', CTB_PKT_MOD_DETECT : 'modification detection code packet' } # CTB packet-length CTB_PKT_LEN_MASK = 0x3 # 11 - mask CTB_PKT_LEN_1 = 0 # 00 - 1 byte CTB_PKT_LEN_2 = 1 # 01 - 2 bytes CTB_PKT_LEN_4 = 2 # 10 - 4 bytes CTB_PKT_LEN_UNDEF = 3 # 11 - no packet length supplied # Algorithms # Public Key Algorithms ALGO_PK_RSA_ENC_OR_SIGN = 1 # RSA (Encrypt or Sign) ALGO_PK_RSA_ENC_ONLY = 2 # RSA Encrypt-Only ALGO_PK_RSA_SIGN_ONLY = 3 # RSA Sign-Only ALGO_PK_ELGAMAL_ENC_ONLY = 16 # Elgamal (Encrypt-Only) ALGO_PK_DSA = 17 # DSA (Digital Signature Standard) ALGO_PK_ELLIPTIC_CURVE = 18 # Elliptic Curve ALGO_PK_ECDSA = 19 # ECDSA ALGO_PK_ELGAMAL_ENC_OR_SIGN = 20 # Elgamal (Encrypt or Sign) ALGO_PK_DH = 21 # Diffie-Hellman algo_pk_to_str = { ALGO_PK_RSA_ENC_OR_SIGN : 'RSA (Encrypt or Sign)', ALGO_PK_RSA_ENC_ONLY : 'RSA Encrypt-Only', ALGO_PK_RSA_SIGN_ONLY : 'RSA Sign-Only', ALGO_PK_ELGAMAL_ENC_ONLY : 'Elgamal Encrypt-Only', ALGO_PK_DSA : 'DSA (Digital Signature Standard)', ALGO_PK_ELLIPTIC_CURVE : 'Elliptic Curve', ALGO_PK_ECDSA : 'ECDSA', ALGO_PK_ELGAMAL_ENC_OR_SIGN : 'Elgamal (Encrypt or Sign)', ALGO_PK_DH : 'Diffie-Hellman' } # Symmetric Key Algorithms ALGO_SK_PLAIN = 0 # Plaintext or unencrypted data ALGO_SK_IDEA = 1 # IDEA ALGO_SK_3DES = 2 # Triple-DES ALGO_SK_CAST5 = 3 # CAST5 ALGO_SK_BLOWFISH = 4 # Blowfish ALGO_SK_SAFER_SK128 = 5 # SAFER-SK128 ALGO_SK_DES_SK = 6 # DES/SK ALGO_SK_AES_128 = 7 # AES 128-bit ALGO_SK_AES_192 = 8 # AES 192-bit ALGO_SK_AES_256 = 9 # AES 256-bit ALGO_SK_TWOFISH_256 = 10 # Twofish 256 algo_sk_to_str = { ALGO_SK_PLAIN : 'Plaintext or unencrypted data', ALGO_SK_IDEA : 'IDEA', ALGO_SK_3DES : 'Triple-DES', ALGO_SK_CAST5 : 'CAST5', ALGO_SK_BLOWFISH : 'Blowfish', ALGO_SK_SAFER_SK128 : 'SAFER-SK128', ALGO_SK_DES_SK : 'DES/SK', ALGO_SK_AES_128 : 'AES 128-bit', ALGO_SK_AES_192 : 'AES 192-bit', ALGO_SK_AES_256 : 'AES 256-bit', ALGO_SK_TWOFISH_256 : 'Twofish 256-bit' } # Compression Algorithms ALGO_COMP_UNCOMP = 0 # Uncompressed ALGO_COMP_ZIP = 1 # ZIP ALGO_COMP_ZLIB = 2 # ZLIB ALGO_COMP_BZIP2 = 3 # BZip2 algo_comp_to_str = { ALGO_COMP_UNCOMP : 'Uncompressed', ALGO_COMP_ZIP : 'ZIP', ALGO_COMP_ZLIB : 'ZLIB', ALGO_COMP_BZIP2 : 'BZip2' } # Hash Algorithms ALGO_HASH_MD5 = 1 # MD5 ALGO_HASH_SHA1 = 2 # SHA1 ALGO_HASH_RIPEMD160 = 3 # RIPEMD160 ALGO_HASH_SHA_DBL = 4 # double-width SHA ALGO_HASH_MD2 = 5 # MD2 ALGO_HASH_TIGER192 = 6 # TIGER192 ALGO_HASH_HAVAL_5_160 = 7 # HAVAL-5-160 ALGO_HASH_SHA256 = 8 # SHA256 ALGO_HASH_SHA384 = 9 # SHA384 ALGO_HASH_SHA512 = 10 # SHA512 ALGO_HASH_SHA224 = 11 # SHA224 algo_hash_to_str = { ALGO_HASH_MD5 : 'MD5', ALGO_HASH_SHA1 : 'SHA1', ALGO_HASH_RIPEMD160 : 'RIPEMD160', ALGO_HASH_SHA_DBL : 'double-width SHA', ALGO_HASH_MD2 : 'MD2', ALGO_HASH_TIGER192 : 'TIGER192', ALGO_HASH_HAVAL_5_160 : 'HAVAL-5-160', ALGO_HASH_SHA256 : 'SHA256', ALGO_HASH_SHA384 : 'SHA384', ALGO_HASH_SHA512 : 'SHA512', ALGO_HASH_SHA224 : 'SHA224' } # Signature types SIG_TYPE_DOCUMENT = 0x00 # document signature, binary image SIG_TYPE_DOCUMENT_CANON = 0x01 # document signature, canonical text SIG_TYPE_STANDALONE = 0x02 # signature over just subpackets SIG_TYPE_PK_USER_GEN = 0x10 # public key packet and user ID packet, generic certification SIG_TYPE_PK_USER_PER = 0x11 # public key packet and user ID packet, persona SIG_TYPE_PK_USER_CAS = 0x12 # public key packet and user ID packet, casual certification SIG_TYPE_PK_USER_POS = 0x13 # public key packet and user ID packet, positive certification SIG_TYPE_SUBKEY_BIND = 0x18 # subkey binding SIG_TYPE_KEY = 0x1F # key signature SIG_TYPE_KEY_REVOKE = 0x20 # key revocation SIG_TYPE_SUBKEY_REVOKE = 0x28 # subkey revocation SIG_TYPE_CERT_REVOKE = 0x30 # certificate revocation SIG_TYPE_TIMESTAMP = 0x40 # timestamp sig_type_to_str = { SIG_TYPE_DOCUMENT : 'document signature, binary image', SIG_TYPE_DOCUMENT_CANON : 'document signature, canonical text', SIG_TYPE_STANDALONE : 'signature over just subpackets', SIG_TYPE_PK_USER_GEN : 'public key packet and user ID packet, generic certification', SIG_TYPE_PK_USER_PER : 'public key packet and user ID packet, persona', SIG_TYPE_PK_USER_CAS : 'public key packet and user ID packet, casual certification', SIG_TYPE_PK_USER_POS : 'public key packet and user ID packet, positive certification', SIG_TYPE_SUBKEY_BIND : 'subkey binding', SIG_TYPE_KEY : 'key signature', SIG_TYPE_KEY_REVOKE : 'key revocation', SIG_TYPE_SUBKEY_REVOKE : 'subkey revocation', SIG_TYPE_CERT_REVOKE : 'certificate revocation', SIG_TYPE_TIMESTAMP : 'timestamp' } # Signature sub-packet types SIG_SUB_TYPE_CREATE_TIME = 2 # signature creation time SIG_SUB_TYPE_EXPIRE_TIME = 3 # signature expiration time SIG_SUB_TYPE_EXPORT_CERT = 4 # exportable certification SIG_SUB_TYPE_TRUST_SIG = 5 # trust signature SIG_SUB_TYPE_REGEXP = 6 # regular expression SIG_SUB_TYPE_REVOCABLE = 7 # revocable SIG_SUB_TYPE_KEY_EXPIRE = 9 # key expiration time SIG_SUB_TYPE_PLACEHOLDER = 10 # placeholder for backward compatibility SIG_SUB_TYPE_PREF_SYMM_ALGO = 11 # preferred symmetric algorithms SIG_SUB_TYPE_REVOKE_KEY = 12 # revocation key SIG_SUB_TYPE_ISSUER_KEY_ID = 16 # issuer key ID SIG_SUB_TYPE_NOTATION = 20 # notation data SIG_SUB_TYPE_PREF_HASH_ALGO = 21 # preferred hash algorithms SIG_SUB_TYPE_PREF_COMP_ALGO = 22 # preferred compression algorithms SIG_SUB_TYPE_KEY_SRV_PREF = 23 # key server preferences SIG_SUB_TYPE_PREF_KEY_SRVR = 24 # preferred key server SIG_SUB_TYPE_PRIM_USER_ID = 25 # primary user id SIG_SUB_TYPE_POLICY_URI = 26 # policy URI SIG_SUB_TYPE_KEY_FLAGS = 27 # key flags SIG_SUB_TYPE_SGNR_USER_ID = 28 # signer's user id SIG_SUB_TYPE_REVOKE_REASON = 29 # reason for revocation SIG_SUB_TYPE_FEATURES = 30 # features SIG_SUB_TYPE_SIG_TARGET = 31 # signature target SIG_SUB_TYPE_EMBEDDED_SIG = 32 # embedded signature sig_sub_type_to_str = { SIG_SUB_TYPE_CREATE_TIME : 'signature creation time', SIG_SUB_TYPE_EXPIRE_TIME : 'signature expiration time', SIG_SUB_TYPE_EXPORT_CERT : 'exportable certification', SIG_SUB_TYPE_TRUST_SIG : 'trust signature', SIG_SUB_TYPE_REGEXP : 'regular expression', SIG_SUB_TYPE_REVOCABLE : 'revocable', SIG_SUB_TYPE_KEY_EXPIRE : 'key expiration time', SIG_SUB_TYPE_PLACEHOLDER : 'placeholder for backward compatibility', SIG_SUB_TYPE_PREF_SYMM_ALGO : 'preferred symmetric algorithms', SIG_SUB_TYPE_REVOKE_KEY : 'revocation key', SIG_SUB_TYPE_ISSUER_KEY_ID : 'issuer key ID', SIG_SUB_TYPE_NOTATION : 'notation data', SIG_SUB_TYPE_PREF_HASH_ALGO : 'preferred hash algorithms', SIG_SUB_TYPE_PREF_COMP_ALGO : 'preferred compression algorithms', SIG_SUB_TYPE_KEY_SRV_PREF : 'key server preferences', SIG_SUB_TYPE_PREF_KEY_SRVR : 'preferred key server', SIG_SUB_TYPE_PRIM_USER_ID : 'primary user id', SIG_SUB_TYPE_POLICY_URI : 'policy URI', SIG_SUB_TYPE_KEY_FLAGS : 'key flags', SIG_SUB_TYPE_SGNR_USER_ID : "signer's user id", SIG_SUB_TYPE_REVOKE_REASON : 'reason for revocation', SIG_SUB_TYPE_FEATURES : 'features', SIG_SUB_TYPE_SIG_TARGET : 'signature target', SIG_SUB_TYPE_EMBEDDED_SIG : 'embedded signature' } # in a signature subpacket there may be a revocation reason, these codes indicate # the reason REVOKE_REASON_NONE = 0 # No reason specified REVOKE_REASON_SUPER = 0x01 # Key is superceded REVOKE_REASON_COMPR = 0x02 # Key has been compromised REVOKE_REASON_NOT_USED = 0x03 # Key is no longer used REVOKE_REASON_ID_INVALID = 0x20 # user id information is no longer valid revoke_reason_to_str = { REVOKE_REASON_NONE : 'No reason specified', REVOKE_REASON_SUPER : 'Key is superceded', REVOKE_REASON_COMPR : 'Key has been compromised', REVOKE_REASON_NOT_USED : 'Key is no longer used', REVOKE_REASON_ID_INVALID : 'user id information is no longer valid' } # These flags are used in a 'key flags' signature subpacket KEY_FLAGS1_MAY_CERTIFY = 0x01 # This key may be used to certify other keys KEY_FLAGS1_MAY_SIGN = 0x02 # This key may be used to sign data KEY_FLAGS1_MAY_ENC_COMM = 0x04 # This key may be used to encrypt communications KEY_FLAGS1_MAY_ENC_STRG = 0x08 # This key may be used to encrypt storage KEY_FLAGS1_PRIV_MAYBE_SPLIT = 0x10 # Private component have be split through secret-sharing mech. KEY_FLAGS1_GROUP = 0x80 # Private component may be among group # A revocation key subpacket has these class values REVOKE_KEY_CLASS_MAND = 0x80 # this bit must always be set REVOKE_KEY_CLASS_SENS = 0x40 # sensitive # Features may be indicated in a signature hashed subpacket PGP_FEATURE_1_MOD_DETECT = 0x01 # Modification detection pgp_feature_to_str = { PGP_FEATURE_1_MOD_DETECT : 'Modification Detection' } def get_whole_number(msg, idx, numlen) : """get_whole_number(msg, idx, numlen) extracts a "whole number" field of length numlen from msg at index idx returns (, new_idx) where the whole number is a long integer and new_idx is the index of the next element in the message""" n = 0L while numlen > 0 : b = (struct.unpack("B", msg[idx:idx+1]))[0] n = n * 256L + long(b) idx = idx + 1 numlen = numlen - 1 return (n, idx) def get_whole_int(msg, idx, numlen) : """get_whole_int(msg, idx, numlen) same as get_whole_number but returns the number as an int for convenience""" n, idx = get_whole_number(msg, idx, numlen) return int(n), idx def pack_long(l) : """pack_long(l) returns big-endian representation of unsigned long integer""" arr = [] while l > 0 : arr.insert(0, struct.pack("B", l & 0xff)) l >>= 8 return ''.join(arr) def pack_mpi(l) : """pack_mpi(l) returns the PGP Multi-Precision Integer representation of unsigned long integer""" s = pack_long(l) # the len is the number of bits, counting only from the MSB, # so we need to account for that bits = (len(s) - 1) * 8 if len(s) > 0 : n = ord(s[0]) while n != 0 : bits += 1 n >>= 1 else : bits = 0 # otherwise bits == -8 return struct.pack(">H", bits) + s def get_sig_subpak_len(msg, idx) : """get_sig_subpak_len(msg, idx) extracts a signature subpacket length field returns (subpak_len, new_idx)""" plen, idx = get_whole_int(msg, idx, 1) if plen < 192 : return plen, idx if plen < 255 : plen2, idx = get_whole_int(msg, idx, 1) return ((plen - 192) << 8) + plen2 + 192, idx return get_whole_int(msg, idx, 4) def get_n_mpi(msg, idx) : """get_mpi(msg, idx) extracts a multi-precision integer field from the message msg at index idx returns (n, , new_idx) where the mpi is a long integer and new_idx is the index of the next element in the message and n is the number of bits of precision in """ ln, idx = get_whole_int(msg, idx, 2) return (ln,) + get_whole_number(msg, idx, (ln+7)/8) def get_mpi(msg, idx) : """get_mpi(msg, idx) extracts a multi-precision integer field from the message msg at index idx returns (, new_idx) where the mpi is a long integer and new_idx is the index of the next element in the message""" l = get_n_mpi(msg, idx) return (l[1], l[2]) def str_to_hex(s) : return ''.join(map(lambda x : hex(ord(x))[2:].zfill(2), list(s))) def duration_to_str(s) : if s == 0 : return 'never' secs = s % 60 s = s / 60 mins = s % 60 s = s / 60 hrs = s % 60 s = s / 24 days = s return '%d days %02d:%02d:%02d' % (days, hrs, mins, secs) def map_to_str(m, vals) : slist = [] # change to a list if it's a single value if type(vals) != types.ListType and type(vals) != types.TupleType : vals = list((vals,)) for i in vals : if i in m : slist.append(m[i]) else : slist.append('unknown(' + str(i) + ')') return ', '.join(slist) class pgp_packet(object) : def __init__(self) : self.pkt_typ = None def __str__(self) : return map_to_str(ctb_pkt_to_str, self.pkt_typ) class public_key(pgp_packet) : def __init__(self) : pgp_packet.__init__(self) self.version = None self.pk_algo = None self.key_size = 0 self.fingerprint_ = None # we cache this upon calculation def fingerprint(self) : # return cached value if we have it if self.fingerprint_ : return self.fingerprint_ # otherwise calculate it now and cache it # v3 and v4 are calculated differently if self.version == 3 : h = hashlib.new('md5') h.update(pack_long(self.pk_rsa_mod)) h.update(pack_long(self.pk_rsa_exp)) self.fingerprint_ = h.digest() elif self.version == 4 : # we hash what would be the whole PGP message containing # the pgp certificate h = hashlib.new('sha1') h.update('\x99') # we need to has the length of the packet as well buf = self.serialize() h.update(struct.pack(">H", len(buf))) h.update(buf) self.fingerprint_ = h.digest() else : raise RuntimeError("unknown public key version %d" % self.version) return self.fingerprint_ def key_id(self) : if self.version == 3 : return pack_long(self.pk_rsa_mod & 0xffffffffffffffffL) elif self.version == 4 : return self.fingerprint()[-8:] def serialize(self) : chunks = [] if self.version == 3 : chunks.append(struct.pack('>BIHB', self.version, int(self.timestamp), self.validity, self.pk_algo)) chunks.append(pack_mpi(self.pk_rsa_mod)) chunks.append(pack_mpi(self.pk_rsa_exp)) elif self.version == 4 : chunks.append(struct.pack('>BIB', self.version, int(self.timestamp), self.pk_algo)) if self.pk_algo == ALGO_PK_RSA_ENC_OR_SIGN or self.pk_algo == ALGO_PK_RSA_SIGN_ONLY : chunks.append(pack_mpi(self.pk_rsa_mod)) chunks.append(pack_mpi(self.pk_rsa_exp)) elif self.pk_algo == ALGO_PK_DSA : chunks.append(pack_mpi(self.pk_dsa_prime_p)) chunks.append(pack_mpi(self.pk_dsa_grp_ord_q)) chunks.append(pack_mpi(self.pk_dsa_grp_gen_g)) chunks.append(pack_mpi(self.pk_dsa_pub_key)) elif self.pk_algo == ALGO_PK_ELGAMAL_ENC_OR_SIGN or self.pk_algo == ALGO_PK_ELGAMAL_ENC_ONLY : chunks.append(pack_mpi(self.pk_elgamal_prime_p)) chunks.append(pack_mpi(self.pk_elgamal_grp_gen_g)) chunks.append(pack_mpi(self.pk_elgamal_pub_key)) else : raise RuntimeError("unknown public key algorithm %d" % (self.pk_algo)) return ''.join(chunks) def deserialize(self, msg, idx, pkt_len) : idx_save = idx self.version, idx = get_whole_int(msg, idx, 1) if self.version != 2 and self.version != 3 and self.version != 4 : raise RuntimeError('unknown public key packet version %d at %d' % (self.version, idx_save)) if self.version == 2 : # map v2 into v3 for coding simplicity since they're structurally the same self.version = 3 self.timestamp, idx = get_whole_number(msg, idx, 4) self.timestamp = float(self.timestamp) if self.version == 3 : self.validity, idx = get_whole_number(msg, idx, 2) self.pk_algo, idx = get_whole_int(msg, idx, 1) if self.pk_algo == ALGO_PK_RSA_ENC_OR_SIGN or self.pk_algo == ALGO_PK_RSA_SIGN_ONLY : self.key_size, self.pk_rsa_mod, idx = get_n_mpi(msg, idx) self.pk_rsa_exp, idx = get_mpi(msg, idx) elif self.pk_algo == ALGO_PK_DSA : l1, self.pk_dsa_prime_p, idx = get_n_mpi(msg, idx) self.pk_dsa_grp_ord_q, idx = get_mpi(msg, idx) self.pk_dsa_grp_gen_g, idx = get_mpi(msg, idx) l2, self.pk_dsa_pub_key, idx = get_n_mpi(msg, idx) self.key_size = l1 + l2 elif self.pk_algo == ALGO_PK_ELGAMAL_ENC_OR_SIGN or self.pk_algo == ALGO_PK_ELGAMAL_ENC_ONLY : self.key_size, self.pk_elgamal_prime_p, idx = get_n_mpi(msg, idx) self.pk_elgamal_grp_gen_g, idx = get_mpi(msg, idx) self.pk_elgamal_pub_key, idx = get_mpi(msg, idx) else : raise RuntimeError("unknown public key algorithm %d at %d" % (self.pk_algo, idx_save)) def __str__(self) : sio = cStringIO.StringIO() sio.write(pgp_packet.__str__(self) + "\n") sio.write("version: " + str(self.version) + "\n") sio.write("timestamp: " + time.ctime(self.timestamp) + "\n") if self.version == 3 : sio.write("validity: " + time.ctime(self.timestamp + self.validity * 24 * 60 * 60) + "\n") sio.write("pubkey algo: " + algo_pk_to_str[self.pk_algo] + "\n") if self.pk_algo == ALGO_PK_RSA_ENC_OR_SIGN or self.pk_algo == ALGO_PK_RSA_SIGN_ONLY : sio.write("pk_rsa_mod: " + hex(self.pk_rsa_mod) + "\n") sio.write("pk_rsa_exp: " + hex(self.pk_rsa_exp) + "\n") elif self.pk_algo == ALGO_PK_DSA : sio.write("pk_dsa_prime_p: " + hex(self.pk_dsa_prime_p) + "\n") sio.write("pk_dsa_grp_ord_q: " + hex(self.pk_dsa_grp_ord_q) + "\n") sio.write("pk_dsa_grp_gen_g: " + hex(self.pk_dsa_grp_gen_g) + "\n") sio.write("pk_dsa_pub_key: " + hex(self.pk_dsa_pub_key) + "\n") elif self.pk_algo == ALGO_PK_ELGAMAL_ENC_OR_SIGN or self.pk_algo == ALGO_PK_ELGAMAL_ENC_ONLY : sio.write("pk_elgamal_prime_p: " + hex(self.pk_elgamal_prime_p) + "\n") sio.write("pk_elgamal_grp_gen_g: " + hex(self.pk_elgamal_grp_gen_g) + "\n") sio.write("pk_elgamal_pub_key: " + hex(self.pk_elgamal_pub_key) + "\n") return sio.getvalue() class user_id(pgp_packet) : def __init__(self) : pgp_packet.__init__(self) self.id = None def deserialize(self, msg, idx, pkt_len) : self.id = msg[idx:idx + pkt_len] def __str__(self) : return pgp_packet.__str__(self) + "\n" + "id: " + self.id + "\n" class user_attribute(pgp_packet) : def __init__(self) : pgp_packet.__init__(self) self.sub_type = None self.data = None def deserialize(self, msg, idx, pkt_len) : self.sub_type, idx = get_whole_int(msg, idx, 1) pkt_len = pkt_len - 1 self.data = msg[idx:idx + pkt_len] def __str__(self) : return pgp_packet.__str__(self) + "\n" + "sub_type: " + str(self.sub_type) + "\ndata: " + str_to_hex(self.data) class signature(pgp_packet) : def __init__(self) : pgp_packet.__init__(self) self.version = None self.sig_type = None self.pk_algo = None self.hash_algo = None self.hash_frag = None def key_id(self) : if self.version == 3 : return self.key_id_ else : i = self.get_hashed_subpak(SIG_SUB_TYPE_ISSUER_KEY_ID) if i : return i[1] i = self.get_unhashed_subpak(SIG_SUB_TYPE_ISSUER_KEY_ID) if i : return i[1] return None def creation_time(self) : if self.version == 3 : return self.timestamp else : i = self.get_hashed_subpak(SIG_SUB_TYPE_CREATE_TIME) return i[1] def expiration(self) : if self.version != 4 : raise ValueError('v3 signatures don\'t have expirations') i = self.get_hashed_subpak(SIG_SUB_TYPE_KEY_EXPIRE) if i : return i[1] return 0 # if not present then it never expires def get_hashed_subpak(self, typ) : for i in self.hashed_subpaks : if i[0] == typ : return i return None def get_unhashed_subpak(self, typ) : for i in self.unhashed_subpaks : if i[0] == typ : return i return None def deserialize_subpacket(self, msg, idx) : sublen, idx = get_sig_subpak_len(msg, idx) subtype, idx = get_whole_int(msg, idx, 1) if subtype == SIG_SUB_TYPE_CREATE_TIME : # key creation time tm, idx = get_whole_number(msg, idx, 4) return (subtype, float(tm)), idx if subtype == SIG_SUB_TYPE_EXPIRE_TIME or subtype == SIG_SUB_TYPE_KEY_EXPIRE : s, idx = get_whole_int(msg, idx, 4) return (subtype, s), idx if subtype == SIG_SUB_TYPE_EXPORT_CERT or subtype == SIG_SUB_TYPE_REVOCABLE : bool, idx = get_whole_int(msg, idx, 1) return (subtype, bool), idx if subtype == SIG_SUB_TYPE_TRUST_SIG : # trust signature trust_lvl, idx = get_whole_int(msg, idx, 1) trust_amt, idx = get_whole_int(msg, idx, 1) return (subtype, trust_lvl, trust_amt), idx if subtype == SIG_SUB_TYPE_REGEXP : # regular expression expr = msg[idx:idx+sublen-1] idx = idx + sublen - 1 return (subtype, expr), idx if subtype == SIG_SUB_TYPE_PREF_SYMM_ALGO or subtype == SIG_SUB_TYPE_PREF_HASH_ALGO or subtype == SIG_SUB_TYPE_PREF_COMP_ALGO or subtype == SIG_SUB_TYPE_KEY_FLAGS : algo_list = map(lambda x : ord(x), list(msg[idx:idx+sublen-1])) idx = idx + sublen - 1 return (subtype, algo_list), idx if subtype == SIG_SUB_TYPE_REVOKE_KEY : # revocation key cls, idx = get_whole_int(msg, idx, 1) algo, idx = get_whole_int(msg, idx, 1) fprint = msg[idx:idx+20] idx = idx + 20 return (subtype, cls, algo, fprint), idx if subtype == SIG_SUB_TYPE_ISSUER_KEY_ID : # issuer key ID k_id = msg[idx:idx+8] idx = idx + 8 return (subtype, k_id), idx if subtype == SIG_SUB_TYPE_NOTATION : # notation data flg1, idx = get_whole_int(msg, idx, 1) flg2, idx = get_whole_int(msg, idx, 1) flg3, idx = get_whole_int(msg, idx, 1) flg4, idx = get_whole_int(msg, idx, 1) name_len, idx = get_whole_int(msg, idx, 2) val_len, idx = get_whole_int(msg, idx, 2) nam = msg[idx:idx+name_len] idx = idx + name_len val = msg[idx:idx+val_len] idx = idx + val_len return (subtype, flg1, flg2, flg3, flg4, nam, val), idx if subtype == SIG_SUB_TYPE_KEY_SRV_PREF : # key server preferences prefs = [ ord(x) for x in msg[idx:idx+sublen-1] ] idx = idx + sublen - 1 return (subtype, prefs), idx if subtype == SIG_SUB_TYPE_PREF_KEY_SRVR : # preferred key server url = msg[idx:idx+sublen-1] idx = idx + sublen - 1 return (subtype, url), idx if subtype == SIG_SUB_TYPE_PRIM_USER_ID : # primary user id bool, idx = get_whole_int(msg, idx, 1) return (subtype, bool), idx if subtype == SIG_SUB_TYPE_POLICY_URI : # policy URI uri = msg[idx:idx+sublen-1] idx = idx + sublen - 1 return (subtype, uri), idx if subtype == SIG_SUB_TYPE_SGNR_USER_ID : # signer's user id signer_id = msg[idx:idx+sublen-1] idx = idx + sublen - 1 return (subtype, signer_id), idx if subtype == SIG_SUB_TYPE_REVOKE_REASON : # reason for revocation rev_code, idx = get_whole_int(msg, idx, 1) reas_len = sublen - 2 reas = msg[idx:idx+reas_len] idx = idx + reas_len return (subtype, rev_code, reas), idx if subtype == SIG_SUB_TYPE_FEATURES : # features sublen = sublen - 1 l = [subtype] while sublen > 0 : oct, idx = get_whole_int(msg, idx, 1) l.append(oct) sublen = sublen - 1 return tuple(l), idx if subtype == SIG_SUB_TYPE_SIG_TARGET : # signature target public_key_algo, idx = get_whole_int(msg, idx, 1) hash_algo, idx = get_whole_int(msg, idx, 1) hash = msg[idx:idx+sublen-3] idx = idx + sublen - 3 return (subtype, public_key_algo, hash_algo, hash), idx if subtype == SIG_SUB_TYPE_EMBEDDED_SIG : # embedded signature # don't do anything fancy, just the raw bits dat = msg[idx:idx+sublen-1] idx = idx + sublen - 1 return (subtype, dat), idx # otherwise the subpacket is an unknown type, so we just pack the data in it dat = msg[idx:idx+sublen-1] idx = idx + sublen - 1 return (subtype, dat), idx def is_primary_user_id(self) : """is_primary_user_id() returns true if this signature contains a primary user id subpacket with value true""" for i in self.hashed_subpaks : if i[0] == SIG_SUB_TYPE_PRIM_USER_ID : return i[1] return 0 def subpacket_to_str(self, sp) : if sp[0] == SIG_SUB_TYPE_CREATE_TIME : # signature creation time return 'creation time: ' + time.ctime(sp[1]) if sp[0] == SIG_SUB_TYPE_EXPIRE_TIME : # signature expiration time return 'signature expires: ' + duration_to_str(sp[1]) if sp[0] == SIG_SUB_TYPE_EXPORT_CERT : # exportable certification if sp[1] : return 'signature exportable: TRUE' else : return 'signature exportable: FALSE' if sp[0] == SIG_SUB_TYPE_TRUST_SIG : # trust signature if sp[1] == 0 : return 'trust: ordinary' if sp[1] == 1 : return 'trust: introducer (%d)' % sp[2] if sp[1] == 2 : return 'trust: meta-introducer (%d)' % sp[2] return 'trust: %d %d' % (sp[1], sp[2]) if sp[0] == SIG_SUB_TYPE_REGEXP : # regular expression return 'regexp: ' + sp[1] if sp[0] == SIG_SUB_TYPE_REVOCABLE : # revocable if sp[1] : return 'signature revocable: TRUE' else : return 'signature revocable: FALSE' if sp[0] == SIG_SUB_TYPE_KEY_EXPIRE : # key expiration time return 'key expires: ' + duration_to_str(sp[1]) if sp[0] == SIG_SUB_TYPE_PREF_SYMM_ALGO : # preferred symmetric algorithms return 'preferred symmetric algorithms: ' + map_to_str(algo_sk_to_str, sp[1]) if sp[0] == SIG_SUB_TYPE_REVOKE_KEY : # revocation key s = 'revocation key: ' if sp[1] & REVOKE_KEY_CLASS_SENS : s = s + '(sensitive) ' return s + map_to_str(algo_pk_to_str, sp[2]) + ' ' + str_to_hex(sp[3]) if sp[0] == SIG_SUB_TYPE_ISSUER_KEY_ID : # issuer key ID return 'issuer key id: ' + str_to_hex(sp[1]) if sp[0] == SIG_SUB_TYPE_NOTATION : # notation data return 'notation: flags(%d, %d, %d, %d) name(%s) value(%s)' % sp[1:] if sp[0] == SIG_SUB_TYPE_PREF_HASH_ALGO : # preferred hash algorithms return 'preferred hash algorithms: ' + map_to_str(algo_hash_to_str, sp[1]) if sp[0] == SIG_SUB_TYPE_PREF_COMP_ALGO : # preferred compression algorithms return 'preferred compression algorithms: ' + map_to_str(algo_comp_to_str, sp[1]) if sp[0] == SIG_SUB_TYPE_KEY_SRV_PREF : # key server preferences s = 'key server preferences: ' prefs = [] if sp[1][0] & 0x80 : prefs.append('No-modify') return s + ', '.join(prefs) if sp[0] == SIG_SUB_TYPE_PREF_KEY_SRVR : # preferred key server return 'preferred key server: %s' % sp[1] if sp[0] == SIG_SUB_TYPE_PRIM_USER_ID : # primary user id if sp[1] : return 'is primary user id' else : return 'is not primary user id' if sp[0] == SIG_SUB_TYPE_POLICY_URI : # policy URL return 'policy url: %s' % sp[1] if sp[0] == SIG_SUB_TYPE_KEY_FLAGS : # key flags flags = [] flgs1 = 0 if len(sp[1]) >= 1 : flgs1 = sp[1][0] if flgs1 & KEY_FLAGS1_MAY_CERTIFY : flags.append('may certify other keys') if flgs1 & KEY_FLAGS1_MAY_SIGN : flags.append('may sign data') if flgs1 & KEY_FLAGS1_MAY_ENC_COMM : flags.append('may encrypt communications') if flgs1 & KEY_FLAGS1_MAY_ENC_STRG : flags.append('may encrypt storage') if flgs1 & KEY_FLAGS1_PRIV_MAYBE_SPLIT : flags.append('private component may have been secret-sharing split') if flgs1 & KEY_FLAGS1_GROUP : flags.append('group key') return 'key flags: ' + ', '.join(flags) if sp[0] == SIG_SUB_TYPE_SGNR_USER_ID : # signer's user id return 'signer id: ' + sp[1] if sp[0] == SIG_SUB_TYPE_REVOKE_REASON : # reason for revocation reas = revoke_reason_to_str.get(sp[1], '') return 'reason for revocation: %s, %s' % (reas, sp[2]) if sp[0] == SIG_SUB_TYPE_FEATURES : # features features = [] if len(sp) > 1 : val = sp[1] if val & PGP_FEATURE_1_MOD_DETECT : features.append('Modification Detection') val = val & ~PGP_FEATURE_1_MOD_DETECT if val != 0 : features.append('[0]=0x%x' % val) for i in range(2, len(sp)) : features.append('[%d]=0x%x' % (i-1,sp[i])) return 'features: ' + ', '.join(features) # this means we don't know what the thing is so we just have raw data return 'unknown(%d): %s' % (sp[0], str_to_hex(sp[1])) def deserialize(self, msg, idx, pkt_len) : self.version, idx = get_whole_int(msg, idx, 1) if self.version == 2 : self.version = 3 if self.version == 3 : hash_len, idx = get_whole_number(msg, idx, 1) self.sig_type, idx = get_whole_int(msg, idx, 1) self.timestamp, idx = get_whole_number(msg, idx, 4) self.timestamp = float(self.timestamp) self.key_id_ = msg[idx:idx+8] idx = idx + 8 self.pk_algo, idx = get_whole_int(msg, idx, 1) self.hash_algo, idx = get_whole_int(msg, idx, 1) elif self.version == 4: self.sig_type, idx = get_whole_int(msg, idx, 1) self.pk_algo, idx = get_whole_int(msg, idx, 1) self.hash_algo, idx = get_whole_int(msg, idx, 1) sub_paks_len, idx = get_whole_int(msg, idx, 2) sub_paks_end = idx + sub_paks_len self.hashed_subpaks = [] while idx < sub_paks_end : sp, idx = self.deserialize_subpacket(msg, idx) self.hashed_subpaks.append(sp) sub_paks_len, idx = get_whole_int(msg, idx, 2) sub_paks_end = idx + sub_paks_len self.unhashed_subpaks = [] while idx < sub_paks_end : sp, idx = self.deserialize_subpacket(msg, idx) self.unhashed_subpaks.append(sp) else : raise RuntimeError('unknown signature packet version %d at %d' % (self.version, idx)) self.hash_frag, idx = get_whole_number(msg, idx, 2) if self.pk_algo == ALGO_PK_RSA_ENC_OR_SIGN or self.pk_algo == ALGO_PK_RSA_SIGN_ONLY : self.rsa_sig, idx = get_mpi(msg, idx) elif self.pk_algo == ALGO_PK_DSA : self.dsa_sig_r, idx = get_mpi(msg, idx) self.dsa_sig_s, idx = get_mpi(msg, idx) else : raise RuntimeError('unknown public-key algorithm (%d) in signature at %d' % (self.pk_algo, idx)) return idx def __str__(self) : sio = cStringIO.StringIO() sio.write(pgp_packet.__str__(self) + "\n") sio.write("version: " + str(self.version) + "\n") sio.write("type: " + sig_type_to_str[self.sig_type] + "\n") if self.version == 3 : sio.write("timestamp: " + time.ctime(self.timestamp) + "\n") sio.write("key_id: " + str_to_hex(self.key_id_) + "\n") elif self.version == 4 : sio.write("hashed subpackets:\n") for i in self.hashed_subpaks : sio.write(" " + self.subpacket_to_str(i) + "\n") sio.write("unhashed subpackets:\n") for i in self.unhashed_subpaks : sio.write(" " + self.subpacket_to_str(i) + "\n") sio.write("hash_algo: " + algo_hash_to_str[self.hash_algo] + "\n") sio.write("hash_frag: " + hex(self.hash_frag) + "\n") if self.pk_algo == ALGO_PK_RSA_ENC_OR_SIGN or self.pk_algo == ALGO_PK_RSA_SIGN_ONLY : sio.write("pk_algo: RSA\n") sio.write("rsa_sig: " + hex(self.rsa_sig) + "\n") elif self.pk_algo == ALGO_PK_DSA : sio.write("pk_algo: DSA\n") sio.write("dsa_sig_r: " + hex(self.dsa_sig_r) + "\n") sio.write("dsa_sig_s: " + hex(self.dsa_sig_s) + "\n") return sio.getvalue() # # This class encapsulates an openpgp public "certificate", which is formed in a message as # a series of PGP packets of certain types in certain orders # class pgp_certificate(object): def __init__(self) : self.version = None self.public_key = None self.revocations = [] self.user_ids = [] self.primary_user_id = -1 # index of the primary user id def __str__(self) : sio = cStringIO.StringIO() sio.write("PGP Public Key Certificate v%d\n" % self.version) sio.write("Cert ID: %s\n" % str_to_hex(self.public_key.key_id())) sio.write("Primary ID: %s\n" % self.user_id) sio.write(str(self.public_key)) for uid in self.user_ids : sio.write(str(uid[0])) for sig in uid[1:] : sio.write(" " + str(sig)) if hasattr(self, 'user_attrs') : for uattr in self.user_attrs : sio.write(' ') sio.write(str(uattr[0])) for sig in uattr[1:] : sio.write(" " + str(sig)) return sio.getvalue() def get_user_id(self): # take the LAST one in the list, not first # they appear to be ordered FIFO from the key and that means if you # added a key later then it won't show the one you expect return self.user_ids[self.primary_user_id][0].id user_id = property(get_user_id) def expiration(self) : if self.version == 3 : if self.public_key.validity == 0 : return 0 return self.public_key.timestamp + self.public_key.validity * 24 * 60 * 60 else : # self.version == 4 # this is a bit more complex, we need to find the signature on the # key and get its expiration u_id = self.user_ids[0] for i in u_id[1:] : if i.sig_type == SIG_TYPE_PK_USER_GEN : exp = i.expiration() if exp == 0 : return 0 return self.public_key.timestamp + exp return 0 def key_size(self) : return 0 def load(self, pkts) : """load(pkts) Initialize the pgp_certificate with a list of OpenPGP packets. The list of packets will be scanned to make sure they are valid for a pgp certificate.""" # each certificate should begin with a public key packet if pkts[0].pkt_typ != CTB_PKT_PK_CERT : raise ValueError('first PGP packet should be a public-key packet, not %s' % map_to_str(ctb_pkt_to_str, pkts[0].pkt_typ)) # all versions have a public key although in a v4 cert the main key is only # used for signing, never encryption self.public_key = pkts[0] # ok, then what's the version self.version = self.public_key.version # now the behavior splits a little depending on the version if self.version == 3 : pkt_idx = 1 # zero or more revocations while pkts[pkt_idx].pkt_typ == CTB_PKT_SIG : if pkts[pkt_idx].version != 3 : raise ValueError('version 3 cert has version %d signature' % pkts[pkt_idx].version) if pkts[pkt_idx].sig_type != SIG_TYPE_KEY_REVOKE : raise ValueError('v3 cert revocation sig has type %s' % map_to_str(sig_type_to_str, pkts[pkt_idx].sig_type)) # ok, well at least the type is good, we'll assume the cert is # revoked self.revocations.append(pkts[pkt_idx]) # increment the pkt_idx to go to the next one pkt_idx = pkt_idx + 1 # the following packets are User ID, Signature pairs while pkt_idx < len(pkts) : # this packet is supposed to be a user id if pkts[pkt_idx].pkt_typ != CTB_PKT_USER_ID : if len(self.user_ids) == 0 : raise ValueError('pgp packet %d is not user id, is %s' % (pkt_idx, map_to_str(ctb_pkt_to_str, pkts[pkt_idx].pkt_typ))) else : break user_id = [pkts[pkt_idx]] pkt_idx = pkt_idx + 1 is_revoked = 0 is_primary_user_id = 0 # there may be a sequence of signatures following the user id which # bind it to the key while pkt_idx < len(pkts) and pkts[pkt_idx].pkt_typ == CTB_PKT_SIG : if pkts[pkt_idx].sig_type not in (SIG_TYPE_PK_USER_GEN, SIG_TYPE_PK_USER_PER, SIG_TYPE_PK_USER_CAS, SIG_TYPE_PK_USER_POS, SIG_TYPE_CERT_REVOKE) : raise ValueError('signature %d doesn\'t bind user_id to key, is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_type))) user_id.append(pkts[pkt_idx]) pkt_idx = pkt_idx + 1 # append the user ID and signature(s) onto a list self.user_ids.append(user_id) else : # self.version == 4 pkt_idx = 1 self.direct_key_sigs = [] self.subkeys = [] self.rvkd_subkeys = [] self.user_attrs = [] cert_id = self.public_key.key_id() # second packet could be a revocation (or a direct key self signature) while pkt_idx < len(pkts) and pkts[pkt_idx].pkt_typ == CTB_PKT_SIG : if pkts[pkt_idx].version != 4 : raise ValueError('version 4 cert has version %d signature' % pkts[pkt_idx].version) if pkts[pkt_idx].sig_type == SIG_TYPE_KEY_REVOKE : self.revocations.append(pkts[pkt_idx]) elif pkts[pkt_idx].sig_type == SIG_TYPE_KEY : self.direct_key_sigs.append(pkts[pkt_idx]) else : raise ValueError('v4 cert signature has type %s, supposed to be revocation signature or direct key signature' % map_to_str(sig_type_to_str, pkts[pkt_idx].sig_type)) # increment the pkt_idx to go to the next one pkt_idx = pkt_idx + 1 # the following packets are: # User ID, signature... sets or # subkey, signature... sets or # user attribute, signature... sets prim_user_id_sig_time = 0 while pkt_idx < len(pkts) : # this packet is supposed to be a user id if pkts[pkt_idx].pkt_typ == CTB_PKT_USER_ID : user_id = [pkts[pkt_idx]] is_revoked = 0 is_primary_user_id = 0 pkt_idx = pkt_idx + 1 # there may be a sequence of signatures following the user id which # bind it to the key while pkt_idx < len(pkts) and pkts[pkt_idx].pkt_typ == CTB_PKT_SIG : if pkts[pkt_idx].sig_type not in (SIG_TYPE_PK_USER_GEN, SIG_TYPE_PK_USER_PER, SIG_TYPE_PK_USER_CAS, SIG_TYPE_PK_USER_POS, SIG_TYPE_CERT_REVOKE) : raise ValueError('signature %d doesn\'t bind user_id to key, is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_type))) user_id.append(pkts[pkt_idx]) # is this the primary user id? if pkts[pkt_idx].key_id() == cert_id : if pkts[pkt_idx].is_primary_user_id() : ct = pkts[pkt_idx].creation_time() if ct > prim_user_id_sig_time : self.primary_user_id = len(self.user_ids) prim_user_id_sig_time = ct pkt_idx = pkt_idx + 1 # append the user ID and signature(s) onto the list self.user_ids.append(user_id) # this packet is supposed to be a user id elif pkts[pkt_idx].pkt_typ == CTB_PKT_USER_ATTR : user_attr = [pkts[pkt_idx]] is_revoked = 0 pkt_idx = pkt_idx + 1 # there may be a sequence of signatures following the user id which # bind it to the key while pkt_idx < len(pkts) and pkts[pkt_idx].pkt_typ == CTB_PKT_SIG : if pkts[pkt_idx].sig_type not in (SIG_TYPE_PK_USER_GEN, SIG_TYPE_PK_USER_PER, SIG_TYPE_PK_USER_CAS, SIG_TYPE_PK_USER_POS, SIG_TYPE_CERT_REVOKE) : raise ValueError('signature %d doesn\'t bind user_attr to key, is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_type))) user_attr.append(pkts[pkt_idx]) pkt_idx = pkt_idx + 1 # append the user ID and signature(s) onto the list self.user_attrs.append(user_attr) elif pkts[pkt_idx].pkt_typ == CTB_PKT_PK_SUB : # collect this list of subkey + signature [ + revocation ] subkey = [pkts[pkt_idx]] pkt_idx = pkt_idx + 1 is_revoked = 0 # there may optionally be a revocation if pkt_idx < len(pkts) and pkts[pkt_idx].pkt_typ == CTB_PKT_SIG and pkts[pkt_idx].sig_type == SIG_TYPE_SUBKEY_REVOKE : is_revoked = 1 subkey.append(pkts[pkt_idx]) pkt_idx = pkt_idx + 1 # there must be one signature following the subkey that binds it to the main key if pkt_idx >= len(pkts) : raise ValueError('subkey at index %d was not followed by a signature' % (pkt_idx-1)) if pkts[pkt_idx].pkt_typ != CTB_PKT_SIG or pkts[pkt_idx].sig_type != SIG_TYPE_SUBKEY_BIND : raise ValueError('signature %d doesn\'t bind subkey to key, type is %s' % (pkt_idx, map_to_str(sig_type_to_str, pkts[pkt_idx].sig_type))) subkey.append(pkts[pkt_idx]) pkt_idx = pkt_idx + 1 # append the user ID and signature(s) onto the list if is_revoked : self.rvkd_subkeys.append(subkey) else : self.subkeys.append(subkey) elif pkts[pkt_idx].pkt_typ == CTB_PKT_SIG : # ok, well at least the type is good, we'll assume the cert is # revoked self.revocations.append(pkts[pkt_idx]) # increment the pkt_idx to go to the next one pkt_idx = pkt_idx + 1 else : break # did we get all the things we needed? #if not self.user_id : # just take the first valid user id we encountered then if len(self.user_ids) == 0 : raise ValueError('no user id packet was present in the cert %s' % str_to_hex(self.public_key.key_id())) return pkt_idx def get_ctb(msg, idx) : """get_ctb(msg, idx) extracts a the "cypher type bit" information from message msg at index idx returns (type, len, new_idx) where type is the enumerated type of the packet, len is the length of the packet, and new_idx is the index of the next element in the message""" b, idx = get_whole_int(msg, idx, 1) if (b & CTB_76_MASK) == CTB_76_NORMAL : n_len = 0 # undefined length if (b & CTB_PKT_LEN_MASK) == CTB_PKT_LEN_1 : n_len = 1 if (b & CTB_PKT_LEN_MASK) == CTB_PKT_LEN_2 : n_len = 2 if (b & CTB_PKT_LEN_MASK) == CTB_PKT_LEN_4 : n_len = 4 if (b & CTB_PKT_LEN_MASK) == CTB_PKT_LEN_UNDEF : n_len = 0 pkt_len = 0 if n_len > 0 : pkt_len, idx = get_whole_int(msg, idx, n_len) return (b & CTB_PKTV2_MASK) >> 2, pkt_len, idx elif (b & CTB_76_MASK) == CTB_76_NEW : plen, idx = get_whole_int(msg, idx, 1) if plen < 192 : return b & CTB_PKT_MASK, plen, idx if plen < 224 : plen2, idx = get_whole_int(msg, idx, 1) return b & CTB_PKT_MASK, ((plen - 192) << 8) + plen2 + 192, idx if plen == 255 : plen, idx = get_whole_int(msg, idx, 4) return b & CTB_PKT_MASK, plen, idx else : raise Exception, 'partial message bodies are not supported by this version (%d)', b else : raise Exception, "unknown (not \"normal\") cypher type bit %d at byte %d" % (b, idx) def crc24(msg) : crc24_init = 0xb704ce crc24_poly = 0x1864cfb crc = crc24_init for i in list(msg) : crc = crc ^ (ord(i) << 16) for j in range(0, 8) : crc = crc << 1 if crc & 0x1000000 : crc = crc ^ crc24_poly return crc & 0xffffff def decode(msg) : # each message is a sequence of packets so we go through the message # and generate a list of packets and return that pkt_list = [] idx = 0 msg_len = len(msg) while idx < msg_len : pkt_typ, pkt_len, idx = get_ctb(msg, idx) pkt = None if pkt_typ == CTB_PKT_PK_CERT or pkt_typ == CTB_PKT_PK_SUB : pkt = public_key() elif pkt_typ == CTB_PKT_USER_ID : pkt = user_id() elif pkt_typ == CTB_PKT_SIG : pkt = signature() elif pkt_typ == CTB_PKT_USER_ATTR : pkt = user_attribute() if pkt : pkt.pkt_typ = pkt_typ pkt.deserialize(msg, idx, pkt_len) if debug : debug.write(pkt.__str__() + "\n") else : raise ValueError('unexpected pgp packet type %s at %d' % (map_to_str(ctb_pkt_to_str, pkt_typ), idx)) pkt_list.append(pkt) idx = idx + pkt_len return pkt_list def decode_msg(msg, multi=False) : """decode_msg(msg) ==> list of OpenPGP "packet" objects Takes an ascii-armored PGP block and returns a list of objects each of which corresponds to a PGP "packets". A PGP message is a series of packets. You need to understand how packets are to be combined together in order to know what to do with them. For example a PGP "certificate" includes a public key, user id(s), and signature. """ # first we'll break the block up into lines and trim each line of any # carriage return chars pgpkey_lines = map(lambda x : x.rstrip(), msg.split('\n')) # check out block in_block = 0 in_data = 0 block_buf = cStringIO.StringIO() for l in pgpkey_lines : if not in_block : if l == '-----BEGIN PGP PUBLIC KEY BLOCK-----' : in_block = 1 continue # are we at the actual data yet? if not in_data : if len(l) == 0 : in_data = 1 continue # are we at the checksum line? if l and l[0] == '=' : # get the checksum number csum = base64.decodestring(l[1:5]) i = 0 csum, i = get_whole_number(csum, i, 3) # convert the base64 cert data to binary data cert_msg = base64.decodestring(block_buf.getvalue()) block_buf.close() # check the checksum if csum != crc24(cert_msg) : raise Exception, 'bad checksum on pgp message' # ok, the sum looks ok so we'll actually decode the thing pkt_list = decode(cert_msg) # turn it into a real cert cert_list = [] while len(pkt_list) > 0 : cert = pgp_certificate() cert.raw_key = msg pkt_idx = cert.load(pkt_list) cert_list.append(cert) pkt_list[0:pkt_idx] = [] if not multi: if not cert_list: return None return cert_list[0] return cert_list # add the data to our buffer then block_buf.write(l) if not multi: return None return [] def decode_multiple_keys(msg): #ditto of above - but handling multiple certs/keys per file certs = [] pgpkey_lines = map(lambda x : x.rstrip(), msg.split('\n')) in_block = 0 block = '' for l in pgpkey_lines : if not in_block : if l == '-----BEGIN PGP PUBLIC KEY BLOCK-----' : in_block = 1 block += '%s\n' % l continue block += '%s\n' % l if l == '-----END PGP PUBLIC KEY BLOCK-----': in_block = 0 thesecerts = decode_msg(block, multi=True) if thesecerts: certs.extend(thesecerts) block = '' continue return certs if __name__ == '__main__' : import sys for pgp_cert in decode_multiple_keys(open(sys.argv[1]).read()) : print pgp_cert PK[OΧsite-packages/yum/callbacks.pycnu[ v_c@sdZddlZddlmZmZmZdZdZdZdZ dZ id e6d e6d e 6d e 6Z d ddYZ dddYZ defdYZdS(s'Classes for handling various callbacks.iN(t BaseMetert format_timet format_numberi i iii(sDownloading PackagessCheck Package SignaturessRunning Test TransactionsRunning TransactiontProcessTransBaseCallbackcBs#eZdZdZddZRS(sMA class to handle callbacks from :func:`YumBase.processTransaction`. cCstjd|_dS(Ns)yum.verbose.ProcessTrasactionBaseCallback(tloggingt getLoggertlogger(tself((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyt__init__+scCs-|tjkr)|jjt|ndS(sHandle an event by logging it. :param state: a number indicating the type of callback :param data: data associated with the callback N(t PT_MESSAGEStkeysRtinfo(Rtstatetdata((s1/usr/lib/python2.7/site-packages/yum/callbacks.pytevent.sN(t__name__t __module__t__doc__RtNoneR(((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyR's tProcessTransNoOutputCallbackcBs#eZdZdZddZRS(scA class to handle callbacks from :func:`YumBase.processTransaction`, without logging them. cCsdS(N((R((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyR;scCsdS(sHandle an event. :param state: a number indicating the type of callback :param data: data associated with the callback N((RR R ((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyR>sN(RRRRRR(((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyR7s tDownloadBaseCallbackcBsYeZdZdZddZddZddZddZdZ dZ RS( sThis is a base class that can be extended to implement a custom download progress handler to be used with :func:`YumBase.repos.setProgressBar`. Example:: from yum.callbacks import DownloadBaseCallback class MyDownloadCallback( DownloadBaseCallback ): def updateProgress(self,name,frac,fread,ftime): ''' Update the progressbar @param name: filename @param frac: Progress fracment (0 -> 1) @param fread: formated string containing BytesRead @param ftime : formated string containing remaining or elapsed time ''' pct = int( frac*100 ) print " %s : %s " % (name,pct) if __name__ == '__main__': my = YumBase() my.doConfigSetup() dnlcb = MyDownloadCallback() my.repos.setProgressBar( dnlcb ) for pkg in my.pkgSack: print pkg.name cCstj|d|_dS(Nt(RRttotSize(R((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyRes cCstj|||dS(s Update the status bar. :param amount_read: the amount of data, in bytes, that has been read :param now: the current time in seconds since the epoch. If *now* is not given, the output of :func:`time.time()` will be used. N(Rtupdate(Rt amount_readtnow((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyRiscCsJ|j}|j|ddd|jdk rFt|j|_ndS(NgR(t_getNametupdateProgresstsizeRRR(RRtname((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyt _do_startss c Cst|}|j}|jdkra|jj}t|}d}|j||||n@|jj}t|} |jj }|j|||| dS(Ng( RRRRtret elapsed_timeRRtremaining_timet fraction_read( RRRtfreadRtetimetfetimetfractrtimetfrtime((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyt _do_updateys    cCsGt|jj}t|}|j}|j|d||dS(Ng?(RRR RRR(RRRt total_timet total_sizeR((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyt_do_ends  cCs=|jr0t|jtdkr0|j}n |j}|S(s> Get the name of the package being downloaded R(ttextttypetbasename(RR((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyRs$  cCsdS(sUpdate the progressbar. This method should be overridden by subclasses to implement the handler. :param name: the name of the filed being downloaded :param frac: number between 0 and 1 representing the fraction fraction of the file that has been downloaded :param fread: formatted string containing the number of bytes read :param ftime: formatted string containing remaining or elapsed time N((RRR&R#tftime((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyRs N( RRRRRRRR)R,RR(((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyRFs     (((RRturlgrabber.progressRRRt PT_DOWNLOADtPT_DOWNLOAD_PKGSt PT_GPGCHECKt PT_TEST_TRANStPT_TRANSACTIONR RRR(((s1/usr/lib/python2.7/site-packages/yum/callbacks.pyts   PK[ >((site-packages/yum/igroups.pycnu[ v_c@sddlZddlZddlZdZdZdZdefdYZdefdYZd efd YZ dS( iNcGs4tjd}zt|}Wdtj|X|S(sk Annoying people like to set umask's for root, which screws everything up for user readable stuff. iN(tostumasktopen(targstoumasktret((s//usr/lib/python2.7/site-packages/yum/igroups.pyt_open_no_umasks cGs7tjd}ztj|}Wdtj|X|S(sk Annoying people like to set umask's for root, which screws everything up for user readable stuff. iN(RRtmakedirs(RRR((s//usr/lib/python2.7/site-packages/yum/igroups.pyt_makedirs_no_umask#s cCs'x |D]}|d r|d SqWdS(Nit((tfots((s//usr/lib/python2.7/site-packages/yum/igroups.pyt _read_str.s   tInstalledGroupc BsVeZdZdZdZdZedddddd d d ZRS( cCs"||_t|_d|_dS(N(tgidtsett pkg_namestNonet environment(tselfR((s//usr/lib/python2.7/site-packages/yum/igroups.pyt__init__5s  cCs#|dkrdSt|j|jS(Ni(RtcmpR(Rtother((s//usr/lib/python2.7/site-packages/yum/igroups.pyt__cmp__:s cCs"t|}t|j|jS(N(Rtsortedt differenceR(RR((s//usr/lib/python2.7/site-packages/yum/igroups.pyt _additions?s cCs"t|}t|j|jS(N(RRRR(RR((s//usr/lib/python2.7/site-packages/yum/igroups.pyt _removalsCs tfgetcCs|jS(N(R(R((s//usr/lib/python2.7/site-packages/yum/igroups.pytGstfsetcCst|d|S(NR(tsetattr(Rtvalue((s//usr/lib/python2.7/site-packages/yum/igroups.pyRHstfdelcCst|ddS(NR(RR(R((s//usr/lib/python2.7/site-packages/yum/igroups.pyRIstdocs.Compat. to treat comps groups/igroups the same(t__name__t __module__RRRRtpropertytgroupid(((s//usr/lib/python2.7/site-packages/yum/igroups.pyR 4s      tInstalledEnvironmentc BsVeZdZdZdZdZedddddd d d ZRS( cCs||_t|_dS(N(tevgidRt grp_names(RR(((s//usr/lib/python2.7/site-packages/yum/igroups.pyROs cCs#|dkrdSt|j|jS(Ni(RRR((RR((s//usr/lib/python2.7/site-packages/yum/igroups.pyRSs cCs"t|}t|j|jS(N(RRRR)(RR)((s//usr/lib/python2.7/site-packages/yum/igroups.pyRXs cCs"t|}t|j|jS(N(RRRR)(RR)((s//usr/lib/python2.7/site-packages/yum/igroups.pyR\s RcCs|jS(N(R((R((s//usr/lib/python2.7/site-packages/yum/igroups.pyR`sRcCst|d|S(NR((R(RR ((s//usr/lib/python2.7/site-packages/yum/igroups.pyRasR!cCst|ddS(NR((RR(R((s//usr/lib/python2.7/site-packages/yum/igroups.pyRbsR"s.Compat. to treat comps groups/igroups the same(R#R$RRRRR%t environmentid(((s//usr/lib/python2.7/site-packages/yum/igroups.pyR'Ns      tInstalledGroupscBseZdZdZdZdZedZdZdZ d dZ dZ ed Z d Zd Zed ZRS(cCs9i|_t|_i|_|j||j|dS(N(tgroupstFalsetchangedt environmentst_read_pkg_grpst_read_grp_grps(Rtdb_path((s//usr/lib/python2.7/site-packages/yum/igroups.pyRgs     cCs |d|_tj|jtjs)dSt|j}ytt|}Wntk rbdSX|dkrsdStt|}x|dkr|d8}tt|}||j |j (t grp_filenameRR4R5RR6R R7R'R/R(R)R8tAssertionErrorR,R( RR2R R9R:tevgrpR<tgrpnametmemb((s//usr/lib/python2.7/site-packages/yum/igroups.pyR1s4        cCsdS(N((R((s//usr/lib/python2.7/site-packages/yum/igroups.pytclosescCs| r|j rtStjj|j}tjj|sjyt|Wqjtt fk rf}tSXntj |tj stS|j |j t|_dS(N(R.R-RtpathtdirnameR3texistsRtIOErrortOSErrorR4tW_OKt_write_pkg_grpst_write_grp_grps(RtforceR2te((s//usr/lib/python2.7/site-packages/yum/igroups.pytsaves  cCst|jdd}|jd|jdt|jxvt|jjD]_}|jd|j|jdt|jx(t|jD]}|jd|qWqSW|j t j |jd|jdS(Ns.tmptws1 s%u s%s ( RR3twritetlenR,RtvaluesRRRDRtrename(RR R;tpkgname((s//usr/lib/python2.7/site-packages/yum/igroups.pyRKs  cCs#t|jdd}|jd|jdt|jxt|jjD]}|jd|j|jdt|jxmt|jD]\}|jd|||j kr|j |j |jkr|jdq|jd qWqSW|j t j |jd|jdS( Ns.tmpRPs1 s%u s%s R=R>strue sfalse (RR?RQRRR/RRSR(R)R,RRDRRT(RR RARB((s//usr/lib/python2.7/site-packages/yum/igroups.pyRLs  cCst|_||jkr.t||j|s    PK[<=site-packages/yum/constants.pynuȯ#! /usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ Yum constants. Usually dealing with rpm magic numbers. """ #Constants YUM_PID_FILE = '/var/run/yum.pid' #transaction set states TS_UPDATE = 10 TS_INSTALL = 20 TS_TRUEINSTALL = 30 TS_ERASE = 40 TS_OBSOLETED = 50 TS_OBSOLETING = 60 TS_AVAILABLE = 70 TS_UPDATED = 90 TS_FAILED = 100 TS_INSTALL_STATES = [TS_INSTALL, TS_TRUEINSTALL, TS_UPDATE, TS_OBSOLETING] TS_REMOVE_STATES = [TS_ERASE, TS_OBSOLETED, TS_UPDATED] # Transaction Relationships TR_UPDATES = 1 TR_UPDATEDBY = 2 TR_OBSOLETES = 3 TR_OBSOLETEDBY = 4 TR_DEPENDS = 5 TR_DEPENDSON = 6 # Transaction Member Sort Colors # Each node in a topological sort is colored # White nodes are unseen, black nodes are seen # grey nodes are in progress TX_WHITE = 0 TX_GREY = 1 TX_BLACK = 2 # package object file types PO_FILE = 1 PO_DIR = 2 PO_GHOST = 3 PO_CONFIG = 4 PO_DOC = 5 # package object package types PO_REMOTEPKG = 1 PO_LOCALPKG = 2 PO_INSTALLEDPKG = 3 # FLAGS SYMBOLFLAGS = {'>':'GT', '<':'LT', '=': 'EQ', '==': 'EQ', '>=':'GE', '<=':'LE'} LETTERFLAGS = {'GT':'>', 'LT':'<', 'EQ':'=', 'GE': '>=', 'LE': '<='} # Constants for plugin config option registration PLUG_OPT_STRING = 0 PLUG_OPT_INT = 1 PLUG_OPT_FLOAT = 2 PLUG_OPT_BOOL = 3 PLUG_OPT_WHERE_MAIN = 0 PLUG_OPT_WHERE_REPO = 1 PLUG_OPT_WHERE_ALL = 2 # version of sqlite database schemas DBVERSION = '10' # boolean dict: BOOLEAN_STATES = {'1': True, 'yes': True, 'true': True, 'on': True, '0': False, 'no': False, 'false': False, 'off': False} RPM_TO_SQLITE = { 'packagesize' : 'size_package', 'archivesize' : 'size_archive', 'installedsize' : 'size_installed', 'buildtime' : 'time_build', 'hdrstart' : 'rpm_header_start', 'hdrend' : 'rpm_header_end', 'basepath' : 'location_base', 'relativepath': 'location_href', 'filetime' : 'time_file', 'packager' : 'rpm_packager', 'group' : 'rpm_group', 'buildhost' : 'rpm_buildhost', 'sourcerpm' : 'rpm_sourcerpm', 'vendor' : 'rpm_vendor', 'license' : 'rpm_license' } # Cut over for when we should just give up and load everything. # The main problem here is not so much SQLite dying (although that happens # at large values: http://sqlite.org/limits.html#max_variable_number) but that # but SQLite going really slow when it gets medium sized values (much slower # than just loading everything and filtering it in python). PATTERNS_MAX = 8 # We have another value here because name is indexed and sqlite is _much_ # faster even at large numbers of patterns. PATTERNS_INDEXED_MAX = 128 RPM_CHECKSUM_TYPES = { 1:'md5', 2:'sha1', 8:'sha256', 9:'sha384', 10:'sha512', 11:'sha224' } # from RFC 4880 # for repo verification/checks REPO_PROBLEM_REPOMD=1 REPO_PROBLEM_METADATA=2 REPO_PROBLEM_COMPS=3 REPO_PROBLEM_OTHER=4 REPO_PROBLEM_PACKAGE=5 ERRORS_TO_KBASE_ARTICLES = { 404: """To address this issue please refer to the below wiki article https://wiki.centos.org/yum-errors If above article doesn't help to resolve this issue please use https://bugs.centos.org/. """, 403: """To address this issue please refer to the below wiki article https://wiki.centos.org/yum-errors If above article doesn't help to resolve this issue please use https://bugs.centos.org/. """, 60: """It was impossible to connect to the CentOS servers. This could mean a connectivity issue in your environment, such as the requirement to configure a proxy, or a transparent proxy that tampers with TLS security, or an incorrect system clock. You can try to solve this issue by using the instructions on https://wiki.centos.org/yum-errors If above article doesn't help to resolve this issue please use https://bugs.centos.org/. """ } PK[$`site-packages/yum/pgpmsg.pycnu[ v_c@sbddlZddlZddlZddlZddlZyddlZWn<ek rddlZddlZdfdYZnXe Z dZ dZ dZ dZdZdZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZ ide6de6de6de6de6de6de6d e6d!e6d"e6d#e6d$e6d%e6d&e6d'e6d(e6d)e 6Z!d Z"d*Z#dZ$d Z%d Z&dZ'd Z(d Z)d+Z*dZ+dZ,dZ-d,Z.d-Z/i d.e'6d/e(6d0e)6d1e*6d2e+6d3e,6d4e-6d5e.6d6e/6Z0d*Z1dZ2d Z3d Z4d Z5d Z6d Z7dZ8dZ9dZ:dZ;i d7e16d8e26d9e36d:e46d;e56d<e66d=e76d>e86d?e96d@e:6dAe;6Z<d*Z=dZ>d Z?d Z@idBe=6dCe>6dDe?6dEe@6ZAdZBd ZCd ZDd ZEd ZFd ZGdZHdZIdZJdZKdZLi dFeB6dGeC6dHeD6dIeE6dJeF6dKeG6dLeH6dMeI6dNeJ6dOeK6dPeL6ZMd*ZNdZOd ZPd+ZQdZRdZSdZTdQZUdRZVdSZWdTZXdUZYdVZZi dWeN6dXeO6dYeP6dZeQ6d[eR6d\eS6d]eT6d^eU6d_eV6d`eW6daeX6dbeY6dceZ6Z[d Z\d Z]d Z^d Z_d Z`dZadZbdZcdZddZed+Zfd,Zgd-ZhddZideZjdQZkdfZldgZmdhZndiZodjZpdkZqdRZrdSZsidle\6dme]6dne^6doe_6dpe`6dqea6dreb6dsec6dted6duee6dvef6dweg6dxeh6dyei6dzej6d{ek6d|el6d}em6d~en6deo6dep6deq6der6des6Ztd*ZudZvd Zwd ZxdSZyideu6dev6dew6dex6dey6ZzdZ{d Z|d Z}dZ~d+ZdZdZdVZdZide6ZdZdZdZdZdZdZdZdZdZdZdefdYZdefdYZdefdYZdefdYZdefdYZdefdYZdZdZdZedZdZedkr^ddlZx,eeejdjD] ZeGHqLWndS(iNthashlibcBseZedZRS(cCs9|dkrtjS|dkr,tjStddS(Ntmd5tsha1sBad checksum type(Rtnewtshat ValueError(talgo((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR#s     (t__name__t __module__t staticmethodR(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR!siii<i?iiiiiiiii i i i i iiiis#public-key encrypted session packetssignature packets&symmetric-key encrypted session packetsone-pass signature packetssecret-key certificate packetspublic-key certificate packetssecret-key subkey packetscompressed data packets#symmetric-key encrypted data packets marker packetsliteral data packets trust packetsuser id packetspublic subkey packetsuser attribute packets$symmetric encrypted integrity packets"modification detection code packetiiiisRSA (Encrypt or Sign)sRSA Encrypt-Onlys RSA Sign-OnlysElgamal Encrypt-Onlys DSA (Digital Signature Standard)sElliptic CurvetECDSAsElgamal (Encrypt or Sign)sDiffie-HellmansPlaintext or unencrypted datatIDEAs Triple-DEStCAST5tBlowfishs SAFER-SK128sDES/SKs AES 128-bits AES 192-bits AES 256-bitsTwofish 256-bitt UncompressedtZIPtZLIBtBZip2tMD5tSHA1t RIPEMD160sdouble-width SHAtMD2tTIGER192s HAVAL-5-160tSHA256tSHA384tSHA512tSHA224iii i(i0i@s document signature, binary images"document signature, canonical textssignature over just subpacketss;public key packet and user ID packet, generic certifications-public key packet and user ID packet, personas:public key packet and user ID packet, casual certifications<public key packet and user ID packet, positive certificationssubkey bindings key signatureskey revocationssubkey revocationscertificate revocationt timestampiiiiiiiissignature creation timessignature expiration timesexportable certificationstrust signaturesregular expressiont revocableskey expiration times&placeholder for backward compatibilityspreferred symmetric algorithmssrevocation keys issuer key IDs notation dataspreferred hash algorithmss preferred compression algorithmsskey server preferencesspreferred key serversprimary user ids policy URIs key flagsssigner's user idsreason for revocationtfeaturesssignature targetsembedded signaturesNo reason specifiedsKey is supercededsKey has been compromisedsKey is no longer useds&user id information is no longer validsModification DetectioncCsld}xY|dkratjd|||d!d}|dt|}|d}|d}q W||fS(sget_whole_number(msg, idx, numlen) extracts a "whole number" field of length numlen from msg at index idx returns (, new_idx) where the whole number is a long integer and new_idx is the index of the next element in the messagelitBil(tstructtunpacktlong(tmsgtidxtnumlentntb((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytget_whole_number:s! cCs(t|||\}}t||fS(siget_whole_int(msg, idx, numlen) same as get_whole_number but returns the number as an int for convenience(R'tint(R"R#R$R%((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt get_whole_intGscCsPg}x:|dkrB|jdtjd|d@|dL}q Wdj|S(sKpack_long(l) returns big-endian representation of unsigned long integeriRiit(tinsertRtpacktjoin(tltarr((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt pack_longMs  cCst|}t|dd}t|dkrlt|d}x-|dkrh|d7}|dL}qEWnd}tjd||S(s_pack_mpi(l) returns the PGP Multi-Precision Integer representation of unsigned long integeriiis>H(R0tlentordRR,(R.tstbitsR%((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytpack_mpiVs  cCs|t||d\}}|dkr.||fS|dkrlt||d\}}|dd>|d|fSt||dS(sfget_sig_subpak_len(msg, idx) extracts a signature subpacket length field returns (subpak_len, new_idx)iiiii(R)(R"R#tplentplen2((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytget_sig_subpak_lenfs   cCs7t||d\}}|ft|||ddS(sget_mpi(msg, idx) extracts a multi-precision integer field from the message msg at index idx returns (n, , new_idx) where the mpi is a long integer and new_idx is the index of the next element in the message and n is the number of bits of precision in iii(R)R'(R"R#tln((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt get_n_mpirscCs!t||}|d|dfS(sget_mpi(msg, idx) extracts a multi-precision integer field from the message msg at index idx returns (, new_idx) where the mpi is a long integer and new_idx is the index of the next element in the messageii(R:(R"R#R.((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytget_mpi{scCsdjtdt|S(NR*cSstt|djdS(Ni(thexR2tzfill(tx((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyts(R-tmaptlist(R3((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt str_to_hexscCsf|dkrdS|d}|d}|d}|d}|d}|d}|}d||||fS(Nitneveri<is%d days %02d:%02d:%02d((R3tsecstminsthrstdays((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytduration_to_strs       cCsg}t|tjkrBt|tjkrBt|f}nxI|D]A}||kro|j||qI|jdt|dqIWdj|S(Nsunknown(t)s, (ttypettypestListTypet TupleTypeRAtappendtstrR-(tmtvalstslistti((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt map_to_strs*  t pgp_packetcBseZdZdZRS(cCs d|_dS(N(tNonetpkt_typ(tself((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt__init__scCstt|jS(N(RTtctb_pkt_to_strRW(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt__str__s(RRRYR[(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRUs t public_keycBs>eZdZdZdZdZdZdZRS(cCs5tj|d|_d|_d|_d|_dS(Ni(RURYRVtversiontpk_algotkey_sizet fingerprint_(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRYs     cCs|jr|jS|jdkrltjd}|jt|j|jt|j|j|_n|jdkrtjd}|jd|j }|jt j dt ||j||j|_nt d|j|jS(NiRiRss>Hsunknown public key version %d(R`R]RRtupdateR0t pk_rsa_modt pk_rsa_exptdigestt serializeRR,R1t RuntimeError(RXthtbuf((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt fingerprints     cCsA|jdkr t|jd@S|jdkr=|jdSdS(Nilii(R]R0RbRi(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytkey_idscCsg}|jdkrx|jtjd|jt|j|j|j|jt|j |jt|j nm|jdkr|jtjd|jt|j|j|jt ks|jt kr|jt|j |jt|j q|jt krl|jt|j|jt|j|jt|j|jt|jq|jtks|jtkr|jt|j|jt|j|jt|jqtd|jndj|S(Nis>BIHBis>BIBsunknown public key algorithm %dR*(R]RNRR,R(RtvalidityR^R5RbRctALGO_PK_RSA_ENC_OR_SIGNtALGO_PK_RSA_SIGN_ONLYt ALGO_PK_DSAtpk_dsa_prime_ptpk_dsa_grp_ord_qtpk_dsa_grp_gen_gtpk_dsa_pub_keytALGO_PK_ELGAMAL_ENC_OR_SIGNtALGO_PK_ELGAMAL_ENC_ONLYtpk_elgamal_prime_ptpk_elgamal_grp_gen_gtpk_elgamal_pub_keyRfR-(RXtchunks((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRes*4.cCsb|}t||d\|_}|jdkrj|jdkrj|jdkrjtd|j|fn|jdkrd|_nt||d\|_}t|j|_|jdkrt||d\|_}nt||d\|_}|jtks|jt krQt ||\|_ |_ }t ||\|_}n |jtkrt ||\}|_}t ||\|_}t ||\|_}t ||\}|_}|||_ n|jtks|jtkrEt ||\|_ |_}t ||\|_}t ||\|_}ntd|j|fdS(Niiiis*unknown public key packet version %d at %ds%unknown public key algorithm %d at %d(R)R]RfR'RtfloatRkR^RlRmR:R_RbR;RcRnRoRpRqRrRsRtRuRvRw(RXR"R#tpkt_lentidx_savetl1tl2((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt deserializes2- cCs3tj}|jtj|d|jdt|jd|jdtj|j d|jdkr|jdtj|j |j ddddn|jdt |j d|j t ks|j tkr$|jd t|jd|jd t|jdn|j tkr|jd t|jd|jd t|jd|jd t|jd|jdt|jdn{|j tks|j tkr)|jdt|jd|jdt|jd|jdt|jdn|jS(Ns s version: s timestamp: is validity: ii<s pubkey algo: s pk_rsa_mod: s pk_rsa_exp: spk_dsa_prime_p: spk_dsa_grp_ord_q: spk_dsa_grp_gen_g: spk_dsa_pub_key: spk_elgamal_prime_p: spk_elgamal_grp_gen_g: spk_elgamal_pub_key: (t cStringIOtStringIOtwriteRUR[ROR]ttimetctimeRRktalgo_pk_to_strR^RlRmR<RbRcRnRoRpRqRrRsRtRuRvRwtgetvalue(RXtsio((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR[s( !7!!!(RRRYRiRjReR~R[(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR\s      tuser_idcBs#eZdZdZdZRS(cCstj|d|_dS(N(RURYRVtid(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRYs cCs||||!|_dS(N(R(RXR"R#Rz((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR~scCs tj|dd|jdS(Ns sid: (RUR[R(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR[s(RRRYR~R[(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRs  tuser_attributecBs#eZdZdZdZRS(cCs#tj|d|_d|_dS(N(RURYRVtsub_typetdata(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRY#s  cCs=t||d\|_}|d}||||!|_dS(Ni(R)RR(RXR"R#Rz((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR~(s cCs3tj|ddt|jdt|jS(Ns s sub_type: s data: (RUR[RORRBR(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR[-s(RRRYR~R[(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR"s  t signaturecBskeZdZdZdZdZdZdZdZdZ dZ d Z d Z RS( cCs>tj|d|_d|_d|_d|_d|_dS(N(RURYRVR]tsig_typeR^t hash_algot hash_frag(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRY1s      cCsX|jdkr|jS|jt}|r3|dS|jt}|rP|dSdSdS(Nii(R]tkey_id_tget_hashed_subpaktSIG_SUB_TYPE_ISSUER_KEY_IDtget_unhashed_subpakRV(RXRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRj9scCs1|jdkr|jS|jt}|dSdS(Nii(R]RRtSIG_SUB_TYPE_CREATE_TIME(RXRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt creation_timeEscCs?|jdkrtdn|jt}|r;|dSdS(Nis$v3 signatures don't have expirationsii(R]RRtSIG_SUB_TYPE_KEY_EXPIRE(RXRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt expirationLs cCs,x%|jD]}|d|kr |Sq WdS(Ni(thashed_subpaksRV(RXttypRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRTscCs,x%|jD]}|d|kr |Sq WdS(Ni(tunhashed_subpaksRV(RXRRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRZsc& Cs|t||\}}t||d\}}|tkrgt||d\}}|t|f|fS|tks|tkrt||d\}}||f|fS|tks|tkrt||d\}}||f|fS|t kr6t||d\}}t||d\} }||| f|fS|t kru||||d!} ||d}|| f|fS|t ks|t ks|t ks|tkrtdt||||d!} ||d}|| f|fS|tkrWt||d\} }t||d\} }|||d!}|d}|| | |f|fS|tkr|||d!}|d}||f|fS|tkrt||d\}}t||d\}}t||d\}}t||d\}}t||d\}}t||d\}}||||!}||}||||!}||}|||||||f|fS|tkrg||||d!D]}t|^q}||d}||f|fS|tkr||||d!}||d}||f|fS|tkrJt||d\}}||f|fS|tkr||||d!}||d}||f|fS|tkr||||d!}||d}||f|fS|tkr$t||d\}}|d}||||!}||}|||f|fS|tkr|d}|g} x?|dkrt||d\}!}| j|!|d}qFWt| |fS|tkr t||d\}"}t||d\}#}||||d!}$||d}||"|#|$f|fS|tkrI||||d!}%||d}||%f|fS||||d!}%||d}||%f|fS( NiicSs t|S(N(R2(R>((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR?usiiiii( R8R)RR'RytSIG_SUB_TYPE_EXPIRE_TIMERtSIG_SUB_TYPE_EXPORT_CERTtSIG_SUB_TYPE_REVOCABLEtSIG_SUB_TYPE_TRUST_SIGtSIG_SUB_TYPE_REGEXPtSIG_SUB_TYPE_PREF_SYMM_ALGOtSIG_SUB_TYPE_PREF_HASH_ALGOtSIG_SUB_TYPE_PREF_COMP_ALGOtSIG_SUB_TYPE_KEY_FLAGSR@RAtSIG_SUB_TYPE_REVOKE_KEYRtSIG_SUB_TYPE_NOTATIONtSIG_SUB_TYPE_KEY_SRV_PREFR2tSIG_SUB_TYPE_PREF_KEY_SRVRtSIG_SUB_TYPE_PRIM_USER_IDtSIG_SUB_TYPE_POLICY_URItSIG_SUB_TYPE_SGNR_USER_IDtSIG_SUB_TYPE_REVOKE_REASONtSIG_SUB_TYPE_FEATURESRNttupletSIG_SUB_TYPE_SIG_TARGETtSIG_SUB_TYPE_EMBEDDED_SIG(&RXR"R#tsublentsubtypettmR3tboolt trust_lvlt trust_amttexprt algo_listtclsRtfprinttk_idtflg1tflg2tflg3tflg4tname_lentval_lentnamtvalR>tprefsturlturit signer_idtrev_codetreas_lentreasR.tocttpublic_key_algoRthashtdat((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytdeserialize_subpacket`s   0'        .             cCs0x)|jD]}|dtkr |dSq WdS(spis_primary_user_id() returns true if this signature contains a primary user id subpacket with value trueii(RR(RXRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytis_primary_user_ids c Cs|dtkr%dtj|dS|dtkrGdt|dS|dtkrl|dredSdSn|dtkr|ddkrdS|ddkrd|d S|dd krd |d Sd |d|d fS|dtkrd |dS|dtkr|drd SdSn|dt krAdt|dS|dt krfdt t |dS|dt krd}|dt@r|d}n|t t|d dt|dS|dtkrdt|dS|dtkrd|dS|dtkr!dt t|dS|dtkrFdt t|dS|dtkrd}g}|ddd@r|jdn|dj|S|dtkrd|dS|dtkr|drdSdSn|dtkrd |dS|dtkrg}d}t|ddkr5|dd}n|t@rO|jd!n|t @ri|jd"n|t!@r|jd#n|t"@r|jd$n|t#@r|jd%n|t$@r|jd&nd'dj|S|dt%krd(|dS|dt&kr6t'j(|dd)}d*||d fS|dt)krg}t|dkr|d}|t*@r|jd+n|t*@}|dkr|jd,|qnx<t+d t|D]%} |jd-| d|| fqWd.dj|Sd/|dt|dfS(0Niscreation time: issignature expires: ssignature exportable: TRUEssignature exportable: FALSEstrust: ordinarystrust: introducer (%d)istrust: meta-introducer (%d)s trust: %d %dsregexp: ssignature revocable: TRUEssignature revocable: FALSEs key expires: s preferred symmetric algorithms: srevocation key: s (sensitive) t isissuer key id: s2notation: flags(%d, %d, %d, %d) name(%s) value(%s)spreferred hash algorithms: s"preferred compression algorithms: skey server preferences: is No-modifys, spreferred key server: %ssis primary user idsis not primary user idspolicy url: %ssmay certify other keyss may sign datasmay encrypt communicationssmay encrypt storages4private component may have been secret-sharing splits group keys key flags: s signer id: R*sreason for revocation: %s, %ssModification Detections[0]=0x%xs [%d]=0x%xs features: sunknown(%d): %s(,RRRRRHRRRRRRRTtalgo_sk_to_strRtREVOKE_KEY_CLASS_SENSRRBRRRtalgo_hash_to_strRtalgo_comp_to_strRRNR-RRRRR1tKEY_FLAGS1_MAY_CERTIFYtKEY_FLAGS1_MAY_SIGNtKEY_FLAGS1_MAY_ENC_COMMtKEY_FLAGS1_MAY_ENC_STRGtKEY_FLAGS1_PRIV_MAYBE_SPLITtKEY_FLAGS1_GROUPRRtrevoke_reason_to_strtgetRtPGP_FEATURE_1_MOD_DETECTtrange( RXtspR3Rtflagstflgs1RRRRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytsubpacket_to_strs      '               #cCst||d\|_}|jdkr6d|_n|jdkrt||d\}}t||d\|_}t||d\|_}t|j|_|||d!|_|d}t||d\|_}t||d\|_}nH|jdkr+t||d\|_}t||d\|_}t||d\|_}t||d\}}||}g|_ x8||kr|j ||\}}|j j |qWt||d\}}||}g|_ xT||kr'|j ||\}}|j j |qWnt d|j|ft||d\|_}|jtks}|jtkrt||\|_}n[|jtkrt||\|_}t||\|_}nt d|j|f|S(Niiiiis)unknown signature packet version %d at %ds4unknown public-key algorithm (%d) in signature at %d(R)R]R'RRRyRR^RRRRNRRfRRlRmR;trsa_sigRnt dsa_sig_rt dsa_sig_s(RXR"R#Rzthash_lent sub_paks_lent sub_paks_endR((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR~'sJ      cCs,tj}|jtj|d|jdt|jd|jdt|jd|jdkr|jdt j |j d|jdt |j dn|jdkrA|jdx/|jD]$}|jd |j|dqW|jd x2|jD]$}|jd |j|dqWn|jd t|jd|jd t|jd|jtks|jtkr|jd |jdt|jdn[|jtkr"|jd|jdt|jd|jdt|jdn|jS(Ns s version: stype: is timestamp: skey_id: ishashed subpackets: s sunhashed subpackets: s hash_algo: s hash_frag: s pk_algo: RSA s rsa_sig: s pk_algo: DSA s dsa_sig_r: s dsa_sig_s: (RRRRUR[ROR]tsig_type_to_strRRRRRBRRRRRRR<RR^RlRmRRnRRR(RXRRS((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR[Ps0 !! " % ! !( RRRYRjRRRRRRRR~R[(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR0s      `  _ )tpgp_certificatecBsJeZdZdZdZeeZdZdZdZ RS(cCs1d|_d|_g|_g|_d|_dS(Ni(RVR]R\t revocationstuser_idstprimary_user_id(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRYps     cCsAtj}|jd|j|jdt|jj|jd|j|jt|jxT|j D]I}|jt|dx)|dD]}|jdt|qWqtWt |dr7xd|j D]V}|jd|jt|dx)|dD]}|jdt|qWqWn|j S( NsPGP Public Key Certificate v%d s Cert ID: %s sPrimary ID: %s iis t user_attrsR( RRRR]RBR\RjRRORthasattrRR(RXRtuidtsigtuattr((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR[ws    "cCs|j|jdjS(Ni(RRR(RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt get_user_idscCs|jdkrE|jjdkr%dS|jj|jjdddS|jd}xK|dD]?}|jtkr]|j}|dkrdS|jj|Sq]WdSdS(Niiii<i(R]R\RkRRRtSIG_TYPE_PK_USER_GENR(RXtu_idRStexp((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRs    cCsdS(Ni((RX((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR_sc Cs5|djtkr6tdtt|djn|d|_|jj|_|jdkr8d}x||jtkr||jdkrtd||jn||jt krtdtt ||jn|j j |||d}qjWx|t |kr4||jtkrlt |jdkrhtd|tt||jfqlPn||g}|d}d}d}x|t |kr ||jtkr ||jtttttfkrtd|tt ||jfn|j |||d}qW|jj |qWnd}g|_g|_g|_g|_|jj}x|t |krG||jtkrG||jd krtd ||jn||jt kr|j j ||nJ||jtkr|jj ||n td tt ||j|d}qtWd}x|t |kr||jtkr||g}d}d}|d}x|t |kr||jtkr||jtttttfkr td|tt ||jfn|j ||||j|kr||jr||j}||kr}t |j|_|}q}qn|d}qW|jj |qQ||jtkrv||g} d}|d}x|t |krb||jtkrb||jtttttfkrDtd |tt ||jfn| j |||d}qW|jj | qQ||jtkr||g} |d}d}|t |kr||jtkr||jt krd}| j |||d}n|t |kr+td |dn||jtksQ||jt!krztd|tt ||jfn| j |||d}|r|jj | q|jj | qQ||jtkr|j j |||d}qQPqQWt |jdkr1tdt"|jjn|S(sload(pkts) Initialize the pgp_certificate with a list of OpenPGP packets. The list of packets will be scanned to make sure they are valid for a pgp certificate.is6first PGP packet should be a public-key packet, not %siis'version 3 cert has version %d signatures"v3 cert revocation sig has type %ss#pgp packet %d is not user id, is %ss/signature %d doesn't bind user_id to key, is %sis'version 4 cert has version %d signaturesZv4 cert signature has type %s, supposed to be revocation signature or direct key signatures1signature %d doesn't bind user_attr to key, is %ss2subkey at index %d was not followed by a signatures3signature %d doesn't bind subkey to key, type is %ss,no user id packet was present in the cert %s(#RWtCTB_PKT_PK_CERTRRTRZR\R]t CTB_PKT_SIGRtSIG_TYPE_KEY_REVOKERRRNR1tCTB_PKT_USER_IDRRtSIG_TYPE_PK_USER_PERtSIG_TYPE_PK_USER_CAStSIG_TYPE_PK_USER_POStSIG_TYPE_CERT_REVOKEtdirect_key_sigstsubkeyst rvkd_subkeysRRjt SIG_TYPE_KEYRRRtCTB_PKT_USER_ATTRtCTB_PKT_PK_SUBtSIG_TYPE_SUBKEY_REVOKEtSIG_TYPE_SUBKEY_BINDRB( RXtpktstpkt_idxRt is_revokedRtcert_idtprim_user_id_sig_timetctt user_attrtsubkey((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytloads# #)  (")    (   (")   (")  8 &)  "( RRRYR[RtpropertyRRR_R(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyRos      cCst||d\}}|t@tkrd}|t@tkrGd}n|t@tkr`d}n|t@tkryd}n|t@tkrd}nd}|dkrt|||\}}n|t@d?||fS|t@t krt||d\}}|dkr|t @||fS|dkr^t||d\}}|t @|dd>|d|fS|dkrt||d\}}|t @||fSt d |nt d ||fd S( sget_ctb(msg, idx) extracts a the "cypher type bit" information from message msg at index idx returns (type, len, new_idx) where type is the enumerated type of the packet, len is the length of the packet, and new_idx is the index of the next element in the messageiiiiiiiis=partial message bodies are not supported by this version (%d)s4unknown (not "normal") cypher type bit %d at byte %dN( R)t CTB_76_MASKt CTB_76_NORMALtCTB_PKT_LEN_MASKt CTB_PKT_LEN_1t CTB_PKT_LEN_2t CTB_PKT_LEN_4tCTB_PKT_LEN_UNDEFtCTB_PKTV2_MASKt CTB_76_NEWt CTB_PKT_MASKt Exception(R"R#R&tn_lenRzR6R7((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytget_ctb^s6       ! cCsd}d}|}xct|D]U}|t|d>A}x8tddD]'}|d>}|d@rI||A}qIqIWqW|d@S( NiiLiiiiii(RAR2R(R"t crc24_initt crc24_polytcrcRStj((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytcrc24s  cCs4g}d}t|}x||kr/t||\}}}d}|tks]|tkrit}nH|tkrt}n0|tkrt }n|t krt }n|r||_ |j |||trtj|jdqntdtt||f|j|||}qW|S(Nis s#unexpected pgp packet type %s at %d(R1RRVRRR\RRRRRRRWR~tdebugRR[RRTRZRN(R"tpkt_listR#tmsg_lenRWRztpkt((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytdecodes.          cCstd|jd}d}d}tj}xl|D]d}|sa|dkr:d}q:q:n|st|dkr:d}q:q:n|r|ddkrtj|dd!}d}t||d\}}tj|j} |j |t | krt d nt | } g} xQt| dkrtt } || _| j| } | j| g| d| +q$W|s| sd S| dS| S|j|q:W|sd SgS( sdecode_msg(msg) ==> list of OpenPGP "packet" objects Takes an ascii-armored PGP block and returns a list of objects each of which corresponds to a PGP "packets". A PGP message is a series of packets. You need to understand how packets are to be combined together in order to know what to do with them. For example a PGP "certificate" includes a public key, user id(s), and signature. cSs |jS(N(trstrip(R>((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR?ss is$-----BEGIN PGP PUBLIC KEY BLOCK-----it=iisbad checksum on pgp messageN(R@tsplitRRR1tbase64t decodestringR'RtcloseR"RR'Rtraw_keyRRNRVR(R"tmultit pgpkey_linestin_blocktin_datat block_bufR.tcsumRStcert_msgR$t cert_listtcertR((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyt decode_msgsL            cCsg}td|jd}d}d}x|D]}|si|dkrid}|d|7}q4qin|d|7}|dkr4d}t|d t}|r|j|nd}q4q4q4W|S( NcSs |jS(N(R((R>((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyR?ss iR*s$-----BEGIN PGP PUBLIC KEY BLOCK-----is%s s"-----END PGP PUBLIC KEY BLOCK-----R/(R@R*R8tTruetextend(R"tcertsR0R1tblockR.t thesecerts((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pytdecode_multiple_keyss&     t__main__(RRRR+RKRt ImportErrorRRRVR#RRRRRtCTB_PKT_PK_ENCRtCTB_PKT_SK_ENCtCTB_PKT_OP_SIGtCTB_PKT_SK_CERTRtCTB_PKT_SK_SUBtCTB_PKT_COMPRESSEDt CTB_PKT_ENCtCTB_PKT_MARKERt CTB_PKT_LITt CTB_PKT_TRUSTRRRtCTB_PKT_SYM_ENC_INTtCTB_PKT_MOD_DETECTRZRRRRRRltALGO_PK_RSA_ENC_ONLYRmRtRntALGO_PK_ELLIPTIC_CURVEt ALGO_PK_ECDSARst ALGO_PK_DHRt ALGO_SK_PLAINt ALGO_SK_IDEAt ALGO_SK_3DESt ALGO_SK_CAST5tALGO_SK_BLOWFISHtALGO_SK_SAFER_SK128tALGO_SK_DES_SKtALGO_SK_AES_128tALGO_SK_AES_192tALGO_SK_AES_256tALGO_SK_TWOFISH_256RtALGO_COMP_UNCOMPt ALGO_COMP_ZIPtALGO_COMP_ZLIBtALGO_COMP_BZIP2Rt ALGO_HASH_MD5tALGO_HASH_SHA1tALGO_HASH_RIPEMD160tALGO_HASH_SHA_DBLt ALGO_HASH_MD2tALGO_HASH_TIGER192tALGO_HASH_HAVAL_5_160tALGO_HASH_SHA256tALGO_HASH_SHA384tALGO_HASH_SHA512tALGO_HASH_SHA224RtSIG_TYPE_DOCUMENTtSIG_TYPE_DOCUMENT_CANONtSIG_TYPE_STANDALONERRRRRRRRRtSIG_TYPE_TIMESTAMPRRRRRRRRtSIG_SUB_TYPE_PLACEHOLDERRRRRRRRRRRRRRRRRtsig_sub_type_to_strtREVOKE_REASON_NONEtREVOKE_REASON_SUPERtREVOKE_REASON_COMPRtREVOKE_REASON_NOT_USEDtREVOKE_REASON_ID_INVALIDRRRRRRRtREVOKE_KEY_CLASS_MANDRRtpgp_feature_to_strR'R)R0R5R8R:R;RBRHRTtobjectRUR\RRRRRR"R'tFalseR8R>Rtsystopentargvtreadtpgp_cert(((s./usr/lib/python2.7/site-packages/yum/pgpmsg.pyts<                   r @ $ " D   &PK[ATy (( site-packages/yum/fssnapshots.pynuȯ import os import fnmatch import time from datetime import datetime import subprocess from yum import _ try: import lvm # Check that lvm2 is at least 2.2.99... In theory hacked versions of # .98 work, but meh. _ver = lvm.getVersion() # Looks liks: 2.02.84(2) (2011-02-09) _ver = _ver.split()[0] _ver = _ver.split('(')[0] _ver = tuple(map(int, _ver.split('.'))) if _ver < (2, 2, 99): lvm = None except: lvm = None _ver = None if lvm is not None: from lvm import LibLVMError class _ResultError(LibLVMError): """Exception raised for LVM calls resulting in bad return values.""" pass else: LibLVMError = None def _is_origin(lv): snap = lv.getAttr() # snap=(, ) if not snap[0]: # Broken?? return None return snap[0][0] in ('o', 'O') def _is_snap(lv): snap = lv.getAttr() # snap=(, ) if not snap[0]: # Broken?? return None return snap[0][0] in ('s', 'S') def _is_virt(lv): snap = lv.getAttr() # snap=(, ) if not snap[0]: # Broken?? return None return snap[0][0] == 'v' def _vg_name2lv(vg, lvname): try: return vg.lvFromName(lvname) except: return None def _list_vg_names(): try: names = lvm.listVgNames() except LibLVMError: # Try to use the lvm binary instead names = [] if not names: # Could be just broken... p = subprocess.Popen(["/sbin/lvm", "vgs", "-o", "vg_name"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) err = p.wait() if err: raise _ResultError(_("Failed to obtain volume group names")) output = p.communicate()[0] output = output.split('\n') if not output: return [] header = output[0].strip() if header != 'VG': return [] names = [] for name in output[1:]: if not name: break names.append(name.strip()) return names def _z_off(z, ctime=0): if len(z) == 5: # +0000 / -0130 / etc. off = int(z[1:3]) * 60 off += int(z[3:5]) off *= 60 if z[0] == '+': ctime -= off if z[0] == '-': ctime += off return ctime def _lv_ctime2utc(ctime): try: # Welcome to insanity ... d,t,z = ctime.split() ctime = time.strptime(d + ' ' + t, "%Y-%m-%d %H:%M:%S") ctime = time.mktime(ctime) if False: # Ignore the offset atm. ... we using this to delete older. cur_z = time.strftime("%z") if cur_z != z: # lol ... cur_z = _z_off(cur_z) z = _z_off(z) ctime += (cur_z - z) except: ctime = 0 return ctime def _lv_data(vg, lv): vgname = vg.getName() lvname = lv.getName() size = lv.getSize() origin = lv.getProperty("origin")[0] tags = lv.getTags() ctime = _lv_ctime2utc(lv.getProperty("lv_time")[0]) used = lv.getProperty("snap_percent")[0] used = float(used) used = used / (1 * 1000 * 1000) data = {'dev' : "%s/%s" % (vgname, lvname), 'ctime' : ctime, 'origin' : origin, 'origin_dev' : "%s/%s" % (vgname, origin), 'free' : vg.getFreeSize(), 'tags' : tags, 'size' : size, 'used' : used} return data def _log_traceback(func): """Decorator for _FSSnap methods that logs LVM tracebacks.""" def wrap(self, *args, **kwargs): try: return func(self, *args, **kwargs) except LibLVMError as e: if self._logger is not None: self._logger.exception(e) raise return wrap def lvmerr2str(exc): """Convert a LibLVMError instance to a readable error message.""" if type(exc) == LibLVMError and len(exc.args) == 2: # args[0] is the error number so ignore that return exc.args[1] else: return str(exc) class _FSSnap(object): # Old style was: vg/lv_root vg/lv_swap # New style is: fedora/root fedora/swap # New style is: redhat/root redhat/swap def __init__(self, root="/", lookup_mounts=True, devices=('!*/swap', '!*/lv_swap'), logger=None): if not lvm or os.geteuid(): devices = [] self.version = _ver # Parts of the API seem to work even when lvm is not actually installed, hence the path test self.available = bool(lvm and os.path.exists("/sbin/lvm")) self.postfix_static = "_yum_" self._postfix = None self._root = root self._devs = devices self._vgname_list = None # Logger object to be used for LVM traceback logging self._logger = logger if not self._devs: return @property def _vgnames(self): if self._vgname_list is None: self._vgname_list = _list_vg_names() if self.available else [] return self._vgname_list def _use_dev(self, vgname, lv=None): if lv is not None: if _is_snap(lv) or _is_virt(lv): # Don't look at these. return False found_neg = False for dev in self._devs: if '/' not in dev: # Bad... continue neg = False if dev[0] == '!': found_neg = True neg = True dev = dev[1:] vgn,lvn = dev.split('/', 1) if '/' in lvn: continue if not fnmatch.fnmatch(vgname, vgn): continue if lvn == '*': return not neg if lv is None: return None lvname = lv.getName() if not fnmatch.fnmatch(lvname, lvn): continue return not neg return found_neg @_log_traceback def has_space(self, percentage=100): """ See if we have enough space to try a snapshot. """ ret = False for vgname in self._vgnames: use = self._use_dev(vgname) if use is not None and not use: continue vg = lvm.vgOpen(vgname, 'r') if not vg: raise _ResultError( _("Unknown error when opening volume group ") + vgname) vgfsize = vg.getFreeSize() lvssize = 0 for lv in vg.listLVs(): if not self._use_dev(vgname, lv): continue lvssize += lv.getSize() vg.close() if not lvssize: continue ret = True if (lvssize * percentage) > (100*vgfsize): return False return ret @_log_traceback def snapshot(self, percentage=100, prefix='', postfix=None, tags={}): """ Attempt to take a snapshot, note that errors can happen after this function succeeds. """ if postfix is None: postfix = '%s%s' % (self.postfix_static, datetime.now().strftime("%Y%m%d%H%M%S.%f")) ret = [] for vgname in self._vgnames: use = self._use_dev(vgname) if use is not None and not use: continue vg = lvm.vgOpen(vgname, 'w') if not vg: raise _ResultError( _("Unknown error when opening volume group ") + vgname) for lv in vg.listLVs(): lvname = lv.getName() if not self._use_dev(vgname, lv): continue nlvname = "%s%s%s" % (prefix, lvname, postfix) nlv = lv.snapshot(nlvname, (lv.getSize() * percentage) / 100) if not nlv: # Failed here ... continuing seems bad. vg.close() raise _ResultError( _("Unknown error when creating snapshot ") + nlvname) odev = "%s/%s" % (vgname, lvname) ndev = "%s/%s" % (vgname, nlvname) # FIXME: yum_fssnapshot_pre_lv_name= eq_tags = set() for val in (ndev, odev, '*'): for tag in tags.get(val, []): if '=' in tag: eq_tag_key,eq_tag_val = tag.split('=', 1) if eq_tag_key in eq_tags: continue eq_tags.add(eq_tag_key) nlv.addTag(tag) ret.append((odev, ndev)) vg.close() return ret @_log_traceback def old_snapshots(self): """ List data for old snapshots. """ ret = [] for vgname in self._vgnames: # We could filter out the VGs using _use_dev() but this way we'll # see stuff after changing config. options. vg = lvm.vgOpen(vgname, 'w') if not vg: raise _ResultError( _("Unknown error when opening volume group ") + vgname) for lv in vg.listLVs(): if not _is_snap(lv): # No snapshot means, we don't care. continue ret.append(_lv_data(vg, lv)) vg.close() return ret @_log_traceback def del_snapshots(self, devices=[]): """ Remove snapshots. """ if not lvm: return [] ret = [] togo = {} for dev in devices: vgname,lvname = dev.split('/') if vgname not in togo: togo[vgname] = set([lvname]) else: togo[vgname].add(lvname) for vgname in togo: vg = lvm.vgOpen(vgname, 'w') if not vg: raise _ResultError( _("Unknown error when opening volume group ") + vgname) for lvname in togo[vgname]: lv = _vg_name2lv(vg, lvname) if not lv: continue if not _is_snap(lv): # No snapshot means don't try to delete! continue ret.append(_lv_data(vg, lv)) lv.remove() vg.close() return ret PK[ė!##$site-packages/yum/transactioninfo.pynuȯ#! /usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University # Written by Seth Vidal # TODOS: make all the package relationships deal with package objects # search by package object for TransactionData, etc. # provide a real TransactionData.remove(txmbr) method, It should # remove the given txmbr and iterate to remove all those in depedent relationships # with the given txmbr. """ Classes and functions for manipulating a transaction to be passed to rpm. """ from constants import * from packageSack import PackageSack, PackageSackVersion from packages import YumInstalledPackage from sqlitesack import YumAvailablePackageSqlite import Errors import warnings import misc import time class GetProvReqOnlyPackageSack(PackageSack): def __init__(self, need_files=False): PackageSack.__init__(self) self._need_index_files = need_files def __addPackageToIndex_primary_files(self, obj): for ftype in obj.returnFileTypes(primary_only=True): for file in obj.returnFileEntries(ftype, primary_only=True): self._addToDictAsList(self.filenames, file, obj) def __addPackageToIndex_files(self, obj): for ftype in obj.returnFileTypes(): for file in obj.returnFileEntries(ftype): self._addToDictAsList(self.filenames, file, obj) def _addPackageToIndex(self, obj): for (n, fl, (e,v,r)) in obj.returnPrco('provides'): self._addToDictAsList(self.provides, n, obj) for (n, fl, (e,v,r)) in obj.returnPrco('requires'): self._addToDictAsList(self.requires, n, obj) if self._need_index_files: self.__addPackageToIndex_files(obj) else: self.__addPackageToIndex_primary_files(obj) def __buildFileIndexes(self): for repoid in self.pkgsByRepo: for obj in self.pkgsByRepo[repoid]: self.__addPackageToIndex_files(obj) def searchFiles(self, name): if not self._need_index_files and not misc.re_primary_filename(name): self._need_index_files = True if self.indexesBuilt: self.filenames = {} self.__buildFileIndexes() return PackageSack.searchFiles(self, name) class TransactionData: """Data Structure designed to hold information on a yum Transaction Set""" def __init__(self): self.flags = [] self.vsflags = [] self.probFilterFlags = [] self.root = '/' self.pkgdict = {} # key = pkgtup, val = list of TransactionMember obj self._namedict = {} # name -> list of TransactionMember obj self._unresolvedMembers = set() self.debug = 0 self.changed = False self.installonlypkgs = [] self.state_counter = 0 self.tm_created = time.time() self.tm_changed = time.time() self.conditionals = {} # key = pkgname, val = list of pos to add self.rpmdb = None self._pkgSack = None self._pkgSackCtor = None self.pkgSackPackages = 0 self.localSack = PackageSack() self._inSack = GetProvReqOnlyPackageSack() # lists of txmbrs in their states - just placeholders self.instgroups = [] self.removedgroups = [] self.instenvironments = [] self.removedenvironments = [] self.removed = [] self.installed = [] self.updated = [] self.obsoleted = [] self.depremoved = [] self.depinstalled = [] self.depupdated = [] self.reinstalled = [] self.downgraded = [] self.failed = [] self._future_rpmdbv = None self._check_future_rpmdbv = None def _changed(self): self.changed = True self.state_counter += 1 self.tm_changed = time.time() def __len__(self): return len(self.pkgdict) def __iter__(self): if hasattr(self.getMembers(), '__iter__'): return self.getMembers().__iter__() else: return iter(self.getMembers()) def _getPkgSack(self): if self._pkgSack is not None: return self._pkgSack if self._pkgSackCtor is not None: self._pkgSack = self._pkgSackCtor() return self._pkgSack pkgSack = property(fget=lambda self: self._getPkgSack(), fset=lambda self, value: setattr(self, "_pkgSack",value), fdel=lambda self: setattr(self, "_pkgSack", None), doc="Package sack object") def debugprint(self, msg): if self.debug: print msg def getMembersWithState(self, pkgtup=None, output_states=None): return filter(lambda p: p.output_state in output_states, self.getMembers(pkgtup)) def getMembers(self, pkgtup=None): """takes an optional package tuple and returns all transaction members matching, no pkgtup means it returns all transaction members""" returnlist = [] if pkgtup is None: for members in self.pkgdict.itervalues(): returnlist.extend(members) elif pkgtup in self.pkgdict: returnlist.extend(self.pkgdict[pkgtup]) return returnlist # The order we resolve things in _matters_, so for sanity sort the list # otherwise .i386 can be different to .x86_64 etc. def getUnresolvedMembers(self): return list(sorted(self._unresolvedMembers)) def markAsResolved(self, txmbr): self._unresolvedMembers.discard(txmbr) def resetResolved(self, hard=False): if hard or len(self) < len(self._unresolvedMembers): self._unresolvedMembers.clear() self._unresolvedMembers.update(self.getMembers()) return True return False def getMode(self, name=None, arch=None, epoch=None, ver=None, rel=None): """returns the mode of the first match from the transaction set, otherwise, returns None""" txmbrs = self.matchNaevr(name=name, arch=arch, epoch=epoch, ver=ver, rel=rel) if not len(txmbrs): return None states = [] for txmbr in txmbrs: states.append(txmbr.ts_state) if 'u' in states: return 'u' elif 'i' in states: return 'i' else: return states[0] def matchNaevr(self, name=None, arch=None, epoch=None, ver=None, rel=None): """returns the list of packages matching the args above""" if name is None: txmbrs = self.getMembers() else: txmbrs = self._namedict.get(name, []) if arch is None and epoch is None and ver is None and rel is None: return txmbrs[:] result = [] for txmbr in txmbrs: (n, a, e, v, r) = txmbr.pkgtup # Name is done above if arch is not None and arch != a: continue if epoch is not None and epoch != e: continue if ver is not None and ver != v: continue if rel is not None and rel != r: continue result.append(txmbr) return result def deselect(self, pattern): """ Remove these packages from the transaction. This is more user orientated than .remove(). Used from kickstart/install -blah. """ # We don't have a returnPackages() here, so just try the "simple" # specifications. Pretty much 100% hit rate on kickstart. txmbrs = self.matchNaevr(pattern) if not txmbrs: na = pattern.rsplit('.', 2) if len(na) == 2: txmbrs = self.matchNaevr(na[0], na[1]) if not txmbrs: pkgs = [] if self._inSack is not None: pkgs = self._inSack.returnPackages(patterns=[pattern]) if not pkgs and self.pkgSack is not None: pkgs = self.pkgSack.returnPackages(patterns=[pattern]) if not pkgs: pkgs = self.rpmdb.returnPackages(patterns=[pattern]) for pkg in pkgs: txmbrs.extend(self.getMembers(pkg.pkgtup)) # Now we need to do conditional group packages, so they don't # get added later on. This is hacky :( for req, cpkgs in self.conditionals.iteritems(): if pkg in cpkgs: cpkgs.remove(pkg) self.conditionals[req] = cpkgs for txmbr in txmbrs: self.remove(txmbr.pkgtup) return txmbrs def _isLocalPackage(self, txmember): # Is this the right criteria? # FIXME: This is kinda weird, we really want all local pkgs to be in a # special pkgsack before this point ... so that "yum up ./*.rpm" works. # Also FakePackage() sets it off ... which is confusing and not what # happens IRL. return txmember.ts_state in ('u', 'i') and not isinstance(txmember.po, (YumInstalledPackage, YumAvailablePackageSqlite)) # NOTE: This is a copy of Depsolve.allowedMultipleInstalls() because # we can't get to YumBase from here. Use that as the main/public API. def _allowedMultipleInstalls(self, po): """takes a packageObject, returns 1 or 0 depending on if the package should/can be installed multiple times with different vers like kernels and kernel modules, for example""" if po.name in self.installonlypkgs: return True provides = po.provides_names if filter (lambda prov: prov in self.installonlypkgs, provides): return True return False def add(self, txmember): """add a package to the transaction""" for oldpo in txmember.updates: self.addUpdated(oldpo, txmember.po) if txmember.pkgtup not in self.pkgdict: self.pkgdict[txmember.pkgtup] = [] else: self.debugprint("Package: %s.%s - %s:%s-%s already in ts" % txmember.pkgtup) for member in self.pkgdict[txmember.pkgtup]: if member.ts_state == txmember.ts_state: self.debugprint("Package in same mode, skipping.") return self.pkgdict[txmember.pkgtup].append(txmember) self._namedict.setdefault(txmember.name, []).append(txmember) self._changed() if self._isLocalPackage(txmember): self.localSack.addPackage(txmember.po) elif isinstance(txmember.po, YumAvailablePackageSqlite): self.pkgSackPackages += 1 if self._inSack is not None and txmember.output_state in TS_INSTALL_STATES: if not txmember.po.have_fastReturnFileEntries(): # In theory we could keep this on if a "small" repo. fails self._inSack = None else: self._inSack.addPackage(txmember.po) if txmember.name in self.conditionals: for pkg in self.conditionals[txmember.name]: if self.rpmdb.contains(po=pkg): continue for condtxmbr in self.install_method(po=pkg): condtxmbr.setAsDep(po=txmember.po) self._unresolvedMembers.add(txmember) def remove(self, pkgtup): """remove a package from the transaction""" if pkgtup not in self.pkgdict: self.debugprint("Package: %s not in ts" %(pkgtup,)) return for txmbr in self.pkgdict[pkgtup]: txmbr.po.state = None if self._isLocalPackage(txmbr): self.localSack.delPackage(txmbr.po) elif isinstance(txmbr.po, YumAvailablePackageSqlite): self.pkgSackPackages -= 1 if self._inSack is not None and txmbr.output_state in TS_INSTALL_STATES: self._inSack.delPackage(txmbr.po) self._namedict[txmbr.name].remove(txmbr) self._unresolvedMembers.add(txmbr) del self.pkgdict[pkgtup] if not self._namedict[pkgtup[0]]: del self._namedict[pkgtup[0]] self._changed() def exists(self, pkgtup): """tells if the pkg is in the class""" if pkgtup in self.pkgdict: if len(self.pkgdict[pkgtup]) != 0: return 1 return 0 def isObsoleted(self, pkgtup): """true if the pkgtup is marked to be obsoleted""" if self.exists(pkgtup): for txmbr in self.getMembers(pkgtup=pkgtup): if txmbr.output_state == TS_OBSOLETED: return True return False def makelists(self, include_reinstall=False, include_downgrade=False): """returns lists of transaction Member objects based on mode: updated, installed, erased, obsoleted, depupdated, depinstalled deperased""" self.instgroups = [] self.removedgroups = [] self.instenvironments = [] self.removedenvironments = [] self.removed = [] self.installed = [] self.updated = [] self.obsoleted = [] self.depremoved = [] self.depinstalled = [] self.depupdated = [] self.reinstalled = [] self.downgraded = [] self.failed = [] for txmbr in self.getMembers(): if txmbr.output_state == TS_UPDATE: if txmbr.isDep: self.depupdated.append(txmbr) else: self.updated.append(txmbr) elif txmbr.output_state in (TS_INSTALL, TS_TRUEINSTALL): if include_reinstall and txmbr.reinstall: self.reinstalled.append(txmbr) continue if include_downgrade and txmbr.downgrades: self.downgraded.append(txmbr) continue if txmbr.groups: for g in txmbr.groups: if g not in self.instgroups: self.instgroups.append(g) if txmbr.environments: for evg in txmbr.environments: if evg not in self.instenvironments: self.instenvironments.append(evg) # "user" here is kind of a hack ... we really shouldn't have # .isDep == True, but this probably doesn't hurt. if txmbr.isDep and txmbr.reason != 'user': self.depinstalled.append(txmbr) else: self.installed.append(txmbr) elif txmbr.output_state == TS_ERASE: if include_downgrade and txmbr.downgraded_by: continue for g in txmbr.groups: if g not in self.instgroups: self.removedgroups.append(g) for evg in txmbr.environments: if evg not in self.instenvironments: self.removedenvironments.append(evg) if txmbr.isDep: self.depremoved.append(txmbr) else: self.removed.append(txmbr) elif txmbr.output_state == TS_OBSOLETED: self.obsoleted.append(txmbr) elif txmbr.output_state == TS_OBSOLETING: self.installed.append(txmbr) elif txmbr.output_state == TS_FAILED: self.failed.append(txmbr) else: pass self.updated.sort() self.installed.sort() self.removed.sort() self.obsoleted.sort() self.depupdated.sort() self.depinstalled.sort() self.depremoved.sort() self.instgroups.sort() self.removedgroups.sort() self.instenvironments.sort() self.removedenvironments.sort() self.reinstalled.sort() self.downgraded.sort() self.failed.sort() def addInstall(self, po): """adds a package as an install but in mode 'u' to the ts takes a packages object and returns a TransactionMember Object""" if self._allowedMultipleInstalls(po): return self.addTrueInstall(po) txmbr = TransactionMember(po) txmbr.current_state = TS_AVAILABLE txmbr.output_state = TS_INSTALL txmbr.po.state = TS_INSTALL txmbr.ts_state = 'u' if self.rpmdb.contains(po=txmbr.po): txmbr.reinstall = True self.findObsoletedByThisMember(txmbr) self.add(txmbr) return txmbr def addTrueInstall(self, po): """adds a package as an install takes a packages object and returns a TransactionMember Object""" txmbr = TransactionMember(po) txmbr.current_state = TS_AVAILABLE txmbr.output_state = TS_TRUEINSTALL txmbr.po.state = TS_INSTALL txmbr.ts_state = 'i' if self.rpmdb.contains(po=txmbr.po): txmbr.reinstall = True self.add(txmbr) return txmbr def addErase(self, po): """adds a package as an erasure takes a packages object and returns a TransactionMember Object""" txmbr = TransactionMember(po) txmbr.current_state = TS_INSTALL txmbr.output_state = TS_ERASE txmbr.po.state = TS_INSTALL txmbr.ts_state = 'e' self.add(txmbr) return txmbr def addUpdate(self, po, oldpo=None): """adds a package as an update takes a packages object and returns a TransactionMember Object""" if self._allowedMultipleInstalls(po): return self.addTrueInstall(po) txmbr = TransactionMember(po) txmbr.current_state = TS_AVAILABLE txmbr.output_state = TS_UPDATE txmbr.po.state = TS_UPDATE txmbr.ts_state = 'u' if oldpo: txmbr.relatedto.append((oldpo, 'updates')) txmbr.updates.append(oldpo) self.add(txmbr) self.findObsoletedByThisMember(txmbr) return txmbr def addDowngrade(self, po, oldpo): """adds a package as an downgrade takes a packages object and returns a pair of TransactionMember Objects""" itxmbr = self.addErase(oldpo) itxmbr.relatedto.append((po, 'downgradedby')) itxmbr.downgraded_by.append(po) atxmbr = self.addInstall(po) if not atxmbr: # Fail? self.remove(itxmbr.pkgtup) return None if 'reason' in oldpo.yumdb_info: atxmbr.reason = oldpo.yumdb_info.reason atxmbr.relatedto.append((oldpo, 'downgrades')) atxmbr.downgrades.append(oldpo) return (itxmbr, atxmbr) def addUpdated(self, po, updating_po): """adds a package as being updated by another pkg takes a packages object and returns a TransactionMember Object""" txmbr = TransactionMember(po) txmbr.current_state = TS_INSTALL txmbr.output_state = TS_UPDATED txmbr.po.state = TS_UPDATED txmbr.ts_state = 'ud' txmbr.relatedto.append((updating_po, 'updatedby')) txmbr.updated_by.append(updating_po) if 'reason' in po.yumdb_info: # Propbably worthless, but... txmbr.reason = po.yumdb_info.reason self.add(txmbr) return txmbr def addObsoleting(self, po, oldpo): """adds a package as an obsolete over another pkg takes a packages object and returns a TransactionMember Object""" txmbr = TransactionMember(po) txmbr.current_state = TS_AVAILABLE txmbr.output_state = TS_OBSOLETING txmbr.po.state = TS_OBSOLETING txmbr.ts_state = 'u' txmbr.relatedto.append((oldpo, 'obsoletes')) txmbr.obsoletes.append(oldpo) if self.rpmdb.contains(po=txmbr.po): txmbr.reinstall = True self.add(txmbr) return txmbr def addObsoleted(self, po, obsoleting_po): """adds a package as being obsoleted by another pkg takes a packages object and returns a TransactionMember Object""" txmbr = TransactionMember(po) txmbr.current_state = TS_INSTALL txmbr.output_state = TS_OBSOLETED txmbr.po.state = TS_OBSOLETED txmbr.ts_state = 'od' txmbr.relatedto.append((obsoleting_po, 'obsoletedby')) txmbr.obsoleted_by.append(obsoleting_po) if 'reason' in po.yumdb_info: # Propbably worthless, but... txmbr.reason = po.yumdb_info.reason self.add(txmbr) for otxmbr in self.getMembersWithState(obsoleting_po.pkgtup, [TS_OBSOLETING]): if po in otxmbr.obsoletes: continue otxmbr.relatedto.append((po, 'obsoletes')) otxmbr.obsoletes.append(po) return txmbr def setDatabases(self, rpmdb, pkgSack, pkgSackCtor=None): self.rpmdb = rpmdb self._pkgSack = pkgSack self._pkgSackCtor = pkgSackCtor def getNewProvides(self, name, flag=None, version=(None, None, None)): """return dict { packages -> list of matching provides } searches in packages to be installed""" result = { } if not self.pkgSackPackages: pass elif self._inSack is None: for pkg, hits in self.pkgSack.getProvides(name, flag, version).iteritems(): if self.getMembersWithState(pkg.pkgtup, TS_INSTALL_STATES): result[pkg] = hits else: for pkg, hits in self._inSack.getProvides(name, flag, version).iteritems(): result[pkg] = hits result.update(self.localSack.getProvides(name, flag, version)) return result def getOldProvides(self, name, flag=None, version=(None, None, None)): """return dict { packages -> list of matching provides } searches in packages already installed and not going to be removed""" result = { } for pkg, hits in self.rpmdb.getProvides(name, flag, version).iteritems(): if not self.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES): result[pkg] = hits return result def getProvides(self, name, flag=None, version=(None, None, None)): """return dict { packages -> list of matching provides }""" result = self.getOldProvides(name, flag, version) result.update(self.getNewProvides(name, flag, version)) return result def getNewRequires(self, name, flag=None, version=(None, None, None)): """return dict { packages -> list of matching provides } searches in packages to be installed""" result = { } if not self.pkgSackPackages: pass elif self._inSack is None: for pkg, hits in self.pkgSack.getRequires(name, flag, version).iteritems(): if self.getMembersWithState(pkg.pkgtup, TS_INSTALL_STATES): result[pkg] = hits else: for pkg, hits in self._inSack.getRequires(name, flag, version).iteritems(): result[pkg] = hits result.update(self.localSack.getRequires(name, flag, version)) return result def getOldRequires(self, name, flag=None, version=(None, None, None)): """return dict { packages -> list of matching provides } searches in packages already installed and not going to be removed""" result = { } for pkg, hits in self.rpmdb.getRequires(name, flag, version).iteritems(): if not self.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES): result[pkg] = hits return result def getRequires(self, name, flag=None, version=(None, None, None)): """return dict { packages -> list of matching provides }""" result = self.getOldRequires(name, flag, version) result.update(self.getNewRequires(name, flag, version)) return result def futureRpmDBVersion(self): """ Return a simple version for the future rpmdb. Works like rpmdb.simpleVersion(main_only=True)[0], but for the state the rpmdb will be in after the transaction. """ if self._future_rpmdbv is not None: sc, ret = self._future_rpmdbv if sc == self.state_counter: return ret pkgs = self.rpmdb.returnPackages() _reinstalled_pkgtups = {} for txmbr in self.getMembersWithState(None, TS_INSTALL_STATES): # reinstalls have to use their "new" checksum data, in case it's # different. if txmbr.reinstall: _reinstalled_pkgtups[txmbr.po.pkgtup] = txmbr.po pkgs.append(txmbr.po) self.rpmdb.preloadPackageChecksums() main = PackageSackVersion() pkg_checksum_tups = [] for pkg in sorted(pkgs): if pkg.repoid != 'installed': # Paste from PackageSackBase.simpleVersion() csum = pkg.returnIdSum() main.update(pkg, csum) pkg_checksum_tups.append((pkg.pkgtup, csum)) continue # Installed pkg, see if it's about to die if self.getMembersWithState(pkg.pkgtup, TS_REMOVE_STATES): continue # ...or die and be risen again (Zombie!) if pkg.pkgtup in _reinstalled_pkgtups: continue # Paste from rpmdb.simpleVersion() ydbi = pkg.yumdb_info csum = None if 'checksum_type' in ydbi and 'checksum_data' in ydbi: csum = (ydbi.checksum_type, ydbi.checksum_data) # We need all the pkgtups, so we even save the ones without a # checksum. pkg_checksum_tups.append((pkg.pkgtup, csum)) main.update(pkg, csum) self.rpmdb.transactionCachePackageChecksums(pkg_checksum_tups) self._future_rpmdbv = (self.state_counter, main) return main def findObsoletedByThisMember(self, txmbr): """addObsoleted() pkgs for anything that this txmbr will obsolete""" # this is mostly to keep us in-line with what will ACTUALLY happen # when rpm hits the obsoletes, whether we added them or not for obs_n in txmbr.po.obsoletes_names: for pkg in self.rpmdb.searchNevra(name=obs_n): if pkg.obsoletedBy([txmbr.po]): self.addObsoleted(pkg, txmbr.po) txmbr.output_state = TS_OBSOLETING txmbr.po.state = TS_OBSOLETING class ConditionalTransactionData(TransactionData): """A transaction data implementing conditional package addition""" def __init__(self): warnings.warn("ConditionalTransactionData will go away in a future " "version of Yum.", Errors.YumFutureDeprecationWarning) TransactionData.__init__(self) class SortableTransactionData(TransactionData): """A transaction data implementing topological sort on it's members""" def __init__(self): # Cache of sort self._sorted = [] # Current dependency path self.path = [] # List of loops self.loops = [] TransactionData.__init__(self) def _visit(self, txmbr): self.path.append(txmbr.name) txmbr.sortColour = TX_GREY for po in txmbr.depends_on: vertex = self.getMembers(pkgtup=po.pkgtup)[0] if vertex.sortColour == TX_GREY: self._doLoop(vertex.name) if vertex.sortColour == TX_WHITE: self._visit(vertex) txmbr.sortColour = TX_BLACK self._sorted.insert(0, txmbr.pkgtup) def _doLoop(self, name): self.path.append(name) loop = self.path[self.path.index(self.path[-1]):] if len(loop) > 2: self.loops.append(loop) def add(self, txmember): txmember.sortColour = TX_WHITE TransactionData.add(self, txmember) self._sorted = [] def remove(self, pkgtup): TransactionData.remove(self, pkgtup) self._sorted = [] def sort(self): if self._sorted: return self._sorted self._sorted = [] # loop over all members for txmbr in self.getMembers(): if txmbr.sortColour == TX_WHITE: self.path = [ ] self._visit(txmbr) self._sorted.reverse() return self._sorted class TransactionMember: """Class to describe a Transaction Member (a pkg to be installed/ updated/erased).""" def __init__(self, po): # holders for data self.po = po # package object self.current_state = None # where the package currently is (repo, installed) self.ts_state = None # what state to put it into in the transaction set self.output_state = None # what state to list if printing it self.isDep = 0 self.reason = 'user' # reason for it to be in the transaction set self.process = None # I think this is used nowhere by nothing - skv 2010/11/03 self.relatedto = [] # ([relatedpkg, relationship)] self.depends_on = [] self.obsoletes = [] self.obsoleted_by = [] self.updates = [] self.updated_by = [] self.downgrades = [] self.downgraded_by = [] self.reinstall = False self.groups = [] # groups it's in self.environments = [] # Env. groups it's in self.repopkg = None # repo pkg "group" it was removed/installed by self._poattr = ['pkgtup', 'repoid', 'name', 'arch', 'epoch', 'version', 'release'] for attr in self._poattr: val = getattr(self.po, attr) setattr(self, attr, val) if po.repoid == 'installed': # We want to load these so that we can auto hardlink in the same # new values. Because of the hardlinks it should be really cheap # to load them ... although it's still a minor hack. po.yumdb_info.get('from_repo') po.yumdb_info.get('releasever') po.yumdb_info.get('changed_by') def setAsDep(self, po=None, relonly=False): """sets the transaction member as a dependency and maps the dep into the relationship list attribute""" if not relonly: self.isDep = 1 if po: self.relatedto.append((po, 'dependson')) self.depends_on.append(po) def removeDep(self, po): """sets the transaction member as a dependency and maps the dep into the relationship list attribute""" nrelto = [] for data in self.relatedto: if data[0] == po: continue nrelto.append(data) self.relatedto = nrelto ndepon = [] for data in self.depends_on: if data == po: continue ndepon.append(data) self.depends_on = ndepon def __cmp__(self, other): return cmp(self.po, other.po) def __hash__(self): return object.__hash__(self) def __str__(self): return "%s.%s %s:%s-%s - %s" % (self.name, self.arch, self.epoch, self.version, self.release, self.ts_state) def __repr__(self): return "<%s : %s (%s)>" % (self.__class__.__name__, str(self),hex(id(self))) def _dump(self): msg = ["mbr: %s,%s,%s,%s,%s %s\n" % (self.name, self.arch, self.epoch, self.version, self.release, self.current_state), " repo: %s\n" % self.po.repo.id, " ts_state: %s\n" % self.ts_state, " output_state: %s\n" % self.output_state, " isDep: %s\n" % bool(self.isDep), " reason: %s\n" % self.reason, # " process: %s\n" % self.process, " reinstall: %s\n" % bool(self.reinstall)] if self.relatedto: msg += [" relatedto:"] for (po, rel) in self.relatedto: pkgorigin = 'a' if isinstance(po, YumInstalledPackage): pkgorigin = 'i' msg += [" %s,%s,%s,%s,%s@%s:%s" % (po.name, po.arch, po.epoch, po.version, po.release, pkgorigin, rel)] msg += ["\n"] for lst in ['depends_on', 'obsoletes', 'obsoleted_by', 'downgrades', 'downgraded_by', 'updates', 'updated_by']: thislist = getattr(self, lst) if thislist: msg += [" %s:" % lst] for po in thislist: pkgorigin = 'a' if isinstance(po, YumInstalledPackage): pkgorigin = 'i' msg += [" %s,%s,%s,%s,%s@%s" % (po.name, po.arch, po.epoch, po.version, po.release, pkgorigin)] msg += ["\n"] if self.groups: msg += [" groups: %s\n" % ' '.join(self.groups)] if self.environments: msg += [" environments: %s\n" % ' '.join(self.environments)] if self.repopkg: msg += [" repopkg: %s\n" % self.repopkg] return ''.join(msg) PK[ѕ3@3@site-packages/yum/i18n.pycnu[ v_c@s<dZdZdZddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~dddddddddddddddddddddddddddddddfZdZdZdZdZddZ de dddZ dZ dZ ddddZdZdddZddZdddZdZdZdZysddlZejdde ZejZejZddlZejejkrejdde je_nWneZeZnXedkr8ddlZdZ d GHxej!d D]Z"e e"q?Wd GHxFej!d D]7Z"yee"Z"Wne#k rqfnXe e"qfWe$ej!d kr8d GHe ej!d ej!d dGHy+eej!d e%eej!d Z"Wne#k r'ej&dnXe e"q8ndS(cCs t|S(sD Dummy Translation wrapper, just returning the same string. (t to_unicode(tstr((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt dummy_wrapperscCs|dkr|S|SdS(s] Dummy Plural Translation wrapper, just returning the singular or plural string. iN((tstr1tstr2tn((s,/usr/lib/python2.7/site-packages/yum/i18n.pytdummyP_wrappers cCsd}t|d}|||dks>|||dkrBtSxd||kr||d}|||dkr|d}qE|||dkr|d}qEtSqEWtS(s9 auxiliary function for binary search in interval table. iii(tlentFalsetTrue(tucsttabletmintmaxtmid((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt__utf8_bisearchBs(  iioiiiiiiiiiiiiiiiiiKi^ipiiiiiiiii0iJiiiii i i< iA iH iM iQ iT ib ic i i i i i i i i i i< iA iB iG iH iK iM ip iq i i i i i i i i i i i i< i? iA iC iM iV i i i i> i@ iF iH iJ iM iU iV i i i i i i i iA iC iM i i i i i1i4i:iGiNiiiiiiiiii5i7i9iqi~iiiiiiiiii-i0i2i6i7i9iXiYi`ii_iii2i4iRiSirisiiiiiiiii i ii i"i'i(i2i9i;iiiii4i6i:i<iBikisiiiii i i* i. i` ic ij io i i i*0i/0i0i0ii i%i&iiii i#iiii i i i i i i8 i: i? igiiisiiiiiiBiDii iiicCsa|dkrdS|dks4|dkr8|dkr8dSt|trKdSd|dko_|dkp_|d kp_|d kp_|d kr|d kr|d kp_|dkr|dkp_|dkr|dkp_|dkr|dkp_|dkr|dkp_|dkr|dkp_|dkr2|dkp_|dkrJ|dkp_|dko_|dkS(s+ Get the textual width of a ucs character. ii iiiiii_i)#i*#i.iϤi?0iiiiiii0ioii`iiiiii(Rt __combining(R ((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt__utf8_ucp_widths( $   ccs&xt|D]}t|Vq WdS(N(tto_utf8tord(tmsgtbyte((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt__utf8_iter_intssc cset|}xR|D]J}|dkr3|dfVq|d@dkr|j}|d@dkso|d@dkrxdVdS|d@d>|d @BdfVq|d @dkrq|j}|j}|d@dks>|d@dks>|dkr|d@dks>|d kr|d@d ks>|d krG|dkrG|d@dkrGdVdS|d@d>|d @d>B|d @BdfVq|d@d krT|j}|j}|j}|d@dks|d@dks|d@dks|d kr|d @dks|dkr |dks|dkrdVdS|d@d>|d @d>B|d @d>B|d @BdfVqdVdSqWdS(Niiiiiiiii?iiiiiiiii iiiiii(Ni(Ni(Ni(Ni(RtnexttNone(Rtuitertbyte0tbyte1tbyte2tbyte3((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt__utf8_iter_ucssL           6cCsPd}xCt|D]5\}}|dkr8||7}q|t|7}qW|S(s) Get the textual width of a utf8 string. iN(RRR(RtretR tbytes((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt utf8_widths   cCs|dkst||kr.t||fSd}t|t}d}t|}xyt|D]k\}}|dkr|}n t|}|dk r|||kr|| }Pn||7}||7}qbW|rt|}n||fS(s Return the textual width of a utf8 string, chopping it to a specified value. This is what you want to use instead of %.*s, as it does the "right" thing with regard to utf-8 sequences. Eg. "%.*s" % (10, msg) <= becomes => "%s" % (utf8_width_chop(msg, 10)) iN(RR!t isinstancetunicodeRRRR(RtchopRtpassed_unicodet msg_bytesR R twidth((s,/usr/lib/python2.7/site-packages/yum/i18n.pytutf8_width_chops$      tc Cs|}t||\}}||krQ|s3|rdj|||g}qnMd||}|rdj||||g}ndj||||g}t|trt|S|S(s Expand a utf8 msg to a specified "width" or chop to same. Expansion can be left or right. This is what you want to use instead of %*.*s, as it does the "right" thing with regard to utf-8 sequences. prefix and suffix should be used for "invisible" bytes, like highlighting. Eg. "%-*.*s" % (10, 20, msg) <= becomes => "%s" % (utf8_width_fill(msg, 10, 20)). "%20.10s" % (msg) <= becomes => "%s" % (utf8_width_fill(msg, 20, 10, left=False)). "%s%.10s%s" % (prefix, msg, suffix) <= becomes => "%s" % (utf8_width_fill(msg, 0, 10, prefix=prefix, suffix=suffix)). R)t (R(tjoinR"R#R( RtfillR$tlefttprefixtsuffixt passed_msgR'textra((s,/usr/lib/python2.7/site-packages/yum/i18n.pytutf8_width_fills   cCs1x*t|D]\}}|dkr tSq WtS(s. Return True/False is the text is valid utf8. N(RRRR (RR R ((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt utf8_valid$s cGshd}x|D]}|t|7}q W||kr7tSd}x|D]}|t|7}qDW||kS(s{ Minor speed hack, we often want to know "does X fit in Y". It takes "a while" to work out a utf8_width() (see above), and we know that a utf8 character is always <= byte. So given: assert bytes >= characters characters <= width? ...we can change to: bytes <= width or characters <= width ...and bytes are much faster. i(RR R!(R'targsRtarg((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt_utf8_width_le+s   iFc st|t}fdt|}t|}t|jd}t|jdd jd}g}|}t}d} d} x |D]} | jd} | | } } | \} } t}|r| rt}n|r| t| krt}n|r2| r2| dkr2| | kr2t}q2n|r]|j |jd|}t}n| t| krxd} n|r| j d} | } nt ||| rt}|j || |}qnt}| jd}|} | }| r| dkr| }nxt|D]l}t || | rgt | t |krg|j | jd|d|} n| |7} | d7} qW| jdd}qW|r|j |jdn|rt t|S|S( sl Works like we want textwrap.wrap() to work, uses utf-8 data and doesn't screw up lists/blocks/etc. csd}d}x(|D] }|dkr)Pn|d7}qW|d krM|dfSt||dd}|dkr||t|}|dp|d}|r||d|fSn|dfS(NitXR*it-t*t.toss•s‣s∘(R8R9R:R;s(R8R9R:R;s•s‣s∘(R(R(tlinetcountRtlist_chrtnxt(t_indent_at_beg(s,/usr/lib/python2.7/site-packages/yum/i18n.pyR@Vs      s s R*iiiR)s (R"R#RtrstriptreplacetsplitRR RtappendtlstripR6R!tmapR(ttextR'tinitial_indenttsubsequent_indentR%tlinesRtindentt wrap_lasttcsabt cspc_indentR<tlsabt lspc_indenttforce_nltwordstspcstword((R@s,/usr/lib/python2.7/site-packages/yum/i18n.pytutf8_text_wrapCsp  !              cOsdjt|||S(sl Works like we want textwrap.fill() to work, uses utf-8 data and doesn't screw up lists/blocks/etc. s (R+RU(RGR4tkwargs((s,/usr/lib/python2.7/site-packages/yum/i18n.pytutf8_text_fillssutf-8RBcCs:t|tr6t|ts6t|||}q6n|S(s convert a 'str' to 'unicode' (R"t basestringR#(tobjtencodingterrors((s,/usr/lib/python2.7/site-packages/yum/i18n.pyRscCs(t|tr$|jd|}n|S(s2convert 'unicode' to an encoded utf-8 byte string sutf-8(R"R#tencode(RYR[((s,/usr/lib/python2.7/site-packages/yum/i18n.pyRscCs-yt|||SWntk r(|SXdS(s. Don't ask don't tell, only use when you must N(RtUnicodeEncodeError(RYRZR[((s,/usr/lib/python2.7/site-packages/yum/i18n.pytto_unicode_maybes cCs"t|tst|}n|S(s1 Convert something to a string, if it isn't one. (R"RXR(RY((s,/usr/lib/python2.7/site-packages/yum/i18n.pytto_strscCsQt|tt|tkr1||krMtSnt|t|krMtStS(sP convert between unicode and not and compare them, w/o warning or being annoying(R"R#R RR(tatb((s,/usr/lib/python2.7/site-packages/yum/i18n.pytstr_eqs  cCsUyt|jSWnnXyt|SWnnXytt|SWnnXdS(sConvert an exception to a message. This function will convert the exception using to_unicode, unicode, or str, whichever works correctly. :param e: an exception :return: a string representation of the exception s%(RtvalueR#R(te((s,/usr/lib/python2.7/site-packages/yum/i18n.pyt exception2msgs iNtyumtfallbacktmessagest__main__cCst|}dG|GHdGt|GHt|}dG|GHdGt|GHdGt|GHdGt|GHdGddt|d d d fGHd Gddt|d d d fGHdGddt|d dd fGHdGddt|d dd fGHdGddt|d d d fGHdGddt|d dd fGHdGddt|d dd fGHdGddt|ddd fGHdGddt|ddd fGHdGHdS(NsUTF8 :slen :sUSC :svalid:swidth:s4.8 :s%s%s%sts4.3 :is4.2 :is4.1 :is3.3 :s3.2 :s3.1 :s40.79:i(iOs40.20:iR)(RRRR3R!R2(R5((s,/usr/lib/python2.7/site-packages/yum/i18n.pytout s$    """""""""s ---- Arguments/str ---- is ---- Arguments/gettext ---- is ---- Arguments/str/all ---- s! ---- Arguments/gettext/all ---- i(iio(ii(ii(ii(ii(ii(ii(ii(ii(ii(iKi^(ipip(ii(ii(ii(ii(ii(i0iJ(ii(ii(i i (i< i< (iA iH (iM iM (iQ iT (ib ic (i i (i i (i i (i i (i i (i i (i< i< (iA iB (iG iH (iK iM (ip iq (i i (i i (i i (i i (i i (i i (i i (i< i< (i? i? (iA iC (iM iM (iV iV (i i (i i (i i (i> i@ (iF iH (iJ iM (iU iV (i i (i i (i i (i i (i i (iA iC (iM iM (i i (i i (i i (i1i1(i4i:(iGiN(ii(ii(ii(ii(ii(i5i5(i7i7(i9i9(iqi~(ii(ii(ii(ii(ii(i-i0(i2i2(i6i7(i9i9(iXiY(i`i(i_i_(ii(i2i4(iRiS(iris(ii(ii(ii(ii(ii(i i (ii(i i"(i'i((i2i2(i9i;(ii(ii(i4i4(i6i:(i<i<(iBiB(ikis(ii(ii(i i (i* i. (i` ic (ij io (i i (i*0i/0(i0i0(ii(i i (i%i&(ii(ii(i i#(ii(ii(i i (i i (i i (i8 i: (i? i? (igii(isi(ii(ii(iBiD(ii(i i(ii('RRRRRRRR!RR(R R2R3R6RURWRRR^R_RbRetgettextt translationtttugettextt_t ungettexttP_toptparset__name__tsysRltargvR5tUnicodeDecodeErrorRRFtexit(((s,/usr/lib/python2.7/site-packages/yum/i18n.pyts  +                                                    + %  a        "     + PK[ ,y,y%site-packages/yum/transactioninfo.pycnu[ v_c@sdZddlTddlmZmZddlmZddlmZddl Z ddl Z ddl Z ddl Z defdYZ d fd YZd efd YZd efdYZdfdYZdS(sK Classes and functions for manipulating a transaction to be passed to rpm. i(t*(t PackageSacktPackageSackVersion(tYumInstalledPackage(tYumAvailablePackageSqliteNtGetProvReqOnlyPackageSackcBsAeZedZdZdZdZdZdZRS(cCstj|||_dS(N(Rt__init__t_need_index_files(tselft need_files((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR(s cCsWxP|jdtD]<}x3|j|dtD]}|j|j||q/WqWdS(Nt primary_only(treturnFileTypestTruetreturnFileEntriest_addToDictAsListt filenames(Rtobjtftypetfile((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt!__addPackageToIndex_primary_files,scCsKxD|jD]6}x-|j|D]}|j|j||q#Wq WdS(N(R R RR(RRRR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt__addPackageToIndex_files0scCsx?|jdD].\}}\}}}|j|j||qWx?|jdD].\}}\}}}|j|j||qRW|jr|j|n |j|dS(Ntprovidestrequires(t returnPrcoRRRRt3_GetProvReqOnlyPackageSack__addPackageToIndex_filest;_GetProvReqOnlyPackageSack__addPackageToIndex_primary_files(RRtntfltetvtr((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt_addPackageToIndex4s(( cCs=x6|jD]+}x"|j|D]}|j|qWq WdS(N(t pkgsByRepoR(RtrepoidR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt__buildFileIndexes>scCsU|j rEtj| rEt|_|jrEi|_|jqEntj||S(N( Rtmisctre_primary_filenameR t indexesBuiltRt,_GetProvReqOnlyPackageSack__buildFileIndexesRt searchFiles(Rtname((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR'Bs    ( t__name__t __module__tFalseRRRRR&R'(((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR's     tTransactionDatac BseZdZdZdZdZdZdZedddd d d d d Z dZ d/d/dZ d/dZ dZdZedZd/d/d/d/d/dZd/d/d/d/d/dZdZdZdZdZdZdZdZeedZdZdZd Zd/d!Zd"Z d#Z!d$Z"d%Z#d/d&Z$d/d0d'Z%d/d1d(Z&d/d2d)Z'd/d3d*Z(d/d4d+Z)d/d5d,Z*d-Z+d.Z,RS(6sDData Structure designed to hold information on a yum Transaction SetcCs]g|_g|_g|_d|_i|_i|_t|_d|_t |_ g|_ d|_ t j |_t j |_i|_d|_d|_d|_d|_t|_t|_g|_g|_g|_g|_g|_g|_g|_ g|_!g|_"g|_#g|_$g|_%g|_&g|_'d|_(d|_)dS(Nt/i(*tflagstvsflagstprobFilterFlagstroottpkgdictt _namedicttsett_unresolvedMemberstdebugR+tchangedtinstallonlypkgst state_counterttimet tm_createdt tm_changedt conditionalstNonetrpmdbt_pkgSackt _pkgSackCtortpkgSackPackagesRt localSackRt_inSackt instgroupst removedgroupstinstenvironmentstremovedenvironmentstremovedt installedtupdatedt obsoletedt depremovedt depinstalledt depupdatedt reinstalledt downgradedtfailedt_future_rpmdbvt_check_future_rpmdbv(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRMsH                                 cCs+t|_|jd7_tj|_dS(Ni(R R7R9R:R<(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt_changedws cCs t|jS(N(tlenR2(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt__len__|scCs9t|jdr%|jjSt|jSdS(Nt__iter__(thasattrt getMembersRXtiter(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRXscCs>|jdk r|jS|jdk r7|j|_n|jS(N(R@R>RA(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt _getPkgSacks tfgetcCs |jS(N(R\(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytstfsetcCst|d|S(NR@(tsetattr(Rtvalue((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR^stfdelcCst|ddS(NR@(R`R>(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR^stdocsPackage sack objectcCs|jr|GHndS(N(R6(Rtmsg((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt debugprints cstfd|j|S(Ncs |jkS(N(t output_state(tp(t output_states(s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR^s(tfilterRZ(RtpkgtupRh((Rhs7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytgetMembersWithStatescCsfg}|dkr<xM|jjD]}|j|q"Wn&||jkrb|j|j|n|S(stakes an optional package tuple and returns all transaction members matching, no pkgtup means it returns all transaction membersN(R>R2t itervaluestextend(RRjt returnlisttmembers((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRZs cCstt|jS(N(tlisttsortedR5(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytgetUnresolvedMembersscCs|jj|dS(N(R5tdiscard(Rttxmbr((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytmarkAsResolvedscCsL|s!t|t|jkrH|jj|jj|jtStS(N(RVR5tcleartupdateRZR R+(Rthard((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt resetResolveds ! c Cs|jd|d|d|d|d|}t|s:d Sg}x|D]}|j|jqGWd|krqdSd|krdS|dSd S( sareturns the mode of the first match from the transaction set, otherwise, returns NoneR(tarchtepochtvertreltutiiN(t matchNaevrRVR>tappendtts_state( RR(RzR{R|R}ttxmbrststatesRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytgetModes*    c Cs|dkr|j}nJ|jj|g}|dkre|dkre|dkre|dkre|Sg}x|D]}|j\} } } } } |dk r|| krqrn|dk r|| krqrn|dk r|| krqrn|dk r|| krqrn|j|qrW|S(s4returns the list of packages matching the args aboveN(R>RZR3tgetRjR(RR(RzR{R|R}RtresultRtRtaRRR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs$ 0 c Cs||j|}|sY|jdd}t|dkrY|j|d|d}qYn|sWg}|jdk r|jjd|g}n| r|jdk r|jjd|g}n|s|jjd|g}nxs|D]h}|j|j |j xF|j j D]5\}}||kr|j |||j |treturnPackagestpkgSackR?RmRZRjR=t iteritemstremove( RtpatternRtnatpkgstpkgtreqtcpkgsRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytdeselects,     cCs&|jdko%t|jttf S(NR~R(R~R(Rt isinstancetpoRR(Rttxmember((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt_isLocalPackagescs?|jjkrtS|j}tfd|r;tStS(stakes a packageObject, returns 1 or 0 depending on if the package should/can be installed multiple times with different vers like kernels and kernel modules, for examplecs |jkS(N(R8(tprov(R(s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR^s(R(R8R tprovides_namesRiR+(RRR((Rs7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt_allowedMultipleInstallss  cCsx$|jD]}|j||jq W|j|jkrLg|j|jRftTS_INSTALL_STATESthave_fastReturnFileEntriesR=R?tcontainstinstall_methodtsetAsDepR5tadd(RRtoldpotmemberRt condtxmbr((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs6   cCs)||jkr'|jd|fdSx|j|D]}d|j_|j|rl|jj|jn$t|jt r|j d8_ n|j dk r|j t kr|j j|jn|j|jj||jj|q5W|j|=|j|ds|j|d=n|jdS(s%remove a package from the transactionsPackage: %s not in tsNii(R2ReR>RtstateRRCt delPackageRRRBRDRfRR3R(RR5RRU(RRjRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRCs"  cCs3||jkr/t|j|dkr/dSndS(s tells if the pkg is in the classii(R2RV(RRj((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytexistsXscCsF|j|rBx0|jd|D]}|jtkr"tSq"WntS(s,true if the pkgtup is marked to be obsoletedRj(RRZRft TS_OBSOLETEDR R+(RRjRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt isObsoleted`s  cCsg|_g|_g|_g|_g|_g|_g|_g|_g|_g|_ g|_ g|_ g|_ g|_ x|jD]}|jtkr|jr|j j|q|jj|q|jttfkr|r |jr |j j|qn|r.|jr.|j j|qn|jrpx6|jD](}||jkrA|jj|qAqAWn|jrx6|jD](}||jkr|jj|qqWn|jr|jdkr|j j|q|jj|q|jtkr|r|jrqnx3|jD](}||jkr|jj|qqWx3|jD](}||jkrT|jj|qTqTW|jr|jj|q|jj|q|jtkr|jj|q|jtkr|jj|q|jtkr|j j|qqW|jj|jj|jj|jj|j j|j j|jj|jj|jj|jj|jj|j j|j j|j jdS(sreturns lists of transaction Member objects based on mode: updated, installed, erased, obsoleted, depupdated, depinstalled deperasedtuserN( RERFRGRHRIRJRKRLRMRNRORPRQRRRZRft TS_UPDATEtisDepRt TS_INSTALLtTS_TRUEINSTALLt reinstallt downgradestgroupst environmentstreasontTS_ERASEt downgraded_byRt TS_OBSOLETINGt TS_FAILEDtsort(Rtinclude_reinstalltinclude_downgradeRttgtevg((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt makelistsis                               cCs|j|r|j|St|}t|_t|_t|j_d|_ |j j d|jrst |_ n|j||j||S(sadds a package as an install but in mode 'u' to the ts takes a packages object and returns a TransactionMember ObjectR~R(RtaddTrueInstalltTransactionMembert TS_AVAILABLEt current_stateRRfRRRR?RR RtfindObsoletedByThisMemberR(RRRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt addInstalls         cCsht|}t|_t|_t|j_d|_|j j d|jrWt |_ n|j ||S(sfadds a package as an install takes a packages object and returns a TransactionMember ObjectRR(RRRRRfRRRRR?RR RR(RRRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs       cCsDt|}t|_t|_t|j_d|_|j||S(sfadds a package as an erasure takes a packages object and returns a TransactionMember ObjectR( RRRRRfRRRR(RRRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytaddErases      cCs|j|r|j|St|}t|_t|_t|j_d|_ |r~|j j |df|j j |n|j ||j||S(seadds a package as an update takes a packages object and returns a TransactionMember ObjectR~R(RRRRRRRfRRRt relatedtoRRRR(RRRRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt addUpdates        cCs|j|}|jj|df|jj||j|}|s^|j|jdSd|jkr|jj |_ n|jj|df|j j|||fS(sqadds a package as an downgrade takes a packages object and returns a pair of TransactionMember Objectst downgradedbyRRN( RRRRRRRjR>t yumdb_infoRR(RRRtitxmbrtatxmbr((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt addDowngrade scCst|}t|_t|_t|j_d|_|jj |df|j j |d|j krz|j j |_ n|j ||S(sxadds a package as being updated by another pkg takes a packages object and returns a TransactionMember Objecttudt updatedbyR(RRRt TS_UPDATEDRfRRRRRt updated_byRRR(RRt updating_poRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs      cCst|}t|_t|_t|j_d|_|jj |df|j j ||j j d|jr}t |_n|j||S(sxadds a package as an obsolete over another pkg takes a packages object and returns a TransactionMember ObjectR~t obsoletesR(RRRRRfRRRRRRR?RR RR(RRRRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt addObsoleting1s       cCst|}t|_t|_t|j_d|_|jj |df|j j |d|j krz|j j |_ n|j |x[|j|jtgD]A}||jkrqn|jj |df|jj |qW|S(szadds a package as being obsoleted by another pkg takes a packages object and returns a TransactionMember Objecttodt obsoletedbyRR(RRRRRfRRRRRt obsoleted_byRRRRkRjRR(RRt obsoleting_poRttotxmbr((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt addObsoletedCs"      cCs||_||_||_dS(N(R?R@RA(RR?Rt pkgSackCtor((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt setDatabases\s  cCsi}|jsn|jdkrux|jj|||jD].\}}|j|jtr@||| list of matching provides } searches in packages to be installedN( RBRDR>Rt getProvidesRRkRjRRwRC(RR(tflagtversionRRthits((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytgetNewProvidesas ++cCs[i}xN|jj|||jD].\}}|j|jts%||| list of matching provides } searches in packages already installed and not going to be removed(R?RRRkRjtTS_REMOVE_STATES(RR(RRRRR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytgetOldProvidesqs +cCs5|j|||}|j|j||||S(s5return dict { packages -> list of matching provides }(RRwR(RR(RRR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRzscCsi}|jsn|jdkrux|jj|||jD].\}}|j|jtr@||| list of matching provides } searches in packages to be installedN( RBRDR>Rt getRequiresRRkRjRRwRC(RR(RRRRR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytgetNewRequiress ++cCs[i}xN|jj|||jD].\}}|j|jts%||| list of matching provides } searches in packages already installed and not going to be removed(R?RRRkRjR(RR(RRRRR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytgetOldRequiress +cCs5|j|||}|j|j||||S(s5return dict { packages -> list of matching provides }(RRwR(RR(RRR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRsc Cs|jdk r4|j\}}||jkr4|Sn|jj}i}xI|jdtD]5}|jr|j||jj R9R?RRkRRRRjRtpreloadPackageChecksumsRRqR!t returnIdSumRwRRRRt transactionCachePackageChecksums( RtsctretRt_reinstalled_pkgtupsRttmaintpkg_checksum_tupsRtcsumtydbi((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pytfutureRpmDBVersions@     cCs{xt|jjD]f}x]|jjd|D]F}|j|jgr)|j||jt|_t|j_q)q)Wq WdS(s>addObsoleted() pkgs for anything that this txmbr will obsoleteR(N( Rtobsoletes_namesR?t searchNevrat obsoletedByRRRfR(RRttobs_nR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs  N(NNN(NNN(NNN(NNN(NNN(NNN(-R)R*t__doc__RRURWRXR\tpropertyRReR>RkRZRrRuR+RyRRRRRRRRRRRRRRRRRRRRRRRRRRR(((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR,KsV *             $  &   \           4tConditionalTransactionDatacBseZdZdZRS(s<A transaction data implementing conditional package additioncCs$tjdtjtj|dS(NsCConditionalTransactionData will go away in a future version of Yum.(twarningstwarntErrorstYumFutureDeprecationWarningR,R(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs  (R)R*RR(((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRstSortableTransactionDatacBsDeZdZdZdZdZdZdZdZRS(s@A transaction data implementing topological sort on it's memberscCs,g|_g|_g|_tj|dS(N(t_sortedtpathtloopsR,R(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs   cCs|jj|jt|_xk|jD]`}|jd|jd}|jtkrg|j|jn|jt kr&|j |q&q&Wt |_|j j d|jdS(NRji(RRR(tTX_GREYt sortColourt depends_onRZRjt_doLooptTX_WHITEt_visittTX_BLACKRtinsert(RRtRtvertex((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR s  cCsY|jj||j|jj|jd}t|dkrU|jj|ndS(Nii(RRtindexRVR(RR(tloop((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR s cCs&t|_tj||g|_dS(N(R RR,RR(RR((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs cCstj||g|_dS(N(R,RR(RRj((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR scCsl|jr|jSg|_x<|jD].}|jtkr&g|_|j|q&q&W|jj|jS(N(RRZRR RR treverse(RRt((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR s    ( R)R*RRR R RRR(((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs   RcBs\eZdZdZd edZdZdZdZ dZ dZ dZ RS( sVClass to describe a Transaction Member (a pkg to be installed/ updated/erased).cCsE||_d|_d|_d|_d|_d|_d|_g|_g|_ g|_ g|_ g|_ g|_ g|_g|_t|_g|_g|_d|_ddddddd g|_x3|jD](}t|j|}t|||qW|jd krA|jjd |jjd |jjd ndS(NiRRjR!R(RzR{RtreleaseRJt from_repot releasevert changed_by(RR>RRRfRRtprocessRR RRRRRRR+RRRtrepopkgt_poattrtgetattrR`R!RR(RRtattrtval((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs8                    cCsE|sd|_n|rA|jj|df|jj|ndS(slsets the transaction member as a dependency and maps the dep into the relationship list attributeit dependsonN(RRRR (RRtrelonly((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRBs  cCsg}x4|jD])}|d|kr,qn|j|qW||_g}x0|jD]%}||krnqVn|j|qVW||_dS(slsets the transaction member as a dependency and maps the dep into the relationship list attributeiN(RRR (RRtnreltotdatatndepon((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt removeDepLs  cCst|j|jS(N(tcmpR(Rtother((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt__cmp__^scCs tj|S(N(tobjectt__hash__(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyR'ascCs,d|j|j|j|j|j|jfS(Ns%s.%s %s:%s-%s - %s(R(RzR{RRR(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt__str__dscCs)d|jjt|tt|fS(Ns<%s : %s (%s)>(t __class__R)tstrthextid(R((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt__repr__hsc CsNd|j|j|j|j|j|jfd|jjjd|j d|j dt |j d|j dt |jg}|jr|dg7}xj|jD]_\}}d }t|trd }n|d |j|j|j|j|j||fg7}qW|d g7}nxd ddddddgD]}t||}|r.|d|g7}x^|D]V}d }t|trd }n|d|j|j|j|j|j|fg7}qaW|d g7}q.q.W|jr|ddj|jg7}n|jr!|ddj|jg7}n|jrA|d|jg7}ndj|S(Nsmbr: %s,%s,%s,%s,%s %s s repo: %s s ts_state: %s s output_state: %s s isDep: %s s reason: %s s reinstall: %s s relatedto:RRs %s,%s,%s,%s,%s@%s:%ss R RRRRRRs %s:s %s,%s,%s,%s,%s@%ss groups: %s t s environments: %s s repopkg: %s t(R(RzR{RRRRtrepoR,RRftboolRRRRRRRRtjoinRR(RRdRR}t pkgorigintlsttthislist((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyt_dumpksN              N( R)R*RRR>R+RR"R%R'R(R-R6(((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyRs $     (Rt constantst packageSackRRtpackagesRt sqlitesackRRRR#R:RR,RRR(((s7/usr/lib/python2.7/site-packages/yum/transactioninfo.pyts     $3PK[-Rsite-packages/yum/history.pynuȯ#!/usr/bin/python -t # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # Copyright 2009 Red Hat # # James Antill import time import os, os.path import glob import re from weakref import proxy as weakref from sqlutils import sqlite, executeSQL, sql_esc_glob import yum.misc as misc import yum.constants from yum.constants import * from yum.packages import YumInstalledPackage, YumAvailablePackage, PackageObject from yum.i18n import to_unicode, to_utf8 from rpmUtils.arch import getBaseArch _history_dir = '/var/lib/yum/history' # NOTE: That we don't list TS_FAILED, because pkgs shouldn't go into the # transaction with that. And if they come out with that we don't want to # match them to anything anyway. _stcode2sttxt = {TS_UPDATE : 'Update', TS_UPDATED : 'Updated', TS_ERASE: 'Erase', TS_INSTALL: 'Install', TS_TRUEINSTALL : 'True-Install', TS_OBSOLETED: 'Obsoleted', TS_OBSOLETING: 'Obsoleting'} _sttxt2stcode = {'Update' : TS_UPDATE, 'Updated' : TS_UPDATED, 'Erase' : TS_ERASE, 'Install' : TS_INSTALL, 'True-Install' : TS_TRUEINSTALL, 'Dep-Install' : TS_INSTALL, 'Reinstall' : TS_INSTALL, # Broken 'Downgrade' : TS_INSTALL, # Broken 'Downgraded' : TS_INSTALL, # Broken 'Obsoleted' : TS_OBSOLETED, 'Obsoleting' : TS_OBSOLETING} # ---- horrible Copy and paste from sqlitesack ---- def _setupHistorySearchSQL(patterns=None, ignore_case=False): """Setup need_full and patterns for _yieldSQLDataList, also see if we can get away with just using searchNames(). """ if patterns is None: patterns = [] fields = ['name', 'sql_nameArch', 'sql_nameVerRelArch', 'sql_nameVer', 'sql_nameVerRel', 'sql_envra', 'sql_nevra'] need_full = False for pat in patterns: if yum.misc.re_full_search_needed(pat): need_full = True break pat_max = PATTERNS_MAX if not need_full: fields = ['name'] pat_max = PATTERNS_INDEXED_MAX if len(patterns) > pat_max: patterns = [] if ignore_case: patterns = sql_esc_glob(patterns) else: tmp = [] need_glob = False for pat in patterns: if misc.re_glob(pat): tmp.append((pat, 'glob')) need_glob = True else: tmp.append((pat, '=')) if not need_full and not need_glob and patterns: return (need_full, patterns, fields, True) patterns = tmp return (need_full, patterns, fields, False) # ---- horrible Copy and paste from sqlitesack ---- class _YumHistPackageYumDB: """ Class to pretend to be yumdb_info for history packages. """ def __init__(self, pkg): self._pkg = pkg _valid_yumdb_keys = set(["command_line", "from_repo", "from_repo_revision", "from_repo_timestamp", "installed_by", "changed_by", "reason", "releasever"]) def __getattr__(self, attr): """ Load yumdb attributes from the history sqlite. """ pkg = self._pkg if attr.startswith('_'): raise AttributeError, "%s has no yum attribute %s" % (pkg, attr) if attr not in self._valid_yumdb_keys: raise AttributeError, "%s has no yum attribute %s" % (pkg, attr) val = pkg._history._load_yumdb_key(pkg, attr) if False and val is None: raise AttributeError, "%s has no yum attribute %s" % (pkg, attr) if val is None: return None val = str(val) or "" setattr(self, attr, val) return val def __contains__(self, attr): # This is faster than __iter__ and it makes things fail in a much more # obvious way in weird FS corruption cases like: BZ 593436 x = self.get(attr) return x is not None def get(self, attr, default=None): """retrieve an add'l data obj""" try: res = getattr(self, attr) except AttributeError: return default return res class YumHistoryPackage(PackageObject): def __init__(self, name, arch, epoch, version, release, checksum=None, history=None): self.name = name self.version = version self.release = release self.epoch = epoch self.arch = arch self.pkgtup = (self.name, self.arch, self.epoch, self.version, self.release) if checksum is None: self._checksums = [] # (type, checksum, id(0,1) else: chk = checksum.split(':') self._checksums = [(chk[0], chk[1], 1)] # (type, checksum, id(0,1)) # Needed for equality comparisons in PackageObject self.repoid = "" self._history = history self.yumdb_info = _YumHistPackageYumDB(self) _valid_rpmdb_keys = set(["buildtime", "buildhost", "license", "packager", "size", "sourcerpm", "url", "vendor", # ? "committer", "committime"]) def __getattr__(self, attr): """ Load rpmdb attributes from the history sqlite. """ if attr.startswith('_'): raise AttributeError, "%s has no attribute %s" % (self, attr) if attr not in self._valid_rpmdb_keys: raise AttributeError, "%s has no attribute %s" % (self, attr) val = self._history._load_rpmdb_key(self, attr) if False and val is None: raise AttributeError, "%s has no attribute %s" % (self, attr) if val is None: return None val = str(val) or "" setattr(self, attr, val) return val def _ui_from_repo(self): """ This reports the repo the package is from, we integrate YUMDB info. for RPM packages so a package from "fedora" that is installed has a ui_from_repo of "@fedora". Note that, esp. with the --releasever option, "fedora" or "rawhide" isn't authoritative. So we also check against the current releasever and if it is different we also print the YUMDB releasever. This means that installing from F12 fedora, while running F12, would report as "@fedora/13". """ if 'from_repo' in self.yumdb_info: self._history.releasever end = '' if (self._history.releasever is not None and 'releasever' in self.yumdb_info and self.yumdb_info.releasever != self._history.releasever): end = '/' + self.yumdb_info.releasever return '@' + self.yumdb_info.from_repo + end return self.repoid ui_from_repo = property(fget=lambda self: self._ui_from_repo()) class YumHistoryPackageState(YumHistoryPackage): def __init__(self, name,arch, epoch,version,release, state, checksum=None, history=None): YumHistoryPackage.__init__(self, name,arch, epoch,version,release, checksum, history) self.done = None self.state = state class YumHistoryRpmdbProblem: """ Class representing an rpmdb problem that existed at the time of the transaction. """ def __init__(self, history, rpid, problem, text): self._history = weakref(history) self.rpid = rpid self.problem = problem self.text = text self._loaded_P = None def __cmp__(self, other): if other is None: return 1 ret = cmp(self.problem, other.problem) if ret: return -ret ret = cmp(self.rpid, other.rpid) return ret def __hash__(self): return hash(self.rpid) def _getProbPkgs(self): if self._loaded_P is None: self._loaded_P = sorted(self._history._old_prob_pkgs(self.rpid)) return self._loaded_P packages = property(fget=lambda self: self._getProbPkgs()) class YumHistoryTransaction: """ Holder for a history transaction. """ def __init__(self, history, row): self._history = weakref(history) self.tid = row[0] self.beg_timestamp = row[1] self.beg_rpmdbversion = row[2] self.end_timestamp = row[3] self.end_rpmdbversion = row[4] self.loginuid = row[5] self.return_code = row[6] self._loaded_TW = None self._loaded_TD = None self._loaded_TS = None self._loaded_PROB = None self._have_loaded_CMD = False # cmdline can validly be None self._loaded_CMD = None self._loaded_ER = None self._loaded_OT = None self.altered_lt_rpmdb = None self.altered_gt_rpmdb = None def __cmp__(self, other): if other is None: return 1 ret = cmp(self.beg_timestamp, other.beg_timestamp) if ret: return -ret ret = cmp(self.end_timestamp, other.end_timestamp) if ret: return ret ret = cmp(self.tid, other.tid) return -ret def _getTransWith(self): if self._loaded_TW is None: self._loaded_TW = sorted(self._history._old_with_pkgs(self.tid)) return self._loaded_TW def _getTransData(self): if self._loaded_TD is None: self._loaded_TD = sorted(self._history._old_data_pkgs(self.tid)) return self._loaded_TD def _getTransSkip(self): if self._loaded_TS is None: self._loaded_TS = sorted(self._history._old_skip_pkgs(self.tid)) return self._loaded_TS trans_with = property(fget=lambda self: self._getTransWith()) trans_data = property(fget=lambda self: self._getTransData()) trans_skip = property(fget=lambda self: self._getTransSkip()) def _getProblems(self): if self._loaded_PROB is None: self._loaded_PROB = sorted(self._history._old_problems(self.tid)) return self._loaded_PROB rpmdb_problems = property(fget=lambda self: self._getProblems()) def _getCmdline(self): if not self._have_loaded_CMD: self._have_loaded_CMD = True self._loaded_CMD = self._history._old_cmdline(self.tid) return self._loaded_CMD cmdline = property(fget=lambda self: self._getCmdline()) def _getErrors(self): if self._loaded_ER is None: self._loaded_ER = self._history._load_errors(self.tid) return self._loaded_ER def _getOutput(self): if self._loaded_OT is None: self._loaded_OT = self._history._load_output(self.tid) return self._loaded_OT errors = property(fget=lambda self: self._getErrors()) output = property(fget=lambda self: self._getOutput()) class YumMergedHistoryTransaction(YumHistoryTransaction): def __init__(self, obj): self._merged_tids = set([obj.tid]) self._merged_objs = [obj] self.beg_timestamp = obj.beg_timestamp self.beg_rpmdbversion = obj.beg_rpmdbversion self.end_timestamp = obj.end_timestamp self.end_rpmdbversion = obj.end_rpmdbversion self._loaded_TW = None self._loaded_TD = None # Hack, this is difficult ... not sure if we want to list everything # that was skipped. Just those things which were skipped and then not # updated later ... or nothing. Nothing is much easier. self._loaded_TS = [] self._loaded_PROB = None self._have_loaded_CMD = False # cmdline can validly be None self._loaded_CMD = None self._loaded_ER = None self._loaded_OT = None self.altered_lt_rpmdb = None self.altered_gt_rpmdb = None def _getAllTids(self): return sorted(self._merged_tids) tid = property(fget=lambda self: self._getAllTids()) def _getLoginUIDs(self): ret = set((tid.loginuid for tid in self._merged_objs)) if len(ret) == 1: return list(ret)[0] return sorted(ret) loginuid = property(fget=lambda self: self._getLoginUIDs()) def _getReturnCodes(self): ret_codes = set((tid.return_code for tid in self._merged_objs)) if len(ret_codes) == 1 and 0 in ret_codes: return 0 if 0 in ret_codes: ret_codes.remove(0) return sorted(ret_codes) return_code = property(fget=lambda self: self._getReturnCodes()) def _getTransWith(self): ret = [] filt = set() for obj in self._merged_objs: for pkg in obj.trans_with: if pkg.pkgtup in filt: continue filt.add(pkg.pkgtup) ret.append(pkg) return sorted(ret) # This is the real tricky bit, we want to "merge" so that: # pkgA-1 => pkgA-2 # pkgA-2 => pkgA-3 # pkgB-1 => pkgB-2 # pkgB-2 => pkgB-1 # ...becomes: # pkgA-1 => pkgA-3 # pkgB-1 => pkgB-1 (reinstall) # ...note that we just give up if "impossible" things happen, Eg. # pkgA-1 => pkgA-2 # pkgA-4 => pkgA-5 @staticmethod def _p2sk(pkg, state=None): """ Take a pkg and return the key for it's state lookup. """ if state is None: state = pkg.state # Arch is needed so multilib. works, dito. getBaseArch() -- (so .i586 # => .i686 moves are seen) return (pkg.name, getBaseArch(pkg.arch), state) @staticmethod def _list2dict(pkgs): pkgtup2pkg = {} pkgstate2pkg = {} for pkg in pkgs: key = YumMergedHistoryTransaction._p2sk(pkg) pkgtup2pkg[pkg.pkgtup] = pkg pkgstate2pkg[key] = pkg return pkgtup2pkg, pkgstate2pkg @staticmethod def _conv_pkg_state(pkg, state): npkg = YumHistoryPackageState(pkg.name, pkg.arch, pkg.epoch,pkg.version,pkg.release, state, history=pkg._history) npkg._checksums = pkg._checksums npkg.done = pkg.done if _sttxt2stcode[npkg.state] in TS_INSTALL_STATES: npkg.state_installed = True if _sttxt2stcode[npkg.state] in TS_REMOVE_STATES: npkg.state_installed = False return npkg @staticmethod def _get_pkg(sk, pkgstate2pkg): if type(sk) != type((0,1)): sk = YumMergedHistoryTransaction._p2sk(sk) if sk not in pkgstate2pkg: return None return pkgstate2pkg[sk] def _move_pkg(self, sk, nstate, pkgtup2pkg, pkgstate2pkg): xpkg = self._get_pkg(sk, pkgstate2pkg) if xpkg is None: return del pkgstate2pkg[self._p2sk(xpkg)] xpkg = self._conv_pkg_state(xpkg, nstate) pkgtup2pkg[xpkg.pkgtup] = xpkg pkgstate2pkg[self._p2sk(xpkg)] = xpkg def _getTransData(self): def _get_pkg_f(sk): return self._get_pkg(sk, fpkgstate2pkg) def _get_pkg_n(sk): return self._get_pkg(sk, npkgstate2pkg) def _move_pkg_f(sk, nstate): self._move_pkg(sk, nstate, fpkgtup2pkg, fpkgstate2pkg) def _move_pkg_n(sk, nstate): self._move_pkg(sk, nstate, npkgtup2pkg, npkgstate2pkg) def _del1_n(pkg): del npkgtup2pkg[pkg.pkgtup] key = self._p2sk(pkg) if key in npkgstate2pkg: # For broken rpmdbv's and installonly del npkgstate2pkg[key] def _del1_f(pkg): del fpkgtup2pkg[pkg.pkgtup] key = self._p2sk(pkg) if key in fpkgstate2pkg: # For broken rpmdbv's and installonly del fpkgstate2pkg[key] def _del2(fpkg, npkg): assert fpkg.pkgtup == npkg.pkgtup _del1_f(fpkg) _del1_n(npkg) fpkgtup2pkg = {} fpkgstate2pkg = {} # We need to go from oldest to newest here, so we can see what happened # in the correct chronological order. for obj in self._merged_objs: npkgtup2pkg, npkgstate2pkg = self._list2dict(obj.trans_data) # Handle Erase => Install, as update/reinstall/downgrade for key in list(fpkgstate2pkg.keys()): (name, arch, state) = key if state not in ('Obsoleted', 'Erase'): continue fpkg = fpkgstate2pkg[key] for xstate in ('Install', 'True-Install', 'Dep-Install', 'Obsoleting'): npkg = _get_pkg_n(self._p2sk(fpkg, xstate)) if npkg is not None: break else: continue if False: pass elif fpkg > npkg: _move_pkg_f(fpkg, 'Downgraded') if xstate != 'Obsoleting': _move_pkg_n(npkg, 'Downgrade') elif fpkg < npkg: _move_pkg_f(fpkg, 'Updated') if xstate != 'Obsoleting': _move_pkg_n(npkg, 'Update') else: _del1_f(fpkg) if xstate != 'Obsoleting': _move_pkg_n(npkg, 'Reinstall') sametups = set(npkgtup2pkg.keys()).intersection(fpkgtup2pkg.keys()) for pkgtup in sametups: if pkgtup not in fpkgtup2pkg or pkgtup not in npkgtup2pkg: continue fpkg = fpkgtup2pkg[pkgtup] npkg = npkgtup2pkg[pkgtup] if False: pass elif fpkg.state == 'Reinstall': if npkg.state in ('Reinstall', 'Erase', 'Obsoleted', 'Downgraded', 'Updated'): _del1_f(fpkg) elif fpkg.state in ('Obsoleted', 'Erase'): # Should be covered by above loop which deals with # all goood state changes. good_states = ('Install', 'True-Install', 'Dep-Install', 'Obsoleting') assert npkg.state not in good_states elif fpkg.state in ('Install', 'True-Install', 'Dep-Install'): if False: pass elif npkg.state in ('Erase', 'Obsoleted'): _del2(fpkg, npkg) elif npkg.state == 'Updated': _del2(fpkg, npkg) # Move '*Install' state along to newer pkg. (not for # obsoletes). _move_pkg_n(self._p2sk(fpkg, 'Update'), fpkg.state) elif npkg.state == 'Downgraded': _del2(fpkg, npkg) # Move '*Install' state along to newer pkg. (not for # obsoletes). _move_pkg_n(self._p2sk(fpkg, 'Downgrade'), fpkg.state) elif fpkg.state in ('Downgrade', 'Update', 'Obsoleting'): if False: pass elif npkg.state == 'Reinstall': _del1_n(npkg) elif npkg.state in ('Erase', 'Obsoleted'): _del2(fpkg, npkg) # Move 'Erase'/'Obsoleted' state to orig. pkg. _move_pkg_f(self._p2sk(fpkg, 'Updated'), npkg.state) _move_pkg_f(self._p2sk(fpkg, 'Downgraded'), npkg.state) elif npkg.state in ('Downgraded', 'Updated'): xfpkg = _get_pkg_f(self._p2sk(fpkg, 'Updated')) if xfpkg is None: xfpkg = _get_pkg_f(self._p2sk(fpkg, 'Downgraded')) if xfpkg is None: if fpkg.state != 'Obsoleting': continue # Was an Install*/Reinstall with Obsoletes xfpkg = fpkg xnpkg = _get_pkg_n(self._p2sk(npkg, 'Update')) if xnpkg is None: xnpkg = _get_pkg_n(self._p2sk(npkg, 'Downgrade')) if xnpkg is None: xnpkg = _get_pkg_n(self._p2sk(npkg, 'Obsoleting')) if xnpkg is None: continue # Now we have 4 pkgs, f1, f2, n1, n2, and 3 pkgtups # f2.pkgtup == n1.pkgtup. So we need to find out if # f1 => n2 is an Update or a Downgrade. _del2(fpkg, npkg) if xfpkg == xnpkg: nfstate = 'Reinstall' if 'Obsoleting' in (fpkg.state, xnpkg.state): nfstate = 'Obsoleting' if xfpkg != fpkg: _move_pkg_f(xfpkg, nfstate) _del1_n(xnpkg) elif xfpkg < xnpkg: # Update... nfstate = 'Updated' nnstate = 'Update' if 'Obsoleting' in (fpkg.state, xnpkg.state): nnstate = 'Obsoleting' if xfpkg != fpkg: _move_pkg_f(xfpkg, nfstate) _move_pkg_n(xnpkg, nnstate) else: # Downgrade... nfstate = 'Downgraded' nnstate = 'Downgrade' if 'Obsoleting' in (fpkg.state, xnpkg.state): nnstate = 'Obsoleting' if xfpkg != fpkg: _move_pkg_f(xfpkg, nfstate) _move_pkg_n(xnpkg, nnstate) for x in npkgtup2pkg: fpkgtup2pkg[x] = npkgtup2pkg[x] for x in npkgstate2pkg: fpkgstate2pkg[x] = npkgstate2pkg[x] return sorted(fpkgtup2pkg.values()) def _getProblems(self): probs = set() for tid in self._merged_objs: for prob in tid.rpmdb_problems: probs.add(prob) return sorted(probs) def _getCmdline(self): cmdlines = [] for tid in self._merged_objs: if not tid.cmdline: continue if cmdlines and cmdlines[-1] == tid.cmdline: continue cmdlines.append(tid.cmdline) if not cmdlines: return None return cmdlines def _getErrors(self): ret = [] for obj in self._merged_objs: ret.extend(obj.errors) return ret def _getOutput(self): ret = [] for obj in self._merged_objs: ret.extend(obj.output) return ret def merge(self, obj): if obj.tid in self._merged_tids: return # Already done, signal an error? self._merged_tids.add(obj.tid) self._merged_objs.append(obj) # Oldest first... self._merged_objs.sort(reverse=True) if self.beg_timestamp > obj.beg_timestamp: self.beg_timestamp = obj.beg_timestamp self.beg_rpmdbversion = obj.beg_rpmdbversion if self.end_timestamp < obj.end_timestamp: self.end_timestamp = obj.end_timestamp self.end_rpmdbversion = obj.end_rpmdbversion class YumHistory: """ API for accessing the history sqlite data. """ def __init__(self, root='/', db_path=_history_dir, releasever=None): self._conn = None self.conf = yum.misc.GenericHolder() if not os.path.normpath(db_path).startswith(root): self.conf.db_path = os.path.normpath(root + '/' + db_path) else: self.conf.db_path = os.path.normpath('/' + db_path) self.conf.writable = False self.conf.readable = True self.releasever = releasever self._db_file = None if not os.path.exists(self.conf.db_path): try: os.makedirs(self.conf.db_path) except (IOError, OSError), e: # some sort of useful thing here? A warning? return self.conf.writable = True else: if os.access(self.conf.db_path, os.W_OK): self.conf.writable = True DBs = glob.glob('%s/history-*-*-*.sqlite' % self.conf.db_path) for d in reversed(sorted(DBs)): fname = os.path.basename(d) fname = fname[len("history-"):-len(".sqlite")] pieces = fname.split('-', 4) if len(pieces) != 3: continue try: map(int, pieces) except ValueError: continue self._db_date = '%s-%s-%s' % (pieces[0], pieces[1], pieces[2]) self._db_file = d break if self._db_file is None: if not self._create_db_file(): # Couldn't create a db file return # make an addon path for where we're going to stick # random additional history info - probably from plugins and what-not self.conf.addon_path = self.conf.db_path + '/' + self._db_date if not os.path.exists(self.conf.addon_path): try: os.makedirs(self.conf.addon_path) except (IOError, OSError), e: # some sort of useful thing here? A warning? return else: if os.access(self.conf.addon_path, os.W_OK): self.conf.writable = True def __del__(self): self.close() def _get_cursor(self): if self._conn is None: if not self.conf.readable: return None try: self._conn = sqlite.connect(self._db_file) except (sqlite.OperationalError, sqlite.DatabaseError): self.conf.readable = False return None # Note that this is required due to changing the history DB in the # callback for removed txmbrs ... which happens inside the chroot, # as against all our other access which is outside the chroot. So # we need sqlite to not open the journal. # In theory this sucks, as history could be shared. In reality # it's deep yum stuff and there should only be one yum. executeSQL(self._conn.cursor(), "PRAGMA locking_mode = EXCLUSIVE") return self._conn.cursor() def _commit(self): return self._conn.commit() def _rollback(self): return self._conn.rollback() def close(self): if self._conn is not None: self._conn.close() self._conn = None def _pkgtup2pid(self, pkgtup, checksum=None, create=True): cur = self._get_cursor() executeSQL(cur, """SELECT pkgtupid, checksum FROM pkgtups WHERE name=? AND arch=? AND epoch=? AND version=? AND release=?""", pkgtup) for sql_pkgtupid, sql_checksum in cur: if checksum is None and sql_checksum is None: return sql_pkgtupid if checksum is None: continue if sql_checksum is None: continue if checksum == sql_checksum: return sql_pkgtupid if not create: return None (n,a,e,v,r) = pkgtup (n,a,e,v,r) = (to_unicode(n),to_unicode(a), to_unicode(e),to_unicode(v),to_unicode(r)) if checksum is not None: res = executeSQL(cur, """INSERT INTO pkgtups (name, arch, epoch, version, release, checksum) VALUES (?, ?, ?, ?, ?, ?)""", (n,a,e,v,r, checksum)) else: res = executeSQL(cur, """INSERT INTO pkgtups (name, arch, epoch, version, release) VALUES (?, ?, ?, ?, ?)""", (n,a,e,v,r)) return cur.lastrowid def _apkg2pid(self, po, create=True): csum = po.returnIdSum() if csum is not None: csum = "%s:%s" % (str(csum[0]), str(csum[1])) return self._pkgtup2pid(po.pkgtup, csum, create) def _ipkg2pid(self, po, create=True): csum = None yumdb = po.yumdb_info if 'checksum_type' in yumdb and 'checksum_data' in yumdb: csum = "%s:%s" % (yumdb.checksum_type, yumdb.checksum_data) return self._pkgtup2pid(po.pkgtup, csum, create) def _hpkg2pid(self, po, create=False): return self._apkg2pid(po, create) def pkg2pid(self, po, create=True): if isinstance(po, YumInstalledPackage): return self._ipkg2pid(po, create) if isinstance(po, YumAvailablePackage): return self._apkg2pid(po, create) if isinstance(po, YumHistoryPackage): return self._hpkg2pid(po, create) return self._pkgtup2pid(po.pkgtup, None, create) @staticmethod def txmbr2state(txmbr): state = None if txmbr.output_state in (TS_INSTALL, TS_TRUEINSTALL): if txmbr.reinstall: state = 'Reinstall' elif txmbr.downgrades: state = 'Downgrade' if txmbr.output_state == TS_ERASE: if txmbr.downgraded_by: state = 'Downgraded' if state is None: state = _stcode2sttxt.get(txmbr.output_state) if state == 'Install' and txmbr.isDep: state = 'Dep-Install' return state def trans_with_pid(self, pid): cur = self._get_cursor() if cur is None: return None res = executeSQL(cur, """INSERT INTO trans_with_pkgs (tid, pkgtupid) VALUES (?, ?)""", (self._tid, pid)) return cur.lastrowid def trans_skip_pid(self, pid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None res = executeSQL(cur, """INSERT INTO trans_skip_pkgs (tid, pkgtupid) VALUES (?, ?)""", (self._tid, pid)) return cur.lastrowid def trans_data_pid_beg(self, pid, state): assert state is not None if not hasattr(self, '_tid') or state is None: return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL(cur, """INSERT INTO trans_data_pkgs (tid, pkgtupid, state) VALUES (?, ?, ?)""", (self._tid, pid, state)) return cur.lastrowid def trans_data_pid_end(self, pid, state): # State can be none here, Eg. TS_FAILED from rpmtrans if not hasattr(self, '_tid') or state is None: return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL(cur, """UPDATE trans_data_pkgs SET done = ? WHERE tid = ? AND pkgtupid = ? AND state = ? """, ('TRUE', self._tid, pid, state)) self._commit() def _trans_rpmdb_problem(self, problem): if not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None # str(problem) doesn't work if problem contains unicode(), # unicode(problem) doesn't work in python 2.4.x ... *sigh*. uproblem = to_unicode(problem.__str__()) res = executeSQL(cur, """INSERT INTO trans_rpmdb_problems (tid, problem, msg) VALUES (?, ?, ?)""", (self._tid, problem.problem, uproblem)) rpid = cur.lastrowid if not rpid: return rpid pkgs = {} pkg = problem.pkg pkgs[pkg.pkgtup] = pkg if problem.problem == 'conflicts': for pkg in problem.conflicts: pkgs[pkg.pkgtup] = pkg if problem.problem == 'duplicates': pkgs[problem.duplicate.pkgtup] = problem.duplicate for pkg in pkgs.values(): pid = self.pkg2pid(pkg) if pkg.pkgtup == problem.pkg.pkgtup: main = 'TRUE' else: main = 'FALSE' res = executeSQL(cur, """INSERT INTO trans_prob_pkgs (rpid, pkgtupid, main) VALUES (?, ?, ?)""", (rpid, pid, main)) return rpid def _trans_cmdline(self, cmdline): if not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None res = executeSQL(cur, """INSERT INTO trans_cmdline (tid, cmdline) VALUES (?, ?)""", (self._tid, to_unicode(cmdline))) return cur.lastrowid def beg(self, rpmdb_version, using_pkgs, txmbrs, skip_packages=[], rpmdb_problems=[], cmdline=None): cur = self._get_cursor() if cur is None: return res = executeSQL(cur, """INSERT INTO trans_beg (timestamp, rpmdb_version, loginuid) VALUES (?, ?, ?)""", (int(time.time()), str(rpmdb_version), yum.misc.getloginuid())) self._tid = cur.lastrowid for pkg in using_pkgs: pid = self._ipkg2pid(pkg) self.trans_with_pid(pid) for txmbr in txmbrs: pid = self.pkg2pid(txmbr.po) state = self.txmbr2state(txmbr) self.trans_data_pid_beg(pid, state) for pkg in skip_packages: pid = self.pkg2pid(pkg) self.trans_skip_pid(pid) for problem in rpmdb_problems: self._trans_rpmdb_problem(problem) if cmdline: self._trans_cmdline(cmdline) self._commit() def _log_errors(self, errors): cur = self._get_cursor() if cur is None: return for error in errors: error = to_unicode(error) executeSQL(cur, """INSERT INTO trans_error (tid, msg) VALUES (?, ?)""", (self._tid, error)) self._commit() def log_scriptlet_output(self, data, msg): """ Note that data can be either a real pkg. ... or not. """ if msg is None or not hasattr(self, '_tid'): return # Not configured to run cur = self._get_cursor() if cur is None: return # Should never happen, due to above for error in msg.splitlines(): error = to_unicode(error) executeSQL(cur, """INSERT INTO trans_script_stdout (tid, line) VALUES (?, ?)""", (self._tid, error)) self._commit() def _load_errors(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT msg FROM trans_error WHERE tid = ? ORDER BY mid ASC""", (tid,)) ret = [] for row in cur: ret.append(row[0]) return ret def _load_output(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT line FROM trans_script_stdout WHERE tid = ? ORDER BY lid ASC""", (tid,)) ret = [] for row in cur: ret.append(row[0]) return ret def end(self, rpmdb_version, return_code, errors=None): assert return_code or not errors if not hasattr(self, '_tid'): return # Failed at beg() time cur = self._get_cursor() if cur is None: return # Should never happen, due to above res = executeSQL(cur, """INSERT INTO trans_end (tid, timestamp, rpmdb_version, return_code) VALUES (?, ?, ?, ?)""", (self._tid,int(time.time()), str(rpmdb_version), return_code)) self._commit() if not return_code: # Simple hack, if the transaction finished. Note that this # catches the erase cases (as we still don't get pkgtups for them), # Eg. Updated elements. executeSQL(cur, """UPDATE trans_data_pkgs SET done = ? WHERE tid = ?""", ('TRUE', self._tid,)) self._commit() if errors is not None: self._log_errors(errors) del self._tid def write_addon_data(self, dataname, data): """append data to an arbitrary-named file in the history addon_path/transaction id location, returns True if write succeeded, False if not""" if not hasattr(self, '_tid'): # maybe we should raise an exception or a warning here? return False if not dataname: return False if not data: return False # make sure the tid dir exists tid_dir = self.conf.addon_path + '/' + str(self._tid) if self.conf.writable and not os.path.exists(tid_dir): try: os.makedirs(tid_dir, mode=0700) except (IOError, OSError), e: # emit a warning/raise an exception? return False # cleanup dataname safename = dataname.replace('/', '_') data_fn = tid_dir + '/' + safename try: # open file in append fo = open(data_fn, 'w+') # write data fo.write(to_utf8(data)) # flush data fo.flush() fo.close() except (IOError, OSError), e: return False # return return True def return_addon_data(self, tid, item=None): hist_and_tid = self.conf.addon_path + '/' + str(tid) + '/' addon_info = glob.glob(hist_and_tid + '*') addon_names = [ i.replace(hist_and_tid, '') for i in addon_info ] if not item: return addon_names if item not in addon_names: # XXX history needs SOME kind of exception, or warning, I think? return None fo = open(hist_and_tid + item, 'r') data = fo.read() fo.close() return data def _old_with_pkgs(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT name, arch, epoch, version, release, checksum FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC""", (tid,)) ret = [] for row in cur: obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5], history=self) ret.append(obj) return ret def _old_data_pkgs(self, tid): cur = self._get_cursor() executeSQL(cur, """SELECT name, arch, epoch, version, release, checksum, done, state FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC, state DESC""", (tid,)) ret = [] for row in cur: obj = YumHistoryPackageState(row[0],row[1],row[2],row[3],row[4], row[7], row[5], history=self) obj.done = row[6] == 'TRUE' obj.state_installed = None if _sttxt2stcode[obj.state] in TS_INSTALL_STATES: obj.state_installed = True if _sttxt2stcode[obj.state] in TS_REMOVE_STATES: obj.state_installed = False ret.append(obj) return ret def _old_skip_pkgs(self, tid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return [] executeSQL(cur, """SELECT name, arch, epoch, version, release, checksum FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) WHERE tid = ? ORDER BY name ASC, epoch ASC""", (tid,)) ret = [] for row in cur: obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5], history=self) ret.append(obj) return ret def _old_prob_pkgs(self, rpid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return [] executeSQL(cur, """SELECT name, arch, epoch, version, release, checksum, main FROM trans_prob_pkgs JOIN pkgtups USING(pkgtupid) WHERE rpid = ? ORDER BY name ASC, epoch ASC""", (rpid,)) ret = [] for row in cur: obj = YumHistoryPackage(row[0],row[1],row[2],row[3],row[4], row[5], history=self) obj.main = row[6] == 'TRUE' ret.append(obj) return ret def _old_problems(self, tid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return [] executeSQL(cur, """SELECT rpid, problem, msg FROM trans_rpmdb_problems WHERE tid = ? ORDER BY problem ASC, rpid ASC""", (tid,)) ret = [] for row in cur: obj = YumHistoryRpmdbProblem(self, row[0], row[1], row[2]) ret.append(obj) return ret def _old_cmdline(self, tid): cur = self._get_cursor() if cur is None or not self._update_db_file_2(): return None executeSQL(cur, """SELECT cmdline FROM trans_cmdline WHERE tid = ?""", (tid,)) ret = [] for row in cur: return row[0] return None def old(self, tids=[], limit=None, complete_transactions_only=False): """ Return a list of the last transactions, note that this includes partial transactions (ones without an end transaction). """ cur = self._get_cursor() if cur is None: return [] sql = """SELECT tid, trans_beg.timestamp AS beg_ts, trans_beg.rpmdb_version AS beg_rv, trans_end.timestamp AS end_ts, trans_end.rpmdb_version AS end_rv, loginuid, return_code FROM trans_beg JOIN trans_end USING(tid)""" # NOTE: sqlite doesn't do OUTER JOINs ... *sigh*. So we have to do it # ourself. if not complete_transactions_only: sql = """SELECT tid, trans_beg.timestamp AS beg_ts, trans_beg.rpmdb_version AS beg_rv, NULL, NULL, loginuid, NULL FROM trans_beg""" params = None if tids and len(tids) <= yum.constants.PATTERNS_INDEXED_MAX: params = tids = list(set(tids)) sql += " WHERE tid IN (%s)" % ", ".join(['?'] * len(tids)) # This relies on the fact that the PRIMARY KEY in sqlite will always # increase with each transaction. In theory we can use: # ORDER BY beg_ts DESC ... except sometimes people do installs with a # system clock that is very broken, and using that screws them forever. sql += " ORDER BY tid DESC" if limit is not None: sql += " LIMIT " + str(limit) executeSQL(cur, sql, params) ret = [] tid2obj = {} for row in cur: if tids and len(tids) > yum.constants.PATTERNS_INDEXED_MAX: if row[0] not in tids: continue obj = YumHistoryTransaction(self, row) tid2obj[row[0]] = obj ret.append(obj) sql = """SELECT tid, trans_end.timestamp AS end_ts, trans_end.rpmdb_version AS end_rv, return_code FROM trans_end""" params = tid2obj.keys() if len(params) > yum.constants.PATTERNS_INDEXED_MAX: executeSQL(cur, sql) else: sql += " WHERE tid IN (%s)" % ", ".join(['?'] * len(params)) executeSQL(cur, sql, params) for row in cur: if row[0] not in tid2obj: continue tid2obj[row[0]].end_timestamp = row[1] tid2obj[row[0]].end_rpmdbversion = row[2] tid2obj[row[0]].return_code = row[3] # Go through backwards, and see if the rpmdb versions match las = None for obj in reversed(ret): cur_rv = obj.beg_rpmdbversion las_rv = None if las is not None: las_rv = las.end_rpmdbversion if las_rv is None or cur_rv is None or (las.tid + 1) != obj.tid: pass elif las_rv != cur_rv: obj.altered_lt_rpmdb = True las.altered_gt_rpmdb = True else: obj.altered_lt_rpmdb = False las.altered_gt_rpmdb = False las = obj return ret def last(self, complete_transactions_only=True): """ This is the last full transaction. So any incomplete transactions do not count, by default. """ ret = self.old([], 1, complete_transactions_only) if not ret: return None assert len(ret) == 1 return ret[0] def _load_anydb_key(self, pkg, db, attr): cur = self._get_cursor() if cur is None or not self._update_db_file_3(): return None pid = self.pkg2pid(pkg, create=False) if pid is None: return None sql = """SELECT %(db)sdb_val FROM pkg_%(db)sdb WHERE pkgtupid=? and %(db)sdb_key=? """ % {'db' : db} executeSQL(cur, sql, (pid, attr)) for row in cur: return row[0] return None def _load_rpmdb_key(self, pkg, attr): return self._load_anydb_key(pkg, "rpm", attr) def _load_yumdb_key(self, pkg, attr): return self._load_anydb_key(pkg, "yum", attr) def _save_anydb_key(self, pkg, db, attr, val): cur = self._get_cursor() if cur is None or not self._update_db_file_3(): return None pid = self.pkg2pid(pkg, create=False) if pid is None: return None sql = """INSERT INTO pkg_%(db)sdb (pkgtupid, %(db)sdb_key, %(db)sdb_val) VALUES (?, ?, ?)""" % {'db' : db} executeSQL(cur, sql, (pid, attr, to_unicode(val))) return cur.lastrowid def _save_rpmdb_key(self, pkg, attr, val): return self._save_anydb_key(pkg, "rpm", attr, val) def _save_yumdb_key(self, pkg, attr, val): return self._save_anydb_key(pkg, "yum", attr, val) def _save_rpmdb(self, ipkg): """ Save all the data for rpmdb for this installed pkg, assumes there is no data currently. """ for attr in YumHistoryPackage._valid_rpmdb_keys: val = getattr(ipkg, attr, None) if val is None: continue if not self._save_anydb_key(ipkg, "rpm", attr, val): return False return True def _save_yumdb(self, ipkg): """ Save all the data for yumdb for this installed pkg, assumes there is no data currently. """ for attr in _YumHistPackageYumDB._valid_yumdb_keys: val = ipkg.yumdb_info.get(attr) if val is None: continue if not self._save_anydb_key(ipkg, "yum", attr, val): return False return True def _wipe_anydb(self, pkg, db): """ Delete all the data for rpmdb/yumdb for this installed pkg. """ cur = self._get_cursor() if cur is None or not self._update_db_file_3(): return False pid = self.pkg2pid(pkg, create=False) if pid is None: return False sql = """DELETE FROM pkg_%(db)sdb WHERE pkgtupid=?""" % {'db' : db} executeSQL(cur, sql, (pid,)) return True def sync_alldb(self, ipkg): """ Sync. all the data for rpmdb/yumdb for this installed pkg. """ if not self._wipe_anydb(ipkg, "rpm"): return False if not (self._wipe_anydb(ipkg, "yum") and self._save_rpmdb(ipkg) and self._save_yumdb(ipkg)): self._rollback() return False self._commit() return True def _pkg_stats(self): """ Some stats about packages in the DB. """ ret = {'nevrac' : 0, 'nevra' : 0, 'nevr' : 0, 'na' : 0, 'rpmdb' : 0, 'yumdb' : 0, } cur = self._get_cursor() if cur is None or not self._update_db_file_3(): return False data = (('nevrac', "COUNT(*)", "pkgtups"), ('na', "COUNT(DISTINCT(name || arch))", "pkgtups"), ('nevra',"COUNT(DISTINCT(name||version||epoch||release||arch))", "pkgtups"), ('nevr', "COUNT(DISTINCT(name||version||epoch||release))", "pkgtups"), ('rpmdb', "COUNT(DISTINCT(pkgtupid))", "pkg_rpmdb"), ('yumdb', "COUNT(DISTINCT(pkgtupid))", "pkg_yumdb")) for key, bsql, esql in data: executeSQL(cur, "SELECT %s FROM %s" % (bsql, esql)) for row in cur: ret[key] = row[0] return ret def _yieldSQLDataList(self, patterns, fields, ignore_case): """Yields all the package data for the given params. """ cur = self._get_cursor() qsql = _FULL_PARSE_QUERY_BEG pat_sqls = [] pat_data = [] for (pattern, rest) in patterns: for field in fields: if ignore_case: pat_sqls.append("%s LIKE ?%s" % (field, rest)) else: pat_sqls.append("%s %s ?" % (field, rest)) pat_data.append(pattern) assert pat_sqls qsql += " OR ".join(pat_sqls) executeSQL(cur, qsql, pat_data) for x in cur: yield x def search(self, patterns, ignore_case=True): """ Search for history transactions which contain specified packages al. la. "yum list". Returns transaction ids. """ # Search packages ... kind of sucks that it's search not list, pkglist? cur = self._get_cursor() if cur is None: return set() # This is kind of a hack, we can't do 'y[u]m' in SQL. In real yum # we manually load everything and then do it inside yum (which is slow # and a lot of code, but nobody uses it anyway and we already had the # code). Here we don't have the code though, and still nobody will use # it. So we cheat: # 1. Convert 'y[u]m' into 'y?m' ... it returns more answers than it # should, but the correct answers are there. # 2. Convert 'y[m' info 'y!m' ... neither will match anything, so w/e. patterns = [re.sub('\[[^]]+\]', '?', x).replace('[', '!') for x in patterns] data = _setupHistorySearchSQL(patterns, ignore_case) (need_full, npatterns, fields, names) = data ret = [] pkgtupids = set() if npatterns: for row in self._yieldSQLDataList(npatterns, fields, ignore_case): pkgtupids.add(row[0]) else: # Too many patterns, *sigh* pat_max = PATTERNS_MAX if not need_full: pat_max = PATTERNS_INDEXED_MAX for npatterns in yum.misc.seq_max_split(patterns, pat_max): data = _setupHistorySearchSQL(npatterns, ignore_case) (need_full, nps, fields, names) = data assert nps for row in self._yieldSQLDataList(nps, fields, ignore_case): pkgtupids.add(row[0]) sql = """SELECT tid FROM trans_data_pkgs WHERE pkgtupid IN """ sql += "(%s)" % ",".join(['?'] * len(pkgtupids)) params = list(pkgtupids) tids = set() if len(params) > yum.constants.PATTERNS_INDEXED_MAX: executeSQL(cur, """SELECT tid,pkgtupid FROM trans_data_pkgs""") for row in cur: if row[1] in params: tids.add(row[0]) return tids if not params: return tids executeSQL(cur, sql, params) for row in cur: tids.add(row[0]) return tids _update_ops_3 = ['''\ \ CREATE TABLE pkg_rpmdb ( pkgtupid INTEGER NOT NULL REFERENCES pkgtups, rpmdb_key TEXT NOT NULL, rpmdb_val TEXT NOT NULL); ''', '''\ CREATE INDEX i_pkgkey_rpmdb ON pkg_rpmdb (pkgtupid, rpmdb_key); ''', '''\ CREATE TABLE pkg_yumdb ( pkgtupid INTEGER NOT NULL REFERENCES pkgtups, yumdb_key TEXT NOT NULL, yumdb_val TEXT NOT NULL); ''', '''\ CREATE INDEX i_pkgkey_yumdb ON pkg_yumdb (pkgtupid, yumdb_key); '''] # pylint: disable-msg=E0203 def _update_db_file_3(self): """ Update to version 3 of history, rpmdb/yumdb data. """ if not self._update_db_file_2(): return False if hasattr(self, '_cached_updated_3'): return self._cached_updated_3 cur = self._get_cursor() if cur is None: return False executeSQL(cur, "PRAGMA table_info(pkg_yumdb)") # If we get anything, we're fine. There might be a better way of # saying "anything" but this works. for ob in cur: break else: for op in self._update_ops_3: cur.execute(op) self._commit() self._cached_updated_3 = True return True _update_ops_2 = ['''\ \ CREATE TABLE trans_skip_pkgs ( tid INTEGER NOT NULL REFERENCES trans_beg, pkgtupid INTEGER NOT NULL REFERENCES pkgtups); ''', '''\ \ CREATE TABLE trans_cmdline ( tid INTEGER NOT NULL REFERENCES trans_beg, cmdline TEXT NOT NULL); ''', '''\ \ CREATE TABLE trans_rpmdb_problems ( rpid INTEGER PRIMARY KEY, tid INTEGER NOT NULL REFERENCES trans_beg, problem TEXT NOT NULL, msg TEXT NOT NULL); ''', '''\ \ CREATE TABLE trans_prob_pkgs ( rpid INTEGER NOT NULL REFERENCES trans_rpmdb_problems, pkgtupid INTEGER NOT NULL REFERENCES pkgtups, main BOOL NOT NULL DEFAULT FALSE); ''', '''\ \ CREATE VIEW vtrans_data_pkgs AS SELECT tid,name,epoch,version,release,arch,pkgtupid, state,done, name || '-' || epoch || ':' || version || '-' || release || '.' || arch AS nevra FROM trans_data_pkgs JOIN pkgtups USING(pkgtupid) ORDER BY name; ''', '''\ \ CREATE VIEW vtrans_with_pkgs AS SELECT tid,name,epoch,version,release,arch,pkgtupid, name || '-' || epoch || ':' || version || '-' || release || '.' || arch AS nevra FROM trans_with_pkgs JOIN pkgtups USING(pkgtupid) ORDER BY name; ''', '''\ \ CREATE VIEW vtrans_skip_pkgs AS SELECT tid,name,epoch,version,release,arch,pkgtupid, name || '-' || epoch || ':' || version || '-' || release || '.' || arch AS nevra FROM trans_skip_pkgs JOIN pkgtups USING(pkgtupid) ORDER BY name; ''', # NOTE: Old versions of sqlite don't like the normal way to do the next # view. So we do it with the select. It's for debugging only, so # no big deal. '''\ \ CREATE VIEW vtrans_prob_pkgs2 AS SELECT tid,rpid,name,epoch,version,release,arch,pkgtups.pkgtupid, main,problem,msg, name || '-' || epoch || ':' || version || '-' || release || '.' || arch AS nevra FROM (SELECT * FROM trans_prob_pkgs,trans_rpmdb_problems WHERE trans_prob_pkgs.rpid=trans_rpmdb_problems.rpid) JOIN pkgtups USING(pkgtupid) ORDER BY name; '''] def _update_db_file_2(self): """ Update to version 2 of history, includes trans_skip_pkgs. """ if not self.conf.writable: return False if hasattr(self, '_cached_updated_2'): return self._cached_updated_2 cur = self._get_cursor() if cur is None: return False executeSQL(cur, "PRAGMA table_info(trans_skip_pkgs)") # If we get anything, we're fine. There might be a better way of # saying "anything" but this works. for ob in cur: break else: for op in self._update_ops_2: cur.execute(op) self._commit() self._cached_updated_2 = True return True # pylint: enable-msg=E0203 def _create_db_file(self): """ Create a new history DB file, populating tables etc. """ self._db_date = time.strftime('%Y-%m-%d') _db_file = '%s/%s-%s.%s' % (self.conf.db_path, 'history', self._db_date, 'sqlite') if self._db_file == _db_file: os.rename(_db_file, _db_file + '.old') # Just in case ... move the journal file too. if os.path.exists(_db_file + '-journal'): os.rename(_db_file + '-journal', _db_file + '-journal.old') self._db_file = _db_file if not self.conf.writable: return False if not os.path.exists(self._db_file): # make them default to 0600 - sysadmin can change it later # if they want fo = os.open(self._db_file, os.O_CREAT, 0600) os.close(fo) cur = self._get_cursor() ops = ['''\ CREATE TABLE trans_beg ( tid INTEGER PRIMARY KEY, timestamp INTEGER NOT NULL, rpmdb_version TEXT NOT NULL, loginuid INTEGER); ''', '''\ CREATE TABLE trans_end ( tid INTEGER PRIMARY KEY REFERENCES trans_beg, timestamp INTEGER NOT NULL, rpmdb_version TEXT NOT NULL, return_code INTEGER NOT NULL); ''', '''\ \ CREATE TABLE trans_with_pkgs ( tid INTEGER NOT NULL REFERENCES trans_beg, pkgtupid INTEGER NOT NULL REFERENCES pkgtups); ''', '''\ \ CREATE TABLE trans_error ( mid INTEGER PRIMARY KEY, tid INTEGER NOT NULL REFERENCES trans_beg, msg TEXT NOT NULL); ''', '''\ CREATE TABLE trans_script_stdout ( lid INTEGER PRIMARY KEY, tid INTEGER NOT NULL REFERENCES trans_beg, line TEXT NOT NULL); ''', '''\ \ CREATE TABLE trans_data_pkgs ( tid INTEGER NOT NULL REFERENCES trans_beg, pkgtupid INTEGER NOT NULL REFERENCES pkgtups, done BOOL NOT NULL DEFAULT FALSE, state TEXT NOT NULL); ''', '''\ \ CREATE TABLE pkgtups ( pkgtupid INTEGER PRIMARY KEY, name TEXT NOT NULL, arch TEXT NOT NULL, epoch TEXT NOT NULL, version TEXT NOT NULL, release TEXT NOT NULL, checksum TEXT); ''', '''\ CREATE INDEX i_pkgtup_naevr ON pkgtups (name, arch, epoch, version, release); '''] for op in ops: cur.execute(op) for op in self._update_ops_2: cur.execute(op) for op in self._update_ops_3: cur.execute(op) self._commit() return True # Pasted from sqlitesack _FULL_PARSE_QUERY_BEG = """ SELECT pkgtupid,name,epoch,version,release,arch, name || "." || arch AS sql_nameArch, name || "-" || version || "-" || release || "." || arch AS sql_nameVerRelArch, name || "-" || version AS sql_nameVer, name || "-" || version || "-" || release AS sql_nameVerRel, epoch || ":" || name || "-" || version || "-" || release || "." || arch AS sql_envra, name || "-" || epoch || ":" || version || "-" || release || "." || arch AS sql_nevra FROM pkgtups WHERE """ PK[̈EEsite-packages/yum/repos.pycnu[ v_c@sddlZddlZddlZddlZddlZddlZddlmZddlZ ddl m Z dfdYZ dfdYZ dfd YZdS( iN(tMetaSack(tproxyt_wrap_ayum_getKeyForRepocBs&eZdZedZddZRS(sc This is a wrapper for calling YumBase.getKeyForRepo() because otherwise we take a real reference through the bound method and that is d00m (this applies to YumBase and RepoStorage, hence why we have a separate class). A "better" fix might be to explicitly pass the YumBase instance to the callback ... API change! cCst||_||_dS(N(tweakreftayumtca(tselfRR((s-/usr/lib/python2.7/site-packages/yum/repos.pyt__init__$scCs/|jr|jj||S|jj||S(N(RRtgetCAKeyForRepot getKeyForRepo(Rtrepotcallback((s-/usr/lib/python2.7/site-packages/yum/repos.pyt__call__'s N(t__name__t __module__t__doc__tFalseRtNoneR (((s-/usr/lib/python2.7/site-packages/yum/repos.pyRs t RepoStoragecBseZdZdZdZddZdZdZdZ dZ dZ d Z d Z eed Zd Zd ZdZdZdZdZddZdZdZdZdZdddddZRS(sXThis class contains multiple repositories and core configuration data about them.cCsi|_d|_d|_t|_tjd|_t |_ t ||_ t ||_t |dt|_d|_g|_i|_t |_dS(Nisyum.RepoStorageR(treposRR tcacheRtpkgSacktloggingt getLoggertloggerRt_setupRRRtgpg_import_functTruetgpgca_import_funct confirm_funct_cache_enabled_repostquick_enable_disablet_list_enabled_hasrun(RR((s-/usr/lib/python2.7/site-packages/yum/repos.pyR0s        c CsttjdsdSg}x|jD]}|jr>q)ny|joV|j|}Wn;tjk r}|j s~n|j |j t }nX|r)|j }|j|}|j||t gfq)q)Wxt tfD]}xk|D]c\}}}|d} xE|D]=\} } | jdk|kr|j| dtd| qqWqWtjjqWx;|D]3\}}}|dr|jqr|j|qrWdS(sX Download metadata for all enabled repositories, based on mdpolicy. t parallel_waitNcSst|d|jjD]-}||jkr|j|_||_qqWdS(s$sets the cachedir value in all reposN(t _cachedirRRat basecachedirtold_base_cache_dir(RtcachedirR ((s-/usr/lib/python2.7/site-packages/yum/repos.pyt setCacheDir.s   cCs.x'|jjD]}|j||qWdS(s6sets the progress bar for downloading files from reposN(RRat setCallback(RR"t multi_objR ((s-/usr/lib/python2.7/site-packages/yum/repos.pytsetProgressBar8scCs+x$|jjD]}|j|qWdS(s'sets the failure callback for all reposN(RRat setFailureObj(RR"R ((s-/usr/lib/python2.7/site-packages/yum/repos.pytsetFailureCallback>scCs+x$|jjD]}|j|qWdS(s)sets the failure callback for all mirrorsN(RRatsetMirrorFailureObj(RR"R ((s-/usr/lib/python2.7/site-packages/yum/repos.pytsetMirrorFailureCallbackDscCs+x$|jjD]}|j|qWdS(N(RRatsetInterruptCallback(RR R ((s-/usr/lib/python2.7/site-packages/yum/repos.pyRJscCs|jS(N(R(R((s-/usr/lib/python2.7/site-packages/yum/repos.pytgetPackageSackNsRRtmetadataic Cs|js|jn|s(|j}ng}|dkrI|j}n|dkrg|jj}nt|tjkrx|D]A}t |t r|j |q|j |}|j |qWn4t|tj kr|j |}|j |n|dkrdddg}n |g}ttjdrxE|D]=}|jrTq?n|jr?|j} | j||q?q?Wtjjnx|D]}|j} y| j||||Wntk r2} | jdjdsn|d kr|jr|j|jqtj| jdqtjk rr} |d krl|jrl|j|jqqX|jj |j| qWd S( s This populates the package sack from the repositories, two optional arguments: - which='repoid, enabled, all' - mdtype='metadata, filelists, otherdata, all' RRtallRt filelistst otherdataR!itParsingN(sallR(sallR(!RRZR R)RRattypettypestListTypet isinstancet RepositoryR3Rlt StringTypeR&R'R(RR*Rt_retrieve_asyncR!tpopulatet TypeErrortargst startswithR.R/R0R,R-RtaddSack( RtwhichtmdtypeR t cacheonlytmyreposR trepobjtdatatsackR9((s-/usr/lib/python2.7/site-packages/yum/repos.pyt populateSackRsX              N(R RRRR?RRZR]R`R^RfRhRiRlRRFR/RR)RRRRRRRRR(((s-/usr/lib/python2.7/site-packages/yum/repos.pyR,s0  ) ,                RcBseZdZdZdZdZdZdZdZe eZ dZ dZ d Z d Zd Zd Zd ZdZdZdZdZdZdZdZdZddedZddedZRS(s#this is an actual repository objectcCs)||_i|_|jt|_dS(N(R0RR}Rt_xml2sqlite_local(RRg((s-/usr/lib/python2.7/site-packages/yum/repos.pyRs   cCs4|j|jkrdS|j|jkr,dSdSdS(sf Sort base class repos. by alphanumeric on their id, also see __cmp__ in YumRepository(). iiiN(R0(RRX((s-/usr/lib/python2.7/site-packages/yum/repos.pyt__cmp__s cCs|jS(N(R0(R((s-/usr/lib/python2.7/site-packages/yum/repos.pyR]scCs t|jS(N(thashR0(R((s-/usr/lib/python2.7/site-packages/yum/repos.pyt__hash__scCsWy|jWnBtjk rR}|jjdt|t||jfnXdS(NsException %s %s in %s ignored(R^R,R-RRHR_R[R`(RR9((s-/usr/lib/python2.7/site-packages/yum/repos.pyR`scCs|jS(s1 Show self.id, so we can use it and override it. (R0(R((s-/usr/lib/python2.7/site-packages/yum/repos.pyt_ui_idscCsdS(N((R((s-/usr/lib/python2.7/site-packages/yum/repos.pyR^scCst|||dS(s+sets a generic attribute of this repositoryN(tsetattr(Rtkeytvalue((s-/usr/lib/python2.7/site-packages/yum/repos.pyt setAttributescCst||dS(N(RSR(RR((s-/usr/lib/python2.7/site-packages/yum/repos.pyt getAttributescCs|jd}|dk o|S(NRR(RR(RRR((s-/usr/lib/python2.7/site-packages/yum/repos.pyRscCs$|jddt|j|js       hPK[site-packages/yum/config.pycnu[ v_c@sdZeZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z y@ddl mZddlmZmZmZddlmZWnek reZnXesddlmZmZmZddlmZnddlZddlZddlZddlZddlmZmZddlZeZ eZ!eZ"d Z#d Z$d Z%d Z&gZ'd e(fdYZ)dZ*de)fdYZ+de)fdYZ,de,fdYZ-de+fdYZ.de+fdYZ/de)fdYZ0de0fdYZ1de)fdYZ2d e)fd!YZ3d"e)fd#YZ4d$e)fd%YZ5d&e5fd'YZ6d(e)fd)YZ7d*e7fd+YZ8d,e(fd-YZ9d.e9fd/YZ:d0e:fd1YZ;d2e9fd3YZ<d4e9fd5YZ=d6Z>dd7Z@d8ZAd9d:ZBd;ZCd<ZDd=ZEd>ZFdd?ZGdd@ZHdS(As2 Configuration parser and default values for yum. iN(tConfigPreProcessort varReplace(t INIConfig(tNoSectionErrort NoOptionErrort ParsingError(tRawConfigParser(t ConfigParser(tget_uuidtread_in_items_from_dot_dirtbesttpriorityitobjectstOptioncBs\eZdZd edZdZdZdZdZ dZ dZ dZ RS( s This class handles a single Yum configuration file option. Create subclasses for each type of supported configuration option. Python descriptor foo (__get__ and __set__) is used to make option definition easy and concise. cCs8|jt|_|r+|j|}n||_dS(N(t _setattrnametFalsetinherittparsetdefault(tselfRt parse_default((s./usr/lib/python2.7/site-packages/yum/config.pyt__init__As   cCsdt||_dS(smCalculate the internal attribute name used to store option state in configuration instances. s__opt%dN(tidt _attrname(R((s./usr/lib/python2.7/site-packages/yum/config.pyRHscCs#|dkr|St||jdS(sBCalled when the option is read (via the descriptor protocol). :param obj: The configuration instance to modify. :param objtype: The type of the config instance (not used). :return: The parsed option value or the default value if the value wasn't set in the configuration file. N(tNonetgetattrR(Rtobjtobjtype((s./usr/lib/python2.7/site-packages/yum/config.pyt__get__Ns cCstt|tr]y|j|}Wq]tk rY}td|j|t|fq]Xnt||j|dS(sCalled when the option is set (via the descriptor protocol). :param obj: The configuration instance to modify. :param value: The value to set the option to. sError parsing "%s = %r": %sN(t isinstancet basestringRt ValueErrort_optnametstrtsetattrR(RRtvaluete((s./usr/lib/python2.7/site-packages/yum/config.pyt__set__\s cCs,||_t||jtj|jdS(sInitialise the option for a config instance. This must be called before the option can be set or retrieved. :param obj: :class:`BaseConfig` (or subclass) instance. :param name: Name of the option. N(R R"RtcopyR(RRtname((s./usr/lib/python2.7/site-packages/yum/config.pytsetupls cCstj|}|j|S(s|Return a safe copy of this :class:`Option` instance. :return: a safe copy of this :class:`Option` instance (R&R(Rtnew((s./usr/lib/python2.7/site-packages/yum/config.pytclonevs cCs|S(s Parse the string value to the :class:`Option`'s native value. :param s: raw string value to parse :return: validated native value :raise: ValueError if there was a problem parsing the string. Subclasses should override this ((Rts((s./usr/lib/python2.7/site-packages/yum/config.pyRscCs t|S(s Convert the :class:`Option`'s native value to a string value. This does the opposite of the :func:`parse` method above. Subclasses should override this. :param value: native option value :return: string representation of input (R!(RR#((s./usr/lib/python2.7/site-packages/yum/config.pyttostringsN( t__name__t __module__t__doc__RRRRRR%R(R*RR,(((s./usr/lib/python2.7/site-packages/yum/config.pyR 9s    cCs|j}t|_|S(sClone an :class:`Option` instance for the purposes of inheritance. The returned instance has all the same properties as the input :class:`Option` and shares items such as the default value. Use this to avoid redefinition of reused options. :param option_obj: :class:`Option` instance to inherit :return: New :class:`Option` instance inherited from the input (R*tTrueR(t option_objt new_option((s./usr/lib/python2.7/site-packages/yum/config.pytInherits  t ListOptioncBs/eZdZdedZdZdZRS(s'An option containing a list of strings.cCs2|dkrg}ntt|j||dS(N(RtsuperR4R(RRR((s./usr/lib/python2.7/site-packages/yum/config.pyRs  cCs|jdd}|jdd}g}x[|jD]M}|jdrw|jdd}|jt|q7n|j|q7W|S(sConvert a string from the config file to a workable list, parses globdir: paths as foo.d-style dirs. :param s: The string to be converted to a list. Commas and whitespace are used as separators for the list :return: *s* converted to a list s t t,sglob:t(treplacetsplitt startswithtextendR tappend(RR+tresultstitemtthisglob((s./usr/lib/python2.7/site-packages/yum/config.pyRs cCs dj|S(sConvert a list of to a string value. This does the opposite of the :func:`parse` method above. :param value: a list of values :return: string representation of input s (tjoin(RR#((s./usr/lib/python2.7/site-packages/yum/config.pyR,sN(R-R.R/RRRRR,(((s./usr/lib/python2.7/site-packages/yum/config.pyR4s t UrlOptioncBs2eZdZdd edZdZdZRS( sMThis option handles lists of URLs with validation of the URL scheme. thttptftptfilethttpscCs,tt|j|||_||_dS(N(R5RBRtschemest allow_none(RRRGRH((s./usr/lib/python2.7/site-packages/yum/config.pyRs cCs|j}|jdkr:|jr+dStdntj|\}}}}}}||jkrtd|j|fn|S(sParse a url to make sure that it is valid, and in a scheme that can be used. :param url: a string containing the url to parse :return: *url* if it is valid :raises: :class:`ValueError` if there is an error parsing the url t_none_s"_none_" is not a valid valuesURL must be %s not "%s"(tstriptlowerRHRturlparseRGt _schemelist(RturlR+tbtptqtfto((s./usr/lib/python2.7/site-packages/yum/config.pyRs  !cCsbt|jdkrdSt|jdkr9|jdSddj|jd |jdfSdS(s;Return a user friendly list of the allowed schemes itemptyis%s or %ss, iN(tlenRGRA(R((s./usr/lib/python2.7/site-packages/yum/config.pyRMs  N(RCRDsfileRF(R-R.R/RRRRRM(((s./usr/lib/python2.7/site-packages/yum/config.pyRBs   t ProxyOptioncBseZdZdZRS(s4 Just like URLOption but accept "libproxy" too. cCs,|jjdkrdStj||S(Ntlibproxy(RJRKRBR(Rtproxy((s./usr/lib/python2.7/site-packages/yum/config.pyRs(R-R.R/R(((s./usr/lib/python2.7/site-packages/yum/config.pyRVst UrlListOptioncBs)eZdZddedZdZRS( sMOption for handling lists of URLs with validation of the URL scheme. RCRDRERFcCs/tt|j||td||_dS(NRG(R5RYRRBt _urloption(RRRGR((s./usr/lib/python2.7/site-packages/yum/config.pyRscCsg}|jdd}|jdd}gtj|D]}|jdd^q:}g}xU|D]M}|jdr|jdd}|jt|qen|j|qeWxBtt|j dj |D]}|j|j j |qW|S(s,Parse a string containing multiple urls into a list, and ensure that they are in a scheme that can be used. :param s: the string to parse :return: a list of strings containing the urls in *s* :raises: :class:`ValueError` if there is an error parsing the urls s R6R7s%20sglob:R8( R9tshlexR:R;R<R R=R5RYRRARZ(RR+toutR?titemsttmpR@RN((s./usr/lib/python2.7/site-packages/yum/config.pyRs. (N(shttpsftpsfileshttps(R-R.R/RRRR(((s./usr/lib/python2.7/site-packages/yum/config.pyRYs tWildListOptioncBseZdZdZRS(suAn option containing a list of strings that supports shell-style wildcard matching in membership test operations.cCs8dtfdY}tt|j|}||S(NtWildListcBseZdZRS(cs-ttstStfd|DS(Nc3s!|]}tj|VqdS(N(tfnmatch(t.0RP(R?(s./usr/lib/python2.7/site-packages/yum/config.pys )s(RRRtany(RR?((R?s./usr/lib/python2.7/site-packages/yum/config.pyt __contains__&s(R-R.Rd(((s./usr/lib/python2.7/site-packages/yum/config.pyR`%s(tlistR5R_R(RR+R`tpatterns((s./usr/lib/python2.7/site-packages/yum/config.pyR$s(R-R.R/R(((s./usr/lib/python2.7/site-packages/yum/config.pyR_ st IntOptioncBs)eZdZddddZdZRS(s(An option representing an integer value.cCs,tt|j|||_||_dS(N(R5RgRt _range_mint _range_max(RRt range_mint range_max((s./usr/lib/python2.7/site-packages/yum/config.pyR1s cCsyt|}Wn%ttfk r7}tdnX|jdk re||jkretdn|jdk r||jkrtdn|S(sParse a string containing an integer. :param s: the string to parse :return: the integer in *s* :raises: :class:`ValueError` if there is an error parsing the integer sinvalid integer valuesout of range integer valueN(tintRt TypeErrorRiRRh(RR+tvalR$((s./usr/lib/python2.7/site-packages/yum/config.pyR6sN(R-R.R/RRR(((s./usr/lib/python2.7/site-packages/yum/config.pyRg.stPositiveIntOptioncBs,eZdZdddddZdZRS(sdAn option representing a positive integer value, where 0 can have a special representation. icCs)tt|j|||||_dS(N(R5RoRt_names0(RRRjRkt names_of_0((s./usr/lib/python2.7/site-packages/yum/config.pyRLscCs)||jkrdStt|j|S(sParse a string containing a positive integer, where 0 can have a special representation. :param s: the string to parse :return: the integer in *s* :raises: :class:`ValueError` if there is an error parsing the integer i(RpR5RoR(RR+((s./usr/lib/python2.7/site-packages/yum/config.pyRQs N(R-R.R/RRR(((s./usr/lib/python2.7/site-packages/yum/config.pyRoHs  t SecondsOptioncBs9eZdZid d6d d6dd6dd6ZdZRS( sAn option representing an integer value of seconds, or a human readable variation specifying days, hours, minutes or seconds until something happens. Works like :class:`BytesOption`. Note that due to historical president -1 means "never", so this accepts that and allows the word never, too. Valid inputs: 100, 1.5m, 90s, 1.2d, 1d, 0xF, 0.1, -1, never. Invalid inputs: -10, -0.1, 45.6Z, 1d6h, 1day, 1y. Return value will always be an integer i<itdthtmiR+cCst|dkr!tdn|dks9|dkr=dS|djr|d }|dj}|jj|d }|std|qn |}d}yt|}Wn%ttfk r}tdnX|dkrtd nt ||S( sParse a string containing an integer value of seconds, or a human readable variation specifying days, hours, minutes or seconds until something happens. Works like :class:`BytesOption`. Note that due to historical president -1 means "never", so this accepts that and allows the word never, too. Valid inputs: 100, 1.5m, 90s, 1.2d, 1d, 0xF, 0.1, -1, never. Invalid inputs: -10, -0.1, 45.6Z, 1d6h, 1day, 1y. :param s: the string to parse :return: an integer representing the number of seconds specified by *s* :raises: :class:`ValueError` if there is an error parsing the string isno value specifieds-1tneverisunknown unit '%s's invalid valueis!seconds value may not be negativeN( RURtisalphaRKtMULTStgetRtfloatRmRl(RR+tntunittmultR$((s./usr/lib/python2.7/site-packages/yum/config.pyRls&  iiQi(R-R.R/RxR(((s./usr/lib/python2.7/site-packages/yum/config.pyRr^s "t BoolOptioncBs eZdZdZdZRS(shAn option representing a boolean value. The value can be one of 0, 1, yes, no, true, or false. cCs<|j}|d krtS|d kr,tStddS( sParse a string containing a boolean value. 1, yes, and true will evaluate to True; and 0, no, and false will evaluate to False. Case is ignored. :param s: the string containing the boolean value :return: the boolean value contained in *s* :raises: :class:`ValueError` if there is an error in parsing the boolean value t0tnotfalset1tyesttruesinvalid boolean valueN(RRR(RsyesR(RKRR0R(RR+((s./usr/lib/python2.7/site-packages/yum/config.pyRs   cCs|r dSdSdS(sConvert a boolean value to a string value. This does the opposite of the :func:`parse` method above. :param value: the boolean value to convert :return: a string representation of *value* RRN((RR#((s./usr/lib/python2.7/site-packages/yum/config.pyR,s(R-R.R/RR,(((s./usr/lib/python2.7/site-packages/yum/config.pyR~s t FloatOptioncBseZdZdZRS(s-An option representing a numeric float value.cCs>yt|jSWn#ttfk r9tdnXdS(sParse a string containing a numeric float value. :param s: a string containing a numeric float value to parse :return: the numeric float value contained in *s* :raises: :class:`ValueError` if there is an error parsing float value sinvalid float valueN(RzRJRRm(RR+((s./usr/lib/python2.7/site-packages/yum/config.pyRs(R-R.R/R(((s./usr/lib/python2.7/site-packages/yum/config.pyRstSelectionOptioncBs)eZdZddidZdZRS(sFHandles string values where only specific values are allowed. cCs,tt|j|||_||_dS(N(R5RRt_allowedt_mapper(RRtallowedtmapper((s./usr/lib/python2.7/site-packages/yum/config.pyRs cCsE||jkr|j|}n||jkrAtd|n|S(sParse a string for specific values. :param s: the string to parse :return: *s* if it contains a valid value :raises: :class:`ValueError` if there is an error parsing the values s"%s" is not an allowed value(RRR(RR+((s./usr/lib/python2.7/site-packages/yum/config.pyRs N((R-R.R/RRR(((s./usr/lib/python2.7/site-packages/yum/config.pyRstCaselessSelectionOptioncBseZdZdZRS(svMainly for compatibility with :class:`BoolOption`, works like :class:`SelectionOption` but lowers input case. cCstt|j|jS(sParse a string for specific values. :param s: the string to parse :return: *s* if it contains a valid value :raises: :class:`ValueError` if there is an error parsing the values (R5RRRK(RR+((s./usr/lib/python2.7/site-packages/yum/config.pyRs(R-R.R/R(((s./usr/lib/python2.7/site-packages/yum/config.pyRst BytesOptioncBs2eZdZidd6dd6dd6ZdZRS( svAn option representing a value in bytes. The value may be given in bytes, kilobytes, megabytes, or gigabytes. itkRutgcCst|dkr!tdn|djr||d }|dj}|jj|d}|std|qn |}d}yt|}Wn!tk rtd|nX|dkrtdnt||S( sFParse a friendly bandwidth option to bytes. The input should be a string containing a (possibly floating point) number followed by an optional single character unit. Valid units are 'k', 'M', 'G'. Case is ignored. The convention that 1k = 1024 bytes is used. Valid inputs: 100, 123M, 45.6k, 12.4G, 100K, 786.3, 0. Invalid inputs: -10, -0.1, 45.6L, 123Mb. :param s: the string to parse :return: the number of bytes represented by *s* :raises: :class:`ValueError` if the option can't be parsed isno value specifiedisunknown unit '%s'scouldn't convert '%s' to numberisbytes value may not be negativeN( RURRwRKRxRyRRzRl(RR+R{R|R}((s./usr/lib/python2.7/site-packages/yum/config.pyRs"   iii@(R-R.R/RxR(((s./usr/lib/python2.7/site-packages/yum/config.pyRs  tThrottleOptioncBseZdZdZRS(sjAn option representing a bandwidth throttle value. See :func:`parse` for acceptable input values. cCst|dkr!tdn|ddkr|d }yt|}Wn!tk rntd|nX|dks|dkrtdn|d Stj||Sd S( s(Get a throttle option. Input may either be a percentage or a "friendly bandwidth value" as accepted by the :class:`BytesOption`. Valid inputs: 100, 50%, 80.5%, 123M, 45.6k, 12.4G, 100K, 786.0, 0. Invalid inputs: 100.1%, -4%, -500. :param s: the string to parse :return: the bandwidth represented by *s*. The return value will be an int if a bandwidth value was specified, and a float if a percentage was given :raises: :class:`ValueError` if input can't be parsed isno value specifiedit%scouldn't convert '%s' to numberiidspercentage is out of rangegY@N(RURRzRR(RR+R{((s./usr/lib/python2.7/site-packages/yum/config.pyRs  (R-R.R/R(((s./usr/lib/python2.7/site-packages/yum/config.pyRst BaseConfigcBseZdZdZdZd dZedZe eZdZ e e Z dZ dZ d d dZ d d Zd ZRS( sgBase class for storing configuration definitions. Subclass when creating your own definitions. cCsCd|_x3|jD]%}|j|}|j||qWdS(N(Rt_sectiontiterkeyst optionobjR((RR'toption((s./usr/lib/python2.7/site-packages/yum/config.pyRAs cCs[g}|jd|jx1|jD]#\}}|jd||fq'Wdj|S(Ns[%s]s%s: %rs (R=Rt iteritemsRA(RR\R'R#((s./usr/lib/python2.7/site-packages/yum/config.pyt__str__Hs cCs||_||_|j|r9t|j|}n t}x|jD]|}|j|}d}||kr|j||}n!|r|j rt ||}n|dk rOt |||qOqOWdS(sCSet option values from an INI file section. :param parser: :class:`ConfigParser` instance (or subclass) :param section: INI file section to read use :param parent: Optional parent :class:`BaseConfig` (or subclass) instance to use when doing option value inheritance N( tcfgRt has_sectiontsettoptionsRRRRyRRR"(RtparsertsectiontparenttoptsR'RR#((s./usr/lib/python2.7/site-packages/yum/config.pytpopulateOs     cCs<t||d}t|tr%|S|r4tndSdS(sReturn the :class:`Option` instance for the given name. :param cls: the class to return the :class:`Option` instance from :param name: the name of the :class:`Option` instance to return :param exceptions: defines what action to take if the specified :class:`Option` instance does not exist. If *exceptions* is True, a :class:`KeyError` will be raised. If *exceptions* is False, None will be returned :return: the :class:`Option` instance specified by *name*, or None if it does not exist and *exceptions* is False :raises: :class:`KeyError` if the specified :class:`Option` does not exist, and *exceptions* is True N(RRRR tKeyError(tclsR't exceptionsR((s./usr/lib/python2.7/site-packages/yum/config.pyRls  cCs|j|dtdk S(sReturn True if the given name refers to a defined option. :param cls: the class to find the option in :param name: the name of the option to search for :return: whether *name* specifies a defined option RN(RRR(RR'((s./usr/lib/python2.7/site-packages/yum/config.pytisoptionsccs2x+t|D]}|j|r |Vq q WdS(s7Yield the names of all defined options in the instance.N(tdirR(RR'((s./usr/lib/python2.7/site-packages/yum/config.pyRsccs/x(|jD]}|t||fVq WdS(sYield (name, value) pairs for every option in the instance. The value returned is the parsed, validated option value. N(RR(RR'((s./usr/lib/python2.7/site-packages/yum/config.pyRsc Cs|dkr6|jdkr*tdn|j}n|jj|}x~|jD]p\}}|j|}|dks||ks|j|ks||krU|jj|||j |qUqUW|jj |dS(sWrite out the configuration to a file-like object. :param fileobj: File-like object to write to :param section: Section name to use. If not specified, the section name used during parsing will be used :param always: A sequence of option names to always write out. Options not listed here will only be written out if they are at non-default values. Set to None to dump out all options s!not populated, don't know sectionN( RRRRRRRRRR,twrite(RtfileobjRtalwayst cfgOptionsR'R#R((s./usr/lib/python2.7/site-packages/yum/config.pyRs  3&cCs0tjdtt||r,t||S|S(sCReturn the current value of the given option. :param option: string specifying the option to return the value of :param default: the value to return if the option does not exist :return: the value of the option specified by *option*, or *default* if it does not exist sxgetConfigOption() will go away in a future version of Yum. Please access option values as attributes or using getattr().(twarningstwarntDeprecationWarningthasattrR(RRR((s./usr/lib/python2.7/site-packages/yum/config.pytgetConfigOptions  cCsFtjdtt||r2t|||ntjd|dS(sSet the value of the given option to the given value. :param option: string specifying the option to set the value of :param value: the value to set the option to susetConfigOption() will go away in a future version of Yum. Please set option values as attributes or using setattr().sNo such option %sN(RRRRR"tErrorst ConfigError(RRR#((s./usr/lib/python2.7/site-packages/yum/config.pytsetConfigOptions  N((R-R.R/RRRRR0Rt classmethodRRRRRR(((s./usr/lib/python2.7/site-packages/yum/config.pyR<s          t StartupConfcBseZdZedddZedddZeddgZedZ edZ e e Z ed d gZed gZe e ZeZed Zed ZedZe eZe eZRS(sConfiguration option definitions for yum.conf's [main] section that are required early in the initialisation process or before the other [main] options can be parsed. iii issystem-release(releasever)sredhat-releaset/s/etc/yum/yum.confs/usr/share/yum-pluginss/usr/lib/yum-pluginss/etc/yum/pluginconf.dtLOG_USERs/dev/logs /var/lib/yum(R-R.R/Rgt debuglevelt errorlevelR4t distroverpkgR t installroottconfig_file_pathR~Rtpluginst pluginpathtpluginconfpatht gaftonmodet syslog_identtsyslog_facilityt syslog_devicet persistdirR0tskip_missing_names_on_installtskip_missing_names_on_update(((s./usr/lib/python2.7/site-packages/yum/config.pyRs          tYumConfcBseZdZedddgZedddZeeZ e dZ eeZ eeZ e dZed d gZeZeZe eZed ed dldeZe Ze Ze Ze Zedddddddddddd d!g Zeedd"dd#d$gZeddddd%d d!gZe e!Z"eZ#e Z$eeZ%eeZ&eeZ'eeZ(eeZ)eeZ*eeZ+eeZ,ee-Z.ee/Z0ee-Z1ee2Z3eeZ4eeZ5eeZ6eeZ7eeZ8eeZ9eeZ:eeZ;ed&d gZ<e=e>dmZ?eeZ@eAd*ZBedZCeDdZEeFdZGeHd+dnd/id,d06d-d16ZIedddZJeeZKed"dd2d3d4ZLed5ddd3d6ZMed6ddZNe=d7doZOePdqZQe=d=drZRePdtZSeeZTeZUeeZVeeZWedBgZXe=dCduZYe=eZdvZ[e dFZ\e=dGdwd/i dHdI6dHdJ6dHdK6dHdL6d>dM6d>dN6d>d#6d>dO6dGdP6dGdQ6Z]e dRZ^e dSZ_e dTZ`e dUZae dVZbe dWZce dXZde dYZee dTZfe dVZge dTZhe dRZie dTZje dRZkedZd[gZle ZmeeZne Zoe ZpeeZqeeZred\d]gZse d^Zted_d`eZueeZveeZweeZxeeZyeeZzeeZ{eeZ|eeZ}e=dadxd/idcdd6dad 6Z~eeZeeZeeZedeZed6dded3d6Zedfd`eZe=dgdyZed6ddgZeeZeeZeeZe=d#dzZgZd{ZdkZRS(|sConfiguration option definitions for yum.conf's [main] section. Note: see also options inherited from :class:`StartupConf` i Rqs iRjis/var/cache/yums/var/log/yum.logs/etc/yum/repos.ds/etc/yum.repos.dRRGRCRDRFtsocks4tsocks4atsocks5tsocks5hRHtkernels kernel-bigmemsinstallonlypkg(kernel)sinstallonlypkg(kernel-module)sinstallonlypkg(vm)skernel-enterprises kernel-smps kernel-debugskernel-unsupporteds kernel-sources kernel-devels kernel-PAEskernel-PAE-debugiRss kernel-BOOTt mandatorytcompatR tsimpleg>@Rtipv4tipv6twhateverRt4t6iRkiiKidtalltnonetpackagess lazy:packagesi<isread-only:presentRvsread-only:futuresread-only:pastis group:smalltsqlitetxmlR sVhttps://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&version=rawhide&component=yumtautoRtonRRRtoffRRtttysif-ttytbolds bold,yellowtnormalsbold,redsbold,underlines bold,bluesdim,cyansbold,underline,greent releasevertbasearchtyumtrpmtinfos%yum, glob:/etc/yum/protected.d/*.confRssingle-user-commandstuserstcommandstcmdsis0!*/swap !*/lv_swap glob:/etc/yum/fssnap.d/*.confRcs broken-setupssnapshot-failuret?cCsd}d}xt|D]}|jd r4qn||krFqntt||tjrgqnt||}| rt|tttd fkrd }nt|tjkrd j |}n|d||f}qW|S(sReturn a string representing the values of all the configuration options. :return: a string representing the values of all the configuration options s[main] Rtuidtyumvart progress_objt failure_objtdisable_excludestconfig_file_ageRt_iR8s, s%s = %s (scfgsuidsyumvarRRsdisable_excludessconfig_file_agesconfig_file_path( RR;RRttypest MethodTypettypeRtListTypeRA(Rtoutputt excluded_varstattrtres((s./usr/lib/python2.7/site-packages/yum/config.pytdumps" + (shttpsftpshttpsRRRR(RR R(RRR(RRsalls lazy:packagesii`T(sneversread-only:futuresread-only:presentsread-only:pastiiQ(RR(R sall(Rsneversalways(ssingle-user-commandsRscommands(s broken-setupssnapshot-failuresanyR(RRN(R-R.R/RotretriesRgtrecentR~R0t reset_niceR tcachedirt keepcachet usercachetlogfileR4treposdirRtexcludet__main_failovermethod_default__tfailovermethodRVRRXtproxy_usernametproxy_passwordtusernametpasswordtinstallonlypkgst"__main_installonly_limit_default__tinstallonly_limittkernelpkgnamesR_t__exactarchlist_default__t exactarchlistttsflagstoverride_install_langst assumeyestassumenot alwayspromptt exactarchttoleranttdiskspacechecktoverwrite_groupst keepalivet__pkgs_gpgcheck_default__tgpgcheckt__repo_gpgcheck_default__t repo_gpgchecktlocalpkg_gpgcheckt__payload_gpgcheck_default__tpayload_gpgcheckt obsoletestshowdupesfromrepostenabledtremove_leaf_onlytrepopkgsremove_leaf_onlyt enablegroupstenable_group_conditionalstgroupremove_leaf_onlytgroup_package_typesRt__group_command_default__t group_commandtupgrade_group_objects_upgradeRttimeouttminrateRt bandwidthRtthrottleRt ip_resolvetmax_connectionstftp_disable_epsvtdeltarpmtdeltarpm_percentagetdeltarpm_metadata_percentaget http_cachingRrtmetadata_expiretmetadata_expire_filtertmirrorlist_expiretrpm_check_debugRtquery_install_excludest skip_brokentmdpolicytmddownloadpolicyt __main_multilib_policy_default__tmultilib_policytbugtracker_urltcolortcolor_list_installed_oldertcolor_list_installed_newertcolor_list_installed_reinstalltcolor_list_installed_extrat#color_list_installed_running_kerneltcolor_list_available_upgradetcolor_list_available_downgradetcolor_list_available_reinstalltcolor_list_available_installt#color_list_available_running_kerneltcolor_update_installedtcolor_update_localtcolor_update_remotetcolor_search_matchtui_repoid_varst sslcacertt sslverifyt sslclientcertt sslclientkeytssl_check_cert_permissionsthistory_recordthistory_record_packagest rpmverbositytprotected_packagestprotected_multilibt exit_on_locktloadts_ignoremissingtloadts_ignorerpmtloadts_ignorenewrpmt autosavetstclean_requirements_on_removetupgrade_requirements_on_installthistory_list_viewtrecheck_installed_requirestfssnap_automatic_pretfssnap_automatic_posttfssnap_automatic_keeptfssnap_percentagetfssnap_devicestfssnap_abort_on_errorstdepsolve_loop_limittautocheck_running_kerneltcheck_config_file_aget usr_w_checktshell_exit_statust _reposlistRt_pristine_cachedirR(((s./usr/lib/python2.7/site-packages/yum/config.pyRs$                                                                                                      tRepoConfcBseZdZeZdZeZee j Z ee j Z e Z eZeZeZe Ze ZeZeZee jZee jZee jZee jZee jZee jZee jZee jZee jZee j Z ee j!Z!ee j"Z"ee j#Z#ee j$Z$ee j%Z%ee j&Z&e'd ddddZ)ee j*Z*ee j+Z+ee j,Z,ee j-Z-ee j.Z.ee j/Z/ee j0Z0ee j1Z1e'dZ2ee j3Z3ee j4Z4ee j5Z5ee j6Z6ee j7Z7e8e9Z:e8e;Z<ee j=Z=ee j>Z>e'ddddd Z?RS( s4Option definitions for repository INI file sections.ccsf|j}t|ts$t}n|sI|jttj|nx|jD] }|VqSWdS(s7Yield the names of all defined options in the instance.N(t_RepoConf__cached_keysRRoRtupdateReRR(RtckR'((s./usr/lib/python2.7/site-packages/yum/config.pyRs  RjiRkidiiPiicN(@R-R.R/RRpRR R'R3RRRRYtbaseurlRBt mirrorlisttmetalinktmediaidtgpgkeytgpgcakeyR4Rt includepkgsRXRRRRRRRRRR"R*R+R,R)R-RgRR1R2R/R3R4R5R6R:R;tcostRORPRQRRRSR~Rtskip_if_unavailableR0tasyncRNRjtcompare_providers_priority(((s./usr/lib/python2.7/site-packages/yum/config.pyRosd             tVersionGroupConfcBs#eZdZeZeeZRS(s&Option definitions for version groups.(R-R.R/R4tpkglistR~Rtrun_with_packages(((s./usr/lib/python2.7/site-packages/yum/config.pyR~s cCsy|d}tj|}Wntk r6g}nXx|D]}tjj||r`q>ny=t||j}|r|ddkr|d }nWnttfk rq>nX|||WdS(Ns/etc/yum/vars/is (tostlistdirtOSErrortpathtislinktopentreadlinetIOError(tyumvarstroott dir_fsvarstfsvarstfsvarRn((s./usr/lib/python2.7/site-packages/yum/config.pyt _read_yumvars s    c Cs=|tj_t}||_t}t|}t}t||j||_||_ y|j |Wn&t k r}t j d|nX|j|dx3|jD](}|ddkst j dqqW||_|dkr t|j|j}n||_d|j|jf} t| |_|S(sParse Yum's main configuration file and return a :class:`StartupConf` instance. This is required in order to access configuration settings required as Yum starts up. :param configfile: the path to yum.conf :param root: the base path to use for installation (typically '/') :return: A :class:`StartupConf` instance :raises: :class:`Errors.ConfigError` if a problem is detected with while parsing. sParsing file failed: %stmainiRs(All plugin search paths must be absolutes %s/%s/uuidN(RRRRRRt _getEnvVarRt_varsRtreadfpRRRRRt_parserRt _getsysverRRRRtuuid( t configfileRRt startupconfRt confpp_objRR$Rtuuidfile((s./usr/lib/python2.7/site-packages/yum/config.pytreadStartupConfig2s2            csX|jjd|jjd|jjd|jjd|jt}|j|jd|j |_ fd}t j j |j krt|j nxd D]}|||qW|_d |_d |_d |_|j|_tjj|jr3tj|jd |_n d |_|j|_|j|_|S(sParse Yum's main configuration file :param startupconf: :class:`StartupConf` instance as returned by readStartupConfig() :return: Populated :class:`YumConf` instance RtarchRRRcsQt||}|j|}|jdd}t|}t|||dS(Ns//R(RRR9RR"(tyumconfRRtir_path(R(s./usr/lib/python2.7/site-packages/yum/config.pyt_apply_installroot{s  RRRii(scachedirslogfiles persistdirN(Rt setdefaultRRRRRRRRRnRRRRRRtcacheRt progess_objRRRtexistststatRRR(RRRR((Rs./usr/lib/python2.7/site-packages/yum/config.pytreadMainConfigcs0            s/etc/yum/version-groups.confcCst}t|}y|j|Wn&tk rN}tjd|nXi}x5|jD]'}t||<||j||qbW|S(sParse the configuration file for version groups. :param configfile: the configuration file to read :return: a dictionary containing the parsed options sParsing file failed: %s( RRRRRRtsectionsR~R(RRRR$tretR((s./usr/lib/python2.7/site-packages/yum/config.pytreadVersionGroupsConfigs   cCsAy|j||}Wnttfk r3|jSX|j|S(sConvenience function to retrieve a parsed and converted value from a :class:`ConfigParser`. :param conf: ConfigParser instance or similar :param section: Section name :param name: :class:`Option` name :param option: :class:`Option` instance to use for conversion :return: The parsed value or default if value was not present :raises: :class:`ValueError` if the option could not be parsed (RyRRRR(tconfRR'RRn((s./usr/lib/python2.7/site-packages/yum/config.pyt getOptions cCs\i}xOtddD]>}d|}tjj|d}|r|||jn|dk rz||krzq>n|j|}|j|}|||kr|t ||||j kr|||}n||kr|j |krq>n||||Wt |j d} | jt|| jdS(sWrite changes in a repo object back to a .repo file. :param repo: the Repo Object to write back out :param only: list of attributes to work on. If *only* is None, all options will be written out Ntw(RRRRRRRRR,RRRRERRR!tclose( RtonlyRRRR'R#Rtovaluetfp((s./usr/lib/python2.7/site-packages/yum/config.pytwriteRawRepoFiles(  cCsptt|}|}||jkrbx8|jjD]$} t| ||kr7| }q7q7Wn||} x|D]\} } | dkrqxn|dk r| |krqxn|| } | j| }| ||kr |t||| |kr ||| }n| | kr.| j| kr.qxn|||| s~              Z '-$6# 0"Q  1 >   3  (PK[b site-packages/yum/constants.pycnu[ v_c@sxdZdZdZdZdZdZdZdZdZd Z d Z eeeegZ eee gZ d Z d Zd ZdZdZdZdZd Zd Zd Zd Zd ZdZdZd Zd Zd Zidd6dd6dd6dd6dd6dd6Zidd6dd6dd6dd6dd6ZdZ d Z!d Z"d Z#dZ$d Z%d Z&dZ'ie(d6e(d6e(d 6e(d!6e)d"6e)d#6e)d$6e)d%6Z*id&d'6d(d)6d*d+6d,d-6d.d/6d0d16d2d36d4d56d6d76d8d96d:d;6d<d=6d>d?6d@dA6dBdC6Z+dDZ,dEZ-idFd 6dGd 6dHdD6dIdJ6dKd6dLdM6Z.d Z/d Z0d Z1dZ2dZ3idNdO6dPdQ6dRd6Z4dSS(Ts8 Yum constants. Usually dealing with rpm magic numbers. s/var/run/yum.pidi iii(i2i<iFiZidiiiiiiitGTt>tLTt=tLEs<=t10t1tyesttruetont0tnotfalsetofft size_packaget packagesizet size_archivet archivesizetsize_installedt installedsizet time_buildt buildtimetrpm_header_startthdrstarttrpm_header_endthdrendt location_basetbasepatht location_hreft relativepatht time_filetfiletimet rpm_packagertpackagert rpm_grouptgroupt rpm_buildhostt buildhostt rpm_sourcerpmt sourcerpmt rpm_vendortvendort rpm_licensetlicenseiitmd5tsha1tsha256tsha384i tsha512tsha224i sTo address this issue please refer to the below wiki article https://wiki.centos.org/yum-errors If above article doesn't help to resolve this issue please use https://bugs.centos.org/. isTo address this issue please refer to the below wiki article https://wiki.centos.org/yum-errors If above article doesn't help to resolve this issue please use https://bugs.centos.org/. isIt was impossible to connect to the CentOS servers. This could mean a connectivity issue in your environment, such as the requirement to configure a proxy, or a transparent proxy that tampers with TLS security, or an incorrect system clock. You can try to solve this issue by using the instructions on https://wiki.centos.org/yum-errors If above article doesn't help to resolve this issue please use https://bugs.centos.org/. N(5t__doc__t YUM_PID_FILEt TS_UPDATEt TS_INSTALLtTS_TRUEINSTALLtTS_ERASEt TS_OBSOLETEDt TS_OBSOLETINGt TS_AVAILABLEt TS_UPDATEDt TS_FAILEDtTS_INSTALL_STATEStTS_REMOVE_STATESt TR_UPDATESt TR_UPDATEDBYt TR_OBSOLETEStTR_OBSOLETEDBYt TR_DEPENDSt TR_DEPENDSONtTX_WHITEtTX_GREYtTX_BLACKtPO_FILEtPO_DIRtPO_GHOSTt PO_CONFIGtPO_DOCt PO_REMOTEPKGt PO_LOCALPKGtPO_INSTALLEDPKGt SYMBOLFLAGSt LETTERFLAGStPLUG_OPT_STRINGt PLUG_OPT_INTtPLUG_OPT_FLOATt PLUG_OPT_BOOLtPLUG_OPT_WHERE_MAINtPLUG_OPT_WHERE_REPOtPLUG_OPT_WHERE_ALLt DBVERSIONtTruetFalsetBOOLEAN_STATESt RPM_TO_SQLITEt PATTERNS_MAXtPATTERNS_INDEXED_MAXtRPM_CHECKSUM_TYPEStREPO_PROBLEM_REPOMDtREPO_PROBLEM_METADATAtREPO_PROBLEM_COMPStREPO_PROBLEM_OTHERtREPO_PROBLEM_PACKAGEtERRORS_TO_KBASE_ARTICLES(((s1/usr/lib/python2.7/site-packages/yum/constants.pyts0)  & PK[$%% site-packages/yum/packageSack.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2006 Duke University """ Classes for manipulating and querying groups of packages. """ from Errors import PackageSackError import warnings import re import fnmatch import misc from packages import parsePackages import rpmUtils.miscutils from rpmUtils.miscutils import compareEVR class PackageSackVersion: def __init__(self): self._num = 0 self._chksum = misc.Checksums(['sha1']) def __str__(self): return "%u:%s" % (self._num, self._chksum.hexdigest()) def __eq__(self, other): if other is None: return False if type(other) in (type(''), type(u'')): return str(self) == other if self._num != other._num: return False if self._chksum.digest() != other._chksum.digest(): return False return True def __ne__(self, other): return not (self == other) def update(self, pkg, csum): self._num += 1 self._chksum.update(str(pkg)) if csum is not None: self._chksum.update(csum[0]) self._chksum.update(csum[1]) class PackageSackBase(object): """Base class that provides the interface for PackageSacks.""" def __init__(self): self.added = {} def __len__(self): return len(self.returnPackages()) def __iter__(self): ret = self.returnPackages() if hasattr(ret, '__iter__'): return ret.__iter__() else: return iter(ret) def __cmp__(self, other): if other is None: return 1 s_repos = list(self.added) o_repos = list(other.added) if len(s_repos) != len(o_repos): return len(s_repos) - len(o_repos) for (s_repo, o_repo) in zip(sorted(s_repos), sorted(o_repos)): ret = cmp(s_repo, o_repo) if ret: return ret return 0 def setCompatArchs(self, compatArchs): raise NotImplementedError() def populate(self, repo, mdtype, callback, cacheOnly): raise NotImplementedError() def packagesByTuple(self, pkgtup): """return a list of package objects by (n,a,e,v,r) tuple""" warnings.warn('packagesByTuple() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) return self.searchPkgTuple(pkgtup) def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None): """return list of pkgobjects matching the nevra requested""" raise NotImplementedError() def searchNames(self, names=[], return_pkgtups=False): raise NotImplementedError() def searchPO(self, po): """return list of package objects matching the name, epoch, ver, rel, arch of the package object passed in""" return self.searchNevra(name=po.name, epoch=po.epoch, ver=po.ver, rel=po.rel, arch=po.arch) def searchPkgTuple(self, pkgtup): """return list of pkgobject matching the (n,a,e,v,r) tuple""" (n,a,e,v,r) = pkgtup return self.searchNevra(name=n, arch=a, epoch=e, ver=v, rel=r) def contains(self, name=None, arch=None, epoch=None, ver=None, rel=None, po=None): """return if there are any packages in the sack that match the given NAEVR or the NAEVR of the given po""" if po: name = po.name arch = po.arch epoch = po.epoch ver = po.version rel = po.release return bool(self.searchNevra(name=name, arch=arch, epoch=epoch, ver=ver, rel=rel)) def getProvides(self, name, flags=None, version=(None, None, None)): """return dict { packages -> list of matching provides }""" raise NotImplementedError() def getRequires(self, name, flags=None, version=(None, None, None)): """return dict { packages -> list of matching requires }""" raise NotImplementedError() def searchRequires(self, name): """return list of package requiring the name (any evr and flag)""" raise NotImplementedError() def searchProvides(self, name): """return list of package providing the name (any evr and flag)""" raise NotImplementedError() def searchConflicts(self, name): """return list of package conflicting with the name (any evr and flag)""" raise NotImplementedError() def searchObsoletes(self, name): """return list of package obsoleting the name (any evr and flag)""" raise NotImplementedError() def returnObsoletes(self, newest=False): """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]""" raise NotImplementedError() def have_fastReturnFileEntries(self): """ Is calling pkg.returnFileEntries(primary_only=True) faster than using searchFiles(). """ raise NotImplementedError() def searchFiles(self, name): """return list of packages by filename""" raise NotImplementedError() def addPackage(self, obj): """add a pkgobject to the packageSack""" raise NotImplementedError() def buildIndexes(self): """builds the useful indexes for searching/querying the packageSack This should be called after all the necessary packages have been added/deleted""" raise NotImplementedError() def delPackage(self, obj): """delete a pkgobject""" raise NotImplementedError() def returnPackages(self, repoid=None, patterns=None, ignore_case=False): """return list of all packages""" raise NotImplementedError() def addPackageExcluder(self, repoid, excluderid, excluder, *args): """ Add an "excluder" for all packages in the repo/sack. Can basically do anything based on nevra, changes lots of exclude decisions from "preload package; test; delPackage" into "load excluder". Excluderid is used so the caller doesn't have to track "have I loaded the excluder for this repo.", it's probably only useful when repoid is None ... if it turns out utterly worthless then it's still not a huge wart. """ raise NotImplementedError() def simpleVersion(self, main_only=False, groups={}): """ Return a simple version for all available packages. """ def _up_revs(arepos, repoid, rev, pkg, csum): arevs = arepos.setdefault(repoid, {}) rpsv = arevs.setdefault(None, PackageSackVersion()) rpsv.update(pkg, csum) if rev is not None: rpsv = arevs.setdefault(rev, PackageSackVersion()) rpsv.update(pkg, csum) main = PackageSackVersion() arepos = {} main_grps = {} arepos_grps = {} for pkg in sorted(self.returnPackages()): csum = pkg.returnIdSum() main.update(pkg, csum) for group in groups: if pkg.name in groups[group]: if group not in main_grps: main_grps[group] = PackageSackVersion() arepos_grps[group] = {} main_grps[group].update(pkg, csum) if main_only: continue rev = pkg.repo.repoXML.revision _up_revs(arepos, pkg.repoid, rev, pkg, csum) for group in groups: if pkg.name in groups[group]: _up_revs(arepos_grps[group], pkg.repoid, rev, pkg, csum) if groups: return [main, arepos, main_grps, arepos_grps] return [main, arepos] def returnNewestByNameArch(self, naTup=None, patterns=None, ignore_case=False): """return list of newest packages based on name, arch matching this means(in name.arch form): foo.i386 and foo.noarch are not compared to each other for highest version only foo.i386 and foo.i386 will be compared Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 The last _two_ pkgs will be returned, not just one of them. """ raise NotImplementedError() def returnNewestByName(self, name=None, patterns=None, ignore_case=False): """return list of newest packages based on name matching this means(in name.arch form): foo.i386 and foo.noarch will be compared to each other for highest version.""" raise NotImplementedError() def simplePkgList(self, patterns=None, ignore_case=False): """returns a list of pkg tuples (n, a, e, v, r)""" raise NotImplementedError() def printPackages(self): raise NotImplementedError() def excludeArchs(self, archlist): """exclude incompatible arches. archlist is a list of compatible arches""" raise NotImplementedError() def searchPackages(self, fields, criteria_re, callback): raise NotImplementedError() def searchAll(self, arg, query_type): raise NotImplementedError() def matchPackageNames(self, pkgspecs): """take a list strings and match the packages in the sack against it this will match against: name name.arch name-ver-rel.arch name-ver name-ver-rel epoch:name-ver-rel.arch name-epoch:ver-rel.arch return [exact matches], [glob matches], [unmatch search terms] """ # Setup match() for the search we're doing matched = [] exactmatch = [] unmatched = set(pkgspecs) specs = {} for p in pkgspecs: specs[p] = misc.compile_pattern(p) # We don't use simplePkgList() here because that loads all of the # rpmdb, if we are Eg. doing a "remove PackageKit". pkgs = self.returnPackages(patterns=unmatched) for pkgtup in [pkg.pkgtup for pkg in pkgs]: (n,a,e,v,r) = pkgtup names = set(( n, '%s.%s' % (n, a), '%s-%s-%s.%s' % (n, v, r, a), '%s-%s' % (n, v), '%s-%s-%s' % (n, v, r), '%s:%s-%s-%s.%s' % (e, n, v, r, a), '%s-%s:%s-%s.%s' % (n, e, v, r, a), )) for (term,query) in specs.items(): if term in names: exactmatch.append(self.searchPkgTuple(pkgtup)[0]) unmatched.discard(term) else: for n in names: if query(n): matched.append(self.searchPkgTuple(pkgtup)[0]) unmatched.discard(term) return misc.unique(exactmatch), misc.unique(matched), list(unmatched) def returnLeafNodes(self, repoid=None): """returns a list of package objects that are not required by any other package in this repository""" def _return_all_provides(po): """ Return all the provides, via. yield. """ # These are done one by one, so that we get lazy loading for prov in po.provides_names: yield prov for prov in po.filelist: yield prov for prov in po.dirlist: yield prov for prov in po.ghostlist: yield prov # fixme - maybe cache this list? req = {} orphans = [] # prebuild the req dict for po in self.returnPackages(repoid=repoid): if not po.requires_names: continue for r in po.requires_names: if r not in req: req[r] = set() if len(req[r]) > 1: # We only need to know if another pkg. continue # reqs. the provide. So 2 pkgs. is enough. req[r].add(po.name) for po in self.returnPackages(repoid=repoid): preq = 0 for p in _return_all_provides(po): if p in req: # If this pkg provides something that is required by # anything but itself (or another version of itself) it # isn't an orphan. if len(req[p]) > 1 or po.name not in req[p]: preq += 1 break if preq == 0: orphans.append(po) return orphans class MetaSack(PackageSackBase): """Represents the aggregate of multiple package sacks, such that they can all be treated as one unified sack.""" def __init__(self): PackageSackBase.__init__(self) self.sacks = {} self.compatarchs = None def __len__(self): ret = 0 for sack in sorted(self.sacks.values()): ret += len(sack) return ret def dropCachedData(self): for sack in self.sacks.values(): if hasattr(sack, 'dropCachedData'): sack.dropCachedData() def addSack(self, repoid, sack): """Adds a repository's packageSack to this MetaSack.""" self.sacks[repoid] = sack # Make sure the new sack follows the same rules we have been given. sack.setCompatArchs(self.compatarchs) def populate(self, repo, mdtype, callback, cacheOnly): self.sacks[repo.id].populate(repo, mdtype, callback, cacheOnly) def setCompatArchs(self, compatArchs): for sack in self.sacks.values(): sack.setCompatArchs(compatArchs) def packagesByTuple(self, pkgtup): """return a list of package objects by (n,a,e,v,r) tuple""" warnings.warn('packagesByTuple() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) return self._computeAggregateListResult("packagesByTuple", pkgtup) def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None): """return list of pkgobjects matching the nevra requested""" return self._computeAggregateListResult("searchNevra", name, epoch, ver, rel, arch) def searchNames(self, names=[], return_pkgtups=False): return self._computeAggregateListResult("searchNames", names, return_pkgtups) def getProvides(self, name, flags=None, version=(None, None, None)): """return dict { packages -> list of matching provides }""" return self._computeAggregateDictResult("getProvides", name, flags, version) def getRequires(self, name, flags=None, version=(None, None, None)): """return dict { packages -> list of matching requires }""" return self._computeAggregateDictResult("getRequires", name, flags, version) def searchRequires(self, name): """return list of package requiring the name (any evr and flag)""" return self._computeAggregateListResult("searchRequires", name) def searchProvides(self, name): """return list of package providing the name (any evr and flag)""" return self._computeAggregateListResult("searchProvides", name) def searchConflicts(self, name): """return list of package conflicting with the name (any evr and flag)""" return self._computeAggregateListResult("searchConflicts", name) def searchObsoletes(self, name): """return list of package obsoleting the name (any evr and flag)""" return self._computeAggregateListResult("searchObsoletes", name) def returnObsoletes(self, newest=False): """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]""" if not newest: return self._computeAggregateDictResult("returnObsoletes") obsdict = self._computeAggregateDictResult("returnObsoletes") names = set((obstup[0] for obstup in obsdict)) nobsdict = {} last_name = '' last_pkg = None last_pkgtup = None # It takes about 0.2 of a second to convert these into packages, just # so we can sort them, which is ~40% of this functions time. So we sort # the pkgtups "by hand". def _pkgtup_nevr_cmp(x, y): """ Compare two pkgtup's (ignore arch): n, a, e, v, r. """ ret = cmp(x[0], y[0]) if ret: return ret # This is negated so we get higher versions first, in the list. return -compareEVR((x[2], x[3], x[4]), (y[2], y[3], y[4])) def _pkgtup_nevr_eq(x, y): return _pkgtup_nevr_cmp(x, y) == 0 for pkgtup in sorted(self.searchNames(names, return_pkgtups=True), cmp=_pkgtup_nevr_cmp): name = pkgtup[0] if last_name == name and not _pkgtup_nevr_eq(last_pkgtup, pkgtup): continue last_name = name last_pkgtup = pkgtup if pkgtup in obsdict: nobsdict[pkgtup] = obsdict[pkgtup] return nobsdict def searchFiles(self, name): """return list of packages by filename""" return self._computeAggregateListResult("searchFiles", name) def addPackage(self, obj): """Add a pkgobject to the packageSack. This is a meaningless operation for the MetaSack.""" pass def buildIndexes(self): """builds the useful indexes for searching/querying the packageSack This should be called after all the necessary packages have been added/deleted""" for sack in self.sacks.values(): sack.buildIndexes() def delPackage(self, obj): """Delete a pkgobject if it exists in every sub-sack.""" obj.repo.sack.delPackage(obj) def returnPackages(self, repoid=None, patterns=None, ignore_case=False): """Returns a list of packages. Note that the packages are always filtered to those matching the patterns/case. An optional repoid allows you to easily get data for a specific repo. """ if not repoid: return self._computeAggregateListResult("returnPackages", None, patterns, ignore_case) return self.sacks[repoid].returnPackages(patterns=patterns, ignore_case=ignore_case) def addPackageExcluder(self, repoid, excluderid, excluder, *args): """ Add an "excluder" for all packages in the repo/sack. Can basically do anything based on nevra, changes lots of exclude decisions from "preload package; test; delPackage" into "load excluder". Excluderid is used so the caller doesn't have to track "have I loaded the excluder for this repo.", it's probably only useful when repoid is None ... if it turns out utterly worthless then it's still not a huge wart. """ if not repoid: calr = self._computeAggregateListResult return calr("addPackageExcluder", None, excluderid, excluder, *args) return self.sacks[repoid].addPackageExcluder(None, excluderid,excluder, *args) def returnNewestByNameArch(self, naTup=None, patterns=None, ignore_case=False): """return list of newest packages based on name, arch matching this means(in name.arch form): foo.i386 and foo.noarch are not compared to each other for highest version only foo.i386 and foo.i386 will be compared. Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 The last _two_ pkgs will be returned, not just one of them. """ calr = self._computeAggregateListResult pkgs = calr("returnNewestByNameArch", naTup, patterns, ignore_case) pkgs = packagesNewestByNameArch(pkgs) if not pkgs and (naTup or patterns): ui_pats = ", ".join(patterns or []) raise PackageSackError, 'No Package Matching %s' % ui_pats return pkgs def returnNewestByName(self, name=None, patterns=None, ignore_case=False): """return list of newest packages based on name matching this means(in name.arch form): foo.i386 and foo.noarch will be compared to each other for highest version.""" pkgs = self._computeAggregateListResult("returnNewestByName", name, patterns, ignore_case) pkgs = packagesNewestByName(pkgs) if not pkgs and (name or patterns): if name: ui_pats = name else: ui_pats = ", ".join(patterns or []) raise PackageSackError, 'No Package Matching %s' % ui_pats return pkgs def simplePkgList(self, patterns=None, ignore_case=False): """returns a list of pkg tuples (n, a, e, v, r)""" return self._computeAggregateListResult("simplePkgList", patterns, ignore_case) def printPackages(self): for sack in self.sacks.values(): sack.printPackages() def excludeArchs(self, archlist): """exclude incompatible arches. archlist is a list of compatible arches""" for sack in self.sacks.values(): sack.excludeArchs(archlist) def searchPackages(self, fields, criteria_re, callback): return self._computeAggregateDictResult("searchPackages", fields, criteria_re, callback) def searchAll(self, arg, query_type): return self._computeAggregateListResult("searchAll", arg, query_type) def matchPackageNames(self, pkgspecs): matched = [] exactmatch = [] unmatched = None for sack in self.sacks.values(): if hasattr(sack, "matchPackageNames"): e, m, u = [], [], [] try: e, m, u = sack.matchPackageNames(pkgspecs) except PackageSackError: continue exactmatch.extend(e) matched.extend(m) if unmatched is None: unmatched = set(u) else: unmatched = unmatched.intersection(set(u)) matched = misc.unique(matched) exactmatch = misc.unique(exactmatch) if unmatched is None: unmatched = [] else: unmatched = list(unmatched) return exactmatch, matched, unmatched def _computeAggregateListResult(self, methodName, *args): result = [] for sack in sorted(self.sacks.values()): if hasattr(sack, methodName): method = getattr(sack, methodName) try: sackResult = apply(method, args) except PackageSackError: continue if sackResult: result.extend(sackResult) return result def _computeAggregateDictResult(self, methodName, *args): result = {} for sack in sorted(self.sacks.values()): if hasattr(sack, methodName): method = getattr(sack, methodName) try: sackResult = apply(method, args) except PackageSackError: continue if sackResult: result.update(sackResult) return result class PackageSack(PackageSackBase): """represents sets (sacks) of Package Objects""" def __init__(self): PackageSackBase.__init__(self) self.nevra = {} #nevra[(Name, Epoch, Version, Release, Arch)] = [] self.obsoletes = {} #obs[obsoletename] = [pkg1, pkg2, pkg3] #the package lists are packages that obsolete the key name self.requires = {} #req[reqname] = [pkg1, pkg2, pkg3] #the package lists are packages that require the key name self.provides = {} #ditto of above but for provides self.conflicts = {} #ditto of above but for conflicts self.filenames = {} # duh self.pkgsByRepo = {} #pkgsByRepo['repoid']= [pkg1, pkg2, pkg3] self.pkgsByID = {} #pkgsById[pkgid] = [pkg1, pkg2] (should really only ever be one value but #you might have repos with the same package in them self.compatarchs = None # dict of compatible archs for addPackage self.indexesBuilt = 0 def __len__(self): ret = 0 for repo in self.pkgsByRepo: ret += len(self.pkgsByRepo[repo]) return ret def _checkIndexes(self, failure='error'): """check to see if the indexes are built, if not do what failure demands either error out or build the indexes, default is to error out""" if not self.indexesBuilt: if failure == 'error': raise PackageSackError, 'Indexes not yet built, cannot search' elif failure == 'build': self.buildIndexes() def dropCachedData(self): """ Do nothing, mainly for the testing code. """ self.clearIndexes() def setCompatArchs(self, compatarchs): self.compatarchs = compatarchs def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None): """return list of pkgobjects matching the nevra requested""" self._checkIndexes(failure='build') if (name, epoch, ver, rel, arch) in self.nevra: return self.nevra[(name, epoch, ver, rel, arch)] elif name is not None: pkgs = self.nevra.get((name, None, None, None, None), []) else: pkgs = [] for pkgsbyRepo in self.pkgsByRepo.itervalues(): pkgs.extend(pkgsbyRepo) result = [ ] for po in pkgs: if ((name and name!=po.name) or (epoch and epoch!=po.epoch) or (ver and ver!=po.ver) or (rel and rel!=po.rel) or (arch and arch!=po.arch)): continue result.append(po) return result def searchNames(self, names=[], return_pkgtups=False): """return list of pkgobjects matching the names requested""" self._checkIndexes(failure='build') result = [] done = set() for name in names: if name in done: continue done.add(name) result.extend(self.nevra.get((name, None, None, None, None), [])) if return_pkgtups: return [pkg.pkgtup for pkg in result] return result def getProvides(self, name, flags=None, version=(None, None, None)): """return dict { packages -> list of matching provides }""" self._checkIndexes(failure='build') if version is None: version = (None, None, None) elif type(version) in (str, type(None), unicode): version = rpmUtils.miscutils.stringToVersion(version) result = { } for po in self.provides.get(name, []): hits = po.matchingPrcos('provides', (name, flags, version)) if hits: result[po] = hits if name[0] == '/': hit = (name, None, (None, None, None)) for po in self.searchFiles(name): result.setdefault(po, []).append(hit) return result def getRequires(self, name, flags=None, version=(None, None, None)): """return dict { packages -> list of matching requires }""" self._checkIndexes(failure='build') if version is None: version = (None, None, None) elif type(version) in (str, type(None), unicode): version = rpmUtils.miscutils.stringToVersion(version) result = { } for po in self.requires.get(name, []): hits = po.matchingPrcos('requires', (name, flags, version)) if hits: result[po] = hits return result def searchPrco(self, name, prcotype): self._checkIndexes(failure='build') prcodict = getattr(self, prcotype) (n,f,(e,v,r)) = misc.string_to_prco_tuple(name) basic_results = [] results = [] if n in prcodict: basic_results.extend(prcodict[n]) for po in basic_results: if po.checkPrco(prcotype, (n, f, (e,v,r))): results.append(po) if prcotype != "provides": return results if not misc.re_filename(n): return results results.extend(self.searchFiles(n)) return misc.unique(results) def searchRequires(self, name): """return list of package requiring the item requested""" return self.searchPrco(name, 'requires') def searchProvides(self, name): """return list of package providing the item requested""" return self.searchPrco(name, 'provides') def searchConflicts(self, name): """return list of package conflicting with item requested""" return self.searchPrco(name, 'conflicts') def searchObsoletes(self, name): """return list of package obsoleting the item requested""" return self.searchPrco(name, 'obsoletes') def returnObsoletes(self, newest=False): """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]""" obs = {} for po in self.returnPackages(): if len(po.obsoletes) == 0: continue obs.setdefault(po.pkgtup, []).extend(po.obsoletes) if not newest: return obs # FIXME - this is slooooooooooooooooooooooooooooooow # get the dict back newest_tups = set((pkg.pkgtup for pkg in self.returnNewestByName())) # go through each of the keys of the obs dict and see if it is in the # sack of newest pkgs - if it is not - remove the entry togo = [] for obstup in obs: if obstup not in newest_tups: togo.append(obstup) for obstup in togo: del obs[obstup] return obs def have_fastReturnFileEntries(self): """ Is calling pkg.returnFileEntries(primary_only=True) faster than using searchFiles(). """ return True def searchFiles(self, name): """ Return list of packages by filename. """ self._checkIndexes(failure='build') if name in self.filenames: return self.filenames[name] else: return [] def _addToDictAsList(self, dict, key, data): if key not in dict: dict[key] = [] #if data not in dict[key]: - if I enable this the whole world grinds to a halt # need a faster way of looking for the object in any particular list dict[key].append(data) def _delFromListOfDict(self, dict, key, data): if key not in dict: return try: dict[key].remove(data) except ValueError: pass if len(dict[key]) == 0: # if it's an empty list of the dict, then kill it del dict[key] def addPackage(self, obj): """add a pkgobject to the packageSack""" repoid = obj.repoid (name, arch, epoch, ver, rel) = obj.pkgtup if not self.compatarchs or arch in self.compatarchs: self._addToDictAsList(self.pkgsByRepo, repoid, obj) if self.indexesBuilt: self._addPackageToIndex(obj) def buildIndexes(self): """builds the useful indexes for searching/querying the packageSack This should be called after all the necessary packages have been added/deleted""" self.clearIndexes() for repoid in self.pkgsByRepo: for obj in self.pkgsByRepo[repoid]: self._addPackageToIndex(obj) self.indexesBuilt = 1 def clearIndexes(self): # blank out the indexes self.obsoletes = {} self.requires = {} self.provides = {} self.conflicts = {} self.filenames = {} self.nevra = {} self.pkgsByID = {} self.indexesBuilt = 0 def _addPackageToIndex(self, obj): # store the things provided just on name, not the whole require+version # this lets us reduce the set of pkgs to search when we're trying to depSolve for (n, fl, (e,v,r)) in obj.returnPrco('obsoletes'): self._addToDictAsList(self.obsoletes, n, obj) for (n, fl, (e,v,r)) in obj.returnPrco('requires'): self._addToDictAsList(self.requires, n, obj) for (n, fl, (e,v,r)) in obj.returnPrco('provides'): self._addToDictAsList(self.provides, n, obj) for (n, fl, (e,v,r)) in obj.returnPrco('conflicts'): self._addToDictAsList(self.conflicts, n, obj) for ftype in obj.returnFileTypes(): for file in obj.returnFileEntries(ftype): self._addToDictAsList(self.filenames, file, obj) self._addToDictAsList(self.pkgsByID, obj.id, obj) (name, arch, epoch, ver, rel) = obj.pkgtup self._addToDictAsList(self.nevra, (name, epoch, ver, rel, arch), obj) self._addToDictAsList(self.nevra, (name, None, None, None, None), obj) def _delPackageFromIndex(self, obj): for (n, fl, (e,v,r)) in obj.returnPrco('obsoletes'): self._delFromListOfDict(self.obsoletes, n, obj) for (n, fl, (e,v,r)) in obj.returnPrco('requires'): self._delFromListOfDict(self.requires, n, obj) for (n, fl, (e,v,r)) in obj.returnPrco('provides'): self._delFromListOfDict(self.provides, n, obj) for (n, fl, (e,v,r)) in obj.returnPrco('conflicts'): self._delFromListOfDict(self.conflicts, n, obj) for ftype in obj.returnFileTypes(): for file in obj.returnFileEntries(ftype): self._delFromListOfDict(self.filenames, file, obj) self._delFromListOfDict(self.pkgsByID, obj.id, obj) (name, arch, epoch, ver, rel) = obj.pkgtup self._delFromListOfDict(self.nevra, (name, epoch, ver, rel, arch), obj) self._delFromListOfDict(self.nevra, (name, None, None, None, None), obj) def delPackage(self, obj): """delete a pkgobject""" self._delFromListOfDict(self.pkgsByRepo, obj.repoid, obj) if self.indexesBuilt: self._delPackageFromIndex(obj) def returnPackages(self, repoid=None, patterns=None, ignore_case=False): """return list of all packages, takes optional repoid""" returnList = [] if repoid is None: for repo in self.pkgsByRepo: returnList.extend(self.pkgsByRepo[repo]) else: try: returnList = self.pkgsByRepo[repoid] except KeyError: # nothing to return pass if patterns: returnList = parsePackages(returnList, patterns, not ignore_case, unique='repo-pkgkey') returnList = returnList[0] + returnList[1] return returnList def returnNewestByNameArch(self, naTup=None, patterns=None, ignore_case=False): """return list of newest packages based on name, arch matching this means(in name.arch form): foo.i386 and foo.noarch are not compared to each other for highest version only foo.i386 and foo.i386 will be compared Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64 The last _two_ pkgs will be returned, not just one of them. """ highdict = {} # If naTup is set, only iterate through packages that match that # name if (naTup): self._checkIndexes(failure='build') where = self.nevra.get((naTup[0],None,None,None,None)) if (not where): raise PackageSackError, 'No Package Matching %s.%s' % naTup else: where = self.returnPackages(patterns=patterns, ignore_case=ignore_case) for pkg in where: if (pkg.name, pkg.arch) not in highdict: highdict[(pkg.name, pkg.arch)] = pkg else: pkg2 = highdict[(pkg.name, pkg.arch)] if pkg.verGT(pkg2): highdict[(pkg.name, pkg.arch)] = pkg if naTup: if naTup in highdict: return [highdict[naTup]] else: raise PackageSackError, 'No Package Matching %s.%s' % naTup return highdict.values() def returnNewestByName(self, name=None, patterns=None, ignore_case=False): """return list of newest packages based on name matching this means(in name.arch form): foo.i386 and foo.noarch will be compared to each other for highest version.""" highdict = {} if patterns is None and name is not None: pkgs = self.searchNevra(name=name) else: pkgs = self.returnPackages(patterns=patterns, ignore_case=ignore_case) for pkg in pkgs: if pkg.name not in highdict: highdict[pkg.name] = [pkg] else: pkg2 = highdict[pkg.name][0] if pkg.verGT(pkg2): highdict[pkg.name] = [pkg] if pkg.verEQ(pkg2): highdict[pkg.name].append(pkg) if name: if name in highdict: return highdict[name] else: raise PackageSackError, 'No Package Matching %s' % name #this is a list of lists - break it back out into a single list returnlist = [] for polst in highdict.values(): for po in polst: returnlist.append(po) return returnlist def simplePkgList(self, patterns=None, ignore_case=False): """returns a list of pkg tuples (n, a, e, v, r) optionally from a single repoid""" # Don't cache due to excludes return [pkg.pkgtup for pkg in self.returnPackages(patterns=patterns, ignore_case=False)] def printPackages(self): for pkg in self.returnPackages(): print pkg def excludeArchs(self, archlist): """exclude incompatible arches. archlist is a list of compatible arches""" for pkg in self.returnPackages(): if pkg.arch not in archlist: self.delPackage(pkg) def searchPackages(self, fields, criteria_re, callback): matches = {} for po in self.returnPackages(): tmpvalues = [] for field in fields: value = getattr(po, field) if value and criteria_re.search(value): tmpvalues.append(value) if len(tmpvalues) > 0: if callback: callback(po, tmpvalues) matches[po] = tmpvalues return matches def packagesNewestByName(pkgs): """ Does the same as PackageSack.returnNewestByName(). Note that given: foo-1.i386; foo-2.i386 and foo-3.x86_64""" newest = {} for pkg in pkgs: key = pkg.name # Can't use pkg.__cmp__ because it takes .arch into account cval = 1 if key in newest: cval = pkg.verCMP(newest[key][0]) if cval > 0: newest[key] = [pkg] elif cval == 0: newest[key].append(pkg) ret = [] for vals in newest.itervalues(): ret.extend(vals) return ret def packagesNewestByNameArch(pkgs): """ Does the same as PackageSack.returnNewestByNameArch() The last _two_ pkgs will be returned, not just one of them.""" newest = {} for pkg in pkgs: key = (pkg.name, pkg.arch) if key in newest and pkg.verLE(newest[key]): continue newest[key] = pkg return newest.values() class ListPackageSack(PackageSack): """Derived class from PackageSack to build new Sack from list of pkgObjects - like one returned from self.returnNewestByNameArch() or self.returnNewestByName()""" def __init__(self, Objlist=None): PackageSack.__init__(self) if Objlist is not None: self.addList(Objlist) def addList(self, ObjList): for pkgobj in ObjList: self.addPackage(pkgobj) PK[psite-packages/yum/sqlutils.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of version 2 of the GNU General Public License # as published by the Free Software Foundation # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University """ utility functions to handle differences in pysqlite versions These are from Wichert Akkerman 's python-dhm http://www.wiggy.net/code/python-dhm """ try: import sqlite3 as sqlite except ImportError: import sqlite class TokenizeError(Exception): """Tokenizer error class""" pass def Tokenize(str, whitespace=" \t\r\n", quotes="\"", escapes="\\"): """String tokenizer This function tokenizes a string while taking quotation and escaping into account. >>> import dhm.strtools >>> dhm.strtools.Tokenize("this is a test") ['this', 'is', 'a', 'test'] >>> dhm.strtools.Tokenize("this \"is a\" test") ['this', 'is a', 'test'] >>> dhm.strtools.Tokenize("this \\\"is\\\" a test") ['this', '"is"', 'a', 'test'] >>> dhm.strtools.Tokenize("this \"is a test") Traceback (most recent call last): File "", line 1, in ? File "/usr/local/lib/python2.2/site-packages/dhm/strtools.py", line 80, in Tokenize raise TokenizeError, "Unexpected end of string in quoted text" dhm.strtools.TokenizeError: Unexecpted end of string in quoted text @param str: string to tokenize @type str: string @param whitespace: whitespace characters separating tokens @type whitespace: string @param quotes: legal quoting characters @type quotes: string @param escapes: characters which can escape quoting characters @type escapes: string @return: list of tokens @rtype: sequence of strings """ (buffer, tokens, curtoken, quote)=(str, [], None, None) try: while buffer: if buffer[0]==quote: quote=None elif (quote==None) and (buffer[0] in quotes): quote=buffer[0] elif buffer[0] in whitespace: if quote!=None: curtoken+=buffer[0] else: tokens.append(curtoken) curtoken=None while buffer[1] in whitespace: buffer=buffer[1:] elif buffer[0] in escapes: if curtoken==None: curtoken=buffer[1] else: curtoken+=buffer[1] buffer=buffer[1:] else: if curtoken==None: curtoken=buffer[0] else: curtoken+=buffer[0] buffer=buffer[1:] except IndexError: raise TokenizeError, "Unexpected end of string" if quote: raise TokenizeError, "Unexpected end of string in quoted text" if curtoken!=None: tokens.append(curtoken) return tokens def QmarkToPyformat(query, params): """Convert from qmark to pyformat parameter style. The python DB-API 2.0 specifies four different possible parameter styles that can be used by drivers. This function converts from the qmark style to pyformat style. @param query: SQL query to transform @type query: string @param params: arguments to query @type params: sequence of strings @return: converted query and parameters @rtype: tuple with the new command and a dictionary of arguments """ tokens=Tokenize(query, quotes="'") output=[] count=1 for token in tokens: if token.endswith("?"): output.append(token[:-1] + "%%(param%d)s" % count) count+=1 elif token.endswith("?,") or token.endswith("?)"): ntoken = token[:-2] + "%%(param%d)s" % count ntoken += token[-1] output.append(ntoken) count+=1 else: output.append(token) dict={} count=1 for param in params: dict["param%d" % count]=param count+=1 return (" ".join(output), dict) def executeSQLPyFormat(cursor, query, params=None): """ Execute a python < 2.5 (external sqlite module) style query. @param cursor: A sqlite cursor @param query: The query to execute @param params: An optional list of parameters to the query """ if params is None: return cursor.execute(query) # Leading whitespace confuses QmarkToPyformat() query = query.strip() (q, p) = QmarkToPyformat(query, params) return cursor.execute(q, p) def executeSQLQmark(cursor, query, params=None): """ Execute a python 2.5 (sqlite3) style query. @param cursor: A sqlite cursor @param query: The query to execute @param params: An optional list of parameters to the query """ if params is None: return cursor.execute(query) return cursor.execute(query, params) if sqlite.version_info[0] > 1: executeSQL = executeSQLQmark else: executeSQL = executeSQLPyFormat def sql_esc(pattern): """ Apply SQLite escaping, if needed. Returns pattern and esc. """ esc = '' if "_" in pattern or "%" in pattern: esc = ' ESCAPE "!"' pattern = pattern.replace("!", "!!") pattern = pattern.replace("%", "!%") pattern = pattern.replace("_", "!_") return (pattern, esc) def sql_esc_glob(patterns): """ Converts patterns to SQL LIKE format, if required (or gives up if not possible). """ ret = [] for pattern in patterns: if '[' in pattern: # LIKE only has % and _, so [abc] can't be done. return [] # So Load everything # Convert to SQL LIKE format (pattern, esc) = sql_esc(pattern) pattern = pattern.replace("*", "%") pattern = pattern.replace("?", "_") ret.append((pattern, esc)) return ret PK[34o-Z-Zsite-packages/yum/rpmtrans.pycnu[ v_c@sddlZddlZddlZddlZddlZddlZddlZddlTddlm Z ddl m Z ddl Z ddl Z dddYZdddYZd efd YZd dd YZd ddYZdS(iN(t*(t_(tTransactionMembertNoOutputCallBackcBs5eZdZdZdZdZdZRS(cCsdS(N((tself((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt__init__!scCsdS(s @param package: A yum package object or simple string of a package name @param action: A yum.constant transaction set state or in the obscure rpm repackage case it could be the string 'repackaging' @param te_current: current number of bytes processed in the transaction element being processed @param te_total: total number of bytes in the transaction element being processed @param ts_current: number of processes completed in whole transaction @param ts_total: total number of processes in the transaction. N((Rtpackagetactiont te_currenttte_totalt ts_currenttts_total((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pytevent$scCsdS(sPpackage is the package. msgs is the messages that were output (if any).N((RRtmsgs((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt scriptout4scCsdS(stakes a simple error msg stringN((Rtmsg((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyterrorlog9scCsdS(svpackage is the same as in event() - a package object or simple string action is also the same as in event()N((RRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pytfilelog>s(t__name__t __module__RR RRR(((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR s     tRPMBaseCallbackcBsDeZdZdZdZdZdZdZdZRS(s@ Base class for a RPMTransaction display callback class cCsitdt6tdt6tdt6tdt6tdt6tdt6tdt6tdd6|_idt6d t6d t6d t6dt6d t6dt6|_ t j d |_ dS( NtUpdatingtErasingt Installingt ObsoletedtCleanupt Repackagingt repackagingtUpdatedtErasedt Installeds"yum.filelogging.RPMInstallCallback( Rt TS_UPDATEtTS_ERASEt TS_INSTALLtTS_TRUEINSTALLt TS_OBSOLETEDt TS_OBSOLETINGt TS_UPDATEDRt fileactiontloggingt getLoggertlogger(R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRHs         cCs tdS(s @param package: A yum package object or simple string of a package name @param action: A yum.constant transaction set state or in the obscure rpm repackage case it could be the string 'repackaging' @param te_current: Current number of bytes processed in the transaction element being processed @param te_total: Total number of bytes in the transaction element being processed @param ts_current: number of processes completed in whole transaction @param ts_total: total number of processes in the transaction. N(tNotImplementedError(RRRRR R R ((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR [s cCsdS(sPpackage is the package. msgs is the messages that were output (if any).N((RRR ((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRiscCstj|IJdS(N(tsyststderr(RR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRnscCsM||jkr)d|j||f}nd||f}|jj|dS(Ns%s: %s(R&R)tinfo(RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRrscCsdS(sC Callback for post transaction when we are in verifyTransaction(). N((Rtbasettxmbrtcount((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt verify_txmbr{s( RRt__doc__RR RRRR1(((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRDs     tSimpleCliCallBackcBs,eZdZdZdZdZRS(cCs#tj|d|_d|_dS(N(RRtNonetlastmsgt lastpackage(R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRs  cCsPd|j||||||f}||jkr:|GHn||_||_dS(Ns%s: %s %s/%s [%s/%s](RR5R6(RRRRR R R R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR s  cCs|r |GndS(N((RRR ((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRscCs%td|t|j|fGHdS(sC Callback for post transaction when we are in verifyTransaction(). sVerify: %u/%u: %sN(RtlenttsInfo(RR.R/R0((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR1s(RRRR RR1(((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR3s  t_WrapNoExceptionscBseZdZdZRS(cCs ||_dS(N(t_WrapNoExceptions__parent(Rtparent((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRscsPt|j|fd}j|_j|_|jjj|S(s Wraps all access to the parent functions. This is so it'll eat all exceptions because rpm doesn't like exceptions in the callback. csFy||Wn.tk rA}ydGdG|GHWqBqBXnXdS(NsError:sdisplay callback failed:(t Exception(targstkwargste(tfunc(s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pytnewFuncs(tgetattrR:RR2t__dict__tupdate(RtnameRA((R@s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt __getattr__s   (RRRRF(((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR9s tRPMTransactioncBsFeZeedZdZdZddZdZdZ dZ dZ d Z ed Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%RS(#cCst|s||_n ||_t|j|_||_||_t|_d|_d|_ d|_ d|_ t |_ d|_tjd|_t|_|j|jjtjj|jjjstj|jjjndS(Nis"yum.filelogging.RPMInstallCallback(tcallabletdisplayR9R.ttesttFalset trans_runningR4tfdt total_actionsttotal_installedtcomplete_actionstsettinstalled_pkg_namest total_removedR'R(R)Rt_setupOutputLoggingtconft rpmverbositytostpathtexistst persistdirtmakedirs(RR.RJRI((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRs$             cCsJtj}tj|tj}||@r,dStj|tj||BdS(s1 Set the Non-blocking flag for a filedescriptor. N(RWt O_NONBLOCKtfcntltF_GETFLtF_SETFL(RRMtflagt current_flags((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt_fdSetNonblocks   cCsJtj}tj|tj}||@r,dStj|tj||BdS(s3 Set the close on exec. flag for a filedescriptor. N(R]t FD_CLOEXECtF_GETFDtF_SETFD(RRMR`Ra((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt_fdSetCloseOnExecs   R-cCstj}||_t|jd|_|jjj|jidd6dd6dd6dd 6d d 6j ||}d |j }t t |sd }nt j tt |t j|jdS(Nsw+btcrittcriticaltemergt emergencyterrterrorR-t informationtwarningtwarntRPMLOG_t RPMLOG_INFO(ttempfiletNamedTemporaryFilet _readpipetopenREt _writepipeR.ttst setScriptFdtgettupperthasattrtrpmt setVerbosityRBt setLogFile(RRVtio_r((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRTs    cCs?tjtjtjtjy|jjWnnXdS(N(R|R}t RPMLOG_NOTICER~R+R,Rvtclose(R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt_shutdownOutputLoggings cCs9y!|jj}|sdS|SWntk r4nXdS(N(RttreadR4tIOError(Rtout((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt _scriptOutputs cCs9|j}|jj|||jjj||dS(N(RRIRR.thistorytlog_scriptlet_output(RtdataR ((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt _scriptouts cCs|jdS(N(R(R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt__del__scCsN|d}|dkrd}n t|}|d|d||d|dfS(Ntepocht0REtarchtversiontrelease(R4tstr(RthdrttmpepochR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt _dopkgtups    cCst|tr|j|fSt|tr|j|d}|jjjd|}t|dksnt |dj|dfSt|t rd}|s|dfSxQ|jjj d|D]7}|j tkrqn|dk r|dfS|}qW||fSdSdS(NitpkgtupiRE(NN(t isinstanceRREttupleRR.R8t getMembersR7tAssertionErrort basestringR4t matchNaevrt output_statetTS_REMOVE_STATES(RtcbkeyteraseRttxmbrstretR/((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt _getTxmbrs&      cCs>|jjjdkr|S|jtjj|jjjdS(s+ Remove the installroot from the filename. t/t(R.RUt installroottreplaceRWRXtnormpath(Rtfilename((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt_fn_rm_installroot/scCs|jr tSt|dr tSd|jjj|jf|_|j |j}yt |d|_ Wn7t t fk r}|jjd|d|_ tSX|j|j jtS(sQ Open the transaction done file, must be started outside the chroot. t_ts_dones%s/transaction-done.%stwscould not open ts_done file: %sN(RJRKR{tTrueR.RURZt_ts_timet ts_done_fnRRuRRtOSErrorRIRR4Rftfileno(RRR?((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt ts_done_open9s  cCs|jdkrdSy!|jj||jjWnFttfk r|}|jjd|d|_tj |j nXdS(s/ Write some data to the transaction done file. Ns#could not write to ts_done file: %s( RR4twritetflushRRRIRtmisctunlink_fR(RRR?((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyt ts_done_writeOs c CsV|jsdSt|jdkr)dS|jd\}}}}}}d||||f} |tkr|dkr|jj|| qn|tkr|dkr|jj|| qnt|tj kr|} n |j } || krd||f} |jj|| nd||||||f} |j | |jj ddS(s?writes out the portions of the transaction which have completedNis&ts_done state is %s %s should be %s %sRtinstalls%ts_done name in te is %s should be %ss%s %s:%s-%s-%s.%s ( RR7t _te_tuplesRRIRtTS_INSTALL_STATESttypettypest StringTypesRERtpop( RRRttR?tntvtrtaRRE((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pytts_done^s*         c Cset|dsg|_nx|jjD]}|j}|j}|j}|j}|j}|d krd}n|j dkrd}n'|j dkrd}n |j }|jj ||||||fq(Wt j d|_d|jjj|jf}||_|j|}yMtjjtjj|sjtjtjj|nt|d } Wn7ttfk r}|jjd |d |_d SXygxL|jD]A\}}}}}}d ||||||f} | j| qW| j| j WnCttfk r`}|jjd |t!j"|d |_nXd S(s&write out what our transaction will doRRiRiRs%Y-%m-%d.%H:%M.%Ss%s/transaction-all.%sRscould not open ts_all file: %sNs%s %s:%s-%s-%s.%s s"could not write to ts_all file: %s(#R{RR.RwtNtAtVtRtER4tTypetappendttimetstrftimeRRURZt ts_all_fnRRWRXRYtdirnameR[RuRRRIRRRRRRR( RtteRRRRR?RttsfntfoR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pytts_allsL           &  "  cCs|tjkr%|j|||nz|tjkrJ|j|||nU|tjkro|j|||n0|tjkr|j|||S|tj kr|j |||n|tj kr|j |||n|tj kr|j|||n|tjkr%|j|||nz|tjkrJ|j|||nU|tjkro|j|||n0|tjkr|j|||n |tjkr|j|||n|tjkr|j|||n|tjkr|j|||nttdr7|tjkr7|j|||nhttdrk|tj krk|j!|||n4ttdr|tj"kr|j#|||ndS(NtRPMCALLBACK_SCRIPT_ERRORtRPMCALLBACK_SCRIPT_STARTtRPMCALLBACK_SCRIPT_STOP($R|tRPMCALLBACK_TRANS_STARTt _transStarttRPMCALLBACK_TRANS_PROGRESSt_transProgresstRPMCALLBACK_TRANS_STOPt _transStoptRPMCALLBACK_INST_OPEN_FILEt _instOpenFiletRPMCALLBACK_INST_CLOSE_FILEt_instCloseFiletRPMCALLBACK_INST_PROGRESSt _instProgresstRPMCALLBACK_UNINST_STARTt _unInstStarttRPMCALLBACK_UNINST_PROGRESSt_unInstProgresstRPMCALLBACK_UNINST_STOPt _unInstStoptRPMCALLBACK_REPACKAGE_STARTt_rePackageStarttRPMCALLBACK_REPACKAGE_STOPt_rePackageStoptRPMCALLBACK_REPACKAGE_PROGRESSt_rePackageProgresstRPMCALLBACK_CPIO_ERRORt _cpioErrortRPMCALLBACK_UNPACK_ERRORt _unpackErrorR{Rt _scriptErrorRt _scriptStartRt _scriptStop(Rtwhattbytesttotalthtuser((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pytcallbacksDcCs7||_|jrdSt|_|j|jdS(N(RNRJRRLRR(RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRs     cCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRscCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRscCsd|_|j|\}}|dk r|jj}yt||_Wn-tk r{}|jj d||fqX|j r|j d7_ |j d7_ |j j|n|jjSn|jj ddS(NsError: Cannot open file %s: %sis"Error: No Header to INST_OPEN_FILE(R4R5RtpotlocalPkgtfileRMRRIRRLRORPRRtaddR(RRRRRER/trpmlocR?((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRs   cCs|j|\}}|dk r|jjd|_|jrDdS|jr|jj|j|j |j |j|j j j |j}|j j j|}|j j j|||j|j|j qndS(N(RR4RMRRJRLRIRRRRR.Rtpkg2pidt txmbr2statettrans_data_pid_endR(RRRRRER/tpidtstate((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRs     cCs|j|\}}|dk r|dkrU|jj|d|||j|jq|j}|jj|j||||j|jndS(NR(RR4RIR RPRNRR(RRRRRER/R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRs   cCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRscCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR"sc Cs|j|dt\}}|jd7_|jd7_||jkr|dk rm|jj|jt n|jj|t t }nt }|jj ||dd|j|j |j rdS|dk r|j|jt}|r|jjjdkrtjdn|jjj|j}|jjj|} |jjj|| |r|jjjdkrtj|jjjn|j|j|jn|j||j||dS(NRiidRt.(RRRSRPRRR4RIRRR R%R RNRJRRKR.RURRWtchrootRRRRRR( RRRRRER/Rt _do_chrootRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR%s4      cCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRNscCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRQscCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRTscCsN|j|\}}|dk rJd|j}t|_|jj|ndS(Ns'Error in cpio payload of rpm package %s(RR4Rt TS_FAILEDRRIR(RRRRRER/R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRWs    cCsN|j|\}}|dk rJt|_d|j}|jj|ndS(NsError unpacking rpm package %s(RR4RRRRIR(RRRRRER/R((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR`s    c Cstjj|d}|j|dt\}}|dkrE|}n |j}|rd||f}|dk rt|_qnd||f}|j j ||j |dS(Ns Rs'Error in %s scriptlet in rpm package %ss0Non-fatal %s scriptlet failure in rpm package %s( R|ttagnamesRyRRR4RRRRIRR( RRRRtscriptlet_nameRER/t package_nameR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRjs      cCsdS(N((RRRR((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRscCs,|j|\}}|j|p$|dS(N(RR(RRRRRER/((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRscCs3t|jdsdS|jj|j||dS(sC Callback for post transaction when we are in verifyTransaction(). R1N(R{RIR1R.(RR/R0((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyR1s(&RRRKRRRbRfRTRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR1(((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyRGsD         + 5 '        )      (((((R|RWR]RR'RR+t yum.constantstyumRtyum.transactioninfoRRRrRRR3R9RG(((s0/usr/lib/python2.7/site-packages/yum/rpmtrans.pyts          $<PK[ofsite-packages/yum/config.pynuȯ#!/usr/bin/python -t # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2002 Duke University """ Configuration parser and default values for yum. """ _use_iniparse = True import os import sys import warnings import rpm import copy import urlparse import shlex from parser import ConfigPreProcessor, varReplace try: from iniparse import INIConfig from iniparse.compat import NoSectionError, NoOptionError, ParsingError from iniparse.compat import RawConfigParser as ConfigParser except ImportError: _use_iniparse = False if not _use_iniparse: from ConfigParser import NoSectionError, NoOptionError, ParsingError from ConfigParser import ConfigParser import rpmUtils.transaction import rpmUtils.miscutils import Errors import types from misc import get_uuid, read_in_items_from_dot_dir import fnmatch # Alter/patch these to change the default checking... __pkgs_gpgcheck_default__ = False __repo_gpgcheck_default__ = False __payload_gpgcheck_default__ = False __main_multilib_policy_default__ = 'best' __main_failovermethod_default__ = 'priority' __main_installonly_limit_default__ = 3 __group_command_default__ = 'objects' __exactarchlist_default__ = [] class Option(object): """ This class handles a single Yum configuration file option. Create subclasses for each type of supported configuration option. Python descriptor foo (__get__ and __set__) is used to make option definition easy and concise. """ def __init__(self, default=None, parse_default=False): self._setattrname() self.inherit = False if parse_default: default = self.parse(default) self.default = default def _setattrname(self): """Calculate the internal attribute name used to store option state in configuration instances. """ self._attrname = '__opt%d' % id(self) def __get__(self, obj, objtype): """Called when the option is read (via the descriptor protocol). :param obj: The configuration instance to modify. :param objtype: The type of the config instance (not used). :return: The parsed option value or the default value if the value wasn't set in the configuration file. """ # xemacs highlighting hack: ' if obj is None: return self return getattr(obj, self._attrname, None) def __set__(self, obj, value): """Called when the option is set (via the descriptor protocol). :param obj: The configuration instance to modify. :param value: The value to set the option to. """ # Only try to parse if it's a string if isinstance(value, basestring): try: value = self.parse(value) except ValueError, e: # Add the field name onto the error raise ValueError('Error parsing "%s = %r": %s' % (self._optname, value, str(e))) setattr(obj, self._attrname, value) def setup(self, obj, name): """Initialise the option for a config instance. This must be called before the option can be set or retrieved. :param obj: :class:`BaseConfig` (or subclass) instance. :param name: Name of the option. """ self._optname = name setattr(obj, self._attrname, copy.copy(self.default)) def clone(self): """Return a safe copy of this :class:`Option` instance. :return: a safe copy of this :class:`Option` instance """ new = copy.copy(self) new._setattrname() return new def parse(self, s): """Parse the string value to the :class:`Option`'s native value. :param s: raw string value to parse :return: validated native value :raise: ValueError if there was a problem parsing the string. Subclasses should override this """ return s def tostring(self, value): """Convert the :class:`Option`'s native value to a string value. This does the opposite of the :func:`parse` method above. Subclasses should override this. :param value: native option value :return: string representation of input """ return str(value) def Inherit(option_obj): """Clone an :class:`Option` instance for the purposes of inheritance. The returned instance has all the same properties as the input :class:`Option` and shares items such as the default value. Use this to avoid redefinition of reused options. :param option_obj: :class:`Option` instance to inherit :return: New :class:`Option` instance inherited from the input """ new_option = option_obj.clone() new_option.inherit = True return new_option class ListOption(Option): """An option containing a list of strings.""" def __init__(self, default=None, parse_default=False): if default is None: default = [] super(ListOption, self).__init__(default, parse_default) def parse(self, s): """Convert a string from the config file to a workable list, parses globdir: paths as foo.d-style dirs. :param s: The string to be converted to a list. Commas and whitespace are used as separators for the list :return: *s* converted to a list """ # we need to allow for the '\n[whitespace]' continuation - easier # to sub the \n with a space and then read the lines s = s.replace('\n', ' ') s = s.replace(',', ' ') results = [] for item in s.split(): if item.startswith('glob:'): thisglob = item.replace('glob:', '') results.extend(read_in_items_from_dot_dir(thisglob)) continue results.append(item) return results def tostring(self, value): """Convert a list of to a string value. This does the opposite of the :func:`parse` method above. :param value: a list of values :return: string representation of input """ return '\n '.join(value) class UrlOption(Option): """This option handles lists of URLs with validation of the URL scheme. """ def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https'), allow_none=False): super(UrlOption, self).__init__(default) self.schemes = schemes self.allow_none = allow_none def parse(self, url): """Parse a url to make sure that it is valid, and in a scheme that can be used. :param url: a string containing the url to parse :return: *url* if it is valid :raises: :class:`ValueError` if there is an error parsing the url """ url = url.strip() # Handle the "_none_" special case if url.lower() == '_none_': if self.allow_none: return '_none_' else: raise ValueError('"_none_" is not a valid value') # Check that scheme is valid (s,b,p,q,f,o) = urlparse.urlparse(url) if s not in self.schemes: raise ValueError('URL must be %s not "%s"' % (self._schemelist(), s)) return url def _schemelist(self): '''Return a user friendly list of the allowed schemes ''' if len(self.schemes) < 1: return 'empty' elif len(self.schemes) == 1: return self.schemes[0] else: return '%s or %s' % (', '.join(self.schemes[:-1]), self.schemes[-1]) class ProxyOption(UrlOption): """ Just like URLOption but accept "libproxy" too. """ def parse(self, proxy): if proxy.strip().lower() == 'libproxy': return 'libproxy' return UrlOption.parse(self, proxy) class UrlListOption(ListOption): """Option for handling lists of URLs with validation of the URL scheme. """ def __init__(self, default=None, schemes=('http', 'ftp', 'file', 'https'), parse_default=False): super(UrlListOption, self).__init__(default, parse_default) # Hold a UrlOption instance to assist with parsing self._urloption = UrlOption(schemes=schemes) def parse(self, s): """Parse a string containing multiple urls into a list, and ensure that they are in a scheme that can be used. :param s: the string to parse :return: a list of strings containing the urls in *s* :raises: :class:`ValueError` if there is an error parsing the urls """ out = [] s = s.replace('\n', ' ') s = s.replace(',', ' ') items = [ item.replace(' ', '%20') for item in shlex.split(s) ] tmp = [] for item in items: if item.startswith('glob:'): thisglob = item.replace('glob:', '') tmp.extend(read_in_items_from_dot_dir(thisglob)) continue tmp.append(item) for url in super(UrlListOption, self).parse(' '.join(tmp)): out.append(self._urloption.parse(url)) return out class WildListOption(ListOption): """An option containing a list of strings that supports shell-style wildcard matching in membership test operations.""" def parse(self, s): class WildList(list): def __contains__(self, item): if not isinstance(item, basestring): return False return any(fnmatch.fnmatch(item, p) for p in self) patterns = super(WildListOption, self).parse(s) return WildList(patterns) class IntOption(Option): """An option representing an integer value.""" def __init__(self, default=None, range_min=None, range_max=None): super(IntOption, self).__init__(default) self._range_min = range_min self._range_max = range_max def parse(self, s): """Parse a string containing an integer. :param s: the string to parse :return: the integer in *s* :raises: :class:`ValueError` if there is an error parsing the integer """ try: val = int(s) except (ValueError, TypeError), e: raise ValueError('invalid integer value') if self._range_max is not None and val > self._range_max: raise ValueError('out of range integer value') if self._range_min is not None and val < self._range_min: raise ValueError('out of range integer value') return val class PositiveIntOption(IntOption): """An option representing a positive integer value, where 0 can have a special representation. """ def __init__(self, default=None, range_min=0, range_max=None, names_of_0=None): super(PositiveIntOption, self).__init__(default, range_min, range_max) self._names0 = names_of_0 def parse(self, s): """Parse a string containing a positive integer, where 0 can have a special representation. :param s: the string to parse :return: the integer in *s* :raises: :class:`ValueError` if there is an error parsing the integer """ if s in self._names0: return 0 return super(PositiveIntOption, self).parse(s) class SecondsOption(Option): """An option representing an integer value of seconds, or a human readable variation specifying days, hours, minutes or seconds until something happens. Works like :class:`BytesOption`. Note that due to historical president -1 means "never", so this accepts that and allows the word never, too. Valid inputs: 100, 1.5m, 90s, 1.2d, 1d, 0xF, 0.1, -1, never. Invalid inputs: -10, -0.1, 45.6Z, 1d6h, 1day, 1y. Return value will always be an integer """ MULTS = {'d': 60 * 60 * 24, 'h' : 60 * 60, 'm' : 60, 's': 1} def parse(self, s): """Parse a string containing an integer value of seconds, or a human readable variation specifying days, hours, minutes or seconds until something happens. Works like :class:`BytesOption`. Note that due to historical president -1 means "never", so this accepts that and allows the word never, too. Valid inputs: 100, 1.5m, 90s, 1.2d, 1d, 0xF, 0.1, -1, never. Invalid inputs: -10, -0.1, 45.6Z, 1d6h, 1day, 1y. :param s: the string to parse :return: an integer representing the number of seconds specified by *s* :raises: :class:`ValueError` if there is an error parsing the string """ if len(s) < 1: raise ValueError("no value specified") if s == "-1" or s == "never": # Special cache timeout, meaning never return -1 if s[-1].isalpha(): n = s[:-1] unit = s[-1].lower() mult = self.MULTS.get(unit, None) if not mult: raise ValueError("unknown unit '%s'" % unit) else: n = s mult = 1 try: n = float(n) except (ValueError, TypeError), e: raise ValueError('invalid value') if n < 0: raise ValueError("seconds value may not be negative") return int(n * mult) class BoolOption(Option): """An option representing a boolean value. The value can be one of 0, 1, yes, no, true, or false. """ def parse(self, s): """Parse a string containing a boolean value. 1, yes, and true will evaluate to True; and 0, no, and false will evaluate to False. Case is ignored. :param s: the string containing the boolean value :return: the boolean value contained in *s* :raises: :class:`ValueError` if there is an error in parsing the boolean value """ s = s.lower() if s in ('0', 'no', 'false'): return False elif s in ('1', 'yes', 'true'): return True else: raise ValueError('invalid boolean value') def tostring(self, value): """Convert a boolean value to a string value. This does the opposite of the :func:`parse` method above. :param value: the boolean value to convert :return: a string representation of *value* """ if value: return "1" else: return "0" class FloatOption(Option): """An option representing a numeric float value.""" def parse(self, s): """Parse a string containing a numeric float value. :param s: a string containing a numeric float value to parse :return: the numeric float value contained in *s* :raises: :class:`ValueError` if there is an error parsing float value """ try: return float(s.strip()) except (ValueError, TypeError): raise ValueError('invalid float value') class SelectionOption(Option): """Handles string values where only specific values are allowed. """ def __init__(self, default=None, allowed=(), mapper={}): super(SelectionOption, self).__init__(default) self._allowed = allowed self._mapper = mapper def parse(self, s): """Parse a string for specific values. :param s: the string to parse :return: *s* if it contains a valid value :raises: :class:`ValueError` if there is an error parsing the values """ if s in self._mapper: s = self._mapper[s] if s not in self._allowed: raise ValueError('"%s" is not an allowed value' % s) return s class CaselessSelectionOption(SelectionOption): """Mainly for compatibility with :class:`BoolOption`, works like :class:`SelectionOption` but lowers input case. """ def parse(self, s): """Parse a string for specific values. :param s: the string to parse :return: *s* if it contains a valid value :raises: :class:`ValueError` if there is an error parsing the values """ return super(CaselessSelectionOption, self).parse(s.lower()) class BytesOption(Option): """An option representing a value in bytes. The value may be given in bytes, kilobytes, megabytes, or gigabytes. """ # Multipliers for unit symbols MULTS = { 'k': 1024, 'm': 1024*1024, 'g': 1024*1024*1024, } def parse(self, s): """Parse a friendly bandwidth option to bytes. The input should be a string containing a (possibly floating point) number followed by an optional single character unit. Valid units are 'k', 'M', 'G'. Case is ignored. The convention that 1k = 1024 bytes is used. Valid inputs: 100, 123M, 45.6k, 12.4G, 100K, 786.3, 0. Invalid inputs: -10, -0.1, 45.6L, 123Mb. :param s: the string to parse :return: the number of bytes represented by *s* :raises: :class:`ValueError` if the option can't be parsed """ if len(s) < 1: raise ValueError("no value specified") if s[-1].isalpha(): n = s[:-1] unit = s[-1].lower() mult = self.MULTS.get(unit, None) if not mult: raise ValueError("unknown unit '%s'" % unit) else: n = s mult = 1 try: n = float(n) except ValueError: raise ValueError("couldn't convert '%s' to number" % n) if n < 0: raise ValueError("bytes value may not be negative") return int(n * mult) class ThrottleOption(BytesOption): """An option representing a bandwidth throttle value. See :func:`parse` for acceptable input values. """ def parse(self, s): """Get a throttle option. Input may either be a percentage or a "friendly bandwidth value" as accepted by the :class:`BytesOption`. Valid inputs: 100, 50%, 80.5%, 123M, 45.6k, 12.4G, 100K, 786.0, 0. Invalid inputs: 100.1%, -4%, -500. :param s: the string to parse :return: the bandwidth represented by *s*. The return value will be an int if a bandwidth value was specified, and a float if a percentage was given :raises: :class:`ValueError` if input can't be parsed """ if len(s) < 1: raise ValueError("no value specified") if s[-1] == '%': n = s[:-1] try: n = float(n) except ValueError: raise ValueError("couldn't convert '%s' to number" % n) if n < 0 or n > 100: raise ValueError("percentage is out of range") return n / 100.0 else: return BytesOption.parse(self, s) class BaseConfig(object): """Base class for storing configuration definitions. Subclass when creating your own definitions. """ def __init__(self): self._section = None for name in self.iterkeys(): option = self.optionobj(name) option.setup(self, name) def __str__(self): out = [] out.append('[%s]' % self._section) for name, value in self.iteritems(): out.append('%s: %r' % (name, value)) return '\n'.join(out) def populate(self, parser, section, parent=None): """Set option values from an INI file section. :param parser: :class:`ConfigParser` instance (or subclass) :param section: INI file section to read use :param parent: Optional parent :class:`BaseConfig` (or subclass) instance to use when doing option value inheritance """ self.cfg = parser self._section = section if parser.has_section(section): opts = set(parser.options(section)) else: opts = set() for name in self.iterkeys(): option = self.optionobj(name) value = None if name in opts: value = parser.get(section, name) else: # No matching option in this section, try inheriting if parent and option.inherit: value = getattr(parent, name) if value is not None: setattr(self, name, value) def optionobj(cls, name, exceptions=True): """Return the :class:`Option` instance for the given name. :param cls: the class to return the :class:`Option` instance from :param name: the name of the :class:`Option` instance to return :param exceptions: defines what action to take if the specified :class:`Option` instance does not exist. If *exceptions* is True, a :class:`KeyError` will be raised. If *exceptions* is False, None will be returned :return: the :class:`Option` instance specified by *name*, or None if it does not exist and *exceptions* is False :raises: :class:`KeyError` if the specified :class:`Option` does not exist, and *exceptions* is True """ obj = getattr(cls, name, None) if isinstance(obj, Option): return obj elif exceptions: raise KeyError else: return None optionobj = classmethod(optionobj) def isoption(cls, name): """Return True if the given name refers to a defined option. :param cls: the class to find the option in :param name: the name of the option to search for :return: whether *name* specifies a defined option """ return cls.optionobj(name, exceptions=False) is not None isoption = classmethod(isoption) def iterkeys(self): """Yield the names of all defined options in the instance.""" for name in dir(self): if self.isoption(name): yield name def iteritems(self): """Yield (name, value) pairs for every option in the instance. The value returned is the parsed, validated option value. """ # Use dir() so that we see inherited options too for name in self.iterkeys(): yield (name, getattr(self, name)) def write(self, fileobj, section=None, always=()): """Write out the configuration to a file-like object. :param fileobj: File-like object to write to :param section: Section name to use. If not specified, the section name used during parsing will be used :param always: A sequence of option names to always write out. Options not listed here will only be written out if they are at non-default values. Set to None to dump out all options """ # Write section heading if section is None: if self._section is None: raise ValueError("not populated, don't know section") section = self._section # Updated the ConfigParser with the changed values cfgOptions = self.cfg.options(section) for name,value in self.iteritems(): option = self.optionobj(name) if always is None or name in always or option.default != value or name in cfgOptions : self.cfg.set(section,name, option.tostring(value)) # write the updated ConfigParser to the fileobj. self.cfg.write(fileobj) def getConfigOption(self, option, default=None): """Return the current value of the given option. :param option: string specifying the option to return the value of :param default: the value to return if the option does not exist :return: the value of the option specified by *option*, or *default* if it does not exist """ warnings.warn('getConfigOption() will go away in a future version of Yum.\n' 'Please access option values as attributes or using getattr().', DeprecationWarning) if hasattr(self, option): return getattr(self, option) return default def setConfigOption(self, option, value): """Set the value of the given option to the given value. :param option: string specifying the option to set the value of :param value: the value to set the option to """ warnings.warn('setConfigOption() will go away in a future version of Yum.\n' 'Please set option values as attributes or using setattr().', DeprecationWarning) if hasattr(self, option): setattr(self, option, value) else: raise Errors.ConfigError, 'No such option %s' % option class StartupConf(BaseConfig): """Configuration option definitions for yum.conf's [main] section that are required early in the initialisation process or before the other [main] options can be parsed. """ # xemacs highlighting hack: ' debuglevel = IntOption(2, -4, 10) errorlevel = IntOption(2, 0, 10) distroverpkg = ListOption(['system-release(releasever)', 'redhat-release']) installroot = Option('/') config_file_path = Option('/etc/yum/yum.conf') plugins = BoolOption(False) pluginpath = ListOption(['/usr/share/yum-plugins', '/usr/lib/yum-plugins']) pluginconfpath = ListOption(['/etc/yum/pluginconf.d']) gaftonmode = BoolOption(False) syslog_ident = Option() syslog_facility = Option('LOG_USER') syslog_device = Option('/dev/log') persistdir = Option('/var/lib/yum') skip_missing_names_on_install = BoolOption(True) skip_missing_names_on_update = BoolOption(True) class YumConf(StartupConf): """Configuration option definitions for yum.conf's [main] section. Note: see also options inherited from :class:`StartupConf` """ retries = PositiveIntOption(10, names_of_0=[""]) recent = IntOption(7, range_min=0) reset_nice = BoolOption(True) cachedir = Option('/var/cache/yum') keepcache = BoolOption(True) usercache = BoolOption(True) logfile = Option('/var/log/yum.log') reposdir = ListOption(['/etc/yum/repos.d', '/etc/yum.repos.d']) commands = ListOption() exclude = ListOption() failovermethod = Option(__main_failovermethod_default__) proxy = ProxyOption(default=False, schemes=('http', 'ftp', 'https', 'socks4', 'socks4a', 'socks5', 'socks5h'), allow_none=True) proxy_username = Option() proxy_password = Option() username = Option() password = Option() installonlypkgs = ListOption(['kernel', 'kernel-bigmem', 'installonlypkg(kernel)', 'installonlypkg(kernel-module)', 'installonlypkg(vm)', 'kernel-enterprise','kernel-smp', 'kernel-debug', 'kernel-unsupported', 'kernel-source', 'kernel-devel', 'kernel-PAE', 'kernel-PAE-debug']) # NOTE: If you set this to 2, then because it keeps the current kernel it # means if you ever install an "old" kernel it'll get rid of the newest one # so you probably want to use 3 as a minimum ... if you turn it on. installonly_limit = PositiveIntOption(__main_installonly_limit_default__, range_min=2, names_of_0=["0", ""]) kernelpkgnames = ListOption(['kernel','kernel-smp', 'kernel-enterprise', 'kernel-bigmem', 'kernel-BOOT', 'kernel-PAE', 'kernel-PAE-debug']) exactarchlist = WildListOption(__exactarchlist_default__) tsflags = ListOption() override_install_langs = Option() assumeyes = BoolOption(False) assumeno = BoolOption(False) alwaysprompt = BoolOption(True) exactarch = BoolOption(True) tolerant = BoolOption(True) diskspacecheck = BoolOption(True) overwrite_groups = BoolOption(False) keepalive = BoolOption(True) # FIXME: rename gpgcheck to pkgs_gpgcheck gpgcheck = BoolOption(__pkgs_gpgcheck_default__) repo_gpgcheck = BoolOption(__repo_gpgcheck_default__) localpkg_gpgcheck = BoolOption(__pkgs_gpgcheck_default__) payload_gpgcheck = BoolOption(__payload_gpgcheck_default__) obsoletes = BoolOption(True) showdupesfromrepos = BoolOption(False) enabled = BoolOption(True) remove_leaf_only = BoolOption(False) repopkgsremove_leaf_only = BoolOption(False) enablegroups = BoolOption(True) enable_group_conditionals = BoolOption(True) groupremove_leaf_only = BoolOption(False) group_package_types = ListOption(['mandatory', 'default']) group_command = SelectionOption(__group_command_default__, ('compat', 'objects', 'simple')) upgrade_group_objects_upgrade = BoolOption(True) timeout = FloatOption(30.0) # FIXME: Should use variation of SecondsOption minrate = IntOption(0) bandwidth = BytesOption(0) throttle = ThrottleOption(0) ip_resolve = CaselessSelectionOption( allowed = ('ipv4', 'ipv6', 'whatever'), mapper = {'4': 'ipv4', '6': 'ipv6'}) max_connections = IntOption(0, range_min=0) ftp_disable_epsv = BoolOption(False) deltarpm = IntOption(2, range_min=-16, range_max=128) deltarpm_percentage = IntOption(75, range_min=0, range_max=100) deltarpm_metadata_percentage = IntOption(100, range_min=0) http_caching = SelectionOption('all', ('none', 'packages', 'all', 'lazy:packages')) metadata_expire = SecondsOption(60 * 60 * 6) # Time in seconds (6h). metadata_expire_filter = SelectionOption('read-only:present', ('never', 'read-only:future', 'read-only:present', 'read-only:past')) # Time in seconds (1 day). NOTE: This isn't used when using metalinks mirrorlist_expire = SecondsOption(60 * 60 * 24) # XXX rpm_check_debug is unused, left around for API compatibility for now rpm_check_debug = BoolOption(True) disable_excludes = ListOption() query_install_excludes = BoolOption(False) skip_broken = BoolOption(False) # Note that "instant" is the old behaviour, but group:primary is very # similar but better :). mdpolicy = ListOption(['group:small']) mddownloadpolicy = SelectionOption('sqlite', ('sqlite', 'xml')) # ('instant', 'group:all', 'group:main', 'group:small', 'group:primary')) multilib_policy = SelectionOption(__main_multilib_policy_default__, ('best', 'all')) # all == install any/all arches you can # best == use the 'best arch' for the system bugtracker_url = Option('https://bugzilla.redhat.com/enter_bug.cgi?product=Fedora&version=rawhide&component=yum') color = SelectionOption('auto', ('auto', 'never', 'always'), mapper={'on' : 'always', 'yes' : 'always', '1' : 'always', 'true' : 'always', 'off' : 'never', 'no' : 'never', '0' : 'never', 'false' : 'never', 'tty' : 'auto', 'if-tty' : 'auto'}) color_list_installed_older = Option('bold') color_list_installed_newer = Option('bold,yellow') color_list_installed_reinstall = Option('normal') color_list_installed_extra = Option('bold,red') color_list_installed_running_kernel = Option('bold,underline') color_list_available_upgrade = Option('bold,blue') color_list_available_downgrade = Option('dim,cyan') color_list_available_reinstall = Option('bold,underline,green') color_list_available_install = Option('normal') color_list_available_running_kernel = Option('bold,underline') color_update_installed = Option('normal') color_update_local = Option('bold') color_update_remote = Option('normal') color_search_match = Option('bold') ui_repoid_vars = ListOption(['releasever', 'basearch']) sslcacert = Option() sslverify = BoolOption(True) sslclientcert = Option() sslclientkey = Option() ssl_check_cert_permissions = BoolOption(True) history_record = BoolOption(True) history_record_packages = ListOption(['yum', 'rpm']) rpmverbosity = Option('info') protected_packages = ListOption("yum, glob:/etc/yum/protected.d/*.conf", parse_default=True) protected_multilib = BoolOption(True) exit_on_lock = BoolOption(False) loadts_ignoremissing = BoolOption(False) loadts_ignorerpm = BoolOption(False) loadts_ignorenewrpm = BoolOption(False) autosavets = BoolOption(True) clean_requirements_on_remove = BoolOption(False) upgrade_requirements_on_install = BoolOption(False) history_list_view = SelectionOption('single-user-commands', ('single-user-commands', 'users', 'commands'), mapper={'cmds' : 'commands', 'default' :'single-user-commands'}) recheck_installed_requires = BoolOption(False) fssnap_automatic_pre = BoolOption(False) fssnap_automatic_post = BoolOption(False) fssnap_automatic_keep = IntOption(1) fssnap_percentage = IntOption(100, range_min=1, range_max=100) fssnap_devices = ListOption("!*/swap !*/lv_swap " "glob:/etc/yum/fssnap.d/*.conf", parse_default=True) fssnap_abort_on_errors = SelectionOption('any', ('broken-setup', 'snapshot-failure', 'any', 'none')) depsolve_loop_limit = PositiveIntOption(100, names_of_0=[""]) autocheck_running_kernel = BoolOption(True) check_config_file_age = BoolOption(True) usr_w_check = BoolOption(True) shell_exit_status = SelectionOption('0', ('0', '?')) _reposlist = [] # cachedir before variable substitutions _pristine_cachedir = None def dump(self): """Return a string representing the values of all the configuration options. :return: a string representing the values of all the configuration options """ output = '[main]\n' # we exclude all vars which start with _ or are in this list: excluded_vars = ('cfg', 'uid', 'yumvar', 'progress_obj', 'failure_obj', 'disable_excludes', 'config_file_age', 'config_file_path', ) for attr in dir(self): if attr.startswith('_'): continue if attr in excluded_vars: continue if isinstance(getattr(self, attr), types.MethodType): continue res = getattr(self, attr) if not res and type(res) not in (type(False), type(0)): res = '' if type(res) == types.ListType: res = ',\n '.join(res) output = output + '%s = %s\n' % (attr, res) return output class RepoConf(BaseConfig): """Option definitions for repository INI file sections.""" __cached_keys = set() def iterkeys(self): """Yield the names of all defined options in the instance.""" ck = self.__cached_keys if not isinstance(self, RepoConf): ck = set() if not ck: ck.update(list(BaseConfig.iterkeys(self))) for name in self.__cached_keys: yield name name = Option() enabled = Inherit(YumConf.enabled) keepcache = Inherit(YumConf.keepcache) baseurl = UrlListOption() mirrorlist = UrlOption() metalink = UrlOption() mediaid = Option() gpgkey = UrlListOption() gpgcakey = UrlListOption() exclude = ListOption() includepkgs = ListOption() proxy = Inherit(YumConf.proxy) proxy_username = Inherit(YumConf.proxy_username) proxy_password = Inherit(YumConf.proxy_password) retries = Inherit(YumConf.retries) failovermethod = Inherit(YumConf.failovermethod) username = Inherit(YumConf.username) password = Inherit(YumConf.password) # FIXME: rename gpgcheck to pkgs_gpgcheck gpgcheck = Inherit(YumConf.gpgcheck) repo_gpgcheck = Inherit(YumConf.repo_gpgcheck) keepalive = Inherit(YumConf.keepalive) enablegroups = Inherit(YumConf.enablegroups) minrate = Inherit(YumConf.minrate) bandwidth = Inherit(YumConf.bandwidth) throttle = Inherit(YumConf.throttle) timeout = Inherit(YumConf.timeout) ip_resolve = Inherit(YumConf.ip_resolve) # This isn't inherited so that we can automatically disable file:// _only_ # repos. if they haven't set an explicit deltarpm_percentage for the repo. deltarpm_percentage = IntOption(None, range_min=0, range_max=100) # Rely on the above config. to do automatic disabling, and thus. no hack # needed here. deltarpm_metadata_percentage = Inherit(YumConf.deltarpm_metadata_percentage) ftp_disable_epsv = Inherit(YumConf.ftp_disable_epsv) http_caching = Inherit(YumConf.http_caching) metadata_expire = Inherit(YumConf.metadata_expire) metadata_expire_filter = Inherit(YumConf.metadata_expire_filter) mirrorlist_expire = Inherit(YumConf.mirrorlist_expire) # NOTE: metalink expire _must_ be the same as metadata_expire, due to the # checksumming of the repomd.xml. mdpolicy = Inherit(YumConf.mdpolicy) mddownloadpolicy = Inherit(YumConf.mddownloadpolicy) cost = IntOption(1000) sslcacert = Inherit(YumConf.sslcacert) sslverify = Inherit(YumConf.sslverify) sslclientcert = Inherit(YumConf.sslclientcert) sslclientkey = Inherit(YumConf.sslclientkey) ssl_check_cert_permissions = Inherit(YumConf.ssl_check_cert_permissions) skip_if_unavailable = BoolOption(False) async = BoolOption(True) ui_repoid_vars = Inherit(YumConf.ui_repoid_vars) check_config_file_age = Inherit(YumConf.check_config_file_age) compare_providers_priority = IntOption(80, range_min=1, range_max=99) class VersionGroupConf(BaseConfig): """Option definitions for version groups.""" pkglist = ListOption() run_with_packages = BoolOption(False) def _read_yumvars(yumvars, root): # Read the FS yumvars try: dir_fsvars = root + "/etc/yum/vars/" fsvars = os.listdir(dir_fsvars) except OSError: fsvars = [] for fsvar in fsvars: if os.path.islink(dir_fsvars + fsvar): continue try: val = open(dir_fsvars + fsvar).readline() if val and val[-1] == '\n': val = val[:-1] except (OSError, IOError): continue yumvars[fsvar] = val def readStartupConfig(configfile, root, releasever=None): """Parse Yum's main configuration file and return a :class:`StartupConf` instance. This is required in order to access configuration settings required as Yum starts up. :param configfile: the path to yum.conf :param root: the base path to use for installation (typically '/') :return: A :class:`StartupConf` instance :raises: :class:`Errors.ConfigError` if a problem is detected with while parsing. """ # ' xemacs syntax hack StartupConf.installroot.default = root startupconf = StartupConf() startupconf.config_file_path = configfile parser = ConfigParser() confpp_obj = ConfigPreProcessor(configfile) yumvars = _getEnvVar() _read_yumvars(yumvars, startupconf.installroot) confpp_obj._vars = yumvars startupconf.yumvars = yumvars try: parser.readfp(confpp_obj) except ParsingError, e: raise Errors.ConfigError("Parsing file failed: %s" % e) startupconf.populate(parser, 'main') # Check that plugin paths are all absolute for path in startupconf.pluginpath: if not path[0] == '/': raise Errors.ConfigError("All plugin search paths must be absolute") # Stuff this here to avoid later re-parsing startupconf._parser = parser # setup the release ver here if releasever is None: releasever = _getsysver(startupconf.installroot, startupconf.distroverpkg) startupconf.releasever = releasever uuidfile = '%s/%s/uuid' % (startupconf.installroot, startupconf.persistdir) startupconf.uuid = get_uuid(uuidfile) return startupconf def readMainConfig(startupconf): """Parse Yum's main configuration file :param startupconf: :class:`StartupConf` instance as returned by readStartupConfig() :return: Populated :class:`YumConf` instance """ # ' xemacs syntax hack # Set up substitution vars but make sure we always prefer FS yumvars yumvars = startupconf.yumvars yumvars.setdefault('basearch', startupconf.basearch) yumvars.setdefault('arch', startupconf.arch) yumvars.setdefault('releasever', startupconf.releasever) yumvars.setdefault('uuid', startupconf.uuid) # Read [main] section yumconf = YumConf() yumconf.populate(startupconf._parser, 'main') # Store the original cachedir (for later reference in clean commands) yumconf._pristine_cachedir = yumconf.cachedir # Apply the installroot to directory options def _apply_installroot(yumconf, option): path = getattr(yumconf, option) ir_path = yumconf.installroot + path ir_path = ir_path.replace('//', '/') # os.path.normpath won't fix this and # it annoys me ir_path = varReplace(ir_path, yumvars) setattr(yumconf, option, ir_path) if StartupConf.installroot.default != yumconf.installroot: # Note that this isn't perfect, in that if the initial installroot has # X=Y, and X doesn't exist in the new installroot ... then we'll still # have X afterwards (but if the new installroot has X=Z, that will be # the value after this). _read_yumvars(yumvars, yumconf.installroot) # These can use the above FS yumvars for option in ('cachedir', 'logfile', 'persistdir'): _apply_installroot(yumconf, option) # Add in some extra attributes which aren't actually configuration values yumconf.yumvar = yumvars yumconf.uid = 0 yumconf.cache = 0 yumconf.progess_obj = None # items related to the originating config file yumconf.config_file_path = startupconf.config_file_path if os.path.exists(startupconf.config_file_path): yumconf.config_file_age = os.stat(startupconf.config_file_path)[8] else: yumconf.config_file_age = 0 # propagate the debuglevel and errorlevel values: yumconf.debuglevel = startupconf.debuglevel yumconf.errorlevel = startupconf.errorlevel return yumconf def readVersionGroupsConfig(configfile="/etc/yum/version-groups.conf"): """Parse the configuration file for version groups. :param configfile: the configuration file to read :return: a dictionary containing the parsed options """ parser = ConfigParser() confpp_obj = ConfigPreProcessor(configfile) try: parser.readfp(confpp_obj) except ParsingError, e: raise Errors.ConfigError("Parsing file failed: %s" % e) ret = {} for section in parser.sections(): ret[section] = VersionGroupConf() ret[section].populate(parser, section) return ret def getOption(conf, section, name, option): """Convenience function to retrieve a parsed and converted value from a :class:`ConfigParser`. :param conf: ConfigParser instance or similar :param section: Section name :param name: :class:`Option` name :param option: :class:`Option` instance to use for conversion :return: The parsed value or default if value was not present :raises: :class:`ValueError` if the option could not be parsed """ try: val = conf.get(section, name) except (NoSectionError, NoOptionError): return option.default return option.parse(val) def _getEnvVar(): '''Return variable replacements from the environment variables YUM0 to YUM9 The result is intended to be used with parser.varReplace() ''' yumvar = {} for num in range(0, 10): env = 'YUM%d' % num val = os.environ.get(env, '') if val: yumvar[env.lower()] = val return yumvar def _getsysver(installroot, distroverpkg): '''Calculate the release version for the system. @param installroot: The value of the installroot option. @param distroverpkg: The value of the distroverpkg option. @return: The release version as a string (eg. '4' for FC4) ''' ts = rpmUtils.transaction.initReadOnlyTransaction(root=installroot) ts.pushVSFlags(~(rpm._RPMVSF_NOSIGNATURES|rpm._RPMVSF_NODIGESTS)) try: for distroverpkg_prov in distroverpkg: idx = ts.dbMatch('provides', distroverpkg_prov) if idx.count(): break except TypeError, e: # This is code for "cannot open rpmdb" # this is for pep 352 compliance on python 2.6 and above :( if sys.hexversion < 0x02050000: if hasattr(e,'message'): raise Errors.YumBaseError("Error: " + str(e.message)) else: raise Errors.YumBaseError("Error: " + str(e)) raise Errors.YumBaseError("Error: " + str(e)) except rpm.error, e: # This is the "new" code for "cannot open rpmdb", 4.8.0 ish raise Errors.YumBaseError("Error: " + str(e)) # we're going to take the first one - if there is more than one of these # then the user needs a beating if idx.count() == 0: releasever = '$releasever' else: try: hdr = idx.next() except StopIteration: raise Errors.YumBaseError("Error: rpmdb failed release provides. Try: rpm --rebuilddb") releasever = hdr['version'] off = hdr[getattr(rpm, 'RPMTAG_PROVIDENAME')].index(distroverpkg_prov) flag = hdr[getattr(rpm, 'RPMTAG_PROVIDEFLAGS')][off] flag = rpmUtils.miscutils.flagToString(flag) ver = hdr[getattr(rpm, 'RPMTAG_PROVIDEVERSION')][off] if flag == 'EQ' and ver: if hdr['name'] != distroverpkg_prov: # override the package version releasever = ver del hdr del idx del ts return releasever def _readRawRepoFile(repo): if not _use_iniparse: return None if not hasattr(repo, 'repofile') or not repo.repofile: return None try: ini = INIConfig(open(repo.repofile)) except: return None # b/c repoids can have $values in them we need to map both ways to figure # out which one is which section_id = repo.id if repo.id not in ini._sections: for sect in ini._sections.keys(): if varReplace(sect, repo.yumvar) == repo.id: section_id = sect break else: return None return ini, section_id def writeRawRepoFile(repo,only=None): """Write changes in a repo object back to a .repo file. :param repo: the Repo Object to write back out :param only: list of attributes to work on. If *only* is None, all options will be written out """ if not _use_iniparse: return ini, section_id = _readRawRepoFile(repo) # Updated the ConfigParser with the changed values cfgOptions = repo.cfg.options(repo.id) for name,value in repo.iteritems(): if value is None: # Proxy continue if only is not None and name not in only: continue option = repo.optionobj(name) ovalue = option.tostring(value) # If the value is the same, but just interpreted ... when we don't want # to keep the interpreted values. if (name in ini[section_id] and ovalue == varReplace(ini[section_id][name], repo.yumvar)): ovalue = ini[section_id][name] if name not in cfgOptions and option.default == value: continue ini[section_id][name] = ovalue fp =file(repo.repofile,"w") fp.write(str(ini)) fp.close() # Copied from yum-config-manager ... how we alter yu.conf ... used in "yum fs" def _writeRawConfigFile(filename, section_id, yumvar, cfgoptions, items, optionobj, only=None): """ From writeRawRepoFile, but so we can alter [main] too. """ ini = INIConfig(open(filename)) osection_id = section_id # b/c repoids can have $values in them we need to map both ways to figure # out which one is which if section_id not in ini._sections: for sect in ini._sections.keys(): if varReplace(sect, yumvar) == section_id: section_id = sect # Updated the ConfigParser with the changed values cfgOptions = cfgoptions(osection_id) for name,value in items(): if value is None: # Proxy continue if only is not None and name not in only: continue option = optionobj(name) ovalue = option.tostring(value) # If the value is the same, but just interpreted ... when we don't want # to keep the interpreted values. if (name in ini[section_id] and ovalue == varReplace(ini[section_id][name], yumvar)): ovalue = ini[section_id][name] if name not in cfgOptions and option.default == value: continue ini[section_id][name] = ovalue fp =file(filename, "w") fp.write(str(ini)) fp.close() #def main(): # mainconf = readMainConfig(readStartupConfig('/etc/yum/yum.conf', '/')) # print mainconf.cachedir # #if __name__ == '__main__': # main() PK[c;site-packages/yum/rpmsack.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import rpm import types import warnings import glob import os import os.path from rpmUtils import miscutils from rpmUtils import arch from rpmUtils.transaction import initReadOnlyTransaction import misc import Errors from packages import YumInstalledPackage, parsePackages from packageSack import PackageSackBase, PackageSackVersion # For returnPackages(patterns=) import fnmatch import re from yum.i18n import to_unicode, _ import constants import yum.depsolve def _open_no_umask(*args): """ Annoying people like to set umask's for root, which screws everything up for user readable stuff. """ oumask = os.umask(022) try: ret = open(*args) finally: os.umask(oumask) return ret def _makedirs_no_umask(*args): """ Annoying people like to set umask's for root, which screws everything up for user readable stuff. """ oumask = os.umask(022) try: ret = os.makedirs(*args) finally: os.umask(oumask) return ret def _iopen(*args): """ IOError wrapper BS for open, stupid exceptions. """ try: ret = open(*args) except IOError, e: return None, e return ret, None class RPMInstalledPackage(YumInstalledPackage): def __init__(self, rpmhdr, index, rpmdb): self._has_hdr = True YumInstalledPackage.__init__(self, rpmhdr, yumdb=rpmdb.yumdb) self.idx = index self.rpmdb = rpmdb self._has_hdr = False del self.hdr def _get_hdr(self): # Note that we can't use hasattr(self, 'hdr') or we'll recurse if self._has_hdr: return self.hdr ts = self.rpmdb.readOnlyTS() mi = ts.dbMatch(0, self.idx) try: return mi.next() except StopIteration: raise Errors.PackageSackError, 'Rpmdb changed underneath us' def __getattr__(self, varname): # If these existed, then we wouldn't get here... # Prevent access of __foo__, _cached_foo etc from loading the header if varname.startswith('_'): raise AttributeError, "%s has no attribute %s" % (self, varname) if varname != 'hdr': # Don't cache the hdr, unless explicitly requested # Note that we don't even cache the .blah value, but looking up the # header is _really_ fast so it's not obvious any of it is worth it. # This is different to prco etc. data, which is loaded separately. val = self._get_hdr() else: self.hdr = val = self._get_hdr() self._has_hdr = True if varname != 'hdr': # This is unusual, for anything that happens val = val[varname] # a lot we should preload at __init__. # Also note that pkg.no_value raises KeyError. return val def requiring_packages(self): """return list of installed pkgs requiring this package""" pkgset = set() for (reqn, reqf, reqevr) in self.provides: for pkg in self.rpmdb.getRequires(reqn,reqf,reqevr): if pkg != self: pkgset.add(pkg) for fn in self.filelist + self.dirlist: for pkg in self.rpmdb.getRequires(fn, None, (None, None, None)): if pkg != self: pkgset.add(pkg) return list(pkgset) def required_packages(self): pkgset = set() for (reqn, reqf, reqevr) in self.strong_requires: for pkg in self.rpmdb.getProvides(reqn, reqf, reqevr): if pkg != self: pkgset.add(pkg) return list(pkgset) class RPMDBProblem: ''' Represents a problem in the rpmdb, from the check_*() functions. ''' def __init__(self, pkg, problem, **kwargs): self.pkg = pkg self.problem = problem for kwarg in kwargs: setattr(self, kwarg, kwargs[kwarg]) def __cmp__(self, other): if other is None: return 1 return cmp(self.pkg, other.pkg) or cmp(self.problem, other.problem) class RPMDBProblemDependency(RPMDBProblem): def __str__(self): if self.problem == 'requires': return "%s %s %s" % (self.pkg, _('has missing requires of'), self.missing) return "%s %s %s: %s" % (self.pkg, _('has installed conflicts'), self.found,', '.join(map(str, self.conflicts))) class RPMDBProblemDuplicate(RPMDBProblem): def __init__(self, pkg, **kwargs): RPMDBProblem.__init__(self, pkg, "duplicate", **kwargs) def __str__(self): return _("%s is a duplicate with %s") % (self.pkg, self.duplicate) class RPMDBProblemObsoleted(RPMDBProblem): def __init__(self, pkg, **kwargs): RPMDBProblem.__init__(self, pkg, "obsoleted", **kwargs) def __str__(self): return _("%s is obsoleted by %s") % (self.pkg, self.obsoleter) class RPMDBProblemProvides(RPMDBProblem): def __init__(self, pkg, **kwargs): RPMDBProblem.__init__(self, pkg, "provides", **kwargs) def __str__(self): return _("%s provides %s but it cannot be found") % (self.pkg, self.provide) class RPMDBPackageSack(PackageSackBase): ''' Represent rpmdb as a packagesack ''' DEP_TABLE = { 'requires' : (rpm.RPMTAG_REQUIRENAME, rpm.RPMTAG_REQUIREVERSION, rpm.RPMTAG_REQUIREFLAGS), 'provides' : (rpm.RPMTAG_PROVIDENAME, rpm.RPMTAG_PROVIDEVERSION, rpm.RPMTAG_PROVIDEFLAGS), 'conflicts' : (rpm.RPMTAG_CONFLICTNAME, rpm.RPMTAG_CONFLICTVERSION, rpm.RPMTAG_CONFLICTFLAGS), 'obsoletes' : (rpm.RPMTAG_OBSOLETENAME, rpm.RPMTAG_OBSOLETEVERSION, rpm.RPMTAG_OBSOLETEFLAGS) } # Do we want to cache rpmdb data in a file, for later use? __cache_rpmdb__ = True def __init__(self, root='/', releasever=None, cachedir=None, persistdir='/var/lib/yum'): self.root = root self._idx2pkg = {} self._name2pkg = {} self._pkgnames_loaded = set() self._tup2pkg = {} self._completely_loaded = False self._pkgname_fails = set() self._pkgmatch_fails = set() self._provmatch_fails = set() self._simple_pkgtup_list = [] self._get_pro_cache = {} self._get_req_cache = {} self._loaded_gpg_keys = False if cachedir is None: cachedir = persistdir + "/rpmdb-indexes" self.setCacheDir(cachedir) if not os.path.normpath(persistdir).startswith(self.root): self._persistdir = root + '/' + persistdir else: self._persistdir = persistdir if hasattr(rpm, 'expandMacro'): dbpath = rpm.expandMacro('%_dbpath') else: dbpath = '/var/lib/rpm' self._rpmdbpath = os.path.normpath(root + '/' + dbpath) self._have_cached_rpmdbv_data = None self._cached_conflicts_data = None # Store the result of what happens, if a transaction completes. self._trans_cache_store = {} self.ts = None self.releasever = releasever self.auto_close = False # this forces a self.ts.close() after # most operations so it doesn't leave # any lingering locks. self._cached_rpmdb_mtime = None self._cache = { 'provides' : { }, 'requires' : { }, 'conflicts' : { }, 'obsoletes' : { }, } addldb_path = os.path.normpath(self._persistdir + '/yumdb') version_path = os.path.normpath(cachedir + '/version') self.yumdb = RPMDBAdditionalData(db_path=addldb_path, version_path=version_path) def _get_pkglist(self): '''Getter for the pkglist property. Returns a list of package tuples. ''' if not self._simple_pkgtup_list: csumpkgtups = self.preloadPackageChecksums(load_packages=False) if csumpkgtups is not None: self._simple_pkgtup_list = csumpkgtups.keys() if not self._simple_pkgtup_list: for (hdr, mi) in self._get_packages(): self._simple_pkgtup_list.append(self._hdr2pkgTuple(hdr)) return self._simple_pkgtup_list pkglist = property(_get_pkglist, None) def dropCachedData(self): """ Drop all cached data, this is a big perf. hit if we need to load the data back in again. Also note that if we ever call this while a transaction is ongoing we'll have multiple copies of packages which is _bad_. """ self._idx2pkg = {} self._name2pkg = {} self._pkgnames_loaded = set() self._tup2pkg = {} self._completely_loaded = False self._pkgmatch_fails = set() self._pkgname_fails = set() self._provmatch_fails = set() self._simple_pkgtup_list = [] self._get_pro_cache = {} self._get_req_cache = {} # We can be called on python shutdown (due to yb.__del__), at which # point other modules might not be available. if misc is not None: misc.unshare_data() self._cache = { 'provides' : { }, 'requires' : { }, 'conflicts' : { }, 'obsoletes' : { }, } self._have_cached_rpmdbv_data = None self._cached_conflicts_data = None self.transactionReset() # Should do nothing, but meh... self._cached_rpmdb_mtime = None def dropCachedDataPostTransaction(self, txmbrs): """ Drop cached data that is assocciated with the given transaction, this tries to keep as much data as possible and even does a "preload" on the checksums. This should be called once, when a transaction is complete. """ # -- Below -- self._idx2pkg = {} # -- Below -- self._name2pkg = {} # -- Below -- self._pkgnames_loaded = set() # -- Below -- self._tup2pkg = {} self._completely_loaded = False self._pkgmatch_fails = set() # -- Below -- self._pkgname_fails = set() self._provmatch_fails = set() self._simple_pkgtup_list = [] self._get_pro_cache = {} self._get_req_cache = {} # We can be called on python shutdown (due to yb.__del__), at which # point other modules might not be available. if misc is not None: misc.unshare_data() self._cache = { 'provides' : { }, 'requires' : { }, 'conflicts' : { }, 'obsoletes' : { }, } self._have_cached_rpmdbv_data = None self._cached_conflicts_data = None self.transactionReset() # Should do nothing, but meh... # We are keeping some data from before, and sometimes (Eg. remove only) # we never open the rpmdb again ... so get the mtime now. rpmdbfname = self._rpmdbpath + "/Packages" self._cached_rpmdb_mtime = os.path.getmtime(rpmdbfname) def _safe_del(x, y): """ Make sure we never traceback here, because it screws our yumdb if we do. """ # Maybe use x.pop(y, None) ? if y in x: del x[y] precache = [] for txmbr in txmbrs: self._pkgnames_loaded.discard(txmbr.name) _safe_del(self._name2pkg, txmbr.name) if txmbr.output_state in constants.TS_INSTALL_STATES: self._pkgname_fails.discard(txmbr.name) precache.append(txmbr) if txmbr.reinstall: # For reinstall packages we have: # # 1. one txmbr: the new install. # 2. two rpmdb entries: the new; the old; # # ...so we need to remove the old one, given only the new # one. ipo = self._tup2pkg[txmbr.pkgtup] _safe_del(self._idx2pkg, ipo.idx) _safe_del(self._tup2pkg, txmbr.pkgtup) if txmbr.output_state in constants.TS_REMOVE_STATES: _safe_del(self._idx2pkg, txmbr.po.idx) _safe_del(self._tup2pkg, txmbr.pkgtup) for txmbr in precache: (n, a, e, v, r) = txmbr.pkgtup pkg = self.searchNevra(n, e, v, r, a) if not pkg: # Wibble? self._deal_with_bad_rpmdbcache("dCDPT(pkg checksums): %s" % txmbr) continue pkg = pkg[0] csum = txmbr.po.returnIdSum() if csum is None: continue (T, D) = (str(csum[0]), str(csum[1])) if ('checksum_type' in pkg.yumdb_info._read_cached_data or 'checksum_data' in pkg.yumdb_info._read_cached_data): continue pkg.yumdb_info._read_cached_data['checksum_type'] = T pkg.yumdb_info._read_cached_data['checksum_data'] = D def setCacheDir(self, cachedir): """ Sets the internal cachedir value for the rpmdb, to be the "rpmdb-indexes" directory in the persisent yum storage. """ if not os.path.normpath(cachedir).startswith(self.root): self._cachedir = self.root + '/' + cachedir else: self._cachedir = '/' + cachedir if hasattr(self, 'yumdb'): # Need to keep this up to date, after init. version_path = os.path.normpath(self._cachedir + '/version') self.yumdb.conf.version_path = version_path def readOnlyTS(self): if not self.ts: self.ts = initReadOnlyTransaction(root=self.root) if not self.ts.open: self.ts = initReadOnlyTransaction(root=self.root) return self.ts def buildIndexes(self): # Not used here return def _checkIndexes(self, failure='error'): # Not used here return def delPackage(self, obj): # Not supported with this sack type pass def searchAll(self, name, query_type='like'): result = {} # check provides tag = self.DEP_TABLE['provides'][0] mi = self._get_packages(patterns=[(tag, rpm.RPMMIRE_GLOB, name)]) for hdr, idx in mi: pkg = self._makePackageObject(hdr, idx) result.setdefault(pkg.pkgid, pkg) fileresults = self.searchFiles(name) for pkg in fileresults: result.setdefault(pkg.pkgid, pkg) return result.values() def searchFiles(self, name): """search the filelists in the rpms for anything matching name""" result = {} name = os.path.normpath(name) # Note that globs can't be done. As of 4.8.1: # mi.pattern('basenames', rpm.RPMMIRE_GLOB, name) # ...produces no results. for hdr, idx in self._get_packages('basenames', name): pkg = self._makePackageObject(hdr, idx) result.setdefault(pkg.pkgid, pkg) return result.values() def searchPrco(self, name, prcotype): result = self._cache[prcotype].get(name) if result is not None: return result (n,f,(e,v,r)) = misc.string_to_prco_tuple(name) glob = False if misc.re_glob(n): glob = True result = {} tag = self.DEP_TABLE[prcotype][0] for hdr, idx in self._get_packages(tag, misc.to_utf8(n)): po = self._makePackageObject(hdr, idx) if not glob: if po.checkPrco(prcotype, (n, f, (e,v,r))): result[po.pkgid] = po else: result[po.pkgid] = po # If it's not a provides or filename, we are done if prcotype == 'provides' and name[0] == '/': fileresults = self.searchFiles(name) for pkg in fileresults: result[pkg.pkgid] = pkg result = result.values() self._cache[prcotype][name] = result return result def searchProvides(self, name): if name in self._provmatch_fails: return [] ret = self.searchPrco(name, 'provides') if not ret: self._provmatch_fails.add(name) return ret def searchRequires(self, name): return self.searchPrco(name, 'requires') def searchObsoletes(self, name): return self.searchPrco(name, 'obsoletes') def searchConflicts(self, name): return self.searchPrco(name, 'conflicts') def simplePkgList(self): return self.pkglist installed = PackageSackBase.contains def returnNewestByNameArch(self, naTup=None, patterns=None): #FIXME - should this (or any packagesack) be returning tuples? if not naTup: return (name, arch) = naTup allpkg = self._search(name=name, arch=arch) if not allpkg: raise Errors.PackageSackError, 'No Package Matching %s' % name return [ po.pkgtup for po in misc.newestInList(allpkg) ] def returnNewestByName(self, name=None): if not name: return allpkgs = self._search(name=name) if not allpkgs: raise Errors.PackageSackError, 'No Package Matching %s' % name return misc.newestInList(allpkgs) @staticmethod def _compile_patterns(patterns, ignore_case=False): if not patterns or len(patterns) > constants.PATTERNS_MAX: return None ret = [] for pat in patterns: if not pat: continue qpat = pat[0] if qpat in ('?', '*', '['): qpat = None elif ignore_case: qpat = qpat.lower() ret.append((qpat, misc.compile_pattern(pat, ignore_case))) return ret @staticmethod def _match_repattern(repatterns, hdr, ignore_case): """ This is basically parsePackages() but for rpm hdr objects. """ if repatterns is None: return True for qpat, repat in repatterns: epoch = hdr['epoch'] if epoch is None: epoch = '0' else: epoch = str(epoch) qname = hdr['name'][0] if ignore_case: qname = qname.lower() if qpat is not None and qpat != qname and qpat != epoch[0]: continue if repat(hdr['name']): return True if repat("%(name)s-%(version)s-%(release)s.%(arch)s" % hdr): return True if repat("%(name)s.%(arch)s" % hdr): return True if repat("%(name)s-%(version)s" % hdr): return True if repat("%(name)s-%(version)s-%(release)s" % hdr): return True if repat(epoch + ":%(name)s-%(version)s-%(release)s.%(arch)s" % hdr): return True if repat(("%(name)s-" + epoch + ":%(version)s-%(release)s.%(arch)s") % hdr): return True return False def returnPackages(self, repoid=None, patterns=None, ignore_case=False): """Returns a list of packages. Note that the packages are always filtered to those matching the patterns/case. repoid is ignored, and is just here for compatibility with non-rpmdb sacks. """ # See if we can load the "patterns" via. dbMatch('name', ...) because # that's basically instant and walking the entire rpmdb isn't. # We assume that if we get "Yum" and _something_ matches, that we have # _all_ the matches. IOW there can be either Yum or yum, but not BOTH. if not self._completely_loaded and patterns: ret = [] for pat in patterns: # We aren't wasting anything here, because the next bit # will pick up any loads :) pkgs = self.searchNames([pat]) if not pkgs: # We could be given gliBc or mysql if ignore_case: break # We need to do a big search for 'pkg*' if misc.re_glob(pat): break # We need to do a big search for 'pkg-1.2' if '-' in pat: break # We need to do a big search for 'pkg.noarch' if '.' in pat: break # We don't need to do a big search for '0:pkg', because # isn't possible ... and envra matches the above. # if ':' in pat: # break # At this point we have just found something that doesn't # match, like "yum list zzuf" ... we don't want this to take # the much slower path. ret.extend(pkgs) else: return ret ret = [] if patterns and not ignore_case: tpats = [] for pat in patterns: if pat in self._pkgmatch_fails: continue if pat in self._pkgnames_loaded: ret.extend(self._name2pkg[pat]) continue tpats.append(pat) patterns = tpats if not patterns: return ret if not self._completely_loaded: rpats = self._compile_patterns(patterns, ignore_case) for hdr, idx in self._get_packages(): if self._match_repattern(rpats, hdr, ignore_case): self._makePackageObject(hdr, idx) self._completely_loaded = rpats is None pkgobjlist = self._idx2pkg.values() # Remove gpg-pubkeys, as no sane callers expects/likes them... if self._loaded_gpg_keys: pkgobjlist = [pkg for pkg in pkgobjlist if pkg.name != 'gpg-pubkey'] if patterns: pkgobjlist = parsePackages(pkgobjlist, patterns, not ignore_case) self._pkgmatch_fails.update(pkgobjlist[2]) if ret: pkgobjlist = pkgobjlist[0] + pkgobjlist[1] + ret else: pkgobjlist = pkgobjlist[0] + pkgobjlist[1] for pkg in pkgobjlist: for pat in patterns: if pkg.name == pat: self._pkgnames_loaded.add(pkg.name) return pkgobjlist def _uncached_returnConflictPackages(self): """ Load the packages which have conflicts from the rpmdb, newer versions of rpm have an index here so this is as fast as cached (we test rpm version at cache write time). """ if self._cached_conflicts_data is None: result = {} for hdr, idx in self._get_packages('conflictname'): if not hdr[rpm.RPMTAG_CONFLICTNAME]: # Pre. rpm-4.9.x the above dbMatch() does nothing. continue po = self._makePackageObject(hdr, idx) result[po.pkgid] = po if po._has_hdr: continue # Unlikely, but, meh... po.hdr = hdr po._has_hdr = True po.conflicts po._has_hdr = False del po.hdr self._cached_conflicts_data = result.values() return self._cached_conflicts_data def _write_conflicts_new(self, pkgs, rpmdbv): if not os.access(self._cachedir, os.W_OK): return conflicts_fname = self._cachedir + '/conflicts' fo = _open_no_umask(conflicts_fname + '.tmp', 'w') fo.write("%s\n" % rpmdbv) fo.write("%u\n" % len(pkgs)) for pkg in sorted(pkgs): for var in pkg.pkgtup: fo.write("%s\n" % var) fo.close() os.rename(conflicts_fname + '.tmp', conflicts_fname) def _write_conflicts(self, pkgs): rpmdbv = self.simpleVersion(main_only=True)[0] self._write_conflicts_new(pkgs, rpmdbv) def _uncached_returnObsoletePackages(self): """ Load the packages which have obsoletes from the rpmdb, this is needed because newer rpm's have obsoletes imply conflicts. """ if self._cached_obsoletes_data is None: result = {} for hdr, idx in self._get_packages('obsoletename'): if not hdr[rpm.RPMTAG_OBSOLETENAME]: # Pre. rpm-4.9.x the above dbMatch() does nothing. continue po = self._makePackageObject(hdr, idx) result[po.pkgid] = po if po._has_hdr: continue # Unlikely, but, meh... po.hdr = hdr po._has_hdr = True po.obsoletes po._has_hdr = False del po.hdr self._cached_obsoletes_data = result.values() return self._cached_obsoletes_data def _write_obsoletes_new(self, pkgs, rpmdbv): if not os.access(self._cachedir, os.W_OK): return obsoletes_fname = self._cachedir + '/obsoletes' fo = _open_no_umask(obsoletes_fname + '.tmp', 'w') fo.write("%s\n" % rpmdbv) fo.write("%u\n" % len(pkgs)) for pkg in sorted(pkgs): for var in pkg.pkgtup: fo.write("%s\n" % var) fo.close() os.rename(obsoletes_fname + '.tmp', obsoletes_fname) def _write_obsoletes(self, pkgs): rpmdbv = self.simpleVersion(main_only=True)[0] self._write_obsoletes_new(pkgs, rpmdbv) def _deal_with_bad_rpmdbcache(self, caller): """ This shouldn't be called, but people are hitting weird stuff so we want to deal with it so it doesn't stay broken "forever". """ misc.unlink_f(self._cachedir + "/version") misc.unlink_f(self._cachedir + '/conflicts') misc.unlink_f(self._cachedir + '/obsoletes') misc.unlink_f(self._cachedir + '/file-requires') misc.unlink_f(self._cachedir + '/pkgtups-checksums') # We have a couple of options here, we can: # # . Ignore it and continue - least invasive, least likely to get any # bugs fixed. # # . Ignore it and continue, when not in debug mode - Helps users doing # weird things (and we won't know), but normal bugs will be seen by # anyone not running directly from a package. # # . Always throw - but at least it shouldn't happen again. # if __debug__: raise Errors.PackageSackError, 'Rpmdb checksum is invalid: %s' % caller def _read_pkglist(self, fname): if not self.__cache_rpmdb__: return None def _read_str(fo): return fo.readline()[:-1] full_fname = self._cachedir + '/' + fname fo, e = _iopen(full_fname) if fo is None: return None frpmdbv = fo.readline() rpmdbv = self.simpleVersion(main_only=True)[0] if not frpmdbv or rpmdbv != frpmdbv[:-1]: return None ret = [] try: # Read the pkgs... pkgtups_num = int(_read_str(fo)) while pkgtups_num > 0: pkgtups_num -= 1 # n, a, e, v, r pkgtup = (_read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo)) int(pkgtup[2]) # Check epoch is valid ret.extend(self.searchPkgTuple(pkgtup)) if fo.readline() != '': # Should be EOF return None except ValueError: self._deal_with_bad_rpmdbcache(fname) return None return ret def _read_conflicts(self): self._cached_conflicts_data = self._read_pkglist("conflicts") return self._cached_conflicts_data def transactionCacheConflictPackages(self, pkgs): if self.__cache_rpmdb__: self._trans_cache_store['conflicts'] = pkgs def returnConflictPackages(self): """ Return a list of packages that have conflicts. """ pkgs = self._read_conflicts() if pkgs is None: pkgs = self._uncached_returnConflictPackages() if self.__cache_rpmdb__: self._write_conflicts(pkgs) return pkgs def transactionCacheObsoletePackages(self, pkgs): if self.__cache_rpmdb__: self._trans_cache_store['obsoletes'] = pkgs def _read_obsoletes(self): self._cached_obsoletes_data = self._read_pkglist("obsoletes") return self._cached_obsoletes_data def returnObsoletePackages(self): """ Return a list of packages that have obsoletes. """ pkgs = self._read_obsoletes() if pkgs is None: pkgs = self._uncached_returnObsoletePackages() if self.__cache_rpmdb__: self._write_obsoletes(pkgs) return pkgs def transactionResultVersion(self, rpmdbv): """ We are going to do a transaction, and the parameter will be the rpmdb version when we finish. The idea being we can update all our rpmdb caches for that rpmdb version. """ if not self.__cache_rpmdb__: self._trans_cache_store = {} return if 'conflicts' in self._trans_cache_store: pkgs = self._trans_cache_store['conflicts'] self._write_conflicts_new(pkgs, rpmdbv) if 'obsoletes' in self._trans_cache_store: pkgs = self._trans_cache_store['obsoletes'] self._write_obsoletes_new(pkgs, rpmdbv) if 'file-requires' in self._trans_cache_store: data = self._trans_cache_store['file-requires'] self._write_file_requires(rpmdbv, data) if 'pkgtups-checksums' in self._trans_cache_store: data = self._trans_cache_store['pkgtups-checksums'] self._write_package_checksums(rpmdbv, data) self._trans_cache_store = {} def transactionReset(self): """ We are going to reset the transaction, because the data we've added already might now be invalid (Eg. skip-broken, or splitting a transaction). """ self._trans_cache_store = {} def returnGPGPubkeyPackages(self): """ Return packages of the gpg-pubkeys ... hacky. """ ts = self.readOnlyTS() mi = ts.dbMatch('name', 'gpg-pubkey') ret = [] for hdr in mi: self._loaded_gpg_keys = True ret.append(self._makePackageObject(hdr, mi.instance())) return ret def _read_file_requires(self): def _read_str(fo): return fo.readline()[:-1] assert self.__cache_rpmdb__ fo, e = _iopen(self._cachedir + '/file-requires') if fo is None: return None, None rpmdbv = self.simpleVersion(main_only=True)[0] frpmdbv = fo.readline() if not frpmdbv or rpmdbv != frpmdbv[:-1]: return None, None iFR = {} iFP = {} try: # Read the requires... pkgtups_num = int(_read_str(fo)) while pkgtups_num > 0: pkgtups_num -= 1 # n, a, e, v, r pkgtup = (_read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo)) int(pkgtup[2]) # Check epoch is valid files_num = int(_read_str(fo)) while files_num > 0: files_num -= 1 fname = _read_str(fo) iFR.setdefault(pkgtup, []).append(fname) # Read the provides... files_num = int(_read_str(fo)) while files_num > 0: files_num -= 1 fname = _read_str(fo) pkgtups_num = int(_read_str(fo)) while pkgtups_num > 0: pkgtups_num -= 1 # n, a, e, v, r pkgtup = (_read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo)) int(pkgtup[2]) # Check epoch is valid iFP.setdefault(fname, []).append(pkgtup) if fo.readline() != '': # Should be EOF return None, None except ValueError: self._deal_with_bad_rpmdbcache("file requires") return None, None return iFR, iFP def fileRequiresData(self): """ Get a cached copy of the fileRequiresData for depsolving/checkFileRequires, note the giant comment in that function about how we don't keep this perfect for the providers of the requires. """ if self.__cache_rpmdb__: iFR, iFP = self._read_file_requires() if iFR is not None: return iFR, set(), iFP installedFileRequires = {} installedUnresolvedFileRequires = set() resolved = set() for pkg in self.returnPackages(): for name, flag, evr in pkg.requires: if not name.startswith('/'): continue installedFileRequires.setdefault(pkg.pkgtup, []).append(name) if name not in resolved: dep = self.getProvides(name, flag, evr) resolved.add(name) if not dep: installedUnresolvedFileRequires.add(name) fileRequires = set() for fnames in installedFileRequires.itervalues(): fileRequires.update(fnames) installedFileProviders = {} for fname in fileRequires: pkgtups = [pkg.pkgtup for pkg in self.getProvides(fname)] installedFileProviders[fname] = pkgtups ret = (installedFileRequires, installedUnresolvedFileRequires, installedFileProviders) if self.__cache_rpmdb__: rpmdbv = self.simpleVersion(main_only=True)[0] self._write_file_requires(rpmdbv, ret) return ret def transactionCacheFileRequires(self, installedFileRequires, installedUnresolvedFileRequires, installedFileProvides, problems): if not self.__cache_rpmdb__: return if installedUnresolvedFileRequires or problems: return data = (installedFileRequires, installedUnresolvedFileRequires, installedFileProvides) self._trans_cache_store['file-requires'] = data def _write_file_requires(self, rpmdbversion, data): if not os.access(self._cachedir, os.W_OK): return (installedFileRequires, installedUnresolvedFileRequires, installedFileProvides) = data # Have to do this here, as well as in transactionCacheFileRequires, # because fileRequiresData() calls us directly. if installedUnresolvedFileRequires: return fo = _open_no_umask(self._cachedir + '/file-requires.tmp', 'w') fo.write("%s\n" % rpmdbversion) fo.write("%u\n" % len(installedFileRequires)) for pkgtup in sorted(installedFileRequires): for var in pkgtup: fo.write("%s\n" % var) filenames = set(installedFileRequires[pkgtup]) fo.write("%u\n" % len(filenames)) for fname in sorted(filenames): fo.write("%s\n" % fname) fo.write("%u\n" % len(installedFileProvides)) for fname in sorted(installedFileProvides): fo.write("%s\n" % fname) pkgtups = set(installedFileProvides[fname]) fo.write("%u\n" % len(pkgtups)) for pkgtup in sorted(pkgtups): for var in pkgtup: fo.write("%s\n" % var) fo.close() os.rename(self._cachedir + '/file-requires.tmp', self._cachedir + '/file-requires') def preloadPackageChecksums(self, load_packages=True): """ As simpleVersion() et. al. requires it, we "cache" this yumdb data as part of our rpmdb cache. We cache it with rpmdb data, even though someone _could_ use yumdb to alter it without changing the rpmdb ... don't do that. NOTE: This is also used as a cache of pkgtups in the rpmdb. """ if not self.__cache_rpmdb__: return def _read_str(fo): return fo.readline()[:-1] fo, e = _iopen(self._cachedir + '/pkgtups-checksums') if fo is None: return rpmdbv = self.simpleVersion(main_only=True)[0] frpmdbv = fo.readline() if not frpmdbv or rpmdbv != frpmdbv[:-1]: return checksum_data = {} try: # Read the checksums... pkgtups_num = int(_read_str(fo)) while pkgtups_num > 0: pkgtups_num -= 1 # n, a, e, v, r pkgtup = (_read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo), _read_str(fo)) int(pkgtup[2]) # Check epoch is valid T = _read_str(fo) D = _read_str(fo) if T == '-': checksum_data[pkgtup] = None else: checksum_data[pkgtup] = (T, D) if fo.readline() != '': # Should be EOF return except ValueError: self._deal_with_bad_rpmdbcache("pkg checksums") return if not load_packages: return checksum_data for pkgtup in checksum_data: if checksum_data[pkgtup] is None: continue (n, a, e, v, r) = pkgtup pkg = self.searchNevra(n, e, v, r, a) if not pkg: self._deal_with_bad_rpmdbcache("pkg checksums: %s-%s:%s-%s.%s" % (n, e, v, r, a)) continue pkg = pkg[0] (T, D) = checksum_data[pkgtup] if ('checksum_type' in pkg.yumdb_info._read_cached_data or 'checksum_data' in pkg.yumdb_info._read_cached_data): continue pkg.yumdb_info._read_cached_data['checksum_type'] = T pkg.yumdb_info._read_cached_data['checksum_data'] = D def transactionCachePackageChecksums(self, pkg_checksum_tups): if not self.__cache_rpmdb__: return self._trans_cache_store['pkgtups-checksums'] = pkg_checksum_tups def _write_package_checksums(self, rpmdbversion, data): if not os.access(self._cachedir, os.W_OK): return pkg_checksum_tups = data fo = _open_no_umask(self._cachedir + '/pkgtups-checksums.tmp', 'w') fo.write("%s\n" % rpmdbversion) fo.write("%u\n" % len(pkg_checksum_tups)) for pkgtup, TD in sorted(pkg_checksum_tups): for var in pkgtup: fo.write("%s\n" % var) if TD is None: TD = ('-', '-') for var in TD: fo.write("%s\n" % var) fo.close() os.rename(self._cachedir + '/pkgtups-checksums.tmp', self._cachedir + '/pkgtups-checksums') def _get_cached_simpleVersion_main(self): """ Return the cached string of the main rpmdbv. """ if self._have_cached_rpmdbv_data is not None: return self._have_cached_rpmdbv_data if not self.__cache_rpmdb__: return None # This test is "obvious" and the only thing to come out of: # http://lists.rpm.org/pipermail/rpm-maint/2007-November/001719.html # ...if anything gets implemented, we should change. rpmdbvfname = self._cachedir + "/version" rpmdbfname = self._rpmdbpath + "/Packages" if os.path.exists(rpmdbvfname) and os.path.exists(rpmdbfname): # See if rpmdb has "changed" ... nmtime = os.path.getmtime(rpmdbvfname) omtime = os.path.getmtime(rpmdbfname) if omtime <= nmtime: fo, e = _iopen(rpmdbvfname) if fo is None: return None rpmdbv = fo.readline()[:-1] self._have_cached_rpmdbv_data = rpmdbv return self._have_cached_rpmdbv_data def _put_cached_simpleVersion_main(self, rpmdbv): self._have_cached_rpmdbv_data = str(rpmdbv) if not self.__cache_rpmdb__: return if self._cached_rpmdb_mtime is None: return # We haven't loaded any packages!!! rpmdbfname = self._rpmdbpath + "/Packages" if not os.path.exists(rpmdbfname): return # haha _cached_rpmdb_mtime = os.path.getmtime(rpmdbfname) if self._cached_rpmdb_mtime != _cached_rpmdb_mtime: # Something altered the rpmdb since we loaded our first package, # so don't save the rpmdb version as who knows what happened. return rpmdbvfname = self._cachedir + "/version" if not os.access(self._cachedir, os.W_OK): if os.path.exists(self._cachedir): return try: _makedirs_no_umask(self._cachedir) except (IOError, OSError), e: return fo = _open_no_umask(rpmdbvfname + ".tmp", "w") fo.write(self._have_cached_rpmdbv_data) fo.write('\n') fo.close() os.rename(rpmdbvfname + ".tmp", rpmdbvfname) def simpleVersion(self, main_only=False, groups={}): """ Return a simple version for all installed packages. """ def _up_revs(irepos, repoid, rev, pkg, csum): irevs = irepos.setdefault(repoid, {}) rpsv = irevs.setdefault(None, PackageSackVersion()) rpsv.update(pkg, csum) if rev is not None: rpsv = irevs.setdefault(rev, PackageSackVersion()) rpsv.update(pkg, csum) if main_only and not groups: rpmdbv = self._get_cached_simpleVersion_main() if rpmdbv is not None: return [rpmdbv, {}] main = PackageSackVersion() irepos = {} main_grps = {} irepos_grps = {} for pkg in sorted(self.returnPackages()): ydbi = pkg.yumdb_info csum = None if 'checksum_type' in ydbi and 'checksum_data' in ydbi: csum = (ydbi.checksum_type, ydbi.checksum_data) main.update(pkg, csum) for group in groups: if pkg.name in groups[group]: if group not in main_grps: main_grps[group] = PackageSackVersion() irepos_grps[group] = {} main_grps[group].update(pkg, csum) if main_only: continue repoid = 'installed' rev = None if 'from_repo' in pkg.yumdb_info: repoid = '@' + pkg.yumdb_info.from_repo if 'from_repo_revision' in pkg.yumdb_info: rev = pkg.yumdb_info.from_repo_revision _up_revs(irepos, repoid, rev, pkg, csum) for group in groups: if pkg.name in groups[group]: _up_revs(irepos_grps[group], repoid, rev, pkg, csum) if self._have_cached_rpmdbv_data is None: self._put_cached_simpleVersion_main(main) if groups: return [main, irepos, main_grps, irepos_grps] return [main, irepos] @staticmethod def _find_search_fields(fields, searchstrings, hdr): count = 0 for s in searchstrings: for field in fields: value = to_unicode(hdr[field]) if value and value.lower().find(s) != -1: count += 1 break return count def searchPrimaryFieldsMultipleStrings(self, fields, searchstrings, lowered=False): if not lowered: searchstrings = map(lambda x: x.lower(), searchstrings) ret = [] for hdr, idx in self._get_packages(): n = self._find_search_fields(fields, searchstrings, hdr) if n > 0: ret.append((self._makePackageObject(hdr, idx), n)) return ret def searchNames(self, names=[]): returnList = [] for name in names: returnList.extend(self._search(name=name)) return returnList def searchNevra(self, name=None, epoch=None, ver=None, rel=None, arch=None): return self._search(name, epoch, ver, rel, arch) def excludeArchs(self, archlist): pass def returnLeafNodes(self, repoid=None): ts = self.readOnlyTS() return [ self._makePackageObject(h, mi) for (h, mi) in ts.returnLeafNodes(headers=True) ] # Helper functions def _get_packages(self, *args, **kwds): '''dbMatch() wrapper generator that yields (header, index) for matches ''' ts = self.readOnlyTS() mi = ts.dbMatch(*args, **kwds) for h in mi: if h['name'] != 'gpg-pubkey': yield (h, mi.instance()) del mi if self.auto_close: self.ts.close() def _search(self, name=None, epoch=None, ver=None, rel=None, arch=None): '''List of matching packages, to zero or more of NEVRA.''' if name is not None and name in self._pkgname_fails: return [] pkgtup = (name, arch, epoch, ver, rel) if pkgtup in self._tup2pkg: return [self._tup2pkg[pkgtup]] loc = locals() ret = [] if self._completely_loaded or name in self._pkgnames_loaded: if name is not None: pkgs = self._name2pkg.get(name, []) if not pkgs: self._pkgname_fails.add(name) else: pkgs = self.returnPackages() for po in pkgs: for tag in ('arch', 'rel', 'ver', 'epoch'): if loc[tag] is not None and loc[tag] != getattr(po, tag): break else: ret.append(po) return ret ts = self.readOnlyTS() if name is not None: mi = self._get_packages('name', name) elif arch is not None: mi = self._get_packages('arch', arch) else: mi = self._get_packages() self._completely_loaded = True done = False for hdr, idx in mi: po = self._makePackageObject(hdr, idx) # We create POs out of all matching names, even if we don't return # them. self._pkgnames_loaded.add(po.name) done = True for tag in ('arch', 'rel', 'ver', 'epoch'): if loc[tag] is not None and loc[tag] != getattr(po, tag): break else: ret.append(po) if not done and name is not None: self._pkgname_fails.add(name) return ret def _makePackageObject(self, hdr, index): if index in self._idx2pkg: return self._idx2pkg[index] po = RPMInstalledPackage(hdr, index, self) self._idx2pkg[index] = po self._name2pkg.setdefault(po.name, []).append(po) self._tup2pkg[po.pkgtup] = po if self.__cache_rpmdb__ and self._cached_rpmdb_mtime is None: rpmdbfname = self._rpmdbpath + "/Packages" self._cached_rpmdb_mtime = os.path.getmtime(rpmdbfname) return po def _hdr2pkgTuple(self, hdr): name = misc.share_data(hdr['name']) arch = misc.share_data(hdr['arch']) # convert these to strings to be sure ver = misc.share_data(str(hdr['version'])) rel = misc.share_data(str(hdr['release'])) epoch = hdr['epoch'] if epoch is None: epoch = '0' else: epoch = str(epoch) epoch = misc.share_data(epoch) return misc.share_data((name, arch, epoch, ver, rel)) # deprecated options for compat only - remove once rpmdb is converted: def getPkgList(self): warnings.warn('getPkgList() will go away in a future version of Yum.\n' 'Please access this via the pkglist attribute.', DeprecationWarning, stacklevel=2) return self.pkglist def getHdrList(self): warnings.warn('getHdrList() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) return [ hdr for hdr, idx in self._get_packages() ] def getNameArchPkgList(self): warnings.warn('getNameArchPkgList() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) lst = [] for (name, arch, epoch, ver, rel) in self.pkglist: lst.append((name, arch)) return miscutils.unique(lst) def getNamePkgList(self): warnings.warn('getNamePkgList() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) lst = [] for (name, arch, epoch, ver, rel) in self.pkglist: lst.append(name) return miscutils.unique(lst) def returnTupleByKeyword(self, name=None, arch=None, epoch=None, ver=None, rel=None): warnings.warn('returnTuplebyKeyword() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) return [po.pkgtup for po in self._search(name=name, arch=arch, epoch=epoch, ver=ver, rel=rel)] def returnHeaderByTuple(self, pkgtuple): warnings.warn('returnHeaderByTuple() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) """returns a list of header(s) based on the pkgtuple provided""" (n, a, e, v, r) = pkgtuple lst = self.searchNevra(name=n, arch=a, epoch=e, ver=v, rel=r) if len(lst) > 0: item = lst[0] return [item.hdr] else: return [] def returnIndexByTuple(self, pkgtuple): """returns a list of header indexes based on the pkgtuple provided""" warnings.warn('returnIndexbyTuple() will go away in a future version of Yum.\n', DeprecationWarning, stacklevel=2) name, arch, epoch, version, release = pkgtuple # Normalise epoch if epoch in (None, 0, '(none)', ''): epoch = '0' return [po.idx for po in self._search(name, epoch, version, release, arch)] def addDB(self, ts): # Can't support this now raise NotImplementedError @staticmethod def _genDeptup(name, flags, version): """ Given random stuff, generate a usable dep tuple. """ if flags == 0: flags = None if type(version) is types.StringType: (r_e, r_v, r_r) = miscutils.stringToVersion(version) # would this ever be a ListType? elif type(version) in (types.TupleType, types.ListType): (r_e, r_v, r_r) = version else: # FIXME: This isn't always type(version) is types.NoneType: # ...not sure what it is though, come back to this r_e = r_v = r_r = None deptup = (name, misc.share_data(flags), (misc.share_data(r_e), misc.share_data(r_v), misc.share_data(r_r))) return misc.share_data(deptup) def getProvides(self, name, flags=None, version=(None, None, None)): """searches the rpmdb for what provides the arguments returns a list of pkg objects of providing packages, possibly empty""" name = misc.share_data(name) deptup = self._genDeptup(name, flags, version) if deptup in self._get_pro_cache: return self._get_pro_cache[deptup] r_v = deptup[2][1] pkgs = self.searchProvides(name) result = { } for po in pkgs: if name[0] == '/' and r_v is None: result[po] = [(name, None, (None, None, None))] continue hits = po.matchingPrcos('provides', deptup) if hits: result[po] = hits self._get_pro_cache[deptup] = result return result def whatProvides(self, name, flags, version): # XXX deprecate? return [po.pkgtup for po in self.getProvides(name, flags, version)] def getRequires(self, name, flags=None, version=(None, None, None)): """searches the rpmdb for what provides the arguments returns a list of pkgtuples of providing packages, possibly empty""" name = misc.share_data(name) deptup = self._genDeptup(name, flags, version) if deptup in self._get_req_cache: return self._get_req_cache[deptup] r_v = deptup[2][1] pkgs = self.searchRequires(name) result = { } for po in pkgs: if name[0] == '/' and r_v is None: # file dep add all matches to the defSack result[po] = [(name, None, (None, None, None))] continue hits = po.matchingPrcos('requires', deptup) if hits: result[po] = hits self._get_req_cache[deptup] = result return result def whatRequires(self, name, flags, version): # XXX deprecate? return [po.pkgtup for po in self.getRequires(name, flags, version)] def return_running_packages(self): """returns a list of yum installed package objects which own a file that are currently running or in use.""" pkgs = {} for pid in misc.return_running_pids(): for fn in misc.get_open_files(pid): for pkg in self.searchFiles(fn): pkgs[pkg] = 1 return sorted(pkgs.keys()) def check_dependencies(self, pkgs=None): """ Checks for any missing dependencies. """ if pkgs is None: pkgs = self.returnPackages() providers = set() # Speedup, as usual :) problems = [] for pkg in sorted(pkgs): # The sort here is mainly for "UI" for rreq in pkg.strong_requires: if rreq[0].startswith('rpmlib'): continue if rreq in providers: continue (req, flags, ver) = rreq if self.getProvides(req, flags, ver): providers.add(rreq) continue flags = yum.depsolve.flags.get(flags, flags) missing = miscutils.formatRequire(req, ver, flags) prob = RPMDBProblemDependency(pkg, "requires", missing=missing) problems.append(prob) for creq in pkg.conflicts: if creq[0].startswith('rpmlib'): continue (req, flags, ver) = creq res = self.getProvides(req, flags, ver) # Filter this pkg out, as self conflicts are allowed. nres = {} for conflicting_po in res: if conflicting_po.pkgtup[0] == pkg.pkgtup[0] and conflicting_po.pkgtup[2:] == pkg.pkgtup[2:]: continue nres[conflicting_po] = res[conflicting_po] res = nres if not res: continue flags = yum.depsolve.flags.get(flags, flags) found = miscutils.formatRequire(req, ver, flags) prob = RPMDBProblemDependency(pkg, "conflicts", found=found, conflicts=res) problems.append(prob) # Note that obsoletes are checked separately, and are name only. return problems def _iter_two_pkgs(self, ignore_provides): last = None for pkg in sorted(self.returnPackages()): if pkg.name in ignore_provides: continue if ignore_provides.intersection(set(pkg.provides_names)): continue if last is None: last = pkg continue yield last, pkg last = pkg def check_duplicates(self, ignore_provides=[]): """ Checks for any "duplicate packages" (those with multiple versions installed), we ignore any packages with a provide in the passed provide list (this is how installonlyworks, so we do the same). """ ignore_provides = set(ignore_provides) problems = [] for last, pkg in self._iter_two_pkgs(ignore_provides): if pkg.name != last.name: continue if pkg.verEQ(last) and pkg != last: if arch.isMultiLibArch(pkg.arch) and last.arch != 'noarch': continue if arch.isMultiLibArch(last.arch) and pkg.arch != 'noarch': continue # More than one pkg, they aren't version equal, or aren't multiarch problems.append(RPMDBProblemDuplicate(pkg, duplicate=last)) return problems def check_obsoleted(self): """ Checks for any packages which are obsoleted by other packages. """ obsoleters = [] problems = [] for pkg in sorted(self.returnPackages()): if not pkg.obsoletes: continue obsoleters.append(pkg) for pkg in sorted(self.returnPackages()): for obspo in pkg.obsoletedBy(obsoleters): problems.append(RPMDBProblemObsoleted(pkg, obsoleter=obspo)) return problems def check_provides(self): """ For each package, check that a provides search for it's name (and everything it provides) finds it. """ problems = [] for pkg in sorted(self.returnPackages()): for provtup in pkg.provides: name, flags, version = provtup if pkg not in self.getProvides(name, flags, version): problems.append(RPMDBProblemProvides(pkg, provide=provtup)) break return problems def _sanitize(path): return path.replace('/', '').replace('~', '') class RPMDBAdditionalData(object): """class for access to the additional data not able to be stored in the rpmdb""" # dir: /var/lib/yum/yumdb/ # pkgs stored in name[0]/name[1]/pkgid-name-ver-rel-arch dirs # dirs have files per piece of info we're keeping # repoid, install reason, status, blah, (group installed for?), notes? def __init__(self, db_path='/var/lib/yum/yumdb', version_path=None): self.conf = misc.GenericHolder() self.conf.db_path = db_path self.conf.version_path = version_path self.conf.writable = False self._packages = {} # pkgid = dir if not os.path.exists(self.conf.db_path): try: _makedirs_no_umask(self.conf.db_path) self.conf.writable = True except (IOError, OSError), e: # some sort of useful thing here? A warning? pass else: if os.access(self.conf.db_path, os.W_OK): self.conf.writable = True # Don't call _load_all_package_paths to preload, as it's expensive # if the dirs. aren't in cache. self.yumdb_cache = {'attr' : {}} def _load_all_package_paths(self): # glob the path and get a dict of pkgs to their subdir glb = '%s/*/*/' % self.conf.db_path pkgdirs = glob.glob(glb) for d in pkgdirs: pkgid = os.path.basename(d).split('-')[0] self._packages[pkgid] = d def _get_dir_name(self, pkgtup, pkgid): if pkgid in self._packages: return self._packages[pkgid] (n, a, e, v,r) = pkgtup n = _sanitize(n) # Please die in a fire rpmbuild thisdir = '%s/%s/%s-%s-%s-%s-%s' % (self.conf.db_path, n[0], pkgid, n, v, r, a) self._packages[pkgid] = thisdir return thisdir def get_package(self, po=None, pkgtup=None, pkgid=None): """Return an RPMDBAdditionalDataPackage Object for this package""" if po: thisdir = self._get_dir_name(po.pkgtup, po.pkgid) elif pkgtup and pkgid: thisdir = self._get_dir_name(pkgtup, pkgid) else: raise ValueError,"Pass something to RPMDBAdditionalData.get_package" return RPMDBAdditionalDataPackage(self.conf, thisdir, yumdb_cache=self.yumdb_cache) def sync_with_rpmdb(self, rpmdbobj): """populate out the dirs and remove all the items no longer in the rpmd and/or populate various bits to the currently installed version""" # TODO: # get list of all items in the yumdb # remove any no longer in the rpmdb/andor migrate them up to the currently # installed version # add entries for items in the rpmdb if they don't exist in the yumdb pass def _validate_from_repo(value): if value and value[0] == '/': # Local package; chop the slash as it's not a valid repoid char value = value[1:] return misc.validate_repoid(value) is None class RPMDBAdditionalDataPackage(object): # We do auto hardlink on these attributes _auto_hardlink_attrs = set(['checksum_type', 'reason', 'installed_by', 'changed_by', 'from_repo', 'from_repo_revision', 'from_repo_timestamp', 'releasever', 'group_member', 'command_line']) # Validate these attributes when they are read from a file _validators = { # Fixes BZ 1234967 'from_repo': _validate_from_repo, } def __init__(self, conf, pkgdir, yumdb_cache=None): self._conf = conf self._mydir = pkgdir self._read_cached_data = {} # 'from_repo' is the most often requested piece of data, and is often # the same for a huge number of packages. So we use hardlinks to share # data, and try to optimize for that. # It's useful for other keys too (installed_by/changed_by/reason/etc.) # so we make it generic. self._yumdb_cache = yumdb_cache def _auto_cache(self, attr, value, fn, info=None): """ Create caches for the attr. We have a per. object read cache so at worst we only have to read a single attr once. Then we expand that with (dev, ino) cache, so hardlink data can be read once for multiple packages. """ self._read_cached_data[attr] = value if self._yumdb_cache is None: return nlinks = 1 if info is not None: nlinks = info.st_nlink if nlinks <= 1 and attr not in self._auto_hardlink_attrs: return if value in self._yumdb_cache['attr']: sinfo = self._yumdb_cache['attr'][value][1] if info is not None and sinfo is not None: if (info.st_dev, info.st_ino) == (sinfo.st_dev, sinfo.st_ino): self._yumdb_cache['attr'][value][2].add(fn) self._yumdb_cache[fn] = value return if self._yumdb_cache['attr'][value][0] >= nlinks: # We already have a better cache file. return self._yumdb_cache['attr'][value] = (nlinks, info, set([fn])) self._yumdb_cache[fn] = value def _unlink_yumdb_cache(self, fn): """ Remove old values from the link cache. """ if fn in self._yumdb_cache: ovalue = self._yumdb_cache[fn] if ovalue in self._yumdb_cache['attr']: self._yumdb_cache['attr'][ovalue][2].discard(fn) if not self._yumdb_cache['attr'][ovalue][2]: del self._yumdb_cache['attr'][ovalue] del self._yumdb_cache[fn] def _link_yumdb_cache(self, fn, value): """ If we have a matching yumdb cache, link() to it instead of having to open()+write(). """ if self._yumdb_cache is None: return False self._unlink_yumdb_cache(fn) if value not in self._yumdb_cache['attr']: return False assert self._yumdb_cache['attr'][value][2] try: lfn = iter(self._yumdb_cache['attr'][value][2]).next() misc.unlink_f(fn + '.tmp') os.link(lfn, fn + '.tmp') os.rename(fn + '.tmp', fn) except: return False self._yumdb_cache['attr'][value][2].add(fn) self._yumdb_cache[fn] = value return True def _attr2fn(self, attr): """ Given an attribute, return the filename. """ return os.path.normpath(self._mydir + '/' + attr) def _write(self, attr, value): # check for self._conf.writable before going on? if not os.path.exists(self._mydir): _makedirs_no_umask(self._mydir) attr = _sanitize(attr) if attr in self._read_cached_data: del self._read_cached_data[attr] fn = self._attr2fn(attr) if attr.endswith('.tmp'): raise AttributeError, "Cannot set attribute %s on %s" % (attr, self) # These two are special, as they have an index and are used as our # cache-breaker. if attr in ('checksum_type', 'checksum_data'): misc.unlink_f(self._conf.version_path) # Auto hardlink some of the attrs... if self._link_yumdb_cache(fn, value): return # Default write()+rename()... hardlink -c can still help. misc.unlink_f(fn + '.tmp') fo = _open_no_umask(fn + '.tmp', 'w') try: fo.write(value) except (OSError, IOError), e: raise AttributeError, "Cannot set attribute %s on %s" % (attr, self) fo.flush() fo.close() del fo os.rename(fn + '.tmp', fn) # even works on ext4 now!:o self._auto_cache(attr, value, fn) def _read(self, attr): attr = _sanitize(attr) if attr in self._read_cached_data: return self._read_cached_data[attr] fn = self._attr2fn(attr) if attr.endswith('.tmp'): raise AttributeError, "%s has no attribute %s" % (self, attr) info = misc.stat_f(fn, ignore_EACCES=True) if info is None: raise AttributeError, "%s has no attribute %s" % (self, attr) if info.st_nlink > 1 and self._yumdb_cache is not None: key = (info.st_dev, info.st_ino) if key in self._yumdb_cache: self._auto_cache(attr, self._yumdb_cache[key], fn, info) return self._read_cached_data[attr] fo, e = _iopen(fn) if fo is None: # This really sucks, don't do that. return '' % e.errno value = fo.read() fo.close() del fo # Validate the attribute we just read from the file. Some attributes # may require being in a specific format and we can't guarantee the # file has not been tampered with outside of yum. if attr in self._validators: valid = self._validators[attr] if not valid(value): raise AttributeError, \ "Invalid value of attribute %s on %s" % (attr, self) if info.st_nlink > 1 and self._yumdb_cache is not None: self._yumdb_cache[key] = value self._auto_cache(attr, value, fn, info) return value def _delete(self, attr): """remove the attribute file""" attr = _sanitize(attr) fn = self._attr2fn(attr) if attr in self._read_cached_data: del self._read_cached_data[attr] self._unlink_yumdb_cache(fn) if os.path.exists(fn): try: os.unlink(fn) except (IOError, OSError): raise AttributeError, "Cannot delete attribute %s on %s " % (attr, self) def __getattr__(self, attr): return self._read(attr) def __setattr__(self, attr, value): if not attr.startswith('_'): self._write(attr, value) else: object.__setattr__(self, attr, value) def __delattr__(self, attr): if not attr.startswith('_'): self._delete(attr) else: object.__delattr__(self, attr) def __contains__(self, attr): # This is faster than __iter__ and it makes things fail in a much more # obvious way in weird FS corruption cases like: BZ 593436 x = self.get(attr) return x is not None def __iter__(self, show_hidden=False): for item in self._read_cached_data: yield item for item in glob.glob(self._mydir + '/*'): item = item[(len(self._mydir) + 1):] if item in self._read_cached_data: continue if not show_hidden and item.endswith('.tmp'): continue yield item def clean(self): # purge out everything for item in self.__iter__(show_hidden=True): self._delete(item) try: os.rmdir(self._mydir) except OSError: pass # def __dir__(self): # for 2.6 and beyond, apparently # return list(self.__iter__()) + self.__dict__.keys() def get(self, attr, default=None): """retrieve an add'l data obj""" try: res = self._read(attr) except AttributeError: return default return res def main(): sack = RPMDBPackageSack('/') for p in sack.simplePkgList(): print p if __name__ == '__main__': main() PK[[site-packages/yum/mdparser.pynuȯ#! /usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2005 Duke University import gzip try: from xml.etree import cElementTree except ImportError: import cElementTree iterparse = cElementTree.iterparse from cStringIO import StringIO import warnings import Errors #TODO: document everything here class MDParser: def __init__(self, filename): # Set up mapping of meta types to handler classes handlers = { '{http://linux.duke.edu/metadata/common}metadata': PrimaryEntry, '{http://linux.duke.edu/metadata/filelists}filelists': FilelistsEntry, '{http://linux.duke.edu/metadata/other}otherdata': OtherEntry, } self.total = None self.count = 0 self._handlercls = None # Read in type, set package node handler and get total number of # packages if filename[-3:] == '.gz': fh = gzip.open(filename, 'r') else: fh = open(filename, 'r') parser = iterparse(fh, events=('start', 'end')) self.reader = parser.__iter__() event, elem = self.reader.next() self._handlercls = handlers.get(elem.tag, None) if not self._handlercls: raise ValueError('Unknown repodata type "%s" in %s' % ( elem.tag, filename)) # Get the total number of packages self.total = int(elem.get('packages', 0)) def __iter__(self): return self def next(self): for event, elem in self.reader: if event == 'end' and elem.tag[-7:] == 'package': self.count += 1 return self._handlercls(elem) raise StopIteration class BaseEntry: def __init__(self, elem): self._p = {} def __getitem__(self, k): return self._p[k] def keys(self): return self._p.keys() def values(self): return self._p.values() def has_key(self, k): warnings.warn('has_key() will go away in a future version of Yum.\n', Errors.YumFutureDeprecationWarning, stacklevel=2) return k in self._p def __iter__(self): return iter(self._p) def __str__(self): out = StringIO() keys = self.keys() keys.sort() for k in keys: line = u'%s=%s\n' % (k, self[k]) out.write(line.encode('utf8')) return out.getvalue() def _bn(self, qn): if qn.find('}') == -1: return qn return qn.split('}')[1] def _prefixprops(self, elem, prefix): ret = {} for key in elem.attrib: ret[prefix + '_' + self._bn(key)] = elem.attrib[key] return ret class PrimaryEntry(BaseEntry): def __init__(self, elem): BaseEntry.__init__(self, elem) # Avoid excess typing :) p = self._p self.prco = {} self.files = {} for child in elem: name = self._bn(child.tag) if name in ('name', 'arch', 'summary', 'description', 'url', 'packager'): p[name] = child.text elif name == 'version': p.update(child.attrib) elif name in ('time', 'size'): p.update(self._prefixprops(child, name)) elif name in ('checksum', 'location'): p.update(self._prefixprops(child, name)) p[name + '_value'] = child.text if name == 'location' and "location_base" not in p: p["location_base"] = None elif name == 'format': self.setFormat(child) p['pkgId'] = p['checksum_value'] elem.clear() def setFormat(self, elem): # Avoid excessive typing :) p = self._p for child in elem: name = self._bn(child.tag) if name in ('license', 'vendor', 'group', 'buildhost', 'sourcerpm'): p[name] = child.text elif name in ('provides', 'requires', 'conflicts', 'obsoletes'): self.prco[name] = self.getPrco(child) elif name == 'header-range': p.update(self._prefixprops(child, 'rpm_header')) elif name == 'file': file_type = child.get('type', 'file') path = child.text self.files[path] = file_type def getPrco(self, elem): members = [] for child in elem: members.append(child.attrib) return members class FilelistsEntry(BaseEntry): def __init__(self, elem): BaseEntry.__init__(self, elem) self._p['pkgId'] = elem.attrib['pkgid'] self.files = {} for child in elem: name = self._bn(child.tag) if name == 'file': file_type = child.get('type', 'file') path = child.text self.files[path] = file_type elem.clear() class OtherEntry(BaseEntry): def __init__(self, elem): BaseEntry.__init__(self, elem) self._p['pkgId'] = elem.attrib['pkgid'] self._p['changelog'] = [] for child in elem: name = self._bn(child.tag) if name == 'changelog': entry = child.attrib entry['value'] = child.text self._p['changelog'].append(entry) elem.clear() def test(): import sys parser = MDParser(sys.argv[1]) for pkg in parser: print '-' * 40 print pkg print 'read: %s packages (%s suggested)' % (parser.count, parser.total) if __name__ == '__main__': test() PK[`"site-packages/yum/logginglevels.pynuȯ#! /usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ Custom logging levels for finer-grained logging using python's standard logging module. """ import os import socket import sys import logging import logging.handlers INFO_1 = 19 INFO_2 = 18 DEBUG_1 = 9 DEBUG_2 = 8 DEBUG_3 = 7 DEBUG_4 = 6 logging.addLevelName(INFO_1, "INFO_1") logging.addLevelName(INFO_2, "INFO_2") logging.addLevelName(DEBUG_1, "DEBUG_1") logging.addLevelName(DEBUG_2, "DEBUG_2") logging.addLevelName(DEBUG_3, "DEBUG_3") logging.addLevelName(DEBUG_4, "DEBUG_4") # High level to effectively turn off logging. # For compatibility with the old logging system. __NO_LOGGING = 100 logging.raiseExceptions = False from logging.handlers import SysLogHandler as syslog_module syslog = None # Mostly borrowed from original yum-updated.py _syslog_facility_map = { "KERN" : syslog_module.LOG_KERN, "USER" : syslog_module.LOG_USER, "MAIL" : syslog_module.LOG_MAIL, "DAEMON" : syslog_module.LOG_DAEMON, "AUTH" : syslog_module.LOG_AUTH, "LPR" : syslog_module.LOG_LPR, "NEWS" : syslog_module.LOG_NEWS, "UUCP" : syslog_module.LOG_UUCP, "CRON" : syslog_module.LOG_CRON, "LOCAL0" : syslog_module.LOG_LOCAL0, "LOCAL1" : syslog_module.LOG_LOCAL1, "LOCAL2" : syslog_module.LOG_LOCAL2, "LOCAL3" : syslog_module.LOG_LOCAL3, "LOCAL4" : syslog_module.LOG_LOCAL4, "LOCAL5" : syslog_module.LOG_LOCAL5, "LOCAL6" : syslog_module.LOG_LOCAL6, "LOCAL7" : syslog_module.LOG_LOCAL7,} def syslogFacilityMap(facility): if type(facility) == int: return facility elif facility.upper() in _syslog_facility_map: return _syslog_facility_map[facility.upper()] elif (facility.upper().startswith("LOG_") and facility[4:].upper() in _syslog_facility_map): return _syslog_facility_map[facility[4:].upper()] return _syslog_facility_map["USER"] def logLevelFromErrorLevel(error_level): """ Convert an old-style error logging level to the new style. """ error_table = { -1 : __NO_LOGGING, 0 : logging.CRITICAL, 1 : logging.ERROR, 2 : logging.WARNING} return __convertLevel(error_level, error_table) def logLevelFromDebugLevel(debug_level): """ Convert an old-style debug logging level to the new style. """ debug_table = {-5 : __NO_LOGGING, -4 : logging.CRITICAL, -3 : logging.ERROR, -2 : logging.WARNING, -1 : __NO_LOGGING, 0 : logging.INFO, 1 : INFO_1, 2 : INFO_2, 3 : logging.DEBUG, 4 : DEBUG_1, 5 : DEBUG_2, 6 : DEBUG_3, 7 : DEBUG_4} return __convertLevel(debug_level, debug_table) def __convertLevel(level, table): """ Convert yum logging levels using a lookup table. """ # Look up level in the table. try: new_level = table[level] except KeyError: keys = sorted(table.keys()) # We didn't find the level in the table, check if it's smaller # than the smallest level if level < keys[0]: new_level = table[keys[0]] # Nope. So it must be larger. else: new_level = table[keys[-2]] return new_level def setDebugLevel(level): converted_level = logLevelFromDebugLevel(level) logging.getLogger("yum.verbose").setLevel(converted_level) def setErrorLevel(level): converted_level = logLevelFromErrorLevel(level) logging.getLogger("yum").setLevel(converted_level) _added_handlers = False def doLoggingSetup(debuglevel, errorlevel, syslog_ident=None, syslog_facility=None, syslog_device='/dev/log'): """ Configure the python logger. errorlevel is optional. If provided, it will override the logging level provided in the logging config file for error messages. debuglevel is optional. If provided, it will override the logging level provided in the logging config file for debug messages. """ global _added_handlers #logging.basicConfig() # this appears to not change anything in our # logging setup - disabling this b/c of the behaviors in yum ticket 525 # -skvidal if _added_handlers: if debuglevel is not None: setDebugLevel(debuglevel) if errorlevel is not None: setErrorLevel(errorlevel) return plainformatter = logging.Formatter("%(message)s") console_stdout = logging.StreamHandler(sys.stdout) console_stdout.setFormatter(plainformatter) verbose = logging.getLogger("yum.verbose") verbose.propagate = False verbose.addHandler(console_stdout) console_stderr = logging.StreamHandler(sys.stderr) console_stderr.setFormatter(plainformatter) logger = logging.getLogger("yum") logger.propagate = False logger.addHandler(console_stderr) filelogger = logging.getLogger("yum.filelogging") filelogger.setLevel(logging.INFO) filelogger.propagate = False global syslog if syslog_device: address = None if ":" in syslog_device: address = syslog_device.rsplit(":", 1) address = (address[0], int(address[1])) elif os.path.exists(syslog_device): address = syslog_device if address: try: facil = syslogFacilityMap(syslog_facility or "USER") syslog = logging.handlers.SysLogHandler(address, facil) except socket.error: if syslog is not None: syslog.close() else: setLoggingApp(syslog_ident or "yum") filelogger.addHandler(syslog) _added_handlers = True if debuglevel is not None: setDebugLevel(debuglevel) if errorlevel is not None: setErrorLevel(errorlevel) def setFileLog(uid, logfile, cleanup=None): # TODO: When python's logging config parser doesn't blow up # when the user is non-root, put this in the config file. # syslog-style log if uid == 0: try: # For installroot etc. logdir = os.path.dirname(logfile) if not os.path.exists(logdir): os.makedirs(logdir, mode=0755) if not os.path.exists(logfile): f = open(logfile, 'w') os.chmod(logfile, 0600) # making sure umask doesn't catch us up f.close() filelogger = logging.getLogger("yum.filelogging") filehandler = logging.FileHandler(logfile) formatter = logging.Formatter("%(asctime)s %(message)s", "%b %d %H:%M:%S") filehandler.setFormatter(formatter) filelogger.addHandler(filehandler) if not cleanup is None: cleanup.append(lambda: filelogger.removeHandler(filehandler)) except IOError: logging.getLogger("yum").critical('Cannot open logfile %s', logfile) def setLoggingApp(app): if syslog: syslogformatter = logging.Formatter(app + "[%(process)d]: %(message)s") syslog.setFormatter(syslogformatter) PK[-W@uusite-packages/yum/pkgtag_db.pynuȯ#!/usr/bin/python -tt # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Copyright 2009 Red Hat, Inc # written by seth vidal # parse sqlite tag database # return pkgnames and tag that was matched from sqlutils import sqlite, executeSQL, sql_esc from Errors import PkgTagsError import sqlutils import sys import misc def catchSqliteException(func): """This decorator converts sqlite exceptions into PkgTagsError""" def newFunc(*args, **kwargs): try: return func(*args, **kwargs) except sqlutils.sqlite.Error, e: # 2.4.x requires this, but 2.6.x complains about even hasattr() # of e.message ... *sigh* if sys.hexversion < 0x02050000: if hasattr(e,'message'): raise PkgTagsError, str(e.message) else: raise PkgTagsError, str(e) raise PkgTagsError, str(e) newFunc.__name__ = func.__name__ newFunc.__doc__ = func.__doc__ newFunc.__dict__.update(func.__dict__) return newFunc class PackageTagDB(object): @catchSqliteException def __init__(self, repoid, sqlite_file): self.sqlite_file = sqlite_file self.repoid = repoid # take a path to the sqlite tag db # open it and leave a cursor in place for the db self._conn = sqlite.connect(sqlite_file) self.cur = self._conn.cursor() def _getTagsCount(self): ''' Unused, so no need to cache. ''' for n in self._sql_exec("select count(*) from packagetags",): return n[0] count = property(fget=lambda self: self._getTagsCount(), doc="Number of entries in the pkgtag DB") @catchSqliteException def _sql_exec(self, sql, *args): """ Exec SQL against an MD of the repo, return a cursor. """ executeSQL(self.cur, sql, *args) return self.cur def search_tags(self, tag): """Search by tag name/glob Return dict of dict[packagename] = [stringmatched, stringmatched, ...]""" res = {} (tag, esc) = sql_esc(tag) query = "SELECT name, tag, score FROM packagetags where tag like ? %s" % esc tag = '%' + tag + '%' rows = self._sql_exec(query, (tag,)) for (name, tag, score) in rows: if name not in res: res[name] = [] res[name].append(tag) return res def search_names(self, name): """Search by package name/glob. Return dict of dict[packagename] = [tag1, tag2, tag3, tag4, ...]""" res = {} (name, esc) = sql_esc(name) query = "SELECT name, tag, score FROM packagetags where name like ?%s " % esc name = '%' + name + '%' rows = self._sql_exec(query, (name,)) for (name, tag, score) in rows: if name not in res: res[name] = [] res[name].append(tag) return res class PackageTags(object): def __init__(self): self.db_objs = {} def add(self, repoid, sqlite_file): if repoid in self.db_objs: raise PkgTagsError, "Already added tags from %s" % repoid dbobj = PackageTagDB(repoid, sqlite_file) self.db_objs[repoid] = dbobj def remove(self, repoid): if repoid in self.db_objs: del self.db_objs[repoid] else: raise PkgTagsError, "No tag db for %s" % repoid def search_names(self, name): res = {} for ptd in self.db_objs.values(): for (name, taglist) in ptd.search_names(name).items(): if not name in res: res[name] = [] res[name].extend(taglist) out = {} for (name, taglist) in res.items(): out[name] = misc.unique(taglist) return out def search_tags(self, tagname): res = {} for ptd in self.db_objs.values(): for (name, taglist) in ptd.search_tags(tagname).items(): if not name in res: res[name] = [] res[name].extend(taglist) out = {} for (name, taglist) in res.items(): out[name] = misc.unique(taglist) return out PK[wJpRRsite-packages/yum/packages.pycnu[ v_c@sdZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl mZddlZ ddlmZmZmZddlZddlZddlZddlTddlmZddlZddlZejjddd lmZmZy)ddl Z e!e d  rde"Z nWne#k r~e"Z nXddl$Z$ddl%Z%d Z&d Z'e(d Z)dde"dZ*dfdYZ+dfdYZ,de-fdYZ.e,dZ/de/_0de.fdYZ1de-fdYZ2dfdYZ3de.e2fdYZ4d Z5d!e4fd"YZ6d#fd$YZ7d%fd&YZ8d'd>Z9d'd'>Z:d'd(>Z;d'd)>Z<d'd*>Z=d'd+>Z>d'd,>Z?d'd->Z@d'd.>ZAd'd/>ZBd0e-fd1YZCd2eCfd3YZDd4fd5YZEiaFd6eEfd7YZGe,d8ZHdeH_0d9e6fd:YZId;e6fd<YZJd=eJfd>YZKdS(?sA Classes and functions dealing with rpm package representations. iN(tPopentPIPE(t RpmUtilsError(t flagToStringtstringToVersiontcompareVerOnly(t*(t itemgettertmedia(t URLGrabbert URLGrabErrortgetcCs_|j|j|j}}}|j|j|j}}}tjj|||f|||fS(s4 Compare two Package or PackageEVR objects. (tepochtversiontreleasetrpmUtilst miscutilst compareEVR(tpo1tpo2te1tv1tr1te2tv2tr2((s0/usr/lib/python2.7/site-packages/yum/packages.pyt comparePoEVR9scCsn|j|j|j}}}|j|j|j}}}||krJtS||krZtS||krjtStS(sA Compare two Package or PackageEVR objects for equality. (R R RtFalsetTrue(RRRRRRRR((s0/usr/lib/python2.7/site-packages/yum/packages.pytcomparePoEVREQ@s   cCsIi}x<|D]4}|j\}}}}}|sp|j}|j}|j}|j}|j}n|} d||f} d||||f} d||f} d|||f} d|||||f}d|||||f}xM| | | | | ||gD]0}||kr,g||s( RRRSRTRcRNRfRhRiRjtpropertytui_id(((s0/usr/lib/python2.7/site-packages/yum/packages.pyRUs      t PackageObjectcBsreZdZdZdZeddZdZeddZdZ eddZ d Z edd Z d Z edd Zd ZeddZdZeddZdZeddZdZeddZdZeddZdZeddZdZeddZdZeddZdZeddZ dZ!edd Z"d!Z#edd"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+d*Z,d+Z-d,Z.d-Z/d.Z0d/Z1d0Z2d1Z3d2Z4edd3Z5d4Z6RS(5sZBase Package Object - sets up the default storage dicts and the most common returnscCs:d|_d|_d|_d|_d|_g|_dS(N(R:R*R RR tarcht _checksums(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRNs      cCs!|jdkr|jS|jSdS(Nt0(R tnvraR/(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt _ui_envrasRkcCs |jS(N(Rt(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCs!|jdkr|jS|jSdS(NRr(R RsR0(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt _ui_nevrascCs |jS(N(Ru(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCs!|jdkr|jS|jSdS(NRr(R tvrtevr(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_ui_evrscCs |jS(N(Rx(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl scCs!|jdkr|jS|jSdS(NRr(R tvratevra(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_ui_evrascCs |jS(N(R{(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCs!|jdkr|jS|jSdS(NRr(R tnvrtnevr(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_ui_nevrscCs |jS(N(R~(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCsd|j|jfS(Ns%s.%s(R*Rp(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_nascCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCsd|j|jfS(Ns%s-%s(R R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_vr!scCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl#scCsd|j|j|jfS(Ns%s-%s.%s(R RRp(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_vra%scCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl'scCsd|j|j|jfS(Ns%s:%s-%s(R R R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_evr)scCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl+scCs d|j|j|j|jfS(Ns %s:%s-%s.%s(R R RRp(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_evra-scCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl/scCsd|j|j|jfS(Ns%s-%s-%s(R*R R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_nvr1scCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl3scCs d|j|j|j|jfS(Ns %s-%s-%s.%s(R*R RRp(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_nvra5scCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl7scCs d|j|j|j|jfS(Ns %s-%s:%s-%s(R*R R R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_nevr9scCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRl;scCs&d|j|j|j|j|jfS(Ns%s-%s:%s-%s.%s(R*R R RRp(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_nevra=s cCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlAscCs d|j|j|j|jfS(Ns %s:%s-%s-%s(R R*R R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_envrCscCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlEscCs&d|j|j|j|j|jfS(Ns%s:%s-%s-%s.%s(R R*R RRp(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_envraGs cCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlKscCs|jS(N(tui_envra(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRiMscCsH|jdkr.d|j|j|jf}nd|j|jf}|S(sAreturns a printable version string - including epoch, if it's setRrs%s:%s-%ss%s-%s(R R R(RMtver((s0/usr/lib/python2.7/site-packages/yum/packages.pytprintVerPscCsA|s dSt|j|j}|dkr=t||}n|S(s< Compare package to another one, only rpm-version ordering. ii(tcmpR*R(RMRetret((s0/usr/lib/python2.7/site-packages/yum/packages.pytverCMPYs  cCs|j|}|dkr3t|j|j}n|dkrt|drt|drt|j|j}|r|jdkrdS|r|jdkrdSn|S(s4 Compare packages, this is just for UI/consistency. iR_t installedii(RRRpthasattrR_(RMReR((s0/usr/lib/python2.7/site-packages/yum/packages.pyRfbs *cCs[|s tS|j|jkr tSt|drWt|drW|j|jkrWtSntS(se Compare packages for yes/no equality, includes everything in the UI package comparison. R_(RRRR_R(RMRe((s0/usr/lib/python2.7/site-packages/yum/packages.pyt__eq__oscCs||kstStS(N(RR(RMRe((s0/usr/lib/python2.7/site-packages/yum/packages.pyt__ne__zs cCs t||S(N(tgetattr(RMtkey((s0/usr/lib/python2.7/site-packages/yum/packages.pyt __getitem__scCs<|s dSt|j|j}|dkr/tSt||S(s< Compare package to another one, only rpm-version equality. iN(R:RR*RR(RMReR((s0/usr/lib/python2.7/site-packages/yum/packages.pytverEQs  cCs|s dS|j| S(s> Compare package to another one, only rpm-version inequality. N(R:R(RMRe((s0/usr/lib/python2.7/site-packages/yum/packages.pytverNEscCs|j|dkS(s; Uses verCMP, tests if the other _rpm-version_ is < ours. i(R(RMRe((s0/usr/lib/python2.7/site-packages/yum/packages.pytverLTscCs|j|dkS(s; Uses verCMP, tests if the other _rpm-version_ is <= ours. i(R(RMRe((s0/usr/lib/python2.7/site-packages/yum/packages.pytverLEscCs|j|dkS(s; Uses verCMP, tests if the other _rpm-version_ is > ours. i(R(RMRe((s0/usr/lib/python2.7/site-packages/yum/packages.pytverGTscCs|j|dkS(s; Uses verCMP, tests if the other _rpm-version_ is >= ours. i(R(RMRe((s0/usr/lib/python2.7/site-packages/yum/packages.pytverGEscCs)d|jjt|tt|fS(Ns<%s : %s (%s)>(t __class__RRtstrthexR4(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt__repr__scCs&tjdtjddt||S(Ns8returnSimple() will go away in a future version of Yum. t stackleveli(twarningstwarntErrorstYumFutureDeprecationWarningR(RMtvarname((s0/usr/lib/python2.7/site-packages/yum/packages.pyt returnSimples cCs|jS(N(Rq(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pytreturnChecksumsscCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCs1x*|jD]\}}}|r ||fSq WdS(N(t checksums(RMtcsumtypetcsumtcsumid((s0/usr/lib/python2.7/site-packages/yum/packages.pyt returnIdSums(7RRRSRTRNRtRmRRutui_nevraRxtui_evrR{tui_evraR~tui_nevrRtnaRRvRRyRRwRRzRR|RRsRR}RR0RtenvrRR/RiRRRfRRRRRRRRRRRRRR(((s0/usr/lib/python2.7/site-packages/yum/packages.pyRosh                            t-tYumNotFoundPackagecBs5eZdZdZeddZdZRS(cCsu|d|_|d|_|d|_|d|_|d|_||_d|_g|_t|_ tj |_ dS(Niiiii( R*RpR R RRtsizeRqt_not_found_repoR3R4R_(RMR((s0/usr/lib/python2.7/site-packages/yum/packages.pyRNs         cCs|jS(s This just returns '-' (R_(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt _ui_from_reposRkcCs |jS(N(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCstS(s^check the package checksum vs the localPkg return True if pkg is good, False if not(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pytverifyLocalPkgs(RRRSRNRRmt ui_from_repoR(((s0/usr/lib/python2.7/site-packages/yum/packages.pyRs  tRpmBasecBsEeZdZdZdZdZdZdZedZ dZ dZ d Z d Z d Zd ed ZedZdZdZddZeddZeddZeddZeddZeddZeddZeddZeddZeddZeddZeddZeddZ edd Z!edd!Z"edd"Z#edd#Z$edd$Z%edd%Z&edd&Z'edd'Z(d(Z)edd)Z*d*Z+d+d,Z,RS(-s2return functions and storage for rpm-specific datacCsi|_g|jdq(n|jtj|q(W|S|S(s9return list of provides, requires, conflicts or obsoletesi(RR R R=tprco_tuple_to_string(RMtprcotypet printabletprcostresultsR((s0/usr/lib/python2.7/site-packages/yum/packages.pyt returnPrcos  c Cs>||jkrdSt|j|dkrF||j|krdSn~t|ds}id d6d d6d d6d d6|_n|j|d krt|j||j| i( RR0RRtpackagerR=t to_unicodetencodetfind(RMtvaltix((s0/usr/lib/python2.7/site-packages/yum/packages.pyt _committerWs   cCsSt|dr|jSt|js8|j|_|jS|jdd|_|jS(s5Returns the time of the last commit to the changelog.t_committime_reti(RR;RRt buildtime(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt _committimens cCs|jddS(sReturns the 'default' checksumii(R(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt _checksum~scCsd|jdkrdStj|j\}}}}}|dkr`t|dkrVdSt|SdS(NRi(R)R:R*turlsplitRtint(RMtschemetnetlocRZtquerytfragid((s0/usr/lib/python2.7/site-packages/yum/packages.pyt getDiscNums!  cCs_|j}tjj}ytjj||}Wn$tjk rZtjd|nX|S(Ns"Package Header %s: RPM Cannot open( tlocalPkgRt transactiontinitReadOnlyTransactionRthdrFromPackageRRt RepoError(RMtrpmfilettsthdr((s0/usr/lib/python2.7/site-packages/yum/packages.pytreturnHeaderFromPackages cCstjj|jrky#tj|j}|d}Wq{tjtfk rgtj d|q{Xntj d||S(sTreturns an rpm header object from the package object's local header cacheisPackage Header %s: Cannot opens Package Header %s: Not Available( RYRZtexiststlocalHdrtrpmtreadHeaderListFromFileterrort IndexErrorRRJ(RMthlistRM((s0/usr/lib/python2.7/site-packages/yum/packages.pytreturnLocalHeaderscCsEt|ds>tjj|j}|jjd||_n|jS(sBreturn path to local package (whether it is present there, or not)t localpathRV(RRYRZR[R,R3tpkgdirRW(RMtrpmfn((s0/usr/lib/python2.7/site-packages/yum/packages.pyRFscCsSt|dsLtjj|j}|d d}|jjd||_n|jS(sWreturn path to local cached Header file downloaded from package byte rangesthdrpathis.hdrRV(RRYRZR[R,R3thdrdirRZ(RMtpkgnamethdrname((s0/usr/lib/python2.7/site-packages/yum/packages.pyRPs c Cs ytj|j}Wntk r/}tSXt|dr|jr|j}|j|jkr|j|jkr|j |j kr|j |j krt Sn|j \}}y%t j||jd|j}Wntjk rtSX||krtS||_t S(s^check the package checksum vs the localPkg return True if pkg is good, False if notRtdatasize(RYtstatRFtOSErrorRRRtst_inotst_devtst_mtimetst_sizeRRR=tchecksumR%Rt MiscError(RMtnstR'tostt csum_typeRtfilesum((s0/usr/lib/python2.7/site-packages/yum/packages.pyRs,    cCswtdkrdSt|dr,t|dS|js<dSytj|jd}WndSXt|d||S(s Get the user.xdg.origin.url value from the local pkg. ... if it's present. We cache this so we can access it after the file has been deleted (keepcache=False). t__cached_localXattrUrlsuser.xdg.origin.urlN(txattrR:RRRR RFR(RMR((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_localXattrUrls   cCs |jS(N(Rm(tx((s0/usr/lib/python2.7/site-packages/yum/packages.pyRlscCs&tjdtjddtj|S(s1convert the prco tuples into a nicer human strings9prcoPrintable() will go away in a future version of Yum. Ri(RRRRR=R(RMt prcoTuple((s0/usr/lib/python2.7/site-packages/yum/packages.pyt prcoPrintables cCs|jS(s.return a list of requires in normal rpm format(R (RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyt requiresListscCs|j|jdfgS(Ni(t checksum_typetpkgId(RM((s0/usr/lib/python2.7/site-packages/yum/packages.pyRscCst|drW|j\}}}}}||_||_||_||_||_nt|dr|jd|_|jd|_ nt|dr|j d|_ |j d|_ |j d|_ nt|d r|jjd }|d krd-}n||_|jd |_nt|d rO|jd|_|jd|_nt|drx=ddddddddgD]}t|||j|q}W|jjdd |_|jj|jdnt|dr6xT|jD]F} |j| } | |jkrg|j| tattrib(RYRZtdirnamet remote_urlR[R=tto_xmlR(RMR.Rytmsg((s0/usr/lib/python2.7/site-packages/yum/packages.pyt_return_remote_locationSs +cCsd}}|jr(tj|j}n|jrFtj|j}n|jd\}}}d|j|j|j|j|j ||tj|j tj|j |||j |j |j|j|jf}||j7}|S(NRXis3 %s %s %s %s %s %s %s
{%- for row in items|batch(3, ' ') %} {%- for column in row %} {%- endfor %} {%- endfor %}
{{ column }}
""" result = [] tmp = [] for item in value: if len(tmp) == linecount: yield tmp tmp = [] tmp.append(item) if tmp: if fill_with is not None and len(tmp) < linecount: tmp += [fill_with] * (linecount - len(tmp)) yield tmp def do_round(value, precision=0, method='common'): """Round the number to a given precision. The first parameter specifies the precision (default is ``0``), the second the rounding method: - ``'common'`` rounds either up or down - ``'ceil'`` always rounds up - ``'floor'`` always rounds down If you don't specify a method ``'common'`` is used. .. sourcecode:: jinja {{ 42.55|round }} -> 43.0 {{ 42.55|round(1, 'floor') }} -> 42.5 Note that even if rounded to 0 precision, a float is returned. If you need a real integer, pipe it through `int`: .. sourcecode:: jinja {{ 42.55|round|int }} -> 43 """ if not method in ('common', 'ceil', 'floor'): raise FilterArgumentError('method must be common, ceil or floor') if method == 'common': return round(value, precision) func = getattr(math, method) return func(value * (10 ** precision)) / (10 ** precision) @environmentfilter def do_groupby(environment, value, attribute): """Group a sequence of objects by a common attribute. If you for example have a list of dicts or objects that represent persons with `gender`, `first_name` and `last_name` attributes and you want to group all users by genders you can do something like the following snippet: .. sourcecode:: html+jinja
    {% for group in persons|groupby('gender') %}
  • {{ group.grouper }}
      {% for person in group.list %}
    • {{ person.first_name }} {{ person.last_name }}
    • {% endfor %}
  • {% endfor %}
Additionally it's possible to use tuple unpacking for the grouper and list: .. sourcecode:: html+jinja
    {% for grouper, list in persons|groupby('gender') %} ... {% endfor %}
As you can see the item we're grouping by is stored in the `grouper` attribute and the `list` contains all the objects that have this grouper in common. .. versionchanged:: 2.6 It's now possible to use dotted notation to group by the child attribute of another attribute. """ expr = make_attrgetter(environment, attribute) return sorted(map(_GroupTuple, groupby(sorted(value, key=expr), expr))) class _GroupTuple(tuple): __slots__ = () grouper = property(itemgetter(0)) list = property(itemgetter(1)) def __new__(cls, xxx_todo_changeme): (key, value) = xxx_todo_changeme return tuple.__new__(cls, (key, list(value))) @environmentfilter def do_sum(environment, iterable, attribute=None, start=0): """Returns the sum of a sequence of numbers plus the value of parameter 'start' (which defaults to 0). When the sequence is empty it returns start. It is also possible to sum up only certain attributes: .. sourcecode:: jinja Total: {{ items|sum(attribute='price') }} .. versionchanged:: 2.6 The `attribute` parameter was added to allow suming up over attributes. Also the `start` parameter was moved on to the right. """ if attribute is not None: iterable = imap(make_attrgetter(environment, attribute), iterable) return sum(iterable, start) def do_list(value): """Convert the value into a list. If it was a string the returned list will be a list of characters. """ return list(value) def do_mark_safe(value): """Mark the value as safe which means that in an environment with automatic escaping enabled this variable will not be escaped. """ return Markup(value) def do_mark_unsafe(value): """Mark a value as unsafe. This is the reverse operation for :func:`safe`.""" return text_type(value) def do_reverse(value): """Reverse the object or return an iterator the iterates over it the other way round. """ if isinstance(value, string_types): return value[::-1] try: return reversed(value) except TypeError: try: rv = list(value) rv.reverse() return rv except TypeError: raise FilterArgumentError('argument must be iterable') @environmentfilter def do_attr(environment, obj, name): """Get an attribute of an object. ``foo|attr("bar")`` works like ``foo["bar"]`` just that always an attribute is returned and items are not looked up. See :ref:`Notes on subscriptions ` for more details. """ try: name = str(name) except UnicodeError: pass else: try: value = getattr(obj, name) except AttributeError: pass else: if environment.sandboxed and not \ environment.is_safe_attribute(obj, name, value): return environment.unsafe_undefined(obj, name) return value return environment.undefined(obj=obj, name=name) @contextfilter def do_map(*args, **kwargs): """Applies a filter on a sequence of objects or looks up an attribute. This is useful when dealing with lists of objects but you are really only interested in a certain value of it. The basic usage is mapping on an attribute. Imagine you have a list of users but you are only interested in a list of usernames: .. sourcecode:: jinja Users on this page: {{ users|map(attribute='username')|join(', ') }} Alternatively you can let it invoke a filter by passing the name of the filter and the arguments afterwards. A good example would be applying a text conversion filter on a sequence: .. sourcecode:: jinja Users on this page: {{ titles|map('lower')|join(', ') }} .. versionadded:: 2.7 """ context = args[0] seq = args[1] if len(args) == 2 and 'attribute' in kwargs: attribute = kwargs.pop('attribute') if kwargs: raise FilterArgumentError('Unexpected keyword argument %r' % next(iter(kwargs))) func = make_attrgetter(context.environment, attribute) else: try: name = args[2] args = args[3:] except LookupError: raise FilterArgumentError('map requires a filter argument') func = lambda item: context.environment.call_filter( name, item, args, kwargs, context=context) if seq: for item in seq: yield func(item) @contextfilter def do_select(*args, **kwargs): """Filters a sequence of objects by appying a test to either the object or the attribute and only selecting the ones with the test succeeding. Example usage: .. sourcecode:: jinja {{ numbers|select("odd") }} .. versionadded:: 2.7 """ return _select_or_reject(args, kwargs, lambda x: x, False) @contextfilter def do_reject(*args, **kwargs): """Filters a sequence of objects by appying a test to either the object or the attribute and rejecting the ones with the test succeeding. Example usage: .. sourcecode:: jinja {{ numbers|reject("odd") }} .. versionadded:: 2.7 """ return _select_or_reject(args, kwargs, lambda x: not x, False) @contextfilter def do_selectattr(*args, **kwargs): """Filters a sequence of objects by appying a test to either the object or the attribute and only selecting the ones with the test succeeding. Example usage: .. sourcecode:: jinja {{ users|selectattr("is_active") }} {{ users|selectattr("email", "none") }} .. versionadded:: 2.7 """ return _select_or_reject(args, kwargs, lambda x: x, True) @contextfilter def do_rejectattr(*args, **kwargs): """Filters a sequence of objects by appying a test to either the object or the attribute and rejecting the ones with the test succeeding. .. sourcecode:: jinja {{ users|rejectattr("is_active") }} {{ users|rejectattr("email", "none") }} .. versionadded:: 2.7 """ return _select_or_reject(args, kwargs, lambda x: not x, True) def _select_or_reject(args, kwargs, modfunc, lookup_attr): context = args[0] seq = args[1] if lookup_attr: try: attr = args[2] except LookupError: raise FilterArgumentError('Missing parameter for attribute name') transfunc = make_attrgetter(context.environment, attr) off = 1 else: off = 0 transfunc = lambda x: x try: name = args[2 + off] args = args[3 + off:] func = lambda item: context.environment.call_test( name, item, args, kwargs) except LookupError: func = bool if seq: for item in seq: if modfunc(func(transfunc(item))): yield item FILTERS = { 'attr': do_attr, 'replace': do_replace, 'upper': do_upper, 'lower': do_lower, 'escape': escape, 'e': escape, 'forceescape': do_forceescape, 'capitalize': do_capitalize, 'title': do_title, 'default': do_default, 'd': do_default, 'join': do_join, 'count': len, 'dictsort': do_dictsort, 'sort': do_sort, 'length': len, 'reverse': do_reverse, 'center': do_center, 'indent': do_indent, 'title': do_title, 'capitalize': do_capitalize, 'first': do_first, 'last': do_last, 'map': do_map, 'random': do_random, 'reject': do_reject, 'rejectattr': do_rejectattr, 'filesizeformat': do_filesizeformat, 'pprint': do_pprint, 'truncate': do_truncate, 'wordwrap': do_wordwrap, 'wordcount': do_wordcount, 'int': do_int, 'float': do_float, 'string': soft_unicode, 'list': do_list, 'urlize': do_urlize, 'format': do_format, 'trim': do_trim, 'striptags': do_striptags, 'select': do_select, 'selectattr': do_selectattr, 'slice': do_slice, 'batch': do_batch, 'sum': do_sum, 'abs': abs, 'round': do_round, 'groupby': do_groupby, 'safe': do_mark_safe, 'xmlattr': do_xmlattr, 'urlencode': do_urlencode } PK[,aasite-packages/jinja2/ext.pynu[# -*- coding: utf-8 -*- """ jinja2.ext ~~~~~~~~~~ Jinja extensions allow to add custom tags similar to the way django custom tags work. By default two example extensions exist: an i18n and a cache extension. :copyright: (c) 2010 by the Jinja Team. :license: BSD. """ from jinja2 import nodes from jinja2.defaults import BLOCK_START_STRING, \ BLOCK_END_STRING, VARIABLE_START_STRING, VARIABLE_END_STRING, \ COMMENT_START_STRING, COMMENT_END_STRING, LINE_STATEMENT_PREFIX, \ LINE_COMMENT_PREFIX, TRIM_BLOCKS, NEWLINE_SEQUENCE, \ KEEP_TRAILING_NEWLINE, LSTRIP_BLOCKS from jinja2.environment import Environment from jinja2.runtime import concat from jinja2.exceptions import TemplateAssertionError, TemplateSyntaxError from jinja2.utils import contextfunction, import_string, Markup from jinja2._compat import next, with_metaclass, string_types, iteritems # the only real useful gettext functions for a Jinja template. Note # that ugettext must be assigned to gettext as Jinja doesn't support # non unicode strings. GETTEXT_FUNCTIONS = ('_', 'gettext', 'ngettext') class ExtensionRegistry(type): """Gives the extension an unique identifier.""" def __new__(cls, name, bases, d): rv = type.__new__(cls, name, bases, d) rv.identifier = rv.__module__ + '.' + rv.__name__ return rv class Extension(with_metaclass(ExtensionRegistry, object)): """Extensions can be used to add extra functionality to the Jinja template system at the parser level. Custom extensions are bound to an environment but may not store environment specific data on `self`. The reason for this is that an extension can be bound to another environment (for overlays) by creating a copy and reassigning the `environment` attribute. As extensions are created by the environment they cannot accept any arguments for configuration. One may want to work around that by using a factory function, but that is not possible as extensions are identified by their import name. The correct way to configure the extension is storing the configuration values on the environment. Because this way the environment ends up acting as central configuration storage the attributes may clash which is why extensions have to ensure that the names they choose for configuration are not too generic. ``prefix`` for example is a terrible name, ``fragment_cache_prefix`` on the other hand is a good name as includes the name of the extension (fragment cache). """ #: if this extension parses this is the list of tags it's listening to. tags = set() #: the priority of that extension. This is especially useful for #: extensions that preprocess values. A lower value means higher #: priority. #: #: .. versionadded:: 2.4 priority = 100 def __init__(self, environment): self.environment = environment def bind(self, environment): """Create a copy of this extension bound to another environment.""" rv = object.__new__(self.__class__) rv.__dict__.update(self.__dict__) rv.environment = environment return rv def preprocess(self, source, name, filename=None): """This method is called before the actual lexing and can be used to preprocess the source. The `filename` is optional. The return value must be the preprocessed source. """ return source def filter_stream(self, stream): """It's passed a :class:`~jinja2.lexer.TokenStream` that can be used to filter tokens returned. This method has to return an iterable of :class:`~jinja2.lexer.Token`\s, but it doesn't have to return a :class:`~jinja2.lexer.TokenStream`. In the `ext` folder of the Jinja2 source distribution there is a file called `inlinegettext.py` which implements a filter that utilizes this method. """ return stream def parse(self, parser): """If any of the :attr:`tags` matched this method is called with the parser as first argument. The token the parser stream is pointing at is the name token that matched. This method has to return one or a list of multiple nodes. """ raise NotImplementedError() def attr(self, name, lineno=None): """Return an attribute node for the current extension. This is useful to pass constants on extensions to generated template code. :: self.attr('_my_attribute', lineno=lineno) """ return nodes.ExtensionAttribute(self.identifier, name, lineno=lineno) def call_method(self, name, args=None, kwargs=None, dyn_args=None, dyn_kwargs=None, lineno=None): """Call a method of the extension. This is a shortcut for :meth:`attr` + :class:`jinja2.nodes.Call`. """ if args is None: args = [] if kwargs is None: kwargs = [] return nodes.Call(self.attr(name, lineno=lineno), args, kwargs, dyn_args, dyn_kwargs, lineno=lineno) @contextfunction def _gettext_alias(__context, *args, **kwargs): return __context.call(__context.resolve('gettext'), *args, **kwargs) def _make_new_gettext(func): @contextfunction def gettext(__context, __string, **variables): rv = __context.call(func, __string) if __context.eval_ctx.autoescape: rv = Markup(rv) return rv % variables return gettext def _make_new_ngettext(func): @contextfunction def ngettext(__context, __singular, __plural, __num, **variables): variables.setdefault('num', __num) rv = __context.call(func, __singular, __plural, __num) if __context.eval_ctx.autoescape: rv = Markup(rv) return rv % variables return ngettext class InternationalizationExtension(Extension): """This extension adds gettext support to Jinja2.""" tags = set(['trans']) # TODO: the i18n extension is currently reevaluating values in a few # situations. Take this example: # {% trans count=something() %}{{ count }} foo{% pluralize # %}{{ count }} fooss{% endtrans %} # something is called twice here. One time for the gettext value and # the other time for the n-parameter of the ngettext function. def __init__(self, environment): Extension.__init__(self, environment) environment.globals['_'] = _gettext_alias environment.extend( install_gettext_translations=self._install, install_null_translations=self._install_null, install_gettext_callables=self._install_callables, uninstall_gettext_translations=self._uninstall, extract_translations=self._extract, newstyle_gettext=False ) def _install(self, translations, newstyle=None): gettext = getattr(translations, 'ugettext', None) if gettext is None: gettext = translations.gettext ngettext = getattr(translations, 'ungettext', None) if ngettext is None: ngettext = translations.ngettext self._install_callables(gettext, ngettext, newstyle) def _install_null(self, newstyle=None): self._install_callables( lambda x: x, lambda s, p, n: (n != 1 and (p,) or (s,))[0], newstyle ) def _install_callables(self, gettext, ngettext, newstyle=None): if newstyle is not None: self.environment.newstyle_gettext = newstyle if self.environment.newstyle_gettext: gettext = _make_new_gettext(gettext) ngettext = _make_new_ngettext(ngettext) self.environment.globals.update( gettext=gettext, ngettext=ngettext ) def _uninstall(self, translations): for key in 'gettext', 'ngettext': self.environment.globals.pop(key, None) def _extract(self, source, gettext_functions=GETTEXT_FUNCTIONS): if isinstance(source, string_types): source = self.environment.parse(source) return extract_from_ast(source, gettext_functions) def parse(self, parser): """Parse a translatable tag.""" lineno = next(parser.stream).lineno num_called_num = False # find all the variables referenced. Additionally a variable can be # defined in the body of the trans block too, but this is checked at # a later state. plural_expr = None plural_expr_assignment = None variables = {} while parser.stream.current.type != 'block_end': if variables: parser.stream.expect('comma') # skip colon for python compatibility if parser.stream.skip_if('colon'): break name = parser.stream.expect('name') if name.value in variables: parser.fail('translatable variable %r defined twice.' % name.value, name.lineno, exc=TemplateAssertionError) # expressions if parser.stream.current.type == 'assign': next(parser.stream) variables[name.value] = var = parser.parse_expression() else: variables[name.value] = var = nodes.Name(name.value, 'load') if plural_expr is None: if isinstance(var, nodes.Call): plural_expr = nodes.Name('_trans', 'load') variables[name.value] = plural_expr plural_expr_assignment = nodes.Assign( nodes.Name('_trans', 'store'), var) else: plural_expr = var num_called_num = name.value == 'num' parser.stream.expect('block_end') plural = plural_names = None have_plural = False referenced = set() # now parse until endtrans or pluralize singular_names, singular = self._parse_block(parser, True) if singular_names: referenced.update(singular_names) if plural_expr is None: plural_expr = nodes.Name(singular_names[0], 'load') num_called_num = singular_names[0] == 'num' # if we have a pluralize block, we parse that too if parser.stream.current.test('name:pluralize'): have_plural = True next(parser.stream) if parser.stream.current.type != 'block_end': name = parser.stream.expect('name') if name.value not in variables: parser.fail('unknown variable %r for pluralization' % name.value, name.lineno, exc=TemplateAssertionError) plural_expr = variables[name.value] num_called_num = name.value == 'num' parser.stream.expect('block_end') plural_names, plural = self._parse_block(parser, False) next(parser.stream) referenced.update(plural_names) else: next(parser.stream) # register free names as simple name expressions for var in referenced: if var not in variables: variables[var] = nodes.Name(var, 'load') if not have_plural: plural_expr = None elif plural_expr is None: parser.fail('pluralize without variables', lineno) node = self._make_node(singular, plural, variables, plural_expr, bool(referenced), num_called_num and have_plural) node.set_lineno(lineno) if plural_expr_assignment is not None: return [plural_expr_assignment, node] else: return node def _parse_block(self, parser, allow_pluralize): """Parse until the next block tag with a given name.""" referenced = [] buf = [] while 1: if parser.stream.current.type == 'data': buf.append(parser.stream.current.value.replace('%', '%%')) next(parser.stream) elif parser.stream.current.type == 'variable_begin': next(parser.stream) name = parser.stream.expect('name').value referenced.append(name) buf.append('%%(%s)s' % name) parser.stream.expect('variable_end') elif parser.stream.current.type == 'block_begin': next(parser.stream) if parser.stream.current.test('name:endtrans'): break elif parser.stream.current.test('name:pluralize'): if allow_pluralize: break parser.fail('a translatable section can have only one ' 'pluralize section') parser.fail('control structures in translatable sections are ' 'not allowed') elif parser.stream.eos: parser.fail('unclosed translation block') else: assert False, 'internal parser error' return referenced, concat(buf) def _make_node(self, singular, plural, variables, plural_expr, vars_referenced, num_called_num): """Generates a useful node from the data provided.""" # no variables referenced? no need to escape for old style # gettext invocations only if there are vars. if not vars_referenced and not self.environment.newstyle_gettext: singular = singular.replace('%%', '%') if plural: plural = plural.replace('%%', '%') # singular only: if plural_expr is None: gettext = nodes.Name('gettext', 'load') node = nodes.Call(gettext, [nodes.Const(singular)], [], None, None) # singular and plural else: ngettext = nodes.Name('ngettext', 'load') node = nodes.Call(ngettext, [ nodes.Const(singular), nodes.Const(plural), plural_expr ], [], None, None) # in case newstyle gettext is used, the method is powerful # enough to handle the variable expansion and autoescape # handling itself if self.environment.newstyle_gettext: for key, value in iteritems(variables): # the function adds that later anyways in case num was # called num, so just skip it. if num_called_num and key == 'num': continue node.kwargs.append(nodes.Keyword(key, value)) # otherwise do that here else: # mark the return value as safe if we are in an # environment with autoescaping turned on node = nodes.MarkSafeIfAutoescape(node) if variables: node = nodes.Mod(node, nodes.Dict([ nodes.Pair(nodes.Const(key), value) for key, value in variables.items() ])) return nodes.Output([node]) class ExprStmtExtension(Extension): """Adds a `do` tag to Jinja2 that works like the print statement just that it doesn't print the return value. """ tags = set(['do']) def parse(self, parser): node = nodes.ExprStmt(lineno=next(parser.stream).lineno) node.node = parser.parse_tuple() return node class LoopControlExtension(Extension): """Adds break and continue to the template engine.""" tags = set(['break', 'continue']) def parse(self, parser): token = next(parser.stream) if token.value == 'break': return nodes.Break(lineno=token.lineno) return nodes.Continue(lineno=token.lineno) class WithExtension(Extension): """Adds support for a django-like with block.""" tags = set(['with']) def parse(self, parser): node = nodes.Scope(lineno=next(parser.stream).lineno) assignments = [] while parser.stream.current.type != 'block_end': lineno = parser.stream.current.lineno if assignments: parser.stream.expect('comma') target = parser.parse_assign_target() parser.stream.expect('assign') expr = parser.parse_expression() assignments.append(nodes.Assign(target, expr, lineno=lineno)) node.body = assignments + \ list(parser.parse_statements(('name:endwith',), drop_needle=True)) return node class AutoEscapeExtension(Extension): """Changes auto escape rules for a scope.""" tags = set(['autoescape']) def parse(self, parser): node = nodes.ScopedEvalContextModifier(lineno=next(parser.stream).lineno) node.options = [ nodes.Keyword('autoescape', parser.parse_expression()) ] node.body = parser.parse_statements(('name:endautoescape',), drop_needle=True) return nodes.Scope([node]) def extract_from_ast(node, gettext_functions=GETTEXT_FUNCTIONS, babel_style=True): """Extract localizable strings from the given template node. Per default this function returns matches in babel style that means non string parameters as well as keyword arguments are returned as `None`. This allows Babel to figure out what you really meant if you are using gettext functions that allow keyword arguments for placeholder expansion. If you don't want that behavior set the `babel_style` parameter to `False` which causes only strings to be returned and parameters are always stored in tuples. As a consequence invalid gettext calls (calls without a single string parameter or string parameters after non-string parameters) are skipped. This example explains the behavior: >>> from jinja2 import Environment >>> env = Environment() >>> node = env.parse('{{ (_("foo"), _(), ngettext("foo", "bar", 42)) }}') >>> list(extract_from_ast(node)) [(1, '_', 'foo'), (1, '_', ()), (1, 'ngettext', ('foo', 'bar', None))] >>> list(extract_from_ast(node, babel_style=False)) [(1, '_', ('foo',)), (1, 'ngettext', ('foo', 'bar'))] For every string found this function yields a ``(lineno, function, message)`` tuple, where: * ``lineno`` is the number of the line on which the string was found, * ``function`` is the name of the ``gettext`` function used (if the string was extracted from embedded Python code), and * ``message`` is the string itself (a ``unicode`` object, or a tuple of ``unicode`` objects for functions with multiple string arguments). This extraction function operates on the AST and is because of that unable to extract any comments. For comment support you have to use the babel extraction interface or extract comments yourself. """ for node in node.find_all(nodes.Call): if not isinstance(node.node, nodes.Name) or \ node.node.name not in gettext_functions: continue strings = [] for arg in node.args: if isinstance(arg, nodes.Const) and \ isinstance(arg.value, string_types): strings.append(arg.value) else: strings.append(None) for arg in node.kwargs: strings.append(None) if node.dyn_args is not None: strings.append(None) if node.dyn_kwargs is not None: strings.append(None) if not babel_style: strings = tuple(x for x in strings if x is not None) if not strings: continue else: if len(strings) == 1: strings = strings[0] else: strings = tuple(strings) yield node.lineno, node.node.name, strings class _CommentFinder(object): """Helper class to find comments in a token stream. Can only find comments for gettext calls forwards. Once the comment from line 4 is found, a comment for line 1 will not return a usable value. """ def __init__(self, tokens, comment_tags): self.tokens = tokens self.comment_tags = comment_tags self.offset = 0 self.last_lineno = 0 def find_backwards(self, offset): try: for _, token_type, token_value in \ reversed(self.tokens[self.offset:offset]): if token_type in ('comment', 'linecomment'): try: prefix, comment = token_value.split(None, 1) except ValueError: continue if prefix in self.comment_tags: return [comment.rstrip()] return [] finally: self.offset = offset def find_comments(self, lineno): if not self.comment_tags or self.last_lineno > lineno: return [] for idx, (token_lineno, _, _) in enumerate(self.tokens[self.offset:]): if token_lineno > lineno: return self.find_backwards(self.offset + idx) return self.find_backwards(len(self.tokens)) def babel_extract(fileobj, keywords, comment_tags, options): """Babel extraction method for Jinja templates. .. versionchanged:: 2.3 Basic support for translation comments was added. If `comment_tags` is now set to a list of keywords for extraction, the extractor will try to find the best preceeding comment that begins with one of the keywords. For best results, make sure to not have more than one gettext call in one line of code and the matching comment in the same line or the line before. .. versionchanged:: 2.5.1 The `newstyle_gettext` flag can be set to `True` to enable newstyle gettext calls. .. versionchanged:: 2.7 A `silent` option can now be provided. If set to `False` template syntax errors are propagated instead of being ignored. :param fileobj: the file-like object the messages should be extracted from :param keywords: a list of keywords (i.e. function names) that should be recognized as translation functions :param comment_tags: a list of translator tags to search for and include in the results. :param options: a dictionary of additional options (optional) :return: an iterator over ``(lineno, funcname, message, comments)`` tuples. (comments will be empty currently) """ extensions = set() for extension in options.get('extensions', '').split(','): extension = extension.strip() if not extension: continue extensions.add(import_string(extension)) if InternationalizationExtension not in extensions: extensions.add(InternationalizationExtension) def getbool(options, key, default=False): return options.get(key, str(default)).lower() in \ ('1', 'on', 'yes', 'true') silent = getbool(options, 'silent', True) environment = Environment( options.get('block_start_string', BLOCK_START_STRING), options.get('block_end_string', BLOCK_END_STRING), options.get('variable_start_string', VARIABLE_START_STRING), options.get('variable_end_string', VARIABLE_END_STRING), options.get('comment_start_string', COMMENT_START_STRING), options.get('comment_end_string', COMMENT_END_STRING), options.get('line_statement_prefix') or LINE_STATEMENT_PREFIX, options.get('line_comment_prefix') or LINE_COMMENT_PREFIX, getbool(options, 'trim_blocks', TRIM_BLOCKS), getbool(options, 'lstrip_blocks', LSTRIP_BLOCKS), NEWLINE_SEQUENCE, getbool(options, 'keep_trailing_newline', KEEP_TRAILING_NEWLINE), frozenset(extensions), cache_size=0, auto_reload=False ) if getbool(options, 'newstyle_gettext'): environment.newstyle_gettext = True source = fileobj.read().decode(options.get('encoding', 'utf-8')) try: node = environment.parse(source) tokens = list(environment.lex(environment.preprocess(source))) except TemplateSyntaxError as e: if not silent: raise # skip templates with syntax errors return finder = _CommentFinder(tokens, comment_tags) for lineno, func, message in extract_from_ast(node, keywords): yield lineno, func, message, finder.find_comments(lineno) #: nicer import names i18n = InternationalizationExtension do = ExprStmtExtension loopcontrols = LoopControlExtension with_ = WithExtension autoescape = AutoEscapeExtension PK[ppsite-packages/jinja2/nodes.pynu[# -*- coding: utf-8 -*- """ jinja2.nodes ~~~~~~~~~~~~ This module implements additional nodes derived from the ast base node. It also provides some node tree helper functions like `in_lineno` and `get_nodes` used by the parser and translator in order to normalize python and jinja nodes. :copyright: (c) 2010 by the Jinja Team. :license: BSD, see LICENSE for more details. """ import operator from collections import deque from jinja2.utils import Markup from jinja2._compat import next, izip, with_metaclass, text_type, \ method_type, function_type #: the types we support for context functions _context_function_types = (function_type, method_type) _binop_to_func = { '*': operator.mul, '/': operator.truediv, '//': operator.floordiv, '**': operator.pow, '%': operator.mod, '+': operator.add, '-': operator.sub } _uaop_to_func = { 'not': operator.not_, '+': operator.pos, '-': operator.neg } _cmpop_to_func = { 'eq': operator.eq, 'ne': operator.ne, 'gt': operator.gt, 'gteq': operator.ge, 'lt': operator.lt, 'lteq': operator.le, 'in': lambda a, b: a in b, 'notin': lambda a, b: a not in b } class Impossible(Exception): """Raised if the node could not perform a requested action.""" class NodeType(type): """A metaclass for nodes that handles the field and attribute inheritance. fields and attributes from the parent class are automatically forwarded to the child.""" def __new__(cls, name, bases, d): for attr in 'fields', 'attributes': storage = [] storage.extend(getattr(bases[0], attr, ())) storage.extend(d.get(attr, ())) assert len(bases) == 1, 'multiple inheritance not allowed' assert len(storage) == len(set(storage)), 'layout conflict' d[attr] = tuple(storage) d.setdefault('abstract', False) return type.__new__(cls, name, bases, d) class EvalContext(object): """Holds evaluation time information. Custom attributes can be attached to it in extensions. """ def __init__(self, environment, template_name=None): self.environment = environment if callable(environment.autoescape): self.autoescape = environment.autoescape(template_name) else: self.autoescape = environment.autoescape self.volatile = False def save(self): return self.__dict__.copy() def revert(self, old): self.__dict__.clear() self.__dict__.update(old) def get_eval_context(node, ctx): if ctx is None: if node.environment is None: raise RuntimeError('if no eval context is passed, the ' 'node must have an attached ' 'environment.') return EvalContext(node.environment) return ctx class Node(with_metaclass(NodeType, object)): """Baseclass for all Jinja2 nodes. There are a number of nodes available of different types. There are four major types: - :class:`Stmt`: statements - :class:`Expr`: expressions - :class:`Helper`: helper nodes - :class:`Template`: the outermost wrapper node All nodes have fields and attributes. Fields may be other nodes, lists, or arbitrary values. Fields are passed to the constructor as regular positional arguments, attributes as keyword arguments. Each node has two attributes: `lineno` (the line number of the node) and `environment`. The `environment` attribute is set at the end of the parsing process for all nodes automatically. """ fields = () attributes = ('lineno', 'environment') abstract = True def __init__(self, *fields, **attributes): if self.abstract: raise TypeError('abstract nodes are not instanciable') if fields: if len(fields) != len(self.fields): if not self.fields: raise TypeError('%r takes 0 arguments' % self.__class__.__name__) raise TypeError('%r takes 0 or %d argument%s' % ( self.__class__.__name__, len(self.fields), len(self.fields) != 1 and 's' or '' )) for name, arg in izip(self.fields, fields): setattr(self, name, arg) for attr in self.attributes: setattr(self, attr, attributes.pop(attr, None)) if attributes: raise TypeError('unknown attribute %r' % next(iter(attributes))) def iter_fields(self, exclude=None, only=None): """This method iterates over all fields that are defined and yields ``(key, value)`` tuples. Per default all fields are returned, but it's possible to limit that to some fields by providing the `only` parameter or to exclude some using the `exclude` parameter. Both should be sets or tuples of field names. """ for name in self.fields: if (exclude is only is None) or \ (exclude is not None and name not in exclude) or \ (only is not None and name in only): try: yield name, getattr(self, name) except AttributeError: pass def iter_child_nodes(self, exclude=None, only=None): """Iterates over all direct child nodes of the node. This iterates over all fields and yields the values of they are nodes. If the value of a field is a list all the nodes in that list are returned. """ for field, item in self.iter_fields(exclude, only): if isinstance(item, list): for n in item: if isinstance(n, Node): yield n elif isinstance(item, Node): yield item def find(self, node_type): """Find the first node of a given type. If no such node exists the return value is `None`. """ for result in self.find_all(node_type): return result def find_all(self, node_type): """Find all the nodes of a given type. If the type is a tuple, the check is performed for any of the tuple items. """ for child in self.iter_child_nodes(): if isinstance(child, node_type): yield child for result in child.find_all(node_type): yield result def set_ctx(self, ctx): """Reset the context of a node and all child nodes. Per default the parser will all generate nodes that have a 'load' context as it's the most common one. This method is used in the parser to set assignment targets and other nodes to a store context. """ todo = deque([self]) while todo: node = todo.popleft() if 'ctx' in node.fields: node.ctx = ctx todo.extend(node.iter_child_nodes()) return self def set_lineno(self, lineno, override=False): """Set the line numbers of the node and children.""" todo = deque([self]) while todo: node = todo.popleft() if 'lineno' in node.attributes: if node.lineno is None or override: node.lineno = lineno todo.extend(node.iter_child_nodes()) return self def set_environment(self, environment): """Set the environment for all nodes.""" todo = deque([self]) while todo: node = todo.popleft() node.environment = environment todo.extend(node.iter_child_nodes()) return self def __eq__(self, other): return type(self) is type(other) and \ tuple(self.iter_fields()) == tuple(other.iter_fields()) def __ne__(self, other): return not self.__eq__(other) # Restore Python 2 hashing behavior on Python 3 __hash__ = object.__hash__ def __repr__(self): return '%s(%s)' % ( self.__class__.__name__, ', '.join('%s=%r' % (arg, getattr(self, arg, None)) for arg in self.fields) ) class Stmt(Node): """Base node for all statements.""" abstract = True class Helper(Node): """Nodes that exist in a specific context only.""" abstract = True class Template(Node): """Node that represents a template. This must be the outermost node that is passed to the compiler. """ fields = ('body',) class Output(Stmt): """A node that holds multiple expressions which are then printed out. This is used both for the `print` statement and the regular template data. """ fields = ('nodes',) class Extends(Stmt): """Represents an extends statement.""" fields = ('template',) class For(Stmt): """The for loop. `target` is the target for the iteration (usually a :class:`Name` or :class:`Tuple`), `iter` the iterable. `body` is a list of nodes that are used as loop-body, and `else_` a list of nodes for the `else` block. If no else node exists it has to be an empty list. For filtered nodes an expression can be stored as `test`, otherwise `None`. """ fields = ('target', 'iter', 'body', 'else_', 'test', 'recursive') class If(Stmt): """If `test` is true, `body` is rendered, else `else_`.""" fields = ('test', 'body', 'else_') class Macro(Stmt): """A macro definition. `name` is the name of the macro, `args` a list of arguments and `defaults` a list of defaults if there are any. `body` is a list of nodes for the macro body. """ fields = ('name', 'args', 'defaults', 'body') class CallBlock(Stmt): """Like a macro without a name but a call instead. `call` is called with the unnamed macro as `caller` argument this node holds. """ fields = ('call', 'args', 'defaults', 'body') class FilterBlock(Stmt): """Node for filter sections.""" fields = ('body', 'filter') class Block(Stmt): """A node that represents a block.""" fields = ('name', 'body', 'scoped') class Include(Stmt): """A node that represents the include tag.""" fields = ('template', 'with_context', 'ignore_missing') class Import(Stmt): """A node that represents the import tag.""" fields = ('template', 'target', 'with_context') class FromImport(Stmt): """A node that represents the from import tag. It's important to not pass unsafe names to the name attribute. The compiler translates the attribute lookups directly into getattr calls and does *not* use the subscript callback of the interface. As exported variables may not start with double underscores (which the parser asserts) this is not a problem for regular Jinja code, but if this node is used in an extension extra care must be taken. The list of names may contain tuples if aliases are wanted. """ fields = ('template', 'names', 'with_context') class ExprStmt(Stmt): """A statement that evaluates an expression and discards the result.""" fields = ('node',) class Assign(Stmt): """Assigns an expression to a target.""" fields = ('target', 'node') class Expr(Node): """Baseclass for all expressions.""" abstract = True def as_const(self, eval_ctx=None): """Return the value of the expression as constant or raise :exc:`Impossible` if this was not possible. An :class:`EvalContext` can be provided, if none is given a default context is created which requires the nodes to have an attached environment. .. versionchanged:: 2.4 the `eval_ctx` parameter was added. """ raise Impossible() def can_assign(self): """Check if it's possible to assign something to this node.""" return False class BinExpr(Expr): """Baseclass for all binary expressions.""" fields = ('left', 'right') operator = None abstract = True def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) # intercepted operators cannot be folded at compile time if self.environment.sandboxed and \ self.operator in self.environment.intercepted_binops: raise Impossible() f = _binop_to_func[self.operator] try: return f(self.left.as_const(eval_ctx), self.right.as_const(eval_ctx)) except Exception: raise Impossible() class UnaryExpr(Expr): """Baseclass for all unary expressions.""" fields = ('node',) operator = None abstract = True def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) # intercepted operators cannot be folded at compile time if self.environment.sandboxed and \ self.operator in self.environment.intercepted_unops: raise Impossible() f = _uaop_to_func[self.operator] try: return f(self.node.as_const(eval_ctx)) except Exception: raise Impossible() class Name(Expr): """Looks up a name or stores a value in a name. The `ctx` of the node can be one of the following values: - `store`: store a value in the name - `load`: load that name - `param`: like `store` but if the name was defined as function parameter. """ fields = ('name', 'ctx') def can_assign(self): return self.name not in ('true', 'false', 'none', 'True', 'False', 'None') class Literal(Expr): """Baseclass for literals.""" abstract = True class Const(Literal): """All constant values. The parser will return this node for simple constants such as ``42`` or ``"foo"`` but it can be used to store more complex values such as lists too. Only constants with a safe representation (objects where ``eval(repr(x)) == x`` is true). """ fields = ('value',) def as_const(self, eval_ctx=None): return self.value @classmethod def from_untrusted(cls, value, lineno=None, environment=None): """Return a const object if the value is representable as constant value in the generated code, otherwise it will raise an `Impossible` exception. """ from .compiler import has_safe_repr if not has_safe_repr(value): raise Impossible() return cls(value, lineno=lineno, environment=environment) class TemplateData(Literal): """A constant template string.""" fields = ('data',) def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) if eval_ctx.volatile: raise Impossible() if eval_ctx.autoescape: return Markup(self.data) return self.data class Tuple(Literal): """For loop unpacking and some other things like multiple arguments for subscripts. Like for :class:`Name` `ctx` specifies if the tuple is used for loading the names or storing. """ fields = ('items', 'ctx') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return tuple(x.as_const(eval_ctx) for x in self.items) def can_assign(self): for item in self.items: if not item.can_assign(): return False return True class List(Literal): """Any list literal such as ``[1, 2, 3]``""" fields = ('items',) def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return [x.as_const(eval_ctx) for x in self.items] class Dict(Literal): """Any dict literal such as ``{1: 2, 3: 4}``. The items must be a list of :class:`Pair` nodes. """ fields = ('items',) def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return dict(x.as_const(eval_ctx) for x in self.items) class Pair(Helper): """A key, value pair for dicts.""" fields = ('key', 'value') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return self.key.as_const(eval_ctx), self.value.as_const(eval_ctx) class Keyword(Helper): """A key, value pair for keyword arguments where key is a string.""" fields = ('key', 'value') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return self.key, self.value.as_const(eval_ctx) class CondExpr(Expr): """A conditional expression (inline if expression). (``{{ foo if bar else baz }}``) """ fields = ('test', 'expr1', 'expr2') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) if self.test.as_const(eval_ctx): return self.expr1.as_const(eval_ctx) # if we evaluate to an undefined object, we better do that at runtime if self.expr2 is None: raise Impossible() return self.expr2.as_const(eval_ctx) class Filter(Expr): """This node applies a filter on an expression. `name` is the name of the filter, the rest of the fields are the same as for :class:`Call`. If the `node` of a filter is `None` the contents of the last buffer are filtered. Buffers are created by macros and filter blocks. """ fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) if eval_ctx.volatile or self.node is None: raise Impossible() # we have to be careful here because we call filter_ below. # if this variable would be called filter, 2to3 would wrap the # call in a list beause it is assuming we are talking about the # builtin filter function here which no longer returns a list in # python 3. because of that, do not rename filter_ to filter! filter_ = self.environment.filters.get(self.name) if filter_ is None or getattr(filter_, 'contextfilter', False): raise Impossible() obj = self.node.as_const(eval_ctx) args = [x.as_const(eval_ctx) for x in self.args] if getattr(filter_, 'evalcontextfilter', False): args.insert(0, eval_ctx) elif getattr(filter_, 'environmentfilter', False): args.insert(0, self.environment) kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs) if self.dyn_args is not None: try: args.extend(self.dyn_args.as_const(eval_ctx)) except Exception: raise Impossible() if self.dyn_kwargs is not None: try: kwargs.update(self.dyn_kwargs.as_const(eval_ctx)) except Exception: raise Impossible() try: return filter_(obj, *args, **kwargs) except Exception: raise Impossible() class Test(Expr): """Applies a test on an expression. `name` is the name of the test, the rest of the fields are the same as for :class:`Call`. """ fields = ('node', 'name', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') class Call(Expr): """Calls an expression. `args` is a list of arguments, `kwargs` a list of keyword arguments (list of :class:`Keyword` nodes), and `dyn_args` and `dyn_kwargs` has to be either `None` or a node that is used as node for dynamic positional (``*args``) or keyword (``**kwargs``) arguments. """ fields = ('node', 'args', 'kwargs', 'dyn_args', 'dyn_kwargs') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) if eval_ctx.volatile or eval_ctx.environment.sandboxed: raise Impossible() obj = self.node.as_const(eval_ctx) # don't evaluate context functions args = [x.as_const(eval_ctx) for x in self.args] if isinstance(obj, _context_function_types): if getattr(obj, 'contextfunction', False): raise Impossible() elif getattr(obj, 'evalcontextfunction', False): args.insert(0, eval_ctx) elif getattr(obj, 'environmentfunction', False): args.insert(0, self.environment) kwargs = dict(x.as_const(eval_ctx) for x in self.kwargs) if self.dyn_args is not None: try: args.extend(self.dyn_args.as_const(eval_ctx)) except Exception: raise Impossible() if self.dyn_kwargs is not None: try: kwargs.update(self.dyn_kwargs.as_const(eval_ctx)) except Exception: raise Impossible() try: return obj(*args, **kwargs) except Exception: raise Impossible() class Getitem(Expr): """Get an attribute or item from an expression and prefer the item.""" fields = ('node', 'arg', 'ctx') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) if self.ctx != 'load': raise Impossible() try: return self.environment.getitem(self.node.as_const(eval_ctx), self.arg.as_const(eval_ctx)) except Exception: raise Impossible() def can_assign(self): return False class Getattr(Expr): """Get an attribute or item from an expression that is a ascii-only bytestring and prefer the attribute. """ fields = ('node', 'attr', 'ctx') def as_const(self, eval_ctx=None): if self.ctx != 'load': raise Impossible() try: eval_ctx = get_eval_context(self, eval_ctx) return self.environment.getattr(self.node.as_const(eval_ctx), self.attr) except Exception: raise Impossible() def can_assign(self): return False class Slice(Expr): """Represents a slice object. This must only be used as argument for :class:`Subscript`. """ fields = ('start', 'stop', 'step') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) def const(obj): if obj is None: return None return obj.as_const(eval_ctx) return slice(const(self.start), const(self.stop), const(self.step)) class Concat(Expr): """Concatenates the list of expressions provided after converting them to unicode. """ fields = ('nodes',) def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return ''.join(text_type(x.as_const(eval_ctx)) for x in self.nodes) class Compare(Expr): """Compares an expression with some other expressions. `ops` must be a list of :class:`Operand`\s. """ fields = ('expr', 'ops') def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) result = value = self.expr.as_const(eval_ctx) try: for op in self.ops: new_value = op.expr.as_const(eval_ctx) result = _cmpop_to_func[op.op](value, new_value) value = new_value except Exception: raise Impossible() return result class Operand(Helper): """Holds an operator and an expression.""" fields = ('op', 'expr') if __debug__: Operand.__doc__ += '\nThe following operators are available: ' + \ ', '.join(sorted('``%s``' % x for x in set(_binop_to_func) | set(_uaop_to_func) | set(_cmpop_to_func))) class Mul(BinExpr): """Multiplies the left with the right node.""" operator = '*' class Div(BinExpr): """Divides the left by the right node.""" operator = '/' class FloorDiv(BinExpr): """Divides the left by the right node and truncates conver the result into an integer by truncating. """ operator = '//' class Add(BinExpr): """Add the left to the right node.""" operator = '+' class Sub(BinExpr): """Substract the right from the left node.""" operator = '-' class Mod(BinExpr): """Left modulo right.""" operator = '%' class Pow(BinExpr): """Left to the power of right.""" operator = '**' class And(BinExpr): """Short circuited AND.""" operator = 'and' def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return self.left.as_const(eval_ctx) and self.right.as_const(eval_ctx) class Or(BinExpr): """Short circuited OR.""" operator = 'or' def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return self.left.as_const(eval_ctx) or self.right.as_const(eval_ctx) class Not(UnaryExpr): """Negate the expression.""" operator = 'not' class Neg(UnaryExpr): """Make the expression negative.""" operator = '-' class Pos(UnaryExpr): """Make the expression positive (noop for most expressions)""" operator = '+' # Helpers for extensions class EnvironmentAttribute(Expr): """Loads an attribute from the environment object. This is useful for extensions that want to call a callback stored on the environment. """ fields = ('name',) class ExtensionAttribute(Expr): """Returns the attribute of an extension bound to the environment. The identifier is the identifier of the :class:`Extension`. This node is usually constructed by calling the :meth:`~jinja2.ext.Extension.attr` method on an extension. """ fields = ('identifier', 'name') class ImportedName(Expr): """If created with an import name the import name is returned on node access. For example ``ImportedName('cgi.escape')`` returns the `escape` function from the cgi module on evaluation. Imports are optimized by the compiler so there is no need to assign them to local variables. """ fields = ('importname',) class InternalName(Expr): """An internal name in the compiler. You cannot create these nodes yourself but the parser provides a :meth:`~jinja2.parser.Parser.free_identifier` method that creates a new identifier for you. This identifier is not available from the template and is not threated specially by the compiler. """ fields = ('name',) def __init__(self): raise TypeError('Can\'t create internal names. Use the ' '`free_identifier` method on a parser.') class MarkSafe(Expr): """Mark the wrapped expression as safe (wrap it as `Markup`).""" fields = ('expr',) def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) return Markup(self.expr.as_const(eval_ctx)) class MarkSafeIfAutoescape(Expr): """Mark the wrapped expression as safe (wrap it as `Markup`) but only if autoescaping is active. .. versionadded:: 2.5 """ fields = ('expr',) def as_const(self, eval_ctx=None): eval_ctx = get_eval_context(self, eval_ctx) if eval_ctx.volatile: raise Impossible() expr = self.expr.as_const(eval_ctx) if eval_ctx.autoescape: return Markup(expr) return expr class ContextReference(Expr): """Returns the current template context. It can be used like a :class:`Name` node, with a ``'load'`` ctx and will return the current :class:`~jinja2.runtime.Context` object. Here an example that assigns the current template name to a variable named `foo`:: Assign(Name('foo', ctx='store'), Getattr(ContextReference(), 'name')) """ class Continue(Stmt): """Continue a loop.""" class Break(Stmt): """Break a loop.""" class Scope(Stmt): """An artificial scope.""" fields = ('body',) class EvalContextModifier(Stmt): """Modifies the eval context. For each option that should be modified, a :class:`Keyword` has to be added to the :attr:`options` list. Example to change the `autoescape` setting:: EvalContextModifier(options=[Keyword('autoescape', Const(True))]) """ fields = ('options',) class ScopedEvalContextModifier(EvalContextModifier): """Modifies the eval context and reverts it later. Works exactly like :class:`EvalContextModifier` but will only modify the :class:`~jinja2.nodes.EvalContext` for nodes in the :attr:`body`. """ fields = ('body',) # make sure nobody creates custom nodes def _failing_new(*args, **kwargs): raise TypeError('can\'t create custom node types') NodeType.__new__ = staticmethod(_failing_new); del _failing_new PK[>үDD site-packages/jinja2/sandbox.pyonu[ L]c@s8dZddlZddlZddlmZddlmZddlmZddl m Z m Z m Z m Z mZmZmZmZmZddlmZeZeedrdd lmZeZnd Zed d d ddgZedddgZeddgZeddgZ eddgZ!esJeZnddl"Z"e"j#dde$ddddlm%Z%efZ&e'fZ(e)fZ*yGddl+m+Z+m,Z,ddl-m-Z-e(e+e,f7Z(e&e-f7Z&Wne.k rnXy!dd l/m0Z0e&e0f7Z&Wne.k r)nXyGdd!lm1Z1m2Z2m3Z3e&e1f7Z&e(e2f7Z(e*e3f7Z*Wne.k rnXe&e4d"d#d$d%d&d'd(d)gfe(e4d#d&d*d+d)gfe*e4d,d-d.d/d0d'gfe%e4d,d1d#d0d2d&d3d'd4g ffZ5eedrCd5efd6YZ6nd7efd8YZ7d9Z8d:Z9d;Z:d<Z;d=Z<d>efd?YZ=d@e=fdAYZ>er4yddBl?m@Z@Wne.k rdCZ@nXdDeAfdEYZBdFeBefdGYZCdHeBe6fdIYZDndS(Jsj jinja2.sandbox ~~~~~~~~~~~~~~ Adds a sandbox layer to Jinja as it was the default behavior in the old Jinja 1 releases. This sandbox is slightly different from Jinja 1 as the default behavior is easier to use. The behavior can be changed by subclassing the environment. :copyright: (c) 2010 by the Jinja Team. :license: BSD. iN(tMapping(t Environment(t SecurityError( t string_typest function_typet method_typettraceback_typet code_typet frame_typetgenerator_typet text_typetPY2(tMarkuptformat(t Formatterit func_closuret func_codet func_dictt func_defaultst func_globalstim_classtim_functim_selftgi_frametgi_codetcr_frametcr_codetag_codetag_frametignoresthe sets moduletmodulesjinja2.sandbox(tdeque(tUserDictt DictMixin(tUserList(tSet(t MutableSettMutableMappingtMutableSequencetaddtcleartdifference_updatetdiscardtpoptremovetsymmetric_difference_updatetupdatetpopitemt setdefaulttappendtreversetinserttsorttextendt appendleftt extendlefttpoplefttrotatetEscapeFormattercBseZdZdZRS(cCs ||_dS(N(tescape(tselfR;((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt__init__tscCst|dr!|j|}n`t|drf|rWtdj|t|n|j}ntj||t|}t|j |S(Nt__html_format__t__html__sFormat specifier {0} given, but {1} does not define __html_format__. A class that defines __html__ must define __html_format__ to work with format specifiers.( thasattrR>t ValueErrorR ttypeR?Rt format_fieldR R;(R<tvaluet format_spectrv((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRCws(t__name__t __module__R=RC(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyR:ss t_MagicFormatMappingcBs2eZdZdZdZdZdZRS(sThis class implements a dummy wrapper to fix a bug in the Python standard library for string formatting. See http://bugs.python.org/issue13598 for information about why this is necessary. cCs||_||_d|_dS(Ni(t_argst_kwargst _last_index(R<targstkwargs((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyR=s  cCsa|dkrV|j}|jd7_y|j|SWntk rFnXt|}n|j|S(Nti(RLRJt LookupErrortstrRK(R<tkeytidx((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt __getitem__s   cCs t|jS(N(titerRK(R<((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt__iter__scCs t|jS(N(tlenRK(R<((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt__len__s(RGRHt__doc__R=RTRVRX(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRIs   cCsYts dSt|tjtjf s5|jdkr9dS|j}t|trU|SdS(NR ( t has_formattNonet isinstancettypest MethodTypetBuiltinMethodTypeRGt__self__R(tcallabletobj((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytinspect_format_methods  cGs5t|}t|tkr1tdtn|S(sWA range that can't generate ranges with a length of more than MAX_RANGE items. s+range too big, maximum size for range is %d(trangeRWt MAX_RANGEt OverflowError(RMtrng((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt safe_ranges   cCs t|_|S(snMarks a function or method as unsafe. :: @unsafe def delete(self): pass (tTruetunsafe_callable(tf((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytunsafes cCs%t|tr"|tkrtSnt|trP|tksI|tkrtSnt|trr|dkrtSnt|ttt frtSt|t r|t krtSnht t drt|t jr|tkrtSn4t t drt|t jrttkrtSn|jdS(s Test if the attribute given is an internal python attribute. For example this function returns `True` for the `func_code` attribute of python objects. This is useful if the environment method :meth:`~SandboxedEnvironment.is_safe_attribute` is overridden. >>> from jinja2.sandbox import is_internal_attribute >>> is_internal_attribute(lambda: None, "func_code") True >>> is_internal_attribute((lambda x:x).func_code, 'co_code') True >>> is_internal_attribute(str, "upper") False tmrot CoroutineTypetAsyncGeneratorTypet__(R\RtUNSAFE_FUNCTION_ATTRIBUTESRiRtUNSAFE_METHOD_ATTRIBUTESRBRRRR tUNSAFE_GENERATOR_ATTRIBUTESR@R]RntUNSAFE_COROUTINE_ATTRIBUTESRotattrit!UNSAFE_ASYNC_GENERATOR_ATTRIBUTESt startswith(Rbtattr((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytis_internal_attributes,     ! ! cCs4x-tD]%\}}t||r||kSqWtS(sThis function checks if an attribute on a builtin mutable object (list, dict, set or deque) would modify it if called. It also supports the "user"-versions of the objects (`sets.Set`, `UserDict.*` etc.) and with Python 2.6 onwards the abstract base classes `MutableSet`, `MutableMapping`, and `MutableSequence`. >>> modifies_known_mutable({}, "clear") True >>> modifies_known_mutable({}, "keys") False >>> modifies_known_mutable([], "append") True >>> modifies_known_mutable([], "index") False If called with an unsupported object (such as unicode) `False` is returned. >>> modifies_known_mutable("foo", "upper") False (t _mutable_specR\tFalse(RbRxttypespecRl((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytmodifies_known_mutablestSandboxedEnvironmentcBseZdZeZiejd6ejd6ejd6ej d6ej d6ej d6ej d6Z iejd6ejd6ZeZeZdZd Zd Zd Zd Zd ZdZdZdZdZdZRS(sThe sandboxed environment. It works like the regular environment but tells the compiler to generate sandboxed code. Additionally subclasses of this environment may override the methods that tell the runtime what attributes or functions are safe to access. If the template tries to access insecure code a :exc:`SecurityError` is raised. However also other exceptions may occur during the rendering so the caller has to ensure that all exceptions are caught. t+t-t*t/s//s**t%cCstS(sCalled during template compilation with the name of a unary operator to check if it should be intercepted at runtime. If this method returns `True`, :meth:`call_unop` is excuted for this unary operator. The default implementation of :meth:`call_unop` will use the :attr:`unop_table` dictionary to perform the operator with the same logic as the builtin one. The following unary operators are interceptable: ``+`` and ``-`` Intercepted calls are always slower than the native operator call, so make sure only to intercept the ones you are interested in. .. versionadded:: 2.6 (R{(R<toperator((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytintercept_unopPscOsHtj|||t|jd<|jj|_|jj|_dS(NRd( RR=Rhtglobalstdefault_binop_tabletcopyt binop_tabletdefault_unop_tablet unop_table(R<RMRN((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyR=bs cCs|jdpt|| S(sYThe sandboxed environment will call this method to check if the attribute of an object is safe to access. Per default all attributes starting with an underscore are considered private as well as the special attributes of internal python objects as returned by the :func:`is_internal_attribute` function. t_(RwRy(R<RbRxRD((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytis_safe_attributehscCs#t|dtp!t|dt S(sCheck if an object is safely callable. Per default a function is considered safe unless the `unsafe_callable` attribute exists and is True. Override this method to alter the behavior, but this won't affect the `unsafe` decorator from this module. Rjt alters_data(tgetattrR{(R<Rb((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytis_safe_callableqscCs|j|||S(sFor intercepted binary operator calls (:meth:`intercepted_binops`) this function is executed instead of the builtin operator. This can be used to fine tune the behavior of certain operators. .. versionadded:: 2.6 (R(R<tcontextRtlefttright((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt call_binopzscCs|j||S(sFor intercepted unary operator calls (:meth:`intercepted_unops`) this function is executed instead of the builtin operator. This can be used to fine tune the behavior of certain operators. .. versionadded:: 2.6 (R(R<RRtarg((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt call_unopscCsy ||SWnttfk rt|tryt|}Wntk rTqXyt||}Wntk r{qX|j|||r|S|j ||SqnX|j d|d|S(s(Subscribe an object from sandboxed code.Rbtname( t TypeErrorRPR\RRQt ExceptionRtAttributeErrorRtunsafe_undefinedt undefined(R<RbtargumentRxRD((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pytgetitems    cCsyt||}Wn7tk rLy ||SWqvttfk rHqvXn*X|j|||rf|S|j||S|jd|d|S(sSubscribe an object from sandboxed code and prefer the attribute. The attribute passed *must* be a bytestring. RbR(RRRRPRRR(R<Rbt attributeRD((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRs  cCs/|jd||jjfd|d|dtS(s1Return an undefined object for unsafe attributes.s.access to attribute %r of %r object is unsafe.RRbtexc(Rt __class__RGR(R<RbR((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRs cCsdt|tr$t||j}n t|}t||}|j|||}t||S(sIf a format call is detected, then this is routed through this method so that our safety sandbox can be used for it. (R\R tSandboxedEscapeFormatterR;tSandboxedFormatterRItvformatRB(R<tsRMRNt formatterRF((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt format_strings  cOsct|}|dk r+|j|||S|j|sPtd|fn|j|||S(s#Call an object from sandboxed code.s%r is not safely callableN(RcR[RRRtcall(t_SandboxedEnvironment__selft_SandboxedEnvironment__contextt_SandboxedEnvironment__objRMRNtfmt((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRs   (RGRHRYRit sandboxedRR'tsubtmulttruedivtfloordivtpowtmodRtpostnegRt frozensettintercepted_binopstintercepted_unopsRR=RRRRRRRRR(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyR~s4                  tImmutableSandboxedEnvironmentcBseZdZdZRS(sWorks exactly like the regular `SandboxedEnvironment` but does not permit modifications on the builtin mutable objects `list`, `set`, and `dict` by using the :func:`modifies_known_mutable` function. cCs*tj||||stSt|| S(N(R~RR{R}(R<RbRxRD((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRs(RGRHRYR(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRs(tformatter_field_name_splitcCs |jS(N(t_formatter_field_name_split(t field_name((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRstSandboxedFormatterMixincBseZdZdZRS(cCs ||_dS(N(t_env(R<tenv((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyR=sc Cs{t|\}}|j|||}xG|D]?\}}|rX|jj||}q.|jj||}q.W||fS(N(Rt get_valueRRR( R<RRMRNtfirsttrestRbtis_attrti((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyt get_fields(RGRHR=R(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRs RcBseZdZRS(cCs!tj||tj|dS(N(RR=R(R<R((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyR=s(RGRHR=(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRsRcBseZdZRS(cCs$tj||tj||dS(N(RR=R:(R<RR;((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyR=s(RGRHR=(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyRs(ERYR]Rt collectionsRtjinja2.environmentRtjinja2.exceptionsRtjinja2._compatRRRRRRR R R t jinja2.utilsR R{RZR@tstringRRiRetsetRqRrRsRtRvtwarningstfilterwarningstDeprecationWarningRt_mutable_set_typestdictt_mutable_mapping_typestlistt_mutable_sequence_typesR R!R"t ImportErrortsetsR#R$R%R&RRzR:RIRcRhRlRyR}R~Rt_stringRtobjectRRR(((s2/usr/lib/python2.7/site-packages/jinja2/sandbox.pyts  @              &    PK[ȵsite-packages/jinja2/meta.pycnu[ ,Qc@sbdZddlmZddlmZddlmZdefdYZdZdZ d S( s5 jinja2.meta ~~~~~~~~~~~ This module implements various functions that exposes information about templates that might be interesting for various kinds of applications. :copyright: (c) 2010 by the Jinja Team, see AUTHORS for more details. :license: BSD, see LICENSE for more details. i(tnodes(t CodeGenerator(t string_typestTrackingCodeGeneratorcBs)eZdZdZdZdZRS(s.We abuse the code generator for introspection.cCs&tj||ddt|_dS(Ns(Rt__init__tsettundeclared_identifiers(tselft environment((s//usr/lib/python2.7/site-packages/jinja2/meta.pyRscCsdS(s Don't write.N((Rtx((s//usr/lib/python2.7/site-packages/jinja2/meta.pytwritescCs|jj|jjdS(s$Remember all undeclared identifiers.N(Rtupdatet identifierst undeclared(Rtframe((s//usr/lib/python2.7/site-packages/jinja2/meta.pyt pull_localss(t__name__t __module__t__doc__RR R(((s//usr/lib/python2.7/site-packages/jinja2/meta.pyRs  cCs#t|j}|j||jS(sReturns a set of all variables in the AST that will be looked up from the context at runtime. Because at compile time it's not known which variables will be used depending on the path the execution takes at runtime, all variables are returned. >>> from jinja2 import Environment, meta >>> env = Environment() >>> ast = env.parse('{% set foo = 42 %}{{ bar + foo }}') >>> meta.find_undeclared_variables(ast) set(['bar']) .. admonition:: Implementation Internally the code generator is used for finding undeclared variables. This is good to know because the code generator might raise a :exc:`TemplateAssertionError` during compilation and as a matter of fact this function can currently raise that exception as well. (RRtvisitR(tasttcodegen((s//usr/lib/python2.7/site-packages/jinja2/meta.pytfind_undeclared_variables!s ccsKxD|jtjtjtjtjfD]}t|jtjst|jtj tj frxS|jj D]=}t|tjrt|j t r|j VqqndVqnWq(dVq(nt|jj t r|jj Vq(t|tjr>t|jj ttfr>x3|jj D]}t|t r|VqqWq(dVq(WdS(sbFinds all the referenced templates from the AST. This will return an iterator over all the hardcoded template extensions, inclusions and imports. If dynamic inheritance or inclusion is used, `None` will be yielded. >>> from jinja2 import Environment, meta >>> env = Environment() >>> ast = env.parse('{% extends "layout.html" %}{% include helper %}') >>> list(meta.find_referenced_templates(ast)) ['layout.html', None] This function is useful for dependency tracking. For example if you want to rebuild parts of the website after a layout template has changed. N(tfind_allRtExtendst FromImporttImporttIncludet isinstancettemplatetConsttTupletListtitemstvalueRtNonettupletlist(Rtnodet template_name((s//usr/lib/python2.7/site-packages/jinja2/meta.pytfind_referenced_templates9s& N( Rtjinja2Rtjinja2.compilerRtjinja2._compatRRRR((((s//usr/lib/python2.7/site-packages/jinja2/meta.pyt s  PK[hD}$site-packages/jinja2/environment.pycnu[ ,Qc@s|dZddlZddlZddlmZddlmZmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZddlmZmZddlmZddlmZddlmZdd lmZdd l m!Z!m"Z"dd l#m$Z$m%Z%m&Z&m'Z'dd l(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/dd l0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<ddl=m>Z>e*dZ?e@aAdZBdZCdZDdZEdZFdeGfdYZHdeGfdYZIe8deGfdYZJdeGfdYZKe7deGfdYZLeIeH_MdS(s jinja2.environment ~~~~~~~~~~~~~~~~~~ Provides a class that holds runtime and parsing time options. :copyright: (c) 2010 by the Jinja Team. :license: BSD, see LICENSE for more details. iN(tnodes(tBLOCK_START_STRINGtBLOCK_END_STRINGtVARIABLE_START_STRINGtVARIABLE_END_STRINGtCOMMENT_START_STRINGtCOMMENT_END_STRINGtLINE_STATEMENT_PREFIXtLINE_COMMENT_PREFIXt TRIM_BLOCKStNEWLINE_SEQUENCEtDEFAULT_FILTERSt DEFAULT_TESTStDEFAULT_NAMESPACEtKEEP_TRAILING_NEWLINEt LSTRIP_BLOCKS(t get_lexert TokenStream(tParser(t EvalContext(toptimize(tgenerate(t Undefinedt new_context(tTemplateSyntaxErrortTemplateNotFoundtTemplatesNotFoundtTemplateRuntimeError(t import_stringtLRUCachetMarkuptmissingtconcattconsumet internalcode( timaptifiltert string_typest iteritemst text_typetreraisetimplements_iteratortimplements_to_stringtget_nexttencode_filenametPY2tPYPY(treducei cGs_ytj|}Wntk r-t|SX|dk r>|St|t|<}t|_|S(sReturn a new spontaneous environment. A spontaneous environment is an unnamed and unaccessible (in theory) environment that is used for templates generated from a string and not from the file system. N(t_spontaneous_environmentstgett TypeErrort EnvironmenttNonetTruetshared(targstenv((s6/usr/lib/python2.7/site-packages/jinja2/environment.pytget_spontaneous_environment,s    cCs*|dkrdS|dkr iSt|S(s*Return the cache class for the given size.iN(R4R(tsize((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt create_cache<s   cCs3|dkrdSt|tkr&iSt|jS(s(Create an empty copy of the given cache.N(R4ttypetdictRtcapacity(tcache((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt copy_cacheEs  cCsLi}x?|D]7}t|tr1t|}n||||j|jknsOtd|jdksjtd|S(s*Perform a sanity check on the environment.sGundefined must be a subclass of undefined because filters depend on it.s;block, variable and comment start strings must be differents s s s3newline_sequence set to unknown line ending string.(s s s (t issubclasst undefinedRtAssertionErrortblock_start_stringtvariable_start_stringtcomment_start_stringtnewline_sequence(RC((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt_environment_sanity_checkZs R3cBsQeZdZeZeZd!ZeZd!Z d!Z e e e eeeeeeeeed"eed!ed!ded!dZdZdZeeeeeeeeeeeeeeeeeeedZeeddZ dZ!d Z"d Z#d!d!d!d!d Z$d!d!d Z%e&d!d!d Z'dZ(d!d!dZ)d!d!dZ*d!d!dZ+edZ,dZ-e&d!d!eedZ.edZ/d!d!dd!eedZ0d!d!dZ1d!ed!dZ2dZ3e&dZ4e&d!d!dZ5e&d!d!dZ6e&d!d!dZ7d!d!dZ8d Z9RS(#sThe core component of Jinja is the `Environment`. It contains important shared variables like configuration, filters, tests, globals and others. Instances of this class may be modified if they are not shared and if no template was loaded so far. Modifications on environments after the first template was loaded will lead to surprising effects and undefined behavior. Here the possible initialization parameters: `block_start_string` The string marking the begin of a block. Defaults to ``'{%'``. `block_end_string` The string marking the end of a block. Defaults to ``'%}'``. `variable_start_string` The string marking the begin of a print statement. Defaults to ``'{{'``. `variable_end_string` The string marking the end of a print statement. Defaults to ``'}}'``. `comment_start_string` The string marking the begin of a comment. Defaults to ``'{#'``. `comment_end_string` The string marking the end of a comment. Defaults to ``'#}'``. `line_statement_prefix` If given and a string, this will be used as prefix for line based statements. See also :ref:`line-statements`. `line_comment_prefix` If given and a string, this will be used as prefix for line based based comments. See also :ref:`line-statements`. .. versionadded:: 2.2 `trim_blocks` If this is set to ``True`` the first newline after a block is removed (block, not variable tag!). Defaults to `False`. `lstrip_blocks` If this is set to ``True`` leading spaces and tabs are stripped from the start of a line to a block. Defaults to `False`. `newline_sequence` The sequence that starts a newline. Must be one of ``'\r'``, ``'\n'`` or ``'\r\n'``. The default is ``'\n'`` which is a useful default for Linux and OS X systems as well as web applications. `keep_trailing_newline` Preserve the trailing newline when rendering templates. The default is ``False``, which causes a single newline, if present, to be stripped from the end of the template. .. versionadded:: 2.7 `extensions` List of Jinja extensions to use. This can either be import paths as strings or extension classes. For more information have a look at :ref:`the extensions documentation `. `optimized` should the optimizer be enabled? Default is `True`. `undefined` :class:`Undefined` or a subclass of it that is used to represent undefined values in the template. `finalize` A callable that can be used to process the result of a variable expression before it is output. For example one can convert `None` implicitly into an empty string here. `autoescape` If set to true the XML/HTML autoescaping feature is enabled by default. For more details about auto escaping see :class:`~jinja2.utils.Markup`. As of Jinja 2.4 this can also be a callable that is passed the template name and has to return `True` or `False` depending on autoescape should be enabled by default. .. versionchanged:: 2.4 `autoescape` can now be a function `loader` The template loader for this environment. `cache_size` The size of the cache. Per default this is ``50`` which means that if more than 50 templates are loaded the loader will clean out the least recently used template. If the cache size is set to ``0`` templates are recompiled all the time, if the cache size is ``-1`` the cache will not be cleaned. `auto_reload` Some loaders load templates from locations where the template sources may change (ie: file system or database). If `auto_reload` is set to `True` (default) every time a template is requested the loader checks if the source changed and if yes, it will reload the template. For higher performance it's possible to disable that. `bytecode_cache` If set to a bytecode cache object, this object will provide a cache for the internal Jinja bytecode so that templates don't have to be parsed if they were not changed. See :ref:`bytecode-cache` for more information. i2cCs||_||_||_||_||_||_||_||_| |_| |_ | |_ | |_ ||_ ||_ ||_||_tj|_tj|_tj|_||_t||_||_||_t|| |_t|dS(N(RKtblock_end_stringRLtvariable_end_stringRMtcomment_end_stringtline_statement_prefixtline_comment_prefixt trim_blockst lstrip_blocksRNtkeep_trailing_newlineRIt optimizedtfinalizet autoescapeR tcopytfiltersR ttestsR tglobalstloaderR;R?tbytecode_cachet auto_reloadRGRDRO(tselfRKRPRLRQRMRRRSRTRURVRNRWRDRXRIRYRZR_t cache_sizeRaR`((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt__init__s2"                   cCs |jjt||gdS(s\Adds an extension after the environment was created. .. versionadded:: 2.5 N(RDtupdateRG(RbRF((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt add_extension3scKsCx<t|D].\}}t||s t|||q q WdS(sAdd the items to the instance of the environment if they do not exist yet. This is used by :ref:`extensions ` to register callbacks and configuration values without breaking inheritance. N(R&thasattrtsetattr(Rbt attributestkeytvalue((s6/usr/lib/python2.7/site-packages/jinja2/environment.pytextend:scCs8tt}|d=|d=|d=tj|j}|jj|jt|_||_ x9t |D]+\}}|t k rht |||qhqhW|t k rt ||_nt|j|_i|_x3t |jD]"\}}|j||j|us(titertsortedRDtvalues(Rb((s6/usr/lib/python2.7/site-packages/jinja2/environment.pytiter_extensionsrscCsy ||SWnttfk rt|tr}yt|}Wntk rTq}Xyt||SWq}tk ryq}Xn|jd|d|SXdS(s:Get an item or attribute of an object but prefer the item.tobjtnameN( R2t LookupErrorRAR%tstrt ExceptiontgetattrtAttributeErrorRI(RbRtargumenttattr((s6/usr/lib/python2.7/site-packages/jinja2/environment.pytgetitemws   cCseyt||SWntk r$nXy ||SWn-tttfk r`|jd|d|SXdS(sGet an item or attribute of an object but prefer the attribute. Unlike :meth:`getitem` the attribute *must* be a bytestring. RRN(RRR2RRI(RbRt attribute((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyRs  cCs|jj|}|dkr1td|n|gt|pCd}t|dtr|dkrwtdn|jd|n}t|dtr|dkr|dk r|j}qt |}n|jd|n%t|dtr|jd|n|||piS( sfInvokes a filter on a value the same way the compiler does it. .. versionadded:: 2.7 sno filter named %rt contextfilters2Attempted to invoke context filter without contextitevalcontextfiltertenvironmentfilterN(( R\R1R4RtlistRtFalsetinsertteval_ctxR(RbRRkR7tkwargstcontextRtfunc((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt call_filters"     cCsM|jj|}|dkr1td|n|||p@d|pIiS(sdInvokes a test on a value the same way the compiler does it. .. versionadded:: 2.7 sno test named %rN((R]R1R4R(RbRRkR7RR((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt call_tests cCsNy|j|||SWntk r6tj}nX|j|d|dS(sParse the sourcecode and return the abstract syntax tree. This tree of nodes is used by the compiler to convert the template into executable source- or bytecode. This is useful for debugging or to extract information from templates. If you are :ref:`developing Jinja2 extensions ` this gives you a good overview of the node tree generated. t source_hintN(t_parseRtsystexc_infothandle_exception(RbtsourceRtfilenameR((s6/usr/lib/python2.7/site-packages/jinja2/environment.pytparses  cCst|||t|jS(s8Internal parsing function used by `parse` and `compile`.(RR,R(RbRRR((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyRscCs]t|}y|jj|||SWntk rEtj}nX|j|d|dS(sLex the given sourcecode and return a generator that yields tokens as tuples in the form ``(lineno, token_type, value)``. This can be useful for :ref:`extension development ` and debugging templates. This does not perform preprocessing. If you want the preprocessing of the extensions to be applied you have to filter source through the :meth:`preprocess` method. RN(R'tlexert tokeniterRRRR(RbRRRR((s6/usr/lib/python2.7/site-packages/jinja2/environment.pytlexs  cs(tfd|jt|S(sPreprocesses the source with all extensions. This is automatically called for all parsing and compiling methods but *not* for :meth:`lex` because there you usually only want the actual source tokenized. cs|j|S(N(t preprocess(tste(RR(s6/usr/lib/python2.7/site-packages/jinja2/environment.pyRzs(R/R~R'(RbRRR((RRs6/usr/lib/python2.7/site-packages/jinja2/environment.pyRscCs~|j|||}|jj||||}xG|jD]9}|j|}t|ts=t|||}q=q=W|S(sCalled by the parser to do the preprocessing and filtering for all the extensions. Returns a :class:`~jinja2.lexer.TokenStream`. (RRttokenizeR~t filter_streamRAR(RbRRRtstatetstreamtext((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt _tokenizescCst||||d|S(s|Internal hook that can be overridden to hook a different generate method in. .. versionadded:: 2.5 t defer_init(R(RbRRRR((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt _generatescCst||dS(s{Internal hook that can be overridden to hook a different compile method in. .. versionadded:: 2.5 texec(tcompile(RbRR((s6/usr/lib/python2.7/site-packages/jinja2/environment.pyt_compilescCsd}yt|tr6|}|j|||}n|jrQt||}n|j|||d|}|rv|S|dkrd}n t|}|j||SWnt k rt j }nX|j |d|dS(sCompile a node or template source code. The `name` parameter is the load name of the template after it was joined using :meth:`join_path` if necessary, not the filename on the file system. the `filename` parameter is the estimated filename of the template on the file system. If the template came from a database or memory this can be omitted. The return value of this method is a python code object. If the `raw` parameter is `True` the return value will be a string with python code equivalent to the bytecode returned otherwise. This method is mainly used internally. `defer_init` is use internally to aid the module code generator. This causes the generated code to be able to import without the global environment variable to be set. .. versionadded:: 2.4 `defer_init` parameter added. Rs