
    Djz                    v   d Z ddlmZ ddlZddlmZmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZmZmZmZmZmZmZ ddlmZ ddlmZ d	d
lmZmZmZmZmZ d	dlm Z m!Z!m"Z"m#Z# d	dl$m%Z%m&Z& d	dl'm(Z(m)Z)m*Z*m+Z+ d	dl,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8  ej9        e:          Z; G d de"          Z< G d de          Z=dS )a  High-level Invites service built on top of the iCloud Events CloudKit API.

Public API:

Read (Phase 1):
  - ``InvitesService.events()`` -> ``list[Event]``
  - ``InvitesService.event(event_id)`` -> ``Event``
  - ``InvitesService.rsvps(event)`` -> ``list[Rsvp]``
  - ``InvitesService.resolve(short_guid)`` -> ``ResolvedShare``
  - ``InvitesService.accept(short_guid)`` -> ``Event``
  - ``InvitesService.raw`` -> ``CloudKitInvitesClient``

Write (Phase 2):
  - ``InvitesService.rsvp(event, status, ...)`` -> ``Rsvp``

Write operations on ``EventDetails`` (create event, publish, cancel, invite
via link) arrive in later phases per the design doc.
    )annotationsN)datetimetimezone)AnyDictIterableListMappingOptional)CKModifyOperationCKModifyResponseCKQueryObjectCKQueryResponseCKRecordCKWriteRecordCKZoneIDReq)CloudKitExtraMode)BaseService   )	CONTAINERENV EVENT_DETAILS_RECORD_NAME_PREFIXRSVP_RECORD_NAME_SUFFIXSHARE_RECORD_NAME)CloudKitInvitesClientInvitesApiErrorInvitesErrorScopeLiteral)decode_integrationsdecode_json_bytes)EventDetailsFieldInvitesRecordTypeOneTimeLinkField	RsvpField)AcceptanceStatusEvent
EventPlace
EventScope
EventShare	EventTimeOneTimeLinkGuestParticipantParticipantTypeResolvedShareRsvp
RsvpStatusc                      e Zd ZdZdS )EventNotFoundz=Raised when a requested event ID is not present in any scope.N)__name__
__module____qualname____doc__     \/home/thesage/.hermes/venv/lib/python3.11/site-packages/pyicloud/services/invites/service.pyr2   r2   L   s        GGGGr8   r2   c                  6    e Zd ZdZeZeZdddl fdZe	dmd            Z
dndZdodZdpdZdqdZdrdZddddddsd(Zedtd)            Zedud,            Zdvd/Zedwd3            Zedxd5            Zedyd6            Zedzd8            Zed{d<            Zd|d>Zd}d@ZddAdBd~dIZddKZeddN            ZeddQ            ZeddS            Z ddTZ!ddVZ"eddZ            Z#dd\Z$edd_            Z%ddaZ&ddcZ'ddeZ(ddfZ)ddhZ*ddjZ+eddk            Z, xZ-S )InvitesServicezTyped, read-only Invites API.

    Phase 1 exposes event listing, single-event lookup, RSVP listing, and the
    public share resolution flow (``resolve`` / ``accept``). Mutating
    operations land in subsequent phases.
    N)cloudkit_validation_extraservice_rootstrsessionr   paramsDict[str, str]r<   CloudKitExtraMode | NonereturnNonec                   t                                          |||           | j         d| j         d| j         }ddd|pi }t          ||||          | _        d S )N)r=   r?   r@   z/database/1//T)
