
    vd(m                         d Z ddlZddl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 ddlmZ ddlmZmZ dd	lmZ  G d
 de          ZdS )z,Implements the MySQL Client/Server protocol
    N)Decimal   )	FieldFlag	ServerCmd	FieldType
ClientFlagMAX_MYSQL_TABLE_COLUMNS)errorsutils)get_auth_plugin)PY2struct_unpack)get_exceptionc                       e Zd ZdZd Zd Z	 	 	 	 d'd	Z	 	 d(d
Zd)dZ	 	 	 d*dZ	d Z
d Zd Zd+dZd Zd,dZd-dZd Zd Zd Zd Zd Zd-dZd Zd Zd Zd  Zd! Z	 	 d.d$Zd% Zd& ZdS )/MySQLProtocolzRImplements MySQL client/server protocol

    Create and parses MySQL packets.
    c                 X    |t           j        z  r|r|                    d          dz   S dS )z.Prepare database string for handshake responseutf8    )r   CONNECT_WITH_DBencode)selfclient_flagsdatabases      T/var/www/html/t/fyr/venv311/lib/python3.11/site-packages/mysql/connector/protocol.py_connect_with_dbzMySQLProtocol._connect_with_db-   s5    *44 	5 	5??6**W44w    c                    |sdS 	  t          |          |||||          }|                                }	nR# t          t          j        f$ r9}
t          j        d                    t          |
                              d}
~
ww xY w|t          j	        z  r(t          |	          }t          j        d|          |	z   }n|	dz   }|S )z#Prepare the authentication responser   )usernamepasswordr   ssl_enabledzFailed authentication: {0}Nz<B)r   auth_response	TypeErrorr
   InterfaceErrorProgrammingErrorformatstrr   SECURE_CONNECTIONlenstructpack)r   r   r   r   r   auth_plugin	auth_datar    authplugin_auth_responseexcresplenr!   s                r   _auth_responsezMySQLProtocol._auth_response3   s      	7	?/?;//!Hx') ) )D $(#5#5#7#7  601 	? 	? 	?),33CHH==? ? ?	? *66 	;.//G"Kg669MMMM07:Ms   18 B4BBN!   r      @Fc
           
      >   	 |d         }
|	p|d         }	n@# t           t          f$ r,}t          j        d                    |                    d}~ww xY w|sd}	 |                    d          }n# t          $ r |}Y nw xY wt          j        d                    dt          |          	          ||||          }|| 
                    |||||	|
|          z  }||                     ||          z  }|t          j        z  r||	                    d          d
z   z  }|S )z"Make a MySQL Authentication packetr,   r+   *Handshake misses authentication info ({0})Nr   r   z<IIB{filler}{usrlen}sxxxxxxxxxxxxxxxxxxxxxxxx)fillerusrlenr   )r"   KeyErrorr
   r$   r%   r   AttributeErrorr)   r*   r(   r1   r   r   PLUGIN_AUTH)r   	handshaker   r   r   charsetr   max_allowed_packetr    r+   r,   r/   username_bytespackets                 r   	make_authzMySQLProtocol.make_authJ   s   	J!+.I%A=)AKK8$ 	J 	J 	J)<CCCHHJ J J	J  	H	&%__V44NN 	& 	& 	&%NNN	& 5<<C$7$7 = 9 9)+=w+- -
 	$%%lHh&.&1&/> > 	>
 	$''h???*00 	;k((007::F&    A'AAA0 0A?>A?c                     t          j        |          t          j        |          z   t          j        |          z   dz   S )z Make a SSL authentication packets                          )r   	int4store	int1store)r   r=   r   r>   s       r   make_auth_sslzMySQLProtocol.make_auth_sslo   sE     |,,1223w''(  	r   c                 <    t          j        |          }|||z  }|S )z(Make a MySQL packet containing a command)r   rE   )r   commandargumentdatas       r   make_commandzMySQLProtocol.make_commandw   s&    w''HDr   c	           
      |   	 |d         }	|p|d         }n@# t           t          f$ r,}
t          j        d                    |
                    d}
