+
   51>}c                   s  a  R3 t0 t R t^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIHt ^ RIH	t	 ^ RIH
t
 ^ R	IHt ^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ R
It^ RIHt ]! RR4       ^ RIHt ]! RR4       ^ RIHt ]P@                  ! R4       ]PB                  ! R4       ^ RI"H#t#H$t$H%t% ]
'       d	   ^ RIH$t$H#t# ^ RIH&t& ^ R
I't'^ R
I(t(^ R
I)t)^ R
I*t*^ RI+H,t,H-t-H.t.H/t/H0t0H1t1H2t2H3t3H4t4H5t5H6t6H7t7H8t8H9t9H:t:H;t;H<t<H=t=H>t>H?t?H@t@HAtAHBtB ]P                  ! R4      tDR
tE] ^ k RtFR R ltGR R ltHR R ltIR R  ltJ]J! 4       tK ! R! R"]$P                  4      tMR# R$ ltN ! R% R&4      tO]O! 4       tP] ^k R4R' R( lltQ]RR)8X  Ed:   ]KP                  '       g   ]P                  ! 4       tUM]P                  ! ]P                  R*7      tX]P                  ! R+4      tZ]XP                  ]Z4       ]DP                  ]P                  4       ]DP                  ]X4       ]DP                  R,4       ^ R
I`t`^ R
Iata^ R
Ibtb]`P                  ! 4       td]dP                  4        ](P                  ! R4        ]P                  ! ]P                  R-4       ]P                  ! R04      tl]P                  ! ]F]l4       ]KP                  '       d*   ]o! ]*P                  ! 4       4       ]P                  ! ^ 4       ]M! ]N! 4       ]KP                  ]KP                  ]KP                  ]KP                  ]KP                  ]KP                  ]KP                  ]KP                  ]KP                  ]KP                  R17      t|]P                  ! 4       tE]P$                  ! ]P                  ]Q4       ]P$                  ! ]P                  ]Q4        ]EEP                  4        R
# R
#   ]P                   d3    ]DP                  R.4       ]P                  ! ]P                  R/4        ELi ; i  ] d'    ]DP                  R24       ]EEP                  4         R
# i ; i)5z*
An emoji picker for ibus typing booster.
Any)List)Tuple)Iterable)Dict)Optional)Union)TYPE_CHECKING)	FrameTypeN)require_versionGLibz2.0)r   Pangoz1.0)r   Emoji Pickeremoji-picker)GdkGtk	GTK_MAJOR)r   r   )GObject)
is_wayland	add_childclear_childrenchildren_offorward_key_event_to_entryflowbox_get_childrenemoji_flowbox_get_labelsshow_allset_label_wrap_modeget_preferred_widthget_preferred_heightget_window_sizeget_toplevel_window	PopupKindPopupManagercreate_popover(clickable_event_box_compat_get_gtk_labelClickableEventBoxCompatFakeEventKeyHeaderBarCompatCompatButtonconnect_focus_signalgrab_focus_without_selectingzibus-typing-boosterc                0    V ^8  d   QhR\         R\         /#    textreturnstrformat   "5/usr/share/ibus-typing-booster/engine/emoji_picker.py__annotate__r5   l   s     . .C .C .    c                s8    \         P                  ! \        V 4      # )zGettext translation function.)gettextZdgettext
DOMAINNAMEr-      &r4   _r;   l   s    J--r6   c                r*   r+   r/   r1   r3   r4   r5   r5   p   s      S S r6   c                s    V # )z{Mark string for translation without actually translating.

Used by gettext tools to extract strings that need translation.
 r9   r:   r4   N_r=   p   s	    
 Kr6   c                sR    V ^8  d   QhR\         \        \        3,          R\        /# )r,   vr.   )r   boolr0   r1   r3   r4   r5   r5   w   s'     
@ 
@dCi  
@T 
@r6   c                s    \        V \        4      '       d   V # V P                  4       R9   d   R# V P                  4       R9   d   R# \        P                  ! R4      h)z-
Convert a string to a boolean for argparse.
TFzBoolean value expected.)ZyesZtrueZtZ1)ZnoZfalsefZ0)
isinstancer?   lowerargparseZArgumentTypeError)r>   r:   r4   str2boolrD   w   sL     !Twwy--wwy--

$
$%>
??r6   c                s$    V ^8  d   QhR\         /# r,   r.   r    r1   r3   r4   r5   r5      s     W WC Wr6   c                 sx   \         P                  ! RR7      p V P                  RRR\        RRRR	7       V P                  R
RR\        RRRR	7       V P                  RRR\        RRRR	7       V P                  RRR\
        RRRRR7       V P                  RRR\
        RRRRR7       V P                  RR\
        RRRRR7       V P                  RR\        RRRR	7       V P                  RR\
        RRRR R7       V P                  R!R\
        RRRR"R7       V P                  R#R\        RR$R%R	7       R1p\        P                  ! R'4      pR&pV F  w  rEW$8  g   K  TpK  	  V P                  R(R\        RVR)R	7       V P                  R*R+R\
        RRRR,R7       V P                  R-R.RR/R07       V P                  4       # )2z#
Parse the command line arguments.
z'An emoji picker for ibus-typing-booster)descriptionz-lz--languagesZ?store zSet a list of languages to be used when browsing or searching for emoji. For example: "emoji-picker -l de:fr:ja" would use German, French, and Japanese. If empty, the locale settings are used to determine the languages.)nargstypeactiondefaulthelpz-fz--fontNzSet a font to display emoji. If not specified, the font is read from the config file. To use the system default font specify "emoji". default: "%(default)s"z-sz
--fontsizezSet a fontsize to display emoji. If not specified, the fontsize is read from the config file. If that fails 24 is used as a fall back fontsize. default: "%(default)s"z-mz--modalTFz;Make the window of emoji-picker modal. default: %(default)s)rI   rJ   rK   ZconstrL   rM   z-az--allzLoad all Unicode characters. Makes all Unicode characters accessible, even normal letters. Slows the search down and is usually not needed. default: %(default)sz
--unikemetzILoad the Unikemet.txt file for Egyptian Hieroglyphs. default: %(default)sz--match-limit  zBLimit for the number of results for searches. default: %(default)sz
--fallbackaA  Whether to use fallback fonts when rendering emoji. If True, pango will use fallback fonts as necessary. If False, pango will use only glyphs from the closest matching font on the system. No fallback will be done to other fonts on the system that might contain the glyhps needed to render an emoji. default: "%(default)s"z--spellcheckz\Whether to add spellchecking suggestions automatically to search stringsdefault: %(default)sz--emoji-unicode-min0.0zgLoad only emoji which were added to Unicode not earlier than this Unicode version. default: %(default)s16.0z%Y%m%dz--emoji-unicode-maxzeLoad only emoji which were added to Unicode not later than this Unicode version. default: %(default)sz-dz--debugz7Print some debug output to stdout. default: %(default)sz	--versionZ
store_truez9Output version information and exit. default: %(default)s)rK   rL   rM   )
)Z20180605z11.0)Z20190305z12.0)Z20190507z12.1)Z20200701z13.0)Z20200915z13.1)Z20210914z14.0)Z20220913z15.0)Z20230912z15.1)Z20240910rP   )Z20250909z17.0)
rC   ZArgumentParserZadd_argumentr0   floatrD   inttimeZstrftime
parse_args)ZparserZunicode_versionsZcurrent_dateZcurrent_unicode_versionZdateversions         r4   rT   rT      s    $$=?F
m)  + h'  	) l'  	) i%  ' g%  ' %  ' %  ' '  
 %  ' %  ' ==*L$+&-# , '%  ' i%  ' %	  ' r6   c                   s4  a  ] tR tRt o RtRuV 3R lR lltV 3R lR ltV 3R lR	 ltV 3R
 lR ltV 3R lR lt	V 3R lR lt
V 3R lR lt]V 3R lR l4       tRvV 3R lR lltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R lR ltV 3R  lR! ltV 3R" lR# ltV 3R$ lR% ltV 3R& lR' ltV 3R( lR) ltV 3R* lR+ ltV 3R, lR- ltV 3R. lR/ ltV 3R0 lR1 ltV 3R2 lR3 lt]V 3R4 lR5 l4       tV 3R6 lR7 lt V 3R8 lR9 lt!V 3R: lR; lt"V 3R< lR= lt#V 3R> lR? lt$V 3R@ lRA lt%V 3RB lRC lt&V 3RD lRE lt'V 3RF lRG lt(V 3RH lRI lt)V 3RJ lRK lt*V 3RL lRM lt+V 3RN lRO lt,RwV 3RP lRQ llt-V 3RR lRS lt.V 3RT lRU lt/V 3RV lRW lt0V 3RX lRY lt1V 3RZ lR[ lt2V 3R\ lR] lt3V 3R^ lR_ lt4V 3R` lRa lt5V 3Rb lRc lt6V 3Rd lRe lt7V 3Rf lRg lt8V 3Rh lRi lt9V 3Rj lRk lt:V 3Rl lRm lt;V 3Rn lRo lt<V 3Rp lRq lt=V 3Rr lRs lt>Rtt?V t@R# )xEmojiPickerUIi  z$
User interface of the emoji picker
Nc                s   < V ^8  d   QhRS[ S[,          RS[RS[RS[RS[RS[RS[S[,          RS[S[,          R	S[S[,          R
S[RS[RR/# )r,   	languagesmodalunicode_data_allunikemetemoji_unicode_minemoji_unicode_maxfontfontsizefallbackmatch_limit
spellcheckr.   N)r   r0   r?   r   rQ   rR   r2   __classdict__   "r4   r5   EmojiPickerUI.__annotate__"  s     u< u<$SMu<u< $(u<  	u<
 %(u< %(u<  }u< $E?u< $D>u< "u< "u< .2u<r6   c           	     s6,   \         P                  P                  V R \        R4      ,           R7       V P	                  R4       R\        4       '       d   RMR R2p\         P                  ! 4       p\        ^8  dh   VP                  V\        V4      4       \         P                  P                  \        P                  P                  4       V\         P                  4       MkVP                  VP!                  R4      4       \         P                  P#                  \        P$                  P                  4       V\         P                  4       V P'                  R	R
4       W n        V P+                  V P(                  4       V P-                  4       pRV n        V'       d   V^ ,          V n        RV n        RV n        \5        4       V n        RV n        RV n        RV n        \>        P@                  PC                  \D        PF                  ! R4      R4      V n$        V PK                  4        Ve   Wpn        Ve   Wn        V	e   \M        V	4      V n        V PO                  4        \        ^8  d   V PQ                  RV PR                  4       MV PQ                  RV PR                  4       \        ^8  d   V PQ                  RV PT                  4       Mt\         PV                  PY                  4       pVP[                  \         P\                  P^                  4       VPQ                  RV P`                  4       V Pc                  V4       Wn2        WPn3        W`n4        Wn5        Wn6        W0n7        W@n8        \r        Pt                  ! V Pd                  V Pn                  V Pp                  V Pf                  V Ph                  RR7      V n;        / V n<        \D        Pz                  ! V Pd                  4       F  p\|        P~                  ! \        V.R7      pV'       dU   RV,           R,           \        ,           R,           V9   d.    \|        P                  ! \        V.R7      V Px                  V&   K|  RV Px                  V&   K  	  RV nC        RV nD        RV nE        RV nF        RV nG        RV nH        RV nI        \         P                  ! 4       V nK        V P                  P                  \         P                  P                  4       V P                  P                  ^ 4       \        W P                  4       \        4       V nR        V P                  P                  R4       V P                  P                  R4       RV nU        \        RR7      V nW        V P                  P                  V P                  4       V P                  PQ                  RV P                  4       \        R\        R 4      R!7      V nZ        V P                  PQ                  RV P                  4       V P                  P                  V P                  4       \        V P.                  R"\        R#4      R$7      V n\        V P                  PQ                  RV P                  4       V P                  P                  V P                  4       \         P                  ! 4       V n_        V P                  P                  R4       V P                  P                  R4       V P                  P                  \        R%4      4       \        V P                  4       \        V P                  V P                  4       \         P                  ! 4       V ng        V P                  P                  ^4       V P                  P                  R&4       V P                  P                  V P0                  4       V P                  P                  ^4       V P                  P                  V P                  4       V P                  PQ                  R'V P                  4       V P                  P                  V P                  4       \         P                  ! 4       V no        V P                  P                  \        R(4      4       V P                  P                  \        R<4      4       V P                  P                  V P2                  4       V P                  PQ                  R)V P                  4       V P                  P                  V P                  4       \         P                  ! 4       V nt        V P                  P                  R4       V P                  P                  ^ 4       V P                  P                  ^R=4       V P                  P                  R4       V P                  P                  \         P                  P                  4       V P                  P                  ^
4       V P                  P                  ^
4       V P                  P                  V P                  4       V P                  P                  R4       V P                  V P                  4       ^ V n        \         EP                  ! 4       V n        V EP                  P                  R4       V EP                  P                  R4       V EP                  P                  R4       \        V EP                  4       \        ^8  d   \         PV                  PY                  4       pVP[                  \         P\                  P^                  4       VPQ                  RV EP                  4       V EP                  Pc                  V4       \         EP                  ! 4       V n        V EP
                  P                  R4       V EP
                  P                  R4       V EP
                  EP                  R4       V EP
                  EP                  R4       \        V EP
                  V EP                  4       V EP
                  EP                  V EP                  4       V EP                  PQ                  R*V EP                  4       \        V EP                  V EP                  4       \         EP                  ! \         P                  EP                  R+7      p\        V P                  V4       VEP                  R4       VP                  R4       VP                  R4       \         EP                  ! 4       V n        \         EP                   ! 4       V n        V EP"                  P                  R4       V EP"                  EP%                  R4       V EP"                  P                  R4       V EP"                  EP'                  4       PQ                  R,V EP(                  4       V EP"                  PQ                  R-V EP*                  4       \        V EP                  V EP"                  4       \         EP                  ! 4       V n        V EP,                  P                  R4       V EP,                  P                  R4       \        ^8  d   V EP,                  EP/                  R4       V EP,                  EP1                  R4       V EP,                  EP3                  R4       \         EP4                  ! 4       V n        \        V EP,                  V EP6                  4       \         P                  ! 4       V n        V EP8                  P                  \         P                  P                  4       V EP8                  P                  ^ 4       V EP8                  EP;                  R4       \        V EP8                  V EP
                  4       \        V EP8                  V EP                  4       \         P                  ! 4       V n        V EP<                  P                  \         P                  P                  4       V EP<                  P                  ^ 4       V EP<                  EP;                  R4       \        V EP<                  V EP,                  4       \        ^8  d`   VEP?                  V EP8                  4       VEPA                  V EP<                  4       VEPC                  R4       VEPE                  R4       M@VEPG                  V EP8                  RRR.7       VEPI                  V EP<                  RRR.7       \         EPJ                  ! E\L        E\L        E\L        E\L        4      V n        V EP"                  EPQ                  V EPN                  4       R/\        R04      ,           V n        V EPN                  EPU                  RV EPR                  RRV EPR                  .4      p/ V n        \>        P@                  PC                  \D        PF                  ! R4      R14      V n        ^dV n        V EP]                  4        V Pv                  EP_                  4       V n        \D        Pz                  ! V Pd                  4      pV Uu. uF  pVR>9  g   K  VNK  	  ppR=p^ pE\c        V4       EF  w  ppRpVV EP`                  9   d   V EPN                  EPU                  RVRRR.4      pV EPe                  R2V EPg                  R3V4      VV4      '       d   RpV^ 8  d
   VV,
          pV EPe                  R4V EPg                  R5V4      VV4      '       d   RpV EPe                  R6V EPg                  R7V4      VV4      '       d   RpV'       d   V EPN                  EPi                  V4       V'       g   EK  V^,          pEK  	  E\j        EPl                  '       d9   E\n        EPm                  R8\D        Pz                  ! V Pd                  4      VV4       V EP"                  EPq                  \         EPr                  ! R9\         EPt                  ! 4       ^ R:7      4       V EP"                  EPw                  R4       V EP"                  EPy                  4        V^ 8  d   V^,           pV EP"                  EP{                  \         EP|                  ! V.4      R4       V EP"                  EP{                  \         EP|                  ! V^ .4      R4       V EP"                  EP                  \         EP|                  ! V^ ^ .4      V EP"                  EP                  ^ 4      4       V EP"                  EP                  4        E\        V 4       E\        V EP                  4      w  ppE\        V EP
                  4      w  pp E\j        EPl                  '       d   E\n        EPm                  R;VV 4       VEP                  V 4       R#   \        3 d    RT Px                  T&    EK.  i ; iu upi )?u   🚀 r   )titleZEmojiPickera  
            #EmojiPicker {
            }
            flowbox {
            }
            flowboxchild {
                border-style: groove;
                border-width: 0.05px;
            }
            flowboxchild:selected {
                background-color: @theme_selected_bg_color;
                outline: 2px solid @theme_selected_fg_color;
                outline-offset: -2px;
            }
            row { /* This is for listbox rows */
                border-style: groove;
                border-width: 0.05px;
            }
            .font {
                padding: 2px 2px;
            }
            popover {
                border: 0;
                border-radius: 0;
                outline: none;
                background-color: Ztransparentz@theme_bg_colorz;
            }
            UTF-8i  i  emojig      8@TNr   Zoptionszclose-requestzdelete-eventzkey-press-eventzkey-pressed)rW   rY   rZ   r[   r\   Zvariation_selector)rW   /z/LC_MESSAGES/z.morH   Fzopen-menu-symbolic)	icon_nameclickedzedit-find-symboliczSearch for emoji)rj   tooltip_textzpreferences-desktop-fontzSet the font to display emoji)labelrj   rl   zSet font sizei'  zvalue-changedZFallbackZtoggledzsearch-changed)ZorientationZchangedzrow-activated)ZresizeZshrinku   🕒 zRecently usedzrecently-used
categories
CategoriesZucategoriesUnicode categorieskeywordsKeywordsz\expanded_languages  = %s
first_language_with_categories = %s
number_of_empty_languages = %s
ZBrowser9   z>natural_width_search_entry = %s natural_width_search_bar = %s
zuWhether to use font fallback for emoji or parts of emoji sequences which cannot be displayed using the selected font.)Zen_001Zes_419)r   Window__init__r;   Zset_namer   ZCssProviderr   Zload_from_datalenZStyleContextZadd_provider_for_displayr   ZDisplayZget_defaultZ#STYLE_PROVIDER_PRIORITY_APPLICATIONZencodeZadd_provider_for_screenZScreenZset_default_size_modalZ	set_modal_list_font_names_font	_fontsize	_fallbackr!   _popup_manager_font_popover_font_popover_scroll_font_popover_listboxospathjoinitb_utilZxdg_save_data_path_options_file_read_optionsr?   _save_optionsconnecton_closeon_main_window_key_press_eventEventControllerKeyZnewZset_propagation_phaseZPropagationPhaseZBUBBLEon_main_window_key_pressed_gtk4Zadd_controller
_languages_emoji_unicode_min_emoji_unicode_max_match_limit_spellcheck_unicode_data_all	_unikemet	itb_emojiEmojiMatcher_emoji_matcher_gettext_translationsexpand_languagesr7   Zfindr8   ZtranslationZOSError_currently_selected_label_query_string_emoji_selected_popover_emoji_info_popover_skin_tone_popover_skin_tone_selected_popover._skin_tone_popover_originated_from_emoji_labelBox_main_containerset_orientationOrientationVERTICALset_spacingr   r&   _header_barset_hexpandset_vexpand_main_menu_popoverr'   _main_menu_buttonZ
pack_starton_main_menu_button_clicked_toggle_search_buttonon_toggle_search_button_clicked_font_buttonon_font_button_clicked
SpinButton_fontsize_spin_buttonZset_numericset_can_focusset_tooltip_textr)   r(   "on_fontsize_spin_button_grab_focus
Adjustment_fontsize_adjustmentZ	set_lowerZ	set_upperZ	set_valueZset_step_incrementZset_adjustment$on_fontsize_adjustment_value_changedCheckButton_fallback_check_button	set_label
set_active on_fallback_check_button_toggledZProgressBar_progress_barZset_show_textZset_pulse_stepset_size_request
set_valignAlignZCENTERset_margin_startset_margin_endZpack_endset_visibleZset_titlebar_search_timeout_source_idSearchEntry_search_entryon_search_entry_key_pressedZ	SearchBar_search_barZset_show_close_buttonset_search_modeZconnect_entryon_search_entry_search_changedon_search_entry_grab_focusZPanedZ
HORIZONTALZset_wide_handleScrolledWindow_browse_treeview_scrollTreeView_browse_treeviewset_activate_on_single_clickget_selectionon_label_selectedon_row_activated_flowbox_scrollZset_capture_button_pressset_kinetic_scrollingset_overlay_scrollingFlowBox_flowbox
_left_paneset_homogeneous_right_paneZset_start_childZset_end_childZset_resize_start_childZset_resize_end_childZpack1Zpack2Z	TreeStorer0   _browse_treeview_modelZ	set_model_recently_used_labelappend_recently_used_emoji_recently_used_emoji_file_recently_used_emoji_maximum_read_recently_usedZemoji_by_label_emoji_by_label	enumerate_add_label_key_to_model_translate_keyremove_ARGSdebugLOGGERZappend_columnTreeViewColumnZCellRendererTextZset_headers_visibleZcollapse_allZ
expand_rowTreePath
set_cursorZ
get_columnZcolumns_autosizer   r   set_position)!selfrW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   ZcssZstyle_providerZavailable_fontsZ
controllerlanguageZmo_fileZentry_controllerZbrowse_panedZ_dummy_recent_iterZexpanded_languagesZlangZfirst_language_with_categoriesZnumber_of_empty_languagesZlanguage_indexZlanguage_emptylanguage_iterZfirst_path_componentZ_minimum_width_search_entryZnatural_width_search_entryZ_minimum_width_search_barZnatural_width_search_bars!   &&&&&&&&&&&&                     r4   ru   ZEmojiPickerUI.__init__"  s    	

D!N2C(CDm$#2 5?LL=FW"X Y38 *>))#s3x855'')779
 ))#**W*=>44

&&(779 	c3't{{#//1
(+DJ*n48BF!<@"WW\\''7 	J%N!(^DN>LL$--8LL7q=LL*D,O,OP//335J,,S-A-A-H-HItCCE
+#"3"3'%!1!'44oo!33^^"55"55&( 68" 11$//BHll:(DG(No5
BUJ@;B;N;N"xj<:D..x8
 8<**84# C& JN&>B$:> 9=BF(SW;"wwy,,S__-E-EF((+$,,-*,$$T*$$U+9=!-8L!M##D$:$:;&&t77	9%1*;M9N&P"""**t;;	=##D$>$>?(**(B:;= 	!!)T-H-HI##D$5$56%(^^%5"""..t4""006""33o	 $T%?%?@T77!DD	F$'NN$4!!!++A.!!++E2!!++DNN;!!44Q7""11$2K2KL!!))TFF	H##D$>$>?&)oo&7# 	##--a
m<##44 ! "	# 	##..t~~>##++t<<	>##D$?$?@ __.((.))!,++C4&&t,%%cii&6&67++B/))"-!!$"4"45&&u-$**+./& __.&&u-&&u-((.$T%7%78>"5599;2233G3G3N3NO$$]D4T4TU--.>?==?$$U+$$U+..u5((/$""D$6$67&&t'9'9:""dAA	CT//1P1PQyyS__-G-GH$&&5$$T*  &  &'*'9'9';$ # 	++E2::4@))$/++-55t--	/%%T22	4$..0E0EF"113((.((.q=  99%@22592248$&&6'')''(@(@A##A&''.$//4#3#34$//4#?#?@779(()A)AB$$Q'((/$""D$8$89>((9&&t'7'78//5--d3 ttDIt//TJ&)mmCc3&G#''(C(CD$+a.@$@!!88??&&B0I0IJL BD!)+''7*& -0)  "#22AAC%66tG
 +1*// D* 	 1 *,&$%!(12D(E$NH!N4/// $ ; ; B B8RR0!2//$++L(C -1 1 &+N59*-FF 7//%++,@(K -1 1 &+N//"++JA -1 1 &+N!//66}E~)Q.)5 )F8 ;;;LL3 ))$//:.)+ 	++#..0q:	; 	11%8**,)Q.#AA#E !!,,234e=!!,,2A67@!!,,2Aq9:%%0035 	..0 (;4;M;M'N	%	$	#%89I9I%J	#	"	!;;;LL2*(	*
 	!!":;y  { @;?D..x8@f1s'   4*AW3I;	AXJ	AXW3AXXAXc                   < V ^8  d   QhRR/# r,   r.   Nr<   rb   rd   r4   r5   re     s     - -T -r6   c                <    V P                   P                  R4       R# )zShow that this program is busy TNr   r   r   r:   r4   _busy_startZEmojiPickerUI._busy_start  s    &&t,r6   c                $   < V ^8  d   QhRS[ RR/# )r,   fractionr.   N)rQ   rb   rd   r4   r5   re     s     2 2u 2 2r6   c                s<    V P                   P                  V4       R# )z:Set the percent of progress made when the program is busy N)r   Zset_fraction)r   r      &&r4   _busy_fractionZEmojiPickerUI._busy_fraction  s    ''1r6   c                r   r   r<   rb   rd   r4   r5   re     s     . .D .r6   c                r   )z'Stop showing that this program is busy FNr   r   r:   r4   
_busy_stopZEmojiPickerUI._busy_stop  s    &&u-r6   c                s&   < V ^8  d   QhRS[ RS[ /# r,   rh   r.   r/   rb   rd   r4   r5   re     s      C C r6   c                s,   V P                   R8X  g    V P                   P                  4       R8X  d   V P                  P                  VR4      # V P                   R8X  d   V P                  P                  VR4      # V P                  P                  VR4      # )z
Normalize the variation selectors in the emoji sequence.

Returns a new emoji sequences with variation selectors added
or removed as appropriate for the current font.

:param emoji: The emoji
r-   ZsymbolaunqualifiedrH   rh   )ry   rB   r   variation_selector_normalizer   rh   r   r4   &_variation_selector_normalize_for_fontZ4EmojiPickerUI._variation_selector_normalize_for_font  s     ::4::#3#3#5#B&&CCv ::&&&CCr ""??7 	r6   c                r   r   r<   rb   rd   r4   r5   re     s     . .t .r6   c                sd    V P                   P                  4       P                  4        RV n        R# )zA
Unselect everything in the treeview for browsing the categories
N)r   r   Zunselect_allr   r   r:   r4   _browse_treeview_unselect_allZ+EmojiPickerUI._browse_treeview_unselect_all  s'     	++-::<)-&r6   c          
      s8   < V ^8  d   QhRS[ RS[ RS[ RS[RS[/# )r,   	label_keylabel_key_displayr   r   r.   )r0   r   r?   rb   rd   r4   r5   re     s=        # 	
 
 $(r6   c                s   WP                   V,          9  d   R # V P                  V P                   V,          V,          V4      pV'       g   R # V P                  P                  WBRRR.4      pV Fc  p\	        V P                   V,          V,          V,          4      pV P                  P                  VVR,           \        V4      ,           W1V.4       Ke  	  R# )FrH    T)r   _sort_labelsr   r   rv   r0   )	r   r  r  r   r   labelsZlabel_key_iterrm   Znumber_of_emojis	   &&&&&    r4   r   Z%EmojiPickerUI._add_label_key_to_model  s     00::""  *95 44;;r2r:<E!$$X.y9%@BO''..s?33e-.  r6   c                sb   < V ^8  d   QhRS[ S[S[S[,          3,          RS[RS[S[,          /# )r,   r  r   r.   )r   r0   r   rb   rd   r4   r5   re     s:      d3i(  #3ir6   c                s&   a \        VV3R  lR7      # )c                 s  < SP                  R 4      ;'       g    SP                  R4      ;'       d2    \        P                  ! V ^ ,          4      P                  R4      '       * SP                  R 4      ;'       d2    \        P                  ! V ^ ,          4      P                  R4      '       * \        P                  ! V ^ ,          4      P                  R4      V P                  4       3# )ZjaZzhZCJKZHIRAGANAZDIGIT)Z
startswithunicodedatanamerB   )xr      &r4   <lambda>Z,EmojiPickerUI._sort_labels.<locals>.<lambda>  s     $$T*GGh.A.A$.G A A#((1.99%@@##D) F F#((1.99*EE  1&11':		r6   key)sorted)Zclsr  r   s   &&fr4   r  ZEmojiPickerUI._sort_labels  s    
 	 	r6   c                s,   < V ^8  d   QhRS[ RS[ RS[ /# )r,   r  r   r.   r/   rb   rd   r4   r5   re     s"      #   r6   c                s    \        R 4      \        R4      \        R4      .pV P                  V,          '       d,   \        V P                  V,          P                  V4      4      # V# )ro   rp   rr   )r=   r   r0   r7   )r   r  r   Z_dummy_keys_to_translate   &&& r4   r   ZEmojiPickerUI._translate_key  s[    |#$zN$
 
 %%h//t11(;CCCHII
r6   c                s6   < V ^8  d   QhRS[ RS[S[ ,          /# r   )r0   r   rb   rd   r4   r5   re     s#     e e ec er6   c                s   . pTP                  RP                  V Uu. uF  pR\        V4      R 2NK  	  up4      4       \        R4      pV P	                  V4      p\
        P                  ! V P                  R,           \        V P                  4      ,           VVR7       F  w  rgVR,          pRpV F  p	VR\        V	4      R 2,          pK  	  VR	V P                   R
\        V4      P                  4        R2V,           R,           RV R2,           ,          p\        P                  '       d   VRV 2,          pK  VRVR,           2,          pK  	  VP                  RR4      P                  RR4      p
\        P                  '       d   W8w  d   \
        P                  ! V P                  R,           \        V P                  4      ,           V
VR7       F  w  rgVR,          pRpV F  p	VR\        V	4      R 2,          pK  	  VR	V P                   R
\        V4      P                  4        R2V,           R,           RV R2,           ,          pVRV 2,          pK  	  VP                  V4       \        P                  ! V P                   4       EFo  pV P"                  P%                  WR7      pRV R2pRpV'       d6   VR\&        P(                  ! RP                  V4      4      ,           ,          pRpV P"                  P+                  WR7      pV'       dT   VRV P-                  RV4      ,           R,           \&        P(                  ! RP                  V4      4      ,           ,          pRpV P"                  P/                  WR7      pV'       dT   VRV P-                  RV4      ,           R,           \&        P(                  ! RP                  V4      4      ,           ,          pRpV'       d   EK^  VP                  V4       EKr  	  V P"                  P1                  V4      '       dB   VP                  \        R4      R,           V P"                  P1                  V4      ,           4       V P"                  P3                  V4      '       dB   VP                  \        R4      R,           V P"                  P3                  V4      ,           4       V P"                  P5                  V4      '       dQ   VP                  \        R4      R,           RP                  V P"                  P5                  V4      4      ,           4       V P"                  P7                  V4      '       dQ   VP                  \        R4      R,           RP                  V P"                  P7                  V4      4      ,           4       V P"                  P9                  V4      '       d>   VP                  \        R4      RV P"                  P9                  V4       2,           4       \        P                  '       d[   VP                  RV P"                  P;                  V4       24       VP                  R V P"                  P=                  V4       24       V# u upi )!z
Return a description of the emoji

The description shows the Unicode codepoint(s) of the emoji
and the names of the emoji in all languages used.

:param emoji: The emoji
r  zU+04Xz Fonts used to render this emoji:)r_   
rH   z U+<span font="" fallback="z" ></span>z<span fallback="true">: r]   u   ︎u   ️r   z<b>z</b>T, Frr   ro   zUnicode Version:zEmoji Version:zEmoji properties:zUnicode category:zUnicode block:zemoji_order = zcldr_order = )r   r   ordr;   _optimize_pango_fallback	itb_pangoZget_fonts_used_for_textry   r0   rz   rB   r   r   replacer   r   r   r   nameshtmlescaperq   r   rn   Zunicode_versionZemoji_version
propertiesZunicode_categoryZunicode_blockZemoji_order
cldr_order)r   rh   ZdescriptionsZ	characterZfonts_descriptionr_   r-   Z	font_dictZcode_pointsZcharZemoji_unqualifiedr   r  rF   Zdescription_emptyrq   rn   s   &&               r4   _emoji_descriptionsZ!EmojiPickerUI._emoji_descriptions  s    HHGI3y>#./GH	J@A007(@@

S 3t~~#66! #OD %KSYsO44 tzzl + ]002338"# +;-w?@A
 {{{!r)%55!!r)F*;)<%==! #  "MM(B7??"M;;;,5#,#D#DJJ$s4>>'::<M%$' "T)!  DST3#88K !!"4::, /!!$X!4!4!6 7s<&' /{m7CDE!
 "r)%55!$' 	-. 11$//BH''--e-GEz.K $tdkk$))E2B&CCC$)!**33E3MH4..z8DDtKkk$))H"5678 %*!,,77 8 *J4..|XFFMkk$))J"789: %*!$$##K0+ C, ..u55$%+%%55e<=> ,,U33"#c)%%33E:;< ))%00 %&-))D//::5ABC	D //66 %&,((4..??FGHI
 ,,U33 "#d))77>?@A	B ;;; !4!4!@!@!G HIK 3 3 > >u EFGIu Hs   Y:c                s>   < V ^8  d   QhRS[ RS[P                  RR/# )r,   rh   rm   r.   N)r0   r   Labelrb   rd   r4   r5   re   \  s-     - -- 99- "&-r6   c                s    \        R4      R,           p\        V P                  P                  V4      4      ^8  d   V\        R4      R,           ,          pV\        R4      ,          pVP	                  V4       R# )z
Set the tooltip for a label in the flowbox which shows an emoji

:param emoji: The emoji
:param label: The label used to show the emoji
Left click to copyr  z)Long press or middle click for skin toneszRight click for infoN)r;   rv   r   skin_tone_variantsr   )r   rh   rm   rl   r  r4   _emoji_label_set_tooltipZ&EmojiPickerUI._emoji_label_set_tooltip\  si     -.5t""55e<=A=>$FHL011|,r6   c                r   r   r<   rb   rd   r4   r5   re   m  s     \ \ \r6   c                s@   \        V P                  4       \        P                  ! 4       V n        V P                  P                  4       P                  R4       \        V P                  V P                  4       V P                  P                  \        P                  P                  4       V P                  P                  ^4       V P                  P                  ^d4       V P                  P                  ^ 4       V P                  P                  ^ 4       V P                  P                  R4       V P                  P!                  \        P"                  P$                  4       V P                  P'                  R4       \(        ^8  d   V P                  P+                  R4       V P                  P-                  R4       V P                  P/                  R4       V P                  P1                  R4       V P                  P3                  RV P4                  4       R# )z#
Clear the contents of the flowbox
viewTFzselected-children-changedN)r   r   r   r   r   get_style_context	add_classr   r   r   STARTset_min_children_per_lineset_max_children_per_lineset_row_spacingset_column_spacingr   set_selection_modeSelectionModeSINGLEr   r   set_focusabler   r   r   r   on_emoji_selection_changedr   r:   r4   _clear_flowboxZEmojiPickerUI._clear_flowboxm  s\    	t++,'')33F;$&&6  1//2//4%%a(((+2248(():):)A)AB##D)>MM''-%%e,!!%(!!%(94;Z;Z[r6   c                r   r   r<   rb   rd   r4   r5   re     s     w wd wr6   c                sT   V P                   f   \        P                  R4       R# V P                   w  rp\        P                  '       d   \        P                  RWV4       V P	                  4        V P                  4        . pRpV P                  4       pW0P                  8X  d   RpTpWP                  9   dW   W P                  V,          9   d@   W0P                  V,          V,          9   d"   V P                  V,          V,          V,          pV P                  P                  V4       V'       d*   V P                  P                  R\        V4       R24       MV P                  P                  R4       V'       g   V P                  4        R# \        V4       EFl  w  rxV P                  V\        V4      ,          4       \         P"                  P%                  4       P'                  R4      '       dF   \(        P*                  '       g   KK  \        P-                  R	4       \.        P0                  ! ^4       Kx  V P                   WV38w  d7   \        P                  R
WV3V P                   4       V P                  4         R# V P3                  V4      pV'       g{   V P4                  P7                  V4      p	\        V	4      ^8  dP   \        V4      p
V	 F&  pW9   g   K  \9        V
VP;                  V4      4      p
K(  	  V
\        V4      8  d	   Wj,          p\<        P>                  ! 4       pV PA                  V4      pRV PB                   RV PD                   R\G        V4      PI                  4        R\J        PL                  ! V4       R2	p\N        PP                  ! V4      '       dH   VRV PD                  ^,           R\S        V4      R RV P4                  PU                  V4       R2,          pVPW                  V4       VPY                  R4       VP[                  R4       VP]                  R4       VP_                  R4       VPa                  R4       VPc                  R4       VPe                  R4       VPg                  \<        Ph                  Pj                  4       VPm                  \<        Ph                  Pj                  4       ^ pVPo                  V4       VPq                  V4       VPs                  V4       VPu                  V4       V Pw                  W4       \y        4       p\{        VV4       VP}                  RV P~                  4       VP}                  RV P                  4       VP}                  RV P                  4       \<        P                  ! 4       p\        ^8  d#   VP                  R4       VP[                  R4       \{        VV4       V P                  P                  VR4       \        V P                  4       EKo  	  \        V 4       V P                  4        R# )zc
Fill the flowbox with content according to the currently
selected label in the browsing treeview.
NzNo label is currently selectedz(language = %s label_key = %s label = %s
FT()rH   Control+C pressed, exiting ...z Selected label changed: %r -> %rr  r  r  ">r  z<span fallback="false" font="z"> U+r        ?rk   releasedlong-pressedrs   )Hr   r   r   r   r   r3  _sorted_recently_usedr   r   r   	set_titleset_subtitlerv   r   r   r   r   MainContextrL   	iterationSIGNAL_HANDLERinterrupt_requestedinfosysexitr   r   r$  minindexr   r"  r  ry   rz   r0   rB   r  r  r   Zis_invisibler  r  set_textset_use_markupr   set_selectabler   r   
set_xalign
set_yalign
set_halignr   FILLr   r   r   set_margin_topset_margin_bottomr%  r$   r   r   !on_flowbox_event_box_button_press#on_flowbox_event_box_button_release'on_flowbox_event_box_long_press_pressedFlowBoxChildr   r1  r   insertr   )r   r   r  rm   Z
emoji_listZis_recently_usedZsorted_recently_usedrF  rh   r$  Zrecently_used_indexskin_tone_variantZ	gtk_labelr_   r-   margin	event_boxflowbox_childs   &                 r4   _fill_flowbox_browseZ"EmojiPickerUI._fill_flowbox_browse  s   
 ))1LL9:'+'E'E$e;;;LL;U, 	
 #99;---#-J,,,!5!5h!??228<YGG--h7	B5IJ""5)))Ac*o->a*@A))"-OO%j1LEc*o 56 ""**,66u==!555KK @AHHQK--(u1MM 6%0224 !??FE#%)%8%8%K%K&")*Q.
 +..B*C'-?),D25 3 4 : :;L M3O/ .@
 +S1E-FF 4 I		I44U;H tzzl!DNN+; < ]00232;;u%&g/  $$U++3DNNQ4F3G He*S)4+>+>+C+CE+J*K t$$$T*##E*$$U+!!%(!!%(  %  %   0  0F&&v.$$V,$$V,''/))%;/1Ii+4AACDDDF L LN,,.MA~++D1++D1mY/MM  3T]]#a 2d 	r6   c                r   r   r<   rb   rd   r4   r5   re     s     '6 '6t '6r6   c                s>   / p\         P                  P                  V P                  4      '       d    \	        V P                  RR7      ;_uu_ 4       p\
        P                  ! VP                  4       4      pRRR4       \        P                  '       d!   \        P                  RV P                  4       \%        T\&        4      '       g/   \        P                  '       d   \        P                  RT4       / pRV9   dD   \%        VR,          \(        4      '       d'   VR,          V n        V P*                  R	8X  d   R
V n        RV9   d2   \%        VR,          \,        \.        34      '       d   VR,          V n        RV9   d0   \%        VR,          \2        4      '       d   VR,          V n        R# R# R#   + '       g   i     ELE; i  \        \        \        3 d7   p\        P                  RTP                  P                   T4        Rp?ELYRp?i\"         d7   p\        P                  RTP                  P                   T4        Rp?ELRp?ii ; i  \%        T\&        4      '       g0   \        P                  '       d   \        P                  RT4       / pi i ; i)z9
Read the options for 'font' and 'fontsize' from  a file
rg   encodingN%File %s has been read and evaluated.
z"Error when reading options: %s: %sz-Unexpected error when reading options: %s: %sz$Not a dict: repr(options_dict) = %s
r]   rH   rh   r^   r_   )r   r   isfiler   openastliteral_evalreadr   r   r   PermissionErrorSyntaxErrorIndentationError	exception	__class____name__	ExceptionrA   dictr0   ry   rR   rQ   rz   r?   r{   )r   options_dictoptions_fileerrors   &   r4   r   ZEmojiPickerUI._read_options  s    77>>$,,--&$,,#*, ,/;#&#3#3L4E4E4G#HL, ;;;LL@**, ",55{{{C(* $&Ll"|F3S99%f-DJzzR$
,&Z 83,GG)*5DN,&Z 8$??)*5DN @ '=, , , $[2BC B  !E!&!9!95B B 5  COO,,e5 55 ",55{{{C(* $&L 6se   G %F37G ?6I 3G	>	G I+HI II+II II ,JJc                r   r   r<   rb   rd   r4   r5   re   &  s     % %t %r6   c                s"   RV P                   RV P                  RV P                  /p\        V P                  RRR7      ;_uu_ 4       pVP                  \        V4      4       VP                  R4       RRR4       R#   + '       g   i     R# ; i)	z6
Save the options for 'font' and 'fontsize' to a file
r]   r^   r_   wrg   Zmoder[  r  N)ry   rz   r{   r^  r   writerepr)r   rj  rk  s   &  r4   r   ZEmojiPickerUI._save_options&  s|    
 DJJ
 $$$"$ $'3tL12t$	$ $ $ $s   ,A==B	c                0   < V ^8  d   QhRS[ S[,          /# rE   r   r0   rb   rd   r4   r5   re   5  s     D DtCy Dr6   c                s:   a  \        S P                  V 3R lR7      # )z-
Return a sorted list of recently used emoji
c                 p   < SP                   V ,          R ,          ) SP                   V ,          R,          ) 3# rS   countr   r	  r   r
  r4   r  Z5EmojiPickerUI._sorted_recently_used.<locals>.<lambda>:  s5     55a8@@ 55a8AA%Cr6   r  )r  r   r   s   fr4   r;  Z#EmojiPickerUI._sorted_recently_used5  s"     d//CD 	Dr6   c                r   r   r<   rb   rd   r4   r5   re   >  s     && &&T &&r6   c                s   / p\         P                  P                  V P                  4      '       d    \	        V P                  RR7      ;_uu_ 4       p\
        P                  ! VP                  4       4      pRRR4       \        P                  '       d!   \        P                  RV P                  4       \%        T\&        4      '       g/   \        P                  '       d   \        P                  RT4       / p/ V n        VP+                  4        F-  w  rEV'       g   K  VV P(                  V P-                  V4      &   K/  	  V P(                  '       g   V P/                  4        V P1                  4        R#   + '       g   i     EL; i  \        \        \        3 d7   p\        P                  RTP                  P                   T4        Rp?ELRp?i\"         d7   p\        P                  RTP                  P                   T4        Rp?ELZRp?ii ; i  \%        T\&        4      '       g0   \        P                  '       d   \        P                  RT4       / pi i ; i)z)
Read the recently use emoji from a file
rg   rZ  Nr\  z)Error reading recently used emoji: %s: %sz4Unexpected error reading recently used emoji: %s: %sz+Not a dict: repr(recently_used_emoji) = %s
)r   r   r]  r   r^  r_  r`  ra  r   r   r   rb  rc  rd  re  rf  rg  rh  rA   ri  r   Zitemsr   _init_recently_used_cleanup_recently_used)r   Zrecently_used_emojiZrecently_used_filerl  rh   values   &     r4   r   Z!EmojiPickerUI._read_recently_used>  s    !77>>$8899-$88#*, ,/A*-*:*:*//1+3', ;;;LL@668 ""5t<<{{{J/1 +-'$&!/557LEuJO ))??FH 8
 ((($$&##%?, , , $[2BC B  !L!&!9!95B B 5  JOO,,e5 55 ""5t<<{{{J/1 +-' =se   F	 %E57F	 ?6H 5F	 	F	 	H+G
H HH+H	H HH ,IIc                r   r   r<   rb   rd   r4   r5   re   f  s     5 5 5r6   c                s   a  \        S P                  4      S P                  8  d?   \        S P                  V 3R lR7      S P                  R  F  pS P                  V K  	  R# R# )zL
Reduces the size of the recently used dictionary
if it has become too big.
c                 rs  rt  rv  rw  r
  r4   r  Z6EmojiPickerUI._cleanup_recently_used.<locals>.<lambda>n  s4    33A6v>>33A6w??#r6   r  N)rv   r   r   r  r   s   f r4   ry  Z$EmojiPickerUI._cleanup_recently_usedf  sd    
 t(()D,M,MM--
 889; --e4; Nr6   c                r   r   r<   rb   rd   r4   r5   re   t  s     " "T "r6   c                s    / V n         V P                  4        V P                  RRV P                  38X  d   V P	                  4        R# R# )z
Initialize the recently used emoji

- Make the the recently used emoji empty
- Save it to disk
- Clear the flowbox if it is currently showing the recently used
rH   N)r   _save_recently_used_emojir   r   r3  r   r:   r4   rx  Z!EmojiPickerUI._init_recently_usedt  sG     %'!&&(**R2234!4r6   c                8   < V ^8  d   QhRS[ P                  RR/# r,   _buttonr.   Nr   Buttonrb   rd   r4   r5   re     s!     # #::#*.#r6   c                s    \         P                  '       d   \        P                  R4       V P                  P	                  4        V P                  4        R# )u6   
:param _button: The “Clear recently used” button
z(on_clear_recently_used_button_clicked()
N)r   r   r   r|   popdown_currentrx  r   r~  r   r4   %on_clear_recently_used_button_clickedZ3EmojiPickerUI.on_clear_recently_used_button_clicked  s8    
 ;;;LLDE++-  "r6   c                r   r,   rh   r.   Nr/   rb   rd   r4   r5   re     s     ) )3 )4 )r6   c                sR   WP                   9   dQ   V P                   V,          R;;,          ^,          uu&   \        P                  ! 4       V P                   V,          R&   M&R^R\        P                  ! 4       /V P                   V&   V P                  4        V P                  4        R# )zP
Adds an emoji to the resently used dictionary.

:param emoji: The emoji string
ru  rS   N)r   rS   ry  r{  r   r   r4   _add_to_recently_usedZ#EmojiPickerUI._add_to_recently_used  s     ---%%e,W5:57;yy{D%%e,V4 FDIIK01D%%e,##% 	&&(r6   c                r   r   r<   rb   rd   r4   r5   re     s     % %4 %r6   c                s    \        V P                  RRR7      ;_uu_ 4       pVP                  \        V P                  4      4       VP                  R4       RRR4       R#   + '       g   i     R# ; i)z&
Save the list of recently used emoji
rm  rg   rn  r  N)r^  r   ro  rp  r   )r   Zrecents_files   & r4   r{  Z'EmojiPickerUI._save_recently_used_emoji  s^     $00"$ $'3tD$=$=>?t$	$ $ $ $s   6A!!A2	c                r   )r,   r-   r.   Nr/   rb   rd   r4   r5   re     s     6 6C 6D 6r6   c                sp   \         ^8  d   \        P                  P                  \        P
                  4      p\        P                  P                  \        P                  4      pVP                  VR4       VP                  VR4       VP                  4        VP                  4        R# V P                  4       pVe1   \        P                  P                  V4      pVP                  V4       V P                  4       pVe3   \        P                  P                  V4      pVP                  V4       R# R# )u   
Set the clipboard and the primary selection to “text”

Works on both Gtk3 and Gtk4

:param text: The text to set the clipboards to
Nrs   )r   r   Z	ClipboardZgetr   ZSELECTION_CLIPBOARDZSELECTION_PRIMARYrG  rG   Zget_clipboardZContentProviderZnew_for_valueZset_contentZget_primary_clipboard)r   r-   Z	clipboardZprimaryZcontent_provider   &&   r4   _set_clipboardsZEmojiPickerUI._set_clipboards  s     q=))#*A*ABImm''(=(=>GtR(T2& OOMMO**,I$#&#6#6#D#DT#J %%&67002G"#&#6#6#D#DT#J ##$45	 #r6   c                r   r  r/   rb   rd   r4   r5   re     s     0 00!%0r6   c                s   TpR\        \        V P                  4      4       R2p\        P                  ! V P
                  4       FD  pV P                  P                  WR7      pV'       g   K)  VRRP                  V4       2,          p M	  \        P                  ! V P
                  4       FW  pV P                  P                  WR7      pV'       g   K)  VRV P                  RV4       RRP                  V4       2,          p M	  V P                  P                  V4       V P                  P                  V4       R# )	z
Show a concise description of an emoji in the header bar
of the program.

:param emoji: The emoji for which a description should be
              shown in the header bar.
r4  r5  r  r  r  rr   r  N)rv   r   r   r   r   r   r   r  r   rq   r   r   r<  r=  )r   rh   rf   Zsubtitler   r  rq      &&     r4   -_show_concise_emoji_description_in_header_barZ;EmojiPickerUI._show_concise_emoji_description_in_header_bar  s    4T]]CDEQG !11$//BH''--e-GEu1TYYu-.//	 C !11$//BH**33E3MHx++JAB"TYYxEXDYZ\ C 	""5)%%h/r6   c                r   r   r<   rb   rd   r4   r5   re     s     5 5 5r6   c                 s   \         P                  4        \        P                  ! 4       p \        P
                  ! \         V R7      pVP                  4        VP                  R4       VP                  R^4       VP                  R^24       VP                  R^4       \        P                  RV P                  4       4       \        P                  R\        P                  P                  4       4       \        P                  R\        P                   P"                  P                  4       4       \        P                  R	\        P                   P$                  P                  4       4       \        P                  R
\        P&                  P                  4       4       \        P                  R\        P(                  P                  4       4       R# )z.
Print some profiling information to the log.
ZstreamZ
cumulativeZemoji_pickerr   r  zProfiling info:
%sz(itb_util.remove_accents() cache info: %szDitb_emoji.EmojiMatcher.variation_selector_normalize() cache info: %sz;itb_emoji.EmojiMatcher.get_all_label_words() cache info: %sz)itb_emoji._match_classic() cache info: %sz+itb_emoji._match_rapidfuzz() cache info: %sN)PROFILEZdisableioZStringIOpstatsZStatsZ
strip_dirsZ
sort_statsZprint_statsr   rB  Zgetvaluer   Zremove_accentsZ
cache_infor   r   r   Zget_all_label_wordsZ_match_classicZ_match_rapidfuzz)Zstats_streamZstatss     r4   print_profiling_informationZ)EmojiPickerUI.print_profiling_information  sF    	{{}W\:&."-+r*+r*)<+@+@+BC6##..0	2 	R""??JJL	N 	I""66AAC	E 	7$$//1	3 	9&&113	5r6   c                &   < V ^8  d   QhRS[ RS[/# r,   _argsr.   r   r?   rb   rd   r4   r5   re     s      s t r6   c                s    \         P                  R4       V P                  4        \        P                  '       d   V P
                  P                  4        \        e   \        P                  4        R# \        R4      h)z=The window has been deleted, probably by the window manager. z%Window deleted by the window manager.GLIB_MAIN_LOOP not initialized!F)
r   rB  r{  r   r   rf  r  GLIB_MAIN_LOOPquitRuntimeErrorr   r     &*r4   r   ZEmojiPickerUI.on_close  sY    ;<&&(;;;NN668%!  @AAr6   c          
      s4   < V ^8  d   QhRRRS[ RS[ RRRS[/# )r,   _controllerzGtk.EventControllerKeykeyvalkeycodestatezGdk.ModifierTyper.   rR   r?   rb   rd   r4   r5   re     s=     8 818 8 	8
 &8 
8r6   c                s:    V P                  V \        W#V4      4      # )a  
Gtk4 key-pressed signal handler.

Gtk4 no longer provides Gdk.EventKey objects for window-level
key events, so this callback receives the raw keyval/keycode/state
values from EventControllerKey.  To keep the Gtk3 and Gtk4 code paths
unified, we wrap these values in a FakeEventKey instance and forward
them to on_main_window_key_press_event(), which contains the common
key handling logic.

Returns:
    bool: True if the event was handled.
)r   r%   )r   r  r  r  r  s   &&&&&r4   r   Z-EmojiPickerUI.on_main_window_key_pressed_gtk4  s#    ( 22,v68 	8r6   c                s>   < V ^8  d   QhRS[ P                  RRRS[/# )r,   _window	event_keyzGdk.EventKeyr.   )r   rt   r?   rb   rd   r4   r5   re   *  s7     CI CIZZCI &CI 
	CIr6   c                st   \         P                  '       d!   \        P                  RVP                  4       \	        V P                  4       \        P                  4      '       d   R# VP                  \        P                  P                  ,          '       dD   VP                  R8X  d3   V P                  P                  R4       \        V P                  4       R# \!        \        P                  R4      '       d   \        P                  P"                  M\        P                  P$                  pVP                  \        P                  P                  V,          \        P                  P&                  ,          ,          '       d   R# VP                  '       g   R# V P                  P                  R4       \        V P                  4       V P(                  P+                  4       '       g   \,        P.                  P1                  4       pVP3                  4       '       dW   VP5                  R4       \6        P8                  '       g   K?  \        P;                  R4       \<        P>                  ! ^4       Kl  \@        ^8  d%   \C        V P                  PE                  V4      4      # \G        W P(                  4      # )za
Some key has been typed into the main window

:param _window: The main window
:param event_key:
zkeyval = %s
Fr@   TALT_MASKr6  )$r   r   r   r  rA   Z	get_focusr   ZEditabler  r   ModifierTypeZCONTROL_MASKZstringr   r   r   Zhasattrr  Z	MOD1_MASKZ	META_MASKr   Zget_realizedr   r>  rL   Zpendingr?  r@  rA  rB  rC  rD  r   r?   Zhandle_eventr   )r   r  r  Zalt_maskZctxs   &&&  r4   r   Z,EmojiPickerUI.on_main_window_key_press_event*  s    ;;;LL)*:*:;dnn&55__s//<<<<  C' ,,T2T%%&s//<< $$--))33 	 ??c..;;''112 3 3((.!!". !!..00 ""**,C++--e$!555KK @AHHQKq=((55i@AA))5G5GHHr6   c                r|  r,   buttonr.   Nr  rb   rd   r4   r5   re   o  s#     	D 	Dcjj 	DT 	Dr6   c                s    \         P                  '       d   \        P                  R4       V P                  P	                  4        \
        P                  ! \        V4      R7       R# )uQ   
The “About” button has been clicked

:param _button: The “About” button
zon_about_button_clicked()
)ZparentN)r   r   r   r|   r  r   ZItbAboutDialogr   )r   r  r   r4   on_about_button_clickedZ%EmojiPickerUI.on_about_button_clickedo  s@     ;;;LL67++-':6'BCr6   c                r   r   r<   rb   rd   r4   r5   re   z  s     k k4 kr6   c           	     s   \         P                  '       d!   \        P                  RV P                  4       ^ V n        V P                  4        V P                  4        V P                  pV P                  P                  VV P                  V P                  R7      pV P                  4        V P                  P                  \        R4      4       V P                  P                  R\!        V4       R24       V'       g$   \"        P$                  ! R^\        R4      R7      .p\'        V4       EF  w  r4V P)                  V\!        V4      ,          4       \*        P,                  P/                  4       P1                  R	4      '       dF   \2        P4                  '       g   KK  \        P7                  R
4       \8        P:                  ! ^4       Kx  V P                  V8w  d4   \        P                  RWP                  4       V P=                  4         R# V P?                  VP@                  4      pVPB                  pVPD                  p\F        PH                  ! 4       pV PK                  V4      p	RV PL                   RV PN                   R\Q        V	4      PS                  4        R2\T        PV                  ! V4      ,           R,           RV PN                  ^,           R2,           R,           \T        PV                  ! V4      ,           R,           p
\         P                  '       d1   V
RV PN                  ^,           R2RVR 2,           R,           ,          p
VPY                  V
4       VP[                  R4       VP]                  R	4       VP_                  R	4       VPa                  R	4       VPc                  R	4       VPe                  ^ 4       VPg                  R4       VPi                  \F        Pj                  Pl                  4       VPo                  \F        Pj                  Pl                  4       ^ pVPq                  V4       VPs                  V4       VPu                  V4       VPw                  V4       V Py                  WX4       \{        4       p\}        W4       VP                  RV P                  4       VP                  RV P                  4       VP                  RV P                  4       \F        P                  ! 4       p\        ^8  d#   VP                  R4       VP]                  R4       \}        W4       V P                  P                  VR4       \        V P                  4       V^ 8X  g   EKB  V P                  P                  V4       \        V P                  4      pV P                  V^ ,          R	R7       EK  	  \        V 4       V P=                  4        R# )zk
Get the emoji candidates for the current query string
and fill the flowbox with the results of the query.
z6_fill_flowbox_with_search_results() query_string = %s
)r`   ra   zSearch Resultsr4  r5  u   ∅zSearch produced empty result.)phrase	user_freqcommentFr6  zquery string changed: %r -> %rNr  r  r  r7  r  z" foreground="red">z0.2fTr8  rk   r9  r:  show_popoverrs   )Lr   r   r   r   r   r   r3  r   
candidatesr   r   r  r   r<  r;   r=  rv   r   ZPredictionCandidater   r   r   r>  rL   r?  r@  rA  rB  rC  rD  r   r   r  r  r  r   r"  r  ry   rz   r0   rB   r  r  rG  rH  r   rI  r   r   rJ  rK  rL  r   rM  r   r   r   rN  rO  r%  r$   r   r   rP  rQ  rR  rS  r   r1  r   rT  r   select_childr   _emoji_label_selected)r   query_stringr  rF  Z	candidaterh   Zscorer  rm   r_   r-   rV  rW  rX  emoji_labelss   &              r4   !_fill_flowbox_with_search_resultsZ/EmojiPickerUI._fill_flowbox_with_search_resultsz  s   
 ;;;LLI""$ *+&))((33))'' 4 )

 	**,""1%5#67%%3z?)<A&>?"669:< =J
 !** 5Ec*o 56 ""**,66u==!555KK @AHHQK!!\1 4 "4"46 !??	@P@PQE''E$$DIIKE44U;Htzzl!DNN+; < ]002327++e$%  !!!3 4B7	8
 
 D)*   {{{"4>>A#5"66IJ%&' ! NN4   &&  'e$e$QS! SYY^^,SYY^^,F""6*  (  (##F+))%7/1Ii'4AACDDDF L LN,,.MA~++D1++D1m/MM  3T]]#z **=97F**<?*OY !6\ 	r6   c                @   < V ^8  d   QhRS[ P                  RS[RS[/# )r,   spin_buttonr  r.   )r   r   r   r?   rb   rd   r4   r5   re     s-        
	r6   c                    \         P                  '       d    \        P                  R\        V4      4       \	        V4       \
        ^8  d   \        P                  ! VR4       R# )z
Signal handler called when the spin button to change
the font size grabs focus

:param spin_button: The spin button to change the font size
z6on_fontsize_spin_button_grab_focus() spin_button = %s

grab-focusTr   r   r   rp  r)   r   r   Zsignal_stop_emission_by_name)r   r  r     &&*r4   r   Z0EmojiPickerUI.on_fontsize_spin_button_grab_focus  sJ     ;;;LLI[!# 	%[1 q=00lKr6   c          
      s`   < V ^8  d   QhRS[ P                  RS[RS[RS[P                  RS[/# )r,   r  r  _keycode_stater.   )r   r   rR   r   r  r?   rb   rd   r4   r5   re     sI     & &++& & 	&
   & 
&r6   c                s   V\         P                  39   d   V P                  P                  4       '       d   \	        V P
                  4      pV'       d   V^ ,          pV P
                  P                  4        V P
                  P                  V4       \        P                  P                  V P
                  V4       VP                  4        \        V P
                  4      pV P                  V^ ,          RR7       R# R# )z8Handler called when a key is pressed on the search entryFr  T)r   ZKEY_Downr   get_search_moder   r   
grab_focusr  r   r   r   r   r  )r   r  r  r  r  ZchildrenZchildr  s   &&&&&   r4   r   Z)EmojiPickerUI.on_search_entry_key_pressed  s     s||o%  0022+DMM:H !((***51" &&t}}e<  "7F**<?*Or6   c                r  )r,   search_entryr  r.   )r   r   r   r?   rb   rd   r4   r5   re   &  s-      //  
	r6   c                r  )z`
Signal handler called when the search entry grabs focus

:param search_entry: The search entry
z/on_search_entry_grab_focus() search_entry = %s
r  Tr  )r   r  r  r  r4   r   Z(EmojiPickerUI.on_search_entry_grab_focus&  sJ     ;;;LLB\"$ 	%\2 q=00|Lr6   c                r|  r,   r  r.   Nr   r   rb   rd   r4   r5   re   <  s!     '4 '4//'4.2'4r6   c                sl   VP                  4       p\        P                  '       d   \        P                  RV4       RV n        V P
                  P                  4       '       g   R# VP                  4       '       d   VRR pMVP                  4       pW P                  8X  d.   \        P                  '       d   \        P                  R4       R# W n	        V P                  '       d(   \        P                  ! V P                  4       ^ V n
        \        P                  ! ^dV P                  4      V n
        R# )z\
Signal handler for changed text in the search entry

:param search_entry: The search entry
z3on_search_entry_search_changed() query_string = %s
Nz;query string effectively unchanged (only whitespace change)rs   )get_textr   r   r   r   r   r  ZisspaceZstripr   r   r   Zsource_removetimeout_addr  )r   r  r     && r4   r   Z,EmojiPickerUI.on_search_entry_search_changed<  s     $,,.;;;LLF *.&//11 !! (,L
 (--/L---{{{QS))))t==>-.D*)-)9)922*4&r6   c                r|  )r,   	selectionr.   N)r   ZTreeSelectionrb   rd   r4   r5   re   e  s#     1 1((1-11r6   c                s\   VP                  4       w  r#V'       g   R# \        P                  '       d8   \        P                  RW#,          R,          \	        V P
                  4      4       V P                  P                  R4       V P                  P                  R4       RV n
        V P                  P                  4        W#,          ^,          pW#,          ^,          pW#,          ^,          pV P
                  WEV38X  d   R# WEV3V n        \        P                  ! V P                  4       R# )z