remapEnumsgetCurrentSyncToken)validation_extra)super__init__r=   
_CONTAINER_ENVr   _raw)selfr=   r?   r@   r<   env_base_urlbase_params	__class__s          r9   rK   zInvitesService.__init__[   s     	lGFSSS+VVVV49VV#'
 
 |

 *6	
 
 
			r8   r   c                    | j         S )z9Escape hatch for advanced/unsupported CloudKit workflows.)rN   )rO   s    r9   rawzInvitesService.rawq   s     yr8   List[Event]c                P   g }t                      }t          j        t          j        fD ]|}|                     |          D ]d}|                     |j                  }||f}||v r%|                    |           |                    | 	                    ||                     e}|S )zReturn all events visible to the current user (private + shared).

        Each event is populated only from its ``EventDetails`` record; the
        share and RSVPs are ``None`` / empty here. Call :meth:`event` for a
        fully-hydrated view.
        scope)
setr(   PRIVATESHARED_iter_event_details_event_id_from_record_name
recordNameaddappend_event_from_record)rO   outseenrX   recordevent_idkeys          r9   eventszInvitesService.eventsz   s     ,/EE (**;< 	I 	IE22599 I I::6;LMMh'$;;

42262GGHHHHI 
r8   re   r&   c                    t           j        t           j        fD ]}|                     ||          }||c S t	          d|          )zReturn a fully-hydrated event by ID (zoneName / UUID).

        Looks up the event in the private scope first, then shared. Raises
        :class:`EventNotFound` if no scope has the event.
        NzEvent not found: )r(   rZ   r[   _fetch_event_fullr2   )rO   re   rX   events       r9   rj   zInvitesService.event   s^     !(**;< 	 	E**8U;;E  !<<<===r8   rj   
List[Rsvp]c                *                          |j        |j                  } j                                                 |j                  t          t          j        j	                  |          } fd 
                    |          D             S )z,Return the list of RSVPs in an event's zone.
recordTypequeryzone_idc                :    g | ]}                     |          S r7   _rsvp_from_record.0rrO   s     r9   
<listcomp>z(InvitesService.rsvps.<locals>.<listcomp>   s'    JJJa&&q))JJJr8   )_zone_id_reqre   rX   rN   rp   
_scope_strr   r"   r/   value_records_of)rO   rj   rq   resps   `   r9   rsvpszInvitesService.rsvps   s    ##ENEK@@yOOEK((+<+A+GHHH  
 

 KJJJ43C3CD3I3IJJJJr8   
short_guidr.   c                    | j                             |g          }|                     |          }|                     |          S )z#Preview a share without joining it.)rN   resolve_first_resolve_result_resolved_share_from_result)rO   r   dataresults       r9   r   zInvitesService.resolve   s@    y  *..++D11//777r8   c                0   | j                             |g          }|                     |          }|                    d          pi }|                    d          }t	          |t
                    st          d|          |                     |                    d                    }|                     ||          }|>|t          j
        k    rt          j        nt          j
        }|                     ||          }|t          d|d          |S )	z@Accept a share invite. Returns the joined event (now in SHARED).zoneIDzoneNamez'Accept response missing zoneID.zoneNamepayloaddatabaseScopeNzAccepted event z not visible in either scope)rN   acceptr   get
isinstancer>   r   _scope_from_db_scoperi   r(   r[   rZ   r2   )	rO   r   r   r   zonere   rX   rj   others	            r9   r   zInvitesService.accept   s"   y--++D11zz(##)r88J''(C(( 	!9    ))&**_*E*EFF&&x77= ',z/@&@&@
""jFW  **8U;;E=J(JJJ   r8   r   )namemessageplus_one_adultsplus_one_kidsstatusr0   r   Optional[str]r   r   intr   r/   c               Z   |dk     s|dk     rt          d|d|          |                     |          }| t           }|                     ||          }	|t          j        k    rd}d}t          j        j        d|j        ddt          j	        j        d|ddt          j
        j        d|ddt          j        j        d||z   ddi}