~
ww xY w|sd}	 |                    d          }n# t          $ r |}Y nw xY wt          j        d                    t          |                    t          j        |          }||                     ||||||	|          z  }||                     ||          z  }|t          j        d	|          z  }|t          j        z  r||                    d          d
z   z  }|S )z0Make a MySQL packet with the Change User commandr,   r+   r5   Nr   r   z<B{usrlen}sx)r8   z<Hr   )r"   r9   r
   r$   r%   r   r:   r)   r*   r(   r   CHANGE_USERr1   r   r   r;   )r   r<   r   r   r   r=   r   r    r+   r,   r/   r?   r@   s                r   make_change_userzMySQLProtocol.make_change_user~   s   
	J!+.I%A=)AKK8$ 	J 	J 	J)<CCCHHJ J J	J  	H	&%__V44NN 	& 	& 	&%NNN	& ^22#n:M:M2NN&2ND D 	$%%lHh&.&1&/> > 	>
 	$''h???&+dG,,,*00 	;k((007::FrB   c           	         i }t          d|dd                   d         |d<   t          j        |dd         d          \  }|d<   t          d	|dd
                   \  |d<   }}|d<   |d<   }}|d                                         |d<   |d
d         }t          j        ||z             }d}|t
          j        z  rA|rt          d|dz
            nd}	|d|	         }||	d         }|d         dk    r
|dd         }|t
          j        z  rcd|vr$|d         	                    d          r	d|c}|d<   nt          j        |d          \  }|d<   |d                             d          |d<   nd|d<   ||z   |d<   ||d<   |S )zParse a MySQL Handshake-packet<xxxxBr      protocolNr   endserver_version_originalz<I8sx2sBH2sBxxxxxxxxxx   server_threadidr=   server_statusr         z5.5.8r+   utf-8mysql_native_passwordr,   capabilities)
r   r   read_stringdecodeintreadr   r'   minr;   
startswith)
r   r@   res
auth_data1capabilities1capabilities2auth_data_lengthr^   
auth_data2sizes
             r   parse_handshakezMySQLProtocol.parse_handshake   s   '&1+>>qAJ383D122JG4% 4% 4%0./ 2F1R4LAA	
				Y	_			),-F)G)N)N)P)P%&}]]%BCC
*66 	-4DL3r+a/000"D$JDEE]F"~""'_
*00 
	9v%%56AA'JJ & 14V,]++/4/@0) 0) 0),]+!$]!3!:!:7!C!CC!8C%
2K*N
r   c                    |d         dk    st          j        d          i }	 t          d|dd                   d         |d<   t          j        |dd                   \  }|d<   t          j        |          \  }|d	<   t          d
|dd                   \  |d<   |d<   |dd         }|r8t          j        |          \  }|d<   |d                             d          |d<   n"# t          $ r t          j        d          w xY w|S )zParse a MySQL OK-packet   r   z#Failed parsing OK packet (invalid).rP   rQ   field_countNaffected_rows	insert_idz<HHstatus_flagwarning_countinfo_msgr\   zFailed parsing OK packet.)r
   r#   r   r   read_lc_intread_lc_stringr`   
ValueError)r   r@   	ok_packets      r   parse_okzMySQLProtocol.parse_ok   s7   ayA~~'(MNNN		E'4Xvac{'K'KA'NIm$383DVABBZ3P3P0VY//4/@/H/H,VY{++8qs+L+L)Y}%'ABBZF N272Fv2N2N/:.(1*(=(D(DW(M(M	*% 	E 	E 	E'(CDDD	Es   CC' 'Dc                     	 t          j        |dd                   d         }|t          k    rdS |S # t          j        t
          f$ r t          j        d          w xY w)z=Parse a MySQL packet with the number of columns in result setrm   Nr   zFailed parsing column count)r   rt   r	   r)   errorrv   r
   r#   )r   r@   counts      r   parse_column_countz MySQLProtocol.parse_column_count   ss    	G%fQRRj11!4E...tLj) 	G 	G 	G'(EFFF	Gs   -3 3 +Ar\   c                    t          j        |dd                   \  }}t          j        |          \  }}t          j        |          \  }}t          j        |          \  }}t          j        |          \  }}t          j        |          \  }}	 t          d|          \  }}}}}n'# t          j        $ r t          j        d          w xY w|                    |          |dddd| t          j	        z  |fS )zParse a MySQL column-packetrm   Nz	<xHIBHBxxz!Failed parsing column information)
r   ru   r   r)   rz   r
   r#   r`   r   NOT_NULL)r   r@   r=   _name
field_typeflagss          r   parse_columnzMySQLProtocol.parse_column   s   *6!"":66*622*622*622-f55*622	M&{F;;Q:AA| 	M 	M 	M'(KLLL	M KK  FY''	
 		
s   B+ +$Cc                 T   |d         dk    r|                      |          S d}i }	 t          d|          }n'# t          j        $ r t	          j        |          w xY w|d         dk    rt          |          dk    st	          j        |          |d         |d	<   |d
         |d<   |S )zParse a MySQL EOF-packetrm   r   zFailed parsing EOF packet.z<xxxBBHHr      	      rr      rq   )rx   r   r)   rz   r
   r#   r(   )r   r@   err_msgrd   unpackeds        r   	parse_eofzMySQLProtocol.parse_eof  s    !9>>==(((.	1$Z88HH| 	1 	1 	1'000	1 s""s6{{a'7'7'000'{O%a[M
