
    w                        d Z ddl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
mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ 	 	 	 	 dDdededede	e   de	e   de	e   de	e   de	e   de	e   deeef   fdZ	 	 	 	 dDdededede	e   de	e   de	e   de	e   de	e   de	e   deeef   fdZ	 dEdddddede	e   de	e   defdZd Zd Z	 	 dFd Zd!efd"Z	 	 	 	 	 	 dGdddddededede	e   de	e   de	e   de	e   d#e	eeef      d$e	e
e      de	e   deeeef   ef   fd%Z	 	 	 	 	 	 dGdede	e   de	e   de	e   de	e   d#e	eeef      d$e	e
e      de	e   fd&Z ded'ed(ede	e   deeef   f
d)Z!d* Z"d+ Z#dEd,Z$d- Z%d. Z&d/ Z'd0 Z(d1 Z)d2 ed3d4e	e   fde	e   fg      fd5Z*d6 Z+d7 Z,d8ed9ed:ed;edeeef   f
d<Z-d=ej\                  dej^                  j`                  deeef   fd>Z1d=ej\                  dej^                  j`                  dededdf
d?Z2d=ej\                  dej^                  j`                  ddfd@Z3d=ej\                  dej^                  j`                  ddfdAZ4dBej\                  dej^                  jj                  ddfdCZ6y
)Hz,The BigQuery CLI reservation client library.    )absolute_import)division)print_function)AnyDict
NamedTupleOptionalSetTuple)	discovery)utils)bq_error)bq_id_utilsNapi_versionslotsignore_idle_slotstarget_job_concurrencymulti_region_auxiliaryautoscale_max_slots	max_slotsscaling_modereservation_group_namereturnc
                     i }
||
d<   ||
d<   |||
d<   |||
d<   |i |
d<   ||
d   d<   |||
d<   t        j                  ||      rt        j                  d      ||||t        j                  d	      |||
d<   |||
d
<   |	|	|
d<   |
S )a  Return the request body for CreateReservation.

  Arguments:
    api_version: The api version to make the request against.
    slots: Number of slots allocated to this reservation subtree.
    ignore_idle_slots: Specifies whether queries should ignore idle slots from
      other reservations.
    edition: The edition for this reservation.
    target_job_concurrency: Job concurrency target.
    multi_region_auxiliary: Whether this reservation is for the auxiliary
      region.
    autoscale_max_slots: Number of slots to be scaled when needed.
    max_slots: The overall max slots for the reservation.
    scaling_mode: The scaling mode for the reservation.
    reservation_group_name: The reservation group name which the reservation
      belongs to.

  Returns:
    Reservation object that was created.

  Raises:
    bq_error.BigqueryError: if requirements for parameters are not met.
  slot_capacityr   r   concurrency	autoscaler   editionAmax_slots and autoscale_max_slots cannot be set at the same time.z8max_slots and scaling_mode must be set at the same time.r   reservation_group)frontend_utilsValidateAtMostOneSelectedr   BigqueryError)r   r   r   r   r   r   r   r   r   r   reservations              )platform/bq/clients/client_reservation.pyGetBodyForCreateReservationr&      s    F +!&+o%6+!"',BK()'!7K$!K,?K[)$K	--i9LM

 
 K   4L4

 
 B  (K".K''=K#$	    c                    t        ||||||||	|
|
      }d|j                  d|j                  }| j                         j	                         j                         j                  |||j                        j                         S )a  Create a reservation with the given reservation reference.

  Arguments:
    client: The client used to make the request.
    api_version: The api version to make the request against.
    reference: Reservation to create.
    slots: Number of slots allocated to this reservation subtree.
    ignore_idle_slots: Specifies whether queries should ignore idle slots from
      other reservations.
    edition: The edition for this reservation.
    target_job_concurrency: Job concurrency target.
    multi_region_auxiliary: Whether this reservation is for the auxiliary
      region.
    autoscale_max_slots: Number of slots to be scaled when needed.
    max_slots: The overall max slots for the reservation.
    scaling_mode: The scaling mode for the reservation.
    reservation_group_name: The reservation group name which the reservation
      belongs to.

  Returns:
    Reservation object that was created.

  Raises:
    bq_error.BigqueryError: if autoscale_max_slots is used with other
      version.
  	projects//locations/)parentbodyreservationId)	r&   	projectIdlocationprojects	locationsreservationscreater-   execute)clientr   	referencer   r   r   r   r   r   r   r   r   r$   r+   s                 r%   CreateReservationr7   [   s    P ,+ &
 ooy{|~vk9P9P   wyr'   r5   .r6   	page_size
page_tokenr    c                 v   d|j                   d|j                  }|P| j                         j                         j	                         j                  |||d|z        j                         S | j                         j                         j	                         j                  |||      j                         S )a  List reservations in the project and location for the given reference.

  Arguments:
    client: The client used to make the request.
    reference: Reservation reference containing project and location.
    page_size: Number of results to show.
    page_token: Token to retrieve the next page of results.
    reservation_group: When specified, only list reservations in the given
      reservation group.

  Returns:
    Reservation object that was created.
  r)   r*   zreservation_group=%s)r+   pageSize	pageTokenfilterr+   r;   r<   )r.   r/   r0   r1   r2   listr4   )r5   r6   r8   r9   r    r+   s         r%   ListReservationsr@      s    * & "			 ),==	 
 

 
 ooy{|~t6ItDwyr'   c                     d|j                   d|j                  d}| j                         j                         j	                  |      j                         }|S )a  List BI reservations in the project and location for the given reference.

  Arguments:
    client: The client used to make the request.
    reference: Reservation reference containing project and location.

  Returns:
    List of BI reservations in the given project/location.
  r)   r*   z/biReservationname)r.   r/   r0   r1   getBiReservationr4   )r5   r6   r+   responses       r%   ListBiReservationsrF      sU     &
 oo!!#44&4AIIK  