|d|dd|
t          j        j        <   |d|dd|
t          j        j        <   |	r|	j        nd}t          |	rd	nd
t!          |t"          j        j        ||
                    }|                     |j                  }|                     |j        |j                  }| j                            ||g|d          }|                     ||          S )a3  Submit or update the current user's RSVP for ``event``.

        Dispatches to ``private`` if the current user owns the event, or
        ``shared`` if they're a guest (per ``event.scope``). Creates the RSVP
        record on first response and updates it on subsequent calls.

        For :attr:`RsvpStatus.NOT_GOING`, plus-one counts are zeroed to mirror
        the iCloud web UI behavior; the ``plus_one_*`` kwargs are ignored in
        that case.

        Returns the freshly written :class:`Rsvp` (including the new
        ``record_change_tag``).
        r   zLplus_one_adults and plus_one_kids must be non-negative; got plus_one_adults=z, plus_one_kids=INT64T)typer{   isEncryptedNSTRINGupdatecreate)r^   rn   recordChangeTagfields)operationTyperd   )
operationsrq   atomic)r   _current_participant_idr   _find_existing_rsvpr0   	NOT_GOINGr$   STATUSr{   NUM_ADDITIONAL_ADULTSNUM_ADDITIONAL_KIDSNUM_ADDITIONAL_GUESTSNAMEMESSAGErecord_change_tagr   r   r"   r/   rz   rX   ry   re   rN   modify_rsvp_from_modify_response)rO   rj   r   r   r   r   r   participant_idrecord_nameexistingr   r   op	scope_strrq   responses                   r9   rsvpzInvitesService.rsvp   s<   . Q-!"3"3!3'63 3!.3 3   55e<<'B)@BB++E;??Z)))OM "#% %
 +1(#4 4
 )/&#2 2
 +1(=8#4 4!"
,  #, ,F9>'(
   #/ /F9$*+ ;CLH66&.<((H &,17 1	  
 
 
 OOEK00	##ENEK@@%)Y%5%5t	 &6 &
 &
 ..xEEEr8   c                    | j         t          d| j        d          | j         j        }|st          d| j        d          |S )z>Return the current user's participant_id on ``event``'s share.NzEvent zJ has no loaded share; fetch the event via InvitesService.event(...) first.zV share has no currentUserParticipant; the user may not be a participant on this event.)sharer   re   current_user_participant_id)rj   r   s     r9   r   z&InvitesService._current_participant_id(  s     ;!G G G G   @ 	!C C C C   r8   r   Optional[Rsvp]c                8    | j         D ]}|j        |k    r|c S dS )zAFind the user's RSVP in ``event.rsvps`` matching ``record_name``.N)r~   r   )rj   r   r   s      r9   r   z"InvitesService._find_existing_rsvp8  s6     K 	 	D;.. /tr8   r   r   c                
   |j         D ]S}t          |t                    r<|j        |k    r1|j        t
          j        j        k    r|                     |          c S Tt          d||
                    dd                    )z?Pick the RSVP record from a modify response and convert to DTO.z$RSVP modify response missing record jsonT)modeexclude_noner   )recordsr   r   r^   rn   r"   r/   r{   rt   r   
model_dump)rO   r   r   rd   s       r9   r   z)InvitesService._rsvp_from_modify_response@  s     & 	6 	6F68,,6%44%):)?)EEE--f55555B;BB''V$'GG
 
 
 	
r8   rX   r(   r   c                *    | t           j        k    rdndS )Nprivateshared)r(   rZ   rW   s    r9   rz   zInvitesService._scope_strT  s    !Z%777yyXEr8   db_scopec                    t          | t                    r$|                                 dk    rt          j        S t          j        S )Nr[   )r   r>   upperr(   r[   rZ   )r   s    r9   r   z#InvitesService._scope_from_db_scopeX  s:    h$$ 	%)9)9X)E)E$$!!r8   c                r    |                      t                    r| t          t                    d          S | S N)
startswithr   len)r   s    r9   r]   z)InvitesService._event_id_from_record_name^  s:    !!"BCC 	Hs#CDDFFGGr8   r   c                $    t          | d          S )NREGULAR_CUSTOM_ZONE)r   zoneType)r   )re   rX   s     r9   ry   zInvitesService._zone_id_reqd  s!    
 *
 
 
 	
