1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
U
£ý°d‹öã@sÌdZddlZddlZddlZddlZddlZddlZddlmZddl    m
Z
ddl m Z m Z mZmZmZmZmZmZmZmZmZddlmZddlmZdd    lmZdd
lmZmZm Z m!Z!m"Z"m#Z#m$Z$dd l%m&Z&dd l'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4dd l5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=ddl>m>Z>ddl?m@Z@mAZAddlBmCZCddlDmEZEddlFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZNmOZOmPZPmQZQddlRmSZSmTZTmUZUmVZVGdd„deƒZWdS)z.Implementing communication with MySQL servers.éN)ÚDecimal)ÚIOBase) ÚAnyÚBinaryIOÚDictÚ    GeneratorÚListÚMappingÚOptionalÚSequenceÚTupleÚTypeÚUnioné)Úversion)ÚMySQLConnectionAbstract)Úget_auth_plugin)Ú CharacterSetÚ
ClientFlagÚ    FieldTypeÚ    ServerCmdÚ
ServerFlagÚ ShutdownTypeÚ flag_is_set)ÚMySQLConverter) Ú
CursorBaseÚ MySQLCursorÚMySQLCursorBufferedÚMySQLCursorBufferedDictÚMySQLCursorBufferedNamedTupleÚMySQLCursorBufferedRawÚMySQLCursorDictÚMySQLCursorNamedTupleÚMySQLCursorPreparedÚMySQLCursorPreparedDictÚMySQLCursorPreparedNamedTupleÚMySQLCursorPreparedRawÚMySQLCursorRaw)Ú DatabaseErrorÚErrorÚInterfaceErrorÚ InternalErrorÚNotSupportedErrorÚOperationalErrorÚProgrammingErrorÚ get_exception)Úlogger)ÚMySQLTCPSocketÚMySQLUnixSocket)ÚBaseAuthPlugin)Ú MySQLProtocol) Ú ConnAttrsTypeÚDescriptionTypeÚ EofPacketTypeÚ HandShakeTypeÚ OkPacketTypeÚ
ResultTypeÚRowTypeÚ
SocketTypeÚStatsPacketTypeÚ
StrOrBytesÚ!SupportedMysqlBinaryProtocolTypes)Ú get_platformÚ    int1storeÚ    int4storeÚlc_intcseZdZdZeddœ‡fdd„ Zddœdd„Zddœd    d
„Zd•ee    ee    ee    e
e
ee e    ee e    e ee    ffeee d œdd„Zd–ee    ee    eedœdd„Zeeedœdd„Zee    eedœdd„Zedœdd„Zddœdd„Zddœdd„Zddœdd „ZeZd—e
eee
eee e
eed"œd#d$„Zd˜ee ed&œd'd(„Z e
dd)œd*d+„Z!e"e dœd,d-„ƒZ#eedœd.d/„Z$ee%dœd0d1„Z&e    ed2œd3d4„Z'ee(dœd5d6„Z)d™e eee*ee e+ee,ee%fd7œd8d9„Z-dšee
e eee*ee ee+ee,ee%fd:œd;d<„Z.ddœd=d>„Z/e    ed?œd@dA„Z0d›e1e e e e(dBœdCdD„Z2e1e3e(ddfdEœdFdG„Z4e
edHœdIdJ„Z5edœdKdL„Z6dœee
e%dMœdNdO„Z7e8dœdPdQ„Z9e
edRœdSdT„Z:e%dœdUdV„Z;edœdWdX„Z<de    e    e    e
e    e    e    e    e    eedZœ
d[d\„Z=e"e    dœd]d^„ƒZ>e>j?e    dd_œd`d^„ƒZ>e dœdadb„Z@e    ddcœddde„ZAdžee e    efee e    efddfœdgdh„ZBdŸe e
e
ddjœdkdl„ZCe"ee
dœdmdn„ƒZDd ee ee ee eeEeFee ee eFdoœdpdq„ZGddœdrds„ZHddœdtdu„ZIe1ddvœdwdx„ZJe1ee,dvœdydz„ZKee e    e
fdœd{d|„ZLee ee+e
ee*e%ffdœd}d~„ZMd¡e
e
ddœd€d„ZNeeOe    e e
ee*ffd‚œdƒd„„ZPd¢e
eQeReQee
e ee+e
ee*e%ffd†œd‡dˆ„ZSe
dd‰œdŠd‹„ZTe
e
ee
dŒœddŽ„ZUe
dd‰œdd„ZVe dœd‘d’„ZWddœd“d”„ZX‡ZYS)£ÚMySQLConnectionzConnection to a MySQL ServerN)ÚkwargsÚreturnc s"d|_d|_d|_tƒ ¡t|_t ¡|_    d|_
d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_i|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ d|_!d|_"d|_#d|_$d|_%g|_&d|_'|rz|j(f|ŽWn&t)k
r| *¡d|_‚YnXdS)    Né-FÚz    127.0.0.1iê rTr)+Ú    _protocolÚ_socketÚ
_handshakeÚsuperÚ__init__rÚ_converter_classrZ get_defaultÚ _client_flagsÚ _charset_idZ    _sql_modeZ
_time_zoneZ _autocommitÚ_userÚ    _passwordÚ    _databaseZ_hostZ_portÚ _unix_socketZ _client_hostZ _client_portÚ_sslÚ _force_ipv6Z _use_unicodeZ _get_warningsZ_raise_on_warningsÚ    _bufferedZ_unread_resultÚ_have_next_resultÚ_rawÚ_in_transactionZ_prepared_statementsÚ _ssl_activeÚ _auth_pluginÚ_krb_service_principalZ_pool_config_versionÚ_query_attrs_supportedÚ _columns_descÚ _mfa_nfactorÚconnectÚ    ExceptionÚclose)ÚselfrE©Ú    __class__©úQd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\mysql/connector/connection.pyrMusV
 