Signal handler for selecting a category in the list of categories

:param selection: The selected row in the browsing treeview
Nz9model[iterator] = %s
self._currently_selected_label = %s
:NNNFrH   )Zget_selectedr   r   r   rp  r   r   r   r   rG  r   r   r  r   idle_addrY  )r   r  ZmodelZiteratorr   r  rm   r  r4   r   ZEmojiPickerUI.on_label_selectede  s     &224;;;LL8"T334	6 	((/##B'((*?1%OA&	"))h5-II*2u)E&d//0r6   c                sl   < V ^8  d   QhRS[ P                  RS[ P                  RS[ P                  RR/# )r,   treeviewtreepathcolumnr.   N)r   r   r   r   rb   rd   r4   r5   re     sA     > >ll> ll> &&	> ,0	>r6   c                s    \         P                  '       d6   \        P                  R\        V4      \        V4      \        V4      4       R# R# )zSignal handler for activating a row in the browsing treeview

:param treeview: The browsing treeview
:param treepath: The path of the activated row in the browsing treeview
:param column: The column of the activated row in the browsing treeview
zon_row_activated() %s %s %s
N)r   r   r   rp  )r   r  r  r  s   &&&&r4   r   ZEmojiPickerUI.on_row_activated  s4     ;;;LL/XXV> r6   c                r  r   )r0   r?   rb   rd   r4   r5   re     s      c d r6   c                s    V P                   '       g   R# \        P                  ! V P                  V4      '       g   R# R# )z
Which fallback value to use best in the pango markup for this emoji.