r8   r}   r   List[CKRecord]c                $    d | j         D             S )Nc                <    g | ]}t          |t                    |S r7   )r   r   )rv   rw   s     r9   rx   z.InvitesService._records_of.<locals>.<listcomp>p  s'    CCCa:a+B+BCCCCr8   )r   )r}   s    r9   r|   zInvitesService._records_ofn  s    CC4<CCCCr8   Iterable[CKRecord]c                2   	 | j                             |                     |          t          t          j        j                  d          }n4# t          $ r' t          	                    d|j        d           g cY S w xY w| 
                    |          S )Nrm   T)rp   	zone_widez$invites.events.query_failed scope=%sexc_info)rN   rp   rz   r   r"   EventDetailsr{   r   LOGGERdebugr|   )rO   rX   r}   s      r9   r\   z"InvitesService._iter_event_detailsr  s    	9??&&#0=C    #  DD  	 	 	LL6d     III		
 %%%s   AA .B BOptional[Event]c                                          ||          }                     |          }	  j                            |t           | t
          g|          }n4# t          $ r' t                              d||j	        d           Y d S w xY wd }d } 
                    |          D ];}|j        t          j        j	        k    r|}|j        t          j        j	        k    r|}<|d S |r                     |          nd }	d}
	  j                            |t#          t          j        j	                  |          }t'           fd 
                    |          D                       }
n-# t          $ r  t                              d	|d           Y nw xY wd}	  j                            |t#          t          j        j	                  |          }t'           fd
 
                    |          D                       }n-# t          $ r  t                              d|d           Y nw xY w|	|r|	                    d|i          }	                     |||	|
          S )N)rq   z0invites.event.lookup_failed event_id=%s scope=%sTr   r7   rm   ro   c              3  B   K   | ]}                     |          V  d S r   rs   ru   s     r9   	<genexpr>z3InvitesService._fetch_event_full.<locals>.<genexpr>  sB        ./&&q))     r8   z+invites.event.rsvp_query_failed event_id=%sc              3  B   K   | ]}                     |          V  d S r   )_one_time_link_from_recordru   s     r9   r   z3InvitesService._fetch_event_full.<locals>.<genexpr>  sB        78//22     r8   z*invites.event.otl_query_failed event_id=%sone_time_links)r   )rX   r   r~   )ry   rz   rN   lookupr   r   r   r   r   r{   r|   rn   r"   r   Share_share_from_recordrp   r   r/   tupleOneTimeLinkGuestInfo