/r'   c                     | j                         j                         j                         j                  |j	                               j                         S )zGets a reservation with the given reservation reference.

  Arguments:
    client: The client used to make the request.
    reference: Reservation to get.

  Returns:
    Reservation object corresponding to the given id.
  rB   )r0   r1   r2   getpathr4   r5   r6   s     r%   GetReservationrK      s;     ooy{|~
s	 s!wyr'   c                     | j                         j                         j                         j                  |j	                               j                          y)zDeletes a reservation with the given reservation reference.

  Arguments:
    client: The client used to make the request.
    reference: Reservation to delete.
  rB   N)r0   r1   r2   deleterI   r4   rJ   s     r%   DeleteReservationrN      sA     	//,,.55>> 6 GIr'   reservation_sizec                    |j                         j                  d      r|dd j                         r|dd }nV|j                         j                  d      r|dd j                         r|dd }n|j                         r|}nt        d      t	        |      dz  dz  dz  }i }d}||d	<   |d
z  }| j                         j                         j                  |j                         ||      j                         S )a  Updates a BI reservation with the given reservation reference.

  Arguments:
    client: The client used to make the request.
    reference: Reservation to update.
    reservation_size: size of reservation in GBs. It may only contain digits,
      optionally followed by 'G', 'g', 'GB, 'gb', 'gB', or 'Gb'.

  Returns:
    Reservation object that was updated.
  Raises:
    ValueError: if reservation_size is malformed.
  GBNGzInvalid reservation size. The unit for BI reservations
    is GB. The specified reservation size may only contain digits, optionally
    followed by G, g, GB, gb, gB, or Gb.i    sizezsize,rC   
updateMaskr,   )
upperendswithisdigit
ValueErrorintr0   r1   updateBiReservationrI   r4   )r5   r6   rO   reservation_digitsbi_reservationupdate_masks         r%   UpdateBiReservationrb     s     ''-
3B

'
'
))#2.'',1A#21F1N1N1P)#2.!)
 , - - +,t3d:TA.++.+ooy{~~Kn   wyr'   labels_to_setlabel_keys_to_removec                 <   i }d}|
||d<   |dz  }|
||d<   |dz  }|
||d<   |dz  }||dk7  ri |d	<   ||d	   d
<   |dz  }n|dz  }|
|	#t        | |      }d|v r	|d   |d<   ni |d<   |dz  }|
|
D ]  }||d   v s|d   |=  |	 |	j                         D ]  \  }}||d   |<    t        j                  ||      rt	        j
                  d      |!||dk7  r|dk7  rt	        j
                  d      |