If fallback is requested, pango may fall back to a different font,
even if the currently selected font supports the emoji just fine.
In that case, avoid the fallback.
FT)r{   r  Zemoji_font_fallback_neededry   r   r   r4   r  Z&EmojiPickerUI._optimize_pango_fallback  s-     ~~~33DJJFFr6   c                s<   < V ^8  d   QhRS[ RS[S[ S[ 3,          /# r+   )r0   r   rb   rd   r4   r5   re     s%       %c3hr6   c                s   RpRp\         P                  ! R4      pVP                  V4      pV'       db   \        P                  ! VP                  R4      4      pVP                  R4      '       d&   \        P                  ! VP                  R4      4      p\        P                  '       d   \        P                  RWV4       W#3# )z
Parse the emoji and its name out of the text of a label

Returns a tuple of two strings of the form (emoji, name)

:param text: The text with markup containing the emoji
             and maybe its name
rH   rh   r  ztext = %s emoji = %s name = %s
zJ<span[^<]*?>(?P<emoji>[^<]+?)</span>(<span[^<]*?>(?P<name>[^<]+?)</span>)?)	reZcompilematchr  ZunescapeZgroupr   r   r   )r   r-   rh   r  Zpatternr     &&    r4   _parse_emoji_and_name_from_textZ-EmojiPickerUI._parse_emoji_and_name_from_text  s     **89 d#MM%++g"67E{{6""}}U[[%89;;;LL2T# }r6   c                s@   < V ^8  d   QhRS[ P                  RS[RS[/# )r,   emoji_labelr  r.   )r   r"  r?   rb   rd   r4   r5   re     s-     * ** * 
	*r6   c                s  a  VP                  4       p\        P                  '       d   \        P                  RV4       S P	                  V4      w  rEV'       g   \        \        P                  4      # S P                  V4       S P                  V4       S P                  V4       V'       g   R# \        V\        P                  P                  R7      S n        S P                  pVP!                  R4       \        P"                  ! 4       pVP%                  \'        R4      4       \)        Wg4       S P*                  P-                  V\.        P0                  4       \2        P4                  ! RV 3R l4       R# )a  
Called when an emoji label was selected in the flowbox.

The emoji is then copied to the clipboard and a popover
pops up for a short time to notify the user that the emoji
has been copied to the clipboard.

:param emoji_label: The Gtk.Label which contains the emoji
z
text = %s
TZpointing_toZpositionCopied to clipboard!  c                  X   < S P                   P                  \        P                  R 7      # Zkindr|   r  r    EMOJI_SELECTEDr      r4   r  Z5EmojiPickerUI._emoji_label_selected.<locals>.<lambda>       //Y5M5M/Nr6   )	get_labelr   r   r   r  r?   r   EVENT_PROPAGATEr  r  r  r"   r   PositionTypeTOPr   r   r"  rG  r;   r   r|   popupr    r  r   r  )r   r  r  r-   rh   _namepopoverrm   s   f&&     r4   r  Z#EmojiPickerUI._emoji_label_selected  s   & $$&;;;LL-==dC++,,::5AU#""5)'5#c.>.>.B.B(D$..d#		q/01'!!!'9+C+CD O	P r6   c                sN   < V ^8  d   QhRS[ P                  RS[P                  /# )r,   flowboxr.   )r   r   r   r  rb   rd   r4   r5   re     s)     # #[[# 
		#r6   c                s   \         P                  '       d   \        P                  R4       VP                  4       pV'       g<   \         P                  '       d   \        P                  R4       \        P
                  # V^ ,          p\        ^8  d    VP                  4       P                  4       pMVP                  4       P                  4       pV P                  VRR7       \        P
                  # )a%  
Signal handler called when the selection of emoji in the
flowbox changes.

Not called if long press gestures are used to show the
skin tone popovers. In that case, emoji selection is handled
in on_flowbox_event_box_button_release() instead.

:param _flowbox: The flowbox displaying the Emoji
zon_emoji_selection_changed()zNothing selectedFr  )
r   r   r   Zget_selected_childrenr   r  r   	get_childZget_first_childr  )r   r  ZselectedrX  r  r  r4   r2  Z(EmojiPickerUI.on_emoji_selection_changed  s     ;;;LL78002{{{/0&&& >'113CCEK'113==?K"";U"C"""r6   c                r|  r  r  rb   rd   r4   r5   re     s#     E E#** E Er6   c                s   \         P                  '       d   \        P                  R4       \        V\        P
                  P                  R7      V n        V P                  pVP                  \        P
                  P                  4       VP                  R4       \        P                  ! 4       pVP                  \        P                  P                  4       VP                  ^ 4       \        P                  ! \!        R4      R7      pVP#                  RV P$                  4       \'        W44       V P(                  '       gH   \        P                  ! \!        R4      R7      pVP#                  RV P*                  4       \'        W54       \        P                  ! \!        R4      R7      pVP#                  RV P,                  4       \'        W64       \'        W#4       V P.                  P1                  V\2        P4                  R	7       R
# )zM
The main menu button has been clicked

:param _button: The main menu button
zon_main_menu_button_clicked()
r  TzClear recently used)rm   rk   ZAboutZQuitr  N)r   r   r   r"   r   r  BOTTOMr   r   r   r   r   r   r   r   r  r;   r   r  r   rw   r  r   r|   r  r    Z	MAIN_MENU)r   r  r  vboxZclear_recently_used_buttonZabout_buttonZquit_buttonr  r4   r   Z)EmojiPickerUI.on_main_menu_button_clicked  sb    ;;;LL:;"0)9)9)@)@#B))S--445d#wwyS__556%(ZZa8M6N%O""**tAA	C$3{{{::AgJ7L  D,H,HId)jjqy1It}}5$$' !!'	0C0C!Dr6   c                r|  r}  r  rb   rd   r4   r5   re   "  s     	4 	4szz 	4d 	4r6   c                s    \         P                  '       d   \        P                  R4       V P                  P	                  V P                  P                  4       '       * 4       R# )zY
The search button in the header bar has been clicked