model_copyra   )rO   re   rX   rq   r   r}   event_recordshare_recordrd   r   r~   	rsvp_resp
otl_guestsotl_resps   `             r9   ri   z InvitesService._fetch_event_full  s<   ##He44OOE**		9##7CCC%   $  DD  	 	 	LLB	     44	 ,0+/&&t,, 	& 	&F $5$B$HHH%"&7&=&CCC%49EO''5554"$		#/@/E/KLLL (  I
     373C3CI3N3N    EE  	 	 	LL=      	 46
	y#0EK     '  H     <@<L<LX<V<V    JJ  	 	 	LL<      	 $$-=z,J$KKE&&U% ' 
 
 	
s7   -A -BBA(E. .'FFA(H 'H10H1r7   )r   r~   rd   r   r   Optional[EventShare]r~   tuple[Rsvp, ...]c          	        |                      |j                  }|j        }|                     |t          j        j        d          }|                     |t          j        j        d          }|                     |t          j        j        d          }	| 	                    |t          j
        j                  }
| 	                    |t          j        j                  }| 	                    |t          j        j                  }| 	                    |t          j        j                  }|                     |t          j        j                  }|                     |t          j        j                  pd}|                     |          }|                     |          }|                     |t          j        j                  pi }|                     |t          j        j                  pi }|                     |t          j        j                  }t/          |          }|j        r|j        j        nd }|j        r|j        j        nd }t7          di d|d|d|j        d|d|d	|	d
|
d|d|d|d|d|d|d|dt;          |t<                    r|ni dt;          |t<                    r|ni d|d|d|d|d|S )N defaultr   re   rX   r   titlenoteshost_display_nameis_published
is_privateis_cancelledblock_new_rsvpsmax_attendeesmax_additional_guests_per_rsvptimeplace
backgroundstyleintegrationscreated_timestampmodified_timestampr   r~   r7   )r]   r^   r   
_field_strr!   TITLEr{   NOTESHOST_DISPLAY_NAME_field_boolIS_PUBLISHED
IS_PRIVATEIS_CANCELLEDBLOCK_NEW_RSVPS
_field_intMAX_ATTENDEESMAX_ADDITIONAL_GUESTS_PER_RSVP_decode_time_decode_place_decode_json
BACKGROUNDSTYLEINTEGRATIONSr   created	timestampmodifiedr&   r   r   dict)rO   rd   rX   r   r~   re   r   r   r   r   r   r   r   r   r   max_additionaltime_obj	place_objr   r   integrations_blobr   
created_tsmodified_tss                           r9   ra   z!InvitesService._event_from_record  sD    2263DEE(9(?(ErRR(9(?(ErRR OO%7=r , 
 
 ''0A0N0TUU%%f.?.J.PQQ
''0A0N0TUU**%5;
 
 0A0O0UVVOO)HN   	 	 $$V,,&&v..	&&v/@/K/QRRXVX
!!&*;*A*GHHNB --%28
 
 ++<==17IV^--T
39?Lfo// 
 
 
X
%
 %44
 %	

 %
 0/
 &
 "z
 &
 ,O
 (-
 ,:>
 
 )
 &0
D%A%AIzzr
  &eT22:%%!
" &#
$ )j%
&  +{'
( %)
* %+
 	
r8   r)   c                     |j         pd}|j        pd}t           fd|j        pg D                       }d }t	          |dd           }|t	          |dd           }t          |||d|          S )Nr   NONEc              3  B   K   | ]}                     |          V  d S r   )_participant_from_ck)rv   prO   s     r9   r   z4InvitesService._share_from_record.<locals>.<genexpr>  sB       
 
-.D%%a((
 
 
 
 
 
r8   currentUserParticipantparticipantIdr7   )r   public_permissionparticipantsr   r   )	shortGUIDpublicPermissionr   r'  getattrr)   )rO   rd   r   r&  r'  r   currents   `      r9   r   z!InvitesService._share_from_record  s    %+
"3=v 
 
 
 
393F3L"
 
 
 
 
 6:#&":DAA*1'?D*Q*Q'!/%(C
 
 
 	
r8   r#  r,   c                   t          | dd           }|rt          |dd           nd }|rt          |dd           nd }t          t          | dd          pd|rt          |dd           nd |rt          |dd           nd |rt          |dd           nd |rt          |d	d           nd t                              t          | d
d                     t                              t          | dd                     t          | dd          pd          S )NuserIdentitynameComponents
lookupInfor%  r   userRecordName	givenName
familyNameemailAddressr   acceptanceStatus
permission	READ_ONLY)r   user_record_name
given_namefamily_nameemailr   acceptance_statusr5  )r*  r,   r;   _safe_participant_type_safe_acceptance_status)r#  identityname_componentslookup_infos       r9   r"  z#InvitesService._participant_from_ck(  sB   1nd339AKGH.555t 	 @HQghd;;;T"1or::@b=EO"2D9994 @OXd;;;TX #t<<<ALV7;===RV66wq&$7O7OPP,DD-t44  q,<<K%
 
 
 	
