ó
    }¬jDX  ã                   óÔ   • S r SSKrSSKrSSKrSSKrSSKJr  SrSr	Sr
SrS	r " S
 S\5      rS rSS jrSS jrSS jrSS jrSS jrSS jrSS jrS rS rSS jrSS jrSS jrg) a6  The way back from Dealer OS to this Mac.

Dealer OS is the only screen people use for live auctions (Steven
2026-09-02); anything a person does there (star, hide, unhide, save a
view, change a display setting, ask for a run) is written to Dealer OS's
own tables AND to an append only action log. This Mac polls that log
(GET /api/bidbrain/actions?since=<seq>) and applies each action through
the SAME functions the cockpit's own buttons use (db.set_bid plus the
watchlist queue, db.hide_car, db.save_view, db.set_settings,
serve._start_run), so hide note learning, watchlist sync and suppression
keep working unchanged. It also posts a heartbeat (POST /api/bidbrain/
status) carrying the run light and progress, whose reply says how many
actions are waiting, so a poll never has to guess.

Dealer OS is the source of record for anything a person does. Every
star, hide, view and setting on either side carries an updated_at (UTC);
last write wins per key. When an action is applied here it is stamped
with the action's own `at`, never now(), so the echo in the next push
can never look newer than the Dealer OS row and bounce back.