:param _button: The search button
z"on_toggle_search_button_clicked()
N)r   r   r   r   r   r  r  r   r4   r   Z-EmojiPickerUI.on_toggle_search_button_clicked"  sC     ;;;LL>?((  0022	4r6   c                r   r   r<   rb   rd   r4   r5   re   -  s        d  r6   c           	     s   \        V P                  4       EF  pVP                  4       pV P                  V4      w  r4V'       g   K1  V P	                  V4      pV P                  V4      pRV P                   RV P                   R\        V4      P                  4        R2\        P                  ! V4      ,           R,           pV'       dA   VRV P                  ^,           R2\        P                  ! V4      ,           R,           ,          pVP                  V4       VP                  R4       EK  	  \        V P                  4       R# )	zJ
Update the font and fontsize used in the current content
of the flowbox.
r  r  r  r7  r  z<span fallback="true" font="TN)r   r   r  r  r   r  ry   rz   r0   rB   r  r  rG  rH  r   )r   rm   r-   rh   r  r_   new_texts   &      r4   _change_flowbox_fontZ"EmojiPickerUI._change_flowbox_font-  s   
 .dmm<E??$D @@FMUuCCEJ88?"4::,a/? @!!$X!4!4!6 7r;kk%()    
 6t~~7I6J"M++d+,#$%H x($$T*# =$ 	r6   c                R   < V ^8  d   QhRS[ P                  RS[ P                  RR/# )r,   r   rX  r.   N)r   r   rS  rb   rd   r4   r5   re   F  s8     9P 9Pkk9P ++9P 159Pr6   c                s  a  VP                  4       pVP                  4       p\        P                  '       d   \        P                  RV4       S P                  V4      w  rVV'       g   R# S P                  V4       S P                  V4       S P                  V4       S P                  f   \        P                  R4       R# S P                  pVP                  4       pS P                  V4      w  rV'       d   V	'       g   S P                  V4      p