r8   r{   r-   c                    	 t          t          | pd                    S # t          $ r* t                              d|            t           j        cY S w xY w)zDMap a wire participant ``type`` to the enum, defaulting on unknowns.USERz#invites.participant.unknown_type %r)r-   r>   
ValueErrorr   r   rB  r{   s    r9   r<  z%InvitesService._safe_participant_typeD  s`    	("3u#7#7888 	( 	( 	(LL>FFF"''''	(     1AAr%   c                    	 t          t          | pd                    S # t          $ r* t                              d|            t           j        cY S w xY w)zDMap a wire ``acceptanceStatus`` to the enum, defaulting on unknowns.INVITEDz)invites.participant.unknown_acceptance %r)r%   r>   rC  r   r   rG  rD  s    r9   r=  z&InvitesService._safe_acceptance_statusM  sa    	,#C(:$;$;<<< 	, 	, 	,LLDeLLL#++++	,rE  c                   |j         }d}|                    |          r|d t          |                    n|}|j        }|                     |t
          j        j                  pd}	 t          |          }n# t          $ r t          j
        }Y nw xY w|                     |t
          j        j                  }t          |||                     |t
          j        j        d          ||                     |t
          j        j        d           |                     |t
          j        j                  pd|                     |t
          j        j                  pd||j        	  	        S )N_rsvpr   r   r   )	r   r   r   r   r   num_additional_adultsnum_additional_kidsimage_download_urlr   )r^   endswithr   r   r  r$   r   r{   r0   rC  NO_RESPONSE_asset_download_urlIMAGEr/   r  r   r   r   r   r   )	rO   rd   r   suffixr   r   
status_intr   	image_urls	            r9   rt   z InvitesService._rsvp_from_recordV  sV   '+6+?+?+G+GXK3v;;,''[ 	 __VY-=-CDDI
	,
++FF 	, 	, 	,+FFF	,,,VY_5JKK	#))=rJJOOFI,=,CTORR	(G(MNNSRS 	(E(KLLQPQ($4
 
 
 	
s   (A8 8BBr+   c           
        |j         }d}|                    |          r|d t          |                    n|}|j        }|                     |t
          j        j                  }|                     |t
          j        j                  }t          ||| 
                    |t
          j        j        d          t          |t                    rt          |          ndt          |t                    rt          |          nd          S )N_otlr   r   r7   )r   r   r   emailsphone_numbers)r^   rM  r   r   _field_valuer#   EMAILSr{   PHONE_NUMBERSr+   r  r   r   listr   )rO   rd   r   rQ  r   r   
emails_raw
phones_raws           r9   r   z)InvitesService._one_time_link_from_records  s    '+6+?+?+G+GXK3v;;,''[ 	 &&v/?/F/LMM
&&v/?/M/STT
#))9)>)DbQQ(2:t(D(DL5$$$"/9*d/K/KS%
+++QS
 
 
 	
r8   r   Mapping[str, Any]Dict[str, Any]c                    |                      d          }t          |t                    r|st          d|           |d         }t          |t                    st          d|           |S )Nresultsz'Resolve/accept response missing resultsr   r   z)Resolve/accept response result not a dict)r   r   r[  r   r  )r   ra  firsts      r9   r   z$InvitesService._first_resolve_result  s    ((9%%'4(( 	 	!9    
%&& 	!;    r8   r   c                   |                     d          pi }t          |t                    r|                     d          nd }t          |t                    st	          dt          |                    |                     d          pi }t          |t                    r|                     d          nd }t          |t                    st	          dt          |                    |                     d          pi }t          |t                    r|                     d	          nd }t          |t                    r|                     d
          nd }|                     d          pi }	t          |	t                    rL	 t          j        |	          }
|                     |
          }n2# t          $ r t          |d          }Y nw xY wt          |d          }t          ||t          |t                    r|                     d          nd t          |t                    r|                     d          nd t          |t                    r|                     d          nd t          |t                    r|                     d          nd t          |                     d          pd          t          |                     d          pd          t          |                     d          pd          |
  
        S )Nr(  r{   z(Resolve response missing shortGUID.valuer   r   r   z(Resolve response missing zoneID.zoneNameownerIdentityr.  r/  r   r   )r   r&  r0  r3  r1  r2  participantStatusr   participantTypeparticipantPermission)
r   re   owner_record_nameowner_emailowner_given_nameowner_family_nameparticipant_statusparticipant_typeparticipant_permissionr   )r   r   r  r>   r   r   model_validater   	Exceptionr)   r.   )rO   r   shortr   r   re   owner_identityowner_name_componentsowner_lookup_info	share_rawr   r   s               r9   r   z*InvitesService._resolved_share_from_result  s!   

;''-2+5eT+B+BLUYYw'''
*c** 	!:DLL    zz(##)r+5dD+A+AK488J'''t(C(( 	!:DLL     O44: .$//N/000 	 .$//N|,,, 	 JJw''-2	i&& 
	P'6yAA//==   ")&,   *OOOE! nd33""#3444 /66!%%n555 3T::%))+666 3T::%)),777"6::.A#B#B#HbII ,=!>!>!D"EE#&vzz2I'J'J'Pb#Q#Q5
 
 
 	
s   	)F3 3GGr   rf   c                    t          | d          r|                     |          S t          | d          r&|                     |          }t          |dd           S d S )N	get_valuer   r{   )hasattrrw  r   r*  )r   rf   wrappers      r9   rX  zInvitesService._field_value  s`    6;'' 	)##C(((65!! 	3jjooG7GT222tr8   r   c                   |                      ||          }t          |t                    r|S t          |t                    r(	 |                    d          S # t
          $ r |cY S w xY w|S )Nzutf-8)rX  r   r>   bytesdecodeUnicodeDecodeError)rO   r   rf   r   r{   s        r9   r  zInvitesService._field_str  s     !!&#..eS!! 	LeU## 	||G,,,%   s   A A('A(Optional[int]c                    |                      ||          }t          |t                    rt          |          S t          |t                    r|S d S r   rX  r   boolr   rO   r   rf   r{   s       r9   r  zInvitesService._field_int  sQ    !!&#..eT"" 	u::eS!! 	Ltr8   r  c                    |                      ||          }t          |t                    r|S t          |t                    r|dk    S dS )Nr   Fr  r  s       r9   r  zInvitesService._field_bool  sO    !!&#..eT"" 	LeS!! 	A:ur8   c                L    |                      ||          }t          |          S r   )rX  r    r  s       r9   r  zInvitesService._decode_json  s%    !!&#.. '''r8   Optional[EventTime]c                   |                      |t          j        j                  }t	          |t
                    sd S |                    d          }t	          |t          t          f          sd S 	 t          j
        |dz  t          j                  }n# t          t          t          f$ r Y d S w xY wd }|                    d          }t	          |t          t          f          rD	 t          j
        |dz  t          j                  }n# t          t          t          f$ r d }Y nw xY wt!          ||t#          |                    dd                    t#          |                    dd                              S )	NstartSince1970g     @@)tzendSince1970isAllDayFisOpenEnded)startend
