Print this page
Garrett's man page edits.
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/man/man5/environ.5
+++ new/usr/src/man/man5/environ.5
1 1 '\" te
2 2 .\" Copyright 1989 AT&T
3 3 .\" Copyright (c) 2002, Sun Microsystems, Inc. All Rights Reserved
4 4 .\" Copyright (c) 2014, Joyent, Inc. All Rights Reserved
5 +.\" Copyright 2014 Garrett D'Amore <garrett@damore.org>
5 6 .\" The contents of this file are subject to the terms of the Common Development and Distribution License (the "License"). You may not use this file except in compliance with the License.
6 7 .\" You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE or http://www.opensolaris.org/os/licensing. See the License for the specific language governing permissions and limitations under the License.
7 8 .\" When distributing Covered Code, include this CDDL HEADER in each file and include the License file at usr/src/OPENSOLARIS.LICENSE. If applicable, add the following below this CDDL HEADER, with the fields enclosed by brackets "[]" replaced with your own identifying information: Portions Copyright [yyyy] [name of copyright owner]
8 -.TH ENVIRON 5 "Nov 19, 2002"
9 +.TH ENVIRON 5 "Jun 26, 2014"
9 10 .SH NAME
10 11 environ \- user environment
11 12 .SH DESCRIPTION
12 -.sp
13 13 .LP
14 14 When a process begins execution, one of the \fBexec\fR family of functions
15 15 makes available an array of strings called the environment; see \fBexec\fR(2).
16 16 By convention, these strings have the form \fIvariable=value\fR, for example,
17 17 \fBPATH=/sbin:/usr/sbin\fR. These environmental variables provide a way to make
18 18 information about a program's environment available to programs.
19 -.sp
20 19 .LP
21 20 A name may be placed in the environment by the \fBexport\fR command and
22 21 \fIname\fR=\fIvalue\fR arguments in \fBsh\fR(1), or by one of the \fBexec\fR
23 22 functions. It is unwise to conflict with certain shell variables such as
24 23 \fBMAIL\fR, \fBPS1\fR, \fBPS2\fR, and \fBIFS\fR that are frequently exported by
25 24 \fB\&.profile\fR files; see \fBprofile\fR(4).
26 -.sp
27 25 .LP
28 26 The following environmental variables can be used by applications and are
29 27 expected to be set in the target run-time environment.
30 28 .sp
31 29 .ne 2
32 30 .na
33 31 \fB\fBHOME\fR\fR
34 32 .ad
35 33 .sp .6
36 34 .RS 4n
37 35 The name of the user's login directory, set by \fBlogin\fR(1) from the password
38 36 file; see \fBpasswd\fR(4).
↓ open down ↓ |
2 lines elided |
↑ open up ↑ |
39 37 .RE
40 38
41 39 .sp
42 40 .ne 2
43 41 .na
44 42 \fB\fBLANG\fR\fR
45 43 .ad
46 44 .sp .6
47 45 .RS 4n
48 46 The string used to specify internationalization information that allows users
49 -to work with different national conventions. The \fBsetlocale\fR(3C) function
50 -checks the \fBLANG\fR environment variable when it is called with \fB""\fR as
47 +to work with different national conventions. The \fBsetlocale\fR(3C) and
48 +\fBnewlocale\fR(3C) functions
49 +check the \fBLANG\fR environment variable when they are called with \fB""\fR as
51 50 the \fBlocale\fR argument. \fBLANG\fR is used as the default locale if the
52 51 corresponding environment variable for a particular category is unset or null.
53 52 If, however, \fBLC_ALL\fR is set to a valid, non-empty value, its contents are
54 53 used to override both the \fBLANG\fR and the other \fBLC_*\fR variables. For
55 54 example, when invoked as \fBsetlocale(LC_CTYPE, "")\fR, \fBsetlocale()\fR will
56 55 query the \fBLC_CTYPE\fR environment variable first to see if it is set and
57 56 non-null. If \fBLC_CTYPE\fR is not set or null, then \fBsetlocale()\fR will
58 57 check the \fBLANG\fR environment variable to see if it is set and non-null. If
59 58 both \fBLANG\fR and \fBLC_CTYPE\fR are unset or \fINULL\fR, the default "C"
60 59 locale will be used to set the \fBLC_CTYPE\fR category.
61 60 .sp
62 61 Most commands will invoke \fBsetlocale(LC_ALL, "")\fR prior to any other
63 62 processing. This allows the command to be used with different national
64 63 conventions by setting the appropriate environment variables. In addition, some
65 64 commands will use
66 65 .BR uselocale (3C)
67 -to set a specific locale for opertations performed in a single thread.
66 +to set a thread-specific locale.
68 67 .sp
69 68 The following environment variables correspond to each category of
70 69 \fBsetlocale\fR(3C):
71 70 .sp
72 71 .ne 2
73 72 .na
74 73 \fB\fBLC_ALL\fR\fR
75 74 .ad
76 75 .sp .6
77 76 .RS 4n
78 77 If set to a valid, non-empty string value, override the values of \fBLANG\fR
79 78 and all the other \fBLC_*\fRvariables.
80 79 .RE
↓ open down ↓ |
3 lines elided |
↑ open up ↑ |
81 80
82 81 .sp
83 82 .ne 2
84 83 .na
85 84 \fB\fBLC_COLLATE\fR\fR
86 85 .ad
87 86 .sp .6
88 87 .RS 4n
89 88 This category specifies the character collation sequence being used. The
90 89 information corresponding to this category is stored in a database created by
91 -the \fBlocaledef\fR(1) command. This environment variable affects
90 +the \fBlocaledef\fR(1) command. This environment variable affects
92 91 \fBstrcoll\fR(3C) and \fBstrxfrm\fR(3C).
93 92 .RE
94 93
95 94 .sp
96 95 .ne 2
97 96 .na
98 97 \fB\fBLC_CTYPE\fR\fR
99 98 .ad
100 99 .sp .6
101 100 .RS 4n
102 101 This category specifies character classification, character conversion, and
103 102 widths of multibyte characters. When \fBLC_CTYPE\fR is set to a valid value,
104 103 the calling utility can display and handle text and file names containing valid
105 104 characters for that locale; Extended Unix Code (EUC) characters where any
106 105 individual character can be 1, 2, or 3 bytes wide; and EUC characters of 1, 2,
107 106 or 3 column widths. The default "C" locale corresponds to the 7-bit \fBASCII\fR
108 107 character set; only characters from ISO 8859-1 are valid. The information
109 108 corresponding to this category is stored in a database created by the
110 109 \fBlocaledef()\fR command. This environment variable is used by
111 110 \fBctype\fR(3C), \fBmblen\fR(3C), and many commands, such as \fBcat\fR(1),
112 111 \fBed\fR(1), \fBls\fR(1), and \fBvi\fR(1).
113 112 .RE
114 113
115 114 .sp
116 115 .ne 2
117 116 .na
118 117 \fB\fBLC_MESSAGES\fR\fR
119 118 .ad
120 119 .sp .6
121 120 .RS 4n
122 121 This category specifies the language of the message database being used. For
123 122 example, an application may have one message database with French messages, and
124 123 another database with German messages. Message databases are created by the
125 124 \fBmkmsgs\fR(1) command. This environment variable is used by \fBexstr\fR(1),
126 125 \fBgettxt\fR(1), \fBsrchtxt\fR(1), \fBgettxt\fR(3C), and \fBgettext\fR(3C).
127 126 .RE
128 127
129 128 .sp
130 129 .ne 2
131 130 .na
132 131 \fB\fBLC_MONETARY\fR\fR
133 132 .ad
134 133 .sp .6
135 134 .RS 4n
136 135 This category specifies the monetary symbols and delimiters used for a
137 136 particular locale. The information corresponding to this category is stored in
138 137 a database created by the \fBlocaledef\fR(1) command. This environment variable
139 138 is used by \fBlocaleconv\fR(3C).
140 139 .RE
141 140
142 141 .sp
143 142 .ne 2
144 143 .na
145 144 \fB\fBLC_NUMERIC\fR\fR
146 145 .ad
147 146 .sp .6
148 147 .RS 4n
149 148 This category specifies the decimal and thousands delimiters. The information
150 149 corresponding to this category is stored in a database created by the
151 150 \fBlocaledef()\fR command. The default \fBC\fR locale corresponds to \fB"."\fR
152 151 as the decimal delimiter and no thousands delimiter. This environment variable
153 152 is used by \fBlocaleconv\fR(3C), \fBprintf\fR(3C), and \fBstrtod\fR(3C).
154 153 .RE
155 154
156 155 .sp
157 156 .ne 2
158 157 .na
159 158 \fB\fBLC_TIME\fR\fR
160 159 .ad
161 160 .sp .6
162 161 .RS 4n
163 162 This category specifies date and time formats. The information corresponding to
164 163 this category is stored in a database specified in \fBlocaledef()\fR. The
165 164 default \fBC\fR locale corresponds to U.S. date and time formats. This
166 165 environment variable is used by many commands and functions; for example:
167 166 \fBat\fR(1), \fBcalendar\fR(1), \fBdate\fR(1), \fBstrftime\fR(3C), and
168 167 \fBgetdate\fR(3C).
169 168 .RE
170 169
171 170 .RE
172 171
173 172 .sp
174 173 .ne 2
175 174 .na
176 175 \fB\fBMSGVERB\fR\fR
177 176 .ad
178 177 .sp .6
179 178 .RS 4n
180 179 Controls which standard format message components \fBfmtmsg\fR selects when
181 180 messages are displayed to \fBstderr\fR; see \fBfmtmsg\fR(1) and
182 181 \fBfmtmsg\fR(3C).
183 182 .RE
184 183
185 184 .sp
186 185 .ne 2
187 186 .na
188 187 \fB\fBNETPATH\fR\fR
189 188 .ad
190 189 .sp .6
191 190 .RS 4n
192 191 A colon-separated list of network identifiers. A network identifier is a
193 192 character string used by the Network Selection component of the system to
194 193 provide application-specific default network search paths. A network identifier
195 194 must consist of non-null characters and must have a length of at least 1. No
196 195 maximum length is specified. Network identifiers are normally chosen by the
197 196 system administrator. A network identifier is also the first field in any
198 197 \fB/etc/netconfig\fR file entry. \fBNETPATH\fR thus provides a link into the
199 198 \fB/etc/netconfig\fR file and the information about a network contained in that
200 199 network's entry. \fB/etc/netconfig\fR is maintained by the system
201 200 administrator. The library routines described in \fBgetnetpath\fR(3NSL) access
202 201 the \fBNETPATH\fR environment variable.
203 202 .RE
204 203
205 204 .sp
206 205 .ne 2
207 206 .na
208 207 \fB\fBNLSPATH\fR\fR
209 208 .ad
210 209 .sp .6
211 210 .RS 4n
212 211 Contains a sequence of templates which \fBcatopen\fR(3C) and \fBgettext\fR(3C)
213 212 use when attempting to locate message catalogs. Each template consists of an
214 213 optional prefix, one or more substitution fields, a filename and an optional
215 214 suffix. For example:
216 215 .sp
217 216 .in +2
218 217 .nf
219 218 NLSPATH="/system/nlslib/%N.cat"
220 219 .fi
221 220 .in -2
222 221 .sp
223 222
224 223 defines that \fBcatopen()\fR should look for all message catalogs in the
225 224 directory \fB/system/nlslib\fR, where the catalog name should be constructed
226 225 from the \fIname\fR parameter passed to \fBcatopen\fR(\|), \fB%N\fR, with the
227 226 suffix \fB\&.cat\fR.
228 227 .sp
229 228 Substitution fields consist of a \fB%\fR symbol, followed by a single-letter
230 229 keyword. The following keywords are currently defined:
231 230 .sp
232 231 .ne 2
233 232 .na
234 233 \fB%N\fR
235 234 .ad
236 235 .sp .6
237 236 .RS 4n
238 237 The value of the \fIname\fR parameter passed to \fBcatopen()\fR.
239 238 .RE
240 239
241 240 .sp
242 241 .ne 2
243 242 .na
244 243 \fB%L\fR
245 244 .ad
246 245 .sp .6
247 246 .RS 4n
248 247 The value of \fBLANG\fR or \fBLC_MESSAGES\fR.
249 248 .RE
250 249
251 250 .sp
252 251 .ne 2
253 252 .na
254 253 \fB%l\fR
255 254 .ad
256 255 .sp .6
257 256 .RS 4n
258 257 The language element from \fBLANG\fR or \fBLC_MESSAGES\fR.
259 258 .RE
260 259
261 260 .sp
262 261 .ne 2
263 262 .na
264 263 \fB%t\fR
265 264 .ad
266 265 .sp .6
267 266 .RS 4n
268 267 The territory element from \fBLANG\fR or \fBLC_MESSAGES\fR.
269 268 .RE
270 269
271 270 .sp
272 271 .ne 2
273 272 .na
274 273 \fB%c\fR
275 274 .ad
276 275 .sp .6
277 276 .RS 4n
278 277 The codeset element from \fBLANG\fR or \fBLC_MESSAGES\fR.
279 278 .RE
280 279
281 280 .sp
282 281 .ne 2
283 282 .na
284 283 \fB%%\fR
285 284 .ad
286 285 .sp .6
287 286 .RS 4n
288 287 A single \fB%\fR character.
289 288 .RE
290 289
291 290 An empty string is substituted if the specified value is not currently defined.
292 291 The separators "\fB_\fR" and "\fB\&.\fR" are not included in \fB%t\fR and
293 292 \fB%c\fR substitutions.
294 293 .sp
295 294 Templates defined in \fBNLSPATH\fR are separated by colons (\fB:\fR). A leading
296 295 colon or two adjacent colons (\fB::\fR) is equivalent to specifying \fB%N\fR.
297 296 For example:
298 297 .sp
299 298 .in +2
300 299 .nf
301 300 NLSPATH=":%N.cat:/nlslib/%L/%N.cat"
302 301 .fi
303 302 .in -2
304 303 .sp
305 304
306 305 indicates to \fBcatopen()\fR that it should look for the requested message
307 306 catalog in \fIname\fR, \fIname\fR\fB\&.cat\fR and
308 307 \fB/nlslib/$LANG/\fR\fIname\fR.cat. For \fBgettext()\fR, \fB%N\fR automatically
309 308 maps to "messages".
310 309 .sp
311 310 If \fBNLSPATH\fR is unset or \fINULL\fR, \fBcatopen()\fR and \fBgettext()\fR
312 311 call \fBsetlocale\fR(3C), which checks \fBLANG\fR and the \fBLC_*\fR
313 312 variables to locate the message catalogs.
314 313 .sp
315 314 \fBNLSPATH\fR will normally be set up on a system wide basis (in
316 315 \fB/etc/profile\fR) and thus makes the location and naming conventions
317 316 associated with message catalogs transparent to both programs and users.
318 317 .RE
319 318
320 319 .sp
321 320 .ne 2
322 321 .na
323 322 \fB\fBPATH\fR\fR
324 323 .ad
325 324 .sp .6
326 325 .RS 4n
327 326 The sequence of directory prefixes that \fBsh\fR(1), \fBtime\fR(1),
328 327 \fBnice\fR(1), \fBnohup\fR(1), and other utilities apply in searching for a
329 328 file known by an incomplete path name. The prefixes are separated by colons
330 329 (\fB:\fR). \fBlogin\fR(1) sets \fBPATH=/usr/bin\fR. For more detail, see
331 330 \fBsh\fR(1).
332 331 .RE
333 332
334 333 .sp
335 334 .ne 2
336 335 .na
337 336 \fB\fBSEV_LEVEL\fR\fR
338 337 .ad
339 338 .sp .6
340 339 .RS 4n
341 340 Define severity levels and associate and print strings with them in standard
342 341 format error messages; see \fBaddseverity\fR(3C), \fBfmtmsg\fR(1), and
343 342 \fBfmtmsg\fR(3C).
344 343 .RE
345 344
346 345 .sp
347 346 .ne 2
348 347 .na
349 348 \fB\fBTERM\fR\fR
350 349 .ad
351 350 .sp .6
352 351 .RS 4n
353 352 The kind of terminal for which output is to be prepared. This information is
354 353 used by commands, such as \fBvi\fR(1), which may exploit special capabilities
355 354 of that terminal.
356 355 .RE
357 356
358 357 .sp
359 358 .ne 2
360 359 .na
361 360 \fB\fBTZ\fR\fR
362 361 .ad
363 362 .sp .6
364 363 .RS 4n
365 364 Timezone information. The contents of this environment variable are used by the
366 365 functions \fBctime\fR(3C), \fBlocaltime\fR(3C), \fBstrftime\fR(3C), and
367 366 \fBmktime\fR(3C) to override the default timezone. The value of \fBTZ\fR has
368 367 one of the two formats (spaces inserted for clarity):
369 368 .sp
370 369 .in +2
371 370 .nf
372 371 :characters
373 372 .fi
374 373 .in -2
375 374
376 375 or
377 376 .sp
378 377 .in +2
379 378 .nf
380 379 std offset dst offset, rule
381 380 .fi
382 381 .in -2
383 382
384 383 If \fBTZ\fR is of the first format (that is, if the first character is a colon
385 384 (:)), or if \fBTZ\fR is not of the second format, then \fBTZ\fR designates a
386 385 path to a timezone database file relative to \fB/usr/share/lib/zoneinfo/\fR,
387 386 ignoring a leading colon if one exists.
388 387 .sp
389 388 Otherwise, \fBTZ\fR is of the second form, which when expanded is as follows:
390 389 .sp
391 390 .in +2
392 391 .nf
393 392 \fIstdoffset\fR[\fIdst\fR[\fIoffset\fR][,\fIstart\fR[/\fItime\fR],\fIend\fR[/\fItime\fR]]]
394 393 .fi
395 394 .in -2
396 395
397 396 .sp
398 397 .ne 2
399 398 .na
400 399 \fB\fIstd\fR and \fIdst\fR\fR
401 400 .ad
402 401 .sp .6
403 402 .RS 4n
404 403 Indicate no less than three, nor more than {\fBTZNAME_MAX\fR}, bytes that are
405 404 the designation for the standard (\fIstd\fR) or the alternative (\fIdst\fR,
406 405 such as Daylight Savings Time) timezone. Only \fIstd\fR is required; if
407 406 \fIdst\fR is missing, then the alternative time does not apply in this
408 407 timezone. Each of these fields can occur in either of two formats, quoted or
409 408 unquoted:
410 409 .RS +4
411 410 .TP
412 411 .ie t \(bu
413 412 .el o
414 413 In the quoted form, the first character is the less-than ('<') character and
415 414 the last character is the greater-than ('>') character. All characters between
416 415 these quoting characters are alphanumeric characters from the portable
417 416 character set in the current locale, the plus-sign ('+') character, or the
418 417 minus-sign ('-') character. The \fIstd\fR and \fIdst\fR fields in this case do
419 418 not include the quoting characters.
420 419 .RE
421 420 .RS +4
422 421 .TP
423 422 .ie t \(bu
424 423 .el o
425 424 In the unquoted form, all characters in these fields are alphabetic characters
426 425 from the portable character set in the current locale.
427 426 .RE
428 427 The interpretation of these fields is unspecified if either field is less than
429 428 three bytes (except for the case when \fIdst\fR is missing), more than
430 429 {\fBTZNAME_MAX\fR} bytes, or if they contain characters other than those
431 430 specified.
432 431 .RE
433 432
434 433 .sp
435 434 .ne 2
436 435 .na
437 436 \fB\fIoffset\fR\fR
438 437 .ad
439 438 .sp .6
440 439 .RS 4n
441 440 Indicate the value one must add to the local time to arrive at Coordinated
442 441 Universal Time. The offset has the form:
443 442 .sp
444 443 .in +2
445 444 .nf
446 445 \fIhh\fR[:\fImm\fR[:\fIss\fR]]
447 446 .fi
448 447 .in -2
449 448 .sp
450 449
451 450 The minutes (\fImm\fR) and seconds (\fIss\fR) are optional. The hour (\fIhh\fR)
452 451 is required and can be a single digit. The \fIoffset\fR following \fIstd\fR is
453 452 required. If no \fIoffset\fR follows \fIdst\fR, daylight savings time is
454 453 assumed to be one hour ahead of standard time. One or more digits can be used.
455 454 The value is always interpreted as a decimal number. The hour must be between 0
456 455 and 24, and the minutes (and seconds), if present, must be between 0 and 59.
457 456 Out of range values can cause unpredictable behavior. If preceded by a "-", the
458 457 timezone is east of the Prime Meridian. Otherwise, it is west of the Prime
459 458 Meridian (which can be indicated by an optional preceding "\fI+\fR" sign).
460 459 .RE
461 460
462 461 .sp
463 462 .ne 2
464 463 .na
465 464 \fB\fIstart\fR/\fItime\fR,\|\fIend\fR/\fItime\fR\fR
466 465 .ad
467 466 .sp .6
468 467 .RS 4n
469 468 Indicate when to change to and back from daylight savings time, where
470 469 \fIstart/time\fR describes when the change from standard time to daylight
471 470 savings time occurs, and \fIend/time\fR describes when the change back occurs.
472 471 Each \fItime\fR field describes when, in current local time, the change is
473 472 made.
474 473 .sp
475 474 The formats of \fIstart\fR and \fIend\fR are one of the following:
476 475 .sp
477 476 .ne 2
478 477 .na
479 478 \fB\fBJ\fR\fIn\fR\fR
480 479 .ad
481 480 .sp .6
482 481 .RS 4n
483 482 The Julian day \fIn\fR (1 \(<= \fIn\fR \(<= 365). Leap days are not counted.
484 483 That is, in all years, February 28 is day 59 and March 1 is day 60. It is
485 484 impossible to refer to the occasional February 29.
486 485 .RE
487 486
488 487 .sp
489 488 .ne 2
490 489 .na
491 490 \fB\fIn\fR\fR
492 491 .ad
493 492 .sp .6
494 493 .RS 4n
495 494 The zero-based Julian day (0 \(<= \fIn\fR \(<= 365). Leap days are counted, and
496 495 it is possible to refer to February 29.
497 496 .RE
498 497
499 498 .sp
500 499 .ne 2
501 500 .na
502 501 \fB\fBM\fR\fIm.n.d\fR\fR
503 502 .ad
504 503 .sp .6
505 504 .RS 4n
506 505 The \fId\fR^th day, (0 \(<= \fId\fR \(<= 6) of week \fIn\fR of month \fIm\fR of
507 506 the year (1 \(<= \fIn\fR \(<= 5, 1 \(<= \fIm\fR \(<= 12), where week 5 means
508 507 "the last \fId\fR-day in month \fIm\fR" which may occur in either the fourth or
509 508 the fifth week). Week 1 is the first week in which the \fId\fR^th day occurs.
510 509 Day zero is Sunday.
511 510 .RE
512 511
513 512 Implementation specific defaults are used for \fIstart\fR and \fIend\fR if
↓ open down ↓ |
412 lines elided |
↑ open up ↑ |
514 513 these optional fields are not specified.
515 514 .sp
516 515 The \fItime\fR has the same format as \fIoffset\fR except that no leading sign
517 516 ("-" or "+" ) is allowed. If \fItime\fR is not specified, the default value is
518 517 02:00:00.
519 518 .RE
520 519
521 520 .RE
522 521
523 522 .SH SEE ALSO
524 -.sp
525 523 .LP
526 524 \fBcat\fR(1), \fBdate\fR(1), \fBed\fR(1), \fBfmtmsg\fR(1), \fBlocaledef\fR(1),
527 525 \fBlogin\fR(1), \fBls\fR(1), \fBmkmsgs\fR(1), \fBnice\fR(1), \fBnohup\fR(1),
528 526 \fBsh\fR(1), \fBsort\fR(1), \fBtime\fR(1), \fBvi\fR(1), \fBexec\fR(2),
529 527 \fBaddseverity\fR(3C), \fBcatopen\fR(3C), \fBctime\fR(3C), \fBctype\fR(3C),
530 528 \fBfmtmsg\fR(3C), \fBgetdate\fR(3C), \fBgetnetpath\fR(3NSL), \fBgettext\fR(3C),
531 529 \fBgettxt\fR(3C), \fBlocaleconv\fR(3C), \fBmblen\fR(3C), \fBmktime\fR(3C),
530 +\fBnewlocale\fR(3C),
532 531 \fBprintf\fR(3C), \fBsetlocale\fR(3C), \fBstrcoll\fR(3C), \fBstrftime\fR(3C),
533 532 \fBstrtod\fR(3C), \fBstrxfrm\fR(3C), \fBuselocale\fR(3C), \fBTIMEZONE\fR(4),
534 533 \fBnetconfig\fR(4), \fBpasswd\fR(4), \fBprofile\fR(4)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX