~ubuntu-branches/ubuntu/trusty/bash/trusty-security

« back to all changes in this revision

Viewing changes to lib/readline/rlprivate.h

  • Committer: Package Import Robot
  • Author(s): Matthias Klose
  • Date: 2014-03-03 22:52:05 UTC
  • mfrom: (1.3.5) (2.2.6 experimental)
  • Revision ID: package-import@ubuntu.com-20140303225205-87ltrt5kspeq0g1b
Tags: 4.3-1ubuntu1
* Merge with Debian; remaining changes:
  - skel.bashrc:
    - Run lesspipe.
    - Enable ls aliases.
    - Set options in ll alias to -alF.
    - Define an alert alias.
    - Enabled colored grep aliases.
  - etc.bash.bashrc:
    - Add sudo hint.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* rlprivate.h -- functions and variables global to the readline library,
 
2
                  but not intended for use by applications. */
 
3
 
 
4
/* Copyright (C) 1999-2012 Free Software Foundation, Inc.
 
5
 
 
6
   This file is part of the GNU Readline Library (Readline), a library
 
7
   for reading lines of text with interactive input and history editing.      
 
8
 
 
9
   Readline is free software: you can redistribute it and/or modify
 
10
   it under the terms of the GNU General Public License as published by
 
11
   the Free Software Foundation, either version 3 of the License, or
 
12
   (at your option) any later version.
 
13
 
 
14
   Readline is distributed in the hope that it will be useful,
 
15
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
16
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
17
   GNU General Public License for more details.
 
18
 
 
19
   You should have received a copy of the GNU General Public License
 
20
   along with Readline.  If not, see <http://www.gnu.org/licenses/>.
 
21
*/
 
22
 
 
23
#if !defined (_RL_PRIVATE_H_)
 
24
#define _RL_PRIVATE_H_
 
25
 
 
26
#include "rlconf.h"     /* for VISIBLE_STATS */
 
27
#include "rlstdc.h"
 
28
#include "posixjmp.h"   /* defines procenv_t */
 
29
 
 
30
/*************************************************************************
 
31
 *                                                                       *
 
32
 * Convenience definitions                                               *
 
33
 *                                                                       *
 
34
 *************************************************************************/
 
35
 
 
36
#define EMACS_MODE()            (rl_editing_mode == emacs_mode)
 
37
#define VI_COMMAND_MODE()       (rl_editing_mode == vi_mode && _rl_keymap == vi_movement_keymap)
 
38
#define VI_INSERT_MODE()        (rl_editing_mode == vi_mode && _rl_keymap == vi_insertion_keymap)
 
39
 
 
40
#define RL_CHECK_SIGNALS() \
 
41
        do { \
 
42
          if (_rl_caught_signal) _rl_signal_handler (_rl_caught_signal); \
 
43
        } while (0)
 
44
 
 
45
#define RL_SIG_RECEIVED() (_rl_caught_signal != 0)
 
46
#define RL_SIGINT_RECEIVED() (_rl_caught_signal == SIGINT)
 
47
 
 
48
#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
 
49
#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
 
50
 
 
51
/*************************************************************************
 
52
 *                                                                       *
 
53
 * Global structs undocumented in texinfo manual and not in readline.h   *
 
54
 *                                                                       *
 
55
 *************************************************************************/
 
56
/* search types */
 
57
#define RL_SEARCH_ISEARCH       0x01            /* incremental search */
 
58
#define RL_SEARCH_NSEARCH       0x02            /* non-incremental search */
 
59
#define RL_SEARCH_CSEARCH       0x04            /* intra-line char search */
 
60
 
 
61
/* search flags */
 
62
#define SF_REVERSE              0x01
 
63
#define SF_FOUND                0x02
 
64
#define SF_FAILED               0x04
 
65
#define SF_CHGKMAP              0x08
 
66
 
 
67
typedef struct  __rl_search_context
 
68
{
 
69
  int type;
 
70
  int sflags;
 
71
 
 
72
  char *search_string;
 
73
  int search_string_index;
 
74
  int search_string_size;
 
75
 
 
76
  char **lines;
 
77
  char *allocated_line;    
 
78
  int hlen;
 
79
  int hindex;
 
80
 
 
81
  int save_point;
 
82
  int save_mark;
 
83
  int save_line;
 
84
  int last_found_line;
 
85
  char *prev_line_found;
 
86
 
 
87
  UNDO_LIST *save_undo_list;
 
88
 
 
89
  Keymap keymap;        /* used when dispatching commands in search string */
 
90
  Keymap okeymap;       /* original keymap */
 
91
 
 
92
  int history_pos;
 
93
  int direction;
 
94
 
 
95
  int prevc;
 
96
  int lastc;
 
97
#if defined (HANDLE_MULTIBYTE)
 
98
  char mb[MB_LEN_MAX];
 
99
  char pmb[MB_LEN_MAX];
 
100
#endif
 
101
 
 
102
  char *sline;
 
103
  int sline_len;
 
104
  int sline_index;
 
105
 
 
106
  char  *search_terminators;
 
107
} _rl_search_cxt;
 
108
 
 
109
/* Callback data for reading numeric arguments */
 
110
#define NUM_SAWMINUS    0x01
 
111
#define NUM_SAWDIGITS   0x02
 
112
#define NUM_READONE     0x04
 
113
 
 
114
typedef int _rl_arg_cxt;
 
115
 
 
116
/* A context for reading key sequences longer than a single character when
 
117
   using the callback interface. */
 
118
#define KSEQ_DISPATCHED 0x01
 
119
#define KSEQ_SUBSEQ     0x02
 
120
#define KSEQ_RECURSIVE  0x04
 
121
 
 
122
typedef struct __rl_keyseq_context
 
123
{
 
124
  int flags;
 
125
  int subseq_arg;
 
126
  int subseq_retval;            /* XXX */
 
127
  Keymap dmap;
 
128
 
 
129
  Keymap oldmap;
 
130
  int okey;
 
131
  struct __rl_keyseq_context *ocxt;
 
132
  int childval;
 
133
} _rl_keyseq_cxt;
 
134
 
 
135
/* vi-mode commands that use result of motion command to define boundaries */
 
136
#define VIM_DELETE      0x01
 
137
#define VIM_CHANGE      0x02
 
138
#define VIM_YANK        0x04
 
139
 
 
140
/* various states for vi-mode commands that use motion commands.  reflects
 
141
   RL_READLINE_STATE */
 
142
#define VMSTATE_READ    0x01
 
143
#define VMSTATE_NUMARG  0x02
 
144
 
 
145
typedef struct __rl_vimotion_context
 
146
{
 
147
  int op;
 
148
  int state;
 
149
  int flags;            /* reserved */
 
150
  _rl_arg_cxt ncxt;
 
151
  int numeric_arg;
 
152
  int start, end;       /* rl_point, rl_end */
 
153
  int key, motion;      /* initial key, motion command */
 
154
} _rl_vimotion_cxt;
 
155
 
 
156
/* fill in more as needed */
 
157
/* `Generic' callback data and functions */
 
158
typedef struct __rl_callback_generic_arg 
 
159
{
 
160
  int count;
 
161
  int i1, i2;
 
162
  /* add here as needed */
 
163
} _rl_callback_generic_arg;
 
164
 
 
165
typedef int _rl_callback_func_t PARAMS((_rl_callback_generic_arg *));
 
166
 
 
167
typedef void _rl_sigcleanup_func_t PARAMS((int, void *));
 
168
 
 
169
/*************************************************************************
 
170
 *                                                                       *
 
171
 * Global functions undocumented in texinfo manual and not in readline.h *
 
172
 *                                                                       *
 
173
 *************************************************************************/
 
174
 
 
175
/*************************************************************************
 
176
 *                                                                       *
 
177
 * Global variables undocumented in texinfo manual and not in readline.h *
 
178
 *                                                                       *
 
179
 *************************************************************************/
 
180
 
 
181
/* complete.c */
 
182
extern int rl_complete_with_tilde_expansion;
 
183
#if defined (VISIBLE_STATS)
 
184
extern int rl_visible_stats;
 
185
#endif /* VISIBLE_STATS */
 
186
#if defined (COLOR_SUPPORT)
 
187
extern int _rl_colored_stats;
 
188
#endif
 
189
 
 
190
/* readline.c */
 
191
extern int rl_line_buffer_len;
 
192
extern int rl_arg_sign;
 
193
extern int rl_visible_prompt_length;
 
194
extern int rl_byte_oriented;
 
195
 
 
196
/* display.c */
 
197
extern int rl_display_fixed;
 
198
 
 
199
/* parens.c */
 
200
extern int rl_blink_matching_paren;
 
201
 
 
202
/*************************************************************************
 
203
 *                                                                       *
 
204
 * Global functions and variables unused and undocumented                *
 
205
 *                                                                       *
 
206
 *************************************************************************/
 
207
 
 
208
/* kill.c */
 
209
extern int rl_set_retained_kills PARAMS((int));
 
210
 
 
211
/* terminal.c */
 
212
extern void _rl_set_screen_size PARAMS((int, int));
 
213
 
 
214
/* undo.c */
 
215
extern int _rl_fix_last_undo_of_type PARAMS((int, int, int));
 
216
 
 
217
/* util.c */
 
218
extern char *_rl_savestring PARAMS((const char *));
 
219
 
 
220
/*************************************************************************
 
221
 *                                                                       *
 
222
 * Functions and variables private to the readline library               *
 
223
 *                                                                       *
 
224
 *************************************************************************/
 
225
 
 
226
/* NOTE: Functions and variables prefixed with `_rl_' are
 
227
   pseudo-global: they are global so they can be shared
 
228
   between files in the readline library, but are not intended
 
229
   to be visible to readline callers. */
 
230
 
 
231
/*************************************************************************
 
232
 * Undocumented private functions                                        *
 
233
 *************************************************************************/
 
234
 
 
235
#if defined(READLINE_CALLBACKS)
 
236
 
 
237
/* readline.c */
 
238
extern void readline_internal_setup PARAMS((void));
 
239
extern char *readline_internal_teardown PARAMS((int));
 
240
extern int readline_internal_char PARAMS((void));
 
241
 
 
242
extern _rl_keyseq_cxt *_rl_keyseq_cxt_alloc PARAMS((void));
 
243
extern void _rl_keyseq_cxt_dispose PARAMS((_rl_keyseq_cxt *));
 
244
extern void _rl_keyseq_chain_dispose PARAMS((void));
 
245
 
 
246
extern int _rl_dispatch_callback PARAMS((_rl_keyseq_cxt *));
 
247
     
 
248
/* callback.c */
 
249
extern _rl_callback_generic_arg *_rl_callback_data_alloc PARAMS((int));
 
250
extern void _rl_callback_data_dispose PARAMS((_rl_callback_generic_arg *));
 
251
 
 
252
#endif /* READLINE_CALLBACKS */
 
253
 
 
254
/* bind.c */
 
255
extern char *_rl_untranslate_macro_value PARAMS((char *, int));
 
256
 
 
257
/* complete.c */
 
258
extern void _rl_reset_completion_state PARAMS((void));
 
259
extern char _rl_find_completion_word PARAMS((int *, int *));
 
260
extern void _rl_free_match_list PARAMS((char **));
 
261
 
 
262
/* display.c */
 
263
extern char *_rl_strip_prompt PARAMS((char *));
 
264
extern void _rl_reset_prompt PARAMS((void));
 
265
extern void _rl_move_cursor_relative PARAMS((int, const char *));
 
266
extern void _rl_move_vert PARAMS((int));
 
267
extern void _rl_save_prompt PARAMS((void));
 
268
extern void _rl_restore_prompt PARAMS((void));
 
269
extern char *_rl_make_prompt_for_search PARAMS((int));
 
270
extern void _rl_erase_at_end_of_line PARAMS((int));
 
271
extern void _rl_clear_to_eol PARAMS((int));
 
272
extern void _rl_clear_screen PARAMS((void));
 
273
extern void _rl_update_final PARAMS((void));
 
274
extern void _rl_redisplay_after_sigwinch PARAMS((void));
 
275
extern void _rl_clean_up_for_exit PARAMS((void));
 
276
extern void _rl_erase_entire_line PARAMS((void));
 
277
extern int _rl_current_display_line PARAMS((void));
 
278
 
 
279
/* input.c */
 
280
extern int _rl_any_typein PARAMS((void));
 