is_all_dayis_open_ended)r  r!   TIMEr{   r   r
   r   r   floatr   fromtimestampr   utcOSErrorrC  OverflowErrorr*   r  )rO   r   blobstart_msr  r  end_mss          r9   r  zInvitesService._decode_time
  sv     ):)?)EFF$(( 	488,--(S%L11 	4	*8f+<NNNEE]3 	 	 	44	"&.))fsEl++ 	,Vf_NNNZ7   DHHZ7788txxu==>>	
 
 
 	
s$   1#B B0/B0'#D D'&D'Optional[EventPlace]c                   |                      |t          j        j                  }t	          |t
                    sd S t          t	          |                    d          t                    r|                    d          nd t	          |                    d          t                    r|                    d          nd t	          |                    d          t                    r|                    d          nd t	          |                    d          t                    r|                    d          nd t	          |                    d          t          t          f          rt          |d                   nd t	          |                    d          t          t          f          rt          |d                   nd t	          |                    d          t                    r|                    d          nd           S )	Nr   subtitlecitytimeZoneIdentifierlatitude	longitudeurl)r   r  r  time_zone_identifierr  r  r  )r  r!   PLACEr{   r   r
   r'   r   r>   r   r  )rO   r   r  s      r9   r  zInvitesService._decode_place#  s     ):)@)FGG$(( 	4'1$((72C2CS'I'IS$((7###t(2488J3G3G(M(MW$$$SW%/0@0@#%F%FP&!!!D dhh';<<cBB-... dhhz22S%LAAd:&''' dhh{33c5\BBd;'(((#-dhhuoos#C#CM+
 
 
 	
r8   c                   t                               | |          }|d S t          |dd           }t          |t                    r|S t          |t
                    r.|                    d          }t          |t                    r|nd S d S )NdownloadURL)r;   rX  r*  r   r>   r
   r   )r   rf   r{   r  maybes        r9   rO  z"InvitesService._asset_download_url?  s    ++FC88=4e]D11c3 	JeW%% 	=IIm,,E&uc22<55<tr8   )
r=   r>   r?   r   r@   rA   r<   rB   rC   rD   )rC   r   )rC   rU   )re   r>   rC   r&   )rj   r&   rC   rk   )r   r>   rC   r.   )r   r>   rC   r&   )rj   r&   r   r0   r   r   r   r   r   r   r   r   rC   r/   )rj   r&   rC   r>   )rj   r&   r   r>   rC   r   )r   r   r   r>   rC   r/   )rX   r(   rC   r   )r   r   rC   r(   )r   r>   rC   r>   )re   r>   rX   r(   rC   r   )r}   r   rC   r   )rX   r(   rC   r   )re   r>   rX   r(   rC   r   )
rd   r   rX   r(   r   r   r~   r   rC   r&   )rd   r   rC   r)   )r#  r   rC   r,   )r{   r   rC   r-   )r{   r   rC   r%   )rd   r   rC   r/   )rd   r   rC   r+   )r   r^  rC   r_  )r   r^  rC   r.   )r   r   rf   r>   rC   r   )r   r   rf   r>   r   r   rC   r   )r   r   rf   r>   rC   r~  )r   r   rf   r>   rC   r  )r   r   rC   r  )r   r   rC   r  )r   r   rf   r>   rC   r   ).r3   r4   r5   r6   r   rL   r   rM   rK   propertyrT   rg   rj   r~   r   r   r   staticmethodr   r   r   rz   r   r]   ry   r|   r\   ri   ra   r   r"  r<  r=  rt   r   r   r   rX  r  r  r  r  r  r  rO  __classcell__)rR   s   @r9   r;   r;   P   s         JD ?C
 
 
 
 
 
 
 
,    X   &
> 
> 
> 
>K K K K8 8 8 8   D #!% \F \F \F \F \F \FD    \    \
 
 
 
( F F F \F " " " \"
    \
 
 
 
 \
 D D D \D& & & & J
 J
 J
 J
j '+"$B
 B
 B
 B
 B
 B
H
 
 
 
$ 
 
 
 \
6 ( ( ( \( , , , \,
 
 
 
:
 
 
 
*    \B
 B
 B
 B
P    \         ( ( ( (
 
 
 
2
 
 
 
8 
 
 
 \
 
 
 
 
r8   r;   )>r6   
__future__r   loggingr   r   typingr   r   r   r	   r
   r   pyicloud.common.cloudkitr   r   r   r   r   r   r   pyicloud.common.cloudkit.baser   pyicloud.services.baser   
_constantsr   r   r   r   r   clientr   r   r   r   codecsr   r    models.constantsr!   r"   r#   r$   
models.dtor%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   	getLoggerr3   r   r2   r;   r7   r8   r9   <module>r     s   & # " " " " "  ' ' ' ' ' ' ' ' ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?                  < ; ; ; ; ; . . . . . .                         ; : : : : : : :                                       
	8	$	$H H H H HL H H Hz z z z z[ z z z z zr8   