ÿØÿà JFIF    ÿÛ „  ( %"1!%)+...383,7(-.+  -+++--++++---+-+-----+---------------+---+-++7-----ÿÀ  ß â" ÿÄ     ÿÄ H    !1AQaq"‘¡2B±ÁÑð#R“Ò Tbr‚²á3csƒ’ÂñDS¢³$CÿÄ   ÿÄ %  !1AQa"23‘ÿÚ   ? ôÿ ¨pŸªáÿ —åYõõ\?àÒü©ŠÄï¨pŸªáÿ —åYõõ\?àÓü©ŠÄá 0Ÿªáÿ Ÿå[úƒ ú®ði~TÁbqÐ8OÕpÿ ƒOò¤Oè`–RÂáœá™êi€ßÉ< FtŸI“öÌ8úDf´°å}“¾œ6  öFá°y¥jñÇh†ˆ¢ã/ÃÐ:ªcÈ "Y¡ðÑl>ÿ ”ÏËte:qž\oäŠe÷󲍷˜HT4&ÿ ÓÐü6ö®¿øþßèô Ÿ•7Ñi’•j|“ñì>b…þS?*Óôÿ ÓÐü*h¥£ír¶ü UãS炟[AÐaè[ûª•õ&õj?†Éö+EzP—WeÒírJFt ‘BŒ†Ï‡%#tE Øz ¥OÛ«!1›üä±Í™%ºÍãö]°î(–:@<‹ŒÊö×òÆt¦ãº+‡¦%ÌÁ²h´OƒJŒtMÜ>ÀÜÊw3Y´•牋4ǍýʏTì>œú=Íwhyë,¾Ôò×õ¿ßÊa»«þˆѪQ|%6ž™A õ%:øj<>É—ÿ Å_ˆCbõ¥š±ý¯Ýƒï…¶|RëócÍf溪“t.СøTÿ *Ä¿-{†çàczůŽ_–^XþŒ±miB[X±d 1,é”zEù»& î9gœf™9Ð'.;—™i}!ôšåîqêÛ٤ёý£½ÆA–àôe"A$˝Úsäÿ ÷Û #°xŸëí(l »ý3—¥5m! rt`†0~'j2(]S¦¦kv,ÚÇ l¦øJA£Šƒ J3E8ÙiŽ:cÉžúeZ°€¯\®kÖ(79«Ž:¯X”¾³Š&¡* ….‰Ž(ÜíŸ2¥ª‡×Hi²TF¤ò[¨íÈRëÉ䢍mgÑ.Ÿ<öäS0í„ǹÁU´f#Vß;Õ–…P@3ío<ä-±»Ž.L|kªÀê›fÂ6@»eu‚|ÓaÞÆŸ…¨ááå>åŠ?cKü6ùTÍÆ”†sĤÚ;H2RÚ†õ\Ö·Ÿn'¾ ñ#ºI¤Å´%çÁ­‚â7›‹qT3Iï¨ÖÚ5I7Ë!ÅOóŸ¶øÝñØôת¦$Tcö‘[«Ö³šÒ';Aþ ¸èíg A2Z"i¸vdÄ÷.iõ®§)¿]¤À†–‡É&ä{V¶iŽ”.Ó×Õÿ û?h¬Mt–íª[ÿ Ñÿ ÌV(í}=ibÔ¡›¥¢±b Lô¥‡piη_Z<‡z§èŒ)iÖwiÇ 2hÙ3·=’d÷8éŽ1¦¸c¤µ€7›7Ø ð\á)} ¹fËí›pAÃL%âc2 í§æQz¿;T8sæ°qø)QFMð‰XŒÂ±N¢aF¨…8¯!U  Z©RÊ ÖPVÄÀÍin™Ì-GˆªÅËŠ›•zË}º±ŽÍFò¹}Uw×#ä5B¤{î}Ð<ÙD é©¤&‡ïDbàÁôMÁ." ¤‡ú*õ'VŽ|¼´Úgllº¼klz[Æüï÷Aób‡Eÿ dÑ»Xx9ÃÜ£ÁT/`¼¸vI±Ýµ·Ë‚“G³þ*Ÿû´r|*}<¨îºœ @¦mÄ’M¹”.œ«Y–|6ÏU¤jç¥ÕÞqO ˜kDÆÁ¨5ÿ š;ÐЦ¦€GÙk \ –Þ=â¼=SͧµªS°ÚÍpÜãQűÀõ¬?ÃÁ1Ñ•õZà?hóœ€ L¦l{Y*K˜Ù›zc˜–ˆâ ø+¾ ­-Ök¥%ùEÜA'}ˆ><ÊIè“bpÍ/qÞâvoX€w,\úªò6Z[XdÒæ­@Ö—€$òJí#é>'°Ú ôª˜<)4ryÙ£|óAÅn5žêŸyÒäMÝ2{"}‰–¤l÷ûWX\l¾Á¸góÉOÔ /óñB¤f¸çñ[.P˜ZsÊË*ßT܈§QN¢’¡¨§V¼(Üù*eÕ“”5T¨‹Âê¥FŒã½Dü[8'Ò¥a…Ú¶k7a *•›¼'Ò·\8¨ª\@\õ¢¦íq+DÙrmÎ…_ªæ»ŠÓœ¡¯’Ré9MÅ×D™lælffc+ŒÑ,ý™ÿ ¯þǤ=Å’Á7µ÷ÚÛ/“Ü€ñýã¼àí¾ÕÑ+ƒ,uµMâÀÄbm:ÒÎPæ{˜Gz[ƒ¯«® KHà`ߨŠéí¯P8Aq.C‰ à€kòpj´kN¶qô€…Õ,ÜNŠª-­{Zö’æû44‰sŽè‰îVíRœÕm" 6?³D9¡ÇTíÅꋇ`4«¸ÝÁô ï’ýorqКÇZ«x4Žâéþuïf¹µö[P ,Q£éaX±`PÉÍZ ¸äYúg üAx ’6Lê‚xÝÓ*äQ  Ï’¨hÍ =²,6ï#rÃ<¯–£»ƒ‹,–ê•€ aÛsñ'%Æ"®ÛüìBᝠHÚ3ß°©$“XnœÖ’î2ËTeûìxîß ¦å¿çÉ ðK§þ{‘t‚Ϋ¬jéîZ[ ”š7L¥4VÚCE×]m¤Øy”ä4-dz£œ§¸x.*ãÊÊ b÷•h:©‡¦s`BTÁRû¾g⻩‹jø sF¢àJøFl‘È•Xᓁà~*j¯ +(ÚÕ6-£¯÷GŠØy‚<Ç’.F‹Hœw(+)ÜÜâÈzÄäT§FߘãÏ;DmVœ3Àu@mÚüXÝü•3B¨òÌÁÛ<·ÃÜ z,Ì@õÅ·d2]ü8s÷IôÞ¯^Ç9¢u„~ëAŸï4«M? K]­ÅàPl@s_ p:°¬ZR”´›JC[CS.h‹ƒïËœ«Æ]–÷ó‚wR×k7X‰k›‘´ù¦=¡«‰¨¨Â')—71ó’c‡Ðúµ `é.{§p¹ój\Ž{1h{o±Ý=áUÊïGÖŒõ–-BÄm+AZX¶¡ ïHðæ¥JmÙ;…䡟ˆ¦ ° äšiÉg«$üMk5¤L“’çÊvïâï ,=f“"íἊ5ô¬x6{ɏžID0e¸vçmi'︧ºð9$ò¹÷*£’9ÿ ²TÔ…×>JV¥}Œ}$p[bÔ®*[jzS*8 ”·T›Í–ñUîƒwo$áè=LT™ç—~ô·¤ÈÚ$榍q‰„+´kFm)ž‹©i–ËqÞŠ‰à¶ü( ‚•§ •°ò·‡#5ª•µÊ﯅¡X¨šÁ*F#TXJÊ ušJVÍ&=iÄs1‚3•'fý§5Ñ<=[íÞ­ PÚ;ѱÌ_~Ä££8rÞ ²w;’hDT°>ÈG¬8Á²ÚzŽ®ò®qZcqJêäÞ-ö[ܘbň±çb“ж31²n×iƒðÕ;1¶þÉ ªX‰,ßqÏ$>•î íZ¥Z 1{ç൵+ƒÕµ¥°T$§K]á»Ûï*·¤tMI’ÂZbŽÕiÒ˜}bÓ0£ª5›¨ [5Ž^ÝœWøÂÝh° ¢OWun£¤5 a2Z.G2³YL]jåtì”ä ÁÓ‘%"©<Ôúʰsº UZvä‡ÄiÆÒM .÷V·™ø#kèýiíÌ–ª)µT[)BˆõÑ xB¾B€ÖT¨.¥~ð@VĶr#¸ü*åZNDŽH;âi ],©£öØpù(šºãö¼T.uCê•4@ÿ GÕÛ)Cx›®0ø#:ÏðFÒbR\(€€Ä®fã4Þ‰Fä¯HXƒÅ,†öEÑÔÜ]Öv²?tLÃvBY£ú6Êu5ÅAQ³1‘’¬x–HŒÐ‡ ^ ¸KwJôÖŽ5×CÚ¨vÜ«/B0$×k°=ðbÇ(Ï)w±A†Á† 11Í=èQšµ626ŒÜ/`G«µ<}—-Ö7KEHÈÉðóȤmݱû±·ø«Snmá=“䫚mݱŸ¡¶~ó·“äUóJæúòB|E LêŽy´jDÔ$G¢þÐñ7óR8ýÒ…Ç› WVe#·Ÿ p·Fx~•ݤF÷0Èÿ K¯æS<6’¡WШ; ´ÿ ¥Êø\Òuî†åÝ–VNœkÒ7oòX¨Á­Ø÷FÎÑä±g÷ÿ M~Çî=p,X´ ÝÌÚÅ‹’ÃjÖ.ØöÏñ qïQ¤ÓZE†° =6·]܈ s¸>v•Ž^Ý\wq9r‰Î\¸¡kURÒ$­*‹Nq?Þª*!sŠÆ:TU_u±T+øX¡ ®¹¡,ÄâÃBTsÜ$Ø›4m椴zÜK]’’›Pƒ @€#â˜`é¹=I‡fiV•Ôî“nRm+µFPOhÍ0B£ €+¬5c v•:P'ÒyÎ ‰V~‚Ó†ÖuókDoh$å\*ö%Ю=£«…aȼ½÷Û.-½VŒŠ¼'lyî±1¬3ó#ÞE¿ÔS¤gV£m›=§\û"—WU¤ÚǼÿ ÂnÁGŒÃ ‚õN D³õNÚíŒÕ;HôyÄÈ©P¹Ä{:?R‘Ô¨âF÷ø£bÅó® JS|‚R÷ivýáâ€Æé¡è³´IئÑT!§˜•ت‚¬â@q€wnïCWÄ@JU€ê¯m6]Ï:£âx'+ÒðXvÓ¦Úm=–´7œ $ì“B£~p%ÕŸUþ« N@¼üï~w˜ñø5®—'Ôe»¤5ã//€ž~‰Tþ›Å7•#¤× Íö pÄ$ùeåì*«ÓŠEØWEÈsßg ¦ûvžSsLpºÊW–âµEWöˬH; ™!CYõZ ÃÄf æ#1W. \uWâ\,\Çf j’<qTbên›Î[vxx£ë 'ö¨1›˜ÀM¼Pÿ H)ƒêêŒA7s,|F“ 꺸k³9Ìö*ç®;Ö!Ö$Eiž•¹ÒÚ†ýóéÝû¾ÕS®ó$’NÝäŸz¤5r¦ãÄÃD÷Üø!°ø‡Ô&@m™Ì^Ãä­d q5Lnÿ N;.6½·N|#ä"1Nƒx“ã<3('&ñßt  ~ªu”1Tb㫨9ê–›–bìd$ߣ=#ÕãÒmU¯eí$EFù5ýYô櫨æì™Ç—±ssM]·á¿0ÕåJRÓªîiƒ+O58ÖñªŠÒx" \µâá¨i’¤i —Ö ” M+M¤ë9‚‰A¦°Qõ¾ßøK~¼Ã‘g…Ö´~÷Ï[3GUœÒ½#…kàÔ®Ò”‰³·dWV‰IP‰Ú8u¹”E ÖqLj¾êÕCBš{A^Âß;–¨`¯¬ìö ˼ ×tìø.tƐm*n¨y4o&Àx¥n¦×î‡aupáÛj8¿m›è¶ã!o½;ß0y^ý×^EÑ¿ÒjzŒ­)vÚÑnÄL …^ªô× ‡—‚3k Îý­hï]içå–îÏ*÷ñþ»Ô CÒjøjÍznˆ´ ¹#b'Fô‹ ‰v¥'’à'T´ƒHýÍ%M‰ ƒ&ÆÇŒï1 ‘ –Þ ‰i¬s žR-Ÿ kЬá¬7:þ 0ŒÅÒÕ/aÙ¬ÃÝ#Úøœ ©aiVc‰. ¹¦ãµ” ›Yg¦›ÆÎýº°f³7ƒhá·¸­}&D9¡ÂsÉÙÞèŠõØàC™¨ñbFC|´Ü(ŸƒÚÒ-%»'a Ì¿)ËÇn¿úÿ ÞŽX…4ÊÅH^ôΑí@ù¹Eh¶“L8Çjù ¼ÎåVªóR©Ï5uà V4lZß®=€xÖŸ–ÑÈ ÷”¨°¾__yM1tÉ?uÆþIkÄgæ@þ[¢†°XÃJ£j·:nkÅ¢u ‘}âGzö­/IµèЬ¼48q¦F°ŽR¼=ûì{´¯RýicS ÕÛ íNtÍÙï£,w4rêì®»~x(©Uñ§#Ñ&œÕ¤>ÎåÍÓ9’Ö{9eV­[Öjâ²ãu]˜å2›qÑšÕJç0€sÄ|Êëè0튔bÁ>“{×_F`Ø©ºê:µä,v¤ðfc1±"«ÔÍän1#=· Âøv~H½ÐßA¾¿Ü€Óš]Õ; I¾÷ç‚Qi†î¹9ywÔKG˜áñ zQY—§ÃÕZ07§X‚ Áh;ÁM)iÌCH-¯T‘ë|A0{Ò½LÚ–TâÖkÜ’dÀ“rmm»”جPF³ÖcbE§T€ÒxKºû’Ó®7±²(\4ŽÃ¸Uu@j™yĵ;³µ!Á¢b.W¤=mõ´êµK k ¸K^ÜÛ#p*Ü14qkZç5ïë †°5Ï%ÍÛ<Õ¤×Ô¥ê†C Õ´¼ú$ƒÖ“”]Ù¬qÞÚ[4©ý!ûÏ—Áb쳐XµA¬â~`›Çr¸8ìùÝ䫦<>ä÷«?xs´ÇÑ /á;¹øüÊÈÙà{"@Žïzâ¬[âß‚ U_<ÇŸ½4èN˜ú61®qŠu ¦þF£»äJ_ˆÙÎ~ ÞAã–݄ϗrŠD;xTž‘ô`É«…suãO`?³à™ô Lý#Íc5öoæØ‚y´´÷«ZR§<&JÇ+éâô´€i!Àˆ0æAoàðLèÖ-2ŸõW.’t^–(KÁmHµV@xÜÇy®Ñø­â^:Ú3w· 7½¹°ñ¸â¹®:',«Mœ—n­Á+Ãbš LÈ‘ÄnRÓÅœ%¦²‰¨ùQ:¤f‚ "PÕtô¸…cæl…&˜Ú˜Ôkv‹ž+vŠ,=¢v­6—Xy*¥t£«<™:“aîϲ=¦6rO]XI¿Œ÷¤zÚ­›¶ 6÷”w\d ü~v®ˆÌk«^m<ÿ ¢‰Õ\)ùºŽ;… lîÙÅEŠ®cѾ@vnMÏ,¼“ñ•ŽBxðÃzãÇç%3ˆ"}Ù•Åî> BÉú;Ò]V+P˜F_´ßé> Øše|ï‡ÄOmFæÇ ãqÞ$/xÐx­z`ï9"œÜij‚!7.\Td…9M‡•iŽ‹¾‘50ÞŽn¥ß4ÉôO ¹*í^QêËÜÇÌ8=ާs‰'ÂëÙ«á%Pú[O †ÅP¯Vsް.‰,kc¶ ¬A9n˜XÎ-ÞšN["¹QÕ‰ƒMýÁߺXJæÍaLj¾×Ãmã¾ãÚ uñÒþåQô¦¥ /ÄUx:‚ÍÜ’ Đ©ØÝ3V¨‰ÕnÐ6ó*óúK­«…c ¯U òhsý­jóÔj#,ímŒRµ«lbïUTŒÑ8†Ä0œÏr`ð¡¬É Ї ë"À² ™ 6¥ f¶ ¢ÚoܱԷ-<Àî)†a¶ž'Ú»¨TXqØæ¶÷YÄHy˜9ÈIW­YÀuMFë ºÏ’AqÌ4·/Ú †ô'i$øä­=Ä Ý|öK×40è|È6p‘0§)o¥ctî§H+CA-“ xØ|ÐXАç l8íºð3Ø:³¤¬KX¯UÿÙ 3 ^ d|@sbdZddddddddd d d d d dgZddlZddlZddlZddlZddlZddlmZddl Z ddl Z ddl Z ddl Z ddl mZddlmZejddedZejejGdddeZGdddeZejddZGdddeZddZddZddZd dZ Gd!ddZ!d"Z"e j#d#Z$dPd%d&Z%d'd(Z&e j#d)e j'Z(d*d+Z)d,d-Z*d.d/Z+Gd0d1d1Z,Gd2d3d3Z-Gd4d5d5e-Z.d6d7Z/Gd8dde0Z1d9d:d;dd?d?Z5d@dAZ6e7e8e9eje:fZ;GdBdCdCe3Zee/e,e.dFe?ee=e5edGdKdLdMd ZCe>dKdGdNdOdZDdS)Qaplistlib.py -- a tool to generate and parse MacOSX .plist files. The property list (.plist) file format is a simple XML pickle supporting basic object types, like dictionaries, lists, numbers and strings. Usually the top level object is a dictionary. To write out a plist file, use the dump(value, file) function. 'value' is the top level object, 'file' is a (writable) file object. To parse a plist from a file, use the load(file) function, with a (readable) file object as the only argument. It returns the top level object (again, usually a dictionary). To work with plist data in bytes objects, you can use loads() and dumps(). Values can be strings, integers, floats, booleans, tuples, lists, dictionaries (but only with string keys), Data, bytes, bytearray, or datetime.datetime objects. Generate Plist example: pl = dict( aString = "Doodah", aList = ["A", "B", 12, 32.1, [1, 2, 3]], aFloat = 0.1, anInt = 728, aDict = dict( anotherString = "", aUnicodeValue = "M\xe4ssig, Ma\xdf", aTrueValue = True, aFalseValue = False, ), someData = b"", someMoreData = b"" * 10, aDate = datetime.datetime.fromtimestamp(time.mktime(time.gmtime())), ) with open(fileName, 'wb') as fp: dump(pl, fp) Parse Plist example: with open(fileName, 'rb') as fp: pl = load(fp) print(pl["aKey"]) readPlist writePlistreadPlistFromByteswritePlistToBytesPlistDataDictInvalidFileExceptionFMT_XML FMT_BINARYloaddumploadsdumpsN)BytesIO)warn) ParserCreate PlistFormatzFMT_XML FMT_BINARY)modulec@s(eZdZfZddZddZddZdS) _InternalDictc Cs:y ||}Wntk r(t|YnXtdtd|S)NzLAttribute access from plist dicts is deprecated, use d[key] notation instead)KeyErrorAttributeErrorrDeprecationWarning)selfattrvaluer/usr/lib/python3.6/plistlib.py __getattr__Vs z_InternalDict.__getattr__cCstdtd|||<dS)NzLAttribute access from plist dicts is deprecated, use d[key] notation insteadr)rr)rrrrrr __setattr___sz_InternalDict.__setattr__c Cs8y ||=Wntk r&t|YnXtdtddS)NzLAttribute access from plist dicts is deprecated, use d[key] notation insteadr)rrrr)rrrrr __delattr__ds  z_InternalDict.__delattr__N)__name__ __module__ __qualname__ __slots__rr r!rrrrrOs rcseZdZfddZZS)rc stdtdtjf|dS)Nz?The plistlib.Dict class is deprecated, use builtin dict insteadr)rrsuper__init__)rkwargs) __class__rrr'osz Dict.__init__)r"r#r$r' __classcell__rr)r)rrmsc cs2t|tr(t|| }|VWdQRXn|VdS)N) isinstancestropen) pathOrFilemodefprrr _maybe_openus  r1cs4eZdZdZfddZeddZddZZS)rzuThis class has been deprecated. Use dump() and load() functions instead, together with regular dict objects. c stdtdtjf|dS)NzJThe Plist class is deprecated, use the load() and dump() functions insteadr)rrr&r')rr()r)rrr'szPlist.__init__c Cs2t|d}t|}WdQRX|}|j||S)z,Deprecated. Use the load() function instead.rbN)r1r update)clsr.r0rZplistrrrfromFiles   zPlist.fromFilec Cs$t|d}t||WdQRXdS)z,Deprecated. Use the dump() function instead.wbN)r1r )rr.r0rrrwrites z Plist.write) r"r#r$__doc__r' classmethodr5r7r*rr)r)rrs  c Cs2tdtdt|d}t|ddtdSQRXdS)z Read a .plist from a path or file. pathOrFile should either be a file name, or a readable binary file object. This function is deprecated, use load instead. z8The readPlist function is deprecated, use load() insteadrr2NF)fmtuse_builtin_types dict_type)rrr1r r)r.r0rrrrs  cCs8tdtdt|d}t||tdddWdQRXdS)z Write 'value' to a .plist file. 'pathOrFile' may either be a file name or a (writable) file object. This function is deprecated, use dump instead. z9The writePlist function is deprecated, use dump() insteadrr6TF)r: sort_keysskipkeysN)rrr1r r )rr.r0rrrrs cCs tdtdtt|ddtdS)z} Read a plist data from a bytes object. Return the root object. This function is deprecated, use loads instead. zBThe readPlistFromBytes function is deprecated, use loads() insteadrNF)r:r;r<)rrr rr)datarrrrs cCs,tdtdt}t||tddd|jS)zp Return 'value' as a plist-formatted bytes object. This function is deprecated, use dumps instead. zAThe writePlistToBytes function is deprecated, use dumps() insteadrTF)r:r=r>)rrrr r getvalue)rfrrrrs c@s>eZdZdZddZeddZdddZd d Zd d Z d S)rz] Wrapper for binary data. This class is deprecated, use a bytes object instead. cCst|tstd||_dS)Nzdata must be as bytes)r+bytes TypeErrorr?)rr?rrrr's z Data.__init__cCs |t|S)N)_decode_base64)r4r?rrr fromBase64szData.fromBase64LcCs t|j|S)N)_encode_base64r?)r maxlinelengthrrrasBase64sz Data.asBase64cCs4t||jr|j|jkSt|tr,|j|kStSdS)N)r+r)r?rBNotImplemented)rotherrrr__eq__s     z Data.__eq__cCsd|jjt|jfS)Nz%s(%s))r)r"reprr?)rrrr__repr__sz Data.__repr__N)rF) r"r#r$r8r'r9rErIrLrNrrrrrs   s zv[\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f]rFcCsT|dd}g}x8tdt||D]$}||||}|jtj|q"Wdj|S)Nr)rangelenappendbinasciiZ b2a_base64join)srHZ maxbinsizepiecesichunkrrrrGs  rGcCs(t|trtj|jdStj|SdS)Nzutf-8)r+r,rUZ a2b_base64encode)rWrrrrD s rDz{(?P\d\d\d\d)(?:-(?P\d\d)(?:-(?P\d\d)(?:T(?P\d\d)(?::(?P\d\d)(?::(?P\d\d))?)?)?)?)?ZcCsNd}tj|j}g}x,|D]$}||}|dkr2P|jt|qWtj|S)Nyearmonthdayhourminutesecond)r\r]r^r_r`ra) _dateParsermatch groupdictrTintdatetime)rWorderZgdZlstkeyvalrrr_date_from_strings rjcCs d|j|j|j|j|j|jfS)Nz%04d-%02d-%02dT%02d:%02d:%02dZ)r\r]r^r_r`ra)drrr_date_to_string&s rlcCsZtj|}|dk rtd|jdd}|jdd}|jdd}|jdd}|jd d }|S) Nzz>)_controlCharPatsearch ValueErrorreplace)textmrrr_escape,s      rxc@seZdZddZddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'S)( _PlistParsercCs"g|_d|_d|_||_||_dS)N)stack current_keyroot_use_builtin_types _dict_type)rr;r<rrrr'9s z_PlistParser.__init__cCs8t|_|j|j_|j|j_|j|j_|jj||j S)N) rparserhandle_begin_elementZStartElementHandlerhandle_end_elementZEndElementHandler handle_dataZCharacterDataHandlerZ ParseFiler|)rZfileobjrrrparse@s     z_PlistParser.parsecCs*g|_t|d|d}|dk r&||dS)NZbegin_)r?getattr)relementattrshandlerrrrrHsz!_PlistParser.handle_begin_elementcCs"t|d|d}|dk r|dS)NZend_)r)rrrrrrrNsz_PlistParser.handle_end_elementcCs|jj|dS)N)r?rT)rr?rrrrSsz_PlistParser.handle_datacCs|jdk rFt|jdtis.td|jj||jd|j<d|_nB|jsT||_n4t|jdtgsxtd|jj|jdj|dS)Nzunexpected element at line %drrr) r{r+rztypertrCurrentLineNumberr|rT)rrrrr add_objectVs   z_PlistParser.add_objectcCsdj|j}g|_|S)N)rVr?)rr?rrrget_datafs z_PlistParser.get_datacCs"|j}|j||jj|dS)N)r~rrzrT)rrrkrrr begin_dictms z_PlistParser.begin_dictcCs*|jrtd|j|jjf|jjdS)Nz%missing value for key '%s' at line %d)r{rtrrrzpop)rrrrend_dictrsz_PlistParser.end_dictcCs:|jst|jdti r,td|jj|j|_dS)Nrzunexpected key at line %dr)r{r+rzrrtrrr)rrrrend_keyxs z_PlistParser.end_keycCsg}|j||jj|dS)N)rrzrT)rrarrr begin_array~s z_PlistParser.begin_arraycCs|jjdS)N)rzr)rrrr end_arraysz_PlistParser.end_arraycCs|jddS)NT)r)rrrrend_truesz_PlistParser.end_truecCs|jddS)NF)r)rrrr end_falsesz_PlistParser.end_falsecCs|jt|jdS)N)rrer)rrrr end_integersz_PlistParser.end_integercCs|jt|jdS)N)rfloatr)rrrrend_realsz_PlistParser.end_realcCs|j|jdS)N)rr)rrrr end_stringsz_PlistParser.end_stringcCs2|jr|jt|jn|jtj|jdS)N)r}rrDrrrE)rrrrend_datasz_PlistParser.end_datacCs|jt|jdS)N)rrjr)rrrrend_datesz_PlistParser.end_dateN)r"r#r$r'rrrrrrrrrrrrrrrrrrrrrrry8s&ryc@s8eZdZdddZddZddZdd d Zd d Zd S)_DumbXMLWriterr cCs||_g|_||_||_dS)N)filerz _indent_levelindent)rr indent_levelrrrrr'sz_DumbXMLWriter.__init__cCs,|jj||jd||jd7_dS)Nz<%s>r)rzrTwritelnr)rrrrr begin_elements z_DumbXMLWriter.begin_elementcCs@|jdkst|jj|ks t|jd8_|jd|dS)Nrrz)rAssertionErrorrzrr)rrrrr end_elementsz_DumbXMLWriter.end_elementNcCs8|dk r&t|}|jd|||fn|jd|dS)Nz <%s>%sz<%s/>)rxr)rrrrrrsimple_elementsz_DumbXMLWriter.simple_elementcCsH|r8t|tr|jd}|jj|j|j|jj||jjddS)Nzutf-8 )r+r,r[rr7rr)rlinerrrrs    z_DumbXMLWriter.writeln)rr)N)r"r#r$r'rrrrrrrrrs   rc@sFeZdZdddZdd Zd d Zd d ZddZddZddZ dS) _PlistWriterr rTFcCs.|r|jttj||||||_||_dS)N)r7 PLISTHEADERrr' _sort_keys _skipkeys)rrrrZ writeHeaderr=r>rrrr's  z_PlistWriter.__init__cCs"|jd|j||jddS)Nzz)r write_value)rrrrrr7s  z_PlistWriter.writecCs4t|tr|jd|n|dkr0|jdn|dkrD|jdnt|trd|ko`dknrx|jd d |nt|nt|tr|jd t|nt|tr|j|n|t|t r|j |nft|t t fr|j |nLt|tjr|jd t|n,t|ttfr |j|ntd t|dS)NstringTZtrueFZfalser?@Zintegerz%drealZdatezunsupported type: %srll)r+r,rre OverflowErrorrrMdict write_dictr write_datarB bytearray write_bytesrfrltuplelist write_arrayrCr)rrrrrrs.           z_PlistWriter.write_valuecCs|j|jdS)N)rr?)rr?rrrrsz_PlistWriter.write_datacCs~|jd|jd8_tddt|jjdd |j}x&t||jdD]}|rL|j|qLW|jd7_|j ddS) Nr?rrFr rs ) rrmaxrSrrurGsplitrr)rr?rHrrrrrs z_PlistWriter.write_bytescCs|rx|jd|jr"t|j}n|j}x@|D]8\}}t|tsR|jrJq0td|jd||j |q0W|j dn |jddS)Nrzkeys must be stringsrh) rrsorteditemsr+r,rrCrrr)rrkrrhrrrrr s    z_PlistWriter.write_dictcCs@|r2|jdx|D]}|j|qW|jdn |jddS)Narray)rrrr)rrrrrrrs    z_PlistWriter.write_arrayN)rrrTF) r"r#r$r'r7rrrrrrrrrrs % rcCsd }x|D]}|j|r dSq WxntjdftjdftjdffD]N\}}|j|sRq>x8|D]0}||jdj|}|dt||krXdSqXWq>WdS) N6xBBQQQi)_fpseekosSEEK_ENDreadrSrstructunpack _ref_size _read_ints_object_offsets _undefined_objects _read_objectOSError IndexErrorerrorrUnicodeDecodeError)rr0trailer offset_size num_objects top_objectoffset_table_offsetrrrr_s      z_BinaryPlistParser.parsecCsL|dkrH|jjddd@}d|>}dt|}tj||jj|dS|S)z$ return the size of the next object.rrrPrq)rr_BINARY_FORMATrr)rtokenLrwrWrArrr _get_sizexs  z_BinaryPlistParser._get_sizecst|jj|tkr0tjdt|S sFt|krLttfddtd|DSdS)Nrqc3s&|]}tj||dVqdS)bigN)re from_bytes).0rY)r?sizerr sz0_BinaryPlistParser._read_ints..r) rrrrrrSrrrR)rnrr)r?rrrsz_BinaryPlistParser._read_intscCs|j||jS)N)rr)rrrrr _read_refssz_BinaryPlistParser._read_refsc sj|}|tk r|Sj|}jj|jjdd}|d@|d@}}|dkr^d}n2|dkrnd}n"|dkr~d }n|dkrd }n|d krtjjjd|>d |d kd}n|dkrtj djjdd}n|dkrtj djjdd}n|dkrDtj djjdd}t j dddt j |d}nL|dkrj |}j rnjj|}ntjj|}n|dkrj |}jj|jd}|}n|dkrڈj |}jj|djd}n|dkr j |}j|} g}|j|<|jfdd| Dnp|d krj |}j|} j|} j}|j|<x4t| | D]\} } j| |j| <qfWnt|j|<|S)!zx read the object by reference. May recursively read sub-objects (content of an array/dict/set) rrrNrF TrQrrrP)signed"z>frO#z>d3i)ZsecondsrPr`rzutf-16bec3s|]}j|VqdS)N)r)rx)rrrrsz2_BinaryPlistParser._read_object..)rrrrrrrerrrrfZ timedeltarr}rrrextendr~ziprr) rrefresultoffsettokenZtokenHrrArWZobj_refsZkey_refskor)rrrsn                      z_BinaryPlistParser._read_objectN) r"r#r$r8r'rrrrrrrrrrSs  rcCs0|dkr dS|dkrdS|d>d>r(dSdSdS) NrrrrrrOir)countrrr_count_to_sizes rc@s<eZdZddZddZddZddZd d Zd d Zd S)_BinaryPlistWritercCs||_||_||_dS)N)rrr)rr0r=r>rrrr'sz_BinaryPlistWriter.__init__c Csg|_i|_i|_|j|t|j}dg||_t||_t|j|_ |j j dx|jD]}|j |q\W|j |}|j j}t|}dt||}|j j tj|f|jd}|||j|||f} |j j tjd| dS)Nrsbplist00rq >5xBBBQQQ)r)_objlist _objtable _objidtable_flattenrSrrrr _ref_formatrr7 _write_object _getrefnumtellrpack) rrrobjrrrZ offset_formatZ sort_versionrrrrr7s(          z_BinaryPlistWriter.writec Cs~t|tr"t||f|jkrZdSn8t|trHt|j|jf|jkrZdSnt||jkrZdSt|j }|j j |t|tr||jt||f<n0t|tr||jt|j|jf<n||jt|<t|t rPg}g}|j }|j rt|}xB|D]:\}}t|ts|jr qtd|j ||j |qWxLtj||D]}|j|q:Wn*t|ttfrzx|D]}|j|qfWdS)Nzkeys must be strings)r+_scalarsrrrr?idrrSrrTrrrrr,rrC itertoolschainrrr) rrZrefnumkeysvaluesrrvrrrrr/sB          z_BinaryPlistWriter._flattencCsNt|tr|jt||fSt|tr<|jt|j|jfS|jt|SdS)N)r+rrrrr?rr )rrrrrr_s   z_BinaryPlistWriter._getrefnumcCs|dkr"|jjtjd||Bn|dkrH|jjtjd|dBd|nh|dkrn|jjtjd|dBd|nB|dkr|jjtjd |dBd |n|jjtjd |dBd |dS)Nrz>Brrz>BBBrz>BBHrz>BBLz>BBQril)rr7rr)rr rrrr _write_sizegsz_BinaryPlistWriter._write_sizec sj|}jjj|<|dkr2jjdn|dkrJjjdn|dkrbjjdnt|trl|dkryjjtjdd|Wn tj k rt |dYnXn|d'krԈjjtjd d |n|d(krjjtjd d|nt|d)krjjtjdd|nR|d*kr8jjtjdd|n0|d+kr`jjd|j d dddnt |nxt|t rjjtjdd|nRt|t j r|t j dd d j}jjtjdd|nt|trjdt|jjj|jnt|ttfr0jdt|jj|nt|try|jd}jdt|Wn4tk r|jd}jdt|d YnXjj|nDt|ttfrfd!d"|D}t|}jd#|jjtjd$j|f|nt|trgg}}jr&t|j} n|j} xR| D]J\} } t| ts\jrTq4t d%|j!j| |j!j| q4Wt|}jd&|jjtjd$j|f|jjtjd$j|f|nt |dS),NFTrrz>Bqr(rrz>BBrz>BHr&rz>BLr'rz>BQrr)rz>Bdrirrrzutf-16berrcsg|]}j|qSr)r)rr)rrr sz4_BinaryPlistWriter._write_object..rrqzkeys must be stringsrrilll)"rrrrr7r+rerrrrto_bytesrrfZ total_secondsrr)rSr?rBrr,r[UnicodeEncodeErrorrrrrrrrrrCrT) rrr rAtZrefsrWZkeyRefsZvalRefsZ rootItemsrr%r)rrrws            $    "$z _BinaryPlistWriter._write_objectN) r"r#r$r'r7rrr)rrrrrrs -0rcCs|dddkS)Nrsbplist00r)rrrr_is_fmt_binarysr1)detectrwriterT)r:r;r<cCsn|dkrL|jd}|jdx:tjD]}|d|r&|d}Pq&Wtn t|d}|||d}|j|S)zRead a .plist file. 'fp' should be (readable) file object. Return the unpacked root object (which usually is a dictionary). Nrrr2r)r;r<)rr_FORMATSr$rr)r0r:r;r<rinfoPprrrr s     cCst|}t||||dS)zqRead a .plist file from a bytes object. Return the unpacked root object (which usually is a dictionary). )r:r;r<)rr )rr:r;r<r0rrrr sF)r:r=r>cCs:|tkrtd|ft|d|||d}|j|dS)zQWrite 'value' to a .plist file. 'fp' should be a (writable) file object. zUnsupported format: %rr3)r=r>N)r4rtr7)rr0r:r=r>r3rrrr s)r:r>r=cCs t}t|||||d|jS)z?Return a bytes object with the contents for a .plist file. )r:r>r=)rr r@)rr:r>r=r0rrrrs)rF)Er8__all__rUr contextlibrfenumiorr!rrerwarningsrZxml.parsers.expatrEnumr"rglobalsr3 __members__rrrcontextmanagerr1rrrrrrrcompilerrrGrDASCIIrbrjrlrxryrrrrtrrobjectrrrr,rerrBrrr1r r r4r r r rrrrr/sz          0    h&d! S