1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#ifndef __ACLOCAL_H__
45#define __ACLOCAL_H__
46
47
48#define ACPI_WAIT_FOREVER 0xFFFF
49
50typedef void * acpi_mutex;
51typedef u32 acpi_mutex_handle;
52
53
54
55
56#define AML_NUM_OPCODES 0x7E
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76#define ACPI_MTX_EXECUTE 0
77#define ACPI_MTX_INTERPRETER 1
78#define ACPI_MTX_PARSER 2
79#define ACPI_MTX_DISPATCHER 3
80#define ACPI_MTX_TABLES 4
81#define ACPI_MTX_OP_REGIONS 5
82#define ACPI_MTX_NAMESPACE 6
83#define ACPI_MTX_EVENTS 7
84#define ACPI_MTX_HARDWARE 8
85#define ACPI_MTX_CACHES 9
86#define ACPI_MTX_MEMORY 10
87#define ACPI_MTX_DEBUG_CMD_COMPLETE 11
88#define ACPI_MTX_DEBUG_CMD_READY 12
89
90#define MAX_MUTEX 12
91#define NUM_MUTEX MAX_MUTEX+1
92
93
94#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
95#ifdef DEFINE_ACPI_GLOBALS
96
97
98
99static char *acpi_gbl_mutex_names[] =
100{
101 "ACPI_MTX_Execute",
102 "ACPI_MTX_Interpreter",
103 "ACPI_MTX_Parser",
104 "ACPI_MTX_Dispatcher",
105 "ACPI_MTX_Tables",
106 "ACPI_MTX_op_regions",
107 "ACPI_MTX_Namespace",
108 "ACPI_MTX_Events",
109 "ACPI_MTX_Hardware",
110 "ACPI_MTX_Caches",
111 "ACPI_MTX_Memory",
112 "ACPI_MTX_debug_cmd_complete",
113 "ACPI_MTX_debug_cmd_ready",
114};
115
116#endif
117#endif
118
119
120
121
122struct acpi_mutex_info
123{
124 acpi_mutex mutex;
125 u32 use_count;
126 u32 owner_id;
127};
128
129
130
131#define ACPI_MUTEX_NOT_ACQUIRED (u32) (-1)
132
133
134
135
136#define ACPI_MTX_DO_NOT_LOCK 0
137#define ACPI_MTX_LOCK 1
138
139
140typedef u16 acpi_owner_id;
141#define ACPI_OWNER_TYPE_TABLE 0x0
142#define ACPI_OWNER_TYPE_METHOD 0x1
143#define ACPI_FIRST_METHOD_ID 0x0001
144#define ACPI_FIRST_TABLE_ID 0xF000
145
146
147
148
149#define ACPI_FIELD_BYTE_GRANULARITY 1
150#define ACPI_FIELD_WORD_GRANULARITY 2
151#define ACPI_FIELD_DWORD_GRANULARITY 4
152#define ACPI_FIELD_QWORD_GRANULARITY 8
153
154
155
156
157
158
159
160
161
162
163typedef enum
164{
165 ACPI_IMODE_LOAD_PASS1 = 0x01,
166 ACPI_IMODE_LOAD_PASS2 = 0x02,
167 ACPI_IMODE_EXECUTE = 0x0E
168
169} acpi_interpreter_mode;
170
171
172
173
174
175
176
177
178
179
180union acpi_name_union
181{
182 u32 integer;
183 char ascii[4];
184};
185
186struct acpi_namespace_node
187{
188 u8 descriptor;
189 u8 type;
190 u16 owner_id;
191 union acpi_name_union name;
192
193
194 union acpi_operand_object *object;
195 struct acpi_namespace_node *child;
196 struct acpi_namespace_node *peer;
197 u16 reference_count;
198 u8 flags;
199};
200
201
202#define ACPI_ENTRY_NOT_FOUND NULL
203
204
205
206
207#define ANOBJ_RESERVED 0x01
208#define ANOBJ_END_OF_PEER_LIST 0x02
209#define ANOBJ_DATA_WIDTH_32 0x04
210#define ANOBJ_METHOD_ARG 0x08
211#define ANOBJ_METHOD_LOCAL 0x10
212#define ANOBJ_METHOD_NO_RETVAL 0x20
213#define ANOBJ_METHOD_SOME_NO_RETVAL 0x40
214
215#define ANOBJ_IS_BIT_OFFSET 0x80
216
217
218
219
220
221struct acpi_table_desc
222{
223 struct acpi_table_desc *prev;
224 struct acpi_table_desc *next;
225 struct acpi_table_desc *installed_desc;
226 struct acpi_table_header *pointer;
227 u8 *aml_start;
228 u64 physical_address;
229 u32 aml_length;
230 acpi_size length;
231 acpi_owner_id table_id;
232 u8 type;
233 u8 allocation;
234 u8 loaded_into_namespace;
235};
236
237struct acpi_table_list
238{
239 struct acpi_table_desc *next;
240 u32 count;
241};
242
243
244struct acpi_find_context
245{
246 char *search_for;
247 acpi_handle *list;
248 u32 *count;
249};
250
251
252struct acpi_ns_search_data
253{
254 struct acpi_namespace_node *node;
255};
256
257
258
259
260
261struct acpi_predefined_names
262{
263 char *name;
264 u8 type;
265 char *val;
266};
267
268
269
270
271
272#define ACPI_COPY_TYPE_SIMPLE 0
273#define ACPI_COPY_TYPE_PACKAGE 1
274
275
276
277struct acpi_namestring_info
278{
279 char *external_name;
280 char *next_external_char;
281 char *internal_name;
282 u32 length;
283 u32 num_segments;
284 u32 num_carats;
285 u8 fully_qualified;
286};
287
288
289
290
291struct acpi_create_field_info
292{
293 struct acpi_namespace_node *region_node;
294 struct acpi_namespace_node *field_node;
295 struct acpi_namespace_node *register_node;
296 struct acpi_namespace_node *data_register_node;
297 u32 bank_value;
298 u32 field_bit_position;
299 u32 field_bit_length;
300 u8 field_flags;
301 u8 attribute;
302 u8 field_type;
303};
304
305
306
307
308
309
310
311
312
313
314struct acpi_gpe_event_info
315{
316 struct acpi_namespace_node *method_node;
317 acpi_gpe_handler handler;
318 void *context;
319 struct acpi_gpe_register_info *register_info;
320 u8 flags;
321 u8 bit_mask;
322};
323
324
325
326struct acpi_gpe_register_info
327{
328 struct acpi_generic_address status_address;
329 struct acpi_generic_address enable_address;
330 u8 status;
331 u8 enable;
332 u8 wake_enable;
333 u8 base_gpe_number;
334};
335
336
337
338
339
340struct acpi_gpe_block_info
341{
342 struct acpi_gpe_block_info *previous;
343 struct acpi_gpe_block_info *next;
344 struct acpi_gpe_xrupt_info *xrupt_block;
345 struct acpi_gpe_register_info *register_info;
346 struct acpi_gpe_event_info *event_info;
347 struct acpi_generic_address block_address;
348 u32 register_count;
349 u8 block_base_number;
350};
351
352
353
354struct acpi_gpe_xrupt_info
355{
356 struct acpi_gpe_xrupt_info *previous;
357 struct acpi_gpe_xrupt_info *next;
358 struct acpi_gpe_block_info *gpe_block_list_head;
359 u32 interrupt_level;
360};
361
362
363struct acpi_gpe_walk_info
364{
365 struct acpi_namespace_node *gpe_device;
366 struct acpi_gpe_block_info *gpe_block;
367};
368
369
370typedef acpi_status (*ACPI_GPE_CALLBACK) (
371 struct acpi_gpe_xrupt_info *gpe_xrupt_info,
372 struct acpi_gpe_block_info *gpe_block);
373
374
375
376
377struct acpi_fixed_event_handler
378{
379 acpi_event_handler handler;
380 void *context;
381};
382
383struct acpi_fixed_event_info
384{
385 u8 status_register_id;
386 u8 enable_register_id;
387 u16 status_bit_mask;
388 u16 enable_bit_mask;
389};
390
391
392
393struct acpi_field_info
394{
395 u8 skip_field;
396 u8 field_flag;
397 u32 pkg_length;
398};
399
400
401
402
403
404
405
406
407
408#define ACPI_CONTROL_NORMAL 0xC0
409#define ACPI_CONTROL_CONDITIONAL_EXECUTING 0xC1
410#define ACPI_CONTROL_PREDICATE_EXECUTING 0xC2
411#define ACPI_CONTROL_PREDICATE_FALSE 0xC3
412#define ACPI_CONTROL_PREDICATE_TRUE 0xC4
413
414
415
416struct acpi_walk_state ;
417struct acpi_obj_mutex;
418union acpi_parse_object ;
419
420
421#define ACPI_STATE_COMMON \
422 u8 data_type; \
423 u8 flags; \
424 u16 value; \
425 u16 state; \
426 u16 reserved; \
427 void *next; \
428
429struct acpi_common_state
430{
431 ACPI_STATE_COMMON
432};
433
434
435
436
437
438struct acpi_update_state
439{
440 ACPI_STATE_COMMON
441 union acpi_operand_object *object;
442};
443
444
445
446
447
448struct acpi_pkg_state
449{
450 ACPI_STATE_COMMON
451 union acpi_operand_object *source_object;
452 union acpi_operand_object *dest_object;
453 struct acpi_walk_state *walk_state;
454 void *this_target_obj;
455 u32 num_packages;
456 u16 index;
457};
458
459
460
461
462
463
464struct acpi_control_state
465{
466 ACPI_STATE_COMMON
467 union acpi_parse_object *predicate_op;
468 u8 *aml_predicate_start;
469 u8 *package_end;
470 u16 opcode;
471};
472
473
474
475
476
477struct acpi_scope_state
478{
479 ACPI_STATE_COMMON
480 struct acpi_namespace_node *node;
481};
482
483
484struct acpi_pscope_state
485{
486 ACPI_STATE_COMMON
487 union acpi_parse_object *op;
488 u8 *arg_end;
489 u8 *pkg_end;
490 u32 arg_list;
491 u32 arg_count;
492};
493
494
495
496
497
498
499struct acpi_thread_state
500{
501 ACPI_STATE_COMMON
502 struct acpi_walk_state *walk_state_list;
503 union acpi_operand_object *acquired_mutex_list;
504 u32 thread_id;
505 u16 current_sync_level;
506};
507
508
509
510
511
512
513struct acpi_result_values
514{
515 ACPI_STATE_COMMON
516 union acpi_operand_object *obj_desc [ACPI_OBJ_NUM_OPERANDS];
517 u8 num_results;
518 u8 last_insert;
519};
520
521
522typedef
523acpi_status (*acpi_parse_downwards) (
524 struct acpi_walk_state *walk_state,
525 union acpi_parse_object **out_op);
526
527typedef
528acpi_status (*acpi_parse_upwards) (
529 struct acpi_walk_state *walk_state);
530
531
532
533
534
535
536struct acpi_notify_info
537{
538 ACPI_STATE_COMMON
539 struct acpi_namespace_node *node;
540 union acpi_operand_object *handler_obj;
541};
542
543
544
545
546union acpi_generic_state
547{
548 struct acpi_common_state common;
549 struct acpi_control_state control;
550 struct acpi_update_state update;
551 struct acpi_scope_state scope;
552 struct acpi_pscope_state parse_scope;
553 struct acpi_pkg_state pkg;
554 struct acpi_thread_state thread;
555 struct acpi_result_values results;
556 struct acpi_notify_info notify;
557};
558
559
560
561
562
563
564
565
566typedef
567acpi_status (*ACPI_EXECUTE_OP) (
568 struct acpi_walk_state *walk_state);
569
570
571
572
573
574
575
576
577
578
579
580struct acpi_opcode_info
581{
582#if defined(ACPI_DISASSEMBLER) || defined(ACPI_DEBUG_OUTPUT)
583 char *name;
584#endif
585 u32 parse_args;
586 u32 runtime_args;
587 u32 flags;
588 u8 object_type;
589 u8 class;
590 u8 type;
591};
592
593
594union acpi_parse_value
595{
596 acpi_integer integer;
597 struct uint64_struct integer64;
598 u32 size;
599 char *string;
600 u8 *buffer;
601 char *name;
602 union acpi_parse_object *arg;
603};
604
605
606#define ACPI_PARSE_COMMON \
607 u8 data_type; \
608 u8 flags; \
609 u16 aml_opcode; \
610 u32 aml_offset; \
611 union acpi_parse_object *parent; \
612 union acpi_parse_object *next; \
613 ACPI_DISASM_ONLY_MEMBERS (\
614 u8 disasm_flags; \
615 u8 disasm_opcode; \
616 char aml_op_name[16]) \
617 \
618 struct acpi_namespace_node *node; \
619 union acpi_parse_value value; \
620
621
622#define ACPI_DASM_BUFFER 0x00
623#define ACPI_DASM_RESOURCE 0x01
624#define ACPI_DASM_STRING 0x02
625#define ACPI_DASM_UNICODE 0x03
626#define ACPI_DASM_EISAID 0x04
627#define ACPI_DASM_MATCHOP 0x05
628
629
630
631
632struct acpi_parse_obj_common
633{
634 ACPI_PARSE_COMMON
635};
636
637
638
639
640
641
642struct acpi_parse_obj_named
643{
644 ACPI_PARSE_COMMON
645 u8 *path;
646 u8 *data;
647 u32 length;
648 u32 name;
649};
650
651
652
653
654struct acpi_parse_obj_asl
655{
656 ACPI_PARSE_COMMON
657 union acpi_parse_object *child;
658 union acpi_parse_object *parent_method;
659 char *filename;
660 char *external_name;
661 char *namepath;
662 char name_seg[4];
663 u32 extra_value;
664 u32 column;
665 u32 line_number;
666 u32 logical_line_number;
667 u32 logical_byte_offset;
668 u32 end_line;
669 u32 end_logical_line;
670 u32 acpi_btype;
671 u32 aml_length;
672 u32 aml_subtree_length;
673 u32 final_aml_length;
674 u32 final_aml_offset;
675 u32 compile_flags;
676 u16 parse_opcode;
677 u8 aml_opcode_length;
678 u8 aml_pkg_len_bytes;
679 u8 extra;
680 char parse_op_name[12];
681};
682
683
684union acpi_parse_object
685{
686 struct acpi_parse_obj_common common;
687 struct acpi_parse_obj_named named;
688 struct acpi_parse_obj_asl asl;
689};
690
691
692
693
694
695
696struct acpi_parse_state
697{
698 u32 aml_size;
699 u8 *aml_start;
700 u8 *aml;
701 u8 *aml_end;
702 u8 *pkg_start;
703 u8 *pkg_end;
704 union acpi_parse_object *start_op;
705 struct acpi_namespace_node *start_node;
706 union acpi_generic_state *scope;
707 union acpi_parse_object *start_scope;
708};
709
710
711
712
713#define ACPI_PARSEOP_GENERIC 0x01
714#define ACPI_PARSEOP_NAMED 0x02
715#define ACPI_PARSEOP_DEFERRED 0x04
716#define ACPI_PARSEOP_BYTELIST 0x08
717#define ACPI_PARSEOP_IN_CACHE 0x80
718
719
720
721#define ACPI_PARSEOP_IGNORE 0x01
722#define ACPI_PARSEOP_PARAMLIST 0x02
723#define ACPI_PARSEOP_EMPTY_TERMLIST 0x04
724#define ACPI_PARSEOP_SPECIAL 0x10
725
726
727
728
729
730
731
732
733#define PCI_ROOT_HID_STRING "PNP0A03"
734
735struct acpi_bit_register_info
736{
737 u8 parent_register;
738 u8 bit_position;
739 u16 access_bit_mask;
740};
741
742
743
744
745
746
747#define ACPI_REGISTER_PM1_STATUS 0x01
748#define ACPI_REGISTER_PM1_ENABLE 0x02
749#define ACPI_REGISTER_PM1_CONTROL 0x03
750#define ACPI_REGISTER_PM1A_CONTROL 0x04
751#define ACPI_REGISTER_PM1B_CONTROL 0x05
752#define ACPI_REGISTER_PM2_CONTROL 0x06
753#define ACPI_REGISTER_PM_TIMER 0x07
754#define ACPI_REGISTER_PROCESSOR_BLOCK 0x08
755#define ACPI_REGISTER_SMI_COMMAND_BLOCK 0x09
756
757
758
759
760#define ACPI_BITMASK_TIMER_STATUS 0x0001
761#define ACPI_BITMASK_BUS_MASTER_STATUS 0x0010
762#define ACPI_BITMASK_GLOBAL_LOCK_STATUS 0x0020
763#define ACPI_BITMASK_POWER_BUTTON_STATUS 0x0100
764#define ACPI_BITMASK_SLEEP_BUTTON_STATUS 0x0200
765#define ACPI_BITMASK_RT_CLOCK_STATUS 0x0400
766#define ACPI_BITMASK_WAKE_STATUS 0x8000
767
768#define ACPI_BITMASK_ALL_FIXED_STATUS (ACPI_BITMASK_TIMER_STATUS | \
769 ACPI_BITMASK_BUS_MASTER_STATUS | \
770 ACPI_BITMASK_GLOBAL_LOCK_STATUS | \
771 ACPI_BITMASK_POWER_BUTTON_STATUS | \
772 ACPI_BITMASK_SLEEP_BUTTON_STATUS | \
773 ACPI_BITMASK_RT_CLOCK_STATUS | \
774 ACPI_BITMASK_WAKE_STATUS)
775
776#define ACPI_BITMASK_TIMER_ENABLE 0x0001
777#define ACPI_BITMASK_GLOBAL_LOCK_ENABLE 0x0020
778#define ACPI_BITMASK_POWER_BUTTON_ENABLE 0x0100
779#define ACPI_BITMASK_SLEEP_BUTTON_ENABLE 0x0200
780#define ACPI_BITMASK_RT_CLOCK_ENABLE 0x0400
781
782#define ACPI_BITMASK_SCI_ENABLE 0x0001
783#define ACPI_BITMASK_BUS_MASTER_RLD 0x0002
784#define ACPI_BITMASK_GLOBAL_LOCK_RELEASE 0x0004
785#define ACPI_BITMASK_SLEEP_TYPE_X 0x1C00
786#define ACPI_BITMASK_SLEEP_ENABLE 0x2000
787
788#define ACPI_BITMASK_ARB_DISABLE 0x0001
789
790
791
792
793#define ACPI_BITPOSITION_TIMER_STATUS 0x00
794#define ACPI_BITPOSITION_BUS_MASTER_STATUS 0x04
795#define ACPI_BITPOSITION_GLOBAL_LOCK_STATUS 0x05
796#define ACPI_BITPOSITION_POWER_BUTTON_STATUS 0x08
797#define ACPI_BITPOSITION_SLEEP_BUTTON_STATUS 0x09
798#define ACPI_BITPOSITION_RT_CLOCK_STATUS 0x0A
799#define ACPI_BITPOSITION_WAKE_STATUS 0x0F
800
801#define ACPI_BITPOSITION_TIMER_ENABLE 0x00
802#define ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE 0x05
803#define ACPI_BITPOSITION_POWER_BUTTON_ENABLE 0x08
804#define ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE 0x09
805#define ACPI_BITPOSITION_RT_CLOCK_ENABLE 0x0A
806
807#define ACPI_BITPOSITION_SCI_ENABLE 0x00
808#define ACPI_BITPOSITION_BUS_MASTER_RLD 0x01
809#define ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE 0x02
810#define ACPI_BITPOSITION_SLEEP_TYPE_X 0x0A
811#define ACPI_BITPOSITION_SLEEP_ENABLE 0x0D
812
813#define ACPI_BITPOSITION_ARB_DISABLE 0x00
814
815
816
817
818
819
820
821
822
823
824
825#define ACPI_RESOURCE_TYPE_MEMORY_RANGE 0
826#define ACPI_RESOURCE_TYPE_IO_RANGE 1
827#define ACPI_RESOURCE_TYPE_BUS_NUMBER_RANGE 2
828
829
830
831#define ACPI_RDESC_TYPE_LARGE 0x80
832#define ACPI_RDESC_TYPE_SMALL 0x00
833
834#define ACPI_RDESC_TYPE_MASK 0x80
835#define ACPI_RDESC_SMALL_MASK 0x78
836
837
838
839
840
841
842#define ACPI_RDESC_TYPE_IRQ_FORMAT 0x20
843#define ACPI_RDESC_TYPE_DMA_FORMAT 0x28
844#define ACPI_RDESC_TYPE_START_DEPENDENT 0x30
845#define ACPI_RDESC_TYPE_END_DEPENDENT 0x38
846#define ACPI_RDESC_TYPE_IO_PORT 0x40
847#define ACPI_RDESC_TYPE_FIXED_IO_PORT 0x48
848#define ACPI_RDESC_TYPE_SMALL_VENDOR 0x70
849#define ACPI_RDESC_TYPE_END_TAG 0x78
850
851
852
853
854
855#define ACPI_RDESC_TYPE_MEMORY_24 0x81
856#define ACPI_RDESC_TYPE_GENERAL_REGISTER 0x82
857#define ACPI_RDESC_TYPE_LARGE_VENDOR 0x84
858#define ACPI_RDESC_TYPE_MEMORY_32 0x85
859#define ACPI_RDESC_TYPE_FIXED_MEMORY_32 0x86
860#define ACPI_RDESC_TYPE_DWORD_ADDRESS_SPACE 0x87
861#define ACPI_RDESC_TYPE_WORD_ADDRESS_SPACE 0x88
862#define ACPI_RDESC_TYPE_EXTENDED_XRUPT 0x89
863#define ACPI_RDESC_TYPE_QWORD_ADDRESS_SPACE 0x8A
864
865
866
867
868
869
870
871
872#define ACPI_ASCII_ZERO 0x30
873
874
875
876
877
878
879
880
881struct acpi_db_method_info
882{
883 acpi_handle thread_gate;
884 char *name;
885 char **args;
886 u32 flags;
887 u32 num_loops;
888 char pathname[128];
889};
890
891struct acpi_integrity_info
892{
893 u32 nodes;
894 u32 objects;
895};
896
897
898#define ACPI_DB_REDIRECTABLE_OUTPUT 0x01
899#define ACPI_DB_CONSOLE_OUTPUT 0x02
900#define ACPI_DB_DUPLICATE_OUTPUT 0x03
901
902
903
904
905
906
907
908
909struct acpi_debug_print_info
910{
911 u32 component_id;
912 char *proc_name;
913 char *module_name;
914};
915
916
917
918
919#define ACPI_MEM_MALLOC 0
920#define ACPI_MEM_CALLOC 1
921#define ACPI_MAX_MODULE_NAME 16
922
923#define ACPI_COMMON_DEBUG_MEM_HEADER \
924 struct acpi_debug_mem_block *previous; \
925 struct acpi_debug_mem_block *next; \
926 u32 size; \
927 u32 component; \
928 u32 line; \
929 char module[ACPI_MAX_MODULE_NAME]; \
930 u8 alloc_type;
931
932struct acpi_debug_mem_header
933{
934 ACPI_COMMON_DEBUG_MEM_HEADER
935};
936
937struct acpi_debug_mem_block
938{
939 ACPI_COMMON_DEBUG_MEM_HEADER
940 u64 user_space;
941};
942
943
944#define ACPI_MEM_LIST_GLOBAL 0
945#define ACPI_MEM_LIST_NSNODE 1
946
947#define ACPI_MEM_LIST_FIRST_CACHE_LIST 2
948#define ACPI_MEM_LIST_STATE 2
949#define ACPI_MEM_LIST_PSNODE 3
950#define ACPI_MEM_LIST_PSNODE_EXT 4
951#define ACPI_MEM_LIST_OPERAND 5
952#define ACPI_MEM_LIST_WALK 6
953#define ACPI_MEM_LIST_MAX 6
954#define ACPI_NUM_MEM_LISTS 7
955
956
957struct acpi_memory_list
958{
959 void *list_head;
960 u16 link_offset;
961 u16 max_cache_depth;
962 u16 cache_depth;
963 u16 object_size;
964
965#ifdef ACPI_DBG_TRACK_ALLOCATIONS
966
967
968
969 u32 total_allocated;
970 u32 total_freed;
971 u32 current_total_size;
972 u32 cache_requests;
973 u32 cache_hits;
974 char *list_name;
975#endif
976};
977
978
979#endif
980