RS P                   RS P                   R\        V
4      P                  4        R2\        P                   ! V4      ,           R,           pVP#                  V4       VP%                  R	4       \'        V\(        P*                  P,                  R
7      S n        S P.                  p\(        P0                  ! 4       pVP#                  \3        R4      4       \5        W4       S P6                  P9                  V\:        P<                  4       \>        P@                  ! RV 3R l4       R# )z
Signal handler for selecting a skin tone emoji

:param _flowbox: The flowbox displaying the skin tone emoji
:param flowbox_child: The child object containing the selected emoji
z"on_skin_tone_selected() text = %s
Nz;self._skin_tone_popover_originated_from_emoji_label is Noner  r  r  r7  r  Tr  r  r  c                  r  r  r  r   r  r4   r  Z5EmojiPickerUI.on_skin_tone_selected.<locals>.<lambda>~  r  r6   )!r  r  r   r   r   r  r  r  r  r   r  ry   rz   r0   rB   r  r  rG  rH  r"   r   r  r  r   r"  r;   r   r|   r  r    r  r   r  )r   r   rX  r  r-   rh   r  Zorig_emoji_labelZ	old_emojiZold_namer_   r  r  rm   s   f&&           r4   on_skin_tone_selectedZ#EmojiPickerUI.on_skin_tone_selectedF  s    $--/$$&;;;LL>E==dC::5AU#""5)
 >>FLLMONN))+ $ D DT JX 44U;Htzzl!DNN+; < ]002327++e$%  
 %%h/++D1+9(33C3C3G3G,I(22		q/01'!!!'9+C+CD O	Pr6   c                "   < V ^8  d   QhRRRR/# )r,   rW  r$   r.   Nr<   rb   rd   r4   r5   re     s     
0 
00
0 

0r6   c                s    \         P                  '       d   \        P                  RV4       V P                  V4       R# )zF
:param event_box: The event box containing the label with the emoji.
z,on_flowbox_event_box_long_press_pressed() %rN)r   r   r   _show_skin_tone_popover)r   rW  r   r4   rR  Z5EmojiPickerUI.on_flowbox_event_box_long_press_pressed  s-     ;;;LL>	K$$Y/r6   c                *   < V ^8  d   QhRRRS[ RS[/# r,   rW  r$   r  r.   r  rb   rd   r4   r5   re     )     ) )0) ) 
	)r6   c                s    \         P                  '       d   \        P                  RW4       \        \        P
                  4      # )a  Signal handler for button presses in flowbox children

Does nothing because a button press could still turn into
a long press. Only if the button release handler is called
we know that it was not a long press. So call the
short press button actions in the release handler!

:param event_box: The event box containing the label with the emoji.
:param button: The mouse button number (1, 2, 3)
event_box=%r button=%d)r   r   r   r?   r   r  r   rW  r     &&&r4   rP  Z/EmojiPickerUI.on_flowbox_event_box_button_press  s-     ;;;LL19EC''((r6   c                r  r  r  rb   rd   r4   r5   re     r  r6   c                s    \         P                  '       d   \        P                  RW4       V^8X  d   V P                  V4       V^8X  d   V P	                  V4       \        \        P                  4      # )z
Signal handler for button release events on labels in the flowbox

:param event_box: The event box containing the label with the emoji.
:param button: The mouse button number (1, 2, 3)
r  )r   r   r   r  _show_emoji_info_popoverr?   r   r  r  r  r4   rQ  Z1EmojiPickerUI.on_flowbox_event_box_button_release  sW     ;;;LL19EQ;((3Q;)))4C''((r6   c                r  r,   rW  zGtk.EventBoxr.   Nr<   rb   rd   r4   r5   re     s%     lE lE+lE	lEr6   c                s   \        V4      pW n        VP                  4       pV P                  V4      w  rEV'       g   R# . pV P                  P                  V4       F#  pVP                  V P                  V4      4       K%  	  \        V4      ^8:  d   R# VP                  4       p\        V\        P                  4      '       d\   VP                  4       '       gF   V P                  P                  4        V P                  P!                  V4       VP                  4        \#        V\        P$                  P&                  R7      V n        V P(                  p	V	P+                  R4       V	P-                  R4       \        P.                  ! 4       p
^pV
P1                  V4       V
P3                  V4       V
P5                  V4       V
P7                  V4       \        P8                  ! 4       pVP;                  4       P=                  R4       VP?                  \        P@                  PB                  4       VPE                  ^4       VPG                  ^4       VPI                  ^ 4       VPK                  ^ 4       VPM                  R4       VPO                  \        PP                  PR                  4       VPU                  R4       VPW                  R4       VP-                  R4       VP+                  R4       VPY                  RV PZ                  4       V EF  p\        P\                  ! 4       pV P_                  V4      pVPa                  RV Pb                   RV Pd                   R	\g        V4      Pi                  4        R
2\j        Pl                  ! V4      ,           R,           4       VPo                  R4       VPU                  R4       VPq                  R4       VP-                  R4       VP+                  R4       VPs                  R4       VPu                  R4       VPw                  \        P@                  Px                  4       VP?                  \        P@                  Px                  4       ^ pVP1                  V4       VP3                  V4       VP5                  V4       VP7                  V4       VP{                  \}        R4      4       VPU                  R4       VP                  VR4       EK  	  \        P                  ! 4       pVP-                  R4       VP+                  R4       VP                  R4       VP                  R4       \        W4       V
P                  V^ ^ ^^4       \        W4       \        V
4       \        V4      w  pp\        V4      w  pp\        V 4      w  ppV
P                  \        RV,          V4      \        RV,          V4      4       V P                  P                  V	\        P                  R7       R# )a)  
Show a skin tone popover if there is an emoji in this event box
which supports skin tones.

If there is no emoji or it does not support skin tones, do nothing.

:param event_box: The event box containing the label with the emoji.
                  The popover will be relative to this event box.
Nr  Fr&  Tzchild-activatedr  r  r  r7  r  r8  r#  333333?r  rs   )Or#   r   r  r  r   r$  r   r   rv   Z
get_parentrA   r   rS  Zis_selectedr   r  r  r"   r  r  r   r   r   ZGridr   r   rN  rO  r   r'  r(  r   r   r)  r*  r+  r,  r-  r   r.  r/  r0  r   r   r   r  r"  r  rG  ry   rz   r0   rB   r  r  rH  rI  rJ  rK  rL  rM  r   r;   rT  r   r   r   r   Zattachr   r   r   r   r   rE  r|   r  r    Z	SKIN_TONE)r   rW  r  r-   rh   r  r$  rU  rX  r  ZgridrV  r  rm   r_   scrollZ_min_width_flowboxZnatural_width_flowboxZ_min_height_flowboxZnatural_height_flowboxwindow_widthwindow_heights   &&                    r4   r  Z%EmojiPickerUI._show_skin_tone_popover  s    ?yI>I;$$&==dC!%!4!4!G!G!N%%;;<MNP "O !"a' ",,.mS%5%566 ,,..((***=9((*"0#c.>.>.B.B#D))E"E"xxzf%F#F#v&++-!!#--f5399??+))!,))!,"""1%,,T2""$$	&e$&D!D!)4+E+EF!3IIKE44U;HNNtzzl!DNN+; < ]002327++/01 
   &&  'e$e$S!S! SYY^^,SYY^^,F""6*  (  (##F+""1%9#:;&NN5"%5 "46 ##%4 4 $$U+$$T*&"FAq!Q'' 6I'6R3	28LW8U5	4(7(=%}l"$9:m#%;<	> 	!!'	0C0C!Dr6   c                r  r  r<   rb   rd   r4   r5   re   !  s'     ^F ^F%^F 
^Fr6   c           
     sn   \        V4      pVP                  4       pV P                  V4      w  rEV'       g   R# \        V\        P
                  P                  R7      V n        V P                  pVP                  R4       VP                  R4       \        P                  ! 4       pVP                  \        P                  P                  4       VP                  R4       VP                  R4       ^ pVP                  V4       VP                  V4       VP!                  V4       VP#                  V4       VP%                  V4       \        P&                  ! 4       p	\)        Wy4       \        P*                  ! 4       p
V
P-                  R4       V
P/                  R4       V
P                  R4       V
P                  R4       V
P1                  \        P2                  P4                  4       V
P7                  R4       \)        W4       \        P8                  ! 4       pVP                  R4       VP                  R4       VP;                  \        P<                  P>                  4       VPA                  \        P<                  P>                  4       V PC                  V4      pVPE                  RV PF                   RV PH                  ^,           R\K        V4      PM                  4        R2\N        PP                  ! V4      ,           R	,           4       V
PS                  VR4       V PU                  V4       EF-  p\        P8                  ! 4       p^ pVP                  V4       VP                  V4       VP!                  V4       VP#                  V4       VPW                  R4       VP                  R4       VP                  R4       VP;                  \        P<                  P>                  4       VPA                  \        P<                  P>                  4       \Y        VR\Z        P\                  P^                  R
7       VPE                  V4       V
PS                  VR4       EK0  	  V P`                  Pc                  V4      R8  g"   V P`                  Pe                  V4      '       d   \        Pf                  Pi                  \k        R4      4      pVPm                  RV,           R,           4       VP;                  \        P<                  P>                  4       V
PS                  VR4       \o        V
4       F6  pVPq                  R4       VPW                  R4       VP/                  R4       K8  	  \)        Wg4       \s        V4       \u        V4      w  pp\w        V4      w  pp\u        V
4      w  pp\w        V
4      w  pp\y        V 4      w  ppVP{                  \}        RV,          VV,           4      \}        RV,          VV,           4      4       V P~                  P                  V\        P                  R7       R# )z
Show an info popover if there is an emoji in this event box.