s	   8 $ATc           
         d}i }|r|dd                              d          }n|                     d          }|D ]}	 d |                     dd          D             \  }}n#  t          j        |          xY w|                    d          }	 t	          |          ||<   i#  	 t          |                    d                    ||<   n.#  t          j        d	                    |||                    xY wY xY w|S )
zParse the statistics packetz)Failed getting COM_STATISTICS informationrm   Ns     c                 6    g | ]}|                                 S  )strip).0vs     r   
<listcomp>z2MySQLProtocol.parse_statistics.<locals>.<listcomp>%  s     EEEAaggiiEEEr      :r   r\   z{0} ({1}:{2}).)splitr
   r#   r`   intr   r%   )	r   r@   with_headererrmsgrd   pairspairlblvals	            r   parse_statisticszMySQLProtocol.parse_statistics  s7   < 	.122J$$[11EELL--E 	C 	CD4EED!1D1DEEE
cc4+F333 **W%%CCs88CCC&szz'':':;;CHHC /(//SAAC C C H 
s/   #A##A9B%%C>(%CC>+C99C>r   c                    g }d}d}d}|dk    }	 |s||k    rn|                                 }	|	                    d          r|	dd         g}
|                                 }	|	                    d          rF|
                    |	dd                    |                                 }	|	                    d          F|
                    |	dd                    t          j        t          d                              |
                    }n|	d         dk    r$|	d         d	k     r|                     |	          }d}nP|r0|	d         dk    r$|	d         d
k    r|                     |	          }d}nd}t          j        |	dd                   }|||                    |           n||t          |	          |dz  }||fS )zRead MySQL text result

        Reads all or given number of rows from the socket.

        Returns a tuple with 2 elements: a list with all rows and
        the EOF packet.
        Nr   )rQ      rQ   Ts   rm   r   r   r   r   r   )
recvrc   appendr   read_lc_string_list	bytearrayjoinr   rx   r   )r   sockversionr{   rowseofrowdataieof57r@   datass              r   read_text_resultzMySQLProtocol.read_text_result5  s    9$	 a5jjYY[[F  11 @''88 )LL,,,!YY[[F ''88 ) VABBZ(((3IcNN4G4G4N4NOO)s""vay1}}nnV,, @F1INNvay1}}mmF++3F122J??{w2G$$$$#F+++FA5	6 Syr   c                    |d         t           j        k    rd}d}nZ|d         t           j        k    rd}d}n?|d         t           j        t           j        fv rd}d}n|d         t           j        k    rd}d}|d	         t          j        z  r|                                }||d
         t          ||d|                   d         fS )z%Parse an integer from a binary packetr   bhr   r   rm   qrZ   r   Nr   )