281
extern int _rl_input_available PARAMS((void));
 
282
extern int _rl_input_queued PARAMS((int));
 
283
extern void _rl_insert_typein PARAMS((int));
 
284
extern int _rl_unget_char PARAMS((int));
 
285
extern int _rl_pushed_input_available PARAMS((void));
 
286
 
 
287
/* isearch.c */
 
288
extern _rl_search_cxt *_rl_scxt_alloc PARAMS((int, int));
 
289
extern void _rl_scxt_dispose PARAMS((_rl_search_cxt *, int));
 
290
 
 
291
extern int _rl_isearch_dispatch PARAMS((_rl_search_cxt *, int));
 
292
extern int _rl_isearch_callback PARAMS((_rl_search_cxt *));
 
293
 
 
294
extern int _rl_search_getchar PARAMS((_rl_search_cxt *));
 
295
 
 
296
/* macro.c */
 
297
extern void _rl_with_macro_input PARAMS((char *));
 
298
extern int _rl_next_macro_key PARAMS((void));
 
299
extern int _rl_prev_macro_key PARAMS((void));
 
300
extern void _rl_push_executing_macro PARAMS((void));
 
301
extern void _rl_pop_executing_macro PARAMS((void));
 
302
extern void _rl_add_macro_char PARAMS((int));
 
303
extern void _rl_kill_kbd_macro PARAMS((void));
 
304
 
 
305
/* misc.c */
 
306
extern int _rl_arg_overflow PARAMS((void));
 
307
extern void _rl_arg_init PARAMS((void));
 
308
extern int _rl_arg_getchar PARAMS((void));
 
309
extern int _rl_arg_callback PARAMS((_rl_arg_cxt));
 
310
extern void _rl_reset_argument PARAMS((void));
 
311
 
 
312
extern void _rl_start_using_history PARAMS((void));
 
313
extern int _rl_free_saved_history_line PARAMS((void));
 
314
extern void _rl_set_insert_mode PARAMS((int, int));
 
315
 
 
316
extern void _rl_revert_all_lines PARAMS((void));
 
317
 
 
318
/* nls.c */
 
319
extern int _rl_init_eightbit PARAMS((void));
 
320
 
 
321
/* parens.c */
 
322
extern void _rl_enable_paren_matching PARAMS((int));
 
323
 
 
324
/* readline.c */
 
325
extern void _rl_init_line_state PARAMS((void));
 
326
extern void _rl_set_the_line PARAMS((void));
 
327
extern int _rl_dispatch PARAMS((int, Keymap));
 
328
extern int _rl_dispatch_subseq PARAMS((int, Keymap, int));
 
329
extern void _rl_internal_char_cleanup PARAMS((void));
 
330
 
 
331
/* rltty.c */
 
332
extern int _rl_disable_tty_signals PARAMS((void));
 
333
extern int _rl_restore_tty_signals PARAMS((void));
 
334
 
 
335
/* search.c */
 
336
extern int _rl_nsearch_callback PARAMS((_rl_search_cxt *));
 
337
 
 
338
/* signals.c */
 
339
extern void _rl_signal_handler PARAMS((int));
 
340
 
 
341
extern void _rl_block_sigint PARAMS((void));
 
342
extern void _rl_release_sigint PARAMS((void));
 
343
extern void _rl_block_sigwinch PARAMS((void));
 
344
extern void _rl_release_sigwinch PARAMS((void));
 
345
 
 
346
/* terminal.c */
 
347
extern void _rl_get_screen_size PARAMS((int, int));
 
348
extern void _rl_sigwinch_resize_terminal PARAMS((void));
 
349
extern int _rl_init_terminal_io PARAMS((const char *));
 
350
#ifdef _MINIX
 
351
extern void _rl_output_character_function PARAMS((int));
 
352
#else
 
353
extern int _rl_output_character_function PARAMS((int));
 
354
#endif
 
355
extern void _rl_output_some_chars PARAMS((const char *, int));
 
356
extern int _rl_backspace PARAMS((int));
 
357
extern void _rl_enable_meta_key PARAMS((void));
 
358
extern void _rl_disable_meta_key PARAMS((void));
 
