!oiddlZddlZddlZddlZddlmZddlmZddlm Z ddl m Z ej e ZejZdadadadZdZGd d eZGd d eZGd deZdS)N) SubElement)QObjectCreator) Properties)UIFilecd}|dD]C}|d\}}ttjj|}||}>||z}D|S)z5 Convert a C++ alignment to the corresponding flags. N|::)splitgetattrQtCoreQt AlignmentFlag) alignment align_flagsqt_align_aligns BC:\PYTHON\Scheduler\python\Lib\site-packages\PyQt6/uic/uiparser.py_parse_alignmentr8slKOOC((!!nnT** 8 /::  KK 5 KK c|jd}|jd}|jd}|||dSdt|fSt|}t|}t|jdd}t|jd d}|||||fS||||t|fS) z Return either (), (0, alignment), (row, column, rowspan, colspan) or (row, column, rowspan, colspan, alignment) depending on the type of layout and its configuration. The result will be suitable to use as arguments to the layout. rowcolumnrNrrowspanrcolspan)attribgetrint)elemrrrrrs r_layout_positionr"Hs +//% C [__X & &F  ,,I {fn  2#I..// c((C [[F$+//)Q//00G$+//)Q//00GVWg.. '+;I+F+F GGrc6eZdZdZdZdZdZdZdZdZ dS) WidgetStackNc td|d|||t |t jr ||_dSdS)Nzpush  ) DEBUG metaObject className objectNameappend isinstance QtWidgetsQWidget topwidget)selfitems rpushzWidgetStack.pushis doo//99;;;;"oo///1 2 2 2 D dI- . . "!DNNN " "rct|}td|d||S)Nz pop layout r&)listpopr'r(r)r*)r0layouts r popLayoutzWidgetStack.popLayoutpsa$ F$5$5$7$7$A$A$C$C$C$C$*$5$5$7$7$79 : : : rcvt|}td|d|t |D]%}t|tj r ||_ n&d|_ td|j |S)Nz pop widget r&znew topwidget ) r4r5r'r(r)r*reversedr,r-r.r/)r0widgetr1s r popWidgetzWidgetStack.popWidgetvs$ F$5$5$7$7$A$A$C$C$C$C$*$5$5$7$7$79 : : :TNN " "D$ 122 !% "DN DNN4555 rc|dSNrr0s rpeekzWidgetStack.peeks BxrcBt|dtjSr=)r,r-QLayoutr?s r topIsLayoutzWidgetStack.topIsLayouts$r(I$5666rc t|dtjurdSt|dkrdS|d}t |tjoht|tjtjtjtjtj tj tj tj fvS)Nr>F) typer-r.lenr, QMainWindowQStackedWidgetQToolBox QTabWidget QScrollAreaQMdiAreaQWizard QDockWidget)r0parents rtopIsLayoutWidgetzWidgetStack.topIsLayoutWidgets R>>!2 2 25 t99q==5b&)"344'f%("$%"!%N':' 'r) __name__ __module__ __qualname__r/r2r7r;r@rCrRrrrr$r$gssI"""   777'''''rr$ceZdZdZdZdS) ButtonGroupzM Encapsulate the configuration of a button group and its implementation. c"d|_d|_dS)z Initialise the button group. TN) exclusiveobjectr?s r__init__zButtonGroup.__init__s rN)rSrTrU__doc__r[rrrrWrWs-rrWc eZdZdZdZdZ d'dZdZdZdZ d Z d Z d Z d Z d ZdZdZedZdZdZdZdZdZeee e eeeeeed ZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&ed%Z'd&S)(UIParserct||_t|j||||_|a|a|a|dSN)rfactoryrwpropsr QtGuir-reset)r0 qtcore_module qtgui_moduleqtwidgets_module creatorPolicys rr[zUIParser.__init__sO%m44  }l "" $  rc |j|}n#t$rd|j|<|cYSwxYw|dz }||j|<d||fzS)zUIParser.uniqueName(string) -> string Create a unique name from a string. >>> p = UIParser(QtCore, QtGui, QtWidgets) >>> p.uniqueName("foo") 'foo' >>> p.uniqueName("foo") 'foo1' rrz%s%i) name_suffixesKeyError)r0namesuffixs r uniqueNamezUIParser.uniqueNamesn '-FF   '(D t $KKK  ! #)4 v&&s ))c|jn#t$rYnwxYwd|_t |_i|_ddd|_g|_d|_ i|_ dS)Nr>)spacingmargin) rbrdAttributeErrortoplevelWidgetr$stackrjdefaultsactionscurrentActionGroup button_groupsr?s rrdzUIParser.resetsw [   ###tt#" ]] $&"55  "&s  ((Tc||jdp|dd}|d}i}n|rd}t |}n|f}i}|j|||||} |j| || ||rt|j || | S)Nrlrr)rQ) ctor_args ctor_kwargs is_attribute) rnrrlowerdictracreateQtObjectrb setProperties setObjectNamesetattrrs) r0 class_namerQbranchr|parent_is_optional object_namerzr{objs r _setupObjectzUIParser._setupObjectsoo !!&))CZ^-A-A-C-CEE  >IKK  If---KK IKl))*k#)*++ !!#v... +&&&  ; D'c : : : rc`|dD]}|jd|kr|cSdS)Npropertyrl)findallr)r0r!rlprops r getPropertyzUIParser.getPropertysDLL,,  D{6"d** +trc Pd|_d|_d|_g|_d|_|jddd}|dkrd}|jj}t|tj tj tj tjtjtjtjfrd}|j||||t|jjtjr||d?|jjt/|d||d ?|jjt/|d |||j}t|tjr+||d |nt|tjrT||d | ||d |!n-t|tj"r|j#$|d}| |j%}n#tL$r|}YnwxYw|sd} |j'|}n(#tP$rtSx}|j'|<YnwxYw|j*~|j+,d||j-f|_*t]|j-||j*|j*/||j0s|j*1d|j*2||j!|3|jd|_|j4r|j5}|jd} t|tj6r1|7| d|8| |n|j9|g| R|jj} t| tjr|j#$|d} | 1| :|| |j#$|dn/| :||j#$|d|j#$|d} | +| ;| <|| dSdSt| tjr|j#$|d} | 1| =|| |j#$|dn/| =||j#$|d|j#$|d} | +| >| <|| dSdSt| tjr| ?|dSt| tjr| 9|dSt| tj tj fr| 7|dSt| tj@rt|tjBkr| C|dSt|tjDr|j#$|d} | | E|n| E| ||j#$|d}|r| F|dSdSt|tjGr| H|dSt|tjIr| J|dSt|tj rR|j#$|d}| KtjMN||dSdSdS)Nrclassr .LineQFrame columnCountrrowCountrheaderhorizontalHeaderverticalHeader buttonGroup QButtonGroup)rzFlayout-positioniconlabeltoolTiptitle toolBarArea toolBarBreakdockWidgetArea)Ocolumn_counter row_counteritem_nr itemstacksorting_enabledrreplacertr/r,r-rPrNrMrJrKrLrOr2r QTableWidgetrsetColumnCountrHr setRowCounttraverseWidgetTreer; QTreeViewhandleHeaderViewr QTableViewrrQAbstractButtonrb getAttributestringrrrxrkrWrZrarrsrrrY setExclusive addButtonsetSortingEnabledrCr@ QFormLayout setWidget_form_layout_role addWidgetaddItemsetItemToolTipindexOfaddTab setTabToolTipaddPagerIrGr.setCentralWidgetQToolBar addToolBarinsertToolBarBreakQMenuBar setMenuBar QStatusBar setStatusBar addDockWidgetr rDockWidgetArea)r0r! widget_classrQr:bg_i18nbg_namebglaylpr/rtooltiptbAreatbBreakdwAreas r createWidgetzUIParser.createWidgets^ #{7+33D#>> 6 ! !#L% fy4i6H(4i6N(193G(02 3 3 F )),EEFFF dj*I,B C C Km44< $33C X8N8N4O4OPPPj119 $00T\\%5H5H1I1IJJJ %%%%%'' fi1 2 2+ ,  ! !$&--// B B B B  4 5 5( ,  ! !$(:++-- / / /  ! !$(8))++ - - - - 9 : :" ,k..t]CCG"&%nGG%&&&%GGG&,+GE+G4BBEEE7B}}DB+G444E9$ $ ; ;N#0C/F!<!H!HBID/")DDDI++G444<6 ..u555 ##F+++   +  $ $T%9 : : :#'D : ! ! # # +*//##C./B#y455 + beT%;%;B%?%?HHHH f*r****J( i!3 4 46 ;++D&99D!!&$ 0H0Hw0W0WXXXX!!&$+*B*B4*Q*QRRRk..tY??G"(():):6)B)BGLLLLL#" 9#7 8 8+ ;++D&99D  t{/G/Gg/V/VWWWW  )A)A$)P)PQQQk..tY??G"'' (9(9&(A(A7KKKKK#" 9#4 5 5   f % % % % %  9#; < <    ' ' ' ' '  I$99;P#Q R R    ' ' ' ' '  9#8 9 9 F||y000**622222FI$677 11$ FF>((0000((888+224HH9008888899FI$677 $$V,,,,,FI$899 &&v.....FI$9:: 11$8HII'' (@(@(H(H     -  (  s$K K&%K&. K<<"L! L!c|j||dz}||||j||dz}||||j||dz}||||j||dz}||||j||dz}||||j||dz}||||j||dz}|||dSdS)NVisibleCascadingSectionResizesDefaultSectionSizeHighlightSectionsMinimumSectionSizeShowSortIndicatorStretchLastSection) rbr setVisiblesetCascadingSectionResizessetDefaultSectionSizesetHighlightSectionssetMinimumSectionSizesetSortIndicatorShownsetStretchLastSection)r0r!rlrvalues rrzUIParser.handleHeaderViews ((ti/?@@     e $ $ $ ((t6O/OPP    - -e 4 4 4 ((t6J/JKK    ( ( / / / ((t6I/IJJ    ' ' . . . ((t6J/JKK    ( ( / / / ((t6I/IJJ    ( ( / / / ((t6J/JKK    ( ( / / / / /  rcX|d}|d}||d}nt|t|f}|j|dtjjj}tjjj|f}|j|dtj j j kr|d|df}|j d|d ||zd }|jr|j}|jd } t)|tjr2|| d|| |dS|j|g| RdSdS) Nzproperty/size/widthzproperty/size/heightrsizeType orientationrr QSpacerItem spacerItemFrzr|r)findtextr rbrr- QSizePolicyPolicy ExpandingMinimumr r Orientation HorizontalrarrnrtrCr@rr,rsetItemrr) r0r!widthheight size_argsrpolicyspacerrrs r createSpacerzUIParser.createSpacers 344566 =FNIIUS[[1I;**4%,688'.6A ; " "4 7 769;P;[ [ [AYq )F,,] --V9K"-$$ : ! ! # # )*//##C./B#y455 ) BqE4#9#9"#=#=vFFFFF F(R(((((( ) )rc|jrdn |jd}|j|d|}|j|d|}|j|d|}|j|d|}|j|d|}|jr |dkrd}|dkrd}|dkrd}|dkrd}|dks|dks |dks|dkrt |dd }t|t |d _t|t |d _t|t |d _t|t |d _|j|d |jd }|j|d |} |j|d|} | dks| dkrVt |dd }t| t |d _t| t |d _|j d} |jrd} n |jj } d|j vr$| dd |j d<|j | | | |d|||j} ||| |jr|j}|j d}t%|t&jr2||d||| dS|j| g|RdSdS)Nr>rq leftMargin topMargin rightMargin bottomMarginrr pyuicMargins)rlnumberrphorizontalSpacingverticalSpacing pyuicSpacingrrlrFrr)rtrCrurbrrRrstrtextrr/r}r2rrr7configureLayoutr@r,r-r setLayoutr addLayout)r0r!rqlefttoprightbottomcmerphorizvert classnamerQr6 top_layoutrs r createLayoutzUIParser.createLayouts z--//LT]85L((x@@{&&t\6BBk%%dK@@ ''mVDD((~vFF : ' ' ) ) &axxQwwaqyy!%zzA6 199qEQJJ&A++T:NCCCC-0YYJsH % % *-0XXJsH % % *-0ZZJsH % % *-0[[JsH % % *+))$  i(** ''.A7KK{&&t->HH A::T:NCCCC-0ZZJsH % % *-0YYJsH % % *K( : ! ! # # *FFZ)F  $ $"+ABB-"5"5"7"7DK  !!)VT+0"22 3 3 3 %%%%%'' T6*** : ! ! # # 2**J./B*i&;<< 2$$RUD,B,B2,F,FOOOOO$ $V1b111111 2 2rct|tjrr||d|j||d|j||d|j||d|jdSt|tjr||d|j dSdS)Ncolumnminimumwidthrowminimumheight columnstretch rowstretchstretch) r,r- QGridLayoutsetArraysetColumnMinimumWidthsetRowMinimumHeightsetColumnStretch setRowStretch QBoxLayout setStretch)r0r!r6s rrzUIParser.configureLayouts fi3 4 4 > MM$ 40 2 2 2 MM$ 2. 0 0 0 MM$1H I I I MM$ f.B C C C C C  4 5 5 > MM$ 6+< = = = = = > >rc|j|}|rIt|dD](\}}t |}|dkr |||'dSdS)N,r)rr enumerater r )r0r!rlsetterarrayidxrs rrzUIParser.setArrays %%  '' C(8(899 ' ' UE 199F3&&&  ' ' ' 'rc|jdkr<|jd|j|_|ddSdS)Nr__sortingEnabledF)rrainvokeisSortingEnabledrr)r0ws rdisableSortingzUIParser.disableSorting"sT <1  #'<#6#67I&$($(D   & & & & &  rc |jr4t||djd<||dS|jj}t |tjr|j |d}|j |d}|r| |dn| d| |j |nt |tjrN|||d||j|j }| |nnt |tjr|jr!|jd\}}|jd\}}n |}|j }|jdd t-|jz|fd }|j dkrA|js:|jd |j|_|d |j||j fd|_ ||} |jd dD]\} } | | } d} |dD]S} |j | }| jd}|dkr| d z } |r| | |N|dkr|!| |k|dkr|"| ||dkr|#| ||dkr|$| ||dkr|%| ||dkr|&| ||dkr|'| ||dkr|(|7|dkr|)| |U|||j*\}|_ nt |tj+r~tY|jd}tY|jd}|||d||j||}|-||||xj d z c_ dS)NrrrrQListWidgetItemr>QTreeWidgetItemzitem_%dFrr'rrrl statusTipr whatsThisfont background foregroundflags checkStaterrQTableWidgetItem).rtrCr"rrr/r,r- QComboBoxrbrr setItemTextr QListWidgetr+createWidgetItemr1 QTreeWidgetrrarrHr(r)rrr+ topLevelItemchildrconvertsetText setStatusTip setToolTip setWhatsThissetFontsetIcon setBackground setForegroundsetFlags setCheckStater5rr r)r0r!r*rrr1rQr nr_in_roottitmr> nr_in_parentrrc_prop c_prop_namercols r handleItemzUIParser.handleItem(s : ! ! # #X 0@0F0FDGN, -  # #D ) ) ) ) ) $A!Y011P *{..tV<<{..tV<<"IIdB''''IIbMMM dlD1111Ay455E *##A&&&,,->af && $Ay455? *>. $r 2IFA$(N1$5MAzzF!%J|223D!C$7$77F:%*3,,<1$$T^$+/<+>+>?QSTSe+f+fD(''...%%tT\&:;;;  ~~j11+/>!""+=44'E<::l33DD LL44;;D![0066F"&+f"5K"f,,! !9 LL888$ 33))&&9999$ 117777$ 33))&&9999$.. VV4444$.. VV4444$ 44**66::::$ 44**66::::$// f----$ 44**66:::''---"&."4"4"6"64<<Ay566 *$+e,--$+h/00##A&&&,,-?qvS"" #sD))) LLA LLLLrch|j|jj|jdfdS)Nrl)rvr+rtr/rr0r!s r addActionzUIParser.addActions/ TZ14;v3FGHHHHHrcD|D]}|t|tsdSdS)z; Return True if any argument appears to be an i18n string. NTF)r,r)argsas rany_i18nzUIParser.any_i18ns3  A}Z3%7%7}tturc|j|dd}|j}||d}||d}||d} ||d} |||| | r|jd|||r|||r||| r|| | r| | ||d} | r| | ||d } | r| | ||d } | r| | ||d }|r| |||d }|r||||d }|r||||d}|r|||S)z( Create a specific type of widget item. r1F)r|rr0rr1 textAlignmentr2rr3r4r5r6)rarrbrrWr(r@rArBrCsetTextAlignmentrDrErFrGrHrI)r0 item_typer!getter getter_argsr1propsr status_tiptool_tip whats_thistext_alignmentr2rr3r4r5 check_states rr;zUIParser.createWidgetItemsz|**9f"+$$    v..&&t[99 $$T955&&t[99 ==z8Z @ @ = L   < < <   LL     *   j ) ) )  & OOH % % %  *   j ) ) )**4AA  2  ! !. 1 1 1  v..   LL     v..   LL   &&t\::  +   z * * *&&t\::  +   z * * *!!$00  ! MM% ''l;;  ,   { + + + rc|jj}t|tjr`|j}|j}||d}|r(| ||||d}|r(| ||||d}|r(| ||||d}|r(| ||||d} | r(| || ||d} | r(||| ||d} | r(||| ||d} | r(||| ||d } | r(||| |xjd z c_dSt|tjrt'|d kr|jd krO|d ||j|j}||j||xjd z c_dS|jdkrS|d ||j|j}||j||xjd z c_dSdSdSdS)Nrr0rr1rYr2rr3r4rrrr7r)rtr/r,r-r<rbrr headerItemr@rArBrCrZrDrErFrGrrHtagr;horizontalHeaderItemsetHorizontalHeaderItemverticalHeaderItemrsetVerticalHeaderItem)r0r!r*r^rOrr_r`rarbr2rr3r4r1s r addHeaderzUIParser.addHeadersg J  a. / /5 *KE%C$$T622D 2 &&sD111**4==J = ++C<<<((y99H 9 ))#x888**4==J = ++C<<<"..t_EEN E //^DDD$$T622D 2 &&sD111$$T622D 2 &&sD111**4>>J > ,,S*===**4>>J > ,,S*===   1 $     91 2 2 *4yyA~~8x''001CT2D4GIID--d.A4HHH''1,''''X&&001CT0$2BDDD++D,4+> F F F F Frc|d|j|d}||_||d|_dS)N QActionGroupFr)rrsrwr)r0r! action_groups rcreateActionGroupzUIParser.createActionGroupsR((9L)00 ". %%%"&r) r: addactionr6rr1action actiongrouprrzorderct|D]2} |j|j}n#t$rY"wxYw|||3dSr`)iterwidgetTreeItemHandlersrfrk)r0r!r>handlers rrzUIParser.traverseWidgetTree+sn$ZZ ! !E 5ei@     GD%  ! !s & 33c|jd}|jd}|sF|}|dr |dd}|d|ddz}||||_|j|t d|j|j |j||j |j| ||j |||dS)z( Handle the top-level element. rrlQrNrztoplevel widget is %s)r startswithr}createToplevelWidgetrsrr'r(r)rbrrtr2rr; addActions setBuddiessetDelayedProps)r0elcnamewnames r_handle_widgetzUIParser._handle_widget4sb '" &! 1E$$ "abb !HNN$$uQRRy0E"77uEE ))%000 %!,,..88:: < < < !!$"5r::: +,,, ###    rc|jD]\}}|dkr| td||t |j|}t |tjr(| | t |tj s| |dS)N separatorzadd action %s to %s) rv addSeparatorr'r*r rsr,r-QMenurS menuActionrcrs)r0r: action_name action_objs rrzUIParser.addActionsPs#'< 1 1 FKk))##%%%%+[&:K:K:M:MNNN$T%8+FF j)/::1$$Z%:%:%<%<====#J0BCC1$$Z000 1 1rc|jjD]8\}}}}|r|}t||}||9dSr`)rb delayed_propsr6r )r0r:r6r#rUs rrzUIParser.setDelayedProps\s\,0K,E   (FFFD )VV,,F F4LLLL   rc(|jjD]\}}td|| |t |j|R#t$r&td||YwxYwdS)Nz%s is buddy of %sz1ERROR in ui spec: %s (buddy of %s) does not exist)rbbuddiesr'r*setBuddyr rsrr)r0r:buddys rrzUIParser.setBuddiesds![0 2 2MFE %uf.?.?.A.A B B B 2(;U C CDDDD! 2 2 2IV..0022222 2  2 2s(A-BBcdS)zc Reimplemented by a sub-class if it needs to know the translation context. Nr)r0contexts r setContextzUIParser.setContextms rct|jd|jd<t|jd|jd<dS)z% Handle the element. rqrpN)r rru)r0rs r_handle_layout_defaultzUIParser._handle_layout_defaultts@#&bi&9":": h#&ry';#<#< i   rcd}|D];}t|j|j}||j|||} element. N)r rsr setTabOrder)r0r lastwidget widget_elr:s r_handle_tab_stopszUIParser._handle_tab_stopszs\   IT0).AAF%#// FCCCJJ   rc>fd}|D]n}|d}|d\}}|dddd}||d}t||}j||d |d dd } |dkr|| |d }t|d kr#||d | F|t|| ptj j dS)z# Handle the element. cR|jkrjStj|Sr`)uinamersr )rr0s r name2objectz1UIParser._handle_connections..name2objects,dk!!**t2C888rsignal(Nr>r&r-senderreceiverslotrr!r) rr rr ragetSlotconnectrHtupler QMetaObjectconnectSlotsByNamers) r0rrconnr signal_name signal_argsr bound_signalrs ` r_handle_connectionszUIParser._handle_connectionss 9 9 9 9 9  C CD]]8,,F'-||C'8'8 $K%crc*223;;K [x!8!899F"6;77L<'' DMM*4M4M(N(NMM&))//44Q799Db  $$T****)//44 {##q(( Q088>>>> {!3!34< element. c|dr |dd}g}|dD]0}|dvr*|dkrtd||1d|S) zheader2module(header) -> string Convert paths to C++ header files to according Python modules >>> header2module("foo/bar/baz.h") 'foo.bar.baz' z.hNrF/)r-rz..z4custom widget header file name may not contain '..'.r)endswithr SyntaxErrorr+join)rmpathparts r header2modulez6UIParser._handle_custom_widgets..header2modulest$$ %E S)) ' 'y((t||)*`aaaLL&&&88E?? "rrextendsr.rN)rraaddCustomWidget)r0rr custom_widgetrs r_handle_custom_widgetszUIParser._handle_custom_widgetss # # #.  E EM%..w77I L ( (!**955B!M-"8"8"B"BCC E E E E E Erctr`)NotImplementedError)r0r widgetnames rrzUIParser.createToplevelWidgets!!rc|D]j}|jdkr]|jd}t}||j|<||d}| |ddkrd|_kdS)z$ Handle the element. buttongrouprlrYNboolfalseF)rfrrWrxrrrY)r0r button_grouprrrs r_handle_button_groupszUIParser._handle_button_groupss - -L=00&-f5 ]].0"7+'' kBB#}}V,,77',  - -rcdSr`rr?s rfinalizezUIParser.finalizes rct|drd}ntj|}|j|t |}|j|_|j|j_| |j|j | |j |j | |j |j||j|j||j|j||j|j||j||j}||S)Nreadr-)hasattrospathdirnamerb set_base_dirrrrrlayout_defaultrrxrcustom_widgetsrr:r connectionsr tab_stopsrrrsrd)r0filenamebase_dirui_filer*s rparsezUIParser.parsesd 8V $ $ 1HHwx00H   ***""( $/  *+++  ! -  ' '(> ? ? ?  ,  & &w'< = = =  ! -  ' '(> ? ? ? > %    / / /   *  $ $W%8 9 9 9   (  " "7#4 5 5 5    rc|ddkrtjjj}n9|ddkrtjjj}ntjjj}|S)Nr)r-rItemRole SpanningRole FieldRole LabelRole)layout_positionroles rrzUIParser._form_layout_rolesU 1  ! !(1>DD Q 1 $ $(1;DD(1;D rN)TT)(rSrTrUr[rnrdrrrrrrrrr+rPrS staticmethodrWr;rkrnrqrur|rrrrrrrrrrrrrrrrrrr^r^s   '''*    EI#6Q Q Q f000:))) > >'''''' YYYvIII\:::x8*8*8*t   FFF'''#"" "(   !!!8 1 1 1222   ===    CCC>EEE@""" - - -    (((T\rr^)sysloggingrrexml.etree.ElementTreer objcreatorr propertiesrrr getLoggerrSloggerdebugr'r rcr-rr"r4r$rZrWr^rrrrsRJ  ,,,,,,&&&&&&""""""  8 $ $         HHH>8'8'8'8'8'$8'8'8'v&a a a a a va a a a a r