ÿØÿà JFIF    ÿÛ „ !.%+&8&+/1555$;@;4?.451 4,$,44444444444414444444444444444444444444444444444444ÿÀ  á á" ÿÄ     ÿÄ ?    !1AQaq"2‘¡±ÁðBRbrÑá#‚’¢²3S CñÿÄ   ÿÄ !    !1QAa‘2ÿÚ   ? 5˜Z¯V¦cø)›t/? z¨±>Õ5€¶‹Á¤·¼z¼Ü¬+ñ®v¤¨_ˆR­BFn©—˜ý®ç̝P8gýt·ÉSTŦˆìät?þé¼íìN/Þa)ì–í6ô… Ï¿øÃj´¿KÇü]ÿ ªô¹-eKànëÕHTx}ýSÜ›ÿ ”7Ø×&µ<¦  ¥ÑO¶[Ù¯ä¨ÞÃÿ PZ-¬;#õ|•oaÿ ©CìÞz3˜öː/¤­ñTûIØ}š^ mÓ%ªxˆ¥ÉŸu=Z+ISe¿45™¼u;ú&WØ÷€æßQ™®{|íx*TC“#ZŠìZ§²‹ 6pv…³¿¡äª*áZÐ%ÒOáˆo"x«OHk w±æ+¬V(kMúŸ5Vö«$ ÁrÏbàb57/luR ¸ÑÛj Òµì`Мq­û žICÀÊ•©4€Âcà¨Ï€O´<èÐ:›ù(Ë^L8þ‘ÍÌ#¸Ð_Ì©ÙK(Öz 4¬û+¸;ü’V’84‘¬ÃŽ:[â‡ÔÌáõp¢~§ªlæ£ö{®G>J¼"°‡7¯ÆÉèßû ‹É‹§ÁòÃýâßî ^ƾÙõ‹×óH#«LP½ïX=xÑÍ$|W?•~• îëÔ©ª‹ {ÝT…Kÿ ”hûâá)J*ö˜–ÔU;iÇ€/ ÆþjóZ\ýwØ=Ìm ºèËL9 ýèÆð/¨’¥öo=nË.%Îì ŽÕ¯È|{Oj²ƒE6e/ßdÄõ²Ìâ1O®ò×TsəԸhOMýíMˆ¿¼H˜l²,7Â¥#MF/Úf°Ö½± ¸–dr‹NýÊ íjqx{œÉ ä-È ¦ øÄër¨q°ð †nцýÑÄÆ’mä…n<0È™;ÁÝá¯ÁZƒ7FÀmì­ É&9ˆîéi¶ùN§Y• ÃZãAâ?•‡©‰ , ó¾IŸŠc1 4â&y­&pŠ­6;M À 0¹qç»p.á …ŸÅáK@%6·y6ƒ‰3?”úºŽ‰éX5ªPT §µ!=Mž«Ú½‹ÅgÂSâÉaþÓoö–¯ÁÔìR>5éÿ üs¶ÆUcÌ kÇR ]ÿ ù¬¼«VŽ;Â|‡~¢¦”ÏŰæ {L™Õ°Óv¹ò¸írޡעCÃ!íVÕ {¶»sŒNPg/ "uÕbkm²“$ďå¿é¹§°½æz¯6 †s¿!s–wÚÝ“™Œ °.ûj>·+™Òa…©Œ&rÝÎtÛë긪Ît’LAVp%c Úý[ÄzJ¾ÇàXXç@˜ó<êL]·T˜¾¥1Ó©V‡g´æ½¦Ý@¹óø!_@´ÞâSÁ —S3™•& ]@JHÚý©ZŽ €×æÔr»Áf!‡yÞ4Mv*èÓã_{‘åóUuљØ«Oïé*®EvÑ Œ÷‡U \"㪒ÍK+À 4“M¡ï:0¥5í!'<@î´”>Ç»&Z–ïCCV˜Ì5Šo&îhè.žû |ÓK©h$s6KìŒëã)¹hI¦GïOåóI;ììü#É$Š0…Ææ¥TØ.5­¾gn´ “ÂÖ\:hœ89G)J@„}œ:’Ò{/Š"¦_Æ×7Æ3VÇŠÊa]ÚŒÙ€Ä–=®uÁßâACZƒ§§£ Qnâ:«,×{tyø¬iÛcœÜÄ€H½ÄÍCk´÷šß .W'b¤Íåh]÷€=,Žv×cÚEÚHXJX¶îo¨FÒtèöŸ>ªª6[J®Fµ£sGÁeqõfe\íjÒÐïÄÐGˆe1Ø‹.Ø”‘Ëuø Y­ˆÜ ŽG|zùªüMpDnQWÄ”%JŠ™)â*p@Örš«ÕT2Ð%ˆG#ª„ ·¤!°ŸOTÂT¸aÚ%4&h™LµšØüÐ.F¿²ÐÞ_Ç‚¾ÅÃaÜ÷09Æ q€öy˜v‡85õN÷]¬äѼóS{°_MެúÔ#°Ç¸0åÞè2ëôPcvÆw9®ií1Ä8F™˜à‰´+‰Ik1òÝ7“Ñ×ÒsÝ\x‚h`ÞÑ`ó"|µEcý£n˜h`}GÞ !±ù²Ápü²ß6 0ïi󜵩SÈÇ7˜-ÕURO˜¦´f$ªž-Í6(œ}<„ éc øs]ŽŽ„*—¾ ìdŽ„)méª\¿êÎIg¾ØÞ~I#C/¼¼´EÁÈŽi8“©õådô·>euä ƒ'Ê×लR1ÉJE1ÐAát`t;ÇР%Ý<‡¥„ÍÆ`×Oyó)õiI€ñQaŸ4Ûù\áàaÃÔ¹HÃu¹*k€¦<„e S‡&õÏ B!ŽhüÞ`yj}mªf×\¿ Ç~æ­9‡û\՞Ǖg²1Žû5V7 !àöšm° c`ܬøÇìµÒ'P"?…´Ö,"§^•õލsÔ)6˜sæéÍR¼ ò|Sl”‹7 nPW Gòú÷½§O¯‡„l¡kSÞŒr½PÊ@æ¢pŽ-mÿ #Ÿ˜Àº¶Áä¦;ïÔæ$1££`“Õ>„—·ž)ßð³ñ#Ï Ô$¶œ‰ÊE‹À;÷º ¯«P:Ñ”8–IÊtpÞ3ª“>ê“þës4ò2OÏÕ­±zô†Õ§‰.÷ä¸;¿˜“'œ›žª}«Œ{ª±Ì 9ÔóÞÕ‡0 $íWV3Üì¬ —@kÝ4@¿r¼±½¬™›?øØæ´'Áé®CË3-g$˜ö‡×auÚi´Žp/êÛ æF›Ú2v‹ã¿¿,nB1̨ƃqÞa5͝@&Æû“él÷ \C²½UÍc ¯k×¢U ÖéQå™—-r wô ÞÏ<Ò=&=ÿ Ôê Òêˈt,i—;LîÜ á¸*ÚÃ1$êL•LÍ <É)ýÐà’ ;F™{ƒ™˜€&'}‚ãÄK`¡ÞT@I;®žZóè‚s’7®°›+§O­Åq©é»²9<Ô J ¼9O’HL»Ùïì¸rk¼Ž_ý‘TŸu[²ßÚŒ·ü÷B%¯E ŸÔX5êO´ Ç•€’I0 ÉJX` ñ¹õ%;µŸD‘«´€àwÒ™U ûئžÖö\×®×´8 ½‡ºÐÆÓ§?Àkmœ=;d5*@-ì0F Rªýš[Ü6âö̃ڸr*KA9· u*µæ£?U¸Âêí†8@¦X4 e-ò„0s{ HâUpU?¼mñRa°®a%Ð'tÉ×’\¾ÊÉ]t›h>·(Ë@R¼¡Ãt h}’O÷au<+nT…Ö…MӐ??Óe95 q>í/;&JSû °¯ÊéÞ øƒ*Ã2½Ài&:nôUl=¾¿5eˆ3”ñc|Ú2V”>„»&eE;«ÚäC p¢Û úy 9š[ŒÌx¼擼A&DåÒ¯ˆ¤ÀÌ;"˜ ÏQä¸åhÊ}Ûq«Û0WžÒ|»€ø®öCm5•\ÇÀ§Pe3£]0ÃàLDÉ‰1øªxjgwT‚÷¿LΨK‹›ùs—xˆÜ±µ kæ¸f‰‰ÜGk/LÛØ6d9ò¶ùA{ƒA3š/¬D¬khÓk‰`˜"㯒r¿±Óã jx‡°e}<Ñø\3y:'À•/h½Í€Ç4~g ?Û(¼]v‘ªlKÎâ~?O‚W%{Ì:“'©úNq¾›úo(X’¥¯ˆ nFê{Ç€ü?º'ë ø‹ì Þ09ŒÌç9Æ —ËC`j@ÓÄ(+a‹un¸#ÂꟋ{K`‘ÑÍÍ'à´»/Û,KW;Þ4²þð ï Nm|~fGÏ(…³Ã)«1ö­Õ ¥‡¨©ƒÃ™ü-s=à=U66Ï«Ýc蓦W¹íž®›nÔ%êÇìŒ<#Ü×84ån®Ð ÒåOC` ñânÑs‡¢ç 1õ%Îhì½Ã½® e:ݼUZo™`  ÅZŸŒÊ«ê1ÏÄo$q¹Þ€©ˆhÐÉä¯ñ[!…Ú˜àJ:x2$Íß&PåT£6ç— ‡Í*4Ýšçjÿ ‰É nófÐ ó(L5C•åÆ\rMÒ@ò }y-W}™üýVù—ú¢=Ù”c®‘< M ž ´Phr ¦©TD ‘ù.$´÷O‡‘V2Æò.=IUŒ=ž‡â¬i™aþÓåÙ?òUø'ØÖ•.~* šTŒ!•-×áºTâ®ä#õü'´ eýlYÅÓeÕKÂrT"CÚ@u!Óxƒ{š3€}1¿(r}%«nËamjÑ%ÑNEò v ˜à  σöK³,*º.àzù¨™Ó ÚçâU¦*¿ 9{%Ö¹ njûdaXöb) kÛÆ±ûÓ\°M7ˆÂ=û›ç¿Ã‚­V»Cg–8ÙêE- j)k$º`Ã-ùEýeBÆÇ]c¡°ñty&Òd0nõ'¡W+ƒ*|–øµFa\GQªEAÔp5\Ǽ·¼Ç8·õ -â§Ú[ ‡ uZeÖ 3}×d'+¹:ð+K†Û®s!Ï$úe€<Û”x)1»a­¡LC]¸µík…ÚàA»AYº{†ªS[¦5HÒ7ù --,ísòDØ€èk ÞÀîÜ ò@â( ËNˆë›4ô½•/¦o‡€Û7 ê•ÆêòðÜy'Án½µ á˜ݦ ndeo…[ì¶Ê,¥R³Ä=À±—–ß;£™´ñSâ*g§”ïaið‘Jå~™ÓÞ ß³Õ¢»8x埒²52>AÊb&-÷\7´éÄù€T˜,w;3{ï˜k…à¹ÄqÀ«œ{€\ ˆ¾[´¨јr &Úé„Ívˆ±8†¿]|¬ņ4I×pÞS1ÈÖz‰#Ìv‡G!YNògñ:màTz¢Ý1ô©^O=~ë|5Bã™ç•¼µõ•bÆ@úÕS¬ÈŒ#¬zünrŸ û” Z²•èðV"ÁHÚý©wÝ €7¼Ìu1hÑa3Éä û f$o¿É ™Ú›ÝçnpÒ3äÌ3†Í§,Äï]$‰/pê †«À¼¸e9­Æê_C]žƒ·ý·frÁN«, E=›Çq -‰öŒ:aÏ¿±í&£Í:-} 84‘ÿ eƒQÑeëSsuiA ³g㟥ú£?ÿ ʼn*”“÷aühe:ÊWa@ÒÞk±eØ] F Ô—r.åä˜ @ö¥ªZoÐýYL·¥S²G/‡ñ <~*ZÆ´è>JlòàÛÆ½ÿ 窘ìGN¢:I®KšJp/`íIÁÀõ#Ä-€ö­šµŒoF4|ÆQØÆ@Ì|£Ô…¢À{9˜è½Üó›€ôYÒÎYsið;ís¤€à²ˆ‚4qÉVŒI$ ‰"° æµ8cXGjœˏ¡Aâý•ËÜ¢ûï e·çLx']á"oÅÎê3¯Ç—¹”ó0nå‚âg{Œñ> S´˜îè°g238‚ãköÝfÚd´6Ò€;ò÷±¢™¼›º ¢Æ'¥Ðx'e¬ç ]bÈÆV¢ó‹kýBO ðÊâ$Ÿ!×T 3Mýמ žìٍàÌü‘8÷€àæØ8æ©6‰©L´«…oãpð„~Çk‰!ñ;‹”ÛžÍ àž±z Ÿôû øŸÝužÏ;ÿ #|u6™Þ¬ÚˆÐõA4¶â|ôl|Ê2ŽÇ¤ÝÅÇY.<#Aí.k§hóF‚”Y; M½Ö4hŸ4&›­¿tès´%FìL¥£Ãk‰ÇT¤haÁ¤ÚxfÉ`ÑìË›>i 3t‚:,–+^÷´–{Û–Nxi"x‘Ûg î¨>¥Õ܁ùZH,2Û“:8xÊ¢Çí9.É-Ìâã-=çjwµS˜dütžçwýGòú®®ûº_ˆýx$–¡ãøO EÚÛÏ÷R„×w+3£Á£öUMyR²¹âŒ°š›¸Ñãò9§Ó_Dl+Ùßc›úšGÅÌc†Ž!Ko=¶.‘Îÿ c²(2®V mª.ÿ ¹B›¹å ù„öŸSV>™ü¯$y:G¢Z×àøúdî¹û­·ýÇ´:•c LÍõi_‹ö+ÎæGÊè>OŠ•äž´§Þ{X}¨1ÚTc›»Qþ•êô°t¿OP?eæ~É{5]•ÙR£r5†nZ\ã@ &îJõ ¾àC°þV>fé¥/ü5ñÊIº_é5 ;e­h<@ Ä&æÃëE%;X,ÒãÆÞ`Oò¦kŸm#˜!ÀyÄ¢| óLšò¥Ä` ¶R=|ÈCâh5ò3DˆïF†ðÒ#ÅìÛœ?¸yhBãœí ZxßÎÄhºRK„`Þödvײ™ÀÈÑÒgŒuY w³%†ƒÓzõ ÖÏp‚dH®¦A´ù§»ÓÇMæ~)ˆð‡û:ù&Ä •vGD´À n ݇¼Ö8Fö óáà£~Ë¥x`oK|Ä?fxiØü%pìR>éò+Û±éÎ>núlFŤ'tq8LZÏvÃ?„¡ß±È⽆¯³íü@x|PöUäèØã¡ð‚ŒAìÏ"vÍwóŸÍ{ ý0.z È•Ö{,N¡£¡ŸKÕÙž>Ýœþ ÍÀ°<×EA!Å‚D™IúOÍ¡>ôG}Â` ÍßkÜL™Ž Þð™ {IøF²¹òQ3&!ÃÂÞz.d&Ï-sH¸,Ôõ˜ŽP€ 77ˆÝ¼ÊëÜw =cÕ Ú,ØÐ5ÎYÐ)ì´öœgŒ[¤ßv㙑8心>h]§µháYš£²ºÑ.{Ï7Sð•?´~×SÃKýJÛ˜ ™Íäiúu<µX¶1õ^kâçIÑ£sZ4h>j*ÔšD:4­¿_ ÷¸ Õxæÿ ¸?Mù _•­ÊÐ ä ÷ý ÑwL œ­ïnTkÛUÍN©ë:¦fV ¶ÜÔÜMªÅâA½–¿R×TXš-%iTÊT•‡Ù‚JôϐZxWÑè‰f‰òG º ×Õû2aZ7OU3[“×AT–ÞŒ…-‘¤”Ì ì&(ˆ¿­•ƒkï’:ðY¦W‘ Å)“†‘˜³Åtcø˜ñTÂwÚÇ4|üLÇªí–v- qˆèU qPE.†â‘˜µ Æ,ÐÅs]8¾„oúÑ i>ÜxxÈó)ƒ ´æÁâØ$À‰vžŸf$Ž |ãw;ÀÁIJ»b` {¦Ó¤Ú$©YÀ‘n@Óïž«9J¼êG m¤ ܯ¹ÌW4€ÐÒÅÛ‡#褕Ÿn-?í|с¥÷Ú¹¬'´ÞÜ9ÓK `hê£SÄSà?7—Wí_´…óB›»:=Ãïq`<8ñÓŒÑlú2d¬ê³£hÖ[l|$vÝro~'R®‰§°ñmY ͧäP |PUª¹·:3Œ[Û{Xÿ ºâ@‚W–Äé u‚ ¯´*=íή.pûÒdt @G‰¬ s¸ ëÉücr ÞæÑ¨Ê@>¤¢Ö±. Þ'¯°ÌME[YéïĵÂCå½ Ué©Áû'Ê9%eÔðNU”ë‘ÌsD3/®+UI˜9h.WC”빓$#:pz:YÓ ¿xž* ³$Í +$kñAŠ‹†¢ Uê>¸)_š¬÷©ßAÂÔb9ÇU ¯¾á•9¯ÏÏ÷O÷¼¼Fähal1‰3Ì[Ïr•´UCksNÐ] R‘¸¥H+§Šé†c©vÖÞ0iÓ76s†î!§=ß ¼~Ô'°Ãmäoäš³ªøi1úÉ)³yV8 CLÄØÁ‘WYïi€H6ÖÑiámø^ÈY´°Ñ7¥Û*—Ñ©L«Qƒï—Ùrÿ ›£Ð*š¸ˆL©ˆ$ˆ ÷¾D§9È®«qbqC)–ˆïv´çñsÑVT­Ø, <àïºÀO«Jý·õ àfPìð .wFšir´þ’2_Y *Æ€x\« ì€9š@ Ž|F⇥ˆkZ@hÖÄ0t¿-<“‹qµ¾*ZL¤Ú)&BJpÓF5=$„at*Zš$’ÑtdûÝRI1 2މ$€$I$#‰SÞ’Hë¬ï;Á$¡t$’`<(ñÇt)$‡Ð.Êf¢X’Kt=Éé$‚ˆªè¢oÝëòI%Rgcª÷ŠyI%¡‰ÿ !ñ)´õ $¤ Ô’IIGÿÙ M`pdZddlmZddlZddlZddlZddlZddlZ ddlm Z n #e $re Z YnwxYwddl m Z mZdZdZ ddlmZmZn#e $r ddlmZmZeZYnwxYwdZd Zd Zd Zejd kreefZGd deZGddeZGddeZ Gddee!Z"dZ#ej$ej%e#Z&de fdZ'e fdZ(Gdde)Z*Gdde*Z+Gdde*Z,Gd d!e*Z-Gd"d#e*Z.Gd$d%e*Z/Gd&d'e*Z0Gd(d)e)Z1Gd*d+e)Z2d,Z3dS)-z Apply JSON-Patches (RFC 6902) )unicode_literalsN)MappingProxyType) JsonPointerJsonPointerException)MutableMappingMutableSequenceu Stefan Kögl z1.32z0https://github.com/stefankoegl/python-json-patchzModified BSD License)rceZdZdZdS)JsonPatchExceptionzBase Json Patch exceptionN__name__ __module__ __qualname____doc__+/usr/lib/python3/dist-packages/jsonpatch.pyr r J####rr ceZdZdZdS)InvalidJsonPatchz, Raised if an invalid JSON Patch is created Nr rrrrrNs6666rrceZdZdZdS)JsonPatchConflicta Raised if patch could not be applied due to conflict situation such as: - attempt to add object key when it already exists; - attempt to operate with nonexistence object key; - attempt to insert value to array at position beyond its size; - etc. Nr rrrrrRsrrceZdZdZdS)JsonPatchTestFailedz A Test operation failed Nr rrrrrrrctjt}|D] \}}|||!t d|DS)z'Convert duplicate keys values to lists.c3ZK|]&\}}|t|dkr|dn|fV'dS)rrN)len).0keyvaluess r zmultidict..fsY C 3v;;!++fQii8r) collections defaultdictlistappenddictitems) ordered_pairsmdictr values r multidictr,_sz  #D ) )E#!! U c %    !;;==  r)object_pairs_hookFct|trt||}nt||}|||S)aApply 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 :param pointer_cls: JSON pointer class to use. :type pointer_cls: Type[JsonPointer] :return: Patched document object. :rtype: dict >>> doc = {'foo': 'bar'} >>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}] >>> other = apply_patch(doc, patch) >>> doc is not other True >>> other == {'foo': 'bar', 'baz': 'qux'} True >>> patch = [{'op': 'add', 'path': '/baz', 'value': 'qux'}] >>> apply_patch(doc, patch, in_place=True) == {'foo': 'bar', 'baz': 'qux'} True >>> doc == other True  pointer_cls) isinstance basestring JsonPatch from_stringapply)docpatchin_placer0s r apply_patchr9rsWB%$$:%%e%EE%[999 ;;sH % %%rc<t|||S)a!Generates patch by comparing 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 :param pointer_cls: JSON pointer class to use. :type pointer_cls: Type[JsonPointer] >>> 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 r/)r3 from_diff)srcdstr0s r make_patchr>s*   sC[  A AArceZdZdZefdZdZdZdZdZ e dZ e dZ e j d Z d S) PatchOperationz'A single operation inside a JSON Patch.c~||_|dstdt|d|jr |dj|_|d|_nO|d|_ ||j|_n!#t$r}tdd}~wwxYw||_dS)Npathz#Operation must have a 'path' memberzInvalid 'path') r0 __contains__rr1rBlocationpointer TypeError operation)selfrGr0exs r__init__zPatchOperation.__init__s&%%f-- J"#HII I i')9 : : 9%f-2DM$V,DLL%f-DM 9#// >>  9 9 9&'7888 9#s5B B3B..B3c td)zGAbstract method that applies a patch operation to the specified object.z%should implement the patch operation.)NotImplementedError)rHobjs rr5zPatchOperation.applys!"IJJJrchtt|jSN)hash frozensetrGr(rHs r__hash__zPatchOperation.__hash__s&Idn224455666rcPt|tsdS|j|jkSNF)r1r@rGrHothers r__eq__zPatchOperation.__eq__s(%00 5~00rc||k SrOrrVs r__ne__zPatchOperation.__ne__5=!!rcPd|jjddS)N/)joinrEpartsrRs rrBzPatchOperation.paths"xx *3B3/000rc t|jjdS#t$r|jjdcYSwxYw)Nr^)intrEr` ValueErrorrRs rr zPatchOperation.keysP *t|)"-.. . * * *<%b) ) ) ) *s!AAc~t||jjd<|jj|_|j|jd<dS)Nr^rB)strrEr`rBrDrG)rHr+s rr zPatchOperation.keys7!$U 2 ) !%vrN)rrrrrrJr5rSrXrZpropertyrBr setterrrrr@r@s11.9####$KKK777111 """11X1**X*  Z//Z///rr@c$eZdZdZdZdZdZdS)RemoveOperationz/Removes an object property or an array element.c|j|\}} ||=n=#ttf$r)}d|}t |d}~wwxYw|S)Nz(can't remove a non-existent object '{0}')rEto_lastKeyError IndexErrorformatr)rHrMsubobjpartrImsgs rr5zRemoveOperation.applysu|++C00  )t *% ) ) )<CCDIIC#C(( ( ) s#A$AAc^|j|kr!|j|kr|xjdz c_n|dz}|SNrrBr rHrBr s r_on_undo_removezRemoveOperation._on_undo_removes9 9  x3A q rc^|j|kr!|j|kr|xjdzc_n|dz}|Srsrtrus r _on_undo_addzRemoveOperation._on_undo_add9 9  x#~~A q rNrrrrr5rvrxrrrririsG99rric$eZdZdZdZdZdZdS) AddOperationz,Adds an object property or an array element.cr |jd}n!#t$r}tdd}~wwxYw|j|\}}t |t r[|dkr||n|t|ks|dkrtd| ||nyt |tr ||}n_|||<nY|/td t|td |j||S)Nr+/The operation does not contain a 'value' member-rzcan't insert outside of listinvalid document type {0}2unable to fully resolve json pointer {0}, part {1})rGrlrrErkr1r r&rrinsertrrFrntyperD)rHrMr+rIrorps rr5zAddOperation.apply s[ CN7+EE C C C"ACC C C|++C00  fo . . zs{{ e$$$$F ##taxx'(FGGG dE****  / / z|$t | ; B B4<< P PQQQ'(\(c(cdhdqsw(x(xyyy   .).c^|j|kr!|j|kr|xjdz c_n|dz }|Srsrtrus rrvzAddOperation._on_undo_remove)ryrc^|j|kr!|j|kr|xjdzc_n|dz }|Srsrtrus rrxzAddOperation._on_undo_add1ryrNrzrrrr|r|sH66@rr|c$eZdZdZdZdZdZdS)ReplaceOperationz?Replaces an object property or an array element by a new value.c |jd}n!#t$r}tdd}~wwxYw|j|\}}||S|dkrtdt |t r)|t|ks|dkrtdnt |tr)||vr$d |}t|nY|/td t|td |j ||||<|S) Nr+r~rz7'path' with '-' can't be applied to 'replace' operationrzcan't replace outside of listz)can't replace a non-existent object '{0}'rr)rGrlrrErkr1r rrrrnrFrrD)rHrMr+rIrorprqs rr5zReplaceOperation.apply=sp CN7+EE C C C"ACC C C|++C00  <L 3;;"#\]] ] fo . . zs6{{""dQhh'(GHHH'/ / / z6!!AHHNN',,,"| ; B B4<< P PQQQ'(\(c(cdhdqsw(x(xyyyt  rc|SrOrrus rrvz ReplaceOperation._on_undo_remove] rc|SrOrrus rrxzReplaceOperation._on_undo_add`rrNrzrrrrr:sHII@rrcpeZdZdZdZedZedZejdZdZ dZ dS) MoveOperationz?Moves an object property or an array element to a new location.c t|jd|jr|jd}n ||jd}n!#t$r}t dd}~wwxYw||\}} ||}n5#tt f$r!}tt|d}~wwxYw|j |kr|St|tr)|j |rtdtd|jdd|j |}td|j|d|j |}|S) Nfrom.The operation does not contain a 'from' memberz*Cannot move values into their own childrenremoveoprBr/addrrBr+)r1rGr0rlrrkrmrrerErcontainsrir5r|rDrHrMfrom_ptrrIrorpr+s rr5zMoveOperation.applygs B$.0$2BCC D>&1++DN6,BCC B B B"@BB B B '',,  -4LEE*% - - -#CGG,, , - <8 # #J fn - - R %%h// R#$PQQ QN6*  ')))*/s M  ' )))*/s  s0AA A/A**A/ BC%CCc||jd}d|jddS)Nrr]r^)r0rGr_r`rHrs r from_pathzMoveOperation.from_paths9##DN6$:;;xxss+,,,rc||jd} t|jdS#t$r|jdcYSwxYwNrr^)r0rGrbr`rFrs rfrom_keyzMoveOperation.from_keysd##DN6$:;; &x~b)** * & & &>"% % % % &s<AAc||jd}t||jd<|j|jd<dSr)r0rGrer`rB)rHr+rs rrzMoveOperation.from_keysB##DN6$:;; ZZr!)vrc|j|kr!|j|kr|xjdz c_n|dz}|j|kr!|j|kr|xjdz c_n|dz }|SrsrrrBr rus rrvzMoveOperation._on_undo_removesn >T ! !}## " q 9  x#~~A q rc|j|kr!|j|kr|xjdzc_n|dz}|j|kr!|j|kr|xjdzc_n|dz }|Srsrrus rrxzMoveOperation._on_undo_addsn >T ! !}s"" " q 9  x#~~A q rN) rrrrr5rfrrrgrvrxrrrrrdsII###J--X-&&X&_//_/        rrceZdZdZdZdS) TestOperationz!Test value by specified location.c  |j|\}}||}n|j||}n.#t$r!}t t |d}~wwxYw |jd}n!#t$r}tdd}~wwxYw||krAd}t | |t||t||S)Nr+r~z0{0} ({1}) is not equal to tested value {2} ({3})) rErkwalkrrrerGrlrrnr)rHrMrorpvalrIr+rqs rr5zTestOperation.applys /<//44LFD|l''55# / / /%c"gg.. . / CN7+EE C C C"ACC C C %<<DC%cjjd3ii16U 'E'EFF F s/=A A+ A&&A+/ A== BBBNrrrrr5rrrrrs)++rrceZdZdZdZdS) CopyOperationzA Copies an object property or an array element to a new location c ||jd}n!#t$r}tdd}~wwxYw||\}} t j||}n5#ttf$r!}tt|d}~wwxYwtd|j |d|j |}|S)Nrrrrr/) r0rGrlrrkcopydeepcopyrmrrer|rDr5rs rr5zCopyOperation.applys B''v(>??HH B B B"@BB B B '',,  -M&,//EE*% - - -#CGG,, , -M  ' )))*/s  s* # A<AA88B* B%%B*Nrrrrrrs)KKrrc eZdZeejZeeZe e e e e eedZ efdZdZdZeZdZdZdZdZed efd Zed d efd Zdd ZedZddZ dZ!d S)r3)rrreplacemovetestrc`||_||_|jD]}||dSrO)r7r0_get_operation)rHr7r0rs rrJzJsonPatch.__init__(sE & * $ $B    # # # # $ $rc*|S)zstr(self) -> self.to_string()) to_stringrRs r__str__zJsonPatch.__str__3s~~rc*t|jSrO)boolr7rRs r__bool__zJsonPatch.__bool__7DJrc*t|jSrO)iterr7rRs r__iter__zJsonPatch.__iter__<rrcDtt|jSrO)rPtuple_opsrRs rrSzJsonPatch.__hash__?sE$)$$%%%rcPt|tsdS|j|jkSrU)r1r3rrVs rrXzJsonPatch.__eq__Bs(%++ 5yEJ&&rc||k SrOrrVs rrZzJsonPatch.__ne__Gr[rNcD|p|j}||}|||S)aCreates JsonPatch instance from string source. :param patch_str: JSON patch as raw string. :type patch_str: str :param loads: A function of one argument that loads a serialized JSON string. :type loads: function :param pointer_cls: JSON pointer class to use. :type pointer_cls: Type[JsonPointer] :return: :class:`JsonPatch` instance. r/) json_loader)cls patch_strloadsr0rr7s rr4zJsonPatch.from_stringJs4 .s  I&&s5k2222rTc|p|j}t||||}|dd||t|}|||S)aCCreates JsonPatch instance based on comparison 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 :param dumps: A function of one argument that produces a serialized JSON string. :type dumps: function :param pointer_cls: JSON pointer class to use. :type pointer_cls: Type[JsonPointer] :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 r/N) json_dumper DiffBuilder_compare_valuesr%execute) rr<r= optimizationdumpsr0rbuilderopss rr;zJsonPatch.from_diff^sl>.s c3 MMMD#s3337??$$%%s3K0000rc4|p|j}||jS)z!Returns patch set as JSON string.)rr7)rHrrs rrzJsonPatch.to_strings!/t/ {4:&&&rcPtt|j|jSrO)rmaprr7rRs rrzJsonPatch._opssS,dj99:::rFcp|stj|}|jD]}||}|S)a5Applies the patch to a given object. :param obj: Document object. :type obj: dict :param in_place: Tweaks the way how patch would be applied - directly to specified `obj` or to its copy. :type in_place: bool :return: Modified `obj`. )rrrr5)rHrMr8rGs rr5zJsonPatch.applysD %-$$C ' 'I//#&&CC rcd|vrtd|d}t|tstd||jvr"td||j|}|||jS)Nrz&Operation does not contain 'op' memberzOperation must be a stringzUnknown operation {0!r}r/)rr1r2 operationsrnr0)rHrGrrs rrzJsonPatch._get_operations y "#KLL L t_"j)) A"#?@@ @ T_ $ $"#<#C#CB#G#GHH Hob!s9$*:;;;;rrO)F)"rrr staticmethodjsonrr _jsonloadsrrrir|rrrrrrrJrr __nonzero__rrSrXrZ classmethodr4r;rrfrr5rrrrr3r3s,tz**K,z**K!!!# ##J,Z+6 $ $ $ $      K   &&&''' """*.K333[3&(,D#"1"1"1["1H'''' ;;X;* < < < <  > > > > > ?s*AA,B  B c||t|f} |j||}|r|SdS#t$rf|j|}t t|dz ddD]3}||d|kr||dccYS4YdSwxYw)Nrr^r)rrrpoprFrranger)rHr+rrrris r take_indexzDiffBuilder.take_indexsDKK(  -'+// ::F $zz||# $ $ - - -)"-G3w<<>2r22 - -1:a=I--";;q>>!,,,,,,. - - - -s5A A)B;6B;:B;cJ|j}|d}|||gx|d<|d<|dS)Nrrr)rHrrlasts rrzDiffBuilder.inserts4{Aw!4,,Q$q'Awrc4|\}}}||d<||d<g|dd<dS)Nrrr)rHr link_prev link_next_s rrzDiffBuilder.removes1"' 9a !  ! aaarc#`K|j}|d}||ur|dV|d}||udSdSNrr)rHstartrcurrs r iter_fromzDiffBuilder.iter_fromsP{Qx$q'MMM7D$rc#`K|j}|d}||ur|dV|d}||udSdSrr)rHrrs rrzDiffBuilder.__iter__sP{Aw$q'MMM7D$rc#K|j}|d}||ur|d|ur|d|dd}}|j|jkrpt|tkrXt|tkr@t d|j|jdd|jjV|dd}|djV|d}||udSdS)Nrrrr+rr/)rrDrrir|rrGr0)rHrrop_first op_seconds rrzDiffBuilder.executes {Aw$Awd""&*1gtAwqz)$ (:::X/99Y<77*' ) 2!*!4W!=,,$(#3 5556? ???  71:Dq'# # # #7D$rc||t}||d}t|jtkrUt|tkr=||D]'}||j|j|_(|||j t||krDtd|j t||d|j }| |dSdStdt|||d|j }| |}|||t dS)NrrrrrBr/rr)r _ST_REMOVErr rbrrvrBrrD _path_joinrr0rr|r_ST_ADD) rHrBr itemrrvnew_op new_indexs r _item_addedzDiffBuilder._item_addedssj11  qBBF||s""tCyyC'7'7..@@A..rw??BFF KK   {js3333& K&tS11(( $/ 111  F##### 43""4--## + ---F  F++I   T9g 6 6 6 6 6rctdt||d|j}||t}||}||d}|j|jd}t|tkr=| |D]'} | |j |j|_(|||j|jkr+t#d|j|jd|j}||d<dS||dS|||t&dS)Nrrr/rrrr)rirr0rrrrErkrrr%rrxrBr rrDrrr) rHrBr r r rr r added_itemr s r _item_removedzDiffBuilder._item_removedsq tS))" " ')))g..KK''  qB ++DL99!> 6 6CW}}s8SXS#::^44 5sN33 5'' 4(=(=sCHHHH_555"3885'' 4(=(=sCHHHH&&tS#666$$T344447""""4#c(;;;;  sCH5555- 6 6rct|tr * * 03// 0    4 5 5sC @ @ @ @ @ _ - - 0300 0    4 5 5sC @ @ @ @ @ZZ__ 3 / / F   c3 / / / / /rN)rrrrrrrJrrrrrrrr rrrrrrrrrrs/3z{%%%% ? ? ? - - -  (7772:::B*** @ @ @666800000rrc||S|dzt|ddddzS)Nr]~z~0z~1)rerrts rrrsA { #:C((d33;;CFF FFr)4r __future__rr#r functoolsrsystypesr ImportErrorr' jsonpointerrrrrcollections.abcrr unicodere __author__ __version__ __website__ __license__ version_infobytesr2 Exceptionr rrAssertionErrorrr,partialrrr9r>objectr@rir|rrrrr3rrrrrr:s B&%''''''  &&&&&&&:9999999   ?????????;;;;;;;; CCC 0  @ $ vJ$$$$$$$$77777)777*$$$$$,n$$$    Y tzY G G G &+ %&%&%&%&P&1BBBB03/3/3/3/3/V3/3/3/ln<11111>111h'''''~'''TSSSSSNSSSlN6N2@<@<@<@<@<@<@<@