||d
<   |dz  }|
||d<   |dz  }|
||d<   |dz  }||fS )a  Return the request body and update mask for UpdateReservation.

  Arguments:
    api_version: The api version to make the request against.
    slots: Number of slots allocated to this reservation subtree.
    ignore_idle_slots: Specifies whether queries should ignore idle slots from
      other reservations.
    target_job_concurrency: Job concurrency target.
    autoscale_max_slots: Number of slots to be scaled when needed.
    max_slots: The overall max slots for the reservation.
    scaling_mode: The scaling mode for the reservation.
    reservation_group_name: The reservation group name that the reservation
      belongs to.

  Returns:
    Reservation object that was updated.

  Raises:
    bq_error.BigqueryError: if parameters are incompatible.
  rU   r   zslot_capacity,r   zignore_idle_slots,r   zconcurrency,r   r   r   zautoscale.max_slots,z
autoscale,labelszlabels,r   SCALING_MODE_UNSPECIFIEDzDscaling_mode and autoscale_max_slots cannot be set at the same time.z
max_slots,r   zscaling_mode,r    zreservation_group,)rK   itemsr!   &ValidateAtMostOneSelectedAllowsDefaultr   r#   )r5   r6   r   r   r   r   r   r   r   rc   rd   r   r$   ra   lookup_reservationkeyvalues                    r%   GetParamsForUpdateReservationrm   3  s   D ++
#(K ##K"'8K#$''K'!7K>!K$a!#k+.Ak+{+++k \!k%)B'	:%%0:k( k(9K%#	H%	%!#& $ #))+
U#(k(C  , ::$ 
 
 K  #6#B005HA5M

 
 N  (K<K".K?"K''=K#$''K	k	!!r'   c                     t        | |||||||||	|
|      \  }}| j                         j                         j                         j	                  |j                         ||      j                         S )ah  Updates a reservation with the given reservation reference.

  Arguments:
    client: The client used to make the request.
    api_version: The api version to make the request against.
    reference: Reservation to update.
    slots: Number of slots allocated to this reservation subtree.
    ignore_idle_slots: Specifies whether queries should ignore idle slots from
      other reservations.
    target_job_concurrency: Job concurrency target.
    autoscale_max_slots: Number of slots to be scaled when needed.
    max_slots: The overall max slots for the reservation.
    scaling_mode: The scaling mode for the reservation.
    reservation_group_name: The reservation group name that the reservation
      belongs to.

  Returns:
    Reservation object that was updated.

  Raises:
    bq_error.BigqueryError: if autoscale_max_slots is used with other
      version.
  rW   )rm   r0   r1   r2   patchrI   r4   )r5   r   r6   r   r   r   r   r   r   rc   rd   r   r$   ra   s                 r%   UpdateReservationrp     su    J ;+{ ooy{|~u).."{uMwyr'   planrenewal_planc                 f   i }||d<   ||d<   ||d<   |||d<   |||d<   d|j                   d|j                  }d}	|j                  r|j                  d	k7  r|j                  }	| j                         j	                         j                         j                  |||	
      }
|
j                         S )a  Create a capacity commitment.

  Arguments:
    client: The client used to make the request.
    reference: Project to create a capacity commitment within.
    edition: The edition for this capacity commitment.
    slots: Number of slots in this commitment.
    plan: Commitment plan for this capacity commitment.
    renewal_plan: Renewal plan for this capacity commitment.
    multi_region_auxiliary: Whether this commitment is for the auxiliary region.

  Returns:
    Capacity commitment object that was created.
  