If there is no emoji in the event box, do nothing.

:param event_box: The event box containing the label with the emoji.
                  The popover will be relative to this event box.
Nr  FTr  r  r  r7  r  )ZwrapZ	wrap_model    zLookup on emojipediazhttp://emojipedia.org/emoji/ri   r  r  rs   )Cr#   r  r  r"   r   r  r  r   r   r   r   r   r   r   r   r   rN  rO  r   r   r   ListBoxr   r   r.  r/  ZNONEr   r"  rL  r   r)  r   r  Z
set_markupry   rz   r0   rB   r  r  rT  r!  rI  r   r   ZWrapModeZ	WORD_CHARr   r   r  Z
LinkButtonZnew_with_labelr;   Zset_urir   Zset_activatabler   r   r   r   r   rE  r|   r  r    Z
EMOJI_INFO)r   rW  r  r-   rh   r  r  r  rV  r  Zlistboxrm   r_   rF   Zlabel_descriptionZ
linkbuttonZrowZ_min_width_vboxZnatural_width_vboxZ_min_height_vboxZnatural_height_vboxZ_min_width_listboxZnatural_width_listboxZ_min_height_listboxZnatural_height_listboxr  r  s   &&                         r4   r  Z&EmojiPickerUI._show_emoji_info_popover!  s    ?yI$$&==dC#1#c.>.>.E.E$G **E"E"wwyS__556f%F#F#v& ##%$++-D!e$D!E"""3#4#4#9#9:,,T2&"		% % ))0074::,a(:'; <X,,./r3kk% ! 	
 	ub!33E:K #		F..v6,,V4,,V4//7,,T2))%0))%0((9((9!8P8PR((5NN,b1 ;  **51J>&&11%8866()+J.6<>!!#))//2NN:r*w'C&u%e$ ( 	' 0CD0I-,2Ft2L/	.6I'6R3	28LW8U5	4(7(=%}  l""%::<m##&<<>	?
 	!!'	0D0D!Er6   c                r|  )r,   