zMySQLConnection.__init__)rFc Csztƒ}tj d¡}|ddkr$d}nd}tt ¡ƒ|dt ¡d|d     d    d
„tj
dd …Dƒ¡|d d œ}|j   |¡dS)z&Add the default connection attributes.ú rZGPLv2zGPL-2.0Z
CommercialÚarchzmysql-connector-pythonÚ.cSsg|] }t|ƒ‘qSrg)Ústr)Ú.0ÚxrgrgrhÚ
<listcomp>¹sz;MySQLConnection._add_default_conn_attrs.<locals>.<listcomp>ér)Z_pidÚ    _platformZ _source_hostZ _client_nameZ_client_licenseZ_client_versionÚ_osN) r@rÚLICENSEÚsplitrlÚosÚgetpidÚsocketÚ gethostnameÚjoinÚVERSIONÚ _conn_attrsÚupdate)rdÚplatformZlicense_chunksZclient_licenseZdefault_conn_attrsrgrgrhÚ_add_default_conn_attrs«s  
ù
z'MySQLConnection._add_default_conn_attrscCs4|j ¡}|ddkrt|ƒ‚d|_|j |¡}|d}| t|tt    t
fƒrP|nd¡|_ t   |j ¡|dtj@s¶|jdkrŠ|jsŠtdƒ‚|j d    ¡r¢td
d d ‚|jtjM_n|jsÌ|jtjO_|dtj@rè| tjg¡|dtj@r d |_| tjg¡|dtj@r*| tjg¡||_dS)z'Get the handshake from the MySQL serverééÿNZserver_version_originalÚUnknownZ capabilitiesZmysql_clear_passwordzEClear password authentication is not supported over insecure channelsÚ verify_certz1SSL is required but the server doesn't support itiê)ÚerrnoT)rJÚrecvr/rKrIZparse_handshakeZ_check_server_versionÚ
isinstancerlÚbytesÚ    bytearrayÚ_server_versionrZset_mysql_versionrÚSSLr\Ú    is_securer*rUÚgetrOÚ _ssl_disabledZ PLUGIN_AUTHZset_client_flagsÚCLIENT_QUERY_ATTRIBUTESr^ZMULTI_FACTOR_AUTHENTICATION)rdÚpacketÚ    handshakeZserver_versionrgrgrhÚ _do_handshake¿sB
  ÿý ÿ þzMySQLConnection._do_handshakerrG)ÚusernameÚpasswordÚdatabaseÚ client_flagsÚcharsetÚ ssl_optionsÚ
conn_attrsrFc
Cstd|_|dkri}|js¬|tj@r¬|jj||d}|j |¡| d¡dk    r^d     | d¡¡}    nd}    |j 
| d¡| d¡| d    ¡| d
¡pŒd| d ¡p˜d|    | d ¡¡d |_|j rÂ||j krÂ|j }t   d|j¡|j d¡sö|j d¡rtjdkr|st ¡}t   d||j¡|jj|j||||||j|j||jd
}|j |¡| ||¡|tj@sp|rp| |¡d S)aeAuthenticate with the MySQL server
 
        Authentication happens in two parts. We first send a response to the
        handshake. The MySQL server will then send either an AuthSwitchRequest
        or an error packet.
 
        Raises NotSupportedError when we get the old, insecure password
        reply back. Raises any error coming from MySQL.
        FN)r•r”Útls_ciphersuitesú:rHÚcaÚcertÚkeyr‚Zverify_identityZ tls_versionsTz## _do_auth(): self._auth_plugin: %sZauthentication_ociZauthentication_kerberosÚntz4MySQL user is empty, OS user: %s will be used for %s)
rr‘r’r“r•r”Ú ssl_enabledÚ auth_pluginr—Zauth_plugin_class)r[rŒrr‰rIZ make_auth_sslrJÚsendr‹ryZ switch_to_sslÚ
_password1r0Údebugr\Ú
startswithruÚnameÚgetpassÚgetuserZ    make_authrKÚ_auth_plugin_classÚ_auth_switch_requestÚCONNECT_WITH_DBÚ cmd_init_db)
rdr‘r’r“r”r•r–r—rŽr˜rgrgrhÚ_do_authìspÿ   ù    
ÿ
ýüúýö  
zMySQLConnection._do_auth)r‘r’rFcCs8d}|jp|jd}t d|¡|j ¡}|ddkrJt|ƒdkrJtdƒ‚|ddkr”|j     |¡\}}t
||j ƒ||pz|j ||j d}| |||¡}|dd    krî|j |¡}t
||j ƒ|||j d
}|d krî| ¡}|rä|j |¡|j ¡}|dd kr| |¡S|dd kr| |¡S|ddkr4t|ƒ‚dS)z®Handle second part of authentication
 
        Raises NotSupportedError when we get the old, insecure password
        reply back. Raises any error coming from MySQL.
        NrŸznew_auth_plugin: %sréþéz‡Authentication with old (insecure) passwords is not supported. For more information, lookup Password Hashing in the latest MySQL manual©r‘r’ržr©r’ržÚcaching_sha2_passwordrér€)r\rKr0r¢rJr„Úlenr,rIZparse_auth_switch_requestrr§rQrŠÚ_auth_continueÚparse_auth_more_dataÚ auth_responser Ú
_handle_okÚ _handle_mfar/)rdr‘r’ÚauthZnew_auth_pluginrŽÚ    auth_dataÚresponsergrgrhr¨<sPÿ 
ÿ 
ý
ü  
ÿ 
 
 
z$MySQLConnection._auth_switch_request)rŽrFcCs,|jd7_|jdkr |j}n|jdkr2|j}ntdƒ‚t d|j¡|j |dd…¡\}}t||j    ƒd|j
||j d}|  |||¡}|ddkrä|j  |¡}t||j    ƒ|||j d    }|d
krä| ¡}|rÚ|j |¡|j ¡}|dd krú| |¡S|ddkr| |¡S|dd kr(t|ƒ‚dS) z#Handle Multi Factor Authentication.rr±rpz5Failed Multi Factor Authentication (invalid N factor)z# MFA N Factor #%drNr®r¯r°rr€)r`Ú
_password2Ú
_password3r*r0r¢rIZparse_auth_next_factorrr§rQrŠr³r´rµrJr r„r¶r·r/)rdrŽr’rŸr¸r¹rºrgrgrhr·qsH
 