slot_countrq   rr   Nr   r   r)   r*    )r+   r,   capacityCommitmentId)r.   r/   rv   r0   r1   capacityCommitmentsr3   r4   )r5   r6   r   r   rq   rr   r   capacity_commitmentr+   capacity_commitment_idrequests              r%   CreateCapacityCommitmentr{     s    . &+l# $f(4n%'4J01%,	"&  ##	(F(F#(M&;;ooy{v"5  	 
 
	r'   c                     d|j                   d|j                  }| j                         j                         j	                         j                  |||      j                         S )aM  Lists capacity commitments for given project and location.

  Arguments:
    client: The client used to make the request.
    reference: Reference to the project and location.
    page_size: Number of results to show.
    page_token: Token to retrieve the next page of results.

  Returns:
    list of CapacityCommitments objects.
  r)   r*   r>   )r.   r/   r0   r1   rw   r?   r4   )r5   r6   r8   r9   r+   s        r%   ListCapacityCommitmentsr}     sU     &
 ooy{t6ItDwyr'   c                     | j                         j                         j                         j                  |j	                               j                         S )zGets a capacity commitment with the given capacity commitment reference.

  Arguments:
    client: The client used to make the request.
    reference: Capacity commitment to get.

  Returns:
    Capacity commitment object corresponding to the given id.
  rB   )r0   r1   rw   rH   rI   r4   rJ   s     r%   GetCapacityCommitmentr   )  s=     ooy{
s	 s!wyr'   c                     | j                         j                         j                         j                  |j	                         |      j                          y)a  Deletes a capacity commitment with the given capacity commitment reference.

  Arguments:
    client: The client used to make the request.
    reference: Capacity commitment to delete.
    force: Force delete capacity commitment, ignoring commitment end time.
  )rC   forceN)r0   r1   rw   rM   rI   r4   )r5   r6   r   s      r%   DeleteCapacityCommitmentr   <  sC     	//335<<>>5 = GIr'   c                 n   ||t        j                  d      i }g }|||d<   |j                  d       |||d<   |j                  d       | j                         j	                         j                         j                  |j                         dj                  |      |      j                         S )a  Updates a capacity commitment with the given reference.

  Arguments:
    client: The client used to make the request.
    reference: Capacity commitment to update.
    plan: Commitment plan for this capacity commitment.
    renewal_plan: Renewal plan for this capacity commitment.

  Returns:
    Capacity commitment object that was updated.

  Raises:
    bq_error.BigqueryError: if capacity commitment cannot be updated.
  z$Please specify fields to be updated.rq   rr   ,rW   )
r   r#   appendr0   r1   rw   ro   rI   joinr4   )r5   r6   rq   rr   rx   ra   s         r%   UpdateCapacityCommitmentr   I  s     
\l*

 
 !G
HH+	"&v*6'~& ooy{u~~XXk*"  
 wy
r'   c                 8   |t        j                  d      d|i}| j                         j                         j	                         j                  |j                         |      j                         }d|vsd|vrt        j                  d      |d   |d   gS )a  Splits a capacity commitment with the given reference into two.

  Arguments:
    client: The client used to make the request.
    reference: Capacity commitment to split.
    slots: Number of slots in the first capacity commitment after the split.

  Returns:
    List of capacity commitment objects after the split.

  Raises:
    bq_error.BigqueryError: if capacity commitment cannot be updated.
  z#Please specify slots for the split.	slotCountrC   r,   firstsecondzinternal error)r   r#   r0   r1   rw   splitrI   r4   )r5   r6   r   r,   rE   s        r%   SplitCapacityCommitmentr   p  s    $ ]

 
 !F
GG
u	$ooy{u).."u.wy  H 8

 
 !1
22
7
Xh/	00r'   c                 V   |st        j                  d      |st        j                  d      |t        |      dk  rt        j                  d      d|d|}d|i}| j                         j	                         j                         j                  ||      j                         S )	a  Merges capacity commitments into one.

  Arguments:
    client: The client used to make the request.
    project_id: The project ID of the resources to update.
    location: Capacity commitments location.
    capacity_commitment_ids: List of capacity commitment ids.

  Returns:
    Merged capacity commitment.

  Raises:
    bq_error.BigqueryError: if capacity commitment cannot be merged.
  zproject id must be specified.zlocation must be specified.   z2at least 2 capacity commitments must be specified.r)   r*   capacityCommitmentIdsr+   r,   )r   r#   lenr0   r1   rw   merger4   )r5   
project_idr/   capacity_commitment_idsr+   r,   s         r%   MergeCapacityCommitmentsr     s    " 


 
 !@
AA	

 
 !>