adjustmentr.   N)r   r   rb   rd   r4   r5   re     s!     1 1!nn1151r6   c                s    VP                  4       p\        P                  '       d   \        P                  RV4       W n        V P                  4        \        P                  ! V P                  4       R# )z{
The fontsize adjustment in the header bar has been changed

:param adjustment: The adjustment used to change the fontsize
z2on_fontsize_adjustment_value_changed() value = %s
N)	Z	get_valuer   r   r   rz   r   r   r  r  )r   r  rz  r  r4   r   Z2EmojiPickerUI.on_fontsize_adjustment_value_changed  sP     $$&;;;LLEuNd//0r6   c                r|  )r,   check_buttonr.   N)r   r   rb   rd   r4   r5   re     s!     1 1 #1481r6   c                s    VP                  4       V n        \        P                  '       d!   \        P                  RV P                  4       V P                  4        \        P                  ! V P                  4       R# )z
The fallback check button in the header bar has been toggled

:param toggle_button: The check button used to select whether
                      fallback fonts should be used.
z7on_fallback_check_button_toggled() self._fallback = %s
N)	Z
get_activer{   r   r   r   r   r   r  r  )r   r  r   r4   r   Z.EmojiPickerUI.on_fallback_check_button_toggled  sS     &002;;;LLJ  	d//0r6   c                rq  rE   rr  rb   rd   r4   r5   re     s     ; ;$s) ;r6   c                s*   . R	OpR\        R4      ,           R,           R\        R4      ,           R,           R\        R4      ,           R,           .pVP                  R4       V P                  4       pVP                  4       p\	        V Uu. uF  qUP                  4       NK  	  up4      pV FG  pVP                  R^R7      ^ ,          pW9   g   K%  VP                  V4       VP                  V4       KI  	  VP                  R4       W&,           pV# u upi )
z6
Returns a list of font names available on the system
u   emoji (zSystem defaultr5  u   text (u   unqualified (rH       )Zmaxsplit)u   Noto Color Emoji 🎨u   Blobmoji 🎨u   OpenMoji Color 🎨u   Twitter Color Emoji 🎨u   Twemoji 🎨u   Toss Face Font Web 🎨u   Apple Color Emoji 🎨u   Emoji Two 🎨u   Emoji One 🎨u   JoyPixels 🎨u   Segoe UI Emoji 🎨u   OpenMoji Black 🙾u   Symbola 🙾u   Noto Emoji 🙾u   Android Emoji 🙾u   og-dcm-emoji 🙾)r;   r   Zget_pango_contextZlist_familiesr  Zget_namesplitr   )	r   Zgood_emoji_fontsZavailable_good_emoji_fontsZpango_contextZfamiliesZfamilyr  r]   r  s	   &        r4   rx   ZEmojiPickerUI._list_font_names  s    
$
N +,,s2*++c1q!122S8&
"
 	#))"-..0 ..0Af)AB$D::dQ:/2D}T"*11$7	 %
 	#))"-*2 Bs   	Dc                r   )r,   filter_textr.   Nr/   rb   rd   r4   r5   re     s     /% /%c /%d /%r6   c                s   \         P                  '       d   \        P                  RV4       V P                  f   \        P                  R4       R# \	        V P                  4       \
        P                  ! 4       V n        V P                  f   \        P                  R4       R# \        V P                  V P                  4       V P                  P                  R4       V P                  P                  R4       V P                  P                  \
        P                  P                  4       V P                  P                  R4       V P                  P                  RV P                   4       V P#                  4        Uu. uFJ  pVP%                  RR4      P'                  4       VP%                  RR4      P'                  4       9   g   KH  VNKL  	  ppV F  p\
        P(                  ! 4       pVP+                  V4       VP-                  ^ 4       ^pVP/                  V4       VP1                  V4       VP3                  V4       VP5                  4       P7                  R	4       VP9                  V4       V P                  P;                  VR4       K  	  V P<                  f   \        P                  R
4       R# \?        V P<                  4       R# u upi )a  
Fill the listbox of fonts to choose from

:param filter_text: The filter text to limit the
                    fonts listed. Only fonts which
                    contain the the filter text as
                    a substring (ignoring case and spaces)
                    are listed.
z&_fill_listbox_font() filter_text = %s
Nz!self._font_popover_scroll is Nonez"self._font_popover_listbox is NoneTzrow-selectedr  rH   r]   zself._font_popover is Noners   ) r   r   r   r~   r   r   r  r   r   r   r   r.  r/  r0  r   r   on_font_selectedrx   r  rB   r"  rG  rJ  r   r   rN  r'  r(  rO  rT  r}   r   )r   r  r]   Zfontsrm   rV  r  r4   _fill_listbox_fontZ EmojiPickerUI._fill_listbox_font  s2    ;;;LL9;H$$,LL<=t001%([[]"%%-LL=>$++T-G-GH""..t4""..t4""55c6G6G6N6NO""??E""**D11	3 --/./""3+113||C$**,- D/ 	 .
 DIIKENN4 QF""6*  (  (##%//7##F+&&--eR8  %LL56##$'.s   AKKc                r|  r  r  rb   rd   r4   r5   re   	  s!     - - #-48-r6   c                s    VP                  4       p\        P                  '       d   \        P                  RV4       V P	                  V4       R# )z[
Signal handler for changed text in the font search entry

:param widget: The search entry
z7on_font_search_entry_search_changed() filter_text = %s
N)r  r   r   r   r  )r   r  r  r  r4   #on_font_search_entry_search_changedZ1EmojiPickerUI.on_font_search_entry_search_changed	  s=     #++-;;;LLJ 	,r6   c                r  )r,   _listboxlistbox_rowr.   N)r   r  Z
ListBoxRowrb   rd   r4   r5   re   	  s1     1 1kk1 1 -11r6   c                s   VP                  4       P                  4       P                  R4      ^ ,          p\        P                  '       d    \
        P	                  R\        V4      4       VR8X  d   RpW0P                  8w  d+   VR9   d$   RV n        V P                  P                  R4       M"RV n        V P                  P                  R4       V P                  P                  4        W0n        V P                  P                  V P                  4       V P                  4        \         P"                  ! V P$                  4       R# )	z
Signal handler for selecting a font

:param _listbox: The list box used to select a font
:param listbox_row: A row containing a font name
r  zon_font_selected() font = %s
rH   rh   TFN)rh   r-   r   )r  r  r  r   r   r   rp  ry   r{   r   r   r|   r  r   r   r   r   r  r  )r   r  r  r]   r  r4   r  ZEmojiPickerUI.on_font_selected	  s     $$&//177=a@;;;LL94:F2:D::$*J"J!DN''2248"DN''2259++-
##DJJ/d//0r6   c                r|  r  r  rb   rd   r4   r5   re   7	  s     -" -"SZZ -"D -"r6   c                s    \         P                  '       d   \        P                  R4       \        V\        P
                  P                  R7      V n        V P                  p\        V 4      w  r4\        VR,          4      p\        VR,          4      pVP                  WV4       VP                  R4       VP                  R4       \        P                  ! 4       pVP                  \        P                  P                   4       ^pVP#                  V4       VP%                  V4       VP'                  V4       VP)                  V4       VP+                  V4       \        P,                  ! 4       p	V	P/                  \1        R4      4       V	P3                  R4       V	P5                  \        P6                  P8                  4       \;        Wy4       \        P<                  ! 4       p