r   TINYSHORTINT24LONGLONGLONGr   UNSIGNEDupperr   )r   r@   fieldformat_lengths        r   _parse_binary_integerz#MySQLProtocol._parse_binary_integer_  s    8y~%%GFF1X((GFF1X)/9>:::GFF1X+++GF8i(( 	&mmooGvwwwqx8H!I!I!!LMMr   c                     |d         t           j        k    rd}d}nd}d}||d         t          ||d|                   d         fS )z)Parse a float/double from a binary packetr   rZ   drm   fNr   )r   DOUBLEr   )r   r@   r   r   r   s        r   _parse_binary_floatz!MySQLProtocol._parse_binary_floats  sU    8y'''FGGFGvwwwqx8H!I!I!!LMMr   c           	         |d         }d}|dk    r@t          j        t          d|dd                   d         |d         |d                   }n|dk    r~d}|d	k    r!t          d
|d|dz                      d         }t          j         t          d|dd                   d         |d         |d         |d         |d         |d         |          }||dz   d         |fS )z&Parse a timestamp from a binary packetr   Nrm   Hr   r   )yearmonthdayr      IrZ   rQ      )r   r   r   hourminutesecondmicrosecond)datetimedater   )r   r@   r   r   valuemcss         r   _parse_binary_timestampz%MySQLProtocol._parse_binary_timestamp~  s   Q;;M"3qs44Q7Qi1I  EE q[[C||#C&1*)=>>qA%"3qs44Q7Qi1IAYayay! ! !E vz{{#U++r   c                 J   |d         }|d|dz            }d}|dk    rt          d|dd                   d         }t          d|dd                   d         }|d         dk    r|dz  }t          j        ||d         ||d	         |d         
          }||dz   d         |fS )z'Parse a time value from a binary packetr   r   rZ   r   NrQ   r[   r   r   )dayssecondsmicrosecondsminuteshours)r   r   	timedelta)r   r@   r   r   rJ   r   r   tmps           r   _parse_binary_timez MySQLProtocol._parse_binary_time  s    a
l#A::T!""X..q1CS$qs),,Q/7a<<BJD d)-a.1)-a'+Aw	0 0 0 vz{{#S))r   c                 R   t          |          dz   dz   dz  }d |d|         D             }||d         }g }t          |          D ]\  }}|t          |dz   dz                     d|dz   dz  z  z  r|                    d           C|d         t          j        t          j        t          j        t          j        t          j	        fv r/| 
                    ||          \  }}|                    |           |d         t          j        t          j        fv r0|                     ||          \  }}|                    |           |d         t          j        t          j        t          j        fv r0|                     ||          \  }}|                    |           ^|d         t          j        k    r0|                     ||          \  }}|                    |           t)          j        |          \  }}|                    |           t-          |          S )z(Parse values from a binary result packetr   r   rZ   c                 ,    g | ]}t          |          S r   )r   )r   r   s     r   r   z6MySQLProtocol._parse_binary_values.<locals>.<listcomp>  s    DDD!s1vvDDDr   r   Nr   )r(   	enumerater   r   r   r   r   r   r   r   r   r   FLOATr   DATETIMEDATE	TIMESTAMPr   TIMEr   r   ru   tuple)	r   fieldsr@   null_bitmap_lengthnull_bitmapvaluesposr   r   s	            r   _parse_binary_valuesz"MySQLProtocol._parse_binary_values  s   !&kkAo1a7DDva0B.B'CDDD*++,#F++ 	% 	%JC3Aqy>>*aC!Gq=.@A %d###qinio'o'ni.@B B B #'"<"<VU"K"Ke$$$$qi.	@@@"&":":65"I"Ie$$$$qi0).'13 3 3"&">">vu"M"Me$$$$qY^++"&"9"9&%"H"He$$$$"'"6v">">e$$$$V}}r   c                 ^   g }d}d}d}	 |n||k    rn|                                 }|d         dk    r|                     |          }d}n,|d         dk    r d}|                     ||dd                   }|||                    |           n||t	          |          |dz  }||fS )zwRead MySQL binary protocol result

        Reads all or given number of binary resultset rows from the socket.
        Nr   Trm   r   rQ   r   )r   r   r   r   r   )	r   r   columnsr{   r   r   r   r   r@   s	            r   read_binary_resultz MySQLProtocol.read_binary_result  s    
 	EzzYY[[FayCnnV,,a227F122JGG{v1F#####F+++FA!	" c{r   c                    |d         dk    st          j        d          i }	 t          j        |dd         d          \  }|d<   t          j        |d          \  }|d<   t          j        |d          \  }|d	<   |d
d         }t          j        |d          \  }|d<   n"# t          $ r t          j        d          w xY w|S )z'Parse a MySQL Binary Protocol OK packetrm   r   zFailed parsing Binary OK packetrQ   Nstatement_idr   num_columns
num_paramsr   rr   )r
   r#   r   read_intrv   )r   r@   ok_pkts      r   parse_binary_prepare_okz%MySQLProtocol.parse_binary_prepare_ok  s    ayA~~'(IJJJ	K/4~fQRRj!/L/L,VVN+.3nVQ.G.G+VVM*-2^FA-F-F*VVL)ABBZF05vq0I0I-VVO,, 	K 	K 	K'(IJJJ	K s   A>B# #Cc                    d}d}|dk     rN|dk    rd}t           j        }n|dk    rd}t           j        }ns|dk    rd}t           j        }n^d	}t           j        }nOd
}|dk    rd}t           j        }n8|dk    rd}t           j        }n#|dk    rd}t           j        }nt           j        }d}t          j        ||          ||fS )z0Prepare an integer for the MySQL binary protocolNr   ir   i r   i   r   r         Bi  r   l    r   Q)r   r   r   r   r   r)   r*   )r   r   r   r   r   s        r   _prepare_binary_integerz%MySQLProtocol._prepare_binary_integer  s    
199}}&^