ÿ
ü  
ÿ 
 
 
zMySQLConnection._handle_mfa)r¸rŸr¹rFcCs|dkr"t d|¡| |j¡}nX|dkrBt d|¡| |¡}n8|dkrrt d|j¡|j|_|j|_| ¡}n| ¡}t d|t|ƒ¡|j     
|¡|j      ¡}t d|¡|dkrLt|ƒdkrL|d    d
krL|dd krL|d    d …}|  |¡}|j     
|¡|j      ¡}|d    d kr|dd kr|  |d    d …¡r|j      ¡}nÆ|dkrÔ|dkrÔ|ddkrÔd    }t d¡t d|d |d…¡t dt|ƒ¡t d¡d}    d}
|    sH|
d    krHt dd|
dd¡t d|¡t d|d |d…¡| ||d …¡\} }    t d| ¡|j     
| p.d¡|j      ¡}|
d7}
q¶|    sbtd|
›d|›ƒ‚t d |t|ƒ¡| ||d …¡} t d!| t| ƒ¡|j     
| ¡|j      ¡}t d"|¡|j      ¡}t d#|¡n>|dkr|ddkrd    }t d$¡t d%|d |d…¡t d&t|ƒ¡t d¡d}    d}
|    sÐ|
d    krÐt dd|
dd¡t d'|¡t d(|d |d…¡|  ||d …¡\} }    | r¤|j     
| ¡|    r®qÐ|j      ¡}t d)| ¡|
d7}
q4|    sêtd|
›d|›ƒ‚t d*|t|ƒ¡|j      ¡}t d+|¡|S),z!Continue with the authentication.Zauthentication_ldap_sasl_clientz# auth_data: %sÚauthentication_kerberos_clientZauthentication_oci_clientz!# oci configuration file path: %sz# request: %s size: %sz# server response packet: %sér­éré=NévsGSSAPIrr€z*# Continue with sasl GSSAPI authenticationz# response header: %srz# response size: %sz# Negotiate a service requestFrz%s Attempt %s %sz--------------------z<< server response: %sz# response code: %sz >> response to server: %sóz'Unable to fulfill server request after z! attempts. Last server response: z0 last GSSAPI response from server: %s length: %dz* >> last response to server: %s length: %dz"<< final handshake from server: %sz<< ok packet from server: %sz%# Continue with GSSAPI authenticationz# Response header: %sz# Response size: %sz<< Server response: %sz# Response code: %sz>> Response to server: %sz(Last response from server: %s length: %dz<< Ok packet from server: %s)r0r¢rµr]Ú_oci_config_fileÚoci_config_fileÚ_oci_config_profileÚoci_config_profiler²rJr r„Z auth_continueZ auth_finalizeZauth_continue_krbr*Zauth_accept_close_handshake)rdr¸rŸr¹rºrŽZ dec_responseZ    cresponseZ
rcode_sizeZcompleteÚtriesÚstepZ    last_stepÚtokenrgrgrhr³›sÒ   
 
 ÿ
þ
ý
ü 
 
ÿþ
ý
 
 
 ÿýý 
 
 
 
 
  ÿý
 zMySQLConnection._auth_continuecCsFd}|jr"tjdkr"t|jd}nt|j|j|jd}|     |j
¡|S)zÉGet connection based on configuration
 
        This method will return the appropriated connection object using
        the connection parameters.
 
        Returns subclass of MySQLBaseSocket.
        NÚposix)Ú unix_socket)ÚhostÚportZ