Standard library only. Nothing here opens a browser; the hooks dict lets
serve.py hand in the watchlist kick and run control so the same code runs
from serve.py's own thread and from the command line.
é    Né   )Údbz/api/bidbrain/actionsz/api/bidbrain/statusz/api/bidbrain/diagnosticsÚdealer_os_sync)Údetails_styleÚdefault_price_ceilingc                   ó   • \ rS rSrSrSrSrg)ÚDealerOsSyncErroré+   zÝA poll or heartbeat that did not land, in plain words. missing_route
is True when Dealer OS answered 404: an older Dealer OS without the
sync routes yet, which is not a fault to flag, just something to wait
for patiently.F© N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Úmissing_routeÚ__static_attributes__r   ó    Ú8/Users/stevendouglas/BidBrain/bidbrain/dealer_os_sync.pyr	   r	   +   s   † ñð ƒMr   r	   c                  óÆ   • [         R                   R                  [         R                  R                  5      R	                  SS9R                  5       R	                  SS5      $ )Nr   )Úmicrosecondz+00:00ÚZ)ÚdatetimeÚnowÚtimezoneÚutcÚreplaceÚ	isoformatr   r   r   Úutcnowr   3   sK   € Ü×Ñ× Ñ ¤×!2Ñ!2×!6Ñ!6Ó7×?Ñ?ÈAÐ?ÐN×XÑXÓZ×bÑbÐckÐmpÓqÐqr   c           	      óâ  • U =(       d    SR                  5       R                  S5      n U=(       d    SR                  5       nU (       a  U(       d  [        S5      eUb%  [        R                  " U5      R                  S5      OS n[        R                  R                  X-   Xfb  SOSSSU 3S	S
.S9nU=(       d    [        R                  R                  n U" XtS9 n	U	R                  5       n
S S S 5        W
(       d  0 $  [        R&                  " U
R                  S5      5      $ ! , (       d  f       N== f! [        R                  R                   aÁ  nUR                  S;   a  [        S5      UeUR                  S:X  a  [        SU S35      nSUl        XËeSn UR                  5       R                  SS5      S S R                  5       nO! [          a     Of = f[        SUR                   SU S3U(       a  SU 3-   5      UeS-   5      UeS nAf[        R                  R"                   a!  n[        SU  SUR$                   35      UeS nAff = f! [(         a    [        SU S35      ef = f)NÚ Ú/ztDealer OS is not set up on this Mac: DEALER_OS_BASE_URL and DEALER_OS_API_KEY both need a value in dealer_config.py.zutf-8ÚPOSTÚGETzapplication/jsonzBearer ÚBidBrain)zContent-TypeÚAuthorizationz
User-Agent)ÚdataÚmethodÚheaders)Útimeout)i‘  i“  z#Dealer OS refused this Mac's token.i”  zDealer OS has no z  route yet (an older Dealer OS).Tr   éÈ   zDealer OS answered z to Ú.Ú zCould not reach Dealer OS at ú: z! with something that is not JSON.)ÚstripÚrstripr	   ÚjsonÚdumpsÚencodeÚurllibÚrequestÚRequestÚurlopenÚreadÚerrorÚ	HTTPErrorÚcoder   ÚdecodeÚ	ExceptionÚURLErrorÚreasonÚloadsÚ
ValueError)Úbase_urlÚapi_keyÚpathÚbodyr)   Úopenerr&   ÚreqÚdo_openÚrespÚrawÚeÚerrÚdetails                 r   Ú_requestrM   7   sS  € Ø—˜B×%Ñ%Ó'×.Ñ.¨sÓ3€HØ�}˜"×#Ñ#Ó%€GÞž7ÜðGóHð 	Hð 04Ñ/?Œ4�:Š:�dÓ×"Ñ" 7Ô+ÀT€DÜ
�.‰.×
 Ñ
 Ø‰˜dÑ5E©6È5Ø!3Ø$+¨G¨9Ð"5Ø)ñ+ð !ð ,€Cð
 ×.œŸ™×.Ñ.€Gð_Ù�SÒ*¨dØ—)‘)“+ˆC÷ +ö" Øˆ	ð_Ü�zŠz˜#Ÿ*™* WÓ-Ó.Ð.÷) +Õ*ûä�<‰<×!Ñ!ó uØ�6‰6�ZÓÜ#Ð$IÓJÐPQÐQØ�6‰6�S‹=Ü#Ð&7¸°vÐ=]Ð$^Ó_ˆCØ $ˆCÔØÐØˆð	Ø—V‘V“X—_‘_ W¨iÓ8¸¸#Ð>×DÑDÓF‰FøÜó 	Ùð	úäÐ"5°a·f±f°X¸TÀ$ÀÀqÐ IÖ]cÈqÐQWÐPXÈ\Ñ lÓmÐstÐtÐikÑ lÓmÐstÐtûÜ�<‰<× Ñ ó _ÜÐ"?À¸zÈÈAÏHÉHÈ:Ð VÓWÐ]^Ð^ûð_ûô ó _ÜÐ"5°d°VÐ;\Ð ]Ó^Ð^ð_úss   ÃD5 ÃD$Ã-D5 Ã?$I Ä$
D2Ä.D5 Ä2D5 Ä5IÅAHÆ1GÇHÇ
GÇHÇGÇ6HÈ!IÈ0IÉIÉI.c                 óT   • [        X[         S[        U5       S[        U5       3XES9$ )z‰Every action Dealer OS has logged after cursor `since`, oldest
first: {cursor, server_time, actions: [{seq, id, kind, at, by, payload}]}.z?since=z&limit=)r)   rE   )rM   ÚAPI_ACTIONSÚint)rA   rB   ÚsinceÚlimitr)   rE   s         r   Úfetch_actionsrS   _   s5   € ô �H¬+¨°g¼cÀ%»j¸\ÈÔQTÐUZÓQ[ÐP\Ð']Ø#ñ4ð 4r   c           	      ó"   • [        X[        X#US9$ )z8The heartbeat. Reply carries {"ok": true, "pending": n}.©rD   r)   rE   )rM   Ú
API_STATUS)rA   rB   Úsnapshotr)   rE   s        r   Úpost_statusrX   f   s   € ä�H¤z¸ÐZ`ÑaÐar   c           	      ó"   • [        X[        X#US9$ )z€The diagnostics document (bidbrain/diagnostics.py): log tails, the
full run records and site health. Reply carries {"ok": true}.rU   )rM   ÚAPI_DIAGNOSTICS)rA   rB   Údocr)   rE   s        r   Úpost_diagnosticsr\   k   s   € ô �H¤¸SÐZ`ÑaÐar   c                 óä   • U (       a  [         R                  " U 5      O[         R                  " 5       n[        UR                  [        5      =(       d    0 R                  S5      =(       d    S5      $ )NÚcursorr   )r   Úget_settingsrP   ÚgetÚSETTINGS_KEY)rC   Úss     r   r^   r^   t   sD   € Þ!%Œ�Š˜Ô¬2¯?ª?Ó+<€AÜ�—‘”lÓ#×) r×.Ñ.¨xÓ8×=¸AÓ>Ð>r   c                 óv  • U(       a  [         R                  " U5      O[         R                  " 5       n[        UR                  [        5      =(       d    0 5      n[        U 5      US'   UR                  U5        U(       a  [         R                  " [        U0U5        g [         R                  " [        U05        g )Nr^   )r   r_   Údictr`   ra   rP   ÚupdateÚset_settings)ÚseqrC   Úextrarb   Úcurs        r   Ú
set_cursorrj   y   ss   € Þ!%Œ�Š˜Ô¬2¯?ª?Ó+<€AÜ
ˆq�u‰u”\Ó"×( bÓ
)€CÜ˜“H€Cˆ�MØ‡J�JˆuÔÞÜ
�Šœ sÐ+¨TÕ2ä
�Šœ sÐ+Õ,r   c                 ó  • U(       a  SU0O0 n[         R                  " U 40 UD6 Vs/ s H\  nUS   US   [        US   5      UR                  S5      =(       d    SUR                  S5      =(       d    UR                  S5      S	.PM^     nn[         R                  " S0 UD6 Vs/ s H¥  nUS   UR                  S
5      =(       d    SUR                  S5      UR                  S5      UR                  S5      [        UR                  SS5      5      UR                  S5      UR                  S5      =(       d    UR                  S5      S.PM§     nn[         R
                  " SSS0UD6 Vs/ s H`  nUS   US   US   [        US   5      [        UR                  S5      5      UR                  S5      =(       d    UR                  S5      S.PMb     nnXFUU(       a  [        U5      S.$ [        5       S.$ s  snf s  snf s  snf )zÔThe Mac's own stars for this sale date, every active hide and every
saved view, each with its updated_at, plus the cursor, so Dealer OS can
reconcile with last write wins and the Mac's own actions reach the page.rC   ÚregÚ	sale_dateÚactiveÚplatformr    Ú
updated_atÚ
created_at)rl   rm   Úonro   rp   r>   ÚnameÚmakeÚmodelr   Ú	hidden_at)rl   r>   rs   rt   ru   rn   rv   rp   Úinclude_deletedTÚ	remote_idÚcriteriaÚstarredÚdeleted)Úidrs   ry   rz   r{   rp   )ÚstarsÚhiddenÚviewsr^   r   )r   Úbids_with_updatedÚboolr`   Úhidden_listÚlist_saved_viewsr^   )	rm   rC   ÚkwÚrr}   Úhr~   Úvr   s	            r   Úlocal_staterˆ   ‡   sö  € ö  ˆ&�$‰ R€Bô ×*Ò*¨9Ñ;¸Ò;ó=ò <�ð �u‘X¨A¨k©NÄ$ÀqÈÁ{ÓBSØŸ%™% 
Ó+×1¨rØŸE™E ,Ó/×F°1·5±5¸Ó3FôHñ <ð 
ð =ô —~’~Ñ+¨Ò+ó-ò ,�!ð ˜‘h¨!¯%©%°«/×*?¸RÈÏÉÈvËØ—u‘u˜V“}¨q¯u©u°W«~ÌÈaÏeÉeÐT\Ð^_ÓN`ÓIaØŸE™E +Ó.¸a¿e¹eÀLÓ>Q×>gÐUV×UZÑUZÐ[fÓUgôiñ ,ð ð -ô ×)Ò)ÑE¸$ÐEÀ"ÒEóGò F�ð �k‘N¨A¨f©IÀ1ÀZÁ=Ü˜a 	™lÓ+¼¸Q¿U¹UÀ9Ó=MÓ8NØŸE™E ,Ó/×F°1·5±5¸Ó3FôHñ Fð 
ð Gð °uÞ&*”f˜T“lñ:ð :Ü06³ñ:ð :ùò=ùò-ùòGs   §A#G7Â$B,G<Å,A'Hc                 óN   • U (       a  U(       d  g[        U 5      [        U5      :„  $ )zCTrue when the local row is already newer than the action (skip it).F)Ústr)Úlocal_atÚ	action_ats     r   Ú_newerr�   Ÿ   s   € æž9ØÜˆx‹=œ3˜y›>Ñ)Ð)r   c                 óô   • U R                  S5      =(       d    0 n[        U[        5      (       d  gUR                  S5      =(       d    SR                  5       =(       d    UR                  S5      =(       d    S$ )z´Who made a Dealer OS action, for the purchase timeline: the person's
own name when Dealer OS sends one (v3.15.23, the team list's name),
else their email, else plainly "Dealer OS".Úbyz	Dealer OSrs   r    Úemail)r`   Ú
isinstancerd   r.   )Úactionr�   s     r   Ú_whor“   ¦   sU   € ð 
�‰�DÓ	×	˜R€BÜ�bœ$×ÑØØ�F‰F�6‹N× ˜b×'Ñ'Ó)×K¨R¯V©V°G«_×KÀÐKr   c                 ó¢  • U=(       d    0 nU(       a  SU0O0 nU R                  S5      =(       d    SnU R                  S5      =(       d    0 nU R                  S5      =(       d
    [        5       n US:X  Ga  UR                  S5      =(       d    SnUR                  S5      =(       d    SnU(       a  U(       d  g	[        UR                  S
5      =(       d    0 5      n	UR                  S5      =(       d    U	R                  S5      =(       d    SU	S'   [        R                  " Xx4SU	S   0UD6n
[        X¦5      (       a  SSU S34$ [        R                  " Xx[        UR                  SS5      5      UR                  SS5      =(       d    SUR                  SS5      =(       d    SUR                  SS5      =(       d    SUR                  S5      UR                  S5      4X–S.UD6  UR                  S5      nU(       a\  U" U[        UR                  SS5      5      U	R                  S5      =(       d    UR                  S5      UR                  S5      S.5        SSU SUR                  SS5      (       a  SOS 34$ US:X  a×  UR                  S5      =(       d    SnU(       d  g[        [        R                  " U40 UD6U5      (       a  SSU S34$ [        R                  " XuR                  SS5      =(       d    SUR                  SS5      =(       d    SUR                  SS5      =(       d    SUR                  SS5      =(       d    S4S U0UD6  SSU 34$ US!:X  ap  UR                  S5      =(       d    SnU(       d  g"[        [        R                  " U40 UD6U5      (       a  SS#U S34$ [        R                  " U4S U0UD6  SS#U 34$ US$:X  GaI  [        R                  " UR                  S5      =(       d    S5      nU(       d  g%[        [        R                  " U40 UD6U5      (       a  SS&U S34$ [        R                  " XuR                  SS5      =(       d    SUR                  S'5      =(       d    / UR                  SS5      =(       d    SUR                  SS5      =(       d    SUR                  SS5      =(       d    S[        U 5      4S U0UD6  UR                  S(5      nU(       a  U" [        XWS)95      OS*nSS&U 3U(       a  S+U 3-   4$ S-   4$ US,:X  aØ  UR                  S-5      =(       d    SnU(       a  UR                  S5      (       d  g.[        [        R                  " U40 UD6U5      (       a  SS/U S34$ [        R                   " UR                  S5      UR                  S05      =(       d    0 4U[        UR                  S1S5      5      US2.UD6  SS/UR                  S5       34$ US3:X  a‚  UR                  S-5      =(       d    Sn[        [        R                  " U40 UD6U5      (       a  SS4U S34$ [        R"                  " U[        UR                  S1S5      5      4S U0UD6  SS4U 34$ US5:X  a:  UR                  S-5      =(       d    Sn[        R$                  " U4S U0UD6  SS6U 34$ US7:X  Ga  UR                  S85      (       að  UR                  S95      nU(       d  g:UR                  S85      nUS;:w  a  U/O0['        UR                  S<5      =(       d    0 R)                  5       5      nU HM  n[        [+        [        S=5      (       a  [        R,                  " U40 UD6OS*U5      (       d  MB  SS>U S?U S@34s  $     U" XõR                  S<5      [        U 5      U5      nSS>U SAU SB[        U 5       34$ US7:X  aƒ  UR                  SD5      nU[0        ;  a	  SS>U< SE34$ [        [        R,                  " U40 UD6U5      (       a  SS>U S34$ [        R2                  " UUR                  S<5      04S U0UD6  SS>U 34$ USF:X  a²  UR                  SG5      nU(       d  gH[        UR                  SI5      =(       d    0 5      nU R                  SJ5      USK'   U" UR                  SD5      =(       d    SLUR                  SM5      U5      n[        UR                  SN5      5      SOUR                  SD5       SPU 34$ USQ:X  aÎ  UR                  SR5      n[        U 5      nU(       a;  U" UR                  S-5      UR                  SS5      UR                  S<5      ST.U5        OH[        R4                  " UR                  S-5      UR                  SS5      UR                  S<5      4SUU0UD6  SSVUR                  S-5       SUR                  SS5       34$ USW:X  Ga  UR                  SS5      n[        U 5      nUSX:X  a€  [        R6                  " UR                  S-5      UR                  S<5      4SUU0UD6  UR                  SY5      nU(       a/  UR                  S<5      SZ;  a   U" UR                  S-5      U5        OHOGUS[:X  a9  [        R:                  " UR                  S-5      UR                  S<5      4SUU0UD6  OSS\U< 34$ SS]UR                  S-5       SU 34$ US^:X  a`  [        R<                  " UR                  S-5      UR                  S_5      =(       d    S4SU[        U 5      0UD6  SS`UR                  S-5       34$ USa;   a9  UR                  Sb5      nU(       d  SU Sc34$  SU SPU" XE[        U 5      5       34$ USd:X  a1  UR                  Se5      nU(       d  gf SSgU" U[        U 5      5       34$ USi:X  a&  UR                  Sj5      nU(       d  gkSSlU" U5       34$ USm:X  a'  UR                  Sn5      nU(       d  go SSpU" U5       34$ USr:X  a!  UR                  Ss5      nU(       d  gtU" 5         guUSv:X  a1  UR                  Sw5      nU(       d  gxU" U R                  SJ5      5        gyUSz:X  a»  UR                  S{5      =(       d    / nUR                  S5      =(       d    Sn[        R>                  " UU4S|UR                  S|5      =(       d    U0UD6nU(       d  g}UR                  S~5      nU(       a  U" U R                  SJ5      5      OSnSS€U S�U 3U(       a  S+U 3-   4$ S-   4$ US‚:X  aO  UR                  Sƒ5      nU(       d  g„U" U R                  SJ5      5      n[        UR                  SN5      5      S…U 34$ SS†U< 34$ ! [.         a  nSS>U SCU 34s S*nA$ S*nAff = f! [8         a     GNøf = f! [.         a  nSU SCU 34s S*nA$ S*nAff = f! [.         a  nSShU 34s S*nA$ S*nAff = f! [.         a  nSSqU 34s S*nA$ S*nAff = f! [8         a  nSU S‡U 34s S*nA$ S*nAff = f)ˆzÆApply one logged action through the existing functions. Returns
(applied, note). Never raises on a single bad action; the caller logs
the note and moves on so one odd row cannot stall the whole log.rC   Úkindr    ÚpayloadÚatzstar.setrl   rm   )Fz!star.set without reg or sale_dateÚdetailsro   Fz	star.set z skipped, local row is newerrr   Trt   ru   rs   Úmax_bidÚreserve)r˜   rp   Ú
after_starÚlisting_url)rl   rr   ro   rœ   r,   Úoffzhide.set)Fzhide.set without regz	hide.set r>   rp   z
hide.clear)Fzhide.clear without regzhide.clear zhold.release)Fzhold.release without regzhold.release ÚrulesÚhold_release)rl   Nz, z	view.saver|   )Fzview.save without id or namez
view.save ry   rz   )rx   rz   rp   z	view.starz
view.star zview.deletezview.delete zsettings.setÚsectionÚsettings_section)Fz1settings.set section needs the server to apply itÚbuying_rulesÚvalueÚsetting_updated_atzsettings.set z skipped, the Mac saved z more recentlyz saved z by z
 refused: Úkeyz& is not a setting Dealer OS may changez	run.startÚ	start_run)Fz&run.start needs the server to apply itrD   rg   Ú_seqÚrunÚ	platformsÚstartedz
run.start r-   zpurchase.setÚset_purchase_fieldÚfield)r|   r¬   r£   Úwhozpurchase.set zpurchase.overrideÚretail_estimateÚretail_changed)Nr    Úcollection_datez%purchase.override with unknown field zpurchase.override zpurchase.commentÚtextzpurchase.comment )
zpurchase.chipzpurchase.unchipzpurchase.cancelzpurchase.checkinzpurchase.addzpurchase.dkzpurchase.dk_sendzpurchase.deletez
views.savezviews.deleteÚpurchase_actionz needs the server to apply itzpurchase.documentÚdocument)Fz.purchase.document needs the server to apply itzpurchase.document: zpurchase.document refused: z
sale.priceÚ
sale_price)Fz'sale.price needs the server to apply itzsale.price: zpurchase.dk_stageÚdk_stage)Fz.purchase.dk_stage needs the server to apply itzpurchase.dk_stage: zpurchase.dk_stage refused: úrun.stopÚstop_run)Fz%run.stop needs the server to apply it)Tr¶   údiagnostics.pullÚsend_diagnostics)Fz-diagnostics.pull needs the server to apply it)Tr¸   zshortlist.readÚcarsÚasked_at)Fz$shortlist.read named no readable carÚ	deep_readz4queued, the server reads it on its next quiet momentzshortlist.read z car(s) queued for zupdate.startÚstart_update)Fz)update.start needs the server to apply itzupdate.start: zunknown action kind z	 failed: ) r`   r   rd   r   Úbid_updated_atr�   Úset_bidr�   Úhidden_updated_atÚhide_carÚ
unhide_carÚ	_norm_regÚreleased_updated_atÚrelease_carr“   Úview_updated_atÚ	save_viewÚstar_view_remoteÚdelete_view_remoteÚlistÚkeysÚhasattrr¤   r@   ÚSYNCABLE_SETTINGSrf   r«   Úset_retail_estimate_overrider<   Úset_collection_date_overrideÚadd_purchase_commentÚqueue_deep_reads) r’   ÚhooksrC   r„   r•   Úpr—   rl   rm   r˜   ÚexistingÚafterÚdoorÚnoteÚridr    rË   ÚkÚsavedrJ   r¥   ÚstartrD   ÚresultÚsetterr­   ÚwhichÚretail_hookÚstopÚsendrº   Úns                                    r   Úapply_actionrã   °   sº  € ð �K�R€EÞˆ&�$‰ R€BØ�:‰:�fÓ×# €DØ�
‰
�9Ó×# €AØ	�‰�DÓ	×	%œV›X€Bðd,Ø�:ÔØ—%‘%˜“,×$ "ˆCØŸ™˜kÓ*×0¨bˆIÞžiØAÜ˜1Ÿ5™5 Ó+×1¨rÓ2ˆGà"#§%¡%¨
Ó"3×"T°w·{±{À:Ó7N×"TÐRTˆG�JÑÜ×(Ò(¨Ñ\À'È*ÑBUÐ\ÐY[Ñ\ˆHÜ�h×#Ñ#Ø 	¨#¨Ð.JÐKÐKÐKÜ�JŠJ�s¤t¨A¯E©E°$¸Ó,=Ó'>ÀÇÁÀfÈbÓ@Q×@WÐUWØ—u‘u˜W bÓ)×/¨R°·±°v¸rÓ1B×1HÀbÈ!Ï%É%ÐPYÓJZØ—u‘u˜YÓ'ðOà18ñOàKMòOð —I‘I˜lÓ+ˆEÞÙ˜c¬¨a¯e©e°D¸$Ó.?Ó)@Ø#*§;¡;¨zÓ#:×#O¸a¿e¹eÀJÓ>OØ&'§e¡e¨MÓ&:ñ<ô =ð ˜9 S E¨°1·5±5¸¸t×3DÑ3D©4È%Ð*PÐQÐQÐQØ�:ÓØ—%‘%˜“,×$ "ˆCÞØ4Ü”b×*Ò*¨3Ñ5°"Ñ5°r×:Ñ:Ø 	¨#¨Ð.JÐKÐKÐKÜ�KŠK˜ŸU™U 8¨RÓ0×6°B¸¿¹¸fÀbÓ8I×8OÈRØŸ™˜g rÓ*×0¨b°!·%±%¸ÀÓ2C×2IÀrñ`ØVXð`Ø\^ò`à˜9 S EÐ*Ð*Ð*Ø�<ÓØ—%‘%˜“,×$ "ˆCÞØ6Ü”b×*Ò*¨3Ñ5°"Ñ5°r×:Ñ:Ø ¨C¨5Ð0LÐMÐMÐMÜ�MŠM˜#Ñ3¨"Ð3°Ò3Ø˜; s eÐ,Ð,Ð,Ø�>Ô!ô —,’,˜qŸu™u U›|×1¨rÓ2ˆCÞØ8Ü”b×,Ò,¨SÑ7°BÑ7¸×<Ñ<Ø ¨c¨UÐ2NÐOÐOÐOÜ�NŠN˜3§¡ h°Ó 3× 9°r¸1¿5¹5À»>×;OÈRØŸ5™5 ¨Ó,×2°°A·E±E¸'À2Ó4F×4LÈ"ØŸ5™5 ¨Ó,×2°´D¸³LñWàMOðWàSUòWð —9‘9˜^Ó,ˆDÞ-1‘4œ˜QÑ(Ô)°tˆDØ˜=¨¨Ð.Æ°B°t°f°+ÑNÐNÐNÈ2ÑNÐNÐNØ�;ÓØ—%‘%˜“+×# ˆCÞ˜aŸe™e FŸm™mØ<Ü”b×(Ò(¨Ñ3°Ñ3°R×8Ñ8Ø 
¨3¨%Ð/KÐLÐLÐLÜ�LŠL˜Ÿ™˜v›¨¯©¨jÓ(9×(?¸Rð UÈ3Ü!% a§e¡e¨I°uÓ&=Ó!>È2ñUØQSòUà˜: a§e¡e¨F£m _Ð5Ð5Ð5Ø�;ÓØ—%‘%˜“+×# ˆCÜ”b×(Ò(¨Ñ3°Ñ3°R×8Ñ8Ø 
¨3¨%Ð/KÐLÐLÐLÜ×Ò ¤T¨!¯%©%°	¸4Ó*@Ó%AÑWÈbÐWÐTVÒWØ˜: c UÐ+Ð+Ð+Ø�=Ó Ø—%‘%˜“+×# ˆCÜ×!Ò! #Ñ;°"Ð;¸Ò;Ø˜<¨ uÐ-Ð-Ð-Ø�>Ô! a§e¡e¨I×&6Ñ&6ð
 —9‘9Ð/Ó0ˆDÞØQØ—e‘e˜IÓ&ˆGØ '¨>Ó 9�G‘9¼tÀQÇUÁUÈ7Ã^×EYÐWY×D_ÑD_ÓDaÓ?bˆDÛ�Ü¼GÄBÐH\×<]Ñ<]œ"×/Ò/°Ñ8°RÒ8ÐcgÐik×lÓlØ  M°'°Ð:RÐSTÐRUÐUcÐ"dÐdÒdñ ðEÙ˜W§e¡e¨G£n´d¸6³lÀBÓG�Ø˜}¨W¨I°W¸U¸GÀ4ÌÈVËÀ~ÐVÐVÐVð �>Ó!Ø—%‘%˜“,ˆCØÔ+Ó+Ø ¨c©WÐ4ZÐ[Ð[Ð[Ü”b×+Ò+¨CÑ6°2Ñ6¸×;Ñ;Ø ¨c¨UÐ2NÐOÐOÐOÜ�OŠO˜S !§%¡%¨£.Ð1ÑG¸bÐGÀBÒGØ˜=¨¨Ð.Ð.Ð.Ø�;ÓØ—I‘I˜kÓ*ˆEÞØFÜ˜Ÿ™˜f›×+¨Ó,ˆDØ!Ÿ:™: eÓ,ˆD�‰LÙ˜1Ÿ5™5 ›<×0¨5°!·%±%¸Ó2DÀdÓKˆFÜ˜Ÿ
™
 9Ó-Ó.°*¸Q¿U¹UÀ5»\¸NÈ"ÈVÈHÐ0UÐUÐUØ�>Ó!ð —Y‘YÐ3Ó4ˆFÜ�v“,ˆCÞÙ˜aŸe™e D›k°A·E±E¸'³NÈQÏUÉUÐSZË^Ñ\Ð^aÕbä×%Ò% a§e¡e¨D£k°1·5±5¸³>À1Ç5Á5ÈÃ>ÑaÐWZÐaÐ^`ÒaØ˜=¨¯©¨t«¨°Q°q·u±u¸W³~Ð6FÐGÐGÐGØÐ&Ô&ð —E‘E˜'“NˆEÜ�v“,ˆCØÐ)Ó)Ü×/Ò/°·±°d³¸Q¿U¹UÀ7»^Ñ[ÐQTÐ[ÐXZÒ[ð
 $Ÿi™iÐ(8Ó9�Þ 1§5¡5¨£>¸Ó#CðÙ# A§E¡E¨$£K°Õ5øð Ð+Ó+Ü×/Ò/°·±°d³¸Q¿U¹UÀ7»^Ñ[ÐQTÐ[ÐXZÓ[àÐ EÀeÁYÐOÐOÐOØÐ-¨a¯e©e°D«k¨]¸!¸E¸7ÐCÐCÐCØÐ%Ó%Ü×#Ò# A§E¡E¨$£K°·±°v³×1DÀ"Ñ]Ì$ÈvË,Ð]ÐZ\Ò]ØÐ,¨Q¯U©U°4«[¨MÐ:Ð:Ð:Øð 2ó 2ð —9‘9Ð.Ó/ˆDÞØ  Ð&CÐDÐDÐDð5Ø ˜v R©¨T´d¸6³lÓ(CÐ'DÐEÐEÐEð Ð&Ó&ð
 —9‘9˜ZÓ(ˆDÞØNð@ØÐ2±4¸¼4À»<Ó3HÐ2IÐJÐJÐJð �<Óð —9‘9˜\Ó*ˆDÞØGØ˜<©¨Q« yÐ1Ð1Ð1ØÐ&Ó&ð —9‘9˜ZÓ(ˆDÞØNð@ØÐ2±4¸³7°)Ð<Ð<Ð<ð �:ÓØ—9‘9˜ZÓ(ˆDÞØEÙŒFØ#ØÐ%Ó%ð —9‘9Ð/Ó0ˆDÞØMÙ�—‘˜EÓ"Ô#Ø+ØÐ#Ó#ð —5‘5˜“=×& BˆDØŸ™˜kÓ*×0¨bˆIÜ×#Ò# D¨)Ñ\¸a¿e¹eÀJÓ>O×>UÐSUÐ\ÐY[Ñ\ˆAÞØDØ—I‘I˜kÓ*ˆEÞ/4‘5˜Ÿ™ EÓ*Ô+Ð:pˆDØ˜?¨1¨#Ð-@ÀÀÐLÖ_cÐRTÐUYÐTZÐP[ÑlÐlÐlÐikÑlÐlÐlØ�>Ó!ð —I‘I˜nÓ-ˆEÞØIÙ˜6Ÿ:™: eÓ,Ó-ˆFÜ˜Ÿ
™
 9Ó-Ó.°.ÀÀÐ0IÐIÐIØÐ,¨T©HÐ5Ð5Ð5øôU ó EØ ¨g¨Y°jÀÀÐDÐDÕDûðEûô^ %ó Úðûô* ó 5Ø   j°°Ð4Ð4Õ4ûð5ûô ó @ØÐ ;¸A¸3Ð?Ð?Õ?ûð@ûô$ ó @ØÐ ;¸A¸3Ð?Ð?Õ?ûð@ûôR ó ,Ø˜˜˜i¨ sÐ+Ð+Õ+ûð,ús  Á0A	x1 Â:Bx1 ÅD7x1 É>'x1 Ê&-x1 ËBx1 Í'x1 Î-x1 Î1x1 Ï<x1 Ð-x1 Ð<Cx1 Ôx1 Ô!=x1 Õ-x1 ÖA1x1 ×?Ax1 Ù9x1 Ú?x1 Û5x1 Û=Bx1 Þx1 Þx1 Þ7v# ß)x1 ß>-x1 à,0x1 áx1 á<Bx1 äCx1 ç)Bx1 é8w êAx1 ëx1 ë2A%x1 í$x1 í>w îx1 î7w5 ïx1 ï-x1 ï:x1 ðx ð'x1 ñx1 ñx1 ñ-x1 òA3x1 ó9Ax1 õx1 õx1 õ%5x1 öx1 ö#
wö-	v<ö6wö7x1 ö<w÷x1 ÷
w÷x1 ÷w÷x1 ÷
w2÷w-÷'w2÷(x1 ÷-w2÷2x1 ÷5
x÷?xøxøx1 øxøx1 ø
x.øx)ø#x.ø$x1 ø)x.ø.x1 ø1
yø;y	ùyù	yc                 óÀ   • S=p4/ nS nU  HM  n[        XqU5      u  p‰UR                  U	5        U(       a  US-  nOUS-  nUR                  S5      c  MH  US   nMO     X4XVS.$ )Nr   r   rg   )ÚappliedÚskippedÚnotesÚlast_seq)rã   Úappendr`   )
ÚactionsrÒ   rC   rå   ræ   rç   rè   ÚaÚokr×   s
             r   Úapply_actionsrí      sq   € ØÐ€GØ€EØ€HÛˆÜ ¨$Ó/‰ˆØ�‰�TÔÞØ�q‰L‰Gà�q‰LˆGØ�5‰5�‹<Ó#Ø˜‘xŠHñ ð ¸UÑYÐYr   c                 ó´  • U(       a  [        U5      O	[        5       n[        XXeUS9nUR                  S5      =(       d    / n[        X‚U5      n	UR                  S5      n
U	S   b*  [	        [        U
=(       d    S5      [        U	S   5      5      n
U
b!  [        U
5      U:w  a  [        X£[        5       S9  [        U
=(       d    U5      U	S'   [        U5      U	S'   U	$ )zÐFetch everything after the saved cursor, apply it, move the cursor.
Returns the apply summary plus the new cursor; raises DealerOsSyncError
only for a transport failure (a bad action is a note, not an error).)rR   rE   rê   r^   rè   r   )Úlast_pull_atÚfetched)	r^   rS   r`   rí   ÚmaxrP   rj   r   Úlen)rA   rB   rÒ   rC   rE   rR   rQ   Úreplyrê   ÚsummaryÚ
new_cursors              r   Úpull_and_applyrö   °  s¼   € ö !ŒF�4ŒL¤f£h€EÜ˜(¨UÈÑO€EØ�i‰i˜	Ó"×( b€GÜ˜G¨DÓ1€GØ—‘˜8Ó$€JØˆzÑÑ&Üœ˜ZŸ_¨1Ó-¬s°7¸:Ñ3FÓ/GÓHˆ
ØÑ¤# j£/°UÓ":Ü�:´&³(Ò;Ü˜J×/¨%Ó0€GˆHÑÜ˜W›€GˆIÑØ€Nr   )Né   N)éô  r÷   N)é
   N)é   N)N)NN)NNNrø   )r   r   r0   Úurllib.errorr3   Úurllib.requestr    r   rO   rV   rZ   ra   rÍ   ÚRuntimeErrorr	   r   rM   rS   rX   r\   r^   rj   rˆ   r�   r“   rã   rí   rö   r   r   r   Ú<module>rþ      s�   ðñó0 Û Û Û å à%€Ø#€
Ø-€ð  €à>Ð ô˜ô òrô%_ôP4ôbô
bô?ô
-ô:ò0*òLôm,ô`Zõ r   