??$,C(Dq(H

 
 <  )I *4X>&
!#:	;$ooy{uFu&wyr'   c                    i }|st        j                  d      ||d<   |r||d<   |st        j                  d      |st        j                  d      |j                         d||d<   | j                         j	                         j                         j                         j                  |j                         |      j                         S )	a  Creates a reservation assignment for a given project/folder/organization.

  Arguments:
    client: The client used to make the request.
    reference: Reference to the project reservation is assigned. Location must
      be the same location as the reservation.
    job_type: Type of jobs for this assignment.
    priority: Default job priority for this assignment.
    assignee_type: Type of assignees for the reservation assignment.
    assignee_id: Project/folder/organization ID, to which the reservation is
      assigned.

  Returns:
    ReservationAssignment object that was created.

  Raises:
    bq_error.BigqueryError: if assignment cannot be created.
  job_type not specified.job_typepriorityassignee_type not specified.assignee_id not specified.s/assigneer   )
r   r#   lowerr0   r1   r2   assignmentsr3   rI   r4   )r5   r6   r   r   assignee_typeassignee_idreservation_assignments          r%   CreateReservationAssignmentr     s    * 	

 
 !:
;;'/$)1:&	

 
 !?
@@	

 
 !=
>> ($
 ooy{|~{}vY^^%,BvCwyr'   c                     | j                         j                         j                         j                         j	                  |j                               j                          y)zDeletes given reservation assignment.

  Arguments:
    client: The client used to make the request.
    reference: Reference to the reservation assignment.
  rB   N)r0   r1   r2   r   rM   rI   r4   rJ   s     r%   DeleteReservationAssignmentr     sK     	//,,.::<CC>> D GIr'   id_fallbacksIDSr   c                 &   t        j                  |||d      }d|j                         i}| j                         j	                         j                         j                         j                  |j                         |      j                         S )z=Moves given reservation assignment under another reservation.F)r   
identifierdefault_locationcheck_reservation_projectdestinationIdr   )	bq_client_utilsGetReservationReferencerI   r0   r1   r2   r   mover4   )r5   r   r6   destination_reservation_idr   !destination_reservation_referencer,   s          r%   MoveReservationAssignmentr     sy     '6&M&M+' %	'# <AAC	D$ ooy{|~{}t!t-wyr'   c                     i }d}||sd}||d<   |dz  }| j                         j                         j                         j                         j	                  |j                         ||      j                         S )aY  Updates reservation assignment.

  Arguments:
    client: The client used to make the request.
    reference: Reference to the reservation assignment.
    priority: Default job priority for this assignment.

  Returns:
    Reservation assignment object that was updated.

  Raises:
    bq_error.BigqueryError: if assignment cannot be updated.
  rU   JOB_PRIORITY_UNSPECIFIEDr   z	priority,rW   )r0   r1   r2   r   ro   rI   r4   )r5   r6   r   r   ra   s        r%   UpdateReservationAssignmentr     s     ++h)1:&;K ooy{|~{}u~~ %  
 wyr'   c                     | j                         j                         j                         j                         j	                  |j                         ||      j                         S )aY  Lists reservation assignments for given project and location.

  Arguments:
    client: The client used to make the request.
    reference: Reservation reference for the parent.
    page_size: Number of results to show.
    page_token: Token to retrieve the next page of results.

  Returns:
    ReservationAssignment object that was created.
  r>   )r0   r1   r2   r   r?   rI   r4   )r5   r6   r8   r9   s       r%   ListReservationAssignmentsr   4  sF     ooy{|~{}t9>>#i:tNwyr'   r/   r   r   r   c                    |st        j                  d      |st        j                  d      |st        j                  d      |st        j                  d      |j                         d|}d|z  }d|z  }| j                         j	                         j                  ||      j                         }d	|v r|d	   D ]  }	|	d
   |k(  s|	c S  t        j                  d      )a  Searches reservations assignments for given assignee.

  Arguments:
    client: The client used to make the request.
    location: location of interest.
    job_type: type of job to be queried.
    assignee_type: Type of assignees for the reservation assignment.
    assignee_id: Project/folder/organization ID, to which the reservation is
      assigned.

  Returns:
    ReservationAssignment object if it exists.

  Raises:
    bq_error.BigqueryError: If required parameters are not passed in or
      reservation assignment not found.
  zlocation not specified.r   r   r   r   zassignee=%szprojects/-/locations/%s)r+   queryr   jobTypez Reservation assignment not found)r   r#   r   r0   r1   searchAllAssignmentsr4   )