force_ipv6) rTrur¤r2rËr1Z server_hostZ server_portrVÚset_connection_timeoutZ_connection_timeout)rdÚconnrgrgrhÚ_get_connectionsý zMySQLConnection._get_connectionc    Cs,|jdkr(|js(t|j|jƒ}| ¡|_tƒ|_| ¡|_zv|j     ¡| 
¡|  |j|j |j |j|j|j|j¡| |j¡|jtj@r¢|jj|j_|jj|j_|j d¡Wn tk
rÐ|j ¡‚YnX|js(t|jjdƒr(t |jjj!ƒr(|jj !¡}|dkr(d|›d}t" #|t$¡dS)z–Open the connection to the MySQL server
 
        This method sets up and opens the connection to the MySQL server.
 
        Raises on errors.
        r½Nr)ÚTLSv1zTLSv1.1zThis connection is using zZ which is now deprecated and will be removed in a future release of MySQL Connector/Python)%r\rQrr§Zget_user_from_credentialsr4rIrÐrJZopen_connectionrr«rRrSrOrPrUr{Zset_converter_classrNrZCOMPRESSZrecv_compressedr„Zsend_compressedr rÎrbÚclose_connectionrŒÚhasattrÚsockÚcallablerÚwarningsÚwarnÚDeprecationWarning)rdÚclsZ tls_versionZwarn_msgrgrgrhÚ_open_connection,sH
 
 
ù        
ÿ þ ý 
 
ÿz MySQLConnection._open_connectionc    Cs6|js
dSz|j ¡Wnttfk
r0YnXdS)z%Shut down connection to MySQL Server.N)rJÚshutdownÚAttributeErrorr)©rdrgrgrhrÛ^s zMySQLConnection.shutdownc    CsD|js
dSz | ¡Wnttfk
r.YnX|j ¡d|_dS)z Disconnect from the MySQL serverN)rJÚcmd_quitrÜr)rÒrKrÝrgrgrhrchs 
zMySQLConnection.closeT)ÚcommandÚargumentÚ packet_numberrŽÚexpect_responseÚcompressed_packet_numberrFc
Csj| ¡z"|j |j ||p|¡||¡Wn,tk
rV}ztdƒ|‚W5d}~XYnX|s`dS|j ¡S)a4Send a command to the MySQL server
 
        This method sends a command with an optional argument.
        If packet is not None, it will be sent and the argument will be
        ignored.
 
        The packet_number is optional and should usually not be used.
 
        Some commands might not result in the MySQL server returning
        a response. If a command does not return anything, you should
        set expect_response to False. The _send_cmd method will then
        return None instead of a MySQL packet.
 
        Returns a MySQL packet or None.
        úMySQL Connection not availableN)Úhandle_unread_resultrJr rIÚ make_commandrÜr-r„)rdrßràrárŽrârãÚerrrgrgrhÚ    _send_cmdvsýzMySQLConnection._send_cmdF)Ú    data_fileÚsend_empty_packetrFc
CsÊ| ¡t|dƒstdƒ‚d}z2| |d¡}|rN|j |¡| |d¡}q.Wn,tk
r|}ztdƒ|‚W5d}~XYnX|rÀz|j d¡Wn,tk
r¾}ztdƒ|‚W5d}~XYnX|j ¡S)a4Send data to the MySQL server
 
        This method accepts a file-like object and sends its data
        as is to the MySQL server. If the send_empty_packet is
        True, it will send an extra empty package (for example
        when using LOAD LOCAL DATA INFILE).
 
        Returns a MySQL packet.
        Úreadzexpecting a file-like objectééräNrÂ)    rårÓÚ
ValueErrorrërJr rÜr-r„)rdrérêÚ
chunk_sizeÚbufrçrgrgrhÚ
_send_datas" 
 zMySQLConnection._send_data)ÚflagsrFcCs ttj|ƒ|_ttj|ƒ|_dS)aHandle the server flags found in MySQL packets
 
        This method handles the server flags send by MySQL OK and EOF
        packets. It, for example, checks whether there exists more result
        sets or whether there is an ongoing transaction.
        N)rrZMORE_RESULTS_EXISTSrXZSTATUS_IN_TRANSrZ)rdròrgrgrhÚ_handle_server_status¿sz%MySQLConnection._handle_server_statuscCs|jS)z'MySQL session has started a transaction)rZrÝrgrgrhÚin_transactionÉszMySQLConnection.in_transactioncCsJ|ddkr*|j |¡}| |d¡|S|ddkr>t|ƒ‚tdƒ‚dS)aHandle a MySQL OK packet
 
        This method handles a MySQL OK packet. When the packet is found to
        be an Error packet, an error will be raised. If the packet is neither
        an OK or an Error packet, InterfaceError will be raised.
 
        Returns a dict()
        rrÚ status_flagr€zExpected OK packetN)rIZparse_okrór/r*)rdrŽZok_pktrgrgrhr¶Îs       zMySQLConnection._handle_okcCsJ|ddkr*|j |¡}| |d¡|S|ddkr>t|ƒ‚tdƒ‚dS)aHandle a MySQL EOF packet
 
        This method handles a MySQL EOF packet. When the packet is found to
        be an Error packet, an error will be raised. If the packet is neither
        and OK or an Error packet, InterfaceError will be raised.
 
        Returns a dict()
        rr¬rõr€zExpected EOF packetN)rIZ    parse_eofrór/r*)rdrŽÚeofrgrgrhÚ _handle_eofßs       zMySQLConnection._handle_eof)ÚfilenamerFcCs„tj |¡}tj |¡r tdƒ‚|js4|js4tdƒ‚|jsÂ|jrÂtj |j¡}d}ztj ||g¡}Wn>t    k
r¤}z d}t
|  t |ƒ||¡ƒ|‚W5d}~XYnX||krÂd}t|  ||¡ƒ‚z’z$t|dƒ}| |j|dd¡WW¢nStk
rPz|j d    ¡Wn.tk
r8}ztd
ƒ|‚W5d}~XYnXt
d |›d ƒd‚YnXW5z |  ¡Wnttfk
r|YnXXdS) z'Handle a LOAD DATA INFILE LOCAL requestz#Use of symbolic link is not allowedúKLOAD DATA LOCAL INFILE file request rejected due to restrictions on access.NzL{} while loading file `{}` and path `{}` given in allow_local_infile_in_pathzEThe file `{}` is not found in the given allow_local_infile_in_path {}ÚrbT)rêrÂräzFile 'z' could not be read)ruÚpathÚabspathÚislinkr-Z_allow_local_infileÚ_allow_local_infile_in_pathr(Ú
commonpathrîr*ÚformatrlrcÚIOErrorÚ    NameErrorÚopenr¶rñrJr rÜ)rdrøÚ    file_nameZ infile_pathZc_pathrçÚerr_msgrérgrgrhÚ_handle_load_data_infileðsJ   ÿ ÿÿþÿ
 z(MySQLConnection._handle_load_data_infilecCsú|rt|ƒdkrtdƒ‚|ddkr.| |¡S|ddkrT|dd… ¡}| |¡S|ddkrj| |¡S|ddkr~t|ƒ‚|j |¡}|r˜t    |t
ƒs td    ƒ‚dg||_ t d|ƒD] }|j  |j ¡|j¡|j |<q¶| |j ¡¡}d
|_|j |d œS) a–Handle a MySQL Result
 
        This method handles a MySQL result, for example, after sending the
        query command. OK and EOF packets will be handled and returned. If
        the packet is an Error packet, an Error-exception will be
        raised.
 
        The dictionary returned of:
        - columns: column information
        - eof: the EOF-packet information
 
        Returns a dict()
        rúEmpty responseréûr­Nr¬r€zIllegal result setT)Úcolumnsrö)r²r*r¶Údecoderr÷r/rIÚparse_column_countr…Úintr_ÚrangeÚ parse_columnrJr„Úpython_charsetÚ unread_result)rdrŽrøÚ column_countÚirörgrgrhÚ_handle_result s4 
 
 
  ÿþÿ zMySQLConnection._handle_result)Úbinaryr    ÚrawrFcCs.|jd|||d\}}|r&|d|fSd|fS)aTGet the next rows returned by the MySQL server
 
        This method gets one row from the result set after sending, for
        example, the query command. The result is a tuple consisting of the
        row and the EOF packet.
        If no row was available in the result set, the row data will be None.
 
        Returns a tuple.
        r)Úcountrr    rrN)Úget_rows)rdrr    rÚrowsrörgrgrhÚget_rowKs zMySQLConnection.get_row)rrr    rÚ    prep_stmtrFc
 
s|dkrˆj}ˆjstdƒ‚gdf}zF|rRˆj}|dkr<d}ˆj ˆj|||¡}nˆjjˆjˆj|d}Wn,t    k
r–}zdˆ_|‚W5d}~XYnX|\}}    |sÜ|s܈j
dk    rÜ|rÜt ˆdƒr܈j j ‰‡‡fdd    „|Dƒ}|    dk    r
ˆ d
|    krú|    d
n|    d ¡dˆ_||    fS) aGet all rows returned by the MySQL server
 
        This method gets all rows returned by the MySQL server after sending,
        for example, the query command. The result is a tuple consisting of
        a list of rows and the EOF packet.
 
        Returns a tuple()
        NzNo result set availableÚutf8mb4Úutf8)rFÚ    convertercsg|]}ˆ|ˆjƒ‘qSrg)r_)rmÚrow©Ú row_to_pythonrdrgrhroŽsz,MySQLConnection.get_rows.<locals>.<listcomp>rõZ server_status)rYrr+r•rIZread_binary_resultrJZread_text_resultrˆr)r_rÓrr ró)
rdrrr    rrrr•rçZeof_prgrrhr_sZÿÿ
ÿÿþýü
ÿ
ýzMySQLConnection.get_rowscCs|jr| ¡dS)zConsume resultsN)rrrÝrgrgrhÚconsume_resultsšszMySQLConnection.consume_results)r“rFcCs| | tj| d¡¡¡S)zëChange the current database
 
        This method changes the current (default) database by sending the
        INIT_DB command. The result is a dictionary containing the OK packet
        information.
 
        Returns a dict()
        úutf-8)r¶rèrZINIT_DBÚencode)rdr“rgrgrhrªŸs    ÿzMySQLConnection.cmd_init_db)ÚqueryrÚbufferedÚ raw_as_stringrFc
Cs t|tƒs&t|tƒr| d¡}t|ƒ}|jdkr6|jnd}tƒ}|jsZ|jrZtjdt    d|j
t j @rg}g}g}    dgt |jƒdd}
t|jƒD]ð\} } | d    } d}| d
krê|
| dd    | d>O<| ttjƒt|ƒ¡q–t| tƒr|j | ¡\}}}|     |¡n8t| tƒrL|  |¡} |     tt | ƒƒ| ¡tj}nt| tƒrv|     tt | ƒƒ| ¡tj}nØt| tƒr´|     tt t| ƒ |¡ƒƒt| ƒ |¡¡tj}nšt| tƒrÚ|     t d | ¡¡tj}ntt| t j t j!fƒr
|j "| ¡\}}|     |¡nDt| t j#t j$fƒr:|j %| ¡\}}|     |¡nt&d | j'j(›d ƒ‚| t|ƒt|ƒ¡| d |¡}| tt |ƒƒ|¡q–| )tt |jƒƒ¡| )td    ƒ¡|    r| )d *dd„|
Dƒ¡td    ƒ¡t+||ƒD]\}}| )|¡| )|¡qÞ|    D]} | )| ¡q| )|¡t|ƒ}z| ,| -t.j/|¡¡}WnLt&k
rŠ}z,|j0dkrxd|j1krxd}t2|ƒ|‚‚W5d
}~XYnX|j3rœt4dƒ‚|S)aSend a query to the MySQL server
 
        This method send the query to the MySQL server and returns the result.
 
        If there was a text result, a tuple will be returned consisting of
        the number of columns and a list containing information about these
        columns.
 
        When the query doesn't return a text result, the OK or EOF packet
        information as dictionary will be returned. In case the result was
        an error, exception Error will be raised.
 
        Returns a tuple()
        r"rrú<This version of the server does not support Query Attributes©ÚcategoryréérNz<dz&MySQL binary protocol can not handle 'z    ' objectsrÂcSsg|]}t d|¡‘qS)ÚB)ÚstructÚpack)rmÚbitrgrgrhro    sz-MySQLConnection.cmd_query.<locals>.<listcomp>ilzLoading local data is disabledrùz8Use cmd_query_iter for statements with multiple queries.)5r…r‡rlr#r•r^Ú _query_attrsrÖr×ÚWarningrOrrr²Ú    enumerateÚappendrArÚNULLr rIZprepare_binary_integerrCZVARCHARr†ZBLOBrZDECIMALÚfloatr-r.ÚDOUBLEÚdatetimeÚdateZprepare_binary_timestampÚ    timedeltaÚtimeZprepare_binary_timer.rfÚ__name__ÚextendryÚziprrèrÚQUERYrƒÚmsgr(rXr*)rdr$rr%r&r•rŽÚnamesÚtypesÚvaluesZ null_bitmapÚposZ
attr_tupleÚvalueròÚpackedZ
field_typer¤Ú_typeÚresultrçrrgrgrhÚ    cmd_query¬s´
 
 
 þ 
ü 
 
   ÿÿ 
ý  ÿÿÿ
 
ÿ
ÿzMySQLConnection.cmd_query)Ú
statementsrFccs¢tƒ}t|tƒs,t|tƒr$| d¡}t|ƒ}|jtj@rT| tdƒ¡| tdƒ¡| |¡t    |ƒ}| 
|  t j |¡¡V|jrž| ¡| 
|j ¡¡Vq|dS)atSend one or more statements to the MySQL server
 
        Similar to the cmd_query method, but instead returns a generator
        object to iterate through results. It sends the statements to the
        MySQL server and through the iterator you can get the results.
 
        statement = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
        for result in cnx.cmd_query(statement, iterate=True):
            if 'columns' in result:
                columns = result['columns']
                rows = cnx.get_rows()
            else:
                # do something useful with INSERT result
 
        Returns a generator.
        rrrN)r‡r…rlr#rOrrr<rCr†rrèrr>rXrårJr„)rdrIrŽr$rgrgrhÚcmd_query_iter&s
 
 
 
zMySQLConnection.cmd_query_iter)ÚoptionsrFcCs| | tjt|ƒ¡¡S)aÚSend the Refresh command to the MySQL server
 
        This method sends the Refresh command to the MySQL server. The options
        argument should be a bitwise value using constants.RefreshOption.
        Usage example:
         RefreshOption = mysql.connector.RefreshOption
         refresh = RefreshOption.LOG | RefreshOption.THREADS
         cnx.cmd_refresh(refresh)
 
        The result is a dictionary with the OK packet information.
 
        Returns a dict()
        )r¶rèrZREFRESHrB)rdrKrgrgrhÚ cmd_refreshPszMySQLConnection.cmd_refreshcCs*| ¡|j tj¡}|j |dd¡|S)aClose the current connection with the server
 
        This method sends the QUIT command to the MySQL server, closing the
        current connection. Since the no response can be returned to the
        client, cmd_quit() will return the packet it send.
 
        Returns a str()
        r)rårIrærZQUITrJr ©rdrŽrgrgrhrÞ`s    zMySQLConnection.cmd_quit)Ú shutdown_typerFcCs:|rt |¡stdƒ‚|}ntj}| | tjt|ƒ¡¡S)aZShut down the MySQL Server
 
        This method sends the SHUTDOWN command to the MySQL server and is only
        possible if the current user has SUPER privileges. The result is a
        dictionary containing the OK packet information.
 
        Note: Most applications and scripts do not the SUPER privilege.
 
        Returns a dict()
        zInvalid shutdown type)    rÚget_infor*ZSHUTDOWN_DEFAULTr÷rèrZSHUTDOWNrB)rdrNÚatypergrgrhÚ cmd_shutdownos 