359
extern void _rl_control_keypad PARAMS((int));
 
360
extern void _rl_set_cursor PARAMS((int, int));
 
361
 
 
362
/* text.c */
 
363
extern void _rl_fix_point PARAMS((int));
 
364
extern int _rl_replace_text PARAMS((const char *, int, int));
 
365
extern int _rl_forward_char_internal PARAMS((int));
 
366
extern int _rl_insert_char PARAMS((int, int));
 
367
extern int _rl_overwrite_char PARAMS((int, int));
 
368
extern int _rl_overwrite_rubout PARAMS((int, int));
 
369
extern int _rl_rubout_char PARAMS((int, int));
 
370
#if defined (HANDLE_MULTIBYTE)
 
371
extern int _rl_char_search_internal PARAMS((int, int, char *, int));
 
372
#else
 
373
extern int _rl_char_search_internal PARAMS((int, int, int));
 
374
#endif
 
375
extern int _rl_set_mark_at_pos PARAMS((int));
 
376
 
 
377
/* undo.c */
 
378
extern UNDO_LIST *_rl_copy_undo_entry PARAMS((UNDO_LIST *));
 
379
extern UNDO_LIST *_rl_copy_undo_list PARAMS((UNDO_LIST *));
 
380
extern void _rl_free_undo_list PARAMS((UNDO_LIST *));
 
381
 
 
382
/* util.c */
 
383
#if defined (USE_VARARGS) && defined (PREFER_STDARG)
 
