,_ГddlmZddlZddlZddlZddlZddlZddlmZddl m Z ej d e n#e $reZ eZYnwxYwdZGddeZejd kr)ddlZddlZddlZGd d eZGd d eZnIejdkrddlZddlZddlZGdd eZn#edejGddeZGddeZ GddeZ!GddeZ"GddeZ#Gdde#Z$GddeZ%Gdd eZ&Gd!d"eZ'e e!e"d#Z(ee#e$e%e&e'd$Z)d%Z*Gd&d'eZ+d+d)Z,e-d*kr e,dSdS),)absolute_importN)comports) hexlify_codecc8|dkrtjndS)Nhexlify)r getregentrycs 7/usr/lib/python3/dist-packages/serial/tools/miniterm.pyr si-3555Tct|}|dkr%dtd|zSt|S)z)generate a readable description for a key z Ctrl+{:c}@)ordformatrepr) character ascii_codes r key_descriptionr!sAYJB!!#c((Z"7888Ir cHeZdZdZdZdZdZdZdZdZ dZ d Z d Z d S) ConsoleBasez8OS abstraction for console (input/output codec, no echo)ctjdkrtjj|_ntj|_tj|_dSN)r)sys version_infostdoutbuffer byte_outputoutputselfs r __init__zConsoleBase.__init__.s7  v % %"z0D  "zD j r cdS)z.Set console to read single characters, no echoNr"s r setupzConsoleBase.setup5r cdS)z Restore default console settingsNr&r"s r cleanupzConsoleBase.cleanup8r(r cdS)z"Read a single key from the consoleNr&r"s r getkeyzConsoleBase.getkey;str cl|j||jdS)zWrite bytes (already encoded)N)r writeflush)r# byte_strings r write_byteszConsoleBase.write_bytes?s4 {+++      r cl|j||jdS)z Write stringN)r!r.r/r#texts r r.zConsoleBase.writeDs2 $ r cdS)zCancel getkey operationNr&r"s r cancelzConsoleBase.cancelIr(r c.||SN)r*r"s r __enter__zConsoleBase.__enter__Ps  r c.|dSr8)r')r#argskwargss r __exit__zConsoleBase.__exit__Ts r N) __name__ __module__ __qualname____doc__r$r'r*r,r1r.r6r9r=r&r r rr+sBB!!!===///!!!  &&&r rntc$eZdZdZdZdZdZdS)Outz$file-like wrapper that uses os.writec||_dSr8)fd)r#rFs r r$z Out.__init__`s DGGGr cdSr8r&r"s r r/z Out.flushcs Dr c:tj|j|dSr8)osr.rF)r#ss r r.z Out.writefs HTWa r N)r>r?r@rAr$r/r.r&r r rDrD]sG22       ! ! ! ! !r rDc deZdZddddddddd d d Zd d ddddddddd ZfdZdZdZdZxZ S)ConsolezbOPzbOQzbORzbOSzb[15~zb[17~zb[18~zb[19~zb[20~zb[21~) ;<=>?rABCDzzzzzzz[2~z[3~z[5~z[6~) HPKMGORSIQcntt|tjj|_tjj|_ tjj dtjj dtj dkr"ttjdddkrd}ddlm}t'|dstj|j|_tjjj}tjjj}tjjj}|}||d tj||j|zdkr$||d |j|z||_t;jd t?t@j!"d |_#t;jd t?t@j$"d t@_$|j#t@_!d |j#_%dS) Ni10.iZ)rLPDWORDUTF-8replace)&superrLr$ctypeswindllkernel32GetConsoleOutputCP _saved_ocp GetConsoleCP _saved_icpSetConsoleOutputCP SetConsoleCPplatformreleaseintversionsplitctypes.wintypeswintypeshasattrPOINTERDWORDreSetConsoleModeGetConsoleMode GetStdHandlebyrefvalue _saved_cmcodecs getwriterrDrrfilenor!stderrencoding)r#"ENABLE_VIRTUAL_TERMINAL_PROCESSINGryr}r~rmode __class__s r r$zConsole.__init__s! '4 ) ) + + +$m4GGIIDO$m4AACCDO M " 5 5e < < < M " / / 6 6 6!!T))c(2B2D2D2J2J32O2OPQ2R.S.SV[.[.[5;2222222x33F'-~hn'E'EH$!'!7!F!'!7!F%}5B ~~''||C00&,t2D2DEEEJ!CCII"N<<#4#4djCe6efff%)DN3&*733C 8I8I8K8K4L4LiXXDK2)'223sz7H7H7J7J3K3KYWWCJCJ#*DK r cftjj|jtjj|j tjjtjjd|j dS#t$rYdSwxYw)Nrf) rjrkrlrqrnrrrpr}rrAttributeErrorr"s r __del__zConsole.__del__s M " 5 5do F F F M " / / @ @ @  &55fm6L6Y6YZ]6^6^`d`nooooo!    sA B"" B0/B0cV tj}|tdkrtdS|tdus|tdurO tj}|tdur |j|S|j|S#t $rYnwxYw|S)NT r)msvcrtgetwchunichrfncodesnavcodesKeyError)r#zcodes r r,zConsole.getkeys MOOr ??!"::%&))^^qF4LL'8'8%}q >>#'<#55#'=#66#H s0B B B%$B%ctjj}tjj|ddddS)Nrr)rjrkrlGetConsoleWindowuser32 PostMessageA)r#hwnds r r6zConsole.cancels?=)::<r?r@rrr$rr,r6 __classcell__rs@r rLrLis       + + + + +6      " D D D D D D Dr rLposixc6eZdZfdZdZdZdZdZxZS)rLctt|tj|_tj|j|_ tj |j tj dkr=tjtjjtj|_dStj|_dSr)rirLr$rstdinrrFtermios tcgetattroldatexitregisterr*rr getreaderr enc_stdin)r#rs r r$zConsole.__init__s '4 ) ) + + +i&&((DG(11DH ODL ) ) )&((!E!1#)2D!E!Eci!P!P!$r c@tj|j}|dtjztjztjz|d<d|dtj<d|dtj<tj|jtj |dS)Nrr) rrrFICANONECHOISIGVMINVTIME tcsetattrTCSANOW)r#news r r'z Console.setups{#DG,,CVw~o- = MCF#$CF7< $%CF7= !  dgw < < < < r?r@r$r'r,r6r*rrs@r rLrLs{ + + + + + = = =     9 9 9 D D D D D D Dr z9Sorry no implementation for your platform ({}) available.c$eZdZdZdZdZdZdS) Transformz&do-nothing: forward all data unchangedc|S)ztext received from serial portr&r3s r rxz Transform.rx r c|S)ztext to be sent to serial portr&r3s r txz Transform.txrr c|S)z(text to be sent but displayed on consoler&r3s r echozTransform.echorr N)r>r?r@rArrrr&r r rrsG00r rceZdZdZdZdS)CRLFzENTER sends CR+LFc.|ddS)N  rhr3s r rzCRLF.txs||D&)))r N)r>r?r@rArr&r r rrs)*****r rceZdZdZdZdZdS)CRzENTER sends CRc.|ddS)N rrr3s r rzCR.rx||D$'''r c.|ddS)Nrrrr3s r rzCR.txrr Nr>r?r@rArrr&r r rrs8((((((((r rceZdZdZdS)LFzENTER sends LFN)r>r?r@rAr&r r rrsr rceZdZdZededDZeddddZeZ dS) NoTerminalz0remove typical terminal control codes from inputc#FK|]}t|dv|d|zfVdS)  $N)r.0xs r zNoTerminal.s;]]qR\A\A\Avz?A\A\A\A\]]r r!$%$)rc6||jSr8) translateREPLACEMENT_MAPr3s r rz NoTerminal.rxs~~d2333r N) r>r?r@rAdictrangerupdaterrr&r r rr sx::d]]EE"II]]]]]O     444 DDDr rceZdZdZededDZedddddS) NoControlsz%Remove all control codes, incl. CR+LFc#$K|] }|d|zfV dS)rNr&rs r rzNoControls.s*>>qAvz?>>>>>>r ri#$rr)rrrN)r>r?r@rArrrrr&r r rrsk//d>>EE"II>>>>>O       r rceZdZdZdZeZdS) PrintablezMShow decimal code for all non-ASCII characters and replace most control codesc g}|D]}d|cxkrdksn|dvr||+|dkr3|tdt|zd|ddt|D|dd|S)N rrc3ZK|]&}tdt|zdz V'dS)i 0N)rr)rds r rzPrintable.rx..2s9UU!Q" 455UUUUUUr z{:d})appendrrextendrjoin)r#r4rr s r rz Printable.rx*s   Aa    &    AOO SQ001111UUv}}SQRVV?T?TUUUUUU wwqzzr N)r>r?r@rArrr&r r rr's*WW    DDDr rc$eZdZdZdZdZdZdS)Colorizez,Apply different colors for received and echoc"d|_d|_dS)Nzz) input_color echo_colorr"s r r$zColorize.__init__<s%$r c|j|zSr8)rr3s r rz Colorize.rxAs$&&r c|j|zSr8)rr3s r rz Colorize.echoDs%%r N)r>r?r@rAr$rrr&r r rr9sG66%%% '''&&&&&r rceZdZdZdZdZdS)DebugIOzPrint what is sent and receivedctjd|tj|S)Nz [RX:{!r}] rrr.rr/r3s r rz DebugIO.rxK? --d33444  r ctjd|tj|S)Nz [TX:{!r}] rr3s r rz DebugIO.txPrr Nrr&r r rrHs8)) r r)crlfcrlf)directdefault nocontrol printablecolorizedebugc2tjdg}tt t dD]R\}\}}}tjd|||||S td} t|dz }d|cxkrt|ks"ntjd_ ||}n#t$rYnwxYw|S)z Show a list of ports and ask the user for a choice. To make selection easier on systems with long device names, also allow the input of an index. z --- Available ports: rz--- {:2}: {:20} {!r} Tz#--- Enter port index or full name: rz--- Invalid index! ) rrr. enumeratesortedrrr raw_inputrulen ValueError)portsnportdeschwidindexs r ask_for_portrks0 J/000 E!*6(**+=+=q!A!A D$ 188D$GGHHH T >?? IIME****E ****   !7888+ r9r:writertransmitter_threadr<r=r%r'r"s r r=zMiniterm.startso  "+"2$+D"Q"Q"Q)-& %%''' r cd|_dS)zset flag to stop worker threadsFN)r/r"s r stopz Miniterm.stops  r c|j|sIt|jdr|j|jdSdS)z$wait for worker threads to terminater@N)rDrrzr&r@r1)r# transmit_onlys r rz Miniterm.joinsl $$&&& (t{M22 * '')))  % % ' ' ' ' ' ( (r c8|jdSr8)r&closer"s r rJzMiniterm.closes r ct|jgd|jDz}d|D|_t t |j|_dS)zFtake list of transformation classes and instantiate them for rx and txc(g|]}t|Sr&)TRANSFORMATIONS)rfs r z3Miniterm.update_transformations..s4=T=T=TAB>MQ=O=T=T=Tr c"g|] }| Sr&r&)rts r rOz3Miniterm.update_transformations..s"@"@"@11133"@"@"@r N)EOL_TRANSFORMATIONSr*r+tx_transformationslistreversedrx_transformations)r#transformationss r r,zMiniterm.update_transformationssq.tx89=T=TFJl=T=T=TT"@"@"@"@"@"&x0G'H'H"I"Ir rhcX||_tj|||_dS)zset encoding for received dataN)r(rgetincrementaldecoderr2r#rerrorss r set_rx_encodingzMiniterm.set_rx_encodings*&@&6x@@HHr cX||_tj|||_dS)z!set encoding for transmitted dataN)r)rgetincrementalencoder tx_encoderrZs r set_tx_encodingzMiniterm.set_tx_encodings*'@&6x@@HHr c<tjd|jtjd|jjrdnd|jjrdnd|jjrdnd tjd|jjrdnd|jj rdnd|jj rdnd|jj rdndn#tj $rYnwxYwtjd|jj rdndtjd|jjrdndtjd |jtjd |jtjd |jtjd d |jdS)z$Write current settings to sys.stderrzK --- Settings: {p.name} {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} pz&--- RTS: {:8} DTR: {:8} BREAK: {:8} activeinactivez---- CTS: {:8} DSR: {:8} RI: {:8} CD: {:8} z--- software flow control: {} z--- hardware flow control: {} --- serial input encoding: {} --- serial output encoding: {} z --- EOL: {} --- filters: {} rN)rrr.rr&rtsdtrbreak_conditionctsdsrricdSerialExceptionxonxoffrtsctsr(r)r*upperrr+r"s r dump_port_settingszMiniterm.dump_port_settingss^ hookp    BII 8XXj 8XXj4 DXX*GG H H H  J  MTT![_<*![_<*![^;![^; >> ? ? ? ? %    D  :AAdkNaBq((gqrrsss :AAdkN`Bp((fpqqrrr :AA$BUVVWWW ;BB4CWXXYYY //0@0@AABBB ,33CHHT\4J4JKKLLLLLsA-DDDc |jr|jr|j|jjpd}|ru|jr|j|nS|j |}|j D]}| |}|j ||jr |jdSdSdSdS#tj $r"d|_|jwxYw)zloop and copy serial->consolerFN)r/r0r&r in_waitingr'r%r1r2decoderVrr.rpr6)r#datar4transformations r r;zMiniterm.readers3 * 1!3 1{'' (>(C!DD1x1 006666#55d;;.2.E;;N#1#4#4T#:#:DD **4000* 1!3 1 1 1 1 1 1 1 1 1%   DJ L   ! ! !  s B9C1C4crd} |jr |j}n#t$rd}YnwxYw|jsdS|r||d}n||jkrd}n||jkr|dS|}|jD]}| |}|j |j ||jr;|}|jD]}||}|j ||jdSdS#d|_xYw)z Loop and copy console->serial until self.exit_character character is found. When self.menu_character is found, interpret the next key locally. FTN)r/r%r,KeyboardInterrupthandle_menu_keyr.r-rFrSrr&r.r_encoder)r# menu_activer r4ry echo_texts r rCzMiniterm.writers   * 6 ++--AA(AAAzE6((+++"'KK$---"&KK$---IIKKKED*.*A77-0066K%%do&<&chhYcdd e e e e e &[[    &[[,--E++dh''!+Cc%jj  SzDH J  0778H8HII J J J  ' ' ) ) ) ) ) &[[  " " " " " &[[  # # % % % % %$YY         $YY         $YY  " " " " " #XX#)#3DK  # # % % % % % #XX#)#3DK  # # % % % % % $YY!'!3DK   # # % % % % % $YY!'!2DK   # # % % % % % $YY!'!3DK   # # % % % % % $YY!'!4DK   # # % % % % % $YY!'!3DK   # # % % % % % #XX#)#6DK  # # % % % % % #XX#)#6DK  # # % % % % % #XX#)#ADK  # # % % % % % $YY#$8DK   # # % % % % % $YY"#s(DK   # # % % % % % $YY IIKKKKK J  AHHYZI[I[\\ ] ] ] ] ]r ctjdtj|j5tjd}|rE t|d5}tjd | | d}|snS|j ||j tjdk dddn #1swxYwYtjd |nJ#t$r=}tjd ||Yd}~nd}~wwxYwddddS#1swxYwYdS) z,Ask user for filenname and send its contentsz --- File to upload: rrbz--- Sending file {} --- TirbNz --- File {} sent --- z"--- ERROR opening file {}: {} --- ) rrr.r/r%rreadlinerstripopenrrr&IOError)r#filenamerNblockes r rzMiniterm.upload_file}sR 1222  \ ` `y))++226::H ` `h-- 2 (()D)K)KH)U)UVVV2$%FF4LLE#(& % K--e444 K--///J,,S1112!& 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2J$$%?%F%Fx%P%PQQQQ```J$$%J%Q%QRZ\]%^%^________` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` ` `sa5G ;E5 BD7+ E57D; ;E5>D; ?5E54G 5 F<?3F72G 7F<<G  GGc tjdtjddt t Dtjdd|j|j 5tj }dddn #1swxYwY|r]|D]?}|t vr4tjd|n@||_|tjdd|jdS) zchange the i/o transformationsz --- Available Filters: rc3HK|]\}}d||VdS)z--- {:<10} = {.__doc__}Nrrkvs r rz)Miniterm.change_filter..sJ#9#91 ( . .q! 4 4#9#9#9#9#9#9r z$ --- Enter new filter name(s) [{}]: rNz--- unknown filter: {!r} rh)rrr.rrrMitemsrr+r%rrlowerrwr,)r# new_filtersrNs r rzMiniterm.change_filters 5666 #9#9446677#9#9#999 : : : @GGQUQ]H^H^__``` \ ? ?),,..4466<<>>K ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?  .  . .O++J$$%A%H%H%K%KLLLE, + ++--- ,33CHHT\4J4JKKLLLLLsAD  D$'D$ctjd|j|j5tj}dddn #1swxYwY|r tj || || |nB#t$r5tjd|YnwxYwtjd|jtjd|jdS)z"change encoding on the serial portz# --- Enter new encoding name [{}]: Nz--- invalid encoding name: {} rfrg)rrr.rr(r%rrstriprlookupr\r` LookupErrorr))r# new_encodings r rzMiniterm.change_encodings ?FFtGZ[[\\\ \ 8 89--//5577L 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8  3 3 l+++$$\222$$\2222  Y Y Y   !B!I!I,!W!WXXXXX Y :AA$BUVVWWW ;BB4CWXXYYYYYs#1A<<BB C C<7D<DDDDc|j5 t}n#t$rd}YnwxYwdddn #1swxYwY|r||jjkrr||j} tj|d}|||jj |_ |jj |_ | |jj |_ |j ||_tjd|jjn]#t$$rP}tjd|| Yd}~nd}~wwxYw|dSdSdS)z;Have a conversation with the user to change the serial portNT) do_not_openz--- Port changed to: {} --- z#--- ERROR opening new port: {} --- )r%rr|r&rrAgetSettingsDictserial_for_urlapplySettingsDictrirjrrkrJrrr.r Exceptionr>)r#rsettings new_serialrs r rzMiniterm.change_ports \   #~~$                     !DDK,,,      {2244H [#24TJJJ ,,X666!% !% !!!-1[-H *  !!###(    !@!G!G HX!Y!YZZZZ  # # #   !G!N!Nq!Q!QRRR  """""""" #    + ! !,,s>77 (7(7;;A2E F-AF((F-c||jtjd|jjd}|jjstjdt|j |j }||j kr| nw|dvrd}np |jnI#t$r<}tjd|Yd}~nd}~wwxYw|jj|r|dS|tjd |jjdS) zl open port temporarily, allow reconnect, exit and port change to get out of the loop z --- Port closed: {} --- FzC--- Quit: {exit} | p: port change | any other key to reconnect --- )exitrTz--- ERROR opening port: {} --- Nz--- Port opened: {} --- )rAr&rJrrr.rris_openrr-r%r,rFrrrr>)r#do_change_portrrs r rzMiniterm.suspend_ports   6==dk>NOOPPP+% O J  cjj$T%899k;; < < < ##%%AD''' d!% O   """" O O O   !C!J!J1!M!MNNNNNNNN O+% O  S            J  8?? @PQQ R R R R Rs>D E"2EEcdttddt|jt|jtdtdtdtdtdtd td td td  S)zreturn the help textab --- pySerial ({version}) - miniterm - help --- --- {exit:8} Exit program (alias {menu} Q) --- {menu:8} Menu escape key, followed by: --- Menu keys: --- {menu:7} Send the menu character itself to remote --- {exit:7} Send the exit character itself to remote --- {info:7} Show info --- {upload:7} Upload file (prompt will be shown) --- {repr:7} encoding --- {filter:7} edit filters --- Toggles: --- {rts:7} RTS {dtr:7} DTR {brk:7} BREAK --- {echo:7} echo {eol:7} EOL --- --- Port settings ({menu} followed by the following): --- p change port --- 7 8 set data bits --- N E O S M change parity (None, Even, Odd, Space, Mark) --- 1 2 3 set stop bits (1, 2, 1.5) --- b change baud rate --- x X disable/enable software flow control --- r R disable/enable hardware flow control VERSIONzunknown versionrrrrrrrrr) rvrmenurirjbrkrinfouploadrfilterr*)rgetattrr&rr-r.r"s r rzMiniterm.get_help_texts0 F769.?@@ 344 344v&&v&&v&&''''!&))''!&))v&& ( (1# (r N)Fr r&)Fr)r>r?r@rAr$r>rAr=rFrrJr,r\r`rtr;rCr}rrrrrrrr&r r r!r!s $%%%$$$((((JJJIIII IIII MMM2&$$$LT^T^T^l```,MMM&ZZZ * * *!!!<SSS>&(&(&(&(&(r r!%c ddl}|d}|ddd||d dtd | |d }|d gdddd|dddd|dddd|dtd||dtd||dd d!d"d#$|d%dd&d|d'}|d(d)dd*d|d+d,d-d.d/0|d1d2d3d4d5g6|d7gd8d9d:d;|d}|d?td@dAdBC|dDtd@dEdFC|dG}|dHdIddJd|dKddLd|}|j|jkr|dM|j rdN|j vrtj dOtj dP dQttDtj dPtjdR|j }ndSg} |j |jdTkru t'|_|js|dUnD#t($r7tj dP|dVYnwxYw t+j|j|j|j|j|jd#W} t7| dXsdR| _|jN|js;tj dY|jrdZnd[|j| _|j N|js;tj d\|j rdZnd[|j | _ tC| t*j"r |j#| _#| $n#t*j%$rm} tj d]|j| |j&r|j'stjdRndT|_Yd} ~ nd} ~ wwxYw8tQ| |j)|j*+|^} tY|j| _-tY|j| _.|j/| _/| 0|j1| 2|j1|jstj d_| j`tj datg| j-tg| j.tg| j.tgdb| 4 | d#n#t($rYnwxYw|jstj dc| | 5dS)dzCommand line tool, entry pointrNz9Miniterm - A simple terminal program for the serial port.) descriptionrrQz(serial port name ("-" to show port list))nargshelprrz#set baud rate, default: %(default)s)rtyperrz port settingsz--parity)NEr[r]rYc*|Sr8rsr s r r zmain..Gqwwyyr z*set parity, one of {N E O S M}, default: Nr)choicesrrrz--rtscts store_truez)enable RTS/CTS flow control (default off)F)actionrrz --xonxoffz*enable software flow control (default off)z--rtsz2set initial RTS line state (possible values: 0, 1))rrrz--dtrz2set initial DTR line state (possible values: 0, 1)z--non-exclusive exclusive store_falsez disable locking for native portsT)destrrrz--askz"ask again for port when open failsz data handlingz-ez--echozenable local echo (default off)z --encodingserial_port_encodingCODECzXset the encoding for the serial port (e.g. hexlify, Latin1, UTF-8), default: %(default)srg)rmetavarrrz-fz--filterrNAMEzadd text transformation)rrrrz--eol)rrrc*|Sr8rr s r r zmain..rr zend of line moderz--rawz)Do no apply any encodings/transformationshotkeysz --exit-charNUMzWUnicode of special character that is used to exit the application, default: %(default)sr#)rrrrz --menu-charz_Unicode code of special character that is used to control miniterm (menu), default: %(default)sr$ diagnosticsz-qz--quietzsuppress non-error messagesz --developzshow Python traceback on errorz.--exit-char can not be the same as --menu-charrzAvailable filters: rc3HK|]\}}d||VdS)z{:<10} = {.__doc__}Nrrs r rzmain..sJ'='=Aq&,,Q22'='='='='='=r rr-zport is not givenz"user aborted and port is not given)rrrrqrr@z--- forcing DTR {} rdrez--- forcing RTS {} zcould not open port {!r}: {} )rr*r+zP--- Miniterm on {p.name} {p.baudrate},{p.bytesize},{p.parity},{p.stopbits} --- rbz6--- Quit: {} | Menu: {} | Help: {} followed by {} --- z --- exit --- )6argparseArgumentParser add_argumentruadd_argument_group parse_args menu_char exit_charerrorrrrr.rrrMrrrrr|r&rrrrrrqrztimeoutrjquietrri isinstanceSerialrrrpdevelopaskr!rr*rrr-r.r'r\rr`rr=rJ) default_portdefault_baudrate default_rts default_dtrrparsergroupr;r+r4rminiterms r mainr-sOOO  $ $O%QQF  7     2 """  % %o 6 6E ))) 9   8    9     A     A     /   1   % %o 6 6E  h .    # g   j &  $$$    8   % %i 0 0E   f    n   % %m 4 4E  i *    -      D ~'' EFFF {  T[ J  3 4 4 4 J  TYY'='="?#8#8#:#:;;'='='=== > > > J  T " " " HQKKK++. 9  S 0 0 6(NN y6LL!4555 % C C C   &&& ABBBBB C # $3  {{  """O?M:: ,*+'x#zjJ$$%;%B%BtxCg88]g%h%hiii&*h#x#zjJ$$%;%B%BtxCg88]g%h%hiii&*h#/6=99 ;,0N)  " " " %   J  =DDTYPQRR S S S| 8    K.` Y HNN   H %T^44H$T^44H8HL T6777 T6777 :& lssot    RYY H3 4 4 H3 4 4 H3 4 4 F # # %% & & &  NN  d      :- +,,, MMOOO NNs>5N%%>O&%O&*D.TV(A#VV\ \*)\*__main__)NrNN). __future__rrrIrr9r&serial.tools.list_portsr serial.toolsrrr NameErrorinputchrrrobjectrr8rrjrsrDrLrrrNotImplementedErrorrrrrrrrrrrrRrMrr!rr>r&r r rsH'&&&&&  ,,,,,,&&&&&&QQRRR III FFF *****&***Z7d??MMMMMMOOO ! ! ! ! !f ! ! !RDRDRDRDRD+RDRDRDRDhWMMMNNNLLLDDDDD+DDDD>  CJJ3<XX Z ZZ        *****9***((((((((                   $ & & & & &y & & &     i   &    2c(c(c(c(c(vc(c(c(R aaaaH zDFFFFFs< AA