&&_

+%%&^

&/

E||&^

%&_

*$$&^

&/
GU++Z??r   c                    t          |t          j                  rt          j        }n6t          |t          j                  rt          j        }nt          d          t          j        |j	                  t          j
        |j                  z   t          j
        |j                  z   }t          |t          j                  rw|t          j
        |j                  z   t          j
        |j                  z   t          j
        |j                  z   }|j        dk    r|t          j        |j                  z  }t          j
        t%          |                    |z   }||fS )a  Prepare a timestamp object for the MySQL binary protocol

        This method prepares a timestamp of type datetime.datetime or
        datetime.date for sending over the MySQL binary protocol.
        A tuple is returned with the prepared value and field type
        as elements.

        Raises ValueError when the argument value is of invalid type.

        Returns a tuple.
        z2Argument must a datetime.datetime or datetime.dater   )
isinstancer   r   r   r   r   rv   r   	int2storer   rE   r   r   r   r   r   r   rD   r(   )r   r   r   packeds       r   _prepare_binary_timestampz'MySQLProtocol._prepare_binary_timestamp  s6    eX.// 	F"+JJx}-- 	F"JJDF F F /%*--/%+..//%),,- eX.// 	=uuz:::oel334oel334F  1$$%/%*;<<<V--6
##r   c                    t          |t          j        t          j        f          st	          d          t
          j        }d}d}d}t          |t          j                  r|j        dk     rd}t          |j	        d          \  }}t          |d          \  }}	|t          j        t          |j                            t          j        |          z   t          j        |          z   t          j        |	          z   z  }|j        }nl|t          j        d          t          j        |j                  z   t          j        |j                  z   t          j        |j                  z   z  }|j        }|r|t          j        |          z  }t          j        |          |z   }t          j        t'          |                    |z   }||fS )a  Prepare a time object for the MySQL binary protocol

        This method prepares a time object of type datetime.timedelta or
        datetime.time for sending over the MySQL binary protocol.
        A tuple is returned with the prepared value and field type
        as elements.

        Raises ValueError when the argument value is of invalid type.

        Returns a tuple.
        z3Argument must a datetime.timedelta or datetime.timer   Nr   r   i  <   )r   r   r   timerv   r   r   r   divmodr   r   rD   absrE   r   r   r   r   r   r(   )
r   r   r   negativer   r   r   	remainderminssecss
             r   _prepare_binary_timez"MySQLProtocol._prepare_binary_time8  s    %("4hm!DEE 	GEG G G ^
eX/00 	$zA~~!'t!<!<UI!)R00LT4us5:77u--.t,,- t,,- .F $CCuq))uz223u|445 u|445 6F #C 	+eoc***F**V3V--6
##r   c                 ^    t          j        |          t          j        |          z   |z   }|S )zMPrepare long data for prepared statements

        Returns a string.
        )r   rD   r   )r   	statementparamrJ   r@   s        r   _prepare_stmt_send_long_dataz*MySQLProtocol._prepare_stmt_send_long_datae  s7     OI&&OE""# 	 r   r   r   c           
      
   d}dgt          |          dz   dz  z  }g }	g }