r5   r/   r   r   r   r   r   r+   rE   
assignments
             r%   SearchAllReservationAssignmentsr   L  s    ( 


 
 !:
;;	

 
 !:
;;	

 
 !?
@@	

 
 !=
>> ',,.<(
(
"%$x/& ooy{67wy	  h}-
	I	(	* . 	ABBr'   reservation_group_clientc                     d|j                   d|j                  }i }| j                         j                         j	                         j                  |||j                        j                         S )aQ  Creates a reservation group with the given reservation group reference.

  Arguments:
    reservation_group_client: The client used to make the request.
    reference: Reservation group to create.

  Returns:
    Reservation group object that was created.

  Raises:
    bq_error.BigqueryError: if reservation group cannot be created.
  r)   r*   )r+   r,   reservationGroupId)r.   r/   r0   r1   reservationGroupsr3   r   r4   )r   r6   r+   r    s       r%   CreateReservationGroupr   {  sm    $ & '')y{v &99  
 wy
r'   c                     d|j                   d|j                  }| j                         j                         j	                         j                  |||      j                         S )a  Lists reservation groups in the project and location for the given reference.

  Arguments:
    reservation_group_client: The client used to make the request.
    reference: Reservation group reference containing project and location.
    page_size: Number of results to show.
    page_token: Token to retrieve the next page of results.

  Returns:
    Reservation group object that was created.
  r)   r*   r>   )r.   r/   r0   r1   r   r?   r4   )r   r6   r8   r9   r+   s        r%   ListReservationGroupsr     sW    $ &
 '')y{t6ItDwyr'   c                     | j                         j                         j                         j                  |j	                               j                         S )a	  Gets a reservation group with the given reservation group reference.

  Arguments:
    reservation_group_client: The client used to make the request.
    reference: Reservation group to get.

  Returns:
    Reservation group object corresponding to the given id.
  rB   )r0   r1   r   rH   rI   r4   r   r6   s     r%   GetReservationGroupr     s?     '')y{
s	 s!wyr'   c                     | j                         j                         j                         j                  |j	                               j                          y)zDeletes a reservation group with the given reservation group reference.

  Arguments:
    reservation_group_client: The client used to make the request.
    reference: Reservation group to delete.
  rB   N)r0   r1   r   rM   rI   r4   r   s     r%   DeleteReservationGroupr     sD     ##%//1CCELL>> M GIr'   	apiclientc                    t        j                  |t         j                  j                  d       | j	                         j                         j                         j                  |j                               j                         S )aZ  Gets IAM policy for the given reservation resource.

  Arguments:
    apiclient: the apiclient used to make the request.
    reference: the ReservationReference for the reservation resource.

  Returns:
    The IAM policy attached to the given reservation resource.

  Raises:
    BigqueryTypeError: if reference is not a ReservationReference.
  GetReservationIAMPolicy)method)resource)
r   	typecheckApiClientHelperReservationReferencer0   r1   r2   getIamPolicyrI   r4   )r   r6   s     r%   r   r     sb      !!66& y{|~|Y^^-|.wyr'   )NNNN)N)r6   .)NNNNNN)7__doc__
__future__r   r   r   typingr   r   r   r	   r
   r   googleapiclientr   clientsr   r   frontendr!   r   r   strr]   boolr&   r7   r@   rF   rK   rN   rb   rm   rp   r{   r}   r   r   r   r   r   r   r   r   r   r   r   Resourcer   ReservationGroupReferencer   r   r   r   r   r    r'   r%   <module>r      sE   2 &  % > > % , ,   *.#"&,0FFF F
 %SMF %TNF "#F }F 3-F %SMF 
#s(^Fd *.#"&,0@@ 	@
 @ %SM@ %TN@ "#@ }@ 3-@ %SM@ 
#s(^@P (,+++ + 	+
  }+ 	+\(&,S ,p *.#"&.2/3,0k"k"k" k" 	k"
 k" %SMk" "#k" }k" 3-k" DcN+k" #3s8,k" %SMk" 4S>3k"j *.#"&.2/3,099 %SM9 "#9 }9 3-9 DcN+9 #3s8,9 %SM9x0 	0
 0 0 %TN0 
#s(^0f2&
$N1B!H,^	8C=)HSM*	
@!H0,C,C%(,C9<,CKN,C	#s(^,C^ '00 **DD  
#s(^ F'00**DD  	
 	<'00**DD 	,'00**DD 	"!!**?? 	r'   