zMySQLConnection.cmd_shutdowncCs8| ¡|j tj¡}|j |dd¡|j |j ¡¡S)zâSend the statistics command to the MySQL Server
 
        This method sends the STATISTICS command to the MySQL server. The
        result is a dictionary with various statistical information.
 
        Returns a dict()
        r)    rårIrærZ
STATISTICSrJr Zparse_statisticsr„rMrgrgrhÚcmd_statistics‚szMySQLConnection.cmd_statistics)Ú    mysql_pidrFcCs| | tjt|ƒ¡¡S)zÞKill a MySQL process
 
        This method send the PROCESS_KILL command to the server along with
        the process ID. The result is a dictionary with the OK packet
        information.
 
        Returns a dict()
        )r¶rèrZ PROCESS_KILLrB)rdrSrgrgrhÚcmd_process_kills    ÿz MySQLConnection.cmd_process_killcCs| | tj¡¡S)aFSend the DEBUG command
 
        This method sends the DEBUG command to the MySQL server, which
        requires the MySQL user to have SUPER privilege. The output will go
        to the MySQL server error log and the result of this method is a
        dictionary with EOF packet information.
 
        Returns a dict()
        )r÷rèrÚDEBUGrÝrgrgrhÚ    cmd_debugs
zMySQLConnection.cmd_debugcCs| | tj¡¡S)aSend the PING command
 
        This method sends the PING command to the MySQL server. It is used to
        check if the the connection is still valid. The result of this
        method is dictionary with OK packet information.
 
        Returns a dict()
        )r¶rèrZPINGrÝrgrgrhÚcmd_ping©s    zMySQLConnection.cmd_pingrH)