d}|i }|r|rt          |          t          |          k    rt          j        d          t          |          D ]]\  }}||         }d}|`||dz  xx         d|dz  z  z  cc<   |
                    t          j        t          j                  t          j        |          z              r||v r*||         d         rt          j	        }nt          j
        }nt          |t                    r0|                     |          \  }}}|	                    |           n<t          |t                    rt          r8|	                    t          j        t          |                    |z              nL|                    |          }|	                    t          j        t          |                    |z              t          j        }nt          |t&                    rE|	                    t          j        t          |                    |z              t          j	        }n4t          rot          |t(                    rZ|                    |          }|	                    t          j        t          |                    |z              t          j        }nt          |t*                    r|	                    t          j        t          t          |                              |                              t          |                              |          z              t          j        }n$t          |t.                    r5|	                    t1          j        d|                     t          j        }nt          |t6          j        t6          j        f          r.|                     |          \  }}|	                    |           nt          |t6          j        t6          j        f          r.|                      |          \  }}|	                    |           n2t          j!        d	"                    |j#        j$        
                    |
                    t          j        |          t          j        |          z              _t          j%        |          t          j        |          z   t          j%        |          z   d&                    d |D                       z   t          j        d          z   }|
D ]}||z  }|	D ]}||z  }|S )z6Make a MySQL packet with the Statement Execute commandr   r   r   rZ   r   NzTFailed executing prepared statement: data values does not match number of parametersr   z:MySQL binary protocol can not handle '{classname}' objects)	classnamec                 8    g | ]}t          j        d |          S )r   )r)   r*   )r   bits     r   r   z3MySQLProtocol.make_stmt_execute.<locals>.<listcomp>  s$    CCCfk#s++CCCr   )'r(   r
   r#   r   r   r   rE   r   NULLBLOBSTRINGr   r   r   r&   r   lc_intr   VARCHARbytesunicoder   DECIMALfloatr)   r*   r   r   r   r   r   r  r  r$   r%   	__class____name__rD   r   )r   r   rJ   
parametersr   long_data_usedr=   iteration_countr   r   typesr   r   r   r   r   r@   a_typea_values                      r   make_stmt_executezMySQLProtocol.make_stmt_executep  sF    cc$ii!m12!N >	5$ >	54yyC
OO+++23 3 3 $J// 95 95QS	=+++qS1W~=+++LL!@!@!&!7!7"8 9 9 9N**%c*1- 6%.^

 &/%5

s++ (A"::5AAVZMM&))))s++ $A >el3u::&>&>&+', - - - - !&W 5 5!LU44u<> > >!*!2JJu-- AMM%,s5zz":":U"BCCC!*JJ A"5'22A!LL11EMM%,s5zz":":U"BCCC!*!2JJw// AMMSU):):#*% *% && && ' '),U):):7)C)CDE E E "+!2JJu-- AMM&+c5"9"9:::!*!1JJ(98='IJJ A+/+I+I, ,(VZMM&))))(:HM'JKK A+/+D+DU+K+K(VZMM&)))) 1006&+o&> 17 1@ 1@A A A U_Z88"_U334 5 5 5 5 OL))OE""#OO,,- HHCC{CCCDDE OA	 	  	 	FfFF 	 	GgFFr   c                     |d         dk    st          j        d          t          j        |dd         d          \  }}|r|d         d	k    r
|dd         }|                    d
          |fS )z&Parse a MySQL AuthSwitchRequest-packetrm   r   z'Failed parsing AuthSwitchRequest packetrQ   Nr   rS   r[   r   r   )r
   r#   r   r_   r`   )r   r@   plugin_names      r   parse_auth_switch_requestz'MySQLProtocol.parse_auth_switch_request  s    ayC'9; ; ; !& 1&*' J J J 	!fRjAooCRC[F!!&))611r   c                 V    |d         dk    st          j        d          |dd         S )z!Parse a MySQL AuthMoreData-packetrm   r   z"Failed parsing AuthMoreData packetrQ   N)r
   r#   )r   r@   s     r   parse_auth_more_dataz"MySQLProtocol.parse_auth_more_data  s7    ayA~~'46 6 6 abbzr   )NNNr2   r   r3   FN)r2   r   r3   )N)NNNr2   r   FN)r\   )T)r   )r   r   r   Nr   )r  
__module____qualname____doc__r   r1   rA   rF   rK   rN   rk   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r"  r%  r'  r   r   r   r   r   '   s(        
    . KO+,=B"# # # #J 67)3       CGAB8<" " " "H* * *X  (G G G
 
 
 
4  (   6( ( ( (TN N N(	N 	N 	N, , ,0* * *$  @   8  "@ @ @B $  $  $D+$ +$ +$Z	 	 	 CE@FX X X Xt
2 
2 
2    r   r   )r*  r)   r   decimalr   	constantsr   r   r   r   r	    r
   r   authenticationr   catch23r   r   r   objectr   r   r   r   <module>r1     s  0         J J J J J J J J J J J J J J         + + + + + + ' ' ' ' ' ' ' ' ! ! ! ! ! !u
 u
 u
 u
 u
F u
 u
 u
 u
 u
r   