384
extern void _rl_ttymsg (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
 
385
extern void _rl_errmsg (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
 
386
extern void _rl_trace (const char *, ...)  __attribute__((__format__ (printf, 1, 2)));
 
387
#else
 
388
extern void _rl_ttymsg ();
 
389
extern void _rl_errmsg ();
 
390
extern void _rl_trace ();
 
391
#endif
 
392
extern void _rl_audit_tty PARAMS((char *));
 
393
 
 
394
extern int _rl_tropen PARAMS((void));
 
395
 
 
396
extern int _rl_abort_internal PARAMS((void));
 
397
extern int _rl_null_function PARAMS((int, int));
 
398
extern char *_rl_strindex PARAMS((const char *, const char *));
 
399
extern int _rl_qsort_string_compare PARAMS((char **, char **));
 
400
extern int (_rl_uppercase_p) PARAMS((int));
 
401
extern int (_rl_lowercase_p) PARAMS((int));
 
402
extern int (_rl_pure_alphabetic) PARAMS((int));
 
403
extern int (_rl_digit_p) PARAMS((int));
 
404
extern int (_rl_to_lower) PARAMS((int));
 
405
extern int (_rl_to_upper) PARAMS((int));
 
406
extern int (_rl_digit_value) PARAMS((int));
 
407
 
 
408
/* vi_mode.c */
 
409
extern void _rl_vi_initialize_line PARAMS((void));
 
410
extern void _rl_vi_reset_last PARAMS((void));
 
411
extern void _rl_vi_set_last PARAMS((int, int, int));
 
412
extern int _rl_vi_textmod_command PARAMS((int));
 
413
extern void _rl_vi_done_inserting PARAMS((void));
 
414
extern int _rl_vi_domove_callback PARAMS((_rl_vimotion_cxt *));
 
415
 
 
416
/*************************************************************************
 
417
 * Undocumented private variables                                        *
 
418
 *************************************************************************/
 
419
 
 
420
/* bind.c */
 
421
extern const char * const _rl_possible_control_prefixes[];
 
422
extern const char * const _rl_possible_meta_prefixes[];
 
423
 
 
424
/* callback.c */
 
425
extern _rl_callback_func_t *_rl_callback_func;
 
426
extern _rl_callback_generic_arg *_rl_callback_data;
 
427
 
 
428
/* complete.c */
 
429
extern int _rl_complete_show_all;
 
430
extern int _rl_complete_show_unmodified;
 
431
extern int _rl_complete_mark_directories;
 
432
extern int _rl_complete_mark_symlink_dirs;
 
433
extern int _rl_completion_prefix_display_length;
 
434
extern int _rl_completion_columns;
 
435
extern int _rl_print_completions_horizontally;
 
436
extern int _rl_completion_case_fold;
 
437
extern int _rl_completion_case_map;
 
438
extern int _rl_match_hidden_files;
 
439
extern int _rl_page_completions;
 
440
extern int _rl_skip_completed_text;
 
441
extern int _rl_menu_complete_prefix_first;
 
442
 
 
443
/* display.c */
 
444
extern int _rl_vis_botlin;
 
445
extern int _rl_last_c_pos;
 
446
extern int _rl_suppress_redisplay;
 
447
extern int _rl_want_redisplay;
 
448
 
 
449
/* isearch.c */
 
450
extern char *_rl_isearch_terminators;
 
451
 
 
452
extern _rl_search_cxt *_rl_iscxt;
 
453
 
 
454
/* macro.c */
 
455
extern char *_rl_executing_macro;
 
456
 
 
457
/* misc.c */
 
458
extern int _rl_history_preserve_point;
 
459
extern int _rl_history_saved_point;
 
460
 
 
461
extern _rl_arg_cxt _rl_argcxt;
 
462
 
 
463
/* nls.c */
 
464
extern int _rl_utf8locale;
 
465
 
 
466
/* readline.c */
 
467
extern int _rl_echoing_p;
 
468
extern int _rl_horizontal_scroll_mode;
 
469
extern int _rl_mark_modified_lines;
 
470
extern int _rl_bell_preference;
 
471
extern int _rl_meta_flag;
 
472
extern int _rl_convert_meta_chars_to_ascii;
 
473
extern int _rl_output_meta_chars;
 
474
extern int _rl_bind_stty_chars;
 
475
extern int _rl_revert_all_at_newline;
 
476
extern int _rl_echo_control_chars;
 
477
extern int _rl_show_mode_in_prompt;
 
478
extern char *_rl_comment_begin;
 
479
extern unsigned char _rl_parsing_conditionalized_out;
 
480
extern Keymap _rl_keymap;
 
481
extern FILE *_rl_in_stream;
 
482
extern FILE *_rl_out_stream;
 
483
extern int _rl_last_command_was_kill;
 
484
extern int _rl_eof_char;
 
485
extern procenv_t _rl_top_level;
 
486
extern _rl_keyseq_cxt *_rl_kscxt;
 
487
extern int _rl_keyseq_timeout;
 
488
 
 
489
extern int _rl_executing_keyseq_size;
 
490
 
 
491
/* search.c */
 
492
extern _rl_search_cxt *_rl_nscxt;
 
493
 
 
494
/* signals.c */
 
495
extern int _rl_interrupt_immediately;
 
496
extern int volatile _rl_caught_signal;
 
497
 
 
498
extern _rl_sigcleanup_func_t *_rl_sigcleanup;
 
499
extern void *_rl_sigcleanarg;
 
500
 
 
501
extern int _rl_echoctl;
 
502
 
 
503
extern int _rl_intr_char;
 
504
extern int _rl_quit_char;
 
505
extern int _rl_susp_char;
 
506
 
 
507
/* terminal.c */
 
508
extern int _rl_enable_keypad;
 
509
extern int _rl_enable_meta;
 
510
extern char *_rl_term_clreol;
 
511
extern char *_rl_term_clrpag;
 
512
extern char *_rl_term_im;
 
513
extern char *_rl_term_ic;
 
514
extern char *_rl_term_ei;
 
515
extern char *_rl_term_DC;
 
516
extern char *_rl_term_up;
 
517
extern char *_rl_term_dc;
 
518
extern char *_rl_term_cr;
 
519
extern char *_rl_term_IC;
 
520
extern char *_rl_term_forward_char;
 
521
extern int _rl_screenheight;
 
522
extern int _rl_screenwidth;
 
523
extern int _rl_screenchars;
 
524
extern int _rl_terminal_can_insert;
 
525
extern int _rl_term_autowrap;
 
526
 
 
527
/* undo.c */
 
528
extern int _rl_doing_an_undo;
 
529
extern int _rl_undo_group_level;
 
530
 
 
531
/* vi_mode.c */
 
532
extern int _rl_vi_last_command;
 
533
extern _rl_vimotion_cxt *_rl_vimvcxt;
 
534
 
 
535
#endif /* _RL_PRIVATE_H_ */