V
P                  R4       V
P3                  R4       V
P5                  \        P6                  P8                  4       V
P?                  R4       V
P                  R4       V
PA                  RV PB                  4       \;        Wz4       \        PD                  ! 4       V n#        V PI                  R	4       \;        WpPF                  4       \;        W'4       V PJ                  PM                  V\N        PP                  R
7       V
PS                  4        R# )zU
The font button in the header bar has been clicked

:param _button: The font button
zon_font_button_clicked()
r  g?g?TzSet FontFZsearch_changedrH   r  N)*r   r   r   r"   r   r  r  r}   r   rR   r   r   r   r   r   r   r   r   r   rN  rO  r   r"  rG  r;   r   rL  r   rM  r   r   r   r   r  r   r~   r  r|   r  r    ZFONT_SELECTIONr  )r   r  r  r  r  Zdesired_widthZdesired_heightr  rV  rm   r  s   &&         r4   r   Z$EmojiPickerUI.on_font_button_clicked7	  s,    ;;;LL,.+)9)9)@)@B$$(7(=%L3./]S01  ?d#D!wwyS__556f%F#F#v& 		q}%$($(""4(  &		/  '  'dFF	H$%$'$6$6$8!#$112' !!'	0H0H!I!r6   )2r   r   r   r   r   r   r   r   r   r   r{   r   r   r   ry   r   r}   r   r~   rz   r   r   r   r   r   r   r   r   r   r   rw   r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ))en_USFFTrO   z100.0NNNrN   T)Zen)T)Arg  
__module____qualname____firstlineno____doc__ru   r   r   r   r   r  r   Zclassmethodr  r   r!  r%  r3  rY  r   r   r;  r   ry  rx  r  r  r{  r  r  Zstaticmethodr  r   r   r   r  r  r   r   r   r   r   r   r  r  r  r2  r   r   r  r  rR  rP  rQ  r  r  r   r   rx   r  r  r  r   __static_attributes____classdictcell__rc      @r4   rV   rV     s|    u< u<n- -2 2. .
 $. . 0  " e eN- -"\ \.w wr'6 '6R% %D D&& &&P5 5" "# #) )"% %6 6B0 0< 5 5> 8 8.CI CIJ	D 	Dk kZ .& &P ,'4 '4R1 1<> >   4* *X# #:E E<	4 	4   29P 9Pv
0 
0) )&) )&lE lE\^F ^F@1 11 1 ; ;z/% /%b- -1 16-" -"r6   rV   c                s:    V ^8  d   QhR\         \        ,          /# rE   rr  r1   r3   r4   r5   r5   f	  s      tCy r6   c                 s   \         P                  '       d)   \        \         P                  P                  R4      4      # \        P
                  ! R4      p V '       g   \        P
                  ! R4      p V '       g   \        P
                  ! R4      p V '       g   \        P
                  ! R4      p V '       g   R.# . pV P                  R4       F*  pVP                  \        P                  ! RRV4      4       K,  	  V# )	z
Return the list of languages.

Get it from the command line option if that is used.
If not, get it from the environment variables.
Z:ZLANGUAGELC_ALLZLC_MESSAGESZLANGr  z[.@].*rH   )	r   rW   Zlistr  r   getenvr   r  Zsub)Zenvironment_variablerW   r   s      r4   get_languagesr  f	  s     EOO))#.//99Z0!yy2!yy7!yy0yI(..s3	2x89 4r6   c                   sv   a  ] tR tRt o RtV 3R lR lt]V 3R lR l4       tV 3R lR ltV 3R	 lR
 lt	Rt
V tR# )SignalHandleri}	  u  Thread-safe signal handler for interrupt requests (e.g., Ctrl+C).

This class provides a safe way to check and set an interrupt flag
from multiple threads.  It is designed to work with GLib’s signal
handling (e.g., `GLib.unix_signal_add()`) while preventing race
conditions during access.

Attributes:
    interrupt_requested (bool):
        Read-only property indicating whether an interrupt
        (e.g., SIGINT/Ctrl+C) was triggered. Thread-safe.
c                r   r   r<   rb   rd   r4   r5   SignalHandler.__annotate__	  s     & &$ &r6   c                sH    RV n         \        P                  ! 4       V n        R# )u   Init the signal handler class.

The threading.Lock() is unused at the moment as I don’t use
threads now. But I might use threads in future.
FN)_interrupt_requested	threadingZLock_lockr   r:   r4   ru   ZSignalHandler.__init__	  s     +0!^^%
r6   c                s    < V ^8  d   QhRS[ /# rE   )r?   rb   rd   r4   r5   r	  	  s     - -T -r6   c                s    V P                   ;_uu_ 4        V P                  uuRRR4       #   + '       g   i     R# ; i)zGCheck if an interrupt was requested with thread-safe
read-only access.
N)r  r
  r   r:   r4   rA  Z!SignalHandler.interrupt_requested	  s"    
 ZZZ,, ZZZs   ,=	c                r  r  r  rb   rd   r4   r5   r	  	  s     	 	C 	D 	r6   c                    \         P                  R4       V P                  ;_uu_ 4        RV n        RRR4       R#   + '       g   i     R# ; i)zqCallback for Ctrl+C (SIGINT).

:return: bool: True to keep the handler alive,
               False to remove it.
SIGINTTNr   rB  r  r
  r  r  r4   handle_sigintZSignalHandler.handle_sigint	  s4     	HZZZ(,D%  Z	   <A	c                r  r  r  rb   rd   r4   r5   r	  	  s     	 	S 	T 	r6   c                r  )zrCallback for Ctrl+C (SIGTERM).

:return: bool: True to keep the handler alive,
               False to remove it.
SIGTERMTNr  r  r  r4   handle_sigtermZSignalHandler.handle_sigterm	  s4     	IZZZ(,D%  Zr  )r
  r  N)rg  r  r  r  r   ru   ZpropertyrA  r  r  r  r  r  r  r4   r  r  }	  s<     & & - -	 		 	r6   r  c                sJ    V ^8  d   QhR\         R\        \        ,          RR/# )r,   signum_framer.   N)rR   r   r	   r1   r3   r4   r5   r5   	  s)     > >>%i0><@>r6   c                s   V e8    \         P                  ! V 4      P                  p\
        P                  RW4       \        e   \        P                  4        R# \        R4      h  \         d    \	        T 4      p LWi ; i)u   Signal handler for signals from Python’s signal module

:param signum: The signal number
:param _frame:  Almost never used (it’s for debugging).
Nz#Received signal %s (%s), exiting...r  )
signalZSignalsr  Z
ValueErrorr0   r   rB  r  r  r  )r  r  Zsignal_namer  r4   quit_glib_main_loopr  	  sl     	& ..055K 	96O!<==  	&f+K	&s    A% %A>=A>Z__main__r  zP%(asctime)s %(filename)s line %(lineno)d %(funcName)s %(levelname)s: %(message)sz********** STARTING **********rH   z.IBUS-WARNING **: Using the fallback 'C' localeZCZIBUS_LOCALEDIR)rW   r]   r^   r_   rX   rY   rZ   r[   r\   r`   ra   r6  c                s    V ^8  d   Qh/ ^ \         9   d   \        \        P                  ,          ;R&   ^\         9   d
   \        ;R&   # )r,   r  r@  )__conditional_annotations__r   r   MainLoopr  r1   r3   r4   r5   r5      s?      h / .' .izL 0 / /{Lr6   )N)r  r   Ztypingr   r   r   r   r   r   r   r   Ztypesr	   rC  r   r  r  r_  r  rC   ZlocalerS   r7   r  r  ZloggingZlogging.handlersZgir
   Zgi.repositoryr   r   Zset_application_nameZset_prgnameZitb_gtkr   r   r   r   r   r   r  Zitb_versionZg_compat_helpersr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   Z	getLoggerr   r  r8   r;   r=   rD   rT   r   rt   rV   r  r  r@  r  rg  r   ZNullHandlerZLOG_HANDLER_NULLZStreamHandlerZstdoutZLOG_HANDLER_STREAMZ	FormatterZLOG_FORMATTERZsetFormatterZsetLevelZDEBUGZ
addHandlerrB  ZcProfiler  r  ZProfiler  ZenableZset_program_nameZ	setlocaler  ZErrorrl  r  Z	LOCALEDIRZbindtextdomainrU   ZprintZget_versionrD  r]   r^   r_   rX   ZallrZ   r[   r\   r`   ra   ZEMOJI_PICKER_UIr  r  r  ZrunZKeyboardInterruptr  r5   )r  r  r4   <module>r     sa  (           
 	 	  
                
   . )      ( ' ' !          4 
		0	1*. ."
.
@Wr 	F!"CJJ F!"PB.2 2h !. />$ z;;;"..0$22#**E)) 	''6&,-45""$n--+
 		*+I:y1}}}k%%'(#/ZZkk1111%%##%O ]]_N
MM&.."56
MM&--!45q . << -EF,-D  45s$   ;O  P ?PP)QQ