r‘r’r“r•Ú    password1Ú    password2Ú    password3rÄrÆrFc
Csòt|tƒstdƒ‚|dkr"tdƒ‚d|_||_||_||_||_||_|jr\||jkr\|j}|     ¡|j
rrt dƒ‚|j j |j|||||j|j|j|jd    }
|j |
dd¡|r´||_|    |_| ||¡} |jtj@sà|rà| |¡||_| ¡| S)zÑChange the current logged in user
 
        This method allows to change the current logged in user information.
        The result is a dictionary with OK packet information.
 
        Returns a dict()
        zcharset must be an integerrz2charset should be either zero or a postive integerrz-Change user is not supported with compression)    rr‘r’r“r•r”ržrŸr—)r…r rîr`rQrRr¡r»r¼råZ    _compressr,rIZmake_change_userrKrOr[r\r{rJr rÃrÅr¨rr©rªrPÚ_post_connection) rdr‘r’r“r•rXrYrZrÄrÆrŽZ    ok_packetrgrgrhÚcmd_change_user´sH
÷  
zMySQLConnection.cmd_change_usercCs| d¡dS)zGet the current databasezSELECT DATABASE()r)Ú
info_queryrÝrgrgrhr“öszMySQLConnection.database)rDrFcCs| d|›¡dS)zSet the current databasezUSE N)rH)rdrDrgrgrhr“ûscCs(z | ¡Wntk
r"YdSXdS)a2Reports whether the connection to MySQL Server is available
 
        This method checks whether the connection to MySQL is available.
        It is similar to ping(), but unlike the ping()-method, either True
        or False is returned and no exception is raised.
 
        Returns True or False.
        FT)rWr)rÝrgrgrhÚ is_connecteds
     zMySQLConnection.is_connected)rûrFcCs
||_dS)zySet the path that user can upload files.
 
        Args:
            path (str): Path that user can upload files.
        N)rþ)rdrûrgrgrhÚset_allow_local_infile_in_pathsz.MySQLConnection.set_allow_local_infile_in_path)Úuser_variablesÚsession_variablesrFc CsÊ| ¡stdƒ‚| ¡sfz0| |j|j|j|j|j|j    |j
|j |j ¡    Wnt k
rd| ¡YnX| ¡}|rš| ¡D]\}}| d|›d|f¡qz|rÆ| ¡D]\}}| d|›d|f¡q¦dS)aÇClears the current active session
 
        This method resets the session state, if the MySQL server is 5.7.3
        or later active session will be reset without re-authenticating.
        For other server versions session will be reset by re-authenticating.
 
        It is possible to provide a sequence of variables and their values to
        be set after clearing the session. This is possible for both user
        defined variables and session variables.
        This method takes two arguments user_variables and session_variables
        which are dictionaries.
 
        Raises OperationalError if not connected, InternalError if there are
        unread results and InterfaceError on errors.
        zMySQL Connection not available.zSET @`z` = %sz SET SESSION `N)r^r-Úcmd_reset_connectionr\rQrRrSrPr¡r»r¼rÃrÅr.Ú    reconnectÚcursorÚitemsÚexecute)rdr`raÚcurrœrDrgrgrhÚ reset_sessions0÷ zMySQLConnection.reset_sessionr)rcÚattemptsÚdelayrFc
CsRz | ¡Wn@tk
rL}z"|r2|j||dn
tdƒ|‚W5d}~XYnXdS)aîCheck availability of the MySQL server
 
        When reconnect is set to True, one or more attempts are made to try
        to reconnect to the MySQL server using the reconnect()-method.
 
        delay is the number of seconds to wait between each retry.
 
        When the connection is not available, an InterfaceError is raised. Use
        the is_connected()-method if you just want to check the connection
        without raising an error.
 
        Raises InterfaceError on errors.
        )rirjz$Connection to MySQL is not availableN)rWr)rcr*)rdrcrirjrçrgrgrhÚpingFs  zMySQLConnection.pingcCs|jr|j d¡SdS)zMySQL connection IDZserver_threadidN)rKr‹rÝrgrgrhÚ connection_id\s zMySQLConnection.connection_id)r%rÚpreparedÚ cursor_classÚ
dictionaryÚ named_tuplerFc s&| ¡| ¡stdƒ‚|dk    r:t|tƒs2tdƒ‚||ƒS|dk    rF|n|j}|dk    rX|n|j}d‰|dkrrˆdO‰|dkr‚ˆdO‰|dkr’ˆdO‰|dkr¢ˆd    O‰|dkr²ˆd
O‰tt    t
t t t ttttttd œ }z|ˆ|ƒWStk
r d ‰td d ‡‡fdd„tdƒDƒ¡ƒd‚YnXdS)aïInstantiates and returns a cursor
 
        By default, MySQLCursor is returned. Depending on the options
        while connecting, a buffered and/or raw cursor is instantiated
        instead. Also depending upon the cursor options, rows can be
        returned as dictionary or named tuple.
 
        Dictionary and namedtuple based cursors are available with buffered
        output but not raw.
 
        It is possible to also give a custom cursor through the
        cursor_class parameter, but it needs to be a subclass of
        mysql.connector.cursor.CursorBase.
 
        Raises ProgrammingError when cursor_class is not a subclass of
        CursorBase. Raises ValueError when cursor is not available.
 
        Returns a cursor-object
        räNz6Cursor class needs be to subclass of cursor.CursorBaserTrr±rr+rí) rrr±rprr­r+é    ríééé)r%rrorprmz*Cursor not available with given criteria: z, cs$g|]}ˆd|>@dkrˆ|‘qS)rrrg)rmr©ÚargsZ cursor_typergrhro­sz*MySQLConnection.cursor.<locals>.<listcomp>r­)rår^r-Ú
issubclassrr.rWrYrrr'r r!rr"rr#r&r$r%ÚKeyErrorrîryr )rdr%rrmrnrorprArgrurhrdcs\
ÿôÿÿýzMySQLConnection.cursorcCs| d¡dS)zCommit current transactionZCOMMITN)Ú_execute_queryrÝrgrgrhÚcommit°szMySQLConnection.commitcCs|jr| ¡| d¡dS)zRollback current transactionZROLLBACKN)rrryrÝrgrgrhÚrollback´szMySQLConnection.rollback)r$rFcCs| ¡| |¡dS)aExecute a query
 
        This method simply calls cmd_query() after checking for unread
        result. If there are still unread result, an InterfaceError
        is raised. Otherwise whatever cmd_query() returns is returned.
 
        Returns a dict()
        N)rårH)rdr$rgrgrhry»s    zMySQLConnection._execute_querycCs|jdd}| |¡| ¡S)z%Send a query which only returns 1 rowT)r%)rdrfZfetchone)rdr$rdrgrgrhr]Çs 
zMySQLConnection.info_querycCs8|ddkr|j |¡S|ddkr,t|ƒ‚tdƒ‚dS)a>Handle a MySQL Binary Protocol OK packet
 
        This method handles a MySQL Binary Protocol OK packet. When the
        packet is found to be an Error packet, an error will be raised. If
        the packet is neither an OK or an Error packet, InterfaceError
        will be raised.
 
        Returns a dict()
        rrr€zExpected Binary OK packetN)rIZparse_binary_prepare_okr/r*rMrgrgrhÚ_handle_binary_okÍs
 
  z!MySQLConnection._handle_binary_okcCsÈ|rt|ƒdkrtdƒ‚|ddkr.| |¡S|ddkrD| |¡S|ddkrXt|ƒ‚|j |¡}|rrt|tƒsztdƒ‚dg|}t    d|ƒD]}|j 
|j   ¡|j ¡||<qŽ| |j   ¡¡}|||fS)aýHandle a MySQL Result
 
        This method handles a MySQL result, for example, after sending the
        query command. OK and EOF packets will be handled and returned. If
        the packet is an Error packet, an Error exception will be raised.
 
        The tuple returned by this method consist of:
        - the number of columns in the result,
        - a list of tuples with information about the columns,
        - the EOF packet information as a dictionary.
 
        Returns tuple() or dict()
        rrrr¬r€zIllegal result set.N)r²r*r¶r÷r/rIr r…r r rrJr„r)rdrŽrr    rrörgrgrhÚ_handle_binary_resultÝs& 
 
 
ÿ
z%MySQLConnection._handle_binary_result)Ú statement_idrrFcCs0|j ||¡}d|_|jtj|ddd|_dS)z³Fetch a MySQL statement Result Set
 
        This method will send the FETCH command to MySQL together with the
        given statement id and the number of rows to fetch.
        F©râTN)rIZmake_stmt_fetchrrèrZ
STMT_FETCH)rdr~rrŽrgrgrhÚcmd_stmt_fetchszMySQLConnection.cmd_stmt_fetch)Ú    statementrFcCsÌ| tj|¡}| |¡}g|d<g|d<|ddkrxtd|dƒD]$}|d |j |j     ¡|j
¡¡qB|  |j     ¡¡|ddkrÈtd|dƒD]$}|d |j |j     ¡|j
¡¡q’|  |j     ¡¡|S)z£Prepare a MySQL statement
 
        This method will send the PREPARE command to MySQL together with the
        given statement.
 
        Returns a dict()
        r    Ú
parametersZ
num_paramsrZ num_columns) rèrZ STMT_PREPAREr|r r3rIrrJr„rr÷)rdrrŽrGÚ_rgrgrhÚcmd_stmt_prepares.
 
 ÿÿ ÿÿz MySQLConnection.cmd_stmt_preparerg)r~Údatar‚ròrFc
Cst|ƒ}i}|rxt|ƒD]^\}}t||tƒrd}zd||jk}Wntk
rXYnX| ||||¡|f||<q|js’|jr’t    j
dt d|j t j@rÄ|j ||t|ƒ|||j|j|j¡}    n"|jj||t|ƒ|||j|jd}    |jtj|    d}
| |
¡} | S)z"Execute a prepared MySQL statementTÚbr'r()Zconverter_str_fallback)rŽ)Úlistr2r…rÚmoderÜÚcmd_stmt_send_long_datar^r0rÖr×r1rOrrrIZmake_stmt_executeÚtupler•Z_converter_str_fallbackrèrZ STMT_EXECUTEr}) rdr~r…r‚ròZlong_data_usedÚparam_idrƒrZexecute_packetrŽrGrgrgrhÚcmd_stmt_execute1sP  þ ø ù    
z MySQLConnection.cmd_stmt_execute)r~rFcCs|jtjt|ƒdddS)zÃDeallocate a prepared MySQL statement
 
        This method deallocates the prepared statement using the
        statement_id. Note that the MySQL server does not return
        anything.
        FrN)rèrZ
STMT_CLOSErB©rdr~rgrgrhÚcmd_stmt_closeds
ýzMySQLConnection.cmd_stmt_close)r~r‹r…rFc    
Cs†d}d}zL| |¡}|rR|j |||¡}|jtj|dd|t|ƒ7}| |¡}qWn,tk
r€}ztdƒ|‚W5d}~XYnX|S)a.Send data for a column
 
        This methods send data for a column (for example BLOB) for statement
        identified by statement_id. The param_id indicate which parameter
        the data belongs too.
        The data argument should be a file-like object.
 
        Since MySQL does not send anything back, no error is raised. When
        the MySQL server is not reachable, an OperationalError is raised.
 
        cmd_stmt_send_long_data should be called before cmd_stmt_execute.
 
        The total bytes send is returned.
 
        Returns int.
        rìrF)rŽrâräN)    rërIZprepare_stmt_send_long_datarèrZSTMT_SEND_LONG_DATAr²rÜr-)    rdr~r‹r…rïÚ
total_sentrðrŽrçrgrgrhr‰qs(
ÿý z'MySQLConnection.cmd_stmt_send_long_datacCs| | tjt|ƒ¡¡dS)z–Reset data for prepared statement sent as long data
 
        The result is a dictionary with OK packet information.
 
        Returns a dict()
        N)r¶rèrZ
STMT_RESETrBrrgrgrhÚcmd_stmt_reset˜szMySQLConnection.cmd_stmt_resetc    Cs@z | | tj¡¡| ¡WdSttfk
r:YdSXdS)zÖResets the session state without re-authenticating
 
        Reset command only works on MySQL server 5.7.3 or later.
        The result is True for a successful reset otherwise False.
 
        Returns bool
        TFN)r¶rèrZRESET_CONNECTIONr[r,r-rÝrgrgrhrb¡s z$MySQLConnection.cmd_reset_connectioncCs"|jr| ¡n|jrtdƒ‚dS)z'Check whether there is an unread resultzUnread result foundN)Zcan_consume_resultsr!rr+rÝrgrgrhrå°s
z$MySQLConnection.handle_unread_result)NNNrrGNN)NN)NrNTr)F)FNN)NFNNN)FFF)N)    rHrHrHrGrHrHrHrHrH)NN)Frr)NNNNNN)r)rgrgr)Zr;Ú
__module__Ú __qualname__Ú__doc__rrMr~rr
rlr rrÚboolrr5r«r9r¨r†r·r3r‡r³r<rÐrÚrÛrcZ
disconnectrèrrñróÚpropertyrôr¶r7r÷rr:rr6r r;rrr!rªr>rHrrJrLrÞrQr=rRrTrVrWr\r“Úsetterr^r_rhrkrlr rrdrzr{ryr]r|r}r€r    r„r r?rŒrŽr‰rrbråÚ __classcell__rgrgrerhrDrs‚6/ø ÷ Qÿþ 5+þ |2
 ùø (ÿþ "
0-ü
û ú
ù ;ûú { þ *   öõ B
ýü /ù
ø M þ ' þ %ûú 3þ '    rD)Xr“r7r¥rurwr-rÖÚdecimalrÚiorÚtypingrrrrrr    r
r r r rrHrZ    abstractsrZauthenticationrÚ    constantsrrrrrrrÚ
conversionrrdrrrrrr r!r"r#r$r%r&r'Úerrorsr(r)r*r+r,r-r.r/r0Únetworkr1r2Zpluginsr3Úprotocolr4rAr5r6r7r8r9r:r;r<r=r>r?Úutilsr@rArBrCrDrgrgrgrhÚ<module>s.  4   $     <(
  4